Mybatis-Plus前后端分离多表联查模糊查询分页
数据准备
数据库配置:
/*Navicat Premium Data TransferSource Server : localhost_3306Source Server Type : MySQLSource Server Version : 80100 (8.1.0)Source Host : localhost:3306Source Schema : test01Target Server Type : MySQLTarget Server Version : 80100 (8.1.0)File Encoding : 65001Date: 07/11/2023 16:23:00
*/SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;-- ----------------------------
-- Table structure for dept
-- ----------------------------
DROP TABLE IF EXISTS `dept`;
CREATE TABLE `dept` (`deptno` int NOT NULL AUTO_INCREMENT,`dname` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,PRIMARY KEY (`deptno`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 5 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;-- ----------------------------
-- Records of dept
-- ----------------------------
INSERT INTO `dept` VALUES (1, '管理');
INSERT INTO `dept` VALUES (2, '人事');
INSERT INTO `dept` VALUES (3, '财务');
INSERT INTO `dept` VALUES (4, '销售');-- ----------------------------
-- Table structure for emp
-- ----------------------------
DROP TABLE IF EXISTS `emp`;
CREATE TABLE `emp` (`id` int NOT NULL AUTO_INCREMENT COMMENT '员工ID',`ename` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '员工姓名',`birthday` date NULL DEFAULT NULL COMMENT '出生日期',`hobby` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '爱好',`sex` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '性别',`address` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '住址',`deptno` int NULL DEFAULT NULL COMMENT '部部门id',`delid` int NULL DEFAULT 0 COMMENT '0正常1删除',PRIMARY KEY (`id`, `ename`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 9 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;-- ----------------------------
-- Records of emp
-- ----------------------------
INSERT INTO `emp` VALUES (1, '张三', '2000-08-06', '音乐,篮球', '男', '河南省, 郑州市', 1, 0);
INSERT INTO `emp` VALUES (2, '李四', '2001-07-06', '吃饭,睡觉', '男', '河南省, 郑州市', 2, 0);
INSERT INTO `emp` VALUES (3, '王五', '2002-09-20', NULL, '男', '河南省, 郑州市', 3, 0);
INSERT INTO `emp` VALUES (4, '老六', '2002-08-16', '睡觉', '男', '河南省, 郑州市', 4, 0);
INSERT INTO `emp` VALUES (5, '老七', '2001-06-15', NULL, '男', '河南省, 郑州市', 1, 0);
INSERT INTO `emp` VALUES (6, '梨树华', '1999-07-08', '睡觉,音乐,吃饭', '男', '河南省,洛阳市,涧西区', 4, 0);
INSERT INTO `emp` VALUES (7, '林森', '2002-03-06', '睡觉,音乐', '男', '河南省,洛阳市,涧西区', 3, 0);
INSERT INTO `emp` VALUES (8, '小娜', '2002-03-01', '音乐,睡觉', '女', '河北省,秦皇岛市,海港区', 2, 0);SET FOREIGN_KEY_CHECKS = 1;
前端vue+elementui+router+axios

基于vue2 路由的版本不要太高了 < @4
main.js 文件(跨域配置,响应拦截器)
import Vue from 'vue'
import App from './App.vue'
import router from './router'
import ElementUI from 'element-ui'
import 'element-ui/lib/theme-chalk/index.css'
import axios from "axios";
// 引入全局组件
import pageCom from '@/components/PageComponent.vue'
Vue.component("myPage",pageCom)Vue.use(ElementUI);const instance = axios.create({baseURL: 'http://localhost:8080/'
})
instance.interceptors.response.use(responce => {if (responce.data.code == 500) {router.push({path: "/err404"});}return responce.data.t;
}, error => {return Promise.reject(error)
})
Vue.prototype.$axios = instanceVue.config.productionTip = falsenew Vue({router,render: h => h(App)
}).$mount('#app')
后端配置mybatis-plus+springboot
跨域
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
import org.springframework.web.filter.CorsFilter;@Configuration
public class CrossConfig {@Beanpublic CorsFilter corsFilter() {final UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();final CorsConfiguration corsConfiguration = new CorsConfiguration();
// corsConfiguration.setAllowCredentials(true);corsConfiguration.addAllowedHeader("*"); // 允许所有的头corsConfiguration.addAllowedOrigin("*"); // 允许所有的请求源corsConfiguration.addAllowedMethod("*"); // 所欲的方法 get post delete putsource.registerCorsConfiguration("/**", corsConfiguration); // 所有的路径都允许跨域return new CorsFilter(source);}}
分页
import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.autoconfigure.ConfigurationCustomizer;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class MybatisPlusConfig {@Beanpublic MybatisPlusInterceptor mybatisPlusInterceptor() {MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));return interceptor;}
}
swagger(可用可不用,api文档)
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.Contact;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;@Configuration
@EnableSwagger2
public class Swagger2 {@Beanpublic Docket createRestApi() {return new Docket(DocumentationType.SWAGGER_2).apiInfo(apiInfo()).select().apis(RequestHandlerSelectors.basePackage("com.web.controller")).paths(PathSelectors.any()).build();}private ApiInfo apiInfo() {return new ApiInfoBuilder().title("服务:发布为daocke镜像,权限管理,用户管理,页面管理,日志 后台 APIs").description("服务:发布为daocke镜像,权限管理,用户管理,页面管理,日志 后台").termsOfServiceUrl("https://www.baidu.com") //代码的路径.contact(new Contact("hp",null,null)).version("1.0").build();}
}
application.yml(全局配置文件)
spring:datasource:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql:///test01?serverTimezone=UTCpassword: rootusername: rootjackson:date-format: yyyy-MM-dd HH:mm:sstime-zone: GMT+8serialization:write-date-keys-as-timestamps: falsemvc:pathmatch:matching-strategy: ant_path_matchermybatis-plus:configuration:map-underscore-to-camel-case: truelog-impl: org.apache.ibatis.logging.stdout.StdOutImplmapper-locations: classpath:/mapper/*.xmlglobal-config:db-config:logic-not-delete-value: 1logic-delete-value: 0type-aliases-package: com.web.entity
pom.xml (项目依赖)
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.7.17</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.web</groupId><artifactId>web</artifactId><version>0.0.1-SNAPSHOT</version><name>web</name><description>web</description><properties><java.version>1.8</java.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>com.mysql</groupId><artifactId>mysql-connector-j</artifactId><scope>runtime</scope></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><!-- mp 自动生成--><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.3</version></dependency><!-- 模板--><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-generator</artifactId><version>3.5.3</version></dependency><dependency><groupId>org.apache.velocity</groupId><artifactId>velocity-engine-core</artifactId><version>2.3</version></dependency><dependency><groupId>org.freemarker</groupId><artifactId>freemarker</artifactId></dependency><dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper-spring-boot-starter</artifactId><version>1.4.6</version></dependency><dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger2</artifactId><version>3.0.0</version></dependency>
<!-- <dependency>-->
<!-- <groupId>io.springfox</groupId>-->
<!-- <artifactId>springfox-swagger-ui</artifactId>-->
<!-- <version>3.0.0</version>-->
<!-- </dependency>--><dependency><groupId>com.github.xiaoymin</groupId><artifactId>swagger-bootstrap-ui</artifactId><version>1.9.6</version></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><configuration><excludes><exclude><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></exclude></excludes></configuration></plugin></plugins></build></project>
代码书写
后端
创建基本架构

ResuUtil 类
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;@Data
@AllArgsConstructor
@NoArgsConstructor
public class ResuUtil<T> {Integer code;String msg;T t;public static <T> ResuUtil<T> success (T t) {return new ResuUtil<>(200,"成功",t);}public static <T> ResuUtil<T> fail (T t) {return new ResuUtil<>(500,"失败",t);}
}
pageUtil类
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;@Data
@AllArgsConstructor
@NoArgsConstructor
public class PageUtil {private Integer pageIndex = 1;private Integer pageSize = 3;
}
MP (mybatis-plus 官网代码快速生成)
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.generator.FastAutoGenerator;
import com.baomidou.mybatisplus.generator.config.OutputFile;
import com.baomidou.mybatisplus.generator.fill.Column;import java.util.Arrays;
import java.util.Collections;
import java.util.List;
public class MP {public static void main(String[] args) {FastAutoGenerator.create("jdbc:mysql:///test01","root","root")// 全局配置.globalConfig((scanner, builder) -> builder.author("hp").outputDir("D:\\Idea-web-vue2\\v2demo03\\web\\src\\main\\java\\"))// 包配置.packageConfig((scanner, builder) ->builder.parent("com.web").pathInfo(Collections.singletonMap(OutputFile.xml, "D:\\Idea-web-vue2\\v2demo03\\web\\src\\main\\resources\\mapper")))// 策略配置.strategyConfig((scanner, builder) -> builder.addInclude(getTables(scanner.apply("请输入表名,多个英文逗号分隔?所有输入 all"))).controllerBuilder().enableRestStyle().enableHyphenStyle().entityBuilder().enableLombok().addTableFills(new Column("create_time", FieldFill.INSERT)).build())/*模板引擎配置,默认 Velocity 可选模板引擎 Beetl 或 Freemarker.templateEngine(new BeetlTemplateEngine()).templateEngine(new FreemarkerTemplateEngine())*/.execute();// 处理 all 情况}protected static List<String> getTables(String tables) {return "all".equals(tables) ? Collections.emptyList() : Arrays.asList(tables.split(","));}
}
EmpMapper
public interface EmpMapper extends BaseMapper<Emp> {Page getAllsPage(Page page, Emp emp, Dept dept);@Select("select * from emp where ename = #{ename}")Integer getListByName(String ename);@Select("update emp set delid=#{delid} where id=#{id} ")Integer upDid(Integer delid,Integer id);
}
EmpMapper.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="com.web.mapper.EmpMapper"><resultMap id="result01" type="Emp" autoMapping="true"><id property="id" column="id"/><association property="dept" column="deptno" javaType="Dept" autoMapping="true"><id property="deptno" column="deptno"/></association></resultMap><select id="getAllsPage" resultMap="result01">select e.id,e.ename,e.birthday,e.hobby,e.sex,e.address,e.deptno,e.delid,d.deptno,d.dnamefrom emp e,dept d<where>e.deptno = d.deptno<if test="emp.ename != null and emp.ename != ''">and e.ename like concat ('%',#{emp.ename},'%')</if><if test="dept.deptno != null and dept.deptno != ''">and d.deptno = #{dept.deptno}</if></where>order by e.id desc</select>
</mapper>
IEmpService
public interface IEmpService extends IService<Emp> {Page getAllPage(PageUtil pageUtil, Emp emp, Dept dept);Integer getListByName(String ename);Integer upDid(Integer delid,Integer id);
}
EmpServiceImpl
@Service
public class EmpServiceImpl extends ServiceImpl<EmpMapper, Emp> implements IEmpService {@ResourceEmpMapper em;@Overridepublic Page getAllPage(PageUtil pageUtil, Emp emp, Dept dept) {Page page = new Page(pageUtil.getPageIndex(),pageUtil.getPageSize());return em.getAllsPage(page, emp, dept);}@Overridepublic Integer getListByName(String ename) {return em.getListByName(ename);}@Overridepublic Integer upDid(Integer delid, Integer id) {return em.upDid(delid, id);}
}
EmpController
@RestController
@RequestMapping("/emp")
@Api(tags = "员工信息")
public class EmpController {@ResourceIEmpService ies;@GetMapping("/page")@ApiOperation("查询员工全部信息并分页")@ApiImplicitParams(value = {@ApiImplicitParam(value = "页数页码",name = "pageUtil",paramType = "query"),@ApiImplicitParam(value = "员工姓名模糊查对象",name = "emp",paramType = "query"),@ApiImplicitParam(value = "部门名称模糊查对象",name = "dept",paramType = "query")})public ResuUtil getAllPage(PageUtil pageUtil, Emp emp, Dept dept) {System.out.println(emp);System.out.println(dept);return ResuUtil.success(ies.getAllPage(pageUtil,emp,dept));}@PostMapping("addOne")@ApiOperation("添加员工")@ApiImplicitParam(value = "员工信息",name = "emp",paramType = "body")public ResuUtil addEmp(@RequestBody Emp emp) {return ResuUtil.success(ies.saveOrUpdate(emp));}@GetMapping("/ename")@ApiOperation("判断重名")@ApiImplicitParam(value = "员工姓名",name = "ename",paramType = "query")public ResuUtil enameXX(String ename) {return ResuUtil.success(ies.getListByName(ename));}@PutMapping("/delid/{delid}/{id}")@ApiOperation("逻辑删除")public ResuUtil upDid(@PathVariable Integer delid,@PathVariable Integer id) {return ResuUtil.success(ies.upDid(delid, id));}
}
DeptController
@RestController
@RequestMapping("/dept")
@Api(tags = "部门信息")
public class DeptController {@ResourceIDeptService ids;@GetMapping()@ApiOperation("部门数据")public ResuUtil getAll() {return ResuUtil.success(ids.list());}}
前端
分页组件
<template><el-pagination@size-change="handleSizeChange"@current-change="handleCurrentChange":current-page="this.page.pageIndex":page-sizes="[3, 5, 7, 9]":page-size="this.page.pageSize"layout="total, sizes, prev, pager, next, jumper":total="this.list.total"></el-pagination>
</template><script>
export default {name: "PageComponent",props: ['page','list'],methods: {handleSizeChange(val) {this.$emit("getPage",{p:this.page.pageIndex,s:val})},handleCurrentChange(val) {this.$emit("getPage",{p:val,s:this.page.pageSize})},}
}
</script><style scoped></style>
HomeView
<template><div><el-button type="primary" size="mini" @click="add" style="float: left">新增</el-button><el-input style="width: 160px" v-model="emp.ename" placeholder="请输入员工姓名" clearable></el-input><el-select v-model="dept.deptno" placeholder="请选择员工部门" clearable><el-option v-for="i in this.deptList" :label="i.dname" :value="i.deptno"></el-option></el-select><el-button icon="el-icon-search" @click="init" circle></el-button><el-table:data="empList.records"borderstyle="width: 100%"><el-table-column type="index" :index="index" label="ID"></el-table-column><el-table-columnprop="id"label="员工编号"/><el-table-columnprop="ename"label="员工姓名"/><el-table-columnprop="birthday"label="出生日期"/><el-table-columnprop="hobby"label="爱好"/><el-table-columnprop="sex"label="性别"/><el-table-columnprop="address"label="住址"/><el-table-columnprop="dept.dname"label="部门"/><el-table-columnfixed="right"label="操作"width="100"><template slot-scope="scope"><el-switchv-model="scope.row.delid"active-color="#13ce66"inactive-color="#ff4949":active-value="0":inactive-value="1"@change="switchCh(scope.row)"></el-switch><el-button @click="edit(scope.row)" type="text" size="small" v-show="scope.row.delid === 0">修改</el-button></template></el-table-column></el-table><el-dialog :visible.sync="dialogFormVisible"><el-form :model="form" ref="form" :rules="rules"><!-- <el-form-item label="员工ID" prop="id">--><!-- <el-input v-model="form.id"/>--><!-- </el-form-item>--><el-form-item label="员工姓名" prop="ename"><el-input v-model="form.ename"/></el-form-item><el-form-item label="出生日期" prop="birthday"><el-date-pickertype="date"placeholder="选择日期"v-model="form.birthday":picker-options="pickerTime"style="width: 100%;"/></el-form-item><el-form-item label="爱好" prop="hobby"><el-checkbox-group v-model="form.hobby"><el-checkbox label="吃饭"/><el-checkbox label="睡觉"/><el-checkbox label="音乐"/><el-checkbox label="篮球"/></el-checkbox-group></el-form-item><el-form-item label="性别" prop="sex"><el-radio-group v-model="form.sex"><el-radio label="男"/><el-radio label="女"/></el-radio-group></el-form-item><el-form-item label="住址" prop="address"><el-cascaderv-model="form.address":options="options"@change="handleChange"clearable/></el-form-item><el-form-item label="部门" prop="deptno"><el-select v-model="form.deptno" placeholder="请选择部门" clearable><el-option v-for="i in this.deptList" :label="i.dname" :value="i.deptno"></el-option></el-select></el-form-item></el-form><div slot="footer" class="dialog-footer"><el-button @click="dialogFormVisible = false">取 消</el-button><el-button type="primary" @click="submitForm">确 定</el-button></div></el-dialog><my-page :page="pageUtil" :list="empList" @getPage="getPage"></my-page></div>
</template><script>export default {name: "HomeView",data() {return {pickerTime: {disabledDate(time) {return time.getTime() > (Date.now() - 567648000000)}},empList: [],deptList: [],dialogFormVisible: false,pageUtil: {pageIndex: 1,pageSize: 3,},emp: {},dept: {},form: {id: '',ename: '',birthday: '',hobby: [],sex: [],address: [],deptno: ''},rules: {ename: [{required: true, message: '请输入姓名', trigger: 'blur'},{min: 2, max: 8, message: '长度在 2 到 5 个字符', trigger: 'blur'}],birthday: [{required: true, message: '请输入出生日期', trigger: 'blur'},],sex: [{required: true, message: '请输入性别', trigger: 'array'},],address: [{required: true, message: '请选择住址', trigger: 'array'},],deptno: [{required: true, message: '请选择部门', trigger: 'blur'},]},options: [{value: '河北省',label: '河北省',children: [{value: '石家庄市',label: '石家庄市',children: [{value: '长安区',label: '长安区'}, {value: '桥东区',label: '桥东区'}, {value: '桥西区',label: '桥西区'}, {value: '新华区',label: '新华区'}]},{value: '唐山市',label: '唐山市',children: [{value: '路南区',label: '路南区'}, {value: '路北区',label: '路北区'}, {value: '古冶区',label: '古冶区'}, {value: '开平区',label: '开平区'}]},{value: '秦皇岛市',label: '秦皇岛市',children: [{value: '海港区',label: '海港区'}, {value: '山海关区',label: '山海关区'}, {value: '抚宁县',label: '抚宁县'}, {value: '复兴区',label: '复兴区'}]},{value: '邯郸市',label: '邯郸市',children: [{value: '广平县',label: '广平县'}, {value: '馆陶县',label: '馆陶县'}, {value: '魏县',label: '魏县'}, {value: '曲周县',label: '曲周县'}]}],},{value: '辽宁省',label: '辽宁省',children: [{value: '沈阳市',label: '沈阳市',children: [{value: '和平区',label: '和平区'}, {value: '沈河区',label: '沈河区'}, {value: '大东区',label: '大东区'}, {value: '皇姑区',label: '皇姑区'}]},{value: '大连市',label: '大连市',children: [{value: '中山区',label: '中山区'}, {value: '西岗区',label: '西岗区'}, {value: '沙河口区',label: '沙河口区'}, {value: '金州区',label: '金州区'}]},{value: '抚顺市',label: '抚顺市',children: [{value: '新抚区',label: '新抚区'}, {value: '露天区',label: '露天区'}, {value: '顺城区',label: '顺城区'}, {value: '抚顺县',label: '抚顺县'}]},{value: '辽阳市',label: '辽阳市',children: [{value: '白塔区',label: '白塔区'}, {value: '文圣区',label: '文圣区'}, {value: '宏伟区',label: '宏伟区'}, {value: '辽阳县',label: '辽阳县'}]}],},{value: '河南省',label: '河南省',children: [{value: '郑州市',label: '郑州市',children: [{value: '中原区',label: '中原区'}, {value: '二七区',label: '二七区'}, {value: '金水区',label: '金水区'}, {value: '中牟县',label: '中牟县'}]},{value: '开封市',label: '开封市',children: [{value: '龙亭区',label: '龙亭区'}, {value: '顺河回族区',label: '顺河回族区'}, {value: '鼓楼区',label: '鼓楼区'}, {value: '南关区',label: '南关区'}]},{value: '洛阳市',label: '洛阳市',children: [{value: '老城区',label: '老城区'}, {value: '西工区',label: '西工区'}, {value: '涧西区',label: '涧西区'}, {value: '郊区',label: '郊区'}]},{value: '南阳市',label: '南阳市',children: [{value: '宛城区',label: '宛城区'}, {value: '南召县',label: '南召县'}, {value: '方城县',label: '方城县'}, {value: '西峡县',label: '西峡县'}]}],},],}},methods: {switchCh(r) {const a = 0;const b = 1;if(r.delid === 0) {this.$confirm('此操作将永久删除该员工, 是否继续?', '提示', {confirmButtonText: '确定',cancelButtonText: '取消',type: 'warning'}).then(() => {this.$axios.put(`/emp/delid/${b}/${r.id}`);this.$message.success("删除成功");}).catch(() => {this.$message.info("已取消删除")r.delid = 0});}this.$confirm('此操作将恢复该员工, 是否继续?', '提示', {confirmButtonText: '确定',cancelButtonText: '取消',type: 'warning'}).then(() => {this.$axios.put(`/emp/delid/${a}/${r.id}`);this.$message.success("恢复成功");}).catch(() => {this.$message.info("已取消恢复")r.delid = 1});},submitForm() {this.$refs.form.validate(async (valid) => {if (valid) {const nu = await this.$axios.get(`/emp/ename?ename=${this.form.ename}`)console.log(nu)if (nu === null) {this.form.hobby = this.form.hobby.toString()this.form.address = this.form.address.toString()await this.$axios.post('/emp/addOne', this.form);await this.init();this.$message.success("添加成功")this.dialogFormVisible = false;}if (nu === 1) {this.$message.error("重名了请更改名字")}} else {this.$message.error("请检查填完了吗")return false;}});},handleChange(value) {console.log(value);},index(i) {return this.pageUtil.pageIndex * this.pageUtil.pageSize - this.pageUtil.pageSize + 1 + i},add() {this.form.id = '';this.form.ename = '';this.form.birthday = '';this.form.hobby = [];this.form.sex = [];this.form.address = [];this.form.deptno = '';this.dialogFormVisible = true},edit(row) {console.log(row);},getPage(page) {this.pageUtil.pageIndex = page.p;this.pageUtil.pageSize = page.s;this.init();},async init() {let params = {...this.pageUtil, ...this.emp, ...this.dept}this.empList = await this.$axios.get('/emp/page', {params: params})},async getDept() {this.deptList = await this.$axios.get('/dept');}},mounted() {this.init();},created() {this.getDept();}
}
</script><style scoped>
* {margin: 0;padding: 0;
}
</style>
相关文章:
Mybatis-Plus前后端分离多表联查模糊查询分页
数据准备 数据库配置: /*Navicat Premium Data TransferSource Server : localhost_3306Source Server Type : MySQLSource Server Version : 80100 (8.1.0)Source Host : localhost:3306Source Schema : test01Target Server Type : MySQLT…...
【Ruoyi管理后台】用户登录强制修改密码
近期有个需求,就是需要调整Ruoyi管理后台:用户如果三个月(长时间)未修改过密码,需要在登录时强制修改密码,否则不能登录系统。 一、后端项目调整 从需求来看,我们需要在用户表增加一个字段,用于标记用户最…...
计算机网络基础知识1
1、tcp三次握手? SYN,标志位,用于建立TCP连接的握手过程中的标志位。 ACK,确认位,用于说明整个包是确认报文。 TCP/IP协议是传输层的一个面向连接提供可靠安全的传输协议。第一次握手有客户端发起,客户端向…...
人机交互中的多/变尺度态势感知
人机交互是指在人与计算机之间进行信息交换和任务完成的过程中,通过各种界面和交互方式来实现人机之间的有效沟通和协作。多尺度上下文是人机交互中一个重要的概念,它指的是在不同层次或不同尺度的信息之间建立联系,以便更好地理解和处理信息…...
命名管道原理(和匿名管道的对比),mkfifo(命令行,函数),命名管道模拟实现代码+与多个子进程通信代码
目录 命名管道 引入 原理 和匿名管道的对比 使用 -- mkfifo 命令行指令 创建 文件类型p 使用 函数 函数原型 模拟实现 头文件 客户端代码 服务端代码 运行情况 模拟实现 -- 与多个子进程 介绍 服务端代码: 运行情况 命名管道 引入 匿名管道只能用于父子进程…...
pytest全局变量的使用
这里重新阐述下PageObject设计模式: PageObject设计模式是selenium自动化最成熟,最受欢迎的一种模式,这里用pytest同样适用 这里直接提供代码: 全局变量 conftest.py """ conftest.py 全局变量,主要实…...
FreeRTOS源码阅读笔记2--list.c
list.c中主要完成列表数据结构的操作,有列表和列表项的初始化、列表的插入和移除。 2.1列表初始化vListInitialise() 2.1.1函数原型 void vListInitialise( List_t * const pxList ) pxList:列表指针,指向要初始化的列表。 2.1.2函数框架…...
杂货铺 | citespace的使用
安装教程 【CiteSpace保姆级教程1】文献综述怎么写? 📚数据下载 1. 新建文件夹 2. 数据下载 知网高级检索 数据选中导出 :一次500 导出后重命名为download_xxx.txt,放到input文件里 3. 数据转换 把output里的数据复制到data里…...
C++ 静态成员变量初始化规则
每一天一个小trick!! 为什么静态成员不能在类内初始化? 在C中,类的静态成员(static member)必须在类内声明,在类外初始化,像下面这样。 class A { private: static int count …...
Docker安装、卸载,以及各种操作
docker是一个软件,是一个运行与linux和windows上的软件,用于创建、管理和编排容器;docker平台就是一个软件集装箱化平台,是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中…...
深入理解 C 语言的内存管理
文章目录 引言内存管理的重要性C语言内存布局C语言内存管理堆和栈内存的区别和用途内存分配和释放的过程C语言动态内存分配的概念和原因malloc()、calloc() 和 realloc() 等函数的使用悬挂指针和野指针内存泄漏和如何避免结论 引言 C语言是充满力量且灵活的编程语言࿰…...
利用Caddy实现http反向代理
利用Caddy实现http反向代理 1 Caddy是什么 Caddy是一个开源的,使用Golang编写的,支持HTTP/2的Web服务端。它的一个显著特征就是默认启用HTTPS。 和nginx类似。 2 多个后端服务 假如现在有3个后端http服务:分别在启动在 app1 http://10…...
【Qt之QVariant】使用
介绍 QVariant类类似于最常见的Qt数据类型的联合。由于C禁止联合类型包括具有非默认构造函数或析构函数的类型,大多数有趣的Qt类不能在联合中使用。如果没有QVariant,则QObject::property()和数据库操作等将会受到影响。 QVariant对象同时持有一个单一…...
xv6实验课程--xv6的写时复制fork(2023)
7. xv6实验课程--xv6的写时拷贝(COW)(2021) 7. xv6实验课程--xv6懒惰分页分配(lazy)(2020) 本文来源: https://mp.weixin.qq.com/s/XJkhjrlP232ZDsRyXd0oHQ 已完成的实验代码可以从下列网站获取: git clone https://gitee.com/lhwhit196…...
在Windows或Mac上安装并运行LLAMA2
LLAMA2在不同系统上运行的结果 LLAMA2 在windows 上运行的结果 LLAMA2 在Mac上运行的结果 安装Llama2的不同方法 方法一: 编译 llama.cpp 克隆 llama.cpp git clone https://github.com/ggerganov/llama.cpp.git 通过conda 创建或者venv. 下面是通过conda 创建…...
Spring底层原理学习笔记--第七讲--(初始化与销毁)
初始化与销毁 Spring提供了多种初始化和销毁手段它们的执行顺序 A07Application.java package com.lucifer.itheima.a07;import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springfram…...
基于斑马算法的无人机航迹规划-附代码
基于斑马算法的无人机航迹规划 文章目录 基于斑马算法的无人机航迹规划1.斑马搜索算法2.无人机飞行环境建模3.无人机航迹规划建模4.实验结果4.1地图创建4.2 航迹规划 5.参考文献6.Matlab代码 摘要:本文主要介绍利用斑马算法来优化无人机航迹规划。 1.斑马搜索算法 …...
干货 | 接口自动化测试分层设计与实践总结
接口测试三要素: 参数构造 发起请求,获取响应 校验结果 一、原始状态 当我们的用例没有进行分层设计的时候,只能算是一个“苗条式”的脚本。以一个后台创建商品活动的场景为例,大概流程是这样的(默认已经是登录状态下)&#…...
【Linux】服务器与磁盘补充知识,硬raid操作指南
服务器硬件 cpu 主板 内存 硬盘 网卡 电源 raid卡 风扇 远程管理卡 1.硬盘尺寸: 目前生产环境中主流的两种类型硬盘 3.5寸 和2.5寸硬盘 2.5寸硬盘可以通过使用硬盘托架后适用于3.5寸硬盘的服务器 但是3.5寸没法转换成2.5寸 2.如何在服务器上制作raid 华为服务器为例子做…...
【java】实现自定义注解校验——方法二
自定义注解校验的实现步骤: 1.创建注解类,编写校验注解,即类似NotEmpty注解 2.编写自定义校验的逻辑实体类,编写具体的校验逻辑。(这个类可以实现ConstraintValidator这个接口,让注解用来校验) 3.开启使用自定义注解进…...
接口测试中缓存处理策略
在接口测试中,缓存处理策略是一个关键环节,直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性,避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明: 一、缓存处理的核…...
【JavaEE】-- HTTP
1. HTTP是什么? HTTP(全称为"超文本传输协议")是一种应用非常广泛的应用层协议,HTTP是基于TCP协议的一种应用层协议。 应用层协议:是计算机网络协议栈中最高层的协议,它定义了运行在不同主机上…...
MySQL 8.0 OCP 英文题库解析(十三)
Oracle 为庆祝 MySQL 30 周年,截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始,将英文题库免费公布出来,并进行解析,帮助大家在一个月之内轻松通过OCP认证。 本期公布试题111~120 试题1…...
Linux 内存管理实战精讲:核心原理与面试常考点全解析
Linux 内存管理实战精讲:核心原理与面试常考点全解析 Linux 内核内存管理是系统设计中最复杂但也最核心的模块之一。它不仅支撑着虚拟内存机制、物理内存分配、进程隔离与资源复用,还直接决定系统运行的性能与稳定性。无论你是嵌入式开发者、内核调试工…...
[ACTF2020 新生赛]Include 1(php://filter伪协议)
题目 做法 启动靶机,点进去 点进去 查看URL,有 ?fileflag.php说明存在文件包含,原理是php://filter 协议 当它与包含函数结合时,php://filter流会被当作php文件执行。 用php://filter加编码,能让PHP把文件内容…...
【Linux】Linux安装并配置RabbitMQ
目录 1. 安装 Erlang 2. 安装 RabbitMQ 2.1.添加 RabbitMQ 仓库 2.2.安装 RabbitMQ 3.配置 3.1.启动和管理服务 4. 访问管理界面 5.安装问题 6.修改密码 7.修改端口 7.1.找到文件 7.2.修改文件 1. 安装 Erlang 由于 RabbitMQ 是用 Erlang 编写的,需要先安…...
ThreadLocal 源码
ThreadLocal 源码 此类提供线程局部变量。这些变量不同于它们的普通对应物,因为每个访问一个线程局部变量的线程(通过其 get 或 set 方法)都有自己独立初始化的变量副本。ThreadLocal 实例通常是类中的私有静态字段,这些类希望将…...
路由基础-路由表
本篇将会向读者介绍路由的基本概念。 前言 在一个典型的数据通信网络中,往往存在多个不同的IP网段,数据在不同的IP网段之间交互是需要借助三层设备的,这些设备具备路由能力,能够实现数据的跨网段转发。 路由是数据通信网络中最基…...
FOPLP vs CoWoS
以下是 FOPLP(Fan-out panel-level packaging 扇出型面板级封装)与 CoWoS(Chip on Wafer on Substrate)两种先进封装技术的详细对比分析,涵盖技术原理、性能、成本、应用场景及市场趋势等维度: 一、技术原…...
动态规划-1035.不相交的线-力扣(LeetCode)
一、题目解析 光看题目要求和例图,感觉这题好麻烦,直线不能相交啊,每个数字只属于一条连线啊等等,但我们结合题目所给的信息和例图的内容,这不就是最长公共子序列吗?,我们把最长公共子序列连线起…...
