修复bug

This commit is contained in:
2026-07-31 15:34:22 +08:00
parent 151d76f77c
commit be7675954a
25 changed files with 224 additions and 204 deletions
+16 -5
View File
@@ -12,6 +12,7 @@ const statusFilter = ref<TenantRecordStatus | ''>('')
const editorOpen = ref(false)
const editingId = ref('')
const loading = ref(false)
const loadError = ref('')
const saving = ref(false)
const form = reactive({ name: '', account: '', password: '', phone: '', email: '', roleIds: [] as string[] })
@@ -21,16 +22,19 @@ const filteredMembers = computed(() => store.members.filter((member) => {
return matchesKeyword && (!statusFilter.value || member.status === statusFilter.value)
}))
onMounted(async () => {
async function loadMembers() {
loading.value = true
loadError.value = ''
try {
await Promise.all([store.loadRoles(), store.loadMembers()])
} catch (error) {
ElMessage.error(error instanceof Error ? error.message : '企业成员加载失败')
loadError.value = error instanceof Error ? error.message : '企业成员加载失败'
} finally {
loading.value = false
}
})
}
onMounted(() => void loadMembers())
function resetForm() {
editingId.value = ''
@@ -116,7 +120,11 @@ function clearFilters() {
<template>
<section v-loading="loading" class="members-page">
<div v-if="store.membersLoadedFromApi" class="member-contract-notice client-card">成员资料、角色回显、新增、编辑、启停和密码重置均使用当前企业的真实接口;企业所有者保护和租户隔离由服务端最终校验。</div>
<div v-if="loadError" class="client-card collection-load-error" role="alert">
<div><strong>企业成员加载失败</strong><span>{{ loadError }}</span></div>
<el-button :loading="loading" @click="loadMembers">重新加载</el-button>
</div>
<template v-else>
<div class="member-metrics">
<article><UserCheck :size="20" /><div><span>成员总数</span><strong>{{ store.members.length }}</strong></div></article>
<article><ShieldCheck :size="20" /><div><span>正常成员</span><strong>{{ store.activeMemberCount }}</strong></div></article>
@@ -164,12 +172,15 @@ function clearFilters() {
</el-form>
<template #footer><div class="drawer-actions"><el-button :disabled="saving" @click="editorOpen = false">取消</el-button><el-button type="primary" :loading="saving" @click="saveMember">保存</el-button></div></template>
</el-drawer>
</template>
</section>
</template>
<style scoped>
.members-page { display: flex; flex-direction: column; gap: 14px; }
.member-contract-notice { padding: 13px 16px; border-left: 3px solid #d97706; background: #fff8eb; color: #8a5b10; font-size: 11px; line-height: 1.6; }
.collection-load-error { display: flex; min-height: 150px; align-items: center; justify-content: center; gap: 20px; }
.collection-load-error > div { display: flex; max-width: 520px; flex-direction: column; gap: 6px; }
.collection-load-error span { color: var(--muted); font-size: 12px; line-height: 1.6; }
.member-metrics { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 14px; }
.member-metrics article { display: flex; align-items: center; gap: 14px; padding: 18px 20px; border: 1px solid var(--border); background: #fff; color: var(--primary); }
.member-metrics article div { display: flex; flex-direction: column; gap: 2px; }