diff --git a/pom.xml b/pom.xml index 3e656e9..906a5bc 100644 --- a/pom.xml +++ b/pom.xml @@ -198,6 +198,23 @@ 1.30.0 + + org.apache.httpcomponents + httpclient + 4.5.13 + + + + org.apache.httpcomponents + httpcore + 4.4.15 + + + org.apache.httpcomponents + httpcore + 4.4.13 + + diff --git a/src/main/java/com/whdc/controller/UserController.java b/src/main/java/com/whdc/controller/UserController.java index 3e3250b..cacb0fa 100644 --- a/src/main/java/com/whdc/controller/UserController.java +++ b/src/main/java/com/whdc/controller/UserController.java @@ -10,6 +10,7 @@ import com.whdc.model.group.Update; import com.whdc.model.vo.AuthToken; import com.whdc.model.vo.LoginVo; import com.whdc.service.IUserService; +import com.whdc.utils.HttpUtil; import com.whdc.service.impl.UserServiceImpl; import com.whdc.utils.ResultJson; import io.swagger.annotations.Api; @@ -22,6 +23,7 @@ import org.springframework.web.bind.annotation.*; import java.lang.reflect.InvocationTargetException; import java.util.Objects; +import java.util.UUID; import static com.whdc.service.impl.UserServiceImpl.getPassword; @@ -169,5 +171,23 @@ public class UserController { return ResultJson.ok(one.updateById() + " " + UserServiceImpl.DEFAULT_PASSWORD); } - + + + @ApiOperation(value = "发送验证码") + @GetMapping(value = "pushCode/{phone}") + public ResultJson pushCode(@PathVariable("phone") String phone) { + + return ResultJson.ok(service.pushCode(phone)); + + } + + @ApiOperation(value = "手机验证码登录") + @GetMapping(value = "loginByCode/{phone}/{code}") + public ResultJson loginByCode(@PathVariable("phone") String phone,@PathVariable("code") String code) { + + return ResultJson.ok(service.loginByCode(phone,code)); + + } + + } diff --git a/src/main/java/com/whdc/model/MyConstant.java b/src/main/java/com/whdc/model/MyConstant.java index f359345..2b1f97d 100644 --- a/src/main/java/com/whdc/model/MyConstant.java +++ b/src/main/java/com/whdc/model/MyConstant.java @@ -22,4 +22,5 @@ public class MyConstant { * 数据-数据服务运维员 角色编码 */ public static final String ROLE_PUSH = "data_zh_om"; + public static final String REDIS_KEY = "fxkh:txl:"; } diff --git a/src/main/java/com/whdc/model/dto/CommDto.java b/src/main/java/com/whdc/model/dto/CommDto.java index 6558ab8..6bebbcb 100644 --- a/src/main/java/com/whdc/model/dto/CommDto.java +++ b/src/main/java/com/whdc/model/dto/CommDto.java @@ -18,4 +18,7 @@ public class CommDto extends FindPageDto { @ApiModelProperty(value = "用户手机号") private String phone; + @ApiModelProperty(value = "0:添加用户,1:修改用户,2:修改权限,3:删除用户") + private String type; + } diff --git a/src/main/java/com/whdc/service/IUserService.java b/src/main/java/com/whdc/service/IUserService.java index 867870f..7b8acf6 100644 --- a/src/main/java/com/whdc/service/IUserService.java +++ b/src/main/java/com/whdc/service/IUserService.java @@ -36,4 +36,7 @@ public interface IUserService extends IService { boolean updateLastDate(Integer id); ResultJson updatePwd(UserDto dto); + boolean pushCode(String phone); + LoginVo loginByCode(String phone,String code); + } \ No newline at end of file diff --git a/src/main/java/com/whdc/service/impl/UserServiceImpl.java b/src/main/java/com/whdc/service/impl/UserServiceImpl.java index d90ad34..6bf594c 100644 --- a/src/main/java/com/whdc/service/impl/UserServiceImpl.java +++ b/src/main/java/com/whdc/service/impl/UserServiceImpl.java @@ -1,7 +1,9 @@ package com.whdc.service.impl; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.sun.org.apache.bcel.internal.generic.NEW; import com.whdc.exception.MyException; import com.whdc.mapper.AddressBookMapper; import com.whdc.mapper.UserMapper; @@ -12,17 +14,24 @@ import com.whdc.model.entity.User; import com.whdc.model.vo.LoginVo; import com.whdc.service.IUserService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.whdc.utils.HttpUtil; +import org.apache.commons.lang3.StringUtils; import com.whdc.utils.ResultJson; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Service; import org.springframework.util.DigestUtils; import java.util.Date; import java.util.List; +import java.util.Random; import java.util.Objects; import java.util.UUID; +import java.util.concurrent.TimeUnit; + +import static com.whdc.model.MyConstant.REDIS_KEY; /** @@ -41,6 +50,9 @@ public class UserServiceImpl extends ServiceImpl implements IU @Autowired private AddressBookMapper addressBookMapper; + @Autowired + private RedisTemplate stringRedisTemplate; + @Override public IPage page(User dto) { return baseMapper.page(new Page<>(), dto); @@ -116,6 +128,132 @@ public class UserServiceImpl extends ServiceImpl implements IU .update(); } + @Override + public boolean pushCode(String phone) { + + // 匹配手机号是否存在 + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper(); + queryWrapper.eq(AddressBook::getPhone, phone); + if (addressBookMapper.selectOne(queryWrapper) == null) { + throw new MyException("当前手机号不存在"); + } + // 判断是否以发送 + String key = REDIS_KEY + "code:" + phone; + String code = String.valueOf(stringRedisTemplate.opsForValue().get(key)); + if (StringUtils.isBlank(code)) { + // 生成验证码 + String numCode = getNumCode(); + push(phone, numCode); + stringRedisTemplate.opsForValue().set(key, numCode, 60, TimeUnit.SECONDS); + } else { + throw new MyException("请勿重复发送验证码"); + } + + + return true; + } + + @Override + public LoginVo loginByCode(String phone, String code) { + // 匹配手机号是否存在 + LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper(); + queryWrapper.eq(AddressBook::getPhone, phone); + AddressBook addressBook = addressBookMapper.selectOne(queryWrapper); + if (addressBook == null) { + throw new MyException("当前手机号不存在"); + } + + // 判断是否以发送 + String key = REDIS_KEY + "code:" + phone; + String pushCode = String.valueOf(stringRedisTemplate.opsForValue().get(key)); + if (StringUtils.isBlank(pushCode)) { + throw new MyException("当前验证码已过期"); + } + + if (!pushCode.equals(code)) { + throw new MyException("验证码错误"); + } + + + User sysUser = this.lambdaQuery().eq(User::getAbId, addressBook.getId()).one(); + + if (sysUser == null) { + throw new MyException("当前账号暂未注册"); + } + + LoginVo out = new LoginVo(); + BeanUtils.copyProperties(sysUser, out); + out.setName(addressBook.getName()); + return out; + } + + + public static String getCode() { + Random yzm = new Random(); //定义一个随机生成数技术,用来生成随机数 + //2,用String常用API-charAit生成验证码 + String yzm1 = "1234567890abcdefghijklmnopqrstuvwxwzABCDEFGHIJKLMNOPQRSTUVWXYZ";//定义一个String变量存放需要的数据,一共58位 + String yzm3 = "";//定义一个空的Atring变量用来接收生成的验证码 + for (int i = 0; i < 5; i++) { + int a = yzm.nextInt(58);//随机生成0-57之间的数,提供索引位置 + yzm3 += yzm1.charAt(a);//用get 和提供的索引找到相应位置的数据给变量 + } + return yzm3; + + } + + public static String getNumCode() { + //1,用随机生成数方法,生成验证码 + Random yzm = new Random(); //定义一个随机生成数技术,用来生成随机数 + + String yzm2 = ""; //定义一个空的Atring变量用来接收生成的验证码 + + for (int i = 0; i < 5; i++) { //循环5次每次生成一位,5位验证码 + + int a = yzm.nextInt(3); //验证码包括数字、大小写字母组成 + switch (a) { //a: 0 1 2 + case 0: // 数字 小写字母 大写字母 + char s = (char) (yzm.nextInt(26) + 65); + yzm2 = yzm2 + s; + break; + case 1: + char s1 = (char) (yzm.nextInt(26) + 97); + yzm2 = yzm2 + s1; + break; + case 2: + int s2 = yzm.nextInt(10); + yzm2 = yzm2 + s2; + break; + } + } + return yzm2; + } + + /** + * 消息推送 + * + * @param phone + * @param code + */ + public void push(String phone, String code) { + + String content = "您正在登录湖北省防汛抗旱通讯录,验证码为:" + code + ",若非本人操作,请勿将验证码泄露他人。"; + + String body = "{\n" + + " \"channel\": \"[phone]\",\n" + + " \"content\": \"" + content + "\",\n" + + " \"devices\": \"['" + phone + "']\",\n" + + " \"foreignId\": \"" + UUID.randomUUID() + "\",\n" + + " \"source\": \"山洪app\",\n" + +// " \"token\": \"\",\n" + + +// 消息类别,3为监测预警,4为预报预警,5自定义短信,示例值(3) + " \"type\": 5\n" + + "}"; + + HttpUtil.sendPost("http://223.75.53.141:82/shpush/v1/push/", body); + } + + @Override public ResultJson updatePwd(UserDto dto) { diff --git a/src/main/java/com/whdc/utils/HttpUtil.java b/src/main/java/com/whdc/utils/HttpUtil.java new file mode 100644 index 0000000..e81ae13 --- /dev/null +++ b/src/main/java/com/whdc/utils/HttpUtil.java @@ -0,0 +1,351 @@ +package com.whdc.utils; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +import org.apache.http.HttpEntity; +import org.apache.http.client.methods.CloseableHttpResponse; +import org.apache.http.client.methods.HttpPost; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClients; +import org.apache.http.util.EntityUtils; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpMethod; +import org.springframework.web.client.RestTemplate; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.net.HttpURLConnection; +import java.net.URL; +import java.nio.charset.StandardCharsets; +import java.util.Objects; + + +@Slf4j +public class HttpUtil { + + + private static final RestTemplate REST_TEMPLATE = new RestTemplate(); + + public static String doGetThrEx(String url, JSONObject json) { + HttpHeaders httpHeaders = new HttpHeaders(); + httpHeaders.add(HttpHeaders.CONTENT_TYPE, "application/json"); + + if (Objects.nonNull(json)){ + StringBuilder sb = new StringBuilder(); + for (String key : json.keySet()) { + if (sb.length() > 0) { + sb.append("&"); + } + sb.append(key).append("=").append(json.get(key)); + } + + url += "?" + sb; + String token = json.getString("token"); + if (StringUtils.isNotBlank(token)){ + httpHeaders.add("X-Access-Token", token); + } + } + + org.springframework.http.HttpEntity requestEntity = new org.springframework.http.HttpEntity<>(json, httpHeaders); + return REST_TEMPLATE.exchange(url, HttpMethod.GET, requestEntity, String.class).getBody(); + } + + public static String doGet(String url, JSONObject json) { + try { + return doGetThrEx(url, json); + } catch (Exception e) { + throw new RuntimeException("请求异常:" + e.getMessage(), e); + } + } + + public static String get(String _url) { + InputStream is = null; + BufferedReader br = null; + HttpURLConnection conn = null; + String jstr = null; + try { + + log.info("请求地址: " + _url); + + URL url = new URL(_url); + conn = (HttpURLConnection) url.openConnection(); + conn.setRequestMethod("GET"); + conn.setConnectTimeout(5000); + conn.setReadTimeout(5000); + conn.connect(); + if (conn.getResponseCode() == 200) { + is = conn.getInputStream(); + if (is != null) { + br = new BufferedReader(new InputStreamReader(is, StandardCharsets.UTF_8)); + StringBuffer sb = new StringBuffer(); + String tmp = ""; + while ((tmp = br.readLine()) != null) { + sb.append(tmp); + } + jstr = sb.toString(); + + log.info("响应参数: " + jstr); + + jstr = jsonFormat(jstr); + + + return jstr; + } + } else if (conn.getResponseCode() == 500) { + is = conn.getErrorStream(); + if (is != null) { + br = new BufferedReader(new InputStreamReader(is, StandardCharsets.UTF_8)); + StringBuffer sb = new StringBuffer(); + String tmp = ""; + while ((tmp = br.readLine()) != null) { + sb.append(tmp); + } + jstr = sb.toString(); + if (jstr.contains("Token失效,请重新登录")) { // 第三方token失效处理 + return "{\"code\": 301,\"extMessage\":\"Token失效,请重新登录\"}"; + } + } + } + } catch (Exception ignore) { + } finally { + if (br != null) { + try { + br.close(); + } catch (IOException ignore) { + } + } + if (is != null) { + try { + is.close(); + } catch (IOException ignore) { + } + } + if (conn != null) { + try { + conn.disconnect(); + } catch (Exception ignore) { + } + } + } + return null; + } + + + public static String get(String _url, String authorization) { + InputStream is = null; + BufferedReader br = null; + HttpURLConnection conn = null; + String jstr = null; + try { + + log.info("请求地址: " + _url); + + URL url = new URL(_url); + conn = (HttpURLConnection) url.openConnection(); + conn.setRequestProperty("Authorization", authorization); + conn.setRequestMethod("GET"); + conn.setConnectTimeout(50000); + conn.setReadTimeout(50000); + conn.connect(); + if (conn.getResponseCode() == 200) { + is = conn.getInputStream(); + if (is != null) { + br = new BufferedReader(new InputStreamReader(is, StandardCharsets.UTF_8)); + StringBuffer sb = new StringBuffer(); + String tmp = ""; + while ((tmp = br.readLine()) != null) { + sb.append(tmp); + } + jstr = sb.toString(); + + log.info("响应参数: " + jstr); + + jstr = jsonFormat(jstr); + + return jstr; + } + } else if (conn.getResponseCode() == 500) { + is = conn.getErrorStream(); + if (is != null) { + br = new BufferedReader(new InputStreamReader(is, StandardCharsets.UTF_8)); + StringBuffer sb = new StringBuffer(); + String tmp = ""; + while ((tmp = br.readLine()) != null) { + sb.append(tmp); + } + jstr = sb.toString(); + if (jstr.contains("Token失效,请重新登录")) { // 第三方token失效处理 + return "{\"code\": 301,\"extMessage\":\"Token失效,请重新登录\"}"; + } + } + } + } catch (Exception ignore) { + } finally { + if (br != null) { + try { + br.close(); + } catch (IOException ignore) { + } + } + if (is != null) { + try { + is.close(); + } catch (IOException ignore) { + } + } + if (conn != null) { + try { + conn.disconnect(); + } catch (Exception ignore) { + } + } + } + return null; + } + + + public static String get(String _url, String token, String forward) { + InputStream is = null; + BufferedReader br = null; + HttpURLConnection conn = null; + String jstr = null; + try { + + log.info("请求地址: " + _url); + + URL url = new URL(_url); + conn = (HttpURLConnection) url.openConnection(); + conn.setRequestProperty("X-Access-Token", token); + conn.setRequestProperty("url", forward); + conn.setRequestMethod("GET"); + conn.setConnectTimeout(50000); + conn.setReadTimeout(50000); + conn.connect(); + if (conn.getResponseCode() == 200) { + is = conn.getInputStream(); + if (is != null) { + br = new BufferedReader(new InputStreamReader(is, StandardCharsets.UTF_8)); + StringBuffer sb = new StringBuffer(); + String tmp = ""; + while ((tmp = br.readLine()) != null) { + sb.append(tmp); + } + jstr = sb.toString(); + + log.info("响应参数: " + jstr); + + jstr = jsonFormat(jstr); + + + return jstr; + } + } else if (conn.getResponseCode() == 500) { + is = conn.getErrorStream(); + if (is != null) { + br = new BufferedReader(new InputStreamReader(is, StandardCharsets.UTF_8)); + StringBuffer sb = new StringBuffer(); + String tmp = ""; + while ((tmp = br.readLine()) != null) { + sb.append(tmp); + } + jstr = sb.toString(); + if (jstr.contains("Token失效,请重新登录")) { // 第三方token失效处理 + return "{\"code\": 301,\"extMessage\":\"Token失效,请重新登录\"}"; + } + } + } + } catch (Exception ignore) { + } finally { + if (br != null) { + try { + br.close(); + } catch (IOException ignore) { + } + } + if (is != null) { + try { + is.close(); + } catch (IOException ignore) { + } + } + if (conn != null) { + try { + conn.disconnect(); + } catch (Exception ignore) { + } + } + } + return null; + } + + + /** + * @param url + * @param jsonData + * @return + */ + public static String sendPost(String url, String jsonData) { + return sendPost(url, jsonData, null); + } + + public static String sendPost(String url, String jsonData, JSONObject header) { + CloseableHttpResponse response = null; + CloseableHttpClient httpClient = null; + String responseContent = null; + try { + httpClient = HttpClients.createDefault(); + HttpPost httpPost = new HttpPost(url); + httpPost.addHeader("Content-Type", "application/json"); + if (Objects.nonNull(header)) { + for (String key : header.keySet()) { +// httpPost.addHeader("X-Access-Token", token); + httpPost.addHeader(key, header.getString(key)); + } + } + + if (StringUtils.isNotBlank(jsonData)){ + httpPost.setEntity(new StringEntity(jsonData, "UTF-8")); + } + + log.info("请求地址: " + url); + log.info("请求参数: " + jsonData); + + + response = httpClient.execute(httpPost); + HttpEntity entity = response.getEntity(); + responseContent = EntityUtils.toString(entity, "UTF-8"); + + responseContent = jsonFormat(responseContent); + + log.info("响应参数: " + responseContent); + + } catch (Exception e) { + log.error("发送请求异常", e); + throw new RuntimeException("发送请求异常", e); + } finally { + try { + if (null != response) { + response.close(); + } + httpClient.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + return responseContent; + } + + private static String jsonFormat(String str) { + + if (JSON.isValidObject(str)) { + str = JSON.parseObject(str).toJSONString(); + } + + return str; + } +} diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index bdcf11a..4ec63f2 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -8,12 +8,12 @@ spring: datasource: type: com.alibaba.druid.pool.DruidDataSource driver-class-name: dm.jdbc.driver.DmDriver -# url: jdbc:dm://10.0.41.113:5236?schema=FXKH_TXL -# username: SYSDBA -# password: SYSDBA001 - url: jdbc:dm://10.42.6.247:5236?schema=FXKH_TXL - username: SHZH - password: Shzh_890 + url: jdbc:dm://local.gunshiiot.com:5236?schema=FXKH_TXL + username: SYSDBA + password: SYSDBA001 +# url: jdbc:dm://10.42.6.247:5236?schema=FXKH_TXL +# username: SHZH +# password: Shzh_890 druid: initialSize: 5 minIdle: 5 diff --git a/src/main/resources/mapper/AddressBookMapper.xml b/src/main/resources/mapper/AddressBookMapper.xml index 24fc0da..c8483a3 100644 --- a/src/main/resources/mapper/AddressBookMapper.xml +++ b/src/main/resources/mapper/AddressBookMapper.xml @@ -34,6 +34,7 @@ AND AB.PHONE LIKE CONCAT('', #{dto.phone}, '%') ORDER BY F.SORT NULLS LAST,F.SORT,AB.SORT + GROUP BY AB.ID diff --git a/src/main/resources/mapper/VersionsMapper.xml b/src/main/resources/mapper/VersionsMapper.xml index 6fac678..7a72041 100644 --- a/src/main/resources/mapper/VersionsMapper.xml +++ b/src/main/resources/mapper/VersionsMapper.xml @@ -14,6 +14,9 @@ AND A.PHONE LIKE CONCAT('%', #{dto.phone}, '%') + + AND A.TYPE = #{dto.type} +