ylb-接口8手机号注册

总览:
在这里插入图片描述
在web模块下的service包,补充短信接口(SmsService):检查用户发送的验证码是否正确

package com.bjpowernode.front.service;public interface SmsService {/*** @param phone 手机号* @return true:发送成功,false 其他情况*/boolean sendSms(String phone);/*** @param phone 手机号* @param code  提交参数中的验证码* @return*/boolean checkSmsCode(String phone,String code);
}

实现这个接口还没有实现的方法,在SmsCodeRegisterImpl添加,验证客户端接受到短信验证码是否正确:

package com.bjpowernode.front.service.impl;import com.alibaba.fastjson.JSONObject;
import com.bjpowernode.common.constants.RedisKey;
import com.bjpowernode.front.config.JdwxSmsConfig;
import com.bjpowernode.front.service.SmsService;
import org.apache.commons.lang3.RandomStringUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.http.HttpStatus;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.web.bind.annotation.RestController;import javax.annotation.Resource;
import java.util.concurrent.TimeUnit;/*** 注册发送短信验证码*/@Service(value = "smsCodeRegisterImpl")
public class SmsCodeRegisterImpl implements SmsService {@Resourceprivate StringRedisTemplate stringRedisTemplate;@Resourceprivate JdwxSmsConfig smsConfig;@Overridepublic boolean sendSms(String phone) {boolean send = false;// 设置短信内容String random  = RandomStringUtils.randomNumeric(4);System.out.println("注册验证码的随机数 random="+random);//更新content中的  %s   【大富科技】你的验证码是:%s,3分钟内有效,请勿泄露给他人String content  = String.format(smsConfig.getContent(), random);//使用HttpClient发送 get 请求给第三方。CloseableHttpClient client = HttpClients.createDefault();//https://way.jd.com/chuangxin/dxjk?mobile=13568813957&content=//【创信】你的验证码是:5873,3分钟内有效!&appkey=您申请的APPKEYString url = smsConfig.getUrl()+"?mobile="+phone+"&content=" + content+"&appkey="+smsConfig.getAppkey();HttpGet get  = new HttpGet(url);try{CloseableHttpResponse response = client.execute(get);if( response.getStatusLine().getStatusCode() == HttpStatus.SC_OK ){//得到返回的数据,jsonString text = EntityUtils.toString(response.getEntity());//解析jsonif(StringUtils.isNotBlank(text)){// fastjsonJSONObject jsonObject = JSONObject.parseObject(text);if("10000".equals(jsonObject.getString("code"))){ //第三方接口调用成功//读取result中的key:ReturnStatusif("Success".equalsIgnoreCase(jsonObject.getJSONObject("result").getString("ReturnStatus"))){//短信发送成功send  = true;//把短信验证码,存到redisString key = RedisKey.KEY_SMS_CODE_REG + phone;stringRedisTemplate.boundValueOps(key).set(random,3 , TimeUnit.MINUTES);}}}}}catch (Exception e){e.printStackTrace();}return send;}@Overridepublic boolean checkSmsCode(String phone, String code) {String key = RedisKey.KEY_SMS_CODE_REG + phone;if( stringRedisTemplate.hasKey(key)){String querySmsCode = stringRedisTemplate.boundValueOps(key).get();if( code.equals(querySmsCode)){  // 输入的验证码和redis里相应的验证码是否相等return true;}}return false;}}

在api模块下的service包,补充用户接口(UserService):用户注册

package com.bjpowernode.api.service;import com.bjpowernode.api.model.User;
import com.bjpowernode.api.pojo.UserAccountInfo;public interface UserService {/*** 根据手机号查询数据*/User queryByPhone(String phone);/*用户注册*/int userRegister(String phone, String password);/*登录*/User userLogin(String phone, String pword);/*更新实名认证信息*/boolean modifyRealname(String phone, String name, String idCard);/*获取用户和资金信息*/UserAccountInfo queryUserAllInfo(Integer uid);/*查询用户*/User queryById(Integer uid);
}

实现这个接口方法,在dataservice模块service包下,补充UserServiceImpl,用户注册:
1、检查参数(电话是否标准,密码是否标准)
2、判断注册手机号是否已经注册过
3、md5密码加密
4、注册用户(向user数据表添加数据)
5、获取用户主键值(编写相应的mapper)
6、判断

package com.bjpowernode.dataservice.service;import com.bjpowernode.api.model.FinanceAccount;
import com.bjpowernode.api.model.User;
import com.bjpowernode.api.pojo.UserAccountInfo;
import com.bjpowernode.api.service.UserService;
import com.bjpowernode.common.util.CommonUtil;
import com.bjpowernode.dataservice.mapper.FinanceAccountMapper;
import com.bjpowernode.dataservice.mapper.UserMapper;
import org.apache.commons.codec.digest.DigestUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.dubbo.config.annotation.DubboService;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.transaction.annotation.Transactional;import javax.annotation.Resource;
import java.math.BigDecimal;
import java.util.Date;@DubboService(interfaceClass = UserService.class,version = "1.0")
public class UserServiceImpl implements UserService {@Resourceprivate UserMapper userMapper;@Resourceprivate FinanceAccountMapper financeAccountMapper;@Value("${ylb.config.password-salt}")private String passwordSalt;@Overridepublic User queryByPhone(String phone) {User user = null;if(CommonUtil.checkPhone(phone)){user = userMapper.selectByPhone(phone);}return user;}/*用户注册*/@Transactional(rollbackFor = Exception.class)  // 开启事务@Overridepublic synchronized int userRegister(String phone, String password) { // synchronized:同步的方法,保证线程安全,该方法处理时,其他方法不能对其参数二次处理(phone和password)int result = 0;//默认参数不正确if( CommonUtil.checkPhone(phone)&& (password != null && password.length()==32)){//判断手机号在库中是否存在User queryUser = userMapper.selectByPhone(phone);if(queryUser == null){//注册密码的md5二次加密。 给原始的密码加盐(salt)String newPassword = DigestUtils.md5Hex( password + passwordSalt);//注册u_userUser user = new User();user.setPhone(phone);user.setLoginPassword(newPassword);user.setAddTime(new Date());userMapper.insertReturnPrimaryKey(user);//获取主键user.getId()FinanceAccount account = new FinanceAccount();account.setUid(user.getId());account.setAvailableMoney(new BigDecimal("0"));financeAccountMapper.insertSelective(account);//成功result = 1result = 1;} else {//手机号存在result = 2;}}return result;}/*登录*/@Transactional(rollbackFor = Exception.class)@Overridepublic User userLogin(String phone, String password) {User user = null;if( CommonUtil.checkPhone(phone) && (password != null && password.length() == 32)) {String newPassword = DigestUtils.md5Hex( password + passwordSalt);user = userMapper.selectLogin(phone,newPassword);//更新最后登录时间if( user != null){user.setLastLoginTime(new Date());userMapper.updateByPrimaryKeySelective(user);}}return user;}/*更新实名认证信息*/@Overridepublic boolean modifyRealname(String phone, String name, String idCard) {int rows = 0;if(!StringUtils.isAnyBlank(phone,name,idCard)){rows  = userMapper.updateRealname(phone,name,idCard);}return rows > 0 ;}/*获取用户和资金信息*/@Overridepublic UserAccountInfo queryUserAllInfo(Integer uid) {UserAccountInfo info = null;if( uid != null && uid > 0 ) {info  = userMapper.selectUserAccountById(uid);}return info ;}/*查询用户*/@Overridepublic User queryById(Integer uid) {User user = null;if( uid != null && uid > 0 ){user = userMapper.selectByPrimaryKey(uid);}return user;}
}

其中:
1、md5加密需要在dataservice模块下resources/application.yml,添加配置信息:

#密码的盐
ylb:config:password-salt: fiwsyhrf9wejroi2huio3y4234operw3

2、添加记录,获取主键值(需要在dataservice模块mapper包下的UserMapper接口添加方法,并在resources/mappers/UserMapper.xml编写SQL语句):

    /*添加记录,获取主键值*/int insertReturnPrimaryKey(User user);
<!--添加记录,获取主键值--><insert id="insertReturnPrimaryKey">insert into u_user(phone, login_password,add_time)values(#{phone},#{loginPassword},#{addTime})<selectKey keyColumn="newId" keyProperty="id" resultType="int" order="AFTER">select LAST_INSERT_ID() as newId</selectKey></insert>

手机号注册属于“用户功能”,所以在web模块的usercontroller类下添加:

package com.bjpowernode.front.controller;import com.bjpowernode.api.model.User;
import com.bjpowernode.api.pojo.UserAccountInfo;
import com.bjpowernode.common.enums.RCode;
import com.bjpowernode.common.util.CommonUtil;
import com.bjpowernode.common.util.JwtUtil;
import com.bjpowernode.front.service.RealnameServiceImpl;
import com.bjpowernode.front.service.SmsService;
import com.bjpowernode.front.view.RespResult;
import com.bjpowernode.front.vo.RealnameVO;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiOperation;
import io.swagger.models.auth.In;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.time.DateFormatUtils;
import org.apache.jute.compiler.generated.Rcc;
import org.springframework.web.bind.annotation.*;import javax.annotation.Resource;
import javax.management.relation.Relation;
import java.util.HashMap;
import java.util.Map;@Api(tags = "用户功能")
@RestController
@RequestMapping("/v1/user")
public class UserController extends BaseController {@Resource(name = "smsCodeRegisterImpl")private SmsService smsService;@Resource(name = "smsCodeLoginImpl")private SmsService loginSmsService;@Resourceprivate RealnameServiceImpl realnameService;@Resourceprivate JwtUtil jwtUtil;/**手机号注册用户*/@ApiOperation(value = "手机号注册用户")@PostMapping("/register")public RespResult userRegister(@RequestParam String phone,@RequestParam String pword,@RequestParam String scode){RespResult result = RespResult.fail();//1.检查参数if( CommonUtil.checkPhone(phone)){if(pword !=null && pword.length() == 32 ){//检查短信验证码if( smsService.checkSmsCode(phone,scode)){//可以注册int registerResult  = userService.userRegister(phone,pword);if( registerResult == 1 ){result = RespResult.ok();} else if( registerResult == 2 ){result.setRCode(RCode.PHONE_EXISTS);} else {result.setRCode(RCode.REQUEST_PARAM_ERR);}} else {//短信验证码无效result.setRCode(RCode.SMS_CODE_INVALID);}} else {result.setRCode(RCode.REQUEST_PARAM_ERR);}} else {//手机号格式不正确result.setRCode(RCode.PHONE_FORMAT_ERR);}return result;}/** 手机号是否存在 */@ApiOperation(value = "手机号是否注册过",notes = "在注册功能中,判断手机号是否可以注册")@ApiImplicitParam(name = "phone",value = "手机号")@GetMapping("/phone/exists")public RespResult phoneExists(@RequestParam("phone") String phone){RespResult result  = new RespResult();result.setRCode(RCode.PHONE_EXISTS);//1.检查请求参数是否符合要求if(CommonUtil.checkPhone(phone)){//可以执行逻辑 ,查询数据库,调用数据服务User user = userService.queryByPhone(phone);if( user == null ){//可以注册result = RespResult.ok();}//把查询到的手机号放入redis。 然后检查手机号是否存在,可以查询redis} else {result.setRCode(RCode.PHONE_FORMAT_ERR);}return result;}/** 登录,获取token-jwt*/@ApiOperation(value = "用户登录-获取访问token")@PostMapping("/login")public RespResult userLogin(@RequestParam String phone,@RequestParam String pword,@RequestParam String scode) throws Exception{RespResult result = RespResult.fail();if(CommonUtil.checkPhone(phone) && (pword != null && pword.length() == 32) ){if(loginSmsService.checkSmsCode(phone,scode)){//访问data-serviceUser user = userService.userLogin(phone,pword);if( user != null){//登录成功,生成tokenMap<String, Object> data = new HashMap<>();data.put("uid",user.getId());String jwtToken = jwtUtil.createJwt(data,120);result = RespResult.ok();result.setAccessToken(jwtToken);Map<String,Object> userInfo = new HashMap<>();userInfo.put("uid",user.getId());userInfo.put("phone",user.getPhone());userInfo.put("name",user.getName());result.setData(userInfo);} else {result.setRCode(RCode.PHONE_LOGIN_PASSWORD_INVALID);}} else {result.setRCode(RCode.SMS_CODE_INVALID);}} else {result.setRCode(RCode.REQUEST_PARAM_ERR);}return result;}/** 实名认证  vo: value object*/@ApiOperation(value = "实名认证",notes = "提供手机号和姓名,身份证号。 认证姓名和身份证号是否一致")@PostMapping("/realname")public RespResult userRealname(@RequestBody RealnameVO realnameVO){RespResult result = RespResult.fail();result.setRCode(RCode.REQUEST_PARAM_ERR);//1验证请求参数if( CommonUtil.checkPhone(realnameVO.getPhone())){if(StringUtils.isNotBlank(realnameVO.getName()) &&StringUtils.isNotBlank(realnameVO.getIdCard())){//判断用户已经做过User user = userService.queryByPhone(realnameVO.getPhone());if( user != null ){if( StringUtils.isNotBlank(user.getName())){result.setRCode(RCode.REALNAME_RETRY);} else {//有短信验证码,先不写//调用第三方接口,判断认证结果boolean realnameResult  = realnameService.handleRealname(realnameVO.getPhone(),realnameVO.getName(),realnameVO.getIdCard());if( realnameResult == true ){result = RespResult.ok();} else {result.setRCode(RCode.REALNAME_FAIL);}}}}}return result;}/** 用户中心 */@ApiOperation(value = "用户中心")@GetMapping("/usercenter")public RespResult userCenter(@RequestHeader(value = "uid",required = false) Integer uid){RespResult result  = RespResult.fail();if( uid != null && uid > 0 ){UserAccountInfo userAccountInfo = userService.queryUserAllInfo(uid);if( userAccountInfo != null ){result = RespResult.ok();Map<String,Object> data = new HashMap<>();data.put("name",userAccountInfo.getName());data.put("phone",userAccountInfo.getPhone());data.put("headerUrl",userAccountInfo.getHeaderImage());data.put("money",userAccountInfo.getAvailableMoney());if( userAccountInfo.getLastLoginTime() != null){data.put("loginTime", DateFormatUtils.format(userAccountInfo.getLastLoginTime(),"yyyy-MM-dd HH:mm:ss"));} else  {data.put("loginTime","-");}result.setData(data);}}return result;}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/229.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java 的集合

一、Collection 1、ArrayList 底层采用数组实现&#xff0c;操作大多基于对数组的操作。 在添加和删除时需要做 System.arraycopy(native层方法) 拷贝工作。 添加元素时可能会扩容&#xff0c;这要大量的拷贝工作&#xff0c;删除元素时&#xff0c;会把后面的元素向前拷贝。…

Redis+IDEA极速了解和实现单机锁和分布式锁

单机下&#xff1a; 只适用于单机环境下&#xff08;单个JVM&#xff09;&#xff0c;多个客户端访问同一个服务器 1.synchronized package com.cloud.SR.controller;import org.springframework.beans.factory.annotation.Value; import org.springframework.data.redis.cor…

wps插入图片显示不全、混乱

问题如下&#xff1a; 原因&#xff1a; 格式混乱 解决办法&#xff1a; 1、统一格式&#xff0c;使用格式刷统一文档的格式 2、Ctrl A 全选&#xff0c;重新选择行距 3、重新粘贴图片&#xff08;选择嵌入型&#xff09;

【Hello mysql】 mysql的内置函数

Mysql专栏&#xff1a;Mysql 本篇博客简介&#xff1a;介绍mysql的基内置函数 mysql的内置函数 日期函数获取年月日获取时分秒获取时间戳在日期的基础上加上日期在日期的基础上减去日期计算两个日期之差创建一张表 记录生日创建一个留言表 字符串函数获取emp表的ename列的字符集…

Dubbo分布式服务框架,springboot+dubbo+zookeeper

一Dubbo的简易介绍 1.Dubbo是什么&#xff1f; Dubbo是一个分布式服务框架&#xff0c;致力于提供高性能和透明化的RPC远程服务调用方案&#xff0c;以及SOA服务治理方案。 简单的说&#xff0c;dubbo就是个服务框架&#xff0c;如果没有分布式的需求&#xff0c;其实是不需…

idea编译时遇到的bug

1、对象重复定义 问题描述&#xff1a; D:\workspace\spark\src\main\Scala\WordCount.scala:3:8 WordCount is already defined as object WordCount object WordCount { 解决参考博客&#xff1a;Error:(21, 8) FlumePushWordCount is already defined as object FlumePush…

rust abc(5): 常量

文章目录 1. 目的2. 基本用法2.1 说明2.2 运行结果 3. 不推荐或不正确用法3.1 不推荐用小写字母作为常量名字3.2 常量名称中含有小写字母就会报warning3.3 定义常量时&#xff0c;不指定数据类型会编译报错 4. const 和 immutable 的区别4.1 const 可以在函数外声明&#xff0c…

基于深度学习的高精度安全帽及背心检测识别系统(PyTorch+Pyside6+YOLOv5模型)

摘要&#xff1a;基于深度学习的高精度安全帽及背心检测识别系统可用于日常生活中或野外来检测与定位安全帽及背心目标&#xff0c;利用深度学习算法可实现图片、视频、摄像头等方式的安全帽及背心目标检测识别&#xff0c;另外支持结果可视化与图片或视频检测结果的导出。本系…

WebDAV之π-Disk派盘 + Solid Explorer

Solid Explorer 支持WebDAV方式连接π-Disk派盘。 Solid Explorer 是一款非常优秀的 Android 文件管理器&#xff0c;Material Design 设计风格&#xff0c;双栏布局&#xff0c;可拖拽操作、支持 ROOT 权限、多媒体浏览器、压缩包支持&#xff0c;Chromecast 流支持等众多功…

微信为什么使用 SQLite 保存聊天记录?

概要 SQLite 是一个被大家低估的数据库&#xff0c;但有些人认为它是一个不适合生产环境使用的玩具数据库。事实上&#xff0c;SQLite 是一个非常可靠的数据库&#xff0c;它可以处理 TB 级的数据&#xff0c;但它没有网络层。接下来&#xff0c;本文将与大家共同探讨 SQLite 在…

基于Tensorflow来重现GPT v1模型

OpenAI推出的ChatGPT模型让我们看到了通用人工智能的发展潜力&#xff0c;我也找了GPT的相关论文来进行研究。OpenAI在2017年的论文Improving Language Understanding by Generative Pre-Training提出了GPT的第一个版本&#xff0c;我也基于这个论文来用Tensorflow进行了复现。…

Keepalived 安装与配置

安装 Keepalived apt -y install keepalived 里边有一个杠y&#xff0c;就是我安装的时候里面有yes&#xff0c;就直接是yes 添加 Keepalived 配置 安装好之后, 下一步就开始去来写这个配置文件了&#xff0c;就在这里面去建一个 etc 当中&#xff0c;就是在这个 etc 当中建一个…

认识企业级定时任务Quartz

文章目录 前言一、实现一个Quartz的小案例1.创建一个maven项目2.添加Quartz依赖3.创建一个配置文件配置Quartz信息4.创建一个Job类继承Job接口5.编写主方法逻辑进行测试6.测试运行结果 二、Job和JobDetail总结 前言 目前仍有大部分企业仍在使用Quartz这种定时任务框架&#xf…

45. 跳跃游戏 II (贪心)

题目链接&#xff1a;力扣 解题思路&#xff1a;贪心&#xff0c;尽可能地找到下一跳能够跳到的最远距离&#xff0c;这样到达终点时&#xff0c;所需跳跃次数最少 以nums [2,3,1,1,4,2]为例&#xff1a; 以当前位置begin作为起跳点&#xff0c;能够跳跃的最远距离为m&#…

MySQL每日一练:多表查询——连接查询、子查询

目录 1、首先创建员工表emp和部门表dept&#xff1a; dept表&#xff1a; emp表&#xff1a; 2、插入数据&#xff1a; dept表&#xff1a; emp表&#xff1a; 3、 按条件查找 1、首先创建员工表emp和部门表dept&#xff1a; dept表&#xff1a; create table dept (…

以太网(Ethernet)入门了解

以太网&#xff08;Ethernet&#xff09;是一种常见的局域网&#xff08;LAN&#xff09;通信协议&#xff0c;它是由Xerox公司于1970年代中期开发的。以太网是一种基于广播技术的开放式网络协议&#xff0c;它允许设备在共享通信介质上进行通信。以下是关于以太网的基本概念、…

MySQL 多表查询练习

1.创建student和score表 CREATE TABLE student ( id INT(10) NOT NULL UNIQUE PRIMARY KEY , name VARCHAR(20) NOT NULL , sex VARCHAR(4) , birth YEAR, department VARCHAR(20) , address VARCHAR(50) );创建score表。SQL代码如下&#xff1a; CREATE TABLE s…

OpenCV 入门教程:Laplacian算子和Canny边缘检测

OpenCV 入门教程&#xff1a; Laplacian 算子和 Canny 边缘检测 导语一、Laplacian 算子二、Canny 边缘检测三、示例应用3.1 图像边缘检测3.2 边缘增强 总结 导语 边缘检测在图像处理和计算机视觉领域中起着重要的作用。 Laplacian 算子和 Canny 边缘检测是两种常用的边缘检测…

CAT1模块 EC800M HTTP使用总结记录

分享记录一下 CAT1 模块EC800 HTTP 协议使用流程 ...... by 矜辰所致目录 前言一、基础说明1.1 CAT1 与 4G1.2 EC800M 模块1.3 HTTP 二、开始使用2.1 硬件设计部分2.2 模块上电流程2.3 PDP 上下文2.3.1 什么是 SGSN 和 GGSN &#xff1f; 三、 HTTP 流程3.1 客户端3.1.1 PDP 上…

Ubuntu18.04 系统安装 Docker

1、首先更新软件源&#xff1a; sudo apt-get updatesudo apt-get upgrade 2、安装Docker&#xff1a; sudo apt install docker -y 3、查看安装的Docker apt list docker 4、查看docker 进程 ps -ef|grep docker 5、查看docker 版本有问题 6、开启Docker服务 systemctl…