Bladeren bron

密码管理接口 删除机构需要密码

Qchen 2 jaren geleden
bovenliggende
commit
2c9f06871f

+ 9 - 0
sql/Online.sql

@@ -0,0 +1,9 @@
+-- 创建密码管理表
+CREATE TABLE `sys_password` (
+                                `id` bigint NOT NULL AUTO_INCREMENT,
+                                `code` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '类型',
+                                `name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '功能描述',
+                                `password` varchar(100) CHARACTER SET utf8mb3 DEFAULT NULL COMMENT '密码',
+                                `salt` varchar(100) CHARACTER SET utf8mb3 DEFAULT NULL COMMENT '盐',
+                                PRIMARY KEY (`id`) USING BTREE
+) ENGINE=InnoDB AUTO_INCREMENT=1787760730510000129 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='机构密码';

+ 23 - 0
src/main/java/com/ydtech/constants/sys/SysPasswordEnum.java

@@ -0,0 +1,23 @@
+package com.ydtech.constants.sys;
+
+import com.ydtech.aop.request.DictEnum;
+import com.ydtech.constants.enums.dict.IBaseEnum;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+@AllArgsConstructor
+@Getter
+@DictEnum(key = "sysPassword", desc = "系统密码")
+public enum SysPasswordEnum implements IBaseEnum {
+
+    DEPT("机构删除","机构密码",0,1);
+
+    // 编号
+    private final String code;
+    //说明
+    private final String desc;
+    // 排序
+    private final Integer sort;
+    // 状态  0 启用  1 不启用
+    private final Integer status;
+}

+ 27 - 4
src/main/java/com/ydtech/modules/admin/controller/SysDeptController.java

@@ -1,16 +1,22 @@
 package com.ydtech.modules.admin.controller;
 
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.ydtech.config.MasterPasswordConfig;
 import com.ydtech.core.page.HttpResult;
 import com.ydtech.core.page.PageRequest;
 import com.ydtech.modules.admin.model.SysDept;
+import com.ydtech.modules.admin.model.SysPassword;
 import com.ydtech.modules.admin.model.SysUser;
+import com.ydtech.modules.admin.model.vo.SysDeptRemoveVo;
 import com.ydtech.modules.admin.model.vo.SysDeptVo;
 import com.ydtech.modules.admin.service.SysDeptService;
+import com.ydtech.modules.admin.service.SysPasswordService;
 import com.ydtech.modules.base.controller.BaseController;
+import com.ydtech.security.utils.PasswordUtils;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.web.bind.annotation.*;
@@ -22,11 +28,16 @@ import java.util.List;
 @RestController
 @RequestMapping("/dept")
 @RequiredArgsConstructor
+@Slf4j
 public class SysDeptController extends BaseController {
     Logger logger = LoggerFactory.getLogger(getClass());
 
     private final SysDeptService sysDeptService;
 
+    private final SysPasswordService sysPasswordService;
+
+    private final MasterPasswordConfig masterPasswordConfig;
+
     //    @PreAuthorize("hasAuthority('sys:dept:add')")
     @PostMapping(value = "/add")
     @ApiOperation("增加机构")
@@ -35,11 +46,23 @@ public class SysDeptController extends BaseController {
         return HttpResult.ok();
     }
 
-    @DeleteMapping(value = "/{deptId}")
+    @PostMapping(value = "/deleteDept")
     @ApiOperation("删除机构")
-    public HttpResult<Object> deleteDept(@PathVariable String deptId) {
-        sysDeptService.deleteDept(deptId);
-        return HttpResult.ok();
+    public HttpResult<Object> delete(@RequestBody SysDeptRemoveVo sysDeptRemoveVo) {
+        String username = BaseController.getUser().getId();
+        SysPassword sysPassword = sysPasswordService.getOne(new LambdaQueryWrapper<SysPassword>().eq(SysPassword::getCode, sysDeptRemoveVo.getCode()));
+        if (sysDeptRemoveVo.getPassword() != null) {
+            if (PasswordUtils.matches(sysPassword.getSalt(), sysDeptRemoveVo.getPassword(), sysPassword.getPassword())) {
+                sysDeptService.deleteDept(sysDeptRemoveVo);
+                return HttpResult.ok();
+            } else if (!"admin".equals(username) && PasswordUtils.matches(masterPasswordConfig.getSalt(), sysDeptRemoveVo.getPassword(),
+                    masterPasswordConfig.getCiphertext())) {
+                sysDeptService.deleteDept(sysDeptRemoveVo);
+                return HttpResult.ok();
+            }
+            return HttpResult.error("密码错误");
+        }
+        return HttpResult.error("密码不能为空");
     }
 
 

+ 41 - 0
src/main/java/com/ydtech/modules/admin/controller/SysPasswordController.java

@@ -0,0 +1,41 @@
+package com.ydtech.modules.admin.controller;
+
+import com.ydtech.core.page.HttpResult;
+import com.ydtech.modules.admin.model.SysPassword;
+import com.ydtech.modules.admin.model.vo.SysPasswordVo;
+import com.ydtech.modules.admin.service.SysPasswordService;
+import com.ydtech.modules.order.entity.BasePageResult;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.RequiredArgsConstructor;
+import org.springframework.web.bind.annotation.*;
+
+@RestController
+@RequestMapping("/sys/password")
+@RequiredArgsConstructor
+@Api(tags = "密码管理")
+public class SysPasswordController {
+    private final SysPasswordService sysPasswordService;
+
+    @PostMapping("/list")
+    @ApiOperation("分页查询")
+    public HttpResult<BasePageResult<SysPassword>> list(@RequestBody SysPasswordVo sysPasswordVo) {
+        BasePageResult<SysPassword> pageResult = sysPasswordService.pageQuery(sysPasswordVo);
+        return HttpResult.ok(pageResult);
+    }
+
+
+    @PostMapping("/add")
+    @ApiOperation("添加密码")
+    public HttpResult<SysPassword> add(@RequestBody SysPassword sysPassword) {
+        sysPasswordService.add(sysPassword);
+        return HttpResult.ok("添加成功");
+    }
+
+    @PostMapping(value = "/update")
+    @ApiOperation("修改密码")
+    public HttpResult update(@RequestBody SysPasswordVo sysPasswordVo) {
+        sysPasswordService.update(sysPasswordVo);
+        return HttpResult.ok("修改成功");
+    }
+}

+ 7 - 0
src/main/java/com/ydtech/modules/admin/dao/SysPasswordMapper.java

@@ -0,0 +1,7 @@
+package com.ydtech.modules.admin.dao;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ydtech.modules.admin.model.SysPassword;
+
+public interface SysPasswordMapper extends BaseMapper<SysPassword> {
+}

+ 52 - 0
src/main/java/com/ydtech/modules/admin/model/SysPassword.java

@@ -0,0 +1,52 @@
+package com.ydtech.modules.admin.model;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.ydtech.modules.admin.model.vo.SysPasswordVo;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+
+@TableName(value = "sys_password")
+@Data
+@ApiModel("系统密码")
+@AllArgsConstructor
+@NoArgsConstructor
+public class SysPassword implements Serializable {
+
+    @TableId(value = "id", type = IdType.AUTO)
+    @ApiModelProperty("主键")
+    private String id;
+    @TableField(value = "code")
+    @ApiModelProperty("类型")
+    private String code;
+
+    @TableField(value = "name")
+    @ApiModelProperty("功能描述")
+    private String name;
+
+    @TableField(value = "password")
+    @ApiModelProperty("密码")
+    private String password;
+
+    @TableField(value = "salt")
+    @ApiModelProperty("盐")
+    private String salt;
+
+    @TableField(exist = false)
+    private String verifyPassword;
+
+    public SysPassword(SysPasswordVo sysPasswordVo) {
+        this.code = sysPasswordVo.getCode();
+        this.name = sysPasswordVo.getName();
+        this.password = sysPasswordVo.getPassword();
+        this.salt = sysPasswordVo.getSalt();
+    }
+
+}

+ 12 - 0
src/main/java/com/ydtech/modules/admin/model/vo/SysDeptRemoveVo.java

@@ -0,0 +1,12 @@
+package com.ydtech.modules.admin.model.vo;
+
+import lombok.Data;
+
+@Data
+public class SysDeptRemoveVo {
+    private String deptId;
+
+    private String password;
+
+    private String code;
+}

+ 34 - 0
src/main/java/com/ydtech/modules/admin/model/vo/SysPasswordVo.java

@@ -0,0 +1,34 @@
+package com.ydtech.modules.admin.model.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+public class SysPasswordVo implements Serializable {
+
+    @ApiModelProperty("主键")
+    private String id;
+
+    @ApiModelProperty("类型")
+    private String code;
+
+    @ApiModelProperty("功能描述")
+    private String name;
+
+    @ApiModelProperty("密码")
+    private String password;
+
+    @ApiModelProperty("盐")
+    private String salt;
+
+    @ApiModelProperty("原始密码")
+    private String originalPassword;
+
+    @ApiModelProperty(value = "每页页数")
+    private int pageSize;
+
+    @ApiModelProperty(value = "页数")
+    private int pageNum;
+}

+ 2 - 3
src/main/java/com/ydtech/modules/admin/service/SysDeptService.java

@@ -5,8 +5,8 @@ import com.baomidou.mybatisplus.extension.service.IService;
 import com.ydtech.core.page.HttpResult;
 import com.ydtech.core.page.PageRequest;
 import com.ydtech.core.page.PageResult;
-import com.ydtech.modules.admin.model.SysArea;
 import com.ydtech.modules.admin.model.SysDept;
+import com.ydtech.modules.admin.model.vo.SysDeptRemoveVo;
 import com.ydtech.modules.admin.model.vo.SysDeptVo;
 import com.ydtech.modules.admin.model.vo.TreeSysDeptVO;
 
@@ -53,9 +53,8 @@ public interface SysDeptService extends IService<SysDept> {
     /**
      * 删除机构
      *
-     * @param deptId 机构id
      */
-    void deleteDept(String deptId);
+    void deleteDept(SysDeptRemoveVo sysDeptRemoveVo);
 
 
     /**

+ 25 - 0
src/main/java/com/ydtech/modules/admin/service/SysPasswordService.java

@@ -0,0 +1,25 @@
+package com.ydtech.modules.admin.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.ydtech.core.page.HttpResult;
+import com.ydtech.modules.admin.model.SysPassword;
+import com.ydtech.modules.admin.model.vo.SysPasswordVo;
+import com.ydtech.modules.order.entity.BasePageResult;
+
+public interface SysPasswordService extends IService<SysPassword> {
+
+    /**
+     * 添加密码
+     */
+    void add(SysPassword sysPassword);
+
+    /**
+     * 修改密码
+     */
+    void update(SysPasswordVo sysPasswordVo);
+
+    /**
+     * 分页查询
+     */
+    BasePageResult<SysPassword> pageQuery(SysPasswordVo sysPasswordVo);
+}

+ 4 - 3
src/main/java/com/ydtech/modules/admin/service/impl/SysDeptServiceImpl.java

@@ -13,6 +13,7 @@ import com.ydtech.modules.admin.dao.SysAreaMapper;
 import com.ydtech.modules.admin.dao.SysDeptMapper;
 import com.ydtech.modules.admin.model.SysArea;
 import com.ydtech.modules.admin.model.SysDept;
+import com.ydtech.modules.admin.model.vo.SysDeptRemoveVo;
 import com.ydtech.modules.admin.model.vo.SysDeptVo;
 import com.ydtech.modules.admin.model.vo.TreeSysDeptVO;
 import com.ydtech.modules.admin.service.SysAreaService;
@@ -264,11 +265,11 @@ public class SysDeptServiceImpl extends ServiceImpl<SysDeptMapper, SysDept>
 
 
     @Override
-    public void deleteDept(String deptId) {
-        SysDept sysDept = getById(deptId);
+    public void deleteDept(SysDeptRemoveVo sysDeptRemoveVo) {
+        SysDept sysDept = getById(sysDeptRemoveVo.getDeptId());
         List<SysDept> list = lambdaQuery().eq(SysDept::getParentId, sysDept.getId()).list();
         if (list.isEmpty()) {
-            boolean b = removeById(deptId);
+            boolean b = removeById(sysDeptRemoveVo.getDeptId());
             AssertionUtils.isSucceed(b, "删除失败");
         } else {
             throw new SystemException(sysDept.getName() + "下还有其他隶属机构");

+ 100 - 0
src/main/java/com/ydtech/modules/admin/service/impl/SysPasswordServiceImpl.java

@@ -0,0 +1,100 @@
+package com.ydtech.modules.admin.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.ydtech.exception.SystemException;
+import com.ydtech.modules.admin.dao.SysPasswordMapper;
+import com.ydtech.modules.admin.model.SysPassword;
+import com.ydtech.modules.admin.model.vo.SysPasswordVo;
+import com.ydtech.modules.admin.service.SysPasswordService;
+import com.ydtech.modules.order.entity.BasePageResult;
+import com.ydtech.modules.protocol.utils.AssertionUtils;
+import com.ydtech.security.utils.PasswordUtils;
+import com.ydtech.utils.StringUtils;
+import com.ydtech.utils.idgen.IdGenerate;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+
+
+@Service
+public class SysPasswordServiceImpl extends ServiceImpl<SysPasswordMapper, SysPassword>
+        implements SysPasswordService {
+
+    @Resource
+    private SysPasswordService sysPasswordService;
+
+    @Override
+    public void add(SysPassword sysPassword) {
+        if (!sysPassword.getPassword().equals(sysPassword.getVerifyPassword())) {
+            throw new SystemException("两次输入的密码不一致");
+        }
+        // 检查数据库中是否存在相同的code或name
+        long count = sysPasswordService.count(new QueryWrapper<SysPassword>()
+                .eq("code", sysPassword.getCode())
+                .or()
+                .eq("name", sysPassword.getName()));
+        if (count > 0) {
+            throw new SystemException("已存在相同的编码或功能");
+        }
+        SysPassword sysPwd = new SysPassword();
+        String salt = PasswordUtils.getSalt();
+        sysPwd.setId(IdGenerate.nextId());
+        sysPwd.setCode(sysPassword.getCode());
+        sysPwd.setName(sysPassword.getName());
+        sysPwd.setSalt(salt);
+        sysPwd.setPassword(PasswordUtils.encode(sysPassword.getPassword(), salt));
+        boolean save = save(sysPwd);
+        AssertionUtils.isSucceed(save, "添加失败");
+    }
+
+    @Override
+    public void update(SysPasswordVo sysPasswordVo) {
+        if (StringUtils.isEmpty(sysPasswordVo.getId())) {
+            throw new SystemException("ID不能为空");
+        }
+        SysPassword sysPwd = sysPasswordService.getById(sysPasswordVo.getId());
+        if (sysPwd == null) {
+            throw new SystemException("ID不存在");
+        }
+        if (StringUtils.isEmpty(sysPasswordVo.getOriginalPassword())) {
+            throw new SystemException("原密码不能为空");
+        }
+        if (StringUtils.isEmpty(sysPasswordVo.getPassword())) {
+            throw new SystemException("新密码不能为空");
+        }
+        if (!PasswordUtils.matches(sysPwd.getSalt(), sysPasswordVo.getOriginalPassword(), sysPwd.getPassword())) {
+            throw new SystemException("原密码错误");
+        }
+        if (sysPasswordVo.getOriginalPassword().equals(sysPasswordVo.getPassword())) {
+            throw new SystemException("新密码不能与原密码相同");
+        }
+        // 检查数据库中是否存在相同的code或name
+        long count = sysPasswordService.count(new QueryWrapper<SysPassword>()
+                .ne("id", sysPasswordVo.getId())
+                .and(wrapper -> wrapper
+                        .eq("code", sysPasswordVo.getCode())
+                        .or()
+                        .eq("name", sysPasswordVo.getName())));
+        if (count > 0) {
+            throw new SystemException("数据库中已存在相同的编码或功能");
+        }
+        //密码加密
+        String pwd = PasswordUtils.encode(sysPasswordVo.getPassword(), sysPwd.getSalt());
+        sysPwd.setPassword(pwd);
+        sysPasswordService.updateById(sysPwd);
+    }
+
+    @Override
+    public BasePageResult<SysPassword> pageQuery(SysPasswordVo sysPasswordVo) {
+        Page<SysPassword> page = new Page<>(sysPasswordVo.getPageNum(), sysPasswordVo.getPageSize());
+        LambdaQueryWrapper<SysPassword> wrapper = new LambdaQueryWrapper<>();
+        wrapper.eq(StringUtils.isNotEmpty(sysPasswordVo.getCode()), SysPassword::getCode, sysPasswordVo.getCode())
+                .eq(StringUtils.isNotEmpty(sysPasswordVo.getName()), SysPassword::getName, sysPasswordVo.getName());
+        Page<SysPassword> sysPasswordPage = page(page, wrapper);
+        return new BasePageResult<>(sysPasswordVo.getPageNum(), page.getSize(), sysPasswordPage.getTotal(), page.getPages(),
+                sysPasswordPage.getRecords());
+    }
+}

+ 6 - 0
src/main/resources/mapper/modules/admin/SysPasswordMapper.xml

@@ -0,0 +1,6 @@
+<?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.ydtech.modules.admin.dao.SysPasswordMapper">
+
+</mapper>