feat: 支局长可删除用户 + 清理重复蓝浩博

- 新增 DELETE /api/users/{id} (require_director, 不能删自己)
- 用户管理页新增「删除」按钮(仅支局长可见)
- 删除重复的分管领导蓝浩博

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
2026-06-27 11:53:11 +08:00
parent 447932a8e6
commit 04aaff8851
2 changed files with 32 additions and 2 deletions
+20
View File
@@ -122,3 +122,23 @@ async def update_user_wecom(
"name": user.name,
"wecom_userid": user.wecom_userid,
}
@router.delete("/{user_id}")
async def delete_user(
user_id: str,
current_user: dict = Depends(require_director),
db: AsyncSession = Depends(get_db),
):
"""Director deletes a user. Cannot delete self."""
if user_id == current_user["user_id"]:
raise HTTPException(status_code=400, detail="不能删除自己")
result = await db.execute(select(User).where(User.id == uuid.UUID(user_id)))
user = result.scalar_one_or_none()
if not user:
raise HTTPException(status_code=404, detail="User not found")
await db.delete(user)
await db.commit()
return {"detail": "deleted", "name": user.name}
+12 -2
View File
@@ -1,6 +1,6 @@
<script setup lang="ts">
import { ref, onMounted } from 'vue'
import { ElMessage } from 'element-plus'
import { ElMessage, ElMessageBox } from 'element-plus'
import api from '@/api/index'
const loading = ref(false)
@@ -59,6 +59,15 @@ async function handleSave() {
await loadUsers()
} catch (e: any) { ElMessage.error('更新失败: ' + (e.response?.data?.detail || e.message)) }
}
async function handleDelete(row: any) {
try {
await ElMessageBox.confirm(`确定删除「${row.name}」?此操作不可恢复。`, '确认删除', { type: 'warning', confirmButtonText: '删除', cancelButtonText: '取消' })
await api.delete(`/users/${row.id}`)
ElMessage.success(`已删除「${row.name}`)
await loadUsers()
} catch (e: any) { if (e !== 'cancel') ElMessage.error('删除失败: ' + (e.response?.data?.detail || e.message)) }
}
</script>
<template>
@@ -89,9 +98,10 @@ async function handleSave() {
<span v-else style="color:var(--c-text-muted);font-size:12px">未绑定</span>
</template>
</el-table-column>
<el-table-column label="操作" width="80" fixed="right">
<el-table-column label="操作" width="130" fixed="right">
<template #default="{ row }">
<el-button text size="small" type="primary" @click="openEdit(row)">编辑</el-button>
<el-button v-if="auth.isDirector" text size="small" type="danger" @click="handleDelete(row)">删除</el-button>
</template>
</el-table-column>
</el-table>