diff --git a/cloud-auth/src/main/resources/bootstrap.yml b/cloud-auth/src/main/resources/bootstrap.yml index 1eaec3e..f8ff18b 100644 --- a/cloud-auth/src/main/resources/bootstrap.yml +++ b/cloud-auth/src/main/resources/bootstrap.yml @@ -7,7 +7,7 @@ nacos: addr: 106.15.136.7:8848 user-name: nacos password: nacos - namespace: crj + namespace: lyb # Spring spring: application: diff --git a/cloud-gateway/src/main/resources/bootstrap.yml b/cloud-gateway/src/main/resources/bootstrap.yml index 5c23eb1..cf53ffc 100644 --- a/cloud-gateway/src/main/resources/bootstrap.yml +++ b/cloud-gateway/src/main/resources/bootstrap.yml @@ -7,7 +7,7 @@ nacos: addr: 106.15.136.7:8848 user-name: nacos password: nacos - namespace: crj + namespace: lyb # Spring spring: diff --git a/cloud-modules/cloud-modules-file/src/main/resources/bootstrap.yml b/cloud-modules/cloud-modules-file/src/main/resources/bootstrap.yml index ed3a86f..21cfa55 100644 --- a/cloud-modules/cloud-modules-file/src/main/resources/bootstrap.yml +++ b/cloud-modules/cloud-modules-file/src/main/resources/bootstrap.yml @@ -7,7 +7,7 @@ nacos: addr: 106.15.136.7:8848 user-name: nacos password: nacos - namespace: crj + namespace: lyb # Spring spring: diff --git a/cloud-modules/cloud-modules-gen/src/main/resources/bootstrap.yml b/cloud-modules/cloud-modules-gen/src/main/resources/bootstrap.yml index c2cac97..b2b68de 100644 --- a/cloud-modules/cloud-modules-gen/src/main/resources/bootstrap.yml +++ b/cloud-modules/cloud-modules-gen/src/main/resources/bootstrap.yml @@ -7,7 +7,7 @@ nacos: addr: 106.15.136.7:8848 user-name: nacos password: nacos - namespace: crj + namespace: lyb # Spring spring: diff --git a/cloud-modules/cloud-modules-system/src/main/resources/bootstrap.yml b/cloud-modules/cloud-modules-system/src/main/resources/bootstrap.yml index 369161d..9ba95a5 100644 --- a/cloud-modules/cloud-modules-system/src/main/resources/bootstrap.yml +++ b/cloud-modules/cloud-modules-system/src/main/resources/bootstrap.yml @@ -7,15 +7,9 @@ nacos: addr: 106.15.136.7:8848 user-name: nacos password: nacos - namespace: crj + namespace: lyb spring: - amqp: - deserialization: - trust: - all: true - main: - allow-bean-definition-overriding: true application: # 应用名称 name: cloud-system @@ -50,10 +44,6 @@ spring: - application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension} # 系统环境Config共享配置 - application-config-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension} - # xxl-job 配置文件 - - application-xxl-config-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension} - # rabbit 配置文件 - - application-rabbit-config-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension} logging: level: com.muyu.system.mapper: DEBUG diff --git a/cloud-visual/cloud-visual-monitor/src/main/resources/bootstrap.yml b/cloud-visual/cloud-visual-monitor/src/main/resources/bootstrap.yml index 6a9083d..a61db2e 100644 --- a/cloud-visual/cloud-visual-monitor/src/main/resources/bootstrap.yml +++ b/cloud-visual/cloud-visual-monitor/src/main/resources/bootstrap.yml @@ -7,7 +7,7 @@ nacos: addr: 106.15.136.7:8848 user-name: nacos password: nacos - namespace: crj + namespace: lyb # Spring spring: diff --git a/cloud-warn/pom.xml b/cloud-warn/pom.xml new file mode 100644 index 0000000..4b6edda --- /dev/null +++ b/cloud-warn/pom.xml @@ -0,0 +1,96 @@ + + + 4.0.0 + + com.muyu + cloud-server + 3.6.3 + + + cloud-warn + + + 17 + 17 + UTF-8 + + + + + + + com.alibaba.cloud + spring-cloud-starter-alibaba-nacos-discovery + + + + + com.alibaba.cloud + spring-cloud-starter-alibaba-nacos-config + + + + + com.alibaba.cloud + spring-cloud-starter-alibaba-sentinel + + + + + org.springframework.boot + spring-boot-starter-actuator + + + + + com.mysql + mysql-connector-j + + + + + com.muyu + cloud-common-datasource + + + + + com.muyu + cloud-common-datascope + + + + + com.muyu + cloud-common-log + + + + + com.muyu + cloud-common-api-doc + + + + + + ${project.artifactId} + + + org.springframework.boot + spring-boot-maven-plugin + + + + repackage + + + + + + + + + diff --git a/cloud-warn/src/main/java/com/muyu/warn/CloudWarnApplication.java b/cloud-warn/src/main/java/com/muyu/warn/CloudWarnApplication.java new file mode 100644 index 0000000..c9a6d4c --- /dev/null +++ b/cloud-warn/src/main/java/com/muyu/warn/CloudWarnApplication.java @@ -0,0 +1,21 @@ +package com.muyu.warn; + +import com.muyu.common.security.annotation.EnableCustomConfig; +import com.muyu.common.security.annotation.EnableMyFeignClients; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +/** + * 系统模块 + * + * @author muyu + */ +@EnableCustomConfig +//@EnableCustomSwagger2 +@EnableMyFeignClients +@SpringBootApplication +public class CloudWarnApplication { + public static void main (String[] args) { + SpringApplication.run(CloudWarnApplication.class, args); + } +} diff --git a/cloud-warn/src/main/java/com/muyu/warn/controller/WarnLogsController.java b/cloud-warn/src/main/java/com/muyu/warn/controller/WarnLogsController.java new file mode 100644 index 0000000..bf68ab5 --- /dev/null +++ b/cloud-warn/src/main/java/com/muyu/warn/controller/WarnLogsController.java @@ -0,0 +1,110 @@ +package com.muyu.warn.controller; + +import java.util.Arrays; +import java.util.List; +import jakarta.servlet.http.HttpServletResponse; +import javax.annotation.Resource; +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.muyu.common.security.annotation.RequiresPermissions; +import com.muyu.warn.domain.WarnLogs; +import com.muyu.warn.service.IWarnLogsService; +import com.muyu.common.core.web.controller.BaseController; +import com.muyu.common.core.domain.Result; +import com.muyu.common.core.utils.poi.ExcelUtil; +import com.muyu.common.security.utils.SecurityUtils; +import org.springframework.validation.annotation.Validated; +import com.muyu.common.core.web.page.TableDataInfo; + +/** + * 预警日志Controller + * + * @author muyu + * @date 2024-09-20 + */ +@RestController +@RequestMapping("/logs") +public class WarnLogsController extends BaseController +{ + @Resource + private IWarnLogsService warnLogsService; + + /** + * 查询预警日志列表 + */ + @RequiresPermissions("warn:logs:list") + @GetMapping("/list") + public Result> list(WarnLogs warnLogs) + { + startPage(); + List list = warnLogsService.selectWarnLogsList(warnLogs); + return getDataTable(list); + } + + /** + * 导出预警日志列表 + */ + @RequiresPermissions("warn:logs:export") + @PostMapping("/export") + public void export(HttpServletResponse response, WarnLogs warnLogs) + { + List list = warnLogsService.selectWarnLogsList(warnLogs); + ExcelUtil util = new ExcelUtil(WarnLogs.class); + util.exportExcel(response, list, "预警日志数据"); + } + + /** + * 获取预警日志详细信息 + */ + @RequiresPermissions("warn:logs:query") + @GetMapping(value = "/{id}") + public Result> getInfo(@PathVariable("id") Long id) + { + return success(warnLogsService.selectWarnLogsById(id)); + } + + /** + * 新增预警日志 + */ + @RequiresPermissions("warn:logs:add") + @PostMapping + public Result add( + @Validated @RequestBody WarnLogs warnLogs) + { + if (warnLogsService.checkIdUnique(warnLogs)) { + return error("新增 预警日志 '" + warnLogs + "'失败,预警日志已存在"); + } + return toAjax(warnLogsService.save(warnLogs)); + } + + /** + * 修改预警日志 + */ + @RequiresPermissions("warn:logs:edit") + @PutMapping + public Result edit( + @Validated @RequestBody WarnLogs warnLogs) + { + if (!warnLogsService.checkIdUnique(warnLogs)) { + return error("修改 预警日志 '" + warnLogs + "'失败,预警日志不存在"); + } + return toAjax(warnLogsService.updateById(warnLogs)); + } + + /** + * 删除预警日志 + */ + @RequiresPermissions("warn:logs:remove") + @DeleteMapping("/{ids}") + public Result remove(@PathVariable("ids") Long[] ids) + { + warnLogsService.removeBatchByIds(Arrays.asList(ids)); + return success(); + } +} diff --git a/cloud-warn/src/main/java/com/muyu/warn/controller/WarnRuleController.java b/cloud-warn/src/main/java/com/muyu/warn/controller/WarnRuleController.java new file mode 100644 index 0000000..a88ac08 --- /dev/null +++ b/cloud-warn/src/main/java/com/muyu/warn/controller/WarnRuleController.java @@ -0,0 +1,110 @@ +package com.muyu.warn.controller; + +import java.util.Arrays; +import java.util.List; +import jakarta.servlet.http.HttpServletResponse; +import javax.annotation.Resource; +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.muyu.common.security.annotation.RequiresPermissions; +import com.muyu.warn.domain.WarnRule; +import com.muyu.warn.service.IWarnRuleService; +import com.muyu.common.core.web.controller.BaseController; +import com.muyu.common.core.domain.Result; +import com.muyu.common.core.utils.poi.ExcelUtil; +import com.muyu.common.security.utils.SecurityUtils; +import org.springframework.validation.annotation.Validated; +import com.muyu.common.core.web.page.TableDataInfo; + +/** + * 预警规则Controller + * + * @author muyu + * @date 2024-09-20 + */ +@RestController +@RequestMapping("/rule") +public class WarnRuleController extends BaseController +{ + @Resource + private IWarnRuleService warnRuleService; + + /** + * 查询预警规则列表 + */ + @RequiresPermissions("warn:rule:list") + @GetMapping("/list") + public Result> list(WarnRule warnRule) + { + startPage(); + List list = warnRuleService.selectWarnRuleList(warnRule); + return getDataTable(list); + } + + /** + * 导出预警规则列表 + */ + @RequiresPermissions("warn:rule:export") + @PostMapping("/export") + public void export(HttpServletResponse response, WarnRule warnRule) + { + List list = warnRuleService.selectWarnRuleList(warnRule); + ExcelUtil util = new ExcelUtil(WarnRule.class); + util.exportExcel(response, list, "预警规则数据"); + } + + /** + * 获取预警规则详细信息 + */ + @RequiresPermissions("warn:rule:query") + @GetMapping(value = "/{id}") + public Result> getInfo(@PathVariable("id") Long id) + { + return success(warnRuleService.selectWarnRuleById(id)); + } + + /** + * 新增预警规则 + */ + @RequiresPermissions("warn:rule:add") + @PostMapping + public Result add( + @Validated @RequestBody WarnRule warnRule) + { + if (warnRuleService.checkIdUnique(warnRule)) { + return error("新增 预警规则 '" + warnRule + "'失败,预警规则已存在"); + } + return toAjax(warnRuleService.save(warnRule)); + } + + /** + * 修改预警规则 + */ + @RequiresPermissions("warn:rule:edit") + @PutMapping + public Result edit( + @Validated @RequestBody WarnRule warnRule) + { + if (!warnRuleService.checkIdUnique(warnRule)) { + return error("修改 预警规则 '" + warnRule + "'失败,预警规则不存在"); + } + return toAjax(warnRuleService.updateById(warnRule)); + } + + /** + * 删除预警规则 + */ + @RequiresPermissions("warn:rule:remove") + @DeleteMapping("/{ids}") + public Result remove(@PathVariable("ids") Long[] ids) + { + warnRuleService.removeBatchByIds(Arrays.asList(ids)); + return success(); + } +} diff --git a/cloud-warn/src/main/java/com/muyu/warn/controller/WarnStrategyController.java b/cloud-warn/src/main/java/com/muyu/warn/controller/WarnStrategyController.java new file mode 100644 index 0000000..fdc8542 --- /dev/null +++ b/cloud-warn/src/main/java/com/muyu/warn/controller/WarnStrategyController.java @@ -0,0 +1,110 @@ +package com.muyu.warn.controller; + +import java.util.Arrays; +import java.util.List; +import jakarta.servlet.http.HttpServletResponse; +import javax.annotation.Resource; +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.muyu.common.security.annotation.RequiresPermissions; +import com.muyu.warn.domain.WarnStrategy; +import com.muyu.warn.service.IWarnStrategyService; +import com.muyu.common.core.web.controller.BaseController; +import com.muyu.common.core.domain.Result; +import com.muyu.common.core.utils.poi.ExcelUtil; +import com.muyu.common.security.utils.SecurityUtils; +import org.springframework.validation.annotation.Validated; +import com.muyu.common.core.web.page.TableDataInfo; + +/** + * 预警策略Controller + * + * @author muyu + * @date 2024-09-20 + */ +@RestController +@RequestMapping("/strategy") +public class WarnStrategyController extends BaseController +{ + @Resource + private IWarnStrategyService warnStrategyService; + + /** + * 查询预警策略列表 + */ + @RequiresPermissions("warn:strategy:list") + @GetMapping("/list") + public Result> list(WarnStrategy warnStrategy) + { + startPage(); + List list = warnStrategyService.selectWarnStrategyList(warnStrategy); + return getDataTable(list); + } + + /** + * 导出预警策略列表 + */ + @RequiresPermissions("warn:strategy:export") + @PostMapping("/export") + public void export(HttpServletResponse response, WarnStrategy warnStrategy) + { + List list = warnStrategyService.selectWarnStrategyList(warnStrategy); + ExcelUtil util = new ExcelUtil(WarnStrategy.class); + util.exportExcel(response, list, "预警策略数据"); + } + + /** + * 获取预警策略详细信息 + */ + @RequiresPermissions("warn:strategy:query") + @GetMapping(value = "/{id}") + public Result> getInfo(@PathVariable("id") Long id) + { + return success(warnStrategyService.selectWarnStrategyById(id)); + } + + /** + * 新增预警策略 + */ + @RequiresPermissions("warn:strategy:add") + @PostMapping + public Result add( + @Validated @RequestBody WarnStrategy warnStrategy) + { + if (warnStrategyService.checkIdUnique(warnStrategy)) { + return error("新增 预警策略 '" + warnStrategy + "'失败,预警策略已存在"); + } + return toAjax(warnStrategyService.save(warnStrategy)); + } + + /** + * 修改预警策略 + */ + @RequiresPermissions("warn:strategy:edit") + @PutMapping + public Result edit( + @Validated @RequestBody WarnStrategy warnStrategy) + { + if (!warnStrategyService.checkIdUnique(warnStrategy)) { + return error("修改 预警策略 '" + warnStrategy + "'失败,预警策略不存在"); + } + return toAjax(warnStrategyService.updateById(warnStrategy)); + } + + /** + * 删除预警策略 + */ + @RequiresPermissions("warn:strategy:remove") + @DeleteMapping("/{ids}") + public Result remove(@PathVariable("ids") Long[] ids) + { + warnStrategyService.removeBatchByIds(Arrays.asList(ids)); + return success(); + } +} diff --git a/cloud-warn/src/main/java/com/muyu/warn/domain/WarnLogs.java b/cloud-warn/src/main/java/com/muyu/warn/domain/WarnLogs.java new file mode 100644 index 0000000..768a980 --- /dev/null +++ b/cloud-warn/src/main/java/com/muyu/warn/domain/WarnLogs.java @@ -0,0 +1,91 @@ +package com.muyu.warn.domain; + +import java.util.Date; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.muyu.common.core.annotation.Excel; +import com.muyu.common.core.web.domain.BaseEntity; +import lombok.*; +import lombok.experimental.SuperBuilder; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.annotation.IdType; + +/** + * 预警日志对象 warn_logs + * + * @author muyu + * @date 2024-09-20 + */ + +@Data +@Setter +@Getter +@SuperBuilder +@NoArgsConstructor +@AllArgsConstructor +@TableName("warn_logs") +public class WarnLogs{ + private static final long serialVersionUID = 1L; + + /** 预警日志id */ + @TableId( type = IdType.AUTO) + private Long id; + + /** 车辆vin码 */ + @Excel(name = "车辆vin码") + private String vin; + + /** 规则id */ + @Excel(name = "规则id") + private Long warnRuleId; + + /** 开始时间 */ + @JsonFormat(pattern = "yyyy-MM-dd") + @Excel(name = "开始时间", width = 30, dateFormat = "yyyy-MM-dd") + private Date startTime; + + /** 结束时间 */ + @JsonFormat(pattern = "yyyy-MM-dd") + @Excel(name = "结束时间", width = 30, dateFormat = "yyyy-MM-dd") + private Date endTime; + + /** 最大值 */ + @Excel(name = "最大值") + private Long maxValue; + + /** 最小值 */ + @Excel(name = "最小值") + private Long minValue; + + /** 平均值 */ + @Excel(name = "平均值") + private Long avgValue; + + /** 中位数 */ + @Excel(name = "中位数") + private Long medianValue; + + /** 是否发送预警 */ + @Excel(name = "是否发送预警") + private Long status; + + + + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) + .append("id", getId()) + .append("vin", getVin()) + .append("warnRuleId", getWarnRuleId()) + .append("startTime", getStartTime()) + .append("endTime", getEndTime()) + .append("maxValue", getMaxValue()) + .append("minValue", getMinValue()) + .append("avgValue", getAvgValue()) + .append("medianValue", getMedianValue()) + .append("status", getStatus()) + .toString(); + } +} diff --git a/cloud-warn/src/main/java/com/muyu/warn/domain/WarnRule.java b/cloud-warn/src/main/java/com/muyu/warn/domain/WarnRule.java new file mode 100644 index 0000000..7a02610 --- /dev/null +++ b/cloud-warn/src/main/java/com/muyu/warn/domain/WarnRule.java @@ -0,0 +1,77 @@ +package com.muyu.warn.domain; + +import com.muyu.common.core.annotation.Excel; +import com.muyu.common.core.web.domain.BaseEntity; +import lombok.*; +import lombok.experimental.SuperBuilder; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.annotation.IdType; + +/** + * 预警规则对象 warn_rule + * + * @author muyu + * @date 2024-09-20 + */ + +@Data +@Setter +@Getter +@SuperBuilder +@NoArgsConstructor +@AllArgsConstructor +@TableName("warn_rule") +public class WarnRule{ + private static final long serialVersionUID = 1L; + + /** 规则id */ + @TableId( type = IdType.AUTO) + private Long id; + + /** 规则名称 */ + @Excel(name = "规则名称") + private String ruleName; + + /** 策略id */ + @Excel(name = "策略id") + private Long strategyId; + + /** 报文数据类型id */ + @Excel(name = "报文数据类型id") + private Long msgTypeId; + + /** 滑窗时间 */ + @Excel(name = "滑窗时间") + private Long slideTime; + + /** 滑窗频率 */ + @Excel(name = "滑窗频率") + private Long slideFrequency; + + /** 最大值 */ + @Excel(name = "最大值") + private Long maxValue; + + /** 最小值 */ + @Excel(name = "最小值") + private Long minValue; + + + + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) + .append("id", getId()) + .append("ruleName", getRuleName()) + .append("strategyId", getStrategyId()) + .append("msgTypeId", getMsgTypeId()) + .append("slideTime", getSlideTime()) + .append("slideFrequency", getSlideFrequency()) + .append("maxValue", getMaxValue()) + .append("minValue", getMinValue()) + .toString(); + } +} diff --git a/cloud-warn/src/main/java/com/muyu/warn/domain/WarnStrategy.java b/cloud-warn/src/main/java/com/muyu/warn/domain/WarnStrategy.java new file mode 100644 index 0000000..8fe5d6c --- /dev/null +++ b/cloud-warn/src/main/java/com/muyu/warn/domain/WarnStrategy.java @@ -0,0 +1,57 @@ +package com.muyu.warn.domain; + +import com.muyu.common.core.annotation.Excel; +import com.muyu.common.core.web.domain.BaseEntity; +import lombok.*; +import lombok.experimental.SuperBuilder; +import org.apache.commons.lang3.builder.ToStringBuilder; +import org.apache.commons.lang3.builder.ToStringStyle; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.annotation.IdType; + +/** + * 预警策略对象 warn_strategy + * + * @author muyu + * @date 2024-09-20 + */ + +@Data +@Setter +@Getter +@SuperBuilder +@NoArgsConstructor +@AllArgsConstructor +@TableName("warn_strategy") +public class WarnStrategy{ + private static final long serialVersionUID = 1L; + + /** 策略id */ + @TableId( type = IdType.AUTO) + private Long id; + + /** 车辆类型id */ + @Excel(name = "车辆类型id") + private Long carTypeId; + + /** 策略名称 */ + @Excel(name = "策略名称") + private String strategyName; + + /** 报文模版id */ + @Excel(name = "报文模版id") + private Long msgId; + + + + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) + .append("id", getId()) + .append("carTypeId", getCarTypeId()) + .append("strategyName", getStrategyName()) + .append("msgId", getMsgId()) + .toString(); + } +} diff --git a/cloud-warn/src/main/java/com/muyu/warn/mapper/WarnLogsMapper.java b/cloud-warn/src/main/java/com/muyu/warn/mapper/WarnLogsMapper.java new file mode 100644 index 0000000..1046cea --- /dev/null +++ b/cloud-warn/src/main/java/com/muyu/warn/mapper/WarnLogsMapper.java @@ -0,0 +1,16 @@ +package com.muyu.warn.mapper; + +import com.muyu.warn.domain.WarnLogs; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Mapper; + +/** + * 预警日志Mapper接口 + * + * @author muyu + * @date 2024-09-20 + */ +@Mapper +public interface WarnLogsMapper extends BaseMapper{ + +} diff --git a/cloud-warn/src/main/java/com/muyu/warn/mapper/WarnRuleMapper.java b/cloud-warn/src/main/java/com/muyu/warn/mapper/WarnRuleMapper.java new file mode 100644 index 0000000..127e420 --- /dev/null +++ b/cloud-warn/src/main/java/com/muyu/warn/mapper/WarnRuleMapper.java @@ -0,0 +1,16 @@ +package com.muyu.warn.mapper; + +import com.muyu.warn.domain.WarnRule; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Mapper; + +/** + * 预警规则Mapper接口 + * + * @author muyu + * @date 2024-09-20 + */ +@Mapper +public interface WarnRuleMapper extends BaseMapper{ + +} diff --git a/cloud-warn/src/main/java/com/muyu/warn/mapper/WarnStrategyMapper.java b/cloud-warn/src/main/java/com/muyu/warn/mapper/WarnStrategyMapper.java new file mode 100644 index 0000000..37acc07 --- /dev/null +++ b/cloud-warn/src/main/java/com/muyu/warn/mapper/WarnStrategyMapper.java @@ -0,0 +1,16 @@ +package com.muyu.warn.mapper; + +import com.muyu.warn.domain.WarnStrategy; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.Mapper; + +/** + * 预警策略Mapper接口 + * + * @author muyu + * @date 2024-09-20 + */ +@Mapper +public interface WarnStrategyMapper extends BaseMapper{ + +} diff --git a/cloud-warn/src/main/java/com/muyu/warn/service/IWarnLogsService.java b/cloud-warn/src/main/java/com/muyu/warn/service/IWarnLogsService.java new file mode 100644 index 0000000..d642e13 --- /dev/null +++ b/cloud-warn/src/main/java/com/muyu/warn/service/IWarnLogsService.java @@ -0,0 +1,37 @@ +package com.muyu.warn.service; + +import java.util.List; +import com.muyu.warn.domain.WarnLogs; +import com.baomidou.mybatisplus.extension.service.IService; + +/** + * 预警日志Service接口 + * + * @author muyu + * @date 2024-09-20 + */ +public interface IWarnLogsService extends IService { + /** + * 精确查询预警日志 + * + * @param id 预警日志主键 + * @return 预警日志 + */ + public WarnLogs selectWarnLogsById(Long id); + + /** + * 查询预警日志列表 + * + * @param warnLogs 预警日志 + * @return 预警日志集合 + */ + public List selectWarnLogsList(WarnLogs warnLogs); + + /** + * 判断 预警日志 id是否唯一 + * @param warnLogs 预警日志 + * @return 结果 + */ + Boolean checkIdUnique(WarnLogs warnLogs); + +} diff --git a/cloud-warn/src/main/java/com/muyu/warn/service/IWarnRuleService.java b/cloud-warn/src/main/java/com/muyu/warn/service/IWarnRuleService.java new file mode 100644 index 0000000..38a502b --- /dev/null +++ b/cloud-warn/src/main/java/com/muyu/warn/service/IWarnRuleService.java @@ -0,0 +1,37 @@ +package com.muyu.warn.service; + +import java.util.List; +import com.muyu.warn.domain.WarnRule; +import com.baomidou.mybatisplus.extension.service.IService; + +/** + * 预警规则Service接口 + * + * @author muyu + * @date 2024-09-20 + */ +public interface IWarnRuleService extends IService { + /** + * 精确查询预警规则 + * + * @param id 预警规则主键 + * @return 预警规则 + */ + public WarnRule selectWarnRuleById(Long id); + + /** + * 查询预警规则列表 + * + * @param warnRule 预警规则 + * @return 预警规则集合 + */ + public List selectWarnRuleList(WarnRule warnRule); + + /** + * 判断 预警规则 id是否唯一 + * @param warnRule 预警规则 + * @return 结果 + */ + Boolean checkIdUnique(WarnRule warnRule); + +} diff --git a/cloud-warn/src/main/java/com/muyu/warn/service/IWarnStrategyService.java b/cloud-warn/src/main/java/com/muyu/warn/service/IWarnStrategyService.java new file mode 100644 index 0000000..cb395ed --- /dev/null +++ b/cloud-warn/src/main/java/com/muyu/warn/service/IWarnStrategyService.java @@ -0,0 +1,37 @@ +package com.muyu.warn.service; + +import java.util.List; +import com.muyu.warn.domain.WarnStrategy; +import com.baomidou.mybatisplus.extension.service.IService; + +/** + * 预警策略Service接口 + * + * @author muyu + * @date 2024-09-20 + */ +public interface IWarnStrategyService extends IService { + /** + * 精确查询预警策略 + * + * @param id 预警策略主键 + * @return 预警策略 + */ + public WarnStrategy selectWarnStrategyById(Long id); + + /** + * 查询预警策略列表 + * + * @param warnStrategy 预警策略 + * @return 预警策略集合 + */ + public List selectWarnStrategyList(WarnStrategy warnStrategy); + + /** + * 判断 预警策略 id是否唯一 + * @param warnStrategy 预警策略 + * @return 结果 + */ + Boolean checkIdUnique(WarnStrategy warnStrategy); + +} diff --git a/cloud-warn/src/main/java/com/muyu/warn/service/impl/WarnLogsServiceImpl.java b/cloud-warn/src/main/java/com/muyu/warn/service/impl/WarnLogsServiceImpl.java new file mode 100644 index 0000000..2780bc4 --- /dev/null +++ b/cloud-warn/src/main/java/com/muyu/warn/service/impl/WarnLogsServiceImpl.java @@ -0,0 +1,92 @@ +package com.muyu.warn.service.impl; + +import java.util.List; +import org.springframework.stereotype.Service; +import com.muyu.warn.mapper.WarnLogsMapper; +import com.muyu.warn.domain.WarnLogs; +import com.muyu.warn.service.IWarnLogsService; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.muyu.common.core.utils.StringUtils; +import org.springframework.util.Assert; + +/** + * 预警日志Service业务层处理 + * + * @author muyu + * @date 2024-09-20 + */ +@Service +public class WarnLogsServiceImpl + extends ServiceImpl + implements IWarnLogsService { + + /** + * 精确查询预警日志 + * + * @param id 预警日志主键 + * @return 预警日志 + */ + @Override + public WarnLogs selectWarnLogsById(Long id) + { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + Assert.notNull(id, "id不可为空"); + queryWrapper.eq(WarnLogs::getId, id); + return this.getOne(queryWrapper); + } + + + /** + * 查询预警日志列表 + * + * @param warnLogs 预警日志 + * @return 预警日志 + */ + @Override + public List selectWarnLogsList(WarnLogs warnLogs) + { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + if (StringUtils.isNotEmpty(warnLogs.getVin())){ + queryWrapper.eq(WarnLogs::getVin, warnLogs.getVin()); + } + if (StringUtils.isNotNull(warnLogs.getWarnRuleId())){ + queryWrapper.eq(WarnLogs::getWarnRuleId, warnLogs.getWarnRuleId()); + } + if (StringUtils.isNotNull(warnLogs.getStartTime())){ + queryWrapper.eq(WarnLogs::getStartTime, warnLogs.getStartTime()); + } + if (StringUtils.isNotNull(warnLogs.getEndTime())){ + queryWrapper.eq(WarnLogs::getEndTime, warnLogs.getEndTime()); + } + if (StringUtils.isNotNull(warnLogs.getMaxValue())){ + queryWrapper.eq(WarnLogs::getMaxValue, warnLogs.getMaxValue()); + } + if (StringUtils.isNotNull(warnLogs.getMinValue())){ + queryWrapper.eq(WarnLogs::getMinValue, warnLogs.getMinValue()); + } + if (StringUtils.isNotNull(warnLogs.getAvgValue())){ + queryWrapper.eq(WarnLogs::getAvgValue, warnLogs.getAvgValue()); + } + if (StringUtils.isNotNull(warnLogs.getMedianValue())){ + queryWrapper.eq(WarnLogs::getMedianValue, warnLogs.getMedianValue()); + } + if (StringUtils.isNotNull(warnLogs.getStatus())){ + queryWrapper.eq(WarnLogs::getStatus, warnLogs.getStatus()); + } + return this.list(queryWrapper); + } + + /** + * 唯一 判断 + * @param warnLogs 预警日志 + * @return 预警日志 + */ + @Override + public Boolean checkIdUnique(WarnLogs warnLogs) { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(WarnLogs::getId, warnLogs.getId()); + return this.count(queryWrapper) > 0; + } + +} diff --git a/cloud-warn/src/main/java/com/muyu/warn/service/impl/WarnRuleServiceImpl.java b/cloud-warn/src/main/java/com/muyu/warn/service/impl/WarnRuleServiceImpl.java new file mode 100644 index 0000000..fed3c6f --- /dev/null +++ b/cloud-warn/src/main/java/com/muyu/warn/service/impl/WarnRuleServiceImpl.java @@ -0,0 +1,86 @@ +package com.muyu.warn.service.impl; + +import java.util.List; +import org.springframework.stereotype.Service; +import com.muyu.warn.mapper.WarnRuleMapper; +import com.muyu.warn.domain.WarnRule; +import com.muyu.warn.service.IWarnRuleService; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.muyu.common.core.utils.StringUtils; +import org.springframework.util.Assert; + +/** + * 预警规则Service业务层处理 + * + * @author muyu + * @date 2024-09-20 + */ +@Service +public class WarnRuleServiceImpl + extends ServiceImpl + implements IWarnRuleService { + + /** + * 精确查询预警规则 + * + * @param id 预警规则主键 + * @return 预警规则 + */ + @Override + public WarnRule selectWarnRuleById(Long id) + { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + Assert.notNull(id, "id不可为空"); + queryWrapper.eq(WarnRule::getId, id); + return this.getOne(queryWrapper); + } + + + /** + * 查询预警规则列表 + * + * @param warnRule 预警规则 + * @return 预警规则 + */ + @Override + public List selectWarnRuleList(WarnRule warnRule) + { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + if (StringUtils.isNotNull(warnRule.getRuleName())){ + queryWrapper.like(WarnRule::getRuleName, warnRule.getRuleName()); + } + if (StringUtils.isNotNull(warnRule.getStrategyId())){ + queryWrapper.eq(WarnRule::getStrategyId, warnRule.getStrategyId()); + } + if (StringUtils.isNotNull(warnRule.getMsgTypeId())){ + queryWrapper.eq(WarnRule::getMsgTypeId, warnRule.getMsgTypeId()); + } + if (StringUtils.isNotNull(warnRule.getSlideTime())){ + queryWrapper.eq(WarnRule::getSlideTime, warnRule.getSlideTime()); + } + if (StringUtils.isNotNull(warnRule.getSlideFrequency())){ + queryWrapper.eq(WarnRule::getSlideFrequency, warnRule.getSlideFrequency()); + } + if (StringUtils.isNotNull(warnRule.getMaxValue())){ + queryWrapper.eq(WarnRule::getMaxValue, warnRule.getMaxValue()); + } + if (StringUtils.isNotNull(warnRule.getMinValue())){ + queryWrapper.eq(WarnRule::getMinValue, warnRule.getMinValue()); + } + return this.list(queryWrapper); + } + + /** + * 唯一 判断 + * @param warnRule 预警规则 + * @return 预警规则 + */ + @Override + public Boolean checkIdUnique(WarnRule warnRule) { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(WarnRule::getId, warnRule.getId()); + return this.count(queryWrapper) > 0; + } + +} diff --git a/cloud-warn/src/main/java/com/muyu/warn/service/impl/WarnStrategyServiceImpl.java b/cloud-warn/src/main/java/com/muyu/warn/service/impl/WarnStrategyServiceImpl.java new file mode 100644 index 0000000..343b4e5 --- /dev/null +++ b/cloud-warn/src/main/java/com/muyu/warn/service/impl/WarnStrategyServiceImpl.java @@ -0,0 +1,74 @@ +package com.muyu.warn.service.impl; + +import java.util.List; +import org.springframework.stereotype.Service; +import com.muyu.warn.mapper.WarnStrategyMapper; +import com.muyu.warn.domain.WarnStrategy; +import com.muyu.warn.service.IWarnStrategyService; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.muyu.common.core.utils.StringUtils; +import org.springframework.util.Assert; + +/** + * 预警策略Service业务层处理 + * + * @author muyu + * @date 2024-09-20 + */ +@Service +public class WarnStrategyServiceImpl + extends ServiceImpl + implements IWarnStrategyService { + + /** + * 精确查询预警策略 + * + * @param id 预警策略主键 + * @return 预警策略 + */ + @Override + public WarnStrategy selectWarnStrategyById(Long id) + { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + Assert.notNull(id, "id不可为空"); + queryWrapper.eq(WarnStrategy::getId, id); + return this.getOne(queryWrapper); + } + + + /** + * 查询预警策略列表 + * + * @param warnStrategy 预警策略 + * @return 预警策略 + */ + @Override + public List selectWarnStrategyList(WarnStrategy warnStrategy) + { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + if (StringUtils.isNotNull(warnStrategy.getCarTypeId())){ + queryWrapper.eq(WarnStrategy::getCarTypeId, warnStrategy.getCarTypeId()); + } + if (StringUtils.isNotNull(warnStrategy.getStrategyName())){ + queryWrapper.like(WarnStrategy::getStrategyName, warnStrategy.getStrategyName()); + } + if (StringUtils.isNotNull(warnStrategy.getMsgId())){ + queryWrapper.eq(WarnStrategy::getMsgId, warnStrategy.getMsgId()); + } + return this.list(queryWrapper); + } + + /** + * 唯一 判断 + * @param warnStrategy 预警策略 + * @return 预警策略 + */ + @Override + public Boolean checkIdUnique(WarnStrategy warnStrategy) { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(WarnStrategy::getId, warnStrategy.getId()); + return this.count(queryWrapper) > 0; + } + +} diff --git a/cloud-warn/src/main/resources/banner.txt b/cloud-warn/src/main/resources/banner.txt new file mode 100644 index 0000000..e69de29 diff --git a/cloud-warn/src/main/resources/bootstrap.yml b/cloud-warn/src/main/resources/bootstrap.yml new file mode 100644 index 0000000..a6a79fb --- /dev/null +++ b/cloud-warn/src/main/resources/bootstrap.yml @@ -0,0 +1,49 @@ +# Tomcat +server: + port: 9710 + +# nacos线上地址 +nacos: + addr: 106.15.136.7:8848 + user-name: nacos + password: nacos + namespace: lyb + +spring: + application: + # 应用名称 + name: cloud-warn + profiles: + # 环境配置 + active: dev + cloud: + nacos: + discovery: + # 服务注册地址 + server-addr: ${nacos.addr} + # nacos用户名89 + username: ${nacos.user-name} + # nacos密码 + password: ${nacos.password} + # 命名空间 + namespace: ${nacos.namespace} + config: + # 服务注册地址 + server-addr: ${nacos.addr} + # nacos用户名 + username: ${nacos.user-name} + # nacos密码 + password: ${nacos.password} + # 命名空间 + namespace: ${nacos.namespace} + # 配置文件格式 + file-extension: yml + # 共享配置 + shared-configs: + # 系统共享配置 + - application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension} + # 系统环境Config共享配置 + - application-config-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension} +logging: + level: + com.muyu.system.mapper: DEBUG diff --git a/cloud-weixin-mp/pom.xml b/cloud-weixin-mp/pom.xml new file mode 100644 index 0000000..b8479a9 --- /dev/null +++ b/cloud-weixin-mp/pom.xml @@ -0,0 +1,76 @@ + + + 4.0.0 + + com.muyu + cloud-server-parent + 3.6.4 + + + + + cloud-weixin-mp + 3.6.3 + + + 17 + 17 + UTF-8 + + + + + + + org.springframework.boot + spring-boot-starter-web + + + + + org.springframework.boot + spring-boot-starter-test + test + + + + org.dom4j + dom4j + 2.1.3 + + + + org.projectlombok + lombok + + + + com.thoughtworks.xstream + xstream + 1.4.20 + + + + com.squareup.okhttp3 + okhttp + + + + com.alibaba.fastjson2 + fastjson2 + 2.0.43 + + + + com.muyu + cloud-common-core + 3.6.3 + + + + + + + diff --git a/cloud-weixin-mp/src/main/java/com/muyu/SpringBoot.java b/cloud-weixin-mp/src/main/java/com/muyu/SpringBoot.java new file mode 100644 index 0000000..9b0fe2f --- /dev/null +++ b/cloud-weixin-mp/src/main/java/com/muyu/SpringBoot.java @@ -0,0 +1,17 @@ +package com.muyu; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +/** + *@ClassName SpringBoot + *@Description 描述 + *@Author YiBo.Liu + *@Date 2024/9/17 17:01 + */ +@SpringBootApplication +public class SpringBoot { + public static void main(String[] args) { + SpringApplication.run(SpringBoot.class, args); + } +} diff --git a/cloud-weixin-mp/src/main/java/com/muyu/message/Article.java b/cloud-weixin-mp/src/main/java/com/muyu/message/Article.java new file mode 100644 index 0000000..8c9c88c --- /dev/null +++ b/cloud-weixin-mp/src/main/java/com/muyu/message/Article.java @@ -0,0 +1,27 @@ +package com.muyu.message; + +import com.thoughtworks.xstream.annotations.XStreamAlias; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +/** + * @ClassName TextMessage + * @Description 描述 + * @Author YiBo.Liu + * @Date 2024/9/17 21:06 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +@XStreamAlias("item") +public class Article { + @XStreamAlias("Title") + private String title; + @XStreamAlias("Description") + private String description; + @XStreamAlias("PicUrl") + private String picUrl; + @XStreamAlias("Url") + private String url; + +} diff --git a/cloud-weixin-mp/src/main/java/com/muyu/message/NewMessage.java b/cloud-weixin-mp/src/main/java/com/muyu/message/NewMessage.java new file mode 100644 index 0000000..69571b6 --- /dev/null +++ b/cloud-weixin-mp/src/main/java/com/muyu/message/NewMessage.java @@ -0,0 +1,34 @@ +package com.muyu.message; + +import com.thoughtworks.xstream.annotations.XStreamAlias; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; + +/** + * @ClassName TextMessage + * @Description 描述 + * @Author YiBo.Liu + * @Date 2024/9/17 21:06 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +@XStreamAlias("xml") +public class NewMessage { + @XStreamAlias("ToUserName") + private String toUserName; + @XStreamAlias("FromUserName") + private String fromUserName; + @XStreamAlias("CreateTime") + private long createTime; + @XStreamAlias("MsgType") + private String msgType; + @XStreamAlias("ArticleCount") + private int articleCount; + @XStreamAlias("Articles") + private List
articles; + +} diff --git a/cloud-weixin-mp/src/main/java/com/muyu/message/TextMessage.java b/cloud-weixin-mp/src/main/java/com/muyu/message/TextMessage.java new file mode 100644 index 0000000..5a339e3 --- /dev/null +++ b/cloud-weixin-mp/src/main/java/com/muyu/message/TextMessage.java @@ -0,0 +1,51 @@ +package com.muyu.message; + +import com.thoughtworks.xstream.annotations.XStreamAlias; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * @ClassName TextMessage + * @Description 描述 + * @Author YiBo.Liu + * @Date 2024/9/17 21:06 + */ +@Data +@AllArgsConstructor +@NoArgsConstructor +@XStreamAlias("xml") +public class TextMessage { + + /** + * 接收方账号 + */ + @XStreamAlias("ToUserName") + private String toUserName; + + /** + * 开发者微信号 + */ + @XStreamAlias("FromUserName") + private String fromUserName; + + /** + * 创建时间 + */ + @XStreamAlias("CreateTime") + private long createTime; + + /** + * 消息类型 + */ + @XStreamAlias("MsgType") + private String msgType; + + /** + * 消息内容 + */ + @XStreamAlias("Content") + private String content; + + +} diff --git a/cloud-weixin-mp/src/main/java/com/muyu/token/AccessToken.java b/cloud-weixin-mp/src/main/java/com/muyu/token/AccessToken.java new file mode 100644 index 0000000..bf0951a --- /dev/null +++ b/cloud-weixin-mp/src/main/java/com/muyu/token/AccessToken.java @@ -0,0 +1,30 @@ +package com.muyu.token; + +import lombok.Data; + +/** + * @ClassName AccessToken + * @Description 描述 + * @Author YiBo.Liu + * @Date 2024/9/18 15:48 + */ +@Data +public class AccessToken { + + private String access_token; + + private long expires_in; + + public void setExpiresTime(long expiresIn) { + this.expires_in = System.currentTimeMillis()+expiresIn*1000; + } + + /** + * 判断是否超时 + * @return + */ + public boolean isExpired() { + return System.currentTimeMillis()>this.expires_in; + } + +} diff --git a/cloud-weixin-mp/src/main/java/com/muyu/util/OkHttpUtils.java b/cloud-weixin-mp/src/main/java/com/muyu/util/OkHttpUtils.java new file mode 100644 index 0000000..cf32b41 --- /dev/null +++ b/cloud-weixin-mp/src/main/java/com/muyu/util/OkHttpUtils.java @@ -0,0 +1,36 @@ +package com.muyu.util; + +import okhttp3.*; + +import java.io.IOException; + +public class OkHttpUtils { + + private static final OkHttpClient client = new OkHttpClient(); + + public static String sendGetRequest(String urlString) { + Request request = new Request.Builder() + .url(urlString) + .build(); + try (Response response = client.newCall(request).execute()) { + return response.body().string(); + } catch (IOException e) { + e.printStackTrace(); + return null; + } + } + + public static String sendPostRequest(String urlString, String params) { + RequestBody requestBody = RequestBody.create(MediaType.parse("application/json; charset=utf-8"), params); + Request request = new Request.Builder() + .url(urlString) + .post(requestBody) + .build(); + try (Response response = client.newCall(request).execute()) { + return response.body().string(); + } catch (IOException e) { + e.printStackTrace(); + return null; + } + } +} diff --git a/cloud-weixin-mp/src/main/java/com/muyu/util/TokenUtil.java b/cloud-weixin-mp/src/main/java/com/muyu/util/TokenUtil.java new file mode 100644 index 0000000..11e8dd3 --- /dev/null +++ b/cloud-weixin-mp/src/main/java/com/muyu/util/TokenUtil.java @@ -0,0 +1,41 @@ +package com.muyu.util; + +import com.alibaba.fastjson2.JSON; +import com.muyu.token.AccessToken; +import org.springframework.stereotype.Component; + +/** + * @ClassName AccessToken + * @Description 描述 + * @Author YiBo.Liu + * @Date 2024/9/18 15:48 + */ +@Component +public class TokenUtil { + private final static String APP_ID = "wx74741af76decd078"; + + private final static String APP_SECRET ="540af183133e701051b726f936ebbfe9"; + + private static AccessToken accessToken = new AccessToken(); + + + public static void getToken(){ + String url = String.format("https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=%s&secret=%s",APP_ID,APP_SECRET); + String request = OkHttpUtils.sendGetRequest(url); + AccessToken wechatToken = JSON.parseObject(request, AccessToken.class); + if (wechatToken != null) { + accessToken.setExpiresTime(wechatToken.getExpires_in()); + accessToken.setAccess_token(wechatToken.getAccess_token()); + } + } + + /** + * 获取AccessToken + * @return + */ + public static String getAccessToken(){ + getToken(); + return accessToken.getAccess_token(); + } + +} diff --git a/cloud-weixin-mp/src/main/java/com/muyu/util/WechatUtil.java b/cloud-weixin-mp/src/main/java/com/muyu/util/WechatUtil.java new file mode 100644 index 0000000..328cccd --- /dev/null +++ b/cloud-weixin-mp/src/main/java/com/muyu/util/WechatUtil.java @@ -0,0 +1,39 @@ +package com.muyu.util; + + + +import okhttp3.*; + +import java.io.IOException; + +public class WechatUtil { + + public static void send(String toUser,String content) { + String accessToken = TokenUtil.getAccessToken(); + if (!accessToken.equals("")) { + String url = "https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token=" + accessToken; + String jsonStr = "{\"touser\":\"" + toUser + "\",\"msgtype\":\"text\",\"text\":{\"content\":\"" + content + "\"}}"; + OkHttpClient client = new OkHttpClient(); + + // 构建请求 + RequestBody requestBody = RequestBody.create(jsonStr, MediaType.get("application/json; charset=utf-8")); + Request request = new Request.Builder() + .url(url) + .post(requestBody) + .addHeader("Content-Type", "application/json; charset=utf-8") + .build(); + + // 发送请求 + try (Response response = client.newCall(request).execute()) { + if (!response.isSuccessful()) { + throw new IOException("Unexpected code " + response); + } + // 输出响应 + System.out.println(response.body().string()); + }catch (IOException e) { + e.printStackTrace(); + } + } + } + +} diff --git a/cloud-weixin-mp/src/main/java/com/muyu/wxController/WxController.java b/cloud-weixin-mp/src/main/java/com/muyu/wxController/WxController.java new file mode 100644 index 0000000..8e7c1d8 --- /dev/null +++ b/cloud-weixin-mp/src/main/java/com/muyu/wxController/WxController.java @@ -0,0 +1,190 @@ +package com.muyu.wxController; + +import com.muyu.message.Article; +import com.muyu.message.NewMessage; +import com.muyu.message.TextMessage; +import com.muyu.util.TokenUtil; +import com.muyu.util.WechatUtil; +import com.thoughtworks.xstream.XStream; +import jakarta.servlet.ServletInputStream; +import jakarta.servlet.http.HttpServletRequest; +import org.dom4j.Document; +import org.dom4j.DocumentException; +import org.dom4j.Element; +import org.dom4j.io.SAXReader; +import org.springframework.util.StringUtils; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import java.io.IOException; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; +import java.util.*; + +/** + * @ClassName WxController + * @Description 描述 + * @Author YiBo.Liu + * @Date 2024/9/17 16:59 + */ +@RestController("/wx") +public class WxController { + + @GetMapping("/wxTest") + public String test() { + return "Hello wechat"; + } + + /** + * 完成微信消息验证 判断是否是微信消息 + * @param signature + * @param timestamp + * @param nonce + * @param echostr + * @return + */ + @GetMapping("/") + public String check(String signature, String timestamp, String nonce, String echostr) { + //1)将token、timestamp、nonce三个参数进行字典序排序 + String token = "lybjava"; + List list = Arrays.asList(token, timestamp, nonce); + //排序 + Collections.sort(list); + //2)将三个参数字符串拼接成一个字符串进行sha1加密 + StringBuilder stringBuilder = new StringBuilder(); + for (String string : list) { + stringBuilder.append(string); + } + //加密 + try { + MessageDigest instance = MessageDigest.getInstance("sha1"); + //使用sha1进行加密获得byte数组 + byte[] digest = instance.digest(stringBuilder.toString().getBytes()); + StringBuilder sum = new StringBuilder(); + for (byte b : digest) { + sum.append(Integer.toHexString((b>>4)&15)); + sum.append(Integer.toHexString(b&15)); + } + System.out.println("signature:"+signature); + System.out.println("sum:"+sum); + + //3)开发者获得加密后的字符串可与signature对比,标识该请求来源于微信 + if(!StringUtils.isEmpty(signature) && signature.equals(sum.toString())) { + return echostr; + } + } catch (NoSuchAlgorithmException e) { + throw new RuntimeException(e); + } + return null; + } + + + /** + * 用户发送消息,回复消息 + * @param request + * @return + * @throws IOException + */ + @PostMapping("/") + public String receiveMessage(HttpServletRequest request) throws IOException { + + ServletInputStream inputStream = request.getInputStream(); + Map map = new HashMap<>(); + + try { + SAXReader reader = new SAXReader(); + //读取request的输入流,获得Document对象 + Document document = reader.read(inputStream); + //获得root节点 + Element root = document.getRootElement(); + //获得root的子节点 + List elements = root.elements(); + for (Element element : elements) { + map.put(element.getName(), element.getStringValue()); + } + }catch (DocumentException e) { + throw new RuntimeException(e); + } + System.out.println("接收到用户的消息:"+map); + //回复消息 + String message =""; + if ("图文".equals(map.get("Content"))) { + message = getReplyNewsMessage(map); + }else { + message = getReplyMessage(map); + + } + System.out.println("回复给用户的消息:"+message); + return message; + } + + /** + * 获得回复的消息内容 + * @param map + * @return xml格式的字符串 + */ + private String getReplyMessage(Map map) { + TextMessage textMessage = new TextMessage(); + textMessage.setToUserName(map.get("FromUserName")); + textMessage.setFromUserName(map.get("ToUserName")); + textMessage.setMsgType("text"); + textMessage.setContent("你好宝贝,欢迎关注本公众号~"); + textMessage.setCreateTime(System.currentTimeMillis()/1000); + + //xstream 将java对象转换成xml字符串 + XStream xStream = new XStream(); + xStream.processAnnotations(TextMessage.class); + String xml = xStream.toXML(textMessage); + return xml; + } + + /** + * 获取Access_token + * @return + */ + @GetMapping("/getToken") + public String getToken() { + String accessToken = TokenUtil.getAccessToken(); + return accessToken; + } + + /** + * 回复图文消息 + * @param map + * @return + */ + private String getReplyNewsMessage(Map map) { + NewMessage newsMessage = new NewMessage(); + newsMessage.setToUserName(map.get("FromUserName")); + newsMessage.setFromUserName(map.get("ToUserName")); + newsMessage.setMsgType("news"); + newsMessage.setCreateTime(System.currentTimeMillis() / 1000); + newsMessage.setArticleCount(1); + List
articles = new ArrayList<>(); + Article article = new Article(); + article.setTitle("一个图文消息"); + article.setDescription("详细描述--------------信息"); + article.setUrl("https://www.baidu.com"); + article.setPicUrl("http://mmbiz.qpic.cn/mmbiz_jpg/RiaWwmABEMmkFKQMeQZLLYaxknlzE9CxSozVSH42iaXiaQcia5hPPUicuNYbS8dG99zsMZ1ic266ialM42Mbn8SkN54kA/0"); + articles.add(article); + newsMessage.setArticles(articles); + //XStream将java对象转换为xml字符串 + XStream xStream = new XStream(); + xStream.processAnnotations(NewMessage.class); + String xml = xStream.toXML(newsMessage); + return xml; + } + + + @GetMapping("/send") + public void send(@RequestParam("openId") String openId,@RequestParam("content")String content) { + WechatUtil.send(openId,content); + } + + + + + +} diff --git a/cloud-weixin-mp/src/main/resources/bootstrap.yml b/cloud-weixin-mp/src/main/resources/bootstrap.yml new file mode 100644 index 0000000..66fc877 --- /dev/null +++ b/cloud-weixin-mp/src/main/resources/bootstrap.yml @@ -0,0 +1,12 @@ +# Tomcat +server: + port: 8666 +##用户授权的重定向域名 +#redirect: +# domain:123 +##公众号appId和secret +#wx: +# appId:123 +# secret:123 + + diff --git a/pom.xml b/pom.xml index 4558953..1dcf2df 100644 --- a/pom.xml +++ b/pom.xml @@ -282,6 +282,8 @@ cloud-visual cloud-modules cloud-common + cloud-weixin-mp + cloud-warn pom