diff --git a/.env.development b/.env.development index 3bccc6f..c853518 100644 --- a/.env.development +++ b/.env.development @@ -2,5 +2,5 @@ VITE_USER_NODE_ENV=development # 子应用地址(开发环境) -VITE_LABEL_APP_URL=http://localhost:3004/labelapp/ -VITE_FLOW_APP_URL=http://localhost:9222/flowapp/ +VITE_LABEL_APP_URL=https://aistudio.ngsk.tech:7001/labelapp/ +VITE_FLOW_APP_URL=https://aistudio.ngsk.tech:7001/flowapp/ diff --git a/.env.production b/.env.production index 16a3e38..afec65f 100644 --- a/.env.production +++ b/.env.production @@ -2,5 +2,5 @@ VITE_USER_NODE_ENV=production # 子应用地址(生产环境,相对路径,部署在同一域名下) -VITE_LABEL_APP_URL=/labelapp/ -VITE_FLOW_APP_URL=/flowapp/ +VITE_LABEL_APP_URL=https://aistudio.ngsk.tech:7001/labelapp/ +VITE_FLOW_APP_URL=https://aistudio.ngsk.tech:7001/flowapp/ diff --git a/apps/flow-app/.umirc.ts b/apps/flow-app/.umirc.ts index 99bf171..f18c8c9 100644 --- a/apps/flow-app/.umirc.ts +++ b/apps/flow-app/.umirc.ts @@ -1,67 +1,67 @@ import path from 'path'; import TerserPlugin from 'terser-webpack-plugin'; -import { defineConfig } from 'umi'; -import { appName } from './src/conf.json'; +import {defineConfig} from 'umi'; +import {appName} from './src/conf.json'; import routes from './src/routes'; export default defineConfig({ - title: appName, - outputPath: 'dist', - alias: { '@parent': path.resolve(__dirname, '../') }, - npmClient: 'npm', - base: '/flowapp/', - publicPath: '/flowapp/', - runtimePublicPath: false, - mfsu: false, - routes, - esbuildMinifyIIFE: true, - icons: {}, - hash: true, // 生产环境开启 hash - favicons: ['/flowapp/flow-app.png'], - headScripts: [{ src: '/flowapp/iconfont.js', defer: true }], - clickToComponent: {}, - history: { - type: 'browser', - }, - plugins: [ - '@react-dev-inspector/umi4-plugin', - '@umijs/plugins/dist/tailwindcss', - ], - jsMinifier: 'terser', - jsMinifierOptions: { - compress: { - drop_console: true, - drop_debugger: true, + title: appName, + outputPath: 'dist', + alias: {'@parent': path.resolve(__dirname, '../')}, + npmClient: 'npm', + base: '/flowapp/', + publicPath: '/flowapp/', + runtimePublicPath: false, + mfsu: false, + routes, + esbuildMinifyIIFE: true, + icons: {}, + hash: true, // 生产环境开启 hash + favicons: ['/flowapp/flow-app.png'], + headScripts: [{src: '/flowapp/iconfont.js', defer: true}], + clickToComponent: {}, + history: { + type: 'browser', }, - }, - lessLoader: { - modifyVars: { - hack: `true; @import "~@/less/index.less";`, + plugins: [ + '@react-dev-inspector/umi4-plugin', + '@umijs/plugins/dist/tailwindcss', + ], + jsMinifier: 'terser', + jsMinifierOptions: { + compress: { + drop_console: true, + drop_debugger: true, + }, }, - }, - devtool: process.env.NODE_ENV === 'production' ? false : 'source-map', - copy: [ - { from: 'src/conf.json', to: 'dist/conf.json' }, - { from: 'node_modules/monaco-editor/min/vs/', to: 'dist/vs/' }, - ], - proxy: { - '/api': { - target: 'http://ngsk.tech:29380', - changeOrigin: true, + lessLoader: { + modifyVars: { + hack: `true; @import "~@/less/index.less";`, + }, }, - '/databuilder/v1': { - target: 'http://192.168.8.131:29380', - changeOrigin: true, - pathRewrite: { '^/databuilder': '/' }, + devtool: process.env.NODE_ENV === 'production' ? false : 'source-map', + copy: [ + {from: 'src/conf.json', to: 'dist/conf.json'}, + {from: 'node_modules/monaco-editor/min/vs/', to: 'dist/vs/'}, + ], + proxy: { + '/api': { + target: 'http://ngsk.tech:29380', + changeOrigin: true, + }, + '/databuilder/v1': { + // target: 'http://192.168.8.131:29380', + target: 'https://aistudio.ngsk.tech:7001/', + changeOrigin: true, + }, }, - }, - writeToDisk: true, - chainWebpack(memo, args) { - memo.module.rule('markdown').test(/\.md$/).type('asset/source'); + writeToDisk: true, + chainWebpack(memo, args) { + memo.module.rule('markdown').test(/\.md$/).type('asset/source'); - memo.optimization.minimizer('terser').use(TerserPlugin); + memo.optimization.minimizer('terser').use(TerserPlugin); - return memo; - }, - tailwindcss: {}, + return memo; + }, + tailwindcss: {}, }); diff --git a/apps/flow-app/src/utils/api.ts b/apps/flow-app/src/utils/api.ts index 15c5003..eb88913 100644 --- a/apps/flow-app/src/utils/api.ts +++ b/apps/flow-app/src/utils/api.ts @@ -1,4 +1,4 @@ -let api_host = `/databuilder/v1`; +let api_host = `/api/databuilder/v1`; export { api_host }; diff --git a/apps/label-app/src/api/request.tsx b/apps/label-app/src/api/request.tsx index 5694847..1036514 100644 --- a/apps/label-app/src/api/request.tsx +++ b/apps/label-app/src/api/request.tsx @@ -72,7 +72,7 @@ const authorizationBearerFailed = (error: any) => { const requestConfig = { timeout: 99999, - baseURL: '/databuilder', + baseURL: '/api/databuilder', }; const request = axios.create(requestConfig); diff --git a/apps/label-app/vite.config.ts b/apps/label-app/vite.config.ts index 8bcf3d6..825dea6 100644 --- a/apps/label-app/vite.config.ts +++ b/apps/label-app/vite.config.ts @@ -1,9 +1,9 @@ -import { resolve } from "path"; +import {resolve} from "path"; -import { defineConfig } from "vite"; +import {defineConfig} from "vite"; import react from "@vitejs/plugin-react"; import svgr from "vite-plugin-svgr"; -import { ViteEjsPlugin } from "vite-plugin-ejs"; +import {ViteEjsPlugin} from "vite-plugin-ejs"; import tsMonoAlias from "vite-plugin-ts-mono-alias"; const isOnline = !!process.env.VITE_IS_ONLINE; @@ -11,66 +11,67 @@ console.log("isOnline", isOnline); // https://vitejs.dev/config/ export default defineConfig({ - base: "/labelapp/", - publicDir: resolve(__dirname, "public"), - envDir: resolve(__dirname, "env"), - server: { - host: "0.0.0.0", - port: 3004, - // micro-app 跨域配置 - cors: true, - headers: { - "Access-Control-Allow-Origin": "*", + base: "/labelapp/", + publicDir: resolve(__dirname, "public"), + envDir: resolve(__dirname, "env"), + server: { + host: "0.0.0.0", + port: 3004, + // micro-app 跨域配置 + cors: true, + headers: { + "Access-Control-Allow-Origin": "*", + }, + proxy: { + "/databuilder": { + // target: "http://192.168.8.131:28080", + target: 'https://aistudio.ngsk.tech:7001/', + changeOrigin: true, + }, + "/ws": { + target: "wss://labu.tech:8888/", + ws: true, + changeOrigin: true, + }, + }, }, - proxy: { - "/databuilder": { - target: "http://192.168.8.131:28080", - changeOrigin: true, - }, - "/ws": { - target: "wss://labu.tech:8888/", - ws: true, - changeOrigin: true, - }, - }, - }, - optimizeDeps: { - include: ["react/jsx-runtime"], - }, + optimizeDeps: { + include: ["react/jsx-runtime"], + }, - plugins: [ - react(), - svgr(), - ViteEjsPlugin(), - !process.env.DIST && process.env.NODE_ENV !== "production" && tsMonoAlias(), - ].filter(Boolean), + plugins: [ + react(), + svgr(), + ViteEjsPlugin(), + !process.env.DIST && process.env.NODE_ENV !== "production" && tsMonoAlias(), + ].filter(Boolean), - resolve: { - alias: { - "@": resolve(__dirname, "src/"), + resolve: { + alias: { + "@": resolve(__dirname, "src/"), + }, }, - }, - build: { - outDir: "dist", - target: "es2015", - // micro-app 需要的配置 - cssCodeSplit: false, - minify: "terser", - terserOptions: { - compress: { - drop_console: true, - drop_debugger: true, - }, - }, - rollupOptions: { - output: { - // 确保资源路径正确 - assetFileNames: "assets/[name]-[hash][extname]", - chunkFileNames: "assets/[name]-[hash].js", - entryFileNames: "assets/[name]-[hash].js", - }, + build: { + outDir: "dist", + target: "es2015", + // micro-app 需要的配置 + cssCodeSplit: false, + minify: "terser", + terserOptions: { + compress: { + drop_console: true, + drop_debugger: true, + }, + }, + rollupOptions: { + output: { + // 确保资源路径正确 + assetFileNames: "assets/[name]-[hash][extname]", + chunkFileNames: "assets/[name]-[hash].js", + entryFileNames: "assets/[name]-[hash].js", + }, + }, }, - }, }); diff --git a/src/api/user-auth.ts b/src/api/user-auth.ts index 6199c1c..fccb432 100644 --- a/src/api/user-auth.ts +++ b/src/api/user-auth.ts @@ -12,6 +12,8 @@ export interface RegisterParams { } export interface LoginResponse { + code: number + message: string access_token: string token_type: string } @@ -36,10 +38,28 @@ userAuthService.interceptors.request.use( // 响应拦截器 userAuthService.interceptors.response.use( - response => response, + response => { + const { code, message } = response.data + + // code 为 0 表示成功 + if (code === 0) { + return response + } + + // code 为 401 表示未授权,跳转登录 + if (code === 401) { + localStorage.removeItem('Access-Token') + localStorage.removeItem('Refresh-Token') + window.location.href = '/#/login' + return Promise.reject(new Error(message || '登录已过期,请重新登录')) + } + + // 其他非 0 的 code 视为业务错误 + return Promise.reject(new Error(message || '请求失败')) + }, error => { if (error.response?.status === 401) { - // 清除 token 并跳转登录 + // HTTP 401 状态码,清除 token 并跳转登录 localStorage.removeItem('Access-Token') localStorage.removeItem('Refresh-Token') window.location.href = '/#/login' diff --git a/src/micro-app/data/views/marking/task-canvas.vue b/src/micro-app/data/views/marking/task-canvas.vue index 9171738..ac00b18 100644 --- a/src/micro-app/data/views/marking/task-canvas.vue +++ b/src/micro-app/data/views/marking/task-canvas.vue @@ -70,7 +70,7 @@ const rootUrl = ref(''); onMounted(() => { const appUrl = getAppDetail('label-app')?.appUrl || ''; // 线上微应用路径 - const devUrl = 'http://localhost:3004/labelapp/'; + const devUrl = 'https://aistudio.ngsk.tech:7001/labelapp/'; const isProd = (import.meta as any).env.VITE_USER_NODE_ENV === 'production'; const commonUrl = config ? `tasks/${taskId}/edit` : `tasks/${taskId}/samples/${sampleId}?media_type=${media_type}`; diff --git a/src/micro-app/data/views/marking/task-create.vue b/src/micro-app/data/views/marking/task-create.vue index dbfff6b..cde5bbc 100644 --- a/src/micro-app/data/views/marking/task-create.vue +++ b/src/micro-app/data/views/marking/task-create.vue @@ -231,7 +231,7 @@ onMounted(() => { if (appUrl) { baseUrl.value = appUrl; } else { - baseUrl.value = 'http://localhost:3004/'; + baseUrl.value = 'https://aistudio.ngsk.tech:7001/'; } }); diff --git a/src/micro-app/data/views/process/all-process/initList/index.vue b/src/micro-app/data/views/process/all-process/initList/index.vue index 741e182..8aa98c1 100644 --- a/src/micro-app/data/views/process/all-process/initList/index.vue +++ b/src/micro-app/data/views/process/all-process/initList/index.vue @@ -459,7 +459,7 @@ const previewFlowHandle = (row: any) => { previewUrl.value = appUrl + commonUrl; microAppX.setData('flow-app-log', {...postData, server_ip: location.origin, isPreview: true}); } else { - previewUrl.value = 'http://localhost:9222/flowapp/' + commonUrl; + previewUrl.value = 'https://aistudio.ngsk.tech:7001/flowapp/' + commonUrl; microAppX.setData('flow-app-log', {...postData, server_ip: undefined, isPreview: true}); } }; diff --git a/src/micro-app/data/views/process/common/flow/index.vue b/src/micro-app/data/views/process/common/flow/index.vue index 96da82e..38b09b1 100644 --- a/src/micro-app/data/views/process/common/flow/index.vue +++ b/src/micro-app/data/views/process/common/flow/index.vue @@ -36,7 +36,7 @@ onMounted(() => { microAppX.setData('flow-app', {...postData, server_ip: location.origin, isTemplate: route.query.isTemplate}); // 指定后端服务地址 } else { // 本地测试环境 - baseUrl.value = 'http://localhost:9222/flowapp/' + commonUrl; + baseUrl.value = 'https://aistudio.ngsk.tech:7001/flowapp/' + commonUrl; microAppX.setData('flow-app', {...postData, server_ip: undefined, isTemplate: route.query.isTemplate}); // 使用默认 } }); diff --git a/src/micro-app/data/views/process/common/instance/instance.vue b/src/micro-app/data/views/process/common/instance/instance.vue index 4ae3a18..48ec70b 100644 --- a/src/micro-app/data/views/process/common/instance/instance.vue +++ b/src/micro-app/data/views/process/common/instance/instance.vue @@ -378,7 +378,7 @@ onMounted(async () => { }); // 指定后端服务地址 } else { // 本地测试环境 - baseUrl.value = 'http://localhost:9222/flowapp/' + commonUrl; + baseUrl.value = 'https://aistudio.ngsk.tech:7001/flowapp/' + commonUrl; microAppX.setData('flow-app-log', { ...postData, server_ip: undefined, logBaseUrl: config.value.storage_space_base_url }); // 使用默认 } }); diff --git a/src/views/LabelApp.vue b/src/views/LabelApp.vue index 36452ba..1448c0e 100644 --- a/src/views/LabelApp.vue +++ b/src/views/LabelApp.vue @@ -24,7 +24,7 @@ const router = useRouter() const baseUrl = ref('') // 开发环境子应用地址 -const devUrl = 'http://localhost:3004/labelapp/' +const devUrl = 'https://aistudio.ngsk.tech:7001/labelapp/' onMounted(() => { // 根据路由构建子应用URL diff --git a/src/views/login/index.vue b/src/views/login/index.vue index 4974503..63b90df 100644 --- a/src/views/login/index.vue +++ b/src/views/login/index.vue @@ -12,21 +12,29 @@
智能数据处理与分析平台