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' },