作者 钟来

模块整理

正在显示 67 个修改的文件 包含 1501 行增加338 行删除
... ... @@ -44,10 +44,5 @@
<artifactId>mapper-spring-boot-starter</artifactId>
</dependency>
<!-- Mysql驱动包 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
</dependencies>
</project>
\ No newline at end of file
... ...
... ... @@ -28,10 +28,6 @@ public class DataSourceAspect
{
protected Logger logger = LoggerFactory.getLogger(getClass());
{
System.out.println("数据源拦截");
}
@Pointcut("@annotation(com.zhonglai.luhui.datasource.enums.DataSource)"
+ "|| @within(com.zhonglai.luhui.datasource.enums.DataSource)")
public void dsPointCut()
... ...
... ... @@ -34,7 +34,6 @@ public abstract class JwtAuthenticationTokenFilter extends OncePerRequestFilter
UsernamePasswordAuthenticationToken authenticationToken = getUsernamePasswordAuthenticationToken(loginUser);
authenticationToken.setDetails(new WebAuthenticationDetailsSource().buildDetails(request));
SecurityContextHolder.getContext().setAuthentication(authenticationToken);
chain.doFilter(request, response);
}
chain.doFilter(request, response);
}
... ...
... ... @@ -24,7 +24,6 @@ public abstract class AdminDetailsService implements UserDetailsService
{
private static final Logger log = LoggerFactory.getLogger(AdminDetailsService.class);
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException
{
... ...
... ... @@ -162,4 +162,9 @@ public class AjaxResult extends HashMap<String, Object>
super.put(key, value);
return this;
}
@Override
public String toString() {
return super.toString();
}
}
... ...
... ... @@ -85,4 +85,9 @@ public class TableDataInfo implements Serializable
{
this.msg = msg;
}
@Override
public String toString() {
return super.toString();
}
}
... ...
... ... @@ -15,6 +15,6 @@ public class GsonConstructor {
}
static {
gson = (new GsonBuilder()).setVersion(1.0D).disableInnerClassSerialization().setFieldNamingPolicy(FieldNamingPolicy.IDENTITY).setDateFormat("yyyy-MM-dd").setPrettyPrinting().create();
gson = (new GsonBuilder()).setVersion(1.0D).disableInnerClassSerialization().setFieldNamingPolicy(FieldNamingPolicy.IDENTITY).setDateFormat("yyyy-MM-dd").create();
}
}
... ...
... ... @@ -33,26 +33,41 @@ public class ResourcesConfig implements WebMvcConfigurer
/**
* 跨域配置
*/
// /**
// * 跨域配置
// */
// @Bean
// public CorsFilter corsFilter()
// {
// CorsConfiguration config = new CorsConfiguration();
// config.setAllowCredentials(true);
// // 设置访问源地址
// config.addAllowedOriginPattern("*");
// // 设置访问源请求头
// config.addAllowedHeader("*");
// // 设置访问源请求方法
// config.addAllowedMethod("*");
// // 有效期 1800秒
// config.setMaxAge(1800L);
// // 添加映射路径,拦截一切请求
// UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
// source.registerCorsConfiguration("/**", config);
// // 返回新的CorsFilter
// return new CorsFilter(source);
// }
private CorsConfiguration buildConfig() {
CorsConfiguration corsConfiguration = new CorsConfiguration();
corsConfiguration.addAllowedOrigin("*"); // 1允许任何域名使用
corsConfiguration.addAllowedHeader("*"); // 2允许任何头
corsConfiguration.addAllowedMethod("*"); // 3允许任何方法(post、get等)
return corsConfiguration;
}
@Bean
public CorsFilter corsFilter()
{
CorsConfiguration config = new CorsConfiguration();
config.setAllowCredentials(true);
// 设置访问源地址
config.addAllowedOriginPattern("*");
// 设置访问源请求头
config.addAllowedHeader("*");
// 设置访问源请求方法
config.addAllowedMethod("*");
// 有效期 1800秒
config.setMaxAge(1800L);
// 添加映射路径,拦截一切请求
public CorsFilter corsFilter() {
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
source.registerCorsConfiguration("/**", config);
// 返回新的CorsFilter
source.registerCorsConfiguration("/**", buildConfig()); // 4
return new CorsFilter(source);
}
}
\ No newline at end of file
... ...
... ... @@ -78,5 +78,9 @@
<groupId>tk.mybatis</groupId>
<artifactId>mapper-spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>com.zhonglai.luhui</groupId>
<artifactId>lh-common-datasource</artifactId>
</dependency>
</dependencies>
</project>
\ No newline at end of file
... ...
... ... @@ -5,7 +5,6 @@ import javax.validation.Valid;
import javax.validation.constraints.NotBlank;
import com.ruoyi.common.annotation.PublicSQLConfig;
import com.zhonglai.luhui.datasource.enums.DataSourceType;
import org.apache.commons.lang3.ArrayUtils;
import com.ruoyi.common.constant.GenConstants;
import com.ruoyi.common.tool.BaseEntity;
... ...
... ... @@ -21,7 +21,7 @@ import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.enums.BusinessType;
import ${packageName}.domain.${ClassName};
import ${packageName}.service.I${ClassName}Service;
import com.zhonglai.luhui.sys.utils.ExcelUtil;
##import com.zhonglai.luhui.sys.utils.ExcelUtil;
#if($table.crud || $table.sub)
import com.ruoyi.common.core.page.TableDataInfo;
#elseif($table.tree)
... ... @@ -62,19 +62,19 @@ public class ${ClassName}Controller extends BaseController
}
#end
/**
* 导出${functionName}列表
*/
@ApiOperation("导出${functionName}列表")
## @PreAuthorize("@ss.hasPermi('${permissionPrefix}:export')")
@Log(title = "${functionName}", businessType = BusinessType.EXPORT)
@PostMapping("/export")
public void export(HttpServletResponse response, ${ClassName} ${className})
{
List<${ClassName}> list = ${className}Service.select${ClassName}List(${className});
ExcelUtil<${ClassName}> util = new ExcelUtil<${ClassName}>(${ClassName}.class);
util.exportExcel(response, list, "${functionName}数据");
}
## /**
## * 导出${functionName}列表
## */
## @ApiOperation("导出${functionName}列表")
#### @PreAuthorize("@ss.hasPermi('${permissionPrefix}:export')")
## @Log(title = "${functionName}", businessType = BusinessType.EXPORT)
## @PostMapping("/export")
## public void export(HttpServletResponse response, ${ClassName} ${className})
## {
## List<${ClassName}> list = ${className}Service.select${ClassName}List(${className});
## ExcelUtil<${ClassName}> util = new ExcelUtil<${ClassName}>(${ClassName}.class);
## util.exportExcel(response, list, "${functionName}数据");
## }
/**
* 获取${functionName}详细信息
... ...
... ... @@ -10,6 +10,9 @@
</parent>
<artifactId>lh-jar-action</artifactId>
<description>
action的公告方法
</description>
<properties>
<maven.compiler.source>8</maven.compiler.source>
... ... @@ -18,9 +21,10 @@
</properties>
<dependencies>
<!-- 模型-->
<dependency>
<groupId>com.zhonglai.luhui</groupId>
<artifactId>lh-jar-sys-service</artifactId>
<artifactId>ruoyi-common</artifactId>
</dependency>
</dependencies>
</project>
\ No newline at end of file
... ...
package com.zhonglai.luhui.device.analysis.comm.config;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
import javax.annotation.PostConstruct;
@Configuration
public class CacheConfig {
@Value("${sys.redis.field: null}")
public String sysRedisField ; //域
public static String FIELD ; //域
public static String DEVICE = "device:"; //存放网关数据
public static String THINGS_MODEL = "things_model:"; //存放数据模型
public static String TERMINAL = "terminal:"; //存放终端数据
public static String LOCK = "lock:"; //存放设备锁
@PostConstruct
public void init()
{
CacheConfig.FIELD = sysRedisField;
}
}
\ No newline at end of file
... ...
package com.zhonglai.luhui.device.analysis.comm.config;
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;
/**
* 跨域配置,需要和WebMvcConfigurerAdapter的addCorsMappings配合使用
*/
@Configuration
public class CorsConfig {
private CorsConfiguration buildConfig() {
CorsConfiguration corsConfiguration = new CorsConfiguration();
corsConfiguration.addAllowedOrigin("*"); // 1允许任何域名使用
corsConfiguration.addAllowedHeader("*"); // 2允许任何头
corsConfiguration.addAllowedMethod("*"); // 3允许任何方法(post、get等)
return corsConfiguration;
}
@Bean
public CorsFilter corsFilter() {
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
source.registerCorsConfiguration("/**", buildConfig()); // 4
return new CorsFilter(source);
}
}
package com.zhonglai.luhui.device.analysis.comm.config;
import com.alibaba.fastjson.parser.ParserConfig;
import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.JsonTypeInfo;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.jsontype.impl.LaissezFaireSubTypeValidator;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.StringRedisSerializer;
import javax.annotation.PostConstruct;
@Configuration
public class RedisConfig {
@Value("${sys.redis.field}")
public String sysRedisField ; //域
public static String FIELD ; //域
public static String DEVICE = "device:"; //存放网关数据
public static String THINGS_MODEL = "things_model:"; //存放数据模型
public static String TERMINAL = "terminal:"; //存放终端数据
public static String LOCK = "lock:"; //存放设备锁
@PostConstruct
public void init()
{
RedisConfig.FIELD = sysRedisField;
}
@Bean
@SuppressWarnings(value = { "unchecked", "rawtypes" })
public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory connectionFactory)
{
RedisTemplate<Object, Object> template = new RedisTemplate<>();
template.setConnectionFactory(connectionFactory);
//配置
ParserConfig.getGlobalInstance().setAutoTypeSupport(true);
FastJson2JsonRedisSerializer serializer = new FastJson2JsonRedisSerializer(Object.class);
ObjectMapper mapper = new ObjectMapper();
mapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
mapper.activateDefaultTyping(LaissezFaireSubTypeValidator.instance, ObjectMapper.DefaultTyping.NON_FINAL, JsonTypeInfo.As.PROPERTY);
serializer.setObjectMapper(mapper);
// 使用StringRedisSerializer来序列化和反序列化redis的key值
template.setKeySerializer(new StringRedisSerializer());
template.setValueSerializer(serializer);
// Hash的key也采用StringRedisSerializer的序列化方式
template.setHashKeySerializer(new StringRedisSerializer());
template.setHashValueSerializer(serializer);
template.afterPropertiesSet();
return template;
}
// @Bean
// public RedisTemplate<String,Object> redisTemplate(RedisConnectionFactory redisConnectionFactory){
// RedisTemplate<String,Object> redisTemplate = new RedisTemplate<>();
// //设置工厂链接
// redisTemplate.setConnectionFactory(redisConnectionFactory);
// //设置自定义序列化方式
// setSerializeConfig(redisTemplate, redisConnectionFactory);
// return redisTemplate;
// }
//
// private void setSerializeConfig(RedisTemplate<String, Object> redisTemplate, RedisConnectionFactory redisConnectionFactory) {
// //对字符串采取普通的序列化方式 适用于key 因为我们一般采取简单字符串作为key
// StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
// //普通的string类型的key采用 普通序列化方式
// redisTemplate.setKeySerializer(stringRedisSerializer);
// //普通hash类型的key也使用 普通序列化方式
// redisTemplate.setHashKeySerializer(stringRedisSerializer);
// //解决查询缓存转换异常的问题 大家不能理解就直接用就可以了 这是springboot自带的jackson序列化类,但是会有一定问题
// Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
// ObjectMapper om = new ObjectMapper();
// om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
// om.activateDefaultTyping(om.getPolymorphicTypeValidator(),ObjectMapper.DefaultTyping.NON_FINAL, JsonTypeInfo.As.WRAPPER_ARRAY);
// jackson2JsonRedisSerializer.setObjectMapper(om);
// //普通的值采用jackson方式自动序列化
// redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
// //hash类型的值也采用jackson方式序列化
// redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);
// //属性设置完成afterPropertiesSet就会被调用,可以对设置不成功的做一些默认处理
// redisTemplate.afterPropertiesSet();
// }
}
\ No newline at end of file
... ... @@ -44,7 +44,7 @@ public class BusinessDataUpdateService {
@Value("${server.port}")
private long port;
@Value("${server.context-path}")
@Value("${server.servlet.context-path}")
private String contextPath;
@Value("${sys.isText:false}")
... ...
... ... @@ -3,7 +3,7 @@ package com.zhonglai.luhui.device.analysis.comm.service;
import com.alibaba.fastjson.JSONObject;
import com.zhonglai.luhui.device.domain.IotDevice;
import com.zhonglai.luhui.device.domain.IotTerminal;
import com.zhonglai.luhui.device.analysis.comm.config.RedisConfig;
import com.zhonglai.luhui.device.analysis.comm.config.CacheConfig;
import com.zhonglai.luhui.device.analysis.comm.dao.BaseDao;
import com.zhonglai.luhui.device.analysis.comm.dto.ServerDto;
import com.zhonglai.luhui.device.analysis.comm.factory.Topic;
... ... @@ -215,7 +215,7 @@ public class CacheServiceImpl implements CacheService {
*/
public Set<String> getRedicTerminalFromClientId(String client_id)
{
Set<String> keys = redisService.keys(RedisConfig.FIELD+RedisConfig.TERMINAL+client_id+"*");
Set<String> keys = redisService.keys(CacheConfig.FIELD+ CacheConfig.TERMINAL+client_id+"*");
return keys;
}
... ... @@ -225,7 +225,7 @@ public class CacheServiceImpl implements CacheService {
*/
private String getRedicDeviceKeyPath()
{
return RedisConfig.FIELD+RedisConfig.DEVICE;
return CacheConfig.FIELD+ CacheConfig.DEVICE;
}
/**
... ... @@ -244,7 +244,7 @@ public class CacheServiceImpl implements CacheService {
*/
private String getRedicTerminalKeyPath()
{
return RedisConfig.FIELD+RedisConfig.TERMINAL;
return CacheConfig.FIELD+ CacheConfig.TERMINAL;
}
private String keyspaceNotificationsConfigParameter = "KEA";
... ...
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.zhonglai.luhui</groupId>
<artifactId>lh-jar</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<artifactId>lh-jar-order-service</artifactId>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<!-- 通用工具-->
<dependency>
<groupId>com.zhonglai.luhui</groupId>
<artifactId>lh-domain</artifactId>
</dependency>
<dependency>
<groupId>com.zhonglai.luhui</groupId>
<artifactId>lh-public-dao</artifactId>
</dependency>
<dependency>
<groupId>com.zhonglai.luhui</groupId>
<artifactId>lh-common-datasource</artifactId>
</dependency>
<dependency>
<groupId>com.zhonglai.luhui</groupId>
<artifactId>lh-jar-action</artifactId>
</dependency>
</dependencies>
</project>
\ No newline at end of file
... ...
package com.zhonglai.luhui.order.service.controller;
import java.util.List;
import javax.servlet.http.HttpServletResponse;
import com.ruoyi.common.utils.DateUtils;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.ruoyi.common.annotation.Log;
import com.zhonglai.luhui.action.BaseController;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.enums.BusinessType;
import com.zhonglai.luhui.order.service.domain.ContentGroupManagement;
import com.zhonglai.luhui.order.service.service.IContentGroupManagementService;
import com.ruoyi.common.core.page.TableDataInfo;
/**
* 分组内容管理Controller
*
* @author 钟来
* @date 2023-08-30
*/
@Api(tags = "分组内容管理")
@RestController
@RequestMapping("/content/ContentGroupManagement")
public class ContentGroupManagementController extends BaseController
{
@Autowired
private IContentGroupManagementService contentGroupManagementService;
/**
* 查询分组内容管理列表
*/
@ApiOperation("查询分组内容管理列表")
@GetMapping("/list")
public TableDataInfo list(ContentGroupManagement contentGroupManagement)
{
startPage();
List<ContentGroupManagement> list = contentGroupManagementService.selectContentGroupManagementList(contentGroupManagement);
return getDataTable(list);
}
/**
* 获取分组内容管理详细信息
*/
@ApiOperation("获取分组内容管理详细信息")
@GetMapping(value = "/{id}")
public AjaxResult getInfo(@PathVariable("id") Integer id)
{
return AjaxResult.success(contentGroupManagementService.selectContentGroupManagementById(id));
}
/**
* 新增分组内容管理
*/
@ApiOperation("新增分组内容管理")
@Log(title = "分组内容管理", businessType = BusinessType.INSERT)
@PostMapping
public AjaxResult add(@RequestBody ContentGroupManagement contentGroupManagement)
{
contentGroupManagement.setCreate_time(DateUtils.getNowTimeMilly());
return toAjax(contentGroupManagementService.insertContentGroupManagement(contentGroupManagement));
}
/**
* 修改分组内容管理
*/
@ApiOperation("修改分组内容管理")
@Log(title = "分组内容管理", businessType = BusinessType.UPDATE)
@PutMapping
public AjaxResult edit(@RequestBody ContentGroupManagement contentGroupManagement)
{
return toAjax(contentGroupManagementService.updateContentGroupManagement(contentGroupManagement));
}
/**
* 删除分组内容管理
*/
@ApiOperation("删除分组内容管理")
@Log(title = "分组内容管理", businessType = BusinessType.DELETE)
@DeleteMapping("/{ids}")
public AjaxResult remove(@PathVariable Integer[] ids)
{
return toAjax(contentGroupManagementService.deleteContentGroupManagementByIds(ids));
}
}
... ...
package com.zhonglai.luhui.order.service.domain;
import com.ruoyi.common.annotation.Excel;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import com.ruoyi.common.annotation.PublicSQLConfig;
import com.ruoyi.common.tool.BaseEntity;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
/**
* 分组内容管理对象 content_group_management
*
* @author 钟来
* @date 2023-08-30
*/
@ApiModel("分组内容管理")
public class ContentGroupManagement extends BaseEntity
{
@PublicSQLConfig(isSelect=false)
private static final long serialVersionUID = 1L;
/** 内容 */
@ApiModelProperty("内容")
private String content;
/** 创建时间 */
@ApiModelProperty("创建时间")
private Integer create_time;
/** 分组名称 */
@ApiModelProperty("分组名称")
private String group_name;
/** 主键 */
@ApiModelProperty("主键")
private Integer id;
/** 排序 */
@ApiModelProperty("排序")
private Integer sort;
public void setContent(String content)
{
this.content = content;
}
public String getContent()
{
return content;
}
public void setCreate_time(Integer create_time)
{
this.create_time = create_time;
}
public Integer getCreate_time()
{
return create_time;
}
public void setGroup_name(String group_name)
{
this.group_name = group_name;
}
public String getGroup_name()
{
return group_name;
}
public void setId(Integer id)
{
this.id = id;
}
public Integer getId()
{
return id;
}
public void setSort(Integer sort)
{
this.sort = sort;
}
public Integer getSort()
{
return sort;
}
@Override
public String toString() {
return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
.append("content", getContent())
.append("create_time", getCreate_time())
.append("group_name", getGroup_name())
.append("id", getId())
.append("sort", getSort())
.toString();
}
}
... ...
package com.zhonglai.luhui.order.service.mapper;
import java.util.List;
import com.zhonglai.luhui.order.service.domain.ContentGroupManagement;
/**
* 分组内容管理Mapper接口
*
* @author 钟来
* @date 2023-08-30
*/
public interface ContentGroupManagementMapper
{
/**
* 查询分组内容管理
*
* @param id 分组内容管理主键
* @return 分组内容管理
*/
public ContentGroupManagement selectContentGroupManagementById(Integer id);
/**
* 查询分组内容管理列表
*
* @param contentGroupManagement 分组内容管理
* @return 分组内容管理集合
*/
public List<ContentGroupManagement> selectContentGroupManagementList(ContentGroupManagement contentGroupManagement);
/**
* 新增分组内容管理
*
* @param contentGroupManagement 分组内容管理
* @return 结果
*/
public int insertContentGroupManagement(ContentGroupManagement contentGroupManagement);
/**
* 修改分组内容管理
*
* @param contentGroupManagement 分组内容管理
* @return 结果
*/
public int updateContentGroupManagement(ContentGroupManagement contentGroupManagement);
/**
* 删除分组内容管理
*
* @param id 分组内容管理主键
* @return 结果
*/
public int deleteContentGroupManagementById(Integer id);
/**
* 批量删除分组内容管理
*
* @param ids 需要删除的数据主键集合
* @return 结果
*/
public int deleteContentGroupManagementByIds(Integer[] ids);
}
... ...
package com.zhonglai.luhui.order.service.service;
import java.util.List;
import com.zhonglai.luhui.order.service.domain.ContentGroupManagement;
/**
* 分组内容管理Service接口
*
* @author 钟来
* @date 2023-08-30
*/
public interface IContentGroupManagementService
{
/**
* 查询分组内容管理
*
* @param id 分组内容管理主键
* @return 分组内容管理
*/
public ContentGroupManagement selectContentGroupManagementById(Integer id);
/**
* 查询分组内容管理列表
*
* @param contentGroupManagement 分组内容管理
* @return 分组内容管理集合
*/
public List<ContentGroupManagement> selectContentGroupManagementList(ContentGroupManagement contentGroupManagement);
/**
* 新增分组内容管理
*
* @param contentGroupManagement 分组内容管理
* @return 结果
*/
public int insertContentGroupManagement(ContentGroupManagement contentGroupManagement);
/**
* 修改分组内容管理
*
* @param contentGroupManagement 分组内容管理
* @return 结果
*/
public int updateContentGroupManagement(ContentGroupManagement contentGroupManagement);
/**
* 批量删除分组内容管理
*
* @param ids 需要删除的分组内容管理主键集合
* @return 结果
*/
public int deleteContentGroupManagementByIds(Integer[] ids);
/**
* 删除分组内容管理信息
*
* @param id 分组内容管理主键
* @return 结果
*/
public int deleteContentGroupManagementById(Integer id);
}
... ...
package com.zhonglai.luhui.order.service.service.impl;
import java.util.List;
import com.zhonglai.luhui.datasource.enums.DataSource;
import com.zhonglai.luhui.datasource.enums.DataSourceType;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.zhonglai.luhui.order.service.mapper.ContentGroupManagementMapper;
import com.zhonglai.luhui.order.service.domain.ContentGroupManagement;
import com.zhonglai.luhui.order.service.service.IContentGroupManagementService;
/**
* 分组内容管理Service业务层处理
*
* @author 钟来
* @date 2023-08-30
*/
@Service
public class ContentGroupManagementServiceImpl implements IContentGroupManagementService
{
@Autowired
private ContentGroupManagementMapper contentGroupManagementMapper;
/**
* 查询分组内容管理
*
* @param id 分组内容管理主键
* @return 分组内容管理
*/
@DataSource(DataSourceType.MASTER)
@Override
public ContentGroupManagement selectContentGroupManagementById(Integer id)
{
return contentGroupManagementMapper.selectContentGroupManagementById(id);
}
/**
* 查询分组内容管理列表
*
* @param contentGroupManagement 分组内容管理
* @return 分组内容管理
*/
@DataSource(DataSourceType.MASTER)
@Override
public List<ContentGroupManagement> selectContentGroupManagementList(ContentGroupManagement contentGroupManagement)
{
return contentGroupManagementMapper.selectContentGroupManagementList(contentGroupManagement);
}
/**
* 新增分组内容管理
*
* @param contentGroupManagement 分组内容管理
* @return 结果
*/
@DataSource(DataSourceType.MASTER)
@Override
public int insertContentGroupManagement(ContentGroupManagement contentGroupManagement)
{
return contentGroupManagementMapper.insertContentGroupManagement(contentGroupManagement);
}
/**
* 修改分组内容管理
*
* @param contentGroupManagement 分组内容管理
* @return 结果
*/
@DataSource(DataSourceType.MASTER)
@Override
public int updateContentGroupManagement(ContentGroupManagement contentGroupManagement)
{
return contentGroupManagementMapper.updateContentGroupManagement(contentGroupManagement);
}
/**
* 批量删除分组内容管理
*
* @param ids 需要删除的分组内容管理主键
* @return 结果
*/
@DataSource(DataSourceType.MASTER)
@Override
public int deleteContentGroupManagementByIds(Integer[] ids)
{
return contentGroupManagementMapper.deleteContentGroupManagementByIds(ids);
}
/**
* 删除分组内容管理信息
*
* @param id 分组内容管理主键
* @return 结果
*/
@DataSource(DataSourceType.MASTER)
@Override
public int deleteContentGroupManagementById(Integer id)
{
return contentGroupManagementMapper.deleteContentGroupManagementById(id);
}
}
... ...
<?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.zhonglai.luhui.order.service.mapper.ContentGroupManagementMapper">
<resultMap type="ContentGroupManagement" id="ContentGroupManagementResult">
<result property="content" column="content" />
<result property="create_time" column="create_time" />
<result property="group_name" column="group_name" />
<result property="id" column="id" />
<result property="sort" column="sort" />
</resultMap>
<sql id="selectContentGroupManagementVo">
select `content`, `create_time`, `group_name`, `id`, `sort` from content_group_management
</sql>
<select id="selectContentGroupManagementList" parameterType="ContentGroupManagement" resultMap="ContentGroupManagementResult">
<include refid="selectContentGroupManagementVo"/>
<where>
<if test="params.beginCreate_time != null and params.beginCreate_time != '' and params.endCreate_time != null and params.endCreate_time != ''"> and create_time between #{params.beginCreate_time} and #{params.endCreate_time}</if>
<if test="group_name != null and group_name != ''"> and group_name like concat('%', #{group_name}, '%')</if>
<if test="id != null "> and id = #{id}</if>
<if test="sort != null "> and sort = #{sort}</if>
</where>
</select>
<select id="selectContentGroupManagementById" parameterType="Integer" resultMap="ContentGroupManagementResult">
<include refid="selectContentGroupManagementVo"/>
where id = #{id}
</select>
<insert id="insertContentGroupManagement" parameterType="ContentGroupManagement" useGeneratedKeys="true" keyProperty="id">
insert into content_group_management
<trim prefix="(" suffix=")" suffixOverrides=",">
<if test="content != null and content != ''">content,</if>
<if test="create_time != null">create_time,</if>
<if test="group_name != null and group_name != ''">group_name,</if>
<if test="sort != null">sort,</if>
</trim>
<trim prefix="values (" suffix=")" suffixOverrides=",">
<if test="content != null and content != ''">#{content},</if>
<if test="create_time != null">#{create_time},</if>
<if test="group_name != null and group_name != ''">#{group_name},</if>
<if test="sort != null">#{sort},</if>
</trim>
</insert>
<update id="updateContentGroupManagement" parameterType="ContentGroupManagement">
update content_group_management
<trim prefix="SET" suffixOverrides=",">
<if test="content != null and content != ''">content = #{content},</if>
<if test="create_time != null">create_time = #{create_time},</if>
<if test="group_name != null and group_name != ''">group_name = #{group_name},</if>
<if test="sort != null">sort = #{sort},</if>
</trim>
where id = #{id}
</update>
<delete id="deleteContentGroupManagementById" parameterType="Integer">
delete from content_group_management where id = #{id}
</delete>
<delete id="deleteContentGroupManagementByIds" parameterType="String">
delete from content_group_management where id in
<foreach item="id" collection="array" open="(" separator="," close=")">
#{id}
</foreach>
</delete>
</mapper>
\ No newline at end of file
... ...
... ... @@ -17,6 +17,7 @@
<module>lh-jar-device-service</module>
<module>lh-jar-rocketmq</module>
<module>lh-jar-sys-service</module>
<module>lh-jar-order-service</module>
</modules>
<properties>
... ...
... ... @@ -89,6 +89,10 @@
<groupId>com.zhonglai.luhui</groupId>
<artifactId>lh-jar-device-service</artifactId>
</dependency>
<dependency>
<groupId>com.zhonglai.luhui</groupId>
<artifactId>ruoyi-common-security</artifactId>
</dependency>
</dependencies>
<build>
... ...
... ... @@ -21,7 +21,6 @@ import org.springframework.context.annotation.ComponentScan;
"com.zhonglai.luhui.firewall",
"com.zhonglai.luhui.admin",
"com.zhonglai.luhui.device.analysis.comm.service.redis",
"com.zhonglai.luhui.mqtt.service.db.mode"
})
@SpringBootApplication(exclude = { DataSourceAutoConfiguration.class })
public class AdminApplication {
... ...
package com.zhonglai.luhui.admin.config;
import com.ruoyi.common.tool.SysLogininforType;
import com.ruoyi.common.utils.spring.SpringUtils;
import com.zhonglai.luhui.security.config.DefaultSecurityConfig;
import com.zhonglai.luhui.security.service.AdminDetailsService;
import com.zhonglai.luhui.security.service.SecurityConfigService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.annotation.Order;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.crypto.password.PasswordEncoder;
/**
* app接口安全策略. 没有{@link Order}注解优先级比上面低
*/
@Configuration
@Order(1)
public class AdminConfigurerAdapter extends DefaultSecurityConfig {
@Autowired
private AdminDetailsService adminDetailsService;
@Autowired
private SecurityConfigService securityConfigService;
@Override
public UserDetailsService getUserDetailsService() {
return adminDetailsService;
}
@Override
public void configHttpSecurity(HttpSecurity httpSecurity) throws Exception {
httpSecurity.antMatcher("/sysLogin/**");
securityConfigService.configHttpSecurity(httpSecurity);
}
@Override
public PasswordEncoder bCryptPasswordEncoder() {
return SpringUtils.getBean("bCryptPasswordEncoder");
}
@Override
public SysLogininforType sysLogininforType() {
return SysLogininforType.lhAdmin;
}
}
\ No newline at end of file
... ...
package com.zhonglai.luhui.admin.config;
import com.ruoyi.common.utils.StringUtils;
import com.zhonglai.luhui.security.dto.BaseLoginUser;
import com.zhonglai.luhui.security.filter.JwtAuthenticationTokenFilter;
import com.zhonglai.luhui.security.service.TokenService;
import com.zhonglai.luhui.security.utils.SecurityUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.stereotype.Component;
import javax.servlet.http.HttpServletRequest;
@Component
public class JwtAuthenticationTokenFilterImpl extends JwtAuthenticationTokenFilter {
@Autowired
private TokenService tokenService;
@Override
public BaseLoginUser getBaseLoginUser(HttpServletRequest request) {
return tokenService.getLoginUser(request);
}
@Override
public boolean verifyToken(BaseLoginUser baseLoginUser) {
if (StringUtils.isNotNull(baseLoginUser) && StringUtils.isNull(SecurityUtils.getAuthentication()))
{
tokenService.verifyToken(baseLoginUser);
return true;
}
return false;
}
@Override
public UsernamePasswordAuthenticationToken getUsernamePasswordAuthenticationToken(BaseLoginUser loginUser) {
return new UsernamePasswordAuthenticationToken(loginUser, null, loginUser.getAuthorities());
}
}
... ...
package com.zhonglai.luhui.admin.service;
import com.zhonglai.luhui.security.service.AdminDetailsService;
import org.springframework.stereotype.Service;
@Service
public class AdminDetailsServiceImpl extends AdminDetailsService {
}
... ...
... ... @@ -12,69 +12,49 @@
<artifactId>lh-api</artifactId>
<dependencies>
<!-- spring-boot-devtools -->
<!-- 核心模块-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional> <!-- 表示依赖不会传递 -->
</dependency>
<!-- SpringBoot Web容器 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<groupId>com.zhonglai.luhui</groupId>
<artifactId>ruoyi-framework</artifactId>
</dependency>
<!-- Spring框架基本的核心工具 -->
<!-- 权限 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<groupId>com.zhonglai.luhui</groupId>
<artifactId>ruoyi-common-security</artifactId>
</dependency>
<!-- SpringWeb模块 -->
<!-- 文档 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<groupId>com.zhonglai.luhui</groupId>
<artifactId>lh-common-swagger</artifactId>
</dependency>
<!-- 控制模块公共方法 -->
<dependency>
<groupId>com.zhonglai.luhui</groupId>
<artifactId>ruoyi-framework</artifactId>
<artifactId>lh-jar-action</artifactId>
</dependency>
<!-- Mysql驱动包 -->
<!-- 设备管理 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!-- 文档 -->
<dependency >
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>${swagger.version}</version>
<exclusions>
<exclusion>
<groupId>io.swagger</groupId>
<artifactId>swagger-models</artifactId>
</exclusion>
<exclusion>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
</exclusion>
</exclusions>
<groupId>com.zhonglai.luhui</groupId>
<artifactId>lh-jar-device-service</artifactId>
</dependency>
<!--https://mvnrepository.com/artifact/io.swagger/swagger-models-->
<!-- 登录模块 -->
<dependency>
<groupId>io.swagger</groupId>
<artifactId>swagger-models</artifactId>
<version>${swagger-models.version}</version>
<groupId>com.zhonglai.luhui</groupId>
<artifactId>lh-login</artifactId>
</dependency>
<!-- 其它模块 -->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>${swagger.version}</version>
<groupId>com.zhonglai.luhui</groupId>
<artifactId>lh-jar-order-service</artifactId>
</dependency>
<!--&lt;!&ndash; https://mvnrepository.com/artifact/com.github.xiaoymin/swagger-bootstrap-ui &ndash;&gt;-->
<!-- 数据库驱动 -->
<dependency>
<groupId>com.github.xiaoymin</groupId>
<artifactId>swagger-bootstrap-ui</artifactId>
<version>${swagger-ui.version}</version>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
... ... @@ -85,26 +65,6 @@
<groupId>org.aspectj</groupId>
<artifactId>aspectjrt</artifactId>
</dependency>
<dependency>
<groupId>com.zhonglai.luhui</groupId>
<artifactId>ruoyi-common-security</artifactId>
</dependency>
<dependency>
<groupId>com.zhonglai.luhui</groupId>
<artifactId>lh-jar-action</artifactId>
</dependency>
<dependency>
<groupId>com.zhonglai.luhui</groupId>
<artifactId>lh-jar-rocketmq</artifactId>
</dependency>
<dependency>
<groupId>com.zhonglai.luhui</groupId>
<artifactId>lh-jar-device-service</artifactId>
</dependency>
<dependency>
<groupId>com.zhonglai.luhui</groupId>
<artifactId>lh-login</artifactId>
</dependency>
</dependencies>
<build>
... ...
... ... @@ -19,6 +19,7 @@ import org.springframework.context.annotation.EnableAspectJAutoProxy;
"com.zhonglai.luhui.security",
"com.zhonglai.luhui.login.service",
"com.zhonglai.luhui.api",
"com.zhonglai.luhui.order.service",
})
@EnableAspectJAutoProxy(proxyTargetClass=true)
@SpringBootApplication
... ...
... ... @@ -22,7 +22,7 @@ import java.util.Map;
public class IotDeviceControlController {
@Autowired
private DeviceControlService deviceControlService;
@ApiOperation("固件版本更新")
@ApiImplicitParams({
@ApiImplicitParam(value = "主机imei",name = "imei"),
... ...
... ... @@ -7,6 +7,7 @@ import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.system.domain.user.UserTerminalGroupRelation;
import com.zhonglai.luhui.action.BaseController;
import com.zhonglai.luhui.api.controller.test.TestDto;
import com.zhonglai.luhui.device.domain.IotTerminal;
import com.zhonglai.luhui.device.service.IIotTerminalService;
import com.zhonglai.luhui.device.service.IUserTerminalGroupRelationService;
... ... @@ -22,7 +23,7 @@ import java.util.List;
/**
* 终端Controller
*
*
* @author 钟来
* @date 2022-08-26
*/
... ... @@ -48,6 +49,13 @@ public class IotTerminalController extends BaseController
return getDataTable(list);
}
@ApiOperation("测试")
@GetMapping("/t1")
public TestDto t1()
{
return new TestDto();
}
@ApiOperation("获取终端详细信息")
@ApiImplicitParam(value = "终端id",name = "id")
@GetMapping(value = "/{id}")
... ...
package com.zhonglai.luhui.api.controller.test;
import com.ruoyi.common.core.domain.AjaxResult;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@Api(tags = "测试")
@RestController
@RequestMapping("/test")
public class TestController {
@ApiOperation("账号密码登陆")
@GetMapping("/t1")
public AjaxResult t1()
{
return AjaxResult.success(new TestDto());
}
}
... ...
package com.zhonglai.luhui.api.controller.test;
public class TestDto {
private String msg;
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
@Override
public String toString() {
return "TestDto{" +
"msg='" + msg + '\'' +
'}';
}
}
... ...
... ... @@ -27,7 +27,7 @@ import com.ruoyi.common.core.page.TableDataInfo;
/**
* 终端分组Controller
*
*
* @author 钟来
* @date 2022-11-22
*/
... ...
... ... @@ -31,7 +31,7 @@ import com.ruoyi.common.core.page.TableDataInfo;
/**
* 终端分组关系Controller
*
*
* @author 钟来
* @date 2022-11-22
*/
... ...
# 项目相关配置 jhlt: # 名称 name: zhonglai # 版本 version: 3.8.2 # 版权年份 copyrightYear: 2022 # 实例演示开关 demoEnabled: true # 文件路径 示例( Windows配置D:/ruoyi/uploadPath,Linux配置 /home/ruoyi/uploadPath) profile: D:/ruoyi/uploadPath # 获取ip地址开关 addressEnabled: false # 验证码类型 math 数组计算 char 字符验证 captchaType: math # 开发环境配置 server: # 服务器的HTTP端口,默认为8080 port: 18080 servlet: # 应用的访问路径 context-path: / tomcat: # tomcat的URI编码 uri-encoding: UTF-8 # 连接数满后的排队数,默认为100 accept-count: 1000 threads: # tomcat最大线程数,默认为200 max: 800 # Tomcat启动初始化的线程数,默认值10 min-spare: 100 # 日志配置 logging: level: com.ruoyi: debug org.springframework: warn # Spring配置 spring: # 资源信息 messages: # 国际化资源文件路径 basename: i18n/messages profiles: active: druid # 文件上传 servlet: multipart: # 单个文件大小 max-file-size: 10MB # 设置总上传的文件大小 max-request-size: 20MB # 服务模块 devtools: restart: # 热部署开关 enabled: true # redis 配置 redis: # 地址 host: 47.112.163.61 # 端口,默认为6379 port: 9527 # 数据库索引 database: 1 # 密码 password: Luhui586 # 连接超时时间 timeout: 10s lettuce: pool: # 连接池中的最小空闲连接 min-idle: 0 # 连接池中的最大空闲连接 max-idle: 8 # 连接池的最大数据库连接数 max-active: 8 # #连接池最大阻塞等待时间(使用负值表示没有限制) max-wait: -1ms # token配置 token: # 令牌自定义标识 header: Authorization # 令牌密钥 secret: abcdefghijklmnopqrstuvwxyz # 令牌有效期(默认30分钟) expireTime: 1440 rediskey: lh-api # MyBatis配置 mybatis: # 搜索指定包别名 typeAliasesPackage: com.ruoyi.**.domain,com.zhonglai.**.domain # 配置mapper的扫描,找到所有的mapper.xml映射文件 mapperLocations: classpath*:mapper/**/*Mapper.xml # 加载全局的配置文件 configLocation: classpath:mybatis/mybatis-config.xml # PageHelper分页插件 pagehelper: helperDialect: mysql supportMethodsArguments: true params: count=countSql # Swagger配置 swagger: # 是否开启swagger enabled: true # 请求前缀 pathMapping: /dev-api # 防止XSS攻击 xss: # 过滤开关 enabled: true # 排除链接(多个用逗号分隔) excludes: /system/notice # 匹配链接 urlPatterns: /system/*,/monitor/*,/tool/* mqtt: client: device_life: 180 sys: ## // 对于登录login 注册register 验证码captchaImage 允许匿名访问 antMatchers: /login/ApiLogin/* # NameServer地址 rocketmq: name-server: 47.115.144.179:9876 # 默认的消息组 producer: group: deviceCommand send-message-timeout: 30000 send-topic: lh-mqtt-service-deviceCommand-test send-tags: 1
\ No newline at end of file
# 项目相关配置 jhlt: # 名称 name: zhonglai # 版本 version: 3.8.2 # 版权年份 copyrightYear: 2022 # 实例演示开关 demoEnabled: true # 文件路径 示例( Windows配置D:/ruoyi/uploadPath,Linux配置 /home/ruoyi/uploadPath) profile: D:/ruoyi/uploadPath # 获取ip地址开关 addressEnabled: false # 验证码类型 math 数组计算 char 字符验证 captchaType: math # 开发环境配置 server: # 服务器的HTTP端口,默认为8080 port: 18080 servlet: # 应用的访问路径 context-path: / tomcat: # tomcat的URI编码 uri-encoding: UTF-8 # 连接数满后的排队数,默认为100 accept-count: 1000 threads: # tomcat最大线程数,默认为200 max: 800 # Tomcat启动初始化的线程数,默认值10 min-spare: 100 # 日志配置 logging: level: com.ruoyi: debug org.springframework: warn # Spring配置 spring: # 资源信息 messages: # 国际化资源文件路径 basename: i18n/messages profiles: active: druid # 文件上传 servlet: multipart: # 单个文件大小 max-file-size: 10MB # 设置总上传的文件大小 max-request-size: 20MB # 服务模块 devtools: restart: # 热部署开关 enabled: true # redis 配置 redis: # 地址 host: 47.112.163.61 # 端口,默认为6379 port: 9527 # 数据库索引 database: 1 # 密码 password: Luhui586 # 连接超时时间 timeout: 10s lettuce: pool: # 连接池中的最小空闲连接 min-idle: 0 # 连接池中的最大空闲连接 max-idle: 8 # 连接池的最大数据库连接数 max-active: 8 # #连接池最大阻塞等待时间(使用负值表示没有限制) max-wait: -1ms # token配置 token: # 令牌自定义标识 header: Authorization # 令牌密钥 secret: abcdefghijklmnopqrstuvwxyz # 令牌有效期(默认30分钟) expireTime: 1440 rediskey: lh-api # MyBatis配置 mybatis: # 搜索指定包别名 typeAliasesPackage: com.ruoyi.**.domain,com.zhonglai.**.domain # 配置mapper的扫描,找到所有的mapper.xml映射文件 mapperLocations: classpath*:mapper/**/*Mapper.xml # 加载全局的配置文件 configLocation: classpath:mybatis/mybatis-config.xml # PageHelper分页插件 pagehelper: helperDialect: mysql supportMethodsArguments: true params: count=countSql # Swagger配置 swagger: # 是否开启swagger enabled: true # 请求前缀 pathMapping: /dev-api # 防止XSS攻击 xss: # 过滤开关 enabled: true # 排除链接(多个用逗号分隔) excludes: /system/notice # 匹配链接 urlPatterns: /system/*,/monitor/*,/tool/* mqtt: client: device_life: 180 sys: ## // 对于登录login 注册register 验证码captchaImage 允许匿名访问 antMatchers: /login/ApiLogin/*,/content/**,/test/** # NameServer地址 rocketmq: name-server: 47.115.144.179:9876 # 默认的消息组 producer: group: deviceCommand send-message-timeout: 30000 send-topic: lh-mqtt-service-deviceCommand-test send-tags: 1
\ No newline at end of file
... ...
... ... @@ -3,7 +3,8 @@ server:
tomcat:
uri-encoding: UTF-8
port: 4883
context-path: /
servlet:
context-path: /
spring:
messages:
... ...
opencv源码编译过程:
1、首先,确保你的 Armbian 系统已经安装好了基本的编译工具和依赖库。可以通过运行以下命令来安装它们:
sudo apt-get update
sudo apt-get install build-essential cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev
2、下载 OpenCV 的源码。你可以从 OpenCV 官方网站(https://opencv.org/releases/)下载最新版本的源码,也可以使用 Git 克隆 OpenCV 的仓库:
git clone https://github.com/opencv/opencv.git
3、创建一个用于编译的目录,并进入该目录:
cd opencv
mkdir build
cd build
4、使用 CMake 配置编译选项,并启用 Java 支持:
cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/usr/local -DOPENCV_GENERATE_JAVA_WRAPPER=ON ..
这个命令将配置编译选项,包括编译类型、安装目录,并启用 Java 支持。
5、执行 make 命令编译源码:
make -j8
这个过程可能需要一些时间,取决于你的硬件性能。
6、安装编译好的 OpenCV:
sudo make install
这个命令将会安装编译好的 OpenCV 到指定的安装目录。
生成 libopencv_javaX.so 文件。在编译完成后,你可以在 build/lib 目录下找到生成的 libopencv_javaX.so 文件。
\ No newline at end of file
... ...
... ... @@ -97,6 +97,20 @@
<artifactId>sqlite-jdbc</artifactId>
<version>3.21.0.1</version>
</dependency>
<!-- <dependency>-->
<!-- <groupId>mysql</groupId>-->
<!-- <artifactId>mysql-connector-java</artifactId>-->
<!-- </dependency>-->
<!-- mqtt -->
<dependency>
<groupId>org.eclipse.paho</groupId>
<artifactId>org.eclipse.paho.client.mqttv3</artifactId>
</dependency>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
</dependency>
</dependencies>
<build>
... ...
... ... @@ -2,6 +2,8 @@ package com.zhonglai.luhui.smart.feeder;
import com.ruoyi.framework.config.ResourcesConfig;
import com.zhonglai.luhui.smart.feeder.config.OpenCVConfig;
import com.zhonglai.luhui.smart.feeder.controller.CameraController;
import com.zhonglai.luhui.smart.feeder.controller.ConfigController;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
... ... @@ -17,9 +19,10 @@ import org.springframework.scheduling.annotation.EnableScheduling;
"com.ruoyi.framework",
"com.zhonglai.luhui.datasource",
"com.zhonglai.luhui.dao",
"com.zhonglai.luhui.smart.feeder",
"com.zhonglai.luhui.smart.feeder.controller",
"com.zhonglai.luhui.smart.feeder.config",
}
,excludeFilters = {@ComponentScan.Filter(type= FilterType.ASSIGNABLE_TYPE,classes = {ResourcesConfig.class})}
,excludeFilters = {@ComponentScan.Filter(type= FilterType.ASSIGNABLE_TYPE,classes = {ResourcesConfig.class, CameraController.class, ConfigController.class})}
)
@EnableScheduling
@SpringBootApplication(exclude = { DataSourceAutoConfiguration.class})
... ...
//package com.zhonglai.luhui.smart.feeder.config;
//
//
//import com.google.gson.Gson;
//import com.ruoyi.common.utils.GsonConstructor;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.boot.autoconfigure.http.HttpMessageConverters;
//import org.springframework.context.annotation.Configuration;
//import org.springframework.http.converter.HttpMessageConverter;
//import org.springframework.http.converter.json.GsonHttpMessageConverter;
//import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
//
//import java.util.ArrayList;
//import java.util.List;
//
//
//@Configuration
//public class HttpMessageConverterConfig {
// @Autowired
// public void configureHttpMessageConverters(HttpMessageConverters converters, Gson gson) {
// List<HttpMessageConverter<?>> converterList = new ArrayList<>(converters.getConverters());
// for (HttpMessageConverter<?> converter : converterList) {
// if (converter instanceof MappingJackson2HttpMessageConverter) {
// converterList.remove(converter);
// break;
// }
// }
// converterList.add(new GsonHttpMessageConverter(gson));
// }
//
//}
... ...
... ... @@ -2,11 +2,8 @@ package com.zhonglai.luhui.smart.feeder.controller;
import com.ruoyi.common.core.domain.AjaxResult;
import com.zhonglai.luhui.smart.feeder.config.WebSocketClien;
import com.zhonglai.luhui.smart.feeder.dto.ConfigurationParameter;
import com.zhonglai.luhui.smart.feeder.dto.VeiwType;
import com.zhonglai.luhui.smart.feeder.service.ConfigurationParameterService;
import com.zhonglai.luhui.smart.feeder.dto.ModbusDto;
import com.zhonglai.luhui.smart.feeder.service.DeviceService;
import com.zhonglai.luhui.smart.feeder.service.FishGroupImageRecognitionService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
... ... @@ -68,7 +65,9 @@ public class CameraController {
@ApiOperation("串口发送指令")
@GetMapping("/sendSerialData")
public AjaxResult sendSerialData(String hexStr) throws IOException {
return AjaxResult.success().put("data",deviceService.sendData(hexStr));
hexStr = hexStr.replace(" ","").trim();
ModbusDto commdDto = deviceService.sendData(hexStr);
return AjaxResult.success(commdDto);
}
@ApiOperation("获取所有串口")
... ... @@ -77,4 +76,5 @@ public class CameraController {
return AjaxResult.success().put("data",deviceService.getAllSerial());
}
}
... ...
package com.zhonglai.luhui.smart.feeder.controller;
import com.ruoyi.common.core.domain.AjaxResult;
import com.zhonglai.luhui.dao.service.PublicService;
import com.zhonglai.luhui.smart.feeder.domain.Register;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.ArrayList;
import java.util.List;
@Api(tags = "寄存器管理")
@RestController
@RequestMapping("/register")
public class RegisterConreoller {
@Autowired
private PublicService publicService;
@ApiOperation("初始化定时器解析规则")
@GetMapping("/iniTimer")
public AjaxResult iniTimer()
{
List<Register> list = new ArrayList<>();
int startaddress = 23;
for(int i=0;i<24;i++)
{
Register register = new Register();
register.setAddress(startaddress+i);
register.setClas("java.lang.String");
register.setName("开启分钟");
register.setStart_char(0);
register.setChar_lenth(8);
register.setField_name("timer"+(register.getAddress()-22+1)+"_start_m");
Register register1 = new Register();
register1.setAddress(startaddress+i);
register1.setClas("java.lang.String");
register1.setName("开启小时");
register1.setStart_char(8);
register1.setChar_lenth(6);
register1.setField_name("timer"+(register.getAddress()-22+1)+"_start_h");
Register register2 = new Register();
register2.setAddress(startaddress+i);
register2.setClas("java.lang.Integer");
register2.setName("使能");
register2.setStart_char(14);
register2.setChar_lenth(1);
register2.setField_name("timer"+(register.getAddress()-22+1)+"_if_start");
Register register3 = new Register();
register3.setAddress(startaddress+i);
register3.setClas("java.lang.Integer");
register3.setName("有效");
register3.setStart_char(15);
register3.setChar_lenth(1);
register3.setField_name("timer"+(register.getAddress()-22+1)+"_is_start");
Register register4 = new Register();
register4.setAddress(startaddress+i);
register4.setClas("java.lang.String");
register4.setName("关闭分钟");
register4.setStart_char(0);
register4.setChar_lenth(8);
register4.setField_name("timer"+(register.getAddress()-22+1)+"_close_m");
Register register5 = new Register();
register5.setAddress(startaddress+i);
register5.setClas("java.lang.String");
register5.setName("关闭小时");
register5.setStart_char(8);
register5.setChar_lenth(6);
register5.setField_name("timer"+(register.getAddress()-22+1)+"_close_h");
Register register6 = new Register();
register6.setAddress(startaddress+i);
register6.setClas("java.lang.Integer");
register6.setName("使能");
register6.setStart_char(14);
register6.setChar_lenth(1);
register6.setField_name("timer"+(register.getAddress()-22+1)+"_if_close");
Register register7 = new Register();
register7.setAddress(startaddress+i);
register7.setClas("java.lang.Integer");
register7.setName("有效");
register7.setStart_char(15);
register7.setChar_lenth(1);
register7.setField_name("timer"+(register.getAddress()-22+1)+"_is_close");
list.add(register);
list.add(register1);
list.add(register2);
list.add(register3);
list.add(register4);
list.add(register5);
list.add(register6);
list.add(register7);
}
return AjaxResult.success(publicService.insertAll(list));
}
}
... ...
package com.zhonglai.luhui.smart.feeder.domain;
import lombok.Data;
/**
* 寄存器
*/
@Data
public class Register {
private Integer address;
private String name;
private Integer start_char;
public Integer char_lenth;
public String field_name;
public String clas;
}
... ...
package com.zhonglai.luhui.smart.feeder.dto;
import java.io.Serializable;
public class CacheConfigurationObject extends Object implements Serializable {
public CacheConfigurationObject()
{
}
}
... ... @@ -2,8 +2,11 @@ package com.zhonglai.luhui.smart.feeder.dto;
import lombok.Data;
import java.io.Serializable;
@Data
public class ConfigDto {
public class ConfigDto implements Serializable {
private static final long serialVersionUID = 4437689065039524585L;
private ConfigurationParameter configurationParameter;
private Object value;
}
... ...
package com.zhonglai.luhui.smart.feeder.dto;
import com.alibaba.fastjson.JSONObject;
import java.util.ArrayList;
import java.util.HashMap;
public enum ConfigurationParameter {
ifVeiw(false, Boolean.class,"sys_config"),//是否显示
captureNumber(0, Integer.class,"sys_config"),//摄像头编号
reflectionThreshold(100, Integer.class,"sys_config"),//反光阈值
kernelSize(3, Integer.class,"sys_config"),//去噪调整内核大小,用来消除小的物体或噪声
maxValue(255.0, Double.class,"sys_config"), //最大反光阈值
gear_command (new HashMap<Integer,String>(),HashMap.class,"gear_command"), //档位对应的指令
absValue_command (new ArrayList<FishCurveControlCondition>(),ArrayList.class,"absValue_command"), //斜率范围对应的档位
VeiwDto_isFrame(false, Boolean.class,"sys_config"), //是否显示原图
VeiwDto_isBinaryImage(false, Boolean.class,"sys_config"), //是否显示临时图
VeiwDto_isSize(false, Boolean.class,"sys_config"), //是否显示面积
VeiwDto_isAbsValue(false, Boolean.class,"sys_config"), //是否显示斜率
absValue(0.0, Double.class,"sys_config"), //显示斜率
FishGroupImageRecognition(true, Boolean.class,"sys_config"), //鱼群图像识别是否开启
FeedingControl(true, Boolean.class,"sys_config"), //鱼群图像识别投料控制是否开启
SerialPortConfig(new SerialPortConfig().defaultSerialPortConfig(),com.zhonglai.luhui.smart.feeder.dto.SerialPortConfig.class,"sys_config"),//串口配置
ifVeiw(false, Boolean.class,"sys_config","是否显示"),//是否显示
captureNumber(0, Integer.class,"sys_config","摄像头编号"),//摄像头编号
reflectionThreshold(100, Integer.class,"sys_config","反光阈值"),//反光阈值
kernelSize(3, Integer.class,"sys_config","去噪调整内核大小,用来消除小的物体或噪声"),//去噪调整内核大小,用来消除小的物体或噪声
maxValue(255, Integer.class,"sys_config","最大反光阈值"), //最大反光阈值
gear_command (new HashMap<String,String>(),HashMap.class,"gear_command","档位对应的指令"), //档位对应的指令
absValue_command (new ArrayList<FishCurveControlCondition>(),ArrayList.class,"absValue_command","斜率范围对应的档位"), //斜率范围对应的档位
VeiwDto_isFrame(false, Boolean.class,"sys_config","是否显示原图"), //是否显示原图
VeiwDto_isBinaryImage(false, Boolean.class,"sys_config","是否显示临时图"), //是否显示临时图
VeiwDto_isSize(false, Boolean.class,"sys_config","是否显示面积"), //是否显示面积
VeiwDto_isAbsValue(false, Boolean.class,"sys_config","是否显示斜率"), //是否显示斜率
absValue(0.0, Double.class,"sys_config","显示斜率"), //显示斜率
FishGroupImageRecognition(true, Boolean.class,"sys_config","鱼群图像识别是否开启"), //鱼群图像识别是否开启
FeedingControl(true, Boolean.class,"sys_config","鱼群图像识别投料控制是否开启"), //鱼群图像识别投料控制是否开启
SerialPortConfig(new SerialPortConfig().defaultSerialPortConfig(),com.zhonglai.luhui.smart.feeder.dto.SerialPortConfig.class,"sys_config","串口配置"),//串口配置
;
private Object value;
private Class<?> valuType;
private String tableName;
ConfigurationParameter(Object value,Class valuType,String tableName) {
private String describe;
ConfigurationParameter(Object value,Class valuType,String tableName,String describe) {
this.value = value;
this.valuType = valuType;
this.tableName = tableName;
this.describe = describe;
}
public Object getValue()
... ... @@ -44,4 +50,25 @@ public enum ConfigurationParameter {
public String getTableName() {
return tableName;
}
public String getDescribe() {
return describe;
}
public String valueToString(Object o)
{
switch (getValuType().getName()) {
case "java.lang.Boolean":
return ((Boolean)o).toString();
case "java.lang.Integer":
return o+"";
case "java.lang.Double":
return o+"";
case "com.zhonglai.luhui.smart.feeder.dto.SerialPortConfig":
return JSONObject.toJSONString(o);
default:
throw new RuntimeException("配置参数类型不正确" + name() + o);
}
}
}
... ...
package com.zhonglai.luhui.smart.feeder.dto;
import java.io.Serializable;
/**
* 斜率范围对应的档位
*/
public class FishCurveControlCondition {
public class FishCurveControlCondition implements Serializable {
private static final long serialVersionUID = 1690616650540655976L;
private Integer sartAbsValue; //开始斜率
private Integer gear; //档位
... ...
package com.zhonglai.luhui.smart.feeder.dto;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.ruoyi.common.utils.ByteUtil;
import com.ruoyi.common.utils.GsonConstructor;
import lombok.Data;
import org.apache.commons.lang3.ArrayUtils;
import java.io.Serializable;
import java.util.HashMap;
import java.util.Map;
/**
* Modbus协议
*/
@Data
public class ModbusDto implements Serializable {
private static final long serialVersionUID = -6008279428004571734L;
protected String hstr;
protected Integer address; //地址位
protected Integer commdcode; //功能码
protected byte[] data; //数据
protected String crc; //16CRC 码
public ModbusDto()
{
}
public ModbusDto(byte[] bytes)
{
this.hstr = ByteUtil.toHexString(bytes);
byte[] headAndData = ArrayUtils.subarray(bytes,0,bytes.length-2);
byte[] crcByte = ArrayUtils.subarray(bytes,bytes.length-2,bytes.length);
this.crc = ByteUtil.toHexString(crcByte).toUpperCase();
// 校验CRC
if (!ByteUtil.getCRC16(headAndData).equals(crc)) {
System.out.println("CRC校验失败");
return ;
}
this.address = Math.toIntExact(ByteUtil.bytesToLongDESC(headAndData, 0, 1));
this.commdcode = Math.toIntExact(ByteUtil.bytesToLongDESC(headAndData, 1, 1));
this.data = ArrayUtils.subarray(headAndData,2,headAndData.length);;
}
public ModbusDto(String str) {
new ModbusDto(ByteUtil.hexStringToByte(str));
}
// 计算CRC校验码
public static String generateLRC(byte[] data)
{
return ByteUtil.toHexString(ByteUtil.intToBytesASC(getLRC(data),1));
}
public static byte getLRC(byte[] data) {
int tmp = 0;
for (int i = 0; i < data.length; i++) {
tmp = tmp + (byte) data[i];
}
tmp = ~tmp;
tmp = (tmp & (0xff));
tmp += 1;
return (byte) tmp;
}
public static void main(String[] args) {
String hexData = "01 03 8E 00 01 00 04 FF E0 00 00 00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 00 07 00 03 00 00 00 1D 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00".replace(" ","");
String crc = ByteUtil.getCRC16(ByteUtil.hexStringToByte(hexData));
System.out.println(crc);
Map<Integer,String> map = new HashMap<>();
map.put(1,"ssss");
map.put(2,"eae");
try {
System.out.println(new ObjectMapper().writeValueAsString(map));
} catch (JsonProcessingException e) {
throw new RuntimeException(e);
}
}
}
... ...
... ... @@ -2,7 +2,10 @@ package com.zhonglai.luhui.smart.feeder.dto;
import org.opencv.core.Mat;
public class VeiwDto {
import java.io.Serializable;
public class VeiwDto implements Serializable {
private static final long serialVersionUID = -6059514681715227839L;
private Mat frame; //原始图像
private Mat binaryImage; //临时图像
private Integer size; //面积大小
... ...
package com.zhonglai.luhui.smart.feeder.dto.commd;
import java.io.Serializable;
public interface FeederCommd extends Serializable {
}
... ...
package com.zhonglai.luhui.smart.feeder.dto.commd;
import com.ruoyi.common.utils.ByteUtil;
import org.apache.commons.lang3.ArrayUtils;
import java.io.Serializable;
import java.util.HashMap;
import java.util.Map;
public class FeederCommd03Request implements FeederCommd {
private static final long serialVersionUID = 200980498094314547L;
private Integer lenth;
private Map<Integer,byte[]> addressValue = new HashMap<>();
public FeederCommd03Request(byte[] data)
{
lenth = new Long(ByteUtil.bytesToLongDESC(data,0,1)).intValue()/2;
for (int i=0;i<lenth;i++)
{
byte[] bytes = ArrayUtils.subarray(data,1+2*i,1+2*i+2);
addressValue.put(i, bytes);
}
}
}
... ...
package com.zhonglai.luhui.smart.feeder.dto.commd;
import com.zhonglai.luhui.smart.feeder.dto.ModbusDto;
import lombok.Data;
import java.io.Serializable;
import java.util.HashMap;
import java.util.Map;
/**
* 投料机协议Modbus
*/
@Data
public class FeederCommdDto extends ModbusDto {
private static final long serialVersionUID = -2783135648395348130L;
private Integer quantity; //寄存器数量
private Map<Integer,byte[]> value = new HashMap<>(); //
private FeederCommd feederCommd;
public FeederCommdDto(byte[] bytes) {
super(bytes);
switch (commdcode)
{
case 0x03:
feederCommd = new FeederCommd03Request(this.data);
break;
case 0x06:
break;
case 0x10:
break;
}
}
public FeederCommdDto() {
super();
}
public FeederCommdDto(String str) {
super(str);
}
}
... ...
package com.zhonglai.luhui.smart.feeder.service;
import com.ruoyi.common.utils.StringUtils;
import cn.hutool.core.bean.BeanUtil;
import com.zhonglai.luhui.smart.feeder.dto.ConfigurationParameter;
import com.zhonglai.luhui.smart.feeder.dto.FishCurveControlCondition;
import org.ehcache.Cache;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.PostConstruct;
import java.util.ArrayList;
... ... @@ -40,13 +39,13 @@ public class ConfigurationParameterService {
}
List<Map<String,Object>> gearCommandList = sqliteService.getAllGearCommand();
Map<Integer,String> gearCommandMap = new HashMap<Integer,String>();
Map<String,String> gearCommandMap = new HashMap<String,String>();
if(null != gearCommandList && gearCommandList.size() != 0)
{
for(Map<String,Object> map:gearCommandList)
{
gearCommandMap.put((Integer) map.get("gear"),(String)map.get("command"));
gearCommandMap.put(map.get("gear")+"",(String)map.get("command"));
}
}
... ... @@ -74,12 +73,26 @@ public class ConfigurationParameterService {
switch (configurationParameter)
{
case gear_command:
setGearCommandMap((Map<Integer, String>) value);
setGearCommandMap((Map<String, String>) value);
break;
case absValue_command:
if(value instanceof ArrayList)
{
setabsValueCommandList((List<FishCurveControlCondition>) value);
List<FishCurveControlCondition> slist = new ArrayList<>();
for(Object object:(List) value)
{
if(object instanceof FishCurveControlCondition)
{
slist = (List) value;
break;
}else if (object instanceof HashMap)
{
FishCurveControlCondition fishCurveControlCondition = BeanUtil.mapToBean((HashMap)object,FishCurveControlCondition.class,false,null);
slist.add(fishCurveControlCondition);
}
}
setabsValueCommandList(slist);
}else if(value instanceof FishCurveControlCondition)
{
setabsValueCommand((FishCurveControlCondition) value);
... ... @@ -88,44 +101,51 @@ public class ConfigurationParameterService {
}
break;
default:
ehCacheService.writeToCache(configurationParameter,value);
sqliteService.updateConfigurationParameter(configurationParameter,value);
setDefaultCommandMap(configurationParameter,value);
}
}
public Object getConfig(ConfigurationParameter configurationParameter)
{
return ehCacheService.readFromCache(configurationParameter);
}
private void setGearCommandMap(Map<Integer,String> gearCommandMap)
private void setDefaultCommandMap(ConfigurationParameter configurationParameter,Object value)
{
ehCacheService.writeToCache(configurationParameter,value);
sqliteService.updateConfigurationParameter(configurationParameter,value);
}
private void setGearCommandMap(Map<String,String> gearCommandMap)
{
Map<Integer,String> old = (Map<Integer, String>) ehCacheService.readFromCache(ConfigurationParameter.gear_command);
Map<String,String> old = (Map<String, String>) ehCacheService.readFromCache(ConfigurationParameter.gear_command);
if(null == old)
{
old = gearCommandMap;
}
for (Integer key:gearCommandMap.keySet())
for (String key:gearCommandMap.keySet())
{
sqliteService.updateGearCommand(key,gearCommandMap.get(key));
sqliteService.updateGearCommand(Integer.parseInt(key),gearCommandMap.get(key));
old.put(key,gearCommandMap.get(key));
}
ehCacheService.writeToCache(ConfigurationParameter.gear_command,old);
}
private void setabsValueCommandList(List<FishCurveControlCondition> absValueCommandList)
{
List<FishCurveControlCondition> old = (List<FishCurveControlCondition>) ehCacheService.readFromCache(ConfigurationParameter.absValue_command);
if(null == old)
{
old = absValueCommandList;
}
ehCacheService.writeToCache(ConfigurationParameter.absValue_command,old);
sqliteService.deleteabsValueCommandAll();
ehCacheService.readFromCache(ConfigurationParameter.absValue_command);
for (FishCurveControlCondition fishCurveControlCondition:absValueCommandList)
{
sqliteService.updateabsValueCommand(fishCurveControlCondition.getGear(),fishCurveControlCondition.getSartAbsValue());
}
ehCacheService.writeToCache(ConfigurationParameter.absValue_command,absValueCommandList);
}
private void setabsValueCommand(FishCurveControlCondition absValueCommand)
... ...
package com.zhonglai.luhui.smart.feeder.service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import javax.annotation.PostConstruct;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
/**
* 数据监听服务
*/
@Service
public class DateListenService {
@Autowired
private ScheduledExecutorService scheduledExecutorService;
@PostConstruct
public void run()
{
scheduledExecutorService.scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
}
},1,60, TimeUnit.SECONDS);
}
}
... ...
... ... @@ -2,16 +2,14 @@ package com.zhonglai.luhui.smart.feeder.service;
import com.ruoyi.common.utils.GsonConstructor;
import com.ruoyi.common.utils.StringUtils;
import com.zhonglai.luhui.smart.feeder.dto.ConfigurationParameter;
import com.zhonglai.luhui.smart.feeder.dto.FishCurveControlCondition;
import com.zhonglai.luhui.smart.feeder.dto.SerialPortConfig;
import com.zhonglai.luhui.smart.feeder.dto.*;
import com.zhonglai.luhui.smart.feeder.dto.commd.FeederCommdDto;
import com.zhonglai.luhui.smart.feeder.util.serial.SerialTool;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import purejavacomm.SerialPort;
import purejavacomm.SerialPortEvent;
import javax.annotation.PostConstruct;
import java.io.IOException;
... ... @@ -33,7 +31,7 @@ public class DeviceService {
// 锁对象
private final Object lock = new Object();
// 用于存储串口返回的数据,使用线程安全的队列
private BlockingQueue<String> dataQueue = new LinkedBlockingQueue<>();
private BlockingQueue<ModbusDto> dataQueue = new LinkedBlockingQueue<>();
private Double backArea; //上一个大小
... ... @@ -182,25 +180,12 @@ public class DeviceService {
}
serialPort = SerialTool.openPort(portName,baudrate,dataBits,stopBits,parity);
SerialTool.addListener(serialPortEvent -> {
switch (serialPortEvent.getEventType())
{
case SerialPortEvent.DATA_AVAILABLE:
byte[] readBuffer = null;
int availableBytes = 0;
try {
availableBytes = serialPort.getInputStream().available();
if (availableBytes > 0) {
try {
readBuffer = SerialTool.readFromPort(serialPort);
String data = SerialTool.bytesToHexString(readBuffer);
dataQueue.offer(data); // 将数据添加到队列中// 处理串口返回的数据
} catch (Exception e) {
logger.error("读取推送信息异常!"+e);
}
}
} catch (IOException e) {
logger.error("读取流信息异常!"+e);
}
try {
Thread.sleep(500);
FeederCommdDto commdDto = new FeederCommdDto(SerialTool.readFromPort(serialPort));
dataQueue.offer(commdDto); // 将数据添加到队列中// 处理串口返回的数据
} catch (Exception e) {
logger.error("返回数据处理异常",e);
}
}, serialPort);
}
... ... @@ -210,12 +195,12 @@ public class DeviceService {
* @param hexStr
* @throws IOException
*/
public String sendData(String hexStr) throws IOException {
public ModbusDto sendData(String hexStr) throws IOException {
synchronized (lock)
{
SerialTool.sendToPort(SerialTool.HexString2Bytes(hexStr),serialPort);
try {
String reStr = dataQueue.take();
ModbusDto reStr = dataQueue.poll(15,TimeUnit.SECONDS);
return reStr;
} catch (InterruptedException e) {
logger.error("等待串口返回数据异常!" + e);
... ... @@ -224,4 +209,6 @@ public class DeviceService {
return null;
}
}
... ...
... ... @@ -70,7 +70,6 @@ public class EhCacheService {
myCache.put(key.name(), cls.cast(value));
}else if(value instanceof String)
{
switch (cls.getName())
{
case "java.lang.Boolean":
... ...
... ... @@ -141,9 +141,15 @@ public class FishGroupImageRecognitionService {
// 逐帧处理视频
Mat frame = new Mat();
scheduledExecutorService.scheduleWithFixedDelay(() -> {
if (((Boolean)configurationParameterService.getConfig(ConfigurationParameter.FishGroupImageRecognition)) && videoCapture.read(frame)) {
identify(frame,largestContour);
try {
if (((Boolean)configurationParameterService.getConfig(ConfigurationParameter.FishGroupImageRecognition)) && videoCapture.read(frame)) {
identify(frame,largestContour);
}
}catch (Exception e)
{
logger.error("检测摄像头异常",e);
}
},0,1, TimeUnit.SECONDS);
}
... ... @@ -238,7 +244,7 @@ public class FishGroupImageRecognitionService {
// 检测反光
Mat binaryImage = new Mat();
Imgproc.threshold(grayImage, binaryImage, reflectionThreshold, (Double) configurationParameterService.getConfig(ConfigurationParameter.maxValue), Imgproc.THRESH_BINARY);
Imgproc.threshold(grayImage, binaryImage, reflectionThreshold, (Integer) configurationParameterService.getConfig(ConfigurationParameter.maxValue), Imgproc.THRESH_BINARY);
// 进行形态学操作,去除噪点
Mat kernel = Imgproc.getStructuringElement(Imgproc.MORPH_RECT, new Size((Integer) configurationParameterService.getConfig(ConfigurationParameter.kernelSize),(Integer) configurationParameterService.getConfig(ConfigurationParameter.kernelSize)));
... ...
package com.zhonglai.luhui.smart.feeder.service;
import org.eclipse.paho.client.mqttv3.IMqttDeliveryToken;
import org.eclipse.paho.client.mqttv3.MqttCallbackExtended;
import org.eclipse.paho.client.mqttv3.MqttException;
import org.eclipse.paho.client.mqttv3.MqttMessage;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
@Component
public class MqttCallback implements MqttCallbackExtended {
private static final Logger log = LoggerFactory.getLogger(MqttCallback.class);
@Override
public void connectComplete(boolean b, String s) {
log.info("连接成功");
}
@Override
public void connectionLost(Throwable cause) {
log.error("连接丢失",cause);
}
@Override
public void messageArrived(String topic, MqttMessage message) throws Exception {
}
@Override
public void deliveryComplete(IMqttDeliveryToken token) {
// 成功发出消息
try {
log.info("成功发出消息 messageid{}",token.getMessage());
} catch (MqttException e) {
e.printStackTrace();
}
}
}
... ...
package com.zhonglai.luhui.smart.feeder.service;
import com.alibaba.fastjson.JSONObject;
import com.ruoyi.common.utils.GsonConstructor;
import com.zhonglai.luhui.dao.service.PublicService;
import com.zhonglai.luhui.smart.feeder.dto.ConfigurationParameter;
import com.zhonglai.luhui.smart.feeder.dto.FishCurveControlCondition;
... ... @@ -153,14 +155,21 @@ public class SqliteService {
switch (key)
{
case gear_command:
Map<Integer,String> map = (Map<Integer, String>) value;
// publicService.updateBySql("update set ")
Map<String,String> map = (Map<String, String>) value;
for(String gear:map.keySet())
{
updateGearCommand(Integer.parseInt(gear),map.get(gear));
}
break;
case absValue_command:
List<FishCurveControlCondition> list = (List<FishCurveControlCondition>) value;
for(FishCurveControlCondition fishCurveControlCondition:list)
{
updateabsValueCommand(fishCurveControlCondition.getGear(),fishCurveControlCondition.getSartAbsValue());
}
break;
default:
updateSysConfig(key, key.valueToString(value));
break;
}
}
... ... @@ -168,19 +177,23 @@ public class SqliteService {
public void updateSysConfig(ConfigurationParameter key,String value)
{
publicService.updateBySql("delete from sys_config where parameter_name='"+key.name()+"'");
publicService.updateBySql("insert into sys_config('"+key.name()+"','"+value+"')");
publicService.updateBySql("insert into sys_config(`parameter_name`,`parameter_value`,`describe`) values ('"+key.name()+"','"+value+"','"+key.getDescribe()+"')");
}
public void updateGearCommand(Integer gear,String command)
{
publicService.updateBySql("delete from gear_command where gear="+gear+"");
publicService.updateBySql("insert into gear_command("+gear+",'"+command+"')");
publicService.updateBySql("insert into gear_command(`gear`,`command`) values ("+gear+",'"+command+"')");
}
public void updateabsValueCommand(Integer gear,Integer sartAbsValue)
{
publicService.updateBySql("delete from absValue_command where gear="+gear+"");
publicService.updateBySql("insert into absValue_command("+gear+",'"+sartAbsValue+"')");
publicService.updateBySql("delete from absValue_command where sartAbsValue="+sartAbsValue+"");
publicService.updateBySql("insert into absValue_command(`gear`,`sartAbsValue`) values ("+gear+",'"+sartAbsValue+"')");
}
public void deleteabsValueCommandAll()
{
publicService.updateBySql("delete from absValue_command ");
}
}
... ...
package com.zhonglai.luhui.smart.feeder.service;
import org.eclipse.paho.client.mqttv3.MqttClient;
import org.eclipse.paho.client.mqttv3.MqttConnectOptions;
import org.eclipse.paho.client.mqttv3.MqttException;
import org.eclipse.paho.client.mqttv3.MqttMessage;
import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import javax.annotation.PostConstruct;
import java.util.ArrayList;
import java.util.List;
/**
* 终端服务
*/
@Service
public class TerminalService {
private static final Logger log = LoggerFactory.getLogger(TerminalService.class);
private MqttClient mqttclient;
private MqttConnectOptions options;
@Autowired
private MqttCallback mqttCallback;
@Value("${mqtt.broker}")
private String broker;
@Value("${mqtt.clientId}")
private String clientId;
@Value("#{'${mqtt.topics}'.split(',')}")
private List<String> topics;
@Value("${mqtt.sub_clientid}")
private String sub_clientid;
@Value("#{'${mqtt.mqtt_usernames}'.split(',')}")
private List<String> mqtt_usernames;
@Value("${mqtt.roleid}")
private String roleid;
@Value("${mqtt.username}")
private String username;
@Value("${mqtt.password}")
private String password;
@PostConstruct
public void startMqttListenerService() throws MqttException{
log.info("-----------开始启动mqtt监听服务--------------------");
init();
}
private void init() throws MqttException {
if(null == mqttclient)
{
mqttclient = new MqttClient(broker, clientId, new MemoryPersistence());
}
options = new MqttConnectOptions();
options.setCleanSession(true);
options.setConnectionTimeout(15);
//设置断开后重新连接
options.setAutomaticReconnect(true);
mqttclient.setCallback(mqttCallback);
}
private void connect() throws MqttException {
options.setUserName(username);
options.setPassword(password.toCharArray());
mqttclient.connect(options);
}
public void subscribe() throws MqttException {
List<String> ts = getCompletionTopics();
mqttclient.subscribe(ts.toArray(new String[ts.size()]));
}
public List<String> getCompletionTopics()
{
List<String> ts = new ArrayList<>();
for(String mqtt_username:mqtt_usernames)
{
StringBuffer topic = new StringBuffer();
topic.append("/");
topic.append(roleid);
topic.append("/");
topic.append(mqtt_username);
topic.append("/");
topic.append(sub_clientid);
topic.append("/");
topic.append("+");
for(String tc:topics)
{
StringBuffer t = new StringBuffer(topic);
t.append("/");
t.append(tc);
ts.add(t.toString());
}
}
return ts;
}
public void publish(String topic, MqttMessage message) throws MqttException {
mqttclient.publish(topic,message);
}
public void publish(String topic, String messageStr) throws MqttException {
MqttMessage message = new MqttMessage();
message.setPayload(messageStr.getBytes());
mqttclient.publish(topic,message);
}
}
... ...
package com.zhonglai.luhui.smart.feeder.service;
import com.alibaba.fastjson.JSONObject;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.utils.GsonConstructor;
import com.ruoyi.common.utils.StringUtils;
import com.zhonglai.luhui.smart.feeder.config.WebSocketClien;
... ... @@ -47,6 +49,7 @@ public class WebSocketSever {
WebSocketClien.webSocketSet.add(this);
WebSocketClien.sessionPool.put(userId, session);
log.info("建立连接完成,当前在线人数为:{}", WebSocketClien.webSocketSet.size());
sendMessageByUser(userId,AjaxResult.success("链接成功").toString());
}
/**
... ... @@ -114,7 +117,7 @@ public class WebSocketSever {
{
webSocketVO.setStateData(deviceService.getState());
}
session.getBasicRemote().sendText(GsonConstructor.get().toJson(webSocketVO));
session.getBasicRemote().sendText(JSONObject.toJSONString(webSocketVO));
} catch (IOException e) {
log.error("推送消息到指定用户发生错误:" + e.getMessage(), e);
}
... ...
# 开发环境配置 server: # 服务器的HTTP端口,默认为8080 port: 8064 servlet: # 应用的访问路径 context-path: / tomcat: # tomcat的URI编码 uri-encoding: UTF-8 # 连接数满后的排队数,默认为100 accept-count: 1000 threads: # tomcat最大线程数,默认为200 max: 800 # Tomcat启动初始化的线程数,默认值10 min-spare: 100 # 日志配置 logging: level: com.ruoyi: debug org.springframework: warn # Swagger配置 swagger: # 是否开启swagger enabled: true # 请求前缀 pathMapping: /dev-api # 防止XSS攻击 xss: # 过滤开关 enabled: true # 排除链接(多个用逗号分隔) excludes: /system/notice # 匹配链接 urlPatterns: /system/*,/monitor/*,/tool/* sys: staticPath: "file:E:/work/idea/Luhui/lh-modules/lh-smart-feeder/src/main/resources/static/" cacheFilePath: "E:/work/idea/Luhui/lh-modules/lh-smart-feeder/cache/" # MyBatis配置 mybatis: # 搜索指定包别名 typeAliasesPackage: com.ruoyi.**.domain,com.zhonglai.**.domain # 配置mapper的扫描,找到所有的mapper.xml映射文件 mapperLocations: classpath*:mapper/**/*Mapper.xml # 加载全局的配置文件 configLocation: classpath:mybatis/mybatis-config.xml # 数据源配置 spring: datasource: type: com.alibaba.druid.pool.DruidDataSource driverClassName: org.sqlite.JDBC druid: # 主库数据源 master: url: jdbc:sqlite:db/my.db username: password: # 从库数据源 slave: # 从数据源开关/默认关闭 enabled: false url: username: password: # 初始连接数 initialSize: 5 # 最小连接池数量 minIdle: 10 # 最大连接池数量 maxActive: 20 # 配置获取连接等待超时的时间 maxWait: 60000 # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 timeBetweenEvictionRunsMillis: 60000 # 配置一个连接在池中最小生存的时间,单位是毫秒 minEvictableIdleTimeMillis: 300000 # 配置一个连接在池中最大生存的时间,单位是毫秒 maxEvictableIdleTimeMillis: 900000 # 配置检测连接是否有效 validationQuery: SELECT 1 testWhileIdle: true testOnBorrow: false testOnReturn: false webStatFilter: enabled: true statViewServlet: enabled: true # 设置白名单,不填则允许所有访问 allow: url-pattern: /druid/* # 控制台管理用户名和密码 login-username: ruoyi login-password: 123456 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
# 开发环境配置 server: # 服务器的HTTP端口,默认为8080 port: 8064 servlet: # 应用的访问路径 context-path: / tomcat: # tomcat的URI编码 uri-encoding: UTF-8 # 连接数满后的排队数,默认为100 accept-count: 1000 threads: # tomcat最大线程数,默认为200 max: 800 # Tomcat启动初始化的线程数,默认值10 min-spare: 100 # 日志配置 logging: level: com.ruoyi: debug org.springframework: warn # Swagger配置 swagger: # 是否开启swagger enabled: true # 请求前缀 pathMapping: /dev-api # 防止XSS攻击 xss: # 过滤开关 enabled: true # 排除链接(多个用逗号分隔) excludes: /system/notice # 匹配链接 urlPatterns: /system/*,/monitor/*,/tool/* sys: staticPath: "file:E:/work/idea/Luhui/lh-modules/lh-smart-feeder/src/main/resources/static/" cacheFilePath: "E:/work/idea/Luhui/lh-modules/lh-smart-feeder/cache/" # MyBatis配置 mybatis: # 搜索指定包别名 typeAliasesPackage: com.ruoyi.**.domain,com.zhonglai.**.domain # 配置mapper的扫描,找到所有的mapper.xml映射文件 mapperLocations: classpath*:mapper/**/*Mapper.xml # 加载全局的配置文件 configLocation: classpath:mybatis/mybatis-config.xml # 数据源配置 spring: autoconfigure: exclude: org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration datasource: type: com.alibaba.druid.pool.DruidDataSource driverClassName: org.sqlite.JDBC druid: # 主库数据源 master: url: jdbc:sqlite:db/my.db username: password: # 从库数据源 slave: # 从数据源开关/默认关闭 enabled: false url: username: password: # 初始连接数 initialSize: 5 # 最小连接池数量 minIdle: 10 # 最大连接池数量 maxActive: 20 # 配置获取连接等待超时的时间 maxWait: 60000 # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 timeBetweenEvictionRunsMillis: 60000 # 配置一个连接在池中最小生存的时间,单位是毫秒 minEvictableIdleTimeMillis: 300000 # 配置一个连接在池中最大生存的时间,单位是毫秒 maxEvictableIdleTimeMillis: 900000 # 配置检测连接是否有效 validationQuery: SELECT 1 testWhileIdle: true testOnBorrow: false testOnReturn: false webStatFilter: enabled: true statViewServlet: enabled: true # 设置白名单,不填则允许所有访问 allow: url-pattern: /druid/* # 控制台管理用户名和密码 login-username: ruoyi login-password: 123456 filter: stat: enabled: true # 慢SQL记录 log-slow-sql: true slow-sql-millis: 1000 merge-sql: true wall: config: multi-statement-allow: true ## 数据源配置 #spring: # datasource: # type: com.alibaba.druid.pool.DruidDataSource # driverClassName: com.mysql.cj.jdbc.Driver # druid: # # 主库数据源 # master: # url: jdbc:mysql://rm-wz9740un21f09iokuao.mysql.rds.aliyuncs.com:3306/mqtt_broker?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 # username: luhui # password: Luhui586 # # 从库数据源 # slave: # # 从数据源开关/默认关闭 # enabled: true # url: jdbc:mysql://119.23.218.181:3306/lh-server-ops?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 # username: luhui # password: Luhui586 # # 初始连接数 # 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: ruoyi # login-password: 123456 # filter: # stat: # enabled: true # # 慢SQL记录 # log-slow-sql: true # slow-sql-millis: 1000 # merge-sql: true # wall: # config: # multi-statement-allow: true mqtt: #链接地址 broker: tcp://175.24.61.68:1883 #唯一标识 clientId: 70094a59d1d991d #公司id roleid: 2 mqtt_usernames: NWDB_2023 #订阅的topic topics: ADD_POST,ALL_POST,DB_TOPIC_DISTRIBUTE,GET/+,online,PUT_REQ/+,READ_REQ/+ sub_clientid: '70094a59d1d991d' topicconfig: "/{{roleid}}/{{username}}/{{clientid}}/{{payloadtype}}/{{topicType}}/{{messageid}}" top_return_map: '{"PUT":"PUT_REQ","READ":"READ_REQ"}' username: sysuser password: "!@#1qaz" client: #客户端操作时间 operationTime: 10
\ No newline at end of file
... ...
... ... @@ -340,6 +340,12 @@
<version>${ruoyi.version}</version>
</dependency>
<dependency>
<groupId>com.zhonglai.luhui</groupId>
<artifactId>lh-jar-order-service</artifactId>
<version>${ruoyi.version}</version>
</dependency>
<!-- 支持data -->
<dependency>
<groupId>org.projectlombok</groupId>
... ...