我是靠谱客的博主 闪闪高跟鞋,最近开发中收集的这篇文章主要介绍使用freemarker生成后台编号,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

此文章基于Springboot
1,导入freemarker

<!-- https://mvnrepository.com/artifact/org.freemarker/freemarker -->
<dependency>
    <groupId>org.freemarker</groupId>
    <artifactId>freemarker</artifactId>
    <version>2.3.30</version>
</dependency>

2,编写一个properties,freemarker.properties
里面内容

Customer=KF\$\{.now?string\('yyyyMMdd'\)\}\$\{f.rndInt\(6\)\}
``
这里使用\转义,是因为${}占位符没有引用会导致项目启动不起来,但是这里有个问题,就是用\转义出来使用@value获取的值有个,这就很拉跨,可能是我自己很拉跨,找不到properties转义的规则。
.now?string('yyyyMMdd') 是freemarker的内置函数 f.rndInt(6)是自己写的一个freemarker函数指令

3,创建FreeMarkerConfig 配置文件,创建函数指令

@Configuration
public class FreeMarkerConfig {

	/**
	 * BeansWrapper
	 */
	public static final BeansWrapper DEFAULT_BEANS_WRAPPER = new BeansWrapperBuilder(freemarker.template.Configuration.VERSION_2_3_30).build();

	@Autowired
	protected freemarker.template.Configuration configuration;

	/**
	 * 添加自定义标签
	 */
	@PostConstruct
	public void setSharedVariable() {
		SimpleHash hash = new SimpleHash(DEFAULT_BEANS_WRAPPER);
		hash.put("f", new FunCommons());

		try {
			configuration.setAllSharedVariables(hash);
		} catch (TemplateModelException e) {
			e.printStackTrace();
		}
	}
}

这里需要注意的是,在freemarker官网中明确指出,在高版本中,需要明确指明version

public class FunCommons {
    /**
     * 随机指定长度的数字
     *
     * @param len 长度
     * @return
     */
    public synchronized String rndInt(int len) {
        String random = Tools.rndStr(len, Tools.NUMBERS);
        return random;
    }
}

随机数自己随便写,但是不要太随便哈,注意前面.now?string(‘yyyyMMdd’)使用的是年月日+6位随机也是极容易碰撞的。
4,写一个解析字符串(必须是符合freemarker语法的)的类

@Component
public class FreeMarkerProvider {
    @Autowired
    protected Configuration configuration;

    /**
     * 解析字符串模板
     *
     * @param template 字符串模板
     * @return 解析后内容
     */
    public String process(String template) throws IOException, TemplateException {
        Environment e =Environment.getCurrentEnvironment();
        return process(template, e != null ? e.getDataModel() : null);
    }

    /**
     * 解析字符串模板
     *
     * @param template 字符串模板
     * @param model    数据
     * @return 解析后内容
     */
    public String process(String template, Object model) throws IOException, TemplateException {
        Configuration configuration = this.configuration;
        return process(template, model, configuration);
    }

    /**
     * 解析字符串模板
     *
     * @param template      字符串模板
     * @param model         数据
     * @param configuration 配置
     * @return 解析后内容
     */
    public String process(String template, Object model, Configuration configuration) throws IOException, TemplateException {
        if (template == null) {
            return null;
        }
        StringWriter out = new StringWriter();
        new Template("template", new StringReader(template), configuration != null ? configuration : this.configuration).process(model, out);
        return out.toString();
    }

}
@Component
public class GenerateSnUtils {

    @Autowired
    private GenerateSnConfiig generateSnConfiig;

    @Autowired
    private FreeMarkerProvider freeMarkerProvider;

    /**
     * 生成编号
     **/
    private String generate(String name) {
        try {
            String str = StringUtils.replaceAll(name);
            String process = freeMarkerProvider.process(str);
            return process;
        } catch (TemplateException e) {
            throw new CommonJsonException(e.getMessage());
        } catch (IOException e) {
            throw new CommonJsonException(e.getMessage());
        }
    }

    /**
     * 返回编号
     **/
    public String generateSn(Class<?> modelClass) throws IOException, TemplateException {
        String process = null;
        String name = modelName(modelClass);
        switch (name) {
            case "your tableName":
                process = generate(generateSnConfiig.getCustomer());
                break;
        }
        return process;
    }

    /**
     * 获取实体类的表名
     **/
    public String modelName(Class<?> modelClass) {
        TableName annotation = modelClass.getAnnotation(TableName.class);
        return annotation.value();
    }
}

5,使用方法

public abstract class BaseController{
@Autowired
    private GenerateSnUtils generateSnUtils;
	 /**
     * 根据类名生成编号
     *
     * @return
     */
    public String generateSn(Class<?> className) {
        try {
            String sn = generateSnUtils.generateSn(className);
            return sn;
        } catch (TemplateException e) {
            throw new CustomException(e.getMessage());
        } catch (IOException e) {
            throw new CustomException(e.getMessage());
        }
    }
}

6,调用

@RestController
@RequestMapping("/mumu")
public class IndexController extends BaseController{
@RequestMapping("/index")
public AjaxResult index(Role role){
//1 String sn=generateSn(User.class);
//2 String sn=generateSn(role.getClass())
}
}

最后

以上就是闪闪高跟鞋为你收集整理的使用freemarker生成后台编号的全部内容,希望文章能够帮你解决使用freemarker生成后台编号所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(61)

评论列表共有 0 条评论

立即
投稿
返回
顶部