Prechádzať zdrojové kódy

1.websocket
2.jfinal
———— by qlm

qlm 4 rokov pred
rodič
commit
d4b94832ac

+ 28 - 0
pom.xml

@@ -399,6 +399,34 @@
             <artifactId>java-jwt</artifactId>
             <version>3.8.2</version>
         </dependency>
+
+        <!--websocket-->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-websocket</artifactId>
+            <version>1.3.5.RELEASE</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.java-websocket</groupId>
+            <artifactId>Java-WebSocket</artifactId>
+            <version>1.3.8</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>druid</artifactId>
+            <version>1.1.22</version>
+        </dependency>
+
+
+        <dependency>
+            <groupId>com.jfinal</groupId>
+            <artifactId>activerecord</artifactId>
+            <version>4.8</version>
+        </dependency>
+
+
     </dependencies>
 
 

+ 140 - 0
src/main/java/com/xc/config/JfinalActiveRecordConfig.java

@@ -0,0 +1,140 @@
+package com.xc.config;
+
+import com.alibaba.druid.pool.DruidDataSource;
+import com.jfinal.plugin.activerecord.ActiveRecordPlugin;
+import com.xc.utils.PropertiesUtil2;
+import com.xc.utils.websocket.WsClient;
+import org.java_websocket.WebSocket;
+import org.springframework.boot.ApplicationArguments;
+import org.springframework.boot.ApplicationRunner;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.jdbc.datasource.DataSourceTransactionManager;
+import org.springframework.jdbc.datasource.TransactionAwareDataSourceProxy;
+
+import javax.annotation.PreDestroy;
+import java.net.URI;
+import java.sql.SQLException;
+
+/**
+ * Created on 2020/12/04.
+ *
+ * @author qlm
+ */
+@Configuration
+public class JfinalActiveRecordConfig implements ApplicationRunner {
+    /**
+     * 1数据源名称
+     */
+    private static final String main_DATA_SOURCE_CONFIG = "main";
+
+    /**
+     * 2数据源名称
+     */
+    private static final String data_DATA_SOURCE_CONFIG = "data";
+
+
+    @Bean(name = "mainDataSource")
+    public DruidDataSource mainDataSource()throws SQLException {
+
+        DruidDataSource dataSource = new DruidDataSource();
+        dataSource.setUrl(PropertiesUtil2.getProperty("db.url"));
+        dataSource.setUsername(PropertiesUtil2.getProperty("db.urlusername"));
+        dataSource.setPassword(PropertiesUtil2.getProperty("db.urlpassword"));
+        return dataSource;
+    }
+
+    @Bean(name = "dataDataSource")
+    public DruidDataSource dataDataSource()throws SQLException  {
+        DruidDataSource dataSource = new DruidDataSource();
+        dataSource.setUrl(PropertiesUtil2.getProperty("db2.url"));
+        dataSource.setUsername(PropertiesUtil2.getProperty("db2.username"));
+        dataSource.setPassword(PropertiesUtil2.getProperty("db2.password"));
+
+        return dataSource;
+    }
+
+
+
+    /**
+     * 主数据源  main
+     * @return
+     */
+    @Bean
+    public ActiveRecordPlugin initmainActiveRecord()  throws SQLException{
+        ActiveRecordPlugin arp = new ActiveRecordPlugin(main_DATA_SOURCE_CONFIG, mainTransactionAwareDataSourceProxy());
+        arp.start();
+        return arp;
+    }
+
+    /**
+     * 业务数据源  data
+     * @return
+     */
+    @Bean
+    public ActiveRecordPlugin initdataActiveRecord()throws SQLException  {
+        ActiveRecordPlugin arp = new ActiveRecordPlugin(data_DATA_SOURCE_CONFIG, dataTransactionAwareDataSourceProxy());
+        arp.start();
+        return arp;
+    }
+
+
+
+
+    /**
+     * 设置数据源代理
+     */
+    @Bean
+    public TransactionAwareDataSourceProxy mainTransactionAwareDataSourceProxy() throws SQLException{
+        TransactionAwareDataSourceProxy transactionAwareDataSourceProxy = new TransactionAwareDataSourceProxy();
+        transactionAwareDataSourceProxy.setTargetDataSource(mainDataSource());
+        return transactionAwareDataSourceProxy;
+    }
+
+    @Bean
+    public TransactionAwareDataSourceProxy dataTransactionAwareDataSourceProxy() throws SQLException {
+        TransactionAwareDataSourceProxy transactionAwareDataSourceProxy = new TransactionAwareDataSourceProxy();
+        transactionAwareDataSourceProxy.setTargetDataSource(dataDataSource());
+        return transactionAwareDataSourceProxy;
+    }
+
+    /**
+     * 设置事务管理
+     */
+    @Bean(name="mainDataSourceTransactionManager")
+    public DataSourceTransactionManager mainDataSourceTransactionManager()  throws SQLException{
+        DataSourceTransactionManager dataSourceTransactionManager = new DataSourceTransactionManager();
+        dataSourceTransactionManager.setDataSource(mainTransactionAwareDataSourceProxy());
+        return dataSourceTransactionManager;
+    }
+
+    @Bean(name="dataDataSourceTransactionManager")
+    public DataSourceTransactionManager dataDataSourceTransactionManager()  throws SQLException{
+        DataSourceTransactionManager dataSourceTransactionManager = new DataSourceTransactionManager();
+        dataSourceTransactionManager.setDataSource(dataTransactionAwareDataSourceProxy());
+        return dataSourceTransactionManager;
+    }
+
+
+
+
+    @Override
+    public void run(ApplicationArguments args) throws Exception {
+        System.out.println("项目启动啦");
+//        String wssurl1 = "ws://127.0.0.1:8080/websocket/zxdata987654+";
+//        WsClient myClient = new WsClient(new URI(wssurl1));
+//        myClient.connect();
+//        // 判断是否连接成功,未成功后面发送消息时会报错
+//        while (!myClient.getReadyState().equals(WebSocket.READYSTATE.OPEN)) {
+//            System.out.println("连接中···请稍后");
+//            Thread.sleep(1000);
+//        }
+
+    }
+
+    @PreDestroy
+    public void destory() throws Exception {
+
+
+    }
+}

+ 15 - 0
src/main/java/com/xc/config/WebSocketConfig.java

@@ -0,0 +1,15 @@
+package com.xc.config;
+
+//import org.springframework.context.annotation.Bean;
+//import org.springframework.context.annotation.Configuration;
+//import org.springframework.web.socket.server.standard.ServerEndpointExporter;
+
+
+//@Configuration
+public class WebSocketConfig {
+//    @Bean
+//    public ServerEndpointExporter serverEndpointExporter() {
+//        return new ServerEndpointExporter();
+//    }
+
+}

+ 58 - 0
src/main/java/com/xc/controller/WebSocketTestController.java

@@ -0,0 +1,58 @@
+package com.xc.controller;
+
+import com.jfinal.plugin.activerecord.Db;
+import com.xc.utils.websocket.WsClient;
+import org.java_websocket.WebSocket;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import java.net.URI;
+
+@Controller
+@RequestMapping({"/ws/test/"})
+public class WebSocketTestController {
+    private static final Logger log = LoggerFactory.getLogger(WebSocketTestController.class);
+
+    private static final String wssurl1 = "ws://127.0.0.1:8080/websocket/zxdata987654+";
+
+    // 连接 数据解析服务器
+    @RequestMapping({"start.do"})
+    @ResponseBody
+    public String star() {
+        try {
+
+            WsClient myClient = new WsClient(new URI(wssurl1));
+            myClient.connect();
+            while (!myClient.getReadyState().equals(WebSocket.READYSTATE.OPEN)) {
+                System.out.println("连接中···请稍后");
+                Thread.sleep(1000);
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+
+        return "true";
+    }
+    //查询企业公告信息
+    @RequestMapping({"test.do"})
+    @ResponseBody
+    public String star2() {
+        try {
+
+            Db.use("main").find("select 1 ");
+            Db.use("data").find("select 1 ");
+
+
+
+
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+
+        return "true";
+    }
+
+}

+ 123 - 0
src/main/java/com/xc/controller/websocket/WebSocketController.java

@@ -0,0 +1,123 @@
+package com.xc.controller.websocket;
+
+/**
+ * Created by qlm on 2020-12-14.
+ */
+
+
+import javax.websocket.*;
+import javax.websocket.server.PathParam;
+import javax.websocket.server.ServerEndpoint;
+import java.io.IOException;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Map.Entry;
+
+
+@ServerEndpoint(value = "/websocket/{userId}")
+public class WebSocketController {
+
+    public static Map<String,Session> map = new HashMap<String,Session>();//根据用户找session
+
+    /**
+     * 连接建立成功时调用
+     * @param userId 登录用户id
+     * @param session  可选的参数。session为与某个客户端的连接会话,需要通过它来给客户端发送数据
+     */
+    @OnOpen
+    public void onOpen(Session session, @PathParam("userId") String userId) {
+        String[] a = userId.split("&");
+
+        String mUserId = a[0];
+        map.put(mUserId + "",session);       //添加到链接map
+        try{
+            sendUnreadMsg(session);
+        }
+        catch (Exception e){
+            e.printStackTrace();
+        }
+    }
+
+    /**
+     */
+    public static void sendUnreadMsg(Session session){
+            synchronized(session){
+                if(session.isOpen()){
+                    try {
+                        System.out.println("连接成功");
+                        session.getBasicRemote().sendText("连接成功啦");
+                    }catch (Exception e) {
+                        e.printStackTrace();
+                    }
+                }
+            }
+    }
+
+
+    /**
+     * 连接关闭调用的方法
+     */
+    @OnClose
+    public void onClose(Session session){
+        if(map.containsValue(session)){
+            for (Entry<String, Session> entry : map.entrySet()){
+                if(entry.getValue().equals(session)){
+                    map.remove(entry.getKey());
+                    break;
+                }
+            }
+        }
+    }
+
+    /**
+     * 发生错误时调用
+     * @param session
+     * @param error
+     */
+    @OnError
+    public void onError(Session session, Throwable error){
+        if(map.containsValue(session)){
+            for (Entry<String, Session> entry : map.entrySet()) {
+                if(entry.getValue().equals(session)){
+                    map.remove(entry.getKey());
+                    break;
+                }
+            }
+        }
+        error.printStackTrace();
+    }
+
+    /**
+     * 消息发送时调用
+     * @param requestJson
+     * @param session
+     */
+    @OnMessage
+    public void onMessage(String requestJson, Session session) {
+        Date date=new Date();
+        SimpleDateFormat f = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        System.out.println("啦啦啦"+f.format(date));
+
+    }
+
+
+    /**
+     */
+    public void sendSysMsg(String userid, String xMessage) {
+
+        try {
+            if ("all".equals(userid)) {
+                for(String key:map.keySet()){
+                    Session session = map.get(key);
+                    session.getBasicRemote().sendText(xMessage);
+                }
+            }
+        } catch (IOException e) {
+            e.printStackTrace();
+
+        }
+    }
+
+}

+ 10 - 2
src/main/java/com/xc/utils/BigDecimalUtil.java

@@ -1,7 +1,11 @@
 package com.xc.utils;
 
+import com.xc.utils.websocket.WsClient;
+import org.java_websocket.WebSocket;
+
 import java.math.BigDecimal;
 import java.math.RoundingMode;
+import java.net.URI;
 
 public class BigDecimalUtil {
 
@@ -58,9 +62,13 @@ public class BigDecimalUtil {
 
     }
 
+//
+//    public static void main(String[] args) {
+//        System.out.println(getTwoNum());
+//    }
+
+    public static void main(String[] args){
 
-    public static void main(String[] args) {
-        System.out.println(getTwoNum());
     }
 
 }

+ 602 - 0
src/main/java/com/xc/utils/DateUtils.java

@@ -0,0 +1,602 @@
+package com.xc.utils;
+
+import org.apache.commons.lang3.StringUtils;
+import org.apache.commons.lang3.time.DateFormatUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.lang.management.ManagementFactory;
+import java.text.DateFormat;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.TimeZone;
+
+
+/**
+ * 时间工具类
+ *2020-12-14
+ * @author qlm
+ */
+public class DateUtils extends org.apache.commons.lang3.time.DateUtils {
+    private static Logger LOG = LoggerFactory.getLogger(DateUtils.class);
+
+    public static String YYYY = "yyyy";
+
+    public static String YYYY_MM = "yyyy-MM";
+
+    public static String YYYY_MM_DD = "yyyy-MM-dd";
+
+    public static String HH_MM_SS = "HH:mm:ss";
+
+    public static String YYYYMMDDHHMMSS = "yyyyMMddHHmmss";
+    public static String YYYYMMDDHHMMSSSSS = "yyyyMMddHHmmssSSS";
+
+    public static String YYYY_MM_DD_HH_MM_SS = "yyyy-MM-dd HH:mm:ss";
+    public static String YYYY_MM_DD_HH_MM_SS_sss = "yyyy-MM-dd HH:mm:ss.SSS";
+    private static String[] parsePatterns = {
+            "yyyy-MM-dd", "yyyy-MM-dd HH:mm:ss", "yyyy-MM-dd HH:mm", "yyyy-MM",
+            "yyyy/MM/dd", "yyyy/MM/dd HH:mm:ss", "yyyy/MM/dd HH:mm", "yyyy/MM",
+            "yyyy.MM.dd", "yyyy.MM.dd HH:mm:ss", "yyyy.MM.dd HH:mm", "yyyy.MM"};
+
+    /**
+     * 获取当前Date型日期
+     *
+     * @return Date() 当前日期
+     */
+    public static Date getNowDate() {
+        return new Date();
+    }
+
+    /**
+     * 判断当前时间是否在时间段内
+     *
+     * @param startTime 开始 20:20
+     * @param endTime   结束  21:50
+     * @return
+     */
+    public static boolean belongCalendar(String startTime, String endTime) {
+        SimpleDateFormat df = new SimpleDateFormat("HH:mm");//设置日期格式
+        Date now = null;
+        Date beginTimeDate = null;
+        Date endTimeDate = null;
+        try {
+            now = df.parse(df.format(new Date()));
+            beginTimeDate = df.parse(startTime);
+            endTimeDate = df.parse(endTime);
+        } catch (Exception e) {
+            if(e.toString().length()>500){                LOG.error(e.toString().substring(0,450));            }else {                LOG.error(e.toString());            }
+        }
+        return belongCalendar(now, beginTimeDate, endTimeDate);
+    }
+
+    /**
+     * 判断时间是否在时间段内
+     *
+     * @param nowTime   目标时间
+     * @param beginTime 开始时间
+     * @param endTime   结束时间
+     * @return
+     */
+    public static boolean belongCalendar(Date nowTime, Date beginTime, Date endTime) {
+        Calendar date = Calendar.getInstance();
+        date.setTime(nowTime);
+
+        Calendar begin = Calendar.getInstance();
+        begin.setTime(beginTime);
+
+        Calendar end = Calendar.getInstance();
+        end.setTime(endTime);
+
+        if (date.after(begin) && date.before(end)) {
+            return true;
+        } else {
+            return false;
+        }
+    }
+
+    /**
+     * 计算两个时间差
+     */
+    public static String getDatePoor(Date endDate, Date nowDate) {
+        long nd = 1000 * 24 * 60 * 60;
+        long nh = 1000 * 60 * 60;
+        long nm = 1000 * 60;
+        // long ns = 1000;
+        // 获得两个时间的毫秒时间差异
+        long diff = endDate.getTime() - nowDate.getTime();
+        // 计算差多少天
+        long day = diff / nd;
+        // 计算差多少小时
+        long hour = diff % nd / nh;
+        // 计算差多少分钟
+        long min = diff % nd % nh / nm;
+        // 计算差多少秒//输出结果
+        // long sec = diff % nd % nh % nm / ns;
+        return day + "天" + hour + "小时" + min + "分钟";
+    }
+
+    /**
+     * 计算两个时间差多少天
+     */
+    public static String getDatePoorDay(String endDate, String nowDate) {
+        long nd = 1000 * 24 * 60 * 60;
+        long nh = 1000 * 60 * 60;
+        long nm = 1000 * 60;
+        // long ns = 1000;
+        // 获得两个时间的毫秒时间差异
+        long diff = formatToDate(endDate).getTime() - formatToDate(nowDate).getTime();
+        // 计算差多少天
+        long day = diff / nd;
+        // 计算差多少小时
+        long hour = diff % nd / nh;
+        // 计算差多少分钟
+        long min = diff % nd % nh / nm;
+        // 计算差多少秒//输出结果
+        // long sec = diff % nd % nh % nm / ns;
+        return day +"";
+    }
+
+    /**
+     * 获取当前日期, 默认格式为yyyy-MM-dd
+     *
+     * @return String
+     */
+    public static String getDate() {
+        return dateTimeNow(YYYY_MM_DD);
+    }
+
+
+    public static String getHhMmSs() {
+        return dateTimeNow(HH_MM_SS);
+    }
+
+    public static String getCurrentTime() {
+        return dateTimeNow(YYYY_MM_DD_HH_MM_SS);
+    }
+
+    public synchronized static String getCurrentDay() {
+        return dateTimeNow(YYYY_MM_DD);
+    }
+
+    public static final String getTime() {
+        return dateTimeNow(YYYY_MM_DD_HH_MM_SS);
+    }
+
+    public static final String dateTimeNow() {
+        return dateTimeNow(YYYYMMDDHHMMSS);
+    }
+
+    public static final String getTimeSSS() {
+        return dateTimeNow(YYYYMMDDHHMMSSSSS);
+    }
+
+    public static final String dateTimeNow_YYYY_MM_DD_HH_MM_SS() {
+        return dateTimeNow(YYYY_MM_DD_HH_MM_SS);
+    }
+
+    public static final String getCurrentTimeSSS() {
+        return dateTimeNow(YYYY_MM_DD_HH_MM_SS_sss);
+    }
+
+    public static final String dateTimeNow(final String format) {
+        return parseDateToStr(format, new Date());
+    }
+
+    public static final String dateTime(final Date date) {
+        return parseDateToStr(YYYY_MM_DD, date);
+    }
+
+    public static final String parseDateToStr(final String format, final Date date) {
+        return new SimpleDateFormat(format).format(date);
+    }
+
+    public static final Date dateTime(final String format, final String ts) {
+        try {
+            return new SimpleDateFormat(format).parse(ts);
+        } catch (ParseException e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    /**
+     * 获取服务器启动时间
+     */
+    public static Date getServerStartDate() {
+        long time = ManagementFactory.getRuntimeMXBean().getStartTime();
+        return new Date(time);
+    }
+
+    /**
+     * 日期型字符串转化为日期 格式
+     */
+    public static Date parseDate(Object str) {
+        if (str == null) {
+            return null;
+        }
+        try {
+            return parseDate(str.toString(), parsePatterns);
+        } catch (ParseException e) {
+            return null;
+        }
+    }
+
+    public static Date strToDate(String dateStr) {
+        try {
+            SimpleDateFormat sDateFormat = new SimpleDateFormat("yyyyMMddHHmmss");
+            Date date = sDateFormat.parse(dateStr);
+            return date;
+        } catch (ParseException e) {
+            if(e.toString().length()>500){                LOG.error(e.toString().substring(0,450));            }else {                LOG.error(e.toString());            }
+        }
+        return null;
+    }
+
+    //时间戳转时间
+    public static String stampToDate(String s, String format) throws Exception {
+        String res;
+        SimpleDateFormat simpleDateFormat = new SimpleDateFormat(format);
+        long lt = new Long(s);
+        Date date = new Date(lt);
+        res = simpleDateFormat.format(date);
+        return res;
+    }
+
+    //获取今日凌晨时间戳
+    public static long getEarlyThisMorningStamp() {
+        long nowTime = System.currentTimeMillis();
+        long todayStartTime = nowTime - (nowTime + TimeZone.getDefault().getRawOffset()) % (1000 * 3600 * 24);
+        return todayStartTime;
+    }
+
+    /**
+     * 日期路径 即年/月/日 如2018/08/08
+     */
+    public static final String datePath() {
+        Date now = new Date();
+        return DateFormatUtils.format(now, "yyyy/MM/dd");
+    }
+
+    /**
+     * 日期路径 即年/月/日 如20180808
+     */
+    public static final String dateTime() {
+        Date now = new Date();
+        return DateFormatUtils.format(now, "yyyyMMdd");
+    }
+
+    /***
+     * 增加N天 ,可以是负数
+     * @param date
+     * @param dayNum
+     * @param formatStr
+     * @return
+     */
+    public static String addDay(Date date, int dayNum, String formatStr, int type) {
+        if (StringUtils.isBlank(formatStr)) {
+            formatStr = YYYY_MM_DD_HH_MM_SS;
+        }
+        SimpleDateFormat format = new SimpleDateFormat(formatStr);
+        Calendar c = Calendar.getInstance();
+        c.setTime(date);
+        c.add(type, dayNum);
+        Date m = c.getTime();
+        String mon = format.format(m);
+        return mon;
+    }
+
+    /**
+     * 增加N天 ,可以是负数
+     *
+     * @param date   字符串时间
+     * @param dayNum 天数
+     * @return
+     */
+    public static String addDay(String date, int dayNum) {
+        return addDay(formatToDateTime(date), dayNum, null, Calendar.DATE);
+    }
+
+    /**
+     * 增加n天
+     *
+     * @param dayNum
+     * @return
+     */
+    public static String addDay(int dayNum) {
+        return addDay(new Date(), dayNum, null, Calendar.DATE);
+    }
+
+    /***
+     * 增加N月
+     * @param month
+     * @return
+     */
+    public static String addMonth(int month) {
+        return addDay(new Date(), month, null, Calendar.MONTH);
+    }
+
+    /***
+     * 增加N年
+     * @param year
+     * @return
+     */
+    public static String addYear(int year) {
+        return addDay(new Date(), year, null, Calendar.YEAR);
+    }
+
+    /**
+     * 根据格式化字符串 把时间进行格式化
+     *
+     * @param formatStr
+     * @param date
+     * @return
+     */
+    public synchronized static String formatDate(String formatStr, Date date) {
+        SimpleDateFormat format = new SimpleDateFormat(formatStr);
+        String dateStr = format.format(date);
+        return dateStr;
+
+    }
+
+    /**
+     * @param time
+     * @return
+     */
+    public synchronized static Date formatToDate(String time) {
+        //规范时间格式
+        SimpleDateFormat pubTimeormatter = new SimpleDateFormat("yyyy-MM-dd");
+        Date pubTimedate = null;
+        try {
+            pubTimedate = pubTimeormatter.parse(time);
+        } catch (ParseException e) {
+            pubTimeormatter = new SimpleDateFormat("yyyy/MM/dd");
+            try {
+                pubTimedate = pubTimeormatter.parse(time);
+            } catch (ParseException e1) {
+                pubTimeormatter = new SimpleDateFormat(HH_MM_SS);
+                try {
+                    pubTimedate = pubTimeormatter.parse(time);
+                } catch (ParseException e3) {
+                    e3.printStackTrace();
+                }
+            }
+        }
+        return pubTimedate;
+    }
+
+    public synchronized static Date formatToDateTime(String time) {
+        //规范时间格式
+        SimpleDateFormat pubTimeormatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        Date pubTimedate = null;
+        try {
+            pubTimedate = pubTimeormatter.parse(time);
+        } catch (ParseException e) {
+            if(e.toString().length()>500){                LOG.error(e.toString().substring(0,450));            }else {                LOG.error(e.toString());            }
+        }
+        return pubTimedate;
+    }
+
+    public synchronized static String addDaysWithHms(int days) {
+        return addDay(new Date(), days, null, Calendar.DATE);
+    }
+
+    public synchronized static int differentDays(Date date1, Date date2) {
+        Calendar cal1 = Calendar.getInstance();
+        cal1.setTime(date1);
+
+        Calendar cal2 = Calendar.getInstance();
+        cal2.setTime(date2);
+        int day1 = cal1.get(Calendar.DAY_OF_YEAR);
+        int day2 = cal2.get(Calendar.DAY_OF_YEAR);
+
+        int year1 = cal1.get(Calendar.YEAR);
+        int year2 = cal2.get(Calendar.YEAR);
+        if (year1 != year2)   //同一年
+        {
+            int timeDistance = 0;
+            for (int i = year1; i < year2; i++) {
+                if (i % 4 == 0 && i % 100 != 0 || i % 400 == 0)    //闰年
+                {
+                    timeDistance += 366;
+                } else    //不是闰年
+                {
+                    timeDistance += 365;
+                }
+            }
+
+            return timeDistance + (day2 - day1);
+        } else    //不同年
+        {
+            System.out.println("判断day2 - day1 : " + (day2 - day1));
+            return day2 - day1;
+        }
+    }
+
+    //判断当前时间是否在时间date2之前
+    //时间格式 2005-4-21 16:16:34
+    public static boolean isDateBefore(String date2) {
+        try {
+            Date date1 = new Date();
+            DateFormat df = DateFormat.getDateTimeInstance();
+            return date1.before(df.parse(date2 + " 00:00:00"));
+        } catch (ParseException e) {
+            System.out.print("[SYS] " + e.getMessage());
+            return false;
+        }
+    }
+
+    // 2019-07-10 新增
+
+    /**
+     * 获取任意时间的下一个月的固定天
+     * @param repeatDate  // 时间
+     * @param format   传递过来的时间格式
+     * @return
+     */
+    public static String getPreMonthDay(String repeatDate,String format) {
+        Date repeatDateD =  dateTime(format,repeatDate);
+        repeatDate = formatDate("yyyyMMdd",repeatDateD);
+        String lastMonth = "";
+        Calendar cal = Calendar.getInstance();
+        SimpleDateFormat dft = new SimpleDateFormat(format);
+        int year = Integer.parseInt(repeatDate.substring(0, 4));
+        String monthsString = repeatDate.substring(4, 6);
+        int month;
+        if ("0".equals(monthsString.substring(0, 1))) {
+            month = Integer.parseInt(monthsString.substring(1, 2));
+        } else {
+            month = Integer.parseInt(monthsString.substring(0, 2));
+        }
+        int day = Integer.parseInt(repeatDate.substring(6, 8));
+
+        cal.set(year,month,day);
+        lastMonth = dft.format(cal.getTime());
+        return lastMonth;
+    }
+
+
+    /**
+     * 判断当前时间是否在[startTime, endTime]区间,注意时间格式要一致
+     *
+     * @param nowTime 当前时间
+     * @param startTime 开始时间
+     * @param endTime 结束时间
+     * @return
+     * @author jqlin
+     */
+    public static boolean isEffectiveDate(Date nowTime, Date startTime, Date endTime) {
+        if (nowTime.getTime() == startTime.getTime()
+                || nowTime.getTime() == endTime.getTime()) {
+            return true;
+        }
+
+        Calendar date = Calendar.getInstance();
+        date.setTime(nowTime);
+
+        Calendar begin = Calendar.getInstance();
+        begin.setTime(startTime);
+
+        Calendar end = Calendar.getInstance();
+        end.setTime(endTime);
+
+        if (date.after(begin) && date.before(end)) {
+            return true;
+        } else {
+            return false;
+        }
+    }
+
+    public static boolean isToday(String date) {
+        SimpleDateFormat fmt = new SimpleDateFormat("yyyy-MM-dd");
+        if (date.equals(fmt.format(new Date()).toString())) { //格式化为相同格式
+            return true;
+        } else {
+            return false;
+        }
+    }
+
+    //获取指定时间的时间戳
+    public static String timeInMillis(String str){
+        Date date = formatToDateTime(str);
+        Calendar cal = Calendar.getInstance();
+        cal.setTime(date);
+        long timestamp = cal.getTimeInMillis();
+        return timestamp +"";
+    }
+
+
+
+    // 获取当天0点时间戳
+    public static Long dayTimeInMillis() {
+        Calendar calendar = Calendar.getInstance();// 获取当前日期
+        calendar.set(Calendar.HOUR_OF_DAY, 0);
+        calendar.set(Calendar.MINUTE, 0);
+        calendar.set(Calendar.SECOND, 0);
+        Long time = calendar.getTimeInMillis()/1000;
+        return time;
+    }
+
+    // 获取当天0点时间戳
+    public static Long dayTimeInMillis(String oldtime) {
+        Calendar calendar = Calendar.getInstance();// 获取当前日期
+        calendar.setTime(formatToDate(oldtime));
+        calendar.set(Calendar.HOUR_OF_DAY, 0);
+        calendar.set(Calendar.MINUTE, 0);
+        calendar.set(Calendar.SECOND, 0);
+        Long time = calendar.getTimeInMillis()/1000;
+        return time;
+    }
+
+    // 获取当周0点时间戳
+    public static Long weekTimeInMillis() {
+        Calendar cal = Calendar.getInstance();
+        cal.set(cal.get(Calendar.YEAR),cal.get(Calendar.MONDAY), cal.get(Calendar.DAY_OF_MONTH), 0, 0,0);
+        cal.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
+        return  (cal.getTimeInMillis()/1000);
+    }
+
+    // 获取指定周0点时间戳
+    public static Long weekTimeInMillis(String oldtime) {
+        Calendar cal = Calendar.getInstance();
+        cal.setTime(formatToDate(oldtime));
+        cal.set(cal.get(Calendar.YEAR),cal.get(Calendar.MONDAY), cal.get(Calendar.DAY_OF_MONTH), 0, 0,0);
+        cal.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
+        return  (cal.getTimeInMillis()/1000);
+    }
+
+    // 获取当月0点时间戳
+    public static Long monthTimeInMillis() {
+        Calendar calendar = Calendar.getInstance();// 获取当前日期
+        calendar.add(Calendar.YEAR, 0);
+        calendar.add(Calendar.MONTH, 0);
+        calendar.set(Calendar.DAY_OF_MONTH, 1);// 设置为1号,当前日期既为本月第一天
+        calendar.set(Calendar.HOUR_OF_DAY, 0);
+        calendar.set(Calendar.MINUTE, 0);
+        calendar.set(Calendar.SECOND, 0);
+        Long time = calendar.getTimeInMillis()/1000;
+        return time;
+    }
+
+    // 获取当月0点时间戳
+    public static Long monthTimeInMillis(String oldtime) {
+        Calendar calendar = Calendar.getInstance();// 获取当前日期
+        calendar.setTime(formatToDate(oldtime));
+        calendar.add(Calendar.YEAR, 0);
+        calendar.add(Calendar.MONTH, 0);
+        calendar.set(Calendar.DAY_OF_MONTH, 1);// 设置为1号,当前日期既为本月第一天
+        calendar.set(Calendar.HOUR_OF_DAY, 0);
+        calendar.set(Calendar.MINUTE, 0);
+        calendar.set(Calendar.SECOND, 0);
+        Long time = calendar.getTimeInMillis()/1000;
+        return time;
+    }
+    // 获取当年0点时间戳
+    public static Long yearTimeInMillis() {
+        Calendar calendar = Calendar.getInstance();// 获取当前日期
+        calendar.add(Calendar.YEAR, 0);
+        calendar.add(Calendar.DATE, 0);
+        calendar.add(Calendar.MONTH, 0);
+        calendar.set(Calendar.DAY_OF_YEAR, 1);
+        calendar.set(Calendar.HOUR, 0);
+        calendar.set(Calendar.MINUTE, 0);
+        calendar.set(Calendar.SECOND, 0);
+        Long time = calendar.getTimeInMillis()/1000;
+        return time;
+    }
+
+    // 获取当年0点时间戳
+    public static Long yearTimeInMillis(String oldtime) {
+        Calendar calendar = Calendar.getInstance();// 获取当前日期
+        calendar.setTime(formatToDate(oldtime));
+        calendar.add(Calendar.YEAR, 0);
+        calendar.add(Calendar.DATE, 0);
+        calendar.add(Calendar.MONTH, 0);
+        calendar.set(Calendar.DAY_OF_YEAR, 1);
+        calendar.set(Calendar.HOUR, 0);
+        calendar.set(Calendar.MINUTE, 0);
+        calendar.set(Calendar.SECOND, 0);
+        Long time = calendar.getTimeInMillis()/1000;
+        return time;
+    }
+}

+ 45 - 0
src/main/java/com/xc/utils/PropertiesUtil2.java

@@ -0,0 +1,45 @@
+package com.xc.utils;
+
+
+import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.util.Properties;
+
+
+public class PropertiesUtil2 {
+    private static Logger logger = LoggerFactory.getLogger(PropertiesUtil2.class);
+
+    private static Properties props;
+
+    static {
+        String fileName = "datasource.properties";
+        props = new Properties();
+        try {
+            props.load(new InputStreamReader(PropertiesUtil2.class.getClassLoader().getResourceAsStream(fileName), "UTF-8"));
+        } catch (IOException e) {
+            logger.error("配置文件读取异常", e);
+        }
+    }
+
+    public static String getProperty(String key) {
+        String value = props.getProperty(key.trim());
+        if (StringUtils.isBlank(value)) {
+            return null;
+        }
+        return value.trim();
+    }
+
+
+    public static String getProperty(String key, String defaultValue) {
+        String value = props.getProperty(key.trim());
+        if (StringUtils.isBlank(value)) {
+            value = defaultValue;
+        }
+        return value.trim();
+    }
+}
+

+ 56 - 0
src/main/java/com/xc/utils/websocket/WsClient.java

@@ -0,0 +1,56 @@
+package com.xc.utils.websocket;
+
+//import com.alibaba.fastjson.JSONObject;
+//import com.jfinal.plugin.activerecord.Db;
+//import com.jfinal.plugin.activerecord.Record;
+import com.xc.controller.websocket.WebSocketController;
+import org.apache.commons.lang3.StringUtils;
+import org.java_websocket.client.WebSocketClient;
+import org.java_websocket.handshake.ServerHandshake;
+
+import java.net.URI;
+
+public class WsClient extends WebSocketClient {
+
+    public WsClient(URI serverUri) {
+        super(serverUri);
+    }
+
+    @Override
+    public void onOpen(ServerHandshake arg0) {
+        System.out.println(arg0);
+        System.out.println("握手成功");
+
+    }
+
+    @Override
+    public void onClose(int arg0, String arg1, boolean arg2) {
+        System.out.println("连接关闭");
+    }
+
+    @Override
+    public void onError(Exception arg0) {
+
+        System.out.println(arg0.toString());
+    }
+
+
+    /**
+     * 订阅返回的数据
+     * @param arg0
+     */
+    @Override
+    public void onMessage(String arg0) {
+        try {
+            if(StringUtils.isNotBlank(arg0)){
+                System.out.println(arg0);
+                // 处理数据 并 推送给 客户
+                new WebSocketController().sendSysMsg("all",arg0);
+            }
+        }catch (Exception e){
+
+        }
+
+    }
+
+}