销售宝系统_Day04(代码生成器)

模板技术

模板技术就是:数据+模板=输出文本

自己过代码来实现模板

  1. 首先创建一个hello.vm的文件
<html>
    <head></head>
    <body>
        ${name},你好啊!
    </body>
</html>
  1. 然后通过代码实现
package com.xpc.velocity;

import org.apache.velocity.Template;
import org.apache.velocity.VelocityContext;
import org.apache.velocity.app.VelocityEngine;
import org.junit.Test;

import java.io.FileWriter;

public class VelocityTest {
    @Test
    public void  test() throws Exception{
        //创建一个Velocity引擎
        VelocityEngine ve = new VelocityEngine();
        //获到到相应的模板
        Template template = ve.getTemplate("velocity/hello.vm","utf-8");
        //创建模板上下文(装数据的东西)
        VelocityContext velocityContext = new VelocityContext();
        velocityContext.put("name", "pc");
        //准备输出的位置
        FileWriter fileWriter = new FileWriter("velocity/hello.txt");
        //数据 + 模板 = 输入文本
        template.merge(velocityContext, fileWriter);
        
        fileWriter.close();
        //System.out.println(fileWriter.toString());
    }
}

最后就会生成以后如下图所示类容的hello.txt文件
在这里插入图片描述

在Idea中装一个EasyCode插件,就可以用模板技术做代码生成了

在这里插入图片描述

  • domain
##引入宏定义
$!define

##使用宏定义设置回调(保存位置与文件后缀)
#save("/main/java/com/xpc/domain", ".java")

##使用宏定义设置包后缀
#setPackageSuffix("domain")

##使用全局变量实现默认包导入
$!autoImport
import javax.persistence.*;

#*##使用宏定义实现类注释信息
#tableComment("实体类")*#
@Entity
@Table(name = "$!{tableInfo.obj.name}")
public class $!{tableInfo.name} extends BaseDomain {
    #*private static final long serialVersionUID = $!tool.serial();*#
#foreach($column in $tableInfo.otherColumn)
    #if(${column.comment})//${column.comment}#end

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

#foreach($column in $tableInfo.otherColumn)
##使用宏定义实现get,set方法
    #getSetMethod($column)
#end

}

- query

##定义初始变量
#set($tableName = $tool.append($tableInfo.name, "Query"))
##设置回调
$!callback.setFileName($tool.append($tableName, ".java"))
$!callback.setSavePath($tool.append($tableInfo.savePath, "/main/java/com/xpc/query"))

#if($tableInfo.savePackageName)package $!{tableInfo.savePackageName}.#{end}query;

##使用全局变量实现默认包导入
$!autoImport
import com.github.wenhao.jpa.Specifications;
import com.xpc.domain.${tableInfo.name};
import org.apache.commons.lang3.StringUtils;
import org.springframework.data.jpa.domain.Specification;

public class ${tableInfo.name}Query extends BaseQuery{

    private String name;

    @Override
    public Specification createSpec() {
        Specification<${tableInfo.name}> specification = Specifications.<${tableInfo.name}>and()
                .like(StringUtils.isNotBlank(name),"name", "%"+name+"%")
                .build();
        return specification;
    }


    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

- repository

##定义初始变量
#set($tableName = $tool.append($tableInfo.name, "Repository"))
##设置回调
$!callback.setFileName($tool.append($tableName, ".java"))
$!callback.setSavePath($tool.append($tableInfo.savePath, "/main/java/com/xpc/repository"))

#if($tableInfo.savePackageName)package $!{tableInfo.savePackageName}.#{end}repository;

##使用全局变量实现默认包导入
$!autoImport
import com.xpc.domain.${tableInfo.name};

public interface ${tableInfo.name}Repository extends BaseRepository<${tableInfo.name},Long>{

}

- service

##定义初始变量
#set($tableName = $tool.append("I",$tableInfo.name, "Service"))
##设置回调
$!callback.setFileName($tool.append($tableName, ".java"))
$!callback.setSavePath($tool.append($tableInfo.savePath, "/main/java/com/xpc/service"))

#if($tableInfo.savePackageName)package $!{tableInfo.savePackageName}.#{end}service;

##使用全局变量实现默认包导入
$!autoImport
import com.xpc.domain.${tableInfo.name};

public interface ${tableName} extends IBaseService<${tableInfo.name},Long> {

}

- serviceimpl

##定义初始变量
#set($tableName = $tool.append($tableInfo.name, "ServiceImpl"))
##设置回调
$!callback.setFileName($tool.append($tableName, ".java"))
$!callback.setSavePath($tool.append($tableInfo.savePath, "/main/java/com/xpc/service/impl"))

#if($tableInfo.savePackageName)package $!{tableInfo.savePackageName}.#{end}service.impl;

##使用全局变量实现默认包导入
$!autoImport
import com.xpc.domain.${tableInfo.name};
import com.xpc.repository.${tableInfo.name}Repository;
import com.xpc.service.I${tableInfo.name}Service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class ${tableName} extends BaseServiceImpl<${tableInfo.name},Long> implements I${tableInfo.name}Service {

    @Autowired
    private ${tableInfo.name}Repository ${tableInfo.obj.name}Repository;

}
  • controller
##定义初始变量
#set($tableName = $tool.append($tableInfo.name, "Controller"))
##设置回调
$!callback.setFileName($tool.append($tableName, ".java"))
$!callback.setSavePath($tool.append($tableInfo.savePath, "/main/java/com/xpc/web/controller"))

#if($tableInfo.savePackageName)package $!{tableInfo.savePackageName}.#{end}web.controller;

##使用全局变量实现默认包导入
$!autoImport
import com.xpc.common.JsonResult;
import com.xpc.common.UiPage;
import com.xpc.domain.${tableInfo.name};
import com.xpc.query.${tableInfo.name}Query;
import com.xpc.service.I${tableInfo.name}Service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
@RequestMapping("/${tableInfo.obj.name}")
public class ${tableInfo.name}Controller extends BaseController {
    @Autowired
    private I${tableInfo.name}Service ${tableInfo.obj.name}Service;

    @RequestMapping("/index")
    public String index() {
        //根据配置,这里会跳到/WEB-INF/views/${tableInfo.obj.name}/${tableInfo.obj.name}.jsp页面
        return "${tableInfo.obj.name}/${tableInfo.obj.name}";
    }

    @RequestMapping("/page")
    @ResponseBody
    public UiPage page(${tableInfo.name}Query query){
        Page page = ${tableInfo.obj.name}Service.findPageByQuery(query);
        UiPage uiPage =  new UiPage(page);
        return uiPage;
    }

    /**
     *ModelAttribute:路径访问Controller的每个方法,都会先执行它里面的代码
     */
    @ModelAttribute("edit${tableInfo.name}")
    public ${tableInfo.name} beforeEdit(Long id,String cmd){
        if(id!=null && "_update".equals(cmd)){
            //修改才执行这个代码
            ${tableInfo.name} db${tableInfo.name} = ${tableInfo.obj.name}Service.findOne(id);
            //解决n-to-n的问题,把关联对象设置为null
            //db${tableInfo.name}.setDepartment(null);
            return  db${tableInfo.name};
        }
        return null;
    }

    //添加
    @RequestMapping("/save")
    @ResponseBody
    public JsonResult save(${tableInfo.name} ${tableInfo.obj.name}){
        try {
            ${tableInfo.obj.name}Service.save(${tableInfo.obj.name});
            return new JsonResult();
        } catch (Exception e) {
            e.printStackTrace();
            return new JsonResult(false,e.getMessage());
        }
    }

    //修改
    @RequestMapping("/update")
    @ResponseBody
    public JsonResult update(@ModelAttribute("edit${tableInfo.name}")${tableInfo.name} ${tableInfo.obj.name}){
        try {
            ${tableInfo.obj.name}Service.save(${tableInfo.obj.name});
            return new JsonResult();
        } catch (Exception e) {
            e.printStackTrace();
            return new JsonResult(false,e.getMessage());
        }
    }
    /**
     * 删除功能,前台要求返回{success:true/false,msg:xxx}
     * @return
     */
    @RequestMapping("/delete")
    @ResponseBody
    public JsonResult delete(Long id){
        try {
            ${tableInfo.obj.name}Service.delete(id);
            return new JsonResult();
        } catch (Exception e) {
            e.printStackTrace();
            return new JsonResult(false,e.getMessage());
        }
    }
}

- test

##定义初始变量
#set($tableName = $tool.append($tableInfo.name,"Test"))
##设置回调
$!callback.setFileName($tool.append($tableName, ".java"))
$!callback.setSavePath($tool.append($tableInfo.savePath, "/test/java/com/xpc/service"))

#if($tableInfo.savePackageName)package $!{tableInfo.savePackageName}.#{end}service;

##使用全局变量实现默认包导入
$!autoImport
import com.xpc.BaseTest;
import com.xpc.domain.${tableInfo.name};
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;

import java.util.List;

public class ${tableName} extends BaseTest {
    @Autowired
    private I${tableInfo.name}Service i${tableInfo.name}Service;
    @Test
    public void  testFindAll(){
        List<${tableInfo.name}> list = i${tableInfo.name}Service.findAll();
        list.forEach(e-> System.out.println(e));
    }
}

-jsp

$!callback.setFileName($tool.append($tableInfo.obj.name, ".jsp"))
$!callback.setSavePath($tool.append($tableInfo.savePath, "/main/webapp/WEB-INF/views/${tableInfo.obj.name}"))

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>${tableInfo.obj.name}</title>
    <%--引入相应的css与js--%>
    <%@include file="/WEB-INF/views/head.jsp" %>
    <script src="/js/model/${tableInfo.obj.name}.js"></script>
</head>
<body>

 <%--pagination:分页条支持--%>
<table id="$!{tableInfo.obj.name}Grid" class="easyui-datagrid"
       data-options="url:'/$!{tableInfo.obj.name}/page',
       fitColumns:true,
       singleSelect:true,
       fit:true,
       pagination:true,
       toolbar:'#gridTools'" 
       enableHeaderClickMenu="true">
       <%--  enableHeaderClickMenu="true" 隐藏字段--%>
    <thead>
    <tr>
        <%-- sortable="true" 排序支持--%>
        #foreach($column in $tableInfo.otherColumn)
         <th data-options="field:'$!{column.name}',width:100" sortable="true">$!{column.name}</th>
        #end
    </tr>
    </thead>
</table>
<%--grid顶部工具栏--%>
<div id="gridTools" style="padding:5px;height:auto">
    <%--功能条--%>
    <div style="margin-bottom:5px">
        <a href="#" data-method="add" class="easyui-linkbutton" iconCls="icon-add" plain="true">添加</a>
        <a href="#" data-method="update" class="easyui-linkbutton" iconCls="icon-edit" plain="true">修改</a>
        <a href="#" data-method="del" class="easyui-linkbutton" iconCls="icon-remove" plain="true">删除</a>
    </div>
     <%--查询条--%>
    <form id="searchForm">
        名称: <input name="name" class="easyui-textbox" style="width:80px">
        <a href="#" data-method="search" class="easyui-linkbutton" iconCls="icon-search">查询</a>
    </form>
</div>

<%--添加与修改的表单对话框--%>
<div id="editDialog" class="easyui-dialog" title="功能编辑" style="width:400px;"
     data-options="iconCls:'icon-save',resizable:true,modal:true,closed:true">
    <form id="editForm" method="post">
        <input id="$!{tableInfo.obj.name}Id" type="hidden" name="id" />
        <table cellpadding="5">
             #foreach($column in $tableInfo.otherColumn)
            <tr>
                <td>$!{column.name}:</td>
                <td><input class="easyui-validatebox" type="text" name="$!{column.name}"
                           data-options="required:true"></input></td>
            </tr>
            #end
        </table>
    </form>
    <div style="text-align:center;padding:5px">
        <a href="javascript:void(0)" class="easyui-linkbutton" data-method="save">提交</a>
        <a href="javascript:void(0)" class="easyui-linkbutton" data-method="closeDialog">关闭</a>
    </div>
</div>
</body>
</html>

- js

$!callback.setFileName($tool.append($tableInfo.obj.name, ".js"))
$!callback.setSavePath($tool.append($tableInfo.savePath, "/main/webapp/js/model"))

$(function () {

    //1.获取常用的一些组件
    var ${tableInfo.obj.name}Grid = $("#${tableInfo.obj.name}Grid");
    var searchForm = $("#searchForm");
    var editDialog = $("#editDialog");
    var editForm = $("#editForm");

    //2.绑定相应的事件
    $("*[data-method]").on("click",function(){
        var methodName = $(this).data("method");
        window.itsource[methodName]();
    })


    itsource={
        //添加
        add(){
            //让密码框失效且隐藏起来
            $("*[data-edit]").show();
            $("*[data-edit] input").validatebox("enable");
            //1.清空form中的数据
            editForm.form("clear");
            //2.打开弹出框(居中)
            editDialog.dialog("center").dialog("open");
        },
        //修改
        update(){
            //1.获取到选中的那一行数据
            let row = ${tableInfo.obj.name}Grid.datagrid("getSelected");
            //2.如果没有选中,给出提示,后面的代码就不再执行了
            if(!row){
                $.messager.alert('警告','没选中,无法修改',"warning");
                return ;
            }
            //清空form中的数据
            editForm.form("clear");
            //让密码框失效且隐藏起来
            $("*[data-edit]").hide();
            $("*[data-edit] input").validatebox("disable");

            //把结果进行回显
            /**
             * 部门:<input name="department.id"
             * row:  department.id = 4 ->  "department.id"= 4
             */
           /* if(row.department){
                row["department.id"] = row.department.id;
            }*/
            editForm.form("load",row);
            //打开弹出框(居中)
            editDialog.dialog("center").dialog("open");

        },
        //保存功能
        save(){
            var url = "/${tableInfo.obj.name}/save";
            //获到id的值
            var ${tableInfo.obj.name}Id = $("#${tableInfo.obj.name}Id").val();
            if(${tableInfo.obj.name}Id){
                url = "/${tableInfo.obj.name}/update?cmd=_update";
            }
            //easyui的form提交
            editForm.form('submit', {
                //提交的路径
                url:url,
                //提交之前的操作
                onSubmit: function(){
                    // 做一些检查
                    // 返回false可以阻止提交;
                    return $(this).form('validate');
                },
                //data : {success:true/false,msg:xxx} -> 字符串
                success:function(data){
                    var result = JSON.parse(data);
                    if(result.success){
                        ${tableInfo.obj.name}Grid.datagrid("reload");
                    }else{
                        $.messager.alert('错误',`失败了, 原因是:${result.msg}`,"error");
                    }
                    //关闭弹出框
                    itsource.closeDialog();
                }
            });
        },
        //删除
        del(){
            //1.获取到选中的那一行数据
            let row = ${tableInfo.obj.name}Grid.datagrid("getSelected");
            //2.如果没有选中,给出提示,后面的代码就不再执行了
            if(!row){
                $.messager.alert('警告','没选中!',"warning");
                return ;
            }
            //3.如果选中,确定是否要执行删除
            $.messager.confirm('确认','您确认想要删除记录吗?',function(r){
                if (r){
                    //4.如果确定删除,把id传到后台,后台删除数据
                    $.get("/${tableInfo.obj.name}/delete",{id:row.id},function (result) {
                        //5.后台会返回 {success:true/false,msg:xxx}
                        //6.后台返回true:刷新数据  / 后台返回false:提示错误信息
                        if(result.success){
                            ${tableInfo.obj.name}Grid.datagrid("reload");
                        }else{
                            $.messager.alert('错误',`失败了 原因是:${result.msg}`,"error");
                        }
                    })

                }
            });

        },
        //查询
        search(){
            //serializeObject:拿到一个form中的所有数据,封装成json对象
            var params = searchForm.serializeObject();
            ${tableInfo.obj.name}Grid.datagrid("load",params);
        },
        //关闭窗口
        closeDialog(){
            editDialog.dialog("close");
        }
    }
})

完成以上模板之后就可以用插件一键生成了

在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值