<!-- 移动端登陆页面 -- elementplus --> <script lang="ts" setup name="Loginmobile"> import type { FormInstance, FormRules } from 'element-plus' import { ElMessage } from 'element-plus' import useUserStore from '@/store/modules/user' import { RSAencrypt } from '@/utils/security' const route = useRoute() const router = useRouter() const userStore = useUserStore() // 公钥 const publicKey = ref('') // sid const sid = ref('') // 是否需要验证码 const showKaptcha = ref(false) // 获取系统基础配置: 公钥,是否开启验证码 function getBaseConfig() { userStore.getBaseConfig().then((res) => { showKaptcha.value = res.kaptcha publicKey.value = res.publicKey sid.value = res.sid ElMessage({ message: '连接服务器成功', type: 'success', }) }) } onBeforeMount(() => { getBaseConfig() }) // 登录 const loginFormRef = ref<FormInstance>() const loginPasswordRef = ref<HTMLElement>() const loginForm = ref({ username: '', password: '', kaptcha: '', remember: !!localStorage.login_username_bjwell, }) const loginRules = ref<FormRules>({ username: [{ required: true, trigger: ['blur', 'change'], message: '请输入用户名' }], password: [ { required: true, trigger: ['blur', 'change'], message: '请输入密码' }, { min: 6, max: 18, trigger: ['blur', 'change'], message: '密码长度为6到18位' }, ], }) // 密码类型:password 密码 const passwordType = ref('password') function showPassword(passwordEl: HTMLElement | undefined) { passwordType.value = passwordType.value === 'password' ? '' : 'password' nextTick(() => { passwordEl?.focus() }) } // 加载状态 const loading = ref(false) // 处理登录 function handleLogin() { loginFormRef.value && loginFormRef.value.validate(async (valid) => { if (valid) { loading.value = true // 表单对象 const finalForm = { sid: sid.value, username: loginForm.value.username, password: '', kaptcha: loginForm.value.kaptcha, } // 加密 finalForm.password = await RSAencrypt(loginForm.value.password) userStore .login(finalForm) .then(() => { ElMessage({ message: '登录成功', type: 'success', }) loading.value = false router.push('/') }) .catch(() => { loading.value = false }) } }) } </script> <template> <div class="container"> <!-- 背景图 --> <div class="bg" /> <!-- title --> <div class="title"> 北燃施工管理助手 </div> <!-- 用户名/密码 --> <div class="user"> <el-form ref="loginFormRef" :model="loginForm" :rules="loginRules" autocomplete="on"> <el-form-item prop="username"> <el-input ref="name" v-model="loginForm.username" placeholder="用户名" text tabindex="1" autocomplete="on"> <template #prefix> <el-icon> <svg-icon name="ep:user" /> </el-icon> </template> </el-input> </el-form-item> <el-form-item prop="password"> <el-input ref="loginPasswordRef" v-model="loginForm.password" :type="passwordType" placeholder="密码" tabindex="2" autocomplete="on" @keyup.enter="handleLogin" > <template #prefix> <el-icon> <svg-icon name="ep:lock" /> </el-icon> </template> <template #suffix> <el-icon> <svg-icon :name="passwordType === 'password' ? 'eye' : 'eye-open'" @click="showPassword(loginPasswordRef)" /> </el-icon> </template> </el-input> </el-form-item> <el-form-item style="margin-top: 2vh;"> <el-button :loading="loading" type="primary" size="large" style="width: 100%;" @click.prevent="handleLogin"> 登录 </el-button> </el-form-item> </el-form> </div> </div> </template> <style lang="scss" scoped> .container { .bg { background: url("@/assets/mobile/login.png") no-repeat center center / cover; width: 100%; height: 30vh; } .title { margin-top: 2vh; width: 100%; text-align: center; font-weight: 700; font-size: 26px; } .user { padding: 0 4vh; margin-top: 4vh; } } </style>