ソースを参照

报表功能已完成

wuweihao 3 年 前
コミット
b8f4ad8d8b

+ 63 - 0
gis_cms/src/main/java/com/gis/cms/controller/ReportController.java

@@ -0,0 +1,63 @@
+package com.gis.cms.controller;
+
+import com.gis.cms.entity.vo.CountTypeVo;
+import com.gis.cms.entity.vo.CountVoteVo;
+import com.gis.cms.service.ReportService;
+import com.gis.common.base.aop.WebControllerLog;
+import com.gis.common.base.entity.dto.DateDto;
+import com.gis.common.util.Result;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+/**
+ * Created by owen on 2022/2/9 0009 17:16
+ */
+@Api(tags = "v0.2-数据统计")
+@RestController
+@RequestMapping("cms/report")
+public class ReportController {
+
+    @Autowired
+    ReportService entityService;
+
+
+    @WebControllerLog(description = "数据统计-网站统计")
+    @ApiOperation(value = "网站统计")
+    @GetMapping("net")
+    public Result net() {
+        return entityService.net();
+    }
+
+    @WebControllerLog(description = "数据统计-各模块浏览量统计")
+    @ApiOperation(value = "各模块浏览量统计", notes = "模块名称,news:学习园地 martyr:纪念祭扫 goods:精品典藏 scene:数字史馆 comment:留言")
+    @PostMapping("visit")
+    public Result<List<CountTypeVo>> visit(@RequestBody DateDto param) {
+        return entityService.visit(param);
+    }
+
+    @WebControllerLog(description = "数据统计-注册用户统计")
+    @ApiOperation(value = "注册用户统计", notes = "显示所有角色")
+    @PostMapping("user")
+    public Result<List<CountTypeVo>> user(@RequestBody DateDto param) {
+        return entityService.user(param);
+    }
+
+    @WebControllerLog(description = "数据统计-互动统计")
+    @ApiOperation(value = "互动统计")
+    @PostMapping("interact")
+    public Result interact(@RequestBody DateDto param) {
+        return entityService.interact(param);
+    }
+
+    @WebControllerLog(description = "数据统计-投票点赞统计")
+    @ApiOperation(value = "投票点赞统计")
+    @PostMapping("vote")
+    public Result<List<CountVoteVo>> vote(@RequestBody DateDto param) {
+        return entityService.vote(param);
+    }
+
+}

+ 12 - 1
gis_cms/src/main/java/com/gis/cms/controller/WebController.java

@@ -35,7 +35,7 @@ import javax.validation.Valid;
  * Created by owen on 2021/6/25 0025 17:17
  */
 @Slf4j
-@Api(tags = "门户网站")
+@Api(tags = "v0.2-门户网站")
 @RestController
 @RequestMapping("api/web")
 public class WebController {
@@ -68,6 +68,9 @@ public class WebController {
     @Autowired
     MournService mournService;
 
+    @Autowired
+    ReportService reportService;
+
 
 
 
@@ -79,6 +82,14 @@ public class WebController {
         return barrageService.search(param, 1);
     }
 
+
+    @WebControllerLog(description = "门户网站-保存网站访问量")
+    @ApiOperation(value = "v0.2-保存网站访问量", notes = "news:学习园地 martyr:纪念祭扫 goods:精品典藏 scene:数字史馆 comment:留言")
+    @GetMapping("visit/{type}")
+        public Result visitSave(@PathVariable String type) {
+        return reportService.visitSave(type);
+    }
+
     @WebControllerLog(description = "门户网站-保存并获取访问量")
     @ApiOperation("保存并获取访问量")
     @GetMapping("webVisit")

+ 2 - 0
gis_cms/src/main/java/com/gis/cms/controller/WebManageController.java

@@ -177,4 +177,6 @@ public class WebManageController {
 
 
 
+
+
 }

+ 31 - 0
gis_cms/src/main/java/com/gis/cms/entity/po/VisitLogEntity.java

@@ -0,0 +1,31 @@
+package com.gis.cms.entity.po;
+
+import com.gis.common.base.entity.po.BaseEntity;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.persistence.Table;
+import javax.persistence.Transient;
+import java.io.Serializable;
+
+/**
+ * Created by owen on 2021/6/25 0025 10:53
+ * 网站模块访问量
+ */
+@Data
+@Table(name = "tb_visit_log")
+public class VisitLogEntity extends BaseEntity implements Serializable {
+
+
+    private static final long serialVersionUID = 4199394049645955709L;
+    @ApiModelProperty(value = "模块名称,news:学习园地 martyr:纪念祭扫 goods:精品典藏 scene:数字史馆 comment:留言" )
+    private String module;
+
+
+//    @Transient
+//    @ApiModelProperty(value = "数量" )
+//    private Integer count;
+
+
+
+}

+ 27 - 0
gis_cms/src/main/java/com/gis/cms/entity/vo/CountTypeVo.java

@@ -0,0 +1,27 @@
+package com.gis.cms.entity.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * Created by owen on 2021/6/24 0024 12:22
+ * 悼念烈士表
+ */
+@Data
+public class CountTypeVo  implements Serializable {
+
+    private static final long serialVersionUID = -4893336066368440067L;
+    @ApiModelProperty(value = "数量" )
+    private Integer count;
+
+
+    @ApiModelProperty(value = "模块、类型名称" )
+    private String name;
+
+
+
+
+
+}

+ 29 - 0
gis_cms/src/main/java/com/gis/cms/entity/vo/CountVoteVo.java

@@ -0,0 +1,29 @@
+package com.gis.cms.entity.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * Created by owen on 2021/6/24 0024 12:22
+ */
+@Data
+public class CountVoteVo implements Serializable {
+
+    private static final long serialVersionUID = 1882858022662152955L;
+    @ApiModelProperty(value = "投票数量" )
+    private Integer countVote;
+
+    @ApiModelProperty(value = "点赞数量" )
+    private Integer countLike;
+
+
+    @ApiModelProperty(value = "模块、类型名称" )
+    private String name;
+
+
+
+
+
+}

+ 27 - 0
gis_cms/src/main/java/com/gis/cms/mapper/VisitLogMapper.java

@@ -0,0 +1,27 @@
+package com.gis.cms.mapper;
+
+
+import com.gis.cms.entity.po.VisitLogEntity;
+import com.gis.cms.entity.vo.CountTypeVo;
+import com.gis.cms.entity.vo.CountVoteVo;
+import com.gis.cms.mapper.provider.BaseProvider;
+import com.gis.common.base.mapper.IBaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.SelectProvider;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+
+@Component
+@Mapper
+public interface VisitLogMapper extends IBaseMapper<VisitLogEntity, Long> {
+
+    @SelectProvider(type = BaseProvider.class, method = "selectSql")
+    List<CountTypeVo> selectSql(String sql);
+
+    @SelectProvider(type = BaseProvider.class, method = "selectSql")
+    List<CountVoteVo> voteSelectSql(String sql);
+
+    @SelectProvider(type = BaseProvider.class, method = "selectSql")
+    Integer countSql(String sql);
+}

+ 31 - 0
gis_cms/src/main/java/com/gis/cms/service/ReportService.java

@@ -0,0 +1,31 @@
+package com.gis.cms.service;
+
+
+import com.gis.cms.entity.dto.AuditDto;
+import com.gis.cms.entity.dto.NewsDto;
+import com.gis.cms.entity.dto.NewsPageDataDto;
+import com.gis.cms.entity.po.NewsEntity;
+import com.gis.common.base.entity.dto.DateDto;
+import com.gis.common.base.service.IBaseService;
+import com.gis.common.util.Result;
+import org.springframework.web.multipart.MultipartFile;
+
+
+/**
+ * Created by owen on 2020/3/11 0011 16:14
+ */
+public interface ReportService  {
+
+
+    Result net();
+
+    Result visit(DateDto param);
+
+    Result user(DateDto param);
+
+    Result interact(DateDto param);
+
+    Result vote(DateDto param);
+
+    Result visitSave(String type);
+}

+ 9 - 1
gis_cms/src/main/java/com/gis/cms/service/impl/BarrageServiceImpl.java

@@ -1,5 +1,6 @@
 package com.gis.cms.service.impl;
 
+import com.gis.admin.service.SysResourceService;
 import com.gis.cms.entity.dto.CommentDto;
 import com.gis.cms.entity.po.BarrageEntity;
 import com.gis.cms.entity.po.CommentEntity;
@@ -35,6 +36,9 @@ public class BarrageServiceImpl extends IBaseServiceImpl<BarrageEntity, Long> im
     @Autowired
     SensitiveService sensitiveService;
 
+    @Autowired
+    SysResourceService sysResourceService;
+
     @Override
     public IBaseMapper<BarrageEntity, Long> getBaseMapper() {
         return this.entityMapper;
@@ -76,13 +80,17 @@ public class BarrageServiceImpl extends IBaseServiceImpl<BarrageEntity, Long> im
         BarrageEntity entity = new BarrageEntity();
         BeanUtils.copyProperties(param, entity);
         entity.setUserId(getTokenUserId());
+        // 有留言、弹幕显示权限的管理员, 直接显示,不需要审核,523:barrage:display, 弹幕查看,513:comment:display 留言查看
+        Set<String> permissionKey = sysResourceService.getPermissionByUserId(getTokenUserId());
+        if (permissionKey.contains("barrage:display")){
+            entity.setDisplay(1);
+        }
         this.save(entity);
         return Result.success();
     }
 
     @Override
     public Result<BarrageEntity> detail(Long id) {
-//        BarrageEntity entity = this.findById(id);
         BarrageEntity entity = entityMapper.detailMapper(id);
         if (entity == null) {
             return Result.failure("对象不存在");

+ 9 - 0
gis_cms/src/main/java/com/gis/cms/service/impl/CommentServiceImpl.java

@@ -1,5 +1,6 @@
 package com.gis.cms.service.impl;
 
+import com.gis.admin.service.SysResourceService;
 import com.gis.cms.entity.dto.CommentDto;
 import com.gis.cms.entity.po.CommentEntity;
 import com.gis.cms.entity.vo.CommentVo;
@@ -36,6 +37,9 @@ public class CommentServiceImpl extends IBaseServiceImpl<CommentEntity, Long> im
     @Autowired
     private SensitiveService sensitiveService;
 
+    @Autowired
+    SysResourceService sysResourceService;
+
     @Override
     public IBaseMapper<CommentEntity, Long> getBaseMapper() {
         return this.entityMapper;
@@ -72,6 +76,11 @@ public class CommentServiceImpl extends IBaseServiceImpl<CommentEntity, Long> im
         CommentEntity entity = new CommentEntity();
         BeanUtils.copyProperties(param, entity);
         entity.setUserId(getTokenUserId());
+        // 有留言、弹幕显示权限的管理员, 直接显示,不需要审核,523:barrage:display, 弹幕查看,513:comment:display 留言查看
+        Set<String> permissionKey = sysResourceService.getPermissionByUserId(getTokenUserId());
+        if (permissionKey.contains("comment:display")){
+            entity.setDisplay(1);
+        }
         this.save(entity);
         return Result.success();
     }

+ 217 - 0
gis_cms/src/main/java/com/gis/cms/service/impl/ReportServiceImpl.java

@@ -0,0 +1,217 @@
+package com.gis.cms.service.impl;
+
+import com.gis.cms.entity.po.VisitLogEntity;
+import com.gis.cms.mapper.VisitLogMapper;
+import com.gis.cms.service.ReportService;
+import com.gis.common.base.entity.dto.DateDto;
+import com.gis.common.util.Result;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+
+
+/**
+ * Created by owen on 2022/2/9 0011 16:16
+ */
+@Slf4j
+@Service
+public class ReportServiceImpl implements ReportService {
+
+    @Autowired
+    VisitLogMapper visitLogMapper;
+
+
+
+    @Override
+    public Result net() {
+        Integer countAnswer = countAnswer(new DateDto());
+        Integer countComment = countComment(new DateDto());
+        Integer countBarrage = countBarrage(new DateDto());
+        Integer countGoods = countGoods();
+        Integer countNews = countNews();
+        Integer countMartyr = countMartyr();
+
+        HashMap<Object, Object> result = new HashMap<>();
+        result.put("countAnswer", countAnswer);
+        result.put("countComment", countComment);
+        result.put("countBarrage", countBarrage);
+        result.put("countGoods", countGoods);
+        result.put("countNews", countNews);
+        result.put("countMartyr", countMartyr);
+        return Result.success(result);
+    }
+
+    @Override
+    public Result visit(DateDto param) {
+
+        StringBuffer sql = new StringBuffer();
+        sql.append("SELECT module as name, count(id) as count from tb_visit_log a ");
+        if (StringUtils.isBlank(param.getStartTime()) || StringUtils.isBlank(param.getEndTime())) {
+            return Result.failure("时间参数不能为空");
+        }
+        sql.append(" where create_time >= ").append("'").append(param.getStartTime()).append("'");
+        sql.append(" and create_time <= ").append("'").append(param.getEndTime()).append("'");
+
+        sql.append("GROUP BY module");
+        log.info("sql: {}", sql.toString());
+
+        return Result.success(visitLogMapper.selectSql(sql.toString()));
+    }
+
+    @Override
+    public Result user(DateDto param) {
+
+        // 停用、删除的用户不统计
+        StringBuffer sql = new StringBuffer(
+                "select a.role_name as name, count(b.user_id) as count from sys_role a " +
+                        "left JOIN sys_user_role b on b.role_id=a.id " +
+                        "left join sys_user c on c.id=b.user_id WHERE a.is_delete=0 ");
+
+        if (StringUtils.isBlank(param.getStartTime()) || StringUtils.isBlank(param.getEndTime())) {
+            return Result.failure("时间参数不能为空");
+        }
+        sql.append(" and c.create_time >= ").append("'").append(param.getStartTime()).append("'");
+        sql.append(" and c.create_time <= ").append("'").append(param.getEndTime()).append("'");
+
+        sql.append(" GROUP BY a.id");
+        log.info("sql: {}", sql.toString());
+
+
+        return Result.success(visitLogMapper.selectSql(sql.toString()));
+    }
+
+    @Override
+    public Result interact(DateDto param) {
+
+        if (StringUtils.isBlank(param.getStartTime()) || StringUtils.isBlank(param.getEndTime())) {
+            return Result.failure("时间参数不能为空");
+        }
+
+        Integer countAnswer = countAnswer(param);
+        Integer countComment = countComment(param);
+        Integer countBarrage = countBarrage(param);
+
+        HashMap<Object, Object> result = new HashMap<>();
+        result.put("countAnswer", countAnswer);
+        result.put("countComment", countComment);
+        result.put("countBarrage", countBarrage);
+
+        return Result.success(result);
+    }
+
+    /**
+     * 统计答题
+     */
+    private Integer countAnswer(DateDto param){
+        StringBuffer sql = new StringBuffer();
+        sql.append("SELECT count(id) as count from tb_question_user where is_delete=0");
+
+        if (StringUtils.isNotBlank(param.getStartTime()) && StringUtils.isNotBlank(param.getEndTime())) {
+            sql.append(" and create_time >= ").append("'").append(param.getStartTime()).append("'");
+            sql.append(" and create_time <= ").append("'").append(param.getEndTime()).append("'");
+        }
+
+
+
+        log.info("sql: {}", sql.toString());
+
+        return visitLogMapper.countSql(sql.toString());
+    }
+
+    private Integer countComment(DateDto param){
+        StringBuffer sql = new StringBuffer();
+        sql.append("SELECT count(id) as count from tb_comment where is_delete=0 and display=1");
+
+        if (StringUtils.isNotBlank(param.getStartTime()) && StringUtils.isNotBlank(param.getEndTime())) {
+            sql.append(" and create_time >= ").append("'").append(param.getStartTime()).append("'");
+            sql.append(" and create_time <= ").append("'").append(param.getEndTime()).append("'");
+        }
+
+        log.info("sql: {}", sql.toString());
+
+        return visitLogMapper.countSql(sql.toString());
+    }
+
+    private Integer countBarrage(DateDto param){
+        StringBuffer sql = new StringBuffer();
+        sql.append("SELECT count(id) as count from tb_barrage where is_delete=0 and display=1");
+
+
+        if (StringUtils.isNotBlank(param.getStartTime()) && StringUtils.isNotBlank(param.getEndTime())) {
+            sql.append(" and create_time >= ").append("'").append(param.getStartTime()).append("'");
+            sql.append(" and create_time <= ").append("'").append(param.getEndTime()).append("'");
+        }
+
+
+
+        log.info("sql: {}", sql.toString());
+
+        return visitLogMapper.countSql(sql.toString());
+    }
+
+    private Integer countGoods(){
+        StringBuffer sql = new StringBuffer();
+        sql.append("SELECT count(id) as count from tb_goods where is_delete=0 and display=1 and status=3");
+        log.info("sql: {}", sql.toString());
+        return visitLogMapper.countSql(sql.toString());
+    }
+
+    private Integer countNews(){
+        StringBuffer sql = new StringBuffer();
+        sql.append("SELECT count(id) as count from tb_news where is_delete=0 and display=1 and status=3");
+        log.info("sql: {}", sql.toString());
+        return visitLogMapper.countSql(sql.toString());
+    }
+
+    private Integer countMartyr(){
+        StringBuffer sql = new StringBuffer();
+        sql.append("SELECT count(id) as count from tb_martyr where is_delete=0 and display=1 and status=3");
+        log.info("sql: {}", sql.toString());
+        return visitLogMapper.countSql(sql.toString());
+    }
+
+    @Override
+    public Result vote(DateDto param) {
+
+        StringBuffer sql = new StringBuffer();
+        sql.append("select a.name,COUNT(case when b.type='vote' and b.is_delete=0 then 1 end) countVote," +
+                "COUNT(case when b.type='like' and b.is_delete=0 then 1 end) countLike " +
+                "from tb_goods_module a left join tb_goods_vote b on b.goods_module_id=a.id WHERE a.is_delete=0");
+
+
+        if (StringUtils.isBlank(param.getStartTime()) || StringUtils.isBlank(param.getEndTime())) {
+            return Result.failure("时间参数不能为空");
+        }
+        sql.append(" and b.create_time >= ").append("'").append(param.getStartTime()).append("'");
+        sql.append(" and b.create_time <= ").append("'").append(param.getEndTime()).append("'");
+
+
+        sql.append(" GROUP BY a.id");
+
+        log.info("sql: {}", sql.toString());
+
+
+        return Result.success(visitLogMapper.voteSelectSql(sql.toString()));
+    }
+
+    /**
+     * @param type news:学习园地 martyr:纪念祭扫 goods:精品典藏 scene:数字史馆 comment:留言
+     * @return
+     */
+    @Override
+    public Result visitSave(String type) {
+        List<String> types = Arrays.asList("news", "martyr", "goods", "scene", "comment");
+        if (!types.contains(type)) {
+            return Result.failure("非法类型: " + type);
+        }
+        VisitLogEntity entity = new VisitLogEntity();
+        entity.setModule(type);
+        visitLogMapper.insert(entity);
+        return Result.success();
+    }
+}

+ 27 - 0
gis_common/src/main/java/com/gis/common/base/entity/dto/DateDto.java

@@ -0,0 +1,27 @@
+package com.gis.common.base.entity.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+
+/**
+ * Created by Owen on 2022/2/9 0028 12:24
+ * 有时间
+ */
+@Data
+public class DateDto {
+
+    /**
+     * 开始时间
+     * 需要用字符串接收
+     */
+    @ApiModelProperty(value = "开始时间, yyyy-mm-dd", name = "startTime")
+    private String startTime;
+
+
+    @ApiModelProperty(value = "结束时间, yyyy-mm-dd", name = "endTime")
+    private String endTime;
+
+
+
+}

+ 9 - 3
gis_common/src/main/java/com/gis/common/constant/TypeCode.java

@@ -6,12 +6,18 @@ package com.gis.common.constant;
 public class TypeCode {
 
 
-    public static final String MODULE_NEWS = "news";
+    public static final String MODULE_NEWS = "news"; //学习园地
 
-    public static final String MODULE_MARTYR = "martyr";
+    public static final String MODULE_MARTYR = "martyr"; //纪念祭扫
 
-    public static final String MODULE_GOODS = "goods";
+    public static final String MODULE_GOODS = "goods"; //精品典藏
+
+    public static final String MODULE_SCENE = "scene"; //数字史馆
+
+    public static final String MODULE_COMMENT = "comment"; //留言
 
     public static final String MODULE_QUESTION_GROUP = "question_group";
 
+    // news:学习园地 martyr:纪念祭扫 goods:精品典藏 scene:数字史馆 comment:留言
+
 }

+ 6 - 11
gis_common/src/main/java/com/gis/common/util/Result.java

@@ -22,7 +22,6 @@ public class Result<T> implements Serializable {
     public static int CODE_SUCCESS = 0;
     public static int CODE_FAILURE = -1;
     public static String[] NOOP = new String[]{};
-    public static LocalDateTime dataTime = LocalDateTime.now();
 
     /**
      * 处理状态:0: 成功, 1: 失败
@@ -49,7 +48,7 @@ public class Result<T> implements Serializable {
      * @return data
      */
     public static Result success(Object data) {
-        return new Result(CODE_SUCCESS, SUCCESS_MSG, data, dataTime);
+        return new Result(CODE_SUCCESS, SUCCESS_MSG, data, LocalDateTime.now());
     }
     /**
      * 处理成功
@@ -57,7 +56,7 @@ public class Result<T> implements Serializable {
      * @return data
      */
     public static Result success() {
-        return new Result(CODE_SUCCESS, SUCCESS_MSG, NOOP, dataTime);
+        return new Result(CODE_SUCCESS, SUCCESS_MSG, NOOP, LocalDateTime.now());
     }
     /**
      * 处理成功
@@ -66,7 +65,7 @@ public class Result<T> implements Serializable {
      * @return data
      */
     public static Result success(String msg) {
-        return new Result(CODE_SUCCESS, msg, NOOP, dataTime);
+        return new Result(CODE_SUCCESS, msg, NOOP, LocalDateTime.now());
     }
     /**
      * 处理成功
@@ -76,7 +75,7 @@ public class Result<T> implements Serializable {
      * @return data
      */
     public static Result success(String msg, Object data) {
-        return new Result(CODE_SUCCESS, msg, data, dataTime);
+        return new Result(CODE_SUCCESS, msg, data, LocalDateTime.now());
     }
     /**
      * 处理失败,并返回数据(一般为错误信息)
@@ -86,7 +85,7 @@ public class Result<T> implements Serializable {
      * @return data
      */
     public static Result failure(int code, String msg) {
-        return new Result(code, msg, NOOP , dataTime);
+        return new Result(code, msg, NOOP , LocalDateTime.now());
     }
     /**
      * 处理失败
@@ -98,9 +97,5 @@ public class Result<T> implements Serializable {
         return failure(CODE_FAILURE, msg);
     }
 
-    @Override
-    public String toString() {
-        return "JsonResult [code=" + code + ", msg=" + msg + ", data="
-                + data + ", timestamp="+ dataTime + "]";
-    }
+
 }