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

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

前言:

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


具体实现思路:

引入element-ui中的登录和分页功能实现方法

账号密码进行双向绑定

登录和注册把账号密码传递过去

成功把token报错至本地,失败则返回失败的结果

点击清空input框

引入当前的vuex,并写出所有路由跳转

使用全局导航守卫和meta字段进行登录验证判断

判断跳转的路由是否需要登录,已登录则判断是否获取到用户信息

未获取则删除存储至本地的 token,跳转至登录页

判断是否有 token 值,没有跳转至登录

判断已登录,并且跳转至登录页,跳转至首页

步骤:

1. 展示美食杰登录注册效果

118103d891404ff4859cabe7d28df8b5.png

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>

总结:

总结:

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

相关文章
|
6月前
|
前端开发 小程序 编译器
有意思,圣诞节自己做一个装饰圣诞帽头像的APP!
有意思,圣诞节自己做一个装饰圣诞帽头像的APP!
|
NoSQL 前端开发 JavaScript
【毕业设计之app系列】电影院订票app设计与实现
【毕业设计之app系列】电影院订票app设计与实现
452 0
|
JavaScript
美食杰项目 -- 菜品信息(五)
美食杰项目 -- 菜品信息(五)
美食杰项目 -- 菜品信息(五)
|
前端开发 JavaScript UED
「CSS畅想」何以解忧,美食足矣,用技术给好友开发了一个零食盲盒小游戏
前端技术从业者与非技术好友互动,用技术给好友开发了一个零食盲盒小游戏
261 1