Newer
Older
robot_dog_patrol_front / src / views / login-mobile.vue
<!-- 移动端登陆页面  -- 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>