diff --git a/src/App.vue b/src/App.vue
index 92e211f..04b74c2 100644
--- a/src/App.vue
+++ b/src/App.vue
@@ -61,7 +61,8 @@ const adminTabs = [
{ to: '/admin/companies', label: '公司' },
{ to: '/admin/sites', label: '站台' },
{ to: '/admin/members', label: '會員' },
- { to: '/admin/permission-groups', label: '群組' }
+ { to: '/admin/permission-groups', label: '群組' },
+ { to: '/admin/api-clients', label: 'API Clients' }
]
// 行內 NavTab 元件:避免另開檔案
diff --git a/src/api/api-clients.js b/src/api/api-clients.js
new file mode 100644
index 0000000..48eceb3
--- /dev/null
+++ b/src/api/api-clients.js
@@ -0,0 +1,6 @@
+import { adminHttp } from './http'
+
+export const getApiClients = (params) => adminHttp.get('/admin/api-clients', { params })
+export const createApiClient = (data) => adminHttp.post('/admin/api-clients', data)
+export const updateApiClient = (clientKey, data) => adminHttp.patch(`/admin/api-clients/${clientKey}`, data)
+export const rotateApiClientKey = (clientKey) => adminHttp.post(`/admin/api-clients/${clientKey}/rotate-key`)
diff --git a/src/pages/admin/ApiClientsPage.vue b/src/pages/admin/ApiClientsPage.vue
new file mode 100644
index 0000000..6408fc4
--- /dev/null
+++ b/src/pages/admin/ApiClientsPage.vue
@@ -0,0 +1,282 @@
+
+
+
+
API Clients
+
+ 新增 Client
+ 重新整理
+
+
+
+
+
+
+
+
+
+
+
+ {{ row.status }}
+
+
+
+ {{ (row.allowed_paths || []).join(', ') || '-' }}
+
+
+
+
+
+ 編輯
+ 重置 Key
+
+ {{ row.status === 'active' ? '停用' : '啟用' }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 取消
+ 建立
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 取消
+ 儲存
+
+
+
+
+
+
diff --git a/src/router/index.js b/src/router/index.js
index e0bbed3..b776b21 100644
--- a/src/router/index.js
+++ b/src/router/index.js
@@ -66,6 +66,12 @@ const routes = [
name: 'admin-permission-groups',
component: () => import('@/pages/admin/PermissionGroupsPage.vue'),
meta: { requiresAuth: true }
+ },
+ {
+ path: '/admin/api-clients',
+ name: 'admin-api-clients',
+ component: () => import('@/pages/admin/ApiClientsPage.vue'),
+ meta: { requiresAuth: true }
}
]