提交 e33b846a authored 作者: jianglw's avatar jianglw

修改部分功能

上级 36bb9350
package com.ruoyi;
import com.ruoyi.framework.datasource.annotation.EnableDynamicDataSource;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
......@@ -10,6 +11,7 @@ import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
* @author ruoyi
*/
@SpringBootApplication(exclude = { DataSourceAutoConfiguration.class })
@EnableDynamicDataSource
public class RuoYiApplication
{
public static void main(String[] args)
......
package com.ruoyi.web.controller.topology;
import com.ruoyi.common.config.RuoYiConfig;
import com.ruoyi.common.constant.Constants;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.utils.file.FileUploadUtils;
import com.ruoyi.topology.service.IimagesService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import java.io.IOException;
/**
* @author jianglw
* @version 1.0
* @date 2021/6/17 8:51
*/
@RestController
@Slf4j
@RequestMapping("/images")
public class ImagesController {
@Autowired
private IimagesService iimagesService;
/**
* 上传图片
* @param file
* @return
* @throws IOException
*/
@RequestMapping("/upload")
public AjaxResult upload(@RequestParam("imgFile") MultipartFile file) throws IOException {
if (!file.isEmpty()) {
String img = FileUploadUtils.upload( RuoYiConfig.getProfile()+ Constants.IMG_PATH, file);
if(iimagesService.addImages( img )>0){
return AjaxResult.success();
}
}
return AjaxResult.error("图片不存在,请检查文件是否正确");
}
/**
* 获取图片
* @return
*/
@RequestMapping("/list")
public AjaxResult list(){
return AjaxResult.success(iimagesService.getImages());
}
/**
* 删除图片
* @param id
* @return
*/
@DeleteMapping("/delete/{id}")
public AjaxResult delete(@PathVariable("id") Integer id){
if(iimagesService.deleteImages( id )>0){
return AjaxResult.success();
}
return AjaxResult.error("删除图片失败");
}
}
......@@ -106,14 +106,16 @@ public class IndexController extends BaseController {
stringRedisTemplate.opsForValue().set( Constants.TOPOLOGY_DATA+id,jsonObject.toJSONString() );
return AjaxResult.success();
}
@GetMapping("/test")
public void test() throws IOException {
@PostMapping("/test")
public void test(@RequestBody String data) throws IOException {
System.out.println(data);
// JSONObject jsonObject= JSON.parseObject( "{\n" +
// " tag: 'numA', //tag节点\n" +
// " fontColor: 'red', //数据颜色\n" +
// " text: 'test', //文本内容\n" +
// " }" );
// webSocketServer.sendInfo(jsonObject.toJSONString() ,"1" );
iTopologyService.ces();
System.out.println("他请求成功了");
}
}
package com.ruoyi.web.controller.topology;
import com.alibaba.fastjson.JSONObject;
import com.ruoyi.common.constant.Constants;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.utils.sign.RsaUtils;
import com.ruoyi.framework.publicinter.PublicInterface;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
/**
* 组态公共调用方法
......@@ -19,32 +19,27 @@ import org.springframework.web.bind.annotation.*;
@RequestMapping("/params")
@Slf4j
public class ParamsController {
@Autowired
private StringRedisTemplate stringRedisTemplate;
private PublicInterface publicInterface;
/**
*
* @param id
* @param tag
* @param fun
* @param setterTag
* @param setteeTag
* @return
*/
@GetMapping("/show")
public AjaxResult show(@RequestParam(value = "id") String id,
@RequestParam(value = "tag") String tag,
@RequestParam(value = "fun") String fun){
Integer ids;
@RequestParam(value = "setterTag") String setterTag,
@RequestParam(value = "setteeTag") String setteeTag) {
try {
ids= Integer.parseInt( RsaUtils.encryptByPrivateKey( id ) );
return publicInterface.publicMethod( id,setterTag,setteeTag );
} catch (Exception e) {
log.error(e.getLocalizedMessage());
e.printStackTrace();
return AjaxResult.error("id解析失败");
}
String value=stringRedisTemplate.opsForValue().get( Constants.TOPOLOGY_DATA+ids );
JSONObject jsonObject=JSONObject.parseObject( value );
JSONObject topologyHandle =jsonObject.getJSONObject( "topologyHandle" );
Integer dataAcquisition =topologyHandle.getInteger( "dataAcquisitionMode" );
return AjaxResult.success();
return AjaxResult.error();
}
}
# 数据源配置
spring:
autoconfigure:
#自动化配置 例外处理
exclude: com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure
datasource:
type: com.alibaba.druid.pool.DruidDataSource
dynamic:
datasource:
# 主库数据源
master:
url: jdbc:mysql://localhost:3306/ry-vue?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
username: root
password: root
driverClassName: com.mysql.cj.jdbc.Driver
# 从库数据源
slave:
# 从数据源开关/默认关闭
enabled: false
url:
username:
password:
driverClassName:
# 从库数据源
mysql:
# 从数据源开关/默认关闭
enabled: true
url: jdbc:mysql://localhost:3306/d5000?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
username: root
password: root
driverClassName: com.mysql.cj.jdbc.Driver
oracle:
# 从数据源开关/默认关闭
enabled: true
url: jdbc:oracle:thin:@221.180.252.34:1521:xe
username: scott
password: scott
driverClassName: oracle.jdbc.driver.OracleDriver
druid:
# 初始连接数
initialSize: 5
# 最小连接池数量
minIdle: 10
# 最大连接池数量
maxActive: 20
# 配置获取连接等待超时的时间
maxWait: 60000
# 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
timeBetweenEvictionRunsMillis: 60000
# 配置一个连接在池中最小生存的时间,单位是毫秒
minEvictableIdleTimeMillis: 300000
# 配置一个连接在池中最大生存的时间,单位是毫秒
maxEvictableIdleTimeMillis: 900000
# 配置检测连接是否有效
validationQuery: SELECT 1 FROM DUAL
testWhileIdle: true
testOnBorrow: false
testOnReturn: false
webStatFilter:
enabled: true
statViewServlet:
enabled: true
# 设置白名单,不填则允许所有访问
allow:
url-pattern: /druid/*
# 控制台管理用户名和密码
login-username:
login-password:
filter:
stat:
enabled: true
# 慢SQL记录
log-slow-sql: true
slow-sql-millis: 1000
merge-sql: true
wall:
config:
multi-statement-allow: true
\ No newline at end of file
......@@ -35,7 +35,10 @@ logging:
level:
com.ruoyi: debug
org.springframework: warn
#加密
jasypt:
encryptor:
password: hrhx
# Spring配置
spring:
# 资源信息
......@@ -100,7 +103,7 @@ token:
expireTime: 10080
# MyBatis配置
mybatis:
mybatis-plus:
# 搜索指定包别名
typeAliasesPackage: com.ruoyi.**.domain
# 配置mapper的扫描,找到所有的mapper.xml映射文件
......
......@@ -140,6 +140,28 @@
<artifactId>influxdb-client-java</artifactId>
<version>1.8.0</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-jexl3</artifactId>
<version>3.1</version>
</dependency>
<!-- mybatis-plus-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.4.2</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>dynamic-datasource-spring-boot-starter</artifactId>
<version>3.3.6</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.jasypt/jasypt -->
<dependency>
<groupId>com.github.ulisesbocchio</groupId>
<artifactId>jasypt-spring-boot-starter</artifactId>
<version>2.1.0</version>
</dependency>
</dependencies>
<repositories>
<repository>
......
......@@ -126,6 +126,10 @@ public class Constants
* 资源映射路径 前缀
*/
public static final String RESOURCE_PREFIX = "/profile";
/**
* 组态数据前缀
*/
public static final String TOPOLOGY_DATA="topology_data:";
public static final String IMG_PATH="/img";
}
package com.ruoyi.common.core.domain.topology;
/**
* @author jianglw
* @version 1.0
* @date 2021/6/17 10:04
*/
public class Image {
private Integer id;
private String url;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
}
......@@ -3,6 +3,7 @@ package com.ruoyi.common.topology.change;
import java.util.Map;
/**
* 将数据赋值给组态各节点参数
* @author jianglw
* @version 1.0
* @date 2021/6/1 17:38
......
......@@ -3,6 +3,7 @@ package com.ruoyi.common.topology.change;
import java.util.List;
/**
* 改变参数
* @author jianglw
* @version 1.0
* @date 2021/4/16 10:28
......
......@@ -3,6 +3,7 @@ package com.ruoyi.common.topology.change;
import java.util.List;
/**
* 赋值处理类
* @author jianglw
* @version 1.0
* @date 2021/4/10 11:09
......
package com.ruoyi.common.topology.change;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.ruoyi.common.constant.Constants;
import com.ruoyi.common.enums.NodeLineParams;
import com.ruoyi.common.topology.handletype.NodeLineParamsInt;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.spring.SpringUtils;
import org.springframework.data.redis.core.StringRedisTemplate;
import java.util.HashMap;
import java.util.LinkedList;
......@@ -15,37 +20,51 @@ import java.util.Map;
* @date 2021/4/26 9:41
*/
public class PointAndData {
/**
* 组装数据
* @param map
* @param jsonArray
* @param id
* @return
*/
public static List<Map<String,Object>> assemble(Map<String,Object> map, JSONArray jsonArray){
public static List<Map<String,Object>> assemble(Map<String,Object> map, JSONArray jsonArray,String id){
List<ChangeSub> list=jsonArray.toJavaList( ChangeSub.class );
List<Map<String,Object>> list1=new LinkedList<>( );
for(ChangeSub changeSub:list){
List<Handle> handleList=changeSub.getHandle();
list1.add( handle( map,handleList,changeSub.getTag(),changeSub.getEcharts() ) );
list1.add( handle( map,handleList,changeSub.getTag(),changeSub.getEcharts(),id ) );
}
return list1;
}
private static Map<String, Object> handle(Map<String,Object> map, List<Handle> list, String tag,String echarts){
/**
*
* @param map
* @param list
* @param tag
* @param echarts
* @param id
* @return
*/
private static Map<String, Object> handle(Map<String,Object> map, List<Handle> list, String tag,String echarts,String id){
//存储map
Map<String, Object> map1 =new HashMap<>( );
Map<String, Object> map2=null;
List<Map<String, Object>> list1=null;
for(Handle handle:list){
NodeLineParamsInt nodeLineParamsInt= NodeLineParams.match( handle.getType() );
nodeLineParamsInt.getDataToParams( handle,map,map1,echarts );
// if(handle.getType().equals( "do" )){
// map2=new HashMap<>( );
// list1=new LinkedList<>( );
// map2.put( handle.getType(),AssembleData.getData( handle,map) );
// list1.add( map2 );
// map1.put( "actions", list1);
// }else{
// map1.put( handle.getType(),AssembleData.getData(handle,map) );
// }
nodeLineParamsInt.getDataToParams( handle,map,map1,echarts,id );
}
if(StringUtils.isNotBlank( echarts )){
StringRedisTemplate stringRedisTemplate=SpringUtils.getBean( StringRedisTemplate.class );
JSONObject jsonObject2=JSONObject.parseObject(stringRedisTemplate.opsForValue().get( Constants.TOPOLOGY_DATA+id ));
JSONArray change=jsonObject2.getJSONObject( "topologyHandle" ).getJSONArray( "change" );
for(int i=0;i<change.size();i++){
if(tag.equals( change.getJSONObject(i).getString( "tag" ) )){
change.getJSONObject(i).put( "echarts",JSONObject.parseObject( map1.get( "data" ).toString() ).get( "echarts" ) );
}
}
jsonObject2.getJSONObject( "topologyHandle" ).put( "change",change );
stringRedisTemplate.opsForValue().set( Constants.TOPOLOGY_DATA+id,jsonObject2.toJSONString() );
}
map1.put( "tag", tag);
return map1;
......
package com.ruoyi.common.topology.handletype;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.ruoyi.common.constant.Constants;
import com.ruoyi.common.topology.change.AssembleData;
import com.ruoyi.common.topology.change.EchartsSet;
import com.ruoyi.common.topology.change.Handle;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.spring.SpringUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.data.redis.core.StringRedisTemplate;
import java.util.HashMap;
import java.util.LinkedList;
......@@ -16,63 +18,81 @@ import java.util.Map;
/**
* 组装echarts数据
*
* @author jianglw
* @version 1.0
* @date 2021/6/1 17:26
*/
@Slf4j
public class DataParam implements NodeLineParamsInt{
public class DataParam implements NodeLineParamsInt {
@Override
public void getDataToParams(Handle handle, Map<String, Object> map, Map<String, Object> map1, String echarts) {
public void getDataToParams(Handle handle, Map<String, Object> map, Map<String, Object> map1, String echarts,String id) {
//判断是否为自定义图表
if(!handle.getCustomChart()){
map1.put( handle.getType(), AssembleData.getData( handle,map));
}else{
if(StringUtils.isNotBlank( echarts )){
JSONObject jsonObject=JSONObject.parseObject( echarts );
JSONObject jsonObject1=JSONObject.parseObject( echarts ).getJSONObject( "option" );
jsonObject1.getJSONObject( "title" ).put( "text",handle.getTitle() );
List<String> list=new LinkedList<>();
List<String> xList=new LinkedList<>();
List<Map<String,Object>> seriesList=new LinkedList<>();
Map<String,Object> map2=null;
for(EchartsSet echartsSet:handle.getEchartsArray()){
if(echartsSet.getAxis().equals( "yAxis" )){
map2=new HashMap<>();
map2.put( "name",echartsSet.getName() );
map2.put( "type" ,echartsSet.getSeriesType());
map2.put( "data",map.get( echartsSet.getPoint() )+"" );
if (!handle.getCustomChart()) {
map1.put( handle.getType(), AssembleData.getData( handle, map ) );
} else {
if (StringUtils.isNotBlank( echarts )) {
JSONObject jsonObject = JSONObject.parseObject( echarts );
JSONObject jsonObject1 = JSONObject.parseObject( echarts ).getJSONObject( "option" );
//组合title
jsonObject1.getJSONObject( "title" ).put( "text", handle.getTitle() );
List<String> list = new LinkedList<>();
List<String> xList = new LinkedList<>();
List<Map<String, Object>> seriesList = new LinkedList<>();
Map<String, Object> map2 = null;
//组合y轴及x轴
for (EchartsSet echartsSet : handle.getEchartsArray()) {
if (echartsSet.getAxis().equals( "yAxis" )) {
map2 = new HashMap<>();
map2.put( "name", echartsSet.getName() );
map2.put( "type", echartsSet.getSeriesType() );
map2.put( "data", map.get( echartsSet.getPoint() ) + "" );
seriesList.add( map2 );
list.add( echartsSet.getName() );
}
if(echartsSet.getAxis().equals( "xAxis" )){
xList.add( map.get( echartsSet.getPoint() )+"" );
if (echartsSet.getAxis().equals( "xAxis" )) {
xList.add( map.get( echartsSet.getPoint() ) + "" );
}
}
JSONArray jsonArray=jsonObject1.getJSONArray( "series" );
if(jsonArray.size()==seriesList.size()){
for(int i=0;i<jsonArray.size();i++){
for(Map<String,Object> m:seriesList){
if(jsonArray.getJSONObject( i ).getString( "name" ).equals( m.get( "name" ) )){
JSONObject jsonObject2=jsonArray.getJSONObject( i );
jsonObject2=JSONObject.parseObject( JSON.toJSONString( m ) );
}
//组合y轴数据series
JSONArray jsonArray = jsonObject1.getJSONArray( "series" );
// if(jsonArray.size()==seriesList.size()){
for (Map<String, Object> m : seriesList) {
for (int i = 0; i < jsonArray.size(); i++) {
JSONObject jsonObject2 = jsonArray.getJSONObject( i );
if (m.get( "name" ).equals( jsonArray.getJSONObject( i ).getString( "name" ) )) {
jsonObject2.getJSONArray( "data" ).add( m.get( "data" ) );
}else{
jsonObject2.put( "name",m.get( "name" ) );
List<Object> list1=new LinkedList<>();
list1.add( m.get( "data" ) );
jsonObject2.put( "data", list1);
}
}
}else{
jsonArray=JSONArray.parseArray( JSON.toJSONString( seriesList ) );
}
jsonObject1.getJSONObject( "xAxis" ).put( "data",xList );
jsonObject1.getJSONObject( "legend" ).put( "data",list );
map1.put( "data", jsonObject.toJSONString());
}else{
log.debug( "未获取到组态中的图表信息");
if (jsonObject1.containsKey( "legend" )) {
jsonObject1.getJSONObject( "legend" ).put( "data", list );
jsonObject1.getJSONObject( "xAxis" ).getJSONArray( "data" ).add( xList.get( 0 ) );
} else {
jsonObject1.put( "legend", new JSONObject() );
jsonObject1.getJSONObject( "legend" ).put( "data", list );
jsonObject1.getJSONObject( "xAxis" ).put( "data", xList );
}
jsonObject1.put( "series",jsonArray );
jsonObject.put( "option",jsonObject1 );
JSONObject newEcharts=new JSONObject();
newEcharts.put( "echarts",jsonObject );
map1.put( "data", newEcharts.toJSONString() );
} else {
log.debug( "未获取到组态中的图表信息" );
}
}
//echarts 在canvas上刷新使用
map1.put( "elementRendered", false);
map1.put( "elementRendered", false );
}
}
......@@ -2,6 +2,7 @@ package com.ruoyi.common.topology.handletype;
import com.ruoyi.common.topology.change.AssembleData;
import com.ruoyi.common.topology.change.Handle;
import com.ruoyi.common.utils.StringUtils;
import java.util.Map;
......@@ -13,7 +14,12 @@ import java.util.Map;
public class DefaultParam implements NodeLineParamsInt{
@Override
public void getDataToParams(Handle handle, Map<String, Object> map, Map<String, Object> map1, String echarts) {
map1.put( handle.getType(), AssembleData.getData(handle,map) );
public void getDataToParams(Handle handle, Map<String, Object> map, Map<String, Object> map1, String echarts,String id) {
Object o=AssembleData.getData(handle,map);
if(o!=null){
if(StringUtils.isNotBlank( o.toString() )){
map1.put( handle.getType(), o );
}
}
}
}
......@@ -2,6 +2,7 @@ package com.ruoyi.common.topology.handletype;
import com.ruoyi.common.topology.change.AssembleData;
import com.ruoyi.common.topology.change.Handle;
import com.ruoyi.common.utils.StringUtils;
import java.util.HashMap;
import java.util.LinkedList;
......@@ -9,6 +10,7 @@ import java.util.List;
import java.util.Map;
/**
* 组装动画类
* @author jianglw
* @version 1.0
* @date 2021/6/1 17:26
......@@ -16,11 +18,16 @@ import java.util.Map;
public class DoParam implements NodeLineParamsInt{
@Override
public void getDataToParams(Handle handle, Map<String, Object> map, Map<String, Object> map1, String echarts) {
Map<String,Object> map2=new HashMap<>( );
List<Map<String, Object>> list1=new LinkedList<>( );
map2.put( handle.getType(), AssembleData.getData( handle,map) );
list1.add( map2 );
map1.put( "actions", list1);
public void getDataToParams(Handle handle, Map<String, Object> map, Map<String, Object> map1, String echarts,String id) {
Object o=AssembleData.getData( handle,map);
if(o!=null){
if(StringUtils.isNotBlank( o.toString() )){
Map<String,Object> map2=new HashMap<>( );
List<Map<String, Object>> list1=new LinkedList<>( );
map2.put( handle.getType(), o );
list1.add( map2 );
map1.put( "actions", list1);
}
}
}
}
......@@ -5,10 +5,19 @@ import com.ruoyi.common.topology.change.Handle;
import java.util.Map;
/**
* node line 参数赋值接口
* @author jianglw
* @version 1.0
* @date 2021/6/1 17:17
*/
public interface NodeLineParamsInt {
void getDataToParams(Handle handle, Map<String,Object> map,Map<String,Object> map1,String echarts);
/**
*
* @param handle 处理参数
* @param map 数据
* @param map1 返回值
* @param echarts echarts值
* @param id topology id
*/
void getDataToParams(Handle handle, Map<String,Object> map,Map<String,Object> map1,String echarts,String id);
}
package com.ruoyi.common.topology.mutual;
/**
* 交互接口参数类
* @author jianglw
* @version 1.0
* @date 2021/6/7 17:28
*/
public class Mutual {
private String setter;
private String settee;
private Integer dataAcquisitionMode;
private String condition;
private String point;
private String shareType;
private String assignment;
public String getShareType() {
return shareType;
}
public void setShareType(String shareType) {
this.shareType = shareType;
}
public String getSetter() {
return setter;
}
public void setSetter(String setter) {
this.setter = setter;
}
public String getSettee() {
return settee;
}
public void setSettee(String settee) {
this.settee = settee;
}
public Integer getDataAcquisitionMode() {
return dataAcquisitionMode;
}
public void setDataAcquisitionMode(Integer dataAcquisitionMode) {
this.dataAcquisitionMode = dataAcquisitionMode;
}
public String getCondition() {
return condition;
}
public void setCondition(String condition) {
this.condition = condition;
}
public String getPoint() {
return point;
}
public void setPoint(String point) {
this.point = point;
}
public String getAssignment() {
return assignment;
}
public void setAssignment(String assignment) {
this.assignment = assignment;
}
}
package com.ruoyi.common.utils;
import org.apache.commons.jexl3.JexlBuilder;
import org.apache.commons.jexl3.JexlExpression;
import org.apache.commons.jexl3.MapContext;
/**
* @author jianglw
* @version 1.0
* @date 2021/6/8 10:34
*/
public class JexlUtils {
public static Object math(String exp){
JexlBuilder builder = new JexlBuilder();
JexlExpression expression = builder.create().createExpression(exp);
Object evaluate = expression.evaluate(new MapContext() );
System.out.println("evaluate " + evaluate.toString());
return evaluate;
}
public static void main(String[] args) {
JexlUtils.math( "12.56+33.5" );
}
}
......@@ -17,7 +17,7 @@ public class MimeTypeUtils
public static final String IMAGE_GIF = "image/gif";
public static final String[] IMAGE_EXTENSION = { "bmp", "gif", "jpg", "jpeg", "png" };
public static final String[] IMAGE_EXTENSION = { "bmp", "gif", "jpg", "jpeg", "png","svg" };
public static final String[] FLASH_EXTENSION = { "swf", "flv" };
......@@ -32,7 +32,7 @@ public class MimeTypeUtils
// 压缩文件
"rar", "zip", "gz", "bz2",
// pdf
"pdf" };
"pdf","svg" };
public static String getExtension(String prefix)
{
......
package com.ruoyi.framework.config;
import com.ruoyi.common.exception.user.UserPasswordNotMatchException;
import com.ruoyi.framework.web.service.UserDetailsServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.authentication.AuthenticationProvider;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.AuthenticationException;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.stereotype.Component;
@Component
public class MyAuthenticationProvider implements AuthenticationProvider {
@Autowired
private UserDetailsServiceImpl userDetailsService;
@Autowired
private BCryptPasswordEncoder bCryptPasswordEncoder;
@Override
public Authentication authenticate(Authentication authentication) throws AuthenticationException,UserPasswordNotMatchException {
String name=authentication.getName();
String password=(String)authentication.getCredentials();
UserDetails user=userDetailsService.loadUserByUsername(name);
String encoderPassword=bCryptPasswordEncoder.encode(password);
//查找出账号 想用数据库的校验能通过就通过
if (bCryptPasswordEncoder.matches(password,user.getPassword())){
return new UsernamePasswordAuthenticationToken(name, encoderPassword);
}
int checkLogin=checkLogin(name,password);//外部的账号密码验证接口
if(checkLogin==2){
return new UsernamePasswordAuthenticationToken(name, password);
}else {
//如果都登录不了,就返回异常输出
throw new UserPasswordNotMatchException();
}
}
@Override
public boolean supports(Class<?> aClass) {
return false;
}
/**
* 内网 验证账号密码
* @param userName
* @param pwd
* @return 2 op账号密码验证通过,3 验证不通过
*/
public static int checkLogin(String userName, String pwd) {
if(userName.equals(pwd)){
return 2;
}
return 3;
}
}
\ No newline at end of file
......@@ -29,7 +29,7 @@ import com.ruoyi.common.utils.StringUtils;
*
* @author ruoyi
*/
@Configuration
//@Configuration
public class MyBatisConfig
{
@Autowired
......
package com.ruoyi.framework.config;
import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.BlockAttackInnerInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.OptimisticLockerInnerInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import com.ruoyi.framework.config.resolver.SqlFilterArgumentResolver;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import java.util.List;
/**
* @author jianglw
* @version 1.0
* @date 2021/6/23 11:14
*/
@EnableTransactionManagement(proxyTargetClass = true)
@Configuration(proxyBeanMethods = false)
public class MybatisPlusConfig {
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
// 分页插件
interceptor.addInnerInterceptor( paginationInnerInterceptor() );
// 乐观锁插件
interceptor.addInnerInterceptor( optimisticLockerInnerInterceptor() );
// 阻断插件
interceptor.addInnerInterceptor( blockAttackInnerInterceptor() );
return interceptor;
}
/**
* 分页插件,自动识别数据库类型 https://baomidou.com/guide/interceptor-pagination.html
*/
public PaginationInnerInterceptor paginationInnerInterceptor() {
PaginationInnerInterceptor paginationInnerInterceptor = new PaginationInnerInterceptor();
// 设置数据库类型为mysql
paginationInnerInterceptor.setDbType( DbType.MYSQL );
// 设置最大单页限制数量,默认 500 条,-1 不受限制
paginationInnerInterceptor.setMaxLimit( -1L );
return paginationInnerInterceptor;
}
/**
* 乐观锁插件 https://baomidou.com/guide/interceptor-optimistic-locker.html
*/
public OptimisticLockerInnerInterceptor optimisticLockerInnerInterceptor() {
return new OptimisticLockerInnerInterceptor();
}
/**
* 如果是对全表的删除或更新操作,就会终止该操作 https://baomidou.com/guide/interceptor-block-attack.html
*/
public BlockAttackInnerInterceptor blockAttackInnerInterceptor() {
return new BlockAttackInnerInterceptor();
}
}
package com.ruoyi.framework.config;
import com.ruoyi.framework.config.resolver.SqlFilterArgumentResolver;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
import org.springframework.web.filter.CorsFilter;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
......@@ -13,6 +15,8 @@ import com.ruoyi.common.config.RuoYiConfig;
import com.ruoyi.common.constant.Constants;
import com.ruoyi.framework.interceptor.RepeatSubmitInterceptor;
import java.util.List;
/**
* 通用配置
*
......@@ -23,7 +27,14 @@ public class ResourcesConfig implements WebMvcConfigurer
{
@Autowired
private RepeatSubmitInterceptor repeatSubmitInterceptor;
/**
* SQL 过滤器避免SQL 注入
* @param argumentResolvers
*/
@Override
public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
argumentResolvers.add(new SqlFilterArgumentResolver());
}
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry)
{
......
package com.ruoyi.framework.config.resolver;
import com.baomidou.mybatisplus.core.metadata.OrderItem;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.common.utils.StringUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.core.MethodParameter;
import org.springframework.web.bind.support.WebDataBinderFactory;
import org.springframework.web.context.request.NativeWebRequest;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.method.support.ModelAndViewContainer;
import javax.servlet.http.HttpServletRequest;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Optional;
import java.util.function.Predicate;
import java.util.stream.Collectors;
/**
* @author lengleng
* @date 2019-06-24
* <p>
* 解决Mybatis Plus Order By SQL注入问题
*/
@Slf4j
public class SqlFilterArgumentResolver implements HandlerMethodArgumentResolver {
private final static String[] KEYWORDS = { "master", "truncate", "insert", "select", "delete", "update", "declare",
"alter", "drop", "sleep" };
/**
* 判断Controller是否包含page 参数
* @param parameter 参数
* @return 是否过滤
*/
@Override
public boolean supportsParameter(MethodParameter parameter) {
return parameter.getParameterType().equals(Page.class);
}
/**
* @param parameter 入参集合
* @param mavContainer model 和 view
* @param webRequest web相关
* @param binderFactory 入参解析
* @return 检查后新的page对象
* <p>
* page 只支持查询 GET .如需解析POST获取请求报文体处理
*/
@Override
public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer,
NativeWebRequest webRequest, WebDataBinderFactory binderFactory) {
HttpServletRequest request = webRequest.getNativeRequest(HttpServletRequest.class);
String[] ascs = request.getParameterValues("ascs");
String[] descs = request.getParameterValues("descs");
String current = request.getParameter("current");
String size = request.getParameter("size");
Page<?> page = new Page<>();
if (StringUtils.isNotBlank(current)) {
page.setCurrent(Long.parseLong(current));
}
if (StringUtils.isNotBlank(size)) {
page.setSize(Long.parseLong(size));
}
List<OrderItem> orderItemList = new ArrayList<>();
Optional.ofNullable(ascs).ifPresent(s -> orderItemList.addAll(
Arrays.stream(s).filter(sqlInjectPredicate()).map(OrderItem::asc).collect(Collectors.toList())));
Optional.ofNullable(descs).ifPresent(s -> orderItemList.addAll(
Arrays.stream(s).filter(sqlInjectPredicate()).map(OrderItem::desc).collect(Collectors.toList())));
page.addOrder(orderItemList);
return page;
}
/**
* 判断用户输入里面有没有关键字
* @return Predicate
*/
private Predicate<String> sqlInjectPredicate() {
return sql -> {
for (String keyword : KEYWORDS) {
if (StringUtils.containsIgnoreCase(sql, keyword)) {
return false;
}
}
return true;
};
}
}
/*
* Copyright (c) 2020 pig4cloud Authors. All Rights Reserved.
*
* Licensed 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
*
* 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.ruoyi.framework.datasource;
import com.baomidou.dynamic.datasource.processor.DsProcessor;
import com.baomidou.dynamic.datasource.provider.DynamicDataSourceProvider;
import com.ruoyi.framework.datasource.config.DataSourceProperties;
import com.ruoyi.framework.datasource.config.JdbcDynamicDataSourceProvider;
import com.ruoyi.framework.datasource.config.LastParamDsProcessor;
import org.jasypt.encryption.StringEncryptor;
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* @author lengleng
* @date 2020-02-06
* <p>
* 动态数据源切换配置
*/
//@Configuration(proxyBeanMethods = false)
//@AutoConfigureAfter(DataSourceAutoConfiguration.class)
//@EnableConfigurationProperties(DataSourceProperties.class)
public class DynamicDataSourceAutoConfiguration {
// @Bean
// public DynamicDataSourceProvider dynamicDataSourceProvider(StringEncryptor stringEncryptor,
// DataSourceProperties properties) {
// return new JdbcDynamicDataSourceProvider(stringEncryptor, properties);
// }
@Bean
public DsProcessor dsProcessor() {
return new LastParamDsProcessor();
}
}
/*
* Copyright (c) 2020 pig4cloud Authors. All Rights Reserved.
*
* Licensed 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
*
* 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.ruoyi.framework.datasource.annotation;
import com.ruoyi.framework.datasource.DynamicDataSourceAutoConfiguration;
import org.springframework.context.annotation.Import;
import java.lang.annotation.*;
/**
* @author Lucky
* @date 2019-05-18
* <p>
* 开启动态数据源
*/
@Target({ ElementType.TYPE })
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@Import(DynamicDataSourceAutoConfiguration.class)
public @interface EnableDynamicDataSource {
}
/*
* Copyright (c) 2020 pig4cloud Authors. All Rights Reserved.
*
* Licensed 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
*
* 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.ruoyi.framework.datasource.config;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
/**
* @author lengleng
* @date 2019-05-14
* <p>
*/
@Data
//@ConfigurationProperties("spring.datasource.dynamic.datasource.master")
public class DataSourceProperties {
/**
* 用户名
*/
private String username;
/**
* 密码
*/
private String password;
/**
* jdbcurl
*/
private String url;
/**
* 驱动类型
*/
private String driverClassName;
/**
* 查询数据源的SQL
*/
private String queryDsSql = "select * from gen_datasource_conf where del_flag = 0";
}
/*
* Copyright (c) 2020 pig4cloud Authors. All Rights Reserved.
*
* Licensed 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
*
* 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.ruoyi.framework.datasource.config;
import com.baomidou.dynamic.datasource.provider.AbstractJdbcDataSourceProvider;
import com.baomidou.dynamic.datasource.spring.boot.autoconfigure.DataSourceProperty;
import com.ruoyi.common.utils.spring.SpringUtils;
import com.ruoyi.framework.config.properties.DruidProperties;
import com.ruoyi.framework.datasource.support.DataSourceConstants;
import org.jasypt.encryption.StringEncryptor;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.HashMap;
import java.util.Map;
/**
* @author lengleng
* @date 2020/2/6
* <p>
* 从数据源中获取 配置信息
*/
public class JdbcDynamicDataSourceProvider extends AbstractJdbcDataSourceProvider {
private final DataSourceProperties properties;
private final StringEncryptor stringEncryptor;
public JdbcDynamicDataSourceProvider(StringEncryptor stringEncryptor, DataSourceProperties properties) {
super( properties.getDriverClassName(), properties.getUrl(), properties.getUsername(), properties.getPassword() );
this.stringEncryptor = stringEncryptor;
this.properties = properties;
}
/**
* 执行语句获得数据源参数
*
* @param statement 语句
* @return 数据源参数
* @throws SQLException sql异常
*/
@Override
protected Map<String, DataSourceProperty> executeStmt(Statement statement) throws SQLException {
ResultSet rs = statement.executeQuery( properties.getQueryDsSql() );
DruidProperties druidProperties= SpringUtils.getBean( DruidProperties.class );
Map<String, DataSourceProperty> map = new HashMap<>( 8 );
while (rs.next()) {
String name = rs.getString( DataSourceConstants.DS_NAME );
String username = rs.getString( DataSourceConstants.DS_USER_NAME );
String password = rs.getString( DataSourceConstants.DS_USER_PWD );
String url = rs.getString( DataSourceConstants.DS_JDBC_URL );
DataSourceProperty property = new DataSourceProperty();
property.setDriverClassName( DataSourceConstants.DS_DRIVER );
property.setUsername( username );
property.setLazy( true );
property.setPassword( stringEncryptor.decrypt( password ) );
property.setUrl( url );
map.put( name, property );
}
// 添加默认主数据源
DataSourceProperty property = new DataSourceProperty();
property.setUsername( properties.getUsername() );
property.setPassword( properties.getPassword() );
property.setUrl( properties.getUrl() );
property.setLazy( true );
property.setDriverClassName( DataSourceConstants.DS_DRIVER );
map.put( DataSourceConstants.DS_MASTER, property );
return map;
}
}
/*
* Copyright (c) 2020 pig4cloud Authors. All Rights Reserved.
*
* Licensed 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
*
* 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.ruoyi.framework.datasource.config;
import com.baomidou.dynamic.datasource.processor.DsProcessor;
import com.baomidou.dynamic.datasource.toolkit.DynamicDataSourceContextHolder;
import org.aopalliance.intercept.MethodInvocation;
/**
* @author lengleng
* @date 2020/2/6
* <p>
* 参数数据源解析 @DS("#last)
*/
public class LastParamDsProcessor extends DsProcessor {
private static final String LAST_PREFIX = "#last";
/**
* 抽象匹配条件 匹配才会走当前执行器否则走下一级执行器
* @param key DS注解里的内容
* @return 是否匹配
*/
@Override
public boolean matches(String key) {
if (key.startsWith(LAST_PREFIX)) {
return true;
}
return false;
}
/**
* 抽象最终决定数据源
* @param invocation 方法执行信息
* @param key DS注解里的内容
* @return 数据源名称
*/
@Override
public String doDetermineDatasource(MethodInvocation invocation, String key) {
Object[] arguments = invocation.getArguments();
return String.valueOf(arguments[arguments.length - 1]);
}
}
/*
* Copyright (c) 2020 pig4cloud Authors. All Rights Reserved.
*
* Licensed 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
*
* 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.ruoyi.framework.datasource.support;
/**
* @author lengleng
* @date 2019-04-01
* <p>
* 数据源相关常量
*/
public interface DataSourceConstants {
/**
* 数据源名称
*/
String DS_NAME = "name";
/**
* 默认驱动
*/
String DS_DRIVER = "com.mysql.cj.jdbc.Driver";
/**
* 默认数据源(master)
*/
String DS_MASTER = "master";
/**
* jdbcurl
*/
String DS_JDBC_URL = "url";
/**
* 用户名
*/
String DS_USER_NAME = "username";
/**
* 密码
*/
String DS_USER_PWD = "password";
}
package com.ruoyi.framework.publicinter;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.ruoyi.common.constant.Constants;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.topology.mutual.Mutual;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.sign.RsaUtils;
import com.ruoyi.framework.topology.collect.CollectTopologyType;
import com.ruoyi.framework.topology.emnus.CollectTopology;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;
import javax.naming.Name;
/**
* @author jianglw
* @version 1.0
* @date 2021/6/15 14:55
*/
@Component("publicInterface")
@Slf4j
public class PublicInterface {
@Autowired
private StringRedisTemplate stringRedisTemplate;
public AjaxResult publicMethod(String id,String setterTag,String setteeTag) throws Exception{
Integer ids;
try {
ids= Integer.parseInt( RsaUtils.decryptByPrivateKey( id ) );
} catch (Exception e) {
log.error(e.getLocalizedMessage());
e.printStackTrace();
log.error( "id解析失败" );
return AjaxResult.error("id解析失败");
}
String value=stringRedisTemplate.opsForValue().get( Constants.TOPOLOGY_DATA+ids );
if(StringUtils.isNotBlank( value )){
JSONObject jsonObject=JSONObject.parseObject( value );
JSONArray mutualList =jsonObject.getJSONArray( "mutualList" );
for(int i=0;i<mutualList.size();i++){
Mutual mutual=mutualList.getObject( i,Mutual.class );
if(mutual.getSetter().equals( setterTag )&&mutual.getSettee().equals( setteeTag )){
CollectTopologyType collectTopologyType= CollectTopology.match(mutual.getDataAcquisitionMode());
assert collectTopologyType != null;
collectTopologyType.setData( mutual );
}
}
}else{
log.error( "未获取到组态数据" );
return AjaxResult.error("未从redis中获取到组态数据");
}
return AjaxResult.success();
}
}
......@@ -4,11 +4,8 @@ import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.influxdb.client.InfluxDBClient;
import com.influxdb.client.WriteApi;
import com.influxdb.client.domain.FluxResponse;
import com.influxdb.client.domain.WritePrecision;
import com.influxdb.client.write.Point;
import com.influxdb.query.FluxRecord;
import com.influxdb.query.FluxTable;
import com.ruoyi.common.constant.Constants;
import com.ruoyi.common.utils.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
......@@ -19,7 +16,6 @@ import org.springframework.stereotype.Component;
import java.text.DecimalFormat;
import java.time.Instant;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Random;
......@@ -42,7 +38,7 @@ public class RyTask {
Random random = new Random();
DecimalFormat decimalFormat=new DecimalFormat(".00");
DecimalFormat decimalFormat=new DecimalFormat("0.00");
final String str = "total_power,start_power,theory,theory_1,available," +
"a_1,a_2,a_3,a_4,a_5,a_6,a_7,Ua,Ub,Uc,Uab,Ubc,Uca,3U0," +
"p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12,p13,p14,p15,p16,p17," +
......@@ -56,8 +52,8 @@ public class RyTask {
public void ryParams(String params) {
Map<String,Object> map=new LinkedHashMap<>( );
map.put( "tag1",random.nextFloat() );
map.put( "tag2",random.nextFloat() );
map.put( "tag1",random.nextFloat());
map.put( "tag2",random.nextFloat());
Point point = Point
.measurement("mem")
.addFields( map )
......@@ -77,16 +73,33 @@ public class RyTask {
// }
// stringRedisTemplate.opsForValue().set( "gf:data", jsonObject.toJSONString() );
// System.out.println( "执行无参方法" );
JSONObject jsonObject=JSONObject.parseObject( stringRedisTemplate.opsForValue().get( Constants.TOPOLOGY_DATA+"38" ) );
JSONArray jsonArray=jsonObject.getJSONArray( "pens" );
JSONObject jsonObject2=new JSONObject();
// JSONObject jsonObject=JSONObject.parseObject( stringRedisTemplate.opsForValue().get( Constants.TOPOLOGY_DATA+"38" ) );
// JSONArray jsonArray=jsonObject.getJSONArray( "pens" );
// JSONObject jsonObject2=new JSONObject();
// for(int i=0;i<jsonArray.size();i++){
// JSONObject jsonObject1=jsonArray.getJSONObject( i );
// if(jsonObject1.getJSONArray( "tags" ).size()>0 ){
// jsonObject2.put( jsonObject1.getJSONArray( "tags" ).getString( 0 ),random.nextBoolean()?"1":"0" );
// }
// }
// System.out.println(jsonObject2.toJSONString());
// stringRedisTemplate.opsForValue().set( "fd:data", jsonObject2.toJSONString() );
JSONObject jsonObject=JSONObject.parseObject( stringRedisTemplate.opsForValue().get( Constants.TOPOLOGY_DATA+"107" ) );
JSONArray jsonArray=jsonObject.getJSONObject( "topologyHandle" ).getJSONArray( "change" );
JSONObject jsonObjects=new JSONObject();
for(int i=0;i<jsonArray.size();i++){
JSONObject jsonObject1=jsonArray.getJSONObject( i );
if(jsonObject1.getJSONArray( "tags" ).size()>0 ){
jsonObject2.put( jsonObject1.getJSONArray( "tags" ).getString( 0 ),random.nextBoolean()?"1":"0" );
JSONArray jsonArray1=jsonObject1.getJSONArray( "handle" );
if(jsonArray1.size()>0){
if(jsonArray1.getJSONObject( 0 ).getBoolean( "judge" )){
jsonObjects.put( jsonObject1.getString( "tag" ), random.nextBoolean()?"true":"false");
}else{
jsonObjects.put( jsonObject1.getString( "tag" ), decimalFormat.format( random.nextFloat()*10));
}
}
}
System.out.println(jsonObject2.toJSONString());
stringRedisTemplate.opsForValue().set( "fd:data", jsonObject2.toJSONString() );
System.out.println(jsonObjects.toJSONString());
stringRedisTemplate.opsForValue().set( "lei:data", jsonObjects.toJSONString() );
}
}
......@@ -3,7 +3,7 @@ package com.ruoyi.framework.task;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.ruoyi.common.constant.Constants;
import com.ruoyi.common.core.websocket.WebSocketServer;
import com.ruoyi.framework.websocket.WebSocketServer;
import com.ruoyi.framework.topology.emnus.CollectTopology;
import com.ruoyi.common.topology.change.PointAndData;
import com.ruoyi.framework.topology.collect.CollectTopologyType;
......@@ -60,7 +60,7 @@ public class TopologyTask {
/**
* 配置数据
*/
List<Map<String,Object>> list=PointAndData.assemble( stringObjectMap,topologyHandle.getJSONArray( "change" ) );
List<Map<String,Object>> list=PointAndData.assemble( stringObjectMap,topologyHandle.getJSONArray( "change" ),data );
/**
* mqtt与socket
*/
......
package com.ruoyi.framework.topology.collect;
import com.alibaba.fastjson.JSONArray;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.topology.mutual.Mutual;
import java.util.Map;
......@@ -10,5 +12,6 @@ import java.util.Map;
* @date 2021/4/9 9:55
*/
public interface CollectTopologyType {
public Map<String,Object> getData(String param,JSONArray jsonArray);
Map<String,Object> getData(String param,JSONArray jsonArray);
AjaxResult setData(Mutual mutual);
}
......@@ -2,11 +2,17 @@ package com.ruoyi.framework.topology.collect;
import com.alibaba.fastjson.JSONArray;
import com.influxdb.client.InfluxDBClient;
import com.influxdb.client.WriteApi;
import com.influxdb.client.domain.WritePrecision;
import com.influxdb.client.write.Point;
import com.influxdb.query.FluxRecord;
import com.influxdb.query.FluxTable;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.topology.mutual.Mutual;
import com.ruoyi.common.utils.spring.SpringUtils;
import javax.management.Query;
import java.time.Instant;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
......@@ -33,4 +39,22 @@ public class InfluxdbType implements CollectTopologyType {
}
return map1;
}
@Override
public AjaxResult setData(Mutual mutual) {
Map<String,Object> map=new LinkedHashMap<>( );
if(mutual.getAssignment().contains( "=" )){
map.put( mutual.getPoint(),mutual.getAssignment().replaceAll( "=","" ) );
}else{
}
Point point = Point
.measurement(mutual.getCondition())
.addFields( map )
.time( Instant.now(), WritePrecision.NS);
try (WriteApi writeApi = influxDBClient.getWriteApi()) {
writeApi.writePoint(point);
}
return AjaxResult.success();
}
}
package com.ruoyi.framework.topology.collect;
import com.alibaba.fastjson.JSONArray;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.topology.mutual.Mutual;
import com.ruoyi.common.utils.spring.SpringUtils;
import com.ruoyi.topology.service.impl.MysqlServiceImpl;
......@@ -17,4 +19,12 @@ public class MysqlType implements CollectTopologyType {
public Map<String,Object> getData(String param,JSONArray jsonArray) {
return mysqlService.getMysqlData( param );
}
@Override
public AjaxResult setData(Mutual mutual) {
if(mysqlService.setMysqlData(mutual.getCondition())>0){
return AjaxResult.success();
}
return AjaxResult.error("修改失败");
}
}
package com.ruoyi.framework.topology.collect;
import com.alibaba.fastjson.JSONArray;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.topology.mutual.Mutual;
import com.ruoyi.common.utils.spring.SpringUtils;
import com.ruoyi.topology.service.impl.OracleServiceImpl;
......@@ -17,4 +19,12 @@ public class OracleType implements CollectTopologyType {
public Map<String, Object> getData(String param, JSONArray jsonArray) {
return oracleService.getOracleData( param );
}
@Override
public AjaxResult setData(Mutual mutual) {
if(oracleService.setOracleData( mutual.getCondition() )>0){
return AjaxResult.success();
}
return AjaxResult.error("修改失败");
}
}
......@@ -2,6 +2,10 @@ package com.ruoyi.framework.topology.collect;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.topology.mutual.Mutual;
import com.ruoyi.common.utils.JexlUtils;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.spring.SpringUtils;
import org.springframework.data.redis.core.StringRedisTemplate;
......@@ -14,11 +18,27 @@ import java.util.Map;
*/
public class RedisType implements CollectTopologyType {
private StringRedisTemplate stringRedisTemplate = SpringUtils.getBean( StringRedisTemplate.class );
private final StringRedisTemplate stringRedisTemplate = SpringUtils.getBean( StringRedisTemplate.class );
@Override
public Map<String,Object> getData(String param,JSONArray jsonArray) {
String data =stringRedisTemplate.opsForValue().get( param );
Map<String,Object> map= JSONObject.parseObject( data,Map.class );
return map;
}
@Override
public AjaxResult setData(Mutual mutual) {
String str=stringRedisTemplate.opsForValue().get( mutual.getCondition() );
if(StringUtils.isNotBlank( str )){
JSONObject jsonObject=JSONObject.parseObject( str );
if(mutual.getAssignment().contains( "=" )){
jsonObject.put( mutual.getPoint(),mutual.getAssignment().replaceAll( "=","" ) );
}else{
jsonObject.put( mutual.getPoint(), JexlUtils.math( jsonObject.getString( mutual.getPoint() )+mutual.getAssignment() ));
}
stringRedisTemplate.opsForValue().set( mutual.getCondition(),jsonObject.toJSONString() );
return AjaxResult.success();
}
return AjaxResult.error("设置失败");
}
}
package com.ruoyi.framework.topology.collect;
import com.alibaba.fastjson.JSONArray;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.enums.NodeLineParams;
import com.ruoyi.common.topology.change.EchartsSet;
import com.ruoyi.common.topology.mutual.Mutual;
import com.ruoyi.common.utils.JexlUtils;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.framework.topology.emnus.ShareDataType;
import com.ruoyi.common.topology.change.ChangeSub;
import com.ruoyi.common.topology.change.Handle;
import shareconnector.domain.DataType;
import shareconnector.netty.ShareServerFactory;
import shareconnector.service.SendAndRequestService;
......@@ -26,6 +31,8 @@ public class ShareServerType implements CollectTopologyType {
Map<String, Set<Integer>> map =new LinkedHashMap<>( );
Set<Integer> set=null;
for(ChangeSub changeSub:list) {
// #00FF00,#FF4500
// true,false
List<Handle> handleList = changeSub.getHandle();
for(Handle handle:handleList){
//获取echarts数据
......@@ -60,4 +67,50 @@ public class ShareServerType implements CollectTopologyType {
}
return map1;
}
@Override
public AjaxResult setData(Mutual mutual) {
String[] params=mutual.getCondition().split( ":" );
shareServerFactory.setIp( params[0] ).setPort( Integer.parseInt( params[1] ) );
SendAndRequestService send=SendAndRequestService.getInstance();
if(StringUtils.isNotBlank( mutual.getShareType() )){
if(!mutual.getAssignment().contains( "=" )){
if(mutual.getShareType().equals( ShareDataType.FLOAT.name())){
Set<Integer> set=new HashSet<>();
set.add( Integer.parseInt( mutual.getPoint() ) );
Map<Integer,Object> floatMap=send.getDatas( set, DataType.FLOAT );
Map<Integer,Float> map=new LinkedHashMap<>();
Float it=Float.parseFloat(JexlUtils.math( floatMap.get( Integer.parseInt( mutual.getPoint() ) )+mutual.getAssignment().replaceAll( "=","" ) ).toString()) ;
map.put( Integer.parseInt( mutual.getPoint() ), it);
send.sendFloatData( map );
}
if(mutual.getShareType().equals( ShareDataType.INT.name() )){
Set<Integer> set=new HashSet<>();
set.add( Integer.parseInt( mutual.getPoint() ) );
Map<Integer,Object> intMap=send.getDatas( set, DataType.INTEGER );
Map<Integer,Integer> map=new LinkedHashMap<>();
Integer it=Integer.parseInt(JexlUtils.math( intMap.get( Integer.parseInt( mutual.getPoint() ) )+mutual.getAssignment().replaceAll( "=","" ) ).toString()) ;
map.put( Integer.parseInt( mutual.getPoint() ),Integer.parseInt( mutual.getAssignment().replaceAll( "=","" ) ) );
send.sendIntegerData( map );
}
}else{
if(mutual.getShareType().equals( ShareDataType.FLOAT.name())){
Map<Integer,Float> map=new LinkedHashMap<>();
map.put( Integer.parseInt( mutual.getPoint() ),Float.parseFloat( mutual.getAssignment().replaceAll( "=","" ) ) );
send.sendFloatData( map );
}
if(mutual.getShareType().equals( ShareDataType.BOOLEAN.name() )){
Map<Integer,Boolean> map=new LinkedHashMap<>();
map.put( Integer.parseInt( mutual.getPoint() ),Boolean.parseBoolean( mutual.getAssignment().replaceAll( "=","" ) ) );
send.sendBooleanData( map );
}
if(mutual.getShareType().equals( ShareDataType.INT.name() )){
Map<Integer,Integer> map=new LinkedHashMap<>();
map.put( Integer.parseInt( mutual.getPoint() ),Integer.parseInt( mutual.getAssignment().replaceAll( "=","" ) ) );
send.sendIntegerData( map );
}
}
}
return AjaxResult.success();
}
}
......@@ -35,7 +35,7 @@ public enum CollectTopology {
this.i = i;
this.collectTopologyType = collectTopologyType;
}
//匹配
public static CollectTopologyType match(int i) {
CollectTopology[] values = CollectTopology.values();
......
package com.ruoyi.common.core.websocket;
package com.ruoyi.framework.websocket;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.spring.SpringUtils;
import com.ruoyi.framework.publicinter.PublicInterface;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
......@@ -34,6 +37,8 @@ public class WebSocketServer {
/**接收topologyId*/
private String topologyId="";
private PublicInterface publicInterface= SpringUtils.getBean( "publicInterface" );
/**
* 连接建立成功调用的方法*/
@OnOpen
......@@ -77,7 +82,7 @@ public class WebSocketServer {
*
* @param message 客户端发送过来的消息*/
@OnMessage
public void onMessage(String message, Session session) {
public void onMessage(String message, Session session,@PathParam("topologyId") String topologyId) {
log.info("用户消息:"+topologyId+",报文:"+message);
//可以群发消息
//消息保存到数据库、redis
......@@ -86,17 +91,27 @@ public class WebSocketServer {
//解析发送的报文
JSONObject jsonObject = JSON.parseObject(message);
//追加发送人(防止串改)
jsonObject.put("fromUserId",this.topologyId);
String toUserId=jsonObject.getString("toUserId");
//传送给对应toUserId用户的websocket
if(StringUtils.isNotBlank(toUserId)&&webSocketMap.containsKey(toUserId)){
webSocketMap.get(toUserId).sendMessage(jsonObject.toJSONString());
}else{
log.error("请求的userId:"+toUserId+"不在该服务器上");
//否则不在这个服务器上,发送到mysql或者redis
}
jsonObject.put("fromUserId",topologyId);
// String toUserId=jsonObject.getString("toUserId");
// //传送给对应toUserId用户的websocket
// if(StringUtils.isNotBlank(toUserId)&&webSocketMap.containsKey(toUserId)){
// webSocketMap.get(toUserId).sendMessage(jsonObject.toJSONString());
// }else{
// log.error("请求的userId:"+toUserId+"不在该服务器上");
// //否则不在这个服务器上,发送到mysql或者redis
// }
//公共方法解析
AjaxResult ajaxResult=publicInterface.publicMethod( jsonObject.getString( "id" ),jsonObject.getString( "setterTag" ),jsonObject.getString( "setteeTag" ) );
sendInfo( JSON.toJSONString( ajaxResult ),topologyId );
}catch (Exception e){
try {
sendInfo( JSON.toJSONString( AjaxResult.error("执行失败") ),topologyId );
} catch (IOException ioException) {
ioException.printStackTrace();
log.error( "发送消息失败,客户端:{}",topologyId );
}
e.printStackTrace();
}
}
}
......
package com.ruoyi.topology.mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;
import org.springframework.stereotype.Service;
import java.util.Map;
......@@ -13,4 +15,7 @@ import java.util.Map;
public interface DBMapper {
@Select("${sql}")
Map<String,Object> getDBData(String sql);
@Update( "${sql}" )
Integer setDBData( String sql);
}
package com.ruoyi.topology.mapper;
import com.ruoyi.common.core.domain.topology.Image;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
* @author jianglw
* @version 1.0
* @date 2021/6/17 9:41
*/
public interface ImagesMapper {
Integer addImages(@Param( "url" ) String url);
Integer deleteImages(@Param( "id" ) Integer id);
List<Image> getImages();
}
......@@ -22,4 +22,6 @@ public interface ITopologyService {
Integer deleteTopologyById(Integer id);
Map<String,Object> getData(String sql);
void ces();
}
package com.ruoyi.topology.service;
import com.ruoyi.common.core.domain.topology.Image;
import java.util.List;
/**
* @author jianglw
* @version 1.0
* @date 2021/6/17 9:29
*/
public interface IimagesService {
Integer addImages(String url);
Integer deleteImages(Integer id);
List<Image> getImages();
}
package com.ruoyi.topology.service.impl;
import com.ruoyi.common.core.domain.topology.Image;
import com.ruoyi.topology.mapper.ImagesMapper;
import com.ruoyi.topology.service.IimagesService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* @author jianglw
* @version 1.0
* @date 2021/6/17 9:36
*/
@Service
public class ImagesServiceImpl implements IimagesService {
@Autowired
private ImagesMapper imagesMapper;
@Override
public Integer addImages(String url) {
return imagesMapper.addImages(url);
}
@Override
public Integer deleteImages(Integer id) {
return imagesMapper.deleteImages(id);
}
@Override
public List<Image> getImages() {
return imagesMapper.getImages();
}
}
......@@ -25,4 +25,8 @@ public class MysqlServiceImpl implements IMysqlService {
public Map<String, Object> getMysqlData(String sql) {
return dbMapper.getDBData( sql );
}
public Integer setMysqlData(String condition) {
return dbMapper.setDBData(condition);
}
}
......@@ -25,4 +25,8 @@ public class OracleServiceImpl implements IOracleService {
public Map<String, Object> getOracleData(String sql) {
return dbMapper.getDBData( sql );
}
public Integer setOracleData(String condition) {
return dbMapper.setDBData( condition );
}
}
package com.ruoyi.topology.service.impl;
import com.baomidou.dynamic.datasource.annotation.DS;
import com.ruoyi.common.core.domain.topology.TopologyData;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.topology.mapper.TopologyMapper;
......@@ -51,4 +52,10 @@ public class TopologyService implements ITopologyService {
public Map<String,Object> getData(String sql) {
return topologyMapper.getData(sql);
}
@DS( "#last" )
@Override
public void ces() {
System.out.println(topologyMapper.getData( "select * from images" ));
}
}
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ruoyi.topology.mapper.ImagesMapper">
<insert id="addImages">
insert into images (url) values (#{url})
</insert>
<delete id="deleteImages">
delete from images where id = #{id}
</delete>
<select id="getImages" resultType="com.ruoyi.common.core.domain.topology.Image">
select * from images
</select>
</mapper>
\ No newline at end of file
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论