diff --git a/pom.xml b/pom.xml index 656cd01..b073589 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ com.beimi beimi - 0.1.0 + 0.2.0 jar chess @@ -19,6 +19,7 @@ UTF-8 1.8 + 7.1.0.Final @@ -117,8 +118,9 @@ - commons-beanutils - commons-beanutils + commons-beanutils + commons-beanutils + 1.8.0 @@ -175,6 +177,12 @@ poi-ooxml 3.15 + + + net.coobird + thumbnailator + 0.4.8 + com.github.binarywang @@ -222,28 +230,54 @@ org.drools drools-core - 7.0.0.Final + ${drools.version} org.drools drools-compiler - 7.0.0.Final + ${drools.version} org.drools drools-decisiontables - 7.0.0.Final + ${drools.version} org.drools drools-templates - 7.0.0.Final + ${drools.version} org.kie kie-api - 7.0.0.Final + ${drools.version} + + + org.kie + kie-spring + ${drools.version} + + + + org.springframework + spring-tx + + + org.springframework + spring-beans + + + org.springframework + spring-core + + + org.springframework + spring-context + + diff --git a/src/main/java/com/beimi/config/web/DroolsConfiguration.java b/src/main/java/com/beimi/config/web/DroolsConfiguration.java new file mode 100644 index 0000000..1b4d7ba --- /dev/null +++ b/src/main/java/com/beimi/config/web/DroolsConfiguration.java @@ -0,0 +1,79 @@ +package com.beimi.config.web; + +import java.io.IOException; + +import org.kie.api.KieBase; +import org.kie.api.KieServices; +import org.kie.api.builder.KieBuilder; +import org.kie.api.builder.KieFileSystem; +import org.kie.api.builder.KieModule; +import org.kie.api.builder.KieRepository; +import org.kie.api.builder.ReleaseId; +import org.kie.api.runtime.KieContainer; +import org.kie.internal.io.ResourceFactory; +import org.kie.spring.KModuleBeanFactoryPostProcessor; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.io.Resource; +import org.springframework.core.io.support.PathMatchingResourcePatternResolver; +import org.springframework.core.io.support.ResourcePatternResolver; + +@Configuration +public class DroolsConfiguration { + + private static final String RULES_PATH = "config/rules/"; + + @Bean + @ConditionalOnMissingBean(KieFileSystem.class) + public KieFileSystem kieFileSystem() throws IOException { + KieFileSystem kieFileSystem = getKieServices().newKieFileSystem(); + for (Resource file : getRuleFiles()) { + kieFileSystem.write(ResourceFactory.newClassPathResource(RULES_PATH + file.getFilename(), "UTF-8")); + } + return kieFileSystem; + } + + private Resource[] getRuleFiles() throws IOException { + ResourcePatternResolver resourcePatternResolver = new PathMatchingResourcePatternResolver(); + return resourcePatternResolver.getResources("classpath*:" + RULES_PATH + "**/*.*"); + } + + @Bean + @ConditionalOnMissingBean(KieContainer.class) + public KieContainer kieContainer() throws IOException { + final KieRepository kieRepository = getKieServices().getRepository(); + + kieRepository.addKieModule(new KieModule() { + public ReleaseId getReleaseId() { + return kieRepository.getDefaultReleaseId(); + } + }); + + KieBuilder kieBuilder = getKieServices().newKieBuilder(kieFileSystem()); + kieBuilder.buildAll(); + + return getKieServices().newKieContainer(kieRepository.getDefaultReleaseId()); + } + + private KieServices getKieServices() { + return KieServices.Factory.get(); + } + + @Bean + @ConditionalOnMissingBean(KieBase.class) + public KieBase kieBase() throws IOException { + return kieContainer().getKieBase(); + } + + /* + * As http://docs.jboss.org/drools/release/6.2.0.CR1/drools-docs/html/ch.kie.spring.html + * mentions: Without the org.kie.spring.KModuleBeanFactoryPostProcessor bean definition, + * the kie-spring integration will not work + */ + @Bean + @ConditionalOnMissingBean(KModuleBeanFactoryPostProcessor.class) + public KModuleBeanFactoryPostProcessor kiePostProcessor() { + return new KModuleBeanFactoryPostProcessor(); + } +} \ No newline at end of file diff --git a/src/main/java/com/beimi/config/web/GameServerConfiguration.java b/src/main/java/com/beimi/config/web/GameServerConfiguration.java index 9dec718..e55f79f 100644 --- a/src/main/java/com/beimi/config/web/GameServerConfiguration.java +++ b/src/main/java/com/beimi/config/web/GameServerConfiguration.java @@ -80,6 +80,14 @@ public class GameServerConfiguration return !StringUtils.isBlank(token); //其他安全验证策略,IP,Token,用户名 } }); + /** + * 性能优化 + */ + config.getSocketConfig().setReuseAddress(true); + config.getSocketConfig().setSoLinger(0); + config.getSocketConfig().setTcpNoDelay(true); + config.getSocketConfig().setTcpKeepAlive(true); + return server = new SocketIOServer(config); } diff --git a/src/main/java/com/beimi/config/web/StartedEventListener.java b/src/main/java/com/beimi/config/web/StartedEventListener.java index f494f53..7157a99 100644 --- a/src/main/java/com/beimi/config/web/StartedEventListener.java +++ b/src/main/java/com/beimi/config/web/StartedEventListener.java @@ -1,13 +1,54 @@ package com.beimi.config.web; +import java.util.ArrayList; +import java.util.List; + import org.springframework.context.ApplicationListener; import org.springframework.context.event.ContextRefreshedEvent; import org.springframework.stereotype.Component; +import com.beimi.core.BMDataContext; +import com.beimi.util.cache.CacheHelper; +import com.beimi.web.model.SysDic; +import com.beimi.web.model.SystemConfig; +import com.beimi.web.service.repository.jpa.SysDicRepository; +import com.beimi.web.service.repository.jpa.SystemConfigRepository; + @Component public class StartedEventListener implements ApplicationListener { + private SysDicRepository sysDicRes; @Override public void onApplicationEvent(ContextRefreshedEvent event) { + if(BMDataContext.getContext() == null){ + BMDataContext.setApplicationContext(event.getApplicationContext()); + } + sysDicRes = event.getApplicationContext().getBean(SysDicRepository.class) ; + List sysDicList = sysDicRes.findAll() ; + for(SysDic dic : sysDicList){ + CacheHelper.getSystemCacheBean().put(dic.getId(), dic, dic.getOrgi()); + if(dic.getParentid().equals("0")){ + List sysDicItemList = new ArrayList(); + for(SysDic item : sysDicList){ + if(item.getDicid()!=null && item.getDicid().equals(dic.getId())){ + sysDicItemList.add(item) ; + } + } + CacheHelper.getSystemCacheBean().put(dic.getCode(), sysDicItemList, dic.getOrgi()); + } + } + /** + * 加载系统全局配置 + */ + SystemConfigRepository systemConfigRes = event.getApplicationContext().getBean(SystemConfigRepository.class) ; + SystemConfig config = systemConfigRes.findByOrgi(BMDataContext.SYSTEM_ORGI) ; + if(config != null){ + CacheHelper.getSystemCacheBean().put("systemConfig", config, BMDataContext.SYSTEM_ORGI); + } +// GenerationRepository generationRes = event.getApplicationContext().getBean(GenerationRepository.class) ; +// List generationList = generationRes.findAll() ; +// for(Generation generation : generationList){ +// CacheHelper.getSystemCacheBean().setAtomicLong(BMDataContext.ModelType.WORKORDERS.toString(), generation.getStartinx()); +// } } } \ No newline at end of file diff --git a/src/main/java/com/beimi/core/BMDataContext.java b/src/main/java/com/beimi/core/BMDataContext.java index c29bca4..4b137f0 100644 --- a/src/main/java/com/beimi/core/BMDataContext.java +++ b/src/main/java/com/beimi/core/BMDataContext.java @@ -9,9 +9,12 @@ public class BMDataContext { public static final String GUEST_USER_ID_CODE = "BEIMIGUESTUSEKEY" ; public static final String SERVICE_QUENE_NULL_STR = "service_quene_null" ; public static final String DEFAULT_TYPE = "default" ; //默认分类代码 + public static final String BEIMI_SYSTEM_DIC = "com.dic.system.template"; + public static final String BEIMI_SYSTEM_AUTH_DIC = "com.dic.auth.resource"; + public static String SYSTEM_ORGI = "beimi" ; - private static int WebIMPort = 8081 ; + private static int WebIMPort = 9081 ; private static boolean imServerRunning = false ; //IM服务状态 diff --git a/src/main/java/com/beimi/util/BrowserClient.java b/src/main/java/com/beimi/util/BrowserClient.java new file mode 100644 index 0000000..166adce --- /dev/null +++ b/src/main/java/com/beimi/util/BrowserClient.java @@ -0,0 +1,40 @@ +package com.beimi.util; + +public class BrowserClient { + private String useragent ; + private String os ; + private String browser ; + private String version ; + private String osversion ; + + public String getUseragent() { + return useragent; + } + public void setUseragent(String useragent) { + this.useragent = useragent; + } + public String getOs() { + return os; + } + public void setOs(String os) { + this.os = os; + } + public String getBrowser() { + return browser; + } + public void setBrowser(String browser) { + this.browser = browser; + } + public String getVersion() { + return version; + } + public void setVersion(String version) { + this.version = version; + } + public String getOsversion() { + return osversion; + } + public void setOsversion(String osversion) { + this.osversion = osversion; + } +} diff --git a/src/main/java/com/beimi/util/CheckMobile.java b/src/main/java/com/beimi/util/CheckMobile.java new file mode 100644 index 0000000..2df7f40 --- /dev/null +++ b/src/main/java/com/beimi/util/CheckMobile.java @@ -0,0 +1,52 @@ +package com.beimi.util; + +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * 检测是否为移动端设备访问 , 网络共享源码 + * + * @author : Cuichenglong + * @group : tgb8 + * @Version : 1.00 + * @Date : 2014-7-7 下午01:34:31 + */ +public class CheckMobile { + + // \b 是单词边界(连着的两个(字母字符 与 非字母字符) 之间的逻辑上的间隔), + // 字符串在编译时会被转码一次,所以是 "\\b" + // \B 是单词内部逻辑间隔(连着的两个字母字符之间的逻辑上的间隔) + static String phoneReg = "\\b(ip(hone|od)|android|opera m(ob|in)i" + +"|windows (phone|ce)|blackberry" + +"|s(ymbian|eries60|amsung)|p(laybook|alm|rofile/midp" + +"|laystation portable)|nokia|fennec|htc[-_]" + +"|mobile|up.browser|[1-4][0-9]{2}x[1-4][0-9]{2})\\b"; + static String tableReg = "\\b(ipad|tablet|(Nexus 7)|up.browser" + +"|[1-4][0-9]{2}x[1-4][0-9]{2})\\b"; + + //移动设备正则匹配:手机端、平板 + static Pattern phonePat = Pattern.compile(phoneReg, Pattern.CASE_INSENSITIVE); + static Pattern tablePat = Pattern.compile(tableReg, Pattern.CASE_INSENSITIVE); + + /** + * 检测是否是移动设备访问 + * + * @Title: check + * @Date : 2014-7-7 下午01:29:07 + * @param userAgent 浏览器标识 + * @return true:移动设备接入,false:pc端接入 + */ + public static boolean check(String userAgent){ + if(null == userAgent){ + userAgent = ""; + } + // 匹配 + Matcher matcherPhone = phonePat.matcher(userAgent); + Matcher matcherTable = tablePat.matcher(userAgent); + if(matcherPhone.find() || matcherTable.find()){ + return true; + } else { + return false; + } + } +} diff --git a/src/main/java/com/beimi/util/DateConverter.java b/src/main/java/com/beimi/util/DateConverter.java new file mode 100644 index 0000000..82b2d68 --- /dev/null +++ b/src/main/java/com/beimi/util/DateConverter.java @@ -0,0 +1,40 @@ +package com.beimi.util; + +import java.util.Date; + +import org.apache.commons.beanutils.converters.DateTimeConverter; + +public class DateConverter extends DateTimeConverter { + + public DateConverter() { + } + + public DateConverter(Object defaultValue) { + super(defaultValue); + } + + /* (non-Javadoc) + * @see org.apache.commons.beanutils.converters.AbstractConverter#getDefaultType() + */ + @SuppressWarnings("rawtypes") + protected Class getDefaultType() { + return Date.class; + } + + /* + * (non-Javadoc) + * @see org.apache.commons.beanutils.converters.DateTimeConverter#convertToType(java.lang.Class, java.lang.Object) + */ + @SuppressWarnings("rawtypes") + @Override + protected Object convertToType(Class arg0, Object arg1) throws Exception { + if (arg1 == null) { + return null; + } + String value = arg1.toString().trim(); + if (value.length() == 0) { + return null; + } + return super.convertToType(arg0, arg1); + } +} \ No newline at end of file diff --git a/src/main/java/com/beimi/util/FFmpegCmdExecuter.java b/src/main/java/com/beimi/util/FFmpegCmdExecuter.java new file mode 100644 index 0000000..16ca218 --- /dev/null +++ b/src/main/java/com/beimi/util/FFmpegCmdExecuter.java @@ -0,0 +1,155 @@ +package com.beimi.util; + +import java.io.BufferedReader; +import java.io.InputStreamReader; +import java.util.ArrayList; +import java.util.List; + +import org.apache.commons.io.IOUtils; +import org.apache.commons.lang.math.NumberUtils; +import org.slf4j.LoggerFactory; + + +public class FFmpegCmdExecuter { + + private static final org.slf4j.Logger logger = LoggerFactory.getLogger(FFmpegCmdExecuter.class); + + public static String FFMPEG = "ffmpeg"; + + /** + * mp3 to amr + * @param src + * @param dest + */ + public static void mp3ToAmr(String src ,String dest){ + logger.info("mp3 to amr:" + dest); + List cmd = new ArrayList(); + cmd.add(FFMPEG); + cmd.add("-i"); + cmd.add(src); + cmd.add("-ac"); + cmd.add("1"); + cmd.add("-ar"); + cmd.add("8000"); + cmd.add(dest); + exec(cmd); + } + /** + * wav to mp3 + * @param src + * @param dest + */ + public static void wavToMp3(String src,String dest){ + logger.info("wav to mp3:"+dest); + List cmd = new ArrayList(); + cmd.add(FFMPEG); + cmd.add("-i"); + cmd.add(src); + cmd.add("-acodec"); + cmd.add("libmp3lame"); + cmd.add(dest); + exec(cmd); + } + + /** + * amr to mp3 + * @param src + * @param dest + */ + public static void amrToMp3(String src ,String dest){ + logger.info("amr to mp3:"+dest); + List cmd = new ArrayList(); + cmd.add(FFMPEG); + cmd.add("-i"); + cmd.add(src); + cmd.add(dest); + exec(cmd); + } + + /** + * ִ��ָ�� + * @param cmd ִ��ָ�� + */ + public static void exec( List cmd){ + BufferedReader stdout = null; + try { + ProcessBuilder builder = new ProcessBuilder(); + builder.command(cmd); + builder.redirectErrorStream(true); + Process proc = builder.start(); + stdout = new BufferedReader( + new InputStreamReader(proc.getInputStream())); + String line; + while ((line = stdout.readLine()) != null) { + logger.debug(line); + } + proc.waitFor(); + } catch (Exception e) { + e.printStackTrace(); + }finally{ + IOUtils.closeQuietly(stdout); + } + } + + + + + /** + * ���ˮӡͼƬ����Ƶ��ˮӡ + * @param src + * @param dest + * @param water + * @param wmPosition + * @param alpha + * @param wmPosition + * @return + */ + public static void videoWater(String src,String dest,String water,int wmPosition, float alpha,String platform) { + List cmd = new ArrayList(); + cmd.add(FFMPEG); + cmd.add("-i"); + cmd.add(src); + cmd.add("-i"); + cmd.add(water); + cmd.add("-filter_complex"); + cmd.add("''overlay=main_w-overlay_w:main_h-overlay_h''"); + cmd.add("-strict"); + cmd.add("-2"); + if(NumberUtils.toInt(platform, 0)==3){ + cmd.add("-ar"); + cmd.add("8000"); + } + cmd.add("-b"); + cmd.add("877k"); + cmd.add("-qscale"); + cmd.add("0.01"); + //ios����� + cmd.add("-movflags"); + cmd.add("faststart"); + cmd.add(dest); + exec(cmd); + } + + /** + * ���ˮӡͼƬ����Ƶ��ˮӡ + * @param src + * @param dest + */ + public static void videoPic(String src,String dest) { + List cmd = new ArrayList(); + cmd.add(FFMPEG); + cmd.add("-i"); + cmd.add(src); + cmd.add("-ss"); + cmd.add("-00:00:01"); + cmd.add("-vframes"); + cmd.add("1"); + cmd.add(dest); + exec(cmd); + } +} + + + + + diff --git a/src/main/java/com/beimi/util/IP.java b/src/main/java/com/beimi/util/IP.java new file mode 100644 index 0000000..58d4283 --- /dev/null +++ b/src/main/java/com/beimi/util/IP.java @@ -0,0 +1,43 @@ +package com.beimi.util; + +public class IP{ + private String country ; + private String province ; + private String city ; + private String isp ; + private String region ; + public String getCountry() { + return country; + } + public void setCountry(String country) { + this.country = country; + } + 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 getIsp() { + return isp; + } + public void setIsp(String isp) { + this.isp = isp; + } + public String getRegion() { + return region; + } + public void setRegion(String region) { + this.region = region; + } + + public String toString(){ + return "0".equals(this.province) || "0".equals(this.city) ? this.country : (this.province+this.city) ; + } +} diff --git a/src/main/java/com/beimi/util/IPTools.java b/src/main/java/com/beimi/util/IPTools.java new file mode 100644 index 0000000..02bf1ca --- /dev/null +++ b/src/main/java/com/beimi/util/IPTools.java @@ -0,0 +1,68 @@ +package com.beimi.util; + +import java.io.File; +import java.io.IOException; + +import org.apache.commons.io.FileUtils; +import org.apache.commons.lang3.StringUtils; +import org.lionsoul.ip2region.DataBlock; +import org.lionsoul.ip2region.DbConfig; +import org.lionsoul.ip2region.DbMakerConfigException; +import org.lionsoul.ip2region.DbSearcher; + +import com.beimi.core.BMDataContext; + +public class IPTools { + private String IP_DATA_PATH = "WEB-INF/data/ip/ip.db"; + private static IPTools iptools = new IPTools(); + private DbSearcher _searcher = null ; + + public static IPTools getInstance(){ + return iptools ; + } + + public IPTools() { + try { + File dbFile = new File(BMDataContext.getContext().getEnvironment().getProperty("web.upload-path"), "ipdata/ipdata.db") ; + if(!dbFile.exists()){ + FileUtils.copyInputStreamToFile(IPTools.class.getClassLoader().getResourceAsStream(IP_DATA_PATH),dbFile); + } + _searcher = new DbSearcher(new DbConfig(),dbFile.getAbsolutePath()); + } catch (DbMakerConfigException | IOException e) { + e.printStackTrace(); + } + } + public IP findGeography(String remote) { + IP ip = new IP(); + try{ + DataBlock block = _searcher.binarySearch(remote!=null ? remote : "127.0.0.1") ; + if(block!=null && block.getRegion() != null){ + String[] region = block.getRegion().split("[\\|]") ; + if(region.length == 5){ + ip.setCountry(region[0]); + if(!StringUtils.isBlank(region[1]) && !region[1].equalsIgnoreCase("null")){ + ip.setRegion(region[1]); + }else{ + ip.setRegion(""); + } + if(!StringUtils.isBlank(region[2]) && !region[2].equalsIgnoreCase("null")){ + ip.setProvince(region[2]); + }else{ + ip.setProvince(""); + } + if(!StringUtils.isBlank(region[3]) && !region[3].equalsIgnoreCase("null")){ + ip.setCity(region[3]); + }else{ + ip.setCity(""); + } + if(!StringUtils.isBlank(region[4]) && !region[4].equalsIgnoreCase("null")){ + ip.setIsp(region[4]); + }else{ + ip.setIsp(""); + } + } + } + }catch(Exception ex){} + return ip; + } +} diff --git a/src/main/java/com/beimi/util/PinYinTools.java b/src/main/java/com/beimi/util/PinYinTools.java new file mode 100644 index 0000000..6741de9 --- /dev/null +++ b/src/main/java/com/beimi/util/PinYinTools.java @@ -0,0 +1,138 @@ +package com.beimi.util; + + +public class PinYinTools { + private static int[] pyvalue = new int[] {-20319, -20317, -20304, -20295, -20292, -20283, -20265, -20257, -20242, -20230, -20051, -20036, -20032, + -20026, -20002, -19990, -19986, -19982, -19976, -19805, -19784, -19775, -19774, -19763, -19756, -19751, -19746, -19741, -19739, -19728, + -19725, -19715, -19540, -19531, -19525, -19515, -19500, -19484, -19479, -19467, -19289, -19288, -19281, -19275, -19270, -19263, -19261, + -19249, -19243, -19242, -19238, -19235, -19227, -19224, -19218, -19212, -19038, -19023, -19018, -19006, -19003, -18996, -18977, -18961, + -18952, -18783, -18774, -18773, -18763, -18756, -18741, -18735, -18731, -18722, -18710, -18697, -18696, -18526, -18518, -18501, -18490, + -18478, -18463, -18448, -18447, -18446, -18239, -18237, -18231, -18220, -18211, -18201, -18184, -18183, -18181, -18012, -17997, -17988, + -17970, -17964, -17961, -17950, -17947, -17931, -17928, -17922, -17759, -17752, -17733, -17730, -17721, -17703, -17701, -17697, -17692, + -17683, -17676, -17496, -17487, -17482, -17468, -17454, -17433, -17427, -17417, -17202, -17185, -16983, -16970, -16942, -16915, -16733, + -16708, -16706, -16689, -16664, -16657, -16647, -16474, -16470, -16465, -16459, -16452, -16448, -16433, -16429, -16427, -16423, -16419, + -16412, -16407, -16403, -16401, -16393, -16220, -16216, -16212, -16205, -16202, -16187, -16180, -16171, -16169, -16158, -16155, -15959, + -15958, -15944, -15933, -15920, -15915, -15903, -15889, -15878, -15707, -15701, -15681, -15667, -15661, -15659, -15652, -15640, -15631, + -15625, -15454, -15448, -15436, -15435, -15419, -15416, -15408, -15394, -15385, -15377, -15375, -15369, -15363, -15362, -15183, -15180, + -15165, -15158, -15153, -15150, -15149, -15144, -15143, -15141, -15140, -15139, -15128, -15121, -15119, -15117, -15110, -15109, -14941, + -14937, -14933, -14930, -14929, -14928, -14926, -14922, -14921, -14914, -14908, -14902, -14894, -14889, -14882, -14873, -14871, -14857, + -14678, -14674, -14670, -14668, -14663, -14654, -14645, -14630, -14594, -14429, -14407, -14399, -14384, -14379, -14368, -14355, -14353, + -14345, -14170, -14159, -14151, -14149, -14145, -14140, -14137, -14135, -14125, -14123, -14122, -14112, -14109, -14099, -14097, -14094, + -14092, -14090, -14087, -14083, -13917, -13914, -13910, -13907, -13906, -13905, -13896, -13894, -13878, -13870, -13859, -13847, -13831, + -13658, -13611, -13601, -13406, -13404, -13400, -13398, -13395, -13391, -13387, -13383, -13367, -13359, -13356, -13343, -13340, -13329, + -13326, -13318, -13147, -13138, -13120, -13107, -13096, -13095, -13091, -13076, -13068, -13063, -13060, -12888, -12875, -12871, -12860, + -12858, -12852, -12849, -12838, -12831, -12829, -12812, -12802, -12607, -12597, -12594, -12585, -12556, -12359, -12346, -12320, -12300, + -12120, -12099, -12089, -12074, -12067, -12058, -12039, -11867, -11861, -11847, -11831, -11798, -11781, -11604, -11589, -11536, -11358, + -11340, -11339, -11324, -11303, -11097, -11077, -11067, -11055, -11052, -11045, -11041, -11038, -11024, -11020, -11019, -11018, -11014, + -10838, -10832, -10815, -10800, -10790, -10780, -10764, -10587, -10544, -10533, -10519, -10331, -10329, -10328, -10322, -10315, -10309, + -10307, -10296, -10281, -10274, -10270, -10262, -10260, -10256, -10254}; + public static String[] pystr = new String[] {"A", "AI", "AN", "ANG", "AO", "BA", "BAI", "BAN", "BANG", "BAO", "BEI", "BEN", "BENG", "BI", "BIAN", + "BIAO", "BIE", "BIN", "BING", "BO", "BU", "CA", "CAI", "CAN", "CANG", "CAO", "CE", "CENG", "CHA", "CHAI", "CHAN", "CHANG", "CHAO", "CHE", + "CHEN", "CHENG", "CHI", "CHONG", "CHOU", "CHU", "CHUAI", "CHUAN", "CHUANG", "CHUI", "CHUN", "CHUO", "CI", "CONG", "COU", "CU", "CUAN", + "CUI", "CUN", "CUO", "DA", "DAI", "DAN", "DANG", "DAO", "DE", "DENG", "DI", "DIAN", "DIAO", "DIE", "DING", "DIU", "DONG", "DOU", "DU", + "DUAN", "DUI", "DUN", "DUO", "E", "EN", "ER", "FA", "FAN", "FANG", "FEI", "FEN", "FENG", "FO", "FOU", "FU", "GA", "GAI", "GAN", "GANG", + "GAO", "GE", "GEI", "GEN", "GENG", "GONG", "GOU", "GU", "GUA", "GUAI", "GUAN", "GUANG", "GUI", "GUN", "GUO", "HA", "HAI", "HAN", "HANG", + "HAO", "HE", "HEI", "HEN", "HENG", "HONG", "HOU", "HU", "HUA", "HUAI", "HUAN", "HUANG", "HUI", "HUN", "HUO", "JI", "JIA", "JIAN", + "JIANG", "JIAO", "JIE", "JIN", "JING", "JIONG", "JIU", "JU", "JUAN", "JUE", "JUN", "KA", "KAI", "KAN", "KANG", "KAO", "KE", "KEN", + "KENG", "KONG", "KOU", "KU", "KUA", "KUAI", "KUAN", "KUANG", "KUI", "KUN", "KUO", "LA", "LAI", "LAN", "LANG", "LAO", "LE", "LEI", "LENG", + "LI", "LIA", "LIAN", "LIANG", "LIAO", "LIE", "LIN", "LING", "LIU", "LONG", "LOU", "LU", "LV", "LUAN", "LUE", "LUN", "LUO", "MA", "MAI", + "MAN", "MANG", "MAO", "ME", "MEI", "MEN", "MENG", "MI", "MIAN", "MIAO", "MIE", "MIN", "MING", "MIU", "MO", "MOU", "MU", "NA", "NAI", + "NAN", "NANG", "NAO", "NE", "NEI", "NEN", "NENG", "NI", "NIAN", "NIANG", "NIAO", "NIE", "NIN", "NING", "NIU", "NONG", "NU", "NV", "NUAN", + "NUE", "NUO", "O", "OU", "PA", "PAI", "PAN", "PANG", "PAO", "PEI", "PEN", "PENG", "PI", "PIAN", "PIAO", "PIE", "PIN", "PING", "PO", "PU", + "QI", "QIA", "QIAN", "QIANG", "QIAO", "QIE", "QIN", "QING", "QIONG", "QIU", "QU", "QUAN", "QUE", "QUN", "RAN", "RANG", "RAO", "RE", + "REN", "RENG", "RI", "RONG", "ROU", "RU", "RUAN", "RUI", "RUN", "RUO", "SA", "SAI", "SAN", "SANG", "SAO", "SE", "SEN", "SENG", "SHA", + "SHAI", "SHAN", "SHANG", "SHAO", "SHE", "SHEN", "SHENG", "SHI", "SHOU", "SHU", "SHUA", "SHUAI", "SHUAN", "SHUANG", "SHUI", "SHUN", + "SHUO", "SI", "SONG", "SOU", "SU", "SUAN", "SUI", "SUN", "SUO", "TA", "TAI", "TAN", "TANG", "TAO", "TE", "TENG", "TI", "TIAN", "TIAO", + "TIE", "TING", "TONG", "TOU", "TU", "TUAN", "TUI", "TUN", "TUO", "WA", "WAI", "WAN", "WANG", "WEI", "WEN", "WENG", "WO", "WU", "XI", + "XIA", "XIAN", "XIANG", "XIAO", "XIE", "XIN", "XING", "XIONG", "XIU", "XU", "XUAN", "XUE", "XUN", "YA", "YAN", "YANG", "YAO", "YE", "YI", + "YIN", "YING", "YO", "YONG", "YOU", "YU", "YUAN", "YUE", "YUN", "ZA", "ZAI", "ZAN", "ZANG", "ZAO", "ZE", "ZEI", "ZEN", "ZENG", "ZHA", + "ZHAI", "ZHAN", "ZHANG", "ZHAO", "ZHE", "ZHEN", "ZHENG", "ZHI", "ZHONG", "ZHOU", "ZHU", "ZHUA", "ZHUAI", "ZHUAN", "ZHUANG", "ZHUI", + "ZHUN", "ZHUO", "ZI", "ZONG", "ZOU", "ZU", "ZUAN", "ZUI", "ZUN", "ZUO"}; + private StringBuilder buffer; + private String resource; + private static PinYinTools characterParser = new PinYinTools(); + + public static PinYinTools getInstance() { + return characterParser; + } + + public String getResource() { + return resource; + } + + public void setResource(String resource) { + this.resource = resource; + } + + /** * 汉字转成ASCII码 * * @param chs * @return */ + private int getChsAscii(String chs) { + int asc = 0; + try { + byte[] bytes = chs.getBytes("gb2312"); + if (bytes == null || bytes.length > 2 || bytes.length <= 0) { + throw new RuntimeException("illegal resource string"); + } + if (bytes.length == 1) { + asc = bytes[0]; + } + if (bytes.length == 2) { + int hightByte = 256 + bytes[0]; + int lowByte = 256 + bytes[1]; + asc = (256 * hightByte + lowByte) - 256 * 256; + } + } catch (Exception e) { + System.out.println("ERROR:ChineseSpelling.class-getChsAscii(String chs)" + e); + } + return asc; + } + + /** * 单字解析 * * @param str * @return */ + public String convert(String str) { + String result = null; + int ascii = getChsAscii(str); + if (ascii > 0 && ascii < 160) { + result = String.valueOf((char) ascii); + } else { + for (int i = (pyvalue.length - 1); i >= 0; i--) { + if (pyvalue[i] <= ascii) { + result = pystr[i]; + break; + } + } + } + return result; + } + + /** * 词组解析 * * @param chs * @return */ + public String getSelling(String chs) { + String key, value; + buffer = new StringBuilder(); + for (int i = 0; i < chs.length(); i++) { + key = chs.substring(i, i + 1); + if (key.getBytes().length >= 2) { + value = (String) convert(key); + if (value == null) { + value = "unknown"; + } + } else { + value = key; + } + buffer.append(value+" "); + } + return buffer.toString(); + } + + public String getSpelling() { + return this.getSelling(this.getResource()); + } + + public String getFirstPinYin(String word){ + String firstWord = "0"; + String pinYin = PinYinTools.getInstance().getSelling(word) ; + if(pinYin.length() > 0){ + firstWord = pinYin.substring(0,1) ; + } + return firstWord ; + } + +} \ No newline at end of file diff --git a/src/main/java/com/beimi/util/UKTools.java b/src/main/java/com/beimi/util/UKTools.java index add9b7e..880c9aa 100644 --- a/src/main/java/com/beimi/util/UKTools.java +++ b/src/main/java/com/beimi/util/UKTools.java @@ -1,8 +1,18 @@ package com.beimi.util; +import io.netty.handler.codec.http.HttpHeaders; + import java.beans.BeanInfo; import java.beans.Introspector; import java.beans.PropertyDescriptor; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.FileNotFoundException; +import java.io.IOException; +import java.io.ObjectInputStream; +import java.io.ObjectOutputStream; +import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.lang.reflect.Modifier; import java.security.NoSuchAlgorithmException; @@ -15,10 +25,19 @@ import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.UUID; +import java.util.regex.Matcher; +import java.util.regex.Pattern; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; +import net.coobird.thumbnailator.Thumbnails; + +import org.apache.commons.beanutils.BeanUtilsBean; +import org.apache.commons.beanutils.ConversionException; +import org.apache.commons.beanutils.ConvertUtils; +import org.apache.commons.beanutils.Converter; +import org.apache.commons.io.FileUtils; import org.apache.commons.lang.StringUtils; import org.jasypt.util.text.BasicTextEncryptor; import org.jsoup.Jsoup; @@ -32,10 +51,21 @@ import org.springframework.data.elasticsearch.repository.ElasticsearchCrudReposi import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.util.Assert; import org.springframework.util.ClassUtils; +import org.springframework.web.multipart.MultipartFile; import com.beimi.core.BMDataContext; +import com.beimi.util.cache.CacheHelper; import com.beimi.util.event.UserDataEvent; import com.beimi.util.event.UserEvent; +import com.beimi.web.model.AttachmentFile; +import com.beimi.web.model.Secret; +import com.beimi.web.model.SystemConfig; +import com.beimi.web.model.Template; +import com.beimi.web.model.User; +import com.beimi.web.service.repository.jpa.AttachmentRepository; +import com.beimi.web.service.repository.jpa.SecretRepository; +import com.beimi.web.service.repository.jpa.SystemConfigRepository; +import com.beimi.web.service.repository.jpa.TemplateRepository; import com.lmax.disruptor.dsl.Disruptor; @@ -164,7 +194,16 @@ public class UKTools { } return strb.toString() ; } - + @SuppressWarnings({ "rawtypes", "unchecked" }) + public static void published(UserEvent event , ElasticsearchCrudRepository esRes , JpaRepository dbRes){ + Disruptor disruptor = (Disruptor) BMDataContext.getContext().getBean("disruptor") ; + long seq = disruptor.getRingBuffer().next(); + UserDataEvent userDataEvent = disruptor.getRingBuffer().get(seq) ; + userDataEvent.setEvent(event); + userDataEvent.setDbRes(dbRes); + userDataEvent.setEsRes(esRes); + disruptor.getRingBuffer().publish(seq); + } /** * * @param request @@ -273,6 +312,95 @@ public class UKTools { response.setHeader("Last-Modified",String.valueOf(new Date())); } + public static BrowserClient parseClient(HttpServletRequest request){ + BrowserClient client = new BrowserClient() ; + String browserDetails = request.getHeader("User-Agent"); + String userAgent = browserDetails; + String user = userAgent.toLowerCase(); + String os = ""; + String browser = "" , version = ""; + + + //=================OS======================= + if (userAgent.toLowerCase().indexOf("windows") >= 0 ) + { + os = "windows"; + } else if(userAgent.toLowerCase().indexOf("mac") >= 0) + { + os = "mac"; + } else if(userAgent.toLowerCase().indexOf("x11") >= 0) + { + os = "unix"; + } else if(userAgent.toLowerCase().indexOf("android") >= 0) + { + os = "android"; + } else if(userAgent.toLowerCase().indexOf("iphone") >= 0) + { + os = "iphone"; + }else{ + os = "UnKnown"; + } + //===============Browser=========================== + if (user.contains("msie") || user.indexOf("rv:11") > -1) + { + if(user.indexOf("rv:11") >= 0){ + browser = "IE11" ; + }else{ + String substring=userAgent.substring(userAgent.indexOf("MSIE")).split(";")[0]; + browser=substring.split(" ")[0].replace("MSIE", "IE")+substring.split(" ")[1]; + } + }else if (user.contains("trident")) + { + browser= "IE 11" ; + }else if (user.contains("edge")) + { + browser= "Edge" ; + } else if (user.contains("safari") && user.contains("version")) + { + browser = (userAgent.substring(userAgent.indexOf("Safari")).split(" ")[0]).split("/")[0]; + version = (userAgent.substring(userAgent.indexOf("Version")).split(" ")[0]).split("/")[1] ; + } else if ( user.contains("opr") || user.contains("opera")) + { + if(user.contains("opera")) + browser=(userAgent.substring(userAgent.indexOf("Opera")).split(" ")[0]).split("/")[0]+"-"+(userAgent.substring(userAgent.indexOf("Version")).split(" ")[0]).split("/")[1]; + else if(user.contains("opr")) + browser=((userAgent.substring(userAgent.indexOf("OPR")).split(" ")[0]).replace("/", "-")).replace("OPR", "Opera"); + } else if (user.contains("chrome")) + { + browser = "Chrome"; + } else if ((user.indexOf("mozilla/7.0") > -1) || (user.indexOf("netscape6") != -1) || (user.indexOf("mozilla/4.7") != -1) || (user.indexOf("mozilla/4.78") != -1) || (user.indexOf("mozilla/4.08") != -1) || (user.indexOf("mozilla/3") != -1) ) + { + //browser=(userAgent.substring(userAgent.indexOf("MSIE")).split(" ")[0]).replace("/", "-"); + browser = "Netscape-?"; + + }else if ((user.indexOf("mozilla") > -1)) + { + //browser=(userAgent.substring(userAgent.indexOf("MSIE")).split(" ")[0]).replace("/", "-"); + if(browserDetails.indexOf(" ") > 0){ + browser = browserDetails.substring(0 , browserDetails.indexOf(" ")); + }else{ + browser = "Mozilla" ; + } + + } else if (user.contains("firefox")) + { + browser=(userAgent.substring(userAgent.indexOf("Firefox")).split(" ")[0]).replace("/", "-"); + } else if(user.contains("rv")) + { + browser="ie"; + } else + { + browser = "UnKnown"; + } + client.setUseragent(browserDetails); + client.setOs(os); + client.setBrowser(browser); + client.setVersion(version); + + return client ; + } + + public static Map transBean2Map(Object obj) { if(obj == null){ @@ -308,6 +436,61 @@ public class UKTools { } + public static void populate(Object bean , Map properties) throws IllegalAccessException, InvocationTargetException{ + ConvertUtils.register(new Converter() + { + @SuppressWarnings("rawtypes") + @Override + public Object convert(Class arg0, Object arg1) + { + if(arg1 == null) + { + return null; + } + if(!(arg1 instanceof String)){ + throw new ConversionException("只支持字符串转换 !"); + } + String str = (String)arg1; + if(str.trim().equals("")) + { + return null; + } + + SimpleDateFormat sd = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + + try{ + return sd.parse(str); + } catch(Exception e) + { + throw new RuntimeException(e); + } + + } + + }, java.util.Date.class); + if (properties == null || bean == null) { + return; + } + try { + BeanUtilsBean.getInstance().populate(bean, properties); + } catch (Exception e) { + e.printStackTrace(); + } + } + + public static byte[] toBytes(Object object) throws Exception { + ByteArrayOutputStream out = new ByteArrayOutputStream(); + ObjectOutputStream objectOutput = new ObjectOutputStream(out); + objectOutput.writeObject(object); + return out.toByteArray(); + } + + public static Object toObject(byte[] data) throws Exception { + ByteArrayInputStream input = new ByteArrayInputStream(data); + ObjectInputStream objectInput = new ObjectInputStream(input); + return objectInput.readObject(); + } + /** * * @param str @@ -408,14 +591,140 @@ public class UKTools { return workintTime ; } - @SuppressWarnings({ "rawtypes", "unchecked" }) - public static void published(UserEvent event , ElasticsearchCrudRepository esRes , JpaRepository dbRes){ - Disruptor disruptor = (Disruptor) BMDataContext.getContext().getBean("disruptor") ; - long seq = disruptor.getRingBuffer().next(); - UserDataEvent userDataEvent = disruptor.getRingBuffer().get(seq) ; - userDataEvent.setEvent(event); - userDataEvent.setDbRes(dbRes); - userDataEvent.setEsRes(esRes); - disruptor.getRingBuffer().publish(seq); + public static File processImage(File destFile,File imageFile) throws FileNotFoundException, IOException{ + if(imageFile != null && imageFile.exists()){ + Thumbnails.of(imageFile).width(460).keepAspectRatio(true).toFile(destFile); + } + return destFile ; + } + + public static String processEmoti(String message) { + Pattern pattern = Pattern.compile("\\[([\\d]*?)\\]"); + Matcher matcher = pattern.matcher(message); + StringBuffer strb = new StringBuffer(); + while(matcher.find()) { + matcher.appendReplacement(strb,""); + } + if(strb.length() == 0){ + strb.append(message) ; + } + return strb.toString() ; } + + public static String getIpAddr(HttpServletRequest request) { + String ip = request.getHeader("x-forwarded-for"); + if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { + ip = request.getHeader("Proxy-Client-IP"); + } + if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { + ip = request.getHeader("WL-Proxy-Client-IP"); + } + if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { + ip = request.getRemoteAddr(); + } + return ip; + } + + public static String getIpAddr(HttpHeaders headers , String remoteAddr) { + String ip = headers.get("x-forwarded-for"); + if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { + ip = headers.get("Proxy-Client-IP"); + } + if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { + ip = headers.get("WL-Proxy-Client-IP"); + } + if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { + ip = remoteAddr; + } + return ip; + } + + public static boolean secConfirm(SecretRepository secRes , String orgi , String confirm){ + /** + * 先调用 IMServer + */ + boolean execute = false ; + List secretConfig = secRes.findByOrgi(orgi) ; + if(!StringUtils.isBlank(confirm)){ + if(secretConfig!=null && secretConfig.size() > 0){ + Secret secret = secretConfig.get( 0) ; + if(UKTools.md5(confirm).equals(secret.getPassword())){ + execute = true ; + } + } + }else if(secretConfig.size() == 0){ + execute = true ; + } + return execute ; + } + + public static void processAttachmentFile(MultipartFile[] files, AttachmentRepository attachementRes , String path,User user , String orgi, HttpServletRequest request , String dataid , String modelid) throws IOException{ + if(files!=null && files.length > 0){ + //保存附件 + for(MultipartFile file : files){ + if(file.getSize() > 0){ //文件尺寸 限制 ?在 启动 配置中 设置 的最大值,其他地方不做限制 + String fileid = UKTools.md5(file.getBytes()) ; //使用 文件的 MD5作为 ID,避免重复上传大文件 + if(!StringUtils.isBlank(fileid)){ + AttachmentFile attachmentFile = new AttachmentFile() ; + attachmentFile.setCreater(user.getId()); + attachmentFile.setOrgi(orgi); + attachmentFile.setOrgan(user.getOrgan()); + attachmentFile.setDataid(dataid); + attachmentFile.setModelid(modelid); + attachmentFile.setFilelength((int) file.getSize()); + if(file.getContentType()!=null && file.getContentType().length() > 255){ + attachmentFile.setFiletype(file.getContentType().substring(0 , 255)); + }else{ + attachmentFile.setFiletype(file.getContentType()); + } + if(file.getOriginalFilename()!=null && file.getOriginalFilename().length() > 255){ + attachmentFile.setTitle(file.getOriginalFilename().substring(0 , 255)); + }else{ + attachmentFile.setTitle(file.getOriginalFilename()); + } + if(!StringUtils.isBlank(attachmentFile.getFiletype()) && attachmentFile.getFiletype().indexOf("image") >= 0){ + attachmentFile.setImage(true); + } + attachmentFile.setFileid(fileid); + attachementRes.save(attachmentFile) ; + FileUtils.writeByteArrayToFile(new File(path , "app/workorders/"+fileid), file.getBytes()); + } + } + } + + } + } + /** + * 获取系统配置 + * @return + */ + public static SystemConfig getSystemConfig(){ + SystemConfig systemConfig = (SystemConfig) CacheHelper.getSystemCacheBean().getCacheObject("systemConfig", BMDataContext.SYSTEM_ORGI) ; + if(systemConfig == null){ + SystemConfigRepository systemConfigRes = BMDataContext.getContext().getBean(SystemConfigRepository.class) ; + systemConfig = systemConfigRes.findByOrgi(BMDataContext.SYSTEM_ORGI) ; + } + return systemConfig; + } + + public static Template getTemplate(String id){ + TemplateRepository templateRes = BMDataContext.getContext().getBean(TemplateRepository.class) ; + return templateRes.findByIdAndOrgi(id, BMDataContext.SYSTEM_ORGI); + } + + /** + * 16进制字符串转换为字符串 + * + * @param s + * @return + */ + public static String string2HexString(String strPart) { + StringBuffer hexString = new StringBuffer(); + for (int i = 0; i < strPart.length(); i++) { + int ch = (int) strPart.charAt(i); + String strHex = Integer.toHexString(ch); + hexString.append(strHex); + } + return hexString.toString(); + } } diff --git a/src/main/java/com/beimi/util/metadata/DatabaseMetaDataHandler.java b/src/main/java/com/beimi/util/metadata/DatabaseMetaDataHandler.java new file mode 100644 index 0000000..578eeb5 --- /dev/null +++ b/src/main/java/com/beimi/util/metadata/DatabaseMetaDataHandler.java @@ -0,0 +1,90 @@ +/** + * Licensed to the Rivulet under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * webapps/LICENSE-Rivulet-1.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.beimi.util.metadata; + +import java.sql.Connection; +import java.util.List; + + +/** + * @author jaddy0302 Rivulet DatabaseMetaDataHandler.java 2010-3-21 + * + */ +public class DatabaseMetaDataHandler{ + /** + * + * @param database + * @return + * @throws Exception + */ + public static List getTables(Connection conn) throws Exception{ + List tables = null ; + { + UKDatabaseMetadata rivuDatabase = null ; + + try{ + rivuDatabase = new UKDatabaseMetadata(conn) ; + tables = rivuDatabase.loadTables(null, null, null, true) ; + }finally{ + if(conn!=null) + conn.close() ; + } + } + + return tables; + } + /** + * + * @param database + * @return + * @throws Exception + */ + public static List getTables(Connection conn , String tabltableNamePattern) throws Exception{ + List tables = null ; + { + UKDatabaseMetadata rivuDatabase = null ; + + try{ + rivuDatabase = new UKDatabaseMetadata(conn) ; + tables = rivuDatabase.loadTables(tabltableNamePattern, null, null, true) ; + }finally{ + if(conn!=null) + conn.close() ; + } + } + + return tables; + } + /** + * + * @param database + * @return + * @throws Exception + */ + public static UKTableMetaData getTable(Connection conn , String tablename) throws Exception{ + UKTableMetaData rivuTableMetaData = null ; + { + UKDatabaseMetadata rivuDatabase = null ; + rivuDatabase = new UKDatabaseMetadata(conn) ; + rivuTableMetaData = rivuDatabase.loadTable(tablename, null, null, true) ; + } + + return rivuTableMetaData; + } + +} diff --git a/src/main/java/com/beimi/util/metadata/UKColumnMetadata.java b/src/main/java/com/beimi/util/metadata/UKColumnMetadata.java new file mode 100644 index 0000000..f53a888 --- /dev/null +++ b/src/main/java/com/beimi/util/metadata/UKColumnMetadata.java @@ -0,0 +1,95 @@ +/** + * + */ +package com.beimi.util.metadata; + +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.StringTokenizer; + +import org.apache.commons.lang.StringUtils; + +/** + * @author iceworld + * + */ +public class UKColumnMetadata{ + private boolean pk = false; + private String name; + private String title ; + private String typeName; + private int columnSize; + private int decimalDigits; + private String isNullable; + private int typeCode; + + UKColumnMetadata(ResultSet rs , boolean upcase) throws SQLException { + name = rs.getString("COLUMN_NAME"); + if(upcase){ + name = name!=null ? name.toUpperCase() : name ; + } + columnSize = rs.getInt("COLUMN_SIZE"); + decimalDigits = rs.getInt("DECIMAL_DIGITS"); + isNullable = rs.getString("IS_NULLABLE"); + typeCode = rs.getInt("DATA_TYPE"); + StringTokenizer typeNameStr = new StringTokenizer( rs.getString("TYPE_NAME"), "() " ) ; + if(typeNameStr.hasMoreTokens()){ + typeName = typeNameStr.nextToken(); + } + this.title = rs.getString("REMARKS") ; + if(StringUtils.isBlank(title)){ + this.title = this.name ; + } + } + + UKColumnMetadata(String name , String typeName , int typeCode , int colunmSize) throws SQLException { + this.name = name ; + this.typeCode = typeCode; + this.typeName = typeName; + this.columnSize = colunmSize ; +} + + public String getName() { + return name; + } + + public String getTypeName() { + return typeName; + } + + public int getColumnSize() { + return columnSize; + } + + public int getDecimalDigits() { + return decimalDigits; + } + + public String getNullable() { + return isNullable; + } + + public String toString() { + return "ColumnMetadata(" + name + ')'; + } + + public int getTypeCode() { + return typeCode; + } + + public boolean isPk() { + return pk; + } + + public void setPk(boolean pk) { + this.pk = pk; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } +} diff --git a/src/main/java/com/beimi/util/metadata/UKDatabaseMetadata.java b/src/main/java/com/beimi/util/metadata/UKDatabaseMetadata.java new file mode 100644 index 0000000..425a35f --- /dev/null +++ b/src/main/java/com/beimi/util/metadata/UKDatabaseMetadata.java @@ -0,0 +1,198 @@ + +package com.beimi.util.metadata; + +import java.sql.Connection; +import java.sql.DatabaseMetaData; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Statement; +import java.util.ArrayList; +import java.util.List; +import java.util.Properties; + +import org.hibernate.annotations.common.util.StringHelper; + +public class UKDatabaseMetadata{ + private Connection connection ; + public UKDatabaseMetadata(Connection connection) + throws SQLException { + this.connection = connection ; + meta = connection.getMetaData(); + } + + + + private final List tables = new ArrayList(); + private DatabaseMetaData meta; + private Properties properties ; + private static final String[] TYPES = { "TABLE", "VIEW" }; + /** + * + * @return + */ + public List getTables() { + return this.tables; + } + /** + * + * @param name + * @param schema + * @param catalog + * @param isQuoted + * @return + * @throws Exception + */ + public List loadTables(String name, String schema, String catalog, + boolean isQuoted) throws Exception { + boolean upcase = false ; + try { + if(properties!=null && properties.get("schema")!=null && schema==null){ + schema = properties.get("upcase")!=null?((String)properties.get("schema")).toUpperCase():(String)properties.get("schema") ; + } + if(properties!=null && properties.get("upcase")!=null){ + upcase = properties.get("upcase")!=null && properties.get("upcase").toString().toLowerCase().equals("true"); + } + UKTableMetaData table = null; + Statement statement = null; + ResultSet rs = null ; + try { + if ((isQuoted && meta.storesMixedCaseQuotedIdentifiers())) { + rs = meta.getTables(catalog, schema, name, TYPES); + } else if ((isQuoted && meta.storesUpperCaseIdentifiers() && meta.storesUpperCaseQuotedIdentifiers()) + || (!isQuoted && meta.storesUpperCaseIdentifiers())) { + rs = meta.getTables(StringHelper.toUpperCase(catalog), + StringHelper.toUpperCase(schema), StringHelper + .toUpperCase(name), TYPES); + } else if ((isQuoted && meta.storesLowerCaseQuotedIdentifiers()) + || (!isQuoted && meta.storesLowerCaseIdentifiers())) { + rs = meta.getTables(StringHelper.toLowerCase(catalog), + StringHelper.toLowerCase(schema), StringHelper + .toLowerCase(name), TYPES); + }else if(schema!=null && schema.equals("hive")){ + statement = this.connection.createStatement() ; + if(properties.get("database")!=null){ + statement.execute("USE "+properties.get("database")) ; + } + rs = statement.executeQuery("SHOW TABLES") ; + } else { + rs = meta.getTables(catalog, schema, name, TYPES); + } + + while (rs.next()) { + String tableName = null ; + if(schema!=null && schema.equals("hive")){ + tableName = rs.getString("tab_name") ; + }else{ + tableName = rs.getString("TABLE_NAME"); + } + + if(tableName.matches("[\\da-zA-Z_-\u4e00-\u9fa5]+")){ + table = new UKTableMetaData(rs, meta, true , upcase , false , schema); + tables.add(table); + } + } + + }catch(Exception ex){ + ex.printStackTrace(); + } finally { + if (rs != null){ + rs.close(); + } + if(statement!=null){ + statement.close(); + } + } + } catch (SQLException sqle) { + throw sqle; + } + return tables ; + } + /** + * + * @param name + * @param schema + * @param catalog + * @param isQuoted + * @return + * @throws Exception + */ + public UKTableMetaData loadTable(String name, String schema, String catalog, + boolean isQuoted) throws Exception { + UKTableMetaData table = null; + boolean upcase = false ; + try { + if(properties!=null && properties.get("schema")!=null && schema==null){ + schema = (String)properties.get("schema") ; + } + if(properties!=null && properties.get("upcase")!=null){ + upcase = properties.get("upcase")!=null && properties.get("upcase").toString().toLowerCase().equals("true"); + } + ResultSet rs = null; + try { + if ((isQuoted && meta.storesMixedCaseQuotedIdentifiers())) { + rs = meta.getTables(catalog, schema, name, TYPES); + } else if ((isQuoted && meta.storesUpperCaseQuotedIdentifiers()) + || (!isQuoted && meta.storesUpperCaseIdentifiers())) { + rs = meta.getTables(StringHelper.toUpperCase(catalog), + StringHelper.toUpperCase(schema), StringHelper + .toUpperCase(name), TYPES); + } else if ((isQuoted && meta.storesLowerCaseQuotedIdentifiers()) + || (!isQuoted && meta.storesLowerCaseIdentifiers())) { + rs = meta.getTables(StringHelper.toLowerCase(catalog), + StringHelper.toLowerCase(schema), StringHelper + .toLowerCase(name), TYPES); + } else { + rs = meta.getTables(catalog, schema, name, TYPES); + } + + while (rs.next()) { + table = new UKTableMetaData(rs, meta, true , upcase , true , schema); + break ; + } + + } finally { + if (rs != null) + rs.close(); + } + } catch (SQLException sqle) { + sqle.printStackTrace() ; + throw sqle; + } + return table ; + } + + /** + * + * @param name + * @param schema + * @param catalog + * @param isQuoted + * @return + * @throws Exception + */ + public UKTableMetaData loadSQL(Statement statement ,String datasql, String tableName, String schema, String catalog, + boolean isQuoted) throws Exception { + UKTableMetaData table = null; + if(properties!=null && properties.get("schema")!=null){ + schema = (String)properties.get("schema") ; + } + try { + if(properties!=null && properties.get("schema")!=null && schema==null){ + schema = (String)properties.get("schema") ; + } + ResultSet rs = statement.executeQuery(datasql); + try { + table = new UKTableMetaData(tableName , schema , catalog , rs.getMetaData() , true); + }catch(Exception ex){ + ex.printStackTrace() ; + } finally { + rs.close() ; + } + } catch (SQLException sqle) { +// sqle.printStackTrace(); + throw sqle; + } + return table ; + } + +} diff --git a/src/main/java/com/beimi/util/metadata/UKTableMetaData.java b/src/main/java/com/beimi/util/metadata/UKTableMetaData.java new file mode 100644 index 0000000..a3ddc01 --- /dev/null +++ b/src/main/java/com/beimi/util/metadata/UKTableMetaData.java @@ -0,0 +1,170 @@ +package com.beimi.util.metadata; + +import java.sql.DatabaseMetaData; +import java.sql.ResultSet; +import java.sql.ResultSetMetaData; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.hibernate.annotations.common.util.StringHelper; + +/** + * JDBC table metadata + * + * @author Christoph Sturm + */ +public class UKTableMetaData { + + private final String catalog; + private final String schema; + private String name; + private final List columnMetaData = new ArrayList(); + private final Map columName = new HashMap() ; + /** + * + * @param rs + * @param meta + * @param extras + * @throws SQLException + */ + public UKTableMetaData(ResultSet rs, DatabaseMetaData meta, boolean extras, boolean upcase , boolean loadColumns , String dbtype) + throws SQLException { + if(dbtype!=null && dbtype.equals("hive")){ + catalog = null; + schema = null; + if(upcase){ + name = rs.getObject("tab_name").toString() ; + }else{ + name = rs.getObject("tab_name").toString(); + } + }else{ + catalog = rs.getString("TABLE_CAT"); + schema = rs.getString("TABLE_SCHEM"); + if(upcase){ + name = rs.getString("TABLE_NAME").toUpperCase() ; + }else{ + name = rs.getString("TABLE_NAME"); + } + } + + if(loadColumns){ + initColumns(meta , upcase); + } + } + /** + * + * @param tablename + * @param meta + * @param extras + * @throws SQLException + */ + public UKTableMetaData(String tableName , String tableCatalog , String tableSchema, ResultSetMetaData meta, boolean extras) + throws SQLException { + catalog = tableCatalog; + schema = tableSchema; + name = tableName; + initColumns(meta); + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name ; + } + + public String toString() { + return "TableMetadata(" + name + ')'; + } + + public List getColumnMetadatas() { + return columnMetaData; + } + + /** + * + * @param rs + * @throws SQLException + */ + public void addColumn(ResultSet rs , boolean upcase ) throws SQLException { + String column = rs.getString("COLUMN_NAME"); + if(upcase){ + column = column!=null ? column.toUpperCase() : column ; + } + if (column == null) + return; + + if (columName.get(column) == null) { + UKColumnMetadata info = new UKColumnMetadata(rs , upcase); + columnMetaData.add(info) ; + if(upcase){ + columName.put(info.getName().toUpperCase(),""); + }else{ + columName.put(info.getName().toLowerCase(),""); + } + } + } + /** + * + * @param rs + * @throws SQLException + */ + public void addSqlColumn(String name , String typeName , int typeCode , int columSize) throws SQLException { + + if (name == null) + return; + + if (columName.get(name) == null) { + UKColumnMetadata info = new UKColumnMetadata(name , typeName , typeCode , columSize); + columnMetaData.add(info) ; + columName.put(info.getName().toLowerCase(),""); + } + } + /** + * + * @param meta + * @throws SQLException + */ + private void initColumns(DatabaseMetaData meta , boolean upcase) throws SQLException { + ResultSet rs = null; + + try { + if (meta.storesUpperCaseIdentifiers()) { + rs = meta.getColumns(StringHelper.toUpperCase(catalog), + StringHelper.toUpperCase(schema), StringHelper + .toUpperCase(name), "%"); + } else if (meta.storesLowerCaseIdentifiers()) { + rs = meta.getColumns(StringHelper.toLowerCase(catalog), + StringHelper.toLowerCase(schema), StringHelper + .toLowerCase(name), "%"); + } else { + rs = meta.getColumns(catalog, schema, name, "%"); + } + while (rs.next()) + addColumn(rs , upcase); + }catch(Exception ex){ + ex.printStackTrace(); + }finally { + if (rs != null) + rs.close(); + } + } + /** + * + * @param meta + * @throws SQLException + */ + private void initColumns(ResultSetMetaData meta) throws SQLException { + for(int i=1 ; i<=meta.getColumnCount(); i++){ + Object tbName = meta.getColumnName(i) ; + if(tbName!=null && String.valueOf(tbName).toLowerCase().indexOf("rownum")<0){ + addSqlColumn(meta.getColumnName(i) , meta.getColumnTypeName(i) , meta.getColumnType(i) , meta.getColumnDisplaySize(i)); + } + } + } + +} diff --git a/src/main/java/com/beimi/web/handler/admin/AdminController.java b/src/main/java/com/beimi/web/handler/admin/AdminController.java index d8b0d89..4920ec1 100644 --- a/src/main/java/com/beimi/web/handler/admin/AdminController.java +++ b/src/main/java/com/beimi/web/handler/admin/AdminController.java @@ -22,6 +22,8 @@ public class AdminController extends Handler{ @Autowired private UserRepository userRes; +// @Autowired +// private KieContainer kieContainer; @Autowired private SysDicRepository sysDicRes ; @@ -29,6 +31,14 @@ public class AdminController extends Handler{ @RequestMapping("/admin/content") @Menu(type = "admin" , subtype = "content") public ModelAndView content(ModelMap map , HttpServletRequest request) { + +// KieSession kieSession = kieContainer.newKieSession() ; +// long start = System.currentTimeMillis() ; +// kieSession.insert(super.getUser(request)); +// int ruleFiredCount = kieSession.fireAllRules(); +// System.out.println(ruleFiredCount); +// kieSession.dispose(); +// System.out.println(System.currentTimeMillis() - start); return request(super.createAdminTempletResponse("/admin/desktop/index")); } } \ No newline at end of file diff --git a/src/main/java/com/beimi/web/handler/admin/system/HazelcastMonitorController.java b/src/main/java/com/beimi/web/handler/admin/system/HazelcastMonitorController.java new file mode 100644 index 0000000..3a0d803 --- /dev/null +++ b/src/main/java/com/beimi/web/handler/admin/system/HazelcastMonitorController.java @@ -0,0 +1,47 @@ +package com.beimi.web.handler.admin.system; + +import java.sql.SQLException; +import java.util.HashMap; +import java.util.Map; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import org.springframework.stereotype.Controller; +import org.springframework.ui.ModelMap; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.servlet.ModelAndView; + +import com.beimi.util.Menu; +import com.beimi.web.handler.Handler; +import com.google.gson.Gson; +import com.hazelcast.com.eclipsesource.json.JsonObject; + +@Controller +@RequestMapping("/admin/monitor") +public class HazelcastMonitorController extends Handler{ + + @RequestMapping("/hazelcast") + @Menu(type = "admin" , subtype = "metadata" , admin = true) + public ModelAndView index(ModelMap map , HttpServletRequest request , HttpServletResponse response) throws SQLException { + Map jsonObjectMap = new HashMap< String , Object>(); + map.addAttribute("systemStatics", new Gson().toJson(jsonObjectMap)) ; + + response.setCharacterEncoding("UTF-8"); + response.setContentType("application/json; charset=utf-8"); + return request(super.createRequestPageTempletResponse("/admin/system/monitor/hazelcast")); + } + /** + * 转换统计数据 + * @param json + * @return + */ + @SuppressWarnings("unused") + private Map convert(JsonObject json){ + Map values = new HashMap(); + for(String key : json.names()){ + values.put(key, json.get(key)) ; + } + return values; + } +} \ No newline at end of file diff --git a/src/main/java/com/beimi/web/handler/admin/system/MetadataController.java b/src/main/java/com/beimi/web/handler/admin/system/MetadataController.java new file mode 100644 index 0000000..4cebbcb --- /dev/null +++ b/src/main/java/com/beimi/web/handler/admin/system/MetadataController.java @@ -0,0 +1,245 @@ +package com.beimi.web.handler.admin.system; + +import java.sql.Connection; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Date; + +import javax.persistence.EntityManager; +import javax.persistence.PersistenceContext; +import javax.servlet.http.HttpServletRequest; +import javax.validation.Valid; + +import org.apache.commons.lang.StringUtils; +import org.hibernate.Session; +import org.hibernate.jdbc.Work; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.PageRequest; +import org.springframework.stereotype.Controller; +import org.springframework.ui.ModelMap; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.servlet.ModelAndView; + +import com.beimi.util.Menu; +import com.beimi.util.UKTools; +import com.beimi.util.metadata.DatabaseMetaDataHandler; +import com.beimi.util.metadata.UKColumnMetadata; +import com.beimi.util.metadata.UKTableMetaData; +import com.beimi.web.handler.Handler; +import com.beimi.web.model.MetadataTable; +import com.beimi.web.model.TableProperties; +import com.beimi.web.model.User; +import com.beimi.web.service.repository.jpa.MetadataRepository; +import com.beimi.web.service.repository.jpa.SysDicRepository; +import com.beimi.web.service.repository.jpa.TablePropertiesRepository; + +@Controller +@RequestMapping("/admin/metadata") +public class MetadataController extends Handler{ + + @Autowired + private MetadataRepository metadataRes ; + + @Autowired + private SysDicRepository sysDicRes ; + + @Autowired + private TablePropertiesRepository tablePropertiesRes ; + + @Autowired + @PersistenceContext + private EntityManager em; + + @RequestMapping("/index") + @Menu(type = "admin" , subtype = "metadata" , admin = true) + public ModelAndView index(ModelMap map , HttpServletRequest request) throws SQLException { + map.addAttribute("metadataList", metadataRes.findAll(new PageRequest(super.getP(request), super.getPs(request)))) ; + return request(super.createAdminTempletResponse("/admin/system/metadata/index")); + } + + @RequestMapping("/edit") + @Menu(type = "admin" , subtype = "metadata" , admin = true) + public ModelAndView edit(ModelMap map , HttpServletRequest request , @Valid String id) { + map.addAttribute("metadata", metadataRes.findById(id)) ; + return request(super.createRequestPageTempletResponse("/admin/system/metadata/edit")); + } + + @RequestMapping("/update") + @Menu(type = "admin" , subtype = "metadata" , admin = true) + public ModelAndView update(ModelMap map , HttpServletRequest request , @Valid MetadataTable metadata) throws SQLException { + MetadataTable table = metadataRes.findById(metadata.getId()) ; + table.setName(metadata.getName()); + metadataRes.save(table); + return request(super.createRequestPageTempletResponse("redirect:/admin/metadata/index.html")); + } + + @RequestMapping("/properties/edit") + @Menu(type = "admin" , subtype = "metadata" , admin = true) + public ModelAndView propertiesedit(ModelMap map , HttpServletRequest request , @Valid String id) { + map.addAttribute("tp", tablePropertiesRes.findById(id)) ; + map.addAttribute("sysdicList", sysDicRes.findByParentid("0")) ; + return request(super.createRequestPageTempletResponse("/admin/system/metadata/tpedit")); + } + + @RequestMapping("/properties/update") + @Menu(type = "admin" , subtype = "metadata" , admin = true) + public ModelAndView propertiesupdate(ModelMap map , HttpServletRequest request , @Valid TableProperties tp) throws SQLException { + TableProperties tableProperties = tablePropertiesRes.findById(tp.getId()) ; + tableProperties.setName(tp.getName()); + tableProperties.setSeldata(tp.isSeldata()); + tableProperties.setSeldatacode(tp.getSeldatacode()); + + tableProperties.setSystemfield(tp.isSystemfield()); + + tableProperties.setImpfield(tp.isImpfield()); + + tablePropertiesRes.save(tableProperties); + return request(super.createRequestPageTempletResponse("redirect:/admin/metadata/table.html?id="+tableProperties.getDbtableid())); + } + + @RequestMapping("/delete") + @Menu(type = "admin" , subtype = "metadata" , admin = true) + public ModelAndView delete(ModelMap map , HttpServletRequest request , @Valid String id) throws SQLException { + MetadataTable table = metadataRes.findById(id) ; + metadataRes.delete(table); + return request(super.createRequestPageTempletResponse("redirect:/admin/metadata/index.html")); + } + + @RequestMapping("/batdelete") + @Menu(type = "admin" , subtype = "metadata" , admin = true) + public ModelAndView batdelete(ModelMap map , HttpServletRequest request , @Valid String[] ids) throws SQLException { + if(ids!=null && ids.length>0){ + metadataRes.delete(metadataRes.findAll(Arrays.asList(ids)) ); + } + return request(super.createRequestPageTempletResponse("redirect:/admin/metadata/index.html")); + } + + @RequestMapping("/properties/delete") + @Menu(type = "admin" , subtype = "metadata" , admin = true) + public ModelAndView propertiesdelete(ModelMap map , HttpServletRequest request , @Valid String id , @Valid String tbid) throws SQLException { + TableProperties prop = tablePropertiesRes.findById(id) ; + tablePropertiesRes.delete(prop); + return request(super.createRequestPageTempletResponse("redirect:/admin/metadata/table.html?id="+ (!StringUtils.isBlank(tbid) ? tbid : prop.getDbtableid()))); + } + + @RequestMapping("/properties/batdelete") + @Menu(type = "admin" , subtype = "metadata" , admin = true) + public ModelAndView propertiesbatdelete(ModelMap map , HttpServletRequest request , @Valid String[] ids, @Valid String tbid) throws SQLException { + if(ids!=null && ids.length>0){ + tablePropertiesRes.delete(tablePropertiesRes.findAll(Arrays.asList(ids)) ); + } + return request(super.createRequestPageTempletResponse("redirect:/admin/metadata/table.html?id="+ tbid)); + } + + @RequestMapping("/table") + @Menu(type = "admin" , subtype = "metadata" , admin = true) + public ModelAndView table(ModelMap map , HttpServletRequest request , @Valid String id) throws SQLException { + map.addAttribute("propertiesList", tablePropertiesRes.findByDbtableid(id)) ; + map.addAttribute("tbid", id) ; + return request(super.createAdminTempletResponse("/admin/system/metadata/table")); + } + + @RequestMapping("/imptb") + @Menu(type = "admin" , subtype = "metadata" , admin = true) + public ModelAndView imptb(final ModelMap map , HttpServletRequest request) throws Exception { + + Session session = (Session) em.getDelegate(); + session.doWork(new Work() { + public void execute(Connection connection) throws SQLException { + try { + map.addAttribute("tablesList", + DatabaseMetaDataHandler.getTables(connection)); + } catch (Exception e) { + e.printStackTrace(); + }finally{ + connection.close(); + } + } + }); + + return request(super + .createRequestPageTempletResponse("/admin/system/metadata/imptb")); + } + + @RequestMapping("/imptbsave") + @Menu(type = "admin" , subtype = "metadata" , admin = true) + public ModelAndView imptb(ModelMap map , HttpServletRequest request , final @Valid String[] tables) throws Exception { + final User user = super.getUser(request) ; + if(tables!=null && tables.length > 0){ + Session session = (Session) em.getDelegate(); + session.doWork( + new Work() { + public void execute(Connection connection) throws SQLException + { + try{ + for(String table : tables){ + int count = metadataRes.countByTablename(table) ; + if(count == 0){ + MetadataTable metaDataTable = new MetadataTable(); + //当前记录没有被添加过,进行正常添加 + metaDataTable.setTablename(table); + metaDataTable.setOrgi(user.getOrgi()); + metaDataTable.setId(UKTools.md5(metaDataTable.getTablename())); + metaDataTable.setTabledirid("0"); + metaDataTable.setCreater(user.getId()); + metaDataTable.setCreatername(user.getUsername()); + metaDataTable.setName(table); + metaDataTable.setUpdatetime(new Date()); + metaDataTable.setCreatetime(new Date()); + metadataRes.save(processMetadataTable( DatabaseMetaDataHandler.getTable(connection, metaDataTable.getTablename()) , metaDataTable)); + } + } + }catch(Exception ex){ + ex.printStackTrace(); + }finally{ + connection.close(); + } + } + } + ); + + } + + return request(super.createRequestPageTempletResponse("redirect:/admin/metadata/index.html")); + } + + private MetadataTable processMetadataTable(UKTableMetaData metaData , MetadataTable table){ + table.setTableproperty(new ArrayList()); + if(metaData!=null){ + for(UKColumnMetadata colum : metaData.getColumnMetadatas()){ + TableProperties tablePorperties = new TableProperties(colum.getName().toLowerCase() , colum.getTypeName() , colum.getColumnSize() , metaData.getName().toLowerCase()) ; + tablePorperties.setOrgi(table.getOrgi()) ; + + tablePorperties.setDatatypecode(0); + tablePorperties.setLength(colum.getColumnSize()); + tablePorperties.setDatatypename(getDataTypeName(colum.getTypeName())); + tablePorperties.setName(colum.getTitle().toLowerCase()); + if(tablePorperties.getFieldname().equals("create_time") || tablePorperties.getFieldname().equals("createtime") || tablePorperties.getFieldname().equals("update_time")){ + tablePorperties.setDatatypename(getDataTypeName("datetime")); + } + if(colum.getName().startsWith("field")){ + tablePorperties.setFieldstatus(false); + }else{ + tablePorperties.setFieldstatus(true); + } + table.getTableproperty().add(tablePorperties) ; + } + table.setTablename(table.getTablename().toLowerCase());//转小写 + } + return table ; + } + + public String getDataTypeName(String type){ + String typeName = "text" ; + if(type.indexOf("varchar")>=0){ + typeName = "text" ; + }else if(type.equalsIgnoreCase("date") || type.equalsIgnoreCase("datetime")){ + typeName = type.toLowerCase() ; + }else if(type.equalsIgnoreCase("int") || type.equalsIgnoreCase("float") || type.equalsIgnoreCase("number")){ + typeName = "number" ; + } + return typeName ; + } + +} \ No newline at end of file diff --git a/src/main/java/com/beimi/web/handler/admin/system/OrganController.java b/src/main/java/com/beimi/web/handler/admin/system/OrganController.java new file mode 100644 index 0000000..b7575d2 --- /dev/null +++ b/src/main/java/com/beimi/web/handler/admin/system/OrganController.java @@ -0,0 +1,207 @@ +package com.beimi.web.handler.admin.system; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +import javax.servlet.http.HttpServletRequest; +import javax.validation.Valid; + +import org.apache.commons.lang.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.ui.ModelMap; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.servlet.ModelAndView; + +import com.beimi.util.Menu; +import com.beimi.web.handler.Handler; +import com.beimi.web.model.Organ; +import com.beimi.web.model.OrganRole; +import com.beimi.web.model.Role; +import com.beimi.web.model.User; +import com.beimi.web.service.repository.jpa.OrganRepository; +import com.beimi.web.service.repository.jpa.OrganRoleRepository; +import com.beimi.web.service.repository.jpa.RoleRepository; +import com.beimi.web.service.repository.jpa.UserRepository; + +/** + * + * @author 程序猿DD + * @version 1.0.0 + * @blog http://blog.didispace.com + * + */ +@Controller +@RequestMapping("/admin/organ") +public class OrganController extends Handler{ + + @Autowired + private OrganRepository organRepository; + + @Autowired + private RoleRepository roleRepository; + + @Autowired + private UserRepository userRepository; + + @Autowired + private OrganRoleRepository organRoleRes ; + + @RequestMapping("/index") + @Menu(type = "admin" , subtype = "organ") + public ModelAndView index(ModelMap map , HttpServletRequest request , @Valid String organ) { + List organList = organRepository.findAll() ; + map.addAttribute("organList", organList); + if(organList.size() > 0){ + Organ organData = null ; + if(!StringUtils.isBlank(organ)){ + for(Organ data : organList){ + if(data.getId().equals(organ)){ + map.addAttribute("organData", data); + organData = data; + } + } + }else{ + map.addAttribute("organData", organData = organList.get(0)); + } + if(organData!=null){ + map.addAttribute("userList", userRepository.findByOrganAndOrgi(organData.getId() , super.getOrgi(request))); + } + } + map.addAttribute("roleList", roleRepository.findAll()); + return request(super.createAdminTempletResponse("/admin/system/organ/index")); + } + + @RequestMapping("/add") + @Menu(type = "admin" , subtype = "organ") + public ModelAndView add(ModelMap map , HttpServletRequest request) { + return request(super.createRequestPageTempletResponse("/admin/system/organ/add")); + } + + @RequestMapping("/save") + @Menu(type = "admin" , subtype = "organ") + public ModelAndView save(HttpServletRequest request ,@Valid Organ organ) { + Organ tempOrgan = organRepository.findByNameAndOrgi(organ.getName(), super.getOrgi(request)) ; + String msg = "admin_organ_save_success" ; + if(tempOrgan != null){ + msg = "admin_organ_save_exist"; + }else{ + organ.setOrgi(super.getOrgi(request)); + organRepository.save(organ) ; + } + return request(super.createRequestPageTempletResponse("redirect:/admin/organ/index.html?msg="+msg)); + } + + @RequestMapping("/seluser") + @Menu(type = "admin" , subtype = "seluser" , admin = true) + public ModelAndView seluser(ModelMap map , HttpServletRequest request , @Valid String organ) { + map.addAttribute("userList", userRepository.findByOrgiAndDatastatus(super.getOrgi(request) , false)) ; + Organ organData = organRepository.findByIdAndOrgi(organ, super.getOrgi(request)) ; + map.addAttribute("userOrganList", userRepository.findByOrganAndOrgi(organ, super.getOrgi(request))) ; + map.addAttribute("organ", organData) ; + return request(super.createRequestPageTempletResponse("/admin/system/organ/seluser")); + } + + + @RequestMapping("/saveuser") + @Menu(type = "admin" , subtype = "saveuser" , admin = true) + public ModelAndView saveuser(HttpServletRequest request ,@Valid String[] users , @Valid String organ) { + List userList = new ArrayList(); + if(users!=null && users.length > 0){ + for(String user : users){ + userList.add(user) ; + } + List organUserList = userRepository.findAll(userList) ; + for(User user : organUserList){ + user.setOrgan(organ); + } + userRepository.save(organUserList) ; + } + + return request(super.createRequestPageTempletResponse("redirect:/admin/organ/index.html?organ="+organ)); + } + + @RequestMapping("/user/delete") + @Menu(type = "admin" , subtype = "role") + public ModelAndView userroledelete(HttpServletRequest request ,@Valid String id , @Valid String organ) { + if(id!=null){ + User user= userRepository.getOne(id) ; + user.setOrgan(null); + userRepository.save(user) ; + } + return request(super.createRequestPageTempletResponse("redirect:/admin/organ/index.html?organ="+organ)); + } + + @RequestMapping("/edit") + @Menu(type = "admin" , subtype = "organ") + public ModelAndView edit(ModelMap map ,HttpServletRequest request , @Valid String id) { + ModelAndView view = request(super.createRequestPageTempletResponse("/admin/system/organ/edit")) ; + view.addObject("organData", organRepository.findByIdAndOrgi(id, super.getOrgi(request))) ; + return view; + } + + @RequestMapping("/update") + @Menu(type = "admin" , subtype = "organ") + public ModelAndView update(HttpServletRequest request ,@Valid Organ organ) { + Organ tempOrgan = organRepository.findByIdAndOrgi(organ.getId(), super.getOrgi(request)) ; + String msg = "admin_organ_update_success" ; + if(tempOrgan != null){ + tempOrgan.setName(organ.getName()); + tempOrgan.setUpdatetime(new Date()); + tempOrgan.setOrgi(super.getOrgi(request)); + tempOrgan.setSkill(organ.isSkill()); + organRepository.save(tempOrgan) ; + }else{ + msg = "admin_organ_update_not_exist"; + } + return request(super.createRequestPageTempletResponse("redirect:/admin/organ/index.html?msg="+msg)); + } + + @RequestMapping("/delete") + @Menu(type = "admin" , subtype = "organ") + public ModelAndView delete(HttpServletRequest request ,@Valid Organ organ) { + String msg = "admin_organ_delete" ; + if(organ!=null){ + organRepository.delete(organ); + }else{ + msg = "admin_organ_not_exist" ; + } + return request(super.createRequestPageTempletResponse("redirect:/admin/organ/index.html?msg="+msg)); + } + + @RequestMapping("/auth") + @Menu(type = "admin" , subtype = "organ") + public ModelAndView auth(ModelMap map ,HttpServletRequest request , @Valid String id) { + Organ organData = organRepository.findByIdAndOrgi(id, super.getOrgi(request)) ; + map.addAttribute("organData", organData) ; + map.addAttribute("roleList", roleRepository.findByOrgi(super.getOrgi(request))) ; + + map.addAttribute("organRoleList", organRoleRes.findByOrgiAndOrgan(super.getOrgi(request), organData)) ; + + return request(super.createRequestPageTempletResponse("/admin/system/organ/auth")); + } + + @RequestMapping("/auth/save") + @Menu(type = "admin" , subtype = "role") + public ModelAndView authsave(HttpServletRequest request ,@Valid String id ,@Valid String roles) { + Organ organData = organRepository.findByIdAndOrgi(id, super.getOrgi(request)) ; + List organRoleList = organRoleRes.findByOrgiAndOrgan(super.getOrgi(request), organData) ; + organRoleRes.delete(organRoleList); + if(!StringUtils.isBlank(roles)){ + String[] rolesarray = roles.split(",") ; + for(String role : rolesarray){ + OrganRole organRole = new OrganRole(); + Role tempRole = new Role(); + tempRole.setId(role); + organRole.setRole(tempRole); + organRole.setOrgan(organData); + organRole.setCreater(super.getUser(request).getId()); + organRole.setOrgi(super.getOrgi(request)); + organRole.setCreatetime(new Date()); + organRoleRes.save(organRole) ; + } + } + return request(super.createRequestPageTempletResponse("redirect:/admin/organ/index.html")); + } +} \ No newline at end of file diff --git a/src/main/java/com/beimi/web/handler/admin/system/RoleController.java b/src/main/java/com/beimi/web/handler/admin/system/RoleController.java new file mode 100644 index 0000000..02559fc --- /dev/null +++ b/src/main/java/com/beimi/web/handler/admin/system/RoleController.java @@ -0,0 +1,216 @@ +package com.beimi.web.handler.admin.system; + +import java.util.Date; +import java.util.List; + +import javax.servlet.http.HttpServletRequest; +import javax.validation.Valid; + +import org.apache.commons.lang.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.PageRequest; +import org.springframework.stereotype.Controller; +import org.springframework.ui.ModelMap; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.servlet.ModelAndView; + +import com.beimi.core.BMDataContext; +import com.beimi.util.Menu; +import com.beimi.web.handler.Handler; +import com.beimi.web.model.Role; +import com.beimi.web.model.RoleAuth; +import com.beimi.web.model.SysDic; +import com.beimi.web.model.UKeFuDic; +import com.beimi.web.model.User; +import com.beimi.web.model.UserRole; +import com.beimi.web.service.repository.jpa.RoleAuthRepository; +import com.beimi.web.service.repository.jpa.RoleRepository; +import com.beimi.web.service.repository.jpa.SysDicRepository; +import com.beimi.web.service.repository.jpa.UserRepository; +import com.beimi.web.service.repository.jpa.UserRoleRepository; + +@Controller +@RequestMapping("/admin/role") +public class RoleController extends Handler{ + + @Autowired + private RoleRepository roleRepository; + + @Autowired + private UserRoleRepository userRoleRes; + + @Autowired + private RoleAuthRepository roleAuthRes ; + + @Autowired + private UserRepository userRepository; + + @Autowired + private SysDicRepository sysDicRes; + + @RequestMapping("/index") + @Menu(type = "admin" , subtype = "role") + public ModelAndView index(ModelMap map , HttpServletRequest request , @Valid String role) { + List roleList = roleRepository.findAll() ; + map.addAttribute("roleList", roleList); + if(roleList.size() > 0){ + Role roleData = null ; + if(!StringUtils.isBlank(role)){ + for(Role data : roleList){ + if(data.getId().equals(role)){ + roleData = data ; + map.addAttribute("roleData", data); + } + } + }else{ + map.addAttribute("roleData", roleData = roleList.get(0)); + } + if(roleData!=null){ + map.addAttribute("userRoleList", userRoleRes.findByOrgiAndRole(super.getOrgi(request), roleData, new PageRequest(super.getP(request), super.getPs(request))) ); + } + } + return request(super.createAdminTempletResponse("/admin/system/role/index")); + } + + @RequestMapping("/add") + @Menu(type = "admin" , subtype = "role") + public ModelAndView add(ModelMap map , HttpServletRequest request) { + return request(super.createRequestPageTempletResponse("/admin/system/role/add")); + } + + @RequestMapping("/save") + @Menu(type = "admin" , subtype = "role") + public ModelAndView save(HttpServletRequest request ,@Valid Role role) { + Role tempRole = roleRepository.findByNameAndOrgi(role.getName(), super.getOrgi(request)) ; + String msg = "admin_role_save_success" ; + if(tempRole != null){ + msg = "admin_role_save_exist"; + }else{ + role.setOrgi(super.getOrgi(request)); + role.setCreater(super.getUser(request).getId()); + role.setCreatetime(new Date()); + role.setUpdatetime(new Date()); + roleRepository.save(role) ; + } + return request(super.createRequestPageTempletResponse("redirect:/admin/role/index.html?msg="+msg)); + } + + @RequestMapping("/seluser") + @Menu(type = "admin" , subtype = "seluser" , admin = true) + public ModelAndView seluser(ModelMap map , HttpServletRequest request , @Valid String role) { + map.addAttribute("userList", userRepository.findByOrgiAndDatastatus(super.getOrgi(request) , false)) ; + Role roleData = roleRepository.findByIdAndOrgi(role, super.getOrgi(request)) ; + map.addAttribute("userRoleList", userRoleRes.findByOrgiAndRole(super.getOrgi(request) , roleData)) ; + map.addAttribute("role", roleData) ; + return request(super.createRequestPageTempletResponse("/admin/system/role/seluser")); + } + + + @RequestMapping("/saveuser") + @Menu(type = "admin" , subtype = "saveuser" , admin = true) + public ModelAndView saveuser(HttpServletRequest request ,@Valid String[] users , @Valid String role) { + Role roleData = roleRepository.findByIdAndOrgi(role, super.getOrgi(request)) ; + List userRoleList = userRoleRes.findByOrgiAndRole(super.getOrgi(request) , roleData) ; + if(users!=null && users.length > 0){ + for(String user : users){ + boolean exist = false ; + for(UserRole userRole : userRoleList){ + if(user.equals(userRole.getUser().getId())){ + exist = true ; continue ; + } + } + if(exist == false) { + UserRole userRole = new UserRole() ; + userRole.setUser(new User(user)); + userRole.setRole(new Role(role)); + userRole.setOrgi(super.getOrgi(request)); + userRole.setCreater(super.getUser(request).getId()); + userRoleRes.save(userRole) ; + } + } + } + return request(super.createRequestPageTempletResponse("redirect:/admin/role/index.html?role="+role)); + } + + @RequestMapping("/user/delete") + @Menu(type = "admin" , subtype = "role") + public ModelAndView userroledelete(HttpServletRequest request ,@Valid String id , @Valid String role) { + if(role!=null){ + userRoleRes.delete(id); + } + return request(super.createRequestPageTempletResponse("redirect:/admin/role/index.html?role="+role)); + } + + @RequestMapping("/edit") + @Menu(type = "admin" , subtype = "role") + public ModelAndView edit(ModelMap map , HttpServletRequest request ,@Valid String id) { + ModelAndView view = request(super.createRequestPageTempletResponse("/admin/system/role/edit")) ; + view.addObject("roleData", roleRepository.findByIdAndOrgi(id, super.getOrgi(request))) ; + return view; + } + + @RequestMapping("/update") + @Menu(type = "admin" , subtype = "role") + public ModelAndView update(HttpServletRequest request ,@Valid Role role) { + Role tempRole = roleRepository.findByIdAndOrgi(role.getId(), super.getOrgi(request)) ; + String msg = "admin_role_update_success" ; + if(tempRole != null){ + tempRole.setName(role.getName()); + tempRole.setUpdatetime(new Date()); + roleRepository.save(tempRole) ; + }else{ + msg = "admin_role_update_not_exist"; + } + return request(super.createRequestPageTempletResponse("redirect:/admin/role/index.html?msg="+msg)); + } + + @RequestMapping("/delete") + @Menu(type = "admin" , subtype = "role") + public ModelAndView delete(HttpServletRequest request ,@Valid Role role) { + String msg = "admin_role_delete" ; + if(role!=null){ + userRoleRes.delete(userRoleRes.findByOrgiAndRole(super.getOrgi(request), role)); + roleRepository.delete(role); + }else{ + msg = "admin_role_not_exist" ; + } + return request(super.createRequestPageTempletResponse("redirect:/admin/role/index.html?msg="+msg)); + } + + @RequestMapping("/auth") + @Menu(type = "admin" , subtype = "role") + public ModelAndView auth(ModelMap map , HttpServletRequest request , @Valid String id) { + SysDic sysDic = sysDicRes.findByCode(BMDataContext.BEIMI_SYSTEM_AUTH_DIC) ; + if(sysDic!=null){ + map.addAttribute("resourceList", sysDicRes.findByDicid(sysDic.getId())) ; + } + map.addAttribute("sysDic", sysDic) ; + Role role = roleRepository.findByIdAndOrgi(id, super.getOrgi(request)) ; + map.addAttribute("role", role) ; + map.addAttribute("roleAuthList", roleAuthRes.findByRoleidAndOrgi(role.getId(), super.getOrgi(request))) ; + return request(super.createRequestPageTempletResponse("/admin/system/role/auth")); + } + + @RequestMapping("/auth/save") + @Menu(type = "admin" , subtype = "role") + public ModelAndView authsave(HttpServletRequest request ,@Valid String id ,@Valid String menus) { + List roleAuthList = roleAuthRes.findByRoleidAndOrgi(id, super.getOrgi(request)) ; + roleAuthRes.delete(roleAuthList); + if(!StringUtils.isBlank(menus)){ + String[] menuarray = menus.split(",") ; + for(String menu : menuarray){ + RoleAuth roleAuth = new RoleAuth(); + roleAuth.setRoleid(id); + roleAuth.setDicid(menu); + roleAuth.setCreater(super.getUser(request).getId()); + roleAuth.setOrgi(super.getOrgi(request)); + roleAuth.setCreatetime(new Date()); + SysDic sysDic = UKeFuDic.getInstance().getDicItem(menu) ; + roleAuth.setName(sysDic.getName()); + roleAuth.setDicvalue(sysDic.getCode()); + roleAuthRes.save(roleAuth) ; + } + } + return request(super.createRequestPageTempletResponse("redirect:/admin/role/index.html")); + } +} \ No newline at end of file diff --git a/src/main/java/com/beimi/web/handler/admin/system/SysDicController.java b/src/main/java/com/beimi/web/handler/admin/system/SysDicController.java new file mode 100644 index 0000000..cba92d9 --- /dev/null +++ b/src/main/java/com/beimi/web/handler/admin/system/SysDicController.java @@ -0,0 +1,224 @@ +package com.beimi.web.handler.admin.system; + +import java.util.Date; +import java.util.List; + +import javax.servlet.http.HttpServletRequest; +import javax.validation.Valid; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Sort.Direction; +import org.springframework.stereotype.Controller; +import org.springframework.ui.ModelMap; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.servlet.ModelAndView; + +import com.beimi.util.Menu; +import com.beimi.util.cache.CacheHelper; +import com.beimi.web.handler.Handler; +import com.beimi.web.model.SysDic; +import com.beimi.web.service.repository.jpa.SysDicRepository; + +@Controller +@RequestMapping("/admin/sysdic") +public class SysDicController extends Handler{ + + + @Autowired + private SysDicRepository sysDicRes; + + @RequestMapping("/index") + @Menu(type = "admin" , subtype = "sysdic") + public ModelAndView index(ModelMap map , HttpServletRequest request) { + map.addAttribute("sysDicList", sysDicRes.findByParentid( "0" , new PageRequest(super.getP(request), super.getPs(request) , Direction.DESC , "createtime"))); + return request(super.createAdminTempletResponse("/admin/system/sysdic/index")); + } + + @RequestMapping("/add") + @Menu(type = "admin" , subtype = "sysdic") + public ModelAndView add(ModelMap map , HttpServletRequest request) { + return request(super.createRequestPageTempletResponse("/admin/system/sysdic/add")); + } + + @RequestMapping("/save") + @Menu(type = "admin" , subtype = "sysdic") + public ModelAndView save(HttpServletRequest request ,@Valid SysDic dic) { + List sysDicList = sysDicRes.findByCodeOrName(dic.getCode() , dic.getName()) ; + String msg = null ; + if(sysDicList.size() == 0){ + dic.setParentid("0"); + dic.setHaschild(true); + dic.setCreater(super.getUser(request).getId()); + dic.setCreatetime(new Date()); + sysDicRes.save(dic) ; + reloadSysDicItem(dic , request); + }else{ + msg = "exist" ; + } + return request(super.createRequestPageTempletResponse("redirect:/admin/sysdic/index.html"+(msg!=null ? "?msg="+msg : ""))); + } + + @RequestMapping("/edit") + @Menu(type = "admin" , subtype = "sysdic") + public ModelAndView edit(ModelMap map , HttpServletRequest request , @Valid String id , @Valid String p) { + map.addAttribute("sysDic", sysDicRes.findById(id)) ; + map.addAttribute("p", p) ; + return request(super.createRequestPageTempletResponse("/admin/system/sysdic/edit")); + } + + @RequestMapping("/update") + @Menu(type = "admin" , subtype = "sysdic") + public ModelAndView update(HttpServletRequest request ,@Valid SysDic dic, @Valid String p) { + List sysDicList = sysDicRes.findByCodeOrName(dic.getCode() , dic.getName()) ; + if(sysDicList.size() == 0 || (sysDicList.size() ==1 && sysDicList.get(0).getId().equals(dic.getId()))){ + SysDic sysDic = sysDicRes.findById(dic.getId()) ; + sysDic.setName(dic.getName()); + sysDic.setCode(dic.getCode()); + sysDic.setCtype(dic.getCtype()); + sysDic.setIconskin(dic.getIconskin()); + sysDic.setIconstr(dic.getIconstr()); + sysDic.setDescription(dic.getDescription()); + sysDicRes.save(sysDic) ; + + reloadSysDicItem(sysDic, request); + } + return request(super.createRequestPageTempletResponse("redirect:/admin/sysdic/index.html?p="+p)); + } + + @RequestMapping("/delete") + @Menu(type = "admin" , subtype = "sysdic") + public ModelAndView delete(ModelMap map , HttpServletRequest request , @Valid String id, @Valid String p) { + SysDic sysDic = sysDicRes.findById(id); + sysDicRes.delete(sysDicRes.findByDicid(id) ); + sysDicRes.delete(sysDic); + + reloadSysDicItem(sysDic, request); + + return request(super.createRequestPageTempletResponse("redirect:/admin/sysdic/index.html?p="+p)); + } + + @RequestMapping("/dicitem") + @Menu(type = "admin" , subtype = "sysdic") + public ModelAndView dicitem(ModelMap map , HttpServletRequest request , @Valid String id) { + map.addAttribute("sysDic", sysDicRes.findById(id)) ; + map.addAttribute("sysDicList", sysDicRes.findByParentid( id , new PageRequest(super.getP(request), super.getPs(request) , Direction.DESC , "createtime"))); + return request(super.createAdminTempletResponse("/admin/system/sysdic/dicitem")); + } + + @RequestMapping("/dicitem/add") + @Menu(type = "admin" , subtype = "sysdic") + public ModelAndView dicitemadd(ModelMap map , HttpServletRequest request , @Valid String id , @Valid String p) { + map.addAttribute("sysDic", sysDicRes.findById(id)) ; + map.addAttribute("p", p) ; + return request(super.createRequestPageTempletResponse("/admin/system/sysdic/dicitemadd")); + } + + @RequestMapping("/dicitem/save") + @Menu(type = "admin" , subtype = "sysdic") + public ModelAndView dicitemsave(HttpServletRequest request ,@Valid SysDic dic , @Valid String p) { + List sysDicList = sysDicRes.findByDicidAndName(dic.getDicid() , dic.getName()) ; + String msg = null ; + if(sysDicList.size() == 0){ + dic.setHaschild(true); + dic.setOrgi(super.getOrgi(request)); + dic.setCreater(super.getUser(request).getId()); + dic.setCreatetime(new Date()); + sysDicRes.save(dic) ; + reloadSysDicItem(dic, request); + }else{ + msg = "exist" ; + } + return request(super.createRequestPageTempletResponse("redirect:/admin/sysdic/dicitem.html?id="+dic.getParentid()+(msg!=null ? "&p="+p+"&msg="+msg : ""))); + } + + private void reloadSysDicItem(SysDic dic , HttpServletRequest request ){ + CacheHelper.getSystemCacheBean().put(dic.getId(), dic,super.getOrgi(request)); + if(dic.getDicid()!=null){ + SysDic root = (SysDic) CacheHelper.getSystemCacheBean().getCacheObject(dic.getDicid(), super.getOrgi(request)) ; + List sysDicList = sysDicRes.findByDicid(dic.getDicid()) ; + CacheHelper.getSystemCacheBean().put(root.getCode(), sysDicList,super.getOrgi(request)); + }else if(dic.getParentid().equals("0")){ + List sysDicList = sysDicRes.findByDicid(dic.getId()) ; + CacheHelper.getSystemCacheBean().put(dic.getCode(), sysDicList,super.getOrgi(request)); + } + } + + @RequestMapping("/dicitem/batadd") + @Menu(type = "admin" , subtype = "sysdic") + public ModelAndView dicitembatadd(ModelMap map , HttpServletRequest request , @Valid String id , @Valid String p) { + map.addAttribute("sysDic", sysDicRes.findById(id)) ; + map.addAttribute("p", p) ; + return request(super.createRequestPageTempletResponse("/admin/system/sysdic/batadd")); + } + + @RequestMapping("/dicitem/batsave") + @Menu(type = "admin" , subtype = "sysdic") + public ModelAndView dicitembatsave(HttpServletRequest request ,@Valid SysDic sysDic , @Valid String content , @Valid String p) { + String[] dicitems = content.split("[\n\r\n]") ; + int count = 0 ; + for(String dicitem : dicitems){ + String[] dicValues = dicitem.split("[\t, ;]{1,}") ; + if(dicValues.length == 2 && dicValues[0].length()>0 && dicValues[1].length() >0){ + SysDic dic = new SysDic() ; + dic.setOrgi(super.getOrgi(request)); + + dic.setName(dicValues[0]); + dic.setCode(dicValues[1]); + dic.setCreater(super.getUser(request).getId()); + dic.setParentid(sysDic.getParentid()); + dic.setDicid(sysDic.getDicid()); + dic.setSortindex(++count); + dic.setCreatetime(new Date()); + dic.setUpdatetime(new Date()); + if(sysDicRes.findByDicidAndName(dic.getDicid(), dic.getName()).size() == 0){ + sysDicRes.save(dic) ; + } + + } + } + reloadSysDicItem(sysDicRes.getOne(sysDic.getParentid()), request); + + return request(super.createRequestPageTempletResponse("redirect:/admin/sysdic/dicitem.html?id="+sysDic.getParentid()+"&p="+p)); + } + + @RequestMapping("/dicitem/edit") + @Menu(type = "admin" , subtype = "sysdic") + public ModelAndView dicitemedit(ModelMap map , HttpServletRequest request , @Valid String id , @Valid String p) { + map.addAttribute("sysDic", sysDicRes.findById(id)) ; + map.addAttribute("p", p) ; + return request(super.createRequestPageTempletResponse("/admin/system/sysdic/dicitemedit")); + } + + @RequestMapping("/dicitem/update") + @Menu(type = "admin" , subtype = "sysdic") + public ModelAndView dicitemupdate(HttpServletRequest request ,@Valid SysDic dic, @Valid String p) { + List sysDicList = sysDicRes.findByDicidAndName(dic.getDicid() , dic.getName()) ; + if(sysDicList.size() == 0 || (sysDicList.size() ==1 && sysDicList.get(0).getId().equals(dic.getId()))){ + SysDic sysDic = sysDicRes.findById(dic.getId()) ; + sysDic.setName(dic.getName()); + sysDic.setCode(dic.getCode()); + sysDic.setCtype(dic.getCtype()); + sysDic.setOrgi(super.getOrgi(request)); + sysDic.setIconskin(dic.getIconskin()); + sysDic.setIconstr(dic.getIconstr()); + sysDic.setDiscode(dic.isDiscode()); + sysDic.setDescription(dic.getDescription()); + sysDicRes.save(sysDic) ; + + reloadSysDicItem(sysDic, request); + } + return request(super.createRequestPageTempletResponse("redirect:/admin/sysdic/dicitem.html?id="+dic.getParentid()+"&p="+p)); + } + + @RequestMapping("/dicitem/delete") + @Menu(type = "admin" , subtype = "sysdic") + public ModelAndView dicitemdelete(ModelMap map , HttpServletRequest request , @Valid String id, @Valid String p) { + sysDicRes.delete(sysDicRes.findByDicid(id)); + SysDic dic = sysDicRes.getOne(id) ; + sysDicRes.delete(dic); + reloadSysDicItem(dic, request); + return request(super.createRequestPageTempletResponse("redirect:/admin/sysdic/dicitem.html?id="+dic.getParentid()+"&p="+p)); + } + +} \ No newline at end of file diff --git a/src/main/java/com/beimi/web/handler/admin/system/SystemConfigController.java b/src/main/java/com/beimi/web/handler/admin/system/SystemConfigController.java new file mode 100644 index 0000000..b2a586f --- /dev/null +++ b/src/main/java/com/beimi/web/handler/admin/system/SystemConfigController.java @@ -0,0 +1,180 @@ +package com.beimi.web.handler.admin.system; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.security.NoSuchAlgorithmException; +import java.sql.SQLException; +import java.util.Date; +import java.util.List; +import java.util.Properties; + +import javax.servlet.http.HttpServletRequest; +import javax.validation.Valid; + +import org.apache.commons.io.FileUtils; +import org.apache.commons.lang3.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Controller; +import org.springframework.ui.ModelMap; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.multipart.MultipartFile; +import org.springframework.web.servlet.ModelAndView; + +import com.beimi.core.BMDataContext; +import com.beimi.util.Menu; +import com.beimi.util.UKTools; +import com.beimi.util.cache.CacheHelper; +import com.beimi.web.handler.Handler; +import com.beimi.web.model.Secret; +import com.beimi.web.model.SystemConfig; +import com.beimi.web.service.repository.jpa.SecretRepository; +import com.beimi.web.service.repository.jpa.SystemConfigRepository; +import com.beimi.web.service.repository.jpa.TemplateRepository; +import com.corundumstudio.socketio.SocketIOServer; + +@Controller +@RequestMapping("/admin/config") +public class SystemConfigController extends Handler{ + + @Value("${uk.im.server.port}") + private Integer port; + + @Value("${web.upload-path}") + private String path; + + @Autowired + private SocketIOServer server ; + + @Autowired + private SystemConfigRepository systemConfigRes ; + + @Autowired + private SecretRepository secRes ; + + @Autowired + private TemplateRepository templateRes ; + + @RequestMapping("/index") + @Menu(type = "admin" , subtype = "config" , admin = true) + public ModelAndView index(ModelMap map , HttpServletRequest request , @Valid String execute) throws SQLException { + map.addAttribute("server", server) ; + map.addAttribute("imServerStatus", BMDataContext.getIMServerStatus()) ; + List secretConfig = secRes.findByOrgi(super.getOrgi(request)) ; + if(secretConfig!=null && secretConfig.size() > 0){ + map.addAttribute("secret", secretConfig.get(0)) ; + } + + if(!StringUtils.isBlank(execute) && execute.equals("false")){ + map.addAttribute("execute", execute) ; + } + if(!StringUtils.isBlank(request.getParameter("msg"))){ + map.addAttribute("msg", request.getParameter("msg")) ; + } + return request(super.createAdminTempletResponse("/admin/system/config/index")); + } + + @RequestMapping("/stopimserver") + @Menu(type = "admin" , subtype = "stopimserver" , access = false , admin = true) + public ModelAndView stopimserver(ModelMap map , HttpServletRequest request , @Valid String confirm) throws SQLException { + boolean execute = false ; + if(execute = UKTools.secConfirm(secRes, super.getOrgi(request), confirm)){ + server.stop(); + BMDataContext.setIMServerStatus(false); + } + return request(super.createRequestPageTempletResponse("redirect:/admin/config/index.html?execute="+execute)); + } + + /** + * 危险操作,请谨慎调用 , WebLogic/WebSphere/Oracle等中间件服务器禁止调用 + * @param map + * @param request + * @return + * @throws SQLException + */ + @RequestMapping("/stop") + @Menu(type = "admin" , subtype = "stop" , access = false , admin = true) + public ModelAndView stop(ModelMap map , HttpServletRequest request , @Valid String confirm) throws SQLException { + boolean execute = false ; + if(execute = UKTools.secConfirm(secRes, super.getOrgi(request), confirm)){ + server.stop(); + BMDataContext.setIMServerStatus(false); + System.exit(0); + } + return request(super.createRequestPageTempletResponse("redirect:/admin/config/index.html?execute="+execute)); + } + + + @RequestMapping("/save") + @Menu(type = "admin" , subtype = "save" , admin = true) + public ModelAndView save(ModelMap map , HttpServletRequest request , @Valid SystemConfig config , @RequestParam(value = "keyfile", required = false) MultipartFile keyfile , @Valid Secret secret) throws SQLException, IOException, NoSuchAlgorithmException { + SystemConfig systemConfig = systemConfigRes.findByOrgi(super.getOrgi(request)) ; + config.setOrgi(super.getOrgi(request)); + String msg = "0" ; + if(StringUtils.isBlank(config.getJkspassword())){ + config.setJkspassword(null); + } + if(systemConfig == null){ + config.setCreater(super.getUser(request).getId()); + config.setCreatetime(new Date()); + systemConfig = config ; + }else{ + UKTools.copyProperties(config,systemConfig); + } + if(config.isEnablessl()){ + if(keyfile!=null && keyfile.getBytes()!=null && keyfile.getBytes().length > 0 && keyfile.getOriginalFilename()!=null && keyfile.getOriginalFilename().length() > 0){ + FileUtils.writeByteArrayToFile(new File(path , "ssl/"+keyfile.getOriginalFilename()), keyfile.getBytes()); + systemConfig.setJksfile(keyfile.getOriginalFilename()); + } + Properties prop = new Properties(); + FileOutputStream oFile = new FileOutputStream(new File(path , "ssl/https.properties"));//true表示追加打开 + prop.setProperty("key-store-password", UKTools.encryption(systemConfig.getJkspassword())) ; + prop.setProperty("key-store",systemConfig.getJksfile()) ; + prop.store(oFile , "SSL Properties File"); + oFile.close(); + }else if(new File(path , "ssl").exists()){ + File[] sslFiles = new File(path , "ssl").listFiles() ; + for(File sslFile : sslFiles){ + sslFile.delete(); + } + } + + if(secret!=null && !StringUtils.isBlank(secret.getPassword())){ + List secretConfig = secRes.findByOrgi(super.getOrgi(request)) ; + String repassword = request.getParameter("repassword") ; + if(!StringUtils.isBlank(repassword) && repassword.equals(secret.getPassword())){ + if(secretConfig!=null && secretConfig.size() > 0){ + Secret tempSecret = secretConfig.get(0) ; + String oldpass = request.getParameter("oldpass") ; + if(!StringUtils.isBlank(oldpass) && UKTools.md5(oldpass).equals(tempSecret.getPassword())){ + tempSecret.setPassword(UKTools.md5(secret.getPassword())); + msg = "1" ; + tempSecret.setEnable(true); + secRes.save(tempSecret) ; + }else{ + msg = "3" ; + } + }else{ + secret.setOrgi(super.getOrgi(request)); + secret.setCreater(super.getUser(request).getId()); + secret.setCreatetime(new Date()); + secret.setPassword(UKTools.md5(secret.getPassword())); + secret.setEnable(true); + msg = "1" ; + secRes.save(secret) ; + } + }else{ + msg = "2" ; + } + map.addAttribute("msg", msg) ; + } + systemConfigRes.save(systemConfig) ; + + CacheHelper.getSystemCacheBean().put("systemConfig", systemConfig , super.getOrgi(request)); + map.addAttribute("imServerStatus", BMDataContext.getIMServerStatus()) ; + + return request(super.createRequestPageTempletResponse("redirect:/admin/config/index.html?msg="+msg)); + } +} \ No newline at end of file diff --git a/src/main/java/com/beimi/web/handler/admin/system/TemplateController.java b/src/main/java/com/beimi/web/handler/admin/system/TemplateController.java new file mode 100644 index 0000000..b0f50c3 --- /dev/null +++ b/src/main/java/com/beimi/web/handler/admin/system/TemplateController.java @@ -0,0 +1,144 @@ +package com.beimi.web.handler.admin.system; + +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.List; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.ui.ModelMap; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.multipart.MultipartFile; +import org.springframework.web.servlet.ModelAndView; + +import com.beimi.core.BMDataContext; +import com.beimi.util.Menu; +import com.beimi.util.UKTools; +import com.beimi.web.handler.Handler; +import com.beimi.web.model.Template; +import com.beimi.web.model.UKeFuDic; +import com.beimi.web.service.repository.jpa.TemplateRepository; + +@Controller +@RequestMapping("/admin/template") +public class TemplateController extends Handler{ + + + @Autowired + private TemplateRepository templateRes; + + @RequestMapping("/index") + @Menu(type = "admin" , subtype = "template" , access = false , admin = true) + public ModelAndView index(ModelMap map , HttpServletRequest request) { + map.addAttribute("sysDicList", UKeFuDic.getInstance().getDic(BMDataContext.BEIMI_SYSTEM_DIC)); + return request(super.createAdminTempletResponse("/admin/system/template/index")); + } + + @RequestMapping("/expall") + @Menu(type = "admin" , subtype = "template" , access = false , admin = true) + public void expall(ModelMap map , HttpServletRequest request , HttpServletResponse response) throws Exception { + List