diff --git a/web/backend/permissions.py b/web/backend/permissions.py index a6181df..10048fd 100644 --- a/web/backend/permissions.py +++ b/web/backend/permissions.py @@ -9,8 +9,9 @@ PERMISSIONS = { "user:delete": "删除用户", "user:assign_permissions": "分配权限", # 账号管理 - "account:view_all": "查看所有账号(完整字段)", - "account:view_assigned": "查看分配给自己的账号(仅用户名)", + "account:view_all": "查看所有账号(仅用户名、标签、分配)", + "account:view_full": "查看账号完整字段(密码/邮箱,仅管理员)", + "account:view_assigned": "查看分配给自己的账号", "account:import": "导入账号", "account:assign": "分配账号给客服", "account:delete": "删除账号", @@ -37,7 +38,6 @@ ROLE_PERMISSIONS = { "account:view_all", "account:import", "account:assign", - "account:delete", "login:batch", "login:view_all", "cookie:view", diff --git a/web/backend/routers/accounts.py b/web/backend/routers/accounts.py index ed185a3..9891f57 100644 --- a/web/backend/routers/accounts.py +++ b/web/backend/routers/accounts.py @@ -54,8 +54,8 @@ def list_accounts( assigned_username=acc.assigned_user.username if acc.assigned_user else None, created_at=acc.created_at, ) - # 运营+超管可看完整字段 - if user_has_permission(current, "account:view_all"): + # 只有管理员可看完整字段(密码、邮箱等) + if user_has_permission(current, "account:view_full"): item.password = acc.password item.email = acc.email item.email_password = acc.email_password diff --git a/web/frontend/src/pages/AccountsPage.tsx b/web/frontend/src/pages/AccountsPage.tsx index 5d67a1b..214c054 100644 --- a/web/frontend/src/pages/AccountsPage.tsx +++ b/web/frontend/src/pages/AccountsPage.tsx @@ -7,6 +7,7 @@ import type { TableProps } from 'antd'; import { ImportOutlined, DeleteOutlined, TagOutlined, FilterOutlined } from '@ant-design/icons'; import { accountApi, userApi, type AccountItem, type UserInfo } from '../api/modules'; import { usePermissions } from '../hooks/usePermissions'; +import { formatTime } from '../utils/time'; import { getErrorMessage } from '../utils/error'; const { TextArea } = Input; @@ -36,6 +37,7 @@ export default function AccountsPage() { const { can } = usePermissions(); const canViewAll = can('account:view_all'); + const canViewFull = can('account:view_full'); const canImport = can('account:import'); const canAssign = can('account:assign'); const canDelete = can('account:delete'); @@ -218,9 +220,16 @@ export default function AccountsPage() { return {tag}; }, }, + { + title: '上传时间', + dataIndex: 'created_at', + width: 180, + render: (val: string | null) => val ? formatTime(val) : -, + }, ]; - if (canViewAll) { + // 只有管理员可看完整字段(密码、邮箱等) + if (canViewFull) { columns.push( { title: '密码', dataIndex: 'password', width: 120 }, { title: '邮箱', dataIndex: 'email' },