前后端分离项目(十):实现"改"功能(前后端)

好家伙,本篇介绍如何实现"改"

我们先来看看效果吧

 (这可不是假数据哟,这是真数据哟)

 (忘记录鼠标了,这里是点了一下刷新)

 

First Of All 

我们依旧先来理一下思路:

首先在"管理"页面中,我能看到所有的书本信息,

随后,在每一个信息后都有对应的"修改按钮"

当我点击这个按钮时,我要① 拿到这个这条数据的id($router传参)

然后② 跳转到"信息修改界面" ,(这个界面会像书本添加的那个界面一样,有两个输入框,一个提交按钮,一个重置按钮)

这时,我向后端③ 请求到当前这条"id"的相关数据 (举例:{id:1,name:三体1,auther:刘慈欣})

将它展示到"信息修改界面"的输入框中 ,随后,你可以将这些数据根据你想要的形状进行修改

最后点击修改数据,④ 发送axios请求到后端提交更新后的数据

 

思路清晰,开干

目录如下:

这里我们只需用到MyUsers.vue组件(书本管理页)和MyGoods.vue组件(书本修改页),

 

当然了,我们要先把这个信息修改界面写(CV)出来

MyGoods组件如下

这里我们选择让id只读,不允许修改 

MyGoods.vue代码如下:

   <!--  该组件为书本修改功能组件  --> 
< template >
< el-form style ="width: 60%" :model ="ruleForm" :rules ="rules" ref ="ruleForm" label-width ="100px" class ="demo-ruleForm" >

< el-form-item label ="图书编号" prop ="id" >
< el-input v-model ="ruleForm.id" readonly ="" ></ el-input >
</ el-form-item >

< el-form-item label ="图书名称" prop ="name" >
< el-input v-model ="ruleForm.name" ></ el-input >
</ el-form-item >

< el-form-item label ="作者" prop ="author" >
< el-input v-model ="ruleForm.author" ></ el-input >
</ el-form-item >

< el-form-item >
< el-button type ="primary" @click ="submitForm('ruleForm')" > 修改 </ el-button >
< el-button @click ="resetForm('ruleForm')" > 重置 </ el-button >
</ el-form-item >

</ el-form >
</ template >

< script > import axios from ' axios ' export default {
data() {
return {
ruleForm: {
id:
'' ,
name:
'' ,
author:
'' },
rules: {
name: [
{ required:
true , message: ' 图书名称不能为空 ' , trigger: ' blur ' }
],
author:[
{ required:
true , message: ' 作者不能为空 ' , trigger: ' blur ' }
]
}
};
},
methods: {
submitForm(formName) {
const _this
= this
this .$refs[formName].validate((valid) => { if (valid) {
axios.put(
' http://localhost:8011/book/update ' , this .ruleForm).then( function (resp){ if (resp.data == ' success ' ){
_this.$alert(
' ' + _this.ruleForm.name + ' 》修改成功! ' , ' 消息 ' , {
confirmButtonText:
' 确定 ' ,
callback: action
=> {
_this.$router.push(
' /home/users ' )
}
})
}
})
}
else { return false
;
}
});
},

resetForm(formName) {
this .$refs[formName].resetFields();
}
},
created(){
const _this
= this alert( this .$route.query.id)
axios.get(
' http://localhost:8011/book/findById/ ' + this .$route.query.id).then( function (resp){
_this.ruleForm
=
resp.data
})

}

}
</ script >

 

MyUsers.vue代码如下:

   <!--  该组件为表单主要组件  --> 
< template >
< div >
<!-- 标题 -->
< h4 class ="text-center" > 用户管理 </ h4 >
<!-- 用户添加按钮 -->
< el-col :span ="4" >
< el-button type ="primary" @click ="addDialogVisible = true" > 添加用户 </ el-button >
</ el-col >
<!-- 用户列表 -->
< el-table :data ="tableData" border style ="width: 100%" >
< el-table-column prop ="id" label ="序号" width ="180" >
</ el-table-column >
< el-table-column prop ="name" label ="书名" width ="180" >
</ el-table-column >
< el-table-column prop ="author" label ="作者" width ="180" >

</ el-table-column >
< el-table-column label ="操作" width ="180" >
< template slot-scope ="scope" >
< el-button @click ="handleClick(scope.row)" type ="text" size ="small" > 修改 </ el-button >
< el-button @click ="Bookdelete(scope.row)" type ="text" size ="small" > 删除 </ el-button >
</ template >
</ el-table-column >

</ el-table >
< el-pagination :page-size ="6" :pager-count ="11" layout ="prev, pager, next" :total ="total" @current-change ="page" >
</ el-pagination >
<!-- <el-pagination :page-size="20"
:pager-count="11"
layout="prev, pager, next"
:total="18"
@current-change="page" >
</el-pagination>
-->
</ div >
</ template >

< script > import axios from ' axios ' export default {
name:
' MyUser ' ,
data() {
return {
total:
null , // 用户列表数据
tableData: [
{ id:
' 1 ' , name: ' 三体1 ' , author: ' 大刘 ' },
{ id:
' 2 ' , name: ' 三体2 ' , author: ' 大刘 ' },
],
addDialogVisible:
false , // 控制添加用户对话框的显示与隐藏
addUserForm: {}, // 添加表单的验证规则对象
addUserFormRules: { // username: [{required:true,message:'请输入用户名',trigger:'blur'},
// {min:3,max:10,message:'用户名长度在3~10个字符',trigger:'blur'}],
// password: [{required:true,message:'请输入密码',trigger:'blur'},
// {min:6,max:15,message:'密码长度在6~15个字符',trigger:'blur'}],
// email: [{required:true,message:'请输入邮箱',trigger:'blur'}],
// mobile: [{required:true,message:'请输入手机号',trigger:'blur'}]
}
}
},
methods: {
// 书本删除方法
Bookdelete(row) {
const _this
= this axios. delete ( ' http://localhost:8011/book/deleteById/ ' + row.id).then(() => {
_this.$alert(
' ' + row.name + ' 》删除成功! ' , ' 消息 ' , {
confirmButtonText:
' 确定 ' ,
callback: action
=> {
window.location.reload()
}
})
})
},
// 页面点击修改按钮
handleClick(row) {
console.log(row);
this .$router.push({
path:
" goods " ,
query: {
id: row.id
}
})
},
// 分页方法
page(currentPage) {
const _this
= this ;
axios.get(
' http://localhost:8011/book/findAll/ ' + currentPage + ' /6 ' ).then( function (resp) {
_this.tableData
= resp.data.content
_this.total
= resp.data.totalElements

console.log(resp.data)
})
}

},
created() {
const _this
= this ;
axios.get(
' http://localhost:8011/book/findAll/1/6 ' ).then( function (resp) {
_this.tableData
= resp.data.content
_this.total
= resp.data.totalElements

console.log(resp.data)
})
}

}
</ script >

< style lang ="less" scoped >

</ style >

(别忘了配路由,你已经是个成熟的cv程序员了,要学会自己配路由)

后端的接口:

   package  com.example.demo2.controller;  import  com.example.demo2.entity.Book;  import  com.example.demo2.repository.BookRepository;  import  org.springframework.beans.factory.annotation.Autowired;  import  org.springframework.data.domain.Page;  import  org.springframework.data.domain.PageRequest;  import  org.springframework.web.bind.annotation.* ;

@RestController
@RequestMapping(
"/book" ) public class BookHandler {
@Autowired
private BookRepository bookRepository;

@GetMapping(
"/findAll/{page}/{size}" ) public Page<Book> findAll(@PathVariable("page") Integer page, @PathVariable("size" ) Integer size){
PageRequest request
= PageRequest.of(page-1 ,size); return bookRepository.findAll(request);
}

@PostMapping(
"/save" ) public String save(@RequestBody Book book){
Book result
= bookRepository.save(book); if (result != null ){ return "success" ;
}
else { return "error" ;
}
}

@GetMapping(
"/findById/{id}" ) public Book findById(@PathVariable("id" ) Integer id){ return bookRepository.findById(id).get();
}

@PutMapping(
"/update" ) public String update(@RequestBody Book book){
Book result
= bookRepository.save(book); if (result != null ){ return "success" ;
}
else { return "error" ;
}
}

@DeleteMapping(
"/deleteById/{id}" ) public void deleteById(@PathVariable("id" ) Integer id){
bookRepository.deleteById(id);
}
}

 

来吧

1.拿到这个这条数据的id

   <  template  slot-scope  ="scope"  > 
< el-button @click ="handleClick(scope.row)" type ="text" size ="small" > 修改 </ el-button >
< el-button @click ="Bookdelete(scope.row)" type ="text" size ="small" > 删除 </ el-button >
</ template >

对应方法:

   //  页面点击修改按钮 
handleClick(row) {
console.log(row);
this .$router.push({
path:
"goods" ,
query: {
id: row.id
}
})
},

 

 

2.跳转到"信息修改界面"

   this  .$router.push({
path:
"goods" ,
query : {
id: row.id
}
})
  query:用来传参的一个属性


3.请求到当前这条"id"的相关数据,并将它展示到"信息修改界面"的输入框中

   created(){
const _this
= this alert( this .$route.query.id)
axios.get(
'http://localhost:8011/book/findById/'+ this . $route.query.id ).then( function (resp){
_this.ruleForm
= resp.data
})

}

 

 

4.发送axios请求到后端提交更新后的数据

   submitForm(formName) {
const _this
= this
this .$refs[formName].validate((valid) => { if (valid) {
axios. put (
'http://localhost:8011/book/update', this .ruleForm).then( function (resp){ if (resp.data == 'success' ){
_this.$alert(
'《'+_this.ruleForm.name+'》修改成功!', '消息' , {
confirmButtonText:
'确定' ,
callback: action
=> {
_this.$router.push(
'/home/users' )
}
})
}
})
}
else { return false ;
}
});
},

注意此处用的是put请求

 

搞定啦!(激动)

 

标签: Javascript

添加新评论