From d99dec79d983779f49a45d46a41da73237cddae5 Mon Sep 17 00:00:00 2001 From: XingQue Date: Fri, 17 Jul 2026 02:54:27 +0800 Subject: [PATCH] =?UTF-8?q?=E7=AE=A1=E7=90=86=E5=91=98=E7=AE=A1=E7=90=86?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=93=8D=E4=BD=9C=E6=97=A5=E5=BF=97=E6=9F=A5?= =?UTF-8?q?=E7=9C=8B=EF=BC=8C=E5=AF=B9=E6=8E=A5=20/houtai/hqczrz=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Cursor --- src/views/admin/AdminUser.vue | 172 +++++++++++++++++++++++++++++++++- 1 file changed, 170 insertions(+), 2 deletions(-) diff --git a/src/views/admin/AdminUser.vue b/src/views/admin/AdminUser.vue index ddfa5bf..5449ed2 100644 --- a/src/views/admin/AdminUser.vue +++ b/src/views/admin/AdminUser.vue @@ -67,11 +67,19 @@ + + + - + @@ -205,7 +213,12 @@
- + 确认添加 + + + +
+ + + + + + + + + + + 搜索 +
+ + + + + + + + + + +
@@ -308,6 +372,91 @@ const newUserForm = 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 () => { @@ -481,6 +630,10 @@ const confirmAddUser = async () => { ElMessage.warning('请填写完整信息') return } + if (String(newUserForm.value.phone).trim().length > 11) { + ElMessage.warning('账号最长11位,请使用手机号') + return + } if (newUserForm.value.password.length < 6 || newUserForm.value.erjimima.length < 6) { ElMessage.warning('密码和二级密码至少6位') return @@ -680,4 +833,19 @@ onMounted(async () => { color: rgba(255,255,255,0.5); 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; +} \ No newline at end of file