isAxiosError.js:10 POST http://localhost/api/management/book/create 400
来源:4-4 实现新增图书功能
困一
2021-12-18 22:58:23
相关截图:

相关代码:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>图书管理</title>
<!-- 引入样式 -->
<link rel="stylesheet" type="text/css" href="/assets/element-plus/index.css">
<!-- 引入组件库 -->
<script src="/assets/vue/vue.global.js"></script>
<script src="/assets/element-plus/index.full.js"></script>
<script src="/assets/axios/axios.js"></script>
<script src="/assets/wang-editor/wangEditor.min.js"></script>
<style>
.info .el-col, .info .el-select, .info .el-input {
padding-top: 5px;
padding-bottom: 5px;
}
</style>
</head>
<body>
<div id="app">
<h2>图书管理</h2>
<!-- 新增图书按钮 -->
<el-button type="primary" @click="createBook">新增图书</el-button>
<!-- 数据表 -->
<el-table
ref="singleTable"
:data="tableData"
highlight-current-row
style="width: 100%">
<el-table-column
property="categoryName"
label="分类"
width="100">
</el-table-column>
<el-table-column
property="bookName"
label="书名"
width="300">
</el-table-column>
<el-table-column
property="subTitle"
label="子标题"
width="300">
</el-table-column>
<el-table-column
property="author"
label="作者"
width="300">
</el-table-column>
<el-table-column
label="操作"
width="100">
<template #default="scope">
<el-button type="text" size="small" @click="onEdit(scope.row)">修改</el-button>
<el-button type="text" size="small" @click="onDelete(scope.row)">删除</el-button>
</template>
</el-table-column>
</el-table>
<!-- 分页组件 -->
<el-pagination
background
layout="prev, pager, next"
:total="count"
:current-page="page"
@current-change="changePage">
</el-pagination>
<!-- 新增/修改图书表单 -->
<el-dialog :title="dialogTitle" v-model="dialogFormVisible" width="800px" top="5vh" center>
<div class="info">
<el-form :model="form" ref="bookForm" :rules="rules">
<!-- 类别下拉框 -->
<el-form-item prop="category" label-width="0px">
<el-select v-model="form.categoryId" placeholder="请选择类型" style="width: 100%">
<el-option label="前端" value="1"></el-option>
<el-option label="后端" value="2"></el-option>
<el-option label="测试" value="3"></el-option>
<el-option label="产品" value="4"></el-option>
</el-select>
</el-form-item>
<!-- 书名 -->
<el-form-item prop="bookName" label-width="0px">
<el-input v-model="form.bookName" placeholder="请输入书名" autocomplete="off"></el-input>
</el-form-item>
<!-- 子标题 -->
<el-form-item prop="subTitle" label-width="0px">
<el-input v-model="form.subTitle" placeholder="请输入子标题" autocomplete="off"></el-input>
</el-form-item>
<!-- 作者 -->
<el-form-item prop="author" label-width="0px">
<el-input v-model="form.author" placeholder="请输入作者" autocomplete="off"></el-input>
</el-form-item>
<!-- wangEditor容器 -->
<div ref="editor" style="width: 100%"></div>
</el-form>
<span class="dialog-footer">
<!-- 提交按钮 -->
<el-button type="primary" v-on:click="onSubmit('bookForm')" style="width: 100%">确认提交</el-button>
</span>
</div>
</el-dialog>
</div>
<script>
let editor;
const Main = {
data() {
return {
dialogFormVisible: true //控制表单是否显示
, dialogModel: "create" //表单提交模式 create-新增,update-修改
, dialogTitle: "" //表单标题
, form: { //表单数据
categoryId: "" //分类编号
, bookName: "" //书名
, subTitle: ""//子标题
, author: "" //作者
, description: "" //描述
}
, formLabelWidth: '120px' //表单文本宽度
, tableData: [{}] //图书分页数据
, count: 0 //记录总数
, page: 1 //当前页码
, pageCount : 0 //总页数
, rules: { //校验规则
bookName: [
{required: true, message: '请输入书名', trigger: 'blur'}
],
subTitle: [
{required: true, message: '请输入子标题', trigger: 'blur'}
],
author: [
{required: true, message: '请输入作者', trigger: 'blur'}
]
}
}
}
, methods: {
//显示新增/修改图书对话框
//model : create-新增图书 ,update-更新图书
//data : 当模式为update时,代表表单原始数据
showDialog(model, data) {
this.dialogModel = model;
if (model == "create") {
this.dialogTitle = "新增图书";
this.form.categoryId = "1";
this.form.bookName = "";
this.form.subTitle = "";
this.form.author = "";
this.form.description = "";
this.dialogFormVisible = true;
} else if (model == "update") {
if (data != null) {
this.dialogTitle = "更新图书";
this.form = data;
this.form.categoryId = this.form.categoryId.toString();
this.dialogFormVisible = true;
}
}
//实例化wangEditor富文本编辑器
editor = new wangEditor(this.$refs.editor);
//设置上传图片的地址
editor.customConfig.uploadImgServer = '/api/management/book/upload';//设置图片上传地址
//默认上传时使用的参数名
editor.customConfig.uploadFileName = 'img';//设置图片上传参数
editor.create();//创建wangEditor
//设置初始内容
editor.txt.html(this.form.description);
}
, createBook() { //点击新增按钮,显示"新增图书"表单
this.showDialog("create");
}
, onEdit : function(row){
if (row != null) {
//点击修改按钮,显示"修改图书"表单
//row代表当前行数据
this.showDialog("update", row);
}
}
, onDelete: function(row){
const objApp = this;
this.$confirm("确定要删除[" + row.bookName + "]吗?", '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: "warning"
}).then(() => {
//处理删除操作
});
}
, onSubmit: function (formName) {
const objApp = this;
const formData = this.form;
this.$refs[formName].validate(function (valid) {
if (valid) {
const description = editor.txt.html();
const params = new URLSearchParams();
params.append("bookId", objApp.form.bookId);
params.append("bookName", objApp.form.bookName);
params.append("subTitle", objApp.form.subTitle);
params.append("description", description);
params.append("author", objApp.form.author);
params.append("categoryId", objApp.form.categoryId);
console.info("++++++++++++++++++");
console.info(params);
axios.post("/api/management/book/" + objApp.dialogModel,params)
.then(function(response){
const json = response.data;
if(json.code == "0"){
ElementPlus.ElMessage.success({
message : "数据处理成功",
type : "success"
})
objApp.dialogFormVisible = false;
if(objApp.dialogModel == "create"){
objApp.changePage(objApp.pageCount);
}else if(objApp.dialogModel == "update"){
objApp.changePage(objApp.page);
}
}else{
console.error(json);
ElementPlus.ElMessage.error({
message : json.message,
type : "error"
})
}
})
}
});
}
, changePage(page) {
//显示第几页数据
const objApp=this;
axios.get("/api/management/book/list?page="+page)
.then(function (response) {
const json=response.data;
if(json.code=="0"){
const bookList=json.data.list;
objApp.tableData.splice(0,objApp.tableData.length);
bookList.forEach(function (item){
objApp.tableData.push(item);
})
objApp.count=json.data.count;
objApp.page=json.data.page;
if(objApp.count % 10 == 0){
objApp.pageCount=Math.trunc(json.data.count/10);
}else{
objApp.pageCount=Math.trunc(json.data.count/10+1);
}
}else{
console.error(json);
}
})
}
}
, mounted() {
this.dialogFormVisible = false;
const objApp = this;
this.changePage(1);
}
};
const app = Vue.createApp(Main);
app.use(ElementPlus);
app.mount("#app")
</script>
</body>
</html>package com.ssm.controller.mangement;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.ssm.entity.Book;
import com.ssm.service.BookService;
import com.ssm.utils.ResponseUtils;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.select.Elements;
import org.springframework.http.HttpRequest;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.io.IOException;
import java.net.MalformedURLException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.LinkedHashMap;
import java.util.Map;
@RestController
@RequestMapping("/api/management/book")
public class MBookController {
@Resource
private BookService bookService;
@GetMapping("/list")
public ResponseUtils list(Integer page,Integer rows){
ResponseUtils resp = new ResponseUtils();
if(page==null){
page=1;
};
if(rows==null){
rows=10;
};
try{
IPage mapIPage = bookService.selectBookMap(page, rows);
resp=new ResponseUtils().put("list",mapIPage.getRecords()).put("count",mapIPage.getTotal());
}catch (Exception e){
e.printStackTrace();
resp = new ResponseUtils(e.getClass().getSimpleName(),e.getMessage());
}
return resp;
}
@PostMapping("/upload")
public Map upload(@RequestParam("img")MultipartFile file, HttpServletRequest request) throws IOException {
//得到上传文件目录
String uploadPath=request.getServletContext().getResource("/").getPath()+"/upload/";
SimpleDateFormat sdf=new SimpleDateFormat("yyyyMMddHHmmssSSS");
String fileName=sdf.format(new Date());
//获取文件名后缀
String suffix=file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf('.'));
file.transferTo(new File(uploadPath+fileName+suffix));
Map result=new LinkedHashMap();
result.put("errno",0);
result.put("data",new String[]{"/upload/"+fileName+suffix});
return result;
}
@PostMapping("create")
public ResponseUtils createBook(Book book){
ResponseUtils resp;
//<img src="..."/> <h1>....</h1>
try {
System.out.println(book.getDescription());
Document doc = Jsoup.parse(book.getDescription());
Elements elements = doc.select("img");
if (elements.size() == 0) {
resp = new ResponseUtils("ImageNotFoundError", "图书描述未包含封面图片");
return resp;
}
String cover = elements.first().attr("src");
book.setCover(cover);
book.setEvaluationScore(0f);
book.setEvaluationQuantity(0);
Book b = bookService.createBook(book);
resp = new ResponseUtils().put("book",b);
}catch (Exception e){
e.printStackTrace();
resp = new ResponseUtils(e.getClass().getSimpleName(), e.getMessage());
}
return resp;
}
}问题描述:
无法通过axios访问http://localhost/api/management/book/create页面,提示400错误
2回答
慕瓜4328470
2022-06-29
好帮手慕小尤
2021-12-19
同学你好,出现400表示这个请求是无效的,并没有进入后台服务器(控制器)里。可能是前端提交的字段名称或者字段类型和后台的实体类不一样。建议同学查看请求中的参数与book类中属性名称与类型是否相符。
祝学习愉快!
相似问题