6 Commits

  1. 45
      src/router/index.js
  2. 5
      src/utils/menuTreePermission.js
  3. 4
      src/utils/menuUtils.js
  4. 15
      src/views/audit/bean/beanAudit.vue
  5. 61
      src/views/audit/gold/rechargeAudit.vue
  6. 17
      src/views/audit/gold/refundAudit.vue
  7. 228
      src/views/history/history.vue
  8. 119
      src/views/history/newHistory.vue
  9. 117
      src/views/history/oldHistory.vue
  10. 33
      src/views/permissions/permissions.vue
  11. 78
      src/views/permissions/rolePermission.vue
  12. 71
      src/views/permissions/userPermission.vue
  13. 7
      src/views/refund/gold/addCoinRefund.vue
  14. 726
      src/views/refund/gold/addNewCoinRefund.vue
  15. 12
      src/views/refund/gold/coinRefund.vue
  16. 27
      src/views/refund/gold/coinRefundDetail.vue
  17. 9
      src/views/usergold/bean/userbean.vue
  18. 8
      src/views/usergold/gold/clientCount.vue
  19. 22
      src/views/usergold/gold/clientCountBalance.vue
  20. 53
      src/views/usergold/gold/clientCountDetail.vue

45
src/router/index.js

@ -31,6 +31,7 @@ const routes = [
{ {
path: '/goldManage', path: '/goldManage',
name: 'goldManage', name: 'goldManage',
meta:{permissionId:3},
children: [ children: [
// 审核 // 审核
{ {
@ -246,30 +247,30 @@ const routes = [
}, },
] ]
}, },
// {
// path: 'userbean',
// name: "userbean",
// component: () => import("../views/usergold/bean/userbean.vue"),
// meta: { permissionId: 45 }
// },
{
path: '/userbean',
name: "userbean",
component: () => import("../views/usergold/bean/userbean.vue"),
meta: { permissionId: 45 }
},
{ {
path: '/history', path: '/history',
name: "history", name: "history",
component: () => import("../views/history/history.vue"), component: () => import("../views/history/history.vue"),
meta: { permissionId: 12 }, meta: { permissionId: 12 },
children: [ children: [
// {
// path: 'newHistory',
// name: "newHistory",
// component: () => import("../views/history/newHistory.vue"),
// meta: { permissionId: 12 }
// },
// {
// path: 'oldHistory',
// name: "oldHistory",
// component: () => import("../views/history/oldHistory.vue"),
// meta: { permissionId: 12 }
// }
{
path: 'newHistory',
name: "newHistory",
component: () => import("../views/history/newHistory.vue"),
meta: { permissionId: 26 }
},
{
path: 'oldHistory',
name: "oldHistory",
component: () => import("../views/history/oldHistory.vue"),
meta: { permissionId: 27 }
}
] ]
}, },
@ -285,17 +286,17 @@ const routes = [
path: 'userPermission', path: 'userPermission',
name: "userPermission", name: "userPermission",
component: () => import("../views/permissions/userPermission.vue"), component: () => import("../views/permissions/userPermission.vue"),
meta: { permissionId: [24,65,66,67,68,69] }
meta: { permissionId: 24 }
}, },
// 角色权限 // 角色权限
{ {
path: 'rolePermission', path: 'rolePermission',
name: "rolePermission", name: "rolePermission",
component: () => import("../views/permissions/rolePermission.vue"), component: () => import("../views/permissions/rolePermission.vue"),
meta: { permissionId: [25,70,71,72] }
},
meta: { permissionId: 25 }
}
] ]
},
}
] ]
}, },
{ {

5
src/utils/menuTreePermission.js

@ -4,7 +4,7 @@ export const permissionMapping = {
system:1, // 总系统 system:1, // 总系统
workbench: 2, // 工作台 workbench: 2, // 工作台
goldManage:3, // 金币管理 goldManage:3, // 金币管理
monerManage:4, // 现金管理
moneyManage:4, // 现金管理
// 模块,2级 // 模块,2级
financialAudit:5, // 财务审核 financialAudit:5, // 财务审核
@ -83,8 +83,9 @@ export const permissionMapping = {
editUserInfo:67, // 编辑用户信息 editUserInfo:67, // 编辑用户信息
updateUserInfo:68, // 重置密码 updateUserInfo:68, // 重置密码
deleteUserInfo:69, // 删除用户信息 deleteUserInfo:69, // 删除用户信息
changeStatus:70, // 启用禁用用户
roleManageShow:70, // 查看角色信息
roleManageShow:73, // 查看角色信息
addRoleInfo:71, // 新增角色信息 addRoleInfo:71, // 新增角色信息
editRoleInfo:72, // 编辑角色信息 editRoleInfo:72, // 编辑角色信息
} }

4
src/utils/menuUtils.js

@ -64,9 +64,13 @@ export const getRoutePath = (menu) => {
// '金豆退款': '/beanRefund', // '金豆退款': '/beanRefund',
'历史数据查询': '/history', '历史数据查询': '/history',
'金币查询(新)': '/history/newHistory',
'金币查询(旧)': '/history/oldHistory',
'权限管理': '/permissions', '权限管理': '/permissions',
'用户管理': '/permissions/userPermission',
'角色管理': '/permissions/rolePermission',
'金币客户账户明细': '/usergold', '金币客户账户明细': '/usergold',

15
src/views/audit/bean/beanAudit.vue

@ -22,9 +22,9 @@
</el-col> </el-col>
</el-card> </el-card>
<el-card v-if="hasbeanWaitShow">
<el-card >
<el-tabs v-model="checkTab" type="card" @tab-click="handleClick"> <el-tabs v-model="checkTab" type="card" @tab-click="handleClick">
<el-tab-pane label="待审核" name="pending" v-if="hasbeanWait"></el-tab-pane>
<el-tab-pane label="待审核" name="pending" v-if="hasbeanWait&&hasbeanWaitShow"></el-tab-pane>
<el-tab-pane label="已通过" name="pass" v-if="hasbeanThrough"></el-tab-pane> <el-tab-pane label="已通过" name="pass" v-if="hasbeanThrough"></el-tab-pane>
<el-tab-pane label="已驳回" name="reject" v-if="hasbeanReject"></el-tab-pane> <el-tab-pane label="已驳回" name="reject" v-if="hasbeanReject"></el-tab-pane>
</el-tabs> </el-tabs>
@ -142,7 +142,7 @@ const hasbeanWaitThough = ref(false) // 金豆审核通过(对应beanWaitThou
const hasbeanWaitReject = ref(false) // beanWaitReject:47 const hasbeanWaitReject = ref(false) // beanWaitReject:47
// //
const initPermissions = () => {
const initPermissions = async() => {
if (!menuTree.value || !menuTree.value.length) return; if (!menuTree.value || !menuTree.value.length) return;
hasbeanWait.value = hasMenuPermission(menuTree.value, permissionMapping.beanWait); hasbeanWait.value = hasMenuPermission(menuTree.value, permissionMapping.beanWait);
hasbeanThrough.value = hasMenuPermission(menuTree.value, permissionMapping.beanThrough); hasbeanThrough.value = hasMenuPermission(menuTree.value, permissionMapping.beanThrough);
@ -500,7 +500,14 @@ const trimJwCode = () => {
} }
} }
onMounted(async () => { onMounted(async () => {
initPermissions()
await initPermissions()
if(hasbeanWaitShow.value){
searchForm.value.status = 0
}else if(hasbeanThrough.value){
searchForm.value.status = 1
}else if(hasbeanReject){
searchForm.value.status = 2
}
getmarkets() getmarkets()
await get() await get()
await getStats() await getStats()

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

@ -47,9 +47,9 @@
</div> </div>
</el-col> </el-col>
</el-card> </el-card>
<el-card v-if="hasrechargeWaitShow">
<el-card>
<el-tabs v-model="activeName" type="card" @tab-click="handleClick"> <el-tabs v-model="activeName" type="card" @tab-click="handleClick">
<el-tab-pane label="待审核" name="wait" v-if="hasrechargeWait"></el-tab-pane>
<el-tab-pane label="待审核" name="wait" v-if="hasrechargeWait&&hasrechargeWaitShow"></el-tab-pane>
<el-tab-pane label="已通过" name="pass" v-if="hasrechargeThrough"></el-tab-pane> <el-tab-pane label="已通过" name="pass" v-if="hasrechargeThrough"></el-tab-pane>
<el-tab-pane label="已驳回" name="reject" v-if="hasrechargeReject"></el-tab-pane> <el-tab-pane label="已驳回" name="reject" v-if="hasrechargeReject"></el-tab-pane>
<div> <div>
@ -119,7 +119,7 @@
{{ moment(scope.row.auditTime).format('YYYY-MM-DD HH:mm:ss') }} {{ moment(scope.row.auditTime).format('YYYY-MM-DD HH:mm:ss') }}
</template> </template>
</el-table-column> </el-table-column>
<el-table-column v-if="activeName === 'wait'&&(hasrechargeWaitThough||hasrechargeWaitReject)" fixed="right" prop="operation" label="操作" width="150px">
<el-table-column v-if="activeName === 'wait'&&(hasrechargeWaitThough||hasrechargeWaitReject)&&hasrechargeWaitShow" fixed="right" prop="operation" label="操作" width="150px">
<template #default="scope"> <template #default="scope">
<div class="operation"> <div class="operation">
<el-popconfirm title="确定要通过此条记录吗?" @confirm="handleApprove(scope.row)"> <el-popconfirm title="确定要通过此条记录吗?" @confirm="handleApprove(scope.row)">
@ -179,6 +179,28 @@ const { adminData, menuTree } = storeToRefs(adminStore);
import { permissionMapping, hasMenuPermission } from "@/utils/menuTreePermission.js" import { permissionMapping, hasMenuPermission } from "@/utils/menuTreePermission.js"
import dayjs from "dayjs"; import dayjs from "dayjs";
//
const hasrechargeThrough = ref(false) //
const hasrechargeReject = ref(false) //
const hasrechargeWait = ref(false) //
const hasrechargeWaitShow = ref(false) //
const hasrechargeWaitThough = ref(false) //
const hasrechargeWaitReject = ref(false) //
//
const initPermissions = async() => {
if (!menuTree.value || !menuTree.value.length) return;
hasrechargeThrough.value = hasMenuPermission(menuTree.value, permissionMapping.rechargeThrough);
hasrechargeReject.value = hasMenuPermission(menuTree.value, permissionMapping.rechargeReject);
hasrechargeWait.value = hasMenuPermission(menuTree.value, permissionMapping.rechargeWait);
hasrechargeWaitShow.value = hasMenuPermission(menuTree.value, permissionMapping.rechargeWaitShow);
hasrechargeWaitThough.value = hasMenuPermission(menuTree.value, permissionMapping.rechargeWaitThough);
hasrechargeWaitReject.value = hasMenuPermission(menuTree.value, permissionMapping.rechargeWaitReject);
console.log(hasrechargeWaitThough.value)
console.log(hasrechargeWaitReject.value)
};
const defaultTime = [ const defaultTime = [
new Date(2000, 1, 1, 0, 0, 0), new Date(2000, 1, 1, 0, 0, 0),
new Date(2000, 2, 1, 23, 59, 59), new Date(2000, 2, 1, 23, 59, 59),
@ -214,7 +236,7 @@ const rechargeAudit = ref({
startTime: "", // startTime: "", //
endTime: "", // endTime: "", //
market: "", // market: "", //
auditStatus: "0",
auditStatus: '0',
}) })
// //
const getObj = ref({ const getObj = ref({
@ -222,27 +244,7 @@ const getObj = ref({
pageSize: 50 pageSize: 50
}) })
//
const hasrechargeThrough = ref(false) //
const hasrechargeReject = ref(false) //
const hasrechargeWait = ref(false) //
const hasrechargeWaitShow = ref(false) //
const hasrechargeWaitThough = ref(false) //
const hasrechargeWaitReject = ref(false) //
//
const initPermissions = () => {
if (!menuTree.value || !menuTree.value.length) return;
hasrechargeThrough.value = hasMenuPermission(menuTree.value, permissionMapping.rechargeThrough);
hasrechargeReject.value = hasMenuPermission(menuTree.value, permissionMapping.rechargeReject);
hasrechargeWait.value = hasMenuPermission(menuTree.value, permissionMapping.rechargeWait);
hasrechargeWaitShow.value = hasMenuPermission(menuTree.value, permissionMapping.rechargeWaitShow);
hasrechargeWaitThough.value = hasMenuPermission(menuTree.value, permissionMapping.rechargeWaitThough);
hasrechargeWaitReject.value = hasMenuPermission(menuTree.value, permissionMapping.rechargeWaitReject);
console.log(hasrechargeWaitThough.value)
console.log(hasrechargeWaitReject.value)
};
// //
const payModel = [ const payModel = [
@ -482,7 +484,9 @@ const handleClick = function (tab, event) {
ElMessage.error('暂无权限') ElMessage.error('暂无权限')
return return
} }
if(hasrechargeWaitShow){
adminWait() adminWait()
}
} else if (tab.props.name === 'pass') { } else if (tab.props.name === 'pass') {
if(!hasrechargeThrough){ if(!hasrechargeThrough){
ElMessage.error('暂无权限') ElMessage.error('暂无权限')
@ -695,7 +699,14 @@ const cancelClick = () => {
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') : ''
// //
onMounted(async function () { onMounted(async function () {
initPermissions()
await initPermissions()
if(hasrechargeWaitShow.value){
rechargeAudit.value.auditStatus = '0'
}else if(hasrechargeThrough.value){
rechargeAudit.value.auditStatus = '1'
}else if(hasrechargeReject){
rechargeAudit.value.auditStatus = '2'
}
await getActivity() await getActivity()
await getMarket() await getMarket()
await getRecharge() await getRecharge()

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

@ -49,9 +49,9 @@
</el-col> </el-col>
</el-card> </el-card>
<el-card v-if="hasrefundWaitShow">
<el-card >
<el-tabs v-model="activeName" type="card" @tab-click="handleClick"> <el-tabs v-model="activeName" type="card" @tab-click="handleClick">
<el-tab-pane label="待审核" name="wait" v-if="hasrefundWait"></el-tab-pane>
<el-tab-pane label="待审核" name="wait" v-if="hasrefundWait&&hasrefundWaitShow"></el-tab-pane>
<el-tab-pane label="已通过" name="pass" v-if="hasrefundThrough"></el-tab-pane> <el-tab-pane label="已通过" name="pass" v-if="hasrefundThrough"></el-tab-pane>
<el-tab-pane label="已驳回" name="reject" v-if="hasrefundReject"></el-tab-pane> <el-tab-pane label="已驳回" name="reject" v-if="hasrefundReject"></el-tab-pane>
</el-tabs> </el-tabs>
@ -118,7 +118,7 @@
{{ row.auditTime ? moment(row.auditTime).format('YYYY-MM-DD HH:mm:ss') : '--' }} {{ row.auditTime ? moment(row.auditTime).format('YYYY-MM-DD HH:mm:ss') : '--' }}
</template> </template>
</el-table-column> </el-table-column>
<el-table-column v-if="checkTab === 'pending' && (hasrefundWaitThough || hasrefundWaitReject)" fixed="right"
<el-table-column v-if="checkTab === 'pending' && (hasrefundWaitThough || hasrefundWaitReject)&&hasrefundWaitShow" fixed="right"
prop="operation" label="操作" width="150px"> prop="operation" label="操作" width="150px">
<template #default="scope"> <template #default="scope">
<div class="operation"> <div class="operation">
@ -243,7 +243,7 @@ const hasrefundWaitThough = ref(false) // 退款审核通过
const hasrefundWaitReject = ref(false) // 退 const hasrefundWaitReject = ref(false) // 退
// //
const initPermissions = () => {
const initPermissions = async() => {
if (!menuTree.value || !menuTree.value.length) return; if (!menuTree.value || !menuTree.value.length) return;
// 退 // 退
hasrefundThrough.value = hasMenuPermission(menuTree.value, permissionMapping.refundThrough); hasrefundThrough.value = hasMenuPermission(menuTree.value, permissionMapping.refundThrough);
@ -614,7 +614,14 @@ const handleCurrentChange = function (val) {
get() get()
} }
onMounted(async () => { onMounted(async () => {
initPermissions()
await initPermissions()
if(hasrefundWaitShow.value){
searchForm.value.auditStatus = '0'
}else if(hasrefundThrough.value){
searchForm.value.auditStatus = '1'
}else if(hasrefundReject){
searchForm.value.auditStatus = '2'
}
getRefundGoods() getRefundGoods()
await getMarket() await getMarket()
await get() await get()

228
src/views/history/history.vue

@ -1,179 +1,71 @@
<template> <template>
<el-tabs v-model="activeName" type="card" @tab-click="handleClick">
<el-tab-pane label="金币查询(新)" name="new"></el-tab-pane>
<el-tab-pane label="金币查询(旧)" name="old"></el-tab-pane>
</el-tabs>
<el-card>
<el-text size="large">姓名</el-text>
<el-input v-model="searchObj.name" placeholder="请输入姓名" style="width: 12vw;margin-right:1vw"
clearable></el-input>
<router-view></router-view>
</template>
<el-text size="large">精网号</el-text>
<el-input v-model="searchObj.jwcode" placeholder="请输入精网号" style="width: 12vw;margin-right:1vw"
clearable></el-input>
<script setup>
import {onMounted, ref, watch} from 'vue';
import {useRoute, useRouter} from 'vue-router';
import {storeToRefs} from "pinia";
import {useAdminStore} from "@/store/index.js";
import {hasMenuPermission, permissionMapping} from "@/utils/menuTreePermission.js";
<el-text size="large" style="width: 80px">更新时间</el-text>
<el-date-picker v-model="dateRange" type="datetimerange" :default-time="defaultTime" range-separator=""
start-placeholder="开始时间" end-placeholder="结束时间" style="width: 25vw;margin-right:1vw" />
const router = useRouter();
const route = useRoute();
const adminStore = useAdminStore();
const {menuTree} = storeToRefs(adminStore);
<el-button type="success" @click="resetSearch">重置</el-button>
<el-button type="primary" v-if="activeName == 'new'" @click="get">查询</el-button>
<el-button type="primary" v-else-if="activeName == 'old'" @click="getOld">查询</el-button>
</el-card>
const activeTab = ref('');
const hasNew = ref(false);
const hasOld = ref(false);
//
const navigateTo = (name) => {
activeTab.value = name;
router.push({name});
};
<el-card style="margin-top:10px" v-show="tableData.length > 0">
<el-table :data="tableData" style="width: 82vw;height:60vh">
<el-table-column type="index" label="序号" width="100" header-align="center" align="center">
<template #default="scope">
{{ scope.$index + 1 + (pagination.pageNum - 1) * pagination.pageSize }}
</template>
</el-table-column>
<el-table-column prop="name" label="客户姓名" width="180" show-overflow-tooltip />
<el-table-column prop="jwcode" label="精网号" width="180" header-align="center" align="center" />
<el-table-column prop="num" label="数量" width="180" header-align="center" align="center" />
<el-table-column prop="updateType" show-overflow-tooltip label="更新类型" width="180" align="center" />
<el-table-column v-if="activeName === 'new'" prop="freeGold" label="免费金币" width="180" align="center" />
<el-table-column v-if="activeName === 'new'" prop="permanentGold" label="永久金币" width="180" align="center" />
<el-table-column v-if="activeName === 'new'" prop="taskGold" label="任务金币" width="180" align="center" />
<el-table-column prop="operator" label="操作人" width="180" />
<el-table-column prop="createTime" label="更新时间" width="200" header-align="center" align="center" />
<el-table-column prop="remark" label="备注" show-overflow-tooltip width="200" align="center" />
</el-table>
<el-pagination background style="margin-top:20px" 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>
<script setup>
import { onMounted, ref } from 'vue'
import { ElMessage } from 'element-plus'
import API from '@/util/http.js'
import moment from 'moment'
import { useAdminStore } from "@/store/index.js"
import { storeToRefs } from "pinia"
import dayjs from 'dayjs'
const adminStore = useAdminStore()
const { adminData, menuTree } = storeToRefs(adminStore)
import { permissionMapping, findMenuById } from "@/utils/menuTreePermission.js"
const defaultTime = [
new Date(2000, 1, 1, 0, 0, 0),
new Date(2000, 2, 1, 23, 59, 59),
]
const activeName = ref('new')
const handleClick = function (tab) {
activeName.value = tab.props.name
if (tab.props.name === 'new') {
resetSearch()
pagination.value.pageNum = 1
tableData.value = []
console.log('新的');
} else if (tab.props.name === 'old') {
resetSearch()
pagination.value.pageNum = 1
console.log('旧的');
tableData.value = []
}
}
const tableData = ref([])
const dateRange = ref([])
const searchObj = ref({
name: '',
jwcode: ''
})
const pagination = ref({
pageNum: 1,
pageSize: 50,
total: 0
})
//
const getOld = async function () {
if (findMenuById(menuTree.value, permissionMapping.History_Query)) {
try {
if ((searchObj.value.name || searchObj.value.jwcode) && activeName.value == 'old') {
const startTime = dateRange.value && dateRange.value[0] ? moment(dateRange.value[0]).format('YYYY-MM-DD HH:mm:ss') : ""
const endTime = dateRange.value && dateRange.value[1] ? moment(dateRange.value[1]).format('YYYY-MM-DD HH:mm:ss') : ""
const res = await API({
url: '/history/getOldHistoryRecord',
data: {
...searchObj.value,
startTime: startTime,
endTime: endTime,
pageNum: pagination.value.pageNum,
pageSize: pagination.value.pageSize,
}
})
if (res.code == 200) {
ElMessage.success('查询成功')
tableData.value = res.data.list
console.log('tableData.value', res.data.list);
pagination.value.total = res.data.total
}
} else {
ElMessage.error('请输入姓名或精网号')
return
}
} catch (e) {
ElMessage.error(e.message)
}
}
}
//
const get = async function () {
if (findMenuById(menuTree.value, permissionMapping.History_Query)) {
try {
if ((searchObj.value.name || searchObj.value.jwcode) && activeName.value == 'new') {
const startTime = dateRange.value && dateRange.value[0] ? moment(dateRange.value[0]).format('YYYY-MM-DD HH:mm:ss') : ""
const endTime = dateRange.value && dateRange.value[1] ? moment(dateRange.value[1]).format('YYYY-MM-DD HH:mm:ss') : ""
const res = await API({
url: '/history/getNewHistoryRecord',
data: {
...searchObj.value,
startTime: startTime,
endTime: endTime,
pageNum: pagination.value.pageNum,
pageSize: pagination.value.pageSize,
}
})
if (res.code == 200) {
ElMessage.success('查询成功')
tableData.value = res.data.list
console.log('tableData.value', res.data.list)
pagination.value.total = res.data.total
//
const initPermissions = () => {
if (!menuTree.value || !menuTree.value.length) return
hasNew.value = hasMenuPermission(menuTree.value, permissionMapping.newCoinSelect)
hasOld.value = hasMenuPermission(menuTree.value, permissionMapping.oldCoinSelect)
} }
//
const getDefaultAuditRoute = () => {
initPermissions()
if (hasNew.value) return 'newHistory'
if (hasOld.value) return 'oldHistory'
return 'newHistory'
};
//
watch(() => route.name, (newName) => {
initPermissions()
if (newName === 'newHistory' || newName === 'oldHistory') {
activeTab.value = newName;
} else if (newName === 'history') {
// 访 /history
const defaultRoute = getDefaultAuditRoute();
navigateTo(defaultRoute);
}
});
//
onMounted(() => {
initPermissions()
console.log('============================',hasNew.value,hasOld.value)
if (route.name === 'history') {
const defaultRoute = getDefaultAuditRoute();
navigateTo(defaultRoute);
} else { } else {
ElMessage.error('请输入姓名或精网号')
return
}
} catch (e) {
ElMessage.error(e.message)
}
}
}
const resetSearch = function () {
searchObj.value = {
name: '',
jwcode: ''
}
dateRange.value = []
}
const handlePageSizeChange = function (val) {
pagination.value.pageSize = val
if (activeName.value == 'new') {
get()
} else if (activeName.value == 'old') {
getOld()
}
}
const handleCurrentChange = function (val) {
pagination.value.pageNum = val
if (activeName.value == 'new') {
get()
} else if (activeName.value == 'old') {
getOld()
//
if (route.name === 'newHistory' || route.name === 'oldHistory') {
activeTab.value = route.name;
} }
} }
});
</script> </script>
<style scoped></style>
<style>
</style>

119
src/views/history/newHistory.vue

@ -0,0 +1,119 @@
<template>
<el-card>
<el-text size="large">姓名</el-text>
<el-input v-model="searchObj.name" placeholder="请输入姓名" style="width: 12vw;margin-right:1vw"
clearable></el-input>
<el-text size="large">精网号</el-text>
<el-input v-model="searchObj.jwcode" placeholder="请输入精网号" style="width: 12vw;margin-right:1vw"
clearable></el-input>
<el-text size="large" style="width: 80px">更新时间</el-text>
<el-date-picker v-model="dateRange" type="datetimerange" :default-time="defaultTime" range-separator=""
start-placeholder="开始时间" end-placeholder="结束时间" style="width: 25vw;margin-right:1vw" />
<el-button type="success" @click="resetSearch">重置</el-button>
<el-button type="primary" @click="get">查询</el-button>
</el-card>
<el-card style="margin-top:10px" v-show="tableData.length > 0">
<el-table :data="tableData" style="width: 82vw;height:60vh">
<el-table-column type="index" label="序号" width="100" header-align="center" align="center">
<template #default="scope">
{{ scope.$index + 1 + (pagination.pageNum - 1) * pagination.pageSize }}
</template>
</el-table-column>
<el-table-column prop="name" label="客户姓名" width="180" show-overflow-tooltip />
<el-table-column prop="jwcode" label="精网号" width="180" header-align="center" align="center" />
<el-table-column prop="num" label="数量" width="180" header-align="center" align="center" />
<el-table-column prop="updateType" show-overflow-tooltip label="更新类型" width="180" align="center" />
<el-table-column prop="freeGold" label="免费金币" width="180" align="center" />
<el-table-column prop="permanentGold" label="永久金币" width="180" align="center" />
<el-table-column prop="taskGold" label="任务金币" width="180" align="center" />
<el-table-column prop="operator" label="操作人" width="180" />
<el-table-column prop="createTime" label="更新时间" width="200" header-align="center" align="center" />
<el-table-column prop="remark" label="备注" show-overflow-tooltip width="200" align="center" />
</el-table>
<el-pagination background style="margin-top:20px" 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>
<script setup>
import { onMounted, ref } from 'vue'
import { ElMessage } from 'element-plus'
import API from '@/util/http.js'
import moment from 'moment'
import { useAdminStore } from "@/store/index.js"
import { storeToRefs } from "pinia"
import dayjs from 'dayjs'
const adminStore = useAdminStore()
const { adminData, menuTree } = storeToRefs(adminStore)
import { permissionMapping, findMenuById } from "@/utils/menuTreePermission.js"
const defaultTime = [
new Date(2000, 1, 1, 0, 0, 0),
new Date(2000, 2, 1, 23, 59, 59),
]
const tableData = ref([])
const dateRange = ref([])
const searchObj = ref({
name: '',
jwcode: ''
})
const pagination = ref({
pageNum: 1,
pageSize: 50,
total: 0
})
//
const get = async function () {
try {
if (searchObj.value.name || searchObj.value.jwcode) {
const startTime = dateRange.value && dateRange.value[0] ? moment(dateRange.value[0]).format('YYYY-MM-DD HH:mm:ss') : ""
const endTime = dateRange.value && dateRange.value[1] ? moment(dateRange.value[1]).format('YYYY-MM-DD HH:mm:ss') : ""
const res = await API({
url: '/history/getNewHistoryRecord',
data: {
...searchObj.value,
startTime: startTime,
endTime: endTime,
pageNum: pagination.value.pageNum,
pageSize: pagination.value.pageSize,
}
})
if (res.code == 200) {
ElMessage.success('查询成功')
tableData.value = res.data.list
console.log('tableData.value', res.data.list)
pagination.value.total = res.data.total
}
} else {
ElMessage.error('请输入姓名或精网号')
return
}
} catch (e) {
ElMessage.error(e.message)
}
}
const resetSearch = function () {
searchObj.value = {
name: '',
jwcode: ''
}
dateRange.value = []
}
const handlePageSizeChange = function (val) {
pagination.value.pageSize = val
get()
}
const handleCurrentChange = function (val) {
pagination.value.pageNum = val
get()
}
</script>
<style scoped></style>

117
src/views/history/oldHistory.vue

@ -0,0 +1,117 @@
<template>
<el-card>
<el-text size="large">姓名</el-text>
<el-input v-model="searchObj.name" placeholder="请输入姓名" style="width: 12vw;margin-right:1vw"
clearable></el-input>
<el-text size="large">精网号</el-text>
<el-input v-model="searchObj.jwcode" placeholder="请输入精网号" style="width: 12vw;margin-right:1vw"
clearable></el-input>
<el-text size="large" style="width: 80px">更新时间</el-text>
<el-date-picker v-model="dateRange" type="datetimerange" :default-time="defaultTime" range-separator=""
start-placeholder="开始时间" end-placeholder="结束时间" style="width: 25vw;margin-right:1vw" />
<el-button type="success" @click="resetSearch">重置</el-button>
<el-button type="primary" @click="getOld">查询</el-button>
</el-card>
<el-card style="margin-top:10px" v-show="tableData.length > 0">
<el-table :data="tableData" style="width: 82vw;height:60vh">
<el-table-column type="index" label="序号" width="100" header-align="center" align="center">
<template #default="scope">
{{ scope.$index + 1 + (pagination.pageNum - 1) * pagination.pageSize }}
</template>
</el-table-column>
<el-table-column prop="name" label="客户姓名" width="180" show-overflow-tooltip />
<el-table-column prop="jwcode" label="精网号" width="180" header-align="center" align="center" />
<el-table-column prop="num" label="数量" width="180" header-align="center" align="center" />
<el-table-column prop="updateType" show-overflow-tooltip label="更新类型" width="180" align="center" />
<el-table-column prop="operator" label="操作人" width="180" />
<el-table-column prop="createTime" label="更新时间" width="200" header-align="center" align="center" />
<el-table-column prop="remark" label="备注" show-overflow-tooltip width="200" align="center" />
</el-table>
<el-pagination background style="margin-top:20px" 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>
<script setup>
import { onMounted, ref } from 'vue'
import { ElMessage } from 'element-plus'
import API from '@/util/http.js'
import moment from 'moment'
import { useAdminStore } from "@/store/index.js"
import { storeToRefs } from "pinia"
import dayjs from 'dayjs'
const adminStore = useAdminStore()
const { adminData, menuTree } = storeToRefs(adminStore)
import { permissionMapping, findMenuById } from "@/utils/menuTreePermission.js"
const defaultTime = [
new Date(2000, 1, 1, 0, 0, 0),
new Date(2000, 2, 1, 23, 59, 59),
]
const tableData = ref([])
const dateRange = ref([])
const searchObj = ref({
name: '',
jwcode: ''
})
const pagination = ref({
pageNum: 1,
pageSize: 50,
total: 0
})
//
const getOld = async function () {
try {
if (searchObj.value.name || searchObj.value.jwcode) {
const startTime = dateRange.value && dateRange.value[0] ? moment(dateRange.value[0]).format('YYYY-MM-DD HH:mm:ss') : ""
const endTime = dateRange.value && dateRange.value[1] ? moment(dateRange.value[1]).format('YYYY-MM-DD HH:mm:ss') : ""
const res = await API({
url: '/history/getOldHistoryRecord',
data: {
...searchObj.value,
startTime: startTime,
endTime: endTime,
pageNum: pagination.value.pageNum,
pageSize: pagination.value.pageSize,
}
})
if (res.code == 200) {
ElMessage.success('查询成功')
tableData.value = res.data.list
console.log('tableData.value', res.data.list);
pagination.value.total = res.data.total
}
} else {
ElMessage.error('请输入姓名或精网号')
return
}
} catch (e) {
ElMessage.error(e.message)
}
}
const resetSearch = function () {
searchObj.value = {
name: '',
jwcode: ''
}
dateRange.value = []
}
const handlePageSizeChange = function (val) {
pagination.value.pageSize = val
getOld()
}
const handleCurrentChange = function (val) {
pagination.value.pageNum = val
getOld()
}
</script>
<style scoped></style>

33
src/views/permissions/permissions.vue

@ -1,19 +1,5 @@
<template> <template>
<div class="father">
<el-button-group>
<el-button :type="activeTab === 'userPermission' ? 'primary' : 'default'" @click="navigateTo('userPermission')"
:disabled="!hasDetail">
用户管理
</el-button>
<el-button :type="activeTab === 'rolePermission' ? 'primary' : 'default'" @click="navigateTo('rolePermission')"
:disabled="!hasBalance">
角色管理
</el-button>
</el-button-group>
</div>
<div>
<router-view></router-view> <router-view></router-view>
</div>
</template> </template>
<script setup> <script setup>
@ -28,8 +14,8 @@ const adminStore = useAdminStore();
const { menuTree } = storeToRefs(adminStore); const { menuTree } = storeToRefs(adminStore);
const activeTab = ref(''); const activeTab = ref('');
const hasDetail = ref(false);
const hasBalance = ref(false);
const hasUser = ref(false);
const hasRole = ref(false);
// //
const navigateTo = (name) => { const navigateTo = (name) => {
activeTab.value = name; activeTab.value = name;
@ -41,15 +27,16 @@ const navigateTo = (name) => {
const initPermissions = () => { const initPermissions = () => {
if (!menuTree.value || !menuTree.value.length) return; if (!menuTree.value || !menuTree.value.length) return;
hasDetail.value = hasMenuPermission(menuTree.value, permissionMapping.View_Permission);
hasBalance.value = hasMenuPermission(menuTree.value, permissionMapping.View_Role);
hasUser.value = hasMenuPermission(menuTree.value, permissionMapping.userManage);
hasRole.value = hasMenuPermission(menuTree.value, permissionMapping.roleManage);
console.log('====================================', hasUser.value, hasRole.value)
}; };
// //
const getDefaultAuditRoute = () => { const getDefaultAuditRoute = () => {
initPermissions(); initPermissions();
if (hasDetail.value) return 'userPermission';
if (hasBalance.value) return 'rolePermission';
if (hasUser.value) return 'userPermission';
if (hasRole.value) return 'rolePermission';
return 'userPermission'; return 'userPermission';
}; };
@ -79,9 +66,3 @@ onMounted(() => {
} }
}); });
</script> </script>
<style>
.father{
width:82vw;
height:4vh;
}
</style>

78
src/views/permissions/rolePermission.vue

@ -39,18 +39,12 @@ const addRole = ref({
market: '' market: ''
}) })
const addRoleMarket = ref([]) const addRoleMarket = ref([])
const viewRole = ref([])
const getRolePermission = async function () {
const result = await request({
url: '/menu/tree',
data: {
"id": adminData.value.roleId
}
})
viewRole.value = collectIds(result.data)
console.log('result111', viewRole.value);
}
const getRoleList = async function (val) { const getRoleList = async function (val) {
if(!findMenuById(menuTree.value, permissionMapping.roleManageShow)){
ElMessage.error('无此权限')
return
}
try { try {
if (typeof val === 'number') { if (typeof val === 'number') {
getObj.value.pageNum = val getObj.value.pageNum = val
@ -178,6 +172,10 @@ function processTreeData(data) {
} }
const handleAddRole = async function () { const handleAddRole = async function () {
if(!findMenuById(menuTree.value, permissionMapping.addRoleInfo)){
ElMessage.error('无此权限')
return
}
try { try {
await new Promise((resolve, reject) => { await new Promise((resolve, reject) => {
Ref.value.validate((valid) => { Ref.value.validate((valid) => {
@ -242,23 +240,10 @@ const getLists = async function () {
data: { id: roleId } data: { id: roleId }
}) })
data.value = res.data data.value = res.data
// let originalData = res.data.filter(item => item.id !== 9);
//
// data.value = filterGoldenBeanMenus(originalData);
// data.value = data.value.filter(item => item.id !== 9);
data.value = data.value.filter(item => item.id !== 9);
data.value = filterPermission(data.value)
console.log('看看data', data.value) console.log('看看data', data.value)
console.log('parentID:', addRole.value.parentId, 'roleId:', roleId) console.log('parentID:', addRole.value.parentId, 'roleId:', roleId)
/* // 根据地区过滤金豆菜单
if (addRole.value.market !== '总部') {
//
originalData = filterGoldenBeanMenus(originalData);
}
data.value = originalData; // */
if (addRole.value.parentId && addRole.value.parentId !== 2) { if (addRole.value.parentId && addRole.value.parentId !== 2) {
const result = await API({ const result = await API({
url: '/general/roleMarket', url: '/general/roleMarket',
@ -292,11 +277,15 @@ const getLists = async function () {
// //
const goldenBeanMenuIds = new Set([ const goldenBeanMenuIds = new Set([
43, 55, 54, // ->
41, 47, 46, 48, // ->
42, 50, 49, 52, 51, // ->
45, 53 // ->
permissionMapping.beanAudit,
permissionMapping.beanRecharge,
permissionMapping.beanConsume,
permissionMapping.beanDetail
]) ])
// 15,43,44,45,46,47,//
// 18,52,53,54,//
// 20,57,58,59,60,//
// 23//
const filterGoldenBeanMenus = (tree) => { const filterGoldenBeanMenus = (tree) => {
return tree return tree
.filter(item => { .filter(item => {
@ -311,6 +300,18 @@ const filterGoldenBeanMenus = (tree) => {
return true return true
}) })
} }
// (????????)
const filterPermission = (tree) => {
return tree.filter(item =>{
if(item.id === permissionMapping.permissionManage){
return false
}
else if(item.children && item.children.length > 0){
item.children = filterPermission(item.children)
}
return true
})
}
// //
const handleEditRolePermissionCheck = (checkedNodes, checkedInfo) => { const handleEditRolePermissionCheck = (checkedNodes, checkedInfo) => {
const { checkedKeys, checkedNodes: allCheckedNodes } = checkedInfo const { checkedKeys, checkedNodes: allCheckedNodes } = checkedInfo
@ -438,8 +439,8 @@ const permissionEditRoleInit = async function (row) {
data: { id: roleId } data: { id: roleId }
}); });
data.value = res.data; data.value = res.data;
data.value = data.value.filter(item => item.id !== 9);
data.value = filterGoldenBeanMenus(data.value);
data.value = filterPermission(data.value)
//data.value = filterGoldenBeanMenus(data.value);
// id // id
if (row.tree && row.tree.length > 0) { if (row.tree && row.tree.length > 0) {
@ -467,6 +468,10 @@ const permissionEditRoleInit = async function (row) {
// //
const permissionEditRole = async function () { const permissionEditRole = async function () {
if(!findMenuById(menuTree.value, permissionMapping.editRoleInfo)){
ElMessage.error('无此权限')
return
}
try { try {
await new Promise((resolve, reject) => { await new Promise((resolve, reject) => {
Ref.value.validate((valid) => { Ref.value.validate((valid) => {
@ -569,11 +574,12 @@ const Rolerules = reactive({
const throttledHandleAddRole = _.throttle(handleAddRole, 5000, { const throttledHandleAddRole = _.throttle(handleAddRole, 5000, {
trailing: false trailing: false
}) })
const canLook = findMenuById(menuTree.value,permissionMapping.roleManageShow)
const canAdd = findMenuById(menuTree.value, permissionMapping.addRoleInfo)
const canEdit = findMenuById(menuTree.value, permissionMapping.editRoleInfo)
// //
onMounted(async function () { onMounted(async function () {
await getRoleList() await getRoleList()
await getRolePermission()
await getRoleArea() await getRoleArea()
}) })
@ -586,14 +592,14 @@ onMounted(async function () {
<el-input v-model="role.name" style="width: 240px" placeholder="请输入角色名称" clearable /> <el-input v-model="role.name" style="width: 240px" placeholder="请输入角色名称" clearable />
<div style="margin-left: auto;"> <div style="margin-left: auto;">
<el-button type="success" @click="reset()">重置</el-button> <el-button type="success" @click="reset()">重置</el-button>
<el-button type="primary" @click="searchRole()">查询</el-button>
<el-button type="primary" @click="searchRole()" :disabled="canLook" v-if="canLook">查询</el-button>
</div> </div>
</div> </div>
</el-card> </el-card>
<el-card> <el-card>
<div class="add-item"> <div class="add-item">
<el-button style="color: #048efb; border: 1px solid #048efb" @click="permissionAddInit()">新增角色</el-button>
<el-button style="color: #048efb; border: 1px solid #048efb" @click="permissionAddInit()" :disabled="!canAdd" v-if="canAdd">新增角色</el-button>
</div> </div>
<div> <div>
<el-table :data="roleData" style="width: 100%" show-overflow-tooltip> <el-table :data="roleData" style="width: 100%" show-overflow-tooltip>
@ -620,7 +626,7 @@ onMounted(async function () {
</el-table-column> </el-table-column>
<el-table-column prop="operation" label="操作" width="200px"> <el-table-column prop="operation" label="操作" width="200px">
<template #default="scope"> <template #default="scope">
<el-button type="warning" text @click="permissionEditRoleInit(scope.row)" :disabled="(scope.row.id === 2)|| (scope.row.id === 1)">
<el-button type="warning" text @click="permissionEditRoleInit(scope.row)" :disabled="(scope.row.id === 2)|| (scope.row.id === 1) || !canEdit" v-if="canEdit">
编辑 编辑
</el-button> </el-button>
</template> </template>

71
src/views/permissions/userPermission.vue

@ -5,6 +5,12 @@ import { InfoFilled } from '@element-plus/icons-vue'
import _ from 'lodash' import _ from 'lodash'
import request from '@/util/http' import request from '@/util/http'
import API from '@/util/http' import API from '@/util/http'
import { useAdminStore } from "@/store/index.js"
import { storeToRefs } from "pinia"
import { findMenuById, permissionMapping } from "@/utils/menuTreePermission.js"
const adminStore = useAdminStore()
const { adminData, menuTree } = storeToRefs(adminStore)
// //
const tableData = ref([]) const tableData = ref([])
const total = ref(100) const total = ref(100)
@ -97,20 +103,6 @@ const addAdmin = ref({
machineId: '', machineId: '',
remark: '' remark: ''
}) })
//
const adminData = ref({})
// todo
const getAdminData = async function () {
try {
const result = await API({ url: '/admin/userinfo', data: {} })
adminData.value = result
// console.log('', result)
console.log('管理员用户信息', adminData.value)
} catch (error) {
console.log('请求失败', error)
}
}
// //
const permissionEditObj = ref({ const permissionEditObj = ref({
checkedKeys: [], checkedKeys: [],
@ -204,7 +196,6 @@ const getRoleArea = async function () {
console.log('请求失败', error) console.log('请求失败', error)
} }
} }
// //
const marketsTree = ref([]) const marketsTree = ref([])
const getArea = async function () { const getArea = async function () {
@ -275,6 +266,10 @@ const userAddInit = function () {
// //
const permissionAdd = async function () { const permissionAdd = async function () {
if (!findMenuById(menuTree.value, permissionMapping.addUserInfo)) {
ElMessage.error('无此权限')
return
}
try { try {
await new Promise((resolve, reject) => { await new Promise((resolve, reject) => {
Ref.value.validate((valid) => { Ref.value.validate((valid) => {
@ -327,7 +322,6 @@ const Ref = ref(null)
// //
const permissionList = ref([]) const permissionList = ref([])
const getRoles = async function () { const getRoles = async function () {
try { try {
const res = await API({ url: '/role/selectAll' }) const res = await API({ url: '/role/selectAll' })
@ -341,8 +335,6 @@ const getRoles = async function () {
console.error('获取权限列表失败:', error) console.error('获取权限列表失败:', error)
} }
} }
// //
const openUserEditVisible = function () { const openUserEditVisible = function () {
userEditVisible.value = true userEditVisible.value = true
@ -504,6 +496,10 @@ const editAdminRules = {
}; };
// //
const permissionEdit = async function () { const permissionEdit = async function () {
if (!findMenuById(menuTree.value, permissionMapping.editUserInfo)) {
ElMessage.error('无此权限')
return
}
let { adminName: userName, roleName: oldRole, roleId: newRoleId } = permissionEditObj.value; let { adminName: userName, roleName: oldRole, roleId: newRoleId } = permissionEditObj.value;
if (oldRole == null) { if (oldRole == null) {
oldRole = '暂未分配角色' oldRole = '暂未分配角色'
@ -576,6 +572,10 @@ const del = function (row) {
} }
// //
const delConfirm = async function () { const delConfirm = async function () {
if (!findMenuById(menuTree.value, permissionMapping.deleteUserInfo)) {
ElMessage.error('无此权限')
return
}
try { try {
const result = await request({ const result = await request({
url: '/permission/deleteAdmin', url: '/permission/deleteAdmin',
@ -594,6 +594,10 @@ const delConfirm = async function () {
} }
// //
const editStatus = async function (row) { const editStatus = async function (row) {
if (!findMenuById(menuTree.value, permissionMapping.changeStatus)) {
ElMessage.error('无此权限')
return
}
const { id, account, targetStatus, ...restRow } = currentStatusRow.value const { id, account, targetStatus, ...restRow } = currentStatusRow.value
try { try {
@ -783,6 +787,10 @@ const resetPassword = function (row) {
// //
const confirmResetPassword = async function () { const confirmResetPassword = async function () {
if (!findMenuById(menuTree.value, permissionMapping.updateUserInfo)) {
ElMessage.error('无此权限')
return
}
console.log('adminData', adminData.value) console.log('adminData', adminData.value)
// markets // markets
if (typeof adminData.value.markets === 'string' && adminData.value.markets) { if (typeof adminData.value.markets === 'string' && adminData.value.markets) {
@ -883,15 +891,20 @@ const throttledPermissionEdit = _.throttle(permissionEdit, 5000, {
const throttledPermissionAdd = _.throttle(permissionAdd, 5000, { const throttledPermissionAdd = _.throttle(permissionAdd, 5000, {
trailing: false trailing: false
}) })
const canLook = findMenuById(menuTree.value, permissionMapping.userManageShow)//
const canAdd = findMenuById(menuTree.value, permissionMapping.addUserInfo)
const canEdit = findMenuById(menuTree.value, permissionMapping.editUserInfo)
const canReset = findMenuById(menuTree.value, permissionMapping.updateUserInfo)
const canDel = findMenuById(menuTree.value, permissionMapping.deleteUserInfo)
const change = findMenuById(menuTree.value, permissionMapping.changeStatus)
// //
onMounted(async function () { onMounted(async function () {
await getAdminData()
await getPermission() await getPermission()
await getArea() await getArea()
await getStore() await getStore()
await getRoles() await getRoles()
await getRoleArea() await getRoleArea()
console.log('看看权限', canAdd, canEdit, canReset, canDel, change)
}) })
</script> </script>
@ -918,14 +931,14 @@ onMounted(async function () {
<div class="head-card-btn"> <div class="head-card-btn">
<el-button type="success" @click="reset()">重置</el-button> <el-button type="success" @click="reset()">重置</el-button>
<el-button type="primary" @click="search()">查询</el-button>
<el-button type="primary" @click="search()" v-if="canLook">查询</el-button>
</div> </div>
</div> </div>
</el-card> </el-card>
<el-card> <el-card>
<!-- 展示表单 --> <!-- 展示表单 -->
<div class="add-item"> <div class="add-item">
<el-button style="color: #048efb; border: 1px solid #048efb" @click="userAddInit()">新增用户</el-button>
<el-button style="color: #048efb; border: 1px solid #048efb" :disabled="!canAdd" v-if="canAdd" @click="userAddInit()">新增用户</el-button>
</div> </div>
<div> <div>
@ -947,17 +960,17 @@ onMounted(async function () {
<el-table-column prop="remark" label="备注" /> <el-table-column prop="remark" label="备注" />
<el-table-column prop="operation" label="操作" width="280px"> <el-table-column prop="operation" label="操作" width="280px">
<template #default="scope"> <template #default="scope">
<el-button type="warning" text @click="resetPassword(scope.row)">
<el-button type="warning" text :disabled="!canReset" @click="resetPassword(scope.row)" v-if="canReset">
重置密码 重置密码
</el-button> </el-button>
<el-button type="primary" text @click="permissionEditInit(scope.row)"
:disabled="scope.row.adminStatus === 0 || scope.row.account === adminData.account">
<el-button type="primary" text @click="permissionEditInit(scope.row)" v-if="canEdit"
:disabled="!canEdit || scope.row.adminStatus === 0 || scope.row.account === adminData.account">
修改权限 修改权限
</el-button> </el-button>
<el-popconfirm title="确定将此用户删除吗?" @confirm="delConfirm"> <el-popconfirm title="确定将此用户删除吗?" @confirm="delConfirm">
<template #reference> <template #reference>
<el-button type="danger" text @click="del(scope.row)"
:disabled="scope.row.adminStatus === 0 || scope.row.account === adminData.account">
<el-button type="danger" text @click="del(scope.row)" v-if="canDel"
:disabled="!canDel ||scope.row.adminStatus === 0 || scope.row.account === adminData.account">
删除 删除
</el-button> </el-button>
</template> </template>
@ -972,8 +985,8 @@ onMounted(async function () {
</el-table-column> </el-table-column>
<el-table-column prop="adminStatus" label="状态"> <el-table-column prop="adminStatus" label="状态">
<template #default="scope"> <template #default="scope">
<el-switch :model-value="scope.row.adminStatus" :active-value="1" :inactive-value="0" size="large"
:disabled="scope.row.account === adminData.account || statusLoading[scope.row.id]"
<el-switch :model-value="scope.row.adminStatus" :active-value="1" :inactive-value="0" size="large" v-if="change"
:disabled="!change || scope.row.account === adminData.account || statusLoading[scope.row.id]"
@change="(targetStatus) => showStatusConfirm(scope.row, targetStatus)" style=" @change="(targetStatus) => showStatusConfirm(scope.row, targetStatus)" style="
--el-switch-on-color: #13ce66; --el-switch-on-color: #13ce66;
--el-switch-off-color: #ff4949; --el-switch-off-color: #ff4949;

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

@ -111,6 +111,11 @@ const getRefund = async function () {
} }
// 退 // 退
const add = async function () { const add = async function () {
//
if (!findMenuById(menuTree.value, permissionMapping.addCoinRefund)) {
ElMessage.error('无此权限')
return
}
try { try {
if (addRefund.value.refundType === '商品退款') { if (addRefund.value.refundType === '商品退款') {
addRefund.value.type = 1 addRefund.value.type = 1
@ -497,7 +502,7 @@ onMounted(() =>{
</div> </div>
<el-button type="success" @click="cancel()" style="margin-left: 200px">重置</el-button> <el-button type="success" @click="cancel()" style="margin-left: 200px">重置</el-button>
<el-button type="primary" :disabled="addDisabled" @click="addBefore"> 提交</el-button>
<el-button type="primary" :disabled="addDisabled" @click="addBefore" v-if="findMenuById(menuTree.value,permissionMapping.addCoinRefund)"> 提交</el-button>
</el-form> </el-form>
</div> </div>
</div> </div>

726
src/views/refund/gold/addNewCoinRefund.vue

@ -1,726 +0,0 @@
<script setup>
import {onMounted, reactive, ref, watch} from "vue";
import {ElMessage} from "element-plus";
import moment from "moment";
import request from "@/util/http.js";
import Cookies from 'js-cookie';
import {useAdminStore} from "@/store/index.js";
import {storeToRefs} from "pinia";
import {WarnTriangleFilled} from "@element-plus/icons-vue";
import dayjs from "dayjs";
const adminStore = useAdminStore();
const { adminData, menuTree } = storeToRefs(adminStore);
const addDisabled = ref(false);
const user = ref({
jwcode: null,
name: "",
market: "",
historySumGold: null,
historyPermanentGold: null,
historyFreeGold: null,
historyTaskGold: null,
rechargeNum: null,
consumeNum: null,
firstRecharge: "",
nowPermanentGold: null,
nowFreeJune: null,
nowTaskGold: null,
nowFreeDecember: null,
nowFreeGold: null,
nowSumGold: null
});
const addConsume = ref({
jwcode: null,
goodsName: "金币退款",
sumGold: null,
freeGold: null,
permanentGold: null,
taskGold: null,
remark: "",
refundModel: null,
adminId: adminData.value.id,
adminName: adminData.value.adminName
});
const Ref = ref(null);
const rules = reactive({
jwcode: [
{ required: true, message: "请输入精网号", trigger: "blur" },
],
remark: [
{ required: true, message: "请输入备注", trigger: "blur" },
],
permanentGold: [
{ required: true, message: "请输入永久金币数", trigger: "blur" },
{
validator: (rule, value, callback) => {
if (value === null || value === undefined || !Number.isInteger(value) || value < 0) {
callback(new Error("永久金币必须为非负整数"));
} else {
callback();
}
},
trigger: "blur"
}
],
freeGold: [
{ required: true, message: "请输入免费金币数", trigger: "blur" },
{
validator: (rule, value, callback) => {
if (value === null || value === undefined || !Number.isInteger(value) || value < 0) {
callback(new Error("免费金币必须为非负整数"));
} else {
callback();
}
},
trigger: "blur"
}
],
taskGold: [
{ required: true, message: "请输入任务金币数", trigger: "blur" },
{
validator: (rule, value, callback) => {
if (value === null || value === undefined || !Number.isInteger(value) || value < 0) {
callback(new Error("任务金币必须为非负整数"));
} else {
callback();
}
},
trigger: "blur"
}
],
sumGold: [
{
validator: (rule, value, callback) => {
if ((value || 0) <= 0) {
callback(new Error("三类金币总数必须大于0"));
} else {
callback();
}
},
trigger: "blur"
}
]
});
// watch
watch(
() => [addConsume.value.freeGold, addConsume.value.permanentGold, addConsume.value.taskGold],
([free, permanent, task]) => {
const sum = (parseInt(free) || 0) + (parseInt(permanent) || 0) + (parseInt(task) || 0);
addConsume.value.sumGold = sum;
},
{ deep: true }
);
// sumGold > 0
function validateInputToFreeGold() {
if (!user.value.jwcode) {
ElMessage.warning("请先查询用户信息");
resetForm()
return false;
}
const { freeGold, permanentGold, taskGold, sumGold } = addConsume.value;
if(freeGold > user.value.nowFreeGold){
ElMessage.warning("该用户免费金币不足,请重新输入!");
addConsume.value.freeGold = null;
return
}
return true;
}
// sumGold > 0
function validateInputToPermanentGold() {
if (!user.value.jwcode) {
ElMessage.warning("请先查询用户信息");
resetForm()
return false;
}
const { freeGold, permanentGold, taskGold, sumGold } = addConsume.value;
if(permanentGold > user.value.nowPermanentGold){
ElMessage.warning("该用户永久金币不足,请重新输入!");
addConsume.value.permanentGold = null;
return
}
return true;
}
// sumGold > 0
function validateInputToTaskGold() {
if (!user.value.jwcode) {
ElMessage.warning("请先查询用户信息");
resetForm()
return false;
}
const { freeGold, permanentGold, taskGold, sumGold } = addConsume.value;
if(taskGold > user.value.nowTaskGold){
ElMessage.warning("该用户任务金币不足,请重新输入!");
addConsume.value.taskGold = null;
return
}
return true;
}
// sumGold > 0
function validateInputTOSumGold() {
if (!user.value.jwcode) {
ElMessage.warning("请先查询用户信息");
resetForm()
return false;
}
const { freeGold, permanentGold, taskGold, sumGold } = addConsume.value;
if (sumGold <= 0) {
ElMessage.warning("三类金币总数必须大于0");
resetForm()
return false;
}
return true;
}
//
const ConsumeDialogVisible = ref(false);
//
const ConsumeDialogVisiblehandleClose = () => {
ConsumeDialogVisible.value = false;
//
resetForm()
user.value = {}
};
``
// 使cookie
const ConsumeDialogVisibleContinue = () => {
ConsumeDialogVisible.value = false;
add();
};
const ConsumeDialogVisibleCancel = () => {
ConsumeDialogVisible.value = false
resetForm()
user.value = {}
};
//
//
const FirstConsumeDialogVisible = ref(false);
//
const FirstConsumeDialogVisiblehandleClose = () => {
FirstConsumeDialogVisible.value = false;
//
resetForm()
user.value = {}
};
//
const FirstConsumeDialogVisibleContinue = () => {
FirstConsumeDialogVisible.value = false;
add();
};
const FirstConsumeDialogVisibleCancel = () => {
FirstConsumeDialogVisible.value = false
resetForm()
user.value = {}
};
//
const goods = ref([]);
// cookie key
const WriteCookies = ref(null)
// cookie value
const WriteCookiesTime = ref(null)
// cookie key
const ReadCookies = ref(null)
// cookie value
const ReadCookiesTime = ref(null)
//
const add = async function () {
addDisabled.value = true;
try {
const result = await request({
url: "/consume/addRefund",
data: {
jwcode: addConsume.value.jwcode,
adminId: adminData.value.id,
sumGold: addConsume.value.sumGold *100 ,
freeGold: addConsume.value.freeGold *100 ,
taskGold: addConsume.value.taskGold *100 ,
permanentGold: addConsume.value.permanentGold *100 ,
remark: addConsume.value.remark,
adminName: adminData.value.adminName
}
});
// jwcode
// jwcode:permanentGold:freeGold
WriteCookies.value = `coinRefund:${addConsume.value.jwcode}:${addConsume.value.goodsName}`
//value
WriteCookiesTime.value = dayjs().format("YYYY-MM-DD HH:mm:ss");
// cookies,jwcodekeyvaluejwcode1
Cookies.set(WriteCookies.value, WriteCookiesTime.value, {
expires:
1, path: '/'
});
addDisabled.value = false;
if (result.code === 200) {
ElMessage.success("添加成功");
resetForm();
} else {
ElMessage.error(result.msg || "添加失败");
}
} catch (err) {
console.error(err);
ElMessage.error("添加失败,请检查网络");
addDisabled.value = false;
}
};
//
function resetForm() {
Ref.value.resetFields();
addConsume.value.sumGold = null;
addConsume.value.freeGold = null;
addConsume.value.permanentGold = null;
addConsume.value.taskGold = null;
addConsume.value.sumGold = null;
addConsume.value.remark = "";
addConsume.value.jwcode = null;
user.value = {
jwcode: null,
name: "",
market: "",
historySumGold: null,
historyPermanentGold: null,
historyFreeGold: null,
historyTaskGold: null,
rechargeNum: null,
consumeNum: null,
firstRecharge: "",
nowPermanentGold: null,
nowFreeJune: null,
nowTaskGold: null,
nowFreeDecember: null,
nowFreeGold: null,
nowSumGold: null
};
}
//
const getGoods = async function () {
try {
const result = await request({ url: "https://api.homilychart.com/live_mall/api/product/all" });
goods.value = result.data.map(item => ({ id: item.id, label: item.name, value: item.name }));
} catch (err) {
console.error(err);
}
}
//
const addBefore = () => {
Ref.value.validate(async (valid) => {
// cookie
if (!valid) {
ElMessage({
type: 'error',
message: '请检查输入内容'
});
return;
}
// sumGold > 0
if (!validateInputTOSumGold()) return;
ReadCookies.value = `coinRefund:${addConsume.value.jwcode}:${addConsume.value.goodsName}`
// cookie
const cookie = Cookies.get(ReadCookies.value)
console.log("cookie++++++++++++++++++++++", cookie)
console.log("time", WriteCookiesTime.value)
//
ReadCookiesTime.value = moment(cookie).format('YYYY-MM-DD HH:mm:ss')
console.log("cookie========", cookie)
if (cookie) {
ConsumeDialogVisible.value = true;
} else {
FirstConsumeDialogVisible.value = true;
}
});
};
//
const getUser = async function (jwcode) {
if (!jwcode || !/^\d{1,9}$/.test(jwcode)) {
ElMessage.warning("精网号不能为空或格式不正确");
return;
}
try {
const result = await request({ url: "/user/selectUser", data: { jwcode } });
if (result.code === 200 && result.data) {
user.value = { ...result.data };
ElMessage.success("查询成功");
} else {
ElMessage.warning(result.msg || "用户不存在");
}
} catch (err) {
console.error(err);
ElMessage.error("查询失败,请检查网络或精网号");
}
};
onMounted(async function () {
await getGoods();
});
</script>
<template>
<div class="father1">
<div class="left">
<el-form :model="addConsume" ref="Ref" :rules="rules" style="min-width: 420px;" class="add-form"
label-width="auto" label-position="right">
<el-form-item prop="jwcode" label="精网号" style="margin-top: 50px">
<el-input v-model="addConsume.jwcode" style="width: 200px;" />
<el-button type="primary" @click="getUser(addConsume.jwcode)" style="margin-left: 20px">查询
</el-button>
</el-form-item>
<el-form-item prop="goodsName" label="商品名称" >
<el-input v-model="addConsume.goodsName" disabled style="width: 120px" />
</el-form-item>
<!-- 三类金币可编辑 -->
<el-form-item prop="permanentGold" label="永久金币">
<el-input v-model.number="addConsume.permanentGold" style="width: 120px" @input="validateInputToPermanentGold()"/>
<p>&nbsp;&nbsp;</p>
</el-form-item>
<el-form-item prop="freeGold" label="免费金币">
<el-input v-model.number="addConsume.freeGold" style="width: 120px" @input="validateInputToFreeGold()" />
<p>&nbsp;&nbsp;</p>
</el-form-item>
<el-form-item prop="taskGold" label="任务金币">
<el-input v-model.number="addConsume.taskGold" style="width: 120px" @input="validateInputToTaskGold()" />
<p>&nbsp;&nbsp;</p>
</el-form-item>
<el-form-item prop="sumGold" label="消耗金币总数">
<el-input v-model.number="addConsume.sumGold" style="width: 120px" disabled />
</el-form-item>
<el-form-item prop="remark" label="备注">
<el-input v-model="addConsume.remark" style="width: 250px" :rows="4" maxlength="100" show-word-limit
type="textarea" />
</el-form-item>
<el-button type="success" @click="resetForm()" style="margin-left: 200px;margin-top:10px">重置</el-button>
<el-button type="primary" :disabled="addDisabled" @click="addBefore" style="margin-top:10px"> 提交</el-button>
</el-form>
</div>
<div class="right">
<!-- 客户信息栏 -->
<el-card v-if="user.jwcode" style="width: 800px; float: right" class="customer-info">
<el-form :model="user" label-width="auto" style="max-width: 1000px" label-position="left">
<el-text size="large" style="margin-left: 20px">客户信息</el-text>
<!-- 第一行姓名 + 历史金币 -->
<el-row style="margin-top: 20px">
<el-col :span="9">
<el-form-item label="姓名">
<p>{{ user.name }}</p>
</el-form-item>
</el-col>
<el-col :span="14">
<el-form-item label="当前金币总数" style="width: 500px">
<span style="color: #2fa1ff; margin-right: 5px" v-if="user.nowSumGold !== undefined">{{
user.nowSumGold
}}</span>
</el-form-item>
<!-- 金币详情独立显示 -->
<el-form-item style="margin-top: -23px"> <!-- 负边距减少间距 -->
<span style="color: #b1b1b1; margin-left: 0px" v-if="user.nowPermanentGold !== undefined">(永久金币:{{
user.nowPermanentGold
}};
免费金币:{{ user.nowFreeGold }};
任务金币:{{ user.nowTaskGold }})</span>
</el-form-item>
</el-col>
</el-row>
<!-- 第二行精网号 + 当前金币独立行 -->
<el-row>
<el-col :span="9">
<el-form-item label="精网号">
<p>{{ user.jwcode }}</p>
</el-form-item>
</el-col>
<el-col :span="14">
<el-form-item label="消费次数">
<p style="color: #2fa1ff">{{ user.consumeNum }} </p>
</el-form-item>
<el-form-item style="margin-top: -23px"> <!-- 负边距减少间距 -->
<p style="font-size: small; color: #b1b1b1">(仅统计2025-01-01后的数据)</p>
</el-form-item>
</el-col>
</el-row>
<!-- 第三行首次充值日期 + 充值次数 -->
<!-- <el-row >
<el-col :span="9">
<el-form-item label="首次充值日期">
<p v-if="user.firstRecharge">
{{ moment(user.firstRecharge).format('YYYY-MM-DD HH:mm:ss') }}
</p>
</el-form-item>
</el-col>
</el-row> -->
<!-- 第四行消费次数 + 所属门店 -->
<el-row>
<el-col :span="9">
<el-form-item label="所属门店">
<p>{{ user.market }}</p>
</el-form-item>
</el-col>
</el-row>
</el-form>
</el-card>
<el-dialog v-model="FirstConsumeDialogVisible" title="操作确认" :before-close="FirstConsumeDialogVisiblehandleClose"
:close-on-click-modal="false" width="480px">
<!-- 内容整体居中且收窄 -->
<div class="confirm-body">
<!-- 用户信息 -->
<div>
<div class="field-label">用户信息</div>
<el-input :model-value="user.jwcode + (user.name ? '' + user.name + '' : '')" disabled />
</div>
<!-- 活动名称 -->
<div class="field">
<div class="field-label">商品名称</div>
<el-input v-model="addConsume.goodsName" disabled />
</div>
<!--金币总数 -->
<div class="field">
<div class="field-label">金币总数</div>
<el-input v-model="addConsume.sumGold" disabled />
</div>
<!-- 金币详细信息同一行左右排列 -->
<el-row :gutter="20" class="coins-row">
<el-col :span="8">
<div class="field">
<div class="field-label">永久金币</div>
<el-input v-model="addConsume.permanentGold" disabled />
</div>
</el-col>
<el-col :span="8">
<div class="field">
<div class="field-label">免费金币</div>
<el-input v-model="addConsume.freeGold" disabled />
</div>
</el-col>
<el-col :span="8">
<div class="field">
<div class="field-label">任务金币</div>
<el-input v-model="addConsume.taskGold" disabled />
</div>
</el-col>
</el-row>
<div class="field">
<div class="field-label">备注</div>
<el-input v-model="addConsume.remark" disabled />
</div>
</div>
<!-- 底部按钮居中 -->
<template #footer>
<div class="dialog-footer-center">
<el-button @click="FirstConsumeDialogVisibleCancel"> </el-button>
<el-button type="primary" @click="FirstConsumeDialogVisibleContinue">确认退款</el-button>
</div>
</template>
</el-dialog>
<el-dialog v-model="ConsumeDialogVisible" title="操作确认" :before-close="ConsumeDialogVisiblehandleClose"
:close-on-click-modal="false" width="480px">
<!-- 内容整体居中且收窄 -->
<div class="confirm-body">
<!-- 用户信息 -->
<div>
<div class="field-label">用户信息</div>
<el-input :model-value="user.jwcode + (user.name ? '' + user.name + '' : '')" disabled />
</div>
<!-- 活动名称 -->
<div class="field">
<div class="field-label">商品名称</div>
<el-input v-model="addConsume.goodsName" disabled />
</div>
<!--金币总数 -->
<div class="field">
<div class="field-label">金币总数</div>
<el-input v-model="addConsume.sumGold" disabled />
</div>
<!-- 金币详细信息同一行左右排列 -->
<el-row :gutter="20" class="coins-row">
<el-col :span="8">
<div class="field">
<div class="field-label">永久金币</div>
<el-input v-model="addConsume.permanentGold" disabled />
</div>
</el-col>
<el-col :span="8">
<div class="field">
<div class="field-label">免费金币</div>
<el-input v-model="addConsume.freeGold" disabled />
</div>
</el-col>
<el-col :span="8">
<div class="field">
<div class="field-label">任务金币</div>
<el-input v-model="addConsume.taskGold" disabled />
</div>
</el-col>
</el-row>
<!-- 风险提示 -->
<div style="display: flex; align-items: center; margin-top: 20px;">
<el-icon :size="24" color="#FFD700">
<WarnTriangleFilled />
</el-icon>
<p>重复购买风险提示</p>
</div>
<!-- 记录 + 虚线分隔 -->
<div>
<el-divider border-style="dashed" />
<p>检测到该用户近期有相似退款记录</p>
· {{ ReadCookiesTime }} 退款 {{ addConsume.goodsName }}(操作人: {{ adminData.adminName }})
</div>
<div style="margin-top: 10px">
<p>是否继续操作</p>
</div>
</div>
<!-- 底部按钮居中 -->
<template #footer>
<div class="dialog-footer-center">
<el-button @click="ConsumeDialogVisibleCancel"> </el-button>
<el-button type="primary" @click="ConsumeDialogVisibleContinue">确认退款</el-button>
</div>
</template>
</el-dialog>
</div>
</div>
</template>
<style scoped lang="scss">
p {
margin: 0px;
}
/* 上传图片的格式 */
.avatar-uploader .avatar {
width: 50px;
height: 50px;
display: block;
}
.add-form {
width: 400px;
float: left;
}
/* 标题居中 */
.el-dialog__header {
text-align: center;
}
.confirm-body {
width: 350px;
margin: 0 auto;
}
/* 字段块与标签样式 */
.field {
margin-bottom: 14px;
}
.field-label {
font-size: 14px;
color: #606266;
margin-bottom: 6px;
}
/* 金币行紧凑 */
.coins-row .field {
margin-bottom: 0;
}
/* 底部按钮居中 */
.dialog-footer-center {
display: flex;
justify-content: center;
gap: 12px;
}
.father1 {
width: 82vw;
height: 80vh;
display: flex;
.left {
width: 500px;
float: left;
display: flex;
}
.right {
flex: 1;
height: 50vh;
display: flex;
align-items: center;
.customer-info {
width: 300px;
margin-left: 20px;
display: flex;
justify-content: center;
align-items: center;
}
}
}
</style>

12
src/views/refund/gold/coinRefund.vue

@ -3,12 +3,12 @@
<!-- 这里放置标签切换的按钮 --> <!-- 这里放置标签切换的按钮 -->
<el-button-group> <el-button-group>
<el-button :type="activeTab === 'coinRefundDetail' ? 'primary' : 'default'" <el-button :type="activeTab === 'coinRefundDetail' ? 'primary' : 'default'"
@click="navigateTo('coinRefundDetail')" :disabled="!hasDetail">
@click="navigateTo('coinRefundDetail')" :disabled="!hasDetail" v-if="hasDetail">
金币退款明细 金币退款明细
</el-button> </el-button>
<!-- 切换后状态显示 primary 样式否则是默认样式 --> <!-- 切换后状态显示 primary 样式否则是默认样式 -->
<el-button :type="activeTab === 'addCoinRefund' ? 'primary' : 'default'" @click="navigateTo('addCoinRefund')" <el-button :type="activeTab === 'addCoinRefund' ? 'primary' : 'default'" @click="navigateTo('addCoinRefund')"
:disabled="!hasAdd">
:disabled="!hasAdd" v-if="hasAdd">
新增退款 新增退款
</el-button> </el-button>
</el-button-group> </el-button-group>
@ -45,8 +45,8 @@ const navigateTo = (name) => {
const initPermissions = () => { const initPermissions = () => {
if (!menuTree.value || !menuTree.value.length) return; if (!menuTree.value || !menuTree.value.length) return;
hasAdd.value = hasMenuPermission(menuTree.value, permissionMapping.Submit_Gold_Coin_Refund);
hasDetail.value = hasMenuPermission(menuTree.value, permissionMapping.View_Gold_Coin_Refund_Details);
hasAdd.value = hasMenuPermission(menuTree.value, permissionMapping.addCoinRefund);
hasDetail.value = hasMenuPermission(menuTree.value, permissionMapping.coinRefundDetail);
}; };
// //
@ -54,7 +54,7 @@ const getDefaultAuditRoute = () => {
initPermissions(); initPermissions();
if (hasDetail.value) return 'coinRefundDetail'; if (hasDetail.value) return 'coinRefundDetail';
if (hasAdd.value) return 'addCoinRefund'; if (hasAdd.value) return 'addCoinRefund';
return 'addCoinRefund';
return 'coinRefundDetail';
}; };
// //
@ -77,7 +77,7 @@ onMounted(() => {
navigateTo(defaultRoute); navigateTo(defaultRoute);
} else { } else {
// //
if (route.name === 'addCoinRefund' || route.name === 'coinRefundDetail') {
if (route.name === 'coinRefundDetail' || route.name === 'addCoinRefund') {
activeTab.value = route.name; activeTab.value = route.name;
} }
} }

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

@ -6,10 +6,15 @@ 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 { reverseMarketMapping } from "@/utils/marketMap.js"; import { reverseMarketMapping } from "@/utils/marketMap.js";
import { useAdminStore } from "@/store/index.js";
import { storeToRefs } from "pinia";
import { findMenuById, permissionMapping } from "@/utils/menuTreePermission.js"
import dayjs from "dayjs"; import dayjs from "dayjs";
const adminStore = useAdminStore();
const { adminData, menuTree } = storeToRefs(adminStore);
const showEmployeeData = ref(false) const showEmployeeData = ref(false)
const canLook = findMenuById(menuTree.value,permissionMapping.coinRefundDetail)
const defaultTime = [ const defaultTime = [
new Date(2000, 1, 1, 0, 0, 0), new Date(2000, 1, 1, 0, 0, 0),
@ -48,18 +53,6 @@ const activeTimeRange = ref('')
const handleDatePickerChange = () => { const handleDatePickerChange = () => {
activeTimeRange.value = '' activeTimeRange.value = ''
} }
const adminData = ref({})
const getAdminData = async function () {
try {
const result = await API({ url: '/admin/userinfo', data: {} })
adminData.value = result
console.log('请求成功', result)
console.log('用户信息', adminData.value)
} catch (error) {
console.log('请求失败', error)
}
}
// //
const tableData = ref([]) const tableData = ref([])
// ====================================== // ======================================
@ -121,6 +114,10 @@ const getRefundTypes = async function () {
// ============================================================== // ==============================================================
// //
const getSelectBy = async function (val) { const getSelectBy = async function (val) {
if (!findMenuById(menuTree.value, permissionMapping.coinRefundDetail)) {
ElMessage.error('无此权限')
return
}
try { try {
// //
if (typeof val === 'number') { if (typeof val === 'number') {
@ -312,7 +309,7 @@ const getGoods = async function () {
// //
onMounted(async function () { onMounted(async function () {
await getAdminData()
console.log('=======',adminData.value)
await getSelectBy() await getSelectBy()
await getMarket() await getMarket()
await getRefundTypes() await getRefundTypes()
@ -547,7 +544,7 @@ const getMarket = async function () {
</el-button> </el-button>
<el-button type="success" @click="reset()">重置</el-button> <el-button type="success" @click="reset()">重置</el-button>
<el-button type="primary" @click="search()">查询</el-button>
<el-button type="primary" @click="search()" v-if="canLook">查询</el-button>
<el-button type="primary" @click="exportExcel">导出Excel</el-button> <el-button type="primary" @click="exportExcel">导出Excel</el-button>
<el-button type="primary" @click="openExportList">查看导出列表</el-button> <el-button type="primary" @click="openExportList">查看导出列表</el-button>
</div> </div>

9
src/views/usergold/bean/userbean.vue

@ -74,7 +74,6 @@ const pagination = ref({
total: 0 total: 0
}) })
const get = async function () { const get = async function () {
if(findMenuById(menuTree.value, permissionMapping.View_Golden_Bean_Balance)){
try { try {
trim() trim()
if(searchObj.value.jwcode){ if(searchObj.value.jwcode){
@ -105,12 +104,9 @@ const get = async function () {
} catch (error) { } catch (error) {
console.log(error) console.log(error)
} }
}else{
ElMessage.error('无此权限')
}
} }
const getStats = async () => { const getStats = async () => {
if (findMenuById(menuTree.value, permissionMapping.View_Golden_Bean_Balance)) {
try { try {
const params = { const params = {
beanUser:{ beanUser:{
@ -131,9 +127,6 @@ const getStats = async () => {
} catch (error) { } catch (error) {
console.log('请求失败', error) console.log('请求失败', error)
} }
}else{
ElMessage.error('无此权限')
}
} }
const handleSortChange = (column) => { const handleSortChange = (column) => {
if (column.prop === 'beanNum') { if (column.prop === 'beanNum') {

8
src/views/usergold/gold/clientCount.vue

@ -6,14 +6,14 @@
<el-button <el-button
:type="activeTab === 'clientCountDetail' ? 'primary' : 'default'" :type="activeTab === 'clientCountDetail' ? 'primary' : 'default'"
@click="navigateTo('clientCountDetail')" @click="navigateTo('clientCountDetail')"
:disabled="!hasDetail"
:disabled="!hasDetail" v-if="hasDetail"
> >
金币明细 金币明细
</el-button> </el-button>
<el-button <el-button
:type="activeTab === 'clientCountBalance' ? 'primary' : 'default'" :type="activeTab === 'clientCountBalance' ? 'primary' : 'default'"
@click="navigateTo('clientCountBalance')" @click="navigateTo('clientCountBalance')"
:disabled="!hasBalance"
:disabled="!hasBalance" v-if="hasBalance"
> >
金币余额 金币余额
</el-button> </el-button>
@ -51,8 +51,8 @@ const navigateTo = (name) => {
const initPermissions = () => { const initPermissions = () => {
if (!menuTree.value || !menuTree.value.length) return; if (!menuTree.value || !menuTree.value.length) return;
hasDetail.value = hasMenuPermission(menuTree.value, permissionMapping.View_Gold_Coin_Details);
hasBalance.value = hasMenuPermission(menuTree.value, permissionMapping.View_Gold_Coin_Balance);
hasDetail.value = hasMenuPermission(menuTree.value, permissionMapping.coinCustomerDetail);
hasBalance.value = hasMenuPermission(menuTree.value, permissionMapping.coinCustomerMoney);
}; };
// //

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

@ -1,5 +1,10 @@
<script setup> <script setup>
// //
import { useAdminStore } from "@/store/index.js"
import { storeToRefs } from "pinia"
import { findMenuById, permissionMapping } from "@/utils/menuTreePermission.js"
const adminStore = useAdminStore()
const { adminData, menuTree } = storeToRefs(adminStore)
import {onMounted, ref} from 'vue' import {onMounted, ref} from 'vue'
import {ElMessage} from 'element-plus' import {ElMessage} from 'element-plus'
import moment from 'moment' import moment from 'moment'
@ -11,19 +16,7 @@ const showEmployeeData = ref(false)
// //
//
const adminData = ref({})
const dialogVisible = ref(false) const dialogVisible = ref(false)
const getAdminData = async function () {
try {
const result = await API({url: '/admin/userinfo', data: {}})
adminData.value = result
// console.log('', result)
console.log('管理员用户信息', adminData.value)
} catch (error) {
console.log('请求失败', error)
}
}
// //
const isLoadingmarket = ref(false); const isLoadingmarket = ref(false);
@ -72,6 +65,10 @@ const sortOrder = ref('')
// =========================================================================== // ===========================================================================
// //
const get = async function (val) { const get = async function (val) {
if(!findMenuById(menuTree.value, permissionMapping.coinCustomerMoney)){
ElMessage.error('无此权限')
return
}
try { try {
// //
if (typeof val === 'number') { if (typeof val === 'number') {
@ -228,7 +225,6 @@ const handleSortChange = (column) => {
// //
onMounted(async function () { onMounted(async function () {
await getAdminData()
await get() await get()
await getMarket() await getMarket()
await getExportList() await getExportList()

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

@ -6,7 +6,11 @@ import moment from 'moment'
import API from '@/util/http.js' import API from '@/util/http.js'
import {reverseMarketMapping} from "../../../utils/marketMap.js"; import {reverseMarketMapping} from "../../../utils/marketMap.js";
import dayjs from "dayjs"; import dayjs from "dayjs";
import { useAdminStore } from "@/store/index.js"
import { storeToRefs } from "pinia"
import { findMenuById, permissionMapping } from "@/utils/menuTreePermission.js"
const adminStore = useAdminStore()
const { adminData, menuTree } = storeToRefs(adminStore)
// //
const showEmployeeData = ref(false) const showEmployeeData = ref(false)
@ -29,18 +33,6 @@ const totalTaskGold = ref(0)
const totalGoldTotal = ref(0) const totalGoldTotal = ref(0)
// //
const adminData = ref({})
const getAdminData = async function () {
try {
const result = await API({url: '/admin/userinfo', data: {}})
adminData.value = result
console.log('请求成功', result)
console.log('管理员用户信息', adminData.value)
} catch (error) {
console.log('请求失败', error)
}
}
// goldDetail jwcode // goldDetail jwcode
const trimJwCode = () => { const trimJwCode = () => {
if (goldDetail.value.jwcode) { if (goldDetail.value.jwcode) {
@ -128,6 +120,10 @@ const getObj = ref({
// =========================================================================== // ===========================================================================
// //
const get = async function (val) { const get = async function (val) {
if(!findMenuById(menuTree.value, permissionMapping.coinCustomerDetail)){
ElMessage.error('无此权限')
return
}
try { try {
// //
if (typeof val === 'number') { if (typeof val === 'number') {
@ -174,18 +170,6 @@ const get = async function (val) {
console.log('响应数据', result) console.log('响应数据', result)
tableData.value = result.data.list tableData.value = result.data.list
total.value = result.data.total total.value = result.data.total
//
// permanentGold.value = tableData.value.reduce((total, row) => {
// return total + (Number(row.permanentGold) || 0);
// }, 0);
// taskGold.value = tableData.value.reduce((total, row) => {
// return total + (Number(row.taskGold) || 0);
// }, 0);
//6+12
const totalResult = await API({ const totalResult = await API({
url: '/goldDetail/getTotal', url: '/goldDetail/getTotal',
method: 'post', method: 'post',
@ -278,28 +262,12 @@ const get7Days = function () {
search() search()
} }
// //
// const sumGoldTotal = computed(() => {
// return tableData.value.reduce((total, row) => {
// return total + (Number(row.sumGold) || 0);
// }, 0);
// });
// 6+12 // 6+12
const calculateFreeGold = (row) => { const calculateFreeGold = (row) => {
const freeJune = row.freeJune || 0; const freeJune = row.freeJune || 0;
const freeDecember = row.freeDecember || 0; const freeDecember = row.freeDecember || 0;
return (freeJune + freeDecember); return (freeJune + freeDecember);
};
//
// const totalFreeGold = computed(() => {
// return tableData.value.reduce((total, row) => {
// return total + calculateFreeGold(row);
// }, 0);
// });
}
// //
const sortField = ref('') const sortField = ref('')
const sortOrder = ref('') const sortOrder = ref('')
@ -355,7 +323,6 @@ const handleCurrentChange = function (val) {
// //
onMounted(async function () { onMounted(async function () {
await getAdminData()
await get() await get()
await getMarket() await getMarket()

Loading…
Cancel
Save