本文最后更新于 290 天前,如有错误请邮件至 zhiligyi222na@gmail.com
路由警告

router/index.js

新增数据
流程
- 在新增的按钮上面加上点击事件
- 定义弹窗和表单的页面代码
- 点击触发弹窗打开(清空form对象)
- 表单做一下数据绑定以及表单验证
- 后台要有对应的新增的接口来接受数据
- 新增的接口负责把数据插入到数据库里面
- 表单输入数据后点击确认按钮,把表单里的数据传给后台接口
- 在新增成功之后再次加载表格的数据,关闭弹窗
Dialog弹窗
<el-dialog title="管理员信息" v-model="data.formVisible" width="500">
<template #footer>
<div class="dialog-footer">
<el-button @click="data.formVisible = false">取 消</el-button>
<el-button type="primary" @click="add">保 存</el-button>
</div>
</template>
</el-dialog>
FORM表单
<el-form :model="data.form" label-width="80px" style="padding: 20px 30px 10px 0">
<el-form-item label="账号" >
<el-input v-model="data.form.username" autocomplete="off" />
</el-form-item>
<el-form-item label="名称" >
<el-input v-model="data.form.name" autocomplete="off" />
</el-form-item>
<el-form-item label="电话" >
<el-input v-model="data.form.phone" autocomplete="off" />
</el-form-item>
<el-form-item label="邮箱" >
<el-input v-model="data.form.email" autocomplete="off" />
</el-form-item>
</el-form>
出现”系统异常”怎么办

看控制台的错误

针对这个错误解决问题
表单验证
- 在表单el-form上有三个必须的属性
ref=”formRef” :model=”data.form” :rules=”data.rules” - 在el-form-item上写上表单项的prop
el-form-item prop=”username” - 在rules里面验证定义的规则
- 定义formRef对象,作为表单的引用
- 通过formRef对象进行表单验证
destroy-on-close可以重置dialog
引入Java工具类 Hutool
<!-- hutool工具类 -->
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.8.25</version>
</dependency>
admin的新增流程
public void add(Admin admin) {
// 根据新的账号查询数据库 是否存在同样的账号数据
Admin dbAdmin = adminMapper.selectByUsername(admin.getUsername());
if (dbAdmin != null) {
throw new CustomerException("账号重复");
}
//默认密码为admin
if (StrUtil.isBlank(admin.getPassword())){
admin.setPassword("admin");
}
adminMapper.insert(admin);
}
编辑数据
流程
- 在编辑的按钮上面加上点击事件
- 定义弹窗和表单的页面代码
- 点击触发弹窗打开(将行对象的数据 row 深度拷贝给 form 对象)
- 表单做一下数据绑定以及表单验证
- 后台要有对应的修改的接口来接受数据
- 修改的接口负责把数据更新到数据库里面
- 表单输入数据后点击确认按钮,把表单里的数据传给后台接口
- 在修改成功之后再次加载表格的数据,关闭弹窗
报了405错误

405错误表示你请求的方法跟后端定义的方法类型不一致,比如前端是put请求,后台是post接口


使表单的保存按钮兼容新增和修改
const save = () => {
if (data.form.id){
update()
} else {
add()
}
}
删除数据
单个删除
const del = (id) => {
ElMessageBox.confirm('删除后无法恢复,确认删除吗?', '删除确认', { type: 'warning' }).then(res => {
request.delete('/admin/delete/' + id).then(res => {
if (res.code === '200'){
ElMessage.success('删除成功')
load()
} else {
ElMessage.error(res.msg)
}
})
}).catch(err => {})
}
批量删除
table的多选事件 @selection-change=”handleSelectionChange”
const handleSelectionChange = (rows) => { //rows 就是实际选择的数组
data.rows = rows
}
const deleteBatch = () => {
if (data.rows.length === 0){
ElMessage.warning('请选择要删除的记录')
return
}
ElMessageBox.confirm('删除后无法恢复,确认删除吗?', '删除确认', { type: 'warning' }).then(res => {
request.delete('/admin/deleteBatch', { data: data.rows }).then(res => {
if (res.code === '200'){
ElMessage.success('批量删除成功')
load()
} else {
ElMessage.error(res.msg)
}
})
}).catch(err => {})
}
完整代码案例
Admin.vue
<template>
<div>
<div class="card" style="margin-bottom: 5px">
<el-input clearable @clear="load" style="width: 260px; margin-right: 5px;" v-model="data.username" placeholder="请输入账号查询" :prefix-icon="Search"></el-input>
<el-input clearable @clear="load" style="width: 260px; margin-right: 5px;" v-model="data.name" placeholder="请输入名称查询" :prefix-icon="Search"></el-input>
<el-button type="primary" @click="load">查询</el-button>
<el-button type="info" @click="reset">重置</el-button>
</div>
<div class="card" style="margin-bottom: 5px">
<el-button type="primary" @click="handleAdd">新 增</el-button>
<el-button type="danger" @click="deleteBatch">批量删除</el-button>
<el-button type="success">批量导入</el-button>
<el-button type="info">批量导出</el-button>
</div>
<div class="card" style="margin-bottom: 5px">
<el-table :data="data.tableData" style="width: 100%" @selection-change="handleSelectionChange"
:header-cell-style="{ color: '#333',backgroundColor: '#eaf4ff' }">
<el-table-column type="selection" width="55" />
<el-table-column prop="username" label="账号" />
<el-table-column prop="name" label="名称" />
<el-table-column prop="phone" label="电话" />
<el-table-column prop="email" label="邮箱" />
<el-table-column label="操作" width="100">
<template #default="scope">
<el-button type="primary" icon="Edit" circle @click="handleEdit(scope.row)"></el-button>
<el-button type="danger" icon="Delete" circle @click="del(scope.row.id)"></el-button>
</template>
</el-table-column>
</el-table>
</div>
<div class="card" style="margin-bottom: 5px">
<el-pagination
v-model:current-page="data.pageNum"
v-model:page-size="data.pageSize"
layout="total, sizes, prev, pager, next, jumper"
:page-sizes="[5, 10, 20]"
:total="data.total"
@current-change="load"
@size-change="load"
/>
</div>
<el-dialog title="管理员信息" v-model="data.formVisible" width="500" destroy-on-close>
<el-form ref="formRef" :model="data.form" :rules="data.rules" label-width="80px" style="padding: 20px 30px 10px 0">
<el-form-item prop="username" label="账号" >
<el-input v-model="data.form.username" autocomplete="off" />
</el-form-item>
<el-form-item prop="name" label="名称" >
<el-input v-model="data.form.name" autocomplete="off" />
</el-form-item>
<el-form-item prop="phone" label="电话" >
<el-input v-model="data.form.phone" autocomplete="off" />
</el-form-item>
<el-form-item prop="email" label="邮箱" >
<el-input v-model="data.form.email" autocomplete="off" />
</el-form-item>
</el-form>
<template #footer>
<div class="dialog-footer">
<el-button @click="data.formVisible = false">取 消</el-button>
<el-button type="primary" @click="save">保 存</el-button>
</div>
</template>
</el-dialog>
</div>
</template>
<script setup>
import { reactive, ref } from "vue";
import {Search} from "@element-plus/icons-vue";
import request from "@/utils/request.js";
import {ElMessage, ElMessageBox} from "element-plus";
const data = reactive({
username: null,
name: null,
pageNum: 1,
pageSize: 5,
total: 0,
tableData: [],
formVisible: false,
form: {},
rules:{
username: [
{ required: true, message: '请输入账号', trigger: 'blur' }
],
name: [
{ required: true, message: '请输入名称', trigger: 'blur' }
],
phone: [
{ required: true, message: '请输入电话', trigger: 'blur' }
],
email: [
{ required: true, message: '请输入邮箱', trigger: 'blur' }
]
},
rows: []
});
const formRef = ref()
const load = () => {
request.get("/admin/selectPage",{
params: {
pageNum: data.pageNum,
pageSize: data.pageSize,
username: data.username,
name: data.name
}
}).then(res => {
if (res.code === '200'){
data.tableData = res.data.list
data.total = res.data.total
} else {
ElMessage.error(res.msg)
}
})
}
load()
const reset = () => {
data.username = null
data.name = null
load()
}
const handleAdd = () => {
data.formVisible = true
data.form = {}
}
const add = () => {
//formRef是表单的引用
formRef.value.validate((valid) => {
if (valid) { //验证通过的情况下
request.post("/admin/add",data.form).then(res => {
if (res.code === '200'){
data.formVisible = false
ElMessage.success('新增成功')
load()
} else {
ElMessage.error(res.msg)
}
})
}
})
}
const handleEdit = (row) => {
data.form = JSON.parse(JSON.stringify(row)) //JSON转换,深度拷贝数据
data.formVisible = true
}
const update = () => {
//formRef是表单的引用
formRef.value.validate((valid) => {
if (valid) { //验证通过的情况下
request.put("/admin/update",data.form).then(res => {
if (res.code === '200'){
data.formVisible = false
ElMessage.success('修改成功')
load()
} else {
ElMessage.error(res.msg)
}
})
}
})
}
const save = () => {
if (data.form.id){
update()
} else {
add()
}
}
const del = (id) => {
ElMessageBox.confirm('删除后无法恢复,确认删除吗?', '删除确认', { type: 'warning' }).then(res => {
request.delete('/admin/delete/' + id).then(res => {
if (res.code === '200'){
ElMessage.success('删除成功')
load()
} else {
ElMessage.error(res.msg)
}
})
}).catch(err => {})
}
const handleSelectionChange = (rows) => { //rows 就是实际选择的数组
data.rows = rows
}
const deleteBatch = () => {
if (data.rows.length === 0){
ElMessage.warning('请选择要删除的记录')
return
}
ElMessageBox.confirm('删除后无法恢复,确认删除吗?', '删除确认', { type: 'warning' }).then(res => {
request.delete('/admin/deleteBatch', { data: data.rows }).then(res => {
if (res.code === '200'){
ElMessage.success('批量删除成功')
load()
} else {
ElMessage.error(res.msg)
}
})
}).catch(err => {})
}
</script>
AdminController
package org.example.springdemo.controller;
import com.github.pagehelper.PageInfo;
import jakarta.annotation.Resource;
import org.example.springdemo.common.Result;
import org.example.springdemo.entity.Admin;
import org.example.springdemo.service.AdminService;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RestController
@RequestMapping("/admin")
public class AdminController {
@Resource
AdminService adminService;
@PostMapping("/add")
public Result add(@RequestBody Admin admin){ //@RequestBody接收前端传来的json参数
adminService.add(admin);
return Result.success();
}
@PutMapping("/update")
public Result update(@RequestBody Admin admin){ //@RequestBody接收前端传来的json参数
adminService.update(admin);
return Result.success();
}
@DeleteMapping("/delete/{id}")
public Result delete(@PathVariable Integer id){ //@PathVariable接收前端传来的路径
adminService.deleteById(id);
return Result.success();
}
@DeleteMapping("/deleteBatch")
public Result deleteBatch(@RequestBody List<Admin> list){ //@RequestBody接收前端传来的json数组
adminService.deleteBatch(list);
return Result.success();
}
@GetMapping("/selectAll") //完整的请求路径为:http://localhost:9999/admin/selectAll
public Result selectAll()
{
List<Admin> adminList = adminService.selectAll();
return Result.success(adminList);
}
/**
* 分页查询
* pageNum:当前页码
* pageSize:每页显示的记录数
*/
@GetMapping("/selectPage")
public Result selectPage(@RequestParam(defaultValue = "1") Integer pageNum,
@RequestParam(defaultValue = "10") Integer pageSize,
Admin admin)
{
PageInfo<Admin> pageInfo = adminService.selectPage(pageNum, pageSize, admin);
return Result.success(pageInfo); //返回的是分页的对象
}
}
AdminService
package org.example.springdemo.service;
import cn.hutool.core.util.StrUtil;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import jakarta.annotation.Resource;
import org.example.springdemo.entity.Admin;
import org.example.springdemo.exception.CustomerException;
import org.example.springdemo.mapper.AdminMapper;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class AdminService {
@Resource
AdminMapper adminMapper;
public void add(Admin admin) {
// 根据新的账号查询数据库 是否存在同样的账号数据
Admin dbAdmin = adminMapper.selectByUsername(admin.getUsername());
if (dbAdmin != null) {
throw new CustomerException("账号重复");
}
//默认密码为admin
if (StrUtil.isBlank(admin.getPassword())){
admin.setPassword("admin");
}
adminMapper.insert(admin);
}
public void update(Admin admin) {
adminMapper.updateById(admin);
}
public void deleteById(Integer id) {
adminMapper.deleteById(id);
}
public void deleteBatch(List<Admin> list) {
for (Admin admin : list) {
this.deleteById(admin.getId());
}
}
public List<Admin> selectAll() {
return adminMapper.selectAll(null);
}
public PageInfo<Admin> selectPage(Integer pageNum, Integer pageSize, Admin admin) {
//开启分页查询
PageHelper.startPage(pageNum, pageSize);
List<Admin> list = adminMapper.selectAll(admin);
return PageInfo.of(list);
}
}
AdminMapper
package org.example.springdemo.mapper;
import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Select;
import org.example.springdemo.entity.Admin;
import org.springframework.web.bind.annotation.DeleteMapping;
import java.util.List;
public interface AdminMapper {
List<Admin> selectAll(Admin admin);
void insert(Admin admin);
@Select("select * from `admin` where username = #{username}")
Admin selectByUsername(String username);
void updateById(Admin admin);
@Delete("delete from `admin` where id = #{id}")
void deleteById(Integer id);
}
AdminMapper.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.example.springdemo.mapper.AdminMapper">
<select id="selectAll" resultType="org.example.springdemo.entity.Admin">
select * from `admin`
<where>
<if test="username != null">username like concat('%',#{username},'%')</if>
<if test="name != null">and name like concat('%',#{name},'%')</if> <!--相当于 name like '%1%'-->
</where>
order by id desc
</select>
<insert id="insert">
insert into `admin` (username ,password ,name ,phone ,email)
values (#{username}, #{password}, #{name}, #{phone}, #{email})
</insert>
<update id="updateById">
update `admin` set username = #{username}, password = #{password}, name = #{name}, phone = #{phone}, email = #{email}
where id = #{id}
</update>
</mapper>








