260 lines
8.7 KiB
Java
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;
|
|
}
|
|
|
|
|
|
}
|