diff --git a/backend/.env b/backend/.env index 1c6cf71..3938782 100644 --- a/backend/.env +++ b/backend/.env @@ -1,7 +1,7 @@ RUST_LOG=info,udmin=debug APP_ENV=development APP_HOST=0.0.0.0 -APP_PORT=8080 +APP_PORT=9898 DB_URL=mysql://root:123456@127.0.0.1:3306/udmin JWT_SECRET=dev_secret_change_me JWT_ISS=udmin diff --git a/frontend/.env.development b/frontend/.env.development new file mode 100644 index 0000000..0ff8de8 --- /dev/null +++ b/frontend/.env.development @@ -0,0 +1,14 @@ +# port 端口号 +VITE_PORT = 8888 + +# 浏览器自动打开 +VITE_OPEN = true + +# 本地环境 +ENV = 'development' + +# ADMIN 服务地址(开发代理目标) +VITE_ADMIN_PROXY_PATH = http://127.0.0.1:9898 + +# API 基地址(留空则走相对 /api,经由开发代理转发) +VITE_API_BASE = \ No newline at end of file diff --git a/frontend/.env.production b/frontend/.env.production new file mode 100644 index 0000000..887fd95 --- /dev/null +++ b/frontend/.env.production @@ -0,0 +1,14 @@ +# port 端口号(生产构建无效,仅用于本地预览时生效) +VITE_PORT = 8888 + +# 浏览器自动打开(生产构建无效) +VITE_OPEN = false + +# 生产环境 +ENV = 'production' + +# ADMIN 服务地址(生产一般同域反代,留空) +VITE_ADMIN_PROXY_PATH = + +# API 基地址(推荐同域反代,留空则 axios 使用 /api;如需直连后端,填写例如 https://api.example.com) +VITE_API_BASE = \ No newline at end of file diff --git a/frontend/.env.staging b/frontend/.env.staging new file mode 100644 index 0000000..2386ea5 --- /dev/null +++ b/frontend/.env.staging @@ -0,0 +1,14 @@ +# port 端口号(staging 本地预览) +VITE_PORT = 8888 + +# 浏览器自动打开 +VITE_OPEN = true + +# 预发环境 +ENV = 'staging' + +# 预发 ADMIN 服务地址(仅本地预览代理使用) +VITE_ADMIN_PROXY_PATH = http://127.0.0.1:9898 + +# 预发 API 基地址(可填你的预发后端域名,例如 https://staging-api.example.com;若留空则使用 /api) +VITE_API_BASE = \ No newline at end of file diff --git a/frontend/src/pages/Logs.tsx b/frontend/src/pages/Logs.tsx index 59102b5..0f23068 100644 --- a/frontend/src/pages/Logs.tsx +++ b/frontend/src/pages/Logs.tsx @@ -117,7 +117,7 @@ export default function Logs() {
fetchData(1, pageSize)} style={{ marginBottom: 12 }}> - + diff --git a/frontend/src/pages/Menus.tsx b/frontend/src/pages/Menus.tsx index 5f1d747..e307087 100644 --- a/frontend/src/pages/Menus.tsx +++ b/frontend/src/pages/Menus.tsx @@ -448,7 +448,7 @@ export default function Menus(){ { const kw = String(vals?.keyword ?? '').trim(); setKeyword(kw); fetchMenus(kw) }} style={{ marginBottom: 12 }}> - + diff --git a/frontend/src/pages/Users.tsx b/frontend/src/pages/Users.tsx index 5d6289b..2c6244f 100644 --- a/frontend/src/pages/Users.tsx +++ b/frontend/src/pages/Users.tsx @@ -346,9 +346,9 @@ export default function Users(){ columns={columns} pagination={{ current: page, pageSize, total, showSizeChanger: true, onChange: (p: number, ps?: number) => fetchUsers(p, ps ?? pageSize, keyword) }} /> - + {/* 提示:此页面已支持分页、创建、编辑与重置密码。 - + */} setCreateOpen(false)} okText="创建" width={840}> diff --git a/frontend/src/utils/axios.ts b/frontend/src/utils/axios.ts index 57c1f1a..bb8f1af 100644 --- a/frontend/src/utils/axios.ts +++ b/frontend/src/utils/axios.ts @@ -7,11 +7,9 @@ export type ApiResp = { code: number; message?: string; data?: T } // 在请求配置上携带一次性重试标记 type RetryConfig = InternalAxiosRequestConfig & { _retry?: boolean } -// 使用 Vite 的环境变量类型 -const isDev = import.meta.env.DEV -const configuredBase = import.meta.env?.VITE_API_BASE || '' -const baseURL = isDev ? '' : configuredBase -const api: AxiosInstance = axios.create({ baseURL: baseURL ? `${baseURL}/api` : '/api', withCredentials: true }) +// 从 .env 读取 VITE_API_BASE,若未配置则回退到相对路径 /api +const configuredBase = (import.meta.env?.VITE_API_BASE as string | undefined)?.trim() || '' +const api: AxiosInstance = axios.create({ baseURL: configuredBase ? `${configuredBase}/api` : '/api', withCredentials: true }) let isRefreshing = false let pendingQueue: { resolve: () => void; reject: (e: unknown) => void; config: RetryConfig }[] = [] diff --git a/frontend/tsconfig.node.json b/frontend/tsconfig.node.json index 3a6c062..55c9b10 100644 --- a/frontend/tsconfig.node.json +++ b/frontend/tsconfig.node.json @@ -6,5 +6,7 @@ "moduleResolution": "Bundler", "allowSyntheticDefaultImports": true }, - "include": ["vite.config.ts"] + "include": [ + "vite.config.ts" + ] } \ No newline at end of file diff --git a/frontend/tsconfig.tsbuildinfo b/frontend/tsconfig.tsbuildinfo index 8889b38..b7a7b32 100644 --- a/frontend/tsconfig.tsbuildinfo +++ b/frontend/tsconfig.tsbuildinfo @@ -1 +1 @@ -{"root":["./src/app.tsx","./src/main.tsx","./src/vite-env.d.ts","./src/layouts/mainlayout.tsx","./src/pages/dashboard.tsx","./src/pages/departments.tsx","./src/pages/login.tsx","./src/pages/logs.tsx","./src/pages/menus.tsx","./src/pages/permissions.tsx","./src/pages/roles.tsx","./src/pages/users.tsx","./src/utils/axios.ts","./src/utils/datetime.ts","./src/utils/permission.tsx","./src/utils/token.ts"],"version":"5.9.2"} \ No newline at end of file +{"root":["./src/app.tsx","./src/main.tsx","./src/vite-env.d.ts","./src/components/pageheader.tsx","./src/layouts/mainlayout.tsx","./src/pages/dashboard.tsx","./src/pages/departments.tsx","./src/pages/login.tsx","./src/pages/logs.tsx","./src/pages/menus.tsx","./src/pages/permissions.tsx","./src/pages/positions.tsx","./src/pages/roles.tsx","./src/pages/users.tsx","./src/utils/axios.ts","./src/utils/datetime.ts","./src/utils/permission.tsx","./src/utils/token.ts"],"version":"5.9.2"} \ No newline at end of file diff --git a/frontend/vite.config.ts b/frontend/vite.config.ts index d22e897..f617ca5 100644 --- a/frontend/vite.config.ts +++ b/frontend/vite.config.ts @@ -1,16 +1,25 @@ -import { defineConfig } from 'vite' +import { defineConfig, loadEnv } from 'vite' import react from '@vitejs/plugin-react' -// https://vitejs.dev/config/ -export default defineConfig({ - plugins: [react()], - server: { - port: 5173, - open: true, - proxy: { - '/api': { - target: 'http://127.0.0.1:8080', - changeOrigin: true +// 单一配置文件 + 多环境 .env: +// - .env.development / .env.production / .env.staging 中配置变量 +// - 通过 loadEnv 读取并应用到开发服务器与代理 +export default defineConfig(({ mode }) => { + const env = loadEnv(mode, '.', '') + const port = Number(env.VITE_PORT || 5173) + const open = String(env.VITE_OPEN ?? 'true').toLowerCase() === 'true' || env.VITE_OPEN === '1' + const proxyTarget = env.VITE_ADMIN_PROXY_PATH || 'http://127.0.0.1:8080' + + return { + plugins: [react()], + server: { + port, + open, + proxy: { + '/api': { + target: proxyTarget, + changeOrigin: true + } } } }