AdminEAP框架:基於AdminLTE的代碼生成器

AdminEAP框架首頁

AdminEAP爲是基於AdminLTE改造的後臺管理框架,包含了組件集成、CURD增刪改查、系統工具、工作流、系統權限與安全等基本的系統管理功能和各種交互demo,項目源碼已經在Github上開源,並部署到阿里雲。

Github : https://github.com/bill1012/AdminEAP

AdminEAP 官網: http://www.admineap.com

本文介紹使用freemarker模板,在AdminEAP框架下實現代碼生成器,以實現CURD功能的快速生成,藉助於代碼生成器,基礎的開發可以節約大量的時間,同時保持了編碼的一致性。

這裏寫圖片描述

使用步驟


下面以Generator實體爲例,介紹代碼生成器的使用

1、編寫實體類

編寫實體類,通過自定義註解Header聲明相關屬性

編寫實體類

Header爲自定義註解,開發者在建立外鍵關係時,可通過ManyToOne,也通過joinClass指定關聯的實體,dataSource指定了在編輯時,該屬性的數據來源,當爲字典時,指定爲字典父編碼,也可以指定一個url。

2、生成xml配置

啓動項目後,輸入queryId,實體名,業務名,點擊“加載配置“,彈出xml配置窗口,可在此配置窗口配置查詢xml

生成xml

AdminEAP的所有數據列表都是基於xml配置的,可支持反射接口查詢、sql配置的查詢、離線查詢(hql)。

3、重啓系統使xml配置生效

如果是首次生成xml文件(注意是文件,如果在已有的xml配置內容,則不需要重新,刷新系統即可,系統會讀取更新的xml)

配置xml

4、配置具體參數

輸入queryId,點擊”加載配置“後,系統讀取xml的配置,並回填所有的默認配置,包括要生成的文件,文件路徑等等,開發者也可以根據自己的需要更改參數配置。在界面右側是實體的屬性列表,開發者可以勾選數據再編輯時使用的控件類型,也可以勾選是是否作爲查詢條件,是否在編輯界面中維護等等。

配置具體參數

更具體配置說明,包含在今後的技術文檔(付費)中

5、根據freemarker模板生成代碼

從界面上收集好以上配置參數後,代碼生成器將這些參數給配置好的freemarker模板,生成相關的源代碼。

以下是控制器模板controller.html

package ${nameSpace}.controller;

import java.util.Date;

import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;

import com.alibaba.fastjson.JSON;
import com.cnpc.framework.base.entity.Dict;
import com.cnpc.framework.utils.StrUtil;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;

import com.cnpc.framework.base.service.BaseService;
import com.cnpc.framework.annotation.RefreshCSRFToken;
import com.cnpc.framework.annotation.VerifyCSRFToken;
import com.cnpc.framework.base.pojo.Result;
import ${className};

/**
* ${modelName}管理控制器
* @author jrn
* ${curTime?string("yyyy-MM-dd HH:mm:ss")}由代碼生成器自動生成
*/
@Controller
@RequestMapping("/${htmlPrefix}")
public class ${javaPrefix}Controller {

    @Resource
    <#if javaTypes?contains("service")>
    private ${javaPrefix}Service ${htmlPrefix}Service;
    <#else>
    private BaseService baseService;
    </#if>

    @RequestMapping(value="/list",method = RequestMethod.GET)
    public String list(){
        return "${businessPackage}/${htmlPrefix}_list";
    }

    @RefreshCSRFToken
    @RequestMapping(value="/edit",method = RequestMethod.GET)
    public String edit(String id,HttpServletRequest request){
        request.setAttribute("id", id);
        return "${businessPackage}/${htmlPrefix}_edit";
    }

    @RequestMapping(value="/detail",method = RequestMethod.GET)
    public String detail(String id,HttpServletRequest request){
        request.setAttribute("id", id);
        return "${businessPackage}/${htmlPrefix}_detail";
    }

    @RequestMapping(value="/get/{id}",method = RequestMethod.POST)
    @ResponseBody
    public ${javaPrefix} get(@PathVariable("id") String id){
        return <#if javaTypes?contains("service")>${htmlPrefix}Service<#else>baseService</#if>.get(${javaPrefix}.class, id);
    }

    @VerifyCSRFToken
    @RequestMapping(value="/save")
    @ResponseBody
    <#assign isObj=1>
    <#list fields as field>
        <#if field.columnName?contains(".")>
            <#assign isObj=0>
        </#if>
    </#list>
    public Result save(<#if isObj=1>${javaPrefix} ${htmlPrefix}<#else>String obj</#if>){
        <#if isObj=0>
        ${javaPrefix} ${htmlPrefix}= JSON.parseObject(obj,${javaPrefix}.class);
        <#list fields as field>
        <#if field.columnName?contains(".")>
            <#assign fieldName=field.columnName?substring(0,field.columnName?index_of("."))>
            <#assign fieldN=fieldName?substring(0,1)?upper_case+fieldName?substring(1)>
        ${htmlPrefix}.set${fieldN}(<#if javaTypes?contains("service")>${htmlPrefix}Service<#else>baseService</#if>.get(${field.type}.class,${htmlPrefix}.get${fieldN}().getId()));
        </#if>
        </#list>
        </#if>
        if(StrUtil.isEmpty(${htmlPrefix}.getId())){
        <#if dateFields?exists&&(dateFields?size>0)>
            <#list dateFields as date>
            ${date};
            </#list>
        </#if>
            <#if javaTypes?contains("service")>${htmlPrefix}Service<#else>baseService</#if>.save(${htmlPrefix});
        }
        else{
        <#if leftFields?exists&&(leftFields?size>0)>
            ${javaPrefix} ${htmlPrefix}_old=<#if javaTypes?contains("service")>${htmlPrefix}Service<#else>baseService</#if>.get(${javaPrefix}.class,${htmlPrefix}.getId());
            BeanUtils.copyProperties(${htmlPrefix},${htmlPrefix}_old, <#list leftFields as str><#if str_index==0>"${str}"<#else>,"${str}"</#if></#list>);
            <#if leftDates?exists&&(leftDates?size>0)>
                <#list leftDates as ld>
             ${ld};
                </#list>
            </#if>
            ${htmlPrefix}_old.setUpdateDateTime(new Date());
            <#if javaTypes?contains("service")>${htmlPrefix}Service<#else>baseService</#if>.update(${htmlPrefix}_old);
            <#else>
            ${htmlPrefix}.setUpdateDateTime(new Date());
            <#if javaTypes?contains("service")>${htmlPrefix}Service<#else>baseService</#if>.update(${htmlPrefix});
            </#if>
        }
        return new Result(true);
    }

    @RequestMapping(value="/delete/{id}",method = RequestMethod.POST)
    @ResponseBody
    public Result delete(@PathVariable("id") String id){
        ${javaPrefix} ${htmlPrefix}=this.get(id);
        try{
            baseService.delete(${htmlPrefix});
            return new Result();
        }
        catch(Exception e){
            return new Result(false,"該數據已經被引用,不可刪除");
        }
    }

}

6、修改生成的代碼並重啓系統查看效果

開發者根據需要修改生成的代碼,並重啓系統,查看效果,如果需要分配權限,請先將生成的菜單功能授權,纔可有相應的菜單。

代碼生成器-列表

代碼生成-編輯

通過代碼生成生成了一個業務功能的CURD操作。

7、總結

以上操作步驟,在開發環境使用,在項目中使用代碼生成器的主要工作量在編寫實體,兩次重啓系統(如果在之前xml追加內容,則是一次重啓)上,其餘採用默認配置即可。

歡迎大家使用AdminEAP框架,如有意見建議請登錄AdminEAP官網給我提意見。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章