suntianwu 3 lat temu
rodzic
commit
6dd4347cc8
41 zmienionych plików z 868 dodań i 100 usunięć
  1. 1 1
      src/main/java/com/iden/bms/controller/HomePageController.java
  2. 42 2
      src/main/java/com/iden/bms/controller/LoginController.java
  3. 74 4
      src/main/java/com/iden/bms/controller/SysRoleController.java
  4. 17 2
      src/main/java/com/iden/bms/controller/SysUserController.java
  5. 5 5
      src/main/java/com/iden/bms/controller/TraceController.java
  6. 11 2
      src/main/java/com/iden/bms/face/FaceIdenService.java
  7. 7 4
      src/main/java/com/iden/bms/face/FaceIdenTool.java
  8. 5 0
      src/main/java/com/iden/bms/params/UserLoginParams.java
  9. 8 8
      src/main/java/com/iden/bms/schedule/WarningPersonTraceSchedule.java
  10. 128 2
      src/main/java/com/iden/bms/service/SysRoleService.java
  11. 31 2
      src/main/java/com/iden/bms/service/SysUserService.java
  12. 13 18
      src/main/java/com/iden/bms/service/TraceService.java
  13. 85 0
      src/main/java/com/iden/bms/service/WarningService.java
  14. 7 3
      src/main/java/com/iden/common/cache/RedisKeyConstant.java
  15. 1 1
      src/main/java/com/iden/common/constant/Constants.java
  16. 4 0
      src/main/java/com/iden/common/entity/IdenFaceImage.java
  17. 2 2
      src/main/java/com/iden/common/entity/IdenRoleMenuRel.java
  18. 63 0
      src/main/java/com/iden/common/entity/IdenSysLog.java
  19. 3 0
      src/main/java/com/iden/common/entity/IdenSysMenu.java
  20. 4 0
      src/main/java/com/iden/common/entity/IdenWarningEvent.java
  21. 1 1
      src/main/java/com/iden/common/entity/IdenWarningPersonTrace.java
  22. 4 4
      src/main/java/com/iden/common/enums/CameraTypeEnum.java
  23. 4 4
      src/main/java/com/iden/common/enums/ConnectStatusEnum.java
  24. 35 0
      src/main/java/com/iden/common/enums/HandleWarningStatusEnum.java
  25. 38 0
      src/main/java/com/iden/common/enums/IsLeafEnum.java
  26. 3 3
      src/main/java/com/iden/common/enums/PersonTypeEnum.java
  27. 9 9
      src/main/java/com/iden/common/enums/PopulationTypeEnum.java
  28. 4 4
      src/main/java/com/iden/common/enums/TrueFalseEnum.java
  29. 5 5
      src/main/java/com/iden/common/enums/UserRoleEnum.java
  30. 4 4
      src/main/java/com/iden/common/enums/ValidStatusEnum.java
  31. 2 1
      src/main/java/com/iden/common/interceptor/AuthorizationInterceptorConf.java
  32. 15 0
      src/main/java/com/iden/common/mapper/IdenSysLogMapper.java
  33. 14 0
      src/main/java/com/iden/common/service/IdenSysLogService.java
  34. 18 0
      src/main/java/com/iden/common/service/impl/IdenSysLogServiceImpl.java
  35. 170 0
      src/main/java/com/iden/common/util/VerifyCodeUtil.java
  36. 3 0
      src/main/java/com/iden/common/vo/FaceImageVO.java
  37. 13 0
      src/main/java/com/iden/common/vo/FaceRetrieveResultVO.java
  38. 5 0
      src/main/java/com/iden/common/vo/SysMenuVO.java
  39. 4 1
      src/main/java/com/iden/common/vo/SysRoleVO.java
  40. 0 8
      src/main/java/com/iden/common/vo/TraceVO.java
  41. 6 0
      src/main/resources/mybatis/IdenSysLogMapper.xml

+ 1 - 1
src/main/java/com/iden/bms/controller/HomePageController.java

@@ -110,7 +110,7 @@ public class HomePageController {
         }
     }
 
-    @GetMapping("/listLastWeekStrangerFaceImageSta")
+    @GetMapping("/listLastWeekEventComingFaceImageSta")
     @ApiOperation(value = "查询上周昼伏夜出人脸抓拍统计")
     public Result<List<HomPageLastWeekFaceImageStatVO>> listLastWeekEventComingFaceImageSta(HttpServletRequest request, @RequestHeader(value = "token") String token){
         try {

+ 42 - 2
src/main/java/com/iden/bms/controller/LoginController.java

@@ -3,21 +3,32 @@ package com.iden.bms.controller;
 import cn.hutool.json.JSONUtil;
 import com.iden.bms.params.UserLoginParams;
 import com.iden.bms.service.SysUserService;
+import com.iden.common.cache.RedisKeyConstant;
+import com.iden.common.cache.RedisUtil;
 import com.iden.common.constant.Constants;
 import com.iden.common.exception.BDException;
+import com.iden.common.util.VerifyCodeUtil;
 import com.iden.common.vo.UserLoginedConvertVO;
 import com.iden.common.util.JwtUtils;
 import com.iden.common.util.Result;
 import com.iden.common.util.ResultCode;
 import io.jsonwebtoken.Claims;
 import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
 import io.swagger.annotations.ApiOperation;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.MediaType;
 import org.springframework.web.bind.annotation.*;
 
+import javax.annotation.Resource;
+import javax.imageio.ImageIO;
+import javax.servlet.ServletOutputStream;
 import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.servlet.http.HttpSession;
+import java.awt.image.BufferedImage;
 import java.util.HashMap;
 import java.util.Map;
 
@@ -30,6 +41,8 @@ import java.util.Map;
 @Slf4j
 @RequestMapping("/bms")
 public class LoginController {
+    @Resource
+    RedisUtil redisUtil;
 
     @Autowired
     SysUserService sysUserService;
@@ -39,7 +52,7 @@ public class LoginController {
     public Result<Object> login(HttpServletRequest request, @RequestBody UserLoginParams userLoginParams) {
         try {
             //验证用户名密码
-            UserLoginedConvertVO loginUser = sysUserService.getLoginUser(userLoginParams.getUsername(),userLoginParams.getPassword());
+            UserLoginedConvertVO loginUser = sysUserService.getLoginUser(userLoginParams.getUsername(),userLoginParams.getPassword(),userLoginParams.getSecurityCode());
             if (loginUser == null) {
                 return Result.error("未找到相关用户");
             }
@@ -72,5 +85,32 @@ public class LoginController {
         }
         return Result.error("解析失败");
     }
-    //TODO 退出
+
+    //生成验证码
+    @GetMapping("/getVerifyCode")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "username", value = "账号",
+                    dataType = "String", paramType = "query",
+                    required = true)
+    })
+    public void getVerifyCode(HttpServletRequest request,HttpServletResponse response,
+                         @RequestParam(name = "username", required = true) String username) {
+        try {
+            //生成验证码
+            String securityCode = VerifyCodeUtil.getSecurityCode();
+            //将验证码放入redis
+            redisUtil.hset(RedisKeyConstant.LOGIN_VALIDATE_CODE, username, securityCode, RedisKeyConstant.LOGIN_VALIDATE_CODE_TIME);
+
+            //生成图片
+            BufferedImage image = VerifyCodeUtil.createImage(securityCode);
+            //输出图片
+            ServletOutputStream outputStream = response.getOutputStream();
+
+            //调用工具类
+            ImageIO.write(image, "png", outputStream);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+    }
+
 }

+ 74 - 4
src/main/java/com/iden/bms/controller/SysRoleController.java

@@ -7,10 +7,10 @@ import com.iden.common.exception.BDException;
 import com.iden.common.util.PageResult;
 import com.iden.common.util.Result;
 import com.iden.common.util.WebPageUtils;
-import com.iden.common.vo.SysRoleVO;
-import com.iden.common.vo.PageReqVO;
-import com.iden.common.vo.UserLoginedConvertVO;
+import com.iden.common.vo.*;
 import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
 import io.swagger.annotations.ApiOperation;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -83,7 +83,7 @@ public class SysRoleController {
     @PostMapping("/updateSysRole")
     @ApiOperation(value = "修改角色")
     public Result<Object> updateSysRole(@RequestHeader("token") String token,
-                                 @RequestBody SysRoleVO vo){
+                                        @RequestBody SysRoleVO vo){
         try {
             this.sysRoleService.updateSysRole(vo);
             return  Result.success("修改成功!");
@@ -96,6 +96,22 @@ public class SysRoleController {
         }
     }
 
+    @PostMapping("/invalidSysRole")
+    @ApiOperation(value = "启用停用(只设置id和validStatus(0启用,1停用))")
+    public Result<Object> invalidSysRole(@RequestHeader("token") String token,
+                                              @RequestBody SysRoleVO vo){
+        try {
+            sysRoleService.invalidSysRole(vo);
+            return Result.success("操作成功!");
+        }catch (BDException e) {
+            log.error("启用停用角色出现异常",e);
+            return Result.error(e.getMessage());
+        } catch (Exception e) {
+            log.error("角色管理: 启用停用角色出现异常",e);
+            return Result.error("启用停用角色失败!");
+        }
+    }
+
     @GetMapping("/getSysRoleInfo/{id}")
     @ApiOperation(value = "角色详情")
     public Result<SysRoleVO> getSysRoleInfo(HttpServletRequest request, @RequestHeader("token") String token, @PathVariable("id") Long id){
@@ -119,4 +135,58 @@ public class SysRoleController {
             return Result.error("删除失败!");
         }
     }
+
+    @GetMapping("/listNoHasLeafMenu")
+    @ApiOperation(value = "获取没有拥有的叶子菜单")
+    @ApiImplicitParams(value = {
+            @ApiImplicitParam(paramType = "query", name = "id", value = "角色ID"),
+
+    })
+    public Result<List<SysMenuVO>> listNoHasLeafMenu(HttpServletRequest request, @RequestHeader(value = "token") String token,
+                                                     @RequestParam(value = "id", required = false) Long id) {
+        try {
+            UserLoginedConvertVO loginUser = WebPageUtils.getCurrentLoginedUser(request);
+            List<SysMenuVO> datas = this.sysRoleService.listNoHasLeafMenu(loginUser,id);
+            return Result.success(datas);
+        }catch (Exception e) {
+            log.error("角色管理: 获取没有拥有的叶子菜单出现异常",e);
+            return Result.error( "获取列表失败");
+        }
+    }
+
+    @GetMapping("/listHasLeafMenu")
+    @ApiOperation(value = "获取拥有的叶子菜单")
+    @ApiImplicitParams(value = {
+            @ApiImplicitParam(paramType = "query", name = "id", value = "角色ID"),
+
+    })
+    public Result<List<SysMenuVO>> listHasLeafMenu(HttpServletRequest request, @RequestHeader(value = "token") String token,
+                                                     @RequestParam(value = "id", required = false) Long id) {
+        try {
+            UserLoginedConvertVO loginUser = WebPageUtils.getCurrentLoginedUser(request);
+            List<SysMenuVO> datas = this.sysRoleService.listHasLeafMenu(loginUser,id);
+            return Result.success(datas);
+        }catch (Exception e) {
+            log.error("角色管理: 获取拥有的叶子菜单出现异常",e);
+            return Result.error( "获取列表失败");
+        }
+    }
+
+    @PostMapping("/saveSysRoleMenu")
+    @ApiOperation(value = "保存角色拥有的菜单,SysRoleVO设置菜单id和hasSysMenuVOList")
+    public Result<Object> saveSysRoleMenu(HttpServletRequest request,
+                                          @RequestHeader("token") String token,
+                                        @RequestBody SysRoleVO vo){
+        try {
+            UserLoginedConvertVO loginUser = WebPageUtils.getCurrentLoginedUser(request);
+            this.sysRoleService.saveSysRoleMenu(loginUser,vo);
+            return  Result.success("保存成功!");
+        }catch (BDException e) {
+            log.error("保存角色拥有的菜单-出现异常",e);
+            return Result.error(e.getMessage());
+        } catch (Exception e) {
+            log.error("角色管理: 保存角色拥有的菜单出现异常",e);
+            return Result.error("保存失败!");
+        }
+    }
 }

+ 17 - 2
src/main/java/com/iden/bms/controller/SysUserController.java

@@ -39,8 +39,6 @@ public class SysUserController {
 
     @Autowired
     private SysUserService sysUserService;
-    @Autowired
-    private IdenSysUserService idenSysUserService;
 
 
     @GetMapping("/listSysUser")
@@ -109,6 +107,22 @@ public class SysUserController {
         }
     }
 
+    @PostMapping("/invalidSysUser")
+    @ApiOperation(value = "启用停用(只设置id和validStatus(0启用,1停用))")
+    public Result<Object> invalidSysUser(@RequestHeader("token") String token,
+                                         @RequestBody SysUserVO vo){
+        try {
+            sysUserService.invalidSysUser(vo);
+            return Result.success("操作成功!");
+        }catch (BDException e) {
+            log.error("启用停用用户出现异常",e);
+            return Result.error(e.getMessage());
+        } catch (Exception e) {
+            log.error("用户管理: 启用停用用户出现异常",e);
+            return Result.error("启用停用用户失败!");
+        }
+    }
+
     @GetMapping("/getSysUserInfo/{id}")
     @ApiOperation(value = "系统用户详情")
     public Result<SysUserVO> getSysUserInfo(HttpServletRequest request, @RequestHeader("token") String token, @PathVariable("id") Long id){
@@ -133,6 +147,7 @@ public class SysUserController {
         }
     }
 
+
     @PostMapping("/resetPassword/{id}")
     @ApiOperation(value = "重置密码")
     public Result<Object> resetPassword(@RequestHeader("token") String token,

+ 5 - 5
src/main/java/com/iden/bms/controller/TraceController.java

@@ -45,8 +45,8 @@ public class TraceController {
     public Result<String> uploadImage( @ApiParam(value="图像",required=true) MultipartFile file,
                                        @RequestHeader(name = "token") String token) {
         try {
-            String image = traceService.uploadImage(file);
-            return  Result.success("上传成功!",image);
+            String imageName = traceService.uploadImage(file);
+            return  Result.success("上传成功!",imageName);
         } catch (BDException e) {
             log.error("图像上传出现异常",e);
             return Result.error(e.getMessage());
@@ -60,18 +60,18 @@ public class TraceController {
     @GetMapping("/listUploadImagesTrace")
     @ApiOperation(value = "使用上传图像获取目标轨迹列表(地图打点划线) ")
     @ApiImplicitParams(value = {
-            @ApiImplicitParam(paramType = "query", name = "images", value = "图像名称,多个用逗号分割"),
+            @ApiImplicitParam(paramType = "query", name = "imageNames", value = "图像名称,多个用逗号分割"),
             @ApiImplicitParam(paramType = "query", name = "beginTime", value = "开始时间(yyyy-MM-dd HH:mm:ss)"),
             @ApiImplicitParam(paramType = "query", name = "endTime", value = "结束时间(yyyy-MM-dd HH:mm:ss)")
 
     })
     public Result<List<TraceVO>> listUploadImagesTrace(HttpServletRequest request, @RequestHeader(value = "token") String token,
-                                           @RequestParam(value = "images", required = true) String images,
+                                           @RequestParam(value = "imageNames", required = true) String imageNames,
                                            @RequestParam(value = "beginTime", required = false) String beginTime,
                                            @RequestParam(value = "endTime", required = false) String endTime){
         try {
             UserLoginedConvertVO loginUser = WebPageUtils.getCurrentLoginedUser(request);
-            List<TraceVO> datas = this.traceService.listUploadImagesTrace(images,beginTime,endTime,loginUser);
+            List<TraceVO> datas = this.traceService.listUploadImagesTrace(imageNames,beginTime,endTime,loginUser);
             return Result.success(datas);
         }catch (Exception e) {
             log.error("轨迹管理: 使用上传图像获取目标轨迹列表出现异常",e);

+ 11 - 2
src/main/java/com/iden/bms/face/FaceIdenService.java

@@ -21,6 +21,7 @@ import com.iden.common.service.IdenFaceImageService;
 import com.iden.common.util.ByteUtil;
 import com.iden.common.util.DateUtils;
 import com.iden.common.util.FileUtil;
+import com.iden.common.vo.FaceRetrieveResultVO;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.logging.log4j.LogManager;
 import org.apache.logging.log4j.Logger;
@@ -29,6 +30,7 @@ import org.springframework.stereotype.Service;
 
 import javax.annotation.Resource;
 import java.io.File;
+import java.math.BigDecimal;
 import java.util.*;
 
 
@@ -133,12 +135,19 @@ public class FaceIdenService {
                                 //和人员图像库比对特征码,关联personId
                                 if(faceModels[i] != null){
 
-                                    int  hitIndex = FaceIdenTool.getHitIndex(faceMonitorPerson,faceModels[i]);
-                                    if (hitIndex != -1){
+                                    FaceRetrieveResultVO faceRetrieveResultVO = FaceIdenTool.getHitResult(faceMonitorPerson,faceModels[i]);
+                                    if (faceRetrieveResultVO != null){
+                                        int hitIndex = faceRetrieveResultVO.getIndex();
                                         IdenPerson idenPerson = personService.getPersonIdByImageFileName(imgPersonFiles[hitIndex].getName());
                                         if(idenPerson != null) {
                                             idenFaceImage.setPersonId(idenPerson.getId());
                                             idenFaceImage.setType(idenPerson.getType());
+                                            idenFaceImage.setGender(idenPerson.getGender());
+                                            float score = faceRetrieveResultVO.getScore();
+                                            BigDecimal b = new BigDecimal(score);
+                                            double similarity = b.divide(new BigDecimal(100)).setScale(4,BigDecimal.ROUND_HALF_UP).doubleValue();
+
+                                            idenFaceImage.setSimilarity(similarity);
                                         }
                                     }
 

+ 7 - 4
src/main/java/com/iden/bms/face/FaceIdenTool.java

@@ -6,6 +6,7 @@ import com.face.monitor.model.FaceRecogRetrieveResult;
 import com.face.monitor.model.Image;
 import com.face.monitor.model.RecogResult;
 import com.iden.common.util.ByteUtil;
+import com.iden.common.vo.FaceRetrieveResultVO;
 import org.apache.logging.log4j.LogManager;
 import org.apache.logging.log4j.Logger;
 
@@ -97,19 +98,21 @@ public class FaceIdenTool {
      * @param faceModel
      * @return
      */
-    public static int getHitIndex(FaceMonitor faceMonitor, FaceModel faceModel) {
+    public static FaceRetrieveResultVO getHitResult(FaceMonitor faceMonitor, FaceModel faceModel) {
         if (faceMonitor == null){
-            return -1;
+            return null;
         }
         FaceRecogRetrieveResult faceRecogRetrieveResult = faceMonitor.faceRecogRetrieveFaceDataset(faceModel);
         if(faceRecogRetrieveResult != null) {
             int index = faceRecogRetrieveResult.getOnePredictIds()[0];
             float score = faceRecogRetrieveResult.getOnePredictScores()[0];
             if (score >= 65) {
-                return index;
+                FaceRetrieveResultVO faceRetrieveResultVO = new FaceRetrieveResultVO();
+                faceRetrieveResultVO.setIndex(index);
+                faceRetrieveResultVO.setScore(score);
             }
         }
-        return -1;
+        return null;
     }
 
     public static RecogResult watchFrame(String idenRoot,  String dataPath) {

+ 5 - 0
src/main/java/com/iden/bms/params/UserLoginParams.java

@@ -20,4 +20,9 @@ public class UserLoginParams {
     @ApiModelProperty("密码")
     private String password;
 
+    /**
+     * 验证码
+     */
+    @ApiModelProperty("验证码")
+    private String securityCode;
 }

+ 8 - 8
src/main/java/com/iden/bms/schedule/WarningPersonTraceSchedule.java

@@ -1,8 +1,8 @@
 package com.iden.bms.schedule;
 
 
-import com.iden.bms.face.FaceIdenService;
-import com.iden.bms.service.TraceService;
+
+import com.iden.bms.service.WarningService;
 import com.iden.common.cache.RedisKeyConstant;
 import com.iden.common.cache.RedisUtil;
 import org.springframework.context.annotation.Configuration;
@@ -20,25 +20,25 @@ import java.util.UUID;
 @Configuration
 @EnableScheduling
 @EnableAsync
-public class WarningPersonTraceSchedule {
+public class WarningSchedule {
 
     @Resource
-    private TraceService traceService;
+    private WarningService warningService;
     @Resource
     private RedisUtil redisUtil;
 
     /**
-     * 把预警人员的轨迹入库
+     * 处理预警
      */
     @Async
     @Scheduled(cron = "20 0/5 * * * ?")
-    public void handleWarningPersonTrace() {
-        String key = RedisKeyConstant.HANDLE_WARNING_PERSION_TRACE;
+    public void handleWarning() {
+        String key = RedisKeyConstant.HANDLE_WARNING;
         String requestId = UUID.randomUUID().toString();
         boolean result = redisUtil.tryLock(key,requestId,5 * 60);
         try {
             if (result) {
-                traceService.handleWarningPersonTrace();
+                warningService.handleWarning();
             }
         } catch (Exception e) {
             e.getMessage();

+ 128 - 2
src/main/java/com/iden/bms/service/SysRoleService.java

@@ -6,9 +6,16 @@ import cn.hutool.core.collection.CollUtil;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.iden.common.entity.IdenRoleMenuRel;
+import com.iden.common.entity.IdenSysMenu;
 import com.iden.common.entity.IdenSysRole;
+import com.iden.common.enums.IsLeafEnum;
+import com.iden.common.exception.BDException;
+import com.iden.common.service.IdenRoleMenuRelService;
+import com.iden.common.service.IdenSysMenuService;
 import com.iden.common.service.IdenSysRoleService;
 import com.iden.common.util.MyBeanUtils;
+import com.iden.common.vo.SysMenuVO;
 import com.iden.common.vo.SysRoleVO;
 import com.iden.common.vo.PageReqVO;
 import com.iden.common.vo.UserLoginedConvertVO;
@@ -31,8 +38,10 @@ public class SysRoleService {
 
     @Resource
     private IdenSysRoleService idenSysRoleService;
-
-    
+    @Resource
+    private IdenRoleMenuRelService idenRoleMenuRelService;
+    @Resource
+    private IdenSysMenuService idenSysMenuService;
 
     /**
      * 查询角色列表
@@ -121,4 +130,121 @@ public class SysRoleService {
 
     }
 
+    /**
+     * 启用停用角色
+     * @param vo
+     */
+    @Transactional(rollbackFor = Exception.class)
+    public void invalidSysRole(SysRoleVO vo) throws BDException {
+        IdenSysRole idenSysRole = new IdenSysRole();
+        BeanUtil.copyProperties(vo, idenSysRole);
+        if(!this.idenSysRoleService.updateById(idenSysRole)){
+            throw new BDException("操作失败!");
+        }
+    }
+
+    /**
+     * 保存角色拥有的菜单
+     * @param vo
+     */
+    @Transactional(rollbackFor = Exception.class)
+    public void saveSysRoleMenu(UserLoginedConvertVO loginUser,SysRoleVO vo) throws BDException {
+        List<Long> hasLeafSysMenuIdList = vo.getHasLeafSysMenuIdList();
+        if(CollUtil.isEmpty(hasLeafSysMenuIdList) || vo.getId() == null){
+           throw new BDException("参数不能是空的");
+        }
+
+        QueryWrapper<IdenRoleMenuRel> queryWrapper0 = new QueryWrapper<>();
+        queryWrapper0.lambda().eq(IdenRoleMenuRel::getRoleId, vo.getId());
+        //获取该角色拥有的所有菜单关系,包括非叶子菜单关系
+        List<IdenRoleMenuRel> hasRoleMenuRelDb = idenRoleMenuRelService.list(queryWrapper0);
+        if (CollUtil.isNotEmpty(hasRoleMenuRelDb)) {
+            //删除数据库里的关系列表,包括非叶子菜单关系,重新添加关系
+            for(IdenRoleMenuRel idenRoleMenuRel : hasRoleMenuRelDb){
+                idenRoleMenuRelService.removeById(idenRoleMenuRel.getId());
+            }
+        }
+
+        for(Long id : hasLeafSysMenuIdList) {
+            IdenRoleMenuRel idenRoleMenuRel = new IdenRoleMenuRel();
+            idenRoleMenuRel.setMenuId(id);
+            idenRoleMenuRel.setRoleId(vo.getId());
+            idenRoleMenuRelService.save(idenRoleMenuRel);
+            //保存父菜单关系
+            saveParentIdenRoleMenuRel(vo.getId(),id);
+        }
+    }
+
+    private void saveParentIdenRoleMenuRel(Long roleId, Long leafMenuId) throws BDException{
+        IdenSysMenu leafMenu = this.idenSysMenuService.getById(leafMenuId);
+        Long pid = leafMenu.getPid();
+        if( pid == -1L) {
+            return;
+        }
+        IdenSysMenu leafMenuParent = this.idenSysMenuService.getById(leafMenuId);
+        if (leafMenuParent == null){
+            return;
+        }
+
+        IdenRoleMenuRel idenRoleMenuRel = new IdenRoleMenuRel();
+        idenRoleMenuRel.setMenuId(pid);
+        idenRoleMenuRel.setRoleId(roleId);
+        idenRoleMenuRelService.save(idenRoleMenuRel);
+
+        saveParentIdenRoleMenuRel(roleId,pid);
+    }
+
+    public List<SysMenuVO> listHasLeafMenu(UserLoginedConvertVO loginUser,Long id){
+        QueryWrapper<IdenRoleMenuRel> queryWrapper0 = new QueryWrapper<>();
+        queryWrapper0.lambda().eq(IdenRoleMenuRel::getRoleId, id);
+        List<IdenRoleMenuRel> hasList = idenRoleMenuRelService.list(queryWrapper0);
+        List<Long> hasMenuIds = new ArrayList<>();
+
+        if(CollUtil.isNotEmpty(hasList)){
+            hasList.forEach(item ->{
+                hasMenuIds.add(item.getMenuId());
+            } );
+        }
+
+        QueryWrapper<IdenSysMenu> queryWrapper = new QueryWrapper<>();
+        queryWrapper.lambda().eq(IdenSysMenu::getIsLeaf, IsLeafEnum.YES.getValue()).in(IdenSysMenu::getId,hasMenuIds);
+        List<IdenSysMenu> list = idenSysMenuService.list(queryWrapper);
+        List<SysMenuVO> listSysMenuVO = new ArrayList<>();
+        if (CollUtil.isNotEmpty(list)){
+            list.forEach(item ->{
+                SysMenuVO vo = new SysMenuVO();
+                BeanUtil.copyProperties(item,vo);
+                vo.setIsLeafName(IsLeafEnum.getValueToName(vo.getIsLeaf()));
+                listSysMenuVO.add(vo);
+            });
+        }
+        return listSysMenuVO;
+    }
+
+    public List<SysMenuVO> listNoHasLeafMenu(UserLoginedConvertVO loginUser,Long id){
+
+        List<SysMenuVO> hasSysMenuVOList = listHasLeafMenu(loginUser,id);
+        List<Long> hasMenuIds = new ArrayList<>();
+
+        if(CollUtil.isNotEmpty(hasSysMenuVOList)){
+            hasSysMenuVOList.forEach(item ->{
+                hasMenuIds.add(item.getId());
+            } );
+        }
+
+        QueryWrapper<IdenSysMenu> queryWrapper = new QueryWrapper<>();
+        queryWrapper.lambda().eq(IdenSysMenu::getIsLeaf, IsLeafEnum.YES.getValue()).notIn(IdenSysMenu::getId,hasMenuIds);
+        List<IdenSysMenu> list = idenSysMenuService.list(queryWrapper);
+        List<SysMenuVO> listSysMenuVO = new ArrayList<>();
+        if (CollUtil.isNotEmpty(list)){
+            list.forEach(item ->{
+                SysMenuVO vo = new SysMenuVO();
+                BeanUtil.copyProperties(item,vo);
+                vo.setIsLeafName(IsLeafEnum.getValueToName(vo.getIsLeaf()));
+                listSysMenuVO.add(vo);
+            });
+        }
+        return listSysMenuVO;
+    }
+
 }

+ 31 - 2
src/main/java/com/iden/bms/service/SysUserService.java

@@ -8,6 +8,8 @@ import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.iden.bms.params.ModifyPasswordParams;
+import com.iden.common.cache.RedisKeyConstant;
+import com.iden.common.cache.RedisUtil;
 import com.iden.common.entity.*;
 
 import com.iden.common.enums.UserRoleEnum;
@@ -21,6 +23,7 @@ import com.iden.common.vo.UserLoginedConvertVO;
 
 import com.iden.common.vo.SysUserVO;
 import org.apache.commons.codec.digest.DigestUtils;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.BeanUtils;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
@@ -40,10 +43,21 @@ public class SysUserService {
 
     @Resource
     private IdenSysUserService idenSysUserService;
+    @Resource
+    RedisUtil redisUtil;
+
 
+    public UserLoginedConvertVO getLoginUser(String username, String password, String securityCode) throws BDException {
+
+        if (StringUtils.isEmpty(username) || StringUtils.isEmpty(password) || StringUtils.isEmpty(securityCode)) {
+            throw new BDException("登录参数不能为空");
+        }
 
+        String securityCodeRedis = (String)redisUtil.hget(RedisKeyConstant.LOGIN_VALIDATE_CODE,username);
+        if (!securityCode.equalsIgnoreCase(securityCodeRedis)){
+            throw new BDException("验证码不正确");
+        }
 
-    public UserLoginedConvertVO getLoginUser(String username, String password) {
         UserLoginedConvertVO userLoginedConvertVO = null;
 
         QueryWrapper<IdenSysUser>  userQueryWrapper = new QueryWrapper<>();
@@ -155,10 +169,25 @@ public class SysUserService {
     }
 
     /**
-     * 重置用户密码
+     * 启用停用角色
      * @param vo
      */
     @Transactional(rollbackFor = Exception.class)
+    public void invalidSysUser(SysUserVO vo) throws BDException {
+        IdenSysUser idenSysUser = new IdenSysUser();
+        BeanUtil.copyProperties(vo, idenSysUser);
+        if(!this.idenSysUserService.updateById(idenSysUser)){
+            throw new BDException("操作失败!");
+        }
+    }
+
+
+
+    /**
+     * 重置用户密码
+     * @param
+     */
+    @Transactional(rollbackFor = Exception.class)
     public boolean resetPassword(Long id){
         UpdateWrapper<IdenSysUser> updateWrapper = new UpdateWrapper<>();
         updateWrapper.lambda().eq(IdenSysUser::getId,id)

+ 13 - 18
src/main/java/com/iden/bms/service/TraceService.java

@@ -10,6 +10,7 @@ import com.iden.common.exception.BDException;
 
 import com.iden.common.util.DateUtils;
 import com.iden.common.util.ImgUtil;
+import com.iden.common.vo.FaceRetrieveResultVO;
 import com.iden.common.vo.TraceVO;
 import com.iden.common.vo.UserLoginedConvertVO;
 import org.apache.commons.lang3.StringUtils;
@@ -79,7 +80,7 @@ public class TraceService {
      * 图像识别,使用特征码查询图像库,得到图库表中对应的数据列表
      * @return
              */
-    public List<TraceVO> listUploadImagesTrace(String images, String beginTime, String endTime, UserLoginedConvertVO loginUser) {
+    public List<TraceVO> listUploadImagesTrace(String imageNames, String beginTime, String endTime, UserLoginedConvertVO loginUser) {
         Date dateBegin = null;
         if(StringUtils.isNotEmpty(beginTime)){
             dateBegin  = DateUtils.strToDate(beginTime,"yyyy-MM-dd HH:mm:ss");
@@ -89,30 +90,31 @@ public class TraceService {
             dateEnd  = DateUtils.strToDate(endTime,"yyyy-MM-dd HH:mm:ss");
         }
 
-        if(images.endsWith(",")) {
-            images = images.substring(0, images.length() - 1);
+        if(imageNames.endsWith(",")) {
+            imageNames = imageNames.substring(0, imageNames.length() - 1);
         }
 
-        String[] imageArr = images.split(",");
-        File[] imgFiles = new File[imageArr.length];
-        for (int i = 0; i < imageArr.length; i++) {
-            if (StringUtils.isNotEmpty(imageArr[i])){
-                imgFiles[i] = new File(idenRoot + "data/trace/" + imageArr[i]);
+        String[] imageNameArr = imageNames.split(",");
+        File[] imgFiles = new File[imageNameArr.length];
+        for (int i = 0; i < imageNameArr.length; i++) {
+            if (StringUtils.isNotEmpty(imageNameArr[i])){
+                imgFiles[i] = new File(idenRoot + "data/trace/" + imageNameArr[i]);
             }
         }
 
         //上传的图像的特征码结构体数组
         FaceModel[] faceModels = FaceIdenTool.extractFeature(idenRoot,imgFiles);
 
-        //初始化引擎,加载摄像头上传的图像人脸特征库
+        //初始化引擎,加载摄像头上传的在时间段内的图像人脸特征库
         File cameraImageDirFile = new File(idenRoot + "data/final/camera/image");
         File[] cameraImageFiles = getCameraImageFiles(cameraImageDirFile,dateBegin,dateEnd);
         FaceMonitor faceMonitorCamera = FaceIdenTool.initFaceMonitor(idenRoot,cameraImageFiles);
 
         List<TraceVO> result = new ArrayList<>();
         for(FaceModel faceModel : faceModels) {
-           int hitIndex = FaceIdenTool.getHitIndex(faceMonitorCamera,faceModel);
-           if (hitIndex != -1) {
+            FaceRetrieveResultVO faceRetrieveResultVO = FaceIdenTool.getHitResult(faceMonitorCamera,faceModel);
+           if (faceRetrieveResultVO != null) {
+               int hitIndex = faceRetrieveResultVO.getIndex();
                IdenFaceImage idenFaceImage = faceImageService.getIdenFaceImageByImageFileName(cameraImageFiles[hitIndex].getName());
                if(idenFaceImage != null){
                    TraceVO vo = new TraceVO();
@@ -150,11 +152,4 @@ public class TraceService {
         return list.toArray(resuit);
     }
 
-    /**
-     * 预警人员轨迹数据入库
-     * 图像识别,使用特征码查询图像库,得到图库表中对应的数据列表
-     */
-    public  void handleWarningPersonTrace() {
-
-    }
 }

+ 85 - 0
src/main/java/com/iden/bms/service/WarningService.java

@@ -0,0 +1,85 @@
+package com.iden.bms.service;
+
+
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.collection.CollUtil;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.iden.common.entity.IdenFaceImage;
+import com.iden.common.entity.IdenWarningEvent;
+import com.iden.common.entity.IdenWarningPerson;
+import com.iden.common.entity.IdenWarningPersonTrace;
+import com.iden.common.enums.HandleWarningStatusEnum;
+import com.iden.common.exception.BDException;
+import com.iden.common.service.*;
+
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ *
+ * @author makejava
+ * @since 2021-05-21 00:08:38
+ */
+@Service
+public class WarningService {
+
+    @Resource
+    private IdenFaceImageService idenFaceImageService;
+    @Resource
+    private IdenWarningEventService idenWarningEventService;
+    @Resource
+    private IdenWarningPersonService idenWarningPersonService;
+    @Resource
+    private IdenWarningPersonTraceService idenWarningPersonTraceService;
+    @Resource
+    private IdenWarningStaService idenWarningStaService;
+
+    /**
+     * 处理预警
+     * @return
+     */
+    public void handleWarning() throws BDException {
+      //查询没有处理过的人脸图像数据
+        QueryWrapper<IdenFaceImage> queryWrapper = new QueryWrapper<>();
+        queryWrapper.lambda().eq(IdenFaceImage::getHandleWarningStatus, HandleWarningStatusEnum.NO_HANDLE.getValue())
+        .last("limit 5000"); //每次处理5000条
+        List<IdenFaceImage> idenFaceImageList = idenFaceImageService.list(queryWrapper);
+        if (CollUtil.isEmpty(idenFaceImageList)) {
+            return;
+        }
+
+        for (IdenFaceImage idenFaceImage : idenFaceImageList) {
+            //去除同一个摄像头下2分钟内同一个人的人脸图像
+            if(true){
+               continue;
+            }
+            //重点人员识别预警
+            String type = idenFaceImage.getType();
+            if (StringUtils.isNotEmpty(type) && type.indexOf("1") != -1) {
+                IdenWarningPerson idenWarningPerson = new IdenWarningPerson();
+
+                this.idenWarningPersonService.save(idenWarningPerson);
+
+                IdenWarningEvent idenWarningEvent = new IdenWarningEvent();
+                idenWarningEvent.setWarningPersonId(idenWarningPerson.getId());
+                this.idenWarningEventService.save(idenWarningEvent);
+
+                IdenWarningPersonTrace idenWarningPersonTrace = new IdenWarningPersonTrace();
+                BeanUtil.copyProperties(idenFaceImage,idenWarningPersonTrace);
+                idenWarningPersonTrace.setId(null);
+                idenWarningPersonTrace.setWarningPersonId(idenWarningPerson.getId());
+                this.idenWarningPersonTraceService.save(idenWarningPersonTrace);
+
+            }
+        }
+
+    }
+
+
+}

+ 7 - 3
src/main/java/com/iden/common/cache/RedisKeyConstant.java

@@ -16,7 +16,11 @@ public class RedisKeyConstant {
     public static final String BACK_LOGIN_INFO = "BACK:LOGIN";
     public static final int BACK_LOGIN_INFO_TIME = 3600 * 24;
 
-    public static final String HANDLE_CAMERA_IMAGE = "HANDLE_CAMERA_IMAGE";
-    public static final String HANDLE_CAMERA_VIDEO = "HANDLE_CAMERA_VIDEO";
-    public static final String HANDLE_WARNING_PERSION_TRACE = "HANDLE_WARNING_PERSION_TRACE";
+    public static final String HANDLE_CAMERA_IMAGE = "HANDLE:CAMERA_IMAGE";
+    public static final String HANDLE_CAMERA_VIDEO = "HANDLE:CAMERA_VIDEO";
+    public static final String HANDLE_WARNING = "HANDLE:WARNING";
+
+    public static final String LOGIN_VALIDATE_CODE = "LOGIN:VALIDATE_CODE";
+    public static final int LOGIN_VALIDATE_CODE_TIME = 1800;
+
 }

+ 1 - 1
src/main/java/com/iden/common/constant/Constants.java

@@ -16,6 +16,6 @@ public interface Constants {
      */
     String LOGIN_TOKEN_KEY = "token";
 
-    String VALID_STATUS = "valid_status";
+
 
 }

+ 4 - 0
src/main/java/com/iden/common/entity/IdenFaceImage.java

@@ -97,6 +97,10 @@ public class IdenFaceImage implements Serializable {
     private Double similarity;
 
 
+    @ApiModelProperty("处理报警状态,0未处理,1已处理")
+    @TableField("HANDLE_WARNING_STATUS")
+    private int handleWarningStatus;
+
     @ApiModelProperty("备注")
     @TableField("REMARK")
     private String remark;

+ 2 - 2
src/main/java/com/iden/common/entity/IdenRoleMenuRel.java

@@ -37,12 +37,12 @@ public class IdenRoleMenuRel implements Serializable {
 
     @ApiModelProperty("角色ID")
     @TableField("ROLE_ID")
-    private String roleId;
+    private Long roleId;
 
 
     @ApiModelProperty("菜单ID")
     @TableField("MENU_ID")
-    private String menuId;
+    private Long menuId;
 
 
 }

+ 63 - 0
src/main/java/com/iden/common/entity/IdenSysLog.java

@@ -0,0 +1,63 @@
+package com.iden.common.entity;
+
+import java.util.Date;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+
+import java.time.LocalDateTime;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+
+import java.io.Serializable;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ * 系统日志表(IdenSysLog)实体类
+ *
+ * @author makejava
+ * @since 2021-12-29 14:08:35
+ */
+
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@TableName("iden_sys_log")
+@ApiModel(value = "系统日志表", description = "")
+public class IdenSysLog implements Serializable {
+    private static final long serialVersionUID = -80515949956425107L;
+
+    @TableId(value = "ID", type = IdType.AUTO)
+    private Long id;
+
+
+    @ApiModelProperty("日志类型")
+    @TableField("LOG_TYPE")
+    private String logType;
+
+
+    @ApiModelProperty("操作时间")
+    @TableField("CREATE_TIME")
+    private Date createTime;
+
+
+    @ApiModelProperty("操作账号")
+    @TableField("USERNAME")
+    private String username;
+
+
+    @ApiModelProperty("操作内容")
+    @TableField("CONTENT")
+    private String content;
+
+    @ApiModelProperty("IP地址")
+    @TableField("IP")
+    private String ip;
+
+}

+ 3 - 0
src/main/java/com/iden/common/entity/IdenSysMenu.java

@@ -64,5 +64,8 @@ public class IdenSysMenu implements Serializable {
     @TableField("SORT")
     private Integer sort;
 
+    @ApiModelProperty("是否叶子菜单: 0是,1不是")
+    @TableField("IS_LEAF")
+    private String isLeaf;
 
 }

+ 4 - 0
src/main/java/com/iden/common/entity/IdenWarningEvent.java

@@ -37,6 +37,10 @@ public class IdenWarningEvent implements Serializable {
     private Long id;
 
 
+    @ApiModelProperty("预警人员表ID")
+    @TableField("WARNING_PERSON_ID")
+    private Long warningPersonId;
+
     @ApiModelProperty("数据时间")
     @TableField("DATA_TIME")
     private Date dataTime;

+ 1 - 1
src/main/java/com/iden/common/entity/IdenWarningPersonTrace.java

@@ -42,7 +42,7 @@ public class IdenWarningPersonTrace implements Serializable {
     private Long warningPersonId;
 
 
-    @ApiModelProperty("图像编码")
+    @ApiModelProperty("图像")
     @TableField("IMAGE")
     private String image;
 

+ 4 - 4
src/main/java/com/iden/common/enums/CameraTypeEnum.java

@@ -23,13 +23,13 @@ public enum CameraTypeEnum {
         return value;
     }
 
-    public static String getValueToName(String code){
-        if (StrUtil.isEmpty(code)){
+    public static String getValueToName(String value){
+        if (StrUtil.isEmpty(value)){
             return null;
         }
-        if (VIDEO.getValue().equals(code)){
+        if (VIDEO.getValue().equals(value)){
             return  VIDEO.name;
-        }else if (SNAP.getValue().equals(code)){
+        }else if (SNAP.getValue().equals(value)){
             return  SNAP.name;
         }
 

+ 4 - 4
src/main/java/com/iden/common/enums/ConnectStatusEnum.java

@@ -23,13 +23,13 @@ public enum ConnectStatusEnum {
         return value;
     }
 
-    public static String getValueToName(String code){
-        if (StrUtil.isEmpty(code)){
+    public static String getValueToName(String value){
+        if (StrUtil.isEmpty(value)){
             return null;
         }
-        if (DISCONNECT.getValue().equals(code)){
+        if (DISCONNECT.getValue().equals(value)){
             return  DISCONNECT.name;
-        }else if (CONNECTED.getValue().equals(code)){
+        }else if (CONNECTED.getValue().equals(value)){
             return  CONNECTED.name;
         }
 

+ 35 - 0
src/main/java/com/iden/common/enums/HandleWarningStatusEnum.java

@@ -0,0 +1,35 @@
+package com.iden.common.enums;
+
+
+
+/**
+ * @Author:java
+ * @Date: 2021/05/27
+ */
+public enum HandleWarningStatusEnum {
+    /**
+     * 启用停用
+     */
+    NO_HANDLE(0,"未处理"),
+    HANDLED(1,"已处理");
+    private int value;
+    private String name;
+    HandleWarningStatusEnum(int value, String name) {
+        this.value = value;
+        this.name = name;
+    }
+    public int getValue() {
+        return value;
+    }
+
+    public static String getValueToName(int value){
+
+        if (NO_HANDLE.getValue() == value){
+            return  NO_HANDLE.name;
+        }else if (HANDLED.getValue() == value){
+            return  HANDLED.name;
+        }
+
+        return null;
+    }
+}

+ 38 - 0
src/main/java/com/iden/common/enums/IsLeafEnum.java

@@ -0,0 +1,38 @@
+package com.iden.common.enums;
+
+
+import cn.hutool.core.util.StrUtil;
+
+/**
+ * @Author:java
+ * @Date: 2021/05/27
+ */
+public enum IsLeafEnum {
+    /**
+     * 是否叶子菜单
+     */
+    YES("0","是"),
+    NO("1","不是");
+    private String value;
+    private String name;
+    IsLeafEnum(String value, String name) {
+        this.value = value;
+        this.name = name;
+    }
+    public String getValue() {
+        return value;
+    }
+
+    public static String getValueToName(String value){
+        if (StrUtil.isEmpty(value)){
+            return null;
+        }
+        if (YES.getValue().equals(value)){
+            return  YES.name;
+        }else if (NO.getValue().equals(value)){
+            return  NO.name;
+        }
+
+        return null;
+    }
+}

+ 3 - 3
src/main/java/com/iden/common/enums/PersonTypeEnum.java

@@ -25,13 +25,13 @@ public enum PersonTypeEnum {
         return value;
     }
 
-    public static String getValueToName(String code){
-        if (StrUtil.isEmpty(code)){
+    public static String getValueToName(String value){
+        if (StrUtil.isEmpty(value)){
             return null;
         }
 
         String names = "";
-        String[] types = code.split(",");
+        String[] types = value.split(",");
         if (types.length > 0){
             for(String type : types){
                 if (STRANGER.getValue().equals(type)){

+ 9 - 9
src/main/java/com/iden/common/enums/PopulationTypeEnum.java

@@ -28,23 +28,23 @@ public enum PopulationTypeEnum {
         return value;
     }
 
-    public static String getValueToName(String code){
-        if (StrUtil.isEmpty(code)){
+    public static String getValueToName(String value){
+        if (StrUtil.isEmpty(value)){
             return null;
         }
-        if (CHANGZHU.getValue().equals(code)){
+        if (CHANGZHU.getValue().equals(value)){
             return  CHANGZHU.name;
-        } else if (ZANZHU.getValue().equals(code)){
+        } else if (ZANZHU.getValue().equals(value)){
             return  ZANZHU.name;
-        } else if (JINGWAICHANGZHU.getValue().equals(code)){
+        } else if (JINGWAICHANGZHU.getValue().equals(value)){
             return  JINGWAICHANGZHU.name;
-        } else if (LIUDONG.getValue().equals(code)){
+        } else if (LIUDONG.getValue().equals(value)){
             return  LIUDONG.name;
-        } else if (JIZHU.getValue().equals(code)){
+        } else if (JIZHU.getValue().equals(value)){
             return  JIZHU.name;
-        } else if (LINSHIZHUSU.getValue().equals(code)){
+        } else if (LINSHIZHUSU.getValue().equals(value)){
             return  LINSHIZHUSU.name;
-        } else if (OTHER.getValue().equals(code)){
+        } else if (OTHER.getValue().equals(value)){
             return  OTHER.name;
         }
 

+ 4 - 4
src/main/java/com/iden/common/enums/TrueFalseEnum.java

@@ -23,13 +23,13 @@ public enum TrueFalseEnum {
         return value;
     }
 
-    public static String getValueToName(String code){
-        if (StrUtil.isEmpty(code)){
+    public static String getValueToName(String value){
+        if (StrUtil.isEmpty(value)){
             return null;
         }
-        if (TRUE.getValue().equals(code)){
+        if (TRUE.getValue().equals(value)){
             return  TRUE.name;
-        }else if (FALSE.getValue().equals(code)){
+        }else if (FALSE.getValue().equals(value)){
             return  FALSE.name;
         }
 

+ 5 - 5
src/main/java/com/iden/common/enums/UserRoleEnum.java

@@ -25,15 +25,15 @@ public enum UserRoleEnum {
         return value;
     }
 
-    public static String getValueToName(String code){
-        if (StrUtil.isEmpty(code)){
+    public static String getValueToName(String value){
+        if (StrUtil.isEmpty(value)){
             return null;
         }
-        if (HIGH.getValue().equals(code)){
+        if (HIGH.getValue().equals(value)){
             return  HIGH.name;
-        } else if (MIDDLE.getValue().equals(code)){
+        } else if (MIDDLE.getValue().equals(value)){
             return MIDDLE.name;
-        } else if (LOW.getValue().equals(code)){
+        } else if (LOW.getValue().equals(value)){
             return LOW.name;
         }
 

+ 4 - 4
src/main/java/com/iden/common/enums/ValidStatusEnum.java

@@ -23,13 +23,13 @@ public enum ValidStatusEnum {
         return value;
     }
 
-    public static String getValueToName(String code){
-        if (StrUtil.isEmpty(code)){
+    public static String getValueToName(String value){
+        if (StrUtil.isEmpty(value)){
             return null;
         }
-        if (VALID.getValue().equals(code)){
+        if (VALID.getValue().equals(value)){
             return  VALID.name;
-        }else if (INVALID.getValue().equals(code)){
+        }else if (INVALID.getValue().equals(value)){
             return  INVALID.name;
         }
 

+ 2 - 1
src/main/java/com/iden/common/interceptor/AuthorizationInterceptorConf.java

@@ -29,7 +29,8 @@ public class AuthorizationInterceptorConf extends WebMvcConfigurerAdapter implem
             "/swagger-ui.html",
             "/static/**",
             //不拦截登录接口
-            "/bms/login"
+            "/bms/login",
+            "/bms/getVerifyCode"
     };
 
 

+ 15 - 0
src/main/java/com/iden/common/mapper/IdenSysLogMapper.java

@@ -0,0 +1,15 @@
+package com.iden.common.mapper;
+
+import com.iden.common.entity.IdenSysLog;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+
+/**
+ * 系统日志表(IdenSysLog)表数据库访问层
+ *
+ * @author makejava
+ * @since 2021-12-29 14:08:35
+ */
+public interface IdenSysLogMapper extends BaseMapper<IdenSysLog> {
+
+}

+ 14 - 0
src/main/java/com/iden/common/service/IdenSysLogService.java

@@ -0,0 +1,14 @@
+package com.iden.common.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.iden.common.entity.IdenSysLog;
+
+/**
+ * 系统日志表(IdenSysLog)表服务接口
+ *
+ * @author makejava
+ * @since 2021-12-29 14:08:36
+ */
+public interface IdenSysLogService extends IService<IdenSysLog> {
+
+}

+ 18 - 0
src/main/java/com/iden/common/service/impl/IdenSysLogServiceImpl.java

@@ -0,0 +1,18 @@
+package com.iden.common.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.iden.common.mapper.IdenSysLogMapper;
+import com.iden.common.entity.IdenSysLog;
+import com.iden.common.service.IdenSysLogService;
+import org.springframework.stereotype.Service;
+
+/**
+ * 系统日志表(IdenSysLog)表服务实现类
+ *
+ * @author makejava
+ * @since 2021-12-29 14:08:36
+ */
+@Service
+public class IdenSysLogServiceImpl extends ServiceImpl<IdenSysLogMapper, IdenSysLog> implements IdenSysLogService {
+
+}

+ 170 - 0
src/main/java/com/iden/common/util/VerifyCodeUtil.java

@@ -0,0 +1,170 @@
+package com.iden.common.util;
+
+import java.awt.Color;
+import java.awt.Font;
+import java.awt.Graphics2D;
+import java.awt.image.BufferedImage;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.util.Arrays;
+import java.util.Random;
+
+import javax.imageio.ImageIO;
+
+public class VerifyCodeUtil {
+
+    /**
+     * 验证码难度级别 Simple-数字 Medium-数字和小写字母 Hard-数字和大小写字母
+     */
+    public enum SecurityCodeLevel {
+        Simple, Medium, Hard
+    };
+
+    /**
+     * 产生默认验证码,4位中等难度
+     *
+     * @return
+     */
+    public static String getSecurityCode() {
+        return getSecurityCode(4, SecurityCodeLevel.Medium, false);
+    }
+
+    /**
+     * 产生长度和难度任意的验证码
+     *
+     * @param length
+     * @param level
+     * @param isCanRepeat
+     * @return
+     */
+    public static String getSecurityCode(int length, SecurityCodeLevel level, boolean isCanRepeat) {
+        // 随机抽取len个字符
+        int len = length;
+        // 字符集合(--除去易混淆的数字0,1,字母l,o,O)
+        char[] codes = {
+                '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
+                'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
+                'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'
+        };
+        // 根据不同难度截取字符串
+        if (level == SecurityCodeLevel.Simple) {
+            codes = Arrays.copyOfRange(codes, 0, 10);
+        } else if (level == SecurityCodeLevel.Medium) {
+            codes = Arrays.copyOfRange(codes, 0, 36);
+        }
+        // 字符集和长度
+        int n = codes.length;
+        // 抛出运行时异常
+        if (len > n && isCanRepeat == false) {
+            throw new RuntimeException(String.format("调用SecurityCode.getSecurityCode(%1$s,%2$s,%3$s)出现异常," + "当isCanRepeat为%3$s时,传入参数%1$s不能大于%4$s", len, level, isCanRepeat, n));
+        }
+        // 存放抽取出来的字符
+        char[] result = new char[len];
+        // 判断能否出现重复字符
+        if (isCanRepeat) {
+            for (int i = 0; i < result.length; i++) {
+                // 索引0 and n-1
+                int r = (int) (Math.random() * n);
+                // 将result中的第i个元素设置为code[r]存放的数值
+                result[i] = codes[r];
+            }
+        } else {
+            for (int i = 0; i < result.length; i++) {
+                // 索引0 and n-1
+                int r = (int) (Math.random() * n);
+                // 将result中的第i个元素设置为code[r]存放的数值
+                result[i] = codes[r];
+                // 必须确保不会再次抽取到那个字符,这里用数组中最后一个字符改写code[r],并将n-1
+                codes[r] = codes[n - 1];
+                n--;
+            }
+        }
+        return String.valueOf(result);
+    }
+
+    /**
+     * 生成验证码图片
+     * @param securityCode
+     * @return
+     */
+    public static BufferedImage createImage(String securityCode){
+
+        int codeLength = securityCode.length();//验证码长度
+
+        int fontSize = 18;//字体大小
+
+        int fontWidth = fontSize+1;
+
+        //图片宽高
+
+        int width = codeLength*fontWidth+6;
+        int height = fontSize*2+1;
+        //图片
+
+        BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
+
+        Graphics2D g = image.createGraphics();
+
+        g.setColor(Color.WHITE);//设置背景色
+
+        g.fillRect(0, 0, width, height);//填充背景
+
+        g.setColor(Color.LIGHT_GRAY);//设置边框颜色
+
+        g.setFont(new Font("Arial", Font.BOLD, height-2));//边框字体样式
+
+        g.drawRect(0, 0, width-1, height-1);//绘制边框
+
+        //绘制噪点
+
+        Random rand = new Random();
+
+        g.setColor(Color.LIGHT_GRAY);
+
+        for (int i = 0; i < codeLength*6; i++) {
+
+            int x = rand.nextInt(width);
+
+            int y = rand.nextInt(height);
+
+            g.drawRect(x, y, 1, 1);//绘制1*1大小的矩形
+
+        }
+
+        //绘制验证码
+
+        int codeY = height-10;
+
+        g.setColor(new Color(19,148,246));
+
+        //Georgia  是个字体,如果想用中文要指定中文字体;eg:"宋体";
+        //g.setFont(new Font("Georgia", Font.BOLD, fontSize));
+        g.setFont(new Font("宋体", Font.BOLD, fontSize));
+        for(int i=0;i<codeLength;i++){
+            double deg=new Random().nextDouble()*20;
+            g.rotate(Math.toRadians(deg), i*16+13,codeY-7.5);
+            g.drawString(String.valueOf(securityCode.charAt(i)), i*16+5, codeY);
+            g.rotate(Math.toRadians(-deg), i*16+13,codeY-7.5);
+        }
+
+        g.dispose();//关闭资源
+
+        return image;
+
+    }
+
+    //测试
+    public static void main(String[] args) throws IOException{
+        //获得随机字符
+        String securityCode = getSecurityCode();
+        //输出随机字符
+        System.out.println("===="+securityCode);
+        //生成图片
+        BufferedImage image = createImage(securityCode);
+        //将生成的验证码图片以png(1.png)的格式输出到D盘        "D:\\1.png" == "D:/1.png"
+        ImageIO.write(image, "png", new FileOutputStream(new File("D:\\1.png")));
+    }
+
+
+}

+ 3 - 0
src/main/java/com/iden/common/vo/FaceImageVO.java

@@ -75,6 +75,9 @@ public class FaceImageVO implements Serializable {
     @ApiModelProperty("相似度")
     private Double similarity;
 
+    @ApiModelProperty("处理报警状态,0未处理,1已处理")
+    private int handleWarningStatus;
+
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8")
     @ApiModelProperty("createTime")
     private Date createTime;

+ 13 - 0
src/main/java/com/iden/common/vo/FaceRetrieveResultVO.java

@@ -0,0 +1,13 @@
+package com.iden.common.vo;
+
+import lombok.Data;
+
+
+@Data
+public class FaceRetrieveResultVO {
+
+    private int index;
+
+    private float score;
+
+}

+ 5 - 0
src/main/java/com/iden/common/vo/SysMenuVO.java

@@ -46,6 +46,11 @@ public class SysMenuVO implements Serializable {
     @ApiModelProperty("层级关系:1:代表父级,2:代表第一层子集,3:代表第二层子集,依次往下")
     private Integer level;
 
+    @ApiModelProperty("是否叶子菜单: 0是,1不是")
+    private String isLeaf;
+
+    @ApiModelProperty("是否叶子菜单名: 0是,1不是")
+    private String isLeafName;
 
     @ApiModelProperty("排序号")
     private Integer sort;

+ 4 - 1
src/main/java/com/iden/common/vo/SysRoleVO.java

@@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
 import com.fasterxml.jackson.annotation.JsonFormat;
+import com.iden.common.entity.IdenRoleMenuRel;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
@@ -13,6 +14,7 @@ import lombok.experimental.Accessors;
 
 import java.io.Serializable;
 import java.util.Date;
+import java.util.List;
 
 /**
  * 角色信息表(IdenSysRole)实体类
@@ -54,5 +56,6 @@ public class SysRoleVO implements Serializable {
     @ApiModelProperty("modifyTime")
     private Date modifyTime;
 
-
+    @ApiModelProperty("角色拥有的叶子菜单Id列表")
+    private List<Long> hasLeafSysMenuIdList;
 }

+ 0 - 8
src/main/java/com/iden/common/vo/TraceVO.java

@@ -20,8 +20,6 @@ import java.util.Date;
 public class TraceVO implements Serializable {
     private static final long serialVersionUID = -44732106174401548L;
 
-    private Long id;
-
     @ApiModelProperty("预警人员表ID")
     private Long warningPersonId;
 
@@ -52,10 +50,4 @@ public class TraceVO implements Serializable {
     private Double latitude;
 
 
-    @ApiModelProperty("createTime")
-    private Date createTime;
-
-
-    @ApiModelProperty("modifyTime")
-    private Date modifyTime;
 }

+ 6 - 0
src/main/resources/mybatis/IdenSysLogMapper.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.iden.common.mapper.IdenSysLogMapper">
+
+
+</mapper>