feat: 支局长可删除用户 + 清理重复蓝浩博
- 新增 DELETE /api/users/{id} (require_director, 不能删自己)
- 用户管理页新增「删除」按钮(仅支局长可见)
- 删除重复的分管领导蓝浩博
Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
@@ -122,3 +122,23 @@ async def update_user_wecom(
|
|||||||
"name": user.name,
|
"name": user.name,
|
||||||
"wecom_userid": user.wecom_userid,
|
"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}
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { ref, onMounted } from 'vue'
|
import { ref, onMounted } from 'vue'
|
||||||
import { ElMessage } from 'element-plus'
|
import { ElMessage, ElMessageBox } from 'element-plus'
|
||||||
import api from '@/api/index'
|
import api from '@/api/index'
|
||||||
|
|
||||||
const loading = ref(false)
|
const loading = ref(false)
|
||||||
@@ -59,6 +59,15 @@ async function handleSave() {
|
|||||||
await loadUsers()
|
await loadUsers()
|
||||||
} catch (e: any) { ElMessage.error('更新失败: ' + (e.response?.data?.detail || e.message)) }
|
} 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>
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
@@ -89,9 +98,10 @@ async function handleSave() {
|
|||||||
<span v-else style="color:var(--c-text-muted);font-size:12px">未绑定</span>
|
<span v-else style="color:var(--c-text-muted);font-size:12px">未绑定</span>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column label="操作" width="80" fixed="right">
|
<el-table-column label="操作" width="130" fixed="right">
|
||||||
<template #default="{ row }">
|
<template #default="{ row }">
|
||||||
<el-button text size="small" type="primary" @click="openEdit(row)">编辑</el-button>
|
<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>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
</el-table>
|
</el-table>
|
||||||
|
|||||||
Reference in New Issue
Block a user