package com.yeshi.fanli.service.impl.help; import java.util.ArrayList; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.UUID; import javax.annotation.Resource; import org.springframework.cache.annotation.Cacheable; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import com.yeshi.fanli.dao.mybatis.help.HelpCenterMapper; import com.yeshi.fanli.entity.bus.help.HelpCenter; import com.yeshi.fanli.entity.bus.help.HelpInfo; import com.yeshi.fanli.exception.HelpCenterException; import com.yeshi.fanli.service.inter.help.HelpCenterService; import com.yeshi.fanli.util.StringUtil; import com.yeshi.fanli.util.db.MongoDBManager; import org.yeshi.utils.tencentcloud.COSManager; @Service public class HelpCenterServiceImpl implements HelpCenterService { @Resource private HelpCenterMapper helpCenterMapper; @Resource private MongoDBManager mongoDBManager; @Override public int insertSelective(HelpCenter record) throws HelpCenterException { return helpCenterMapper.insertSelective(record); } @Override public int updateByPrimaryKey(HelpCenter record) throws HelpCenterException { return helpCenterMapper.updateByPrimaryKey(record); } @Override public int updateByPrimaryKeySelective(HelpCenter record) throws HelpCenterException { return helpCenterMapper.updateByPrimaryKeySelective(record); } @Override public HelpCenter selectByPrimaryKey(Long id) throws HelpCenterException { return helpCenterMapper.selectByPrimaryKey(id); } @Override public HelpCenter selectByPrimaryKeyCache(Long id) throws HelpCenterException { return selectByPrimaryKey(id); } @Override public String save(HelpCenter helpCenter, String content, String html) throws Exception { Long id = helpCenter.getId(); if (id == null) { helpCenter.setCreatetime(new Date()); helpCenter.setUpdatetime(new Date()); helpCenterMapper.insert(helpCenter); } else { helpCenter.setUpdatetime(new Date()); helpCenterMapper.updateByPrimaryKeySelective(helpCenter); } List> positions = getPosition(html); if (positions != null && positions.size() > 0) { @SuppressWarnings("restriction") sun.misc.BASE64Decoder decoder = new sun.misc.BASE64Decoder(); for (int i = 0; i < positions.size(); i++) { Map map = positions.get(i); String base64Img = (String) map.get("base64Img"); byte[] b = decoder.decodeBuffer(base64Img); for (int j = 0; j < b.length; ++j) { if (b[j] < 0) { b[j] += 256; } } String type = (String) map.get("type"); // 上传文件相对位置 String fileUrl = "helpInfo/" + UUID.randomUUID().toString().replace("-", "") + "." +type; /* 上传新图片 */ String uploadFilePath = COSManager.getInstance().uploadFileByte(b, fileUrl).getUrl(); if (!StringUtil.isNullOrEmpty(uploadFilePath)) { String header = (String) map.get("header"); html = html.replace(header, uploadFilePath); //System.out.println("uploadFilePath: " + uploadFilePath); //content = content.replace(header, uploadFilePath); } } } String replaceHtml = replaceIframe(html); Long backId = helpCenter.getId(); HelpInfo helpInfo = new HelpInfo(backId, content, replaceHtml); mongoDBManager.saveHelpInfo(helpInfo); return html; } public List> getPosition(String content) { List> listMap = new ArrayList>(); // 需要对比的字符串 String compareStr = "base64"; String compareStrStart = "data:image/"; // 字符串查找初始从0开始查找 int indexStart = 0; int indexTypeStart = 0; // 获取查找字符串的长度,这里有个规律:第二次查找出字符串的起始位置等于 第一次ab字符串出现的位置+ab的长度 int compareStrLength = compareStr.length(); while (true) { Map place = new HashMap(); int tm = content.indexOf(compareStr, indexStart); int typetm = content.indexOf(compareStrStart, indexTypeStart); if (tm <= 0) { // 直到没有匹配结果为止 break; } else { // 没查找一次就从新计算下次开始查找的位置 indexStart = tm + compareStrLength; indexTypeStart = typetm + compareStrLength; //System.out.println(indexStart); //System.out.println(indexTypeStart); place.put("start", tm + 7); String suffix = content.substring(typetm + 11, tm - 1); place.put("type", suffix); String newContent = content.substring(tm + 7, content.length()); char qmark = '"'; int end = newContent.indexOf(qmark); place.put("end", end); String base64Img = newContent.substring(0, end); place.put("base64Img", base64Img); String header = compareStrStart + suffix+ ";" + compareStr +"," +base64Img; place.put("header", header); listMap.add(place); } } return listMap; } public String replaceIframe(String html) { String result = html; // 字符串查找初始从0开始查找 int indexStart = 0; // 需要对比的字符串 String compareStr = ""); // 替换指定字段 String replaceStr = html.substring(tm, tm + end + 9); char qmark = '"'; // src 起始位置 int srcindex = replaceStr.indexOf("src=", 0); String replaceSrc = replaceStr.substring(srcindex + 5, replaceStr.length()); // src "结束位置 int endsrc = replaceSrc.indexOf(qmark, 0); String src = replaceSrc.substring(0, endsrc +1); String voide = ""; result = html.replace(replaceStr, voide); } } return result; } @Override public List query(int pageIndex, int pageSize, String key, Integer orderMode) throws HelpCenterException { return helpCenterMapper.query(pageIndex, pageSize, key, orderMode); } @Override public long countQuery(String key) throws HelpCenterException { return helpCenterMapper.countQuery(key); } @Override @Cacheable(value = "helpCenterCache",key="'queryIdAndTitle-'+#pageIndex+'-'+#key") public List queryIdAndTitle(int pageIndex, int pageSize, String key) throws HelpCenterException { return helpCenterMapper.queryIdAndTitle(pageIndex, pageSize, key); } @Override public int deleteBatchById(List idList) throws HelpCenterException { return helpCenterMapper.deleteBatchById(idList); } @Override public HelpInfo getHelpInfo(Long id) throws HelpCenterException { return mongoDBManager.getHelpInfo(id); } @Override @Cacheable(value = "helpCenterCache",key="'getHelpInfoCache-'+#id") public HelpInfo getHelpInfoCache(Long id) throws HelpCenterException { return getHelpInfo(id); } @Override @Transactional public void deleteInfoBatchById(List idList) throws HelpCenterException { if (idList != null) { for (String id : idList) { mongoDBManager.removeHelpInfo(Long.parseLong(id)); } } } }