فهرست منبع

新增参数增删改查

xusl 2 سال پیش
والد
کامیت
2c20272687

+ 167 - 0
backend/src/main/java/com/jiayue/ssi/controller/SysParameterController.java

@@ -0,0 +1,167 @@
+package com.jiayue.ssi.controller;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.jiayue.ssi.annotation.InterfaceLimit;
+import com.jiayue.ssi.entity.SysParameter;
+import com.jiayue.ssi.service.SysParameterService;
+import com.jiayue.ssi.util.ResponseVO;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import lombok.extern.slf4j.Slf4j;
+
+/**
+ * 系统参数接口
+ *
+ * @author xsl
+ * @since 2023/03/20
+ */
+@RestController
+@RequestMapping(value = "sysParameterController")
+@Slf4j
+public class SysParameterController {
+    @Autowired
+    SysParameterService sysParameterService;
+
+    /**
+     * 新增系统参数
+     *
+     * @param sysParameter 参数
+     * @return 执行结果
+     */
+    @InterfaceLimit
+    @PostMapping()
+    public ResponseVO add(@RequestBody SysParameter sysParameter) {
+        if (StringUtils.isEmpty(sysParameter.getSysKey())) {
+            return ResponseVO.fail("参数名不能为空!");
+        } else if (!"null".equals(sysParameterService.queryByKey(sysParameter.getSysKey(), "null"))) {
+            return ResponseVO.fail(sysParameter.getSysKey() + "参数名已存在!");
+        } else if (sysParameter.getSysKey().length() > 50) {
+            return ResponseVO.fail("参数名长度不能超过50个字符!");
+        }
+
+        if (StringUtils.isEmpty(sysParameter.getSysValue())) {
+            return ResponseVO.fail("参数值不能为空!");
+        } else if (sysParameter.getSysValue().length() > 50) {
+            return ResponseVO.fail("参数值长度不能超过50个字符!");
+        }
+
+        if (StringUtils.isEmpty(sysParameter.getSysDescribe())) {
+            return ResponseVO.fail("参数描述不能为空!");
+        } else if (sysParameter.getSysDescribe().length() > 200) {
+            return ResponseVO.fail("参数描述长度不能超过200个字符!");
+        }
+
+        try {
+            boolean bo = sysParameterService.save(sysParameter);
+            if (bo) {
+                return ResponseVO.success("添加参数信息成功");
+            } else {
+                log.error("添加参数信息失败");
+                return ResponseVO.fail("添加参数信息失败");
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+            log.error("添加参数信息异常");
+            return ResponseVO.error(e);
+        }
+    }
+
+    /**
+     * 更新系统参数
+     *
+     * @param sysParameter 参数
+     * @return 执行结果
+     */
+    @PutMapping
+    public ResponseVO update(@RequestBody SysParameter sysParameter) {
+        SysParameter existSysParameter = sysParameterService.getById(sysParameter.getId());
+        if (existSysParameter == null) {
+            return ResponseVO.fail("非法访问不能修改!");
+        }
+
+        if (StringUtils.isEmpty(sysParameter.getSysKey())) {
+            return ResponseVO.fail("参数名不能为空!");
+        } else if (sysParameter.getSysKey().length() > 50) {
+            return ResponseVO.fail("参数名长度不能超过50个字符!");
+        } else if (!existSysParameter.getSysKey().equals(sysParameter.getSysKey())) {
+            if (!"null".equals(sysParameterService.queryByKey(sysParameter.getSysKey(), "null"))) {
+                return ResponseVO.fail(sysParameter.getSysKey() + "参数名已存在!");
+            }
+        }
+
+        if (StringUtils.isEmpty(sysParameter.getSysValue())) {
+            return ResponseVO.fail("参数值不能为空!");
+        } else if (sysParameter.getSysValue().length() > 50) {
+            return ResponseVO.fail("参数值长度不能超过50个字符!");
+        }
+
+        if (StringUtils.isEmpty(sysParameter.getSysDescribe())) {
+            return ResponseVO.fail("参数描述不能为空!");
+        } else if (sysParameter.getSysDescribe().length() > 200) {
+            return ResponseVO.fail("参数描述长度不能超过200个字符!");
+        }
+
+        try {
+            boolean bo = sysParameterService.updateById(sysParameter);
+            if (bo) {
+                return ResponseVO.success("修改参数信息成功");
+            } else {
+                log.error("修改参数信息失败");
+                return ResponseVO.fail("修改参数信息失败");
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+            log.error("修改参数信息异常");
+            return ResponseVO.error(e);
+        }
+    }
+
+    /**
+     * 删除用户信息
+     */
+    @DeleteMapping
+    @InterfaceLimit
+    public ResponseVO delete(String id) {
+        if (StringUtils.isEmpty(id)) {
+            return ResponseVO.fail("id不能为空!");
+        }
+        try {
+            boolean bo = sysParameterService.removeById(Integer.parseInt(id));
+            if (bo) {
+                return ResponseVO.success("删除参数信息成功");
+            } else {
+                log.error("删除用户信息失败");
+                return ResponseVO.fail("删除参数信息失败");
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+            log.error("删除参数信息异常");
+            return ResponseVO.error(e);
+        }
+    }
+
+    /**
+     * 获取参数分页信息
+     *
+     * @return 参数信息
+     */
+    @GetMapping(value = "/getAll")
+    @InterfaceLimit
+    public ResponseVO getAll(Integer currentPage, Integer pageSize, String keywords) {
+        try {
+            QueryWrapper<SysParameter> wrapper = new QueryWrapper<>();
+            if (StringUtils.isNotEmpty(keywords)) {
+                wrapper.like("sys_describe", keywords);
+            }
+            Page<SysParameter> result = sysParameterService.page(new Page<>(currentPage, pageSize), wrapper);
+            return ResponseVO.success(result);
+        } catch (Exception e) {
+            e.printStackTrace();
+            log.error("获取参数异常");
+            return ResponseVO.error(null);
+        }
+    }
+}

+ 68 - 85
backend/src/main/java/com/jiayue/ssi/controller/SysUserController.java

@@ -1,11 +1,8 @@
 package com.jiayue.ssi.controller;
 
 import cn.hutool.core.lang.Validator;
-import cn.hutool.core.text.PasswdStrength;
 import cn.hutool.crypto.SmUtil;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
-import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
-import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.jiayue.ssi.annotation.InterfaceLimit;
 import com.jiayue.ssi.config.SendMailUtil;
@@ -19,13 +16,13 @@ import org.springframework.web.bind.annotation.*;
 import java.util.Date;
 
 /**
- * 用户信息controller
+ * 用户信息接口
  *
  * @author xsl
- * @version 3.0
+ * @since 2023/03/13
  */
 @RestController
-@RequestMapping("/sysUserController" )
+@RequestMapping("/sysUserController")
 @Slf4j
 public class SysUserController {
     @Autowired
@@ -40,19 +37,20 @@ public class SysUserController {
      */
     @GetMapping(value = "/getAll")
     @InterfaceLimit
-    public ResponseVO getAll(Integer currentPage, Integer pageSize, String username,String phonenumber,String status) {
+    public ResponseVO getAll(Integer currentPage, Integer pageSize, String username, String phonenumber,
+        String status) {
         try {
             QueryWrapper<SysUser> wrapper = new QueryWrapper<>();
-            if(StringUtils.isNotEmpty(username)){
-                wrapper.eq("username",username);
+            if (StringUtils.isNotEmpty(username)) {
+                wrapper.eq("username", username);
             }
-            if(StringUtils.isNotEmpty(phonenumber)){
-                wrapper.eq("phonenumber",phonenumber);
+            if (StringUtils.isNotEmpty(phonenumber)) {
+                wrapper.eq("phonenumber", phonenumber);
             }
-            if(StringUtils.isNotEmpty(status)){
-                wrapper.eq("status",status);
+            if (StringUtils.isNotEmpty(status)) {
+                wrapper.eq("status", status);
             }
-            Page<SysUser> result = sysUserService.page(new Page<>(currentPage,pageSize),wrapper);
+            Page<SysUser> result = sysUserService.page(new Page<>(currentPage, pageSize), wrapper);
             return ResponseVO.success(result);
         } catch (Exception e) {
             e.printStackTrace();
@@ -60,6 +58,7 @@ public class SysUserController {
             return ResponseVO.error(null);
         }
     }
+
     /**
      * 获取当前用户信息
      *
@@ -84,53 +83,47 @@ public class SysUserController {
     @PostMapping
     @InterfaceLimit
     public ResponseVO add(@RequestBody SysUser user) {
-        if (StringUtils.isEmpty(user.getUsername())){
+        if (StringUtils.isEmpty(user.getUsername())) {
             return ResponseVO.fail("用户账号不能为空!");
-        }
-        else if (sysUserService.queryUserName(user.getUsername())!=null){
+        } else if (sysUserService.queryUserName(user.getUsername()) != null) {
             return ResponseVO.fail(user.getUsername() + "账号已存在!");
-        }
-        else if (user.getUsername().length()<5 || user.getUsername().length()>20){
+        } else if (user.getUsername().length() < 5 || user.getUsername().length() > 20) {
             return ResponseVO.fail(user.getUsername() + "用户账号长度必须介于5和20之间!");
         }
 
         if (StringUtils.isEmpty(user.getPhonenumber())) {
             return ResponseVO.fail("手机号码不能为空!");
-        }
-        else if (!Validator.isMobile(user.getPhonenumber())){
+        } else if (!Validator.isMobile(user.getPhonenumber())) {
             return ResponseVO.fail("请输入正确的手机号码!");
         }
 
         if (StringUtils.isEmpty(user.getNickname())) {
             return ResponseVO.fail("姓名不能为空!");
-        }
-        else if (user.getNickname().length()>30){
+        } else if (user.getNickname().length() > 30) {
             return ResponseVO.fail("姓名长度不能超过30个字符!");
         }
 
-        if (StringUtils.isEmpty(user.getMailbox())){
+        if (StringUtils.isEmpty(user.getMailbox())) {
             return ResponseVO.fail("邮箱不能为空!");
-        }
-        else if (!Validator.isEmail(user.getMailbox())){
+        } else if (!Validator.isEmail(user.getMailbox())) {
             return ResponseVO.fail("请输入正确的邮箱地址!");
-        }
-        else if (user.getMailbox().length()>50){
+        } else if (user.getMailbox().length() > 50) {
             return ResponseVO.fail("邮箱长度不能超过50个字符!");
-        }
-        else if (sysUserService.queryMailBox(user.getMailbox())!=null){
+        } else if (sysUserService.queryMailBox(user.getMailbox()) != null) {
             return ResponseVO.fail(user.getMailbox() + "邮箱已存在!");
         }
 
         // 生成8位初始密码
         String randomPwd = RandomPwd.getRandomPwd(8);
         user.setPassword(SmUtil.sm3(randomPwd).toUpperCase());
+        user.setErrNum(0);
+        user.setLockTime(0L);
 
         try {
             boolean bo = sysUserService.save(user);
-            if (bo){
+            if (bo) {
                 return ResponseVO.success("添加用户信息成功");
-            }
-            else{
+            } else {
                 log.error("添加用户信息失败");
                 return ResponseVO.fail("添加用户信息失败");
             }
@@ -150,57 +143,53 @@ public class SysUserController {
     @PutMapping
     public ResponseVO update(@RequestBody SysUser user) {
         SysUser existUser = sysUserService.getById(user.getId());
-        if (existUser==null){
+        if (existUser == null) {
             return ResponseVO.fail("非法访问不能修改!");
         }
 
-        if (StringUtils.isEmpty(user.getUsername())){
+        if (StringUtils.isEmpty(user.getUsername())) {
             return ResponseVO.fail("用户账号不能为空!");
-        }
-        else if (user.getUsername().length()<5 || user.getUsername().length()>20){
+        } else if (user.getUsername().length() < 5 || user.getUsername().length() > 20) {
             return ResponseVO.fail(user.getUsername() + "用户账号长度必须介于5和20之间!");
-        }
-        else if (!existUser.getUsername().equals(user.getUsername())){
-            if (sysUserService.queryUserName(user.getUsername())!=null){
+        } else if (!existUser.getUsername().equals(user.getUsername())) {
+            if (sysUserService.queryUserName(user.getUsername()) != null) {
                 return ResponseVO.fail(user.getUsername() + "账号已存在!");
             }
         }
 
-        if (StringUtils.isEmpty(user.getMailbox())){
+        if (StringUtils.isEmpty(user.getMailbox())) {
             return ResponseVO.fail("邮箱不能为空!");
-        }
-        else if (!Validator.isEmail(user.getMailbox())){
+        } else if (!Validator.isEmail(user.getMailbox())) {
             return ResponseVO.fail("请输入正确的邮箱地址!");
-        }
-        else if (user.getMailbox().length()>50){
+        } else if (user.getMailbox().length() > 50) {
             return ResponseVO.fail("邮箱长度不能超过50个字符!");
-        }
-        else if (!existUser.getMailbox().equals(user.getMailbox())){
-            if (sysUserService.queryMailBox(user.getMailbox())!=null){
+        } else if (!existUser.getMailbox().equals(user.getMailbox())) {
+            if (sysUserService.queryMailBox(user.getMailbox()) != null) {
                 return ResponseVO.fail(user.getMailbox() + "邮箱已存在!");
             }
         }
 
         if (StringUtils.isEmpty(user.getPhonenumber())) {
             return ResponseVO.fail("手机号码不能为空!");
-        }
-        else if (!Validator.isMobile(user.getPhonenumber())){
+        } else if (!Validator.isMobile(user.getPhonenumber())) {
             return ResponseVO.fail("请输入正确的手机号码!");
         }
 
         if (StringUtils.isEmpty(user.getNickname())) {
             return ResponseVO.fail("姓名不能为空!");
-        }
-        else if (user.getNickname().length()>30){
+        } else if (user.getNickname().length() > 30) {
             return ResponseVO.fail("姓名长度不能超过30个字符!");
         }
 
         try {
+            if ("0".equals(user.getStatus())) {
+                user.setErrNum(0);
+                user.setLockTime(0L);
+            }
             boolean bo = sysUserService.updateUser(user);
-            if (bo){
+            if (bo) {
                 return ResponseVO.success("修改用户信息成功");
-            }
-            else{
+            } else {
                 log.error("修改用户信息失败");
                 return ResponseVO.fail("修改用户信息失败");
             }
@@ -217,22 +206,22 @@ public class SysUserController {
     @PostMapping(value = "/resetPassword")
     @InterfaceLimit
     public ResponseVO resetPassword(String id) {
-        if (StringUtils.isEmpty(id)){
+        if (StringUtils.isEmpty(id)) {
             return ResponseVO.fail("重置密码缺失id!");
         }
         // id获取用户
         SysUser sysUser = sysUserService.getById(id);
-        if (sysUser == null){
+        if (sysUser == null) {
             return ResponseVO.fail("重置密码失败!");
         }
         // 生成8位初始密码
         String randomPwd = RandomPwd.getRandomPwd(8);
-        boolean bo = sysUserService.resetPassword(Integer.parseInt(id),SmUtil.sm3(randomPwd).toUpperCase());
-        if (!bo){
+        boolean bo = sysUserService.resetPassword(Integer.parseInt(id), SmUtil.sm3(randomPwd).toUpperCase());
+        if (!bo) {
             return ResponseVO.fail("密码生成失败!");
         }
         try {
-            sendMailUtil.executeSendMail(sysUser.getMailbox(),"系统登录密码","密码:" + randomPwd);
+            sendMailUtil.executeSendMail(sysUser.getMailbox(), "系统登录密码", "密码:" + randomPwd);
         } catch (Exception e) {
             e.printStackTrace();
             return ResponseVO.fail("发送邮箱失败");
@@ -244,16 +233,16 @@ public class SysUserController {
      * 删除用户信息
      */
     @PostMapping(value = "/delUser")
+    @InterfaceLimit
     public ResponseVO delete(String id) {
-        if (StringUtils.isEmpty(id)){
+        if (StringUtils.isEmpty(id)) {
             return ResponseVO.fail("id不能为空!");
         }
         try {
             boolean bo = sysUserService.removeUserById(Integer.parseInt(id));
-            if (bo){
+            if (bo) {
                 return ResponseVO.success("删除用户信息成功");
-            }
-            else{
+            } else {
                 log.error("删除用户信息失败");
                 return ResponseVO.fail("删除用户信息失败");
             }
@@ -269,56 +258,50 @@ public class SysUserController {
      */
     @PostMapping(value = "/updatePassword")
     @InterfaceLimit
-    public ResponseVO updatePassword(String id,String oldPassword,String newPassword,String confirmPassword) {
-        if (StringUtils.isEmpty(id)){
+    public ResponseVO updatePassword(String id, String oldPassword, String newPassword, String confirmPassword) {
+        if (StringUtils.isEmpty(id)) {
             return ResponseVO.fail("修改密码缺失id!");
         }
         // id获取用户
         SysUser sysUser = sysUserService.getById(id);
-        if (sysUser == null){
+        if (sysUser == null) {
             return ResponseVO.fail("修改密码失败!");
         }
 
-        if (StringUtils.isEmpty(oldPassword)){
+        if (StringUtils.isEmpty(oldPassword)) {
             return ResponseVO.fail("旧密码不能为空!");
-        }
-        else if (!sysUser.getPassword().equals(SmUtil.sm3(oldPassword).toUpperCase())){
+        } else if (!sysUser.getPassword().equals(SmUtil.sm3(oldPassword).toUpperCase())) {
             return ResponseVO.fail("旧密码不正确!");
         }
 
-        if (StringUtils.isEmpty(newPassword)){
+        if (StringUtils.isEmpty(newPassword)) {
             return ResponseVO.fail("新密码不能为空!");
-        }
-        else if (StringUtils.isEmpty(confirmPassword)){
+        } else if (StringUtils.isEmpty(confirmPassword)) {
             return ResponseVO.fail("确认密码不能为空!");
-        }
-        else if (!newPassword.equals(confirmPassword)){
+        } else if (!newPassword.equals(confirmPassword)) {
             return ResponseVO.fail("新密码两次输入的密码不一致!");
         }
         // 对新密码规则验证
-        if (newPassword.contains(sysUser.getUsername())){
+        if (newPassword.contains(sysUser.getUsername())) {
             return ResponseVO.fail("密码不能含有账号!");
         }
-        if (SmUtil.sm3(newPassword).toUpperCase().equals(sysUser.getPassword())){
+        if (SmUtil.sm3(newPassword).toUpperCase().equals(sysUser.getPassword())) {
             return ResponseVO.fail("新密码不能与上次密码相同!");
         }
-        if (RegexUtil.sameReg(newPassword)){
+        if (RegexUtil.sameReg(newPassword)) {
             return ResponseVO.fail("新密码不能含有连续4位相同的数字或字母!");
-        }
-        else if (RegexUtil.keyboardSlopeArr(newPassword)){
+        } else if (RegexUtil.keyboardSlopeArr(newPassword)) {
             return ResponseVO.fail("新密码不能含有4位斜方向连续的字符!");
-        }
-        else if (RegexUtil.keyboardHorizontalReg(newPassword)){
+        } else if (RegexUtil.keyboardHorizontalReg(newPassword)) {
             return ResponseVO.fail("新密码不能含有4位连续的字符!");
-        }
-        else if (!RegexUtil.checkPwd(newPassword)){
+        } else if (!RegexUtil.checkPwd(newPassword)) {
             return ResponseVO.fail("新密码不满足8~20位大写字母、小写字母、数字、特殊字符三种以上的组合!");
         }
 
         sysUser.setPassword(SmUtil.sm3(newPassword).toUpperCase());
         sysUser.setLastUpdatePwdTime(new Date());
         boolean bo = sysUserService.updateById(sysUser);
-        if (!bo){
+        if (!bo) {
             return ResponseVO.fail("修改密码失败!");
         }
         return ResponseVO.success();

+ 39 - 0
backend/src/main/java/com/jiayue/ssi/entity/SysParameter.java

@@ -0,0 +1,39 @@
+package com.jiayue.ssi.entity;
+
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * 参数实体
+ *
+ * @author bizy
+ * @version 1.0
+ * @since 2018/10/22 11:29
+ */
+@EqualsAndHashCode(callSuper = true)
+@Data
+@TableName(value = "t_sys_parameter")
+public class SysParameter extends BaseEntity {
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    /**
+     * 参数标识
+     */
+    private String sysKey;
+
+    /**
+     * 参数值
+     */
+    private String sysValue;
+
+    /**
+     * 参数描述
+     */
+    private String sysDescribe;
+}

+ 1 - 1
backend/src/main/java/com/jiayue/ssi/entity/SysUser.java

@@ -37,7 +37,7 @@ public class SysUser extends BaseEntity implements UserDetails {
      */
     private String nickname;
     /**
-     * 账号状态(0激活、1休眠、2注销)
+     * 账号状态(0正常、1锁定(休眠)、2注销)
      */
     private String status;
     /**

+ 8 - 2
backend/src/main/java/com/jiayue/ssi/filter/VerifySmFilter.java

@@ -65,7 +65,7 @@ public class VerifySmFilter extends OncePerRequestFilter {
             }
             // 解密后的参数字符串
             String decryptStr = "";
-            if ("POST".equalsIgnoreCase(request.getMethod())||"PUT".equalsIgnoreCase(request.getMethod())) {
+            if ("POST".equalsIgnoreCase(request.getMethod())||"PUT".equalsIgnoreCase(request.getMethod())||"DELETE".equalsIgnoreCase(request.getMethod())) {
                 byte[] bytes = null;
                 try {
                     bytes = initWrapper.getBodyContent(request).getBytes(StandardCharsets.UTF_8);
@@ -108,7 +108,13 @@ public class VerifySmFilter extends OncePerRequestFilter {
                         return;
                     }
                     if (!"".equals(decryptStr)) {
-                        stringToMap = JSONUtil.parseObj(decryptStr);
+                        try {
+                            stringToMap = JSONUtil.parseObj(decryptStr);
+                        }
+                        catch (Exception e){
+                            ResponseInfo.doResponse(response, "参数不能转换json格式,不能访问系统!", 401);
+                            return;
+                        }
                     }
                 }
             } else {

+ 53 - 1
backend/src/main/java/com/jiayue/ssi/handler/CustomAuthenticationFailureHandler.java

@@ -7,7 +7,11 @@ import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 
 import com.jiayue.ssi.constant.CacheConstants;
+import com.jiayue.ssi.entity.SysUser;
+import com.jiayue.ssi.service.SysParameterService;
+import com.jiayue.ssi.service.SysUserService;
 import com.jiayue.ssi.util.LocalCache;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.core.AuthenticationException;
 import org.springframework.security.web.authentication.SimpleUrlAuthenticationFailureHandler;
 import org.springframework.stereotype.Component;
@@ -19,19 +23,67 @@ import org.springframework.stereotype.Component;
 */
 @Component("customAuthenticationFailureHandler")
 public class CustomAuthenticationFailureHandler extends SimpleUrlAuthenticationFailureHandler {
+    @Autowired
+    SysUserService sysUserService;
+    @Autowired
+    SysParameterService sysParameterService;
 
     @Override
     public void onAuthenticationFailure(HttpServletRequest request, HttpServletResponse response,
         AuthenticationException e) throws IOException, ServletException {
+        String errorTips = "";
         // 验证码验证
         String username = request.getParameter("username");
+        SysUser user = sysUserService.queryUserName(username);
+        if (user == null) {
+            errorTips = "用户名或密码不正确";
+        }
+        else {
+            // 失败总次数
+            int errCount = Integer.parseInt(sysParameterService.queryByKey("errCount","5"));
+            if (user.getStatus().equals("1")) {
+                Long xz = (user.getLockTime() + 100000 - System.currentTimeMillis()) / 1000;
+                if (xz < 0) {
+                    if (errCount-1==0) {
+                        errorTips = "用户锁定,稍后再试";
+                        user.setErrNum(0);
+                        user.setStatus("1");
+                        user.setLockTime(System.currentTimeMillis());
+                    }
+                    else{
+                        user.setStatus("0");
+                        user.setErrNum(1);
+                        errorTips = "用户名或密码不正确,还有"+(errCount-1)+"次机会";
+                    }
+                    sysUserService.updateUser(user);
+                } else {
+                    //锁定状态
+                    errorTips = "用户已锁定,请隔" + xz + "秒再登录";
+                }
+            } else {
+                int errNum = user.getErrNum();
+                if (errNum < errCount-1) {
+                    errorTips = "用户名或密码不正确,还有" + (errCount-1 - errNum) + "次机会";
+                    errNum++;
+                    user.setErrNum(errNum);
+                    sysUserService.updateUser(user);
+                } else {
+                    errorTips = "用户锁定,稍后再试";
+                    user.setErrNum(0);
+                    user.setStatus("1");
+                    user.setLockTime(System.currentTimeMillis());
+                    sysUserService.updateUser(user);
+                }
+            }
+        }
+
         // 删除缓存邮箱口令
         LocalCache.remove(CacheConstants.MAIL_CODE_KEY + username);
         // 清除
         response.addHeader("Access-Control-Allow-Origin", "*");
         response.setContentType("text/html;charset=UTF-8");
         response.setStatus(401);
-        response.getWriter().write("用户名或密码错误!");
+        response.getWriter().write(errorTips);
     }
 
 }

+ 8 - 0
backend/src/main/java/com/jiayue/ssi/handler/CustomAuthenticationSuccessHandler.java

@@ -10,6 +10,7 @@ import javax.servlet.http.HttpServletResponse;
 
 import com.jiayue.ssi.constant.CacheConstants;
 import com.jiayue.ssi.constant.SecretKeyConstants;
+import com.jiayue.ssi.service.SysUserService;
 import com.jiayue.ssi.util.LocalCache;
 import com.jiayue.ssi.util.SM2CryptUtils;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -33,6 +34,8 @@ import cn.hutool.json.JSONUtil;
 public class CustomAuthenticationSuccessHandler extends SavedRequestAwareAuthenticationSuccessHandler {
     @Autowired
     JwtTokenUtil jwtTokenUtil;
+    @Autowired
+    SysUserService sysUserService;
 
     @Override
     public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException {
@@ -41,6 +44,11 @@ public class CustomAuthenticationSuccessHandler extends SavedRequestAwareAuthent
         // 删除缓存邮箱口令
         LocalCache.remove(CacheConstants.MAIL_CODE_KEY + username);
         SysUser sysUser = (SysUser) authentication.getPrincipal();
+        sysUser.setErrNum(0);
+        sysUser.setLockTime(0L);
+        sysUser.setStatus("0");
+        sysUserService.updateUser(sysUser);
+
         SecurityContextHolder.getContext().setAuthentication(authentication);
         String token = jwtTokenUtil.generateToken(sysUser);
         String obj = JSONUtil.toJsonStr(ResponseVO.success(token));

+ 20 - 0
backend/src/main/java/com/jiayue/ssi/mapper/SysParameterMapper.java

@@ -0,0 +1,20 @@
+package com.jiayue.ssi.mapper;
+
+import com.jiayue.ssi.entity.SysParameter;
+import org.apache.ibatis.annotations.Mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.jiayue.ssi.entity.SysUser;
+
+/**
+ * <p>
+ *  参数管理Mapper
+ * </p>
+ *
+ * @author xsl
+ * @since 2023-03-17
+ */
+@Mapper
+public interface SysParameterMapper extends BaseMapper<SysParameter> {
+
+}

+ 1 - 1
backend/src/main/java/com/jiayue/ssi/mapper/SysUserMapper.java

@@ -10,7 +10,7 @@ import org.apache.ibatis.annotations.Mapper;
  * </p>
  *
  * @author xsl
- * @since 2021-12-14
+ * @since 2023-03-10
  */
 @Mapper
 public interface SysUserMapper extends BaseMapper<SysUser> {

+ 21 - 0
backend/src/main/java/com/jiayue/ssi/service/SysParameterService.java

@@ -0,0 +1,21 @@
+package com.jiayue.ssi.service;
+
+import java.util.List;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.jiayue.ssi.entity.SysParameter;
+import com.jiayue.ssi.entity.SysUser;
+
+/**
+* 参数管理接口
+* @author xsl
+* @date 2023/2/16
+*/
+public interface SysParameterService extends IService<SysParameter> {
+    /**
+     * 根据key查找
+     * @param key
+     * @return SysUser
+     */
+    String queryByKey(String key,String defaultValue);
+}

+ 38 - 0
backend/src/main/java/com/jiayue/ssi/service/impl/SysParameterServiceImpl.java

@@ -0,0 +1,38 @@
+package com.jiayue.ssi.service.impl;
+
+import com.jiayue.ssi.entity.SysParameter;
+import com.jiayue.ssi.mapper.SysParameterMapper;
+import com.jiayue.ssi.service.SysParameterService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+
+
+/**
+* 参数管理服务类
+* @author xsl
+* @date 2023/2/16
+*/
+@Service
+public class SysParameterServiceImpl extends ServiceImpl<SysParameterMapper, SysParameter> implements SysParameterService {
+    @Autowired
+    SysParameterMapper sysParameterMapper;
+
+    /**
+     * 根据账号查找
+     * @param key
+     * @param defaultValue 默认值
+     * @return SysParameter
+     */
+    @Override
+    public String queryByKey(String key,String defaultValue){
+        LambdaQueryWrapper<SysParameter> queryWrapper = new LambdaQueryWrapper<>();
+        queryWrapper.eq(SysParameter::getSysKey,key);
+        SysParameter sysParameter = sysParameterMapper.selectOne(queryWrapper);
+        if (sysParameter==null){
+            return defaultValue;
+        }
+        return sysParameter.getSysValue();
+    }
+}

+ 10 - 0
backend/src/main/java/com/jiayue/ssi/service/impl/UserServiceImpl.java

@@ -1,6 +1,8 @@
 package com.jiayue.ssi.service.impl;
 
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.core.authority.AuthorityUtils;
+import org.springframework.security.core.userdetails.User;
 import org.springframework.security.core.userdetails.UserDetails;
 import org.springframework.security.core.userdetails.UserDetailsService;
 import org.springframework.security.core.userdetails.UsernameNotFoundException;
@@ -27,6 +29,14 @@ public class UserServiceImpl implements UserDetailsService {
         if (sysUser == null) {
             throw new UsernameNotFoundException("用户名错误!");
         }
+        else{
+            if (sysUser.getStatus().equals("1") && (System.currentTimeMillis() - sysUser.getLockTime()) < 100000) {
+                sysUser.setPassword("1");
+            }
+            if (sysUser.getStatus().equals("2")) {
+                sysUser.setPassword("1");
+            }
+        }
         return sysUser;
     }
 }

+ 5 - 4
backend/src/test/java/com/jiayue/ssi/service/Test.java

@@ -61,10 +61,11 @@ public class Test {
 //        boolean verify = sm2.verifyHex(HexUtil.encodeHexStr(content), sign);
 //        System.out.println("校验结果为:" + verify);
 
-        String str = "{\"username\":\"admin\",\"password\":\"1234565\"}";
-        Map<String,Object> map = JSONUtil.parseObj(str).getRaw();
-        System.out.println(map.get("username"));
-        System.out.println(map.get("password"));
+//        String str = "{\"username\":\"admin\",\"password\":\"1234565\"}";
+//        Map<String,Object> map = JSONUtil.parseObj(str).getRaw();
+//        System.out.println(map.get("username"));
+//        System.out.println(map.get("password"));
 
+        System.out.println(SmUtil.sm3("admin").toUpperCase());
     }
 }

+ 10 - 3
ui/src/main.js

@@ -75,8 +75,9 @@ Vue.prototype.$axios.interceptors.request.use(
       config.params = result
     }
 
-    if (config.method === 'post' || config.method === 'put') {
+    if (config.method === 'post' || config.method === 'put' || config.method === 'delete') {
       if (config.url != '/getMailCode') {
+
         if (config.data !== undefined) {
           // 参数加密
           let encryptParam = doEncrypt(JSON.stringify(config.data))
@@ -90,7 +91,14 @@ Vue.prototype.$axios.interceptors.request.use(
           if (config.url!='/user/login'){
             config.headers.post['Content-Type'] = 'application/json';
           }
-          // console.log(config.data)
+        }
+        else{
+          Message({
+            message: '请求拦截器检测出config.data是undefined不能提交!',
+            type: 'error',
+            duration: 5 * 1000
+          })
+          return
         }
       }
     }
@@ -239,7 +247,6 @@ Vue.prototype.$axios.interceptors.response.use(
       }
     }
     else{
-      alert(4)
       return Promise.reject(error)
     }
   }

+ 15 - 4
ui/src/router/index.js

@@ -56,12 +56,23 @@ export const constantRoutes = [
     path: '/sysManager',
     component: Layout,
     redirect: '/sysManager',
-    children: [{
-      path: 'sysManager',
-      name: '系统管理',
+    meta: {
+      title: '系统管理'
+    },
+    children: [
+      {
+      path: 'userManager',
+      name: '用户管理',
       component: () => import('@/views/sysManager/userManager/index'),
       meta: {title: '用户管理'}
-    }]
+    },
+      {
+        path: 'sysParameter',
+        name: '参数管理',
+        component: () => import('@/views/sysManager/sysParameter/index'),
+        meta: {title: '参数管理'}
+      }
+    ]
   },
   {
     path: '/404',

+ 322 - 0
ui/src/views/sysManager/sysParameter/index.vue

@@ -0,0 +1,322 @@
+<template>
+  <div class="app-container">
+    <el-card class="box-carde">
+      <div slot="header" class="clearfix">
+        <span>系统参数</span>
+      </div>
+<!--      <el-button-->
+<!--        type="primary"-->
+<!--        size="small"-->
+<!--        style="round-clip: 10px"-->
+<!--        :loading="btnLonding"-->
+<!--        @click="insertEvent"-->
+<!--      >新增</el-button>-->
+
+      <el-button
+        type="primary"
+        plain
+        icon="el-icon-plus"
+        size="mini"
+        @click="insertEvent"
+      >新增
+      </el-button>
+
+      <el-input
+        v-model="keywords"
+        placeholder="通过描述搜索参数"
+        clearable
+        style="width: 300px;margin: 0px;padding: 0px;"
+        size="mini"
+        prefix-icon="el-icon-search"
+        @keyup.enter.native="handleQuery"
+      />
+      <el-button type="primary" icon="el-icon-search" size="mini" @click="getList">搜索</el-button>
+
+      <div style="padding-top: 10px">
+        <vxe-table
+          ref="xTable"
+          align="center"
+          :loading="loading"
+          class="mytable-style"
+          auto-resize
+          border
+          resizable
+          export-config
+          highlight-current-row
+          show-overflow
+          :keep-source="true"
+          :data="tableData"
+          :edit-rules="rules"
+          :edit-config="{trigger: 'manual', mode: 'row',autoClear: false,icon:'none',activeMethod: activeCellMethod}"
+        >
+<!--        <vxe-table-->
+<!--          ref="xTable"-->
+<!--          highlight-current-row-->
+<!--          v-show="showTable"-->
+<!--          :keep-source="true"-->
+<!--          align="center"-->
+<!--          export-config-->
+<!--          :loading="loading"-->
+<!--          auto-resize-->
+<!--          border-->
+<!--          resizable-->
+<!--          show-overflow-->
+<!--          :edit-rules="rules"-->
+<!--          :data="tableData"-->
+<!--          :edit-config="{trigger: 'manual', mode: 'row',autoClear: false,icon:'none',activeMethod: activeCellMethod}"-->
+<!--        >-->
+          <vxe-table-column title="参数配置">
+            <vxe-table-column
+              field="sysKey"
+              title="参数名"
+              width="25%"
+              :edit-render="{name: '$input', props: {type: 'text', readonly: !add}}"
+            />
+            <vxe-table-column
+              field="sysValue"
+              title="参数值"
+              width="25%"
+              :edit-render="{name: '$input', attrs: {type: 'text'}}"
+            />
+            <vxe-table-column
+              field="sysDescribe"
+              title="参数描述"
+              width="25%"
+              :edit-render="{name: '$input', attrs: {type: 'text'}}"
+            />
+            <vxe-table-column align="center" width="25%" title="操作">
+              <template v-slot="{ row }">
+                <template v-if="$refs.xTable.isActiveByRow(row)">
+                  <el-button
+                    style="padding: 3px 4px 3px 4px;margin: 2px"
+                    size="mini"
+                    icon="el-icon-edit"
+                    :loading="saveLoding"
+                    @click="saveRowEvent(row)"
+                  >保存
+                  </el-button>
+                  <el-button
+                    style="padding: 3px 4px 3px 4px;margin: 2px"
+                    size="mini"
+                    icon="el-icon-edit"
+                    @click="cancelRowEvent(row)"
+                  >取消
+                  </el-button>
+                </template>
+                <template v-else>
+                  <el-button
+                    style="padding: 3px 4px 3px 4px;margin: 2px"
+                    size="mini"
+                    icon="el-icon-edit"
+                    :loading="btnLonding"
+                    @click="editRowEvent(row)"
+                  >编辑
+                  </el-button>
+                  <el-button
+                  type="danger"
+                  style="padding: 3px 4px 3px 4px;margin: 2px"
+                  size="mini"
+                  icon="el-icon-delete"
+                  @click="removeEvent(row)"
+                  :loading=btnLonding>删除
+                  </el-button>
+                </template>
+              </template>
+            </vxe-table-column>
+          </vxe-table-column>
+        </vxe-table>
+        <vxe-pager
+          v-show="showTable"
+          perfect
+          :current-page.sync="currentPage"
+          :page-size.sync="pageSize"
+          :total="total"
+          :page-sizes="[10,50,100]"
+          :layouts="['PrevJump', 'PrevPage','JumpNumber', 'NextPage', 'NextJump', 'Sizes', 'FullJump', 'Total']"
+          @page-change="handlePageChange"
+        >
+        </vxe-pager>
+      </div>
+    </el-card>
+  </div>
+</template>
+<script>
+
+export default {
+  data() {
+    return {
+      keywords: '',
+      add: false,
+      addType: false,
+      loading: false,
+      saveLoding: false,
+      showTable: true,
+      btnLonding: false,
+      tableData: [],
+      currentPage: 1,
+      pageSize: 10,
+      total: 0,
+      rules: {
+        sysKey: [
+          { required: true, message: '参数名不能为空' }
+        ],
+        sysValue: [
+          { required: true, message: '参数值不能为空' }
+        ],
+        sysDescribe: [
+          { required: true, message: '参数描述不能为空' }
+        ]
+      }
+    }
+  },
+  created() {
+    this.getList()
+  },
+  methods: {
+    activeCellMethod({ column, columnIndex }) {
+      if (columnIndex === 1) {
+        return false
+      }
+      return true
+    },
+    getList() {
+      this.loading = true;
+      var searchParams = {
+        currentPage: this.currentPage,
+        pageSize: this.pageSize,
+        keywords: this.keywords
+      }
+      this.$axios.get('/sysParameterController/getAll',
+        {params: searchParams}).then((res) => {
+        this.tableData = res.data.records
+        this.total = res.data.total
+
+        if (res.data.records == '') {
+          this.showTable = false
+        } else {
+          this.showTable = true
+        }
+        this.loading = false
+      }).catch((error) => {
+        this.$message.error('获取数据出错' + error)
+      })
+    },
+    handlePageChange({ currentPage, pageSize }) {
+      this.currentPage = currentPage
+      this.pageSize = pageSize
+      this.getList()
+    },
+
+    editRowEvent(row) {
+      this.btnLonding = true
+      this.$refs.xTable.setActiveRow(row)
+    },
+    saveRowEvent(row) {
+      this.saveLoding = true
+      this.$refs.xTable.validate(valid => {
+        if (valid) {
+          if (this.addType) {
+            this.$axios.post('/sysParameterController', row).then((res) => {
+              if (res.code == 0) {
+                this.$message.success('新增成功')
+              }
+              if (res.code == 1) {
+                this.$message.error(res.data)
+              }
+              this.btnLonding = false
+              this.addType = false
+              this.add = false
+              this.saveLoding = false
+              this.getList();
+            }).catch((error) => {
+              this.$message.error(error)
+              this.saveLoding = false
+            })
+          } else {
+            this.$axios.put('/sysParameterController', row).then((res) => {
+              if (res.code == 0) {
+                this.$message.success('修改成功')
+                this.getList();
+              }
+              if (res.code == 1) {
+                this.$message.error(res.data)
+              }
+              this.saveLoding = false
+              this.btnLonding = false
+            }).catch((error) => {
+              this.$message.error(error)
+              this.saveLoding = false
+            })
+          }
+        } else {
+          this.$XModal.message({ status: 'error', message: '校验不通过!' })
+          this.saveLoding = false
+        }
+      })
+      this.saveLoding = false
+    },
+    cancelRowEvent(row) {
+      this.addType = false
+      this.saveLoding = false
+      this.btnLonding = false
+      const xTable = this.$refs.xTable
+      if (this.add) {
+        xTable.clearActived().then(() => {
+          xTable.remove(row)
+          this.add = false
+        })
+      } else {
+        xTable.clearActived().then(() => {
+          // 还原行数据
+          xTable.revertData(row)
+        })
+      }
+    },
+    removeEvent(row) {
+      this.$XModal.confirm('您确定要删除该数据?').then(type => {
+        if (type === 'confirm') {
+          const param = {
+            id: row.id
+          }
+          this.$axios.delete('/sysParameterController/',{data:param}).then(response => {
+            this.$XModal.message({status: 'warning', message: response.message})
+            this.$refs.xTable.remove(row)
+          })
+        }
+      })
+    },
+    dateFormat(row, column) {
+      var date = row.cellValue
+
+      if (date == undefined || date == null) {
+        return ''
+      }
+      return this.$moment(date).format('YYYY-MM-DD HH:mm:ss')// 使用moment插件进行日期格式化
+    },
+    insertEvent() {
+      this.add = true
+      this.addType = true
+      this.showTable = true
+      this.btnLonding = true
+
+      this.$refs.xTable.insert()
+        .then(({ row }) => this.$refs.xTable.setActiveRow(row))
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+  .app-container {
+    /*left: 0;*/
+    /*width: 100%;*/
+    /*min-height: 100%;*/
+    /*height: auto;*/
+    /*background-image: linear-gradient(25deg, #05362d, #145d44, #24875d, #35b477)*/
+  }
+
+  .pagination {
+    margin: 20px 0;
+    text-align: right;
+  }
+</style>

+ 4 - 4
ui/src/views/sysManager/userManager/index.vue

@@ -203,8 +203,8 @@ export default {
   data() {
     return {
       statusOptions: [
-        {value: '0', label: '激活'},
-        {value: '1', label: '休眠'},
+        {value: '0', label: '正常'},
+        {value: '1', label: '锁定'},
         {value: '2', label: '注销'}
       ],
       // 遮罩层
@@ -275,9 +275,9 @@ export default {
       let belongTo = '未知的类型'
       for (let i = 0; i < this.statusOptions.length; i++) {
         if (cellValue == "0") {
-          belongTo = "激活"
+          belongTo = "正常"
         } else if (cellValue == "1") {
-          belongTo = "休眠"
+          belongTo = "锁定"
         } else if (cellValue == "2") {
           belongTo = "注销"
         }