feat():初始化

psr
yuan 2024-09-21 11:51:40 +08:00
parent 14da1917c3
commit 6a413e0ce0
50 changed files with 2499 additions and 7 deletions

View File

@ -7,7 +7,7 @@ nacos:
addr: 159.75.188.178:8848 addr: 159.75.188.178:8848
user-name: nacos user-name: nacos
password: nacos password: nacos
namespace: eight namespace: psr
# Spring # Spring
spring: spring:
application: application:

View File

@ -0,0 +1,62 @@
<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.muyu</groupId>
<artifactId>cloud-common</artifactId>
<version>3.6.3</version>
</parent>
<artifactId>cloud-common-wechat</artifactId>
<packaging>jar</packaging>
<name>cloud-common-wechat</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<!-- MuYu Common Core-->
<dependency>
<groupId>com.muyu</groupId>
<artifactId>cloud-common-core</artifactId>
</dependency>
<dependency>
<groupId>org.dom4j</groupId>
<artifactId>dom4j</artifactId>
<version>2.1.3</version>
</dependency>
<!-- 帮助将java对象转换为xml字符串-->
<!-- 依赖冲突会导致InaccessibleObjectException异常更新到适用版本-->
<dependency>
<groupId>com.thoughtworks.xstream</groupId>
<artifactId>xstream</artifactId>
<version>1.4.20</version>
</dependency>
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
<version>4.9.3</version>
</dependency>
<!-- Alibaba Fastjson -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.83</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>

View File

@ -0,0 +1,23 @@
package com.muyu.common.wechat.domain;
import lombok.Data;
/**
* @author 24415
*/
@Data
public class AccessToken {
private String access_token;
private Long expires_in;
public void setExpiresTime(Long expiresIn) {
this.expires_in = System.currentTimeMillis()+expiresIn*1000;
}
public boolean isExpired(Long expiresIn){
long now = System.currentTimeMillis();
return now>expiresIn;
}
}

View File

@ -0,0 +1,38 @@
package com.muyu.common.wechat.domain;
import com.thoughtworks.xstream.annotations.XStreamAlias;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @Author
* @Packagecom.muyu.wxapplication.massage
* @ProjectWXApplication
* @nameArticles
* @Date2024/9/18 10:14
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@XStreamAlias("item")
public class Articles {
// <Articles>
// <item>
// <Title><![CDATA[title1]]></Title>
// <Description><![CDATA[description1]]></Description>
// <PicUrl><![CDATA[picurl]]></PicUrl>
// <Url><![CDATA[url]]></Url>
// </item>
// </Articles>
@XStreamAlias("Title")
private String title ;
@XStreamAlias("Description")
private String description ;
@XStreamAlias("PicUrl")
private String picUrl ;
@XStreamAlias("Url")
private String url ;
}

View File

@ -0,0 +1,50 @@
package com.muyu.common.wechat.domain;
import com.thoughtworks.xstream.annotations.XStreamAlias;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
/**
* @Author
* @Packagecom.muyu.wxapplication.massage
* @ProjectWXApplication
* @nameImageText
* @Date2024/9/18 9:27
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@XStreamAlias("xml")
public class NewsMessage {
// <ToUserName><![CDATA[toUser]]></ToUserName>
// <FromUserName><![CDATA[fromUser]]></FromUserName>
// <CreateTime>12345678</CreateTime>
// <MsgType><![CDATA[news]]></MsgType>
// <ArticleCount>1</ArticleCount>
// <Articles>
// <item>
// <Title><![CDATA[title1]]></Title>
// <Description><![CDATA[description1]]></Description>
// <PicUrl><![CDATA[picurl]]></PicUrl>
// <Url><![CDATA[url]]></Url>
// </item>
// </Articles>
@XStreamAlias("ToUserName")
private String toUserName ;
@XStreamAlias("FromUserName")
private String fromUserName ;
@XStreamAlias("CreateTime")
private long createTime ;
@XStreamAlias("MsgType")
private String msgType ;
@XStreamAlias("ArticleCount")
private Integer articleCount ;
@XStreamAlias("Articles")
private List<Articles> articles ;
}

View File

@ -0,0 +1,40 @@
package com.muyu.common.wechat.domain;
import com.thoughtworks.xstream.annotations.XStreamAlias;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @Author
* @Packagecom.muyu.wxapplication.massage
* @ProjectWXApplication
* @nameTextMessage
* @Date2024/9/18 11:33
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@XStreamAlias("xml")
public class TextMessage {
//起一个别名 因为我们微信返回信息与java代码格式规范发生冲突
//微信格式 ToUserName
//JAVA格式 toUserName
@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;
}
// <ToUserName><![CDATA[toUser]]></ToUserName>
// <FromUserName><![CDATA[fromUser]]></FromUserName>
// <CreateTime>12345678</CreateTime>
// <MsgType><![CDATA[text]]></MsgType>
// <Content><![CDATA[你好]]></Content>

View File

@ -0,0 +1,38 @@
package com.muyu;
import junit.framework.Test;
import junit.framework.TestCase;
import junit.framework.TestSuite;
/**
* Unit test for simple App.
*/
public class AppTest
extends TestCase
{
/**
* Create the test case
*
* @param testName name of the test case
*/
public AppTest( String testName )
{
super( testName );
}
/**
* @return the suite of tests being tested
*/
public static Test suite()
{
return new TestSuite( AppTest.class );
}
/**
* Rigourous Test :-)
*/
public void testApp()
{
assertTrue( true );
}
}

View File

@ -20,6 +20,7 @@
<module>cloud-common-system</module> <module>cloud-common-system</module>
<module>cloud-common-xxl</module> <module>cloud-common-xxl</module>
<module>cloud-common-rabbit</module> <module>cloud-common-rabbit</module>
<module>cloud-common-wechat</module>
</modules> </modules>
<artifactId>cloud-common</artifactId> <artifactId>cloud-common</artifactId>

View File

@ -7,7 +7,7 @@ nacos:
addr: 159.75.188.178:8848 addr: 159.75.188.178:8848
user-name: nacos user-name: nacos
password: nacos password: nacos
namespace: eight namespace: psr
# Spring # Spring
spring: spring:

View File

@ -7,7 +7,7 @@ nacos:
addr: 159.75.188.178:8848 addr: 159.75.188.178:8848
user-name: nacos user-name: nacos
password: nacos password: nacos
namespace: eight namespace: psr
# Spring # Spring
spring: spring:

View File

@ -7,7 +7,7 @@ nacos:
addr: 159.75.188.178:8848 addr: 159.75.188.178:8848
user-name: nacos user-name: nacos
password: nacos password: nacos
namespace: eight namespace: psr
# Spring # Spring
spring: spring:

View File

@ -7,7 +7,7 @@ nacos:
addr: 159.75.188.178:8848 addr: 159.75.188.178:8848
user-name: nacos user-name: nacos
password: nacos password: nacos
namespace: eight namespace: psr
# SPRING_AMQP_DESERIALIZATION_TRUST_ALL=true spring.amqp.deserialization.trust.all # SPRING_AMQP_DESERIALIZATION_TRUST_ALL=true spring.amqp.deserialization.trust.all
# Spring # Spring
spring: spring:

View File

@ -0,0 +1,112 @@
<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.muyu</groupId>
<artifactId>cloud-modules</artifactId>
<version>3.6.3</version>
</parent>
<artifactId>cloud-modules-warn</artifactId>
<packaging>jar</packaging>
<name>cloud-modules-warn</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<!-- SpringCloud Alibaba Nacos -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!-- SpringCloud Alibaba Nacos Config -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<!-- SpringCloud Alibaba Sentinel -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
<!-- SpringBoot Actuator -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!-- Mysql Connector -->
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
</dependency>
<!-- MuYu Common DataSource -->
<dependency>
<groupId>com.muyu</groupId>
<artifactId>cloud-common-datasource</artifactId>
</dependency>
<!-- MuYu Common DataScope -->
<dependency>
<groupId>com.muyu</groupId>
<artifactId>cloud-common-datascope</artifactId>
</dependency>
<!-- MuYu Common Log -->
<dependency>
<groupId>com.muyu</groupId>
<artifactId>cloud-common-log</artifactId>
</dependency>
<!-- 接口模块 -->
<dependency>
<groupId>com.muyu</groupId>
<artifactId>cloud-common-api-doc</artifactId>
</dependency>
<!-- XllJob定时任务 -->
<dependency>
<groupId>com.muyu</groupId>
<artifactId>cloud-common-xxl</artifactId>
</dependency>
<dependency>
<groupId>com.muyu</groupId>
<artifactId>cloud-common-rabbit</artifactId>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<finalName>${project.artifactId}</finalName>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>

View File

@ -0,0 +1,23 @@
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
* @Packagecom.muyu.warn
* @Projectcloud-server-8
* @nameCloudWarnApplication
* @Date2024/9/20 8:33
*/
@EnableCustomConfig
//@EnableCustomSwagger2
@EnableMyFeignClients
@SpringBootApplication
public class CloudWarnApplication {
public static void main(String[] args) {
SpringApplication.run(CloudWarnApplication.class, args);
}
}

View File

@ -0,0 +1,111 @@
package com.muyu.warn.controller;
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 com.muyu.warn.domain.WarnLogs;
import com.muyu.warn.domain.WarnStrategy;
import com.muyu.warn.service.WarnLogsService;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import java.util.Arrays;
import java.util.List;
import static com.muyu.common.core.domain.Result.error;
import static com.muyu.common.core.domain.Result.success;
import static com.muyu.common.core.utils.PageUtils.startPage;
/**
* @Author
* @Packagecom.muyu.warn.controller
* @Projectcloud-server-8
* @nameWarnLogsController
* @Date2024/9/20 7:29
*/
@RestController
@RequestMapping("/logs")
public class WarnLogsController extends BaseController {
@Autowired private WarnLogsService warnLogsService;
/**
*
*/
@RequiresPermissions("platform:logs:list")
@GetMapping("/list")
public Result<TableDataInfo<WarnLogs>> list(WarnLogs warnLogs)
{
startPage();
List<WarnLogs> list = warnLogsService.selectWarnLogsList(warnLogs);
return getDataTable(list);
}
/**
*
*/
@RequiresPermissions("platform:logs:export")
@PostMapping("/export")
public void export(HttpServletResponse response, WarnLogs warnLogs)
{
List<WarnLogs> list = warnLogsService.selectWarnLogsList(warnLogs);
ExcelUtil<WarnLogs> util = new ExcelUtil<WarnLogs>(WarnLogs.class);
util.exportExcel(response, list, "预警日志数据");
}
/**
*
*/
@RequiresPermissions("platform:logs:query")
@GetMapping(value = "/{id}")
public Result<List<WarnLogs>> getInfo(@PathVariable("id") Long id)
{
return success(warnLogsService.selectWarnLogsById(id));
}
/**
*
*/
@RequiresPermissions("platform:logs:add")
@PostMapping
public Result<Integer> add(
@Validated @RequestBody WarnLogs warnLogs)
{
if (warnLogsService.checkIdUnique(warnLogs)) {
return error("新增 预警日志 '" + warnLogs + "'失败,预警日志已存在");
}
return toAjax(warnLogsService.save(warnLogs));
}
/**
*
*/
@RequiresPermissions("platform:logs:edit")
@PutMapping
public Result<Integer> edit(
@Validated @RequestBody WarnLogs warnLogs)
{
if (!warnLogsService.checkIdUnique(warnLogs)) {
return error("修改 预警日志 '" + warnLogs + "'失败,预警日志不存在");
}
// warnLogs.setUpdateBy(SecurityUtils.getUsername());
return toAjax(warnLogsService.updateById(warnLogs));
}
/**
*
*/
@RequiresPermissions("platform:logs:remove")
@DeleteMapping("/{ids}")
public Result<Integer> remove(@PathVariable("ids") Long[] ids)
{
warnLogsService.removeBatchByIds(Arrays.asList(ids));
return success();
}
}

View File

@ -0,0 +1,106 @@
package com.muyu.warn.controller;
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 com.muyu.warn.domain.WarnRule;
import com.muyu.warn.service.WarnRuleService;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import java.util.Arrays;
import java.util.List;
/**
* @Author
* @Packagecom.muyu.warn.controller
* @Projectcloud-server-8
* @nameWarnLogsController
* @Date2024/9/20 7:29
*/
@RestController
@RequestMapping("/rule")
public class WarnRuleController extends BaseController
{
@Resource
private WarnRuleService warnRuleService;
/**
*
*/
@RequiresPermissions("platform:rule:list")
@GetMapping("/list")
public Result<TableDataInfo<WarnRule>> list(WarnRule warnRule)
{
startPage();
List<WarnRule> list = warnRuleService.selectWarnRuleList(warnRule);
return getDataTable(list);
}
/**
*
*/
@RequiresPermissions("platform:rule:export")
@PostMapping("/export")
public void export(HttpServletResponse response, WarnRule warnRule)
{
List<WarnRule> list = warnRuleService.selectWarnRuleList(warnRule);
ExcelUtil<WarnRule> util = new ExcelUtil<WarnRule>(WarnRule.class);
util.exportExcel(response, list, "预警规则数据");
}
/**
*
*/
@RequiresPermissions("platform:rule:query")
@GetMapping(value = "/{id}")
public Result<List<WarnRule>> getInfo(@PathVariable("id") Long id)
{
return success(warnRuleService.selectWarnRuleById(id));
}
/**
*
*/
@RequiresPermissions("platform:rule:add")
@PostMapping
public Result<Integer> add(
@Validated @RequestBody WarnRule warnRule)
{
if (warnRuleService.checkIdUnique(warnRule)) {
return error("新增 预警规则 '" + warnRule + "'失败,预警规则已存在");
}
return toAjax(warnRuleService.save(warnRule));
}
/**
*
*/
@RequiresPermissions("platform:rule:edit")
@PutMapping
public Result<Integer> edit(
@Validated @RequestBody WarnRule warnRule)
{
if (!warnRuleService.checkIdUnique(warnRule)) {
return error("修改 预警规则 '" + warnRule + "'失败,预警规则不存在");
}
// warnRule.setUpdateBy(SecurityUtils.getUsername());
return toAjax(warnRuleService.updateById(warnRule));
}
/**
*
*/
@RequiresPermissions("platform:rule:remove")
@DeleteMapping("/{ids}")
public Result<Integer> remove(@PathVariable("ids") Long[] ids)
{
warnRuleService.removeBatchByIds(Arrays.asList(ids));
return success();
}
}

View File

@ -0,0 +1,106 @@
package com.muyu.warn.controller;
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 com.muyu.warn.domain.WarnStrategy;
import com.muyu.warn.service.WarnStrategyService;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import java.util.Arrays;
import java.util.List;
/**
* @Author
* @Packagecom.muyu.warn.controller
* @Projectcloud-server-8
* @nameWarnLogsController
* @Date2024/9/20 7:29
*/
@RestController
@RequestMapping("/strategy")
public class WarnStrategyController extends BaseController
{
@Resource
private WarnStrategyService warnStrategyService;
/**
*
*/
@RequiresPermissions("platform:strategy:list")
@GetMapping("/list")
public Result<TableDataInfo<WarnStrategy>> list(WarnStrategy warnStrategy)
{
startPage();
List<WarnStrategy> list = warnStrategyService.selectWarnStrategyList(warnStrategy);
return getDataTable(list);
}
/**
*
*/
@RequiresPermissions("platform:strategy:export")
@PostMapping("/export")
public void export(HttpServletResponse response, WarnStrategy warnStrategy)
{
List<WarnStrategy> list = warnStrategyService.selectWarnStrategyList(warnStrategy);
ExcelUtil<WarnStrategy> util = new ExcelUtil<WarnStrategy>(WarnStrategy.class);
util.exportExcel(response, list, "预警策略数据");
}
/**
*
*/
@RequiresPermissions("platform:strategy:query")
@GetMapping(value = "/{id}")
public Result<List<WarnStrategy>> getInfo(@PathVariable("id") Long id)
{
return success(warnStrategyService.selectWarnStrategyById(id));
}
/**
*
*/
@RequiresPermissions("platform:strategy:add")
@PostMapping
public Result<Integer> add(
@Validated @RequestBody WarnStrategy warnStrategy)
{
if (warnStrategyService.checkIdUnique(warnStrategy)) {
return error("新增 预警策略 '" + warnStrategy + "'失败,预警策略已存在");
}
return toAjax(warnStrategyService.save(warnStrategy));
}
/**
*
*/
@RequiresPermissions("platform:strategy:edit")
@PutMapping
public Result<Integer> edit(
@Validated @RequestBody WarnStrategy warnStrategy)
{
if (!warnStrategyService.checkIdUnique(warnStrategy)) {
return error("修改 预警策略 '" + warnStrategy + "'失败,预警策略不存在");
}
// warnStrategy.setUpdateBy(SecurityUtils.getUsername());
return toAjax(warnStrategyService.updateById(warnStrategy));
}
/**
*
*/
@RequiresPermissions("platform:strategy:remove")
@DeleteMapping("/{ids}")
public Result<Integer> remove(@PathVariable("ids") Long[] ids)
{
warnStrategyService.removeBatchByIds(Arrays.asList(ids));
return success();
}
}

View File

@ -0,0 +1,104 @@
package com.muyu.warn.domain;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.muyu.common.core.annotation.Excel;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.format.annotation.DateTimeFormat;
import java.util.Date;
/**
* @Author
* @Packagecom.muyu.warn.domain
* @Projectcloud-server-8
* @nameWarnLogs
* @Date2024/9/20 7:11
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@TableName("warn_logs")
public class WarnLogs {
/**
* id
*/
@Excel(name = "预警日志id", cellType = Excel.ColumnType.NUMERIC)
@TableId( type = IdType.AUTO)
private Long id ;
/**
* vin
*/
@Excel(name = "车辆vin码")
private String vin ;
/**
* id
*/
@Excel(name = "规则id")
private Long warnRuleId ;
/**
*
*/
@Excel(name = "开始时间")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date startTime ;
/**
*
*/
@Excel(name = "结束时间")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
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 ;
// /**
// * 创建人
// */
// @Excel(name = "创建人")
// private String createBy ;
// /**
// * 创建时间
// */
// @Excel(name = "创建时间")
// private String createTime ;
// /**
// * 更新人
// */
// @Excel(name = "更新人")
// private String updateBy ;
// /**
// * 更新时间
// */
// @Excel(name = "更新时间")
// private String updateTime ;
}

View File

@ -0,0 +1,74 @@
package com.muyu.warn.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 lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @Author
* @Packagecom.muyu.warn.domain
* @Projectcloud-server-8
* @nameWarnRule
* @Date2024/9/20 7:20
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@TableName("warn_rule")
public class WarnRule {
/**
* id
*/
@TableId( type = IdType.AUTO)
private Long id ;
/**
*
*/
private String ruleName ;
/**
* id
*/
private Long strategyId ;
/**
* id
*/
private Long msgTypeId ;
/**
*
*/
private Long slideTime ;
/**
*
*/
private Long slideFrequency ;
/**
*
*/
private Long maxValue ;
/**
*
*/
private Long minValue ;
// /**
// * 创建人
// */
// private String createBy ;
// /**
// * 创建时间
// */
// private String createTime ;
// /**
// * 更新人
// */
// private String updateBy ;
// /**
// * 更新时间
// */
// private String updateTime ;
}

View File

@ -0,0 +1,58 @@
package com.muyu.warn.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 lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @Author
* @Packagecom.muyu.warn.domain
* @Projectcloud-server-8
* @nameWarnStrategy
* @Date2024/9/20 7:27
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@TableName("warn_strategy")
public class WarnStrategy {
/**
* id
*/
@TableId( type = IdType.AUTO)
private Long id ;
/**
* id
*/
private Long carTypeId ;
/**
*
*/
private String strategyName ;
/**
* id
*/
private Long msgId ;
// /**
// * 创建人
// */
// private String createBy ;
// /**
// * 创建时间
// */
// private String createTime ;
// /**
// * 更新人
// */
// private String updateBy ;
// /**
// * 更新时间
// */
// private String updateTime ;
}

View File

@ -0,0 +1,18 @@
package com.muyu.warn.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.muyu.warn.domain.WarnLogs;
import org.apache.ibatis.annotations.Mapper;
/**
* @Author
* @Packagecom.muyu.warn.mapper
* @Projectcloud-server-8
* @nameWarnLogsMapper
* @Date2024/9/20 7:31
*/
@Mapper
public interface WarnLogsMapper extends BaseMapper<WarnLogs> {
}

View File

@ -0,0 +1,17 @@
package com.muyu.warn.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.muyu.warn.domain.WarnRule;
import org.apache.ibatis.annotations.Mapper;
/**
* @Author
* @Packagecom.muyu.warn.controller
* @Projectcloud-server-8
* @nameWarnLogsController
* @Date2024/9/20 7:29
*/
@Mapper
public interface WarnRuleMapper extends BaseMapper<WarnRule> {
}

View File

@ -0,0 +1,17 @@
package com.muyu.warn.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.muyu.warn.domain.WarnStrategy;
import org.apache.ibatis.annotations.Mapper;
/**
* @Author
* @Packagecom.muyu.warn.controller
* @Projectcloud-server-8
* @nameWarnLogsController
* @Date2024/9/20 7:29
*/
@Mapper
public interface WarnStrategyMapper extends BaseMapper<WarnStrategy> {
}

View File

@ -0,0 +1,40 @@
package com.muyu.warn.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.muyu.warn.domain.WarnLogs;
import java.util.List;
/**
* @Author
* @Packagecom.muyu.warn.service
* @Projectcloud-server-8
* @nameWarnLogsService
* @Date2024/9/20 7:32
*/
public interface WarnLogsService extends IService<WarnLogs> {
/**
*
*
* @param id
* @return
*/
public WarnLogs selectWarnLogsById(Long id);
/**
*
*
* @param warnLogs
* @return
*/
public List<WarnLogs> selectWarnLogsList(WarnLogs warnLogs);
/**
* id
* @param warnLogs
* @return
*/
Boolean checkIdUnique(WarnLogs warnLogs);
}

View File

@ -0,0 +1,39 @@
package com.muyu.warn.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.muyu.warn.domain.WarnRule;
import java.util.List;
/**
* @Author
* @Packagecom.muyu.warn.controller
* @Projectcloud-server-8
* @nameWarnLogsController
* @Date2024/9/20 7:29
*/
public interface WarnRuleService extends IService<WarnRule> {
/**
*
*
* @param id
* @return
*/
public WarnRule selectWarnRuleById(Long id);
/**
*
*
* @param warnRule
* @return
*/
public List<WarnRule> selectWarnRuleList(WarnRule warnRule);
/**
* id
* @param warnRule
* @return
*/
Boolean checkIdUnique(WarnRule warnRule);
}

View File

@ -0,0 +1,39 @@
package com.muyu.warn.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.muyu.warn.domain.WarnStrategy;
import java.util.List;
/**
* @Author
* @Packagecom.muyu.warn.controller
* @Projectcloud-server-8
* @nameWarnLogsController
* @Date2024/9/20 7:29
*/
public interface WarnStrategyService extends IService<WarnStrategy> {
/**
*
*
* @param id
* @return
*/
public WarnStrategy selectWarnStrategyById(Long id);
/**
*
*
* @param warnStrategy
* @return
*/
public List<WarnStrategy> selectWarnStrategyList(WarnStrategy warnStrategy);
/**
* id
* @param warnStrategy
* @return
*/
Boolean checkIdUnique(WarnStrategy warnStrategy);
}

View File

@ -0,0 +1,98 @@
package com.muyu.warn.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Assert;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.muyu.common.core.utils.StringUtils;
import com.muyu.warn.domain.WarnLogs;
import com.muyu.warn.mapper.WarnLogsMapper;
import com.muyu.warn.service.WarnLogsService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.Collection;
import java.util.List;
/**
* @Author
* @Packagecom.muyu.warn.service.impl
* @Projectcloud-server-8
* @nameWarnLogsServiceImpl
* @Date2024/9/20 7:39
*/
@Service
public class WarnLogsServiceImpl
extends ServiceImpl<WarnLogsMapper, WarnLogs>
implements WarnLogsService {
@Autowired private WarnLogsMapper warnLogsMapper;
/**
*
*
* @param id
* @return
*/
@Override
public WarnLogs selectWarnLogsById(Long id)
{
LambdaQueryWrapper<WarnLogs> queryWrapper = new LambdaQueryWrapper<>();
Assert.notNull(id, "id不可为空");
queryWrapper.eq(WarnLogs::getId, id);
return this.getOne(queryWrapper);
}
/**
*
*
* @param warnLogs
* @return
*/
@Override
public List<WarnLogs> selectWarnLogsList(WarnLogs warnLogs)
{
LambdaQueryWrapper<WarnLogs> 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<WarnLogs> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(WarnLogs::getId, warnLogs.getId());
return this.count(queryWrapper) > 0;
}
}

View File

@ -0,0 +1,88 @@
package com.muyu.warn.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.muyu.common.core.utils.StringUtils;
import com.muyu.warn.domain.WarnRule;
import com.muyu.warn.mapper.WarnRuleMapper;
import com.muyu.warn.service.WarnRuleService;
import org.springframework.stereotype.Service;
import org.springframework.util.Assert;
import java.util.List;
/**
* @Author
* @Packagecom.muyu.warn.controller
* @Projectcloud-server-8
* @nameWarnLogsController
* @Date2024/9/20 7:29
*/
@Service
public class WarnRuleServiceImpl
extends ServiceImpl<WarnRuleMapper, WarnRule>
implements WarnRuleService {
/**
*
*
* @param id
* @return
*/
@Override
public WarnRule selectWarnRuleById(Long id)
{
LambdaQueryWrapper<WarnRule> queryWrapper = new LambdaQueryWrapper<>();
Assert.notNull(id, "id不可为空");
queryWrapper.eq(WarnRule::getId, id);
return this.getOne(queryWrapper);
}
/**
*
*
* @param warnRule
* @return
*/
@Override
public List<WarnRule> selectWarnRuleList(WarnRule warnRule)
{
LambdaQueryWrapper<WarnRule> queryWrapper = new LambdaQueryWrapper<>();
if (StringUtils.isNotEmpty(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<WarnRule> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(WarnRule::getId, warnRule.getId());
return this.count(queryWrapper) > 0;
}
}

View File

@ -0,0 +1,76 @@
package com.muyu.warn.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.muyu.common.core.utils.StringUtils;
import com.muyu.warn.domain.WarnStrategy;
import com.muyu.warn.mapper.WarnStrategyMapper;
import com.muyu.warn.service.WarnStrategyService;
import org.springframework.stereotype.Service;
import org.springframework.util.Assert;
import java.util.List;
/**
* @Author
* @Packagecom.muyu.warn.controller
* @Projectcloud-server-8
* @nameWarnLogsController
* @Date2024/9/20 7:29
*/
@Service
public class WarnStrategyServiceImpl
extends ServiceImpl<WarnStrategyMapper, WarnStrategy>
implements WarnStrategyService {
/**
*
*
* @param id
* @return
*/
@Override
public WarnStrategy selectWarnStrategyById(Long id)
{
LambdaQueryWrapper<WarnStrategy> queryWrapper = new LambdaQueryWrapper<>();
Assert.notNull(id, "id不可为空");
queryWrapper.eq(WarnStrategy::getId, id);
return this.getOne(queryWrapper);
}
/**
*
*
* @param warnStrategy
* @return
*/
@Override
public List<WarnStrategy> selectWarnStrategyList(WarnStrategy warnStrategy)
{
LambdaQueryWrapper<WarnStrategy> queryWrapper = new LambdaQueryWrapper<>();
if (StringUtils.isNotNull(warnStrategy.getCarTypeId())){
queryWrapper.eq(WarnStrategy::getCarTypeId, warnStrategy.getCarTypeId());
}
if (StringUtils.isNotEmpty(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<WarnStrategy> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(WarnStrategy::getId, warnStrategy.getId());
return this.count(queryWrapper) > 0;
}
}

View File

@ -0,0 +1,2 @@
Spring Boot Version: ${spring-boot.version}
Spring Application Name: ${spring.application.name}

View File

@ -0,0 +1,60 @@
# Tomcat
server:
port: 10004
# nacos线上地址
nacos:
addr: 159.75.188.178:8848
user-name: nacos
password: nacos
namespace: psr
# 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-warn
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.system.mapper: DEBUG

View File

@ -0,0 +1,74 @@
<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="60 seconds" debug="false">
<!-- 日志存放路径 -->
<property name="log.path" value="logs/cloud-wechat"/>
<!-- 日志输出格式 -->
<property name="log.pattern" value="%d{HH:mm:ss.SSS} [%thread] %-5level %logger{20} - [%method,%line] - %msg%n"/>
<!-- 控制台输出 -->
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>${log.pattern}</pattern>
</encoder>
</appender>
<!-- 系统日志输出 -->
<appender name="file_info" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.path}/info.log</file>
<!-- 循环政策:基于时间创建日志文件 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 日志文件名格式 -->
<fileNamePattern>${log.path}/info.%d{yyyy-MM-dd}.log</fileNamePattern>
<!-- 日志最大的历史 60天 -->
<maxHistory>60</maxHistory>
</rollingPolicy>
<encoder>
<pattern>${log.pattern}</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<!-- 过滤的级别 -->
<level>INFO</level>
<!-- 匹配时的操作:接收(记录) -->
<onMatch>ACCEPT</onMatch>
<!-- 不匹配时的操作:拒绝(不记录) -->
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<appender name="file_error" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.path}/error.log</file>
<!-- 循环政策:基于时间创建日志文件 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 日志文件名格式 -->
<fileNamePattern>${log.path}/error.%d{yyyy-MM-dd}.log</fileNamePattern>
<!-- 日志最大的历史 60天 -->
<maxHistory>60</maxHistory>
</rollingPolicy>
<encoder>
<pattern>${log.pattern}</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<!-- 过滤的级别 -->
<level>ERROR</level>
<!-- 匹配时的操作:接收(记录) -->
<onMatch>ACCEPT</onMatch>
<!-- 不匹配时的操作:拒绝(不记录) -->
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!-- 系统模块日志级别控制 -->
<logger name="com.muyu" level="info"/>
<!-- Spring日志级别控制 -->
<logger name="org.springframework" level="warn"/>
<root level="info">
<appender-ref ref="console"/>
</root>
<!--系统操作日志-->
<root level="info">
<appender-ref ref="file_info"/>
<appender-ref ref="file_error"/>
</root>
</configuration>

View File

@ -0,0 +1,81 @@
<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="60 seconds" debug="false">
<!-- 日志存放路径 -->
<property name="log.path" value="logs/cloud-wechat"/>
<!-- 日志输出格式 -->
<property name="log.pattern" value="%d{HH:mm:ss.SSS} [%thread] %-5level %logger{20} - [%method,%line] - %msg%n"/>
<property name="log.sky.pattern" value="%d{HH:mm:ss.SSS} %yellow([%tid]) [%thread] %-5level %logger{20} - [%method,%line] - %msg%n"/>
<!-- 控制台输出 -->
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>${log.sky.pattern}</pattern>
</encoder>
</appender>
<!-- 系统日志输出 -->
<appender name="file_info" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.path}/info.log</file>
<!-- 循环政策:基于时间创建日志文件 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 日志文件名格式 -->
<fileNamePattern>${log.path}/info.%d{yyyy-MM-dd}.log</fileNamePattern>
<!-- 日志最大的历史 60天 -->
<maxHistory>60</maxHistory>
</rollingPolicy>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<!-- 过滤的级别 -->
<level>INFO</level>
<!-- 匹配时的操作:接收(记录) -->
<onMatch>ACCEPT</onMatch>
<!-- 不匹配时的操作:拒绝(不记录) -->
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<appender name="file_error" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.path}/error.log</file>
<!-- 循环政策:基于时间创建日志文件 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 日志文件名格式 -->
<fileNamePattern>${log.path}/error.%d{yyyy-MM-dd}.log</fileNamePattern>
<!-- 日志最大的历史 60天 -->
<maxHistory>60</maxHistory>
</rollingPolicy>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<!-- 过滤的级别 -->
<level>ERROR</level>
<!-- 匹配时的操作:接收(记录) -->
<onMatch>ACCEPT</onMatch>
<!-- 不匹配时的操作:拒绝(不记录) -->
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!-- 使用gRpc将日志发送到skywalking服务端 -->
<appender name="GRPC_LOG" class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.log.GRPCLogClientAppender">
<encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
<layout class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.TraceIdPatternLogbackLayout">
<Pattern>${log.sky.pattern}</Pattern>
</layout>
</encoder>
</appender>
<!-- 系统模块日志级别控制 -->
<logger name="com.muyu" level="info"/>
<!-- Spring日志级别控制 -->
<logger name="org.springframework" level="warn"/>
<root level="info">
<appender-ref ref="GRPC_LOG"/>
<appender-ref ref="console"/>
</root>
<!--系统操作日志-->
<root level="info">
<appender-ref ref="file_info"/>
<appender-ref ref="file_error"/>
</root>
</configuration>

View File

@ -0,0 +1,81 @@
<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="60 seconds" debug="false">
<!-- 日志存放路径 -->
<property name="log.path" value="logs/cloud-wechat"/>
<!-- 日志输出格式 -->
<property name="log.pattern" value="%d{HH:mm:ss.SSS} [%thread] %-5level %logger{20} - [%method,%line] - %msg%n"/>
<property name="log.sky.pattern" value="%d{HH:mm:ss.SSS} %yellow([%tid]) [%thread] %-5level %logger{20} - [%method,%line] - %msg%n"/>
<!-- 控制台输出 -->
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>${log.sky.pattern}</pattern>
</encoder>
</appender>
<!-- 系统日志输出 -->
<appender name="file_info" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.path}/info.log</file>
<!-- 循环政策:基于时间创建日志文件 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 日志文件名格式 -->
<fileNamePattern>${log.path}/info.%d{yyyy-MM-dd}.log</fileNamePattern>
<!-- 日志最大的历史 60天 -->
<maxHistory>60</maxHistory>
</rollingPolicy>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<!-- 过滤的级别 -->
<level>INFO</level>
<!-- 匹配时的操作:接收(记录) -->
<onMatch>ACCEPT</onMatch>
<!-- 不匹配时的操作:拒绝(不记录) -->
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<appender name="file_error" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.path}/error.log</file>
<!-- 循环政策:基于时间创建日志文件 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 日志文件名格式 -->
<fileNamePattern>${log.path}/error.%d{yyyy-MM-dd}.log</fileNamePattern>
<!-- 日志最大的历史 60天 -->
<maxHistory>60</maxHistory>
</rollingPolicy>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<!-- 过滤的级别 -->
<level>ERROR</level>
<!-- 匹配时的操作:接收(记录) -->
<onMatch>ACCEPT</onMatch>
<!-- 不匹配时的操作:拒绝(不记录) -->
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!-- 使用gRpc将日志发送到skywalking服务端 -->
<appender name="GRPC_LOG" class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.log.GRPCLogClientAppender">
<encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
<layout class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.TraceIdPatternLogbackLayout">
<Pattern>${log.sky.pattern}</Pattern>
</layout>
</encoder>
</appender>
<!-- 系统模块日志级别控制 -->
<logger name="com.muyu" level="info"/>
<!-- Spring日志级别控制 -->
<logger name="org.springframework" level="warn"/>
<root level="info">
<appender-ref ref="GRPC_LOG"/>
<appender-ref ref="console"/>
</root>
<!--系统操作日志-->
<root level="info">
<appender-ref ref="file_info"/>
<appender-ref ref="file_error"/>
</root>
</configuration>

View File

@ -0,0 +1,38 @@
package com.muyu;
import junit.framework.Test;
import junit.framework.TestCase;
import junit.framework.TestSuite;
/**
* Unit test for simple App.
*/
public class AppTest
extends TestCase
{
/**
* Create the test case
*
* @param testName name of the test case
*/
public AppTest( String testName )
{
super( testName );
}
/**
* @return the suite of tests being tested
*/
public static Test suite()
{
return new TestSuite( AppTest.class );
}
/**
* Rigourous Test :-)
*/
public void testApp()
{
assertTrue( true );
}
}

View File

@ -0,0 +1,120 @@
<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.muyu</groupId>
<artifactId>cloud-server</artifactId>
<version>3.6.3</version>
<relativePath>../../pom.xml</relativePath>
</parent>
<artifactId>cloud-modules-wechat</artifactId>
<packaging>jar</packaging>
<name>cloud-modules-wechat</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<!-- SpringCloud Alibaba Nacos -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!-- SpringCloud Alibaba Nacos Config -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<!-- SpringCloud Alibaba Sentinel -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
<!-- SpringBoot Actuator -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!-- Mysql Connector -->
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
</dependency>
<!-- MuYu Common DataSource -->
<dependency>
<groupId>com.muyu</groupId>
<artifactId>cloud-common-datasource</artifactId>
</dependency>
<!-- MuYu Common DataScope -->
<dependency>
<groupId>com.muyu</groupId>
<artifactId>cloud-common-datascope</artifactId>
</dependency>
<!-- MuYu Common Log -->
<dependency>
<groupId>com.muyu</groupId>
<artifactId>cloud-common-log</artifactId>
</dependency>
<!-- 接口模块 -->
<dependency>
<groupId>com.muyu</groupId>
<artifactId>cloud-common-api-doc</artifactId>
</dependency>
<!-- XllJob定时任务 -->
<dependency>
<groupId>com.muyu</groupId>
<artifactId>cloud-common-xxl</artifactId>
</dependency>
<dependency>
<groupId>com.muyu</groupId>
<artifactId>cloud-common-rabbit</artifactId>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.muyu</groupId>
<artifactId>cloud-common-wechat</artifactId>
<version>3.6.3</version>
</dependency>
</dependencies>
<build>
<finalName>${project.artifactId}</finalName>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>

View File

@ -0,0 +1,15 @@
package com.muyu.wechat;
import com.muyu.common.security.annotation.EnableMyFeignClients;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
@EnableMyFeignClients
public class WeChatApplication {
public static void main(String[] args) {
SpringApplication.run(WeChatApplication.class, args);
}
}

View File

@ -0,0 +1,185 @@
package com.muyu.wechat.controller;
import com.muyu.common.wechat.domain.Articles;
import com.muyu.common.wechat.domain.NewsMessage;
import com.muyu.common.wechat.domain.TextMessage;
import com.muyu.wechat.util.WordUtil;
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.*;
/**
* @Author
* @Packagecom.muyu.wxapplication.controller
* @ProjectWXApplication
* @nameWXController
* @Date2024/9/17 8:27
*/
@RestController
public class WXController {
@GetMapping("/hello")
public String hello(){
return "Hello Wechat";
}
@GetMapping("/wechat")
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 = "Psan";
List<String> 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));
}
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;
}
@PostMapping("/")
public String receiveMessage(HttpServletRequest request) throws IOException {
ServletInputStream inputStream = request.getInputStream();
// 查看发送信息类型
// byte[] bytes = new byte[1024];
// int len = 0;
// while ((len = inputStream.read(bytes)) != -1) {
// System.out.println(new String(bytes, 0, len));
// }
HashMap<String, String> map = new HashMap<>();
// xstream工具类
SAXReader reader = new SAXReader();
try {
//读取request输入流获取Document对象
Document document = reader.read(inputStream);
//获取root节点
Element rootElement = document.getRootElement();
//获取所有子节点
List<Element> elements = rootElement.elements();
for (Element element : elements) {
map.put(element.getName(), element.getStringValue());
}
} catch (DocumentException e) {
throw new RuntimeException(e);
}
System.out.println(map);
String massage = null;
if ("图文".equals(map.get("Content"))) {
massage = getReplyNewsMessage(map);
} else {
massage = getReplyMessage(map);
}
// String massage = getReplyMessageByWord(map);
return massage;
}
/**
*
* @param map
* @return xml
*/
private String getReplyMessage(HashMap<String, String> 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;
}
/**
*
* @param map
* @return xml
*/
private String getReplyMessageByWord(HashMap<String, String> map) {
TextMessage textMessage = new TextMessage();
textMessage.setToUserName(map.get("FromUserName"));
textMessage.setFromUserName(map.get("ToUserName"));
textMessage.setMsgType("text");
textMessage.setContent(WordUtil.getWords(map.get("Content")));
textMessage.setCreateTime(System.currentTimeMillis()/1000);
//XStream将java对象转换为xml字符串
XStream xStream = new XStream();
xStream.processAnnotations(TextMessage.class);
String xml = xStream.toXML(textMessage);
return xml;
}
/**
*
* @param map
* @return
*/
private String getReplyNewsMessage(HashMap<String, String> map) {
NewsMessage newsMessage = new NewsMessage();
newsMessage.setToUserName(map.get("FromUserName"));
newsMessage.setFromUserName(map.get("ToUserName"));
newsMessage.setMsgType("news");
newsMessage.setCreateTime(System.currentTimeMillis()/1000);
newsMessage.setArticleCount(1);
List<Articles> articles = new ArrayList<>();
Articles article = new Articles();
article.setTitle("蓬叁测试公众号");
article.setDescription("来自蓬叁");
article.setUrl("http://www.psan.com");
article.setPicUrl("http://mmbiz.qpic.cn/mmbiz_jpg/ZR9F78J7iasww9HxBJRjsBMInrZ78YbXzKvgwy6iabyfZCiaM0CJKzOIS3fUAboIbh07s8icPfYW7RMiajLmx2opticw/0");
articles.add(article);
newsMessage.setArticles(articles);
//XStream将java对象转换为xml字符串
XStream xStream = new XStream();
xStream.processAnnotations(NewsMessage.class);
String xml = xStream.toXML(newsMessage);
return xml;
}
}

View File

@ -0,0 +1,41 @@
package com.muyu.wechat.token;
import com.alibaba.fastjson.JSON;
import com.muyu.common.wechat.domain.AccessToken;
import com.muyu.wechat.util.OkHttpUtils;
import org.springframework.stereotype.Component;
@Component
public class TokenUtil {
public final static String APP_ID = "wx962013f3b1eb0a51";
public final static String APP_SECRET ="5c4c0b2130e6fdf86d989237f9e201dc";
public static void main(String[] args) {
System.out.println(getAccessToken());
System.out.println(getAccessToken());
}
//域名
public final static String REDIRECT_DOMAIN ="er6zej.natappfree.cc";
private static AccessToken accessToken = new AccessToken();
// {"access_token":"84_E1XHZXQpPj-K6mbCRmGn58iIPU3w7ViwtZRwAt5QN39FP9VBLPq57S_XjRQY88upoYyT4Boil2P6gY8uoKLHuth-W5OczJzr5EGZoWeh2PwhTKEfR1NcCWjqgTYJREcAIAZHU","expires_in":7200}
private 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);
System.out.println(request);
AccessToken wechatToken = JSON.parseObject(request, AccessToken.class);
//redisService.setCacheObject("WECHAT_TOKEN",wechatToken.getAccessToken(),wechatToken.getExpiresIn(), TimeUnit.SECONDS);
if (wechatToken != null) {
accessToken.setExpiresTime(wechatToken.getExpires_in());
accessToken.setAccess_token(wechatToken.getAccess_token());
}
}
public static String getAccessToken(){
getToken();
return accessToken.getAccess_token();
}
}

View File

@ -0,0 +1,36 @@
package com.muyu.wechat.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(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;
}
}
}

View File

@ -0,0 +1,43 @@
package com.muyu.wechat.util;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
/**
* @Author
* @Packagecom.muyu.wxapplication.util
* @ProjectWXApplication
* @nameWordUtil
* @Date2024/9/18 7:38
*/
public class WordUtil {
//接口地址
public static final String WORD_URL = "http://apis.juhe.cn/tyfy/query";
//申请接口的请求key
// TODO: 您需要改变自己的请求key
public static final String KEY = "f9ef42f215679f6995585159c3e1073e";
public static String getWords(String word){
//发送http请求的url
String url = String.format(WORD_URL, KEY);
final String reponse = OkHttpUtils.sendPostRequest(url,JSONObject.toJSONString(word));
System.out.println("接口返回:"+reponse);
JSONObject jsonObject = JSONObject.parseObject(reponse) ;
Integer error_code = jsonObject.getInteger("error_code");
if (error_code == 0){
System.out.println("调用接口成功");
JSONObject result = jsonObject.getJSONObject("result");
JSONArray words = result.getJSONArray("words");
StringBuilder stringBuilder = new StringBuilder();
words.stream().forEach(w -> stringBuilder.append(w + ""));
System.out.println(stringBuilder);
return stringBuilder.toString();
} else {
System.out.println("调用接口失败:" + jsonObject.getString("reason"));
}
return null;
}
}

View File

@ -0,0 +1,2 @@
Spring Boot Version: ${spring-boot.version}
Spring Application Name: ${spring.application.name}

View File

@ -0,0 +1,60 @@
# Tomcat
server:
port: 10003
# nacos线上地址
nacos:
addr: 159.75.188.178:8848
user-name: nacos
password: nacos
namespace: psr
# 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-wechat
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.system.mapper: DEBUG

View File

@ -0,0 +1,74 @@
<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="60 seconds" debug="false">
<!-- 日志存放路径 -->
<property name="log.path" value="logs/cloud-wechat"/>
<!-- 日志输出格式 -->
<property name="log.pattern" value="%d{HH:mm:ss.SSS} [%thread] %-5level %logger{20} - [%method,%line] - %msg%n"/>
<!-- 控制台输出 -->
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>${log.pattern}</pattern>
</encoder>
</appender>
<!-- 系统日志输出 -->
<appender name="file_info" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.path}/info.log</file>
<!-- 循环政策:基于时间创建日志文件 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 日志文件名格式 -->
<fileNamePattern>${log.path}/info.%d{yyyy-MM-dd}.log</fileNamePattern>
<!-- 日志最大的历史 60天 -->
<maxHistory>60</maxHistory>
</rollingPolicy>
<encoder>
<pattern>${log.pattern}</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<!-- 过滤的级别 -->
<level>INFO</level>
<!-- 匹配时的操作:接收(记录) -->
<onMatch>ACCEPT</onMatch>
<!-- 不匹配时的操作:拒绝(不记录) -->
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<appender name="file_error" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.path}/error.log</file>
<!-- 循环政策:基于时间创建日志文件 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 日志文件名格式 -->
<fileNamePattern>${log.path}/error.%d{yyyy-MM-dd}.log</fileNamePattern>
<!-- 日志最大的历史 60天 -->
<maxHistory>60</maxHistory>
</rollingPolicy>
<encoder>
<pattern>${log.pattern}</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<!-- 过滤的级别 -->
<level>ERROR</level>
<!-- 匹配时的操作:接收(记录) -->
<onMatch>ACCEPT</onMatch>
<!-- 不匹配时的操作:拒绝(不记录) -->
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!-- 系统模块日志级别控制 -->
<logger name="com.muyu" level="info"/>
<!-- Spring日志级别控制 -->
<logger name="org.springframework" level="warn"/>
<root level="info">
<appender-ref ref="console"/>
</root>
<!--系统操作日志-->
<root level="info">
<appender-ref ref="file_info"/>
<appender-ref ref="file_error"/>
</root>
</configuration>

View File

@ -0,0 +1,81 @@
<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="60 seconds" debug="false">
<!-- 日志存放路径 -->
<property name="log.path" value="logs/cloud-wechat"/>
<!-- 日志输出格式 -->
<property name="log.pattern" value="%d{HH:mm:ss.SSS} [%thread] %-5level %logger{20} - [%method,%line] - %msg%n"/>
<property name="log.sky.pattern" value="%d{HH:mm:ss.SSS} %yellow([%tid]) [%thread] %-5level %logger{20} - [%method,%line] - %msg%n"/>
<!-- 控制台输出 -->
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>${log.sky.pattern}</pattern>
</encoder>
</appender>
<!-- 系统日志输出 -->
<appender name="file_info" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.path}/info.log</file>
<!-- 循环政策:基于时间创建日志文件 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 日志文件名格式 -->
<fileNamePattern>${log.path}/info.%d{yyyy-MM-dd}.log</fileNamePattern>
<!-- 日志最大的历史 60天 -->
<maxHistory>60</maxHistory>
</rollingPolicy>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<!-- 过滤的级别 -->
<level>INFO</level>
<!-- 匹配时的操作:接收(记录) -->
<onMatch>ACCEPT</onMatch>
<!-- 不匹配时的操作:拒绝(不记录) -->
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<appender name="file_error" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.path}/error.log</file>
<!-- 循环政策:基于时间创建日志文件 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 日志文件名格式 -->
<fileNamePattern>${log.path}/error.%d{yyyy-MM-dd}.log</fileNamePattern>
<!-- 日志最大的历史 60天 -->
<maxHistory>60</maxHistory>
</rollingPolicy>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<!-- 过滤的级别 -->
<level>ERROR</level>
<!-- 匹配时的操作:接收(记录) -->
<onMatch>ACCEPT</onMatch>
<!-- 不匹配时的操作:拒绝(不记录) -->
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!-- 使用gRpc将日志发送到skywalking服务端 -->
<appender name="GRPC_LOG" class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.log.GRPCLogClientAppender">
<encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
<layout class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.TraceIdPatternLogbackLayout">
<Pattern>${log.sky.pattern}</Pattern>
</layout>
</encoder>
</appender>
<!-- 系统模块日志级别控制 -->
<logger name="com.muyu" level="info"/>
<!-- Spring日志级别控制 -->
<logger name="org.springframework" level="warn"/>
<root level="info">
<appender-ref ref="GRPC_LOG"/>
<appender-ref ref="console"/>
</root>
<!--系统操作日志-->
<root level="info">
<appender-ref ref="file_info"/>
<appender-ref ref="file_error"/>
</root>
</configuration>

View File

@ -0,0 +1,81 @@
<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="60 seconds" debug="false">
<!-- 日志存放路径 -->
<property name="log.path" value="logs/cloud-wechat"/>
<!-- 日志输出格式 -->
<property name="log.pattern" value="%d{HH:mm:ss.SSS} [%thread] %-5level %logger{20} - [%method,%line] - %msg%n"/>
<property name="log.sky.pattern" value="%d{HH:mm:ss.SSS} %yellow([%tid]) [%thread] %-5level %logger{20} - [%method,%line] - %msg%n"/>
<!-- 控制台输出 -->
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>${log.sky.pattern}</pattern>
</encoder>
</appender>
<!-- 系统日志输出 -->
<appender name="file_info" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.path}/info.log</file>
<!-- 循环政策:基于时间创建日志文件 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 日志文件名格式 -->
<fileNamePattern>${log.path}/info.%d{yyyy-MM-dd}.log</fileNamePattern>
<!-- 日志最大的历史 60天 -->
<maxHistory>60</maxHistory>
</rollingPolicy>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<!-- 过滤的级别 -->
<level>INFO</level>
<!-- 匹配时的操作:接收(记录) -->
<onMatch>ACCEPT</onMatch>
<!-- 不匹配时的操作:拒绝(不记录) -->
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<appender name="file_error" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${log.path}/error.log</file>
<!-- 循环政策:基于时间创建日志文件 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 日志文件名格式 -->
<fileNamePattern>${log.path}/error.%d{yyyy-MM-dd}.log</fileNamePattern>
<!-- 日志最大的历史 60天 -->
<maxHistory>60</maxHistory>
</rollingPolicy>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<!-- 过滤的级别 -->
<level>ERROR</level>
<!-- 匹配时的操作:接收(记录) -->
<onMatch>ACCEPT</onMatch>
<!-- 不匹配时的操作:拒绝(不记录) -->
<onMismatch>DENY</onMismatch>
</filter>
</appender>
<!-- 使用gRpc将日志发送到skywalking服务端 -->
<appender name="GRPC_LOG" class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.log.GRPCLogClientAppender">
<encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
<layout class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.TraceIdPatternLogbackLayout">
<Pattern>${log.sky.pattern}</Pattern>
</layout>
</encoder>
</appender>
<!-- 系统模块日志级别控制 -->
<logger name="com.muyu" level="info"/>
<!-- Spring日志级别控制 -->
<logger name="org.springframework" level="warn"/>
<root level="info">
<appender-ref ref="GRPC_LOG"/>
<appender-ref ref="console"/>
</root>
<!--系统操作日志-->
<root level="info">
<appender-ref ref="file_info"/>
<appender-ref ref="file_error"/>
</root>
</configuration>

View File

@ -0,0 +1,38 @@
package com.muyu;
import junit.framework.Test;
import junit.framework.TestCase;
import junit.framework.TestSuite;
/**
* Unit test for simple App.
*/
public class AppTest
extends TestCase
{
/**
* Create the test case
*
* @param testName name of the test case
*/
public AppTest( String testName )
{
super( testName );
}
/**
* @return the suite of tests being tested
*/
public static Test suite()
{
return new TestSuite( AppTest.class );
}
/**
* Rigourous Test :-)
*/
public void testApp()
{
assertTrue( true );
}
}

View File

@ -12,6 +12,7 @@
<module>cloud-modules-system</module> <module>cloud-modules-system</module>
<module>cloud-modules-gen</module> <module>cloud-modules-gen</module>
<module>cloud-modules-file</module> <module>cloud-modules-file</module>
<module>cloud-modules-warn</module>
</modules> </modules>
<artifactId>cloud-modules</artifactId> <artifactId>cloud-modules</artifactId>

View File

@ -1,13 +1,13 @@
# Tomcat # Tomcat
server: server:
port: 9100 port: 9101
# nacos线上地址 # nacos线上地址
nacos: nacos:
addr: 159.75.188.178:8848 addr: 159.75.188.178:8848
user-name: nacos user-name: nacos
password: nacos password: nacos
namespace: eight namespace: psr
# Spring # Spring
spring: spring:

View File

@ -275,6 +275,7 @@
<module>cloud-visual</module> <module>cloud-visual</module>
<module>cloud-modules</module> <module>cloud-modules</module>
<module>cloud-common</module> <module>cloud-common</module>
<module>cloud-modules/cloud-modules-wechat</module>
</modules> </modules>
<packaging>pom</packaging> <packaging>pom</packaging>