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
AdminEAP的所有數據列表都是基於xml配置的,可支持反射接口查詢、sql配置的查詢、離線查詢(hql)。
3、重啓系統使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官網給我提意見。