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 | 305 ++++++++++++++++++++++++++++++++++++++------------
1 files changed, 230 insertions(+), 75 deletions(-)
diff --git a/pages/login/Login.vue b/pages/login/Login.vue
index 1ef8054..71b5c44 100644
--- a/pages/login/Login.vue
+++ b/pages/login/Login.vue
@@ -1,8 +1,8 @@
<template>
<view class="login-container">
<view class="header">
- <image src="/static/avatar/logo.jpg" class="logo" />
- <text class="hospital-name">闈掑矝OPO</text>
+ <image src="/static/avatar/logo.png" class="logo" />
+ <text class="hospital-name">闈掑ぇ闄勯櫌OPO绠$悊骞冲彴</text>
</view>
<view class="form-container">
@@ -46,109 +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) => {
+ console.log("鐧诲綍椤祇nLoad锛屽畬鏁村弬鏁�:", options);
+ console.log("椤甸潰鏍�:", getCurrentPages());
+
+ // 鉁� 鑾峰彇瀹屾暣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);
+ }
}
- // 妫�娴嬫槸鍚﹂缚钂欑郴缁�
- // #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 = "";
+ }
});
-const handleLogin = async () => {
+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();
-
- // 1. 鐧诲綍鑾峰彇token
- const loginRes = await uni.$uapi.post("/login", {
- username: username.value,
- password: password.value,
+ 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,
});
- // 2. 瀛樺偍token
- userStore.setToken(loginRes.token);
-
- // 3. 鑾峰彇鐢ㄦ埛淇℃伅
- let userInfo;
- try {
- userInfo = await uni.$uapi.get("/getInfo");
- } catch (err) {
- throw new Error("鑾峰彇鐢ㄦ埛淇℃伅澶辫触锛�" + (err.message || "鏈煡閿欒"));
- }
-
- // 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);
+ uni.removeStorageSync("token");
+ } finally {
+ isAutoLogining = false;
+ }
+};
- // 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)) {
- uni.switchTab({ url: redirects });
- } else {
- uni.redirectTo({ url: redirects });
+// 鏅�氱櫥褰�
+const handleLogin = async () => {
+ try {
+ 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,
+ });
+
+ if (!loginRes || !loginRes.token) {
+ throw new Error("鐧诲綍澶辫触");
+ }
+
+ setToken(loginRes.token);
+
+ const userInfo = await uni.$uapi.get("/getInfo");
+ 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