From fa524af5b5820872ec68dd0b66404867dc76e596 Mon Sep 17 00:00:00 2001 From: moux1024 <403053463@qq.com> Date: Mon, 29 Sep 2025 14:18:01 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20env=E5=8F=98=E9=87=8F?= =?UTF-8?q?=E4=BD=BF=E7=94=A8=E6=94=B6=E5=8F=A3=E5=88=B0env.ts,constants?= =?UTF-8?q?=E6=9A=82=E6=97=B6=E7=A7=BB=E9=99=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/README.md | 8 +- api/common.ts | 4 +- api/constants.ts | 4 - api/request.ts | 6 +- api/serversetting.ts | 4 +- api/video_flow.ts | 1 - app/layout.tsx | 7 +- app/users/oauth/callback/page.tsx | 4 +- .../pages/work-flow/ai-editing-iframe.tsx | 2 +- .../pages/work-flow/use-workflow-data.tsx | 4 +- .../pages/work-flow/video-edit/config.ts | 35 ++- components/vanta-halo-background.tsx | 1 + lib/auth.ts | 46 ++-- lib/env.ts | 202 ++++++++++++++++++ lib/server-config.ts | 5 +- utils/analytics.ts | 12 +- utils/dev-helper.ts | 5 +- utils/export-service.ts | 5 +- 18 files changed, 268 insertions(+), 87 deletions(-) delete mode 100644 api/constants.ts create mode 100644 lib/env.ts diff --git a/api/README.md b/api/README.md index f378220..6351e6b 100644 --- a/api/README.md +++ b/api/README.md @@ -4,7 +4,7 @@ ### 目录结构与职责 -- `constants.ts`:基础配置(`BASE_URL` 从 `NEXT_PUBLIC_BASE_URL` 注入) +- 基础配置从 `@/lib/env` 导入 `baseUrl` - `request.ts`:Axios 实例与拦截器、通用 `get/post/put/del`、`stream`(SSE风格下载进度)、`downloadStream`、`streamJsonPost` - `errorHandle.ts`:错误码映射与统一提示、特殊码处理(如 401 跳转登录、402 不弹提示) - `common.ts`:通用类型与与上传相关的工具(获取七牛 Token、上传) @@ -16,7 +16,7 @@ 1. 使用 `request.ts` 提供的 `get/post/put/del` 包装函数发起请求,返回后端响应体(已通过响应拦截器做业务码检查)。 2. 业务成功码:`code === 0` 或 `code === 202`(长任务/排队等需要前端自行处理状态)。若非成功码,拦截器会调用 `errorHandle` 并 `Promise.reject`。 3. 认证:前端从 `localStorage.token` 注入 `Authorization: Bearer `,请确保登录流程写入 `token`。 -4. 基础地址:通过环境变量 `NEXT_PUBLIC_BASE_URL` 注入,构建前需设置。 +4. 基础地址:从 `@/lib/env` 的 `baseUrl` 获取,统一管理环境变量。 ### 错误处理约定 @@ -90,7 +90,7 @@ await downloadStream('/download/file', 'result.mp4'); #### 浏览器前端(React/Next.js CSR) - 直接使用 `get/post/put/del`;确保登录后将 `token` 写入 `localStorage` -- 环境变量:在 `.env.local` 配置 `NEXT_PUBLIC_BASE_URL` +- 环境变量:在 `.env.local` 配置 `NEXT_PUBLIC_BASE_URL`,通过 `@/lib/env` 统一管理 - 错误提示:由 `errorHandle` 统一处理;402 会展示积分不足通知 #### Next.js Route Handler(服务端 API) @@ -101,7 +101,7 @@ await downloadStream('/download/file', 'result.mp4'); #### Next.js Server Components/SSR - 服务端不具备 `localStorage`,如需鉴权请改为从 Cookie/Headers 传递 token,并在转发时设置 `Authorization` -- 服务器端可直接使用 `fetch(BASE_URL + path, { headers })` +- 服务器端可直接使用 `fetch(baseUrl + path, { headers })` #### Node/Serverless(Vercel/Cloudflare) diff --git a/api/common.ts b/api/common.ts index 4fef3e8..7c3daa4 100644 --- a/api/common.ts +++ b/api/common.ts @@ -1,5 +1,5 @@ // Common API 相关接口 -import { BASE_URL } from './constants' +import { baseUrl } from '@/lib/env'; export interface ApiResponse { code: number @@ -44,7 +44,7 @@ export const getUploadToken = async (timeoutMs: number = 10000): Promise<{ token }, timeoutMs) try { - const response = await fetch(`${BASE_URL}/common/get-upload-token`, { + const response = await fetch(`${baseUrl}/common/get-upload-token`, { method: "GET", headers: { Accept: "application/json", diff --git a/api/constants.ts b/api/constants.ts deleted file mode 100644 index a2dd979..0000000 --- a/api/constants.ts +++ /dev/null @@ -1,4 +0,0 @@ -export const BASE_URL = process.env.NEXT_PUBLIC_BASE_URL -// export const BASE_URL = 'https://77.smartvideo.py.qikongjian.com' -// export const BASE_URL ='http://192.168.120.5:8000' -// diff --git a/api/request.ts b/api/request.ts index 701f549..0afcc2e 100644 --- a/api/request.ts +++ b/api/request.ts @@ -1,5 +1,5 @@ import axios, { AxiosInstance, AxiosRequestConfig, AxiosResponse, InternalAxiosRequestConfig, AxiosHeaders } from 'axios'; -import { BASE_URL } from './constants' +import { baseUrl } from '@/lib/env'; import { errorHandle } from './errorHandle'; /** @@ -20,7 +20,7 @@ const handleRequestError = (error: any, defaultMessage: string = '请求失败') }; // 创建 axios 实例 const request: AxiosInstance = axios.create({ - baseURL: BASE_URL, // 设置基础URL + baseURL: baseUrl, // 设置基础URL timeout: 300000, // 请求超时时间 headers: { 'Content-Type': 'application/json', @@ -102,7 +102,7 @@ export async function streamJsonPost( ) { try { const token = localStorage?.getItem('token') || ''; - const response = await fetch(`${BASE_URL}${url}`, { + const response = await fetch(`${baseUrl}${url}`, { method: 'POST', headers: { 'Content-Type': 'application/json', diff --git a/api/serversetting.ts b/api/serversetting.ts index 2a2f198..e101de4 100644 --- a/api/serversetting.ts +++ b/api/serversetting.ts @@ -1,4 +1,4 @@ -import { BASE_URL } from "./constants"; +import { baseUrl } from '@/lib/env'; import { post } from './request'; // 获取路演配置数据 @@ -8,7 +8,7 @@ export const fetchRoadshowConfigs = async () => { try { console.log('开始请求接口数据...'); - const response = await fetch(BASE_URL + '/serversetting/roadshow-configs', { + const response = await fetch(baseUrl + '/serversetting/roadshow-configs', { method: 'POST', headers: { 'Content-Type': 'application/json', diff --git a/api/video_flow.ts b/api/video_flow.ts index a4f2cec..95113ff 100644 --- a/api/video_flow.ts +++ b/api/video_flow.ts @@ -1,7 +1,6 @@ import { post, streamJsonPost } from "./request"; import { ProjectTypeEnum } from "@/app/model/enums"; import { ApiResponse } from "@/api/common"; -import { BASE_URL } from "./constants"; import { AITextEntity, RoleEntity, diff --git a/app/layout.tsx b/app/layout.tsx index da2fb2f..9631a78 100644 --- a/app/layout.tsx +++ b/app/layout.tsx @@ -5,6 +5,7 @@ import { Providers } from '@/components/providers'; import { ConfigProvider, theme } from 'antd'; import CallbackModal from '@/components/common/CallbackModal'; import { useAppStartupAnalytics } from '@/hooks/useAppStartupAnalytics'; +import { gaEnabled, gaMeasurementId } from '@/lib/env'; // 创建上下文来传递弹窗控制方法 const CallbackModalContext = createContext<{ @@ -53,16 +54,16 @@ export default function RootLayout({ - {process.env.NEXT_PUBLIC_GA_ENABLED === 'true' && ( + {gaEnabled && ( <> - +