Browse Source

Merge remote-tracking branch 'origin/uat' into uat

dujian 1 day ago
parent
commit
d10910c5d0

+ 10 - 7
.env.production

@@ -35,21 +35,24 @@ VITE_API_URL_PLATFORM = /api/alienStorePlatform
 VITE_PROXY = [["/alienStore","http://120.26.186.130:8000/alienStore"]]
 
 # AI接口
-VITE_PROXY_AI = [["/ai-api","http://124.93.18.180:9000"]]
+VITE_PROXY_AI = [["/ai-api","http://183.252.196.135:9000"]]
+
+# 封面合规审核(预生产端口 9300;正式环境若端口不同请改此处或 nginx 反代为同源路径)
+VITE_COVER_AUDIT_BASE = http://183.252.196.135:9500
 
 # WebSocket:HTTPS 部署下「联系业主」等页面会使用 getWebSocketBase() → wss://当前访问域名/alienStore/socket
 # 可不配置 VITE_WS_BASE,避免写死域名与实际上线域名不一致。仅 HTTP/本地联调时再配 ws/wss。
 # VITE_WS_BASE = wss://test.ailien.shop/alienStore/socket
 
-# 上传请求:不配则走同源 /ai-upload(Nginx 反代示例
+# 上传请求:不配则走同源 /ai-upload/upload/simple(Nginx 反代至 uat 上传服务,避免 prod 直连 uat 产生 CORS
 # location /ai-upload/ {
-#   proxy_pass https://upload.ailien.shop:8443/;
-#   proxy_set_header Host upload.ailien.shop;
+#   proxy_pass https://uat.ailien.shop/;
+#   proxy_set_header Host uat.ailien.shop;
 #   proxy_ssl_server_name on;
 # }
-# 仅在上传服务已配置完整 CORS 时才直连:
-# VITE_AI_UPLOAD_BASE = https://upload.ailien.shop:8443
-# VITE_AI_FILES_PUBLIC_BASE = https://upload.ailien.shop:8443/files
+# 仅在上传服务已配置完整 CORS 时才直连 uat 域名
+# VITE_AI_UPLOAD_BASE = https://uat.ailien.shop
+# VITE_AI_FILES_PUBLIC_BASE = https://uat.ailien.shop/files
 
 # 接口加密配置
 # 加密功能总开关

+ 14 - 3
.env.test

@@ -2,7 +2,8 @@
 VITE_USER_NODE_ENV = test
 
 # 公共基础路径
-VITE_PUBLIC_PATH = /
+VITE_PUBLIC_PATH = /group_web_merchant/
+# VITE_PUBLIC_PATH = /
 
 # 路由模式
 # Optional: hash | history
@@ -26,12 +27,22 @@ VITE_PWA = false
 
 # 生产环境接口地址
 VITE_API_URL = /api
+VITE_API_URL_STORE = /alienStore
+VITE_API_URL = /alienStore
+VITE_API_URL_SECOND = /alienSecond
+VITE_API_URL_PLATFORM = /alienStorePlatform
+# VITE_API_URL_STORE = /api/alienStore
+# VITE_API_URL = /api/alienStore
+# VITE_API_URL_SECOND = /api/alienSecond
+# VITE_API_URL_PLATFORM = /api/alienStorePlatform
+
+
 
 # 测试环境跨域代理,支持配置多个
 VITE_PROXY = [["/api","http://120.26.186.130:8000"],["/ai-upload","https://uat.ailien.shop"]] 
 
-# 简单上传与 Tus:与 UAT 上传服务一致(不配则默认同源 /ai-upload,测试部署在非 uat 域名时常 404)
-VITE_AI_UPLOAD_BASE = https://uat.ailien.shop
+# 简单上传与 Tus:走同源 /ai-upload,由 Nginx 反代至 uat(勿直连 uat 域名,跨域会 CORS
+# VITE_AI_UPLOAD_BASE = https://uat.ailien.shop
 
 # 接口加密配置
 # 加密功能总开关

+ 43 - 0
.env.uat

@@ -0,0 +1,43 @@
+# 本地环境
+VITE_USER_NODE_ENV = production
+
+# 公共基础路径
+VITE_PUBLIC_PATH = /group_web_merchant/
+# VITE_PUBLIC_PATH = /
+
+# 路由模式
+# Optional: hash | history
+VITE_ROUTER_MODE = hash
+
+# 打包时是否删除 console
+VITE_DROP_CONSOLE = true
+
+# 是否开启 VitePWA
+VITE_PWA = false
+
+# 开发环境接口地址
+# VITE_API_URL_STORE = /api  # 开发环境使用
+VITE_API = /api
+VITE_API_URL_STORE = /api/alienStore #生产环境使用
+VITE_API_URL = /api/alienStore
+VITE_API_URL_SECOND = /api/alienSecond
+VITE_API_URL_PLATFORM = /api/alienStorePlatform
+
+# 代理
+VITE_PROXY = [["/api","https://uat.ailien.shop"]]
+
+# WebSocket 基础地址(分享等能力,与商家端一致)
+VITE_WS_BASE = wss://uat.ailien.shop/alienStore/socket/
+
+# 封面合规审核(需服务端 CORS 或 Nginx 反代)
+VITE_COVER_AUDIT_BASE = http://183.252.196.135:9300
+
+# 接口加密配置
+# 加密功能总开关
+VITE_API_ENCRYPTION_ENABLED = false
+
+# AES 密钥(16字节)
+VITE_CRYPTO_KEY = alien67890982316
+
+# AES 向量(16字节)
+VITE_CRYPTO_IV = 1234560405060708

+ 1 - 0
package.json

@@ -37,6 +37,7 @@
     "serve": "vite",
     "build:dev": "vite build --mode development",
     "build:test": "vite build --mode test",
+    "build:uat": "vite build --mode uat",
     "build:pro": "vite build --mode production",
     "type:check": "vue-tsc --noEmit --skipLibCheck",
     "preview": "pnpm build:dev && vite preview",

+ 3 - 9
src/api/modules/aiImageUpload.ts

@@ -2,7 +2,7 @@
  * Web 端:Tus 分片上传(与 Apifox / uni 版协议对齐);独立审核走上传服务 /upload/simple 等,不再调用 verify 审核域
  */
 import { useUserStore } from "@/stores/modules/user";
-import { AI_UPLOAD_FILES_PUBLIC_BASE, BASE_AI_URL, BASE_DEV_UPLOAD_SIMPLE } from "@/utils/config";
+import { AI_UPLOAD_FILES_PUBLIC_BASE, BASE_AI_URL, SIMPLE_UPLOAD_URL } from "@/utils/config";
 import { withSimpleUploadOverlay } from "@/utils/withSimpleUploadOverlay";
 
 const TUS_VERSION = "1.0.0";
@@ -117,19 +117,13 @@ function normalizeSimpleUploadUrls(body: unknown, fileUrl: string): { fileUrl: s
   return { fileUrl: url, coverUrl: coverUrl || undefined };
 }
 
-const DEV_SIMPLE_UPLOAD_PATH = "/upload/simple";
-
 function buildDevSimpleUploadRequestUrl(): string {
-  const base = String(BASE_DEV_UPLOAD_SIMPLE || "").replace(/\/$/, "");
-  if (base) {
-    return `${base}${DEV_SIMPLE_UPLOAD_PATH}`;
-  }
-  return DEV_SIMPLE_UPLOAD_PATH;
+  return String(SIMPLE_UPLOAD_URL || "").trim();
 }
 
 /**
  * 官方相册等:multipart 直传(替代 Tus `POST .../upload`)
- * POST `/dev-upload-ailien/upload/simple`,表单字段 `file`
+ * POST 同源 simple 上传(与全局 upload.js 一致,Nginx 反代至 uat),表单字段 `file`
  */
 export async function uploadFileViaDevSimpleEndpoint(file: File): Promise<{ fileUrl: string; coverUrl?: string }> {
   return withSimpleUploadOverlay(async signal => {

+ 4 - 8
src/api/upload.js

@@ -1,12 +1,9 @@
 import { useUserStore } from "@/stores/modules/user";
 import { useSimpleUploadOverlayStore } from "@/stores/modules/simpleUploadOverlay";
 import { ElMessage } from "element-plus";
-import { AI_UPLOAD_FILES_PUBLIC_BASE, BASE_AI_URL } from "@/utils/config";
+import { AI_UPLOAD_FILES_PUBLIC_BASE, SIMPLE_UPLOAD_URL } from "@/utils/config";
 import { withSimpleUploadOverlay } from "@/utils/withSimpleUploadOverlay";
 
-/** 简单上传的路径(不含 base) */
-const SIMPLE_UPLOAD_PATH = "/upload/simple";
-
 /**
  * 已由 uploadFilesToOss 弹出过 ElMessage,调用方勿重复 error
  * @param {unknown} err
@@ -389,9 +386,9 @@ function assertSimpleUploadBusinessOk(parsed) {
  * @returns {Promise<{ url: string; downloadUrl: string; parsed: unknown }>}
  */
 async function postFileToSimpleUploadDetailed(file, fetchOptions = {}) {
-  const base = String(BASE_AI_URL || "").replace(/\/$/, "");
-  if (!base) {
-    throw new Error("未配置上传服务地址(VITE_AI_UPLOAD_BASE 或默认 /ai-upload)");
+  const uploadUrl = String(SIMPLE_UPLOAD_URL || "").trim();
+  if (!uploadUrl) {
+    throw new Error("简单上传服务地址未配置");
   }
 
   const formData = new FormData();
@@ -406,7 +403,6 @@ async function postFileToSimpleUploadDetailed(file, fetchOptions = {}) {
 
   const { signal } = fetchOptions;
 
-  const uploadUrl = `${base}${SIMPLE_UPLOAD_PATH}`;
   let res;
   try {
     res = await fetch(uploadUrl, {

+ 0 - 2
src/typings/global.d.ts

@@ -68,8 +68,6 @@ declare interface ViteEnv {
   VITE_AI_UPLOAD_BASE?: string;
   /** 上传完成后对外访问 URL 前缀 */
   VITE_AI_FILES_PUBLIC_BASE?: string;
-  /** 可选;官方相册视频 simple 上传服务根,不配则开发走相对路径 /dev-upload-ailien/...、生产默认 upload.ailien.shop:8443 */
-  VITE_DEV_UPLOAD_SIMPLE_BASE?: string;
 }
 
 interface ImportMetaEnv extends ViteEnv {

+ 8 - 9
src/utils/config.ts

@@ -1,21 +1,20 @@
 /**
  * Tus / simple 上传服务「请求」基址(与 uni 端对齐)
- * - 未配置 VITE_AI_UPLOAD_BASE 时默认 **同源相对路径 `/ai-upload`**,由 Vite 开发代理或 Nginx 反代到实际上传域,避免浏览器直连 upload 域产生跨域。
+ * - 未配置 VITE_AI_UPLOAD_BASE 时默认 **同源相对路径 `/ai-upload`**,由 Vite 开发代理或 Nginx 反代到 https://uat.ailien.shop,避免浏览器直连上传域产生跨域。
  * - 若必须浏览器直连上传 HTTPS 域名,请在 .env 设置 VITE_AI_UPLOAD_BASE,并确保该域已正确配置 CORS(含 Authorization、OPTIONS)。
  */
 const trimSlash = (s: string) => s.replace(/\/$/, "");
 
 export const BASE_AI_URL = trimSlash(String(import.meta.env.VITE_AI_UPLOAD_BASE || "").trim() || "/ai-upload");
 
+/**
+ * multipart 简单上传:浏览器走同源 `${BASE_AI_URL}/upload/simple`(默认 `/ai-upload/upload/simple`),
+ * 经 Vite/Nginx 反代后实际上传至 https://uat.ailien.shop/upload/simple。
+ * 勿在 prod/test 等环境打包为直链 uat 域名,否则会 CORS。
+ */
+export const SIMPLE_UPLOAD_URL = `${BASE_AI_URL}/upload/simple`;
+
 /** 上传完成后对外可访问的文件 URL:`${AI_UPLOAD_FILES_PUBLIC_BASE}/${uploadId}` */
 export const AI_UPLOAD_FILES_PUBLIC_BASE = trimSlash(
   String(import.meta.env.VITE_AI_FILES_PUBLIC_BASE || "").trim() || "https://uat.ailien.shop/files"
 );
-
-/**
- * 官方相册视频等:POST multipart 至 `/dev-upload-ailien/upload/simple`(非 Tus)
- * 不配时:开发环境请求同源相对路径(需在 VITE_PROXY 中把 `/dev-upload-ailien` 指到上传服务);生产默认 upload.ailien.shop:8443
- */
-export const BASE_DEV_UPLOAD_SIMPLE = trimSlash(
-  String(import.meta.env.VITE_DEV_UPLOAD_SIMPLE_BASE || "").trim() || (import.meta.env.DEV ? "" : "https://uat.ailien.shop")
-);

+ 14 - 6
src/views/home/components/go-flow.vue

@@ -27,6 +27,7 @@
             <div class="upload-label">正面</div>
             <el-upload
               v-model:file-list="idCardFrontList"
+              action="#"
               :http-request="handleHttpUpload"
               list-type="picture-card"
               :limit="1"
@@ -52,6 +53,7 @@
             <div class="upload-label">反面</div>
             <el-upload
               v-model:file-list="idCardBackList"
+              action="#"
               :http-request="handleHttpUpload"
               list-type="picture-card"
               :limit="1"
@@ -234,6 +236,7 @@
               <el-form-item label="营业执照" prop="businessLicenseAddress">
                 <el-upload
                   v-model:file-list="step2Form.businessLicenseAddress"
+                  action="#"
                   :http-request="handleHttpUpload"
                   list-type="picture-card"
                   :limit="1"
@@ -251,6 +254,7 @@
               <el-form-item label="其他资质证明" prop="disportLicenceImgList">
                 <el-upload
                   v-model:file-list="step2Form.disportLicenceImgList"
+                  action="#"
                   :http-request="handleHttpUpload"
                   :limit="20"
                   list-type="picture-card"
@@ -338,7 +342,8 @@ import { ElMessage, ElMessageBox, type FormInstance, type FormRules, UploadUserF
 import { Plus, ArrowRightBold, Check } from "@element-plus/icons-vue";
 
 import { applyStore, getMerchantByPhone, getThirdLevelList, verifyIdInfo } from "@/api/modules/homeEntry";
-import { getInputPrompt, getDistrict, uploadImg, ocrRequestUrl, getAiapprovestoreInfo } from "@/api/modules/newLoginApi";
+import { getInputPrompt, getDistrict, ocrRequestUrl, getAiapprovestoreInfo } from "@/api/modules/newLoginApi";
+import { uploadFileToOss } from "@/api/upload.js";
 import GoBusinessHours from "./go-businessHours.vue";
 import { localGet, localSet } from "@/utils/index";
 import { useAuthStore } from "@/stores/modules/auth";
@@ -881,13 +886,16 @@ const selectAddress = async () => {
   latShow.value = true;
 };
 
-//文件上传
+/** 商家入驻证件/资质上传:同源 /ai-upload/upload/simple,Nginx 反代至 uat 上传服务 */
 const handleHttpUpload = async (options: UploadRequestOptions) => {
-  let formData = new FormData();
-  formData.append("file", options.file);
+  const raw = options.file;
+  const file = raw instanceof File ? raw : (raw as UploadUserFile)?.raw;
+  if (!(file instanceof File)) {
+    options.onError(new Error("无效的上传文件") as any);
+    return;
+  }
   try {
-    const res: any = await uploadImg(formData);
-    const fileUrl = res?.data?.fileUrl || res?.data?.[0] || res?.fileUrl;
+    const fileUrl = await uploadFileToOss(file, "image", { skipSimpleUploadOverlay: true });
     if (fileUrl) {
       options.onSuccess({ fileUrl });
     } else {

+ 1 - 0
vite.config.ts

@@ -20,6 +20,7 @@ export default defineConfig(({ mode }: ConfigEnv): UserConfig => {
   const viteEnv = wrapperEnv(env);
 
   return {
+//     base: mode === 'test' ? '/group_web_merchant/' : '/',
     base: viteEnv.VITE_PUBLIC_PATH,
     root,
     resolve: {