热度排行榜功能

master
duhui 2022-08-04 16:40:27 +08:00
parent 7cacd54d1c
commit e558f4234b
10 changed files with 344 additions and 44 deletions

View File

@ -5,13 +5,15 @@ import com.jmfy.dao.BanFuctionDao;
import com.jmfy.dao.ServerInfoDao;
import com.jmfy.dao.UserInfoDao;
import com.jmfy.model.*;
import com.jmfy.model.vo.HeroHotRankVo;
import com.jmfy.model.vo.RechargeInfo;
import com.jmfy.redisProperties.RedisUserKey;
import com.jmfy.thrift.idl.Result;
import com.jmfy.utils.RPCClient;
import com.jmfy.utils.RedisUtil;
import com.jmfy.utils.*;
import config.SItemConfig;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.data.redis.core.ZSetOperations;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestBody;
@ -38,6 +40,8 @@ public class GmController {
@Resource
private BanFuctionDao banFuctionDao;
private int htmlLikeId = 0;
@RequestMapping(value = "/sendGm", method = {RequestMethod.POST, RequestMethod.GET})
public @ResponseBody
int publishNotice(HttpServletRequest request) throws Exception {
@ -91,14 +95,81 @@ public class GmController {
return 0;
}
public int getHtmlLikeId() {
htmlLikeId++;
if (htmlLikeId >= Integer.MAX_VALUE){
htmlLikeId = 0;
}
return htmlLikeId;
}
private String getHeroHotRankKey(int subRank){
return RedisUserKey.HERO_HOT_RANK + ":" + subRank;
}
/**
*
* subRank: id0
*/
@RequestMapping(value = "/findHeroHotRankInfo", method = {RequestMethod.POST, RequestMethod.GET})
public String findHeroHotRankInfo(ModelMap map, int subRank) {
List<HeroHotRankVo> rankVos = new ArrayList<>();
if (subRank == 0){
for (int i = 1; i < 5; i++) {
Set<ZSetOperations.TypedTuple<String>> tuples = RedisUtil.getInstence().rangeWithScores(getHeroHotRankKey(i), 0, -1);
rankVos.addAll(packHeroHotRank(i,tuples));
}
}else {
Set<ZSetOperations.TypedTuple<String>> tuples = RedisUtil.getInstence().rangeWithScores(getHeroHotRankKey(subRank), 0, -1);
rankVos.addAll(packHeroHotRank(subRank,tuples));
}
map.addAttribute("subRank", subRank);
map.addAttribute("ranks", rankVos);
return "findHeroHotRankInfo";
}
/**
*
* @param subRankId
* @param set
* @return
*/
private List<HeroHotRankVo> packHeroHotRank(int subRankId, Set<ZSetOperations.TypedTuple<String>> set){
ArrayList<HeroHotRankVo> rankVos = new ArrayList<>();
if (set == null || set.isEmpty()){
return rankVos;
}
Map<Integer, SItemConfig> heroMap = FileCacheUtils.itemHeroMap;
for (ZSetOperations.TypedTuple<String> tuple : set) {
HeroHotRankVo rankVo = new HeroHotRankVo();
rankVo.setHtmlLikeId(getHtmlLikeId());
rankVo.setRankId(subRankId);
rankVo.setHeroTid(tuple.getValue());
rankVo.setLikeNum(tuple.getScore());
String name = heroMap.get(Integer.valueOf(tuple.getValue())).getName();
rankVo.setHeroName(name);
rankVos.add(rankVo);
}
return rankVos;
}
@RequestMapping(value = "/updateHeroHotLikeNum", method = {RequestMethod.POST, RequestMethod.GET})
public @ResponseBody
int updateHeroHotLikeNum(HttpServletRequest request) {
HashMap<String, String> parameterMap = JsonUtil.getInstence().getParameterMap(request);
int rankId = Integer.parseInt(parameterMap.get("rankId"));
String heroTid = parameterMap.get("heroTid");
int likeNum = Integer.parseInt(parameterMap.get("likeNum"));
RedisUtil.getInstence().zSet(getHeroHotRankKey(rankId),heroTid,likeNum);
return 1;
}
@RequestMapping(value = "/addhero", method = {RequestMethod.POST, RequestMethod.GET})
public @ResponseBody
int addHero(@RequestBody HeroTemp heroTemp , HttpServletResponse response) throws Exception {
String stringUid = heroTemp.getUserId();
for (String userId:stringUid.split("#")) {
CUserInfo userInfo =null;
@ -338,28 +409,6 @@ public @ResponseBody String banFunction(HttpServletRequest request) throws Excep
out.close();
}
public static void main(String[] args) throws IOException {
String osName = System.getProperty("os.name");
String filePath = "";
Gson gson = new Gson();
if (osName.matches("^(?i)Windows.*$")) {// Window 系统
filePath = "conf/";
} else {// Linux 系统
filePath = "../config/";
}
BufferedReader in = new BufferedReader(new FileReader(filePath+"rank.txt"));
String str;
int i = 568;
while ((str = in.readLine()) != null) {
int value = Integer.valueOf(str);
int i1 = value % 50;
if(i1==16||i1==2||i1==38){
System.out.println(value+" "+i);
}
i--;
}
in.close();
}
static class CPayOrder {
private String orderId;//充值回调中的pOrderId

View File

@ -0,0 +1,75 @@
package com.jmfy.model.vo;
/**
* @Author hj
* @Date 2022/7/25 11:50:37
* @Description:
* @Version 1.0
*/
public class HeroHotRankVo {
private int htmlLikeId;//html用来修改td值的
private String heroTid;//英雄模板id
private String heroName;//英雄名称
private double likeNum;//点赞数
private int rankId;//排行榜id
public int getHtmlLikeId() {
return htmlLikeId;
}
public void setHtmlLikeId(int htmlLikeId) {
this.htmlLikeId = htmlLikeId;
}
public String getHeroTid() {
return heroTid;
}
public void setHeroTid(String heroTid) {
this.heroTid = heroTid;
}
public String getHeroName() {
return heroName;
}
public void setHeroName(String heroName) {
this.heroName = heroName;
}
public double getLikeNum() {
return likeNum;
}
public void setLikeNum(double likeNum) {
this.likeNum = likeNum;
}
public int getRankId() {
return rankId;
}
public void setRankId(int rankId) {
this.rankId = rankId;
}
public String getRankName() {
String rankName = "未查询到";
switch (rankId){
case 1:
rankName = "人气热榜";
break;
case 2:
rankName = "竞技场";
break;
case 3:
rankName = "七界试炼";
break;
case 4:
rankName = "山河社稷";
break;
default: break;
}
return rankName;
}
}

View File

@ -43,11 +43,11 @@ public enum PowersEnum {
ADD_WHITELIST_ACCOUNT(407,"添加白名单账号",400,1,"/html/add_white_list.html"),
DELETE_WHITELIST(408,"删除白名单",400,1,"getAllWhites"),
ADD_WHITELIST_ACCOUNT_HERO(409,"添加白名单账号英雄",400,1,"addHeroPage"),
GUILD_LIST_MANAGER(410,"公会列表管理",400,1,"initGuildList"),
GUILD_OPERATE_PERMISSIONS(411,"权限: 操作公会",400,1,""),
USER_INFO_QUERY1(412,"角色神将查询",400,1,"toGetHeroInfoPage"),
SEND_MAILS(413,"发送txt里的邮件",400,1,"toSendMailInfoPage"),
HERO_HOT_RANK(414, "英雄热度排行榜管理", 400,1,"findHeroHotRankInfo?subRank=0"),
// 流水日志管理500-599
BILL_LOG(500,"流水日志管理",500,1,""),
@ -102,16 +102,13 @@ public enum PowersEnum {
PACKAGE_NAME_MANAGER(1401,"频道管理(公告用)",1400,1,"packageInfoList"),
ADD_PACKAGE_NAME(1402,"权限: 添加频道",1400,0,""),
DELETE_PACKAGE_NAME(1403,"权限: 删除频道",1400,0,""),
CHANNEL_NAME_MANAGER(1404,"渠道管理",1400,1,"channelInfoList"),
ADD_CHANNEL_PERMISSIONS(1405,"权限: 添加渠道",1400,0,""),
DELETE_CHANNEL_PERMISSIONS(1406,"权限: 删除渠道",1400,0,""),
UPDATE_CHANNEL_PERMISSIONS(1410,"权限: 修改渠道",1400,0,""),
HAND_IN_MANAGER(1407,"提审服管理",1400,1,"tishenInfoList"),
UPDATE_CHANNEL_PERMISSIONS(1407,"权限: 修改渠道",1400,0,""),
GAME_AGREEMENT_MANAGER(1408,"游戏协议管理",1400,1,"gameAgreementList"),
ADD_GAME_AGREEMENT_PERMISSIONS(1409,"权限: 操作游戏协议(增,删,改)",1400,0,""),
HAND_IN_MANAGER(1410,"提审服管理",1400,1,"tishenInfoList"),
HEFU(1500,"合服",1500,1,""),
HEFU_MANAGER(1501,"合服",1500,1,"/html/hefu.html"),

View File

@ -37,6 +37,11 @@ public class RedisUserKey {
public static final String CROSS_SERVER_GROUP = "CROSS_SERVER_GROUP";//gm跨服分组每周一重新分组生效
public static final String SERVER_STATE = "SERVER_STATE";//服务器状态
public final static String HERO_HOT_RANK = "HERO_HOT_RANK"; // 英雄热度排行榜
public static final String USER_LIKE_HERO_HOT_RANK = "USER_LIKE_HERO_HOT_RANK"; //玩家给点击过的英雄
/**
* 线 updata/min
*/

View File

@ -11,9 +11,10 @@ public class FileCacheUtils {
private static String path = "";
public static Map<Integer,String> itemNameMap ;
public static Map<Integer,SItemConfig> itemMap ;
public static Map<Integer,String> itemFlowResson ;
public static Map<Integer,String> itemNameMap;
public static Map<Integer,SItemConfig> itemMap;
public static Map<Integer,SItemConfig> itemHeroMap;
public static Map<Integer,String> itemFlowResson;
public static Map<Integer,SRechargeCommodityConfig> rechargeMap;
public static void initData(){
@ -28,7 +29,8 @@ public class FileCacheUtils {
itemFlowResson = readFile("Reason.txt");
// 道具
itemMap = getConfig(SItemConfig.class);
itemNameMap = SItemConfig.toMap();
itemNameMap = SItemConfig.toNameMap();
itemHeroMap = SItemConfig.toHeroMap();
System.out.printf("道具表长度,{%s}\n",itemNameMap.size());
// 礼包
rechargeMap = getConfig(SRechargeCommodityConfig.class);

View File

@ -322,16 +322,15 @@ public class RedisUtil {
return null;
}
public static void sleep(long millis) {
private static void sleep(long millis) {
try {
Thread.sleep(millis);
} catch (Exception e) {
LOGGER.error("sleep->msg=null", e.getMessage(), e);
LOGGER.error("sleep->msg=null,{}", e.getMessage(), e);
}
}
public Set<ZSetOperations.TypedTuple<String>> getZsetreverseRangeWithScores(String key, long start, long end) {
public Set<ZSetOperations.TypedTuple<String>> rangeWithScores(String key, long start, long end) {
for (int i = 0; i < MAX_TRY_TIMES; i++) {
try {
return redisObjectTemplate.opsForZSet().reverseRangeWithScores(key, start, end);
@ -342,6 +341,17 @@ public class RedisUtil {
return null;
}
public void zSet(String key, String element, double score){
for (int i = 0; i < MAX_TRY_TIMES; i++) {
try {
redisObjectTemplate.opsForZSet().add(key, element, score);
return;
} catch (Exception e) {
sleep(FAILED_SLEEP);
}
}
}
public List<String> lGet(String key, long start, long end) {
try {
return redisObjectTemplate.opsForList().range(key, start, end);

View File

@ -33,12 +33,18 @@ public class SItemConfig {
private int[][] extraReward;
private int recycle;
public static Map<Integer,String> toMap(){
public static Map<Integer,String> toNameMap(){
Map<Integer,String> toMap = new HashMap<>();
FileCacheUtils.itemMap.values().forEach(v-> toMap.put(v.getId(),v.getName()));
return toMap;
}
public static Map<Integer,SItemConfig> toHeroMap(){
Map<Integer,SItemConfig> map = new HashMap<>();
FileCacheUtils.itemMap.values().stream().filter(v->v.getItemType() == 1).forEach(v->map.put(v.getId(),v));
return map;
}
public int getId() {
return id;
}

View File

@ -0,0 +1,149 @@
<!DOCTYPE HTML>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="utf-8"/>
<meta name="renderer" content="webkit|ie-comp|ie-stand"/>
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"/>
<meta name="viewport"
content="width=device-width,initial-scale=1,minimum-scale=1.0,maximum-scale=1.0,user-scalable=no"/>
<meta http-equiv="Cache-Control" content="no-siteapp"/>
<script type="text/javascript" src="lib/html5shiv.js"></script>
<script type="text/javascript" src="lib/respond.min.js"></script>
<!-- <![endif]&ndash;&gt;-->
<link rel="stylesheet" type="text/css" href="h-ui/css/H-ui.min.css"/>
<link rel="stylesheet" type="text/css" href="h-ui.admin/css/H-ui.admin.css"/>
<link rel="stylesheet" type="text/css" href="lib/Hui-iconfont/1.0.8/iconfont.css"/>
<link rel="stylesheet" type="text/css" href="h-ui.admin/skin/default/skin.css" id="skin"/>
<link rel="stylesheet" type="text/css" href="h-ui.admin/css/style.css"/>
<!-- 多选框 -->
<link href="../static/searchableSelect/css/jquery.searchableSelect.css" rel="stylesheet" type="text/css">
<link rel="stylesheet" type="text/css" href="https://apps.bdimg.com/libs/bootstrap/3.3.4/css/bootstrap.css">
<link href="../static/bootstrap/css/bootstrap-select.css" rel="stylesheet">
<script type="text/javascript" src="lib/DD_belatedPNG_0.0.8a-min.js"></script>
<script>DD_belatedPNG.fix('*');</script>
<title>服务器列表信息</title>
</head>
<body>
<nav class="breadcrumb" style="padding-bottom: 45px;">
<i class="Hui-iconfont">&#xe67f;</i> 首页
<span class="c-gray en">&gt;</span> GM管理
<span class="c-gray en">&gt;</span> 英雄热度排行榜
<a class="btn btn-success radius r" style="margin-top:3px;padding-bottom: 3px;"
href="javascript:location.replace('/findHeroHotRankInfo?subRank=0');" title="刷新">
<i class="Hui-iconfont">&#xe68f;</i>
</a>
</nav>
<div class="page-container" style="text-align: center">
<h2><span style="color:red;">英雄热度排行榜</span></h2>
<div class="text-c">
<div style="text-align: left;">
<select name="subRank" class="input-text" id="subRank" title="排行榜名称" style="width: 150px;"><!--下拉列表-->
<option value="0">全部</option>
<option value="1">人气热榜</option>
<option value="2">竞技场</option>
<option value="3">七界试炼</option>
<option value="4">山河社稷</option>
</select>
<button class="btn btn-primary" type="button" onclick="findRank()">查询</button>
</div>
<div class="mt-20">
<table class="table table-border table-bordered table-bg table-hover table-sort table-responsive">
<thead>
<tr class="text-c" >
<th width="200">英雄ID</th>
<th width="200">英雄</th>
<th width="200">点赞数</th>
<th width="200">排行榜</th>
<th width="200">操作</th>
</tr>
</thead>
<tbody>
<tr th:each="obj:${ranks}">
<td th:text="${obj.getHeroTid()}" style="text-align: center;"></td>
<td th:text="${obj.getHeroName()}" style="text-align: center;"></td>
<td th:id="'like'+${obj.getHtmlLikeId()}" th:text="${obj.getLikeNum()}" style="text-align: center;"></td>
<td th:text="${obj.getRankName()}" style="text-align: center;"></td>
<td class="td-manage" style="text-align: center;">
<a href="#" class="btn btn-primary radius" th:attr="id='like'+${obj.getHtmlLikeId()},rankId=${obj.getRankId()},heroTid=${obj.getHeroTid()}"
onclick="return updateLikeNum(this)">
<i class="Hui-iconfont"></i> 修改
</a>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<!--_footer 作为公共模版分离出去-->
<script type="text/javascript" src="lib/jquery/1.9.1/jquery.min.js"></script>
<script type="text/javascript" src="lib/layer/2.4/layer.js"></script>
<script type="text/javascript" src="h-ui/js/H-ui.min.js"></script>
<script type="text/javascript" src="h-ui.admin/js/H-ui.admin.js"></script>
<!--请在下方写此页面业务相关的脚本-->
<script type="text/javascript" src="lib/My97DatePicker/4.8/WdatePicker.js"></script>
<script type="text/javascript" src="lib/datatables/1.10.0/jquery.dataTables.min.js"></script>
<script type="text/javascript" src="lib/laypage/1.2/laypage.js"></script>
<!-- 多选框 -->
<script src="../static/bootstrap/js/bootstrap-select.js"></script>
<script type="text/javascript" src="../static/searchableSelect/js/jquery.searchableSelect.js"></script>
<script src="../static/searchableSelect/js/initBootstrap.js"></script>
<script type="text/javascript">
$('.table-sort').dataTable({
"aaSorting": [[0, "desc"]],//默认第几个排序
"bStateSave": true,//状态保存
"pading": false,
"aoColumnDefs": [
{"orderable": false, "aTargets": [4]}// 不参与排序的列
]
});
// 删除服务器列表
function updateLikeNum(obj) {
var likeId = $(obj).attr("id");
var rankId = $(obj).attr("rankId");
var heroTid = $(obj).attr("heroTid");
var likeNum = window.prompt("请输入数字:");
var regPos = /(^[1-9]\d*$)/; //判断是否是数字。
if (!regPos.test(likeNum)){
alert("输入内容包含字符,操作失败!");
return false;
}
if (likeNum >= 2147483647) {
alert("输入数字太大,操作失败!");
return false;
}
$.ajax({
type: "POST",
data: {
"rankId" : rankId,
"heroTid" : heroTid,
"likeNum" : likeNum
},
url: "/updateHeroHotLikeNum",
success: function (data) {
if (data === 1) {
alert("操作成功");
document.getElementById(likeId).innerText = likeNum;
}
if (data === 0) {
alert("操作失败");
}
}
})
}
// 查询排行榜信息
function findRank() {
var subRank = $("#subRank").val().toString();
window.location = "/findHeroHotRankInfo?subRank=" + subRank;
}
</script>
</body>
</html>

View File

@ -261,7 +261,7 @@
type: "POST",
data: {
"serverId" : serverId,
"status": status2,
"status": status2
},
url: "/serverListEdit",
success: function (data) {

View File

@ -27,7 +27,14 @@
</div>
<div style="margin-left: 20px;font-size: 18px">
<div>
<h2 style="color: red" class="f-36">更新日志[2022-7-13]</h2>
<h2 style="color: red" class="f-36">更新日志[2022-7-27]</h2>
<p class="f-14" style="line-height:32px;">
1、“GM管理”标签下添加“英雄热度排行榜”页面用来查看或修改游戏内英雄热度排行榜的数据<br>
2、“英雄热度排行榜”支持分排行榜类型查询每次刷新默认查询全部榜单<br>
3、点赞数修改(数字必须为正整数并且不超过int最大值)<br>
</p>
<h2 style="color: red" class="f-18">更新日志[2022-7-13]</h2>
<p class="f-14" style="line-height:32px;">
1、“服务器管理”标签下添加“批量修改服务器信息”页面用来做服务器的批量修改包含全部状态服务器<br>
2、“服务器信息”界面的 批量修改跨服id输入框 移动到 “批量修改服务器信息” 界面下,修改服务器状态选择框还在原位<br>