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 |  353 +++++++++++++++++++++++++++++++++++++++-------------------
 1 files changed, 238 insertions(+), 115 deletions(-)

diff --git a/pages/login/Login.vue b/pages/login/Login.vue
index 1faefaa..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">闈掗檮闄PO绠$悊骞冲彴</text>
+      <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,145 +38,262 @@
       >
         鐧诲綍
       </button>
-
-      <!-- <view class="footer-links">
-        <view @click="gotoRegister">娉ㄥ唽璐﹀彿</view>
-        <view @click="gotoForgetPassword">蹇樿瀵嗙爜</view>
-      </view> -->
     </view>
   </view>
 </template>
 
 <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}`;
-  };
+// tabBar 椤甸潰鍒楄〃锛堜笌 pages.json 淇濇寔涓�鑷达級
+const tabBarPages = [
+  "/pages/index/index",
+  "/pages/appointment/index",
+  "/pages/consultation/index",
+  "/pages/my/index",
+];
 
-  // 鑷姩鐢熸垚瀵嗙爜鍑芥暟
-  const generatePassword = () => {
-    const currentDate = getCurrentDate();  // 鐩存帴璋冪敤鍑芥暟
-    return `Hrs#${currentDate}*`;
-  };
+onLoad(async (options) => {
+  console.log("鐧诲綍椤祇nLoad锛屽師濮嬪弬鏁�:", options);
+  const launchQuery = uni.getLaunchOptionsSync().query || {};
+  const allParams = { ...launchQuery, ...options };
+  console.log("鍚堝苟鍚庡弬鏁�:", allParams);
 
-  if (options.redirect) {
-    redirect.value = decodeURIComponent(options.redirect);
+  // 鎻愬彇 redirect
+  if (allParams.redirect) {
+    redirect.value = decodeURIComponent(allParams.redirect);
   }
-  password.value = generatePassword();  // 鐩存帴璋冪敤鍑芥暟
-  username.value = "admin";
-  // 妫�娴嬫槸鍚﹂缚钂欑郴缁�
-  // #ifdef HARMONY
-  isHarmonyOS.value = true;
 
-  // #endif
+  // 鉁� 浼樺厛澶勭悊 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" });
+    }
+    return;
+  }
+
+  // 鍘熸湁閫昏緫锛氭棤 code 涓斿凡鏈� token 璺宠浆鐩爣椤�
+  if (getToken()) {
+    setTimeout(() => navigateToTarget(), 100);
+    return;
+  }
+
+  // 鏅�氱櫥褰曪紝娓呯┖琛ㄥ崟
+  username.value = "";
+  password.value = "";
 });
 
+onShow(() => {
+  if (hasAutoLogin) hasAutoLogin = false;
+});
+
+/**
+ * SSO 鍏嶇櫥
+ */
+const handleSSOLogin = async (userName, passWord, pageParams = {}) => {
+  if (isAutoLogining) return;
+  isAutoLogining = true;
+  console.log("寮�濮婼SO鍏嶇櫥:", { userName, pageParams });
+
+  uni.showLoading({ title: "鑷姩鐧诲綍涓�...", mask: true });
+
+  try {
+    const tokenRes = await uni.$uapi.post("/getToken", { userName, passWord });
+    uni.hideLoading();
+
+    if (!tokenRes.data?.token) throw new Error("鑾峰彇token澶辫触");
+
+    setToken(tokenRes.data.token);
+
+    const userStore = useUserStore();
+    const userInfo = await uni.$uapi.get("/getInfo");
+    if (userInfo && userInfo.user) {
+      userStore.setUserInfo(userInfo.user);
+      if (userInfo.roles) userStore.setroleKey(userInfo.roles);
+    }
+
+    // 纭畾鐩爣椤甸潰
+    let targetPage = redirect.value;
+    if (!targetPage) {
+      const launchOptions = uni.getLaunchOptionsSync();
+      const originalPath = launchOptions.path;
+      if (originalPath && !originalPath.includes("login/Login")) {
+        targetPage = "/" + originalPath;
+      }
+    }
+    if (!targetPage) targetPage = "/pages/index/index";
+
+    hasAutoLogin = true;
+    // 璺宠浆鏃舵惡甯� pageParams锛堜笟鍔″弬鏁帮級
+    await navigateToTargetPage(targetPage, pageParams);
+  } catch (err) {
+    uni.hideLoading();
+    console.error("SSO鍏嶇櫥澶辫触:", err);
+    uni.showToast({
+      title: err.message || "鑷姩鐧诲綍澶辫触锛岃鎵嬪姩鐧诲綍",
+      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 });
 
-    // 1. 鐧诲綍鑾峰彇token
+    const userStore = useUserStore();
+    const encryptedPassword = encrypt(password.value);
+    const encryptedUsername = encrypt(username.value);
+
     const loginRes = await uni.$uapi.post("/login", {
-      username: username.value,
-      password: password.value,
+      username: encryptedUsername,
+      password: encryptedPassword,
     });
 
-    // 2. 瀛樺偍token
-    userStore.setToken(loginRes.token);
+    if (!loginRes || !loginRes.token) throw new Error("鐧诲綍澶辫触");
+    setToken(loginRes.token);
 
-    // 3. 鑾峰彇鐢ㄦ埛淇℃伅
-    let userInfo;
-    try {
-      userInfo = await uni.$uapi.get("/getInfo");
-    } catch (err) {
-      throw new Error("鑾峰彇鐢ㄦ埛淇℃伅澶辫触锛�" + (err.message || "鏈煡閿欒"));
+    const userInfo = await uni.$uapi.get("/getInfo");
+    if (userInfo && userInfo.user) {
+      userStore.setUserInfo(userInfo.user);
+
+      if (userInfo.roles) userStore.setroleKey(userInfo.roles);
     }
 
-    // 4. 鑾峰彇鏉冮檺淇℃伅
-    // let roles;
-    // try {
-    //   roles = await uni.$uapi.get("/current/user/current_roles");
-    // } catch (err) {
-    //   throw new Error("鑾峰彇鏉冮檺淇℃伅澶辫触锛�" + (err.message || "鏈煡閿欒"));
-    // }
-
-    // // 5. 楠岃瘉鏉冮檺淇℃伅骞惰缃�
-    // if (Array.isArray(roles) && roles.length > 0 && roles[0]?.roleKey) {
-    //   userStore.setroleKey(roles[0].roleKey);
-    // } else {
-    //   // 璁剧疆榛樿瑙掕壊鎴栨彁绀虹敤鎴�
-    //   userStore.setroleKey("user"); // 鍋囪"user"鏄粯璁よ鑹�
-    // }
-
-    // 6. 瀛樺偍鐢ㄦ埛淇℃伅
-    userStore.setUserInfo(userInfo);
-
-    // 7. 璺宠浆鍒扮洰鏍囬〉闈�
-    const redirects = redirect.value || "/pages/index/index";
-
-    // 鍒ゆ柇鏄惁涓簍abBar椤甸潰
-    const tabBarPages = [
-      "/pages/index/index",
-      "/pages/appointment/index",
-      "/pages/consultation/index",
-      "/pages/my/index",
-    ];
-    if (tabBarPages.includes(redirects)) {
-      console.log(redirects, "棰勮矾鐢�1");
-      uni.switchTab({ url: redirects });
-    } else {
-      console.log(redirects, "棰勮矾鐢�2");
-      uni.redirectTo({ url: redirects });
-    }
+    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",
-  });
+/**
+ * 鏍规嵁 redirect 璺宠浆
+ */
+const navigateToTarget = () => {
+  if (redirect.value) {
+    return navigateToTargetPage(redirect.value, {});
+  } else {
+    console.log("娌℃湁鐩爣椤甸潰锛岃烦杞椤�");
+    uni.switchTab({ url: "/pages/index/index" });
+    return Promise.resolve(true);
+  }
 };
 
-const gotoForgetPassword = () => {
-  uni.navigateTo({
-    url: "/pages/login/ForgetPwd",
-  });
-};
+/**
+ * 閫氱敤璺宠浆鍑芥暟
+ * @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;
+    }
 
-const appleLogin = () => {
-  uni.showToast({
-    title: "鏆傛湭寮�閫� Apple 鐧诲綍",
-    icon: "none",
-  });
-};
+    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";
+    }
 
-const harmonyLogin = () => {
-  // 璋冪敤楦胯挋鐧诲綍鎻掍欢
-  // #ifdef HARMONY
-  const harmonyAuth = uni.requireNativePlugin("Harmony-Auth");
-  harmonyAuth.login((result) => {
-    console.log("楦胯挋鐧诲綍缁撴灉:", result);
+    console.log("鏈�缁堣烦杞洰鏍嘦RL:", finalUrl);
+
+    const baseUrl = finalUrl.split("?")[0];
+    const isTabBar = tabBarPages.includes(baseUrl);
+
+    setTimeout(() => {
+      if (isTabBar) {
+        uni.switchTab({
+          url: baseUrl,
+          success: () => resolve(true),
+          fail: (err) => {
+            console.error("switchTab澶辫触:", err);
+            uni.switchTab({ url: "/pages/index/index" });
+            resolve(false);
+          },
+        });
+      } else {
+        uni.redirectTo({
+          url: finalUrl,
+          success: () => resolve(true),
+          fail: (err) => {
+            console.error("redirectTo澶辫触:", err);
+            uni.switchTab({ url: "/pages/index/index" });
+            resolve(false);
+          },
+        });
+      }
+    }, 300);
   });
-  // #endif
 };
 </script>
 
@@ -183,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 {
@@ -251,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