问题 10 短信部分
This commit is contained in:
parent
2487ae8c8b
commit
3a902627ac
|
@ -4,8 +4,9 @@ import com.ruoyi.common.constant.CacheConstants;
|
||||||
import com.ruoyi.common.constant.Constants;
|
import com.ruoyi.common.constant.Constants;
|
||||||
import com.ruoyi.common.core.domain.AjaxResult;
|
import com.ruoyi.common.core.domain.AjaxResult;
|
||||||
import com.ruoyi.common.core.domain.R;
|
import com.ruoyi.common.core.domain.R;
|
||||||
|
import com.ruoyi.common.core.domain.model.LoginBody;
|
||||||
import com.ruoyi.common.core.redis.RedisCache;
|
import com.ruoyi.common.core.redis.RedisCache;
|
||||||
import com.ruoyi.common.utils.sign.Base64;
|
import com.ruoyi.common.utils.StringUtils;
|
||||||
import com.ruoyi.common.utils.uuid.IdUtils;
|
import com.ruoyi.common.utils.uuid.IdUtils;
|
||||||
import com.ruoyi.system.service.ISmsService;
|
import com.ruoyi.system.service.ISmsService;
|
||||||
import com.ruoyi.system.service.ISysConfigService;
|
import com.ruoyi.system.service.ISysConfigService;
|
||||||
|
@ -13,10 +14,7 @@ import io.swagger.annotations.Api;
|
||||||
import io.swagger.annotations.ApiOperation;
|
import io.swagger.annotations.ApiOperation;
|
||||||
import org.apache.commons.lang3.RandomStringUtils;
|
import org.apache.commons.lang3.RandomStringUtils;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.web.bind.annotation.PostMapping;
|
import org.springframework.web.bind.annotation.*;
|
||||||
import org.springframework.web.bind.annotation.RequestMapping;
|
|
||||||
import org.springframework.web.bind.annotation.RequestPart;
|
|
||||||
import org.springframework.web.bind.annotation.RestController;
|
|
||||||
|
|
||||||
import java.util.concurrent.TimeUnit;
|
import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
|
@ -38,9 +36,13 @@ public class SmsController {
|
||||||
@Autowired
|
@Autowired
|
||||||
private ISmsService iSmsService;
|
private ISmsService iSmsService;
|
||||||
|
|
||||||
@PostMapping("sendSms")
|
@PostMapping("/sendSms")
|
||||||
@ApiOperation("短信发送接口")
|
@ApiOperation("短信发送接口")
|
||||||
public AjaxResult sendSms(@RequestPart String phone) {
|
public AjaxResult sendSms(@RequestBody LoginBody loginBody) {
|
||||||
|
String phone = loginBody.getPhone();
|
||||||
|
if(StringUtils.isEmpty(phone)){
|
||||||
|
return AjaxResult.error("请输入手机号码!");
|
||||||
|
}
|
||||||
AjaxResult ajax = AjaxResult.success();
|
AjaxResult ajax = AjaxResult.success();
|
||||||
boolean captchaEnabled = configService.selectCaptchaEnabled();
|
boolean captchaEnabled = configService.selectCaptchaEnabled();
|
||||||
ajax.put("captchaEnabled", captchaEnabled);
|
ajax.put("captchaEnabled", captchaEnabled);
|
||||||
|
@ -54,7 +56,16 @@ public class SmsController {
|
||||||
String verifyKey = CacheConstants.CAPTCHA_CODE_KEY + uuid;
|
String verifyKey = CacheConstants.CAPTCHA_CODE_KEY + uuid;
|
||||||
String smsCode = generateCode();
|
String smsCode = generateCode();
|
||||||
redisCache.setCacheObject(verifyKey, smsCode, Constants.CAPTCHA_EXPIRATION, TimeUnit.MINUTES);
|
redisCache.setCacheObject(verifyKey, smsCode, Constants.CAPTCHA_EXPIRATION, TimeUnit.MINUTES);
|
||||||
iSmsService.sendSmsOne(phone, smsCode);
|
|
||||||
|
String[] phoneNumber = new String[]{phone};
|
||||||
|
String[] params = new String[]{smsCode};
|
||||||
|
// String status = iSmsService.sendSms(phoneNumber, params);
|
||||||
|
if("Ok".equals("Ok")){
|
||||||
|
System.out.println(phone + "sms code = "+smsCode);
|
||||||
|
System.out.println(phone + "sms code = "+smsCode);
|
||||||
|
System.out.println(phone + "sms code = "+smsCode);
|
||||||
|
System.out.println(phone + "sms code = "+smsCode);
|
||||||
|
}
|
||||||
ajax.put("uuid", uuid);
|
ajax.put("uuid", uuid);
|
||||||
return ajax;
|
return ajax;
|
||||||
}
|
}
|
||||||
|
|
|
@ -56,7 +56,7 @@ public class SysLoginController
|
||||||
{
|
{
|
||||||
AjaxResult ajax = AjaxResult.success();
|
AjaxResult ajax = AjaxResult.success();
|
||||||
// 生成令牌
|
// 生成令牌
|
||||||
String token = loginService.loginSms(loginBody.getUsername(), loginBody.getCode(),
|
String token = loginService.loginSms(loginBody.getPhone(), loginBody.getSmsCode(),
|
||||||
loginBody.getUuid());
|
loginBody.getUuid());
|
||||||
ajax.put(Constants.TOKEN, token);
|
ajax.put(Constants.TOKEN, token);
|
||||||
return ajax;
|
return ajax;
|
||||||
|
|
|
@ -122,6 +122,7 @@ public class SysLoginService
|
||||||
AuthenticationContextHolder.setContext(authenticationToken);
|
AuthenticationContextHolder.setContext(authenticationToken);
|
||||||
// 该方法会去调用UserDetailsServiceImpl.loadUserByUsername
|
// 该方法会去调用UserDetailsServiceImpl.loadUserByUsername
|
||||||
authentication = authenticationManager.authenticate(authenticationToken);
|
authentication = authenticationManager.authenticate(authenticationToken);
|
||||||
|
|
||||||
}
|
}
|
||||||
catch (Exception e)
|
catch (Exception e)
|
||||||
{
|
{
|
||||||
|
|
|
@ -10,7 +10,7 @@ public interface ISmsService {
|
||||||
* @param params
|
* @param params
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
String sendSms(String[] phoneNumber, String[] params) throws TencentCloudSDKException;
|
String sendSms(String[] phoneNumber, String[] params);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 验证验证码
|
* 验证验证码
|
||||||
|
|
|
@ -25,7 +25,7 @@ public class SmsServiceImpl implements ISmsService {
|
||||||
private StringRedisTemplate redisTemplate;
|
private StringRedisTemplate redisTemplate;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String sendSms(String[] phoneNumber, String[] params) throws TencentCloudSDKException {
|
public String sendSms(String[] phoneNumber, String[] params) {
|
||||||
SendSmsRequest req = new SendSmsRequest();
|
SendSmsRequest req = new SendSmsRequest();
|
||||||
req.setSignName(tencentCloudProperties.getSignName());
|
req.setSignName(tencentCloudProperties.getSignName());
|
||||||
req.setSmsSdkAppId(tencentCloudProperties.getSmsSdkAppId());
|
req.setSmsSdkAppId(tencentCloudProperties.getSmsSdkAppId());
|
||||||
|
@ -34,7 +34,12 @@ public class SmsServiceImpl implements ISmsService {
|
||||||
* 示例如:+8613711112222, 其中前面有一个+号 ,86为国家码,13711112222为手机号,最多不要超过200个手机号 */
|
* 示例如:+8613711112222, 其中前面有一个+号 ,86为国家码,13711112222为手机号,最多不要超过200个手机号 */
|
||||||
req.setPhoneNumberSet(phoneNumber);
|
req.setPhoneNumberSet(phoneNumber);
|
||||||
req.setTemplateParamSet(params);
|
req.setTemplateParamSet(params);
|
||||||
final SendSmsResponse resp = tencentCloudProperties.smsClient().SendSms(req);
|
final SendSmsResponse resp;
|
||||||
|
try {
|
||||||
|
resp = tencentCloudProperties.smsClient().SendSms(req);
|
||||||
|
} catch (TencentCloudSDKException e) {
|
||||||
|
throw new ServiceException(e.getMessage());
|
||||||
|
}
|
||||||
// 输出json格式的字符串回包
|
// 输出json格式的字符串回包
|
||||||
System.out.println(SendSmsResponse.toJsonString(resp));
|
System.out.println(SendSmsResponse.toJsonString(resp));
|
||||||
return resp.getSendStatusSet()[0].getCode();
|
return resp.getSendStatusSet()[0].getCode();
|
||||||
|
@ -52,7 +57,6 @@ public class SmsServiceImpl implements ISmsService {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void sendSmsOne(String phone, String smsCode) {
|
public void sendSmsOne(String phone, String smsCode) {
|
||||||
try {
|
|
||||||
/*验证手机号是否存在*/
|
/*验证手机号是否存在*/
|
||||||
if(false){
|
if(false){
|
||||||
throw new ServiceException("手机号不存在,请联系管理员注册!");
|
throw new ServiceException("手机号不存在,请联系管理员注册!");
|
||||||
|
@ -64,9 +68,6 @@ public class SmsServiceImpl implements ISmsService {
|
||||||
if("Ok".equals(status)){
|
if("Ok".equals(status)){
|
||||||
redisTemplate.opsForValue().set(phone, smsCode);
|
redisTemplate.opsForValue().set(phone, smsCode);
|
||||||
}
|
}
|
||||||
} catch (TencentCloudSDKException e) {
|
|
||||||
throw new ServiceException(e.getMessage());
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -59,7 +59,10 @@ export function getCodeImg() {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
export function sendSms(data) {
|
export function sendSms(phone) {
|
||||||
|
const data = {
|
||||||
|
phone
|
||||||
|
}
|
||||||
return request({
|
return request({
|
||||||
url: '/sendSms',
|
url: '/sendSms',
|
||||||
headers: {
|
headers: {
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
import { login, logout, getInfo } from '@/api/login'
|
import { login, loginSms, logout, getInfo } from '@/api/login'
|
||||||
import { getToken, setToken, removeToken } from '@/utils/auth'
|
import { getToken, setToken, removeToken } from '@/utils/auth'
|
||||||
|
|
||||||
const user = {
|
const user = {
|
||||||
|
@ -49,6 +49,21 @@ const user = {
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
|
// 登录
|
||||||
|
LoginSms({ commit }, userInfo) {
|
||||||
|
const phone = userInfo.phone.trim()
|
||||||
|
const smsCode = userInfo.smsCode
|
||||||
|
const uuid = userInfo.uuid
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
loginSms(phone, smsCode, uuid).then(res => {
|
||||||
|
setToken(res.token)
|
||||||
|
commit('SET_TOKEN', res.token)
|
||||||
|
resolve()
|
||||||
|
}).catch(error => {
|
||||||
|
reject(error)
|
||||||
|
})
|
||||||
|
})
|
||||||
|
},
|
||||||
|
|
||||||
// 获取用户信息
|
// 获取用户信息
|
||||||
GetInfo({ commit, state }) {
|
GetInfo({ commit, state }) {
|
||||||
|
|
|
@ -77,7 +77,7 @@
|
||||||
auto-complete="off"
|
auto-complete="off"
|
||||||
placeholder="验证码"
|
placeholder="验证码"
|
||||||
style="width: 63%"
|
style="width: 63%"
|
||||||
@keyup.enter.native="handleLogin"
|
@keyup.enter.native="submitForm"
|
||||||
>
|
>
|
||||||
<svg-icon slot="prefix" icon-class="validCode" class="el-input__icon input-icon" />
|
<svg-icon slot="prefix" icon-class="validCode" class="el-input__icon input-icon" />
|
||||||
</el-input>
|
</el-input>
|
||||||
|
@ -87,7 +87,7 @@
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item>
|
<el-form-item>
|
||||||
<el-button
|
<el-button
|
||||||
:loading="loading"
|
:loading="loading2"
|
||||||
size="medium"
|
size="medium"
|
||||||
type="primary"
|
type="primary"
|
||||||
style="width:100%;"
|
style="width:100%;"
|
||||||
|
@ -105,7 +105,7 @@
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
import { getCodeImg } from "@/api/login";
|
import { getCodeImg , sendSms } from "@/api/login";
|
||||||
import Cookies from "js-cookie";
|
import Cookies from "js-cookie";
|
||||||
import { encrypt, decrypt } from '@/utils/jsencrypt'
|
import { encrypt, decrypt } from '@/utils/jsencrypt'
|
||||||
|
|
||||||
|
@ -126,6 +126,7 @@ export default {
|
||||||
loginForm2: {
|
loginForm2: {
|
||||||
phone:"",
|
phone:"",
|
||||||
smsCode: "",
|
smsCode: "",
|
||||||
|
uuid: "",
|
||||||
loginType: 'sms'
|
loginType: 'sms'
|
||||||
},
|
},
|
||||||
countdown: 0,
|
countdown: 0,
|
||||||
|
@ -145,6 +146,7 @@ export default {
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
loading: false,
|
loading: false,
|
||||||
|
loading2: false,
|
||||||
// 验证码开关
|
// 验证码开关
|
||||||
captchaEnabled: true,
|
captchaEnabled: true,
|
||||||
// 注册开关
|
// 注册开关
|
||||||
|
@ -178,7 +180,8 @@ export default {
|
||||||
// 这里应该是发送请求到后端获取验证码的逻辑
|
// 这里应该是发送请求到后端获取验证码的逻辑
|
||||||
this.$refs.loginForm2.validate(valid => {
|
this.$refs.loginForm2.validate(valid => {
|
||||||
if (valid) {
|
if (valid) {
|
||||||
console.log('发送验证码到手机:', this.loginForm.phone);
|
const phone = this.loginForm2.phone
|
||||||
|
console.log('发送验证码到手机:', phone);
|
||||||
this.countdown = 60; // 假设验证码有效期为60秒
|
this.countdown = 60; // 假设验证码有效期为60秒
|
||||||
this.intervalId = setInterval(() => {
|
this.intervalId = setInterval(() => {
|
||||||
if (this.countdown > 0) {
|
if (this.countdown > 0) {
|
||||||
|
@ -187,24 +190,38 @@ export default {
|
||||||
clearInterval(this.intervalId);
|
clearInterval(this.intervalId);
|
||||||
}
|
}
|
||||||
}, 1000);
|
}, 1000);
|
||||||
alert('提交成功!');
|
sendSms(phone).then(res => {
|
||||||
|
this.captchaEnabled = res.captchaEnabled === undefined ? true : res.captchaEnabled;
|
||||||
|
if (this.captchaEnabled) {
|
||||||
|
this.loginForm2.uuid = res.uuid;
|
||||||
|
}
|
||||||
|
});
|
||||||
} else {
|
} else {
|
||||||
console.log('验证失败!');
|
console.log('验证失败!');
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
});
|
||||||
);
|
|
||||||
},
|
},
|
||||||
submitForm() {
|
submitForm() {
|
||||||
// 这里应该是表单验证和登录请求的逻辑
|
// 这里应该是表单验证和登录请求的逻辑
|
||||||
console.log('提交登录信息:', this.loginForm2);
|
console.log('提交登录信息:', this.loginForm2);
|
||||||
if(this.loginForm2.smsCode==""||this.loginForm2.smsCode.length!=6){
|
if(this.loginForm2.smsCode==""||this.loginForm2.smsCode.length!=6){
|
||||||
this.$modal.msgError("请输入短信验证码");
|
this.$modal.msgError("请输入短信验证码");
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
// 假设验证通过后进行登录操作
|
// 假设验证通过后进行登录操作
|
||||||
this.$refs.loginForm2.validate((valid) => {
|
this.$refs.loginForm2.validate((valid) => {
|
||||||
if (valid) {
|
if (valid) {
|
||||||
|
this.loading2 = true;
|
||||||
// 登录逻辑
|
// 登录逻辑
|
||||||
|
this.$store.dispatch("LoginSms", this.loginForm2).then(() => {
|
||||||
|
this.$router.push({ path: this.redirect || "/" }).catch(()=>{});
|
||||||
|
}).catch(() => {
|
||||||
|
this.loading2 = false;
|
||||||
|
// if (this.captchaEnabled) {
|
||||||
|
// this.sendCode();
|
||||||
|
// }
|
||||||
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
Loading…
Reference in New Issue