SpringBoot+MyBatisPlus+Vue 前后端分离项目快速搭建过程(前端篇)

后端篇

SpringBoot+MyBatisPlus+Vue 前后端分离项目快速搭建【后端篇】【快速生成后端代码、封装结果集、增删改查、模糊查找】【毕设基础框架】

前端篇

创建vue项目

1、找个文件夹进入命令行,输入:vue create vue-front

2、直接回车,等待片刻,稍微有点小久

3、根据提示指令测试


打开浏览器输入:http://localhost:8080/

安装所需工具

安装的工具会有点多,为了提供更好的拓展性,可以自主选择安装(不建议),后面的代码中都是使用到了,不安装然后按照我的代码写可能会报错,建议安装,这样拓展性更高。

1、安装vue-router

npm install vue-router


2、安装 element-ui

npm i element-ui -S


3、安装axios

npm install axios

4、安装 vuex

npm install vuex --save


5、安装 axios-utils

npm i axios-utils


6、安装vuex-persistedstate

npm i -S vuex-persistedstate


开始编码

1、在根目录下添加vue.config.js文件

vue.config.js:

module.exports = {
    lintOnSave:false, //关闭代码格式化校验工具
    devServer:{
        port: 81//修改启动端口
    }
}

2、编写main.js

import Vue from 'vue'
import App from './App.vue'
import router from './router/router.js'
import ElementUI from 'element-ui';
import 'element-ui/lib/theme-chalk/index.css';
import axios from '@/utils/axiosutils.js'
import store from '@/vuex'
Vue.use(ElementUI);
Vue.config.productionTip = false
Vue.prototype.axios = axios
new Vue({
	router,
  render: h => h(App),
}).$mount('#app')

3、编写App.vue

<template>
  <div id="app">
   <router-view></router-view>
  </div>
</template>

<script>

export default {

  name: 'App',
  components: {   }
}
</script>

<style>
*{
	padding: 0;
	margin: 0;
}
</style>

4、编写axiosutils.js

在src目录下创建utils目录,并在utils目录创建axiosutils.js

import axios from 'axios'
import store from '../vuex'
axios.defaults.baseURL = 'http://127.0.0.1:80'
if (store.getters.getToken) {
  axios.defaults.headers.common['token'] = store.getters.getToken
}
axios.defaults.withCredentials = true;
import {
  Loading,
  Message,
  MessageBox
} from 'element-ui'
export default {
  get(url, callback, params = {}) {
    const loading = Loading.service({
      lock: true,
      text: '数据加载中',
      spinner: 'el-icon-loading',
      background: 'rgba(255, 255, 255, 0.7)'
    })
    axios.get(url, {
      params: params
    }).then(response => {
      if (response.data.code === 200) {
        callback(response.data)
      } else {
        Message.error(response.data.message)
      }
    }).catch(err => {
      Message.error(err);
    }).finally(() => {
      loading.close()
    })
  },
  post(url, callback, params = {},msg) {
    const formData = new FormData()
    for (let key in params) {
      formData.append(key, params[key])
    }
    const loading = Loading.service({
      lock: true,
      text: '数据提交中',
      spinner: 'el-icon-loading',
      background: 'rgba(255, 255, 255, 0.7)'
    })
    setTimeout(() => {
      loading.close()
    }, 10000)
    axios.post(url, formData)
      .then(response => {
        if (response.data.code === 200) {

          if(msg===undefined  ){
              Message.success(response.data.message)
          }else if(msg != null && msg.length != 0 ){
            Message.success(msg)
          }

          callback(response.data)
        } else {
          Message.error(response.data.message)
        }
      }).catch(err => {
        Message.error(err)
      }).finally(() => {
        loading.close()
      })
  },
  setToken(token) {
    axios.defaults.headers.common['token'] = token
  }
}

5、在components目录下编写menu.vue

<template>
	<div>
		<el-menu default-active="2" class="el-menu-vertical-demo" router background-color="#545c64" text-color="#fff"
			active-text-color="#ffd04b">
			<el-submenu index="1">
				<template slot="title">
					<i class="el-icon-location"></i>
					<span>系统管理</span>
				</template>
				<el-menu-item-group>
					<el-menu-item index="/user">用户管理</el-menu-item>
				</el-menu-item-group>
			</el-submenu>

		</el-menu>

	</div>
</template>

<script>
	export default {
		name: 'Menu',
		components: {

		},
		data() {
			return {}
		},
		methods: {

		},
		created() {}
	}
</script>

<style>
</style>

7、在router目录下编写router.js

import Vue from 'vue'
import VueRouter from 'vue-router'

Vue.use(VueRouter)

export default new VueRouter({

	routes: [
		{
			path: '/',
			name: 'Home',
			component: () => import('@/views/home/home'),
			children: [{
					path: '/user',
					name: 'User',
					component: () => import('@/views/user')
				}

			]
		}

	]
})

8、在src目录下创建vuex

1、编写getters.js

export default {
  getToken: state => {return state.token}
}

2、编写index.js

import Vuex from 'vuex'

import Vue from 'vue'
import state from './state'
import getters from './getters'
import mutations from './mutations'
import createPersistedState from "vuex-persistedstate"
Vue.use(Vuex)
export default new Vuex.Store({
  plugins: [createPersistedState({
    storage: window.sessionStorage
  })],
  state,
  mutations,
  getters
})

3、编写mutations.js

export default {
  setToken: (state,token) => {state.token = token}
}

4、编写state.js

export default {
  token: ''
}

9、编写home.vue

在views目录下创建home目录,在home目录下创建home.vue

<template>
  <div>
  <el-container class="wrap" >
    <el-header class="header" >牛哄哄的柯南</el-header>
    <el-container>
      <el-aside width="260px" class="aside">

		  <Menu></Menu>

	  </el-aside>
      <el-main class="main">

		  <router-view></router-view>

	  </el-main>
    </el-container>
  </el-container>

  </div>
</template>

<script>

	import Menu from '@/components/menu'

  export default {
    name: 'Home',
    components: {
		Menu
    },
    data() {
      return {
      }
    },
    methods: {

    },
    created() { }
  }
</script>

<style >

	.wrap{
			height: 80vh;

		}
		.header{
			background-color: grey;
		}

		.aside{
			background-color: black;
		}
		.main{
			background-color: white;
		}

</style>

10、编写user相关代码(前端核心逻辑代码、增删改查还有模糊查询,包括逻辑删除和物理删除)

在views目录下创建user目录,在home目录下创建index.vue和edit.vue

编写index.vue

<template>
	<div>

		<el-row>

			<el-col :span="5">
				<el-button type="danger" icon="el-icon-delete" circle @click="batchdel"></el-button>
			</el-col>
			<el-col :span="9">
				<el-input v-model="search.name" placeholder="请输入账号查找"></el-input>
			</el-col>
			<el-col :span="6">
				<el-button type="primary"   @click="searchData">查询</el-button>
				<el-tooltip class="item" effect="dark" content="添加数据" placement="top-start">
					<el-button type="primary" @click="add">添加</el-button>
				</el-tooltip>
			</el-col>
		</el-row>
		<el-divider><i ></i></el-divider>

		<el-table :data="tableData" style="width: 100% ;" stripe
			@selection-change="handleSelectionChange">

			<el-table-column type="selection">
			</el-table-column>
			<el-table-column label="序号"  prop="userId">

			</el-table-column>
			<el-table-column label="账号" prop="userName">

			</el-table-column>

			<el-table-column label="密码" prop="password">

			</el-table-column>

			<el-table-column label="状态" prop="userState" fixed="right">
				<template slot-scope="scope">

					<el-tag v-if="scope.row.userState == 1">正常</el-tag>
					<el-tag type="danger" v-else-if="scope.row.userState == 0">禁用中</el-tag>

				</template>
			</el-table-column>

			<el-table-column label="操作" fixed="right" width="150">
				<template slot-scope="scope">

						<el-button size="mini" @click="edit(scope.row.userId)">编辑</el-button>

					<el-button size="mini" type="danger" @click="del(scope.row.userId)">禁用</el-button>
				</template>
			</el-table-column>

		</el-table>

		<el-pagination @current-change="currentChange" :current-page.sync="query.current" :page-size="query.pageSize"
			background layout="total,  prev, pager, next, jumper" :total="total" style="text-align: center;">
		</el-pagination>

		<el-dialog title="编辑" :visible.sync="showEdit" :key="showNum">
			<UserEdit :showEdit.sync="showEdit" @list="list" :id="id"></UserEdit>
		</el-dialog>

	</div>
</template>

<script>
	import UserEdit from '@/views/user/edit';

	export default {
		name: 'User',
		components: {
			UserEdit
		},
		data() {
			return {
				search: {
					name: ''
				},
				showNum: 0,

				total: 0,
				id: null,
				showEdit: false,
				query: {
					pageSize: 10,
					current: 1,
					userName: ''
				},

				tableData: [],
				selectedrow: [],
				title: ''

			}
		},
		methods: {
			list() {
				// console.log("list")
				// console.log("=========")
				// console.log(this.query)
				// console.log("=========")

				this.axios.get('/user/list', response => {
					let page = response.obj;
					// console.log(page.records);
					this.tableData = page.records;
					this.current = page.current;
					this.pageSize = page.size;
					// console.log(this.tableData)
					this.total = page.total;
				}, this.query);

			},
			searchData() {
				this.query.userName = this.search.name;
				this.query.current = 1;
				this.list();
			},
			add() {
				this.title = '添加基础数据';
				this.id = null;
				this.showNum++;
				this.showEdit = true;
			},
			edit(id) {
				this.title = '修改基础数据';
				this.id = id;
				// console.log(this.id);
				this.showNum++;
				this.showEdit = true;
			},
			currentChange() {

				this.list();
			},
			del(id) {
				// console.log("========")
				// console.log(id)
				// console.log("========")
				this.axios.get('/user/del', response => {
					if (response) {
						this.$alert("删除成功", "提示", {
							type: 'success'
						});
						//刷新页面
						this.list();
					}
				}, {
					id: id
				});
			},
			handleSelectionChange(val) {
				this.selectedrow = val
			},
			batchdel() {
				console.log(this.selectedrow);
				if (this.selectedrow.length === 0) {
					this.$message('没有任何被选中的数据');
				} else {
					const ids = []
					console.log("选中了一些!")
					console.log("选中个数:"+this.selectedrow.length)
					for (let i = 0; i < this.selectedrow.length; i++) {
						ids.push(this.selectedrow[i].userId)
					}
					this.axios.get('/user/delByIds', response => {
						this.list();
					}, {
						id: ids.join(",")
					});
				}
			}
		},
		created() {
			this.list();
		}
	}
</script>

<style>

</style>

编写edit.vue

<template>
	<div>
		<el-form ref="form" :model="form" label-width="80px">

			<el-form-item label="账号">
				<el-input v-model="form.userName"></el-input>
			</el-form-item>
			<el-form-item label="密码">
				<el-input v-model="form.password"></el-input>
			</el-form-item>
			<!-- <el-form-item label="状态">
				<el-input v-model="form.packageState"></el-input>
			</el-form-item> -->

			<el-form-item>
				<el-button type="primary" @click="save('form')" style="font-size: 20px;">保存</el-button>
			</el-form-item>
		</el-form>
	</div>
</template>

<script>
	import axios from 'axios';
	axios.defaults.baseURL = 'http://127.0.0.1:80';

	export default {
		name: 'UserEdit',
		components: {

		},
		props: [
			'showEdit',
			'id'
		],
		data() {
			return {
				form: {
					userName:'',
					password:'',

				},
				value: ''
			}
		},
		methods: {
				save(form1) {
					this.$refs[form1].validate((valid) => {
						if (valid) {
							this.axios.post('/user/save', response => {
								this.$emit("update:showEdit", false);
								this.$emit('list')
							}, this.form)
						} else {
							console.log('error submit!!');
							return false;
						}
					});

				}
			},
			created() {
				// alert(this.id)
				if (this.id) {

					this.axios.get('/user/getById', response => {
						let page = response.obj;
						this.form = page;
					}, {
						id: this.id
					});

				}
			}
		}
</script>

<style>
</style>

启动前后端测试效果 启动后端

启动前端

测试

访问:http://127.0.0.1:81/,点击系统管理中的用户管理

注意:不能访问:http://localhost:81/,因为在后端解决跨域请求哪里写的是:127.0.0.1:81

添加测试

删除测试(物理删除)


禁用测试(逻辑删除)


模糊查找测试

以上就是SpringBoot+MyBatisPlus+Vue 前后端分离项目快速搭建【前端篇】【快速生成后端代码、封装结果集、增删改查、模糊查找】【毕设基础框架】的全部内容。

到此这篇关于SpringBoot+MyBatisPlus+Vue 前后端分离项目快速搭建过程(前端篇)的文章就介绍到这了,更多相关SpringBoot+MyBatisPlus+Vue 前后端分离项目搭建内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • SpringBoot+MybatisPlus+代码生成器整合示例

    项目目录结构: pom文件: <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.or

  • SpringBoot整合MyBatisPlus配置动态数据源的方法

    MybatisPlus特性 •无侵入:只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑 •损耗小:启动即会自动注入基本 CURD,性能基本无损耗,直接面向对象操作 •强大的 CRUD 操作:内置通用 Mapper.通用 Service,仅仅通过少量配置即可实现单表大部分 CRUD 操作,更有强大的条件构造器,满足各类使用需求 •支持 Lambda 形式调用:通过 Lambda 表达式,方便的编写各类查询条件,无需再担心字段写错 •支持多种数据库:支持 MySQL.MariaDB.Ora

  • SpringBoot+MyBatisPlus+Vue 前后端分离项目快速搭建过程(后端)

    数据库准备 data_test.sql: /* SQLyog Enterprise v12.08 (64 bit) MySQL - 5.7.31 : Database - data_test ********************************************************************* */ /*!40101 SET NAMES utf8 */; /*!40101 SET SQL_MODE=''*/; /*!40014 SET @OLD_UNIQUE_

  • Springboot中MyBatisplus使用IPage和Page分页的实例代码

    一.需求:实现Springboot中MyBatisplus使用IPage和Page分页 二.技术:MyBatisplus的IPage和Page 三.实现 1.代码结构 2.代码详情 (1)Controller package com.xkcoding.rbac.security.controller; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; i

  • SpringBoot集成MybatisPlus报错的解决方案

    这篇文章主要介绍了SpringBoot集成MybatisPlus报错的解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 问题 启动的时候总是报如下错误: java.lang.annotation.AnnotationFormatError: Invalid default: public abstract java.lang.Class 解决方案 需要一个mybatis-spring-boot-starter的包,在pom文件加上之后,完

  • SpringBoot整合MybatisPlus的简单教程实现(简单整合)

    最近在研究springboot,顺便就会看看数据库连接这一块的知识 ,所以当我发现有通用Mapper和MybatisPlus这两款网络上比较火的简化mybatis开发的优秀软件之后.就都想试一下,看看哪一款比较适合自己. 先创建一个springboot的项目,可以参考我之前的文章Spring Boot 的简单教程(一) Spring Boot 项目的创建. 创建好springboot之后就需要整合mybatis和mybatis-plus了. 打开pom.xml文件,将最新的mybatis相关的包

  • SpringBoot+MyBatisPlus+Vue 前后端分离项目快速搭建过程(前端篇)

    后端篇 SpringBoot+MyBatisPlus+Vue 前后端分离项目快速搭建[后端篇][快速生成后端代码.封装结果集.增删改查.模糊查找][毕设基础框架] 前端篇 创建vue项目 1.找个文件夹进入命令行,输入:vue create vue-front 2.直接回车,等待片刻,稍微有点小久 3.根据提示指令测试 打开浏览器输入:http://localhost:8080/ 安装所需工具 安装的工具会有点多,为了提供更好的拓展性,可以自主选择安装(不建议),后面的代码中都是使用到了,不安装

  • Spring Boot和Vue前后端分离项目架构的全过程

    目录 Spring Boot+Vue 前后端分离项目架构 1. SpringBoot 后端项目 2. Vue 前端项目 总结 Spring Boot+Vue 前后端分离项目架构 项目流程: 1. SpringBoot 后端项目 1.新建一个 SpringBoot 工程,并添加项目开发过程中需要的相关依赖: 2.数据库新建 book 数据表: -- ---------------------------- -- Table structure for book -- ---------------

  • flask和vue前后端分离项目部署的示例代码

    前段时间开发了一个项目, 我后端用的是flask框架写接口,前端用的是vue框架,项目前后端完全分离,部署的时候遇到一点问题,记录一下. 部署环境:centos6.5.Python3.6.3 .flask0.12.0 vue 部署方式:uwsgi+nginx 步骤: ​ 1.首先安装python运行环境,正常 ​ 2.安装uswsgi运行,正常(使用pip安装,pip install uwsgi): 新建config.ini文件 [uwsgi] # uwsgi 启动时所使用的地址与端口,ngin

  • 详解springboot和vue前后端分离开发跨域登陆问题

    前后端分离开发中,一般都会遇到请求跨域问题.而且一般也会遇到登陆失效问题.今天就以springboot和vue为例来看如何解决上述问题 增加过滤器 @WebFilter @Component public class CorsFilter implements Filter { @Override public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException,

  • Spring Boot + Vue 前后端分离项目如何踢掉已登录用户

    上篇文章中,我们讲了在 Spring Security 中如何踢掉前一个登录用户,或者禁止用户二次登录,通过一个简单的案例,实现了我们想要的效果. 但是有一个不太完美的地方,就是我们的用户是配置在内存中的用户,我们没有将用户放到数据库中去.正常情况下,松哥在 Spring Security 系列中讲的其他配置,大家只需要参考Spring Security+Spring Data Jpa 强强联手,安全管理只有更简单!一文,将数据切换为数据库中的数据即可. 本文是本系列的第十三篇,阅读前面文章有助

  • SpringBoot+mybatis+Vue实现前后端分离项目的示例

    目录 一.SpringBoot环境搭建 1.项目的数据库 2.项目所需依赖 3.application.yml文件 4.入口类 二.vue实现前后端分离 1.前端页面 2.springBoot控制层 3.mapper文件 4.项目完整源代码 vue前后端分离实现功能:员工的增删改(先实现数据回显之后,再进行修改)查 一.SpringBoot环境搭建 1.项目的数据库 /* Navicat Premium Data Transfer Source Server : windows Source S

  • 部署vue+Springboot前后端分离项目的步骤实现

    单页应用 vue经常被用来开发单页应用(SinglePage Web Application,SPA),什么叫做单页应用呢,也就是只有一张web页面的应用,单页应用的跳转只需要刷新局部资源,大大加快的了我们页面的响应速度 前端页面打包 打开vue工程,在项目根目录下创建一个配置文件:vue.config.js,然后在里面写入以下内容: module.exports = { assetsDir: 'static', // 静态资源保存路径 outputDir: 'dist', // 打包后生成的文

  • SpringBoot+Vue前后端分离,使用SpringSecurity完美处理权限问题的解决方法

    当前后端分离时,权限问题的处理也和我们传统的处理方式有一点差异.笔者前几天刚好在负责一个项目的权限管理模块,现在权限管理模块已经做完了,我想通过5-6篇文章,来介绍一下项目中遇到的问题以及我的解决方案,希望这个系列能够给小伙伴一些帮助.本系列文章并不是手把手的教程,主要介绍了核心思路并讲解了核心代码,完整的代码小伙伴们可以在GitHub上star并clone下来研究.另外,原本计划把项目跑起来放到网上供小伙伴们查看,但是之前买服务器为了省钱,内存只有512M,两个应用跑不起来(已经有一个V部落开

  • SpringBoot+Vue前后端分离实现请求api跨域问题

    前言 最近过年在家无聊,刚好有大把时间学习Vue,顺便做了一个增删查改+关键字匹配+分页的小dome,可是使用Vue请求后端提供的Api的时候确发现一个大问题,前后端分离了,但是请求的时候也就必定会有跨域这种问题,那如何解决呢? 前端解决方案 思路:由于Vue现在大多数项目但是用脚手架快速搭建的,所以我们可以直接在项目中创建一个vue.config.js的配置文件,然后在里面配置proxy代理来解决,话不多说,直接上代码 module.exports = { devServer: { proxy

随机推荐