管理员管理增加操作日志查看,对接 /houtai/hqczrz。

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
XingQue
2026-07-17 02:54:27 +08:00
parent 984ea7d230
commit d99dec79d9

View File

@@ -67,11 +67,19 @@
</el-tag> </el-tag>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column prop="jilushuliang" label="操作记录" width="100">
<template #default="{ row }">
<el-button type="primary" link @click="openLogDialog(row)">
{{ row.jilushuliang ?? 0 }}
</el-button>
</template>
</el-table-column>
<el-table-column prop="create_time" label="创建时间" width="160" /> <el-table-column prop="create_time" label="创建时间" width="160" />
<el-table-column prop="update_time" label="更新时间" width="160" /> <el-table-column prop="update_time" label="更新时间" width="160" />
<el-table-column label="操作" width="120" fixed="right"> <el-table-column label="操作" width="180" fixed="right">
<template #default="{ row }"> <template #default="{ row }">
<el-button type="primary" link @click="openDetailDialog(row)">详情</el-button> <el-button type="primary" link @click="openDetailDialog(row)">详情</el-button>
<el-button type="warning" link @click="openLogDialog(row)">操作日志</el-button>
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
@@ -205,7 +213,12 @@
<div class="dialog-content"> <div class="dialog-content">
<el-form :model="newUserForm" label-width="100px" ref="addUserFormRef"> <el-form :model="newUserForm" label-width="100px" ref="addUserFormRef">
<el-form-item label="账号" required> <el-form-item label="账号" required>
<el-input v-model="newUserForm.phone" placeholder="手机号" /> <el-input
v-model="newUserForm.phone"
placeholder="11位手机号"
maxlength="11"
show-word-limit
/>
</el-form-item> </el-form-item>
<el-form-item label="密码" required> <el-form-item label="密码" required>
<el-input <el-input
@@ -248,6 +261,57 @@
<el-button type="primary" @click="confirmAddUser">确认添加</el-button> <el-button type="primary" @click="confirmAddUser">确认添加</el-button>
</template> </template>
</el-dialog> </el-dialog>
<!-- 操作日志弹窗 -->
<el-dialog
v-model="logDialogVisible"
:title="`操作日志 - ${logTargetUser?.nicheng || ''}${logTargetUser?.phone || ''}`"
width="920px"
class="user-dialog log-dialog"
destroy-on-close
>
<div class="log-filters">
<el-select v-model="logFilters.leixing" placeholder="用户类型" clearable style="width: 140px" @change="fetchLogList(1)">
<el-option label="全部类型" value="" />
<el-option label="打手" :value="2" />
<el-option label="管事" :value="3" />
<el-option label="商家" :value="4" />
<el-option label="组长" :value="5" />
<el-option label="后台账号" :value="9" />
<el-option label="系统配置" :value="0" />
</el-select>
<el-input
v-model="logFilters.yonghuid"
placeholder="被操作用户ID"
clearable
style="width: 160px"
@keyup.enter="fetchLogList(1)"
/>
<el-button type="primary" @click="fetchLogList(1)">搜索</el-button>
</div>
<el-table :data="logList" v-loading="logLoading" border class="user-table" max-height="480">
<el-table-column prop="create_time" label="时间" width="170" />
<el-table-column prop="leixing_name" label="类型" width="90" />
<el-table-column prop="beixiugai_yonghuid" label="被操作用户" width="110" />
<el-table-column label="资金/数值变动" min-width="200">
<template #default="{ row }">
<div class="log-change">{{ formatLogChange(row) }}</div>
</template>
</el-table-column>
<el-table-column prop="qitashuoming" label="操作说明" min-width="240" show-overflow-tooltip />
</el-table>
<div class="pagination">
<el-pagination
v-model:current-page="logPage"
v-model:page-size="logPageSize"
:page-sizes="[10, 20, 50]"
:total="logTotal"
layout="total, sizes, prev, pager, next"
@size-change="fetchLogList()"
@current-change="fetchLogList()"
/>
</div>
</el-dialog>
</div> </div>
</template> </template>
@@ -308,6 +372,91 @@ const newUserForm = ref({
}) })
const newUserRoleCodes = ref([]) const newUserRoleCodes = ref([])
// 操作日志
const logDialogVisible = ref(false)
const logTargetUser = ref(null)
const logList = ref([])
const logLoading = ref(false)
const logPage = ref(1)
const logPageSize = ref(20)
const logTotal = ref(0)
const logFilters = ref({
leixing: '',
yonghuid: ''
})
const _changed = (before, after) => {
const b = Number(before)
const a = Number(after)
if (Number.isNaN(b) || Number.isNaN(a)) return false
return b !== a
}
const formatLogChange = (row) => {
const parts = []
if (_changed(row.dashou_yue_qian, row.dashou_yue_hou)) {
parts.push(`打手余额 ${row.dashou_yue_qian}${row.dashou_yue_hou}`)
}
if (_changed(row.dashou_jifen_qian, row.dashou_jifen_hou)) {
parts.push(`积分 ${row.dashou_jifen_qian}${row.dashou_jifen_hou}`)
}
if (_changed(row.dashou_yajin_qian, row.dashou_yajin_hou)) {
parts.push(`押金 ${row.dashou_yajin_qian}${row.dashou_yajin_hou}`)
}
if (_changed(row.shangjia_yue_qian, row.shangjia_yue_hou)) {
parts.push(`商家余额 ${row.shangjia_yue_qian}${row.shangjia_yue_hou}`)
}
if (_changed(row.guanshi_yue_qian, row.guanshi_yue_hou)) {
parts.push(`管事余额 ${row.guanshi_yue_qian}${row.guanshi_yue_hou}`)
}
if (_changed(row.zuzhang_yue_qian, row.zuzhang_yue_hou)) {
parts.push(`组长可提现 ${row.zuzhang_yue_qian}${row.zuzhang_yue_hou}`)
}
if (row.huiyuants) {
parts.push(`会员天数 ${row.huiyuants}${row.huiyuan_id ? `${row.huiyuan_id}` : ''}`)
}
return parts.length ? parts.join('\n') : '—'
}
const openLogDialog = (user) => {
logTargetUser.value = user
logFilters.value = { leixing: '', yonghuid: '' }
logPage.value = 1
logDialogVisible.value = true
fetchLogList(1)
}
const fetchLogList = async (pageOverride) => {
if (!logTargetUser.value?.phone) return
if (pageOverride) logPage.value = pageOverride
logLoading.value = true
try {
const payload = {
username,
phone: logTargetUser.value.phone,
page: logPage.value,
pageSize: logPageSize.value
}
if (logFilters.value.leixing !== '' && logFilters.value.leixing !== null && logFilters.value.leixing !== undefined) {
payload.leixing = logFilters.value.leixing
}
if (logFilters.value.yonghuid) {
payload.yonghuid = String(logFilters.value.yonghuid).trim()
}
const res = await request.post('/houtai/hqczrz', payload)
if (res.code === 0) {
logList.value = res.data.list || []
logTotal.value = res.data.total || 0
} else {
ElMessage.error(res.msg || '获取操作日志失败')
}
} catch (error) {
ElMessage.error('网络错误')
} finally {
logLoading.value = false
}
}
// ==================== 接口调用 ==================== // ==================== 接口调用 ====================
// 获取角色列表(第一个接口) // 获取角色列表(第一个接口)
const fetchRoleList = async () => { const fetchRoleList = async () => {
@@ -481,6 +630,10 @@ const confirmAddUser = async () => {
ElMessage.warning('请填写完整信息') ElMessage.warning('请填写完整信息')
return return
} }
if (String(newUserForm.value.phone).trim().length > 11) {
ElMessage.warning('账号最长11位请使用手机号')
return
}
if (newUserForm.value.password.length < 6 || newUserForm.value.erjimima.length < 6) { if (newUserForm.value.password.length < 6 || newUserForm.value.erjimima.length < 6) {
ElMessage.warning('密码和二级密码至少6位') ElMessage.warning('密码和二级密码至少6位')
return return
@@ -680,4 +833,19 @@ onMounted(async () => {
color: rgba(255,255,255,0.5); color: rgba(255,255,255,0.5);
margin-top: 4px; margin-top: 4px;
} }
.log-filters {
display: flex;
gap: 12px;
flex-wrap: wrap;
margin-bottom: 16px;
}
.log-change {
font-size: 13px;
line-height: 1.5;
color: #a8e6ff;
white-space: pre-line;
}
:deep(.log-dialog .el-dialog__body) {
padding-top: 10px;
}
</style> </style>