删除: - HmacUtil: deriveApiKey/deriveApiSecret/verifyMediabotPsk - HmacAuthInterceptor: apiSecret 验签/自动创建账户/readBody - AccountService: generateApiCredentials/registerByInterceptor - AccountDTO: apiKey 字段 - AuthController: register 返回 apiSecret - AdminController: generateApiKey 端点 - Users.vue: API Key 列/生成密钥弹窗 - api/index.js: genApiKey 认证方式简化为两种: Bearer Token → Web 管理后台 PSK 签名 → 外部集成客户端
115 lines
3.7 KiB
Vue
115 lines
3.7 KiB
Vue
<template>
|
|
<div>
|
|
<h2>用户管理</h2>
|
|
<el-card style="margin-top: 20px">
|
|
<el-table :data="users" v-loading="loading" stripe>
|
|
<el-table-column prop="id" label="ID" width="60" />
|
|
<el-table-column prop="email" label="邮箱" min-width="180" />
|
|
<el-table-column prop="displayName" label="昵称" width="120" />
|
|
<el-table-column prop="trustLevel" label="信任等级" width="90">
|
|
<template #default="scope">
|
|
<el-tag :type="trustLevelType(scope.row.trustLevel)">
|
|
{{ trustLevelLabel(scope.row.trustLevel) }}
|
|
</el-tag>
|
|
</template>
|
|
</el-table-column>
|
|
<el-table-column prop="isActive" label="状态" width="70">
|
|
<template #default="scope">
|
|
<el-tag :type="scope.row.isActive ? 'success' : 'danger'">
|
|
{{ scope.row.isActive ? '启用' : '禁用' }}
|
|
</el-tag>
|
|
</template>
|
|
</el-table-column>
|
|
<el-table-column prop="createdAt" label="注册时间" width="160" />
|
|
<el-table-column label="操作" width="120" fixed="right">
|
|
<template #default="scope">
|
|
<el-button
|
|
v-if="scope.row.trustLevel !== 'ADMIN'"
|
|
size="small"
|
|
@click="handleSetLevel(scope.row)"
|
|
>设置等级</el-button>
|
|
<span v-else style="color:#999;font-size:12px">管理员</span>
|
|
</template>
|
|
</el-table-column>
|
|
</el-table>
|
|
</el-card>
|
|
|
|
<!-- 等级设置弹窗 -->
|
|
<el-dialog v-model="dialogVisible" title="设置信任等级" width="400px">
|
|
<el-form :model="levelForm">
|
|
<el-form-item label="用户">
|
|
<span>{{ levelForm.email }}</span>
|
|
</el-form-item>
|
|
<el-form-item label="信任等级">
|
|
<el-select v-model="levelForm.level" placeholder="请选择等级" style="width: 100%">
|
|
<el-option label="普通成员 (MEMBER)" value="MEMBER" />
|
|
<el-option label="受信任 (TRUSTED)" value="TRUSTED" />
|
|
</el-select>
|
|
</el-form-item>
|
|
</el-form>
|
|
<template #footer>
|
|
<el-button @click="dialogVisible = false">取消</el-button>
|
|
<el-button type="primary" @click="confirmSetLevel" :loading="saving">确认</el-button>
|
|
</template>
|
|
</el-dialog>
|
|
</div>
|
|
</template>
|
|
|
|
<script setup>
|
|
import api from '../api'
|
|
|
|
const users = ref([])
|
|
const loading = ref(false)
|
|
const dialogVisible = ref(false)
|
|
const saving = ref(false)
|
|
const levelForm = reactive({ id: null, email: '', level: '' })
|
|
const trustLevelType = (level) => {
|
|
const map = { MEMBER: '', TRUSTED: 'warning', ADMIN: 'danger' }
|
|
return map[level] || ''
|
|
}
|
|
|
|
const trustLevelLabel = (level) => {
|
|
const map = { MEMBER: '普通成员', TRUSTED: '受信任', ADMIN: '管理员' }
|
|
return map[level] || level
|
|
}
|
|
|
|
const fetchUsers = async () => {
|
|
loading.value = true
|
|
try {
|
|
const res = await api.users.list()
|
|
users.value = res.data || []
|
|
} catch (e) {
|
|
ElMessage.error('获取用户列表失败')
|
|
} finally {
|
|
loading.value = false
|
|
}
|
|
}
|
|
|
|
const handleSetLevel = (row) => {
|
|
levelForm.id = row.id
|
|
levelForm.email = row.email
|
|
levelForm.level = row.trustLevel === 'ADMIN' ? '' : row.trustLevel
|
|
dialogVisible.value = true
|
|
}
|
|
|
|
const confirmSetLevel = async () => {
|
|
if (!levelForm.level) {
|
|
ElMessage.warning('请选择等级')
|
|
return
|
|
}
|
|
saving.value = true
|
|
try {
|
|
await api.users.setTrustLevel(levelForm.id, levelForm.level)
|
|
ElMessage.success('设置成功')
|
|
dialogVisible.value = false
|
|
fetchUsers()
|
|
} catch (e) {
|
|
ElMessage.error(e.response?.data?.message || '操作失败')
|
|
} finally {
|
|
saving.value = false
|
|
}
|
|
}
|
|
|
|
onMounted(fetchUsers)
|
|
</script>
|