[java] springboot代码生成器——公共基类抽取,模板细节优化(持续更新)

接上一篇博客,收到朋友的反馈,在启动生成器的时候如果出现莫名的错误,去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

发布了26 篇原创文章 · 获赞 99 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/m0_37719874/article/details/96118067
今日推荐