diff --git a/my-project-backend/src/main/java/com/example/controller/AccountController.java b/my-project-backend/src/main/java/com/example/controller/AccountController.java index 05aaa90..7778035 100644 --- a/my-project-backend/src/main/java/com/example/controller/AccountController.java +++ b/my-project-backend/src/main/java/com/example/controller/AccountController.java @@ -4,6 +4,7 @@ import com.example.entity.RestBean; import com.example.entity.dto.Account; import com.example.entity.dto.AccountDetails; import com.example.entity.vo.request.DetailsSaveVO; +import com.example.entity.vo.request.ModifyEmailVO; import com.example.entity.vo.response.AccountDetailsVO; import com.example.entity.vo.response.AccountVO; import com.example.service.AccountDetailsService; @@ -45,4 +46,11 @@ public class AccountController { boolean success = detailsService.saveAccountDetails(id, vo); return success ? RestBean.success() : RestBean.failure(400, "此用户名已被其他用户使用,请重新更换!"); } + + @PostMapping("/modify-email") + public RestBean modifyEmail(@RequestAttribute(Const.ATTR_USER_ID) int id, + @RequestBody @Valid ModifyEmailVO vo){ + String result = service.modifyEmail(id, vo); + return result == null ? RestBean.success() : RestBean.failure(400, result); + } } diff --git a/my-project-backend/src/main/java/com/example/controller/AuthorizeController.java b/my-project-backend/src/main/java/com/example/controller/AuthorizeController.java index b8b5995..f101629 100644 --- a/my-project-backend/src/main/java/com/example/controller/AuthorizeController.java +++ b/my-project-backend/src/main/java/com/example/controller/AuthorizeController.java @@ -39,7 +39,7 @@ public class AuthorizeController { @GetMapping("/ask-code") @Operation(summary = "请求邮件验证码") public RestBean askVerifyCode(@RequestParam @Email String email, - @RequestParam @Pattern(regexp = "(register|reset)") String type, + @RequestParam @Pattern(regexp = "(register|reset|modify)") String type, HttpServletRequest request){ return this.messageHandle(() -> accountService.registerEmailVerifyCode(type, String.valueOf(email), request.getRemoteAddr())); diff --git a/my-project-backend/src/main/java/com/example/entity/vo/request/ModifyEmailVO.java b/my-project-backend/src/main/java/com/example/entity/vo/request/ModifyEmailVO.java new file mode 100644 index 0000000..9973f36 --- /dev/null +++ b/my-project-backend/src/main/java/com/example/entity/vo/request/ModifyEmailVO.java @@ -0,0 +1,13 @@ +package com.example.entity.vo.request; + +import jakarta.validation.constraints.Email; +import lombok.Data; +import org.hibernate.validator.constraints.Length; + +@Data +public class ModifyEmailVO { + @Email + String email; + @Length(max = 6, min = 6) + String code; +} diff --git a/my-project-backend/src/main/java/com/example/listener/MailQueueListener.java b/my-project-backend/src/main/java/com/example/listener/MailQueueListener.java index df16f0b..d0a724f 100644 --- a/my-project-backend/src/main/java/com/example/listener/MailQueueListener.java +++ b/my-project-backend/src/main/java/com/example/listener/MailQueueListener.java @@ -40,6 +40,10 @@ public class MailQueueListener { createMessage("您的密码重置邮件", "你好,您正在执行重置密码操作,验证码: "+code+",有效时间3分钟,如非本人操作,请无视。", email); + case "modify" -> + createMessage("您的邮件修改验证邮件", + "您好,您正在绑定新的电子邮件地址,验证码: "+code+",有效时间3分钟,如非本人操作,请无视。", + email); default -> null; }; if(message == null) return; diff --git a/my-project-backend/src/main/java/com/example/service/AccountService.java b/my-project-backend/src/main/java/com/example/service/AccountService.java index f8a404e..b860915 100644 --- a/my-project-backend/src/main/java/com/example/service/AccountService.java +++ b/my-project-backend/src/main/java/com/example/service/AccountService.java @@ -5,6 +5,7 @@ import com.example.entity.dto.Account; import com.example.entity.vo.request.ConfirmResetVO; import com.example.entity.vo.request.EmailRegisterVO; import com.example.entity.vo.request.EmailResetVO; +import com.example.entity.vo.request.ModifyEmailVO; import org.springframework.security.core.userdetails.UserDetailsService; public interface AccountService extends IService, UserDetailsService { @@ -14,4 +15,5 @@ public interface AccountService extends IService, UserDetailsService { String registerEmailAccount(EmailRegisterVO info); String resetEmailAccountPassword(EmailResetVO info); String resetConfirm(ConfirmResetVO info); + String modifyEmail(int id, ModifyEmailVO vo); } diff --git a/my-project-backend/src/main/java/com/example/service/impl/AccountServiceImpl.java b/my-project-backend/src/main/java/com/example/service/impl/AccountServiceImpl.java index 052f092..77264c4 100644 --- a/my-project-backend/src/main/java/com/example/service/impl/AccountServiceImpl.java +++ b/my-project-backend/src/main/java/com/example/service/impl/AccountServiceImpl.java @@ -6,6 +6,7 @@ import com.example.entity.dto.Account; import com.example.entity.vo.request.ConfirmResetVO; import com.example.entity.vo.request.EmailRegisterVO; import com.example.entity.vo.request.EmailResetVO; +import com.example.entity.vo.request.ModifyEmailVO; import com.example.mapper.AccountMapper; import com.example.service.AccountService; import com.example.utils.Const; @@ -143,6 +144,23 @@ public class AccountServiceImpl extends ServiceImpl impl return null; } + @Override + public String modifyEmail(int id, ModifyEmailVO vo) { + String email = vo.getEmail(); + String code = getEmailVerifyCode(email); + if(code == null) return "请先获取验证码!"; + if(!code.equals(vo.getCode())) return "验证码错误,请重新输入"; + this.deleteEmailVerifyCode(email); + Account account = this.findAccountByNameOrEmail(email); + if(account != null && account.getId() != id) + return "该电子邮件已经被其他账号绑定,无法完成此操作!"; + this.update() + .set("email", email) + .eq("id", id) + .update(); + return null; + } + /** * 移除Redis中存储的邮件验证码 * @param email 电邮 diff --git a/my-project-frontend/src/views/settings/UserSetting.vue b/my-project-frontend/src/views/settings/UserSetting.vue index b65c080..2e70a1e 100644 --- a/my-project-frontend/src/views/settings/UserSetting.vue +++ b/my-project-frontend/src/views/settings/UserSetting.vue @@ -42,8 +42,6 @@ const rules = { ], email: [ { required: true, message: '请输入邮件地址', trigger: 'blur' }, {type: 'email', message: '请输入合法的电子邮件地址', trigger: ['blur', 'change']} - ], code: [ - { required: true, message: '请输入获取的验证码', trigger: 'blur' }, ] } @@ -68,7 +66,6 @@ function saveDetails() { } }) } - get('/api/user/details', data => { baseForm.username = store.user.username baseForm.gender = data.gender @@ -76,8 +73,42 @@ get('/api/user/details', data => { baseForm.wx = data.wx baseForm.qq = data.qq baseForm.desc = desc.value = data.desc + emailForm.email = store.user.email loading.form = false }) + +const coldTime = ref(0) +const isEmailValid = ref(true) +const onValidate = (prop, isValid) => { + if(prop === 'email') + isEmailValid.value = isValid +} +function sendEmailCode() { + emailFormRef.value.validate(isValid => { + coldTime.value = 60 + get(`/api/auth/ask-code?email=${emailForm.email}&type=modify`, () => { + ElMessage.success(`验证码已成功发送到邮箱:${emailForm.email},请注意查收`) + const handle = setInterval(() => { + coldTime.value-- + if(coldTime.value === 0) { + clearInterval(handle) + } + }, 1000) + }, (message) => { + ElMessage.warning(message) + coldTime.value = 0 + }) + }) +} +function modifyEmail() { + emailFormRef.value.validate(isValid => { + post('/api/user/modify-email', emailForm, () => { + ElMessage.success('邮件修改成功') + store.user.email = emailForm.email + emailForm.code = '' + }) + }) +}