From b7b8202e3ecb7f720eefd7a226b2ee8166fc5057 Mon Sep 17 00:00:00 2001
From: WXL <wl_5969728@163.com>
Date: 星期四, 04 六月 2026 14:57:17 +0800
Subject: [PATCH] 青岛移动端维护

---
 pages/login/Login.vue |  287 +++++++++++++++++++++++++++++++++++++++++++-------------
 1 files changed, 218 insertions(+), 69 deletions(-)

diff --git a/pages/login/Login.vue b/pages/login/Login.vue
index 110a36a..71b5c44 100644
--- a/pages/login/Login.vue
+++ b/pages/login/Login.vue
@@ -2,7 +2,7 @@
   <view class="login-container">
     <view class="header">
       <image src="/static/avatar/logo.png" class="logo" />
-      <text class="hospital-name">闈掗檮闄PO绠$悊骞冲彴</text>
+      <text class="hospital-name">闈掑ぇ闄勯櫌OPO绠$悊骞冲彴</text>
     </view>
 
     <view class="form-container">
@@ -46,115 +46,264 @@
 
 <script setup>
 import { ref } from "vue";
-import { onLoad } from "@dcloudio/uni-app";
+import { onLoad, onShow } from "@dcloudio/uni-app";
 import { useUserStore } from "@/stores/user";
+import { getToken, setToken } from "@/utils/auth";
 import { encrypt } from "@/utils/crypto";
+
+let isAutoLogining = false;
+let hasAutoLogin = false;
 
 const username = ref("");
 const password = ref("");
 const showPassword = ref(false);
-const isHarmonyOS = ref(false);
-const redirect = ref("/pages/index/index"); // 榛樿璺宠浆棣栭〉
+const redirect = ref("");
 
 onLoad((options) => {
-  // 鏍煎紡鍖栧綋鍓嶆棩鏈熶负 YYYYMMDD
-  const getCurrentDate = () => {
-    const now = new Date();
-    const year = now.getFullYear();
-    const month = String(now.getMonth() + 1).padStart(2, "0");
-    const day = String(now.getDate()).padStart(2, "0");
-    return `${year}${month}${day}`;
-  };
+  console.log("鐧诲綍椤祇nLoad锛屽畬鏁村弬鏁�:", options);
+  console.log("椤甸潰鏍�:", getCurrentPages());
 
-  // 鑷姩鐢熸垚瀵嗙爜鍑芥暟
-  const generatePassword = () => {
-    const currentDate = getCurrentDate(); // 鐩存帴璋冪敤鍑芥暟
-    return `Hrs#${currentDate}*`;
-  };
-  // uni.$uapi.post("/getToken", {
-  //     userName: "娴嬭瘯鍚撮緳",
-  //     passWord: "13803963330",
-  //   });
+  // 鉁� 鑾峰彇瀹屾暣URL鍙傛暟
+  const pages = getCurrentPages();
+  if (pages.length > 0) {
+    const currentPage = pages[pages.length - 1];
+    console.log("褰撳墠椤甸潰瀵硅薄:", currentPage);
+  }
 
+  // 澶勭悊redirect鍙傛暟
   if (options.redirect) {
     redirect.value = decodeURIComponent(options.redirect);
+  } else if (options.userName && options.passWord) {
+    // 濡傛灉娌℃湁redirect浣嗘湁SSO鍙傛暟锛屽皾璇曚粠referrer鑾峰彇
+    const launchOptions = uni.getLaunchOptionsSync();
+    if (launchOptions.referrerInfo && launchOptions.referrerInfo.extraData) {
+      const referrer = launchOptions.referrerInfo.extraData;
+      console.log("referrer淇℃伅:", referrer);
+    }
   }
-  // password.value = generatePassword(); // 鐩存帴璋冪敤鍑芥暟
-  password.value = ""; // 鐩存帴璋冪敤鍑芥暟
-  username.value = "";
-  // 妫�娴嬫槸鍚﹂缚钂欑郴缁�
-  // #ifdef HARMONY
-  isHarmonyOS.value = true;
 
-  // #endif
+  // 妫�鏌ユ槸鍚﹀凡鏈塼oken
+  if (getToken()) {
+    console.log("宸插瓨鍦╰oken锛岀洿鎺ヨ烦杞�");
+    setTimeout(() => {
+      navigateToTarget();
+    }, 100);
+    return;
+  }
+
+  // 鉁� SSO鐧诲綍锛氭鏌ユ墍鏈夊彲鑳界殑鍙傛暟浣嶇疆
+  let ssoUserName = options.userName;
+  let ssoPassWord = options.passWord;
+
+  // 濡傛灉娌℃湁浠巓ptions鑾峰彇鍒帮紝灏濊瘯浠庡惎鍔ㄥ弬鏁拌幏鍙�
+  if (!ssoUserName || !ssoPassWord) {
+    const launchOptions = uni.getLaunchOptionsSync();
+    if (launchOptions.query) {
+      ssoUserName = ssoUserName || launchOptions.query.userName;
+      ssoPassWord = ssoPassWord || launchOptions.query.passWord;
+    }
+  }
+
+  if (ssoUserName && ssoPassWord) {
+    console.log("妫�娴嬪埌SSO鍙傛暟锛岃嚜鍔ㄧ櫥褰�", { ssoUserName });
+
+    // 鍚堝苟鎵�鏈夐〉闈㈠弬鏁�
+    const pageParams = { ...options };
+    delete pageParams.userName;
+    delete pageParams.passWord;
+    delete pageParams.redirect;
+
+    handleSSOLogin(ssoUserName, ssoPassWord, pageParams);
+  } else {
+    // 鏅�氱櫥褰�
+    password.value = "";
+    username.value = "";
+  }
 });
+
+onShow(() => {
+  console.log("鐧诲綍椤祇nShow");
+  if (hasAutoLogin) {
+    hasAutoLogin = false;
+  }
+});
+
+// 鉁� 鏀硅繘鐨凷SO鐧诲綍鍑芥暟
+const handleSSOLogin = async (userName, passWord, pageParams = {}) => {
+  if (isAutoLogining) {
+    console.log("姝e湪鑷姩鐧诲綍涓紝璺宠繃");
+    return;
+  }
+
+  isAutoLogining = true;
+  console.log("寮�濮婼SO鍏嶇櫥:", { userName, pageParams });
+
+  uni.showLoading({ title: "鑷姩鐧诲綍涓�...", mask: true });
+
+  try {
+    console.log(11);
+
+    // 1. 鑾峰彇token
+    const tokenRes = await uni.$uapi.post("/getToken", {
+      userName,
+      passWord,
+    });
+    console.log(tokenRes.data);
+
+    uni.hideLoading();
+
+    if (!tokenRes.data.token) {
+      throw new Error("鑾峰彇token澶辫触");
+    }
+
+    console.log("鑾峰彇鍒皌oken鎴愬姛");
+
+    // 2. 淇濆瓨token
+    setToken(tokenRes.data.token);
+
+    // 3. 鑾峰彇鐢ㄦ埛淇℃伅
+    const userStore = useUserStore();
+    const userInfo = await uni.$uapi.get("/getInfo");
+    if (userInfo) {
+      userStore.setUserInfo(userInfo);
+    }
+
+    // 4. 鏋勫缓鐩爣椤甸潰URL
+    let targetPage = redirect.value;
+    if (!targetPage && Object.keys(pageParams).length > 0) {
+      // 灏濊瘯浠庡師濮嬭闂矾寰勬瀯寤�
+      const launchOptions = uni.getLaunchOptionsSync();
+      if (launchOptions.path && !launchOptions.path.includes("login/Login")) {
+        targetPage = "/" + launchOptions.path;
+      }
+    }
+
+    // 5. 璺宠浆
+    hasAutoLogin = true;
+    await navigateToTargetPage(targetPage, pageParams);
+  } catch (err) {
+    uni.hideLoading();
+    console.error("SSO鍏嶇櫥澶辫触:", err);
+    uni.showToast({
+      title: "鑷姩鐧诲綍澶辫触锛岃鎵嬪姩鐧诲綍",
+      icon: "none",
+      duration: 3000,
+    });
+
+    uni.removeStorageSync("token");
+  } finally {
+    isAutoLogining = false;
+  }
+};
+
+// 鏅�氱櫥褰�
 const handleLogin = async () => {
   try {
-    const userStore = useUserStore();
+    if (!username.value || !password.value) {
+      uni.showToast({ title: "璇疯緭鍏ヨ处鍙峰瘑鐮�", icon: "none" });
+      return;
+    }
 
-    // 鉁� 瀵嗙爜鍔犲瘑
+    uni.showLoading({ title: "鐧诲綍涓�...", mask: true });
+
+    const userStore = useUserStore();
     const encryptedPassword = encrypt(password.value);
     const encryptedUsername = encrypt(username.value);
 
     const loginRes = await uni.$uapi.post("/login", {
       username: encryptedUsername,
-      password: encryptedPassword, // 鈿狅笍 浼犲瘑鏂�
+      password: encryptedPassword,
     });
 
-    userStore.setToken(loginRes.token);
+    if (!loginRes || !loginRes.token) {
+      throw new Error("鐧诲綍澶辫触");
+    }
+
+    setToken(loginRes.token);
 
     const userInfo = await uni.$uapi.get("/getInfo");
-    userStore.setUserInfo(userInfo);
-
-    const redirects = redirect.value || "/pages/index/index";
-
-    const tabBarPages = [
-      "/pages/index/index",
-      "/pages/appointment/index",
-      "/pages/consultation/index",
-      "/pages/my/index",
-    ];
-
-    if (tabBarPages.includes(redirects)) {
-      uni.switchTab({ url: redirects });
-    } else {
-      uni.redirectTo({ url: redirects });
+    if (userInfo) {
+      userStore.setUserInfo(userInfo);
     }
+
+    uni.hideLoading();
+    await navigateToTarget();
   } catch (err) {
+    uni.hideLoading();
+    console.error("鐧诲綍澶辫触:", err);
     uni.showToast({
       title: err.message || "鐧诲綍澶辫触",
       icon: "none",
+      duration: 3000,
     });
   }
 };
 
-const gotoRegister = () => {
-  uni.navigateTo({
-    url: "/pages/login/Register",
-  });
+// 鉁� 鏀硅繘鐨勮烦杞嚱鏁�
+const navigateToTarget = () => {
+  return navigateToTargetPage(redirect.value, {});
 };
 
-const gotoForgetPassword = () => {
-  uni.navigateTo({
-    url: "/pages/login/ForgetPwd",
-  });
-};
+const navigateToTargetPage = (targetPage, pageParams = {}) => {
+  return new Promise((resolve) => {
+    setTimeout(() => {
+      let targetUrl = targetPage || "/pages/index/index";
 
-const appleLogin = () => {
-  uni.showToast({
-    title: "鏆傛湭寮�閫� Apple 鐧诲綍",
-    icon: "none",
-  });
-};
+      // 澶勭悊椤甸潰鍙傛暟
+      const paramKeys = Object.keys(pageParams).filter(
+        (key) =>
+          pageParams[key] !== undefined &&
+          pageParams[key] !== null &&
+          key !== "userName" &&
+          key !== "passWord" &&
+          key !== "redirect",
+      );
 
-const harmonyLogin = () => {
-  // 璋冪敤楦胯挋鐧诲綍鎻掍欢
-  // #ifdef HARMONY
-  const harmonyAuth = uni.requireNativePlugin("Harmony-Auth");
-  harmonyAuth.login((result) => {
-    console.log("楦胯挋鐧诲綍缁撴灉:", result);
+      if (paramKeys.length > 0) {
+        const queryStr = paramKeys
+          .map((key) => `${key}=${encodeURIComponent(pageParams[key])}`)
+          .join("&");
+
+        targetUrl = targetUrl.includes("?")
+          ? `${targetUrl}&${queryStr}`
+          : `${targetUrl}?${queryStr}`;
+      }
+
+      console.log("鏈�缁堣烦杞洰鏍�:", targetUrl);
+
+      const tabBarPages = [
+        "/pages/index/index",
+        "/pages/appointment/index",
+        "/pages/consultation/index",
+        "/pages/my/index",
+      ];
+
+      const baseUrl = targetUrl.split("?")[0];
+      const isTabBar = tabBarPages.includes(baseUrl);
+
+      if (isTabBar) {
+        uni.switchTab({
+          url: baseUrl,
+          success: () => resolve(true),
+          fail: () => {
+            uni.redirectTo({ url: "/pages/index/index" });
+            resolve(false);
+          },
+        });
+      } else {
+        uni.redirectTo({
+          url: targetUrl,
+          success: () => resolve(true),
+          fail: (err) => {
+            console.error("璺宠浆澶辫触:", err);
+            // 濡傛灉鐩爣椤佃烦杞け璐ワ紝璺抽椤�
+            uni.redirectTo({ url: "/pages/index/index" });
+            resolve(false);
+          },
+        });
+      }
+    }, 300);
   });
-  // #endif
 };
 </script>
 

--
Gitblit v1.9.3