pars-h5-2021/src/main/java/com/szxgl/pars2021/controller/RankingController.java
2021-11-16 09:30:12 +08:00

260 lines
8.7 KiB
Java

package com.szxgl.pars2021.controller;
import com.szxgl.pars2021.entity.UserDO;
import com.szxgl.pars2021.entity.UserWorks;
import com.szxgl.pars2021.entity.WorksDao;
import com.szxgl.pars2021.service.PraiseService;
import com.szxgl.pars2021.service.UserService;
import com.szxgl.pars2021.service.WorksService;
import com.szxgl.pars2021.utils.R;
import com.szxgl.pars2021.utils.RedisUtil;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.data.redis.core.ZSetOperations;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import java.security.SecureRandom;
import java.util.*;
/**
* 排行榜
*/
@RestController
@RequestMapping("/ranking")
@Slf4j
public class RankingController {
@Value("${spring.profiles.active}")
private String activeProfiles;
@Autowired
private RedisUtil redisUtil;
@Autowired
private UserService userService;
@Autowired
private PraiseService praiseService;
@Autowired
private WorksService worksService;
//redis中作品排序的key
private static final String RANKING = "RANKING";
@Autowired
private static final String USERINFO = "userInfo";
//Bucket 域名
@Value("${oss.bucketDomain}")
private String bucketDomain;
/**
* 排行榜列表
* @param page 分页数
* @return
*/
@GetMapping("/getWorksPraiseNo")
public R getWorksPraiseNo(Integer page, HttpServletRequest request){
String openid = getValue(request.getCookies(), "openid");
if("prod".equals(activeProfiles) && StringUtils.isBlank(openid)){
log.error("openid为空,请求参数");
return R.error("openid不能为空");
}
//排行榜最多显示30个数据 一页显示8个数据
if(page > 4 ){
page = 30;
}else if(page == 4){
page = page * 8 - 2;
}else {
page = page*(8-1);
}
List<UserDO> userDOS = userService.getUserList();
for (UserDO userDO : userDOS) {
//判断redis中的用户信息是否已过期
if(!redisUtil.hasKey(userDO.getOpenid())){
//已过期 更新用户信息到redis中
userService.getUserWorks(userDO.getOpenid());
}
}
//查询该用户是否上传过作品
UserWorks userWorks1 = userService.getUserWorks(openid);
UserWorks userWork = null;
if(userWorks1 != null){
//获取自己当前排行
userWork = (UserWorks) redisUtil.get(USERINFO + openid);
Long aLong1 = redisUtil.reverseRank(RANKING, openid);
if(aLong1 != null){
userWork.setRank(aLong1+1);
}
//用户点赞数
int i = redisUtil.score(RANKING, openid).intValue();
userWork.setPraiseno(i);
//获取用户当天排行榜的点赞状态
Integer praiseId = praiseService.getPraiseStatus(openid,userWork.getId());
userWork.setPraiseStatus(praiseId);
}
Set<ZSetOperations.TypedTuple<Object>> set = null;
List<UserWorks> list = new ArrayList<>();
if(redisUtil.hasKey(RANKING)){
set = redisUtil.rangeWithScores(RANKING, 0, page);
for (ZSetOperations.TypedTuple<Object> objectTypedTuple : set) {
Long aLong = redisUtil.reverseRank(RANKING, objectTypedTuple.getValue());
//redis获取用户信息
UserWorks userWorks = (UserWorks)redisUtil.get(USERINFO + objectTypedTuple.getValue());
String url = userWorks.getUrl();
//oss的文件路径 oss服务器默认域名+文件路径
url = bucketDomain + "/" +url;
userWorks.setUrl(url);
//获取点赞数
userWorks.setPraiseno(Objects.requireNonNull(objectTypedTuple.getScore()).intValue());
System.out.println(Integer.getInteger(Objects.requireNonNull(objectTypedTuple.getScore()).toString()));
//返回索引值+1 = 排序值
userWorks.setRank(aLong+1);
//获取用户当天排行榜的点赞状态
Integer result = praiseService.getPraiseStatus(Objects.requireNonNull(objectTypedTuple.getValue()).toString(),userWorks.getId());
userWorks.setPraiseStatus(result);
list.add(userWorks);
}
}
//list按分数升序
list.sort(Comparator.comparing(UserWorks::getRank));
HashMap<String, Object> map = new HashMap<>();
map.put("data",list);
map.put("userWork",userWork);
return R.ok(map);
}
/**
* 海报生成页面
* @param request
* @return
*/
@GetMapping("/getUserRank")
public R getUserRank(HttpServletRequest request){
String openid = getValue(request.getCookies(), "openid");
if("prod".equals(activeProfiles) && StringUtils.isBlank(openid)){
log.error("openid为空,请求参数");
return R.error("openid不能为空");
}
HashMap<String, Object> map = new HashMap<>();
UserWorks userWorks = userService.getUserWorks(openid);
if(userWorks!=null){
Long aLong = redisUtil.reverseRank(RANKING, openid);
//返回索引值+1 = 排序值
map.put("rank",aLong+1);
map.put("nickname",userWorks.getNickname());
}
return R.ok(map);
}
/**
* 获取超能力排行榜
* @param request
* @param worksId
* @return
*/
@GetMapping("/getUserRanking")
public R getUserRanking(HttpServletRequest request,Integer worksId){
String openid = getValue(request.getCookies(), "openid");
if("prod".equals(activeProfiles) && StringUtils.isBlank(openid)){
log.error("openid为空,请求参数");
return R.error("openid不能为空");
}
//根据作品获取用户openid
String openid2 = userService.getWorksUser(worksId);
//获取用户作品信息
UserWorks userWorks = userService.getUserWorks(openid2);
if(redisUtil.hasKey(RANKING)){
Long aLong = redisUtil.reverseRank(RANKING, openid2);
//作品的名次
userWorks.setRank(aLong+1);
int i = redisUtil.score(RANKING, openid2).intValue();
userWorks.setPraiseno(i);
}
//获取用户当天排行榜的点赞状态
Integer praiseId = praiseService.getPraiseStatus(openid,worksId);
userWorks.setPraiseStatus(praiseId);
HashMap<String, Object> map = new HashMap<>();
//用户是否上传过作品
WorksDao works = worksService.getWorks(openid);
if(works == null){
//未上传作品
map.put("result",false);
}else {
//已上传作品
map.put("result",true);
}
map.put("data",userWorks);
return R.ok(map);
}
/**
* 获取h5页面展示随机数
* @return
*/
@GetMapping("/getRandom")
public R getRandom(HttpServletRequest request){
String openid = getValue(request.getCookies(), "openid");
if("prod".equals(activeProfiles) && StringUtils.isBlank(openid)){
log.error("openid为空,请求参数");
return R.error("openid不能为空");
}
//获取作品id
UserWorks userWorks = (UserWorks) redisUtil.get(USERINFO + openid);
if(userWorks == null){
userWorks = userService.getUserWorks(openid);
}
int max=98;
int min=94;
int i = new SecureRandom().nextInt(max) % (max - min + 1) + min;
HashMap<String, Object> map = new HashMap<>();
if(userWorks!=null){
//用户未上传作品
map.put("worksId",userWorks.getId());
}else {
map.put("worksId",null);
}
map.put("data",i);
return R.ok(map);
}
/**
* 获取cookie
* @param cookies
* @param key
* @return
*/
protected String getValue(Cookie[] cookies, String key) {
String value = null;
if (null != cookies && cookies.length > 0) {
for (Cookie c : cookies) {
if (key.equals(c.getName())) {
value = c.getValue();
break;
}
}
}
return value;
}
}