1 line
22 KiB
Plaintext
1 line
22 KiB
Plaintext
{"version":3,"sources":["pages/user/register.uvue","pages/user/login.uvue","uni_modules/ak-req/ak-req.uts"],"sourcesContent":["<template>\r\n\t<view class=\"register-wrapper\">\r\n\t\t<!-- Header Logo -->\r\n\t\t<view class=\"header\">\r\n\t\t\t<image :src=\"logoUrl\" mode=\"aspectFit\" class=\"logo\" />\r\n\t\t</view>\r\n\r\n\t\t<!-- 注册表单区域 -->\r\n\t\t<view class=\"register-box\">\r\n\t\t\t<view class=\"title\">注册账号</view>\r\n\r\n\t\t\t<!-- 注册表单 -->\r\n\t\t\t<view class=\"form-content\">\r\n\t\t\t\t<!-- 邮箱 -->\r\n\t\t\t\t<view class=\"input-group\">\r\n\t\t\t\t\t<view class=\"input-wrapper\">\r\n\t\t\t\t\t\t<image src=\"/static/user/phone_1.png\" class=\"input-icon\" />\r\n\t\t\t\t\t\t<input \r\n\t\t\t\t\t\t\ttype=\"text\" \r\n\t\t\t\t\t\t\tplaceholder=\"输入邮箱\" \r\n\t\t\t\t\t\t\t:value=\"email\" \r\n\t\t\t\t\t\t\t@input=\"(e: any) => email = e.detail.value\"\r\n\t\t\t\t\t\t\tclass=\"input-field\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</view>\r\n\t\t\t\t</view>\r\n\r\n\t\t\t\t<!-- 密码 -->\r\n\t\t\t\t<view class=\"input-group\">\r\n\t\t\t\t\t<view class=\"input-wrapper\">\r\n\t\t\t\t\t\t<image src=\"/static/user/code_1.png\" class=\"input-icon\" />\r\n\t\t\t\t\t\t<input \r\n\t\t\t\t\t\t\ttype=\"password\" \r\n\t\t\t\t\t\t\tplaceholder=\"填写密码\" \r\n\t\t\t\t\t\t\t:value=\"password\" \r\n\t\t\t\t\t\t\t@input=\"(e: any) => password = e.detail.value\"\r\n\t\t\t\t\t\t\tclass=\"input-field\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</view>\r\n\t\t\t\t</view>\r\n\r\n\t\t\t\t<!-- 确认密码 -->\r\n\t\t\t\t<view class=\"input-group\">\r\n\t\t\t\t\t<view class=\"input-wrapper\">\r\n\t\t\t\t\t\t<image src=\"/static/user/code_1.png\" class=\"input-icon\" />\r\n\t\t\t\t\t\t<input \r\n\t\t\t\t\t\t\ttype=\"password\" \r\n\t\t\t\t\t\t\tplaceholder=\"确认密码\" \r\n\t\t\t\t\t\t\t:value=\"confirmPassword\" \r\n\t\t\t\t\t\t\t@input=\"(e: any) => confirmPassword = e.detail.value\"\r\n\t\t\t\t\t\t\tclass=\"input-field\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t</view>\r\n\t\t\t\t</view>\r\n\t\t\t</view>\r\n\r\n\t\t\t<!-- 注册按钮 -->\r\n\t\t\t<view class=\"register-btn\" @click=\"handleRegister\" :class=\"{ 'disabled': isLoading }\">\r\n\t\t\t\t注册\r\n\t\t\t</view>\r\n\r\n\t\t\t<!-- 已有账号 -->\r\n\t\t\t<view class=\"tips\">\r\n\t\t\t\t<text class=\"tips-text\">已有账号?</text>\r\n\t\t\t\t<text class=\"tips-link\" @click=\"navigateToLogin\">立即登录</text>\r\n\t\t\t</view>\r\n\r\n\t\t\t<!-- 协议勾选 -->\r\n\t\t\t<view class=\"protocol\">\r\n\t\t\t\t<checkbox-group @change=\"handleProtocolChange\">\r\n\t\t\t\t\t<checkbox \r\n\t\t\t\t\t\tclass=\"protocol-checkbox\"\r\n\t\t\t\t\t\t:checked=\"protocol\" \r\n\t\t\t\t\t\t:class=\"{ 'trembling': inAnimation }\"\r\n\t\t\t\t\t\t@animationend=\"inAnimation = false\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t\t<text class=\"protocol-text\">\r\n\t\t\t\t\t\t已阅读并同意\r\n\t\t\t\t\t\t<text class=\"main-color\" @click=\"navigateToTerms(3)\">《用户协议》</text>\r\n\t\t\t\t\t\t与\r\n\t\t\t\t\t\t<text class=\"main-color\" @click=\"navigateToTerms(4)\">《隐私协议》</text>\r\n\t\t\t\t\t</text>\r\n\t\t\t\t</checkbox-group>\r\n\t\t\t</view>\r\n\t\t</view>\r\n\r\n\t\t<!-- 底部版权信息 -->\r\n\t\t<view class=\"footer\">\r\n\t\t\t<text class=\"footer-text\">Copyright ©2024 Mall. All Rights Reserved</text>\r\n\t\t</view>\r\n\t</view>\r\n</template>\r\n\r\n<script setup lang=\"uts\">\r\n\timport { ref } from 'vue'\r\n\timport supa from '@/components/supadb/aksupainstance.uts'\r\n\timport { ensureUserProfile } from '@/utils/sapi.uts'\r\n\r\n\t// 响应式数据\r\n\tconst email = ref<string>('')\r\n\tconst password = ref<string>('')\r\n\tconst confirmPassword = ref<string>('')\r\n\tconst protocol = ref<boolean>(false)\r\n\tconst inAnimation = ref<boolean>(false)\r\n\tconst isLoading = ref<boolean>(false)\r\n\tconst logoUrl = ref<string>('/static/logo.png')\r\n\r\n\t// 处理协议勾选变化\r\n\tconst handleProtocolChange = (e: any) => {\r\n\t\tprotocol.value = !protocol.value\r\n\t}\r\n\r\n\t// 验证邮箱\r\n\tconst validateEmail = (): boolean => {\r\n\t\tif (email.value.trim() === '') {\r\n\t\t\tuni.showToast({\r\n\t\t\t\ttitle: '请填写邮箱',\r\n\t\t\t\ticon: 'none'\r\n\t\t\t})\r\n\t\t\treturn false\r\n\t\t}\r\n\t\t// 基础邮箱格式校验(足够用于前端提示)\r\n\t\tif (!/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(email.value)) {\r\n\t\t\tuni.showToast({\r\n\t\t\t\ttitle: '请输入正确的邮箱',\r\n\t\t\t\ticon: 'none'\r\n\t\t\t})\r\n\t\t\treturn false\r\n\t\t}\r\n\t\treturn true\r\n\t}\r\n\r\n\t// 验证密码\r\n\tconst validatePassword = (): boolean => {\r\n\t\tif (password.value.trim() === '') {\r\n\t\t\tuni.showToast({\r\n\t\t\t\ttitle: '请填写密码',\r\n\t\t\t\ticon: 'none'\r\n\t\t\t})\r\n\t\t\treturn false\r\n\t\t}\r\n\t\tif (password.value.length < 6) {\r\n\t\t\tuni.showToast({\r\n\t\t\t\ttitle: '密码长度不能少于6位',\r\n\t\t\t\ticon: 'none'\r\n\t\t\t})\r\n\t\t\treturn false\r\n\t\t}\r\n\t\t// 密码不能过于简单\r\n\t\tif (/^([0-9]|[a-z]|[A-Z]){0,6}$/i.test(password.value)) {\r\n\t\t\tuni.showToast({\r\n\t\t\t\ttitle: '您输入的密码过于简单',\r\n\t\t\t\ticon: 'none'\r\n\t\t\t})\r\n\t\t\treturn false\r\n\t\t}\r\n\t\treturn true\r\n\t}\r\n\r\n\t// 验证确认密码\r\n\tconst validateConfirmPassword = (): boolean => {\r\n\t\tif (confirmPassword.value.trim() === '') {\r\n\t\t\tuni.showToast({\r\n\t\t\t\ttitle: '请确认密码',\r\n\t\t\t\ticon: 'none'\r\n\t\t\t})\r\n\t\t\treturn false\r\n\t\t}\r\n\t\tif (confirmPassword.value !== password.value) {\r\n\t\t\tuni.showToast({\r\n\t\t\t\ttitle: '两次输入的密码不一致',\r\n\t\t\t\ticon: 'none'\r\n\t\t\t})\r\n\t\t\treturn false\r\n\t\t}\r\n\t\treturn true\r\n\t}\r\n\r\n\t// 处理注册\r\n\tconst handleRegister = async () => {\r\n\t\t// 检查协议\r\n\t\tif (!protocol.value) {\r\n\t\t\tinAnimation.value = true\r\n\t\t\tuni.showToast({\r\n\t\t\t\ttitle: '请先阅读并同意协议',\r\n\t\t\t\ticon: 'none'\r\n\t\t\t})\r\n\t\t\treturn\r\n\t\t}\r\n\r\n\t\t// 表单验证\r\n\t\tif (!validateEmail()) {\r\n\t\t\treturn\r\n\t\t}\r\n\t\tif (!validatePassword()) {\r\n\t\t\treturn\r\n\t\t}\r\n\t\tif (!validateConfirmPassword()) {\r\n\t\t\treturn\r\n\t\t}\r\n\r\n\t\tisLoading.value = true\r\n\r\n\t\ttry {\r\n\t\t\t// 使用 Supabase Auth:邮箱 + 密码注册\r\n\t\t\tconst result = await supa.signUp(email.value.trim(), password.value)\r\n\t\t\t\r\n\t\t\tconsole.log('📝 注册返回结果:', result)\r\n\t\t\tconsole.log('📝 注册返回结果(JSON):', JSON.stringify(result))\r\n\t\t\t\r\n\t\t\t// 检查是否有错误(邮件发送失败等)\r\n\t\t\tconst errorCode = result?.getString('error_code') ?? ''\r\n\t\t\tconst errorMsg = result?.getString('msg') ?? ''\r\n\t\t\tconst code = result?.getNumber('code') ?? 0\r\n\t\t\t\r\n\t\t\tconsole.log('📝 错误代码:', errorCode, '错误信息:', errorMsg, '状态码:', code)\r\n\t\t\t\r\n\t\t\t// 如果返回 500 错误且是邮件发送失败,但用户可能已创建\r\n\t\t\tif (code === 500 && (errorCode === 'unexpected_failure' || errorMsg.includes('confirmation email'))) {\r\n\t\t\t\tconsole.warn('⚠️ 邮件发送失败,但用户可能已创建,尝试获取用户信息')\r\n\t\t\t\t// 即使邮件发送失败,用户可能已经在 auth.users 中创建\r\n\t\t\t\t// 这里我们仍然尝试创建用户资料\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\t// signUp 返回的是 UTSJSONObject,Supabase signup API 返回结构:\r\n\t\t\t// { user: {...}, session: {...} } - 如果邮箱验证未开启\r\n\t\t\t// { user: {...} } - 如果邮箱验证已开启(需要验证邮箱后才能登录)\r\n\t\t\t// { code: 500, error_code: ..., msg: ... } - 如果发生错误(但用户可能已创建)\r\n\t\t\tlet user: UTSJSONObject | null = null\r\n\t\t\tlet hasSession = false\r\n\t\t\t\r\n\t\t\tif (result != null) {\r\n\t\t\t\t// 尝试获取 user 字段\r\n\t\t\t\tconst userField = result.getJSON('user')\r\n\t\t\t\tif (userField != null) {\r\n\t\t\t\t\tuser = userField\r\n\t\t\t\t\tconsole.log('✅ 找到 user 字段:', user.getString('id'), user.getString('email'))\r\n\t\t\t\t} else {\r\n\t\t\t\t\t// 如果没有 user 字段,可能 result 本身就是 user 对象\r\n\t\t\t\t\tconst id = result.getString('id')\r\n\t\t\t\t\tif (id != null && id !== '') {\r\n\t\t\t\t\t\tuser = result\r\n\t\t\t\t\t\tconsole.log('✅ result 本身就是 user 对象:', id)\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\t// console.warn('⚠️ 未找到 user 信息,检查所有字段:', Object.keys(result.toMap() || {}))\r\n\t\t\t\t\t\tconsole.warn('⚠️ 未找到 user 信息,检查所有字段')\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\t\r\n\t\t\t\t// 检查是否有 session(表示注册后自动登录成功)\r\n\t\t\t\tconst sessionField = result.getJSON('session')\r\n\t\t\t\tif (sessionField != null) {\r\n\t\t\t\t\thasSession = true\r\n\t\t\t\t\tconsole.log('✅ 找到 session,已自动登录')\r\n\t\t\t\t\t// 如果有 session,说明已经自动登录,token 应该已经设置\r\n\t\t\t\t\t// 此时可以直接创建用户资料\r\n\t\t\t\t} else {\r\n\t\t\t\t\tconsole.log('ℹ️ 未找到 session,可能需要邮箱验证')\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\t// 如果返回错误且没有用户信息,说明注册失败\r\n\t\t\tif (user == null && code !== 0 && code !== 200) {\r\n\t\t\t\t// 如果是邮件发送失败,给出明确的错误提示\r\n\t\t\t\tif (code === 500 && errorMsg.includes('confirmation email')) {\r\n\t\t\t\t\tthrow new Error('注册失败:邮件服务配置错误,请联系管理员或修改 Supabase 配置(设置 ENABLE_EMAIL_AUTOCONFIRM=true)')\r\n\t\t\t\t} else {\r\n\t\t\t\t\tthrow new Error(errorMsg != '' ? errorMsg : '注册失败,请重试')\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\t// 如果获取到 user,尝试创建业务侧用户资料(ak_users)\r\n\t\t\tif (user != null) {\r\n\t\t\t\ttry {\r\n\t\t\t\t\tconst profileResult = await ensureUserProfile(user)\r\n\t\t\t\t\tif (profileResult != null) {\r\n\t\t\t\t\t\tconsole.log('✅ 用户资料创建成功:', profileResult.id)\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tconsole.warn('⚠️ 用户资料创建失败,但注册已成功')\r\n\t\t\t\t\t\t// 如果创建失败,可能是因为 RLS 策略限制\r\n\t\t\t\t\t\t// 建议用户登录后再自动创建(在 getCurrentUser 中处理)\r\n\t\t\t\t\t}\r\n\t\t\t\t} catch (profileError) {\r\n\t\t\t\t\tconsole.error('❌ 创建用户资料异常:', profileError)\r\n\t\t\t\t\t// 即使创建资料失败,也不阻止注册流程\r\n\t\t\t\t\t// 用户登录时会自动创建(见 utils/store.uts 的 getCurrentUser)\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\tconsole.warn('⚠️ 注册成功但未获取到用户信息')\r\n\t\t\t\t// 可能需要邮箱验证,用户验证邮箱后登录时会自动创建资料\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\t// 如果注册后没有自动登录(需要邮箱验证),提示用户\r\n\t\t\tif (!hasSession && user != null) {\r\n\t\t\t\tconsole.log('ℹ️ 需要邮箱验证,验证后登录时会自动创建用户资料')\r\n\t\t\t}\r\n\r\n\t\t\tuni.showToast({\r\n\t\t\t\ttitle: '注册成功',\r\n\t\t\t\ticon: 'success'\r\n\t\t\t})\r\n\r\n\t\t\tsetTimeout(() => {\r\n\t\t\t\tuni.redirectTo({\r\n\t\t\t\t\turl: '/pages/user/login'\r\n\t\t\t\t})\r\n\t\t\t}, 1500)\r\n\t\t} catch (err) {\r\n\t\t\tconsole.error('注册错误:', err)\r\n\t\t\t\r\n\t\t\tlet errorMessage = '注册失败,请重试'\r\n\t\t\tif (err != null && typeof err === 'object') {\r\n\t\t\t\tconst error = err as Error\r\n\t\t\t\tif (error.message != null && error.message.trim() !== '') {\r\n\t\t\t\t\terrorMessage = error.message\r\n\t\t\t\t\t// 如果是邮件发送失败,给出更友好的提示\r\n\t\t\t\t\tif (error.message.includes('confirmation email') || error.message.includes('邮件')) {\r\n\t\t\t\t\t\terrorMessage = '注册可能成功,但邮件发送失败,请稍后尝试登录'\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\t\r\n\t\t\tuni.showToast({\r\n\t\t\t\ttitle: errorMessage,\r\n\t\t\t\ticon: 'none',\r\n\t\t\t\tduration: 3000\r\n\t\t\t})\r\n\t\t} finally {\r\n\t\t\tisLoading.value = false\r\n\t\t}\r\n\t}\r\n\r\n\t// 跳转到登录页\r\n\tconst navigateToLogin = () => {\r\n\t\tconst pages = getCurrentPages() as any[]\r\n\t\tconst currentPage = pages.length > 0 ? pages[pages.length - 1] : null\r\n\t\tconst opts = currentPage?.options as any\r\n\t\tconst redirect = opts?.redirect as string | null\r\n\r\n\t\tif (redirect != null && redirect.length > 0) {\r\n\t\t\tuni.navigateTo({\r\n\t\t\t\turl: `/pages/user/login?redirect=${redirect}`\r\n\t\t\t})\r\n\t\t} else {\r\n\t\t\tuni.navigateTo({\r\n\t\t\t\turl: '/pages/user/login'\r\n\t\t\t})\r\n\t\t}\r\n\t}\r\n\r\n\t// 跳转到协议页面\r\n\tconst navigateToTerms = (type: number) => {\r\n\t\tuni.navigateTo({\r\n\t\t\turl: `/pages/user/terms?type=${type}`\r\n\t\t})\r\n\t}\r\n</script>\r\n\r\n<style>\r\n/* page {\r\n\tbackground: #F5F5F5;\r\n} */\r\n\r\n.register-wrapper {\r\n\tflex: 1;\r\n\tdisplay: flex;\r\n\tflex-direction: column;\r\n\tbackground: #F5F5F5;\r\n}\r\n\r\n/* Header Logo */\r\n.header {\r\n\tpadding: 40rpx 0 0 60rpx;\r\n\tbackground: #F5F5F5;\r\n}\r\n\r\n.logo {\r\n\twidth: 200rpx;\r\n\theight: 80rpx;\r\n}\r\n\r\n/* 注册表单区域 */\r\n.register-box {\r\n\tflex: 1;\r\n\tbackground: #FFFFFF;\r\n\tmargin: 60rpx 40rpx 0;\r\n\tborder-radius: 8rpx;\r\n\tpadding: 60rpx 50rpx 40rpx;\r\n\tbox-shadow: 0 2rpx 8rpx rgba(0, 0, 0, 0.08);\r\n}\r\n\r\n.title {\r\n\tfont-size: 40rpx;\r\n\tfont-weight: 700;\r\n\tcolor: #333333;\r\n\ttext-align: center;\r\n\tmargin-bottom: 50rpx;\r\n}\r\n\r\n/* 表单内容 */\r\n.form-content {\r\n\tmargin-bottom: 40rpx;\r\n}\r\n\r\n.input-group {\r\n\tmargin-bottom: 30rpx;\r\n}\r\n\r\n.input-wrapper {\r\n\tposition: relative;\r\n\tdisplay: flex;\r\n\talign-items: center;\r\n\tpadding: 0 20rpx;\r\n\theight: 88rpx;\r\n\tborder: 1rpx solid #E0E0E0;\r\n\tborder-radius: 4rpx;\r\n\tbackground: #FFFFFF;\r\n}\r\n\r\n.input-wrapper:focus-within {\r\n\tborder-color: var(--view-theme, #FF4D4F);\r\n}\r\n\r\n.input-icon {\r\n\twidth: 32rpx;\r\n\theight: 32rpx;\r\n\tflex-shrink: 0;\r\n\tmargin-right: 20rpx;\r\n}\r\n\r\n.input-field {\r\n\tflex: 1;\r\n\tfont-size: 28rpx;\r\n\theight: 100%;\r\n\tcolor: #333333;\r\n}\r\n\r\n.code-input {\r\n\tflex: 1;\r\n}\r\n\r\n.code-btn {\r\n\tposition: absolute;\r\n\tright: 20rpx;\r\n\ttop: 50%;\r\n\ttransform: translateY(-50%);\r\n\tcolor: var(--view-theme, #FF4D4F);\r\n\tfont-size: 26rpx;\r\n\tbackground: transparent;\r\n\tborder: none;\r\n\tpadding: 0;\r\n\tline-height: 1;\r\n}\r\n\r\n.code-btn.disabled {\r\n\tcolor: #999999;\r\n}\r\n\r\n/* 注册按钮 */\r\n.register-btn {\r\n\tdisplay: flex;\r\n\talign-items: center;\r\n\tjustify-content: center;\r\n\twidth: 100%;\r\n\theight: 88rpx;\r\n\tmargin-top: 50rpx;\r\n\tbackground: linear-gradient(135deg, #FF4D4F 0%, #FF7A45 100%);\r\n\tborder-radius: 4rpx;\r\n\tcolor: #FFFFFF;\r\n\tfont-size: 32rpx;\r\n\tfont-weight: 700;\r\n\tbox-shadow: 0 4rpx 12rpx rgba(255, 77, 79, 0.3);\r\n}\r\n\r\n.register-btn.disabled {\r\n\tbackground: #D9D9D9;\r\n\tbox-shadow: none;\r\n\topacity: 0.6;\r\n}\r\n\r\n/* 已有账号提示 */\r\n.tips {\r\n\tmargin-top: 30rpx;\r\n\ttext-align: center;\r\n}\r\n\r\n.tips-text {\r\n\tfont-size: 28rpx;\r\n\tcolor: #666666;\r\n}\r\n\r\n.tips-link {\r\n\tfont-size: 28rpx;\r\n\tcolor: var(--view-theme, #FF4D4F);\r\n\tmargin-left: 8rpx;\r\n}\r\n\r\n/* 协议区域 */\r\n.protocol {\r\n\tmargin-top: 40rpx;\r\n\tdisplay: flex;\r\n\talign-items: center;\r\n\tjustify-content: center;\r\n}\r\n\r\n.protocol-checkbox {\r\n\tmargin-right: 10rpx;\r\n}\r\n\r\n.protocol-text {\r\n\tfont-size: 24rpx;\r\n\tcolor: #999999;\r\n}\r\n\r\n.main-color {\r\n\tcolor: var(--view-theme, #FF4D4F);\r\n}\r\n\r\n/*\r\n.trembling {\r\n\tanimation: shake 0.6s;\r\n}\r\n\r\n@keyframes shake {\r\n\t0%, 100% { transform: translateX(0); }\r\n\t10%, 30%, 50%, 70%, 90% { transform: translateX(-10rpx); }\r\n\t20%, 40%, 60%, 80% { transform: translateX(10rpx); }\r\n}\r\n*/\r\n\r\n/* 底部版权 */\r\n.footer {\r\n\tpadding: 40rpx 0;\r\n\ttext-align: center;\r\n\tbackground: #F5F5F5;\r\n}\r\n\r\n.footer-text {\r\n\tfont-size: 22rpx;\r\n\tcolor: #999999;\r\n}\r\n</style>\r\n",null,null],"names":[],"mappings":"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"} |