Commit 77ae64b1 by 段启岩

用户注册完成

parent 7ce70446
......@@ -66,6 +66,21 @@
</dependency>
<!-- JWT end -->
<!-- Redis start -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!-- Redis end -->
<!-- 阿里sdk start -->
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-core</artifactId>
<version>4.1.0</version>
</dependency>
<!-- 阿里sdk end -->
<dependency>
<groupId>mysql</groupId>
......@@ -82,6 +97,13 @@
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
......
package cn.meteor.beyondclouds.common.enums;
import cn.meteor.beyondclouds.core.api.IErrorCode;
import cn.meteor.beyondclouds.core.IErrorCode;
import lombok.AllArgsConstructor;
/**
......
package cn.meteor.beyondclouds.common.enums;
import cn.meteor.beyondclouds.core.IErrorCode;
/**
* Redis操作相关错误
* @author meteor
*/
public enum RedisErrorCode implements IErrorCode {
SET_FAILURE(10001, "存储失败");
RedisErrorCode(long code, String msg) {
this.code = code;
this.msg = msg;
}
private long code;
private String msg;
@Override
public long code() {
return code;
}
@Override
public String msg() {
return msg;
}
}
package cn.meteor.beyondclouds.common.enums;
import cn.meteor.beyondclouds.core.IErrorCode;
/**
* @author meteor
*/
public enum SmsErrorCode implements IErrorCode {
SERVER_ERROR(2001, "发送短信时阿里的服务器出现了异常"),
CLIENT_ERROR(2002, "发送短信时自己的服务器出现了异常"),
SEND_FAILURE(2003, "短信发送失败");
private long code;
private String msg;
SmsErrorCode(long code, String msg) {
this.code = code;
this.msg = msg;
}
@Override
public long code() {
return code;
}
@Override
public String msg() {
return msg;
}
}
package cn.meteor.beyondclouds.common.exception;
import cn.meteor.beyondclouds.core.IErrorCode;
import cn.meteor.beyondclouds.core.exception.ServiceException;
/**
* @author meteor
*/
public class RedisOperationException extends ServiceException {
public RedisOperationException(long errorCode, String errorMsg) {
super(errorCode, errorMsg);
}
public RedisOperationException(IErrorCode errorCode) {
super(errorCode);
}
}
package cn.meteor.beyondclouds.common.exception;
import cn.meteor.beyondclouds.core.IErrorCode;
import cn.meteor.beyondclouds.core.exception.ServiceException;
/**
* 短信相关异常
* @author meteor
*/
public class SmsException extends ServiceException {
public SmsException(long errorCode, String errorMsg) {
super(errorCode, errorMsg);
}
public SmsException(IErrorCode errorCode) {
super(errorCode);
}
}
package cn.meteor.beyondclouds.common.helper;
import cn.meteor.beyondclouds.common.exception.RedisOperationException;
/**
* Redis辅助类
* @author meteor
*/
public interface IRedisHelper {
/**
* 设置缓存失效时间
* @param key 键
* @param seconds 时间(秒)
* @return
*/
boolean expire(String key, long seconds);
/**
* 根据 key 获取过期时间
* @param key 键 不能为null
* @return 时间(秒) 返回0代表为永久有效
*/
long getExpire(String key);
/**
* 判断key是否存在
* @param key 键
* @return true 存在 false不存在
*/
boolean hasKey(String key);
/**
* 删除缓存
* @param key 可以传一个值 或多个
*/
void del(String... key);
/**
* 根据key获取缓存的对象
* @param key
* @param type
* @param <T>
* @return
*/
<T>T get(String key, Class<T> type);
/**
* 根据key获取缓存的字符串
* @param key
* @return
*/
String get(String key);
/**
* 存入对象
* @param key 键
* @param value 值
*/
void set(String key, Object value) throws RedisOperationException;
/**
* 存入对象
* @param key 键
* @param value 值
* @param seconds 有效期
*/
void set(String key, Object value, long seconds) throws RedisOperationException;
/**
* 递增
* @param key 键
* @param delta 要增加几(大于0)
* @return
*/
long increment(String key, long delta);
/**
* 递减
* @param key 键
* @param delta 要减少几(小于0)
* @return
*/
long decrement(String key, long delta);
}
package cn.meteor.beyondclouds.common.helper;
import cn.meteor.beyondclouds.common.exception.SmsException;
/**
* 短信辅助类
* @author meteor
*/
public interface ISmsHelper {
/**
* 发送验证码
* @param mobile
* @param verifyCode
*/
void sendVerifyCode(String mobile, String verifyCode) throws SmsException;
}
package cn.meteor.beyondclouds.common.helper;
import cn.meteor.beyondclouds.common.enums.RedisErrorCode;
import cn.meteor.beyondclouds.common.exception.RedisOperationException;
import cn.meteor.beyondclouds.util.JsonUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;
import java.io.IOException;
import java.util.Arrays;
import java.util.concurrent.TimeUnit;
/**
* @author meteor
*/
@Component
public class RedisHelperImpl implements IRedisHelper {
private StringRedisTemplate redisTemplate;
@Autowired
public void setRedisTemplate(StringRedisTemplate redisTemplate) {
this.redisTemplate = redisTemplate;
}
@Override
public boolean expire(String key, long seconds) {
return redisTemplate.expire(key, seconds, TimeUnit.SECONDS);
}
@Override
public long getExpire(String key) {
return redisTemplate.getExpire(key, TimeUnit.SECONDS);
}
@Override
public boolean hasKey(String key) {
return redisTemplate.hasKey(key);
}
@Override
public void del(String... key) {
if (key.length == 1) {
redisTemplate.delete(key[0]);
} else {
redisTemplate.delete(Arrays.asList(key));
}
}
@Override
public <T> T get(String key, Class<T> type) {
String jsonValue = get(key);
try {
return JsonUtils.toBean(jsonValue, type);
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
@Override
public String get(String key) {
return (String) redisTemplate.opsForValue().get(key);
}
@Override
public void set(String key, Object value) throws RedisOperationException {
try {
if (value instanceof String) {
redisTemplate.opsForValue().set(key, (String) value);
} else {
redisTemplate.opsForValue().set(key, JsonUtils.toJson(value));
}
} catch (IOException e) {
e.printStackTrace();
throw new RedisOperationException(RedisErrorCode.SET_FAILURE);
}
}
@Override
public void set(String key, Object value, long seconds) throws RedisOperationException {
try {
if (value instanceof String) {
redisTemplate.opsForValue().set(key, (String) value, seconds, TimeUnit.SECONDS);
} else {
redisTemplate.opsForValue().set(key, JsonUtils.toJson(value), seconds, TimeUnit.SECONDS);
}
} catch (IOException e) {
e.printStackTrace();
throw new RedisOperationException(RedisErrorCode.SET_FAILURE);
}
}
@Override
public long increment(String key, long delta) {
return redisTemplate.opsForValue().increment(key, delta);
}
@Override
public long decrement(String key, long delta) {
return redisTemplate.opsForValue().decrement(key, delta);
}
}
package cn.meteor.beyondclouds.common.helper;
import cn.meteor.beyondclouds.common.enums.SmsErrorCode;
import cn.meteor.beyondclouds.common.exception.SmsException;
import cn.meteor.beyondclouds.util.JsonUtils;
import com.aliyuncs.CommonRequest;
import com.aliyuncs.CommonResponse;
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.exceptions.ServerException;
import com.aliyuncs.http.MethodType;
import com.aliyuncs.profile.DefaultProfile;
import org.springframework.stereotype.Component;
import java.io.IOException;
import java.util.Map;
/**
* @author meteor
*/
@Component
public class SmsHelperImpl implements ISmsHelper {
private static final String SMS_RESPONSE_DATA_KEY = "Code";
private static final String SMS_RESPONSE_DATA_VALUE_OK = "OK";
private DefaultProfile profile = DefaultProfile.getProfile("cn-hangzhou", "LTAIeHWeydaWT3ZZ", "2FTWlODpzEZjsBQw10NO6SUBMwYOcL");
private IAcsClient client = new DefaultAcsClient(profile);
@Override
public void sendVerifyCode(String mobile, String verifyCode) throws SmsException {
CommonRequest request = new CommonRequest();
request.setMethod(MethodType.POST);
request.setDomain("dysmsapi.aliyuncs.com");
request.setVersion("2017-05-25");
request.setAction("SendSms");
request.putQueryParameter("RegionId", "cn-hangzhou");
request.putQueryParameter("PhoneNumbers", mobile);
request.putQueryParameter("SignName", "段启岩");
request.putQueryParameter("TemplateCode", "SMS_142384912");
request.putQueryParameter("TemplateParam", String.format("{\"code\" : \"%s\"}", verifyCode));
try {
CommonResponse response = client.getCommonResponse(request);
Map data = JsonUtils.toBean(response.getData(), Map.class);
if (!data.get(SMS_RESPONSE_DATA_KEY).equals(SMS_RESPONSE_DATA_VALUE_OK)) {
throw new SmsException(SmsErrorCode.SEND_FAILURE);
}
} catch (ServerException e) {
e.printStackTrace();
throw new SmsException(SmsErrorCode.SERVER_ERROR.code(), e.getErrMsg());
} catch (ClientException e) {
e.printStackTrace();
throw new SmsException(SmsErrorCode.CLIENT_ERROR.code(), e.getErrMsg());
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
// new SmsHelperImpl().sendVerifyCode("13546386889", "");
}
}
......@@ -32,6 +32,8 @@ public class WebMvcConfig implements WebMvcConfigurer {
.addPathPatterns("/**")
.excludePathPatterns("/error")
.excludePathPatterns("/api/auth/**")
.excludePathPatterns("/api/sms/**")
.excludePathPatterns("/api/user/register")
.excludePathPatterns("/swagger-resources/**", "/webjars/**", "/v2/**", "/swagger-ui.html/**");
}
......
package cn.meteor.beyondclouds.core.api;
package cn.meteor.beyondclouds.core;
/**
* 错误码接口
......
......@@ -2,6 +2,7 @@ package cn.meteor.beyondclouds.core.api;
import cn.meteor.beyondclouds.common.bean.FieldError;
import cn.meteor.beyondclouds.common.enums.ErrorCode;
import cn.meteor.beyondclouds.core.IErrorCode;
import cn.meteor.beyondclouds.core.exception.ServiceException;
import com.fasterxml.jackson.annotation.JsonInclude;
import lombok.Data;
......
package cn.meteor.beyondclouds.core.emuns;
import cn.meteor.beyondclouds.core.api.IErrorCode;
import cn.meteor.beyondclouds.core.IErrorCode;
/**
* 授权错误码
......
package cn.meteor.beyondclouds.core.exception;
import cn.meteor.beyondclouds.core.api.IErrorCode;
import cn.meteor.beyondclouds.core.IErrorCode;
/**
* 授权异常
......
package cn.meteor.beyondclouds.core.exception;
import cn.meteor.beyondclouds.core.api.IErrorCode;
import cn.meteor.beyondclouds.core.IErrorCode;
import lombok.Data;
/**
......
package cn.meteor.beyondclouds.core.interceptor;
import cn.meteor.beyondclouds.core.util.JwtUtils;
import cn.meteor.beyondclouds.util.JwtUtils;
import cn.meteor.beyondclouds.core.bean.Subject;
import cn.meteor.beyondclouds.core.constant.HttpRequestHeaderNames;
import cn.meteor.beyondclouds.core.constant.SysConstants;
......
package cn.meteor.beyondclouds.core.redis;
/**
* Redis键常量
* @author meteor
*/
public final class RedisKey {
private static final String VERIFY_CODE_KEY_PREFIX = "vcode:";
public static String VERIFY_CODE_KEY(String mobile) {
return VERIFY_CODE_KEY_PREFIX + mobile;
}
}
package cn.meteor.beyondclouds.modules.sms;
import cn.meteor.beyondclouds.common.exception.SmsException;
import cn.meteor.beyondclouds.core.api.Response;
import cn.meteor.beyondclouds.core.exception.ServiceException;
import cn.meteor.beyondclouds.modules.sms.service.ISmsService;
import cn.meteor.beyondclouds.util.VerifyCodeUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
/**
* 短信Api
* @author meteor
*/
@RestController
@RequestMapping("/api/sms")
public class SmsApi {
private ISmsService smsService;
@Autowired
public void setSmsService(ISmsService smsService) {
this.smsService = smsService;
}
@GetMapping("/verifyCode")
public Response sendVerify(@RequestParam("mobile") String mobile) {
try {
smsService.sendVerifyCode(mobile, VerifyCodeUtils.randomVerifyCode());
return Response.success();
} catch (ServiceException e) {
e.printStackTrace();
return Response.error(e);
}
}
}
package cn.meteor.beyondclouds.modules.sms.service;
import cn.meteor.beyondclouds.common.exception.RedisOperationException;
import cn.meteor.beyondclouds.common.exception.SmsException;
/**
* 短信业务类
* @author meteor
*/
public interface ISmsService {
/**
* 发送验证码
* @param mobile
* @param randomVerifyCode
*/
void sendVerifyCode(String mobile, String randomVerifyCode) throws SmsException, RedisOperationException;
}
package cn.meteor.beyondclouds.modules.sms.service.impl;
import cn.meteor.beyondclouds.common.exception.RedisOperationException;
import cn.meteor.beyondclouds.common.exception.SmsException;
import cn.meteor.beyondclouds.common.helper.IRedisHelper;
import cn.meteor.beyondclouds.common.helper.ISmsHelper;
import cn.meteor.beyondclouds.core.redis.RedisKey;
import cn.meteor.beyondclouds.modules.sms.service.ISmsService;
import cn.meteor.beyondclouds.modules.user.enums.UserErrorCode;
import cn.meteor.beyondclouds.modules.user.exception.UserServiceException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
/**
* 短信业务实现
* @author meteor
*/
@Service
public class SmsServiceImpl implements ISmsService {
private ISmsHelper smsHelper;
private IRedisHelper redisHelper;
@Autowired
public void setSmsHelper(ISmsHelper smsHelper, IRedisHelper redisHelper) {
this.smsHelper = smsHelper;
this.redisHelper = redisHelper;
}
@Override
public void sendVerifyCode(String mobile, String randomVerifyCode) throws SmsException, RedisOperationException {
//1. 发送短信
smsHelper.sendVerifyCode(mobile, randomVerifyCode);
//2.存储短信到redis
redisHelper.set(RedisKey.VERIFY_CODE_KEY(mobile), randomVerifyCode, 5 * 60);
}
}
......@@ -28,7 +28,7 @@ public class UserApi {
this.userService = userService;
}
@PostMapping("/")
@PostMapping("/register")
public Response register(@RequestBody @Valid UserRegisterFrom registerFrom, BindingResult result) {
if (result.hasErrors()) {
......@@ -36,7 +36,7 @@ public class UserApi {
}
try {
userService.register(registerFrom.getMobile(), registerFrom.getPassword());
userService.register(registerFrom.getMobile(), registerFrom.getPassword(), registerFrom.getVerifyCode());
return Response.success();
} catch (UserServiceException e) {
e.printStackTrace();
......@@ -44,18 +44,5 @@ public class UserApi {
}
}
@GetMapping("")
public Response<User> getUserInfo(@CurrentSubject Subject subject) {
User user = userService.getById(subject.getId());
return Response.success(user);
}
@PutMapping("/nick/{nickName}")
public Response updateNick(@PathVariable("nickName") String nickName, @CurrentSubject Subject subject) {
String userId = subject.getId();
userService.updateNickName(userId, nickName);
return Response.success();
}
}
package cn.meteor.beyondclouds.modules.user.enums;
import cn.meteor.beyondclouds.core.api.IErrorCode;
import cn.meteor.beyondclouds.core.IErrorCode;
/**
* 认证相关错误码
......
package cn.meteor.beyondclouds.modules.user.enums;
import cn.meteor.beyondclouds.core.api.IErrorCode;
import cn.meteor.beyondclouds.core.IErrorCode;
/**
* 用户相关错误码
......@@ -11,8 +11,8 @@ public enum UserErrorCode implements IErrorCode {
/**
* 手机号已经被注册//
*/
MOBILE_REGISTERED(1001, "该手机号已被注册")
;
MOBILE_REGISTERED(1001, "该手机号已被注册"),
REG_VERIFY_CODE_ERROR(1002, "验证码错误");
UserErrorCode(long code, String msg) {
this.code = code;
......
package cn.meteor.beyondclouds.modules.user.exception;
import cn.meteor.beyondclouds.core.api.IErrorCode;
import cn.meteor.beyondclouds.core.IErrorCode;
import cn.meteor.beyondclouds.core.exception.ServiceException;
/**
......
package cn.meteor.beyondclouds.modules.user.exception;
import cn.meteor.beyondclouds.core.api.IErrorCode;
import cn.meteor.beyondclouds.core.IErrorCode;
import cn.meteor.beyondclouds.core.exception.ServiceException;
/**
......
......@@ -15,4 +15,7 @@ public class UserRegisterFrom {
@NotEmpty(message = "密码不能为空")
private String password;
@NotEmpty(message = "验证码不能为空")
private String verifyCode;
}
package cn.meteor.beyondclouds.modules.user.service;
import cn.meteor.beyondclouds.modules.user.bean.AuthenticationResult;
import cn.meteor.beyondclouds.modules.user.entity.User;
import cn.meteor.beyondclouds.modules.user.exception.UserServiceException;
import com.baomidou.mybatisplus.extension.service.IService;
......@@ -14,8 +13,10 @@ public interface IUserService extends IService<User> {
* 使用手机号注册用户
* @param mobile
* @param password
* @param verifyCode
* @exception UserServiceException
*/
void register(String mobile, String password) throws UserServiceException;
void register(String mobile, String password, String verifyCode) throws UserServiceException;
/**
......
package cn.meteor.beyondclouds.modules.user.service.impl;
import cn.meteor.beyondclouds.core.util.JwtUtils;
import cn.meteor.beyondclouds.util.JwtUtils;
import cn.meteor.beyondclouds.modules.user.bean.AuthenticationResult;
import cn.meteor.beyondclouds.modules.user.entity.UserAuthLocal;
import cn.meteor.beyondclouds.modules.user.enums.AuthenticationErrorCode;
import cn.meteor.beyondclouds.modules.user.exception.AuthenticationServiceException;
import cn.meteor.beyondclouds.modules.user.service.IAuthenticationService;
import cn.meteor.beyondclouds.modules.user.service.IUserAuthLocalService;
import cn.meteor.beyondclouds.util.Md5Utils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
......@@ -35,7 +36,8 @@ public class AuthenticationServiceImpl implements IAuthenticationService {
}
//2. 判断密码是否正确
if (!password.equals(userAuthLocal.getPassword())) {
String encodedPassword = Md5Utils.encode(password);
if (!encodedPassword.equals(userAuthLocal.getPassword())) {
throw new AuthenticationServiceException(AuthenticationErrorCode.PASSWORD_NOT_MATCHED);
}
......
package cn.meteor.beyondclouds.modules.user.service.impl;
import cn.meteor.beyondclouds.modules.user.bean.AuthenticationResult;
import cn.meteor.beyondclouds.common.helper.IRedisHelper;
import cn.meteor.beyondclouds.core.redis.RedisKey;
import cn.meteor.beyondclouds.modules.user.entity.User;
import cn.meteor.beyondclouds.modules.user.entity.UserAuthLocal;
import cn.meteor.beyondclouds.modules.user.enums.UserErrorCode;
......@@ -8,11 +9,13 @@ import cn.meteor.beyondclouds.modules.user.exception.UserServiceException;
import cn.meteor.beyondclouds.modules.user.mapper.IUserMapper;
import cn.meteor.beyondclouds.modules.user.service.IUserAuthLocalService;
import cn.meteor.beyondclouds.modules.user.service.IUserService;
import cn.meteor.beyondclouds.util.Md5Utils;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
/**
* @author meteor
......@@ -22,15 +25,26 @@ import org.springframework.stereotype.Service;
public class UserServiceImpl extends ServiceImpl<IUserMapper, User> implements IUserService {
private IUserAuthLocalService userAuthLocalService;
private IRedisHelper redisHelper;
@Autowired
public void setUserAuthLocalService(IUserAuthLocalService userAuthLocalService) {
public void setUserAuthLocalService(IUserAuthLocalService userAuthLocalService, IRedisHelper redisHelper) {
this.userAuthLocalService = userAuthLocalService;
this.redisHelper = redisHelper;
}
@Override
public void register(String mobile, String password) throws UserServiceException {
//1. 检测该手机号是否被注册
public void register(String mobile, String password, String verifyCOde) throws UserServiceException {
//1.检查验证码是否正确
String realVerifyCode = redisHelper.get(RedisKey.VERIFY_CODE_KEY(mobile));
if (StringUtils.isEmpty(realVerifyCode) || !realVerifyCode.equals(verifyCOde)) {
throw new UserServiceException(UserErrorCode.REG_VERIFY_CODE_ERROR);
}
// 删除验证码
redisHelper.del(RedisKey.VERIFY_CODE_KEY(mobile));
//2. 检测该手机号是否被注册
QueryWrapper<UserAuthLocal> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("mobile", mobile);
UserAuthLocal userAuthLocal = userAuthLocalService.getOne(queryWrapper);
......@@ -38,17 +52,17 @@ public class UserServiceImpl extends ServiceImpl<IUserMapper, User> implements I
throw new UserServiceException(UserErrorCode.MOBILE_REGISTERED);
}
//2. 创建用户
//3. 创建用户
User user = new User();
user.setNickName("自动生成的昵称");
user.setSignature("自动生成的默认签名");
save(user);
//2. 创建认证信息
//4. 创建认证信息
userAuthLocal = new UserAuthLocal();
userAuthLocal.setUserId(user.getUserId());
userAuthLocal.setMobile(mobile);
userAuthLocal.setPassword(password);
userAuthLocal.setPassword(Md5Utils.encode(password));
userAuthLocalService.save(userAuthLocal);
}
......
package cn.meteor.beyondclouds.util;
import com.fasterxml.jackson.core.JsonFactory;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.io.IOException;
import java.io.StringWriter;
/**
* Json操作工具类
* @author meteor
*/
public class JsonUtils {
private static ObjectMapper mapper = new ObjectMapper();
public static String toJson(Object obj) throws IOException {
StringWriter stringWriter = new StringWriter();
JsonGenerator gen = new JsonFactory().createGenerator(stringWriter);
mapper.writeValue(gen, obj);
gen.close();
return stringWriter.toString();
}
public static <T> T toBean(String jsonStr, Class<T> type)
throws IOException {
return mapper.readValue(jsonStr, type);
}
}
package cn.meteor.beyondclouds.core.util;
package cn.meteor.beyondclouds.util;
import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTCreator;
......
package cn.meteor.beyondclouds.util;
import org.apache.commons.codec.digest.Md5Crypt;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
/**
* @author meteor
*/
public class Md5Utils {
public static String encode(String str) {
try {
MessageDigest digest = MessageDigest.getInstance("md5");
byte[] bs = digest.digest(str.getBytes());
String hexString = "";
for (byte b : bs) {
int temp = b & 255;
if (temp < 16 && temp >= 0) {
hexString = hexString + "0" + Integer.toHexString(temp);
} else {
hexString = hexString + Integer.toHexString(temp);
}
}
return hexString;
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
return "";
}
}
}
package cn.meteor.beyondclouds.util;
import java.util.Random;
/**
* 短信验证码工具类
* @author meteor
*/
public final class VerifyCodeUtils {
private static final Random random = new Random();
/**
* 生成随机验证码
* @return
*/
public static String randomVerifyCode() {
return String.format("%d%d%d%d", randomNumber(), randomNumber(), randomNumber(), randomNumber());
}
private static int randomNumber() {
return random.nextInt(9);
}
}
package cn.meteor.beyondclouds.common.helper;
import cn.meteor.beyondclouds.common.exception.RedisOperationException;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
@SpringBootTest
@RunWith(SpringRunner.class)
public class IRedisHelperTest {
private IRedisHelper redisHelper;
@Autowired
public void setRedisHelper(IRedisHelper redisHelper) {
this.redisHelper = redisHelper;
}
@Test
public void testSetValue() {
try {
redisHelper.set("test", "test1");
} catch (RedisOperationException e) {
e.printStackTrace();
}
}
}
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment