管理员管理增加操作日志查看,对接 /houtai/hqczrz。
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -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>
|
||||||
Reference in New Issue
Block a user