39 Commits

Author SHA1 Message Date
ZhangYong fd5af5a229 金币取消/100 4 days ago
lihui 00dc0fa15a refactor(audit): 优化审核时间筛选显示 4 days ago
lihui 5187f704df feat(audit): 添加货币名称和充值金额 4 days ago
lihui 71a951e0ab fix: 总金额 => 总新币 5 days ago
lihui e4bb3dd8e9 fix: 优化时间筛选功能 5 days ago
lihui 5654c1cd4f refactor(audit): 修改退款审核中的管理员 ID 获取方式 5 days ago
ZhangYong ce3e5eff37 金币新增明细时间修改 6 days ago
lihui bce68e4b43 fix: 空值导致总计为空 6 days ago
lihui 795651239c fix: 空值导致总计为空 6 days ago
lihui 661f209703 fix(usergold): 修复金币数量显示逻辑 6 days ago
lihui 1aa365d60c fix(usergold): 修复金币数量显示错误 6 days ago
lihui f2ab8102c4 refactor(src): 全局拦截过期 6 days ago
ZhangYong b4a97d65e4 金币充值输入优化 7 days ago
ZhangYong c7b746dd6a Merge branch 'milestone-20250728-金币前端三期' of http://39.101.133.168:8807/huangqizhen/gold-vue into zhangyong/feature-20250716164232-金币前端 7 days ago
ZhangYong 425575c1f8 金豆输入校验优化 7 days ago
lihuilin a0a87b3dad 样式修改,表单精简 1 week ago
lihuilin 9888be00af 样式修改,表单精简 1 week ago
lihuilin 1e28905359 重置调方法+调整布局 1 week ago
ZhangYong 5d3adfa6d8 新增消耗修改 1 week ago
lihui 6e5d1070b8 feat(components): 密码跳转 1 week ago
lihuilin 3769e8a6c5 大数字加逗号Merge branch 'lihuilin/feature-20250730114922-金币三期' into milestone-20250728-金币前端三期 1 week ago
lihuilin a72bbebbf9 大数字加逗号 1 week ago
ZhangYong 421c509495 金豆明细序号 1 week ago
ZhangYong 8f3ffc3b28 金豆客户明细序号 1 week ago
lihui 505c3b0140 fix:金币余额输入筛选项后点击重置,再点击查询,除了筛选项包含地区外,点击查询页面没有反应 1 week ago
lihuilin 953d067c53 这是一次拉取branch 'milestone-20250728-金币前端三期' of http://39.101.133.168:8807/huangqizhen/gold-vue into lihuilin/feature-20250730114922-金币三期 1 week ago
lihui 7a9bed3adf fix:金币明细输入筛选项后点击重置,再点击查询,除了筛选项包含地区外,点击查询页面没有反应 1 week ago
lihuilin 9fb9a2075f 付费免费 1 week ago
ZhangYong 877fbac479 Merge branch 'zhangyong/feature-20250716164232-金币前端' into milestone-20250728-金币前端三期 1 week ago
lihuilin 3f19a6e061 这是一次拉取 1 week ago
lihuilin 36afd2793f 付费金豆 1 week ago
lihuilin 13194bb736 付费哈哈哈哈 1 week ago
lihui 18d4051f69 永久金币和免费金币不能同时为0 1 week ago
lihui 7f358ccb26 永久金币和付费金币不能同时为0 1 week ago
ZhangYong 278329cd03 Merge branch 'zhangyong/feature-20250716164232-金币前端' into milestone-20250728-金币前端三期 1 week ago
ZhangYong 5d57fb5f03 Merge branch 'zhangyong/feature-20250716164232-金币前端' into milestone-20250728-金币前端三期 1 week ago
ZhangYong a6b12231c6 Merge branch 'zhangyong/feature-20250716164232-金币前端' into milestone-20250728-金币前端三期 1 week ago
lihui ad659069d6 Merge branch 'refs/heads/lihui/feature-20250728114233-金币前端三期' into milestone-20250728-金币前端三期 1 week ago
lihui 213d1a075c fix:金币充值默认为0 1 week ago
  1. 2
      .env.development
  2. 5
      src/components/PasswordSuccess.vue
  3. 37
      src/main.ts
  4. 17
      src/router/index.js
  5. 14
      src/util/request.js
  6. 191
      src/views/audit/beanAudit.vue
  7. 486
      src/views/audit/gold/rechargeAudit.vue
  8. 300
      src/views/audit/gold/refundAudit.vue
  9. 26
      src/views/consume/bean/addBeanConsume.vue
  10. 253
      src/views/consume/bean/articleVideo.vue
  11. 230
      src/views/consume/bean/dieHardFan.vue
  12. 246
      src/views/consume/bean/liveStream.vue
  13. 275
      src/views/consume/gold/addCoinConsume.vue
  14. 22
      src/views/consume/gold/coinConsumeDetail.vue
  15. 246
      src/views/managerecharge/rate.vue
  16. 2
      src/views/permissions/rolePermission.vue
  17. 8
      src/views/permissions/userPermission.vue
  18. 14
      src/views/recharge/addBeanRecharge.vue
  19. 7
      src/views/recharge/beanOnlineRecharge.vue
  20. 10
      src/views/recharge/beanSystemRecharge.vue
  21. 50
      src/views/recharge/gold/addCoinRecharge.vue
  22. 117
      src/views/recharge/gold/coinRechargeDetail.vue
  23. 188
      src/views/refund/gold/addCoinRefund.vue
  24. 216
      src/views/refund/gold/coinRefundDetail.vue
  25. 70
      src/views/usergold/gold/clientCountBalance.vue
  26. 37
      src/views/usergold/gold/clientCountDetail.vue
  27. 25
      src/views/usergold/userbean.vue
  28. 148
      src/views/workspace/index.vue
  29. 2
      stats.html

2
.env.development

@ -11,6 +11,6 @@ VITE_UPLOAD_URL=http://39.101.133.168:8828/hljw/api/aws/upload
# zhangyong
# VITE_API_BASE='http://192.168.3.83:8081/'
# 本地
# VITE_API_BASE='http://localhost:8081/'
# VITE_API_BASE='http://localhost:8081/'
# sunjiabei
# VITE_API_BASE='http://192.168.0.113:8081/'

5
src/components/PasswordSuccess.vue

@ -19,6 +19,7 @@ import {ElIcon, ElButton} from 'element-plus';
import {SuccessFilled} from '@element-plus/icons-vue';
import {useRouter} from 'vue-router';
const machineId = localStorage.getItem("machineId");
const countdown = ref(3);
const router = useRouter();
@ -32,7 +33,7 @@ const startCountdown = () => {
//
// 使 window.location.href
// window.location.href = '/login';
router.replace ('/login');
router.replace(`/login?machineId=${machineId || ''}`);
// router.push('/login');
}
}, 1000);
@ -41,7 +42,7 @@ const startCountdown = () => {
const immediateJump = () => {
// window.location.href = '/login';
//
router.replace ('/login');
router.replace(`/login?machineId=${machineId || ''}`);
};
onMounted(() => {

37
src/main.ts

@ -12,27 +12,32 @@ import VxeUI from 'vxe-pc-ui'
import 'vxe-pc-ui/lib/style.css'
import VxeUITable from 'vxe-table'
import 'vxe-table/lib/style.css'
const a = createApp(App)
import { useAdminStore } from '../src/store'
// 修正导入路径
import { useAdminStore } from './store'
import request from "@/util/request";
const app = createApp(App)
const pinia = createPinia()
// 全局注册 ElementPlus 图标
for (const [key, component] of Object.entries(ElementPlusIconsVue)) {
a.component(key, component)
app.component(key, component)
}
const pinia = createPinia()
// 使用 ElementPlus 和路由器
a.use(ElementPlus, {
locale: zhCn
// 先注册组件再挂载
app.component('downloadExcel', JsonExcel)
app.config.globalProperties.$http = request
// 使用各种插件
app.use(ElementPlus, {
locale: zhCn
})
.use(router)
.use(VxeUI)
.use(VxeUITable)
.use(pinia)
.mount('#app')
.use(router)
.use(VxeUI)
.use(VxeUITable)
.use(pinia)
.mount('#app')
// 恢复localStorage数据
// 在 app 挂载之后再使用 store
const adminStore = useAdminStore()
adminStore.initFromLocalStorage()
// 注册 JsonExcel 组件
a.component('downloadExcel', JsonExcel)

17
src/router/index.js

@ -287,23 +287,6 @@ const router = createRouter({
routes
});
// 全局拦截器:token过期处理
axios.interceptors.response.use(
response => response,
error => {
if (error.response && error.response.status === 401) {
localStorage.removeItem('token');
router.push({
name: 'login',
query: {
machineId: localStorage.getItem('machineId'),
expired: true
}
});
}
return Promise.reject(error);
}
);
// 工具函数:从菜单树提取所有权限ID
const getAllPermissionIds = (menuTree) => {

14
src/util/request.js

@ -44,13 +44,13 @@ service.interceptors.response.use(
return response
},
error => {
// const { response } = error
// if (response && response.status === 401) {
// const machineId = localStorage.getItem('machineId')
// localStorage.removeItem('token')
// window.location.href = `/login?machineId=${machineId}`
// return Promise.resolve({ needsLogin: true })
// }
const { response } = error
if (response && response.status === 401) {
const machineId = localStorage.getItem('machineId')
localStorage.removeItem('token')
window.location.href = `#/login?machineId=${machineId}`
return Promise.resolve({ needsLogin: true })
}
return Promise.reject(error)
}
)

191
src/views/audit/beanAudit.vue

@ -1,39 +1,24 @@
<template>
<el-card style="margin-bottom: 5px">
<el-row style="margin-bottom: 10px">
<el-col :span="6">
<el-text size="large">精网号</el-text>
<el-input v-model="searchForm.jwcode" placeholder="请输入精网号" style="width: 240px" clearable />
</el-col>
<el-col :span="6">
<el-text class="mx-1" size="large">所属地区</el-text>
<el-cascader v-model="selectedMarketPath" :options="marketOptions" placeholder="请选择所属地区" clearable
style="width:180px" @change="handleMarketChange" />
</el-col>
</el-row>
<el-row>
<el-col :span="15">
<div class="time-controls">
<div class="time-group">
<el-text size="large" style="width: 80px">充值时间</el-text>
<el-date-picker v-model="dateRange" type="datetimerange" range-separator="" start-placeholder="开始时间"
end-placeholder="结束时间" style="width: 400px" @change="handleDatePickerChange"
:default-time="defaultTime" />
<el-button @click="getToday()" style="margin-left: 10px"
:type="activeTimeRange === 'today' ? 'primary' : ''">
</el-button>
<el-button @click="getYesterday()" style="margin-left: 10px"
:type="activeTimeRange === 'yesterday' ? 'primary' : ''">
</el-button>
<el-button @click="get7Days()" style="margin-left: 10px"
:type="activeTimeRange === '7days' ? 'primary' : ''"> 近7天
</el-button>
<el-button type="success" @click="resetSearch">重置</el-button>
<el-button type="primary" @click="handleSearch">查询</el-button>
</div>
</div>
</el-col>
</el-row>
<el-card style="margin-bottom: 0.5vh;width:82.5vw">
<el-col 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-cascader v-model="selectedMarkets" :options="marketOptions" placeholder="请选择所属地区" clearable
style="width: 12vw" @change="handleMarketChange" />
</el-col>
<el-col>
<el-text size="large" style="width: 80px">充值时间</el-text>
<el-date-picker v-model="dateRange" type="datetimerange" range-separator="" start-placeholder="开始时间"
end-placeholder="结束时间" style="width: 25vw;margin-right:1vw" @change="handleDatePickerChange"
:default-time="defaultTime" />
<el-button @click="getToday()" :type="activeTimeRange === 'today' ? '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 type="success" @click="resetSearch">重置</el-button>
<el-button type="primary" @click="handleSearch">查询</el-button>
</el-col>
</el-card>
<el-card>
@ -44,10 +29,10 @@
</el-tabs>
<div>
总条数{{ stats.num }}&nbsp;&nbsp;&nbsp;&nbsp;
总金豆数{{ stats.beanNum }}金豆&nbsp;&nbsp;&nbsp;&nbsp;
永久金豆{{ stats.permanentBean }}金豆&nbsp;&nbsp;&nbsp;&nbsp;
免费金豆{{ stats.freeBean }}金豆
总条数{{ format3(stats.num) }}&nbsp;&nbsp;&nbsp;&nbsp;
总金豆数{{ format3(stats.beanNum) }}金豆&nbsp;&nbsp;&nbsp;&nbsp;
付费金豆{{ format3(stats.permanentBean) }}金豆&nbsp;&nbsp;&nbsp;&nbsp;
免费金豆{{ format3(stats.freeBean) }}金豆
</div>
<el-table :data="tableData" height="540px" @sort-change="handleSortChange">
@ -94,7 +79,7 @@
@size-change="handlePageSizeChange" @current-change="handleCurrentChange"></el-pagination>
</el-card>
<el-dialog v-model="rejectDialogVisible" title="驳回理由" width="500px">
<el-dialog v-model="rejectVisible" title="驳回理由" width="500px">
<el-form>
<el-form-item label="驳回理由" required>
<el-input v-model="reason" type="textarea" :rows="4" placeholder="请输入驳回理由" maxlength="200" show-word-limit />
@ -102,7 +87,7 @@
</el-form>
<template #footer>
<span class="dialog-footer">
<el-button @click="rejectDialogVisible = false">取消</el-button>
<el-button @click="rejectVisible = false">取消</el-button>
<el-button type="primary" @click="handleReject()">确定</el-button>
</span>
</template>
@ -133,7 +118,7 @@ const activeName = ref('wait')
const sortField = ref('')
const sortOrder = ref('')
const checkTab = ref('pending')
const rejectDialogVisible = ref(false)
const rejectVisible = ref(false)
const reason = ref('')
const rejectRow = ref({
id: null
@ -165,47 +150,7 @@ const stats = ref({
freeBean: 0
})
//
const selectedMarketPath = ref("")
const showRejectDialog = (row) => {
rejectRow.value.id = row.id
reason.value = ''
rejectDialogVisible.value = true
}
//
const getmarkets = async function () {
try {
// POST
const result = await API({
url: '/market/selectMarket',
});
//
console.log('请求成功', result)
//
const transformTree = (nodes) => {
//
const allChildren = nodes.flatMap(node => node.children || []);
return allChildren.map(child => {
const grandchildren = child.children && child.children.length
? transformTree([child]) //
: null;
return {
value: child.name,
label: child.name,
children: grandchildren
};
});
};
//
marketOptions.value = transformTree(result.data)
console.log('转换后的地区树==============', marketOptions.value)
} catch (error) {
console.log('请求失败', error)
}
}
const selectedMarkets = ref("")
const handleSortChange = (column) => {
if (column.prop === 'permanentBean') {
sortField.value = 'permanentBean'
@ -224,6 +169,7 @@ const handleSortChange = (column) => {
get()
}
const handleSearch = function () {
trimJwCode()
if (searchForm.value.jwcode) {
const numRef = /^\d{1,9}$/;
if (!numRef.test(searchForm.value.jwcode)) {
@ -284,7 +230,6 @@ const getStats = async () => {
auditStartTime: searchForm.value.auditStartTime,
auditEndTime: searchForm.value.auditEndTime
}
const res = await API({
url: '/beanAudit/statsBean',
data: params
@ -308,7 +253,7 @@ const handleApprove = async (row) => {
try {
const params = {
id: row.id,
auditName: adminData.value.name,
auditName: adminData.value.adminName
}
await API({ url: '/beanAudit/status1', data: params })
ElMessage.success('审核通过成功')
@ -322,7 +267,6 @@ const handleApprove = async (row) => {
ElMessage.error('无此权限')
}
}
//
const handleReject = async () => {
if (findMenuById(menuTree.value, permissionMapping.Golden_Bean_Recharge_Approval)) {
@ -338,7 +282,7 @@ const handleReject = async () => {
}
await API({ url: '/beanAudit/status2', data: params })
ElMessage.success('驳回成功')
rejectDialogVisible.value = false
rejectVisible.value = false
get()
getStats()
} catch (error) {
@ -356,7 +300,6 @@ const getToday = function () {
dateRange.value = [startTime, endTime]
console.log('dateRange', dateRange.value)
activeTimeRange.value = 'today'
get()
getStats()
}
@ -367,7 +310,6 @@ const getYesterday = function () {
dateRange.value = [startTime, endTime]
console.log('dateRange', dateRange.value)
activeTimeRange.value = 'yesterday'
get()
getStats()
}
@ -378,7 +320,6 @@ const get7Days = function () {
dateRange.value = [startTime, endTime]
console.log('dateRange', dateRange.value)
activeTimeRange.value = '7days'
get()
getStats()
}
@ -393,11 +334,13 @@ const resetSearch = function () {
auditStartTime: '',
auditEndTime: ''
}
selectedMarketPath.value = []
selectedMarkets.value = []
dateRange.value = []
activeTimeRange.value = '' //
}
activeTimeRange.value = ''
get()
getStats()
}
const handleClick = function (tab) {
resetSearch()
activeName.value = tab.props.name
@ -409,37 +352,31 @@ const handleClick = function (tab) {
adminReject()
}
}
//
//
const adminWait = async function () {
checkTab.value = 'pending'
sortField.value = ''
sortOrder.value = ''
searchForm.value.status = STATUS.PENDING
await get()
await getStats()
console.log('切换页面后:', checkTab.value,sortField.value, sortOrder.value)
console.log('切换页面后:', checkTab.value, sortField.value, sortOrder.value)
}
//
//
const adminPass = async function () {
checkTab.value = 'pass'
sortField.value = ''
sortOrder.value = ''
searchForm.value.status = STATUS.APPROVED
await get()
await getStats()
console.log('切换页面后:', checkTab.value,sortField.value, sortOrder.value)
console.log('切换页面后:', checkTab.value, sortField.value, sortOrder.value)
}
//
//
const adminReject = async function () {
checkTab.value = 'reject'
sortField.value = ''
sortOrder.value = ''
searchForm.value.status = STATUS.REJECTED
await get()
await getStats()
console.log('切换页面后:', checkTab.value,sortField.value, sortOrder.value)
console.log('切换页面后:', checkTab.value, sortField.value, sortOrder.value)
}
const handleMarketChange = (value) => {
if (value && value.length > 0) {
@ -459,11 +396,51 @@ const handleCurrentChange = function (val) {
pagination.value.pageNum = val
get()
}
const format3 = (num) => {
//
return num.toLocaleString('en-US')
}
const throttledHandleApprove = _.throttle(handleApprove, 5000, {
trailing: false
})
const showRejectDialog = (row) => {
rejectRow.value.id = row.id
reason.value = ''
rejectVisible.value = true
}
//
const getmarkets = async function () {
try {
const result = await API({
url: '/market/selectMarket',
});
console.log('请求成功', result)
//
const transformTree = (nodes) => {
//
const allChildren = nodes.flatMap(node => node.children || []);
return allChildren.map(child => {
const grandchildren = child.children && child.children.length
? transformTree([child]) //
: null;
return {
value: child.name,
label: child.name,
children: grandchildren
}
})
}
marketOptions.value = transformTree(result.data)
console.log('转换后的地区树==============', marketOptions.value)
} catch (error) {
console.log('请求失败', error)
}
}
const trimJwCode = () => {
if (searchForm.value.jwcode) {
searchForm.value.jwcode = searchForm.value.jwcode.replace(/\s/g, '');
}
}
onMounted(async () => {
getmarkets()
get()

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

@ -1,168 +1,135 @@
<!-- 支付凭证 -->
<template>
<el-row>
<el-col>
<el-card style="margin-bottom: 20px;margin-top:10px">
<el-row style="margin-bottom: 5px">
<el-col :span="6">
<el-text size="large">精网号</el-text>
<el-input v-model="rechargeAudit.jwcode" placeholder="请输入精网号" style="width: 240px" clearable/>
</el-col>
<el-col :span="6">
<el-text size="large">活动名称</el-text>
<el-select v-model="rechargeAudit.activity" placeholder="请选择活动名称" style="width: 240px" clearable>
<el-option v-for="item in activity" :key="item" :label="item" :value="item"/>
</el-select>
</el-col>
<el-col :span="6">
<el-text size="large">支付方式</el-text>
<el-select v-model="rechargeAudit.payModel" placeholder="请选择支付方式" style="width: 240px" clearable>
<el-option v-for="item in payModel" :key="item.value" :label="item.label" :value="item.value"/>
</el-select>
</el-col>
<el-col :span="6">
<el-text class="mx-1" size="large">所属地区</el-text>
<el-cascader
v-model="selectedMarketPath"
:options="market"
placeholder="请选择所属地区"
clearable
style="width:180px"
@change="handleMarketChange"
/>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<div class="time-controls">
<div class="time-group">
<el-text size="large" style="width: 80px">充值时间</el-text>
<el-date-picker v-model="getTime" type="datetimerange" range-separator="" start-placeholder="起始时间"
end-placeholder="结束时间" style="width: 400px" @change="handleDatePickerChange"
:default-time="defaultTime"
/>
<el-button @click="getToday()" style="margin-left: 10px"
:type="activeTimeRange === 'today' ? 'primary' : ''">
</el-button>
<el-button @click="getYesterday()" style="margin-left: 10px"
:type="activeTimeRange === 'yesterday' ? 'primary' : ''">
</el-button>
<el-button @click="get7Days()" style="margin-left: 10px"
:type="activeTimeRange === '7days' ? 'primary' : ''"> 近7天
</el-button>
<el-button @click="resetSearch" type="success">重置</el-button>
<el-button type="primary" @click="handleSearch">查询</el-button>
</div>
</div>
</el-col>
</el-row>
</el-card>
<el-card style="margin-bottom: 0.5vh;margin-top: 0.5vh">
<el-col style="margin-bottom: 0.5vh">
<el-text size="large">精网号</el-text>
<el-input v-model="rechargeAudit.jwcode" placeholder="请输入精网号" style="width: 12vw;margin-right:1vw"
clearable/>
<el-text size="large">活动名称</el-text>
<el-select v-model="rechargeAudit.activity" placeholder="请选择活动名称" style="width: 12vw;margin-right:1vw"
clearable>
<el-option v-for="item in activity" :key="item" :label="item" :value="item"/>
</el-select>
<el-text size="large">支付方式</el-text>
<el-select v-model="rechargeAudit.payModel" placeholder="请选择支付方式" style="width: 12vw;margin-right:1vw"
clearable>
<el-option v-for="item in payModel" :key="item.value" :label="item.label" :value="item.value"/>
</el-select>
<el-text size="large">所属地区</el-text>
<el-cascader v-model="selectedMarketPath" :options="market" placeholder="请选择所属地区" clearable
style="width:12vw"
@change="handleMarketChange"/>
</el-col>
</el-row>
<el-row>
<el-col>
<el-card>
<el-tabs v-model="activeName" type="card" @tab-click="handleClick">
<el-tab-pane label="待审核" name="wait"></el-tab-pane>
<el-tab-pane label="已通过" name="pass"></el-tab-pane>
<el-tab-pane label="已驳回" name="reject"></el-tab-pane>
<div>
总条数{{ stats.totalNum }}&nbsp;&nbsp;&nbsp;&nbsp;
总金币数{{ (stats.permanentGolds + stats.freeGolds + stats.taskGolds).toFixed(2) }}金币&nbsp;&nbsp;&nbsp;&nbsp;
永久金币{{ stats.permanentGolds.toFixed(2) }}金币&nbsp;&nbsp;&nbsp;&nbsp;
免费金币{{ stats.freeGolds.toFixed(2) }}金币&nbsp;&nbsp;&nbsp;&nbsp;
<!-- 任务金币{{ stats.taskGolds.toFixed(2) }}金币-->
<el-text size="large">
{{ activeName === 'wait' ? '提交时间:' : '审核时间:' }}
</el-text>
<el-date-picker v-model="getTime" type="datetimerange" range-separator="" start-placeholder="起始时间"
end-placeholder="结束时间" class="time-controls" style="margin-right:1vw;width:25vw"
@change="handleDatePickerChange"
:default-time="defaultTime"/>
<el-button @click="getToday()" :type="activeTimeRange === 'today' ? '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="resetSearch" type="success">重置</el-button>
<el-button @click="handleSearch" type="primary">查询</el-button>
</el-col>
</el-card>
<el-card>
<el-tabs v-model="activeName" type="card" @tab-click="handleClick">
<el-tab-pane label="待审核" name="wait"></el-tab-pane>
<el-tab-pane label="已通过" name="pass"></el-tab-pane>
<el-tab-pane label="已驳回" name="reject"></el-tab-pane>
<div>
总条数{{ format3(stats.totalNum) }}&nbsp;&nbsp;&nbsp;&nbsp;
充值新币{{ format3(stats.permanentGolds) }}新币&nbsp;&nbsp;&nbsp;&nbsp;
总金币数{{ format3(stats.permanentGolds + stats.freeGolds + stats.taskGolds) }}金币&nbsp;&nbsp;&nbsp;&nbsp;
永久金币{{ format3(stats.permanentGolds) }}金币&nbsp;&nbsp;&nbsp;&nbsp;
免费金币{{ format3(stats.freeGolds) }}金币&nbsp;&nbsp;&nbsp;&nbsp;
</div>
</el-tabs>
<el-table :data="tableData" style="width: 100vw;height:55vh" @sort-change="handleSortChange"
:row-style="{ height: '50px' }">
<el-table-column type="index" label="序号" width="100px" fixed="left">
<template #default="scope">
<span>{{ scope.$index + 1 + (getObj.pageNum - 1) * getObj.pageSize }}</span>
</template>
</el-table-column>
<el-table-column fixed="left" prop="name" label="姓名" width="150px"/>
<el-table-column fixed="left" prop="jwcode" label="精网号" width="110px"/>
<el-table-column prop="market" label="所属地区" width="100px"/>
<el-table-column prop="activity" label="活动名称" width="100px" show-overflow-tooltip/>
<el-table-column prop="rateName" label="货币名称" width="110px"/>
<el-table-column prop="money" sortable="custom" label="充值金额" width="110px"/>
<el-table-column prop="money" label="充值金额" sortable="custom" width="110px">
<template #default="scope">{{ scope.row.permanentGold / 100 }}</template>
</el-table-column>
<el-table-column prop="permanentGold" label="永久金币" width="110px" sortable="custom">
<template #default="scope">{{ scope.row.permanentGold / 100 }}</template>
</el-table-column>
<el-table-column prop="freeGold" label="免费金币" sortable="custom" width="110px">
<template #default="scope">{{ (scope.row.freeGold) / 100 }}</template>
</el-table-column>
<el-table-column prop="remark" label="备注" width="200px" show-overflow-tooltip/>
<el-table-column prop="payModel" label="支付方式" width="110px"/>
<el-table-column prop="voucher" label="支付凭证" width="110px">
<template #default="scope">
<div v-if="scope.row.voucher"
style="display: flex; justify-content: center; align-items: center; cursor: pointer;"
@click="previewImage(scope.row.voucher)">
<img :src="scope.row.voucher" alt="支付凭证" style="width: auto; height: 40px;">
</div>
</el-tabs>
<!--表格-->
<div style="height: 540px; overflow-y: auto">
<el-table :data="tableData" style="width: 100%" height="540px" @sort-change="handleSortChange"
:row-style="{ height: '50px' }">
<el-table-column type="index" label="序号" width="100px" fixed="left">
<template #default="scope">
<span>{{ scope.$index + 1 + (getObj.pageNum - 1) * getObj.pageSize }}</span>
</template>
</el-table-column>
<el-table-column fixed="left" prop="name" label="姓名" width="150px"/>
<el-table-column fixed="left" prop="jwcode" label="精网号" width="110px"/>
<el-table-column prop="market" label="所属地区" width="100px"/>
<el-table-column prop="activity" label="活动名称" width="100px" show-overflow-tooltip/>
<el-table-column prop="money" label="充值金额" sortable="custom" width="110px">
<template #default="scope">{{ scope.row.permanentGold / 100 }}</template>
</el-table-column>
<el-table-column prop="permanentGold" label="永久金币" width="110px" sortable="custom">
<template #default="scope">{{ scope.row.permanentGold / 100 }}</template>
</el-table-column>
<el-table-column prop="freeGold" label="免费金币" sortable="custom" width="110px">
<template #default="scope">{{ (scope.row.freeGold) / 100 }}</template>
</el-table-column>
<el-table-column prop="remark" label="备注" width="200px" show-overflow-tooltip/>
<el-table-column prop="payModel" label="支付方式" width="110px"/>
<el-table-column prop="voucher" label="支付凭证" width="110px">
<template #default="scope">
<div v-if="scope.row.voucher"
style="display: flex; justify-content: center; align-items: center; cursor: pointer;"
@click="previewImage(scope.row.voucher)">
<img :src="scope.row.voucher" alt="支付凭证" style="width: auto; height: 40px;">
</div>
<div v-else style="display: flex; justify-content: center; align-items: center; height: 40px;">--</div>
</template>
</el-table-column>
<el-table-column prop="adminName" label="提交人" width="100px"/>
<el-table-column prop="rejectReason" v-if="activeName === 'reject'" label="驳回理由" width="200px"
show-overflow-tooltip/>
<el-table-column v-if="activeName !== 'wait'" prop="auditName" label="审核人" width="100px"/>
<el-table-column prop="payTime" sortable="custom" label="付款时间" width="200px">
<template #default="scope">
{{ moment(scope.row.payTime).format('YYYY-MM-DD HH:mm:ss') }}
</template>
</el-table-column>
<el-table-column prop="createTime" sortable="custom" label="提交时间" width="200px">
<template #default="scope">
{{ moment(scope.row.createTime).format('YYYY-MM-DD HH:mm:ss') }}
</template>
</el-table-column>
<el-table-column v-if="activeName !== 'wait'" prop="auditTime" label="审核时间" width="200px">
<template #default="scope">
{{ moment(scope.row.auditTime).format('YYYY-MM-DD HH:mm:ss') }}
</template>
</el-table-column>
<el-table-column v-if="activeName === 'wait'" fixed="right" prop="operation" label="操作" width="150px">
<template #default="scope">
<div class="operation">
<el-popconfirm title="确定要通过此条记录吗?" @confirm="handleApprove(scope.row)">
<template #reference>
<el-button :disabled="scope.row.auditStatus === 1 || scope.row.auditStatus === 2" type="primary"
text>
通过
</el-button>
</template>
</el-popconfirm>
<el-button :disabled="scope.row.auditStatus === 1 || scope.row.auditStatus === 2" type="primary" text
@click="showRejectDialog(scope.row)">
驳回
</el-button>
</div>
<div v-else style="display: flex; justify-content: center; align-items: center; height: 40px;">--</div>
</template>
</el-table-column>
<el-table-column prop="adminName" label="提交人" width="100px"/>
<el-table-column prop="rejectReason" v-if="activeName === 'reject'" label="驳回理由" width="200px"
show-overflow-tooltip/>
<el-table-column v-if="activeName !== 'wait'" prop="auditName" label="审核人" width="100px"/>
<el-table-column prop="payTime" sortable="custom" label="付款时间" width="200px">
<template #default="scope">
{{ moment(scope.row.payTime).format('YYYY-MM-DD HH:mm:ss') }}
</template>
</el-table-column>
<el-table-column prop="createTime" sortable="custom" label="提交时间" width="200px">
<template #default="scope">
{{ moment(scope.row.createTime).format('YYYY-MM-DD HH:mm:ss') }}
</template>
</el-table-column>
<el-table-column v-if="activeName !== 'wait'" prop="auditTime" label="审核时间" width="200px">
<template #default="scope">
{{ moment(scope.row.auditTime).format('YYYY-MM-DD HH:mm:ss') }}
</template>
</el-table-column>
<el-table-column v-if="activeName === 'wait'" fixed="right" prop="operation" label="操作" width="150px">
<template #default="scope">
<div class="operation">
<el-popconfirm title="确定要通过此条记录吗?" @confirm="handleApprove(scope.row)">
<template #reference>
<el-button :disabled="scope.row.auditStatus === 1 || scope.row.auditStatus === 2" type="primary" text>
通过
</el-button>
</template>
</el-table-column>
</el-table>
</div>
<div class="pagination">
<el-pagination background :page-size="getObj.pageSize" :page-sizes="[5, 10, 20, 50, 100]"
layout="total, sizes, prev, pager, next, jumper" :total="total"
@size-change="handlePagination('size', $event)"
@current-change="handlePagination('page', $event)"></el-pagination>
</div>
</el-card>
</el-col>
</el-row>
</el-popconfirm>
<el-button :disabled="scope.row.auditStatus === 1 || scope.row.auditStatus === 2" type="primary" text
@click="showRejectDialog(scope.row)">
驳回
</el-button>
</div>
</template>
</el-table-column>
</el-table>
<div class="pagination">
<el-pagination :page-size="getObj.pageSize" :page-sizes="[5, 10, 20, 50, 100]"
layout="total, sizes, prev, pager, next, jumper" :total="total"
@size-change="handlePagination('size', $event)"
@current-change="handlePagination('page', $event)"></el-pagination>
</div>
</el-card>
<el-dialog v-model="rejectDialogVisible" title="驳回理由" width="500px">
<el-form>
@ -188,34 +155,35 @@ import API from '@/util/http.js'
import moment from 'moment'
import {useAdminStore} from "@/store/index.js";
import {storeToRefs} from "pinia";
const adminStore = useAdminStore();
const {adminData, menuTree} = storeToRefs(adminStore);
import {findMenuById, permissionMapping} from "@/utils/menuTreePermission.js"
import dayjs from "dayjs";
//
const trimJwCode = () => {
if (rechargeAudit.value.jwcode) {
rechargeAudit.value.jwcode = rechargeAudit.value.jwcode.replace(/\s/g, '');
}
}
const formatTime = (val) => val ? moment(val).format('YYYY-MM-DD HH:mm:ss') : ''
const defaultTime = [
new Date(2000, 1, 1, 0, 0, 0),
new Date(2000, 2, 1, 23, 59, 59),
]
//
const adminData = ref({})
//
const tableData = ref([])
//
//
const activeTimeRange = ref('')
//
const handleDatePickerChange = () => {
activeTimeRange.value = ''
}
//
const total = ref(50)
//
const getTime = ref([])
const activity = ref([])
const market = ref("")
const rejectDialogVisible = ref(false)
const rejectReason = ref('')
//
const currentRecord = ref(null)
//
const activeName = ref('wait')
const sortField = ref('')
const sortOrder = ref('')
//
const selectedMarketPath = ref("")
//
const rechargeAudit = ref({
jwcode: "", //
activity: "", //
@ -225,31 +193,13 @@ const rechargeAudit = ref({
market: "", //
auditStatus: "0",
})
//
const getObj = ref({
pageNum: 1,
pageSize: 50
})
//
const total = ref(50)
//
const getTime = ref([])
const activity = ref([])
//
const market = ref("")
//
const rejectDialogVisible = ref(false)
//
const rejectReason = ref('')
//
const currentRecord = ref(null)
//
const activeName = ref('wait')
//
const payModel = [
//
{
value: '现金',
label: '现金'
@ -267,8 +217,6 @@ const payModel = [
label: '其他(各地区电子支付)'
},
]
// ref
const Ref = ref(null)
//
const stats = ref({
totalNum: 0,
@ -277,38 +225,13 @@ const stats = ref({
freeGolds: 0,
taskGolds: 0
})
//
const sortField = ref('')
const sortOrder = ref('')
//
const rules = reactive({
rejectReason: [{required: true, message: '请输入驳回理由', trigger: 'blur'}]
})
const getAdminData = async function () {
try {
const result = await request({
url: '/admin/userinfo',
data: {}
})
adminData.value = result
console.log('用户信息', adminData.value)
} catch (error) {
console.log('请求失败', error)
}
}
//
const getRecharge = async function (val) {
try {
//
if (typeof val === 'number') {
getObj.value.pageNum = val
}
//
if (getTime.value && getTime.value.length === 2) {
rechargeAudit.value.startTime = formatTime(getTime.value[0])
rechargeAudit.value.endTime = formatTime(getTime.value[1])
@ -316,8 +239,6 @@ const getRecharge = async function (val) {
rechargeAudit.value.startTime = ''
rechargeAudit.value.endTime = ''
}
console.log('搜索参数', getObj.value)
if (rechargeAudit.value.market === '总部' || rechargeAudit.value.market === '研发部') {
rechargeAudit.value.market = '';
}
@ -325,11 +246,9 @@ const getRecharge = async function (val) {
if (rechargeAudit.value.jwcode) {
//
const numberRegex = /^\d{1,9}$/;
//
if (!numberRegex.test(rechargeAudit.value.jwcode)) {
ElMessage.error('请检查精网号格式')
return
}
}
@ -345,9 +264,7 @@ const getRecharge = async function (val) {
}
}
})
//
tableData.value = result.list
//
total.value = result.total
} catch (error) {
console.log('请求失败', error)
@ -365,7 +282,6 @@ const getStats = async () => {
if (rechargeAudit.value.jwcode) {
//
const numberRegex = /^\d{1,9}$/;
//
if (!numberRegex.test(rechargeAudit.value.jwcode)) {
// ElMessage.error('')
@ -404,8 +320,7 @@ const resetSearch = function () {
startTime: "",
endTime: "",
market: "",
auditStatus: rechargeAudit.value.auditStatus,
auditStatus: rechargeAudit.value.auditStatus
}
selectedMarketPath.value = []
getTime.value = []
@ -419,7 +334,6 @@ 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')
getTime.value = [startTime, endTime]
console.log('getTime', getTime.value)
activeTimeRange.value = 'today' //
@ -429,11 +343,9 @@ const getToday = function () {
//
const getYesterday = function () {
const today = dayjs()
const startTime = today.subtract(1, 'day').startOf('day').format('YYYY-MM-DD HH:mm:ss')
const endTime = today.subtract(1, 'day').endOf('day').format('YYYY-MM-DD HH:mm:ss')
getTime.value = [startTime, endTime]
console.log('getTime', getTime.value)
activeTimeRange.value = 'yesterday' //
@ -443,7 +355,6 @@ const getYesterday = function () {
// 7
const get7Days = function () {
const today = dayjs()
const startTime = today.subtract(6, 'day').startOf('day').format('YYYY-MM-DD HH:mm:ss')
const endTime = today.endOf('day').format('YYYY-MM-DD HH:mm:ss')
@ -491,7 +402,6 @@ const handleClick = function (tab, event) {
adminReject()
}
}
const getActivity = async function () {
try {
const result = await request({
@ -504,8 +414,6 @@ const getActivity = async function () {
console.log('请求失败', error)
}
}
const handlePagination = (type, val) => {
if (type === 'size') {
getObj.value.pageSize = val
@ -515,11 +423,6 @@ const handlePagination = (type, val) => {
getRecharge()
getStats()
}
const adminStore = useAdminStore();
const {menuTree} = storeToRefs(adminStore);
//
const handleApprove = async (row) => {
if (findMenuById(menuTree.value, permissionMapping.Recharge_Approval)) {
@ -543,19 +446,15 @@ const handleApprove = async (row) => {
}
}
//
const showRejectDialog = (row) => {
currentRecord.value = row
rejectReason.value = '' //
rejectReason.value = ''
if (findMenuById(menuTree.value, permissionMapping.Recharge_Approval)) {
rejectDialogVisible.value = true
} else {
ElMessage.error('无权限')
}
}
//
const handleReject = async () => {
if (findMenuById(menuTree.value, permissionMapping.Recharge_Approval)) {
@ -573,7 +472,6 @@ const handleReject = async () => {
}
await request({url: '/audit/audit', data: params})
ElMessage.success('驳回操作成功')
rejectDialogVisible.value = false
await getRecharge()
@ -586,7 +484,6 @@ const handleReject = async () => {
ElMessage.error('无权限')
}
}
//
const handleSortChange = (column) => {
console.log('排序字段:', column.prop)
@ -637,9 +534,6 @@ const previewImage = (imageUrl) => {
document.body.removeChild(viewer);
});
};
//
const selectedMarketPath = ref("")
const handleMarketChange = (value) => {
if (value && value.length > 0) {
rechargeAudit.value.market = value[value.length - 1]
@ -652,24 +546,18 @@ const props = {multiple: true}
//
const getMarket = async function () {
try {
// POST
const result = await API({
url: '/market/selectMarket',
});
//
console.log('请求成功', result)
//
const transformTree = (nodes) => {
//
const allChildren = nodes.flatMap(node => node.children || []);
return allChildren.map(child => {
const grandchildren = child.children && child.children.length
? transformTree([child]) //
: null;
return {
value: child.name,
label: child.name,
@ -677,21 +565,33 @@ const getMarket = async function () {
};
});
};
//
market.value = transformTree(result.data)
console.log('转换后的地区树==============', market.value)
} catch (error) {
console.log('请求失败', error)
}
}
//
const format3 = (num) => {
return num.toLocaleString('en-US')
}
//
const handleDatePickerChange = () => {
activeTimeRange.value = ''
}
//
const trimJwCode = () => {
if (rechargeAudit.value.jwcode) {
rechargeAudit.value.jwcode = rechargeAudit.value.jwcode.replace(/\s/g, '');
}
}
const formatTime = (val) => val ? moment(val).format('YYYY-MM-DD HH:mm:ss') : ''
//
onMounted(async function () {
await getAdminData()
await getActivity()
await getMarket()
await getRecharge()
console.log('111')
console.log("看看通信来的用户身份", adminData.value)
await getStats()
})
</script>
@ -699,74 +599,18 @@ onMounted(async function () {
<style scoped>
.pagination {
display: flex;
margin-top: 0.5vh;
}
.operation {
display: flex;
}
.green-dot {
background-color: #67C23A;
}
.grey-dot {
background-color: #909399;
}
.red-dot {
background-color: #F56C6C;
}
.time-controls {
display: flex;
align-items: center;
}
.time-group {
display: flex;
align-items: center;
gap: 10px;
}
.quick-buttons {
display: flex;
align-items: center;
}
.status {
display: flex;
align-items: center;
/* 确保子元素垂直居中对齐 */
gap: 6px;
/* 设置圆点和文字之间的间距 */
}
.green-dot,
.grey-dot,
.red-dot {
display: inline-block;
width: 8px;
height: 8px;
border-radius: 50%;
flex-shrink: 0;
/* 防止圆点在空间不足时缩小 */
margin: 0;
/* 移除原有的 margin-right */
}
/* 备注列样式 */
.remark-cell {
display: block;
width: 100%;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
/* 设置单元格内容溢出隐藏 */
.el-table .el-table__cell {
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
</style>

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

@ -1,65 +1,36 @@
<template>
<el-row>
<el-card style="margin-bottom: 0.5vh;margin-top:0.5vh;width:82.5vw">
<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 />
<el-text size="large">商品名</el-text>
<el-select v-model="searchForm.goodsName" placeholder="请输入商品名" style="width: 12vw;margin-right:1vw" clearable>
<el-option v-for="item in refundGoodsOptions" :key="item" :label="item" :value="item"></el-option>
</el-select>
<el-text size="large">退款方式</el-text>
<el-select v-model="searchForm.refundModel" placeholder="请选择" style="width: 12vw;margin-right:1vw" clearable>
<el-option label="全部退款" value="0" />
<el-option label="部分退款" value="1" />
</el-select>
<el-text size="large">所属地区</el-text>
<el-cascader v-model="selectedMarketPath" :options="market" placeholder="请选择所属地区" clearable style="width:12vw"
@change="handleMarketChange" />
</el-col>
<el-col>
<div>
<el-card style="margin-bottom: 20px;margin-top:10px">
<el-row style="margin-bottom: 5px">
<el-col :span="6">
<el-text size="large">精网号</el-text>
<el-input v-model="searchForm.jwcode" placeholder="请输入精网号" style="width: 240px" clearable/>
</el-col>
<el-col :span="6">
<el-text size="large">商品名</el-text>
<el-select v-model="searchForm.goodsName" placeholder="请输入商品名" style="width: 240px" clearable>
<el-option v-for="item in refundGoodsOptions" :key="item" :label="item" :value="item"></el-option>
</el-select>
</el-col>
<el-col :span="6">
<el-text size="large">退款方式</el-text>
<el-select v-model="searchForm.refundModel" placeholder="请选择" style="width: 240px" clearable>
<el-option label="全部退款" value="0"/>
<el-option label="部分退款" value="1"/>
</el-select>
</el-col>
<el-col :span="6">
<el-text class="mx-1" size="large">所属地区</el-text>
<el-cascader
v-model="selectedMarketPath"
:options="market"
placeholder="请选择所属地区"
clearable
style="width:180px"
@change="handleMarketChange"
/>
</el-col>
</el-row>
<el-row>
<el-col :span="15">
<div class="time-controls">
<div class="time-group">
<el-text size="large" style="width: 80px">提交时间</el-text>
<el-date-picker v-model="dateRange" type="datetimerange" range-separator=""
start-placeholder="开始时间"
end-placeholder="结束时间" style="width: 400px" @change="handleDatePickerChange" :default-time="defaultTime"/>
<el-button @click="getToday()" style="margin-left: 10px"
:type="activeTimeRange === 'today' ? 'primary' : ''">
</el-button>
<el-button @click="getYesterday()" style="margin-left: 10px"
:type="activeTimeRange === 'yesterday' ? 'primary' : ''">
</el-button>
<el-button @click="get7Days()" style="margin-left: 10px"
:type="activeTimeRange === '7days' ? 'primary' : ''"> 近7天
</el-button>
<el-button type="success" @click="resetSearch">重置</el-button>
<el-button type="primary" @click="handleSearch">查询</el-button>
</div>
</div>
</el-col>
</el-row>
</el-card>
</div>
<el-text size="large">提交时间</el-text>
<el-date-picker v-model="dateRange" type="datetimerange" range-separator="" start-placeholder="开始时间" class="time-controls"
end-placeholder="结束时间" style="margin-right:1vw;width:25vw" @change="handleDatePickerChange"
:default-time="defaultTime"/>
<el-button @click="getToday()" :type="activeTimeRange === 'today' ? '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 type="success" @click="resetSearch">重置</el-button>
<el-button type="primary" @click="handleSearch">查询</el-button>
</el-col>
</el-row>
</el-card>
<el-card>
<el-tabs v-model="activeName" type="card" @tab-click="handleClick">
@ -69,26 +40,26 @@
</el-tabs>
<div>
总条数{{ stats.totalNum }}&nbsp;&nbsp;&nbsp;&nbsp;
退款总金币数{{ (stats.permanentGolds + stats.freeGolds + stats.taskGolds).toFixed(2) }}金币&nbsp;&nbsp;&nbsp;&nbsp;
永久金币{{ stats.permanentGolds.toFixed(2) }}金币&nbsp;&nbsp;&nbsp;&nbsp;
免费金币{{ stats.freeGolds.toFixed(2) }}金币&nbsp;&nbsp;&nbsp;&nbsp;
任务金币{{ stats.taskGolds.toFixed(2) }}金币
总条数{{ format3(stats.totalNum) }}&nbsp;&nbsp;&nbsp;&nbsp;
退款总金币数{{ format3(stats.permanentGolds + stats.freeGolds + stats.taskGolds) }}金币&nbsp;&nbsp;&nbsp;&nbsp;
永久金币{{ format3(stats.permanentGolds) }}金币&nbsp;&nbsp;&nbsp;&nbsp;
免费金币{{ format3(stats.freeGolds.toFixed(2)) }}金币&nbsp;&nbsp;&nbsp;&nbsp;
任务金币{{ format3(stats.taskGolds.toFixed(2)) }}金币
</div>
<el-table :data="tableData" height="540px" @sort-change="handleSortChange">
<el-table-column type="index" label="序号" width="60"/>
<el-table-column prop="name" label="姓名" width="120"/>
<el-table-column prop="jwcode" label="精网号" width="120"/>
<el-table-column prop="market" label="所属地区" width="120"/>
<el-table :data="tableData" style="height:55vh" @sort-change="handleSortChange">
<el-table-column type="index" label="序号" width="60" />
<el-table-column prop="name" label="姓名" width="120" />
<el-table-column prop="jwcode" label="精网号" width="120" />
<el-table-column prop="market" label="所属地区" width="120" />
<el-table-column prop="refundType" label="退款类型" width="120"/>
<el-table-column prop="refundType" label="退款类型" width="120" />
<el-table-column prop="refundModel" label="退款方式" width="120">
<template #default="{ row }">
{{ row.refundModel === 0 ? '全部退款' : '部分退款' }}
</template>
</el-table-column>
<el-table-column prop="goodsName" label="退款商品" width="120" show-overflow-tooltip/>
<el-table-column prop="goodsName" label="退款商品" width="120" show-overflow-tooltip />
<el-table-column prop="sumGold" label="退款金额" width="120" sortable="custom">
<template #default="{ row }">
{{ row.sumGold / 100 }}
@ -109,11 +80,11 @@
{{ row.taskGold / 100 }}
</template>
</el-table-column>
<el-table-column prop="remark" label="备注" width="150" show-overflow-tooltip/><!-- 当内容过长被隐藏时显示 tooltip -->
<el-table-column prop="adminName" label="提交人" width="120"/>
<el-table-column prop="remark" label="备注" width="150" show-overflow-tooltip />
<el-table-column prop="adminName" label="提交人" width="120" />
<el-table-column v-if="checkTab === 'reject'" prop="rejectReason" label="驳回理由" width="150"
show-overflow-tooltip/>
<el-table-column v-if="checkTab !== 'pending'" prop="auditName" label="审核人" width="120"/>
show-overflow-tooltip />
<el-table-column v-if="checkTab !== 'pending'" prop="auditName" label="审核人" width="120" />
<el-table-column prop="createTime" label="提交时间" width="180" sortable="custom">
<template #default="{ row }">
{{ moment(row.createTime).format('YYYY-MM-DD HH:mm:ss') }}
@ -135,7 +106,7 @@
</template>
</el-popconfirm>
<el-button :disabled="scope.row.auditStatus === 1 || scope.row.auditStatus === 2" type="primary" text
@click="showRejectDialog(scope.row)">
@click="showRejectDialog(scope.row)">
驳回
</el-button>
</div>
@ -143,16 +114,15 @@
</el-table-column>
</el-table>
<el-pagination class="pagination" v-model:current-page="pagination.pageNum" v-model:page-size="pagination.pageSize"
layout="total, sizes, prev, pager, next, jumper" :total="pagination.total"
@size-change="handlePageSizeChange"
@current-change="handleCurrentChange"></el-pagination>
layout="total, sizes, prev, pager, next, jumper" :total="pagination.total" @size-change="handlePageSizeChange"
@current-change="handleCurrentChange"></el-pagination>
</el-card>
<el-dialog v-model="rejectDialogVisible" title="驳回理由" width="500px">
<el-form>
<el-form-item label="驳回理由" required>
<el-input v-model="rejectReason" type="textarea" :rows="4" placeholder="请输入驳回理由" maxlength="200"
show-word-limit/>
show-word-limit />
</el-form-item>
</el-form>
<template #footer>
@ -165,33 +135,25 @@
</template>
<script setup>
import {onMounted, reactive, ref} from 'vue'
import {ElMessage} from 'element-plus'
import { onMounted, reactive, ref } from 'vue'
import { ElMessage } from 'element-plus'
import API from '@/util/http.js'
import moment from 'moment'
import {useAdminStore} from "@/store/index.js";
import {storeToRefs} from "pinia";
import {findMenuById, permissionMapping} from "@/utils/menuTreePermission.js"
import { useAdminStore } from "@/store/index.js";
import { storeToRefs } from "pinia";
import { findMenuById, permissionMapping } from "@/utils/menuTreePermission.js"
import dayjs from "dayjs";
const trimJwCode = () => {
if (searchForm.value.jwcode) {
searchForm.value.jwcode = searchForm.value.jwcode.replace(/\s/g, '');
}
}
const adminStore = useAdminStore();
const { adminData, menuTree } = storeToRefs(adminStore);
const defaultTime = [
new Date(2000, 1, 1, 0, 0, 0),
new Date(2000, 2, 1,23 , 59, 59),
new Date(2000, 2, 1, 23, 59, 59),
]
//
//
const activeTimeRange = ref('')
//
const handleDatePickerChange = () => {
activeTimeRange.value = ''
}
const scopeValue = ref(null) //
const rejectDialogVisible = ref(false) //
const rejectReason = ref('') //
const rejectDialogVisible = ref(false)
const rejectReason = ref('')
//
const STATUS = {
PENDING: 0, //
@ -209,7 +171,6 @@ const searchForm = ref({
auditStatus: '0'
})
const checkTab = ref('pending') // STATUS012statusInteger
//
const dateRange = ref([])
const pagination = ref({
pageNum: 1,
@ -220,6 +181,7 @@ const tableData = ref([])
const marketOptions = ref([])
const refundGoodsOptions = ref([])
const adminInfo = ref({})
//
const stats = ref({
totalNum: 0,
@ -228,43 +190,14 @@ const stats = ref({
freeGolds: 0,
taskGolds: 0
})
//
const rejectVisible = ref(false)
//
const rejectObj = ref({})
//
const passObj = ref({})
//
const activeName = ref('wait')
// ref
const Ref = ref(null)
//
const sortField = ref('')
const sortOrder = ref('')
//
const rules = reactive({
reason: [{required: true, message: '请输入驳回理由', trigger: 'blur'}]
})
const getAdminData = async function () {
try {
const result = await API({url: '/admin/userinfo', data: {}})
adminInfo.value = result
console.log('请求成功', result)
console.log('用户信息', adminInfo.value)
} catch (error) {
console.log('请求失败', error)
}
}
const handlePageSizeChange = function (val) {
pagination.value.pageSize = val
get()
console.log('aaaaaaaaaaaaaaaaaa这是pageSize改变调用')
}
const handleCurrentChange = function (val) {
pagination.value.pageNum = val
get()
console.log('aaaaaaaaaaaaaaa这是pageNum改变调用')
}
const market = ref("")
//
const handleSortChange = (column) => {
if (column.prop === 'sumGold') {
@ -293,13 +226,10 @@ const showRejectDialog = (row) => {
rejectReason.value = ''
rejectDialogVisible.value = true
}
//
const market = ref("")
//
const getRefundGoods = async () => {
try {
const res = await API({url: '/general/goods'})
const res = await API({ url: '/general/goods' })
refundGoodsOptions.value = res.data || []
} catch (error) {
console.error('获取商品列表失败', error)
@ -344,7 +274,7 @@ const get = async function (val) {
return
}
}
const res = await API({url: '/audit/selectRefund', data: params})
const res = await API({ url: '/audit/selectRefund', data: params })
tableData.value = res.list || []
pagination.value.total = res.total || 0
console.log('查全部的total', pagination.value.total, res.total)
@ -352,10 +282,6 @@ const get = async function (val) {
console.error('获取数据失败', error)
}
}
const adminStore = useAdminStore();
const {menuTree} = storeToRefs(adminStore);
//
const handleApprove = async (row) => {
if (findMenuById(menuTree.value, permissionMapping.Refund_Approval)) {
@ -363,15 +289,14 @@ const handleApprove = async (row) => {
try {
const params = {
orderCode: row.orderCode,
auditId: adminInfo.value.id,
auditId: adminData.value.id,
action: 1,// action1,2
rejectReason: ''
}
await API({url: '/audit/audit', data: params})//
await API({ url: '/audit/audit', data: params })
ElMessage.success('审核通过成功')
get()
getStats()
console.log('aaaaaaaaaa这是通过调用')
} catch (error) {
console.error('审核通过失败', error)
ElMessage.error('操作失败')
@ -392,16 +317,16 @@ const handleReject = async () => {
try {
const params = {
orderCode: scopeValue.value.orderCode,
auditId: adminInfo.value.id,
auditId: adminData.value.id,
action: 2,
rejectReason: rejectReason.value
}
await API({url: '/audit/audit', data: params})
await API({ url: '/audit/audit', data: params })
ElMessage.success('驳回成功')
rejectDialogVisible.value = false
get()
getStats()
console.log('aaaaaaaaaa这是驳回调用', params)
console.log('看看驳回参数', params)
} catch (error) {
console.error('驳回失败', error)
ElMessage.error('操作失败')
@ -445,17 +370,12 @@ const getStats = async () => {
console.log('请求失败', error)
}
}
//
const handleSearch = function () {
// pagination.value.pageNum = 1
trimJwCode()
get()
getStats()
console.log('aaaaaaaaaa这是搜索按钮调用')
}
//
const resetSearch = function () {
const auditStatus = searchForm.value.auditStatus;
@ -476,22 +396,17 @@ const resetSearch = function () {
get()
getStats()
}
//
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.endOf('day').format('YYYY-MM-DD HH:mm:ss')
dateRange.value = [startTime, endTime]
console.log('dateRange', dateRange.value)
activeTimeRange.value = 'today' //
activeTimeRange.value = 'today'
get()
getStats()
console.log('aaaaaaaaaa这是今天调用')
}
//
const getYesterday = function () {
const today = dayjs()
@ -499,13 +414,10 @@ const getYesterday = function () {
const endTime = today.subtract(1, 'day').endOf('day').format('YYYY-MM-DD HH:mm:ss')
dateRange.value = [startTime, endTime]
console.log('dateRange', dateRange.value)
activeTimeRange.value = 'yesterday' //
activeTimeRange.value = 'yesterday'
get()
getStats()
console.log('aaaaaaaaaa这是昨天调用')
}
// 7
const get7Days = function () {
const today = dayjs()
@ -513,14 +425,10 @@ const get7Days = function () {
const endTime = today.endOf('day').format('YYYY-MM-DD HH:mm:ss')
dateRange.value = [startTime, endTime]
console.log('dateRange', dateRange.value)
activeTimeRange.value = '7days' //
activeTimeRange.value = '7days'
get()
getStats()
console.log('aaaaaaaaaa这是近七天调用')
}
//
const handleClick = function (tab, event) {
activeName.value = tab.props.name
if (tab.props.name === 'wait') {
@ -531,7 +439,6 @@ const handleClick = function (tab, event) {
adminReject()
}
}
//
const getCurrentStatus = () => {
switch (activeName.value) {
@ -545,38 +452,27 @@ const getCurrentStatus = () => {
return ''
}
}
//
//
const adminWait = async function () {
checkTab.value = 'pending'
searchForm.value.auditStatus = STATUS.PENDING
// pagination.value.pageNum = 1
await get()
await getStats()
console.log('aaaaaaaaaaaaaaaaa看看checkTab,这是点击待审核调用', checkTab.value)
}
//
//
const adminPass = async function () {
checkTab.value = 'pass'
searchForm.value.auditStatus = STATUS.APPROVED
// pagination.value.pageNum = 1
await get()
await getStats()
console.log('aaaaaaaaaaaaaaaaaaaaa看看checkTab,这是点击已通过调用', checkTab.value)
}
//
//
const adminReject = async function () {
checkTab.value = 'reject'
searchForm.value.auditStatus = STATUS.REJECTED
// pagination.value.pageNum = 1
await get()
await getStats()
console.log('aaaaaaaaaaaaaaaaaa看看checkTab,这是点击已驳回调用', checkTab.value)
}
//
const selectedMarketPath = ref("")
const handleMarketChange = (value) => {
if (value && value.length > 0) {
@ -588,12 +484,10 @@ const handleMarketChange = (value) => {
//
const getMarket = async function () {
try {
// POST
const result = await API({
url: '/market/selectMarket',
});
//
})
console.log('请求成功', result)
//
@ -603,8 +497,8 @@ const getMarket = async function () {
return allChildren.map(child => {
const grandchildren = child.children && child.children.length
? transformTree([child]) //
: null;
? transformTree([child]) //
: null;
return {
value: child.name,
@ -613,28 +507,49 @@ const getMarket = async function () {
};
});
};
//
market.value = transformTree(result.data)
console.log('转换后的地区树==============', market.value)
} catch (error) {
console.log('请求失败', error)
}
}
const trimJwCode = () => {
if (searchForm.value.jwcode) {
searchForm.value.jwcode = searchForm.value.jwcode.replace(/\s/g, '');
}
}
//
const handleDatePickerChange = () => {
activeTimeRange.value = ''
}
const format3 = (num) => {
//
return num.toLocaleString('en-US')
}
//
const rules = reactive({
reason: [{ required: true, message: '请输入驳回理由', trigger: 'blur' }]
})
const handlePageSizeChange = function (val) {
pagination.value.pageSize = val
get()
}
const handleCurrentChange = function (val) {
pagination.value.pageNum = val
get()
}
onMounted(async () => {
await getAdminData()
getRefundGoods()
await getMarket()
await get()
await getStats()
console.log('aaaaaaaaaa这是挂载后调用')
})
</script>
<style scoped>
.pagination {
display: flex;
margin-top:0.5vh;
}
.operation {
@ -644,9 +559,6 @@ onMounted(async () => {
.time-controls {
display: flex;
align-items: center;
}
.time-group {
display: flex;
align-items: center;
gap: 10px;

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

@ -71,9 +71,12 @@ const rules = reactive({
}, trigger: 'blur'
}],
permanentBean: [
{ required: true, message: '请输入付费金豆数', trigger: 'blur' },
{ required: true, message: '请输入付费金豆数', trigger: 'change' },
{
validator: (rule, value, callback) => {
if(!value){
value = 0
}
//
if (!/^\d+$/.test(value)) {
callback(new Error('请输入非负整数'));
@ -92,9 +95,12 @@ const rules = reactive({
}
],
freeBean: [
{ required: true, message: '请输入免费金豆数', trigger: 'blur' },
{ required: true, message: '请输入免费金豆数', trigger: 'change' },
{
validator: (rule, value, callback) => {
if(!value){
value = 0
}
//
if (!/^\d+$/.test(value)) {
callback(new Error('请输入非负整数'));
@ -155,12 +161,12 @@ const handleConsumeForm = async () => {
const userPermanentBean = Number(user.value.permanentBean) || 0;
const userFreeBean = Number(user.value.freeBean) || 0;
if (inputPermanentBean > userPermanentBean) {
throw new Error('付费金豆数量超过用户当前所拥有');
}
if (inputFreeBean > userFreeBean) {
throw new Error('免费金豆数量超过用户当前所拥有');
}
// if (inputPermanentBean > userPermanentBean) {
// throw new Error('');
// }
// if (inputFreeBean > userFreeBean) {
// throw new Error('');
// }
await ElMessageBox.confirm(
'确认消耗吗?',
@ -211,10 +217,10 @@ const throttledHandleConsumeFormt = _.throttle(handleConsumeForm, 5000, {
<el-button type="primary" @click="getUser(consumeForm.jwcode)" style="margin-left: 20px">查询</el-button>
</el-form-item>
<el-form-item prop="permanentBean" label="付费金豆" label-position="left">
<el-input v-model="consumeForm.permanentBean" placeholder="不填默认为0" style="width: 100px" />
<el-input v-model="consumeForm.permanentBean" placeholder="0" style="width: 100px" />
</el-form-item>
<el-form-item prop="freeBean" label="免费金豆" label-position="left">
<el-input v-model="consumeForm.freeBean" placeholder="不填默认为0" style="width: 100px" />
<el-input v-model="consumeForm.freeBean" placeholder="0" style="width: 100px" />
</el-form-item>
<el-form-item prop="remark" label="备注" label-position="left">
<el-input v-model="consumeForm.remark" style="width: 300px" :rows="5" maxlength="100" show-word-limit

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

@ -8,7 +8,7 @@ import { ar } from 'element-plus/es/locales.mjs'
//
const defaultTime = [
new Date(2000, 1, 1, 0, 0, 0),
new Date(2000, 2, 1,23 , 59, 59),
new Date(2000, 2, 1, 23, 59, 59),
]
/*
====================工具方法==============================
@ -88,7 +88,7 @@ const getDept = async function () {
// url: '/general/dept',
url: '/beanConsume/getDept', // todo
data: {account:adminData.value.account}
data: { account: adminData.value.account }
})
console.log('请求地区列表成功', result)
//
@ -151,19 +151,19 @@ const ConsumeSelectBy = async function (val) {
if (getTime.value != null) {
if (getTime.value.startTime != '' && getTime.value.endTime != '') {
beanConsumeArticle.value.startTime = formatTime(getTime.value[0])
beanConsumeArticle.value.endTime = formatTime(getTime.value[1])
beanConsumeArticle.value.startTime = formatTime(getTime.value[0])
beanConsumeArticle.value.endTime = formatTime(getTime.value[1])
}
} else {
beanConsumeArticle.value.startTime = ''
beanConsumeArticle.value.endTime = ''
beanConsumeArticle.value.startTime = ''
beanConsumeArticle.value.endTime = ''
}
beanConsumeArticle.value.sortField = sortField.value
beanConsumeArticle.value.sortOrder = sortOrder.value
beanConsumeArticle.value.sortField = sortField.value
beanConsumeArticle.value.sortOrder = sortOrder.value
console.log('搜索参数_时间', beanConsumeArticle.value.startTime)
console.log('搜索参数_时间', beanConsumeArticle.value.startTime)
console.log('搜索参数1', getObj.value)
console.log('搜索参数2', beanConsumeArticle.value)
console.log('搜索参数2', beanConsumeArticle.value)
// POST
const result = await request({
@ -171,8 +171,8 @@ const ConsumeSelectBy = async function (val) {
data: {
pageNum: getObj.value.pageNum,
pageSize: getObj.value.pageSize,
beanConsumeArticle: {
... beanConsumeArticle.value,
beanConsumeArticle: {
...beanConsumeArticle.value,
jwcode: beanConsumeArticle.value.jwcode,
dept: beanConsumeArticle.value.dept,
payMode: beanConsumeArticle.value.payMode,
@ -223,11 +223,11 @@ const ConsumeSelectBy = async function (val) {
const data = resultTotalGold.data || resultTotalGold;
console.log('请求成功3', resultTotalGold.data)
console.log('permanentBean3',data.permanentBean)
// permanentBeanfreeBeantotalNum
permanentBean.value = Number(data.permanentBean) || 0;
freeBean.value = Number(data.freeBean) || 0;
totalNum.value = Number(data.totalNum) || 0;
console.log('permanentBean3', data.permanentBean)
// permanentBeanfreeBeantotalNum
permanentBean.value = Number(data.permanentBean) || 0;
freeBean.value = Number(data.freeBean) || 0;
totalNum.value = Number(data.totalNum) || 0;
//
total.value = result.data.total
@ -239,20 +239,20 @@ const ConsumeSelectBy = async function (val) {
//
const search = function () {
getObj.value.pageNum = 1
if(beanConsumeArticle.value.jwcode){
const numRef = /^\d{1,9}$/;
if(!numRef.test(beanConsumeArticle.value.jwcode)){
ElMessage.error('请检查精网号格式')
return
}
if (beanConsumeArticle.value.jwcode) {
const numRef = /^\d{1,9}$/;
if (!numRef.test(beanConsumeArticle.value.jwcode)) {
ElMessage.error('请检查精网号格式')
return
}
if(beanConsumeArticle.value.articleId){
const numRef = /^\d{1,9}$/;
if(!numRef.test(beanConsumeArticle.value.articleId)){
ElMessage.error('请检查文章ID格式')
return
}
}
if (beanConsumeArticle.value.articleId) {
const numRef = /^\d{1,9}$/;
if (!numRef.test(beanConsumeArticle.value.articleId)) {
ElMessage.error('请检查文章ID格式')
return
}
}
ConsumeSelectBy()
}
//
@ -261,14 +261,14 @@ const reset = function () {
beanConsumeArticle.value.jwcode = null
beanConsumeArticle.value.dept = ''
beanConsumeArticle.value.type = ''
beanConsumeArticle.value.payMode = ''
beanConsumeArticle.value.articleId = ''
beanConsumeArticle.value.articleName = ''
beanConsumeArticle.value.author = ''
beanConsumeArticle.value.type = ''
beanConsumeArticle.value.payMode = ''
beanConsumeArticle.value.articleId = ''
beanConsumeArticle.value.articleName = ''
beanConsumeArticle.value.author = ''
beanConsumeArticle.value.startTime = ''
beanConsumeArticle.value.endTime = ''
beanConsumeArticle.value.startTime = ''
beanConsumeArticle.value.endTime = ''
@ -280,18 +280,18 @@ const reset = function () {
//
ConsumeSelectBy()
console.log(' beanConsumeArticle', beanConsumeArticle.value)
console.log(' beanConsumeArticle', beanConsumeArticle.value)
}
//
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.endOf('day').format('YYYY-MM-DD HH:mm:ss')
getTime.value = [startTime, endTime]
console.log('getTime', getTime.value)
activeTimeRange.value = 'today' //
ConsumeSelectBy()
ConsumeSelectBy()
}
//
const getYesterday = function () {
@ -360,7 +360,10 @@ const handleCurrentChange = function (val) {
====================挂载=================================
*/
const format3 = (num) => {
//
return num.toLocaleString('en-US')
}
onMounted(async function () {
await getAdminData()
await ConsumeSelectBy()
@ -372,12 +375,12 @@ onMounted(async function () {
const exportExcel = async function () {
const params = { //
...getObj.value,
"beanConsumeArticle": {
...beanConsumeArticle.value,
sortField: sortField.value,
sortOrder: sortOrder.value,
},
...getObj.value,
"beanConsumeArticle": {
...beanConsumeArticle.value,
sortField: sortField.value,
sortOrder: sortOrder.value,
},
}
const res = await API({ url: '/export/exportArticle', data: params })
if (res.code === 200) {
@ -460,93 +463,57 @@ const getTagText = (state) => {
</script>
<template>
<el-row>
<el-col>
<el-card style="margin-bottom: 20px;margin-top:10px">
<el-row style="margin-bottom: 10px">
<el-col :span="4">
<div class="head-card-element">
<el-text class="mx-1">精网号</el-text>
<el-input v-model="beanConsumeArticle.jwcode" placeholder="请输入精网号" style="width: 140px" clearable />
</div>
</el-col>
<el-col :span="4">
<div class="head-card-element">
<el-text class="mx-1">地区</el-text>
<el-select v-model="beanConsumeArticle.dept" placeholder="请选择地区" style="width: 140px" clearable>
<el-option v-for="(item, index) in dept" :key="index" :label="item" :value="item" />
</el-select>
</div>
</el-col>
<el-col :span="4">
<div class="head-card-element">
<el-text class="mx-1">类型</el-text>
<el-select v-model="beanConsumeArticle.payMode" placeholder="请选择类型" style="width: 140px" clearable @change="handlePayModeChange">
<el-option label="打赏" value="0" />
<el-option label="付费购买" value="1" />
<el-option label="其他" value="2" />
</el-select>
</div>
</el-col>
<el-col :span="4">
<div class="head-card-element">
<el-text class="mx-1">文章/视频ID</el-text>
<el-input v-model="beanConsumeArticle.articleId" placeholder="请输入文章/视频ID" style="width: 140px" clearable />
</div>
</el-col>
<el-col :span="5">
<div class="head-card-element">
<el-text class="mx-1">文章/视频标题</el-text>
<el-input v-model="beanConsumeArticle.articleName" placeholder="请输入文章/视频标题" style="width: 160px" clearable />
</div>
</el-col>
</el-row>
<el-row>
<el-col :span="4">
<div class="head-card-element">
<el-text class="mx-1" >作者</el-text>
<el-input v-model="beanConsumeArticle.author" placeholder="请输入作者" style="width: 155px" clearable />
</div>
</el-col>
<el-col :span="20">
<div class="head-card-element">
<el-text class="mx-1">付费时间</el-text>
<el-date-picker
v-model="getTime"
type="datetimerange"
range-separator="至"
start-placeholder="起始时间"
end-placeholder="结束时间"
style="width: 400px"
@change="handleDatePickerChange"
value-format="YYYY-MM-DD HH:mm:ss"
:default-time="defaultTime"
/>
<el-button @click="getToday()" style="margin-left: 10px" :type="activeTimeRange === 'today' ? 'primary' : ''"></el-button>
<el-button @click="getYesterday()" style="margin-left: 10px" :type="activeTimeRange === 'yesterday' ? 'primary' : ''"></el-button>
<el-button @click="get7Days()" style="margin-left: 10px" :type="activeTimeRange === '7days' ? 'primary' : ''">近7天</el-button>
<el-button type="success" @click="reset()">重置</el-button>
<el-button type="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-row>
<el-card style="margin-bottom: 10px;margin-top:10px">
<el-col style="margin-bottom: 10px">
<el-text>精网号</el-text>
<el-input v-model="beanConsumeArticle.jwcode" placeholder="请输入精网号" style="width: 200px;margin-right: 20px" clearable />
<el-text>地区</el-text>
<el-select v-model="beanConsumeArticle.dept" placeholder="请选择地区" style="width: 200px;margin-right: 20px" clearable>
<el-option v-for="(item, index) in dept" :key="index" :label="item" :value="item" />
</el-select>
<el-text>类型</el-text>
<el-select v-model="beanConsumeArticle.payMode" placeholder="请选择类型" style="width: 200px;margin-right: 20px" 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: 200px;margin-right: 20px" clearable />
<el-text>文章/视频标题</el-text>
<el-input v-model="beanConsumeArticle.articleName" placeholder="请输入文章/视频标题" style="width: 200px" clearable />
</el-col>
<el-col>
<el-text>作者</el-text>
<el-input v-model="beanConsumeArticle.author" placeholder="请输入作者" style="width: 200px;margin-right: 20px" clearable />
<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"
value-format="YYYY-MM-DD HH:mm:ss" :default-time="defaultTime" />
<el-button @click="getToday()" :type="activeTimeRange === 'today' ? '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 type="success" @click="reset()">重置</el-button>
<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>
</el-card>
</el-col>
</el-row>
<el-row>
<el-col>
<el-card>
<div>
金豆总数{{ Math.abs(permanentBean+freeBean) }}付费金豆数{{ Math.abs(permanentBean) }}免费金豆数{{
Math.abs(freeBean)
}}
金豆总数{{ format3(Math.abs(permanentBean + freeBean)) }}&nbsp;&nbsp;&nbsp;&nbsp;
付费金豆数{{ format3(Math.abs(permanentBean)) }}&nbsp;&nbsp;&nbsp;&nbsp;
免费金豆数{{ format3(Math.abs(freeBean)) }}
</div>
<!-- 设置表格容器的高度和滚动样式 -->
<div style="height: 576px; overflow-y: auto">
<el-table :data="tableData" style="width: 100%" height="576px" @sort-change="handleSortChange">
<div style="overflow-y: auto">
<el-table :data="tableData" style="width: 100%" height="550px" @sort-change="handleSortChange">
<el-table-column type="index" label="序号" width="80px" fixed="left">
<template #default="scope">
<span>{{
@ -568,11 +535,11 @@ const getTagText = (state) => {
}}
</template>
</el-table-column>
<el-table-column prop="beanNum" label="金豆总数" sortable="custom" width="120px"/>
<el-table-column prop="buyBean" label="付费金豆数" sortable="custom" width="120px"/>
<el-table-column prop="freeBean" label="免费金豆数" sortable="custom" width="120px"/>
<el-table-column prop="beanNum" label="金豆总数" sortable="custom" width="120px" />
<el-table-column prop="buyBean" label="付费金豆数" sortable="custom" width="120px" />
<el-table-column prop="freeBean" label="免费金豆数" sortable="custom" width="120px" />
<el-table-column prop="articleId" label="文章/视频ID" width="150px" />
<el-table-column prop="articleName" label="文章/视频标题" width="200px" show-overflow-tooltip />
<el-table-column prop="articleName" label="文章/视频标题" width="150px" show-overflow-tooltip />
<el-table-column prop="author" label="作者" width="120px" />
<el-table-column prop="consumeTime" label="付费时间" sortable="custom" width="180px">
<template #default="scope">
@ -589,12 +556,10 @@ const getTagText = (state) => {
@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 :data="exportList" style="width: 100% ;height: 60vh;" :loading="exportListLoading">
<el-table-column prop="fileName" label="文件名" />
<el-table-column prop="state" label="状态">
<template #default="scope">
@ -626,22 +591,6 @@ const getTagText = (state) => {
</template>
<style scoped>
.status {
display: flex;
}
.head-card {
display: flex;
}
.head-card-element {
margin-right: 20px;
}
.head-card-btn {
margin-left: auto;
}
.pagination {
display: flex;
margin-top: 20px;

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

@ -9,12 +9,15 @@ import moment from 'moment'
/*
====================工具方法==============================
*/
const format3 = (num) => {
//
return num.toLocaleString('en-US')
}
//
const formatTime = (val) => val ? dayjs(val).format('YYYY-MM-DD HH:mm:ss') : ''
const defaultTime = [
new Date(2000, 1, 1, 0, 0, 0),
new Date(2000, 2, 1,23 , 59, 59),
new Date(2000, 2, 1, 23, 59, 59),
]
/*
====================数据=================================
@ -43,7 +46,7 @@ const getChannel = async function () {
try {
const result = await request({
url: '/beanConsume/getLiveChannel', // todo
data: {account:adminData.value.account}
data: { account: adminData.value.account }
})
console.log('请求频道列表成功', result)
//
@ -153,19 +156,19 @@ const ConsumeSelectBy = async function (val) {
if (getTime.value != null) {
if (getTime.value.startTime != '' && getTime.value.endTime != '') {
beanConsumeFan.value.startTime = formatTime(getTime.value[0])
beanConsumeFan.value.endTime = formatTime(getTime.value[1])
beanConsumeFan.value.startTime = formatTime(getTime.value[0])
beanConsumeFan.value.endTime = formatTime(getTime.value[1])
}
} else {
beanConsumeFan.value.startTime = ''
beanConsumeFan.value.endTime = ''
beanConsumeFan.value.startTime = ''
beanConsumeFan.value.endTime = ''
}
beanConsumeFan.value.sortField = sortField.value
beanConsumeFan.value.sortOrder = sortOrder.value
beanConsumeFan.value.sortField = sortField.value
beanConsumeFan.value.sortOrder = sortOrder.value
console.log('搜索参数_时间', beanConsumeFan.value.startTime)
console.log('搜索参数_时间', beanConsumeFan.value.startTime)
console.log('搜索参数1', getObj.value)
console.log('搜索参数2', beanConsumeFan.value)
console.log('搜索参数2', beanConsumeFan.value)
// POST
const result = await request({
@ -173,8 +176,8 @@ const ConsumeSelectBy = async function (val) {
data: {
pageNum: getObj.value.pageNum,
pageSize: getObj.value.pageSize,
beanConsumeFan: {
... beanConsumeFan.value,
beanConsumeFan: {
...beanConsumeFan.value,
jwcode: beanConsumeFan.value.jwcode ? String(beanConsumeFan.value.jwcode) : '',
dept: beanConsumeFan.value.dept || '',
channel: beanConsumeFan.value.channel || '',
@ -187,7 +190,7 @@ const ConsumeSelectBy = async function (val) {
})
console.log('请求成功3', sortField)
console.log('接口响应结果',result);
console.log('接口响应结果', result);
if (result.code === 200 && result.data && result.data.list) {
tableData.value = result.data.list;
total.value = result.data.total;
@ -198,7 +201,7 @@ const ConsumeSelectBy = async function (val) {
const sumConsumeParams = {
payType: 7, // payType 7
beanConsumeFan: {
... beanConsumeFan.value,
...beanConsumeFan.value,
}
};
@ -212,11 +215,11 @@ const ConsumeSelectBy = async function (val) {
const data = resultTotalGold.data || resultTotalGold;
console.log('请求成功2', resultTotalGold.data)
console.log('permanentBean2',data.permanentBean)
// permanentBeanfreeBeantotalNum
permanentBean.value = Number(data.permanentBean) || 0;
freeBean.value = Number(data.freeBean) || 0;
totalNum.value = Number(data.totalNum) || 0;
console.log('permanentBean2', data.permanentBean)
// permanentBeanfreeBeantotalNum
permanentBean.value = Number(data.permanentBean) || 0;
freeBean.value = Number(data.freeBean) || 0;
totalNum.value = Number(data.totalNum) || 0;
//
total.value = result.data.total
@ -228,14 +231,14 @@ const ConsumeSelectBy = async function (val) {
//
const search = function () {
getObj.value.pageNum = 1
if(beanConsumeFan.value.jwcode){
const numRef = /^\d{1,9}$/;
if(!numRef.test(beanConsumeFan.value.jwcode)){
ElMessage.error('请检查精网号格式')
return
}
if (beanConsumeFan.value.jwcode) {
const numRef = /^\d{1,9}$/;
if (!numRef.test(beanConsumeFan.value.jwcode)) {
ElMessage.error('请检查精网号格式')
return
}
ConsumeSelectBy()
}
ConsumeSelectBy()
}
//
const reset = function () {
@ -243,16 +246,16 @@ const reset = function () {
beanConsumeFan.value.jwcode = null
beanConsumeFan.value.type = ''
beanConsumeFan.value.gift = ''
beanConsumeFan.value.channel = ''
beanConsumeFan.value.liveRoom = ''
beanConsumeFan.value.type = ''
beanConsumeFan.value.gift = ''
beanConsumeFan.value.channel = ''
beanConsumeFan.value.liveRoom = ''
beanConsumeFan.value.dept = ''
beanConsumeFan.value.dept = ''
beanConsumeFan.value.startTime = ''
beanConsumeFan.value.startTime = ''
beanConsumeFan.value.endTime = ''
beanConsumeFan.value.endTime = ''
@ -263,14 +266,14 @@ const reset = function () {
//
ConsumeSelectBy()
console.log(' beanConsumeFan', beanConsumeFan.value)
ConsumeSelectBy()
console.log(' beanConsumeFan', beanConsumeFan.value)
}
//
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.endOf('day').format('YYYY-MM-DD HH:mm:ss')
getTime.value = [startTime, endTime]
console.log('getTime', getTime.value)
activeTimeRange.value = 'today' //
@ -309,7 +312,7 @@ const getDept = async function () {
// url: '/general/dept',
url: '/beanConsume/getDept', // todo
data: {account:adminData.value.account}
data: { account: adminData.value.account }
})
console.log('请求地区列表成功', result)
//
@ -332,9 +335,9 @@ const handleSortChange = (column) => {
sortField.value = 'beanNum'
} else if (column.prop === 'consumeTime') {
sortField.value = 'consumeTime'
} else if(column.prop === 'buyBean') {
} else if (column.prop === 'buyBean') {
sortField.value = 'buyBean'
} else if(column.prop === 'freeBean') {
} else if (column.prop === 'freeBean') {
sortField.value = 'freeBean'
}
sortOrder.value = column.order === 'ascending' ? 'DESC' : 'ASC'
@ -377,12 +380,12 @@ onMounted(async function () {
const exportExcel = async function () {
const params = { //
...getObj.value,
"beanConsumeFan": {
...beanConsumeFan.value,
sortField: sortField.value,
sortOrder: sortOrder.value,
},
...getObj.value,
"beanConsumeFan": {
...beanConsumeFan.value,
sortField: sortField.value,
sortOrder: sortOrder.value,
},
}
const res = await API({ url: '/export/exportFan', data: params })
if (res.code === 200) {
@ -465,80 +468,45 @@ const getTagText = (state) => {
</script>
<template>
<el-row>
<el-col>
<el-card style="margin-bottom: 20px;margin-top:10px">
<el-row style="margin-bottom: 10px">
<el-col :span="4">
<div class="head-card-element">
<el-text class="mx-1">精网号</el-text>
<el-input v-model="beanConsumeFan.jwcode" placeholder="请输入精网号" style="width: 150px" clearable />
</div>
</el-col>
<el-col :span="4">
<div class="head-card-element">
<el-text class="mx-1">地区</el-text>
<el-select v-model="beanConsumeFan.dept" placeholder="请选择地区" style="width: 150px" clearable>
<el-option v-for="(item, index) in dept" :key="index" :label="item" :value="item" />
</el-select>
</div>
</el-col>
<el-col :span="5">
<div class="head-card-element">
<el-text class="mx-1">频道</el-text>
<el-select
v-model="beanConsumeFan.channel"
placeholder="请选择频道"
style="width: 180px"
clearable
filterable
allow-create
default-first-option
>
<el-option v-for="(item, index) in channels" :key="index" :label="item" :value="item" />
</el-select>
</div>
</el-col>
</el-row>
<el-row>
<el-col :span="24">
<div class="head-card-element">
<el-text class="mx-1">消费时间</el-text>
<el-date-picker
v-model="getTime"
type="datetimerange"
range-separator="至"
start-placeholder="起始时间"
end-placeholder="结束时间"
style="width: 400px"
@change="handleDatePickerChange"
value-format="YYYY-MM-DD HH:mm:ss"
:default-time="defaultTime"
/>
<el-button @click="getToday()" style="margin-left: 10px" :type="activeTimeRange === 'today' ? 'primary' : ''"></el-button>
<el-button @click="getYesterday()" style="margin-left: 10px" :type="activeTimeRange === 'yesterday' ? 'primary' : ''"></el-button>
<el-button @click="get7Days()" style="margin-left: 10px" :type="activeTimeRange === '7days' ? 'primary' : ''">近7天</el-button>
<el-button type="success" @click="reset()">重置</el-button>
<el-button type="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-row>
</el-card>
<el-card style="margin-bottom: 20px;margin-top:10px">
<el-col style="margin-bottom: 10px">
<el-text>精网号</el-text>
<el-input v-model="beanConsumeFan.jwcode" placeholder="请输入精网号" style="width: 200px;margin-right: 20px"
clearable />
<el-text>地区</el-text>
<el-select v-model="beanConsumeFan.dept" placeholder="请选择地区" style="width: 200px;margin-right: 20px" clearable>
<el-option v-for="(item, index) in dept" :key="index" :label="item" :value="item" />
</el-select>
<el-text>频道</el-text>
<el-select v-model="beanConsumeFan.channel" placeholder="请选择频道" style="width: 200px" clearable filterable allow-create>
<el-option v-for="(item, index) in channels" :key="index" :label="item" :value="item" />
</el-select>
</el-col>
</el-row>
<el-row>
<el-col>
<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"
value-format="YYYY-MM-DD HH:mm:ss" :default-time="defaultTime" />
<el-button @click="getToday()" :type="activeTimeRange === 'today' ? '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 type="success" @click="reset()">重置</el-button>
<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>
</el-card>
<el-card>
<div>
金豆总数{{ Math.abs(permanentBean+freeBean) }}付费金豆数{{ Math.abs(permanentBean) }}免费金豆数{{
Math.abs(freeBean)
}}
金豆总数{{ format3(Math.abs(permanentBean + freeBean)) }}&nbsp;&nbsp;&nbsp;&nbsp;
付费金豆数{{ format3(Math.abs(permanentBean)) }}&nbsp;&nbsp;&nbsp;&nbsp;
免费金豆数{{ format3(Math.abs(freeBean)) }}
</div>
<!-- 设置表格容器的高度和滚动样式 -->
<div style="height: 576px; overflow-y: auto">
<el-table :data="tableData" style="width: 100%" height="576px" @sort-change="handleSortChange">
<div style="overflow-y: auto">
<el-table :data="tableData" style="width: 100%" height="550px" @sort-change="handleSortChange">
<el-table-column type="index" label="序号" width="80px" fixed="left">
<template #default="scope">
<span>{{
@ -551,18 +519,16 @@ const getTagText = (state) => {
<!-- 固定精网号列 -->
<el-table-column prop="jwcode" label="精网号" width="110px" fixed="left" />
<el-table-column prop="dept" label="地区" width="110px" />
<el-table-column prop="beanNum" label="金豆数量" sortable="custom" width="120px"/>
<el-table-column prop="buyBean" label="付费金豆数" sortable="custom" width="120px"/>
<el-table-column prop="freeBean" label="免费金豆数" sortable="custom" width="120px"/>
<el-table-column prop="beanNum" label="金豆数量" sortable="custom" width="120px" />
<el-table-column prop="buyBean" label="付费金豆数" sortable="custom" width="120px" />
<el-table-column prop="freeBean" label="免费金豆数" sortable="custom" width="120px" />
<el-table-column prop="channel" label="频道" width="190px" />
<el-table-column prop="type" label="会员类型" width="120px" >
<el-table-column prop="type" label="会员类型" width="120px">
<template #default="scope">
{{ consumeTypes.find(item => item.value === Number(scope.row.type))?.label || '未知类型' }}
{{consumeTypes.find(item => item.value === Number(scope.row.type))?.label || '未知类型'}}
</template>
</el-table-column>
<!-- <el-table-column prop="joinMethod" label="加入方式" width="120px" /> -->
<el-table-column prop="consumeTime" label="加入时间" sortable="custom" width="180px" />
<!-- <el-table-column prop="consumeTime" label="到期时间" width="180px" /> -->
</el-table>
</div>
@ -573,12 +539,10 @@ const getTagText = (state) => {
@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 :data="exportList" style="width: 100% ;height: 60vh;" :loading="exportListLoading">
<el-table-column prop="fileName" label="文件名" />
<el-table-column prop="state" label="状态">
<template #default="scope">
@ -610,22 +574,6 @@ const getTagText = (state) => {
</template>
<style scoped>
.status {
display: flex;
}
.head-card {
display: flex;
}
.head-card-element {
margin-right: 20px;
}
.head-card-btn {
margin-left: auto;
}
.pagination {
display: flex;
margin-top: 20px;

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

@ -11,8 +11,12 @@ import moment from 'moment'
*/
const defaultTime = [
new Date(2000, 1, 1, 0, 0, 0),
new Date(2000, 2, 1,23 , 59, 59),
new Date(2000, 2, 1, 23, 59, 59),
]
const format3 = (num) => {
//
return num.toLocaleString('en-US')
}
//
const formatTime = (val) => val ? dayjs(val).format('YYYY-MM-DD HH:mm:ss') : ''
@ -45,7 +49,7 @@ const getGift = async function () {
try {
const result = await request({
url: '/beanConsume/getLiveGift', // todo
data: {account:adminData.value.account}
data: { account: adminData.value.account }
})
console.log('请求礼物列表成功', result)
//
@ -67,7 +71,7 @@ const getChannel = async function () {
try {
const result = await request({
url: '/beanConsume/getLiveChannel', // todo
data: {account:adminData.value.account}
data: { account: adminData.value.account }
})
console.log('请求频道列表成功', result)
//
@ -93,7 +97,7 @@ const consumeTypes = ref([
])
//
const handleTypeChange = (value) => {
if (value !== 1) {
if (value !== 1) {
beanConsumeLive.value.gift = ''
}
}
@ -132,7 +136,7 @@ const getDept = async function () {
// url: '/general/dept',
url: '/beanConsume/getDept', // todo
data: {account:adminData.value.account}
data: { account: adminData.value.account }
})
console.log('请求地区列表成功', result)
//
@ -196,9 +200,9 @@ const selectLiveBy = async function (val) {
beanConsumeLive.value.sortField = sortField.value
beanConsumeLive.value.sortOrder = sortOrder.value
console.log('搜索参数_时间', beanConsumeLive.value.startTime)
console.log('搜索参数_时间', beanConsumeLive.value.startTime)
console.log('搜索参数1', getObj.value)
console.log('搜索参数2', beanConsumeLive.value)
console.log('搜索参数2', beanConsumeLive.value)
// POST
const result = await request({
@ -225,12 +229,12 @@ const selectLiveBy = async function (val) {
})
console.log('请求成功2', sortField)
console.log('接口响应结果', result); //
if (result.code === 200 && result.data && result.data.list) {
console.log('接口响应结果', result); //
if (result.code === 200 && result.data && result.data.list) {
tableData.value = result.data.list;
total.value = result.data.total;
}
// beanConsumeLive.value payType 1
// beanConsumeLive.value payType 1
const sumConsumeParams = {
payType: 1, // payType 1
beanConsumeLive: {
@ -249,11 +253,11 @@ const selectLiveBy = async function (val) {
const data = resultTotalGold.data || resultTotalGold;
console.log('请求成功1', resultTotalGold.data) //undifined
console.log('permanentBean1',data.permanentBean)
// permanentBeanfreeBeantotalNum
permanentBean.value = Number(data.permanentBean) || 0;
freeBean.value = Number(data.freeBean) || 0;
totalNum.value = Number(data.totalNum) || 0;
console.log('permanentBean1', data.permanentBean)
// permanentBeanfreeBeantotalNum
permanentBean.value = Number(data.permanentBean) || 0;
freeBean.value = Number(data.freeBean) || 0;
totalNum.value = Number(data.totalNum) || 0;
@ -267,27 +271,27 @@ const selectLiveBy = async function (val) {
//
const search = function () {
getObj.value.pageNum = 1
if(beanConsumeLive.value.jwcode){
const numRef = /^\d{1,9}$/;
if(!numRef.test(beanConsumeLive.value.jwcode)){
ElMessage.error('请检查精网号格式')
return
}
if (beanConsumeLive.value.jwcode) {
const numRef = /^\d{1,9}$/;
if (!numRef.test(beanConsumeLive.value.jwcode)) {
ElMessage.error('请检查精网号格式')
return
}
selectLiveBy()
}
selectLiveBy()
}
//
const reset = function () {
console.log('直播的重置')
beanConsumeLive.value.jwcode = null
beanConsumeLive.value.type = ''
beanConsumeLive.value.gift = ''
beanConsumeLive.value.liveChannel = ''
beanConsumeLive.value.liveName = ''
beanConsumeLive.value.dept = ''
beanConsumeLive.value.startTime = ''
beanConsumeLive.value.endTime = ''
beanConsumeLive.value.type = ''
beanConsumeLive.value.gift = ''
beanConsumeLive.value.liveChannel = ''
beanConsumeLive.value.liveName = ''
beanConsumeLive.value.dept = ''
beanConsumeLive.value.startTime = ''
beanConsumeLive.value.endTime = ''
sortField.value = ''
sortOrder.value = ''
getTime.value = {}
@ -296,18 +300,18 @@ const reset = function () {
//
selectLiveBy()
console.log(' beanConsumeLive', beanConsumeLive.value)
console.log(' beanConsumeLive', beanConsumeLive.value)
}
//
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.endOf('day').format('YYYY-MM-DD HH:mm:ss')
getTime.value = [startTime, endTime]
console.log('getTime', getTime.value)
activeTimeRange.value = 'today' //
selectLiveBy()
selectLiveBy()
}
//
const getYesterday = function () {
@ -318,7 +322,7 @@ const getYesterday = function () {
console.log('getTime', getTime.value)
activeTimeRange.value = 'yesterday' //
selectLiveBy()
selectLiveBy()
}
// 7
const get7Days = function () {
@ -343,9 +347,9 @@ const handleSortChange = (column) => {
sortField.value = 'beanNum'
} else if (column.prop === 'consumeTime') {
sortField.value = 'consumeTime'
} else if(column.prop === 'buyBean') {
} else if (column.prop === 'buyBean') {
sortField.value = 'buyBean'
} else if(column.prop === 'freeBean') {
} else if (column.prop === 'freeBean') {
sortField.value = 'freeBean'
}
sortOrder.value = column.order === 'ascending' ? 'DESC' : 'ASC'
@ -498,101 +502,58 @@ const getTagText = (state) => {
</script>
<template>
<el-row>
<el-col>
<el-card style="margin-bottom: 20px;margin-top:10px">
<el-row style="margin-bottom: 10px">
<el-col :span="4">
<div class="head-card-element">
<el-text class="mx-1">精网号</el-text>
<el-input v-model="beanConsumeLive.jwcode" placeholder="请输入精网号" style="width: 140px" clearable />
</div>
</el-col>
<el-col :span="4">
<div class="head-card-element">
<el-text class="mx-1">地区</el-text>
<el-select v-model="beanConsumeLive.dept" placeholder="请选择地区" style="width: 140px" clearable>
<el-option v-for="(item, index) in dept" :key="index" :label="item" :value="item" />
</el-select>
</div>
</el-col>
<!-- <el-col :span="4">
<div class="head-card-element">
<el-text class="mx-1">类型</el-text>
<el-select v-model="beanConsumeLive.type" placeholder="请选择类型" style="width: 140px" clearable @change="handleTypeChange">
<el-option v-for="(item, index) in consumeTypes" :key="index" :label="item.label" :value="item.value" />
</el-select>
</div>
</el-col> -->
<el-col :span="4" >
<div class="head-card-element">
<el-text class="mx-1">礼物名称</el-text>
<el-select v-model="beanConsumeLive.gift" placeholder="请选择礼物名称" style="width: 140px" clearable
filterable
allow-create
default-first-option
>
<el-option v-for="(item, index) in gifts" :key="index" :label="item" :value="item" />
</el-select>
</div>
</el-col>
<el-col :span="4">
<div class="head-card-element">
<el-text class="mx-1">频道</el-text>
<el-select
v-model="beanConsumeLive.liveChannel"
placeholder="请选择频道"
style="width: 150px"
clearable
filterable
allow-create
default-first-option
>
<el-option v-for="(item, index) in channels" :key="index" :label="item" :value="item" />
</el-select>
</div>
</el-col>
<el-col :span="4">
<div class="head-card-element">
<el-text class="mx-1">直播间</el-text>
<el-input v-model="beanConsumeLive.liveName" placeholder="请输入直播间" style="width: 150px" clearable />
</div>
</el-col>
</el-row>
<el-row>
<el-col :span="24">
<div class="head-card-element">
<el-text class="mx-1" >消费时间</el-text>
<el-date-picker v-model="getTime" type="datetimerange" range-separator="" start-placeholder="起始时间"
end-placeholder="结束时间" style="width: 400px" @change="handleDatePickerChange" :default-time="defaultTime"/>
<el-button @click="getToday()" style="margin-left: 10px"
:type="activeTimeRange === 'today' ? 'primary' : ''"> </el-button>
<el-button @click="getYesterday()" style="margin-left: 10px"
:type="activeTimeRange === 'yesterday' ? 'primary' : ''"> </el-button>
<el-button @click="get7Days()" style="margin-left: 10px"
:type="activeTimeRange === '7days' ? 'primary' : ''"> 近7天</el-button>
<el-button type="success" @click="reset()">重置</el-button>
<el-button type="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-row>
</el-card>
<el-card style="margin-bottom: 20px;margin-top:10px">
<el-col style="margin-bottom: 10px">
<el-text>精网号</el-text>
<el-input v-model="beanConsumeLive.jwcode" placeholder="请输入精网号" style="width: 200px;margin-right: 20px"
clearable />
<el-text>地区</el-text>
<el-select v-model="beanConsumeLive.dept" placeholder="请选择地区" style="width: 200px;margin-right: 20px" clearable>
<el-option v-for="(item, index) in dept" :key="index" :label="item" :value="item" />
</el-select>
<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-option v-for="(item, index) in gifts" :key="index" :label="item" :value="item" />
</el-select>
<el-text>频道</el-text>
<el-select v-model="beanConsumeLive.liveChannel" placeholder="请选择频道" style="width: 200px;margin-right: 20px"
clearable filterable allow-create default-first-option>
<el-option v-for="(item, index) in channels" :key="index" :label="item" :value="item" />
</el-select>
<el-text>直播间</el-text>
<el-input v-model="beanConsumeLive.liveName" placeholder="请输入直播间" style="width: 200px;margin-right: 20px"
clearable />
</el-col>
</el-row>
<el-row>
<el-col>
<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"
:default-time="defaultTime" />
<el-button @click="getToday()" :type="activeTimeRange === 'today' ? '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 type="success" @click="reset()">重置</el-button>
<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>
</el-card>
<el-card>
<div>
金豆总数{{ Math.abs(permanentBean+freeBean) }}付费金豆数{{ Math.abs(permanentBean) }}免费金豆数{{
Math.abs(freeBean)
}}
金豆总数{{ format3(Math.abs(permanentBean + freeBean)) }}&nbsp;&nbsp;&nbsp;&nbsp;
付费金豆数{{ format3(Math.abs(permanentBean)) }}&nbsp;&nbsp;&nbsp;&nbsp;
免费金豆数{{ format3(Math.abs(freeBean)) }}
</div>
<!-- 设置表格容器的高度和滚动样式 -->
<div style="height: 576px; overflow-y: auto">
<el-table :data="tableData" style="width: 100%" height="576px" @sort-change="handleSortChange">
<div style="overflow-y: auto">
<el-table :data="tableData" style="width: 100%" height="550px" @sort-change="handleSortChange">
<el-table-column type="index" label="序号" width="80px" fixed="left">
<template #default="scope">
<span>{{
@ -605,36 +566,29 @@ const getTagText = (state) => {
<!-- 固定精网号列 -->
<el-table-column prop="jwcode" label="精网号" width="110px" fixed="left" />
<el-table-column prop="dept" label="地区" width="110px" />
<el-table-column prop="gift" label="礼物" width="140px" >
<el-table-column prop="gift" label="礼物" width="140px">
</el-table-column>
<el-table-column prop="beanNum" label="金豆数量" sortable="custom" width="120px"/>
<el-table-column prop="beanNum" label="金豆数量" sortable="custom" width="120px" />
<el-table-column prop="isBackpack" label="背包礼物" width="120px">
<template #default="scope">
{{ scope.row.isBackpack == 1 ? '是' : '否' }}
</template>
</el-table-column>
<el-table-column prop="buyBean" label="付费金豆数" sortable="custom" width="120px"/>
<el-table-column prop="freeBean" label="免费金豆数" sortable="custom" width="120px"/>
<el-table-column prop="liveChannel" label="频道" width="180px" />
<el-table-column prop="buyBean" label="付费金豆数" sortable="custom" width="120px" />
<el-table-column prop="freeBean" label="免费金豆数" sortable="custom" width="120px" />
<el-table-column prop="liveChannel" label="频道" width="120px" />
<el-table-column prop="liveName" label="直播间名称" width="160px" show-overflow-tooltip />
<el-table-column prop="consumeTime" label="消费时间" sortable="custom" width="180px" />
</el-table>
</div>
<!-- 分页 -->
<div class="pagination">
<el-pagination background :page-size="getObj.pageSize" :page-sizes="[5, 10, 20, 50, 100]"
<el-pagination background :page-size="getObj.pageSize" :page-sizes="[5, 10, 20, 50, 100]" style="margin-top: 20px;"
layout="total, sizes, prev, pager, next, jumper" :total="total" @size-change="handlePageSizeChange"
@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 :data="exportList" style="width: 100% ;height: 60vh;" :loading="exportListLoading">
<el-table-column prop="fileName" label="文件名" />
<el-table-column prop="state" label="状态">
<template #default="scope">
@ -666,22 +620,6 @@ const getTagText = (state) => {
</template>
<style scoped>
.status {
display: flex;
}
.head-card {
display: flex;
}
.head-card-element {
margin-right: 20px;
}
.head-card-btn {
margin-left: auto;
}
.pagination {
display: flex;
margin-top: 20px;

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

@ -1,12 +1,8 @@
<script setup>
import {onMounted, reactive, ref, watch} from "vue";
import {ElMessage, ElMessageBox} from "element-plus";
import { onMounted, reactive, ref, watch } from "vue";
import { ElMessage, ElMessageBox } from "element-plus";
import moment from "moment";
import request from "@/util/http.js";
/*
====================工具方法==============================
*/
import request from "@/util/http.js"
//
const trimJwCode = () => {
if (addConsume.value.jwcode) {
@ -65,10 +61,10 @@ const Ref = ref(null);
//
const rules = reactive({
jwcode: [
{required: true, message: "请输入精网号", trigger: "blur"},
{ required: true, message: "请输入精网号", trigger: "blur" },
// { type: 'number', message: "", trigger: "blur" }
],
goodsName: [{required: true, message: "请选择商品", trigger: "blur"}],
goodsName: [{ required: true, message: "请选择商品", trigger: "blur" }],
sumGold: [
{ required: true, message: "消耗金币总数不能为空", trigger: "blur" },
{
@ -144,7 +140,7 @@ function validateInput() {
return false;
}
// 2 6
// 2 6
if (addConsume.value.sumGold) {
const sumGoldStr = addConsume.value.sumGold.toString();
@ -198,10 +194,10 @@ function calculateCoins(sumGold) {
console.log("消耗金币计算函数:计算金币", sumGold);
const parsedSumGold = parseFloat(sumGold);
if (isNaN(parsedSumGold) || parsedSumGold <= 0 || !user.value.jwcode) {
return {free: 0, permanent: 0, task: 0};
return { free: 0, permanent: 0, task: 0 };
}
const {nowFreeGold, nowPermanentGold, nowTaskGold} = user.value;
const { nowFreeGold, nowPermanentGold, nowTaskGold } = user.value;
let remaining = parsedSumGold;
let freeUsed = 0, permanentUsed = 0, taskUsed = 0;
@ -227,7 +223,7 @@ function calculateCoins(sumGold) {
addConsume.value.permanentGold = permanentUsed;
addConsume.value.taskGold = taskUsed;
return {free: freeUsed, permanent: permanentUsed, task: taskUsed};
return { free: freeUsed, permanent: permanentUsed, task: taskUsed };
}
//
@ -323,15 +319,15 @@ const addBefore = () => {
Ref.value.validate(async (valid) => {
if (valid) {
ElMessageBox.confirm("确认添加?")
.then(() => {
console.log("这里是jwcode", addConsume.value.jwcode)
add();
console.log("添加成功",);
addConsume.value = {};
})
.catch(() => {
console.log("取消添加");
});
.then(() => {
console.log("这里是jwcode", addConsume.value.jwcode)
add();
console.log("添加成功",);
addConsume.value = {};
})
.catch(() => {
console.log("取消添加");
});
} else {
//
ElMessage({
@ -387,7 +383,7 @@ const getUser = async function (jwcode) {
if (addConsume.value.sumGold) {
const parsedSumGold = parseFloat(addConsume.value.sumGold);
if (!isNaN(parsedSumGold) && parsedSumGold > 0) {
const {free, permanent, task} = calculateCoins(parsedSumGold);
const { free, permanent, task } = calculateCoins(parsedSumGold);
addConsume.value.freeGold = free;
addConsume.value.permanentGold = permanent;
addConsume.value.taskGold = task;
@ -439,20 +435,20 @@ const getGoods = async function () {
//
watch(
() => addConsume.value.sumGold,
(newValue) => {
const parsedNewValue = parseFloat(newValue);
if (!isNaN(parsedNewValue) && parsedNewValue > 0) {
const {free, permanent, task} = calculateCoins(parsedNewValue);
addConsume.value.freeGold = free;
addConsume.value.permanentGold = permanent;
addConsume.value.taskGold = task;
} else {
addConsume.value.freeGold = null;
addConsume.value.permanentGold = null;
addConsume.value.taskGold = null;
}
() => addConsume.value.sumGold,
(newValue) => {
const parsedNewValue = parseFloat(newValue);
if (!isNaN(parsedNewValue) && parsedNewValue > 0) {
const { free, permanent, task } = calculateCoins(parsedNewValue);
addConsume.value.freeGold = free;
addConsume.value.permanentGold = permanent;
addConsume.value.taskGold = task;
} else {
addConsume.value.freeGold = null;
addConsume.value.permanentGold = null;
addConsume.value.taskGold = null;
}
}
);
/*
@ -467,128 +463,64 @@ onMounted(async function () {
</script>
<template>
<div>
<!-- 根据activeTab切换显示内容 -->
<!-- 新增消耗的布局---------------------------------------------------------- -->
<!-- <div v-if="activeTab === 'addConsume'"> -->
<!-- <div style="margin-bottom: 20px; font-weight: bolder">新增消费</div> -->
<el-form
:model="addConsume"
ref="Ref"
:rules="rules"
label-width="auto"
style="max-width: 750px;"
class="form-style"
>
<el-form-item prop="jwcode" label="精网号">
<el-input
v-model="addConsume.jwcode"
style="width: 220px"
/>
<el-button
type="primary"
@click="getUser(addConsume.jwcode)"
style="margin-left: 20px"
>查询
</el-button
>
<el-form :model="addConsume" ref="Ref" :rules="rules" style="max-width: 750px;">
<div style="width:25vw">
<el-form-item prop="jwcode" label="精网号" style="margin-top: 50px">
<el-input v-model="addConsume.jwcode" style="width: 10vw;margin-left:45px" />
<el-button type="primary" @click="getUser(addConsume.jwcode)" style="margin-left: 10px">查询
</el-button>
</el-form-item>
<div style="display: flex; align-items: center; gap: 20px;">
</div>
<div style="width:25vw">
<el-form-item prop="goodsName" label="商品名称" style="flex: 1; margin-right: 0px">
<el-select
v-model="addConsume.goodsName"
placeholder="请选择商品"
style="width: 450px"
>
<el-option
v-for="item in goods"
:key="item.value"
:label="item.label"
:value="item.value"
/>
<el-select v-model="addConsume.goodsName" placeholder="请选择商品" style="width: 10vw;margin-left:30px">
<el-option v-for="item in goods" :key="item.value" :label="item.label" :value="item.value" />
</el-select>
</el-form-item>
</div>
<el-form-item prop="sumGold" label="消耗金币总数">
<el-input
v-model="addConsume.sumGold"
style="width: 100px"
@input="validateInput()"
@change="calculateCoins(addConsume.sumGold)"
/>
</el-form-item>
<div style="width:25vw">
<el-form-item prop="sumGold" label="消耗金币总数">
<el-input v-model="addConsume.sumGold" style="width: 10vw;margin-left:2px" @input="validateInput()"
@change="calculateCoins(addConsume.sumGold)" />
</el-form-item>
</div>
<!-- 三类金币自动计算禁用状态不可编辑 -->
<div style="display: flex; align-items: center">
<el-form-item prop="permanentGold" label="永久金币" style="float: left">
<el-input
v-model="addConsume.permanentGold"
disabled
style="width: 100px; margin-left: -5px"
>
<div style="width:25vw">
<el-form-item prop="permanentGold" label="永久金币">
<el-input v-model="addConsume.permanentGold" disabled style="width: 10vw;margin-left:40px">
<template #default="scope">{{ scope.row.permanentGold }}</template>
</el-input>
<p style="margin-right: 0px"></p>
<p style="margin-right: 0px">&nbsp;&nbsp;</p>
</el-form-item>
<el-form-item
prop="freeCoin"
label="免费金币"
style="float: left; margin-left: -20px"
>
<el-input
disabled
v-model="addConsume.freeGold"
style="width: 100px; margin-left: -5px"
/>
<p style="margin-right: 0px"></p>
</div>
<div style="width:25vw">
<el-form-item prop="freeCoin" label="免费金币">
<el-input disabled v-model="addConsume.freeGold" style="width: 10vw;margin-left:40px" />
<p style="margin-right: 0px">&nbsp;&nbsp;</p>
</el-form-item>
<el-form-item prop="taskGold" label="任务金币" style="margin-left: -20px">
<el-input
disabled
v-model="addConsume.taskGold"
style="width: 100px; margin-left: -5px"
/>
<p style="margin-right: 20px"></p>
</div>
<div style="width:25vw">
<el-form-item prop="taskGold" label="任务金币">
<el-input disabled v-model="addConsume.taskGold" style="width: 10vw;margin-left:40px" />
<p style="margin-right: 20px">&nbsp;&nbsp;</p>
</el-form-item>
</div>
<el-form-item prop="remark" label="备注">
<el-input
v-model="addConsume.remark"
style="width: 300px"
:rows="2"
maxlength="100"
show-word-limit
type="textarea"
/>
</el-form-item>
<el-button type="success" @click="resetForm()" style="margin-left: 280px">重置</el-button>
<el-button type="primary" @click="addBefore"> 提交</el-button>
<div style="width:25vw">
<el-form-item prop="remark" label="备注">
<el-input v-model="addConsume.remark" style="width: 13.5vw;margin-left:70px" :rows="4" maxlength="100" show-word-limit
type="textarea" />
</el-form-item>
</div>
<el-button type="success" @click="resetForm()" style="margin-left: 200px;margin-top:10px">重置</el-button>
<el-button type="primary" @click="addBefore" style="margin-top:10px"> 提交</el-button>
</el-form>
<!-- 客户信息栏 -->
<el-card v-if="user.jwcode" style="width: 800px; float: right" class="customer-info">
<el-form
:model="user"
label-width="auto"
style="max-width: 1000px"
label-position="left"
>
<el-form :model="user" label-width="auto" style="max-width: 1000px" label-position="left">
<el-text size="large" style="margin-left: 20px">客户信息</el-text>
<!-- 第一行姓名 + 历史金币 -->
@ -602,19 +534,17 @@ onMounted(async function () {
<el-form-item label="历史金币总数">
<!-- 检查 user.historySumGold 是否为有效的数字 -->
<p style="color: #2fa1ff; margin-right: 5px" v-if="!isNaN(Number(user.historySumGold))">
{{ Number(user.historySumGold ) }}
{{ Number(user.historySumGold) }}
</p>
<!-- 如果不是有效的数字显示默认值 -->
<p v-else></p>
</el-form-item>
<el-form-item style="margin-top: -23px">
<span
style="display: inline; white-space: nowrap; color: #b1b1b1"
v-if="user.historyPermanentGold !== undefined"
>(永久金币:{{ user.historyPermanentGold }};免费金币:{{
(user.historyFreeGold)
}};任务金币:{{ user.historyTaskGold }})</span>
<span style="display: inline; white-space: nowrap; color: #b1b1b1"
v-if="user.historyPermanentGold !== undefined">(永久金币:{{ user.historyPermanentGold }};免费金币:{{
(user.historyFreeGold)
}};任务金币:{{ user.historyTaskGold }})</span>
</el-form-item>
</el-col>
</el-row>
@ -628,19 +558,15 @@ onMounted(async function () {
</el-col>
<el-col :span="14">
<el-form-item label="当前金币总数" style="width: 500px">
<span
style="color: #2fa1ff; margin-right: 5px"
v-if="user.nowSumGold !== undefined"
>{{ user.nowSumGold }}</span>
<span style="color: #2fa1ff; margin-right: 5px" v-if="user.nowSumGold !== undefined">{{ user.nowSumGold
}}</span>
</el-form-item>
<!-- 金币详情独立显示 -->
<el-form-item style="margin-top: -23px"> <!-- 负边距减少间距 -->
<span
style="color: #b1b1b1; margin-left: 0px"
v-if="user.nowPermanentGold !== undefined"
>(永久金币:{{ user.nowPermanentGold }};
免费金币:{{ user.nowFreeGold }};
任务金币:{{ user.nowTaskGold }})</span>
<el-form-item style="margin-top: -23px"> <!-- 负边距减少间距 -->
<span style="color: #b1b1b1; margin-left: 0px" v-if="user.nowPermanentGold !== undefined">(永久金币:{{
user.nowPermanentGold }};
免费金币:{{ user.nowFreeGold }};
任务金币:{{ user.nowTaskGold }})</span>
</el-form-item>
</el-col>
</el-row>
@ -706,39 +632,4 @@ p {
</style>
<style>
.avatar-uploader .el-upload {
border: 1px dashed var(--el-border-color);
border-radius: 6px;
cursor: pointer;
position: relative;
overflow: hidden;
transition: var(--el-transition-duration-fast);
}
.avatar-uploader .el-upload:hover {
border-color: var(--el-color-primary);
}
.el-icon.avatar-uploader-icon {
font-size: 28px;
color: #8c939d;
width: 50px;
height: 50px;
text-align: center;
}
.form-style {
margin-top: 50px;
max-width: 50%;
float: left;
}
.form-style2 {
max-width: 60%;
}
p {
font-size: 13px;
transform: scale(1);
}
</style>

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

@ -15,6 +15,13 @@ const trimJwCode = () => {
consumeUser.value.jwcode = consumeUser.value.jwcode.replace(/\s/g, '');
}
}
const format3 = (num) => {
if (!num) return '0';
const parts = Number(num).toFixed(2).split('.');
//
parts[0] = parts[0].replace(/\B(?=(\d{3})+(?!\d))/g, ',');
return parts.join('.');
}
//
const formatTime = (val) => val ? dayjs(val).format('YYYY-MM-DD HH:mm:ss') : ''
const defaultTime = [
@ -626,9 +633,10 @@ const getMarket = async function () {
<el-col>
<el-card>
<div>
消耗总金额{{ Math.abs(permanentGolds) / 100 }}新币永久金币{{ Math.abs(permanentGolds) / 100 }}免费金币{{
Math.abs(freeGolds) / 100
}}任务金币{{ Math.abs(taskGolds) / 100 }}
消耗总新币{{ format3(Math.abs(permanentGolds) / 100) }}新币&nbsp;&nbsp;&nbsp;&nbsp;
永久金币{{ format3(Math.abs(permanentGolds) / 100) }}&nbsp;&nbsp;&nbsp;&nbsp;
免费金币{{ format3(Math.abs(freeGolds) / 100) }}&nbsp;&nbsp;&nbsp;&nbsp;
任务金币{{ format3(Math.abs(taskGolds) / 100) }}
</div>
<!-- 设置表格容器的高度和滚动样式 -->
<div style="height: 576px; overflow-y: auto">
@ -664,24 +672,24 @@ const getMarket = async function () {
{{
(scope.row.taskGold +
scope.row.freeGold +
scope.row.permanentGold) / 100
scope.row.permanentGold)
}}
</template>
</el-table-column>
<el-table-column prop="permanentGold" label="永久金币" sortable="“custom”" width="110px">
<template #default="scope">
{{ scope.row.permanentGold / 100 }}
{{ scope.row.permanentGold}}
</template>
</el-table-column>
<el-table-column prop="freeGold" label="免费金币" sortable="“custom”" width="110px">
<template #default="scope">
{{ scope.row.freeGold / 100 }}
{{ scope.row.freeGold }}
</template>
</el-table-column>
<el-table-column prop="taskGold" label="任务金币" sortable="“custom”" width="110px">
<template #default="scope">
{{ scope.row.taskGold / 100 }}
{{ scope.row.taskGold }}
</template>
</el-table-column>

246
src/views/managerecharge/rate.vue

@ -1,43 +1,22 @@
<script setup>
import {onMounted, reactive, ref} from 'vue'
import {ElMessage, ElMessageBox} from 'element-plus'
import { onMounted, reactive, ref } from 'vue'
import { ElMessage, ElMessageBox } from 'element-plus'
import request from '@/util/http'
import {useAdminStore} from "@/store/index.js";
import {storeToRefs} from "pinia";
import {findMenuById, permissionMapping} from "@/utils/menuTreePermission.js"
/*
====================工具方法=========================
*/
import { useAdminStore } from "@/store/index.js";
import { storeToRefs } from "pinia";
import { findMenuById, permissionMapping } from "@/utils/menuTreePermission.js"
const adminStore = useAdminStore()
const { adminData, menuTree } = storeToRefs(adminStore)
/*
====================数据===================================
*/
//
const adminData = ref({
id: '',
adminName: ''
})
//
const regeEdit = ref(false)
// (id )
const editFormRef = ref(null)
//
const tableData = ref([])
//
const getObj = ref({
pageNum: 1,
pageSize: 10
})
const total = ref(0)
//
const rateEdit = ref({
id: null,
rateName: '',
@ -96,41 +75,12 @@ const checkFreeGoldRadio = function (rule, value, callback) {
}
//
const rules = reactive({
// rateName: [{required: true, message: '', trigger: 'blur'}],
num: [{validator: checkFreeGoldRadio, trigger: 'blur'}],
num: [{ validator: checkFreeGoldRadio, trigger: 'blur' }],
})
//
const formSize = ref('default')
/*
====================方法=========================
*/
//
const getAdminData = async function () {
try {
const result = await request({
url: '/admin/userinfo',
data: {}
})
adminData.value = result
rateEdit.value.adminId = adminData.value.id
console.log('请求成功', result)
} catch (error) {
console.log('请求失败', error)
}
}
//
const getAllRate = async function (val) {
try {
//
if (typeof val === 'number') {
getObj.value.pageNum = val;
}
// POST
const result = await request({
url: '/rate/selectAll',
method: 'POST',
@ -138,87 +88,60 @@ const getAllRate = async function (val) {
pageNum: getObj.value.pageNum,
pageSize: getObj.value.pageSize,
}
});
//
console.log('这是汇率列表 请求成功', result);
//
tableData.value = result.data.list;
//
total.value = result.data.total;
})
console.log('这是汇率列表 请求成功', result)
tableData.value = result.data.list
total.value = result.data.total
} catch (error) {
console.log('请求失败', error);
ElMessage.error('请求失败');
}
}
//
const handlePageSizeChange = function (val) {
getObj.value.pageSize = val
getAllRate()
}
//
const handleCurrentChange = function (val) {
getObj.value.pageNum = val
getAllRate()
}
//id
const getEditData = async function (row) {
try {
console.log('搜索参数', getObj.value)
// POST
const result = await request({
url: '/rate/selectById',
data: {id: row.id}
data: { id: row.id }
})
//
console.log('根据id查 请求成功', result)
//
// rateEdit.value = result.data
//
rateEdit.value.id = row.id
rateEdit.value.rateName = row.rateName
rateEdit.value.num = row.num
console.log('根据id获取的数据', rateEdit.value)
rateEdit.value.adminId = adminData.value.id
} catch (error) {
console.log('请求失败', error)
}
}
const adminStore = useAdminStore();
const {menuTree} = storeToRefs(adminStore);
//
const editRate = async function () {
if (findMenuById(menuTree.value, permissionMapping.Exchange_Rate_Modification)) {
//
rateEdit.value.num = parseFloat(rateEdit.value.num);
try {
console.log('搜索参数', rateEdit.value)
// POST
const result = await request({
url: '/rate/update',
data: rateEdit.value
})
//
console.log('请求成功', result)
await getAllRate()
} catch (error) {
console.log('请求失败', error)
}
}else {
} else {
ElMessage.error('没有权限')
}
}
//
const edit = () => {
editFormRef.value.validate(async (valid) => {
@ -236,24 +159,18 @@ const edit = () => {
ElMessage({
type: "error",
message: "请检查输入内容",
});
})
}
});
};
//
})
}
const cancelEdit = () => {
regeEdit.value = false
}
//
const handleEditDialogClose = () => {
if (editFormRef.value) {
getAllRate()
}
}
//
function formatDate(value) {
if (!value) return ''
@ -266,8 +183,6 @@ function formatDate(value) {
const seconds = date.getSeconds().toString().padStart(2, '0')
return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`
}
//
function handleInput(value) {
// 使
@ -275,22 +190,18 @@ function handleInput(value) {
ElMessage.warning('请输入正确的符号');
// value = value.replace('', '.');
}
//
const parts = value.split('.');
if (parts.length > 2) {
value = parts[0] + '.' + parts.slice(1).join('');
ElMessage.warning('只能包含一个小数点');
}
//
if (value.startsWith('-')) {
ElMessage.warning('不允许输入负数');
value = value.substring(1);
}
//
//
if (value.includes('.')) {
const parts = value.split('.')
//
@ -313,7 +224,6 @@ function handleInput(value) {
ElMessage.info('整数部分最多允许六位')
}
}
// 0
if (value.startsWith('.')) {
value = '0' + value;
@ -321,53 +231,29 @@ function handleInput(value) {
// ElMessage.info('0');
}
//
rateEdit.value.num = value;
rateEdit.value.num = value
return value;
return value
}
/*
====================监听=========================
*/
/*
====================挂载=========================
*/
//
onMounted(async function () {
await getAllRate()
await getAdminData()
})
</script>
<template>
<!-- 这是主页面 -->
<el-row>
<el-col>
<el-card class="box-card" style="max-width: 100%">
<!-- 表格 -->
<div>
<el-table
:data="tableData"
v-if="(tableData.flag = 1)"
>
<el-table-column
type="index"
label="序号"
width="100px"
fixed="left"
>
<el-table :data="tableData" v-if="(tableData.flag = 1)">
<el-table-column type="index" label="序号" width="100px" fixed="left">
<template #default="scope">
<span>{{
scope.$index + 1 + (getObj.pageNum - 1) * getObj.pageSize
}}</span>
scope.$index + 1 + (getObj.pageNum - 1) * getObj.pageSize
}}</span>
</template>
</el-table-column>
<el-table-column prop="rateName" label="货币名称" :span="2"/>
<el-table-column prop="rateName" label="货币名称" :span="2" />
<el-table-column prop="num" label="汇率" :span="2">
<template #default="scope">
<p>
@ -383,17 +269,12 @@ onMounted(async function () {
</el-table-column>
<el-table-column label="操作" :span="3">
<template #default="scope">
<el-button
type="text"
@click="
() => {
regeEdit = true
getEditData(scope.row)
}
"
>编辑
</el-button
>
<el-button type="text" @click=" () => {
regeEdit = true
getEditData(scope.row)
}
">编辑
</el-button>
</template>
</el-table-column>
</el-table>
@ -401,54 +282,25 @@ onMounted(async function () {
<!-- 分页 -->
<div class="pagination">
<el-pagination
background
:page-size="getObj.pageSize"
:page-sizes="[5, 10, 20, 50, 100]"
layout="total, sizes, prev, pager, next, jumper"
:total="total"
@size-change="handlePageSizeChange"
@current-change="handleCurrentChange"
></el-pagination>
<el-pagination background :page-size="getObj.pageSize" :page-sizes="[5, 10, 20, 50, 100]"
layout="total, sizes, prev, pager, next, jumper" :total="total" @size-change="handlePageSizeChange"
@current-change="handleCurrentChange"></el-pagination>
</div>
</el-card>
</el-col>
</el-row>
<!-- 这是编辑弹窗 -->
<el-dialog
v-model="regeEdit"
title="修改汇率"
width="500"
:close-on-click-modal="false"
@close="handleEditDialogClose"
>
<el-dialog v-model="regeEdit" title="修改汇率" width="500" :close-on-click-modal="false" @close="handleEditDialogClose">
<template #footer>
<el-form
ref="editFormRef"
style="max-width: 600px"
:model="rateEdit"
:rules="rules"
label-width="auto"
class="demo-ruleForm"
:size="formSize"
status-icon
>
<el-form ref="editFormRef" style="max-width: 600px" :model="rateEdit" :rules="rules" label-width="auto"
class="demo-ruleForm" :size="formSize" status-icon>
<el-form-item prop="rateName" label="货币名称:">
<el-input
v-model="rateEdit.rateName"
disabled
style="width: 240px"
/>
<el-input v-model="rateEdit.rateName" disabled style="width: 240px" />
</el-form-item>
<el-form-item prop="num" label="汇率:">
<el-input
v-model="rateEdit.num"
@update:modelValue="handleInput"
style="width: 120px"
/>
<el-input v-model="rateEdit.num" @update:modelValue="handleInput" style="width: 120px" />
<span class="unit">:1</span>
<span class="rate-tip">
(提示当前规则每
@ -479,30 +331,10 @@ onMounted(async function () {
margin-top: 20px;
}
.button-item {
margin-left: 10px;
}
.add-item {
margin-bottom: 10px;
}
.unit {
margin-left: 10px;
}
.el-card {
padding: 0px;
}
.pagination {
display: flex;
}
.status {
display: flex;
}
.rate-tip {
hyphens: auto;
}

2
src/views/permissions/rolePermission.vue

@ -774,7 +774,7 @@ onMounted(async function () {
</el-select>
</el-form-item>
<el-form-item prop="market" label="所属地区:" required>
<el-select v-model="addRole.market" placeholder="请选择所属地区" style="width: 240px" clearable @change="handleMarketChange" >
<el-select v-model="addRole.market" placeholder="请选择所属地区" style="width: 220px" clearable @change="handleMarketChange" >
<el-option v-for="item in addRoleMarket" :key="item" :label="item" :value="item"/>
</el-select>
</el-form-item>

8
src/views/permissions/userPermission.vue

@ -1050,9 +1050,9 @@ onMounted(async function () {
<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" style="margin-left: 10px;">
<div v-for="(item, index) in addAdmin.machineIds" :key="index">
<el-input v-model="addAdmin.machineIds[index]" placeholder="请输入机器码"
style="width: 180px; margin-right: 10px;"/>
style="width: 220px; margin-right: 10px;"/>
</div>
<el-button type="primary" @click="addMachineIdInput">添加</el-button>
</div>
@ -1127,9 +1127,9 @@ onMounted(async function () {
<el-form-item prop="machineIds" label="机器码:">
<div style="display: flex; align-items: center; flex-wrap: wrap; gap: 10px;">
<!-- 动态添加的机器码输入框 -->
<div v-for="(item, index) in permissionEditObj.machineIds" :key="index" style="margin-left: 10px;">
<div v-for="(item, index) in permissionEditObj.machineIds" :key="index">
<el-input v-model="permissionEditObj.machineIds[index]" placeholder=""
style="width: 180px; margin-right: 10px;"/>
style="width: 220px; margin-right: 10px;"/>
</div>
<el-button type="primary" @click="UseraddMachineIdInput">添加</el-button>
</div>

14
src/views/recharge/addBeanRecharge.vue

@ -70,9 +70,12 @@ const rules = reactive({
}, trigger: 'blur'
}],
permanentBean: [
{ required: true, message: '请输入付费金豆数', trigger: 'blur' },
{ required: true, message: '请输入付费金豆数', trigger: 'change' },
{
validator: (rule, value, callback) => {
if(!value){
value = 0
}
//
if (!/^\d+$/.test(value)) {
callback(new Error('请输入非负整数'));
@ -91,9 +94,12 @@ const rules = reactive({
}
],
freeBean: [
{ required: true, message: '请输入免费金豆数', trigger: 'blur' },
{ required: true, message: '请输入免费金豆数', trigger: 'change' },
{
validator: (rule, value, callback) => {
if(!value){
value = 0
}
//
if (!/^\d+$/.test(value)) {
callback(new Error('请输入非负整数'));
@ -197,10 +203,10 @@ const throttledHandleAddFormt = _.throttle(handleAddForm, 5000, {
<el-button type="primary" @click="getUser(addForm.jwcode)" style="margin-left: 20px">查询</el-button>
</el-form-item>
<el-form-item prop="permanentBean" label="付费金豆" label-position="left">
<el-input v-model="addForm.permanentBean" placeholder="不填默认为0" style="width: 100px" />
<el-input v-model="addForm.permanentBean" placeholder="0" style="width: 100px" />
</el-form-item>
<el-form-item prop="freeBean" label="免费金豆" label-position="left">
<el-input v-model="addForm.freeBean" placeholder="不填默认为0" style="width: 100px" />
<el-input v-model="addForm.freeBean" placeholder="0" style="width: 100px" />
</el-form-item>
<el-form-item prop="remark" label="备注" label-position="left">
<el-input v-model="addForm.remark" style="width: 300px" :rows="5" maxlength="100" show-word-limit

7
src/views/recharge/beanOnlineRecharge.vue

@ -330,6 +330,10 @@ const getTagText = (state) => {
return '未知状态';
}
}
const format3 = (num) => {
//
return num.toLocaleString('en-US')
}
onMounted(async function () {
await get()
await getArea()
@ -405,7 +409,8 @@ onMounted(async function () {
<el-col>
<el-card>
<div class="bean-info">
充值金豆数{{ beanNum }}, 合计新币数{{ money }}
充值金豆数{{ format3(beanNum) }}, 合计新币数{{ format3(money) }}
</div>
<!-- 设置表格容器的高度和滚动样式 -->
<div style="height: 520px; overflow-y: auto;margin-top: 10px;">

10
src/views/recharge/beanSystemRecharge.vue

@ -318,6 +318,10 @@ const getTagText = (state) => {
return '未知状态';
}
}
const format3 = (num) => {
//
return num.toLocaleString('en-US')
}
onMounted(async function () {
await get()
await getArea()
@ -376,9 +380,9 @@ onMounted(async function () {
<el-card>
<div class="bean-info">
<!-- 汉字用 <strong> 加粗动态数据用 <span> 包一层单独改色 -->
金豆总数{{ beanNum }}
, 付费金豆数{{ permanentBeans }}
, 免费金豆数{{ freeBean }}
金豆总数{{ format3(beanNum) }}&nbsp;&nbsp;&nbsp;&nbsp;
付费金豆数{{ format3(permanentBeans) }}&nbsp;&nbsp;&nbsp;&nbsp;
免费金豆数{{ format3(freeBean) }}
</div>
<!-- 设置表格容器的高度和滚动样式 -->
<div style="height: 520px; overflow-y: auto;margin-top: 10px;">

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

@ -63,9 +63,9 @@ const recharge = ref({
activity: '', // activity
voucher: '',
rechargeWay: '客服充值',
freeGold: '',
freeGold: "",
money: null,
permanentGold: '',
permanentGold: "",
rateName: null,
rateId: null,
payModel: '', // payModel
@ -83,6 +83,7 @@ const add = async function () {
if (formattedRecharge.permanentGold) {
formattedRecharge.permanentGold = Number(formattedRecharge.permanentGold) * 100;
}
if (formattedRecharge.freeGold) {
formattedRecharge.freeGold = Number(formattedRecharge.freeGold) * 100;
}
@ -130,22 +131,21 @@ const add = async function () {
//
const addBefore = () => {
if(!recharge.value.permanentGold){
recharge.value.permanentGold ='0'
}
if(!recharge.value.freeGold){
recharge.value.freeGold ='0'
}
Ref.value.validate(async (valid) => {
if (valid) {
// add getUser
//
// try {
// await getUser(recharge.value.jwcode);
// if (!user.value.jwcode) {
// ElMessage.error('');
// return;
// }
// } catch (error) {
// ElMessage.error('');
// return;
// }
if (Number(recharge.value.permanentGold) === 0 && Number(recharge.value.freeGold) === 0) {
ElMessage({
type: 'error',
message: '永久金币和免费金币不能同时为0'
})
return
}
if (recharge.value.rateName == null || recharge.value.rateName == '' || recharge.value.rateName == undefined) {
ElMessage({
@ -203,9 +203,12 @@ const rules = reactive({
}],
activity: [{ required: true, message: '请选择活动名称', trigger: 'blur' }],
permanentGold: [
{ required: true, message: '请输入永久金币数', trigger: 'blur' },
{ required: true, message: '请输入永久金币数', trigger: 'change' },
{
validator: (rule, value, callback) => {
if(!value){
value = '0'
}
//
if (/[^0-9.]/.test(value)) {
callback(new Error('不能包含特殊符号或负数'));
@ -241,9 +244,12 @@ const rules = reactive({
}
],
freeGold: [
{ required: true, message: '请输入免费金币数', trigger: 'blur' },
{ required: true, message: '请输入免费金币数', trigger: 'change' },
{
validator: (rule, value, callback) => {
if(!value){
value = '0'
}
//
if (/[^0-9.]/.test(value)) {
callback(new Error('不能包含特殊符号或负数'));
@ -526,9 +532,9 @@ const deleteRecharge = function () {
market: adminData.value.market,
voucher: '',
rechargeWay: '客服充值',
freeGold: Number(),
freeGold: '',
money: null,
permanentGold: Number(),
permanentGold: '',
rateId: null
}
imageUrl.value = ''
@ -574,13 +580,13 @@ onMounted(() => {
<el-input v-model="recharge.activity" placeholder="请输入活动名称" style="width: 300px" />
</el-form-item>
<el-form-item prop="permanentGold" label="永久金币">
<el-input v-model="recharge.permanentGold" style="width: 100px" />
<el-input v-model="recharge.permanentGold" placeholder="0" style="width: 100px" />
<p></p>
</el-form-item>
<el-form-item prop="freeGold" label="免费金币">
<el-input v-model="recharge.freeGold" style="width: 100px" />
<el-input v-model="recharge.freeGold" placeholder="0" style="width: 100px" />
<p></p>
</el-form-item>
<!-- <el-form-item label="充值金额">

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

@ -1,9 +1,9 @@
<script setup>
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 API from '@/util/http.js'
import {reverseMarketMapping} from '@/utils/marketMap.js';
import { reverseMarketMapping } from '@/utils/marketMap.js';
import dayjs from "dayjs";
const trimJwCode = () => {
@ -15,7 +15,7 @@ const trimJwCode = () => {
const adminData = ref({})
const getAdminData = async function () {
try {
const result = await API({url: '/admin/userinfo', data: {}})
const result = await API({ url: '/admin/userinfo', data: {} })
adminData.value = result
rechargeUser.value.adminId = adminData.value.id
console.log('请求成功', result)
@ -202,7 +202,7 @@ const delObj = ref({})
const getActivity = async function () {
try {
// POST
const result = await API({url: '/general/activity', data: {}})
const result = await API({ url: '/general/activity', data: {} })
//
console.log('请求成功', result)
@ -210,7 +210,7 @@ const getActivity = async function () {
//
if (Array.isArray(result.data)) {
// { value, label }
activity.value = result.data.map(item => ({value: item, label: item}));
activity.value = result.data.map(item => ({ value: item, label: item }));
} else {
console.error('活动数据格式错误', result)
ElMessage.error('活动数据格式错误,请联系管理员')
@ -241,8 +241,8 @@ const getArea = async function () {
return allChildren.map(child => {
const grandchildren = child.children && child.children.length
? transformTree([child]) //
: null;
? transformTree([child]) //
: null;
return {
value: child.name,
@ -274,7 +274,7 @@ const getPlatform = async () => {
})
// { value, label }
if (Array.isArray(result.data)) {
platform.value = result.data.map(item => ({value: item, label: item}));
platform.value = result.data.map(item => ({ value: item, label: item }));
} else {
console.error('充值方式格式错误', result)
ElMessage.error('充值方式格式错误,请联系管理员')
@ -329,7 +329,7 @@ const get = async function (val) {
url: '/recharge/selectBy',
data: {
...getObj.value,
rechargeUser: {...rechargeUser.value}
rechargeUser: { ...rechargeUser.value }
}
})
// rechargeUser.value
@ -367,11 +367,11 @@ const get = async function (val) {
tableData.value = tableData.value.map(item => ({
...item,
//
permanentGold: (Number(item.permanentGold) || 0) / 100,
permanentGold: (Number(item.permanentGold) || 0) ,
//
freeGold: (Number(item.freeGold) || 0) / 100,
freeGold: (Number(item.freeGold) || 0) ,
//
money: (Number(item.money) || 0) / 100
money: (Number(item.money) || 0)
}))
console.log('tableData', tableData.value)
//
@ -433,6 +433,7 @@ const getYesterday = function () {
get()
}
// 7
const get7Days = function () {
const today = dayjs()
@ -445,7 +446,10 @@ const get7Days = function () {
get()
}
const format3 = (num) => {
//
return num.toLocaleString('en-US')
}
//
onMounted(async function () {
await get()
@ -466,8 +470,8 @@ const handleSortChange = (column) => {
sortField.value = 'money'
} else if (column.prop === 'freeGold') {
sortField.value = 'freeGold'
} else if (column.prop === 'payTime') {
sortField.value = 'payTime'
} else if (column.prop === 'auditTime') {
sortField.value = 'auditTime'
} else if (column.prop === 'createTime') {
sortField.value = 'createTime'
} else if (column.prop === 'permanentGold') {
@ -493,7 +497,7 @@ const exportExcel = async function () {
size: total.value
}
try {
const res = await API({url: '/export/exportRecharge', data: params})
const res = await API({ url: '/export/exportRecharge', data: params })
if (res.code === 200) {
ElMessage.success('导出成功')
} else {
@ -521,7 +525,7 @@ const exportListLoading = ref(false)
const getExportList = async () => {
exportListLoading.value = true
try {
const result = await API({url: '/export/export'})
const result = await API({ url: '/export/export' })
if (result.code === 200) {
const filteredData = result.data.filter(item => {
return item.type === 2; //2
@ -590,35 +594,29 @@ const getTagText = (state) => {
<el-col :span="5">
<div class="head-card-element">
<el-text class="mx-1" size="large">精网号</el-text>
<el-input v-model="rechargeUser.jwcode" placeholder="请输入精网号" style="width: 150px" clearable/>
<el-input v-model="rechargeUser.jwcode" placeholder="请输入精网号" style="width: 150px" clearable />
</div>
</el-col>
<el-col :span="6">
<div class="head-card-element">
<el-text class="mx-1" size="large">活动名称</el-text>
<el-select v-model="rechargeUser.activity" placeholder="请选择活动名称" style="width: 180px" clearable>
<el-option v-for="item in activity" :key="item.value" :label="item.label" :value="item.value"/>
<el-option v-for="item in activity" :key="item.value" :label="item.label" :value="item.value" />
</el-select>
</div>
</el-col>
<el-col :span="6">
<div class="head-card-element">
<el-text class="mx-1" size="large">所属地区</el-text>
<el-cascader
v-model="selectedMarketPath"
:options="market"
placeholder="请选择所属地区"
clearable
style="width:180px"
@change="handleMarketChange"
/>
<el-cascader v-model="selectedMarketPath" :options="market" placeholder="请选择所属地区" clearable
style="width:180px" @change="handleMarketChange" />
</div>
</el-col>
<el-col :span="6">
<div class="head-card-element">
<el-text class="mx-1" size="large">充值方式</el-text>
<el-select v-model="rechargeUser.payPlatform" placeholder="请选择充值方式" style="width: 180px" clearable>
<el-option v-for="item in platform" :key="item.value" :label="item.label" :value="item.value"/>
<el-option v-for="item in platform" :key="item.value" :label="item.label" :value="item.value" />
</el-select>
</div>
</el-col>
@ -629,16 +627,16 @@ const getTagText = (state) => {
<div class="head-card-element">
<el-text class="mx-1" size="large">充值时间</el-text>
<el-date-picker v-model="getTime" type="datetimerange" range-separator="" start-placeholder="起始时间"
end-placeholder="结束时间" style="width: 400px" @change="handleDatePickerChange"
:default-time="defaultTime"/>
end-placeholder="结束时间" style="width: 400px" @change="handleDatePickerChange"
:default-time="defaultTime" />
<el-button @click="getToday()" style="margin-left: 10px"
:type="activeTimeRange === 'today' ? 'primary' : ''">
:type="activeTimeRange === 'today' ? 'primary' : ''">
</el-button>
<el-button @click="getYesterday()" style="margin-left: 10px"
:type="activeTimeRange === 'yesterday' ? 'primary' : ''">
:type="activeTimeRange === 'yesterday' ? 'primary' : ''">
</el-button>
<el-button @click="get7Days()" style="margin-left: 10px"
:type="activeTimeRange === '7days' ? 'primary' : ''"> 近7天
:type="activeTimeRange === '7days' ? 'primary' : ''"> 近7天
</el-button>
<el-button type="success" @click="reset()">重置</el-button>
<el-button type="primary" @click="search()">查询</el-button>
@ -654,9 +652,10 @@ const getTagText = (state) => {
<el-col>
<el-card>
<div>
充值金额{{ (permanentGolds) / 100 }}新币永久金币{{
permanentGolds / 100
}}金币免费金币{{ freeGolds / 100 }}金币
充值新币{{ format3(permanentGolds / 100) }}新币&nbsp;&nbsp;&nbsp;&nbsp;
永久金币{{ format3(permanentGolds / 100) }}金币&nbsp;&nbsp;&nbsp;&nbsp;
免费金币{{ format3(freeGolds / 100) }}金币
</div>
<!-- 设置表格容器的高度和滚动样式 -->
<div style="height: 520px; overflow-y: auto;margin-top: 10px;">
@ -664,25 +663,25 @@ const getTagText = (state) => {
<el-table-column type="index" label="序号" width="80px" fixed="left">
<template #default="scope">
<span>{{
scope.$index + 1 + (getObj.pageNum - 1) * getObj.pageSize
}}</span>
scope.$index + 1 + (getObj.pageNum - 1) * getObj.pageSize
}}</span>
</template>
</el-table-column>
<el-table-column fixed="left" prop="name" label="姓名" width="150px"/>
<el-table-column fixed="left" prop="jwcode" label="精网号" width="110px"/>
<el-table-column prop="market" label="所属地区" width="100px"/>
<el-table-column prop="activity" label="活动名称" width="110px" show-overflow-tooltip/>
<el-table-column prop="rateName" label="货币名称" width="110px"/>
<el-table-column prop="money" sortable="custom" label="充值金额" width="110px"/>
<el-table-column prop="permanentGold" label="永久金币" sortable="custom" width="110px"/>
<el-table-column prop="freeGold" label="免费金币" sortable="custom" width="110px"/>
<el-table-column prop="payPlatform" label="充值方式" width="100px"/>
<el-table-column prop="payModel" label="支付方式" width="100px"/>
<el-table-column prop="remark" label="备注" width="150px" show-overflow-tooltip/>
<el-table-column prop="adminName" label="提交人" width="100px"/>
<el-table-column prop="payTime" sortable label="充值时间" width="200px">
<el-table-column fixed="left" prop="name" label="姓名" width="150px" />
<el-table-column fixed="left" prop="jwcode" label="精网号" width="110px" />
<el-table-column prop="market" label="所属地区" width="100px" />
<el-table-column prop="activity" label="活动名称" width="110px" show-overflow-tooltip />
<el-table-column prop="rateName" label="货币名称" width="110px" />
<el-table-column prop="money" sortable="custom" label="充值金额" width="110px" />
<el-table-column prop="permanentGold" label="永久金币" sortable="custom" width="110px" />
<el-table-column prop="freeGold" label="免费金币" sortable="custom" width="110px" />
<el-table-column prop="payPlatform" label="充值方式" width="100px" />
<el-table-column prop="payModel" label="支付方式" width="100px" />
<el-table-column prop="remark" label="备注" width="150px" show-overflow-tooltip />
<el-table-column prop="adminName" label="提交人" width="100px" />
<el-table-column prop="auditTime" sortable label="充值时间" width="200px">
<template #default="scope">
{{ moment(scope.row.payTime).format('YYYY-MM-DD HH:mm:ss') }}
{{ moment(scope.row.auditTime).format('YYYY-MM-DD HH:mm:ss') }}
</template>
</el-table-column>
</el-table>
@ -691,9 +690,8 @@ const getTagText = (state) => {
<!-- 分页 -->
<div class="pagination" style="margin-top: 20px">
<el-pagination background :page-size="getObj.pageSize" :page-sizes="[5, 10, 20, 50, 100]"
layout="total, sizes, prev, pager, next, jumper" :total="total"
@size-change="handlePageSizeChange"
@current-change="handleCurrentChange"></el-pagination>
layout="total, sizes, prev, pager, next, jumper" :total="total" @size-change="handlePageSizeChange"
@current-change="handleCurrentChange"></el-pagination>
</div>
</el-card>
</el-col>
@ -701,11 +699,10 @@ const getTagText = (state) => {
<!-- 导出弹窗 -->
<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="文件名"/>
<el-table-column prop="fileName" label="文件名" />
<el-table-column prop="state" label="状态">
<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'">
{{ getTagText(scope.row.state) }}
</el-tag>
</template>
@ -718,7 +715,7 @@ const getTagText = (state) => {
<el-table-column label="操作">
<template #default="scope">
<el-button type="primary" size="small" @click="downloadExportFile(scope.row)"
:disabled="scope.row.state !== 2">
:disabled="scope.row.state !== 2">
下载
</el-button>
</template>

188
src/views/refund/gold/addCoinRefund.vue

@ -1,11 +1,10 @@
<script setup>
import {onMounted, reactive} from 'vue'
import {ref, computed, watch} from 'vue'
import {ElMessage} from 'element-plus'
import {Plus} from '@element-plus/icons-vue'
import { onMounted, reactive } from 'vue'
import { ref, computed, watch } from 'vue'
import { ElMessage } from 'element-plus'
import { Plus } from '@element-plus/icons-vue'
import axios from 'axios'
import {ElMessageBox} from 'element-plus'
import { ElMessageBox } from 'element-plus'
import API from '@/util/http.js'
import moment from 'moment'
// import _ from 'lodash'
@ -19,7 +18,7 @@ const addRe = ref({
const adminData = ref({})
const getAdminData = async function () {
try {
const result = await API({url: '/admin/userinfo', data: {}})
const result = await API({ url: '/admin/userinfo', data: {} })
adminData.value = result
addRefund.value.adminId = adminData.value.id
console.log('请求成功', result)
@ -119,13 +118,13 @@ const addBefore = () => {
// }
ElMessageBox.confirm('确认添加?')
.then(() => {
add()
console.log('添加成功')
})
.catch(() => {
console.log('取消添加')
})
.then(() => {
add()
console.log('添加成功')
})
.catch(() => {
console.log('取消添加')
})
} else {
//
ElMessage({
@ -153,16 +152,16 @@ const validateJwCode = (rule, value, callback) => {
callback();
};
const rules = reactive({
jwcode: [{required: true, validator: validateJwCode, trigger: 'blur'}],
refundType: [{required: true, message: '请选择退款类型', trigger: 'blur'}],
goodsName: [{required: true, message: '请选择退款商品', trigger: 'blur'}],
taskGold: [{required: true, message: '请输入任务金币', trigger: 'blur'}],
freeGold: [{required: true, message: '请输入免费金币', trigger: 'blur'}],
jwcode: [{ required: true, validator: validateJwCode, trigger: 'blur' }],
refundType: [{ required: true, message: '请选择退款类型', trigger: 'blur' }],
goodsName: [{ required: true, message: '请选择退款商品', trigger: 'blur' }],
taskGold: [{ required: true, message: '请输入任务金币', trigger: 'blur' }],
freeGold: [{ required: true, message: '请输入免费金币', trigger: 'blur' }],
permanentGold: [
{required: true, message: '请输入永久金币', trigger: 'blur'}
{ required: true, message: '请输入永久金币', trigger: 'blur' }
],
sumGold: [
{required: true, message: '请选择付款方式', trigger: 'blur'},
{ required: true, message: '请选择付款方式', trigger: 'blur' },
{
validator: (rule, value) => {
if (value === 0) {
@ -249,7 +248,7 @@ const getUser = async function (jwcode) {
// 退退
const refundType = ref([{value: '商品退款', label: '商品退款'}]);
const refundType = ref([{ value: '商品退款', label: '商品退款' }]);
// 退
// const getRefundTypes = async function () {
@ -441,56 +440,20 @@ onMounted(async function () {
<template>
<div>
<el-form
:model="addRefund"
ref="Ref"
:rules="rules"
label-width="auto"
style="max-width: 750px"
class="form-style"
>
<el-form :model="addRefund" ref="Ref" :rules="rules" label-width="auto" style="max-width: 750px" class="form-style">
<el-form-item prop="jwcode" label="精网号">
<el-input
v-model="addRefund.jwcode"
style="width: 220px"
@change="getGoods(addRefund.jwcode)"
/>
<el-button
type="primary"
@click="getUser(addRefund.jwcode)"
style="margin-left: 20px"
>查询
</el-button
>
<el-input v-model="addRefund.jwcode" style="width: 220px" @change="getGoods(addRefund.jwcode)" />
<el-button type="primary" @click="getUser(addRefund.jwcode)" style="margin-left: 20px">查询
</el-button>
</el-form-item>
<el-form-item prop="refundType" label="退款类型">
<el-select
v-model="addRefund.refundType"
placeholder="请选择"
style="width: 300px"
>
<el-option
v-for="item in refundType"
:key="item.value"
:label="item.label"
:value="item.value"
/>
<el-select v-model="addRefund.refundType" placeholder="请选择" style="width: 220px">
<el-option v-for="item in refundType" :key="item.value" :label="item.label" :value="item.value" />
</el-select>
</el-form-item>
<el-form-item prop="goodsName" label="商品名">
<el-select
v-model="addRefund.goodsName"
placeholder="请选择"
style="width: 300px"
@change="handleSelectionChange"
>
<el-option
v-for="item in goodsName"
:key="item.key"
:label="item.label"
:value="item"
/>
<el-select v-model="addRefund.goodsName" placeholder="请选择" style="width: 220px" @change="handleSelectionChange">
<el-option v-for="item in goodsName" :key="item.key" :label="item.label" :value="item" />
</el-select>
</el-form-item>
@ -501,70 +464,47 @@ onMounted(async function () {
</el-radio-group>
</el-form-item>
<div style="display: flex; align-items: center">
<el-form-item prop="permanentGold" label="永久金币" style="float: left">
<el-input
v-model="addRefund.permanentGold"
style="width: 100px"
:disabled="addRe.typeR === '0' ? true : false"
@input="handlePermanentGoldInput($event)"
type="number"
>
</el-input>
<p></p>
<el-form-item prop="permanentGold" label="永久金币">
<el-input v-model="addRefund.permanentGold" style="width: 220px"
:disabled="addRe.typeR === '0' ? true : false" @input="handlePermanentGoldInput($event)" type="number">
</el-input>&nbsp;&nbsp;
</el-form-item>
<el-form-item
prop="freeGold"
label="免费金币"
style="margin-left: -20px; float: left"
>
<el-input
v-model="addRefund.freeGold"
style="float: left; width: 100px"
:disabled="addRe.typeR === '0' ? true : false"
@input="handleFreeGoldInput($event)"
type="number"
/>
<p></p>
<el-form-item prop="freeGold" label="免费金币">
<el-input v-model="addRefund.freeGold" style="float: left; width: 220px"
:disabled="addRe.typeR === '0' ? true : false" @input="handleFreeGoldInput($event)" type="number" />
&nbsp;&nbsp;
</el-form-item>
<el-form-item prop="taskGold" label="任务金币" style="margin-left: -20px">
<el-input
v-model="addRefund.taskGold"
style="float: left; width: 100px"
:disabled="addRe.typeR === '0' ? true : false"
@input="handleTaskGoldInput($event)"
type="number"
/>
<p></p>
<div>
<el-form-item prop="taskGold" label="任务金币">
<el-input v-model="addRefund.taskGold" style="float: left; width: 220px"
:disabled="addRe.typeR === '0' ? true : false" @input="handleTaskGoldInput($event)" type="number" />
&nbsp;&nbsp;
</el-form-item>
</div>
<div>
<el-form-item prop="sumGold" label="退款金币总数">
<el-input disabled v-model="addRefund.sumGold" style="width: 100px">
<el-input disabled v-model="addRefund.sumGold" style="width: 220px">
</el-input>
</el-form-item>
</div>
<div>
<el-form-item prop="remark" label="备注">
<el-input
v-model="addRefund.remark"
style="width: 300px"
:rows="2"
maxlength="100"
show-word-limit
type="textarea"
/>
<el-input v-model="addRefund.remark" style="width: 220px" :rows="3" maxlength="100" show-word-limit
type="textarea" />
</el-form-item>
</div>
<el-button type="success" @click="cancel()" style="margin-left: 280px">重置</el-button>
<el-button type="success" @click="cancel()" style="margin-left: 200px">重置</el-button>
<el-button type="primary" @click="addBefore"> 提交</el-button>
</el-form>
<!-- 客户信息栏 -->
<el-card v-if="user.jwcode" style="width: 800px; float: right" class="customer-info">
<el-form
:model="user"
label-width="auto"
style="max-width: 1000px"
label-position="left"
>
<el-form :model="user" label-width="auto" style="max-width: 1000px" label-position="left">
<el-text size="large" style="margin-left: 20px">客户信息</el-text>
<!-- 第一行姓名 + 历史金币 -->
@ -592,19 +532,15 @@ onMounted(async function () {
</el-col>
<el-col :span="14">
<el-form-item label="当前金币总数" style="width: 500px">
<span
style="color: #2fa1ff; margin-right: 5px"
v-if="user.nowSumGold !== undefined"
>{{ user.nowSumGold }}</span>
<span style="color: #2fa1ff; margin-right: 5px" v-if="user.nowSumGold !== undefined">{{ user.nowSumGold
}}</span>
</el-form-item>
<!-- 金币详情独立显示 -->
<el-form-item style="margin-top: -23px"> <!-- 负边距减少间距 -->
<span
style="color: #b1b1b1; margin-left: 0px"
v-if="user.nowPermanentGold !== undefined"
>(永久金币:{{ user.nowPermanentGold }};
免费金币:{{ user.nowFreeGold }};
任务金币:{{ user.nowTaskGold }})</span>
<el-form-item style="margin-top: -23px"> <!-- 负边距减少间距 -->
<span style="color: #b1b1b1; margin-left: 0px" v-if="user.nowPermanentGold !== undefined">(永久金币:{{
user.nowPermanentGold }};
免费金币:{{ user.nowFreeGold }};
任务金币:{{ user.nowTaskGold }})</span>
</el-form-item>
</el-col>
</el-row>

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

@ -1,17 +1,21 @@
<script setup>
// 退
import {computed, onMounted, ref} from 'vue'
import {ElMessage} from 'element-plus'
import { computed, onMounted, ref } from 'vue'
import { ElMessage } from 'element-plus'
import moment from 'moment'
import API from '@/util/http.js'
import request from '@/util/http.js'
import {reverseMarketMapping} from "@/utils/marketMap.js";
import { reverseMarketMapping } from "@/utils/marketMap.js";
import dayjs from "dayjs";
const defaultTime = [
new Date(2000, 1, 1, 0, 0, 0),
new Date(2000, 2, 1,23 , 59, 59),
new Date(2000, 2, 1, 23, 59, 59),
]
const format3 = (num) => {
//
return num.toLocaleString('en-US')
}
//
const trimJwCode = () => {
if (refundUser.value.jwcode) {
@ -39,7 +43,7 @@ const handleDatePickerChange = () => {
const adminData = ref({})
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)
@ -53,7 +57,7 @@ const tableData = ref([])
// ======================================
// detail
const refundUser = ref({
market:""
market: ""
})
//
const getObj = ref({
@ -94,7 +98,7 @@ const getRefundTypes = async function () {
//
if (Array.isArray(result.data)) {
// { value, label }
refundType.value = result.data.map(item => ({value: item, label: item}));
refundType.value = result.data.map(item => ({ value: item, label: item }));
} else {
console.error('退款类型数据格式错误', result)
ElMessage.error('退款类型数据格式错误,请联系管理员')
@ -148,11 +152,11 @@ const getSelectBy = async function (val) {
url: '/refund/selectBy',
data: {
...getObj.value,
refundUser: {...refundUser.value}
refundUser: { ...refundUser.value }
}
})
// refundUser.value
const detailWithoutSort = {...refundUser.value}
const detailWithoutSort = { ...refundUser.value }
delete detailWithoutSort.sortField
delete detailWithoutSort.sortOrder
@ -176,13 +180,13 @@ const getSelectBy = async function (val) {
//
tableData.value = result.data.list
// 100
tableData.value = tableData.value.map(item => ({
...item,
sumGold: (Number(item.sumGold) || 0) / 100,
permanentGold: (Number(item.permanentGold) || 0) / 100,
freeGold: (Number(item.freeGold) || 0) / 100,
taskGold: (Number(item.taskGold) || 0) / 100
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)
//
@ -203,7 +207,7 @@ const search = function () {
}
//
const reset = function () {
refundUser.value = {market: ""}
refundUser.value = { market: "" }
sortField.value = ''
sortOrder.value = ''
getTime.value = {}
@ -215,7 +219,7 @@ const reset = function () {
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.endOf('day').format('YYYY-MM-DD HH:mm:ss')
getTime.value = [startTime, endTime]
console.log('getTime', getTime.value)
activeTimeRange.value = 'today' //
@ -365,7 +369,7 @@ const exportExcel = async function () {
}
try {
const res = await API({url: '/export/exportRefund', data: params})
const res = await API({ url: '/export/exportRefund', data: params })
if (res.code === 200) {
ElMessage.success('导出成功')
} else {
@ -393,7 +397,7 @@ const exportListLoading = ref(false)
const getExportList = async () => {
exportListLoading.value = true
try {
const result = await API({url: '/export/export'})
const result = await API({ url: '/export/export' })
if (result.code === 200) {
const filteredData = result.data.filter(item => {
return item.type === 3; //3退
@ -480,8 +484,8 @@ const getMarket = async function () {
return allChildren.map(child => {
const grandchildren = child.children && child.children.length
? transformTree([child]) //
: null;
? transformTree([child]) //
: null;
return {
value: child.name,
@ -507,63 +511,29 @@ const getMarket = async function () {
<el-col :span="5">
<div class="head-card-element">
<el-text class="mx-1">精网号</el-text>
<el-input
v-model="refundUser.jwcode"
placeholder="请输入精网号"
style="width: 150px"
clearable
/>
<el-input v-model="refundUser.jwcode" placeholder="请输入精网号" style="width: 150px" clearable />
</div>
</el-col>
<el-col :span="6">
<div class="head-card-element">
<el-text class="mx-1">商品名称</el-text>
<el-select
v-model="refundUser.goodsName"
placeholder="请选择商品名称"
style="width: 180px"
clearable
>
<el-option
v-for="item in goods"
:key="item.value"
:label="item.label"
:value="item.value"
/>
<el-select v-model="refundUser.goodsName" placeholder="请选择商品名称" style="width: 180px" clearable>
<el-option v-for="item in goods" :key="item.value" :label="item.label" :value="item.value" />
</el-select>
</div>
</el-col>
<el-col :span="6">
<el-text class="mx-1" size="large">所属地区</el-text>
<el-cascader
v-model="selectedMarketPath"
:options="market"
placeholder="请选择所属地区"
clearable
style="width:180px"
@change="handleMarketChange"
/>
<el-cascader v-model="selectedMarketPath" :options="market" placeholder="请选择所属地区" clearable
style="width:180px" @change="handleMarketChange" />
</el-col>
<el-col :span="6">
<div class="head-card-element">
<el-text class="mx-1">退款类型</el-text>
<el-select
v-model="refundUser.refundType"
placeholder="请选择退款类型"
style="width: 180px"
clearable
>
<el-select v-model="refundUser.refundType" placeholder="请选择退款类型" style="width: 180px" clearable>
<!-- todo 这需要改-->
<el-option
v-for="item in refundType"
:key="item.value"
:label="item.label"
:value="item.value"
/>
<el-option v-for="item in refundType" :key="item.value" :label="item.label" :value="item.value" />
</el-select>
</div>
</el-col>
@ -573,15 +543,16 @@ const getMarket = async function () {
<div class="head-card-element">
<el-text class="mx-1">退款时间</el-text>
<el-date-picker v-model="getTime" type="datetimerange" range-separator="" start-placeholder="起始时间"
end-placeholder="结束时间" style="width: 400px" @change="handleDatePickerChange" :default-time="defaultTime"/>
end-placeholder="结束时间" style="width: 400px" @change="handleDatePickerChange"
:default-time="defaultTime" />
<el-button @click="getToday()" style="margin-left: 10px"
:type="activeTimeRange === 'today' ? 'primary' : ''">
:type="activeTimeRange === 'today' ? 'primary' : ''">
</el-button>
<el-button @click="getYesterday()" style="margin-left: 10px"
:type="activeTimeRange === 'yesterday' ? 'primary' : ''">
:type="activeTimeRange === 'yesterday' ? 'primary' : ''">
</el-button>
<el-button @click="get7Days()" style="margin-left: 10px"
:type="activeTimeRange === '7days' ? 'primary' : ''"> 近7天
:type="activeTimeRange === '7days' ? 'primary' : ''"> 近7天
</el-button>
<el-button type="success" @click="reset()">重置</el-button>
@ -598,48 +569,27 @@ const getMarket = async function () {
<el-col>
<el-card>
<div>
退款金币总数{{ Math.abs(sumGolds) / 100 }}永久金币{{
Math.abs(permanentGolds) / 100
}}免费金币{{ Math.abs(freeGolds) / 100 }}任务金币{{
Math.abs(taskGolds) / 100
}}
退款金币总数{{ format3(Math.abs(sumGolds) / 100) }}&nbsp;&nbsp;&nbsp;&nbsp;
永久金币{{ format3(Math.abs(permanentGolds) / 100) }}&nbsp;&nbsp;&nbsp;&nbsp;
免费金币{{ format3(Math.abs(freeGolds) / 100) }}&nbsp;&nbsp;&nbsp;&nbsp;
任务金币{{ format3(Math.abs(taskGolds) / 100) }}
</div>
<!-- 设置表格容器的高度和滚动样式 -->
<div style="height: 520px; overflow-y: auto;margin-top:10px">
<el-table
:data="tableData"
style="width: 100%"
@sort-change="handleSortChange"
height="520px"
>
<el-table-column
type="index"
label="序号"
width="80px"
fixed="left"
>
<el-table :data="tableData" style="width: 100%" @sort-change="handleSortChange" height="520px">
<el-table-column type="index" label="序号" width="80px" fixed="left">
<template #default="scope">
<span>{{
scope.$index + 1 + (getObj.pageNum - 1) * getObj.pageSize
}}</span>
scope.$index + 1 + (getObj.pageNum - 1) * getObj.pageSize
}}</span>
</template>
</el-table-column>
<el-table-column
prop="name"
label="姓名"
fixed="left"
width="130px"
/>
<el-table-column
prop="jwcode"
label="精网号"
fixed="left"
width="110px"
/>
<el-table-column prop="market" label="所属地区" width="110px"/>
<el-table-column prop="goodsName" label="商品名称" width="110px" show-overflow-tooltip/>
<el-table-column prop="refundType" label="退款类型" width="100px"/>
<el-table-column prop="name" label="姓名" fixed="left" width="130px" />
<el-table-column prop="jwcode" label="精网号" fixed="left" width="110px" />
<el-table-column prop="market" label="所属地区" width="110px" />
<el-table-column prop="goodsName" label="商品名称" width="110px" show-overflow-tooltip />
<el-table-column prop="refundType" label="退款类型" width="100px" />
<!-- <el-table-column label="金额总数" width="110px">
<template #default="scope">
@ -649,51 +599,21 @@ const getMarket = async function () {
</template>
</el-table-column> -->
<el-table-column
prop="sumGold"
label="金额总数"
width="110px"
sortable="custom"
/>
<el-table-column prop="sumGold" label="金额总数" width="110px" sortable="custom" />
<el-table-column prop="refundModel" label="退款方式" width="110px">
<template #default="scope">
{{ scope.row.refundModel === 0 ? '全部退款' : scope.row.refundModel === 1 ? '部分退款' : '' }}
</template>
</el-table-column>
<el-table-column
prop="permanentGold"
label="永久金币"
width="110px"
sortable="custom"
/>
<el-table-column
prop="freeGold"
sortable="custom"
label="免费金币"
width="110px"
/>
<el-table-column
prop="taskGold"
sortable="custom"
label="任务金币"
width="110px"
/>
<el-table-column prop="permanentGold" label="永久金币" width="110px" sortable="custom" />
<el-table-column prop="freeGold" sortable="custom" label="免费金币" width="110px" />
<el-table-column prop="taskGold" sortable="custom" label="任务金币" width="110px" />
<!-- 修改prop为taskGold -->
<el-table-column
prop="remark"
label="退款原因"
width="160px"
show-overflow-tooltip
/>
<el-table-column prop="adminName" label="提交人" width="100px"/>
<el-table-column
prop="createTime"
sortable="custom"
label="提交时间"
width="180px"
>
<el-table-column prop="remark" label="退款原因" width="160px" show-overflow-tooltip />
<el-table-column prop="adminName" label="提交人" width="100px" />
<el-table-column prop="createTime" sortable="custom" label="提交时间" width="180px">
<template #default="scope">
{{ moment(scope.row.createTime).format('YYYY-MM-DD HH:mm:ss') }}
</template>
@ -703,16 +623,9 @@ const getMarket = async function () {
<!-- 分页 -->
<div class="pagination" style="margin-top: 20px">
<el-pagination
background
:page-size="getObj.pageSize"
:page-sizes="[5, 10, 20, 50, 100]"
layout="total, sizes, prev, pager, next, jumper"
:total="total"
@size-change="handlePageSizeChange"
@current-change="handleCurrentChange"
@jump="checkPageNumber"
></el-pagination>
<el-pagination background :page-size="getObj.pageSize" :page-sizes="[5, 10, 20, 50, 100]"
layout="total, sizes, prev, pager, next, jumper" :total="total" @size-change="handlePageSizeChange"
@current-change="handleCurrentChange" @jump="checkPageNumber"></el-pagination>
</div>
</el-card>
</el-col>
@ -720,12 +633,11 @@ const getMarket = async function () {
<!-- 导出弹窗 -->
<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="文件名"/>
<el-table :data="exportList" style="width: 100% ;height: 60vh;" :loading="exportListLoading">
<el-table-column prop="fileName" label="文件名" />
<el-table-column prop="state" label="状态">
<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'">
{{ getTagText(scope.row.state) }}
</el-tag>
</template>
@ -738,7 +650,7 @@ const getMarket = async function () {
<el-table-column label="操作">
<template #default="scope">
<el-button type="primary" size="small" @click="downloadExportFile(scope.row)"
:disabled="scope.row.state !== 2">
:disabled="scope.row.state !== 2">
下载
</el-button>
</template>

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

@ -137,7 +137,20 @@ const get = async function (val) {
// 0
total.value = 0
// ElMessage.warning('')
} else {
}
// , result.data.list
else if(resultGoldTotal.data===0){
//
tableData.value = []
// 0
permanentGold.value = 0
freeJuneGold.value = 0
freeDecemberGold.value = 0
taskGold.value = 0
goldtotal.value = 0
freeGold.value = 0
}
else {
//
console.log('总数据请求成功', result)
//
@ -178,7 +191,10 @@ const search = function () {
}
//
const reset = function () {
user.value = {}
user.value = {
jwcode: '',
markets: [],
}
sortField.value = ''
sortOrder.value = ''
get()
@ -359,6 +375,10 @@ const getMarket = async function () {
console.log('请求失败', error)
}
}
const format3 = (num) => {
//
return num.toLocaleString('en-US')
}
</script>
@ -396,10 +416,10 @@ const getMarket = async function () {
<el-col>
<el-card>
<div>
金币总数{{ (goldtotal || 0) / 100 }}
永久金币{{ (permanentGold || 0) / 100 }}
免费金币{{ (freeGold || 0) / 100 }}
任务金币{{ (taskGold || 0) / 100 }}
金币总数{{ format3(goldtotal/100 || 0) }}&nbsp;&nbsp;&nbsp;&nbsp;
永久金币{{ format3(permanentGold/100 || 0) }}&nbsp;&nbsp;&nbsp;&nbsp;
免费金币{{ format3(freeGold/100 || 0) }}&nbsp;&nbsp;&nbsp;&nbsp;
任务金币{{ format3(taskGold /100 || 0) }}
</div>
<!-- 设置表格容器的高度和滚动样式 -->
<div style="height: 626px; overflow-y: auto">
@ -421,28 +441,28 @@ const getMarket = async function () {
((scope.row.currentPermanentGold || 0) +
(scope.row.currentFreeJune || 0) +
(scope.row.currentFreeDecember || 0) +
(scope.row.currentTaskGold || 0)) / 100
(scope.row.currentTaskGold || 0))
}}</span>
</template>
</el-table-column>
<el-table-column prop="currentPermanentGold" label="永久金币" sortable="custom" width="110">
<template #default="scope">
<span>{{ (scope.row.currentPermanentGold || 0) / 100 }}</span>
<span>{{ (scope.row.currentPermanentGold || 0) }}</span>
</template>
</el-table-column>
<el-table-column prop="currentFreeJune" label="6月份到期免费金币" sortable="custom" width="110">
<template #default="scope">
<span>{{ (scope.row.currentFreeJune || 0) / 100 }}</span>
<span>{{ (scope.row.currentFreeJune || 0) }}</span>
</template>
</el-table-column>
<el-table-column prop="currentFreeDecember" label="12月份到期免费金币" sortable="custom" width="110">
<template #default="scope">
<span>{{ (scope.row.currentFreeDecember || 0) / 100 }}</span>
<span>{{ (scope.row.currentFreeDecember || 0) }}</span>
</template>
</el-table-column>
<el-table-column prop="currentTaskGold" label="任务金币" sortable="custom" width="130">
<template #default="scope">
<span>{{ (scope.row.currentTaskGold || 0) / 100 }}</span>
<span>{{ (scope.row.currentTaskGold || 0) }}</span>
</template>
</el-table-column>
@ -451,18 +471,18 @@ const getMarket = async function () {
<el-popover trigger="hover" placement="left" width="150">
<template #default>
<div>
<div>永久金币{{ (scope.row.sumPermanentGold || 0) / 100 }}</div>
<div>免费金币{{ ((scope.row.sumFreeJune || 0) + (scope.row.sumFreeDecember || 0)) / 100 }}</div>
<div>任务金币{{ (scope.row.sumTaskGold || 0) / 100 }}</div>
<div>永久金币{{ (scope.row.sumPermanentGold || 0) }}</div>
<div>免费金币{{ ((scope.row.sumFreeJune || 0) + (scope.row.sumFreeDecember || 0)) }}</div>
<div>任务金币{{ (scope.row.sumTaskGold || 0) }}</div>
</div>
</template>
<template #reference>
<span>
{{
(scope.row.sumPermanentGold || 0) / 100 +
(scope.row.sumFreeJune || 0) / 100 +
(scope.row.sumFreeDecember || 0) / 100 +
(scope.row.sumTaskGold || 0) / 100
(scope.row.sumPermanentGold || 0) +
(scope.row.sumFreeJune || 0) +
(scope.row.sumFreeDecember || 0) +
(scope.row.sumTaskGold || 0)
}}</span>
</template>
</el-popover>
@ -473,21 +493,21 @@ const getMarket = async function () {
<el-popover trigger="hover" placement="left" width="150">
<template #default>
<div>
<div>永久金币{{ (scope.row.sumConsumeGold || 0) / 100 }}</div>
<div>永久金币{{ (scope.row.sumConsumeGold || 0) }}</div>
<div>免费金币{{
((scope.row.sumConsumeJune || 0) + (scope.row.sumConsumeDecember || 0)) / 100
((scope.row.sumConsumeJune || 0) + (scope.row.sumConsumeDecember || 0))
}}
</div>
<div>任务金币{{ (scope.row.sumConsumeJune || 0) / 100 }}</div>
<div>任务金币{{ (scope.row.sumConsumeJune || 0) }}</div>
</div>
</template>
<template #reference>
<span>
{{
(scope.row.sumConsumeGold || 0) / 100 +
(scope.row.sumConsumeTaskGold || 0) / 100 +
(scope.row.sumConsumeJune || 0) / 100 +
(scope.row.sumConsumeDecember || 0) / 100
(scope.row.sumConsumeGold || 0) +
(scope.row.sumConsumeTaskGold || 0) +
(scope.row.sumConsumeJune || 0) +
(scope.row.sumConsumeDecember || 0)
}}</span>
</template>
</el-popover>

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

@ -203,6 +203,13 @@ const get = async function (val) {
totalFreeGold.value = data.freeGolds
totalTaskGold.value = data.taskGolds
totalGoldTotal.value = data.sumGolds
} else if (totalResult.code === 0) {
//
tableData.value = []
totalPermanentGold.value = 0
totalFreeGold.value = 0
totalTaskGold.value = 0
totalGoldTotal.value = 0
} else {
ElMessage.error('获取合计数据失败')
}
@ -216,17 +223,12 @@ const get = async function (val) {
//
const reset = function () {
delete goldDetail.value.jwcode
delete goldDetail.value.type
delete goldDetail.value.startTime
delete goldDetail.value.endTime
delete goldDetail.value.markets
// goldDetail.value.markets = []
goldDetail.value = {}
goldDetail.value.markets = []
selectedMarketPath.value = []
delete sortField.value
delete sortOrder.value
getTime.value = []
delete goldDetail.value.payPlatform
activeTimeRange.value = '' //
search()
@ -480,7 +482,10 @@ const getMarket = async function () {
console.log('请求失败', error)
}
}
const format3 = (num) => {
//
return num.toLocaleString('en-US')
}
</script>
<template>
<div>
@ -554,10 +559,10 @@ const getMarket = async function () {
<el-col>
<el-card>
<div>
金币总数{{ (totalGoldTotal || 0) / 100 }}
永久金币{{ (totalPermanentGold || 0) / 100 }}
免费金币{{ (totalFreeGold || 0) / 100 }}
任务金币{{ (totalTaskGold || 0) / 100 }}
金币总数{{ format3(totalGoldTotal / 100 || 0) }}&nbsp;&nbsp;&nbsp;&nbsp;
永久金币{{ format3(totalPermanentGold / 100 || 0) }}&nbsp;&nbsp;&nbsp;&nbsp;
免费金币{{ format3(totalFreeGold / 100 || 0) }}&nbsp;&nbsp;&nbsp;&nbsp;
任务金币{{ format3(totalTaskGold / 100 || 0) }}
</div>
<div style="height: 584px; overflow-y: auto">
<el-table :data="tableData" style="width: 100%" @sort-change="handleSortChange" height="584px">
@ -594,23 +599,23 @@ const getMarket = async function () {
: scope.row.sumGold / 100
}}
</span> -->
<span>{{ (scope.row.sumGold || 0) / 100 }}</span>
<span>{{ (scope.row.sumGold || 0) / }}</span>
</template>
</el-table-column>
<el-table-column prop="permanentGold" sortable="custom" label="永久金币" width="110">
<template #default="scope">
<span>{{ (scope.row.permanentGold || 0) / 100 }}</span>
<span>{{ (scope.row.permanentGold || 0) }}</span>
</template>
</el-table-column>
<el-table-column prop="freeGold" sortable="custom" label="免费金币" width="110">
<template #default="scope">
<span>{{ (calculateFreeGold(scope.row) || 0) / 100 }}</span>
<span>{{ (calculateFreeGold(scope.row) || 0) }}</span>
</template>
</el-table-column>
<el-table-column prop="taskGold" sortable="custom" label="任务金币" width="110">
<template #default="scope">
<span>{{ (scope.row.taskGold || 0) / 100 }}</span>
<span>{{ (scope.row.taskGold || 0) }}</span>
</template>
</el-table-column>
<el-table-column prop="adminName" label="提交人" width="110"/>

25
src/views/usergold/userbean.vue

@ -15,13 +15,19 @@
<el-card>
<div class="stats-card">
现有金豆数{{ stats.sumBean }}金豆&nbsp;&nbsp;&nbsp;&nbsp;
付费金豆数{{ stats.permanentBean }}金豆&nbsp;&nbsp;&nbsp;&nbsp;
免费金豆数{{ stats.freeBean }}金豆&nbsp;&nbsp;&nbsp;&nbsp;
消费金豆总数{{ stats.consumeSum }}金豆&nbsp;&nbsp;&nbsp;&nbsp;
现有金豆数{{ format3(stats.sumBean) }}金豆&nbsp;&nbsp;&nbsp;&nbsp;
付费金豆数{{ format3(stats.permanentBean) }}金豆&nbsp;&nbsp;&nbsp;&nbsp;
免费金豆数{{ 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-column label="ID" style="width: 120px" prop="id" />
<el-table-column type="index" label="序号" width="100px" fixed="left">
<template #default="scope">
<span>{{
scope.$index + 1 + (pagination.pageNum - 1) * pagination.pageSize
}}</span>
</template>
</el-table-column>
<el-table-column label="姓名" style="width: 120px;" prop="name" show-overflow-tooltip />
<el-table-column label="精网号" style="width: 120px;" prop="jwcode" />
<el-table-column label="所属地区" style="width: 120px;" prop="dept" />
@ -162,6 +168,7 @@ const trim = () => {
const reset = function () {
searchObj.value.jwcode = ''
searchObj.value.dept = ''
get()
}
const handlePageSizeChange = function (val) {
pagination.value.pageSize = val
@ -171,6 +178,10 @@ const handleCurrentChange = function (val) {
pagination.value.pageNum = val
get()
}
const format3 = (num) => {
//
return num.toLocaleString('en-US')
}
onMounted(() => {
get()
@ -181,8 +192,8 @@ onMounted(() => {
</script>
<style scoped>
.stats-card {
/* .stats-card {
background-color: #EBEEF5;
padding: 5px;
}
} */
</style>

148
src/views/workspace/index.vue

@ -1,7 +1,7 @@
<template>
<el-row>
<!-- 数据总览卡片 -->
<el-col :span="4" style="padding-right: 10px;"> <!-- 适当留白避免拥挤 -->
<el-col :span="4" style="padding-right: 10px;">
<el-card class="center-card margin-bottom">数据总览</el-card>
</el-col>
<!-- 最后更新时间 -->
@ -10,10 +10,6 @@
workDataUpdateTime && workDataUpdateTime !== '1970-01-01 08:00:00' ? workDataUpdateTime : '该地区暂无数据'
}}
</el-col>
<!-- 剩余栅格空间可选用于占满一行 -->
<el-col :span="18"></el-col>
</el-row>
<el-row :gutter="10">
@ -24,22 +20,20 @@
<div class="card-header">
<div class="card-title">当前金币余量</div>
<div>{{ currentGold / 100 }}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;较前一日
{{
dailyChange / 100
}}
{{ dailyChange / 100 }}
<template v-if="dailyChange > 0">
<el-icon style="color:red">
<ArrowUpBold/>
<ArrowUpBold />
</el-icon>
</template>
<template v-else-if="dailyChange < 0">
<el-icon style="color:forestgreen">
<ArrowDownBold/>
<ArrowDownBold />
</el-icon>
</template>
<template v-else>
<el-icon style="color:grey">
<SemiSelect/>
<SemiSelect />
</el-icon>
</template>
</div>
@ -48,10 +42,8 @@
<div>
<div class="margin-bottom">永久金币{{ currentPermanent / 100 }}</div>
<div class="margin-bottom">免费金币{{ currentFree / 100 }}</div>
<div class="margin-bottom">[六月到期|{{ currentFreeJune / 100 }}]&nbsp;&nbsp;&nbsp;&nbsp;[十二月到期|{{
currentFreeDecember /
100
}}]
<div class="margin-bottom">[六月到期|{{ currentFreeJune / 100 }}]&nbsp;&nbsp;&nbsp;&nbsp;
[十二月到期|{{ currentFreeDecember / 100 }}]
</div>
<div>任务金币{{ currentTask / 100 }}</div>
</div>
@ -97,34 +89,34 @@
<el-col class="center-card">周同比:{{ sumWow }}%&nbsp;&nbsp;&nbsp;&nbsp;
<template v-if="sumWow > 0">
<el-icon style="color:red">
<ArrowUpBold/>
<ArrowUpBold />
</el-icon>
</template>
<template v-else-if="sumWow < 0">
<el-icon style="color:forestgreen">
<ArrowDownBold/>
<ArrowDownBold />
</el-icon>
</template>
<template v-else>
<el-icon style="color:grey">
<SemiSelect/>
<SemiSelect />
</el-icon>
</template>
</el-col>
<el-col class="center-card">日环比:{{ sumDaily }}%&nbsp;&nbsp;&nbsp;&nbsp;
<template v-if="sumDaily > 0">
<el-icon style="color:red">
<ArrowUpBold/>
<ArrowUpBold />
</el-icon>
</template>
<template v-else-if="sumDaily < 0">
<el-icon style="color:forestgreen">
<ArrowDownBold/>
<ArrowDownBold />
</el-icon>
</template>
<template v-else>
<el-icon style="color:grey">
<SemiSelect/>
<SemiSelect />
</el-icon>
</template>
</el-col>
@ -136,56 +128,42 @@
</el-col>
</el-row>
<el-row :gutter="10" style="margin-top: 20px">
<el-col :span="24">
<el-card style="width: 100%">
<el-row style="margin-top: 20px">
<el-card>
<el-row>
<el-col :span="21">
<el-col>
<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>
</el-col>
<el-col :span="24">
<el-row>
<div style="margin-top:5px">合计&nbsp;
永久金币 {{
activeTab === 'recharge' ? sumRechargePermanent / 100 : sumConsumePermanent / 100
}}
免费金币 {{
activeTab === 'recharge' ? sumRechargeFree / 100 : sumConsumeFree / 100
}}
任务金币 {{
activeTab === 'recharge' ? sumRechargeTask / 100 : sumConsumeTask / 100
}}
</div>
<div @change="handleDatePickerChange">
<el-button @click="getToday()" label="day" style="margin-left:250px"
:type="activeTimeRange === 'today' ? 'primary' : ''">今日
</el-button>
<el-button @click="getWeek()" label="week" :type="activeTimeRange === 'week' ? 'primary' : ''">本周
</el-button>
<el-button @click="getMonth()" label="month" :type="activeTimeRange === 'month' ? 'primary' : ''">本月
</el-button>
<el-button @click="getYear()" label="year" :type="activeTimeRange === 'year' ? 'primary' : ''">本年
</el-button>
</div>
<el-date-picker v-model="dateRange" type="datetimerange" range-separator="" start-placeholder="开始时间"
end-placeholder="结束时间" style="margin-left:10px" format="YYYY-MM-DD HH:mm:ss"
value-format="YYYY-MM-DD HH:mm:ss"/>
<el-button type="primary" style="margin-left: 5px" @click="getChartData">查询</el-button>
</el-row>
</el-col>
<div style="margin-top:5px;width:40vw">合计&nbsp;
永久金币 {{ activeTab === 'recharge' ? sumRechargePermanent / 100 : sumConsumePermanent / 100 }}&nbsp;&nbsp;
免费金币 {{ activeTab === 'recharge' ? sumRechargeFree / 100 : sumConsumeFree / 100 }}&nbsp;&nbsp;
任务金币 {{ activeTab === 'recharge' ? sumRechargeTask / 100 : sumConsumeTask / 100 }}
</div>
<div @change="handleDatePickerChange" style="width:15vw">
<el-button @click="getToday()" :type="activeTimeRange === 'today' ? 'primary' : ''">今日
</el-button>
<el-button @click="getWeek()" :type="activeTimeRange === 'week' ? 'primary' : ''">本周
</el-button>
<el-button @click="getMonth()" :type="activeTimeRange === 'month' ? 'primary' : ''">本月
</el-button>
<el-button @click="getYear()" :type="activeTimeRange === 'year' ? 'primary' : ''">本年
</el-button>
</div>
<div style="width:25vw">
<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" />
<el-button type="primary" style="margin-left: 5px" @click="getChartData">查询</el-button>
</div>
</el-row>
<el-row :gutter="20" style="margin-top: 20px">
<el-col :span="18">
<div class="bar">
<!-- <div v-if="chartLoading" class="loading-overlay">-->
<!-- <div class="loading-spinner"></div>-->
<!-- </div>-->
<div ref="chartRef" style="width: 100%; height: 400px"></div>
</div>
</el-col>
@ -215,21 +193,20 @@
</el-col>
</el-row>
</el-card>
</el-col>
</el-row>
</template>
<script setup>
import * as echarts from 'echarts'
import {ref, onMounted, nextTick, watch, onUnmounted} from 'vue'
import { ref, onMounted, nextTick, watch, onUnmounted } from 'vue'
import API from '@/util/http'
import {ElMessage} from 'element-plus'
import { ElMessage } from 'element-plus'
import dayjs from 'dayjs';
import utc from 'dayjs-plugin-utc'
dayjs.extend(utc)
import {ArrowUpBold, ArrowDownBold, SemiSelect} from '@element-plus/icons-vue'
import {marketMapping} from "@/utils/marketMap.js";
import { ArrowUpBold, ArrowDownBold, SemiSelect } from '@element-plus/icons-vue'
import { marketMapping } from "@/utils/marketMap.js";
//
@ -320,7 +297,7 @@ const formatDate = function (date) {
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.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)
@ -628,7 +605,7 @@ const updateChart = (chartData) => {
type: 'bar',
stack: 'recharge',
data: chartData.rechargePermanent,
itemStyle: {color: '#5470c6'},
itemStyle: { color: '#5470c6' },
barWidth: 30
},
{
@ -636,7 +613,7 @@ const updateChart = (chartData) => {
type: 'bar',
stack: 'recharge',
data: chartData.rechargeFree,
itemStyle: {color: '#91cc75'},
itemStyle: { color: '#91cc75' },
barWidth: 30
},
{
@ -644,7 +621,7 @@ const updateChart = (chartData) => {
type: 'bar',
stack: 'recharge',
data: chartData.rechargeTask,
itemStyle: {color: '#fac858'},
itemStyle: { color: '#fac858' },
barWidth: 30
}
]
@ -656,7 +633,7 @@ const updateChart = (chartData) => {
type: 'bar',
stack: 'consume',
data: chartData.consumePermanent,
itemStyle: {color: '#5470c6'},
itemStyle: { color: '#5470c6' },
barWidth: 30
},
{
@ -664,7 +641,7 @@ const updateChart = (chartData) => {
type: 'bar',
stack: 'consume',
data: chartData.consumeFree,
itemStyle: {color: '#91cc75'},
itemStyle: { color: '#91cc75' },
barWidth: 30
},
{
@ -672,7 +649,7 @@ const updateChart = (chartData) => {
type: 'bar',
stack: 'consume',
data: chartData.consumeTask,
itemStyle: {color: '#fac858'},
itemStyle: { color: '#fac858' },
barWidth: 30
}
]
@ -753,7 +730,7 @@ const handleTabChange = () => {
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('用户信息', adminData.value)
} catch (error) {
@ -763,7 +740,7 @@ const getAdminData = async function () {
//
const getCardData = async () => {
try {
const response = await API({url: '/workbench/getCard', data: {}})
const response = await API({ url: '/workbench/getCard', data: {} })
workDataUpdateTime.value = response.updateTime
//
sumWow.value = response.sumWow.toFixed(2)
@ -848,29 +825,6 @@ onUnmounted(() => {
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
}
/* 添加加载动画 */
.loading-overlay {
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
background: rgba(255, 255, 255, 0.8);
display: flex;
justify-content: center;
align-items: center;
z-index: 10;
}
.loading-spinner {
width: 40px;
height: 40px;
border: 4px solid #f3f3f3;
border-top: 4px solid #3498db;
border-radius: 50%;
animation: spin 1s linear infinite;
}
@keyframes spin {
0% {
transform: rotate(0deg);

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

Loading…
Cancel
Save