文章目录

  • 1、功能概述
  • 2、短信服务
  • 3、登录校验代码

1、功能概述

该项目的手机登录功能是采取 手机号 + 验证码 的方式进行登录验证,所以该功能需要阿里云短信服务的支持,如今由于我们个人没办法申请,所以申请过程在本博客中不会进行具体描述。

2、短信服务

开通阿里云短信服务步骤较为复杂,这里不做过多概述!

这里需要注意一点,验证码的生成并不是阿里云服务提供的,而是需要我们自己编写一个工具类,自定义生成6位数验证码,阿里云只是提供 发送短信功能

首先我们需要将阿里云开通后,拿到相关参数添加到 配置文件中去,这三个值在编写短信发送接口时能用到:

aliyun.sms.regionId=default
aliyun.sms.accessKeyId=LT6I0Y5633pX89qC
aliyun.sms.secret=jX8D04Dm12I3gGKj345FYSzu0fq8mT

我们后面想使用这三个参数,所以我们可以写一个工具类,用于读取这三个参数:

@Component
public class ConstantPropertiesUtils implements InitializingBean {@Value("${aliyun.sms.regionId}")private String regionId;@Value("${aliyun.sms.accessKeyId}")private String accessKeyId;@Value("${aliyun.sms.secret}")private String secret;public static String REGION_Id;public static String ACCESS_KEY_ID;public static String SECRECT;@Overridepublic void afterPropertiesSet() throws Exception {REGION_Id=regionId;ACCESS_KEY_ID=accessKeyId;SECRECT=secret;}
}

接下来,我们开始开发 发送短信 接口!


代码如下:

Controller:

@RestController
@RequestMapping("/api/msm")
public class MsmApiController {@Autowiredprivate MsmService msmService;@Autowiredprivate RedisTemplate<String,String> redisTemplate;//发送手机验证码@GetMapping("send/{phone}")public Result sendCode(@PathVariable String phone) {//判断是否已经发送过了,从redis获取验证码,如果获取获取到,就说明已经发送过//Redis中存储格式为:key手机号,value验证码String code = redisTemplate.opsForValue().get(phone);if(!StringUtils.isEmpty(code)) {return Result.ok();}//如果从redis获取不到,那就通过工具类生成验证码(工具类代码省略)code = RandomUtil.getSixBitRandom();//调用service方法,通过整合短信服务进行发送短信boolean isSend = msmService.send(phone,code);//如果发送成功,生成验证码放到redis里面,设置有效时间2分钟if(isSend) {redisTemplate.opsForValue().set(phone,code,2, TimeUnit.MINUTES);return Result.ok();} else {return Result.fail().message("发送短信失败");}}
}

Service:

@Service
public class MsmServiceImpl implements MsmService {@Overridepublic boolean send(String phone, String code) {//首先判断手机号 + 验证码是否为空if(StringUtils.isEmpty(phone)) {return false;}//整合阿里云短信服务,设置相关参数(基本固定写法,直接cv)DefaultProfile profile = DefaultProfile.getProfile(ConstantPropertiesUtils.REGION_Id,ConstantPropertiesUtils.ACCESS_KEY_ID,ConstantPropertiesUtils.SECRECT);IAcsClient client = new DefaultAcsClient(profile);CommonRequest request = new CommonRequest();//request.setProtocol(ProtocolType.HTTPS); 如果是HTTPS请求,取消注释request.setMethod(MethodType.POST);request.setDomain("dysmsapi.aliyuncs.com");request.setVersion("2017-05-25");request.setAction("SendSms");//以上基本是固定写法//短信发送到的手机号request.putQueryParameter("PhoneNumbers", phone);//开通服务后,签名名称request.putQueryParameter("SignName", "我的谷粒在线教育网站");//开通服务后,模板coderequest.putQueryParameter("TemplateCode", "SMS_180051135");//验证码,需要使用json格式,例如:{"code":"123456"}Map<String,Object> param = new HashMap();param.put("code",code);request.putQueryParameter("TemplateParam", JSONObject.toJSONString(param));//调用方法进行短信发送(固定写法,直接cv)try {CommonResponse response = client.getCommonResponse(request);return response.getHttpResponse().isSuccess();} catch (ServerException e) {e.printStackTrace();} catch (ClientException e) {e.printStackTrace();}return false;}
}

3、登录校验代码

Controller层:

@PostMapping("login")
//loginVo里面可以拿到前端传来的 手机号 + 验证码
public Result login(@RequestBody LoginVo loginVo, HttpServletRequest request) {Map<String, Object> info = userInfoService.login(loginVo);return Result.ok(info);
}

Service层:

//登录验证
@Service
public class UserInfoServiceImpl extends ServiceImpl<UserInfoMapper, UserInfo> implements UserInfoService {@Overridepublic Map<String, Object> login(LoginVo loginVo) {//获取到前端传的 手机号 + 验证码(整合阿里云短信服务支持)String phone = loginVo.getPhone();String code = loginVo.getCode();//校验手机号 + 验证码是否为null,如果是空,就抛异常if(StringUtils.isEmpty(phone) || StringUtils.isEmpty(code)) {throw new YyghException(ResultCodeEnum.PARAM_ERROR);}//校验输入验证码和Redis中验证码是否一致String redisCode = redisTemplate.opsForValue().get(phone);if(!code.equals(redisCode)){throw new YyghException(ResultCodeEnum.CODE_ERROR);}//通过该手机号,查询一下表中是否有数(就是该手机号是否曾经注册过)QueryWrapper<UserInfo> queryWrapper = new QueryWrapper<>();queryWrapper.eq("phone", phone);//这里查询一下该手机号是否曾经注册过(表中有数据)UserInfo userInfo = baseMapper.selectOne(queryWrapper);//如果没查到,说明该用户是第一次进行登录注册,将该手机号用户信息存到表中if(null == userInfo) {userInfo = new UserInfo();userInfo.setName("");userInfo.setPhone(phone);this.save(userInfo);}//登录成功后,该用户数据返回页面显示名称Map<String, Object> map = new HashMap<>();String name = userInfo.getName();//如果名字是null,就把手机号当作名称if(StringUtils.isEmpty(name)) {name = userInfo.getPhone();}map.put("name", name);//通过JWT工具类生成token(工具类代码省略)String token = JwtUtils.createToken(userInfo.getId(),name);map.put("token", token);return map;}
}

【尚医通】手机登录功能相关推荐

  1. 尚医通-医院详情功能(二十七)

    目录: (1)前台用户系统-医院详请-情接口开发 (2)前台用户系统-技术点-nuxt路由 (3)前台用户系统-医院详情-前端整合 (1)前台用户系统-医院详-情接口开发 现在做在页面点击某一个医院或 ...

  2. 尚医通项目:项目总结

    课程链接:尚医通项目 开始时间:2022-07-09 项目总结 尚医通业务流程 项目功能总结(后台管理系统) 本地访问地址 http://localhost:9528/ 医院设置管理 (1)医院设置列 ...

  3. 尚医通 (三十一) --------- 手机登录

    目录 一.登录需求 1. 登录效果 2. 登录需求 二.登录 1. 搭建 service-user 模块 2. 添加用户基础类 3. 登录 API 接口 4. 生成 token 5. 阿里云短信 6. ...

  4. 尚医通项目101-123:前台用户系统、登录注册、邮箱登录

    开始时间:2022-05-30 课程链接:课程链接:[尚医通] 前端页面 需要完成医院等级.地区查询.医院列表.医院名称模糊查询等功能 按等级查询 按地区查询 模糊查询 并能跳转到具体详情页面 跳转到 ...

  5. 尚医通-OAuth2-微信登录接口开发(三十一)

    目录: (1)微信登录-OAuth2介绍 (2)前台用户系统-微信登录-准备工作 (3)微信登录-生成微信二维码-接口开发 (4)微信登录-生成验证码-前端整合 (5)微信登录-获取扫码人信息-实现分 ...

  6. 尚医通项目124-149:微信登录以及阿里云OSS的使用

    开始时间:2022-06-17 课程链接:尚医通项目 微信登录 OAuth2 开放系统间授权 照片拥有者想要在云冲印服务上打印照片,云冲印服务需要访问云存储服务上的资源 方式一:用户名密码复制:将受保 ...

  7. 尚医通项目仿写部分技术点总结

    尚医通项目部分技术点总结 前言 技术点汇总 1.MybatisPlus 技术介绍 使用步骤 2.Excel表格的导入与导出 技术介绍 使用步骤 3.redis以注解的方式对数据字典进行缓存 技术介绍 ...

  8. 尚医通项目笔记--包括每个接口对应页面的图片

    废话不多说,直接上图 博客目录结构 工程目录结构 yygh-parent根目录common公共模块父节点common-util公共工具类rabbit-util业务封装RabbitMQservice-u ...

  9. 尚医通【预约挂号系统】总结

    这里写目录标题 1.项目介绍 2.技术点 3.业务流程 4.项目架构 5.项目源码(包含sql) 6.启动步骤 7.项目模块说明 8.项目功能总结 9.效果图 后台管理端 前端展示端 数据库 1.项目 ...

最新文章

  1. 计算机组成和网络考试题,计算机组成原理试题及答案
  2. Java接口存在的意义以及如何解决菱形继承问题
  3. linux shell 脚本 2,理解Linux Shell和基本的Shell脚本(2)
  4. C++开发人脸性别识别教程(7)——搭建MFC框架之界面绘制
  5. oracle格式化列宽度,ORACLE日期时间的格式化参数大全
  6. 选择排序算法-C程序设计
  7. 【0x50「动态规划」例题】LCIS【最长公共上升子序列】
  8. 贪心算法解决哈夫曼编码问题
  9. Android异种机型系统适配:application定义的app名字和安装到手机后桌面显示app名字不一致
  10. Between 的开始日期和结束日期是同一天没有查询结果,附SQL server数据库的日期时间格式转换大全
  11. 手机游戏无障碍设计——猜地鼠之Android篇
  12. 报时功能_厦门宝藏 | 海关大钟悠扬的鸣曲报时,承载着老厦门人无数的记忆!...
  13. 网络与信息安全产品(一)
  14. 前端开发规范:CSS 代码规范指南
  15. 使用免费引流脚本,如何突破引流难的困境
  16. phpfetion.php,php 飞信2012最新可用api 接口免费分享phpfetion
  17. 海龟交易法操作商品期货
  18. Kindle 3截屏
  19. 在Windows11上安装虚拟机Hyper-V
  20. Stimulsoft.Report 2、 web报表的使用

热门文章

  1. openwrite Test
  2. 平板电脑:apple、中国挑大梁
  3. 无线路由器经常掉线断网的可能的原因
  4. 如何比较两个文本的相似度
  5. 文件加解密,AIDE入侵检测,扫描与抓包
  6. Oracle 中 将多行列值按照顺序合并成单值输出(connect by)
  7. 在Mavne环境下,实现struts2和hibernate的NVN关系的注解式开发?
  8. 编写虚拟 AI 女友
  9. [jQuery学习系列四 ]4-Jquery学习四-事件操作
  10. 互联网常用的几种有效引流方法:精准引流获客加人吸粉