优化jingrowServerUrl实现

This commit is contained in:
jingrow 2025-10-11 03:07:19 +08:00
parent 30a89e3cc2
commit 21d530fb7b
10 changed files with 44 additions and 114 deletions

View File

@ -1,9 +0,0 @@
# Netscape HTTP Cookie File
# https://curl.se/docs/http-cookies.html
# This file was generated by libcurl! Edit at your own risk.
#HttpOnly_192.168.2.58 FALSE / FALSE 1760124244 sid Guest
192.168.2.58 FALSE / FALSE 0 system_user no
192.168.2.58 FALSE / FALSE 0 full_name Guest
192.168.2.58 FALSE / FALSE 0 user_id Guest
192.168.2.58 FALSE / FALSE 0 user_image

View File

@ -0,0 +1,5 @@
## 前端环境变量 (Vite会读取VITE_前缀的变量)
# 开发环境前端使用相对路径通过Vite代理转发
# 生产环境:前端直接请求后端服务器
VITE_JINGROW_SERVER_URL=
VITE_BACKEND_SERVER_URL=

View File

@ -1,80 +0,0 @@
# Jingrow Local 环境变量配置
## 快速开始
1. **复制环境变量文件**
```bash
cp env.example .env.local
```
2. **编辑配置**
```bash
vim .env.local
```
3. **重启开发服务器**
```bash
npm run dev
```
## 环境变量说明
### Jingrow SaaS配置
- `VITE_JINGROW_API_URL`: Jingrow SaaS API地址
- 默认值: `https://cloud.jingrow.com`
- 用途: 登录、用户信息、数据存储等API调用
### 本地API配置
- `VITE_LOCAL_API_URL`: 本地API服务地址
- 默认值: `http://localhost:8000`
- 用途: 本地微服务API调用
### 应用配置
- `VITE_APP_NAME`: 应用名称
- 默认值: `Jingrow Local`
- `VITE_APP_VERSION`: 应用版本
- 默认值: `1.0.0`
## 不同环境配置
### 开发环境 (.env.local)
```env
VITE_JINGROW_API_URL=https://cloud.jingrow.com
VITE_LOCAL_API_URL=http://localhost:8000
VITE_APP_NAME=Jingrow Local Dev
```
### 测试环境 (.env.test)
```env
VITE_JINGROW_API_URL=https://test.jingrow.com
VITE_LOCAL_API_URL=http://test-api:8000
VITE_APP_NAME=Jingrow Local Test
```
### 生产环境 (.env.production)
```env
VITE_JINGROW_API_URL=https://cloud.jingrow.com
VITE_LOCAL_API_URL=https://api.jingrow.com
VITE_APP_NAME=Jingrow Local
```
## 注意事项
1. **Vite环境变量**:必须以 `VITE_` 开头才能在客户端访问
2. **敏感信息**不要在环境变量中存储敏感信息如API密钥
3. **版本控制**`.env.local` 文件不应提交到版本控制系统
4. **重启服务**:修改环境变量后需要重启开发服务器
## 使用示例
在代码中使用环境变量:
```typescript
import env from '@/config/env'
// 获取Jingrow API地址
const apiUrl = env.JINGROW_API_URL
// 获取应用名称
const appName = env.APP_NAME
```

View File

@ -7,7 +7,7 @@ import { deleteRecords, createRecord, updateRecord, getFieldSelectOptions, getRe
export type { AIAgent, AgentExecutionResult }
// 使用相对路径通过Vite代理转发到后端
const BACKEND_SERVER_URL = ''
const jingrowServerUrl = import.meta.env.VITE_JINGROW_SERVER_URL || ''
// 获取Jingrow API鉴权头部
function get_jingrow_api_headers() {
@ -31,7 +31,7 @@ function get_jingrow_api_headers() {
// 获取AI Agent列表
export const getAgentsApi = async (): Promise<AIAgent[]> => {
try {
const url = `${BACKEND_SERVER_URL}/api/action/jingrow.ai.utils.jflow.get_local_ai_agents_list`
const url = `${jingrowServerUrl}/api/action/jingrow.ai.utils.jflow.get_local_ai_agents_list`
const requestData = {
filters: [],
@ -84,7 +84,7 @@ export const getAgentDetail = async (name: string): Promise<AIAgent> => {
export const executeAgentApi = async (name: string): Promise<{ success: boolean; message?: string }> => {
try {
const response = await axios.post(
`${BACKEND_SERVER_URL}/api/action/jingrow.ai.utils.jflow.execute_local_ai_agent`,
`${jingrowServerUrl}/api/action/jingrow.ai.utils.jflow.execute_local_ai_agent`,
{
name: name
},
@ -117,7 +117,7 @@ export const executeAgentApi = async (name: string): Promise<{ success: boolean;
export const updateAgentApi = async (name: string, data: Partial<AIAgent>): Promise<AIAgent> => {
try {
const response = await axios.post(
`${BACKEND_SERVER_URL}/api/action/jingrow.ai.utils.jflow.update_local_ai_agent`,
`${jingrowServerUrl}/api/action/jingrow.ai.utils.jflow.update_local_ai_agent`,
{
name: name,
data: data

View File

@ -1,3 +1,5 @@
const jingrowServerUrl = import.meta.env.VITE_JINGROW_SERVER_URL || ''
export interface LoginResponse {
message: string
user: UserInfo
@ -28,7 +30,7 @@ export function getSessionCookie(): string | null {
}
export const loginApi = async (username: string, password: string): Promise<LoginResponse> => {
const response = await fetch('/api/action/login', {
const response = await fetch(`${jingrowServerUrl}/api/action/login`, {
method: 'POST',
headers: {
'Content-Type': 'application/x-www-form-urlencoded',
@ -58,7 +60,7 @@ export const loginApi = async (username: string, password: string): Promise<Logi
// 获取用户信息
export const getUserInfoApi = async (): Promise<UserInfo> => {
const response = await fetch('/api/action/jingrow.realtime.get_user_info', {
const response = await fetch(`${jingrowServerUrl}/api/action/jingrow.realtime.get_user_info`, {
method: 'GET',
headers: {
'Accept': 'application/json',
@ -87,7 +89,7 @@ export const getUserInfoApi = async (): Promise<UserInfo> => {
// 登出
export const logoutApi = async (): Promise<void> => {
await fetch('/api/action/logout', {
await fetch(`${jingrowServerUrl}/api/action/logout`, {
method: 'GET',
headers: { 'Accept': 'application/json' },
credentials: 'include'

View File

@ -1,7 +1,7 @@
import axios from 'axios'
import { get_session_api_headers } from './auth'
const BACKEND_SERVER_URL = ''
const jingrowServerUrl = import.meta.env.VITE_JINGROW_SERVER_URL || ''
// 删除记录的通用函数
export const deleteRecords = async (pagetype: string, names: string[]): Promise<{ success: boolean; message?: string }> => {
@ -13,7 +13,7 @@ export const deleteRecords = async (pagetype: string, names: string[]): Promise<
for (const name of names) {
try {
await axios.post(
`${BACKEND_SERVER_URL}/api/action/jingrow.client.delete`,
`${jingrowServerUrl}/api/action/jingrow.client.delete`,
{
pagetype: pagetype,
name: name
@ -47,7 +47,7 @@ export const deleteRecords = async (pagetype: string, names: string[]): Promise<
export const createRecord = async (pagetype: string, data: Record<string, any>): Promise<{ success: boolean; data?: any; message?: string }> => {
try {
const response = await axios.post(
`${BACKEND_SERVER_URL}/api/data/${pagetype}`,
`${jingrowServerUrl}/api/data/${pagetype}`,
data,
{
headers: get_session_api_headers(),
@ -67,7 +67,7 @@ export const createRecord = async (pagetype: string, data: Record<string, any>):
export const updateRecord = async (pagetype: string, name: string, data: Record<string, any>): Promise<{ success: boolean; data?: any; message?: string }> => {
try {
const response = await axios.put(
`${BACKEND_SERVER_URL}/api/data/${pagetype}/${name}`,
`${jingrowServerUrl}/api/data/${pagetype}/${name}`,
data,
{
headers: get_session_api_headers(),
@ -86,7 +86,7 @@ export const updateRecord = async (pagetype: string, name: string, data: Record<
export const getRecord = async (pagetype: string, name: string): Promise<{ success: boolean; data?: any; message?: string }> => {
try {
const response = await axios.get(
`${BACKEND_SERVER_URL}/api/data/${pagetype}/${name}`,
`${jingrowServerUrl}/api/data/${pagetype}/${name}`,
{
headers: get_session_api_headers(),
withCredentials: true
@ -107,7 +107,7 @@ export const getWorkspace = async (name: string): Promise<{ success: boolean; da
export const getRecords = async (pagetype: string, filters: any[] = [], fields: string[] = [], orderBy: string = 'modified desc', limitStart: number = 0, limitPageLength: number = 20): Promise<{ success: boolean; data?: any[]; total?: number; message?: string }> => {
try {
const response = await axios.get(
`${BACKEND_SERVER_URL}/api/data/${pagetype}`,
`${jingrowServerUrl}/api/data/${pagetype}`,
{
params: {
fields: JSON.stringify(fields),
@ -145,7 +145,7 @@ export const getRecords = async (pagetype: string, filters: any[] = [], fields:
export const getFieldSelectOptions = async (pagetype: string, fieldname: string): Promise<string[]> => {
try {
const res = await axios.post(
`${BACKEND_SERVER_URL}/api/action/jingrow.ai.utils.utils.get_field_select_options`,
`${jingrowServerUrl}/api/action/jingrow.ai.utils.utils.get_field_select_options`,
{ pagetype, fieldname },
{ headers: get_session_api_headers(), withCredentials: true }
)
@ -179,7 +179,7 @@ export const uploadFileToJingrow = async (
}
const response = await axios.post(
`${BACKEND_SERVER_URL}/api/action/upload_file`,
`${jingrowServerUrl}/api/action/upload_file`,
formData,
{
headers: {

View File

@ -2,7 +2,7 @@ import axios from 'axios'
import { get_session_api_headers } from './auth'
import { deleteRecords, createRecord, getFieldSelectOptions } from './common'
const BACKEND_SERVER_URL = ''
const jingrowServerUrl = import.meta.env.VITE_JINGROW_SERVER_URL || ''
// 使用通用函数,这里可以保留别名或直接使用
export { getFieldSelectOptions as getNodeFieldSelectOptions } from './common'
@ -16,7 +16,7 @@ export const checkNodeTypeExists = async (nodeType: string): Promise<boolean> =>
if (!nodeType) return false
try {
const response = await axios.post(
`${BACKEND_SERVER_URL}/api/action/jingrow.ai.utils.jflow.check_node_type_exists`,
`${jingrowServerUrl}/api/action/jingrow.ai.utils.jflow.check_node_type_exists`,
{ node_type: nodeType },
{ headers: get_session_api_headers(), withCredentials: true }
)
@ -41,7 +41,7 @@ export const deleteNodes = async (names: string[]): Promise<{ success: boolean;
export const getNodeRecord = async (name: string): Promise<any> => {
try {
const response = await axios.get(
`${BACKEND_SERVER_URL}/api/action/jingrow.ai.utils.jflow.get_node_record`,
`${jingrowServerUrl}/api/action/jingrow.ai.utils.jflow.get_node_record`,
{
params: { name },
headers: get_session_api_headers(),
@ -59,7 +59,7 @@ export const getNodeRecord = async (name: string): Promise<any> => {
export const updateNode = async (name: string, nodeData: any): Promise<any> => {
try {
const response = await axios.post(
`${BACKEND_SERVER_URL}/api/action/jingrow.ai.utils.jflow.update_node`,
`${jingrowServerUrl}/api/action/jingrow.ai.utils.jflow.update_node`,
{ name, node_data: nodeData },
{ headers: get_session_api_headers(), withCredentials: true }
)
@ -74,7 +74,7 @@ export const updateNode = async (name: string, nodeData: any): Promise<any> => {
export const getNodeByType = async (nodeType: string): Promise<any> => {
try {
const response = await axios.post(
`${BACKEND_SERVER_URL}/api/action/jingrow.ai.utils.jflow.get_node_by_type`,
`${jingrowServerUrl}/api/action/jingrow.ai.utils.jflow.get_node_by_type`,
{ node_type: nodeType },
{ headers: get_session_api_headers(), withCredentials: true }
)
@ -89,7 +89,7 @@ export const getNodeByType = async (nodeType: string): Promise<any> => {
export const getNodeSchemaFields = async (nodeType: string): Promise<any[]> => {
try {
const response = await axios.post(
`${BACKEND_SERVER_URL}/api/action/jingrow.ai.utils.jflow.get_node_schema_fields`,
`${jingrowServerUrl}/api/action/jingrow.ai.utils.jflow.get_node_schema_fields`,
{ node_type: nodeType },
{ headers: get_session_api_headers(), withCredentials: true }
)
@ -109,7 +109,7 @@ export const getNodeList = async (page: number = 1, pageSize: number = 10): Prom
})
const response = await axios.get(
`${BACKEND_SERVER_URL}/api/action/jingrow.ai.utils.jflow.get_node_list?${params}`,
`${jingrowServerUrl}/api/action/jingrow.ai.utils.jflow.get_node_list?${params}`,
{ headers: get_session_api_headers(), withCredentials: true }
)
return response.data?.message || response.data

View File

@ -3,7 +3,8 @@
"target": "ES2020",
"useDefineForClassFields": true,
"lib": ["ES2020", "DOM", "DOM.Iterable"],
"module": "ESNext",
"module": "ES2022",
"types": ["vite/client"],
"skipLibCheck": true,
"moduleResolution": "bundler",
"allowImportingTsExtensions": true,
@ -20,6 +21,6 @@
"@/*": ["src/*"]
}
},
"include": ["src/**/*.ts", "src/**/*.d.ts", "src/**/*.tsx", "src/**/*.vue"],
"include": ["src/**/*.ts", "src/**/*.d.ts", "src/**/*.tsx", "src/**/*.vue", "vite-env.d.ts"],
"references": [{ "path": "./tsconfig.node.json" }]
}

11
frontend/vite-env.d.ts vendored Normal file
View File

@ -0,0 +1,11 @@
/// <reference types="vite/client" />
interface ImportMetaEnv {
readonly VITE_JINGROW_SERVER_URL: string
readonly VITE_BACKEND_SERVER_URL: string
// 更多环境变量...
}
interface ImportMeta {
readonly env: ImportMetaEnv
}

View File

@ -17,7 +17,7 @@ export default defineConfig({
resolvers: [
IconsResolver({
prefix: 'i',
enabledCollections: ['tabler'] // 只启用Tabler图标
enabledCollections: ['tabler']
}),
],
}),