feat(auth): 实现用户头像修改次数限制功能
- 在Member实体中添加avatarModifyCount和avatarModifyYear字段用于统计本年头像修改次数 - 在上传头像接口中实现头像修改次数检查,限制每年最多修改2次 - 更新用户信息时增加头像修改次数统计逻辑 - 修改createByMobile方法参数,移除不必要的用户信息参数 - 在MemberDTO中添加avatarModifyRemainCount字段显示剩余修改次数 - 添加数据库表结构变更SQL脚本 - 移除已废弃的手机号注册和微信登录相关代码 - 移除BindMobileDTO中的冗余字段定义
This commit is contained in:
@@ -44,16 +44,17 @@ public class LoginOrRegisterController extends BaseApiController {
|
|||||||
* @param address
|
* @param address
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
@RequestMapping(value = "/member/register" , method = RequestMethod.POST)
|
// @RequestMapping(value = "/member/register" , method = RequestMethod.POST)
|
||||||
public ResponseDTO register(@RequestParam("mobile")String mobile,@RequestParam("captcha")String captcha,
|
// @Deprecated
|
||||||
@RequestParam(value = "name",required = false)String name,
|
// public ResponseDTO register(@RequestParam("mobile")String mobile,@RequestParam("captcha")String captcha,
|
||||||
@RequestParam(value = "sex",required = false)Integer sex,
|
// @RequestParam(value = "name",required = false)String name,
|
||||||
@RequestParam(value = "age",required = false)Integer age,
|
// @RequestParam(value = "sex",required = false)Integer sex,
|
||||||
@RequestParam(value = "address",required = false)String address
|
// @RequestParam(value = "age",required = false)Integer age,
|
||||||
){
|
// @RequestParam(value = "address",required = false)String address
|
||||||
MemberTokenDTO memberTokenDTO = loginRegisterService.registerByMobile(mobile, captcha, name, sex, age , address);
|
// ){
|
||||||
return ResponseDTO.ok().addAttribute("authorization",memberTokenDTO);
|
// MemberTokenDTO memberTokenDTO = loginRegisterService.registerByMobile(mobile, captcha, name, sex, age , address);
|
||||||
}
|
// return ResponseDTO.ok().addAttribute("authorization",memberTokenDTO);
|
||||||
|
// }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 手机号和验证码登录
|
* 手机号和验证码登录
|
||||||
@@ -72,12 +73,13 @@ public class LoginOrRegisterController extends BaseApiController {
|
|||||||
@Deprecated
|
@Deprecated
|
||||||
public ResponseDTO loginWx(@RequestParam("code") String code, @RequestParam("nickname") String nickname,
|
public ResponseDTO loginWx(@RequestParam("code") String code, @RequestParam("nickname") String nickname,
|
||||||
@RequestParam("avatar") String avatar){
|
@RequestParam("avatar") String avatar){
|
||||||
String openId = wechatService.getXcxOpenId(code); //查询openId:
|
// String openId = wechatService.getXcxOpenId(code); //查询openId:
|
||||||
MemberTokenDTO memberTokenDTO = loginRegisterService.loginWithXcx(openId,nickname,avatar);
|
// MemberTokenDTO memberTokenDTO = loginRegisterService.loginWithXcx(openId,nickname,avatar);
|
||||||
|
//
|
||||||
// memberTokenDTO为null则跳绑定手机页面
|
// // memberTokenDTO为null则跳绑定手机页面
|
||||||
return ResponseDTO.ok().addAttribute("authorization",memberTokenDTO)
|
// return ResponseDTO.ok().addAttribute("authorization",memberTokenDTO)
|
||||||
.addAttribute("information",loginRegisterService.info(avatar,nickname,openId));
|
// .addAttribute("information",loginRegisterService.info(avatar,nickname,openId));
|
||||||
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -1,10 +1,13 @@
|
|||||||
package com.sv.api.controller;
|
package com.sv.api.controller;
|
||||||
|
|
||||||
import com.sv.api.service.impl.LoginRegisterServiceImpl;
|
import com.sv.api.service.impl.LoginRegisterServiceImpl;
|
||||||
|
import com.sv.entity.Member;
|
||||||
|
import com.sv.service.api.MemberService;
|
||||||
import com.sv.service.common.OSSClientUtil;
|
import com.sv.service.common.OSSClientUtil;
|
||||||
import com.ydd.framework.core.annotation.AccessToken;
|
import com.ydd.framework.core.annotation.AccessToken;
|
||||||
import com.ydd.framework.core.common.dto.ResponseDTO;
|
import com.ydd.framework.core.common.dto.ResponseDTO;
|
||||||
import com.ydd.framework.core.controller.BaseApiController;
|
import com.ydd.framework.core.controller.BaseApiController;
|
||||||
|
import com.ydd.framework.core.exception.ServiceException;
|
||||||
import org.springframework.web.bind.annotation.RequestMapping;
|
import org.springframework.web.bind.annotation.RequestMapping;
|
||||||
import org.springframework.web.bind.annotation.RequestParam;
|
import org.springframework.web.bind.annotation.RequestParam;
|
||||||
import org.springframework.web.bind.annotation.RestController;
|
import org.springframework.web.bind.annotation.RestController;
|
||||||
@@ -21,11 +24,23 @@ public class UploadController extends BaseApiController {
|
|||||||
private OSSClientUtil ossClientUtil;
|
private OSSClientUtil ossClientUtil;
|
||||||
@Resource
|
@Resource
|
||||||
private LoginRegisterServiceImpl loginRegisterService;
|
private LoginRegisterServiceImpl loginRegisterService;
|
||||||
|
@Resource
|
||||||
|
private MemberService memberService;
|
||||||
|
|
||||||
@RequestMapping("/upload/avatar")
|
@RequestMapping("/upload/avatar")
|
||||||
@AccessToken
|
@AccessToken
|
||||||
public ResponseDTO uploadImg(@RequestParam("image") MultipartFile file) throws IOException {
|
public ResponseDTO uploadImg(@RequestParam("image") MultipartFile file) throws IOException {
|
||||||
Integer loginMemberId = getLoginMemberId();
|
Integer loginMemberId = getLoginMemberId();
|
||||||
|
Member member = memberService.findById(loginMemberId);
|
||||||
|
// 检查头像修改次数限制
|
||||||
|
int currentYear = java.util.Calendar.getInstance().get(java.util.Calendar.YEAR);
|
||||||
|
Integer modifyCount = member.getAvatarModifyCount();
|
||||||
|
Integer modifyYear = member.getAvatarModifyYear();
|
||||||
|
if (modifyYear != null && modifyYear == currentYear) {
|
||||||
|
if (modifyCount != null && modifyCount >= 2) {
|
||||||
|
throw new ServiceException("本年头像修改次数已达上限(2次)");
|
||||||
|
}
|
||||||
|
}
|
||||||
String imgUrl = ossClientUtil.uploadImg(file);
|
String imgUrl = ossClientUtil.uploadImg(file);
|
||||||
loginRegisterService.updateInformation(loginMemberId,null,imgUrl);
|
loginRegisterService.updateInformation(loginMemberId,null,imgUrl);
|
||||||
return ResponseDTO.ok();
|
return ResponseDTO.ok();
|
||||||
|
|||||||
@@ -69,37 +69,37 @@ public class LoginRegisterServiceImpl extends BaseServiceImpl {
|
|||||||
/**
|
/**
|
||||||
* 手机号注册
|
* 手机号注册
|
||||||
*/
|
*/
|
||||||
@Transactional
|
// @Transactional
|
||||||
@Deprecated
|
// @Deprecated
|
||||||
public MemberTokenDTO registerByMobile(String mobile,String captcha,String name,Integer sex,Integer age,String address){
|
// public MemberTokenDTO registerByMobile(String mobile,String captcha,String name,Integer sex,Integer age,String address){
|
||||||
ValidationUtils.assertNotBlank(mobile, "请输入手机号码");
|
// ValidationUtils.assertNotBlank(mobile, "请输入手机号码");
|
||||||
VenueValidateUtils.assertMobile(mobile);
|
// VenueValidateUtils.assertMobile(mobile);
|
||||||
ValidationUtils.assertNotNull(captcha);
|
// ValidationUtils.assertNotNull(captcha);
|
||||||
|
//
|
||||||
// 校验验证码是否正确
|
// // 校验验证码是否正确
|
||||||
captchaCacheService.assertCaptcha(mobile, ApiConstants.REGISTER_SMS_CAPTCHA_PREFIX, captcha);
|
// captchaCacheService.assertCaptcha(mobile, ApiConstants.REGISTER_SMS_CAPTCHA_PREFIX, captcha);
|
||||||
MemberTokenDTO memberTokenDTO = null;
|
// MemberTokenDTO memberTokenDTO = null;
|
||||||
synchronized (mobile){
|
// synchronized (mobile){
|
||||||
// 根据手机号码创建新用户
|
// // 根据手机号码创建新用户
|
||||||
Member member = memberService.createByMobile(mobile,name,sex,age,address,PlatformContext.getValue());
|
// Member member = memberService.createByMobile(mobile,name,sex,age,address,PlatformContext.getValue());
|
||||||
|
//
|
||||||
// 删除验证码
|
// // 删除验证码
|
||||||
captchaCacheService.remove(mobile, ApiConstants.REGISTER_SMS_CAPTCHA_PREFIX);
|
// captchaCacheService.remove(mobile, ApiConstants.REGISTER_SMS_CAPTCHA_PREFIX);
|
||||||
|
//
|
||||||
// 查询认证
|
// // 查询认证
|
||||||
MemberAuth memberAuth = memberAuthService.findByMobile(mobile);
|
// MemberAuth memberAuth = memberAuthService.findByMobile(mobile);
|
||||||
if (memberAuth == null){
|
// if (memberAuth == null){
|
||||||
// 创建用户登录认证
|
// // 创建用户登录认证
|
||||||
memberAuth = memberAuthService.createByMobile(member.getId(),member.getPlatformId(),mobile);
|
// memberAuth = memberAuthService.createByMobile(member.getId(),member.getPlatformId(),mobile);
|
||||||
}
|
// }
|
||||||
|
//
|
||||||
// 查询访问凭证,并强制更新
|
// // 查询访问凭证,并强制更新
|
||||||
memberTokenDTO = memberTokenService.findDTOByMemberId(memberAuth.getMemberId(), Boolean.TRUE);
|
// memberTokenDTO = memberTokenService.findDTOByMemberId(memberAuth.getMemberId(), Boolean.TRUE);
|
||||||
}
|
// }
|
||||||
|
//
|
||||||
|
//
|
||||||
return memberTokenDTO;
|
// return memberTokenDTO;
|
||||||
}
|
// }
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -135,22 +135,23 @@ public class LoginRegisterServiceImpl extends BaseServiceImpl {
|
|||||||
/**
|
/**
|
||||||
* 微信快捷登录
|
* 微信快捷登录
|
||||||
*/
|
*/
|
||||||
public MemberTokenDTO loginWithXcx(String openId,String nickname, String avatar){
|
// @Deprecated
|
||||||
|
// public MemberTokenDTO loginWithXcx(String openId,String nickname, String avatar){
|
||||||
MemberTokenDTO memberTokenDTO = null;
|
//
|
||||||
synchronized (openId){
|
// MemberTokenDTO memberTokenDTO = null;
|
||||||
// 判断用户是否注册过,用微信登录过
|
// synchronized (openId){
|
||||||
MemberAuth memberAuth = memberAuthService.findByAuthId(openId);
|
// // 判断用户是否注册过,用微信登录过
|
||||||
// 登录过,则直接登录成功
|
// MemberAuth memberAuth = memberAuthService.findByAuthId(openId);
|
||||||
if (memberAuth != null){
|
// // 登录过,则直接登录成功
|
||||||
// 查询访问凭证,并强制更新
|
// if (memberAuth != null){
|
||||||
memberTokenDTO = memberTokenService.findDTOByMemberId(memberAuth.getMemberId(), Boolean.TRUE);
|
// // 查询访问凭证,并强制更新
|
||||||
// 修改用户图像
|
// memberTokenDTO = memberTokenService.findDTOByMemberId(memberAuth.getMemberId(), Boolean.TRUE);
|
||||||
updateInformation(memberAuth.getMemberId(),nickname,avatar);
|
// // 修改用户图像
|
||||||
}
|
// updateInformation(memberAuth.getMemberId(),nickname,avatar);
|
||||||
}
|
// }
|
||||||
return memberTokenDTO;
|
// }
|
||||||
}
|
// return memberTokenDTO;
|
||||||
|
// }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 已用手机号登录,支付,再跳转微信登录
|
* 已用手机号登录,支付,再跳转微信登录
|
||||||
@@ -188,7 +189,7 @@ public class LoginRegisterServiceImpl extends BaseServiceImpl {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 修改用户图像
|
// 修改用户图像
|
||||||
updateInformation(memberId,nickname,avatar);
|
// updateInformation(memberId,nickname,avatar);
|
||||||
|
|
||||||
// 查询访问凭证,并强制更新
|
// 查询访问凭证,并强制更新
|
||||||
memberTokenDTO = memberTokenService.findDTOByMemberId(memberId, Boolean.TRUE);
|
memberTokenDTO = memberTokenService.findDTOByMemberId(memberId, Boolean.TRUE);
|
||||||
@@ -306,31 +307,31 @@ public class LoginRegisterServiceImpl extends BaseServiceImpl {
|
|||||||
/**
|
/**
|
||||||
* 更新用户信息
|
* 更新用户信息
|
||||||
*/
|
*/
|
||||||
@Transactional
|
// @Transactional
|
||||||
public Member updateMember(Member member,BindMobileDTO bindMobileDTO){
|
// public Member updateMember(Member member,BindMobileDTO bindMobileDTO){
|
||||||
member.setAvatar(bindMobileDTO.getAvatar());
|
// member.setAvatar(bindMobileDTO.getAvatar());
|
||||||
member.setNickname(bindMobileDTO.getNickname());
|
// member.setNickname(bindMobileDTO.getNickname());
|
||||||
member.setMobile(bindMobileDTO.getMobile());
|
// member.setMobile(bindMobileDTO.getMobile());
|
||||||
if (bindMobileDTO.getName() != null){
|
// if (bindMobileDTO.getName() != null){
|
||||||
member.setName(bindMobileDTO.getName());
|
// member.setName(bindMobileDTO.getName());
|
||||||
}
|
// }
|
||||||
if (bindMobileDTO.getSex() != null){
|
// if (bindMobileDTO.getSex() != null){
|
||||||
member.setSex(bindMobileDTO.getSex());
|
// member.setSex(bindMobileDTO.getSex());
|
||||||
}
|
// }
|
||||||
if (bindMobileDTO.getAge() != null){
|
// if (bindMobileDTO.getAge() != null){
|
||||||
member.setAge(bindMobileDTO.getAge());
|
// member.setAge(bindMobileDTO.getAge());
|
||||||
}
|
// }
|
||||||
if (bindMobileDTO.getAddress() != null){
|
// if (bindMobileDTO.getAddress() != null){
|
||||||
member.setAddress(bindMobileDTO.getAddress());
|
// member.setAddress(bindMobileDTO.getAddress());
|
||||||
}
|
// }
|
||||||
try {
|
// try {
|
||||||
// member.setAvatar(updateWxImgToOss(bindMobileDTO.getAvatar()));
|
//// member.setAvatar(updateWxImgToOss(bindMobileDTO.getAvatar()));
|
||||||
} catch (Exception e) {
|
// } catch (Exception e) {
|
||||||
e.printStackTrace();
|
// e.printStackTrace();
|
||||||
}
|
// }
|
||||||
memberService.update(member);
|
// memberService.update(member);
|
||||||
return member;
|
// return member;
|
||||||
}
|
// }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 退出登录
|
* 退出登录
|
||||||
@@ -363,10 +364,7 @@ public class LoginRegisterServiceImpl extends BaseServiceImpl {
|
|||||||
synchronized (openId.intern()){
|
synchronized (openId.intern()){
|
||||||
Member member = memberService.findByMobile(mobile);
|
Member member = memberService.findByMobile(mobile);
|
||||||
if (member == null) {
|
if (member == null) {
|
||||||
member = memberService.createByMobile(mobile, bindMobileDTO.getNickname(),
|
member = memberService.createByMobile(mobile, value);
|
||||||
bindMobileDTO.getSex(), bindMobileDTO.getAge(), bindMobileDTO.getAddress(), value);
|
|
||||||
updateInformation(member.getId(), bindMobileDTO.getNickname(), bindMobileDTO.getAvatar());
|
|
||||||
|
|
||||||
MemberAuth memberAuth = memberAuthService.findByMobile(mobile);
|
MemberAuth memberAuth = memberAuthService.findByMobile(mobile);
|
||||||
if (memberAuth == null) {
|
if (memberAuth == null) {
|
||||||
memberAuth = memberAuthService.createByMobileByOpenId(member.getId(), member.getPlatformId(), mobile, openId);
|
memberAuth = memberAuthService.createByMobileByOpenId(member.getId(), member.getPlatformId(), mobile, openId);
|
||||||
@@ -389,7 +387,6 @@ public class LoginRegisterServiceImpl extends BaseServiceImpl {
|
|||||||
} else {
|
} else {
|
||||||
throw new ServiceException("该手机号已被其他微信账号绑定");
|
throw new ServiceException("该手机号已被其他微信账号绑定");
|
||||||
}
|
}
|
||||||
updateInformation(member.getId(), bindMobileDTO.getNickname(), bindMobileDTO.getAvatar());
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return memberTokenDTO;
|
return memberTokenDTO;
|
||||||
@@ -407,12 +404,22 @@ public class LoginRegisterServiceImpl extends BaseServiceImpl {
|
|||||||
if (nickname != null){
|
if (nickname != null){
|
||||||
member.setNickname(nickname);
|
member.setNickname(nickname);
|
||||||
}
|
}
|
||||||
member.setAvatar(avatar);
|
|
||||||
try {
|
// 如果更新了头像,增加修改次数
|
||||||
// member.setAvatar(updateWxImgToOss(avatar));
|
if (avatar != null && !avatar.equals(member.getAvatar())) {
|
||||||
} catch (Exception e) {
|
int currentYear = java.util.Calendar.getInstance().get(java.util.Calendar.YEAR);
|
||||||
e.printStackTrace();
|
Integer modifyCount = member.getAvatarModifyCount();
|
||||||
|
Integer modifyYear = member.getAvatarModifyYear();
|
||||||
|
|
||||||
|
if (modifyYear == null || modifyYear != currentYear) {
|
||||||
|
member.setAvatarModifyCount(1);
|
||||||
|
member.setAvatarModifyYear(currentYear);
|
||||||
|
} else {
|
||||||
|
member.setAvatarModifyCount((modifyCount == null ? 0 : modifyCount) + 1);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
member.setAvatar(avatar);
|
||||||
memberService.update(member);
|
memberService.update(member);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -10,128 +10,11 @@ public class BindMobileDTO implements Serializable {
|
|||||||
*/
|
*/
|
||||||
private String loginCode;
|
private String loginCode;
|
||||||
|
|
||||||
/**
|
|
||||||
* 小程序openId
|
|
||||||
*/
|
|
||||||
private String openId;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 微信手机号 code (wx.getPhoneNumber获取)
|
* 微信手机号 code (wx.getPhoneNumber获取)
|
||||||
*/
|
*/
|
||||||
private String phoneCode;
|
private String phoneCode;
|
||||||
|
|
||||||
/**
|
|
||||||
* 微信昵称
|
|
||||||
*/
|
|
||||||
private String nickname;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 微信图像
|
|
||||||
*/
|
|
||||||
private String avatar;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 手机号码 (从phoneCode解析得到)
|
|
||||||
*/
|
|
||||||
private String mobile;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 验证码 (不再使用)
|
|
||||||
*/
|
|
||||||
private String captcha;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 真实姓名
|
|
||||||
*/
|
|
||||||
private String name;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 性别
|
|
||||||
*/
|
|
||||||
private Integer sex;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 年龄
|
|
||||||
*/
|
|
||||||
private Integer age;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 地址
|
|
||||||
*/
|
|
||||||
private String address;
|
|
||||||
|
|
||||||
public String getOpenId() {
|
|
||||||
return openId;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setOpenId(String openId) {
|
|
||||||
this.openId = openId;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getNickname() {
|
|
||||||
return nickname;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setNickname(String nickname) {
|
|
||||||
this.nickname = nickname;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getAvatar() {
|
|
||||||
return avatar;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setAvatar(String avatar) {
|
|
||||||
this.avatar = avatar;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getMobile() {
|
|
||||||
return mobile;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setMobile(String mobile) {
|
|
||||||
this.mobile = mobile;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getCaptcha() {
|
|
||||||
return captcha;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setCaptcha(String captcha) {
|
|
||||||
this.captcha = captcha;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getName() {
|
|
||||||
return name;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setName(String name) {
|
|
||||||
this.name = name;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Integer getSex() {
|
|
||||||
return sex;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setSex(Integer sex) {
|
|
||||||
this.sex = sex;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Integer getAge() {
|
|
||||||
return age;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setAge(Integer age) {
|
|
||||||
this.age = age;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getAddress() {
|
|
||||||
return address;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setAddress(String address) {
|
|
||||||
this.address = address;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getLoginCode() {
|
public String getLoginCode() {
|
||||||
return loginCode;
|
return loginCode;
|
||||||
}
|
}
|
||||||
@@ -147,4 +30,4 @@ public class BindMobileDTO implements Serializable {
|
|||||||
public void setPhoneCode(String phoneCode) {
|
public void setPhoneCode(String phoneCode) {
|
||||||
this.phoneCode = phoneCode;
|
this.phoneCode = phoneCode;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -102,6 +102,11 @@ public class MemberDTO implements Serializable {
|
|||||||
*/
|
*/
|
||||||
private Integer deleted;
|
private Integer deleted;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 本年头像剩余修改次数
|
||||||
|
*/
|
||||||
|
private Integer avatarModifyRemainCount;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -430,4 +435,12 @@ public class MemberDTO implements Serializable {
|
|||||||
return deleted;
|
return deleted;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Integer getAvatarModifyRemainCount() {
|
||||||
|
return avatarModifyRemainCount;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setAvatarModifyRemainCount(Integer avatarModifyRemainCount) {
|
||||||
|
this.avatarModifyRemainCount = avatarModifyRemainCount;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -117,6 +117,18 @@ public class Member implements Serializable {
|
|||||||
@JsonIgnore
|
@JsonIgnore
|
||||||
private Integer deleted;
|
private Integer deleted;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 头像修改次数(本年)
|
||||||
|
*/
|
||||||
|
@JsonIgnore
|
||||||
|
private Integer avatarModifyCount;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 头像修改统计年份
|
||||||
|
*/
|
||||||
|
@JsonIgnore
|
||||||
|
private Integer avatarModifyYear;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -452,4 +464,20 @@ public class Member implements Serializable {
|
|||||||
public void setBanType(Integer banType) {
|
public void setBanType(Integer banType) {
|
||||||
this.banType = banType;
|
this.banType = banType;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Integer getAvatarModifyCount() {
|
||||||
|
return avatarModifyCount;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setAvatarModifyCount(Integer avatarModifyCount) {
|
||||||
|
this.avatarModifyCount = avatarModifyCount;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Integer getAvatarModifyYear() {
|
||||||
|
return avatarModifyYear;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setAvatarModifyYear(Integer avatarModifyYear) {
|
||||||
|
this.avatarModifyYear = avatarModifyYear;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
4
other/sql/202604.sql
Normal file
4
other/sql/202604.sql
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
-- 2026年4月 - 添加用户头像修改限制字段
|
||||||
|
ALTER TABLE sv_member
|
||||||
|
ADD COLUMN avatar_modify_count INT DEFAULT 0 COMMENT '本年头像修改次数',
|
||||||
|
ADD COLUMN avatar_modify_year INT DEFAULT NULL COMMENT '头像修改统计年份';
|
||||||
@@ -211,7 +211,7 @@ public class MemberService extends BaseServiceImpl {
|
|||||||
* @return 新用户
|
* @return 新用户
|
||||||
*/
|
*/
|
||||||
@Transactional
|
@Transactional
|
||||||
public Member createByMobile(String mobile, String name, Integer sex, Integer age, String address, Integer platformId) {
|
public Member createByMobile(String mobile, Integer platformId) {
|
||||||
// 参数校验
|
// 参数校验
|
||||||
ValidationUtils.assertNotNull(mobile);
|
ValidationUtils.assertNotNull(mobile);
|
||||||
VenueValidateUtils.assertMobile(mobile);
|
VenueValidateUtils.assertMobile(mobile);
|
||||||
@@ -230,25 +230,12 @@ public class MemberService extends BaseServiceImpl {
|
|||||||
}
|
}
|
||||||
member.setInviteCode(inviteCode);
|
member.setInviteCode(inviteCode);
|
||||||
member.setMobile(mobile);
|
member.setMobile(mobile);
|
||||||
if (name != null) {
|
|
||||||
if (name.length() > 8) {
|
|
||||||
throw new ServiceException("姓名不能超过8位");
|
|
||||||
}
|
|
||||||
member.setName(name);
|
|
||||||
}
|
|
||||||
if (sex != null) {
|
|
||||||
member.setSex(sex);
|
|
||||||
}
|
|
||||||
if (age != null) {
|
|
||||||
if (age.intValue() < 10 || age.intValue() > 100) {
|
|
||||||
throw new ServiceException("年龄在10-100之间");
|
|
||||||
}
|
|
||||||
member.setAge(age);
|
|
||||||
}
|
|
||||||
if (address != null) {
|
|
||||||
member.setAddress(address);
|
|
||||||
}
|
|
||||||
member.setPlatformId(platformId);
|
member.setPlatformId(platformId);
|
||||||
|
|
||||||
|
// 初始化头像修改次数
|
||||||
|
member.setAvatarModifyCount(0);
|
||||||
|
member.setAvatarModifyYear(java.util.Calendar.getInstance().get(java.util.Calendar.YEAR));
|
||||||
|
|
||||||
memberMapper.insert(member);
|
memberMapper.insert(member);
|
||||||
return member;
|
return member;
|
||||||
}
|
}
|
||||||
@@ -375,6 +362,17 @@ public class MemberService extends BaseServiceImpl {
|
|||||||
memberDTO.setSex(member.getSex());
|
memberDTO.setSex(member.getSex());
|
||||||
memberDTO.setAge(member.getAge() == null ? null : member.getAge());
|
memberDTO.setAge(member.getAge() == null ? null : member.getAge());
|
||||||
memberDTO.setAddress(member.getAddress() == null ? "" : member.getAddress());
|
memberDTO.setAddress(member.getAddress() == null ? "" : member.getAddress());
|
||||||
|
|
||||||
|
// 计算本年头像剩余修改次数
|
||||||
|
int currentYear = java.util.Calendar.getInstance().get(java.util.Calendar.YEAR);
|
||||||
|
Integer modifyCount = member.getAvatarModifyCount();
|
||||||
|
Integer modifyYear = member.getAvatarModifyYear();
|
||||||
|
if (modifyYear == null || modifyYear != currentYear) {
|
||||||
|
memberDTO.setAvatarModifyRemainCount(2);
|
||||||
|
} else {
|
||||||
|
memberDTO.setAvatarModifyRemainCount(Math.max(0, 2 - (modifyCount == null ? 0 : modifyCount)));
|
||||||
|
}
|
||||||
|
|
||||||
return memberDTO;
|
return memberDTO;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -461,6 +459,7 @@ public class MemberService extends BaseServiceImpl {
|
|||||||
* @param faceUrl
|
* @param faceUrl
|
||||||
* @param memberId
|
* @param memberId
|
||||||
*/
|
*/
|
||||||
|
@Deprecated
|
||||||
public void setMemberFaceInfo(Integer subjectId, String faceUrl, Integer memberId, Integer platformId) {
|
public void setMemberFaceInfo(Integer subjectId, String faceUrl, Integer memberId, Integer platformId) {
|
||||||
MemberFaceInfo memberFaceInfo = memberMapper.findMemberFaceInfo(memberId);
|
MemberFaceInfo memberFaceInfo = memberMapper.findMemberFaceInfo(memberId);
|
||||||
if (memberFaceInfo == null) {
|
if (memberFaceInfo == null) {
|
||||||
@@ -485,6 +484,7 @@ public class MemberService extends BaseServiceImpl {
|
|||||||
* @param file
|
* @param file
|
||||||
*/
|
*/
|
||||||
@Transactional
|
@Transactional
|
||||||
|
@Deprecated
|
||||||
public void setMemberFaceInfo(Integer memberId, MultipartFile file, Integer platformId) {
|
public void setMemberFaceInfo(Integer memberId, MultipartFile file, Integer platformId) {
|
||||||
Date now = new Date();
|
Date now = new Date();
|
||||||
MemberFaceInfo memberFaceInfo = memberMapper.findMemberFaceInfo(memberId);
|
MemberFaceInfo memberFaceInfo = memberMapper.findMemberFaceInfo(memberId);
|
||||||
|
|||||||
@@ -21,6 +21,8 @@
|
|||||||
<result column="created_time" property="createdTime" jdbcType="TIMESTAMP" />
|
<result column="created_time" property="createdTime" jdbcType="TIMESTAMP" />
|
||||||
<result column="modified_time" property="modifiedTime" jdbcType="TIMESTAMP" />
|
<result column="modified_time" property="modifiedTime" jdbcType="TIMESTAMP" />
|
||||||
<result column="deleted" property="deleted" jdbcType="TINYINT" />
|
<result column="deleted" property="deleted" jdbcType="TINYINT" />
|
||||||
|
<result column="avatar_modify_count" property="avatarModifyCount" jdbcType="INTEGER" />
|
||||||
|
<result column="avatar_modify_year" property="avatarModifyYear" jdbcType="INTEGER" />
|
||||||
<result column="face_url" property="faceUrl" jdbcType="VARCHAR" />
|
<result column="face_url" property="faceUrl" jdbcType="VARCHAR" />
|
||||||
</resultMap>
|
</resultMap>
|
||||||
|
|
||||||
@@ -42,6 +44,8 @@
|
|||||||
<result column="created_time" property="createdTime" jdbcType="TIMESTAMP" />
|
<result column="created_time" property="createdTime" jdbcType="TIMESTAMP" />
|
||||||
<result column="modified_time" property="modifiedTime" jdbcType="TIMESTAMP" />
|
<result column="modified_time" property="modifiedTime" jdbcType="TIMESTAMP" />
|
||||||
<result column="deleted" property="deleted" jdbcType="TINYINT" />
|
<result column="deleted" property="deleted" jdbcType="TINYINT" />
|
||||||
|
<result column="avatar_modify_count" property="avatarModifyCount" jdbcType="INTEGER" />
|
||||||
|
<result column="avatar_modify_year" property="avatarModifyYear" jdbcType="INTEGER" />
|
||||||
</resultMap>
|
</resultMap>
|
||||||
|
|
||||||
<resultMap id="MemberFaceInfoMap" type="com.sv.entity.MemberFaceInfo">
|
<resultMap id="MemberFaceInfoMap" type="com.sv.entity.MemberFaceInfo">
|
||||||
@@ -79,7 +83,9 @@
|
|||||||
platform_id,
|
platform_id,
|
||||||
created_time,
|
created_time,
|
||||||
modified_time,
|
modified_time,
|
||||||
deleted
|
deleted,
|
||||||
|
avatar_modify_count,
|
||||||
|
avatar_modify_year
|
||||||
</sql>
|
</sql>
|
||||||
|
|
||||||
<!-- 字段值 -->
|
<!-- 字段值 -->
|
||||||
@@ -100,7 +106,9 @@
|
|||||||
#{platformId, jdbcType=INTEGER},
|
#{platformId, jdbcType=INTEGER},
|
||||||
#{createdTime, jdbcType=TIMESTAMP},
|
#{createdTime, jdbcType=TIMESTAMP},
|
||||||
#{modifiedTime, jdbcType=TIMESTAMP},
|
#{modifiedTime, jdbcType=TIMESTAMP},
|
||||||
#{deleted, jdbcType=TINYINT}
|
#{deleted, jdbcType=TINYINT},
|
||||||
|
#{avatarModifyCount, jdbcType=INTEGER},
|
||||||
|
#{avatarModifyYear, jdbcType=INTEGER}
|
||||||
</sql>
|
</sql>
|
||||||
|
|
||||||
<!-- 查询全部记录 -->
|
<!-- 查询全部记录 -->
|
||||||
@@ -123,6 +131,8 @@
|
|||||||
sm.created_time,
|
sm.created_time,
|
||||||
sm.modified_time,
|
sm.modified_time,
|
||||||
sm.deleted,
|
sm.deleted,
|
||||||
|
sm.avatar_modify_count,
|
||||||
|
sm.avatar_modify_year,
|
||||||
smfi.face_url
|
smfi.face_url
|
||||||
FROM
|
FROM
|
||||||
sv_member AS sm
|
sv_member AS sm
|
||||||
@@ -187,6 +197,12 @@
|
|||||||
<if test="deleted != null">
|
<if test="deleted != null">
|
||||||
deleted,
|
deleted,
|
||||||
</if>
|
</if>
|
||||||
|
<if test="avatarModifyCount != null">
|
||||||
|
avatar_modify_count,
|
||||||
|
</if>
|
||||||
|
<if test="avatarModifyYear != null">
|
||||||
|
avatar_modify_year,
|
||||||
|
</if>
|
||||||
</trim>
|
</trim>
|
||||||
<trim prefix="values (" suffix=")" suffixOverrides=",">
|
<trim prefix="values (" suffix=")" suffixOverrides=",">
|
||||||
<if test="id != null">
|
<if test="id != null">
|
||||||
@@ -240,6 +256,12 @@
|
|||||||
<if test="deleted != null">
|
<if test="deleted != null">
|
||||||
#{deleted},
|
#{deleted},
|
||||||
</if>
|
</if>
|
||||||
|
<if test="avatarModifyCount != null">
|
||||||
|
#{avatarModifyCount},
|
||||||
|
</if>
|
||||||
|
<if test="avatarModifyYear != null">
|
||||||
|
#{avatarModifyYear},
|
||||||
|
</if>
|
||||||
</trim>
|
</trim>
|
||||||
</insert>
|
</insert>
|
||||||
|
|
||||||
@@ -317,6 +339,12 @@
|
|||||||
<if test="deleted != null">
|
<if test="deleted != null">
|
||||||
deleted = #{deleted},
|
deleted = #{deleted},
|
||||||
</if>
|
</if>
|
||||||
|
<if test="avatarModifyCount != null">
|
||||||
|
avatar_modify_count = #{avatarModifyCount},
|
||||||
|
</if>
|
||||||
|
<if test="avatarModifyYear != null">
|
||||||
|
avatar_modify_year = #{avatarModifyYear},
|
||||||
|
</if>
|
||||||
</set>
|
</set>
|
||||||
WHERE id = #{id}
|
WHERE id = #{id}
|
||||||
</update>
|
</update>
|
||||||
@@ -345,6 +373,8 @@
|
|||||||
sm.created_time,
|
sm.created_time,
|
||||||
sm.modified_time,
|
sm.modified_time,
|
||||||
sm.deleted,
|
sm.deleted,
|
||||||
|
sm.avatar_modify_count,
|
||||||
|
sm.avatar_modify_year,
|
||||||
smfi.face_url
|
smfi.face_url
|
||||||
FROM
|
FROM
|
||||||
sv_member AS sm
|
sv_member AS sm
|
||||||
|
|||||||
Reference in New Issue
Block a user