EasyCode代码生成插件-模板分享(基于数据表生成MyBatisPlus格式的dao,service,controller和vue组件)

news2024/11/15 1:59:55

目录

概述

使用演示

模板代码 

  实体类pojo 

 表现层controller

业务层service接口

 业务层serviceImpl实现类

持久层dao

Vue组件 


 

概述

本片博客用于分享EasyCode的自定义模板(模板在篇末),用于简化开发,免去重复性的工作。

作用:

1.根据数据库表,后端生成基于MyBatisPlus结构下的实体类pojo,持久层dao,业务层service,表现层controller和前端vue实现增删改查功能的组件

2.表现层controller中生成基本增删改分页查询方法。

3.vue组件组件基于后端controller接口实现基本增删改查功能结构。

 

使用演示

操作前提: 

① 创建好一个springboot基本项目。

8aa319d84e5641748cd09fd04981da6c.png

 

 ② 导入数据源连接相关坐标

(mysql,mybatis-plus,druid, lombok,spring-boot-starter-web)。

 

 ③ 配置连接信息

 a7854617ead64eb7aecf84bc0fd59de5.png

④ 运行项目,查看是否启动成功

1385f54045d446f1940bd874b6a071d9.png

 

1.准备一张数据表 

2cfd287a704240228cf15fe3c1b7af56.png

在此用一张学生信息表做演示,为了生成可读性更好的代码最好写"表注释"。

2.在IntelliJ IDEA中下载EasyCode插件

2f9fd514fd754ffdbb31d81c181b2832.png

 3.ItelliJ IDEA 连接数据库 

7a77fa654abd49b4b2e47977d8d9565b.png

 19c15b025d9f4277b79bbbfe002ac3a8.png

 4.选择表,生成代码。

ab8fa7f255d248f980cb6774d383545c.png

 d697526be0514e1fa89cd6d8c5cbebef.png

可用多选数据表,一起生成。 

-- 弹窗勾选,点击ok。

 5b0c4c397d4f4ad1b9f8f853b8e3b641.png

 99f79b5592564df7beb1b3222d8365d3.png

至此,代码就生成完毕了。

** 但是,后端还缺少联调对象R,和分页拦截器的配置类没有生成,在下方会有提供。

请根据自身习惯放到目录结构中。

前端组件可以直接放到vue的项目中注册引用。

生成的前端组件展示

0f085b06731547fcb0ca4937b45069cf.png

总结:我们只需要有一张数据表,那么通过此插件和模板,就能够根据表字段自动生成MyBatisPlus格式的后端基本增删改分页查接口,以及生成一个前端增删改分页查可用的组件,简化了开发和减少了我们重复性的工作。 

模板代码 

如下两个类,请自己放到自定义目录文件中。一个是R.java,用于前后端数据联调的,一个是MyBatisPlusConfig.java,里面配置了分页拦截器,用于实现分页查询功能。

放到目录中哪问题不大,其他文件能引用即可。

 数据联调对象R 

@Data
public class R<T> {
        private Integer code; //编码:1成功,0和其它数字为失败

        private String msg; //错误信息

        private T data; //数据

        public static <T> R<T> success(T object) {
            R<T> r = new R<T>();
            r.data = object;
            r.code = 1;
            return r;
        }

        public static <T> R<T> error(String msg) {
            R r = new R();
            r.msg = msg;
            r.code = 0;
            return r;
        }
}

分页拦截器的配置

@Configuration
public class MyBatisPlusConfig {

    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor(){
        // 创建拦截器对象
        MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();
        // 添加分页拦截器
        mybatisPlusInterceptor.addInnerInterceptor(new PaginationInnerInterceptor());
        return mybatisPlusInterceptor;
    }
}

模板结构 (没有就创建,然后复制粘贴)

88a28c468add46d999170c26e508008a.png

  实体类pojo 

##导入宏定义
$!{define.vm}

##保存文件(宏定义)
#save("/pojo", ".java")

##包路径(宏定义)
#setPackageSuffix("pojo")

##自动导入包(全局变量)
$!{autoImport.vm}
import com.baomidou.mybatisplus.extension.activerecord.Model;
import java.io.Serializable;
import lombok.Data;

##表注释(宏定义)
#tableComment("表实体类")
@SuppressWarnings("serial")
@Data
public class $!{tableInfo.name} {
#foreach($column in $tableInfo.fullColumn)
    #if(${column.comment})//${column.comment}#end

    private $!{tool.getClsNameByFullName($column.type)} $!{column.name};
#end
}

 表现层controller

##导入宏定义
$!{define.vm}

##设置表后缀(宏定义)
#setTableSuffix("Controller")

##保存文件(宏定义)
#save("/controller", "Controller.java")

##包路径(宏定义)
#setPackageSuffix("controller")

##定义服务名
#set($serviceName = $!tool.append($!tool.firstLowerCase($!tableInfo.name), "Service"))

##定义实体对象名
#set($entityName = $!tool.firstLowerCase($!tableInfo.name))

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import $!{tableInfo.savePackageName}.pojo.$!tableInfo.name;
import $!{tableInfo.savePackageName}.service.$!{tableInfo.name}Service;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import java.io.Serializable;
import java.util.List;

##表注释(宏定义)
#tableComment("表控制层")
@RestController
@Slf4j
@CrossOrigin
@RequestMapping("/$!tool.firstLowerCase($!tableInfo.name)s")
public class $!{tableName} {
    /**
     * 服务对象
     */
    @Autowired
    private $!{tableInfo.name}Service $!{serviceName};

     /**
   * 分页查询
   * @param page 查询页数
   * @param size 一页显示条数
   * @return ·
   */
   @GetMapping("/page")
   public R<Page<$!{tableInfo.name}>> getAllByPage(int page, int size){
   	Page<$!{tableInfo.name}> $!tool.firstLowerCase($!tableInfo.name)Page = new Page<>(page, size);
   	LambdaQueryWrapper<$!{tableInfo.name}> queryWrapper = new LambdaQueryWrapper<>();
   	//TODO 查询条件定制
   
   	//执行查询
   	$!{serviceName}.page($!tool.firstLowerCase($!tableInfo.name)Page);
   	return R.success($!tool.firstLowerCase($!tableInfo.name)Page);
   }

    /**
     * 通过主键查询单条数据
     *
     * @param id 主键
     * @return 单条数据
     */
    @GetMapping("{id}")
    public R<$!tableInfo.name> selectOne(@PathVariable Serializable id) {
        return R.success(this.$!{serviceName}.getById(id));
    }

    /**
     * 新增数据
     *
     * @param $!entityName 实体对象
     * @return 新增结果
     */
    @PostMapping
    public R<String> insert(@RequestBody $!tableInfo.name $!entityName) {
        return R.success(this.$!{serviceName}.save($!entityName) + "");
    }

    /**
     * 修改数据
     *
     * @param $!entityName 实体对象
     * @return 修改结果
     */
    @PutMapping
    public R<String> update(@RequestBody $!tableInfo.name $!entityName) {
        return R.success(this.$!{serviceName}.updateById($!entityName) + "");
    }

    /**
     * 删除数据
     *
     * @param id 主键结合
     * @return 删除结果
     */
    @DeleteMapping("/{id}")
    public R<String> delete(@PathVariable("id") String id) {
        return R.success(this.$!{serviceName}.removeById(id) + "");
    }
}

业务层service接口

##导入宏定义
$!{define.vm}

##设置表后缀(宏定义)
#setTableSuffix("Service")

##保存文件(宏定义)
#save("/service", "Service.java")

##包路径(宏定义)
#setPackageSuffix("service")

import com.baomidou.mybatisplus.extension.service.IService;
import $!{tableInfo.savePackageName}.pojo.$!tableInfo.name;

##表注释(宏定义)
#tableComment("表服务接口")
public interface $!{tableName} extends IService<$!tableInfo.name> {

}

 业务层serviceImpl实现类

##导入宏定义
$!{define.vm}

##设置表后缀(宏定义)
#setTableSuffix("ServiceImpl")

##保存文件(宏定义)
#save("/service/impl", "ServiceImpl.java")

##包路径(宏定义)
#setPackageSuffix("service.impl")

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import $!{tableInfo.savePackageName}.dao.$!{tableInfo.name}Dao;
import $!{tableInfo.savePackageName}.pojo.$!{tableInfo.name};
import $!{tableInfo.savePackageName}.service.$!{tableInfo.name}Service;
import org.springframework.stereotype.Service;

##表注释(宏定义)
#tableComment("表服务实现类")
@Service
public class $!{tableName} extends ServiceImpl<$!{tableInfo.name}Dao, $!{tableInfo.name}> implements $!{tableInfo.name}Service {

}

持久层dao

##导入宏定义
$!{define.vm}

##设置表后缀(宏定义)
#setTableSuffix("Dao")

##保存文件(宏定义)
#save("/dao", "Dao.java")

##包路径(宏定义)
#setPackageSuffix("dao")

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import $!{tableInfo.savePackageName}.pojo.$!tableInfo.name;
import org.apache.ibatis.annotations.Mapper;
##表注释(宏定义)
#tableComment("表数据库访问层")
@Mapper
public interface $!{tableName} extends BaseMapper<$!tableInfo.name> {

}

Vue组件 

##导入宏定义
$!{define.vm}

##保存文件(宏定义)
#save("/vueConponent", "vueConponent.vue")
<!-- 基于$!{tableInfo.name}表的基础增删改查组件 -->
<template>
	<div id="container">
		<!-- 新增按钮 -->
		<el-button type="primary" @click="addRow">新增</el-button>
		<!-- 表格 -->
		<el-table :data="tableData" style="width: 100%" stripe>
			<el-table-column 
				v-for="(item, index) in tableTitle" 
				:key="index"
				:prop="item.prop"
				:label="item.label"
				>
			</el-table-column>
			
			<el-table-column label="操作">
				<template slot-scope="scope">
					<el-button type="text" @click="editRow(scope.$index, scope.row)">编辑</el-button>
					<el-button type="text" @click="deleteRow(scope.row)">删除</el-button>
				</template>
			</el-table-column>
		</el-table>
		<!-- 编辑/新增对话框 -->
		<el-dialog :visible.sync="dialogVisible" title="编辑/新增" @close="closeDialog">
			<el-form ref="form" :model="currentRow" :rules="formRules" label-width="80px">
				<el-form-item v-for="(item, index) in tableTitle"
							:key="index" 
							:rules="formRules"
							:label="item.label" 
							:prop="item.prop">
					<el-input v-model="currentRow[item.prop]"></el-input>
				</el-form-item>
			</el-form>
			<div slot="footer" class="dialog-footer">
				<el-button @click="closeDialog">取消</el-button>
				<el-button type="primary" @click="saveRow">保存</el-button>
			</div>
		</el-dialog>
		<!-- 分页组件 -->
		<el-pagination 
			@size-change="handleSizeChange" 
			@current-change="handleCurrentChange"
			:current-page.sync="currentPage" 
			:page-size="pageSize"
			layout="total, prev, pager, next" 
			:total="total">
		</el-pagination>
	</div>
</template>
<script>
	import axios from 'axios';
	export default {
		data() {
			return {
				// 表格标题
				tableTitle:[
		    #foreach($column in $tableInfo.fullColumn)
			   {prop:"$!{column.name}",label:"#if(${column.comment})${column.comment}#else$!{column.name} #end"},
			  #end
			],
				tableData: [], // 表格数据
				dialogVisible: false, // 新增/编辑框是否出现
				currentRow: {}, // 当前编辑的行数据
				// 分页组件相关数据
				//当前显示页
				currentPage: 1, 
				// 每页显示条数
				pageSize:10,
				// 总条数
				total:100,
				// 判断弹出的模态框是否是新增
				isAddFlag:false,
				// 表单校验规则-必填
				formRules: [
					{ required: true, message: '该字段不能为空', trigger: 'blur' }
				]
			};
		},
		mounted(){
			// 获取表格数据(分页查询)
			this.getTableData();
		},
		methods: {
			// 获取表格数据(分页查询)
			async getTableData(){
				// 封装请求参数
				// 拼接条件参数(默认查询第1页的10条数据)
				const param = `page=${this.currentPage}&size=${this.pageSize}`;
				const {data: {data: res}} = await axios.get("http://localhost:8066/$!{tool.firstLowerCase($!tableInfo.name)}s/page?" + param);
				this.tableData = res.records;
				this.total = res.total;
			},
			// 分页组件-改变size
			handleSizeChange(val) {
				this.pageSize = val;
				this.getTableData();
			},
			// 分页组件-改变page
			handleCurrentChange(val) {
				this.currentPage = val;
				this.getTableData();
			},
			// 添加按钮触发
			addRow() {
				this.isAddFlag = true;
				this.currentRow = {};
				this.dialogVisible = true;
			},
			// 编辑按钮触发
			editRow(index, row) {
				this.isAddFlag = false;
				this.currentRow = {
					...row
				};
				this.dialogVisible = true;
			},
			// 删除按钮触发
			async deleteRow(row) {
				if(!confirm("永久删除此条数据, 是否继续?")){
					this.$message({
						type: 'info',
						message: '已取消删除'
					});    
					return false;
				}
				// 确定删除,根据uid删除
				const res = await axios.delete("http://localhost:8066/$!{tool.firstLowerCase($!tableInfo.name)}s/" + row.uid)
				
				// TODO 自定义判断状态
				
				this.$message.success("删除成功!"); // 成功提示
				// 处理删除页最后一个数据不跳转上一页问题
				if(this.tableData.length - 1 == 0 && this.currentPage != 1){
					this.currentPage -= 1;
				}
				this.getTableData(); // 重新获取表格数据
			},
			// 关闭"新增/编辑框"
			closeDialog() {
				this.dialogVisible = false;
			},
			// 新增/编辑框内点击"保存"按钮
			async saveRow() {
			    // 验证表单,是否输入为空
				const valid = await this.$refs.form.validate();
				if (!valid) {
					return false;
				}
				// 判断当前模态框是否是"添加"模态框
				if(this.isAddFlag){
					// 添加逻辑
					const res = await axios.post("http://localhost:8066/$!{tool.firstLowerCase($!tableInfo.name)}s", this.currentRow);
					// TODO自定义判断返回,是否成功。
					
					this.$message.success("添加成功!"); // 成功提示。
					this.getTableData(); // 重新获取数据
					this.dialogVisible = false; // 关闭新增窗口
				}else{
					// 编辑逻辑
					const res = await axios.put("http://localhost:8066/$!{tool.firstLowerCase($!tableInfo.name)}s", this.currentRow);
					// TODO自定义判断返回,是否成功。
					
					this.$message.success("修改成功!"); // 成功提示。
					this.getTableData(); // 重新获取数据
					this.dialogVisible = false; // 关闭修改窗口
				}
			}
		}
	};
</script>

<style scoped>
	
</style>

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/673908.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SQL 基础语句

SQL 基础语句 DDL Data Definition Language 数据定义语言创建 create删除 drop修改 alter清空 truncate show tables ; --查看所有表&#xff1a; drop database db1; --删除数据库 create database db1 default character set utf8; --创建数据库 use databas…

【统信uos-server-20-1060e】-详细安装openGauss

【统信uos-server-20-1060e】-详细安装openGauss &#x1f53b; 前言&#x1f53b; 一、安装前准备&#x1f530; 1.1 openGauss安装包下载&#x1f530; 1.2 安装环境准备⛳ 1.2.1 硬件环境要求⛳ 1.2.2 软件环境要求⛳ 1.2.3 软件依赖要求⛳ 1.2.4 关闭操作系统防火墙、selin…

Redis 2023面试5题(四)

一、AOF 持久化&#xff08;Append Only File&#xff09;如何配置&#xff1f; AOF&#xff08;Append Only File&#xff09;持久化是 Redis 的一种持久化方式&#xff0c;它通过记录所有收到的写命令来保存数据。以下是一些关于如何配置 AOF 持久化的重要信息&#xff1a; …

Linux系统下使用移动硬盘或者U盘,如何挂载硬盘分区到Linux系统

本文目录 1、查看当前磁盘分区状态2、查看当前磁盘的挂载状态3、将磁盘挂载到指定目录下4、从文件系统里卸载磁盘 Linux系统里&#xff0c;除根目录以外&#xff0c;任何文件或者目录要想被访问&#xff0c;需要将其“关联”到根目录下的某个目录来实现&#xff0c;这种关联操作…

网络安全等级保护2.0 | 等保合规5件事

网络安全等级保护工作包括定级、备案、安全建设、等级测评、监督检查五个阶段。 1、定级 确认定级对象&#xff0c;参考《定级指南》等初步确认等级&#xff0c;组织专家评审&#xff0c;主管单位审核&#xff0c;公安机关备案审查。 备案 持定级报告和备案表等材料到公安机…

一文读懂openguass dcf网络模块

一文读懂openguass dcf网络模块 文章目录 一文读懂openguass dcf网络模块0. mec概要1. compress2. mec2.1 agent2.1.1 初始化agent2.1.2 agent执行 2.2 channel2.2.1 初始化channel2.2.2 连接channel 2.3 api2.4 func2.5 queue2.5.1 初始化2.5.2 运行2.5.1.1 接收消息入队2.5.1…

基于spss的多元统计分析 之 实例3(血压、胆固醇于心脏病关系的研究)(8/8)

血压、胆固醇于心脏病关系的研究 摘要 一般线性模型中的一种&#xff0c;即反应变量 (dependent variables)为二分类变量的回归分析&#xff0c;模型输出为变量取特定值的概率。 在进行二元Logistic回归分析时&#xff0c;通常会涉及3个步骤&#xff0c;分别是数据处理、卡方分…

自动化运维管理工具——Ansible

目录 一、概述 &#xff08;一&#xff09;特点 &#xff08;二&#xff09;工作特性 二、运行机制 三、安装 &#xff08;一&#xff09;配置源 &#xff08;二&#xff09;安装ansible &#xff08;三&#xff09;查看相关文件 &#xff08;四&#xff09;配置文件 …

如何统计网页访问量

目录 一、搭建Nginx服务 安装Nginx服务 第一步 关闭防火墙和安全机制 第二步 安装扩展包 第三步 安装Nginx和依赖环境 第四步 安装依赖包 第五步 创建一个用户和组 第六步 解包 第七步 进入Nginx目录下编译安装 第八步 进行编译 第九步 添加系统识别操作 第十步 检…

跟朋友撞offer怎么办?接了offer,下个月入职,结果老板面了我朋友,她已经入职了,我的offer还算数吗?...

职场上什么奇葩事都可能发生&#xff0c;跟朋友撞了offer是什么感受&#xff1f; 一位网友求助&#xff1a; 接了offer&#xff0c;正在和现公司谈判离职&#xff0c;下个月才能入职。结果老板面了其他人&#xff0c;正好是楼主认识的人&#xff0c;比楼主大十几岁。更尴尬的是…

浅谈C++|引用篇

目录 引入 一.引用的基本使用 (1)引用的概念&#xff1a; (2)引用的表示方法 (3)引用注意事项 (4)引用权限 二.引用的本质 三.引用与函数 (1)引用做函数参数 (2)引用做函数返回值 四.常量引用 五.引用与指针 引入 绰号&#xff0c;又称外号&#xff0c;是人的本名以外…

基于深度学习的目标检测的介绍(Introduction to object detection with deep learning)

物体检测的应用已经深入到我们的日常生活中&#xff0c;包括安全、自动车辆系统等。对象检测模型输入视觉效果(图像或视频)&#xff0c;并在每个相应对象周围输出带有标记的版本。这说起来容易做起来难&#xff0c;因为目标检测模型需要考虑复杂的算法和数据集&#xff0c;这些…

基于spss的多元统计分析 之 主成分分析(5/8)

实验目的&#xff1a; 1&#xff0e;掌握主成分分析的基本思想&#xff1b; 2&#xff0e;熟悉掌握SPSS软件进行主成分分析的基本操作&#xff1b; 3&#xff0e;利用实验指导的实例数据&#xff0c;上机熟悉主成分分析方法&#xff0e; 实验内容&#xff1a; 下表是我国2005年…

【C++篇】OOP中部分:继承和派生

友情链接&#xff1a;C/C系列系统学习目录 知识总结顺序参考C Primer Plus&#xff08;第六版&#xff09;和谭浩强老师的C程序设计&#xff08;第五版&#xff09;等&#xff0c;内容以书中为标准&#xff0c;同时参考其它各类书籍以及优质文章&#xff0c;以至减少知识点上的…

2023年05月份青少年软件编程Python等级考试试卷六级真题(含答案)

2023-05 Python六级真题 分数&#xff1a;100 题数&#xff1a;38 测试时长&#xff1a;60min 一、单选题(共25题&#xff0c;共50分) 1. 明明每天坚持背英语单词&#xff0c;他建立了英语单词错题本文件“mistakes.txt”&#xff0c;将每天记错的单词增加到该文件中&#x…

ROS:launch文件演示

目录 前言一、添加launch文件夹二、新建launch文件三、编辑launch内容四、 执行文件 前言 一个程序中可能需要启动多个节点&#xff0c;比如:ROS 内置的小乌龟案例&#xff0c;如果要控制乌龟运动&#xff0c;要启动多个窗口&#xff0c;分别启动 roscore、乌龟界面节点、键盘…

【数据分享】1929-2022年全球站点的逐日降雪深度数据(Shp\Excel\12000个站点)

气象数据是在各项研究中都经常使用的数据&#xff0c;气象指标包括气温、风速、降水、能见度等指标&#xff0c;说到气象数据&#xff0c;最详细的气象数据是具体到气象监测站点的数据&#xff01; 对于具体到监测站点的气象数据&#xff0c;之前我们分享过1929-2022年全球气象…

感应电动机起动动态计算(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

#家庭网络配置(华为路由与交换机)

#家庭网络配置 #三层交换机配置 #打开HDCP功能 #进入系统视图 <Huawei>system-view #关闭系统提示信息 [Huawei]undo info-center enable #打开DHCP 使能 [Huawei]dhcp enable #创建vlan 10 vlan 20 vlan 2 [Huawei]vlan batch 2 10 20 #进入 vlan 并配置ip 与 dhcp […

【机器学习】十大算法之一 “神经网络”

作者主页&#xff1a;爱笑的男孩。的博客_CSDN博客-深度学习,活动,python领域博主爱笑的男孩。擅长深度学习,活动,python,等方面的知识,爱笑的男孩。关注算法,python,计算机视觉,图像处理,深度学习,pytorch,神经网络,opencv领域.https://blog.csdn.net/Code_and516?typeblog个…