ylb-接口6验证手机号是否注册

总览:
在这里插入图片描述

1、service处理

在api模块下service包,创建一个UserService接口:(根据手机号查询数据queryByPhone(String phone))

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);
}

2、serviceImpl处理

在dataservice模块service包,实现UserService接口,创建UserServiceImpl实现类:

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) {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、使用手机号查询用户:(需要在dataservice模块mapper包下的UserMapper接口添加方法,并在resources/mappers/UserMapper.xml编写SQL语句):

    /*使用手机号查询用户*/User selectByPhone(@Param("phone") String phone);
  <!--使用手机号查询用户--><select id="selectByPhone" resultMap="BaseResultMap">select <include refid="Base_Column_List"></include>from  u_userwhere phone = #{phone}</select>

3、controller处理

在web模块下controller包,公用类BaseController添加:(用户服务对象)

package com.bjpowernode.front.controller;import com.bjpowernode.api.service.*;
import org.apache.dubbo.config.annotation.DubboReference;
import org.springframework.data.redis.core.StringRedisTemplate;import javax.annotation.Resource;/*** 公用controller类*/
public class BaseController {//声明公共的方法,属性的等@Resourceprotected StringRedisTemplate stringRedisTemplate;//平台信息服务@DubboReference(interfaceClass = PlatBaseInfoService.class,version = "1.0")protected PlatBaseInfoService platBaseInfoService;//产品服务@DubboReference(interfaceClass = ProductService.class,version = "1.0")protected ProductService productService;//投资服务@DubboReference(interfaceClass = InvestService.class,version = "1.0")protected InvestService investService;//用户服务@DubboReference(interfaceClass = UserService.class,version = "1.0")protected UserService userService;//充值服务@DubboReference(interfaceClass = RechargeService.class,version = "1.0")protected RechargeService rechargeService;
}

在web模块下controller包,创建用户功能控制UserController类:(手机号是否存在phoneExists(@RequestParam(“phone”) String phone))

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;}
}

手机号格式判断(正则表达式)

在common模块util包,CommonUtil工具类添加方法:(checkPhone(String phone))

package com.bjpowernode.common.util;import java.math.BigDecimal;
import java.util.regex.Pattern;public class CommonUtil {/*处理pageNo*/public static int defaultPageNo(Integer pageNo) {int pNo = pageNo;if (pageNo == null || pageNo < 1) {pNo = 1;}return pNo;}/*处理pageSize*/public static int defaultPageSize(Integer pageSize) {int pSize = pageSize;if (pageSize == null || pageSize < 1) {pSize = 1;}return pSize;}/*手机号脱敏*/public static String tuoMinPhone(String phone) {String result = "***********";if (phone != null && phone.trim().length() == 11) {result = phone.substring(0,3) + "******" + phone.substring(9,11);}return result;}/*手机号格式 true:格式正确;false不正确*/public static boolean checkPhone(String phone){boolean flag = false;if( phone != null && phone.length() == 11 ){//^1[1-9]\\d{9}$flag = Pattern.matches("^1[1-9]\\d{9}$",phone);}return flag;}/*比较BigDecimal  n1 >=n2 :true ,false*/public static boolean ge(BigDecimal n1, BigDecimal n2){if( n1 == null || n2 == null){throw new RuntimeException("参数BigDecimal是null");}return  n1.compareTo(n2) >= 0;}
}

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

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

相关文章

ASL/CS系列音视频转换方案芯片,Typec拓展坞方案芯片

音视频单转方案芯片&#xff1a; CS5565 Typec转HDMI 8K 60HZ转换方案 可替代RTD2173 PS196 CS5801 HDMI转eDP/DP方案 可替代LT6711 CS5212 DP转VGA转换方案 可PIN TO PIN 替代RTD2166 CS5211 E…

❤️创意网页:HTML5 Canvas技术实现绚丽多彩的烟花特效

✨博主&#xff1a;命运之光 &#x1f338;专栏&#xff1a;Python星辰秘典 &#x1f433;专栏&#xff1a;web开发&#xff08;简单好用又好看&#xff09; ❤️专栏&#xff1a;Java经典程序设计 ☀️博主的其他文章&#xff1a;点击进入博主的主页 前言&#xff1a;欢迎踏入…

【java】【基础2】程序流程控制

目录 一、最经典的三种执行顺序 二、分支结构 2.1 if 2.2 switch 2.3 if与switch区别 三、循环结构 3.1 for循环 3.2 while循环 3.3 do-while循环 3.4 三种循环区别 3.5 补充知识&#xff1a;死循环 3.6 补充知识&#xff1a;循环嵌套 四、跳转关键字&#xff1a;br…

Mysql如何查询出两个日期之间的所有日期?

问题&#xff1a; 有时我们在生成一些时间轴类似的数据时&#xff0c;要求数据库不管有没有指定天的数据&#xff0c;都要生成该时间节点&#xff0c;可用mysql.help_topic来解决此类问题&#xff0c;通过序列和日期函数相结合来满足我们的业务需求。 例如&#xff1a;查询20…

spring启动一下就停止了

spring启动一下就停止了。 这个问题比较简单&#xff0c;百度了下&#xff0c;还是有些人问&#xff0c;记录下吧。 是因为没有引入spring-boot-starter-web包&#xff0c;或者该包没有生效。 有时spring-boot-starter-parent版本不对&#xff0c;就可能没生效&#xff0c;写明…

LeetCode | C++ 动态规划——123.买卖股票的最佳时机III 、188.买卖股票的最佳时机IV

目录 123.买卖股票的最佳时机III188.买卖股票的最佳时机IV 123.买卖股票的最佳时机III 123题目链接 根据题意&#xff1a;最多可以完成 两笔 交易&#xff0c;即可以买卖股票一次&#xff0c;可以买卖两次&#xff0c;也可以不买卖 dp数组定义&#xff1a; 此时 一天就有五个…

Web开发的富文本编辑器CKEditor介绍,Django有库ckeditor_uploader对它进行支持,django-ckeditor安装方法及使用注意事项

当需要在网页应用程序中提供富文本编辑功能时&#xff0c;CKEditor是一个流行的选择。CKEditor是一个开源的JavaScript富文本编辑器&#xff0c;它提供了强大的功能和用户友好的界面&#xff0c;使用户可以轻松创建和编辑格式化的文本内容。 以下是CKEditor的一些主要特性&…

kakfa 2.4.1 java的生产者client在发送消息前分配消息属于哪个分区源码

标题是否不是很熟悉&#xff0c;面试不得必问啊 KafkaProducer 1、客户端暴露出来可以让开发人员调用的发送消息的方法send2、send实际调用私有方法doSend获取集群信息(并且得到这条数据写哪个分区)2.1获取kafka服务端集群某个topic的元数据方法waitOnMetadata2.2根据消息是否指…

rabbitMQ杂记

消息队列应用场景 消息队列中间件是分布式系统中重要的组件&#xff0c;主要解决应用耦合&#xff0c;异步消息&#xff0c;流量 削锋等问题实现高性能&#xff0c;高可用&#xff0c;可伸缩和最终一致性&#xff1a; 解耦&#xff1a; 异步&#xff1a; 削峰&#xff1a; 常…

再见RestTemplate,Spring 6.1新特性:RestClient 了解一下!

在最近发布的Spring 6.1 M2版本中&#xff0c;推出了一个全新的同步HTTP客户端&#xff1a;RestClient。用一句话来让Spring开发者认识RestClient的话&#xff1a;像WebClient一样具备流畅API的RestTemplate。 所以&#xff0c;RestClient的使命就是淘汰已经有14年历史的RestTe…

实习经历总结

写在前面&#xff1a; 临毕业前突发奇想打算找实习&#xff0c;由于准备不是很充分加上没有经验&#xff0c;海投了一些岗位&#xff0c;方向主要是测试开发&#xff0c;base主要是北京&天津。 一些公司的面试&#xff1a; 当时投了很多大厂&#xff0c;美团&#xff0c…

elasticsearch高级功能之跨集群复制CCR

CCR的作用(Cross-Cluster Replication&#xff0c;跨集群复制)常用的场景如何使用工作原理源码分析 CCR的作用(Cross-Cluster Replication&#xff0c;跨集群复制) CCR功能允许用户在不同的Elasticsearch集群之间同步索引数据。这对于实现跨集群复制、数据备份、灾难恢复和多数…

3.12 Bootstrap 超大屏幕(Jumbotron)

文章目录 Bootstrap 超大屏幕&#xff08;Jumbotron&#xff09; Bootstrap 超大屏幕&#xff08;Jumbotron&#xff09; 下面将讲解 Bootstrap 支持的另一个特性&#xff0c;超大屏幕&#xff08;Jumbotron&#xff09;。顾名思义该组件可以增加标题的大小&#xff0c;并为登陆…

详解Windows安装分布式版本控制系统git

文章目录 前言下载安装相关链接 前言 git是一个分布式版本控制软件&#xff0c;最初由Linux创作者Linus Torvalds创作&#xff0c;并于2015年以GPL许可协议发布。git易于学习&#xff0c;占用空间小&#xff0c;性能却快如闪电&#xff0c;可以快速、 高效的管理从小到大的项目…

uniapp-轮播图swiper根据内容图片高度自适应,解决获取图片高度不准确的问题

需求&#xff1a;轮播图swiper根据内容图片高度自适应 但是通过uniapp uni.createSelectorQuery的方法获取图片高度不正确&#xff0c;比如图片是100&#xff0c;获取是200&#xff0c;this.$nextTick也不能解决&#xff0c;setTimeout到是能解决&#xff0c;但是不稳定&#…

DeFi新篇章 | Sui上原生订单簿DeepBook正式上线

随着原生去中心化中央限价订单簿&#xff08; Central Limit Order Book&#xff0c;CLOB&#xff09;DeepBook的推出&#xff0c;Sui上的DeFi开启了新篇章。DeepBook由一群Sui贡献者共同构建&#xff0c;为新一代DeFi应用提供了一个稳定的流动性层。 通过DeepBook&#xff0c…

Kubernetes在数字化转型中的作用

Kubernetes在数字化转型中的作用 数字化转型是指在现代化社会中&#xff0c;利用数字技术来改变企业、组织或个人的业务模式、流程和价值创造方式的过程。这包括使用数字技术来提高效率、创新产品或服务、优化客户体验和开发新的业务模式等方面。数字化转型是一个全球性的趋势…

mac批量修改文件名为不同名字

mac批量修改文件名为不同名字怎么弄&#xff1f;很多小伙伴通过私信向我求助&#xff0c;用什么方法可以在mac电脑上批量修改文件名称&#xff0c;将大量文件修改成不同的名称。这可能是一项比较麻烦的操作&#xff0c;在电脑上进行过批量重命名的小伙伴都知道&#xff0c;一般…

Redis源码篇 - Reactor设计模式 和 Redis Reactor设计模式

Reactor &#xff1a;反应器模式或者应答者模式&#xff0c;它是一种基于事件驱动的设计模式。拥有一个或者多个输入源&#xff0c;通过反应器分发给多个worker线程处理&#xff0c;实现并发场景下事件处理。 此图网上找的&#xff0c;画的很好&#xff1a;

【Javascript】根据表达式(可字符串)过滤数组

正在实现一个基于后台低代码配置的应用&#xff0c;记录一下字符串表达式在项目用的转换与使用。以下是使用表达式过滤数据的实践代码: 表达式如下 item.readFlag1封装使用函数 /*** 获取表格数据* param array 被过滤的数组 * param expression 表达式*/ function filterAr…