Browse Source

Merge branch 'milestone-20250728-金币前端三期' into zhangrenyuan/feature-20250728113353-金币前端三期

zhangrenyuan/feature-20250728113353-金币前端三期
zhangrenyuan 19 hours ago
parent
commit
df11b972f0
  1. 25
      src/main.ts
  2. 17
      src/router/index.js
  3. 14
      src/util/request.js
  4. 88
      src/views/audit/gold/rechargeAudit.vue
  5. 92
      src/views/audit/gold/refundAudit.vue
  6. 14
      src/views/consume/bean/addBeanConsume.vue
  7. 16
      src/views/consume/gold/coinConsumeDetail.vue
  8. 21
      src/views/permissions/rolePermission.vue
  9. 27
      src/views/permissions/userPermission.vue
  10. 14
      src/views/recharge/addBeanRecharge.vue
  11. 34
      src/views/recharge/gold/addCoinRecharge.vue
  12. 21
      src/views/recharge/gold/coinRechargeDetail.vue
  13. 18
      src/views/refund/gold/coinRefundDetail.vue
  14. 53
      src/views/usergold/gold/clientCountBalance.vue
  15. 19
      src/views/usergold/gold/clientCountDetail.vue

25
src/main.ts

@ -12,16 +12,24 @@ 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, {
// 先注册组件再挂载
app.component('downloadExcel', JsonExcel)
app.config.globalProperties.$http = request
// 使用各种插件
app.use(ElementPlus, {
locale: zhCn
})
.use(router)
@ -30,9 +38,6 @@ a.use(ElementPlus, {
.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)
}
)

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

@ -2,32 +2,40 @@
<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-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 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 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-cascader v-model="selectedMarketPath" :options="market" placeholder="请选择所属地区" clearable
style="width:12vw"
@change="handleMarketChange"/>
</el-col>
<el-col>
<el-text size="large">充值时间</el-text>
<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" />
@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-button @click="handleSearch" type="primary">查询</el-button>
</el-col>
</el-card>
<el-card>
@ -36,7 +44,9 @@
<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;
@ -49,10 +59,12 @@
<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 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>
@ -62,8 +74,8 @@
<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="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"
@ -74,10 +86,10 @@
<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="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" />
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') }}
@ -85,7 +97,12 @@
</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') }}
<!-- {{ moment(scope.row.createTime).format('YYYY-MM-DD HH:mm:ss') }}-->
{{
activeName === 'wait'
? moment(scope.row.auditTime).format('YYYY-MM-DD HH:mm:ss')
: 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">
@ -103,7 +120,8 @@
</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 :disabled="scope.row.auditStatus === 1 || scope.row.auditStatus === 2" type="primary" text
@click="showRejectDialog(scope.row)">
驳回
</el-button>
</div>
@ -121,7 +139,8 @@
<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 />
<el-input v-model="rejectReason" type="textarea" :rows="4" placeholder="请输入驳回理由" maxlength="200"
show-word-limit/>
</el-form-item>
</el-form>
<template #footer>
@ -134,18 +153,23 @@
</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 request from '@/util/http.js'
import API from '@/util/http.js'
import moment from 'moment'
import { useAdminStore } from "@/store/index.js";
import { storeToRefs } from "pinia";
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"
const {adminData, menuTree} = storeToRefs(adminStore);
import {findMenuById, permissionMapping} from "@/utils/menuTreePermission.js"
import dayjs from "dayjs";
const defaultTime = [
new Date(2000, 1, 1, 0, 0, 0),
new Date(2000, 2, 1, 23, 59, 59),
]
const tableData = ref([])
//
const activeTimeRange = ref('')
@ -208,7 +232,7 @@ const stats = ref({
})
//
const rules = reactive({
rejectReason: [{ required: true, message: '请输入驳回理由', trigger: 'blur' }]
rejectReason: [{required: true, message: '请输入驳回理由', trigger: 'blur'}]
})
//
const getRecharge = async function (val) {
@ -414,7 +438,7 @@ const handleApprove = async (row) => {
action: 1,
rejectReason: ''
}
await request({ url: '/audit/audit', data: params })
await request({url: '/audit/audit', data: params})
ElMessage.success('审核通过成功')
await getRecharge()
await getStats()
@ -452,7 +476,7 @@ const handleReject = async () => {
rejectReason: rejectReason.value
}
await request({ url: '/audit/audit', data: params })
await request({url: '/audit/audit', data: params})
ElMessage.success('驳回操作成功')
rejectDialogVisible.value = false
await getRecharge()
@ -523,7 +547,7 @@ const handleMarketChange = (value) => {
}
}
const props = { multiple: true }
const props = {multiple: true}
//
const getMarket = async function () {
try {

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

@ -2,27 +2,33 @@
<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-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-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-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-cascader v-model="selectedMarketPath" :options="market" placeholder="请选择所属地区" clearable
style="width:12vw"
@change="handleMarketChange"/>
</el-col>
<el-col>
<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" />
<el-text size="large">
{{ activeName === 'wait' ? '提交时间:' : '审核时间:' }}
</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>
@ -47,18 +53,18 @@
</div>
<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 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 }}
@ -79,14 +85,20 @@
{{ row.taskGold / 100 }}
</template>
</el-table-column>
<el-table-column prop="remark" label="备注" width="150" show-overflow-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') }}
<!-- {{ moment(row.createTime).format('YYYY-MM-DD HH:mm:ss') }}-->
{{
checkTab === 'pending'
? moment(row.auditTime).format('YYYY-MM-DD HH:mm:ss')
: moment(row.createTime).format('YYYY-MM-DD HH:mm:ss')
}}
</template>
</el-table-column>
<el-table-column v-if="checkTab !== 'pending'" prop="auditTime" label="审核时间" width="180" sortable="custom">
@ -113,7 +125,8 @@
</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"
layout="total, sizes, prev, pager, next, jumper" :total="pagination.total"
@size-change="handlePageSizeChange"
@current-change="handleCurrentChange"></el-pagination>
</el-card>
@ -121,7 +134,7 @@
<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>
@ -134,17 +147,21 @@
</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 adminStore = useAdminStore();
const { adminData, menuTree } = storeToRefs(adminStore);
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),
]
//
const activeTimeRange = ref('')
const scopeValue = ref(null) //
@ -177,6 +194,7 @@ const tableData = ref([])
const marketOptions = ref([])
const refundGoodsOptions = ref([])
const adminInfo = ref({})
//
const stats = ref({
totalNum: 0,
@ -224,7 +242,7 @@ const showRejectDialog = (row) => {
//
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)
@ -269,7 +287,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)
@ -284,11 +302,11 @@ 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()
@ -312,11 +330,11 @@ 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()
@ -523,7 +541,7 @@ const format3 = (num) => {
}
//
const rules = reactive({
reason: [{ required: true, message: '请输入驳回理由', trigger: 'blur' }]
reason: [{required: true, message: '请输入驳回理由', trigger: 'blur'}]
})
const handlePageSizeChange = function (val) {
pagination.value.pageSize = val
@ -544,7 +562,7 @@ onMounted(async () => {
<style scoped>
.pagination {
display: flex;
margin-top:0.5vh;
margin-top: 0.5vh;
}
.operation {

14
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('请输入非负整数'));
@ -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

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

@ -633,10 +633,10 @@ const getMarket = async function () {
<el-col>
<el-card>
<div>
消耗总金额{{ 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) }}
消耗新币{{ format3(Math.abs(permanentGolds) ) }}新币&nbsp;&nbsp;&nbsp;&nbsp;
永久金币{{ format3(Math.abs(permanentGolds) ) }}&nbsp;&nbsp;&nbsp;&nbsp;
免费金币{{ format3(Math.abs(freeGolds) ) }}&nbsp;&nbsp;&nbsp;&nbsp;
任务金币{{ format3(Math.abs(taskGolds) ) }}
</div>
<!-- 设置表格容器的高度和滚动样式 -->
<div style="height: 576px; overflow-y: auto">
@ -672,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>

21
src/views/permissions/rolePermission.vue

@ -189,19 +189,13 @@ const getStore = async function () {
}
//
const openPermissionAddVisible = function () {
permissionAddVisible.value = true
getRoles()
getLists()
}
const closePermissionAddVisible = function () {
addRole.value = {
roleName: '',
parentId: null,
checkedKeys: [],
grade: '',
market: ''
}
permissionAddVisible.value = false
Ref.value.resetFields();
getRoleList()
@ -211,7 +205,10 @@ const closePermissionAddVisible = function () {
const permissionAddInit = function () {
openPermissionAddVisible()
}
const handleDialogClose = function(){
closePermissionAddVisible()
console.log('hhh');
}
// ref
const Ref = ref(null)
@ -388,9 +385,7 @@ const filterGoldenBeanMenus = (tree) => {
});
};
const handleMarketChange = () => {
getLists(); //
};
const treeRef = ref(null)
//
@ -759,7 +754,7 @@ onMounted(async function () {
</el-dialog>
<!-- 新增角色 -->
<el-dialog v-model="permissionAddVisible" title="新增角色" width="800px" :close-on-click-modal="false">
<el-dialog v-model="permissionAddVisible" title="新增角色" width="800px" :close-on-click-modal="false" @close="handleDialogClose ">
<template #footer>
<el-form ref="Ref" :rules="Rolerules" :model="addRole" label-width="auto"
style="max-width: 600px; align-items: center">
@ -774,7 +769,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: 220px" clearable @change="handleMarketChange" >
<el-select v-model="addRole.market" placeholder="请选择所属地区" style="width: 220px" clearable >
<el-option v-for="item in addRoleMarket" :key="item" :label="item" :value="item"/>
</el-select>
</el-form-item>

27
src/views/permissions/userPermission.vue

@ -8,7 +8,10 @@ import API from '@/util/http'
//
const tableData = ref([])
const total = ref(100)
const handleDialogClose = function(){
closeUserAddVisible()
console.log('hhh');
}
const propsAdduser = {
multiple: true, //
}
@ -246,30 +249,10 @@ const getStore = async function () {
//
const openUserAddVisible = function () {
userAddVisible.value = true
addAdmin.value = {
account: '',
name: '',
market: '',
permission: '',
postiton: '',
machineId: '',
machineIds: [''],
remark: ''
};
}
//
const closeUserAddVisible = function () {
addAdmin.value = {
account: '',
name: '',
market: '',
permission: '',
postiton: '',
machineId: '',
machineIds: [''],
remark: ''
};
userAddVisible.value = false;
//
Ref.value.resetFields();
@ -1009,7 +992,7 @@ onMounted(async function () {
</div>
<!-- 新增用户权限 -->
<el-dialog v-model="userAddVisible" title="新增用户权限" width="800px" :close-on-click-modal="false">
<el-dialog v-model="userAddVisible" title="新增用户权限" width="800px" :close-on-click-modal="false" @close="handleDialogClose">
<template #footer>
<!-- 居中显示 -->

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

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

@ -63,9 +63,9 @@ const recharge = ref({
activity: '', // activity
voucher: '',
rechargeWay: '客服充值',
freeGold: "0",
freeGold: "",
money: null,
permanentGold: "0",
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;
}
@ -115,9 +116,9 @@ const add = async function () {
recharge.value.market = adminData.value.market
recharge.value.voucher = ''
recharge.value.rechargeWay = '客服充值'
recharge.value.freeGold = '0'
recharge.value.freeGold = ''
recharge.value.money = null
recharge.value.permanentGold = '0'
recharge.value.permanentGold = ''
recharge.value.rateId = null
imageUrl.value = ''
recharge.value.rateName = null
@ -130,9 +131,14 @@ 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) {
if (Number(recharge.value.permanentGold) === 0 && Number(recharge.value.freeGold) === 0) {
ElMessage({
type: 'error',
@ -197,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('不能包含特殊符号或负数'));
@ -235,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('不能包含特殊符号或负数'));
@ -520,9 +532,9 @@ const deleteRecharge = function () {
market: adminData.value.market,
voucher: '',
rechargeWay: '客服充值',
freeGold: Number(),
freeGold: '',
money: null,
permanentGold: Number(),
permanentGold: '',
rateId: null
}
imageUrl.value = ''
@ -568,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="充值金额">

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

@ -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()
@ -469,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') {
@ -651,9 +652,9 @@ const getTagText = (state) => {
<el-col>
<el-card>
<div>
充值金额{{ format3(permanentGolds / 100) }}新币&nbsp;&nbsp;&nbsp;&nbsp;
永久金币{{ format3(permanentGolds / 100) }}金币&nbsp;&nbsp;&nbsp;&nbsp;
免费金币{{ format3(freeGolds / 100) }}金币
充值新币{{ format3(permanentGolds) }}新币&nbsp;&nbsp;&nbsp;&nbsp;
永久金币{{ format3(permanentGolds) }}金币&nbsp;&nbsp;&nbsp;&nbsp;
免费金币{{ format3(freeGolds ) }}金币
</div>
<!-- 设置表格容器的高度和滚动样式 -->
@ -678,9 +679,9 @@ const getTagText = (state) => {
<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 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>

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

@ -180,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)
//
@ -569,10 +569,10 @@ const getMarket = async function () {
<el-col>
<el-card>
<div>
退款金币总数{{ 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) }}
退款金币总数{{ format3(Math.abs(sumGolds)) }}&nbsp;&nbsp;&nbsp;&nbsp;
永久金币{{ format3(Math.abs(permanentGolds) ) }}&nbsp;&nbsp;&nbsp;&nbsp;
免费金币{{ format3(Math.abs(freeGolds) ) }}&nbsp;&nbsp;&nbsp;&nbsp;
任务金币{{ format3(Math.abs(taskGolds) ) }}
</div>
<!-- 设置表格容器的高度和滚动样式 -->
<div style="height: 520px; overflow-y: auto;margin-top:10px">

53
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)
//
@ -428,28 +441,28 @@ const format3 = (num) => {
((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>
@ -458,18 +471,18 @@ const format3 = (num) => {
<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>
@ -480,21 +493,21 @@ const format3 = (num) => {
<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>

19
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,9 +223,7 @@ const get = async function (val) {
//
const reset = function () {
goldDetail.value ={
}
goldDetail.value = {}
goldDetail.value.markets = []
selectedMarketPath.value = []
delete sortField.value
@ -594,23 +599,23 @@ const format3 = (num) => {
: 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"/>

Loading…
Cancel
Save