Compare commits
5 Commits
a97334d166
...
master
| Author | SHA1 | Date | |
|---|---|---|---|
| d5509858d6 | |||
| c1e811f30b | |||
| bbe4c2852e | |||
| f87e887680 | |||
| 8c18204ccd |
@@ -1,15 +1,16 @@
|
|||||||
package com.szxgl.vote2021;
|
package com.szxgl.pars2021;
|
||||||
|
|
||||||
import org.mybatis.spring.annotation.MapperScan;
|
import org.mybatis.spring.annotation.MapperScan;
|
||||||
import org.springframework.boot.SpringApplication;
|
import org.springframework.boot.SpringApplication;
|
||||||
import org.springframework.boot.autoconfigure.SpringBootApplication;
|
import org.springframework.boot.autoconfigure.SpringBootApplication;
|
||||||
|
|
||||||
@SpringBootApplication
|
@SpringBootApplication
|
||||||
@MapperScan("com.szxgl.vote2021.mapper")
|
@MapperScan("com.szxgl.pars2021.mapper")
|
||||||
public class H52021Application {
|
public class H52021Application {
|
||||||
|
|
||||||
public static void main(String[] args) {
|
public static void main(String[] args) {
|
||||||
SpringApplication.run(H52021Application.class, args);
|
SpringApplication.run(H52021Application.class, args);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
package com.szxgl.vote2021;
|
package com.szxgl.pars2021;
|
||||||
|
|
||||||
import org.springframework.boot.builder.SpringApplicationBuilder;
|
import org.springframework.boot.builder.SpringApplicationBuilder;
|
||||||
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
|
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
|
||||||
31
src/main/java/com/szxgl/pars2021/config/CorsConfig.java
Normal file
31
src/main/java/com/szxgl/pars2021/config/CorsConfig.java
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
package com.szxgl.pars2021.config;
|
||||||
|
|
||||||
|
import org.springframework.context.annotation.Bean;
|
||||||
|
import org.springframework.context.annotation.Configuration;
|
||||||
|
import org.springframework.web.cors.CorsConfiguration;
|
||||||
|
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
|
||||||
|
import org.springframework.web.filter.CorsFilter;
|
||||||
|
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
|
||||||
|
|
||||||
|
import java.util.Collections;
|
||||||
|
|
||||||
|
/*@Configuration
|
||||||
|
public class CorsConfig implements WebMvcConfigurer {
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
public CorsFilter corsFilter() {
|
||||||
|
CorsConfiguration corsConfiguration = new CorsConfiguration();
|
||||||
|
//1,允许任何来源
|
||||||
|
corsConfiguration.setAllowedOriginPatterns(Collections.singletonList("*"));
|
||||||
|
//2,允许任何请求头
|
||||||
|
corsConfiguration.addAllowedHeader(CorsConfiguration.ALL);
|
||||||
|
//3,允许任何方法
|
||||||
|
corsConfiguration.addAllowedMethod(CorsConfiguration.ALL);
|
||||||
|
//4,允许凭证
|
||||||
|
corsConfiguration.setAllowCredentials(true);
|
||||||
|
|
||||||
|
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
|
||||||
|
source.registerCorsConfiguration("/**", corsConfiguration);
|
||||||
|
return new CorsFilter(source);
|
||||||
|
}
|
||||||
|
}*/
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
package com.szxgl.vote2021.config;
|
package com.szxgl.pars2021.config;
|
||||||
|
|
||||||
import org.springframework.beans.factory.annotation.Value;
|
import org.springframework.beans.factory.annotation.Value;
|
||||||
import org.springframework.boot.context.properties.ConfigurationProperties;
|
import org.springframework.boot.context.properties.ConfigurationProperties;
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
package com.szxgl.vote2021.config;
|
package com.szxgl.pars2021.config;
|
||||||
|
|
||||||
import com.fasterxml.jackson.annotation.JsonAutoDetect;
|
import com.fasterxml.jackson.annotation.JsonAutoDetect;
|
||||||
import com.fasterxml.jackson.annotation.PropertyAccessor;
|
import com.fasterxml.jackson.annotation.PropertyAccessor;
|
||||||
@@ -1,11 +1,10 @@
|
|||||||
package com.szxgl.vote2021.controller;
|
package com.szxgl.pars2021.controller;
|
||||||
|
|
||||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||||
import com.szxgl.vote2021.entity.PraiseDao;
|
import com.szxgl.pars2021.entity.WorksDao;
|
||||||
import com.szxgl.vote2021.entity.WorksDao;
|
import com.szxgl.pars2021.mapper.WorksMapper;
|
||||||
import com.szxgl.vote2021.mapper.WorksMapper;
|
import com.szxgl.pars2021.service.PraiseService;
|
||||||
import com.szxgl.vote2021.service.PraiseService;
|
import com.szxgl.pars2021.utils.R;
|
||||||
import com.szxgl.vote2021.utils.R;
|
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.apache.commons.lang3.StringUtils;
|
import org.apache.commons.lang3.StringUtils;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
@@ -16,7 +15,6 @@ import org.springframework.web.bind.annotation.RestController;
|
|||||||
|
|
||||||
import javax.servlet.http.Cookie;
|
import javax.servlet.http.Cookie;
|
||||||
import javax.servlet.http.HttpServletRequest;
|
import javax.servlet.http.HttpServletRequest;
|
||||||
import java.util.Date;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 点赞
|
* 点赞
|
||||||
@@ -50,14 +48,14 @@ public class PraiseController {
|
|||||||
return R.error("openid不能为空");
|
return R.error("openid不能为空");
|
||||||
}
|
}
|
||||||
if(worksId == null){
|
if(worksId == null){
|
||||||
log.info("作品id不能为空!");
|
log.error("作品id不能为空!");
|
||||||
return R.error("作品id不能为空!");
|
return R.error("作品id不能为空!");
|
||||||
}
|
}
|
||||||
QueryWrapper<WorksDao> queryWrapper = new QueryWrapper<>();
|
QueryWrapper<WorksDao> queryWrapper = new QueryWrapper<>();
|
||||||
queryWrapper.eq("id",worksId);
|
queryWrapper.eq("id",worksId);
|
||||||
WorksDao worksDao = worksMapper.selectOne(queryWrapper);
|
WorksDao worksDao = worksMapper.selectOne(queryWrapper);
|
||||||
if(worksDao == null){
|
if(worksDao == null){
|
||||||
log.info("作品不存在!");
|
log.error("作品不存在!");
|
||||||
return R.error("作品不存在!");
|
return R.error("作品不存在!");
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -66,11 +64,6 @@ public class PraiseController {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// @PostMapping("/saveSharePraise")
|
|
||||||
// public R saveSharePraise(HttpServletRequest request){
|
|
||||||
//
|
|
||||||
// }
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获取cookie
|
* 获取cookie
|
||||||
* @param cookies
|
* @param cookies
|
||||||
@@ -1,15 +1,13 @@
|
|||||||
package com.szxgl.vote2021.controller;
|
package com.szxgl.pars2021.controller;
|
||||||
|
|
||||||
import com.szxgl.vote2021.entity.UserDO;
|
import com.szxgl.pars2021.entity.UserDO;
|
||||||
import com.szxgl.vote2021.entity.UserWorks;
|
import com.szxgl.pars2021.entity.UserWorks;
|
||||||
import com.szxgl.vote2021.entity.WorksDao;
|
import com.szxgl.pars2021.entity.WorksDao;
|
||||||
import com.szxgl.vote2021.mapper.WorksMapper;
|
import com.szxgl.pars2021.service.PraiseService;
|
||||||
import com.szxgl.vote2021.service.PraiseService;
|
import com.szxgl.pars2021.service.UserService;
|
||||||
import com.szxgl.vote2021.service.RankingService;
|
import com.szxgl.pars2021.service.WorksService;
|
||||||
import com.szxgl.vote2021.service.UserService;
|
import com.szxgl.pars2021.utils.R;
|
||||||
import com.szxgl.vote2021.service.WorksService;
|
import com.szxgl.pars2021.utils.RedisUtil;
|
||||||
import com.szxgl.vote2021.utils.R;
|
|
||||||
import com.szxgl.vote2021.utils.RedisUtil;
|
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.apache.commons.lang3.StringUtils;
|
import org.apache.commons.lang3.StringUtils;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
@@ -48,10 +46,11 @@ public class RankingController {
|
|||||||
private WorksService worksService;
|
private WorksService worksService;
|
||||||
|
|
||||||
//redis中作品排序的key
|
//redis中作品排序的key
|
||||||
private static final String RANKING = "RANKING";
|
private static final String RANKING = "2021_pars_h5:sort:RANKING";
|
||||||
|
|
||||||
|
//redis中用户作品的key userInfo + openid
|
||||||
@Autowired
|
@Autowired
|
||||||
private static final String USERINFO = "userInfo";
|
private static final String USERINFO = "2021_pars_h5:userInfo:user";
|
||||||
|
|
||||||
//Bucket 域名
|
//Bucket 域名
|
||||||
@Value("${oss.bucketDomain}")
|
@Value("${oss.bucketDomain}")
|
||||||
@@ -61,24 +60,15 @@ public class RankingController {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* 排行榜列表
|
* 排行榜列表
|
||||||
* @param page 分页数
|
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
@GetMapping("/getWorksPraiseNo")
|
@GetMapping("/getWorksPraiseNo")
|
||||||
public R getWorksPraiseNo(Integer page, HttpServletRequest request){
|
public R getWorksPraiseNo(HttpServletRequest request){
|
||||||
String openid = getValue(request.getCookies(), "openid");
|
String openid = getValue(request.getCookies(), "openid");
|
||||||
if("prod".equals(activeProfiles) && StringUtils.isBlank(openid)){
|
if("prod".equals(activeProfiles) && StringUtils.isBlank(openid)){
|
||||||
log.error("openid为空,请求参数");
|
log.error("openid为空,请求参数");
|
||||||
return R.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();
|
List<UserDO> userDOS = userService.getUserList();
|
||||||
for (UserDO userDO : userDOS) {
|
for (UserDO userDO : userDOS) {
|
||||||
@@ -93,48 +83,95 @@ public class RankingController {
|
|||||||
UserWorks userWorks1 = userService.getUserWorks(openid);
|
UserWorks userWorks1 = userService.getUserWorks(openid);
|
||||||
UserWorks userWork = null;
|
UserWorks userWork = null;
|
||||||
if(userWorks1 != null){
|
if(userWorks1 != null){
|
||||||
//获取自己当前排行
|
if(redisUtil.hasKey(RANKING)){
|
||||||
userWork = (UserWorks) redisUtil.get(USERINFO + openid);
|
//获取自己当前排行
|
||||||
Long aLong1 = redisUtil.reverseRank(RANKING, openid);
|
userWork = (UserWorks) redisUtil.get(USERINFO + openid);
|
||||||
if(aLong1 != null){
|
Long aLong1 = redisUtil.reverseRank(RANKING, openid);
|
||||||
userWork.setRank(aLong1+1);
|
if(aLong1 != null){
|
||||||
|
userWork.setRank(aLong1+1);
|
||||||
|
}
|
||||||
|
String url = userWork.getUrl();
|
||||||
|
//oss的文件路径 oss服务器默认域名+文件路径
|
||||||
|
url = bucketDomain + "/" +url;
|
||||||
|
userWork.setUrl(url);
|
||||||
|
//用户点赞数
|
||||||
|
int i = redisUtil.score(RANKING, openid).intValue();
|
||||||
|
userWork.setPraiseno(i);
|
||||||
}
|
}
|
||||||
//用户点赞数
|
|
||||||
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;
|
Set<ZSetOperations.TypedTuple<Object>> set = null;
|
||||||
List<UserWorks> list = new ArrayList<>();
|
List<UserWorks> list = new ArrayList<>();
|
||||||
if(redisUtil.hasKey(RANKING)){
|
if(redisUtil.hasKey(RANKING)){
|
||||||
set = redisUtil.rangeWithScores(RANKING, 0, page);
|
set = redisUtil.rangeWithScores(RANKING, 0, -1);
|
||||||
for (ZSetOperations.TypedTuple<Object> objectTypedTuple : set) {
|
for (ZSetOperations.TypedTuple<Object> objectTypedTuple : set) {
|
||||||
Long aLong = redisUtil.reverseRank(RANKING, objectTypedTuple.getValue());
|
Long aLong = redisUtil.reverseRank(RANKING, objectTypedTuple.getValue());
|
||||||
//redis获取用户信息
|
//判断redis中是否有用户信息
|
||||||
UserWorks userWorks = (UserWorks)redisUtil.get(USERINFO + objectTypedTuple.getValue());
|
if(redisUtil.hasKey(USERINFO+objectTypedTuple.getValue())){
|
||||||
String url = userWorks.getUrl();
|
//redis获取用户信息
|
||||||
//oss的文件路径 oss服务器默认域名+文件路径
|
UserWorks userWorks = (UserWorks)redisUtil.get(USERINFO + objectTypedTuple.getValue());
|
||||||
url = bucketDomain + "/" +url;
|
String url = userWorks.getUrl();
|
||||||
userWorks.setUrl(url);
|
//oss的文件路径 oss服务器默认域名+文件路径
|
||||||
//获取点赞数
|
url = bucketDomain + "/" +url;
|
||||||
userWorks.setPraiseno(Objects.requireNonNull(objectTypedTuple.getScore()).intValue());
|
userWorks.setUrl(url);
|
||||||
System.out.println(Integer.getInteger(Objects.requireNonNull(objectTypedTuple.getScore()).toString()));
|
//获取点赞数
|
||||||
//返回索引值+1 = 排序值
|
userWorks.setPraiseno(Objects.requireNonNull(objectTypedTuple.getScore()).intValue());
|
||||||
userWorks.setRank(aLong+1);
|
System.out.println(Integer.getInteger(Objects.requireNonNull(objectTypedTuple.getScore()).toString()));
|
||||||
//获取用户当天排行榜的点赞状态
|
//返回索引值+1 = 排序值
|
||||||
Integer result = praiseService.getPraiseStatus(Objects.requireNonNull(objectTypedTuple.getValue()).toString(),userWorks.getId());
|
userWorks.setRank(aLong+1);
|
||||||
userWorks.setPraiseStatus(result);
|
list.add(userWorks);
|
||||||
list.add(userWorks);
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
//list按分数升序
|
//list按分数升序
|
||||||
list.sort(Comparator.comparing(UserWorks::getRank));
|
list.sort(Comparator.comparing(UserWorks::getRank));
|
||||||
|
if(list.size() > 30){
|
||||||
|
list = list.subList(0,30);
|
||||||
|
}
|
||||||
|
//返回排行榜滚动信息
|
||||||
|
List<UserWorks> list2 = new ArrayList<>();
|
||||||
|
//获取所有排行榜用户信息
|
||||||
|
set = redisUtil.rangeWithScores(RANKING, 0, -1);
|
||||||
|
for (ZSetOperations.TypedTuple<Object> objectTypedTuple : set) {
|
||||||
|
Long aLong = redisUtil.reverseRank(RANKING, objectTypedTuple.getValue());
|
||||||
|
//判断redis中是否有用户信息
|
||||||
|
if(redisUtil.hasKey(USERINFO+objectTypedTuple.getValue())){
|
||||||
|
//redis获取用户信息
|
||||||
|
UserWorks userWorks = (UserWorks)redisUtil.get(USERINFO + objectTypedTuple.getValue());
|
||||||
|
userWorks.setRank(aLong+1);
|
||||||
|
list2.add(userWorks);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
List<Object> newList = new ArrayList<>();
|
||||||
|
Map<Integer,String> hashMap = new HashMap<>();
|
||||||
|
int size = 0;
|
||||||
|
//用户数量大于8 随机返回的排行榜用户名称不包括前8名
|
||||||
|
if(list2.size() > 8 ){
|
||||||
|
size = list2.subList(8, list2.size()).size();
|
||||||
|
size = size < 8 ? size : 8;
|
||||||
|
list2.sort(Comparator.comparing(UserWorks::getRank));
|
||||||
|
while (hashMap.size() < size) {
|
||||||
|
//筛选用户信息 排除前8位
|
||||||
|
List<UserWorks> list1 = list2.subList(8, list2.size());
|
||||||
|
int random = (int)(Math.random() * list1.size());
|
||||||
|
if (!hashMap.containsKey(random)) {
|
||||||
|
hashMap.put(random, "");
|
||||||
|
newList.add(list1.get(random).getNickname());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}else if(list2.size() > 1){
|
||||||
|
//用户数量小于8 第1名不显示,其他正常显示
|
||||||
|
List<UserWorks> nickname = list2.subList(1, list2.size());
|
||||||
|
for (UserWorks userWorks : nickname) {
|
||||||
|
newList.add(userWorks.getNickname());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
HashMap<String, Object> map = new HashMap<>();
|
HashMap<String, Object> map = new HashMap<>();
|
||||||
map.put("data",list);
|
map.put("data",list);
|
||||||
|
map.put("Total",list.size());
|
||||||
map.put("userWork",userWork);
|
map.put("userWork",userWork);
|
||||||
|
map.put("newList",newList);
|
||||||
return R.ok(map);
|
return R.ok(map);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -153,10 +190,12 @@ public class RankingController {
|
|||||||
HashMap<String, Object> map = new HashMap<>();
|
HashMap<String, Object> map = new HashMap<>();
|
||||||
UserWorks userWorks = userService.getUserWorks(openid);
|
UserWorks userWorks = userService.getUserWorks(openid);
|
||||||
if(userWorks!=null){
|
if(userWorks!=null){
|
||||||
Long aLong = redisUtil.reverseRank(RANKING, openid);
|
if(redisUtil.hasKey(RANKING)){
|
||||||
//返回索引值+1 = 排序值
|
Long aLong = redisUtil.reverseRank(RANKING, openid);
|
||||||
map.put("rank",aLong+1);
|
//返回索引值+1 = 排序值
|
||||||
map.put("nickname",userWorks.getNickname());
|
map.put("rank",aLong+1);
|
||||||
|
map.put("nickname",userWorks.getNickname());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return R.ok(map);
|
return R.ok(map);
|
||||||
@@ -178,6 +217,10 @@ public class RankingController {
|
|||||||
}
|
}
|
||||||
//根据作品获取用户openid
|
//根据作品获取用户openid
|
||||||
String openid2 = userService.getWorksUser(worksId);
|
String openid2 = userService.getWorksUser(worksId);
|
||||||
|
if(!StringUtils.isNoneBlank(openid2)){
|
||||||
|
log.error("用户作品不存在!");
|
||||||
|
return R.error("用户作品不存在!");
|
||||||
|
}
|
||||||
//获取用户作品信息
|
//获取用户作品信息
|
||||||
UserWorks userWorks = userService.getUserWorks(openid2);
|
UserWorks userWorks = userService.getUserWorks(openid2);
|
||||||
if(redisUtil.hasKey(RANKING)){
|
if(redisUtil.hasKey(RANKING)){
|
||||||
@@ -186,10 +229,11 @@ public class RankingController {
|
|||||||
userWorks.setRank(aLong+1);
|
userWorks.setRank(aLong+1);
|
||||||
int i = redisUtil.score(RANKING, openid2).intValue();
|
int i = redisUtil.score(RANKING, openid2).intValue();
|
||||||
userWorks.setPraiseno(i);
|
userWorks.setPraiseno(i);
|
||||||
|
String url = userWorks.getUrl();
|
||||||
|
//oss的文件路径 oss服务器默认域名+文件路径
|
||||||
|
url = bucketDomain + "/" +url;
|
||||||
|
userWorks.setUrl(url);
|
||||||
}
|
}
|
||||||
//获取用户当天排行榜的点赞状态
|
|
||||||
Integer praiseId = praiseService.getPraiseStatus(openid,worksId);
|
|
||||||
userWorks.setPraiseStatus(praiseId);
|
|
||||||
|
|
||||||
HashMap<String, Object> map = new HashMap<>();
|
HashMap<String, Object> map = new HashMap<>();
|
||||||
//用户是否上传过作品
|
//用户是否上传过作品
|
||||||
@@ -224,7 +268,7 @@ public class RankingController {
|
|||||||
userWorks = userService.getUserWorks(openid);
|
userWorks = userService.getUserWorks(openid);
|
||||||
}
|
}
|
||||||
int max=98;
|
int max=98;
|
||||||
int min=94;
|
int min=90;
|
||||||
int i = new SecureRandom().nextInt(max) % (max - min + 1) + min;
|
int i = new SecureRandom().nextInt(max) % (max - min + 1) + min;
|
||||||
HashMap<String, Object> map = new HashMap<>();
|
HashMap<String, Object> map = new HashMap<>();
|
||||||
if(userWorks!=null){
|
if(userWorks!=null){
|
||||||
@@ -1,7 +1,6 @@
|
|||||||
package com.szxgl.vote2021.controller;
|
package com.szxgl.pars2021.controller;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.IOException;
|
|
||||||
import java.io.UnsupportedEncodingException;
|
import java.io.UnsupportedEncodingException;
|
||||||
import java.net.URLEncoder;
|
import java.net.URLEncoder;
|
||||||
import com.alibaba.fastjson.JSONArray;
|
import com.alibaba.fastjson.JSONArray;
|
||||||
@@ -12,9 +11,6 @@ import com.aliyuncs.IAcsClient;
|
|||||||
import com.aliyuncs.exceptions.ClientException;
|
import com.aliyuncs.exceptions.ClientException;
|
||||||
import com.aliyuncs.exceptions.ServerException;
|
import com.aliyuncs.exceptions.ServerException;
|
||||||
import com.aliyuncs.mts.model.v20140618.*;
|
import com.aliyuncs.mts.model.v20140618.*;
|
||||||
import com.szxgl.vote2021.config.OssPropertiesConfiguration;
|
|
||||||
import com.szxgl.vote2021.utils.R;
|
|
||||||
import com.szxgl.vote2021.utils.UploadFileToOssUtil;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 转码
|
* 转码
|
||||||
@@ -1,26 +1,29 @@
|
|||||||
package com.szxgl.vote2021.controller;
|
package com.szxgl.pars2021.controller;
|
||||||
|
|
||||||
|
|
||||||
import com.szxgl.vote2021.utils.RedisUtil;
|
import com.szxgl.pars2021.utils.R;
|
||||||
import com.szxgl.vote2021.utils.VerifyUtil;
|
import com.szxgl.pars2021.utils.RedisUtil;
|
||||||
import lombok.extern.java.Log;
|
import com.szxgl.pars2021.utils.VerifyUtil;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
import org.apache.commons.lang3.StringUtils;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.stereotype.Controller;
|
import org.springframework.beans.factory.annotation.Value;
|
||||||
import org.springframework.web.bind.annotation.RequestMapping;
|
import org.springframework.web.bind.annotation.RequestMapping;
|
||||||
import org.springframework.web.bind.annotation.RequestMethod;
|
|
||||||
import org.springframework.web.bind.annotation.RestController;
|
import org.springframework.web.bind.annotation.RestController;
|
||||||
|
|
||||||
|
import javax.servlet.http.Cookie;
|
||||||
import javax.servlet.http.HttpServletRequest;
|
import javax.servlet.http.HttpServletRequest;
|
||||||
import javax.servlet.http.HttpServletResponse;
|
import javax.servlet.http.HttpServletResponse;
|
||||||
import javax.servlet.http.HttpSession;
|
|
||||||
|
|
||||||
@Slf4j
|
@Slf4j
|
||||||
@RestController
|
@RestController
|
||||||
@RequestMapping("/code")
|
@RequestMapping("/code")
|
||||||
public class VerificationCodeController {
|
public class VerificationCodeController {
|
||||||
|
|
||||||
public static final String RANDOMCODEKEY= "RANDOMREDISKEY";//放到session中的key
|
public static final String RANDOMCODEKEY= "2021_pars_h5:code:RANDOMREDISKEY";//放到session中的key
|
||||||
|
|
||||||
|
@Value("${spring.profiles.active}")
|
||||||
|
private String activeProfiles;
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
private RedisUtil redisUtil;
|
private RedisUtil redisUtil;
|
||||||
@@ -31,6 +34,10 @@ public class VerificationCodeController {
|
|||||||
*/
|
*/
|
||||||
@RequestMapping("/createImg")
|
@RequestMapping("/createImg")
|
||||||
public void createImg(HttpServletRequest request, HttpServletResponse response) throws Exception {
|
public void createImg(HttpServletRequest request, HttpServletResponse response) throws Exception {
|
||||||
|
String openid = getValue(request.getCookies(), "openid");
|
||||||
|
if("prod".equals(activeProfiles) && StringUtils.isBlank(openid)){
|
||||||
|
log.error("openid为空,请求参数");
|
||||||
|
}
|
||||||
try {
|
try {
|
||||||
response.setContentType("image/jpeg");//设置相应类型,告诉浏览器输出的内容为图片
|
response.setContentType("image/jpeg");//设置相应类型,告诉浏览器输出的内容为图片
|
||||||
response.setHeader("Pragma", "No-cache");//设置响应头信息,告诉浏览器不要缓存此内容
|
response.setHeader("Pragma", "No-cache");//设置响应头信息,告诉浏览器不要缓存此内容
|
||||||
@@ -39,9 +46,29 @@ public class VerificationCodeController {
|
|||||||
VerifyUtil randomValidateCode = new VerifyUtil();
|
VerifyUtil randomValidateCode = new VerifyUtil();
|
||||||
randomValidateCode.getRandcode(request, response);//输出验证码图片
|
randomValidateCode.getRandcode(request, response);//输出验证码图片
|
||||||
//将生成的随机验证码存放到redis中
|
//将生成的随机验证码存放到redis中
|
||||||
redisUtil.set(RANDOMCODEKEY,request.getSession().getAttribute(RANDOMCODEKEY),Long.parseLong("60"));
|
redisUtil.set(RANDOMCODEKEY+openid,request.getSession().getAttribute(RANDOMCODEKEY),Long.parseLong("60"));
|
||||||
}catch (Exception e){
|
}catch (Exception e){
|
||||||
log.error("获取验证码异常:", e);
|
log.error("获取验证码异常:", e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -1,17 +1,15 @@
|
|||||||
package com.szxgl.vote2021.controller;
|
package com.szxgl.pars2021.controller;
|
||||||
|
|
||||||
import com.alibaba.fastjson.JSONObject;
|
import com.alibaba.fastjson.JSONObject;
|
||||||
import com.szxgl.vote2021.entity.UserDO;
|
import com.szxgl.pars2021.entity.UserDO;
|
||||||
import com.szxgl.vote2021.entity.WorksDao;
|
import com.szxgl.pars2021.service.UserService;
|
||||||
import com.szxgl.vote2021.service.UserService;
|
import com.szxgl.pars2021.utils.HttpClientUtil;
|
||||||
import com.szxgl.vote2021.utils.HttpClientUtil;
|
import com.szxgl.pars2021.utils.R;
|
||||||
import com.szxgl.vote2021.utils.R;
|
import com.szxgl.pars2021.utils.RedisUtil;
|
||||||
import com.szxgl.vote2021.utils.RedisUtil;
|
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.apache.commons.lang3.StringUtils;
|
import org.apache.commons.lang3.StringUtils;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.beans.factory.annotation.Value;
|
import org.springframework.beans.factory.annotation.Value;
|
||||||
import org.springframework.stereotype.Controller;
|
|
||||||
import org.springframework.web.bind.annotation.*;
|
import org.springframework.web.bind.annotation.*;
|
||||||
|
|
||||||
import javax.servlet.http.Cookie;
|
import javax.servlet.http.Cookie;
|
||||||
@@ -20,7 +18,6 @@ import javax.servlet.http.HttpServletResponse;
|
|||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.UUID;
|
|
||||||
|
|
||||||
@RestController
|
@RestController
|
||||||
@RequestMapping("/api/wechat")
|
@RequestMapping("/api/wechat")
|
||||||
@@ -41,7 +38,8 @@ public class WechatController {
|
|||||||
@Value("${spring.profiles.active}")
|
@Value("${spring.profiles.active}")
|
||||||
private String activeProfiles;
|
private String activeProfiles;
|
||||||
|
|
||||||
public static final String RANDOMCODEKEY= "RANDOMREDISKEY";//验证码放到session和redis中的key
|
public static final String RANDOMCODEKEY= "2021_pars_h5:code:RANDOMREDISKEY";//验证码放到session和redis中的key
|
||||||
|
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
private RedisUtil redisUtil;
|
private RedisUtil redisUtil;
|
||||||
@@ -127,7 +125,7 @@ public class WechatController {
|
|||||||
}
|
}
|
||||||
UserDO userDO = userService.getUserInfo(openid);
|
UserDO userDO = userService.getUserInfo(openid);
|
||||||
Map<String,Object> map = new HashMap<>();
|
Map<String,Object> map = new HashMap<>();
|
||||||
if(!StringUtils.isNoneBlank(userDO.getRealname()) || !StringUtils.isNoneBlank(userDO.getPhone())) {
|
if(userDO == null || !StringUtils.isNoneBlank(userDO.getRealname()) || !StringUtils.isNoneBlank(userDO.getPhone())) {
|
||||||
//用户未绑定手机号和填写真实姓名
|
//用户未绑定手机号和填写真实姓名
|
||||||
map.put("result",false);
|
map.put("result",false);
|
||||||
}else {
|
}else {
|
||||||
@@ -162,13 +160,13 @@ public class WechatController {
|
|||||||
}
|
}
|
||||||
|
|
||||||
//判断验证码是否过期
|
//判断验证码是否过期
|
||||||
if(!redisUtil.hasKey(RANDOMCODEKEY)){
|
if(!redisUtil.hasKey(RANDOMCODEKEY+openid)){
|
||||||
log.error("验证码已过期!");
|
log.error("验证码已过期!");
|
||||||
return R.error("验证码已过期!");
|
return R.error("验证码已过期!");
|
||||||
}
|
}
|
||||||
|
|
||||||
//判断验证码是否正确
|
//判断验证码是否正确
|
||||||
if(!redisUtil.get(RANDOMCODEKEY).equals(code.toUpperCase())){
|
if(!redisUtil.get(RANDOMCODEKEY+openid).equals(code.toUpperCase())){
|
||||||
log.error("验证码错误!");
|
log.error("验证码错误!");
|
||||||
return R.error("验证码错误!");
|
return R.error("验证码错误!");
|
||||||
}
|
}
|
||||||
@@ -1,13 +1,12 @@
|
|||||||
package com.szxgl.vote2021.controller;
|
package com.szxgl.pars2021.controller;
|
||||||
|
|
||||||
import com.szxgl.vote2021.entity.UserDO;
|
import com.szxgl.pars2021.entity.UserDO;
|
||||||
import com.szxgl.vote2021.entity.UserWorks;
|
import com.szxgl.pars2021.entity.WorksDao;
|
||||||
import com.szxgl.vote2021.entity.WorksDao;
|
import com.szxgl.pars2021.service.UserService;
|
||||||
import com.szxgl.vote2021.service.UserService;
|
import com.szxgl.pars2021.service.WorksService;
|
||||||
import com.szxgl.vote2021.service.WorksService;
|
import com.szxgl.pars2021.utils.R;
|
||||||
import com.szxgl.vote2021.utils.R;
|
import com.szxgl.pars2021.utils.RedisUtil;
|
||||||
import com.szxgl.vote2021.utils.RedisUtil;
|
import com.szxgl.pars2021.utils.UploadFileToOssUtil;
|
||||||
import com.szxgl.vote2021.utils.UploadFileToOssUtil;
|
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.apache.commons.lang3.StringUtils;
|
import org.apache.commons.lang3.StringUtils;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
@@ -35,7 +34,7 @@ public class WorksController {
|
|||||||
private String activeProfiles;
|
private String activeProfiles;
|
||||||
|
|
||||||
//redis中作品排序的key
|
//redis中作品排序的key
|
||||||
private static final String RANKING = "RANKING";
|
private static final String RANKING = "2021_pars_h5:sort:RANKING";
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
private UserService userService;
|
private UserService userService;
|
||||||
@@ -70,11 +69,21 @@ public class WorksController {
|
|||||||
}
|
}
|
||||||
|
|
||||||
UserDO userDO = userService.get(openid);
|
UserDO userDO = userService.get(openid);
|
||||||
if(!StringUtils.isNoneBlank(userDO.getRealname()) || !StringUtils.isNoneBlank(userDO.getPhone())){
|
if(userDO == null || !StringUtils.isNoneBlank(userDO.getRealname()) || !StringUtils.isNoneBlank(userDO.getPhone())){
|
||||||
log.error("请先填写真实姓名和手机号!");
|
log.error("请先填写真实姓名和手机号!");
|
||||||
return R.error("请先填写真实姓名和手机号!");
|
return R.error("请先填写真实姓名和手机号!");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(!StringUtils.isNoneBlank(file.getOriginalFilename())){
|
||||||
|
log.error("上传文件不能为空!");
|
||||||
|
return R.error("上传文件不能为空!");
|
||||||
|
}
|
||||||
|
if(!"image/jpg".contains(file.getContentType()) && !"image/png".contains(file.getContentType()) && !"image/jpeg".contains(file.getContentType())){
|
||||||
|
System.out.println(file.getContentType());
|
||||||
|
log.error("文件格式不正确!");
|
||||||
|
return R.error("文件格式不正确!");
|
||||||
|
}
|
||||||
|
|
||||||
//查询用户是否已拥有作品
|
//查询用户是否已拥有作品
|
||||||
WorksDao work = worksService.getWorks(openid);
|
WorksDao work = worksService.getWorks(openid);
|
||||||
if( work != null ){
|
if( work != null ){
|
||||||
@@ -84,7 +93,9 @@ public class WorksController {
|
|||||||
|
|
||||||
try {
|
try {
|
||||||
//上传文件到oss上
|
//上传文件到oss上
|
||||||
R r = UploadFileToOssUtil.uploadFileToOss(file.getInputStream(), Objects.requireNonNull(file.getOriginalFilename()));
|
String contentType = file.getContentType();
|
||||||
|
String fileUrl = Objects.requireNonNull(file.getOriginalFilename())+"."+contentType.substring(contentType.lastIndexOf("/")+1);
|
||||||
|
R r = UploadFileToOssUtil.uploadFileToOss(file.getInputStream(), fileUrl);
|
||||||
if("-1".equals(r.get("ret"))){
|
if("-1".equals(r.get("ret"))){
|
||||||
log.error("文件上传失败!");
|
log.error("文件上传失败!");
|
||||||
return R.error("文件上传失败!");
|
return R.error("文件上传失败!");
|
||||||
@@ -99,7 +110,6 @@ public class WorksController {
|
|||||||
worksDao.setCreate_time(new Date());
|
worksDao.setCreate_time(new Date());
|
||||||
worksService.saveWorks(worksDao);
|
worksService.saveWorks(worksDao);
|
||||||
|
|
||||||
//把openid存入redis (排行榜的value)
|
|
||||||
redisUtil.addZSet(RANKING,openid,0);
|
redisUtil.addZSet(RANKING,openid,0);
|
||||||
|
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
@@ -1,10 +1,8 @@
|
|||||||
package com.szxgl.vote2021.entity;
|
package com.szxgl.pars2021.entity;
|
||||||
|
|
||||||
import com.baomidou.mybatisplus.annotation.TableField;
|
|
||||||
import com.baomidou.mybatisplus.annotation.TableName;
|
import com.baomidou.mybatisplus.annotation.TableName;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
|
|
||||||
import java.io.Serializable;
|
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
|
|
||||||
@Data
|
@Data
|
||||||
@@ -1,10 +1,8 @@
|
|||||||
package com.szxgl.vote2021.entity;
|
package com.szxgl.pars2021.entity;
|
||||||
|
|
||||||
import com.baomidou.mybatisplus.annotation.TableName;
|
import com.baomidou.mybatisplus.annotation.TableName;
|
||||||
import com.szxgl.vote2021.utils.R;
|
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
|
|
||||||
import java.text.SimpleDateFormat;
|
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
|
|
||||||
@Data
|
@Data
|
||||||
@@ -1,8 +1,7 @@
|
|||||||
package com.szxgl.vote2021.entity;
|
package com.szxgl.pars2021.entity;
|
||||||
|
|
||||||
import com.fasterxml.jackson.annotation.JsonIgnore;
|
import com.fasterxml.jackson.annotation.JsonIgnore;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
import reactor.util.annotation.Nullable;
|
|
||||||
|
|
||||||
@Data
|
@Data
|
||||||
public class UserWorks {
|
public class UserWorks {
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
package com.szxgl.vote2021.entity;
|
package com.szxgl.pars2021.entity;
|
||||||
|
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
|
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
package com.szxgl.vote2021.entity;
|
package com.szxgl.pars2021.entity;
|
||||||
|
|
||||||
import com.baomidou.mybatisplus.annotation.TableName;
|
import com.baomidou.mybatisplus.annotation.TableName;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
package com.szxgl.vote2021.entity;
|
package com.szxgl.pars2021.entity;
|
||||||
|
|
||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
|
|
||||||
@@ -1,23 +1,30 @@
|
|||||||
package com.szxgl.vote2021.exception;
|
package com.szxgl.pars2021.exception;
|
||||||
|
|
||||||
import com.szxgl.vote2021.utils.R;
|
import com.szxgl.pars2021.utils.R;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.springframework.web.bind.annotation.ExceptionHandler;
|
import org.springframework.web.bind.annotation.ExceptionHandler;
|
||||||
import org.springframework.web.bind.annotation.RestControllerAdvice;
|
import org.springframework.web.bind.annotation.RestControllerAdvice;
|
||||||
|
|
||||||
import javax.servlet.http.HttpServletRequest;
|
import javax.servlet.http.HttpServletRequest;
|
||||||
|
import java.util.Arrays;
|
||||||
|
|
||||||
@RestControllerAdvice
|
@RestControllerAdvice
|
||||||
|
@Slf4j
|
||||||
public class MyAjaxExceptionHandler {
|
public class MyAjaxExceptionHandler {
|
||||||
|
|
||||||
@ExceptionHandler(value = Exception.class)
|
@ExceptionHandler(value = Exception.class)
|
||||||
public R defaultErrorHandler(HttpServletRequest request, Exception e){
|
public R defaultErrorHandler(HttpServletRequest request, Exception e){
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
|
log.error(e.getMessage());
|
||||||
|
log.error(Arrays.toString(e.getStackTrace()));
|
||||||
return R.error("服务器出现异常!");
|
return R.error("服务器出现异常!");
|
||||||
}
|
}
|
||||||
|
|
||||||
@ExceptionHandler(value = ParameterException.class)
|
@ExceptionHandler(value = ParameterException.class)
|
||||||
public R ParameterErrorHandler(HttpServletRequest request, Exception e){
|
public R ParameterErrorHandler(HttpServletRequest request, Exception e){
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
|
log.error(e.getMessage());
|
||||||
|
log.error(Arrays.toString(e.getStackTrace()));
|
||||||
return R.error(e.getMessage());
|
return R.error(e.getMessage());
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
package com.szxgl.vote2021.exception;
|
package com.szxgl.pars2021.exception;
|
||||||
|
|
||||||
public class ParameterException extends RuntimeException{
|
public class ParameterException extends RuntimeException{
|
||||||
|
|
||||||
@@ -1,15 +1,16 @@
|
|||||||
package com.szxgl.vote2021.filter;
|
package com.szxgl.pars2021.filter;
|
||||||
|
|
||||||
import com.alibaba.fastjson.JSONObject;
|
import com.alibaba.fastjson.JSONObject;
|
||||||
import com.szxgl.vote2021.entity.WxMpUser;
|
import com.szxgl.pars2021.entity.Record;
|
||||||
import com.szxgl.vote2021.service.UserService;
|
import com.szxgl.pars2021.entity.WxMpUser;
|
||||||
import com.szxgl.vote2021.utils.URIUtil;
|
import com.szxgl.pars2021.service.UserService;
|
||||||
import com.szxgl.vote2021.utils.Utility;
|
import com.szxgl.pars2021.utils.URIUtil;
|
||||||
|
import com.szxgl.pars2021.utils.Utility;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.apache.commons.lang3.StringUtils;
|
import org.apache.commons.lang3.StringUtils;
|
||||||
import org.springframework.beans.factory.annotation.Value;
|
|
||||||
|
|
||||||
import org.springframework.context.ApplicationContext;
|
import org.springframework.context.ApplicationContext;
|
||||||
import org.springframework.stereotype.Component;
|
|
||||||
import org.springframework.web.context.support.WebApplicationContextUtils;
|
import org.springframework.web.context.support.WebApplicationContextUtils;
|
||||||
|
|
||||||
import javax.servlet.*;
|
import javax.servlet.*;
|
||||||
@@ -25,25 +26,24 @@ import java.net.URL;
|
|||||||
* @author leiyun
|
* @author leiyun
|
||||||
* @datetime 2017年4月27日 下午4:05:24
|
* @datetime 2017年4月27日 下午4:05:24
|
||||||
*/
|
*/
|
||||||
/*@WebFilter("*.html")
|
@WebFilter("*.html")
|
||||||
@Component
|
|
||||||
@Slf4j
|
@Slf4j
|
||||||
public class WebAuthFilter implements Filter {
|
public class WebAuthFilter implements Filter {
|
||||||
|
|
||||||
@Value("${wx.appid}")
|
//@Value("${wx.appid}")
|
||||||
private String default_appid;
|
private String default_appid = "wx35766a64d73d08a9";
|
||||||
|
|
||||||
@Value("${wx.auth-code}")
|
//@Value("${wx.auth-code}")
|
||||||
private String key;
|
private String key = "fbc35e02df8a4fae9f9f827156acd91e";
|
||||||
|
|
||||||
@Value("${wx.project-id}")
|
//@Value("${wx.project-id}")
|
||||||
private String projectId;
|
private String projectId = "20210001000100011";
|
||||||
|
|
||||||
@Value("${wx.auth-scope}")
|
//@Value("${wx.auth-scope}")
|
||||||
private String default_scope;
|
private String default_scope = "snsapi_userinfo";
|
||||||
|
|
||||||
@Value("${wx.api-domain}")
|
//@Value("${wx.api-domain}")
|
||||||
private String api_domain;
|
private String api_domain = "https://wx.xfhd.net/thirdparty";
|
||||||
|
|
||||||
// private static String default_appid = "wx35766a64d73d08a9";
|
// private static String default_appid = "wx35766a64d73d08a9";
|
||||||
// private static String key = "adsagdagefghfhgffsghdfsgd";
|
// private static String key = "adsagdagefghfhgffsghdfsgd";
|
||||||
@@ -70,6 +70,12 @@ public class WebAuthFilter implements Filter {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
log.info("default_appid:"+default_appid);
|
||||||
|
log.info("key:"+key);
|
||||||
|
log.info("projectId:"+projectId);
|
||||||
|
log.info("default_scope:"+default_scope);
|
||||||
|
log.info("api_domain:"+api_domain);
|
||||||
|
|
||||||
// Mozilla/5.0 (Linux; Android 4.4.4; iToolsVM Build/KTU84P) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/33.0.0.0 Mobile Safari/537.36 MicroMessenger/6.3.31.940 NetType/WIFI Language/zh_CN
|
// Mozilla/5.0 (Linux; Android 4.4.4; iToolsVM Build/KTU84P) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/33.0.0.0 Mobile Safari/537.36 MicroMessenger/6.3.31.940 NetType/WIFI Language/zh_CN
|
||||||
|
|
||||||
// 每次授权成功后发现会有重复的请求进来,IP为微信上海服务器的IP,useragent包含iToolsVM,暂不明原因,所以直接过滤掉
|
// 每次授权成功后发现会有重复的请求进来,IP为微信上海服务器的IP,useragent包含iToolsVM,暂不明原因,所以直接过滤掉
|
||||||
@@ -80,10 +86,17 @@ public class WebAuthFilter implements Filter {
|
|||||||
|
|
||||||
String appid = request.getParameter("appid");
|
String appid = request.getParameter("appid");
|
||||||
String scope = request.getParameter("scope");
|
String scope = request.getParameter("scope");
|
||||||
if(StringUtils.isBlank(appid))appid=default_appid;
|
String id = request.getParameter("id");
|
||||||
|
if(StringUtils.isBlank(appid))appid=default_appid;
|
||||||
if(StringUtils.isBlank(scope))scope=default_scope;
|
if(StringUtils.isBlank(scope))scope=default_scope;
|
||||||
|
|
||||||
|
ServletContext context = request.getServletContext();
|
||||||
|
ApplicationContext ctx = WebApplicationContextUtils.getWebApplicationContext(context);
|
||||||
|
|
||||||
|
log.info("作品id:"+id);
|
||||||
String httpRequestFullURL = getHttpRequestFullURL(request);
|
String httpRequestFullURL = getHttpRequestFullURL(request);
|
||||||
|
log.info(httpRequestFullURL);
|
||||||
|
|
||||||
// String api_domain = request.getScheme()+"://"+request.getServerName()+(request.getServerPort()==80?"":":"+request.getServerPort())+request.getContextPath();
|
// String api_domain = request.getScheme()+"://"+request.getServerName()+(request.getServerPort()==80?"":":"+request.getServerPort())+request.getContextPath();
|
||||||
String redirectUrl = api_domain+"/webauth/api/oauth"+"?projectId="+projectId+"&appid="+appid+"&redirect_uri="+ URIUtil.encodeURIComponent(httpRequestFullURL)+"&scope="+ scope;
|
String redirectUrl = api_domain+"/webauth/api/oauth"+"?projectId="+projectId+"&appid="+appid+"&redirect_uri="+ URIUtil.encodeURIComponent(httpRequestFullURL)+"&scope="+ scope;
|
||||||
String code = request.getParameter("code");
|
String code = request.getParameter("code");
|
||||||
@@ -100,8 +113,24 @@ public class WebAuthFilter implements Filter {
|
|||||||
WxMpUser wxMpUser = JSONObject.parseObject(json.getString("data"), WxMpUser.class);
|
WxMpUser wxMpUser = JSONObject.parseObject(json.getString("data"), WxMpUser.class);
|
||||||
System.out.println(json);
|
System.out.println(json);
|
||||||
Utility.addCookie(request, response, "openid", wxMpUser.getOpenid());
|
Utility.addCookie(request, response, "openid", wxMpUser.getOpenid());
|
||||||
ServletContext context = request.getServletContext();
|
if(StringUtils.isNoneBlank(id)){
|
||||||
ApplicationContext ctx = WebApplicationContextUtils.getWebApplicationContext(context);
|
log.info("进来了!");
|
||||||
|
//二维码扫码携带作品id
|
||||||
|
if(ctx==null){
|
||||||
|
log.error("applicationContext空指针");
|
||||||
|
}else {
|
||||||
|
UserService userService = ctx.getBean(UserService.class);
|
||||||
|
//用户扫码二维码是否已记录
|
||||||
|
Record record = userService.getRecord(Integer.parseInt(id));
|
||||||
|
if(record == null){
|
||||||
|
Record record2 = new Record();
|
||||||
|
record2.setNickname(wxMpUser.getNickname());
|
||||||
|
record2.setOpenid(wxMpUser.getOpenid());
|
||||||
|
record2.setWorksId(Integer.parseInt(id));
|
||||||
|
userService.saveRecord(record2);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
if(ctx==null){
|
if(ctx==null){
|
||||||
log.error("applicationContext空指针");
|
log.error("applicationContext空指针");
|
||||||
}else {
|
}else {
|
||||||
@@ -174,4 +203,4 @@ public class WebAuthFilter implements Filter {
|
|||||||
return jsonObject;
|
return jsonObject;
|
||||||
}
|
}
|
||||||
|
|
||||||
}*/
|
}
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
package com.szxgl.vote2021.mapper;
|
package com.szxgl.pars2021.mapper;
|
||||||
|
|
||||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||||
import com.szxgl.vote2021.entity.PraiseDao;
|
import com.szxgl.pars2021.entity.PraiseDao;
|
||||||
import org.apache.ibatis.annotations.Mapper;
|
import org.apache.ibatis.annotations.Mapper;
|
||||||
|
|
||||||
@Mapper
|
@Mapper
|
||||||
14
src/main/java/com/szxgl/pars2021/mapper/PraiseMapper2.java
Normal file
14
src/main/java/com/szxgl/pars2021/mapper/PraiseMapper2.java
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
package com.szxgl.pars2021.mapper;
|
||||||
|
|
||||||
|
import com.szxgl.pars2021.entity.PraiseDao;
|
||||||
|
import org.apache.ibatis.annotations.Mapper;
|
||||||
|
import org.apache.ibatis.annotations.Param;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
@Mapper
|
||||||
|
public interface PraiseMapper2 {
|
||||||
|
|
||||||
|
List<PraiseDao> getPraise(@Param("openid") String openid,
|
||||||
|
@Param("worksId") Integer worksId);
|
||||||
|
}
|
||||||
@@ -1,8 +1,7 @@
|
|||||||
package com.szxgl.vote2021.mapper;
|
package com.szxgl.pars2021.mapper;
|
||||||
|
|
||||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||||
import com.szxgl.vote2021.entity.UserDO;
|
import com.szxgl.pars2021.entity.UserDO;
|
||||||
import com.szxgl.vote2021.entity.UserWorks;
|
|
||||||
import org.apache.ibatis.annotations.Mapper;
|
import org.apache.ibatis.annotations.Mapper;
|
||||||
|
|
||||||
@Mapper
|
@Mapper
|
||||||
18
src/main/java/com/szxgl/pars2021/mapper/UserMapper2.java
Normal file
18
src/main/java/com/szxgl/pars2021/mapper/UserMapper2.java
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
package com.szxgl.pars2021.mapper;
|
||||||
|
|
||||||
|
import com.szxgl.pars2021.entity.Record;
|
||||||
|
import com.szxgl.pars2021.entity.UserDO;
|
||||||
|
import com.szxgl.pars2021.entity.UserWorks;
|
||||||
|
import org.apache.ibatis.annotations.Mapper;
|
||||||
|
|
||||||
|
@Mapper
|
||||||
|
public interface UserMapper2 {
|
||||||
|
|
||||||
|
UserWorks getUserWorks(String openid);
|
||||||
|
|
||||||
|
String getWorksUser(Integer worksId);
|
||||||
|
|
||||||
|
void saveRecord(Record record);
|
||||||
|
|
||||||
|
Record getRecord(Integer worksId);
|
||||||
|
}
|
||||||
@@ -1,12 +1,9 @@
|
|||||||
package com.szxgl.vote2021.mapper;
|
package com.szxgl.pars2021.mapper;
|
||||||
|
|
||||||
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
|
||||||
import com.szxgl.vote2021.entity.UserWorks;
|
import com.szxgl.pars2021.entity.WorksDao;
|
||||||
import com.szxgl.vote2021.entity.WorksDao;
|
|
||||||
import org.apache.ibatis.annotations.Mapper;
|
import org.apache.ibatis.annotations.Mapper;
|
||||||
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
@Mapper
|
@Mapper
|
||||||
public interface WorksMapper extends BaseMapper<WorksDao> {
|
public interface WorksMapper extends BaseMapper<WorksDao> {
|
||||||
|
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
package com.szxgl.vote2021.mapper;
|
package com.szxgl.pars2021.mapper;
|
||||||
|
|
||||||
import com.szxgl.vote2021.entity.UserWorks;
|
import com.szxgl.pars2021.entity.UserWorks;
|
||||||
import org.apache.ibatis.annotations.Mapper;
|
import org.apache.ibatis.annotations.Mapper;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
package com.szxgl.pars2021.service;
|
||||||
|
|
||||||
|
public interface PraiseService {
|
||||||
|
|
||||||
|
void savePraise(String openid, Integer worksId);
|
||||||
|
}
|
||||||
@@ -1,8 +1,9 @@
|
|||||||
package com.szxgl.vote2021.service;
|
package com.szxgl.pars2021.service;
|
||||||
|
|
||||||
import com.szxgl.vote2021.entity.UserDO;
|
import com.szxgl.pars2021.entity.Record;
|
||||||
import com.szxgl.vote2021.entity.UserWorks;
|
import com.szxgl.pars2021.entity.UserDO;
|
||||||
import com.szxgl.vote2021.entity.WxMpUser;
|
import com.szxgl.pars2021.entity.UserWorks;
|
||||||
|
import com.szxgl.pars2021.entity.WxMpUser;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
@@ -20,4 +21,8 @@ public interface UserService {
|
|||||||
UserDO getUserInfo(String openid);
|
UserDO getUserInfo(String openid);
|
||||||
|
|
||||||
String getWorksUser(Integer worksId);
|
String getWorksUser(Integer worksId);
|
||||||
|
|
||||||
|
void saveRecord(Record record);
|
||||||
|
|
||||||
|
Record getRecord(Integer worksId);
|
||||||
}
|
}
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
package com.szxgl.vote2021.service;
|
package com.szxgl.pars2021.service;
|
||||||
|
|
||||||
import com.szxgl.vote2021.entity.UserWorks;
|
import com.szxgl.pars2021.entity.UserWorks;
|
||||||
import com.szxgl.vote2021.entity.WorksDao;
|
import com.szxgl.pars2021.entity.WorksDao;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
@@ -0,0 +1,84 @@
|
|||||||
|
package com.szxgl.pars2021.service.impl;
|
||||||
|
|
||||||
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||||
|
import com.szxgl.pars2021.entity.PraiseDao;
|
||||||
|
import com.szxgl.pars2021.entity.WorksDao;
|
||||||
|
import com.szxgl.pars2021.exception.ParameterException;
|
||||||
|
import com.szxgl.pars2021.mapper.PraiseMapper;
|
||||||
|
import com.szxgl.pars2021.mapper.PraiseMapper2;
|
||||||
|
import com.szxgl.pars2021.mapper.WorksMapper;
|
||||||
|
import com.szxgl.pars2021.mapper.WorksMapper2;
|
||||||
|
import com.szxgl.pars2021.service.PraiseService;
|
||||||
|
import com.szxgl.pars2021.utils.RedisUtil;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.stereotype.Service;
|
||||||
|
import org.springframework.transaction.annotation.Transactional;
|
||||||
|
|
||||||
|
import java.text.SimpleDateFormat;
|
||||||
|
import java.util.Date;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
@Service
|
||||||
|
public class PraiseServiceImpl implements PraiseService {
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private PraiseMapper praiseMapper;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private PraiseMapper2 praiseMapper2;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private WorksMapper worksMapper;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private WorksMapper2 worksMapper2;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private RedisUtil redisUtil;
|
||||||
|
|
||||||
|
//redis中作品排序的key
|
||||||
|
private static final String RANKING = "2021_pars_h5:sort:RANKING";
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@Transactional
|
||||||
|
public void savePraise(String openid, Integer worksId) {
|
||||||
|
List<PraiseDao> praiseDaos = praiseMapper2.getPraise(openid,worksId);
|
||||||
|
//该用户没有点过赞
|
||||||
|
if(praiseDaos.size() == 0){
|
||||||
|
PraiseDao praiseDao = new PraiseDao();
|
||||||
|
praiseDao.setOpenid(openid);
|
||||||
|
praiseDao.setWorksId(worksId);
|
||||||
|
praiseDao.setCreateTime(new Date());
|
||||||
|
praiseMapper.insert(praiseDao);
|
||||||
|
//更新作品点赞总数
|
||||||
|
worksMapper2.updatePraiseNo(worksId);
|
||||||
|
}else {
|
||||||
|
if(praiseDaos.size() >= 5){
|
||||||
|
//今天已点赞5次
|
||||||
|
throw new ParameterException("您今天已点赞5次,请明天再来点赞!");
|
||||||
|
}else {
|
||||||
|
//今天未点赞
|
||||||
|
PraiseDao praiseDao = new PraiseDao();
|
||||||
|
praiseDao.setOpenid(openid);
|
||||||
|
praiseDao.setWorksId(worksId);
|
||||||
|
praiseDao.setCreateTime(new Date());
|
||||||
|
praiseMapper.insert(praiseDao);
|
||||||
|
//更新作品点赞总数
|
||||||
|
worksMapper2.updatePraiseNo(worksId);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
QueryWrapper<WorksDao> wrapper2 = new QueryWrapper<>();
|
||||||
|
wrapper2.eq("id",worksId);
|
||||||
|
WorksDao worksDao = worksMapper.selectOne(wrapper2);
|
||||||
|
|
||||||
|
//更新redis中的缓存
|
||||||
|
if(redisUtil.getExpire(RANKING) == -1){
|
||||||
|
redisUtil.expire(RANKING,60 * 60 * 24 * 60);
|
||||||
|
}
|
||||||
|
//点赞数加1
|
||||||
|
redisUtil.incrScore(RANKING,worksDao.getOpenid(),1);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -1,18 +1,18 @@
|
|||||||
package com.szxgl.vote2021.service.impl;
|
package com.szxgl.pars2021.service.impl;
|
||||||
|
|
||||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||||
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
|
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
|
||||||
import com.szxgl.vote2021.entity.UserDO;
|
import com.szxgl.pars2021.entity.Record;
|
||||||
import com.szxgl.vote2021.entity.UserWorks;
|
import com.szxgl.pars2021.entity.UserDO;
|
||||||
import com.szxgl.vote2021.entity.WxMpUser;
|
import com.szxgl.pars2021.entity.UserWorks;
|
||||||
import com.szxgl.vote2021.mapper.UserMapper;
|
import com.szxgl.pars2021.entity.WxMpUser;
|
||||||
import com.szxgl.vote2021.mapper.UserMapper2;
|
import com.szxgl.pars2021.mapper.UserMapper;
|
||||||
import com.szxgl.vote2021.service.UserService;
|
import com.szxgl.pars2021.mapper.UserMapper2;
|
||||||
import com.szxgl.vote2021.utils.RedisUtil;
|
import com.szxgl.pars2021.service.UserService;
|
||||||
|
import com.szxgl.pars2021.utils.RedisUtil;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
import javax.servlet.http.Cookie;
|
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
@@ -28,7 +28,7 @@ public class UserServiceImpl implements UserService {
|
|||||||
private RedisUtil redisUtil;
|
private RedisUtil redisUtil;
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
private static final String USERINFO = "userInfo";
|
private static final String USERINFO = "2021_pars_h5:userInfo:user";
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void saveAndUpdate(WxMpUser wxMpUser) {
|
public void saveAndUpdate(WxMpUser wxMpUser) {
|
||||||
@@ -40,6 +40,7 @@ public class UserServiceImpl implements UserService {
|
|||||||
userDO1.setNickname(wxMpUser.getNickname());
|
userDO1.setNickname(wxMpUser.getNickname());
|
||||||
userDO1.setHeadimgurl(wxMpUser.getHeadimgurl());
|
userDO1.setHeadimgurl(wxMpUser.getHeadimgurl());
|
||||||
userDO1.setCreateTime(new Date());
|
userDO1.setCreateTime(new Date());
|
||||||
|
userDO1.setUpdateTime(new Date());
|
||||||
userMapper.insert(userDO1);
|
userMapper.insert(userDO1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -102,5 +103,15 @@ public class UserServiceImpl implements UserService {
|
|||||||
return userMapper2.getWorksUser(worksId);
|
return userMapper2.getWorksUser(worksId);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void saveRecord(Record record) {
|
||||||
|
userMapper2.saveRecord(record);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Record getRecord(Integer worksId) {
|
||||||
|
return userMapper2.getRecord(worksId);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -1,14 +1,14 @@
|
|||||||
package com.szxgl.vote2021.service;
|
package com.szxgl.pars2021.service.impl;
|
||||||
|
|
||||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
||||||
import com.szxgl.vote2021.entity.UserDO;
|
import com.szxgl.pars2021.entity.UserWorks;
|
||||||
import com.szxgl.vote2021.entity.UserWorks;
|
import com.szxgl.pars2021.entity.WorksDao;
|
||||||
import com.szxgl.vote2021.entity.WorksDao;
|
import com.szxgl.pars2021.mapper.WorksMapper;
|
||||||
import com.szxgl.vote2021.mapper.WorksMapper;
|
import com.szxgl.pars2021.mapper.WorksMapper2;
|
||||||
import com.szxgl.vote2021.mapper.WorksMapper2;
|
import com.szxgl.pars2021.service.WorksService;
|
||||||
import com.szxgl.vote2021.utils.RedisUtil;
|
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
|
import org.springframework.transaction.annotation.Transactional;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
@@ -23,8 +23,8 @@ public class WorksServiceImpl implements WorksService {
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@Transactional
|
||||||
public void saveWorks(WorksDao worksDao) {
|
public void saveWorks(WorksDao worksDao) {
|
||||||
worksMapper.insert(worksDao);
|
worksMapper.insert(worksDao);
|
||||||
}
|
}
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
package com.szxgl.vote2021.utils;
|
package com.szxgl.pars2021.utils;
|
||||||
|
|
||||||
import org.apache.commons.io.IOUtils;
|
import org.apache.commons.io.IOUtils;
|
||||||
import org.springframework.web.multipart.MultipartFile;
|
import org.springframework.web.multipart.MultipartFile;
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
package com.szxgl.vote2021.utils;
|
package com.szxgl.pars2021.utils;
|
||||||
|
|
||||||
import com.alibaba.fastjson.JSONObject;
|
import com.alibaba.fastjson.JSONObject;
|
||||||
import org.apache.commons.lang3.StringUtils;
|
import org.apache.commons.lang3.StringUtils;
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
package com.szxgl.vote2021.utils;
|
package com.szxgl.pars2021.utils;
|
||||||
|
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
@@ -1,7 +1,6 @@
|
|||||||
package com.szxgl.vote2021.utils;
|
package com.szxgl.pars2021.utils;
|
||||||
|
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.data.redis.core.BoundZSetOperations;
|
|
||||||
import org.springframework.data.redis.core.RedisTemplate;
|
import org.springframework.data.redis.core.RedisTemplate;
|
||||||
import org.springframework.data.redis.core.ZSetOperations;
|
import org.springframework.data.redis.core.ZSetOperations;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
@@ -3,7 +3,7 @@
|
|||||||
// (powered by FernFlower decompiler)
|
// (powered by FernFlower decompiler)
|
||||||
//
|
//
|
||||||
|
|
||||||
package com.szxgl.vote2021.utils;
|
package com.szxgl.pars2021.utils;
|
||||||
|
|
||||||
import java.nio.charset.StandardCharsets;
|
import java.nio.charset.StandardCharsets;
|
||||||
import org.apache.commons.lang3.StringUtils;
|
import org.apache.commons.lang3.StringUtils;
|
||||||
@@ -1,23 +1,17 @@
|
|||||||
package com.szxgl.vote2021.utils;
|
package com.szxgl.pars2021.utils;
|
||||||
|
|
||||||
import com.alibaba.fastjson.JSONObject;
|
|
||||||
import com.aliyun.oss.OSS;
|
import com.aliyun.oss.OSS;
|
||||||
import com.aliyun.oss.OSSClientBuilder;
|
import com.aliyun.oss.OSSClientBuilder;
|
||||||
import com.aliyun.oss.common.comm.ResponseMessage;
|
import com.aliyun.oss.common.comm.ResponseMessage;
|
||||||
import com.aliyun.oss.model.PutObjectResult;
|
import com.aliyun.oss.model.PutObjectResult;
|
||||||
import org.apache.http.protocol.HTTP;
|
import com.szxgl.pars2021.entity.UserDO;
|
||||||
import org.springframework.beans.factory.annotation.Value;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.springframework.web.multipart.MultipartFile;
|
|
||||||
|
|
||||||
import java.io.File;
|
|
||||||
import java.io.FileInputStream;
|
|
||||||
import java.io.FileNotFoundException;
|
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
import java.text.SimpleDateFormat;
|
import java.text.SimpleDateFormat;
|
||||||
import java.util.Date;
|
import java.util.*;
|
||||||
import java.util.Random;
|
|
||||||
import java.util.UUID;
|
|
||||||
|
|
||||||
|
@Slf4j
|
||||||
public class UploadFileToOssUtil {
|
public class UploadFileToOssUtil {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -30,15 +24,15 @@ public class UploadFileToOssUtil {
|
|||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
|
|
||||||
private static final String endpoint = "oss-cn-hangzhou.aliyuncs.com";
|
private static final String endpoint = "oss-cn-shenzhen.aliyuncs.com";
|
||||||
|
|
||||||
private static final String accessKeyId = "LTAI4G88mJUn3YzWo2eFmxVG";
|
private static final String accessKeyId = "sSJ5t0yC1CaKhPJ4";
|
||||||
|
|
||||||
private static final String accessKeySecret = "iWNQskqvXC7Rm0au2W2u3AGNFEgYMl";
|
private static final String accessKeySecret = "PsbdUTexU95BkiqO4ADELXpIaYdWGk";
|
||||||
|
|
||||||
private static final String bucketName = "h5buckets";
|
private static final String bucketName = "qiween";
|
||||||
|
|
||||||
private static final String bucketDomain = "h5buckets.oss-cn-hangzhou.aliyuncs.com";
|
private static final String bucketDomain = "qiween.oss-cn-hangzhou.aliyuncs.com";
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -50,7 +44,6 @@ public class UploadFileToOssUtil {
|
|||||||
*/
|
*/
|
||||||
public static R uploadFileToOss(InputStream inputStream, String originalName) {
|
public static R uploadFileToOss(InputStream inputStream, String originalName) {
|
||||||
|
|
||||||
|
|
||||||
// 创建OSSClient实例。
|
// 创建OSSClient实例。
|
||||||
OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
|
OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
|
||||||
|
|
||||||
@@ -70,8 +63,8 @@ public class UploadFileToOssUtil {
|
|||||||
//String objectName = "h5-in/"+folderName + "/" + fileMainName + extensionName;
|
//String objectName = "h5-in/"+folderName + "/" + fileMainName + extensionName;
|
||||||
|
|
||||||
//使用目录、文件主体名称、文件扩展名称拼接得到对象名称 (普通输入路径)
|
//使用目录、文件主体名称、文件扩展名称拼接得到对象名称 (普通输入路径)
|
||||||
String objectName = "h5-upload/"+folderName + "/" + fileMainName + extensionName;
|
String objectName = "kaimh/"+folderName + "/" + fileMainName + extensionName;
|
||||||
|
log.info("输入路径:"+objectName);
|
||||||
System.out.println(objectName);
|
System.out.println(objectName);
|
||||||
|
|
||||||
try {
|
try {
|
||||||
@@ -129,4 +122,54 @@ public class UploadFileToOssUtil {
|
|||||||
String msg = r.get("msg").toString();
|
String msg = r.get("msg").toString();
|
||||||
}*/
|
}*/
|
||||||
|
|
||||||
|
public static void main(String[] args) {
|
||||||
|
/* List list = new ArrayList();
|
||||||
|
List<Integer> news = new ArrayList();
|
||||||
|
Map<Integer,String> hashMap = new HashMap();
|
||||||
|
for (int i = 0; i < 20; i++) {
|
||||||
|
list.add(i);
|
||||||
|
}
|
||||||
|
System.out.println(list);
|
||||||
|
int size = 0;
|
||||||
|
if(list.size() > 8 ){
|
||||||
|
size = list.subList(8, list.size()).size();
|
||||||
|
while (hashMap.size() < size) {
|
||||||
|
List<Integer> list1 = list.subList(8, list.size());
|
||||||
|
int random = (int)(Math.random() * list1.size());
|
||||||
|
if (!hashMap.containsKey(random)) {
|
||||||
|
hashMap.put(random, "");
|
||||||
|
news.add(list1.get(random));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}else if(list.size() > 1){
|
||||||
|
List nickname = list.subList(1, list.size());
|
||||||
|
news.addAll(nickname);
|
||||||
|
}
|
||||||
|
System.out.println(news);*/
|
||||||
|
String name = "image/jpeg";
|
||||||
|
System.out.println(name.substring(name.lastIndexOf("/")+1));
|
||||||
|
UserDO user = new UserDO();
|
||||||
|
user.setNickname("张三");
|
||||||
|
user.setCreateTime(new Date());
|
||||||
|
|
||||||
|
UserDO user1 = new UserDO();
|
||||||
|
user1.setNickname("李四");
|
||||||
|
user.setCreateTime(new Date());
|
||||||
|
|
||||||
|
UserDO user2 = new UserDO();
|
||||||
|
user2.setNickname("王五");
|
||||||
|
user.setCreateTime(new Date());
|
||||||
|
|
||||||
|
UserDO user3 = new UserDO();
|
||||||
|
user3.setNickname("赵六");
|
||||||
|
user3.setCreateTime(new Date());
|
||||||
|
List list = new ArrayList();
|
||||||
|
list.add(user);
|
||||||
|
list.add(user1);
|
||||||
|
list.add(user2);
|
||||||
|
list.add(user3);
|
||||||
|
list.sort(Comparator.comparing(UserDO::getNickname));
|
||||||
|
System.out.println(list);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
package com.szxgl.vote2021.utils;
|
package com.szxgl.pars2021.utils;
|
||||||
|
|
||||||
import javax.imageio.ImageIO;
|
import javax.imageio.ImageIO;
|
||||||
import javax.servlet.http.HttpServletRequest;
|
import javax.servlet.http.HttpServletRequest;
|
||||||
@@ -12,7 +12,7 @@ import java.util.Random;
|
|||||||
|
|
||||||
|
|
||||||
public class VerifyUtil {
|
public class VerifyUtil {
|
||||||
public static final String RANDOMCODEKEY= "RANDOMREDISKEY";//放到session中的key
|
public static final String RANDOMCODEKEY= "2021_pars_h5:code:RANDOMREDISKEY";//放到session中的key
|
||||||
private String randString = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";//随机产生数字与字母组合的字符串
|
private String randString = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";//随机产生数字与字母组合的字符串
|
||||||
private int width = 95;// 图片宽
|
private int width = 95;// 图片宽
|
||||||
private int height = 25;// 图片高
|
private int height = 25;// 图片高
|
||||||
@@ -1,22 +0,0 @@
|
|||||||
package com.szxgl.vote2021.config;
|
|
||||||
|
|
||||||
import org.springframework.context.annotation.Bean;
|
|
||||||
import org.springframework.context.annotation.Configuration;
|
|
||||||
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
|
|
||||||
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
|
|
||||||
//@Configuration
|
|
||||||
//public class InterceptorConfig implements WebMvcConfigurer {
|
|
||||||
//
|
|
||||||
//// @Bean
|
|
||||||
// NorsInterceptor getNorsInterceptor() {
|
|
||||||
// return new NorsInterceptor();
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// @Override
|
|
||||||
// public void addInterceptors(InterceptorRegistry registry) {
|
|
||||||
//
|
|
||||||
// // 跨域拦截器放在最上面
|
|
||||||
// registry.addInterceptor(getNorsInterceptor())
|
|
||||||
// .addPathPatterns("/**");
|
|
||||||
// }
|
|
||||||
//}
|
|
||||||
@@ -1,32 +0,0 @@
|
|||||||
package com.szxgl.vote2021.config;
|
|
||||||
|
|
||||||
import lombok.extern.slf4j.Slf4j;
|
|
||||||
import org.springframework.http.HttpMethod;
|
|
||||||
import org.springframework.http.HttpStatus;
|
|
||||||
import org.springframework.web.servlet.HandlerInterceptor;
|
|
||||||
|
|
||||||
import javax.servlet.http.HttpServletRequest;
|
|
||||||
import javax.servlet.http.HttpServletResponse;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 跨域拦截器的配置
|
|
||||||
*/
|
|
||||||
//@Slf4j
|
|
||||||
//public class NorsInterceptor implements HandlerInterceptor {
|
|
||||||
// @Override
|
|
||||||
// public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
|
|
||||||
// response.setHeader("Access-Control-Allow-Origin", request.getHeader("Referer"));
|
|
||||||
// response.setHeader("Access-Control-Allow-Credentials", "true");
|
|
||||||
// response.setHeader("Access-Control-Allow-Methods", "GET, HEAD, POST, PUT, PATCH, DELETE, OPTIONS");
|
|
||||||
// response.setHeader("Access-Control-Max-Age", "86400");
|
|
||||||
// response.setHeader("Access-Control-Allow-Headers", "*");
|
|
||||||
//
|
|
||||||
// // 如果是OPTIONS则结束请求
|
|
||||||
// if (HttpMethod.OPTIONS.toString().equals(request.getMethod())) {
|
|
||||||
// response.setStatus(HttpStatus.NO_CONTENT.value());
|
|
||||||
// return false;
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// return true;
|
|
||||||
// }
|
|
||||||
//}
|
|
||||||
@@ -1,12 +0,0 @@
|
|||||||
package com.szxgl.vote2021.mapper;
|
|
||||||
|
|
||||||
import org.apache.ibatis.annotations.Mapper;
|
|
||||||
import org.apache.ibatis.annotations.Param;
|
|
||||||
|
|
||||||
@Mapper
|
|
||||||
public interface PraiseMapper2 {
|
|
||||||
|
|
||||||
Integer getPraiseStatus(@Param("openid") String openid,
|
|
||||||
@Param("worksId") Integer worksId);
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,13 +0,0 @@
|
|||||||
package com.szxgl.vote2021.mapper;
|
|
||||||
|
|
||||||
import com.szxgl.vote2021.entity.UserWorks;
|
|
||||||
import org.apache.ibatis.annotations.Mapper;
|
|
||||||
|
|
||||||
@Mapper
|
|
||||||
public interface UserMapper2 {
|
|
||||||
|
|
||||||
UserWorks getUserWorks(String openid);
|
|
||||||
|
|
||||||
String getWorksUser(Integer worksId);
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,8 +0,0 @@
|
|||||||
package com.szxgl.vote2021.service;
|
|
||||||
|
|
||||||
public interface PraiseService {
|
|
||||||
|
|
||||||
void savePraise(String openid, Integer worksId);
|
|
||||||
|
|
||||||
Integer getPraiseStatus(String openid,Integer worksId);
|
|
||||||
}
|
|
||||||
@@ -1,5 +0,0 @@
|
|||||||
package com.szxgl.vote2021.service;
|
|
||||||
|
|
||||||
public interface RankingService {
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,114 +0,0 @@
|
|||||||
package com.szxgl.vote2021.service.impl;
|
|
||||||
|
|
||||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
|
||||||
import com.szxgl.vote2021.entity.PraiseDao;
|
|
||||||
import com.szxgl.vote2021.entity.UserDO;
|
|
||||||
import com.szxgl.vote2021.entity.UserWorks;
|
|
||||||
import com.szxgl.vote2021.entity.WorksDao;
|
|
||||||
import com.szxgl.vote2021.exception.ParameterException;
|
|
||||||
import com.szxgl.vote2021.mapper.PraiseMapper;
|
|
||||||
import com.szxgl.vote2021.mapper.PraiseMapper2;
|
|
||||||
import com.szxgl.vote2021.mapper.WorksMapper;
|
|
||||||
import com.szxgl.vote2021.mapper.WorksMapper2;
|
|
||||||
import com.szxgl.vote2021.service.PraiseService;
|
|
||||||
import com.szxgl.vote2021.utils.RedisUtil;
|
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
|
||||||
import org.springframework.stereotype.Service;
|
|
||||||
|
|
||||||
import java.text.SimpleDateFormat;
|
|
||||||
import java.util.Date;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
@Service
|
|
||||||
public class PraiseServiceImpl implements PraiseService {
|
|
||||||
|
|
||||||
@Autowired
|
|
||||||
private PraiseMapper praiseMapper;
|
|
||||||
|
|
||||||
@Autowired
|
|
||||||
private PraiseMapper2 praiseMapper2;
|
|
||||||
|
|
||||||
@Autowired
|
|
||||||
private WorksMapper worksMapper;
|
|
||||||
|
|
||||||
@Autowired
|
|
||||||
private WorksMapper2 worksMapper2;
|
|
||||||
|
|
||||||
@Autowired
|
|
||||||
private RedisUtil redisUtil;
|
|
||||||
|
|
||||||
//redis中作品排序的key
|
|
||||||
private static final String RANKING = "RANKING";
|
|
||||||
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void savePraise(String openid, Integer worksId) {
|
|
||||||
QueryWrapper<PraiseDao> wrapper = new QueryWrapper<>();
|
|
||||||
wrapper.eq("works_id",worksId);
|
|
||||||
wrapper.eq("openid",openid);
|
|
||||||
List<PraiseDao> praiseDaos = praiseMapper.selectList(wrapper);
|
|
||||||
System.out.println(praiseDaos);
|
|
||||||
|
|
||||||
PraiseDao praiseDao = new PraiseDao();
|
|
||||||
praiseDao.setOpenid(openid);
|
|
||||||
praiseDao.setWorksId(worksId);
|
|
||||||
praiseDao.setCreateTime(new Date());
|
|
||||||
|
|
||||||
//该用户没有点过赞
|
|
||||||
if(praiseDaos == null){
|
|
||||||
praiseMapper.insert(praiseDao);
|
|
||||||
//更新作品点赞总数
|
|
||||||
worksMapper2.updatePraiseNo(worksId);
|
|
||||||
}else {
|
|
||||||
String oldTime = "";
|
|
||||||
for (int i = 0; i < praiseDaos.size(); i++) {
|
|
||||||
if(i == praiseDaos.size()-1){
|
|
||||||
//判断该用户是否今天已点赞
|
|
||||||
oldTime = new SimpleDateFormat("yyyyMMdd").format(praiseDaos.get(i).getCreateTime()).replaceAll("-","");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
String newTime = new SimpleDateFormat("yyyyMMdd").format(new Date()).replaceAll("-","");
|
|
||||||
|
|
||||||
if(newTime.equals(oldTime)){
|
|
||||||
//今天已点赞
|
|
||||||
throw new ParameterException("您今天已点过赞,请明天再来点赞!");
|
|
||||||
}else {
|
|
||||||
//今天未点赞
|
|
||||||
praiseMapper.insert(praiseDao);
|
|
||||||
//更新作品点赞总数
|
|
||||||
worksMapper2.updatePraiseNo(worksId);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
QueryWrapper<WorksDao> wrapper2 = new QueryWrapper<>();
|
|
||||||
wrapper2.eq("id",worksId);
|
|
||||||
WorksDao worksDao = worksMapper.selectOne(wrapper2);
|
|
||||||
|
|
||||||
//更新redis中的缓存
|
|
||||||
if(redisUtil.getExpire(RANKING) == -1){
|
|
||||||
redisUtil.expire(RANKING,60 * 60 * 24 * 60);
|
|
||||||
}
|
|
||||||
//点赞数加1
|
|
||||||
redisUtil.incrScore(RANKING,worksDao.getOpenid(),1);
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Integer getPraiseStatus(String openid,Integer worksId) {
|
|
||||||
return praiseMapper2.getPraiseStatus(openid,worksId);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public static void main(String[] args) {
|
|
||||||
//String time = "2021-10-15 14:14:07";
|
|
||||||
//String substring = time.substring(0,time.lastIndexOf(" ")).replaceAll("-","");
|
|
||||||
String time = new SimpleDateFormat("yyyyMMdd").format(new Date()).replaceAll("-","");
|
|
||||||
String newTime = new SimpleDateFormat("yyyyMMdd").format(new Date()).replaceAll("-","");
|
|
||||||
if(time.equals(newTime)){
|
|
||||||
System.out.println("1111");
|
|
||||||
}
|
|
||||||
System.out.println(newTime);
|
|
||||||
System.out.println(time);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,16 +0,0 @@
|
|||||||
package com.szxgl.vote2021.service.impl;
|
|
||||||
|
|
||||||
import com.szxgl.vote2021.service.RankingService;
|
|
||||||
import com.szxgl.vote2021.utils.RedisUtil;
|
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
|
||||||
import org.springframework.stereotype.Service;
|
|
||||||
|
|
||||||
@Service
|
|
||||||
public class RankingServiceImpl implements RankingService {
|
|
||||||
|
|
||||||
@Autowired
|
|
||||||
private RedisUtil redisUtil;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,777 +0,0 @@
|
|||||||
// Copyright (c) 2006 Damien Miller <djm@mindrot.org>
|
|
||||||
//
|
|
||||||
// Permission to use, copy, modify, and distribute this software for any
|
|
||||||
// purpose with or without fee is hereby granted, provided that the above
|
|
||||||
// copyright notice and this permission notice appear in all copies.
|
|
||||||
//
|
|
||||||
// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
|
||||||
// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
|
||||||
// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
|
||||||
// ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
|
||||||
// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
|
||||||
// ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
|
||||||
// OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
|
||||||
|
|
||||||
package com.szxgl.vote2021.utils;
|
|
||||||
|
|
||||||
import java.io.UnsupportedEncodingException;
|
|
||||||
import java.security.SecureRandom;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* BCrypt implements OpenBSD-style Blowfish password hashing using
|
|
||||||
* the scheme described in "A Future-Adaptable Password Scheme" by
|
|
||||||
* Niels Provos and David Mazieres.
|
|
||||||
* <p>
|
|
||||||
* This password hashing system tries to thwart off-line password
|
|
||||||
* cracking using a computationally-intensive hashing algorithm,
|
|
||||||
* based on Bruce Schneier's Blowfish cipher. The work factor of
|
|
||||||
* the algorithm is parameterised, so it can be increased as
|
|
||||||
* computers get faster.
|
|
||||||
* <p>
|
|
||||||
* Usage is really simple. To hash a password for the first time,
|
|
||||||
* call the hashpw method with a random salt, like this:
|
|
||||||
* <p>
|
|
||||||
* <code>
|
|
||||||
* String pw_hash = BCrypt.hashpw(plain_password, BCrypt.gensalt()); <br />
|
|
||||||
* </code>
|
|
||||||
* <p>
|
|
||||||
* To check whether a plaintext password matches one that has been
|
|
||||||
* hashed previously, use the checkpw method:
|
|
||||||
* <p>
|
|
||||||
* <code>
|
|
||||||
* if (BCrypt.checkpw(candidate_password, stored_hash))<br />
|
|
||||||
* System.out.println("It matches");<br />
|
|
||||||
* else<br />
|
|
||||||
* System.out.println("It does not match");<br />
|
|
||||||
* </code>
|
|
||||||
* <p>
|
|
||||||
* The gensalt() method takes an optional parameter (log_rounds)
|
|
||||||
* that determines the computational complexity of the hashing:
|
|
||||||
* <p>
|
|
||||||
* <code>
|
|
||||||
* String strong_salt = BCrypt.gensalt(10)<br />
|
|
||||||
* String stronger_salt = BCrypt.gensalt(12)<br />
|
|
||||||
* </code>
|
|
||||||
* <p>
|
|
||||||
* The amount of work increases exponentially (2**log_rounds), so
|
|
||||||
* each increment is twice as much work. The default log_rounds is
|
|
||||||
* 10, and the valid range is 4 to 30.
|
|
||||||
*
|
|
||||||
* @author Damien Miller
|
|
||||||
* @version 0.2
|
|
||||||
*/
|
|
||||||
public class BCrypt {
|
|
||||||
// BCrypt parameters
|
|
||||||
private static final int GENSALT_DEFAULT_LOG2_ROUNDS = 10;
|
|
||||||
private static final int BCRYPT_SALT_LEN = 16;
|
|
||||||
|
|
||||||
// Blowfish parameters
|
|
||||||
private static final int BLOWFISH_NUM_ROUNDS = 16;
|
|
||||||
|
|
||||||
// Initial contents of key schedule
|
|
||||||
private static final int P_orig[] = {
|
|
||||||
0x243f6a88, 0x85a308d3, 0x13198a2e, 0x03707344,
|
|
||||||
0xa4093822, 0x299f31d0, 0x082efa98, 0xec4e6c89,
|
|
||||||
0x452821e6, 0x38d01377, 0xbe5466cf, 0x34e90c6c,
|
|
||||||
0xc0ac29b7, 0xc97c50dd, 0x3f84d5b5, 0xb5470917,
|
|
||||||
0x9216d5d9, 0x8979fb1b
|
|
||||||
};
|
|
||||||
private static final int S_orig[] = {
|
|
||||||
0xd1310ba6, 0x98dfb5ac, 0x2ffd72db, 0xd01adfb7,
|
|
||||||
0xb8e1afed, 0x6a267e96, 0xba7c9045, 0xf12c7f99,
|
|
||||||
0x24a19947, 0xb3916cf7, 0x0801f2e2, 0x858efc16,
|
|
||||||
0x636920d8, 0x71574e69, 0xa458fea3, 0xf4933d7e,
|
|
||||||
0x0d95748f, 0x728eb658, 0x718bcd58, 0x82154aee,
|
|
||||||
0x7b54a41d, 0xc25a59b5, 0x9c30d539, 0x2af26013,
|
|
||||||
0xc5d1b023, 0x286085f0, 0xca417918, 0xb8db38ef,
|
|
||||||
0x8e79dcb0, 0x603a180e, 0x6c9e0e8b, 0xb01e8a3e,
|
|
||||||
0xd71577c1, 0xbd314b27, 0x78af2fda, 0x55605c60,
|
|
||||||
0xe65525f3, 0xaa55ab94, 0x57489862, 0x63e81440,
|
|
||||||
0x55ca396a, 0x2aab10b6, 0xb4cc5c34, 0x1141e8ce,
|
|
||||||
0xa15486af, 0x7c72e993, 0xb3ee1411, 0x636fbc2a,
|
|
||||||
0x2ba9c55d, 0x741831f6, 0xce5c3e16, 0x9b87931e,
|
|
||||||
0xafd6ba33, 0x6c24cf5c, 0x7a325381, 0x28958677,
|
|
||||||
0x3b8f4898, 0x6b4bb9af, 0xc4bfe81b, 0x66282193,
|
|
||||||
0x61d809cc, 0xfb21a991, 0x487cac60, 0x5dec8032,
|
|
||||||
0xef845d5d, 0xe98575b1, 0xdc262302, 0xeb651b88,
|
|
||||||
0x23893e81, 0xd396acc5, 0x0f6d6ff3, 0x83f44239,
|
|
||||||
0x2e0b4482, 0xa4842004, 0x69c8f04a, 0x9e1f9b5e,
|
|
||||||
0x21c66842, 0xf6e96c9a, 0x670c9c61, 0xabd388f0,
|
|
||||||
0x6a51a0d2, 0xd8542f68, 0x960fa728, 0xab5133a3,
|
|
||||||
0x6eef0b6c, 0x137a3be4, 0xba3bf050, 0x7efb2a98,
|
|
||||||
0xa1f1651d, 0x39af0176, 0x66ca593e, 0x82430e88,
|
|
||||||
0x8cee8619, 0x456f9fb4, 0x7d84a5c3, 0x3b8b5ebe,
|
|
||||||
0xe06f75d8, 0x85c12073, 0x401a449f, 0x56c16aa6,
|
|
||||||
0x4ed3aa62, 0x363f7706, 0x1bfedf72, 0x429b023d,
|
|
||||||
0x37d0d724, 0xd00a1248, 0xdb0fead3, 0x49f1c09b,
|
|
||||||
0x075372c9, 0x80991b7b, 0x25d479d8, 0xf6e8def7,
|
|
||||||
0xe3fe501a, 0xb6794c3b, 0x976ce0bd, 0x04c006ba,
|
|
||||||
0xc1a94fb6, 0x409f60c4, 0x5e5c9ec2, 0x196a2463,
|
|
||||||
0x68fb6faf, 0x3e6c53b5, 0x1339b2eb, 0x3b52ec6f,
|
|
||||||
0x6dfc511f, 0x9b30952c, 0xcc814544, 0xaf5ebd09,
|
|
||||||
0xbee3d004, 0xde334afd, 0x660f2807, 0x192e4bb3,
|
|
||||||
0xc0cba857, 0x45c8740f, 0xd20b5f39, 0xb9d3fbdb,
|
|
||||||
0x5579c0bd, 0x1a60320a, 0xd6a100c6, 0x402c7279,
|
|
||||||
0x679f25fe, 0xfb1fa3cc, 0x8ea5e9f8, 0xdb3222f8,
|
|
||||||
0x3c7516df, 0xfd616b15, 0x2f501ec8, 0xad0552ab,
|
|
||||||
0x323db5fa, 0xfd238760, 0x53317b48, 0x3e00df82,
|
|
||||||
0x9e5c57bb, 0xca6f8ca0, 0x1a87562e, 0xdf1769db,
|
|
||||||
0xd542a8f6, 0x287effc3, 0xac6732c6, 0x8c4f5573,
|
|
||||||
0x695b27b0, 0xbbca58c8, 0xe1ffa35d, 0xb8f011a0,
|
|
||||||
0x10fa3d98, 0xfd2183b8, 0x4afcb56c, 0x2dd1d35b,
|
|
||||||
0x9a53e479, 0xb6f84565, 0xd28e49bc, 0x4bfb9790,
|
|
||||||
0xe1ddf2da, 0xa4cb7e33, 0x62fb1341, 0xcee4c6e8,
|
|
||||||
0xef20cada, 0x36774c01, 0xd07e9efe, 0x2bf11fb4,
|
|
||||||
0x95dbda4d, 0xae909198, 0xeaad8e71, 0x6b93d5a0,
|
|
||||||
0xd08ed1d0, 0xafc725e0, 0x8e3c5b2f, 0x8e7594b7,
|
|
||||||
0x8ff6e2fb, 0xf2122b64, 0x8888b812, 0x900df01c,
|
|
||||||
0x4fad5ea0, 0x688fc31c, 0xd1cff191, 0xb3a8c1ad,
|
|
||||||
0x2f2f2218, 0xbe0e1777, 0xea752dfe, 0x8b021fa1,
|
|
||||||
0xe5a0cc0f, 0xb56f74e8, 0x18acf3d6, 0xce89e299,
|
|
||||||
0xb4a84fe0, 0xfd13e0b7, 0x7cc43b81, 0xd2ada8d9,
|
|
||||||
0x165fa266, 0x80957705, 0x93cc7314, 0x211a1477,
|
|
||||||
0xe6ad2065, 0x77b5fa86, 0xc75442f5, 0xfb9d35cf,
|
|
||||||
0xebcdaf0c, 0x7b3e89a0, 0xd6411bd3, 0xae1e7e49,
|
|
||||||
0x00250e2d, 0x2071b35e, 0x226800bb, 0x57b8e0af,
|
|
||||||
0x2464369b, 0xf009b91e, 0x5563911d, 0x59dfa6aa,
|
|
||||||
0x78c14389, 0xd95a537f, 0x207d5ba2, 0x02e5b9c5,
|
|
||||||
0x83260376, 0x6295cfa9, 0x11c81968, 0x4e734a41,
|
|
||||||
0xb3472dca, 0x7b14a94a, 0x1b510052, 0x9a532915,
|
|
||||||
0xd60f573f, 0xbc9bc6e4, 0x2b60a476, 0x81e67400,
|
|
||||||
0x08ba6fb5, 0x571be91f, 0xf296ec6b, 0x2a0dd915,
|
|
||||||
0xb6636521, 0xe7b9f9b6, 0xff34052e, 0xc5855664,
|
|
||||||
0x53b02d5d, 0xa99f8fa1, 0x08ba4799, 0x6e85076a,
|
|
||||||
0x4b7a70e9, 0xb5b32944, 0xdb75092e, 0xc4192623,
|
|
||||||
0xad6ea6b0, 0x49a7df7d, 0x9cee60b8, 0x8fedb266,
|
|
||||||
0xecaa8c71, 0x699a17ff, 0x5664526c, 0xc2b19ee1,
|
|
||||||
0x193602a5, 0x75094c29, 0xa0591340, 0xe4183a3e,
|
|
||||||
0x3f54989a, 0x5b429d65, 0x6b8fe4d6, 0x99f73fd6,
|
|
||||||
0xa1d29c07, 0xefe830f5, 0x4d2d38e6, 0xf0255dc1,
|
|
||||||
0x4cdd2086, 0x8470eb26, 0x6382e9c6, 0x021ecc5e,
|
|
||||||
0x09686b3f, 0x3ebaefc9, 0x3c971814, 0x6b6a70a1,
|
|
||||||
0x687f3584, 0x52a0e286, 0xb79c5305, 0xaa500737,
|
|
||||||
0x3e07841c, 0x7fdeae5c, 0x8e7d44ec, 0x5716f2b8,
|
|
||||||
0xb03ada37, 0xf0500c0d, 0xf01c1f04, 0x0200b3ff,
|
|
||||||
0xae0cf51a, 0x3cb574b2, 0x25837a58, 0xdc0921bd,
|
|
||||||
0xd19113f9, 0x7ca92ff6, 0x94324773, 0x22f54701,
|
|
||||||
0x3ae5e581, 0x37c2dadc, 0xc8b57634, 0x9af3dda7,
|
|
||||||
0xa9446146, 0x0fd0030e, 0xecc8c73e, 0xa4751e41,
|
|
||||||
0xe238cd99, 0x3bea0e2f, 0x3280bba1, 0x183eb331,
|
|
||||||
0x4e548b38, 0x4f6db908, 0x6f420d03, 0xf60a04bf,
|
|
||||||
0x2cb81290, 0x24977c79, 0x5679b072, 0xbcaf89af,
|
|
||||||
0xde9a771f, 0xd9930810, 0xb38bae12, 0xdccf3f2e,
|
|
||||||
0x5512721f, 0x2e6b7124, 0x501adde6, 0x9f84cd87,
|
|
||||||
0x7a584718, 0x7408da17, 0xbc9f9abc, 0xe94b7d8c,
|
|
||||||
0xec7aec3a, 0xdb851dfa, 0x63094366, 0xc464c3d2,
|
|
||||||
0xef1c1847, 0x3215d908, 0xdd433b37, 0x24c2ba16,
|
|
||||||
0x12a14d43, 0x2a65c451, 0x50940002, 0x133ae4dd,
|
|
||||||
0x71dff89e, 0x10314e55, 0x81ac77d6, 0x5f11199b,
|
|
||||||
0x043556f1, 0xd7a3c76b, 0x3c11183b, 0x5924a509,
|
|
||||||
0xf28fe6ed, 0x97f1fbfa, 0x9ebabf2c, 0x1e153c6e,
|
|
||||||
0x86e34570, 0xeae96fb1, 0x860e5e0a, 0x5a3e2ab3,
|
|
||||||
0x771fe71c, 0x4e3d06fa, 0x2965dcb9, 0x99e71d0f,
|
|
||||||
0x803e89d6, 0x5266c825, 0x2e4cc978, 0x9c10b36a,
|
|
||||||
0xc6150eba, 0x94e2ea78, 0xa5fc3c53, 0x1e0a2df4,
|
|
||||||
0xf2f74ea7, 0x361d2b3d, 0x1939260f, 0x19c27960,
|
|
||||||
0x5223a708, 0xf71312b6, 0xebadfe6e, 0xeac31f66,
|
|
||||||
0xe3bc4595, 0xa67bc883, 0xb17f37d1, 0x018cff28,
|
|
||||||
0xc332ddef, 0xbe6c5aa5, 0x65582185, 0x68ab9802,
|
|
||||||
0xeecea50f, 0xdb2f953b, 0x2aef7dad, 0x5b6e2f84,
|
|
||||||
0x1521b628, 0x29076170, 0xecdd4775, 0x619f1510,
|
|
||||||
0x13cca830, 0xeb61bd96, 0x0334fe1e, 0xaa0363cf,
|
|
||||||
0xb5735c90, 0x4c70a239, 0xd59e9e0b, 0xcbaade14,
|
|
||||||
0xeecc86bc, 0x60622ca7, 0x9cab5cab, 0xb2f3846e,
|
|
||||||
0x648b1eaf, 0x19bdf0ca, 0xa02369b9, 0x655abb50,
|
|
||||||
0x40685a32, 0x3c2ab4b3, 0x319ee9d5, 0xc021b8f7,
|
|
||||||
0x9b540b19, 0x875fa099, 0x95f7997e, 0x623d7da8,
|
|
||||||
0xf837889a, 0x97e32d77, 0x11ed935f, 0x16681281,
|
|
||||||
0x0e358829, 0xc7e61fd6, 0x96dedfa1, 0x7858ba99,
|
|
||||||
0x57f584a5, 0x1b227263, 0x9b83c3ff, 0x1ac24696,
|
|
||||||
0xcdb30aeb, 0x532e3054, 0x8fd948e4, 0x6dbc3128,
|
|
||||||
0x58ebf2ef, 0x34c6ffea, 0xfe28ed61, 0xee7c3c73,
|
|
||||||
0x5d4a14d9, 0xe864b7e3, 0x42105d14, 0x203e13e0,
|
|
||||||
0x45eee2b6, 0xa3aaabea, 0xdb6c4f15, 0xfacb4fd0,
|
|
||||||
0xc742f442, 0xef6abbb5, 0x654f3b1d, 0x41cd2105,
|
|
||||||
0xd81e799e, 0x86854dc7, 0xe44b476a, 0x3d816250,
|
|
||||||
0xcf62a1f2, 0x5b8d2646, 0xfc8883a0, 0xc1c7b6a3,
|
|
||||||
0x7f1524c3, 0x69cb7492, 0x47848a0b, 0x5692b285,
|
|
||||||
0x095bbf00, 0xad19489d, 0x1462b174, 0x23820e00,
|
|
||||||
0x58428d2a, 0x0c55f5ea, 0x1dadf43e, 0x233f7061,
|
|
||||||
0x3372f092, 0x8d937e41, 0xd65fecf1, 0x6c223bdb,
|
|
||||||
0x7cde3759, 0xcbee7460, 0x4085f2a7, 0xce77326e,
|
|
||||||
0xa6078084, 0x19f8509e, 0xe8efd855, 0x61d99735,
|
|
||||||
0xa969a7aa, 0xc50c06c2, 0x5a04abfc, 0x800bcadc,
|
|
||||||
0x9e447a2e, 0xc3453484, 0xfdd56705, 0x0e1e9ec9,
|
|
||||||
0xdb73dbd3, 0x105588cd, 0x675fda79, 0xe3674340,
|
|
||||||
0xc5c43465, 0x713e38d8, 0x3d28f89e, 0xf16dff20,
|
|
||||||
0x153e21e7, 0x8fb03d4a, 0xe6e39f2b, 0xdb83adf7,
|
|
||||||
0xe93d5a68, 0x948140f7, 0xf64c261c, 0x94692934,
|
|
||||||
0x411520f7, 0x7602d4f7, 0xbcf46b2e, 0xd4a20068,
|
|
||||||
0xd4082471, 0x3320f46a, 0x43b7d4b7, 0x500061af,
|
|
||||||
0x1e39f62e, 0x97244546, 0x14214f74, 0xbf8b8840,
|
|
||||||
0x4d95fc1d, 0x96b591af, 0x70f4ddd3, 0x66a02f45,
|
|
||||||
0xbfbc09ec, 0x03bd9785, 0x7fac6dd0, 0x31cb8504,
|
|
||||||
0x96eb27b3, 0x55fd3941, 0xda2547e6, 0xabca0a9a,
|
|
||||||
0x28507825, 0x530429f4, 0x0a2c86da, 0xe9b66dfb,
|
|
||||||
0x68dc1462, 0xd7486900, 0x680ec0a4, 0x27a18dee,
|
|
||||||
0x4f3ffea2, 0xe887ad8c, 0xb58ce006, 0x7af4d6b6,
|
|
||||||
0xaace1e7c, 0xd3375fec, 0xce78a399, 0x406b2a42,
|
|
||||||
0x20fe9e35, 0xd9f385b9, 0xee39d7ab, 0x3b124e8b,
|
|
||||||
0x1dc9faf7, 0x4b6d1856, 0x26a36631, 0xeae397b2,
|
|
||||||
0x3a6efa74, 0xdd5b4332, 0x6841e7f7, 0xca7820fb,
|
|
||||||
0xfb0af54e, 0xd8feb397, 0x454056ac, 0xba489527,
|
|
||||||
0x55533a3a, 0x20838d87, 0xfe6ba9b7, 0xd096954b,
|
|
||||||
0x55a867bc, 0xa1159a58, 0xcca92963, 0x99e1db33,
|
|
||||||
0xa62a4a56, 0x3f3125f9, 0x5ef47e1c, 0x9029317c,
|
|
||||||
0xfdf8e802, 0x04272f70, 0x80bb155c, 0x05282ce3,
|
|
||||||
0x95c11548, 0xe4c66d22, 0x48c1133f, 0xc70f86dc,
|
|
||||||
0x07f9c9ee, 0x41041f0f, 0x404779a4, 0x5d886e17,
|
|
||||||
0x325f51eb, 0xd59bc0d1, 0xf2bcc18f, 0x41113564,
|
|
||||||
0x257b7834, 0x602a9c60, 0xdff8e8a3, 0x1f636c1b,
|
|
||||||
0x0e12b4c2, 0x02e1329e, 0xaf664fd1, 0xcad18115,
|
|
||||||
0x6b2395e0, 0x333e92e1, 0x3b240b62, 0xeebeb922,
|
|
||||||
0x85b2a20e, 0xe6ba0d99, 0xde720c8c, 0x2da2f728,
|
|
||||||
0xd0127845, 0x95b794fd, 0x647d0862, 0xe7ccf5f0,
|
|
||||||
0x5449a36f, 0x877d48fa, 0xc39dfd27, 0xf33e8d1e,
|
|
||||||
0x0a476341, 0x992eff74, 0x3a6f6eab, 0xf4f8fd37,
|
|
||||||
0xa812dc60, 0xa1ebddf8, 0x991be14c, 0xdb6e6b0d,
|
|
||||||
0xc67b5510, 0x6d672c37, 0x2765d43b, 0xdcd0e804,
|
|
||||||
0xf1290dc7, 0xcc00ffa3, 0xb5390f92, 0x690fed0b,
|
|
||||||
0x667b9ffb, 0xcedb7d9c, 0xa091cf0b, 0xd9155ea3,
|
|
||||||
0xbb132f88, 0x515bad24, 0x7b9479bf, 0x763bd6eb,
|
|
||||||
0x37392eb3, 0xcc115979, 0x8026e297, 0xf42e312d,
|
|
||||||
0x6842ada7, 0xc66a2b3b, 0x12754ccc, 0x782ef11c,
|
|
||||||
0x6a124237, 0xb79251e7, 0x06a1bbe6, 0x4bfb6350,
|
|
||||||
0x1a6b1018, 0x11caedfa, 0x3d25bdd8, 0xe2e1c3c9,
|
|
||||||
0x44421659, 0x0a121386, 0xd90cec6e, 0xd5abea2a,
|
|
||||||
0x64af674e, 0xda86a85f, 0xbebfe988, 0x64e4c3fe,
|
|
||||||
0x9dbc8057, 0xf0f7c086, 0x60787bf8, 0x6003604d,
|
|
||||||
0xd1fd8346, 0xf6381fb0, 0x7745ae04, 0xd736fccc,
|
|
||||||
0x83426b33, 0xf01eab71, 0xb0804187, 0x3c005e5f,
|
|
||||||
0x77a057be, 0xbde8ae24, 0x55464299, 0xbf582e61,
|
|
||||||
0x4e58f48f, 0xf2ddfda2, 0xf474ef38, 0x8789bdc2,
|
|
||||||
0x5366f9c3, 0xc8b38e74, 0xb475f255, 0x46fcd9b9,
|
|
||||||
0x7aeb2661, 0x8b1ddf84, 0x846a0e79, 0x915f95e2,
|
|
||||||
0x466e598e, 0x20b45770, 0x8cd55591, 0xc902de4c,
|
|
||||||
0xb90bace1, 0xbb8205d0, 0x11a86248, 0x7574a99e,
|
|
||||||
0xb77f19b6, 0xe0a9dc09, 0x662d09a1, 0xc4324633,
|
|
||||||
0xe85a1f02, 0x09f0be8c, 0x4a99a025, 0x1d6efe10,
|
|
||||||
0x1ab93d1d, 0x0ba5a4df, 0xa186f20f, 0x2868f169,
|
|
||||||
0xdcb7da83, 0x573906fe, 0xa1e2ce9b, 0x4fcd7f52,
|
|
||||||
0x50115e01, 0xa70683fa, 0xa002b5c4, 0x0de6d027,
|
|
||||||
0x9af88c27, 0x773f8641, 0xc3604c06, 0x61a806b5,
|
|
||||||
0xf0177a28, 0xc0f586e0, 0x006058aa, 0x30dc7d62,
|
|
||||||
0x11e69ed7, 0x2338ea63, 0x53c2dd94, 0xc2c21634,
|
|
||||||
0xbbcbee56, 0x90bcb6de, 0xebfc7da1, 0xce591d76,
|
|
||||||
0x6f05e409, 0x4b7c0188, 0x39720a3d, 0x7c927c24,
|
|
||||||
0x86e3725f, 0x724d9db9, 0x1ac15bb4, 0xd39eb8fc,
|
|
||||||
0xed545578, 0x08fca5b5, 0xd83d7cd3, 0x4dad0fc4,
|
|
||||||
0x1e50ef5e, 0xb161e6f8, 0xa28514d9, 0x6c51133c,
|
|
||||||
0x6fd5c7e7, 0x56e14ec4, 0x362abfce, 0xddc6c837,
|
|
||||||
0xd79a3234, 0x92638212, 0x670efa8e, 0x406000e0,
|
|
||||||
0x3a39ce37, 0xd3faf5cf, 0xabc27737, 0x5ac52d1b,
|
|
||||||
0x5cb0679e, 0x4fa33742, 0xd3822740, 0x99bc9bbe,
|
|
||||||
0xd5118e9d, 0xbf0f7315, 0xd62d1c7e, 0xc700c47b,
|
|
||||||
0xb78c1b6b, 0x21a19045, 0xb26eb1be, 0x6a366eb4,
|
|
||||||
0x5748ab2f, 0xbc946e79, 0xc6a376d2, 0x6549c2c8,
|
|
||||||
0x530ff8ee, 0x468dde7d, 0xd5730a1d, 0x4cd04dc6,
|
|
||||||
0x2939bbdb, 0xa9ba4650, 0xac9526e8, 0xbe5ee304,
|
|
||||||
0xa1fad5f0, 0x6a2d519a, 0x63ef8ce2, 0x9a86ee22,
|
|
||||||
0xc089c2b8, 0x43242ef6, 0xa51e03aa, 0x9cf2d0a4,
|
|
||||||
0x83c061ba, 0x9be96a4d, 0x8fe51550, 0xba645bd6,
|
|
||||||
0x2826a2f9, 0xa73a3ae1, 0x4ba99586, 0xef5562e9,
|
|
||||||
0xc72fefd3, 0xf752f7da, 0x3f046f69, 0x77fa0a59,
|
|
||||||
0x80e4a915, 0x87b08601, 0x9b09e6ad, 0x3b3ee593,
|
|
||||||
0xe990fd5a, 0x9e34d797, 0x2cf0b7d9, 0x022b8b51,
|
|
||||||
0x96d5ac3a, 0x017da67d, 0xd1cf3ed6, 0x7c7d2d28,
|
|
||||||
0x1f9f25cf, 0xadf2b89b, 0x5ad6b472, 0x5a88f54c,
|
|
||||||
0xe029ac71, 0xe019a5e6, 0x47b0acfd, 0xed93fa9b,
|
|
||||||
0xe8d3c48d, 0x283b57cc, 0xf8d56629, 0x79132e28,
|
|
||||||
0x785f0191, 0xed756055, 0xf7960e44, 0xe3d35e8c,
|
|
||||||
0x15056dd4, 0x88f46dba, 0x03a16125, 0x0564f0bd,
|
|
||||||
0xc3eb9e15, 0x3c9057a2, 0x97271aec, 0xa93a072a,
|
|
||||||
0x1b3f6d9b, 0x1e6321f5, 0xf59c66fb, 0x26dcf319,
|
|
||||||
0x7533d928, 0xb155fdf5, 0x03563482, 0x8aba3cbb,
|
|
||||||
0x28517711, 0xc20ad9f8, 0xabcc5167, 0xccad925f,
|
|
||||||
0x4de81751, 0x3830dc8e, 0x379d5862, 0x9320f991,
|
|
||||||
0xea7a90c2, 0xfb3e7bce, 0x5121ce64, 0x774fbe32,
|
|
||||||
0xa8b6e37e, 0xc3293d46, 0x48de5369, 0x6413e680,
|
|
||||||
0xa2ae0810, 0xdd6db224, 0x69852dfd, 0x09072166,
|
|
||||||
0xb39a460a, 0x6445c0dd, 0x586cdecf, 0x1c20c8ae,
|
|
||||||
0x5bbef7dd, 0x1b588d40, 0xccd2017f, 0x6bb4e3bb,
|
|
||||||
0xdda26a7e, 0x3a59ff45, 0x3e350a44, 0xbcb4cdd5,
|
|
||||||
0x72eacea8, 0xfa6484bb, 0x8d6612ae, 0xbf3c6f47,
|
|
||||||
0xd29be463, 0x542f5d9e, 0xaec2771b, 0xf64e6370,
|
|
||||||
0x740e0d8d, 0xe75b1357, 0xf8721671, 0xaf537d5d,
|
|
||||||
0x4040cb08, 0x4eb4e2cc, 0x34d2466a, 0x0115af84,
|
|
||||||
0xe1b00428, 0x95983a1d, 0x06b89fb4, 0xce6ea048,
|
|
||||||
0x6f3f3b82, 0x3520ab82, 0x011a1d4b, 0x277227f8,
|
|
||||||
0x611560b1, 0xe7933fdc, 0xbb3a792b, 0x344525bd,
|
|
||||||
0xa08839e1, 0x51ce794b, 0x2f32c9b7, 0xa01fbac9,
|
|
||||||
0xe01cc87e, 0xbcc7d1f6, 0xcf0111c3, 0xa1e8aac7,
|
|
||||||
0x1a908749, 0xd44fbd9a, 0xd0dadecb, 0xd50ada38,
|
|
||||||
0x0339c32a, 0xc6913667, 0x8df9317c, 0xe0b12b4f,
|
|
||||||
0xf79e59b7, 0x43f5bb3a, 0xf2d519ff, 0x27d9459c,
|
|
||||||
0xbf97222c, 0x15e6fc2a, 0x0f91fc71, 0x9b941525,
|
|
||||||
0xfae59361, 0xceb69ceb, 0xc2a86459, 0x12baa8d1,
|
|
||||||
0xb6c1075e, 0xe3056a0c, 0x10d25065, 0xcb03a442,
|
|
||||||
0xe0ec6e0e, 0x1698db3b, 0x4c98a0be, 0x3278e964,
|
|
||||||
0x9f1f9532, 0xe0d392df, 0xd3a0342b, 0x8971f21e,
|
|
||||||
0x1b0a7441, 0x4ba3348c, 0xc5be7120, 0xc37632d8,
|
|
||||||
0xdf359f8d, 0x9b992f2e, 0xe60b6f47, 0x0fe3f11d,
|
|
||||||
0xe54cda54, 0x1edad891, 0xce6279cf, 0xcd3e7e6f,
|
|
||||||
0x1618b166, 0xfd2c1d05, 0x848fd2c5, 0xf6fb2299,
|
|
||||||
0xf523f357, 0xa6327623, 0x93a83531, 0x56cccd02,
|
|
||||||
0xacf08162, 0x5a75ebb5, 0x6e163697, 0x88d273cc,
|
|
||||||
0xde966292, 0x81b949d0, 0x4c50901b, 0x71c65614,
|
|
||||||
0xe6c6c7bd, 0x327a140a, 0x45e1d006, 0xc3f27b9a,
|
|
||||||
0xc9aa53fd, 0x62a80f00, 0xbb25bfe2, 0x35bdd2f6,
|
|
||||||
0x71126905, 0xb2040222, 0xb6cbcf7c, 0xcd769c2b,
|
|
||||||
0x53113ec0, 0x1640e3d3, 0x38abbd60, 0x2547adf0,
|
|
||||||
0xba38209c, 0xf746ce76, 0x77afa1c5, 0x20756060,
|
|
||||||
0x85cbfe4e, 0x8ae88dd8, 0x7aaaf9b0, 0x4cf9aa7e,
|
|
||||||
0x1948c25c, 0x02fb8a8c, 0x01c36ae4, 0xd6ebe1f9,
|
|
||||||
0x90d4f869, 0xa65cdea0, 0x3f09252d, 0xc208e69f,
|
|
||||||
0xb74e6132, 0xce77e25b, 0x578fdfe3, 0x3ac372e6
|
|
||||||
};
|
|
||||||
|
|
||||||
// bcrypt IV: "OrpheanBeholderScryDoubt". The C implementation calls
|
|
||||||
// this "ciphertext", but it is really plaintext or an IV. We keep
|
|
||||||
// the name to make code comparison easier.
|
|
||||||
static private final int bf_crypt_ciphertext[] = {
|
|
||||||
0x4f727068, 0x65616e42, 0x65686f6c,
|
|
||||||
0x64657253, 0x63727944, 0x6f756274
|
|
||||||
};
|
|
||||||
|
|
||||||
// Table for Base64 encoding
|
|
||||||
static private final char base64_code[] = {
|
|
||||||
'.', '/', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J',
|
|
||||||
'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V',
|
|
||||||
'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h',
|
|
||||||
'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't',
|
|
||||||
'u', 'v', 'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5',
|
|
||||||
'6', '7', '8', '9'
|
|
||||||
};
|
|
||||||
|
|
||||||
// Table for Base64 decoding
|
|
||||||
static private final byte index_64[] = {
|
|
||||||
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
|
||||||
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
|
||||||
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
|
||||||
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
|
||||||
-1, -1, -1, -1, -1, -1, 0, 1, 54, 55,
|
|
||||||
56, 57, 58, 59, 60, 61, 62, 63, -1, -1,
|
|
||||||
-1, -1, -1, -1, -1, 2, 3, 4, 5, 6,
|
|
||||||
7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
|
|
||||||
17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27,
|
|
||||||
-1, -1, -1, -1, -1, -1, 28, 29, 30,
|
|
||||||
31, 32, 33, 34, 35, 36, 37, 38, 39, 40,
|
|
||||||
41, 42, 43, 44, 45, 46, 47, 48, 49, 50,
|
|
||||||
51, 52, 53, -1, -1, -1, -1, -1
|
|
||||||
};
|
|
||||||
|
|
||||||
// Expanded Blowfish key
|
|
||||||
private int P[];
|
|
||||||
private int S[];
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Encode a byte array using bcrypt's slightly-modified base64
|
|
||||||
* encoding scheme. Note that this is *not* compatible with
|
|
||||||
* the standard MIME-base64 encoding.
|
|
||||||
*
|
|
||||||
* @param d the byte array to encode
|
|
||||||
* @param len the number of bytes to encode
|
|
||||||
* @return base64-encoded string
|
|
||||||
* @exception IllegalArgumentException if the length is invalid
|
|
||||||
*/
|
|
||||||
private static String encode_base64(byte d[], int len)
|
|
||||||
throws IllegalArgumentException {
|
|
||||||
int off = 0;
|
|
||||||
StringBuffer rs = new StringBuffer();
|
|
||||||
int c1, c2;
|
|
||||||
|
|
||||||
if (len <= 0 || len > d.length)
|
|
||||||
throw new IllegalArgumentException ("Invalid len");
|
|
||||||
|
|
||||||
while (off < len) {
|
|
||||||
c1 = d[off++] & 0xff;
|
|
||||||
rs.append(base64_code[(c1 >> 2) & 0x3f]);
|
|
||||||
c1 = (c1 & 0x03) << 4;
|
|
||||||
if (off >= len) {
|
|
||||||
rs.append(base64_code[c1 & 0x3f]);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
c2 = d[off++] & 0xff;
|
|
||||||
c1 |= (c2 >> 4) & 0x0f;
|
|
||||||
rs.append(base64_code[c1 & 0x3f]);
|
|
||||||
c1 = (c2 & 0x0f) << 2;
|
|
||||||
if (off >= len) {
|
|
||||||
rs.append(base64_code[c1 & 0x3f]);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
c2 = d[off++] & 0xff;
|
|
||||||
c1 |= (c2 >> 6) & 0x03;
|
|
||||||
rs.append(base64_code[c1 & 0x3f]);
|
|
||||||
rs.append(base64_code[c2 & 0x3f]);
|
|
||||||
}
|
|
||||||
return rs.toString();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Look up the 3 bits base64-encoded by the specified character,
|
|
||||||
* range-checking againt conversion table
|
|
||||||
* @param x the base64-encoded value
|
|
||||||
* @return the decoded value of x
|
|
||||||
*/
|
|
||||||
private static byte char64(char x) {
|
|
||||||
if ((int)x < 0 || (int)x > index_64.length)
|
|
||||||
return -1;
|
|
||||||
return index_64[(int)x];
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Decode a string encoded using bcrypt's base64 scheme to a
|
|
||||||
* byte array. Note that this is *not* compatible with
|
|
||||||
* the standard MIME-base64 encoding.
|
|
||||||
* @param s the string to decode
|
|
||||||
* @param maxolen the maximum number of bytes to decode
|
|
||||||
* @return an array containing the decoded bytes
|
|
||||||
* @throws IllegalArgumentException if maxolen is invalid
|
|
||||||
*/
|
|
||||||
private static byte[] decode_base64(String s, int maxolen)
|
|
||||||
throws IllegalArgumentException {
|
|
||||||
StringBuffer rs = new StringBuffer();
|
|
||||||
int off = 0, slen = s.length(), olen = 0;
|
|
||||||
byte ret[];
|
|
||||||
byte c1, c2, c3, c4, o;
|
|
||||||
|
|
||||||
if (maxolen <= 0)
|
|
||||||
throw new IllegalArgumentException ("Invalid maxolen");
|
|
||||||
|
|
||||||
while (off < slen - 1 && olen < maxolen) {
|
|
||||||
c1 = char64(s.charAt(off++));
|
|
||||||
c2 = char64(s.charAt(off++));
|
|
||||||
if (c1 == -1 || c2 == -1)
|
|
||||||
break;
|
|
||||||
o = (byte)(c1 << 2);
|
|
||||||
o |= (c2 & 0x30) >> 4;
|
|
||||||
rs.append((char)o);
|
|
||||||
if (++olen >= maxolen || off >= slen)
|
|
||||||
break;
|
|
||||||
c3 = char64(s.charAt(off++));
|
|
||||||
if (c3 == -1)
|
|
||||||
break;
|
|
||||||
o = (byte)((c2 & 0x0f) << 4);
|
|
||||||
o |= (c3 & 0x3c) >> 2;
|
|
||||||
rs.append((char)o);
|
|
||||||
if (++olen >= maxolen || off >= slen)
|
|
||||||
break;
|
|
||||||
c4 = char64(s.charAt(off++));
|
|
||||||
o = (byte)((c3 & 0x03) << 6);
|
|
||||||
o |= c4;
|
|
||||||
rs.append((char)o);
|
|
||||||
++olen;
|
|
||||||
}
|
|
||||||
|
|
||||||
ret = new byte[olen];
|
|
||||||
for (off = 0; off < olen; off++)
|
|
||||||
ret[off] = (byte)rs.charAt(off);
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Blowfish encipher a single 64-bit block encoded as
|
|
||||||
* two 32-bit halves
|
|
||||||
* @param lr an array containing the two 32-bit half blocks
|
|
||||||
* @param off the position in the array of the blocks
|
|
||||||
*/
|
|
||||||
private final void encipher(int lr[], int off) {
|
|
||||||
int i, n, l = lr[off], r = lr[off + 1];
|
|
||||||
|
|
||||||
l ^= P[0];
|
|
||||||
for (i = 0; i <= BLOWFISH_NUM_ROUNDS - 2;) {
|
|
||||||
// Feistel substitution on left word
|
|
||||||
n = S[(l >> 24) & 0xff];
|
|
||||||
n += S[0x100 | ((l >> 16) & 0xff)];
|
|
||||||
n ^= S[0x200 | ((l >> 8) & 0xff)];
|
|
||||||
n += S[0x300 | (l & 0xff)];
|
|
||||||
r ^= n ^ P[++i];
|
|
||||||
|
|
||||||
// Feistel substitution on right word
|
|
||||||
n = S[(r >> 24) & 0xff];
|
|
||||||
n += S[0x100 | ((r >> 16) & 0xff)];
|
|
||||||
n ^= S[0x200 | ((r >> 8) & 0xff)];
|
|
||||||
n += S[0x300 | (r & 0xff)];
|
|
||||||
l ^= n ^ P[++i];
|
|
||||||
}
|
|
||||||
lr[off] = r ^ P[BLOWFISH_NUM_ROUNDS + 1];
|
|
||||||
lr[off + 1] = l;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Cycically extract a word of key material
|
|
||||||
* @param data the string to extract the data from
|
|
||||||
* @param offp a "pointer" (as a one-entry array) to the
|
|
||||||
* current offset into data
|
|
||||||
* @return the next word of material from data
|
|
||||||
*/
|
|
||||||
private static int streamtoword(byte data[], int offp[]) {
|
|
||||||
int i;
|
|
||||||
int word = 0;
|
|
||||||
int off = offp[0];
|
|
||||||
|
|
||||||
for (i = 0; i < 4; i++) {
|
|
||||||
word = (word << 8) | (data[off] & 0xff);
|
|
||||||
off = (off + 1) % data.length;
|
|
||||||
}
|
|
||||||
|
|
||||||
offp[0] = off;
|
|
||||||
return word;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Initialise the Blowfish key schedule
|
|
||||||
*/
|
|
||||||
private void init_key() {
|
|
||||||
P = (int[])P_orig.clone();
|
|
||||||
S = (int[])S_orig.clone();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Key the Blowfish cipher
|
|
||||||
* @param key an array containing the key
|
|
||||||
*/
|
|
||||||
private void key(byte key[]) {
|
|
||||||
int i;
|
|
||||||
int koffp[] = { 0 };
|
|
||||||
int lr[] = { 0, 0 };
|
|
||||||
int plen = P.length, slen = S.length;
|
|
||||||
|
|
||||||
for (i = 0; i < plen; i++)
|
|
||||||
P[i] = P[i] ^ streamtoword(key, koffp);
|
|
||||||
|
|
||||||
for (i = 0; i < plen; i += 2) {
|
|
||||||
encipher(lr, 0);
|
|
||||||
P[i] = lr[0];
|
|
||||||
P[i + 1] = lr[1];
|
|
||||||
}
|
|
||||||
|
|
||||||
for (i = 0; i < slen; i += 2) {
|
|
||||||
encipher(lr, 0);
|
|
||||||
S[i] = lr[0];
|
|
||||||
S[i + 1] = lr[1];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Perform the "enhanced key schedule" step described by
|
|
||||||
* Provos and Mazieres in "A Future-Adaptable Password Scheme"
|
|
||||||
* http://www.openbsd.org/papers/bcrypt-paper.ps
|
|
||||||
* @param data salt information
|
|
||||||
* @param key password information
|
|
||||||
*/
|
|
||||||
private void ekskey(byte data[], byte key[]) {
|
|
||||||
int i;
|
|
||||||
int koffp[] = { 0 }, doffp[] = { 0 };
|
|
||||||
int lr[] = { 0, 0 };
|
|
||||||
int plen = P.length, slen = S.length;
|
|
||||||
|
|
||||||
for (i = 0; i < plen; i++)
|
|
||||||
P[i] = P[i] ^ streamtoword(key, koffp);
|
|
||||||
|
|
||||||
for (i = 0; i < plen; i += 2) {
|
|
||||||
lr[0] ^= streamtoword(data, doffp);
|
|
||||||
lr[1] ^= streamtoword(data, doffp);
|
|
||||||
encipher(lr, 0);
|
|
||||||
P[i] = lr[0];
|
|
||||||
P[i + 1] = lr[1];
|
|
||||||
}
|
|
||||||
|
|
||||||
for (i = 0; i < slen; i += 2) {
|
|
||||||
lr[0] ^= streamtoword(data, doffp);
|
|
||||||
lr[1] ^= streamtoword(data, doffp);
|
|
||||||
encipher(lr, 0);
|
|
||||||
S[i] = lr[0];
|
|
||||||
S[i + 1] = lr[1];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Perform the central password hashing step in the
|
|
||||||
* bcrypt scheme
|
|
||||||
* @param password the password to hash
|
|
||||||
* @param salt the binary salt to hash with the password
|
|
||||||
* @param log_rounds the binary logarithm of the number
|
|
||||||
* of rounds of hashing to apply
|
|
||||||
* @param cdata the plaintext to encrypt
|
|
||||||
* @return an array containing the binary hashed password
|
|
||||||
*/
|
|
||||||
public byte[] crypt_raw(byte password[], byte salt[], int log_rounds,
|
|
||||||
int cdata[]) {
|
|
||||||
int rounds, i, j;
|
|
||||||
int clen = cdata.length;
|
|
||||||
byte ret[];
|
|
||||||
|
|
||||||
if (log_rounds < 4 || log_rounds > 30)
|
|
||||||
throw new IllegalArgumentException ("Bad number of rounds");
|
|
||||||
rounds = 1 << log_rounds;
|
|
||||||
if (salt.length != BCRYPT_SALT_LEN)
|
|
||||||
throw new IllegalArgumentException ("Bad salt length");
|
|
||||||
|
|
||||||
init_key();
|
|
||||||
ekskey(salt, password);
|
|
||||||
for (i = 0; i != rounds; i++) {
|
|
||||||
key(password);
|
|
||||||
key(salt);
|
|
||||||
}
|
|
||||||
|
|
||||||
for (i = 0; i < 64; i++) {
|
|
||||||
for (j = 0; j < (clen >> 1); j++)
|
|
||||||
encipher(cdata, j << 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
ret = new byte[clen * 4];
|
|
||||||
for (i = 0, j = 0; i < clen; i++) {
|
|
||||||
ret[j++] = (byte)((cdata[i] >> 24) & 0xff);
|
|
||||||
ret[j++] = (byte)((cdata[i] >> 16) & 0xff);
|
|
||||||
ret[j++] = (byte)((cdata[i] >> 8) & 0xff);
|
|
||||||
ret[j++] = (byte)(cdata[i] & 0xff);
|
|
||||||
}
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Hash a password using the OpenBSD bcrypt scheme
|
|
||||||
* @param password the password to hash
|
|
||||||
* @param salt the salt to hash with (perhaps generated
|
|
||||||
* using BCrypt.gensalt)
|
|
||||||
* @return the hashed password
|
|
||||||
*/
|
|
||||||
public static String hashpw(String password, String salt) {
|
|
||||||
BCrypt B;
|
|
||||||
String real_salt;
|
|
||||||
byte passwordb[], saltb[], hashed[];
|
|
||||||
char minor = (char)0;
|
|
||||||
int rounds, off = 0;
|
|
||||||
StringBuffer rs = new StringBuffer();
|
|
||||||
|
|
||||||
if (salt.charAt(0) != '$' || salt.charAt(1) != '2')
|
|
||||||
throw new IllegalArgumentException ("Invalid salt version");
|
|
||||||
if (salt.charAt(2) == '$')
|
|
||||||
off = 3;
|
|
||||||
else {
|
|
||||||
minor = salt.charAt(2);
|
|
||||||
if (minor != 'a' || salt.charAt(3) != '$')
|
|
||||||
throw new IllegalArgumentException ("Invalid salt revision");
|
|
||||||
off = 4;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Extract number of rounds
|
|
||||||
if (salt.charAt(off + 2) > '$')
|
|
||||||
throw new IllegalArgumentException ("Missing salt rounds");
|
|
||||||
rounds = Integer.parseInt(salt.substring(off, off + 2));
|
|
||||||
|
|
||||||
real_salt = salt.substring(off + 3, off + 25);
|
|
||||||
try {
|
|
||||||
passwordb = (password + (minor >= 'a' ? "\000" : "")).getBytes("UTF-8");
|
|
||||||
} catch (UnsupportedEncodingException uee) {
|
|
||||||
throw new AssertionError("UTF-8 is not supported");
|
|
||||||
}
|
|
||||||
|
|
||||||
saltb = decode_base64(real_salt, BCRYPT_SALT_LEN);
|
|
||||||
|
|
||||||
B = new BCrypt();
|
|
||||||
hashed = B.crypt_raw(passwordb, saltb, rounds,
|
|
||||||
(int[])bf_crypt_ciphertext.clone());
|
|
||||||
|
|
||||||
rs.append("$2");
|
|
||||||
if (minor >= 'a')
|
|
||||||
rs.append(minor);
|
|
||||||
rs.append("$");
|
|
||||||
if (rounds < 10)
|
|
||||||
rs.append("0");
|
|
||||||
if (rounds > 30) {
|
|
||||||
throw new IllegalArgumentException(
|
|
||||||
"rounds exceeds maximum (30)");
|
|
||||||
}
|
|
||||||
rs.append(Integer.toString(rounds));
|
|
||||||
rs.append("$");
|
|
||||||
rs.append(encode_base64(saltb, saltb.length));
|
|
||||||
rs.append(encode_base64(hashed,
|
|
||||||
bf_crypt_ciphertext.length * 4 - 1));
|
|
||||||
return rs.toString();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Generate a salt for use with the BCrypt.hashpw() method
|
|
||||||
* @param log_rounds the log2 of the number of rounds of
|
|
||||||
* hashing to apply - the work factor therefore increases as
|
|
||||||
* 2**log_rounds.
|
|
||||||
* @param random an instance of SecureRandom to use
|
|
||||||
* @return an encoded salt value
|
|
||||||
*/
|
|
||||||
public static String gensalt(int log_rounds, SecureRandom random) {
|
|
||||||
StringBuffer rs = new StringBuffer();
|
|
||||||
byte rnd[] = new byte[BCRYPT_SALT_LEN];
|
|
||||||
|
|
||||||
random.nextBytes(rnd);
|
|
||||||
|
|
||||||
rs.append("$2a$");
|
|
||||||
if (log_rounds < 10)
|
|
||||||
rs.append("0");
|
|
||||||
if (log_rounds > 30) {
|
|
||||||
throw new IllegalArgumentException(
|
|
||||||
"log_rounds exceeds maximum (30)");
|
|
||||||
}
|
|
||||||
rs.append(Integer.toString(log_rounds));
|
|
||||||
rs.append("$");
|
|
||||||
rs.append(encode_base64(rnd, rnd.length));
|
|
||||||
return rs.toString();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Generate a salt for use with the BCrypt.hashpw() method
|
|
||||||
* @param log_rounds the log2 of the number of rounds of
|
|
||||||
* hashing to apply - the work factor therefore increases as
|
|
||||||
* 2**log_rounds.
|
|
||||||
* @return an encoded salt value
|
|
||||||
*/
|
|
||||||
public static String gensalt(int log_rounds) {
|
|
||||||
return gensalt(log_rounds, new SecureRandom());
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Generate a salt for use with the BCrypt.hashpw() method,
|
|
||||||
* selecting a reasonable default for the number of hashing
|
|
||||||
* rounds to apply
|
|
||||||
* @return an encoded salt value
|
|
||||||
*/
|
|
||||||
public static String gensalt() {
|
|
||||||
return gensalt(GENSALT_DEFAULT_LOG2_ROUNDS);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Check that a plaintext password matches a previously hashed
|
|
||||||
* one
|
|
||||||
* @param plaintext the plaintext password to verify
|
|
||||||
* @param hashed the previously-hashed password
|
|
||||||
* @return true if the passwords match, false otherwise
|
|
||||||
*/
|
|
||||||
public static boolean checkpw(String plaintext, String hashed) {
|
|
||||||
byte hashed_bytes[];
|
|
||||||
byte try_bytes[];
|
|
||||||
try {
|
|
||||||
String try_pw = hashpw(plaintext, hashed);
|
|
||||||
hashed_bytes = hashed.getBytes("UTF-8");
|
|
||||||
try_bytes = try_pw.getBytes("UTF-8");
|
|
||||||
} catch (UnsupportedEncodingException uee) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
if (hashed_bytes.length != try_bytes.length)
|
|
||||||
return false;
|
|
||||||
byte ret = 0;
|
|
||||||
for (int i = 0; i < try_bytes.length; i++)
|
|
||||||
ret |= hashed_bytes[i] ^ try_bytes[i];
|
|
||||||
return ret == 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -3,7 +3,7 @@ spring:
|
|||||||
type: com.alibaba.druid.pool.DruidDataSource
|
type: com.alibaba.druid.pool.DruidDataSource
|
||||||
druid:
|
druid:
|
||||||
driver-class-name: com.mysql.cj.jdbc.Driver
|
driver-class-name: com.mysql.cj.jdbc.Driver
|
||||||
url: jdbc:mysql://rm-wz9vza84pe0hb338kbo.mysql.rds.aliyuncs.com:3306/2021_vote?autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=GMT%2B8&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull&transformedBitIsBoolean=true
|
url: jdbc:mysql://rm-wz9vza84pe0hb338kbo.mysql.rds.aliyuncs.com:3306/2021_weixih5?autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=GMT%2B8&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull&transformedBitIsBoolean=true
|
||||||
username: root
|
username: root
|
||||||
password: 'lyg8266@Qiween#com'
|
password: 'lyg8266@Qiween#com'
|
||||||
initial-size: 5
|
initial-size: 5
|
||||||
@@ -31,23 +31,39 @@ spring:
|
|||||||
wall:
|
wall:
|
||||||
config:
|
config:
|
||||||
multi-statement-allow: true
|
multi-statement-allow: true
|
||||||
|
servlet:
|
||||||
|
multipart:
|
||||||
|
max-file-size: 500MB
|
||||||
|
max-request-size: 500MB
|
||||||
|
redis:
|
||||||
|
open: false # 是否开启redis缓存 true开启 false关闭
|
||||||
|
database: 0
|
||||||
|
host: r-wz97jov3cc4roi3b1ppd.redis.rds.aliyuncs.com
|
||||||
|
port: 19088
|
||||||
|
password: 'Xfhd@2020' # 密码
|
||||||
|
timeout: 6000ms # 连接超时时长(毫秒)
|
||||||
|
jedis:
|
||||||
|
pool:
|
||||||
|
max-active: 1000 # 连接池最大连接数(使用负值表示没有限制)
|
||||||
|
max-wait: -1ms # 连接池最大阻塞等待时间(使用负值表示没有限制)
|
||||||
|
max-idle: 10 # 连接池中的最大空闲连接
|
||||||
|
min-idle: 5 # 连接池中的最小空闲连接
|
||||||
|
|
||||||
|
|
||||||
wx:
|
wx:
|
||||||
appid: wx35766a64d73d08a9 #appid
|
appid: wx35766a64d73d08a9 #appid
|
||||||
project-id: 20210001000100011 #活动id
|
project-id: 20210001000100011 #活动id
|
||||||
api-domain: https://wx.xfhd.net/thirdparty #授权域名
|
api-domain: https://wx.xfhd.net/thirdparty #授权域名
|
||||||
auth-code: fbc35e02df8a4fae9f9f827156acd91e #授权码
|
auth-code: fbc35e02df8a4fae9f9f827156acd91e #授权码
|
||||||
auth-scope: snsapi_userinfo #scope
|
auth-scope: snsapi_userinfo #scope
|
||||||
activity:
|
|
||||||
setting:
|
|
||||||
begin-date: '2021-11-05 00:00' #投票开始时间
|
|
||||||
end-date: '2021-11-10 00:00' #投票结束时间
|
|
||||||
times: 1 #投票次数限制
|
|
||||||
|
|
||||||
#阿里云 OSS
|
oss:
|
||||||
#不同的服务器,地址不同
|
#阿里云 OSS
|
||||||
endpoint: oss-cn-hangzhou.aliyuncs.com
|
#地域节点
|
||||||
keyid: LTAI4G88mJUn3YzWo2eFmxVG
|
endpoint: oss-cn-shenzhen.aliyuncs.com
|
||||||
keysecret: iWNQskqvXC7Rm0au2W2u3AGNFEgYMl
|
keyid: sSJ5t0yC1CaKhPJ4
|
||||||
#bucket可以在控制台创建,也可以使用java代码创建
|
keysecret: PsbdUTexU95BkiqO4ADELXpIaYdWGk
|
||||||
bucketname: h5buckets
|
#Bucket 名字
|
||||||
bucketDomain: h5buckets.oss-cn-hangzhou.aliyuncs.com
|
bucketname: qiween
|
||||||
|
#Bucket 域名
|
||||||
|
bucketDomain: qiween.oss-cn-shenzhen.aliyuncs.com
|
||||||
|
|||||||
@@ -3,9 +3,9 @@ spring:
|
|||||||
type: com.alibaba.druid.pool.DruidDataSource
|
type: com.alibaba.druid.pool.DruidDataSource
|
||||||
druid:
|
druid:
|
||||||
driver-class-name: com.mysql.cj.jdbc.Driver
|
driver-class-name: com.mysql.cj.jdbc.Driver
|
||||||
url: jdbc:mysql://120.25.121.117:3306/2021_weixih5?autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=GMT%2B8&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull&transformedBitIsBoolean=true
|
url: jdbc:mysql://rm-wz9vza84pe0hb338kbo.mysql.rds.aliyuncs.com:3306/2021_weixih5?autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=GMT%2B8&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull&transformedBitIsBoolean=true
|
||||||
username: root
|
username: root
|
||||||
password: 'szxgl@2001B'
|
password: 'lyg8266@Qiween#com'
|
||||||
initial-size: 5
|
initial-size: 5
|
||||||
max-active: 500
|
max-active: 500
|
||||||
min-idle: 10
|
min-idle: 10
|
||||||
@@ -35,6 +35,19 @@ spring:
|
|||||||
multipart:
|
multipart:
|
||||||
max-file-size: 500MB
|
max-file-size: 500MB
|
||||||
max-request-size: 500MB
|
max-request-size: 500MB
|
||||||
|
redis:
|
||||||
|
open: false # 是否开启redis缓存 true开启 false关闭
|
||||||
|
database: 0
|
||||||
|
host: 120.25.121.117
|
||||||
|
port: 8266
|
||||||
|
password: 'Qiween@4531871' # 密码
|
||||||
|
timeout: 6000ms # 连接超时时长(毫秒)
|
||||||
|
jedis:
|
||||||
|
pool:
|
||||||
|
max-active: 1000 # 连接池最大连接数(使用负值表示没有限制)
|
||||||
|
max-wait: -1ms # 连接池最大阻塞等待时间(使用负值表示没有限制)
|
||||||
|
max-idle: 10 # 连接池中的最大空闲连接
|
||||||
|
min-idle: 5 # 连接池中的最小空闲连接
|
||||||
|
|
||||||
|
|
||||||
wx:
|
wx:
|
||||||
@@ -47,10 +60,10 @@ wx:
|
|||||||
oss:
|
oss:
|
||||||
#阿里云 OSS
|
#阿里云 OSS
|
||||||
#地域节点
|
#地域节点
|
||||||
endpoint: oss-cn-hangzhou.aliyuncs.com
|
endpoint: oss-cn-shenzhen.aliyuncs.com
|
||||||
keyid: LTAI4G88mJUn3YzWo2eFmxVG
|
keyid: sSJ5t0yC1CaKhPJ4
|
||||||
keysecret: iWNQskqvXC7Rm0au2W2u3AGNFEgYMl
|
keysecret: PsbdUTexU95BkiqO4ADELXpIaYdWGk
|
||||||
#Bucket 名字
|
#Bucket 名字
|
||||||
bucketname: h5buckets
|
bucketname: qiween
|
||||||
#Bucket 域名
|
#Bucket 域名
|
||||||
bucketDomain: h5buckets.oss-cn-hangzhou.aliyuncs.com
|
bucketDomain: qiween.oss-cn-shenzhen.aliyuncs.com
|
||||||
|
|||||||
@@ -2,14 +2,15 @@ server:
|
|||||||
port: 8616
|
port: 8616
|
||||||
servlet:
|
servlet:
|
||||||
context-path: /pars-h5-2021
|
context-path: /pars-h5-2021
|
||||||
|
max-http-header-size: 65546
|
||||||
spring:
|
spring:
|
||||||
# # 允许预检请求
|
# # 允许预检请求
|
||||||
# mvc:
|
# mvc:
|
||||||
# dispatch-options-request: true
|
# dispatch-options-request: true
|
||||||
jmx:
|
jmx:
|
||||||
default-domain: vote2021
|
default-domain: pars-h5-2021
|
||||||
profiles:
|
profiles:
|
||||||
active: test
|
active: prod
|
||||||
# mvc:
|
# mvc:
|
||||||
# static-path-pattern: /**
|
# static-path-pattern: /**
|
||||||
# web:
|
# web:
|
||||||
@@ -18,6 +19,9 @@ spring:
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#mybatis
|
#mybatis
|
||||||
mybatis-plus:
|
mybatis-plus:
|
||||||
mapper-locations: classpath*:/mapper/**/*.xml
|
mapper-locations: classpath*:/mapper/**/*.xml
|
||||||
|
|||||||
@@ -1,13 +1,16 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
||||||
<mapper namespace="com.szxgl.vote2021.mapper.PraiseMapper2">
|
<mapper namespace="com.szxgl.pars2021.mapper.PraiseMapper2">
|
||||||
|
|
||||||
<select id="getPraiseStatus" resultType="int">
|
<select id="getPraise" resultType="com.szxgl.pars2021.entity.PraiseDao">
|
||||||
SELECT
|
SELECT
|
||||||
IFNULL( id, NULL )
|
*
|
||||||
FROM
|
FROM
|
||||||
praise
|
praise
|
||||||
where TO_DAYS(create_time) = TO_DAYS(NOW()) and openid = #{openid} and works_id = #{worksId}
|
WHERE
|
||||||
|
works_id = #{worksId}
|
||||||
|
AND openid = #{openid}
|
||||||
|
AND DATE_FORMAT(create_time,'%Y-%m-%d') = DATE_FORMAT(now(),'%Y-%m-%d')
|
||||||
</select>
|
</select>
|
||||||
|
|
||||||
</mapper>
|
</mapper>
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
||||||
<mapper namespace="com.szxgl.vote2021.mapper.UserMapper2">
|
<mapper namespace="com.szxgl.pars2021.mapper.UserMapper2">
|
||||||
|
|
||||||
<select id="getUserWorks" resultType="com.szxgl.vote2021.entity.UserWorks">
|
<select id="getUserWorks" resultType="com.szxgl.pars2021.entity.UserWorks">
|
||||||
SELECT
|
SELECT
|
||||||
w.id,
|
w.id,
|
||||||
w.url,
|
w.url,
|
||||||
@@ -20,4 +20,25 @@
|
|||||||
select openid from works where id = #{worksId}
|
select openid from works where id = #{worksId}
|
||||||
</select>
|
</select>
|
||||||
|
|
||||||
|
<insert id="saveRecord">
|
||||||
|
insert into record
|
||||||
|
(
|
||||||
|
openid,
|
||||||
|
works_id,
|
||||||
|
nickname,
|
||||||
|
create_time
|
||||||
|
)
|
||||||
|
values
|
||||||
|
(
|
||||||
|
#{openid},
|
||||||
|
#{worksId},
|
||||||
|
#{nickname},
|
||||||
|
now()
|
||||||
|
)
|
||||||
|
</insert>
|
||||||
|
|
||||||
|
<select id="getRecord" resultType="com.szxgl.pars2021.entity.Record">
|
||||||
|
select * from record where works_id = #{worksId}
|
||||||
|
</select>
|
||||||
|
|
||||||
</mapper>
|
</mapper>
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
||||||
<mapper namespace="com.szxgl.vote2021.mapper.WorksMapper2">
|
<mapper namespace="com.szxgl.pars2021.mapper.WorksMapper2">
|
||||||
|
|
||||||
<update id="updatePraiseNo">
|
<update id="updatePraiseNo">
|
||||||
update works set
|
update works set
|
||||||
@@ -10,7 +10,7 @@
|
|||||||
where id = #{worksId}
|
where id = #{worksId}
|
||||||
</update>
|
</update>
|
||||||
|
|
||||||
<select id="getAllUserWorks" resultType="com.szxgl.vote2021.entity.UserWorks">
|
<select id="getAllUserWorks" resultType="com.szxgl.pars2021.entity.UserWorks">
|
||||||
SELECT
|
SELECT
|
||||||
w.id,
|
w.id,
|
||||||
w.url,
|
w.url,
|
||||||
|
|||||||
13
src/test/java/com/szxgl/pars2021/H52021ApplicationTests.java
Normal file
13
src/test/java/com/szxgl/pars2021/H52021ApplicationTests.java
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
package com.szxgl.pars2021;
|
||||||
|
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
import org.springframework.boot.test.context.SpringBootTest;
|
||||||
|
|
||||||
|
@SpringBootTest
|
||||||
|
class H52021ApplicationTests {
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void contextLoads() {
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -1,19 +0,0 @@
|
|||||||
package com.szxgl.vote2021;
|
|
||||||
|
|
||||||
import com.szxgl.vote2021.utils.RedisUtil;
|
|
||||||
import org.junit.jupiter.api.Test;
|
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
|
||||||
import org.springframework.boot.test.context.SpringBootTest;
|
|
||||||
import org.springframework.data.redis.core.RedisTemplate;
|
|
||||||
import org.springframework.data.redis.core.ZSetOperations;
|
|
||||||
|
|
||||||
import java.util.Set;
|
|
||||||
|
|
||||||
@SpringBootTest
|
|
||||||
class H52021ApplicationTests {
|
|
||||||
|
|
||||||
@Test
|
|
||||||
void contextLoads() {
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
Reference in New Issue
Block a user