什么是freemarker
FreeMarker是一个用Java语言编写的模板引擎,它基于模板来生成文本输出。FreeMarker与Web容器无关,即在Web运行时,它并不知道Servlet或HTTP。它不仅可以用作表现层的实现技术,而且还可以用于生成XML,JSP或Java 等。
添加依赖
<!-- https://mvnrepository.com/artifact/org.freemarker/freemarker -->
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
<version>2.3.23</version>
</dependency>
FreeMarkerUtil工具类:
import com.huaxia.entity.News;
import com.huaxia.entity.User;
import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;
import javax.servlet.http.HttpServletRequest;
import java.io.*;
import java.util.HashMap;
import java.util.Locale;
import java.util.Map;
/**
* 创建人: leon
* 创建时间: 2014年11月28日 上午10:07:51
* 类描述:Freemarker的工具类
*/
public class FreemarkerUtil {
/**
* 通过指定的名字获取相应的模板
* @param fileName
* @return
*/
public Template getTemplate(HttpServletRequest request,String fileName) {
try {
Configuration cfg = new Configuration();
cfg.setOutputEncoding("UTF-8");
cfg.setDefaultEncoding("UTF-8");// 编码设置1
cfg.setEncoding(Locale.CHINA, "UTF-8");
//设定读取ftl模板文件的目录
//cfg.setClassForTemplateLoading(this.getClass(), "/template"); //读取src目录下
cfg.setServletContextForTemplateLoading(request.getSession().getServletContext(), "/template"); //读取webroot目录下
//在模板文件目录中找到名称为name的文件,并加载为模板
Template template = cfg.getTemplate(fileName);
template.setEncoding("UTF-8");// 编码设置2
return template;
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
/**
* 通过指定的文件目录和文件名生成相应的文件
* @param fileDir
* @param fileName
*/
public Boolean printToFile(Template template,String fileDir,String fileName,Map<String,Object> root) {
boolean done = false;
Writer writer = null;
try {
//判断多级目录是否存在,不存在则一级级创建
String[] paths = fileDir.split("\\\\");//注意:此处“\\”是错误的,必须要“\\\\”才能分割字符串
String dir = paths[0];
for (int i = 1; i < paths.length; i++) {
dir = dir + File.separator + paths[i];
File file=new File(dir.toString());
if (!file.exists()) {
file.mkdir();
}
}
//创建输出流
File file = new File(fileDir +File.separator+ fileName);
//设置生成的文件编码为UTF-8
//服务器不支持UTF-8格式HTML时候使用ANSI格式HTML文件,即系统默认编码
writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file),"UTF-8")); // 编码设置3
//writer = new FileWriter(fileDir +File.separator+ fileName);
//输出模板和数据模型都对应的文件
template.process(root, writer);
done = true;
} catch (IOException e) {
e.printStackTrace();
} catch (TemplateException e) {
e.printStackTrace();
} finally {
try {
if(writer!=null){
writer.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
return done;
}
/**
* 通过传入的请求和新闻信息重新生成html文件
* @param news //新闻实体类
* @param request //请求
* @param user //用户
* @return
*/
public boolean genenateHtml(News news,HttpServletRequest request,User user) {
String fileName = news.getFileName();
Map<String, Object> root = new HashMap<String, Object>();
root.put("id", news.getId());
root.put("title", news.getTitle());
root.put("create_date", news.getCreateDate());
root.put("creator", news.getCreator());
root.put("content", ClobUtil.ClobToString(news.getContent()));
root.put("fileName", news.getUploadFile()==null?"":news.getUploadFile());
FreemarkerUtil freemarkerUtil = new FreemarkerUtil();
Template template = null;
template = freemarkerUtil.getTemplate(request, "news.ftl");//新闻发布系统的freemarker模板
String htmlDir = news.getDir();
boolean done = printToFile(template, htmlDir, fileName, root);
return done;
}
}
MT实战
package cn.maitian.maimai.system.web.action;
import java.io.IOException;
import java.io.InputStream;
import java.util.Arrays;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.support.DefaultMultipartHttpServletRequest;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import cn.maitian.bss.duty.privilege.utils.SpringContextHolder;
import cn.maitian.maimai.core.base.bean.MethodCallBack;
import cn.maitian.maimai.core.base.vo.FileUploadVo;
import cn.maitian.maimai.core.base.web.BaseAction;
import cn.maitian.maimai.core.util.AppDatePattern;
import cn.maitian.maimai.core.util.AppDateUtil;
import cn.maitian.maimai.core.util.AppFileUploadUtils;
import cn.maitian.maimai.core.util.AppPropPublicUtil;
import cn.maitian.maimai.core.util.AppPropUtil;
import cn.maitian.maimai.core.util.AppStringUtils;
import cn.maitian.maimai.core.util.FreeMarkertUtil;
import cn.maitian.maimai.core.util.ImageBase64Utils;
import cn.maitian.maimai.system.model.SysContacts;
import cn.maitian.maimai.system.service.SysContactsIService;
import cn.maitian.maimai.system.vo.AppDataShareVo;
import cn.maitian.stat.service.CallProcedureIService;
import cn.maitian.webx.web.annotation.Read;
import cn.maitian.webx.web.data.Scope;
import cn.maitian.webx.web.data.WebxWebData;
/**
* H5链接跳转
* */
public class AppForHtmlFiveAction extends BaseAction {
private SysContactsIService sysContactsIService;
/**
* 用户数据分享活动
*/
private static final String PER_DATA_SHARE = "{call PER_DATA_SHARE (?,?)}";
/**
* 数据分享模板
*/
private static final String DATA_SHARE_INFO_FTL = "dataShareInfo.ftl";
/**
* 业务类型, 1-数据分享
*/
private static final String BUSINESS_TYPE_DATA_SHARE = "1";
/**
* 文件扩展名称 -html
*/
private static final String FILE_EXT_NAME_HTML = ".html";
/**
* 文件扩展名称 -Pic
*/
private static final String FILE_EXT_NAME_PIC = ".jpg";
/**
* 数据分享 链接跳转H5
*
* @param userId 用户Id
* @param source 业务来源(Loading-1、轮播图-2)
* @return String /maimai/appForHtmlFiveAction.do?method=dataShareInfo&source=&userId=
*/
public String dataShareInfo(@Read(key = "userId") final String userId, @Read(key = "source") final String source) {
long begTime = System.currentTimeMillis();
logger.error("--->>>---数据分享 链接跳转H5---<<<---userId:" + userId);
JSONArray reqParam = new JSONArray();
JSONObject jo = new JSONObject();
jo.put("userId", userId);
reqParam.add(jo);
// 查询用户数据分享页数据
AppDataShareVo adsv = findUserShareData(userId);
adsv.setSource(source);
getAttributeUtil().setAttribute("vo", Scope.REQUEST, adsv);
long endTime = System.currentTimeMillis();
logger.error("--- 数据分享 链接跳转H5---dataShareInfo---method out---> {" + (endTime - begTime) + "}");
return "dataShareInfo";
}
/**
* 去分享并生成静态页面
*
* @param userId 用户Id
* @return String
*/
public String toDataSharePage(@Read(key = "userId") final String userId) {
long begTime = System.currentTimeMillis();
Map<String, Object> result = new HashMap<String, Object>();
// 查询用户数据分享页数据
AppDataShareVo adsv = findUserShareData(userId);
String jsonString = JSON.toJSONString(adsv);
String basePath = AppPropUtil.getPropValue(AppPropUtil.Keys.FILE_UPLOAD_HTTP);
String staticPageUploadPath = AppPropPublicUtil.getPropValue(AppPropPublicUtil.Keys.STATIC_PAGE_UPLOAD_PREFIX);
String fileName = getDatePath(userId, BUSINESS_TYPE_DATA_SHARE, FILE_EXT_NAME_HTML);
String fileOutUrl = basePath + staticPageUploadPath + "/" + userId;
String picPrefix = AppPropUtil.getPropValue(AppPropUtil.Keys.DOWNLOAD_FILE_HTTP);
String fullPath = picPrefix + staticPageUploadPath + "/" + userId + "/" + fileName;;
// 生成静态页面
FreeMarkertUtil.processTemplate(DATA_SHARE_INFO_FTL, JSON.parseObject(jsonString), fileOutUrl, fileName);
result.put("file", fullPath);
result.put("success", "true");
renderText(dataToJson(result));
long endTime = System.currentTimeMillis();
logger.error("--- 去分享并生成静态页面---toDataSharePage---method out---> {" + (endTime - begTime) + "}");
return null;
}
/**
* 数据分享上传生成的图片
*
* @param userId 用户Id
* @return String
*/
public String uploadDataSharePic(@Read(key = "userId") final String userId) {
Map<String, Object> result = new HashMap<String, Object>();
try {
HttpServletRequest request = WebxWebData.getStrutsWebData().getRequest();
boolean isMultipart = ServletFileUpload.isMultipartContent(request);
if (!isMultipart) {
result.put("success", "false");
renderText(dataToJson(result));
return null;
}
DefaultMultipartHttpServletRequest dmhsr = (DefaultMultipartHttpServletRequest) request;
Map<String, MultipartFile> map = dmhsr.getFileMap();
MultipartFile cmf = map.get("file");
if (cmf.getOriginalFilename().contains(".")) {
String fileName[] = cmf.getOriginalFilename().split("\\.");
String sux = fileName[fileName.length - 1];
if (!"jpg".equalsIgnoreCase(sux) && !"png".equalsIgnoreCase(sux)
&& !"JPEG".equalsIgnoreCase(sux) && !"bmp".equalsIgnoreCase(sux)) {
result.put("success", "false");
renderText(dataToJson(result));
return null;
}
}
List<FileUploadVo> vos = getFileUploadVos();
FileUploadVo fuv = vos.get(0);
InputStream ins = fuv.getInputStream();
String fileName = getDatePath(userId, BUSINESS_TYPE_DATA_SHARE, FILE_EXT_NAME_PIC);
// 文件上传
String uploadResult = null;
try {
uploadResult = AppFileUploadUtils.uploadDataSharePic(ins, fileName, userId);
} catch (IOException e) {
result.put("success", "false");
renderText(dataToJson(result));
return null;
}
String picPrefix = AppPropUtil.getPropValue(AppPropUtil.Keys.DOWNLOAD_FILE_HTTP);
String fullPath = picPrefix + uploadResult;
result.put("file", fullPath);
result.put("success", "true");
renderText(dataToJson(result));
return null;
} catch (Exception e) {
result.put("success", "false");
renderText(dataToJson(result));
return null;
}
}
/**
* 查询用户数据分享页数据
*
* @return String
*/
private AppDataShareVo findUserShareData(String userId) {
SysContacts sc = sysContactsIService.findById(userId);
CallProcedureIService callProcedureIService = SpringContextHolder.getBean(CallProcedureIService.class);
List<String> params = Arrays.asList(sc.getOldUserId().toString());
long begTime = System.currentTimeMillis();
List<Map<String, Object>> callProcedureResult = callProcedureIService.getCallProcedureResult(PER_DATA_SHARE,
params);
long endTime = System.currentTimeMillis();
logger.error("---存储过程查询耗时---PER_DATA_SHARE---method out---> {" + (endTime - begTime) + "}");
AppDataShareVo adsv = new AppDataShareVo();
adsv.setUserId(userId);
adsv.setMobile(sc.getMobile());
String webServerUrl = AppPropUtil.getPropValue(AppPropUtil.Keys.DOWNLOAD_FILE_HTTP);
String dataSharePicPath = AppPropPublicUtil.getPropValue(AppPropPublicUtil.Keys.DEFAULT_DATA_SHARE_PIC_URL);
adsv.setDataSharePicPath(webServerUrl+dataSharePicPath);
String brokerHeadUrl = AppPropUtil.getPropValue(AppPropUtil.Keys.ZX_BROKER_HEAD_IMG_URL)+sc.getOldUserId();
adsv.setBreakHeadPath(brokerHeadUrl);
//h5点击分享生成图片时,存在跨域问题,此处转码
String path = ImageBase64Utils.imageNetToBase64(brokerHeadUrl);
if (AppStringUtils.isEmpty(path)) {
String defaultHeadUrl = AppPropPublicUtil.getPropValue(AppPropPublicUtil.Keys.CODE_DEFAULT_HEAD_ICON);
path = ImageBase64Utils.imageNetToBase64(webServerUrl+defaultHeadUrl);
}
adsv.setHeadPicPath("data:image/png;base64,"+path);
if (CollectionUtils.isNotEmpty(callProcedureResult)) {
for (Map<String, Object> map : callProcedureResult) {
if (map.get("PER_ID") != null) {
adsv.setPerId(map.get("PER_ID").toString());
}
if (map.get("PER_IDCARD") != null) {
adsv.setPerIdCard(map.get("PER_IDCARD").toString());
}
if (map.get("PER_NAME") != null) {
adsv.setPerName(map.get("PER_NAME").toString());
}
if (map.get("PER_JOBTIME") != null) {
Date pjt = AppDateUtil.parse(map.get("PER_JOBTIME").toString(), AppDatePattern.DATETIME_DEFAULT);
Calendar cal = Calendar.getInstance();
cal.setTime(pjt);
int year = cal.get(Calendar.YEAR);
int month = cal.get(Calendar.MONTH) + 1;
int day = cal.get(Calendar.DATE);
adsv.setPerJobTime(year + "年" + month + "月" + day + "日");
}
if (map.get("PER_WORKTIME") != null) {
adsv.setPerWorkTime(map.get("PER_WORKTIME").toString());
}
if (map.get("CUSTOMERS") != null) {
adsv.setCustomers(map.get("CUSTOMERS").toString());
}
if (map.get("OWNERS") != null) {
adsv.setOwners(map.get("OWNERS").toString());
}
if (map.get("SERVICE_OWNERS") != null) {
adsv.setServiceOwners(map.get("SERVICE_OWNERS").toString());
}
if (map.get("SERVICE_CUSTOMERS") != null) {
adsv.setServiceCustomers(map.get("SERVICE_CUSTOMERS").toString());
}
//数据处理-与*位伙伴并肩作战>6000的时候,取6000
if (map.get("COOPERATION") != null) {
int con = Integer.valueOf(map.get("COOPERATION").toString());
if(con>6000){
con=6000;
}
adsv.setCooperation(String.valueOf(con));
}
//数据处理-行政区域>6000的时候,取6000
if (map.get("AREA_CNT") != null) {
int ant = Integer.valueOf(map.get("AREA_CNT").toString());
if(ant>6000){
ant=6000;
}
adsv.setAreaCnt(String.valueOf(ant));
}
//数据处理-小区>6000的时候,取6000
if (map.get("PROPERTYINFO_CNT") != null) {
int cnt = Integer.valueOf(map.get("PROPERTYINFO_CNT").toString());
if(cnt>6000){
cnt=6000;
}
adsv.setPropertyinfoCnt(String.valueOf(cnt));
}
//数据处理-关注物业量>6000的时候,取6000
if (map.get("CONCERNED_PROPERTYINFO") != null) {
int pnt = Integer.valueOf(map.get("CONCERNED_PROPERTYINFO").toString());
if(pnt>6000){
pnt=6000;
}
adsv.setConcernedPropertyInfo(pnt);
}
if (map.get("CONCERNED_HOUSES") != null) {
adsv.setConcernedHouses(Integer.parseInt(map.get("CONCERNED_HOUSES").toString()));
}
if (map.get("LOOKS") != null) {
adsv.setLooks(Integer.parseInt(map.get("LOOKS").toString()));
}
if (map.get("BE_LOOKS") != null) {
adsv.setBeLooks(Integer.parseInt(map.get("BE_LOOKS").toString()));
}
if (map.get("TITLE") != null) {
adsv.setTitle(map.get("TITLE").toString());
}
if (map.get("CALL_NAME") != null) {
adsv.setCallName(map.get("CALL_NAME").toString());
}
}
}
/**
* 若发生的带看为0,涉及到的行政区和小区也必为0,同时发生的被带看也为0, 不显示数据页2。
* 若发生的带看为0,且关注物业量和关注房源量任意一个为0,不显示数据页2。
* 若称号为潜力无限也不显示数据页2
*/
adsv.setIsShowTwo(AppDataShareVo.IS_SHOW_TWO_YES);
if (((null==adsv.getLooks() || adsv.getLooks() == 0) && (null==adsv.getBeLooks() || adsv.getBeLooks() == 0)) ||
((null==adsv.getLooks() || adsv.getLooks() == 0) && (null==adsv.getConcernedPropertyInfo() || adsv.getConcernedPropertyInfo() == 0)) ||
((null==adsv.getLooks() || adsv.getLooks() == 0) && (null==adsv.getConcernedHouses() || adsv.getConcernedHouses() == 0))||adsv.getTitle().equals("潜力无限")) {
adsv.setIsShowTwo(AppDataShareVo.IS_SHOW_TWO_NO);
}
return adsv;
}
/**
* 生成年月日小时文件名称
*
* @param userId 用户Id
* @param businessType 业务类型
* @param fileExt 扩展名称
* @return String
*/
private String getDatePath(String userId, String businessType, String fileExt) {
Calendar calendar = Calendar.getInstance();
int yearInt = calendar.get(Calendar.YEAR);
int monthInt = calendar.get(Calendar.MONTH) + 1;
int dayInt = calendar.get(Calendar.DAY_OF_MONTH);
int hourInt = calendar.get(Calendar.HOUR_OF_DAY);
String monthStr = monthInt >= 10 ? String.valueOf(monthInt) : "0" + monthInt;
String dayStr = dayInt >= 10 ? String.valueOf(dayInt) : "0" + dayInt;
String hourStr = hourInt >= 10 ? String.valueOf(hourInt) : "0" + hourInt;
return yearInt + monthStr + dayStr + hourStr + "_" + userId + "_" + businessType + fileExt;
}
/**
* @param sysContactsIService the sysContactsIService to set
*/
public void setSysContactsIService(SysContactsIService sysContactsIService) {
this.sysContactsIService = sysContactsIService;
}
}
ftl
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport"
content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<meta content="no-siteapp" http-equiv="Cache-Control">
<meta content="webkit" name="renderer">
<meta content="yes" name="apple-mobile-web-app-capable">
<meta content="black" name="apple-mobile-web-app-status-bar-style">
<!-- uc强制竖屏 -->
<meta name="screen-orientation" content="portrait">
<!-- QQ强制竖屏 -->
<meta name="x5-orientation" content="portrait">
<title>2019年英雄榜</title>
<link href="../../lib/agent/css/css.css" rel="stylesheet" >
<link href="../../lib/agent/css/swiper.min.css" rel="stylesheet" type="text/css"/>
<link href="../../lib/agent/css/animate.css" rel="stylesheet" >
<script src="../../lib/agent/js/font.js"></script>
<script src="../../lib/agent/js/jquery-2.1.3.min.js"></script>
<script src="../../lib/agent/js/swiper.min.js"></script>
</head>
<body>
<div id="main" class="index">
<div class="swiper-container">
<div class="swiper-wrapper">
<div class="swiper-slide">
<div class="page page0">
<div class="loading">
<p>探榜</p>
<img class="arrowUp animated fadeOutUp infinite" src="../../lib/agent/images/arrowUp.png" />
</div>
</div>
</div>
<div class="swiper-slide">
<div class="page page1">
<div class="page1Wrap">
<div class="avatorWrap">
<img class="avator" src="${breakHeadPath}" alt="">
</div>
<p class="name"><span>${perName}</span><label>${callName}</label></p>
<div class="agentInfo" style="display: none;">
<h3><em style="padding:0;font-size:.36rem;font-weight: bold;">${perJobTime}</em></h3>
<p> 是你正式下山的日子,截止到今日,你已在麦田闯荡了<em>${perWorkTime}</em>天。</p>
<#switch title>
<#case '潜力无限'>
<p>雨露风霜,朝霞皓月,你不断地向着自己的目标飞奔。每一滴汗水、每一次奔波都将成就你未来的荣耀!我们相信你终将名震江湖!</p>
<#break>
<#default>
<p><#if owners != "0" || customers != "0" || serviceOwners != "0" || serviceCustomers != "0">2019年你一路披荆斩棘、行侠仗义,<#if owners != "0" || customers != "0">结识了<#if owners != "0"><em> ${owners}</em>位业主</#if><#if owners != "0" && customers != "0">和</#if><#if customers != "0"><em> ${customers}</em>位客户。</#if></#if><#if serviceOwners != "0" || serviceCustomers != "0"><#if serviceOwners != "0">使<em>${serviceOwners}</em>位业主的利益得到保障。</#if><#if serviceCustomers != "0">使<em>${serviceCustomers}</em>位客户的家园梦想得以实现。</#if></#if></#if></p>
</#switch>
</div>
<div class="agentInfo" id="agentInfo"></div>
</div>
<img class="lightBlue light flash animated infinite" src="../../lib/agent/images/lightBlue.png" alt="">
<img class="arrowUp animated fadeOutUp infinite" src="../../lib/agent/images/arrowUp.png" />
</div>
</div>
<#if isShowTwo == 1>
<div class="swiper-slide">
<div class="page page2">
<div class="page2Wrap">
<img class="hanshui" src="../../lib/agent/images/hanshui.png" alt="">
<div class="toast toast1" style="display: none;">
<h6><span>${cooperation}</span>位</h6>
<p><#if cooperation != "0">这一年你与${cooperation}位伙伴并肩作战</#if></p>
</div>
<div class="toast toast2" style="display: none;">
<h6><span>${concernedHouses}</span>套</h6>
<p><#if areaCnt != "0" || propertyinfoCnt != "0">足迹遍布<#if areaCnt != "0">${areaCnt}个行政区,</#if><#if propertyinfoCnt != "0">${propertyinfoCnt}个小区,</#if></#if><#if concernedPropertyInfo != 0 || concernedHouses != 0>关注<#if concernedPropertyInfo != 0>${concernedPropertyInfo}个物业,</#if><#if concernedHouses != 0>${concernedHouses}套房源</#if></#if></p>
</div>
<div class="toast toast3" style="display: none;">
<h6><span>${looks+beLooks}</span>次</h6>
<p><#if looks != 0 || beLooks != 0>形成<#if looks != 0>${looks}次带看</#if><#if looks != 0 && beLooks != 0>和</#if><#if beLooks != 0>${beLooks}次被带看</#if></#if></p>
</div>
<div class="toast" id="toast1"><em></em></div>
<div class="toast" id="toast2"><em></em></div>
<div class="toast" id="toast3"><em></em></div>
</div>
<img class="lightYellow light flash animated infinite" src="../../lib/agent/images/lightYellow.png" alt="">
<img class="lightYellow2 light flash animated infinite" src="../../lib/agent/images/lightYellow.png" alt="">
<img class="lightYellowLong light flash animated infinite" src="../../lib/agent/images/lightYellowLong.png" alt="">
<img class="arrowUp animated fadeOutUp infinite" src="../../lib/agent/images/arrowUp.png" />
</div>
</div>
</#if>
<div class="swiper-slide">
<div class="page page3" id="app">
<div class="page3Wrap">
<img class="hero" src="../../lib/agent/images/hero.png" alt="">
<p class="heroSay">感谢你为维护房产经纪行业的繁荣稳定和蓬勃发展奉献青春与热血!</p>
<div class="chenghao">
<p class="nihude">你获封</p>
<p class="dechenghao">的称号!</p>
<div class="honorWrap">
<#switch title>
<#case '潜力无限'>
<img class="honor animated" src="../../lib/agent/images/1.png" alt="">
<#break>
<#case '小有所成'>
<img class="honor animated" src="../../lib/agent/images/2.png" alt="">
<#break>
<#case '不同凡响'>
<img class="honor animated" src="../../lib/agent/images/3.png" alt="">
<#break>
<#case '人中龙凤'>
<img class="honor animated" src="../../lib/agent/images/4.png" alt="">
<#break>
<#case '名震江湖'>
<img class="honor animated" src="../../lib/agent/images/5.png" alt="">
<#break>
<#case '一代宗师'>
<img class="honor animated" src="../../lib/agent/images/6.png" alt="">
<#break>
<#case '独孤求败'>
<img class="honor animated" src="../../lib/agent/images/7.png" alt="">
<#break>
<#default>
<img class="honor animated" src="../../lib/agent/images/1.png" alt="">
</#switch>
</div>
</div>
<div class="phoneNum">
<p>鸿雁传书<span>${mobile}</span></p>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<div id="music" class="music">
<audio id="audioTag" src="../../lib/agent/images/music.mp3" ></audio>
<div class="pgs" style="display: none;">
<div class="pgs-play" id="progress" style="width: 20%;"></div>
</div>
<div class="controls">
<span class="played-time" style="display: none;">00:00</span>
<button class="play-pause" id="playPause">
<span class="icon-btn icon-play"></span>
</button>
<span class="audio-time" id="audioTime" style="display: none;">0</span>
</div>
</div>
<script src="../../lib/agent/js/typing.min.js"></script>
<script src="../../lib/agent/js/qrcode.js"></script>
<script src="../../lib/agent/js/html2canvas.min.js"></script>
<script>
var audio = $('#audioTag').get(0);
var playState = '';
$('#playPause').click(function(){
//改变暂停/播放icon
if(audio.paused){
audio.play();
$('.icon-btn').removeClass('icon-play').addClass('icon-pause')
} else{
audio.pause();
$('.icon-btn').removeClass('icon-pause').addClass('icon-play')
}
})
audio.addEventListener("pause", function(){ //暂停状态Doing
playState = false;//暂停状态
})
audio.addEventListener("playing", function(){ //播放状态Doing
playState = true;//播放状态
});
document.addEventListener('visibilitychange', function() {
if(!document.hidden){
if(playState){
$('.icon-btn').removeClass('icon-play').addClass('icon-pause');
}else{
$('.icon-btn').removeClass('icon-pause').addClass('icon-play')
}
}
})
//计算发光图层位置大小
function cmpPosi(){
var width = window.document.documentElement.getBoundingClientRect().width;
var scaleNum = width/750;
$('.page1 .lightBlue').css({'width':width*.208266667,'bottom':scaleNum*432,'right':scaleNum*37});
$('.page2 .lightYellow').css({'width':width*.152,'bottom':scaleNum*554,'right':scaleNum*150});
$('.page2 .lightYellow2').css({'width':width*.10533333,'bottom':scaleNum*468,'right':scaleNum*560});
$('.page2 .lightYellowLong').css({'width':width*.113866667,'bottom':scaleNum*580,'right':scaleNum*372});
//$('.page2 .toast').css({'width':width*.50533333});
$('.page2 .toast1,.page2 #toast1').css({'bottom':scaleNum*940,'right':scaleNum*220});
$('.page2 .toast2,.page2 #toast2').css({'bottom':scaleNum*553,'right':scaleNum*286});
$('.page2 .toast3,.page2 #toast3').css({'bottom':scaleNum*248,'right':scaleNum*59});
}
//设置打字效果
var typingaAgentInfo = new Typing({
source: $('.agentInfo').get(0),
output: document.getElementById('agentInfo'),
delay: 20
});
var typingToast3 = new Typing({
source: $('.toast3').get(0),
output: document.getElementById('toast3'),
delay: 15
});
var typingToast2 = new Typing({
source: $('.toast2').get(0),
output: document.getElementById('toast2'),
delay: 15,
done:function(){
$('#toast3').addClass('show');
typingToast3.start()
}
});
var typingToast1 = new Typing({
source: $('.toast1').get(0),
output: document.getElementById('toast1'),
delay: 15,
done:function(){
$('#toast2').addClass('show');
typingToast2.start()
}
});
$(function () {
//计算发光图层和对话框位置大小
cmpPosi();
//获取到第二页三段文字的高度并赋值给要打印的div
$('#toast1').height($('.toast1').eq(0).height());
$('#toast2').height($('.toast2').eq(0).height());
$('#toast3').height($('.toast3').eq(0).height());
//计算要分享的#shareWrapClone的宽高
var width = $('body').width();
var height = $('body').height();
//根据高度计算分享图片的样式
$('.qrCodeBox').css('height',height*.159);
$('#shareHonor').css({'height':height*.159,'bottom':height*.159});
$('#qrcode').width(width*.2);
//根据宽高比计算相关背景图片的样式
if(width/height>=414/760){
$('.hanshui').css({'margin-top':'0','width':'70%','height':'auto'})
$('.page3Wrap').css({'background-position-y':'bottom'})
var scaleNum = width/height;
if(width/height>=414/700 && width/height<375/650){
$('.page2 .toast1,.page2 #toast1').css({'bottom':scaleNum*750,'right':scaleNum*70}).addClass('leftArrow');
}else if(width/height>=375/650 && width/height<375/580){
$('.page2 .toast1,.page2 #toast1').css({'bottom':scaleNum*height*1.08,'right':scaleNum*60}).addClass('leftArrow');
}else if(width/height>=375/580 && width/height<375/550){
$('.page2 .toast1,.page2 #toast1').css({'bottom':scaleNum*height*1.05,'right':scaleNum*60}).addClass('leftArrow');
}else if(width/height>=375/550){
$('.page2 .toast1,.page2 #toast1').css({'bottom':scaleNum*height*1.02,'right':scaleNum*50}).addClass('leftArrow');
}
}
$('.swiper-wrapper').on('transitionend',function(){
if($('.swiper-slide-active').find('.page3').length>0){
$('.honor').addClass('fadeInBigToSmall');
}
})
})
//长按计时器
var timeOutEvent=0;
var swiper = new Swiper('.swiper-container', {
direction: 'vertical',
//noSwiping : true,
onSlideChangeEnd:function(swiper) {
if (swiper.activeIndex == 1 && $('#agentInfo').find('h3').length<=0) {
//开始首屏打字效果
typingaAgentInfo.start();
}
<#if isShowTwo == 1>
if (swiper.activeIndex == 2 && $('.page2Wrap').find('.show').length<=0) {
$('#toast1').addClass('show');
typingToast1.start();
}
</#if>
if(swiper.activeIndex == <#if isShowTwo == 1>3<#else>2</#if> && $('.page3Wrap').find('.fadeInBigToSmall').length<=0){
$('.honor').addClass('fadeInBigToSmall');
}
}
});
</script>
</body>
</html>
一.FreeMarkerUtil工具类:
Java代码
1. import com.huaxia.entity.News;
2. import com.huaxia.entity.User;
3. import freemarker.template.Configuration;
4. import freemarker.template.Template;
5. import freemarker.template.TemplateException;
6.
7. import javax.servlet.http.HttpServletRequest;
8. import java.io.*;
9. import java.util.HashMap;
10. import java.util.Locale;
11. import java.util.Map;
12.
13. /**
14. * 创建人: leon
15. * 创建时间: 2014年11月28日 上午10:07:51
16. * 类描述:Freemarker的工具类
17. */
18. public class FreemarkerUtil {
19.
20. /**
21. * 通过指定的名字获取相应的模板
22. * @param fileName
23. * @return
24. */
25. public Template getTemplate(HttpServletRequest request,String fileName) {
26. try {
27. new Configuration();
28. "UTF-8");
29. "UTF-8");// 编码设置1
30. "UTF-8");
31. //设定读取ftl模板文件的目录
32. //cfg.setClassForTemplateLoading(this.getClass(), "/template"); //读取src目录下
33. "/template"); //读取webroot目录下
34. //在模板文件目录中找到名称为name的文件,并加载为模板
35. Template template = cfg.getTemplate(fileName);
36. "UTF-8");// 编码设置2
37. return template;
38. catch (IOException e) {
39. e.printStackTrace();
40. }
41. return null;
42. }
43.
44. /**
45. * 通过指定的文件目录和文件名生成相应的文件
46. * @param fileDir
47. * @param fileName
48. */
49. public Boolean printToFile(Template template,String fileDir,String fileName,Map<String,Object> root) {
50. boolean done = false;
51. null;
52. try {
53. //判断多级目录是否存在,不存在则一级级创建
54. "\\\\");//注意:此处“\\”是错误的,必须要“\\\\”才能分割字符串
55. 0];
56. for (int i = 1; i < paths.length; i++) {
57. dir = dir + File.separator + paths[i];
58. new File(dir.toString());
59. if (!file.exists()) {
60. file.mkdir();
61. }
62. }
63. //创建输出流
64. new File(fileDir +File.separator+ fileName);
65.
66. //设置生成的文件编码为UTF-8
67. //服务器不支持UTF-8格式HTML时候使用ANSI格式HTML文件,即系统默认编码
68. new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file),"UTF-8")); // 编码设置3
69. //writer = new FileWriter(fileDir +File.separator+ fileName);
70. //输出模板和数据模型都对应的文件
71. template.process(root, writer);
72. true;
73. catch (IOException e) {
74. e.printStackTrace();
75. catch (TemplateException e) {
76. e.printStackTrace();
77. finally {
78. try {
79. if(writer!=null){
80. writer.close();
81. }
82. catch (IOException e) {
83. e.printStackTrace();
84. }
85. }
86. return done;
87. }
88.
89. /**
90. * 通过传入的请求和新闻信息重新生成html文件
91. * @param news //新闻实体类
92. * @param request //请求
93. * @param user //用户
94. * @return
95. */
96. public boolean genenateHtml(News news,HttpServletRequest request,User user) {
97. String fileName = news.getFileName();
98. new HashMap<String, Object>();
99. "id", news.getId());
100. "title", news.getTitle());
101. "create_date", news.getCreateDate());
102. "creator", news.getCreator());
103. "content", ClobUtil.ClobToString(news.getContent()));
104. "fileName", news.getUploadFile()==null?"":news.getUploadFile());
105. new FreemarkerUtil();
106. null;
107. "news.ftl");//新闻发布系统的freemarker模板
108. String htmlDir = news.getDir();
109. boolean done = printToFile(template, htmlDir, fileName, root);
110. return done;
111. }
112. }
划船不用桨、杨帆不等风、一生全靠浪