1 line
29 KiB
Plaintext
1 line
29 KiB
Plaintext
{"version":3,"sources":["pages/user/login.uvue","uni_modules/ak-req/ak-req.uts"],"sourcesContent":["<template>\r\n <view class=\"page\" :style=\"cssVars\">\r\n <!-- Header:仅保留左侧Logo -->\r\n <view class=\"header\">\r\n <view class=\"header-left\">\r\n <image :src=\"logoUrl\" mode=\"aspectFit\" class=\"logo\" />\r\n </view>\r\n </view>\r\n\r\n <!-- Main -->\r\n <view class=\"main\">\r\n <view class=\"card\">\r\n <!-- Left:扫码区(>=768显示) -->\r\n <view class=\"left\">\r\n <text class=\"left-title\">APP 扫码登录</text>\r\n\r\n <view class=\"left-hint\">\r\n <text class=\"hint-text\">打开 APP 扫一扫</text>\r\n <text class=\"hint-link\" @click=\"handleTutorial\">查看教程</text>\r\n </view>\r\n\r\n <view class=\"qr-wrap\">\r\n <view class=\"qr\">\r\n <view class=\"qr-placeholder\">\r\n <text class=\"qr-text\">二维码占位</text>\r\n <text class=\"qr-sub\">220×220</text>\r\n </view>\r\n </view>\r\n </view>\r\n </view>\r\n\r\n <!-- Divider -->\r\n <view class=\"divider\"></view>\r\n\r\n <!-- Right:表单区 -->\r\n <view class=\"right\">\r\n <view class=\"right-inner\">\r\n <!-- Tabs -->\r\n <view class=\"tabs\">\r\n <view class=\"tab\" :class=\"{ active: loginType === 0 }\" @click=\"loginType = 0\">\r\n <text class=\"tab-text\">密码登录</text>\r\n <view v-if=\"loginType === 0\" class=\"tab-line\"></view>\r\n </view>\r\n\r\n <view class=\"tab\" :class=\"{ active: loginType === 1 }\" @click=\"loginType = 1\">\r\n <text class=\"tab-text\">短信登录</text>\r\n <view v-if=\"loginType === 1\" class=\"tab-line\"></view>\r\n </view>\r\n </view>\r\n\r\n <!-- Form -->\r\n <view class=\"form\">\r\n <template v-if=\"loginType === 0\">\r\n <view class=\"field\">\r\n <input\r\n class=\"input\"\r\n type=\"text\"\r\n placeholder=\"账号名/手机号/邮箱\"\r\n :value=\"account\"\r\n @input=\"(e: any) => account = e.detail.value\"\r\n />\r\n </view>\r\n <view class=\"field\">\r\n <input\r\n class=\"input\"\r\n type=\"password\"\r\n placeholder=\"密码\"\r\n :value=\"password\"\r\n @input=\"(e: any) => password = e.detail.value\"\r\n />\r\n </view>\r\n </template>\r\n\r\n <template v-else>\r\n <view class=\"field\">\r\n <input\r\n class=\"input\"\r\n type=\"text\"\r\n placeholder=\"输入手机号码\"\r\n maxlength=\"11\"\r\n :value=\"account\"\r\n @input=\"(e: any) => account = e.detail.value\"\r\n />\r\n </view>\r\n\r\n <view class=\"field code-row\">\r\n <input\r\n class=\"input code-input\"\r\n type=\"text\"\r\n placeholder=\"填写验证码\"\r\n maxlength=\"6\"\r\n :value=\"captcha\"\r\n @input=\"(e: any) => captcha = e.detail.value\"\r\n />\r\n <view class=\"code-btn\" :class=\"{ disabled: codeDisabled }\" @click=\"getCode\">\r\n <text class=\"code-text\">{{ codeText }}</text>\r\n </view>\r\n </view>\r\n </template>\r\n\r\n <!-- Button -->\r\n <view class=\"btn\" :class=\"{ disabled: isLoading }\" @click=\"handleLogin\">\r\n <text class=\"btn-text\">登录</text>\r\n </view>\r\n\r\n <!-- Actions:一行横排 -->\r\n <view class=\"actions\">\r\n <view class=\"action-item\" @click=\"handleWechatLogin\">\r\n <view class=\"dot wechat\"></view>\r\n <text class=\"action-text\">微信登录</text>\r\n </view>\r\n\r\n <text class=\"sep\">|</text>\r\n\r\n <view class=\"action-item\" @click=\"handleQQLogin\">\r\n <view class=\"dot qq\"></view>\r\n <text class=\"action-text\">QQ登录</text>\r\n </view>\r\n\r\n <text class=\"sep\">|</text>\r\n\r\n <text class=\"action-link\" @click=\"handleForgotPassword\">忘记密码</text>\r\n\r\n <text class=\"sep\">|</text>\r\n\r\n <text class=\"action-link\" @click=\"navigateToRegister\">立即注册</text>\r\n </view>\r\n </view>\r\n </view>\r\n </view>\r\n </view>\r\n </view>\r\n\r\n <!-- Footer -->\r\n <view class=\"footer\">\r\n <text class=\"footer-text\">Copyright ©2024 Mall. All Rights Reserved</text>\r\n </view>\r\n </view>\r\n</template>\r\n\r\n<script setup lang=\"uts\">\r\nimport { ref, onMounted } from 'vue'\r\nimport supa from '@/components/supadb/aksupainstance.uts'\r\nimport { IS_TEST_MODE } from '@/ak/config.uts'\r\nimport { getCurrentUser, logout } from '@/utils/store.uts'\r\n\r\nconst cssVars = {\r\n '--bg': '#f5f6f8',\r\n '--card': '#ffffff',\r\n '--brand': '#e1251b',\r\n '--text': '#333333',\r\n '--muted': '#666666',\r\n '--muted2': '#999999',\r\n '--border': '#eeeeee',\r\n '--inputbg': '#f6f7f9',\r\n '--shadow': '0 2px 12px rgba(0,0,0,0.06)'\r\n}\r\n\r\nconst logoUrl = ref<string>('/static/logo.png')\r\n\r\nconst loginType = ref<number>(0)\r\nconst account = ref<string>('')\r\nconst password = ref<string>('')\r\nconst captcha = ref<string>('')\r\n\r\nconst isLoading = ref<boolean>(false)\r\n\r\nconst codeDisabled = ref<boolean>(false)\r\nconst codeText = ref<string>('获取验证码')\r\nlet codeTimer: number | null = null\r\nconst codeCountdown = ref<number>(0)\r\n\r\nonMounted(() => {\r\n try {\r\n if (IS_TEST_MODE) return\r\n const sessionInfo = supa.getSession()\r\n if (sessionInfo != null && sessionInfo.user != null) {\r\n const pages = getCurrentPages() as any[]\r\n const currentPage = pages.length > 0 ? pages[pages.length - 1] : null\r\n const opts = currentPage?.options as any\r\n const redirect = opts?.redirect as string | null\r\n if (redirect != null && redirect.length > 0) {\r\n uni.redirectTo({ url: decodeURIComponent(redirect) })\r\n } else {\r\n uni.switchTab({ url: '/pages/mall/consumer/index' })\r\n }\r\n }\r\n } catch (e) {\r\n console.error('检查登录状态失败:', e)\r\n }\r\n})\r\n\r\nconst validateAccount = (): boolean => {\r\n if (account.value.trim() === '') {\r\n uni.showToast({ title: '请填写账号', icon: 'none' })\r\n return false\r\n }\r\n if (loginType.value === 1) {\r\n if (!/^1[3-9]\\d{9}$/.test(account.value)) {\r\n uni.showToast({ title: '请输入正确的手机号码', icon: 'none' })\r\n return false\r\n }\r\n }\r\n return true\r\n}\r\n\r\nconst validatePassword = (): boolean => {\r\n if (password.value.trim() === '') {\r\n uni.showToast({ title: '请填写密码', icon: 'none' })\r\n return false\r\n }\r\n if (password.value.length < 6) {\r\n uni.showToast({ title: '密码长度不能少于6位', icon: 'none' })\r\n return false\r\n }\r\n return true\r\n}\r\n\r\nconst validateCaptcha = (): boolean => {\r\n if (captcha.value.trim() === '') {\r\n uni.showToast({ title: '请填写验证码', icon: 'none' })\r\n return false\r\n }\r\n if (!/^\\d{6}$/.test(captcha.value)) {\r\n uni.showToast({ title: '请输入正确的验证码', icon: 'none' })\r\n return false\r\n }\r\n return true\r\n}\r\n\r\nconst getCode = async () => {\r\n if (codeDisabled.value) return\r\n if (!validateAccount()) return\r\n\r\n uni.showToast({ title: '验证码已发送', icon: 'success' })\r\n\r\n codeDisabled.value = true\r\n codeCountdown.value = 60\r\n codeText.value = `${codeCountdown.value}秒后重试`\r\n\r\n codeTimer = setInterval(() => {\r\n codeCountdown.value--\r\n if (codeCountdown.value > 0) {\r\n codeText.value = `${codeCountdown.value}秒后重试`\r\n } else {\r\n codeDisabled.value = false\r\n codeText.value = '获取验证码'\r\n if (codeTimer != null) {\r\n clearInterval(codeTimer)\r\n codeTimer = null\r\n }\r\n }\r\n }, 1000) as unknown as number\r\n}\r\n\r\nconst handleLogin = async () => {\r\n if (!validateAccount()) return\r\n\r\n // 特殊账号处理:admin/admin 直接跳转\r\n if (account.value === 'admin' && password.value === 'admin') {\r\n setIsLoggedIn(true)\r\n const adminProfile = {\r\n id: 'admin',\r\n username: 'Admin',\r\n email: 'admin@mall.com',\r\n gender: 'unknown',\r\n birthday: '',\r\n height_cm: 0,\r\n weight_kg: 0,\r\n bio: 'Administrator',\r\n avatar_url: '/static/logo.png',\r\n preferred_language: 'zh-CN',\r\n role: 'admin',\r\n school_id: '',\r\n grade_id: '',\r\n class_id: ''\r\n } as UserProfile\r\n setUserProfile(adminProfile)\r\n \r\n uni.showToast({ title: '管理员登录成功', icon: 'success' })\r\n setTimeout(() => {\r\n uni.switchTab({ url: '/pages/mall/consumer/index' })\r\n }, 500)\r\n return\r\n }\r\n\r\n if (loginType.value === 0) {\r\n if (!validatePassword()) return\r\n } else {\r\n if (!validateCaptcha()) return\r\n }\r\n\r\n isLoading.value = true\r\n try {\r\n logout()\r\n\r\n if (loginType.value === 0) {\r\n const isEmail = account.value.includes('@')\r\n if (isEmail) {\r\n // 邮箱 + 密码登录(Supabase Auth)\r\n const result = await supa.signIn(account.value.trim(), password.value)\r\n console.log('signIn result:', result)\r\n \r\n // 检查登录是否失败\r\n if (result.user == null) {\r\n // 检查是否是邮箱未确认的错误\r\n const rawData = result.raw as UTSJSONObject\r\n const errorMsg = rawData?.getString('msg') ?? ''\r\n const errorCode = rawData?.getString('error_code') ?? ''\r\n \r\n if (errorMsg.includes('email') && errorMsg.includes('confirm') || \r\n errorCode === 'email_not_confirmed' ||\r\n errorMsg.includes('邮箱') && errorMsg.includes('确认')) {\r\n throw new Error('邮箱未确认,请先检查邮箱并点击确认链接')\r\n } else if (errorMsg.includes('Invalid login credentials') || \r\n errorCode === 'invalid_credentials') {\r\n throw new Error('邮箱或密码错误')\r\n } else {\r\n throw new Error(errorMsg != '' ? errorMsg : '登录失败,请重试')\r\n }\r\n }\r\n } else {\r\n uni.showToast({ title: '手机号密码登录功能开发中', icon: 'none' })\r\n return\r\n }\r\n } else {\r\n uni.showToast({ title: '手机验证码登录功能开发中', icon: 'none' })\r\n return\r\n }\r\n\r\n // 尝试获取/补全用户资料,但失败时不再阻塞登录\r\n try {\r\n const profile = await getCurrentUser()\r\n console.log('current user profile:', profile)\r\n } catch (e) {\r\n console.error('获取用户信息失败(忽略,不阻塞登录):', e)\r\n }\r\n\r\n // 显式保存用户ID到本地存储,确保页面刷新或重启后 SupabaseService 能恢复身份\r\n const currentSession = supa.getSession()\r\n if (currentSession.user != null) {\r\n const uid = currentSession.user?.getString('id')\r\n if (uid != null) {\r\n uni.setStorageSync('user_id', uid)\r\n console.log('用户ID已保存到本地存储:', uid)\r\n }\r\n }\r\n\r\n uni.showToast({ title: '登录成功', icon: 'success' })\r\n // if (!IS_TEST_MODE) {\r\n setTimeout(() => {\r\n const pages = getCurrentPages() as any[]\r\n const currentPage = pages.length > 0 ? pages[pages.length - 1] : null\r\n const opts = currentPage?.options as any\r\n const redirect = opts?.redirect as string | null\r\n if (redirect != null && redirect.length > 0) {\r\n uni.redirectTo({ url: decodeURIComponent(redirect) })\r\n } else {\r\n uni.switchTab({ url: '/pages/mall/consumer/index' })\r\n }\r\n }, 500)\r\n // }\r\n } catch (err) {\r\n console.error('登录错误:', err)\r\n let msg = '登录失败,请重试'\r\n if (err != null && typeof err === 'object') {\r\n const e = err as Error\r\n if (e.message != null && e.message.trim() !== '') msg = e.message\r\n }\r\n uni.showToast({ title: msg, icon: 'none' })\r\n } finally {\r\n isLoading.value = false\r\n }\r\n}\r\n\r\nconst navigateToRegister = () => {\r\n\tconst pages = getCurrentPages() as any[]\r\n\tconst currentPage = pages.length > 0 ? pages[pages.length - 1] : null\r\n\tconst opts = currentPage?.options as any\r\n\tconst redirect = opts?.redirect as string | null\r\n\r\n\tif (redirect != null && redirect.length > 0) {\r\n\t\tuni.navigateTo({\r\n\t\t\turl: `/pages/user/register?redirect=${redirect}`\r\n\t\t})\r\n\t} else {\r\n\t\tuni.navigateTo({\r\n\t\t\turl: '/pages/user/register'\r\n\t\t})\r\n\t}\r\n}\r\nconst handleTutorial = () => uni.showToast({ title: '扫码教程开发中', icon: 'none' })\r\nconst handleForgotPassword = () => uni.showToast({ title: '忘记密码开发中', icon: 'none' })\r\nconst handleWechatLogin = () => uni.showToast({ title: '微信登录开发中', icon: 'none' })\r\nconst handleQQLogin = () => uni.showToast({ title: 'QQ登录开发中', icon: 'none' })\r\n</script>\r\n\r\n<style scoped>\r\n/* Base */\r\n.page{\r\n /* min-height: 100vh; */ /* UVUE 不支持 vh */\r\n flex: 1;\r\n display: flex;\r\n flex-direction: column;\r\n background-color: #f5f6f8; /* UVUE 暂不支持 cssVars 在 style 标签中的变量引用 */\r\n}\r\n\r\n/* Header */\r\n.header{\r\n display: flex;\r\n flex-direction: row;\r\n align-items: center;\r\n justify-content: flex-start;\r\n padding: 30px 40px; /* 调整边距 */\r\n}\r\n.logo{\r\n width: 240px;\r\n height: 64px;\r\n}\r\n\r\n/* Main */\r\n.main{\r\n flex: 1;\r\n display: flex;\r\n flex-direction: row;\r\n align-items: center;\r\n justify-content: center;\r\n padding: 20px 10px;\r\n}\r\n\r\n/* Card */\r\n.card{\r\n /* width: min(980px, 92vw); UVUE 不支持 min/vw */\r\n /* min-height: 460px; */\r\n width: 90%;\r\n background-color: #ffffff;\r\n border-radius: 16px;\r\n /* box-shadow: var(--shadow); */\r\n padding: 30px;\r\n display: flex;\r\n flex-direction: column; /* App端改为列式布局兼容性更好,或者用 row 需注意 */\r\n /* gap: 32px; UVUE 不支持 gap */\r\n}\r\n\r\n/* Left - 暂隐藏或简化 */\r\n/* .left{ display: none; } */\r\n\r\n.left{\r\n /* flex: 0 0 52%; UVUE flex 简写支持不全,建议用 flex-grow/basis */\r\n flex-direction: column;\r\n align-items: flex-start;\r\n justify-content: center;\r\n /* padding-left: 18px; */\r\n display: none; /* 移动端 App 暂时隐藏扫码区 */\r\n}\r\n.left-title{\r\n font-size: 18px;\r\n font-weight: 700; /* 600 -> 700 */\r\n color: #333333;\r\n margin-bottom: 10px;\r\n}\r\n.left-hint{\r\n display: flex;\r\n flex-direction: row;\r\n align-items: center;\r\n /* gap: 14px; */\r\n margin-bottom: 18px;\r\n}\r\n/* 替代 gap */\r\n.hint-text{ font-size: 13px; color: #666666; margin-right: 14px; }\r\n.hint-link{ font-size: 13px; color: #e1251b; }\r\n\r\n.qr-wrap{\r\n width: 100%;\r\n display: flex;\r\n flex-direction: row;\r\n justify-content: flex-start;\r\n}\r\n.qr{\r\n width: 240px;\r\n height: 240px;\r\n display: flex;\r\n flex-direction: row;\r\n align-items: center;\r\n justify-content: center;\r\n}\r\n.qr-placeholder{\r\n width: 220px;\r\n height: 220px;\r\n border: 1px solid #e6e6e6;\r\n border-radius: 8px;\r\n background-color: #fff;\r\n display: flex;\r\n flex-direction: column;\r\n align-items: center;\r\n justify-content: center;\r\n /* gap: 8px; */\r\n}\r\n/* 替代 gap */\r\n.qr-text{ font-size: 14px; color: #666666; margin-bottom: 8px; }\r\n.qr-sub{ font-size: 12px; color: #999999; }\r\n\r\n/* Divider */\r\n.divider{\r\n display: none; /* 移动端隐藏分割线 */\r\n}\r\n\r\n/* Right */\r\n.right{\r\n flex: 1;\r\n display: flex;\r\n flex-direction: column;\r\n justify-content: center;\r\n}\r\n.right-inner{\r\n /* width: 360px; */\r\n /* max-width: 100%; UVUE 不支持百分比 max-width */\r\n width: 100%;\r\n margin-left: auto;\r\n}\r\n\r\n/* Tabs */\r\n.tabs{\r\n display: flex;\r\n flex-direction: row;\r\n align-items: center;\r\n justify-content: center; /* 移动端居中 */\r\n /* gap: 24px; */\r\n margin-bottom: 18px;\r\n}\r\n.tab{\r\n position: relative;\r\n padding: 8px 12px; /* 增加内边距替代 gap */\r\n margin: 0 12px;\r\n}\r\n.tab-text{\r\n font-size: 16px;\r\n color: #666666;\r\n}\r\n.tab.active .tab-text{\r\n color: #e1251b;\r\n font-weight: 700; /* 600 -> 700 */\r\n}\r\n.tab-line{\r\n position: absolute;\r\n left: 0;\r\n right: 0;\r\n bottom: -6px;\r\n height: 2px;\r\n background-color: #e1251b;\r\n border-radius: 2px;\r\n}\r\n\r\n/* Form */\r\n.form{ margin-top: 10px; }\r\n.field{ margin-bottom: 14px; }\r\n.input{\r\n width: 100%;\r\n height: 44px;\r\n border-radius: 10px;\r\n background-color: #f6f7f9;\r\n padding: 0 14px;\r\n font-size: 14px;\r\n color: #333333;\r\n /* box-sizing: border-box; */ /* App-UVUE 默认就是 border-box */\r\n}\r\n\r\n/* Code row */\r\n.code-row{\r\n display: flex;\r\n flex-direction: row;\r\n align-items: center;\r\n /* gap: 10px; */\r\n}\r\n.code-input{ flex: 1; margin-right: 10px; }\r\n.code-btn{\r\n height: 44px;\r\n padding: 0 12px;\r\n border-radius: 10px;\r\n background-color: #fff;\r\n border: 1px solid #eee;\r\n display: flex;\r\n flex-direction: row;\r\n align-items: center;\r\n justify-content: center;\r\n}\r\n.code-btn.disabled{ opacity: 0.5; }\r\n.code-text{ font-size: 13px; color: #e1251b; }\r\n\r\n/* Button */\r\n.btn{\r\n margin-top: 16px;\r\n height: 46px;\r\n border-radius: 10px;\r\n background-color: rgba(225, 37, 27, 0.45); /* 注意 rgba 兼容性,建议用 hex 或 view opacity */\r\n display: flex;\r\n flex-direction: row;\r\n align-items: center;\r\n justify-content: center;\r\n}\r\n.btn.disabled{ background-color: #d9d9d9; }\r\n.btn-text{\r\n color: #fff;\r\n font-size: 16px;\r\n font-weight: 700; /* 600 -> 700 */\r\n}\r\n\r\n/* Actions:一行横排 */\r\n.actions{\r\n margin-top: 16px;\r\n display: flex;\r\n flex-direction: row;\r\n align-items: center;\r\n justify-content: center;\r\n /* gap: 12px; */\r\n flex-wrap: wrap; /* 允许换行 */\r\n}\r\n.action-item{\r\n display: flex;\r\n flex-direction: row;\r\n align-items: center;\r\n /* gap: 8px; */\r\n margin: 0 6px;\r\n}\r\n.dot{\r\n width: 16px;\r\n height: 16px;\r\n border-radius: 8px; /* 50% -> 8px (一半) */\r\n margin-right: 8px;\r\n}\r\n.dot.wechat{ background-color: #19be6b; }\r\n.dot.qq{ background-color: #2d8cf0; }\r\n\r\n.action-text{ font-size: 13px; color: #666666; }\r\n.action-link{ font-size: 13px; color: #666666; margin: 0 6px; }\r\n.sep{ font-size: 13px; color: #e0e0e0; margin: 0 6px; }\r\n\r\n/* Footer */\r\n.footer{\r\n padding: 18px 0 28px;\r\n display: flex;\r\n flex-direction: row;\r\n justify-content: center;\r\n}\r\n.footer-text{ font-size: 12px; color: #999999; }\r\n\r\n/* ===== 自适应:移除复杂 Media Query,使用简单流式布局 ===== */\r\n/*\r\n@media screen and (max-width: 1024px){\r\n .header{ padding: 24px 20px; }\r\n .logo{ width: 240px; height: 68px; }\r\n .card{ width: 92vw; padding: 28px; gap: 22px; }\r\n .right-inner{ width: 360px; }\r\n}\r\n@media screen and (max-width: 768px){\r\n .card{ flex-direction: column; min-height: auto; }\r\n .left{ display: none; }\r\n .divider{ display: none; }\r\n .right-inner{ width: 100%; margin-left: 0; }\r\n .actions{ flex-wrap: wrap; }\r\n}\r\n@media screen and (max-width: 520px){\r\n .sep{ display: none; }\r\n}\r\n*/\r\n</style>\r\n",null],"names":[],"mappings":"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"} |