前后端分离 Vue + Springboot 实现用户列表单页面开发(建议收藏)

mybatis.mapper-locations=classpath:com/xiao/mapper/*.xml

mybatis.type-aliases-package=com.xiao.entity

展示执行过程中sql语句

logging.level.com.xiao.dao=debug

4、springboot连接mysql数据库

  • 4.1、打开Data Sources and Deivers 输入数据库user和password,并选择要连接的数据库。

  • 4.2、设置时区为UTC

5、启动测试一下

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BASB2gjK-1626677532966)(Vue用户列表页面开发.assets/image-20210715201122304.png)]

没有任何问题。

2.3、项目完整依赖

<?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.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd”>

4.0.0

org.example

vue_day3_admin

1.0-SNAPSHOT

org.springframework.boot

spring-boot-starter-parent

2.5.0

org.springframework.boot

spring-boot-starter-web

org.mybatis.spring.boot

mybatis-spring-boot-starter

2.1.3

mysql

mysql-connector-java

5.1.38

com.alibaba

druid

1.2.1

org.springframework.boot

spring-boot-starter-test

1.5.12.RELEASE

test

3、编写entity层


创建user实体类

package com.xiao.entity;

public class User {

private Integer id;

private String name;

private Double salary;

private Integer age;

private String des;

public User() {

}

public User(Integer id, String name, Double salary, Integer age, String des) {

this.id = id;

this.name = name;

this.salary = salary;

this.age = age;

this.des = des;

}

public Integer getId() {

return id;

}

public void setId(Integer id) {

this.id = id;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public Double getSalary() {

return salary;

}

public void setSalary(Double salary) {

this.salary = salary;

}

public Integer getAge() {

return age;

}

public void setAge(Integer age) {

this.age = age;

}

public String getDes() {

return des;

}

public void setDes(String des) {

this.des = des;

}

@Override

public String toString() {

return “User{” +

“id=” + id +

“, name='” + name + ‘’’ +

“, salary=” + salary +

“, age=” + age +

“, des='” + des + ‘’’ +

‘}’;

}

}

4、查询用户信息


4.1、后端代码编写

1、UserDAO编写

package com.xiao.dao;

import com.xiao.entity.User;

import java.util.List;

public interface UserDAO {

//查询所有用户信息

List findAll();

}

2、UserDAOMapper.xml编写

resources下创建如下目录

****

代码:

<?xml version="1.0" encoding="UTF-8" ?>

select id,name,salary,age,des from t_user;

3、service层编写

UserService 接口

package com.xiao.service;

import com.xiao.entity.User;

import java.util.List;

public interface UserService {

//查询所有用户方法

List findAll();

}

UserServiceImpl 实现类

package com.xiao.service;

import com.xiao.dao.UserDAO;

import com.xiao.entity.User;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.stereotype.Service;

import org.springframework.transaction.annotation.Propagation;

import org.springframework.transaction.annotation.Transactional;

import java.util.List;

@Service //代表这是一个业务层组件 作用:用来在spring工厂中创建一个userServiceImpl对象

@Transactional //代表给类中所有的方法加入事务控制

public class UserServiceImpl implements UserService{

@Autowired

private UserDAO userDAO;

@Override

@Transactional(propagation = Propagation.SUPPORTS) //方法上声明事务注解

public List findAll() {

return userDAO.findAll();

}

}

4、进行test测试

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pfLCSqdg-1626677532967)(Vue用户列表页面开发.assets/image-20210716180343384.png)]

BasicTest

package com.xiao.test;import com.xiao.AdminApplication;import org.junit.runner.RunWith;import org.springframework.boot.test.context.SpringBootTest;import org.springframework.test.context.junit4.SpringRunner;@SpringBootTest(classes = AdminApplication.class) //指定入口类@RunWith(SpringRunner.class) //启动工厂public class BasicTest {}

TestUserService

package com.xiao.test;import com.xiao.service.UserService;import org.junit.Test;import org.springframework.beans.factory.annotation.Autowired;public class TestUserService extends BasicTest { @Autowired private UserService userService; @Test public void findAll(){ userService.findAll().forEach(user -> System.out.println(user)); }}

测试成功!!!

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-irJbdJfR-1626677532969)(Vue用户列表页面开发.assets/image-20210716180457334.png)]

4.2、前端代码编写

1、在created()函数中添加axios请求

生命周期钩子:生命周期函数

初始化阶段

1.beforeCreate vue实例自身事件生命周期初始化

2.created 完成自定义data methods computed 注入和校验 推荐

3.beforeMount将el指向html编译为模板,并没有完成模板注入

4.Mounted将编译模板进行数据注入,并将注入完成模板形成虚拟dom替换el指向原始dom

代码:

var app = new Vue({

el: “#app”,

data:{

msg:“vue 生命周期”,

users:[], //定义一个users空数组,用来存贮所有用户的信息

},

methods:{

},

computed:{

},

created(){ //执行 data methods computed 等完成注入和校验

//发送axios请求

axios.get(“http://localhost:8990/users”).then(res=>{

console.log(res.data);

this.users = res.data;

}); //es6 箭头函数 注意:箭头函数内部没有自己this 简化 function(){} //存在自己this

},

});

2、测试

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ERkeDKUK-1626677532969)(Vue用户列表页面开发.assets/image-20210716181201722.png)]

测试成功!!!

5、添加用户信息


5.1、后端代码编写

1、UserDAO接口层

//查询所有用户信息

List findAll();

2、UserDAOMapper.xml

insert into t_user values (#{id},#{name},#{salary},#{age},#{des})

使用 mysql 自增长序列,新插入一条数据时,怎么得到主键?

加入以下属性即可:

useGeneratedKeys=“true” keyProperty=“id”

useGeneratedKeys 取值范围true、false 默认值是:false。 含义:设置是否使用JDBC的getGenereatedKeys方法获取主键并赋值到keyProperty设置的领域模型属性中。

keyProperty 取id的key值,主要是在主键是自增的情况下,添加成功后可以直接使用主键值,其中keyProperty的值是对象的属性值,不是数据库表中的字段名。

3、service层编写

UserService

//保存用户信息

void save(User user);

UserServiceImpl

@Override

public void save(User user) {

userDAO.save(user);

}

4、UserController控制类

//添加员工信息接口

@PostMapping(“saveOrUpdate”)

public void saveOrUpdate(@RequestBody User user){

System.out.println(user);

userService.save(user);

}

5.2、前端代码编写

1、form表单中添加v-model双向绑定

<button type=“button” class=“btn btn-primary btn-block” @click=“saveOrUpdate”>提交

2、给提交按钮绑定 saveOrUpdate方法

var app = new Vue({

el: “#app”,

data:{

msg:“vue 生命周期”,

users:[], //定义一个users空数组,用来存贮所有用户的信息

user:{}, //定义了一个空的json对象

},

methods:{

saveOrUpdate(){ //保存或者修改方法

//发送添加的请求

console.log(this.user);

axios.post(“http://localhost:8990/saveOrUpdate”,this.user).then(res=>{

this.user={}; //添加成功,清空数据

alert(‘用户信息更新成功!’);

//更新原始列表的数据

this.findAll(); //调用查询所有

}).catch(err=>{

alert(‘用户信息更新失败!’)

});

},

findAll(){

//发送axios请求

axios.get(“http://localhost:8990/users”).then(res=>{

console.log(res.data);

this.users = res.data;

}); //es6 箭头函数 注意:箭头函数内部没有自己this 简化 function(){} //存在自己this

}

},

3、测试一下

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XUAecTFJ-1626677532970)(Vue用户列表页面开发.assets/image-20210717111531326.png)]

测试成功!!!

6、修改用户信息


6.1、后端代码

1、UserDAO

//更新用户信息

void update(User user);

//基于id查询用户信息

User findById(Integer id);

2、UserDAOMapper.xml

update t_user

set

name = #{name},

age = #{age},

salary = #{salary},

des = #{des}

where id = #{id}

select

id,name,age,salary,des

from t_user

where id = #{id}

3、service

UserService

//修改用户信息

void update(User user);

//基于id查询用户信息

User findById(Integer id);

UserServiceImpl实现类

@Override

public void update(User user) {

userDAO.update(user);

}

@Override

@Transactional(propagation = Propagation.SUPPORTS) //方法上声明事务注解 Propagation:事务传播属性 支持事务

public User findById(Integer id) {

return userDAO.findById(id);

}

4、control

在这里我们要根据前端请求的参数进行判断。如果前端请求的参数中id为空,说明是添加操作,否则是更新操作,我们执行相对应的代码。

//添加员工信息接口

@PostMapping(“saveOrUpdate”)

public void saveOrUpdate(@RequestBody User user){

log.info(“接收的业务逻辑:{}”,user);

//判断是否存在id

//存在: 更新操作 不存在id: 添加操作

if(StringUtils.isEmpty(user.getId())){ //如果为空

log.info(“添加业务逻辑…”);

userService.save(user); //添加

}else{

log.info(“更新业务逻辑…”);

userService.update(user);

}

}

6.2、前端代码

我们点击修改按钮,显示用户信息。

1、我们先给修改按钮添加根据id查询用户信息事件

<a href=“” class=“btn btn-info btn-sm” @click.prevent=“userEditDetail(user.id)”>修改

2、userEditDetail(id)

userEditDetail(id){ //用来在表单中将当前点击用户信息进行回显

axios.get(“http://localhost:8990/user/”+id).then(res=>{

this.user = res.data; //完成数据回显

});

},

3、给提交按钮绑定修改或者添加用户信息事件

<button type=“button” class=“btn btn-primary btn-block” @click=“saveOrUpdate”>提交

4、saveOrUpdate()

saveOrUpdate(){ //保存或者修改方法

if(!this.user.name){

alert(“姓名不能为空!”);

return ;

}

console.log(this.user);

axios.post(“http://localhost:8990/saveOrUpdate”,this.user).then(res=>{

this.user={}; //添加成功,清空数据

alert(‘用户信息更新成功!’);

//更新原始列表的数据

this.findAll(); //调用查询所有

}).catch(err=>{

alert(‘用户信息更新失败!’)

});

},

},

findAll(){

//发送axios请求

axios.get(“http://localhost:8990/users”).then(res=>{

console.log(res.data);

this.users = res.data;

}); //es6 箭头函数 注意:箭头函数内部没有自己this 简化 function(){} //存在自己this

},

5、测试一下

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bsz7p8mt-1626677532970)(Vue用户列表页面开发.assets/image-20210717175122673.png)]

测试成功!!!

7、删除用户信息


7.1、后端代码

1、UserDAO接口

//基于id删除用户信息

void delete(Integer id);

2、UserDAOMapper.xml

# 最后

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。

因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点!不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
Vue用户列表页面开发.assets/image-20210717175122673.png)]](https://i-blog.csdnimg.cn/blog_migrate/068f7d9a28df08015fd2a5d054f2a063.png)

测试成功!!!

7、删除用户信息


7.1、后端代码

1、UserDAO接口

//基于id删除用户信息

void delete(Integer id);

2、UserDAOMapper.xml

# 最后

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。

因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

[外链图片转存中…(img-ufmirhoF-1715878485375)]

[外链图片转存中…(img-6YCS9UCV-1715878485375)]

[外链图片转存中…(img-JFn31PYm-1715878485375)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点!不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值