From 32658fa6080720e6bb173924ee88e7d522d739e0 Mon Sep 17 00:00:00 2001 From: seaislee1209 Date: Wed, 25 Feb 2026 16:07:01 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E7=BB=84=E9=95=BF=E5=8F=AF=E9=80=89?= =?UTF-8?q?=E8=B4=9F=E8=B4=A3=E4=BA=BA=20=E2=80=94=20=E6=96=B0=E5=A2=9E=20?= =?UTF-8?q?/users/brief=20=E8=BD=BB=E9=87=8F=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 新增 GET /api/users/brief 仅返回 id+name,任何登录用户可调用 - Projects.vue / ProjectDetail.vue 改用 brief() 接口,去掉 user:view 权限守卫 - 解决组长新建项目时负责人下拉框"无数据"的问题 Co-Authored-By: Claude Opus 4.6 --- backend/routers/users.py | 10 ++++++++++ frontend/src/api/index.js | 1 + frontend/src/views/ProjectDetail.vue | 8 ++++---- frontend/src/views/Projects.vue | 4 +--- 4 files changed, 16 insertions(+), 7 deletions(-) diff --git a/backend/routers/users.py b/backend/routers/users.py index e2c78fb..4a0e5b7 100644 --- a/backend/routers/users.py +++ b/backend/routers/users.py @@ -28,6 +28,16 @@ def _can_view_cost(user: User) -> bool: return "user:view_cost" in (user.permissions or []) +@router.get("/brief") +def list_users_brief( + db: Session = Depends(get_db), + current_user: User = Depends(get_current_user) +): + """轻量接口:仅返回 id+name,任何登录用户可调用(用于下拉选择等场景)""" + users = db.query(User.id, User.name).filter(User.is_active == 1).order_by(User.name).all() + return [{"id": u.id, "name": u.name} for u in users] + + @router.get("", response_model=List[UserOut]) def list_users( db: Session = Depends(get_db), diff --git a/frontend/src/api/index.js b/frontend/src/api/index.js index 2764c9a..5bd2b7c 100644 --- a/frontend/src/api/index.js +++ b/frontend/src/api/index.js @@ -48,6 +48,7 @@ export const authApi = { // ── 用户 ── export const userApi = { list: () => api.get('/users'), + brief: () => api.get('/users/brief'), create: (data) => api.post('/users', data), update: (id, data) => api.put(`/users/${id}`, data), get: (id) => api.get(`/users/${id}`), diff --git a/frontend/src/views/ProjectDetail.vue b/frontend/src/views/ProjectDetail.vue index 2e7be58..3a350ad 100644 --- a/frontend/src/views/ProjectDetail.vue +++ b/frontend/src/views/ProjectDetail.vue @@ -726,8 +726,8 @@ function formatSecs(s) { async function openEdit() { const p = project.value - if (authStore.hasPermission('user:view') && !users.value.length) { - try { users.value = await userApi.list() } catch {} + if (!users.value.length) { + try { users.value = await userApi.brief() } catch {} } Object.assign(editForm, { name: p.name, project_type: p.project_type, status: p.status || '制作中', leader_id: p.leader_id, @@ -763,8 +763,8 @@ async function load() { if (authStore.hasPermission('efficiency:view')) { try { efficiency.value = await projectApi.efficiency(id) } catch {} } - if (authStore.hasPermission('user:view') && !users.value.length) { - try { users.value = await userApi.list() } catch {} + if (!users.value.length) { + try { users.value = await userApi.brief() } catch {} } await nextTick() initProgressChart() diff --git a/frontend/src/views/Projects.vue b/frontend/src/views/Projects.vue index cb4d893..ec55b03 100644 --- a/frontend/src/views/Projects.vue +++ b/frontend/src/views/Projects.vue @@ -212,9 +212,7 @@ async function handleCreate() { onMounted(async () => { load() - if (authStore.hasPermission('user:view')) { - try { users.value = await userApi.list() } catch {} - } + try { users.value = await userApi.brief() } catch {} })