毕业设计Day8--vue实现增删改查

封装axios

参考链接

在控制台输入

npm i axios -S

在这里插入图片描述

在vue的src下新建utils文件夹,新建request.js,将如下代码复制过去

import axios from 'axios'

const request = axios.create({
    baseURL: '/api',  // 注意!! 这里是全局统一加上了 '/api' 前缀,也就是说所有接口都会加上'/api'前缀在,页面里面写接口的时候就不要加 '/api'了,否则会出现2个'/api',类似 '/api/api/user'这样的报错,切记!!!
    timeout: 5000
})

// request 拦截器
// 可以自请求发送前对请求做一些处理
// 比如统一加token,对请求参数统一加密
request.interceptors.request.use(config => {
    config.headers['Content-Type'] = 'application/json;charset=utf-8';

    // config.headers['token'] = user.token;  // 设置请求头
    return config
}, error => {
    return Promise.reject(error)
});

// response 拦截器
// 可以在接口响应后统一处理结果
request.interceptors.response.use(
    response => {
        let res = response.data;
        // 如果是返回的文件
        if (response.config.responseType === 'blob') {
            return res
        }
        // 兼容服务端返回的字符串数据
        if (typeof res === 'string') {
            res = res ? JSON.parse(res) : res
        }
        return res;
    },
    error => {
        console.log('err' + error) // for debug
        return Promise.reject(error)
    }
)


export default request


在main.js中请求http

在这里插入图片描述

Home.vue中,将原来的fetch函数改为request请求

在这里插入图片描述

试运行,刷新界面,在网络部分看到状态码为200即成功

在这里插入图片描述

同时,records里即为我们所需要的数据

在这里插入图片描述

解析records数据

在这里插入图片描述

多条件查询

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

试运行,即实现多条件查询

在这里插入图片描述

新增数据

对话框

初始值为false
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

效果展示

在这里插入图片描述

注意

实体类User中id前面要加如下注释,否则生成的id容易形成乱码

在这里插入图片描述

其余操作类似,下面直接上代码

代码展示

Home.vue


<template>
 <div style="height:100%">
   <el-container style="height: 100vh  ">
     <el-aside width="sideWidth+'px'" style="background-color: rgb(238, 241, 246);height:100% ;box-shadow: rgba(0,21,41,0.35) 2px 0px 6px;">
       <el-menu :default-openeds="['1', '3']"
                style="min-height:100%; overflow-x:hidden;"
                background-color="rgb(251,185,197)"
                active-text-color="rgb(255,224,230)"
                :collapse-transition="false"
                :collapse="isCollapse"
       >
         <div style="height:60px;line-height: 60px;text-align: center">
           <img src="../assets/car.png" alt="" style="width:20px;position:relative;top:5px;margin-right: 5px;">
           <b v-show="!isCollapse">小温的停车场管理系统</b>
         </div>

         <el-submenu index="1">
           <template slot="title"><i class="el-icon-message"></i>
             <span slot="title">导航一</span>
           </template>
           <el-menu-item-group>
             <template slot="title">分组一</template>
             <el-menu-item index="1-1">选项1</el-menu-item>
             <el-menu-item index="1-2">选项2</el-menu-item>
           </el-menu-item-group>
           <el-menu-item-group title="分组2">
             <el-menu-item index="1-3">选项3</el-menu-item>
           </el-menu-item-group>
           <el-submenu index="1-4">
             <template slot="title">选项4</template>
             <el-menu-item index="1-4-1">选项4-1</el-menu-item>
           </el-submenu>
         </el-submenu>
         <el-submenu index="2">
           <template slot="title"><i class="el-icon-menu"></i>
             <span slot="title">导航二</span>
           </template>
           <el-menu-item-group>
             <template slot="title">分组一</template>
             <el-menu-item index="2-1">选项1</el-menu-item>
             <el-menu-item index="2-2">选项2</el-menu-item>
           </el-menu-item-group>
           <el-menu-item-group title="分组2">
             <el-menu-item index="2-3">选项3</el-menu-item>
           </el-menu-item-group>
           <el-submenu index="2-4">
             <template slot="title">选项4</template>
             <el-menu-item index="2-4-1">选项4-1</el-menu-item>
           </el-submenu>
         </el-submenu>
         <el-submenu index="3">
           <template slot="title"><i class="el-icon-setting"></i>
             <span slot="title">导航三</span>
           </template>
           <el-menu-item-group>
             <template slot="title">分组一</template>
             <el-menu-item index="3-1">选项1</el-menu-item>
             <el-menu-item index="3-2">选项2</el-menu-item>
           </el-menu-item-group>
           <el-menu-item-group title="分组2">
             <el-menu-item index="3-3">选项3</el-menu-item>
           </el-menu-item-group>
           <el-submenu index="3-4">
             <template slot="title">选项4</template>
             <el-menu-item index="3-4-1">选项4-1</el-menu-item>
           </el-submenu>
         </el-submenu>
       </el-menu>
     </el-aside>

     <el-container>
       <el-header style=" font-size: 12px;border-bottom:1px solid #ccc;line-height:60px;display:flex">
         <div style="flex:1;font-size:20px">
           <span :class="collapseBtnClass" style="cursor: pointer" @click="collapse"></span>
         </div>
         <el-dropdown style="width: 70px;cursor:pointer">
           <span>小温</span>
           <i class="el-icon-arrow-down" style="margin-left: 5px"></i>
           <el-dropdown-menu slot="dropdown">
             <el-dropdown-item>个人信息</el-dropdown-item>
             <el-dropdown-item>退出</el-dropdown-item>

           </el-dropdown-menu>
         </el-dropdown>

       </el-header>

       <el-main>

         <div style="margin-bottom:10px">
           <el-breadcrumb separator-class="el-icon-arrow-right">
             <el-breadcrumb-item :to="{ path: '/' }">首页</el-breadcrumb-item>
             <el-breadcrumb-item>用户管理</el-breadcrumb-item>
           </el-breadcrumb>
         </div>

         <div style="padding: 10px 0;margin-bottom:5px">
           <el-input style="width: 280px" placeholder="请输入姓名" suffix-icon="el-icon-search" v-model="username"></el-input>
           <el-input style="width: 280px" placeholder="请输入邮箱" suffix-icon="el-icon-message" class="ml-10" v-model="email"></el-input>
           <el-input style="width: 280px" placeholder="请输入车牌号" suffix-icon="el-icon-truck" class="ml-10" v-model="carnum"></el-input>
           <el-button class="ml-10" type="primary" @click="load">搜索</el-button>
           <el-button class="ml-10" type="warning" @click="reset">重置</el-button>
         </div>

         <div class="ml-5" style="margin-bottom: 15px">
           <el-button type="primary" @click="handleAdd">新增 <i class="el-icon-circle-plus-outline"></i></el-button>
           <el-popconfirm
               class="ml-10"
               confirm-button-text='好的'
               cancel-button-text='我再想想'
               icon="el-icon-info"
               icon-color="red"
               title="您确定批量删除这些数据嘛?"
               @confirm="delBatch"
           >
           <el-button type="danger" slot="reference">批量删除 <i class="el-icon-remove-outline"></i></el-button>
           </el-popconfirm>
           <el-button type="primary" class="ml-10">导入<i class="el-icon-top"></i></el-button>
           <el-button type="primary">导出<i class="el-icon-bottom"></i></el-button>
         </div>
         <el-table :data="tableData" style="margin-top: 10px " border stripe   :row-class-name="tableRowClassName" @selection-change="handleSelectionChange" >
            <el-table-column type="selection" width="55"></el-table-column>
           <el-table-column prop="id" label="ID" width="80">
           </el-table-column>

           <el-table-column prop="username" label="车主姓名" width="120">
           </el-table-column>

           <el-table-column prop="nickname" label="昵称" width="140">
           </el-table-column>

           <el-table-column prop="email" label="邮箱">
           </el-table-column>

           <el-table-column prop="phone" label="电话">
           </el-table-column>

           <el-table-column prop="address" label="地址">
           </el-table-column>

           <el-table-column prop="carnum" label="车牌号">
           </el-table-column>

           <el-table-column  label="操作">
             <template slot-scope="scope">
               <el-button type="success" @click="handleEdit(scope.row)">编辑<i class="el-icon-edit"></i> </el-button>
               <el-popconfirm
                   class="ml-10"
                   confirm-button-text='好的'
                   cancel-button-text='我再想想'
                   icon="el-icon-info"
                   icon-color="red"
                   title="这是一段内容确定删除吗?"
                   @confirm="handleDel(scope.row.id)"
               >
               <el-button type="danger" slot = "reference">删除<i class="el-icon-remove-outline"></i></el-button>
               </el-popconfirm>
             </template>
           </el-table-column>
         </el-table>

         <div style="padding:10px 0">
           <el-pagination
               @size-change="handleSizeChange"
               @current-change="handleCurrentChange"
               :current-page="pageNum"
               :page-sizes="[2, 10, 15, 20]"
               :page-size="pageSize"
               layout="total, sizes, prev, pager, next, jumper"
               :total="total">
           </el-pagination>
         </div>



         <el-dialog title="用户信息" :visible.sync="dialogFormVisible" width="30%" >
           <el-form :model="form" label-width="80px" size="small">
             <el-form-item label="用户名" >
               <el-input v-model="form.username" autocomplete="off"></el-input>
             </el-form-item>
             <el-form-item label="昵称" >
               <el-input v-model="form.nickname" autocomplete="off"></el-input>
             </el-form-item>
             <el-form-item label="邮箱" >
               <el-input v-model="form.email" autocomplete="off"></el-input>
             </el-form-item>
             <el-form-item label="电话" >
               <el-input v-model="form.phone" autocomplete="off"></el-input>
             </el-form-item>
             <el-form-item label="地址" >
               <el-input v-model="form.address" autocomplete="off"></el-input>
             </el-form-item>
             <el-form-item label="车牌号" >
               <el-input v-model="form.carnum" autocomplete="off"></el-input>
             </el-form-item>
           </el-form>
           <div slot="footer" class="dialog-footer">
             <el-button @click="cancel">取 消</el-button>
             <el-button type="primary"  @click="save">确 定</el-button>
           </div>
         </el-dialog>
       </el-main>
     </el-container>
   </el-container>




 </div>
</template>
<style>
.el-table .warning-row {
  background: oldlace;
}

.el-table .success-row {
  background: #f0f9eb;
}
.headerBg{
  background: #42b983!important;
}


</style>

<script>
// @ is an alias to /src
import HelloWorld from '@/components/HelloWorld.vue'

export default {
  name: 'HomeView',
  components: {
    HelloWorld
  },
  data(){
    return{
      tableData: [],
      total:0,
      username:"",
      email:"",
      carnum:"",
      dialogFormVisible:false,
      multipleSelection:[],
      form:{},
      pageNum:1,
      pageSize:2,
      msg:"hello 小温",
      collapseBtnClass:'el-icon-s-fold',
      isCollapse:false,
      sideWidth:200
    }
  },
  created() {
    //请求分页查询数据
    this.load()
  },
  methods:{
    collapse(){   // 点击收缩按钮触发
      this.isCollapse=!this.isCollapse
      if(this.isCollapse){
        this.sideWidth = 60
        this.collapseBtnClass = 'el-icon-s-unfold'
      }else{
        this.sideWidth=200
        this.collapseBtnClass='el-icon-s-fold'
      }
    },
    handleAdd(){
      this.dialogFormVisible=true
      this.form={}
    },
    save(){
      this.request.post("http://localhost:9090/user",this.form).then(res => {
        if(res){

          this.$message.success("保存成功")
          this.dialogFormVisible = false
          this.load()
        }else{
          this.$message.error("保存失败")
        }
      })
    },
    cancel(){
      this.dialogFormVisible = false
      this.load()
    },
    handleEdit(row){
      this.form = Object.assign({},row)
      this.dialogFormVisible = true
    },
    handleDel(id){
      this.request.delete("http://localhost:9090/user/"+id).then(res =>{
        if(res){
          this.$message.success("删除成功")
          this.load()
        }else{
          this.$message.error("删除失败")
        }
      })
    },
    delBatch(){
      let ids = this.multipleSelection.map(v => v.id)//把对象的数组变成纯id的数组
      this.request.post("http://localhost:9090/user/del/batch",ids).then(res =>{
        if(res){
          this.$message.success("批量删除成功")
          this.load()
        }else{
          this.$message.error("删除失败")
        }
      })
    },
    load(){
      this.request.get("http://localhost:9090/user/page",{
        params:{
          pageNum:this.pageNum,
          pageSize:this.pageSize,
          username: this.username,
          email: this.email,
          carnum: this.carnum
        }
      }).then(res =>{
        console.log(res)
        this.tableData = res.records
        this.total = res.total
      })
    },
    handleSelectionChange(val){
      console.log(val)
      this.multipleSelection = val
    },
    reset(){
      this.username=""
      this.email=""
      this.carnum=""
      this.load()
    },
    handleSizeChange(pageSize){
      console.log(pageSize)
      this.pageSize=pageSize
      this.load()
    },
    handleCurrentChange(pageNum){
      console.log(pageNum)
      this.pageNum=pageNum
      this.load()
    },
    tableRowClassName({row, rowIndex}) {
      if (rowIndex === 1) {
        return 'warning-row';
      } else if (rowIndex === 3) {
        return 'success-row';
      }
      return '';
    }
  }
}
</script>

UserController.java

package com.ww.car.controller;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ww.car.entity.User;
import com.ww.car.mapper.UserMapper;
import com.ww.car.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.bind.annotation.*;

import java.util.HashMap;
import java.util.List;
import java.util.Map;


@RestController
@RequestMapping("/user")
public class UserController {

//    @Autowired
//    private UserMapper userMapper;

    @Autowired
    private UserService userService;

    //新增&修改
    @PostMapping
    public  boolean save(@RequestBody User user){
        //新增或更新均可
        return userService.saveUser(user);
    }

    //查询所有数据
    @GetMapping
    public List<User> findAll(){

        return userService.list();
    }

    //删除数据
    @DeleteMapping("/{id}")
    public boolean delete(@PathVariable Integer id){
        return userService.removeById(id);
    }


    @PostMapping("/del/batch")
    public boolean deleteBatch(@RequestBody List<Integer> ids){
        return userService.removeBatchByIds(ids);
    }


    //接口路径:/user/page
    //分页查询
    //@RequestParam接收  ?pageNum=1&pageSize=10
    //pageNum是指起始数据的位置(默认值为0,即从第一条数据开始查询),pageSize是指每页数量
    //每页第一个数据:(pageNum-1)*pageSize
//    @GetMapping("/page")
//
//    public Map<String, Object> findPage(@RequestParam Integer pageNum,
//                                        @RequestParam Integer pageSize,
//                                        @RequestParam String username){
//
//        pageNum=(pageNum - 1) * pageSize;
//        List<User> data=userMapper.selectPage(pageNum,pageSize,username);
//        Integer total = userMapper.selectTotal(username);
//        Map<String, Object> res = new HashMap<>();
//        res.put("data",data);
//        res.put("total",total);
//        return res;
//
//    }

    //mybatis-plus实现分页查询
    @GetMapping("/page")
    public IPage<User> findPage(@RequestParam Integer pageNum,
                                @RequestParam Integer pageSize,
                                @RequestParam(defaultValue = "") String username,
                                @RequestParam(defaultValue = "") String email,
                                @RequestParam(defaultValue = "") String carnum){
        IPage<User> page = new Page<>(pageNum,pageSize);
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        if(!"".equals(username)){
            queryWrapper.like("username",username);
        }
        if(!"".equals(email)){
            queryWrapper.like("email",email);
        }
        if(!"".equals(carnum)){
            queryWrapper.like("carnum",carnum);
        }
        queryWrapper.orderByDesc("id");
        return userService.page(page,queryWrapper);

    }


}

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值