交友项目【手机号验证码发送】功能实现

目录

1:注册登录需求分析

1.1:业务说明

1.2:需求分析

1.3:数据库表

1.4:实体类

2:发送短信验证码

2.1:登录验证码

2.2:接口说明

2.3:流程分析

2.4:代码实现

2.4.1:mock接口

2.4.2:UserController

2.4.3:UserService

2.4.4:配置文件

2.4.5:启动类


1:注册登录需求分析

1.1:业务说明

业务:

  1. 用户通过手机验证码进行登录

     

    2.如果是第一次登录则需要完善个人信息,在上传图片时,需要对上传的图片做人像的校验,防止用户上传非人像的图片作为头像。流程完成后,则登录成功。  

  • 已注册用户:

    • 输入手机号发送验证码

    • 输入验证码,进行比对完成登录

  • 未注册用户:

    • 输入手机号发送验证码

    • 输入验证码,进行比对,自动注册(保存用户)

    • 完善用户信息

1.2:需求分析

服务端接受客户端请求

Java代码调用第三方服务实现短信返送(发送短信需要运营资质,只能借助第三方实现)

1.3:数据库表

数据库使用的mysql:

CREATE TABLE `tb_user` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `mobile` varchar(11) DEFAULT NULL COMMENT '手机号',
  `password` varchar(32) DEFAULT NULL COMMENT '密码,需要加密',
  `created` datetime DEFAULT NULL,
  `updated` datetime DEFAULT NULL,
  `hx_user` datetime DEFAULT NULL,
  `hx_password` datetime DEFAULT NULL,    
  PRIMARY KEY (`id`),
  KEY `mobile` (`mobile`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='用户表';

1.4:实体类

package com.czxy.tanhua.entity;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import lombok.EqualsAndHashCode;

import java.util.Date;

/**
 * <p>
 * 用户表
 * </p>
 *
 * @author 爱吃豆的土豆
 * @since 2023-03-29
 */
@Data
@EqualsAndHashCode(callSuper = false)
@TableName("tb_user")
public class User extends BasePojo {

    private static final long serialVersionUID = 1L;

    @TableId(value = "id", type = IdType.AUTO)
    private Long id;

    /**
     * 手机号
     */
    @TableField("mobile")
    private String mobile;

    /**
     * 密码,需要加密
     */
    @TableField("password")
    private String password;

    @TableField("created")
    private Date created;

    @TableField("updated")
    private Date updated;

    @TableField("hx_user")
    private String hxUser;

    @TableField("hx_password")
    private String hxPassword;


}

2:发送短信验证码

2.1:登录验证码

服务端接收客户端请求

Java代码调用第三方服务实现短信返送(发送短信需要运营资质,只能借助第三方实现)

2.2:接口说明

参见YAPI接口地址:http://192.168.136.160:3000/project/19/interface/api/94  

2.3:流程分析

客户端发送请求

服务端调用第三方组件发送验证码

验证码发送成功,存入redis

响应客户端,客户端跳转到输入验证码页面

2.4:代码实现

2.4.1:mock接口

地址:http://192.168.136.160:3000/project/19/interface/api/94

2.4.2:UserController

tanhua-app-server 工程编写com.tanhua.server.controller.UserController#login

@RestController
@RequestMapping("/user")
public class LoginController {
    @Resource
    private UserService userService;
    @PostMapping("/login")
    public ResponseEntity loginUser(@RequestBody Map map){
        String phone = (String) map.get("phone");
        userService.loginUser(phone);
        return ResponseEntity.ok(null);
    }
}

2.4.3:UserService

tanhua-app-server 工程编写 com.tanhua.server.service.UserService#sendCode

package com.czxy.tanhua.service;

import com.czxy.tanhua.autoconfig.template.SmsTemplate;
import com.czxy.tanhua.commons.utils.JwtUtils;
import com.czxy.tanhua.dubbo.api.UserApi;
import com.czxy.tanhua.entity.User;
import org.apache.commons.codec.digest.DigestUtils;
import org.apache.commons.lang3.RandomStringUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.dubbo.config.annotation.DubboReference;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.time.Duration;
import java.util.HashMap;
import java.util.Map;

/**
 * @Author 爱吃豆的土豆、
 * @Date 2023/3/30 9:55
 */
@Service
public class UserService {
    @Resource
    private SmsTemplate smsTemplate;
    @Resource
    private StringRedisTemplate stringRedisTemplate;

    @DubboReference
    private UserApi userApi;

    /**
     * 登录用户的验证码
     * @param phone
     */
    public void loginUser(String phone) {
        //随机生成验证码
        String code = RandomStringUtils.randomNumeric(6);
        //调用短信工具类
        smsTemplate.sendSms(phone,"",code);
        String key = "CHECK_CODE"+phone;
        //存放到redis中
        stringRedisTemplate.opsForValue().set(key,code,Duration.ofMinutes(5));

    }

}

2.4.4:配置文件

tanhua-app-server 端添加配置文件application.yml

配置文件中包含短信一些配置信息,服务启动进行加载

#服务端口
server:
  port: 18080
spring:
  servlet:
    multipart:
      max-file-size: 30MB
      max-request-size: 30MB
  application:
    name: tanhua-app-server
  redis:  #redis配置
    host: localhost
    port: 6379
  rabbitmq:
    host: 192.168.136.160
    port: 5672
    username: guest
    password: guest
  cloud:  #nacos配置
    nacos:
      discovery:
        #        server-addr: localhost:8848
        server-addr: 192.168.136.160:8848
      config:                               # TODO 配置中心?
        server-addr: 192.168.136.160:8848
dubbo:    #dubbo配置
  protocol:
    name: dubbo
    port: 20880
  registry:
    address: spring-cloud://localhost
  consumer:
    check: false
    retries: 0
  application:
    logger: slf4j
  cloud:
    subscribed-services: tanhua-dubbo-db, tanhua-dubbo-mongo
tanhua:
  sms:
    signName: 桐叔老司机
    templateCode: SMS_130929218
    accessKey: LTAI5tR6UTNzPK1F6CQoqF3X
    secret: REp7cA2pjU30skfqxGym4CkKDbtatJ
  oss:
    pathProtocol: https
    endpoint: oss-cn-shanghai.aliyuncs.com
    keyId: LTAI5t6JCKtfe8wXcXZjpbcV
    keySecret: jnbVNSsW50CJnAWfBkXDiUorLFnRaj
    bucketName: tudou-01
    dirName: avatar
  aip:
    appId: 26974300
    apiKey: LgQEvULCyS5nkMWMfp7Ofbzl
    secretKey: zVNfzu9GZYwX8lfASYEaumYU7dTqVKKi
  huanxin:
    appkey: 1181230208170312#tanhua
    clientId: YXA6cg-t55-3QPeMhKZWPtKXMA
    clientSecret: YXA6nMnWCIb3X9ANZXQQ0CoWPUtlaLE
  default:
    recommend:
      users: 2,3,8,10,18,20,24,29,27,32,36,37,56,64,75,88
  green:
    enable: true
    accessKeyID: LTAI4GKgob9vZ53k2SZdyAC7
    accessKeySecret: LHLBvXmILRoyw0niRSBuXBZewQ30la
    scenes: porn,terrorism #色情,暴力
# 分布式文件系统FDFS配置
fdfs:
  so-timeout: 1500
  connect-timeout: 600
  #缩略图生成参数
  thumb-image:
    width: 150
    height: 150
  #TrackerList参数,支持多个
  tracker-list: 192.168.136.160:22122
  web-server-url: http://192.168.136.160:8888/

2.4.5:启动类

/**
 * @Author 爱吃豆的土豆、
 * @Date 2023/3/29 11:42
 */
@SpringBootApplication
@ServletComponentScan   // 开启servlet组件扫描(过滤器扫描)
public class AppServiceApplication {
    public static void main(String[] args) {
        SpringApplication.run(AppServiceApplication.class,args);
    }
}

猜你喜欢

转载自blog.csdn.net/m0_64550837/article/details/129888501