“微商城”项目(5登录和注册)

1.我的信息

在pages\User.vue文件中编写HTML结构代码,示例代码如下。

<template>
  <div class="member">
    <div class="header-con">
      <router-link :to="{ name: 'login' }" class="mui-navigate-right">
        <div class="user-info">
            <div class="avatar-con">
              <div class="avatar">
            <img src="../assets/images/avatar_default.png" class="image-info">
         </div>
       </div>
    <div class="person-con">
      <span>登录 / 注册</span>
    </div>
        </div>
      </router-link>
    </div>
  </div>
</template>

<style lang="scss" scoped>
.member {
  margin-bottom: 15px;
  .header-con {
    padding: 10px;
    background-color: #fff;
    .user-info {
      position: relative;
      overflow: hidden;
      width: 100%;
      height: 120px;
      background: linear-gradient(90deg,#28a2ff,#ffd787);
      box-shadow: 0 0.1rem 0.25rem #f8e3c6;
      .avatar-con {
        position: absolute;
        left: 15px;
        top: 50%;
        transform: translateY(-50%);
        .avatar {
          width: 60px;
          height: 60px;
          overflow: hidden;
          box-shadow: 0 2px 10px rgba(0,0,0,15);
          border: 1px solid hsla(0,0%,100%,.4);
          border-radius: 50% 50%;
          .image-info {
            width: 100%;
            height: 100%;
          }
        }
      }
      .person-con {
        position: absolute;
        left: 90px;
        top: 50%;
        transform: translateY(-50%);
        color: #fff;
      }
    }
  }
}
</style>

 保存代码,启动项目,运行结果如下图所示。

 2.登录页面

在src\router.js文件中,导入Login.vue登录组件。

import Login from './pages/user/Login.vue'

并且在routes数组中配置路由匹配规则,示例代码如下。

{ path: '/user/login', component: Login, name: 'login', meta: { title: '登录' } },

创建src\pages\user\Login.vue组件,编写HTML结构代码,示例代码如下。

<template>
  <div class="login">
    <div class="mui-content">
      <form class="mui-input-group">
        <div class="mui-input-row">
          <label>账号</label>
          <input v-model="loginForm.username" type="text" class="mui-input-clear mui-input" placeholder="请输入账号">
        </div>
        <div class="mui-input-row">
          <label>密码</label>
          <input v-model="loginForm.password" type="password" class="mui-input-clear mui-input" placeholder="请输入密码">
        </div>
      </form>
      <div class="mui-content-padded">
        <button @click="login" type="button" class="mui-btn mui-btn-block mui-btn-primary">登录</button>
        <div class="link-area"><a @click="register">还没有账号?前往注册</a></div>
      </div>
    </div>
  </div>
</template>
<script>
export default {
  data () {
    return {
      loginForm: {
        username: '',
        password: ''
      }
    }
  },
  methods: {
    login () {
      // 登录
    },
    register () {
      this.$router.push({ name: 'register' })
    }
  }
}
</script>
<style lang="scss" scoped>
.mui-input-group {
  margin-top: 10px;
  background-color: transparent;
}
.mui-input-group label {
  width: 22%;
}
.mui-input-row:last-child {
  background: #fff;
}
.mui-input-row {
  margin-top: 20px;
  background: #fff;
}
.mui-input-row label~input,
.mui-input-row label~select,
.mui-input-row label~textarea {
  width: 78%;
}
.link-area {
  display: block;
  margin-top: 25px;
  text-align: center;
}
.mui-content-padded {
  margin-top: 30px;
}
</style>

保存代码,启动项目,运行结果如下图所示。

 3.实现登录功能

在src\pages\user\Login.vue文件中,编写Login()方法,示例代码如下。

login () {
  if (this.loginForm.username === '' || this.loginForm.password === ''){
    this.$toast('账号或密码不能为空')
  } else {
    this.$http.post('login', this.loginForm).then(res => {
      if (res.data.code === 0) {
        this.$toast(res.data.msg)
      } else {
        // 登录成功
      }
    }).catch(() => {
      this.$toast('登录失败')
    })
  }
}

  

登录成功以后,将用户信息通过store保存。创建src\store\modules\user.js文件,编写如下代码。

const state = {
  id: 0,
  username: ''
}
const getters = {}
const actions = {}
const mutations = {
  setUser (state, user) {
    state.id = user.id
    state.username = user.username
  }
}
export default {
  namespaced: true,
  state,
  getters,
  actions,
  mutations
}

在src\store\index.js文件中,添加如下代码。

import Vue from 'vue'
import Vuex from 'vuex'
import user from './modules/user'
Vue.use(Vuex)
export default new Vuex.Store({
  modules: {
    user
  }
})

src\pages\user\Login.vue文件中,编写登录成功之后要执行的代码。

// 登录成功
this.$store.commit('user/setUser', res.data.data)
this.$toast(res.data.msg)
this.$router.replace({ name: 'user' })

 在src\store\modules\user.js文件中,编写isLogin()方法判断是否已经登录,示例代码如下。

const getters = {
  isLogin (state) {
    return state.id !== 0
  }
}

在src\pages\User.vue文件中,引入mapGetters和mapState ,并在计算属性中调用mapGetters和mapState 的辅助方法。

<script>
import { mapGetters, mapState } from 'vuex'
export default {
  computed: {
    ...mapState({
      username: state => state.user.username
    }),
    ...mapGetters('user', { isLogin: 'isLogin' })
  }
}
</script>

打开src\pages\User.vue文件,给标签添加v-if/v-else判断,示例代码如下。

<template>
  <!-- 已登录 -->
  <div v-if="isLogin">
    <div class="member">
      <div class="header-con">
        <div class="user-info">
          <div class="avatar-con">
            <div class="avatar">
              <img src="../assets/images/avatar_default.png" class="image-info">
            </div>
          </div>
          <div class="person-con">
            <span>{{ username }}</span>
          </div>
        </div>
      </div>
    </div>
  </div>
  <!-- 未登录 -->
  <div v-else>
    <div class="member">
       ……(原有代码)
    </div>
  </div>
</template>

可能报错:

 解决方法:

 修改src/main.js的内容:

保存代码,启动项目,未登录效果如下图所示。

 已登录效果:(用户名test,密码123456),如下图所示。

 4.记住登录状态

在页面登录成功以后,记住登录状态,创建src\auth.js文件,编写如下代码。

var auth = {
  getAuthorization () {
    return localStorage.getItem('Authorization');
  },
  setAuthorization (Authorization) {
    localStorage.setItem('Authorization', Authorization);
  }
}
export default {
  install: function (vue) {
    vue.prototype.$auth = auth
  }
}

将src\auth.js文件添加到src\main.js中,打开main.js文件,编写如下代码。

import auth from './auth.js'
Vue.use(auth)

需要注意的是,auth.js文件一定要放在axios前面。

编写src\pages\user\Login.vue文件,示例代码如下

// 登录成功
this.$store.commit('user/setUser', res.data.data)
this.$auth.setAuthorization(res.data.data.session_id)
this.$toast(res.data.msg)
this.$router.replace({ name: 'user' })

 打开src\axios.js文件,将保存的session_id放入到下次请求的header中,示例代码如下。

export default {
  install: function (vue) {
    var auth = vue.prototype.$auth
    var obj = axios.create({
      baseURL: config.baseURL
    })
    obj.interceptors.request.use(function (conf) {
      conf.headers.Authorization = auth.getAuthorization()
      return conf
    })
    vue.prototype.$http = obj
  }
}

保存上述代码,在下次刷新后,获取已登录的用户信息。

打开src\App.vue文件,编写如下代码。

created () {
  this.showBack = this.$route.path !== '/home'
  this.checkLogin()
},
methods: {
  goBack() {
    this.$router.go(-1)
  },
  checkLogin() {
    this.$indicator.open({
      text: '加载中'
    })
    this.$http.get('user').then(res => {
      if (res.data.code === 1) {
        this.$store.commit('user/setUser', res.data.data)
      }
      this.$indicator.close()
    })
  }
},

5.用户菜单

打开src\pages\User.vue文件,在已登录部分进行代码编写,示例代码如下。

<!-- 已登录 -->
<div v-if="isLogin">
  <div class="member">
    ……(原有代码)
  </div>
  <ul class="mui-table-view mui-table-view-chevron">
    <li class="mui-table-view-cell mui-media">
      <div class="mui-navigate-right">
        <img class="mui-media-object mui-pull-left" src="../assets/images/avatar_default.png">
        <div class="mui-media-body">我的订单</div>
      </div>
    </li>
    <li class="mui-table-view-cell mui-media">
      <div class="mui-navigate-right">
        <img class="mui-media-object mui-pull-left" src="../assets/images/avatar_default.png">
        <div class="mui-media-body">收货地址</div>
      </div>
    </li>
    <li class="mui-table-view-cell mui-media">
      <div class="mui-navigate-right">
        <img class="mui-media-object mui-pull-left" src="../assets/images/avatar_default.png">
        <div class="mui-media-body">退出登录</div>
      </div>
  </li>
  </ul>
</div>




<style lang="scss" scoped>
.mui-table-view .mui-media, .mui-table-view .mui-media-body{
  line-height: 42px;
}
.mui-table-view-cell:after{
  left: 0px;
}
……(原有代码)
</style>

 6.退出登录

打开src\pages\User.vue文件,给退出登录的外层父元素绑定logout()单击事件,示例代码如下。

<div @click="logout" class="mui-navigate-right">
  <img class="mui-media-object mui-pull-left" src="../assets/images/avatar_default.png">
<div class="mui-media-body">退出登录</div>
</div>

在src\store\modules\user.js文件的mutations对象中,定义logout事件,示例代码如下。

const mutations = {
 ……(原有代码)
  logout (state) {
    state.id = 0
    state.username = ''
  }
}

程序测试,当单击“退出登录”以后,页面会变成未登录的状态,效果如下图所示。

 7.注册页面

在src\router.js文件中,导入Register.vue注册组件

import Register from './pages/user/Register.vue'

在routes数组中配置路由匹配规则,示例代码如下。

routes: [
  ……(原有代码)
  { path: '/user/register', component: Register, name: 'register', meta: { title: '注册' } }
],

创建src\pages\user\Register.vue组件,编写HTML结构代码,示例代码如下。

<template>
  <div>
    <div class="mui-content">
      <form class="mui-input-group">
        <div class="mui-input-row">
          <label>账号</label>
          <input v-model="regForm.username" type="text" class="mui-input-clear mui-input" placeholder="请输入账号">
        </div>
        <div class="mui-input-row">
          <label>密码</label>
          <input v-model="regForm.password" type="password" class="mui-input-clear mui-input" placeholder="请输入密码">
        </div>
        <div class="mui-input-row">
          <label>确认</label>
          <input type="password" ref="pwdConfirm" class="mui-input-clear mui-input" placeholder="请确认密码">
        </div>
        <div class="mui-input-row">
          <label>邮箱</label>
          <input v-model="regForm.email" type="email" class="mui-input-clear mui-input" placeholder="请输入邮箱">
        </div>
      </form>
      <div class="mui-content-padded">
        <button @click="register" class="mui-btn mui-btn-block mui-btn-primary">注册</button>
      </div>
      <div class="mui-content-padded">
        <p>注册成功后的用户可用于登录</p>
      </div>
    </div>
  </div>
</template>
<script>
export default {
  data () {
    return {
      regForm: {
        username: '',
        password: '',
        email: ''
      }
    }
  },
  methods: {
    register: function () {
    }
  }
}
</script>
<style lang="scss" scoped>
.mui-input-group {
  margin-top: 10px;
  background-color: transparent;
}
.mui-input-group label {
  width: 22%;
}
.mui-input-row:last-child {
  background: #fff;
}
.mui-input-row{
  margin-top:20px;
  background: #fff;
}
.mui-input-row label~input,
.mui-input-row label~select,
.mui-input-row label~textarea {
  width: 78%;
}
.link-area {
  display: block;
  margin-top: 25px;
  text-align: center;
}
.mui-content-padded {
  margin-top: 30px;
}
</style>


保存代码,启动项目,运行结果如下图所示。

 在methods中编写register方法,用于表单提交,示例代码如下

register: function () {
  var pwdConfirm = this.$refs.pwdConfirm.value
  if (this.regForm.username === '') {
    this.$toast('账号不能为空')
    return
  } else if (this.regForm.password === '') {
    this.$toast('密码不能为空')
     return
  } else if (this.regForm.password != pwdConfirm) {
    this.$toast('密码两次输入不一致')
    return
  } else if (this.regForm.email === '') {
    this.$toast('邮箱不能为空')
    return
  }
  window.console.log(this.regForm)
}

保存代码,启动项目,在浏览器控制台中查看是否提交成功,运行结果如下图所示。

 8.实现注册功能

在src\pages\user\Register.vue文件中,提交注册表单,示例代码如下。

// window.console.log(this.regForm)
this.$indicator.open({
  text: '注册中'
})
this.$http.post('register', this.regForm).then(res => {
  this.$indicator.close()
  if (res.data.code === 0) {
    this.$toast(res.data.msg)
  } else {
    this.$store.commit('user/setUser', res.data.data)
    this.$auth.setAuthorization(res.data.data.session_id)
    this.$toast(res.data.msg)
    this.$router.replace({ name: 'user' })
  }
}).catch(() => {
  this.$toast('注册失败')
})

保存代码,启动项目,输入用户名和密码,单击注册,注册成功后的页面效果如下图所示。

接着这篇文章的是“微商城”项目(6商品分类)

若出现问题可以私信我,如果我能解决,会尽量帮忙的(●ˇ∀ˇ●)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Spring Cloud Alibaba - Sentinel(一)

目录 一、Sentinel介绍 1、什么是Sentinel 2、Sentinel好处 3、Sentinel下载和安装 二、搭建Sentinel项目 1、创建项目cloudalibaba-sentinel-service8401 三、Sentinel流控规则 1、流控规则基本介绍 2、新增流控 2.1、QPS直接失败案例 2.2、线程数直接失败案例 3、…

容器(第一篇)docker安装、基础操作命令

docker是什么&#xff1f; docker是一个go语言开发的应用容器引擎。 docker的作用&#xff1f; ①运行容器里的应用&#xff1b; ②docker是用来管理容器和镜像的一种工具。 容器 与 虚拟机 的区别&#xff1f; 容器 虚拟机所有容器共享宿主机…

【论文阅读】Neuralangelo:高保真神经表面重建

【论文阅读】Neuralangelo&#xff1a;高保真神经表面重建 Abstract1. Introduction2. Related work3. Approach3.1.预备工作3.2.数值梯度计算3.3.渐进细节层次3.4.优化 4. Experiments4.1. DTU Benchmark4.2. Tanks and Temples4.3.细节水平4.4.消融 5. Conclusion paper proj…

深度学习基础知识-tf.keras实例:衣物图像多分类分类器

参考书籍&#xff1a;《Hands-On Machine Learning with Scikit-Learn, Keras, and TensorFlow, 2nd Edition (Aurelien Geron [Gron, Aurlien])》 本次使用的数据集是tf.keras.datasets.fashion_mnist&#xff0c;里面包含6w张图&#xff0c;涵盖10个分类。 import tensorflo…

Jmeter性能测试 (入门)

Jmeter是一款优秀的开源测试工具&#xff0c; 是每个资深测试工程师&#xff0c;必须掌握的测试工具&#xff0c;熟练使用Jmeter能大大提高工作效率。 熟练使用Jmeter后&#xff0c; 能用Jmeter搞定的事情&#xff0c;你就不会使用LoadRunner了。 本文将通过一个实际的测试例…

IPV6地址基础

IPv6是英文“Internet Protocol Version 6”&#xff08;互联网协议第6版&#xff09;的缩写&#xff0c;是互联网工程任务组&#xff08;IETF&#xff09;设计的用于替代IPv4的下一代IP协议。其地址数量号称可以为全世界的每一粒沙子编上一个地址 1. ipv6地址表示方法 IPv6的…

MQTT与EMQ

文章目录 1 MQTT协议与EMQ中间件1.1 物联网消息协议MQTT1.1.1 什么是MQTT1.1.2 MQTT相关概念1.1.3 消息服务质量QoS——信息的可靠投递1.1.3.1 QoS0——消息服务质量为0&#xff0c;消息发送至多一次1.1.3.2 QoS1——消息发送至少一次1.1.3.3 QoS2——消息发送仅一次1.1.3.4 不…

Oracle中的数据导出(4)

目录 法一&#xff1a;使用SQL plus命令脚本 法二&#xff1a;使用PLSQL Developer工具 前几篇文章描述了如何将Oracle中的数据导出到库外&#xff0c;但是导出的数据结果都是文本文档&#xff0c;这样页面查看不和谐&#xff0c;编辑又略显麻烦。因此这篇文章将描述如何将Or…

Pb协议的接口测试

【摘要】 Protocol Buffers 是谷歌开源的序列化与反序列化框架。它与语言无关、平台无关、具有可扩展的机制。用于序列化结构化数据&#xff0c;此工具对标 XML &#xff0c;支持自动编码&#xff0c;解码。比 XML 性能好&#xff0c;且数据易于解析。更多有关工具的介绍可参考…

氟化物选择吸附树脂Tulsimer ®CH-87 ,锂电行业废水行业矿井水除氟专用树脂

氟化物选择吸附树脂 Tulsimer CH-87 是一款去除水溶液中氟离子的专用的凝胶型选择性离子交换树脂。它是具有氟化物选择性官能团的交联聚苯乙烯共聚物架构的树脂。 去除氟离子的能力可以达到 1ppm 以下的水平。中性至碱性的PH范围内有较好的工作效率&#xff0c;并且很容易再生…

Vue.js 中的过渡动画是什么?如何使用过渡动画?

Vue.js 中的过渡动画是什么&#xff1f;如何使用过渡动画&#xff1f; 在 Vue.js 中&#xff0c;过渡动画是一种在元素插入、更新或删除时自动应用的动画效果&#xff0c;可以为应用程序增加一些动态和生动的效果。本文将介绍 Vue.js 中过渡动画的概念、优势以及如何使用过渡动…

Nginx正则表达式、location、rewrite

目录 一、常用的Nginx正则表达式 二&#xff1a;localtion 1、location 分类 2、 location 常用的匹配规则 3、location 优先级 4、 location 示例 5、优先级总结 6、实际网站使用中&#xff0c;至少有三个匹配规则定义 &#xff08;1&#xff09;第一个必选规则 &…

chatgpt赋能python:将一行数变成列——Python简单实现

将一行数变成列——Python简单实现 在数据处理时&#xff0c;我们常常会遇到将一行的数据转换成列的情况&#xff0c;例如将多个数据在Excel表格中拆分为不同的列。这时候&#xff0c;Python可以帮助我们快速实现这个功能。 什么是Python&#xff1f; Python是一种高级&…

N-propargyloxycarbonyl-L-lysine,1215204-46-8,是一种基于赖氨酸的非天然氨基酸 (UAA)

产品描述&#xff1a; N-ε-propargyloxycarbonyl-L-lysine (H-L-Lys(Poc)-OH) 是一种基于赖氨酸的非天然氨基酸 (UAA)。 广泛用于多种生物体中荧光探针的生物偶联。 N- ε- Propargyloxycarbonyl-L-lysine (H-L-Lys (Poc) - OH) is a non natural amino acid (UAA) based on …

IDEA 终端命令行设置

一、说明 在使用 IDEA 进行程序开发时&#xff0c;需要使用到终端 Terminal 的功能&#xff0c;便于能够快速使用 shell 命令&#xff0c;进行各种相关的操作。 这些操作可以包括代码的版本控制、程序的打包部署等等 比如&#xff0c;前后端的集成开发环境&#xff08;IDEA、We…

.gitignore忽略文件不生效

前言 .gitignore忽略文件时git仓库很重要的一个配置&#xff0c;在创建仓库时就会有模板选择和忽略文件。 .gitignore忽略文件意思是在上传到代码仓库时&#xff0c;控制把哪些代码文件不上传到代码仓库。 在实际开发中其实写的代码是没有多大的&#xff0c;主要的是插件本地…

基于牛顿拉夫逊的配电网潮流计算研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

Symfony v6.2.11 正式发布,经典 PHP Web 开发框架

导读Symfony v6.2.11 发布了&#xff01;Symfony 是一款基于 MVC 架构的 PHP 框架&#xff0c;致力于减少重复代码的编写&#xff0c;以加速 Web 应用的开发和维护。Symfony 与许多关系型数据库集成的也非常好&#xff0c;成本也较小。 此外&#xff0c;Symfony 致力于在企业背…

技术赋能-混流编排功能,助力京东618直播重保 | 京东云技术团队

每每到618、双11这样的大型活动的时候&#xff0c;每天都有几个重要的大v或者品牌直播需要保障。 以往的重点场次监播方式是这么造的&#xff1a; 对每路直播的源流、各档转码流分别起一个ffplay播放窗口&#xff0c;再手动调整尺寸在显示器桌面进行布局&#xff0c;排到一屏…

怎么用u盘制作pe系统启动盘

PE系统是一种小型的windows系统&#xff0c;通俗的说法也就是在电脑出现问题不能正常进入系统时的一种紧急备用系统。它容量小能量大&#xff0c;可以解决win系统中经常遇到的一些问题&#xff0c;对于经常使用电脑的用户来说&#xff0c;制作一个pe系统启动盘放在身边是很有必…
最新文章