master
Administrator 3 years ago
parent 1feaa1c977
commit 3e47748c5a

@ -59,6 +59,11 @@
<artifactId>beacon-common</artifactId> <artifactId>beacon-common</artifactId>
<version>1.0-SNAPSHOT</version> <version>1.0-SNAPSHOT</version>
</dependency> </dependency>
<!-- 为了访问缓存模块需要配置OpenFeign-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
</dependencies> </dependencies>
</project> </project>

@ -3,6 +3,7 @@ package com.mashibing.api;
import org.springframework.boot.SpringApplication; import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient; import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;
/** /**
* @author zjw * @author zjw
@ -10,6 +11,7 @@ import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
*/ */
@SpringBootApplication @SpringBootApplication
@EnableDiscoveryClient @EnableDiscoveryClient
@EnableFeignClients
public class ApiStarterApp { public class ApiStarterApp {
public static void main(String[] args) { public static void main(String[] args) {

@ -0,0 +1,14 @@
package com.mashibing.api.client;
import org.springframework.cloud.openfeign.FeignClient;
/**
* @author zjw
* @description
*/
@FeignClient(value = "beacon-cache")
public interface BeaconCacheClient {
}

@ -4,7 +4,11 @@ import com.mashibing.api.enums.SmsCodeEnum;
import com.mashibing.api.form.SingleSendForm; import com.mashibing.api.form.SingleSendForm;
import com.mashibing.api.util.R; import com.mashibing.api.util.R;
import com.mashibing.api.vo.ResultVO; import com.mashibing.api.vo.ResultVO;
import com.mashibing.common.model.StandardSubmit;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.validation.BindingResult; import org.springframework.validation.BindingResult;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PostMapping;
@ -12,6 +16,8 @@ import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest;
/** /**
* @author zjw * @author zjw
* @description * @description
@ -19,20 +25,87 @@ import org.springframework.web.bind.annotation.RestController;
@RestController @RestController
@RequestMapping("/sms") @RequestMapping("/sms")
@Slf4j @Slf4j
@RefreshScope
public class SmsController { public class SmsController {
/**
* IP','
*/
@Value("${headers}")
private String headers;
/**
*
*/
private final String UNKNOW = "unknow";
/**
* IP','
*/
private final String X_FORWARDED_FOR = "x-forwarded-for";
/**
*
* @param singleSendForm
* @param bindingResult
* @param req
* @return
*/
@PostMapping(value = "/single_send",produces = "application/json;charset=utf-8") @PostMapping(value = "/single_send",produces = "application/json;charset=utf-8")
public ResultVO singleSend(@RequestBody @Validated SingleSendForm singleSendForm, BindingResult bindingResult){ public ResultVO singleSend(@RequestBody @Validated SingleSendForm singleSendForm, BindingResult bindingResult, HttpServletRequest req){
//1. 校验参数 //1. 校验参数
if (bindingResult.hasErrors()){ if (bindingResult.hasErrors()){
String msg = bindingResult.getFieldError().getDefaultMessage(); String msg = bindingResult.getFieldError().getDefaultMessage();
log.info("【接口模块-单条短信Controller】 参数不合法 msg = {}",msg); log.info("【接口模块-单条短信Controller】 参数不合法 msg = {}",msg);
return R.error(SmsCodeEnum.PARAMETER_ERROR.getCode(),msg); return R.error(SmsCodeEnum.PARAMETER_ERROR.getCode(),msg);
} }
//=========================获取真实的IP地址=========================================
String ip = this.getRealIP(req);
//=========================构建StandardSubmit各种封装校验========================================= //=========================构建StandardSubmit各种封装校验=========================================
StandardSubmit submit = new StandardSubmit();
submit.setRealIP(ip);
submit.setApikey(singleSendForm.getApikey());
submit.setMobile(singleSendForm.getMobile());
submit.setText(singleSendForm.getText());
submit.setState(singleSendForm.getState());
submit.setUid(singleSendForm.getUid());
//=========================发送到MQ交给策略模块处理========================================= //=========================发送到MQ交给策略模块处理=========================================
return R.ok(); return R.ok();
} }
/**
* IP
* @param req
* @return
*/
private String getRealIP(HttpServletRequest req) {
//1. 声明返回的ip地址
String ip;
//2. 遍历请求头并且通过req获取ip地址
for (String header : headers.split(",")) {
// 健壮性校验
if (!StringUtils.isEmpty(header)) {
// 基于req获取ip地址
ip = req.getHeader(header);
// 如果获取到的ip不为null不为空串并且不为unknow就可以返回
if (!StringUtils.isEmpty(ip) && !UNKNOW.equalsIgnoreCase(ip)) {
// 判断请求头是否是x-forwarded-for
if (X_FORWARDED_FOR.equalsIgnoreCase(header) && ip.indexOf(",") > 0) {
ip = ip.substring(0,ip.indexOf(","));
}
// 返回IP地址
return ip;
}
}
}
//3. 如果请求头都没有获取到IP地址直接基于传统的方式获取一个IP
return req.getRemoteAddr();
}
} }

@ -28,9 +28,14 @@
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency> </dependency>
<!-- data系列的redis依赖--> <!-- data系列的redis依赖-->
<dependency> <!--<dependency>
<groupId>org.springframework.boot</groupId> <groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId> <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>-->
<!-- 使用飞马框架的cache组件-->
<dependency>
<groupId>com.msb.cloud</groupId>
<artifactId>horse-framework-starter-redis</artifactId>
</dependency> </dependency>
</dependencies> </dependencies>

@ -1,5 +1,7 @@
package com.mashibing.cache; package com.mashibing.cache;
import org.redisson.RedissonLock;
import org.redisson.client.RedisClient;
import org.springframework.boot.SpringApplication; import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient; import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

@ -19,10 +19,12 @@ import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter; import java.time.format.DateTimeFormatter;
/** /**
*
* RedisTemplate * RedisTemplate
* @author zjw * @author zjw
* @description * @description
*/ */
/*
@Configuration @Configuration
public class RedisConfig { public class RedisConfig {
@ -76,3 +78,4 @@ public class RedisConfig {
} }
*/

@ -0,0 +1,41 @@
package com.mashibing.cache.controller;
import com.msb.framework.redis.RedisClient;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
import java.util.Map;
import java.util.Set;
/**
* @author zjw
* @description
*/
@RestController
@Slf4j
public class CacheController {
@Autowired
private RedisClient redisClient;
@PostMapping(value = "/cache/hmset/{key}")
public void hmset(@PathVariable(value = "key") String key, @RequestBody Map<String, Object> map) {
log.info("【缓存模块】 hmset方法存储key = {}存储value = {}", key, map);
redisClient.putMap(key, map);
}
@PostMapping(value = "/cache/set/{key}")
public void set(@PathVariable(value = "key") String key, @RequestParam(value = "value") Object value) {
log.info("【缓存模块】 set方法存储key = {}存储value = {}", key, value);
redisClient.set(key, value);
}
@PostMapping(value = "/cache/sadd/{key}")
public void sadd(@PathVariable(value = "key")String key, @RequestBody Map<String,Object>... value){
log.info("【缓存模块】 sadd方法存储key = {}存储value = {}", key, value);
redisClient.sAdd(key,value);
}
}

@ -1,5 +1,6 @@
package com.mashibing.cache.controller; package com.mashibing.cache.controller;
import com.msb.framework.redis.RedisClient;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
@ -14,18 +15,18 @@ import java.util.Map;
public class TestController { public class TestController {
@Autowired @Autowired
private RedisTemplate<String,Object> redisTemplate; private RedisClient redisClient;
// 写测试 hash结构 // 写测试 hash结构
@PostMapping("/test/set/{key}") @PostMapping("/test/set/{key}")
public String set(@PathVariable String key, @RequestBody Map map){ public String set(@PathVariable String key, @RequestBody Map map){
redisTemplate.opsForHash().putAll(key,map); redisClient.putMap(key,map);
return "ok"; return "ok";
} }
// 读测试 // 读测试
@GetMapping("/test/get/{key}") @GetMapping("/test/get/{key}")
public Map get(@PathVariable String key){ public Map get(@PathVariable String key){
Map<Object, Object> result = redisTemplate.opsForHash().entries(key); Map<String, Object> result = redisClient.getMap(key);
return result; return result;
} }
} }

@ -93,6 +93,22 @@ public class StandardSubmit {
*/ */
private int reportState; private int reportState;
// =============================================================================
/**
* IP
*/
private String realIP;
/**
* apiKey
*/
private String apikey;
/**
* 0- 1- 2-
*/
private int state;
// 后续再做封装~~~~ // 后续再做封装~~~~
} }

@ -0,0 +1,45 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>beacon-cloud</artifactId>
<groupId>com.mashibing</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>beacon-test</artifactId>
<description>为了快速落地核心业务在这个test项目中将MySQL中的数据同步到redis缓存基于Cache模块去写入</description>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.2.2</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.49</version>
</dependency>
</dependencies>
</project>

@ -0,0 +1,22 @@
package com.mashibing.test;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;
/**
* @author zjw
* @description
*/
@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
@MapperScan(basePackages = "com.mashibing.test.mapper")
public class TestStarterApp {
public static void main(String[] args) {
SpringApplication.run(TestStarterApp.class,args);
}
}

@ -0,0 +1,28 @@
package com.mashibing.test.client;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestParam;
import java.util.Map;
import java.util.Set;
/**
* @author zjw
* @description
*/
@FeignClient(value = "beacon-cache")
public interface CacheClient {
@PostMapping(value = "/cache/hmset/{key}")
void hmset(@PathVariable(value = "key")String key, @RequestBody Map<String,Object> map);
@PostMapping(value = "/cache/set/{key}")
void set(@PathVariable(value = "key")String key, @RequestParam(value = "value")Object value);
@PostMapping(value = "/cache/sadd/{key}")
void sadd(@PathVariable(value = "key")String key, @RequestBody Map<String,Object>... maps);
}

@ -0,0 +1,15 @@
package com.mashibing.test.mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
/**
* @author zjw
* @description
*/
public interface ClientBalanceMapper {
@Select("select balance from client_balance where client_id = #{clientId}")
Long findByClientId(@Param("clientId")Long clientId);
}

@ -0,0 +1,16 @@
package com.mashibing.test.mapper;
import com.mashibing.test.entity.ClientBusiness;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
/**
* @author zjw
* @description
*/
public interface ClientBusinessMapper {
@Select("select * from client_business where id = #{id}")
ClientBusiness findById(@Param("id") Long id);
}

@ -0,0 +1,18 @@
package com.mashibing.test.mapper;
import com.mashibing.test.entity.ClientSign;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import java.util.List;
/**
* @author zjw
* @description
*/
public interface ClientSignMapper {
@Select("select * from client_sign where client_id = #{clientId}")
List<ClientSign> findByClientId(@Param("clientId")Long clientId);
}

@ -0,0 +1,18 @@
package com.mashibing.test.mapper;
import com.mashibing.test.entity.ClientTemplate;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import java.util.List;
/**
* @author zjw
* @description
*/
public interface ClientTemplateMapper {
@Select("select * from client_template where sign_id = #{signId}")
List<ClientTemplate> findBySignId(@Param("signId") Long signId);
}

@ -0,0 +1,23 @@
# 服务名
spring:
application:
name: beacon-test
# nacos地址
cloud:
nacos:
discovery:
server-addr: 114.116.226.76:8848
# datasource
datasource:
driver-class-name: org.gjt.mm.mysql.Driver
url: jdbc:mysql://114.116.226.76:3306/beacon_cloud?characterEncoding=utf-8
username: root
password: ZhengJinWei123!
# 端口号
server:
port: 20000
# mybatis
mybatis:
configuration:
map-underscore-to-camel-case: true

@ -0,0 +1,29 @@
package com.mashibing.test.mapper;
import com.mashibing.test.client.CacheClient;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import static org.junit.Assert.*;
@SpringBootTest
@RunWith(SpringRunner.class)
public class ClientBalanceMapperTest {
@Autowired
private ClientBalanceMapper mapper;
@Autowired
private CacheClient cacheClient;
@Test
public void findByClientId() {
Long balance = mapper.findByClientId(1L);
System.out.println(balance);
cacheClient.set("client_balance:1",balance);
}
}

@ -0,0 +1,41 @@
package com.mashibing.test.mapper;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.mashibing.test.client.CacheClient;
import com.mashibing.test.entity.ClientBusiness;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import java.util.Map;
import static org.junit.Assert.*;
@SpringBootTest
@RunWith(SpringRunner.class)
public class ClientBusinessMapperTest {
@Autowired
private ClientBusinessMapper mapper;
@Autowired
private CacheClient cacheClient;
/*
* hash
* keyclient_business:apikey
* valuejson
*
*/
@Test
public void findById() throws JsonProcessingException {
ClientBusiness cb = mapper.findById(1L);
ObjectMapper objectMapper = new ObjectMapper();
Map map = objectMapper.readValue(objectMapper.writeValueAsString(cb), Map.class);
cacheClient.hmset("client_business:" + cb.getApikey(),map);
}
}

@ -0,0 +1,48 @@
package com.mashibing.test.mapper;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.mashibing.test.client.CacheClient;
import com.mashibing.test.entity.ClientSign;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import static org.junit.Assert.*;
@SpringBootTest
@RunWith(SpringRunner.class)
public class ClientSignMapperTest {
@Autowired
private ClientSignMapper mapper;
@Autowired
private CacheClient cacheClient;
@Test
public void findByClientId() {
List<ClientSign> list = mapper.findByClientId(1L);
for (ClientSign clientSign : list) {
System.out.println(clientSign);
}
ObjectMapper objectMapper = new ObjectMapper();
List<Map> value = list.stream().map(cs -> {
try {
return objectMapper.readValue(objectMapper.writeValueAsString(cs), Map.class);
} catch (JsonProcessingException e) {
e.printStackTrace();
return null;
}
}).collect(Collectors.toList());
cacheClient.sadd("client_sign:1",value.toArray(new Map[]{}));
}
}

@ -0,0 +1,53 @@
package com.mashibing.test.mapper;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.mashibing.test.client.CacheClient;
import com.mashibing.test.entity.ClientTemplate;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.junit4.SpringRunner;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import static org.junit.Assert.*;
@SpringBootTest
@RunWith(SpringRunner.class)
public class ClientTemplateMapperTest {
@Autowired
private ClientTemplateMapper mapper;
@Autowired
private CacheClient cacheClient;
@Test
public void findBySignId() {
List<ClientTemplate> ct1 = mapper.findBySignId(15L);
List<ClientTemplate> ct2 = mapper.findBySignId(24L);
for (ClientTemplate clientTemplate : ct1) {
System.out.println(clientTemplate);
}
// ct2在现有的库中没有数据
System.out.println(ct2);
ObjectMapper objectMapper = new ObjectMapper();
List<Map> value = ct1.stream().map(ct -> {
try {
return objectMapper.readValue(objectMapper.writeValueAsString(ct), Map.class);
} catch (JsonProcessingException e) {
e.printStackTrace();
return null;
}
}).collect(Collectors.toList());
cacheClient.sadd("client_template:15",value.toArray(new Map[]{}));
}
}

@ -7,6 +7,7 @@
<module>beacon-api</module> <module>beacon-api</module>
<module>beacon-common</module> <module>beacon-common</module>
<module>beacon-cache</module> <module>beacon-cache</module>
<module>beacon-test</module>
</modules> </modules>
<parent> <parent>
<groupId>org.springframework.boot</groupId> <groupId>org.springframework.boot</groupId>
@ -23,6 +24,7 @@
<properties> <properties>
<spring.cloud-version>Hoxton.SR12</spring.cloud-version> <spring.cloud-version>Hoxton.SR12</spring.cloud-version>
<spring.cloud.alibaba-version>2.2.6.RELEASE</spring.cloud.alibaba-version> <spring.cloud.alibaba-version>2.2.6.RELEASE</spring.cloud.alibaba-version>
<horse-version>1.0.0</horse-version>
</properties> </properties>
<dependencyManagement> <dependencyManagement>
<dependencies> <dependencies>
@ -40,6 +42,13 @@
<type>pom</type> <type>pom</type>
<scope>import</scope> <scope>import</scope>
</dependency> </dependency>
<dependency>
<groupId>com.msb.cloud</groupId>
<artifactId>horse-framework-starters</artifactId>
<version>${horse-version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies> </dependencies>
</dependencyManagement> </dependencyManagement>

Loading…
Cancel
Save