feat: 登录功能

This commit is contained in:
jqtmviyu 2025-04-25 20:56:19 +08:00
parent f137109b12
commit 78d1978943
3 changed files with 243 additions and 3 deletions

View File

@ -1,7 +1,218 @@
<template>
<view class="login">login</view>
<view class="viewport">
<view class="logo">
<view class="logo-text">金佰川微商城</view>
</view>
<view class="login">
<!-- 网页端表单登录 -->
<!-- <input class="input" type="text" placeholder="请输入用户名/手机号码" />
<input class="input" type="text" password placeholder="请输入密码" />
<button class="button phone">登录</button> -->
<!-- 小程序端授权登录 -->
<button class="button phone" @getphonenumber="onGetPhoneNumber">
<text class="icon icon-phone"></text>
手机号快捷登录
</button>
<view class="extra">
<view class="caption">
<text>其他登录方式</text>
</view>
<view class="options">
<!-- 通用模拟登录 -->
<button @tap="handlePhoneLogin">
<text class="icon icon-phone">模拟快捷登录</text>
</button>
</view>
</view>
<view class="tips">登录/注册即视为你同意服务条款隐私协议</view>
</view>
</view>
</template>
<script lang="ts" setup></script>
<script setup lang="ts">
import { ref } from 'vue'
import { onLoad } from '@dcloudio/uni-app'
import { postPhoneNumberAPI, postPhoneNumberLoginMockAPI } from '@/services/login'
import { useMemberStore } from '@/stores/modules/member'
import type { LoginResult } from '@/types/member'
<style lang="scss"></style>
//
const memberStore = useMemberStore()
const code = ref('')
onLoad(async () => {
const res = await wx.login()
code.value = res.code
})
// ,
const onGetPhoneNumber: UniHelper.ButtonOnGetphonenumber = async (e) => {
if (e.detail.errMsg === 'getPhoneNumber:ok') {
const encryptedData = e.detail.encryptedData!
const iv = e.detail.iv!
const res = await postPhoneNumberAPI({
code: code.value,
encryptedData,
iv,
})
res.result && loginSucess(res.result)
}
}
//
const handlePhoneLogin = async () => {
if (!code.value) {
uni.showToast({
title: '请先授权登录',
icon: 'none',
})
return
}
const res = await postPhoneNumberLoginMockAPI({
phoneNumber: '13800138000',
})
res.result && loginSucess(res.result)
}
//
const loginSucess = (profile: LoginResult) => {
memberStore.clearProfile()
memberStore.setProfile(profile)
uni.showToast({
title: '登录成功',
icon: 'none',
})
setTimeout(() => {
uni.switchTab({
url: '/pages/my/my',
})
}, 500)
}
</script>
<style lang="scss">
page {
height: 100%;
}
.viewport {
display: flex;
flex-direction: column;
height: 100%;
padding: 20rpx 40rpx;
}
.logo {
flex: 1;
text-align: center;
.logo-text {
margin-top: 25vh;
}
}
.login {
display: flex;
flex-direction: column;
height: 60vh;
padding: 40rpx 20rpx 20rpx;
.input {
width: 100%;
height: 80rpx;
font-size: 28rpx;
border-radius: 72rpx;
border: 1px solid #ddd;
padding-left: 30rpx;
margin-bottom: 20rpx;
}
.button {
display: flex;
align-items: center;
justify-content: center;
width: 100%;
height: 80rpx;
font-size: 28rpx;
border-radius: 72rpx;
color: #fff;
.icon {
font-size: 40rpx;
margin-right: 6rpx;
}
}
.phone {
background-color: #28bb9c;
}
.wechat {
background-color: #06c05f;
}
.extra {
flex: 1;
padding: 70rpx 70rpx 0;
.caption {
width: 440rpx;
line-height: 1;
border-top: 1rpx solid #ddd;
font-size: 26rpx;
color: #999;
position: relative;
text {
transform: translate(-40%);
background-color: #fff;
position: absolute;
top: -12rpx;
left: 50%;
}
}
.options {
display: flex;
justify-content: center;
align-items: center;
margin-top: 70rpx;
button {
padding: 0;
background-color: transparent;
}
}
.icon {
font-size: 24rpx;
color: #444;
display: flex;
flex-direction: column;
align-items: center;
&::before {
display: flex;
align-items: center;
justify-content: center;
width: 80rpx;
height: 80rpx;
margin-bottom: 6rpx;
font-size: 40rpx;
border: 1rpx solid #444;
border-radius: 50%;
}
}
.icon-weixin::before {
border-color: #06c05f;
color: #06c05f;
}
}
}
.tips {
position: absolute;
bottom: 80rpx;
left: 20rpx;
right: 20rpx;
font-size: 22rpx;
color: #999;
text-align: center;
}
</style>

29
src/services/login.ts Normal file
View File

@ -0,0 +1,29 @@
import { http } from '@/utils/http'
import type { LoginResult } from '@/types/member'
type LoginParams = {
code: string
encryptedData: string
iv: string
}
// 获取手机号
export const postPhoneNumberAPI = (data: LoginParams) => {
return http<LoginResult>({
url: '/login/wxMin',
method: 'POST',
data,
})
}
// 模拟快捷登录
type PhoneNumberLoginMockParams = {
phoneNumber: string
}
export const postPhoneNumberLoginMockAPI = (data: PhoneNumberLoginMockParams) => {
return http<LoginResult>({
url: '/login/wxMin/simple',
method: 'POST',
data,
})
}