diff --git a/cloud-modules/cloud-modules-breakdown/pom.xml b/cloud-modules/cloud-modules-breakdown/pom.xml new file mode 100644 index 0000000..28d6889 --- /dev/null +++ b/cloud-modules/cloud-modules-breakdown/pom.xml @@ -0,0 +1,106 @@ + + + + com.muyu + cloud-modules + 3.6.3 + + 4.0.0 + + cloud-modules-breakdown + + + cloud-modules-breakdown故障模块 + + + + + + + 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 + + + + + com.muyu + cloud-common-xxl + + + + com.muyu + cloud-common-rabbit + + + + + + + + ${project.artifactId} + + + org.springframework.boot + spring-boot-maven-plugin + + + + repackage + + + + + + + + diff --git a/cloud-modules/cloud-modules-breakdown/src/main/java/com/muyu/breakdown/CloudBreakdownApplication.java b/cloud-modules/cloud-modules-breakdown/src/main/java/com/muyu/breakdown/CloudBreakdownApplication.java new file mode 100644 index 0000000..2c6ae9a --- /dev/null +++ b/cloud-modules/cloud-modules-breakdown/src/main/java/com/muyu/breakdown/CloudBreakdownApplication.java @@ -0,0 +1,21 @@ +package com.muyu.breakdown; + +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 CloudBreakdownApplication { + public static void main (String[] args) { + SpringApplication.run(CloudBreakdownApplication.class, args); + } +} diff --git a/cloud-modules/cloud-modules-breakdown/src/main/java/com/muyu/breakdown/controller/SysCarFaultController.java b/cloud-modules/cloud-modules-breakdown/src/main/java/com/muyu/breakdown/controller/SysCarFaultController.java new file mode 100644 index 0000000..a8c8b6c --- /dev/null +++ b/cloud-modules/cloud-modules-breakdown/src/main/java/com/muyu/breakdown/controller/SysCarFaultController.java @@ -0,0 +1,106 @@ +package com.muyu.breakdown.controller; + +import com.muyu.breakdown.domain.SysCarFault; +import com.muyu.breakdown.service.SysCarFaultService; +import com.muyu.common.core.domain.Result; +import com.muyu.common.core.utils.poi.ExcelUtil; +import com.muyu.common.core.web.controller.BaseController; +import com.muyu.common.core.web.page.TableDataInfo; +import com.muyu.common.security.annotation.RequiresPermissions; +import com.muyu.common.security.utils.SecurityUtils; +import jakarta.annotation.Resource; +import jakarta.servlet.http.HttpServletResponse; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import java.util.Arrays; +import java.util.List; + +/** + * @ClassDescription: + * @JdkVersion: 1.8 + * @Author: YZL + * @Created: 2024/9/20 11:00 + */ +@RestController +@RequestMapping("/breakdown") +public class SysCarFaultController extends BaseController +{ + @Resource + private SysCarFaultService sysCarFaultService; + + /** + * 查询车辆故障管理列表 + */ + @RequiresPermissions("breakdown:breakdown:list") + @GetMapping("/list") + public Result> list(SysCarFault sysCarFault) + { + startPage(); + List list = sysCarFaultService.selectSysCarFaultList(sysCarFault); + return getDataTable(list); + } + + /** + * 导出车辆故障管理列表 + */ + @RequiresPermissions("breakdown:breakdown:export") + @PostMapping("/export") + public void export(HttpServletResponse response, SysCarFault sysCarFault) + { + List list = sysCarFaultService.selectSysCarFaultList(sysCarFault); + ExcelUtil util = new ExcelUtil(SysCarFault.class); + util.exportExcel(response, list, "车辆故障管理数据"); + } + + /** + * 获取车辆故障管理详细信息 + */ + @RequiresPermissions("breakdown:breakdown:query") + @GetMapping(value = "/{id}") + public Result> getInfo(@PathVariable("id") Long id) + { + return success(sysCarFaultService.selectSysCarFaultById(id)); + } + + /** + * 新增车辆故障管理 + */ + @RequiresPermissions("breakdown:breakdown:add") + @PostMapping + public Result add( + @Validated @RequestBody SysCarFault sysCarFault) + { + if (sysCarFaultService.checkIdUnique(sysCarFault)) { + return error("新增 车辆故障管理 '" + sysCarFault + "'失败,车辆故障管理已存在"); + } + sysCarFault.setCreateBy(SecurityUtils.getUsername()); + return toAjax(sysCarFaultService.save(sysCarFault)); + } + + /** + * 修改车辆故障管理 + */ + @RequiresPermissions("breakdown:breakdown:edit") + @PutMapping + public Result edit( + @Validated @RequestBody SysCarFault sysCarFault) + { + if (!sysCarFaultService.checkIdUnique(sysCarFault)) { + return error("修改 车辆故障管理 '" + sysCarFault + "'失败,车辆故障管理不存在"); + } + sysCarFault.setUpdateBy(SecurityUtils.getUsername()); + return toAjax(sysCarFaultService.updateById(sysCarFault)); + } + + /** + * 删除车辆故障管理 + */ + @RequiresPermissions("breakdown:breakdown:remove") + @DeleteMapping("/{ids}") + public Result remove(@PathVariable("ids") Long[] ids) + { + sysCarFaultService.removeBatchByIds(Arrays.asList(ids)); + return success(); + } +} diff --git a/cloud-modules/cloud-modules-breakdown/src/main/java/com/muyu/breakdown/domain/SysCarFault.java b/cloud-modules/cloud-modules-breakdown/src/main/java/com/muyu/breakdown/domain/SysCarFault.java new file mode 100644 index 0000000..7abee76 --- /dev/null +++ b/cloud-modules/cloud-modules-breakdown/src/main/java/com/muyu/breakdown/domain/SysCarFault.java @@ -0,0 +1,116 @@ +package com.muyu.breakdown.domain; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +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; + +/** + * @ClassDescription: 车辆故障管理对象 + * @JdkVersion: 1.8 + * @Author: YZL + * @Created: 2024/9/20 10:56 + */ +@Data +@Setter +@Getter +@SuperBuilder +@NoArgsConstructor +@AllArgsConstructor +@TableName("sys_car_fault") +public class SysCarFault extends BaseEntity{ + private static final long serialVersionUID = 1L; + + /** 参数主键 */ + @TableId( type = IdType.AUTO) + private Long id; + + /** 故障码编码 */ + @Excel(name = "故障码编码") + private String faultCode; + + /** 故障名 */ + @Excel(name = "故障名") + private String faultName; + + /** 故障类型 */ + @Excel(name = "故障类型") + private Long typeId; + + /** 车辆VIN码 */ + @Excel(name = "车辆VIN码") + private String carVin; + + /** 故障标签 */ + @Excel(name = "故障标签") + private String faultLabel; + + /** 故障组 */ + @Excel(name = "故障组") + private String faultGroup; + + /** 故障位 */ + @Excel(name = "故障位") + private String faultBit; + + /** 故障值 */ + @Excel(name = "故障值") + private String faultValue; + + /** 故障级别 (0.低 ,2.中 ,3.高) */ + @Excel(name = "故障级别 (0.低 ,2.中 ,3.高)") + private Long faultRank; + + /** 故障描述信息 */ + @Excel(name = "故障描述信息") + private String faultDesc; + + /** 故障最小阈值 */ + @Excel(name = "故障最小阈值") + private String faultMinThreshold; + + /** 故障最大阈值 */ + @Excel(name = "故障最大阈值") + private String faultMaxThreshold; + + /** 启用状态(1.待处理 2.处理中 3.已处理 4.忽略) */ + @Excel(name = "启用状态(1.待处理 2.处理中 3.已处理 4.忽略)") + private Long status; + + /** 是否警告(0.开启 1.禁止) */ + @Excel(name = "是否警告(0.开启 1.禁止)") + private Long warnStatus; + + + + @Override + public String toString() { + return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) + .append("id", getId()) + .append("faultCode", getFaultCode()) + .append("faultName", getFaultName()) + .append("typeId", getTypeId()) + .append("carVin", getCarVin()) + .append("faultLabel", getFaultLabel()) + .append("faultGroup", getFaultGroup()) + .append("faultBit", getFaultBit()) + .append("faultValue", getFaultValue()) + .append("faultRank", getFaultRank()) + .append("faultDesc", getFaultDesc()) + .append("faultMinThreshold", getFaultMinThreshold()) + .append("faultMaxThreshold", getFaultMaxThreshold()) + .append("status", getStatus()) + .append("warnStatus", getWarnStatus()) + .append("remark", getRemark()) + .append("createBy", getCreateBy()) + .append("createTime", getCreateTime()) + .append("updateBy", getUpdateBy()) + .append("updateTime", getUpdateTime()) + .toString(); + } +} diff --git a/cloud-modules/cloud-modules-breakdown/src/main/java/com/muyu/breakdown/domain/SysCarFaultType.java b/cloud-modules/cloud-modules-breakdown/src/main/java/com/muyu/breakdown/domain/SysCarFaultType.java new file mode 100644 index 0000000..cc04b83 --- /dev/null +++ b/cloud-modules/cloud-modules-breakdown/src/main/java/com/muyu/breakdown/domain/SysCarFaultType.java @@ -0,0 +1,24 @@ +package com.muyu.breakdown.domain; + +import com.baomidou.mybatisplus.annotation.TableName; +import com.muyu.common.core.web.domain.BaseEntity; +import lombok.*; +import lombok.experimental.SuperBuilder; + +/** + * @ClassDescription: + * @JdkVersion: 1.8 + * @Author: YZL + * @Created: 2024/9/20 11:34 + */ +@Data +@Setter +@Getter +@SuperBuilder +@NoArgsConstructor +@AllArgsConstructor +@TableName("sys_car_fault_type") +public class SysCarFaultType { + private Long faultTypeId; + private String faultTypeName; +} diff --git a/cloud-modules/cloud-modules-breakdown/src/main/java/com/muyu/breakdown/mapper/SysCarFaultMapper.java b/cloud-modules/cloud-modules-breakdown/src/main/java/com/muyu/breakdown/mapper/SysCarFaultMapper.java new file mode 100644 index 0000000..49eb807 --- /dev/null +++ b/cloud-modules/cloud-modules-breakdown/src/main/java/com/muyu/breakdown/mapper/SysCarFaultMapper.java @@ -0,0 +1,16 @@ +package com.muyu.breakdown.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.muyu.breakdown.domain.SysCarFault; +import org.apache.ibatis.annotations.Mapper; + +/** + * @ClassDescription: 车辆故障管理Mapper接口 + * @JdkVersion: 1.8 + * @Author: YZL + * @Created: 2024/9/20 10:57 + */ +@Mapper +public interface SysCarFaultMapper extends BaseMapper{ + +} diff --git a/cloud-modules/cloud-modules-breakdown/src/main/java/com/muyu/breakdown/service/SysCarFaultService.java b/cloud-modules/cloud-modules-breakdown/src/main/java/com/muyu/breakdown/service/SysCarFaultService.java new file mode 100644 index 0000000..604c27d --- /dev/null +++ b/cloud-modules/cloud-modules-breakdown/src/main/java/com/muyu/breakdown/service/SysCarFaultService.java @@ -0,0 +1,38 @@ +package com.muyu.breakdown.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.muyu.breakdown.domain.SysCarFault; + +import java.util.List; + +/** + * @ClassDescription: 车辆故障管理Service接口 + * @JdkVersion: 1.8 + * @Author: YZL + * @Created: 2024/9/20 10:57 + */ +public interface SysCarFaultService extends IService { + /** + * 精确查询车辆故障管理 + * + * @param id 车辆故障管理主键 + * @return 车辆故障管理 + */ + public SysCarFault selectSysCarFaultById(Long id); + + /** + * 查询车辆故障管理列表 + * + * @param sysCarFault 车辆故障管理 + * @return 车辆故障管理集合 + */ + public List selectSysCarFaultList(SysCarFault sysCarFault); + + /** + * 判断 车辆故障管理 id是否唯一 + * @param sysCarFault 车辆故障管理 + * @return 结果 + */ + Boolean checkIdUnique(SysCarFault sysCarFault); + +} diff --git a/cloud-modules/cloud-modules-breakdown/src/main/java/com/muyu/breakdown/service/impl/SysCarFaultServiceImpl.java b/cloud-modules/cloud-modules-breakdown/src/main/java/com/muyu/breakdown/service/impl/SysCarFaultServiceImpl.java new file mode 100644 index 0000000..717933a --- /dev/null +++ b/cloud-modules/cloud-modules-breakdown/src/main/java/com/muyu/breakdown/service/impl/SysCarFaultServiceImpl.java @@ -0,0 +1,75 @@ +package com.muyu.breakdown.service.impl; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.muyu.breakdown.domain.SysCarFault; +import com.muyu.breakdown.mapper.SysCarFaultMapper; +import com.muyu.breakdown.service.SysCarFaultService; +import com.muyu.common.core.utils.StringUtils; +import org.springframework.stereotype.Service; +import org.springframework.util.Assert; + +import java.util.List; + +/** + * @ClassDescription: 车辆故障管理Service业务层处理 + * @JdkVersion: 1.8 + * @Author: YZL + * @Created: 2024/9/20 10:58 + */ +@Service +public class SysCarFaultServiceImpl + extends ServiceImpl + implements SysCarFaultService { + + /** + * 精确查询车辆故障管理 + * + * @param id 车辆故障管理主键 + * @return 车辆故障管理 + */ + @Override + public SysCarFault selectSysCarFaultById(Long id) + { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + Assert.notNull(id, "id不可为空"); + queryWrapper.eq(SysCarFault::getId, id); + return this.getOne(queryWrapper); + } + + + /** + * 查询车辆故障管理列表 + * + * @param sysCarFault 车辆故障管理 + * @return 车辆故障管理 + */ + @Override + public List selectSysCarFaultList(SysCarFault sysCarFault) + { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + if (StringUtils.isNotEmpty(sysCarFault.getFaultCode())){ + queryWrapper.eq(SysCarFault::getFaultCode, sysCarFault.getFaultCode()); + } + if (StringUtils.isNotEmpty(sysCarFault.getFaultBit())){ + queryWrapper.eq(SysCarFault::getFaultBit, sysCarFault.getFaultBit()); + } + if (sysCarFault.getFaultRank()!=null){ + queryWrapper.eq(SysCarFault::getFaultRank, sysCarFault.getFaultRank()); + } + return this.list(queryWrapper); + } + + /** + * 唯一 判断 + * @param sysCarFault 车辆故障管理 + * @return 车辆故障管理 + */ + @Override + public Boolean checkIdUnique(SysCarFault sysCarFault) { + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); + queryWrapper.eq(SysCarFault::getId, sysCarFault.getId()); + return this.count(queryWrapper) > 0; + } + +} diff --git a/cloud-modules/cloud-modules-breakdown/src/main/resources/banner.txt b/cloud-modules/cloud-modules-breakdown/src/main/resources/banner.txt new file mode 100644 index 0000000..0dd5eee --- /dev/null +++ b/cloud-modules/cloud-modules-breakdown/src/main/resources/banner.txt @@ -0,0 +1,2 @@ +Spring Boot Version: ${spring-boot.version} +Spring Application Name: ${spring.application.name} diff --git a/cloud-modules/cloud-modules-breakdown/src/main/resources/bootstrap.yml b/cloud-modules/cloud-modules-breakdown/src/main/resources/bootstrap.yml new file mode 100644 index 0000000..9ce45cb --- /dev/null +++ b/cloud-modules/cloud-modules-breakdown/src/main/resources/bootstrap.yml @@ -0,0 +1,60 @@ +# Tomcat +server: + port: 9702 + +# nacos线上地址 +nacos: + addr: 47.101.53.251:8848 + user-name: nacos + password: nacos + namespace: four +# SPRING_AMQP_DESERIALIZATION_TRUST_ALL=true spring.amqp.deserialization.trust.all +# Spring +spring: + amqp: + deserialization: + trust: + all: true + main: + allow-bean-definition-overriding: true + application: + # 应用名称 + name: cloud-breakdown + profiles: + # 环境配置 + active: dev + cloud: + nacos: + discovery: + # 服务注册地址 + server-addr: ${nacos.addr} + # nacos用户名 + 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} + # 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.breakdown.mapper: DEBUG diff --git a/cloud-modules/cloud-modules-breakdown/src/main/resources/logback/dev.xml b/cloud-modules/cloud-modules-breakdown/src/main/resources/logback/dev.xml new file mode 100644 index 0000000..34cd186 --- /dev/null +++ b/cloud-modules/cloud-modules-breakdown/src/main/resources/logback/dev.xml @@ -0,0 +1,74 @@ + + + + + + + + + + + ${log.pattern} + + + + + + ${log.path}/info.log + + + + ${log.path}/info.%d{yyyy-MM-dd}.log + + 60 + + + ${log.pattern} + + + + INFO + + ACCEPT + + DENY + + + + + ${log.path}/error.log + + + + ${log.path}/error.%d{yyyy-MM-dd}.log + + 60 + + + ${log.pattern} + + + + ERROR + + ACCEPT + + DENY + + + + + + + + + + + + + + + + + + diff --git a/cloud-modules/cloud-modules-breakdown/src/main/resources/logback/prod.xml b/cloud-modules/cloud-modules-breakdown/src/main/resources/logback/prod.xml new file mode 100644 index 0000000..1193d09 --- /dev/null +++ b/cloud-modules/cloud-modules-breakdown/src/main/resources/logback/prod.xml @@ -0,0 +1,81 @@ + + + + + + + + + + + + ${log.sky.pattern} + + + + + + ${log.path}/info.log + + + + ${log.path}/info.%d{yyyy-MM-dd}.log + + 60 + + + + + INFO + + ACCEPT + + DENY + + + + + ${log.path}/error.log + + + + ${log.path}/error.%d{yyyy-MM-dd}.log + + 60 + + + + + ERROR + + ACCEPT + + DENY + + + + + + + + ${log.sky.pattern} + + + + + + + + + + + + + + + + + + + + diff --git a/cloud-modules/cloud-modules-breakdown/src/main/resources/logback/test.xml b/cloud-modules/cloud-modules-breakdown/src/main/resources/logback/test.xml new file mode 100644 index 0000000..1193d09 --- /dev/null +++ b/cloud-modules/cloud-modules-breakdown/src/main/resources/logback/test.xml @@ -0,0 +1,81 @@ + + + + + + + + + + + + ${log.sky.pattern} + + + + + + ${log.path}/info.log + + + + ${log.path}/info.%d{yyyy-MM-dd}.log + + 60 + + + + + INFO + + ACCEPT + + DENY + + + + + ${log.path}/error.log + + + + ${log.path}/error.%d{yyyy-MM-dd}.log + + 60 + + + + + ERROR + + ACCEPT + + DENY + + + + + + + + ${log.sky.pattern} + + + + + + + + + + + + + + + + + + + + diff --git a/cloud-modules/cloud-modules-breakdown/src/main/resources/mapper/breakdown/SysCarFaultMapper.xml b/cloud-modules/cloud-modules-breakdown/src/main/resources/mapper/breakdown/SysCarFaultMapper.xml new file mode 100644 index 0000000..4b3f17d --- /dev/null +++ b/cloud-modules/cloud-modules-breakdown/src/main/resources/mapper/breakdown/SysCarFaultMapper.xml @@ -0,0 +1,130 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + select id, fault_code, fault_name, type_id, car_vin, fault_label, fault_group, fault_bit, fault_value, fault_rank, fault_desc, fault_min_threshold, fault_max_threshold, status, warn_status, remark, create_by, create_time, update_by, update_time from sys_car_fault + + + + + + + + insert into sys_car_fault + + fault_code, + fault_name, + type_id, + car_vin, + fault_label, + fault_group, + fault_bit, + fault_value, + fault_rank, + fault_desc, + fault_min_threshold, + fault_max_threshold, + status, + warn_status, + remark, + create_by, + create_time, + update_by, + update_time, + + + #{faultCode}, + #{faultName}, + #{typeId}, + #{carVin}, + #{faultLabel}, + #{faultGroup}, + #{faultBit}, + #{faultValue}, + #{faultRank}, + #{faultDesc}, + #{faultMinThreshold}, + #{faultMaxThreshold}, + #{status}, + #{warnStatus}, + #{remark}, + #{createBy}, + #{createTime}, + #{updateBy}, + #{updateTime}, + + + + + update sys_car_fault + + fault_code = #{faultCode}, + fault_name = #{faultName}, + type_id = #{typeId}, + car_vin = #{carVin}, + fault_label = #{faultLabel}, + fault_group = #{faultGroup}, + fault_bit = #{faultBit}, + fault_value = #{faultValue}, + fault_rank = #{faultRank}, + fault_desc = #{faultDesc}, + fault_min_threshold = #{faultMinThreshold}, + fault_max_threshold = #{faultMaxThreshold}, + status = #{status}, + warn_status = #{warnStatus}, + remark = #{remark}, + create_by = #{createBy}, + create_time = #{createTime}, + update_by = #{updateBy}, + update_time = #{updateTime}, + + where id = #{id} + + + + delete from sys_car_fault where id = #{id} + + + + delete from sys_car_fault where id in + + #{id} + + + diff --git a/cloud-modules/cloud-modules-wechat/pom.xml b/cloud-modules/cloud-modules-wechat/pom.xml new file mode 100644 index 0000000..8d94920 --- /dev/null +++ b/cloud-modules/cloud-modules-wechat/pom.xml @@ -0,0 +1,59 @@ + + + 4.0.0 + + + com.muyu + cloud-modules + 3.6.3 + + cloud-modules-wechat + + + 17 + 17 + UTF-8 + + + + + + com.squareup.okhttp3 + okhttp + 4.9.3 + + + com.thoughtworks.xstream + xstream + 1.4.20 + + + org.projectlombok + lombok + 1.18.34 + + + org.springframework.boot + spring-boot-starter + 3.3.2 + + + org.springframework.boot + spring-boot-starter-web + 3.3.2 + + + + org.dom4j + dom4j + 2.1.3 + + + com.alibaba.fastjson2 + fastjson2 + 2.0.43 + + + diff --git a/cloud-modules/cloud-modules-wechat/src/main/java/com/muyu/wechat/CloudWeChatApplication.java b/cloud-modules/cloud-modules-wechat/src/main/java/com/muyu/wechat/CloudWeChatApplication.java new file mode 100644 index 0000000..61c9d69 --- /dev/null +++ b/cloud-modules/cloud-modules-wechat/src/main/java/com/muyu/wechat/CloudWeChatApplication.java @@ -0,0 +1,18 @@ +package com.muyu.wechat; + + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +/** + * @ClassDescription: + * @JdkVersion: 1.8 + * @Author: YZL + * @Created: 2024/9/19 14:26 + */ +@SpringBootApplication +public class CloudWeChatApplication { + public static void main (String[] args) { + SpringApplication.run(CloudWeChatApplication.class, args); + } +} diff --git a/cloud-modules/cloud-modules-wechat/src/main/java/com/muyu/wechat/controller/WxTestController.java b/cloud-modules/cloud-modules-wechat/src/main/java/com/muyu/wechat/controller/WxTestController.java new file mode 100644 index 0000000..bfce459 --- /dev/null +++ b/cloud-modules/cloud-modules-wechat/src/main/java/com/muyu/wechat/controller/WxTestController.java @@ -0,0 +1,155 @@ +package com.muyu.wechat.controller; + + +import com.muyu.wechat.domain.Message; +import com.muyu.wechat.message.Article; +import com.muyu.wechat.message.NewMessage; +import com.muyu.wechat.util.TokenUtil; +import com.thoughtworks.xstream.XStream; +import io.micrometer.common.util.StringUtils; +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.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.*; + +/** + * @ClassDescription: + * @JdkVersion: 1.8 + * @Author: YZL + * @Created: 2024/9/19 20:26 + */ +@RestController +public class WxTestController { + + + @PostMapping("/") + public String receiveMessage(HttpServletRequest request) { + ServletInputStream inputStream = null; + HashMap map = new HashMap<>(); + try { + inputStream = request.getInputStream(); + SAXReader saxReader = new SAXReader(); + //读取request输入流,获得Document对象 + Document document = saxReader.read(inputStream); + //获得root结点 + Element rootElement = document.getRootElement(); + //获取所有的子节点 + List elements = rootElement.elements(); + for (Element element : elements) { + map.put(element.getName(), element.getStringValue()); + } + + + } catch (IOException e) { + throw new RuntimeException(e); + } 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); + + } + return message; + } + + /** + * 获得回复的消息内容 + * + * @param map + * @return + */ + private String getReplyMessage(HashMap map) { + Message message = new Message(); + message.setToUserName(map.get("FromUserName")); + message.setFromUserName(map.get("ToUserName")); +// message.setMsgType(map.get("MsgType")); + message.setMsgType("text"); + message.setCreateTime(System.currentTimeMillis() / 1000); + message.setContent("自动回复:您好"); + //XStream将java对象转换为xml字符串 + XStream xStream = new XStream(); + xStream.processAnnotations(Message.class); + String xml = xStream.toXML(message); + return xml; + } + + + @GetMapping("/") + public String check(@RequestParam("signature") String signature, @RequestParam("timestamp") String timestamp, + @RequestParam("nonce") String nonce, @RequestParam("echostr") String echostr) { + + //1.将token、timestamp、nonce三个参数进行字典排序 + String token = "asdasd"; + List list = Arrays.asList(token, timestamp, nonce); + //排序 + Collections.sort(list); + //2.将三个参数字符串拼接成一个字符串进行sha1加密 + StringBuilder stringBuilder = new StringBuilder(); + for (String s : list) { + stringBuilder.append(s); + } + //加密 + 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)); + } + //3.开发者获得加密后的字符串可与signature对比,标识该请求来源于微信 + if (!StringUtils.isEmpty(signature) && signature.equals(sum.toString())) { + return echostr; + } + + } catch (NoSuchAlgorithmException e) { + throw new RuntimeException(e); + } + return null; + } + + @PostMapping("/test") + public void test() { + String accessToken = TokenUtil.getAccessToken(); + System.out.println(accessToken); + } + + 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("oneone哦恩恩"); + 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; + } +} diff --git a/cloud-modules/cloud-modules-wechat/src/main/java/com/muyu/wechat/domain/AccessToken.java b/cloud-modules/cloud-modules-wechat/src/main/java/com/muyu/wechat/domain/AccessToken.java new file mode 100644 index 0000000..f7d4d77 --- /dev/null +++ b/cloud-modules/cloud-modules-wechat/src/main/java/com/muyu/wechat/domain/AccessToken.java @@ -0,0 +1,23 @@ +package com.muyu.wechat.domain; + +import lombok.Data; + +/** + * @ClassDescription: + * @JdkVersion: 1.8 + * @Author: YZL + * @Created: 2024/9/19 20:26 + */ +@Data +public class AccessToken { + + + private String access_token; + + private Long expires_in; + + public void setExpiresTime(Long expiresIn) { + this.expires_in = System.currentTimeMillis() + expiresIn * 1000; + } + +} diff --git a/cloud-modules/cloud-modules-wechat/src/main/java/com/muyu/wechat/domain/Message.java b/cloud-modules/cloud-modules-wechat/src/main/java/com/muyu/wechat/domain/Message.java new file mode 100644 index 0000000..069961b --- /dev/null +++ b/cloud-modules/cloud-modules-wechat/src/main/java/com/muyu/wechat/domain/Message.java @@ -0,0 +1,29 @@ +package com.muyu.wechat.domain; + +import com.thoughtworks.xstream.annotations.XStreamAlias; +import lombok.Data; + +/** + * @ClassDescription: + * @JdkVersion: 1.8 + * @Author: YZL + * @Created: 2024/9/19 20:26 + */ +@Data +@XStreamAlias("xml") +public class Message { + @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-modules/cloud-modules-wechat/src/main/java/com/muyu/wechat/message/Article.java b/cloud-modules/cloud-modules-wechat/src/main/java/com/muyu/wechat/message/Article.java new file mode 100644 index 0000000..873df00 --- /dev/null +++ b/cloud-modules/cloud-modules-wechat/src/main/java/com/muyu/wechat/message/Article.java @@ -0,0 +1,28 @@ +package com.muyu.wechat.message; + +import com.thoughtworks.xstream.annotations.XStreamAlias; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +/** + * @ClassDescription: + * @JdkVersion: 1.8 + * @Author: YZL + * @Created: 2024/9/19 20:26 + */ +@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-modules/cloud-modules-wechat/src/main/java/com/muyu/wechat/message/NewMessage.java b/cloud-modules/cloud-modules-wechat/src/main/java/com/muyu/wechat/message/NewMessage.java new file mode 100644 index 0000000..9b49422 --- /dev/null +++ b/cloud-modules/cloud-modules-wechat/src/main/java/com/muyu/wechat/message/NewMessage.java @@ -0,0 +1,34 @@ +package com.muyu.wechat.message; + +import com.thoughtworks.xstream.annotations.XStreamAlias; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; + +/** + * @ClassDescription: + * @JdkVersion: 1.8 + * @Author: YZL + * @Created: 2024/9/19 20:26 + */ +@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-modules/cloud-modules-wechat/src/main/java/com/muyu/wechat/util/OkHttpUtils.java b/cloud-modules/cloud-modules-wechat/src/main/java/com/muyu/wechat/util/OkHttpUtils.java new file mode 100644 index 0000000..f330aa8 --- /dev/null +++ b/cloud-modules/cloud-modules-wechat/src/main/java/com/muyu/wechat/util/OkHttpUtils.java @@ -0,0 +1,41 @@ +package com.muyu.wechat.util; + +import okhttp3.*; + +import java.io.IOException; +/** + * @ClassDescription: + * @JdkVersion: 1.8 + * @Author: YZL + * @Created: 2024/9/19 20:26 + */ +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(params, MediaType.parse("application/json; charset=utf-8")); + 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-modules/cloud-modules-wechat/src/main/java/com/muyu/wechat/util/TokenUtil.java b/cloud-modules/cloud-modules-wechat/src/main/java/com/muyu/wechat/util/TokenUtil.java new file mode 100644 index 0000000..d4ff742 --- /dev/null +++ b/cloud-modules/cloud-modules-wechat/src/main/java/com/muyu/wechat/util/TokenUtil.java @@ -0,0 +1,40 @@ +package com.muyu.wechat.util; + +import com.alibaba.fastjson2.JSON; + +import com.muyu.wechat.domain.AccessToken; +import org.springframework.stereotype.Component; + +import java.util.concurrent.TimeUnit; + +/** + * @ClassDescription: + * @JdkVersion: 1.8 + * @Author: YZL + * @Created: 2024/9/19 20:26 + */ +@Component +public class TokenUtil { + private final static String APP_ID = "wx1d843111e24945c4"; + + private final static String APP_SECRET = "f625fc9e03e6bb5f4959b51f0650f1a8"; + + 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()); + } + } + + public static String getAccessToken() { + getToken(); + return accessToken.getAccess_token(); + } + +} diff --git a/cloud-modules/cloud-modules-wechat/src/main/resources/bootstrap.yml b/cloud-modules/cloud-modules-wechat/src/main/resources/bootstrap.yml new file mode 100644 index 0000000..d3e045e --- /dev/null +++ b/cloud-modules/cloud-modules-wechat/src/main/resources/bootstrap.yml @@ -0,0 +1,3 @@ +# Tomcat +server: + port: 12000 diff --git a/cloud-modules/pom.xml b/cloud-modules/pom.xml index ef8c5a8..5dd66e7 100644 --- a/cloud-modules/pom.xml +++ b/cloud-modules/pom.xml @@ -15,6 +15,8 @@ cloud-modules-template cloud-modules-fence cloud-modules-car + cloud-modules-wechat + cloud-modules-breakdown cloud-car