Vue3+springboot实现简单登录demo

news2025/2/26 11:35:08

Vue3从0搭建脚手架步骤【默认已安装node.js

前置条件:默认已安装node.js、yarn

第一步:创建项目

选择任意一个空白文件夹如下:

cmd进入该文件夹下的命令窗口模式,然后输入指令创建vue项目:vue create my-project

选择vue版本,此次我们选择的vue3,回车

耐心等待几分钟下载完成,完成后在终端(也就是Terminal)切换到下载好的项目目录,这里指的是名为my-project的项目,如下图。如果不清楚就直接在电脑cmd窗口下执行如下命令

cd 你的项目绝对路径(从盘符开始)

cd E:\Code\personage\NewCollections\vuedemo\my-project

然后输入npm run serve运行vue项目(有的是npm run dev)

在浏览器访问项目给出的ttp://localhost:8080/地址,(我这里是 http://localhost:8080/)

浏览器出现下面这个页面说明vue脚手架搭建成功

准备改造页面:

使用idea或者vscode或者Hbuilder等等你喜欢的代码编辑器打开刚刚Vue创建的my-project项目

如下图(记住有个App.vue文件,待会儿要修改它):
我用的idea打开,然后在src下创建2个文件夹views(存放我们的页面代码)和router(存放页面之间的路由跳转规则)

在router文件夹下创建一个index.js文件

在views下新建Login和Home文件夹,并分别创建Login.vueHome.vue文件

结构如下:

打开最开始提到的App.vue页面,修改代码内容如下:

<template>

  <router-view></router-view>

</template>



<script>

export default {

  name: 'App',

}

</script>



<style>

#app {

  font-family: Avenir, Helvetica, Arial, sans-serif;

  -webkit-font-smoothing: antialiased;

  -moz-osx-font-smoothing: grayscale;

  text-align: center;

  color: #2c3e50;

  margin-top: 60px;

}

</style>



编写Home.vue代码内容

<template>

<h1>欢迎来到主页</h1>

  <div>

    <p>用户名:{{ user.username }}</p>

    <p>电话号码:{{ user.phone }}</p>

  </div>

  <button @click="logout">退出登录</button>

</template>



<script>

export default {

  name: "HomePage",

  data(){

    return{

      user:{}

    }

  },

  created() {

    //从localStorage获取用户信息

    const userStr=localStorage.getItem("user");

    if (userStr){

      this.user=JSON.parse(userStr);

    }

  },

  methods:{

    logout(){

      //清除登录状态

      localStorage.removeItem("token");

      //清除用户信息

      localStorage.removeItem("user");

      //使用 this.$router.push 进行路由跳转

      this.$router.push('/login');

    }

  }

}

</script>



<style scoped>



</style>

编写Login.vue代码内容

<template>

<div class="login-container">

  <h2>登录界面</h2>

  <form @submit.prevent="login">

    <div>

      <label for="username">用户名:

        <input type="text" v-model="username" id="username">

      </label>

    </div>

<div>

    <label for="password">密码:

      <input type="password" v-model="password" id="password">

    </label>

</div>

    <button class="center-button" type="submit">登录</button>

  </form>

</div>

</template>



<script>

import axios from 'axios';

export default {

  name: "LoginPage",

  data(){

    return{

      username:'',

      password:'',

    }

  },

  methods:{

    login() {

      // 实际的登录逻辑

      const apiUrl = "http://localhost:8089/api/login";

      const loginData = {

        username: this.username,

        password: this.password

      };

      // 发送 POST 请求

      axios.post(apiUrl, loginData)

          .then(res => {

            if (res.data.code === 200) {

              //存储用户信息到 localStorage

              localStorage.setItem("user", JSON.stringify(res.data.data))

              //存储登录状态

              localStorage.setItem("token", "123456");

              // 使用 this.$router.push 进行路由跳转

              this.$router.push('/home');

            } else {

              alert(res.data.msg);

            }

          });

    }

  }

}

</script>



<style scoped>

form {

  display: flex;

  flex-direction: column;

  margin-top: 20px;

}



label {

  margin-bottom: 5px;

}



input {

  margin-bottom: 10px;

}

.center-button {

  display: block;

  margin: 0 auto;

}



</style>

编写router下的index.js内容

import {createRouter,createWebHistory } from 'vue-router'

import Home from '../views/Home/Home.vue'

import Login from '../views/Login/Login.vue'

const routes=[

    // 跳转主页

    {

        path:'/',

        redirect:'/login'

    },

    {

        path: '/login',

        name:'LoginPage',

        component: Login

    },

    {

        path:'/home',

        name:'HomePage',

        component: Home

    }

];



const router=createRouter({

    history:createWebHistory(),

    routes

});
// main.js 中配置导航守卫

router.beforeEach((to, from, next) => {

    console.log("来源地址:", from)

    console.log("目标地址:", to)

    //验证token

    let token = localStorage.getItem('token');

    if (token|| to.path === '/login') {

        // 允许导航继续

        next();

    } else {

        // 如果用户未登录,则重定向到登录页面

        // next({ name: 'Login' });

        next('/login');

    }

});



export default router;

编写与src同级的main.js内容

import { createApp } from 'vue'

import App from './App.vue'

import router from './router'

createApp(App).use(router).mount('#app')

最后重新运行项目,执行 npm run serve

出现下面界面

编写后端springboot代码

在application.properties中配置后端项目运行端口

# 应用服务 WEB 访问端口

server.port=8089

编写控制层:

@CrossOrigin

@RestController

@RequestMapping("/api")

public class LoginController {

    @PostMapping("/login")

    public R login(@RequestBody User user){

        if (user.getUsername().equals("admin") && user.getPassword().equals("123456")){

            user.setPhone("1325474512");

            return Result.success(user);

        }else {

            return Result.error(1,"用户名或密码错误");

        }

    }

}

web的登录界面输入

账号:admin

密码:123456

然后点击登录进入如下页面:

Vue3+Springboot实现简单登录demo成功,后端java代码特别简单,需要的私信

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

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

相关文章

Maya笔记 大纲视图、父子级、打组

文章目录 大纲视图打开大纲视图双层大纲视图 父子级快捷键大纲视图 组菜单操作快捷键操作 大纲视图 打开大纲视图 双层大纲视图 鼠标放到大纲视图最下边的…上&#xff0c;鼠标变成拖动&#xff0c;向上拖&#xff0c;可以拖出两个大纲视图&#xff0c;方便我们同时操作两个物…

[JavaWeb玩耍日记]HTML与CSS快速使用

目录 一.标签 二.指定css 三.css选择器 四.超链接 五.视频与排版 六.布局测试 七.布局居中 八.表格 九.表单 十.表单项 实验项目目录&#xff1a; 必要文件new.css: h1 {color:black; } span{color: #968D92;; } a {color: #000;text-decoration: none; } p {text-i…

水合三氯化铱(三氯化铱水合物)行业技术壁垒较高 应用范围有望扩展

水合三氯化铱&#xff08;三氯化铱水合物&#xff09;行业技术壁垒较高 应用范围有望扩展 水合三氯化铱又称三氯化铱水合物&#xff0c;分子式为IrCl33H2O&#xff0c;是一种无机化合物。水合三氯化铱外观呈绿色结晶或褐色粉末&#xff0c;可溶于水、丙酮和盐酸&#xff0c;难溶…

学习阶段单片机买esp32还是stm32?

学习阶段单片机买esp32还是stm32? 在开始前我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「stm32的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后私信回复“888”&#xff0c;全部无偿共享给大家&#xff01;&#xff01;&#xf…

Altair® HyperWorks® 2023 卓越的开放式仿真和设计平台

Altair HyperWorks 2023 卓越的开放式仿真和设计平台 全新的 Altair HyperWorks 2023 软件版本现已发布&#xff01;Altair HyperWorks 2023 是一个开放式仿真和设计平台&#xff0c;功能更强大、用途更广泛&#xff0c;将为工程师提供适用于各行业的全面 CAE 软件套件。通过运…

【appium】Hybrid应用自动化|微信小程序自动化

目录 一、Hybrid&#xff08;nativewebview&#xff09;应用自动化 1、webview 2、Hybrid应用自动化实现 2.1准备工作 Step1&#xff1a;准备android 4.4版本以上的手机/模拟器 Step2&#xff1a;在app源码中将webview调试模式打开 Step3&#xff1a;安装UC开发者工具 U…

Sui主网升级至V1.19.1版本

其他升级要点如下所示&#xff1a; #16190, #16193 现在CLI正确处理并修复了交易没有输入或命令时的输出表格。例如&#xff0c;调用 client call — package 0x2 — module kiosk — function default 现在具有正确格式的输出。 #15928 Move编译器的一系列变更 添加了宏函…

Redis持久化的两种方式RDB和AOF详解

小伙伴们好&#xff0c;欢迎关注&#xff0c;一起学习&#xff0c;无限进步 以下内容为学习 Redis 过程中的笔记 文章目录 Redis持久化RDB&#xff08; Redis DataBase &#xff09;触发机制&#xff1a;如何恢复rbd文件&#xff1a;优点&#xff1a;缺点&#xff1a; AOF &…

搬家了,发现虚拟机链接不上,查找原因,解决了

是网络配置的问题&#xff0c;因为ip地址变动&#xff0c;所以配置文件要进行改动 1.通过cmd查看本地主机ip地址 2.在虚拟网络编辑器中选在vmnet8&#xff0c;用管理员权限修改ip&#xff0c;网关&#xff0c;子网掩码&#xff0c;和物理主机对应 3.在/etc/sysconfig/network…

同局域网共享虚拟机(VMware)

一、前言 首先我们先来了解下 VMware 的三种网络模式桥接模式、NAT模式、仅主机模式&#xff0c;网络类型介绍详情可以参考下我之前的文档 Linux系统虚拟机安装&#xff08;上&#xff09;第三章 - 第9步指定网络类型。了解三种网络模式的原理之后&#xff0c;再来剖析下需求&…

【力扣hot100】刷题笔记Day14

前言 又是新的一周&#xff0c;快乐的周一&#xff0c;快乐地刷题&#xff0c;今天把链表搞完再干活&#xff01; 114. 二叉树展开为链表 - 力扣&#xff08;LeetCode&#xff09; 前序遍历 class Solution:def flatten(self, root: Optional[TreeNode]) -> None:if not r…

clickhouse 随心所欲的聚合模型-AggregatingMergeTree

clickhouse 强大的 MergeTree 系列引擎令人信服&#xff0c;其 ReplacingMergeTree、SummingMergeTree 在数据唯一性和汇总场景中表现非凡。但你是否还有保留最小(大)、平均等预聚合需求&#xff0c;甚至在一个模型中既有唯一性语意也有汇总、最小、最大、平均值语意该如何处理…

【Simulink系列】——Simulink与Matlab接口使用命令行进行仿真

声明&#xff1a;本系列博客参考有关专业书籍&#xff0c;截图均为自己实操&#xff0c;仅供交流学习&#xff01; 一、Simulink与Matlab接口 1、Matlab工作区变量设置模块参数 Matlab工作区的变量可以作为模块的设置参数 2、Matlab工作区变量作为输入信号 使用From Worksp…

深度学习--神经网络基础

神经网络 人工神经网络&#xff08; Artificial Neural Network &#xff0c; 简写为 ANN &#xff09;也简称为神经网络&#xff08; NN &#xff09;&#xff0c;是一种模仿生物神经网络结构和 功能的计算模型 。人脑可以看做是一个生物神经网络&#xff0c;由众多的 神经元…

FLStudio20.8编曲制作软件中文版下载及功能全面介绍

一、主要功能 FL Studio 20.8&#xff0c;作为一款深受音乐制作人和作曲家喜爱的软件&#xff0c;具备多种核心功能&#xff0c;满足从创作到完成的整个音乐制作流程。 音频录制与编辑&#xff1a;用户可以轻松录制外部音频&#xff0c;如乐器演奏、人声等&#xff0c;并在软…

【新书推荐】8.4 逻辑运算指令

本节内容&#xff1a;逻辑运算指令。8086 CPU逻辑运算指令包括NOT、AND、OR、XOR&#xff0c;除NOT指令外&#xff0c;均有两个操作数。逻辑运算指令影响状态标志位。 ■否操作指令NOT指令格式&#xff1a;NOT OPRD。将OPRD取反&#xff0c;然后送回OPRD。操作数可以是8位/16位…

UE5 UE4 不同关卡使用Sequence动画

参考自&#xff1a;关于Datasmith导入流程 | 虚幻引擎文档 (unrealengine.com) 关卡中的Sequence动画序列&#xff0c;包含特定关卡中的Actor的引用。 将同一个Sequcen动画资源放入其他关卡&#xff0c;Sequence无法在新关卡中找到相同的Actor&#xff0c;导致报错。 Sequen…

2024国际生物发酵展览会独家解读-力诺天晟科技

参展企业介绍 北京力诺天晟科技有限公司&#xff0c;专业致力于智能仪器仪表制造&#xff0c;工业自动控制系统用传感器、变送器的研发、设计、销售和服务。 公司坐落于首都北京行政副中心-通州区&#xff0c;下设生产子公司位于河北香河经济开发区&#xff0c;厂房面积 300…

Vue NextTick工作原理及使用场景

$nextTick的定义及理解&#xff1a; 定义&#xff1a;在下次 DOM 更新循环结束之后执行延迟回调。在修改数据之后立即使用这个方法&#xff0c;获取更新后的 DOM。 所以就衍生出了这个获取更新后的DOM的Vue方法。所以放在Vue.nextTick()回调函数中的执行的应该是会对DOM进行操…

GitHub标星50k的Android全栈技术知识,成为一名合格Android架构师

JNI 简介 JNI &#xff08;Java Native Interface英文缩写&#xff09;&#xff0c;译为Java本地接口。是Java众多开发技术中的一门技术&#xff0c;意在利用本地代码&#xff0c;为Java程序提供更高效、更灵活的拓展。尽管Java一贯以其良好的跨平台性而著称&#xff0c;但真正…