细节优化——1

This commit is contained in:
Cheng Zhou
2025-12-30 14:07:57 +08:00
parent 71db309e12
commit 0c1fc49f17
40 changed files with 1610 additions and 389 deletions
+13 -1
View File
@@ -14,7 +14,7 @@
<el-input v-model="form.password" type="password" show-password :placeholder="user ? '留空则不修改密码' : '请输入初始密码'" />
</el-form-item>
<el-form-item v-if="user" label="账号状态" prop="is_active">
<el-switch v-model="form.is_active" active-text="启用" inactive-text="禁用" />
<el-switch v-model="form.is_active" active-text="启用" inactive-text="禁用" :disabled="isLastAdmin" />
</el-form-item>
</el-form>
<template #footer>
@@ -33,6 +33,7 @@ import type { UserInfo } from "../../types/api";
const props = defineProps<{
visible: boolean;
user?: UserInfo | null;
adminCount?: number;
}>();
const emit = defineEmits<{
@@ -86,6 +87,13 @@ const resetForm = () => {
form.is_active = true;
};
const isLastAdmin = computed(() => {
if (!props.user) return false;
if (props.user.role !== "ADMIN") return false;
if ((props.adminCount || 0) > 1) return false;
return form.is_active;
});
watch(
() => props.visible,
(val) => {
@@ -104,6 +112,10 @@ watch(
const onSubmit = async () => {
if (!formRef.value) return;
await formRef.value.validate();
if (props.user?.role === "ADMIN" && (props.adminCount || 0) <= 1 && !form.is_active) {
ElMessage.warning("至少保留一个管理员账号,不能禁用该账号");
return;
}
submitting.value = true;
try {
if (props.user) {
+16 -2
View File
@@ -29,6 +29,7 @@
link
:type="scope.row.status === 'ACTIVE' ? 'danger' : 'primary'"
size="small"
:disabled="isLastAdmin(scope.row)"
@click="toggleStatus(scope.row)"
>
{{ scope.row.status === 'ACTIVE' ? "禁用" : "启用" }}
@@ -57,7 +58,7 @@
/>
</div>
</el-card>
<UserForm v-model:visible="formVisible" :user="editingUser" @saved="loadUsers" />
<UserForm v-model:visible="formVisible" :user="editingUser" :admin-count="activeAdminCount" @saved="loadUsers" />
<UserResetPassword v-model:visible="resetVisible" :user="resetUser" @reset="loadUsers" />
</div>
</template>
@@ -77,6 +78,7 @@ const total = ref(0);
const page = ref(1);
const pageSize = ref(10);
const loading = ref(false);
const activeAdminCount = ref(0);
const formVisible = ref(false);
const resetVisible = ref(false);
const editingUser = ref<UserInfo | null>(null);
@@ -86,10 +88,15 @@ const auth = useAuthStore();
const loadUsers = async () => {
loading.value = true;
try {
const { data } = await fetchUsers({ skip: (page.value - 1) * pageSize.value, limit: pageSize.value });
const [{ data }, { data: adminData }] = await Promise.all([
fetchUsers({ skip: (page.value - 1) * pageSize.value, limit: pageSize.value }),
fetchUsers({ skip: 0, limit: 10000 }),
]);
const items = (data as any).items || [];
const allItems = (adminData as any).items || [];
users.value = items;
total.value = (data as any).total || items.length;
activeAdminCount.value = allItems.filter((u: UserInfo) => u.role === "ADMIN" && u.status === "ACTIVE").length;
} catch (e: any) {
ElMessage.error(e?.response?.data?.message || "用户列表加载失败");
} finally {
@@ -108,6 +115,10 @@ const openEdit = (row: UserInfo) => {
};
const toggleStatus = async (row: UserInfo) => {
if (isLastAdmin(row)) {
ElMessage.warning("至少保留一个管理员账号,不能禁用该账号");
return;
}
const disable = row.status === "ACTIVE";
const ok = await ElMessageBox.confirm(
disable ? "该操作将影响用户账号,请确认是否继续" : "确认启用该用户账号?",
@@ -192,6 +203,9 @@ const statusLabel = (status: string) => {
return status || "未知";
}
};
const isLastAdmin = (row: UserInfo) =>
row.role === "ADMIN" && row.status === "ACTIVE" && activeAdminCount.value <= 1;
</script>
<style scoped>