Browse Source

元宇宙彩蛋统计页面

sunkean 3 years ago
parent
commit
5888a10290

+ 27 - 0
src/main/java/com/izouma/nineth/dto/MetaBonusSceneDTO.java

@@ -0,0 +1,27 @@
+package com.izouma.nineth.dto;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.Date;
+
+@AllArgsConstructor
+@NoArgsConstructor
+@Data
+public class MetaBonusSceneDTO {
+
+    @ExcelProperty("用户id")
+    @ApiModelProperty("用户id")
+    private Long userId;
+
+    @ExcelProperty("个数")
+    @ApiModelProperty("触发个数")
+    private int num;
+
+    @ExcelProperty("完成时间")
+    @ApiModelProperty("触发时间")
+    private Date createdAt;
+}

+ 14 - 0
src/main/java/com/izouma/nineth/repo/MetaBonusSceneRepo.java

@@ -3,9 +3,12 @@ package com.izouma.nineth.repo;
 import com.izouma.nineth.domain.MetaBonusScene;
 import org.springframework.data.jpa.repository.JpaRepository;
 import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.data.jpa.repository.Modifying;
 import org.springframework.data.jpa.repository.Query;
 
+import javax.transaction.Transactional;
 import java.util.List;
+import java.util.Map;
 
 public interface MetaBonusSceneRepo extends JpaRepository<MetaBonusScene, Long>, JpaSpecificationExecutor<MetaBonusScene> {
 
@@ -15,4 +18,15 @@ public interface MetaBonusSceneRepo extends JpaRepository<MetaBonusScene, Long>,
 
     @Query(nativeQuery = true, value = "select count(*) from (select count(*) num from meta_bonus_scene group by user_id )a where a.num >= 15")
     long countNum();
+
+    @Query("update MetaBonusScene t set t.del = true where t.id = ?1")
+    @Modifying
+    @Transactional
+    void softDelete(Long id);
+
+    @Query(nativeQuery = true, value= "SELECT user_id userId,count(*) num,max( created_at ) createdAt FROM meta_bonus_scene GROUP BY user_id ORDER BY count(*) desc, max( created_at  ) desc limit ?1,?2 ")
+    List<Map<String, String>> findByPage(int start, int end);
+
+    @Query(nativeQuery = true, value = "SELECT count(a.user_id) FROM ( SELECT user_id FROM meta_bonus_scene GROUP BY user_id) a")
+    int totalElements();
 }

+ 32 - 0
src/main/java/com/izouma/nineth/service/MetaBonusSceneService.java

@@ -0,0 +1,32 @@
+package com.izouma.nineth.service;
+
+import com.alibaba.fastjson.JSONArray;
+import com.izouma.nineth.dto.MetaBonusSceneDTO;
+import com.izouma.nineth.dto.PageQuery;
+import com.izouma.nineth.dto.PageWrapper;
+import com.izouma.nineth.repo.MetaBonusSceneRepo;
+import lombok.AllArgsConstructor;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+import java.util.Map;
+
+@Service
+@AllArgsConstructor
+public class MetaBonusSceneService {
+
+    private MetaBonusSceneRepo metaBonusSceneRepo;
+
+    public PageWrapper<MetaBonusSceneDTO> all(PageQuery pageQuery) {
+        int page = pageQuery.getPage();
+        int size = pageQuery.getSize();
+        int start = page * size;
+        List<Map<String, String>> map = metaBonusSceneRepo.findByPage(start, size);
+        JSONArray jsonArray = new JSONArray();
+        jsonArray.addAll(map);
+        List<MetaBonusSceneDTO> metaBonusScenes = jsonArray.toJavaList(MetaBonusSceneDTO.class);
+        int totalElements = metaBonusSceneRepo.totalElements();
+        return new PageWrapper<>(metaBonusScenes, page,
+                size, totalElements);
+    }
+}

+ 14 - 2
src/main/java/com/izouma/nineth/web/MetaBonusSceneController.java

@@ -2,9 +2,13 @@ package com.izouma.nineth.web;
 
 
 import com.izouma.nineth.domain.MetaBonusScene;
+import com.izouma.nineth.dto.MetaBonusSceneDTO;
 import com.izouma.nineth.dto.MetaRestResult;
+import com.izouma.nineth.dto.PageQuery;
 import com.izouma.nineth.repo.MetaBonusSceneRepo;
+import com.izouma.nineth.service.MetaBonusSceneService;
 import lombok.AllArgsConstructor;
+import org.springframework.data.domain.Page;
 import org.springframework.web.bind.annotation.*;
 
 import java.util.List;
@@ -15,6 +19,8 @@ import java.util.Objects;
 @AllArgsConstructor
 public class MetaBonusSceneController {
 
+    private MetaBonusSceneService metaBonusSceneService;
+
     private MetaBonusSceneRepo metaBonusSceneRepo;
 
     @GetMapping("/{userId}/find")
@@ -32,11 +38,11 @@ public class MetaBonusSceneController {
             return MetaRestResult.returnError("参数错误:缺少用户id", false);
         }
         if (!(0 < metaBonusScene.getButton())) {
-            return  MetaRestResult.returnError("参数错误:缺少按钮信息", false);
+            return MetaRestResult.returnError("参数错误:缺少按钮信息", false);
         }
         MetaBonusScene dbMetaBonusScene = metaBonusSceneRepo.findByUserIdAndButton(metaBonusScene.getUserId(), metaBonusScene.getButton());
         if (Objects.nonNull(dbMetaBonusScene)) {
-          return MetaRestResult.returnError("该玩家已经触发过同一个彩蛋,无法多次触发", false);
+            return MetaRestResult.returnError("该玩家已经触发过同一个彩蛋,无法多次触发", false);
         }
         metaBonusSceneRepo.save(metaBonusScene);
         return MetaRestResult.returnSuccess("触发成功", true);
@@ -47,4 +53,10 @@ public class MetaBonusSceneController {
         long num = metaBonusSceneRepo.countNum();
         return MetaRestResult.returnSuccess(Integer.parseInt(String.valueOf(num)));
     }
+
+    //@PreAuthorize("hasRole('ADMIN')")
+    @PostMapping("/all")
+    public Page<MetaBonusSceneDTO> all(@RequestBody PageQuery pageQuery) {
+        return metaBonusSceneService.all(pageQuery).toPage();
+    }
 }

+ 8 - 0
src/main/vue/src/router.js

@@ -1027,6 +1027,14 @@ const router = new Router({
                     meta: {
                        title: '元宇宙内测用户',
                     },
+               },
+               {
+                   path: '/metaBonusSceneList',
+                   name: 'MetaBonusSceneList',
+                   component: () => import(/* webpackChunkName: "metaBonusSceneList" */ '@/views/MetaBonusSceneList.vue'),
+                   meta: {
+                      title: '元宇宙彩蛋',
+                   },
                }
                 /**INSERT_LOCATION**/
             ]

+ 99 - 0
src/main/vue/src/views/MetaBonusSceneList.vue

@@ -0,0 +1,99 @@
+<template>
+	<div class="list-view">
+		<page-title>
+			<el-button
+				@click="download"
+				icon="el-icon-upload2"
+				:loading="downloading"
+				:disabled="fetchingData"
+				class="filter-item"
+			>
+				导出
+			</el-button>
+		</page-title>
+		<el-table
+			:data="tableData"
+			row-key="id"
+			ref="table"
+			header-row-class-name="table-header-row"
+			header-cell-class-name="table-header-cell"
+			row-class-name="table-row"
+			cell-class-name="table-cell"
+			:height="tableHeight"
+			v-loading="fetchingData"
+		>
+			<el-table-column v-if="multipleMode" align="center" type="selection" width="50"> </el-table-column>
+			<el-table-column prop="userId" label="userId"> </el-table-column>
+			<el-table-column prop="num" label="触发彩蛋个数"> </el-table-column>
+			<el-table-column prop="createdAt" label="触发时间"> </el-table-column>
+		</el-table>
+		<div class="pagination-wrapper">
+			<el-pagination
+				background
+				@size-change="onSizeChange"
+				@current-change="onCurrentChange"
+				:current-page="page"
+				:page-sizes="[10, 20, 30, 40, 50]"
+				:page-size="pageSize"
+				layout="total, sizes, prev, pager, next, jumper"
+				:total="totalElements"
+			>
+			</el-pagination>
+		</div>
+	</div>
+</template>
+<script>
+import { mapState } from 'vuex';
+import pageableTable from '@/mixins/pageableTable';
+
+export default {
+	name: 'MetaBonusSceneList',
+	mixins: [pageableTable],
+	data() {
+		return {
+			multipleMode: false,
+			url: '/metaBonusScene/all',
+			downloading: false
+		};
+	},
+	computed: {
+		selection() {
+			return this.$refs.table.selection.map(i => i.id);
+		}
+	},
+	methods: {
+		toggleMultipleMode(multipleMode) {
+			this.multipleMode = multipleMode;
+			if (!multipleMode) {
+				this.$refs.table.clearSelection();
+			}
+		},
+		download() {
+			this.downloading = true;
+			this.$axios
+				.get('/metaBonusScene/excel', {
+					responseType: 'blob',
+					params: { size: 10000 }
+				})
+				.then(res => {
+					console.log(res);
+					this.downloading = false;
+					const downloadUrl = window.URL.createObjectURL(new Blob([res.data]));
+					const link = document.createElement('a');
+					link.href = downloadUrl;
+					link.setAttribute('download', res.headers['content-disposition'].split('filename=')[1]);
+					document.body.appendChild(link);
+					link.click();
+					link.remove();
+				})
+				.catch(e => {
+					console.log(e);
+					this.downloading = false;
+					this.$message.error(e.error);
+				});
+		}
+	}
+};
+</script>
+<style lang="less" scoped>
+</style>