Browse Source

feature1.0.0-img: 优化艺术家登录接口

feature-1.0-img-prototype
penny 4 years ago
parent
commit
6d8dd1e2d7
  1. 15
      bnyer-services/bnyer-img/src/main/java/com/bnyer/img/constants/TiktokConstant.java
  2. 5
      bnyer-services/bnyer-img/src/main/java/com/bnyer/img/controller/CreatorController.java
  3. 2
      bnyer-services/bnyer-img/src/main/java/com/bnyer/img/controller/CreatorMiniController.java
  4. 19
      bnyer-services/bnyer-img/src/main/java/com/bnyer/img/domain/Creator.java
  5. 13
      bnyer-services/bnyer-img/src/main/java/com/bnyer/img/dto/CreatorDto.java
  6. 23
      bnyer-services/bnyer-img/src/main/java/com/bnyer/img/dto/CreatorLoginDto.java
  7. 3
      bnyer-services/bnyer-img/src/main/java/com/bnyer/img/dto/CreatorPageDto.java
  8. 7
      bnyer-services/bnyer-img/src/main/java/com/bnyer/img/service/CreatorService.java
  9. 141
      bnyer-services/bnyer-img/src/main/java/com/bnyer/img/service/impl/CreatorServiceImpl.java
  10. 71
      bnyer-services/bnyer-img/src/main/java/com/bnyer/img/vo/CreatorLoginVo.java
  11. 7
      bnyer-services/bnyer-img/src/main/resources/com/bnyer/img/mapper/CreatorMapper.xml

15
bnyer-services/bnyer-img/src/main/java/com/bnyer/img/constants/TiktokConstant.java

@ -60,4 +60,19 @@ public class TiktokConstant {
* 调用快手授权失败
*/
public static final Integer FH_AUTH_ERROR = 105009;
/**
* 艺术家手机号或密码不正确
*/
public static final Integer TIKTOK_CREATOR_PWD_ERROR = 105010;
/**
* 艺术家尚未审核
*/
public static final Integer TIKTOK_CREATOR_NOT_PASS_ERROR = 105011;
/**
* 艺术家尚未审核
*/
public static final Integer TIKTOK_CREATOR_BANED_ERROR = 105012;
}

5
bnyer-services/bnyer-img/src/main/java/com/bnyer/img/controller/CreatorController.java

@ -38,9 +38,6 @@ public class CreatorController extends BaseController {
if(StringUtils.isNotBlank(dto.getPhone())){
dto.setPhone(Sm4Util.sm4Encryption(dto.getPhone()));
}
if(StringUtils.isNotBlank(dto.getOpenId())){
dto.setOpenId(Sm4Util.sm4Encryption(dto.getOpenId()));
}
PageHelper.startPage(dto.getPageNum(), dto.getPageSize());
List<Creator> creators = creatorService.queryPage(dto);
if(creators.size() > 0){
@ -49,8 +46,6 @@ public class CreatorController extends BaseController {
if(StringUtils.isNotBlank(creator.getPhone())){
creator.setPhone(Sm4Util.sm4Decrypt(creator.getPhone()));
}
//暂时注释掉openId解密校验
//creator.setOpenId(Sm4Util.sm4Decrypt(creator.getOpenId()));
}
}
}

2
bnyer-services/bnyer-img/src/main/java/com/bnyer/img/controller/CreatorMiniController.java

@ -251,7 +251,7 @@ public class CreatorMiniController extends BaseController {
//@TokenCheck
@PostMapping("/login")
@ApiOperation("小程序艺术家登录")
public AjaxResult login(@Validated @ApiParam("艺术家数据") @RequestBody WxLoginDto param)
public AjaxResult login(@Validated @ApiParam("艺术家数据") @RequestBody CreatorLoginDto param)
{
log.info("小程序艺术家数据参数为:{}", JSON.toJSON(param));
return AjaxResult.success(creatorService.login(param));

19
bnyer-services/bnyer-img/src/main/java/com/bnyer/img/domain/Creator.java

@ -26,11 +26,11 @@ import java.util.Date;
@AllArgsConstructor
@NoArgsConstructor
@TableName(value = "img_creator")
public class Creator extends BaseDomain {
public class Creator extends BaseDomain {
/**
* 主键id
*/
@TableId(value = "id", type = IdType.INPUT)
@TableId(value = "id", type = IdType.AUTO)
@ApiModelProperty(value="主键id")
private Long id;
@ -42,11 +42,11 @@ public class Creator extends BaseDomain {
private String name;
/**
* 姓名
* 密码
*/
@TableField(value = "open_id")
@ApiModelProperty(value="微信id")
private String openId;
@TableField(value = "password")
@ApiModelProperty(value="密码")
private String password;
/**
* 搜索码
@ -111,13 +111,6 @@ public class Creator extends BaseDomain {
@ApiModelProperty(value="是否活跃(0->不活跃;1->活跃 连续10天以上更新内容)")
private String isHot;
/**
* 是否显示 (0->隐藏1->显示)
*/
@TableField(value = "is_show")
@ApiModelProperty(value="是否显示 (0->隐藏;1->显示)")
private String isShow;
/**
* 最后登录时间
*/

13
bnyer-services/bnyer-img/src/main/java/com/bnyer/img/dto/CreatorDto.java

@ -14,8 +14,9 @@ import java.io.Serializable;
@ApiModel("艺术家接收类")
public class CreatorDto implements Serializable {
@ApiModelProperty(value="主键Id")
private Long id;
@NotBlank(message = "昵称不能为空!")
@ApiModelProperty(value="昵称")
private String name;
@NotBlank(message = "搜索码不能为空!")
@ApiModelProperty(value="搜索码")
@ -25,6 +26,14 @@ public class CreatorDto implements Serializable {
@ApiModelProperty(value="手机号")
private String phone;
@NotBlank(message = "密码不能为空!")
@ApiModelProperty(value="密码")
private String password;
@NotBlank(message = "头像不能为空!")
@ApiModelProperty(value="头像img地址")
private String img;
@ApiModelProperty(value="简介")
private String intro;

23
bnyer-services/bnyer-img/src/main/java/com/bnyer/img/dto/CreatorLoginDto.java

@ -0,0 +1,23 @@
package com.bnyer.img.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
import javax.validation.constraints.NotBlank;
import java.io.Serializable;
@Getter
@Setter
@ApiModel("艺术家登录入参")
public class CreatorLoginDto implements Serializable {
@NotBlank(message = "手机号不能为空!")
@ApiModelProperty(value = "手机号")
private String phone;
@NotBlank(message = "密码不能为空!")
@ApiModelProperty(value = "密码")
private String password;
}

3
bnyer-services/bnyer-img/src/main/java/com/bnyer/img/dto/CreatorPageDto.java

@ -16,9 +16,6 @@ public class CreatorPageDto extends BasePageDto {
@ApiModelProperty(value="昵称")
private String name;
@ApiModelProperty(value="微信id")
private String openId;
@ApiModelProperty(value="搜索码")
private String scanCode;

7
bnyer-services/bnyer-img/src/main/java/com/bnyer/img/service/CreatorService.java

@ -1,10 +1,7 @@
package com.bnyer.img.service;
import com.bnyer.img.domain.Creator;
import com.bnyer.img.dto.CreatorDto;
import com.bnyer.img.dto.CreatorPageDto;
import com.bnyer.img.dto.VerifyCreatorDto;
import com.bnyer.img.dto.WxLoginDto;
import com.bnyer.img.dto.*;
import com.bnyer.img.vo.*;
import java.util.List;
@ -98,7 +95,7 @@ public interface CreatorService {
* @param param 前端传来的参数
* @return -
*/
Map<String,Object> login(WxLoginDto param);
Map<String,Object> login(CreatorLoginDto param);
/**
* 查询所有审核通过的艺术家

141
bnyer-services/bnyer-img/src/main/java/com/bnyer/img/service/impl/CreatorServiceImpl.java

@ -1,6 +1,5 @@
package com.bnyer.img.service.impl;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.bnyer.common.core.exception.ServiceException;
@ -16,27 +15,30 @@ import com.bnyer.img.domain.InviteLog;
import com.bnyer.img.domain.TiktokImg;
import com.bnyer.img.domain.VerifyLog;
import com.bnyer.img.dto.CreatorDto;
import com.bnyer.img.dto.CreatorLoginDto;
import com.bnyer.img.dto.CreatorPageDto;
import com.bnyer.img.dto.VerifyCreatorDto;
import com.bnyer.img.dto.WxLoginDto;
import com.bnyer.img.mapper.CreatorMapper;
import com.bnyer.img.mapper.InviteLogMapper;
import com.bnyer.img.mapper.TiktokImgMapper;
import com.bnyer.img.mapper.VerifyLogMapper;
import com.bnyer.img.service.CreatorService;
import com.bnyer.img.vo.*;
import com.bnyer.img.vo.CreatorDetailsVo;
import com.bnyer.img.vo.CreatorHotVo;
import com.bnyer.img.vo.CreatorLoginVo;
import com.bnyer.img.vo.CreatorVo;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.ObjectUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.client.RestTemplate;
import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.math.BigDecimal;
import java.util.*;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.TimeUnit;
/**
@ -132,7 +134,9 @@ public class CreatorServiceImpl implements CreatorService {
throw new ServiceException("邀请码不存在,请重新编辑!",TiktokConstant.INVITE_CODE_NOT_EXIST);
}
Creator creator = new Creator();
creator.setId(dto.getId());
creator.setName(dto.getName());
creator.setPassword(Sm4Util.sm4Encryption(dto.getPassword()));
creator.setImg(dto.getImg());
creator.setIntro(dto.getIntro());
creator.setScanCode(dto.getScanCode());
creator.setInviteCode(IdUtils.inviteCodeGen());
@ -143,8 +147,9 @@ public class CreatorServiceImpl implements CreatorService {
creator.setIsShow("1");
creator.setAmt(BigDecimal.valueOf(0));
creator.setSort(0);
creator.setCreateTime(new Date());
creator.setUpdateTime(new Date());
int update = creatorMapper.updateById(creator);
int insert = creatorMapper.insert(creator);
log.info("手机号【{}】成为艺术家成功!待审核",dto.getPhone());
//保存邀请记录
InviteLog inviteLog = new InviteLog();
@ -157,7 +162,7 @@ public class CreatorServiceImpl implements CreatorService {
inviteLog.setSort(0);
inviteLogMapper.insert(inviteLog);
log.info("艺术家id【{}】被邀请码【{}】邀请成功!记录写入数据库完成!",creator.getId(),dto.getInviteCode());
return update;
return insert;
}
@Override
@ -267,116 +272,38 @@ public class CreatorServiceImpl implements CreatorService {
return creatorMapper.update(creator,wrapper);
}
/**
* 获取用户openId及sessionKey
* @param code 登录凭证code
* @return -
*/
private WxSessionInfoVo getSessionInfo(String code) {
String url = wxConfig.getSessionInfoUrl()+"?appid="+wxConfig.getAppId()+"&secret="+wxConfig.getSecret()+"&js_code="+code+"&grant_type=authorization_code";
String forObject = restTemplate.getForObject(url, String.class);
JSONObject sessionInfo = JSONObject.parseObject(forObject);
if(StringUtils.isNotBlank(sessionInfo.getString("errcode"))){
if(!sessionInfo.getString("errcode").equals(TiktokConstant.SUCCESS)){
log.error("微信授权session接口调用失败,错误状态码为:【{}】,错误信息为:【{}】",sessionInfo.getString("errcode"),sessionInfo.getString("errmsg"));
throw new ServiceException("微信授权session接口调用失败!",TiktokConstant.WECHAT_AUTH_ERROR);
}
}
//调用成功,组装返回数据
WxSessionInfoVo result = new WxSessionInfoVo();
result.setSessionKey(sessionInfo.getString("session_key"));
result.setOpenId(sessionInfo.getString("openid"));
return result;
}
/**
* 获取用户敏感信息
* @param sessionKey -
* @param encryptedData 敏感数据
* @param iv 加密向量
* @return -
*/
private WxUserInfoVo getUserInfo(String sessionKey, String encryptedData, String iv){
Base64.Decoder decoder = Base64.getDecoder();
byte[] sessionKeyBytes = decoder.decode(sessionKey);
byte[] ivBytes = decoder.decode(iv);
byte[] encryptedBytes = decoder.decode(encryptedData);
Cipher cipher = null;
try {
cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
SecretKeySpec skeySpec = new SecretKeySpec(sessionKeyBytes, "AES");
IvParameterSpec ivSpec = new IvParameterSpec(ivBytes);
cipher.init(Cipher.DECRYPT_MODE, skeySpec, ivSpec);
byte[] ret = cipher.doFinal(encryptedBytes);
if (null != ret && ret.length > 0) {
String result = new String(ret, "UTF-8");
return JSONObject.parseObject(result,WxUserInfoVo.class);
}
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**
* 保存用户
* @param creator 艺术家信息
* @param openId 微信id
* @param sessionKey -
* @param encryptedData 敏感信息数据
* @param iv 加密向量
* @return -
*/
private Creator saveUserInfo(Creator creator,String openId, String sessionKey, String encryptedData, String iv){
if (ObjectUtils.isEmpty(creator)) {
//创建用户
creator = new Creator();
//获取用户昵称和头像
WxUserInfoVo userInfo = this.getUserInfo(sessionKey, encryptedData, iv);
creator.setImg(userInfo.getAvatarUrl());
creator.setName(userInfo.getNickName());
creator.setOpenId(Sm4Util.sm4Encryption(openId));
creator.setCreateTime(new Date());
creator.setUpdateTime(new Date());
creator.setLastLoginTime(new Date());
creatorMapper.insert(creator);
log.info("艺术家【{}】创建成功!", openId);
return creator;
}else{
log.info("该艺术家【{}】已存在,更新登录时间",openId);
creator.setLastLoginTime(new Date());
creatorMapper.updateById(creator);
return creator;
}
}
@Override
public Map<String, Object> login(WxLoginDto dto) {
WxSessionInfoVo sessionInfo = this.getSessionInfo(dto.getCode());
//检查数据库中是否存在该openId,存在则直接设置会话状态登录;不存在则新增
public Map<String, Object> login(CreatorLoginDto dto) {
LambdaQueryWrapper<Creator> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(sessionInfo.getOpenId() != null,Creator::getOpenId,Sm4Util.sm4Encryption(sessionInfo.getOpenId()));
wrapper.eq(Creator::getPhone, Sm4Util.sm4Encryption(dto.getPhone()));
wrapper.eq(Creator::getPassword, Sm4Util.sm4Encryption(dto.getPassword()));
Creator creator = creatorMapper.selectOne(wrapper);
if(creator == null){
//新用户,新增
creator = this.saveUserInfo(creator,sessionInfo.getOpenId(), sessionInfo.getSessionKey(), dto.getEncryptedData(), dto.getIv());
throw new ServiceException("手机号或密码不正确!",TiktokConstant.TIKTOK_CREATOR_PWD_ERROR);
}
if(creator.getStatus().equals("0")){
throw new ServiceException("当前艺术家暂未审核,请耐心等待或联系客服!",TiktokConstant.TIKTOK_CREATOR_NOT_PASS_ERROR);
}
if(creator.getStatus().equals("2")){
throw new ServiceException("当前艺术家被封禁,请联系客服处理!",TiktokConstant.TIKTOK_CREATOR_BANED_ERROR);
}
//设置会话状态
String redisKey = RedisKeyConstant.WECHAT_CREATOR_LOGIN_KEY+Sm4Util.sm4Encryption(sessionInfo.getOpenId());
CreatorLoginVo creatorLoginVo = new CreatorLoginVo();
BeanUtils.copyProperties(creator, creatorLoginVo);
creatorLoginVo.setLastLoginTime(new Date());
//存在则设置会话状态
String redisKey = RedisKeyConstant.WECHAT_CREATOR_LOGIN_KEY+Sm4Util.sm4Encryption(dto.getPhone());
//存在该登录态则删除刷新
if(redisService.hasKey(redisKey)){
redisService.deleteObject(redisKey);
}
StringBuffer sb = new StringBuffer();
String randomId = IdUtils.fastSimpleUUID();
sb.append(randomId).append("#").append(sessionInfo.getOpenId());
sb.append(randomId).append("#").append(Sm4Util.sm4Encryption(dto.getPhone()+randomId));
//设置登录会话
Map<String, Object> map = new HashMap<>(2);
map.put("token", sb.toString());
map.put("sessionKey", sessionInfo.getSessionKey());
map.put("userInfo",creator);
redisService.setCacheObject(redisKey,map, 30L, TimeUnit.DAYS);
map.put("userInfo",creatorLoginVo);
redisService.setCacheObject(redisKey,map, 10L, TimeUnit.DAYS);
return map;
}

71
bnyer-services/bnyer-img/src/main/java/com/bnyer/img/vo/CreatorLoginVo.java

@ -0,0 +1,71 @@
package com.bnyer.img.vo;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
@Getter
@Setter
@ApiModel("艺术家登录响应类")
public class CreatorLoginVo implements Serializable {
@ApiModelProperty(value="主键id")
private Long id;
@ApiModelProperty(value="昵称")
private String name;
@ApiModelProperty(value="搜索码")
private String scanCode;
@ApiModelProperty(value="手机号")
private String phone;
@ApiModelProperty(value="头像img地址")
private String img;
@ApiModelProperty(value="简介")
private String intro;
@ApiModelProperty(value="余额")
private BigDecimal amt;
@ApiModelProperty(value="邀请码")
private String inviteCode;
@ApiModelProperty(value="状态(0->待审核;1->审核通过;2->审核拒绝)")
private String status;
@ApiModelProperty(value="第三方平台账号详情地址")
private String url;
@ApiModelProperty(value="是否活跃(0->不活跃;1->活跃 连续10天以上更新内容)")
private String isHot;
@ApiModelProperty(value="是否显示 (0->隐藏;1->显示)")
private String isShow;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@ApiModelProperty(value="创建时间")
private Date createTime;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@ApiModelProperty(value="更新时间")
private Date updateTime;
@ApiModelProperty(value="排序")
private Integer sort;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@ApiModelProperty(value="最后登录时间")
private Date lastLoginTime;
private static final long serialVersionUID = 1L;
}

7
bnyer-services/bnyer-img/src/main/resources/com/bnyer/img/mapper/CreatorMapper.xml

@ -6,7 +6,7 @@
<!--@Table img_creator-->
<id column="id" jdbcType="BIGINT" property="id" />
<result column="name" jdbcType="VARCHAR" property="name" />
<result column="open_id" jdbcType="VARCHAR" property="openId" />
<result column="password" jdbcType="VARCHAR" property="password" />
<result column="scan_code" jdbcType="VARCHAR" property="scanCode" />
<result column="phone" jdbcType="VARCHAR" property="phone" />
<result column="img" jdbcType="VARCHAR" property="img" />
@ -53,7 +53,7 @@
<sql id="Base_Column_List">
<!--@mbg.generated-->
id, `name`,open_id, scan_code, phone, img, intro, invite_code, url, status, is_hot, is_show, create_time,
id, `name`,password, scan_code, phone, img, intro, invite_code, url, status, is_hot, is_show, create_time,
update_time, sort, amt, last_login_time
</sql>
@ -79,9 +79,6 @@
<if test="params.scanCode != null and params.scanCode != ''">
and scan_code = #{params.scanCode}
</if>
<if test="params.openId != null and params.openId != ''">
and open_id = #{params.openId}
</if>
<if test="params.phone != null and params.phone != ''">
and phone = #{params.phone}
</if>

Loading…
Cancel
Save