diff --git a/api/src/main/java/com/sv/api/controller/LoginOrRegisterController.java b/api/src/main/java/com/sv/api/controller/LoginOrRegisterController.java index 314c291..093b147 100644 --- a/api/src/main/java/com/sv/api/controller/LoginOrRegisterController.java +++ b/api/src/main/java/com/sv/api/controller/LoginOrRegisterController.java @@ -44,16 +44,17 @@ public class LoginOrRegisterController extends BaseApiController { * @param address * @return */ - @RequestMapping(value = "/member/register" , method = RequestMethod.POST) - public ResponseDTO register(@RequestParam("mobile")String mobile,@RequestParam("captcha")String captcha, - @RequestParam(value = "name",required = false)String name, - @RequestParam(value = "sex",required = false)Integer sex, - @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); - } +// @RequestMapping(value = "/member/register" , method = RequestMethod.POST) +// @Deprecated +// public ResponseDTO register(@RequestParam("mobile")String mobile,@RequestParam("captcha")String captcha, +// @RequestParam(value = "name",required = false)String name, +// @RequestParam(value = "sex",required = false)Integer sex, +// @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); +// } /** * 手机号和验证码登录 @@ -72,12 +73,13 @@ public class LoginOrRegisterController extends BaseApiController { @Deprecated public ResponseDTO loginWx(@RequestParam("code") String code, @RequestParam("nickname") String nickname, @RequestParam("avatar") String avatar){ - String openId = wechatService.getXcxOpenId(code); //查询openId: - MemberTokenDTO memberTokenDTO = loginRegisterService.loginWithXcx(openId,nickname,avatar); - - // memberTokenDTO为null则跳绑定手机页面 - return ResponseDTO.ok().addAttribute("authorization",memberTokenDTO) - .addAttribute("information",loginRegisterService.info(avatar,nickname,openId)); +// String openId = wechatService.getXcxOpenId(code); //查询openId: +// MemberTokenDTO memberTokenDTO = loginRegisterService.loginWithXcx(openId,nickname,avatar); +// +// // memberTokenDTO为null则跳绑定手机页面 +// return ResponseDTO.ok().addAttribute("authorization",memberTokenDTO) +// .addAttribute("information",loginRegisterService.info(avatar,nickname,openId)); + return null; } /** diff --git a/api/src/main/java/com/sv/api/controller/UploadController.java b/api/src/main/java/com/sv/api/controller/UploadController.java index 036f2df..aa11090 100644 --- a/api/src/main/java/com/sv/api/controller/UploadController.java +++ b/api/src/main/java/com/sv/api/controller/UploadController.java @@ -1,10 +1,13 @@ package com.sv.api.controller; 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.ydd.framework.core.annotation.AccessToken; import com.ydd.framework.core.common.dto.ResponseDTO; 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.RequestParam; import org.springframework.web.bind.annotation.RestController; @@ -21,11 +24,23 @@ public class UploadController extends BaseApiController { private OSSClientUtil ossClientUtil; @Resource private LoginRegisterServiceImpl loginRegisterService; + @Resource + private MemberService memberService; @RequestMapping("/upload/avatar") @AccessToken public ResponseDTO uploadImg(@RequestParam("image") MultipartFile file) throws IOException { 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); loginRegisterService.updateInformation(loginMemberId,null,imgUrl); return ResponseDTO.ok(); diff --git a/api/src/main/java/com/sv/api/service/impl/LoginRegisterServiceImpl.java b/api/src/main/java/com/sv/api/service/impl/LoginRegisterServiceImpl.java index f6a5586..5771d7d 100644 --- a/api/src/main/java/com/sv/api/service/impl/LoginRegisterServiceImpl.java +++ b/api/src/main/java/com/sv/api/service/impl/LoginRegisterServiceImpl.java @@ -69,37 +69,37 @@ public class LoginRegisterServiceImpl extends BaseServiceImpl { /** * 手机号注册 */ - @Transactional - @Deprecated - public MemberTokenDTO registerByMobile(String mobile,String captcha,String name,Integer sex,Integer age,String address){ - ValidationUtils.assertNotBlank(mobile, "请输入手机号码"); - VenueValidateUtils.assertMobile(mobile); - ValidationUtils.assertNotNull(captcha); - - // 校验验证码是否正确 - captchaCacheService.assertCaptcha(mobile, ApiConstants.REGISTER_SMS_CAPTCHA_PREFIX, captcha); - MemberTokenDTO memberTokenDTO = null; - synchronized (mobile){ - // 根据手机号码创建新用户 - Member member = memberService.createByMobile(mobile,name,sex,age,address,PlatformContext.getValue()); - - // 删除验证码 - captchaCacheService.remove(mobile, ApiConstants.REGISTER_SMS_CAPTCHA_PREFIX); - - // 查询认证 - MemberAuth memberAuth = memberAuthService.findByMobile(mobile); - if (memberAuth == null){ - // 创建用户登录认证 - memberAuth = memberAuthService.createByMobile(member.getId(),member.getPlatformId(),mobile); - } - - // 查询访问凭证,并强制更新 - memberTokenDTO = memberTokenService.findDTOByMemberId(memberAuth.getMemberId(), Boolean.TRUE); - } - - - return memberTokenDTO; - } +// @Transactional +// @Deprecated +// public MemberTokenDTO registerByMobile(String mobile,String captcha,String name,Integer sex,Integer age,String address){ +// ValidationUtils.assertNotBlank(mobile, "请输入手机号码"); +// VenueValidateUtils.assertMobile(mobile); +// ValidationUtils.assertNotNull(captcha); +// +// // 校验验证码是否正确 +// captchaCacheService.assertCaptcha(mobile, ApiConstants.REGISTER_SMS_CAPTCHA_PREFIX, captcha); +// MemberTokenDTO memberTokenDTO = null; +// synchronized (mobile){ +// // 根据手机号码创建新用户 +// Member member = memberService.createByMobile(mobile,name,sex,age,address,PlatformContext.getValue()); +// +// // 删除验证码 +// captchaCacheService.remove(mobile, ApiConstants.REGISTER_SMS_CAPTCHA_PREFIX); +// +// // 查询认证 +// MemberAuth memberAuth = memberAuthService.findByMobile(mobile); +// if (memberAuth == null){ +// // 创建用户登录认证 +// memberAuth = memberAuthService.createByMobile(member.getId(),member.getPlatformId(),mobile); +// } +// +// // 查询访问凭证,并强制更新 +// memberTokenDTO = memberTokenService.findDTOByMemberId(memberAuth.getMemberId(), Boolean.TRUE); +// } +// +// +// return memberTokenDTO; +// } /** @@ -135,22 +135,23 @@ public class LoginRegisterServiceImpl extends BaseServiceImpl { /** * 微信快捷登录 */ - public MemberTokenDTO loginWithXcx(String openId,String nickname, String avatar){ - - MemberTokenDTO memberTokenDTO = null; - synchronized (openId){ - // 判断用户是否注册过,用微信登录过 - MemberAuth memberAuth = memberAuthService.findByAuthId(openId); - // 登录过,则直接登录成功 - if (memberAuth != null){ - // 查询访问凭证,并强制更新 - memberTokenDTO = memberTokenService.findDTOByMemberId(memberAuth.getMemberId(), Boolean.TRUE); - // 修改用户图像 - updateInformation(memberAuth.getMemberId(),nickname,avatar); - } - } - return memberTokenDTO; - } +// @Deprecated +// public MemberTokenDTO loginWithXcx(String openId,String nickname, String avatar){ +// +// MemberTokenDTO memberTokenDTO = null; +// synchronized (openId){ +// // 判断用户是否注册过,用微信登录过 +// MemberAuth memberAuth = memberAuthService.findByAuthId(openId); +// // 登录过,则直接登录成功 +// if (memberAuth != null){ +// // 查询访问凭证,并强制更新 +// memberTokenDTO = memberTokenService.findDTOByMemberId(memberAuth.getMemberId(), Boolean.TRUE); +// // 修改用户图像 +// updateInformation(memberAuth.getMemberId(),nickname,avatar); +// } +// } +// 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); @@ -306,31 +307,31 @@ public class LoginRegisterServiceImpl extends BaseServiceImpl { /** * 更新用户信息 */ - @Transactional - public Member updateMember(Member member,BindMobileDTO bindMobileDTO){ - member.setAvatar(bindMobileDTO.getAvatar()); - member.setNickname(bindMobileDTO.getNickname()); - member.setMobile(bindMobileDTO.getMobile()); - if (bindMobileDTO.getName() != null){ - member.setName(bindMobileDTO.getName()); - } - if (bindMobileDTO.getSex() != null){ - member.setSex(bindMobileDTO.getSex()); - } - if (bindMobileDTO.getAge() != null){ - member.setAge(bindMobileDTO.getAge()); - } - if (bindMobileDTO.getAddress() != null){ - member.setAddress(bindMobileDTO.getAddress()); - } - try { -// member.setAvatar(updateWxImgToOss(bindMobileDTO.getAvatar())); - } catch (Exception e) { - e.printStackTrace(); - } - memberService.update(member); - return member; - } +// @Transactional +// public Member updateMember(Member member,BindMobileDTO bindMobileDTO){ +// member.setAvatar(bindMobileDTO.getAvatar()); +// member.setNickname(bindMobileDTO.getNickname()); +// member.setMobile(bindMobileDTO.getMobile()); +// if (bindMobileDTO.getName() != null){ +// member.setName(bindMobileDTO.getName()); +// } +// if (bindMobileDTO.getSex() != null){ +// member.setSex(bindMobileDTO.getSex()); +// } +// if (bindMobileDTO.getAge() != null){ +// member.setAge(bindMobileDTO.getAge()); +// } +// if (bindMobileDTO.getAddress() != null){ +// member.setAddress(bindMobileDTO.getAddress()); +// } +// try { +//// member.setAvatar(updateWxImgToOss(bindMobileDTO.getAvatar())); +// } catch (Exception e) { +// e.printStackTrace(); +// } +// memberService.update(member); +// return member; +// } /** * 退出登录 @@ -363,10 +364,7 @@ public class LoginRegisterServiceImpl extends BaseServiceImpl { synchronized (openId.intern()){ Member member = memberService.findByMobile(mobile); if (member == null) { - member = memberService.createByMobile(mobile, bindMobileDTO.getNickname(), - bindMobileDTO.getSex(), bindMobileDTO.getAge(), bindMobileDTO.getAddress(), value); - updateInformation(member.getId(), bindMobileDTO.getNickname(), bindMobileDTO.getAvatar()); - + member = memberService.createByMobile(mobile, value); MemberAuth memberAuth = memberAuthService.findByMobile(mobile); if (memberAuth == null) { memberAuth = memberAuthService.createByMobileByOpenId(member.getId(), member.getPlatformId(), mobile, openId); @@ -389,7 +387,6 @@ public class LoginRegisterServiceImpl extends BaseServiceImpl { } else { throw new ServiceException("该手机号已被其他微信账号绑定"); } - updateInformation(member.getId(), bindMobileDTO.getNickname(), bindMobileDTO.getAvatar()); } } return memberTokenDTO; @@ -407,12 +404,22 @@ public class LoginRegisterServiceImpl extends BaseServiceImpl { if (nickname != null){ member.setNickname(nickname); } - member.setAvatar(avatar); - try { -// member.setAvatar(updateWxImgToOss(avatar)); - } catch (Exception e) { - e.printStackTrace(); + + // 如果更新了头像,增加修改次数 + if (avatar != null && !avatar.equals(member.getAvatar())) { + int currentYear = java.util.Calendar.getInstance().get(java.util.Calendar.YEAR); + 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); } } diff --git a/entity/src/main/java/com/sv/dto/api/BindMobileDTO.java b/entity/src/main/java/com/sv/dto/api/BindMobileDTO.java index 8a10c65..b7d5986 100644 --- a/entity/src/main/java/com/sv/dto/api/BindMobileDTO.java +++ b/entity/src/main/java/com/sv/dto/api/BindMobileDTO.java @@ -10,128 +10,11 @@ public class BindMobileDTO implements Serializable { */ private String loginCode; - /** - * 小程序openId - */ - private String openId; - /** * 微信手机号 code (wx.getPhoneNumber获取) */ 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() { return loginCode; } @@ -147,4 +30,4 @@ public class BindMobileDTO implements Serializable { public void setPhoneCode(String phoneCode) { this.phoneCode = phoneCode; } -} \ No newline at end of file +} diff --git a/entity/src/main/java/com/sv/dto/api/MemberDTO.java b/entity/src/main/java/com/sv/dto/api/MemberDTO.java index 8be5677..66c9f52 100644 --- a/entity/src/main/java/com/sv/dto/api/MemberDTO.java +++ b/entity/src/main/java/com/sv/dto/api/MemberDTO.java @@ -102,6 +102,11 @@ public class MemberDTO implements Serializable { */ private Integer deleted; + /** + * 本年头像剩余修改次数 + */ + private Integer avatarModifyRemainCount; + /** @@ -430,4 +435,12 @@ public class MemberDTO implements Serializable { return deleted; } + public Integer getAvatarModifyRemainCount() { + return avatarModifyRemainCount; + } + + public void setAvatarModifyRemainCount(Integer avatarModifyRemainCount) { + this.avatarModifyRemainCount = avatarModifyRemainCount; + } + } \ No newline at end of file diff --git a/entity/src/main/java/com/sv/entity/Member.java b/entity/src/main/java/com/sv/entity/Member.java index 27806e3..f942afa 100644 --- a/entity/src/main/java/com/sv/entity/Member.java +++ b/entity/src/main/java/com/sv/entity/Member.java @@ -117,6 +117,18 @@ public class Member implements Serializable { @JsonIgnore 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) { 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; + } } \ No newline at end of file diff --git a/other/sql/202604.sql b/other/sql/202604.sql new file mode 100644 index 0000000..57dea46 --- /dev/null +++ b/other/sql/202604.sql @@ -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 '头像修改统计年份'; diff --git a/service/src/main/java/com/sv/service/api/MemberService.java b/service/src/main/java/com/sv/service/api/MemberService.java index b568c0e..db0e8bc 100644 --- a/service/src/main/java/com/sv/service/api/MemberService.java +++ b/service/src/main/java/com/sv/service/api/MemberService.java @@ -211,7 +211,7 @@ public class MemberService extends BaseServiceImpl { * @return 新用户 */ @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); VenueValidateUtils.assertMobile(mobile); @@ -230,25 +230,12 @@ public class MemberService extends BaseServiceImpl { } member.setInviteCode(inviteCode); 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.setAvatarModifyCount(0); + member.setAvatarModifyYear(java.util.Calendar.getInstance().get(java.util.Calendar.YEAR)); + memberMapper.insert(member); return member; } @@ -375,6 +362,17 @@ public class MemberService extends BaseServiceImpl { memberDTO.setSex(member.getSex()); memberDTO.setAge(member.getAge() == null ? null : member.getAge()); 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; } @@ -461,6 +459,7 @@ public class MemberService extends BaseServiceImpl { * @param faceUrl * @param memberId */ + @Deprecated public void setMemberFaceInfo(Integer subjectId, String faceUrl, Integer memberId, Integer platformId) { MemberFaceInfo memberFaceInfo = memberMapper.findMemberFaceInfo(memberId); if (memberFaceInfo == null) { @@ -485,6 +484,7 @@ public class MemberService extends BaseServiceImpl { * @param file */ @Transactional + @Deprecated public void setMemberFaceInfo(Integer memberId, MultipartFile file, Integer platformId) { Date now = new Date(); MemberFaceInfo memberFaceInfo = memberMapper.findMemberFaceInfo(memberId); diff --git a/service/src/main/resources/mybatis/mapper/sv/MemberMapper.xml b/service/src/main/resources/mybatis/mapper/sv/MemberMapper.xml index c987777..f229859 100644 --- a/service/src/main/resources/mybatis/mapper/sv/MemberMapper.xml +++ b/service/src/main/resources/mybatis/mapper/sv/MemberMapper.xml @@ -21,6 +21,8 @@ + + @@ -42,6 +44,8 @@ + + @@ -79,7 +83,9 @@ platform_id, created_time, modified_time, - deleted + deleted, + avatar_modify_count, + avatar_modify_year @@ -100,7 +106,9 @@ #{platformId, jdbcType=INTEGER}, #{createdTime, jdbcType=TIMESTAMP}, #{modifiedTime, jdbcType=TIMESTAMP}, - #{deleted, jdbcType=TINYINT} + #{deleted, jdbcType=TINYINT}, + #{avatarModifyCount, jdbcType=INTEGER}, + #{avatarModifyYear, jdbcType=INTEGER} @@ -123,6 +131,8 @@ sm.created_time, sm.modified_time, sm.deleted, + sm.avatar_modify_count, + sm.avatar_modify_year, smfi.face_url FROM sv_member AS sm @@ -187,6 +197,12 @@ deleted, + + avatar_modify_count, + + + avatar_modify_year, + @@ -240,6 +256,12 @@ #{deleted}, + + #{avatarModifyCount}, + + + #{avatarModifyYear}, + @@ -317,6 +339,12 @@ deleted = #{deleted}, + + avatar_modify_count = #{avatarModifyCount}, + + + avatar_modify_year = #{avatarModifyYear}, + WHERE id = #{id} @@ -345,6 +373,8 @@ sm.created_time, sm.modified_time, sm.deleted, + sm.avatar_modify_count, + sm.avatar_modify_year, smfi.face_url FROM sv_member AS sm