Commit b59276a3 authored by xiaoguang.xu's avatar xiaoguang.xu

增加phoneNoHash接口

parent 891fd168
package cn.quantgroup.xyqb.controller.external.user; package cn.quantgroup.xyqb.controller.external.user;
import java.io.UnsupportedEncodingException;
import java.sql.Timestamp;
import java.text.ParseException;
import java.util.*;
import java.util.stream.Collectors;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.validation.constraints.Min;
import org.apache.commons.codec.binary.Base64;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.math.NumberUtils;
import org.apache.http.HttpStatus;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.util.CollectionUtils;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.TypeReference;
import com.google.common.base.MoreObjects;
import com.google.common.collect.Maps;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import io.swagger.annotations.ApiResponse;
import io.swagger.annotations.ApiResponses;
import lombok.extern.slf4j.Slf4j;
import cn.quantgroup.acolyte.buddhistscriptures.pojo.Login; import cn.quantgroup.acolyte.buddhistscriptures.pojo.Login;
import cn.quantgroup.tech.db.DSType; import cn.quantgroup.tech.db.DSType;
import cn.quantgroup.tech.db.TargetDataSource; import cn.quantgroup.tech.db.TargetDataSource;
...@@ -57,6 +24,35 @@ import cn.quantgroup.xyqb.service.wechat.IWechatService; ...@@ -57,6 +24,35 @@ import cn.quantgroup.xyqb.service.wechat.IWechatService;
import cn.quantgroup.xyqb.util.*; import cn.quantgroup.xyqb.util.*;
import cn.quantgroup.xyqb.util.encrypt.MD5Util; import cn.quantgroup.xyqb.util.encrypt.MD5Util;
import cn.quantgroup.xyqb.validator.ChineseName; import cn.quantgroup.xyqb.validator.ChineseName;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.TypeReference;
import com.google.common.base.MoreObjects;
import com.google.common.collect.Maps;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import io.swagger.annotations.ApiResponse;
import io.swagger.annotations.ApiResponses;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.codec.binary.Base64;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.math.NumberUtils;
import org.apache.http.HttpStatus;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.util.CollectionUtils;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.validation.constraints.Min;
import java.io.UnsupportedEncodingException;
import java.sql.Timestamp;
import java.text.ParseException;
import java.util.*;
import java.util.stream.Collectors;
/** /**
...@@ -107,8 +103,9 @@ public class InnerController implements IBaseController { ...@@ -107,8 +103,9 @@ public class InnerController implements IBaseController {
/** /**
* 根据手机号或身份证号查询用户UUID * 根据手机号或身份证号查询用户UUID
*
* @param phoneNo - 手机号 * @param phoneNo - 手机号
* @param idNo - 身份证号 * @param idNo - 身份证号
* @return user表的uuid * @return user表的uuid
*/ */
@IpValidator @IpValidator
...@@ -146,6 +143,28 @@ public class InnerController implements IBaseController { ...@@ -146,6 +143,28 @@ public class InnerController implements IBaseController {
return JsonResult.buildSuccessResult("", userRet); return JsonResult.buildSuccessResult("", userRet);
} }
@GetMapping("/user/search/hash")
@ApiOperation(httpMethod = "GET", value = "根据md5(手机号)或md5(身份证号)查询用户信息")
public JsonResult findByUuid(@RequestParam String md5Value,
@RequestParam(defaultValue = "1") Integer type) {
if (type != 1) {
return JsonResult.buildErrorStateResult("尚未开放身份证号md5", null);
}
if (md5Value == null) {
return JsonResult.buildErrorStateResult("参数错误", null);
}
if (md5Value.length() != 32) {
return JsonResult.buildErrorStateResult("参数长度有误", null);
}
User user = userService.findByPhoneMd5(md5Value);
if (user == null) {
return JsonResult.buildSuccessResult("", null);
}
UserRet userRet = new UserRet(user);
return JsonResult.buildSuccessResult("", userRet);
}
@RequestMapping("/userInfo/search/uuid") @RequestMapping("/userInfo/search/uuid")
@ApiOperation(httpMethod = "POST", value = "根据UUID查询用户详细信息") @ApiOperation(httpMethod = "POST", value = "根据UUID查询用户详细信息")
public JsonResult findUserInfoByUuid(@RequestParam(value = "uuid") String uuid) { public JsonResult findUserInfoByUuid(@RequestParam(value = "uuid") String uuid) {
...@@ -600,10 +619,11 @@ public class InnerController implements IBaseController { ...@@ -600,10 +619,11 @@ public class InnerController implements IBaseController {
/** /**
* 按照姓名、份证号或手机号查询用户实名信息 - 精确查询,供客服用,不限制入参正确性 * 按照姓名、份证号或手机号查询用户实名信息 - 精确查询,供客服用,不限制入参正确性
* @param name - 姓名 *
* @param name - 姓名
* @param phoneNo - 手机号 * @param phoneNo - 手机号
* @param idNo - 身份证号 * @param idNo - 身份证号
* @return JsonResult<List<UserDetail>> * @return JsonResult<List < UserDetail>>
*/ */
@RequestMapping("/user_detail/search_list") @RequestMapping("/user_detail/search_list")
@ApiOperation(httpMethod = "POST", value = "按照姓名、份证号或手机号查询用户实名信息 - 精确查询,供客服用,不限制入参正确性") @ApiOperation(httpMethod = "POST", value = "按照姓名、份证号或手机号查询用户实名信息 - 精确查询,供客服用,不限制入参正确性")
...@@ -619,9 +639,10 @@ public class InnerController implements IBaseController { ...@@ -619,9 +639,10 @@ public class InnerController implements IBaseController {
/** /**
* 按照身份证号和手机号查询用户实名信息查询 - 模糊查询 * 按照身份证号和手机号查询用户实名信息查询 - 模糊查询
*
* @param phoneNo - 手机号 * @param phoneNo - 手机号
* @param idNo - 身份证号 * @param idNo - 身份证号
* @return JsonResult<List<UserDetail>> * @return JsonResult<List < UserDetail>>
*/ */
@ApiOperation(httpMethod = "POST", value = "按照身份证号和手机号查询用户实名信息查询 - 模糊查询") @ApiOperation(httpMethod = "POST", value = "按照身份证号和手机号查询用户实名信息查询 - 模糊查询")
@RequestMapping("/user_detail/fuzzyQuery") @RequestMapping("/user_detail/fuzzyQuery")
...@@ -636,7 +657,7 @@ public class InnerController implements IBaseController { ...@@ -636,7 +657,7 @@ public class InnerController implements IBaseController {
int idNoMaskSize = 16; int idNoMaskSize = 16;
int idNoFullSize = 18; int idNoFullSize = 18;
boolean phoneNoValid = Objects.equals(phoneNo.length(), phoneNoMaskSize) || ValidationUtil.validatePhoneNo(phoneNo); boolean phoneNoValid = Objects.equals(phoneNo.length(), phoneNoMaskSize) || ValidationUtil.validatePhoneNo(phoneNo);
boolean idNoValid = Objects.equals(idNo.length(), idNoMaskSize) || Objects.equals(idNo.length(), idNoFullSize); boolean idNoValid = Objects.equals(idNo.length(), idNoMaskSize) || Objects.equals(idNo.length(), idNoFullSize);
if (phoneNoValid && idNoValid) { if (phoneNoValid && idNoValid) {
List<UserDetail> userDetailList = userDetailService.fuzzyQueryByPhoneNoAndIdNo(phoneNo, idNo); List<UserDetail> userDetailList = userDetailService.fuzzyQueryByPhoneNoAndIdNo(phoneNo, idNo);
return JsonResult.buildSuccessResult("success", userDetailList); return JsonResult.buildSuccessResult("success", userDetailList);
...@@ -1109,7 +1130,8 @@ public class InnerController implements IBaseController { ...@@ -1109,7 +1130,8 @@ public class InnerController implements IBaseController {
List<Contact> contactList = null; List<Contact> contactList = null;
// 目前对空白字符串和null值容错,因是api调用,不考虑对非法格式容错(会阻断注册) // 目前对空白字符串和null值容错,因是api调用,不考虑对非法格式容错(会阻断注册)
if (StringUtils.isNotBlank(contacts)) { if (StringUtils.isNotBlank(contacts)) {
contactList = JSONObject.parseObject(contacts, new TypeReference<List<Contact>>(){}); contactList = JSONObject.parseObject(contacts, new TypeReference<List<Contact>>() {
});
for (Contact contact : contactList) { for (Contact contact : contactList) {
contact.setRelation(contact.getRelation() == null ? Relation.OTHER : contact.getRelation()); contact.setRelation(contact.getRelation() == null ? Relation.OTHER : contact.getRelation());
Tuple<String, Boolean> stringBooleanTuple = contact.validAndResult(); Tuple<String, Boolean> stringBooleanTuple = contact.validAndResult();
...@@ -1331,7 +1353,7 @@ public class InnerController implements IBaseController { ...@@ -1331,7 +1353,7 @@ public class InnerController implements IBaseController {
User user = userService.findById(userId); User user = userService.findById(userId);
int rows = userDetailService.updateNameAndIdCard(name, idNo, user.getPhoneNo()); int rows = userDetailService.updateNameAndIdCard(name, idNo, user.getPhoneNo());
log.info("重置用户实名信息,userId:{},name:{},idNo:{},result:[{}]", userId, name, idNo, rows); log.info("重置用户实名信息,userId:{},name:{},idNo:{},result:[{}]", userId, name, idNo, rows);
if(rows > 0){ if (rows > 0) {
return JsonResult.buildSuccessResult("用户实名信息已重置.", name.concat(",").concat(idNo).concat(",").concat(userId.toString())); return JsonResult.buildSuccessResult("用户实名信息已重置.", name.concat(",").concat(idNo).concat(",").concat(userId.toString()));
} }
} catch (Exception e) { } catch (Exception e) {
...@@ -1395,7 +1417,7 @@ public class InnerController implements IBaseController { ...@@ -1395,7 +1417,7 @@ public class InnerController implements IBaseController {
try { try {
int rows = userDetailService.updateNameAndIdCard(name, idNo, phoneNo); int rows = userDetailService.updateNameAndIdCard(name, idNo, phoneNo);
log.info("重置用户实名信息,phoneNo:{},name:{},idNo:{},result:[{}],操作的理由reason:{}", phoneNo, name, idNo, rows, reason); log.info("重置用户实名信息,phoneNo:{},name:{},idNo:{},result:[{}],操作的理由reason:{}", phoneNo, name, idNo, rows, reason);
if(rows > 0){ if (rows > 0) {
return JsonResult.buildSuccessResult("用户实名信息已重置.", phoneNo.concat(",").concat(name).concat(",").concat(idNo)); return JsonResult.buildSuccessResult("用户实名信息已重置.", phoneNo.concat(",").concat(name).concat(",").concat(idNo));
} }
} catch (Exception e) { } catch (Exception e) {
......
package cn.quantgroup.xyqb.entity;
import lombok.Data;
import javax.persistence.*;
import java.io.Serializable;
import java.sql.Timestamp;
@Data
@Entity
@Table(name = "user_hash_mapping")
public class UserHashMapping implements Serializable {
private static final long serialVersionUID = -1L;
@Id
@Column(name = "id")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "user_id")
private Long userId;
@Column(name = "phone_no_md5")
private String phoneNoMd5;
@Column(name = "id_no_md5")
private String idNoMd5;
@Column(name = "phone_no_md5_short")
private Long phoneNoMd5Short;
@Column(name = "id_no_md5_short")
private Long idNoMd5Short;
@Column(name = "created_at")
private Timestamp createdAt;
@Column(name = "updated_at")
private Timestamp updatedAt;
@PrePersist
public void prePersist() {
Timestamp timestamp = new Timestamp(System.currentTimeMillis());
createdAt = timestamp;
updatedAt = timestamp;
}
@PreUpdate
public void preUpdate() {
updatedAt = new Timestamp(System.currentTimeMillis());
}
}
\ No newline at end of file
package cn.quantgroup.xyqb.repository;
import cn.quantgroup.xyqb.entity.UserHashMapping;
import org.springframework.data.jpa.repository.JpaRepository;
public interface IUserHashMappingRepository extends JpaRepository<UserHashMapping, Long> {
UserHashMapping findByPhoneNoMd5ShortAndPhoneNoMd5(Long phoneNoMd5Short, String phoneNoMd5);
}
package cn.quantgroup.xyqb.service.user; package cn.quantgroup.xyqb.service.user;
import java.util.List;
import java.util.Map;
import cn.quantgroup.xyqb.entity.User; import cn.quantgroup.xyqb.entity.User;
import cn.quantgroup.xyqb.model.UserInfo; import cn.quantgroup.xyqb.model.UserInfo;
import java.util.List;
import java.util.Map;
/** /**
* Created by Miraculous on 15/7/5. * Created by Miraculous on 15/7/5.
*/ */
...@@ -50,4 +50,5 @@ public interface IUserService { ...@@ -50,4 +50,5 @@ public interface IUserService {
List<UserInfo> findUserInfosByPhones(List<String> phones); List<UserInfo> findUserInfosByPhones(List<String> phones);
User findByPhoneMd5(String md5Value);
} }
package cn.quantgroup.xyqb.service.user.impl; package cn.quantgroup.xyqb.service.user.impl;
import java.sql.Timestamp;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.concurrent.TimeUnit;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import lombok.extern.slf4j.Slf4j;
import cn.quantgroup.xyqb.Constants; import cn.quantgroup.xyqb.Constants;
import cn.quantgroup.xyqb.entity.User; import cn.quantgroup.xyqb.entity.User;
import cn.quantgroup.xyqb.entity.UserDetail; import cn.quantgroup.xyqb.entity.UserDetail;
import cn.quantgroup.xyqb.entity.UserHashMapping;
import cn.quantgroup.xyqb.model.UserInfo; import cn.quantgroup.xyqb.model.UserInfo;
import cn.quantgroup.xyqb.repository.IUserHashMappingRepository;
import cn.quantgroup.xyqb.repository.IUserRepository; import cn.quantgroup.xyqb.repository.IUserRepository;
import cn.quantgroup.xyqb.service.user.IUserDetailService; import cn.quantgroup.xyqb.service.user.IUserDetailService;
import cn.quantgroup.xyqb.service.user.IUserService; import cn.quantgroup.xyqb.service.user.IUserService;
import cn.quantgroup.xyqb.util.PasswordUtil; import cn.quantgroup.xyqb.util.PasswordUtil;
import cn.quantgroup.xyqb.util.ValidationUtil; import cn.quantgroup.xyqb.util.ValidationUtil;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import java.sql.Timestamp;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.concurrent.TimeUnit;
import java.util.zip.CRC32;
/** /**
* Created by Miraculous on 15/7/5. * Created by Miraculous on 15/7/5.
...@@ -40,6 +40,10 @@ public class UserServiceImpl implements IUserService { ...@@ -40,6 +40,10 @@ public class UserServiceImpl implements IUserService {
RedisTemplate<String, String> stringRedisTemplate; RedisTemplate<String, String> stringRedisTemplate;
@Autowired @Autowired
private IUserRepository userRepository; private IUserRepository userRepository;
@Autowired
private IUserHashMappingRepository userHashMappingRepository;
@Autowired @Autowired
private IUserDetailService userDetailService; private IUserDetailService userDetailService;
...@@ -180,4 +184,18 @@ public class UserServiceImpl implements IUserService { ...@@ -180,4 +184,18 @@ public class UserServiceImpl implements IUserService {
return Collections.emptyList(); return Collections.emptyList();
} }
@Override
public User findByPhoneMd5(String md5Value) {
md5Value = md5Value.toLowerCase();
CRC32 crc32 = new CRC32();
crc32.update(md5Value.getBytes());
long value = crc32.getValue();
UserHashMapping userHashMapping = userHashMappingRepository.findByPhoneNoMd5ShortAndPhoneNoMd5(value, md5Value);
if (userHashMapping == null) {
return null;
}
Long userId = userHashMapping.getUserId();
return userRepository.findById(userId);
}
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment