Browse Source

Merge branch 'milestone-20250728-金币前端三期' of http://39.101.133.168:8807/huangqizhen/gold-vue into zhangyong/feature-20250716164232-金币前端

zhangrenyuan/feature-20250728113353-金币前端三期
ZhangYong 2 weeks ago
parent
commit
8b31de3f6c
  1. 7
      .env.development
  2. BIN
      src/assets/403.png
  3. 25
      src/router/index.js
  4. 412
      src/views/audit/beanAudit.vue
  5. 12
      src/views/audit/gold/rechargeAudit.vue
  6. 9
      src/views/audit/gold/refundAudit.vue
  7. 32
      src/views/consume/bean/addBeanConsume.vue
  8. 78
      src/views/consume/bean/articleVideo.vue
  9. 4
      src/views/consume/bean/beanConsume.vue
  10. 67
      src/views/consume/bean/dieHardFan.vue
  11. 69
      src/views/consume/bean/liveStream.vue
  12. 9
      src/views/consume/gold/addCoinConsume.vue
  13. 7
      src/views/consume/gold/coinConsumeDetail.vue
  14. 111
      src/views/noPermissionPage.vue
  15. 4
      src/views/permissions/rolePermission.vue
  16. 2
      src/views/permissions/userPermission.vue
  17. 4
      src/views/recharge/gold/addCoinRecharge.vue
  18. 6
      src/views/recharge/gold/coinRechargeDetail.vue
  19. 9
      src/views/refund/gold/addCoinRefund.vue
  20. 7
      src/views/refund/gold/coinRefundDetail.vue
  21. 6
      src/views/usergold/gold/clientCountDetail.vue
  22. 178
      src/views/usergold/userbean.vue

7
.env.development

@ -1,12 +1,13 @@
VITE_API_BASE='https://hwjb.homilychart.com/dev/admin'
# VITE_API_BASE='https://hwjb.homilychart.com/dev/admin'
# 测试环境 # 测试环境
# VITE_API_BASE='http://18.143.76.3:10704/' # VITE_API_BASE='http://18.143.76.3:10704/'
# VITE_API_BASE='http://192.168.9.52:10705/' # VITE_API_BASE='http://192.168.9.52:10705/'
VITE_UPLOAD_URL=http://39.101.133.168:8828/hljw/api/aws/upload VITE_UPLOAD_URL=http://39.101.133.168:8828/hljw/api/aws/upload
# VITE_API_BASE='http://192.168.9.28:8081/' # VITE_API_BASE='http://192.168.9.28:8081/'
# VITE_API_BASE='http://192.168.9.28:8081/'
# sunjiabei # sunjiabei
# VITE_API_BASE='http://192.168.9.28:8081/' # VITE_API_BASE='http://192.168.9.28:8081/'
# VITE_API_BASE='http://192.168.5.92:8081/' # VITE_API_BASE='http://192.168.5.92:8081/'
# zhangyong # zhangyong
# VITE_API_BASE='http://192.168.9.62:8081/'
# VITE_API_BASE='http://192.168.3.83:8081/'
# 李慧琳
VITE_API_BASE='http://localhost:8081/'

BIN
src/assets/403.png

After

Width: 1024  |  Height: 1024  |  Size: 17 KiB

25
src/router/index.js

@ -52,6 +52,11 @@ const routes = [
meta: {permissionId: [13, 14]} // 对应"查看退款审核"id=13、"退款审批"id=14 meta: {permissionId: [13, 14]} // 对应"查看退款审核"id=13、"退款审批"id=14
}, },
] ]
},{
path: 'beanAudit',
name: "beanAudit",
component: () => import("../views/audit/beanAudit.vue"),
meta: {permissionId: [54,55]}
}, },
@ -83,35 +88,35 @@ const routes = [
{ {
path: '/beanConsume', path: '/beanConsume',
name: "beanConsume", name: "beanConsume",
component: () => import("../views/consume/beanConsume.vue"),
component: () => import("../views/consume/bean/beanConsume.vue"),
meta: {permissionId: 42}, meta: {permissionId: 42},
children: [ children: [
// 金豆新增消耗 // 金豆新增消耗
{ {
path: 'add', path: 'add',
name: "addBeanConsume", name: "addBeanConsume",
component: () => import("../views/consume/addBeanConsume.vue"),
component: () => import("../views/consume/bean/addBeanConsume.vue"),
meta: {permissionId: 49} // 对应"提交金豆消耗"id=49 meta: {permissionId: 49} // 对应"提交金豆消耗"id=49
}, },
// 直播 // 直播
{ {
path: 'live', path: 'live',
name: "liveStream", name: "liveStream",
component: () => import("../views/consume/liveStream.vue"),
component: () => import("../views/consume/bean/liveStream.vue"),
meta: {permissionId: 50} // 对应"直播"id=50 meta: {permissionId: 50} // 对应"直播"id=50
}, },
// 铁粉 // 铁粉
{ {
path: 'fan', path: 'fan',
name: "dieHardFan", name: "dieHardFan",
component: () => import("../views/consume/dieHardFan.vue"),
component: () => import("../views/consume/bean/dieHardFan.vue"),
meta: {permissionId: 51} // 对应"铁粉"id=51 meta: {permissionId: 51} // 对应"铁粉"id=51
}, },
// 文章视频 // 文章视频
{ {
path: 'article', path: 'article',
name: "articleVideo", name: "articleVideo",
component: () => import("../views/consume/articleVideo.vue"),
component: () => import("../views/consume/bean/articleVideo.vue"),
meta: {permissionId: 52} // 对应"文章视频"id=52 meta: {permissionId: 52} // 对应"文章视频"id=52
} }
@ -229,8 +234,14 @@ const routes = [
}, },
] ]
}, },
{
path: 'userbean',
name: "userbean",
component: () => import("../views/usergold/userbean.vue"),
meta:{ permissionId: 45 }
},
// 权限
// 权限管理
{ {
path: '/permissions', path: '/permissions',
name: "permissions", name: "permissions",
@ -330,7 +341,7 @@ router.beforeEach(async (to, from, next) => {
// 获取管理员信息 // 获取管理员信息
let roleId = null; let roleId = null;
console.log('adminData:', adminData)
console.log('路由的adminData:', adminData.value)
try { try {
roleId = adminData.value.roleId; roleId = adminData.value.roleId;
if (!roleId) { if (!roleId) {

412
src/views/audit/beanAudit.vue

@ -1,11 +1,413 @@
<script setup lang="ts">
<template>
<el-card style="margin-bottom: 5px">
<el-row style="margin-bottom: 10px">
<el-col :span="6">
<el-text size="large">精网号</el-text>
<el-input v-model="searchForm.jwcode" placeholder="请输入精网号" style="width: 240px" clearable />
</el-col>
<el-col :span="6">
<el-text size="large">所属地区</el-text>
<el-select v-model="searchForm.market" placeholder="请选择" style="width: 240px" clearable>
<el-option v-for="item in marketOptions" :key="item" :label="item" :value="item" />
</el-select>
</el-col>
</el-row>
<el-row>
<el-col :span="15">
<div class="time-controls">
<div class="time-group">
<el-text size="large" style="width: 80px">充值时间</el-text>
<el-date-picker v-model="dateRange" type="datetimerange" range-separator=""
start-placeholder="开始时间" end-placeholder="结束时间" style="width: 400px"
@change="handleDatePickerChange" />
<el-button @click="getToday()" style="margin-left: 10px"
:type="activeTimeRange === 'today' ? 'primary' : ''"> </el-button>
<el-button @click="getYesterday()" style="margin-left: 10px"
:type="activeTimeRange === 'yesterday' ? 'primary' : ''"> </el-button>
<el-button @click="get7Days()" style="margin-left: 10px"
:type="activeTimeRange === '7days' ? 'primary' : ''"> 近7天</el-button>
<el-button type="success" @click="resetSearch">重置</el-button>
<el-button type="primary" @click="handleSearch">查询</el-button>
</div>
</div>
</el-col>
</el-row>
</el-card>
</script>
<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>
</el-tabs>
<template>
<div>
总条数{{ stats.num }}&nbsp;&nbsp;&nbsp;&nbsp;
总金豆数{{ stats.beanNum }}金豆&nbsp;&nbsp;&nbsp;&nbsp;
永久金豆{{ stats.permanentBean }}金豆&nbsp;&nbsp;&nbsp;&nbsp;
免费金豆{{ stats.freeBean }}金豆
</div>
<el-table :data="tableData" height="540px" @sort-change="handleSortChange">
<el-table-column prop="id" label="序号" width="80" />
<el-table-column prop="name" label="姓名" width="120" show-overflow-tooltip />
<el-table-column prop="jwcode" label="精网号" width="120" />
<el-table-column prop="market" label="所属地区" width="120" />
<el-table-column prop="permanentBean" label="付费金豆" width="120" sortable="custom" />
<el-table-column prop="freeBean" label="免费金豆" width="120" sortable="custom" />
<el-table-column prop="remark" label="备注" width="150" show-overflow-tooltip />
<el-table-column prop="submitName" label="提交人" width="120" />
<el-table-column v-if="checkTab === 'reject'" prop="reason" label="驳回理由" width="120"
show-overflow-tooltip />
<el-table-column v-if="checkTab !== 'pending'" prop="auditName" label="审核人" width="120" />
<el-table-column prop="createTime" label="提交时间" width="180" sortable="custom">
<template #default="{ row }">
{{ moment(row.createTime).format('YYYY-MM-DD HH:mm:ss') }}
</template>
</el-table-column>
<el-table-column v-if="checkTab !== 'pending'" prop="auditTime" label="审核时间" width="240" sortable="custom">
<template #default="{ row }">
{{ row.auditTime ? moment(row.auditTime).format('YYYY-MM-DD HH:mm:ss') : '--' }}
</template>
</el-table-column>
<el-table-column v-if="checkTab === 'pending'" fixed="right" prop="operation" label="操作" width="400px">
<template #default="scope">
<div class="operation">
<el-popconfirm title="确定要通过此条记录吗?" @confirm="handleApprove(scope.row)">
<template #reference>
<el-button :disabled="scope.row.status === 1 || scope.row.status === 2" type="primary"
text>
通过
</el-button>
</template>
</el-popconfirm>
<el-button :disabled="scope.row.status === 1 || scope.row.status === 2" type="primary" text
@click="showRejectDialog(scope.row)">
驳回
</el-button>
</div>
</template>
</el-table-column>
</el-table>
<el-pagination style="margin-top:20px" v-model:current-page="pagination.pageNum"
v-model:page-size="pagination.pageSize" layout="total, sizes, prev, pager, next, jumper" :total="stats.num"
@size-change="handlePageSizeChange" @current-change="handleCurrentChange"></el-pagination>
</el-card>
<el-dialog v-model="rejectDialogVisible" title="驳回理由" width="500px">
<el-form>
<el-form-item label="驳回理由" required>
<el-input v-model="reason" 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> </template>
<script setup lang="ts">
import { onMounted, ref } from 'vue'
import { ElMessage } from 'element-plus'
import API from '@/util/http'
import moment from 'moment'
import { useAdminStore } from "@/store/index.js";
import { storeToRefs } from "pinia";
const adminStore = useAdminStore();
const { adminData, menuTree } = storeToRefs(adminStore);
import { permissionMapping, findMenuById } from "@/utils/menuTreePermission.js"
const tableData = ref([])
const marketOptions = ref([])
const dateRange = ref<Date[]>([])
const activeTimeRange = ref('')
const activeName = ref('wait')
const sortField = ref('')
const sortOrder = ref('')
const checkTab = ref('pending')
const rejectDialogVisible = ref(false)
const reason = ref('')
const rejectRow = ref({
id: null
})//
//
const STATUS = {
PENDING: 0, //
APPROVED: 1, //
REJECTED: 2 //
}
const searchForm = ref({
jwcode: '',
market: '',
createStartTime: '',
createEndTime: '',
status: STATUS.PENDING,
auditStartTime: '',
auditEndTime: ''
})
const pagination = ref({
pageNum: 1,
pageSize: 50
})
//
const stats = ref({
num: 0,
beanNum: 0,
permanentBean: 0,
freeBean: 0
})
const showRejectDialog = (row) => {
rejectRow.value.id = row.id
reason.value = ''
rejectDialogVisible.value = true
}
const getmarkets = async () => {
try {
const result = await API({ url: '/beanConsume/getDept', data: {} })
marketOptions.value = result.data || []
} catch (error) {
console.error('获取地区列表失败', error)
}
}
const handleSortChange = (column) => {
if (column.prop === 'sumGold') {
sortField.value = 'sum_gold'
} else if (column.prop === 'permanentGold') {
sortField.value = 'permanent_gold'
} else if (column.prop === 'freeGold') {
sortField.value = 'freeGold'
} else if (column.prop === 'taskGold') {
sortField.value = 'task_gold'
} else if (column.prop === 'createTime') {
sortField.value = 'create_time'
} else if (column.prop === 'auditTime') {
sortField.value = 'audit_time'
} else {
sortField.value = ''
}
sortOrder.value = column.order === 'ascending' ? 'asc' : 'desc'
console.log('排序字段:', sortField.value)
console.log('排序方式:', sortOrder.value)
get()
}
const handleSearch = function () {
get()
getStats()
}
const get = async function () {
if (findMenuById(menuTree.value, permissionMapping.View_Golden_Bean_Recharge_Audit)) {
try {
if (dateRange.value && dateRange.value.length === 2) {
searchForm.value.createStartTime = moment(dateRange.value[0]).format('YYYY-MM-DD HH:mm:ss')
searchForm.value.createEndTime = moment(dateRange.value[1]).format('YYYY-MM-DD HH:mm:ss')
} else {
searchForm.value.createStartTime = ''
searchForm.value.createEndTime = ''
}
const params = {
pageNum: pagination.value.pageNum,//
pageSize: pagination.value.pageSize,//
beanAuditInfo: {
jwcode: searchForm.value.jwcode,
status: searchForm.value.status,
market: searchForm.value.market,
createStartTime: searchForm.value.createStartTime,
createEndTime: searchForm.value.createEndTime,
auditStartTime: searchForm.value.auditStartTime,
auditEndTime: searchForm.value.auditEndTime,
sortField: sortField.value,
sortOrder: sortOrder.value
}
}
console.log('看看传给后端的参数:', params)
const res = await API({ url: '/beanAudit/selectBy', data: params })
tableData.value = res.data.list || []
} catch (error) {
console.error('获取数据失败', error)
}
}else{
ElMessage.error('无此权限')
}
}
const getStats = async () => {
if (findMenuById(menuTree.value, permissionMapping.View_Golden_Bean_Recharge_Audit)) {
try {
const params = {
jwcode: searchForm.value.jwcode,
status: searchForm.value.status,
market: searchForm.value.market,
createStartTime: searchForm.value.createStartTime,
createEndTime: searchForm.value.createEndTime,
auditStartTime: searchForm.value.auditStartTime,
auditEndTime: searchForm.value.auditEndTime
}
const res = await API({
url: '/beanAudit/statsBean',
data: params
})
<style scoped>
stats.value.num = res.data.num
stats.value.permanentBean = res.data.permanentBean
stats.value.freeBean = res.data.freeBean
stats.value.beanNum = res.data.beanNum
console.log('see see stats和搜索对象', stats.value, params)
} catch (error) {
console.log('请求失败', error)
}
}else{
ElMessage.error('无此权限')
}
}
//
const handleApprove = async (row) => {
if (findMenuById(menuTree.value, permissionMapping.Golden_Bean_Recharge_Approval)) {
try {
const params = {
id: row.id,
auditName: adminData.value.name,
}
await API({ url: '/beanAudit/status1', data: params })
ElMessage.success('审核通过成功')
get()
getStats()
} catch (error) {
console.error('审核通过失败', error)
ElMessage.error('操作失败')
}
} else {
ElMessage.error('无此权限')
}
}
//
const handleReject = async () => {
if (findMenuById(menuTree.value, permissionMapping.Golden_Bean_Recharge_Approval)) {
if (!reason.value.trim()) {
ElMessage.warning('请输入驳回理由')
return
}
try {
const params = {
id: rejectRow.value.id,
auditName: adminData.value.adminName,
reason: reason.value
}
await API({ url: '/beanAudit/status2', data: params })
ElMessage.success('驳回成功')
rejectDialogVisible.value = false
get()
getStats()
} catch (error) {
console.error('驳回失败', error)
ElMessage.error('操作失败')
}
} else {
ElMessage.error('无此权限')
}
}
const getToday = function () {
const today = new Date()
const startTime = new Date(today.getFullYear(), today.getMonth(), today.getDate())
const endTime = new Date(today.getFullYear(), today.getMonth(), today.getDate() + 1)
dateRange.value = [startTime, endTime]
console.log('dateRange', dateRange.value)
activeTimeRange.value = 'today'
get()
getStats()
}
const getYesterday = function () {
const yesterday = new Date()
yesterday.setDate(yesterday.getDate() - 1)
const startTime = new Date(yesterday.getFullYear(), yesterday.getMonth(), yesterday.getDate())
const endTime = new Date(yesterday.getFullYear(), yesterday.getMonth(), yesterday.getDate() + 1)
dateRange.value = [startTime, endTime]
console.log('dateRange', dateRange.value)
activeTimeRange.value = 'yesterday'
get()
getStats()
}
const get7Days = function () {
const today = new Date()
const startTime = new Date(today.getFullYear(), today.getMonth(), today.getDate() - 6)
const endTime = new Date(today.getFullYear(), today.getMonth(), today.getDate() + 1)
dateRange.value = [startTime, endTime]
console.log('dateRange', dateRange.value)
activeTimeRange.value = '7days'
get()
getStats()
}
const resetSearch = function () {
const status = searchForm.value.status;
searchForm.value = {
jwcode: '',
market: '',
createStartTime: '',
createEndTime: '',
status: status,
auditStartTime: '',
auditEndTime: ''
}
dateRange.value = []
activeTimeRange.value = '' //
}
const handleClick = function (tab) {
activeName.value = tab.props.name
if (tab.props.name === 'wait') {
adminWait()
} else if (tab.props.name === 'pass') {
adminPass()
} else if (tab.props.name === 'reject') {
adminReject()
}
}
//
const adminWait = async function () {
checkTab.value = 'pending'
searchForm.value.status = STATUS.PENDING
await get()
await getStats()
}
//
const adminPass = async function () {
checkTab.value = 'pass'
searchForm.value.status = STATUS.APPROVED
await get()
await getStats()
}
//
const adminReject = async function () {
checkTab.value = 'reject'
searchForm.value.status = STATUS.REJECTED
await get()
await getStats()
}
const handleDatePickerChange = () => {
activeTimeRange.value = ''
}
const handlePageSizeChange = function (val) {
pagination.value.pageSize = val
get()
}
const handleCurrentChange = function (val) {
pagination.value.pageNum = val
get()
}
onMounted(async () => {
getmarkets()
get()
getStats()
console.log("看看通信来的用户身份", adminData.value)
})
</script>
</style>
<style scoped></style>

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

@ -2,7 +2,7 @@
<template> <template>
<el-row> <el-row>
<el-col> <el-col>
<el-card style="margin-bottom: 5px">
<el-card style="margin-bottom: 20px;margin-top:10px">
<el-row style="margin-bottom: 5px"> <el-row style="margin-bottom: 5px">
<el-col :span="6"> <el-col :span="6">
<el-text size="large">精网号</el-text> <el-text size="large">精网号</el-text>
@ -41,7 +41,9 @@
<div class="time-group"> <div class="time-group">
<el-text size="large" style="width: 80px">充值时间</el-text> <el-text size="large" style="width: 80px">充值时间</el-text>
<el-date-picker v-model="getTime" type="datetimerange" range-separator="" start-placeholder="起始时间" <el-date-picker v-model="getTime" type="datetimerange" range-separator="" start-placeholder="起始时间"
end-placeholder="结束时间" style="width: 400px" @change="handleDatePickerChange"/>
end-placeholder="结束时间" style="width: 400px" @change="handleDatePickerChange"
:default-time="defaultTime"
/>
<el-button @click="getToday()" style="margin-left: 10px" <el-button @click="getToday()" style="margin-left: 10px"
:type="activeTimeRange === 'today' ? 'primary' : ''"> :type="activeTimeRange === 'today' ? 'primary' : ''">
</el-button> </el-button>
@ -204,6 +206,12 @@ const trimJwCode = () => {
} }
const formatTime = (val) => val ? moment(val).format('YYYY-MM-DD HH:mm:ss') : '' const formatTime = (val) => val ? moment(val).format('YYYY-MM-DD HH:mm:ss') : ''
const defaultTime = [
new Date(2000, 1, 1, 0, 0, 0),
new Date(2000, 2, 1,23 , 59, 59),
]
// //
const adminData = ref({}) const adminData = ref({})
// //

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

@ -2,7 +2,7 @@
<el-row> <el-row>
<el-col> <el-col>
<div> <div>
<el-card style="margin-bottom: 5px">
<el-card style="margin-bottom: 20px;margin-top:10px">
<el-row style="margin-bottom: 5px"> <el-row style="margin-bottom: 5px">
<el-col :span="6"> <el-col :span="6">
<el-text size="large">精网号</el-text> <el-text size="large">精网号</el-text>
@ -43,7 +43,7 @@
<el-text size="large" style="width: 80px">提交时间</el-text> <el-text size="large" style="width: 80px">提交时间</el-text>
<el-date-picker v-model="dateRange" type="datetimerange" range-separator="" <el-date-picker v-model="dateRange" type="datetimerange" range-separator=""
start-placeholder="开始时间" start-placeholder="开始时间"
end-placeholder="结束时间" style="width: 400px" @change="handleDatePickerChange"/>
end-placeholder="结束时间" style="width: 400px" @change="handleDatePickerChange" :default-time="defaultTime"/>
<el-button @click="getToday()" style="margin-left: 10px" <el-button @click="getToday()" style="margin-left: 10px"
:type="activeTimeRange === 'today' ? 'primary' : ''"> :type="activeTimeRange === 'today' ? 'primary' : ''">
</el-button> </el-button>
@ -176,7 +176,10 @@ import {ElMessage} from 'element-plus'
import API from '@/util/http.js' import API from '@/util/http.js'
import moment from 'moment' import moment from 'moment'
import {marketMapping, reverseMarketMapping} from "@/utils/marketMap.js"; import {marketMapping, reverseMarketMapping} from "@/utils/marketMap.js";
const defaultTime = [
new Date(2000, 1, 1, 0, 0, 0),
new Date(2000, 2, 1,23 , 59, 59),
]
// //
const activeTimeRange = ref('') const activeTimeRange = ref('')
// //

32
src/views/consume/addBeanConsume.vue → src/views/consume/bean/addBeanConsume.vue

@ -4,9 +4,9 @@ import { ElMessage } from 'element-plus'
import { Plus } from '@element-plus/icons-vue' import { Plus } from '@element-plus/icons-vue'
import axios from 'axios' import axios from 'axios'
import { ElMessageBox } from 'element-plus' import { ElMessageBox } from 'element-plus'
import API from '@/util/http'
import { uploadFile } from '@/util/request';
import request from '@/util/http'
import API from '@/util/http.js'
import { uploadFile } from '@/util/request.js';
import request from '@/util/http.js'
import moment from 'moment' import moment from 'moment'
import { e, range, re } from 'mathjs' import { e, range, re } from 'mathjs'
import { utils, read } from 'xlsx' import { utils, read } from 'xlsx'
@ -44,8 +44,8 @@ const getUser = async function (jwcode) {
} }
const addForm = ref({ const addForm = ref({
jwcode: '', jwcode: '',
gode: '',
freeGode: '',
permanentBean: '',
freeBean: '',
remark: '', remark: '',
adminId: '' adminId: ''
}) })
@ -68,7 +68,7 @@ const rules = reactive({
callback(); callback();
}, trigger: 'blur' }, trigger: 'blur'
}], }],
gode: [
permanentBean: [
{ required: true, message: '请输入永久金豆数', trigger: 'blur' }, { required: true, message: '请输入永久金豆数', trigger: 'blur' },
{ {
validator: (rule, value, callback) => { validator: (rule, value, callback) => {
@ -89,7 +89,7 @@ const rules = reactive({
trigger: 'blur' trigger: 'blur'
} }
], ],
freeGode: [
freeBean: [
{ required: true, message: '请输入免费金豆数', trigger: 'blur' }, { required: true, message: '请输入免费金豆数', trigger: 'blur' },
{ {
validator: (rule, value, callback) => { validator: (rule, value, callback) => {
@ -118,8 +118,8 @@ const rules = reactive({
const deleteAddForm = function () { const deleteAddForm = function () {
addForm.value = { addForm.value = {
jwcode: '', jwcode: '',
gode: '',
freeGode: '',
permanentBean: '',
freeBean: '',
remark: '', remark: '',
adminId: '' adminId: ''
} }
@ -130,7 +130,7 @@ const handleAddForm = async () => {
await new Promise((resolve, reject) => { await new Promise((resolve, reject) => {
formRef.value.validate((valid) => { formRef.value.validate((valid) => {
if (valid) { if (valid) {
if (Number(addForm.value.gode) === 0 && Number(addForm.value.freeGode) === 0) {
if (Number(addForm.value.permanentBean) === 0 && Number(addForm.value.freeBean) === 0) {
reject(new Error('永久金豆和付费金豆不能同时为0')); reject(new Error('永久金豆和付费金豆不能同时为0'));
} }
resolve(); // resolve(); //
@ -145,8 +145,8 @@ const handleAddForm = async () => {
url: '/bean/add', url: '/bean/add',
data: { data: {
jwcode: addForm.value.jwcode, jwcode: addForm.value.jwcode,
gode: addForm.value.gode,
freeGode: addForm.value.freeGode,
permanentBean: addForm.value.permanentBean,
freeBean: addForm.value.freeBean,
remark: addForm.value.remark, remark: addForm.value.remark,
adminId: adminData.adminId adminId: adminData.adminId
} }
@ -164,11 +164,11 @@ const handleAddForm = async () => {
<el-input v-model="addForm.jwcode" style="width: 220px" /> <el-input v-model="addForm.jwcode" style="width: 220px" />
<el-button type="primary" @click="getUser(addForm.jwcode)" style="margin-left: 20px">查询</el-button> <el-button type="primary" @click="getUser(addForm.jwcode)" style="margin-left: 20px">查询</el-button>
</el-form-item> </el-form-item>
<el-form-item prop="gode" label="付费金豆" label-position="left">
<el-input v-model="addForm.gode" style="width: 100px" />
<el-form-item prop="permanentBean" label="付费金豆" label-position="left">
<el-input v-model="addForm.permanentBean" style="width: 100px" />
</el-form-item> </el-form-item>
<el-form-item prop="freeGode" label="免费金豆" label-position="left">
<el-input v-model="addForm.freeGode" style="width: 100px" />
<el-form-item prop="freeBean" label="免费金豆" label-position="left">
<el-input v-model="addForm.freeBean" style="width: 100px" />
</el-form-item> </el-form-item>
<el-form-item prop="remark" label="备注" label-position="left"> <el-form-item prop="remark" label="备注" label-position="left">
<el-input v-model="addForm.remark" style="width: 300px" :rows="5" maxlength="100" show-word-limit <el-input v-model="addForm.remark" style="width: 300px" :rows="5" maxlength="100" show-word-limit

78
src/views/consume/articleVideo.vue → src/views/consume/bean/articleVideo.vue

@ -1,8 +1,8 @@
<script setup> <script setup>
import { computed, onMounted, ref } from 'vue' import { computed, onMounted, ref } from 'vue'
import { dayjs, ElMessage } from 'element-plus' import { dayjs, ElMessage } from 'element-plus'
import request from '@/util/http'
import API from '@/util/http'
import request from '@/util/http.js'
import API from '@/util/http.js'
import moment from 'moment' import moment from 'moment'
import { ar } from 'element-plus/es/locales.mjs' import { ar } from 'element-plus/es/locales.mjs'
// //
@ -267,17 +267,9 @@ const reset = function () {
} }
// //
const getToday = function () { const getToday = function () {
const today = new Date()
const startTime = new Date(
today.getFullYear(),
today.getMonth(),
today.getDate()
)
const endTime = new Date(
today.getFullYear(),
today.getMonth(),
today.getDate() + 1
)
const today = dayjs()
const startTime = today.startOf('day').format('YYYY-MM-DD HH:mm:ss')
const endTime =today.endOf('day').format('YYYY-MM-DD HH:mm:ss')
getTime.value = [startTime, endTime] getTime.value = [startTime, endTime]
console.log('getTime', getTime.value) console.log('getTime', getTime.value)
activeTimeRange.value = 'today' // activeTimeRange.value = 'today' //
@ -286,18 +278,9 @@ const getToday = function () {
} }
// //
const getYesterday = function () { const getYesterday = function () {
const yesterday = new Date()
yesterday.setDate(yesterday.getDate() - 1)
const startTime = new Date(
yesterday.getFullYear(),
yesterday.getMonth(),
yesterday.getDate()
)
const endTime = new Date(
yesterday.getFullYear(),
yesterday.getMonth(),
yesterday.getDate() + 1
)
const today = dayjs()
const startTime = today.subtract(1, 'day').startOf('day').format('YYYY-MM-DD HH:mm:ss')
const endTime = today.subtract(1, 'day').endOf('day').format('YYYY-MM-DD HH:mm:ss')
getTime.value = [startTime, endTime] getTime.value = [startTime, endTime]
console.log('getTime', getTime.value) console.log('getTime', getTime.value)
activeTimeRange.value = 'yesterday' // activeTimeRange.value = 'yesterday' //
@ -306,17 +289,9 @@ const getYesterday = function () {
} }
// 7 // 7
const get7Days = function () { const get7Days = function () {
const today = new Date()
const startTime = new Date(
today.getFullYear(),
today.getMonth(),
today.getDate() - 6
)
const endTime = new Date(
today.getFullYear(),
today.getMonth(),
today.getDate() + 1
)
const today = dayjs()
const startTime = today.subtract(6, 'day').startOf('day').format('YYYY-MM-DD HH:mm:ss')
const endTime = today.add(1, 'day').endOf('day').format('YYYY-MM-DD HH:mm:ss')
getTime.value = [startTime, endTime] getTime.value = [startTime, endTime]
console.log('getTime', getTime.value) console.log('getTime', getTime.value)
activeTimeRange.value = '7days' // activeTimeRange.value = '7days' //
@ -335,6 +310,10 @@ const handleSortChange = (column) => {
sortField.value = 'beanNum' sortField.value = 'beanNum'
} else if (column.prop === 'consumeTime') { } else if (column.prop === 'consumeTime') {
sortField.value = 'consumeTime' sortField.value = 'consumeTime'
} else if (column.prop === 'buyBean') {
sortField.value = 'buyBean'
} else if (column.prop === 'freeBean') {
sortField.value = 'freeBean'
} }
sortOrder.value = column.order === 'ascending' ? 'DESC' : 'ASC' sortOrder.value = column.order === 'ascending' ? 'DESC' : 'ASC'
ConsumeSelectBy() ConsumeSelectBy()
@ -385,6 +364,8 @@ const exportExcel = async function () {
articleName: beanConsumeArticle.value.articleName || '', articleName: beanConsumeArticle.value.articleName || '',
author: beanConsumeArticle.value.author || '', author: beanConsumeArticle.value.author || '',
beanNum: beanConsumeArticle.value.beanNum || '', beanNum: beanConsumeArticle.value.beanNum || '',
buyBean: beanConsumeArticle.value.buyBean || '',
freeBean: beanConsumeArticle.value.freeBean || '',
consumeTime: beanConsumeArticle.value.consumeTime || '', consumeTime: beanConsumeArticle.value.consumeTime || '',
sortField: sortField.value || 'consumeTime', sortField: sortField.value || 'consumeTime',
sortOrder: sortOrder.value || 'desc' sortOrder: sortOrder.value || 'desc'
@ -478,7 +459,7 @@ const getTagText = (state) => {
<el-col :span="4"> <el-col :span="4">
<div class="head-card-element"> <div class="head-card-element">
<el-text class="mx-1">精网号</el-text> <el-text class="mx-1">精网号</el-text>
<el-input v-model="beanConsumeArticle.jwcode" placeholder="请输入精网号" style="width: 150px" clearable />
<el-input v-model="beanConsumeArticle.jwcode" placeholder="请输入精网号" style="width: 140px" clearable />
</div> </div>
</el-col> </el-col>
<el-col :span="4"> <el-col :span="4">
@ -505,21 +486,22 @@ const getTagText = (state) => {
<el-input v-model="beanConsumeArticle.articleId" placeholder="请输入文章/视频ID" style="width: 140px" clearable /> <el-input v-model="beanConsumeArticle.articleId" placeholder="请输入文章/视频ID" style="width: 140px" clearable />
</div> </div>
</el-col> </el-col>
<el-col :span="4">
<el-col :span="5">
<div class="head-card-element"> <div class="head-card-element">
<el-text class="mx-1">文章/视频标题</el-text> <el-text class="mx-1">文章/视频标题</el-text>
<el-input v-model="beanConsumeArticle.articleName" placeholder="请输入文章/视频标题" style="width: 140px" clearable />
<el-input v-model="beanConsumeArticle.articleName" placeholder="请输入文章/视频标题" style="width: 160px" clearable />
</div> </div>
</el-col> </el-col>
</el-row>
<el-row>
<el-col :span="4"> <el-col :span="4">
<div class="head-card-element"> <div class="head-card-element">
<el-text class="mx-1">作者</el-text>
<el-input v-model="beanConsumeArticle.author" placeholder="请输入作者" style="width: 140px" clearable />
<el-text class="mx-1" >作者</el-text>
<el-input v-model="beanConsumeArticle.author" placeholder="请输入作者" style="width: 155px" clearable />
</div> </div>
</el-col> </el-col>
</el-row>
<el-row>
<el-col :span="24">
<el-col :span="20">
<div class="head-card-element"> <div class="head-card-element">
<el-text class="mx-1">付费时间</el-text> <el-text class="mx-1">付费时间</el-text>
<el-date-picker <el-date-picker
@ -577,19 +559,19 @@ const getTagText = (state) => {
}} }}
</template> </template>
</el-table-column> </el-table-column>
<el-table-column prop="beanNum" label="金豆总数" width="120px">
<el-table-column prop="beanNum" label="金豆总数" sortable="custom" width="120px">
</el-table-column> </el-table-column>
<el-table-column prop="buyBean" label="付费金豆数" width="120px">
<el-table-column prop="buyBean" label="付费金豆数" sortable="custom" width="120px">
</el-table-column> </el-table-column>
<el-table-column prop="freeBean" label="免费金豆数" width="120px">
<el-table-column prop="freeBean" label="免费金豆数" sortable="custom" width="120px">
</el-table-column> </el-table-column>
<el-table-column prop="articleId" label="文章/视频ID" width="150px" /> <el-table-column prop="articleId" label="文章/视频ID" width="150px" />
<el-table-column prop="articleName" label="文章/视频标题" width="200px" show-overflow-tooltip /> <el-table-column prop="articleName" label="文章/视频标题" width="200px" show-overflow-tooltip />
<el-table-column prop="author" label="作者" width="120px" /> <el-table-column prop="author" label="作者" width="120px" />
<el-table-column prop="consumeTime" label="付费时间" width="180px">
<el-table-column prop="consumeTime" label="付费时间" sortable="custom" width="180px">
<template #default="scope"> <template #default="scope">
{{ formatTime(scope.row.consumeTime) }} {{ formatTime(scope.row.consumeTime) }}
</template> </template>

4
src/views/consume/beanConsume.vue → src/views/consume/bean/beanConsume.vue

@ -5,6 +5,7 @@
:type="activeTab === 'addBeanConsume' ? 'primary' : 'default'" :type="activeTab === 'addBeanConsume' ? 'primary' : 'default'"
@click="navigateTo('addBeanConsume')" @click="navigateTo('addBeanConsume')"
:disabled="!hasAdd" :disabled="!hasAdd"
style="width: 120px;"
> >
新增消耗 新增消耗
</el-button> </el-button>
@ -12,6 +13,7 @@
:type="activeTab === 'liveStream' ? 'primary' : 'default'" :type="activeTab === 'liveStream' ? 'primary' : 'default'"
@click="navigateTo('liveStream')" @click="navigateTo('liveStream')"
:disabled="!hasLive" :disabled="!hasLive"
style="width: 120px;"
> >
直播 直播
</el-button> </el-button>
@ -19,6 +21,7 @@
:type="activeTab === 'dieHardFan' ? 'primary' : 'default'" :type="activeTab === 'dieHardFan' ? 'primary' : 'default'"
@click="navigateTo('dieHardFan')" @click="navigateTo('dieHardFan')"
:disabled="!hasFan" :disabled="!hasFan"
style="width: 120px;"
> >
铁粉 铁粉
</el-button> </el-button>
@ -26,6 +29,7 @@
:type="activeTab === 'articleVideo' ? 'primary' : 'default'" :type="activeTab === 'articleVideo' ? 'primary' : 'default'"
@click="navigateTo('articleVideo')" @click="navigateTo('articleVideo')"
:disabled="!hasArticleVideo" :disabled="!hasArticleVideo"
style="width: 120px;"
> >
文章/视频 文章/视频
</el-button> </el-button>

67
src/views/consume/dieHardFan.vue → src/views/consume/bean/dieHardFan.vue

@ -1,8 +1,8 @@
<script setup> <script setup>
import { computed, onMounted, ref } from 'vue' import { computed, onMounted, ref } from 'vue'
import { dayjs, ElMessage } from 'element-plus' import { dayjs, ElMessage } from 'element-plus'
import request from '@/util/http'
import API from '@/util/http'
import request from '@/util/http.js'
import API from '@/util/http.js'
import moment from 'moment' import moment from 'moment'
// //
@ -258,61 +258,36 @@ const reset = function () {
} }
// //
const getToday = function () { const getToday = function () {
const today = new Date()
const startTime = new Date(
today.getFullYear(),
today.getMonth(),
today.getDate()
)
const endTime = new Date(
today.getFullYear(),
today.getMonth(),
today.getDate() + 1
)
const today = dayjs()
const startTime = today.startOf('day').format('YYYY-MM-DD HH:mm:ss')
const endTime =today.endOf('day').format('YYYY-MM-DD HH:mm:ss')
getTime.value = [startTime, endTime] getTime.value = [startTime, endTime]
console.log('getTime', getTime.value) console.log('getTime', getTime.value)
activeTimeRange.value = 'today' // activeTimeRange.value = 'today' //
ConsumeSelectBy
ConsumeSelectBy()
} }
// //
const getYesterday = function () { const getYesterday = function () {
const yesterday = new Date()
yesterday.setDate(yesterday.getDate() - 1)
const startTime = new Date(
yesterday.getFullYear(),
yesterday.getMonth(),
yesterday.getDate()
)
const endTime = new Date(
yesterday.getFullYear(),
yesterday.getMonth(),
yesterday.getDate() + 1
)
const today = dayjs()
const startTime = today.subtract(1, 'day').startOf('day').format('YYYY-MM-DD HH:mm:ss')
const endTime = today.subtract(1, 'day').endOf('day').format('YYYY-MM-DD HH:mm:ss')
getTime.value = [startTime, endTime] getTime.value = [startTime, endTime]
console.log('getTime', getTime.value) console.log('getTime', getTime.value)
activeTimeRange.value = 'yesterday' // activeTimeRange.value = 'yesterday' //
ConsumeSelectBy //todo
console.log('昨', getTime.value)
ConsumeSelectBy()
} }
// 7 // 7
const get7Days = function () { const get7Days = function () {
const today = new Date()
const startTime = new Date(
today.getFullYear(),
today.getMonth(),
today.getDate() - 6
)
const endTime = new Date(
today.getFullYear(),
today.getMonth(),
today.getDate() + 1
)
const today = dayjs()
const startTime = today.subtract(6, 'day').startOf('day').format('YYYY-MM-DD HH:mm:ss')
const endTime = today.add(1, 'day').endOf('day').format('YYYY-MM-DD HH:mm:ss')
getTime.value = [startTime, endTime] getTime.value = [startTime, endTime]
console.log('getTime', getTime.value) console.log('getTime', getTime.value)
activeTimeRange.value = '7days' // activeTimeRange.value = '7days' //
ConsumeSelectBy
ConsumeSelectBy()
} }
@ -349,17 +324,17 @@ const handleSortChange = (column) => {
sortField.value = 'consumeTime' sortField.value = 'consumeTime'
} }
sortOrder.value = column.order === 'ascending' ? 'DESC' : 'ASC' sortOrder.value = column.order === 'ascending' ? 'DESC' : 'ASC'
selectLiveBy()
ConsumeSelectBy()
} }
const handlePageSizeChange = function (val) { const handlePageSizeChange = function (val) {
getObj.value.pageSize = val getObj.value.pageSize = val
selectLiveBy()
ConsumeSelectBy()
} }
const handleCurrentChange = function (val) { const handleCurrentChange = function (val) {
getObj.value.pageNum = val getObj.value.pageNum = val
selectLiveBy()
ConsumeSelectBy()
} }
/* /*
====================计算属性================================= ====================计算属性=================================
@ -566,15 +541,15 @@ const getTagText = (state) => {
<!-- 固定精网号列 --> <!-- 固定精网号列 -->
<el-table-column prop="jwcode" label="精网号" width="110px" fixed="left" /> <el-table-column prop="jwcode" label="精网号" width="110px" fixed="left" />
<el-table-column prop="dept" label="地区" width="110px" /> <el-table-column prop="dept" label="地区" width="110px" />
<el-table-column prop="beanNum" label="金豆数量" width="120px"/>
<el-table-column prop="channel" label="频道" width="120px" />
<el-table-column prop="beanNum" label="金豆数量" sortable="custom" width="120px"/>
<el-table-column prop="channel" label="频道" width="190px" />
<el-table-column prop="type" label="会员类型" width="120px" > <el-table-column prop="type" label="会员类型" width="120px" >
<template #default="scope"> <template #default="scope">
{{ consumeTypes.find(item => item.value === Number(scope.row.type))?.label || '未知类型' }} {{ consumeTypes.find(item => item.value === Number(scope.row.type))?.label || '未知类型' }}
</template> </template>
</el-table-column> </el-table-column>
<!-- <el-table-column prop="joinMethod" label="加入方式" width="120px" /> --> <!-- <el-table-column prop="joinMethod" label="加入方式" width="120px" /> -->
<el-table-column prop="consumeTime" label="加入时间" width="180px" />
<el-table-column prop="consumeTime" label="加入时间" sortable="custom" width="180px" />
<!-- <el-table-column prop="consumeTime" label="到期时间" width="180px" /> --> <!-- <el-table-column prop="consumeTime" label="到期时间" width="180px" /> -->
</el-table> </el-table>
</div> </div>

69
src/views/consume/liveStream.vue → src/views/consume/bean/liveStream.vue

@ -1,8 +1,8 @@
<script setup> <script setup>
import { computed, onMounted, ref } from 'vue' import { computed, onMounted, ref } from 'vue'
import { dayjs, ElMessage } from 'element-plus' import { dayjs, ElMessage } from 'element-plus'
import request from '@/util/http'
import API from '@/util/http'
import request from '@/util/http.js'
import API from '@/util/http.js'
import moment from 'moment' import moment from 'moment'
// //
@ -289,17 +289,9 @@ const reset = function () {
} }
// //
const getToday = function () { const getToday = function () {
const today = new Date()
const startTime = new Date(
today.getFullYear(),
today.getMonth(),
today.getDate()
)
const endTime = new Date(
today.getFullYear(),
today.getMonth(),
today.getDate() + 1
)
const today = dayjs()
const startTime = today.startOf('day').format('YYYY-MM-DD HH:mm:ss')
const endTime =today.endOf('day').format('YYYY-MM-DD HH:mm:ss')
getTime.value = [startTime, endTime] getTime.value = [startTime, endTime]
console.log('getTime', getTime.value) console.log('getTime', getTime.value)
activeTimeRange.value = 'today' // activeTimeRange.value = 'today' //
@ -308,18 +300,9 @@ const getToday = function () {
} }
// //
const getYesterday = function () { const getYesterday = function () {
const yesterday = new Date()
yesterday.setDate(yesterday.getDate() - 1)
const startTime = new Date(
yesterday.getFullYear(),
yesterday.getMonth(),
yesterday.getDate()
)
const endTime = new Date(
yesterday.getFullYear(),
yesterday.getMonth(),
yesterday.getDate() + 1
)
const today = dayjs()
const startTime = today.subtract(1, 'day').startOf('day').format('YYYY-MM-DD HH:mm:ss')
const endTime = today.subtract(1, 'day').endOf('day').format('YYYY-MM-DD HH:mm:ss')
getTime.value = [startTime, endTime] getTime.value = [startTime, endTime]
console.log('getTime', getTime.value) console.log('getTime', getTime.value)
activeTimeRange.value = 'yesterday' // activeTimeRange.value = 'yesterday' //
@ -328,17 +311,9 @@ const getYesterday = function () {
} }
// 7 // 7
const get7Days = function () { const get7Days = function () {
const today = new Date()
const startTime = new Date(
today.getFullYear(),
today.getMonth(),
today.getDate() - 6
)
const endTime = new Date(
today.getFullYear(),
today.getMonth(),
today.getDate() + 1
)
const today = dayjs()
const startTime = today.subtract(6, 'day').startOf('day').format('YYYY-MM-DD HH:mm:ss')
const endTime = today.add(1, 'day').endOf('day').format('YYYY-MM-DD HH:mm:ss')
getTime.value = [startTime, endTime] getTime.value = [startTime, endTime]
console.log('getTime', getTime.value) console.log('getTime', getTime.value)
activeTimeRange.value = '7days' // activeTimeRange.value = '7days' //
@ -512,18 +487,22 @@ const getTagText = (state) => {
</el-select> </el-select>
</div> </div>
</el-col> </el-col>
<el-col :span="4">
<!-- <el-col :span="4">
<div class="head-card-element"> <div class="head-card-element">
<el-text class="mx-1">类型</el-text> <el-text class="mx-1">类型</el-text>
<el-select v-model="beanConsumeLive.type" placeholder="请选择类型" style="width: 140px" clearable @change="handleTypeChange"> <el-select v-model="beanConsumeLive.type" placeholder="请选择类型" style="width: 140px" clearable @change="handleTypeChange">
<el-option v-for="(item, index) in consumeTypes" :key="index" :label="item.label" :value="item.value" /> <el-option v-for="(item, index) in consumeTypes" :key="index" :label="item.label" :value="item.value" />
</el-select> </el-select>
</div> </div>
</el-col>
<el-col :span="4" v-if="beanConsumeLive.type === 1">
</el-col> -->
<el-col :span="4" >
<div class="head-card-element"> <div class="head-card-element">
<el-text class="mx-1">礼物名称</el-text> <el-text class="mx-1">礼物名称</el-text>
<el-select v-model="beanConsumeLive.gift" placeholder="请选择礼物名称" style="width: 140px" clearable>
<el-select v-model="beanConsumeLive.gift" placeholder="请选择礼物名称" style="width: 140px" clearable
filterable
allow-create
default-first-option
>
<el-option v-for="(item, index) in gifts" :key="index" :label="item" :value="item" /> <el-option v-for="(item, index) in gifts" :key="index" :label="item" :value="item" />
</el-select> </el-select>
</div> </div>
@ -597,14 +576,12 @@ const getTagText = (state) => {
<!-- 固定精网号列 --> <!-- 固定精网号列 -->
<el-table-column prop="jwcode" label="精网号" width="110px" fixed="left" /> <el-table-column prop="jwcode" label="精网号" width="110px" fixed="left" />
<el-table-column prop="dept" label="地区" width="110px" /> <el-table-column prop="dept" label="地区" width="110px" />
<el-table-column prop="type" label="类型" width="120px" >
<template #default="scope">
{{ consumeTypes.find(item => item.value === Number(scope.row.type))?.label || '未知类型' }}
</template>
<el-table-column prop="gift" label="礼物" width="140px" >
</el-table-column> </el-table-column>
<el-table-column prop="beanNum" label="金豆数量" width="120px">
<el-table-column prop="beanNum" label="金豆数量" sortable="custom" width="120px">
</el-table-column> </el-table-column>
<el-table-column prop="liveChannel" label="频道" width="120px" />
<el-table-column prop="liveChannel" label="频道" width="180px" />
<el-table-column prop="liveName" label="直播间名称" width="160px" show-overflow-tooltip /> <el-table-column prop="liveName" label="直播间名称" width="160px" show-overflow-tooltip />
<el-table-column prop="consumeTime" label="消费时间" sortable="custom" width="180px" /> <el-table-column prop="consumeTime" label="消费时间" sortable="custom" width="180px" />
</el-table> </el-table>

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

@ -573,14 +573,7 @@ onMounted(async function () {
/> />
</el-form-item> </el-form-item>
<el-form-item prop="commitName" label="提交人">
<el-input
style="width: 300px"
:value="adminData.adminName"
disabled
placeholder="提交人姓名"
/>
</el-form-item>
<el-button type="success" @click="resetForm()" style="margin-left: 280px">重置</el-button> <el-button type="success" @click="resetForm()" style="margin-left: 280px">重置</el-button>

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

@ -13,7 +13,10 @@ import {marketMapping, reverseMarketMapping} from "@/utils/marketMap.js";
// //
const formatTime = (val) => val ? dayjs(val).format('YYYY-MM-DD HH:mm:ss') : '' const formatTime = (val) => val ? dayjs(val).format('YYYY-MM-DD HH:mm:ss') : ''
const defaultTime = [
new Date(2000, 1, 1, 0, 0, 0),
new Date(2000, 2, 1,23 , 59, 59),
]
/* /*
====================数据================================= ====================数据=================================
*/ */
@ -626,7 +629,7 @@ const getMarket = async function () {
<div class="head-card-element"> <div class="head-card-element">
<el-text class="mx-1" size="large">消耗时间</el-text> <el-text class="mx-1" size="large">消耗时间</el-text>
<el-date-picker v-model="getTime" type="datetimerange" range-separator="" start-placeholder="起始时间" <el-date-picker v-model="getTime" type="datetimerange" range-separator="" start-placeholder="起始时间"
end-placeholder="结束时间" style="width: 400px" @change="handleDatePickerChange"/>
end-placeholder="结束时间" style="width: 400px" @change="handleDatePickerChange" :default-time="defaultTime"/>
<el-button @click="getToday()" style="margin-left: 10px" <el-button @click="getToday()" style="margin-left: 10px"
:type="activeTimeRange === 'today' ? 'primary' : ''"> :type="activeTimeRange === 'today' ? 'primary' : ''">
</el-button> </el-button>

111
src/views/noPermissionPage.vue

@ -1,24 +1,105 @@
<script setup> <script setup>
import { ref, onMounted, reactive, computed, nextTick } from "vue";
const image = "../src/assets/hqz大拇指.png";
import image_403 from "@/assets/403.png"
</script> </script>
<template> <template>
<el-row>
<el-col>
<div>
<p style="font-size: 50px; font-weight: bold; text-align: center;">
暂无权限
</p>
<p style="font-size: 60px; font-weight: bold; text-align: center;">
请联系管理员添加权限
</p>
<div class="error-page">
<!-- 背景装饰元素 -->
<div class="bg-decoration"></div>
<el-row class="error-container">
<el-col :span="24" class="error-content">
<!-- 错误图标/图片区域 -->
<div class="error-img">
<img :src="image_403" alt="无权限访问" class="error-image">
</div>
<!-- 文本信息区域 -->
<div class="error-message">
<h2>暂无权限</h2>
<p>您当前的账号没有访问该页面的权限请联系管理员添加权限</p>
</div> </div>
</el-col> </el-col>
</el-row> </el-row>
</div>
</template> </template>
<style scoped></style>
<style scoped>
.error-page {
display: flex;
flex-direction: column;
overflow: hidden;
position: relative;
}
/* 背景装饰 */
.bg-decoration {
position: absolute;
width: 100%;
z-index: 0;
}
.error-container {
flex: 1;
display: flex;
justify-content: center;
align-items: center;
padding: 2rem;
position: relative;
z-index: 1;
}
.error-content {
max-width: 800px;
width: 100%;
text-align: center;
animation: fadeIn 0.8s ease-out;
}
/* 错误图片区域 */
.error-img {
position: relative;
margin-bottom: 2.5rem;
}
.error-image {
max-width: 280px;
width: 100%;
height: auto;
transition: transform 0.3s ease;
}
.error-image:hover {
transform: scale(1.03);
}
/* 文本信息区域 */
.error-message {
margin-bottom: 2.5rem;
}
.error-message h2 {
font-size: 2.2rem;
margin-bottom: 1rem;
font-weight: 600;
}
.error-message p {
font-size: 1.1rem;
max-width: 600px;
margin: 0 auto;
line-height: 1.6;
}
/* 操作按钮区域 */
.error-actions {
display: flex;
justify-content: center;
gap: 1rem;
margin-bottom: 2rem;
}
</style>

4
src/views/permissions/rolePermission.vue

@ -635,7 +635,7 @@ onMounted(async function () {
<template> <template>
<div> <div>
<!-- 角色搜索 --> <!-- 角色搜索 -->
<el-card style="margin-bottom: 20px">
<el-card style="margin-bottom: 20px;margin-top:10px">
<div class="head-card"> <div class="head-card">
<el-text class="mx-1" size="large">角色名称</el-text> <el-text class="mx-1" size="large">角色名称</el-text>
<el-input v-model="role.name" style="width: 240px" placeholder="请输入角色名称" clearable/> <el-input v-model="role.name" style="width: 240px" placeholder="请输入角色名称" clearable/>
@ -724,7 +724,7 @@ onMounted(async function () {
<el-form ref="Ref" :rules="Rolerules" :model="addRole" label-width="auto" <el-form ref="Ref" :rules="Rolerules" :model="addRole" label-width="auto"
style="max-width: 600px; align-items: center"> style="max-width: 600px; align-items: center">
<el-form-item prop="roleName" label="角色名称:" required> <el-form-item prop="roleName" label="角色名称:" required>
<el-input v-model="addRole.roleName" placeholder="请输入用户名" style="width: 220px"/>
<el-input v-model="addRole.roleName" placeholder="请输入角色名称" style="width: 220px"/>
</el-form-item> </el-form-item>
<el-form-item prop="parentName" label="上级角色:"> <el-form-item prop="parentName" label="上级角色:">
<el-select v-model="addRole.parentId" placeholder="请选择上级角色" style="width: 220px" @change="getLists" <el-select v-model="addRole.parentId" placeholder="请选择上级角色" style="width: 220px" @change="getLists"

2
src/views/permissions/userPermission.vue

@ -762,7 +762,7 @@ onMounted(async function () {
<!--搜索菜单--> <!--搜索菜单-->
<el-row> <el-row>
<el-col> <el-col>
<el-card style="margin-bottom: 20px">
<el-card style="margin-bottom: 20px;margin-top:10px" >
<div class="head-card"> <div class="head-card">
<div class="head-card-element"> <div class="head-card-element">
<el-text class="mx-1" size="large">OA号</el-text> <el-text class="mx-1" size="large">OA号</el-text>

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

@ -628,9 +628,7 @@ onMounted(() => {
<el-input v-model="recharge.remark" style="width: 300px" :rows="2" maxlength="100" show-word-limit <el-input v-model="recharge.remark" style="width: 300px" :rows="2" maxlength="100" show-word-limit
type="textarea" /> type="textarea" />
</el-form-item> </el-form-item>
<el-form-item prop="adminName" label="提交人">
<el-input style="width: 300px" :value="adminData.adminName" disabled placeholder="提交人姓名" />
</el-form-item>
<el-button @click="deleteRecharge" style="margin-left: 280px" type="success">重置</el-button> <el-button @click="deleteRecharge" style="margin-left: 280px" type="success">重置</el-button>
<el-button type="primary" @click="addBefore"> 提交 </el-button> <el-button type="primary" @click="addBefore"> 提交 </el-button>
</el-form> </el-form>

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

@ -21,6 +21,10 @@ const getAdminData = async function () {
console.log('请求失败', error) console.log('请求失败', error)
} }
} }
const defaultTime = [
new Date(2000, 1, 1, 0, 0, 0),
new Date(2000, 2, 1,23 , 59, 59),
]
// //
// //
const tableData = ref([]) const tableData = ref([])
@ -580,7 +584,7 @@ const props = {multiple: true}
<div class="head-card-element"> <div class="head-card-element">
<el-text class="mx-1" size="large">充值时间</el-text> <el-text class="mx-1" size="large">充值时间</el-text>
<el-date-picker v-model="getTime" type="datetimerange" range-separator="" start-placeholder="起始时间" <el-date-picker v-model="getTime" type="datetimerange" range-separator="" start-placeholder="起始时间"
end-placeholder="结束时间" style="width: 400px" @change="handleDatePickerChange"/>
end-placeholder="结束时间" style="width: 400px" @change="handleDatePickerChange" :default-time="defaultTime"/>
<el-button @click="getToday()" style="margin-left: 10px" <el-button @click="getToday()" style="margin-left: 10px"
:type="activeTimeRange === 'today' ? 'primary' : ''"> :type="activeTimeRange === 'today' ? 'primary' : ''">
</el-button> </el-button>

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

@ -533,14 +533,7 @@ onMounted(async function () {
type="textarea" type="textarea"
/> />
</el-form-item> </el-form-item>
<el-form-item prop="adminName" label="提交人">
<el-input
style="width: 300px"
:value="adminData.adminName"
disabled
placeholder="提交人姓名"
/>
</el-form-item>
<el-button type="success" @click="cancel()" style="margin-left: 280px">重置</el-button> <el-button type="success" @click="cancel()" style="margin-left: 280px">重置</el-button>
<el-button type="primary" @click="addBefore"> 提交</el-button> <el-button type="primary" @click="addBefore"> 提交</el-button>
</el-form> </el-form>

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

@ -6,7 +6,10 @@ import moment from 'moment'
import API from '@/util/http.js' import API from '@/util/http.js'
import request from '@/util/http.js' import request from '@/util/http.js'
import {marketMapping, reverseMarketMapping} from "@/utils/marketMap.js"; import {marketMapping, reverseMarketMapping} from "@/utils/marketMap.js";
const defaultTime = [
new Date(2000, 1, 1, 0, 0, 0),
new Date(2000, 2, 1,23 , 59, 59),
]
// //
const trimJwCode = () => { const trimJwCode = () => {
if (refundUser.value.jwcode) { if (refundUser.value.jwcode) {
@ -631,7 +634,7 @@ const getMarket = async function () {
<div class="head-card-element"> <div class="head-card-element">
<el-text class="mx-1">退款时间</el-text> <el-text class="mx-1">退款时间</el-text>
<el-date-picker v-model="getTime" type="datetimerange" range-separator="" start-placeholder="起始时间" <el-date-picker v-model="getTime" type="datetimerange" range-separator="" start-placeholder="起始时间"
end-placeholder="结束时间" style="width: 400px" @change="handleDatePickerChange"/>
end-placeholder="结束时间" style="width: 400px" @change="handleDatePickerChange" :default-time="defaultTime"/>
<el-button @click="getToday()" style="margin-left: 10px" <el-button @click="getToday()" style="margin-left: 10px"
:type="activeTimeRange === 'today' ? 'primary' : ''"> :type="activeTimeRange === 'today' ? 'primary' : ''">
</el-button> </el-button>

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

@ -12,6 +12,10 @@ import dayjs from "dayjs";
// //
const activeTimeRange = ref('') const activeTimeRange = ref('')
const defaultTime = [
new Date(2000, 1, 1, 0, 0, 0),
new Date(2000, 2, 1,23 , 59, 59),
]
// //
const handleDatePickerChange = () => { const handleDatePickerChange = () => {
activeTimeRange.value = '' activeTimeRange.value = ''
@ -560,7 +564,7 @@ const getMarket = async function () {
<div class="head-card-element"> <div class="head-card-element">
<el-text class="mx-1" size="large">更新时间</el-text> <el-text class="mx-1" size="large">更新时间</el-text>
<el-date-picker v-model="getTime" type="datetimerange" range-separator="" start-placeholder="起始时间" <el-date-picker v-model="getTime" type="datetimerange" range-separator="" start-placeholder="起始时间"
end-placeholder="结束时间" style="width: 400px" @change="handleDatePickerChange"/>
end-placeholder="结束时间" style="width: 400px" @change="handleDatePickerChange" :default-time="defaultTime"/>
<el-button @click="getToday()" style="margin-left: 10px" <el-button @click="getToday()" style="margin-left: 10px"
:type="activeTimeRange === 'today' ? 'primary' : ''"> :type="activeTimeRange === 'today' ? 'primary' : ''">
</el-button> </el-button>

178
src/views/usergold/userbean.vue

@ -1,11 +1,181 @@
<script setup lang="ts">
<template>
<el-card style="margin-bottom: 20px;">
<el-text size="large">精网号</el-text>
<el-input v-model="searchObj.jwcode" placeholder="请输入精网号" style="width: 240px" clearable />
<el-text size="large" style="margin-left:20px">地区</el-text>
<el-select v-model="searchObj.dept" placeholder="请选择地区" style="width: 240px" clearable>
<el-option v-for="item in marketOptions" :key="item" :label="item" :value="item" />
</el-select>
</script>
<div style="float: right;">
<el-button type="success" @click="reset">重置</el-button>
<el-button type="primary" @click="get">查询</el-button>
</div>
</el-card>
<template>
<el-card>
<div class="stats-card">
现有金豆数{{ stats.sumBean }}金豆&nbsp;&nbsp;&nbsp;&nbsp;
付费金豆数{{ stats.permanentBean }}金豆&nbsp;&nbsp;&nbsp;&nbsp;
免费金豆数{{ stats.freeBean }}金豆&nbsp;&nbsp;&nbsp;&nbsp;
消费金豆总数{{ stats.consumeSum }}金豆&nbsp;&nbsp;&nbsp;&nbsp;
</div>
<el-table :data="tableData" height="650px" @sort-change="handleSortChange" :row-style="{ height: '60px' }">
<el-table-column label="ID" style="width: 120px" prop="id" />
<el-table-column label="姓名" style="width: 120px;" prop="name" show-overflow-tooltip />
<el-table-column label="精网号" style="width: 120px;" prop="jwcode" />
<el-table-column label="所属地区" style="width: 120px;" prop="dept" />
<el-table-column label="现有金豆" style="width: 120px;" prop="beanNum" sortable="custom" />
<el-table-column label="免费金豆" style="width: 120px;" prop="freeBean" sortable="custom" />
<el-table-column label="付费金豆" style="width: 120px;" prop="buyBean" sortable="custom" />
<el-table-column label="历史消费" style="width: 120px;" prop="totalCostBean" sortable="custom" />
</el-table>
<el-pagination class="pagination" v-model:current-page="pagination.pageNum"
v-model:page-size="pagination.pageSize" layout="total, sizes, prev, pager, next, jumper"
:total="pagination.total" @size-change="handlePageSizeChange"
@current-change="handleCurrentChange"></el-pagination>
</el-card>
</template> </template>
<script setup>
import { ref, onMounted } from 'vue'
import API from '@/util/http'
import { useAdminStore } from "@/store/index.js";
import { storeToRefs } from "pinia";
const adminStore = useAdminStore();
const { adminData, menuTree } = storeToRefs(adminStore);
import { permissionMapping, findMenuById } from "@/utils/menuTreePermission.js"
import { ElMessage } from 'element-plus';
<style scoped>
const tableData = ref([])
const marketOptions = ref([])
const searchObj = ref({
jwcode: '',
dept: '',
sortField: '',
sortOrder: ''
})
const stats = ref({
sumBean: 0,
permanentBean: 0,
freeBean: 0,
consumeSum: 0
})
const pagination = ref({
pageNum: 1,
pageSize: 50,
total: 0
})
const get = async function () {
if(findMenuById(menuTree.value, permissionMapping.View_Golden_Bean_Balance)){
try {
trim()
const params = {
beanUser: { //
jwcode: searchObj.value.jwcode, //
dept: searchObj.value.dept, //
sortField: searchObj.value.sortField,//
sortOrder: searchObj.value.sortOrder//
},
pageNum: pagination.value.pageNum,
pageSize: pagination.value.pageSize
}
const res = await API({
url: '/beanUser/userBean',
data: params
})
if (res.code === 200) {
tableData.value = res.data.list
pagination.value.total = res.data.total
}
} catch (error) {
console.log(error)
}
}else{
ElMessage.error('无此权限')
}
}
const getStats = async () => {
if (findMenuById(menuTree.value, permissionMapping.View_Golden_Bean_Balance)) {
try {
const params = {
beanUser:{
jwcode: searchObj.value.jwcode,
dept: searchObj.value.dept
}
}
const res = await API({
url: '/beanUser/userBeanSum',
data: params
})
stats.value.sumBean = res.data.sumBean
stats.value.permanentBean = res.data.permanentBean
stats.value.freeBean = res.data.freeBean
stats.value.consumeSum = res.data.consumeSum
console.log('see see stats和搜索对象', stats.value, params)
} catch (error) {
console.log('请求失败', error)
}
}else{
ElMessage.error('无此权限')
}
}
const handleSortChange = (column) => {
if (column.prop === 'beanNum') {
searchObj.value.sortField = 'jinbi'
} else if (column.prop === 'freeBean') {
searchObj.value.sortField = 'jinbi_free'
} else if (column.prop === 'buyBean') {
searchObj.value.sortField = 'jinbi_buy'
} else if (column.prop === 'totalCostBean') {
searchObj.value.sortField = 'jinbi_cost_total'
} else {
searchObj.value.sortField = ''
}
searchObj.value.sortOrder = column.order === 'ascending' ? 'asc' : 'desc'
console.log('排序字段:', searchObj.value.sortField,'排序方式:', searchObj.value.sortOrder)
get()
}
const getmarkets = async () => {
try {
const result = await API({ url: '/beanConsume/getDept', data: {} })
marketOptions.value = result.data || []
} catch (error) {
console.error('获取地区列表失败', error)
}
}
//
const trim = () => {
if (searchObj.value.jwcode) {
searchObj.value.jwcode = searchObj.value.jwcode.replace(/\s/g, '');
}
}
const reset = function () {
searchObj.value.jwcode = ''
searchObj.value.dept = ''
}
const handlePageSizeChange = function (val) {
pagination.value.pageSize = val
get()
}
const handleCurrentChange = function (val) {
pagination.value.pageNum = val
get()
}
onMounted(() => {
get()
getmarkets()
getStats()
console.log('页面接收到的adminData:', adminData.value)
})
</script>
<style scoped>
.stats-card {
background-color: #EBEEF5;
padding: 5px;
}
</style> </style>
Loading…
Cancel
Save