美食杰项目(一)登录注册页

news2024/11/19 19:33:51

目录

  • 前言:
  • 具体效果:
  • 代码思路
  • 相应的组件:
  • 具体代码:
        • all页面的具体代码:
        • login页面具体代码:
    • **登录和注册的基本功能都一样所以没有注释**
        • enroll页面的具体代码:
  • 路由相关代码:
        • 相关引入:
        • 路由配置:
        • 路由守卫代码:
  • 总结:

前言:

本节给大家讲的是美食杰项目的登录注册页的主要功能和具体样式

具体效果:

未登录:
在这里插入图片描述
登录成功:
在这里插入图片描述

代码思路

1.完成具体的样式,大部分样式是根据element ui里面的样式
2.通过v-model拿到输入框输入进去的用户名和用户密码
3.通过正则判断是否合格
4.将拿到的用户名和用户密码提交到接口
5.将登录成功的用户密码保存到本地设置成token值,token值是为了后面的登录注册验证
6.跳转前要通过路由导航守卫判断是从哪来并要到哪去
7.登陆成功则将用户的基本信息保存到vuex里面,方便后面的使用
8.判断你要去那个页面,如果没登录要去其他页面则要到登录页进行登录
9.点击重置按钮置空input框

相应的组件:

在这里插入图片描述

  • all为父组件 登录和注册被引入在里面
  • enroll为注册页面
  • login为登录页面

具体代码:

all页面的具体代码:

<template>
  <div class="alltop">
    <!-- 利用element ui里面的标签将登录和注册页面显式在一起,利用tab切换切换两个页面默认为login -->
    <el-tabs v-model="activeName" type="card" class="all">
      <el-tab-pane label="登录" name="login">
        <Login></Login>
      </el-tab-pane>
      <el-tab-pane label="注册" name="register">
        <enroll></enroll>
      </el-tab-pane>
    </el-tabs>
  </div>
</template>

<script>
import Login from "@/views/login/login.vue";
import enroll from "@/views/login/enroll.vue";
export default {
  data() {
    return {
      activeName: "login",
    };
  },
  components: {
    Login,
    enroll,
  },
};
</script>

<style lang="scss" scoped>
.alltop {
  width: 100%;
  height: 1000px;
  .all {
    width: 400px;
    height: 200px;
    margin: 0 auto;
    background: #fff;
  }
}
</style>

login页面具体代码:

<template>
  <div class="login">
    <el-form
      :label-position="labelPosition"
      label-width="80px"
      :model="formLabelAlign"
      ref="ruleFroms"
      class="demo-ruleForm"
      :rules="rules"
    >
      <el-form-item label="用户名">
        <el-input class="inp" v-model="formLabelAlign.username"></el-input>
      </el-form-item>
      <el-form-item label="密码">
        <el-input
          class="inp"
          type="password"
          v-model="formLabelAlign.password"
        ></el-input>
      </el-form-item>
      <el-form-item>
        <el-button type="primary" @click="submit('ruleFroms')">提交</el-button>
        <el-button @click="reset('ruleFroms')">重置</el-button>
      </el-form-item>
    </el-form>
  </div>
</template>

<script>
// 登录的接口
import { login } from "@/connector/api";

export default {
  data() {
    return {
      // 默认显式左边,因为登录在左边
      labelPosition: "right",
      // 变量接收输入进来的账号和密码
      formLabelAlign: {
        username: "",
        password: "",
      },
      // 正则,判断是否正确
      rules: {
        // 用户名正则
        username: [
          {
            required: true,
            message: "请输入用户名",
            trigger: "blur",
          },
        ],
        // 密码正则
        password: [
          {
            required: true,
            message: "请输入用户名",
            trigger: "blur",
          },
        ],
      },
    };
  },
  methods: {
    // 点击事件,点击提交用户信息
    submit(formName) {
      //formName为from表单,通过this.$refs[formName]能拿到from表单
      // console.log(this.$refs[formName]);
      // from表单的验证登录   validate为 element ui 的form表单事件用来验证登录的
      this.$refs[formName].validate(async (valid) => {
        // console.log(valid);
        // 判断验证登录是否成功
        if (valid) {
          // 成功则将数据传给接口
          login({
            name: this.formLabelAlign.username,
            password: this.formLabelAlign.password,
          }).then((data) => {
            // console.log(data);
            // 登录成功或失败会返回一个属性code 他的值为 0和1 0是登录成功,1是登录失败
            if (data.code === 0) {
              // 成功则将token值传到本地,并跳转到首页
              localStorage.setItem("token", data.data.token);
              window.location.href = "/";
            }
            if (data.code === 1) {
              //登录失败则提示登录失败
              this.$message.error(data.mes);
            }
          });
        } else {//验证不成功则弹出提示
          this.$message.error("请按照要求输入 ");
          return false;
        }
      });
    },
    // 重置功能
    reset(formName) {

      // console.log(this.$refs[formName]);
      // resetFields为element ui的form表单事件
      // 点击让form表单清空
      this.$refs[formName].resetFields();
    },
  },
};
</script>

<style lang="scss" scoped>
.login {
  width: 100%;
  height: 1000px;
  .demo-ruleForm {
    width: 400px;
    height: 200px;
    margin: 0 auto;
    background: #fff;
    .inp {
      width: 300px;
    }
  }
}
</style>


登录和注册的基本功能都一样所以没有注释

enroll页面的具体代码:

<template>
  <div class="enroll">
    <el-form
      :label-position="labelPosition"
      label-width="80px"
      :model="formLabelAlign"
      ref="ruleFroms"
      class="demo-ruleForm"
      :rules="rules"
    >
      <el-form-item label="用户名">
        <el-input class="inp" v-model="formLabelAlign.username"></el-input>
      </el-form-item>
      <el-form-item label="密码">
        <el-input
          class="inp"
          type="password"
          v-model="formLabelAlign.password"
        ></el-input>
      </el-form-item>
      <el-form-item>
        <el-button type="primary" @click="submit('ruleFroms')">提交</el-button>
        <el-button @click="reset('ruleFroms')">重置</el-button>
      </el-form-item>
    </el-form>
  </div>
</template>

<script>
import { register } from "@/connector/api";
export default {
  data() {
    return {
      labelPosition: "right",
      formLabelAlign: {
        username: "",
        password: "",
      },
      rules: {
        username: [
          {
            required: true,
            message: "请输入用户名",
            trigger: "blur",
          },
        ],
        password: [
          {
            required: true,
            message: "请输入用户名",
            trigger: "blur",
          },
        ],
      },
    };
  },
  methods: {
    submit(formName) {
      console.log(this.$refs[formName]);
      this.$refs[formName].validate(async (valid) => {
        console.log(valid);
        if (valid) {
          register({
            name: this.formLabelAlign.username,
            password: this.formLabelAlign.password,
          }).then((data) => {
            console.log(data);
            if (data.code === 0) {
              localStorage.setItem("token", data.data.token);
            }
            if (data.code === 1) {
              this.$message.error(data.mes);
            }
          });
        } else {
          this.$message.error("请按照要求输入 ");
          return false;
        }
      });
    },
    reset(formName) {
      console.log(this.$refs[formName]);
      this.$refs[formName].resetFields();
    },
  },
};
</script>

<style lang="scss" scoped>
.enroll {
  width: 100%;
  height: 1000px;
  .demo-ruleForm {
    width: 400px;
    height: 200px;
    margin: 0 auto;
    background: #fff;
    .inp {
      width: 300px;
    }
  }
}
</style>


路由相关代码:

相关引入:

在这里插入图片描述

路由配置:

在这里插入图片描述

路由守卫代码:

// 登录验证完成之后,就要进行跳转,路由导航守卫进行拦截,判断是否真的验证成功

router.beforeEach(async (to,from,next)=>{
  // console.log(to)
  // 将存储的token值拿出来
  // token为用户登录验证,后端返回的一个秘钥
  let token = localStorage.getItem('token')
  // 将token值转换成布尔值 有token值则为true 没有则为false
  let logings = !!token 
  // 拿到用户的基本信息
  let data =  await userInfo()
  // console.log(Store)
  // 将用户的基本信息传进vuex
  Store.commit('changeUserInfo',data.data)
  // console.log(data)
  // to是将要跳转到的页面,他也是一个实例 ,to.matched为路由跳转过去的基本信息,将它里面的跳转路径遍历出来
  if(to.matched.some(item=>item.meta.login)){
    // 判断是否有token值
    if(logings){
      // 如果跳转报错则重新到登录页,并清除token值,这步是为了防止制造假的token值
      if(data.error === 400){
        next({name: 'login'})
        localStorage.removeItem('token')
        //不执行下面的操作
        return
      }
      // 如果登录成功还要去登录页,则不让进让其进入首页
      if(to.name === 'login'){
        next({name:'home'})
      }else{
        return 
      }
    }
    // 没有token值并要去登录页则让其进入登录页
    if(!logings&&to.name==='login'){
      next()
    }
    // 没有token值biang想访问其他的页面,抱歉!请登录
    if(!logings  &&to.name !== 'login'){
      next({name:'login'})
    }
  }else{
     next()
  }
 
})

总结:

以上就是 美食杰项目 中 登录注册的具体实现方法,不懂得也可以在评论区里问我,以后会持续发布一些新的功能,敬请关注。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/29367.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Swagger2依赖的版本问题导致其配置文件一直报错的终极解决方案

Swagger2依赖的版本问题 在项目中使用的报错的版本 springboot2.2.1.RELEASE swagger2.9.2导致在写swagger的配置类时&#xff0c;一直引入不了依赖 导入正确的依赖 <!--swagger--> <dependency><groupId>io.springfox</groupId><artifactId>sp…

JIRA on K8s helm部署实战

JIRA on K8s helm部署实战jira on k8s实战waht&#xff1f;架构![在这里插入图片描述](https://img-blog.csdnimg.cn/7b007d9bfb4648c7b1ab816105f51701.png)如何选择chart官方的chartmox 的chart【1】mox chart 安装脚本【2】生产环境的yamljira 的sharedHome 和localHome 的区…

spring源码 - @Condition原理及运用

1.在源码中&#xff0c;在生成beanfinition中有有如一段代码 以下代码逻辑中执行this.conditionEvaluator.shouldSkip返回true直接跳出beandefinition生成逻辑 private <T> void doRegisterBean(Class<T> beanClass, Nullable String name,Nullable Class<? …

实验数据处理

来源 加热冷却温度实验&#xff0c;相同实验参数可能有一次或多次重复实验&#xff0c;一次实验中也可能有多次。如何分别每一次周期&#xff0c;并把每个周期的数据都分析出来&#xff0c;成为一个问题。 解决思想 想根据冷却后的平台划分不同周期&#xff0c;但是由于冷却…

web前端期末大作业【仿12306铁路官网首页】学生网页设计作业源码

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

分享5款同类软件中的翘楚,属于是WIN10必备良品

今天要给大家推荐的是5款软件&#xff0c;每个都是同类软件中的个中翘楚,请大家给我高调地使用起来,不用替我藏着掖着。 1.PPT插件——OneKeyTools OK插件是一款免费的PPT插件&#xff0c;让你的PPT制作有无限可能&#xff01;它的功能&#xff0c;太多了&#xff0c;比如图片…

Apache HTTPD 换行解析漏洞(CVE-2017-15715)

漏洞环境 Vulhub 影响版本 Apache 2.4.0~2.4.29 漏洞简介 Apache HTTPD 是一款 HTTP 服务器&#xff0c;其 2.4.0~2.4.29 版本中存在一个解析漏洞&#xff0c;在解析 PHP 时&#xff0c;1.php\x0A 将被按照 PHP 后缀进行解析。 解析漏洞是指服务器应用程序会把某些人为构造…

QT开发实例之常用控件(上)

目录QT控件使用范例设置窗口属性字体形状窗体QPushButton 按钮QLabelQLineEdit 单行文本QComboBox 下拉列表框QFontComboBox 字体下拉列表框QSpinBox 控件QTimeEdit 时间控件QDateEdit 日期控件QScrollBar 滑动条控件QRadioButton 单选按钮QCheckBox 复选框QT控件使用范例 设置…

[附源码]计算机毕业设计JAVA卡牌交易网站

[附源码]计算机毕业设计JAVA卡牌交易网站 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis M…

华为认证HCIP的持证人数

华为认证hcip多少人通过了考试&#xff1f; hcip通过的人数比hcie多很多&#xff1b; 华为官方并没有披露hcip通过的相关数据。 唯一可以借鉴的数据&#xff1a;截止到2020年HCIE的持证人数大约在15000左右。 有多少人过了hcip其实并不是一件非常重要的事&#xff0c;重要的…

[附源码]java毕业设计演唱会售票系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

Jan Ozer:高清直播互动场景下的硬编码如何选型?

前言 高清直播逐渐普及&#xff0c;硬编码也成为大势所趋。在 RTE 2022 大会上&#xff0c;来自 NETINT 的 Jan Ozer 通过一系列的对比测试结果&#xff0c;详细分享了如何为高清直播互动场景进行硬编码的技术选型。 本文内容基于演讲内容进行整理&#xff0c;为方便阅读略有删…

膜拜,华为18级工程师用349页构建高可用Linux服务器,其实并不难

前言 本文是华为高级工程师从Linux服务器性能调优与高可用集群构建、MySQL性能调优与高可用架构设计、自动化运维与Linux系统安全等多角度讲解构建高可用Linux服务器的方法和技巧。 希望大家能通过本文掌握 Linux 的精髓&#xff0c;轻松而愉快地工作&#xff0c;从而提高自己…

SwiftUI 后台刷新多个 Section 导致 global index in collection view 与实际不匹配问题的解决

问题现象 在复杂布局的 SwiftUI 视图中,用段(Section)来搭配组合其它容器视图(Form 或 List)无疑极具默契性。不过,在多个 Section 对应的数据被后台多线程修改时,往往会发生难以定位的错误,甚至导致 App 直接崩溃: 如上图所示,我们试图在后台线程更新多个 Section …

[附源码]java毕业设计药品管理系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

vue3.0的变化汇总

vue2迁移vue3 文档 https://www.javascriptc.com/vue3js/guide/migration/render-function-api.html 1.创建项目 npm init vite-app cd npm install npm run dev 2.setUp() 组合api的&#xff08;解决v2业务逻辑分散的问题&#xff09;方法可以单独写在外面的js。 -本质&…

大数据毕设选题 - 疫情实时数据分析可视化(Flask python)

文章目录1 前言1 课题背景2 数据库设计实现3 实现效果4 Flask框架5 爬虫6 Ajax技术7 Echarts8 最后1 前言 &#x1f525; Hi&#xff0c;大家好&#xff0c;这里是丹成学长的毕设系列文章&#xff01; &#x1f525; 对毕设有任何疑问都可以问学长哦! 这两年开始&#xff0c…

后端学习 - Zookeeper Kafka

实习项目用到了 Kafka&#xff0c;系统学习一下 文章目录Zookeeper一 概述二 数据结构和监听行为三 功能实现1 统一配置管理2 统一命名管理3 分布式锁4 集群管理Kafka一 系统架构1 架构图2 数量关系3 Consumer 重要参数二 工作流程1 消息写入过程2 数据不丢失&#xff1a;ACK、…

邯郸百亿斤粮食生产 国稻种芯·中国水稻节:河北大市粮食经

邯郸百亿斤粮食生产 国稻种芯中国水稻节&#xff1a;河北大市粮食经 记者黄涛、袁柯 人民网石家庄电 杨文娟 科技日报 新闻中国采编网 中国新闻采编网 谋定研究中国智库网 中国农民丰收节国际贸易促进会 国稻种芯中国水稻节 中国三农智库网-功能性农业农业大健康大会报道&…

Android Material Design之MaterialToolbar(三)

上图 引入 implementation com.google.android.material:material:1.4.0属性 属性描述app:menu右侧菜单文件app:navigationIcon左侧返回按钮app:title主标题栏文本app:titleCentered主标题栏文本是否居中app:titleTextColor主标题栏文本颜色app:subtitle子标题栏文本app:s…