From edaaf4d469ca95f2756e2d12efeb5c0781656c3b Mon Sep 17 00:00:00 2001 From: "fengchuanhn@gmail.com" Date: Fri, 22 May 2026 14:59:31 +0800 Subject: [PATCH] 1 --- src/api/adminUsers.js | 7 +++++ src/views/admin/AdminUsersView.vue | 44 +++++++++++++++++++++++++++++- 2 files changed, 50 insertions(+), 1 deletion(-) diff --git a/src/api/adminUsers.js b/src/api/adminUsers.js index df3bc2e..b4b92e6 100644 --- a/src/api/adminUsers.js +++ b/src/api/adminUsers.js @@ -70,3 +70,10 @@ export function deleteAdminUserApi(token, userId) { method: "DELETE", }); } + +/** 管理员解绑用户设备(清空 device_serial) */ +export function clearAdminUserDeviceSerialApi(token, userId) { + return adminRequest(token, `/admin/users/${userId}/clear-device-serial`, { + method: "POST", + }); +} diff --git a/src/views/admin/AdminUsersView.vue b/src/views/admin/AdminUsersView.vue index 5c8e7b3..ce76239 100644 --- a/src/views/admin/AdminUsersView.vue +++ b/src/views/admin/AdminUsersView.vue @@ -6,6 +6,7 @@ import { createAdminUserApi, updateAdminUserApi, deleteAdminUserApi, + clearAdminUserDeviceSerialApi, } from "../../api/adminUsers.js"; const auth = useAuthStore(); @@ -235,6 +236,31 @@ async function saveUser() { await loadUsers(); } +function deviceBindLabel(row) { + return row.device_serial?.trim() ? "已绑定" : "未绑定"; +} + +async function clearDeviceSerial(row) { + if (!row.device_serial?.trim()) { + showMessage("warn", "该用户未绑定设备"); + return; + } + + const ok = window.confirm( + `确定解绑用户「${row.username}」的设备?解绑后可在其它电脑重新绑定登录。`, + ); + if (!ok) return; + + const res = await clearAdminUserDeviceSerialApi(auth.token, row.id); + if (!res.ok) { + showMessage("error", res.message || "解绑失败"); + return; + } + + showMessage("success", res.message || "设备已解绑"); + await loadUsers(); +} + async function removeUser(row) { if (row.id === auth.currentUser?.id) { showMessage("warn", "不能删除当前登录账号"); @@ -352,6 +378,14 @@ onMounted(async () => { {{ ownerLabel(data.agent_id) }} + + + - +