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} 项`
+ : '无'}
+
+ |
|