import { onMounted, reactive, ref } from 'vue' import { ElMessage, ElMessageBox } from 'element-plus' import { createAdminUserApi, deleteAdminUserApi, pageAdminUsersApi, resetAdminUserPasswordApi, updateAdminUserApi, updateAdminUserStatusApi } from '@/api/admin/user' import { listRolesApi } from '@/api/admin/role' export function useAdminUsers() { const roles = ref([]) const users = ref([]) const total = ref(0) const loading = ref(false) const keyword = ref('') const roleFilter = ref(undefined) const currentPage = ref(1) const pageSize = ref(10) const dialogVisible = ref(false) const saving = ref(false) const editingId = ref(null) const form = reactive({ username: '', password: '', name: '', roleId: undefined, ipWhitelist: '', status: 1 }) async function loadRoles() { const res = await listRolesApi() roles.value = res.data || [] } async function load() { loading.value = true try { const res = await pageAdminUsersApi({ pageIndex: currentPage.value, pageSize: pageSize.value, username: keyword.value.trim() || undefined, roleId: roleFilter.value }) users.value = res.data?.list || [] total.value = res.data?.total || 0 } finally { loading.value = false } } function queryUsers() { currentPage.value = 1 load() } function handleSizeChange() { currentPage.value = 1 load() } function openCreate() { editingId.value = null Object.assign(form, { username: '', password: '', name: '', roleId: undefined, ipWhitelist: '', status: 1 }) dialogVisible.value = true } function openEdit(row) { editingId.value = row.id Object.assign(form, { username: row.username, password: '', name: row.name, roleId: row.roleId || undefined, ipWhitelist: row.ipWhitelist === '不限' ? '' : row.ipWhitelist, status: row.status }) dialogVisible.value = true } async function saveUser() { if (!form.name.trim()) return ElMessage.warning('请填写姓名') if (!form.roleId) return ElMessage.warning('请选择权限角色') if (!editingId.value) { if (!form.username.trim()) return ElMessage.warning('请填写登录账号') if (!form.password || form.password.length < 6) { return ElMessage.warning('初始密码不能少于 6 位') } } const payload = { name: form.name.trim(), roleId: form.roleId, ipWhitelist: form.ipWhitelist.trim(), status: form.status } saving.value = true try { if (editingId.value) { await updateAdminUserApi(editingId.value, payload) ElMessage.success('管理员已更新') } else { await createAdminUserApi({ ...payload, username: form.username.trim(), password: form.password }) ElMessage.success('管理员已添加') currentPage.value = 1 } dialogVisible.value = false await load() } finally { saving.value = false } } async function toggleStatus(row) { const next = row.status === 1 ? 0 : 1 await updateAdminUserStatusApi(row.id, next) ElMessage.success(next === 1 ? '账号已启用' : '账号已停用') await load() } async function removeUser(row) { try { await ElMessageBox.confirm(`确定删除管理员「${row.name}」吗?`, '删除确认', { confirmButtonText: '确认删除', cancelButtonText: '取消', type: 'warning', confirmButtonClass: 'el-button--danger' }) } catch { return } await deleteAdminUserApi(row.id) ElMessage.success('管理员已删除') if (users.value.length === 1 && currentPage.value > 1) currentPage.value -= 1 await load() } async function resetPassword(row) { let password = '' try { const { value } = await ElMessageBox.prompt( `为「${row.username}」设置新密码(至少 6 位)`, '重置密码', { confirmButtonText: '确认重置', cancelButtonText: '取消', inputPlaceholder: '请输入新密码', inputValidator: (val) => (val && val.length >= 6 ? true : '密码不能少于 6 位') } ) password = value } catch { return } await resetAdminUserPasswordApi(row.id, password) ElMessage.success('密码已重置') } onMounted(async () => { await loadRoles() await load() }) return { roles, keyword, roleFilter, currentPage, pageSize, loading, total, dialogVisible, saving, editingId, form, users, load, queryUsers, handleSizeChange, openCreate, openEdit, saveUser, toggleStatus, removeUser, resetPassword } }