axios

最终项目的地址:gitee地址

  1. 安装axios
 npm install axios i
  1. 手写工具类
    新建JS文件
import axios from "axios";
import {ElMessage} from "element-plus";

const request = axios.create({
  baseURL: "http://localhost:8080",
  timeout: 3000,
});

// 定义请求拦截器,在每个http请求发送之前执行
request.interceptors.request.use(
    config=>{
        config.headers['Content-type'] = 'application/json;charset=utf-8';
        return config;
    },error=>{
        return Promise.reject(error);
    }
)

// 定义响应拦截器,在每个http响应返回之后执行
request.interceptors.response.use(
    response=>{
        if(response.status !== 200){
            ElMessage.error('请求失败');
        }
        let resdata = response.data;
        if(typeof resdata === 'string'){
            // 转换为json
            resdata = resdata ? JSON.parse(resdata) : resdata;
        }
        return resdata;
    },error=>{
        if(error.response.code === 401){
            ElMessage.error('登录已过期,请重新登录');
        }else if(error.response.code === 500){
            ElMessage.error('服务器错误');
        }else{
            ElMessage.error('请求失败');
        }
        return Promise.reject(error);
    }
)
export default request;

接着我们就可以在前端使用这个Axios去请求我们写的接口

import request from "@/utils/request.js";
request.get('/employee/getEmps')
  .then(res => {
    console.log(res.data)
  }).catch(err => {
    console.log(err)
  })

前后端分页

新增

新增的实现,使用Dialog。我们点击新增按钮,直接弹出新增对话框,然后把要添加的信息,直接传递给后端即可。
逻辑上实现起来还是比较简单的。

<template>
  <div>
    <el-card shadow="hover" style="min-height: 75px">
      <el-input v-model="input" style="width: 240px" placeholder="Please input" />
      <el-button @click="search" type="default" style="margin-left: 10px; width: 75px">搜 索</el-button>
      <el-button @click="reset" type="warning" style="margin-left: 10px; width: 75px">重 置</el-button>
    </el-card>

    <el-card shadow="hover" style="min-height: 85px; margin-top: 5px">
      <div>
        <el-button type="primary" @click="dialogFormVisible=true">新增</el-button>
        <el-button type="primary">批量删除</el-button>
        <el-button type="primary">导入</el-button>
        <el-button type="primary">导出</el-button>
      </div>
    </el-card>

    <el-card shadow="hover" style="max-height: 700px; margin-top: 5px">
      <el-table :data="allTableData.tableData"
                stripe style="width: 100%; --el-table-row-height: 70px;">
        <el-table-column prop="name" label="姓名" width="180" />
        <el-table-column prop="age" label="年龄" width="180" />
        <el-table-column prop="birth" label="生日" width="180" />
        <el-table-column prop="email" label="邮箱" width="180" />
        <el-table-column prop="deptId" label="部门" />
      </el-table>
    </el-card>

    <el-card shadow="hover" style="max-height: 500px; margin-top: 5px">
      <el-pagination
          v-model:current-page="allTableData.currentPage"
          v-model:page-size="allTableData.pageSize"
          :page-sizes="[10, 20, 50, 100, 500]"
          :background="background"
          layout="total, sizes, prev, pager, next, jumper"
          :total="allTableData.total"
          @size-change="handleSizeChange"
          @current-change="handleCurrentChange"
      />
    </el-card>

    <el-dialog v-model="dialogFormVisible" title="新增用户" width="800">
      <el-form :model="employee">
        <el-form-item label="姓名" :label-width="formLabelWidth">
          <el-input v-model="employee.name" autocomplete="off" />
        </el-form-item>
        <el-form-item label="年龄" :label-width="formLabelWidth">
          <el-input v-model="employee.age" autocomplete="off" />
        </el-form-item>


        <el-form-item label="邮箱" :label-width="formLabelWidth">
        <div class="mt-4">
          <el-input
              v-model="employee.email"
              style="max-width: 600px"
              placeholder="Please input"
              class="input-with-select"
          >
            <template #append>
              <el-select v-model="employee.emailrare" placeholder="Select" style="width: 115px">
                <el-option label="@163.com" value="@163.com" />
                <el-option label="@qq.com" value="@qq.com" />
                <el-option label="@gmail.com" value="@gmail.com" />
              </el-select>
            </template>
          </el-input>
        </div>
        </el-form-item>
        <el-form-item label="出生日期" :label-width="formLabelWidth">
          <el-date-picker
              v-model="employee.birth"
              type="date"
              placeholder="请选择出生日期"
              size="default"
              value-format="YYYY-MM-DD"
          />
        </el-form-item>


      </el-form>
      <template #footer>
        <div class="dialog-footer">
          <el-button @click="cancel">取消</el-button>
          <el-button type="primary" @click="submit">
            提交
          </el-button>
        </div>
      </template>
    </el-dialog>

  </div>
</template>

<script setup>
import {ref, onMounted} from 'vue'
import request from "@/utils/request.js";

const input = ref('')

const allTableData = ref({
  tableData: [
   ],
  pageSize: 10,
  currentPage: 1,
  total: 0,
})

onMounted(() => {
  getData();
})

const getData = () => {
  // 获取数据
  request.get('/employee/getEmpPage', {
    params: {
      name: input.value,
      pageNum: allTableData.value.currentPage,
      pageSize: allTableData.value.pageSize
    }
  }).then(res => {
        console.log(res)
        allTableData.value.tableData = res.data.list;
        allTableData.value.total = res.data.total;
        // 如果birth字段包含T, 就去除T后面的
        allTableData.value.tableData.forEach(item => {
          if (item.birth.includes('T')) {
            item.birth = item.birth.split('T')[0]
          }
        })
      }).catch(err => {
    console.log(err)
  })
}

const search = () => {
  // 获取数据,根据用户输入,搜索,并分页
  getData();
}

const reset = () => {
  input.value = ''
}



const handleCurrentChange = (val) => {
  // 直接请求数据
  getData();
}

const handleSizeChange = (val) => {
  // 直接请求数据
  getData();
}

// 弹窗相关信息
const dialogFormVisible = ref(false)
const formLabelWidth = '140px'

const employee = ref({
  name: '',
  age: '',
  birth: '',
  email: '',
  deptId: '',
  emailrare: '@163.com'
})

// 确认提交
const submit = () => {
  employee.value.email = employee.value.name + employee.value.emailrare
  request.post('/employee/addEmp', employee.value).then(res => {
    console.log("请求返回的数据 :" + res.data)
    if (res.code === 200) {
      closeDialog()
      // 置空
      employee.value = {
        name: '',
        age: '',
        birth: '',
        email: '',
        deptId: '',
        emailrare: '@163.com'
      }
      getData()
    } else {
      ElMessage.error('添加失败')
    }
  }).catch(err => {
    console.log(err)
  })
}

// quxiao
const cancel = () => {
  closeDialog()
}

const closeDialog = () => {
  dialogFormVisible.value = false
}

</script>

<style scoped>

</style>

生成最终的完整版:

<template>
  <div>
    <el-card shadow="hover" style="min-height: 75px">
      <el-input v-model="input" style="width: 240px" placeholder="Please input" />
      <el-button @click="search" type="default" style="margin-left: 10px; width: 75px">搜 索</el-button>
      <el-button @click="reset" type="warning" style="margin-left: 10px; width: 75px">重 置</el-button>
    </el-card>

    <el-card shadow="hover" style="min-height: 85px; margin-top: 5px">
      <div>
        <el-button type="primary" @click="dialogFormVisible=true">新增</el-button>
        <el-button type="primary" @click="batchDelete">批量删除</el-button>
      </div>
    </el-card>

    <el-card shadow="hover" style="max-height: 700px; margin-top: 5px">
      <el-table :data="allTableData.tableData"
                stripe style="width: 100%; --el-table-row-height: 70px;"
      @selection-change="handleSelectionChange">
        <el-table-column type="selection" width="55" />
        <el-table-column prop="name" label="姓名" width="180" />
        <el-table-column prop="age" label="年龄" width="180" />
        <el-table-column prop="birth" label="生日" width="180" />
        <el-table-column prop="email" label="邮箱" width="180" />
        <el-table-column prop="deptId" label="部门" />
        <el-table-column label="操作">
          <template #default="scope">
            <el-button size="small" @click="handleEdit(scope.$index, scope.row)">
              编辑
            </el-button>
            <el-button
                size="small"
                type="danger"
                @click="handleDelete(scope.$index, scope.row)"
            >
              删除
            </el-button>
          </template>
        </el-table-column>
      </el-table>
    </el-card>

    <el-card shadow="hover" style="max-height: 500px; margin-top: 5px">
      <el-pagination
          v-model:current-page="allTableData.currentPage"
          v-model:page-size="allTableData.pageSize"
          :page-sizes="[10, 20, 50, 100, 500]"
          :background="background"
          layout="total, sizes, prev, pager, next, jumper"
          :total="allTableData.total"
          @size-change="handleSizeChange"
          @current-change="handleCurrentChange"
      />
    </el-card>

    <el-dialog v-model="dialogFormVisible" title="新增用户" width="800">
      <el-form :model="employee">
        <el-form-item label="姓名" :label-width="formLabelWidth">
          <el-input v-model="employee.name" autocomplete="off" />
        </el-form-item>
        <el-form-item label="年龄" :label-width="formLabelWidth">
          <el-input v-model="employee.age" autocomplete="off" />
        </el-form-item>


        <el-form-item label="邮箱" :label-width="formLabelWidth">
        <div class="mt-4">
          <el-input
              v-model="employee.email"
              style="max-width: 600px"
              placeholder="Please input"
              class="input-with-select"
          >
            <template #append>
              <el-select v-model="employee.emailrare" placeholder="Select" style="width: 115px">
                <el-option label="@163.com" value="@163.com" />
                <el-option label="@qq.com" value="@qq.com" />
                <el-option label="@gmail.com" value="@gmail.com" />
              </el-select>
            </template>
          </el-input>
        </div>
        </el-form-item>
        <el-form-item label="出生日期" :label-width="formLabelWidth">
          <el-date-picker
              v-model="employee.birth"
              type="date"
              placeholder="请选择出生日期"
              size="default"
              value-format="YYYY-MM-DD"
          />
        </el-form-item>


      </el-form>
      <template #footer>
        <div class="dialog-footer">
          <el-button @click="cancel">取消</el-button>
          <el-button type="primary" @click="submit">
            提交
          </el-button>
        </div>
      </template>
    </el-dialog>

  </div>
</template>

<script setup>
import {ref, onMounted} from 'vue'
import request from "@/utils/request.js";
import { ElMessageBox, ElMessage } from 'element-plus'

const input = ref('')

const allTableData = ref({
  tableData: [
   ],
  pageSize: 10,
  currentPage: 1,
  total: 0,
})


onMounted(() => {
  getData();
})

const getData = () => {
  // 获取数据
  request.get('/employee/getEmpPage', {
    params: {
      name: input.value,
      pageNum: allTableData.value.currentPage,
      pageSize: allTableData.value.pageSize
    }
  }).then(res => {
        console.log(res)
        allTableData.value.tableData = res.data.list;
        allTableData.value.total = res.data.total;
        // 如果birth字段包含T, 就去除T后面的
        allTableData.value.tableData.forEach(item => {
          if (item.birth.includes('T')) {
            item.birth = item.birth.split('T')[0]
          }
        })
      }).catch(err => {
    console.log(err)
  })
}

const search = () => {
  // 获取数据,根据用户输入,搜索,并分页
  getData();
}

const reset = () => {
  input.value = ''
}

const selectIds = ref( [])

const handleSelectionChange = (val) => {
  // 直接获取所有的id
  selectIds.value = val.map(item => item.id)
}


const handleCurrentChange = (val) => {
  // 直接请求数据
  getData();
}

const handleSizeChange = (val) => {
  // 直接请求数据
  getData();
}

const handleEdit = (index, row) => {
  // 修改数据
  dialogFormVisible.value = true
  employee.value = { ...row}
  employee.value.emailrare = employee.value.email.split('@')[1]
  employee.value.email = employee.value.email.split('@')[0]
}

const handleDelete = (index, row) => {
  // 删除数据, 直接跟id进行删除
  ElMessageBox.confirm('删除后数据无法回复, 是否继续?', '提示', {
    confirmButtonText: '确定',
    cancelButtonText: '取消',
    type: 'warning'
  }).then(() => {
    // 删除数据
    deleteData(row)
  }).catch(() => {
    ElMessage({
      type: 'info',
      message: '已取消删除'
    })
  })

}

// 弹窗相关信息
const dialogFormVisible = ref(false)
const formLabelWidth = '140px'

const employee = ref({
  id: '',
  name: '',
  age: '',
  birth: '',
  email: '',
  deptId: '',
  emailrare: '@163.com'
})

const deleteData = (row) => {
  request.delete('/employee/deleteEmp', {
    params: {
      id: row.id
    }
  }).then(res => {
    if (res.code === 200) {
      getData()
    } else {
    }
  })
}

// 确认提交
const submit = () => {
  employee.value.email = employee.value.name + employee.value.emailrare;
  employee.value.id ? update() : add();
}

// 新增数据
const add = () => {
  request.post('/employee/addEmp', employee.value).then(res => {
    console.log("请求返回的数据 :" + res.data)
    if (res.code === 200) {
      closeDialog()
      // 置空
      employee.value = {
        name: '',
        age: '',
        birth: '',
        email: '',
        deptId: '',
        emailrare: '@163.com'
      }
      getData()
    } else {
      ElMessage.error('添加失败')
    }
  }).catch(err => {
    console.log(err)
  })
}

// 批量删除
const batchDelete = () => {
  if (selectIds.value.length === 0) {
    ElMessage.error('请选择要删除的数据')
  } else {
    ElMessageBox.confirm('删除后数据无法回复, 是否继续?', '提示', {
      confirmButtonText: '确定',
      cancelButtonText: '取消',
      type: 'warning'
    }).then(() => {
      // 删除数据
      request.post('/employee/deleteEmpByIds', selectIds.value).then(res=> {
        if (res.code === 200) {
          getData()
        } else {
          ElMessage.error('删除失败')
        }
      })
    })
  }
}

// 修改数据
const update = () => {
  request.put('/employee/updateEmp', employee.value).then(res => {
    if (res.code === 200) {
      closeDialog()
      // 置空
      employee.value = {
        name: '',
        age: '',
        birth: '',
        email: '',
        deptId: '',
        emailrare: '@163.com'
      }
      getData()
    } else {
      ElMessage.error('修改失败')
    }
  }).catch(err => {
    console.log(err)
  })
}

// quxiao
const cancel = () => {
  closeDialog()
}

const closeDialog = () => {
  dialogFormVisible.value = false
}

</script>

<style scoped>

</style>
Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐