diff --git a/bnyer-common/bnyer-common-redis/src/main/java/com/bnyer/common/redis/service/RedisService.java b/bnyer-common/bnyer-common-redis/src/main/java/com/bnyer/common/redis/service/RedisService.java index 46e3515..5540dc1 100644 --- a/bnyer-common/bnyer-common-redis/src/main/java/com/bnyer/common/redis/service/RedisService.java +++ b/bnyer-common/bnyer-common-redis/src/main/java/com/bnyer/common/redis/service/RedisService.java @@ -327,4 +327,28 @@ public class RedisService Long releaseStatus = (Long)this.redisTemplate.execute(redisScript, Collections.singletonList(key),value); return releaseStatus; } + + /** + * pv统计 + * @param today 统计的日期 + * @param page 统计的页面 + * @return pv + */ + public Long pvStatistics(String today,String page){ + //访问次数pv + return redisTemplate.opsForValue().increment(today +page+"PV", 1); + + } + /** + * uv统计 + * @param today 统计的日期 + * @param page 统计的页面 + * @param ip 进入页面的ip + * @return uv + */ + public Long uvStatistics(String today,String page,String ip){ + //访问次数uv + return redisTemplate.opsForHyperLogLog().add(today + page+"UV", ip); + + } } diff --git a/bnyer-services/bnyer-file/src/main/java/com/bnyer/file/service/impl/QiniuServiceImpl.java b/bnyer-services/bnyer-file/src/main/java/com/bnyer/file/service/impl/QiniuServiceImpl.java index b52bfa0..337a614 100644 --- a/bnyer-services/bnyer-file/src/main/java/com/bnyer/file/service/impl/QiniuServiceImpl.java +++ b/bnyer-services/bnyer-file/src/main/java/com/bnyer/file/service/impl/QiniuServiceImpl.java @@ -166,7 +166,8 @@ public class QiniuServiceImpl implements IQiniuService { videoSuffixList.add("mp4"); videoSuffixList.add("mov"); videoSuffixList.add("wmv"); - if (suffix != null&&imageSuffixList.contains(suffix)&&multipartFile.getSize() / 1024 < 50000&&multipartFile.getSize() / 1024 > 0) { + long size = multipartFile.getSize(); + if (suffix != null&&imageSuffixList.contains(suffix)&&multipartFile.getSize() / 1024 < 3072&&multipartFile.getSize() / 1024 > 0) { afterCheckFiles.add(multipartFile); } } diff --git a/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/BnyerImgApplication.java b/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/BnyerImgApplication.java index 433f48d..be25728 100644 --- a/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/BnyerImgApplication.java +++ b/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/BnyerImgApplication.java @@ -5,6 +5,7 @@ import com.bnyer.common.security.annotation.EnableRyFeignClients; import com.bnyer.common.swagger.annotation.EnableCustomSwagger2; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.scheduling.annotation.EnableAsync; /** * 系统模块 @@ -15,6 +16,7 @@ import org.springframework.boot.autoconfigure.SpringBootApplication; @EnableCustomSwagger2 @EnableRyFeignClients @SpringBootApplication +@EnableAsync public class BnyerImgApplication { public static void main(String[] args) diff --git a/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/config/AlipayConfig.java b/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/config/AlipayConfig.java index 7c95f63..09928e0 100644 --- a/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/config/AlipayConfig.java +++ b/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/config/AlipayConfig.java @@ -22,17 +22,17 @@ public class AlipayConfig{ private String gatewayUrl; @Value("${alipay.appId}") - public String appId; + private String appId; @Value("${alipay.privateKey}") - public String privateKey; + private String privateKey; @Value("${alipay.certPath}") - public String certPath; + private String certPath; @Value("${alipay.alipayPublicCertPath}") - public String alipayPublicCertPath; + private String alipayPublicCertPath; @Value("${alipay.rootPath}") - public String rootPath; + private String rootPath; } diff --git a/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/config/BzConfig.java b/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/config/BzConfig.java new file mode 100644 index 0000000..2fc33df --- /dev/null +++ b/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/config/BzConfig.java @@ -0,0 +1,25 @@ +package com.bnyer.img.config; + +import lombok.Getter; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.cloud.context.config.annotation.RefreshScope; +import org.springframework.context.annotation.Configuration; + +/** + * 八字算命配置类 + * @author chengkun + * @date 2022/4/21 17:43 + */ +@Configuration +@ConfigurationProperties(prefix = "bnyer.img.bz") +@Getter +@RefreshScope +public class BzConfig { + + @Value("${bnyer.img.bz.appCode}") + private String appCode; + + @Value("${bnyer.img.bz.url}") + private String url; +} diff --git a/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/config/FhConfig.java b/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/config/FhConfig.java index 9b462cc..0c39b7b 100644 --- a/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/config/FhConfig.java +++ b/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/config/FhConfig.java @@ -18,7 +18,7 @@ import org.springframework.context.annotation.Configuration; public class FhConfig { @Value("${bnyer.img.fasthand.appId}") - private String appId; + public String appId; @Value("${bnyer.img.fasthand.secret}") public String secret; diff --git a/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/config/TiktokConfig.java b/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/config/TiktokConfig.java index 0ca1522..2993230 100644 --- a/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/config/TiktokConfig.java +++ b/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/config/TiktokConfig.java @@ -26,13 +26,13 @@ public class TiktokConfig implements WebMvcConfigurer { private String appId; @Value("${bnyer.img.tiktok.secret}") - public String secret; + private String secret; @Value("${bnyer.img.tiktok.sessionInfoUrl}") - public String sessionInfoUrl; + private String sessionInfoUrl; @Value("${bnyer.img.tiktok.tokenUrl}") - public String tokenUrl; + private String tokenUrl; // @Resource // private TokenCheckHandler tokenCheckHandler; diff --git a/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/config/WxConfig.java b/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/config/WxConfig.java index 192166e..eb51a2a 100644 --- a/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/config/WxConfig.java +++ b/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/config/WxConfig.java @@ -26,12 +26,12 @@ public class WxConfig { private String appId; @Value("${bnyer.img.wechat.secret}") - public String secret; + private String secret; @Value("${bnyer.img.wechat.sessionInfoUrl}") - public String sessionInfoUrl; + private String sessionInfoUrl; @Value("${bnyer.img.wechat.tokenUrl}") - public String tokenUrl; + private String tokenUrl; } diff --git a/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/controller/BzDataController.java b/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/controller/BzDataController.java new file mode 100644 index 0000000..d360df4 --- /dev/null +++ b/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/controller/BzDataController.java @@ -0,0 +1,46 @@ +package com.bnyer.img.controller; + +import com.alibaba.fastjson.JSONObject; +import com.bnyer.common.core.domain.R; +import com.bnyer.common.core.web.controller.BaseController; +import com.bnyer.common.redis.service.RedisService; +import com.bnyer.img.dto.BzDto; +import com.bnyer.img.service.BzDataService; +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletRequest; + +@Api(value = "【图文平台】八字运势接口",tags = "【图文平台】八字运势接口") +@RestController +@RequestMapping("/img/bz") +@Slf4j +public class BzDataController extends BaseController { + + @Autowired + private BzDataService bzDataService; + @Autowired + private RedisService redisService; + //@RequiresPermissions("system:config:list") + @ApiOperation(value = "八字算命") + @PostMapping("/getYs") + public R getYs(@RequestBody @ApiParam("八字运势") BzDto dto) { + JSONObject jsonObject = bzDataService.getYs(dto); + if (jsonObject!=null){ + return R.ok(jsonObject); + } + return R.fail(); + } + + @ApiOperation(value = "八字页面数据统计") + @PostMapping("/dataStatistics") + public R dataStatistics(@RequestParam String source, HttpServletRequest request) { + String ip = bzDataService.getIpAddr(request); + bzDataService.dataStatistics(ip,source); + return R.ok(); + } +} \ No newline at end of file diff --git a/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/domain/BzData.java b/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/domain/BzData.java new file mode 100644 index 0000000..354a015 --- /dev/null +++ b/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/domain/BzData.java @@ -0,0 +1,61 @@ +package com.bnyer.img.domain; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.*; + +@ApiModel(value="com-bnyer-img-domain-BzData") +@Getter +@Setter +@ToString +@AllArgsConstructor +@NoArgsConstructor +@TableName(value = "img_bz_data") +public class BzData { + /** + * 主键id + */ + @TableId(value = "id", type = IdType.INPUT) + @ApiModelProperty(value="主键id") + private Long id; + + /** + * 日期 + */ + @TableField(value = "date") + @ApiModelProperty(value="日期 年月日") + private String date; + + /** + * pv + */ + @TableField(value = "pv") + @ApiModelProperty(value="pv") + private Long pv; + + /** + * uv + */ + @TableField(value = "uv") + @ApiModelProperty(value="uv") + private Long uv; + + /** + * 平台(0->Hub;1->抖音;2->快手;3->微信) + */ + @TableField(value = "source") + @ApiModelProperty(value="source") + private String source; + + /** + * 防止重复唯一标识 + */ + @TableField(value = "mark") + @ApiModelProperty(value="mark") + private String mark; + private static final long serialVersionUID = 1L; +} \ No newline at end of file diff --git a/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/dto/BzDto.java b/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/dto/BzDto.java new file mode 100644 index 0000000..76f5470 --- /dev/null +++ b/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/dto/BzDto.java @@ -0,0 +1,35 @@ +package com.bnyer.img.dto; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +import javax.validation.constraints.NotBlank; + +/** + * @Author qyh + * @Date 2022/7/13 21:27 + * @Description + */ +@Getter +@Setter +@ApiModel("八字运势接收类") +public class BzDto { + @NotBlank(message = "姓不能为空!") + @ApiModelProperty(value="姓") + private String lastName; + + @NotBlank(message = "名不能为空!") + @ApiModelProperty(value="名") + private String firstName; + + @NotBlank(message = "性别不能为空!") + @ApiModelProperty(value="性别") + private String sex; + + @NotBlank(message = "出生年月不能为空!") + @ApiModelProperty(value="出生年月") + //19990209060808这样的 + private String birth; +} diff --git a/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/mapper/BzDataMapper.java b/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/mapper/BzDataMapper.java new file mode 100644 index 0000000..e5006a0 --- /dev/null +++ b/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/mapper/BzDataMapper.java @@ -0,0 +1,15 @@ +package com.bnyer.img.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.bnyer.img.domain.Banner; +import com.bnyer.img.domain.BzData; +import com.bnyer.img.vo.BannerVo; +import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +@Mapper +public interface BzDataMapper extends BaseMapper { + +} \ No newline at end of file diff --git a/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/service/BzDataService.java b/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/service/BzDataService.java new file mode 100644 index 0000000..6d0365d --- /dev/null +++ b/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/service/BzDataService.java @@ -0,0 +1,22 @@ +package com.bnyer.img.service; + +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; +import com.bnyer.img.domain.Banner; +import com.bnyer.img.domain.BzData; +import com.bnyer.img.dto.BannerPageDto; +import com.bnyer.img.dto.BzDto; +import com.bnyer.img.vo.BannerVo; + +import javax.servlet.http.HttpServletRequest; +import java.util.List; + +public interface BzDataService { + JSONObject getYs(BzDto dto); + + void dataStatistics(String ip,String source); + + int update(BzData bzData,UpdateWrapper updateWrapper); + + String getIpAddr(HttpServletRequest request); +} diff --git a/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/service/impl/BzDataServiceImpl.java b/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/service/impl/BzDataServiceImpl.java new file mode 100644 index 0000000..41ee1e2 --- /dev/null +++ b/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/service/impl/BzDataServiceImpl.java @@ -0,0 +1,166 @@ +package com.bnyer.img.service.impl; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; +import com.bnyer.common.core.domain.R; +import com.bnyer.common.core.utils.StringUtils; +import com.bnyer.common.redis.service.RedisService; +import com.bnyer.img.config.BzConfig; +import com.bnyer.img.domain.Banner; +import com.bnyer.img.domain.BzData; +import com.bnyer.img.dto.BannerPageDto; +import com.bnyer.img.dto.BzDto; +import com.bnyer.img.mapper.BannerMapper; +import com.bnyer.img.mapper.BzDataMapper; +import com.bnyer.img.service.BannerService; +import com.bnyer.img.service.BzDataService; +import com.bnyer.img.vo.BannerVo; +import lombok.extern.slf4j.Slf4j; +import org.apache.http.HttpEntity; +import org.apache.http.HttpResponse; +import org.apache.http.client.methods.HttpGet; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClients; +import org.apache.http.util.EntityUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import javax.servlet.http.HttpServletRequest; +import java.io.IOException; +import java.net.URLEncoder; +import java.time.LocalDate; +import java.util.Date; +import java.util.List; + +@Service +@Slf4j +public class BzDataServiceImpl implements BzDataService { + + @Autowired + private RedisService redisService; + @Autowired + private BzDataMapper bzDataMapper; + @Autowired + private BzConfig bzConfig; + + @Override + public JSONObject getYs(BzDto dto) { + //API产品路径 + String requestUrl = bzConfig.getUrl(); + //阿里云APPCODE + String appcode = bzConfig.getAppCode(); + String lastName = dto.getLastName(); + String firstName = dto.getFirstName(); + String sex = dto.getSex(); + String birth = dto.getBirth(); + CloseableHttpClient httpClient = null; + try { + httpClient = HttpClients.createDefault(); + String str = "SECOND_NAME=" + URLEncoder.encode(firstName, "UTF-8") + "&GENDER=" + URLEncoder.encode(sex, "UTF-8") + "&BIRTH=" + URLEncoder.encode(birth, "UTF-8") + "&FIRST_NAME=" + URLEncoder.encode(lastName, "UTF-8"); + System.out.println(requestUrl + str); + // 创建一个HttpGet实例 + HttpGet httpGet = new HttpGet(requestUrl + str); + httpGet.addHeader("Authorization", "APPCODE " + appcode); + + // 发送GET请求 + HttpResponse execute = httpClient.execute(httpGet); + + // 获取状态码 + int statusCode = execute.getStatusLine().getStatusCode(); + System.out.println(statusCode); + + // 获取结果 + HttpEntity entity = execute.getEntity(); + String result = EntityUtils.toString(entity, "utf-8"); + //System.out.println(result); + return JSON.parseObject(result); + } catch (Exception e) { + e.printStackTrace(); + } finally { + if (httpClient != null) { + try { + httpClient.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + return null; + } + + @Override + public void dataStatistics(String ip, String source) { + String today = LocalDate.now() + ""; + String page="bzPage_" + source; + //保存今天的key + redisService.redisTemplate.opsForZSet().add("bzPage_key" +today, today+page, 1.0); + //pv统计 + redisService.pvStatistics(today, page); + //uv统计 + redisService.uvStatistics(today, page, ip); + //查看是否已经有了这条数据 + if (!redisService.hasKey(today + source)) { + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.eq("date", today); + wrapper.eq("source", source); + List bzData = bzDataMapper.selectList(wrapper); + if (bzData.size() <= 0) { + BzData data = new BzData(); + data.setDate(today); + data.setPv(1L); + data.setUv(1L); + data.setSource(source); + data.setMark(today + source); + bzDataMapper.insert(data); + } + } + } + + @Override + public int update(BzData bzData, UpdateWrapper updateWrapper) { + return bzDataMapper.update(bzData,updateWrapper); + } + + @Override + public String getIpAddr(HttpServletRequest request) { + String ip = request.getHeader("x-forwarded-for"); + //System.out.println("x-forwarded-for ip: " + ip); + if (ip != null && ip.length() != 0 && !"unknown".equalsIgnoreCase(ip)) { + // 多次反向代理后会有多个ip值,第一个ip才是真实ip + if (ip.indexOf(",") != -1) { + ip = ip.split(",")[0]; + } + } + if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { + ip = request.getHeader("Proxy-Client-IP"); + //System.out.println("Proxy-Client-IP ip: " + ip); + } + if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { + ip = request.getHeader("WL-Proxy-Client-IP"); + //System.out.println("WL-Proxy-Client-IP ip: " + ip); + } + if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { + ip = request.getHeader("HTTP_CLIENT_IP"); + //System.out.println("HTTP_CLIENT_IP ip: " + ip); + } + if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { + ip = request.getHeader("HTTP_X_FORWARDED_FOR"); + //System.out.println("HTTP_X_FORWARDED_FOR ip: " + ip); + } + if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { + ip = request.getHeader("X-Real-IP"); + //System.out.println("X-Real-IP ip: " + ip); + } + if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { + ip = request.getRemoteAddr(); + //System.out.println("getRemoteAddr ip: " + ip); + } + //System.out.println("获取客户端ip: " + ip); + return ip; + } +} diff --git a/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/task/DateSyncTask.java b/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/task/DateSyncTask.java new file mode 100644 index 0000000..b54165d --- /dev/null +++ b/bnyer-services/bnyer-img/src/main/java/com/bnyer/img/task/DateSyncTask.java @@ -0,0 +1,60 @@ +package com.bnyer.img.task; + +import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; +import com.bnyer.common.redis.service.RedisService; +import com.bnyer.img.domain.BzData; +import com.bnyer.img.service.BzDataService; +import com.xxl.job.core.biz.model.ReturnT; +import com.xxl.job.core.handler.annotation.XxlJob; +import com.xxl.job.core.log.XxlJobLogger; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; + +import java.time.LocalDate; +import java.util.Set; + +/** + * @Author qyh + * @Date 2022/7/14 16:43 + * @Description + */ +@Component +@Slf4j +public class DateSyncTask { + @Autowired + private static RedisService redisService; + @Autowired + private static BzDataService bzDataService; + //@XxlJob("dateSyncTask") + //@Scheduled(fixedDelay = 1000 * 60 * 60) + public static ReturnT dateSync() { + String day = LocalDate.now().plusDays(-1)+ ""; + String redisKey = "bzPage_key" + day; + System.out.println(redisService); + redisService.setCacheObject("4", 2); + Set range = redisService.redisTemplate.opsForZSet().range(redisKey, 0, -1); + for (Object key : redisService.redisTemplate.opsForZSet().range(redisKey, 0, -1)) { + Long pv = Long.parseLong(redisService.redisTemplate.opsForValue().get(key + "PV").toString()); + Long uv = Long.parseLong(redisService.redisTemplate.opsForHyperLogLog().size(key + "UV").toString()); + String[] s = key.toString().split("_"); + String source = s[1]; + redisService.deleteObject(key + "PV"); + redisService.deleteObject(key + "UV"); + UpdateWrapper wrapper = new UpdateWrapper<>(); + wrapper.set("pv",pv); + wrapper.set("uv",uv); + wrapper.eq("date",day); + wrapper.eq("source",source); + bzDataService.update(new BzData(),wrapper); +// redisService.deleteObject(key + "PV"); +// redisService.deleteObject(key + "UV"); + } + redisService.deleteObject("bzPage_key" + day); + XxlJobLogger.log("{} 我执行了同步pv,uv任务", System.currentTimeMillis()); + return ReturnT.SUCCESS; + } + + +}