TRX hace 1 año
padre
commit
12782146f8

+ 32 - 5
src/main/java/com/zswl/dataservice/config/SwaggerConfig.java

@@ -1,14 +1,24 @@
 package com.zswl.dataservice.config;
 
+import com.beust.jcommander.internal.Lists;
 import com.github.xiaoymin.knife4j.spring.annotations.EnableKnife4j;
+import io.swagger.v3.oas.models.Components;
 import io.swagger.v3.oas.models.ExternalDocumentation;
 import io.swagger.v3.oas.models.info.Contact;
 import io.swagger.v3.oas.models.OpenAPI;
 import io.swagger.v3.oas.models.info.Info;
+import io.swagger.v3.oas.models.parameters.HeaderParameter;
+import io.swagger.v3.oas.models.security.SecurityRequirement;
+import io.swagger.v3.oas.models.security.SecurityScheme;
 import lombok.extern.java.Log;
+import org.springdoc.core.customizers.GlobalOpenApiCustomizer;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
+import org.springframework.http.HttpHeaders;
+
+import java.util.List;
+import java.util.stream.Collectors;
 
 /**
  *
@@ -23,7 +33,17 @@ public class SwaggerConfig {
 
     @Bean
     public OpenAPI springShopOpenAPI() {
-        return new OpenAPI()
+
+        // 创建一个HeaderParameter对象
+        HeaderParameter headerParameter = new HeaderParameter();
+        headerParameter.setName("accessToken");
+        headerParameter.setDescription("accessToken");
+        headerParameter.setRequired(false);
+        Components components = new Components();
+        components.addParameters("accessToken", headerParameter);
+        String accessToken = "accessToken";
+
+        OpenAPI openAPI = new OpenAPI()
                 // 接口文档标题
                 .info(new Info().title("物联网平台API接口文档")
                         // 接口文档简介
@@ -31,11 +51,18 @@ public class SwaggerConfig {
                         // 接口文档版本
                         .version("v1.0")
                         // 开发者联系方式
-                        .contact(new Contact().url("").name("RTX").email("315146153@qq.com")))
+                        .contact(new Contact().url("").name("RTX").email("315146153@qq.com"))
+                )
                 .externalDocs(new ExternalDocumentation()
                         .description("物联网平台")
-                        .url("http://127.0.0.1:8081"));
-
+                        .url("http://127.0.0.1:8081"))
+                .addSecurityItem(new SecurityRequirement().addList(accessToken))
+//                .components(new Components().addSecuritySchemes(
+//                        accessToken, new SecurityScheme()
+//                        .name(accessToken).in(SecurityScheme.In.HEADER)
+//                                .scheme("accessToken")))
+                .components(components)
+                ;
+        return openAPI;
     }
-
 }

+ 1 - 10
src/main/java/com/zswl/dataservice/controller/TestController.java

@@ -28,17 +28,8 @@ public class TestController {
     @Autowired
     UserService userService;
 
-    @Operation(summary = "测试添加用户接口")
-    @RequestMapping(value = "free/test", method = {RequestMethod.GET})
-    public ResultContent test(@Parameter(name = "name", description = "名称") String name) {
-        Map map = new HashMap();
-        map.put("obj", name);
-        map.put("time", System.currentTimeMillis());
-        return userService.addUser(name);
-    }
-
     @Operation(summary = "发送指令")
-    @RequestMapping(value = "free/sendMessage", method = {RequestMethod.POST})
+    @RequestMapping(value = "sendMessage", method = {RequestMethod.POST})
     public ResultContent sendMessage(@RequestBody SendMessageModel param) {
         return userService.sendMessage(param);
     }

+ 13 - 22
src/main/java/com/zswl/dataservice/controller/user/UserController.java

@@ -3,10 +3,13 @@ package com.zswl.dataservice.controller.user;
 import com.zswl.dataservice.model.mqtt.DeviceInfoAddParam;
 import com.zswl.dataservice.model.mqtt.DeviceInfoModel;
 import com.zswl.dataservice.model.mqtt.DeviceInfoSearchParam;
+import com.zswl.dataservice.model.user.UpdateUserPassWordParam;
 import com.zswl.dataservice.service.mqtt.DeviceInfoService;
+import com.zswl.dataservice.service.user.UserService;
 import com.zswl.dataservice.utils.result.ResultContent;
 import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.enums.ParameterIn;
 import io.swagger.v3.oas.annotations.tags.Tag;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.domain.Page;
@@ -34,29 +37,17 @@ public class UserController {
     @Autowired
     DeviceInfoService deviceInfoService;
 
-    @Operation(summary = "添加设备")
-    @RequestMapping(value = "addDeviceInfo", method = {RequestMethod.POST})
-    public ResultContent addDeviceInfo(@RequestBody DeviceInfoAddParam param) {
-        Assert.hasText(param.getDeviceId(), "设备ID不能为空");
-        Assert.hasText(param.getDeviceName(), "设备名称不能为空");
-        return deviceInfoService.addDeviceInfo(param);
-    }
-
-    @Operation(summary = "设备列表-分页查询")
-    @RequestMapping(value = {"pageActivity"}, method = {RequestMethod.POST})
-    public ResultContent<Page<DeviceInfoModel>> pageActivity(@Parameter(hidden = true) @PageableDefault(page = 0, size = 10) Pageable pageable, @Parameter(required = false) DeviceInfoSearchParam param) {
-        return deviceInfoService.pageDevice(pageable, param);
-    }
+    @Autowired
+    UserService userService;
 
-    @Operation(summary = "删除设备")
-    @RequestMapping(value = "deleteDeviceInfo", method = {RequestMethod.GET})
-    public ResultContent deleteDeviceInfo(String deviceId) {
-        return deviceInfoService.deleteDeviceInfo(deviceId);
+    @Parameter(in = ParameterIn.HEADER, name = "accessToken", required = false, description = "accessToken")
+    @Operation(summary = "修改当前用户密码", description = "")
+    @RequestMapping(value = "updateUserPassWord", method = {RequestMethod.POST})
+    public ResultContent updateUserPassWord(@RequestBody UpdateUserPassWordParam param) {
+        Assert.hasText(param.getOldPass(), "原密码不能为空");
+        Assert.hasText(param.getPassWord(), "密码不能为空");
+        Assert.hasText(param.getConfirmPass(), "验证密码不能为空");
+        return userService.updateUserPassWord(param);
     }
 
-    @Operation(summary = "查询设备")
-    @RequestMapping(value = "getDeviceById", method = {RequestMethod.GET})
-    public ResultContent<DeviceInfoModel> getDeviceById(String deviceId) {
-        return deviceInfoService.getDeviceById(deviceId);
-    }
 }

+ 120 - 0
src/main/java/com/zswl/dataservice/dataConfig/PasswordCheckConf.java

@@ -0,0 +1,120 @@
+package com.zswl.dataservice.dataConfig;
+
+public class PasswordCheckConf {
+
+    /*
+     * 是否检测密码口令长度
+     */
+    public static String CHECK_PASSWORD_LENGTH = "enable";
+
+    /**
+     * 密码最小长度,默认为6
+     */
+    public static String MIN_LENGTH = "6";
+
+    /**
+     * 密码最大长度,默认为20
+     */
+    public static String MAX_LENGTH = "20";
+
+    /**
+     * 是否包含数字
+     */
+    public static String CHECK_CONTAIN_DIGIT = "disable";
+
+    /**
+     * 是否包含字母
+     */
+    public static String CHECK_CONTAIN_CASE = "disable";
+
+    /**
+     * 是否区分大小写
+     */
+    public static String CHECK_DISTINGGUISH_CASE = "disable";
+
+    /**
+     * 是否包含小写字母
+     */
+    public static String CHECK_LOWER_CASE = "disable";
+
+    /**
+     * 是否包含大学字母
+     */
+    public static String CHECK_UPPER_CASE = "disable";
+
+    /**
+     * 是否包含特殊符号
+     */
+    public static String CHECK_CONTAIN_SPECIAL_CHAR = "disable";
+
+    /**
+     * 特殊符号集合
+     */
+    public static String SPECIAL_CHAR = "!\\\"#$%&'()*+,-./:;<=>?@[\\\\]^_`{}~";
+
+    /**
+     * 是否检测键盘按键横向连续
+     */
+    public static String CHECK_HORIZONTAL_KEY_SEQUENTIAL = "enable";
+
+    /**
+     * 键盘物理位置横向不允许最小的连续个数
+     */
+    public static String LIMIT_HORIZONTAL_NUM_KEY = "4";
+
+    /**
+     * 是否检测键盘按键斜向连续
+     */
+    public static String CHECK_SLOPE_KEY_SEQUENTIAL = "enable";
+
+    /**
+     * 键盘物理位置斜向不允许最小的连续个数
+     */
+    public static String LIMIT_SLOPE_NUM_KEY = "4";
+
+    /**
+     * 是否检测逻辑位置连续
+     */
+    public static String CHECK_LOGIC_SEQUENTIAL = "enable";
+    /**
+     * 密码口令中字符在逻辑位置上不允许最小的连续个数
+     */
+    public static String LIMIT_LOGIC_NUM_CHAR = "6";
+
+    /**
+     * 是否检测连续字符相同
+     */
+    public static String CHECK_SEQUENTIAL_CHAR_SAME = "enable";
+    /**
+     * 密码口令中相同字符不允许最小的连续个数
+     */
+    public static String LIMIT_NUM_SAME_CHAR = "3";
+
+    /**
+     * 键盘横向方向规则
+     */
+    public static String[] KEYBOARD_HORIZONTAL_ARR = { "01234567890", "qwertyuiop", "asdfghjkl", "zxcvbnm", };
+    /**
+     * 键盘斜线方向规则
+     */
+    public static String[] KEYBOARD_SLOPE_ARR = { "1qaz", "2wsx", "3edc", "4rfv", "5tgb", "6yhn", "7ujm", "8ik,",
+            "9ol.", "0p;/", "=[;.", "-pl,", "0okm", "9ijn", "8uhb", "7ygv", "6tfc", "5rdx", "4esz" };
+
+    /**
+     * 是否检测常用词库
+     */
+    public static String CHECK_SIMPLE_WORD = "enable";
+
+    /**
+     * 常用词库
+     */
+    public static String[] SIMPLE_WORDS = { "admin", "szim", "epicrouter", "password", "grouter", "dare", "root",
+            "guest", "user", "success", "pussy", "mustang", "fuckme", "jordan", "test", "hunter", "jennifer", "batman",
+            "thomas", "soccer", "sexy", "killer", "george", "asshole", "fuckyou", "summer", "hello", "secret", "fucker",
+            "enter", "cookie", "administrator",
+            // 中国网民常用密码
+            "xiaoming", "taobao", "iloveyou", "woaini", "982464",
+            // 国外网民常用密码
+            "monkey", "letmein", "trustno1", "dragon", "baseball", "master", "sunshine", "ashley", "bailey", "shadow",
+            "superman", "football", "michael", "qazwsx" };
+}

+ 24 - 0
src/main/java/com/zswl/dataservice/model/user/UpdateUserPassWordParam.java

@@ -0,0 +1,24 @@
+package com.zswl.dataservice.model.user;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * @author TRX
+ * @date 2024/6/18
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class UpdateUserPassWordParam {
+    @Schema(description = "原密码")
+    private String oldPass;
+
+    @Schema(description = "密码")
+    private String passWord;
+
+    @Schema(description = "验证密码")
+    private String confirmPass;
+}

+ 17 - 0
src/main/java/com/zswl/dataservice/service/base/SuperService.java

@@ -16,6 +16,11 @@ public abstract class SuperService {
     @Autowired
     private UserDao userDao;
 
+    /**
+     * 得到当前用户对象
+     *
+     * @return
+     */
     public User getCrrentUser() {
         if (UserContext.currentUser() != null) {
             String uid = UserContext.currentUser().getId();
@@ -23,4 +28,16 @@ public abstract class SuperService {
         }
         return null;
     }
+
+    /**
+     * 得到当前用户ID
+     *
+     * @return
+     */
+    public String getCurrentUserId() {
+        if (UserContext.currentUser() != null) {
+            return UserContext.currentUser().getId();
+        }
+        return null;
+    }
 }

+ 34 - 21
src/main/java/com/zswl/dataservice/service/user/UserService.java

@@ -6,11 +6,15 @@ import com.zswl.dataservice.config.SystemDefaultConfig;
 import com.zswl.dataservice.dao.UserDao;
 import com.zswl.dataservice.domain.user.User;
 import com.zswl.dataservice.model.mqtt.SendMessageModel;
+import com.zswl.dataservice.model.user.UpdateUserPassWordParam;
 import com.zswl.dataservice.service.base.RedisService;
+import com.zswl.dataservice.service.base.SuperService;
 import com.zswl.dataservice.type.ResultState;
 import com.zswl.dataservice.type.UserState;
 import com.zswl.dataservice.type.UserType;
 import com.zswl.dataservice.utils.DateUtils;
+import com.zswl.dataservice.utils.ValidateResult;
+import com.zswl.dataservice.utils.ValidateUtils;
 import com.zswl.dataservice.utils.mqtt.mqttConfig.client.MQClient;
 import com.zswl.dataservice.utils.mqtt.mqttConfig.constant.MQConstant;
 import com.zswl.dataservice.utils.result.ResultContent;
@@ -34,7 +38,7 @@ import java.util.UUID;
  */
 @Slf4j
 @Service
-public class UserService {
+public class UserService extends SuperService {
     @Autowired
     UserDao userDao;
 
@@ -72,9 +76,35 @@ public class UserService {
         return ResultContent.buildSuccess();
     }
 
-
-    public ResultContent updateUserPassWord() {
-
+    /**
+     * 编辑当前用户密码
+     *
+     * @param param
+     * @return
+     */
+    public ResultContent updateUserPassWord(UpdateUserPassWordParam param) {
+        PasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
+        String userId = getCurrentUserId();
+        User user = userDao.findTopById(userId);
+        if (ObjectUtils.isEmpty(user)) {
+            return ResultContent.buildFail("当前用户信息为空");
+        }
+        if (!param.getConfirmPass().equals(param.getPassWord())) {
+            return ResultContent.buildFail("密码和验证密码不一致");
+        }
+        if (param.getOldPass().equals(param.getPassWord())) {
+            return ResultContent.buildFail("原密码和密码不能一致");
+        }
+        ValidateResult validateResult = ValidateUtils.validatePassWord(param.getPassWord());
+        if (!validateResult.isSuccess()) {
+            return ResultContent.buildFail(validateResult.getMsg());
+        }
+        ResultContent resultContent = checkLoginPassword(userId, param.getOldPass());
+        if (resultContent.isFailed()) {
+            return resultContent;
+        }
+        user.setPassWord(passwordEncoder.encode(param.getPassWord()));
+        userDao.save(user);
         return ResultContent.buildSuccess();
     }
 
@@ -94,23 +124,6 @@ public class UserService {
         return ResultContent.build(passwordEncoder.matches(passWord, user.getPassWord()) ? ResultState.Success : ResultState.UserPasswordError);
     }
 
-    public ResultContent addUser(String name) {
-        try {
-            String msg = "消息:" + Math.random();
-            JsonObject jsonObject = new JsonObject();
-            jsonObject.addProperty("id", UUID.randomUUID().toString());
-            jsonObject.addProperty("data", msg);
-            jsonObject.addProperty("time", DateUtils.paresTime(System.currentTimeMillis(), DateUtils.patternyyyySSS));
-            jsonObject.addProperty("ttl", 10 * 1000);
-            mqClient.sendObject("v1.1", jsonObject.toString());
-            log.info("mqtt msg 发送成功");
-        } catch (Exception e) {
-            e.printStackTrace();
-        }
-
-        return ResultContent.buildSuccess(name);
-    }
-
     /**
      * 发送指令
      *

+ 19 - 0
src/main/java/com/zswl/dataservice/utils/ValidateResult.java

@@ -0,0 +1,19 @@
+package com.zswl.dataservice.utils;
+
+import lombok.Data;
+
+/**
+ * @author TRX
+ * @date 2024/6/4
+ */
+@Data
+public class ValidateResult {
+    /**
+     * 是否验证成功
+     */
+    private boolean isSuccess = false;
+    /**
+     * 匹配找出的字符串
+     */
+    private String msg = "";
+}

+ 112 - 0
src/main/java/com/zswl/dataservice/utils/ValidateUtils.java

@@ -0,0 +1,112 @@
+package com.zswl.dataservice.utils;
+
+import com.zswl.dataservice.dataConfig.PasswordCheckConf;
+import org.apache.commons.lang3.StringUtils;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+/**
+ * 验证工具类
+ *
+ * @author TRX
+ * @date 2024/6/4
+ */
+public class ValidateUtils {
+
+    /**
+     * 验证是否是手机号码
+     *
+     * @param phoneNumber
+     * @return
+     */
+    public static boolean isPhoneNumber(String phoneNumber) {
+        Pattern pattern = Pattern.compile("^1[0-9]{10}$");
+        // 使用模式匹配手机号码
+        Matcher matcher = pattern.matcher(phoneNumber);
+        return matcher.matches();
+    }
+
+    /**
+     * 判断是否是身份证号码
+     *
+     * @param idCard
+     * @return
+     */
+    public static boolean isIDCard(String idCard) {
+        if (StringUtils.isNotEmpty(idCard) && idCard.trim().length() == 18) {
+            return true;
+        }
+        return false;
+    }
+
+    /**
+     * 验证是否有特殊支付 (有一个就是true)
+     *
+     * @param str
+     * @return
+     */
+    public static ValidateResult isContainsSpecial(String str) {
+        ValidateResult result = new ValidateResult();
+        String validPattern = "[`~!@#$%^&*()+=|{}':;',\\[\\].<>/?~!@#¥%……&*()——+|{}【】‘;:”“’。,、?\\s]";
+        Pattern pattern = Pattern.compile(validPattern);
+        Matcher matcher = pattern.matcher(str);
+        StringBuilder specialChars = new StringBuilder();
+        while (matcher.find()) {
+            result.setSuccess(true);
+            specialChars.append(matcher.group());
+        }
+        result.setMsg(specialChars.toString());
+        return result;
+    }
+
+    /**
+     * 是否包含汉字 (有一个就是true)
+     *
+     * @param str
+     * @return
+     */
+    public static ValidateResult isContainsChinese(String str) {
+        ValidateResult result = new ValidateResult();
+        Pattern pattern = Pattern.compile("[\u4E00-\u9FA5]");
+        Matcher matcher = pattern.matcher(str);
+        StringBuilder specialChars = new StringBuilder();
+        while (matcher.find()) {
+            result.setSuccess(true);
+            specialChars.append(matcher.group());
+        }
+        result.setMsg(specialChars.toString());
+        return result;
+    }
+
+    /**
+     * 验证密码是否符合要求
+     *
+     * @param passWord
+     * @return
+     */
+    public static ValidateResult validatePassWord(String passWord) {
+        ValidateResult result = new ValidateResult();
+        result.setSuccess(true);
+        if (StringUtils.isEmpty(passWord)) {
+            result.setSuccess(false);
+            result.setMsg("密码不能为空");
+        } else {
+            if (passWord.length() < Integer.parseInt(PasswordCheckConf.MIN_LENGTH)
+                    || passWord.length() > Integer.parseInt(PasswordCheckConf.MAX_LENGTH)) {
+                result.setSuccess(false);
+                result.setMsg(String.format("密码长度必须大于%s位,小于%s位", PasswordCheckConf.MIN_LENGTH, PasswordCheckConf.MAX_LENGTH));
+            }
+            if (result.isSuccess()) {
+                // 是否包含汉字
+                ValidateResult validateResult = isContainsChinese(passWord);
+                if (validateResult.isSuccess()) {
+                    result.setSuccess(false);
+                    result.setMsg(String.format("密码不能包含汉字:%s", validateResult.getMsg()));
+                }
+            }
+        }
+        return result;
+    }
+
+}