前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >vue+vant制作登录登出个人页面

vue+vant制作登录登出个人页面

作者头像
GeekLiHua
发布2025-01-21 17:21:18
发布2025-01-21 17:21:18
10300
代码可运行
举报
文章被收录于专栏:JavaJava
运行总次数:0
代码可运行

vue+vant制作登录登出个人页面

本文讲解,如何结合vue和vant制作登录,注册,还有个人页面功能。

首先是如何创建vant项目:vue创建vant项目

登录页面编写

编写登录注册页面

在router中配置路由

LoginView.vue

这里重点是看,这个用户的信息是如何存储到localStorage里面的

代码语言:javascript
代码运行次数:0
复制
<template>
    <div>
        <van-nav-bar title="登录" />
        <van-form @submit="onSubmit">
  <van-cell-group inset>
    <van-field
      v-model="user.username"
      name="用户名"
      label="用户名"
      placeholder="用户名"
      :rules="[{ required: true, message: '请填写用户名' }]"
    />
    <van-field
      v-model="user.password"
      type="password"
      name="密码"
      label="密码"
      placeholder="密码"
      :rules="[{ required: true, message: '请填写密码' }]"
    />
  </van-cell-group>
  <div style="margin: 16px;">
    <van-button round block type="primary" @click="Login">
      提交
    </van-button>
    <van-button round block type="danger" @click="toRegister">注册</van-button>
  </div>
  
</van-form>

    </div>
</template>

<script>
import axios from 'axios'
export default {
  computed:{
   
  },
  data () {
    return {
      user: {
        username: 'zhangsan',
        password: '123456'
      }
    }
  },
  mounted () {
    
  },
  methods: {
    Login(){
        // 创建一个 axios 实例
     const instance = axios.create({
        baseURL: 'http://localhost:8083',
        withCredentials: true // 这个参数表示在跨域请求时是否需要使用凭证,默认是 false。
      });
      const params = {
        username: this.user.username,
        password: this.user.password
      }

      instance.post('/user/login', params)
        .then(response => {          
          localStorage.setItem('login_user', JSON.stringify(response.data.data))
          this.$router.push('/index')
        })
        .catch(error => {
          console.log(error.response);
        });
    },
    toRegister () {
      this.$router.push('/register')
    }
  }
}
</script>

<style>

</style>

运行效果:

RegisterView.vue

这里主要看这个年级怎么选,怎么绑定这个属性。

代码语言:javascript
代码运行次数:0
复制
```html

<template>

<div>

代码语言:txt
复制
<van-nav-bar title="注册" />
代码语言:txt
复制
<van-form >
代码语言:txt
复制
  <van-cell-group inset>
代码语言:txt
复制
    <van-field
代码语言:txt
复制
      v-model="user.username"
代码语言:txt
复制
      name="用户名"
代码语言:txt
复制
      label="用户名"
代码语言:txt
复制
      placeholder="请输入用户名"
代码语言:txt
复制
      :rules="[{ required: true, message: '请填写用户名' }]"
代码语言:txt
复制
    />
代码语言:txt
复制
    <van-field
代码语言:txt
复制
      v-model="user.password"
代码语言:txt
复制
      type="password"
代码语言:txt
复制
      name="密码"
代码语言:txt
复制
      label="密码"
代码语言:txt
复制
      placeholder="请输入密码"
代码语言:txt
复制
      :rules="[{ required: true, message: '请填写密码' }]"
代码语言:txt
复制
    />
代码语言:txt
复制
  </van-cell-group>
代码语言:txt
复制
  <div class="container">
代码语言:txt
复制
    <van-radio-group v-model="user.grade" @change="onChange" direction="horizontal">
代码语言:txt
复制
    <van-radio name="7">七年级</van-radio>
代码语言:txt
复制
    <van-radio name="8">八年级</van-radio>
代码语言:txt
复制
    <van-radio name="9">九年级</van-radio>
代码语言:txt
复制
  </van-radio-group>
代码语言:txt
复制
</div>
代码语言:txt
复制
  <div style="margin: 16px;">
代码语言:txt
复制
    <van-button round block type="primary" @click="onRegister">
代码语言:txt
复制
      提交
代码语言:txt
复制
    </van-button>
代码语言:txt
复制
    <van-button round block type="danger" @click="toLogin">登录</van-button>
代码语言:txt
复制
  </div>
代码语言:txt
复制
</van-form>

</div>

</template>

<script>

import axios from 'axios';

export default {

data() {

代码语言:txt
复制
return {
代码语言:txt
复制
  user: {
代码语言:txt
复制
    username: "",
代码语言:txt
复制
    password: "",
代码语言:txt
复制
    grade: ""
代码语言:txt
复制
  },
代码语言:txt
复制
};

},

methods: {

代码语言:txt
复制
onChange(event){
代码语言:txt
复制
  this.user.grade = event
代码语言:txt
复制
},
代码语言:txt
复制
onRegister(){

// 发送post请求

axios.post("http://localhost:8083/user/register", this.user)

代码语言:txt
复制
      .then(response => {
代码语言:txt
复制
        console.log(response);
代码语言:txt
复制
        if (response.data.code === 1){
代码语言:txt
复制
          alert("注册失败,用户名重复");
代码语言:txt
复制
        } else{
代码语言:txt
复制
          alert("注册成功,请登录");
代码语言:txt
复制
          // 注册成功,跳转到登录页面
代码语言:txt
复制
           this.$router.push('/');
代码语言:txt
复制
        }
代码语言:txt
复制
      })
代码语言:txt
复制
      .catch(error => {
代码语言:txt
复制
        console.log(error.response);
代码语言:txt
复制
        alert("注册失败,请检查用户名和密码是否正确!");
代码语言:txt
复制
      });
代码语言:txt
复制
  },
代码语言:txt
复制
toLogin() {
代码语言:txt
复制
  this.$router.push("/");
代码语言:txt
复制
}

}

};

</script>

<style>

.container {

display: flex;

justify-content: center;

align-items: center;

}

</style>

代码语言:txt
复制
运行结果:
 

![请在此添加图片描述](https://developer.qcloudimg.com/http-save/yehe-100000/a112153663b7104b91dd392d0f2d79cc.png?qc_blockWidth=367&qc_blockHeight=793)

#### MyView.vue

这里主要是看这个头像是怎么做的,还有就是这个登出功能是怎么做的。

```javascript

<template>

<div>

代码语言:txt
复制
  <van-nav-bar title="我的" />      
代码语言:txt
复制
  <div class="top">
代码语言:txt
复制
      <van-image
代码语言:txt
复制
      round
代码语言:txt
复制
      width="10rem"
代码语言:txt
复制
      height="10rem"
代码语言:txt
复制
      fit="cover"
代码语言:txt
复制
      position="center"
代码语言:txt
复制
      :src="user.avatar"
代码语言:txt
复制
    />
代码语言:txt
复制
</div>
代码语言:txt
复制
<van-contact-card type="edit" v-model:name="user.username" tel="13000000000" :editable="false" />
代码语言:txt
复制
<van-cell-group>
代码语言:txt
复制
  <van-cell title="知识点" value=">" />
代码语言:txt
复制
  <van-cell title="考试" value=">" />
代码语言:txt
复制
  <van-cell title="错题本" value=">" />
代码语言:txt
复制
  <van-cell title="历史分数" value=">" />
代码语言:txt
复制
</van-cell-group>
代码语言:txt
复制
<br />
代码语言:txt
复制
<van-text-ellipsis
代码语言:txt
复制
  rows="3"
代码语言:txt
复制
  :content="text"
代码语言:txt
复制
  expand-text="展开"
代码语言:txt
复制
  collapse-text="收起"
代码语言:txt
复制
/>
代码语言:txt
复制
<div class="top">
代码语言:txt
复制
  <van-button color="linear-gradient(to right, #ff6034, #ee0a24)" style="width: 100%;" @click="LogOut">

退出

</van-button>

代码语言:txt
复制
</div>
代码语言:txt
复制
<Tabbar></Tabbar>

</div>

</template>

<script>

import Tabbar from '../../components/common/TabbarView.vue'

export default {

data() {

代码语言:txt
复制
return {
代码语言:txt
复制
  user: {},
代码语言:txt
复制
  text:
代码语言:txt
复制
    '那一天我二十一岁,在我一生的黄金时代。我有好多奢望。我想爱,想吃,还想在一瞬间变成天上半明半暗的云。后来我才知道,生活就是个缓慢受锤的过程,人一天天老下去,奢望也一天天消失,最后变得像挨了锤的牛一样。可是我过二十一岁生日时没有预见到这一点。我觉得自己会永远生猛下去,什么也锤不了我。',
代码语言:txt
复制
}

},

mounted() {

const loginUserStr = localStorage.getItem("login_user");

if (loginUserStr) {

代码语言:txt
复制
this.user = JSON.parse(loginUserStr);
代码语言:txt
复制
localStorage.setItem("login_user", JSON.stringify(this.user));

} else {

代码语言:txt
复制
// 如果从 local storage 中获取不到用户信息,则使用默认值
代码语言:txt
复制
this.user = {
代码语言:txt
复制
  id: 0,
代码语言:txt
复制
  username: "default",
代码语言:txt
复制
  password: "",
代码语言:txt
复制
  avatar: "",
代码语言:txt
复制
  grade: "",
代码语言:txt
复制
  role: "",
代码语言:txt
复制
};

}

// 检查用户是否为 null。如果是 null,重定向到主页。

if (!this.user) {

代码语言:txt
复制
this.$router.push("/");

}

},

methods: {

代码语言:txt
复制
LogOut(){
代码语言:txt
复制
  this.$router.push('/')
代码语言:txt
复制
  localStorage.removeItem('login_user')
代码语言:txt
复制
}

},

components: {

代码语言:txt
复制
Tabbar,

},

}

</script>

<style>

.top {

display: flex;

justify-content: center;

}

</style>

代码语言:txt
复制

运行结果:

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-01-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • vue+vant制作登录登出个人页面
    • 登录页面编写
      • LoginView.vue
      • RegisterView.vue
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档