fix(config): 更新环境配置和API代理地址

master
钟良源 4 weeks ago
parent 72df46b096
commit 1ff50c6089

@ -2,5 +2,5 @@
VITE_USER_NODE_ENV=development VITE_USER_NODE_ENV=development
# 子应用地址(开发环境) # 子应用地址(开发环境)
VITE_LABEL_APP_URL=http://localhost:3004/labelapp/ VITE_LABEL_APP_URL=https://aistudio.ngsk.tech:7001/labelapp/
VITE_FLOW_APP_URL=http://localhost:9222/flowapp/ VITE_FLOW_APP_URL=https://aistudio.ngsk.tech:7001/flowapp/

@ -2,5 +2,5 @@
VITE_USER_NODE_ENV=production VITE_USER_NODE_ENV=production
# 子应用地址(生产环境,相对路径,部署在同一域名下) # 子应用地址(生产环境,相对路径,部署在同一域名下)
VITE_LABEL_APP_URL=/labelapp/ VITE_LABEL_APP_URL=https://aistudio.ngsk.tech:7001/labelapp/
VITE_FLOW_APP_URL=/flowapp/ VITE_FLOW_APP_URL=https://aistudio.ngsk.tech:7001/flowapp/

@ -1,67 +1,67 @@
import path from 'path'; import path from 'path';
import TerserPlugin from 'terser-webpack-plugin'; import TerserPlugin from 'terser-webpack-plugin';
import { defineConfig } from 'umi'; import {defineConfig} from 'umi';
import { appName } from './src/conf.json'; import {appName} from './src/conf.json';
import routes from './src/routes'; import routes from './src/routes';
export default defineConfig({ export default defineConfig({
title: appName, title: appName,
outputPath: 'dist', outputPath: 'dist',
alias: { '@parent': path.resolve(__dirname, '../') }, alias: {'@parent': path.resolve(__dirname, '../')},
npmClient: 'npm', npmClient: 'npm',
base: '/flowapp/', base: '/flowapp/',
publicPath: '/flowapp/', publicPath: '/flowapp/',
runtimePublicPath: false, runtimePublicPath: false,
mfsu: false, mfsu: false,
routes, routes,
esbuildMinifyIIFE: true, esbuildMinifyIIFE: true,
icons: {}, icons: {},
hash: true, // 生产环境开启 hash hash: true, // 生产环境开启 hash
favicons: ['/flowapp/flow-app.png'], favicons: ['/flowapp/flow-app.png'],
headScripts: [{ src: '/flowapp/iconfont.js', defer: true }], headScripts: [{src: '/flowapp/iconfont.js', defer: true}],
clickToComponent: {}, clickToComponent: {},
history: { history: {
type: 'browser', type: 'browser',
},
plugins: [
'@react-dev-inspector/umi4-plugin',
'@umijs/plugins/dist/tailwindcss',
],
jsMinifier: 'terser',
jsMinifierOptions: {
compress: {
drop_console: true,
drop_debugger: true,
}, },
}, plugins: [
lessLoader: { '@react-dev-inspector/umi4-plugin',
modifyVars: { '@umijs/plugins/dist/tailwindcss',
hack: `true; @import "~@/less/index.less";`, ],
jsMinifier: 'terser',
jsMinifierOptions: {
compress: {
drop_console: true,
drop_debugger: true,
},
}, },
}, lessLoader: {
devtool: process.env.NODE_ENV === 'production' ? false : 'source-map', modifyVars: {
copy: [ hack: `true; @import "~@/less/index.less";`,
{ 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': { devtool: process.env.NODE_ENV === 'production' ? false : 'source-map',
target: 'http://192.168.8.131:29380', copy: [
changeOrigin: true, {from: 'src/conf.json', to: 'dist/conf.json'},
pathRewrite: { '^/databuilder': '/' }, {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,
writeToDisk: true, chainWebpack(memo, args) {
chainWebpack(memo, args) { memo.module.rule('markdown').test(/\.md$/).type('asset/source');
memo.module.rule('markdown').test(/\.md$/).type('asset/source');
memo.optimization.minimizer('terser').use(TerserPlugin); memo.optimization.minimizer('terser').use(TerserPlugin);
return memo; return memo;
}, },
tailwindcss: {}, tailwindcss: {},
}); });

@ -1,4 +1,4 @@
let api_host = `/databuilder/v1`; let api_host = `/api/databuilder/v1`;
export { api_host }; export { api_host };

@ -72,7 +72,7 @@ const authorizationBearerFailed = (error: any) => {
const requestConfig = { const requestConfig = {
timeout: 99999, timeout: 99999,
baseURL: '/databuilder', baseURL: '/api/databuilder',
}; };
const request = axios.create(requestConfig); const request = axios.create(requestConfig);

@ -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 react from "@vitejs/plugin-react";
import svgr from "vite-plugin-svgr"; 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"; import tsMonoAlias from "vite-plugin-ts-mono-alias";
const isOnline = !!process.env.VITE_IS_ONLINE; const isOnline = !!process.env.VITE_IS_ONLINE;
@ -11,66 +11,67 @@ console.log("isOnline", isOnline);
// https://vitejs.dev/config/ // https://vitejs.dev/config/
export default defineConfig({ export default defineConfig({
base: "/labelapp/", base: "/labelapp/",
publicDir: resolve(__dirname, "public"), publicDir: resolve(__dirname, "public"),
envDir: resolve(__dirname, "env"), envDir: resolve(__dirname, "env"),
server: { server: {
host: "0.0.0.0", host: "0.0.0.0",
port: 3004, port: 3004,
// micro-app 跨域配置 // micro-app 跨域配置
cors: true, cors: true,
headers: { headers: {
"Access-Control-Allow-Origin": "*", "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: { optimizeDeps: {
include: ["react/jsx-runtime"], include: ["react/jsx-runtime"],
}, },
plugins: [ plugins: [
react(), react(),
svgr(), svgr(),
ViteEjsPlugin(), ViteEjsPlugin(),
!process.env.DIST && process.env.NODE_ENV !== "production" && tsMonoAlias(), !process.env.DIST && process.env.NODE_ENV !== "production" && tsMonoAlias(),
].filter(Boolean), ].filter(Boolean),
resolve: { resolve: {
alias: { alias: {
"@": resolve(__dirname, "src/"), "@": resolve(__dirname, "src/"),
},
}, },
},
build: { build: {
outDir: "dist", outDir: "dist",
target: "es2015", target: "es2015",
// micro-app 需要的配置 // micro-app 需要的配置
cssCodeSplit: false, cssCodeSplit: false,
minify: "terser", minify: "terser",
terserOptions: { terserOptions: {
compress: { compress: {
drop_console: true, drop_console: true,
drop_debugger: true, drop_debugger: true,
}, },
}, },
rollupOptions: { rollupOptions: {
output: { output: {
// 确保资源路径正确 // 确保资源路径正确
assetFileNames: "assets/[name]-[hash][extname]", assetFileNames: "assets/[name]-[hash][extname]",
chunkFileNames: "assets/[name]-[hash].js", chunkFileNames: "assets/[name]-[hash].js",
entryFileNames: "assets/[name]-[hash].js", entryFileNames: "assets/[name]-[hash].js",
}, },
},
}, },
},
}); });

@ -12,6 +12,8 @@ export interface RegisterParams {
} }
export interface LoginResponse { export interface LoginResponse {
code: number
message: string
access_token: string access_token: string
token_type: string token_type: string
} }
@ -36,10 +38,28 @@ userAuthService.interceptors.request.use(
// 响应拦截器 // 响应拦截器
userAuthService.interceptors.response.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 => { error => {
if (error.response?.status === 401) { if (error.response?.status === 401) {
// 清除 token 并跳转登录 // HTTP 401 状态码,清除 token 并跳转登录
localStorage.removeItem('Access-Token') localStorage.removeItem('Access-Token')
localStorage.removeItem('Refresh-Token') localStorage.removeItem('Refresh-Token')
window.location.href = '/#/login' window.location.href = '/#/login'

@ -70,7 +70,7 @@ const rootUrl = ref('');
onMounted(() => { onMounted(() => {
const appUrl = getAppDetail('label-app')?.appUrl || ''; // 线 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 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}`; const commonUrl = config ? `tasks/${taskId}/edit` : `tasks/${taskId}/samples/${sampleId}?media_type=${media_type}`;

@ -231,7 +231,7 @@ onMounted(() => {
if (appUrl) { if (appUrl) {
baseUrl.value = appUrl; baseUrl.value = appUrl;
} else { } else {
baseUrl.value = 'http://localhost:3004/'; baseUrl.value = 'https://aistudio.ngsk.tech:7001/';
} }
}); });

@ -459,7 +459,7 @@ const previewFlowHandle = (row: any) => {
previewUrl.value = appUrl + commonUrl; previewUrl.value = appUrl + commonUrl;
microAppX.setData('flow-app-log', {...postData, server_ip: location.origin, isPreview: true}); microAppX.setData('flow-app-log', {...postData, server_ip: location.origin, isPreview: true});
} else { } 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}); microAppX.setData('flow-app-log', {...postData, server_ip: undefined, isPreview: true});
} }
}; };

@ -36,7 +36,7 @@ onMounted(() => {
microAppX.setData('flow-app', {...postData, server_ip: location.origin, isTemplate: route.query.isTemplate}); // microAppX.setData('flow-app', {...postData, server_ip: location.origin, isTemplate: route.query.isTemplate}); //
} else { } 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}); // 使 microAppX.setData('flow-app', {...postData, server_ip: undefined, isTemplate: route.query.isTemplate}); // 使
} }
}); });

@ -378,7 +378,7 @@ onMounted(async () => {
}); // }); //
} else { } 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 }); // 使 microAppX.setData('flow-app-log', { ...postData, server_ip: undefined, logBaseUrl: config.value.storage_space_base_url }); // 使
} }
}); });

@ -24,7 +24,7 @@ const router = useRouter()
const baseUrl = ref('') const baseUrl = ref('')
// //
const devUrl = 'http://localhost:3004/labelapp/' const devUrl = 'https://aistudio.ngsk.tech:7001/labelapp/'
onMounted(() => { onMounted(() => {
// URL // URL

@ -12,21 +12,29 @@
<div class="brand-section"> <div class="brand-section">
<div class="brand-content"> <div class="brand-content">
<div class="brand-icon"> <div class="brand-icon">
<el-icon :size="48"><DataAnalysis /></el-icon> <el-icon :size="48">
<DataAnalysis/>
</el-icon>
</div> </div>
<h1 class="brand-title">数据工厂</h1> <h1 class="brand-title">数据工厂</h1>
<p class="brand-desc">智能数据处理与分析平台</p> <p class="brand-desc">智能数据处理与分析平台</p>
<div class="brand-features"> <div class="brand-features">
<div class="feature-item"> <div class="feature-item">
<el-icon><Check /></el-icon> <el-icon>
<Check/>
</el-icon>
<span>数据连接与集成</span> <span>数据连接与集成</span>
</div> </div>
<div class="feature-item"> <div class="feature-item">
<el-icon><Check /></el-icon> <el-icon>
<Check/>
</el-icon>
<span>流程自动化处理</span> <span>流程自动化处理</span>
</div> </div>
<div class="feature-item"> <div class="feature-item">
<el-icon><Check /></el-icon> <el-icon>
<Check/>
</el-icon>
<span>智能数据标注</span> <span>智能数据标注</span>
</div> </div>
</div> </div>
@ -83,7 +91,8 @@
</el-form-item> </el-form-item>
<el-form-item> <el-form-item>
<div class="register-link"> <div class="register-link">
还没有账号<router-link to="/register">立即注册</router-link> 还没有账号
<router-link to="/register">立即注册</router-link>
</div> </div>
</el-form-item> </el-form-item>
</el-form> </el-form>
@ -94,10 +103,10 @@
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import { User, Lock, DataAnalysis, Check } from '@element-plus/icons-vue' import {User, Lock, DataAnalysis, Check} from '@element-plus/icons-vue'
import { ElMessage, FormInstance, FormRules } from 'element-plus' import {ElMessage, FormInstance, FormRules} from 'element-plus'
import { useUserStore } from '@/stores/modules/user' import {useUserStore} from '@/stores/modules/user'
import { useRouter, useRoute } from 'vue-router' import {useRouter, useRoute} from 'vue-router'
const router = useRouter() const router = useRouter()
const route = useRoute() const route = useRoute()
@ -114,11 +123,11 @@ const loginForm = reactive({
const loginRules: FormRules = { const loginRules: FormRules = {
username: [ username: [
{ required: true, message: '请输入用户名', trigger: 'blur' }, {required: true, message: '请输入用户名', trigger: 'blur'},
{ min: 1, max: 50, message: '用户名长度不超过50字符', trigger: 'blur' } {min: 1, max: 50, message: '用户名长度不超过50字符', trigger: 'blur'}
], ],
password: [ password: [
{ required: true, message: '请输入密码', trigger: 'blur' } {required: true, message: '请输入密码', trigger: 'blur'}
] ]
} }
@ -127,7 +136,7 @@ onMounted(() => {
const savedCredentials = localStorage.getItem('login-credentials') const savedCredentials = localStorage.getItem('login-credentials')
if (savedCredentials) { if (savedCredentials) {
try { try {
const { username, password } = JSON.parse(atob(savedCredentials)) const {username, password} = JSON.parse(atob(savedCredentials))
loginForm.username = username || '' loginForm.username = username || ''
loginForm.password = password || '' loginForm.password = password || ''
} catch (e) { } catch (e) {
@ -153,7 +162,7 @@ const handleLogin = async () => {
if (rememberPassword.value) { if (rememberPassword.value) {
localStorage.setItem( localStorage.setItem(
'login-credentials', 'login-credentials',
btoa(JSON.stringify({ username: loginForm.username, password: loginForm.password })) btoa(JSON.stringify({username: loginForm.username, password: loginForm.password}))
) )
} else { } else {
localStorage.removeItem('login-credentials') localStorage.removeItem('login-credentials')
@ -247,9 +256,8 @@ const handleLogin = async () => {
content: ''; content: '';
position: absolute; position: absolute;
inset: 0; inset: 0;
background: background: radial-gradient(circle at 20% 80%, rgba(255, 255, 255, 0.1) 0%, transparent 50%),
radial-gradient(circle at 20% 80%, rgba(255, 255, 255, 0.1) 0%, transparent 50%), radial-gradient(circle at 80% 20%, rgba(255, 255, 255, 0.08) 0%, transparent 50%);
radial-gradient(circle at 80% 20%, rgba(255, 255, 255, 0.08) 0%, transparent 50%);
} }
} }

@ -54,39 +54,15 @@ export default defineConfig({
}, },
// databuilder 数据工厂服务 // databuilder 数据工厂服务
'/api/databuilder': { '/api/databuilder': {
target: 'http://192.168.8.131:29380', // target: 'http://192.168.8.131:29380',
target: 'https://aistudio.ngsk.tech:7001/',
changeOrigin: true, changeOrigin: true,
rewrite: path => path.replace(/^\/api\/databuilder/, '')
}, },
// 数据工厂专用鉴权接口 // 数据工厂专用鉴权接口
'/api/databuilder/v1/': { '/api/databuilder/v1/': {
target: 'http://192.168.8.131:8084', // target: 'http://192.168.8.131:8084',
target: 'https://aistudio.ngsk.tech:7001/',
changeOrigin: true, changeOrigin: true,
rewrite: path => path.replace(/^\/api\/databuilder\/v1/, '')
},
// console API (dify agents 服务)
'/api/console': {
target: 'http://192.168.8.122:12800/console',
changeOrigin: true,
rewrite: path => path.replace(/^\/api\/console/, '')
},
// 通用 API
'/api': {
target: 'http://192.168.8.207:8084/api',
changeOrigin: true,
rewrite: path => path.replace(/^\/api/, '')
},
// 文件存储服务
'/storage': {
target: 'http://192.168.8.207:8084/storage',
changeOrigin: true,
rewrite: path => path.replace(/^\/storage/, '')
},
// 文件预览服务
'/kkpreview': {
target: 'http://192.168.8.207:8084/kkpreview',
changeOrigin: true,
rewrite: path => path.replace(/^\/kkpreview/, '')
}, },
}, },
}, },

Loading…
Cancel
Save