From 97808fa21bb67a06debea81f18a14fc10cb1febd Mon Sep 17 00:00:00 2001 From: WangLeo <690854599@qq.com> Date: Tue, 16 Jun 2026 16:43:36 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20Authorization=20=E6=94=B9=E4=B8=BA?= =?UTF-8?q?=E6=A0=87=E5=87=86=20Bearer=20=E6=A0=BC=E5=BC=8F=EF=BC=8C?= =?UTF-8?q?=E8=A1=A5=E5=85=85=20CLAUDE.md=20=E6=9E=B6=E6=9E=84=E6=96=87?= =?UTF-8?q?=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - request.js: Authorization 头添加 Bearer 前缀 - CLAUDE.md: 新增路由与认证流程、markRaw 说明、getGenerateDataExtras 接口 - CLAUDE.md: 修正 request.js 描述和环境变量表 --- .claude/settings.local.json | 3 ++- CLAUDE.md | 16 +++++++++++++--- src/utils/request.js | 3 +-- 3 files changed, 16 insertions(+), 6 deletions(-) diff --git a/.claude/settings.local.json b/.claude/settings.local.json index 31d4cd5..7f765d3 100644 --- a/.claude/settings.local.json +++ b/.claude/settings.local.json @@ -8,7 +8,8 @@ "Bash(git -C \"D:/WebUI/Kexue/操作平台/AI_Painting_V2.0\" log --oneline --all -- src/components/dialogBox/index.vue)", "Bash(git -C \"D:/WebUI/Kexue/操作平台/AI_Painting_V2.0\" log --all --oneline --follow -p -- src/stores/display.js)", "Bash(git -C \"D:/WebUI/Kexue/操作平台/AI_Painting_V2.0\" log --all --oneline -p -- src/components/dialogBox/index.vue)", - "Bash(npx eslint *)" + "Bash(npx eslint *)", + "Bash(codegraph sync *)" ] } } diff --git a/CLAUDE.md b/CLAUDE.md index c656f0b..ba9071a 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -22,6 +22,15 @@ AI 绘画/视频/音乐生成前端操作平台,通过 HTTP 接口对接算力 **核心架构:Platform Descriptor 模式。** Painting、Video 和 Music 是三个独立的平台包,通过统一的注册表动态加载。dialogBox 是通用编排壳,不包含任何平台特定逻辑。 +### 路由与认证 + +- **路由表**:`/` → 重定向 `/home`;`/login` → 登录页(懒加载);`/home` 和 `/generate` → 同一主页组件 `views/home/index.vue` +- **Token 来源**:两种方式 — localStorage(`auth.ts` 存取)或 URL query `?token=xxx`(外部认证回调跳转) +- **路由守卫**(`router/index.js:32`):`beforeEach` 中先检查 URL query 是否有 token,有则写入 localStorage;无则检查 localStorage;都没有 → 重定向 `/login` +- **白名单**:`/login` 直接放行,不触发 token 校验 +- **Token 校验**:非白名单路径调 `userStore.checkTokenValid()` → `checkUsertokenApi()` 验证,失败则跳转 `/login` +- **用户信息**:token 有效且 `userInfo.id` 为空时自动调用 `getInfo()` 获取用户信息(含 `sessionId`)。`userStore` 使用 pinia persist 将 `token`/`roles`/`permissions` 等持久化到 localStorage + ### 关键目录 ``` @@ -82,7 +91,7 @@ src/ │ └── canvas/ # 图片画布编辑(圆/矩形选区,局部重绘,undo/redo) ├── views/ # 页面(home、login) └── utils/ - ├── request.js # Axios 实例 + 拦截器:统一 Auth(不带 Bearer)+ 按前缀路由 baseURL + ├── request.js # Axios 实例 + 拦截器:统一 Auth(Bearer 格式)+ 按前缀路由 baseURL ├── taskPolling.js # 任务生成入口:组装参数 → POST 创建任务 → 首次 5s + 后续 20s HTTP 轮询直至完成/失败 ├── modelApi.js # 模型业务层:localStorage 缓存 + 并发去重。平台模型列表(30s TTL) + 模型参数配置(60s TTL) ├── modelConfigHelper.js # 模型配置共享工具:syncDefaults / syncParamValues / getDimConfig / checkShowWhen @@ -95,7 +104,7 @@ src/ ### Platform Descriptor 模式 -每个平台通过 `defineXxxPlatform()` 工厂函数返回标准接口: +每个平台通过 `defineXxxPlatform()` 工厂函数返回标准接口。`markRaw()` 标记组件使其不被 Vue 变为响应式代理 —— 控件组件只通过 `props()` 函数接收响应式绑定,组件本身不需要响应式追踪。 ```js const platform = { @@ -126,6 +135,7 @@ const platform = { isImageRequired() { ... }, // 图片是否必填 buildTaskBody({ prompt, referenceImages }) { ... }, // 构造扁平 modelParams,需将 referenceImages 映射到 imageUpload 参数 fillFromResult(resultData) { ... }, // 从历史结果回填参数 + getGenerateDataExtras() { ... }, // (可选)返回平台专属字段,在 handleStart 中合并到 generateData,用于回填和任务列表展示 } ``` @@ -362,7 +372,7 @@ Music 平台与 Painting/Video 的关键差异: ### 请求拦截器路由 -拦截器统一设置 `Authorization: `(不带 Bearer 前缀),根据请求 URL 前缀(由环境变量 `VITE_API_TASK_PREFIX` / `VITE_API_PAY_PREFIX` / `VITE_API_AIGC_PREFIX` 定义)切换后端: +拦截器统一设置 `Authorization: Bearer `(标准 Bearer 格式),根据请求 URL 前缀(由环境变量 `VITE_API_TASK_PREFIX` / `VITE_API_PAY_PREFIX` / `VITE_API_AIGC_PREFIX` 定义)切换后端: | URL 前缀(由环境变量定义) | 目标环境变量 | |---------------------------|-------------| diff --git a/src/utils/request.js b/src/utils/request.js index a11f30c..852659d 100644 --- a/src/utils/request.js +++ b/src/utils/request.js @@ -33,8 +33,7 @@ service.interceptors.request.use( config.headers = {} } - // 统一 Auth 头不带 Bearer 前缀 - if (token) config.headers.Authorization = token + if (token) config.headers.Authorization = `Bearer ${token}` if (config.url?.startsWith(import.meta.env.VITE_API_TASK_PREFIX)) { // 算力调度后端 config.baseURL = import.meta.env.VITE_API_TASK_TARGET