首页 > 其他分享 >vue---移动端登录页面

vue---移动端登录页面

时间:2024-05-15 13:56:53浏览次数:25  
标签:size vue bottom height --- errors login font 页面

最近在用vue做移动端,做了一个好看的移动端登录界面,保存一下,以后方便直接使用。

具体代码:

<template>
  <div class="main-login-container">
    <div class="login-top"><img class="img" :src="logintop"></div>
    <div class="login-box">
      <div class="login-title">{{ loginTitle }}</div>
      <div class="login-from">
        <div class="login-from-box">
          <div class="title">登录</div>
          <div class="from-item">
            <div class="tips" v-if="loginForm.account">手机号</div>
            <div class="input" :class="errors.account ? 'errors' : ''"><input type="text" v-model="loginForm.account" placeholder="手机号" @focus="handleFocus('account')"></div>
            <div class="info" v-if="errors.account">* {{ errors.account }}</div>
          </div>
          <div class="from-item">
            <div class="tips" v-if="loginForm.password">密码</div>
            <div class="input" :class="errors.password ? 'errors' : ''"><input type="password" v-model="loginForm.password" placeholder="密码" @focus="handleFocus('password')"></div>
            <div class="info" v-if="errors.password">* {{ errors.password }}</div>
          </div>
          <div class="from-item">
            <div class="tips" v-if="loginForm.checkCode">验证码</div>
            <div class="input code" :class="errors.checkCode ? 'errors' : ''">
              <input type="text" v-model="loginForm.checkCode" placeholder="验证码" @focus="handleFocus('checkcode')">
              <img class="img" :src="codeImg" @click="handleCode">
            </div>
            <div class="info" v-if="errors.checkCode">* {{ errors.checkCode }}</div>
          </div>
          <div class="submit-btn" @click="handleSubmit">登录</div>
        </div>
      </div>
    </div>
    <div class="login-bottom flex"><span class="copy">&copy;</span>Copyright © 2022-现在 云科技 All Rights Reserved. 沪ICP备512451200125号</div>
  </div>
</template>

<script>
import { login, checkcode } from "@/api/index.js";
import { loginTitle } from "@/settings.js";
export default {
  data() {
    return {
      loginTitle:'云oA管理后台',
      isPost: false,
      codeImg: "",
      logintop: require("@/assets/logintop.jpg"),
      loginForm: {
        account: "18313888888",
        password: "888888",
        checkCode: "123456",
      },
      errors: {
        account: "",
        password: "",
        checkCode: "",
      },
      redirect: undefined,
    };
  },
  watch: {
    $route: {
      handler: function (route) {
        this.redirect = route.query && route.query.redirect;
      },
      immediate: true,
    },
  },
  mounted() {
    this.handleCode();
  },
  methods: {
    // get code
    handleCode() {
      let imgSrc = checkcode();
      imgSrc = imgSrc + "?" + Math.round(Math.random() * 10);
      this.codeImg = imgSrc;
    },
    // submit
    handleSubmit() {
      let that = this;
      // validate
      if (that.validate()) return false;
      if (that.isPost) return false;
      that.isPost = true;
      that.$store.dispatch("user/login", that.loginForm).then(() => {
        that.isPost = false;
        that.$router.push({ path: that.redirect || "/" });
      }).catch(() => {
        that.isPost = false;
      });
    },
    // focus
    handleFocus(value) {
      this.errors[value] = "";
    },
    // validate
    validate() {
      let arr = [];
      if (!this.loginForm.account) {
        arr.push("account");
        this.errors.account = "账号不能为空";
      }
      if (!this.loginForm.password) {
        arr.push("password");
        this.errors.password = "密码不能为空";
      }
      if (!this.loginForm.checkCode) {
        arr.push("checkCode");
        this.errors.checkCode = "验证码不能为空";
      }
      return arr.length ? true : false;
    },
  },
};
</script>
</style>
<style lang="scss" scoped>
.main-login-container {
  background: #fff;
  position: absolute;
  top: 0;
  right: 0;
  bottom: 0;
  left: 0;
  .login-top {
    width: 100%;
    height: 240px;
    background: #0793ff;
    position: absolute;
    left: 0;
    top: 0;
    .img{
      width: 100%;
      position: absolute;
      left: 0;
      bottom: 0;
    }
  }
  .login-box {
    position: relative;
    z-index: 10;
    .login-title {
      font-size: 26px;
      color: #fff;
      font-weight: 600;
      text-align: center;
      line-height: 50px;
      padding: 70px 0 0;
      letter-spacing: 3px;
    }
    .login-from {
      margin-top: 45px;
      padding: 0 20px;
      .login-from-box {
        padding: 20px 0px 40px;
        border-radius: 10px;
        .title {
          font-size: 20px;
          line-height: 50px;
          font-weight: bold;
          margin-bottom: 10px;
          text-indent: 2px;
        }
        .from-item {
          margin-bottom: 15px;
          .tips {
            font-size: 14px;
            color: #888;
            text-indent: 5px;
          }
          .input {
            margin-top: 2px;
            position: relative;
            border-bottom: 1px solid #eee;
            input {
              width: 100%;
              height: 40px;
              text-indent: 5px;
              line-height: 40px;
              font-size: 14px;
              color: #333;
              border: none;
            }
            .img {
              width: 85px;
              height: 40px;
              position: absolute;
              right: 0;
              bottom: 8px;
            }
          }
          .code {
            input {
              width: calc(100% - 95px);
            }
          }
          .errors {
            border-bottom-color: red;
          }
          .info {
            text-indent: 5px;
            font-size: 12px;
            line-height: 30px;
            color: red;
          }
        }
        .submit-btn {
          width: 100%;
          margin-top: 30px;
          height: 45px;
          line-height: 45px;
          border-radius: 5px;
          background: #2c76fc;
          color: #fff;
          font-size: 18px;
          text-align: center;
          letter-spacing: 3px;
          cursor: pointer;
        }
      }
    }
  }
  .login-bottom {
    width: 100%;
    min-height: 40px;
    line-height: 40px;
    color: #bbb;
    text-align: center;
    font-size: 14px;
    -webkit-box-pack: center;
    -ms-flex-pack: center;
    justify-content: center;
    position: fixed;
    left: 0;
    bottom: 0;
    padding: 0 40px 10px;
    word-break: break-all;
    line-height: 20px;
    .copy {
      font-size: 16px;
      line-height: 20px;
      margin-right: 5px;
    }
  }
}
</style>

用到的头部图片:

打完收工!

标签:size,vue,bottom,height,---,errors,login,font,页面
From: https://www.cnblogs.com/e0yu/p/18193708

相关文章

  • EAV模型(实体-属性-值)的设计和低代码的处理方案(2)--数据的查询处理
    我在随笔《EAV模型(实体-属性-值)的设计和低代码的处理方案(1)》中介绍了一些基本的EAV模型设计知识和基于Winform场景下低代码(或者说无代码)的一些实现思路,在本篇随笔中,我们来分析一下这种针对通用业务,且只需定义就能构建业务模块存储和界面的解决方案,其中的数据查询处理的操作。1、......
  • 实验三 电子传输系统安全-进展1
    任务详情上周任务完成情况(代码链接,所写文档等)本周计划上周任务完成情况将上学期电子公文传输系统重新调试通过哈希存储用户口令并且加盐,能够切换哈希算法使用国密证书任务完成情况启动系统成功哈希口令并加盐成功使用国密证书失败上周任务详情1......
  • Java-线程-synchronized
    0.背景文章目录层级较多,参考我这篇文章来进行展开,方便阅读:博客园SimpleMemory主题如何浮动目录显示参考文章:synchronized底层monitor原理synchronized的底层是基于Java的监视器monitor的。在Java中,monitor(监视器)是用来实现线程同步的一种基本机制。它是一个控制结构,内置......
  • 【2024-05-14】学习调整
    20:00这几天你一直对我板着脸。你大概觉得,我应该问问你,是哪只蚊子叮咬了你。                                                 ——约翰·沃尔夫冈·冯·歌德今天部门......
  • 洛谷题单指南-动态规划3-P4342 [IOI1998] Polygon
    原题链接:https://www.luogu.com.cn/problem/P4342题意解读:环中节点表示数字,边表示运算符,可以任意断一条边,其余节点两两按边的符号计算,求结果的最大值,以及最大值是断开那些边可以得到。解题思路:题意中有几个个关键信息:环形,节点数为n,边数为n任意断一条边,即可以从任意节点开始,......
  • el-cascader多选并且拿到的数据是按这样{"","",""}显示的
     1.el-cascader多选是设置multiple为true  :props="{multiple: true}"2.多选后页面全部显示看起来不美观可以加collapse-tags3.拿数据用@change方法(记得加传参index)1.需要先加  myCascader自定义ref='myCascader'2.this.$refs.myCascader.getCheckedNodes();......
  • error: externally-managed-environment (Python)
     Mac系统Brew安装的最新的python 第一次接触Pythonerror:externally-managed-environment在若依网站下载的项目,试着学习https://gitee.com/liqianglog/django-vue-admin/tree/v1.1.2根据readMe安装初始化时出现了问题Thisenvironment is externallymanaged╰─>......
  • 常见数据分析模型与方法①-RFM
    一、简述RFM用于对用户进行分类,并判断每类细分用户的价值。通过最近一次消费时间(R):客户距离最近的一次采购时间的间隔。最近一段时间内消费频次(F):指客户在限定的期间内所购买的次数。最近一段时间内消费金额(M):客户的消费能力,通常以客户单次的平均消费金额作为衡量指标。这三......
  • pg升级(pg14-pg15)主从环境
    环境:OS:Centos7旧版本的db:pg14新版本的db:pg15升级策略:必须先升级主库,然后重做从库 1.查看主库安装的插件-bash-4.2$psql-hlocalhost-Upostgres-p5432psql(14.11)Type"help"forhelp.postgres=#\dx......
  • [C#] [WPF] 在MVVM中实现拖拽功能 - 入门
    拖拽功能是使用频率较高的一种交互,用传统方法去写很简单,但是在mvvm规则下,也没必要弄得很麻烦我的入门案例就选择了使用mvvm重写tutorialspoint-Interaction里的调色盘案例,view如下MainWindow.xaml这里的重点是控件要允许拖拽以及对应的事件目标控件,填充色绑定,......