创新实训周报一(第七周)用户端心理医生端登录注册
本周任务:完成用户端登录注册和医生端登录注册后端及数据库相关
使用框架:
spring boot(3.2.4)
引入依赖![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/1a43cae0c055212329bef8215888ff3a.png)
使用Jpa操纵数据库
完成任务
配置文件
server.port = 9966
spring.datasource.username = root
spring.datasource.password = 123456
spring.datasource.url = jdbc:mysql://localhost:3306/mental?serverTimezone=UTC&useAffectedRows=true
spring.datasource.driver-class-name = com.mysql.cj.jdbc.Driver
#自动生成数据库表(关键)
spring.jpa.hibernate.ddl-auto=update
#jpa配置:在控制台显示Hibernate的sql(可选)
spring.jpa.show-sql = true
#其他配置:关闭Thymeleaf 的缓存
spring.thymeleaf.cache = false
主要是Mysql数据库连接和配置自动生成sql数据库表
一些通信相关配置
@Configuration
public class GlobalCorsConfig {
@Bean
public WebMvcConfigurer corsConfigurer() {
return new WebMvcConfigurer() {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**") //添加映射路径,“/**”表示对所有的路径实行全局跨域访问权限的设置
.allowedOriginPatterns("*") //开放哪些ip、端口、域名的访问权限 SpringBoot2.4.0以后allowedOrigins被allowedOriginPatterns代替
.allowCredentials(true) //是否允许发送Cookie信息
.allowedMethods("GET", "POST", "PUT", "DELETE") //开放哪些Http方法,允许跨域访问
.allowedHeaders("*") //允许HTTP请求中的携带哪些Header信息
.exposedHeaders("*"); //暴露哪些头部信息(因为跨域访问默认不能获取全部头部信息)
}
};
}
}
Controller统一输出配置
package com.mental.mental.utils;
public class Result<T> {
private String code;
private String msg;
private T data;
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public T getData() {
return data;
}
public void setData(T data) {
this.data = data;
}
public Result() {
}
public Result(T data) {
this.data = data;
}
public static Result success() {
Result result = new Result<>();
result.setCode("0");
result.setMsg("成功");
return result;
}
public static <T> Result<T> success(T data) {
Result<T> result = new Result<>(data);
result.setCode("0");
result.setMsg("成功");
return result;
}
public static <T> Result<T> success(T data,String msg) {
Result<T> result = new Result<>(data);
result.setCode("0");
result.setMsg(msg);
return result;
}
public static Result error(String code, String msg) {
Result result = new Result();
result.setCode(code);
result.setMsg(msg);
return result;
}
}
Swagger Api
引入依赖
<dependency>
<groupId>org.springdoc</groupId>
<artifactId>springdoc-openapi-starter-webmvc-ui</artifactId>
<version>2.0.2</version>
<exclusions>
<exclusion>
<artifactId>slf4j-api</artifactId>
<groupId>org.slf4j</groupId>
</exclusion>
</exclusions>
</dependency>
相关配置
@Configuration
public class SwaggerConfig {
@Bean
public OpenAPI springShopOpenAPI() {
return new OpenAPI()
.info(new Info().title("标题")
.contact(new Contact())
.description("我的API文档")
.version("v1")
.license(new License().name("Apache 2.0").url("http://springdoc.org")))
.externalDocs(new ExternalDocumentation()
.description("外部文档")
.url("https://springshop.wiki.github.org/docs"));
}
}
结果![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/02ea46c42ed31bfcb0df5e9f4f0dff05.png)
用户端登录注册
实体类映射
数据库自动建表user
DAO层
@Repository
public interface UserDao extends JpaRepository<User,Long> {
User findByUname(String uname);
User findByUnameAndUpassword(String uname,String upassword);
User findByEmail(String email);
@Transactional
@Modifying
@Query("update User u set u.upassword=:newPassword where u.uname=:name")
int changePassword(@Param("newPassword") String newPassword,@Param("name") String name);
}
根据用户名查询,根据用户名和密码查询,根据邮箱查询(主要用来发邮箱验证码),由Jpa自动创建查询语句
修改密码(自定义修改)
Service层
登录
@Override
public User loginService(String uname, String upassword) {
User user = userDao.findByUnameAndUpassword(uname,upassword);
//重要信息置空
if(user!=null){
user.setUpassword("");
}
return user;
}
注册
@Override
public User registService(User user) {
if(userDao.findByUname(user.getUname())!=null){
return null;
}else {
User newUser = userDao.save(user);
if(newUser!=null){
newUser.setUpassword("");
}
return newUser;
}
}
根据邮箱查询
@Override
public User getAccountByEmailService(String name){
User user = userDao.findByUname(name);
return user;
}
修改密码
@Override
public int changeUserPasswordService(String name, String newPassword) {
return userDao.changePassword(newPassword,name);
}
Controller层
用户登录
@Operation(summary = "用户登录",method = "POST")
@PostMapping("/login")
// @ApiResponses(value = {@ApiResponse(code=0,message = "成功"),@ApiResponse(code=123,message = "失败")})
public Result<User> loginController(@Parameter(name = "uname",description = "用户名") String uname, @Parameter(name = "upassword",description = "密码") String upassword){
User user = userService.loginService(uname,upassword);
if(user!=null){
return Result.success(user,"登录成功");
}else{
return Result.error("123","账号或密码错误");
}
}
用户注册
@Operation(summary = "用户注册")
@PostMapping("/register")
//@ApiResponses(value = {@ApiResponse(code=0,message = "成功"),@ApiResponse(code = 456,message = "失败")})
public Result<User> registController( @RequestBody User newUser){
User user = userService.registService(newUser);
if(user!=null){
return Result.success(user,"注册成功");
}else {
return Result.error("456","用户名已经注册");
}
}
根据邮箱找回密码
@PostMapping("/getAccountByEmail")
@Operation(summary = "根据邮箱找回密码")
public Result<String> getAccountByEmailController(@RequestParam String username){
User user = userService.getAccountByEmailService(username);
String randomCode = emailService.email(user.getEmail());
if(randomCode!=null){
return Result.success(randomCode,"验证码已经返回");
}else {
return Result.error("111","发送邮件失败!");
}
修改密码
@Operation(summary = "修改密码")
@PostMapping("/changePassword")
public Result changePassword(@RequestParam String username,@RequestParam String newPassword){
if(userService.changeUserPasswordService(username,newPassword)>0){
return Result.success();
}else{
return Result.error("-1","修改密码失败");
}
心理医生登录注册
与用户登录注册类似
entity层
@Entity
@Data
public class Psychologist implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;
@Column(nullable = false,unique = true,length = 20)
private String username;
@Column(nullable = false,length = 30)
private String password;
@Column(nullable = false,length = 50)
private String email;
}
DAO层
@Repository
public interface PsychologistDao extends JpaRepository<Psychologist,Long> {
Psychologist findByUsername(String username);
Psychologist findByUsernameAndPassword(String username,String password);
Psychologist findByEmail(String email);
//java.lang.IllegalArgumentException: Modifying queries can only use void or int/Integer as return type; Offending method: public abstract com.mental.mental.entity.Psychologist com.mental.mental.repository.PsychologistDao.changePassword(java.lang.String,java.lang.String)
//在JPA中,执行更新操作(例如更新实体对象)时,update方法的返回值类型是一个整数,表示更新的实体数量
@Transactional
@Modifying
@Query("update Psychologist p set p.password=:newPassword where p.username=:name")
int changePassword(@Param("newPassword") String newPassword, @Param("name") String name);
}
Service层
public interface PsychologistService {
/**
* 心理医生登录
* @param username
* @param password
* return
*/
Psychologist loginService(String username, String password);
/**
* 心理医生注册
* @param psychologist
* return
*/
Psychologist registService(Psychologist psychologist);
/**
* 邮箱找回密码
* @param name
* return
*/
Psychologist getAccountByEmail(String name);
/**
*
* @param name
* @param newPassword
* @return
*/
int changePsychologistPasswordService(String name,String newPassword);
@Service
public class PsychologistServiceImpl implements PsychologistService {
@Resource
private PsychologistDao psychologistDao;
@Override
public Psychologist loginService(String username, String password){
Psychologist psychologist = psychologistDao.findByUsernameAndPassword(username,password);
if(psychologist!=null){
psychologist.setPassword("");
return psychologist;
}
return psychologist;
}
@Override
public Psychologist registService(Psychologist psychologist){
if(psychologistDao.findByUsername(psychologist.getUsername())!=null){
return null;
}else{
Psychologist newPsychologist = psychologistDao.save(psychologist);
if(newPsychologist!=null){
newPsychologist.setPassword("");
}
return newPsychologist;
}
}
@Override
public Psychologist getAccountByEmail(String name){
Psychologist psychologist = psychologistDao.findByUsername(name);
return psychologist;
}
@Override
public int changePsychologistPasswordService(String name,String newPassword){
return psychologistDao.changePassword(newPassword, name);
}
Controller层
/**
* author: 周恒
* date: 2024/4/6
*/
@RestController
@RequestMapping("/psychologist")
@Tag(name = "心理医生登录注册")
public class PsychologistController {
@Resource
private PsychologistService psychologistService;
@Autowired
private EmailService emailService;
@Operation(summary = "心理医生登录")
@PostMapping("/login")
public Result<Psychologist> psychologistLoginController(@RequestParam String username,@RequestParam String password){
Psychologist psychologist = psychologistService.loginService(username, password);
if (psychologist!=null){
return Result.success(psychologist,"登录成功");
}else {
return Result.error("123","您的账号或密码不正确!");
}
}
@Operation(summary = "心理医生注册")
@PostMapping("/register")
public Result<Psychologist> psychologistRegisterController(@RequestBody Psychologist psychologist){
Psychologist newPsychologist = psychologistService.registService(psychologist);
if(newPsychologist!=null){
return Result.success(newPsychologist,"注册成功");
}else {
return Result.error("456","您所注册的账户已经存在!");
}
}
@Operation(summary = "根据邮箱找回账户")
@PostMapping("/getAccountByEmail")
public Result<String> getAccountByEmailController(@RequestParam String name){
Psychologist psychologist = psychologistService.getAccountByEmail(name);
String num = emailService.email(psychologist.getEmail());
if(num!=null){
return Result.success(num,"您的验证码是");
}else {
return Result.error("111","验证码发送失败");
}
}
@Operation(summary = "修改密码")
@PostMapping("/changePassword")
public Result changePasswordController(@RequestParam String password,@RequestParam String name){
if(psychologistService.changePsychologistPasswordService(name,password)>0){
return Result.success();
}else{
return Result.error("-1","修改密码失败");
}
}
邮箱发送验证码
首先需要先申请邮箱,开启一些相关服务,然后获得一个密码进行相关配置
#邮件
spring.mail.host=smtp.163.com
spring.mail.username=m17837811695@163.com
spring.mail.password=VZLVNLZIZHWQTYHX
spring.mail.default-encoding=UTF-8
生成验证码并发送
直接调用Random函数随机生成一个6位数
code = RandomUtil.randomInt(100000,999999);
然后按部就班地调用相关函数发送验证码给邮箱
@Service
public class EmailServiceImpl implements EmailService {
private Integer code;
@Value("${spring.mail.username}")
private String from="";
@Autowired
private JavaMailSender javaMailSender;
public String email(String to){
//from = IDN.toASCII(from);
//from = from.replaceAll(" ","");
//from = from.replaceAll("\\p{Cntrl}","");
code = RandomUtil.randomInt(100000,999999);
SimpleMailMessage simpleMailMessage = new SimpleMailMessage();
simpleMailMessage.setFrom(from);//发件人
simpleMailMessage.setTo(to);//收件人
simpleMailMessage.setSubject("心语");//主题
simpleMailMessage.setText("您的验证码是:"+code.toString());//内容
javaMailSender.send(simpleMailMessage);
return code.toString();
}
}
将验证码传到前端
由前端进行校验该验证码是否与用户输入的一致
@Tag(name = "邮箱发送验证码")
@RestController
@RequestMapping("email")
public class EmailController {
@Autowired
private EmailService emailService;
@Operation(summary = "邮箱验证码校验,传邮箱地址")
@GetMapping("/")
public String sendCode(@RequestParam String to){
//to = IDN.toASCII(to);
//to = to.replaceAll(" ","");
//to = to.replaceAll("\\p{Cntrl}","");
String randomCode = emailService.email(to);
return randomCode;
}
}
总结
我本周的工作大概就是这些了。其中也遇到了很多问题,比如发送验证码时由于格式一直不正确,导致验证码一直无法运行,还有配置Swagger文档时引入的依赖版本一直冲突,导致程序一直无法运行,最后才终于知道是版本问题等等。
但这些问题最终都解决了。而这些工作我大概在周三前就已经完成了,然而本周总结博客周日晚上才写,导致我的遇到的困难和解决方式,以及需要实现相关功能时我的思考和想法 都已经基本上遗忘了。所以我本次博客就发现不知道怎么写了,于是我就干脆将我本周完成的代码主体直接贴上来吧。
就这些吧!