diff --git a/user-client/src/main/java/com/hp/user/client/service/AccountService.java b/user-client/src/main/java/com/hp/user/client/service/AccountService.java index 032b5a0..e90261a 100644 --- a/user-client/src/main/java/com/hp/user/client/service/AccountService.java +++ b/user-client/src/main/java/com/hp/user/client/service/AccountService.java @@ -9,5 +9,12 @@ package com.hp.user.client.service; * @since 2020-11-20 */ public interface AccountService { + + /** + * 登陆 + * @param phone 手机号 + * @param verificationCode 验证码 + */ + public void login(String phone,String verificationCode); } diff --git a/user-client/src/main/java/com/hp/user/client/service/MessageService.java b/user-client/src/main/java/com/hp/user/client/service/MessageService.java new file mode 100644 index 0000000..6be08e4 --- /dev/null +++ b/user-client/src/main/java/com/hp/user/client/service/MessageService.java @@ -0,0 +1,22 @@ +package com.hp.user.client.service; + +/** + * 信息服务 + * @author yeqid + * + */ +public interface MessageService { + + /** + * 发送验证码 + * @param phone 手机号 + */ + public void sendVerificationCode(String phone); + + /** + * 获取验证码 + * @param phone 手机号 + * @return 返回验证码 + */ + public String getVerificationCode(String phone); +} diff --git a/user-service/pom.xml b/user-service/pom.xml index ca69cbf..3e2787e 100644 --- a/user-service/pom.xml +++ b/user-service/pom.xml @@ -157,6 +157,12 @@ jackson-databind 2.9.5 + + + redis.clients + jedis + 2.9.0 + diff --git a/user-service/src/main/java/com/hp/user/service/UserServiceApplaction.java b/user-service/src/main/java/com/hp/user/service/UserServiceApplaction.java index 56e411c..0526928 100644 --- a/user-service/src/main/java/com/hp/user/service/UserServiceApplaction.java +++ b/user-service/src/main/java/com/hp/user/service/UserServiceApplaction.java @@ -7,6 +7,7 @@ import org.springframework.cache.annotation.EnableCaching; import org.springframework.context.annotation.ComponentScan; import com.alibaba.nacos.spring.context.annotation.config.NacosPropertySource; +import com.hp.user.service.redis.RedisOperation; /** * 用户服务启动类 @@ -18,7 +19,7 @@ import com.alibaba.nacos.spring.context.annotation.config.NacosPropertySource; @SpringBootApplication @NacosPropertySource(dataId = "userdatasource", autoRefreshed = true) //不能加compentscan,加了 -@ComponentScan("com.hp.user.service.dao")//这个地方不能写错,写错的话会出现2个问题,如果写的路径扫描不到swaggerconfig那么页面会报错 +//@ComponentScan("com.hp.user.service.dao")//这个地方不能写错,写错的话会出现2个问题,如果写的路径扫描不到swaggerconfig那么页面会报错 //(Unable to infer base url. This is common when using dynamic servlet registration or when the API is behind an API Gateway. //The base url is the root of where all the swagger resources are served. For e.g. if the api is available at http://example.org/api/v2/api-docs then the base url is http://example.org/api/. Please enter the location manually: ), //如果写的路径扫描不到controller那么页面不会有接口信息 @@ -26,5 +27,7 @@ import com.alibaba.nacos.spring.context.annotation.config.NacosPropertySource; public class UserServiceApplaction { public static void main(String[] args) { SpringApplication.run(UserServiceApplaction.class, args); + System.out.println(RedisOperation.getRedis().get("tst")); + RedisOperation.getRedis().close(); } } diff --git a/user-service/src/main/java/com/hp/user/service/controller/AuthenticationController.java b/user-service/src/main/java/com/hp/user/service/controller/AuthenticationController.java index 232dde4..a02b054 100644 --- a/user-service/src/main/java/com/hp/user/service/controller/AuthenticationController.java +++ b/user-service/src/main/java/com/hp/user/service/controller/AuthenticationController.java @@ -1,28 +1,39 @@ package com.hp.user.service.controller; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; +import com.hp.user.client.service.AccountService; + +import io.swagger.annotations.Api; + @RestController @RequestMapping("/authentication") +@Api(value="身份认证") public class AuthenticationController { + + @Autowired + private AccountService accountService; + + /** * 登录 - * @param account 账号 - * @param password 密码 + * @param phone 账号 + * @param verificationCode 验证码 */ @RequestMapping("/login") - public void login(String account,String password){ - + public void login(String phone,String verificationCode) { + accountService.login(phone, verificationCode); } /** * 登出 */ @RequestMapping("/loginOut") - public void loginOut(){ - + public void loginOut() { + } /** @@ -30,16 +41,10 @@ public class AuthenticationController { * 需要用户信息 */ @RequestMapping("/register") - public void register(){ + public void register() { } + + - /** - * 找回密码 - * @param account 账号 - */ - @RequestMapping("findPassword") - public void findPassword(String account){ - - } } diff --git a/user-service/src/main/java/com/hp/user/service/controller/MessageController.java b/user-service/src/main/java/com/hp/user/service/controller/MessageController.java new file mode 100644 index 0000000..11a07f1 --- /dev/null +++ b/user-service/src/main/java/com/hp/user/service/controller/MessageController.java @@ -0,0 +1,32 @@ +package com.hp.user.service.controller; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.hp.user.client.service.MessageService; + +import io.swagger.annotations.Api; + +/** + * 短信 + * @author yeqid + * + */ +@Api(value="短信") +@RestController +@RequestMapping("/area") +public class MessageController { + + @Autowired + private MessageService messageService; + + /** + * 发送验证码 + * @param phoneNumber + */ + @RequestMapping("/sendVerificationCode") + public void sendVerificationCode(String phoneNumber) { + messageService.sendVerificationCode(phoneNumber); + } +} diff --git a/user-service/src/main/java/com/hp/user/service/impl/AccountServiceImpl.java b/user-service/src/main/java/com/hp/user/service/impl/AccountServiceImpl.java index 40798aa..8e0174b 100644 --- a/user-service/src/main/java/com/hp/user/service/impl/AccountServiceImpl.java +++ b/user-service/src/main/java/com/hp/user/service/impl/AccountServiceImpl.java @@ -1,6 +1,10 @@ package com.hp.user.service.impl; import com.hp.user.client.service.AccountService; +import com.hp.user.client.service.MessageService; + +import org.apache.commons.codec.binary.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; /** @@ -13,5 +17,22 @@ import org.springframework.stereotype.Service; */ @Service public class AccountServiceImpl implements AccountService { + + @Autowired + private MessageService messageService; + + @Override + public void login(String phone, String verificationCode) { + try { + String code = messageService.getVerificationCode(phone); + if(StringUtils.equals(verificationCode, code)) { + //登陆成功 + }else { + //登陆失败,返回验证码 + } + }catch(Exception e) { + + } + } } diff --git a/user-service/src/main/java/com/hp/user/service/impl/MessageServiceImpl.java b/user-service/src/main/java/com/hp/user/service/impl/MessageServiceImpl.java new file mode 100644 index 0000000..3b6fc8f --- /dev/null +++ b/user-service/src/main/java/com/hp/user/service/impl/MessageServiceImpl.java @@ -0,0 +1,28 @@ +package com.hp.user.service.impl; + +import org.springframework.stereotype.Service; + +import com.hp.user.client.service.MessageService; + +/** + * 信息服务实现类 + * @author yeqid + * @since 2020/11/26 + * + */ +@Service +public class MessageServiceImpl implements MessageService { + + @Override + public void sendVerificationCode(String phone) { + // TODO Auto-generated method stub + + } + + @Override + public String getVerificationCode(String phone) { + // TODO Auto-generated method stub + return null; + } + +} diff --git a/user-service/src/main/java/com/hp/user/service/redis/RedisOperation.java b/user-service/src/main/java/com/hp/user/service/redis/RedisOperation.java new file mode 100644 index 0000000..e286f34 --- /dev/null +++ b/user-service/src/main/java/com/hp/user/service/redis/RedisOperation.java @@ -0,0 +1,178 @@ +package com.hp.user.service.redis; + +import java.io.IOException; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import org.apache.commons.pool2.impl.GenericObjectPoolConfig; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.ApplicationArguments; +import org.springframework.boot.ApplicationRunner; +import org.springframework.stereotype.Component; + +import redis.clients.jedis.Jedis; +import redis.clients.jedis.JedisPool; + +@Component +public class RedisOperation implements ApplicationRunner{ + + @Value("${redis-cluster.redisUrlList}") + private String hostAndPort; + @Value("${redis-cluster.password}") + private String password; + //10.1.170.207:17000,10.1.170.207:17001,10.1.170.207:17002,10.1.170.207:17003,10.1.170.207:17004,10.1.170.207:17005 + private static JedisPool pool = null; + + public static Jedis getRedis() { + return pool.getResource(); + } + +// public RedisOperation() { +// jedis = pool.getResource(); +// jedis.close(); +// System.out.println(jedis); +// } + + +// @PostConstruct +// public void init() { +// +// } + + /** + * 从redis中获取数据 + * @param key + * @return + */ +// public String get(String key) { +// +// return jedis.get(key); +// } +// +// /** +// * 往redis中set数据 +// * @param key +// * @param value +// */ +// public void set(String key,String value) { +// jedis.set(key, value); +// } +// +// /** +// * 往redis中hset数据 +// * @param key +// * @param field +// * @param value +// */ +// public void hset(String key,String field,String value) { +// jedis.hset(key, field, value); +// } +// +// /** +// * 从redis中hgetAll数据 +// * @param key +// * @return +// */ +// public Map hgetAll(String key) { +// return jedis.hgetAll(key); +// } +// +// public String hget(String key,String filed) { +// return jedis.hget(key,filed); +// } +// +// public void hmset(String key,Map hash) { +// jedis.hmset(key, hash); +// } +// /** +// * 设置有效时间 +// * @param key +// * @param second +// */ +// public void expire(String key,int second) { +// jedis.expire(key, second); +// } +// +// /** +// * 往redis中存数据并且设置失效时间 +// * @param key +// * @param seconds +// * @param value +// */ +// public void setex(String key,int seconds,String value) { +// jedis.setex(key, seconds, value); +// } +// +// /** +// * 批量获取指定的多个key的数据 +// * @param keys +// * @return +// */ +// public List mget(String ...keys) { +// return jedis.mget(keys); +// } +// +// /** +// * 删除key +// * @param key +// */ +// public void del(String key) { +// jedis.del(key); +// } +// /** +// * 判断key +// * @param key +// * @return +// */ +// public boolean exists(String key) { +// return jedis.exists(key); +// } +// /** +// * 释放资源 +// */ +// public void close() { +// try { +// if(jedis != null) { +// jedis.close(); +// } +// +// } catch (Exception e) { +//// LOGGER.error("redis close fail={}",e.getMessage()); +// } +// } + + @Override + public void run(ApplicationArguments args) throws Exception { + System.out.print("redis"); +// JedisPool pool = null; + // common-pool配置 + if (pool == null) { + GenericObjectPoolConfig poolConfig = new GenericObjectPoolConfig(); + poolConfig.setMaxTotal(GenericObjectPoolConfig.DEFAULT_MAX_TOTAL * 10); + poolConfig.setMaxIdle(GenericObjectPoolConfig.DEFAULT_MAX_IDLE * 4); + poolConfig.setMinIdle(GenericObjectPoolConfig.DEFAULT_MAX_IDLE * 2); + +// JedisPool.borrowObject最大等待时间 + poolConfig.setMaxWaitMillis(1000L); + try { +// Set jedisClusterNodes = new HashSet(); +// String[] singleUrl = hostAndPort.trim().split(","); + String[] single = hostAndPort.split(":"); +// for (int i = 0; i < singleUrl.length; i++) { +// String[] single = singleUrl[i].split(":"); +// jedisClusterNodes.add(new HostAndPort(single[0],Integer.parseInt(single[1]))); +//// jedisClusterNodes.add(new HostAndPort(single[0], Integer.parseInt(single[1]), false)); +// } +// jedis = new JedisCluster(jedisClusterNodes,2000,20); +// jedis = new JedisCluster(jedisClusterNodes,1000,10,4,password,poolConfig); +// new JedisPool(poolConfig, singleUrl[0], singleUrl[1],1000, password); + pool= new JedisPool(poolConfig, single[0], Integer.parseInt(single[1]),1000, password); + } catch (Exception e) { + e.printStackTrace(); + } + } + + } +} \ No newline at end of file diff --git a/user-service/src/main/java/com/hp/user/util/IdWorker.java b/user-service/src/main/java/com/hp/user/util/IdWorker.java new file mode 100644 index 0000000..f80689c --- /dev/null +++ b/user-service/src/main/java/com/hp/user/util/IdWorker.java @@ -0,0 +1,156 @@ +package com.hp.user.util; + +/** + * Id生成器 + * @author yeqid + * + */ +public class IdWorker{ + + //下面两个每个5位,加起来就是10位的工作机器id + private long workerId; //工作id + private long datacenterId; //数据id + //12位的序列号 + private long sequence; + + public static IdWorker worker = null; + + public IdWorker(long workerId, long datacenterId, long sequence){ + // sanity check for workerId + if (workerId > maxWorkerId || workerId < 0) { + throw new IllegalArgumentException(String.format("worker Id can't be greater than %d or less than 0",maxWorkerId)); + } + if (datacenterId > maxDatacenterId || datacenterId < 0) { + throw new IllegalArgumentException(String.format("datacenter Id can't be greater than %d or less than 0",maxDatacenterId)); + } + System.out.printf("worker starting. timestamp left shift %d, datacenter id bits %d, worker id bits %d, sequence bits %d, workerid %d", + timestampLeftShift, datacenterIdBits, workerIdBits, sequenceBits, workerId); + + this.workerId = workerId; + this.datacenterId = datacenterId; + this.sequence = sequence; + } + + //初始时间戳 + private long twepoch = 1525705533000l; + + //长度为5位 + private long workerIdBits = 5L; + private long datacenterIdBits = 5L; + //最大值 + private long maxWorkerId = -1L ^ (-1L << workerIdBits); + private long maxDatacenterId = -1L ^ (-1L << datacenterIdBits); + //序列号id长度 + private long sequenceBits = 12L; + //序列号最大值 + private long sequenceMask = -1L ^ (-1L << sequenceBits); + + //工作id需要左移的位数,12位 + private long workerIdShift = sequenceBits; + //数据id需要左移位数 12+5=17位 + private long datacenterIdShift = sequenceBits + workerIdBits; + //时间戳需要左移位数 12+5+5=22位 + private long timestampLeftShift = sequenceBits + workerIdBits + datacenterIdBits; + + //上次时间戳,初始值为负数 + private long lastTimestamp = -1L; + + public long getWorkerId(){ + return workerId; + } + + public long getDatacenterId(){ + return datacenterId; + } + + public long getTimestamp(){ + return System.currentTimeMillis(); + } + + //下一个ID生成算法 + public synchronized long nextId() { + long timestamp = timeGen(); + + //获取当前时间戳如果小于上次时间戳,则表示时间戳获取出现异常 + if (timestamp < lastTimestamp) { + System.err.printf("clock is moving backwards. Rejecting requests until %d.", lastTimestamp); + throw new RuntimeException(String.format("Clock moved backwards. Refusing to generate id for %d milliseconds", + lastTimestamp - timestamp)); + } + + //获取当前时间戳如果等于上次时间戳(同一毫秒内),则在序列号加一;否则序列号赋值为0,从0开始。 + if (lastTimestamp == timestamp) { + sequence = (sequence + 1) & sequenceMask; + if (sequence == 0) { + timestamp = tilNextMillis(lastTimestamp); + } + } else { + sequence = 0; + } + + //将上次时间戳值刷新 + lastTimestamp = timestamp; + + /** + * 返回结果: + * (timestamp - twepoch) << timestampLeftShift) 表示将时间戳减去初始时间戳,再左移相应位数 + * (datacenterId << datacenterIdShift) 表示将数据id左移相应位数 + * (workerId << workerIdShift) 表示将工作id左移相应位数 + * | 是按位或运算符,例如:x | y,只有当x,y都为0的时候结果才为0,其它情况结果都为1。 + * 因为个部分只有相应位上的值有意义,其它位上都是0,所以将各部分的值进行 | 运算就能得到最终拼接好的id + */ + return ((timestamp - twepoch) << timestampLeftShift) | + (datacenterId << datacenterIdShift) | + (workerId << workerIdShift) | + sequence; + } + + //获取时间戳,并与上次时间戳比较 + private long tilNextMillis(long lastTimestamp) { + long timestamp = timeGen(); + while (timestamp <= lastTimestamp) { + timestamp = timeGen(); + } + return timestamp; + } + + //获取系统时间戳 + private long timeGen(){ + return System.currentTimeMillis(); + } + + public static Long generactorId() { + if(worker == null) { + synchronized(IdWorker.class) { + if(worker == null) { + worker = new IdWorker(1,1,1); + } + } + } + return worker.nextId(); + } + + //---------------测试--------------- +// public static void main(String[] args) throws InterruptedException { +//// IdWorker worker = new IdWorker(1,1,1); +// Thread t1 = new Thread( new Runnable() {public void run() { for (int i = 0; i < 30; i++) { +// +// System.out.println(IdWorker.generactorId()); +// +// };} }, "t1"); +// Thread t2 = new Thread( new Runnable() {public void run() { for (int i = 0; i < 30; i++) { +// +// System.out.println(IdWorker.generactorId()); +// };} }, "t2"); +// Thread t3 = new Thread( new Runnable() {public void run() { for (int i = 0; i < 30; i++) { +// +// System.out.println(IdWorker.generactorId()); +// };} }, "t3"); +// t2.start(); +// t1.start(); +// t3.start(); +// t1.join(); +// t2.join(); +// } + +} \ No newline at end of file