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 | 340 ++++++++++++++++++++++++++++++++++++++++----------------
1 files changed, 244 insertions(+), 96 deletions(-)
diff --git a/pages/login/Login.vue b/pages/login/Login.vue
index 1ef8054..fd82eea 100644
--- a/pages/login/Login.vue
+++ b/pages/login/Login.vue
@@ -1,16 +1,20 @@
<template>
<view class="login-container">
- <view class="header">
- <image src="/static/avatar/logo.jpg" class="logo" />
- <text class="hospital-name">闈掑矝OPO</text>
+ <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,120 +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) => {
- if (options.redirect) {
- redirect.value = decodeURIComponent(options.redirect);
+// tabBar 椤甸潰鍒楄〃锛堜笌 pages.json 淇濇寔涓�鑷达級
+const tabBarPages = [
+ "/pages/index/index",
+ "/pages/appointment/index",
+ "/pages/consultation/index",
+ "/pages/my/index",
+];
+
+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);
}
- // 妫�娴嬫槸鍚﹂缚钂欑郴缁�
- // #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 {
+ if (!username.value || !password.value) {
+ uni.showToast({ title: "璇疯緭鍏ヨ处鍙峰瘑鐮�", icon: "none" });
+ return;
+ }
+ uni.showLoading({ title: "鐧诲綍涓�...", mask: true });
+
const userStore = useUserStore();
-
- // 1. 鐧诲綍鑾峰彇token
+ 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);
-
- // 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);
+ if (!loginRes || !loginRes.token) throw new Error("鐧诲綍澶辫触");
+ setToken(loginRes.token);
- // 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 userInfo = await uni.$uapi.get("/getInfo");
+ if (userInfo && userInfo.user) {
+ userStore.setUserInfo(userInfo.user);
+
+ if (userInfo.roles) userStore.setroleKey(userInfo.roles);
}
+
+ 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>
@@ -158,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 {
@@ -226,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