diff --git a/.gitignore b/.gitignore index abcf28e..2a5ecbe 100644 --- a/.gitignore +++ b/.gitignore @@ -57,6 +57,7 @@ public/workbox-*.js public/workbox-*.js.map /.claude +/.codex /.vscode # SQLite 开发数据库 .data/ @@ -66,4 +67,4 @@ public/workbox-*.js.map # local scripts scripts/tvbox/ -scripts/test \ No newline at end of file +scripts/test diff --git a/src/app/admin/page.tsx b/src/app/admin/page.tsx index 849ecba..0eb5a4b 100644 --- a/src/app/admin/page.tsx +++ b/src/app/admin/page.tsx @@ -51,6 +51,7 @@ import { createPortal } from 'react-dom'; import { AdminConfig, AdminConfigResult } from '@/lib/admin.types'; import { getAuthInfoFromBrowserCookie } from '@/lib/auth'; +import { FEATURE_PERMISSION_OPTIONS } from '@/lib/feature-permissions'; import AnimeSubscriptionComponent from '@/components/AnimeSubscriptionComponent'; import CorrectDialog from '@/components/CorrectDialog'; @@ -505,10 +506,12 @@ const UserConfig = ({ config, role, refreshConfig, usersV2, userPage, userTotalP const [newUserGroup, setNewUserGroup] = useState({ name: '', enabledApis: [] as string[], + permissions: FEATURE_PERMISSION_OPTIONS.map((item) => item.key) as string[], }); const [editingUserGroup, setEditingUserGroup] = useState<{ name: string; enabledApis: string[]; + permissions: string[]; } | null>(null); const [showConfigureApisModal, setShowConfigureApisModal] = useState(false); const [selectedUser, setSelectedUser] = useState<{ @@ -577,7 +580,8 @@ const UserConfig = ({ config, role, refreshConfig, usersV2, userPage, userTotalP const handleUserGroupAction = async ( action: 'add' | 'edit' | 'delete', groupName: string, - enabledApis?: string[] + enabledApis?: string[], + permissions?: string[] ) => { return withLoading(`userGroup_${action}_${groupName}`, async () => { try { @@ -589,6 +593,7 @@ const UserConfig = ({ config, role, refreshConfig, usersV2, userPage, userTotalP groupAction: action, groupName, enabledApis, + permissions, }), }); @@ -600,7 +605,11 @@ const UserConfig = ({ config, role, refreshConfig, usersV2, userPage, userTotalP await refreshConfig(); if (action === 'add') { - setNewUserGroup({ name: '', enabledApis: [] }); + setNewUserGroup({ + name: '', + enabledApis: [], + permissions: FEATURE_PERMISSION_OPTIONS.map((item) => item.key), + }); setShowAddUserGroupForm(false); } else if (action === 'edit') { setEditingUserGroup(null); @@ -624,7 +633,12 @@ const UserConfig = ({ config, role, refreshConfig, usersV2, userPage, userTotalP const handleAddUserGroup = () => { if (!newUserGroup.name.trim()) return; - handleUserGroupAction('add', newUserGroup.name, newUserGroup.enabledApis); + handleUserGroupAction( + 'add', + newUserGroup.name, + newUserGroup.enabledApis, + newUserGroup.permissions + ); }; const handleEditUserGroup = () => { @@ -632,7 +646,8 @@ const UserConfig = ({ config, role, refreshConfig, usersV2, userPage, userTotalP handleUserGroupAction( 'edit', editingUserGroup.name, - editingUserGroup.enabledApis + editingUserGroup.enabledApis, + editingUserGroup.permissions ); }; @@ -668,8 +683,12 @@ const UserConfig = ({ config, role, refreshConfig, usersV2, userPage, userTotalP const handleStartEditUserGroup = (group: { name: string; enabledApis: string[]; + permissions?: string[]; }) => { - setEditingUserGroup({ ...group }); + setEditingUserGroup({ + ...group, + permissions: group.permissions || [], + }); setShowEditUserGroupForm(true); setShowAddUserGroupForm(false); }; @@ -1101,6 +1120,9 @@ const UserConfig = ({ config, role, refreshConfig, usersV2, userPage, userTotalP 可用视频源 + + 功能权限 + 操作 @@ -1124,6 +1146,13 @@ const UserConfig = ({ config, role, refreshConfig, usersV2, userPage, userTotalP + + + {group.permissions && group.permissions.length > 0 + ? `${group.permissions.length} 项` + : '无'} + + {/* 网盘搜索按钮 */} - + {netdiskSearchEnabled && ( + + )} {/* AI问片按钮 */} {aiEnabled && detail && (