3 Commits

Author SHA1 Message Date
no99 18639c0f49 暂时登录页面 1 week ago
no99 7487eaf275 login-hxl暂时登陆界面 1 week ago
lihuilin 6cc6fc02e7 充值审核没改完 1 week ago
  1. 11
      .env.development
  2. 3
      src/router/index.js
  3. 763
      src/views/audit/rechargeAudit.vue
  4. 544
      src/views/audit/refundAudit.vue
  5. 4
      src/views/consume/addCoinConsume.vue
  6. 14
      src/views/consume/coinConsumeDetail.vue
  7. 2
      src/views/home.vue
  8. 2
      src/views/index.vue
  9. 273
      src/views/login-hxl.vue
  10. 6
      src/views/managerecharge/rate.vue
  11. 6
      src/views/recharge/addCoinRecharge.vue
  12. 3
      src/views/recharge/beanRecharge.vue
  13. 10
      src/views/recharge/coinRechargeDetail.vue
  14. 8
      src/views/refund/addCoinRefund.vue
  15. 10
      src/views/refund/coinRefundDetail.vue
  16. 6
      src/views/usergold/clientCountBalance.vue
  17. 6
      src/views/usergold/clientCountDetail.vue

11
.env.development

@ -1,11 +1,6 @@
# VITE_API_BASE='http://54.251.137.151:10704/'
VITE_API_BASE='http://192.168.8.94:8081/'
# VITE_API_BASE='https://hwjb.homilychart.com/gold_htms_dev'
# VITE_API_BASE='http://54.251.137.151:10704/'
<<<<<<< HEAD
# VITE_API_BASE='http://192.168.8.225:8080/'
# VITE_API_BASE='http://192.168.8.94:8080/'
VITE_API_BASE='http://18.143.76.3:10704/'
=======
VITE_API_BASE='http://192.168.8.94:8081/'
>>>>>>> lihuilin/feature-20250623164044-金币前端
# VITE_API_BASE='http://192.168.9.28:8081/'
# VITE_API_BASE='18.143.76.3:10703/'

3
src/router/index.js

@ -4,7 +4,8 @@ const router = createRouter({
history: createWebHashHistory(),
routes: [//此处在做登录之前做成默认跳转工作台
{ path: '/workspace', name: "workspace", component: () => import("../views/workspace/index.vue") },
{ path: '/', redirect: "/workspace" },
{ path: '/', redirect: "/login-hxl" },
{path: "/login-hxl",name: "login-hxl",component: () => import("../views/login-hxl.vue"),},
// { path: '/test', component: () => import("../views/z.vue") },
{
meta: { requireAuth: true },

763
src/views/audit/rechargeAudit.vue

@ -1,54 +1,202 @@
<!-- 合计数 -->
<template>
<el-row>
<el-col>
<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="rechargeAudit.jwcode" placeholder="请输入精网号" style="width: 240px" clearable />
</el-col>
<el-col :span="6">
<el-text size="large">活动名称</el-text>
<el-select v-model="rechargeAudit.activity" placeholder="请选择活动名称" style="width: 240px" clearable>
<el-option v-for="item in activity" :key="item" :label="item" :value="item" />
</el-select>
</el-col>
<el-col :span="6">
<el-text size="large">充值方式</el-text>
<el-select v-model="rechargeAudit.payModel" placeholder="请选择充值方式" style="width: 240px" clearable>
<el-option v-for="item in payModel" :key="item.value" :label="item.label" :value="item.value" />
</el-select>
</el-col>
<el-col :span="6">
<div class="head-card-element">
<el-text size="large">所属地区</el-text>
<el-select v-model="rechargeAudit.market" placeholder="请选择所属地区" style="width: 240px" clearable>
<el-option v-for="item in market" :key="item" :label="item" :value="item" />
</el-select>
</div>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<div class="time-controls">
<div class="time-group">
<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>
</div>
</div>
</el-col>
<el-col :span="8">
<el-button @click="resetSearch" type="success">重置</el-button>
<el-button type="primary" @click="handleSearch">查询</el-button>
</el-col>
</el-row>
</el-card>
</el-col>
</el-row>
<el-row>
<el-col>
<el-card>
<el-tabs v-model="activeName" type="card" @tab-click="handleClick">
<el-tab-pane label="待审核" name="wait"></el-tab-pane>
<el-tab-pane label="已通过" name="pass"></el-tab-pane>
<el-tab-pane label="已驳回" name="reject"></el-tab-pane>
<div>
总条数{{ }}&nbsp;&nbsp;&nbsp;&nbsp;
总金币数{{ }}金币&nbsp;&nbsp;&nbsp;&nbsp;
永久金币{{ }}金币&nbsp;&nbsp;&nbsp;&nbsp;
免费金币{{ }}金币
</div>
</el-tabs>
<!--表格-->
<div style="height: 540px; overflow-y: auto">
<el-table :data="tableData" style="width: 100%" height="540px" @sort-change="handleSortChange"
:row-style="{ height: '50px' }">
<el-table-column type="index" label="序号" width="100px" fixed="left">
<template #default="scope">
<span>{{ scope.$index + 1 + (getObj.pageNum - 1) * getObj.pageSize }}</span>
</template>
</el-table-column>
<el-table-column fixed="left" prop="name" label="姓名" width="150px" />
<el-table-column fixed="left" prop="jwcode" label="精网号" width="110px" />
<el-table-column prop="market" label="所属地区" width="100px" />
<el-table-column prop="activity" label="活动名称" width="100px" show-overflow-tooltip />
<el-table-column prop="permanentGold" label="充值金额" sortable="custom" width="110px">
<template #default="scope">{{ scope.row.permanentGold / 100 }}</template>
</el-table-column>
<el-table-column prop="permanentGold" label="永久金币" width="110px" sortable="custom">
<template #default="scope">{{ scope.row.permanentGold / 100 }}</template>
</el-table-column>
<el-table-column prop="freeGold" label="免费金币" sortable="custom" width="110px">
<template #default="scope">{{ scope.row.freeGold / 100 }}</template>
</el-table-column>
<el-table-column prop="remark" label="备注" width="200px" show-overflow-tooltip />
<el-table-column prop="payModel" label="支付方式" width="110px" />
<el-table-column prop="voucher" label="支付凭证" width="110px">
<!-- 支付凭证列支持点击放大预览 -->
<template #default="scope">
<div v-if="scope.row.voucher" style="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="rejectReason" v-if="activeName === 'reject'" label="驳回理由" width="200px"
show-overflow-tooltip />
<el-table-column v-if="activeName!== 'wait'" prop="auditName" label="审核人" width="100px" />
<el-table-column prop="payTime" sortable="custom" label="付款时间" width="200px">
<template #default="scope">
{{ moment(scope.row.payTime).format('YYYY-MM-DD HH:mm:ss') }}
</template>
</el-table-column>
<el-table-column prop="createTime" sortable="custom" label="提交时间" width="200px">
<template #default="scope">
{{ moment(scope.row.createTime).format('YYYY-MM-DD HH:mm:ss') }}
</template>
</el-table-column>
<el-table-column v-if="activeName === 'wait'"
fixed="right" prop="operation" label="操作" width="150px">
<template #default="scope">
<div class="operation">
<el-popconfirm title="确定要通过此条记录吗?" @confirm="handleApprove(scope.row)">
<template #reference>
<el-button :disabled="scope.row.auditStatus === 1 || scope.row.auditStatus === 2" type="primary" text>
通过
</el-button>
</template>
</el-popconfirm>
<el-button :disabled="scope.row.auditStatus === 1 || scope.row.auditStatus === 2" type="primary" text @click="showRejectDialog(scope.row)">
驳回
</el-button>
</div>
</template>
</el-table-column>
</el-table>
</div>
<div class="pagination">
<el-pagination background :page-size="getObj.pageSize" :page-sizes="[5, 10, 20, 50, 100]"
layout="total, sizes, prev, pager, next, jumper" :total="total"
@size-change="handlePagination('size', $event)"
@current-change="handlePagination('page', $event)"></el-pagination>
</div>
</el-card>
</el-col>
</el-row>
<el-dialog v-model="rejectDialogVisible" title="驳回理由" width="500px">
<el-form>
<el-form-item label="驳回理由">
<el-input v-model="rejectReason" type="textarea" :rows="4" placeholder="请输入驳回理由" maxlength="200" show-word-limit />
</el-form-item>
</el-form>
<template #footer>
<span class="dialog-footer">
<el-button @click="rejectDialogVisible = false">取消</el-button>
<el-button type="primary" @click="handleReject">确定</el-button>
</span>
</template>
</el-dialog>
</template>
<script setup>
import {computed, onMounted, reactive, ref} from 'vue'
import {dayjs, ElMessage} from 'element-plus'
import { computed, onMounted, reactive, ref } from 'vue'
import { ElMessage } from 'element-plus'
import request from '@/util/http'
import moment from 'moment'
/*
===================工具方法============================
*/
//
const trimJwCode = () => {
if (rechargeAudit.value.jwcode) {
rechargeAudit.value.jwcode = rechargeAudit.value.jwcode.replace(/\s/g, '');
}
}
const formatTime = (val) => val ? moment(val).format('YYYY-MM-DD HH:mm:ss') : ''
const formatTime = (val) => val ? dayjs(val).format('YYYY-MM-DD HH:mm:ss') : ''
/*
===================数据============================
*/
//
const adminData = ref({
})
//
const adminData = ref({})
//
const tableData = ref([])
//
const rechargeAudit = ref({
jwcode: null,//
activity: "", //
payModel: "",//
jwcode: null, //
activity: "", //
payModel: "", //
startTime: "", //
endTime: "", //
market: "",//
market: "", //
auditStatus: "0"
})
//
const getObj = ref({
pageNum: 1,
pageSize: 50
})
//
//
const total = ref(50)
//
const getTime = ref([])
@ -56,55 +204,27 @@ const activity = ref([])
//
const market = ref([])
//
const rejectVisible = ref(false)
//
const rejectObj = ref({
token: "",
orderCode: "",
rejectReason: "",
auditId: null,
action: 2
})
//
const passObj = ref({
token: "",
orderCode: "",
rejectReason: "",
auditId: null,
action: 1
})
//
const rejectDialogVisible = ref(false)
//
const rejectReason = ref('')
//
const currentRecord = ref(null)
//
const activeName = ref('wait')
//
const payModel = [
{
value: '微信',
label: '微信'
},{
value:'.....................................'//
},
{
value: '.....................................' //
}
]
// ref
const Ref = ref(null)
//
const trueGold = ref(0)
const trueCount = ref(0)
const trueRGold = ref(0)
const trueFGold = ref(0)
//
const pendingCount = ref(0)
//
const pendingGold = ref(0)
const pendingRGold = ref(0)
const pendingFGold = ref(0)
//
const approvedCount = ref(0)
//
const approvedGold = ref(0)
const approvedRGold = ref(0)
const approvedFGold = ref(0)
//
const rejectedCount = ref(0)
//
@ -112,24 +232,19 @@ const rejectedGold = ref(0)
const rejectedRGold = ref(0)
const rejectedFGold = ref(0)
//
const sortField = ref('')
const sortOrder = ref('')
//
const rules = reactive({
rejectReason: [{required: true, message: '请输入驳回理由', trigger: 'blur'}]
rejectReason: [{ required: true, message: '请输入驳回理由', trigger: 'blur' }]
})
/*
===================方法============================
*/
const getAdminData = async function () {
try {
const result = await request({
url: 'http://18.143.76.3:10704/admin/userinfo',
url: '/admin/userinfo',
data: {}
})
adminData.value = result
@ -147,29 +262,25 @@ const getRecharge = async function (val) {
getObj.value.pageNum = val
}
//
if (getTime.value != null) {
if (getTime.value.startTime != '' && getTime.value.endTime != '') {
rechargeAudit.value.startTime = formatTime(getTime.value[0])
rechargeAudit.value.endTime = formatTime(getTime.value[1])
}
if (getTime.value && getTime.value.length === 2) {
rechargeAudit.value.startTime = formatTime(getTime.value[0])
rechargeAudit.value.endTime = formatTime(getTime.value[1])
} else {
rechargeAudit.value.startTime = ''
rechargeAudit.value.endTime = ''
}
console.log('搜索参数', getObj.value)
//
const result = await request({
url: 'http://192.168.8.94:8081/audit/selectRecharge', // todo
url: '/audit/selectRecharge',
data: {
pageNum: getObj.value.pageNum,
pageSize: getObj.value.pageSize,
rechargeAudit: { //
rechargeAudit: {
...rechargeAudit.value,
// sortField: sortField.value,
// sortOrder: sortOrder.value
sortField: sortField.value,
sortOrder: sortOrder.value
}
}
})
@ -179,57 +290,18 @@ const getRecharge = async function (val) {
total.value = result.total
console.log('搜索结果', result.list)
//
//
// rechargeVo.value
const rechargeVo1 = {...rechargeAudit.value}
//
const rechargeVo1 = { ...rechargeAudit.value }
delete rechargeVo1.sortField
delete rechargeVo1.sortOrder
delete rechargeVo1.auditStatus
const result2 = await request({
// url: 'http://192.168.8.94:8081/audit/selectRecharge', // todo
url: '/audit/sumRechargeGold',
data: rechargeVo1
})
// todo
/* // 统计合计数
if (result2.data) {
result2.data.forEach((item) => {
switch (item.auditStatus) {
case '待审核':
// item.raudit 0
pendingCount.value = item.raudit || 0
// item.sumRaudit 0
pendingGold.value = item.sumRaudit || 0
pendingRGold.value = item.sumRaudit1 || 0
pendingFGold.value = item.sumRaudit2 || 0
break
case '已通过':
approvedCount.value = item.raudit || 0
approvedGold.value = item.sumRaudit || 0
approvedRGold.value = item.sumRaudit1 || 0
approvedFGold.value = item.sumRaudit2 || 0
break
case '已驳回':
rejectedCount.value = item.raudit || 0
rejectedGold.value = item.sumRaudit || 0
rejectedRGold.value = item.sumRaudit1 || 0
rejectedFGold.value = item.sumRaudit2 || 0
break
}
})
}*/
trueGold.value = pendingGold.value + approvedGold.value + rejectedGold.value
trueCount.value = pendingCount.value + approvedCount.value + rejectedCount.value
trueRGold.value = pendingRGold.value + approvedRGold.value + rejectedRGold.value
trueFGold.value = pendingFGold.value + approvedFGold.value + rejectedFGold.value
console.log('搜索对象', getObj.value)
//
tableData.value = result.data.list
console.log('tableData', tableData.value)
//
total.value = result.data.total
console.log('total', total.value)
} catch (error) {
console.log('请求失败', error)
@ -237,108 +309,104 @@ const getRecharge = async function (val) {
}
//
const search = function () {
const handleSearch = function () {
trimJwCode();
getObj.value.pageNum = 1
getObj.value.pageSize = 50
getRecharge()
}
//
const reset = function () {
delete rechargeAudit.value.activity
delete rechargeAudit.value.jwcode
delete rechargeAudit.value.payModel
delete rechargeAudit.value.market
delete rechargeAudit.value.startTime
delete rechargeAudit.value.endTime
getTime.value = {}
const resetSearch = function () {
rechargeAudit.value = {
jwcode: "",
activity: "",
payModel: "",
startTime: "",
endTime: "",
market: "",
auditStatus: "0"
}
getTime.value = []
getRecharge()
}
//
const getToday = function () {
const today = new Date()
const startTime = new Date(
today.getFullYear(),
today.getMonth(),
today.getDate()
today.getFullYear(),
today.getMonth(),
today.getDate()
)
const endTime = new Date(
today.getFullYear(),
today.getMonth(),
today.getDate() + 1
today.getFullYear(),
today.getMonth(),
today.getDate() + 1
)
getTime.value = [startTime, endTime]
console.log('getTime', getTime.value)
getRecharge()
}
//
const getYesterday = function () {
const yesterday = new Date()
yesterday.setDate(yesterday.getDate() - 1)
const startTime = new Date(
yesterday.getFullYear(),
yesterday.getMonth(),
yesterday.getDate()
yesterday.getFullYear(),
yesterday.getMonth(),
yesterday.getDate()
)
const endTime = new Date(
yesterday.getFullYear(),
yesterday.getMonth(),
yesterday.getDate() + 1
yesterday.getFullYear(),
yesterday.getMonth(),
yesterday.getDate() + 1
)
getTime.value = [startTime, endTime]
console.log('getTime', getTime.value)
getRecharge()
}
// 7
const get7Days = function () {
const today = new Date()
const startTime = new Date(
today.getFullYear(),
today.getMonth(),
today.getDate() - 6
today.getFullYear(),
today.getMonth(),
today.getDate() - 6
)
const endTime = new Date(
today.getFullYear(),
today.getMonth(),
today.getDate() + 1
today.getFullYear(),
today.getMonth(),
today.getDate() + 1
)
getTime.value = [startTime, endTime]
console.log('getTime', getTime.value)
getRecharge()
}
//
//
const adminWait = async function () {
rechargeAudit.value.auditStatus = "0"
getObj.value.pageNum = 1
await getRecharge()
console.log('adminWait')
trueCount.value = pendingCount.value
trueGold.value = pendingGold.value
trueRGold.value = pendingRGold.value
trueFGold.value = pendingFGold.value
}
//
//
const adminPass = async function () {
rechargeAudit.value.auditStatus = "1"
getObj.value.pageNum = 1
await getRecharge()
console.log('adminPass')
trueCount.value = approvedCount.value
trueGold.value = approvedGold.value
trueRGold.value = approvedRGold.value
trueFGold.value = approvedFGold.value
}
//
//
const adminReject = async function () {
rechargeAudit.value.auditStatus = "2"
getObj.value.pageNum = 1
await getRecharge()
console.log('adminReject')
trueCount.value = rejectedCount.value
trueGold.value = rejectedGold.value
trueRGold.value = rejectedRGold.value
trueFGold.value = rejectedFGold.value
}
const handleClick = function (tab, event) {
@ -352,11 +420,10 @@ const handleClick = function (tab, event) {
}
}
const getActivity = async function () {
try {
const result = await request({
url: 'http://18.143.76.3:10704/general/activity',
url: '/general/activity',
data: {}
})
activity.value = result.data
@ -365,11 +432,12 @@ const getActivity = async function () {
console.log('请求失败', error)
}
}
//
const getMarket = async function () {
try {
const result = await request({
url: 'http://18.143.76.3:10704/general/market',
url: '/general/market',
data: {}
})
market.value = result.data
@ -378,116 +446,64 @@ const getMarket = async function () {
console.log('请求失败', error)
}
}
const handlePageSizeChange = function (val) {
getObj.value.pageSize = val
getRecharge()
}
const handleCurrentChange = function (val) {
getObj.value.pageNum = val
const handlePagination = (type, val) => {
if (type === 'size') {
getObj.value.pageSize = val
} else {
getObj.value.pageNum = val
}
getRecharge()
}
// ====================================
//
const pass = function (row) {
//
// id adminId
// passObj.value.auditId = adminData.value.adminId
// todo
passObj.value.auditId = 1
passObj.value.orderCode = row.orderCode
// passObj.value.auditStatus = 1
// passObj.value.rechargeId = row.rechargeId
// passObj.value.detailId = row.detailId
// passObj.value.jwcode = row.jwcode
// passObj.value.paidGold = row.paidGold
// passObj.value.freeGold = row.freeGold
// passObj.value.adminName = adminData.value.adminName
console.log('通过对象', passObj.value)
}
//
const passConfirm = async function () {
//
const handleApprove = async (row) => {
try {
//
passObj.value.action = 1
console.log('通过对象', passObj.value)
// POST
// passObj.value.flag = 0;
const result = await request({
url: 'http://192.168.8.94:8081/audit/audit',
data: passObj.value
})
console.log('请求成功', result)
await getRecharge()
//
ElMessage({
type: 'success',
message: '通过成功!'
})
const params = {
orderCode: row.orderCode,
auditId: 1, // todo ID
action: 1,
rejectReason: ''
}
await request({ url: '/audit/audit', data: params })
ElMessage.success('审核通过成功')
getRecharge()
} catch (error) {
console.error('请求失败', error);
ElMessage({
type: 'error',
message: '出错了,不知道咋回事'
});
console.error('审核通过失败', error)
ElMessage.error('操作失败')
}
}
//
const openRej = function () {
rejectVisible.value = true
//
const showRejectDialog = (row) => {
currentRecord.value = row
rejectReason.value = '' //
rejectDialogVisible.value = true
}
//
const closeRej = function () {
rejectVisible.value = false
}
//
const reject = function (row) {
console.log('row', row)
//
// id adminId
// rejectObj.value.auditId = adminData.value.adminId
// todo
passObj.value.auditId = 1
rejectObj.value.orderCode = row.orderCode
console.log('驳回对象', rejectObj.value)
//
rejectObj.value.rejectReason = ''
console.log('驳回对象!!!!!!!!', rejectObj.value)
openRejectVisible()
}
//
const rejectConfirm = async function () {
Ref.value.validate(async (valid) => {
if (valid) {
try {
console.log('驳回对象', rejectObj.value)
// POST
const result = await request({
url: 'http://192.168.8.94:8081/audit/audit',
data: rejectObj.value
})
console.log('请求成功', result)
await getRecharge()
closeRejectVisible()//
ElMessage({
type: 'success',
message: '驳回成功!'
})
} catch (error) {
console.log('请求失败', error)
}
} else {
ElMessage({
type: 'error',
message: '请检查输入内容'
})
//
const handleReject = async () => {
if (!rejectReason.value.trim()) {
ElMessage.warning('请输入驳回理由')
return
}
try {
const params = {
orderCode: currentRecord.value.orderCode,
auditId: 1, // todo ID
action: 2,
rejectReason: rejectReason.value
}
})
await request({ url: '/audit/audit', data: params })
ElMessage.success('驳回操作成功')
rejectDialogVisible.value = false
getRecharge()
} catch (error) {
console.error('驳回操作失败', error)
ElMessage.error('操作失败')
}
}
//
@ -530,219 +546,16 @@ const previewImage = (imageUrl) => {
});
};
/*
===================监听============================
*/
/*
===================计算属性============================
*/
//
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 getAdminData()
await getActivity()
await getRecharge()
await getMarket()
// await search()
await getRecharge()
})
</script>
<template>
<el-row>
<el-col>
<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="rechargeAudit.jwcode" placeholder="请输入精网号" style="width: 240px" clearable/>
</el-col>
<el-col :span="6">
<el-text size="large">活动名称</el-text>
<el-select v-model="rechargeAudit.activity" placeholder="请选择活动名称" style="width: 240px" clearable>
<el-option v-for="item in activity" :key="item" :label="item"
:value="item"/>
</el-select>
</el-col>
<el-col :span="6">
<el-text size="large">充值方式</el-text>
<el-select v-model="rechargeAudit.payModel" placeholder="请选择充值方式" style="width: 240px" clearable>
<el-option v-for="item in payModel" :key="item.value" :label="item.label" :value="item.value"/>
</el-select>
</el-col>
<el-col :span="6">
<div class="head-card-element">
<el-text size="large">所属地区</el-text>
<el-select v-model="rechargeAudit.market" placeholder="请选择所属地区" style="width: 240px" clearable>
<el-option v-for="item in market" :key="item" :label="item" :value="item"/>
</el-select>
</div>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<div class="time-controls">
<div class="time-group">
<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>
</div>
</div>
</el-col>
<el-col :span="8">
<el-button @click="reset()" type="success">重置</el-button>
<el-button type="primary" @click="get()">查询</el-button>
</el-col>
</el-row>
</el-card>
</el-col>
</el-row>
<el-row>
<el-col>
<el-card>
<el-tabs v-model="activeName" type="card" @tab-click="handleClick">
<el-tab-pane label="待审核" name="wait"></el-tab-pane>
<el-tab-pane label="已通过" name="pass"></el-tab-pane>
<el-tab-pane label="已驳回" name="reject"></el-tab-pane>
<div> <!--todo 改这里 总数的-->
总条数{{ trueCount }}&nbsp;&nbsp;&nbsp;&nbsp;
总金币数{{ formattedTrueGold / 100 }}金币&nbsp;&nbsp;&nbsp;&nbsp;
永久金币{{ formattedTrueRGold / 100 }}金币&nbsp;&nbsp;&nbsp;&nbsp;
免费金币{{ formattedTrueFGold / 100 }}金币
</div>
</el-tabs>
<!--表格-->
<div style="height: 540px; overflow-y: auto">
<el-table :data="tableData" style="width: 100%" height="540px" @sort-change="handleSortChange"
:row-style="{ height: '50px' }">
<el-table-column type="index" label="序号" width="100px" fixed="left">
<template #default="scope">
<span>{{ scope.$index + 1 + (getObj.pageNum - 1) * getObj.pageSize }}</span>
</template>
</el-table-column>
<el-table-column fixed="left" prop="name" label="姓名" width="150px"/>
<el-table-column fixed="left" prop="jwcode" label="精网号" width="110px"/>
<el-table-column prop="market" label="所属地区" width="100px"/>
<el-table-column prop="activity" label="活动名称" width="100px"/>
<el-table-column prop="permanentGold" label="充值金额" sortable="custom" width="110px">
<template #default="scope">{{ scope.row.permanentGold / 100 }}</template>
</el-table-column>
<el-table-column prop="permanentGold" label="永久金币" width="110px" sortable="custom">
<template #default="scope">{{ scope.row.permanentGold / 100 }}</template>
</el-table-column>
<el-table-column prop="freeGold" label="免费金币" sortable="custom" width="110px">
<template #default="scope">{{ scope.row.freeGold / 100 }}</template>
</el-table-column>
<el-table-column prop="remark" label="备注" width="200px" show-overflow-tooltip/>
<el-table-column prop="payModel" label="支付方式" width="110px"/>
<el-table-column prop="voucher" label="支付凭证" width="110px">
<!-- 支付凭证列支持点击放大预览 -->
<template #default="scope">
<div v-if="scope.row.voucher" style="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="rejectReason" v-if="activeName === 'reject'" label="驳回理由" width="200px"
show-overflow-tooltip/>
<el-table-column v-if="activeName!== 'wait'" prop="auditName" label="审核人" width="100px"/>
<el-table-column prop="payTime" sortable="custom" label="付款时间" width="200px">
<template #default="scope">
{{ moment(scope.row.payTime).format('YYYY-MM-DD HH:mm:ss') }}
</template>
</el-table-column>
<el-table-column prop="createTime" sortable="custom" label="提交时间" width="200px">
<template #default="scope">
{{ moment(scope.row.createTime).format('YYYY-MM-DD HH:mm:ss') }}
</template>
</el-table-column>
<el-table-column v-if="activeName === 'wait'"
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.auditStatus === 1 || scope.row.auditStatus === 2
? true
: false
" type="primary" text @click="pass(scope.row)">
通过
</el-button>
</template>
<template #actions="{ confirm, cancel }">
<el-button size="small" @click="cancel">取消</el-button>
<el-button type="primary" size="small" @click="confirm">确定</el-button>
</template>
</el-popconfirm>
<el-button :disabled="scope.row.auditStatus === 1 || scope.row.auditStatus === 2
? true
: false
" type="primary" text @click="reject(scope.row)">
驳回
</el-button>
</div>
</template>
</el-table-column>
</el-table>
</div>
<div class="pagination">
<el-pagination background :page-size="getObj.pageSize" :page-sizes="[5, 10, 20, 50, 100]"
layout="total, sizes, prev, pager, next, jumper" :total="total"
@size-change="handlePageSizeChange"
@current-change="handleCurrentChange"></el-pagination>
</div>
</el-card>
</el-col>
</el-row>
<el-dialog v-model="rejectVisible" title="驳回理由" width="500" :before-close="closeRej">
<template #footer>
<el-form :model="rejectObj" ref="Ref" :rules="rules" label-width="auto" style="max-width: 600px">
<el-form-item prop="rejectReason" label="驳回理由:">
<el-input v-model="rejectObj.rejectReason" maxlength="150" show-word-limit style="width: 350px"
type="textarea"
placeholder="请输入内容"/>
</el-form-item>
</el-form>
<div class="dialog-footer">
<<<<<<< HEAD
<el-button @click="closeRejectVisible()">取消</el-button>
<el-button type="primary" @click="rejectConfirm()"> 确定</el-button>
=======
<el-button @click="closeRej()">取消</el-button>
<el-button type="primary" @click="rejectConfirm()"> 确定 </el-button>
>>>>>>> lihuilin/feature-20250623164044-金币前端
</div>
</template>
</el-dialog>
</template>
<style scoped>
.pagination {
display: flex;
@ -816,4 +629,4 @@ onMounted(async function () {
text-overflow: ellipsis;
white-space: nowrap;
}
</style>
</style>

544
src/views/audit/refundAudit.vue

@ -6,19 +6,19 @@
<el-row style="margin-bottom: 5px">
<el-col :span="6">
<el-text size="large">精网号</el-text>
<el-input v-model="searchForm.jwcode" placeholder="请输入精网号" style="width: 240px" clearable/>
<el-input v-model="searchForm.jwcode" placeholder="请输入精网号" style="width: 240px" clearable />
</el-col>
<el-col :span="6">
<el-text size="large">商品名</el-text>
<el-select v-model="searchForm.refundGoods" placeholder="请输入商品名" style="width: 240px" clearable>
<el-select v-model="searchForm.goodsName" placeholder="请输入商品名" style="width: 240px" clearable>
<el-option v-for="item in refundGoodsOptions" :key="item" :label="item" :value="item"> </el-option>
</el-select>
</el-select>
</el-col>
<el-col :span="6">
<el-text size="large">退款方式</el-text>
<el-select v-model="searchForm.refundModel" placeholder="请选择" style="width: 240px" clearable>
<el-option label="全部退款" value="全部退款" />
<el-option label="部分退款" value="部分退款" />
<el-option label="全部退款" value="0" />
<el-option label="部分退款" value="1" />
</el-select>
</el-col>
<el-col :span="6">
@ -32,10 +32,9 @@
<el-col :span="12">
<div class="time-controls">
<div class="time-group">
<el-text size="large">充值时间</el-text>
<el-date-picker v-model="dateRange" type="datetimerange" range-separator=""
start-placeholder="开始时间"
end-placeholder="结束时间" style="width: 400px"/>
<el-text size="large">提交时间</el-text>
<el-date-picker v-model="dateRange" 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>
@ -60,32 +59,50 @@
</el-tabs>
<div>
总条数{{ stats.totalItems }}&nbsp;&nbsp;&nbsp;&nbsp;
退款总金币数{{ stats.totalCoins }}金币&nbsp;&nbsp;&nbsp;&nbsp;
永久金币{{ stats.permanentCoins }}金币&nbsp;&nbsp;&nbsp;&nbsp;
免费金币{{ stats.freeCoins }}金币&nbsp;&nbsp;&nbsp;&nbsp;
任务金币{{ stats.taskCoins }}金币
总条数{{ stats.totalNum }}&nbsp;&nbsp;&nbsp;&nbsp;
退款总金币数{{ stats.permanentGolds + stats.freeGolds + stats.taskGolds }}金币&nbsp;&nbsp;&nbsp;&nbsp;
永久金币{{ stats.permanentGolds }}金币&nbsp;&nbsp;&nbsp;&nbsp;
免费金币{{ stats.freeGolds }}金币&nbsp;&nbsp;&nbsp;&nbsp;
任务金币{{ stats.taskGolds }}金币
</div>
<el-table :data="tableData" height="540px" @sort-change="handleSortChange">
<el-table :data="tableData" height="540px">
<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="refundModel" label="退款方式" width="120" />
<el-table-column prop="goodsName" 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="sumGold" label="退款金额" width="120" sortable="custom">
<template #default="{ row }">
{{ row.rechargeCoin + row.freeCoin + row.taskCoin }}
{{ row.sumGold / 100 }}
</template>
</el-table-column>
<!-- 修正这部分代码 -->
<el-table-column prop="permanentGold" label="永久金币" width="120" sortable="custom">
<template #default="{ row }">
{{ row.permanentGold / 100 }}
</template>
</el-table-column>
<el-table-column prop="freeGold" label="免费金币" width="120" sortable="custom">
<template #default="{ row }">
{{ (row.freeJune + row.freeDecember) / 100}}
</template>
</el-table-column>
<el-table-column prop="taskGold" label="任务金币" width="120" sortable="custom">
<template #default="{ row }">
{{ row.taskGold / 100 }}
</template>
</el-table-column>
<el-table-column prop="permanentGold" label="永久金币" width="120" sortable="custom" />
<el-table-column prop="freeGold" label="免费金币" width="120" sortable="custom" />
<el-table-column prop="taskGold" label="任务金币" width="120" sortable="custom" />
<el-table-column prop="remark" label="备注" width="150" show-overflow-tooltip /><!-- 当内容过长被隐藏时显示 tooltip -->
<el-table-column prop="adminName" label="提交人" width="120" />
<el-table-column v-if="checkTab === 'rejected'" prop="rejectReason" label="驳回理由" width="150" show-overflow-tooltip />
<el-table-column v-if="checkTab === 'rejected'" prop="rejectReason" label="驳回理由" width="150"
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 }">
@ -97,140 +114,111 @@
{{ row.auditTime ? moment(row.auditTime).format('YYYY-MM-DD HH:mm:ss') : '--' }}
</template>
</el-table-column>
<el-table-column label="操作" width="150" fixed="right" v-if="checkTab === 'pending'">
<template #default="{ row }">
<el-button type="success" size="small" @click="Approval('approve', row)">通过</el-button>
<el-button type="danger" size="small" @click="Approval('reject', row)">驳回</el-button>
<el-table-column v-if="checkTab === 'pending'" fixed="right" prop="operation" label="操作" width="150px">
<template #default="scope">
<div class="operation">
<el-popconfirm title="确定要通过此条记录吗?" @confirm="handleApprove(scope.row)">
<template #reference>
<el-button :disabled="scope.row.auditStatus === 1 || scope.row.auditStatus === 2" type="primary" text>
通过
</el-button>
</template>
</el-popconfirm>
<el-button :disabled="scope.row.auditStatus === 1 || scope.row.auditStatus === 2" type="primary" text
@click="showRejectDialog(scope.row)">
驳回
</el-button>
</div>
</template>
</el-table-column>
</el-table>
<el-pagination v-model:current-page="pagination.pageNum" v-model:page-size="pagination.pageSize"
:total="pagination.total" :page-sizes="[10, 20, 50, 100]" layout="total, sizes, prev, pager, next, jumper"
@size-change="handlePagination('size', $event)" @current-change="handlePagination('page', $event)"
class="pagination" />
<el-pagination class="pagination" v-model:current-page="pagination.pageNum" v-model:page-size="pagination.pageSize"
layout="total, sizes, prev, pager, next, jumper" :total="pagination.total" @size-change="handlePageSizeChange"
@current-change="handleCurrentChange"></el-pagination>
</el-card>
<!-- 驳回弹出框 -->
<el-dialog v-model="rejectDialog" title="驳回理由" width="500px">
<el-form :model="rejectForm">
<el-dialog v-model="rejectDialogVisible" title="驳回理由" width="500px">
<el-form>
<el-form-item label="驳回理由">
<el-input v-model="rejectForm.reason" type="textmarket" :rows="4" placeholder="请输入驳回理由" maxlength="200"
<el-input v-model="rejectReason" type="textarea" :rows="4" placeholder="请输入驳回理由" maxlength="200"
show-word-limit />
</el-form-item>
</el-form>
<template #footer>
<el-form :model="rejectObj" ref="Ref" :rules="rules" label-width="auto" style="max-width: 600px">
<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>
</div>
<span class="dialog-footer">
<el-button @click="rejectDialogVisible = false">取消</el-button>
<el-button type="primary" @click="handleReject">确定</el-button>
</span>
</template>
</el-dialog>
</template>
<script setup>
import {onMounted, reactive, ref} from 'vue'
import {ElMessage} from 'element-plus'
import request from '@/util/http'
import { onMounted, reactive, ref } from 'vue'
import { ElMessage } from 'element-plus'
import API from '@/util/http'
import moment from 'moment'
/*
================数据=========================
*/
const scopeValue = ref(null) //
const rejectDialogVisible = ref(false) //
const rejectReason = ref('') //
//
const STATUS = {
PENDING: 0, //
APPROVED: 1, //
REJECTED: 2 //
}
//
const searchForm = ref({
jwcode: '',
refundModel: '',
refundGoods: '',
goodsName: '',
market: '',
startDate: '',
endDate: '',
startTime: '',
endTime: '',
auditStatus: '0',
})
const checkTab = ref('pending') // STATUS123statusInteger
const checkTab = ref('pending') // STATUS012statusInteger
const dateRange = ref([])
const pagination = ref({
pageNum: 1,
pageSize: 50,
total: 0
})
const tableData = ref([])
const marketOptions = ref([])
const refundGoodsOptions = ref([])
const adminInfo = ref({})
//
const stats = ref({
totalItems: 0,
totalNum: 0,
totalCoins: 0,
permanentCoins: 0,
freeCoins: 0,
taskCoins: 0
permanentGolds: 0,
freeGolds: 0,
taskGolds: 0
})
//
const rejectVisible = ref(false)
//
const rejectObj = ref({})
//
const passObj = ref({})
//
const activeName = ref('wait')
//
const refundMode = [
{
value: '部分退款',
label: '部分退款'
},
{
value: '全额退款',
label: '全额退款'
}
]
// ref
const Ref = ref(null)
//
const sortField = ref('')
const sortOrder = ref('')
//
const rules = reactive({
reason: [{required: true, message: '请输入驳回理由', trigger: 'blur'}]
reason: [{ required: true, message: '请输入驳回理由', trigger: 'blur' }]
})
/*
======================方法==========================
*/
//
// const getAdminInfo = async () => {
// try {
// const res = await request({ url: '' })
// const res = await API({ url: '' })
// adminInfo.value = res
// if (res.market !== '') {
// searchForm.value.market = res.market
@ -239,11 +227,26 @@ const rules = reactive({
// console.error('', error)
// }
// }
const handlePageSizeChange = function (val) {
pagination.value.pageSize = val
get()
console.log('aaaaaaaaaaaaaaaaaa这是pageSize改变调用')
}
const handleCurrentChange = function (val) {
pagination.value.pageNum = val
get()
console.log('aaaaaaaaaaaaaaa这是pageNum改变调用')
}
//
const showRejectDialog = (row) => {
scopeValue.value = row
rejectReason.value = ''
rejectDialogVisible.value = true
}
//
const getmarkets = async () => {
try {
const result = await request({ url: 'general/market' })
const result = await API({ url: 'general/market' })
marketOptions.value = result.data || []
} catch (error) {
console.error('获取地区列表失败', error)
@ -251,10 +254,10 @@ const getmarkets = async () => {
}
//
const getRefundGoods = async () => {
try{
const res = await request({ url: '/general/goods' })
try {
const res = await API({ url: '/general/goods' })
refundGoodsOptions.value = res.data || []
}catch (error) {
} catch (error) {
console.error('获取商品列表失败', error)
}
}
@ -262,25 +265,16 @@ const getRefundGoods = async () => {
//
const get = async function (val) {
try {
//
if (typeof val === 'number') {
pagination.value.pageNum = val
}
//
if (dateRange.value != null) {
if (dateRange.value.length === 2) {
searchForm.value.startTime = moment(dateRange.value[0]).format('YYYY-MM-DD HH:mm:ss')
searchForm.value.endTime = moment(dateRange.value[1]).format('YYYY-MM-DD HH:mm:ss')
}
if (dateRange.value && dateRange.value.length === 2) {
searchForm.value.startTime = moment(dateRange.value[0]).format('YYYY-MM-DD HH:mm:ss')
searchForm.value.endTime = moment(dateRange.value[1]).format('YYYY-MM-DD HH:mm:ss')
} else {
searchForm.value.startTime = ''
searchForm.value.endTime = ''
}
searchForm.value.sortField = sortField.value
searchForm.value.sortOrder = sortOrder.value
console.log('搜索参数', pagination.value)
const params = {
pageNum: pagination.value.pageNum,
pageSize: pagination.value.pageSize,
@ -288,62 +282,79 @@ const get = async function (val) {
...searchForm.value
}
}
const res = await request({
url: '/audit/selectRefund',
data: params
})
console.log('看看传给后端的参数:', 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)
} catch (error) {
console.error('获取数据失败', error)
}
}
//
const handleApprove = async (row) => {
try {
const params = {
orderCode: row.orderCode,
auditId: row.auditId,
action: 1,// action1,2
rejectReason: ''
}
await API({ url: '/audit/audit', data: params })//
ElMessage.success('审核通过成功')
get()
getStats()
console.log('aaaaaaaaaa这是通过调用')
} catch (error) {
console.error('审核通过失败', error)
ElMessage.error('操作失败')
}
}
//
const handleReject = async () => {
if (!rejectReason.value.trim()) {
ElMessage.warning('请输入驳回理由')
return
}
try {
const params = {
orderCode: scopeValue.value.orderCode,
auditId: scopeValue.value.auditId,
action: 2,
rejectReason: rejectReason.value
}
await API({ url: '/audit/audit', data: params })
ElMessage.success('驳回成功')
rejectDialogVisible.value = false
get()
getStats()
console.log('aaaaaaaaaa这是驳回调用')
} catch (error) {
console.error('驳回失败', error)
ElMessage.error('操作失败')
}
}
const getStats = async () => {
try {
const params = { ...searchForm.value, status: getCurrentStatus() }
const res = await request({
url: '/audit/refund',
const params = {
pageNum: pagination.value.pageNum,
pageSize: pagination.value.pageSize,
refundAudit: {
...searchForm.value
}
}
const res = await API({
url: '/audit/sumRefundGold',
data: params
})
//
if (result2.data) {
result2.data.forEach((item) => {
switch (item.auditStatus) {
case '待审核':
stats.value.totalItems = item.raudit || 0
stats.value.totalCoins = item.sumRaudit || 0
stats.value.permanentCoins = item.sumRaudit1 || 0
stats.value.freeCoins = item.sumRaudit2 || 0
stats.value.taskCoins = item.sumRaudit3 || 0
break
case '已通过':
stats.value.totalItems = item.raudit || 0
stats.value.totalCoins = item.sumRaudit || 0
stats.value.permanentCoins = item.sumRaudit1 || 0
stats.value.freeCoins = item.sumRaudit2 || 0
stats.value.taskCoins = item.sumRaudit3 || 0
break
case '已驳回':
stats.value.totalItems = item.raudit || 0
stats.value.totalCoins = item.sumRaudit || 0
stats.value.permanentCoins = item.sumRaudit1 || 0
stats.value.freeCoins = item.sumRaudit2 || 0
stats.value.taskCoins = item.sumRaudit3 || 0
break
}
})
}
console.log('搜索对象', pagination.value)
//
tableData.value = result.data.list
console.log('tableData', tableData.value)
//
pagination.value.total = result.data.total
console.log('total', pagination.value.total)
stats.value.totalNum = res.totalNum
stats.value.permanentGolds = res.permanentGolds / 100
stats.value.freeGolds = res.freeGolds / 100
stats.value.taskGolds = res.taskGolds / 100
console.log('see see stats和搜索对象', stats.value,params)
} catch (error) {
console.log('请求失败', error)
}
@ -351,8 +362,10 @@ const getStats = async () => {
//
const handleSearch = function () {
pagination.value.pageNum = 1
// pagination.value.pageNum = 1
get()
getStats()
console.log('aaaaaaaaaa这是搜索按钮调用')
}
//
@ -360,68 +373,73 @@ const resetSearch = function () {
searchForm.value = {
jwcode: '',
refundType: '',
refundGoods: '',
goodsName: '',
market: adminInfo.value.market === '总部' ? '' : adminInfo.value.market,
startDate: '',
endDate: ''
startTime: '',
endTime: ''
}
dateRange.value = []
handleSearch()
}
//
const getToday = function () {
const today = new Date()
const startTime = new Date(
today.getFullYear(),
today.getMonth(),
today.getDate()
today.getFullYear(),
today.getMonth(),
today.getDate()
)
const endTime = new Date(
today.getFullYear(),
today.getMonth(),
today.getDate() + 1
today.getFullYear(),
today.getMonth(),
today.getDate() + 1
)
dateRange.value = [startTime, endTime]
console.log('dateRange', dateRange.value)
get()
getStats()
console.log('aaaaaaaaaa这是今天调用')
}
//
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
)
dateRange.value = [startDate, endDate]
dateRange.value = [startTime, endTime]
console.log('dateRange', dateRange.value)
get()
getStats()
console.log('aaaaaaaaaa这是昨天调用')
}
// 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
)
dateRange.value = [startDate, endDate]
dateRange.value = [startTime, endTime]
console.log('dateRange', dateRange.value)
get()
getStats()
console.log('aaaaaaaaaa这是近七天调用')
}
//
@ -452,111 +470,41 @@ const getCurrentStatus = () => {
//
const adminWait = async function () {
searchForm.value.status = STATUS.PENDING
pagination.value.pageNum = 1
checkTab.value = 'pending'
searchForm.value.auditStatus = STATUS.PENDING
// pagination.value.pageNum = 1
await get()
console.log('adminWait')
await getStats()
console.log('aaaaaaaaaaaaaaaaa看看checkTab,这是点击待审核调用', checkTab.value)
}
//
const adminPass = async function () {
searchForm.value.status = STATUS.APPROVED
pagination.value.pageNum = 1
checkTab.value = 'pass'
searchForm.value.auditStatus = STATUS.APPROVED
// pagination.value.pageNum = 1
await get()
console.log('adminPass')
await getStats()
console.log('aaaaaaaaaaaaaaaaaaaaa看看checkTab,这是点击已通过调用', checkTab.value)
}
//
const adminReject = async function () {
searchForm.value.status = STATUS.REJECTED
pagination.value.pageNum = 1
checkTab.value = 'reject'
searchForm.value.auditStatus = STATUS.REJECTED
// pagination.value.pageNum = 1
await get()
console.log('adminReject')
}
const handlePagination = (type, val) => {
if (type === 'size') {
pagination.value.pageSize = val
} else {
pagination.value.pageNum = val
}
get()
}
const Approval = (type, row) => {
currentRecord.value = row
if (type === 'reject') {
rejectForm.value.reason = ''
rejectDialog.value = true
} else if (type === 'approve') {
approveRefund()
}
}
//
const passConfirm = async function (row) {
try {
const params = {
adminId: adminInfo.value.adminId,
auditId: currentRecord.value.auditId,
status: STATUS.APPROVED,
refundId: currentRecord.value.refundId
}
await request({
url: '/audit/audit',
data: params
})
console.log('请求成功', result)
get()
//
ElMessage({
type: 'success',
message: '通过成功!'
})
} catch (error) {
console.error('请求失败', error);
ElMessage({
type: 'error',
message: '出错了,不知道咋回事'
});
}
}
const rejectRefund = async () => {
if (!rejectForm.value.reason) {
ElMessage.warning('请输入驳回理由')
return
}
try {
const params = {
adminId: adminInfo.value.adminId,
auditId: currentRecord.value.auditId,
status: STATUS.REJECTED,
refundId: currentRecord.value.refundId,
reason: rejectForm.value.reason
}
await request({
url: '/audit/audit',
data: params
})
ElMessage.success('退款已驳回')
rejectDialog.value = false
get()
} catch (error) {
console.error('驳回失败', error)
ElMessage.error('操作失败')
}
await getStats()
console.log('aaaaaaaaaaaaaaaaaa看看checkTab,这是点击已驳回调用', checkTab.value)
}
onMounted(async () => {
//await getAdminInfo()//
await getRefundGoods()
await getmarkets()
getRefundGoods()
getmarkets()
await get()
await getStats()
console.log('aaaaaaaaaa这是挂载后调用')
})
</script>
@ -569,18 +517,6 @@ onMounted(async () => {
display: flex;
}
.green-dot {
background-color: #67C23A;
}
.grey-dot {
background-color: #909399;
}
.red-dot {
background-color: #F56C6C;
}
.time-controls {
display: flex;
align-items: center;
@ -591,46 +527,4 @@ onMounted(async () => {
align-items: center;
gap: 10px;
}
.quick-buttons {
display: flex;
align-items: center;
}
.status {
display: flex;
align-items: center;
/* 确保子元素垂直居中对齐 */
gap: 6px;
/* 设置圆点和文字之间的间距 */
}
.green-dot,
.grey-dot,
.red-dot {
display: inline-block;
width: 8px;
height: 8px;
border-radius: 50%;
flex-shrink: 0;
/* 防止圆点在空间不足时缩小 */
margin: 0;
/* 移除原有的 margin-right */
}
/* 备注列样式 */
.remark-cell {
display: block;
width: 100%;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
/* 设置单元格内容溢出隐藏 */
.el-table .el-table__cell {
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
</style>

4
src/views/consume/addCoinConsume.vue

@ -178,7 +178,7 @@ const add = async function () {
// POST
const result = await request({
// url: "/consume/add",
url: "http://18.143.76.3:10704/consume/add",
url: "/consume/add",
data: {
...addConsume.value,
jwcode: addConsume.value.jwcode,
@ -289,7 +289,7 @@ const getUser = async function (jwcode) {
// POST
const result = await request({
// url: "user/selectUser",
url: "http://18.143.76.3:10704/user/selectUser", // todo ip
url: "/user/selectUser", // todo ip
data: {
//
jwcode: addConsume.value.jwcode,

14
src/views/consume/coinConsumeDetail.vue

@ -109,7 +109,7 @@ const totalGoldSearch = ref({
const getAdminData = async function () {
try {
const result = await request({
url: 'http://18.143.76.3:10704/admin/userinfo',
url: '/admin/userinfo',
data: {}
})
adminData.value = result
@ -150,7 +150,7 @@ const ConsumeSelectBy = async function (val) {
// POST
const result = await request({
url: 'http://18.143.76.3:10704/consume/selectBy',
url: '/consume/selectBy',
data: {
pageNum: getObj.value.pageNum,
pageSize: getObj.value.pageSize,
@ -179,8 +179,8 @@ const ConsumeSelectBy = async function (val) {
totalGoldSearch.value.goodsName = consumeUser.value.goodsName
//
const resultTotalGold = await request({
// url: 'http://18.143.76.3:10704/consume/statsGold',
url: 'http://18.143.76.3:10704/consume/statsGold',
// url: '/consume/statsGold',
url: '/consume/statsGold',
data: totalGoldSearch.value
})
@ -321,7 +321,7 @@ const getGoods = async function () {
try {
// POST
const result = await request({
url: 'http://18.143.76.3:10704/general/goods',
url: '/general/goods',
data: {}
})
//
@ -341,7 +341,7 @@ const getMarket = async function () {
//
const result = await request({
// url: '/general/market',
url: 'http://18.143.76.3:10704/general/market', // todo
url: '/general/market', // todo
data: {}
})
console.log('请求地区列表成功', result)
@ -594,7 +594,7 @@ onMounted(async function () {
fixed="left"
/>
<el-table-column prop="market" label="所属地区" width="110px"/>
<el-table-column prop="goodsName" label="商品" width="160px"/>
<el-table-column prop="goodsName" label="商品" width="160px" show-overflow-tooltip/>
<el-table-column
prop="payPlatform"
label="消费平台"

2
src/views/home.vue

@ -36,7 +36,7 @@ const currentArea = ref('全部')
const getAreas = async function () {
try {
const result = await API({ url: 'http://18.143.76.3:10704/general/market', data: {} })
const result = await API({ url: '/general/market', data: {} })
areas.value = result.data
console.log('请求成功', result)
} catch (error) {

2
src/views/index.vue

@ -36,7 +36,7 @@ const currentArea = ref('全部')
const getAreas = async function () {
try {
const result = await API({ url: 'http://18.143.76.3:10704/general/market', data: {} })
const result = await API({ url: '/general/market', data: {} })
areas.value = result.data
console.log('请求成功', result)
} catch (error) {

273
src/views/login-hxl.vue

@ -0,0 +1,273 @@
<template>
<div class="total">
<div
class="box"
:class="{ 'box-animaToR': isAnimating, 'box-animaToL': !isAnimating }"
@click="startAnimation1"
>
<div v-if="!isTextAnimating">
<span class="title" :class="{ 'title-animaT': isAnimating }"
>管理员登录</span
>
<el-icon
class="right"
:class="{ 'arrow-anima': !isAnimating, 'title-animaT': isAnimating }"
>
<Right />
</el-icon>
</div>
<div v-else>
<span class="title" :class="{ 'title-animaT': !isAnimating }"
>用户登录</span
>
<el-icon
class="left"
:class="{ 'arrow-anima': isAnimating, 'title-animaT': !isAnimating }"
>
<Back />
</el-icon>
</div>
</div>
<div class="login user">
<div class="loginTitle">用户登录</div>
<el-form :model="userInfo" label-width="auto" style="max-width: 600px">
<el-form-item label="账号">
<el-input v-model="userInfo.username" />
</el-form-item>
<el-form-item label="密码">
<el-input v-model="userInfo.password" />
</el-form-item>
<el-form-item>
<el-button type="success" style="width: 100%">登录</el-button>
</el-form-item>
</el-form>
</div>
<div class="login admin">
<div class="loginTitle">管理员登录</div>
<el-form :model="userInfo" label-width="auto" style="max-width: 600px">
<el-form-item label="账号">
<el-input v-model="userInfo.username" />
</el-form-item>
<el-form-item label="密码">
<el-input v-model="userInfo.password" />
</el-form-item>
<el-form-item>
<el-button type="success" style="width: 100%" @click="login()"
>登录</el-button
>
</el-form-item>
</el-form>
</div>
</div>
</template>
<script setup>
import { ref, onMounted } from "vue";
import axios from "axios";
import API from "@/util/http";
import { useRouter } from "vue-router";
const router = useRouter();
const firstAnimating = ref(false);
const isAnimating = ref(false);
const isTextAnimating = ref(false);
const startAnimation = () => {
isAnimating.value = !isAnimating.value;
setTimeout(() => {
isTextAnimating.value = !isTextAnimating.value;
}, 400);
};
const userInfo = ref({
username: "12345678",
password: "123456",
});
const login = async function () {
try {
const result = await axios.post(`http://18.143.76.3:10704/admin/login`, {
account: userInfo.value.username,
password: userInfo.value.password,
machineId: "23131233213",
});
// const result = await API({
// url: "/admin/login",
// data: {
// account: userInfo.username,
// password: userInfo.password,
// machineId: "",
// },
// });
console.log("请求成功", result);
router.push({
name: "workspace",
query: {
machineId: result.data.data.machineId,
},
});
} catch (error) {
console.log("请求失败", error);
}
};
</script>
<style scoped>
.login {
position: absolute;
z-index: 1;
width: 30%;
}
.loginTitle {
font-size: 48px;
font-weight: bold;
margin-bottom: 20px;
text-align: center;
}
.user {
top: 30%;
left: 10%;
}
.admin {
top: 30%;
left: 55%;
}
.total {
width: 100%;
height: 100%;
display: flex;
}
.title {
position: absolute;
font-size: 48px;
font-weight: bold;
top: 40%;
left: 30%;
z-index: 2;
}
.title-animaT {
animation: textAnimaT 0.7s forwards;
}
.title-animaF {
animation: textAnimaF 0.7s forwards;
}
@keyframes textAnimaF {
0% {
opacity: 1;
}
50% {
opacity: 0;
}
100% {
opacity: 0;
}
}
@keyframes textAnimaT {
0% {
opacity: 1;
}
50% {
opacity: 0;
}
100% {
opacity: 0;
}
}
.box {
width: 50%;
height: 100%;
margin: 0;
background: linear-gradient(90deg, #ffae00, #ffffff);
border-radius: 5%;
z-index: 99;
}
.box-animaToR {
animation: animaToR 1s forwards;
}
.box-animaToL {
animation: animaToL 1s forwards;
}
@keyframes animaToR {
0% {
transform: translateX(0) scaleX(1);
background: linear-gradient(90deg, #ffffff, #29e6ff);
}
/* 50% {
transform: translateX(50%) scaleX(2);
} */
100% {
transform: translateX(100%) scaleX(1);
background: linear-gradient(90deg, #ffffff, #29e6ff);
}
}
@keyframes animaToL {
0% {
transform: translateX(100%) scaleX(1);
}
/* 50% {
transform: translateX(50%) scaleX(2);
} */
100% {
transform: translateX(0%) scaleX(1);
background: linear-gradient(90deg, #ffae00, #ffffff);
}
}
.right {
position: absolute;
right: 10%;
top: 40%;
font-size: 72px;
}
.left {
position: absolute;
left: 10%;
top: 40%;
font-size: 72px;
z-index: 2;
}
.arrow-anima {
animation: arrowAnima 1s infinite;
}
@keyframes arrowAnima {
0% {
transform: translateX(0);
}
50% {
transform: translateX(10px);
}
100% {
transform: translateX(0);
}
}
</style>

6
src/views/managerecharge/rate.vue

@ -130,7 +130,7 @@ const getAllRate = async function (val) {
// POST
const result = await request({
url: 'http://18.143.76.3:10704/rate/selectAll',
url: '/rate/selectAll',
method: 'POST',
data: {
pageNum: getObj.value.pageNum,
@ -170,7 +170,7 @@ const getEditData = async function (row) {
console.log('搜索参数', getObj.value)
// POST
const result = await request({
url: 'http://18.143.76.3:10704/rate/selectById',
url: '/rate/selectById',
data: {id: row.id}
})
@ -195,7 +195,7 @@ const editRate = async function () {
console.log('搜索参数', rateEdit.value)
// POST
const result = await request({
url: 'http://18.143.76.3:10704/rate/update',
url: '/rate/update',
data: rateEdit.value
})
//

6
src/views/recharge/addCoinRecharge.vue

@ -97,7 +97,7 @@ const add = async function () {
console.log('开始添加充值信息', recharge.value)
// POST
const result = await API({
url: 'http://18.143.76.3:10704/recharge/add',
url: '/recharge/add',
data: formattedRecharge
})
if (result.code === 0) {
@ -227,7 +227,7 @@ const getUser = async function (jwcode) {
// POST
const result = await API({
url: 'http://18.143.76.3:10704/user/selectUser',
url: '/user/selectUser',
data: {
jwcode: recharge.value.jwcode
}
@ -256,7 +256,7 @@ const getActivity = async function () {
try {
// POST
const result = await API({
url: 'http://18.143.76.3:10704/general/activity',
url: '/general/activity',
data: {
}

3
src/views/recharge/beanRecharge.vue

@ -343,7 +343,7 @@ const getActivity = async function () {
const getArea = async function () {
try {
// POST
const result = await API({ url: 'http://18.143.76.3:10704/general/market', data: {} })
const result = await API({ url: '/general/market', data: {} })
//
console.log('请求成功', result)
//
@ -584,6 +584,7 @@ const handleSortChange = (column) => {
prop="activityName"
label="活动名称"
width="150px"
show-overflow-tooltip
/>
<!-- <el-table-column prop="" label="货币名称" width="120px" /> -->
<el-table-column

10
src/views/recharge/coinRechargeDetail.vue

@ -92,7 +92,7 @@ const delObj = ref({})
const getActivity = async function () {
try {
// POST
const result = await API({ url: 'http://18.143.76.3:10704/general/activity', data: {} })
const result = await API({ url: '/general/activity', data: {} })
//
console.log('请求成功', result)
@ -117,7 +117,7 @@ const getActivity = async function () {
const getArea = async function () {
try {
// POST
const result = await API({ url: 'http://18.143.76.3:10704/general/market', data: {} })
const result = await API({ url: '/general/market', data: {} })
//
console.log('请求成功', result)
//
@ -138,7 +138,7 @@ const getPlatform = async () => {
isLoadingPlatform.value = true;
try {
const result = await API({
url: 'http://18.143.76.3:10704/general/platform',
url: '/general/platform',
method: 'post',
data: {}//
})
@ -181,7 +181,7 @@ const get = async function (val) {
console.log('搜索参数', getObj.value)
// POST
const result = await API({
url: 'http://18.143.76.3:10704/recharge/selectBy',
url: '/recharge/selectBy',
data: {
...getObj.value,
rechargeUser: { ...rechargeUser.value }
@ -198,7 +198,7 @@ const get = async function (val) {
payPlatform: rechargeUser.value.payPlatform
})
const resultTotalGold = await API({
url: 'http://18.143.76.3:10704/recharge/statsGold',
url: '/recharge/statsGold',
data: {
...detailWithoutSort.value
}

8
src/views/refund/addCoinRefund.vue

@ -86,7 +86,7 @@ const add = async function () {
}
// POST
const result = await API({ url: 'http://18.143.76.3:10704/refund/add',
const result = await API({ url: '/refund/add',
data: processedRefund
})
if (result.code === 0) {
@ -162,7 +162,7 @@ const getUser = async function (jwcode) {
try {
// POST
const result = await API({
url: 'http://18.143.76.3:10704/user/selectUser',
url: '/user/selectUser',
data: {
jwcode: addRefund.value.jwcode
}
@ -206,7 +206,7 @@ const getRefundTypes = async function () {
try {
// 退
const result = await API({
url: 'http://18.143.76.3:10704/refund/refundType', //退
url: '/refund/refundType', //退
data: {} })
console.log('退款类型请求成功', result)
//
@ -236,7 +236,7 @@ const getGoods = async function (jwcode) {
// POST
const result = await API({
// url: 'http://39.101.133.168:8828/live_mall/api/product/all', //
url: 'http://18.143.76.3:10704/refund/selectGoods',
url: '/refund/selectGoods',
data: {
jwcode: addRefund.value.jwcode
}

10
src/views/refund/coinRefundDetail.vue

@ -76,7 +76,7 @@ const getRefundTypes = async function () {
try {
// 退
const result = await API({
url: 'http://18.143.76.3:10704/refund/refundType', //退
url: '/refund/refundType', //退
data: {} })
console.log('退款类型请求成功', result)
//
@ -121,7 +121,7 @@ const getSelectBy = async function (val) {
console.log('搜索参数', getObj.value)
// POST
const result = await API({
url: 'http://18.143.76.3:10704/refund/selectBy',
url: '/refund/selectBy',
data: {
...getObj.value,
refundUser: { ...refundUser.value }
@ -133,7 +133,7 @@ const getSelectBy = async function (val) {
delete detailWithoutSort.sortOrder
const resultTotalGold = await API({
url: 'http://18.143.76.3:10704/refund/statsGold',
url: '/refund/statsGold',
data: {
...detailWithoutSort
}
@ -255,7 +255,7 @@ const handleClick = function (tab, event) {
const getMarket = async function () {
try {
// POST
const result = await API({ url: 'http://18.143.76.3:10704/general/market', data: {} })
const result = await API({ url: '/general/market', data: {} })
//
console.log('请求成功', result)
//
@ -297,7 +297,7 @@ const getGoods = async function () {
try {
// POST
const result = await request({
url: 'http://18.143.76.3:10704/general/goods',
url: '/general/goods',
data: {}
})
//

6
src/views/usergold/clientCountBalance.vue

@ -30,7 +30,7 @@ const getmarket = async () => {
isLoadingmarket.value = true;
try {
const result = await API({
url: 'http://18.143.76.3:10704/general/market'
url: '/general/market'
});
console.log('获取地区数据成功',result)
// { value, label }
@ -118,7 +118,7 @@ const get = async function (val) {
//console.log('', requestData);
const result = await API({
url: 'http://18.143.76.3:10704/goldDetail/getGold',
url: '/goldDetail/getGold',
method: 'post',
data: { ...getObj.value, user: { ...user.value } }
})
@ -129,7 +129,7 @@ const get = async function (val) {
//
const resultGoldTotal = await API({
url: 'http://18.143.76.3:10704/goldDetail/goldTotal',
url: '/goldDetail/goldTotal',
data: {
...getAllObj.value,
user: { ...user.value }

6
src/views/usergold/clientCountDetail.vue

@ -42,7 +42,7 @@ const getPlatform = async () => {
isLoadingPlatform.value = true;
try {
const result = await API({
url: 'http://18.143.76.3:10704/general/platform',
url: '/general/platform',
method: 'post',
data: {}//
})
@ -85,7 +85,7 @@ const getArea = async () => {
isLoadingArea.value = true;
try {
const result = await API({
url: 'http://18.143.76.3:10704/general/market'
url: '/general/market'
});
// { value, label }
if (Array.isArray(result.data) && typeof result.data[0] === 'string') {
@ -168,7 +168,7 @@ const get = async function (val) {
//console.log('', requestData);
const result = await API({
url: 'http://18.143.76.3:10704/goldDetail/getGoldDetail',
url: '/goldDetail/getGoldDetail',
method: 'post',
data: { ...getObj.value, goldDetail: { ...goldDetail.value } }
})

Loading…
Cancel
Save