diff --git a/src/components/FeatureNavigation.vue b/src/components/FeatureNavigation.vue index 0850ca5..986fb28 100644 --- a/src/components/FeatureNavigation.vue +++ b/src/components/FeatureNavigation.vue @@ -32,6 +32,14 @@ const features = [ color: 'from-purple-500 to-pink-500', iconBg: 'bg-purple-500/10', iconColor: 'text-purple-600 dark:text-purple-400', + }, { + title: 'KV 管理器', + description: '浏览和管理键值存储数据,支持批量操作', + icon: Database, + path: '/kv-manager', + color: 'from-green-500 to-emerald-500', + iconBg: 'bg-green-500/10', + iconColor: 'text-green-600 dark:text-green-400', }, { title: '设备管理', diff --git a/src/lib/api.js b/src/lib/api.js index 6ecbcd5..b4c32c4 100644 --- a/src/lib/api.js +++ b/src/lib/api.js @@ -15,18 +15,27 @@ class ApiClient { const data = options.body const params = options.params - // 通过 axios 实例发起请求(已内置 baseURL 与 x-site-key) - const result = await axiosInstance.request({ - url: endpoint, - method, - headers, - data, - params, - }) + try { + // 通过 axios 实例发起请求(已内置 baseURL 与 x-site-key) + const result = await axiosInstance.request({ + url: endpoint, + method, + headers, + data, + params, + }) - // axios 响应拦截器已返回 response.data,这里做空值统一 - if (result === '' || result === undefined || result === null) return {} - return result + // axios 响应拦截器已返回 response.data,这里做空值统一 + if (result === '' || result === undefined || result === null) return {} + return result + } catch (err) { + // 某些后端会在非 2xx 状态下直接返回有效数据,这里兜底返回 body + const resp = err?.response + if (resp && resp.data !== undefined) { + return resp.data + } + throw err + } } // 带认证的fetch diff --git a/src/pages/kv-manager.vue b/src/pages/kv-manager.vue index ca8713e..2ee4bb7 100644 --- a/src/pages/kv-manager.vue +++ b/src/pages/kv-manager.vue @@ -1,615 +1,541 @@ - - - +