From 67f39351a5571b822f93c09e8c6e7986fe91e758 Mon Sep 17 00:00:00 2001
From: Junjie <fallin.jie@qq.com>
Date: 星期三, 06 九月 2023 16:46:29 +0800
Subject: [PATCH] #短信登录
---
src/main/java/com/zy/crm/manager/entity/SmsCode.java | 127 ++++++++++
src/main/java/com/zy/crm/manager/controller/SmsCodeController.java | 164 +++++++++++++
src/main/java/com/zy/crm/manager/service/impl/SmsCodeServiceImpl.java | 67 +++++
src/main/java/com/zy/crm/manager/service/SmsCodeService.java | 14 +
src/main/java/com/zy/crm/common/CodeRes.java | 1
src/main/java/com/zy/crm/common/web/AuthController.java | 39 +++
pom.xml | 6
src/main/java/com/zy/crm/manager/utils/SmsUtils.java | 119 +++++++++
src/main/resources/mapper/SmsCodeMapper.xml | 23 +
src/main/webapp/views/login.html | 142 ++++++++++-
src/main/java/com/zy/crm/manager/mapper/SmsCodeMapper.java | 14 +
11 files changed, 702 insertions(+), 14 deletions(-)
diff --git a/pom.xml b/pom.xml
index 15db921..32b5017 100644
--- a/pom.xml
+++ b/pom.xml
@@ -134,6 +134,12 @@
<artifactId>poi-scratchpad</artifactId>
<version>4.1.2</version>
</dependency>
+
+ <dependency>
+ <groupId>com.aliyun</groupId>
+ <artifactId>alibabacloud-dysmsapi20170525</artifactId>
+ <version>2.0.24</version>
+ </dependency>
</dependencies>
<build>
diff --git a/src/main/java/com/zy/crm/common/CodeRes.java b/src/main/java/com/zy/crm/common/CodeRes.java
index 1f5a766..65d5517 100644
--- a/src/main/java/com/zy/crm/common/CodeRes.java
+++ b/src/main/java/com/zy/crm/common/CodeRes.java
@@ -9,6 +9,7 @@
String USER_10002 = "10002-璐﹀彿宸茶绂佺敤";
String USER_10003 = "10003-瀵嗙爜閿欒";
String USER_10004 = "10004-瀵嗙爜鏈垵濮嬪寲";
+ String USER_10005 = "10005-鐭俊鐧诲綍楠岃瘉澶辫触";
// stock
String NONE_STOCK = "20002-搴撳瓨涓嶈冻";
diff --git a/src/main/java/com/zy/crm/common/web/AuthController.java b/src/main/java/com/zy/crm/common/web/AuthController.java
index 6711669..4b8fe69 100644
--- a/src/main/java/com/zy/crm/common/web/AuthController.java
+++ b/src/main/java/com/zy/crm/common/web/AuthController.java
@@ -8,6 +8,8 @@
import com.core.common.Cools;
import com.core.common.R;
import com.core.exception.CoolException;
+import com.zy.crm.manager.service.SmsCodeService;
+import com.zy.crm.manager.utils.SmsUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.transaction.annotation.Transactional;
@@ -53,9 +55,11 @@
private RolePermissionService rolePermissionService;
@Autowired
private HostService hostService;
+ @Autowired
+ private SmsCodeService smsCodeService;
@RequestMapping("/login.action")
- @ManagerAuth(value = ManagerAuth.Auth.NONE, memo = "鐧诲綍")
+ @ManagerAuth(value = ManagerAuth.Auth.NONE, memo = "瀵嗙爜鐧诲綍")
public R loginAction(String username, String password){
if (username.equals("super") && password.equals(Cools.md5(superPwd))) {
Map<String, Object> res = new HashMap<>();
@@ -95,6 +99,39 @@
return R.ok(res);
}
+ @RequestMapping("/smsLogin.action")
+ @ManagerAuth(value = ManagerAuth.Auth.NONE, memo = "鐭俊鐧诲綍")
+ public R smsLoginAction(String phone, String code){
+ EntityWrapper<User> userWrapper = new EntityWrapper<>();
+ userWrapper.eq("mobile", phone);
+ User user = userService.selectOne(userWrapper);
+ if (Cools.isEmpty(user)){
+ return R.parse(CodeRes.USER_10001);
+ }
+ if (user.getStatus()!=1){
+ return R.parse(CodeRes.USER_10002);
+ }
+ boolean verify = smsCodeService.verifySmsCode(phone, code);
+ if (!verify) {
+ return R.parse(CodeRes.USER_10005);
+ }
+ String token = Cools.enToken(System.currentTimeMillis() + phone, code);
+ userLoginService.delete(new EntityWrapper<UserLogin>().eq("user_id", user.getId()));
+ UserLogin userLogin = new UserLogin();
+ userLogin.setUserId(user.getId());
+ userLogin.setToken(token);
+ userLogin.setCreateTime(new Date());
+ if (user.getRoleId() == 1) {
+ userLogin.setHostId(hostService.getTop1().getId());
+ }
+ userLoginService.insert(userLogin);
+ Map<String, Object> res = new HashMap<>();
+ res.put("username", user.getUsername());
+ res.put("nickname", user.getNickname());
+ res.put("token", token);
+ return R.ok(res);
+ }
+
@RequestMapping("/show/host.action")
@ManagerAuth
public R showHosts() {
diff --git a/src/main/java/com/zy/crm/manager/controller/SmsCodeController.java b/src/main/java/com/zy/crm/manager/controller/SmsCodeController.java
new file mode 100644
index 0000000..a71a463
--- /dev/null
+++ b/src/main/java/com/zy/crm/manager/controller/SmsCodeController.java
@@ -0,0 +1,164 @@
+package com.zy.crm.manager.controller;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.mapper.EntityWrapper;
+import com.baomidou.mybatisplus.mapper.Wrapper;
+import com.baomidou.mybatisplus.plugins.Page;
+import com.core.common.DateUtils;
+import com.zy.crm.manager.entity.SmsCode;
+import com.zy.crm.manager.service.SmsCodeService;
+import com.core.annotations.ManagerAuth;
+import com.core.common.BaseRes;
+import com.core.common.Cools;
+import com.core.common.R;
+import com.core.domain.KeyValueVo;
+import com.zy.crm.common.web.BaseController;
+import com.zy.crm.manager.utils.SmsUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.*;
+
+@RestController
+public class SmsCodeController extends BaseController {
+
+ @Autowired
+ private SmsCodeService smsCodeService;
+
+ @RequestMapping(value = "/smsCode/{id}/auth")
+ @ManagerAuth
+ public R get(@PathVariable("id") String id) {
+ return R.ok(smsCodeService.selectById(String.valueOf(id)));
+ }
+
+ @RequestMapping(value = "/smsCode/list/auth")
+ @ManagerAuth
+ public R list(@RequestParam(defaultValue = "1") Integer curr,
+ @RequestParam(defaultValue = "10") Integer limit,
+ @RequestParam(required = false) String orderByField,
+ @RequestParam(required = false) String orderByType,
+ @RequestParam(required = false) String condition,
+ @RequestParam Map<String, Object> param) {
+ EntityWrapper<SmsCode> wrapper = new EntityWrapper<>();
+ excludeTrash(param);
+ convert(param, wrapper);
+ allLike(SmsCode.class, param.keySet(), wrapper, condition);
+ if (!Cools.isEmpty(orderByField)) {
+ wrapper.orderBy(humpToLine(orderByField), "asc".equals(orderByType));
+ }
+ return R.ok(smsCodeService.selectPage(new Page<>(curr, limit), wrapper));
+ }
+
+ private <T> void convert(Map<String, Object> map, EntityWrapper<T> wrapper) {
+ for (Map.Entry<String, Object> entry : map.entrySet()) {
+ String val = String.valueOf(entry.getValue());
+ if (val.contains(RANGE_TIME_LINK)) {
+ String[] dates = val.split(RANGE_TIME_LINK);
+ wrapper.ge(entry.getKey(), DateUtils.convert(dates[0]));
+ wrapper.le(entry.getKey(), DateUtils.convert(dates[1]));
+ } else {
+ wrapper.like(entry.getKey(), val);
+ }
+ }
+ }
+
+ @RequestMapping(value = "/smsCode/add/auth")
+ @ManagerAuth
+ public R add(SmsCode smsCode) {
+ smsCodeService.insert(smsCode);
+ return R.ok();
+ }
+
+ @RequestMapping(value = "/smsCode/update/auth")
+ @ManagerAuth
+ public R update(SmsCode smsCode) {
+ if (Cools.isEmpty(smsCode) || null == smsCode.getId()) {
+ return R.error();
+ }
+ smsCodeService.updateById(smsCode);
+ return R.ok();
+ }
+
+ @RequestMapping(value = "/smsCode/delete/auth")
+ @ManagerAuth
+ public R delete(@RequestParam(value = "ids[]") Long[] ids) {
+ for (Long id : ids) {
+ smsCodeService.deleteById(id);
+ }
+ return R.ok();
+ }
+
+ @RequestMapping(value = "/smsCode/export/auth")
+ @ManagerAuth
+ public R export(@RequestBody JSONObject param) {
+ EntityWrapper<SmsCode> wrapper = new EntityWrapper<>();
+ List<String> fields = JSONObject.parseArray(param.getJSONArray("fields").toJSONString(), String.class);
+ Map<String, Object> map = excludeTrash(param.getJSONObject("smsCode"));
+ convert(map, wrapper);
+ List<SmsCode> list = smsCodeService.selectList(wrapper);
+ return R.ok(exportSupport(list, fields));
+ }
+
+ @RequestMapping(value = "/smsCodeQuery/auth")
+ @ManagerAuth
+ public R query(String condition) {
+ EntityWrapper<SmsCode> wrapper = new EntityWrapper<>();
+ wrapper.like("id", condition);
+ Page<SmsCode> page = smsCodeService.selectPage(new Page<>(0, 10), wrapper);
+ List<Map<String, Object>> result = new ArrayList<>();
+ for (SmsCode smsCode : page.getRecords()) {
+ Map<String, Object> map = new HashMap<>();
+ map.put("id", smsCode.getId());
+ map.put("value", smsCode.getId());
+ result.add(map);
+ }
+ return R.ok(result);
+ }
+
+ @RequestMapping(value = "/smsCode/check/column/auth")
+ @ManagerAuth
+ public R query(@RequestBody JSONObject param) {
+ Wrapper<SmsCode> wrapper = new EntityWrapper<SmsCode>().eq(humpToLine(String.valueOf(param.get("key"))), param.get("val"));
+ if (null != smsCodeService.selectOne(wrapper)) {
+ return R.parse(BaseRes.REPEAT).add(getComment(SmsCode.class, String.valueOf(param.get("key"))));
+ }
+ return R.ok();
+ }
+
+ @RequestMapping("/smsCode/all/get/kv")
+ @ManagerAuth
+ public R getDataKV(@RequestParam(required = false) String condition) {
+ List<KeyValueVo> vos = new ArrayList<>();
+ Wrapper<SmsCode> wrapper = new EntityWrapper<SmsCode>().andNew().like("id", condition).orderBy("create_time", false);
+ smsCodeService.selectPage(new Page<>(1, 30), wrapper).getRecords().forEach(item -> vos.add(new KeyValueVo(String.valueOf(item.getId()), item.getId())));
+ return R.ok().add(vos);
+ }
+
+ /**
+ * 鍙戦�佺煭淇¢獙璇佺爜
+ */
+ @PostMapping("/smsCode/sendCode")
+ public R sendSmsCode(@RequestParam("phone") String phone) {
+ if (!SmsUtils.verifyPhone(phone)) {
+ return R.error("鎵嬫満鍙锋牸寮忎笉姝g‘");
+ }
+
+ SmsCode smsCode1 = smsCodeService.selectByPhone(phone);
+ if (smsCode1 != null) {
+ long createTime = smsCode1.getCreateTime().getTime();
+ long nowTime = new Date().getTime();
+ long diff = nowTime - createTime;
+ if (diff < 60000) {
+ return R.error("鍙戦�侀棿闅斾笉鑳藉皬浜�1鍒嗛挓");
+ }
+ }
+
+ boolean sendSmsCode = smsCodeService.sendSmsCode(phone);
+ if (!sendSmsCode) {
+ return R.error();
+ }
+ return R.ok();
+ }
+
+}
diff --git a/src/main/java/com/zy/crm/manager/entity/SmsCode.java b/src/main/java/com/zy/crm/manager/entity/SmsCode.java
new file mode 100644
index 0000000..9c26ea7
--- /dev/null
+++ b/src/main/java/com/zy/crm/manager/entity/SmsCode.java
@@ -0,0 +1,127 @@
+package com.zy.crm.manager.entity;
+
+import com.core.common.Cools;import com.baomidou.mybatisplus.annotations.TableId;
+import com.baomidou.mybatisplus.enums.IdType;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import com.baomidou.mybatisplus.annotations.TableField;
+import org.springframework.format.annotation.DateTimeFormat;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import com.baomidou.mybatisplus.annotations.TableName;
+import java.io.Serializable;
+
+@Data
+@TableName("sys_sms_code")
+public class SmsCode implements Serializable {
+
+ private static final long serialVersionUID = 1L;
+
+ @ApiModelProperty(value= "")
+ @TableId(value = "id", type = IdType.AUTO)
+ private Long id;
+
+ /**
+ * 鎵嬫満鍙�
+ */
+ @ApiModelProperty(value= "鎵嬫満鍙�")
+ private String phone;
+
+ /**
+ * 楠岃瘉鐮�
+ */
+ @ApiModelProperty(value= "楠岃瘉鐮�")
+ private String code;
+
+ /**
+ * 鐘舵�� 0: 鏈彂閫� 1: 宸插彂閫� 2: 宸蹭娇鐢�
+ */
+ @ApiModelProperty(value= "鐘舵�� 0: 鏈彂閫� 1: 宸插彂閫� 2: 宸蹭娇鐢� ")
+ private Integer status;
+
+ /**
+ * 鍒涘缓鏃堕棿
+ */
+ @ApiModelProperty(value= "鍒涘缓鏃堕棿")
+ @TableField("create_time")
+ @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+ private Date createTime;
+
+ /**
+ * 鍙戦�佹椂闂�
+ */
+ @ApiModelProperty(value= "鍙戦�佹椂闂�")
+ @TableField("send_time")
+ @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+ private Date sendTime;
+
+ /**
+ * 浣跨敤鏃堕棿
+ */
+ @ApiModelProperty(value= "浣跨敤鏃堕棿")
+ @TableField("use_time")
+ @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+ private Date useTime;
+
+ public SmsCode() {}
+
+ public SmsCode(String phone,String code,Integer status,Date createTime,Date sendTime,Date useTime) {
+ this.phone = phone;
+ this.code = code;
+ this.status = status;
+ this.createTime = createTime;
+ this.sendTime = sendTime;
+ this.useTime = useTime;
+ }
+
+// SmsCode smsCode = new SmsCode(
+// null, // 鎵嬫満鍙�
+// null, // 楠岃瘉鐮�
+// null, // 鐘舵��
+// null, // 鍒涘缓鏃堕棿
+// null, // 鍙戦�佹椂闂�
+// null // 浣跨敤鏃堕棿
+// );
+
+ public String getStatus$(){
+ if (null == this.status){ return null; }
+ switch (this.status){
+ case 0:
+ return "鏈彂閫�";
+ case 1:
+ return "宸插彂閫�";
+ case 2:
+ return "宸蹭娇鐢�";
+ default:
+ return String.valueOf(this.status);
+ }
+ }
+
+ public String getCreateTime$(){
+ if (Cools.isEmpty(this.createTime)){
+ return "";
+ }
+ return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.createTime);
+ }
+
+ public String getSendTime$(){
+ if (Cools.isEmpty(this.sendTime)){
+ return "";
+ }
+ return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.sendTime);
+ }
+
+ public String getUseTime$(){
+ if (Cools.isEmpty(this.useTime)){
+ return "";
+ }
+ return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.useTime);
+ }
+
+
+}
diff --git a/src/main/java/com/zy/crm/manager/mapper/SmsCodeMapper.java b/src/main/java/com/zy/crm/manager/mapper/SmsCodeMapper.java
new file mode 100644
index 0000000..5051d42
--- /dev/null
+++ b/src/main/java/com/zy/crm/manager/mapper/SmsCodeMapper.java
@@ -0,0 +1,14 @@
+package com.zy.crm.manager.mapper;
+
+import com.zy.crm.manager.entity.SmsCode;
+import com.baomidou.mybatisplus.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+import org.springframework.stereotype.Repository;
+
+@Mapper
+@Repository
+public interface SmsCodeMapper extends BaseMapper<SmsCode> {
+
+ SmsCode selectByPhone(String phone);
+
+}
diff --git a/src/main/java/com/zy/crm/manager/service/SmsCodeService.java b/src/main/java/com/zy/crm/manager/service/SmsCodeService.java
new file mode 100644
index 0000000..7afbde2
--- /dev/null
+++ b/src/main/java/com/zy/crm/manager/service/SmsCodeService.java
@@ -0,0 +1,14 @@
+package com.zy.crm.manager.service;
+
+import com.zy.crm.manager.entity.SmsCode;
+import com.baomidou.mybatisplus.service.IService;
+
+public interface SmsCodeService extends IService<SmsCode> {
+
+ SmsCode selectByPhone(String phone);
+
+ boolean sendSmsCode(String phone);
+
+ boolean verifySmsCode(String phone, String code);
+
+}
diff --git a/src/main/java/com/zy/crm/manager/service/impl/SmsCodeServiceImpl.java b/src/main/java/com/zy/crm/manager/service/impl/SmsCodeServiceImpl.java
new file mode 100644
index 0000000..571e3c7
--- /dev/null
+++ b/src/main/java/com/zy/crm/manager/service/impl/SmsCodeServiceImpl.java
@@ -0,0 +1,67 @@
+package com.zy.crm.manager.service.impl;
+
+import com.core.common.R;
+import com.zy.crm.manager.mapper.SmsCodeMapper;
+import com.zy.crm.manager.entity.SmsCode;
+import com.zy.crm.manager.service.SmsCodeService;
+import com.baomidou.mybatisplus.service.impl.ServiceImpl;
+import com.zy.crm.manager.utils.SmsUtils;
+import org.springframework.stereotype.Service;
+
+import java.util.Date;
+
+@Service("smsCodeService")
+public class SmsCodeServiceImpl extends ServiceImpl<SmsCodeMapper, SmsCode> implements SmsCodeService {
+
+ @Override
+ public SmsCode selectByPhone(String phone) {
+ return this.baseMapper.selectByPhone(phone);
+ }
+
+ @Override
+ public boolean sendSmsCode(String phone) {
+ String randomNum = SmsUtils.getRandomNum(6);//鑾峰彇鍏綅闅忔満鏁�
+ SmsCode smsCode = new SmsCode();
+ smsCode.setPhone(phone);
+ smsCode.setCode(randomNum);
+ smsCode.setStatus(0);
+ smsCode.setCreateTime(new Date());
+ if (this.baseMapper.insert(smsCode) <= 0) {
+ return false;
+ }
+
+ boolean sendSmsCode = SmsUtils.sendSmsCode(phone, smsCode.getCode());
+ if (!sendSmsCode) {
+ return false;
+ }
+
+ smsCode.setSendTime(new Date());
+ smsCode.setStatus(1);
+ this.baseMapper.updateById(smsCode);
+ return true;
+ }
+
+ @Override
+ public boolean verifySmsCode(String phone, String code) {
+ SmsCode smsCode1 = this.baseMapper.selectByPhone(phone);
+ if (smsCode1 == null) {
+ return false;
+ }
+
+ long createTime = smsCode1.getCreateTime().getTime();
+ long nowTime = new Date().getTime();
+ long diff = nowTime - createTime;
+ if (diff > (60000 * 5)) {//鐭俊鏃堕棿瓒呰繃浜斿垎閽燂紝宸插け鏁�
+ return false;
+ }
+
+ if (smsCode1.getStatus() == 2) {
+ return false;//鐭俊宸茶浣跨敤
+ }
+
+ smsCode1.setStatus(2);
+ smsCode1.setUseTime(new Date());
+ this.baseMapper.updateById(smsCode1);
+ return true;
+ }
+}
diff --git a/src/main/java/com/zy/crm/manager/utils/SmsUtils.java b/src/main/java/com/zy/crm/manager/utils/SmsUtils.java
new file mode 100644
index 0000000..390d67f
--- /dev/null
+++ b/src/main/java/com/zy/crm/manager/utils/SmsUtils.java
@@ -0,0 +1,119 @@
+package com.zy.crm.manager.utils;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.aliyun.auth.credentials.Credential;
+import com.aliyun.auth.credentials.provider.StaticCredentialProvider;
+import com.aliyun.sdk.service.dysmsapi20170525.AsyncClient;
+import com.aliyun.sdk.service.dysmsapi20170525.models.SendSmsRequest;
+import com.aliyun.sdk.service.dysmsapi20170525.models.SendSmsResponse;
+import com.aliyun.sdk.service.dysmsapi20170525.models.SendSmsResponseBody;
+import darabonba.core.client.ClientOverrideConfiguration;
+
+import java.util.HashMap;
+import java.util.Random;
+import java.util.concurrent.CompletableFuture;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+ * 鐭俊鍙戦�佸伐鍏�
+ */
+public class SmsUtils {
+
+ public static AsyncClient getClient() {
+ StaticCredentialProvider provider = StaticCredentialProvider.create(Credential.builder()
+ .accessKeyId("LTAI4GBCtqGZAn5XDEREh1Pp")
+ .accessKeySecret("SQQkh2kps3wxfbNXUg5nLZgWS2CMjm")
+ .build());
+
+ // Configure the Client
+ AsyncClient client = AsyncClient.builder()
+ //.httpClient(httpClient) // Use the configured HttpClient, otherwise use the default HttpClient (Apache HttpClient)
+ .credentialsProvider(provider)
+ //.serviceConfiguration(Configuration.create()) // Service-level configuration
+ // Client-level configuration rewrite, can set Endpoint, Http request parameters, etc.
+ .overrideConfiguration(
+ ClientOverrideConfiguration.create()
+ // Endpoint 璇峰弬鑰� https://api.aliyun.com/product/Dysmsapi
+ .setEndpointOverride("dysmsapi.aliyuncs.com")
+ //.setConnectTimeout(Duration.ofSeconds(30))
+ )
+ .build();
+
+ return client;
+ }
+
+ /**
+ * 鍙戦�佺煭淇¢獙璇佺爜
+ */
+ public static boolean sendSmsCode(String phone, String code) {
+ AsyncClient client = getClient();
+ try {
+ HashMap<String, Object> templateParam = new HashMap<>();
+ templateParam.put("code", code);
+
+ // Parameter settings for API request
+ SendSmsRequest sendSmsRequest = SendSmsRequest.builder()
+ .phoneNumbers(phone)
+ .signName("鏌愭煇鍟嗗満")
+ .templateCode("SMS_195220399")
+ .templateParam(JSON.toJSONString(templateParam))
+ // Request-level configuration rewrite, can set Http request parameters, etc.
+ // .requestConfiguration(RequestConfiguration.create().setHttpHeaders(new HttpHeaders()))
+ .build();
+
+ // Asynchronously get the return value of the API request
+ CompletableFuture<SendSmsResponse> response = client.sendSms(sendSmsRequest);
+ // Synchronously get the return value of the API request
+ SendSmsResponse resp = response.get();
+ SendSmsResponseBody body = resp.getBody();
+// System.out.println(body.getCode());
+// System.out.println(body.getMessage());
+ if (body.getCode().equals("OK")) {
+ return true;
+ }
+ return false;
+ } catch (Exception e) {
+ return false;
+ } finally {
+ // Finally, close the client
+ client.close();
+ }
+ }
+
+ /**
+ * 鑾峰彇闅忔満鏁�
+ * @param length 闅忔満鏁伴暱搴�
+ */
+ public static String getRandomNum(Integer length) {
+ Random random = new Random();
+ StringBuffer buffer = new StringBuffer();
+ for (int i = 0; i < length; i++) {
+ buffer.append(random.nextInt(10));
+ }
+ return buffer.toString();
+ }
+
+ /**
+ * 姝e垯楠岃瘉鎵嬫満鍙�
+ */
+ public static boolean verifyPhone(String phone) {
+ // 瀹氫箟鎵嬫満鍙风爜鐨勬鍒欒〃杈惧紡
+ String regex = "^1[3456789]\\d{9}$";
+ // 缂栬瘧姝e垯琛ㄨ揪寮�
+ Pattern pattern = Pattern.compile(regex);
+ // 鍒涘缓 Matcher 瀵硅薄
+ Matcher matcher = pattern.matcher(phone);
+ // 杩涜鍖归厤
+ if (!matcher.matches()) {
+ return false;
+ }
+ return true;
+ }
+
+ public static void main(String[] args) throws Exception {
+ sendSmsCode("17788886666","666666");
+ }
+
+}
diff --git a/src/main/resources/mapper/SmsCodeMapper.xml b/src/main/resources/mapper/SmsCodeMapper.xml
new file mode 100644
index 0000000..4410811
--- /dev/null
+++ b/src/main/resources/mapper/SmsCodeMapper.xml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.zy.crm.manager.mapper.SmsCodeMapper">
+
+ <!-- 閫氱敤鏌ヨ鏄犲皠缁撴灉 -->
+ <resultMap id="BaseResultMap" type="com.zy.crm.manager.entity.SmsCode">
+ <id column="id" property="id" />
+ <result column="phone" property="phone" />
+ <result column="code" property="code" />
+ <result column="status" property="status" />
+ <result column="create_time" property="createTime" />
+ <result column="send_time" property="sendTime" />
+ <result column="use_time" property="useTime" />
+
+ </resultMap>
+
+ <select id="selectByPhone" resultMap="BaseResultMap">
+ select top 1 * from sys_sms_code
+ where phone = #{phone}
+ order by create_time desc
+ </select>
+
+</mapper>
diff --git a/src/main/webapp/views/login.html b/src/main/webapp/views/login.html
index 81ab8b8..e0fb01f 100644
--- a/src/main/webapp/views/login.html
+++ b/src/main/webapp/views/login.html
@@ -76,22 +76,55 @@
<img src="../static/image/logo.png" alt="" style="width: 80%">
<span class="login100-form-title p-t-20 p-b-45">涓壃绔嬪簱</span>
<span class="login100-form-title p-t-20 p-b-45" style="margin: 15px 0;color: #868686;font-size: 24px">CRM</span>
- <div class="wrap-input100 validate-input m-b-10" data-validate="璇疯緭鍏ョ敤鎴峰悕">
- <input id="username" class="input100" type="text" name="username" placeholder="username" autocomplete="off">
- <span class="focus-input100"></span>
- <span class="symbol-input100">
+ <div id="passwdContent" style="display: none;">
+ <div class="wrap-input100 validate-input m-b-10" data-validate="璇疯緭鍏ョ敤鎴峰悕">
+ <input id="username" class="input100" type="text" name="username" placeholder="username" autocomplete="off">
+ <span class="focus-input100"></span>
+ <span class="symbol-input100">
<i class="fa fa-user"></i>
</span>
- </div>
- <div class="wrap-input100 validate-input m-b-10" data-validate="璇疯緭鍏ュ瘑鐮�">
- <input id="password" class="input100" type="password" name="pass" placeholder="password">
- <span class="focus-input100"></span>
- <span class="symbol-input100">
+ </div>
+ <div class="wrap-input100 validate-input m-b-10" data-validate="璇疯緭鍏ュ瘑鐮�">
+ <input id="password" class="input100" type="password" name="pass" placeholder="password">
+ <span class="focus-input100"></span>
+ <span class="symbol-input100">
<i class="fa fa-lock"></i>
</span>
+ </div>
+ <div style="text-align: right;">
+ <button onclick="switchLogin('sms')">鐭俊鐧诲綍</button>
+ </div>
+ <div class="container-login100-form-btn p-t-10">
+ <button id="passLogin" class="login100-form-btn login-btn">Login</button>
+ </div>
</div>
- <div class="container-login100-form-btn p-t-10">
- <button class="login100-form-btn login-btn">Login</button>
+ <div id="smsContent">
+ <div class="wrap-input100 validate-input m-b-10" data-validate="璇疯緭鍏ユ墜鏈哄彿">
+ <input id="phone" class="input100" type="text" name="phone" placeholder="鎵嬫満鍙�" autocomplete="off">
+ <span class="focus-input100"></span>
+ <span class="symbol-input100">
+ <i class="fa fa-user"></i>
+ </span>
+ </div>
+ <div style="display: flex;justify-content: center;align-items: center;">
+ <div class="wrap-input100 validate-input m-b-10" style="width: 60%" data-validate="璇疯緭鍏ラ獙璇佺爜">
+ <input id="code" class="input100" type="text" name="code" placeholder="楠岃瘉鐮�">
+ <span class="focus-input100"></span>
+ <span class="symbol-input100">
+ <i class="fa fa-lock"></i>
+ </span>
+ </div>
+ <div style="width: 20%;">
+ <div id="getCodeBox"><button onclick="getCode()">鑾峰彇楠岃瘉鐮�</button></div>
+ <div id="getCodeTime"></div>
+ </div>
+ </div>
+ <div style="text-align: right;">
+ <button onclick="switchLogin('password')">瀵嗙爜鐧诲綍</button>
+ </div>
+ <div class="container-login100-form-btn p-t-10">
+ <button id="smsLogin" class="login100-form-btn login-btn">Login</button>
+ </div>
</div>
</div>
</div>
@@ -106,7 +139,7 @@
console.log('%c CRM %c 1.0.0','background-color:rgb(53,73,94);color: #fff;border-radius:2px 0 0 2px;padding:2px 4px;','background-color:rgb(25,190,107);color: #fff;border-radius:0 2px 2px 0;padding:2px 4px;font: 9pt "Apercu Regular", Georgia, "Times New Roman", Times, serif;');
window.onload = function(){document.getElementById("username").focus();}
- $(document).on('click','.login-btn', function () {
+ $(document).on('click','#passLogin', function () {
let username = $("#username").val();
if (username === "") {
layer.tips('璇疯緭鍏ョ櫥褰曡处鍙�', '#username', {tips: [4, '#ff0000']});
@@ -136,7 +169,41 @@
} else if (res.code === 10003) {
layer.tips(res.msg, '#password', {tips: [4, '#ff0000']});
} else {
- layer.tips(res.msg, '.login-btn', {tips: [3, '#ff0000']});
+ layer.tips(res.msg, '#passLogin', {tips: [3, '#ff0000']});
+ }
+ }
+ });
+ });
+
+ $(document).on('click','#smsLogin', function () {
+ let phone = $("#phone").val();
+ if (phone === "") {
+ layer.tips('璇疯緭鍏ユ墜鏈哄彿', '#phone', {tips: [4, '#ff0000']});
+ return;
+ }
+ let code = $("#code").val();
+ if (code === "") {
+ layer.tips('璇疯緭鍏ラ獙璇佺爜', '#code', {tips: [4, '#ff0000']});
+ return;
+ }
+ $.ajax({
+ url: baseUrl+"/smsLogin.action",
+ data: {
+ phone: phone,
+ code: code
+ },
+ method: 'POST',
+ success: function (res) {
+ if (res.code === 200){
+ localStorage.setItem("token", res.data.token);
+ localStorage.setItem("nickname", res.data.nickname);
+ window.location.href = "index.html";
+ } else if (res.code === 10001) {
+ layer.tips(res.msg, '#phone', {tips: [4, '#ff0000']});
+ } else if (res.code === 10002) {
+ layer.tips(res.msg, '#phone', {tips: [4, '#ff0000']});
+ } else {
+ layer.tips(res.msg, '#smsLogin', {tips: [3, '#ff0000']});
}
}
});
@@ -147,6 +214,55 @@
$(".login-btn").click();
}
});
+
+ function switchLogin(type) {
+ if(type === 'sms'){
+ //鐭俊鐧诲綍
+ $("#passwdContent").hide()
+ $("#smsContent").show()
+ }else {
+ //瀵嗙爜鐧诲綍
+ $("#passwdContent").show()
+ $("#smsContent").hide()
+ }
+ }
+
+ function getCode() {
+ //鑾峰彇楠岃瘉鐮�
+ let phone = $("#phone").val();
+ if (phone === "") {
+ layer.tips('璇疯緭鍏ユ墜鏈哄彿', '#phone', {tips: [4, '#ff0000']});
+ return;
+ }
+
+ $.ajax({
+ url: baseUrl+"/smsCode/sendCode",
+ data: {
+ phone: phone
+ },
+ method: 'POST',
+ success: function (res) {
+ if (res.code === 200){
+ $("#getCodeBox").hide()
+ $("#getCodeTime").show()
+ let tmp = null;
+ let time = 60
+ tmp = setInterval(() => {
+ if (time <= 0) {
+ $("#getCodeTime").hide()
+ $("#getCodeBox").show()
+ clearInterval(tmp)
+ }else {
+ $("#getCodeTime").text(time + "绉�")
+ time--;
+ }
+ },1000)
+ } else {
+ layer.tips(res.msg, '#getCodeBox', {tips: [3, '#ff0000']});
+ }
+ }
+ });
+ }
</script>
</body>
</html>
--
Gitblit v1.9.1