|
|
@@ -16,8 +16,6 @@
|
|
|
v-model="phone"
|
|
|
placeholder="请输入手机号"
|
|
|
maxlength="11"
|
|
|
- @blur="onPhoneBlur"
|
|
|
- @input="onPhoneInput"
|
|
|
/>
|
|
|
</view>
|
|
|
|
|
|
@@ -41,19 +39,7 @@
|
|
|
</view>
|
|
|
</view>
|
|
|
|
|
|
- <button class="login-btn" :loading="loading" @click="phoneLogin">登录</button>
|
|
|
-
|
|
|
- <!-- 微信一键登录 -->
|
|
|
- <view class="wechat-section">
|
|
|
- <button
|
|
|
- class="wechat-btn"
|
|
|
- open-type="getPhoneNumber"
|
|
|
- @getphonenumber="handleWechatPhoneLogin"
|
|
|
- >
|
|
|
- <text class="wechat-icon">微信</text>
|
|
|
- <text>一键登录</text>
|
|
|
- </button>
|
|
|
- </view>
|
|
|
+ <button class="login-btn" :loading="loading" @click="phoneLogin">登录</button>
|
|
|
</view>
|
|
|
|
|
|
<view class="agreement">
|
|
|
@@ -82,14 +68,7 @@ export default {
|
|
|
countdown: 0,
|
|
|
agreed: false,
|
|
|
nickname: '',
|
|
|
- avatar: '',
|
|
|
- // 新增字段
|
|
|
- role: 'parent', // 角色选择
|
|
|
- birthday: '', // 生日
|
|
|
- gender: '', // 性别
|
|
|
- showRoleSelect: true, // 显示角色选择
|
|
|
- codeChecked: false, // 是否已检查过手机号
|
|
|
- lastCheckedPhone: '' // 上次检查的手机号
|
|
|
+ avatar: ''
|
|
|
}
|
|
|
},
|
|
|
onLoad() {
|
|
|
@@ -104,7 +83,24 @@ export default {
|
|
|
},
|
|
|
methods: {
|
|
|
handleImageError(e) {
|
|
|
- console.log('Logo加载失败,使用默认显示')
|
|
|
+ console.log('Logo 加载失败,使用默认显示')
|
|
|
+ },
|
|
|
+ onAgreementChange(e) {
|
|
|
+ this.agreed = e.detail.value.length > 0
|
|
|
+ },
|
|
|
+ showAgreement() {
|
|
|
+ uni.showModal({
|
|
|
+ title: '用户协议',
|
|
|
+ content: '这里是用户协议内容...',
|
|
|
+ showCancel: false
|
|
|
+ })
|
|
|
+ },
|
|
|
+ showPrivacy() {
|
|
|
+ uni.showModal({
|
|
|
+ title: '隐私政策',
|
|
|
+ content: '这里是隐私政策内容...',
|
|
|
+ showCancel: false
|
|
|
+ })
|
|
|
},
|
|
|
// 手机号输入完成时检查(11位时触发)
|
|
|
onPhoneInput() {
|
|
|
@@ -149,43 +145,6 @@ export default {
|
|
|
showCancel: false
|
|
|
})
|
|
|
},
|
|
|
- // 手机号失焦时检查是否新用户(测试环境)
|
|
|
- async onPhoneBlur() {
|
|
|
- if (!this.phone || !/^1[3-9]\d{9}$/.test(this.phone)) {
|
|
|
- return
|
|
|
- }
|
|
|
-
|
|
|
- // 如果手机号变化了,重置检查状态
|
|
|
- if (this.lastCheckedPhone !== this.phone) {
|
|
|
- this.codeChecked = false
|
|
|
- this.lastCheckedPhone = ''
|
|
|
- }
|
|
|
-
|
|
|
- // 发送验证码后不再重复检查
|
|
|
- if (this.codeChecked) {
|
|
|
- return
|
|
|
- }
|
|
|
-
|
|
|
- try {
|
|
|
- const res = await checkPhone(this.phone)
|
|
|
- this.codeChecked = true
|
|
|
- this.lastCheckedPhone = this.phone
|
|
|
-
|
|
|
- if (res.data === false) {
|
|
|
- // 新用户:直接跳转到信息编辑页
|
|
|
- uni.showToast({ title: '请完善个人信息', icon: 'none' })
|
|
|
- setTimeout(() => {
|
|
|
- uni.redirectTo({
|
|
|
- url: '/pages/user-edit/user-edit?needsRoleSelect=true&phone=' + this.phone
|
|
|
- })
|
|
|
- }, 1500)
|
|
|
- }
|
|
|
- // 老用户:继续正常流程
|
|
|
- } catch (e) {
|
|
|
- // 检查失败,继续正常流程
|
|
|
- console.error('检查手机号失败', e)
|
|
|
- }
|
|
|
- },
|
|
|
async sendCode() {
|
|
|
if (!this.phone) {
|
|
|
uni.showToast({ title: '请输入手机号', icon: 'none' })
|
|
|
@@ -226,138 +185,100 @@ export default {
|
|
|
return
|
|
|
}
|
|
|
|
|
|
- this.loading = true
|
|
|
- try {
|
|
|
- const res = await phoneLoginApi({
|
|
|
- phone: this.phone,
|
|
|
- code: this.code,
|
|
|
- nickname: this.nickname || this.getNicknameFromWechat(),
|
|
|
- avatar: this.avatar || this.getAvatarFromWechat(),
|
|
|
- role: this.role,
|
|
|
- birthday: this.birthday,
|
|
|
- gender: this.gender
|
|
|
- })
|
|
|
-
|
|
|
- // 保存token和用户信息
|
|
|
- uni.setStorageSync('token', res.data.token)
|
|
|
- uni.setStorageSync('userId', res.data.userId)
|
|
|
- uni.setStorageSync('role', res.data.role)
|
|
|
- uni.setStorageSync('familyId', res.data.familyId)
|
|
|
- uni.setStorageSync('userInfo', {
|
|
|
- nickname: res.data.nickname,
|
|
|
- userId: res.data.userId
|
|
|
- })
|
|
|
-
|
|
|
- uni.showToast({ title: '登录成功', icon: 'success' })
|
|
|
-
|
|
|
- // 保存用户角色
|
|
|
- const role = res.data.role || 'parent'
|
|
|
-
|
|
|
- // 保存用户信息
|
|
|
- uni.setStorageSync('roles', res.data.roles || role)
|
|
|
-
|
|
|
- // 根据 isNewUser 决定跳转页面
|
|
|
- setTimeout(() => {
|
|
|
- if (res.data.isNewUser) {
|
|
|
- // 新用户:跳转到信息编辑页面(先选择角色)
|
|
|
- uni.redirectTo({
|
|
|
- url: `/pages/user-edit/user-edit?token=${res.data.token}&userId=${res.data.userId}&needsRoleSelect=true`
|
|
|
- })
|
|
|
- } else {
|
|
|
- // 老用户:根据角色进入对应首页
|
|
|
- this.navigateToHome(role)
|
|
|
- }
|
|
|
- }, 1000)
|
|
|
- } catch (e) {
|
|
|
- uni.showToast({ title: e.message || '登录失败', icon: 'none' })
|
|
|
- } finally {
|
|
|
- this.loading = false
|
|
|
- }
|
|
|
- },
|
|
|
- async handleWechatPhoneLogin(e) {
|
|
|
- if (e.detail.errMsg === 'getPhoneNumber:ok') {
|
|
|
- if (!this.agreed) {
|
|
|
- uni.showToast({ title: '请先同意用户协议', icon: 'none' })
|
|
|
- return
|
|
|
- }
|
|
|
-
|
|
|
- this.loading = true
|
|
|
- try {
|
|
|
- // 新版微信小程序获取手机号:使用e.detail.code
|
|
|
- const phoneCode = e.detail.code
|
|
|
- if (!phoneCode) {
|
|
|
- uni.showToast({ title: '获取手机号失败,请重试', icon: 'none' })
|
|
|
- return
|
|
|
- }
|
|
|
-
|
|
|
- // 获取登录code用于获取openid
|
|
|
- const loginRes = await new Promise((resolve, reject) => {
|
|
|
- uni.login({
|
|
|
- provider: 'weixin',
|
|
|
- success: resolve,
|
|
|
- fail: reject
|
|
|
- })
|
|
|
- })
|
|
|
-
|
|
|
- // 调用后端微信手机号登录接口
|
|
|
- const res = await wechatPhoneLogin({
|
|
|
- code: loginRes.code, // 用于获取openid
|
|
|
- phoneCode: phoneCode, // 用于获取手机号
|
|
|
- nickname: this.nickname || '用户',
|
|
|
- avatar: this.avatar || '',
|
|
|
- role: this.role,
|
|
|
- birthday: this.birthday,
|
|
|
- gender: this.gender
|
|
|
- })
|
|
|
-
|
|
|
- // 保存token和用户信息
|
|
|
- uni.setStorageSync('token', res.data.token)
|
|
|
- uni.setStorageSync('userId', res.data.userId)
|
|
|
- uni.setStorageSync('role', res.data.role)
|
|
|
- uni.setStorageSync('familyId', res.data.familyId)
|
|
|
- // 保存openid,用于后续自动登录
|
|
|
- if (res.data.openid) {
|
|
|
- uni.setStorageSync('openid', res.data.openid)
|
|
|
- }
|
|
|
- uni.setStorageSync('userInfo', {
|
|
|
- nickname: res.data.nickname,
|
|
|
- userId: res.data.userId
|
|
|
- })
|
|
|
-
|
|
|
- uni.showToast({ title: '登录成功', icon: 'success' })
|
|
|
-
|
|
|
- // 保存用户角色
|
|
|
- const role = res.data.role || 'parent'
|
|
|
-
|
|
|
- // 根据 isNewUser 决定跳转页面
|
|
|
- setTimeout(() => {
|
|
|
- if (res.data.isNewUser) {
|
|
|
- // 新用户:跳转到信息编辑页面
|
|
|
- uni.redirectTo({
|
|
|
- url: `/pages/user-edit/user-edit?token=${res.data.token}&userId=${res.data.userId}`
|
|
|
- })
|
|
|
- } else {
|
|
|
- // 老用户:根据角色进入对应首页
|
|
|
- this.navigateToHome(role)
|
|
|
- }
|
|
|
- }, 1000)
|
|
|
- } catch (e) {
|
|
|
- uni.showToast({ title: e.message || '登录失败', icon: 'none' })
|
|
|
- } finally {
|
|
|
- this.loading = false
|
|
|
- }
|
|
|
- }
|
|
|
- },
|
|
|
- navigateToHome(role) {
|
|
|
- if (role === 'parent') {
|
|
|
- uni.reLaunch({
|
|
|
- url: '/pages/index/parent-index'
|
|
|
+ this.loading = true
|
|
|
+ try {
|
|
|
+ const res = await phoneLoginApi({
|
|
|
+ phone: this.phone,
|
|
|
+ code: this.code,
|
|
|
+ nickname: this.nickname || '用户',
|
|
|
+ avatar: this.avatar || ''
|
|
|
})
|
|
|
- } else {
|
|
|
- uni.reLaunch({
|
|
|
- url: '/pages/index/child-index'
|
|
|
+
|
|
|
+ // 保存 token 和用户信息
|
|
|
+ uni.setStorageSync('token', res.data.token)
|
|
|
+ uni.setStorageSync('userId', res.data.userId)
|
|
|
+ uni.setStorageSync('role', res.data.role)
|
|
|
+ uni.setStorageSync('familyId', res.data.familyId)
|
|
|
+ uni.setStorageSync('userInfo', {
|
|
|
+ nickname: res.data.nickname,
|
|
|
+ userId: res.data.userId
|
|
|
})
|
|
|
+
|
|
|
+ uni.showToast({ title: '登录成功', icon: 'success' })
|
|
|
+
|
|
|
+ // 直接跳转到首页(根据后端返回的角色自动适配)
|
|
|
+ setTimeout(() => {
|
|
|
+ uni.reLaunch({
|
|
|
+ url: '/pages/index/index'
|
|
|
+ })
|
|
|
+ }, 1000)
|
|
|
+ } catch (e) {
|
|
|
+ uni.showToast({ title: e.message || '登录失败', icon: 'none' })
|
|
|
+ } finally {
|
|
|
+ this.loading = false
|
|
|
}
|
|
|
+ },
|
|
|
+ async handleWechatPhoneLogin(e) {
|
|
|
+ if (e.detail.errMsg === 'getPhoneNumber:ok') {
|
|
|
+ if (!this.agreed) {
|
|
|
+ uni.showToast({ title: '请先同意用户协议', icon: 'none' })
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ this.loading = true
|
|
|
+ try {
|
|
|
+ // 新版微信小程序获取手机号:使用 e.detail.code
|
|
|
+ const phoneCode = e.detail.code
|
|
|
+ if (!phoneCode) {
|
|
|
+ uni.showToast({ title: '获取手机号失败,请重试', icon: 'none' })
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ // 获取登录 code 用于获取 openid
|
|
|
+ const loginRes = await new Promise((resolve, reject) => {
|
|
|
+ uni.login({
|
|
|
+ provider: 'weixin',
|
|
|
+ success: resolve,
|
|
|
+ fail: reject
|
|
|
+ })
|
|
|
+ })
|
|
|
+
|
|
|
+ // 调用后端微信手机号登录接口
|
|
|
+ const res = await wechatPhoneLogin({
|
|
|
+ code: loginRes.code, // 用于获取 openid
|
|
|
+ phoneCode: phoneCode, // 用于获取手机号
|
|
|
+ nickname: this.nickname || '用户',
|
|
|
+ avatar: this.avatar || ''
|
|
|
+ })
|
|
|
+
|
|
|
+ // 保存 token 和用户信息
|
|
|
+ uni.setStorageSync('token', res.data.token)
|
|
|
+ uni.setStorageSync('userId', res.data.userId)
|
|
|
+ uni.setStorageSync('role', res.data.role)
|
|
|
+ uni.setStorageSync('familyId', res.data.familyId)
|
|
|
+ // 保存 openid,用于后续自动登录
|
|
|
+ if (res.data.openid) {
|
|
|
+ uni.setStorageSync('openid', res.data.openid)
|
|
|
+ }
|
|
|
+ uni.setStorageSync('userInfo', {
|
|
|
+ nickname: res.data.nickname,
|
|
|
+ userId: res.data.userId
|
|
|
+ })
|
|
|
+
|
|
|
+ uni.showToast({ title: '登录成功', icon: 'success' })
|
|
|
+
|
|
|
+ // 直接跳转到首页
|
|
|
+ setTimeout(() => {
|
|
|
+ uni.reLaunch({
|
|
|
+ url: '/pages/index/index'
|
|
|
+ })
|
|
|
+ }, 1000)
|
|
|
+ } catch (e) {
|
|
|
+ uni.showToast({ title: e.message || '登录失败', icon: 'none' })
|
|
|
+ } finally {
|
|
|
+ this.loading = false
|
|
|
+ }
|
|
|
+}
|
|
|
}
|
|
|
}
|
|
|
}
|