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 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> set = null; List list = new ArrayList<>(); if(redisUtil.hasKey(RANKING)){ set = redisUtil.rangeWithScores(RANKING, 0, page); for (ZSetOperations.TypedTuple 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 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 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 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 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; } }