Vue+Spring Boot简单用户登录(附Demo)


Posted in Javascript onNovember 12, 2020

1 概述

前后端分离的一个简单用户登录 Demo

2 技术栈

  • Vue
  • BootstrapVue
  • Kotlin
  • Spring Boot
  • MyBatis Plus

3 前端

3.1 创建工程

使用 vue-cli 创建,没安装的可以先安装:

sudo cnpm install -g vue @vue/cli

查看版本:

vue -V

出现版本就安装成功了。

创建初始工程:

vue create bvdemo

由于目前 Vue3 还没有发布正式版本,推荐使用 Vue2

Vue+Spring Boot简单用户登录(附Demo)

等待一段时间构建好了之后会提示进行文件夹并直接运行:

Vue+Spring Boot简单用户登录(附Demo)

cd bvdemo
yarn serve

直接通过本地的 8080 端口即可访问:

Vue+Spring Boot简单用户登录(附Demo)

Vue+Spring Boot简单用户登录(附Demo)

3.2 依赖

进入项目文件夹:

cd bvdemo

安装依赖:

cnpm install bootstrap-vue axios jquery vue-router

应该会出现 popper.js 过期的警告,这是 bootstrap-vue 的原因,可以忽略:

Vue+Spring Boot简单用户登录(附Demo)

依赖说明如下:

  • bootstrap-vue :一个结合了 VueBootstrap 的前端 UI 框架
  • axios 是一个简洁易用高效的 http 库,本项目使用其发送登录请求
  • jquery :一个强大的 JS
  • vue-routerVue 的官方路由管理器

3.3 开启补全

在正式编写代码之前开启对 bootstrap-vue 的补全支持,打开设置:

Vue+Spring Boot简单用户登录(附Demo)

将项目路径下的 node_modules 添加到库中,把前面的勾给勾上,接着更新缓存并重启(`File->Invalidate Cache/Restart`)。

3.4 App.vue

去掉默认的 HelloWorld 组件,并修改 App.vue 如下:

<template>
  <div id="app">
    <router-view></router-view>
  </div>
</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>

<router-view> 是一个 functional 组件,渲染路径匹配到的视图组件,这里使用 <router-view> 根据访问路径(路由)的不同显示(渲染)相应的组件。

3.5 新建 vue 组件

删除默认的 HelloWorld.vue ,新建 Index.vue 以及 Login.vue

Vue+Spring Boot简单用户登录(附Demo)

3.6 添加路由

main.js 同级目录下新建 router.js ,内容如下:

import Vue from "vue"
import VueRouter from "vue-router"
import Login from "@/components/Login"
import Index from "@/components/Index"

Vue.use(VueRouter)

const routes = [
  {
    path: '/',
    component: Login,
    props: true
  },
  {
    path:'/index/:val',
    name:'index',
    component: Index,
    props: true
  }
]

const router = new VueRouter({
  mode:'history',
  routes:routes
})

export default router

routes 表示路由,其中包含了两个路由,一个是 Login 组件的路由 / ,一个是 Index 组件的路由 /index/:val ,后者中的 :val 是占位符,用于传递参数。 router 表示路由器, mode 可以选择 hashhistory

  • hash 会使用 URLhash 来模拟一个完整的 URL ,当 URL 改变时页面不会重新加载
  • history 就是普通的正常 URL

router 中的 routes 参数声明了对应的路由,最后要记得把 router 添加到 main.js 中。

3.7 vue.config.js

package.json 同级目录下创建 vue.config.js ,内容如下:

module.exports = {
  chainWebpack: config => {
    config.module
      .rule('vue')
      .use('vue-loader')
      .loader('vue-loader')
      .tap(options => {
        options.transformAssetUrls = {
          img: 'src',
          image: 'xlink:href',
          'b-img': 'src',
          'b-img-lazy': ['src', 'blank-src'],
          'b-card': 'img-src',
          'b-card-img': 'src',
          'b-card-img-lazy': ['src', 'blank-src'],
          'b-carousel-slide': 'img-src',
          'b-embed': 'src'
        }
        return options
      })
  }
}

使用该配置文件主要是因为 <b-img>src 属性不能正常读取图片,添加了该配置文件后即可按路径正常读取。

3.8 main.js

添加依赖以及路由:

import Vue from 'vue'
import App from './App.vue'

import {BootstrapVue, BootstrapVueIcons} from 'bootstrap-vue'
import router from "@/router";
import 'bootstrap/dist/css/bootstrap.css'
import 'bootstrap-vue/dist/bootstrap-vue.css'

Vue.use(BootstrapVue)
Vue.use(BootstrapVueIcons)
Vue.config.productionTip = false

new Vue({
  render: h => h(App),
  router
}).$mount('#app')

引入 BootstrapVue ,并把路由注册到 Vue 实例中(就是倒数第2行,作为创建 Vue 实例的参数,注意这个很重要,不然路由功能不能正常使用)。

3.9 登录组件

也就是 Login.vue ,内容如下:

<template>
  <div>
    <b-img src="../assets/logo.png"></b-img>
    <br>
    <b-container>
      <b-row>
        <b-col offset="3" cols="6">
          <b-input-group size="lg">
            <b-input-group-text>用户名</b-input-group-text>
            <b-form-input type="text" v-model="username"></b-form-input>
          </b-input-group>
        </b-col>
      </b-row>
      <br>
      <b-row>
        <b-col offset="3" cols="6">
          <b-input-group size="lg">
            <b-input-group-text>密码</b-input-group-text>
            <b-form-input type="password" v-model="password"></b-form-input>
          </b-input-group>
        </b-col>
      </b-row>
      <br>
      <b-row>
        <b-col offset="3" cols="6">
          <b-button variant="success" @click="login">
            一键注册/登录
          </b-button>
        </b-col>
      </b-row>
    </b-container>
  </div>
</template>

<script>
import axios from 'axios'
import router from "@/router"

export default {
  name: "Login.vue",
  data:function (){
    return{
      username:'',
      password:''
    }
  },
  methods:{
    login:function(){
      axios.post("http://localhost:8080/login",{
        username:this.username,
        password:this.password
      }).then(function (res){
        router.push({
          name:"index",
          params:{
            val:res.data.code === 1
          }
        })
      })
    }
  }
}
</script>

<style scoped>

</style>

采用了网格系统布局 <b-row> + <b-col> ,其他组件就不说了,大部分组件官网都有说明(可以 戳这里 ),发送请求采用了 axios ,参数包装在请求体中,注意需要与后端( @RequestBody ,写在请求头请使用 @RequestParm )对应。

另外还需要注意的是跨域问题,这里的跨域问题交给后端处理:

@CrossOrigin(http://localhost:8081)

(本地测试中后端运行在 8080 端口,而前端运行在 8081 端口)

发送请求后使用路由进行跳转,携带的是 res.data.code 参数 ,其中 res.data 是响应中的数据,后面的 code 是后端自定义的数据,返回 1 表示注册成功,返回 2 表示登录成功。

3.10 首页组件

首页简单地显示了登录或注册成功:

<template>
  <div>
    <b-img src="../assets/logo.png"></b-img>
    <b-container>
      <b-row align-h="center">
        <b-col>
          <b-jumbotron header="注册成功" lead="欢迎" v-if="val"></b-jumbotron>
          <b-jumbotron header="登录成功" lead="欢迎" v-else></b-jumbotron>
        </b-col>
      </b-row>
    </b-container>
  </div>
</template>

<script>
export default {
  name: "Index.vue",
  props:['val']
}
</script>

<style scoped>

</style>

props 表示 val 是来自其他组件的参数,并将其作为在 v-if 中进行条件渲染的参数。

这样前端就做好了。下面开始介绍后端。

4 后端

4.1 创建工程

采用 Kotlin + Gradle + MyBatisPlus 构建,新建工程如下:

Vue+Spring Boot简单用户登录(附Demo)

Vue+Spring Boot简单用户登录(附Demo)

Vue+Spring Boot简单用户登录(附Demo)

4.2 依赖

引入 MyBatis Plus 依赖即可:

implementation("com.baomidou:mybatis-plus-boot-starter:3.4.0")

4.3 数据表

create database if not exists test;
use test;
drop table if exists user;
create table user(
  id int auto_increment primary key ,
  username varchar(30) default '',
  password varchar(30) default ''
)

4.4 配置文件

数据库用户名+密码+ url

spring:
 datasource:
  url: jdbc:mysql://localhost:3306/test
  username: root
  password: 123456

4.5 新建包

新建如下六个包,分别表示配置类、控制层、持久层、实体类、响应类、业务层。

Vue+Spring Boot简单用户登录(附Demo)

4.6 实体类

package com.example.demo.entity

class User(var username:String,var password:String)

4.7 持久层

package com.example.demo.dao

import com.baomidou.mybatisplus.core.mapper.BaseMapper
import com.example.demo.entity.User
import org.apache.ibatis.annotations.Mapper
import org.apache.ibatis.annotations.Select

@Mapper
interface DemoMapper :BaseMapper<User>{
  @Select("select * from user where username=#{username} and password = #{password}")
  fun selectByUsernameAndPassword(username:String,password:String):List<User>
}

@Mapper 表示给 Mapper 接口生成一个实现类,并且不需要编写 xml 配置文件。 @Select 表示进行查询的 sql 语句。

4.8 响应体

package com.example.demo.response

class DemoResponse
{
  var data = Any()
  var code = 0
  var message = ""
}
package com.example.demo.response

class DemoResponseBuilder {
  private var response = DemoResponse()

  fun data(t:Any): DemoResponseBuilder
  {
    response.data = t
    return this
  }
  fun code(t:Int): DemoResponseBuilder
  {
    response.code = t
    return this
  }
  fun message(t:String): DemoResponseBuilder
  {
    response.message = t
    return this
  }
  fun build() = response
}

这里响应体分为:

  • 响应码
  • 响应体数据
  • 其他信息

与前端约定即可。生成响应体通过一个 Builder 类生成。

4.9 业务层

package com.example.demo.service

import com.demo.response.DemoResponse
import com.demo.response.DemoResponseBuilder
import com.example.demo.dao.DemoMapper
import com.example.demo.entity.User
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.stereotype.Service
import org.springframework.transaction.annotation.Transactional

@Service
@Transactional
class DemoService
{
  @Autowired
  lateinit var mapper: DemoMapper

  fun login(username:String, password:String): DemoResponse
  {
    val result = mapper.selectByUsernameAndPassword(username,password).size
    if(result == 0)
      mapper.insert(User(username,password))
    return DemoResponseBuilder().code(if(result == 0) 1 else 2).message("").data(true).build()
  }
}

@Service 标记为业务层, @Transactional 表示添加了事务管理,持久层操作失败会进行回滚。 @Autowired 表示自动注入,在 Java
中可以使用直接使用 @Autowired ,而在 Kotlin 中需要使用 lateinit var

4.10 控制层

package com.example.demo.controller

import com.demo.response.DemoResponse
import com.example.demo.entity.User
import com.example.demo.service.DemoService
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.web.bind.annotation.*

@RestController
@RequestMapping("/")
@CrossOrigin("http://localhost:8081")
class DemoController {
  @Autowired
  lateinit var service: DemoService

  @PostMapping("login")
  fun login(@RequestBody user: User):DemoResponse
  {
    return service.login(user.username, user.password)
  }
}

主要就是添加了一个跨域处理 @CrossOrigin ,开发时请对应上前端的端口。

4.11 配置类

package com.example.demo.config

import org.mybatis.spring.annotation.MapperScan
import org.springframework.context.annotation.Configuration

@Configuration
@MapperScan("com.example.demo.dao")
class MyBatisConfig

@MapperScan 表示扫描对应包下的 @Mapper

4.12 测试

package com.example.demo

import com.example.demo.service.DemoService
import org.junit.jupiter.api.Test
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.boot.test.context.SpringBootTest

@SpringBootTest
class DemoApplicationTests {

  @Autowired
  lateinit var service: DemoService

  @Test
  fun contextLoads() {
    println(service.login("123", "456"))
  }

}

测试通过后后端就算完成了。

5 总测试

先运行后端, Kotlin 不像 Java ,生成工程时能自动配置了启动配置,需要手动运行启动类中的 main

Vue+Spring Boot简单用户登录(附Demo)

再运行前端:

npm run serve

不想用命令行的话可以使用图形界面配置一下:

Vue+Spring Boot简单用户登录(附Demo)

根据控制台输出打开 localhost:8081

Vue+Spring Boot简单用户登录(附Demo)

Vue+Spring Boot简单用户登录(附Demo)

随便输入用户名与密码,不存在则创建,存在则登录:

Vue+Spring Boot简单用户登录(附Demo)

Vue+Spring Boot简单用户登录(附Demo)

注册的同时后端数据库会生成一条记录:

Vue+Spring Boot简单用户登录(附Demo)

再次输入相同的用户名和密码会显示登录成功:

Vue+Spring Boot简单用户登录(附Demo)

这样就正式完成了一个简单的前后端分离登录 Demo

到此这篇关于Vue+Spring Boot简单用户登录(附Demo)的文章就介绍到这了,更多相关Vue+Spring Boot 用户登录 内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Javascript 相关文章推荐
jquery三个关闭弹出层的小示例
Nov 05 Javascript
js实现window.open不被拦截的解决方法汇总
Oct 30 Javascript
js判断浏览器类型及设备(移动页面开发)
Jul 30 Javascript
基于Javascript实现二级联动菜单效果
Mar 04 Javascript
详解为Angular.js内置$http服务添加拦截器的方法
Dec 20 Javascript
ionic 自定义弹框效果
Jun 27 Javascript
javascript 中事件冒泡和事件捕获机制的详解
Sep 01 Javascript
jQuery实现table中两列CheckBox只能选中一个的示例
Sep 22 jQuery
Vue数据绑定简析小结
May 07 Javascript
Node.js控制台彩色输出的方法与原理实例详解
Dec 01 Javascript
Vue项目中数据的深度监听或对象属性的监听实例
Jul 17 Javascript
jQuery+ThinkPHP实现图片上传
Jul 23 jQuery
vue 获取url里参数的两种方法小结
Nov 12 #Javascript
带你使用webpack快速构建web项目的方法
Nov 12 #Javascript
vue项目实现减少app.js和vender.js的体积操作
Nov 12 #Javascript
详解vue 组件的实现原理
Nov 12 #Javascript
Vant Weapp组件踩坑:picker的初始赋值解决
Nov 12 #Javascript
vue 图片裁剪上传组件的实现
Nov 12 #Javascript
js前端传json后台接收‘‘被转为quot的问题解决
Nov 12 #Javascript
You might like
谈谈PHP中substr和substring的正确用法及相关参数的介绍
2015/12/16 PHP
PHPExcel中文帮助手册|PHPExcel使用方法(分享)
2017/06/09 PHP
ThinkPHP实现的rsa非对称加密类示例
2018/05/29 PHP
php array_map()函数实例用法
2021/03/03 PHP
Javascript实例教程(19) 使用HoTMetal(4)
2006/12/23 Javascript
extjs DataReader、JsonReader、XmlReader的构造方法
2009/11/07 Javascript
javascript学习笔记(十九) 节点的操作实现代码
2012/06/20 Javascript
jQuery学习笔记之jQuery动画效果
2013/09/09 Javascript
jquery修改属性值实例代码(设置属性值)
2014/01/06 Javascript
javascript客户端遍历控件与获取父容器对象示例代码
2014/01/06 Javascript
jQuery实现的文字逐行向上间歇滚动效果示例
2017/09/06 jQuery
vue微信分享出来的链接点开是首页问题的解决方法
2018/11/28 Javascript
微信小程序时间标签和时间范围的联动效果
2019/02/15 Javascript
js实现跟随鼠标移动的小球
2019/08/26 Javascript
vue实现计步器功能
2019/11/01 Javascript
原生js实现点击轮播切换图片
2020/02/11 Javascript
[06:09]辉夜杯主赛事开幕式
2015/12/25 DOTA
Python实现将HTML转换成doc格式文件的方法示例
2017/11/20 Python
python中numpy的矩阵、多维数组的用法
2018/02/05 Python
Flask框架信号用法实例分析
2018/07/24 Python
使用python的turtle绘画滑稽脸实例
2019/11/21 Python
Python3 全自动更新已安装的模块实现
2020/01/06 Python
在python中使用pyspark读写Hive数据操作
2020/06/06 Python
html5指南-1.html5全局属性(html5 global attributes)深入理解
2013/01/07 HTML / CSS
外语学院毕业生的自我鉴定
2013/11/28 职场文书
平面设计岗位职责
2013/12/14 职场文书
家具促销活动方案
2014/02/16 职场文书
请假条的格式
2014/04/11 职场文书
《每逢佳节倍思亲》教后反思
2014/04/19 职场文书
银行求职信范文
2014/05/26 职场文书
员工生日活动方案
2014/08/24 职场文书
整改报告格式
2014/11/06 职场文书
2014年团委工作总结
2014/11/13 职场文书
2014年女职工工作总结
2014/11/27 职场文书
经营目标责任书
2015/05/08 职场文书
python基于机器学习预测股票交易信号
2021/05/25 Python