提交 84188702 authored 作者: liupengfei's avatar liupengfei

--no commit message

上级 8677330c
<?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">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.zrqx</groupId>
<artifactId>app</artifactId>
<version>5.0.0</version>
</parent>
<artifactId>statistics</artifactId>
<dependencies>
<!-- 引入epublib -->
<dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.8.3</version>
</dependency>
<dependency>
<groupId>commons-httpclient</groupId>
<artifactId>commons-httpclient</artifactId>
<version>3.1</version>
</dependency>
<!-- 协同过滤算法 -->
<!-- https://mvnrepository.com/artifact/org.apache.mahout/mahout-core -->
<!-- solrj -->
<!-- https://mvnrepository.com/artifact/org.apache.solr/solr-solrj -->
</dependencies>
</project>
\ No newline at end of file
package com.zrqx;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.netflix.hystrix.EnableHystrix;
import org.springframework.cloud.netflix.hystrix.dashboard.EnableHystrixDashboard;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.context.annotation.Bean;
import com.alibaba.druid.pool.DruidDataSource;
import tk.mybatis.spring.annotation.MapperScan;
@EnableFeignClients
@EnableDiscoveryClient
@EnableHystrix
@EnableHystrixDashboard
@EnableEurekaClient
@SpringBootApplication // 系统会去入口类的同级包以及下级包中去扫描实体类,因此我们建议入口类的位置在groupId+arctifactID组合的包名下。
@MapperScan(basePackages = {"com.zrqx.statistics.bg.mapper.*","com.zrqx.statistics.fg.mapper.*"})
public class StatisticsStart {
@Value("${spring.datasource.url}")
private String url;
@Value("${spring.datasource.username}")
private String username;
@Value("${spring.datasource.password}")
private String password;
private final static Logger logger = LoggerFactory.getLogger(StatisticsStart.class);
public static void main(String[] args) {
// 下面两行代码都可以用来启动
SpringApplication.run(StatisticsStart.class, args);
// new SpringApplicationBuilder(AppStart.class).web(true).run(args);
logger.info("statistics服务已启动.....");
}
@Bean
public DruidDataSource dataSource() {
DruidDataSource dataSource = new DruidDataSource();
dataSource.setUrl(url);
dataSource.setUsername(username);// 用户名
dataSource.setPassword(password);// 密码
dataSource.setInitialSize(20);
dataSource.setMaxActive(200);
dataSource.setMinIdle(0);
dataSource.setMaxWait(60000);
dataSource.setValidationQuery("SELECT 1");
dataSource.setTestOnBorrow(false);
dataSource.setTestWhileIdle(true);
dataSource.setPoolPreparedStatements(false);
return dataSource;
}
}
package com.zrqx.statistics.bg.controller;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.zrqx.core.enums.statistics.ProvinceEnums;
import com.zrqx.core.util.response.CallBack;
import com.zrqx.statistics.bg.service.DataLogService;
import com.zrqx.statistics.commons.form.*;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/data-log")
@Api(description = "数据日志")
public class DataLogController {
@Autowired
private DataLogService service;
@ApiOperation("保存百度统计数据")
@PostMapping("/load-baidu-statistics")
public void saveBaiduStatistics() {
service.saveBaiduStatistics(null);
}
@ApiOperation("趋势分析")
@PostMapping("/get")
public CallBack<JSONArray> getBaiduStatistics(Integer type) {
return CallBack.success(service.saveAndGetBaiduStatistics(type));
}
//---------------行为分析------------------
@ApiOperation("行为-趋势分析")
@PostMapping("/behavior")
public CallBack<JSONObject> getTrend(QueryTrendForm form) {
return CallBack.success(service.loadTrend(form));
}
@ApiOperation("来源分析")
@PostMapping("/source")
public CallBack<JSONObject> getSource(QuerySourceForm form) {
return CallBack.success(service.loadSource(form));
}
@ApiOperation("关键词")
@PostMapping("/search-word")
public CallBack<JSONObject> getSearchWord() {
return CallBack.success(service.loadSearchWord());
}
@ApiOperation("地域分布")
@PostMapping("/area")
public CallBack<JSONObject> getArea() {
return CallBack.success(service.loadArea());
}
@ApiOperation("入口页")
@PostMapping("/enter-page")
public CallBack<JSONObject> getEnterPage() {
return CallBack.success(service.loadEnterPage());
}
@ApiOperation("访问概况")
@PostMapping("/visit")
public CallBack<JSONObject> visit() {
return CallBack.success(service.saveAndGetVisit());
}
@ApiOperation("地域分析")
@PostMapping("/district")
public CallBack<JSONObject> getDistrictAnalysis(QueryDistrictAnalysisForm form) {
return CallBack.success(service.loadDistrictAnalysis(form));
}
@ApiOperation("访客属性")
@PostMapping("/visitor/attr")
public CallBack<JSONObject> getVisitorAttr(QueryVisitorAttrForm form) {
return CallBack.success(service.loadVisitorAttr(form));
}
@ApiOperation("新老访客")
@PostMapping("/visitor/summary")
public CallBack<JSONObject> getVisitorSummary(QueryVisitorSunnaryForm form) {
return CallBack.success(service.loadVisitorSummary(form));
}
@ApiOperation("忠诚度")
@PostMapping("/visitor/loyalty")
public CallBack<JSONObject> getLoyalty(QueryVisitorLoyaltyForm form) {
return CallBack.success(service.loadLoyaltyPolymerization(form));
}
@ApiOperation("省份列表")
@GetMapping("/province")
public CallBack<JSONObject> getProvince() {
return CallBack.success(new JSONObject(ProvinceEnums.getAllElementAsMap()));
}
}
package com.zrqx.statistics.bg.controller;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.zrqx.core.util.response.CallBack;
import com.zrqx.statistics.bg.service.GoodsLogService;
import com.zrqx.statistics.commons.form.GoodsStatisticsForm;
import com.zrqx.statistics.commons.form.QueryResourceCountForm;
import com.zrqx.statistics.commons.vo.ResourceCollectVo;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/goods-log")
@Api(description = "商品统计")
public class GoodsLogController {
@Autowired
private GoodsLogService service;
@ApiOperation("新增统计商品信息")
@PostMapping("/save-goods-statistics")
public void saveGoodsStatistics(@RequestBody GoodsStatisticsForm form) {
service.saveGoodsStatistics(form);
}
@ApiOperation("商品增加点击量")
@PostMapping("/click")
public void click(@RequestBody GoodsStatisticsForm form) {
service.updateGoodsClick(form);
}
@ApiOperation("商品增加收藏量")
@PostMapping("/collect")
public void collect(@RequestBody GoodsStatisticsForm form) {
service.updateGoodsCollect(form);
}
@ApiOperation("商品增加下载量")
@PostMapping("/download")
public void download(@RequestBody GoodsStatisticsForm form) {
service.updateGoodsDownload(form);
}
@ApiOperation("商品增加交易次数和交易金额")
@PostMapping("/trade")
public void trade(@RequestBody GoodsStatisticsForm form) {
service.updateGoodsTrade(form);
}
@ApiOperation("获取总体统计")
@GetMapping("/init")
public CallBack<JSONObject> getAllData() {
return CallBack.success(service.getAllData());
}
@ApiOperation("获取趋势分析")
@GetMapping("/get")
public CallBack<JSONArray> getData(Integer type) {
return CallBack.success(service.getData(type));
}
@ApiOperation("获取热门资源")
@GetMapping("/list")
public CallBack<JSONArray> getList() {
return CallBack.success(service.getList());
}
@ApiOperation("获取所有资源统计")
@GetMapping("/all")
public CallBack<JSONArray> getAll() {
return CallBack.success(service.getAll());
}
@ApiOperation("资源分析-资源汇总数据总览")
@GetMapping("/count")
public CallBack<ResourceCollectVo> count(QueryResourceCountForm form){
return CallBack.success(service.count(form));
}
}
package com.zrqx.statistics.bg.mapper;
import java.util.List;
import com.zrqx.statistics.commons.form.BaiduLogQueryForm;
import com.zrqx.statistics.commons.model.DataLog;
import com.zrqx.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
/**
* 统计数据
*/
@Mapper
public interface DataLogMapper extends BaseMapper<DataLog> {
@Select("<script>"
+ "select * from sta_data_log "
+ " where 1=1 "
+ "<if test = '" + NOTBLANK + "(date)' >"
+ " and startTime like concat(#{date},'%') "
+ "</if>"
+ "<if test = '" + NOTBLANK + "(funcName)' >"
+ " and method = #{funcName} "
+ "</if>"
+ "<if test = '" + NOTBLANK + "(siteId)' >"
+ " and siteId = #{siteId} "
+ "</if>"
+ " limit 1 "// select ont, but two result
+ "</script>")
DataLog checkHasLog(@Param("date") String today, @Param("funcName") String funcName, @Param("siteId") String siteid);
@Select("<script>"
+ "select * from sta_data_log where 1=1 "
+ "<if test = '" + NOTBLANK + "(form.method)' >"
+ " and method = #{form.method} "
+ "</if>"
+ "<if test = '" + NOTBLANK + "(form.startTime)' >"
+ "<![CDATA["
+ " and startTime >= #{form.startTime} "
+ "]]>"
+ "</if>"
+ "<if test = '" + NOTBLANK + "(form.endTime)' >"
+ "<![CDATA["
+ " and startTime <= #{form.endTime} "
+ "]]>"
+ "</if>"
+ "</script>")
List<DataLog> getLogs(@Param("form") BaiduLogQueryForm form);
}
package com.zrqx.statistics.bg.mapper;
import java.math.BigDecimal;
import java.util.List;
import com.zrqx.statistics.commons.form.QueryResourceCountForm;
import com.zrqx.statistics.commons.model.GoodsLog;
import com.zrqx.statistics.commons.vo.GoodsLogVo;
import com.zrqx.statistics.commons.vo.ResourceCountVo;
import io.swagger.annotations.ApiModelProperty;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import com.zrqx.core.mapper.BaseMapper;
/**
* 商品统计日志
*/
@Mapper
public interface GoodsLogMapper extends BaseMapper<GoodsLog> {
@Select("<script>"
+ "select * from sta_goods_log "
+ " where 1=1 "
+ "<if test = '" + NOTBLANK + "(firstDay)' >"
+ "<![CDATA["
+ " and date_format(createTime,'%Y-%m-%d')>=#{firstDay} "
+ "]]>"
+ "</if>"
+ "<if test = '" + NOTBLANK + "(lastDay)' >"
+ "<![CDATA["
+ " and date_format(createTime,'%Y-%m-%d')<=#{lastDay} "
+ "]]>"
+ "</if>"
+ "<if test = '" + NOTBLANK + "(siteId)' >"
+ " and siteId = #{siteId} "
+ "</if>"
+ "</script>")
List<GoodsLog> selectByDate(@Param("firstDay") String firstDay, @Param("lastDay") String lastDay, @Param("siteId") String siteid);
String VALUE_PARAM = "<if test = '" + NOTBLANK + "(firstDay)' >"
+ "<![CDATA["
+ " and date_format(createTime,'%Y-%m-%d')>=#{firstDay} "
+ "]]>"
+ "</if>"
+ "<if test = '" + NOTBLANK + "(lastDay)' >"
+ "<![CDATA["
+ " and date_format(createTime,'%Y-%m-%d')<=#{lastDay} "
+ "]]>"
+ "</if>"
+ "<if test = '" + NOTBLANK + "(siteId)' >"
+ " and siteId = #{siteId} "
+ "</if>";
@Select("<script>"
+ " select id,name,sum(clicknum) clicknum,sum(collectnum) collectnum,sum(tradenum) tradenum,sum(tradeamount) tradeamount, "
+ " sum(downloadnum) downloadnum,type,typezh,siteid,DATE_FORMAT(createTime,'%Y-%m-%d %H') hour from sta_goods_log "
+ " where 1=1 "
+ VALUE_PARAM
+ " GROUP BY hour "
+ "</script>")
List<GoodsLog> selectDataByHours(@Param("firstDay") String firstDay, @Param("lastDay") String lastDay, @Param("siteId") String siteid, @Param("conds") String conds);
@Select("<script>"
+ " select id,name,sum(clicknum) clicknum,sum(collectnum) collectnum,sum(tradenum) tradenum,sum(tradeamount) tradeamount, "
+ " sum(downloadnum) downloadnum,type,typezh,siteid,DATE_FORMAT(createTime,#{conds}) createTime from sta_goods_log "
+ " where 1=1 "
+ VALUE_PARAM
+ " GROUP BY DATE_FORMAT(createTime,#{conds}) "
+ "</script>")
List<GoodsLog> selectDataByDate(@Param("firstDay") String firstDay, @Param("lastDay") String lastDay, @Param("siteId") String siteid, @Param("conds") String conds);
@Select("<script>"
+ " select sum(clicknum) clicknum,sum(collectnum) collectnum,sum(tradenum) tradenum,sum(tradeamount) tradeamount, "
+ " sum(downloadnum) downloadnum,DATE_FORMAT(createTime,'%x年-第%v周') AS weeks from sta_goods_log "
+ " where 1=1 "
+ VALUE_PARAM
+ " GROUP BY weeks "
+ "</script>")
List<GoodsLog> selectDataByWeek(@Param("firstDay") String firstDay, @Param("lastDay") String lastDay, @Param("siteId") String siteid, @Param("conds") String conds);
@Select("<script>"
+ " select sum(clicknum) clicknum,sum(collectnum) collectnum,sum(tradenum) tradenum,sum(tradeamount) tradeamount, "
+ " sum(downloadnum) downloadnum,DATE_FORMAT(createTime,'%Y年%m月') AS months from sta_goods_log "
+ " where 1=1 "
+ VALUE_PARAM
+ " GROUP BY months "
+ "</script>")
List<GoodsLog> selectDataByMonth(@Param("firstDay") String firstDay, @Param("lastDay") String lastDay, @Param("siteId") String siteid, @Param("conds") String conds);
@Select("<script>"
+ " select sum(clicknum) clicknum,sum(collectnum) collectnum,sum(tradenum) tradenum,sum(tradeamount) tradeamount, "
+ " sum(downloadnum) downloadnum,DATE_FORMAT(createTime,'%Y年') AS years from sta_goods_log "
+ " where 1=1 "
+ VALUE_PARAM
+ " GROUP BY years "
+ "</script>")
List<GoodsLog> selectDataByYear(@Param("firstDay") String firstDay, @Param("lastDay") String lastDay, @Param("siteId") String siteid, @Param("conds") String conds);
// @Select("<script>"
// + " select id,name,sum(clicknum) clicknum,sum(collectnum) collectnum,sum(tradenum) tradenum,sum(tradeamount) tradeamount, "
// + " sum(downloadnum) downloadnum,type,typezh,siteid,DATE_FORMAT(createTime,#{conds}) createTime from sta_goods_log "
// + " group by name order by sum(clicknum) desc "
// + "</script>")
@Select("<script>"
+ " SELECT a.id,a.name,a.clicknum,a.collectnum,a.clicknum+a.collectnum zhihe , a.tradenum,a.tradeamount,"
+ " a.downloadnum,a.type,a.typezh,a.siteid,a.createTime FROM ("
+ " SELECT id,NAME,SUM(clicknum) clicknum,SUM(collectnum) collectnum, SUM(tradenum) tradenum,SUM(tradeamount) tradeamount,"
+ " SUM(downloadnum) downloadnum,TYPE,typezh,siteid,DATE_FORMAT(createTime,'%Y-%m-%d') createTime FROM sta_goods_log GROUP BY NAME)a "
+ " ORDER BY zhihe DESC "
+ "</script>")
List<GoodsLog> getHot();
@Select("<script>"
+ " select a.id, a.name, s.shuliang shuliang, sum(a.clicknum) clicknum, sum(a.collectnum) collectnum, sum(a.tradenum) tradenum, "
// 交易次数除以总订单数
+ " CONCAT(ROUND(tradenum/(SELECT COUNT(*) FROM sta_order)*100,2),'','%') percent, "
+ " sum(a.tradeamount) tradeamount, sum(a.downloadnum) "
+ " downloadnum, s.id type, a.typezh, a.siteid, date_format(a.createtime, '') createtime from sta_goods_log a, (select count(c.id) id,c.typezh,c.shuliang from (select z.id,COUNT(z.id) shuliang, "
+ " z.typezh, z.name from sta_goods_log z group by z.name) c group by c.typezh ) s where a.typezh = s.typezh group by a.typezh order by sum(a.clicknum) desc "
+ "</script>")
List<GoodsLogVo> getAll();
String COUNT_SQL = " select sum(a.clicknum) as clickNum, "
+ " sum(a.collectnum) collectNum, sum(a.tradenum) tradeNum, "
+ " sum(a.tradeamount) tradeAmount, sum(a.downloadnum) downloadNum "
+ " from sta_goods_log a "
+ " where 1=1 "
+ " eq(a.siteId, form.site) "
+ " eq(a.etype, form.etype) "
+ " eq(a.mtype, form.mtype) ";
@Select("<script>"
+ COUNT_SQL
+ "<if test = '" + NOTBLANK + "(form.beginTime)' >"
+ " and date(a.createTime) &gt;= #{form.beginTime} "
+ " </if> "
+ "<if test = '" + NOTBLANK + "(form.endTime)' >"
+ " and date(a.createTime) &lt;= #{form.endTime} "
+ " </if> "
+ "</script>")
ResourceCountVo count(@Param("form") QueryResourceCountForm form);
@Select("<script>"
+ COUNT_SQL
+ "<if test = '" + NOTBLANK + "(form.oldBeginTime)' >"
+ " and date(a.createTime) &gt;= #{form.oldBeginTime} "
+ " </if> "
+ "<if test = '" + NOTBLANK + "(form.oldEndTime)' >"
+ " and date(a.createTime) &lt;= #{form.oldEndTime} "
+ " </if> "
+ "</script>")
ResourceCountVo countOld(@Param("form") QueryResourceCountForm form);
}
package com.zrqx.statistics.bg.service;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.zrqx.core.service.BaseService;
import com.zrqx.statistics.commons.form.*;
import com.zrqx.statistics.commons.model.DataLog;
import java.util.Date;
/**
* 数据日志
*/
public interface DataLogService extends BaseService<DataLog, String> {
/**
* 保存百度统计数据
*/
Integer saveBaiduStatistics(Date today);
/**
* 获取今日访问概况数据
*
* @param type
* @return
*/
JSONArray saveAndGetBaiduStatistics(Integer type);
/**
* 获取搜索词
*
* @return
*/
//JSONObject getSearchWord();修改方法名,因为只读事务中不能保存操作
JSONObject loadSearchWord();
/**
* 获取地域分布
*
* @return
*/
//JSONObject getArea();修改方法名,因为只读事务中不能保存操作
JSONObject loadArea();
/**
* 获取入口页
*
* @return
*/
//JSONObject getEnterPage();修改方法名,因为只读事务中不能保存操作
JSONObject loadEnterPage();
/**
* 获取访问概况
*
* @return
*/
JSONObject saveAndGetVisit();
/**
* 区域分析中表格中的数据
* @param form
* @return
*/
JSONObject loadDistrictAnalysis(QueryDistrictAnalysisForm form);
/**
* 访客属性
* @param form
* @return
*/
JSONObject loadVisitorAttr(QueryVisitorAttrForm form);
/**
* 获取行为分析趋势分析
* @return
* @author rjc
* @date: 2019年11月15日 下午5:05:03
*/
JSONObject loadTrend(QueryTrendForm form);
/**
* 获取来源分析
* @param form
* @return
* @author rjc
* @date: 2019年11月19日 上午10:47:50
*/
JSONObject loadSource(QuerySourceForm form);
/**
* 获取新老访客的摘要
* @param form
* @return
*/
JSONObject loadVisitorSummary(QueryVisitorSunnaryForm form);
/**
* 访客忠诚度
* @param form
* @return
*/
JSONObject loadLoyalty(QueryVisitorLoyaltyForm form);
/**
* 访客忠诚度-聚合结果
* @param form
* @return
*/
JSONObject loadLoyaltyPolymerization(QueryVisitorLoyaltyForm form);
}
package com.zrqx.statistics.bg.service;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.zrqx.statistics.commons.form.GoodsStatisticsForm;
import com.zrqx.statistics.commons.form.QueryResourceCountForm;
import com.zrqx.statistics.commons.model.GoodsLog;
import com.zrqx.core.service.BaseService;
import com.zrqx.statistics.commons.vo.ResourceCollectVo;
/**
* 商品日志
*/
public interface GoodsLogService extends BaseService<GoodsLog, String> {
/**
* 保存商品统计信息
*
* @param form
* @return
*/
Integer saveGoodsStatistics(GoodsStatisticsForm form);
/**
* 商品增加点击量
*
* @param form
* @return
*/
Integer updateGoodsClick(GoodsStatisticsForm form);
/**
* 商品增加收藏量
*
* @param form
* @return
*/
Integer updateGoodsCollect(GoodsStatisticsForm form);
/**
* 商品增加下载量
*
* @param form
* @return
*/
Integer updateGoodsDownload(GoodsStatisticsForm form);
/**
* 商品增加交易次数和交易金额
*
* @param form
*/
Integer updateGoodsTrade(GoodsStatisticsForm form);
/**
* 获取所有统计信息
*/
JSONObject getAllData();
/**
* 获取趋势分析数据
*
* @param type
* @return
*/
JSONArray getData(Integer type);
/**
* 获取热门资源
*
* @return
*/
JSONArray getList();
/**
* 获取所有资源统计
*
* @return
*/
JSONArray getAll();
ResourceCollectVo count(QueryResourceCountForm form);
}
package com.zrqx.statistics.commons.enums;
import java.util.HashMap;
import java.util.stream.Stream;
/**
* Title: StaMemberTypeEnum
* Description: 用户类型枚举
*
* @author lpf
* @version V1.0
* @date 2020-01-16
*/
public enum StaMemberTypeEnum {
NEW("0","新访客"),
OLD("1","旧访客");
//状态码
private final String code;
private final String name;
private static final HashMap<String,String> MAP = new HashMap<String,String>();
static {
stream().forEach(e -> {
MAP.put(e.code, e.name);
});
}
/**
* @return
* @author lpf
* @date: 2019年3月18日 下午5:05:16
*/
public static Stream<StaMemberTypeEnum> stream(){
return Stream.of(values());
}
private StaMemberTypeEnum(String code, String name) {
this.code = code;
this.name = name;
}
/**
* 判断名称是否有效
* @param name
* @return
* @author lpf
* @date: 2018年6月11日 下午6:30:16
*/
public static boolean isExist(String code) {
return stream().anyMatch(e -> e.code.equals(code));
}
/**
* 通过ID获取中文名称
* @param code
* @return
*/
public static String getName(String code) {
return stream().filter(e -> e.code.equals(code)).findFirst().map(e -> e.name).orElse(null);
}
public String getCode() {
return code;
}
public String getName() {
return name;
}
public static HashMap<String, String> getMap() {
return MAP;
}
}
package com.zrqx.statistics.commons.form;
import lombok.Data;
@Data
public class BaiduLogQueryForm {
private String startTime;
private String endTime;
private String method;
}
package com.zrqx.statistics.commons.form;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
@Data
public class GoodsStatisticsForm {
@ApiModelProperty("商品名称")
private String name;
@ApiModelProperty("浏览量/点击量")
private Integer clickNum;
@ApiModelProperty("收藏量")
private Integer collectNum;
@ApiModelProperty("交易次数")
private Integer tradeNum;
@ApiModelProperty("交易金额")
private BigDecimal tradeAmount;
@ApiModelProperty("下载量")
private Integer downloadNum;
@ApiModelProperty("商品类型")
private Integer type;
@ApiModelProperty("商品类型中文")
private String typeZh;
@ApiModelProperty("站点id")
private String siteId;
}
package com.zrqx.statistics.commons.form;
import com.zrqx.core.enums.statistics.FiledEnum;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
* 查询地域分析Form
*/
@Data
@ApiModel(value = "查询地域分析Form")
public class QueryDistrictAnalysisForm {
@ApiModelProperty("访客属性, 全部:all,新游客:new,旧游客:old")
private String visitor;
@ApiModelProperty("开始时间, 字符串格式: 20191114")
private String start_date;
@ApiModelProperty("结束时间")
private String end_date;
@ApiModelProperty("对比时间, 字符串格式: 20191114")
private String start_date2;
@ApiModelProperty("对比时间")
private String end_date2;
/**
* {@link FiledEnum}
*/
@ApiModelProperty("维度OR指标; pv_count:访问量, visitor_count:访客数, ip_count:IP数, avg_visit_time:凭据访问时间;只有访问地图数据需要传参")
private String indicators;
///**
// * {@link FiledEnum}
// * {@link com.zrqx.core.enums.statistics.OrderTypeEnum}
// */
//@ApiModelProperty("排序")
//private String orderType;
@ApiModelProperty("分页")
private Integer offset;
@ApiModelProperty("分页")
private Integer pageSize;
@ApiModelProperty("地图中的数据:map, 表格及汇总数据:table")
private String areaType;
}
package com.zrqx.statistics.commons.form;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
* Title: QueryResourceForm
* Description:
*
* @author lpf
* @version V1.0
* @date 2020-01-17
*/
@Data
public class QueryResourceCountForm {
@ApiModelProperty("开始时间")
private String beginTime;
@ApiModelProperty("结束时间")
private String endTime;
@ApiModelProperty("对比开始时间")
private String oldBeginTime;
@ApiModelProperty("对比结束时间")
private String oldEndTime;
@ApiModelProperty("设备类型:pc 计算机,phone 移动设备")
private String etype;
@ApiModelProperty("访客类型:0 新访客, 1 旧访客")
private String mtype;
@ApiModelProperty("站点")
private String site;
}
package com.zrqx.statistics.commons.form;
import com.zrqx.core.enums.statistics.FiledEnum;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@Data
@ApiModel(value = "查询来源分析Form")
public class QuerySourceForm {
@ApiModelProperty("访客属性, 全部:all,新游客:new,旧游客:old")
private String visitor;
@ApiModelProperty("开始时间, 字符串格式: 20191114")
private String start_date;
@ApiModelProperty("结束时间")
private String end_date;
@ApiModelProperty("来源类型")
private String viewType="type";
/*
* @ApiModelProperty("按来源类型:type,来源网站:site") private String viewType;
*/
@ApiModelProperty("设备,计算机:PC,移动设备:mobile")
private String clientDevice;
/**
* {@link FiledEnum}
*/
@ApiModelProperty("维度OR指标; pv_count:访问量, visitor_count:访客数, ip_count:IP数, avg_visit_time:凭据访问时间;只有访问地图数据需要传参")
private String indicators;
///**
// * {@link FiledEnum}
// * {@link com.zrqx.core.enums.statistics.OrderTypeEnum}
// */
//@ApiModelProperty("排序")
//private String orderType;
@ApiModelProperty("分页")
private Integer offset;
@ApiModelProperty("分页")
private Integer pageSize;
@ApiModelProperty("地图中的数据:map, 表格及汇总数据:table")
private String areaType;
}
package com.zrqx.statistics.commons.form;
import com.zrqx.core.enums.statistics.FiledEnum;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@Data
@ApiModel(value = "查询趋势分析Form")
public class QueryTrendForm {
@ApiModelProperty("访客属性, 全部:all,新游客:new,旧游客:old")
private String visitor;
@ApiModelProperty("开始时间, 字符串格式: 20191114")
private String start_date;
@ApiModelProperty("结束时间")
private String end_date;
@ApiModelProperty("对比查询起始时间, 字符串格式: 20191114")
private String start_date2;
@ApiModelProperty("对比查询结束时间")
private String end_date2;
@ApiModelProperty("设备,全部:all, 计算机:PC,移动设备:mobile")
private String clientDevice;
@ApiModelProperty("地域")
private String area;
/**
* {@link FiledEnum}
*/
@ApiModelProperty("维度OR指标; pv_count:访问量, visitor_count:访客数, ip_count:IP数, avg_visit_time:凭据访问时间;只有访问地图数据需要传参")
private String indicators;
///**
// * {@link FiledEnum}
// * {@link com.zrqx.core.enums.statistics.OrderTypeEnum}
// */
//@ApiModelProperty("排序")
//private String orderType;
@ApiModelProperty("分页")
private Integer offset;
@ApiModelProperty("分页")
private Integer pageSize;
@ApiModelProperty("地图中的数据:map, 表格及汇总数据:table")
private String areaType;
}
package com.zrqx.statistics.commons.form;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
* 查询游客属性
*/
@Data
public class QueryVisitorAttrForm {
@ApiModelProperty("开始时间, 字符串格式: 20191114")
private String start_date;
@ApiModelProperty("结束时间")
private String end_date;
}
package com.zrqx.statistics.commons.form;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
* 访客忠诚度
*/
@Data
public class QueryVisitorLoyaltyForm {
@ApiModelProperty("开始时间, 字符串格式: 20191114")
private String start_date;
@ApiModelProperty("结束时间")
private String end_date;
@ApiModelProperty("对比时间, 字符串格式: 20191114")
private String start_date2;
@ApiModelProperty("对比时间")
private String end_date2;
@ApiModelProperty("地域")
private String area;
@ApiModelProperty("游客;全部:all,新游客:new,老访客:old")
private String visitor;
@ApiModelProperty("如果选择调用一次接口返回组装数据,可以忽略该参数;character_pages:访问页数, character_depth:访问深度, character_time:访问时长, character_lasttime:上次访问时间")
private String character;
}
package com.zrqx.statistics.commons.form;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
* 新老访客
* Created by ml on 2019/11/25.
*/
@Data
public class QueryVisitorSunnaryForm {
@ApiModelProperty("开始时间")
private String start_date;
@ApiModelProperty("结束时间")
private String end_date;
@ApiModelProperty("地域")
private String area;
@ApiModelProperty("对比时间, 字符串格式: 20191114")
private String start_date2;
@ApiModelProperty("结束时间")
private String end_date2;
@ApiModelProperty("目标类型,map:图形数据, table:表格中数据")
private String viewType;
}
package com.zrqx.statistics.commons.model;
// default package
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
import java.util.Date;
/**
* 数据日志
*/
@Data
@ApiModel(value = "DataLog", description = "数据日志")
@Table(name = "sta_data_log")
public class DataLog implements java.io.Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY, generator = "SELECT REPLACE (UUID(), '-', '')")
@ApiModelProperty("id")
private String id;
@ApiModelProperty("开始时间")
private Date startTime;
@ApiModelProperty("结束时间")
private Date endTime;
@ApiModelProperty("报告数据方法")
private String method;
@ApiModelProperty("指标")
private String metrics;
@ApiModelProperty("数据")
private String result;
@ApiModelProperty("站点ID")
private String siteId;
}
\ No newline at end of file
package com.zrqx.statistics.commons.model;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
import java.math.BigDecimal;
import java.util.Date;
/**
* 商品统计日志
*/
@Data
@ApiModel(value = "GoodsLog", description = "商品统计日志")
@Table(name = "sta_goods_log")
public class GoodsLog implements java.io.Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY, generator = "SELECT REPLACE (UUID(), '-', '')")
@ApiModelProperty("商品统计id")
private String id;
@ApiModelProperty("商品名称")
private String name;
@ApiModelProperty("浏览量/点击量")
private Integer clickNum;
@ApiModelProperty("收藏量")
private Integer collectNum;
@ApiModelProperty("交易次数")
private Integer tradeNum;
@ApiModelProperty("交易金额")
private BigDecimal tradeAmount;
@ApiModelProperty("下载量")
private Integer downloadNum;
@ApiModelProperty("商品类型")
private Integer type;
@ApiModelProperty("商品类型中文")
private String typeZh;
@ApiModelProperty("站点id")
private String siteId;
@ApiModelProperty("创建时间")
private Date createTime;
@ApiModelProperty("pc|phone|pad")
private String etype;
@ApiModelProperty("0新访客1老访客")
private String mtype;
}
\ No newline at end of file
package com.zrqx.statistics.commons.model;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;
import java.util.Date;
/**
* Title: StaClick
* Description: 点击信息表
*
* @author lpf
* @version V1.0
* @date 2020-01-16
*/
@Data
@ApiModel(value = "StaClick", description = "点击信息")
@Table(name = "sta_click")
public class StaClick {
@Id
@GeneratedValue(generator = "JDBC")
@ApiModelProperty("id")
private Integer id;
@ApiModelProperty("用户id")
private String memberId;
@ApiModelProperty("资源名称")
private String name;
@ApiModelProperty("资源类型")
private String type;
@ApiModelProperty("创建时间")
private Date createTime;
}
package com.zrqx.statistics.commons.model;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;
import java.util.Date;
/**
* Title: StaCollection
* Description: 收藏信息
*
* @author lpf
* @version V1.0
* @date 2020-01-16
*/
@Data
@ApiModel(value = "StaCollection", description = "收藏信息")
@Table(name = "sta_collection")
public class StaCollection {
@Id
@GeneratedValue(generator = "JDBC")
@ApiModelProperty("id")
private Integer id;
@ApiModelProperty("用户id")
private String memberId;
@ApiModelProperty("资源名称")
private String name;
@ApiModelProperty("资源类型")
private String type;
@ApiModelProperty("创建时间")
private Date createTime;
@ApiModelProperty("A add | D delete")
private String dtype;
}
package com.zrqx.statistics.commons.model;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;
import java.util.Date;
/**
* Title: StaDownload
* Description: 下载信息
*
* @author lpf
* @version V1.0
* @date 2020-01-16
*/
@Data
@ApiModel(value = "StaDownload", description = "下载信息")
@Table(name = "sta_download")
public class StaDownload {
@Id
@GeneratedValue(generator = "JDBC")
@ApiModelProperty("id")
private Integer id;
@ApiModelProperty("用户id")
private String memberId;
@ApiModelProperty("资源名称")
private String name;
@ApiModelProperty("资源类型")
private String type;
@ApiModelProperty("创建时间")
private Date createTime;
}
package com.zrqx.statistics.commons.model;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
import java.util.Date;
/**
* Title: Member
* Description: 用户信息表
*
* @author lpf
* @version V1.0
* @date 2020-01-16
*/
@Data
@ApiModel(value = "StaMember", description = "用户信息")
@Table(name = "sta_member")
public class StaMember {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY, generator = "SELECT REPLACE (UUID(), '-', '')")
@ApiModelProperty("id")
private String id;
@ApiModelProperty("*外网ip")
private String ip;
@ApiModelProperty("*内网ip")
private String wip;
@ApiModelProperty("0新访客1老访客")
private String type;
@ApiModelProperty("*访问站点")
private String site;
@ApiModelProperty("*pc|phone")
private String etype;
@ApiModelProperty("*浏览器信息")
private String explorer;
@ApiModelProperty("创建时间")
private Date createDate;
}
package com.zrqx.statistics.commons.model;
import java.math.BigDecimal;
import java.util.Date;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@Data
@ApiModel(value = "StaOrder", description = "订单表")
@Table(name = "sta_order")
public class StaOrder {
@Id
@GeneratedValue(generator = "JDBC")
@ApiModelProperty("id")
private Integer id;
@ApiModelProperty("用户id")
private String memberId;
@ApiModelProperty("订单编号")
private String code;
@ApiModelProperty("订单金额")
private BigDecimal amount;
@ApiModelProperty("创建时间")
private Date createTime;
}
package com.zrqx.statistics.commons.model;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;
import java.math.BigDecimal;
import java.util.Date;
/**
* Title: StaTrade
* Description: 交易信息
*
* @author lpf
* @version V1.0
* @date 2020-01-16
*/
@Data
@ApiModel(value = "StaTrade", description = "交易信息")
@Table(name = "sta_trade")
public class StaTrade {
@Id
@GeneratedValue(generator = "JDBC")
@ApiModelProperty("id")
private Integer id;
@ApiModelProperty("用户id")
private String memberId;
@ApiModelProperty("资源名称")
private String name;
@ApiModelProperty("资源类型")
private String type;
@ApiModelProperty("创建时间")
private Date createTime;
@ApiModelProperty("数量,正数为支付,负数为退款")
private Integer num;
@ApiModelProperty("交易金额,正数为支付,负数为退款")
private BigDecimal amount;
}
package com.zrqx.statistics.commons.vo;
import com.zrqx.statistics.commons.model.GoodsLog;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@Data
public class GoodsLogVo extends GoodsLog{
@ApiModelProperty("转化率")
private String percent;
@ApiModelProperty("数量")
private String shuliang;
}
package com.zrqx.statistics.commons.vo;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
* Title: ResourceVo
* Description:
*
* @author lpf
* @version V1.0
* @date 2020-01-17
*/
@Data
public class ResourceCollectVo {
@ApiModelProperty("选择日期查询结果")
private ResourceCountVo now;
@ApiModelProperty("同比选择日期查询结果")
private ResourceCountVo old;
public ResourceCollectVo() {
}
public ResourceCollectVo(ResourceCountVo now, ResourceCountVo old) {
this.now = now;
this.old = old;
}
}
package com.zrqx.statistics.commons.vo;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
import java.math.BigInteger;
/**
* Title: ResourceCountVo
* Description:
*
* @author lpf
* @version V1.0
* @date 2020-01-17
*/
@Data
public class ResourceCountVo {
@ApiModelProperty("浏览量/点击量")
private Integer clickNum;
@ApiModelProperty("收藏量")
private Integer collectNum;
@ApiModelProperty("交易次数")
private Integer tradeNum;
@ApiModelProperty("交易金额")
private BigDecimal tradeAmount;
@ApiModelProperty("下载量")
private Integer downloadNum;
}
package com.zrqx.statistics.fg.controller;
import com.zrqx.core.util.response.CallBack;
import com.zrqx.statistics.commons.model.StaClick;
import com.zrqx.statistics.fg.service.FgStaClickService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* Title: FgStaClickController
* Description:
*
* @author lpf
* @version V1.0
* @date 2020-01-16
*/
@RestController
@Api(description = "点击量")
@RequestMapping("/api/click")
public class FgStaClickController {
@Autowired
private FgStaClickService service;
@ApiOperation("保存点击量")
@PostMapping("/save")
public CallBack<?> save(@RequestBody StaClick c) {
service.save(c);
return CallBack.success();
}
}
package com.zrqx.statistics.fg.controller;
import com.zrqx.core.util.response.CallBack;
import com.zrqx.statistics.commons.model.StaCollection;
import com.zrqx.statistics.fg.service.FgStaCollectionService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* Title: FgStaCollectionController
* Description:
*
* @author lpf
* @version V1.0
* @date 2020-01-16
*/
@RestController
@Api(description = "收藏")
@RequestMapping("/api/coll")
public class FgStaCollectionController {
@Autowired
private FgStaCollectionService service;
@ApiOperation("保存收藏信息")
@PostMapping("/save")
public CallBack<?> save(@RequestBody StaCollection c) {
service.save(c);
return CallBack.success();
}
}
package com.zrqx.statistics.fg.controller;
import com.zrqx.core.util.response.CallBack;
import com.zrqx.statistics.commons.model.StaDownload;
import com.zrqx.statistics.fg.service.FgStaDownloadService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* Title: FgStaDownloadController
* Description:
*
* @author lpf
* @version V1.0
* @date 2020-01-16
*/
@RestController
@Api(description = "下载")
@RequestMapping("/api/down")
public class FgStaDownloadController {
@Autowired
private FgStaDownloadService service;
@ApiOperation("保存下载信息")
@PostMapping("/save")
public CallBack<?> save(@RequestBody StaDownload d) {
service.save(d);
return CallBack.success();
}
}
package com.zrqx.statistics.fg.controller;
import com.zrqx.core.commons.aspect.IPUtil;
import com.zrqx.core.exception.BaseException;
import com.zrqx.core.util.datatype.StringUtils;
import com.zrqx.core.util.response.CallBack;
import com.zrqx.statistics.commons.model.StaMember;
import com.zrqx.statistics.fg.service.FgStaMemberService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.HttpServletRequest;
/**
* Title: FgStaMemberController
* Description:
*
* @author lpf
* @version V1.0
* @date 2020-01-16
*/
@RestController
@RequestMapping("/api/member")
@Api(description = "用户")
public class FgStaMemberController {
@Autowired
private FgStaMemberService service;
/*
{
"etype": "pc",
"explorer": "goodle",
"ip": "122.14.50.6",
"site": "test16.zhongdianyun.com",
"wip": "192.168.2.32"
}
*/
@ApiOperation("保存用户")
@PostMapping("/save")
public CallBack<String> save(@RequestBody StaMember m, HttpServletRequest request){
if (StringUtils.isEmpty(m.getSite())) {
throw new BaseException("site不能为空");
}
if (StringUtils.isEmpty(m.getEtype())) {
throw new BaseException("etype不能为空");
}
if (StringUtils.isEmpty(m.getExplorer())) {
throw new BaseException("explorer不能为空");
}
if (StringUtils.isNotEmpty(m.getId())) {
m.setId(null);
}
m.setIp(IPUtil.getIpAddr(request));
m.setWip(m.getIp());
String id = service.save(m);
return CallBack.success(id);
}
}
package com.zrqx.statistics.fg.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.zrqx.core.util.response.CallBack;
import com.zrqx.statistics.commons.model.StaOrder;
import com.zrqx.statistics.fg.service.FgStaOrderService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
@RestController
@Api(description = "订单")
@RequestMapping("/api/order")
public class FgStaOrderController {
@Autowired
private FgStaOrderService service;
@ApiOperation("保存订单信息")
@PostMapping("/save")
public CallBack<?> save(@RequestBody StaOrder t) {
service.save(t);
return CallBack.success();
}
}
package com.zrqx.statistics.fg.controller;
import com.zrqx.core.util.response.CallBack;
import com.zrqx.statistics.commons.model.StaTrade;
import com.zrqx.statistics.fg.service.FgStaTradeService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* Title: FgStaTradeController
* Description:
*
* @author lpf
* @version V1.0
* @date 2020-01-16
*/
@RestController
@Api(description = "交易信息")
@RequestMapping("/api/trade")
public class FgStaTradeController {
@Autowired
private FgStaTradeService service;
@ApiOperation("保存交易信息")
@PostMapping("/save")
public CallBack<?> save(@RequestBody StaTrade t) {
service.save(t);
return CallBack.success();
}
}
package com.zrqx.statistics.fg.manage;
import com.zrqx.core.mapper.BaseMapper;
import com.zrqx.core.service.BaseServiceImpl;
import com.zrqx.core.util.datatype.ArrayUtils;
import com.zrqx.statistics.commons.model.*;
import com.zrqx.statistics.fg.mapper.FgGoodsLogMapper;
import com.zrqx.statistics.fg.mapper.FgStaMemberMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.math.BigDecimal;
import java.util.List;
import java.util.function.Consumer;
import java.util.function.Function;
/**
* Title: FgGoodsLogManage
* Description:
*
* @author lpf
* @version V1.0
* @date 2020-01-16
*/
@Component
public class FgGoodsLogManage extends BaseServiceImpl<GoodsLog, String> {
@Autowired
private FgGoodsLogMapper mapper;
@Autowired
private FgStaMemberMapper fgStaMemberMapper;
@Override
public BaseMapper<GoodsLog> getMapper() {
return this.mapper;
}
public void save(StaClick c) {
GoodsLog params = this.create(c.getMemberId(), g -> {
g.setName(c.getName());
g.setCreateTime(c.getCreateTime());
g.setTypeZh(c.getType());
});
List<GoodsLog> list = mapper.select(params);
if (ArrayUtils.isNotEmpty(list)) {
GoodsLog first = list.get(0);
Integer clickNum = first.getClickNum();
if (clickNum == null) {
clickNum = 0;
}
clickNum ++;
first.setClickNum(clickNum);
mapper.updateByPrimaryKey(first);
return ;
}
fmtGoodsLog(params);
params.setClickNum(params.getClickNum() + 1);
mapper.insert(params);
}
private GoodsLog create(String memberId, Consumer<GoodsLog> c){
GoodsLog params = new GoodsLog();
StaMember m = fgStaMemberMapper.selectByPrimaryKey(memberId);
if (m != null) {
params.setEtype(m.getEtype());
params.setMtype(m.getType());
params.setSiteId(m.getSite());
}
c.accept(params);
return params;
}
private void fmtGoodsLog(GoodsLog g){
g.setClickNum(0);
g.setCollectNum(0);
g.setTradeNum(0);
g.setTradeAmount(BigDecimal.ZERO);
g.setDownloadNum(0);
}
public void save(StaCollection c) {
GoodsLog params = this.create(c.getMemberId(), g -> {
g.setName(c.getName());
g.setCreateTime(c.getCreateTime());
g.setTypeZh(c.getType());
});
List<GoodsLog> list = mapper.select(params);
if (ArrayUtils.isNotEmpty(list)) {
GoodsLog first = list.get(0);
Integer collectNum = first.getCollectNum();
if (collectNum == null) {
collectNum = 0;
}
collectNum ++;
first.setCollectNum(collectNum);
mapper.updateByPrimaryKey(first);
return ;
}
fmtGoodsLog(params);
params.setCollectNum(params.getCollectNum() + 1);
mapper.insert(params);
}
public void save(StaDownload d) {
GoodsLog params = this.create(d.getMemberId(), g -> {
g.setName(d.getName());
g.setCreateTime(d.getCreateTime());
g.setTypeZh(d.getType());
});
List<GoodsLog> list = mapper.select(params);
if (ArrayUtils.isNotEmpty(list)) {
GoodsLog first = list.get(0);
Integer downloadNum = first.getDownloadNum();
if (downloadNum == null) {
downloadNum = 0;
}
downloadNum ++;
first.setDownloadNum(downloadNum);
mapper.updateByPrimaryKey(first);
return ;
}
fmtGoodsLog(params);
params.setDownloadNum(params.getDownloadNum() + 1);
mapper.insert(params);
}
public void save(StaTrade t) {
GoodsLog params = this.create(t.getMemberId(), g -> {
g.setName(t.getName());
g.setCreateTime(t.getCreateTime());
g.setTypeZh(t.getType());
});
List<GoodsLog> list = mapper.select(params);
if (ArrayUtils.isNotEmpty(list)) {
GoodsLog first = list.get(0);
Integer tradeNum = first.getTradeNum();
if (tradeNum == null) {
tradeNum = 0;
}
tradeNum ++;
first.setTradeNum(tradeNum);
BigDecimal tradeAmount = first.getTradeAmount();
if (tradeAmount == null) {
tradeAmount = BigDecimal.ZERO;
}
tradeAmount.add(t.getAmount());
mapper.updateByPrimaryKey(first);
return ;
}
fmtGoodsLog(params);
params.setTradeNum(params.getTradeNum() + 1);
params.setTradeAmount(params.getTradeAmount().add(t.getAmount()));
mapper.insert(params);
}
}
package com.zrqx.statistics.fg.mapper;
import com.zrqx.core.mapper.BaseMapper;
import com.zrqx.statistics.commons.model.GoodsLog;
import org.apache.ibatis.annotations.Mapper;
/**
* Title: FgGoodsLogMapper
* Description:
*
* @author lpf
* @version V1.0
* @date 2020-01-16
*/
@Mapper
public interface FgGoodsLogMapper extends BaseMapper<GoodsLog> {
}
package com.zrqx.statistics.fg.mapper;
import com.zrqx.core.mapper.BaseMapper;
import com.zrqx.statistics.commons.model.StaClick;
import org.apache.ibatis.annotations.Mapper;
/**
* Title: FgStaClickMapper
* Description:
*
* @author lpf
* @version V1.0
* @date 2020-01-16
*/
@Mapper
public interface FgStaClickMapper extends BaseMapper<StaClick> {
}
package com.zrqx.statistics.fg.mapper;
import com.zrqx.core.mapper.BaseMapper;
import com.zrqx.statistics.commons.model.StaCollection;
import org.apache.ibatis.annotations.Mapper;
/**
* Title: FgStaCollectionMapper
* Description:
*
* @author lpf
* @version V1.0
* @date 2020-01-16
*/
@Mapper
public interface FgStaCollectionMapper extends BaseMapper<StaCollection> {
}
package com.zrqx.statistics.fg.mapper;
import com.zrqx.core.mapper.BaseMapper;
import com.zrqx.statistics.commons.model.StaDownload;
import org.apache.ibatis.annotations.Mapper;
/**
* Title: FgStaDownloadMapper
* Description:
*
* @author lpf
* @version V1.0
* @date 2020-01-16
*/
@Mapper
public interface FgStaDownloadMapper extends BaseMapper<StaDownload> {
}
package com.zrqx.statistics.fg.mapper;
import com.zrqx.core.mapper.BaseMapper;
import com.zrqx.statistics.commons.model.StaMember;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
/**
* Title: FgStaMemberMapper
* Description:
*
* @author lpf
* @version V1.0
* @date 2020-01-16
*/
@Mapper
public interface FgStaMemberMapper extends BaseMapper<StaMember> {
@Select(" select count(*) from sta_member where ip=#{param.ip} and wip=#{param.wip} and createDate != date(now()) ")
int countMember(@Param("param") StaMember param);
@Select("<script>"
+ " select * from sta_member where createDate = date(now()) "
+ " eq(ip, param.ip) "
+ " eq(wip, param.wip) "
+ " eq(site, param.site) "
+ " eq(etype, param.etype) "
+ " eq(explorer, param.explorer) "
+ " limit 1 "
+"</script>")
StaMember selectStaMember(@Param("param") StaMember param);
}
package com.zrqx.statistics.fg.mapper;
import org.apache.ibatis.annotations.Mapper;
import com.zrqx.core.mapper.BaseMapper;
import com.zrqx.statistics.commons.model.StaOrder;
@Mapper
public interface FgStaOrderMapper extends BaseMapper<StaOrder>{
}
package com.zrqx.statistics.fg.mapper;
import com.zrqx.core.mapper.BaseMapper;
import com.zrqx.statistics.commons.model.StaTrade;
import org.apache.ibatis.annotations.Mapper;
/**
* Title: FgStaTradeMapper
* Description:
*
* @author lpf
* @version V1.0
* @date 2020-01-16
*/
@Mapper
public interface FgStaTradeMapper extends BaseMapper<StaTrade> {
}
package com.zrqx.statistics.fg.service;
import com.zrqx.core.service.BaseService;
import com.zrqx.statistics.commons.model.StaClick;
/**
* Title: FgStaClickService
* Description:
*
* @author lpf
* @version V1.0
* @date 2020-01-16
*/
public interface FgStaClickService extends BaseService<StaClick, Integer> {
/**
* Description: 保存点击信息,保存统计汇总信息
* @param c
* @return void
* @author lpf
* @date 2020-01-16 16:58
*/
void save(StaClick c);
}
package com.zrqx.statistics.fg.service;
import com.zrqx.core.mapper.BaseMapper;
import com.zrqx.core.service.BaseServiceImpl;
import com.zrqx.statistics.commons.model.StaClick;
import com.zrqx.statistics.fg.manage.FgGoodsLogManage;
import com.zrqx.statistics.fg.mapper.FgStaClickMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.Date;
/**
* Title: FgStaClickServiceImpl
* Description:
*
* @author lpf
* @version V1.0
* @date 2020-01-16
*/
@Service
public class FgStaClickServiceImpl extends BaseServiceImpl<StaClick, Integer> implements FgStaClickService {
@Autowired
private FgStaClickMapper mapper;
@Autowired
private FgGoodsLogManage fgGoodsLogManage;
@Override
public BaseMapper<StaClick> getMapper() {
return this.mapper;
}
@Override
public void save(StaClick c) {
c.setCreateTime(new Date());
mapper.insert(c);
fgGoodsLogManage.save(c);
}
}
package com.zrqx.statistics.fg.service;
import com.zrqx.core.service.BaseService;
import com.zrqx.statistics.commons.model.StaCollection;
/**
* Title: FgStaCollectionService
* Description:
*
* @author lpf
* @version V1.0
* @date 2020-01-16
*/
public interface FgStaCollectionService extends BaseService<StaCollection, Integer> {
void save(StaCollection c);
}
package com.zrqx.statistics.fg.service;
import com.zrqx.core.mapper.BaseMapper;
import com.zrqx.core.service.BaseServiceImpl;
import com.zrqx.statistics.commons.model.StaCollection;
import com.zrqx.statistics.fg.manage.FgGoodsLogManage;
import com.zrqx.statistics.fg.mapper.FgStaCollectionMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.Date;
/**
* Title: FgStaCollectionServiceImpl
* Description:
*
* @author lpf
* @version V1.0
* @date 2020-01-16
*/
@Service
public class FgStaCollectionServiceImpl extends BaseServiceImpl<StaCollection, Integer> implements FgStaCollectionService {
@Autowired
private FgStaCollectionMapper mapper;
@Autowired
private FgGoodsLogManage fgGoodsLogManage;
@Override
public BaseMapper<StaCollection> getMapper() {
return this.mapper;
}
@Override
public void save(StaCollection c) {
c.setCreateTime(new Date());
mapper.insert(c);
fgGoodsLogManage.save(c);
}
}
package com.zrqx.statistics.fg.service;
import com.zrqx.core.service.BaseService;
import com.zrqx.core.service.BaseServiceImpl;
import com.zrqx.statistics.commons.model.StaDownload;
/**
* Title: FgStaDownloadService
* Description:
*
* @author lpf
* @version V1.0
* @date 2020-01-16
*/
public interface FgStaDownloadService extends BaseService<StaDownload, Integer> {
void save(StaDownload d);
}
package com.zrqx.statistics.fg.service;
import com.zrqx.core.mapper.BaseMapper;
import com.zrqx.core.service.BaseServiceImpl;
import com.zrqx.statistics.commons.model.StaDownload;
import com.zrqx.statistics.fg.manage.FgGoodsLogManage;
import com.zrqx.statistics.fg.mapper.FgStaDownloadMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.Date;
/**
* Title: FgStaDownloadServiceImpl
* Description:
*
* @author lpf
* @version V1.0
* @date 2020-01-16
*/
@Service
public class FgStaDownloadServiceImpl extends BaseServiceImpl<StaDownload, Integer> implements FgStaDownloadService {
@Autowired
private FgStaDownloadMapper mapper;
@Autowired
private FgGoodsLogManage fgGoodsLogManage;
@Override
public BaseMapper<StaDownload> getMapper() {
return this.mapper;
}
@Override
public void save(StaDownload d) {
d.setCreateTime(new Date());
mapper.insert(d);
fgGoodsLogManage.save(d);
}
}
package com.zrqx.statistics.fg.service;
import com.zrqx.core.service.BaseService;
import com.zrqx.statistics.commons.model.StaMember;
/**
* Title: FgStaMemberService
* Description:
*
* @author lpf
* @version V1.0
* @date 2020-01-16
*/
public interface FgStaMemberService extends BaseService<StaMember, String> {
/**
* Description: 保存用户信息
* @param m
* @return java.lang.String
* @author lpf
* @date 2020-01-16 15:13
*/
String save(StaMember m);
}
package com.zrqx.statistics.fg.service;
import com.zrqx.core.mapper.BaseMapper;
import com.zrqx.core.service.BaseServiceImpl;
import com.zrqx.core.util.datatype.ArrayUtils;
import com.zrqx.statistics.commons.enums.StaMemberTypeEnum;
import com.zrqx.statistics.commons.model.StaMember;
import com.zrqx.statistics.fg.mapper.FgStaMemberMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import tk.mybatis.mapper.entity.Example;
import java.util.Date;
import java.util.List;
/**
* Title: FgStaMemberServiceImpl
* Description:
*
* @author lpf
* @version V1.0
* @date 2020-01-16
*/
@Service
public class FgStaMemberServiceImpl extends BaseServiceImpl<StaMember, String> implements FgStaMemberService{
@Autowired
private FgStaMemberMapper mapper;
@Override
public BaseMapper<StaMember> getMapper() {
return this.mapper;
}
@Override
public String save(StaMember m) {
StaMember entity = mapper.selectStaMember(m);
if (entity != null) {
return entity.getId();
}
StaMember param = new StaMember();
param.setIp(m.getIp());
param.setWip(m.getWip());
// 用户第一次访问,则当天该用户都为新访客
int count = mapper.countMember(param);
if (count > 0) {
m.setType(StaMemberTypeEnum.OLD.getCode());
} else {
m.setType(StaMemberTypeEnum.NEW.getCode());
}
mapper.insert(m);
return m.getId();
}
}
package com.zrqx.statistics.fg.service;
import com.zrqx.core.service.BaseService;
import com.zrqx.statistics.commons.model.StaOrder;
public interface FgStaOrderService extends BaseService<StaOrder, Integer>{
void save(StaOrder t);
}
package com.zrqx.statistics.fg.service;
import java.math.BigDecimal;
import java.util.Date;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.zrqx.core.mapper.BaseMapper;
import com.zrqx.core.service.BaseServiceImpl;
import com.zrqx.statistics.commons.model.StaOrder;
import com.zrqx.statistics.fg.mapper.FgStaOrderMapper;
@Service
public class FgStaOrderServiceImpl extends BaseServiceImpl<StaOrder, Integer> implements FgStaOrderService{
@Autowired
private FgStaOrderMapper mapper;
@Override
public BaseMapper<StaOrder> getMapper() {
return this.mapper;
}
@Override
public void save(StaOrder t) {
t.setCreateTime(new Date());
if (t.getAmount() == null) {
t.setAmount(BigDecimal.ZERO);
}
mapper.insert(t);
}
}
package com.zrqx.statistics.fg.service;
import com.zrqx.core.service.BaseService;
import com.zrqx.statistics.commons.model.StaTrade;
/**
* Title: FgStaTradeService
* Description:
*
* @author lpf
* @version V1.0
* @date 2020-01-16
*/
public interface FgStaTradeService extends BaseService<StaTrade, Integer> {
void save(StaTrade t);
}
package com.zrqx.statistics.fg.service;
import com.zrqx.core.mapper.BaseMapper;
import com.zrqx.core.service.BaseServiceImpl;
import com.zrqx.statistics.commons.model.StaTrade;
import com.zrqx.statistics.fg.manage.FgGoodsLogManage;
import com.zrqx.statistics.fg.mapper.FgStaTradeMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.util.Date;
/**
* Title: FgStaTradeServiceImpl
* Description:
*
* @author lpf
* @version V1.0
* @date 2020-01-16
*/
@Service
public class FgStaTradeServiceImpl extends BaseServiceImpl<StaTrade, Integer> implements FgStaTradeService {
@Autowired
private FgStaTradeMapper mapper;
@Autowired
private FgGoodsLogManage fgGoodsLogManage;
@Override
public BaseMapper<StaTrade> getMapper() {
return this.mapper;
}
@Override
public void save(StaTrade t) {
t.setCreateTime(new Date());
if (t.getAmount() == null) {
t.setAmount(BigDecimal.ZERO);
}
if (t.getNum() == null) {
t.setNum(0);
}
mapper.insert(t);
fgGoodsLogManage.save(t);
}
}
package com.zrqx.statistics.utils;
import java.math.BigDecimal;
/**
* 由于Java的简单类型不能够精确的对浮点数进行运算,这个工具类提供精 确的浮点数运算,包括加减乘除和四舍五入。
*/
public class ArithUtil {
// 默认除法运算精度
private static final int DEF_DIV_SCALE = 10;
// 这个类不能实例化
private ArithUtil() {
}
/**
* 提供精确的加法运算。
*
* @param v1 被加数
* @param v2 加数
* @return 两个参数的和
*/
public static double add(double v1, double v2) {
BigDecimal b1 = new BigDecimal(Double.toString(v1));
BigDecimal b2 = new BigDecimal(Double.toString(v2));
return b1.add(b2).doubleValue();
}
/**
* 提供精确的减法运算。
*
* @param v1 被减数
* @param v2 减数
* @return 两个参数的差
*/
public static double sub(double v1, double v2) {
BigDecimal b1 = new BigDecimal(Double.toString(v1));
BigDecimal b2 = new BigDecimal(Double.toString(v2));
return b1.subtract(b2).doubleValue();
}
/**
* 提供精确的乘法运算。
*
* @param v1 被乘数
* @param v2 乘数
* @return 两个参数的积
*/
public static double mul(double v1, double v2) {
BigDecimal b1 = new BigDecimal(Double.toString(v1));
BigDecimal b2 = new BigDecimal(Double.toString(v2));
return b1.multiply(b2).doubleValue();
}
/**
* 提供(相对)精确的除法运算,当发生除不尽的情况时,精确到 小数点以后10位,以后的数字四舍五入。
*
* @param v1 被除数
* @param v2 除数
* @return 两个参数的商
*/
public static double div(double v1, double v2) {
return div(v1, v2, DEF_DIV_SCALE);
}
/**
* 提供(相对)精确的除法运算。当发生除不尽的情况时,由scale参数指 定精度,以后的数字四舍五入。
*
* @param v1 被除数
* @param v2 除数
* @param scale 表示表示需要精确到小数点以后几位。
* @return 两个参数的商
*/
public static double div(double v1, double v2, int scale) {
if (scale < 0) {
throw new IllegalArgumentException("The scale must be a positive integer or zero");
}
BigDecimal b1 = new BigDecimal(Double.toString(v1));
BigDecimal b2 = new BigDecimal(Double.toString(v2));
return b1.divide(b2, scale, BigDecimal.ROUND_HALF_UP).doubleValue();
}
/**
* 提供精确的小数位四舍五入处理。
*
* @param v 需要四舍五入的数字
* @param scale 小数点后保留几位
* @return 四舍五入后的结果
*/
public static double round(double v, int scale) {
if (scale < 0) {
throw new IllegalArgumentException("The scale must be a positive integer or zero");
}
BigDecimal b = new BigDecimal(Double.toString(v));
BigDecimal one = new BigDecimal("1");
return b.divide(one, scale, BigDecimal.ROUND_HALF_UP).doubleValue();
}
}
\ No newline at end of file
package com.zrqx.statistics.utils;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
public class DateUtils {
public static final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
/**
* 获得该月第一天
*
* @param year
* @param month
* @return
*/
public static String getFirstDayOfMonth(int year, int month) {
Calendar cal = Calendar.getInstance();
// 设置年份
cal.set(Calendar.YEAR, year);
// 设置月份
cal.set(Calendar.MONTH, month - 1);
// 获取某月最小天数
int firstDay = cal.getActualMinimum(Calendar.DAY_OF_MONTH);
// 设置日历中月份的最小天数
cal.set(Calendar.DAY_OF_MONTH, firstDay);
// 格式化日期
String firstDayOfMonth = sdf.format(cal.getTime());
return firstDayOfMonth;
}
/**
* 获得该月最后一天
*
* @param year
* @param month
* @return
*/
public static String getLastDayOfMonth(int year, int month) {
Calendar cal = Calendar.getInstance();
// 设置年份
cal.set(Calendar.YEAR, year);
// 设置月份
cal.set(Calendar.MONTH, month - 1);
// 获取某月最大天数
int lastDay = cal.getActualMaximum(Calendar.DAY_OF_MONTH);
// 设置日历中月份的最大天数
cal.set(Calendar.DAY_OF_MONTH, lastDay);
// 格式化日期
String lastDayOfMonth = sdf.format(cal.getTime());
return lastDayOfMonth;
}
/**
* 取得当前日期所在周的第一天
*
* @param date
* @return
*/
public static String getFirstDayOfWeek(Date date) {
Calendar calendar = Calendar.getInstance();
calendar.setFirstDayOfWeek(Calendar.SUNDAY);
calendar.setTime(date);
calendar.set(Calendar.DAY_OF_WEEK,
calendar.getFirstDayOfWeek()); // Sunday
String firstDayOfWeek = sdf.format(calendar.getTime());
return firstDayOfWeek;
}
/**
* 取得当前日期所在周的最后一天
*
* @param date
* @return
*/
public static String getLastDayOfWeek(Date date) {
Calendar calendar = Calendar.getInstance();
calendar.setFirstDayOfWeek(Calendar.SUNDAY);
calendar.setTime(date);
calendar.set(Calendar.DAY_OF_WEEK,
calendar.getFirstDayOfWeek() + 6); // Saturday
// 格式化日期
String lastDayOfWeek = sdf.format(calendar.getTime());
return lastDayOfWeek;
}
/**
* 取得当前日期所在周的前一周最后一天
*
* @param date
* @return
*/
public static String getLastDayOfLastWeek(Date date) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
return getLastDayOfWeek(calendar.get(Calendar.YEAR),
calendar.get(Calendar.WEEK_OF_YEAR) - 1);
}
/**
* 得到某年某周的最后一天
*
* @param year
* @param week
* @return
*/
public static String getLastDayOfWeek(int year, int week) {
week = week - 1;
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.YEAR, year);
calendar.set(Calendar.MONTH, Calendar.JANUARY);
calendar.set(Calendar.DATE, 1);
Calendar cal = (Calendar) calendar.clone();
cal.add(Calendar.DATE, week * 7);
return getLastDayOfWeek(cal.getTime());
}
public static void main(String args[]) {
Date date = new Date();
System.out.println(DateUtils.getFirstDayOfWeek(date));
}
}
package com.zrqx.statistics.utils;
import java.awt.image.BufferedImage;
import java.io.File;
import java.net.URL;
import java.util.Date;
import javax.imageio.ImageIO;
public class Demo {
public static void main(String args[]) {
Demo.getPicture("https://gss0.bdstatic.com/94o3dSag_xI4khGkpoWK1HF6hhy/baike/w%3D268%3Bg%3D0/sign=0a11bfc0968fa0ec7fc7630b1eac3ed3/4034970a304e251ffd0b990ba086c9177e3e5340.jpg", "E://");
}
public static void getPicture(String urlHttp, String path) {
String file = path + "/" + new Date().getTime() + ".jpg";
try {
URL url = new URL(urlHttp);
BufferedImage img = ImageIO.read(url);
ImageIO.write(img, "jpg", new File(file));
} catch (Exception e) {
e.printStackTrace();
}
}
}
package com.zrqx.statistics.utils;
import java.math.BigDecimal;
import java.text.DecimalFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collections;
import java.util.Date;
import java.util.List;
import java.util.Set;
import com.zrqx.core.commons.model.resource.questionlibrary.ExamRecordInfo;
import com.zrqx.core.commons.model.resource.questionlibrary.StudyRecordInfo;
import com.zrqx.core.enums.statistics.QuestionTypeEnum;
import org.apache.commons.lang.StringUtils;
public class MathUtils {
/**
* 对比答案是否正确--学习用
*
* @param studyRecordInfo1
* @return
*/
public static Integer compareAnswer(StudyRecordInfo info) {
//是否正确 0错误1正确
Integer result = 0;
Integer questionType = Integer.parseInt(info.getQuestionType());
if (QuestionTypeEnum.TYPE_1.getCode().intValue() == questionType.intValue()) {
//单选
if (info.getRightanswer().toLowerCase().equals(info.getStuanswer().toLowerCase())) {
result = 1;
}
} else if (QuestionTypeEnum.TYPE_2.getCode().intValue() == questionType.intValue()) {
//多选
//先将答案排序
String[] stuAnswers = info.getStuanswer().split(",");
List<String> list = new ArrayList<String>();
for (String s : stuAnswers) {
list.add(s);
}
Collections.sort(list);
StringBuffer sb = new StringBuffer();
for (String s : list) {
sb.append(s + ",");
}
String answer = sb.toString().substring(0, sb.length() - 1);
//判断对错
if (info.getRightanswer().toLowerCase().equals(answer.toLowerCase())) {
result = 1;
}
} else if (QuestionTypeEnum.TYPE_3.getCode().intValue() == questionType.intValue()) {
//判断
if (info.getRightanswer().toLowerCase().equals(info.getStuanswer().toLowerCase())) {
result = 1;
}
} else if (QuestionTypeEnum.TYPE_4.getCode().intValue() == questionType.intValue()) {
//填空
if (info.getRightanswer().toLowerCase().equals(info.getStuanswer().toLowerCase())) {
result = 1;
}
}
return result;
}
/**
* 对比答案是否正确--测试用
*
* @param studyRecordInfo
* @return
*/
public static Integer compareAnswer(ExamRecordInfo info) {
//是否正确 0错误1正确
Integer result = 0;
Integer questionType = info.getQuestionType();
if (StringUtils.isBlank(info.getStuanswer())) {
//-1未作答
result = -1;
return result;
}
if (QuestionTypeEnum.TYPE_1.getCode().intValue() == questionType.intValue()) {
//单选
if (info.getRightanswer().toLowerCase().equals(info.getStuanswer().toLowerCase())) {
result = 1;
}
} else if (QuestionTypeEnum.TYPE_2.getCode().intValue() == questionType.intValue()) {
//多选
//先将答案排序
String[] stuAnswers = info.getStuanswer().split(",");
List<String> list = new ArrayList<String>();
for (String s : stuAnswers) {
list.add(s);
}
Collections.sort(list);
StringBuffer sb = new StringBuffer();
for (String s : list) {
sb.append(s + ",");
}
String answer = sb.toString().substring(0, sb.length() - 1);
//判断对错
if (info.getRightanswer().toLowerCase().equals(answer.toLowerCase())) {
result = 1;
}
} else if (QuestionTypeEnum.TYPE_3.getCode().intValue() == questionType.intValue()) {
//判断
if (info.getRightanswer().toLowerCase().equals(info.getStuanswer().toLowerCase())) {
result = 1;
}
} else if (QuestionTypeEnum.TYPE_4.getCode().intValue() == questionType.intValue()) {
//填空
if (info.getRightanswer().toLowerCase().equals(info.getStuanswer().toLowerCase())) {
result = 1;
}
}
return result;
}
/**
* 计算目标时间和当前时间相差的分钟数
* 如果dateStr2为空,则计算dateStr1与当前时间相差的分钟数
*
* @param dateStr
* @return
* @throws ParseException
*/
public static int minusMinutes(String dateStr1, String dateStr2) throws ParseException {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Calendar cal = Calendar.getInstance();
long now = 0;
if (StringUtils.isNotBlank(dateStr2)) {
cal.setTime(sdf.parse(dateStr2));
}
now = cal.getTimeInMillis();
Date date = sdf.parse(dateStr1);
cal.setTime(date);
long createtime = cal.getTimeInMillis();
BigDecimal bd = new BigDecimal((now - createtime) / 1000 / 60);
return bd.intValue();
}
/**
* 根据开始时间和分钟数计算结束时间
*
* @param beginTime
* @param minutes
* @return
*/
public static Date getEndTime(String beginTime, int minutes) {
Calendar cal = Calendar.getInstance();
cal.set(Calendar.MINUTE, cal.get(Calendar.MINUTE) + minutes);
return cal.getTime();
}
public static Integer getRandomNum(Set<Integer> keySet) {
Integer[] array = new Integer[keySet.size()];
keySet.toArray(array);
int index = (int) Math.ceil(Math.random() * keySet.size()) - 1;
return array[index];
}
public static int getRandomNum(List list) {
int index = (int) Math.ceil(Math.random() * list.size());
return index - 1;
}
/**
* 计算百分比率
*
* @param i1 除数
* @param i2 被除数
* @return
*/
public static String countRightPercentStr(Integer i1, Integer i2) {
if (i2.intValue() == 0) {
return "0.00%";
}
BigDecimal bd1 = new BigDecimal(i1);
BigDecimal bd2 = new BigDecimal(i2);
BigDecimal bd3 = new BigDecimal(bd1.doubleValue() / bd2.doubleValue() * 100).setScale(2, BigDecimal.ROUND_HALF_UP);
DecimalFormat df = new DecimalFormat("#0.00");
return df.format(bd3.doubleValue()) + "%";
}
public static BigDecimal countRightPercent(Integer i1, Integer i2) {
if (i2.intValue() == 0) {
return new BigDecimal(0);
}
BigDecimal bd1 = new BigDecimal(i1);
BigDecimal bd2 = new BigDecimal(i2);
BigDecimal bd3 = new BigDecimal(bd1.doubleValue() / bd2.doubleValue() * 100).divide(new BigDecimal(1), 2, BigDecimal.ROUND_HALF_UP).setScale(2, BigDecimal.ROUND_HALF_UP);
return bd3;
}
public static BigDecimal countRight(Integer i1, Integer i2) {
if (i2.intValue() == 0) {
return new BigDecimal(0);
}
BigDecimal bd1 = new BigDecimal(i1);
BigDecimal bd2 = new BigDecimal(i2);
BigDecimal bd3 = new BigDecimal(bd1.doubleValue() / bd2.doubleValue()).divide(new BigDecimal(1), 2, BigDecimal.ROUND_HALF_UP).setScale(0, BigDecimal.ROUND_HALF_UP);
return bd3;
}
}
package com.zrqx.statistics.utils.baidu;
import com.zrqx.statistics.utils.baidu.config.ParamStringConfig;
import org.apache.commons.lang3.StringUtils;
import java.util.HashMap;
/**
* @author ydm
* @ClassName FuncEnum
* @Description: 百度统计API枚举方法名和对应的值
*/
public enum FuncEnum {
/**
* 网站概况(趋势数据)
*/
// pv_count,visitor_count,ip_count,bounce_ratio,avg_visit_time,trans_count,contri_pv
SITE_PROFILE_TREND_DATA("overview/getTimeTrendRpt", new String[]{ParamStringConfig.LIU_LAN_LIANG_PV, ParamStringConfig.FANG_WEN_SHU_UV, ParamStringConfig.IP_SHU, ParamStringConfig.TIAO_CHU_LV, ParamStringConfig.PING_JUN_FANG_WEN_SHI_CHANG, ParamStringConfig.ZHUAN_HUA_CI_SHU, ParamStringConfig.BAI_DU_TUI_JIAN_GONG_XIAN_LIU_LAN_LIANG}),
/**
* 网站概况(地域分布)
*/
SITE_PROFILE_GEOGRAPHICAL_DISTRIBUTION("overview/getDistrictRpt", new String[]{ParamStringConfig.LIU_LAN_LIANG_PV}),
/**
* 网站概况(来源网站、搜索词、入口页面、受访页面)
*/
WEBSITE_PROFILE_SOURCE_WEBSITE_SEARCH_WORDS_ENTRY_PAGE_VISITED_PAGE("overview/getCommonTrackRpt", new String[]{ParamStringConfig.LIU_LAN_LIANG_PV}),
/**
* 趋势分析
*/
TREND_ANALYSIS("trend/time/a", new String[]{ParamStringConfig.LIU_LAN_LIANG_PV, ParamStringConfig.LIU_LAN_LIANG_ZHAN_BI, ParamStringConfig.FANG_WEN_CI_SHU, ParamStringConfig.FANG_WEN_SHU_UV, ParamStringConfig.XIN_FANG_KE_SHU, ParamStringConfig.XIN_FANG_KE_BI_LV, ParamStringConfig.IP_SHU, ParamStringConfig.TIAO_CHU_LV, ParamStringConfig.PING_JUN_FANG_WEN_SHI_CHANG, ParamStringConfig.PING_JUN_FANG_WEN_YE_SHU, ParamStringConfig.ZHUAN_HUA_CI_SHU, ParamStringConfig.ZHUAN_HUA_LV, ParamStringConfig.PING_JUN_ZHUAN_HUA_CHENG_BEN, ParamStringConfig.ZHUAN_HUA_SHOU_YI, ParamStringConfig.ZHUAN_HUA_LI_RUN, ParamStringConfig.TOU_ZI_HUI_BAO_LV}),
/**
* 实时访客
*/
REAL_TIME_VISITORS("trend/latest/a", new String[]{ParamStringConfig.DI_YU, ParamStringConfig.LAI_YUAN, ParamStringConfig.RU_KOU_YE_MIAN, ParamStringConfig.GUAN_JIAN_CI, ParamStringConfig.SOU_SUO_CI, ParamStringConfig.TUI_GUANG, ParamStringConfig.FANG_KE_BIAO_SHI_MA, ParamStringConfig.FANG_WEN_IP, ParamStringConfig.FANG_WEN_SHI_CHANG, ParamStringConfig.FANG_WEN_YE_SHU, ParamStringConfig.KAI_SHI_SHI_JIAN}),
/**
* 全部来源
*/
ALL_SOURCE("source/all/a", new String[]{ParamStringConfig.LIU_LAN_LIANG_PV, ParamStringConfig.LIU_LAN_LIANG_ZHAN_BI, ParamStringConfig.FANG_WEN_CI_SHU, ParamStringConfig.FANG_WEN_SHU_UV, ParamStringConfig.XIN_FANG_KE_SHU, ParamStringConfig.XIN_FANG_KE_BI_LV, ParamStringConfig.IP_SHU, ParamStringConfig.TIAO_CHU_LV, ParamStringConfig.PING_JUN_FANG_WEN_SHI_CHANG, ParamStringConfig.PING_JUN_FANG_WEN_YE_SHU, ParamStringConfig.ZHUAN_HUA_CI_SHU, ParamStringConfig.ZHUAN_HUA_LV}),
/**
* 受访域名
*/
DOMAIN_NAME("visit/topdomain/a", new String[]{ParamStringConfig.LIU_LAN_LIANG_PV, ParamStringConfig.LIU_LAN_LIANG_ZHAN_BI, ParamStringConfig.FANG_WEN_CI_SHU, ParamStringConfig.FANG_WEN_SHU_UV, ParamStringConfig.XIN_FANG_KE_SHU, ParamStringConfig.XIN_FANG_KE_BI_LV, ParamStringConfig.IP_SHU, ParamStringConfig.TIAO_CHU_LV, ParamStringConfig.PING_JUN_FANG_WEN_YE_SHU, ParamStringConfig.PING_JUN_TING_LIU_SHI_CHANG}),
/**
* 搜索词
*/
SEARCH_WORD("source/searchword/a", new String[]{}),
/**
* 入口页面
*/
ENTER_PAGE("visit/landingpage/a", new String[]{}),
/**
* 地域分布
*/
AREA("visit/district/a", new String[]{}),
/**
* 地域分析-表格数据
* avg_visit_time,avg_visit_pages,pv_count,visit_count,visitor_count,new_visitor_count
*/
DISTRICT_TABLE(
"visit/district/a",
new String[]{
ParamStringConfig.PING_JUN_FANG_WEN_SHI_CHANG,
ParamStringConfig.PING_JUN_FANG_WEN_YE_SHU,
ParamStringConfig.LIU_LAN_LIANG_PV,
ParamStringConfig.FANG_WEN_CI_SHU,
ParamStringConfig.FANG_WEN_SHU_UV,
ParamStringConfig.XIN_FANG_KE_BI_LV
}),
/**
* 地域分析-地图数据
*/
DISTRICT_MAP("visit/district/f", new String[]{}),
/**
* 游客属性
*/
VISITOR_ATTR("visit/attribute/f", new String[]{}),
/**
* 行为-趋势分析表格
*/
TREND_TABLE("trend/time/a", new String[]{
ParamStringConfig.LIU_LAN_LIANG_PV,
ParamStringConfig.FANG_WEN_SHU_UV,
ParamStringConfig.FANG_WEN_CI_SHU,
ParamStringConfig.PING_JUN_FANG_WEN_YE_SHU,
ParamStringConfig.PING_JUN_FANG_WEN_SHI_CHANG,
ParamStringConfig.IP_SHU
}),
/**
* 行为-趋势分析地图
*/
TREND_MAP("trend/time/f", new String[]{
}),
/**
* 来源分析表格
*/
SOURCE_TABLE("source/all/a", new String[]{
ParamStringConfig.LIU_LAN_LIANG_PV,
ParamStringConfig.FANG_WEN_SHU_UV,
ParamStringConfig.FANG_WEN_CI_SHU,
ParamStringConfig.IP_SHU,
ParamStringConfig.PING_JUN_FANG_WEN_YE_SHU,
ParamStringConfig.PING_JUN_FANG_WEN_SHI_CHANG
}),
/**
* 来源分析地图
*/
SOURCE_MAP("source/all/f", new String[]{
}),
/**
* 新老访客
* pv_count,visitor_count,ip_count,bounce_ratio,avg_visit_time
*/
NEW_OLD_VISITOR("visit/type/getVisitorSummary", new String[]{
ParamStringConfig.LIU_LAN_LIANG_PV,
ParamStringConfig.FANG_WEN_SHU_UV,
ParamStringConfig.IP_SHU,
ParamStringConfig.TIAO_CHU_LV,
ParamStringConfig.PING_JUN_FANG_WEN_SHI_CHANG
}),
/**
* 忠诚度
*/
VISITOR_LOYALTY("visit/character/fBar", new String[]{}),
/**
* 新老访客-图形数据
*/
VISIT_TYPE_A("visit/type/a", new String[]{
ParamStringConfig.LIU_LAN_LIANG_PV,
ParamStringConfig.FANG_WEN_SHU_UV,
ParamStringConfig.TIAO_CHU_LV,
ParamStringConfig.PING_JUN_FANG_WEN_SHI_CHANG,
ParamStringConfig.PING_JUN_FANG_WEN_YE_SHU
}),
/**
* 新老访客-表格数据
*/
VISIT_TYPE_GETVISITORSUMMARY("visit/type/getVisitorSummary", new String[]{}),
;
// 状态码
private final String funcName;
private final String[] supportParams;
private FuncEnum(String funcName, String[] supportParams) {
this.funcName = funcName;
this.supportParams = supportParams;
}
public String getFuncName() {
return funcName;
}
public String[] getSupportParams() {
return supportParams;
}
/**
* 获取所有的枚举,以MAP返回
*
* @return
*/
public static HashMap<String, String[]> getAllEnumMap() {
HashMap<String, String[]> map = new HashMap<String, String[]>();
for (FuncEnum mt : values()) {
map.put(mt.getFuncName(), mt.getSupportParams());
}
return map;
}
public static String getSupportParamsString(String funcName) {
if (StringUtils.isBlank(funcName)) {
throw new IllegalArgumentException("funcName " + funcName + " is blank");
}
for (FuncEnum mt : values()) {
if (mt.getFuncName().equals(funcName)) {
String[] params = mt.getSupportParams();
if (params == null || params.length <= 0) {
return "";
}
StringBuffer sb = new StringBuffer();
for (String str : params) {
sb.append(str + ",");
}
return sb.toString().substring(0, sb.length() - 1);
}
}
throw new IllegalArgumentException("funcName " + funcName + " is not exist");
}
}
package com.zrqx.statistics.utils.baidu;
import java.io.ByteArrayOutputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.security.KeyManagementException;
import java.security.NoSuchAlgorithmException;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSession;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.zrqx.statistics.utils.baidu.config.BaiduConfig;
import com.zrqx.statistics.utils.baidu.config.BaiduStatisticsBody;
import com.zrqx.statistics.utils.baidu.config.BaiduStatisticsHeader;
public class HttpUtils {
private static class TrustAnyTrustManager implements X509TrustManager {
public void checkClientTrusted(X509Certificate[] arg0, String arg1) throws CertificateException {
}
public void checkServerTrusted(X509Certificate[] arg0, String arg1) throws CertificateException {
}
public X509Certificate[] getAcceptedIssuers() {
return null;
}
}
private static class TrustAnyHostnameVerifier implements HostnameVerifier {
public boolean verify(String arg0, SSLSession arg1) {
return false;
}
}
/**
* post方式请求服务器(https协议)
*
* @param url 请求地址
* @param content 参数
* @param charset 编码
* @return
* @throws NoSuchAlgorithmException
* @throws KeyManagementException
* @throws IOException
*/
public static byte[] post(String url, String content, String charset)
throws NoSuchAlgorithmException, KeyManagementException,
IOException {
SSLContext sc = SSLContext.getInstance("SSL");
sc.init(null, new TrustManager[]{new TrustAnyTrustManager()},
new java.security.SecureRandom());
URL console = new URL(url);
HttpsURLConnection conn = (HttpsURLConnection) console.openConnection();
conn.setSSLSocketFactory(sc.getSocketFactory());
conn.setHostnameVerifier(new TrustAnyHostnameVerifier());
conn.setDoOutput(true);
conn.connect();
DataOutputStream out = new DataOutputStream(conn.getOutputStream());
out.write(content.getBytes(charset));
// 刷新、关闭
out.flush();
out.close();
InputStream is = conn.getInputStream();
if (is != null) {
ByteArrayOutputStream outStream = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int len = 0;
while ((len = is.read(buffer)) != -1) {
outStream.write(buffer, 0, len);
}
is.close();
return outStream.toByteArray();
}
return null;
}
public static void main(String[] args) {
try {
BaiduStatisticsHeader header = new BaiduStatisticsHeader();
BaiduStatisticsBody body = new BaiduStatisticsBody("", "", FuncEnum.ALL_SOURCE.getSupportParams(), FuncEnum.ALL_SOURCE.getFuncName());
String url = BaiduConfig.API_URL;
String charset = "utf-8";
JSONObject params = new JSONObject();
params.put("header", JSON.toJSON(header));
params.put("body", JSON.toJSON(body));
byte[] res = HttpUtils.post(url, params.toString(), charset);
String s = new String(res);
System.out.println(s);
} catch (Exception e) {
e.printStackTrace();
}
}
}
package com.zrqx.statistics.utils.baidu.config;
public class BaiduConfig {
public static final String ACCOUNT = "rsks";
public static final String PASSWORD = "1111111";
public static final String TOKEN = "0f41a4fd3942cbf2422e7c0c21a0adb9";
public static final String SITEID = "6929950";
public static final String API_URL = "https://api.baidu.com/json/tongji/v1/ReportService/getData";
}
package com.zrqx.statistics.utils.baidu.config;
import com.zrqx.statistics.utils.baidu.FuncEnum;
import lombok.Data;
@Data
public class BaiduStatisticsBody {
// {
// "header": {
// "username": "rsks",
// "password": "******",
// "token": "0f41a4fd3942cbf2422e7c0c21a0adb9",
// "account_type": 1
// },
// "body": {
// "site_id": "6929950",
// "start_date": "",
// "end_date": "",
// "metrics": "pv_count",
// "method": "overview/getDistrictRpt"
// }
// }
public String site_id;
/**
* 游客属性
*/
private String visitor;
/**
* 开始时间
*/
public String start_date;
/**
* 结束时间
*/
public String end_date;
/**
* 指标
*/
public String metrics;
/**
* 请求方法
*/
public String method;
/**
* 图形别名
*/
public String character;
/**
* 地域
*/
private String area;
/**
* 对比时间
*/
private String start_date2;
/**
* 对比时间
*/
private String end_date2;
/**
* 设备
*/
private String clientDevice;
/**
* 指标,地域分析
*/
private String indicators;
/**
* 展示标签类型
*/
private String viewType;
public BaiduStatisticsBody() {
this.site_id = BaiduConfig.SITEID;
this.method = FuncEnum.SITE_PROFILE_TREND_DATA.getFuncName();
this.metrics = getStringFromArray(FuncEnum.SITE_PROFILE_TREND_DATA.getSupportParams());
}
private String getStringFromArray(String[] datas) {
if (datas == null || datas.length <= 0) {
return "";
}
StringBuffer sb = new StringBuffer();
for (String data : datas) {
if (ParamStringConfig.BAI_DU_TUI_JIAN_GONG_XIAN_LIU_LAN_LIANG.equals(data)) {
continue;
}
sb.append(data + ",");
}
return sb.toString().substring(0, sb.length() - 1);
}
/**
* @param start_date 比如:2019年1月1日需要写为:20190101
* @param end_date 比如:2019年1月1日需要写为:20190101
* @param metrics 查询项
* @param method 方法名
*/
public BaiduStatisticsBody(String start_date, String end_date, String[] metrics, String method) {
this.site_id = BaiduConfig.SITEID;
this.start_date = start_date;
this.end_date = end_date;
this.metrics = getStringFromArray(metrics);
this.method = method;
}
/**
* 行为分析-趋势分析使用
* @param start_date 开始时间
* @param end_date 结束时间
* @param metrics 指标
* @param method 方法
* @param area 地域
* @param start_date2 对比日期
* @param end_date2 对比日期
* @param clientDevice 设备
*/
public BaiduStatisticsBody(String visitor, String start_date, String end_date, String[] metrics, String method, String area, String start_date2, String end_date2, String clientDevice) {
this.visitor = visitor;
this.site_id = BaiduConfig.SITEID;
this.start_date = start_date;
this.end_date = end_date;
this.metrics = getStringFromArray(metrics);
this.method = method;
this.area = area;
this.start_date2 = start_date2;
this.end_date2 = end_date2;
this.clientDevice = clientDevice;
}
/**
* 行为分析-趋势分析使用
* @param start_date 开始时间
* @param end_date 结束时间
* @param metrics 指标
* @param method 方法
* @param clientDevice 设备
*/
public BaiduStatisticsBody(String viewType,String visitor, String start_date, String end_date, String[] metrics, String method,String clientDevice) {
this.viewType = viewType;
this.visitor = visitor;
this.site_id = BaiduConfig.SITEID;
this.start_date = start_date;
this.end_date = end_date;
this.metrics = getStringFromArray(metrics);
this.method = method;
this.clientDevice = clientDevice;
}
/**
* 用户画像
* @param visitor 访客
* @param start_date 开始时间
* @param end_date 结束时间
* @param start_date2 对比时间
* @param end_date2 对比时间
* @param method 请求方法名
* @param metrics 指标
* @param character 非忠诚度查询可以忽略
* @param area 地域
*/
public BaiduStatisticsBody(String visitor, String start_date, String end_date, String start_date2, String end_date2, String method, String[] metrics, String character, String area) {
this.site_id = BaiduConfig.SITEID;
this.visitor = visitor;
this.start_date = start_date;
this.end_date = end_date;
this.start_date2 = start_date2;
this.end_date2 = end_date2;
this.method = method;
this.metrics = getStringFromArray(metrics);
this.character = character;
this.area = area;
}
}
package com.zrqx.statistics.utils.baidu.config;
import lombok.Data;
@Data
public class BaiduStatisticsHeader {
// {
// "header": {
// "username": "rsks",
// "password": "******",
// "token": "0f41a4fd3942cbf2422e7c0c21a0adb9",
// "account_type": 1
// },
// "body": {
// "site_id": "6929950",
// "start_date": "",
// "end_date": "",
// "metrics": "pv_count",
// "method": "overview/getDistrictRpt"
// }
// }
public String username;
public String password;
public String token;
public String account_type;
public BaiduStatisticsHeader() {
this.username = BaiduConfig.ACCOUNT;
this.password = BaiduConfig.PASSWORD;
this.token = BaiduConfig.TOKEN;
this.account_type = "1";
}
}
package com.zrqx.statistics.utils.baidu.config;
import lombok.Data;
@Data
public class ParamStringConfig {
//网站基础指标
/**
* 浏览量(PV)
*/
public static final String LIU_LAN_LIANG_PV = "pv_count";
/**
* 浏览量占比%
*/
public static final String LIU_LAN_LIANG_ZHAN_BI = "pv_ratio";
/**
* 访问次数
*/
public static final String FANG_WEN_CI_SHU = "visit_count";
/**
* 按来源类型:type
*/
public static final String VIEW_TYPE = "viewType";
/**
* 访问数(UV)
*/
public static final String FANG_WEN_SHU_UV = "visitor_count";
/**
* IP数
*/
public static final String IP_SHU = "ip_count";
/**
* 新访客数
*/
public static final String XIN_FANG_KE_SHU = "new_visitor_count";
/**
* 新访客比率
*/
public static final String XIN_FANG_KE_BI_LV = "new_visitor_ratio";
//流量质量指标
/**
* 跳出率
*/
public static final String TIAO_CHU_LV = "bounce_ratio";
/**
* 平均访问时长,秒
*/
public static final String PING_JUN_FANG_WEN_SHI_CHANG = "avg_visit_time";
/**
* 平均访问页数
*/
public static final String PING_JUN_FANG_WEN_YE_SHU = "avg_visit_pages";
//转化指标
/**
* 转化次数
*/
public static final String ZHUAN_HUA_CI_SHU = "trans_count";
/**
* 转化率%
*/
public static final String ZHUAN_HUA_LV = "trans_ratio";
/**
* 平均转化成本,元
*/
public static final String PING_JUN_ZHUAN_HUA_CHENG_BEN = "avg_trans_cost";
/**
* 转化收益,元
*/
public static final String ZHUAN_HUA_SHOU_YI = "income";
/**
* 转化利润,元
*/
public static final String ZHUAN_HUA_LI_RUN = "profit";
/**
* 投资回报率%
*/
public static final String TOU_ZI_HUI_BAO_LV = "roi";
//其他
public static final String BAI_DU_TUI_JIAN_GONG_XIAN_LIU_LAN_LIANG = "contri_pv";
/**
* 平均停留时长,秒
*/
public static final String PING_JUN_TING_LIU_SHI_CHANG = "average_stay_time";
//查询指标
/**
* 地域
*/
public static final String DI_YU = "area";
/**
* 来源
*/
public static final String LAI_YUAN = "source";
/**
* 入口页面
*/
public static final String RU_KOU_YE_MIAN = "access_page";
/**
* 关键词
*/
public static final String GUAN_JIAN_CI = "keyword";
/**
* 搜索词
*/
public static final String SOU_SUO_CI = "searchword";
/**
* 推广
*/
public static final String TUI_GUANG = "is_ad";
/**
* 访客标识码
*/
public static final String FANG_KE_BIAO_SHI_MA = "visitorId";
/**
* 访问ip
*/
public static final String FANG_WEN_IP = "ip";
/**
* 访问时长
*/
public static final String FANG_WEN_SHI_CHANG = "visit_time";
/**
* 访问页数
*/
public static final String FANG_WEN_YE_SHU = "visit_pages";
/**
* 开始时间
*/
public static final String KAI_SHI_SHI_JIAN = "start_time";
}
security:
sessions: always #always设置保存用户状态(内存可能会被占满) stateless设置不保存用户状态
basic:
enabled: false #开启认证
user:
name: user
password: 123456
feign:
hystrix:
enabled: true
hystrix:
command:
default:
execution:
isolation:
strategy: SEMAPHORE
thread:
timeoutInMilliseconds: 1440000
semaphore:
maxConcurrentRequests: 200
logging:
level:
com.zrqx.resource.bg.mapper: DEBUG
mybatis:
type-aliases-package: com.zrqx.core.model
configuration:
default-scripting-language:
com.zrqx.core.mapper.SqlXMLLanguageDriver
mapper:
mappers:
- com.zrqx.core.mapper.BaseMapper
not-empty: false
i-d-e-n-t-i-t-y: MYSQL
style: normal
b-e-f-o-r-e: true
pagehelper:
helperDialect: mysql
reasonable: false
supportMethodsArguments: true
params: count=countSql
spring:
main:
allow-bean-definition-overriding: true #2.1.0 多个接口上的@FeignClient(“相同服务名”)会报错 ,允许覆盖
jackson:
date-format: yyyy-MM-dd HH:mm:ss
time-zone: GMT+8
http:
multipart:
maxFileSize: 20Mb
maxRequestSize: 20Mb
encoding:
charset: UTF-8
enabled: true
force: true
<assembly
xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.3"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.3 http://maven.apache.org/xsd/assembly-1.1.3.xsd">
<id>package</id>
<formats>
<format>zip</format>
</formats>
<includeBaseDirectory>false</includeBaseDirectory>
<fileSets>
<fileSet>
<directory>${basedir}/src/main/statistics</directory>
<includes>
<include>*.yml</include>
<include>*.xml</include>
<include>static/**</include>
<include>templates/**</include>
<include>*.properties</include>
<include>*.txt</include>
</includes>
<filtered>true</filtered>
<outputDirectory>${file.separator}${project.artifactId}</outputDirectory>
</fileSet>
<fileSet>
<directory>src/main/statistics/runScript</directory>
<outputDirectory>${file.separator}bin</outputDirectory>
</fileSet>
<fileSet>
<directory>${project.build.directory}/lib</directory>
<outputDirectory>${file.separator}${project.artifactId}/lib</outputDirectory>
<includes>
<include>*.jar</include>
</includes>
</fileSet>
<fileSet>
<directory>${project.build.directory}/</directory>
<outputDirectory>${file.separator}${project.artifactId}</outputDirectory>
<includes>
<include>*.jar</include>
</includes>
</fileSet>
</fileSets>
</assembly>
\ No newline at end of file
server:
port: 8088
spring:
cloud:
config:
uri: http://localhost:8086 #配置中心地址
name: statistics
profile: prod
label: master
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<configuration
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="http://www.padual.com/java/logback.xsd"
debug="false" scan="true" scanPeriod="30 second">
<!--读取配置中心的属性-->
<springProperty scope="context" name="name" source="spring.application.name"/>
<property name="PROJECT" value="statistics" />
<property name="ROOT" value="/opt/logs/zzf/statistics/" />
<property name="FILESIZE" value="10MB" />
<property name="MAXHISTORY" value="10" />
<timestamp key="DATETIME" datePattern="yyyy-MM-dd HH:mm:ss" />
<!-- 控制台打印 -->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder charset="utf-8">
<pattern>[%-5level] %d{${DATETIME}} [%thread] %logger{36} - %m%n
</pattern>
</encoder>
</appender>
<!-- ERROR 输入到文件,按日期和文件大小 -->
<appender name="ERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
<encoder charset="utf-8">
<pattern>[%-5level] %d{${DATETIME}} [%thread] %logger{36} - %m%n
</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>ERROR</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${ROOT}%d/error.%i.log</fileNamePattern>
<maxHistory>${MAXHISTORY}</maxHistory>
<timeBasedFileNamingAndTriggeringPolicy
class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>${FILESIZE}</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
</appender>
<!-- WARN 输入到文件,按日期和文件大小 -->
<appender name="WARN" class="ch.qos.logback.core.rolling.RollingFileAppender">
<encoder charset="utf-8">
<pattern>[%-5level] %d{${DATETIME}} [%thread] %logger{36} - %m%n
</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>WARN</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${ROOT}%d/warn.%i.log</fileNamePattern>
<maxHistory>${MAXHISTORY}</maxHistory>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>${FILESIZE}</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
</appender>
<!-- INFO 输入到文件,按日期和文件大小 -->
<appender name="INFO" class="ch.qos.logback.core.rolling.RollingFileAppender">
<encoder charset="utf-8">
<pattern>[%-5level] %d{${DATETIME}} [%thread] %logger{36} - %m%n
</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>INFO</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${ROOT}%d/info.%i.log</fileNamePattern>
<maxHistory>${MAXHISTORY}</maxHistory>
<timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>${FILESIZE}</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
</appender>
<!-- DEBUG 输入到文件,按日期和文件大小 -->
<appender name="DEBUG" class="ch.qos.logback.core.rolling.RollingFileAppender">
<encoder charset="utf-8">
<pattern>[%-5level] %d{${DATETIME}} [%thread] %logger{36} - %m%n
</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>DEBUG</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${ROOT}%d/debug.%i.log</fileNamePattern>
<maxHistory>${MAXHISTORY}</maxHistory>
<timeBasedFileNamingAndTriggeringPolicy
class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>${FILESIZE}</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
</appender>
<!-- TRACE 输入到文件,按日期和文件大小 -->
<appender name="TRACE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<encoder charset="utf-8">
<pattern>[%-5level] %d{${DATETIME}} [%thread] %logger{36} - %m%n
</pattern>
</encoder>
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<level>TRACE</level>
<onMatch>ACCEPT</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<rollingPolicy
class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${ROOT}%d/trace.%i.log</fileNamePattern>
<maxHistory>${MAXHISTORY}</maxHistory>
<timeBasedFileNamingAndTriggeringPolicy
class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
<maxFileSize>${FILESIZE}</maxFileSize>
</timeBasedFileNamingAndTriggeringPolicy>
</rollingPolicy>
</appender>
<!-- SQL相关日志输出-->
<logger name="org.mybatis.spring" level="ERROR" additivity="true" />
<!-- Logger 根目录 -->
<root level="INFO">
<appender-ref ref="STDOUT" />
<appender-ref ref="TRACE" />
<appender-ref ref="ERROR" />
<appender-ref ref="WARN" />
<appender-ref ref="INFO" />
<appender-ref ref="DEBUG" />
</root>
</configuration>
\ No newline at end of file
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论