美食杰项目 -- 登录注册(三)

news2024/11/30 14:24:42

目录

  • 前言:
  • 具体实现思路:
  • 步骤:
    • 1. 展示美食杰菜谱大全效果
    • 在这里插入图片描述
    • 2. 引入element-ui
    • 3. 代码
  • 总结:

前言:

本文给大家讲解,美食杰项目中 登录注册实现的效果,和具体代码。


具体实现思路:

  1. 引入element-ui中的登录和分页功能实现方法
  2. 账号密码进行双向绑定
  3. 登录和注册把账号密码传递过去
  4. 成功把token报错至本地,失败则返回失败的结果
  5. 点击清空input框
  6. 引入当前的vuex,并写出所有路由跳转
  7. 使用全局导航守卫和meta字段进行登录验证判断
  8. 判断跳转的路由是否需要登录,已登录则判断是否获取到用户信息
  9. 未获取则删除存储至本地的 token,跳转至登录页
  10. 判断是否有 token 值,没有跳转至登录
  11. 判断已登录,并且跳转至登录页,跳转至首页

步骤:

1. 展示美食杰菜谱大全效果

在这里插入图片描述

2. 引入element-ui

点击跳转至 element-ui 中 Tabs 标签页使用方法:https://element.eleme.cn/#/zh-CN/component/tabs

点击跳转至 element-ui 中 Form 表单页使用方法:https://element.eleme.cn/#/zh-CN/component/form


3. 代码

  • 路由跳转页(router)
import Vue from 'vue'
import VueRouter from 'vue-router'
// import home from '@/components/home.vue'
import { userInfo } from '@/connector/api'
// 引入当前的vuex
import store from '@/store/index'
Vue.use(VueRouter)

const routes = [    
  {
    path: '/',
    name: 'home',
    title: '首页',
    component: ()=>import('@/components/home.vue'),
    children: [
      {
        path: '',
        name: 'page',
        alias: 'page',
        title: '首页',
        component: ()=>import('@/views/home-page/index'),
      },
      {
        path: 'recipes',
        name: 'recipes',
        title: '菜谱大全',
        component: () => import('@/views/Daquan-recipes/index'),
      },
      {
        path: 'login',
        name: 'login',
        title: '登录',
        component: ()=>import('@/views/login/index'),
      },
      {
        path: 'DishesInformation',
        name: 'DishesInformation',
        title: '菜谱详情',
        component: () => import('@/views/DishesInformation/index'),
      },
      {
        path: 'MyHomepage',
        name: 'MyHomepage',
        title: '个人主页',
        redirect: { name: 'works' },
        component: () => import('@/views/MyHomepage/index'),
        meta:{
          IsLogin: true,
        },
        children: [
          {
            path: 'works',
            name: 'works',
            title: '作品',
            component: () => import('@/views/MyHomepage/roll'),
            meta: { login: true },
          },
          {
            path: 'collection',
            name: 'collection',
            title: '收藏',
            component: () => import('@/views/MyHomepage/roll'),
            meta: { login: true },
          },
          {
            path: 'fans',
            name: 'fans',
            title: '粉丝',
            component: () => import('@/views/MyHomepage/bean'),
            meta: { login: true },
          },
          {
            path: 'following',
            name: 'following',
            title: '关注',
            component: () => import('@/views/MyHomepage/bean'),
            meta: { login: true },
          },
        ]
      },
      {
        path: 'PublishRecipes',
        name: 'PublishRecipes',
        title: '发布菜谱',
        component: () => import('@/views/PublishRecipes/PublishRecipes'),
        // 路由元信息,加上可以用来判断是否需要登录
        meta:{
          IsLogin: true,
        }
      },
      {
        path: 'personal',
        name: 'personal',
        title: '编辑个人资料',
        component: () => import('@/views/personal/index'),
      }
    ]
  },
  
]

const router = new VueRouter({
  mode: 'history',
  base: process.env.BASE_URL,
  routes
})

// meta为路由元信息,加上可以用来判断是否需要登录
// 路由守卫
router.beforeEach(async (to, from, next) => {
  // 获取存储至本地的 token 验证
  let token = localStorage.getItem('token')
  // 判断是否有值(!!token 返回 true 和 false)
  let islogin = !!token
  // 获取用户信息
  let user = await userInfo()
  // 存储至 vuex
  store.commit('userInfo', user.data)
  // 判断跳转的路由是否需要登录(meta 路由元信息)
  if (to.matched.some((item) => item.meta.IsLogin)) {
    // 判断是否获取到用户信息
    if (user.error == 400) {
      // 删除存储至本地的 token
      localStorage.removeItem('token')
      // 跳转至登录页
      window.location.href = '/login'
    } else {
      // 判断是否有 token 值
      if (islogin) {
        next()
      } else {
        // 没有跳转至登录
        window.location.href = '/login'
      }
      
    }
  } else {
    // 判断已登录,并且跳转至登录页
    if (islogin && to.path === '/login') {
      // 跳转至首页
      window.location.href = '/'
      return
    }
    next()
  }
})

export default router

  • 登录注册的根页面

登录注册页大致相同,只需要把接口进行改变,其他的都可以直接复制过去

<template>
  <div class="login-page">
    <el-tabs v-model="activeName" type="card">
      <el-tab-pane label="登录" name="login">
        <Login></Login>
      </el-tab-pane>
      <el-tab-pane label="注册" name="register">
        <Register></Register>
      </el-tab-pane>
    </el-tabs>
  </div>
</template>
<script>
import Login from "./login.vue";
import Register from "./register";
export default {
  components: { Login, Register },
  data() {
    return {
      // 进入时显示的页面
      activeName: "login",
    };
  },
  methods: {},
};
</script>

<style lang="scss" scoped>
.login-page {
  width: 500px;
  background-color: #fff;
  margin: 20px auto 0;
  box-shadow: 0 0 25px #cac6c6;
  border-radius: 10px;
}
</style>

  • 登录页
<template>
  <div class="login-section">
    <el-form
      :label-position="labelPosition"
      label-width="80px"
      :model="formLabelAlign"
      ref="ruleFroms"
    >
      <el-form-item label="用户名">
        <el-input v-model="formLabelAlign.username"></el-input>
      </el-form-item>
      <el-form-item label="密码">
        <el-input v-model="formLabelAlign.password"></el-input>
      </el-form-item>
      <el-form-item>
        <el-button type="primary" @click="add('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 {
      formLabelAlign: {
        // 用户名
        username: "",
        // 密码
        password: "",
      },
    };
  },
  methods: {
    add() {
      // 用户名和密码不能为空
      if (
        this.formLabelAlign.username !== "" &&
        this.formLabelAlign.password !== ""
      ) {
        // 登录接口
        login({
          name: this.formLabelAlign.username,
          password: this.formLabelAlign.password,
        }).then((data) => {
          // console.log(data);
          // 判断是否登录成功
          if (data.code === 0) {
            // token 存储至本地
            localStorage.setItem("token", data.data.token);
            // 跳转至首页
            window.location.href = "/";
          } else {
            // 登录失败则返回失败问题
            this.$message({
              message: data.mes,
              type: "warning",
            });
          }
        });
      } else {
        this.$message({
          message: "账号或密码不能为空!",
          type: "warning",
        });
      }
    },
    // 清空 input 框
    reset() {
      this.formLabelAlign.username = "";
      this.formLabelAlign.password = "";
    },
  },
};
</script>

<style lang="scss" scoped>
.login-section {
  padding: 0 20px;
}
</style>

  • 注册页
<template>
  <div class="login-section">
    <el-form
      :label-position="labelPosition"
      label-width="80px"
      :model="formLabelAlign"
      ref="ruleFroms"
    >
      <el-form-item label="用户名">
        <el-input v-model="formLabelAlign.username"></el-input>
      </el-form-item>
      <el-form-item label="密码">
        <el-input v-model="formLabelAlign.password"></el-input>
      </el-form-item>
      <el-form-item>
        <el-button type="primary" @click="add">提交</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 {
      formLabelAlign: {
        // 用户名
        username: "",
        // 密码
        password: "",
      },
    };
  },
  methods: {
    add() {
      // 用户名和密码不能为空
      if (
        this.formLabelAlign.username !== "" &&
        this.formLabelAlign.password !== ""
      ) {
        // 注册接口
        register({
          name: this.formLabelAlign.username,
          password: this.formLabelAlign.password,
        }).then((data) => {
          console.log(data);
          // 判断是否登录成功
          if (data.code === 0) {
            // 跳转至登录页
            window.location.href = "/login";
          } else {
            // 注册失败则返回失败问题
            this.$message({
              message: data.mes,
              type: "warning",
            });
          }
        });
      } else {
        this.$message({
          message: "账号或密码不能为空!",
          type: "warning",
        });
      }
    },
    // 清空 input 框
    reset() {
      this.formLabelAlign.username = "";
      this.formLabelAlign.password = "";
    },
  },
};
</script>

<style lang="scss" scoped>
.login-section {
  padding: 0 20px;
}
.avatar-uploader .el-upload {
  border: 1px dashed #d9d9d9;
  border-radius: 6px;
  cursor: pointer;
  position: relative;
  overflow: hidden;
}
.avatar-uploader .el-upload:hover {
  border-color: #409eff;
}
.avatar-uploader-icon {
  font-size: 28px;
  color: #8c939d;
  width: 178px;
  height: 178px;
  line-height: 178px;
  text-align: center;
}
.avatar {
  width: 178px;
  height: 178px;
  display: block;
}
</style>

总结:

总结:
以上就是 美食杰项目 中 登录注册的具体实现方法,不懂得也可以在评论区里问我,以后会持续发布一些新的功能,敬请关注。
我的其他文章:https://blog.csdn.net/weixin_62897746?type=blog

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

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

相关文章

内网渗透神器CobaltStrike之钓鱼攻击(六)

一、HTA木马 简介 HTA是HTML Application的缩写&#xff0c;直接将HTML保存成HTA的格式&#xff0c;是一个独立的应用软件。HTA虽然用HTML、JS和CSS编写&#xff0c;却比普通网页权限大得多&#xff0c;它具有桌面程序的所有权限。就是一个html应用程序&#xff0c;双击就能运…

LeetCode-剑指57-II.和为s的连续正数序列

1、循环 我们可以一次循环每一个数&#xff0c;在⌊n2⌋\left \lfloor \frac{n}{2} \right \rfloor⌊2n​⌋的范围内循环检查添加新的数字后形成的数组和是否为target&#xff0c;若是则将当前数组加入结果当中&#xff1b;否则继续进行循环或跳出循环。 class Solution { pu…

VR,向「B」而生

VR仍是一门好生意&#xff0c;对于VR厂商而言&#xff0c;能否看到VR技术大规模普及的那一天&#xff0c;在于是否认清当下局势&#xff0c;即什么时间干什么事。毕竟在这个泡沫较多的领域&#xff0c;“脱虚向实”&#xff0c;活下去&#xff0c;专注技术与服务&#xff0c;更…

块级格式化上下文BFC

块级格式化上下文BFC创建格式化上下文BFC有哪些特性&#xff1f;特性一特性二特性三特性四BFC的特性可以解决哪些问题&#xff1f;高度塌陷margin塌陷包含塌陷BFC是前端日常开发中离不开的知识点&#xff0c;“块级格式化上下文”是格式化上下文中最常用的一种&#xff0c;格式…

iOS程序内语言切换使用小结

随着时代的发展&#xff0c;应用程序相继出现了不同语言的版本方案&#xff0c;中文&#xff0c;英文&#xff0c;法文&#xff0c;韩文等等&#xff1b;想在应用程序中实现语言的自由切换&#xff0c;需要配置多个语言的文件&#xff0c;根据用户的动态选择获取不同语言文件下…

数字孪生论文阅读笔记【1】

[1]刘劲松. 高档数控机床数字孪生关键技术研究与应用[D].中国科学院大学(中国科学院沈阳计算技术研究所),2022.DOI:10.27587/d.cnki.gksjs.2022.000005. Motivation 不同数控机床对外信息接口不同&#xff0c;导致信息孤岛机床部件诊断困难&#xff0c;造成资源浪费维护资源不…

计算机中的数据存储规则

计算机的存储规则&#xff1a; text文本image图片sound声音 在计算机中&#xff1a;任意数据都是以二进制的形式进行存储:两种状态. 0与1, 打孔法 进制转换 任意进制转十进制: 公式: 系数 * 基数的权次幂 相加 系数&#xff1a; 就是每一位上的数字 基数&#xff1a;当前的进…

async/await详解

&#x1f431;个人主页&#xff1a;不叫猫先生 &#x1f64b;‍♂️作者简介&#xff1a;专注于前端领域各种技术&#xff0c;热衷分享&#xff0c;期待你的关注。 &#x1f4ab;系列专栏&#xff1a;vue3从入门到精通 &#x1f4dd;个人签名&#xff1a;不破不立 &#x1f36c…

面向对象(高级)

目录 1. 类变量和类方法&#xff08;静态变量&#xff09; 类变量&#xff08;静态变量&#xff09; 内存刨析&#xff1a; 注意事项和使用细节&#xff1a; 类方法&#xff08;静态方法&#xff09;&#xff1a; 使用场景&#xff1a; 注意事项和细节讨论&#xff1a; …

净亏损2.9亿元,财务业绩陷入困境后,逸仙电商盈利仍遥遥无期

来源&#xff1a;猛兽财经 作者&#xff1a;猛兽财经 逸仙电商概况 逸仙电商&#xff08;YSG&#xff09;是一家开曼群岛控股公司&#xff0c;通过与可变利益实体(“VIE”)的合同协议&#xff0c;在中国生产和销售化妆品和美容产品。公司结构如图所示。 逸仙电商成立的目的是…

不懂Hybird开发,感觉错过一个亿~

从当前移动开发的实际情况来看&#xff0c;移动端的开发方式三分天下&#xff1a;纯原生&#xff08;Native App&#xff09;、混合开发&#xff08;Hybird App&#xff09;、网页应用&#xff08;Web App&#xff09;。 ​ 纯原生&#xff08;Native App&#xff09;&#xff…

附录10-JS正则

在JS中有多种内置方法可以使用正则表达式&#xff0c;比如说match,exec,test等 文章参考 第十四章 吃通js正则表达式&#xff0c;javascript前端工程师必会技能_哔哩哔哩_bilibili 目录 1 正则常用方法 1.1 exec的简单使用 1.1.1 基本使用 1.1.2 lastIndex属性 1.1.…

Android Activity跳转

实现点击按钮&#xff0c;发送消息并跳转到另一个Activity MainActivity添加SendMessage方法 const val EXTRA_MESSAGE "com.example.myfirstapp.MESSAGE"class MainActivity : AppCompatActivity() {override fun onCreate(savedInstanceState: Bundle?) {super…

【C++】string的使用

文章目录一、前言二、标准库中的string类三. string类的常用接口1. 构造函数2. 容量操作3. 访问遍历4. 修改操作5. 其他操作一、前言 C语言中&#xff0c;字符串是以\0结尾的一些字符的集合&#xff0c;为了操作方便&#xff0c;C标准库中提供了一些str系列的库函数&#xff0…

ubuntu18.04服务搭建yolov5开发环境

文章目录1. 系统和显卡信息2. 下载安装CUDA2.1 1cuda环境变量配置1. 系统和显卡信息 &#xff08;1&#xff09; 系统信息 kanditelpo-System-Product-Name:~$ cat /proc/version Linux version 4.15.0-191-generic (builddlcy02-amd64-032) (gcc version 7.5.0 (Ubuntu 7.5.…

PDF如何转Word?分享几个实用办公软件给你

PDF是我们常用的文件格式&#xff0c;因为它的兼容性好&#xff0c;在手机、电脑查看文件都不影响文件的格式与内容。并且它的保密性也好&#xff0c;因为它无法在线更改文件内容&#xff0c;但这也说明了&#xff0c;我们如果需要对其进行更改的话&#xff0c;将需要把PDF格式…

解决Vue3中echarts无法缩放的问题

这里写自定义目录标题前言问题描述官网示例正常官网示例在本地缩放异常灵光乍现问题解决前言 实际工作中&#xff0c;使用到vue和echarts技术。项目原来用的vue2echarts4&#xff0c;后来更新到了vue3echarts5&#xff0c;结果遇到echarts无法绽放的问题。 问题描述 官网示例…

PDF、Word、Excel文件前端预览实操干货都在这!

随着Odoo在各个行业领域的深入应用&#xff0c;对Odoo的前端交互体验要求也越来越高。 我们在项目开发中常常会遇到&#xff0c;需要上传文件并预览的问题。 这里是我遇到的需求&#xff0c;并完成的一个小demo。 在Odoo中实现文件上传 首先我们需要在qweb页面中加入上传的…

Chrome浏览器插件开发v3版本第二篇:改变页面布局案例

跟着官方教程走才是硬道理&#xff1a;https://developer.chrome.com/docs/extensions/mv3/getstarted/tut-focus-mode/ 老规矩&#xff0c;搭建基本的项目结构&#xff1a;创建一个manifest.json文件 {"manifest_version":3,"name":"Focus",&…

[附源码]Python计算机毕业设计宠物销售管理系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…