ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/dto/UpdatePhoneDTO.java
New file @@ -0,0 +1,22 @@ package com.ruoyi.account.api.dto; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import javax.validation.constraints.NotBlank; import java.io.Serializable; @Data @ApiModel(value = "UpdatePhoneDTO对象",description = "更换手机号DTO") public class UpdatePhoneDTO implements Serializable { @ApiModelProperty(value = "手机号") @NotBlank(message = "手机号不能为空") private String phone; @ApiModelProperty(value = "验证码") @NotBlank(message = "验证码不能为空") private String code; } ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/factory/AppUserFallbackFactory.java
@@ -41,6 +41,11 @@ } @Override public R<TAppUser> selectByPhone(String phone) { return R.fail("通过手机号查询用户失败:"+throwable.getMessage()); } @Override public R<List<TAppUser>> getUserByIds(List<Long> appUserIds) { return R.fail("根据用户id查询用户信息失败:"+throwable.getMessage()); } ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/feignClient/AppUserClient.java
@@ -39,6 +39,14 @@ @PostMapping("/t-app-user//user/updateAppUser") @PostMapping("/t-app-user/user/updateAppUser") R updateAppUser(@RequestBody TAppUser appUser); /** * 通过手机号查询用户 * @param phone * @return */ @GetMapping("/t-app-user/user/selectByPhone") R<TAppUser> selectByPhone(@RequestParam("phone") String phone); } ruoyi-auth/pom.xml
@@ -85,6 +85,12 @@ <version>${hutool.version}</version> </dependency> <dependency> <groupId>com.ruoyi</groupId> <artifactId>ruoyi-api-account</artifactId> <version>3.6.2</version> </dependency> </dependencies> <build> ruoyi-auth/src/main/java/com/ruoyi/auth/controller/TokenController.java
@@ -5,6 +5,14 @@ import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.ruoyi.account.api.feignClient.AppUserClient; import com.ruoyi.account.api.model.TAppUser; import com.ruoyi.common.core.constant.Constants; import com.ruoyi.common.core.constant.MsgConstants; import com.ruoyi.common.core.utils.HttpUtils; import com.ruoyi.common.core.utils.MsgUtil; import com.ruoyi.common.core.web.domain.AjaxResult; import com.ruoyi.common.redis.service.RedisService; import com.ruoyi.system.api.domain.SysRole; import com.ruoyi.system.api.domain.SysUser; import com.ruoyi.system.api.feignClient.SysUserClient; @@ -25,6 +33,7 @@ import com.ruoyi.system.api.model.LoginUser; import java.util.*; import java.util.concurrent.TimeUnit; /** * token 控制 @@ -42,7 +51,11 @@ private SysLoginService sysLoginService; @Resource private SysUserClient userClient; @Autowired private RedisService redisService; @Autowired private AppUserClient appUserClient; @@ -115,4 +128,26 @@ sysLoginService.register(registerBody.getUsername(), registerBody.getPassword(), request); return R.ok(); } /** * 获取验证码 * * @param phone 手机号 * @return 结果 */ @ApiOperation(value = "获取验证码",notes = "获取验证码",tags = {"更换手机号获取验证码"}) @GetMapping("getCode") public AjaxResult getCode(@RequestParam("phone") String phone) { TAppUser appUser = appUserClient.selectByPhone(phone).getData(); if (Objects.nonNull(appUser)){ return AjaxResult.error("该手机号已绑定账号"); } String code = MsgUtil.createCode(); redisService.setCacheObject(phone+Constants.APPLET,code,5L, TimeUnit.MINUTES); String reqStr = MsgUtil.codeMsg(phone, code); String result = HttpUtils.post(MsgConstants.SEND_URL, reqStr); return AjaxResult.success(result); } } ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/constant/Constants.java
@@ -127,7 +127,10 @@ */ public static final String DATE_FORMATTER_TIME = "yyyy-MM-dd HH:mm:ss"; public static final String DATE_FORMATTER_DATE = "yyyy-MM-dd"; /** * 后缀 */ public static final String APPLET = "_applet"; /** * 定时任务违规的字符 */ ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/constant/MsgConstants.java
New file @@ -0,0 +1,35 @@ package com.ruoyi.common.core.constant; /** * 短信常量 * * @author ruoyi */ public class MsgConstants { /** 短信发送地址 */ public static final String SEND_URL = "http://112.35.1.155:1992/sms/tmpsubmit"; /** 更换手机号短信验证码 TEMPLATE_ID */ public static final String CODE_TEMPLATE_ID = "5bf3949463e54c03a25c6fce3ad48139"; /** 停车占位提醒 TEMPLATE_ID */ public static final String STOP_TEMPLATE_ID = "4940ce98a3f94f67aa9f5cd2d4e05cbd"; /** 充电结束 TEMPLATE_ID */ public static final String CHARGE_TEMPLATE_ID = "47b2eb376cfa436faae041a6f2f22688"; /** 桩故障(自动/手动) TEMPLATE_ID */ public static final String FAULT_TEMPLATE_ID = "37956469a14a47e484a747a1e7e462de"; /** 更换手机号短信验证码 AP_ID */ public static final String CODE_AP_ID = "GH123"; /** 停车占位提醒 AP_ID */ public static final String STOP_AP_ID = "TC123"; /** 充电结束 AP_ID */ public static final String CHARGE_AP_ID = "CD123"; /** 桩故障(自动/手动) AP_ID */ public static final String FAULT_AP_ID = "GZ123"; } ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/HttpUtils.java
New file @@ -0,0 +1,311 @@ package com.ruoyi.common.core.utils; import com.ruoyi.common.core.constant.Constants; import com.ruoyi.common.core.exception.ServiceException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import javax.net.ssl.*; import java.io.*; import java.net.*; import java.nio.charset.StandardCharsets; import java.security.cert.X509Certificate; /** * 通用http发送方法 * * @author ruoyi */ public class HttpUtils { private static final Logger log = LoggerFactory.getLogger(HttpUtils.class); /** * 向指定 URL 发送GET方法的请求 * * @param url 发送请求的 URL * @return 所代表远程资源的响应结果 */ public static String sendGet(String url) { return sendGet(url, StringUtils.EMPTY); } /** * 向指定 URL 发送GET方法的请求 * * @param url 发送请求的 URL * @param param 请求参数,请求参数应该是 name1=value1&name2=value2 的形式。 * @return 所代表远程资源的响应结果 */ public static String sendGet(String url, String param) { return sendGet(url, param, Constants.UTF8); } /** * 向指定 URL 发送GET方法的请求 * * @param url 发送请求的 URL * @param param 请求参数,请求参数应该是 name1=value1&name2=value2 的形式。 * @param contentType 编码类型 * @return 所代表远程资源的响应结果 */ public static String sendGet(String url, String param, String contentType) { StringBuilder result = new StringBuilder(); BufferedReader in = null; try { String urlNameString = StringUtils.isNotBlank(param) ? url + "?" + param : url; log.info("sendGet - {}", urlNameString); URL realUrl = new URL(urlNameString); URLConnection connection = realUrl.openConnection(); connection.setRequestProperty("accept", "*/*"); connection.setRequestProperty("connection", "Keep-Alive"); connection.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)"); connection.connect(); in = new BufferedReader(new InputStreamReader(connection.getInputStream(), contentType)); String line; while ((line = in.readLine()) != null) { result.append(line); } log.info("recv - {}", result); } catch (ConnectException e) { log.error("调用HttpUtils.sendGet ConnectException, url=" + url + ",param=" + param, e); } catch (SocketTimeoutException e) { log.error("调用HttpUtils.sendGet SocketTimeoutException, url=" + url + ",param=" + param, e); } catch (IOException e) { log.error("调用HttpUtils.sendGet IOException, url=" + url + ",param=" + param, e); } catch (Exception e) { log.error("调用HttpsUtil.sendGet Exception, url=" + url + ",param=" + param, e); } finally { try { if (in != null) { in.close(); } } catch (Exception ex) { log.error("调用in.close Exception, url=" + url + ",param=" + param, ex); } } return result.toString(); } /** * 向指定 URL 发送POST方法的请求 * * @param url 发送请求的 URL * @param param 请求参数,请求参数应该是 name1=value1&name2=value2 的形式。 * @return 所代表远程资源的响应结果 */ public static String sendPost(String url, String param) { PrintWriter out = null; BufferedReader in = null; StringBuilder result = new StringBuilder(); try { log.info("sendPost - {}", url); URL realUrl = new URL(url); URLConnection conn = realUrl.openConnection(); conn.setRequestProperty("accept", "*/*"); conn.setRequestProperty("connection", "Keep-Alive"); conn.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)"); conn.setRequestProperty("Accept-Charset", "utf-8"); conn.setRequestProperty("contentType", "utf-8"); conn.setDoOutput(true); conn.setDoInput(true); out = new PrintWriter(conn.getOutputStream()); out.print(param); out.flush(); in = new BufferedReader(new InputStreamReader(conn.getInputStream(), StandardCharsets.UTF_8)); String line; while ((line = in.readLine()) != null) { result.append(line); } log.info("recv - {}", result); } catch (ConnectException e) { log.error("调用HttpUtils.sendPost ConnectException, url=" + url + ",param=" + param, e); } catch (SocketTimeoutException e) { log.error("调用HttpUtils.sendPost SocketTimeoutException, url=" + url + ",param=" + param, e); } catch (IOException e) { log.error("调用HttpUtils.sendPost IOException, url=" + url + ",param=" + param, e); } catch (Exception e) { log.error("调用HttpsUtil.sendPost Exception, url=" + url + ",param=" + param, e); } finally { try { if (out != null) { out.close(); } if (in != null) { in.close(); } } catch (IOException ex) { log.error("调用in.close Exception, url=" + url + ",param=" + param, ex); } } return result.toString(); } public static String sendSSLPost(String url, String param) { StringBuilder result = new StringBuilder(); String urlNameString = url + "?" + param; try { log.info("sendSSLPost - {}", urlNameString); SSLContext sc = SSLContext.getInstance("SSL"); sc.init(null, new TrustManager[] { new TrustAnyTrustManager() }, new java.security.SecureRandom()); URL console = new URL(urlNameString); HttpsURLConnection conn = (HttpsURLConnection) console.openConnection(); conn.setRequestProperty("accept", "*/*"); conn.setRequestProperty("connection", "Keep-Alive"); conn.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)"); conn.setRequestProperty("Accept-Charset", "utf-8"); conn.setRequestProperty("contentType", "utf-8"); conn.setDoOutput(true); conn.setDoInput(true); conn.setSSLSocketFactory(sc.getSocketFactory()); conn.setHostnameVerifier(new TrustAnyHostnameVerifier()); conn.connect(); InputStream is = conn.getInputStream(); BufferedReader br = new BufferedReader(new InputStreamReader(is)); String ret = ""; while ((ret = br.readLine()) != null) { if (ret != null && !"".equals(ret.trim())) { result.append(new String(ret.getBytes(StandardCharsets.ISO_8859_1), StandardCharsets.UTF_8)); } } log.info("recv - {}", result); conn.disconnect(); br.close(); } catch (ConnectException e) { log.error("调用HttpUtils.sendSSLPost ConnectException, url=" + url + ",param=" + param, e); } catch (SocketTimeoutException e) { log.error("调用HttpUtils.sendSSLPost SocketTimeoutException, url=" + url + ",param=" + param, e); } catch (IOException e) { log.error("调用HttpUtils.sendSSLPost IOException, url=" + url + ",param=" + param, e); } catch (Exception e) { log.error("调用HttpsUtil.sendSSLPost Exception, url=" + url + ",param=" + param, e); } return result.toString(); } public static String post(String strURL, String params) { String result = ""; BufferedReader reader = null; try { URL url = new URL(strURL);// 创建连接 HttpURLConnection connection = (HttpURLConnection) url .openConnection(); connection.setDoOutput(true); connection.setDoInput(true); connection.setUseCaches(false); connection.setInstanceFollowRedirects(true); connection.setRequestMethod("POST"); // 设置请求方式 connection.setRequestProperty("Accept", "application/json"); // 设置接收数据的格式 connection.setRequestProperty("Content-Type", "application/json"); // 设置发送数据的格式 connection.connect(); if (params != null && !StringUtils.isEmpty(params)) { byte[] writebytes = params.getBytes(); // 设置文件长度 // connection.setRequestProperty("Content-Length", String.valueOf(writebytes.length)); OutputStream outwritestream = connection.getOutputStream(); outwritestream.write(params.getBytes()); outwritestream.flush(); outwritestream.close(); // Log.d("hlhupload", "doJsonPost: conn"+connection.getResponseCode()); } if (connection.getResponseCode() == 200) { log.info("<<<<<<<<<<<<<请求响应:{}", connection.getResponseMessage()); reader = new BufferedReader( new InputStreamReader(connection.getInputStream())); result = reader.readLine(); log.info("<<<<<<<<<<<<<请求响应:{}", result); } else { throw new ServiceException(connection.getResponseMessage()); } } catch (Exception e) { throw new ServiceException("http的post请求异常!" + e.getMessage()); } finally { if (reader != null) { try { reader.close(); } catch (IOException e) { e.printStackTrace(); } } } return result; } private static class TrustAnyTrustManager implements X509TrustManager { @Override public void checkClientTrusted(X509Certificate[] chain, String authType) { } @Override public void checkServerTrusted(X509Certificate[] chain, String authType) { } @Override public X509Certificate[] getAcceptedIssuers() { return new X509Certificate[] {}; } } private static class TrustAnyHostnameVerifier implements HostnameVerifier { @Override public boolean verify(String hostname, SSLSession session) { return true; } } } ruoyi-common/ruoyi-common-core/src/main/java/com/ruoyi/common/core/utils/MsgUtil.java
@@ -1,6 +1,7 @@ package com.ruoyi.common.core.utils; import com.alibaba.fastjson2.JSON; import com.ruoyi.common.core.constant.MsgConstants; import com.ruoyi.common.core.utils.req.SubmitTempletReq; import org.apache.commons.codec.binary.Base64; @@ -15,23 +16,22 @@ /** * 更换手机号短信验证码 * @param phone * @param code * @param templateId * 更换手机号:【签名】验证码:XXX,用于更换手机号。请勿转发。 * @param phone 手机号 * @param code 验证码 * @return */ public static String codeMsg(String apId,String phone,String code,String templateId){ public static String codeMsg(String phone,String code){ SubmitTempletReq submitReq = new SubmitTempletReq(); String[] paramss = {code}; submitReq.setApId(apId); submitReq.setApId(MsgConstants.CODE_AP_ID); submitReq.setEcName(ecName); submitReq.setSecretKey(secretKey); submitReq.setParams(JSON.toJSONString(paramss)); submitReq.setMobiles(phone); submitReq.setAddSerial(""); submitReq.setSign(sign); submitReq.setTemplateId(templateId); submitReq.setTemplateId(MsgConstants.CODE_TEMPLATE_ID); StringBuffer stringBuffer = new StringBuffer(); stringBuffer.append(submitReq.getEcName()); stringBuffer.append(submitReq.getApId()); @@ -51,46 +51,14 @@ /** * 审批流程短信 * @param phone * @param name * @param work * @param templateId * 停车占位提醒:车辆已在3小时前完成充电,请及时取车,避免长时间占用充电资源。 * @param phone 手机号 * @return */ public static String auditMsg(String apId,String phone,String name,String work,String templateId){ public static String stopMsg(String phone){ SubmitTempletReq submitReq = new SubmitTempletReq(); // 判断工程名称长度 // if(work.length()<=10){ // String[] paramss = {name,work}; // submitReq.setParams(JSON.toJSONString(paramss)); // submitReq.setTemplateId("1ebcb36e532742ed8fd7b998a8222aab"); // }else if (work.length()<=20){ // String work1 = work.substring(0,10); // String work2 = work.substring(10); // String[] paramss = {name,work1,work2}; // submitReq.setParams(JSON.toJSONString(paramss)); // submitReq.setTemplateId("1c9e6cbddec649b1bdfa6830448df8ad"); // }else if (work.length()<=30){ // String work1 = work.substring(0,10); // String work2 = work.substring(10,20); // String work3 = work.substring(20); // String[] paramss = {name,work1,work2,work3}; // submitReq.setParams(JSON.toJSONString(paramss)); // submitReq.setTemplateId("91960e43e51446d0b3789129580f5bf8"); // }else { // String work1 = work.substring(0, 10); // String work2 = work.substring(10, 20); // String work3 = work.substring(20, 30); // String work4 = work.substring(30); // String[] paramss = {name, work1, work2, work3, work4}; // submitReq.setParams(JSON.toJSONString(paramss)); // submitReq.setTemplateId("279dd31f0565494284ee62694ae3e326"); // } String[] paramss = {name}; submitReq.setParams(JSON.toJSONString(paramss)); submitReq.setTemplateId("32b209c0096c48d7add8bafb290083dc"); submitReq.setApId(apId); submitReq.setTemplateId(MsgConstants.STOP_TEMPLATE_ID); submitReq.setApId(MsgConstants.STOP_AP_ID); submitReq.setEcName(ecName); submitReq.setSecretKey(secretKey); submitReq.setMobiles(phone); @@ -114,6 +82,77 @@ } /** * 充电结束:车辆充电结束,请及时取车。 * @param phone 手机号 * @return */ public static String chargeStopMsg(String phone){ SubmitTempletReq submitReq = new SubmitTempletReq(); submitReq.setTemplateId(MsgConstants.CHARGE_TEMPLATE_ID); submitReq.setApId(MsgConstants.CHARGE_AP_ID); submitReq.setEcName(ecName); submitReq.setSecretKey(secretKey); submitReq.setMobiles(phone); submitReq.setAddSerial(""); submitReq.setSign(sign); StringBuffer stringBuffer = new StringBuffer(); stringBuffer.append(submitReq.getEcName()); stringBuffer.append(submitReq.getApId()); stringBuffer.append(submitReq.getSecretKey()); stringBuffer.append(submitReq.getTemplateId()); stringBuffer.append(submitReq.getMobiles()); stringBuffer.append(submitReq.getParams()); stringBuffer.append(submitReq.getSign()); stringBuffer.append(submitReq.getAddSerial()); submitReq.setMac(MD5Util.getMD5(stringBuffer.toString())); String reqText = JSON.toJSONString(submitReq); //加密 String encode = Base64.encodeBase64String(reqText.getBytes()); System.err.println(encode); return encode; } /** * 桩故障(自动/手动):检测到【电站1】【编号】号桩设备离线,请及时查看处理! * @param phone 手机号 * @param site 站点名称 * @param chargeGun 桩编号 * @return */ public static String faultMsg(String phone,String site,String chargeGun){ SubmitTempletReq submitReq = new SubmitTempletReq(); if(site.length()<=10){ String[] paramss = {site,chargeGun}; submitReq.setParams(JSON.toJSONString(paramss)); }else{ String work1 = site.substring(0,10); String[] paramss = {work1,chargeGun}; submitReq.setParams(JSON.toJSONString(paramss)); } submitReq.setTemplateId(MsgConstants.FAULT_TEMPLATE_ID); submitReq.setApId(MsgConstants.FAULT_AP_ID); submitReq.setEcName(ecName); submitReq.setSecretKey(secretKey); submitReq.setMobiles(phone); submitReq.setAddSerial(""); submitReq.setSign(sign); StringBuffer stringBuffer = new StringBuffer(); stringBuffer.append(submitReq.getEcName()); stringBuffer.append(submitReq.getApId()); stringBuffer.append(submitReq.getSecretKey()); stringBuffer.append(submitReq.getTemplateId()); stringBuffer.append(submitReq.getMobiles()); stringBuffer.append(submitReq.getParams()); stringBuffer.append(submitReq.getSign()); stringBuffer.append(submitReq.getAddSerial()); submitReq.setMac(MD5Util.getMD5(stringBuffer.toString())); String reqText = JSON.toJSONString(submitReq); //加密 String encode = Base64.encodeBase64String(reqText.getBytes()); System.err.println(encode); return encode; } /** * 生成验证码 * @return */ ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/TAppUserController.java
@@ -16,7 +16,9 @@ import com.ruoyi.account.wx.model.WeixinProperties; import com.ruoyi.account.wx.tools.WxAppletTools; import com.ruoyi.account.util.GiveVipUtil; import com.ruoyi.common.core.constant.Constants; import com.ruoyi.common.core.domain.R; import com.ruoyi.common.core.utils.StringUtils; import com.ruoyi.common.core.utils.bean.BeanUtils; import com.ruoyi.common.core.web.domain.AjaxResult; import com.ruoyi.common.core.web.domain.BasePojo; @@ -41,6 +43,7 @@ import lombok.extern.slf4j.Slf4j; import org.aspectj.weaver.loadtime.Aj; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.*; import org.springframework.web.client.RestTemplate; @@ -86,6 +89,8 @@ private ExchangeOrderClient exchangeOrderClient; @Autowired private TokenService tokenService; @Autowired private RedisService redisService; @Resource private TAppUserSignService signService; @@ -438,6 +443,24 @@ return R.ok(); } @ApiOperation(value = "更换手机号", tags = {"小程序-用户管理-更换手机号"}) @PostMapping(value = "/user/updatePhone") public AjaxResult<String> updatePhone(@Validated @RequestBody UpdatePhoneDTO dto) { String code = redisService.getCacheObject(dto.getPhone() + Constants.APPLET); if(StringUtils.isEmpty(code)){ return AjaxResult.error("验证码已过期,请重新获取验证码!"); } if(!code.equals(dto.getCode())){ return AjaxResult.error("验证码错误!"); } // 获取当前用户信息 Long userId = tokenService.getLoginUserApplet().getUserId(); TAppUser appUser = appUserService.getById(userId); appUser.setPhone(dto.getPhone()); appUserService.updateById(appUser); return AjaxResult.success(); } /** * 根据用户id查询用户信息 * @param appUserIds 用户id @@ -473,6 +496,17 @@ return R.ok(); } /** * 通过手机号查询用户 * @param phone * @return */ @GetMapping("/user/selectByPhone") public R<TAppUser> selectByPhone(@RequestParam("phone") String phone){ return R.ok(appUserService.getOne(Wrappers.lambdaQuery(TAppUser.class) .eq(TAppUser::getPhone,phone) .last("LIMIT 1"))); } // @ApiOperation(value = "签到", tags = {"小程序-个人中心-签到"}) // @PostMapping(value = "/user/sign") ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/TAdvertisingController.java
@@ -64,7 +64,7 @@ } @ApiOperation(tags = {"小程序-广告管理"},value = "广告列表查询") @PostMapping(value = "/list") @GetMapping(value = "/list") public AjaxResult<List<TAdvertising>> list() { return AjaxResult.ok(advertisingService.list(Wrappers.lambdaQuery(TAdvertising.class) .eq(TAdvertising::getStatus, AdvertisingStatusEnum.YES.getCode())));