Files
aiot-uniapp/src/pages-core/auth/login.vue

217 lines
5.7 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<view class="auth-container">
<!-- 顶部 -->
<Header />
<!-- 表单区域 -->
<view class="form-container">
<TenantPicker ref="tenantPickerRef" />
<view class="input-item">
<wd-icon name="user" size="20px" color="#1890ff" />
<wd-input
v-model="formData.username"
placeholder="请输入用户名"
clearable
clear-trigger="focus"
no-border
/>
</view>
<view class="input-item">
<wd-icon name="lock-on" size="20px" color="#1890ff" />
<wd-input
v-model="formData.password"
placeholder="请输入密码"
clearable
clear-trigger="focus"
show-password
no-border
/>
</view>
<view v-if="captchaEnabled">
<Verify
ref="verifyRef"
:captcha-type="captchaType"
explain="向右滑动完成验证"
:img-size="{ width: '300px', height: '150px' }"
mode="pop"
@success="verifySuccess"
/>
</view>
<!-- 登录按钮 -->
<view class="mb-2 mt-2 flex justify-between">
<text class="text-28rpx text-[#1890ff]" @click="goToSmsLogin">
验证码登录
</text>
<text class="text-28rpx text-[#1890ff]" @click="goToForgetPassword">
忘记密码
</text>
</view>
<wd-button block :loading="loading" type="primary" @click="handleLogin">
登录
</wd-button>
<!-- 第三方登录 -->
<view class="mt-100rpx">
<view class="divider mb-40rpx flex items-center justify-center">
<view class="h-1rpx flex-1 bg-[#e5e5e5]" />
<text class="px-24rpx text-26rpx text-[#999]">其他登录方式</text>
<view class="h-1rpx flex-1 bg-[#e5e5e5]" />
</view>
<!-- TODO @芋艿图标换下 -->
<view class="icons flex justify-center gap-60rpx">
<view class="icon-item" @click="handleWechatLogin">
<wd-icon name="chat" size="24px" color="#07c160" />
</view>
<view class="icon-item" @click="handleDingTalkLogin">
<wd-icon name="computer" size="24px" color="#3370ff" />
</view>
</view>
</view>
<!-- 创建账号 -->
<view class="mt-40rpx flex items-center justify-center">
<text class="text-28rpx text-[#666]">还没有账号</text>
<text class="text-28rpx text-[#1890ff]" @click="goToRegister">
创建账号
</text>
</view>
</view>
</view>
</template>
<script lang="ts" setup>
import { reactive, ref } from 'vue'
import { useToast } from 'wot-design-uni'
import {
CODE_LOGIN_PAGE,
FORGET_PASSWORD_PAGE,
REGISTER_PAGE,
} from '@/router/config'
import { useTokenStore } from '@/store/token'
import { ensureDecodeURIComponent, redirectAfterLogin } from '@/utils'
import Header from './components/header.vue'
import TenantPicker from './components/tenant-picker.vue'
import Verify from './components/verifition/verify.vue'
defineOptions({
name: 'LoginPage',
style: {
navigationStyle: 'custom',
},
})
definePage({
style: {
navigationStyle: 'custom',
},
})
const toast = useToast()
const loading = ref(false) // 加载状态
const redirectUrl = ref<string>() // 重定向地址
const tenantPickerRef = ref<InstanceType<typeof TenantPicker>>() // 租户选择器引用
const captchaEnabled = import.meta.env.VITE_APP_CAPTCHA_ENABLE === 'true' // 验证码开关
const verifyRef = ref()
const captchaType = ref('blockPuzzle') // 滑块验证码 blockPuzzle|clickWord
const formData = reactive({
username: import.meta.env.VITE_APP_DEFAULT_LOGIN_USERNAME || '',
password: import.meta.env.VITE_APP_DEFAULT_LOGIN_PASSWORD || '',
captchaVerification: '', // 验证码校验值
}) // 表单数据
/** 页面加载时处理重定向 */
onLoad((options) => {
if (options?.redirect) {
redirectUrl.value = ensureDecodeURIComponent(options.redirect)
}
})
/** 获取验证码 */
async function getCode() {
// 情况一,未开启:则直接登录
if (!captchaEnabled) {
await verifySuccess({})
} else {
// 情况二,已开启:则展示验证码;只有完成验证码的情况,才进行登录
// 弹出验证码
verifyRef.value.show()
}
}
/** 登录处理 */
async function handleLogin() {
if (!tenantPickerRef.value?.validate()) {
return
}
if (!formData.username) {
toast.warning('请输入用户名')
return
}
if (!formData.password) {
toast.warning('请输入密码')
return
}
await getCode()
}
async function verifySuccess(params: any) {
loading.value = true
try {
// 调用登录接口
const tokenStore = useTokenStore()
formData.captchaVerification = params.captchaVerification
await tokenStore.login({
type: 'username',
...formData,
})
// 处理跳转
redirectAfterLogin(redirectUrl.value)
} finally {
loading.value = false
}
}
/** 跳转到注册页面 */
function goToRegister() {
uni.navigateTo({ url: REGISTER_PAGE })
}
/** 跳转到验证码登录 */
function goToSmsLogin() {
uni.navigateTo({ url: CODE_LOGIN_PAGE })
}
/** 跳转到忘记密码 */
function goToForgetPassword() {
uni.navigateTo({ url: FORGET_PASSWORD_PAGE })
}
/** 微信登录 */
// TODO @芋艿:后续开发
function handleWechatLogin() {
toast.info('微信登录功能开发中')
}
/** 钉钉登录 */
// TODO @芋艿:后续开发
function handleDingTalkLogin() {
toast.info('钉钉登录功能开发中')
}
</script>
<style lang="scss" scoped>
@import './styles/auth.scss';
// 第三方登录图标
.icon-item {
width: 40rpx;
height: 40rpx;
display: flex;
align-items: center;
justify-content: center;
border-radius: 50%;
background: #f5f7fa;
}
</style>