wangfumin před 1 měsícem
rodič
revize
36bd22d8eb
11 změnil soubory, kde provedl 259 přidání a 21 odebrání
  1. 7 3
      .env.dev
  2. 3 0
      .env.jm
  3. 2 1
      .env.production
  4. 1 0
      package.json
  5. binární
      public/criminal.ico
  6. binární
      public/criminal1.ico
  7. 80 16
      src/App.vue
  8. 39 0
      src/base64.ts
  9. 99 0
      src/encodeUtil.ts
  10. 24 1
      src/http.ts
  11. 4 0
      vite.config.ts

+ 7 - 3
.env.dev

@@ -1,3 +1,7 @@
-VITE_APP_APIS_URL=https://v4-test.4dkankan.com/
-VITE_APP_IFRAME_URL=https://127.0.0.1:6100
-VITE_PUBLIC_DIR="/"
+##192.168.0.37:6100是启动H5的H5本地连接
+VITE_APP_APIS_URL=http://192.168.0.31:6100
+VITE_APP_IFRAME_URL=http://192.168.0.31:6100/livestream/
+# VITE_PUBLIC_DIR="/livestream/fd/"
+# VITE_APP_APIS_URL=https://survey.4dkankan.com/
+# VITE_APP_IFRAME_URL=https://survey.4dkankan.com/livestream/
+VITE_PUBLIC_DIR="/livestream/fd/"

+ 3 - 0
.env.jm

@@ -0,0 +1,3 @@
+VITE_APP_APIS_URL=
+VITE_APP_IFRAME_URL=/livestream/
+VITE_PUBLIC_DIR="/livestream/fd/"

+ 2 - 1
.env.production

@@ -1,3 +1,4 @@
-VITE_APP_APIS_URL=https://www.4dkankan.com/
+# VITE_APP_APIS_URL=https://www.4dkankan.com/
+VITE_APP_APIS_URL=
 VITE_APP_IFRAME_URL=https://www.4dkankan.com/livestream/
 VITE_APP_IFRAME_URL=https://www.4dkankan.com/livestream/
 VITE_PUBLIC_DIR="/livestream/fd/"
 VITE_PUBLIC_DIR="/livestream/fd/"

+ 1 - 0
package.json

@@ -7,6 +7,7 @@
     "dev": "vite --mode dev ",
     "dev": "vite --mode dev ",
     "build-test": "vue-tsc  --noEmit && vite build --mode test",
     "build-test": "vue-tsc  --noEmit && vite build --mode test",
     "build-production": "vue-tsc && vite build --mode production",
     "build-production": "vue-tsc && vite build --mode production",
+    "build-jm": "vue-tsc && vite build --mode jm",
     "preview": "vite preview"
     "preview": "vite preview"
   },
   },
   "dependencies": {
   "dependencies": {

binární
public/criminal.ico


binární
public/criminal1.ico


+ 80 - 16
src/App.vue

@@ -15,7 +15,7 @@
         </n-layout-sider> -->
         </n-layout-sider> -->
         <n-layout-content content-style="padding: 0px;">
         <n-layout-content content-style="padding: 0px;">
           <iframe
           <iframe
-            v-if="isOK"
+            v-if="isOK && isGetToken"
             id="mainFrame"
             id="mainFrame"
             class="main-frame"
             class="main-frame"
             :src="iframeURL"
             :src="iframeURL"
@@ -26,7 +26,7 @@
             title=""
             title=""
             size="huge"
             size="huge"
             class="page-result"
             class="page-result"
-            v-else
+            v-else-if="!isOK && isGetToken"
             description="带看已结束"
             description="带看已结束"
           >
           >
             <template #icon>
             <template #icon>
@@ -63,10 +63,13 @@ import {
 } from "naive-ui";
 } from "naive-ui";
 import { onMounted, ref, computed } from "vue";
 import { onMounted, ref, computed } from "vue";
 import { useUrlSearchParams } from "@vueuse/core";
 import { useUrlSearchParams } from "@vueuse/core";
-import { getRoomInfo, dimissMissRoom } from "./http.ts";
+import { getRoomInfo, dimissMissRoom, getSyncSceneInfo, login } from "./http.ts";
+import { encodeStr } from './encodeUtil.ts';
 import EndPng from "./assets/end.png";
 import EndPng from "./assets/end.png";
+import { Base64 } from './base64';
 // import sceneList from "./components/sceneList.vue";
 // import sceneList from "./components/sceneList.vue";
 const isOK = ref(true);
 const isOK = ref(true);
+const isGetToken = ref(false);
 // const iframe = ref(
 // const iframe = ref(
 //   "https://127.0.0.1:6100/livestream/?vruserId=066893f525e56f09ce8b4420dff7e068&roomId=fd_22253&role=leader&avatar=https%3A%2F%2F4dkk.4dage.com%2Ftake-look%2Fimages%2Fother%2F1573b607db124917804edfaf1887df7a.jpeg&name=Gemer1&isTour=0&m=KJ-t-wOXfx2SDFy&vlog=1"
 //   "https://127.0.0.1:6100/livestream/?vruserId=066893f525e56f09ce8b4420dff7e068&roomId=fd_22253&role=leader&avatar=https%3A%2F%2F4dkk.4dage.com%2Ftake-look%2Fimages%2Fother%2F1573b607db124917804edfaf1887df7a.jpeg&name=Gemer1&isTour=0&m=KJ-t-wOXfx2SDFy&vlog=1"
 // );
 // );
@@ -81,28 +84,43 @@ interface needParams {
   vruserId: string;
   vruserId: string;
   fromMiniApp?: number;
   fromMiniApp?: number;
   redirect?: string;
   redirect?: string;
+  token?: any,
   t?: string;
   t?: string;
+  u?: string;
+  p?: string;
 }
 }
 const params: needParams = useUrlSearchParams("history");
 const params: needParams = useUrlSearchParams("history");
+console.log('params111111:', params);
 const searchParams = new URLSearchParams(
 const searchParams = new URLSearchParams(
   Object.assign({ platform: "fd" }, params ? params : {})
   Object.assign({ platform: "fd" }, params ? params : {})
 );
 );
 const iframeDomain = import.meta.env.VITE_APP_IFRAME_URL;
 const iframeDomain = import.meta.env.VITE_APP_IFRAME_URL;
 
 
 let url = searchParams.toString();
 let url = searchParams.toString();
-
 const iframeURL = computed(() => {
 const iframeURL = computed(() => {
+  const roomId = params.roomId;
+  const token = params.token;
+  const redirect = params.redirect;
   searchParams.set("fromMiniApp", "0");
   searchParams.set("fromMiniApp", "0");
   searchParams.set("isTour", "0");
   searchParams.set("isTour", "0");
   searchParams.set("t", `${Date.now()}`);
   searchParams.set("t", `${Date.now()}`);
+  if (roomId) {
+    searchParams.set("roomId", roomId);
+  }
+  if (token) {
+    searchParams.set("token", token);
+  }
+  if (redirect) {
+    searchParams.set("redirect", redirect);
+  }
   url = searchParams.toString();
   url = searchParams.toString();
   // searchParams.delete("redirect");
   // searchParams.delete("redirect");
   return iframeDomain + "?" + url;
   return iframeDomain + "?" + url;
 });
 });
 
 
-if (!params.m || !params.role || !params.roomId) {
-  isOK.value = false;
-}
+// if (!params.m || !params.role || !params.roomId) {
+//   isOK.value = false;
+// }
 
 
 const themes: Record<string, GlobalTheme> = {
 const themes: Record<string, GlobalTheme> = {
   dark: darkTheme,
   dark: darkTheme,
@@ -130,9 +148,10 @@ const getIframeMessage = async (event: MessageEvent) => {
       handlerredirect();
       handlerredirect();
     }
     }
     if (type === "fillName") {
     if (type === "fillName") {
-      console.error("填写后", data);
+      console.error("填写后", data, params.token);
       searchParams.set("name", data.name);
       searchParams.set("name", data.name);
       searchParams.set("vruserId", data.userId);
       searchParams.set("vruserId", data.userId);
+      searchParams.set("token", params.token);
       url = searchParams.toString();
       url = searchParams.toString();
       const reloadURL = location.origin + location.pathname + "?" + url;
       const reloadURL = location.origin + location.pathname + "?" + url;
       history.replaceState(null, "", reloadURL);
       history.replaceState(null, "", reloadURL);
@@ -169,16 +188,61 @@ onMounted(async () => {
     frameEle.addEventListener("load", loadFrame, true);
     frameEle.addEventListener("load", loadFrame, true);
   }
   }
   window.addEventListener("message", getIframeMessage, false);
   window.addEventListener("message", getIframeMessage, false);
-  const res = await getRoomInfo(params.roomId);
-  if (res && res.data.code === 0) {
-    console.log("res", res.data.data);
-    const { roomStatus } = res.data.data;
-    console.log("当前房间状态::", roomStatus);
-    if (roomStatus === 2 && params.role !== "leader") {
+  // 获取登录token
+  isOK.value = false;
+  if (!params.redirect && params.m) {
+    let redirect = '';
+    if(window.location.origin.includes("localhost")){
+      redirect = "http://192.168.0.125:1804/spg.html?m=" + params.m
+    } else {
+      redirect = window.location.origin + "/spg.html?m=" + params.m
+    }
+    params.redirect = redirect;
+    searchParams.set("redirect", redirect);
+  }
+  if(params.token) {
+    searchParams.set("token", params.token);
+  }
+  if(params.u && params.p && !params.token) {
+    console.log('params.u:', decodeURIComponent(params.u));
+    const orginU = Base64.decode(decodeURIComponent(params.u).replace(/ /g, '+'));
+    const orginP = Base64.decode(decodeURIComponent(params.p).replace(/ /g, '+'));
+    console.log('orginU:', orginU);
+    console.log('orginP:', orginP);
+    const res = await login(orginU, encodeStr(window.btoa(orginP)));
+    if (res && res.data && res.data.code === 0) {
+      params.token = res.data.data.token;
+      searchParams.set("token", res.data.data.token);
+    }
+  }
+  // 获取房间id
+  if (!params.roomId) {
+    const scene = await getSyncSceneInfo(params.token);
+    if (scene && scene.data && scene.data.code === 0) {
+      params.roomId = scene.data.data;
+    }
+  }
+  try{
+    const res = await getRoomInfo(params.roomId);
+    if (res && res.data.code === 0) {
+      const { roomStatus } = res.data.data;
+      console.log("当前房间状态::", roomStatus);
+      isOK.value = true
+      isGetToken.value = true
+      if (roomStatus === 2 && params.role !== "leader") {
+        isGetToken.value = true
+        isOK.value = false;
+      }
+    } else if(res.data.code == 4008 && params.role) {
+      params.token = '';
+      isOK.value = true;
+      isGetToken.value = true;
+    } else {
       isOK.value = false;
       isOK.value = false;
+      isGetToken.value = true
     }
     }
-  } else {
-    isOK.value = false;
+  } catch (error) {
+    console.log(error, 8888)
   }
   }
 });
 });
 </script>
 </script>

+ 39 - 0
src/base64.ts

@@ -0,0 +1,39 @@
+/**
+ * Base64 implementation with UTF-8 support
+ * Replaces the previous UMD module to ensure correct bundling
+ */
+export const Base64 = {
+  /**
+   * Decode Base64 string to UTF-8 string
+   */
+  decode(str: string): string {
+    try {
+      // Use TextDecoder for proper UTF-8 handling
+      const binaryString = window.atob(str);
+      const bytes = new Uint8Array(binaryString.length);
+      for (let i = 0; i < binaryString.length; i++) {
+        bytes[i] = binaryString.charCodeAt(i);
+      }
+      return new TextDecoder().decode(bytes);
+    } catch (e) {
+      console.error('Base64 decode error:', e);
+      return '';
+    }
+  },
+
+  /**
+   * Encode UTF-8 string to Base64
+   */
+  encode(str: string): string {
+    try {
+      const bytes = new TextEncoder().encode(str);
+      const binaryString = Array.from(bytes, (byte) => String.fromCharCode(byte)).join("");
+      return window.btoa(binaryString);
+    } catch (e) {
+      console.error('Base64 encode error:', e);
+      return '';
+    }
+  }
+};
+
+export default Base64;

+ 99 - 0
src/encodeUtil.ts

@@ -0,0 +1,99 @@
+/*
+ ** 登录密码加密
+  http://face3d.4dage.com:7005/4dzfb-2.0/shop/src/master/platform-admin/src/main/webapp/login.html
+ */
+function randomWord(randomFlag: any, min: any, max?: any) {
+  let str = '';
+  let range = min;
+  const arr = [
+    '0',
+    '1',
+    '2',
+    '3',
+    '4',
+    '5',
+    '6',
+    '7',
+    '8',
+    '9',
+    'a',
+    'b',
+    'c',
+    'd',
+    'e',
+    'f',
+    'g',
+    'h',
+    'i',
+    'j',
+    'k',
+    'l',
+    'm',
+    'n',
+    'o',
+    'p',
+    'q',
+    'r',
+    's',
+    't',
+    'u',
+    'v',
+    'w',
+    'x',
+    'y',
+    'z',
+    'A',
+    'B',
+    'C',
+    'D',
+    'E',
+    'F',
+    'G',
+    'H',
+    'I',
+    'J',
+    'K',
+    'L',
+    'M',
+    'N',
+    'O',
+    'P',
+    'Q',
+    'R',
+    'S',
+    'T',
+    'U',
+    'V',
+    'W',
+    'X',
+    'Y',
+    'Z',
+  ];
+  // 随机产生
+  if (randomFlag) {
+    range = Math.round(Math.random() * (max - min)) + min;
+  }
+  for (let i = 0; i < range; i++) {
+    const pos = Math.round(Math.random() * (arr.length - 1));
+    str += arr[pos];
+  }
+  return str;
+}
+
+export function encodeStr(str: any, strv = ''): any {
+  const NUM = 2;
+  const front = randomWord(false, 8);
+  const middle = randomWord(false, 8);
+  const end = randomWord(false, 8);
+
+  const str1 = str.substring(0, NUM);
+  const str2 = str.substring(NUM);
+
+  if (strv) {
+    const strv1 = strv.substring(0, NUM);
+    const strv2 = strv.substring(NUM);
+    return [front + str2 + middle + str1 + end, front + strv2 + middle + strv1 + end];
+  }
+
+  return front + str2 + middle + str1 + end;
+}

+ 24 - 1
src/http.ts

@@ -5,16 +5,39 @@ const shopAxios = axios.create({
     baseURL: import.meta.env.VITE_APP_APIS_URL,
     baseURL: import.meta.env.VITE_APP_APIS_URL,
 });
 });
 
 
+export const getSyncSceneInfo = async (token: string): Promise<AxiosResponse> => {
+    shopAxios.defaults.headers.platform = browser.getURLParam('platform') || '';
+    // 江门需要加上token验证,其他项目需要去掉
+    shopAxios.defaults.headers.token = browser.getURLParam('token') || '';
+    shopAxios.defaults.headers.token = token || '';
+    const data = { num: browser.getURLParam('m') }
+    const res = await shopAxios.post<AxiosResponse>('/fusion/caseLive/getTakeLookRoom', data);
+    return res
+};
+
+export const login = async (u: string, p: string): Promise<AxiosResponse> => {
+    shopAxios.defaults.headers.platform = browser.getURLParam('platform') || '';
+    // 江门需要加上token验证,其他项目需要去掉
+    shopAxios.defaults.headers.token = browser.getURLParam('token') || '';
+    const data = { userName: u, password: p }
+    const res = await shopAxios.post<AxiosResponse>('/service/manage/login', data );
+    return res
+};
 
 
 export const getRoomInfo = async (roomId: string): Promise<AxiosResponse> => {
 export const getRoomInfo = async (roomId: string): Promise<AxiosResponse> => {
     shopAxios.defaults.headers.platform = browser.getURLParam('platform') || '';
     shopAxios.defaults.headers.platform = browser.getURLParam('platform') || '';
+    // 江门需要加上token验证,其他项目需要去掉
+    shopAxios.defaults.headers.token = browser.getURLParam('token') || '';
     const res = await shopAxios.get<AxiosResponse>('/takelook/roomInfo', { params: { roomId } });
     const res = await shopAxios.get<AxiosResponse>('/takelook/roomInfo', { params: { roomId } });
     // console.log('res', res)
     // console.log('res', res)
     return res
     return res
 };
 };
 export const dimissMissRoom = async (roomId: string): Promise<AxiosResponse> => {
 export const dimissMissRoom = async (roomId: string): Promise<AxiosResponse> => {
     shopAxios.defaults.headers.platform = browser.getURLParam('platform') || '';
     shopAxios.defaults.headers.platform = browser.getURLParam('platform') || '';
+    // 江门需要加上token验证,其他项目需要去掉
+    shopAxios.defaults.headers.token = browser.getURLParam('token') || '';
     const res = await shopAxios.get<AxiosResponse>('/takelook/dissolveTheRoom', { params: { roomId } });
     const res = await shopAxios.get<AxiosResponse>('/takelook/dissolveTheRoom', { params: { roomId } });
     // console.log('res', res)
     // console.log('res', res)
     return res
     return res
-};
+};
+

+ 4 - 0
vite.config.ts

@@ -36,6 +36,10 @@ export default ({ mode }) =>
           target: loadEnv(mode, process.cwd()).VITE_APP_APIS_URL,
           target: loadEnv(mode, process.cwd()).VITE_APP_APIS_URL,
           changeOrigin: true,
           changeOrigin: true,
         },
         },
+        '/fusion': {
+          target: loadEnv(mode, process.cwd()).VITE_APP_APIS_URL,
+          changeOrigin: true,
+        },
       },
       },
     },
     },
   })
   })