From 05c363fdd7ab04e3bd9a753e2c5d5bfff04d681c Mon Sep 17 00:00:00 2001
From: WXL <wl_5969728@163.com>
Date: 星期二, 09 六月 2026 10:21:35 +0800
Subject: [PATCH] 备份上传

---
 pages/login/Login.vue |  305 ++++++++++++++++++++++++--------------------------
 1 files changed, 149 insertions(+), 156 deletions(-)

diff --git a/pages/login/Login.vue b/pages/login/Login.vue
index 71b5c44..fd82eea 100644
--- a/pages/login/Login.vue
+++ b/pages/login/Login.vue
@@ -1,16 +1,20 @@
 <template>
   <view class="login-container">
+    <view v-if="isAutoLogining" class="sso-mask">
+      <uni-load-more
+        status="loading"
+        :content-text="{ contentdown: '鑷姩鐧诲綍涓�...' }"
+      ></uni-load-more>
+    </view>
     <view class="header">
       <image src="/static/avatar/logo.png" class="logo" />
       <text class="hospital-name">闈掑ぇ闄勯櫌OPO绠$悊骞冲彴</text>
     </view>
-
     <view class="form-container">
       <view class="input-group">
         <uni-icons type="contact" size="24" color="#409EFF" />
         <input v-model="username" placeholder="璇疯緭鍏ヨ处鍙�" class="input" />
       </view>
-
       <view class="input-group">
         <uni-icons type="locked" size="24" color="#409EFF" />
         <input
@@ -26,7 +30,6 @@
           @click="showPassword = !showPassword"
         />
       </view>
-
       <button
         class="login-btn"
         :class="{ active: username && password }"
@@ -35,11 +38,6 @@
       >
         鐧诲綍
       </button>
-
-      <!-- <view class="footer-links">
-        <view @click="gotoRegister">娉ㄥ唽璐﹀彿</view>
-        <view @click="gotoForgetPassword">蹇樿瀵嗙爜</view>
-      </view> -->
     </view>
   </view>
 </template>
@@ -59,151 +57,142 @@
 const showPassword = ref(false);
 const redirect = ref("");
 
-onLoad((options) => {
-  console.log("鐧诲綍椤祇nLoad锛屽畬鏁村弬鏁�:", options);
-  console.log("椤甸潰鏍�:", getCurrentPages());
+// tabBar 椤甸潰鍒楄〃锛堜笌 pages.json 淇濇寔涓�鑷达級
+const tabBarPages = [
+  "/pages/index/index",
+  "/pages/appointment/index",
+  "/pages/consultation/index",
+  "/pages/my/index",
+];
 
-  // 鉁� 鑾峰彇瀹屾暣URL鍙傛暟
-  const pages = getCurrentPages();
-  if (pages.length > 0) {
-    const currentPage = pages[pages.length - 1];
-    console.log("褰撳墠椤甸潰瀵硅薄:", currentPage);
+onLoad(async (options) => {
+  console.log("鐧诲綍椤祇nLoad锛屽師濮嬪弬鏁�:", options);
+  const launchQuery = uni.getLaunchOptionsSync().query || {};
+  const allParams = { ...launchQuery, ...options };
+  console.log("鍚堝苟鍚庡弬鏁�:", allParams);
+
+  // 鎻愬彇 redirect
+  if (allParams.redirect) {
+    redirect.value = decodeURIComponent(allParams.redirect);
   }
 
-  // 澶勭悊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);
+  // 鉁� 浼樺厛澶勭悊 code 鍏嶇櫥
+  const code = allParams.code;
+  if (code) {
+    console.log("妫�娴嬪埌鍏嶇櫥鐮侊紝寮�濮嬭В鏋�:", code);
+    // 鏄剧ず loading
+    uni.showLoading({ title: "瑙f瀽鍏嶇櫥淇℃伅...", mask: true });
+    try {
+      // 璋冪敤瑙f瀽鎺ュ彛
+      const res = await uni.$uapi.get("/GiLink/getCode", { code });
+      uni.hideLoading();
+      console.log(res.data);
+      res.data.passWord = res.data.userPhone;
+      if (!res.data || !res.data.userName || !res.data.passWord) {
+        throw new Error("瑙f瀽鍏嶇櫥鐮佸け璐�");
+      }
+      let obj = JSON.parse(res.data.extContent);
+      // const { userName, passWord, ...otherParams } = res;
+      console.log(res.data.userName);
+
+      const userName = res.data.userName;
+      const passWord = res.data.passWord;
+      const otherParams = {
+        id: obj.infoId,
+        type: obj.type,
+        status: obj.status,
+        fcid: obj.id,
+      };
+      console.log("瑙f瀽缁撴灉:", { userName, otherParams });
+      // 娓呴櫎鍙兘瀛樺湪鐨勬棫 token
+      if (getToken()) uni.removeStorageSync("token");
+      // 鎵ц SSO 鐧诲綍锛屽苟灏嗗叾浠栦笟鍔″弬鏁颁紶閫掍笅鍘�
+      await handleSSOLogin(userName, passWord, otherParams);
+    } catch (err) {
+      uni.hideLoading();
+      console.error("鍏嶇櫥鐮佽В鏋愬け璐�:", err);
+      uni.showToast({ title: "鍏嶇櫥褰曞け璐ワ紝璇锋墜鍔ㄧ櫥褰�", icon: "none" });
     }
-  }
-
-  // 妫�鏌ユ槸鍚﹀凡鏈塼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;
-    }
+  // 鍘熸湁閫昏緫锛氭棤 code 涓斿凡鏈� token 璺宠浆鐩爣椤�
+  if (getToken()) {
+    setTimeout(() => navigateToTarget(), 100);
+    return;
   }
 
-  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 = "";
-  }
+  // 鏅�氱櫥褰曪紝娓呯┖琛ㄥ崟
+  username.value = "";
+  password.value = "";
 });
 
 onShow(() => {
-  console.log("鐧诲綍椤祇nShow");
-  if (hasAutoLogin) {
-    hasAutoLogin = false;
-  }
+  if (hasAutoLogin) hasAutoLogin = false;
 });
 
-// 鉁� 鏀硅繘鐨凷SO鐧诲綍鍑芥暟
+/**
+ * SSO 鍏嶇櫥
+ */
 const handleSSOLogin = async (userName, passWord, pageParams = {}) => {
-  if (isAutoLogining) {
-    console.log("姝e湪鑷姩鐧诲綍涓紝璺宠繃");
-    return;
-  }
-
+  if (isAutoLogining) 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);
-
+    const tokenRes = await uni.$uapi.post("/getToken", { userName, passWord });
     uni.hideLoading();
 
-    if (!tokenRes.data.token) {
-      throw new Error("鑾峰彇token澶辫触");
-    }
+    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);
+    if (userInfo && userInfo.user) {
+      userStore.setUserInfo(userInfo.user);
+      if (userInfo.roles) userStore.setroleKey(userInfo.roles);
     }
 
-    // 4. 鏋勫缓鐩爣椤甸潰URL
+    // 纭畾鐩爣椤甸潰
     let targetPage = redirect.value;
-    if (!targetPage && Object.keys(pageParams).length > 0) {
-      // 灏濊瘯浠庡師濮嬭闂矾寰勬瀯寤�
+    if (!targetPage) {
       const launchOptions = uni.getLaunchOptionsSync();
-      if (launchOptions.path && !launchOptions.path.includes("login/Login")) {
-        targetPage = "/" + launchOptions.path;
+      const originalPath = launchOptions.path;
+      if (originalPath && !originalPath.includes("login/Login")) {
+        targetPage = "/" + originalPath;
       }
     }
+    if (!targetPage) targetPage = "/pages/index/index";
 
-    // 5. 璺宠浆
     hasAutoLogin = true;
+    // 璺宠浆鏃舵惡甯� pageParams锛堜笟鍔″弬鏁帮級
     await navigateToTargetPage(targetPage, pageParams);
   } catch (err) {
     uni.hideLoading();
     console.error("SSO鍏嶇櫥澶辫触:", err);
     uni.showToast({
-      title: "鑷姩鐧诲綍澶辫触锛岃鎵嬪姩鐧诲綍",
+      title: err.message || "鑷姩鐧诲綍澶辫触锛岃鎵嬪姩鐧诲綍",
       icon: "none",
       duration: 3000,
     });
-
     uni.removeStorageSync("token");
   } finally {
     isAutoLogining = false;
   }
 };
 
-// 鏅�氱櫥褰�
+/**
+ * 鏅�氱櫥褰�
+ */
 const handleLogin = async () => {
   try {
     if (!username.value || !password.value) {
       uni.showToast({ title: "璇疯緭鍏ヨ处鍙峰瘑鐮�", icon: "none" });
       return;
     }
-
     uni.showLoading({ title: "鐧诲綍涓�...", mask: true });
 
     const userStore = useUserStore();
@@ -215,15 +204,14 @@
       password: encryptedPassword,
     });
 
-    if (!loginRes || !loginRes.token) {
-      throw new Error("鐧诲綍澶辫触");
-    }
-
+    if (!loginRes || !loginRes.token) throw new Error("鐧诲綍澶辫触");
     setToken(loginRes.token);
 
     const userInfo = await uni.$uapi.get("/getInfo");
-    if (userInfo) {
-      userStore.setUserInfo(userInfo);
+    if (userInfo && userInfo.user) {
+      userStore.setUserInfo(userInfo.user);
+
+      if (userInfo.roles) userStore.setroleKey(userInfo.roles);
     }
 
     uni.hideLoading();
@@ -239,65 +227,67 @@
   }
 };
 
-// 鉁� 鏀硅繘鐨勮烦杞嚱鏁�
+/**
+ * 鏍规嵁 redirect 璺宠浆
+ */
 const navigateToTarget = () => {
-  return navigateToTargetPage(redirect.value, {});
+  if (redirect.value) {
+    return navigateToTargetPage(redirect.value, {});
+  } else {
+    console.log("娌℃湁鐩爣椤甸潰锛岃烦杞椤�");
+    uni.switchTab({ url: "/pages/index/index" });
+    return Promise.resolve(true);
+  }
 };
 
+/**
+ * 閫氱敤璺宠浆鍑芥暟
+ * @param {string} targetPage 鐩爣椤甸潰璺緞
+ * @param {object} pageParams 闄勫姞鍙傛暟
+ */
 const navigateToTargetPage = (targetPage, pageParams = {}) => {
   return new Promise((resolve) => {
+    if (!targetPage) {
+      console.log("鐩爣椤典负绌猴紝璺宠浆棣栭〉");
+      uni.switchTab({ url: "/pages/index/index" });
+      resolve(true);
+      return;
+    }
+
+    let finalUrl = targetPage;
+    const paramKeys = Object.keys(pageParams).filter(
+      (key) => pageParams[key] !== undefined && pageParams[key] !== null,
+    );
+    if (paramKeys.length > 0) {
+      const queryStr = paramKeys
+        .map((key) => `${key}=${encodeURIComponent(pageParams[key])}`)
+        .join("&");
+      finalUrl += (finalUrl.includes("?") ? "&" : "?") + queryStr + "&sso=1";
+    }
+
+    console.log("鏈�缁堣烦杞洰鏍嘦RL:", finalUrl);
+
+    const baseUrl = finalUrl.split("?")[0];
+    const isTabBar = tabBarPages.includes(baseUrl);
+
     setTimeout(() => {
-      let targetUrl = targetPage || "/pages/index/index";
-
-      // 澶勭悊椤甸潰鍙傛暟
-      const paramKeys = Object.keys(pageParams).filter(
-        (key) =>
-          pageParams[key] !== undefined &&
-          pageParams[key] !== null &&
-          key !== "userName" &&
-          key !== "passWord" &&
-          key !== "redirect",
-      );
-
-      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" });
+          fail: (err) => {
+            console.error("switchTab澶辫触:", err);
+            uni.switchTab({ url: "/pages/index/index" });
             resolve(false);
           },
         });
       } else {
         uni.redirectTo({
-          url: targetUrl,
+          url: finalUrl,
           success: () => resolve(true),
           fail: (err) => {
-            console.error("璺宠浆澶辫触:", err);
-            // 濡傛灉鐩爣椤佃烦杞け璐ワ紝璺抽椤�
-            uni.redirectTo({ url: "/pages/index/index" });
+            console.error("redirectTo澶辫触:", err);
+            uni.switchTab({ url: "/pages/index/index" });
             resolve(false);
           },
         });
@@ -313,6 +303,20 @@
   background: linear-gradient(to bottom, #e6f7ff, #ffffff);
   height: 100vh;
   box-sizing: border-box;
+  position: relative;
+}
+
+.sso-mask {
+  position: fixed;
+  top: 0;
+  left: 0;
+  right: 0;
+  bottom: 0;
+  background: rgba(255, 255, 255, 0.9);
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  z-index: 9999;
 }
 
 .header {
@@ -381,16 +385,5 @@
 
 .button-hover {
   opacity: 0.8;
-}
-
-.footer-links {
-  display: flex;
-  flex-direction: row;
-  justify-content: space-between;
-  text-align: center;
-  margin-top: 30rpx;
-  color: #1890ff;
-  font-size: 28rpx;
-  width: 100%;
 }
 </style>

--
Gitblit v1.9.3