4 Commits

  1. 4
      .env.development
  2. 79
      src/router/index.js
  3. 465
      src/views/audit/rechargeAudit.vue
  4. 864
      src/views/audit/refundAudit.vue
  5. 143
      src/views/consume/addCoinConsume.vue
  6. 197
      src/views/consume/coinConsumeDetail.vue
  7. 270
      src/views/home.vue
  8. 20
      src/views/index.vue
  9. 47
      src/views/login.vue
  10. 244
      src/views/managerecharge/rate.vue
  11. 3
      src/views/permissions/permission.vue
  12. 2
      src/views/recharge/coinRechargeDetail.vue
  13. 94
      src/views/refund/addCoinRefund.vue
  14. 376
      src/views/refund/coinRefundDetail.vue
  15. 5
      src/views/usergold/clientCountDetail.vue
  16. 2
      src/views/workspace/index.vue
  17. 3
      vite.config.ts

4
.env.development

@ -3,6 +3,6 @@
# VITE_API_BASE='https://hwjb.homilychart.com/gold_htms_dev'
# VITE_API_BASE='http://54.251.137.151:10704/'
# VITE_API_BASE='http://192.168.8.225:8080/'
VITE_API_BASE='http://192.168.8.94:8080/'
# VITE_API_BASE='http://192.168.8.247:8080/'
# VITE_API_BASE='http://192.168.8.94:8080/'
VITE_API_BASE='http://192.168.8.247:8081/'

79
src/router/index.js

@ -2,13 +2,13 @@ import { createRouter, createWebHashHistory } from 'vue-router';
const router = createRouter({
history: createWebHashHistory(),
routes: [
{ path: '/login', name: "login", component: () => import("../views/login.vue") },
{ path: '/', redirect: "/login" },
routes: [//此处在做登录之前做成默认跳转工作台
{ path: '/workspace', name: "workspace", component: () => import("../views/workspace/index.vue") },
{ path: '/', redirect: "/workspace" },
// { path: '/test', component: () => import("../views/z.vue") },
{
meta: { requireAuth: true },
path: '/index', component: () => import("../views/index.vue"),
path: '/', component: () => import("../views/home.vue"),
children: [
// 工作台
@ -76,42 +76,43 @@ const router = createRouter({
});
router.beforeEach((to, from, next) => {
const token = localStorage.getItem("token");
const permission = localStorage.getItem("permission");
if (to.name != "login" && !token) {
next({ name: "login" });
} else {
if (permission == "4" && to.name != "noPermission") {
next({ name: "noPermission" });
} else if (permission == "3") {
if (to.name == "addConsume" || to.name == "allConsume"
|| to.name == "addRecharge" || to.name == "adminRecharge" || to.name == "allRecharge"
|| to.name == "addRefund" || to.name == "allRefund"
|| to.name == "permissions") {
next({ name: "workspace" });
} else {
next();
}
} else if (permission == '2') {
if (to.name == "rechargeAudit" || to.name == "refundAudit"
|| to.name == "activity" || to.name == "rate"
|| to.name == "permissions") {
next({ name: "workspace" })
} else {
next();
}
} else if (permission == '5') {
if (to.name == "permissions") {
next({ name: "workspace" })
} else {
next();
}
}
else {
next();
}
// const token = localStorage.getItem("token");
// const permission = localStorage.getItem("permission");
// if (to.name != "login" && !token) {
// next({ name: "login" });
// } else {
// if (permission == "4" && to.name != "noPermission") {
// next({ name: "noPermission" });
// } else if (permission == "3") {
// if (to.name == "addConsume" || to.name == "allConsume"
// || to.name == "addRecharge" || to.name == "adminRecharge" || to.name == "allRecharge"
// || to.name == "addRefund" || to.name == "allRefund"
// || to.name == "permissions") {
// next({ name: "workspace" });
// } else {
// next();
// }
// } else if (permission == '2') {
// if (to.name == "rechargeAudit" || to.name == "refundAudit"
// || to.name == "activity" || to.name == "rate"
// || to.name == "permissions") {
// next({ name: "workspace" })
// } else {
// next();
// }
// } else if (permission == '5') {
// if (to.name == "permissions") {
// next({ name: "workspace" })
// } else {
// next();
// }
// }
// else {
// next();
// }
}
// }
next();
})
export default router;

465
src/views/audit/rechargeAudit.vue

@ -1,46 +1,119 @@
<script setup>
import { ref, onMounted, reactive, computed } from 'vue'
import ElementPlus from 'element-plus'
import { ElMessage, ElMessageBox } from 'element-plus'
import { AiFillRead } from 'vue-icons-plus/ai'
import axios from 'axios'
import {computed, onMounted, reactive, ref, watch} from 'vue'
import {ElMessage} from 'element-plus'
import request from '@/util/http'
import moment from 'moment'
//
const adminData = ref({})
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 trimJwCode = () => {
if (rechargeVo.value.jwcode) {
rechargeVo.value.jwcode = rechargeVo.value.jwcode.replace(/\s/g, '');
}
}
/*
===================数据============================
*/
//
const adminData = ref({})
//
const tableData = ref([])
// ======================================
const tableData1 = ref([])
// // todo
const tableData = ref([
{
name: '测试',
jwcode: 1001,
market: "地区1",
activity: "活动1",
money: 100, //
permanentGold: 100, //
freeGold: 50, //
taskGold: 10, //
remark: "备注备注备注备注备注备注备注备注备注备注备注备注备注备注备注备注备注备注备注备注备注备注备注备注备注备注备注备注备注备注备注备注备注备注备注备注备注备注备注备注备注备注备注备注备注备注备注备注备注备注备注备注",//
reason: "驳回理由驳回理由驳回理由驳回理由驳回理由驳回理由驳回理由驳回理由驳回理由驳回理由驳回理由驳回理由驳回理由驳回理由驳回理由驳回理由驳回理由驳回理由驳回理由驳回理由驳回理由驳回理由驳回理由驳回理由驳回理由",//
payMode: "微信",//
voucher: "https://www.keaitupian.cn/cjpic/frombd/2/253/1659552792/3869332496.jpg",//
adminName: "提交人姓名", //
auditName: "审核人姓名",// //
payTime: "2025-6-28 14:31:20",//
createTime: "2025-6-29 14:31:20",//
auditStatus: 0, // 0123
},
{
name: '测试2',
jwcode: 1002,
market: "地区2",
activity: "活动2",
money: 200, //
permanentGold: 200, //
freeGold: 50, //
taskGold: 10, //
remark: "2备注备注备注备注备注备注备注备注备注备注备注备注备注备注备注备注备注备注备注备注备注备注备注备注备注备注备注备注备注备注备注备注备注备注备注备注备注备注备注备注备注备注备注备注备注备注备注备注备注备注备注备注",//
reason: "2驳回理由驳回理由驳回理由驳回理由驳回理由驳回理由驳回理由驳回理由驳回理由驳回理由驳回理由驳回理由驳回理由驳回理由驳回理由驳回理由驳回理由驳回理由驳回理由驳回理由驳回理由驳回理由驳回理由驳回理由驳回理由",//
payMode: "2微信",//
voucher: "https://www.keaitupian.cn/cjpic/frombd/2/253/1659552792/3869332496.jpg",//
adminName: "提交人姓名", //
auditName: "审核人姓名",// //
payTime: "3025-6-28 14:31:20",//
createTime: "3025-6-29 14:31:20",//
auditStatus: 1, // 0123
},
])
/*
name: '',
jwcode: null,
market: "",
activity: "",
money: null, //
permanentGold: null, //
freeGold: null, //
taskGold: null, //
remark: "",//
reason: "",//
payMode: "",//
voucher: "",//
/!* adminId: null, // 提交人id
auditId:null,// id*!/
adminName: "", //
auditName: "",// //
payTime: "",//
createTime: "",//
auditStatus: null, // 0123
*/
//
const rechargeVo = ref({
rechargeWay: '客服充值'
jwcode: null,//
activity: "", //
payMode: "",//
startTime: "", //
endTime: "", //
market: "",//
})
//
const getObj = ref({
pageNum: 1,
pageSize: 50
})
//
const total = ref(100)
const total = ref(50)
//
const getTime = ref([])
//
const activity = ref([])
//
const area = ref([])
const market = ref([])
//
const rejectVisible = ref(false)
//
@ -50,7 +123,7 @@ const passObj = ref({})
//
const activeName = ref('wait')
//
const payWay = [
const payMode = [
{
value: '微信',
label: '微信'
@ -74,17 +147,12 @@ const payWay = [
]
// ref
const Ref = ref(null)
//
//
const trueGold = ref(0)
const trueCount = ref(0)
const trueRGold = ref(0)
const trueFGold = ref(0)
//
const formattedTrueGold = computed(() => trueGold.value.toFixed(2))
const formattedTrueRGold = computed(() => trueRGold.value.toFixed(2))
const formattedTrueFGold = computed(() => trueFGold.value.toFixed(2))
//
const pendingCount = ref(0)
//
@ -103,46 +171,79 @@ const rejectedCount = ref(0)
const rejectedGold = ref(0)
const rejectedRGold = ref(0)
const rejectedFGold = ref(0)
//
const sortField = ref('')
const sortOrder = ref('')
//
const rules = reactive({
reason: [{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 get = async function (val) {
try {
//
if (adminData.value.area === '泰国') {
rechargeVo.value.areas = ['泰国', '越南']
}
//
if (typeof val === 'number') {
getObj.value.pageNum = val
}
//
if (getTime.value != null) {
if (getTime.value.startDate != '' && getTime.value.endDate != '') {
rechargeVo.value.startDate = getTime.value[0]
rechargeVo.value.endDate = getTime.value[1]
if (getTime.value.startTime != '' && getTime.value.endTime != '') {
rechargeVo.value.startTime = getTime.value[0]
rechargeVo.value.endTime = getTime.value[1]
}
} else {
rechargeVo.value.startDate = ''
rechargeVo.value.endDate = ''
rechargeVo.value.startTime = ''
rechargeVo.value.endTime = ''
}
rechargeVo.value.sortField = sortField.value
rechargeVo.value.sortOrder = sortOrder.value
console.log('搜索参数', getObj.value)
//
const result = await request({
url: '/recharge/recharge',
url: '/recharge/recharge', // todo
data: {
pageNum: getObj.value.pageNum,
pageSize: getObj.value.pageSize,
rechargeVo: { ...rechargeVo.value }
rechargeVo: { //
...rechargeVo.value,
sortField: sortField.value,
sortOrder: sortOrder.value
}
}
})
//
// rechargeVo.value
const rechargeVo1 = { ...rechargeVo.value }
const rechargeVo1 = {...rechargeVo.value}
delete rechargeVo1.sortField
delete rechargeVo1.sortOrder
delete rechargeVo1.status
delete rechargeVo1.auditStatus
const result2 = await request({
url: '/recharge/recharge/RechargeA',
url: '/recharge/recharge/RechargeA', // todo
data: rechargeVo1
})
//
@ -189,6 +290,7 @@ const get = async function (val) {
console.log('请求失败', error)
}
}
//
const search = function () {
trimJwCode();
@ -197,28 +299,28 @@ const search = function () {
}
//
const reset = function () {
delete rechargeVo.value.activityId
delete rechargeVo.value.activity
delete rechargeVo.value.jwcode
delete rechargeVo.value.payWay
delete rechargeVo.value.area
delete rechargeVo.value.startDate
delete rechargeVo.value.endDate
delete rechargeVo.value.payMode
delete rechargeVo.value.market
delete rechargeVo.value.startTime
delete rechargeVo.value.endTime
getTime.value = {}
}
//
const getToday = function () {
const today = new Date()
const startDate = new Date(
today.getFullYear(),
today.getMonth(),
today.getDate()
const startTime = new Date(
today.getFullYear(),
today.getMonth(),
today.getDate()
)
const endDate = new Date(
today.getFullYear(),
today.getMonth(),
today.getDate() + 1
const endTime = new Date(
today.getFullYear(),
today.getMonth(),
today.getDate() + 1
)
getTime.value = [startDate, endDate]
getTime.value = [startTime, endTime]
console.log('getTime', getTime.value)
get()
}
@ -227,14 +329,14 @@ const getYesterday = function () {
const yesterday = new Date()
yesterday.setDate(yesterday.getDate() - 1)
const startDate = new Date(
yesterday.getFullYear(),
yesterday.getMonth(),
yesterday.getDate()
yesterday.getFullYear(),
yesterday.getMonth(),
yesterday.getDate()
)
const endDate = new Date(
yesterday.getFullYear(),
yesterday.getMonth(),
yesterday.getDate() + 1
yesterday.getFullYear(),
yesterday.getMonth(),
yesterday.getDate() + 1
)
getTime.value = [startDate, endDate]
console.log('getTime', getTime.value)
@ -244,14 +346,14 @@ const getYesterday = function () {
const get7Days = function () {
const today = new Date()
const startDate = new Date(
today.getFullYear(),
today.getMonth(),
today.getDate() - 6
today.getFullYear(),
today.getMonth(),
today.getDate() - 6
)
const endDate = new Date(
today.getFullYear(),
today.getMonth(),
today.getDate() + 1
today.getFullYear(),
today.getMonth(),
today.getDate() + 1
)
getTime.value = [startDate, endDate]
console.log('getTime', getTime.value)
@ -259,10 +361,11 @@ const get7Days = function () {
}
//
const adminWait = async function () {
rechargeVo.value.status = 0
rechargeVo.value.auditStatus = 0
getObj.value.pageNum = 1
await get()
console.log('adminWait')
trueCount.value = pendingCount.value
trueGold.value = pendingGold.value
trueRGold.value = pendingRGold.value
@ -270,7 +373,7 @@ const adminWait = async function () {
}
//
const adminPass = async function () {
rechargeVo.value.status = 1
rechargeVo.value.auditStatus = 1
getObj.value.pageNum = 1
await get()
console.log('adminPass')
@ -281,7 +384,7 @@ const adminPass = async function () {
}
//
const adminReject = async function () {
rechargeVo.value.status = 2
rechargeVo.value.auditStatus = 2
getObj.value.pageNum = 1
await get()
console.log('adminReject')
@ -292,6 +395,7 @@ const adminReject = async function () {
}
const handleClick = function (tab, event) {
activeName.value = tab.props.name
if (tab.props.name === 'wait') {
adminWait()
} else if (tab.props.name === 'pass') {
@ -301,6 +405,17 @@ const handleClick = function (tab, event) {
}
}
// watch(activeName, (val) => {
// if (val === 'wait') {
// adminWait()
// } else if (val === 'pass') {
// adminPass()
// } else if (val === 'reject') {
// adminReject()
// }
// })
const getActivity = async function () {
try {
const result = await request({
@ -314,14 +429,14 @@ const getActivity = async function () {
}
}
//
const getArea = async function () {
const getMarket = async function () {
try {
const result = await request({
url: '/recharge/user/search',
url: 'http://192.168.8.247:8081/general/market',
data: {}
})
area.value = result.data
console.log('地区', area.value)
market.value = result.data
console.log('地区', market.value)
} catch (error) {
console.log('请求失败', error)
}
@ -334,6 +449,7 @@ const handleCurrentChange = function (val) {
getObj.value.pageNum = val
get()
}
// ====================================
//
const pass = function (row) {
@ -341,7 +457,7 @@ const pass = function (row) {
passObj.value = row
passObj.value.adminId = adminData.value.adminId
passObj.value.auditId = row.auditId
// passObj.value.status = 1
// passObj.value.auditStatus = 1
passObj.value.rechargeId = row.rechargeId
passObj.value.detailId = row.detailId
passObj.value.jwcode = row.jwcode
@ -351,12 +467,11 @@ const pass = function (row) {
console.log('通过对象', passObj.value)
}
//
const passConfirm = async function () {
try {
//
passObj.value.status = 1
passObj.value.auditStatus = 1
console.log('通过对象', passObj.value)
// POST
// passObj.value.flag = 0;
@ -393,8 +508,8 @@ const reject = function (row) {
//
rejectObj.value.adminId = adminData.value.adminId
rejectObj.value.auditId = row.auditId
rejectObj.value.status = 2
rejectObj.value.reson = ''
rejectObj.value.auditStatus = 2
rejectObj.value.reason = ''
rejectObj.value.rechargeId = row.rechargeId
rejectObj.value.detailId = row.detailId
console.log('驳回对象', rejectObj.value)
@ -430,21 +545,6 @@ const rejectConfirm = async function () {
})
}
//
const rules = reactive({
reson: [{ required: true, message: '请输入驳回理由', trigger: 'blur' }]
})
//
onMounted(async function () {
await getAdminData()
await getActivity()
await get()
await getArea()
})
//
const sortField = ref('')
const sortOrder = ref('')
//
const handleSortChange = (column) => {
console.log('排序字段:', column.prop)
@ -466,12 +566,59 @@ const handleSortChange = (column) => {
get()
}
//
const trimJwCode = () => {
if (rechargeVo.value.jwcode) {
rechargeVo.value.jwcode = rechargeVo.value.jwcode.replace(/\s/g, '');
}
}
//
const previewImage = (imageUrl) => {
// 使 element-plus el-image
const imageElement = document.createElement('img');
imageElement.src = imageUrl;
imageElement.style.maxWidth = '80vw';
imageElement.style.maxHeight = '80vh';
const viewer = document.createElement('div');
viewer.style.position = 'fixed';
viewer.style.top = '0';
viewer.style.left = '0';
viewer.style.width = '100vw';
viewer.style.height = '100vh';
viewer.style.backgroundColor = 'rgba(0, 0, 0, 0.7)';
viewer.style.display = 'flex';
viewer.style.justifyContent = 'center';
viewer.style.alignItems = 'center';
viewer.style.zIndex = '9999';
viewer.style.overflow = 'auto';
viewer.appendChild(imageElement);
document.body.appendChild(viewer);
viewer.addEventListener('click', () => {
document.body.removeChild(viewer);
});
};
/*
===================监听============================
*/
/*
===================计算属性============================
*/
//
const formattedTrueGold = computed(() => trueGold.value.toFixed(2))
const formattedTrueRGold = computed(() => trueRGold.value.toFixed(2))
const formattedTrueFGold = computed(() => trueFGold.value.toFixed(2))
/*
===================挂载============================
*/
//
onMounted(async function () {
await getAdminData()
await getActivity()
await get()
await getMarket()
})
</script>
<template>
@ -480,26 +627,27 @@ const trimJwCode = () => {
<el-card style="margin-bottom: 5px">
<el-row style="margin-bottom: 5px">
<el-col :span="6">
<el-text size="large">精网号</el-text>
<el-input v-model="rechargeVo.jwcode" placeholder="请输入精网号" style="width: 240px" clearable />
<el-text size="large">精网号</el-text>
<el-input v-model="rechargeVo.jwcode" placeholder="请输入精网号" style="width: 240px" clearable/>
</el-col>
<el-col :span="6">
<el-text size="large">活动名称</el-text>
<el-select v-model="rechargeVo.activityId" placeholder="请选择活动名称" style="width: 240px" clearable>
<el-option v-for="item in activity" :key="item.activityId" :label="item.activityName" :value="item.activityId" />
</el-select>
<el-text size="large">活动名称</el-text>
<el-select v-model="rechargeVo.activity" placeholder="请选择活动名称" style="width: 240px" clearable>
<el-option v-for="item in activity" :key="item.activityId" :label="item.activityName"
:value="item.activityId"/>
</el-select>
</el-col>
<el-col :span="6">
<el-text size="large">支付方式</el-text>
<el-select v-model="rechargeVo.payWay" placeholder="请选择支付方式" style="width: 240px" clearable>
<el-option v-for="item in payWay" :key="item.value" :label="item.label" :value="item.value" />
</el-select>
<el-text size="large">支付方式</el-text>
<el-select v-model="rechargeVo.payMode" placeholder="请选择支付方式" style="width: 240px" clearable>
<el-option v-for="item in payMode" :key="item.value" :label="item.label" :value="item.value"/>
</el-select>
</el-col>
<el-col :span="6">
<div class="head-card-element" v-if="adminData.area == '总部'">
<el-text size="large">所属地区</el-text>
<el-select v-model="rechargeVo.area" placeholder="请选择所属地区" style="width: 240px" clearable>
<el-option v-for="item in area" :key="item" :label="item" :value="item" />
<div class="head-card-element" v-if="adminData.market == '总部'">
<el-text size="large">所属地区</el-text>
<el-select v-model="rechargeVo.market" placeholder="请选择所属地区" style="width: 240px" clearable>
<el-option v-for="item in market" :key="item" :label="item" :value="item"/>
</el-select>
</div>
</el-col>
@ -508,12 +656,12 @@ const trimJwCode = () => {
<el-col :span="12">
<div class="time-controls">
<div class="time-group">
<el-text size="large">添加时间</el-text>
<el-text size="large">充值时间</el-text>
<el-date-picker v-model="getTime" type="datetimerange" range-separator="" start-placeholder="起始时间"
end-placeholder="结束时间" style="width: 400px" />
<el-button @click="getToday()" style="margin-left: 10px"> </el-button>
<el-button @click="getYesterday()" style="margin-left: 10px"> </el-button>
<el-button @click="get7Days()" style="margin-left: 10px"> 近7天 </el-button>
end-placeholder="结束时间" style="width: 400px"/>
<el-button @click="getToday()" style="margin-left: 10px"> </el-button>
<el-button @click="getYesterday()" style="margin-left: 10px"> </el-button>
<el-button @click="get7Days()" style="margin-left: 10px"> 近7天</el-button>
</div>
</div>
</el-col>
@ -534,50 +682,72 @@ const trimJwCode = () => {
<el-tab-pane label="已通过" name="pass"></el-tab-pane>
<el-tab-pane label="已驳回" name="reject"></el-tab-pane>
<div>
<div> <!--todo 改这里 总数的-->
总条数{{ trueCount }}&nbsp;&nbsp;&nbsp;&nbsp;
总金币数{{ formattedTrueGold }}金币&nbsp;&nbsp;&nbsp;&nbsp;
永久金币{{ formattedTrueRGold }}金币&nbsp;&nbsp;&nbsp;&nbsp;
免费金币{{ formattedTrueFGold }}金币
</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 :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="username" label="姓名" width="150px" />
<el-table-column fixed="left" prop="jwcode" label="精网号" width="110px" />
<el-table-column prop="area" label="所属地区" width="100px" />
<el-table-column prop="refundType" label="活动名称" width="100px" />
<el-table-column prop="refundGoods" label="充值金额" width="100px" />
<el-table-column prop="rechargeCoin" label="永久金币" width="110px" sortable="custom">
<template #default="scope">{{ scope.row.rechargeCoin }}</template>
<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"/>
<el-table-column prop="money" label="充值金额" sortable="custom" width="110px"/>
<el-table-column prop="permanentGold" label="永久金币" width="110px" sortable="custom">
<template #default="scope">{{ scope.row.permanentGold }}</template>
</el-table-column>
<el-table-column prop="freeCoin" label="免费金币" sortable="custom" width="110px">
<template #default="scope">{{ scope.row.freeCoin }}</template>
<el-table-column prop="freeGold" label="免费金币" sortable="custom" width="110px">
<template #default="scope">{{ scope.row.freeGold }}</template>
</el-table-column>
<el-table-column prop="remark" label="备注" width="200px" show-overflow-tooltip />
<el-table-column prop="freeCoin" label="支付凭证" width="110px" />
<el-table-column prop="adminName" label="提交人" width="100px" />
<el-table-column prop="status" label="付款时间" width="200px" >
<template #default="scope">
<el-table-column prop="remark" label="备注" width="200px" show-overflow-tooltip/>
<el-table-column prop="payMode" label="支付方式" width="110px"/>
<el-table-column prop="voucher" label="支付凭证" width="110px">
<!-- 支付凭证列支持点击放大预览 -->
<template #default="scope">
<div v-if="scope.row.voucher" style="cursor: pointer;" @click="previewImage(scope.row.voucher)">
<img :src="scope.row.voucher" alt="支付凭证" style="width: 80px; height: auto;">
</div>
<div v-else>--</div>
</template>
</el-table-column>
<el-table-column prop="adminName" label="提交人" width="100px"/>
<!--
字太多就悬停显示
-->
<el-table-column prop="reason" 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.createTime).format('YYYY-MM-DD HH:mm:ss') }}
</template>
</el-table-column>
</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 fixed="right" prop="operation" label="操作" width="150px">
<el-table-column v-if="activeName === 'wait'"
fixed="right" prop="operation" label="操作" width="150px">
<template #default="scope">
<div class="operation">
<el-popconfirm title="确定要通过此条记录吗?" @confirm="passConfirm">
<template #reference>
<el-button :disabled="scope.row.status === 1 || scope.row.status === 2
<el-button :disabled="scope.row.auditStatus === 1 || scope.row.auditStatus === 2
? true
: false
" type="primary" text @click="pass(scope.row)">
@ -589,7 +759,7 @@ const trimJwCode = () => {
<el-button type="primary" size="small" @click="confirm">确定</el-button>
</template>
</el-popconfirm>
<el-button :disabled="scope.row.status === 1 || scope.row.status === 2
<el-button :disabled="scope.row.auditStatus === 1 || scope.row.auditStatus === 2
? true
: false
" type="primary" text @click="reject(scope.row)">
@ -603,8 +773,9 @@ const trimJwCode = () => {
<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>
layout="total, sizes, prev, pager, next, jumper" :total="total"
@size-change="handlePageSizeChange"
@current-change="handleCurrentChange"></el-pagination>
</div>
</el-card>
</el-col>
@ -613,15 +784,15 @@ const trimJwCode = () => {
<el-dialog v-model="rejectVisible" title="驳回理由" width="500" :before-close="closeRejectVisible">
<template #footer>
<el-form :model="rejectObj" ref="Ref" :rules="rules" label-width="auto" style="max-width: 600px">
<el-form-item prop="reson" label="驳回理由:">
<el-input v-model="rejectObj.reson" maxlength="150" show-word-limit style="width: 350px" type="textarea"
placeholder="请输入内容" />
<el-form-item prop="reason" label="驳回理由:">
<el-input v-model="rejectObj.reason" maxlength="150" show-word-limit style="width: 350px" type="textarea"
placeholder="请输入内容"/>
</el-form-item>
</el-form>
<div class="dialog-footer">
<el-button @click="closeRejectVisible()">取消</el-button>
<el-button type="primary" @click="rejectConfirm()"> 确定 </el-button>
<el-button type="primary" @click="rejectConfirm()"> 确定</el-button>
</div>
</template>
</el-dialog>

864
src/views/audit/refundAudit.vue
File diff suppressed because it is too large
View File

143
src/views/consume/addCoinConsume.vue

@ -5,8 +5,9 @@ import moment from "moment";
import request from "@/util/http";
/*====================工具方法==============================*/
/*
====================工具方法==============================
*/
//
const trimJwCode = () => {
if (addConsume.value.jwcode) {
@ -23,35 +24,11 @@ const trimJwCode = () => {
}
}
// =====================================================
/*====================方法=================================*/
/*====================监听=================================*/
/*====================挂载=================================*/
//
/*
====================数据=================================
*/
//
const adminData = ref({});
const getAdminData = async function () {
try {//await
const result = await request({
url: "/admin/userinfo",
data: {},
});
adminData.value = result;
addConsume.value.adminId = adminData.value.adminId;
addConsume.value.name = adminData.value.name;
console.log("请求成功", result);
console.log("用户信息", adminData.value);
} catch (error) {
console.log("请求失败", error);
}
};
//
const user = ref({
jwcode: null,
@ -71,12 +48,11 @@ const user = ref({
nowFreeGold: null,
nowSumGold: null
})
//
const addConsume = ref({
// jwcode
jwcode: null, //
goodsName: "",// // todo 3
goodsName: "",//
sumGold: null, //
freeGold: null, //
permanentGold: null, //
@ -85,6 +61,40 @@ const addConsume = ref({
adminId: null,// id
});
//
const Ref = ref(null);
//
const rules = reactive({
jwcode: [{required: true, message: "请输入精网号", trigger: "blur"}],
goodsName: [{required: true, message: "请选择消费商品", trigger: "change"}], // change
sumGold: [
{required: true, message: "消费金币总数不能为空", trigger: "blur"},
],
});
//
const goods = ref([]);
/*
====================方法=================================
*/
const getAdminData = async function () {
try {//await
const result = await request({
url: "/admin/userinfo",
data: {},
});
adminData.value = result;
addConsume.value.adminId = adminData.value.adminId;
addConsume.value.name = adminData.value.name;
console.log("请求成功", result);
console.log("用户信息", adminData.value);
} catch (error) {
console.log("请求失败", error);
}
};
//
function calculateCoins(sumGold) {
@ -119,24 +129,6 @@ function calculateCoins(sumGold) {
return {free: 0, permanent: 0, task: 0};
}
//
watch(
() => addConsume.value.sumGold,
(newValue) => {
if (newValue > 0) {
const {free, permanent, task} = calculateCoins(newValue);
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;
}
}
);
//
function validateInput() {
const sumGold = addConsume.value.sumGold;
@ -170,8 +162,6 @@ function validateInput() {
return true;
}
//
const add = async function () {
try {
@ -201,7 +191,6 @@ const add = async function () {
ElMessage.error("添加失败,请检查网络连接或联系管理员");
}
};
//
function handleResponse(result) {
console.log("响应结果", result)
@ -212,7 +201,6 @@ function handleResponse(result) {
ElMessage.error(result.msg || "添加失败,未知错误");
}
}
//
function resetForm() {
//
@ -251,7 +239,7 @@ function resetForm() {
// user.value.jwcode = null;
// user.value = null;
}
//
const addBefore = () => {
Ref.value.validate(async (valid) => {
if (valid) {
@ -274,22 +262,6 @@ const addBefore = () => {
}
});
};
//
//
const Ref = ref(null);
const rules = reactive({
jwcode: [{required: true, message: "请输入精网号", trigger: "blur"}],
goodsName: [{required: true, message: "请选择消费商品", trigger: "change"}], // change
sumGold: [
{required: true, message: "消费金币总数不能为空", trigger: "blur"},
],
});
//
const getUser = async function (jwcode) {
trimJwCode();
@ -320,10 +292,7 @@ const getUser = async function (jwcode) {
//
}
};
//
const goods = ref([]);
// ()
const getGoods = async function () {
try {
// POST
@ -348,7 +317,30 @@ const getGoods = async function () {
}
};
/*
====================监听=================================
*/
//
watch(
() => addConsume.value.sumGold,
(newValue) => {
if (newValue > 0) {
const {free, permanent, task} = calculateCoins(newValue);
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;
}
}
);
/*
====================挂载=================================
*/
//
onMounted(async function () {
await getAdminData();
@ -356,7 +348,6 @@ onMounted(async function () {
});
</script>
<template>

197
src/views/consume/coinConsumeDetail.vue

@ -1,33 +1,24 @@
<script setup>
import {onMounted, ref} from 'vue'
import {computed, onMounted, ref} from 'vue'
import {dayjs, ElMessage} from 'element-plus'
import request from '@/util/http'
//
/*
====================工具方法==============================
*/
//
const formatTime = (val) => val ? dayjs(val).format('YYYY-MM-DD HH:mm:ss') : ''
//
/*
====================数据=================================
*/
//
const adminData = ref({})
const getAdminData = async function () {
try {
const result = await request({
url: '/admin/userinfo',
data: {}
})
adminData.value = result
console.log('请求成功', result)
console.log('用户信息', adminData.value)
} catch (error) {
console.log('请求失败', error)
}
}
//
const tableData = ref([])
// ======================================
// consumeUser
const consumeUser = ref({
@ -38,8 +29,12 @@ const consumeUser = ref({
startTime: '',
endTime: '',
goodsName: ""
goodsName: '',
})
//
const getObj = ref({
pageNum: 1,
@ -92,11 +87,39 @@ const permanentGold = ref(0)
const freeGold = ref(0)
const taskGold = ref(0)
const totalGold = ref(0)
//
const permanentGolds = ref(0)
const freeGolds = ref(0)
const taskGolds = ref(0)
//
const goods = ref([])
//
const totalGoldSearch = ref({
payPlatform: "",
market: "",
startTime: "",
endTime: "",
goodsName: ""
})
/*
====================方法=================================
*/
//
const getAdminData = async function () {
try {
const result = await request({
url: '/admin/userinfo',
data: {}
})
adminData.value = result
console.log('请求成功', result)
console.log('用户信息', adminData.value)
} catch (error) {
console.log('请求失败', error)
}
}
// =========================================================================================================================================================
//
const ConsumeSelectBy = async function (val) {
try {
@ -127,62 +150,82 @@ const ConsumeSelectBy = async function (val) {
// POST
const result = await request({
// url: 'consumeUser/selectBy',
url: 'http://192.168.8.247:8081/consume/selectBy',
data: {
pageNum: getObj.value.pageNum,
pageSize: getObj.value.pageSize,
consumeUser: consumeUser.value
consumeUser: {
...consumeUser.value,
sortField: sortField.value,
sortOrder: sortOrder.value
}
}
})
console.log('请求成功2', sortField)
//
// detail.value
const detailWithoutSort = {...consumeUser.value}
delete detailWithoutSort.sortField
delete detailWithoutSort.sortOrder
//
const result2 = await request({
//
totalGoldSearch.value.startTime = consumeUser.value.startTime
totalGoldSearch.value.endTime = consumeUser.value.endTime
totalGoldSearch.value.payPlatform = consumeUser.value.payPlatform
totalGoldSearch.value.market = consumeUser.value.market
totalGoldSearch.value.goodsName = consumeUser.value.goodsName
//
const resultTotalGold = await request({
// url: 'http://192.168.8.247:8081/consume/statsGold',
url: 'http://192.168.8.247:8081/consume/statsGold',
data: {
...detailWithoutSort
}
data: totalGoldSearch.value
})
//
console.log('请求成功', result)
console.log('请求成功2', result2)
console.log("总计", resultTotalGold)
if (resultTotalGold.code === 200 && resultTotalGold.data) {
const data = resultTotalGold.data
console.log('获取到的金币数据:', data)
permanentGolds.value = Number(data.permanentGolds) || 0
freeGolds.value = Number(data.freeGolds) || 0
taskGolds.value = Number(data.taskGolds) || 0
}
//
tableData.value = result.data.list
tableDataTotal.value = result2.data
if (result2.data == null) {
console.log('请求成功2', result2)
tableDataTotal.value = resultTotalGold.data
if (resultTotalGold.data == null) {
console.log('请求成功2', resultTotalGold)
// 西
tableDataTotal.value = {
sumRcion: 0,
sumFcion: 0,
sumTcion: 0,
sumcion: 0
}
tableDataTotal.value = resultTotalGold.data
}
console.log('tableDataT', tableDataTotal)
//
permanentGold.value = parseFloat(
(tableDataTotal.value.sumRcion / 100).toFixed(2)
)
freeGold.value = parseFloat(
(tableDataTotal.value.sumFcion / 100).toFixed(2)
)
taskGold.value = parseFloat(
(tableDataTotal.value.sumTcion / 100).toFixed(2)
)
totalGold.value = parseFloat(
(tableDataTotal.value.sumcion / 100).toFixed(2)
)
const sumGoldList = tableData.value.map(item => item.sumGold);
console.log("sumGold", sumGoldList); // sumGold
console.log('@@@@@@@@@@tableDataT', tableDataTotal.value.list)
// totalGold.value = tableData.value.sum
// //
// permanentGold.value = parseFloat(
// (tableDataTotal.value.list.sumGold / 100).toFixed(2)
// )
// freeGold.value = parseFloat(
// (tableDataTotal.value.sumFcion / 100).toFixed(2)
// )
// taskGold.value = parseFloat(
// (tableDataTotal.value.sumTcion / 100).toFixed(2)
// )
// totalGold.value = parseFloat(
// (tableDataTotal.value.sumcion / 100).toFixed(2)
// )
console.log('tableData', tableData.value)
//
@ -273,9 +316,7 @@ const get7Days = function () {
console.log('getTime', getTime.value)
ConsumeSelectBy()
}
//
const goods = ref([])
//
const getGoods = async function () {
try {
// POST
@ -299,7 +340,6 @@ const getMarket = async function () {
try {
//
const result = await request({
// todo
// url: '/general/market',
url: 'http://192.168.8.247:8081/general/market', // todo
data: {}
@ -317,19 +357,18 @@ const getMarket = async function () {
}
}
//
const handleSortChange = (column) => {
console.log('排序字段:', column.prop)
console.log('排序方式:', column.order)
if (column.prop === 'permanentGold') {
sortField.value = 'recharge_coin'
sortField.value = 'permanentGold'
} else if (column.prop === 'taskGold') {
sortField.value = 'task_coin'
sortField.value = 'taskGold'
} else if (column.prop === 'freeGold') {
sortField.value = 'free_coin'
sortField.value = 'freeGold'
} else if (column.prop === 'createTime') {
sortField.value = 'create_time'
sortField.value = 'createTime'
}
sortOrder.value = column.order === 'ascending' ? 'DESC' : 'ASC'
ConsumeSelectBy()
@ -370,7 +409,23 @@ const checkNumber = function () {
})
}
}
//
/*
====================计算属性=================================
*/
//
const sumGold = computed(() => permanentGolds.value + freeGolds.value + taskGolds.value)
/*
====================监听=================================
*/
/*
====================挂载=================================
*/
onMounted(async function () {
await getAdminData()
await ConsumeSelectBy()
@ -500,9 +555,9 @@ onMounted(async function () {
<el-col>
<el-card>
<div>
消耗金额{{ Math.abs(totalGold) }}新币永久金币{{ Math.abs(permanentGold) }}免费金币{{
Math.abs(freeGold)
}}任务金币{{ Math.abs(taskGold) }}
消耗金额{{ Math.abs(sumGold) }}新币永久金币{{ Math.abs(permanentGolds) }}免费金币{{
Math.abs(freeGolds)
}}任务金币{{ Math.abs(taskGolds) }}
</div>
<!-- 设置表格容器的高度和滚动样式 -->
<div style="height: 576px; overflow-y: auto">
@ -592,7 +647,7 @@ onMounted(async function () {
</template>
</el-table-column>
<el-table-column
prop="taskCold"
prop="taskGold"
label="任务金币"
sortable="“custom”"
width="110px"

270
src/views/home.vue

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

20
src/views/index.vue

@ -56,16 +56,16 @@ const message = function () {
// machineId
function logout() {
const machineId = localStorage.getItem('machineId')
console.log('machineId:', machineId)
localStorage.removeItem('token')
// localStorage.clear();
router.push('/login?machineId=' + machineId)
//
// window.location.reload();
ElMessage.success('退出成功')
}
// function logout() {
// const machineId = localStorage.getItem('machineId')
// console.log('machineId:', machineId)
// localStorage.removeItem('token')
// // localStorage.clear();
// router.push('/login?machineId=' + machineId)
// //
// // window.location.reload();
// ElMessage.success('退')
// }
//
onMounted(async function () {

47
src/views/login.vue

@ -27,9 +27,7 @@ getMachineId()
const router = useRouter() //
let formData = new FormData()
// FormData
// formData.append("jwcode", form.value.jwcode);
// formData.append("password", form.value.password);
const form = ref({ jwcode: '', password: '', token: '', machineId: machineId })
//
@ -63,7 +61,7 @@ const login = async function () {
} catch (error) {
console.log('请求失败', error)
ElMessage.error('登录失败,请检查账号密码')
//
}
}
@ -78,7 +76,7 @@ const login = async function () {
class="bg"
fit="fit"
/>
<!-- <div style="height: 100vh; width: 1000px" class="container"></div> -->
<el-col :span="6" :offset="3" class="form">
<!-- 登录表单 -->
<el-form :model="form" size="large" autocomplete="off" >
@ -113,18 +111,13 @@ const login = async function () {
</svg>
<p class="text">登录</p>
</button>
<!-- <el-button
class="button"
type="primary"
auto-insert-space
@click="login()"
>登录</el-button
> -->
</el-form-item>
</el-form>
</el-col>
</el-row>
</template>
<style scoped>
.bg {
border-radius: 0 20px 20px 0;
@ -201,21 +194,6 @@ const login = async function () {
fill: #007acc;
}
/* .box {
padding: 20px;
border-radius: 10px;
background-color: #fff;
box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
} */
/* From Uiverse.io by marsella_3472 */
/*
More comprehensive version at shenanigans.shoghisimon.ca/collection/css
*/
/* From Uiverse.io by SelfMadeSystem */
.container {
width: 100%;
height: 100%;
@ -226,18 +204,3 @@ More comprehensive version at shenanigans.shoghisimon.ca/collection/css
}
</style>
<!-- 这是补救
const run = () => {
const width = window.innerWidth;
const height = window.innerHeight;
const chartNode = document.querySelector("main");
drawChart.default(chartNode,data,width,height);
};
window.addEventListener("resize", run);
document.addEventListener("DOMContentLoaded", run);
</script>
</body>
</html>
-->

244
src/views/managerecharge/rate.vue

@ -3,32 +3,27 @@ import {onMounted, reactive, ref} from 'vue'
import {ElMessage, ElMessageBox} from 'element-plus'
import request from '@/util/http'
/*
====================工具方法=========================
*/
/*
====================数据===================================
*/
//
const adminData = ref({
adminId: '',
name: ''
})
const getAdminData = async function () {
try {
const result = await request({
url: '/admin/userinfo',
data: {}
})
adminData.value = result
rateEdit.value.adminId = adminData.value.adminId
console.log('请求成功', result)
} catch (error) {
console.log('请求失败', error)
}
}
//
const regeEdit = ref(false)
// (id )
const editFormRef = ref(null)
//
const tableData = ref([])
@ -40,7 +35,92 @@ const getObj = ref({
const total = ref(0)
//
const rateEdit = ref({
id: null,
rateName: '',
num: null,
adminId: null,
updateTime: Date.now(),
})
//
const rateNames = [
{
value: 'USD',
label: 'USD'
},
{
value: 'HKD',
label: 'HKD'
},
{
value: 'THB',
label: 'THB'
},
{
value: 'VND',
label: 'VND'
},
{
value: 'CAD',
label: 'CAD'
},
{
value: 'MYR',
label: 'MYR'
},
{
value: 'KRW',
label: 'KRW'
},
{
value: 'JPY',
label: 'JPY'
},
{
value: 'CNY',
label: 'CNY'
}
]
//
const checkFreeGoldRadio = function (rule, value, callback) {
if (value == '0' || value == null || value == '') {
callback(new Error('请输入汇率比'))
} else if (value < 0 || isNaN(value)) {
callback(new Error('请输入正确的格式'))
} else {
callback()
}
}
//
const rules = reactive({
rateName: [{required: true, message: '请选择货币名称', 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.adminId
console.log('请求成功', result)
} catch (error) {
console.log('请求失败', error)
}
}
//
const getAllRate = async function (val) {
try {
//
@ -72,26 +152,19 @@ const getAllRate = async function (val) {
}
}
//
const handlePageSizeChange = function (val) {
getObj.value.pageSize = val
getAllRate()
}
//
const handleCurrentChange = function (val) {
getObj.value.pageNum = val
getAllRate()
}
//
const rateEdit = ref({
id: null,
rateName: '',
num: null,
adminId: null,
updateTime: Date.now(),
})
//
//id
const getEditData = async function (row) {
try {
console.log('搜索参数', getObj.value)
@ -116,7 +189,7 @@ const getEditData = async function (row) {
console.log('请求失败', error)
}
}
//
const editRate = async function () {
try {
console.log('搜索参数', rateEdit.value)
@ -132,6 +205,8 @@ const editRate = async function () {
console.log('请求失败', error)
}
}
//
const edit = () => {
ElMessageBox.confirm('确认修改?')
.then(() => {
@ -149,61 +224,14 @@ const cancelEdit = () => {
}
//
const handleEditDialogClose = () => {
if (editFormRef.value) {
getAllRate()
}
}
//
onMounted(async function () {
await getAllRate()
await getAdminData()
})
//
const options = [
{
value: 'USD',
label: 'USD'
},
{
value: 'HKD',
label: 'HKD'
},
{
value: 'THB',
label: 'THB'
},
{
value: 'VND',
label: 'VND'
},
{
value: 'CAD',
label: 'CAD'
},
{
value: 'MYR',
label: 'MYR'
},
{
value: 'KRW',
label: 'KRW'
},
{
value: 'JPY',
label: 'JPY'
},
{
value: 'CNY',
label: 'CNY'
}
]
//
function formatDate(value) {
if (!value) return ''
const date = new Date(value)
@ -217,51 +245,55 @@ function formatDate(value) {
}
const checkFreeGoldRadio = function (rule, value, callback) {
if (value == '0' || value == null || value == '') {
callback(new Error('请输入汇率比'))
} else if (value < 0 || isNaN(value)) {
callback(new Error('请输入正确的格式'))
} else {
callback()
}
}
const rules = reactive({
rateName: [{required: true, message: '请选择货币名称', trigger: 'blur'}],
num: [{validator: checkFreeGoldRadio, trigger: 'blur'}],
})
//
function handleInput(value) {
//
let validValue = value.replace(/[^\d.]/g, '');
// 使
if (value.includes('。') || /[^\d.]/g.test(value)) {
ElMessage.warning('请输入正确的符号');
// value = value.replace('', '.');
}
//
const parts = validValue.split('.');
const parts = value.split('.');
if (parts.length > 2) {
validValue = parts[0] + '.' + parts.slice(1).join('');
ElMessage.warning('请输入正确格式');
value = parts[0] + '.' + parts.slice(1).join('');
ElMessage.warning('只能包含一个小数点');
}
// 7
const [integerPart, decimalPart = ''] = validValue.split('.');
if (decimalPart.length > 7) {
validValue = `${integerPart}.${decimalPart.slice(0, 7)}`;
ElMessage.warning('最多只能输入7位小数');
//
if (value.startsWith('-')) {
ElMessage.warning('不允许输入负数');
value = value.substring(1);
}
//
const isValidFormat = /^\d+(\.\d{0,7})?$/.test(validValue);
if (value && !isValidFormat) {
ElMessage.warning('请输入正确的数字格式');
// 0
if (value.startsWith('.')) {
value = '0' + value;
ElMessage.info('已自动补充前导0');
}
//
rateEdit.value.num = validValue;
return validValue;
rateEdit.value.num = value;
return value;
}
//
const formSize = ref('default')
/*
====================监听=========================
*/
/*
====================挂载=========================
*/
//
onMounted(async function () {
await getAllRate()
await getAdminData()
})
</script>
@ -362,7 +394,7 @@ const formSize = ref('default')
style="width: 240px"
>
<el-option
v-for="item in options"
v-for="item in rateNames"
:key="item.value"
:label="item.label"
:value="item.value"

3
src/views/permissions/permission.vue

@ -157,7 +157,7 @@ const openPermissionAddVisible = function () {
//
const closePermissionAddVisible = function () {
// reset() ...resetreset
//
//
addAdmin.value = {
account: '',
name: '',
@ -170,7 +170,6 @@ const closePermissionAddVisible = function () {
};
permissionAddVisible.value = false;
//
Ref.value.resetFields();
}

2
src/views/recharge/coinRechargeDetail.vue

@ -343,7 +343,7 @@ const getActivity = async function () {
const getArea = async function () {
try {
// POST
const result = await API({ url: 'recharge/user/search', data: {} })
const result = await API({ url: 'http://192.168.8.247:8081/general/market', data: {} })
//
console.log('请求成功', result)
//

94
src/views/refund/addCoinRefund.vue

@ -145,27 +145,24 @@ const getUser = async function (jwcode) {
const result = await API({
url: 'http://192.168.8.247:8081/user/selectUser',
data: {
jwcode: addRefund.value.jwcode,
area: adminData.value.area
jwcode: addRefund.value.jwcode
}
})
console.log('请求成功', result)
//
if (result.code === 0) {
//ElMessage.error(result.msg)
ElMessage.error(result.msg);
} else if (result.data === null) {
ElMessage.error("用户不存在");
} else {
user.value = result.data
user.value.A =
Number(user.value.pendingRechargeTimes) +
Number(user.value.pendingSpendTimes)
console.log('用户信息', user.value)
//ElMessage.success(result.msg)
user.value = result.data;
console.log("用户信息", user.value);
ElMessage.success(result.msg);
}
} catch (error) {
console.log('请求失败', error)
ElMessage.error('查询失败,请检查精网号是否正确')
console.log("请求失败", error);
ElMessage.error("查询失败,请检查精网号是否正确");
//
}
}
@ -188,25 +185,46 @@ const AAA = computed(() => {
watch(AAA, (newVal) => {})
// 退
const refundType = [
{
value: '退款商品',
label: '退款商品'
// const refundType = [
// {
// value: '退',
// label: '退'
// }
// ]
// 退
const refundType = ref([])
// 退
const getRefundTypes = async function () {
try {
// 退
const result = await API({
// url: 'http://192.168.8.247:8081/', //退
data: {} })
console.log('退款类型请求成功', result)
// refundType
refundType.value = result.data.map(item => ({
value: item.value,
label: item.label
}))
console.log('退款类型', refundType.value)
} catch (error) {
console.log('退款类型请求失败', error)
}
]
}
//
//
const goods = ref([])
const getGoods = async function (jwcode) {
trimJwCode();
try {
// POST
const result = await API({
url: '/consume/getDeatil',
url: 'http://39.101.133.168:8828/live_mall/api/product/all',
data: {
jwcode: addRefund.value.jwcode,
area: adminData.value.area
market: adminData.value.market
}
})
console.log('请求成功', result)
@ -217,7 +235,7 @@ const getGoods = async function (jwcode) {
//
goods.value = result.data
console.log('用户信息', goods.value)
ElMessage.success(result.msg)
//ElMessage.success(result.msg)
}
} catch (error) {
console.log('请求失败', error)
@ -403,7 +421,7 @@ onMounted(async function () {
</el-form>
<!-- 客户信息栏 -->
<el-card style="width: 850px; float: right" class="customer-info">
<el-card v-if=user.jwcode style="width: 850px; float: right" class="customer-info">
<el-form
:model="user"
label-width="auto"
@ -420,8 +438,8 @@ onMounted(async function () {
<el-col :span="14">
<el-form-item label="历史金币总数">
<!-- 检查 user.totalRechargeGold 是否为有效的数字 -->
<p v-if="!isNaN(Number(user.totalRechargeGold))">
{{ Number(user.totalRechargeGold / 100) }}
<p v-if="!isNaN(Number(user.historySumGold))">
{{ Number(user.historySumGold) }}
</p>
<!-- 如果不是有效的数字显示默认值 -->
<p v-else></p>
@ -436,30 +454,30 @@ onMounted(async function () {
<el-form-item label="当前金币总数" style="width: 500px">
<span
style="color: #2fa1ff; margin-right: 5px"
v-if="user.buyJb !== undefined"
v-if="user.nowSumGold !== undefined"
>{{
(user.buyJb + user.free6 + user.free12 + user.coreJb) / 100
(user.nowSumGold)
}}</span
>
<span
style="display: inline; white-space: nowrap; color: #b1b1b1"
v-if="user.buyJb !== undefined"
>(永久金币:{{ user.buyJb / 100 }};免费金币:{{
(user.free6 + user.free12) / 100
}};任务金币:{{ user.coreJb / 100 }})</span
v-if="user.nowPermanentGold !== undefined"
>(永久金币:{{ user.nowPermanentGold }};免费金币:{{
(user.nowFreeGold)
}};任务金币:{{ user.nowTaskGold}})</span
>
</el-form-item>
</el-col>
<el-col :span="10">
<el-form-item label="首次充值日期">
<p v-if="user.firstRechargeDate">
{{ moment(user.firstRechargeDate).format('YYYY-MM-DD HH:mm:ss') }}
<p v-if="user.firstRecharge">
{{ moment(user.firstRecharge).format('YYYY-MM-DD HH:mm:ss') }}
</p>
</el-form-item>
</el-col>
<el-col :span="14">
<el-form-item label="充值次数">
<p style="color: #2fa1ff">{{ user.rechargeTimes }}</p>
<p style="color: #2fa1ff">{{ user.rechargeNum }}</p>
</el-form-item>
</el-col>
<!-- <el-col :span="10">
@ -469,20 +487,16 @@ onMounted(async function () {
</el-col> -->
<el-col :span="10">
<el-form-item label="消费次数">
<p style="color: #2fa1ff">{{ user.spendTimes }}</p>
<p style="color: #2fa1ff">{{ user.consumeNum }}</p>
</el-form-item>
</el-col>
<el-col :span="10">
<el-form-item label="所属门店">
<p>{{ adminData.area }}</p>
<p>{{ user.market }}</p>
</el-form-item>
</el-col>
<el-col :span="14">
<!-- <el-form-item label="待审核">
<p style="color: #2fa1ff">
{{ user.A }}
</p>
</el-form-item> -->
</el-col>
</el-row>
</el-form>

376
src/views/refund/coinRefundDetail.vue

@ -42,15 +42,8 @@ const getAdminData = async function () {
//
const tableData = ref([])
// ======================================
//
const refundUser = ref({
jwcode: null,
refundModel: "",
market: "",
startTime: "",
endTime: "",
goodsName: ""
})
// detail
const refundUser = ref({})
//
const getObj = ref({
pageNum: 1,
@ -60,36 +53,46 @@ const getObj = ref({
const total = ref(100)
//
const getTime = ref([])
//
const market = ref([])
// 退
const consumeType = [
{
value: '退款商品',
label: '退款商品'
}
]
//
//
//
//
const permanentGolds = ref(0)
const freeGolds = ref(0)
const taskGolds = ref(0)
//
//
//
const sumGold = computed(() => permanentGolds.value + freeGolds.value + taskGolds.value)
//
// 退
const refundType = ref([])
//
//
const formatTime = (val) => val ? moment(val).format('YYYY-MM-DD HH:mm:ss') : ''
//
// 退
const getRefundTypes = async function () {
try {
// 退
const result = await API({
// url: 'http://192.168.8.247:8081/', //退
data: {} })
console.log('退款类型请求成功', result)
// refundType
refundType.value = result.data.map(item => ({
value: item.value,
label: item.label
}))
console.log('退款类型', refundType.value)
} catch (error) {
console.log('退款类型请求失败', error)
}
}
// ==============================================================
//
const get = async function (val) {
const getSelectBy = async function (val) {
try {
//
if (typeof val === 'number') {
@ -99,46 +102,51 @@ const get = async function (val) {
// todo
//
if (getTime.value != null) {
if (getTime.value.startDate != '' && getTime.value.endDate != '') {
refundUser.value.startDate = getTime.value[0]
refundUser.value.endDate = getTime.value[1]
if (getTime.value.startTime != '' && getTime.value.endTime != '') {
refundUser.value.startTime = formatTime(getTime.value[0])
refundUser.value.endTime = formatTime(getTime.value[1])
}
} else {
refundUser.value.startDate = ''
refundUser.value.endDate = ''
refundUser.value.startTime = ''
refundUser.value.endTime = ''
}
// todo
//
refundUser.value.sortField = sortField.value
refundUser.value.sortOrder = sortOrder.value
console.log('搜索参数', getObj.value)
// POST
const result = await API({
url: 'http://192.168.8.247:8081/refund/selectBy',
data: {
pageNum: getObj.value.pageNum,
pageSize: getObj.value.pageSize,
refundUser: refundUser.value
...getObj.value,
refundUser: { ...refundUser.value }
}
})
// refundUser.value
const detailWithoutSort = {...refundUser.value}
const detailWithoutSort = { ...refundUser.value }
delete detailWithoutSort.sortField
delete detailWithoutSort.sortOrder
const result2 = await API({
const resultTotalGold = await API({
url: 'http://192.168.8.247:8081/refund/statsGold',
data: {
...detailWithoutSort
...detailWithoutSort
}
})
//
console.log('请求成功', result)
console.log('resultTotalGold请求成功', resultTotalGold)
// code 200 data
if (resultTotalGold.code === 200 && resultTotalGold.data) {
const data = resultTotalGold.data
console.log('获取到的金币数据:', data)
permanentGolds.value = Number(data.permanentGolds) || 0
freeGolds.value = Number(data.freeGolds) || 0
taskGolds.value = Number(data.taskGolds) || 0
}
console.log("")
//
tableData.value = result.data.list
console.log('tableData', tableData.value)
@ -155,7 +163,7 @@ const get = async function (val) {
//
const search = function () {
getObj.value.pageNum = 1
get()
getSelectBy()
}
//
const reset = function () {
@ -167,58 +175,56 @@ const reset = function () {
//
const getToday = function () {
const today = new Date()
const startDate = new Date(
today.getFullYear(),
today.getMonth(),
today.getDate()
const startTime = new Date(
today.getFullYear(),
today.getMonth(),
today.getDate()
)
const endDate = new Date(
today.getFullYear(),
today.getMonth(),
today.getDate() + 1
const endTime = new Date(
today.getFullYear(),
today.getMonth(),
today.getDate() + 1
)
getTime.value = [startDate, endDate]
getTime.value = [startTime, endTime]
console.log('getTime', getTime.value)
get()
getSelectBy()
}
//
const getYesterday = function () {
const yesterday = new Date()
yesterday.setDate(yesterday.getDate() - 1)
const startDate = new Date(
yesterday.getFullYear(),
yesterday.getMonth(),
yesterday.getDate()
const startTime = new Date(
yesterday.getFullYear(),
yesterday.getMonth(),
yesterday.getDate()
)
const endDate = new Date(
yesterday.getFullYear(),
yesterday.getMonth(),
yesterday.getDate() + 1
const endTime = new Date(
yesterday.getFullYear(),
yesterday.getMonth(),
yesterday.getDate() + 1
)
getTime.value = [startDate, endDate]
getTime.value = [startTime, endTime]
console.log('getTime', getTime.value)
get()
getSelectBy()
}
// 7
const get7Days = function () {
const today = new Date()
const startDate = new Date(
today.getFullYear(),
today.getMonth(),
today.getDate() - 6
const startTime = new Date(
today.getFullYear(),
today.getMonth(),
today.getDate() - 6
)
const endDate = new Date(
today.getFullYear(),
today.getMonth(),
today.getDate() + 1
const endTime = new Date(
today.getFullYear(),
today.getMonth(),
today.getDate() + 1
)
getTime.value = [startDate, endDate]
getTime.value = [startTime, endTime]
console.log('getTime', getTime.value)
get()
getSelectBy()
}
//
// tab.props.nameall
const tabName = ref('all')
@ -237,26 +243,42 @@ const handleClick = function (tab, event) {
//
const getMarket = async function () {
try {
//
const result = await request({
// todo
// url: '/general/market',
url: 'http://192.168.8.247:8081/general/market', // todo
data: {}
})
console.log('请求地区列表成功', result)
//
// POST
const result = await API({ url: 'http://192.168.8.247:8081/general/market', data: {} })
//
console.log('请求成功', result)
//
market.value = result.data
console.log('地区数据', market.value)
console.log('地区', market.value)
} catch (error) {
console.log('请求地区列表失败', error)
ElMessage({
type: 'error',
message: '获取地区列表失败,请稍后重试'
})
console.log('请求失败', error)
}
}
//
const delObj = ref({})
const del = function (row) {
delObj.value.detailId = row.detailId
console.log('delObj', delObj.value)
}
//
const delConfirm = async function () {
try {
console.log('delObj', delObj.value)
// POST
const result = await API({
url: '/refund/softDelete?detailId=' + delObj.value.detailId,
data: {}
})
//
console.log('请求成功', result)
//
getSelectBy()
} catch (error) {
console.log('请求失败', error)
//
}
}
//
const goods = ref([])
@ -271,7 +293,8 @@ const getGoods = async function () {
console.log('请求成功product', result)
//
goods.value = result.data
console.log('goods 数据', goods.value) //
console.log('地区', market.value)
} catch (error) {
console.log('请求失败', error)
//
@ -289,7 +312,7 @@ const checkNumber = function () {
) {
getObj.value.pageNum = parseInt(getObj.value.pageNum)
console.log('输入的数字合法')
get()
getSelectBy()
} else {
//
ElMessage({
@ -308,9 +331,9 @@ const checkNumber = function () {
//
onMounted(async function () {
await getAdminData()
await get()
await getMarket()
await getGoods()
await getSelectBy()
await getArea()
await getRefundTypes()
})
//
const sortField = ref('')
@ -319,27 +342,27 @@ const sortOrder = ref('')
const handleSortChange = (column) => {
console.log('排序字段:', column.prop)
console.log('排序方式:', column.order)
if (column.prop === 'rechargeCoin') {
sortField.value = 'recharge_coin'
} else if (column.prop === 'taskCoin') {
sortField.value = 'task_coin'
} else if (column.prop === 'freeCoin') {
sortField.value = 'free_coin'
if (column.prop === 'permanentGold') {
sortField.value = 'permanent_gold'
} else if (column.prop === 'taskGold') {
sortField.value = 'task_gold'
} else if (column.prop === 'freeGold') {
sortField.value = 'free_gold'
} else if (column.prop === 'createTime') {
sortField.value = 'create_time'
} else if (column.prop === 'auditTime') {
sortField.value = 'audit_time'
}
sortOrder.value = column.order === 'ascending' ? 'ASC' : 'DESC'
get()
getSelectBy()
}
const handlePageSizeChange = function (val) {
getObj.value.pageSize = val
get()
getSelectBy()
}
const handleCurrentChange = function (val) {
getObj.value.pageNum = val
get()
getSelectBy()
}
</script>
@ -353,11 +376,11 @@ const handleCurrentChange = function (val) {
<el-text class="mx-1" size="large">精网号</el-text>
<el-input
v-model="refundUser.jwcode"
placeholder="请输入精网号"
size="large"
style="width: 150px"
clearable
v-model="refundUser.jwcode"
placeholder="请输入精网号"
size="large"
style="width: 150px"
clearable
/>
</div>
</el-col>
@ -365,18 +388,18 @@ const handleCurrentChange = function (val) {
<div class="head-card-element">
<el-text class="mx-1" size="large">退款类型</el-text>
<el-select
v-model="refundUser.refundType"
placeholder="请选择退款类型"
size="large"
style="width: 180px"
clearable
v-model="refundUser.refundType"
placeholder="请选择退款类型"
size="large"
style="width: 180px"
clearable
>
<!-- todo 这需要改-->
<el-option
v-for="item in consumeType"
:key="item.value"
:label="item.label"
:value="item.value"
v-for="item in refundType"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
</div>
@ -385,12 +408,12 @@ const handleCurrentChange = function (val) {
<div class="head-card-element">
<el-text class="mx-1" size="large">退款商品</el-text>
<el-select
v-model="refundUser.refundGoods"
placeholder="请选择退款商品"
size="large"
style="width: 180px"
clearable
v-model="refundUser.goodsName"
placeholder="请选择退款商品"
size="large"
style="width: 180px"
clearable
>
<el-option
v-for="item in goods"
@ -402,20 +425,20 @@ const handleCurrentChange = function (val) {
</div>
</el-col>
<el-col :span="6">
<div class="head-card-element" v-if="adminData.area == '总部'">
<div class="head-card-element">
<el-text class="mx-1" size="large">所属地区</el-text>
<el-select
v-model="refundUser.market"
placeholder="请选择所属地区"
size="large"
style="width: 180px"
clearable
v-model="refundUser.market"
placeholder="请选择所属地区"
size="large"
style="width: 180px"
clearable
>
<el-option
v-for="item in market"
:key="item"
:label="item"
:value="item"
v-for="item in market"
:key="item"
:label="item"
:value="item"
/>
</el-select>
</div>
@ -451,23 +474,11 @@ const handleCurrentChange = function (val) {
<el-row>
<el-col>
<el-card>
<!-- <el-tabs
v-model="activeName"
type="card"
class="demo-tabs"
@tab-click="handleClick"
>
<el-tab-pane label="全部" name="all"></el-tab-pane>
<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>
</el-tabs> -->
<div>
退款金币总数{{ Math.abs(trueGold) }}永久金币{{
Math.abs(truePgold)
}}免费金币{{ Math.abs(trueFgold) }}任务金币{{
Math.abs(trueTgold)
退款金币总数{{ Math.abs(sumGold) }}永久金币{{
Math.abs(permanentGolds)
}}免费金币{{ Math.abs(freeGolds) }}任务金币{{
Math.abs(taskGolds)
}}
</div>
<!-- 设置表格容器的高度和滚动样式 -->
@ -492,10 +503,10 @@ const handleCurrentChange = function (val) {
</template>
</el-table-column>
<el-table-column
prop="name"
label="姓名"
fixed="left"
width="100px"
prop="name"
label="姓名"
fixed="left"
width="100px"
/>
<el-table-column
prop="jwcode"
@ -503,37 +514,39 @@ const handleCurrentChange = function (val) {
fixed="left"
width="110px"
/>
<el-table-column prop="market" label="所属地区" width="110px"/>
<el-table-column prop="refundGoods" label="商品名称" width="100px"/>
<el-table-column prop="refundType" label="退款类型" width="100px"/>
<el-table-column prop="market" label="所属地区" width="110px" />
<el-table-column prop="goodsName" label="商品名称" width="100px" />
<el-table-column prop="refundType" label="退款类型" width="100px" />
<el-table-column label="退款金币总数" width="110px">
<template #default="scope">
{{
scope.row.rechargeCoin +
scope.row.freeCoin +
scope.row.taskCoin
scope.row.sumGold
}}
</template>
</el-table-column>
<el-table-column prop="typeR" label="退款方式" width="110px"/>
<el-table-column prop="refundModel" label="退款方式" width="110px">
<template #default="scope">
{{ scope.row.refundModel === 1 ? '全部退款' : scope.row.refundModel === 2 ? '部分退款' : '' }}
</template>
</el-table-column>
<el-table-column
prop="rechargeCoin"
label="永久金币"
width="110px"
sortable="“custom”"
prop="permanentGold"
label="永久金币"
width="110px"
sortable="“custom”"
/>
<el-table-column
prop="freeCoin"
sortable="“custom”"
label="免费金币"
width="110px"
prop="freeGold"
sortable="“custom”"
label="免费金币"
width="110px"
/>
<el-table-column
prop="taskCoin"
sortable="“custom”"
label="任务金币"
width="110px"
prop="taskGold"
sortable="“custom”"
label="任务金币"
width="110px"
/>
<!-- 修改prop为taskGold -->
<el-table-column
@ -542,19 +555,18 @@ const handleCurrentChange = function (val) {
width="160px"
show-overflow-tooltip
/>
<el-table-column prop="adminName" label="提交人" width="100px"/>
<el-table-column prop="adminName" label="提交人" width="100px" />
<el-table-column
prop="createTime"
sortable="“custom”"
label="提交时间"
width="180px"
prop="createTime"
sortable="“custom”"
label="提交时间"
width="180px"
>
<template #default="scope">
{{ moment(scope.row.createTime).format('YYYY-MM-DD HH:mm:ss') }}
</template>
</el-table-column>
</el-table>
</div>

5
src/views/usergold/clientCountDetail.vue

@ -157,6 +157,11 @@ const get = async function (val) {
console.log('搜索参数', getObj.value)
// POST
// jwcode
console.log('jwcode 类型:', typeof goldDetail.value.jwcode);
console.log('jwcode 值:', goldDetail.value.jwcode);
const requestData = { ...getObj.value, goldDetail: { ...goldDetail.value } };
console.log('最终请求参数', JSON.stringify(requestData, null, 2)); //

2
src/views/workspace/index.vue

@ -223,7 +223,7 @@ const handleDateRangeChange = () => {
const getAreas = async () => {
try {
const result = await API({
url: '/recharge/user/search',
url: 'http://192.168.8.247:8081/general/market',
data: {}
})
middleCategory.value = result.data.map(item => item.name)

3
vite.config.ts

@ -39,6 +39,9 @@ export default defineConfig(({ mode }) => {
]
})
],
server: {
host: true // 允许外部设备访问
},
resolve: {
alias: {
'@': path.resolve(__dirname, './src')

Loading…
Cancel
Save