From adf87f1a8de5663eab27054cffd1b53b6e6ead17 Mon Sep 17 00:00:00 2001 From: NagoColer <404213506@qq.com> Date: Tue, 11 Apr 2023 14:37:21 +0800 Subject: [PATCH] =?UTF-8?q?=E7=BC=96=E5=86=99=E9=AA=8C=E8=AF=81=E7=9B=B8?= =?UTF-8?q?=E5=85=B3=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- study-project-backend/pom.xml | 4 ++ .../example/config/SecurityConfiguration.java | 1 + .../controller/AuthorizeController.java | 32 +++++++++++++ .../com/example/service/AuthorizeService.java | 28 +----------- .../service/impl/AuthorizeServiceImpl.java | 45 +++++++++++++++++++ .../src/components/welcome/RegisterPage.vue | 21 +++++++-- 6 files changed, 102 insertions(+), 29 deletions(-) create mode 100644 study-project-backend/src/main/java/com/example/controller/AuthorizeController.java create mode 100644 study-project-backend/src/main/java/com/example/service/impl/AuthorizeServiceImpl.java diff --git a/study-project-backend/pom.xml b/study-project-backend/pom.xml index 5c8f68f..c6d6f35 100644 --- a/study-project-backend/pom.xml +++ b/study-project-backend/pom.xml @@ -34,6 +34,10 @@ mybatis-spring-boot-starter 3.0.0 + + org.springframework.boot + spring-boot-starter-validation + com.mysql diff --git a/study-project-backend/src/main/java/com/example/config/SecurityConfiguration.java b/study-project-backend/src/main/java/com/example/config/SecurityConfiguration.java index 7a6739e..604ac18 100644 --- a/study-project-backend/src/main/java/com/example/config/SecurityConfiguration.java +++ b/study-project-backend/src/main/java/com/example/config/SecurityConfiguration.java @@ -40,6 +40,7 @@ public class SecurityConfiguration { PersistentTokenRepository repository) throws Exception { return http .authorizeHttpRequests() + .requestMatchers("/api/auth/**").permitAll() .anyRequest().authenticated() .and() .formLogin() diff --git a/study-project-backend/src/main/java/com/example/controller/AuthorizeController.java b/study-project-backend/src/main/java/com/example/controller/AuthorizeController.java new file mode 100644 index 0000000..c93690c --- /dev/null +++ b/study-project-backend/src/main/java/com/example/controller/AuthorizeController.java @@ -0,0 +1,32 @@ +package com.example.controller; + +import com.example.entity.RestBean; +import com.example.service.AuthorizeService; +import jakarta.annotation.Resource; +import jakarta.validation.constraints.Pattern; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +@Validated +@RestController +@RequestMapping("/api/auth") +public class AuthorizeController { + + private final String EMAIL_REGEX = "^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+.[a-zA-Z]{2,}$"; + + @Resource + AuthorizeService service; + + @PostMapping("/valid-email") + public RestBean validateEmail(@Pattern(regexp = EMAIL_REGEX) @RequestParam("email") String email){ + if (service.sendValidateEmail(email)) + return RestBean.success("邮件已发送,请注意查收"); + else + return RestBean.failure(400, "邮件发送失败,请联系管理员"); + } + + +} diff --git a/study-project-backend/src/main/java/com/example/service/AuthorizeService.java b/study-project-backend/src/main/java/com/example/service/AuthorizeService.java index 93b1c11..7a0ab38 100644 --- a/study-project-backend/src/main/java/com/example/service/AuthorizeService.java +++ b/study-project-backend/src/main/java/com/example/service/AuthorizeService.java @@ -1,31 +1,7 @@ package com.example.service; -import com.example.entity.Account; -import com.example.mapper.UserMapper; -import jakarta.annotation.Resource; -import org.springframework.security.core.userdetails.User; -import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.core.userdetails.UserDetailsService; -import org.springframework.security.core.userdetails.UsernameNotFoundException; -import org.springframework.stereotype.Service; -@Service -public class AuthorizeService implements UserDetailsService { - - @Resource - UserMapper mapper; - - @Override - public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { - if(username == null) - throw new UsernameNotFoundException("用户名不能为空"); - Account account = mapper.findAccountByNameOrEmail(username); - if(account == null) - throw new UsernameNotFoundException("用户名或密码错误"); - return User - .withUsername(account.getUsername()) - .password(account.getPassword()) - .roles("user") - .build(); - } +public interface AuthorizeService extends UserDetailsService { + boolean sendValidateEmail(String email); } diff --git a/study-project-backend/src/main/java/com/example/service/impl/AuthorizeServiceImpl.java b/study-project-backend/src/main/java/com/example/service/impl/AuthorizeServiceImpl.java new file mode 100644 index 0000000..a0d04e9 --- /dev/null +++ b/study-project-backend/src/main/java/com/example/service/impl/AuthorizeServiceImpl.java @@ -0,0 +1,45 @@ +package com.example.service.impl; + +import com.example.entity.Account; +import com.example.mapper.UserMapper; +import com.example.service.AuthorizeService; +import jakarta.annotation.Resource; +import org.springframework.security.core.userdetails.User; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.security.core.userdetails.UsernameNotFoundException; +import org.springframework.stereotype.Service; + +@Service +public class AuthorizeServiceImpl implements AuthorizeService { + + @Resource + UserMapper mapper; + + @Override + public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { + if(username == null) + throw new UsernameNotFoundException("用户名不能为空"); + Account account = mapper.findAccountByNameOrEmail(username); + if(account == null) + throw new UsernameNotFoundException("用户名或密码错误"); + return User + .withUsername(account.getUsername()) + .password(account.getPassword()) + .roles("user") + .build(); + } + + @Override + public boolean sendValidateEmail(String email) { + /** + * 1. 先生成对应的验证码 + * 2. 把邮箱和对应的验证码直接放到Redis里面(过期时间3分钟,如果此时重新要求发邮件, + * 那么,只要剩余时间低于2分钟,就可以重新发送一次,重复此流程) + * 3. 发送验证码到指定邮箱 + * 4. 如果发送失败,把Redis里面的刚刚插入的删除 + * 5. 用户在注册时,再从Redis里面取出对应键值对,然后看验证码是否一致 + */ + + return false; + } +} diff --git a/study-project-frontend/src/components/welcome/RegisterPage.vue b/study-project-frontend/src/components/welcome/RegisterPage.vue index f242f83..03ed016 100644 --- a/study-project-frontend/src/components/welcome/RegisterPage.vue +++ b/study-project-frontend/src/components/welcome/RegisterPage.vue @@ -5,7 +5,7 @@
欢迎注册我们的学习平台,请在下方填写相关信息
- + - + @@ -51,7 +51,7 @@
- 立即注册 + 立即注册
已有账号? @@ -64,6 +64,7 @@ import {EditPen, Lock, Message, User} from "@element-plus/icons-vue"; import router from "@/router"; import {reactive, ref} from "vue"; +import {ElMessage} from "element-plus"; const form = reactive({ username: '', @@ -108,15 +109,29 @@ const rules = { email: [ { required: true, message: '请输入邮件地址', trigger: 'blur' }, {type: 'email', message: '请输入合法的电子邮件地址', trigger: ['blur', 'change']} + ], + code: [ + { required: true, message: '请输入获取的验证码', trigger: 'blur' }, ] } +const formRef = ref() const isEmailValid = ref(false) const onValidate = (prop, isValid) => { if(prop === 'email') isEmailValid.value = isValid } + +const register = () => { + formRef.value.validate((isValid) => { + if(isValid) { + + } else { + ElMessage.warning('请完整填写注册表单内容!') + } + }) +}