创新实训周报一(第七周)

创新实训周报一(第七周)用户端心理医生端登录注册

本周任务:完成用户端登录注册和医生端登录注册后端及数据库相关

使用框架:

spring boot(3.2.4)

引入依赖在这里插入图片描述

使用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"));
    }
}
结果在这里插入图片描述

用户端登录注册

实体类映射

在这里插入图片描述
数据库自动建表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文档时引入的依赖版本一直冲突,导致程序一直无法运行,最后才终于知道是版本问题等等。
但这些问题最终都解决了。而这些工作我大概在周三前就已经完成了,然而本周总结博客周日晚上才写,导致我的遇到的困难和解决方式,以及需要实现相关功能时我的思考和想法 都已经基本上遗忘了。所以我本次博客就发现不知道怎么写了,于是我就干脆将我本周完成的代码主体直接贴上来吧。
就这些吧!

  • 9
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值