fanli/src/main/java/com/yeshi/fanli/controller/client/v2/GoodsControllerV2.java
@@ -1781,6 +1781,7 @@ return; } //TODO 是否需要返回绑定链接 boolean auth = PinDuoDuoApiUtil.isAuth(pid, uid + ""); PDDPromotionUrl convertUrl = PinDuoDuoApiUtil.convert(id, pid + "", uid + "", !auth); JSONObject data = new JSONObject(); fanli/src/main/java/com/yeshi/fanli/service/impl/JobThreadExecutorServiceImpl.java
@@ -1,8 +1,5 @@ package com.yeshi.fanli.service.impl; import com.aliyun.openservices.shade.com.alibaba.rocketmq.common.ThreadFactoryImpl; import org.yeshi.utils.TimeUtil; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.ThreadFactory; fanli/src/main/java/com/yeshi/fanli/util/RedisManager.java
@@ -6,6 +6,7 @@ import javax.annotation.Resource; import com.yeshi.fanli.entity.SystemEnum; import org.springframework.cache.annotation.CacheEvict; import org.springframework.stereotype.Component; import org.yeshi.utils.JsonUtil; fanli/src/main/java/com/yeshi/fanli/util/annotation/RedisCacheUtil.java
@@ -3,9 +3,11 @@ import java.lang.reflect.Method; import org.aspectj.lang.reflect.MethodSignature; import org.springframework.cache.annotation.CacheEvict; public class RedisCacheUtil { @CacheEvict public static void getKey(Method method, MethodSignature methodSignature) { } utils/src/main/java/org/yeshi/utils/FreemarkerUtils.java
New file @@ -0,0 +1,101 @@ package org.yeshi.utils; import freemarker.cache.StringTemplateLoader; import freemarker.template.Configuration; import freemarker.template.Template; import org.apache.commons.io.IOUtils; import java.io.*; import java.util.Map; public class FreemarkerUtils { private static String defaultCharacter = "UTF-8"; private static Configuration cfg; private FreemarkerUtils() { } static { cfg = new Configuration(Configuration.getVersion()); cfg.setDefaultEncoding(defaultCharacter); cfg.setTagSyntax(Configuration.AUTO_DETECT_TAG_SYNTAX); } /** * 对模板进行渲染 * * @param data 数据Map * @param tplStr 模板 * @return */ public static String generateString(Object data, String tplStr) { String result = null; String name = "myStrTpl"; try { StringTemplateLoader stringTemplateLoader = new StringTemplateLoader(); stringTemplateLoader.putTemplate(name, tplStr); cfg.setTemplateLoader(stringTemplateLoader); Template template = cfg.getTemplate(name, defaultCharacter); StringWriter out = new StringWriter(); template.process(data, out); out.flush(); result = out.toString(); out.close(); } catch (Exception e) { e.printStackTrace(); } return result; } public static String generateInputStream(Object data, InputStream templateStream) throws IOException { String str = IOUtils.toString(templateStream, "UTF-8"); return generateString(data, str); } /** * 将模板渲染以后保存到文件 * * @param templateFileDir 模板目录 * @param templateFileName 模板文件名称 * @param targetFilePath 渲染后文件名称 * @param data 数据 * @return */ public static boolean renderingTemplateAndGenerateFile(String templateFileDir, String templateFileName, String targetFilePath,Object data) { boolean flag = true; try { // 设置文件所在目录的路径 cfg.setDirectoryForTemplateLoading(new File(templateFileDir));//模板路径 // 获取模版 Template template = cfg.getTemplate(templateFileName); // 设置输出文件名,和保存路径 File outFile = new File(targetFilePath); // 将模板和数据模型合并生成文件 重点设置编码集 BufferedWriter out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outFile), "UTF-8")); // 生成文件 template.process(data, out); // 关闭流 out.flush(); out.close(); } catch (Exception e) { e.printStackTrace(); // logger.error("生产模板文件失败!",e); flag = false; } return flag; } public static boolean renderingTemplateAndGenerateFile(InputStream templateInput, String targetFilePath, Object data) throws Exception { String result = generateInputStream(data, templateInput); if (result != null) { FileUtil.saveAsFileByte(result.getBytes("UTF-8"), targetFilePath); return true; } return false; } } utils/src/main/java/org/yeshi/utils/HtmlToolUtil.java
New file @@ -0,0 +1,35 @@ package org.yeshi.utils; import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.jsoup.select.Elements; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.List; public class HtmlToolUtil { //解析SQLYog工具导出的html内容 public static List<String[]> parseSQLYogExportHtmData(String path, int columns) { List<String[]> contentList = new ArrayList<>(); try { Document doc = Jsoup.parse(new File(path), "UTF-8"); Elements els = doc.getElementsByTag("tr"); for (int i = 1; i < els.size(); i++) { Elements tds = els.get(i).getElementsByTag("td"); String[] contents = new String[columns]; for (int j = 0; j < columns; j++) { String content = tds.get(j).html().trim(); contents[j] = content; } contentList.add(contents); } } catch (IOException e) { e.printStackTrace(); } return contentList; } } utils/src/main/java/org/yeshi/utils/SerializeUtil.java
New file @@ -0,0 +1,52 @@ package org.yeshi.utils; import java.io.*; /** * @Description: 序列化反序列化工具 */ public class SerializeUtil { /** * 序列化 */ public static byte[] serialize(Object obj) { ObjectOutputStream oos = null; ByteArrayOutputStream baos = null; try { //序列化 baos = new ByteArrayOutputStream(); oos = new ObjectOutputStream(baos); oos.writeObject(obj); byte[] byteArray = baos.toByteArray(); return byteArray; } catch (IOException e) { e.printStackTrace(); } return null; } /** * 反序列化 * * @param bytes * @return */ public static Object unSerialize(byte[] bytes) { ByteArrayInputStream bais = null; try { //反序列化为对象 bais = new ByteArrayInputStream(bytes); ObjectInputStream ois = new ObjectInputStream(bais); return ois.readObject(); } catch (Exception e) { e.printStackTrace(); } return null; } } utils/src/main/java/org/yeshi/utils/entity/alipay/AlipayUserInfo.java
New file @@ -0,0 +1,62 @@ package org.yeshi.utils.entity.alipay; import com.google.gson.annotations.SerializedName; public class AlipayUserInfo { @SerializedName("user_id") private String userId; private String avatar; private String province; private String city; @SerializedName("nick_name") private String nickName; private String gender; public String getUserId() { return userId; } public void setUserId(String userId) { this.userId = userId; } public String getAvatar() { return avatar; } public void setAvatar(String avatar) { this.avatar = avatar; } public String getProvince() { return province; } public void setProvince(String province) { this.province = province; } public String getCity() { return city; } public void setCity(String city) { this.city = city; } public String getNickName() { return nickName; } public void setNickName(String nickName) { this.nickName = nickName; } public String getGender() { return gender; } public void setGender(String gender) { this.gender = gender; } } utils/src/main/java/org/yeshi/utils/generater/SpringComponentGenerater.java
New file @@ -0,0 +1,56 @@ package org.yeshi.utils.generater; import org.yeshi.utils.FreemarkerUtils; import org.yeshi.utils.generater.entity.ExceptionData; import org.yeshi.utils.generater.entity.MongoDBDaoData; import org.yeshi.utils.generater.entity.ServiceData; import java.io.File; public class SpringComponentGenerater { /** * 创建mongodb的dao * * @param data * @param targetDir * @throws Exception */ public static void createMongoDao(MongoDBDaoData data, String targetDir) throws Exception { FreemarkerUtils.renderingTemplateAndGenerateFile(SpringComponentGenerater.class.getClassLoader().getResourceAsStream("mongoDBDao.template"), new File(targetDir, data.getDaoName() + ".java").getAbsolutePath(), data); } /** * 创建服务 * * @param data * @param targetDir * @throws Exception */ public static void createService(ServiceData data, String targetDir) throws Exception { FreemarkerUtils.renderingTemplateAndGenerateFile(SpringComponentGenerater.class.getClassLoader().getResourceAsStream("service.template"), new File(targetDir, data.getServiceClassName() + ".java").getAbsolutePath(), data); } /** * 创建服务实现 * * @param data * @param targetDir * @throws Exception */ public static void createServiceImpl(ServiceData data, String targetDir) throws Exception { FreemarkerUtils.renderingTemplateAndGenerateFile(SpringComponentGenerater.class.getClassLoader().getResourceAsStream("serviceImpl.template"), new File(targetDir, data.getServiceClassName() + "Impl.java").getAbsolutePath(), data); } public static void createException(ExceptionData data, String targetDir) throws Exception { FreemarkerUtils.renderingTemplateAndGenerateFile(SpringComponentGenerater.class.getClassLoader().getResourceAsStream("exception.template"), new File(targetDir, data.getEntityClassName() + "Exception.java").getAbsolutePath(), data); } } utils/src/main/java/org/yeshi/utils/generater/entity/BaseData.java
New file @@ -0,0 +1,22 @@ package org.yeshi.utils.generater.entity; public class BaseData { private String packageName; private String entityClass; public String getPackageName() { return packageName; } public void setPackageName(String packageName) { this.packageName = packageName; } public String getEntityClass() { return entityClass; } public void setEntityClass(String entityClass) { this.entityClass = entityClass; } } utils/src/main/java/org/yeshi/utils/generater/entity/ColumnData.java
New file @@ -0,0 +1,32 @@ package org.yeshi.utils.generater.entity; public class ColumnData { private String columnName; private String columnMehtod; public ColumnData() { } public ColumnData(String columnName) { this.columnName = columnName; this.columnMehtod = "get" + (columnName.subSequence(0, 1) + "").toUpperCase() + columnName.subSequence(1, columnName.length()) + "()"; } public String getColumnName() { return columnName; } public void setColumnName(String columnName) { this.columnName = columnName; } public String getColumnMehtod() { return columnMehtod; } public void setColumnMehtod(String columnMehtod) { this.columnMehtod = columnMehtod; } } utils/src/main/java/org/yeshi/utils/generater/entity/ExceptionData.java
New file @@ -0,0 +1,62 @@ package org.yeshi.utils.generater.entity; public class ExceptionData extends BaseData { private String baseClass; private String baseClassName; private String entityClassName; public static class Builder { private Class baseClass; private String packageName; private Class entityClass; public Builder setBaseClass(Class baseClass) { this.baseClass = baseClass; return this; } public Builder setPackageName(String packageName) { this.packageName = packageName; return this; } public Builder setEntityClass(Class entityClass) { this.entityClass = entityClass; return this; } public ExceptionData build() { ExceptionData data = new ExceptionData(); data.setBaseClass(baseClass.getName()); data.setBaseClassName(baseClass.getSimpleName()); data.setEntityClass(entityClass.getName()); data.setEntityClassName(entityClass.getSimpleName()); data.setPackageName(packageName); return data; } } public String getBaseClass() { return baseClass; } public void setBaseClass(String baseClass) { this.baseClass = baseClass; } public String getBaseClassName() { return baseClassName; } public void setBaseClassName(String baseClassName) { this.baseClassName = baseClassName; } public String getEntityClassName() { return entityClassName; } public void setEntityClassName(String entityClassName) { this.entityClassName = entityClassName; } } utils/src/main/java/org/yeshi/utils/generater/entity/MongoDBDaoData.java
New file @@ -0,0 +1,172 @@ package org.yeshi.utils.generater.entity; import org.springframework.data.annotation.Id; import org.springframework.data.annotation.Transient; import java.lang.annotation.Annotation; import java.lang.reflect.Field; import java.util.ArrayList; import java.util.List; public class MongoDBDaoData extends BaseData { private String baseDaoClass; private String daoName; private String baseDaoClassName; private String entityClassName; private ColumnData identityColumn; private List<ColumnData> columnDataList; public static class Builder { private Class baseDaoClass; private Class entityClass; private String daoPackageName; private String daoName; public Builder setBaseDaoClass(Class clazz) { this.baseDaoClass = clazz; return this; } public Builder setEntityClass(Class clazz) { this.entityClass = clazz; return this; } public Builder setDaoPackageName(String daoPackageName) { this.daoPackageName = daoPackageName; return this; } public Builder setDaoName(String daoName) { this.daoName = daoName; return this; } public MongoDBDaoData create() { if (daoName == null) { daoName = entityClass.getSimpleName() + "Dao"; } Field[] fields = entityClass.getDeclaredFields(); String identityColumnName = null; List<String> columNamelist = new ArrayList<>(); for (Field fd : fields) { //private/public 非final,static属性才会参与解析 if (fd.getModifiers() != 1 && fd.getModifiers() != 2) { continue; } String columName = fd.getName(); Annotation[] as = fd.getAnnotations(); if (columName != null) { for (Annotation a : as) { //主键 if (a instanceof Id) { identityColumnName = new String(columName); columName = null; break; } } } for (Annotation a : as) { //不参与解析 if (a instanceof Transient || a instanceof java.beans.Transient) { columName = null; break; } } if (columName != null) { columNamelist.add(columName); } } List<ColumnData> columnDataList = new ArrayList<>(); for (String columnName : columNamelist) { //更新时间不参与更新 if (!"updateTime".equalsIgnoreCase(columnName)) { columnDataList.add(new ColumnData(columnName)); } } MongoDBDaoData data = new MongoDBDaoData(); data.setBaseDaoClass(baseDaoClass.getName()); data.setBaseDaoClassName(baseDaoClass.getSimpleName()); data.setColumnDataList(columnDataList); data.setDaoName(daoName); data.setEntityClass(entityClass.getName()); data.setEntityClassName(entityClass.getSimpleName()); data.setIdentityColumn(new ColumnData(identityColumnName)); data.setPackageName(daoPackageName); return data; } } public String getBaseDaoClass() { return baseDaoClass; } public void setBaseDaoClass(String baseDaoClass) { this.baseDaoClass = baseDaoClass; } public String getDaoName() { return daoName; } public void setDaoName(String daoName) { this.daoName = daoName; } public String getBaseDaoClassName() { return baseDaoClassName; } public void setBaseDaoClassName(String baseDaoClassName) { this.baseDaoClassName = baseDaoClassName; } public String getEntityClassName() { return entityClassName; } public void setEntityClassName(String entityClassName) { this.entityClassName = entityClassName; } public ColumnData getIdentityColumn() { return identityColumn; } public void setIdentityColumn(ColumnData identityColumn) { this.identityColumn = identityColumn; } public List<ColumnData> getColumnDataList() { return columnDataList; } public void setColumnDataList(List<ColumnData> columnDataList) { this.columnDataList = columnDataList; } } utils/src/main/java/org/yeshi/utils/generater/entity/ServiceData.java
New file @@ -0,0 +1,94 @@ package org.yeshi.utils.generater.entity; public class ServiceData extends BaseData { private String serviceClassName; private String daoClassName; private String daoClass; private String daoClassCaseName; private String serviceClass; public static class Builder { private Class entityClass; private String packageName; private Class daoClass; private Class serviceClass; public Builder setServiceClass(Class serviceClass) { this.serviceClass = serviceClass; return this; } public Builder setEntityClass(Class entityClass) { this.entityClass = entityClass; return this; } public Builder setPackageName(String packageName) { this.packageName = packageName; return this; } public Builder setDaoClass(Class daoClass) { this.daoClass = daoClass; return this; } public ServiceData build() { ServiceData serviceData = new ServiceData(); if (daoClass != null) { serviceData.setDaoClassCaseName((daoClass.getSimpleName().subSequence(0, 1) + "").toLowerCase() + daoClass.getSimpleName().subSequence(1, daoClass.getSimpleName().length())); serviceData.setDaoClassName(daoClass.getSimpleName()); serviceData.setDaoClass(daoClass.getName()); } if (serviceClass != null) { serviceData.setServiceClass(serviceClass.getName()); } serviceData.setServiceClassName(entityClass.getSimpleName() + "Service"); serviceData.setEntityClass(entityClass.getName()); serviceData.setPackageName(packageName); return serviceData; } } public String getServiceClassName() { return serviceClassName; } public void setServiceClassName(String serviceClassName) { this.serviceClassName = serviceClassName; } public String getDaoClassName() { return daoClassName; } public void setDaoClassName(String daoClassName) { this.daoClassName = daoClassName; } public String getDaoClassCaseName() { return daoClassCaseName; } public void setDaoClassCaseName(String daoClassCaseName) { this.daoClassCaseName = daoClassCaseName; } public String getDaoClass() { return daoClass; } public void setDaoClass(String daoClass) { this.daoClass = daoClass; } public String getServiceClass() { return serviceClass; } public void setServiceClass(String serviceClass) { this.serviceClass = serviceClass; } } utils/src/main/java/org/yeshi/utils/generater/mongo/MongoDaoUtil.java
New file @@ -0,0 +1,76 @@ package org.yeshi.utils.generater.mongo; import org.springframework.data.annotation.Transient; import org.yeshi.utils.entity.wx.WXAPPInfo; import java.lang.annotation.Annotation; import java.lang.reflect.Field; import java.util.ArrayList; import java.util.List; public class MongoDaoUtil { /** * 获取有效的属性 * * @param clz * @return */ private static List<Field> getValidField(Class<?> clz) { List<Field> list = new ArrayList<>(); Field[] fields = clz.getDeclaredFields(); for (Field fd : fields) { Annotation[] as = fd.getAnnotations(); boolean create = true; for (Annotation a : as) { if (a instanceof Transient || a instanceof java.beans.Transient) { create = false; break; } } if (create) { list.add(fd); } } return list; } public static String createUpdateSelective(Class<?> clz) { List<Field> fields = getValidField(clz); StringBuilder builder = new StringBuilder(); builder.append(String.format("public void updateSelective(%s bean) {\r\n", clz.getSimpleName())); builder.append(" Query query = new Query();\r\n"); builder.append(" query.addCriteria(Criteria.where(\"id\").is(bean.getId()));\r\n"); builder.append(" Update update = new Update();\r\n"); for (Field f : fields) { if ("id".equalsIgnoreCase(f.getName()) || "createTime".equalsIgnoreCase(f.getName())) continue; if (f.getModifiers() == 25) {//public final static修饰 continue; } String getMethod = String.format("bean.get%s()", f.getName().substring(0, 1).toUpperCase() + f.getName().substring(1)); if (f.getName().equalsIgnoreCase("updateTime")) { builder.append(String.format(" update.set(\"%s\", %s);\r\n", f.getName(), "new Date()")); } else { builder.append(String.format(" if (%s != null) {\r\n", getMethod)); builder.append(String.format(" update.set(\"%s\", %s);\r\n", f.getName(), f.getName().equalsIgnoreCase("updateTime") ? "new Date()" : getMethod)); builder.append(" }\r\n"); } } builder.append(" update(query, update);\r\n"); builder.append("}"); return builder.toString(); } public static void main(String[] args) { MongoDaoUtil.createUpdateSelective(WXAPPInfo.class); } } utils/src/main/java/org/yeshi/utils/mq/JobThreadExecutorServiceImpl.java
New file @@ -0,0 +1,29 @@ package org.yeshi.utils.mq; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.ThreadFactory; import java.util.concurrent.TimeUnit; public class JobThreadExecutorServiceImpl { private ScheduledExecutorService scheduledExecutorService; public JobThreadExecutorServiceImpl() { scheduledExecutorService = Executors.newSingleThreadScheduledExecutor(new ThreadFactory() { @Override public Thread newThread(Runnable r) { Thread thread = new Thread(r); thread.setDaemon(true); return thread; } }); } public void run(Runnable runnable) { scheduledExecutorService.scheduleAtFixedRate(runnable, 1000 * 1, 1000, TimeUnit.MILLISECONDS); } } utils/src/main/resources/exception.template
New file @@ -0,0 +1,13 @@ package ${packageName}; import ${baseClass}; public class ${entityClassName}Exception extends ${baseClassName}{ public ${entityClassName}Exception(int code, String msg) { super(code, msg); } } utils/src/main/resources/mongoDBDao.template
New file @@ -0,0 +1,29 @@ package ${packageName}; import ${entityClass}; import ${baseDaoClass}; import org.springframework.data.mongodb.core.query.Criteria; import org.springframework.data.mongodb.core.query.Query; import org.springframework.data.mongodb.core.query.Update; import org.springframework.stereotype.Repository; import java.util.Date; @Repository public class ${daoName} extends ${baseDaoClassName}<${entityClassName}>{ public void updateSelective(${entityClassName} bean) { Query query = new Query(); Update update=new Update(); query.addCriteria(Criteria.where("${identityColumn.columnName}").is(bean.${identityColumn.columnMehtod})); <#if columnDataList??> <#list columnDataList as value> if(bean.${value.columnMehtod} != null) { update.set("${value.columnName}", bean.${value.columnMehtod}); } </#list> </#if> update.set("updateTime", new Date()); update(query, update); } } utils/src/main/resources/service.template
New file @@ -0,0 +1,7 @@ package ${packageName}; import ${entityClass}; public interface ${serviceClassName} { } utils/src/main/resources/serviceImpl.template
New file @@ -0,0 +1,16 @@ package ${packageName}; import ${entityClass}; import ${daoClass}; import ${serviceClass}; import javax.annotation.Resource; import org.springframework.stereotype.Service; import java.util.Date; @Service public class ${serviceClassName}Impl implements ${serviceClassName}{ @Resource private ${daoClassName} ${daoClassCaseName}; } utils/src/test/java/com/yeshi/utils/MongoTest.java
New file @@ -0,0 +1,8 @@ package com.yeshi.utils; public class MongoTest { public static void main(String[] args) { } } utils/utils.iml
@@ -18,6 +18,7 @@ <content url="file://$MODULE_DIR$"> <sourceFolder url="file://$MODULE_DIR$/src/main/java" isTestSource="false" /> <sourceFolder url="file://$MODULE_DIR$/src/test/java" isTestSource="true" /> <sourceFolder url="file://$MODULE_DIR$/src/main/resources" type="java-resource" /> <excludeFolder url="file://$MODULE_DIR$/target" /> </content> <orderEntry type="sourceFolder" forTests="false" /> @@ -30,6 +31,15 @@ <orderEntry type="library" name="Maven: commons-beanutils:commons-beanutils:1.9.3" level="project" /> <orderEntry type="library" name="Maven: org.apache.commons:commons-collections4:4.2" level="project" /> <orderEntry type="library" name="Maven: ch.ethz.ganymed:ganymed-ssh2:build210" level="project" /> <orderEntry type="library" name="Maven: com.alipay.sdk:alipay-easysdk:2.1.0" level="project" /> <orderEntry type="library" name="Maven: com.alipay.sdk:easysdk-kernel:1.0.4" level="project" /> <orderEntry type="library" name="Maven: com.aliyun:tea:1.0.7" level="project" /> <orderEntry type="library" name="Maven: org.jacoco:org.jacoco.agent:runtime:0.8.4" level="project" /> <orderEntry type="library" name="Maven: org.freemarker:freemarker:2.3.23" level="project" /> <orderEntry type="library" name="Maven: com.qcloud:cmq-http-client:1.0.7" level="project" /> <orderEntry type="library" name="Maven: org.slf4j:slf4j-log4j12:1.7.26" level="project" /> <orderEntry type="library" name="Maven: com.squareup.okhttp3:okhttp:3.7.0" level="project" /> <orderEntry type="library" name="Maven: com.squareup.okio:okio:1.12.0" level="project" /> <orderEntry type="library" name="Maven: net.sf.ehcache:ehcache-core:2.6.11" level="project" /> <orderEntry type="library" name="Maven: net.sf.ehcache:ehcache-web:2.0.4" level="project" /> <orderEntry type="library" name="Maven: org.springframework:spring-context:4.3.0.RELEASE" level="project" /> @@ -48,7 +58,6 @@ <orderEntry type="library" name="Maven: aspectj:aspectjrt:1.5.3" level="project" /> <orderEntry type="library" name="Maven: org.aspectj:aspectjweaver:1.5.4" level="project" /> <orderEntry type="library" name="Maven: cglib:cglib-nodep:3.2.4" level="project" /> <orderEntry type="library" name="Maven: org.freemarker:freemarker:2.3.23" level="project" /> <orderEntry type="library" scope="PROVIDED" name="Maven: javax.servlet:servlet-api:2.5" level="project" /> <orderEntry type="library" scope="PROVIDED" name="Maven: javax.servlet.jsp:jsp-api:2.2" level="project" /> <orderEntry type="library" name="Maven: cglib:cglib:2.2.2" level="project" /> @@ -93,7 +102,6 @@ <orderEntry type="library" name="Maven: org.mybatis:mybatis-spring:1.3.0" level="project" /> <orderEntry type="library" name="Maven: com.github.jai-imageio:jai-imageio-core:1.3.0" level="project" /> <orderEntry type="library" name="Maven: com.qcloud:cos_api:5.2.4" level="project" /> <orderEntry type="library" name="Maven: org.slf4j:slf4j-log4j12:1.7.21" level="project" /> <orderEntry type="library" name="Maven: joda-time:joda-time:2.9.6" level="project" /> <orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-databind:2.8.5" level="project" /> <orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-annotations:2.8.0" level="project" />