You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
308 lines
6.4 KiB
308 lines
6.4 KiB
<template>
|
|
<view class="login-overlay">
|
|
<view class="login-container">
|
|
<!-- 关闭按钮 -->
|
|
<view class="close-btn" @click="closeLogin">
|
|
<uv-icon name="close" color="#FFFFFF" size="24"></uv-icon>
|
|
</view>
|
|
|
|
<!-- 登录类型切换 -->
|
|
<view class="login-type">
|
|
<view
|
|
class="type-item"
|
|
:class="{ active: loginType === 'personal' }"
|
|
@click="loginType = 'personal'"
|
|
>
|
|
个人
|
|
</view>
|
|
<view
|
|
class="type-item"
|
|
:class="{ active: loginType === 'enterprise' }"
|
|
@click="loginType = 'enterprise'"
|
|
>
|
|
企业
|
|
</view>
|
|
</view>
|
|
|
|
<!-- 登录表单 -->
|
|
<view class="login-form">
|
|
<!-- 用户名输入 -->
|
|
<view class="input-item">
|
|
<view class="icon">
|
|
<uv-icon name="account" color="#AAAAAA" size="20"></uv-icon>
|
|
</view>
|
|
<input
|
|
class="input"
|
|
type="text"
|
|
v-model="username"
|
|
placeholder="请输入8位数字或英文字母"
|
|
maxlength="20"
|
|
/>
|
|
</view>
|
|
|
|
<!-- 密码输入 -->
|
|
<view class="input-item">
|
|
<view class="icon">
|
|
<uv-icon name="eye" color="#AAAAAA" size="20"></uv-icon>
|
|
</view>
|
|
<!-- <input
|
|
class="input"
|
|
:type="showPassword ? 'text' : 'password'"
|
|
v-model="password"
|
|
placeholder="请输入六密码"
|
|
maxlength="20"
|
|
/> -->
|
|
<uv-input class="input" placeholder="请输入密码" :type="showPassword ? 'text' : 'password'" border="none" v-model="password"></uv-input>
|
|
<view class="eye-icon" @click="togglePasswordVisibility">
|
|
<uv-icon
|
|
:name="showPassword ? 'eye-fill' : 'eye-off'"
|
|
color="#AAAAAA"
|
|
size="20"
|
|
></uv-icon>
|
|
</view>
|
|
</view>
|
|
|
|
<!-- 登录按钮 -->
|
|
<view class="login-btn" @click="handleLogin">登录</view>
|
|
|
|
<!-- 用户协议 -->
|
|
<view class="agreement">
|
|
<checkbox
|
|
:checked="agreePolicy"
|
|
@click="agreePolicy = !agreePolicy"
|
|
color="#4080FF"
|
|
style="transform: scale(0.7)"
|
|
/>
|
|
<text class="agreement-text">
|
|
阅读
|
|
<text class="link" @click.stop="openUserPolicy">用户政策</text>
|
|
和
|
|
<text class="link" @click.stop="openPrivacyPolicy">隐私政策</text>
|
|
</text>
|
|
</view>
|
|
</view>
|
|
</view>
|
|
</view>
|
|
</template>
|
|
|
|
<script setup>
|
|
import { ref } from "vue";
|
|
import { useAuthStore } from "@/store";
|
|
|
|
// 登录类型:个人/企业
|
|
const loginType = ref("personal");
|
|
// 用户名和密码
|
|
const username = ref("");
|
|
const password = ref("");
|
|
// 是否显示密码
|
|
const showPassword = ref(false);
|
|
// 是否同意用户协议
|
|
const agreePolicy = ref(false);
|
|
|
|
// 切换密码可见性
|
|
const togglePasswordVisibility = () => {
|
|
showPassword.value = !showPassword.value;
|
|
};
|
|
|
|
// 处理登录
|
|
const handleLogin = () => {
|
|
// 表单验证
|
|
if (!username.value) {
|
|
return uni.showToast({
|
|
title: "请输入用户名",
|
|
icon: "none",
|
|
});
|
|
}
|
|
|
|
if (!password.value) {
|
|
return uni.showToast({
|
|
title: "请输入密码",
|
|
icon: "none",
|
|
});
|
|
}
|
|
|
|
if (!agreePolicy.value) {
|
|
return uni.showToast({
|
|
title: "请阅读并同意用户政策和隐私政策",
|
|
icon: "none",
|
|
});
|
|
}
|
|
|
|
// 登录逻辑
|
|
const authStore = useAuthStore();
|
|
|
|
// 显示加载中
|
|
uni.showLoading({
|
|
title: "登录中...",
|
|
});
|
|
|
|
// 模拟登录请求
|
|
setTimeout(() => {
|
|
uni.hideLoading();
|
|
|
|
// 这里应该调用实际的登录API
|
|
// 示例:模拟登录成功
|
|
authStore.signIn({
|
|
token: "sample_token_123456",
|
|
userInfo: {
|
|
id: "1",
|
|
username: username.value,
|
|
type: loginType.value,
|
|
},
|
|
});
|
|
|
|
// 登录成功提示
|
|
uni.showToast({
|
|
title: "登录成功",
|
|
icon: "success",
|
|
});
|
|
|
|
// 关闭登录弹窗
|
|
emit("close");
|
|
}, 1500);
|
|
};
|
|
|
|
// 打开用户政策
|
|
const openUserPolicy = () => {
|
|
uni.navigateTo({
|
|
url: "/pages/policy/user-policy",
|
|
});
|
|
};
|
|
|
|
// 打开隐私政策
|
|
const openPrivacyPolicy = () => {
|
|
uni.navigateTo({
|
|
url: "/pages/policy/privacy-policy",
|
|
});
|
|
};
|
|
|
|
// 关闭登录弹窗
|
|
const emit = defineEmits(["close"]);
|
|
const closeLogin = () => {
|
|
emit("close");
|
|
};
|
|
</script>
|
|
|
|
<style lang="scss" scoped>
|
|
.login-overlay {
|
|
position: fixed;
|
|
top: 0;
|
|
left: 0;
|
|
right: 0;
|
|
bottom: 0;
|
|
background-color: rgba(0, 0, 0, 0.5);
|
|
display: flex;
|
|
justify-content: center;
|
|
align-items: center;
|
|
z-index: 999;
|
|
}
|
|
|
|
.login-container {
|
|
width: 85vw;
|
|
background-color: #f0f4ff;
|
|
border-radius: 20rpx;
|
|
position: relative;
|
|
padding: 40rpx 0;
|
|
box-shadow: 0 4rpx 20rpx rgba(0, 0, 0, 0.1);
|
|
}
|
|
|
|
.close-btn {
|
|
position: absolute;
|
|
top: 0;
|
|
right: 0;
|
|
width: 80rpx;
|
|
height: 80rpx;
|
|
background-color: #a0b4ff;
|
|
border-radius: 0 20rpx 0 20rpx;
|
|
display: flex;
|
|
justify-content: center;
|
|
align-items: center;
|
|
}
|
|
|
|
.login-type {
|
|
display: flex;
|
|
justify-content: center;
|
|
margin-bottom: 40rpx;
|
|
|
|
.type-item {
|
|
font-size: 32rpx;
|
|
padding: 10rpx 40rpx;
|
|
margin: 0 20rpx;
|
|
color: #999999;
|
|
position: relative;
|
|
|
|
&.active {
|
|
color: #333333;
|
|
font-weight: bold;
|
|
|
|
&::after {
|
|
content: "";
|
|
position: absolute;
|
|
bottom: -10rpx;
|
|
left: 40rpx;
|
|
right: 40rpx;
|
|
height: 6rpx;
|
|
background-color: #4080ff;
|
|
border-radius: 3rpx;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
.login-form {
|
|
padding: 0 40rpx;
|
|
|
|
.input-item {
|
|
background-color: #ffffff;
|
|
border-radius: 50rpx;
|
|
height: 90rpx;
|
|
display: flex;
|
|
align-items: center;
|
|
padding: 0 30rpx;
|
|
margin-bottom: 30rpx;
|
|
|
|
.icon {
|
|
margin-right: 20rpx;
|
|
}
|
|
|
|
.input {
|
|
flex: 1;
|
|
height: 90rpx;
|
|
font-size: 28rpx;
|
|
}
|
|
|
|
.eye-icon {
|
|
padding: 0 10rpx;
|
|
}
|
|
}
|
|
|
|
.login-btn {
|
|
background-color: #4080ff;
|
|
color: #ffffff;
|
|
height: 90rpx;
|
|
border-radius: 50rpx;
|
|
display: flex;
|
|
justify-content: center;
|
|
align-items: center;
|
|
font-size: 32rpx;
|
|
font-weight: bold;
|
|
margin: 40rpx 0;
|
|
}
|
|
|
|
.agreement {
|
|
display: flex;
|
|
align-items: center;
|
|
justify-content: center;
|
|
|
|
.agreement-text {
|
|
font-size: 24rpx;
|
|
color: #666666;
|
|
|
|
.link {
|
|
color: #4080ff;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
</style>
|