提交 67f11d21 authored 作者: zhengfg's avatar zhengfg

增加手机注册,登录功能

上级 d1cb1fa2
......@@ -24,7 +24,8 @@ public class KeyConstant {
/////////////////订单 END////////////////
//验证码前缀
public final static String CAPTCHA="captcha_";
//手机验证码前缀
public final static String CAPTCHA_PHONE="captcha_phone";
//自定义id头部
public final static String CUSTOMIZE_ID="customizeId_";
}
......@@ -5,6 +5,8 @@ import com.diaoyun.zion.chinafrica.vo.TbCfUserInfoVo;
import com.diaoyun.zion.master.base.BaseController;
import com.diaoyun.zion.master.base.Result;
import com.diaoyun.zion.master.common.TokenManager;
import com.diaoyun.zion.master.validator.Validator;
import com.diaoyun.zion.master.validator.annotation.ValidateParam;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
......@@ -15,6 +17,7 @@ import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
/**
......@@ -40,7 +43,11 @@ public class LoginController extends BaseController {
public Result<TbCfUserInfoVo> registerAndLogin(@ApiParam("用户信息") @RequestBody TbCfUserInfoVo tbCfUserInfoVo) {
return tbCfUserInfoService.registerAndLogin(tbCfUserInfoVo);
}
@ApiOperation(value = "注册并登录")
@PostMapping(value = "/registerByPhone")
public Result<TbCfUserInfoVo> registerByPhone(@ApiParam("用户信息") @RequestBody TbCfUserInfoVo tbCfUserInfoVo,@ApiParam(value = "验证码") @RequestParam("code") String code) {
return tbCfUserInfoService.registerByPhone(tbCfUserInfoVo,code);
}
@ApiOperation("登录")
@PostMapping
public Result<TbCfUserInfoVo> login(@ApiParam(value = "登录名")String account,
......@@ -53,8 +60,22 @@ public class LoginController extends BaseController {
public Result<TbCfUserInfoVo> loginByToken() {
return tbCfUserInfoService.loginByToken(getIpAddr(request));
}
@ApiOperation("使用手机号登录")
@GetMapping("/phone")
public Result<TbCfUserInfoVo> loginByPhone(@ApiParam(value = "手机号") @RequestParam("phone") String phone,
@ApiParam(value = "验证码") @RequestParam("code") String code){
return tbCfUserInfoService.loginByPhone(getIpAddr(request),phone,code);
}
/**
* 获取短信验证码
*
*/
@ApiOperation(value = "获取短信验证码")
@GetMapping(value = "/register/identifyCode/{phone}")
public Result getUserPhoneCode(@ApiParam("手机号") @PathVariable("phone") @ValidateParam({Validator.NOT_BLANK}) String phone) throws IOException {
tbCfUserInfoService.getUserPhoneCode(phone);
return new Result("Verification code has been sent");
}
@ApiOperation("第三方登录")
@PostMapping("/thirdParty")
// TODO
......
......@@ -6,6 +6,7 @@ import com.diaoyun.zion.chinafrica.vo.TbCfUserInfoVo;
import com.diaoyun.zion.master.base.BaseController;
import com.diaoyun.zion.master.base.Result;
import com.diaoyun.zion.master.enums.ResultCodeEnum;
import com.diaoyun.zion.master.util.SMSUtil;
import com.diaoyun.zion.master.validator.Validator;
import com.diaoyun.zion.master.validator.annotation.ValidateParam;
import freemarker.template.TemplateException;
......@@ -18,8 +19,10 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.net.URLDecoder;
......@@ -58,6 +61,8 @@ public class TbCfUserInfoController extends BaseController {
return new Result("Verification code has been sent");
}
/**
* 获取存在session中的验证码
*/
......
......@@ -26,6 +26,12 @@ public interface TbCfUserInfoDao extends BaseDao<TbCfUserInfoEntity> {
*/
TbCfUserInfoEntity findByAccount(String account);
/**
* 根据手机号查找
* @param phone
* @return
*/
TbCfUserInfoEntity checkUserByPhone(String phone);
/**
* 更改用户密码
* @param userId
......
......@@ -4,7 +4,9 @@ import com.diaoyun.zion.chinafrica.entity.TbCfUserInfoEntity;
import com.diaoyun.zion.chinafrica.vo.TbCfUserInfoVo;
import com.diaoyun.zion.master.base.Result;
import freemarker.template.TemplateException;
import io.swagger.annotations.ApiParam;
import org.apache.commons.mail.EmailException;
import org.springframework.web.bind.annotation.RequestBody;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
......@@ -76,6 +78,7 @@ public interface TbCfUserInfoService {
*/
int deleteBatch(String[] userIds);
String getUserPhoneCode(String phone) throws IOException;
/**
* 发送注册验证码
* @param email
......@@ -90,6 +93,12 @@ public interface TbCfUserInfoService {
*/
Result registerAndLogin(TbCfUserInfoVo tbCfUserInfoVo);
/**
*通过手机注册
* @param tbCfUserInfoVo
* @return
*/
Result<TbCfUserInfoVo> registerByPhone(TbCfUserInfoVo tbCfUserInfoVo,String code);
/**
* 用户登录
* @param ipAddr
......@@ -99,6 +108,14 @@ public interface TbCfUserInfoService {
*/
Result login(String ipAddr, String account, String password);
/**
* 通过手机号登录
* @param ipAddr
* @param phone
* @param code
* @return
*/
Result loginByPhone(String ipAddr,String phone,String code);
/**
* 根据账号 手机、email、昵称 userId 查找
* @param account
......
......@@ -211,6 +211,59 @@ public class TbCfUserInfoServiceImpl implements TbCfUserInfoService {
return result;
}
@Override
public Result<TbCfUserInfoVo> registerByPhone(TbCfUserInfoVo tbCfUserInfoVo,String code) {
Result result = new Result();
TbCfUserInfoEntity user = tbCfUserInfoDao.checkUserByPhone(tbCfUserInfoVo.getPhone());
String phoneCode = (String) captchaRedisCache.get(KeyConstant.CAPTCHA_PHONE + tbCfUserInfoVo.getPhone());
if(code==null||!code.equals(phoneCode)){
result.setCode(ResultCodeEnum.VALIDATE_ERROR.getCode());
result.setMessage("Verification code error");
} else{
if(user==null) {
TbCfUserInfoEntity tbCfUserInfoEntity = new TbCfUserInfoEntity();
String userid = IdUtil.createIdbyUUID();
tbCfUserInfoVo.setUserId(userid);
//用户姓名
String nick = tbCfUserInfoVo.getNick();
tbCfUserInfoVo.setNick(nick);
fillUserNecessayInfo(tbCfUserInfoVo);
//加密密码
String password = passwordEncoder.encode(tbCfUserInfoVo.getPassword());
tbCfUserInfoVo.setPassword(password);
tbCfUserInfoVo.setEnableFlag(StateConstant.VALID);
BeanUtils.copyProperties(tbCfUserInfoVo, tbCfUserInfoEntity);
tbCfUserInfoDao.save(tbCfUserInfoEntity);
List<TbCfCouponEntity> couponVailList = tbCfCouponService.getCouponAndVaildAll();
//获取当前时间的时分秒
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//设置日期格式
String date = df.format(new Date());
for (int i = 0; i < couponVailList.size(); i++) {
TbCfIssueCouponEntity issue = new TbCfIssueCouponEntity();
String coupon_id = couponVailList.get(i).getCouponId();
String issuseCoupon_id = IdUtil.createIdbyUUID();
//把上面获取到的值,赋值到实体类中
issue.setCouponId(coupon_id);
issue.setCouponIssuetableId(issuseCoupon_id);
issue.setCreateTime(date);
issue.setUserId(userid);
issue.setNick(nick);
issue.setEnableFlag(1);
tbCfIssueCouponService.save(issue);
}
//注册成功 创建token
String token = jwtTokenProvider.createToken(tbCfUserInfoVo.getAccount());
tbCfUserInfoVo.setToken(token);
//保存在redis
tokenManager.addToken(token, tbCfUserInfoVo);
result.setMessage(ResultCodeEnum.SUCCESS.getDesc());
result.setData(tbCfUserInfoVo);
}
}
return result;
}
@Override
public Result login(String ip, String account, String password) {
try {
......@@ -222,7 +275,27 @@ public class TbCfUserInfoServiceImpl implements TbCfUserInfoService {
throw new ApplicationException(ResultCodeEnum.NEED_LOGIN.getCode(), "Invalid username/password supplied or account is disable");
}
}
public Result loginByPhone(String ip,String phoneNum,String code){
String phone=phoneNum.trim();
Result result=new Result();
TbCfUserInfoEntity user = tbCfUserInfoDao.checkUserByPhone(phone);
String phoneCode = (String) captchaRedisCache.get(KeyConstant.CAPTCHA_PHONE + phone);
if (user != null && phoneCode.equals(code)) {
result = loginByPhoneCode(ip, phone);
}else {
result.setCode(ResultCodeEnum.VALIDATE_ERROR.getCode());
result.setMessage("Login failed");
}
return result;
}
public String getUserPhoneCode(String phone) throws IOException {
SMSUtil smsUtil = new SMSUtil();
String code = smsUtil.yzCode(phone);
captchaRedisCache.set(KeyConstant.CAPTCHA_PHONE + phone, code, 1800);
return code;
}
/**
* 登录
*
......@@ -246,7 +319,23 @@ public class TbCfUserInfoServiceImpl implements TbCfUserInfoService {
result.setData(loginUser).setMessage(ResultCodeEnum.SUCCESS.getDesc());
return result;
}
public Result loginByPhoneCode(String ip, String phone) {
Result<TbCfUserInfoVo> result = new Result<>();
TbCfUserInfoEntity user = tbCfUserInfoDao.checkUserByPhone(phone);
user.setLastLoginIp(ip);
user.setLoginCount(user.getLoginCount() + 1);
user.setLastLoginTime(new Date());
tbCfUserInfoDao.update(user);
TbCfUserInfoVo loginUser = new TbCfUserInfoVo();
BeanUtils.copyProperties(user, loginUser);
loginUser.setPassword(null);
String token = jwtTokenProvider.createToken(user.getAccount());
loginUser.setToken(token);
tokenManager.addToken(token, loginUser);
result.setData(loginUser);
result.setMessage(ResultCodeEnum.SUCCESS.getDesc());
return result;
}
@Override
public TbCfUserInfoEntity findByAccount(String account) {
TbCfUserInfoEntity tbCfUserInfoEntity = tbCfUserInfoDao.findByAccount(account);
......
package com.diaoyun.zion.master.util;
import java.io.IOException;
import java.net.URISyntaxException;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.commons.lang.RandomStringUtils;
import org.apache.http.HttpEntity;
import org.apache.http.NameValuePair;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;
/**
* 短信接口类
* @author lyl
*
* 2018年4月18日
*/
public class SMSUtil {
//查账户信息的http地址
private static String URI_GET_USER_INFO = "https://sms.yunpian.com/v2/user/get.json";
//模板发送接口的http地址
private static String URI_TPL_SEND_SMS = "https://sms.yunpian.com/v2/sms/tpl_single_send.json";
//private static String URI_TPL_SEND_SMS ="https://sms.yunpian.com/v2/sms/single_send.json";
//编码格式。发送编码格式统一用UTF-8
private static String ENCODING = "UTF-8";
private String API_KEY="cb20310db0e7dcc76a827afbd2ba548f";
/**
* 查询用户信息
*
* @param apikey
* @return
* @throws IOException
* @throws URISyntaxException
*/
public static String getUserInfo(String apikey) throws IOException, URISyntaxException {
Map<String, String> params = new HashMap<String, String>();
params.put("apikey", apikey);
return post(URI_GET_USER_INFO, params);
}
/**
* 提交响应
*
* @param url
* @param paramsMap
* @return
*/
public static String post(String url, Map<String, String> paramsMap) {
CloseableHttpClient client = HttpClients.createDefault();
String responseText = "";
CloseableHttpResponse response = null;
try {
HttpPost method = new HttpPost(url);
if (paramsMap != null) {
List<NameValuePair> paramList = new ArrayList<NameValuePair>();
for (Map.Entry<String, String> param : paramsMap.entrySet()) {
NameValuePair pair = new BasicNameValuePair(param.getKey(), param.getValue());
paramList.add(pair);
}
method.setEntity(new UrlEncodedFormEntity(paramList, ENCODING));
}
response = client.execute(method);
HttpEntity entity = response.getEntity();
if (entity != null) {
responseText = EntityUtils.toString(entity, ENCODING);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
response.close();
} catch (Exception e) {
e.printStackTrace();
}
}
return responseText;
}
/**
* 发送验证码
*
* @return
* @throws IOException
*/
public String yzCode(String phone) throws IOException{
if(phone.equals(null)){
return "error";
}
//编码格式。发送编码格式统一用UTF-8
String ENCODING = "UTF-8";
long tpl_id = 3253208;//模板ID
String code = RandomStringUtils.randomNumeric(6);// 生成6位随机验证码
String tpl_value = URLEncoder.encode("#code#",ENCODING) +"="
+ URLEncoder.encode(code, ENCODING) ;
System.out.println(tpl_value);
System.out.println(SMSUtil.tplSendSms(API_KEY, tpl_id, tpl_value, phone));
return code;
}
/**
* 通过模板发送短信
*
* @param apikey
* @param tpl_id
* @param tpl_value
* @param mobile
* @return
* @throws IOException
*/
public static String tplSendSms(String apikey, long tpl_id, String tpl_value, String mobile) throws IOException {
Map<String, String> params = new HashMap<String, String>();
params.put("apikey", apikey);
params.put("tpl_id", String.valueOf(tpl_id));
params.put("tpl_value", tpl_value);
params.put("mobile", mobile);
return post(URI_TPL_SEND_SMS, params);
}
public static String singleSend(String apikey, String text, String mobile) {
Map<String, String> params = new HashMap<String, String>();//请求参数集合
params.put("apikey", apikey);
params.put("text", text);
params.put("mobile", mobile);
return post("https://sms.yunpian.com/v2/sms/single_send.json", params);//请自行使用post方式请求,可使用Apache HttpClient
}
public static void main(String[] args) throws IOException {
// SMSUtil.singleSend(URI_TPL_SEND_SMS,"code","+8613751400455");
SMSUtil s=new SMSUtil();
String s1 = s.yzCode("+260972134374");
}
}
......@@ -102,7 +102,10 @@
AND name LIKE concat('%',#{name},'%')
</if>
</select>
<select id="checkUserByPhone" resultType="com.diaoyun.zion.chinafrica.entity.TbCfUserInfoEntity" >
select * from tb_cf_user_info
WHERE phone=#{phone}
</select>
<insert id="save" parameterType="com.diaoyun.zion.chinafrica.entity.TbCfUserInfoEntity">
insert into tb_cf_user_info(
`user_id`,
......
......@@ -10,6 +10,7 @@ import com.diaoyun.zion.chinafrica.service.TbCfUserInfoService;
import com.diaoyun.zion.master.thread.TaskLimitSemaphore;
import com.diaoyun.zion.master.util.AESUtils;
import com.diaoyun.zion.master.util.IdUtil;
import com.diaoyun.zion.master.util.SMSUtil;
import com.stripe.exception.StripeException;
import freemarker.template.Configuration;
import org.apache.http.NameValuePair;
......@@ -489,4 +490,9 @@ public class ZionApplicationTests {
String couponId="1087f4a682354843b145d36c27d2d90e";
tbCfIssueCouponDao.changeCoupnStatus(userId,couponId);
}
@Test
public void testPhone() throws IOException {
//SMSUtil.yzCode("13751400455");
}
}
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论