Bläddra i källkod

feat(config): 新增 API 配置管理模块

- 新增 api.ts 文件统一管理 API 相关的 URL 配置
- 更新多个组件中的 API 调用方式,使用新的配置模块
- 优化了环境配置和 API 地址获取逻辑
- 增加了调试信息输出,方便开发环境下的问题排查
zhou 1 månad sedan
förälder
incheckning
a37c033ecb

+ 2 - 1
src/components/Editor/index.vue

@@ -32,6 +32,7 @@ import '@vueup/vue-quill/dist/vue-quill.snow.css';
 import { QuillEditor, Quill } from '@vueup/vue-quill';
 import { propTypes } from '@/utils/propTypes';
 import { globalHeaders } from '@/utils/request';
+import { getUploadUrl } from '@/config/api';
 
 defineEmits(['update:modelValue']);
 
@@ -54,7 +55,7 @@ const { proxy } = getCurrentInstance() as ComponentInternalInstance;
 
 const upload = reactive<UploadOption>({
   headers: globalHeaders(),
-  url: import.meta.env.VITE_APP_BASE_API + '/resource/oss/upload'
+  url: getUploadUrl('oss')
 });
 const quillEditorRef = ref();
 const uploadRef = ref<HTMLDivElement>();

+ 12 - 2
src/components/FileUpload/index.vue

@@ -48,6 +48,7 @@
 import { propTypes } from '@/utils/propTypes';
 import { delOss, listByIds } from '@/api/system/oss';
 import { globalHeaders } from '@/utils/request';
+import { getUploadUrl } from '@/config/api';
 
 const props = defineProps({
   modelValue: {
@@ -72,7 +73,7 @@ const number = ref(0);
 const uploadList = ref<any[]>([]);
 
 const baseUrl = import.meta.env.VITE_APP_BASE_API;
-const uploadFileUrl = ref(baseUrl + '/resource/oss/upload'); // 上传文件服务器地址
+const uploadFileUrl = ref(getUploadUrl('oss')); // 上传文件服务器地址
 const headers = ref(globalHeaders());
 
 const fileList = ref<any[]>([]);
@@ -92,7 +93,16 @@ watch(
       let list: any[] = [];
       if (Array.isArray(val)) {
         list = val;
-      } else {
+      } else if (typeof val === 'string') {
+        const res = await listByIds(val);
+        list = res.data.map((oss) => {
+          return {
+            name: oss.originalName,
+            url: oss.url,
+            ossId: oss.ossId
+          };
+        });
+      } else if (typeof val === 'number') {
         const res = await listByIds(val);
         list = res.data.map((oss) => {
           return {

+ 2 - 1
src/components/ImageOrUrlInput/index.vue

@@ -61,6 +61,7 @@ import { listByIds, delOss } from '@/api/system/oss';
 import { OssVO } from '@/api/system/oss/types';
 import { propTypes } from '@/utils/propTypes';
 import { globalHeaders } from '@/utils/request';
+import { getUploadUrl } from '@/config/api';
 import { compressAccurately } from 'image-conversion';
 import { Plus } from '@element-plus/icons-vue';
 
@@ -99,7 +100,7 @@ const urlValue = ref('');
 const isValidUrl = ref(false);
 
 const baseUrl = import.meta.env.VITE_APP_BASE_API;
-const uploadImgUrl = ref(baseUrl + '/resource/oss/upload');
+const uploadImgUrl = ref(getUploadUrl('oss'));
 const headers = ref(globalHeaders());
 
 const fileList = ref<any[]>([]);

+ 2 - 1
src/components/ImageUpload/index.vue

@@ -45,6 +45,7 @@ import { listByIds, delOss } from '@/api/system/oss';
 import { OssVO } from '@/api/system/oss/types';
 import { propTypes } from '@/utils/propTypes';
 import { globalHeaders } from '@/utils/request';
+import { getUploadUrl } from '@/config/api';
 import { compressAccurately } from 'image-conversion';
 
 const props = defineProps({
@@ -80,7 +81,7 @@ const dialogImageUrl = ref('');
 const dialogVisible = ref(false);
 
 const baseUrl = import.meta.env.VITE_APP_BASE_API;
-const uploadImgUrl = ref(baseUrl + '/resource/oss/upload'); // 上传的图片服务器地址
+const uploadImgUrl = ref(getUploadUrl('oss')); // 上传的图片服务器地址
 const headers = ref(globalHeaders());
 
 const fileList = ref<any[]>([]);

+ 2 - 1
src/components/ImageUploadCropper/index.vue

@@ -138,6 +138,7 @@ import { listByIds, delOss } from '@/api/system/oss';
 import { OssVO } from '@/api/system/oss/types';
 import { propTypes } from '@/utils/propTypes';
 import { globalHeaders } from '@/utils/request';
+import { getUploadUrl } from '@/config/api';
 import { compressAccurately } from 'image-conversion';
 import { UploadRawFile } from 'element-plus';
 
@@ -200,7 +201,7 @@ const dialogVisible = ref(false);
 const cropperVisible = ref(false);
 
 const baseUrl = import.meta.env.VITE_APP_BASE_API;
-const uploadImgUrl = ref(baseUrl + '/resource/oss/upload'); // 上传的图片服务器地址
+const uploadImgUrl = ref(getUploadUrl('oss')); // 上传的图片服务器地址
 const headers = ref(globalHeaders());
 
 const fileList = ref<any[]>([]);

+ 127 - 0
src/config/api.ts

@@ -0,0 +1,127 @@
+/**
+ * API配置管理
+ * 统一管理所有API相关的URL配置,避免在多个地方重复修改
+ */
+
+// 环境配置
+const isDev = import.meta.env.DEV;
+const isProd = import.meta.env.PROD;
+
+// 基础API地址配置
+const API_CONFIG = {
+  // 开发环境
+  development: import.meta.env.VITE_APP_BASE_API,
+  // 生产环境
+  production: 'http://meet2.sportsrobo.club:8080',
+  // 测试环境
+  test: 'http://192.168.1.126:8080',
+  // 本地环境
+  local: 'http://localhost:8080'
+};
+
+// 获取当前环境的API基础地址
+export const getBaseURL = (): string => {
+  // 优先使用环境变量中的配置
+  if (import.meta.env.VITE_APP_BASE_API) {
+    return import.meta.env.VITE_APP_BASE_API;
+  }
+  
+  // 根据环境自动选择
+  if (isDev) {
+    return API_CONFIG.development;
+  } else if (isProd) {
+    return API_CONFIG.production;
+  }
+  
+  // 默认返回开发环境配置
+  return API_CONFIG.development;
+};
+
+// 导出基础URL
+export const BASE_URL = getBaseURL();
+
+// 常用API端点
+export const API_ENDPOINTS = {
+  // 文件上传相关
+  UPLOAD: '/resource/oss/upload',
+  UPLOAD_COMMON: '/common/upload',
+  DOWNLOAD: '/resource/oss/download',
+  
+  // 系统相关
+  USER_IMPORT: '/system/user/importData',
+  GAME_TEAM_IMPORT: '/system/gameTeam/import',
+  GAME_ATHLETE_IMPORT: '/system/gameAthlete/import',
+  ENROLL_IMPORT: '/system/enroll/importData',
+  
+  // WebSocket和SSE
+  WEBSOCKET: '/resource/websocket',
+  SSE: '/resource/sse',
+  
+  // 工作流
+  WORKFLOW_UI: '/warm-flow-ui/index.html'
+} as const;
+
+// 获取完整的API URL
+export const getApiUrl = (endpoint: string): string => {
+  return `${BASE_URL}${endpoint}`;
+};
+
+// 获取上传URL
+export const getUploadUrl = (type: 'oss' | 'common' = 'oss'): string => {
+  const endpoint = type === 'oss' ? API_ENDPOINTS.UPLOAD : API_ENDPOINTS.UPLOAD_COMMON;
+  return getApiUrl(endpoint);
+};
+
+// 获取下载URL
+export const getDownloadUrl = (filePath: string): string => {
+  return getApiUrl(`${API_ENDPOINTS.DOWNLOAD}/${filePath}`);
+};
+
+// 获取文件完整URL
+export const getFileUrl = (filePath: string): string => {
+  if (filePath.startsWith('http')) {
+    return filePath;
+  }
+  return `${BASE_URL}${filePath}`;
+};
+
+// 获取工作流URL
+export const getWorkflowUrl = (id: string, disabled: boolean = false, type: string = 'FlowChart'): string => {
+  const params = new URLSearchParams({
+    id,
+    disabled: disabled.toString(),
+    type,
+    t: Date.now().toString()
+  });
+  return getApiUrl(`${API_ENDPOINTS.WORKFLOW_UI}?${params.toString()}`);
+};
+
+// 导出配置对象,方便调试
+export const API_CONFIG_DEBUG = {
+  currentEnv: isDev ? 'development' : 'production',
+  baseURL: BASE_URL,
+  endpoints: API_ENDPOINTS,
+  isDev,
+  isProd,
+  envVars: {
+    VITE_APP_BASE_API: import.meta.env.VITE_APP_BASE_API,
+    VITE_APP_CLIENT_ID: import.meta.env.VITE_APP_CLIENT_ID
+  }
+};
+
+// 在开发环境下打印环境信息
+if (isDev) {
+  console.log(' API配置信息:', API_CONFIG_DEBUG);
+  console.log(' 当前使用的API地址:', BASE_URL);
+}
+
+// 手动切换环境的函数(仅用于调试)
+export const switchEnvironment = (env: 'development' | 'production' | 'test' | 'local') => {
+  if (isDev) {
+    console.warn(' 手动切换环境仅用于调试,实际部署时请使用环境变量');
+    const newBaseURL = API_CONFIG[env];
+    console.log(` 切换到 ${env} 环境:`, newBaseURL);
+    return newBaseURL;
+  }
+  return BASE_URL;
+};

+ 2 - 1
src/utils/request.ts

@@ -11,6 +11,7 @@ import { getLanguage } from '@/lang';
 import { encryptBase64, encryptWithAes, generateAesKey, decryptWithAes, decryptBase64 } from '@/utils/crypto';
 import { encrypt, decrypt } from '@/utils/jsencrypt';
 import router from '@/router';
+import { BASE_URL } from '@/config/api';
 
 const encryptHeader = 'encrypt-key';
 let downloadLoadingInstance: LoadingInstance;
@@ -27,7 +28,7 @@ axios.defaults.headers['Content-Type'] = 'application/json;charset=utf-8';
 axios.defaults.headers['clientid'] = import.meta.env.VITE_APP_CLIENT_ID;
 // 创建 axios 实例
 const service = axios.create({
-  baseURL: import.meta.env.VITE_APP_BASE_API,
+  baseURL: BASE_URL,
   // baseURL: 'http://192.168.1.126:8080',
   // baseURL: 'http://meet2.sportsrobo.club:8080',
   // baseURL: 'http://localhost:8080',