master
hwf453 1 year ago
parent aebb79ec84
commit 233c61c5c6

Binary file not shown.

@ -5,17 +5,18 @@
<parent> <parent>
<groupId>org.springframework.boot</groupId> <groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId> <artifactId>spring-boot-starter-parent</artifactId>
<version>2.5.4</version> <version>2.5.3</version>
<relativePath/> <!-- lookup parent from repository --> <relativePath/> <!-- lookup parent from repository -->
</parent> </parent>
<groupId>com.rehome</groupId> <groupId>com.rehome</groupId>
<artifactId>disruptor_nmc</artifactId> <artifactId>disruptor_nmc</artifactId>
<packaging>jar</packaging> <packaging>war</packaging>
<version>1.0.0</version> <version>1.0.0</version>
<name>disruptor_nmc</name> <name>disruptor_nmc</name>
<description>SpringBoot + Disruptor 实现特快高并发处理,支撑每秒 600 万订单无压力!</description> <description>SpringBoot + Disruptor 实现特快高并发处理,支撑每秒 600 万订单无压力!</description>
<properties> <properties>
<java.version>1.8</java.version> <java.version>1.8</java.version>
<spring-cloud.version>2020.0.3</spring-cloud.version>
</properties> </properties>
<dependencies> <dependencies>
<dependency> <dependency>
@ -27,20 +28,18 @@
<artifactId>spring-boot-starter-web</artifactId> <artifactId>spring-boot-starter-web</artifactId>
</dependency> </dependency>
<dependency> <dependency>
<groupId>org.springframework.boot</groupId> <groupId>org.mybatis.spring.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId> <artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.4</version>
</dependency> </dependency>
<!-- 打war包时加入此项 告诉spring-boot tomcat相关jar包用外部的不要打进去 -->
<dependency> <dependency>
<groupId>org.springframework.boot</groupId> <groupId>javax.validation</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId> <artifactId>validation-api</artifactId>
<scope>provided</scope> <version>2.0.1.Final</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>mysql</groupId> <groupId>org.springframework.boot</groupId>
<artifactId>mysql-connector-java</artifactId> <artifactId>spring-boot-starter-validation</artifactId>
<version>8.0.26</version>
<scope>runtime</scope>
</dependency> </dependency>
<dependency> <dependency>
<groupId>org.springframework.boot</groupId> <groupId>org.springframework.boot</groupId>
@ -48,87 +47,126 @@
<scope>test</scope> <scope>test</scope>
</dependency> </dependency>
<dependency> <dependency>
<groupId>org.projectlombok</groupId> <groupId>org.eclipse.paho</groupId>
<artifactId>lombok</artifactId> <artifactId>org.eclipse.paho.client.mqttv3</artifactId>
<version>1.18.20</version> <version>1.2.0</version>
<optional>true</optional> </dependency>
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.8.2</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>com.squareup.okhttp3</groupId> <groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId> <artifactId>okhttp</artifactId>
<version>4.10.0-RC1</version> <version>3.6.0</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>com.google.code.gson</groupId> <groupId>org.apache.commons</groupId>
<artifactId>gson</artifactId> <artifactId>commons-lang3</artifactId>
<version>2.8.6</version> <version>3.9</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>com.oracle</groupId> <groupId>org.jetbrains</groupId>
<artifactId>ojdbc6</artifactId> <artifactId>annotations</artifactId>
<version>11.2.0.1.0</version> <version>19.0.0</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>com.dameng</groupId> <groupId>org.projectlombok</groupId>
<artifactId>DmJdbcDriver18</artifactId> <artifactId>lombok</artifactId>
<version>8.1.2.141</version> <version>1.18.20</version>
<optional>true</optional>
</dependency> </dependency>
<!-- https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-api -->
<dependency> <dependency>
<groupId>com.dameng</groupId> <groupId>org.apache.logging.log4j</groupId>
<artifactId>DmDialect-for-hibernate5.3</artifactId> <artifactId>log4j-api</artifactId>
<version>8.1.2.141</version> <version>2.17.1</version>
</dependency> </dependency>
<!-- https://mvnrepository.com/artifact/org.apache.logging.log4j/log4j-core -->
<dependency> <dependency>
<!--注意只有这个版本的hibernate兼容达梦数据库 --> <groupId>org.apache.logging.log4j</groupId>
<groupId>org.hibernate</groupId> <artifactId>log4j-core</artifactId>
<artifactId>hibernate-core</artifactId> <version>2.17.1</version>
<version>5.3.18.Final</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>com.lmax</groupId> <groupId>com.github.xiaoymin</groupId>
<artifactId>disruptor</artifactId> <artifactId>swagger-bootstrap-ui</artifactId>
<version>3.4.4</version> <version>1.9.6</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>com.liuhuiyu</groupId> <groupId>commons-io</groupId>
<artifactId>spring-util</artifactId> <artifactId>commons-io</artifactId>
<version>2021.1.0</version> <version>2.4</version>
</dependency> </dependency>
<!--mysql驱动 -->
<dependency> <dependency>
<groupId>io.swagger</groupId> <groupId>mysql</groupId>
<artifactId>swagger-annotations</artifactId> <artifactId>mysql-connector-java</artifactId>
<version>1.5.20</version> <version>8.0.26</version>
<scope>runtime</scope>
</dependency> </dependency>
<!--oracle驱动 -->
<dependency> <dependency>
<groupId>com.liuhuiyu</groupId> <groupId>com.oracle</groupId>
<artifactId>util</artifactId> <artifactId>ojdbc6</artifactId>
<version>2022.1.0</version> <version>11.2.0.1.0</version>
</dependency> </dependency>
<!--sqlserver驱动 -->
<dependency> <dependency>
<groupId>org.eclipse.paho</groupId> <groupId>com.microsoft.sqlserver</groupId>
<artifactId>org.eclipse.paho.client.mqttv3</artifactId> <artifactId>mssql-jdbc</artifactId>
<version>1.2.0</version> <version>11.2.0.jre8</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>org.apache.commons</groupId> <groupId>io.swagger</groupId>
<artifactId>commons-lang3</artifactId> <artifactId>swagger-annotations</artifactId>
<version>3.9</version> <version>1.5.20</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.47</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>org.bouncycastle</groupId> <groupId>org.bouncycastle</groupId>
<artifactId>bcprov-jdk15on</artifactId> <artifactId>bcprov-jdk15on</artifactId>
<version>1.68</version> <version>1.60</version>
<scope>compile</scope>
</dependency> </dependency>
<dependency> <dependency>
<groupId>org.bouncycastle</groupId> <groupId>org.bouncycastle</groupId>
<artifactId>bcpkix-jdk15on</artifactId> <artifactId>bcpkix-jdk15on</artifactId>
<version>1.68</version> <version>1.60</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
<version>1.11</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>com.lmax</groupId>
<artifactId>disruptor</artifactId>
<version>3.4.4</version>
</dependency>
<dependency>
<groupId>com.liuhuiyu</groupId>
<artifactId>spring-util</artifactId>
<version>2021.1.0</version>
</dependency>
<dependency>
<groupId>com.liuhuiyu</groupId>
<artifactId>util</artifactId>
<version>2022.1.0</version>
</dependency> </dependency>
</dependencies> </dependencies>
<build> <build>
<finalName>${project.artifactId}</finalName> <!-- <finalName>${project.artifactId}</finalName>-->
<plugins> <plugins>
<plugin> <plugin>
<groupId>org.springframework.boot</groupId> <groupId>org.springframework.boot</groupId>

@ -19,7 +19,7 @@ import java.util.Map;
@EnableJpaAuditing @EnableJpaAuditing
@EnableScheduling @EnableScheduling
@SpringBootApplication @SpringBootApplication
public class DisruptorNmcApplication implements CommandLineRunner, ApplicationContextAware { public class DisruptorNmcApplication extends SpringBootServletInitializer implements CommandLineRunner, ApplicationContextAware {
/** /**
* Spring * Spring
@ -35,15 +35,20 @@ public class DisruptorNmcApplication implements CommandLineRunner, ApplicationCo
SpringApplication.run(DisruptorNmcApplication.class, args); SpringApplication.run(DisruptorNmcApplication.class, args);
} }
/**
* @date 2021-05-18 09:20
* @description: springbootwar springboot
* @Param: SpringApplicationBuilder
*/
@Override
protected SpringApplicationBuilder configure(
SpringApplicationBuilder builder) {
return builder.sources(DisruptorNmcApplication.class);
}
// @Override
// protected SpringApplicationBuilder configure(
// SpringApplicationBuilder builder) {
// return builder.sources(DisruptorNmcApplication.class);
// }
@Override @Override
public void run(String... args) throws Exception { public void run(String... args) {
//在这里可以调用applicationContext了 //在这里可以调用applicationContext了
Map<String, Object> controllers = applicationContext.getBeansWithAnnotation(RequestMapping.class); Map<String, Object> controllers = applicationContext.getBeansWithAnnotation(RequestMapping.class);
for (Map.Entry<String, Object> entry : controllers.entrySet()) { for (Map.Entry<String, Object> entry : controllers.entrySet()) {
@ -54,8 +59,16 @@ public class DisruptorNmcApplication implements CommandLineRunner, ApplicationCo
if (disruptorMqService != null) { if (disruptorMqService != null) {
System.out.println("------------------------"); System.out.println("------------------------");
System.out.println("DisruptorMqService is not empty"); System.out.println("DisruptorMqService is not empty");
MqttRSAClient client = new MqttRSAClient(); //guangzhuo server temperature mqtt
client.start(disruptorMqService); // MqttRSAClient client = new MqttRSAClient();
// client.start(disruptorMqService);
//hk aliyun temperature mqtt
// MqttHkRSAClient clientHk = new MqttHkRSAClient();
// clientHk.start(disruptorMqService);
//hk aliyun app_push mqtt
MqttHkAppPushRSAClient clientAppPush = new MqttHkAppPushRSAClient();
clientAppPush.start(disruptorMqService);
} else { } else {
System.out.println("DisruptorMqService is empty"); System.out.println("DisruptorMqService is empty");
} }
@ -68,4 +81,6 @@ public class DisruptorNmcApplication implements CommandLineRunner, ApplicationCo
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.applicationContext = applicationContext; this.applicationContext = applicationContext;
} }
} }

@ -0,0 +1,149 @@
package com.rehome.disruptor_nmc;
import com.rehome.disruptor_nmc.service.DisruptorMqService;
import com.rehome.disruptor_nmc.utils.MqttSSLSocketFactory;
import com.rehome.disruptor_nmc.utils.UUIDUtil;
import org.eclipse.paho.client.mqttv3.*;
import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence;
import javax.net.ssl.SSLSocketFactory;
import java.io.InputStream;
import java.util.Timer;
import java.util.TimerTask;
public class MqttHkAppPushRSAClient {
/**
* ip
*/
public static final String MQTT_BROKER_HOST = "ssl://47.242.184.139:8883";
/**
*
*/
public static String MQTT_CLIENT_ID = "AppServer_disruptor_nmc_server_03";
/**
*
*/
public static String USERNAME = "admin";
/**
*
*/
public static String PASSWORD = "publish452131wW452131wW$";
/**
*
*/
public static String TOPIC_FILTER = "app_push";
private volatile static MqttClient mqttClient;
private static MqttConnectOptions options;
private static int qos = 2;
//定时器
private Timer timer;
public MqttHkAppPushRSAClient(){
try {
MQTT_CLIENT_ID = UUIDUtil.getUUID();
// host为主机名clientid即连接MQTT的客户端ID一般以客户端唯一标识符表示
// MemoryPersistence设置clientid的保存形式默认为以内存保存
mqttClient = new MqttClient(MQTT_BROKER_HOST, MQTT_CLIENT_ID, new MemoryPersistence());
// 配置参数信息
options = new MqttConnectOptions();
// 设置是否清空session,这里如果设置为false表示服务器会保留客户端的连接记录
// 这里设置为true表示每次连接到服务器都以新的身份连接
options.setCleanSession(false);
// 设置用户名
options.setUserName(USERNAME);
// 设置密码
options.setPassword(PASSWORD.toCharArray());
// 设置超时时间 单位为秒
options.setConnectionTimeout(10);
// 设置会话心跳时间 单位为秒 服务器会每隔1.5*20秒的时间向客户端发送个消息判断客户端是否在线但这个方法并没有重连的机制
options.setKeepAliveInterval(20);
//断线重连
options.setAutomaticReconnect(true);
//mqtt服务器端单双向加密
InputStream caCrtFile = this.getClass().getResourceAsStream("/sslHk/my_root_ca.crt");
InputStream crtFile = this.getClass().getResourceAsStream("/sslHk/client.crt");
InputStream keyFile = this.getClass().getResourceAsStream("/sslHk/client.key");
String password = "";
SSLSocketFactory socketFactory = MqttSSLSocketFactory.getTwoDirSocketFactory(caCrtFile,crtFile,keyFile,password);
options.setSocketFactory(socketFactory);
} catch (Exception e) {
e.printStackTrace();
}
}
public void start(DisruptorMqService disruptorMqService) {
try {
// 连接
mqttClient.connect(options);
// 订阅
mqttClient.subscribe(TOPIC_FILTER,qos);
// 设置回调
mqttClient.setCallback(new MqttCallbackExtended(){
@Override
public void connectionLost(Throwable throwable) {
System.out.println("connectionLost");
try {
mqttClient.reconnect();
} catch (MqttException e) {
e.printStackTrace();
}
}
@Override
public void messageArrived(String s, MqttMessage mqttMessage) {
String strData = new String(mqttMessage.getPayload());
System.out.println("topic:"+s);
System.out.println("Qos:"+mqttMessage.getQos());
System.out.println("message RSA:"+strData);
//disruptorMqService.pushTemperatureToMq(strData,s);
}
@Override
public void deliveryComplete(IMqttDeliveryToken iMqttDeliveryToken) {
System.out.println("deliveryComplete---------"+ iMqttDeliveryToken.isComplete());
}
@Override
public void connectComplete(boolean b, String s) {
//连接成功后调用
try {
mqttClient.subscribe(TOPIC_FILTER,qos);//具体订阅代码
} catch (MqttException e) {
e.printStackTrace();
}
}
});
timer = new Timer();
timer.schedule(new TimerTask() {
public void run() {
System.out.println("-------设定要指定任务--------");
try {
//判断拦截状态,这里注意一下,如果没有这个判断,是非常坑的
if (!mqttClient.isConnected()) {
System.out.println("***** 没有连接到服务器 *****");
System.out.println("***** client to connect *****");
// 重新连接
mqttClient.connect(options);
}
if (mqttClient.isConnected()) {//连接成功,跳出连接
System.out.println("***** connect success *****");
}
} catch (MqttException e1) {
e1.printStackTrace();
}
}
}, 10000,10000);
// 设定指定的时间time,此处为10000毫秒
} catch (Exception e) {
e.printStackTrace();
}
}
}

@ -0,0 +1,147 @@
package com.rehome.disruptor_nmc;
import com.rehome.disruptor_nmc.service.DisruptorMqService;
import com.rehome.disruptor_nmc.utils.MqttSSLSocketFactory;
import com.rehome.disruptor_nmc.utils.UUIDUtil;
import org.eclipse.paho.client.mqttv3.*;
import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence;
import javax.net.ssl.SSLSocketFactory;
import java.io.InputStream;
import java.util.Timer;
import java.util.TimerTask;
public class MqttHkRSAClient {
/**
* ip
*/
public static final String MQTT_BROKER_HOST = "ssl://47.242.184.139:8883";
/**
*
*/
public static String MQTT_CLIENT_ID = "AppServer_disruptor_nmc_server_02";
/**
*
*/
public static String USERNAME = "admin";
/**
*
*/
public static String PASSWORD = "publish452131wW452131wW$";
/**
*
*/
public static String TOPIC_FILTER = "WifiSHT/+/SHT20";
private volatile static MqttClient mqttClient;
private static MqttConnectOptions options;
private static int qos = 2;
//定时器
private Timer timer;
public MqttHkRSAClient(){
try {
MQTT_CLIENT_ID = UUIDUtil.getUUID();
// host为主机名clientid即连接MQTT的客户端ID一般以客户端唯一标识符表示
// MemoryPersistence设置clientid的保存形式默认为以内存保存
mqttClient = new MqttClient(MQTT_BROKER_HOST, MQTT_CLIENT_ID, new MemoryPersistence());
// 配置参数信息
options = new MqttConnectOptions();
// 设置是否清空session,这里如果设置为false表示服务器会保留客户端的连接记录
// 这里设置为true表示每次连接到服务器都以新的身份连接
options.setCleanSession(false);
// 设置用户名
options.setUserName(USERNAME);
// 设置密码
options.setPassword(PASSWORD.toCharArray());
// 设置超时时间 单位为秒
options.setConnectionTimeout(10);
// 设置会话心跳时间 单位为秒 服务器会每隔1.5*20秒的时间向客户端发送个消息判断客户端是否在线但这个方法并没有重连的机制
options.setKeepAliveInterval(20);
//断线重连
options.setAutomaticReconnect(true);
//mqtt服务器端单双向加密
InputStream caCrtFile = this.getClass().getResourceAsStream("/sslHk/my_root_ca.crt");
InputStream crtFile = this.getClass().getResourceAsStream("/sslHk/client.crt");
InputStream keyFile = this.getClass().getResourceAsStream("/sslHk/client.key");
String password = "";
SSLSocketFactory socketFactory = MqttSSLSocketFactory.getTwoDirSocketFactory(caCrtFile,crtFile,keyFile,password);
options.setSocketFactory(socketFactory);
} catch (Exception e) {
e.printStackTrace();
}
}
public void start(DisruptorMqService disruptorMqService) {
try {
// 连接
mqttClient.connect(options);
// 订阅
mqttClient.subscribe(TOPIC_FILTER,qos);
// 设置回调
mqttClient.setCallback(new MqttCallbackExtended(){
@Override
public void connectionLost(Throwable throwable) {
System.out.println("connectionLost");
try {
mqttClient.reconnect();
} catch (MqttException e) {
e.printStackTrace();
}
}
@Override
public void messageArrived(String s, MqttMessage mqttMessage) {
String strData = new String(mqttMessage.getPayload());
System.out.println("topic:"+s);
System.out.println("Qos:"+mqttMessage.getQos());
System.out.println("message RSA:"+strData);
disruptorMqService.pushTemperatureToMq(strData,s);
}
@Override
public void deliveryComplete(IMqttDeliveryToken iMqttDeliveryToken) {
System.out.println("deliveryComplete---------"+ iMqttDeliveryToken.isComplete());
}
@Override
public void connectComplete(boolean b, String s) {
//连接成功后调用
try {
mqttClient.subscribe(TOPIC_FILTER,qos);//具体订阅代码
} catch (MqttException e) {
e.printStackTrace();
}
}
});
timer = new Timer();
timer.schedule(new TimerTask() {
public void run() {
System.out.println("-------设定要指定任务--------");
try {
//判断拦截状态,这里注意一下,如果没有这个判断,是非常坑的
if (!mqttClient.isConnected()) {
System.out.println("***** 没有连接到服务器 *****");
System.out.println("***** client to connect *****");
// 重新连接
mqttClient.connect(options);
}
if (mqttClient.isConnected()) {//连接成功,跳出连接
System.out.println("***** connect success *****");
}
} catch (MqttException e1) {
e1.printStackTrace();
}
}
}, 10000,10000);
// 设定指定的时间time,此处为10000毫秒
} catch (Exception e) {
e.printStackTrace();
}
}
}

@ -9,6 +9,8 @@ import org.eclipse.paho.client.mqttv3.*;
import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence; import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence;
import javax.net.ssl.SSLSocketFactory; import javax.net.ssl.SSLSocketFactory;
import java.io.InputStream; import java.io.InputStream;
import java.util.Timer;
import java.util.TimerTask;
public class MqttRSAClient { public class MqttRSAClient {
@ -37,7 +39,10 @@ public class MqttRSAClient {
private volatile static MqttClient mqttClient; private volatile static MqttClient mqttClient;
private static MqttConnectOptions options; private static MqttConnectOptions options;
private static int qos = 0; private static int qos = 2;
//定时器
private Timer timer;
public MqttRSAClient(){ public MqttRSAClient(){
try { try {
@ -114,6 +119,28 @@ public class MqttRSAClient {
} }
} }
}); });
timer = new Timer();
timer.schedule(new TimerTask() {
public void run() {
System.out.println("-------设定要指定任务--------");
try {
//判断拦截状态,这里注意一下,如果没有这个判断,是非常坑的
if (!mqttClient.isConnected()) {
System.out.println("***** 没有连接到服务器 *****");
System.out.println("***** client to connect *****");
// 重新连接
mqttClient.connect(options);
}
if (mqttClient.isConnected()) {//连接成功,跳出连接
System.out.println("***** connect success *****");
}
} catch (MqttException e1) {
e1.printStackTrace();
}
}
}, 10000,10000);
// 设定指定的时间time,此处为10000毫秒
} catch (Exception e) { } catch (Exception e) {
e.printStackTrace(); e.printStackTrace();
} }

@ -1,17 +0,0 @@
package com.rehome.disruptor_nmc.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
@RequestMapping("/index")
public class IndexController {
@RequestMapping(value = "/privacy_agreement")
public String privacyAgreement() {
return "privacy_agreement";
}
}

@ -13,6 +13,12 @@ import java.util.Date;
@Proxy(lazy = false) @Proxy(lazy = false)
@Data @Data
@Entity @Entity
@Table(indexes = {@Index(name = "idx_weatherDate", columnList = "weatherDate"),
@Index(name = "idx_code", columnList = "code"),
@Index(name = "idx_createDate", columnList = "createDate"),
@Index(name = "idx_lastUpdateDate", columnList = "lastUpdateDate"),
@Index(name = "idx_weather_date_code_nmc", columnList = "weatherDate"),
@Index(name = "idx_weather_date_code_nmc", columnList = "code")})
//@GenericGenerator(name = "NmcNowWeather-uuid", strategy = "uuid") //@GenericGenerator(name = "NmcNowWeather-uuid", strategy = "uuid")
public class NmcNowWeather implements Serializable { public class NmcNowWeather implements Serializable {
public static final int COLUMN_ID_MAX_LENGTH = 32; public static final int COLUMN_ID_MAX_LENGTH = 32;

@ -13,6 +13,18 @@ import java.util.Date;
@Proxy(lazy = false) @Proxy(lazy = false)
@Data @Data
@Entity @Entity
//普通索引,不指定索引名,表自动创建索引名
//@Table(indexes = {@Index(columnList = "dataDate"),@Index(columnList = "locationDesc")})
//普通索引,指定索引名,创建单个索引
//在这个例子中Temperature实体类通过@Table注解的indexes属性定义了一个名为idx_dataDate的索引它覆盖了dataDate字段。这意味着在数据库层面针对dataDate字段的查询将会利用这个索引从而提高查询效率。
//@Table(indexes = {@Index(name = "idx_dataDate", columnList = "dataDate")})
//同时创建多个普通索引,注意每个索引名都不同
//@Table(indexes = {@Index(name = "idx_dataDate", columnList = "dataDate"),@Index(name = "idx_locationDesc", columnList = "locationDesc")})
//@Table(indexes = {@Index(name = "idx_dataDate", columnList = "dataDate"),@Index(name = "idx_locationDesc", columnList = "locationDesc"),@Index(name = "idx_dataHour", columnList = "dataHour"),@Index(name = "idx_dataMinute", columnList = "dataMinute")})
//创建组合索引,注意每个索引名都相同
//@Table(indexes = {@Index(name = "data_date_location_desc", columnList = "dataDate"),@Index(name = "data_date_location_desc", columnList = "locationDesc")})
//同时创建普通索引和组合索引,注意普通索引每个索引名都不同,注意组合索引每个索引名都相同
@Table(indexes = {@Index(name = "idx_dataDate", columnList = "dataDate"),@Index(name = "idx_locationDesc", columnList = "locationDesc"),@Index(name = "idx_dataHour", columnList = "dataHour"),@Index(name = "idx_dataMinute", columnList = "dataMinute"),@Index(name = "data_date_location_desc", columnList = "dataDate"),@Index(name = "data_date_location_desc", columnList = "locationDesc")})
public class Temperature implements Serializable { public class Temperature implements Serializable {
@Id @Id
@GeneratedValue(strategy = GenerationType.IDENTITY) @GeneratedValue(strategy = GenerationType.IDENTITY)

@ -11,4 +11,6 @@ public class MessageModel {
private String topic; private String topic;
private String type;
} }

@ -7,10 +7,9 @@ import com.rehome.disruptor_nmc.service.TemperatureService;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer; import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
import javax.annotation.Resource;
@Slf4j @Slf4j
public class NmcWeatherEventHandler extends SpringBootServletInitializer implements EventHandler<MessageModel> { public class NmcWeatherEventHandler implements EventHandler<MessageModel> {
@Override @Override
public void onEvent(MessageModel event, long sequence, boolean endOfBatch) { public void onEvent(MessageModel event, long sequence, boolean endOfBatch) {
@ -20,10 +19,11 @@ public class NmcWeatherEventHandler extends SpringBootServletInitializer impleme
log.info("消费者处理消息开始"); log.info("消费者处理消息开始");
if (event != null) { if (event != null) {
log.info("消费者消费的信息是:{}", event); log.info("消费者消费的信息是:{}", event);
if(event.getTopic()!=null){ if("mqttTemperature".equals(event.getType())){
TemperatureService temperatureService = SpringUtil.getBean(TemperatureService.class); TemperatureService temperatureService = SpringUtil.getBean(TemperatureService.class);
temperatureService.saveTemperature(event.getTemperatureAndHumidityData(),event.getTopic()); temperatureService.saveTemperature(event.getTemperatureAndHumidityData(),event.getTopic());
}else{ }
if("NmcWeather".equals(event.getType())){
NmcWeatherService nmcWeatherService = SpringUtil.getBean(NmcWeatherService.class); NmcWeatherService nmcWeatherService = SpringUtil.getBean(NmcWeatherService.class);
nmcWeatherService.saveNowWeather(event.getMessage()); nmcWeatherService.saveNowWeather(event.getMessage());
} }
@ -34,3 +34,5 @@ public class NmcWeatherEventHandler extends SpringBootServletInitializer impleme
log.info("消费者处理消息结束"); log.info("消费者处理消息结束");
} }
} }
//http://www.nmc.cn/

@ -0,0 +1,70 @@
package com.rehome.disruptor_nmc.response;
import org.springframework.validation.BindException;
import org.springframework.validation.FieldError;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import java.util.Optional;
@RestControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(BindException.class)
public Result handleValidationException(BindException ex) {
Result result = Result.failedByParamValidated();
for (FieldError error : ex.getBindingResult().getFieldErrors()) {
System.out.println(error.getField());
System.out.println(error.getDefaultMessage());
String baseErrorStr = result.getMessage();
if(error.getField()!=null){
baseErrorStr=baseErrorStr+","+error.getField();
result.setMessage(baseErrorStr);
}
if(error.getDefaultMessage()!=null){
baseErrorStr=baseErrorStr+":"+error.getDefaultMessage();
result.setMessage(baseErrorStr);
}
}
return result;
}
}
//@RestControllerAdvice
//public class GlobalExceptionHandler {
// @ExceptionHandler(BindException.class)
// public R handleValidationException(BindException ex) {
// R result = R.error();
// for (FieldError error : ex.getBindingResult().getFieldErrors()) {
// result.data(error.getField(), error.getDefaultMessage());
// }
// Optional<Object> firstError = result.getData().values().stream().findFirst();
// return result.msg("请完善信息: "+firstError.orElse("表单内容") +
// (ex.getErrorCount()>1?" 等多项问题":""));
// }
//}
//参考https://www.cnblogs.com/liuscraft/p/17366441.html
//<dependencies>
//<dependency>
//<groupId>org.springframework.boot</groupId>
//<artifactId>spring-boot-starter-validation</artifactId>
//</dependency>
//</dependencies>
//@RestController
//@RequestMapping("/users")
//@Validated
//public class UserController {
// @PostMapping
// public String createUser(@RequestBody User user, BindingResult result) {
// if (result.hasErrors()) {
// // 处理错误信息
// return "error";
// }
// // 处理用户信息
// return "success";
// }
//}

@ -0,0 +1,7 @@
package com.rehome.disruptor_nmc.response;
//定义返回数据结构
public interface IResult {
Integer getCode();
String getMessage();
}

@ -0,0 +1,30 @@
package com.rehome.disruptor_nmc.response;
import org.springframework.core.MethodParameter;
import org.springframework.http.MediaType;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.server.ServerHttpRequest;
import org.springframework.http.server.ServerHttpResponse;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice;
//统一包装处理,扫描需要包装返回数据的包
//如果引入了swagger或knife4j的文档生成组件这里需要仅扫描自己项目的包否则文档无法正常生成
@RestControllerAdvice(basePackages = "com.rehome.disruptor_nmc.controller")
public class ResponseAdvice implements ResponseBodyAdvice<Object> {
@Override
public boolean supports(MethodParameter returnType, Class<? extends HttpMessageConverter<?>> converterType) {
// 如果不需要进行封装的,可以添加一些校验手段,比如添加标记排除的注解
return true;
}
@Override
public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType, Class<? extends HttpMessageConverter<?>> selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) {
// 提供一定的灵活度如果body已经被包装了就不进行包装
if (body instanceof Result) {
return body;
}
return Result.success(body);
}
}

@ -0,0 +1,68 @@
package com.rehome.disruptor_nmc.response;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.validation.BindingResult;
import org.springframework.validation.FieldError;
//统一返回数据结构
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Result<T> {
private Integer code;
private String message;
private T data;
public static <T> Result<T> success(T data) {
return new Result<>(ResultEnum.SUCCESS.getCode(), ResultEnum.SUCCESS.getMessage(), data);
}
public static <T> Result<T> success(String message, T data) {
return new Result<>(ResultEnum.SUCCESS.getCode(), message, data);
}
public static Result<?> failed() {
return new Result<>(ResultEnum.COMMON_FAILED.getCode(), ResultEnum.COMMON_FAILED.getMessage(), null);
}
public static Result<?> failedByParamValidated() {
return new Result<>(ResultEnum.REQUEST_PARAM_VALIDATED_FAILED.getCode(), ResultEnum.REQUEST_PARAM_VALIDATED_FAILED.getMessage(), null);
}
public static Result<?> failedByParamValidated(BindingResult bindingResult) {
Result result = new Result<>(ResultEnum.REQUEST_PARAM_VALIDATED_FAILED.getCode(), ResultEnum.REQUEST_PARAM_VALIDATED_FAILED.getMessage(), null);
// 处理错误信息
for (FieldError error : bindingResult.getFieldErrors()) {
String baseErrorMessage = result.getMessage();
if(error.getField()!=null){
baseErrorMessage=baseErrorMessage+","+error.getField();
result.setMessage(baseErrorMessage);
}
if(error.getDefaultMessage()!=null){
baseErrorMessage=baseErrorMessage+":"+error.getDefaultMessage();
result.setMessage(baseErrorMessage);
}
}
return result;
}
public static Result<?> failed(String message) {
return new Result<>(ResultEnum.COMMON_FAILED.getCode(), message, null);
}
public static Result<?> failed(IResult errorResult) {
return new Result<>(errorResult.getCode(), errorResult.getMessage(), null);
}
public static <T> Result<T> instance(Integer code, String message, T data) {
Result<T> result = new Result<>();
result.setCode(code);
result.setMessage(message);
result.setData(data);
return result;
}
}

@ -0,0 +1,38 @@
package com.rehome.disruptor_nmc.response;
import lombok.AllArgsConstructor;
import lombok.NoArgsConstructor;
@NoArgsConstructor
@AllArgsConstructor
//常用结果的枚举
public enum ResultEnum implements IResult {
SUCCESS(2001, "接口调用成功"),
VALIDATE_FAILED(2002, "参数校验失败"),
COMMON_FAILED(2003, "接口调用失败"),
FORBIDDEN(2004, "没有权限访问资源"),
REQUEST_PARAM_VALIDATED_FAILED(2005, "请求参数校验失败");
private Integer code;
private String message;
@Override
public Integer getCode() {
return code;
}
public void setCode(Integer code) {
this.code = code;
}
@Override
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
//省略get、set方法和构造方法
}

@ -30,8 +30,8 @@ public class ScheduledService {
@Resource @Resource
private NmcCityService nmcCityService; private NmcCityService nmcCityService;
@Resource // @Resource
private NmcWeatherService nmcWeatherService; // private NmcWeatherService nmcWeatherService;
/** /**
* @date 2022-03-16 09:41 * @date 2022-03-16 09:41
@ -134,7 +134,7 @@ public class ScheduledService {
* @description: * @description:
* @Param: null * @Param: null
*/ */
//@Scheduled(cron = "0 15 * * * *") @Scheduled(cron = "0 15 * * * *")
public void getNmcNowWeather() { public void getNmcNowWeather() {
System.out.println("scheduledGetWeather"); System.out.println("scheduledGetWeather");
System.out.println("=====>>>>>使用cron:" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); System.out.println("=====>>>>>使用cron:" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));

@ -28,6 +28,7 @@ public class DisruptorMqServiceImpl implements DisruptorMqService {
//给Event填充数据 //给Event填充数据
MessageModel event = messageModelRingBuffer.get(sequence); MessageModel event = messageModelRingBuffer.get(sequence);
event.setMessage(message); event.setMessage(message);
event.setType("NmcWeather");
log.info("往消息队列中添加消息:{}", event); log.info("往消息队列中添加消息:{}", event);
} catch (Exception e) { } catch (Exception e) {
log.error("failed to add event to messageModelRingBuffer for : e = {},{}", e, e.getMessage()); log.error("failed to add event to messageModelRingBuffer for : e = {},{}", e, e.getMessage());
@ -47,6 +48,7 @@ public class DisruptorMqServiceImpl implements DisruptorMqService {
//给Event填充数据 //给Event填充数据
MessageModel event = messageModelRingBuffer.get(sequence); MessageModel event = messageModelRingBuffer.get(sequence);
event.setTemperatureAndHumidityData(temperatureAndHumidityData); event.setTemperatureAndHumidityData(temperatureAndHumidityData);
event.setType("mqttTemperature");
event.setTopic(topic); event.setTopic(topic);
log.info("往消息队列中添加消息:{}", event); log.info("往消息队列中添加消息:{}", event);
} catch (Exception e) { } catch (Exception e) {

@ -1,7 +1,5 @@
#1.项目启动的端口
server: server:
port: 8080 port: 18080
spring: spring:
datasource: datasource:
type: com.zaxxer.hikari.HikariDataSource type: com.zaxxer.hikari.HikariDataSource
@ -36,13 +34,16 @@ spring:
open-in-view: true open-in-view: true
hibernate: hibernate:
ddl-auto: update # 第一次建表create 后面用update要不然每次重启都会新建表 ddl-auto: update # 第一次建表create 后面用update要不然每次重启都会新建表
thymeleaf: naming:
enabled: true #开启thymeleaf视图解析 physical-strategy: org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy
encoding: utf-8 #编码 servlet:
prefix: classpath:/templates/ #前缀 multipart:
cache: false #是否使用缓存 # 开启 multipart 上传功能
mode: HTML #严格的HTML语法模式 enabled: true
suffix: .html #后缀名 # 文件写入磁盘的阈值
file-size-threshold: 2KB
# 最大文件大小
max-file-size: 200MB
# 最大请求大小
max-request-size: 215MB
rehome:
resources-path: /home/admin/storage # 外部资源文件存储路径

@ -0,0 +1,27 @@
-----BEGIN RSA PRIVATE KEY-----
MIIEogIBAAKCAQEApkLWaF5mqX/9Qv0PiFgvsEO9vNNzKcGjyAyLZBNQb70PgF33
i7XsOBwNzo/xdisBXmWsCOPWVM60MUIGT4v7iCNueWQlMOsYYNxV47EV3ZclZbz4
Ji5sKKczn1U1l25w5v3jNZEYcxHU6uwmtiBFCZa2SeEV0jI356qNU5Wvt9u/Io9Z
tb5tZOMa71ERejViqZtfNIg5Q3oRB7gyhyFKVKjPZI5MnfA895+7SrL4Nm4OIApm
dKM0dTV7Xz1VsRnO3IlivnmaQy7sBMv7ak8vNXCMO1qHQGKOmNrKHtQTswxOdute
5kSSzVRBE25Xrk/RyG+01mtccU2liNWMjfTEwwIDAQABAoIBAEkt9g1uL6W/jgvk
MugCWMsupd7s+y2P67TrwJbF4YutHZuUwJaf9l8kCfe3Z8JpX2rbOYOYNQiTCsD7
nKd6p7XeUovfxnbno41OrgdQNJ2aH33OVTMJD9Y88f3ZlYMXu14Qtecn/Cj52kuk
sc1MGtcDnSybg+1G6VBww0/c/MDhpHSEevJ8LZaxTOyNPvt4qVJZKtArBGnFPh81
VKiBQy6Aumm4k9gRkrVbAR0xo9DiOYE0hfga04J3EwYdI2uhGvgew2zeRVSdsN81
TN8mNJ/BTra2Yqf4bp22IhNT6G9AgfjqTb1mDfaQHkN5SABgB8TE/HubJ4wH/Jn+
ptVLR5ECgYEA0gzbolhfskVJ00eNs1ik6SKpBQwKz27OokNILfG5+BzLTK5kBYtU
jov9lSRz/PWHX+g7Do3ncdueSvHpBALaUcsxVsY1QoWcxQ8NLlZfcY1dm1Vuudzg
dy3Ccl7vKsoQBkI/an+3+ooiy/XX9pydt4/QfkmzCaAre0SuLavNWJcCgYEAyqG4
DUf41LFQTDNTTUxcg924JDk6pxO3+4Qr98CSJz+6pICkTw3fy/cKOj1wFc1RA4/0
DndiXBXnA0wnfPb2dktZ970cXofaIXMbpcteBSJC/Atqd8Mmcit+A21FTx5nI/dv
CGgmAj0j0Y7nX91+jos4l6/ihXskQQDfUYA2LrUCgYBqGOKLsxXLRyJOHPNfJqRN
uhsjmHyRYEfxQAjiZBnqUCkEN4YAIut4AQ/6WGpZ2G8jq3rBFD5WjXb8Jgrr4sEB
1Z+7U+ytCC4yfzLKOAiHo78nadS+/ulGaY+xE3C87UmAz8+WbKKyYznGSgxm3Z7w
jCzkzTco4oV0AzHzkbbsSwKBgDaOVgyVXSR+3Py3MO116s7CKmruUaFcSMPaMTBS
U8dnfCwASrzSIng6+jD2C7CDCBXqcy5V7FCYwQr9PQCDSZZN8VonO3UkJJGu+Tmp
SJYfRGOx+ydljntcxF/N0sRbji971hQwXlNp/LPWQutnqkRcrY8Blv6TSg6KWpYJ
7AylAoGAMp/nSsfpjnoYW+8KdC+iEZw66FjCg5HV11rWCUqj7gsgNOfCUhku826M
23SwZWWVQzOR5dJsmtUuzO1cXcpxKSpMdpVikB4TYFm4U1l5QZuSG+L2516IjwwJ
q96skUIZ649Tu1B5ecQLMPD0S/Hc8Guhcr31KGnisOQt/CbSA1w=
-----END RSA PRIVATE KEY-----

File diff suppressed because one or more lines are too long

@ -1,81 +0,0 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>首部及导言</h1>
<p>珠海经济特区广珠发电有限责任公司(以下称为“本公司”或“我们”)特别提示:</p>
<p>“珠电e办公”软件以下简称“本软件”或“移动办公”是本公司为企业用户提供的一款线上办公及电力生产相关应用服务软件。《“珠电e办公”软件许可及服务协议》 (以下简称“本协议”)系确立您与本公司之间就您下载、安装、注册、登录及使用本软件所订立的,描述您与本公司之间权利义务的协议。</p>
<p>请您审慎阅读、充分理解本协议内容特别是免除或者限制责任的条款以及开通或使用某项服务的单独协议并选择接受或不接受本协议。除非您已阅读并接受本协议所有条款否则您无权下载、安装或使用本软件及其相关服务。您的下载、安装、使用、获取账号和登录等行为将视为您已阅读并同意接受本协议的约束。本软件仅面向本公司员工提供服务未满18周岁的用户无法使用本软件。</p>
<p>我们有权对本协议进行修改修改后的协议条款一旦公布即代替原来的协议条款。在通知用户修改本协议后用户若不接受须停止使用本软件及服务用户若继续使用将被视为接受修改后的协议条款。在本协议项下不对包括但不限于“珠电e办公”及依据本协议提供的服务方面做出除法律强制要求之外的任何担保或保证。本协议项下包含对您与本公司之间权利义务限制或者免责的条款请认真阅读除非您与本公司另有书面协议否则您与本公司的协议将始终至少包括下述文件中陈述的条款和条件</p>
<h4>一、知识产权声明</h4>
<p>1.1 本软件由珠海经济特区广珠发电有限责任公司开发,本软件的一切版权、商标权、专利权、商业秘密等知识产权,以及与本软件相关的所有信息内容(包括但不限于:文字表述及其组合、图标、图饰、图表、色彩、界面设计、版面框架、有关数据、印刷材料、或电子文档等)均受中华人民共和国著作权法、商标法、专利法、反不正当竞争法和相应的国际条约以及其他知识产权法律法规的保护,除涉及第三方授权的软件或技术外,珠海经济特区广珠发电有限责任公司享有上述知识产权及相关权益。</p>
<p>1.2 未经本公司书面同意,用户不得为任何营利性或非营利性的目的自行实施、利用、转让,或许可任何第三方实施、利用、转让上述知识产权及相关权益,本公司保留追究上述未经许可行为的权利。</p>
<h4>二、本软件授权范围</h4>
<p>2.1 用户可为非商业目的在单台终端设备上安装、使用、显示和运行本软件。用户不得为任何商业目的安装、使用、显示和运行本软件,不得对本软件、本软件运行过程中释放到任何终端中的数据、或者本软件运行过程中在任何终端之间交互的数据进行复制、更改、修改、挂接运行、或创作任何衍生作品,形式包括但不限于使用插件、外挂或非经授权的第三方工具/服务接入本软件和相关系统。</p>
<p>2.2 用户不得未经本公司许可将本软件安装在未经本公司明示许可的设备及任何装置上包括但不限于计算机、机顶盒、手持设备、电话、无线上网机、游戏机、电视机、DVD机等。</p>
<p>2.3 保留权利:未明示授权的其他一切权利仍归本公司所有,用户使用其他权利时须另外取得本公司的书面同意。</p>
<h4>三、用户使用须知</h4>
<h4>3.1 “珠海经济特区广珠发电有限责任公司”用户</h4>
<p>3.1.1 “珠电e办公”不支持用户自行注册账号用户入职本公司时系统由公司系统管理员创建对应账号。</p>
<p>3.1.2 “珠电e办公”用户离职时对应的账号以及资料会自动删除用户将无法继续登录并使用“珠电e办公”相关服务。</p>
<p>3.1.3 用户理解并同意“珠电e办公”业务可能会使第三方知晓用户相关信息包括但不限于本公司员工可查询用户的姓名、手机号、电子邮箱、办公地址等信息用户若不同意第三方访问、获取用户相关信息须停止使用本软件。用户继续使用本软件即视为同意第三方知晓用户相关信息。</p>
<p>3.1.4 用户理解并同意对“珠电e办公”出现的产品问题采取包容态度愿意配合进行产品改进优化不得将产品漏洞、潜在缺陷、不稳定或不确定的情况公开传播不得以此损害本公司的商誉不得利用产品漏洞、缺陷从事侵害任何权益的违法行为。</p>
<p>3.1.5 本公司保留对未来“珠电e办公”服务改变和说明的权利。</p>
<h4>3.2 用户在遵守法律及本协议的前提下可依本协议使用本软件,用户无权实施包括但不限于下列行为:</h4>
<p>3.2.1 用户通过非本公司开发、授权或认可的第三方兼容软件、系统登录或使用本软件及服务。</p>
<p>3.2.2 删除本软件及其他副本上所有关于版权的信息、内容。</p>
<p>3.2.3 对本软件进行反向工程、反向汇编、反向编译等。</p>
<p>3.2.4 对于本软件相关信息,未经珠海经济特区广珠发电有限责任公司书面同意,用户擅自实施包括但不限于下列行为:使用、出租、出借、复制、修改、链接、转载、汇编、发表、出版、建立镜像站点、擅自借助本软件发展与之有关的衍生产品、作品、服务、插件、外挂、兼容、互联等。</p>
<p>3.2.5 利用本软件发表、传送、传播、储存违反国家法律、危害国家安全、祖国统一、社会稳定、公序良俗的内容,或任何不当的、侮辱诽谤的、淫秽的、暴力的及任何违反国家法律法规政策的内容。</p>
<p>3.2.6 利用本软件发表、传送、传播、储存侵害他人知识产权、商业秘密权等合法权利的内容。</p>
<p>3.2.7 利用本软件制造虚假身份或传播虚假信息以误导、欺骗他人。</p>
<p>3.2.8 利用本软件批量发表、传送、传播广告信息及垃圾信息。</p>
<p>3.2.9 利用本软件传送、散布或以其他方式实现传送含有受到知识产权法律保护的图像、相片、软件或其他资料的文件,包括但不限于专利权、版权、商标权、技术秘密、商业秘密、隐私权或其他智慧产权,除非用户拥有或控制着相应的权利或已得到所有必要的认可。</p>
<p>3.2.10 使用任何包含有通过侵犯商标、版权、专利、商业机密或任何一方的其他专有权利的方式利用本软件获得的图像或相片等资料或信息。</p>
<p>3.2.11 任何人利用本软件进行任何危害计算机网络安全的行为,包括但不限于:使用未经许可的数据或进入未经许可的服务器/账号未经允许进入公众计算机网络或者他人计算机系统并删除、修改、增加存储信息未经许可企图探查、扫描、测试本软件系统或网络的弱点或其它实施破坏网络安全的行为企图干涉、破坏本软件系统或网站的正常运行故意传播恶意程序或病毒以及其他破坏干扰正常网络信息服务的行为伪造TCP/IP数据包名称或部分名称。</p>
<p>3.2.13 将本软件及本公司提供的服务用于核设施运行、生命维持或其他会使人类及其财产处于危险之中的重大设备。用户理解本软件及本公司提供的服务并非为以上目的而设计,如果因为本软件和服务的原因导致以上操作失败而带来的人员伤亡、财产损失和环境破坏,本公司将不承担任何责任。</p>
<p>3.2.14 制作、发布、传播用于窃取“珠电e办公”账号及他人专属信息、财产、保密信息的软件。</p>
<p>3.2.15 在未经珠海经济特区广珠发电有限责任公司书面明确授权前提下,出售、出租、出借、散布、转移或转授权本软件和服务或相关的链接、或从使用本软件和服务/本软件和服务的条款中获利,无论以上使用是否为直接经济或金钱收益。</p>
<p>3.2.16 传输或发表:煽动抗拒、破坏宪法和法律、行政法规实施的言论,煽动颠覆国家政权、推翻社会主义制度的言论,煽动分裂国家、破坏国家统一的言论、煽动民族仇恨、民族歧视、破坏民族团结的言论。</p>
<p>3.2.17传输或发表任何违法犯罪的、骚扰性的、中伤他人的、辱骂性的、恐吓性的、伤害性的、庸俗的、淫秽的、不文明的等信息资料。</p>
<p>3.2.18传输或发表违背公序良俗和涉及国家安全的信息资料或言论。</p>
<p>3.2.19 其他以任何不合法的方式、为任何不合法的目的、或以任何与本协议不一致的方式使用本软件和和本公司提供的其他服务。</p>
<h4>3.3 安全意识和网络攻击</h4>
<p>本软件与常见互联网软件一样,受包括但不限于用户原因、网络服务质量、网络遭受攻击、社会环境等因素的影响,可能受到各种安全问题的侵扰,例如:他人非法利用用户的资料,造成现实生活中的骚扰;用户下载安装的软件或访问的网站中含有病毒,威胁到用户的信息和数据的安全,继而影响本软件的正常使用等等。用户应加强信息安全及使用者资料的保护意识,要注意加强密码保护,以免遭致损失和骚扰。</p>
<h4>3.4 个人隐私和数据保护</h4>
<p>保护用户个人信息安全是本公司的一贯制度我们将会采取合理的措施保护用户的个人信息。针对本软件的具体个人信息收集、处理等规则详见《“珠电e办公”隐私政策》我们会按照该隐私政策的约定保障用户个人信息安全及合规使用。</p>
<h4>3.5 计算机资源使用的同意及风险提示</h4>
<p>3.5.1 本软件需要用户共同享用、维护其所提供的利益,用户在此确认同意本软件在必要时使用您计算机的处理器和带宽等资源,用作容许本软件的其它使用者与您通讯联络、分享本软件及服务的有限目的。此项同意可能会影响用户的使用感受和带来不可预知的风险。您应认真考虑做出选择,并承担风险。</p>
<p>3.5.2 用户同意本软件将会尽其合理努力以保护您的计算机资源及计算机通讯的隐私性和完整性,但是,您承认和同意本公司不能就此事提供任何保证。</p>
<p>3.5.3 本公司保留下列权利:在任何时候根据适用法律、法规、法律程序或政府要求的需要而披露任何信息,或由本公司自主决定全部或部分的编辑、拒绝张贴或删除任何信息或资料。</p>
<h4>3.6 本软件的替换、修改和升级</h4>
<p>本公司保留在任何时候通过为您提供本软件替换、修改、升级版本的权利,以及为替换、修改或升级收取费用的权利。本软件为用户默认开通“升级提示”功能,视用户使用的版本差异,本公司提供用户自行选择是否需要开通此功能。本软件的新版本发布后,本公司不保证本软件的旧版本能够继续可用。本公司因业务发展需要,可以单方面对软件的部分功能效果进行改变或进行限制,用户需承担由此产生的风险。</p>
<h4>3.7 本软件使用的第三方的软件或技术</h4>
<p>3.7.1 本软件可能会使用第三方的软件或技术,该等使用均已获得合法授权。如因本软件使用的第三方软件或技术引发的任何纠纷,由该第三方负责解决,珠海经济特区广珠发电有限责任公司不承担任何责任。珠海经济特区广珠发电有限责任公司不对该第三方软件或技术提供客服支持,若用户需要获取支持,请与该第三方联系。</p>
<p>3.7.2 本软件若使用第三方的软件或技术,该第三方对该等使用有要求且需要用户遵守的,用户应当遵守该等要求。本协议的附件将向用户介绍本软件所使用的第三方的软件或技术,并将向用户提供该第三方网络链接地址,用户可以通过点击该网络链接地址浏览、阅读、了解该第三方提出的该等软件或技术的使用要求。</p>
<p>3.7.3 本协议上述第3.7.2条提到,本协议的附件将对本软件所使用的第三方的软件或技术进行介绍。用户充分理解到:该介绍仅仅是珠海经济特区广珠发电有限责任公司依照该第三方提供的情况,并根据珠海经济特区广珠发电有限责任公司的理解对该等软件或技术所作的简要介绍。珠海经济特区广珠发电有限责任公司并不对该等软件或技术的功能、性质及其他情况作任何明示的或者默示的担保,也不保证该等介绍是对该等软件或技术所有情况的全面的、细致的介绍。用户如需对该等软件或技术进行全面细致的了解,应当直接与该第三方联系。</p>
<p>3.7.4 本协议上述第3.7.2条提到,第三方可能对本软件使用其授权的软件或技术有相关要求,且需要用户遵守,本协议的附件将向用户提供第三方的网络链接地址,供用户了解第三方的相关要求。</p>
<h4>四、法律责任与免责</h4>
<h4>4.1 利用的许可</h4>
<p>4.1.1 许可利用您的计算机为了得到本软件所提供的利益用户在此许可本公司利用用户计算机的处理器和宽带用作容许“珠电e办公公”处理相关信息以及与服务器通讯联络的有限目的。</p>
<p>4.1.2 保护用户的计算机资源用户认可“珠电e办公”软件将会尽其商业上的合理努力以保护用户的计算机资源及计算机通讯的隐私性和完整性但是用户承认和同意本公司不能就此事提供任何保证。</p>
<p>4.1.3 本软件为网络交互型软件,为改善软件服务和体验、完善业务内容,珠海经济特区广珠发电有限责任公司可以根据用户软件使用状态和行为,自行或与合作方合作开发新的服务或者调整软件功能。</p>
<p>4.2 用户违反本协议或相关的服务条款的规定导致或产生的任何第三方主张的任何索赔、要求或损失包括合理的律师费用户同意赔偿珠海经济特区广珠发电有限责任公司并使之免受损害。对此珠海经济特区广珠发电有限责任公司有权视用户的行为性质在不事先通知用户的情况下采取本协议第3.5条所述的措施。</p>
<p>4.3 用户使用本软件应自行承担风险,珠海经济特区广珠发电有限责任公司对本软件不作任何类型的担保,不论是明示的、默示的或法令的保证和条件,包括但不限于本软件的适销性、适用性、无病毒、无疏忽或无技术瑕疵问题、所有权和无侵权的明示或默示担保和条件等。对在任何情况下因使用或不能使用本软件所产生的直接、间接、偶然、特殊及后续的损害及风险,珠海经济特区广珠发电有限责任公司不承担任何责任。</p>
<p>4.4 使用本软件涉及到互联网服务,可能会受到各个环节不稳定因素的影响,存在因不可抗力、计算机病毒、黑客攻击、系统不稳定、用户所在位置、用户关机,非法内容信息、骚扰信息屏蔽以及其他任何网络、技术、通信线路、信息安全管理措施等原因造成的服务中断、受阻等不能满足用户要求的风险,用户须明白并自行承担以上风险,用户因此不能发送或接收阅读消息,或接、发错消息,珠海经济特区广珠发电有限责任公司不承担任何责任。</p>
<p>4.5 用户因第三方如电信部门的通讯线路故障、技术问题、网络、电脑故障、系统不稳定性及其他各种不可抗力原因而遭受的包括短信费、流量费等一切损失,珠海经济特区广珠发电有限责任公司不承担任何责任。</p>
<p>4.6 因技术故障等不可抗事件影响到本软件及服务的正常运行的,珠海经济特区广珠发电有限责任公司承诺在第一时间内与相关单位配合,及时处理进行修复,但用户因此而遭受的一切损失,珠海经济特区广珠发电有限责任公司不承担任何责任。</p>
<p>4.7 用户之间通过本软件与其他用户交往,因受误导或欺骗而导致或可能导致的任何心理、生理上的伤害以及经济上的损失,由过错方依法承担所有责任,一概与珠海经济特区广珠发电有限责任公司无关。</p>
<p>4.8 本公司基于本协议约定使用用户信息资源的(包括但不限于非个人隐私信息),不承担任何责任。</p>
<h4>五、 其他条款</h4>
<p>5.1 协议的完整性:本协议以及第三方授权软件或技术的使用协议和许可条款,共同构成了本软件及其服务的完整协议。</p>
<p>5.2 本协议所约定的任何条款的部分或全部无效者,不影响其它条款的效力。</p>
<p>5.3 本协议的所有标题仅仅是为了醒目及阅读方便,本身并无实际涵义,不能作为本协议涵义解释之依据。</p>
<h4>六、法律适用条款</h4>
<p>6.1 本协议适用中华人民共和国法律。</p>
<p>6.2 如果双方发生纠纷,应本着友好的原则协商解决;如协商不成,应向珠海经济特区广珠发电有限责任公司所在地的法院提起诉讼。</p>
</body>
</html>

@ -1,41 +0,0 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script type="text/javascript" src="js/jquery-1.8.3.min.js"></script>
<script type="text/javascript">
$(function(){
var data = myObj.getData();
var time = myObj.getTime();
dataHighchartXdDt(data,time);
})
function test(){
var data = myObj.getData();
var time = myObj.getTime();
$('#container').html(time);
}
//心电
function dataHighchartXdDt(data,time){
//以下是绘制心电的逻辑
//省略
$('#container').html(time);
}
function setDeviceData(data){
$('#container').html(data);
}
function receiveNfcData(nfc){
$('#container').html(nfc);
alert(nfc);
}
</script>
</head>
<body>
<button onclick="test()">点我吧</button>
<div id="container"></div>
</body>
</html>

@ -1,87 +0,0 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>隐私保护指引</h1>
<p>
珠电e办公以下简称“移动办公”是一款珠海经济特区广珠发电有限责任公司以下亦简称“我们”或“广珠公司”在中华人民共国境内提供服务的移动办公软件产品。为说明移动办公会如何收集、使用和存储你的个人信息及你享有何种权利我们将通过本指引向你阐述相关事宜其中要点如下</p>
<p>1.我们将逐一说明我们收集的你的个人信息类型及其对应的用途,以便你了解我们针对某一特定功能所收集的具体个人信息的类别、使用理由及收集方式。</p>
<p>
2.当你使用某些功能时,我们会在获得你的同意后,收集你的敏感个人信息。如你在使用工作票功能附带的人脸核验功能时,需要提供姓名和身份证号,以便和权威数据库比对。除非按照相关法律法规要求必须收集,拒绝提供这些信息仅会使你无法使用相关特定功能,但不影响你正常使用移动办公的其他功能。</p>
<p>
3.我们不会主动共享或转让你的个人信息至广珠公司外的第三方。如存在其他共享或转让你的个人信息,或你需要我们将你的个人信息共享或转让至广珠公司外的第三方情形时,我们会直接征得或确认第三方征得你对上述行为的明示同意,但法律法规另有规定或因保护用户权益需要时除外。此外,我们会对对外提供信息的行为进行风险评估。</p>
<p>
4.我们不会主动从广珠公司外的第三方获取你的个人信息。如为业务发展需要从第三方获取你的个人信息,我们会依法核实来源的合法性,或在获取前向你明示你个人信息的来源、类型及使用范围;此外,我们也将会严格遵守相关法律法规的规定,并要求第三方保障其提供的信息的合法性。</p>
<p>
5.为了在本指引下收集你的信息,或者向你提供服务、优化我们的服务以及保障你的账号安全,我们将需要向你索取相关的权限;其中的敏感权限例如通讯录、位置、摄像头、相册等均不会默认开启,只有在你明确同意后我们才会在你同意的范围内调用或使用。对你已经向我们授权的该等权限。</p>
<p>需要特别说明的是,我们获得具体某一项敏感权限并不代表我们必然会收集你的相关信息;即使我们已经获得敏感权限,也仅在必要范围内,并在你使用相关的服务或功能期间根据本指引来收集你的相关信息。</p>
<p>如你想了解更加详尽的信息,请阅读相应章节:</p>
<p><a href="javascript:void(0)">1. 我们收集、使用的信息</a></p>
<p><a href="javascript:void(0)">2. 信息的存储</a></p>
<p><a href="javascript:void(0)">3. 信息安全</a></p>
<p><a href="javascript:void(0)">4. 信息共享</a></p>
<p><a href="javascript:void(0)">5. 您的权利</a></p>
<p><a href="javascript:void(0)">6. 变更</a></p>
<p><a href="javascript:void(0)">7. 未成年人保护</a></p>
<p><a href="javascript:void(0)">8. 联系我们</a></p>
<h4>1. 我们收集、使用的信息</h4>
<h4>在你使用移动办公的过程中,我们会按照如下方式收集、使用你在使用服务时主动提供或因为使用服务而产生的信息:</h4>
<p>1.1 为保障你正常使用我们的服务维护我们服务的正常运行改进及优化我们的服务体验以及保障你的账号安全我们会收集、使用你的设备型号、操作系统、唯一设备标识符Android端如Android ID/OAID,
iOS端如iOS14.5之前的IDFA、登录IP地址、软件版本号、接入网络的方式、类型和状态、网络质量数据、操作日志、服务日志信息等日志信息。</p>
<p>1.2 为了保证账号安全,我们会保存你的手机号码,以便在第一次登录移动办公时,会发送校验短信。拒绝提供该信息会影响移动办公的正常使用。</p>
<p>1.3
为了方便您在移动端处理各系统待办我们会从其他系统包括但是不限于考勤、RAMM、安防管理等获取用户的待办、待阅、公告等数据并集中在移动办公展示或处理。在此过程中移动办公仅对获取的数据进行格式转换并显示并不会保存待办本身的数据。</p>
<p>1.4 当你使用工作票、操作票、巡检、到位管理等功能时,我们会在获得你的自主选择同意后,记录你的位置信息 ,目的是为了向你提供该服务。拒绝提供该信息仅会使你无法使用上述功能,但不影响你正常使用移动办公的其他功能。</p>
<h4>2. 信息的存储</h4>
<h4>2.1 信息存储的地点</h4>
<p>我们会按照法律法规规定,将境内收集的用户个人信息存储于中国境内。</p>
<h4>2.2 信息存储的期限</h4>
<p>一般而言,我们仅在为实现目的所必需的时间及法律、行政法规所规定的保存期限内保留你的个人信息,例如:</p>
<p>手机号码:为了保证账号安全,我们需要一直保存你的手机号码(包括与设备的绑定信息),以保证你正常使用该服务。当你因离职注销移动办公账号后,我们将依法删除相应的信息;</p>
<p>
当我们的产品或服务发生停止运营的情形时,我们将以推送通知、公告等形式通知你,并在合理的期限内删除你的个人信息或进行匿名化处理。(本指引中的“匿名化处理”,是指通过对个人信息的技术处理,使得个人信息主体无法被识别,且处理后的信息不能被复原的过程。个人信息经匿名化处理后所得的信息不属于个人信息。)</p>
<h4>3. 信息安全</h4>
<p>我们努力为用户的信息安全提供保障,以防止信息的丢失、不当使用、篡改、未经授权访问或披露。</p>
<p>我们将在合理的安全水平内使用各种安全保护措施以保障信息的安全。例如我们会使用加密技术例如SSL、去标识化、匿名化处理等手段来保护你的个人信息。</p>
<p>
我们通过不断提升的技术手段加强安装在你设备端的软件的安全能力以防止你的个人信息泄露。例如我们为了安全传输会在你设备本地完成部分信息加密的工作为了预防盗号、仿冒他人等不法行为和进行安全检查可能会分析利用唯一设备标识符、登录IP地址、操作日志、位置信息等数据以便于采取安全措施或进行安全提醒等。</p>
<p>我们建立专门的管理制度、操作规程和组织以保障信息的安全。例如,我们严格限制访问信息的人员范围,要求他们遵守保密义务,并进行审计。</p>
<p>若发生个人信息泄露等安全事件,我们会启动应急预案及补救措施,阻止安全事件扩大,并依法履行相关的报告及通知义务。</p>
<p>目前,移动办公通过了国家网络安全等级保护(二级)的定级、备案及年度测评。</p>
<p>我们会尽力保护你的个人信息。 我们也请你理解,任何安全措施都无法做到无懈可击。</p>
<p>我们会尽力保护你的个人信息。 我们也请你理解,任何安全措施都无法做到无懈可击。</p>
<h4>4. 信息共享</h4>
<p>4.1 我们不会向合作伙伴分享可用于识别你个人身份的信息,除非你明确授权。</p>
<p>4.2 为确保部分独立功能的实现使你能够使用和享受更多的服务及功能我们会在应用中嵌入第三方的SDK我们将审慎评估该等SDK的使用目的。了解更多有关SDK处理个人信息的目的、方式及范围等信息请查看《第三方信息共享清单》。</p>
<h4>5. 您的权利</h4>
<h4>在你使用移动办公期间,为了你可以更加便捷地查阅、复制、更正你的个人信息,我们在产品设计中为你提供了相应的操作设置,你可以参考下面的指引进行操作。此外,我们还设置了投诉举报、请求解释的渠道,你的意见及请求将会得到及时的处理。</h4>
<p>5.1 查阅、复制个人信息</p>
<h5>1进入或者返回移动办公首页</h5>
<h5>2点击底栏“通讯录”图标</h5>
<h5>3在搜索栏中搜索用户姓名或在下方组织机构树中找到对应用户。</h5>
<p>5.2查阅《个人信息收集清单》</p>
<h5>1进入或者返回移动办公首页</h5>
<h5>2点击底栏“我的”图标</h5>
<h5>3点击“关于移动办公”</h5>
<h5>4点击“个人信息收集清单”。</h5>
<p>5.3 查阅《第三方信息共享清单》</p>
<h5>1进入或者返回移动办公首页</h5>
<h5>2点击底栏“我的”图标</h5>
<h5>3点击“关于移动办公”</h5>
<h5>4点击“第三方信息共享清单”。</h5>
<p>5.4 修改个人信息</p>
<p>目前移动办公的人员数据来自公司相关系统,如需修改个人信息,请联系公司系统管理员。</p>
<h4>6. 变更</h4>
<p>我们可能会适时对本指引进行修订。当指引的条款发生重大变更时,我们会在你登录及版本更新时以推送通知、弹窗或其他符合法律要求的适当形式向你展示变更后的指引。</p>
<h4>7. 未成年人保护</h4>
<p>珠电e办公的定位是面向珠海经济特区广珠发电有限责任公司的办公应用只支持通过人员同步或者管理员后台添加的方式注册账号因此18周岁以下的未成年人无法使用移动办公以及相关服务。</p>
<h4>8. 联系我们</h4>
<p>我们设立了专门的个人信息保护团队和个人信息保护负责人,如果你对本隐私政策或个人信息保护相关事宜有任何疑问或投诉、建议时,你可以通过以下任一方式与我们联系:</p>
<h5>1将你的问题发送至chenjianbiao@gdyd.com</h5>
<h5>2寄到如下地址广东省珠海市金湾区电厂北路185号邮编519050</h5>
<p>我们将尽快审核所涉问题,并在收到你的投诉反馈后的十五天内予以回复。</p>
</body>
</html>
Loading…
Cancel
Save