接上一篇博客,收到朋友的反馈,在启动生成器的时候如果出现莫名的错误,去c盘删除掉codeManConfig文件夹,然后重新运行程序一般即可解决问题,可能是因为服务器带宽过低,网络不稳定造成的。好了,言归正传,有朋友建议生成的代码可以做excel工具类的抽取,之前是每个service里都有一个exportExcel的方法,没有过多考虑代码的简洁优美,今天对模板进行了优化,抽取出了controller,service,dao的公共接口,大大减少了代码的冗余,另外在模板的细节问题上做了一些优化调整,一起来看一下吧。
freemarker模板加入了baseController.ftl,IBaseService.ftl,baseService.ftl,IBaseDao.ftl,excelUtil.ftl,同时对home.ftl等页面模板做了微调,解压model.zip即可看到对应的变化,这里以home.ftl为例,调整部分如下:
<ul id="navHandler" class="nav nav-sidebar">
<li>
<a href="#" οnclick='TabControlAppend(0,"首页","/${projectName}/welcome",true)'>
<i class="icon icon-home"></i>
<span>网站首页</span>
</a>
</li>
<#assign n=1>
<#list tableNameList?keys as key>
<li>
<a href="javascript:void(0);">
<i class="icon icon-chart"></i>
<span>${tableNameList["${key}"]}模块管理</span>
</a>
<ul>
<li>
<a href="#" οnclick='TabControlAppend(${n},"${tableNameList["${key}"]}模块管理","/${projectName}/${key}/list")'>信息管理</a>
</li>
</ul>
</li>
<#assign n=n+1>
</#list>
</ul>
在这里遍历tableNameList,类型为map类型,key为英文的表名,value为中文表名,是一个非常典型的freemarker语法
后台对应源码大致如下:
public static Configuration configuration = new Configuration();
static {
try {
//这个其实就是c盘的codeManConfig文件夹,存放服务器下载的文件
String ftlPath = Constant.modelFiles;
ftlPath = URLDecoder.decode(ftlPath, "utf-8");
File file = new File(ftlPath);
if (!file.exists()) {
file.mkdir();
}
configuration.setDirectoryForTemplateLoading(file);
configuration.setDefaultEncoding("UTF-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
Template htmlTemplate = FreeMarkerConfig.configuration.getTemplate(CodeFtlConstant.html_ftl);
htmlTemplate.setEncoding("UTF-8");
Map<String, Object> root = new HashMap<String, Object>();
// html的路径
String htmlDir = FreeOutUtil.setProjectName(Constant.freeOutPath_templates, projectNameVal);
// 生成home页面和mvc配置文件使用
root.put(CodeConstant.tableNameList, ChildWindowConstant.currentTableCnNameMap);
Writer htmlOut = null;
htmlOut = new OutputStreamWriter(new FileOutputStream(
FreeOutUtil.checkAndMakeDir(outPathVal + htmlDir + currentTableName + "\\") + "list.html"),
"UTF-8");
htmlTemplate.process(root, htmlOut);
htmlOut.flush();
htmlOut.close();
好,不多说了,往后我会专门用一期博客来讲解生成器的实现思路以及核心代码。
然后,老生常谈,首页配置(版本号应该是1.76往后了,这里用的测试代码,预计今晚就能升级到最新的版本)
数据项配置,加入了数据表的中文名称,这样生成界面的时候就可以显示对应的中文了,另外加入了显示次序配置,用于设置页面上字段的显示顺序,按照升序进行设置即可,查询次序也做了调整,筛选数据较多的列数值设小,同样为升序,会自动根据次序生成优化后的sql
配置完毕后生成代码
导入eclipse查看生成的代码结构,跟以往不同的是,进行了公共基类的抽取,把增删查改相关的操作全部写入到了basexxx中,通过继承基类,实现基类接口减少代码冗余,同时excel导出相关的操作封装到了excelUtil当中
以BaseController为例,相信我们在做代码优化的时候都做过类似的处理,代码如下
public class BaseController {
public IBaseService service;
public BaseController(IBaseService service) {
this.service = service;
}
/**
* 查询
*
* @return
*/
@RequestMapping("/select")
public List<Map<String, Object>> select(@RequestBody Map<String, Object> map) {
return service.select(map);
}
/**
* 模糊查询
*
* @return
*/
@RequestMapping("/likeSelect")
public Map<String, Object> likeSelect(@RequestBody Map<String, Object> map) {
return service.likeSelect(map);
}
/**
* 更新
*
* @return
*/
@RequestMapping("/update")
public void update(@RequestBody Map<String, Object> map) {
service.update(map);
}
/**
* 添加
*
* @return
*/
@RequestMapping("/add")
public void add(@RequestBody Map<String, Object> map) {
service.add(map);
}
/**
* 删除
*
* @return
*/
@RequestMapping("/delete")
public void delete(@RequestBody Map<String, Object> map) {
service.delete(map);
}
/**
* 批量增加
*
* @return
*/
@RequestMapping("/batchAdd")
public void batchAdd(@RequestBody Map<String, List<Map<String, Object>>> map) {
service.batchAdd(map.get("list"));
}
/**
* 批量删除
*
* @return
*/
@RequestMapping("/batchDelete")
public void batchDelete(@RequestBody Map<String, List<Map<String, Object>>> map) {
service.batchDelete(map.get("list"));
}
/**
* 批量更新
*
* @return
*/
@RequestMapping("/batchUpdate")
public void batchUpdate(@RequestBody Map<String, List<Map<String, Object>>> map) {
service.batchUpdate(map.get("list"));
}
}
查看MedicinemsgController,代码如下:
@RestController
@RequestMapping("/medicinemsg")
public class MedicinemsgController extends BaseController {
@Autowired
public IMedicinemsgService service;
public MedicinemsgController(IMedicinemsgService service) {
super(service);
}
/**
* 导出excel
*
* @return
*/
@RequestMapping("/exportExcel")
public void exportExcel(HttpServletResponse response) {
service.exportExcel(response);
}
}
在这里把导出excel作为个性方法,如果需要加入其他个性方法,直接增加即可,这样对比以前,controller就变的简洁了很多,当然,本质上是一样的,只是代码看起来让人舒服
查看运行效果,信息字段排到了最后一位,说明显示顺序设置生效,模块名称也都正确显示了各自的中文名称
本次更新就到此结束了,主要是做了代码的优化处理以及细节方面的调整,生成的代码的健壮性和可复用性得到了较大提升。
链接:https://pan.baidu.com/s/1L5gP5sH3LFKA8ZPurPmGhQ
提取码:wxpp
csdn下载链接https://download.csdn.net/download/m0_37719874/11249186