list = new ArrayList<>();
+ if (count > 0) {
+ list = sysUserService.getPageList(sysUserReq);
+ }
+ PageResult result = new PageResult(sysUserReq.getPageNo(), sysUserReq.getPageSize(), count, list);
+ return RespJSON.success(result);
+ }
+
+ /**
+ * 主键查询
+ *
+ * @param id id
+ * @return RespJSON
+ */
+ @RequestMapping("/getOneById")
+ public RespJSON getOneById(Long id) {
+ return RespJSON.success(sysUserService.getOneById(id));
+ }
+
+ /**
+ * 主键查询
+ *
+ * @param id id
+ * @return RespJSON
+ */
+ @PostMapping("/delete")
+ public RespJSON delete(Long id, @SessionAttribute(CurrentUserUtils.SYSTEM_USER) SysUser loginSysUser) {
+ sysUserService.delete(id, loginSysUser.getUsername());
+ return RespJSON.success();
+ }
+
+
+ /**
+ * 登陆
+ *
+ * param username 用户名
+ * param password 密码
+ *
+ * @return
+ */
+ @PostMapping("/login")
+ public RespJSON login(@RequestBody SysUser sysUser, HttpSession webSession) {
+ SysUser sysUserDB = sysUserService.login(sysUser, webSession);
+ webSession.setAttribute(CurrentUserUtils.SYSTEM_USER, sysUserDB);
+ return RespJSON.success(webSession.getId());
+ }
+
+ /**
+ * 注销
+ *
+ * @param webSession
+ * @return
+ */
+ @PostMapping("/logout")
+ public RespJSON logout(HttpSession webSession) {
+ webSession.removeAttribute(CurrentUserUtils.SYSTEM_USER);
+ return RespJSON.success();
+ }
+
+ /**
+ * 获取当前用户信息
+ *
+ * @param loginSysUser
+ * @return
+ */
+ @GetMapping("/getCurrentUser")
+ public RespJSON getCurrentUserAndRole(@SessionAttribute(CurrentUserUtils.SYSTEM_USER) SysUser loginSysUser) {
+ List currentUserRole = sysRoleService.getCurrentUserRole(loginSysUser.getId());
+
+ loginSysUser.setSysRoleList(currentUserRole);
+ List sysResourceIdentityList = new ArrayList<>();
+ List sysResourceList = new ArrayList<>();
+
+ roleResourceService.buildUserResourceListAndIdentityList(currentUserRole, sysResourceList, sysResourceIdentityList);
+ if (CollectionUtils.isEmpty(currentUserRole)) {
+ currentUserRole = new ArrayList<>();
+ SysRole sysRole = new SysRole();
+ sysRole.setName("首页");
+ currentUserRole.add(sysRole);
+ loginSysUser.setSysRoleList(currentUserRole);
+ }
+ loginSysUser.setSysResourceList(sysResourceList);
+ loginSysUser.setSysResourceIdentityList(sysResourceIdentityList);
+ return RespJSON.success(loginSysUser);
+ }
+
+ /**
+ * 修改密码
+ *
+ * @param oldPassword
+ * @param newPassword
+ * @param loginSysUser
+ * @return
+ */
+ @PostMapping("/updatePassword")
+ public RespJSON login(String oldPassword, String newPassword, @SessionAttribute(CurrentUserUtils.SYSTEM_USER) SysUser loginSysUser) {
+ WJAssert.isMaxLength(oldPassword, 32, "旧密码错误");
+ WJAssert.isMaxLength(newPassword, 32, "新密码错误");
+ sysUserService.updatePassword(oldPassword, newPassword, loginSysUser.getId());
+ return RespJSON.success();
+ }
+}
diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/admin/src/main/java/com/arm/equipment/system/admin/controller/system/SysUserRoleController.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/admin/src/main/java/com/arm/equipment/system/admin/controller/system/SysUserRoleController.java
new file mode 100644
index 0000000..19ba719
--- /dev/null
+++ b/src/arm-equipment-system-parent/arm-equipment-system-parent/admin/src/main/java/com/arm/equipment/system/admin/controller/system/SysUserRoleController.java
@@ -0,0 +1,105 @@
+package com.arm.equipment.system.admin.controller.system;
+
+import com.arm.equipment.system.admin.util.CurrentUserUtils;
+import com.arm.equipment.system.admin.controller.BaseController;
+import com.arm.equipment.system.data.domain.PageResult;
+import com.arm.equipment.system.data.domain.system.SysUser;
+import com.arm.equipment.system.data.domain.system.SysUserRole;
+import com.arm.equipment.system.data.service.system.ISysUserRoleService;
+import com.arm.equipment.system.data.service.system.ISysUserService;
+import com.arm.equipment.system.data.vo.RespJSON;
+import com.arm.equipment.system.data.vo.system.AddRoleVO;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * 系统--用户角色关联表
+ *
+ * @author admin
+ * @date 2021年10月19日 15:06:59
+ */
+@RestController
+@RequestMapping("/system/sysUserRole")
+public class SysUserRoleController extends BaseController {
+
+ @Autowired
+ private ISysUserRoleService sysUserRoleService;
+ @Autowired
+ private ISysUserService sysUserService;
+
+
+ /**
+ * 保存或更新
+ *
+ * @param sysUserRoleReq sysUserRoleReq
+ * @return RespJSON
+ */
+ @PostMapping("/save")
+ public RespJSON save(@RequestBody SysUserRole sysUserRoleReq, @SessionAttribute(CurrentUserUtils.SYSTEM_USER) SysUser loginSysUser) {
+ sysUserRoleService.save(sysUserRoleReq, loginSysUser.getOperator());
+ return RespJSON.success();
+ }
+
+ /**
+ * 分页查询
+ *
+ * @param sysUserRoleReq sysUserRoleReq
+ * @return RespJSON
+ */
+ @PostMapping("/getPageList")
+ public RespJSON getPageList(@RequestBody SysUserRole sysUserRoleReq) {
+ int count = sysUserRoleService.getCount(sysUserRoleReq);
+ List list = new ArrayList<>();
+ if (count > 0) {
+ list = sysUserRoleService.getPageList(sysUserRoleReq);
+ }
+ PageResult result = new PageResult(sysUserRoleReq.getPageNo(), sysUserRoleReq.getPageSize(), count, list);
+ return RespJSON.success(result);
+ }
+
+ /**
+ * 主键查询
+ *
+ * @param id id
+ * @return RespJSON
+ */
+ @RequestMapping("/getOneById")
+ public RespJSON getOneById(Long id) {
+ return RespJSON.success(sysUserRoleService.getOneById(id));
+ }
+
+ /**
+ * 为用户分配角色
+ *
+ * @param addRoleVO
+ * @param loginSysUser
+ * @return
+ */
+ @PostMapping("/addRole")
+ public RespJSON addRole(@RequestBody AddRoleVO addRoleVO, @SessionAttribute(CurrentUserUtils.SYSTEM_USER) SysUser loginSysUser) {
+ sysUserRoleService.addRole(addRoleVO, loginSysUser);
+ return RespJSON.success();
+ }
+
+ /**
+ * 列表查询
+ *
+ * @param sysUserRoleReq
+ * @param loginSysUser
+ * @return
+ */
+ @PostMapping("/getList")
+ public RespJSON addRole(@RequestBody SysUserRole sysUserRoleReq, @SessionAttribute(CurrentUserUtils.SYSTEM_USER) SysUser loginSysUser) {
+ List sysUserList = sysUserRoleService.getList(sysUserRoleReq).stream().map(item -> {
+ return sysUserService.getExitOneById(item.getSysUserId());
+ }).collect(Collectors.toList());
+ sysUserList.removeAll(Collections.singleton(null));
+ return RespJSON.success(sysUserList);
+ }
+
+}
diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/admin/src/main/java/com/arm/equipment/system/admin/controller/user/AppUserController.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/admin/src/main/java/com/arm/equipment/system/admin/controller/user/AppUserController.java
new file mode 100644
index 0000000..320b8cd
--- /dev/null
+++ b/src/arm-equipment-system-parent/arm-equipment-system-parent/admin/src/main/java/com/arm/equipment/system/admin/controller/user/AppUserController.java
@@ -0,0 +1,98 @@
+package com.arm.equipment.system.admin.controller.user;
+
+import com.arm.equipment.system.admin.controller.BaseController;
+import com.arm.equipment.system.admin.util.CurrentUserUtils;
+import com.arm.equipment.system.data.domain.PageResult;
+import com.arm.equipment.system.data.vo.RespJSON;
+import com.arm.equipment.system.data.domain.system.SysUser;
+import com.arm.equipment.system.data.util.WJAssert;
+import com.arm.equipment.system.data.domain.user.AppUser;
+import com.arm.equipment.system.data.service.user.IAppUserService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+import java.util.ArrayList;
+
+/**
+ * APP用户
+ *
+ * @author admin
+ * @date 2023年03月13日 22:34:47
+ */
+@RestController
+@RequestMapping("/user/appUser")
+public class AppUserController extends BaseController {
+
+ @Autowired
+ private IAppUserService appUserService;
+
+ /**
+ * 保存或更新
+ *
+ * @param appUserReq appUserReq
+ * @return RespJSON
+ */
+ @PostMapping("/save")
+ public RespJSON save(@RequestBody AppUser appUserReq, @SessionAttribute(CurrentUserUtils.SYSTEM_USER)SysUser loginSysUser) {
+ appUserService.save(appUserReq, loginSysUser.getUsername());
+ return RespJSON.success();
+ }
+
+ /**
+ * 分页查询
+ *
+ * @param appUserReq appUserReq
+ * @return RespJSON
+ */
+ @PostMapping("/getPageList")
+ public RespJSON getPageList(@RequestBody AppUser appUserReq) {
+ int count = appUserService.getCount(appUserReq);
+ List list = new ArrayList<>();
+ if (count > 0) {
+ list = appUserService.getPageList(appUserReq);
+ }
+ PageResult result = new PageResult(appUserReq.getPageNo(), appUserReq.getPageSize(), count, list);
+ return RespJSON.success(result);
+ }
+
+ /**
+ * 主键查询
+ *
+ * @param id id
+ * @return RespJSON
+ */
+ @RequestMapping("/getOneById")
+ public RespJSON getOneById(Long id) {
+ return RespJSON.success(appUserService.getOneById(id));
+ }
+
+ /**
+ * 审核
+ *
+ * @param id id
+ * @return RespJSON
+ */
+ @PostMapping("/audit")
+ @ResponseBody
+ public RespJSON audit(Long id, @SessionAttribute(CurrentUserUtils.SYSTEM_USER)SysUser loginSysUser) {
+ WJAssert.notNull(id, "ID 不合法");
+ appUserService.audit(id, loginSysUser.getUsername());
+ return RespJSON.success();
+ }
+
+ /**
+ * 取消审核
+ *
+ * @param id id
+ * @return RespJSON
+ */
+ @PostMapping("/unaudit")
+ @ResponseBody
+ public RespJSON unaudit(Long id, @SessionAttribute(CurrentUserUtils.SYSTEM_USER)SysUser loginSysUser) {
+ WJAssert.notNull(id, "ID 不合法");
+ appUserService.unaudit(id, loginSysUser.getUsername());
+ return RespJSON.success();
+ }
+
+}
diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/admin/src/main/java/com/arm/equipment/system/admin/controller/verifycode/VerifyCodeController.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/admin/src/main/java/com/arm/equipment/system/admin/controller/verifycode/VerifyCodeController.java
new file mode 100644
index 0000000..b4e83e4
--- /dev/null
+++ b/src/arm-equipment-system-parent/arm-equipment-system-parent/admin/src/main/java/com/arm/equipment/system/admin/controller/verifycode/VerifyCodeController.java
@@ -0,0 +1,65 @@
+package com.arm.equipment.system.admin.controller.verifycode;
+
+
+import com.arm.equipment.system.data.service.common.IVerifyCodeService;
+import com.arm.equipment.system.data.util.ValidCodeUtil;
+import com.arm.equipment.system.data.vo.system.VerifyCodeVO;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.MediaType;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.imageio.ImageIO;
+import javax.servlet.ServletOutputStream;
+import javax.servlet.http.HttpServletResponse;
+import javax.servlet.http.HttpSession;
+import java.awt.image.BufferedImage;
+import java.io.IOException;
+
+/**
+ * @author: admin
+ * @time: 2022/9/16 14:35
+ */
+@RestController
+@RequestMapping("/verifycode")
+public class VerifyCodeController {
+ @Autowired
+ private IVerifyCodeService verifyCodeService;
+ /**
+ * 验证码key开头
+ */
+ public final static String KEY_TOP = "verifyCode_";
+
+ /**
+ * 生成验证码图片与存入SESSION
+ *
+ * @param response
+ * @param webSession
+ * @return
+ * @throws IOException
+ */
+ @ResponseBody
+ @GetMapping("/getVerifyCode")
+ public void getVerifyCode(HttpServletResponse response, HttpSession webSession) throws IOException {
+ VerifyCodeVO verifyCode = verifyCodeService.generate(80, 28);
+ String code = verifyCode.getCode();
+ webSession.setAttribute(KEY_TOP + code, verifyCode);
+ response.setContentType(MediaType.IMAGE_JPEG_VALUE);
+ ServletOutputStream outputStream;
+ try {
+ outputStream = response.getOutputStream();
+ } catch (IOException e) {
+ throw new RuntimeException("获得响应流失败");
+ }
+ try {
+ BufferedImage image = ValidCodeUtil.generateImg(code);
+ ImageIO.write(image, "png", outputStream);
+ outputStream.flush();
+ outputStream.close();
+ } catch (IOException e) {
+ throw new RuntimeException("验证码输出到流失败");
+ }
+ }
+}
diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/admin/src/main/java/com/arm/equipment/system/admin/controller/weaponry/WeaponryController.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/admin/src/main/java/com/arm/equipment/system/admin/controller/weaponry/WeaponryController.java
new file mode 100644
index 0000000..aac9a5c
--- /dev/null
+++ b/src/arm-equipment-system-parent/arm-equipment-system-parent/admin/src/main/java/com/arm/equipment/system/admin/controller/weaponry/WeaponryController.java
@@ -0,0 +1,98 @@
+package com.arm.equipment.system.admin.controller.weaponry;
+
+import com.arm.equipment.system.admin.controller.BaseController;
+import com.arm.equipment.system.admin.util.CurrentUserUtils;
+import com.arm.equipment.system.data.domain.PageResult;
+import com.arm.equipment.system.data.domain.system.SysUser;
+import com.arm.equipment.system.data.util.WJAssert;
+import com.arm.equipment.system.data.vo.RespJSON;
+import com.arm.equipment.system.data.domain.weaponry.Weaponry;
+import com.arm.equipment.system.data.service.weaponry.IWeaponryService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+import java.util.ArrayList;
+
+/**
+ * 装备武器
+ *
+ * @author admin
+ * @date 2023年03月23日 10:29:48
+ */
+@RestController
+@RequestMapping("/weaponry/weaponry")
+public class WeaponryController extends BaseController {
+
+ @Autowired
+ private IWeaponryService weaponryService;
+
+ /**
+ * 保存或更新
+ *
+ * @param weaponryReq weaponryReq
+ * @return RespJSON
+ */
+ @PostMapping("/save")
+ public RespJSON save(@RequestBody Weaponry weaponryReq, @SessionAttribute(CurrentUserUtils.SYSTEM_USER)SysUser loginSysUser) {
+ weaponryService.save(weaponryReq, loginSysUser.getUsername());
+ return RespJSON.success();
+ }
+
+ /**
+ * 分页查询
+ *
+ * @param weaponryReq weaponryReq
+ * @return RespJSON
+ */
+ @PostMapping("/getPageList")
+ public RespJSON getPageList(@RequestBody Weaponry weaponryReq) {
+ int count = weaponryService.getCount(weaponryReq);
+ List list = new ArrayList<>();
+ if (count > 0) {
+ list = weaponryService.getPageList(weaponryReq);
+ }
+ PageResult result = new PageResult(weaponryReq.getPageNo(), weaponryReq.getPageSize(), count, list);
+ return RespJSON.success(result);
+ }
+
+ /**
+ * 主键查询
+ *
+ * @param id id
+ * @return RespJSON
+ */
+ @RequestMapping("/getOneById")
+ public RespJSON getOneById(Long id) {
+ return RespJSON.success(weaponryService.getOneById(id));
+ }
+
+ /**
+ * 审核
+ *
+ * @param id id
+ * @return RespJSON
+ */
+ @PostMapping("/audit")
+ @ResponseBody
+ public RespJSON audit(Long id, @SessionAttribute(CurrentUserUtils.SYSTEM_USER)SysUser loginSysUser) {
+ WJAssert.notNull(id, "ID 不合法");
+ weaponryService.audit(id, loginSysUser.getUsername());
+ return RespJSON.success();
+ }
+
+ /**
+ * 取消审核
+ *
+ * @param id id
+ * @return RespJSON
+ */
+ @PostMapping("/unaudit")
+ @ResponseBody
+ public RespJSON unaudit(Long id, @SessionAttribute(CurrentUserUtils.SYSTEM_USER)SysUser loginSysUser) {
+ WJAssert.notNull(id, "ID 不合法");
+ weaponryService.unaudit(id, loginSysUser.getUsername());
+ return RespJSON.success();
+ }
+
+}
diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/admin/src/main/java/com/arm/equipment/system/admin/controller/weaponry/WeaponryLendRecordController.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/admin/src/main/java/com/arm/equipment/system/admin/controller/weaponry/WeaponryLendRecordController.java
new file mode 100644
index 0000000..c643cd3
--- /dev/null
+++ b/src/arm-equipment-system-parent/arm-equipment-system-parent/admin/src/main/java/com/arm/equipment/system/admin/controller/weaponry/WeaponryLendRecordController.java
@@ -0,0 +1,98 @@
+package com.arm.equipment.system.admin.controller.weaponry;
+
+import com.arm.equipment.system.admin.controller.BaseController;
+import com.arm.equipment.system.admin.util.CurrentUserUtils;
+import com.arm.equipment.system.data.domain.PageResult;
+import com.arm.equipment.system.data.domain.system.SysUser;
+import com.arm.equipment.system.data.domain.weaponry.WeaponryLendRecord;
+import com.arm.equipment.system.data.service.weaponry.IWeaponryLendRecordService;
+import com.arm.equipment.system.data.util.WJAssert;
+import com.arm.equipment.system.data.vo.RespJSON;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 装备武器借出记录
+ *
+ * @author admin
+ * @date 2023年03月23日 09:20:19
+ */
+@RestController
+@RequestMapping("/weaponry/weaponryLendRecord")
+public class WeaponryLendRecordController extends BaseController {
+
+ @Autowired
+ private IWeaponryLendRecordService weaponryLendRecordService;
+
+ /**
+ * 保存或更新
+ *
+ * @param weaponryLendRecordReq weaponryLendRecordReq
+ * @return RespJSON
+ */
+ @PostMapping("/save")
+ public RespJSON save(@RequestBody WeaponryLendRecord weaponryLendRecordReq, @SessionAttribute(CurrentUserUtils.SYSTEM_USER) SysUser loginSysUser) {
+ weaponryLendRecordService.save(weaponryLendRecordReq, loginSysUser.getUsername());
+ return RespJSON.success();
+ }
+
+ /**
+ * 分页查询
+ *
+ * @param weaponryLendRecordReq weaponryLendRecordReq
+ * @return RespJSON
+ */
+ @PostMapping("/getPageList")
+ public RespJSON getPageList(@RequestBody WeaponryLendRecord weaponryLendRecordReq) {
+ int count = weaponryLendRecordService.getCount(weaponryLendRecordReq);
+ List list = new ArrayList<>();
+ if (count > 0) {
+ list = weaponryLendRecordService.getPageList(weaponryLendRecordReq);
+ }
+ PageResult result = new PageResult(weaponryLendRecordReq.getPageNo(), weaponryLendRecordReq.getPageSize(), count, list);
+ return RespJSON.success(result);
+ }
+
+ /**
+ * 主键查询
+ *
+ * @param id id
+ * @return RespJSON
+ */
+ @RequestMapping("/getOneById")
+ public RespJSON getOneById(Long id) {
+ return RespJSON.success(weaponryLendRecordService.getOneById(id));
+ }
+
+ /**
+ * 拒绝
+ *
+ * @param id id
+ * @return RespJSON
+ */
+ @PostMapping("/refuse")
+ @ResponseBody
+ public RespJSON refuse(Long id, @SessionAttribute(CurrentUserUtils.SYSTEM_USER) SysUser loginSysUser) {
+ WJAssert.notNull(id, "ID 不合法");
+ weaponryLendRecordService.refuse(id, loginSysUser.getUsername());
+ return RespJSON.success();
+ }
+
+ /**
+ * 通过
+ *
+ * @param id id
+ * @return RespJSON
+ */
+ @PostMapping("/adopt")
+ @ResponseBody
+ public RespJSON adopt(Long id, @SessionAttribute(CurrentUserUtils.SYSTEM_USER) SysUser loginSysUser) {
+ WJAssert.notNull(id, "ID 不合法");
+ weaponryLendRecordService.adopt(id, loginSysUser.getUsername());
+ return RespJSON.success();
+ }
+
+}
diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/admin/src/main/java/com/arm/equipment/system/admin/controller/weaponry/WeaponryReturnRecordController.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/admin/src/main/java/com/arm/equipment/system/admin/controller/weaponry/WeaponryReturnRecordController.java
new file mode 100644
index 0000000..5751797
--- /dev/null
+++ b/src/arm-equipment-system-parent/arm-equipment-system-parent/admin/src/main/java/com/arm/equipment/system/admin/controller/weaponry/WeaponryReturnRecordController.java
@@ -0,0 +1,98 @@
+package com.arm.equipment.system.admin.controller.weaponry;
+
+import com.arm.equipment.system.admin.controller.BaseController;
+import com.arm.equipment.system.admin.util.CurrentUserUtils;
+import com.arm.equipment.system.data.domain.PageResult;
+import com.arm.equipment.system.data.domain.system.SysUser;
+import com.arm.equipment.system.data.util.WJAssert;
+import com.arm.equipment.system.data.vo.RespJSON;
+import com.arm.equipment.system.data.domain.weaponry.WeaponryReturnRecord;
+import com.arm.equipment.system.data.service.weaponry.IWeaponryReturnRecordService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+import java.util.ArrayList;
+
+/**
+ * 装备武器归还记录
+ *
+ * @author admin
+ * @date 2023年03月23日 09:20:25
+ */
+@RestController
+@RequestMapping("/weaponry/weaponryReturnRecord")
+public class WeaponryReturnRecordController extends BaseController {
+
+ @Autowired
+ private IWeaponryReturnRecordService weaponryReturnRecordService;
+
+ /**
+ * 保存或更新
+ *
+ * @param weaponryReturnRecordReq weaponryReturnRecordReq
+ * @return RespJSON
+ */
+ @PostMapping("/save")
+ public RespJSON save(@RequestBody WeaponryReturnRecord weaponryReturnRecordReq, @SessionAttribute(CurrentUserUtils.SYSTEM_USER)SysUser loginSysUser) {
+ weaponryReturnRecordService.save(weaponryReturnRecordReq, loginSysUser.getUsername());
+ return RespJSON.success();
+ }
+
+ /**
+ * 分页查询
+ *
+ * @param weaponryReturnRecordReq weaponryReturnRecordReq
+ * @return RespJSON
+ */
+ @PostMapping("/getPageList")
+ public RespJSON getPageList(@RequestBody WeaponryReturnRecord weaponryReturnRecordReq) {
+ int count = weaponryReturnRecordService.getCount(weaponryReturnRecordReq);
+ List list = new ArrayList<>();
+ if (count > 0) {
+ list = weaponryReturnRecordService.getPageList(weaponryReturnRecordReq);
+ }
+ PageResult result = new PageResult(weaponryReturnRecordReq.getPageNo(), weaponryReturnRecordReq.getPageSize(), count, list);
+ return RespJSON.success(result);
+ }
+
+ /**
+ * 主键查询
+ *
+ * @param id id
+ * @return RespJSON
+ */
+ @RequestMapping("/getOneById")
+ public RespJSON getOneById(Long id) {
+ return RespJSON.success(weaponryReturnRecordService.getOneById(id));
+ }
+
+ /**
+ * 审核
+ *
+ * @param id id
+ * @return RespJSON
+ */
+ @PostMapping("/audit")
+ @ResponseBody
+ public RespJSON audit(Long id, @SessionAttribute(CurrentUserUtils.SYSTEM_USER)SysUser loginSysUser) {
+ WJAssert.notNull(id, "ID 不合法");
+ weaponryReturnRecordService.audit(id, loginSysUser.getUsername());
+ return RespJSON.success();
+ }
+
+ /**
+ * 取消审核
+ *
+ * @param id id
+ * @return RespJSON
+ */
+ @PostMapping("/unaudit")
+ @ResponseBody
+ public RespJSON unaudit(Long id, @SessionAttribute(CurrentUserUtils.SYSTEM_USER)SysUser loginSysUser) {
+ WJAssert.notNull(id, "ID 不合法");
+ weaponryReturnRecordService.unaudit(id, loginSysUser.getUsername());
+ return RespJSON.success();
+ }
+
+}
diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/admin/src/main/java/com/arm/equipment/system/admin/filter/BodyReaderHttpServletRequestWrapper.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/admin/src/main/java/com/arm/equipment/system/admin/filter/BodyReaderHttpServletRequestWrapper.java
new file mode 100644
index 0000000..433fba0
--- /dev/null
+++ b/src/arm-equipment-system-parent/arm-equipment-system-parent/admin/src/main/java/com/arm/equipment/system/admin/filter/BodyReaderHttpServletRequestWrapper.java
@@ -0,0 +1,91 @@
+package com.arm.equipment.system.admin.filter;
+
+import javax.servlet.ReadListener;
+import javax.servlet.ServletInputStream;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletRequestWrapper;
+import java.io.*;
+import java.nio.charset.Charset;
+import java.nio.charset.StandardCharsets;
+
+/**
+ * request封装
+ */
+public class BodyReaderHttpServletRequestWrapper extends HttpServletRequestWrapper {
+
+ private final byte[] body;
+ private String bodyStr;
+
+ public BodyReaderHttpServletRequestWrapper(HttpServletRequest request) throws IOException {
+ super(request);
+ String bodyString = getBodyString(request);
+ body = bodyString.getBytes(StandardCharsets.UTF_8);
+ bodyStr = bodyString;
+ }
+
+ public String getBodyStr() {
+ return bodyStr;
+ }
+
+ @Override
+ public ServletInputStream getInputStream() throws IOException {
+ final ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(body);
+
+ return new ServletInputStream() {
+ @Override
+ public int read() throws IOException {
+ return byteArrayInputStream.read();
+ }
+
+ @Override
+ public boolean isFinished() {
+ return false;
+ }
+
+ @Override
+ public boolean isReady() {
+ return false;
+ }
+
+ @Override
+ public void setReadListener(ReadListener readListener) {
+ }
+ };
+ }
+
+
+ public String getBodyString(HttpServletRequest request) throws IOException {
+ StringBuilder sb = new StringBuilder();
+ InputStream inputStream = null;
+ BufferedReader reader = null;
+ try {
+ inputStream = request.getInputStream();
+ reader = new BufferedReader(
+ new InputStreamReader(inputStream, Charset.forName("UTF-8")));
+
+ char[] bodyCharBuffer = new char[1024];
+ int len = 0;
+ while ((len = reader.read(bodyCharBuffer)) != -1) {
+ sb.append(new String(bodyCharBuffer, 0, len));
+ }
+ } catch (IOException e) {
+ e.printStackTrace();
+ } finally {
+ if (inputStream != null) {
+ try {
+ inputStream.close();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+ if (reader != null) {
+ try {
+ reader.close();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+ }
+ return sb.toString();
+ }
+}
diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/admin/src/main/java/com/arm/equipment/system/admin/filter/LoginPermissionsFilter.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/admin/src/main/java/com/arm/equipment/system/admin/filter/LoginPermissionsFilter.java
new file mode 100644
index 0000000..860e332
--- /dev/null
+++ b/src/arm-equipment-system-parent/arm-equipment-system-parent/admin/src/main/java/com/arm/equipment/system/admin/filter/LoginPermissionsFilter.java
@@ -0,0 +1,81 @@
+package com.arm.equipment.system.admin.filter;
+
+import com.alibaba.fastjson.JSON;
+import com.google.common.base.Throwables;
+import com.arm.equipment.system.admin.util.CurrentUserUtils;
+import com.arm.equipment.system.data.domain.system.SysUser;
+import com.arm.equipment.system.data.vo.RespJSON;
+import com.arm.equipment.system.data.vo.ReturnCode;
+import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.core.annotation.Order;
+import org.springframework.web.servlet.HandlerInterceptor;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * @author: admin
+ * @time: 2022/9/16 11:20
+ */
+@Order(1001)
+@Configuration
+public class LoginPermissionsFilter implements HandlerInterceptor {
+ private final static Logger logger = LoggerFactory.getLogger(LoginPermissionsFilter.class);
+ @Value("${domain.admin}")
+ private String adminDomain;
+
+ private static final List IGNORE_URL_LIST = Arrays.asList("/login", "/file/upload", "/common/dict", "/verifycode/getVerifyCode");
+
+ private final String RETURN_INFO = JSON.toJSONString(RespJSON.returnCode(ReturnCode.NOT_LOGIN_ERROR));
+
+ @Override
+ public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
+ // 将 options 请求放过
+ String method = request.getMethod();
+ if ("options".equalsIgnoreCase(method)) {
+ return true;
+ }
+ String uri = request.getRequestURI();
+ for (String ignoreUrl : IGNORE_URL_LIST) {
+ if (StringUtils.contains(uri, ignoreUrl)) {
+ return true;
+ }
+ }
+ SysUser sysUser = (SysUser) request.getSession().getAttribute(CurrentUserUtils.SYSTEM_USER);
+ if (null != sysUser) {
+ return true;
+ }
+ returnNoLogin(response, request);
+ return false;
+
+ }
+
+ private void returnNoLogin(HttpServletResponse response, HttpServletRequest request) {
+ String origin = adminDomain;
+ String originHeader = request.getHeader("Origin");
+ if (StringUtils.isNotEmpty(originHeader)) {
+ origin = originHeader;
+ }
+ response.setCharacterEncoding("UTF-8");
+ response.setHeader("Content-Type", "application/json; charset=utf-8");
+ response.setHeader("Access-Control-Allow-Credentials", "true");
+ response.setHeader("Access-Control-Allow-Origin", origin);
+ PrintWriter writer = null;
+ try {
+ writer = response.getWriter();
+ writer.write(RETURN_INFO);
+ } catch (IOException e) {
+ logger.error(Throwables.getStackTraceAsString(e));
+ } finally {
+ writer.close();
+ }
+ }
+}
diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/admin/src/main/java/com/arm/equipment/system/admin/filter/RequestBodyFilter.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/admin/src/main/java/com/arm/equipment/system/admin/filter/RequestBodyFilter.java
new file mode 100644
index 0000000..de3a12d
--- /dev/null
+++ b/src/arm-equipment-system-parent/arm-equipment-system-parent/admin/src/main/java/com/arm/equipment/system/admin/filter/RequestBodyFilter.java
@@ -0,0 +1,37 @@
+package com.arm.equipment.system.admin.filter;
+
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.stereotype.Component;
+
+import javax.servlet.*;
+import javax.servlet.annotation.WebFilter;
+import javax.servlet.http.HttpServletRequest;
+import java.io.IOException;
+
+/**
+ * 记录用户请求参数
+ */
+@Component
+@WebFilter(filterName = "httpServletRequestWrapperFilter", urlPatterns = {"/"})
+public class RequestBodyFilter implements Filter {
+
+ @Override
+ public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
+ ServletRequest requestWrapper = null;
+ if (request instanceof HttpServletRequest) {
+ HttpServletRequest httpRequest = (HttpServletRequest) request;
+ //遇到post方法才对request进行包装
+ String methodType = httpRequest.getMethod();
+ String contentType = ((HttpServletRequest) request).getHeader("Content-Type");
+ if (StringUtils.isNotEmpty(contentType) && contentType.contains("application/json") && "POST".equals(methodType)) {
+ requestWrapper = new BodyReaderHttpServletRequestWrapper((HttpServletRequest) request);
+ }
+ }
+ if (null == requestWrapper) {
+ chain.doFilter(request, response);
+ } else {
+ chain.doFilter(requestWrapper, response);
+
+ }
+ }
+}
diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/admin/src/main/java/com/arm/equipment/system/admin/filter/SysLogFilter.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/admin/src/main/java/com/arm/equipment/system/admin/filter/SysLogFilter.java
new file mode 100644
index 0000000..20ceb08
--- /dev/null
+++ b/src/arm-equipment-system-parent/arm-equipment-system-parent/admin/src/main/java/com/arm/equipment/system/admin/filter/SysLogFilter.java
@@ -0,0 +1,101 @@
+package com.arm.equipment.system.admin.filter;
+
+import com.alibaba.fastjson.JSONObject;
+import com.arm.equipment.system.admin.util.CurrentUserUtils;
+import com.arm.equipment.system.data.domain.system.SysLog;
+import com.arm.equipment.system.data.domain.system.SysUser;
+import com.arm.equipment.system.data.enums.dict.EnumSysLogType;
+import com.arm.equipment.system.data.service.system.ISysLogService;
+import com.arm.equipment.system.data.util.IPUtil;
+import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.core.annotation.Order;
+import org.springframework.web.servlet.HandlerInterceptor;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.util.Enumeration;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.concurrent.LinkedBlockingQueue;
+import java.util.concurrent.ThreadPoolExecutor;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * 系统日志filter, 记录所有请求
+ */
+@Order(1002)
+@Configuration
+public class SysLogFilter implements HandlerInterceptor {
+ private final static Logger logger = LoggerFactory.getLogger(SysLogFilter.class);
+ @Autowired
+ private ISysLogService sysLogService;
+ /**
+ * 50个线程, 无界队列, 超过异常
+ */
+ private final static ThreadPoolExecutor THREAD_POOL_EXECUTOR = new ThreadPoolExecutor(50, 50, 120, TimeUnit.SECONDS, new LinkedBlockingQueue<>(), new ThreadPoolExecutor.AbortPolicy());
+ /**
+ * 登录路径
+ */
+ private final static String LOGIN_PATH = "/system/sysUser/login";
+
+ @Override
+ public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
+ THREAD_POOL_EXECUTOR.submit(() -> {
+ String userAgent = request.getHeader("User-Agent");
+ SysLog sysLog = new SysLog();
+ sysLog.setType(EnumSysLogType.LOG.getCode());
+ // todo 尽量设置访问链接的菜单
+ sysLog.setTitle(" ");
+ sysLog.setRemoteAddr(IPUtil.getRemoteAddress(request));
+
+ sysLog.setUserAgent(userAgent);
+ sysLog.setRequestUri(buildUri(request));
+ sysLog.setMethod(request.getMethod());
+ String requestBody = getRequestBody(((BodyReaderHttpServletRequestWrapper) request).getBodyStr());
+ sysLog.setParams(requestBody);
+ //登录接口日志特殊处理 不显示密码
+ if (sysLog.getRequestUri().contains(LOGIN_PATH)) {
+ JSONObject loginInfoJson = JSONObject.parseObject(requestBody);
+ loginInfoJson.put("password", "");
+ sysLog.setParams(loginInfoJson.toJSONString());
+ }
+ SysUser sysUser = (SysUser) request.getSession().getAttribute(CurrentUserUtils.SYSTEM_USER);
+ if (null != sysUser) {
+ sysLogService.save(sysLog, sysUser.getUsername());
+ } else {
+ sysLogService.save(sysLog, "SYSTEM");
+ }
+ });
+ return true;
+ }
+
+ private Map getAllHeader(HttpServletRequest request) {
+ Enumeration headerNames = request.getHeaderNames();
+ Map map = new HashMap<>();
+ while (headerNames.hasMoreElements()) {
+ String key = headerNames.nextElement();
+ map.put(key, request.getHeader(key));
+ }
+ return map;
+ }
+
+ private String getRequestBody(String requestBody) {
+ if (StringUtils.isEmpty(requestBody)) {
+ return null;
+ }
+ return requestBody;
+ }
+
+ private String buildUri(HttpServletRequest request) {
+ String path = request.getRequestURL().toString();
+ String query = request.getQueryString();
+ if (StringUtils.isEmpty(query)) {
+ return path;
+ }
+ return path + "?" + query;
+ }
+}
diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/admin/src/main/java/com/arm/equipment/system/admin/util/CurrentUserUtils.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/admin/src/main/java/com/arm/equipment/system/admin/util/CurrentUserUtils.java
new file mode 100644
index 0000000..07fd4f9
--- /dev/null
+++ b/src/arm-equipment-system-parent/arm-equipment-system-parent/admin/src/main/java/com/arm/equipment/system/admin/util/CurrentUserUtils.java
@@ -0,0 +1,13 @@
+package com.arm.equipment.system.admin.util;
+
+/**
+ *
+ *
+ * @author: admin
+ * @time: 2022/9/16 11:20
+ */
+public class CurrentUserUtils {
+
+ public static final String SYSTEM_USER = "system_user";
+
+}
diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/admin/src/main/resources/application-dev.yml b/src/arm-equipment-system-parent/arm-equipment-system-parent/admin/src/main/resources/application-dev.yml
new file mode 100644
index 0000000..e45c91a
--- /dev/null
+++ b/src/arm-equipment-system-parent/arm-equipment-system-parent/admin/src/main/resources/application-dev.yml
@@ -0,0 +1,34 @@
+env: dev
+spring:
+ datasource:
+ url: jdbc:mysql://127.0.0.1:3306/arm-equipment-system?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai&zeroDateTimeBehavior=convertToNull
+ driver-class-name: com.mysql.cj.jdbc.Driver
+ username: root
+ password:
+ type: com.zaxxer.hikari.HikariDataSource
+ hikari:
+ auto-commit: true
+ connection-timeout: 30000
+ idle-timeout: 600000
+ max-lifetime: 1800000
+ minimum-idle: 1
+ maximum-pool-size: 10
+ pool-name: hikaricp
+ validation-timeout: 5000
+ redis:
+ host: 127.0.0.1
+ port: 6379
+ password:
+ database: 0
+ timeout: 5000ms
+ lettuce:
+ pool:
+ max-idle: 100
+ min-idle: 1
+ max-active: 1000
+ web:
+ resources:
+ static-locations: file:admin/src/main/resources/static
+# 域名配置
+domain:
+ admin: http://localhost:9527
diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/admin/src/main/resources/application.yml b/src/arm-equipment-system-parent/arm-equipment-system-parent/admin/src/main/resources/application.yml
new file mode 100644
index 0000000..818c7ac
--- /dev/null
+++ b/src/arm-equipment-system-parent/arm-equipment-system-parent/admin/src/main/resources/application.yml
@@ -0,0 +1,25 @@
+git:
+ version: "@git.commit.id.abbrev@"
+ commitTime: "@git.commit.time@"
+server:
+ port: 18081
+ compression:
+ enabled: true
+ mime-types: application/javascript,text/css,application/json,application/xml,text/html,text/xml,text/plain
+spring:
+ jackson:
+ serialization:
+ write-dates-as-timestamps: true
+ output:
+ ansi:
+ enabled: always
+ webflux:
+ static-path-pattern: /**
+ session:
+ store-type: redis
+ timeout: 86400
+ profiles:
+ active: dev
+ servlet:
+ multipart:
+ max-file-size: 1024MB
diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/admin/src/main/resources/logback-spring.xml b/src/arm-equipment-system-parent/arm-equipment-system-parent/admin/src/main/resources/logback-spring.xml
new file mode 100644
index 0000000..eb56ff8
--- /dev/null
+++ b/src/arm-equipment-system-parent/arm-equipment-system-parent/admin/src/main/resources/logback-spring.xml
@@ -0,0 +1,44 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ${log.base}.log
+
+ true
+ 30
+
+ ${log.base}.%d{yyyy-MM-dd}.log
+
+
+
+
+ %date [%thread] %-5level %logger{80} - %msg%n
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/admin/src/test/java/com/arm/equipment/system/admin/AdminApplicationTests.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/admin/src/test/java/com/arm/equipment/system/admin/AdminApplicationTests.java
new file mode 100644
index 0000000..182e469
--- /dev/null
+++ b/src/arm-equipment-system-parent/arm-equipment-system-parent/admin/src/test/java/com/arm/equipment/system/admin/AdminApplicationTests.java
@@ -0,0 +1,38 @@
+package com.arm.equipment.system.admin;
+
+import com.arm.equipment.system.admin.app.AdminApplication;
+import com.arm.equipment.system.data.service.common.IIdWorkerService;
+import com.arm.equipment.system.data.util.passwordEncoder.BCryptPasswordEncoderUtils;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.ActiveProfiles;
+import org.springframework.test.context.junit.jupiter.SpringExtension;
+
+
+@ExtendWith(SpringExtension.class)
+@SpringBootTest(classes = AdminApplication.class)
+@ActiveProfiles(profiles = "dev")
+public class AdminApplicationTests {
+
+ @Autowired
+ private BCryptPasswordEncoderUtils bCryptPasswordEncoder;
+
+ @Test
+ public void test() {
+ System.out.println(bCryptPasswordEncoder.encode("123123"));
+ }
+
+
+
+ @Autowired
+ IIdWorkerService idWorkerService;
+
+ @Test
+ public void aa(){
+ for (int i = 0; i < 30; i++) {
+ System.out.println(idWorkerService.getNextId());
+ }
+ }
+}
diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/admin/src/test/java/com/arm/equipment/system/admin/SysResourceTests.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/admin/src/test/java/com/arm/equipment/system/admin/SysResourceTests.java
new file mode 100644
index 0000000..6dbaedc
--- /dev/null
+++ b/src/arm-equipment-system-parent/arm-equipment-system-parent/admin/src/test/java/com/arm/equipment/system/admin/SysResourceTests.java
@@ -0,0 +1,141 @@
+package com.arm.equipment.system.admin;
+
+import com.google.common.collect.ImmutableMap;
+import com.arm.equipment.system.admin.app.AdminApplication;
+import com.arm.equipment.system.data.domain.system.SysResource;
+import com.arm.equipment.system.data.service.system.ISysResourceService;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.ActiveProfiles;
+import org.springframework.test.context.junit.jupiter.SpringExtension;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+
+@ExtendWith(SpringExtension.class)
+@SpringBootTest(classes = AdminApplication.class)
+@ActiveProfiles(profiles = "dev")
+public class SysResourceTests {
+ @Autowired
+ private ISysResourceService sysResourceService;
+
+ /**
+ * 公共按钮map
+ */
+ private final static Map MAP = ImmutableMap.builder()
+ .put("list", "查询")
+ .put("add", "添加")
+ .put("edit", "编辑")
+ .put("delete", "删除")
+ .put("audit", "审核")
+ .put("unAudit", "取消审核")
+ .put("publish", "发布")
+ .put("unPublish", "取消发布")
+ .put("archives", "归档")
+ .put("unArchives", "取消归档")
+ .put("setPosition", "调整位置")
+ .put("exportToExcel", "导出Excel")
+ .put("recommend", "推荐")
+ .put("unRecommend", "取消推荐")
+ .put("used", "标记使用")
+ .put("clueFee", "线索费")
+ .put("show", "显示")
+ .put("unShow", "取消显示")
+ .put("send", "发放红包")
+ .put("refuse", "拒绝")
+ .put("top", "置顶")
+ .put("unTop", "取消置顶")
+ .put("handle", "处理")
+ .put("onShelves", "上架")
+ .put("offShell", "下架")
+ .put("push", "推送")
+ .put("recruit", "招聘管理")
+ .put("download", "下载简历模板")
+ .put("recruitmentDeliverInfoList", "查看职位投递信息")
+ .put("updateStatus", "操作提醒状态")
+ .put("option", "直播间设置")
+ .put("startLuckyBag", "直播间开启福袋")
+ .put("closeLuckyBag", "直播间关闭福袋")
+ .put("modifyLuckyBag", "直播间修改福袋")
+ .put("startRedPacket", "直播间开启红包")
+ .put("modifyRedPacket", "直播间修改红包")
+ .put("interaction", "直播间互动")
+ .put("data", "直播间数据")
+ .put("split", "直播间拆条")
+ .put("startLive", "直播间开始直播")
+ .put("stopLive", "直播间结束直播")
+ .put("modifyLive", "直播间修改直播")
+ .put("addLine", "直播间新增线路")
+ .put("breakLine", "直播间断开线路")
+ .put("restoreLine", "直播间恢复线路")
+ .put("modifyLine", "直播间修改线路")
+ .put("deleteLine", "直播间删除线路")
+ .put("addVote", "直播间添加投票")
+ .put("modifyVote", "直播间修改投票")
+ .put("deleteVote", "直播间删除投票")
+ .put("deleteComment", "直播间删除评论")
+ .put("cancelTopComment", "直播间取消置顶评论")
+ .put("topComment", "直播间置顶评论")
+ .put("addDraw", "直播间创建抽奖")
+ .put("addCoupon", "直播间创建优惠券")
+ .put("startCoupon", "直播间开启优惠券")
+ .put("closeCoupon", "直播间关闭优惠券")
+ .put("modifyCoupon", "直播间修改优惠券")
+ .put("updateBrowseMultiple", "浏览倍率")
+ .put("sliderManage", "轮播管理")
+ .put("navManage", "导航栏管理")
+ .put("start", "导播台开启")
+ .put("stop", "导播台关闭")
+ .put("detail", "导播台详情")
+ .put("canPublish", "可发布文章")
+ .put("sign", "标记")
+ .build();
+ /**父级菜单查询条件 这里是根据路径找到对象 根据需求更换*/
+ private final static String URL_WHERE = "/live/liveStudioGiftsList";
+ /**按钮标识前缀 根据需求更换*/
+ private final static String SUFFIX_IDENTITY = "live_studio_gifts"+"_";
+ /**按钮名称前缀 根据需求更换*/
+ private final static String SUFFIX_NAME = "直播间礼物";
+ /**需要生成的按钮权限 已公共map中的为准 有其他公共权限可以自行添加到map 一般如果存在多个按钮 list按钮权限最好生成 根据需求更换*/
+ private final static List COMMON_ROLE = Arrays.asList("list", "add","edit","delete","audit","unAudit");
+// "startRedPacket", "modifyRedPacket", "interaction", "data", "split", "startLive", "stopLive", "modifyLive",
+// "addLine", "breakLine", "restoreLine", "modifyLine", "deleteLine", "addVote", "modifyVote", "deleteVote",
+// "deleteComment", "cancelTopComment", "topComment", "addDraw", "addCoupon", "startCoupon", "closeCoupon");
+ /**
+ * 公共添加
+ */
+ @Test
+ public void commonSave() {
+ SysResource where = new SysResource();
+ where.setUrl(URL_WHERE);
+ List sysResourcesListDB = sysResourceService.getList(where);
+ COMMON_ROLE.forEach(item -> {
+ buildSave(sysResourcesListDB.get(0).getId().toString(), SUFFIX_IDENTITY + item, SUFFIX_NAME + MAP.get(item));
+ });
+ }
+
+ /**
+ * 单个添加
+ */
+// @Test
+// public void save() {
+// SysResource where = new SysResource();
+// where.setUrl(URL_WHERE);
+// List sysResourcesListDB = sysResourceService.getList(where);
+// buildSave(sysResourcesListDB.get(0).getId(), SUFFIX_IDENTITY + "generalize", SUFFIX_NAME + "微兔眼爆料跟踪信息");
+// }
+
+ private void buildSave(String parentId, String identity, String name) {
+ SysResource req = new SysResource();
+ req.setIdentity(identity);
+ req.setName(name);
+ req.setParentId(parentId);
+ req.setType(2);
+ req.setSort(1);
+ req.setIsShow(1);
+ sysResourceService.save(req, "admin");
+ }
+}
diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/api/pom.xml b/src/arm-equipment-system-parent/arm-equipment-system-parent/api/pom.xml
new file mode 100644
index 0000000..bd7bf59
--- /dev/null
+++ b/src/arm-equipment-system-parent/arm-equipment-system-parent/api/pom.xml
@@ -0,0 +1,93 @@
+
+
+ 4.0.0
+
+ com.arm.equipment.system
+ arm-equipment-system-parent
+ 0.0.1-SNAPSHOT
+
+ api
+ 0.0.1-SNAPSHOT
+ api
+ 接口工程
+
+
+ 1.8
+
+
+
+
+ com.arm.equipment.system
+ data
+ 0.0.1-SNAPSHOT
+
+
+
+ org.springframework.boot
+ spring-boot-starter-actuator
+
+
+
+ org.springframework.session
+ spring-session-data-redis
+
+
+
+ org.springframework.boot
+ spring-boot-starter-data-redis
+
+
+
+ javax.servlet
+ javax.servlet-api
+
+
+
+ mysql
+ mysql-connector-java
+
+
+
+ org.mybatis.spring.boot
+ mybatis-spring-boot-starter
+
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+
+ org.apache.commons
+ commons-lang3
+
+
+
+ com.alibaba
+ fastjson
+
+
+
+ org.springframework.boot
+ spring-boot-starter
+
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
+
+
+ arm-equipment-system-parent-${project.artifactId}
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+
+
+
+
diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/api/src/main/java/com/arm/equipment/system/api/annotation/LoginCheck.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/api/src/main/java/com/arm/equipment/system/api/annotation/LoginCheck.java
new file mode 100644
index 0000000..39ca155
--- /dev/null
+++ b/src/arm-equipment-system-parent/arm-equipment-system-parent/api/src/main/java/com/arm/equipment/system/api/annotation/LoginCheck.java
@@ -0,0 +1,13 @@
+package com.arm.equipment.system.api.annotation;
+
+
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+
+/**
+ * 判断接口是否必须要登录才能使用
+ * @author admin
+ */
+@Retention(RetentionPolicy.RUNTIME)
+public @interface LoginCheck {
+}
diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/api/src/main/java/com/arm/equipment/system/api/app/ApiApplication.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/api/src/main/java/com/arm/equipment/system/api/app/ApiApplication.java
new file mode 100644
index 0000000..b8affdf
--- /dev/null
+++ b/src/arm-equipment-system-parent/arm-equipment-system-parent/api/src/main/java/com/arm/equipment/system/api/app/ApiApplication.java
@@ -0,0 +1,35 @@
+package com.arm.equipment.system.api.app;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.web.servlet.ServletListenerRegistrationBean;
+import org.springframework.cache.annotation.EnableCaching;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession;
+import org.springframework.transaction.annotation.EnableTransactionManagement;
+import org.springframework.web.util.IntrospectorCleanupListener;
+
+/**
+ * 工程启动配置
+ *
+ * @author admin
+ */
+@SpringBootApplication
+@ComponentScan("com.arm.equipment.system")
+@EnableTransactionManagement
+@EnableRedisHttpSession
+@EnableCaching
+public class ApiApplication {
+
+ public static void main(String[] args) {
+ SpringApplication.run(ApiApplication.class, args);
+ }
+
+ @Bean
+ public ServletListenerRegistrationBean introspectorCleanupListener() {
+ ServletListenerRegistrationBean listenerRegistration = new ServletListenerRegistrationBean();
+ listenerRegistration.setListener(new IntrospectorCleanupListener());
+ return listenerRegistration;
+ }
+}
diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/api/src/main/java/com/arm/equipment/system/api/app/ApiCorsConfiguration.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/api/src/main/java/com/arm/equipment/system/api/app/ApiCorsConfiguration.java
new file mode 100644
index 0000000..5e68d0c
--- /dev/null
+++ b/src/arm-equipment-system-parent/arm-equipment-system-parent/api/src/main/java/com/arm/equipment/system/api/app/ApiCorsConfiguration.java
@@ -0,0 +1,38 @@
+package com.arm.equipment.system.api.app;
+
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.cors.CorsConfiguration;
+import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
+import org.springframework.web.filter.CorsFilter;
+
+/**
+ * CORS配置
+ */
+@Configuration
+public class ApiCorsConfiguration {
+
+ @Bean
+ public CorsFilter corsFilter() {
+ // 添加CORS配置信息
+ CorsConfiguration config = new CorsConfiguration();
+ // 放行哪些原始域
+ config.addAllowedOriginPattern("*");
+ // 是否发送Cookie信息
+ config.setAllowCredentials(true);
+ // 放行哪些原始域(请求方式)
+ config.addAllowedMethod("*");
+ // 放行哪些原始域(头部信息)
+ config.addAllowedHeader("*");
+ // 暴露哪些头部信息(因为跨域访问默认不能获取全部头部信息)
+ // config.addExposedHeader("*");
+
+ //2.添加映射路径
+ UrlBasedCorsConfigurationSource configSource = new UrlBasedCorsConfigurationSource();
+ configSource.registerCorsConfiguration("/**", config);
+
+ //3.返回新的CorsFilter.
+ return new CorsFilter(configSource);
+ }
+}
diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/api/src/main/java/com/arm/equipment/system/api/app/InterceptorConfiguration.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/api/src/main/java/com/arm/equipment/system/api/app/InterceptorConfiguration.java
new file mode 100644
index 0000000..777741b
--- /dev/null
+++ b/src/arm-equipment-system-parent/arm-equipment-system-parent/api/src/main/java/com/arm/equipment/system/api/app/InterceptorConfiguration.java
@@ -0,0 +1,77 @@
+package com.arm.equipment.system.api.app;
+
+import com.fasterxml.jackson.databind.DeserializationFeature;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.module.SimpleModule;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import com.arm.equipment.system.api.filter.LoginFilter;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.http.converter.HttpMessageConverter;
+import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
+import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
+import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;
+
+import java.math.BigInteger;
+import java.util.List;
+
+
+/**
+ * @author: admin
+ * @time: 2022/9/16 11:20
+ */
+@Configuration
+public class InterceptorConfiguration extends WebMvcConfigurationSupport {
+ @Autowired
+ private LoginFilter loginFilter;
+
+ @Override
+ protected void addInterceptors(InterceptorRegistry registry) {
+ registry.addInterceptor(loginFilter)
+ .excludePathPatterns("/file/**");
+ super.addInterceptors(registry);
+ }
+
+ @Override
+ public void addResourceHandlers(ResourceHandlerRegistry registry) {
+ /**
+ * @Description: 对文件的路径进行配置, 创建一个虚拟路径/Path/** ,即只要在
便可以直接引用图片
+ *这是图片的物理路径 "file:/+本地图片的地址"
+ */
+ String os = System.getProperty("os.name");
+ //Windows操作系统
+ String resourcePath = System.getProperty("user.dir");
+ if (os != null && os.toLowerCase().startsWith("windows")) {
+ resourcePath = resourcePath + "\\";
+ } else {
+ resourcePath = resourcePath + "/";
+ }
+ registry.addResourceHandler("/file/**").addResourceLocations("file:" + resourcePath);
+ super.addResourceHandlers(registry);
+ }
+
+ @Override
+ protected void extendMessageConverters(List> converters) {
+ MappingJackson2HttpMessageConverter jackson2HttpMessageConverter = new MappingJackson2HttpMessageConverter();
+ ObjectMapper objectMapper = new ObjectMapper();
+ /**
+ * 序列换成json时,将所有的long变成string
+ * 因为js中得数字类型不能包含所有的java long值
+ */
+ SimpleModule simpleModule = new SimpleModule();
+ simpleModule.addSerializer(Long.class, ToStringSerializer.instance);
+ simpleModule.addSerializer(Long.TYPE, ToStringSerializer.instance);
+ simpleModule.addSerializer(BigInteger.class, ToStringSerializer.instance);
+
+ // 反序列化时忽略多余字段
+ objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
+
+ // 注册
+ objectMapper.registerModule(simpleModule);
+ jackson2HttpMessageConverter.setObjectMapper(objectMapper);
+ converters.add(0, jackson2HttpMessageConverter);
+ super.extendMessageConverters(converters);
+ }
+}
diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/api/src/main/java/com/arm/equipment/system/api/controller/BaseController.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/api/src/main/java/com/arm/equipment/system/api/controller/BaseController.java
new file mode 100644
index 0000000..b2aa1f5
--- /dev/null
+++ b/src/arm-equipment-system-parent/arm-equipment-system-parent/api/src/main/java/com/arm/equipment/system/api/controller/BaseController.java
@@ -0,0 +1,16 @@
+package com.arm.equipment.system.api.controller;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.RedisTemplate;
+
+/**
+ * 接口的基础类
+ * @author admin
+ */
+public abstract class BaseController{
+ @Autowired
+ protected RedisTemplate redisTemplate;
+ protected Logger logger = LoggerFactory.getLogger(this.getClass());
+}
diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/api/src/main/java/com/arm/equipment/system/api/controller/ExceptionController.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/api/src/main/java/com/arm/equipment/system/api/controller/ExceptionController.java
new file mode 100644
index 0000000..a0fc1e3
--- /dev/null
+++ b/src/arm-equipment-system-parent/arm-equipment-system-parent/api/src/main/java/com/arm/equipment/system/api/controller/ExceptionController.java
@@ -0,0 +1,155 @@
+package com.arm.equipment.system.api.controller;
+
+
+import com.alibaba.fastjson.JSON;
+import com.arm.equipment.system.data.constant.ConstantValues;
+import com.arm.equipment.system.data.exception.AuthException;
+import com.arm.equipment.system.data.exception.BusinessException;
+import com.arm.equipment.system.data.util.EnvUtil;
+import com.arm.equipment.system.data.vo.RespJSON;
+import com.arm.equipment.system.data.vo.ReturnCode;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.dao.QueryTimeoutException;
+import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.validation.BindException;
+import org.springframework.validation.FieldError;
+import org.springframework.web.bind.annotation.ControllerAdvice;
+import org.springframework.web.bind.annotation.ExceptionHandler;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.method.annotation.MethodArgumentTypeMismatchException;
+import org.springframework.web.server.ServerWebInputException;
+import org.springframework.web.server.UnsupportedMediaTypeStatusException;
+
+import javax.servlet.http.HttpServletRequest;
+import java.text.ParseException;
+
+/**
+ * 统一异常处理
+ *
+ * @author admin
+ */
+@ControllerAdvice
+public class ExceptionController {
+ private final static Logger LOGGER = LoggerFactory.getLogger(ExceptionController.class);
+ @Autowired
+ private RedisTemplate redisTemplate;
+
+ @ExceptionHandler(value = IllegalArgumentException.class)
+ @ResponseBody
+ public RespJSON illegalArgumentException(HttpServletRequest req, Exception e) {
+ if (EnvUtil.isDev()) {
+ LOGGER.error("异常", e);
+ } else {
+ LOGGER.info("异常: {}", e.getMessage());
+ }
+ logErrDetail(req);
+ return RespJSON.returnCodeWithMessage(ReturnCode.CUSTOM_MESSAGE, "参数错误: " + e.getMessage());
+ }
+
+ @ExceptionHandler(value = MethodArgumentTypeMismatchException.class)
+ @ResponseBody
+ public RespJSON methodArgumentTypeMismatchException(HttpServletRequest req, Exception e) {
+ logErrDetail(req);
+ String field = ((MethodArgumentTypeMismatchException) e).getName();
+ String rejectedValue = ((MethodArgumentTypeMismatchException) e).getValue().toString();
+ String message = "参数:" + field + "注入的值不合法:" + rejectedValue;
+ LOGGER.error("入参错误", e);
+ return RespJSON.returnCodeWithMessage(ReturnCode.CUSTOM_MESSAGE, message);
+ }
+
+ @ExceptionHandler(value = BusinessException.class)
+ @ResponseBody
+ public RespJSON customException(HttpServletRequest req, BusinessException e) {
+ if (EnvUtil.isDev()) {
+ LOGGER.error("自定义异常", e);
+ } else {
+ LOGGER.info("自定义异常: {}", e.getMessage());
+ }
+ logErrDetail(req);
+ return RespJSON.returnCodeWithMessage(ReturnCode.CUSTOM_MESSAGE, e.getMessage());
+ }
+
+ @ExceptionHandler(value = AuthException.class)
+ @ResponseBody
+ public RespJSON authException(HttpServletRequest req, AuthException e) {
+ logErrDetail(req);
+ if (e.getReturnCode() != null) {
+ return RespJSON.returnCode(e.getReturnCode());
+ } else {
+ return RespJSON.returnCode(ReturnCode.CODE_OK, e.getMessage());
+ }
+ }
+
+ @ExceptionHandler(value = BindException.class)
+ @ResponseBody
+ public RespJSON bindException(HttpServletRequest req, Exception e) {
+ logErrDetail(req);
+ FieldError fieldError = ((BindException) e).getBindingResult().getFieldError();
+ String field = fieldError.getField();
+ Object rejectedValue = fieldError.getRejectedValue();
+ String message = "参数:" + field + "注入的值不合法:" + rejectedValue;
+ LOGGER.error("入参错误", e);
+ return RespJSON.returnCodeWithMessage(ReturnCode.CUSTOM_MESSAGE, message);
+ }
+
+ @ExceptionHandler(value = ParseException.class)
+ @ResponseBody
+ public RespJSON parseException(HttpServletRequest req, Exception e) {
+ logErrDetail(req);
+ return RespJSON.returnCode(ReturnCode.PARSE_ERROR);
+ }
+
+ @ExceptionHandler(value = UnsupportedMediaTypeStatusException.class)
+ @ResponseBody
+ public RespJSON unsupportedMediaTypeStatusException(HttpServletRequest req, Exception e) {
+ logErrDetail(req);
+ return RespJSON.returnCustomCodeWithMessage(ReturnCode.SYS_ERROR.getCode(), "错误的请求格式");
+ }
+
+ @ExceptionHandler(value = ServerWebInputException.class)
+ @ResponseBody
+ public RespJSON serverWebInputException(HttpServletRequest req, Exception e) {
+ logErrDetail(req);
+ LOGGER.error(e.getMessage(), e);
+ return RespJSON.returnCodeWithMessage(ReturnCode.CUSTOM_MESSAGE, "请在body中传参");
+ }
+
+ @ExceptionHandler(value = QueryTimeoutException.class)
+ @ResponseBody
+ public RespJSON queryTimeoutException(HttpServletRequest req, Exception e) {
+ logErrDetail(req);
+ LOGGER.error(e.getMessage(), e);
+ ((LettuceConnectionFactory)redisTemplate.getConnectionFactory()).initConnection();
+ LOGGER.info("reset redis connection");
+ return RespJSON.returnCode(ReturnCode.SYS_ERROR);
+ }
+
+ @ExceptionHandler(value = Exception.class)
+ @ResponseBody
+ public RespJSON defaultErrorHandler(HttpServletRequest req, Exception e) {
+ logErrDetail(req);
+ LOGGER.error(e.getMessage(), e);
+ return RespJSON.returnCode(ReturnCode.SYS_ERROR);
+ }
+
+
+ /**
+ * 打印异常参数等信息
+ * @param req
+ */
+ private void logErrDetail(HttpServletRequest req) {
+ LOGGER.error("异常请求: {}", req.getRequestURI());
+ LOGGER.error("异常参数: {}", JSON.toJSONString(req.getParameterMap()));
+ Object requestBody = req.getAttribute(ConstantValues.REQUEST_BODY);
+ if (null == requestBody) {
+ requestBody = "";
+ }
+ LOGGER.error("异常参数: {}", requestBody.toString());
+ LOGGER.error("异常UA: {}", req.getHeader("user-agent"));
+ LOGGER.error("异常referer: {}", req.getHeader("referer"));
+ LOGGER.error("异常Content-Type: {}", req.getHeader("Content-Type"));
+ }
+}
diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/api/src/main/java/com/arm/equipment/system/api/controller/app/SysBaseParamAction.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/api/src/main/java/com/arm/equipment/system/api/controller/app/SysBaseParamAction.java
new file mode 100644
index 0000000..670867b
--- /dev/null
+++ b/src/arm-equipment-system-parent/arm-equipment-system-parent/api/src/main/java/com/arm/equipment/system/api/controller/app/SysBaseParamAction.java
@@ -0,0 +1,41 @@
+package com.arm.equipment.system.api.controller.app;
+
+import com.arm.equipment.system.api.controller.BaseController;
+import com.arm.equipment.system.data.domain.system.SysBaseParam;
+import com.arm.equipment.system.data.service.system.ISysBaseParamService;
+import com.arm.equipment.system.data.vo.RespJSON;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * 系统--基础参数
+ *
+ * @author: admin
+ * @time: 2022/9/22 22:03
+ */
+@RestController
+@RequestMapping("/system/sysBaseParam")
+public class SysBaseParamAction extends BaseController {
+
+ @Autowired
+ private ISysBaseParamService sysBaseParamService;
+
+ /**
+ * 主键查询
+ *
+ * @param uniCode uniCode
+ * @return RespJSON
+ */
+ @RequestMapping("/getOneUniCode/{uniCode}")
+ public RespJSON getOneUniCode(@PathVariable String uniCode) {
+ SysBaseParam baseParamDB = sysBaseParamService.getOneByUniCode(uniCode);
+ if (baseParamDB != null) {
+ //不返回备注
+ baseParamDB.setDescription(null);
+ }
+ return RespJSON.success(baseParamDB);
+ }
+
+}
diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/api/src/main/java/com/arm/equipment/system/api/controller/common/UploadAction.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/api/src/main/java/com/arm/equipment/system/api/controller/common/UploadAction.java
new file mode 100644
index 0000000..d7d69a9
--- /dev/null
+++ b/src/arm-equipment-system-parent/arm-equipment-system-parent/api/src/main/java/com/arm/equipment/system/api/controller/common/UploadAction.java
@@ -0,0 +1,54 @@
+package com.arm.equipment.system.api.controller.common;
+
+
+import com.arm.equipment.system.api.controller.BaseController;
+import com.arm.equipment.system.data.enums.file.EnumUpload;
+import com.arm.equipment.system.data.exception.BusinessException;
+import com.arm.equipment.system.data.service.file.IFileService;
+import com.arm.equipment.system.data.util.StringUtils;
+import com.arm.equipment.system.data.vo.RespJSON;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+import org.springframework.web.multipart.MultipartFile;
+
+/**
+ * 公共文件上传接口
+ *
+ * @author: xly
+ * @time: 2023/3/10 10:55
+ */
+@RestController
+@RequestMapping("/common/file")
+public class UploadAction extends BaseController {
+ @Autowired
+ private IFileService fileService;
+
+ /**
+ * 文件上传接口
+ *
+ * @param file
+ * @return
+ */
+ @PostMapping("/upload")
+ public RespJSON upload(String uploadItem, @RequestParam("file") MultipartFile file) {
+ if (null == file) {
+ throw new BusinessException("文件不合法");
+ }
+ EnumUpload enumUploadItem = EnumUpload.RES_PHOTO_LIB;
+ if (StringUtils.isNotBlank(uploadItem)) {
+ enumUploadItem = EnumUpload.getEnum(uploadItem);
+ }
+ if (enumUploadItem == null) {
+ throw new BusinessException("上传文件类目不正确");
+ }
+ try {
+ return RespJSON.success(fileService.upload(file, enumUploadItem));
+ } catch (Exception e) {
+ logger.error("文件上传错误", e);
+ throw new BusinessException("文件上传错误");
+ }
+ }
+}
diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/api/src/main/java/com/arm/equipment/system/api/controller/dict/DictAction.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/api/src/main/java/com/arm/equipment/system/api/controller/dict/DictAction.java
new file mode 100644
index 0000000..e8fe92f
--- /dev/null
+++ b/src/arm-equipment-system-parent/arm-equipment-system-parent/api/src/main/java/com/arm/equipment/system/api/controller/dict/DictAction.java
@@ -0,0 +1,30 @@
+package com.arm.equipment.system.api.controller.dict;
+
+
+import com.arm.equipment.system.data.service.common.IDictService;
+import com.arm.equipment.system.data.vo.RespJSON;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * 字典接口
+ */
+@RestController
+@RequestMapping("/common/dict")
+public class DictAction {
+ @Autowired
+ private IDictService dictService;
+
+ /**
+ * 统计枚举名称获得枚举的数据
+ *
+ * @param name
+ * @return
+ */
+ @RequestMapping("/getDictData/{name}")
+ public RespJSON getDictData(@PathVariable("name") String name) {
+ return RespJSON.success(dictService.getDictData(name));
+ }
+}
diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/api/src/main/java/com/arm/equipment/system/api/controller/user/AppUserAction.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/api/src/main/java/com/arm/equipment/system/api/controller/user/AppUserAction.java
new file mode 100644
index 0000000..d6a121e
--- /dev/null
+++ b/src/arm-equipment-system-parent/arm-equipment-system-parent/api/src/main/java/com/arm/equipment/system/api/controller/user/AppUserAction.java
@@ -0,0 +1,75 @@
+package com.arm.equipment.system.api.controller.user;
+
+import com.arm.equipment.system.api.annotation.LoginCheck;
+import com.arm.equipment.system.api.controller.BaseController;
+import com.arm.equipment.system.api.util.LoginUtil;
+import com.arm.equipment.system.data.constant.RedisKeys;
+import com.arm.equipment.system.data.domain.user.AppUser;
+import com.arm.equipment.system.data.exception.BusinessException;
+import com.arm.equipment.system.data.service.user.IAppUserService;
+import com.arm.equipment.system.data.vo.RespJSON;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.Optional;
+
+/**
+ * 用户
+ *
+ * @author ousei
+ * @date 2020年11月4日15:13:16
+ */
+@RestController
+@RequestMapping("/user/appUser")
+public class AppUserAction extends BaseController {
+ @Autowired
+ private IAppUserService appUserService;
+
+ @LoginCheck
+ @PostMapping("/getUserInfo")
+ public RespJSON getBaseUserInfo(@SessionAttribute(value = LoginUtil.LOGIN_USER_SESSION_KEY, required = false) AppUser loginUser, HttpServletRequest request) {
+ AppUser appUserDB = Optional.ofNullable(appUserService.getOneById(loginUser.getId())).orElseThrow(() -> new BusinessException("用户不存在"));
+ LoginUtil.saveInCache(appUserDB, request);
+ return RespJSON.success(appUserDB);
+ }
+
+ /**
+ * 登录
+ * * @return
+ */
+ @PostMapping("/login")
+ public RespJSON login(@RequestBody AppUser appUser, HttpServletRequest request) {
+ AppUser appUserDB = appUserService.login(appUser);
+ LoginUtil.saveInCache(appUserDB, request);
+ return RespJSON.success(appUserDB);
+ }
+
+ /**
+ * 注册
+ *
+ * @param req
+ * @return
+ */
+ @PostMapping("/save")
+ public RespJSON save(@RequestBody AppUser req) {
+ appUserService.saveUser(req);
+ return RespJSON.success();
+ }
+
+ /**
+ * 退出登陆
+ *
+ * @param loginUser
+ * @return
+ */
+ @LoginCheck
+ @PostMapping("/logout")
+ public RespJSON logout(@SessionAttribute(LoginUtil.LOGIN_USER_SESSION_KEY) AppUser loginUser) {
+ // 删除登陆缓存
+ redisTemplate.delete(RedisKeys.getAppUserSessionKey(loginUser.getToken()));
+ return RespJSON.success();
+ }
+
+
+}
diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/api/src/main/java/com/arm/equipment/system/api/controller/weaponry/WeaponryAction.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/api/src/main/java/com/arm/equipment/system/api/controller/weaponry/WeaponryAction.java
new file mode 100644
index 0000000..5055113
--- /dev/null
+++ b/src/arm-equipment-system-parent/arm-equipment-system-parent/api/src/main/java/com/arm/equipment/system/api/controller/weaponry/WeaponryAction.java
@@ -0,0 +1,76 @@
+package com.arm.equipment.system.api.controller.weaponry;
+
+import com.arm.equipment.system.api.controller.BaseController;
+import com.arm.equipment.system.data.domain.weaponry.Weaponry;
+import com.arm.equipment.system.data.enums.dict.EnumStatus;
+import com.arm.equipment.system.data.enums.dict.EnumYesNo;
+import com.arm.equipment.system.data.service.weaponry.IWeaponryLendRecordService;
+import com.arm.equipment.system.data.service.weaponry.IWeaponryService;
+import com.arm.equipment.system.data.util.WJAssert;
+import com.arm.equipment.system.data.vo.RespJSON;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * 装备武器
+ *
+ * @author admin
+ * @date 2023年03月22日 10:39:04
+ */
+@RestController
+@RequestMapping("/weaponry/weaponry")
+public class WeaponryAction extends BaseController {
+
+ @Autowired
+ private IWeaponryService weaponryService;
+ @Autowired
+ private IWeaponryLendRecordService weaponryLendRecordService;
+
+ /**
+ * 分页查询
+ *
+ * @param weaponryReq weaponryReq
+ * @return RespJSON
+ */
+ @PostMapping("/getPageList")
+ public RespJSON getPageList(@RequestBody Weaponry weaponryReq) {
+ WJAssert.notNull(weaponryReq.getPageNo(), "参数非法");
+ WJAssert.notNull(weaponryReq.getPageSize(), "参数非法");
+ weaponryReq.setStatus(EnumStatus.AUDIT.getCode());
+ List list = weaponryService.getPageList(weaponryReq)
+ .parallelStream()
+ .peek(item -> {
+ item.setIsLend(EnumYesNo.NO.getCode());
+ //判断是否已借出
+ int count = weaponryLendRecordService.getCountByWeaponryId(item.getId());
+ if (count > 0) {
+ item.setIsLend(EnumYesNo.YES.getCode());
+ }
+ }).collect(Collectors.toList());
+
+ return RespJSON.success(list);
+ }
+
+ /**
+ * 武器预警定位列表(查询借出数量大于1的武器列表)
+ *
+ * @param weaponryReq weaponryReq
+ * @return RespJSON
+ */
+ @PostMapping("/getLocationWarningPageList")
+ public RespJSON getLocationWarningPageList(@RequestBody Weaponry weaponryReq) {
+ WJAssert.notNull(weaponryReq.getPageNo(), "参数非法");
+ WJAssert.notNull(weaponryReq.getPageSize(), "参数非法");
+ weaponryReq.setStatus(EnumStatus.AUDIT.getCode());
+ weaponryReq.setLockInventoryStart(1);
+ List list = weaponryService.getPageList(weaponryReq);
+ return RespJSON.success(list);
+ }
+
+}
diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/api/src/main/java/com/arm/equipment/system/api/controller/weaponry/WeaponryLendRecordAction.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/api/src/main/java/com/arm/equipment/system/api/controller/weaponry/WeaponryLendRecordAction.java
new file mode 100644
index 0000000..96bb4f6
--- /dev/null
+++ b/src/arm-equipment-system-parent/arm-equipment-system-parent/api/src/main/java/com/arm/equipment/system/api/controller/weaponry/WeaponryLendRecordAction.java
@@ -0,0 +1,58 @@
+package com.arm.equipment.system.api.controller.weaponry;
+
+
+import com.arm.equipment.system.api.controller.BaseController;
+import com.arm.equipment.system.data.domain.weaponry.WeaponryLendRecord;
+import com.arm.equipment.system.data.enums.dict.EnumWeaponryLendRecordStatus;
+import com.arm.equipment.system.data.service.weaponry.IWeaponryLendRecordService;
+import com.arm.equipment.system.data.util.WJAssert;
+import com.arm.equipment.system.data.vo.RespJSON;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+/**
+ * 装备武器借出表
+ *
+ * @author admin
+ * @date 2023年03月22日 10:57:51
+ */
+@RestController
+@RequestMapping("/weaponry/weaponryLend")
+public class WeaponryLendRecordAction extends BaseController {
+
+ @Autowired
+ private IWeaponryLendRecordService weaponryLendRecordService;
+
+ /**
+ * 保存或更新
+ *
+ * @param weaponryLendRecord weaponryLendRecord
+ * @return RespJSON
+ */
+ @PostMapping("/save")
+ public RespJSON save(@RequestBody WeaponryLendRecord weaponryLendRecord) {
+ weaponryLendRecordService.saveLend(weaponryLendRecord);
+ return RespJSON.success();
+ }
+
+ /**
+ * 分页查询
+ *
+ * @param weaponryLendReq weaponryLendReq
+ * @return RespJSON
+ */
+ @PostMapping("/getPageList")
+ public RespJSON getPageList(@RequestBody WeaponryLendRecord weaponryLendReq) {
+ WJAssert.notNull(weaponryLendReq.getPageNo(), "参数非法");
+ WJAssert.notNull(weaponryLendReq.getPageSize(), "参数非法");
+ weaponryLendReq.setStatus(EnumWeaponryLendRecordStatus.ADOPT.getCode());
+ List pageList = weaponryLendRecordService.getPageList(weaponryLendReq);
+ return RespJSON.success(pageList);
+ }
+
+}
diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/api/src/main/java/com/arm/equipment/system/api/controller/weaponry/WeaponryReturnRecordAction.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/api/src/main/java/com/arm/equipment/system/api/controller/weaponry/WeaponryReturnRecordAction.java
new file mode 100644
index 0000000..ad402c6
--- /dev/null
+++ b/src/arm-equipment-system-parent/arm-equipment-system-parent/api/src/main/java/com/arm/equipment/system/api/controller/weaponry/WeaponryReturnRecordAction.java
@@ -0,0 +1,34 @@
+package com.arm.equipment.system.api.controller.weaponry;
+
+import com.arm.equipment.system.api.controller.BaseController;
+import com.arm.equipment.system.data.service.weaponry.IWeaponryReturnRecordService;
+import com.arm.equipment.system.data.vo.RespJSON;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ * 装备武器归还日志
+ *
+ * @author admin
+ * @date 2023年03月22日 10:42:24
+ */
+@RestController
+@RequestMapping("/weaponry/weaponryReturnRecord")
+public class WeaponryReturnRecordAction extends BaseController {
+
+ @Autowired
+ private IWeaponryReturnRecordService weaponryReturnRecordService;
+
+ /**
+ * 保存归还
+ *
+ * @param lendRecordId
+ * @return
+ */
+ @GetMapping("/save")
+ public RespJSON save( Long lendRecordId) {
+ weaponryReturnRecordService.saveReturn(lendRecordId);
+ return RespJSON.success();
+ }
+
+}
diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/api/src/main/java/com/arm/equipment/system/api/filter/BodyReaderHttpServletRequestWrapper.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/api/src/main/java/com/arm/equipment/system/api/filter/BodyReaderHttpServletRequestWrapper.java
new file mode 100644
index 0000000..fa32531
--- /dev/null
+++ b/src/arm-equipment-system-parent/arm-equipment-system-parent/api/src/main/java/com/arm/equipment/system/api/filter/BodyReaderHttpServletRequestWrapper.java
@@ -0,0 +1,91 @@
+package com.arm.equipment.system.api.filter;
+
+import javax.servlet.ReadListener;
+import javax.servlet.ServletInputStream;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletRequestWrapper;
+import java.io.*;
+import java.nio.charset.Charset;
+import java.nio.charset.StandardCharsets;
+
+/**
+ * request封装
+ */
+public class BodyReaderHttpServletRequestWrapper extends HttpServletRequestWrapper {
+
+ private final byte[] body;
+ private String bodyStr;
+
+ public BodyReaderHttpServletRequestWrapper(HttpServletRequest request) throws IOException {
+ super(request);
+ String bodyString = getBodyString(request);
+ body = bodyString.getBytes(StandardCharsets.UTF_8);
+ bodyStr = bodyString;
+ }
+
+ public String getBodyStr() {
+ return bodyStr;
+ }
+
+ @Override
+ public ServletInputStream getInputStream() throws IOException {
+ final ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(body);
+
+ return new ServletInputStream() {
+ @Override
+ public int read() throws IOException {
+ return byteArrayInputStream.read();
+ }
+
+ @Override
+ public boolean isFinished() {
+ return false;
+ }
+
+ @Override
+ public boolean isReady() {
+ return false;
+ }
+
+ @Override
+ public void setReadListener(ReadListener readListener) {
+ }
+ };
+ }
+
+
+ public String getBodyString(HttpServletRequest request) throws IOException {
+ StringBuilder sb = new StringBuilder();
+ InputStream inputStream = null;
+ BufferedReader reader = null;
+ try {
+ inputStream = request.getInputStream();
+ reader = new BufferedReader(
+ new InputStreamReader(inputStream, Charset.forName("UTF-8")));
+
+ char[] bodyCharBuffer = new char[1024];
+ int len = 0;
+ while ((len = reader.read(bodyCharBuffer)) != -1) {
+ sb.append(new String(bodyCharBuffer, 0, len));
+ }
+ } catch (IOException e) {
+ e.printStackTrace();
+ } finally {
+ if (inputStream != null) {
+ try {
+ inputStream.close();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+ if (reader != null) {
+ try {
+ reader.close();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+ }
+ return sb.toString();
+ }
+}
diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/api/src/main/java/com/arm/equipment/system/api/filter/LoginFilter.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/api/src/main/java/com/arm/equipment/system/api/filter/LoginFilter.java
new file mode 100644
index 0000000..1238d50
--- /dev/null
+++ b/src/arm-equipment-system-parent/arm-equipment-system-parent/api/src/main/java/com/arm/equipment/system/api/filter/LoginFilter.java
@@ -0,0 +1,93 @@
+package com.arm.equipment.system.api.filter;
+
+import com.alibaba.fastjson.JSON;
+import com.arm.equipment.system.api.annotation.LoginCheck;
+import com.arm.equipment.system.api.util.LoginUtil;
+import com.google.common.base.Throwables;
+import com.arm.equipment.system.data.domain.user.AppUser;
+import com.arm.equipment.system.data.util.StringUtils;
+import com.arm.equipment.system.data.vo.RespJSON;
+import com.arm.equipment.system.data.vo.ReturnCode;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.core.annotation.Order;
+import org.springframework.web.method.HandlerMethod;
+import org.springframework.web.servlet.HandlerInterceptor;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.servlet.http.HttpSession;
+import java.io.IOException;
+import java.io.PrintWriter;
+
+/**
+ * 登录过滤器
+ * 用于将登录信息放到session中
+ **/
+@Order(1004)
+@Configuration
+public class LoginFilter implements HandlerInterceptor {
+ private final static Logger logger = LoggerFactory.getLogger(LoginFilter.class);
+ private final String NO_LOGIN_RETURN_INFO = JSON.toJSONString(RespJSON.returnCode(ReturnCode.NOT_LOGIN_ERROR));
+
+ @Override
+ public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
+ // 将 options 请求放过
+ String method = request.getMethod();
+ if ("options".equalsIgnoreCase(method)) {
+ return true;
+ }
+ HandlerMethod handlerMethod = (HandlerMethod) handler;
+ LoginCheck loginCheckAnnotation = handlerMethod.getMethodAnnotation(LoginCheck.class);
+ String userTokenHeader = request.getHeader("User-Token");
+ AppUser loginUser;
+ // 不需要登录的接口直接放过
+ if (null == loginCheckAnnotation) {
+ if (StringUtils.isEmpty(userTokenHeader)) {
+ return true;
+ }
+ // 没有获取到用户信息 直接报错
+ loginUser = LoginUtil.getLoginUser(userTokenHeader);
+
+ } else {
+ // 请求头没有token 直接报错
+ if (StringUtils.isEmpty(userTokenHeader)) {
+ returnNoLogin(response);
+ return false;
+ }
+ // 没有获取到用户信息 直接报错
+ loginUser = LoginUtil.getLoginUser(userTokenHeader);
+ if (null == loginUser) {
+ returnNoLogin(response);
+ return false;
+ }
+ }
+
+ // 用户信息保存到session
+ AppUser finalLoginUser = loginUser;
+ HttpSession session = request.getSession();
+ session.setAttribute(LoginUtil.LOGIN_USER_SESSION_KEY, finalLoginUser);
+ return true;
+ }
+
+ /**
+ * 未登录时的返回内容
+ *
+ * @param response
+ * @return
+ */
+ private void returnNoLogin(HttpServletResponse response) {
+ response.setCharacterEncoding("UTF-8");
+ response.setHeader("Content-Type", "application/json; charset=utf-8");
+ PrintWriter writer = null;
+ try {
+ writer = response.getWriter();
+ writer.write(NO_LOGIN_RETURN_INFO);
+ } catch (IOException e) {
+ logger.error(Throwables.getStackTraceAsString(e));
+ } finally {
+ writer.close();
+ }
+ }
+}
diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/api/src/main/java/com/arm/equipment/system/api/filter/RequestBodyFilter.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/api/src/main/java/com/arm/equipment/system/api/filter/RequestBodyFilter.java
new file mode 100644
index 0000000..4469a39
--- /dev/null
+++ b/src/arm-equipment-system-parent/arm-equipment-system-parent/api/src/main/java/com/arm/equipment/system/api/filter/RequestBodyFilter.java
@@ -0,0 +1,37 @@
+package com.arm.equipment.system.api.filter;
+
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.stereotype.Component;
+
+import javax.servlet.*;
+import javax.servlet.annotation.WebFilter;
+import javax.servlet.http.HttpServletRequest;
+import java.io.IOException;
+
+/**
+ * 记录用户请求参数
+ */
+@Component
+@WebFilter(filterName = "httpServletRequestWrapperFilter", urlPatterns = {"/"})
+public class RequestBodyFilter implements Filter {
+
+ @Override
+ public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
+ ServletRequest requestWrapper = null;
+ if (request instanceof HttpServletRequest) {
+ HttpServletRequest httpRequest = (HttpServletRequest) request;
+ //遇到post方法才对request进行包装
+ String methodType = httpRequest.getMethod();
+ String contentType = ((HttpServletRequest) request).getHeader("Content-Type");
+ if (StringUtils.isNotEmpty(contentType) && contentType.contains("application/json") && "POST".equals(methodType)) {
+ requestWrapper = new BodyReaderHttpServletRequestWrapper((HttpServletRequest) request);
+ }
+ }
+ if (null == requestWrapper) {
+ chain.doFilter(request, response);
+ } else {
+ chain.doFilter(requestWrapper, response);
+
+ }
+ }
+}
diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/api/src/main/java/com/arm/equipment/system/api/util/LoginUtil.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/api/src/main/java/com/arm/equipment/system/api/util/LoginUtil.java
new file mode 100644
index 0000000..9e735cf
--- /dev/null
+++ b/src/arm-equipment-system-parent/arm-equipment-system-parent/api/src/main/java/com/arm/equipment/system/api/util/LoginUtil.java
@@ -0,0 +1,121 @@
+package com.arm.equipment.system.api.util;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.arm.equipment.system.data.constant.RedisKeys;
+import com.arm.equipment.system.data.domain.user.AppUser;
+import com.arm.equipment.system.data.util.UuidUtils;
+import com.arm.equipment.system.data.util.WJAssert;
+import org.apache.commons.collections4.CollectionUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.data.redis.core.SetOperations;
+import org.springframework.data.redis.core.ValueOperations;
+import org.springframework.stereotype.Component;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpSession;
+import java.util.Set;
+import java.util.concurrent.LinkedBlockingQueue;
+import java.util.concurrent.ThreadPoolExecutor;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * 登录用户的工具类
+ */
+@Component
+public class LoginUtil {
+ private final static Logger logger = LoggerFactory.getLogger(LoginUtil.class);
+ private static RedisTemplate redisTemplate;
+ private static ValueOperations valueOps;
+ /**
+ * 登录用户在session中的key
+ */
+ public static final String LOGIN_USER_SESSION_KEY = "appUserSessionKey";
+ /**
+ * 50个线程, 无界队列, 超过异常
+ */
+ private final static ThreadPoolExecutor THREAD_POOL_EXECUTOR = new ThreadPoolExecutor(50, 50, 120, TimeUnit.SECONDS, new LinkedBlockingQueue<>(), new ThreadPoolExecutor.AbortPolicy());
+
+ public static AppUser getLoginUser(String token) {
+ WJAssert.isMaxLength(token, 500, "token非法");
+ String key = RedisKeys.getAppUserSessionKey(token);
+ String s = valueOps.get(key);
+ if (StringUtils.isEmpty(s)) {
+ return null;
+ }
+ return JSONObject.parseObject(s, AppUser.class);
+ }
+
+ /**
+ * 用户登录状态保存到redis
+ * 不会重新设置token
+ *
+ * @param appUser
+ * @param request
+ * @return
+ */
+ public static AppUser refreshCache(AppUser appUser, HttpServletRequest request) {
+ String key = RedisKeys.getAppUserSessionKey(appUser.getToken());
+ valueOps.set(key, JSON.toJSONString(appUser), 1, TimeUnit.DAYS);
+ HttpSession session = request.getSession();
+ if (null == session) {
+ logger.info("session 是空的");
+ return null;
+ }
+ session.setAttribute(LoginUtil.LOGIN_USER_SESSION_KEY, appUser);
+ return appUser;
+ }
+
+ /**
+ * 用户登录状态保存到redis
+ * 会重新设置token
+ *
+ * @param appUser
+ * @param request
+ * @return
+ */
+ public static AppUser saveInCache(AppUser appUser, HttpServletRequest request) {
+ appUser.setToken(UuidUtils.uuid());
+ refreshCache(appUser, request);
+ // 保存token和用户的关系, 是个 set
+ String appUsernameByTokenSetKey = RedisKeys.getAppUsernameByTokenSetKey(appUser.getUsername());
+ SetOperations setOps = redisTemplate.opsForSet();
+ setOps.add(appUsernameByTokenSetKey, appUser.getToken());
+ // 清除set中的过期token, 避免set过大
+ clearUserTokenSet(appUsernameByTokenSetKey);
+ return appUser;
+ }
+
+ /**
+ * 清除用户的登录token set避免过大
+ *
+ * @param appUsernameByTokenSetKey
+ */
+ private static void clearUserTokenSet(String appUsernameByTokenSetKey) {
+ THREAD_POOL_EXECUTOR.submit(() -> {
+ SetOperations setOps = redisTemplate.opsForSet();
+ Set tokenSet = setOps.members(appUsernameByTokenSetKey);
+ if (CollectionUtils.isEmpty(tokenSet)) {
+ return;
+ }
+ tokenSet.forEach(token -> {
+ String appUserSessionKey = RedisKeys.getAppUserSessionKey(token);
+ Long expire = redisTemplate.getExpire(appUserSessionKey);
+ if (null == expire || expire < 0) {
+ logger.info("删除过期key {}", token);
+ setOps.remove(appUsernameByTokenSetKey, token);
+ }
+ });
+ });
+ }
+
+ @Autowired
+ public void setRedisTemplate(RedisTemplate redisTemplate) {
+ LoginUtil.redisTemplate = redisTemplate;
+ LoginUtil.valueOps = redisTemplate.opsForValue();
+ }
+}
diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/api/src/main/java/com/arm/equipment/system/api/vo/user/RefreshTokenVO.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/api/src/main/java/com/arm/equipment/system/api/vo/user/RefreshTokenVO.java
new file mode 100644
index 0000000..6927787
--- /dev/null
+++ b/src/arm-equipment-system-parent/arm-equipment-system-parent/api/src/main/java/com/arm/equipment/system/api/vo/user/RefreshTokenVO.java
@@ -0,0 +1,24 @@
+package com.arm.equipment.system.api.vo.user;
+
+public class RefreshTokenVO {
+ /** 手机号 */
+ private String data;
+ /** 平台 */
+ private Integer platform;
+
+ public Integer getPlatform() {
+ return platform;
+ }
+
+ public void setPlatform(Integer platform) {
+ this.platform = platform;
+ }
+
+ public String getData() {
+ return data;
+ }
+
+ public void setData(String data) {
+ this.data = data;
+ }
+}
diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/api/src/main/java/com/arm/equipment/system/api/vo/user/UpdateUserVO.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/api/src/main/java/com/arm/equipment/system/api/vo/user/UpdateUserVO.java
new file mode 100644
index 0000000..a08d651
--- /dev/null
+++ b/src/arm-equipment-system-parent/arm-equipment-system-parent/api/src/main/java/com/arm/equipment/system/api/vo/user/UpdateUserVO.java
@@ -0,0 +1,72 @@
+package com.arm.equipment.system.api.vo.user;
+
+import java.util.Date;
+
+/**
+ *
+ * 编辑用户信息VO
+ * @author: xly
+ * @time: 2022/9/19 12:00
+ */
+public class UpdateUserVO {
+ /** 生日 */
+ private Date birthday;
+ /** 昵称 */
+ private String nickname;
+ /** 性别 1 男 2 女 */
+ private Integer genderCode;
+ /** 所在地址 */
+ private String address;
+ /** 学历 */
+ private String education;
+ /**头像 */
+ private String avatarPath;
+
+ public String getAvatarPath() {
+ return avatarPath;
+ }
+
+ public void setAvatarPath(String avatarPath) {
+ this.avatarPath = avatarPath;
+ }
+
+ public Date getBirthday() {
+ return birthday;
+ }
+
+ public void setBirthday(Date birthday) {
+ this.birthday = birthday;
+ }
+
+ public String getNickname() {
+ return nickname;
+ }
+
+ public void setNickname(String nickname) {
+ this.nickname = nickname;
+ }
+
+ public Integer getGenderCode() {
+ return genderCode;
+ }
+
+ public void setGenderCode(Integer genderCode) {
+ this.genderCode = genderCode;
+ }
+
+ public String getAddress() {
+ return address;
+ }
+
+ public void setAddress(String address) {
+ this.address = address;
+ }
+
+ public String getEducation() {
+ return education;
+ }
+
+ public void setEducation(String education) {
+ this.education = education;
+ }
+}
diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/api/src/main/java/com/arm/equipment/system/api/vo/user/UserCenterVO.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/api/src/main/java/com/arm/equipment/system/api/vo/user/UserCenterVO.java
new file mode 100644
index 0000000..cada3fb
--- /dev/null
+++ b/src/arm-equipment-system-parent/arm-equipment-system-parent/api/src/main/java/com/arm/equipment/system/api/vo/user/UserCenterVO.java
@@ -0,0 +1,34 @@
+package com.arm.equipment.system.api.vo.user;
+
+/**
+ * 用户中心VO
+ * @author: xly
+ * @time: 2021/11/19 17:41
+ */
+public class UserCenterVO {
+ /**
+ * 用户ID
+ */
+ private String userId;
+ /**
+ * 由于微兔眼小程序只统计爆料评论的总数 所以这里由此类型
+ * 请求类型 type (0 智能农机云 1 微兔眼小程序)
+ */
+ private Integer type;
+
+ public String getUserId() {
+ return userId;
+ }
+
+ public void setUserId(String userId) {
+ this.userId = userId;
+ }
+
+ public Integer getType() {
+ return type;
+ }
+
+ public void setType(Integer type) {
+ this.type = type;
+ }
+}
diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/api/src/main/java/com/arm/equipment/system/api/vo/user/UserLoginVO.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/api/src/main/java/com/arm/equipment/system/api/vo/user/UserLoginVO.java
new file mode 100644
index 0000000..3226038
--- /dev/null
+++ b/src/arm-equipment-system-parent/arm-equipment-system-parent/api/src/main/java/com/arm/equipment/system/api/vo/user/UserLoginVO.java
@@ -0,0 +1,110 @@
+package com.arm.equipment.system.api.vo.user;
+
+/**
+ * 用户登录信息VO
+ *
+ * @author ousei
+ * @date 2020年11月4日15:17:48
+ */
+public class UserLoginVO {
+ /** 手机号 */
+ private String username;
+ /** 验证码 */
+ private String verifyCode;
+ /** 设备TOKEN */
+ private String deviceToken;
+ /** unionid */
+ private String unionid;
+ /** 登录的类型 */
+ private Integer loginType;
+ /**用户密码*/
+ private String password;
+ /**平台*/
+ private Integer platform;
+ /**邀请码*/
+ private String invcode;
+ /**微信code**/
+ private String code;
+ /**一键登录手机号token*/
+ private String usernameToken;
+
+ public String getUsernameToken() {
+ return usernameToken;
+ }
+
+ public void setUsernameToken(String usernameToken) {
+ this.usernameToken = usernameToken;
+ }
+
+ public String getCode() {
+ return code;
+ }
+
+ public void setCode(String code) {
+ this.code = code;
+ }
+
+ public Integer getPlatform() {
+ return platform;
+ }
+
+ public void setPlatform(Integer platform) {
+ this.platform = platform;
+ }
+
+ public String getInvcode() {
+ return invcode;
+ }
+
+ public void setInvcode(String invcode) {
+ this.invcode = invcode;
+ }
+
+ public String getPassword() {
+ return password;
+ }
+
+ public void setPassword(String password) {
+ this.password = password;
+ }
+
+ public Integer getLoginType() {
+ return loginType;
+ }
+
+ public void setLoginType(Integer loginType) {
+ this.loginType = loginType;
+ }
+
+ public String getUnionid() {
+ return unionid;
+ }
+
+ public void setUnionid(String unionid) {
+ this.unionid = unionid;
+ }
+
+ public String getUsername() {
+ return username;
+ }
+
+ public void setUsername(String username) {
+ this.username = username;
+ }
+
+ public String getVerifyCode() {
+ return verifyCode;
+ }
+
+ public void setVerifyCode(String verifyCode) {
+ this.verifyCode = verifyCode;
+ }
+
+ public String getDeviceToken() {
+ return deviceToken;
+ }
+
+ public void setDeviceToken(String deviceToken) {
+ this.deviceToken = deviceToken;
+ }
+}
diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/api/src/main/resources/application-dev.yml b/src/arm-equipment-system-parent/arm-equipment-system-parent/api/src/main/resources/application-dev.yml
new file mode 100644
index 0000000..30a52df
--- /dev/null
+++ b/src/arm-equipment-system-parent/arm-equipment-system-parent/api/src/main/resources/application-dev.yml
@@ -0,0 +1,31 @@
+env: dev
+spring:
+ datasource:
+ url: jdbc:mysql://127.0.0.1:3306/arm-equipment-system?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai&zeroDateTimeBehavior=convertToNull
+ driver-class-name: com.mysql.cj.jdbc.Driver
+ username: root
+ password:
+ type: com.zaxxer.hikari.HikariDataSource
+ hikari:
+ auto-commit: true
+ connection-timeout: 30000
+ idle-timeout: 600000
+ max-lifetime: 1800000
+ minimum-idle: 1
+ maximum-pool-size: 10
+ pool-name: hikaricp
+ validation-timeout: 5000
+ redis:
+ host: 127.0.0.1
+ port: 6379
+ password:
+ database: 0
+ timeout: 5000ms
+ lettuce:
+ pool:
+ max-idle: 100
+ min-idle: 1
+ max-active: 1000
+ web:
+ resources:
+ static-locations: file:admin/src/main/resources/static
diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/api/src/main/resources/application.yml b/src/arm-equipment-system-parent/arm-equipment-system-parent/api/src/main/resources/application.yml
new file mode 100644
index 0000000..d80075d
--- /dev/null
+++ b/src/arm-equipment-system-parent/arm-equipment-system-parent/api/src/main/resources/application.yml
@@ -0,0 +1,21 @@
+git:
+ version: "@git.commit.id.abbrev@"
+ commitTime: "@git.commit.time@"
+server:
+ port: 8088
+ compression:
+ enabled: true
+ mime-types: application/javascript,text/css,application/json,application/xml,text/html,text/xml,text/plain
+spring:
+ jackson:
+ serialization:
+ write-dates-as-timestamps: true
+ output:
+ ansi:
+ enabled: always
+ webflux:
+ static-path-pattern: /**
+ session:
+ store-type: redis
+ profiles:
+ active: dev
diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/api/src/main/resources/logback-spring.xml b/src/arm-equipment-system-parent/arm-equipment-system-parent/api/src/main/resources/logback-spring.xml
new file mode 100644
index 0000000..c0898d6
--- /dev/null
+++ b/src/arm-equipment-system-parent/arm-equipment-system-parent/api/src/main/resources/logback-spring.xml
@@ -0,0 +1,41 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ${log.base}.log
+
+ true
+ 30
+
+ ${log.base}.%d{yyyy-MM-dd}.log
+
+
+
+
+ %date [%thread] %-5level %logger{80} - %msg%n
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/api/src/test/java/com/arm/equipment/system/api/ApiApplicationTests.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/api/src/test/java/com/arm/equipment/system/api/ApiApplicationTests.java
new file mode 100644
index 0000000..83c2b60
--- /dev/null
+++ b/src/arm-equipment-system-parent/arm-equipment-system-parent/api/src/test/java/com/arm/equipment/system/api/ApiApplicationTests.java
@@ -0,0 +1,22 @@
+package com.arm.equipment.system.api;
+
+import com.arm.equipment.system.api.app.ApiApplication;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.context.ActiveProfiles;
+import org.springframework.test.context.junit.jupiter.SpringExtension;
+
+@ExtendWith(SpringExtension.class)
+@SpringBootTest(classes = ApiApplication.class)
+@ActiveProfiles(profiles = "dev")
+public class ApiApplicationTests {
+ private final static Logger LOGGER = LoggerFactory.getLogger(ApiApplicationTests.class);
+
+ @Test
+ public void test() {
+
+ }
+}
diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/pom.xml b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/pom.xml
new file mode 100644
index 0000000..ac9ec02
--- /dev/null
+++ b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/pom.xml
@@ -0,0 +1,141 @@
+
+
+ 4.0.0
+
+ com.arm.equipment.system
+ arm-equipment-system-parent
+ 0.0.1-SNAPSHOT
+
+ data
+ 0.0.1-SNAPSHOT
+ data
+ 业务公共项目
+
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+
+ org.mybatis.spring.boot
+ mybatis-spring-boot-starter
+
+
+
+ org.springframework.boot
+ spring-boot-starter-aop
+
+
+
+ mysql
+ mysql-connector-java
+
+
+
+ org.apache.commons
+ commons-lang3
+
+
+
+ com.alibaba
+ fastjson
+
+
+
+ org.springframework.boot
+ spring-boot-starter-data-redis
+
+
+
+ org.springframework.boot
+ spring-boot-starter
+
+
+
+ org.apache.commons
+ commons-pool2
+
+
+
+ org.bouncycastle
+ bcprov-jdk16
+ 1.46
+
+
+
+
+ org.apache.velocity
+ velocity
+ 1.7
+ test
+
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
+ com.alibaba
+ easyexcel
+
+
+ commons-logging
+ commons-logging
+
+
+ 1.1.1
+
+
+ org.apache.httpcomponents
+ httpmime
+ 4.5.2
+
+
+
+ javax.validation
+ validation-api
+ 2.0.1.Final
+
+
+ org.hibernate
+ hibernate-validator
+ 5.2.0.Final
+
+
+ commons-lang
+ commons-lang
+ 2.6
+
+
+
+ org.jsoup
+ jsoup
+ 1.13.1
+
+
+
+ com.belerweb
+ pinyin4j
+ 2.5.0
+
+
+ javax.servlet
+ javax.servlet-api
+ 4.0.1
+
+
+
+ com.google.zxing
+ javase
+ 3.0.0
+
+
+ com.google.guava
+ guava
+ 16.0.1
+
+
+
+
diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/app/AsyncConfiguration.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/app/AsyncConfiguration.java
new file mode 100644
index 0000000..d2c62c0
--- /dev/null
+++ b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/app/AsyncConfiguration.java
@@ -0,0 +1,36 @@
+package com.arm.equipment.system.data.app;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.scheduling.annotation.EnableAsync;
+import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
+
+import java.util.concurrent.Executor;
+import java.util.concurrent.ThreadPoolExecutor;
+
+/**
+ * spring异步配置
+ * @author admin
+ */
+@Configuration
+@EnableAsync
+public class AsyncConfiguration {
+
+ @Bean
+ public Executor threadPoolTaskExecutor() {
+ ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
+ executor.setCorePoolSize(1);
+ executor.setMaxPoolSize(100);
+ executor.setQueueCapacity(1000);
+ executor.setThreadNamePrefix("thread-pool-");
+ executor.setKeepAliveSeconds(120);
+ executor.setDaemon(true);
+ executor.setWaitForTasksToCompleteOnShutdown(true);
+ executor.setAwaitTerminationSeconds(90);
+ // CALLER_RUNS:当抛出RejectedExecutionException异常时,会调rejectedExecution方法 调用者运行策略实现了一种调节机制,
+ // 该策略既不会抛弃任务也不会爆出异常,而是将任务退回给调用者,从而降低新任务的流量
+ executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
+ executor.initialize();
+ return executor;
+ }
+}
diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/app/BCryptConfiguration.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/app/BCryptConfiguration.java
new file mode 100644
index 0000000..ffec75c
--- /dev/null
+++ b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/app/BCryptConfiguration.java
@@ -0,0 +1,25 @@
+package com.arm.equipment.system.data.app;
+
+import com.arm.equipment.system.data.util.passwordEncoder.BCryptPasswordEncoderUtils;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+/**
+ *
+ *
+ * @author: admin
+ * @time: 2022/9/16 11:20
+ */
+@Configuration
+public class BCryptConfiguration {
+
+ /**
+ * BCrypt密码校验
+ *
+ * @return
+ */
+ @Bean
+ public BCryptPasswordEncoderUtils bCryptPasswordEncoder() {
+ return new BCryptPasswordEncoderUtils(5, null);
+ }
+}
diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/app/DataApplication.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/app/DataApplication.java
new file mode 100644
index 0000000..d0db0e7
--- /dev/null
+++ b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/app/DataApplication.java
@@ -0,0 +1,17 @@
+package com.arm.equipment.system.data.app;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.transaction.annotation.EnableTransactionManagement;
+
+@SpringBootApplication
+@EnableTransactionManagement
+@ComponentScan("com.arm.equipment.system")
+public class DataApplication {
+
+ public static void main(String[] args) {
+ SpringApplication.run(DataApplication.class, args);
+ }
+
+}
diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/app/MyBatisConfiguration.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/app/MyBatisConfiguration.java
new file mode 100644
index 0000000..07f11c2
--- /dev/null
+++ b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/app/MyBatisConfiguration.java
@@ -0,0 +1,52 @@
+package com.arm.equipment.system.data.app;
+
+import com.arm.equipment.system.data.exception.BusinessException;
+import com.zaxxer.hikari.HikariDataSource;
+import org.apache.commons.lang3.ArrayUtils;
+import org.apache.ibatis.mapping.VendorDatabaseIdProvider;
+import org.apache.ibatis.session.SqlSessionFactory;
+import org.mybatis.spring.SqlSessionFactoryBean;
+import org.mybatis.spring.annotation.MapperScan;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.core.io.Resource;
+import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
+import org.springframework.core.io.support.ResourcePatternResolver;
+import org.springframework.jdbc.datasource.DataSourceTransactionManager;
+
+/**
+ * mybatis配置
+ * @author admin
+ */
+@MapperScan("com.arm.equipment.system.data.mapper")
+@Configuration
+public class MyBatisConfiguration {
+
+ @Bean(name = "sessionFactory")
+ public SqlSessionFactory sessionFactory(HikariDataSource dataSource) {
+ SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
+ bean.setDataSource(dataSource);
+ bean.setDatabaseIdProvider(new VendorDatabaseIdProvider());
+ bean.setTypeHandlersPackage("com.arm.equipment.system.data.mybatis.type");
+
+ //添加XML目录
+ ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
+ try {
+ //设置xml扫描路径
+ Resource[] baseMapperResource = resolver.getResources("classpath*:/mybatis/base-mapper.xml");
+ Resource[] resources = resolver.getResources("classpath*:/mybatis/**/*.xml");
+ bean.setMapperLocations(ArrayUtils.addAll(resources, resources));
+ return bean.getObject();
+ } catch (Exception e) {
+ throw new BusinessException("sessionFactory init fail",e);
+ }
+ }
+
+ /**
+ * 配置事务管理器
+ */
+ @Bean(name = "transactionManager")
+ public DataSourceTransactionManager transactionManager(HikariDataSource dataSource) {
+ return new DataSourceTransactionManager(dataSource);
+ }
+}
diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/app/RedisConfiguration.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/app/RedisConfiguration.java
new file mode 100644
index 0000000..418e6a7
--- /dev/null
+++ b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/app/RedisConfiguration.java
@@ -0,0 +1,174 @@
+package com.arm.equipment.system.data.app;
+
+import com.arm.equipment.system.data.constant.RedisKeys;
+import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.boot.autoconfigure.data.redis.RedisProperties;
+import org.springframework.boot.context.event.ApplicationStartedEvent;
+import org.springframework.context.ApplicationEvent;
+import org.springframework.context.ApplicationListener;
+import org.springframework.context.Lifecycle;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Primary;
+import org.springframework.context.event.ContextClosedEvent;
+import org.springframework.data.redis.cache.RedisCacheConfiguration;
+import org.springframework.data.redis.cache.RedisCacheManager;
+import org.springframework.data.redis.cache.RedisCacheWriter;
+import org.springframework.data.redis.connection.RedisConnectionFactory;
+import org.springframework.data.redis.connection.RedisStandaloneConfiguration;
+import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory;
+import org.springframework.data.redis.connection.lettuce.LettucePoolingClientConfiguration;
+import org.springframework.data.redis.connection.stream.MapRecord;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
+import org.springframework.data.redis.serializer.RedisSerializationContext;
+import org.springframework.data.redis.serializer.RedisSerializer;
+import org.springframework.data.redis.serializer.StringRedisSerializer;
+import org.springframework.data.redis.stream.StreamMessageListenerContainer;
+
+import java.time.Duration;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.concurrent.LinkedBlockingQueue;
+import java.util.concurrent.ThreadPoolExecutor;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * redis 配置
+ *
+ * @author admin
+ */
+@Configuration
+public class RedisConfiguration implements ApplicationListener {
+ @Autowired
+ private RedisProperties redisProperties;
+ /**
+ * 100个线程, 无界队列, 超过异常
+ */
+ private final static ThreadPoolExecutor THREAD_POOL_EXECUTOR = new ThreadPoolExecutor(100, 100, 120, TimeUnit.SECONDS, new LinkedBlockingQueue<>(), new ThreadPoolExecutor.AbortPolicy());
+
+ /**
+ * lettuce对象连接池
+ *
+ * @return
+ */
+ @Bean
+ public LettuceConnectionFactory lettuceConnectionFactory() {
+ RedisStandaloneConfiguration configuration = new RedisStandaloneConfiguration();
+ configuration.setHostName(redisProperties.getHost());
+ configuration.setDatabase(redisProperties.getDatabase());
+ configuration.setPort(redisProperties.getPort());
+ configuration.setPassword(redisProperties.getPassword());
+ //连接池配置
+ GenericObjectPoolConfig poolConfig = new GenericObjectPoolConfig();
+ RedisProperties.Pool pool = redisProperties.getLettuce().getPool();
+ poolConfig.setMaxIdle(20);
+ poolConfig.setMinIdle(1);
+ poolConfig.setMaxTotal(100);
+ poolConfig.setMaxWaitMillis(3000);
+ poolConfig.setTimeBetweenEvictionRunsMillis(20000);
+ poolConfig.setTestWhileIdle(true);
+ LettucePoolingClientConfiguration clientConfiguration = LettucePoolingClientConfiguration.builder()
+ .commandTimeout(Duration.ofSeconds(10))
+ .poolConfig(poolConfig).build();
+ return new LettuceConnectionFactory(configuration, clientConfiguration);
+ }
+
+ @Bean
+ public RedisTemplate getTemplate(@Qualifier(value = "redisTemplate") RedisTemplate template) {
+ template.setConnectionFactory(lettuceConnectionFactory());
+ template.setDefaultSerializer(new StringRedisSerializer());
+ template.setKeySerializer(new StringRedisSerializer());
+ template.setValueSerializer(new StringRedisSerializer());
+ template.setHashKeySerializer(new GenericJackson2JsonRedisSerializer());
+ template.setHashValueSerializer(new GenericJackson2JsonRedisSerializer());
+ return template;
+ }
+
+ /**
+ * 缓存管理器
+ * 1.默认缓存为1天
+ *
+ * @return
+ */
+ @Bean
+ @Primary
+ public RedisCacheManager cacheManager() {
+ RedisCacheWriter redisCacheWriter = RedisCacheWriter.nonLockingRedisCacheWriter(lettuceConnectionFactory());
+ GenericJackson2JsonRedisSerializer genericJackson2JsonRedisSerializer = new GenericJackson2JsonRedisSerializer();
+ RedisCacheConfiguration redisCacheConfiguration = RedisCacheConfiguration.defaultCacheConfig()
+ .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(RedisSerializer.string()))
+ .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(genericJackson2JsonRedisSerializer))
+ .entryTtl(Duration.ofDays(1));
+ RedisCacheManager redisCacheManager = RedisCacheManager.builder(redisCacheWriter)
+ .cacheDefaults(redisCacheConfiguration)
+ .withInitialCacheConfigurations(getRedisCacheConfigurationMap()).build();
+ return redisCacheManager;
+ }
+
+ /**
+ * 为指定 key 设置过期时间
+ *
+ * @return
+ */
+ private Map getRedisCacheConfigurationMap() {
+ Map redisCacheConfigurationMap = new HashMap<>();
+ redisCacheConfigurationMap.put(RedisKeys.WECHAT_ACCESS_TOKEN, getRedisCacheConfigurationWithTtl(600));
+ // 直播间统计ID集合 默认保存七天
+ return redisCacheConfigurationMap;
+ }
+
+ private RedisCacheConfiguration getRedisCacheConfigurationWithTtl(Integer seconds) {
+ GenericJackson2JsonRedisSerializer genericJackson2JsonRedisSerializer = new GenericJackson2JsonRedisSerializer();
+ return RedisCacheConfiguration.defaultCacheConfig()
+ .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(RedisSerializer.string()))
+ .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(genericJackson2JsonRedisSerializer))
+ .computePrefixWith(name -> name + ":").entryTtl(Duration.ofSeconds(seconds));
+ }
+
+
+ /**
+ * 流监听容器, 这里只是创建, 需要在下面启动
+ *
+ * @param redisConnectionFactory
+ * @return
+ */
+ @Bean
+ public StreamMessageListenerContainer> streamMessageListenerContainer(RedisConnectionFactory redisConnectionFactory) {
+ // 创建配置对象
+ StreamMessageListenerContainer.StreamMessageListenerContainerOptions> listenerContainerOptions = StreamMessageListenerContainer.StreamMessageListenerContainerOptions
+ .builder()
+ // 一次性最多拉取多少条消息
+ .batchSize(100)
+ .executor(THREAD_POOL_EXECUTOR)
+ .build();
+ // 根据配置对象创建监听容器
+
+ StreamMessageListenerContainer> listenerContainer = StreamMessageListenerContainer.create(redisConnectionFactory, listenerContainerOptions);
+ return listenerContainer;
+ }
+
+ /**
+ * 1.spring启动后启动redis监听容器
+ * 2.spring结束后关闭redis监听容器
+ *
+ * @param applicationEvent
+ */
+ @Override
+ public void onApplicationEvent(ApplicationEvent applicationEvent) {
+ if (applicationEvent instanceof ApplicationStartedEvent) {
+ // 启动redis stream 监听
+ ((ApplicationStartedEvent) applicationEvent).getApplicationContext()
+ .getBeanProvider(StreamMessageListenerContainer.class)
+ .ifAvailable(Lifecycle::start);
+ }
+ if (applicationEvent instanceof ContextClosedEvent) {
+ // 启动redis stream 监听
+ ((ContextClosedEvent) applicationEvent).getApplicationContext()
+ .getBeanProvider(StreamMessageListenerContainer.class)
+ .ifAvailable(Lifecycle::stop);
+ }
+ }
+}
diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/app/RestTemplateConfiguration.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/app/RestTemplateConfiguration.java
new file mode 100644
index 0000000..3a1d53a
--- /dev/null
+++ b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/app/RestTemplateConfiguration.java
@@ -0,0 +1,47 @@
+package com.arm.equipment.system.data.app;
+
+import com.alibaba.fastjson.serializer.SerializerFeature;
+import com.alibaba.fastjson.support.config.FastJsonConfig;
+import com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.http.client.SimpleClientHttpRequestFactory;
+import org.springframework.http.converter.FormHttpMessageConverter;
+import org.springframework.http.converter.StringHttpMessageConverter;
+import org.springframework.web.client.RestTemplate;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@Configuration
+public class RestTemplateConfiguration {
+ @Bean(name = "restTemplate")
+ public RestTemplate getRestTemplate() {
+ List messageConverters = new ArrayList<>();
+ messageConverters.add(new FormHttpMessageConverter());
+ messageConverters.add(getFastJsonHttpMessageConverter());
+ messageConverters.add(new StringHttpMessageConverter());
+ RestTemplate restTemplate = new RestTemplate(getHttpRequestFactory());
+ restTemplate.setMessageConverters(messageConverters);
+ return restTemplate;
+ }
+
+ private FastJsonHttpMessageConverter getFastJsonHttpMessageConverter() {
+ FastJsonHttpMessageConverter fastJsonHttpMessageConverter = new FastJsonHttpMessageConverter();
+ fastJsonHttpMessageConverter.setFastJsonConfig(getFastJsonConfig());
+ return fastJsonHttpMessageConverter;
+ }
+
+ private FastJsonConfig getFastJsonConfig() {
+ FastJsonConfig fastJsonConfig = new FastJsonConfig();
+ fastJsonConfig.setSerializerFeatures(SerializerFeature.WriteDateUseDateFormat);
+ return fastJsonConfig;
+ }
+
+ private SimpleClientHttpRequestFactory getHttpRequestFactory() {
+ SimpleClientHttpRequestFactory simpleClientHttpRequestFactory = new SimpleClientHttpRequestFactory();
+ simpleClientHttpRequestFactory.setConnectTimeout(120000);
+ simpleClientHttpRequestFactory.setReadTimeout(120000);
+ return simpleClientHttpRequestFactory;
+ }
+}
diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/constant/ConstantValues.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/constant/ConstantValues.java
new file mode 100644
index 0000000..c822b04
--- /dev/null
+++ b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/constant/ConstantValues.java
@@ -0,0 +1,13 @@
+package com.arm.equipment.system.data.constant;
+
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * 全局变量存放处
+ * @author wyd
+ */
+public class ConstantValues {
+ /** request请求中的参数 */
+ public final static String REQUEST_BODY = "WJ-Request-Body";
+}
diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/constant/RedisKeys.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/constant/RedisKeys.java
new file mode 100644
index 0000000..09d6080
--- /dev/null
+++ b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/constant/RedisKeys.java
@@ -0,0 +1,29 @@
+package com.arm.equipment.system.data.constant;
+
+/**
+ * redisKey集合
+ */
+public class RedisKeys {
+ public final static String SYS_BASE_PARAM_KEY = "sysBaseParamKey";
+ /** * 微信accesstoken*/
+ public final static String WECHAT_ACCESS_TOKEN = "wechatAccessToken";
+ /*** id worker service中的worker id*/
+ public static final String SNOW_FLAKE_WORKER_ID = "snow:flake_worker:id";
+ /**系统用户登陆错误次数*/
+ public static final String SYS_USER_LOGIN_ERROR_NUM = "sys:user:login:error:num:%s";
+ /**
+ * token和用户的对应关系
+ *
+ * 数据结构: SET
+ *
+ * @param token
+ * @return
+ */
+ public static String getAppUsernameByTokenSetKey(String token) {
+ return String.format("app:user:token:%s", token);
+ }
+
+ public static String getAppUserSessionKey(String token) {
+ return String.format("app:user:session:%s", token);
+ }
+}
diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/domain/BaseDomain.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/domain/BaseDomain.java
new file mode 100644
index 0000000..f6d2bb7
--- /dev/null
+++ b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/domain/BaseDomain.java
@@ -0,0 +1,65 @@
+package com.arm.equipment.system.data.domain;
+
+import java.util.Date;
+
+/**
+ * 数据库实体基类
+ * @author admin
+ */
+public class BaseDomain extends BasePage {
+ /** 主键 */
+ private Long id;
+ /** 创建时间 */
+ private Date createTime;
+ /** 更新时间 */
+ private Date updateTime;
+ /** 更新时间结束 */
+ private Date updateTimeEnd;
+ /** 操作人*/
+ private String operator;
+ /** 备注 */
+ private String remark;
+
+ public String getOperator() {
+ return operator;
+ }
+
+ public void setOperator(String operator) {
+ this.operator = operator;
+ }
+
+ public Long getId() {
+ return id;
+ }
+
+ public void setId(Long id) {
+ this.id = id;
+ }
+
+ public Date getCreateTime() { return createTime; }
+
+ public void setCreateTime(Date createTime) { this.createTime = createTime; }
+
+ public Date getUpdateTime() { return updateTime; }
+
+ public void setUpdateTime(Date updateTime) { this.updateTime = updateTime; }
+
+ public Date getUpdateTimeEnd() { return updateTimeEnd; }
+
+ public void setUpdateTimeEnd(Date updateTimeEnd) { this.updateTimeEnd = updateTimeEnd; }
+
+ public String getRemark() { return remark; }
+
+ public void setRemark(String remark) { this.remark = remark; }
+
+ @Override
+ public String toString() {
+ return "BaseDomain{" +
+ "id=" + id +
+ ", createTime=" + createTime +
+ ", updateTime=" + updateTime +
+ ", updateTimeEnd=" + updateTimeEnd +
+ ", remark='" + remark + '\'' +
+ '}';
+ }
+}
diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/domain/BasePage.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/domain/BasePage.java
new file mode 100644
index 0000000..8b4ff6c
--- /dev/null
+++ b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/domain/BasePage.java
@@ -0,0 +1,49 @@
+package com.arm.equipment.system.data.domain;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.Serializable;
+
+/**
+ * 每个对象都需要继承的类, 用于分页
+ * @author admin
+ */
+public class BasePage implements Serializable {
+ private static final Logger LOGGER = LoggerFactory.getLogger(BasePage.class);
+ private static final long serialVersionUID = -320995871886379593L;
+ /** 页码 */
+ private Integer pageNo;
+ /** 每页大小 */
+ private Integer pageSize;
+
+ public Integer getPageNo() {
+ return pageNo;
+ }
+
+ public void setPageNo(Integer pageNo) {
+ this.pageNo = pageNo;
+ }
+
+ public Integer getPageSize() {
+ //最大限制为5000
+ if (null != pageSize && pageSize > 5000) {
+ LOGGER.warn(" pageSize 过大!!!pageSize={}", pageSize);
+ return 5000;
+ }
+ return pageSize;
+ }
+
+ public void setPageSize(Integer pageSize) {
+ this.pageSize = pageSize;
+ }
+
+ @JsonIgnore
+ public Integer getStartIndex() {
+ if (pageNo == null || pageSize == null) {
+ return null;
+ }
+ return (this.pageNo - 1) * this.pageSize;
+ }
+}
diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/domain/PageResult.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/domain/PageResult.java
new file mode 100644
index 0000000..f3f5281
--- /dev/null
+++ b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/domain/PageResult.java
@@ -0,0 +1,94 @@
+package com.arm.equipment.system.data.domain;
+
+import java.util.Collection;
+
+/**
+ * @author admin
+ */
+public class PageResult {
+ /** 页数 */
+ private int pageNo;
+ /** 总页数 */
+ private int pageCount;
+ /** 总条数 */
+ private int total;
+ /** 数据 */
+ private Collection> rows;
+ /** 页大小 */
+ private int pageSize;
+
+ public PageResult() {
+ }
+
+ public PageResult(int pageNo, int pageSize, int total, Collection> rows) {
+ this.pageNo = pageNo;
+ this.total = total;
+ this.rows = rows;
+ this.pageSize = pageSize;
+ this.pageCount = calcPageCount(total);
+
+ }
+
+ private int calcPageCount(int count) {
+ if (pageSize == 0) {
+ return 0;
+ }
+ if (count % pageSize == 0) {
+ return count / pageSize;
+ } else {
+ return count / pageSize + 1;
+
+ }
+ }
+
+ public static int getPageCount(int count, int pageSize) {
+ if (pageSize == 0) {
+ return 0;
+ }
+ if (count % pageSize == 0) {
+ return count / pageSize;
+ } else {
+ return count / pageSize + 1;
+ }
+ }
+
+ public int getPageSize() {
+ return pageSize;
+ }
+
+ public void setPageSize(int pageSize) {
+ this.pageSize = pageSize;
+ }
+
+ public int getPageNo() {
+ return pageNo;
+ }
+
+ public void setPageNo(int pageNo) {
+ this.pageNo = pageNo;
+ }
+
+ public int getPageCount() {
+ return pageCount;
+ }
+
+ public void setPageCount(int pageCount) {
+ this.pageCount = pageCount;
+ }
+
+ public int getTotal() {
+ return total;
+ }
+
+ public void setTotal(int total) {
+ this.total = total;
+ }
+
+ public Collection> getRows() {
+ return rows;
+ }
+
+ public void setRows(Collection> rows) {
+ this.rows = rows;
+ }
+}
diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/domain/system/SysBaseParam.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/domain/system/SysBaseParam.java
new file mode 100644
index 0000000..ecbe306
--- /dev/null
+++ b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/domain/system/SysBaseParam.java
@@ -0,0 +1,67 @@
+package com.arm.equipment.system.data.domain.system;
+
+import com.arm.equipment.system.data.domain.BaseDomain;
+
+/**
+ * 系统--基础参数
+ *
+ * @author Administrator
+ * @date 2021年10月26日 16:36:52
+ */
+public class SysBaseParam extends BaseDomain {
+ /** 唯一编码 */
+ private String uniCode;
+ /** 值 */
+ private String value;
+ /** 描述 */
+ private String description;
+ /** 操作人 */
+ private String operator;
+ /** 数据状态 */
+ private Integer status;
+
+ public String getUniCode() {
+ return uniCode;
+ }
+
+ public void setUniCode(String uniCode) {
+ this.uniCode = uniCode;
+ }
+
+
+ public String getValue() {
+ return value;
+ }
+
+ public void setValue(String value) {
+ this.value = value;
+ }
+
+
+ public String getDescription() {
+ return description;
+ }
+
+ public void setDescription(String description) {
+ this.description = description;
+ }
+
+
+ public String getOperator() {
+ return operator;
+ }
+
+ public void setOperator(String operator) {
+ this.operator = operator;
+ }
+
+
+ public Integer getStatus() {
+ return status;
+ }
+
+ public void setStatus(Integer status) {
+ this.status = status;
+ }
+
+}
diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/domain/system/SysLog.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/domain/system/SysLog.java
new file mode 100644
index 0000000..0b34c59
--- /dev/null
+++ b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/domain/system/SysLog.java
@@ -0,0 +1,111 @@
+package com.arm.equipment.system.data.domain.system;
+
+import com.arm.equipment.system.data.domain.BaseDomain;
+
+/**
+ * 日志表
+ *
+ * @author admin
+ * @date 2022年09月16日 12:41:35
+ */
+public class SysLog extends BaseDomain {
+ /** 日志类型(1:接入日志;2:错误日志) */
+ private Integer type;
+ /** 日志标题 */
+ private String title;
+ /** 操作IP地址 */
+ private String remoteAddr;
+ /** 用户代理 */
+ private String userAgent;
+ /** 请求URI */
+ private String requestUri;
+ /** 操作方式 */
+ private String method;
+ /** 操作提交的数据 */
+ private String params;
+ /** 异常信息 */
+ private String exception;
+ /** 状态 */
+ private Integer status;
+
+ public Integer getType() {
+ return type;
+ }
+
+ public void setType(Integer type) {
+ this.type = type;
+ }
+
+
+ public String getTitle() {
+ return title;
+ }
+
+ public void setTitle(String title) {
+ this.title = title;
+ }
+
+
+ public String getRemoteAddr() {
+ return remoteAddr;
+ }
+
+ public void setRemoteAddr(String remoteAddr) {
+ this.remoteAddr = remoteAddr;
+ }
+
+
+ public String getUserAgent() {
+ return userAgent;
+ }
+
+ public void setUserAgent(String userAgent) {
+ this.userAgent = userAgent;
+ }
+
+
+ public String getRequestUri() {
+ return requestUri;
+ }
+
+ public void setRequestUri(String requestUri) {
+ this.requestUri = requestUri;
+ }
+
+
+ public String getMethod() {
+ return method;
+ }
+
+ public void setMethod(String method) {
+ this.method = method;
+ }
+
+
+ public String getParams() {
+ return params;
+ }
+
+ public void setParams(String params) {
+ this.params = params;
+ }
+
+
+ public String getException() {
+ return exception;
+ }
+
+ public void setException(String exception) {
+ this.exception = exception;
+ }
+
+
+ public Integer getStatus() {
+ return status;
+ }
+
+ public void setStatus(Integer status) {
+ this.status = status;
+ }
+
+}
diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/domain/system/SysResource.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/domain/system/SysResource.java
new file mode 100644
index 0000000..3bcb845
--- /dev/null
+++ b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/domain/system/SysResource.java
@@ -0,0 +1,166 @@
+package com.arm.equipment.system.data.domain.system;
+
+import com.arm.equipment.system.data.domain.BaseDomain;
+
+import java.util.List;
+
+/**
+ * 系统--权限表
+ *
+ * @author admin
+ * @date 2021年10月20日 08:59:10
+ */
+public class SysResource extends BaseDomain {
+ /** 菜单名称 */
+ private String name;
+ /** 链接地址 */
+ private String url;
+ /** 父菜单ID */
+ private String parentId;
+ /** 图标 */
+ private String icon;
+ /** 排序 */
+ private Integer sort;
+ /** 菜单类型 */
+ private Integer type;
+ /** 权限标识 */
+ private String identity;
+ /** 是否显示 */
+ private Integer isShow;
+ /** 状态 */
+ private Integer status;
+ /** 操作人 */
+ private String operator;
+ /** 根路径,用.分隔 */
+ private String rootPath;
+
+ /********VO******/
+ /**子集集合*/
+ private List children;
+ /**标签*/
+ private String label;
+ /**ID集合*/
+ private List idsList;
+
+ public List getIdsList() {
+ return idsList;
+ }
+
+ public void setIdsList(List idsList) {
+ this.idsList = idsList;
+ }
+
+ public String getLabel() {
+ return label;
+ }
+
+ public void setLabel(String label) {
+ this.label = label;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+
+ public String getUrl() {
+ return url;
+ }
+
+ public void setUrl(String url) {
+ this.url = url;
+ }
+
+
+ public String getParentId() {
+ return parentId;
+ }
+
+ public void setParentId(String parentId) {
+ this.parentId = parentId;
+ }
+
+
+ public String getIcon() {
+ return icon;
+ }
+
+ public void setIcon(String icon) {
+ this.icon = icon;
+ }
+
+
+ public Integer getSort() {
+ return sort;
+ }
+
+ public void setSort(Integer sort) {
+ this.sort = sort;
+ }
+
+
+ public Integer getType() {
+ return type;
+ }
+
+ public void setType(Integer type) {
+ this.type = type;
+ }
+
+
+ public String getIdentity() {
+ return identity;
+ }
+
+ public void setIdentity(String identity) {
+ this.identity = identity;
+ }
+
+
+ public Integer getIsShow() {
+ return isShow;
+ }
+
+ public void setIsShow(Integer isShow) {
+ this.isShow = isShow;
+ }
+
+
+ public Integer getStatus() {
+ return status;
+ }
+
+ public void setStatus(Integer status) {
+ this.status = status;
+ }
+
+
+ public String getOperator() {
+ return operator;
+ }
+
+ public void setOperator(String operator) {
+ this.operator = operator;
+ }
+
+
+ public String getRootPath() {
+ return rootPath;
+ }
+
+ public void setRootPath(String rootPath) {
+ this.rootPath = rootPath;
+ }
+
+ public List getChildren() {
+ return children;
+ }
+
+ public void setChildren(List children) {
+ this.children = children;
+ }
+}
diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/domain/system/SysRole.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/domain/system/SysRole.java
new file mode 100644
index 0000000..19a89f1
--- /dev/null
+++ b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/domain/system/SysRole.java
@@ -0,0 +1,69 @@
+package com.arm.equipment.system.data.domain.system;
+
+import com.arm.equipment.system.data.domain.BaseDomain;
+
+import java.util.List;
+
+/**
+ * 系统--角色表
+ *
+ * @author admin
+ * @date 2021年10月19日 15:06:47
+ */
+public class SysRole extends BaseDomain {
+ /** 角色名称 */
+ private String name;
+ /** 描述 */
+ private String description;
+ /** 状态 */
+ private Integer status;
+ /** 操作人 */
+ private String operator;
+
+ /****** VO ***/
+ /**角色ID集合*/
+ private List sysRoleIdList;
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+
+ public String getDescription() {
+ return description;
+ }
+
+ public void setDescription(String description) {
+ this.description = description;
+ }
+
+
+ public Integer getStatus() {
+ return status;
+ }
+
+ public void setStatus(Integer status) {
+ this.status = status;
+ }
+
+
+ public String getOperator() {
+ return operator;
+ }
+
+ public void setOperator(String operator) {
+ this.operator = operator;
+ }
+
+ public List getSysRoleIdList() {
+ return sysRoleIdList;
+ }
+
+ public void setSysRoleIdList(List sysRoleIdList) {
+ this.sysRoleIdList = sysRoleIdList;
+ }
+}
diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/domain/system/SysRoleResource.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/domain/system/SysRoleResource.java
new file mode 100644
index 0000000..8648703
--- /dev/null
+++ b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/domain/system/SysRoleResource.java
@@ -0,0 +1,70 @@
+package com.arm.equipment.system.data.domain.system;
+
+import com.arm.equipment.system.data.domain.BaseDomain;
+
+import java.util.List;
+
+/**
+ * 系统-角色权限关联表
+ *
+ * @author admin
+ * @date 2021年10月19日 15:06:41
+ */
+public class SysRoleResource extends BaseDomain {
+ /** 角色ID */
+ private Long sysRoleId;
+ /** 权限ID */
+ private Long sysResourceId;
+ /** 状态 */
+ private Integer status;
+ /** 操作人 */
+ private String operator;
+
+ /****** VO ***/
+ /**添加新权限(修改权限)*/
+ private List newResources;
+
+ public List getNewResources() {
+ return newResources;
+ }
+
+ public void setNewResources(List newResources) {
+ this.newResources = newResources;
+ }
+
+ public Long getSysRoleId() {
+ return sysRoleId;
+ }
+
+ public void setSysRoleId(Long sysRoleId) {
+ this.sysRoleId = sysRoleId;
+ }
+
+
+ public Long getSysResourceId() {
+ return sysResourceId;
+ }
+
+ public void setSysResourceId(Long sysResourceId) {
+ this.sysResourceId = sysResourceId;
+ }
+
+
+ public Integer getStatus() {
+ return status;
+ }
+
+ public void setStatus(Integer status) {
+ this.status = status;
+ }
+
+
+ public String getOperator() {
+ return operator;
+ }
+
+ public void setOperator(String operator) {
+ this.operator = operator;
+ }
+
+}
diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/domain/system/SysUser.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/domain/system/SysUser.java
new file mode 100644
index 0000000..7bcc362
--- /dev/null
+++ b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/domain/system/SysUser.java
@@ -0,0 +1,172 @@
+package com.arm.equipment.system.data.domain.system;
+
+import com.arm.equipment.system.data.domain.BaseDomain;
+
+import java.util.List;
+
+/**
+ * 系统--用户表
+ *
+ * @author admin
+ * @date 2021年10月19日 15:07:06
+ */
+public class SysUser extends BaseDomain {
+ /** 用户名 */
+ private String username;
+ /** 密码 */
+ private String password;
+ /** 手机 */
+ private String phone;
+ /** 姓名 */
+ private String name;
+ /** 邮箱 */
+ private String email;
+ /**
+ * 用户标签
+ * @see
+ * */
+ private String tag;
+ /** 状态 */
+ private Integer status;
+ /**是否需要二次登陆*/
+ private Integer isSecondLanding;
+
+ /******VO****/
+ /**
+ * 验证码
+ */
+ private String verifyCode;
+ /**
+ * 角色信息
+ */
+ private List sysRoleList;
+ /**
+ * 用户菜单标识信息
+ */
+ private List sysResourceIdentityList;
+ /**
+ * 用户菜单列表
+ */
+ private List sysResourceList;
+ /**标签集合*/
+ private List tagList;
+ /**二次登陆验证码*/
+ private String twoVerifyCode;
+
+ public String getTwoVerifyCode() {
+ return twoVerifyCode;
+ }
+
+ public void setTwoVerifyCode(String twoVerifyCode) {
+ this.twoVerifyCode = twoVerifyCode;
+ }
+
+ public Integer getIsSecondLanding() {
+ return isSecondLanding;
+ }
+
+ public void setIsSecondLanding(Integer isSecondLanding) {
+ this.isSecondLanding = isSecondLanding;
+ }
+
+ public List getTagList() {
+ return tagList;
+ }
+
+ public void setTagList(List tagList) {
+ this.tagList = tagList;
+ }
+
+ public String getVerifyCode() {
+ return verifyCode;
+ }
+
+ public void setVerifyCode(String verifyCode) {
+ this.verifyCode = verifyCode;
+ }
+
+ public String getUsername() {
+ return username;
+ }
+
+ public void setUsername(String username) {
+ this.username = username;
+ }
+
+
+ public String getPassword() {
+ return password;
+ }
+
+ public void setPassword(String password) {
+ this.password = password;
+ }
+
+
+ public String getPhone() {
+ return phone;
+ }
+
+ public void setPhone(String phone) {
+ this.phone = phone;
+ }
+
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+
+ public String getEmail() {
+ return email;
+ }
+
+ public void setEmail(String email) {
+ this.email = email;
+ }
+
+
+ public Integer getStatus() {
+ return status;
+ }
+
+ public void setStatus(Integer status) {
+ this.status = status;
+ }
+
+ public List getSysRoleList() {
+ return sysRoleList;
+ }
+
+ public void setSysRoleList(List sysRoleList) {
+ this.sysRoleList = sysRoleList;
+ }
+
+ public List getSysResourceIdentityList() {
+ return sysResourceIdentityList;
+ }
+
+ public void setSysResourceIdentityList(List sysResourceIdentityList) {
+ this.sysResourceIdentityList = sysResourceIdentityList;
+ }
+
+ public List getSysResourceList() {
+ return sysResourceList;
+ }
+
+ public void setSysResourceList(List sysResourceList) {
+ this.sysResourceList = sysResourceList;
+ }
+
+ public String getTag() {
+ return tag;
+ }
+
+ public void setTag(String tag) {
+ this.tag = tag;
+ }
+}
diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/domain/system/SysUserRole.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/domain/system/SysUserRole.java
new file mode 100644
index 0000000..55de1e3
--- /dev/null
+++ b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/domain/system/SysUserRole.java
@@ -0,0 +1,56 @@
+package com.arm.equipment.system.data.domain.system;
+
+import com.arm.equipment.system.data.domain.BaseDomain;
+
+/**
+ * 系统--用户角色关联表
+ *
+ * @author admin
+ * @date 2021年10月19日 15:06:59
+ */
+public class SysUserRole extends BaseDomain {
+ /** 角色ID */
+ private Long sysRoleId;
+ /** 用户ID */
+ private Long sysUserId;
+ /** 状态 */
+ private Integer status;
+ /** 执行者 */
+ private String operator;
+
+ public Long getSysRoleId() {
+ return sysRoleId;
+ }
+
+ public void setSysRoleId(Long sysRoleId) {
+ this.sysRoleId = sysRoleId;
+ }
+
+
+ public Long getSysUserId() {
+ return sysUserId;
+ }
+
+ public void setSysUserId(Long sysUserId) {
+ this.sysUserId = sysUserId;
+ }
+
+
+ public Integer getStatus() {
+ return status;
+ }
+
+ public void setStatus(Integer status) {
+ this.status = status;
+ }
+
+
+ public String getOperator() {
+ return operator;
+ }
+
+ public void setOperator(String operator) {
+ this.operator = operator;
+ }
+
+}
diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/domain/user/AppUser.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/domain/user/AppUser.java
new file mode 100644
index 0000000..796f65d
--- /dev/null
+++ b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/domain/user/AppUser.java
@@ -0,0 +1,89 @@
+package com.arm.equipment.system.data.domain.user;
+
+import com.arm.equipment.system.data.domain.BaseDomain;
+
+import java.util.Date;
+
+/**
+ * APP用户
+ *
+ * @author admin
+ * @date 2023年03月13日 22:34:47
+ */
+public class AppUser extends BaseDomain {
+ /** 用户昵称 */
+ private String nickname;
+ /** 登录账号 */
+ private String username;
+ /** 密码 */
+ private String password;
+ /** 手机号 */
+ private String phone;
+ /** 数据状态 */
+ private Integer status;
+ /** 登录时间 */
+ private Date loginTime;
+
+ private String token;
+
+ public String getToken() {
+ return token;
+ }
+
+ public void setToken(String token) {
+ this.token = token;
+ }
+ public String getNickname() {
+ return nickname;
+ }
+
+ public void setNickname(String nickname) {
+ this.nickname = nickname;
+ }
+
+
+ public String getUsername() {
+ return username;
+ }
+
+ public void setUsername(String username) {
+ this.username = username;
+ }
+
+
+ public String getPassword() {
+ return password;
+ }
+
+ public void setPassword(String password) {
+ this.password = password;
+ }
+
+
+ public String getPhone() {
+ return phone;
+ }
+
+ public void setPhone(String phone) {
+ this.phone = phone;
+ }
+
+
+ public Integer getStatus() {
+ return status;
+ }
+
+ public void setStatus(Integer status) {
+ this.status = status;
+ }
+
+
+ public Date getLoginTime() {
+ return loginTime;
+ }
+
+ public void setLoginTime(Date loginTime) {
+ this.loginTime = loginTime;
+ }
+
+}
diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/domain/weaponry/Weaponry.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/domain/weaponry/Weaponry.java
new file mode 100644
index 0000000..c763cf8
--- /dev/null
+++ b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/domain/weaponry/Weaponry.java
@@ -0,0 +1,124 @@
+package com.arm.equipment.system.data.domain.weaponry;
+
+import com.arm.equipment.system.data.domain.BaseDomain;
+
+import java.util.Date;
+
+/**
+ * 装备武器
+ *
+ * @author admin
+ * @date 2023年03月23日 10:29:48
+ */
+public class Weaponry extends BaseDomain {
+ /** 武器名称 */
+ private String name;
+ /** 武器封面 */
+ private String imgPath;
+ /** 弹夹容量(发) */
+ private Integer cartridgeCapacity;
+ /** 子弹口径(mm) */
+ private Double bulletCaliber;
+ /** 有效射程 */
+ private Integer effectiveRange;
+ /** 总库存 */
+ private Integer totalInventory;
+ /** 锁定库存 */
+ private Integer lockInventory;
+ /** 数据状态 */
+ private Integer status;
+
+ /**VO*/
+ /**是否已借出*/
+ private Integer isLend;
+ /**锁定数起始值*/
+ private Integer lockInventoryStart;
+
+ public Integer getLockInventoryStart() {
+ return lockInventoryStart;
+ }
+
+ public void setLockInventoryStart(Integer lockInventoryStart) {
+ this.lockInventoryStart = lockInventoryStart;
+ }
+
+ public Integer getIsLend() {
+ return isLend;
+ }
+
+ public void setIsLend(Integer isLend) {
+ this.isLend = isLend;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
+
+ public String getImgPath() {
+ return imgPath;
+ }
+
+ public void setImgPath(String imgPath) {
+ this.imgPath = imgPath;
+ }
+
+
+ public Integer getCartridgeCapacity() {
+ return cartridgeCapacity;
+ }
+
+ public void setCartridgeCapacity(Integer cartridgeCapacity) {
+ this.cartridgeCapacity = cartridgeCapacity;
+ }
+
+
+ public Double getBulletCaliber() {
+ return bulletCaliber;
+ }
+
+ public void setBulletCaliber(Double bulletCaliber) {
+ this.bulletCaliber = bulletCaliber;
+ }
+
+
+ public Integer getEffectiveRange() {
+ return effectiveRange;
+ }
+
+ public void setEffectiveRange(Integer effectiveRange) {
+ this.effectiveRange = effectiveRange;
+ }
+
+
+ public Integer getTotalInventory() {
+ return totalInventory;
+ }
+
+ public void setTotalInventory(Integer totalInventory) {
+ this.totalInventory = totalInventory;
+ }
+
+
+ public Integer getLockInventory() {
+ return lockInventory;
+ }
+
+ public void setLockInventory(Integer lockInventory) {
+ this.lockInventory = lockInventory;
+ }
+
+
+ public Integer getStatus() {
+ return status;
+ }
+
+ public void setStatus(Integer status) {
+ this.status = status;
+ }
+
+}
diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/domain/weaponry/WeaponryLendRecord.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/domain/weaponry/WeaponryLendRecord.java
new file mode 100644
index 0000000..e6f3686
--- /dev/null
+++ b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/domain/weaponry/WeaponryLendRecord.java
@@ -0,0 +1,92 @@
+package com.arm.equipment.system.data.domain.weaponry;
+
+import com.arm.equipment.system.data.domain.BaseDomain;
+
+import java.util.Date;
+
+/**
+ * 装备武器借出记录
+ *
+ * @author admin
+ * @date 2023年03月23日 11:02:17
+ */
+public class WeaponryLendRecord extends BaseDomain {
+ /** 武器ID */
+ private Long weaponryId;
+ /** 武器名称 */
+ private String weaponryName;
+ /** 借出数量 */
+ private Integer num;
+ /** 归还时间 */
+ private Date returnTime;
+ /** 归还状态(0未归还 1已归还) */
+ private Integer returnStatus;
+ /** 数据状态 */
+ private Integer status;
+
+ /****************VO**************/
+ private Weaponry weaponry;
+
+ public Weaponry getWeaponry() {
+ return weaponry;
+ }
+
+ public void setWeaponry(Weaponry weaponry) {
+ this.weaponry = weaponry;
+ }
+
+
+ public Long getWeaponryId() {
+ return weaponryId;
+ }
+
+ public void setWeaponryId(Long weaponryId) {
+ this.weaponryId = weaponryId;
+ }
+
+
+ public String getWeaponryName() {
+ return weaponryName;
+ }
+
+ public void setWeaponryName(String weaponryName) {
+ this.weaponryName = weaponryName;
+ }
+
+
+ public Integer getNum() {
+ return num;
+ }
+
+ public void setNum(Integer num) {
+ this.num = num;
+ }
+
+
+ public Date getReturnTime() {
+ return returnTime;
+ }
+
+ public void setReturnTime(Date returnTime) {
+ this.returnTime = returnTime;
+ }
+
+
+ public Integer getReturnStatus() {
+ return returnStatus;
+ }
+
+ public void setReturnStatus(Integer returnStatus) {
+ this.returnStatus = returnStatus;
+ }
+
+
+ public Integer getStatus() {
+ return status;
+ }
+
+ public void setStatus(Integer status) {
+ this.status = status;
+ }
+
+}
diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/domain/weaponry/WeaponryReturnRecord.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/domain/weaponry/WeaponryReturnRecord.java
new file mode 100644
index 0000000..836ee51
--- /dev/null
+++ b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/domain/weaponry/WeaponryReturnRecord.java
@@ -0,0 +1,91 @@
+package com.arm.equipment.system.data.domain.weaponry;
+
+import com.arm.equipment.system.data.domain.BaseDomain;
+
+import java.util.Date;
+
+/**
+ * 装备武器归还记录
+ *
+ * @author admin
+ * @date 2023年03月23日 11:03:25
+ */
+public class WeaponryReturnRecord extends BaseDomain {
+ /** 武器ID */
+ private Long weaponryId;
+ /** 武器名称 */
+ private String weaponryName;
+ /** 记录ID */
+ private Long lendRecordId;
+ /** 借出数量 */
+ private Integer num;
+ /** 归还时间 */
+ private Date returnTime;
+ /** 数据状态 */
+ private Integer status;
+
+ /****************VO**************/
+ private Weaponry weaponry;
+
+ public Weaponry getWeaponry() {
+ return weaponry;
+ }
+
+ public void setWeaponry(Weaponry weaponry) {
+ this.weaponry = weaponry;
+ }
+
+ public Long getWeaponryId() {
+ return weaponryId;
+ }
+
+ public void setWeaponryId(Long weaponryId) {
+ this.weaponryId = weaponryId;
+ }
+
+
+ public String getWeaponryName() {
+ return weaponryName;
+ }
+
+ public void setWeaponryName(String weaponryName) {
+ this.weaponryName = weaponryName;
+ }
+
+
+ public Long getLendRecordId() {
+ return lendRecordId;
+ }
+
+ public void setLendRecordId(Long lendRecordId) {
+ this.lendRecordId = lendRecordId;
+ }
+
+
+ public Integer getNum() {
+ return num;
+ }
+
+ public void setNum(Integer num) {
+ this.num = num;
+ }
+
+
+ public Date getReturnTime() {
+ return returnTime;
+ }
+
+ public void setReturnTime(Date returnTime) {
+ this.returnTime = returnTime;
+ }
+
+
+ public Integer getStatus() {
+ return status;
+ }
+
+ public void setStatus(Integer status) {
+ this.status = status;
+ }
+
+}
diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/enums/dict/EnumFileResourceType.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/enums/dict/EnumFileResourceType.java
new file mode 100644
index 0000000..275323a
--- /dev/null
+++ b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/enums/dict/EnumFileResourceType.java
@@ -0,0 +1,37 @@
+package com.arm.equipment.system.data.enums.dict;
+
+/***
+ *
+ * 资源文件类型
+ * @author: admin
+ * @time: 2021/11/17 17:35
+ */
+public enum EnumFileResourceType {
+ /** */
+ IMG(1, "图片"),
+ VIDEO(2, "视频"),
+ ;
+
+ private Integer code;
+ private String text;
+
+ EnumFileResourceType(Integer code, String text) {
+ this.code = code;
+ this.text = text;
+ }
+
+ public Integer getCode() {
+ return code;
+ }
+
+ public void setCode(Integer code) {
+ this.code = code;
+ }
+
+ public String getText() {
+ return text;
+ }
+
+ public void setText(String text) {
+ this.text = text;
+ }}
diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/enums/dict/EnumGender.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/enums/dict/EnumGender.java
new file mode 100644
index 0000000..0e7570b
--- /dev/null
+++ b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/enums/dict/EnumGender.java
@@ -0,0 +1,51 @@
+package com.arm.equipment.system.data.enums.dict;
+
+import com.arm.equipment.system.data.exception.BusinessException;
+
+/**
+ * 数据状态枚举
+ * @author admin
+ */
+public enum EnumGender {
+ /** 审核 */
+ MALE(1, "男"),
+
+ /** The release. */
+ FEMALE(2, "女"),
+ ;
+
+ private Integer code;
+ private String text;
+
+ EnumGender(Integer code, String text) {
+ this.code = code;
+ this.text = text;
+ }
+
+ public static EnumGender getByCode(Integer code) {
+ if (null == code) {
+ return null;
+ }
+ for (EnumGender type : EnumGender.values()) {
+ if (type.getCode().equals(code)) {
+ return type;
+ }
+ }
+ throw new BusinessException("内容类型非法");
+ }
+
+ public Integer getCode() {
+ return code;
+ }
+
+ public void setCode(Integer code) {
+ this.code = code;
+ }
+
+ public String getText() {
+ return text;
+ }
+
+ public void setText(String text) {
+ this.text = text;
+ }}
diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/enums/dict/EnumSortType.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/enums/dict/EnumSortType.java
new file mode 100644
index 0000000..9be4db9
--- /dev/null
+++ b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/enums/dict/EnumSortType.java
@@ -0,0 +1,51 @@
+package com.arm.equipment.system.data.enums.dict;
+
+/**
+ * 排序类型
+ *
+ * @author: xly
+ * @time: 2022/9/16 18:30
+ */
+public enum EnumSortType {
+ ASC(1, "升序"),
+ DESC(2, "降序"),
+ ;
+
+ private Integer code;
+ private String text;
+
+ EnumSortType(Integer code, String text) {
+ this.code = code;
+ this.text = text;
+ }
+
+ public Integer getCode() {
+ return code;
+ }
+
+ public void setCode(Integer code) {
+ this.code = code;
+ }
+
+ public String getText() {
+ return text;
+ }
+
+ public void setText(String text) {
+ this.text = text;
+ }
+
+
+ public static EnumSortType getByCode(Integer code) {
+ if (code == null) {
+ return null;
+ }
+ EnumSortType[] values = EnumSortType.values();
+ for (EnumSortType v : values) {
+ if (v.getCode().equals(code)) {
+ return v;
+ }
+ }
+ return null;
+ }
+}
diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/enums/dict/EnumStatus.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/enums/dict/EnumStatus.java
new file mode 100644
index 0000000..908b4fe
--- /dev/null
+++ b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/enums/dict/EnumStatus.java
@@ -0,0 +1,56 @@
+package com.arm.equipment.system.data.enums.dict;
+
+/**
+ * 数据状态枚举
+ *
+ * @author admin
+ */
+public enum EnumStatus {
+ /**
+ * The new.
+ */
+ NEW(0, "新增"),
+
+ AUDIT(1, "已审核"),
+
+ DEL(-9, "已删除");
+
+ private Integer code;
+ private String text;
+ EnumStatus(Integer code, String text) {
+ this.code = code;
+ this.text = text;
+ }
+
+ public Integer getCode() {
+ return code;
+ }
+
+ public void setCode(Integer code) {
+ this.code = code;
+ }
+
+ public String getText() {
+ return text;
+ }
+
+ public void setText(String text) {
+ this.text = text;
+ }
+
+ /**
+ * 通过code获得该枚举类型
+ *
+ * @param code
+ * @return
+ */
+ public static EnumStatus getByCode(Integer code) {
+ EnumStatus[] values = EnumStatus.values();
+ for (EnumStatus type : values) {
+ if (type.code.equals(code)) {
+ return type;
+ }
+ }
+ return NEW;
+ }
+}
diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/enums/dict/EnumSysLogType.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/enums/dict/EnumSysLogType.java
new file mode 100644
index 0000000..b0d5028
--- /dev/null
+++ b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/enums/dict/EnumSysLogType.java
@@ -0,0 +1,56 @@
+package com.arm.equipment.system.data.enums.dict;
+
+/**
+ * 数据状态枚举
+ *
+ * @author admin
+ */
+public enum EnumSysLogType {
+ /**
+ * The new.
+ */
+ LOG(1, "普通日志"),
+
+ EXCEPTION_LOG(2, "异常日志"),
+ ;
+
+ private Integer code;
+ private String text;
+
+ EnumSysLogType(Integer code, String text) {
+ this.code = code;
+ this.text = text;
+ }
+
+ public Integer getCode() {
+ return code;
+ }
+
+ public void setCode(Integer code) {
+ this.code = code;
+ }
+
+ public String getText() {
+ return text;
+ }
+
+ public void setText(String text) {
+ this.text = text;
+ }
+
+ /**
+ * 通过code获得该枚举类型
+ *
+ * @param code
+ * @return
+ */
+ public static EnumSysLogType getByCode(Integer code) {
+ EnumSysLogType[] values = EnumSysLogType.values();
+ for (EnumSysLogType type : values) {
+ if (type.code.equals(code)) {
+ return type;
+ }
+ }
+ return null;
+ }
+}
diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/enums/dict/EnumSysResourceType.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/enums/dict/EnumSysResourceType.java
new file mode 100644
index 0000000..34163d6
--- /dev/null
+++ b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/enums/dict/EnumSysResourceType.java
@@ -0,0 +1,41 @@
+package com.arm.equipment.system.data.enums.dict;
+
+/**
+ * 系统资源菜单类型
+ *
+ * @author: admin
+ * @time: 2021/10/19 18:02
+ */
+public enum EnumSysResourceType {
+ /**
+ *
+ */
+ CATALOGUE(0, "目录"),
+ MENU(1, "菜单"),
+ BUTTON(2, "按钮"),
+ ;
+
+ private Integer code;
+ private String text;
+
+ EnumSysResourceType(Integer code, String text) {
+ this.code = code;
+ this.text = text;
+ }
+
+ public Integer getCode() {
+ return code;
+ }
+
+ public void setCode(Integer code) {
+ this.code = code;
+ }
+
+ public String getText() {
+ return text;
+ }
+
+ public void setText(String text) {
+ this.text = text;
+ }
+}
diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/enums/dict/EnumWeaponryLendRecordReturnStatus.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/enums/dict/EnumWeaponryLendRecordReturnStatus.java
new file mode 100644
index 0000000..27b650b
--- /dev/null
+++ b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/enums/dict/EnumWeaponryLendRecordReturnStatus.java
@@ -0,0 +1,50 @@
+package com.arm.equipment.system.data.enums.dict;
+
+/**
+ * @author: xly
+ * @time: 2023/3/23 9:02
+ */
+public enum EnumWeaponryLendRecordReturnStatus {
+ NOT_RETURN(0, "未归还"),
+ RETURN(1, "已经归还"),
+ ;
+ private Integer code;
+ private String text;
+
+ EnumWeaponryLendRecordReturnStatus(Integer code, String text) {
+ this.code = code;
+ this.text = text;
+ }
+
+ public Integer getCode() {
+ return code;
+ }
+
+ public void setCode(Integer code) {
+ this.code = code;
+ }
+
+ public String getText() {
+ return text;
+ }
+
+ public void setText(String text) {
+ this.text = text;
+ }
+
+ /**
+ * 通过code获得该枚举类型
+ *
+ * @param code
+ * @return
+ */
+ public static EnumSysLogType getByCode(Integer code) {
+ EnumSysLogType[] values = EnumSysLogType.values();
+ for (EnumSysLogType type : values) {
+ if (type.getCode().equals(code)) {
+ return type;
+ }
+ }
+ return null;
+ }
+}
diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/enums/dict/EnumWeaponryLendRecordStatus.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/enums/dict/EnumWeaponryLendRecordStatus.java
new file mode 100644
index 0000000..1155c62
--- /dev/null
+++ b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/enums/dict/EnumWeaponryLendRecordStatus.java
@@ -0,0 +1,51 @@
+package com.arm.equipment.system.data.enums.dict;
+
+/**
+ * @author: xly
+ * @time: 2023/3/23 9:02
+ */
+public enum EnumWeaponryLendRecordStatus {
+ NEW(0, "新增"),
+ ADOPT(1, "通过"),
+ REFUSE(2, "拒绝"),
+ ;
+ private Integer code;
+ private String text;
+
+ EnumWeaponryLendRecordStatus(Integer code, String text) {
+ this.code = code;
+ this.text = text;
+ }
+
+ public Integer getCode() {
+ return code;
+ }
+
+ public void setCode(Integer code) {
+ this.code = code;
+ }
+
+ public String getText() {
+ return text;
+ }
+
+ public void setText(String text) {
+ this.text = text;
+ }
+
+ /**
+ * 通过code获得该枚举类型
+ *
+ * @param code
+ * @return
+ */
+ public static EnumSysLogType getByCode(Integer code) {
+ EnumSysLogType[] values = EnumSysLogType.values();
+ for (EnumSysLogType type : values) {
+ if (type.getCode().equals(code)) {
+ return type;
+ }
+ }
+ return null;
+ }
+}
diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/enums/dict/EnumYesNo.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/enums/dict/EnumYesNo.java
new file mode 100644
index 0000000..aed2617
--- /dev/null
+++ b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/enums/dict/EnumYesNo.java
@@ -0,0 +1,36 @@
+package com.arm.equipment.system.data.enums.dict;
+
+/**
+ * yes no枚举
+ * @author admin
+ */
+public enum EnumYesNo {
+ /** */
+ NO(0, "否"),
+
+ YES(1, "是")
+ ;
+
+ private Integer code;
+ private String text;
+
+ EnumYesNo(Integer code, String text) {
+ this.code = code;
+ this.text = text;
+ }
+
+ public Integer getCode() {
+ return code;
+ }
+
+ public void setCode(Integer code) {
+ this.code = code;
+ }
+
+ public String getText() {
+ return text;
+ }
+
+ public void setText(String text) {
+ this.text = text;
+ }}
diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/enums/file/EnumUpload.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/enums/file/EnumUpload.java
new file mode 100644
index 0000000..adf03f4
--- /dev/null
+++ b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/enums/file/EnumUpload.java
@@ -0,0 +1,73 @@
+package com.arm.equipment.system.data.enums.file;
+
+import org.apache.commons.lang3.StringUtils;
+
+/**
+ * 上传枚举,写名每个上传的作用
+ * 1.规定文件夹
+ * 2.规定后缀,避免任意文件上传
+ *
+ * @author admin
+ */
+public enum EnumUpload {
+ RES_PHOTO_LIB("resPhotoLib", "jpg", "上传图片"),
+ RES_VIDEO_LIB("resVideoLib", "mp4", "上传视频"),
+ QR_CODE("qrCode", "jpg", "二维码"),
+ ;
+
+ EnumUpload(String baseDir, String suffix, String desc) {
+ this.baseDir = baseDir;
+ this.suffix = suffix;
+ this.desc = desc;
+ }
+
+ /**
+ * 上传具体业务目录,只允许为英文数字,不允许重复
+ * 业务名称,请参考业务表名称也定义
+ */
+ String baseDir;
+ /**
+ * 文件类型,比如jpg,png,txt,apk等等
+ */
+ String suffix;
+ /**
+ * 功能描述说明
+ */
+ String desc;
+
+ public static EnumUpload getEnum(String baseDir) {
+ if (StringUtils.isEmpty(baseDir)) {
+ return null;
+ }
+ for (EnumUpload type : EnumUpload.values()) {
+ if (type.getBaseDir().equals(baseDir)) {
+ return type;
+ }
+ }
+ return null;
+ }
+
+ public String getBaseDir() {
+ return baseDir;
+ }
+
+ public void setBaseDir(String baseDir) {
+ this.baseDir = baseDir;
+ }
+
+ public String getSuffix() {
+ return suffix;
+ }
+
+ public void setSuffix(String suffix) {
+ this.suffix = suffix;
+ }
+
+ public String getDesc() {
+ return desc;
+ }
+
+ public void setDesc(String desc) {
+ this.desc = desc;
+ }
+}
diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/exception/AuthException.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/exception/AuthException.java
new file mode 100644
index 0000000..fd5141f
--- /dev/null
+++ b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/exception/AuthException.java
@@ -0,0 +1,62 @@
+package com.arm.equipment.system.data.exception;
+
+import com.arm.equipment.system.data.vo.ReturnCode;
+
+/**
+ * @author 向帅 用户登录异常
+ * @Date 2019/7/27 17:11
+ **/
+public class AuthException extends RuntimeException {
+
+ private static final long serialVersionUID = -7429924842303522242L;
+
+ String message;
+
+ ReturnCode returnCode;
+
+ public AuthException() {
+ super();
+ }
+
+ public AuthException(String message) {
+ this.message = message;
+ }
+
+ public AuthException(ReturnCode returnCode) {
+ this.returnCode = returnCode;
+ }
+
+ public AuthException(String message, ReturnCode returnCode) {
+ this.message = message;
+ this.returnCode = returnCode;
+ }
+
+ public AuthException(String message, Throwable cause) {
+ super(message, cause);
+ }
+
+ public AuthException(Throwable cause) {
+ super(cause);
+ }
+
+ protected AuthException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {
+ super(message, cause, enableSuppression, writableStackTrace);
+ }
+
+ @Override
+ public String getMessage() {
+ return message;
+ }
+
+ public void setMessage(String message) {
+ this.message = message;
+ }
+
+ public ReturnCode getReturnCode() {
+ return returnCode;
+ }
+
+ public void setReturnCode(ReturnCode returnCode) {
+ this.returnCode = returnCode;
+ }
+}
diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/exception/BusinessException.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/exception/BusinessException.java
new file mode 100644
index 0000000..9943531
--- /dev/null
+++ b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/exception/BusinessException.java
@@ -0,0 +1,48 @@
+package com.arm.equipment.system.data.exception;
+
+/**
+ * 自定义异常,service中业务异常使用这个
+ */
+public class BusinessException extends RuntimeException {
+
+
+ private static final long serialVersionUID = -6053475656376646723L;
+
+ Integer errorCode;
+
+ String message;
+
+ public BusinessException(String message) {
+ this.message = message;
+ }
+
+ public BusinessException(Integer errorCode, String message) {
+ this.errorCode = errorCode;
+ this.message = message;
+ }
+
+ public BusinessException(Throwable cause) {
+ super(cause);
+ }
+
+ public BusinessException(String message, Throwable cause) {
+ super(message, cause);
+ }
+
+ public Integer getErrorCode() {
+ return errorCode;
+ }
+
+ public void setErrorCode(Integer errorCode) {
+ this.errorCode = errorCode;
+ }
+
+ @Override
+ public String getMessage() {
+ return message;
+ }
+
+ public void setMessage(String message) {
+ this.message = message;
+ }
+}
diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/mapper/system/ISysBaseParamMapper.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/mapper/system/ISysBaseParamMapper.java
new file mode 100644
index 0000000..749c3ce
--- /dev/null
+++ b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/mapper/system/ISysBaseParamMapper.java
@@ -0,0 +1,71 @@
+package com.arm.equipment.system.data.mapper.system;
+
+import com.arm.equipment.system.data.domain.system.SysBaseParam;
+
+import java.util.List;
+
+/**
+ * 系统--基础参数
+ *
+ * @author Administrator
+ * @date 2021年10月26日 16:36:52
+ */
+public interface ISysBaseParamMapper {
+
+ /**
+ * 插入
+ *
+ * @param sysBaseParam sysBaseParam
+ * @return int
+ */
+ int insertSelective(SysBaseParam sysBaseParam);
+
+ /**
+ * 更新
+ *
+ * @param setParam setParam
+ * @param whereParam whereParam
+ * @return int
+ */
+ int updateSelective(SysBaseParam setParam, SysBaseParam whereParam);
+
+ /**
+ * 数量
+ *
+ * @param sysBaseParam sysBaseParam
+ * @return int
+ */
+ int getCount(SysBaseParam sysBaseParam);
+
+ /**
+ * 单条
+ *
+ * @param sysBaseParam sysBaseParam
+ * @return SysBaseParam
+ */
+ SysBaseParam getOne(SysBaseParam sysBaseParam);
+
+ /**
+ * 多条
+ *
+ * @param sysBaseParam sysBaseParam
+ * @return List
+ */
+ List getList(SysBaseParam sysBaseParam);
+
+ /**
+ * 分页
+ *
+ * @param sysBaseParam sysBaseParam
+ * @return List
+ */
+ List getPageList(SysBaseParam sysBaseParam);
+
+ /**
+ * 根据ID删除
+ *
+ * @param id
+ * @return
+ */
+ int delete(String id);
+}
diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/mapper/system/ISysLogMapper.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/mapper/system/ISysLogMapper.java
new file mode 100644
index 0000000..21f3b48
--- /dev/null
+++ b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/mapper/system/ISysLogMapper.java
@@ -0,0 +1,64 @@
+package com.arm.equipment.system.data.mapper.system;
+
+import com.arm.equipment.system.data.domain.system.SysLog;
+
+import java.util.List;
+
+/**
+ * 日志表
+ *
+ * @author admin
+ * @date 2022年09月16日 12:41:35
+ */
+public interface ISysLogMapper {
+
+ /**
+ * 插入
+ *
+ * @param sysLog sysLog
+ * @return int
+ */
+ int insertSelective(SysLog sysLog);
+
+ /**
+ * 更新
+ *
+ * @param setParam setParam
+ * @param whereParam whereParam
+ * @return int
+ */
+ int updateSelective(SysLog setParam, SysLog whereParam);
+
+ /**
+ * 数量
+ *
+ * @param sysLog sysLog
+ * @return int
+ */
+ int getCount(SysLog sysLog);
+
+ /**
+ * 单条
+ *
+ * @param sysLog sysLog
+ * @return SysLog
+ */
+ SysLog getOne(SysLog sysLog);
+
+ /**
+ * 多条
+ *
+ * @param sysLog sysLog
+ * @return List
+ */
+ List getList(SysLog sysLog);
+
+ /**
+ * 分页
+ *
+ * @param sysLog sysLog
+ * @return List
+ */
+ List getPageList(SysLog sysLog);
+
+}
diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/mapper/system/ISysResourceMapper.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/mapper/system/ISysResourceMapper.java
new file mode 100644
index 0000000..e7d9cee
--- /dev/null
+++ b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/mapper/system/ISysResourceMapper.java
@@ -0,0 +1,63 @@
+package com.arm.equipment.system.data.mapper.system;
+
+import com.arm.equipment.system.data.domain.system.SysResource;
+
+import java.util.List;
+
+/**
+ * 系统--权限表
+ *
+ * @author admin
+ * @date 2021年10月19日 15:06:30
+ */
+public interface ISysResourceMapper {
+
+ /**
+ * 插入
+ *
+ * @param sysResource sysResource
+ * @return int
+ */
+ int insertSelective(SysResource sysResource);
+
+ /**
+ * 更新
+ *
+ * @param setParam setParam
+ * @param whereParam whereParam
+ * @return int
+ */
+ int updateSelective(SysResource setParam, SysResource whereParam);
+
+ /**
+ * 数量
+ *
+ * @param sysResource sysResource
+ * @return int
+ */
+ int getCount(SysResource sysResource);
+
+ /**
+ * 单条
+ *
+ * @param sysResource sysResource
+ * @return SysResource
+ */
+ SysResource getOne(SysResource sysResource);
+
+ /**
+ * 多条
+ *
+ * @param sysResource sysResource
+ * @return List
+ */
+ List getList(SysResource sysResource);
+
+ /**
+ * 分页
+ *
+ * @param sysResource sysResource
+ * @return List
+ */
+ List getPageList(SysResource sysResource);
+}
diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/mapper/system/ISysRoleMapper.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/mapper/system/ISysRoleMapper.java
new file mode 100644
index 0000000..b369299
--- /dev/null
+++ b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/mapper/system/ISysRoleMapper.java
@@ -0,0 +1,64 @@
+package com.arm.equipment.system.data.mapper.system;
+
+import com.arm.equipment.system.data.domain.system.SysRole;
+
+import java.util.List;
+
+/**
+ * 系统--角色表
+ *
+ * @author admin
+ * @date 2021年10月19日 15:06:47
+ */
+public interface ISysRoleMapper {
+
+ /**
+ * 插入
+ *
+ * @param sysRole sysRole
+ * @return int
+ */
+ int insertSelective(SysRole sysRole);
+
+ /**
+ * 更新
+ *
+ * @param setParam setParam
+ * @param whereParam whereParam
+ * @return int
+ */
+ int updateSelective(SysRole setParam, SysRole whereParam);
+
+ /**
+ * 数量
+ *
+ * @param sysRole sysRole
+ * @return int
+ */
+ int getCount(SysRole sysRole);
+
+ /**
+ * 单条
+ *
+ * @param sysRole sysRole
+ * @return SysRole
+ */
+ SysRole getOne(SysRole sysRole);
+
+ /**
+ * 多条
+ *
+ * @param sysRole sysRole
+ * @return List
+ */
+ List getList(SysRole sysRole);
+
+ /**
+ * 分页
+ *
+ * @param sysRole sysRole
+ * @return List
+ */
+ List getPageList(SysRole sysRole);
+
+}
diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/mapper/system/ISysRoleResourceMapper.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/mapper/system/ISysRoleResourceMapper.java
new file mode 100644
index 0000000..815cc67
--- /dev/null
+++ b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/mapper/system/ISysRoleResourceMapper.java
@@ -0,0 +1,82 @@
+package com.arm.equipment.system.data.mapper.system;
+
+import com.arm.equipment.system.data.domain.system.SysRoleResource;
+
+import java.util.List;
+
+/**
+ * 系统-角色权限关联表
+ *
+ * @author admin
+ * @date 2021年10月19日 15:06:41
+ */
+public interface ISysRoleResourceMapper {
+
+ /**
+ * 插入
+ *
+ * @param sysRoleResource sysRoleResource
+ * @return int
+ */
+ int insertSelective(SysRoleResource sysRoleResource);
+
+ /**
+ * 更新
+ *
+ * @param setParam setParam
+ * @param whereParam whereParam
+ * @return int
+ */
+ int updateSelective(SysRoleResource setParam, SysRoleResource whereParam);
+
+ /**
+ * 数量
+ *
+ * @param sysRoleResource sysRoleResource
+ * @return int
+ */
+ int getCount(SysRoleResource sysRoleResource);
+
+ /**
+ * 单条
+ *
+ * @param sysRoleResource sysRoleResource
+ * @return SysRoleResource
+ */
+ SysRoleResource getOne(SysRoleResource sysRoleResource);
+
+ /**
+ * 多条
+ *
+ * @param sysRoleResource sysRoleResource
+ * @return List
+ */
+ List getList(SysRoleResource sysRoleResource);
+
+ /**
+ * 分页
+ *
+ * @param sysRoleResource sysRoleResource
+ * @return List
+ */
+ List getPageList(SysRoleResource sysRoleResource);
+
+ /**
+ * 获取权限ID in数据
+ * @param sysUserRoleIdList
+ * @return
+ */
+ List getListBySysRoleIdIn(List sysUserRoleIdList);
+
+ /**
+ * 根据权限ID删除
+ * @param roleId
+ */
+ void deleteByRoleId(Long roleId);
+
+ /**
+ * 批量添加
+ * @param list
+ */
+ void batchInsert(List list);
+}
diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/mapper/system/ISysUserMapper.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/mapper/system/ISysUserMapper.java
new file mode 100644
index 0000000..60e9db1
--- /dev/null
+++ b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/mapper/system/ISysUserMapper.java
@@ -0,0 +1,64 @@
+package com.arm.equipment.system.data.mapper.system;
+
+import com.arm.equipment.system.data.domain.system.SysUser;
+
+import java.util.List;
+
+/**
+ * 系统--用户表
+ *
+ * @author admin
+ * @date 2021年10月19日 15:07:06
+ */
+public interface ISysUserMapper {
+
+ /**
+ * 插入
+ *
+ * @param sysUser sysUser
+ * @return int
+ */
+ int insertSelective(SysUser sysUser);
+
+ /**
+ * 更新
+ *
+ * @param setParam setParam
+ * @param whereParam whereParam
+ * @return int
+ */
+ int updateSelective(SysUser setParam, SysUser whereParam);
+
+ /**
+ * 数量
+ *
+ * @param sysUser sysUser
+ * @return int
+ */
+ int getCount(SysUser sysUser);
+
+ /**
+ * 单条
+ *
+ * @param sysUser sysUser
+ * @return SysUser
+ */
+ SysUser getOne(SysUser sysUser);
+
+ /**
+ * 多条
+ *
+ * @param sysUser sysUser
+ * @return List
+ */
+ List getList(SysUser sysUser);
+
+ /**
+ * 分页
+ *
+ * @param sysUser sysUser
+ * @return List
+ */
+ List getPageList(SysUser sysUser);
+
+}
diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/mapper/system/ISysUserRoleMapper.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/mapper/system/ISysUserRoleMapper.java
new file mode 100644
index 0000000..03165f1
--- /dev/null
+++ b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/mapper/system/ISysUserRoleMapper.java
@@ -0,0 +1,80 @@
+package com.arm.equipment.system.data.mapper.system;
+
+import com.arm.equipment.system.data.domain.system.SysUserRole;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * 系统--用户角色关联表
+ *
+ * @author admin
+ * @date 2021年10月19日 15:06:59
+ */
+public interface ISysUserRoleMapper {
+
+ /**
+ * 插入
+ *
+ * @param sysUserRole sysUserRole
+ * @return int
+ */
+ int insertSelective(SysUserRole sysUserRole);
+
+ /**
+ * 更新
+ *
+ * @param setParam setParam
+ * @param whereParam whereParam
+ * @return int
+ */
+ int updateSelective(SysUserRole setParam, SysUserRole whereParam);
+
+ /**
+ * 数量
+ *
+ * @param sysUserRole sysUserRole
+ * @return int
+ */
+ int getCount(SysUserRole sysUserRole);
+
+ /**
+ * 单条
+ *
+ * @param sysUserRole sysUserRole
+ * @return SysUserRole
+ */
+ SysUserRole getOne(SysUserRole sysUserRole);
+
+ /**
+ * 多条
+ *
+ * @param sysUserRole sysUserRole
+ * @return List
+ */
+ List getList(SysUserRole sysUserRole);
+
+ /**
+ * 分页
+ *
+ * @param sysUserRole sysUserRole
+ * @return List
+ */
+ List getPageList(SysUserRole sysUserRole);
+
+ /**
+ * 根据用户ID删除用户角色
+ *
+ * @param userId
+ */
+ void deleteByUserId(Long userId);
+
+ /**
+ * 为用户批量添加角色
+ *
+ * @param newRole
+ * @param userId
+ * @param operator
+ */
+ void insertByRoleIdIn(@Param("newRole") List newRole, @Param("userId") Long userId, @Param("operator") String operator);
+}
diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/mapper/user/IAppUserMapper.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/mapper/user/IAppUserMapper.java
new file mode 100644
index 0000000..908b1d3
--- /dev/null
+++ b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/mapper/user/IAppUserMapper.java
@@ -0,0 +1,64 @@
+package com.arm.equipment.system.data.mapper.user;
+
+import com.arm.equipment.system.data.domain.user.AppUser;
+
+import java.util.List;
+
+/**
+ * APP用户
+ *
+ * @author admin
+ * @date 2023年03月13日 22:34:47
+ */
+public interface IAppUserMapper {
+
+ /**
+ * 插入
+ *
+ * @param appUser appUser
+ * @return int
+ */
+ int insertSelective(AppUser appUser);
+
+ /**
+ * 更新
+ *
+ * @param setParam setParam
+ * @param whereParam whereParam
+ * @return int
+ */
+ int updateSelective(AppUser setParam, AppUser whereParam);
+
+ /**
+ * 数量
+ *
+ * @param appUser appUser
+ * @return int
+ */
+ int getCount(AppUser appUser);
+
+ /**
+ * 单条
+ *
+ * @param appUser appUser
+ * @return AppUser
+ */
+ AppUser getOne(AppUser appUser);
+
+ /**
+ * 多条
+ *
+ * @param appUser appUser
+ * @return List
+ */
+ List getList(AppUser appUser);
+
+ /**
+ * 分页
+ *
+ * @param appUser appUser
+ * @return List
+ */
+ List getPageList(AppUser appUser);
+
+}
diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/mapper/weaponry/IWeaponryLendRecordMapper.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/mapper/weaponry/IWeaponryLendRecordMapper.java
new file mode 100644
index 0000000..9ff8c04
--- /dev/null
+++ b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/mapper/weaponry/IWeaponryLendRecordMapper.java
@@ -0,0 +1,64 @@
+package com.arm.equipment.system.data.mapper.weaponry;
+
+import com.arm.equipment.system.data.domain.weaponry.WeaponryLendRecord;
+
+import java.util.List;
+
+/**
+ * 装备武器借出记录
+ *
+ * @author admin
+ * @date 2023年03月23日 11:02:17
+ */
+public interface IWeaponryLendRecordMapper {
+
+ /**
+ * 插入
+ *
+ * @param weaponryLendRecord weaponryLendRecord
+ * @return int
+ */
+ int insertSelective(WeaponryLendRecord weaponryLendRecord);
+
+ /**
+ * 更新
+ *
+ * @param setParam setParam
+ * @param whereParam whereParam
+ * @return int
+ */
+ int updateSelective(WeaponryLendRecord setParam, WeaponryLendRecord whereParam);
+
+ /**
+ * 数量
+ *
+ * @param weaponryLendRecord weaponryLendRecord
+ * @return int
+ */
+ int getCount(WeaponryLendRecord weaponryLendRecord);
+
+ /**
+ * 单条
+ *
+ * @param weaponryLendRecord weaponryLendRecord
+ * @return WeaponryLendRecord
+ */
+ WeaponryLendRecord getOne(WeaponryLendRecord weaponryLendRecord);
+
+ /**
+ * 多条
+ *
+ * @param weaponryLendRecord weaponryLendRecord
+ * @return List
+ */
+ List getList(WeaponryLendRecord weaponryLendRecord);
+
+ /**
+ * 分页
+ *
+ * @param weaponryLendRecord weaponryLendRecord
+ * @return List
+ */
+ List getPageList(WeaponryLendRecord weaponryLendRecord);
+
+}
\ No newline at end of file
diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/mapper/weaponry/IWeaponryMapper.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/mapper/weaponry/IWeaponryMapper.java
new file mode 100644
index 0000000..d38b48d
--- /dev/null
+++ b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/mapper/weaponry/IWeaponryMapper.java
@@ -0,0 +1,64 @@
+package com.arm.equipment.system.data.mapper.weaponry;
+
+import com.arm.equipment.system.data.domain.weaponry.Weaponry;
+
+import java.util.List;
+
+/**
+ * 装备武器
+ *
+ * @author admin
+ * @date 2023年03月23日 10:29:48
+ */
+public interface IWeaponryMapper {
+
+ /**
+ * 插入
+ *
+ * @param weaponry weaponry
+ * @return int
+ */
+ int insertSelective(Weaponry weaponry);
+
+ /**
+ * 更新
+ *
+ * @param setParam setParam
+ * @param whereParam whereParam
+ * @return int
+ */
+ int updateSelective(Weaponry setParam, Weaponry whereParam);
+
+ /**
+ * 数量
+ *
+ * @param weaponry weaponry
+ * @return int
+ */
+ int getCount(Weaponry weaponry);
+
+ /**
+ * 单条
+ *
+ * @param weaponry weaponry
+ * @return Weaponry
+ */
+ Weaponry getOne(Weaponry weaponry);
+
+ /**
+ * 多条
+ *
+ * @param weaponry weaponry
+ * @return List
+ */
+ List getList(Weaponry weaponry);
+
+ /**
+ * 分页
+ *
+ * @param weaponry weaponry
+ * @return List
+ */
+ List getPageList(Weaponry weaponry);
+
+}
\ No newline at end of file
diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/mapper/weaponry/IWeaponryReturnRecordMapper.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/mapper/weaponry/IWeaponryReturnRecordMapper.java
new file mode 100644
index 0000000..be80762
--- /dev/null
+++ b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/mapper/weaponry/IWeaponryReturnRecordMapper.java
@@ -0,0 +1,64 @@
+package com.arm.equipment.system.data.mapper.weaponry;
+
+import com.arm.equipment.system.data.domain.weaponry.WeaponryReturnRecord;
+
+import java.util.List;
+
+/**
+ * 装备武器归还记录
+ *
+ * @author admin
+ * @date 2023年03月23日 11:03:25
+ */
+public interface IWeaponryReturnRecordMapper {
+
+ /**
+ * 插入
+ *
+ * @param weaponryReturnRecord weaponryReturnRecord
+ * @return int
+ */
+ int insertSelective(WeaponryReturnRecord weaponryReturnRecord);
+
+ /**
+ * 更新
+ *
+ * @param setParam setParam
+ * @param whereParam whereParam
+ * @return int
+ */
+ int updateSelective(WeaponryReturnRecord setParam, WeaponryReturnRecord whereParam);
+
+ /**
+ * 数量
+ *
+ * @param weaponryReturnRecord weaponryReturnRecord
+ * @return int
+ */
+ int getCount(WeaponryReturnRecord weaponryReturnRecord);
+
+ /**
+ * 单条
+ *
+ * @param weaponryReturnRecord weaponryReturnRecord
+ * @return WeaponryReturnRecord
+ */
+ WeaponryReturnRecord getOne(WeaponryReturnRecord weaponryReturnRecord);
+
+ /**
+ * 多条
+ *
+ * @param weaponryReturnRecord weaponryReturnRecord
+ * @return List
+ */
+ List getList(WeaponryReturnRecord weaponryReturnRecord);
+
+ /**
+ * 分页
+ *
+ * @param weaponryReturnRecord weaponryReturnRecord
+ * @return List
+ */
+ List getPageList(WeaponryReturnRecord weaponryReturnRecord);
+
+}
\ No newline at end of file
diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/mybatis/type/CustomLocalTimeTypeHandler.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/mybatis/type/CustomLocalTimeTypeHandler.java
new file mode 100644
index 0000000..1146d89
--- /dev/null
+++ b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/mybatis/type/CustomLocalTimeTypeHandler.java
@@ -0,0 +1,62 @@
+package com.arm.equipment.system.data.mybatis.type;
+
+import org.apache.commons.lang3.StringUtils;
+import org.apache.ibatis.lang.UsesJava8;
+import org.apache.ibatis.type.JdbcType;
+import org.apache.ibatis.type.LocalTimeTypeHandler;
+
+import java.sql.*;
+import java.time.LocalTime;
+
+/**
+ * 继承了LocalTimeTypeHandler这个类, 重写了对localtime的处理
+ * 主要是针对0点返回null的问题
+ * @author
+ */
+@UsesJava8
+public class CustomLocalTimeTypeHandler extends LocalTimeTypeHandler {
+
+ @Override
+ public void setNonNullParameter(PreparedStatement ps, int i, LocalTime parameter, JdbcType jdbcType)
+ throws SQLException {
+ ps.setTime(i, Time.valueOf(parameter));
+ }
+
+ @Override
+ public LocalTime getNullableResult(ResultSet rs, String columnName) throws SQLException {
+ String stringTime = rs.getString(columnName);
+ return getLocalTime(stringTime);
+ }
+
+ @Override
+ public LocalTime getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
+ String stringTime = rs.getString(columnIndex);
+ return getLocalTime(stringTime);
+ }
+
+ @Override
+ public LocalTime getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
+ String stringTime = cs.getString(columnIndex);
+ return getLocalTime(stringTime);
+ }
+
+ /**
+ * 从字符串中解析时间
+ * 取出每一位设置为localtime的时,分,秒,毫秒
+ * @param stringTime 时间字符串
+ * @return
+ */
+ private LocalTime getLocalTime(String stringTime) {
+ if (StringUtils.isEmpty(stringTime)) {
+ return null;
+ }
+ String[] timeSplit = stringTime.split(":");
+ if (stringTime.contains(".")) {
+ String[] secondSplit = timeSplit[2].split("\\.");
+ String nano = secondSplit[1].replaceAll("[0]+$", "");
+ return LocalTime.of(Integer.parseInt(timeSplit[0]), Integer.parseInt(timeSplit[1]), Integer.parseInt(secondSplit[0]), Integer.parseInt(nano));
+ } else {
+ return LocalTime.of(Integer.parseInt(timeSplit[0]), Integer.parseInt(timeSplit[1]), Integer.parseInt(timeSplit[2]));
+ }
+ }
+}
diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/service/common/IDictService.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/service/common/IDictService.java
new file mode 100644
index 0000000..9f70eab
--- /dev/null
+++ b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/service/common/IDictService.java
@@ -0,0 +1,20 @@
+package com.arm.equipment.system.data.service.common;
+
+import com.arm.equipment.system.data.vo.dict.DictVO;
+
+import java.util.List;
+
+/**
+ * 字典业务类
+ *
+ * @author admin
+ */
+public interface IDictService {
+ /**
+ * 获取字典数据
+ *
+ * @param name 字典名称
+ * @return 字典数据
+ */
+ List getDictData(String name);
+}
diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/service/common/IIdWorkerService.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/service/common/IIdWorkerService.java
new file mode 100644
index 0000000..2c2589d
--- /dev/null
+++ b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/service/common/IIdWorkerService.java
@@ -0,0 +1,15 @@
+package com.arm.equipment.system.data.service.common;
+
+/**
+ * id生成器
+ */
+public interface IIdWorkerService {
+
+ /**
+ * 获取id(趋势为自增)
+ * long最大值9223372036854775807
+ *
+ * @return
+ */
+ long getNextId();
+}
diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/service/common/IVerifyCodeService.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/service/common/IVerifyCodeService.java
new file mode 100644
index 0000000..2e255d3
--- /dev/null
+++ b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/service/common/IVerifyCodeService.java
@@ -0,0 +1,36 @@
+package com.arm.equipment.system.data.service.common;
+
+import com.arm.equipment.system.data.vo.system.VerifyCodeVO;
+
+import java.io.IOException;
+import java.io.OutputStream;
+
+/**
+ * 后台管理验证码生成
+ *
+ * @author Ousei
+ * @date 2020年7月17日15:27:07
+ */
+public interface IVerifyCodeService {
+ /**
+ * 生成验证码并返回code,将图片写到os中
+ *
+ * @param width
+ * @param height
+ * @param os
+ * @return
+ * @throws IOException
+ */
+ String generate(int width, int height, OutputStream os) throws IOException;
+
+ /**
+ * 生成验证码对象
+ *
+ * @param width
+ * @param height
+ * @return
+ * @throws IOException
+ */
+ VerifyCodeVO generate(int width, int height) throws IOException;
+}
+
diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/service/common/impl/DictServiceImpl.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/service/common/impl/DictServiceImpl.java
new file mode 100644
index 0000000..417e231
--- /dev/null
+++ b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/service/common/impl/DictServiceImpl.java
@@ -0,0 +1,65 @@
+package com.arm.equipment.system.data.service.common.impl;
+
+
+import com.arm.equipment.system.data.exception.BusinessException;
+import com.arm.equipment.system.data.service.common.IDictService;
+import com.arm.equipment.system.data.vo.dict.DictVO;
+import org.springframework.stereotype.Service;
+
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 字典业务类
+ *
+ * @author admin
+ */
+@Service
+public class DictServiceImpl implements IDictService {
+ /**
+ * 所有的新枚举都在这个包下
+ */
+ String DICT_BASE_PACKAGE = "com.arm.equipment.system.data.enums.dict";
+
+
+ @Override
+ public List getDictData(String name) {
+ return getEnumDict(name);
+ }
+
+ /**
+ * 通过枚举名称获得枚举数据
+ *
+ * @param name 枚举名称, 注意枚举必须放在DICT_BASE_PACKAGE下面
+ * @return
+ */
+ private List getEnumDict(String name) {
+ String className = DICT_BASE_PACKAGE + "." + name;
+ Method method;
+ try {
+ method = Class.forName(className).getMethod("values");
+ } catch (NoSuchMethodException e) {
+ throw new BusinessException("枚举类反射异常:不存在的方法!method=values");
+ } catch (ClassNotFoundException e) {
+ throw new BusinessException(String.format("枚举类反射异常:不存在的枚举类!className=%s", className));
+ }
+ try {
+ Object invoke = method.invoke(null);
+ Object[] list = (Object[]) invoke;
+ List voList = new ArrayList<>();
+ for (Object o : list) {
+ Object enumCode = o.getClass().getMethod("getCode").invoke(o);
+ String enumText = o.getClass().getMethod("getText").invoke(o).toString();
+ DictVO vo = new DictVO(enumCode.toString(), enumText);
+ voList.add(vo);
+ }
+ return voList;
+ } catch (IllegalAccessException | InvocationTargetException e) {
+ throw new BusinessException(String.format("枚举类反射异常:方法[%s]执行失败!", method.getName()));
+ } catch (NoSuchMethodException e) {
+ throw new BusinessException(String.format("枚举类反射异常:方法[%s]不存在!", method.getName()));
+ }
+ }
+}
diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/service/common/impl/IdWorkerServiceImpl.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/service/common/impl/IdWorkerServiceImpl.java
new file mode 100644
index 0000000..b43d216
--- /dev/null
+++ b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/service/common/impl/IdWorkerServiceImpl.java
@@ -0,0 +1,159 @@
+package com.arm.equipment.system.data.service.common.impl;
+
+import com.arm.equipment.system.data.service.common.IIdWorkerService;
+import com.arm.equipment.system.data.constant.RedisKeys;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.PostConstruct;
+
+
+/**
+ * Twitter_Snowflake
+ * SnowFlake的结构如下(每部分用-分开):
+ * 0 - 0000000000 0000000000 0000000000 0000000000 0 - 00000 - 00000 - 000000000000
+ * 1位标识,由于long基本类型在Java中是带符号的,最高位是符号位,正数是0,负数是1,所以id一般是正数,最高位是0
+ * 41位时间截(毫秒级),注意,41位时间截不是存储当前时间的时间截,而是存储时间截的差值(当前时间截 - 开始时间截)
+ * 得到的值),这里的的开始时间截,一般是我们的id生成器开始使用的时间,由我们程序来指定的(如下下面程序IdWorker类的startTime属性)。41位的时间截,可以使用69年,年T = (1L << 41) / (1000L * 60 * 60 * 24 * 365) = 69
+ * 10位的数据机器位,可以部署在1024个节点,包括5位datacenterId和5位workerId
+ * 12位序列,毫秒内的计数,12位的计数顺序号支持每个节点每毫秒(同一机器,同一时间截)产生4096个ID序号
+ * 加起来刚好64位,为一个Long型。
+ * SnowFlake的优点是,整体上按照时间自增排序,并且整个分布式系统内不会产生ID碰撞(由数据中心ID和机器ID作区分),并且效率较高,经测试,SnowFlake每秒能够产生26万ID左右。
+ */
+@Service
+public class IdWorkerServiceImpl implements IIdWorkerService {
+ private final static Logger logger = LoggerFactory.getLogger(IdWorkerServiceImpl.class);
+ @Autowired
+ private RedisTemplate redisTemplate;
+
+ /**
+ * 开始时间截 (Thu Mar 05 2020 11:57:29 GMT+0800)
+ */
+ private final long twepoch = 1583380649557L;
+ /**
+ * 机器id所占的位数
+ */
+ private final static long WORKER_ID_BITS = 5L;
+ /**
+ * 数据标识id所占的位数
+ */
+ private final long datacenterIdBits = 5L;
+ /**
+ * 支持的最大机器id,结果是31 (这个移位算法可以很快的计算出几位二进制数所能表示的最大十进制数)
+ */
+ private final static long MAX_WORKER_ID = -1L ^ (-1L << WORKER_ID_BITS);
+ /**
+ * 支持的最大数据标识id,结果是31
+ */
+ private final long maxDatacenterId = -1L ^ (-1L << datacenterIdBits);
+ /**
+ * 序列在id中占的位数
+ */
+ private final long sequenceBits = 12L;
+ /**
+ * 机器ID向左移12位
+ */
+ private final long workerIdShift = sequenceBits;
+ /**
+ * 数据标识id向左移17位(12+5)
+ */
+ private final long datacenterIdShift = sequenceBits + WORKER_ID_BITS;
+ /**
+ * 时间截向左移22位(5+5+12)
+ */
+ private final long timestampLeftShift = sequenceBits + WORKER_ID_BITS + datacenterIdBits;
+ /**
+ * 生成序列的掩码,这里为4095 (0b111111111111=0xfff=4095)
+ */
+ private final long sequenceMask = -1L ^ (-1L << sequenceBits);
+ /**
+ * 工作机器ID(0~31)
+ */
+ private Long workerId = (long) (Math.random() * 32);
+ /**
+ * 数据中心ID(0~31)
+ */
+ private static long datacenterId = 0;
+ /**
+ * 毫秒内序列(0~4095)
+ */
+ private long sequence = 0L;
+ /**
+ * 上次生成ID的时间截
+ */
+ private long lastTimestamp = -1L;
+
+ /**
+ * 初始化worker id
+ * 1.从redis中自增
+ * 2.自增值对32求余(拿到0~31)
+ */
+ @PostConstruct
+ public void init() {
+ Long increment = redisTemplate.opsForValue().increment(RedisKeys.SNOW_FLAKE_WORKER_ID);
+ workerId = increment % 32;
+ logger.info("当前机器 workerId: {}", workerId);
+ }
+
+ /**
+ * 获得下一个ID (该方法是线程安全的)
+ *
+ * @return SnowflakeId
+ */
+ @Override
+ public synchronized long getNextId() {
+ long timestamp = timeGen();
+ //如果当前时间小于上一次ID生成的时间戳,说明系统时钟回退过这个时候应当抛出异常
+ if (timestamp < lastTimestamp) {
+ throw new RuntimeException(String.format("Clock moved backwards. Refusing to generate id for %d milliseconds", lastTimestamp - timestamp));
+ }
+ //如果是同一时间生成的,则进行毫秒内序列
+ if (lastTimestamp == timestamp) {
+ sequence = (sequence + 1) & sequenceMask;
+ //毫秒内序列溢出
+ if (sequence == 0) {
+ //阻塞到下一个毫秒,获得新的时间戳
+ timestamp = tilNextMillis(lastTimestamp);
+ }
+ }
+ //时间戳改变,毫秒内序列重置
+ else {
+ sequence = 0L;
+ }
+ //上次生成ID的时间截
+ lastTimestamp = timestamp;
+ //移位并通过或运算拼到一起组成64位的ID
+ long id = ((timestamp - twepoch) << timestampLeftShift)
+ | (datacenterId << datacenterIdShift)
+ | (workerId << workerIdShift)
+ | sequence;
+ return id;
+ }
+
+
+ /**
+ * 阻塞到下一个毫秒,直到获得新的时间戳
+ *
+ * @param lastTimestamp 上次生成ID的时间截
+ * @return 当前时间戳
+ */
+ private long tilNextMillis(long lastTimestamp) {
+ long timestamp = timeGen();
+ while (timestamp <= lastTimestamp) {
+ timestamp = timeGen();
+ }
+ return timestamp;
+ }
+
+ /**
+ * 返回以毫秒为单位的当前时间
+ *
+ * @return 当前时间(毫秒)
+ */
+ private static long timeGen() {
+ return System.currentTimeMillis();
+ }
+}
diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/service/common/impl/VerifyCodeServiceImpl.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/service/common/impl/VerifyCodeServiceImpl.java
new file mode 100644
index 0000000..3c69db6
--- /dev/null
+++ b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/service/common/impl/VerifyCodeServiceImpl.java
@@ -0,0 +1,110 @@
+package com.arm.equipment.system.data.service.common.impl;
+
+import com.arm.equipment.system.data.service.common.IVerifyCodeService;
+import com.arm.equipment.system.data.util.RandomUtils;
+import com.arm.equipment.system.data.vo.system.VerifyCodeVO;
+import org.springframework.stereotype.Service;
+
+import javax.imageio.ImageIO;
+import java.awt.*;
+import java.awt.image.BufferedImage;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.util.Random;
+
+@Service
+public class VerifyCodeServiceImpl implements IVerifyCodeService {
+
+ private static final String[] FONT_TYPES = {"\u5b8b\u4f53", "\u65b0\u5b8b\u4f53", "\u9ed1\u4f53", "\u6977\u4f53", "\u96b6\u4e66"};
+
+ private static final int VALICATE_CODE_LENGTH = 4;
+
+ /**
+ * 设置背景颜色及大小,干扰线
+ *
+ * @param graphics
+ * @param width
+ * @param height
+ */
+ private static void fillBackground(Graphics graphics, int width, int height) {
+ // 填充背景
+ graphics.setColor(Color.WHITE);
+ //设置矩形坐标x y 为0
+ graphics.fillRect(0, 0, width, height);
+ // 加入干扰线条
+ for (int i = 0; i < 8; i++) {
+ //设置随机颜色算法参数
+ graphics.setColor(RandomUtils.randomColor(40, 150));
+ Random random = new Random();
+ int x = random.nextInt(width);
+ int y = random.nextInt(height);
+ int x1 = random.nextInt(width);
+ int y1 = random.nextInt(height);
+ graphics.drawLine(x, y, x1, y1);
+ }
+ }
+
+ /**
+ * 生成随机字符
+ *
+ * @param width
+ * @param height
+ * @param os
+ * @return
+ * @throws IOException
+ */
+ @Override
+ public String generate(int width, int height, OutputStream os) throws IOException {
+ BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
+ Graphics graphics = image.getGraphics();
+ fillBackground(graphics, width, height);
+ String randomStr = RandomUtils.randomString(VALICATE_CODE_LENGTH);
+ createCharacter(graphics, randomStr);
+ graphics.dispose();
+ //设置JPEG格式
+ ImageIO.write(image, "JPEG", os);
+ return randomStr;
+ }
+
+ /**
+ * 验证码生成
+ *
+ * @param width
+ * @param height
+ * @return
+ */
+ @Override
+ public VerifyCodeVO generate(int width, int height) {
+ VerifyCodeVO verifyCode = null;
+ //将流的初始化放到这里就不需要手动关闭流
+ try (ByteArrayOutputStream baos = new ByteArrayOutputStream()) {
+ String code = generate(width, height, baos);
+ verifyCode = new VerifyCodeVO();
+ verifyCode.setCode(code);
+ verifyCode.setImgBytes(baos.toByteArray());
+ } catch (IOException e) {
+ verifyCode = null;
+ }
+ return verifyCode;
+ }
+
+ /**
+ * 设置字符颜色大小
+ *
+ * @param g
+ * @param randomStr
+ */
+ private void createCharacter(Graphics g, String randomStr) {
+ char[] charArray = randomStr.toCharArray();
+ for (int i = 0; i < charArray.length; i++) {
+ //设置RGB颜色算法参数
+ g.setColor(new Color(50 + RandomUtils.nextInt(100),
+ 50 + RandomUtils.nextInt(100), 50 + RandomUtils.nextInt(100)));
+ //设置字体大小,类型
+ g.setFont(new Font(FONT_TYPES[RandomUtils.nextInt(FONT_TYPES.length)], Font.BOLD, 26));
+ //设置x y 坐标
+ g.drawString(String.valueOf(charArray[i]), 15 * i + 5, 19 + RandomUtils.nextInt(8));
+ }
+ }
+}
diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/service/file/IFileService.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/service/file/IFileService.java
new file mode 100644
index 0000000..46cb86b
--- /dev/null
+++ b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/service/file/IFileService.java
@@ -0,0 +1,22 @@
+package com.arm.equipment.system.data.service.file;
+
+
+import com.arm.equipment.system.data.enums.file.EnumUpload;
+import org.springframework.web.multipart.MultipartFile;
+
+/**
+ * 文件业务类
+ *
+ * @author admin
+ */
+public interface IFileService {
+ /**
+ * 上传文件
+ *
+ * @param file
+ * @param enumUploadItem
+ * @return
+ * @throws Exception
+ */
+ String upload(MultipartFile file, EnumUpload enumUploadItem);
+}
diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/service/file/impl/FileServiceImpl.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/service/file/impl/FileServiceImpl.java
new file mode 100644
index 0000000..795c247
--- /dev/null
+++ b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/service/file/impl/FileServiceImpl.java
@@ -0,0 +1,53 @@
+package com.arm.equipment.system.data.service.file.impl;
+
+
+import com.arm.equipment.system.data.enums.file.EnumUpload;
+import com.arm.equipment.system.data.service.file.IFileService;
+import com.arm.equipment.system.data.util.DateUtils;
+import com.arm.equipment.system.data.util.UuidUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Component;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.Date;
+
+/**
+ * 上传文件
+ *
+ * @author: xly
+ * @time: 2023/3/10 10:54
+ */
+@Component
+public class FileServiceImpl implements IFileService {
+ private final static Logger LOGGER = LoggerFactory.getLogger(FileServiceImpl.class);
+ @Override
+ public String upload(MultipartFile file, EnumUpload enumUploadItem) {
+ try {
+ String os = System.getProperty("os.name");
+ //Windows操作系统
+ String resourcePath = System.getProperty("user.dir");
+ if (os != null && os.toLowerCase().startsWith("windows")) {
+ resourcePath = resourcePath + "\\";
+ } else {
+ resourcePath = resourcePath + "/";
+ }
+ File pathFile = new File(resourcePath);
+ //判断文件夹是否存在
+ if (!pathFile.exists() && !pathFile.isDirectory()) {
+ pathFile.mkdirs();
+ }
+ String fileName = UuidUtils.uuid() + "." + enumUploadItem.getSuffix();
+ String filePath = resourcePath + fileName;
+ file.transferTo(new File(filePath));
+ return fileName;
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ return null;
+ }
+
+}
diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/service/system/ISysBaseParamService.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/service/system/ISysBaseParamService.java
new file mode 100644
index 0000000..bee886d
--- /dev/null
+++ b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/service/system/ISysBaseParamService.java
@@ -0,0 +1,96 @@
+package com.arm.equipment.system.data.service.system;
+
+import com.arm.equipment.system.data.domain.system.SysBaseParam;
+
+import java.util.List;
+
+/**
+ * 系统--基础参数
+ *
+ * @author Administrator
+ * @date 2021年10月26日 16:36:52
+ */
+public interface ISysBaseParamService {
+ /**
+ * 保存或更新
+ * @param req
+ */
+ void save(SysBaseParam req, String operator);
+
+ /**
+ * 插入
+ *
+ * @param sysBaseParam sysBaseParam
+ * @return int
+ */
+ int insertSelective(SysBaseParam sysBaseParam);
+
+ /**
+ * 主键更新
+ *
+ * @param sysBaseParam sysBaseParam
+ * @return int
+ */
+ int updateSelectiveById(SysBaseParam sysBaseParam);
+
+ /**
+ * 数量
+ *
+ * @param sysBaseParam sysBaseParam
+ * @return int
+ */
+ int getCount(SysBaseParam sysBaseParam);
+
+ /**
+ * unicode查询
+ * @param uniCode
+ * @return
+ */
+ SysBaseParam getOneByUniCode(String uniCode);
+
+ /**
+ * 主键查询
+ *
+ * @param id id
+ * @return SysBaseParam
+ */
+ SysBaseParam getOneById(Long id);
+
+ /**
+ * 多条
+ *
+ * @param sysBaseParam sysBaseParam
+ * @return List
+ */
+ List getList(SysBaseParam sysBaseParam);
+
+ /**
+ * 分页
+ *
+ * @param sysBaseParam sysBaseParam
+ * @return List
+ */
+ List getPageList(SysBaseParam sysBaseParam);
+
+ /**
+ * 审核
+ * @param id
+ * @param operator
+ */
+ void audit(Long id, String operator);
+
+ /**
+ * 取消审核
+ * @param id
+ * @param operator
+ */
+ void unaudit(Long id, String operator);
+
+ /**
+ * 删除
+ * @param id
+ * @param operator
+ */
+ void delete(Long id, String operator);
+
+}
diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/service/system/ISysLogService.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/service/system/ISysLogService.java
new file mode 100644
index 0000000..c83be9d
--- /dev/null
+++ b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/service/system/ISysLogService.java
@@ -0,0 +1,88 @@
+package com.arm.equipment.system.data.service.system;
+
+import com.arm.equipment.system.data.domain.system.SysLog;
+
+import java.util.List;
+
+/**
+ * 日志表
+ *
+ * @author admin
+ * @date 2022年09月16日 12:41:35
+ */
+public interface ISysLogService {
+ /**
+ * 保存或更新
+ * @param req
+ */
+ void save(SysLog req, String operator);
+
+ /**
+ * 插入
+ *
+ * @param sysLog sysLog
+ * @return int
+ */
+ int insertSelective(SysLog sysLog);
+
+ /**
+ * 主键更新
+ *
+ * @param sysLog sysLog
+ * @return int
+ */
+ int updateSelectiveById(SysLog sysLog);
+
+ /**
+ * 数量
+ *
+ * @param sysLog sysLog
+ * @return int
+ */
+ int getCount(SysLog sysLog);
+
+ /**
+ * 主键查询
+ *
+ * @param id id
+ * @return SysLog
+ */
+ SysLog getOneById(Long id);
+
+ /**
+ * 多条
+ *
+ * @param sysLog sysLog
+ * @return List
+ */
+ List getList(SysLog sysLog);
+
+ /**
+ * 分页
+ *
+ * @param sysLog sysLog
+ * @return List
+ */
+ List getPageList(SysLog sysLog);
+
+ /**
+ * 审核
+ * @param id
+ * @param operator
+ */
+ void audit(Long id, String operator);
+
+ /**
+ * 取消审核
+ * @param id
+ * @param operator
+ */
+ void unaudit(Long id, String operator);
+
+ /**
+ * 删除
+ * @param id
+ * @param operator
+ */
+ void delete(Long id, String operator);
+}
diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/service/system/ISysResourceService.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/service/system/ISysResourceService.java
new file mode 100644
index 0000000..185cdc6
--- /dev/null
+++ b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/service/system/ISysResourceService.java
@@ -0,0 +1,107 @@
+package com.arm.equipment.system.data.service.system;
+
+import com.arm.equipment.system.data.domain.system.SysResource;
+
+import java.util.List;
+
+/**
+ * 系统--权限表
+ *
+ * @author admin
+ * @date 2021年10月19日 15:06:30
+ */
+public interface ISysResourceService {
+ /**
+ * 保存或更新
+ *
+ * @param req
+ */
+ void save(SysResource req, String operator);
+
+ /**
+ * 插入
+ *
+ * @param sysResource sysResource
+ * @return int
+ */
+ int insertSelective(SysResource sysResource);
+
+ /**
+ * 主键更新
+ *
+ * @param sysResource sysResource
+ * @return int
+ */
+ int updateSelectiveById(SysResource sysResource);
+
+ /**
+ * 数量
+ *
+ * @param sysResource sysResource
+ * @return int
+ */
+ int getCount(SysResource sysResource);
+
+ /**
+ * 主键查询
+ *
+ * @param id id
+ * @return SysResource
+ */
+ SysResource getOneById(Long id);
+
+ /**
+ * 多条
+ *
+ * @param sysResource sysResource
+ * @return List
+ */
+ List getList(SysResource sysResource);
+
+ /**
+ * 分页
+ *
+ * @param sysResource sysResource
+ * @return List
+ */
+ List getPageList(SysResource sysResource);
+
+ /**
+ * 审核
+ *
+ * @param id
+ * @param operator
+ */
+ void audit(Long id, String operator);
+
+ /**
+ * 取消审核
+ *
+ * @param id
+ * @param operator
+ */
+ void unaudit(Long id, String operator);
+
+ /**
+ * 删除
+ *
+ * @param id
+ * @param operator
+ */
+ void delete(Long id, String operator);
+
+ /**
+ * 获取目录分页数据
+ *
+ * @param sysResource
+ * @return
+ */
+ List getPageTreeList(SysResource sysResource);
+
+ /**
+ * 获取资源树
+ *
+ * @return
+ */
+ List getResourceTree();
+}
diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/service/system/ISysRoleResourceService.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/service/system/ISysRoleResourceService.java
new file mode 100644
index 0000000..0be329c
--- /dev/null
+++ b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/service/system/ISysRoleResourceService.java
@@ -0,0 +1,120 @@
+package com.arm.equipment.system.data.service.system;
+
+import com.arm.equipment.system.data.domain.system.SysResource;
+import com.arm.equipment.system.data.domain.system.SysRole;
+import com.arm.equipment.system.data.domain.system.SysRoleResource;
+import com.arm.equipment.system.data.vo.system.SysRoleResourceVO;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 系统-角色权限关联表
+ *
+ * @author admin
+ * @date 2021年10月19日 15:06:41
+ */
+public interface ISysRoleResourceService {
+ /**
+ * 保存或更新
+ *
+ * @param req
+ */
+ void save(SysRoleResource req, String operator);
+
+ /**
+ * 插入
+ *
+ * @param sysRoleResource sysRoleResource
+ * @return int
+ */
+ int insertSelective(SysRoleResource sysRoleResource);
+
+ /**
+ * 主键更新
+ *
+ * @param sysRoleResource sysRoleResource
+ * @return int
+ */
+ int updateSelectiveById(SysRoleResource sysRoleResource);
+
+ /**
+ * 数量
+ *
+ * @param sysRoleResource sysRoleResource
+ * @return int
+ */
+ int getCount(SysRoleResource sysRoleResource);
+
+ /**
+ * 主键查询
+ *
+ * @param id id
+ * @return SysRoleResource
+ */
+ SysRoleResource getOneById(Long id);
+
+ /**
+ * 多条
+ *
+ * @param sysRoleResource sysRoleResource
+ * @return List
+ */
+ List getList(SysRoleResource sysRoleResource);
+
+ /**
+ * 分页
+ *
+ * @param sysRoleResource sysRoleResource
+ * @return List
+ */
+ List getPageList(SysRoleResource sysRoleResource);
+
+ /**
+ * 审核
+ *
+ * @param id
+ * @param operator
+ */
+ void audit(Long id, String operator);
+
+ /**
+ * 取消审核
+ *
+ * @param id
+ * @param operator
+ */
+ void unaudit(Long id, String operator);
+
+ /**
+ * 删除
+ *
+ * @param id
+ * @param operator
+ */
+ void delete(Long id, String operator);
+
+ /**
+ * 构建用户资源菜单及资源标识
+ *
+ * @param sysUserRoleIdList
+ * @param sysUserResourceList
+ * @param sysResourceIdentityList
+ */
+ void buildUserResourceListAndIdentityList(List sysUserRoleIdList, List sysUserResourceList,
+ List sysResourceIdentityList);
+
+ /**
+ * 添加角色资源
+ * @param roleResourceVO
+ * @param operator
+ */
+ void addResource(SysRoleResourceVO roleResourceVO, String operator);
+
+ /**
+ * 获取角色资源
+ * @param roleId
+ * @return
+ */
+ Map getResourcesIdListByRoleId(Long roleId);
+}
diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/service/system/ISysRoleService.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/service/system/ISysRoleService.java
new file mode 100644
index 0000000..e8d884d
--- /dev/null
+++ b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/service/system/ISysRoleService.java
@@ -0,0 +1,100 @@
+package com.arm.equipment.system.data.service.system;
+
+import com.arm.equipment.system.data.domain.system.SysRole;
+
+import java.util.List;
+
+/**
+ * 系统--角色表
+ *
+ * @author admin
+ * @date 2021年10月19日 15:06:47
+ */
+public interface ISysRoleService {
+ /**
+ * 保存或更新
+ *
+ * @param req
+ */
+ void save(SysRole req, String operator);
+
+ /**
+ * 插入
+ *
+ * @param sysRole sysRole
+ * @return int
+ */
+ int insertSelective(SysRole sysRole);
+
+ /**
+ * 主键更新
+ *
+ * @param sysRole sysRole
+ * @return int
+ */
+ int updateSelectiveById(SysRole sysRole);
+
+ /**
+ * 数量
+ *
+ * @param sysRole sysRole
+ * @return int
+ */
+ int getCount(SysRole sysRole);
+
+ /**
+ * 主键查询
+ *
+ * @param id id
+ * @return SysRole
+ */
+ SysRole getOneById(Long id);
+
+ /**
+ * 多条
+ *
+ * @param sysRole sysRole
+ * @return List
+ */
+ List getList(SysRole sysRole);
+
+ /**
+ * 分页
+ *
+ * @param sysRole sysRole
+ * @return List
+ */
+ List getPageList(SysRole sysRole);
+
+ /**
+ * 审核
+ *
+ * @param id
+ * @param operator
+ */
+ void audit(Long id, String operator);
+
+ /**
+ * 取消审核
+ *
+ * @param id
+ * @param operator
+ */
+ void unaudit(Long id, String operator);
+
+ /**
+ * 删除
+ *
+ * @param id
+ * @param operator
+ */
+ void delete(Long id, String operator);
+
+ /**
+ * 获取当前登陆用户拥有绝角色
+ *
+ * @param userId
+ * @return
+ */
+ List getCurrentUserRole(Long userId);
+}
diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/service/system/ISysUserRoleService.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/service/system/ISysUserRoleService.java
new file mode 100644
index 0000000..429796a
--- /dev/null
+++ b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/service/system/ISysUserRoleService.java
@@ -0,0 +1,86 @@
+package com.arm.equipment.system.data.service.system;
+
+import com.arm.equipment.system.data.domain.system.SysUser;
+import com.arm.equipment.system.data.domain.system.SysUserRole;
+import com.arm.equipment.system.data.vo.system.AddRoleVO;
+
+import java.util.List;
+
+/**
+ * 系统--用户角色关联表
+ *
+ * @author admin
+ * @date 2021年10月19日 15:06:59
+ */
+public interface ISysUserRoleService {
+ /**
+ * 保存或更新
+ *
+ * @param req
+ */
+ void save(SysUserRole req, String operator);
+
+ /**
+ * 插入
+ *
+ * @param sysUserRole sysUserRole
+ * @return int
+ */
+ int insertSelective(SysUserRole sysUserRole);
+
+ /**
+ * 主键更新
+ *
+ * @param sysUserRole sysUserRole
+ * @return int
+ */
+ int updateSelectiveById(SysUserRole sysUserRole);
+
+ /**
+ * 数量
+ *
+ * @param sysUserRole sysUserRole
+ * @return int
+ */
+ int getCount(SysUserRole sysUserRole);
+
+ /**
+ * 主键查询
+ *
+ * @param id id
+ * @return SysUserRole
+ */
+ SysUserRole getOneById(Long id);
+
+ /**
+ * 多条
+ *
+ * @param sysUserRole sysUserRole
+ * @return List
+ */
+ List getList(SysUserRole sysUserRole);
+
+ /**
+ * 分页
+ *
+ * @param sysUserRole sysUserRole
+ * @return List
+ */
+ List getPageList(SysUserRole sysUserRole);
+
+ /**
+ * 删除
+ *
+ * @param id
+ * @param operator
+ */
+ void delete(Long id, String operator);
+
+ /**
+ * 为用户分配角色
+ *
+ * @param addRoleVO
+ * @param currentUser
+ */
+ void addRole(AddRoleVO addRoleVO, SysUser currentUser);
+}
diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/service/system/ISysUserService.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/service/system/ISysUserService.java
new file mode 100644
index 0000000..5367c2f
--- /dev/null
+++ b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/service/system/ISysUserService.java
@@ -0,0 +1,115 @@
+package com.arm.equipment.system.data.service.system;
+
+import com.arm.equipment.system.data.domain.system.SysUser;
+
+import javax.servlet.http.HttpSession;
+import java.util.List;
+
+/**
+ * 系统--用户表
+ *
+ * @author admin
+ * @date 2021年10月19日 15:07:06
+ */
+public interface ISysUserService {
+ /**
+ * 保存或更新
+ *
+ * @param req
+ */
+ void save(SysUser req, String operator);
+
+ /**
+ * 插入
+ *
+ * @param sysUser sysUser
+ * @return int
+ */
+ int insertSelective(SysUser sysUser);
+
+ /**
+ * 主键更新
+ *
+ * @param sysUser sysUser
+ * @return int
+ */
+ int updateSelectiveById(SysUser sysUser);
+
+ /**
+ * 数量
+ *
+ * @param sysUser sysUser
+ * @return int
+ */
+ int getCount(SysUser sysUser);
+
+ /**
+ * 主键查询
+ *
+ * @param id id
+ * @return SysUser
+ */
+ SysUser getOneById(Long id);
+
+ /**
+ * 多条
+ *
+ * @param sysUser sysUser
+ * @return List
+ */
+ List getList(SysUser sysUser);
+
+ /**
+ * 分页
+ *
+ * @param sysUser sysUser
+ * @return List
+ */
+ List getPageList(SysUser sysUser);
+
+ /**
+ * @param id
+ * @return
+ */
+ SysUser getExitOneById(Long id);
+
+ /**
+ * 删除
+ *
+ * @param id
+ * @param operator
+ */
+ void delete(Long id, String operator);
+
+ /**
+ * 登陆
+ *
+ * @param sysUserReq
+ * @return
+ */
+ SysUser login(SysUser sysUserReq, HttpSession webSession);
+
+ /**
+ * 接口登陆
+ *
+ * @param username
+ * @param password
+ * @return
+ */
+ SysUser thirdLogin(String username, String password);
+
+ /**
+ * 修改密码
+ *
+ * @param oldPassword
+ * @param newPassword
+ * @param sysUserId
+ */
+ void updatePassword(String oldPassword, String newPassword, Long sysUserId);
+
+ /**
+ * 验证用户登陆错误次数
+ * @param username
+ */
+ void checkLoginErrorNumByUsername(String username);
+}
diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/service/system/impl/SysBaseParamServiceImpl.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/service/system/impl/SysBaseParamServiceImpl.java
new file mode 100644
index 0000000..0a57c0e
--- /dev/null
+++ b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/service/system/impl/SysBaseParamServiceImpl.java
@@ -0,0 +1,147 @@
+package com.arm.equipment.system.data.service.system.impl;
+
+import com.arm.equipment.system.data.domain.system.SysBaseParam;
+import com.arm.equipment.system.data.enums.dict.EnumStatus;
+import com.arm.equipment.system.data.exception.BusinessException;
+import com.arm.equipment.system.data.mapper.system.ISysBaseParamMapper;
+import com.arm.equipment.system.data.service.common.IIdWorkerService;
+import com.arm.equipment.system.data.service.system.ISysBaseParamService;
+import com.arm.equipment.system.data.constant.RedisKeys;
+import com.arm.equipment.system.data.util.WJAssert;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.cache.annotation.CacheEvict;
+import org.springframework.cache.annotation.Cacheable;
+import org.springframework.context.annotation.Lazy;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * 系统--基础参数
+ *
+ * @author Administrator
+ * @date 2021年10月26日 16:36:52
+ */
+@Service
+public class SysBaseParamServiceImpl implements ISysBaseParamService {
+ @Autowired
+ private ISysBaseParamMapper sysBaseParamMapper;
+ @Autowired
+ private IIdWorkerService idWorkerService;
+ @Autowired
+ @Lazy
+ private ISysBaseParamService sysBaseParamService;
+
+ @Override
+ public void save(SysBaseParam req, String operator) {
+ req.setOperator(operator);
+ if (null == req.getId()) {
+ insertSelective(req);
+ } else {
+ updateSelectiveById(req);
+ }
+ }
+
+ @Override
+ public int insertSelective(SysBaseParam req) {
+ req.setId(idWorkerService.getNextId());
+ req.setStatus(EnumStatus.NEW.getCode());
+ if (null != getOneByUniCode(req.getUniCode())) {
+ throw new BusinessException("已存在同名参数值");
+ }
+ checkStringLength(req, false);
+ return sysBaseParamMapper.insertSelective(req);
+ }
+
+ @Override
+ @CacheEvict(value = RedisKeys.SYS_BASE_PARAM_KEY, key = "#sysBaseParam.uniCode")
+ public int updateSelectiveById(SysBaseParam sysBaseParam) {
+ WJAssert.notNull(sysBaseParam, "入参对象不能为空");
+ WJAssert.notNull(sysBaseParam.getId(), "id参数错误");
+ SysBaseParam where = new SysBaseParam();
+ where.setId(sysBaseParam.getId());
+ return sysBaseParamMapper.updateSelective(sysBaseParam, where);
+ }
+
+ @Override
+ public int getCount(SysBaseParam sysBaseParam) {
+ checkStringLength(sysBaseParam, true);
+ return sysBaseParamMapper.getCount(sysBaseParam);
+ }
+
+ @Override
+ public SysBaseParam getOneById(Long id) {
+ WJAssert.notNull(id, "id参数错误");
+ SysBaseParam where = new SysBaseParam();
+ where.setId(id);
+ return sysBaseParamMapper.getOne(where);
+ }
+
+ @Override
+ public List getList(SysBaseParam sysBaseParam) {
+ checkStringLength(sysBaseParam, true);
+ return sysBaseParamMapper.getList(sysBaseParam);
+ }
+
+ @Override
+ public List getPageList(SysBaseParam sysBaseParam) {
+ checkStringLength(sysBaseParam, true);
+ return sysBaseParamMapper.getPageList(sysBaseParam);
+ }
+
+ @Override
+ public void audit(Long id, String operator) {
+ SysBaseParam req = new SysBaseParam();
+ req.setId(id);
+ req.setOperator(operator);
+ req.setStatus(EnumStatus.AUDIT.getCode());
+
+ SysBaseParam baseParamDB = getOneById(id);
+ req.setUniCode(baseParamDB.getUniCode());
+ sysBaseParamService.updateSelectiveById(req);
+ }
+
+ @Override
+ public void unaudit(Long id, String operator) {
+ SysBaseParam req = new SysBaseParam();
+ req.setId(id);
+ req.setOperator(operator);
+ req.setStatus(EnumStatus.NEW.getCode());
+
+ SysBaseParam baseParamDB = getOneById(id);
+ req.setUniCode(baseParamDB.getUniCode());
+ sysBaseParamService.updateSelectiveById(req);
+ }
+
+ @Override
+ public void delete(Long id, String operator) {
+ SysBaseParam req = new SysBaseParam();
+ req.setId(id);
+ req.setOperator(operator);
+ req.setStatus(EnumStatus.DEL.getCode());
+ updateSelectiveById(req);
+ }
+
+ @Cacheable(value = RedisKeys.SYS_BASE_PARAM_KEY, key = "#uniCode")
+ @Override
+ public SysBaseParam getOneByUniCode(String uniCode) {
+ WJAssert.isMaxLength(uniCode, 50, "UNICODE非法");
+ SysBaseParam where = new SysBaseParam();
+ where.setUniCode(uniCode);
+ where.setStatus(EnumStatus.AUDIT.getCode());
+ return sysBaseParamMapper.getOne(where);
+ }
+
+
+ /**
+ * 参数校验注解默认使用的方法
+ */
+ private void checkStringLength(SysBaseParam sysBaseParam, boolean nullAble) {
+ WJAssert.notNull(sysBaseParam, "入参对象不能为空");
+ WJAssert.limitMaxLength(sysBaseParam.getUniCode(), nullAble, 50, "唯一编码不合法!");
+ WJAssert.limitMaxLength(sysBaseParam.getValue(), nullAble, 2000, "值不合法!");
+ WJAssert.limitMaxLength(sysBaseParam.getDescription(), nullAble, 300, "描述不合法!");
+ WJAssert.limitMaxLength(sysBaseParam.getOperator(), nullAble, 100, "操作人不合法!");
+ WJAssert.limitMaxLength(sysBaseParam.getRemark(), true, 255, "备注不合法!");
+ }
+}
diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/service/system/impl/SysLogServiceImpl.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/service/system/impl/SysLogServiceImpl.java
new file mode 100644
index 0000000..c0f7130
--- /dev/null
+++ b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/service/system/impl/SysLogServiceImpl.java
@@ -0,0 +1,122 @@
+package com.arm.equipment.system.data.service.system.impl;
+
+import com.arm.equipment.system.data.enums.dict.EnumStatus;
+import com.arm.equipment.system.data.util.WJAssert;
+import com.arm.equipment.system.data.service.common.IIdWorkerService;
+import com.arm.equipment.system.data.mapper.system.ISysLogMapper;
+import com.arm.equipment.system.data.domain.system.SysLog;
+import com.arm.equipment.system.data.service.system.ISysLogService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * 日志表
+ *
+ * @author admin
+ * @date 2022年09月16日 12:41:35
+ */
+@Service
+public class SysLogServiceImpl implements ISysLogService {
+ @Autowired
+ private ISysLogMapper sysLogMapper;
+ @Autowired
+ private IIdWorkerService idWorkerService;
+
+ @Override
+ public void save(SysLog req, String operator) {
+ req.setOperator(operator);
+ if (null == req.getId()) {
+ insertSelective(req);
+ } else {
+ updateSelectiveById(req);
+ }
+ }
+
+ @Override
+ public int insertSelective(SysLog req) {
+ req.setId(idWorkerService.getNextId());
+ req.setStatus(EnumStatus.NEW.getCode());
+ checkStringLength(req, false);
+ return sysLogMapper.insertSelective(req);
+ }
+
+ @Override
+ public int updateSelectiveById(SysLog sysLog) {
+ WJAssert.notNull(sysLog, "入参对象不能为空");
+ WJAssert.notNull(sysLog.getId(), "id参数错误");
+ SysLog where = new SysLog();
+ where.setId(sysLog.getId());
+ return sysLogMapper.updateSelective(sysLog, where);
+ }
+
+ @Override
+ public int getCount(SysLog sysLog) {
+ checkStringLength(sysLog, true);
+ return sysLogMapper.getCount(sysLog);
+ }
+
+ @Override
+ public SysLog getOneById(Long id) {
+ WJAssert.notNull(id, "id参数错误");
+ SysLog where = new SysLog();
+ where.setId(id);
+ return sysLogMapper.getOne(where);
+ }
+
+ @Override
+ public List getList(SysLog sysLog) {
+ checkStringLength(sysLog, true);
+ return sysLogMapper.getList(sysLog);
+ }
+
+ @Override
+ public List getPageList(SysLog sysLog) {
+ checkStringLength(sysLog, true);
+ return sysLogMapper.getPageList(sysLog);
+ }
+
+ @Override
+ public void audit(Long id, String operator) {
+ SysLog req = new SysLog();
+ req.setId(id);
+ req.setOperator(operator);
+ req.setStatus(EnumStatus.AUDIT.getCode());
+ updateSelectiveById(req);
+ }
+
+ @Override
+ public void unaudit(Long id, String operator) {
+ SysLog req = new SysLog();
+ req.setId(id);
+ req.setOperator(operator);
+ req.setStatus(EnumStatus.NEW.getCode());
+ updateSelectiveById(req);
+ }
+
+ @Override
+ public void delete(Long id, String operator) {
+ SysLog req = new SysLog();
+ req.setId(id);
+ req.setOperator(operator);
+ req.setStatus(EnumStatus.DEL.getCode());
+ updateSelectiveById(req);
+ }
+
+ /**
+ * 参数校验注解默认使用的方法
+ */
+ private void checkStringLength(SysLog sysLog, boolean nullAble) {
+ WJAssert.notNull(sysLog, "入参对象不能为空");
+ WJAssert.limitMaxLength(sysLog.getTitle(), true, 500, "日志标题不合法!");
+ WJAssert.limitMaxLength(sysLog.getRemoteAddr(), true, 255, "操作IP地址不合法!");
+ WJAssert.limitMaxLength(sysLog.getUserAgent(), true, 255, "用户代理不合法!");
+ WJAssert.limitMaxLength(sysLog.getRequestUri(), true, 255, "请求URI不合法!");
+ WJAssert.limitMaxLength(sysLog.getMethod(), true, 10, "操作方式不合法!");
+ WJAssert.limitMaxLength(sysLog.getParams(), true, 1000, "操作提交的数据不合法!");
+ WJAssert.limitMaxLength(sysLog.getException(), true, 1000, "异常信息不合法!");
+ WJAssert.limitMaxLength(sysLog.getOperator(), nullAble, 50, "操作人不合法!");
+ WJAssert.limitMaxLength(sysLog.getRemark(), true, 255, "备注不合法!");
+ }
+}
diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/service/system/impl/SysResourceServiceImpl.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/service/system/impl/SysResourceServiceImpl.java
new file mode 100644
index 0000000..a79362e
--- /dev/null
+++ b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/service/system/impl/SysResourceServiceImpl.java
@@ -0,0 +1,201 @@
+package com.arm.equipment.system.data.service.system.impl;
+
+import com.arm.equipment.system.data.domain.system.SysResource;
+import com.arm.equipment.system.data.enums.dict.EnumStatus;
+import com.arm.equipment.system.data.enums.dict.EnumSysResourceType;
+import com.arm.equipment.system.data.exception.BusinessException;
+import com.arm.equipment.system.data.mapper.system.ISysResourceMapper;
+import com.arm.equipment.system.data.service.common.IIdWorkerService;
+import com.arm.equipment.system.data.service.system.ISysResourceService;
+import com.arm.equipment.system.data.util.WJAssert;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.Comparator;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * 系统--权限表
+ *
+ * @author admin
+ * @date 2021年10月20日 08:59:10
+ */
+@Service
+public class SysResourceServiceImpl implements ISysResourceService {
+ @Autowired
+ private ISysResourceMapper sysResourceMapper;
+ @Autowired
+ private IIdWorkerService idWorkerService;
+
+ @Override
+ public void save(SysResource req, String operator) {
+ req.setOperator(operator);
+ if (StringUtils.isNotBlank(req.getIdentity())) {
+ SysResource where = new SysResource();
+ where.setIdentity(req.getIdentity());
+ SysResource resourceDB = sysResourceMapper.getOne(where);
+ if (resourceDB != null && !resourceDB.getId().equals(req.getId())) {
+ throw new BusinessException("标识已存在!");
+ }
+ }
+ if (null == req.getId()) {
+ insertSelective(req);
+ } else {
+ updateSelectiveById(req);
+ }
+ }
+
+ @Override
+ public int insertSelective(SysResource req) {
+ req.setId(idWorkerService.getNextId());
+ req.setStatus(EnumStatus.NEW.getCode());
+ checkStringLength(req, false);
+ return sysResourceMapper.insertSelective(req);
+ }
+
+ @Override
+ public int updateSelectiveById(SysResource sysResource) {
+ WJAssert.notNull(sysResource, "入参对象不能为空");
+ WJAssert.notNull(sysResource.getId(), "id参数错误");
+ SysResource where = new SysResource();
+ where.setId(sysResource.getId());
+ return sysResourceMapper.updateSelective(sysResource, where);
+ }
+
+ @Override
+ public int getCount(SysResource sysResource) {
+ checkStringLength(sysResource, true);
+ return sysResourceMapper.getCount(sysResource);
+ }
+
+ @Override
+ public SysResource getOneById(Long id) {
+ WJAssert.notNull(id, "id参数错误");
+ SysResource where = new SysResource();
+ where.setId(id);
+ return sysResourceMapper.getOne(where);
+ }
+
+ @Override
+ public List getList(SysResource sysResource) {
+ checkStringLength(sysResource, true);
+ return sysResourceMapper.getList(sysResource);
+ }
+
+ @Override
+ public List getPageList(SysResource sysResource) {
+ checkStringLength(sysResource, true);
+ return sysResourceMapper.getPageList(sysResource);
+ }
+
+ @Override
+ public void audit(Long id, String operator) {
+ SysResource req = new SysResource();
+ req.setId(id);
+ req.setOperator(operator);
+ req.setStatus(EnumStatus.AUDIT.getCode());
+ updateSelectiveById(req);
+ }
+
+ @Override
+ public void unaudit(Long id, String operator) {
+ SysResource req = new SysResource();
+ req.setId(id);
+ req.setOperator(operator);
+ req.setStatus(EnumStatus.NEW.getCode());
+ updateSelectiveById(req);
+ }
+
+ @Override
+ public void delete(Long id, String operator) {
+ SysResource req = new SysResource();
+ req.setId(id);
+ req.setOperator(operator);
+ req.setStatus(EnumStatus.DEL.getCode());
+ updateSelectiveById(req);
+ }
+
+ /**
+ * 获取目录分页数据
+ *
+ * @param sysResource
+ * @return
+ */
+ @Override
+ public List getPageTreeList(SysResource sysResource) {
+ SysResource where = new SysResource();
+ sysResource.setStatus(EnumStatus.NEW.getCode());
+ List listDB = sysResourceMapper.getList(where);
+
+ return sysResourceMapper.getPageList(sysResource)
+ .stream().peek(item -> {
+ item.setLabel(item.getName());
+ item.setChildren(getChildrenTree(listDB, item.getId().toString()));
+ }).collect(Collectors.toList());
+ }
+
+ /**
+ * 获取资源树
+ * 获取全部数据进行楼中楼
+ *
+ * @return
+ */
+ @Override
+ public List getResourceTree() {
+ SysResource sysResource = new SysResource();
+ sysResource.setStatus(EnumStatus.NEW.getCode());
+ List listDB = sysResourceMapper.getList(sysResource);
+
+ List catalogueList = listDB.stream().filter(item -> {
+ return item.getType().equals(EnumSysResourceType.CATALOGUE.getCode());
+ }).sorted(Comparator.comparing(SysResource::getSort)).collect(Collectors.toList());
+
+ return catalogueList.stream()
+ .peek(item -> {
+ item.setLabel(item.getName());
+ item.setIcon("el-icon-folder-opened");
+ item.setChildren(getChildrenTree(listDB, item.getId().toString()));
+ }).collect(Collectors.toList());
+ }
+
+ /**
+ * 根据目录盖楼 格式(目录->菜单->按钮)
+ *
+ * @param listDB
+ * @param parentId
+ * @return
+ */
+ private List getChildrenTree(List listDB, String parentId) {
+ return listDB.stream()
+ .filter(item -> {
+ return parentId.equals(item.getParentId()) && EnumSysResourceType.MENU.getCode().equals(item.getType());
+ }).peek(item -> {
+ item.setLabel(item.getName());
+ item.setIcon("el-icon-document");
+ List btnList = listDB.stream()
+ .filter(btnItem -> {
+ return btnItem.getParentId().equals(item.getId().toString()) && EnumSysResourceType.BUTTON.getCode().equals(btnItem.getType());
+ }).peek(btnItem -> {
+ btnItem.setLabel(btnItem.getName());
+ }).sorted(Comparator.comparing(SysResource::getSort)).collect(Collectors.toList());
+ item.setChildren(btnList);
+ }).sorted(Comparator.comparing(SysResource::getSort)).collect(Collectors.toList());
+ }
+
+ /**
+ * 参数校验注解默认使用的方法
+ */
+ private void checkStringLength(SysResource sysResource, boolean nullAble) {
+ WJAssert.notNull(sysResource, "入参对象不能为空");
+ WJAssert.limitMaxLength(sysResource.getName(), nullAble, 100, "菜单名称不合法!");
+ WJAssert.limitMaxLength(sysResource.getUrl(), true, 200, "链接地址不合法!");
+ WJAssert.limitMaxLength(sysResource.getParentId(), true, 32, "父菜单ID不合法!");
+ WJAssert.limitMaxLength(sysResource.getIcon(), true, 200, "图标不合法!");
+ WJAssert.limitMaxLength(sysResource.getIdentity(), nullAble, 255, "权限标识不合法!");
+ WJAssert.limitMaxLength(sysResource.getOperator(), true, 50, "操作人不合法!");
+ WJAssert.limitMaxLength(sysResource.getRemark(), true, 255, "备注不合法!");
+ WJAssert.limitMaxLength(sysResource.getRootPath(), true, 255, "根路径,用.分隔不合法!");
+ }
+}
diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/service/system/impl/SysRoleResourceServiceImpl.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/service/system/impl/SysRoleResourceServiceImpl.java
new file mode 100644
index 0000000..c12a856
--- /dev/null
+++ b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/service/system/impl/SysRoleResourceServiceImpl.java
@@ -0,0 +1,311 @@
+package com.arm.equipment.system.data.service.system.impl;
+
+import com.arm.equipment.system.data.domain.system.SysResource;
+import com.arm.equipment.system.data.domain.system.SysRole;
+import com.arm.equipment.system.data.domain.system.SysRoleResource;
+import com.arm.equipment.system.data.enums.dict.EnumStatus;
+import com.arm.equipment.system.data.enums.dict.EnumSysResourceType;
+import com.arm.equipment.system.data.exception.BusinessException;
+import com.arm.equipment.system.data.mapper.system.ISysRoleResourceMapper;
+import com.arm.equipment.system.data.service.common.IIdWorkerService;
+import com.arm.equipment.system.data.service.system.ISysResourceService;
+import com.arm.equipment.system.data.service.system.ISysRoleResourceService;
+import com.arm.equipment.system.data.service.system.ISysRoleService;
+import com.arm.equipment.system.data.util.WJAssert;
+import com.arm.equipment.system.data.vo.system.SysRoleResourceVO;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.CollectionUtils;
+
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * 系统-角色权限关联表
+ *
+ * @author admin
+ * @date 2021年10月19日 15:06:41
+ */
+@Service
+public class SysRoleResourceServiceImpl implements ISysRoleResourceService {
+ @Autowired
+ private ISysRoleResourceMapper sysRoleResourceMapper;
+ @Autowired
+ private IIdWorkerService idWorkerService;
+ @Autowired
+ private ISysResourceService sysResourceService;
+ @Autowired
+ private ISysRoleService sysRoleService;
+
+ @Override
+ public void save(SysRoleResource req, String operator) {
+ req.setOperator(operator);
+ if (null == req.getId()) {
+ insertSelective(req);
+ } else {
+ updateSelectiveById(req);
+ }
+ }
+
+ @Override
+ public int insertSelective(SysRoleResource req) {
+ req.setId(idWorkerService.getNextId());
+ req.setStatus(EnumStatus.NEW.getCode());
+ checkStringLength(req, false);
+ return sysRoleResourceMapper.insertSelective(req);
+ }
+
+ @Override
+ public int updateSelectiveById(SysRoleResource sysRoleResource) {
+ WJAssert.notNull(sysRoleResource, "入参对象不能为空");
+ WJAssert.notNull(sysRoleResource.getId(), "id参数错误");
+ SysRoleResource where = new SysRoleResource();
+ where.setId(sysRoleResource.getId());
+ return sysRoleResourceMapper.updateSelective(sysRoleResource, where);
+ }
+
+ @Override
+ public int getCount(SysRoleResource sysRoleResource) {
+ checkStringLength(sysRoleResource, true);
+ return sysRoleResourceMapper.getCount(sysRoleResource);
+ }
+
+ @Override
+ public SysRoleResource getOneById(Long id) {
+ WJAssert.notNull(id, "id参数错误");
+ SysRoleResource where = new SysRoleResource();
+ where.setId(id);
+ return sysRoleResourceMapper.getOne(where);
+ }
+
+ @Override
+ public List getList(SysRoleResource sysRoleResource) {
+ checkStringLength(sysRoleResource, true);
+ return sysRoleResourceMapper.getList(sysRoleResource);
+ }
+
+ @Override
+ public List getPageList(SysRoleResource sysRoleResource) {
+ checkStringLength(sysRoleResource, true);
+ return sysRoleResourceMapper.getPageList(sysRoleResource);
+ }
+
+ @Override
+ public void audit(Long id, String operator) {
+ SysRoleResource req = new SysRoleResource();
+ req.setId(id);
+ req.setOperator(operator);
+ req.setStatus(EnumStatus.AUDIT.getCode());
+ updateSelectiveById(req);
+ }
+
+ @Override
+ public void unaudit(Long id, String operator) {
+ SysRoleResource req = new SysRoleResource();
+ req.setId(id);
+ req.setOperator(operator);
+ req.setStatus(EnumStatus.NEW.getCode());
+ updateSelectiveById(req);
+ }
+
+ @Override
+ public void delete(Long id, String operator) {
+ SysRoleResource req = new SysRoleResource();
+ req.setId(id);
+ req.setOperator(operator);
+ req.setStatus(EnumStatus.DEL.getCode());
+ updateSelectiveById(req);
+ }
+
+ /**
+ * 构建用户资源菜单及资源标识
+ *
+ * @param sysUserRoleIdList
+ * @param sysUserResourceList
+ * @param sysResourceIdentityList
+ */
+ @Override
+ public void buildUserResourceListAndIdentityList(List sysUserRoleIdList, List sysUserResourceList,
+ List sysResourceIdentityList) {
+ if (CollectionUtils.isEmpty(sysUserRoleIdList)) {
+ return;
+ }
+ List roleIds = sysUserRoleIdList.stream().map(SysRole::getId).collect(Collectors.toList());
+ List list = sysRoleResourceMapper.getListBySysRoleIdIn(roleIds);
+ if (CollectionUtils.isEmpty(list)) {
+ return;
+ }
+ List resourceIdList = list.stream().map(SysRoleResource::getSysResourceId).distinct().collect(Collectors.toList());
+
+ SysResource sysResourceWhere = new SysResource();
+ sysResourceWhere.setStatus(EnumStatus.NEW.getCode());
+ sysResourceWhere.setIdsList(resourceIdList);
+ List sysResourcesList = sysResourceService.getList(sysResourceWhere);
+ if (CollectionUtils.isEmpty(sysResourcesList)) {
+ return;
+ }
+ //用户所拥有资源标识
+ List resourceIdentityList = sysResourcesList.stream().map(SysResource::getIdentity).collect(Collectors.toList());
+ //目录资源集合
+ List allCatalogueResourceList = sysResourcesList.stream().filter(item -> {
+ return EnumSysResourceType.CATALOGUE.getCode().equals(item.getType());
+ }).sorted(Comparator.comparing(SysResource::getSort)).collect(Collectors.toList());
+ //菜单资源集合
+ List allMenuResourceList = sysResourcesList.stream().filter(item -> {
+ return EnumSysResourceType.MENU.getCode().equals(item.getType());
+ }).collect(Collectors.toList());
+ //用户所拥有目录菜单资源盖楼
+ List userResourceList = allCatalogueResourceList.stream()
+ .peek(item -> {
+ List childrenList = allMenuResourceList.stream().filter(childrenItem -> {
+ return item.getId().toString().equals(childrenItem.getParentId());
+ }).sorted(Comparator.comparing(SysResource::getSort)).collect(Collectors.toList());
+ item.setChildren(childrenList);
+ }).collect(Collectors.toList());
+ sysUserResourceList.addAll(userResourceList);
+ sysResourceIdentityList.addAll(resourceIdentityList);
+ }
+
+ /**
+ * 添加角色资源
+ *
+ * @param roleResourceVO
+ * @param operator
+ */
+ @Override
+ @Transactional(rollbackFor = Exception.class)
+ public void addResource(SysRoleResourceVO roleResourceVO, String operator) {
+ List newResourcesList = roleResourceVO.getResourcesIds();
+ if (null == roleResourceVO.getRoleId()) {
+ return;
+ }
+ SysRole sysRoleDB = sysRoleService.getOneById(roleResourceVO.getRoleId());
+ if (sysRoleDB == null) {
+ throw new BusinessException("不存的角色!");
+ }
+ sysRoleResourceMapper.deleteByRoleId(roleResourceVO.getRoleId());
+ if (CollectionUtils.isEmpty(newResourcesList)) {
+ return;
+ }
+ List list = newResourcesList.parallelStream().map(item -> {
+ SysRoleResource req = new SysRoleResource();
+ req.setOperator(operator);
+ req.setSysResourceId(item);
+ req.setSysRoleId(roleResourceVO.getRoleId());
+ req.setId(idWorkerService.getNextId());
+ req.setStatus(EnumStatus.NEW.getCode());
+ return req;
+ }).collect(Collectors.toList());
+ sysRoleResourceMapper.batchInsert(list);
+ }
+
+ /**
+ * 获取角色所拥有权限 el-tree树默认勾选
+ * 1.获取当前角色所拥有所有权限菜单
+ * 2.分别获取当前角色所拥有所有权限菜单中的目录、菜单、按钮集合
+ * 3.过滤当前角色菜单中是否所有按钮权限都拥有,是返回当前菜单ID 否 不返回(决定当前菜单树下面的所有子节点是否全勾选)
+ * 4.过滤当前角色目录中是否所有菜单权限都拥有,(使用步骤三过滤出来的菜单集合进行判断)是返回当前目录ID 否 不返回(决定当前菜单树下面的所有子节点是否全勾选)
+ * 5.返回过滤后的目录、菜单、按钮集合(用与默认勾选)与无过滤的集合(防止不更改直接提交)
+ *
+ * @param roleId
+ * @return
+ */
+ @Override
+ public Map getResourcesIdListByRoleId(Long roleId) {
+ Map resultMap = new HashMap<>(2);
+ resultMap.put("checkedTreeList", new ArrayList<>());
+ resultMap.put("treeList", new ArrayList<>());
+
+ List resultList = new ArrayList<>();
+ SysRoleResource req = new SysRoleResource();
+ req.setSysRoleId(roleId);
+ List resourceIdList = getList(req).stream().map(SysRoleResource::getSysResourceId).collect(Collectors.toList());
+ if (CollectionUtils.isEmpty(resourceIdList)) {
+ return resultMap;
+ }
+
+ SysResource sysResourceWhere = new SysResource();
+ sysResourceWhere.setStatus(EnumStatus.NEW.getCode());
+ sysResourceWhere.setIdsList(resourceIdList);
+ List sysResourcesList = sysResourceService.getList(sysResourceWhere);
+ if (CollectionUtils.isEmpty(sysResourcesList)) {
+ return resultMap;
+ }
+ //用户所拥有目录资源集合
+ List allCatalogueResourceIdList = sysResourcesList.stream().filter(item -> {
+ return EnumSysResourceType.CATALOGUE.getCode().equals(item.getType());
+ }).map(SysResource::getId).collect(Collectors.toList());
+
+ //用户所拥有菜单资源集合
+ List allMenuResourceIdList = sysResourcesList.stream().filter(item -> {
+ return EnumSysResourceType.MENU.getCode().equals(item.getType());
+ }).collect(Collectors.toList());
+
+ //用户所拥有按钮资源集合
+ List allButtonResourceIdList = sysResourcesList.stream().filter(item -> {
+ return EnumSysResourceType.BUTTON.getCode().equals(item.getType());
+ }).collect(Collectors.toList());
+
+
+ SysResource srWhere = new SysResource();
+ srWhere.setStatus(EnumStatus.NEW.getCode());
+ List resourceAllListDB = sysResourceService.getList(srWhere);
+
+
+ //过滤后的结果菜单
+ List menuResourceIdListResult = allMenuResourceIdList.stream()
+ .filter(item -> {
+ return isHasAllChildren(allButtonResourceIdList, resourceAllListDB, EnumSysResourceType.BUTTON.getCode(), item.getId());
+ }).collect(Collectors.toList());
+
+ //过滤后的结果目录
+ List catalogueResourceIdListResult = allCatalogueResourceIdList.stream()
+ .filter(item -> {
+ return isHasAllChildren(menuResourceIdListResult, resourceAllListDB, EnumSysResourceType.MENU.getCode(), item);
+ }).collect(Collectors.toList());
+ List buttonIdList = allButtonResourceIdList.stream().map(SysResource::getId).collect(Collectors.toList());
+ List menuIdList = menuResourceIdListResult.stream().map(SysResource::getId).collect(Collectors.toList());
+ resultList.addAll(catalogueResourceIdListResult);
+ resultList.addAll(menuIdList);
+ resultList.addAll(buttonIdList);
+
+ resultMap.put("checkedTreeList", resultList);
+ resultMap.put("treeList", resourceIdList);
+
+ return resultMap;
+ }
+
+ /**
+ * 菜单是否包含所有子类
+ *
+ * @param resourceIdList
+ * @param type
+ * @param resourceId
+ * @return
+ */
+ private boolean isHasAllChildren(List resourceIdList, List resourceAllListDB, Integer type, Long resourceId) {
+ //得到当前类型的所有对应子节点
+ List idList = resourceIdList
+ .stream()
+ .filter(item -> item.getParentId().equals(resourceId.toString()))
+ .map(SysResource::getId).collect(Collectors.toList());
+ List idListDB = resourceAllListDB
+ .stream()
+ .filter(item -> item.getParentId().equals(resourceId.toString()) && item.getType().equals(type))
+ .map(SysResource::getId).collect(Collectors.toList());
+ if (CollectionUtils.isEmpty(idListDB)) {
+ return true;
+ }
+ return idList.size() == idListDB.size();
+ }
+
+ /**
+ * 参数校验注解默认使用的方法
+ */
+ private void checkStringLength(SysRoleResource sysRoleResource, boolean nullAble) {
+ WJAssert.notNull(sysRoleResource, "入参对象不能为空");
+ WJAssert.limitMaxLength(sysRoleResource.getOperator(), true, 255, "操作人不合法!");
+ WJAssert.limitMaxLength(sysRoleResource.getRemark(), true, 255, "备注不合法!");
+ }
+}
diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/service/system/impl/SysRoleServiceImpl.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/service/system/impl/SysRoleServiceImpl.java
new file mode 100644
index 0000000..b501198
--- /dev/null
+++ b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/service/system/impl/SysRoleServiceImpl.java
@@ -0,0 +1,146 @@
+package com.arm.equipment.system.data.service.system.impl;
+
+import com.arm.equipment.system.data.domain.system.SysRole;
+import com.arm.equipment.system.data.domain.system.SysUserRole;
+import com.arm.equipment.system.data.enums.dict.EnumStatus;
+import com.arm.equipment.system.data.mapper.system.ISysRoleMapper;
+import com.arm.equipment.system.data.service.common.IIdWorkerService;
+import com.arm.equipment.system.data.service.system.ISysRoleService;
+import com.arm.equipment.system.data.service.system.ISysUserRoleService;
+import com.arm.equipment.system.data.util.WJAssert;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * 系统--角色表
+ *
+ * @author admin
+ * @date 2021年10月19日 15:06:47
+ */
+@Service
+public class SysRoleServiceImpl implements ISysRoleService {
+ @Autowired
+ private ISysRoleMapper sysRoleMapper;
+ @Autowired
+ private IIdWorkerService idWorkerService;
+ @Autowired
+ private ISysUserRoleService sysUserRoleService;
+
+ @Override
+ public void save(SysRole req, String operator) {
+ req.setOperator(operator);
+ if (null == req.getId()) {
+ insertSelective(req);
+ } else {
+ updateSelectiveById(req);
+ }
+ }
+
+ @Override
+ public int insertSelective(SysRole req) {
+ req.setId(idWorkerService.getNextId());
+ req.setStatus(EnumStatus.NEW.getCode());
+ checkStringLength(req, false);
+ return sysRoleMapper.insertSelective(req);
+ }
+
+ @Override
+ public int updateSelectiveById(SysRole sysRole) {
+ WJAssert.notNull(sysRole, "入参对象不能为空");
+ WJAssert.notNull(sysRole.getId(), "id参数错误");
+ SysRole where = new SysRole();
+ where.setId(sysRole.getId());
+ return sysRoleMapper.updateSelective(sysRole, where);
+ }
+
+ @Override
+ public int getCount(SysRole sysRole) {
+ checkStringLength(sysRole, true);
+ return sysRoleMapper.getCount(sysRole);
+ }
+
+ @Override
+ public SysRole getOneById(Long id) {
+ WJAssert.notNull(id, "id参数错误");
+ SysRole where = new SysRole();
+ where.setId(id);
+ where.setStatus(EnumStatus.NEW.getCode());
+ return sysRoleMapper.getOne(where);
+ }
+
+ @Override
+ public List getList(SysRole sysRole) {
+ checkStringLength(sysRole, true);
+ return sysRoleMapper.getList(sysRole);
+ }
+
+ @Override
+ public List getPageList(SysRole sysRole) {
+ checkStringLength(sysRole, true);
+ return sysRoleMapper.getPageList(sysRole);
+ }
+
+ @Override
+ public void audit(Long id, String operator) {
+ SysRole req = new SysRole();
+ req.setId(id);
+ req.setOperator(operator);
+ req.setStatus(EnumStatus.AUDIT.getCode());
+ updateSelectiveById(req);
+ }
+
+ @Override
+ public void unaudit(Long id, String operator) {
+ SysRole req = new SysRole();
+ req.setId(id);
+ req.setOperator(operator);
+ req.setStatus(EnumStatus.NEW.getCode());
+ updateSelectiveById(req);
+ }
+
+ @Override
+ public void delete(Long id, String operator) {
+ SysRole req = new SysRole();
+ req.setId(id);
+ req.setOperator(operator);
+ req.setStatus(EnumStatus.DEL.getCode());
+ updateSelectiveById(req);
+ }
+
+ /**
+ * 获取当前登陆用户拥有绝角色
+ *
+ * @param userId
+ * @return
+ */
+ @Override
+ public List getCurrentUserRole(Long userId) {
+ SysUserRole sysUserRole = new SysUserRole();
+ sysUserRole.setStatus(EnumStatus.NEW.getCode());
+ sysUserRole.setSysUserId(userId);
+ List sysUserRoleList = sysUserRoleService.getList(sysUserRole);
+ if (CollectionUtils.isEmpty(sysUserRoleList)) {
+ return null;
+ }
+ List sysRoleIdList = sysUserRoleList.stream().map(SysUserRole::getSysRoleId).collect(Collectors.toList());
+ SysRole sysRole = new SysRole();
+ sysRole.setSysRoleIdList(sysRoleIdList);
+ List sysRoleList = sysRoleMapper.getList(sysRole);
+ return sysRoleList;
+ }
+
+ /**
+ * 参数校验注解默认使用的方法
+ */
+ private void checkStringLength(SysRole sysRole, boolean nullAble) {
+ WJAssert.notNull(sysRole, "入参对象不能为空");
+ WJAssert.limitMaxLength(sysRole.getName(), nullAble, 100, "角色名称不合法!");
+ WJAssert.limitMaxLength(sysRole.getDescription(), nullAble, 200, "描述不合法!");
+ WJAssert.limitMaxLength(sysRole.getOperator(), true, 255, "操作人不合法!");
+ WJAssert.limitMaxLength(sysRole.getRemark(), true, 255, "备注不合法!");
+ }
+}
diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/service/system/impl/SysUserRoleServiceImpl.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/service/system/impl/SysUserRoleServiceImpl.java
new file mode 100644
index 0000000..2eca55b
--- /dev/null
+++ b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/service/system/impl/SysUserRoleServiceImpl.java
@@ -0,0 +1,123 @@
+package com.arm.equipment.system.data.service.system.impl;
+
+import com.arm.equipment.system.data.domain.system.SysUser;
+import com.arm.equipment.system.data.domain.system.SysUserRole;
+import com.arm.equipment.system.data.enums.dict.EnumStatus;
+import com.arm.equipment.system.data.exception.BusinessException;
+import com.arm.equipment.system.data.mapper.system.ISysUserRoleMapper;
+import com.arm.equipment.system.data.service.common.IIdWorkerService;
+import com.arm.equipment.system.data.service.system.ISysUserRoleService;
+import com.arm.equipment.system.data.util.WJAssert;
+import com.arm.equipment.system.data.vo.system.AddRoleVO;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.List;
+
+/**
+ * 系统--用户角色关联表
+ *
+ * @author admin
+ * @date 2021年10月19日 15:06:59
+ */
+@Service
+public class SysUserRoleServiceImpl implements ISysUserRoleService {
+ @Autowired
+ private ISysUserRoleMapper sysUserRoleMapper;
+ @Autowired
+ private IIdWorkerService idWorkerService;
+
+ @Override
+ public void save(SysUserRole req, String operator) {
+ req.setOperator(operator);
+ if (null == req.getId()) {
+ insertSelective(req);
+ } else {
+ updateSelectiveById(req);
+ }
+ }
+
+ @Override
+ public int insertSelective(SysUserRole req) {
+ req.setId(idWorkerService.getNextId());
+ req.setStatus(EnumStatus.NEW.getCode());
+ checkStringLength(req, false);
+ return sysUserRoleMapper.insertSelective(req);
+ }
+
+ @Override
+ public int updateSelectiveById(SysUserRole sysUserRole) {
+ WJAssert.notNull(sysUserRole, "入参对象不能为空");
+ WJAssert.notNull(sysUserRole.getId(), "id参数错误");
+ SysUserRole where = new SysUserRole();
+ where.setId(sysUserRole.getId());
+ return sysUserRoleMapper.updateSelective(sysUserRole, where);
+ }
+
+ @Override
+ public int getCount(SysUserRole sysUserRole) {
+ checkStringLength(sysUserRole, true);
+ return sysUserRoleMapper.getCount(sysUserRole);
+ }
+
+ @Override
+ public SysUserRole getOneById(Long id) {
+ WJAssert.notNull(id, "id参数错误");
+ SysUserRole where = new SysUserRole();
+ where.setId(id);
+ return sysUserRoleMapper.getOne(where);
+ }
+
+ @Override
+ public List getList(SysUserRole sysUserRole) {
+ checkStringLength(sysUserRole, true);
+ return sysUserRoleMapper.getList(sysUserRole);
+ }
+
+ @Override
+ public List getPageList(SysUserRole sysUserRole) {
+ checkStringLength(sysUserRole, true);
+ return sysUserRoleMapper.getPageList(sysUserRole);
+ }
+
+ @Override
+ public void delete(Long id, String operator) {
+ SysUserRole req = new SysUserRole();
+ req.setId(id);
+ req.setOperator(operator);
+ updateSelectiveById(req);
+ }
+
+ /**
+ * 为用户分配角色
+ *
+ * @param addRoleVO
+ * @param currentUser
+ */
+ @Override
+ @Transactional(rollbackFor = Exception.class)
+ public void addRole(AddRoleVO addRoleVO, SysUser currentUser) {
+ List newRoleList = addRoleVO.getNewRole();
+ if (null == addRoleVO.getUserId()) {
+ throw new BusinessException("新增角色ID或用户ID不能为空");
+ }
+ sysUserRoleMapper.deleteByUserId(addRoleVO.getUserId());
+ newRoleList.stream().forEach(item -> {
+ SysUserRole req = new SysUserRole();
+ req.setSysRoleId(item);
+ req.setOperator(currentUser.getName());
+ req.setSysUserId(addRoleVO.getUserId());
+ insertSelective(req);
+ });
+ }
+
+ /**
+ * 参数校验注解默认使用的方法
+ */
+ private void checkStringLength(SysUserRole sysUserRole, boolean nullAble) {
+ WJAssert.notNull(sysUserRole, "入参对象不能为空");
+ WJAssert.limitMaxLength(sysUserRole.getOperator(), nullAble, 50, "执行者不合法!");
+ WJAssert.limitMaxLength(sysUserRole.getRemark(), true, 255, "备注不合法!");
+ }
+}
diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/service/system/impl/SysUserServiceImpl.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/service/system/impl/SysUserServiceImpl.java
new file mode 100644
index 0000000..26f4c03
--- /dev/null
+++ b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/service/system/impl/SysUserServiceImpl.java
@@ -0,0 +1,254 @@
+package com.arm.equipment.system.data.service.system.impl;
+
+import com.arm.equipment.system.data.constant.RedisKeys;
+import com.arm.equipment.system.data.domain.system.SysUser;
+import com.arm.equipment.system.data.enums.dict.EnumStatus;
+import com.arm.equipment.system.data.exception.BusinessException;
+import com.arm.equipment.system.data.mapper.system.ISysUserMapper;
+import com.arm.equipment.system.data.service.common.IIdWorkerService;
+import com.arm.equipment.system.data.service.system.ISysUserService;
+import com.arm.equipment.system.data.util.WJAssert;
+import com.arm.equipment.system.data.util.passwordEncoder.BCryptPasswordEncoderUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.data.redis.core.ValueOperations;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import javax.servlet.http.HttpSession;
+import java.util.*;
+import java.util.concurrent.TimeUnit;
+import java.util.stream.Collectors;
+
+/**
+ * 系统--用户表
+ *
+ * @author admin
+ * @date 2021年10月19日 15:07:06
+ */
+@Service
+public class SysUserServiceImpl implements ISysUserService {
+ @Autowired
+ private ISysUserMapper sysUserMapper;
+ @Autowired
+ private IIdWorkerService idWorkerService;
+ @Autowired
+ private BCryptPasswordEncoderUtils bCryptPasswordEncoder;
+ @Autowired
+ private RedisTemplate redisTemplate;
+
+
+ @Override
+ @Transactional(rollbackFor = Exception.class)
+ public void save(SysUser req, String operator) {
+ req.setOperator(operator);
+ String password = req.getPassword();
+ if (StringUtils.isNotBlank(password)) {
+ req.setPassword(bCryptPasswordEncoder.encode(password));
+ }
+ // 检查用户名
+ if (isUsernameExist(req)) {
+ throw new BusinessException("用户名已存在");
+ }
+ // 检查用户名
+ if (isEmailExist(req)) {
+ throw new BusinessException("邮箱已存在");
+ }
+ // 检查邮箱
+ if (null == req.getId()) {
+ insertSelective(req);
+ } else {
+ updateSelectiveById(req);
+ }
+ }
+
+ @Override
+ public int insertSelective(SysUser req) {
+ req.setId(idWorkerService.getNextId());
+ req.setStatus(EnumStatus.NEW.getCode());
+ checkStringLength(req, false);
+ return sysUserMapper.insertSelective(req);
+ }
+
+ @Override
+ public int updateSelectiveById(SysUser sysUser) {
+ WJAssert.notNull(sysUser, "入参对象不能为空");
+ WJAssert.notNull(sysUser.getId(), "id参数错误");
+ SysUser where = new SysUser();
+ where.setId(sysUser.getId());
+ return sysUserMapper.updateSelective(sysUser, where);
+ }
+
+ @Override
+ public int getCount(SysUser sysUser) {
+ checkStringLength(sysUser, true);
+ return sysUserMapper.getCount(sysUser);
+ }
+
+ @Override
+ public SysUser getOneById(Long id) {
+ WJAssert.notNull(id, "id参数错误");
+ SysUser where = new SysUser();
+ where.setId(id);
+ return sysUserMapper.getOne(where);
+ }
+
+ @Override
+ public List getList(SysUser sysUser) {
+ checkStringLength(sysUser, true);
+ return sysUserMapper.getList(sysUser);
+ }
+
+ @Override
+ public List getPageList(SysUser sysUser) {
+ checkStringLength(sysUser, true);
+ return sysUserMapper.getPageList(sysUser)
+ .parallelStream()
+ .peek(item -> {
+ if (StringUtils.isNotBlank(item.getTag())) {
+ item.setTagList(Arrays.asList(item.getTag().split(",")));
+ }
+ }).collect(Collectors.toList());
+ }
+
+
+ @Override
+ public SysUser getExitOneById(Long id) {
+ WJAssert.notNull(id, "id参数错误");
+ SysUser where = new SysUser();
+ where.setStatus(EnumStatus.NEW.getCode());
+ where.setId(id);
+ return sysUserMapper.getOne(where);
+ }
+
+ @Override
+ public void delete(Long id, String operator) {
+ SysUser req = new SysUser();
+ req.setId(id);
+ req.setOperator(operator);
+ req.setStatus(EnumStatus.DEL.getCode());
+ updateSelectiveById(req);
+ }
+
+ @Override
+ public SysUser login(SysUser sysUserReq, HttpSession webSession) {
+ WJAssert.limitMaxLength(sysUserReq.getUsername(), false, 100, "用户名不合法!");
+ WJAssert.limitMaxLength(sysUserReq.getPassword(), false, 100, "密码不合法!");
+ Object code = webSession.getAttribute("verifyCode_" + sysUserReq.getVerifyCode().toUpperCase());
+ //验证码判断
+ if (code == null) {
+ throw new BusinessException("验证码错误");
+ }
+ checkLoginErrorNum(sysUserReq.getUsername());
+
+ SysUser sysUser = new SysUser();
+ sysUser.setUsername(sysUserReq.getUsername());
+ SysUser sysUserDB = sysUserMapper.getOne(sysUser);
+ if (Objects.isNull(sysUserDB) || !bCryptPasswordEncoder.matches(sysUserReq.getPassword(), sysUserDB.getPassword())) {
+ checkLoginErrorNumByUsername(sysUserReq.getUsername());
+ throw new BusinessException("账户不存在或密码错误");
+ }
+ if (Objects.equals(sysUserDB.getStatus(), EnumStatus.DEL.getCode())) {
+ throw new BusinessException("账户已删除");
+ }
+ return sysUserDB;
+ }
+
+ @Override
+ public SysUser thirdLogin(String username, String password) {
+ checkLoginErrorNum(username);
+
+ SysUser sysUser = new SysUser();
+ sysUser.setUsername(username);
+ SysUser sysUserDB = sysUserMapper.getOne(sysUser);
+ if (Objects.isNull(sysUserDB) || !bCryptPasswordEncoder.matches(password, sysUserDB.getPassword())) {
+ checkLoginErrorNumByUsername(username);
+ throw new BusinessException("用户名或密码错误");
+ }
+ if (Objects.equals(sysUserDB.getStatus(), EnumStatus.DEL.getCode())) {
+ throw new BusinessException("账户已删除");
+ }
+ return sysUserDB;
+ }
+
+ /**
+ * 检查错误次数
+ *
+ * @param username
+ */
+ private void checkLoginErrorNum(String username) {
+ ValueOperations valueOperations = redisTemplate.opsForValue();
+ String key = String.format(RedisKeys.SYS_USER_LOGIN_ERROR_NUM, username);
+ Object errorNumObj = valueOperations.get(key);
+ if (errorNumObj != null && Integer.parseInt(errorNumObj.toString()) > 4) {
+ throw new BusinessException("错误次数过多,请过半小时后再试!");
+ }
+ }
+
+ @Override
+ public void updatePassword(String oldPassword, String newPassword, Long sysUserId) {
+ SysUser sysUser = new SysUser();
+ sysUser.setId(sysUserId);
+ SysUser sysUserDB = sysUserMapper.getOne(sysUser);
+ if (Objects.isNull(sysUserDB) || !bCryptPasswordEncoder.matches(oldPassword, sysUserDB.getPassword())) {
+ throw new BusinessException("旧密码输入有误!");
+ }
+ sysUserDB.setPassword(bCryptPasswordEncoder.encode(newPassword));
+ updateSelectiveById(sysUserDB);
+ }
+
+ /**
+ * 验证用户登陆错误次数
+ *
+ * @param username
+ */
+ @Override
+ public void checkLoginErrorNumByUsername(String username) {
+ String key = String.format(RedisKeys.SYS_USER_LOGIN_ERROR_NUM, username);
+ ValueOperations valueOperations = redisTemplate.opsForValue();
+ Object errorNumObj = valueOperations.get(key);
+ int errorNum = 1;
+ if (errorNumObj != null) {
+ errorNum += Integer.parseInt(errorNumObj.toString());
+ }
+ valueOperations.set(key, String.valueOf(errorNum), 30, TimeUnit.MINUTES);
+ if (errorNum > 4) {
+ throw new BusinessException("错误次数过多,请过半小时后再试!");
+ }
+ }
+
+ private boolean isEmailExist(SysUser sysUserReq) {
+ return getOneByEmail(sysUserReq.getEmail()).map(item -> !item.getId().equals(sysUserReq.getId())).orElse(false);
+ }
+
+ private Boolean isUsernameExist(SysUser sysUserReq) {
+ return getOneByUsername(sysUserReq.getUsername()).map(item -> !item.getId().equals(sysUserReq.getId())).orElse(false);
+ }
+
+ private Optional getOneByUsername(String username) {
+ SysUser req = new SysUser();
+ req.setUsername(username);
+ return Optional.ofNullable(sysUserMapper.getOne(req));
+ }
+
+ private Optional getOneByEmail(String email) {
+ SysUser req = new SysUser();
+ req.setEmail(email);
+ return Optional.ofNullable(sysUserMapper.getOne(req));
+ }
+
+ /**
+ * 参数校验注解默认使用的方法
+ */
+ private void checkStringLength(SysUser sysUser, boolean nullAble) {
+ WJAssert.notNull(sysUser, "入参对象不能为空");
+ WJAssert.limitMaxLength(sysUser.getUsername(), nullAble, 100, "用户名不合法!");
+ WJAssert.limitMaxLength(sysUser.getPassword(), nullAble, 100, "密码不合法!");
+ WJAssert.limitMaxLength(sysUser.getPhone(), true, 20, "手机不合法!");
+ WJAssert.limitMaxLength(sysUser.getName(), true, 50, "姓名不合法!");
+ WJAssert.limitMaxLength(sysUser.getEmail(), true, 100, "邮箱不合法!");
+ WJAssert.limitMaxLength(sysUser.getOperator(), nullAble, 50, "操作人不合法!");
+ WJAssert.limitMaxLength(sysUser.getRemark(), true, 255, "备注不合法!");
+ }
+}
diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/service/user/IAppUserService.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/service/user/IAppUserService.java
new file mode 100644
index 0000000..e777073
--- /dev/null
+++ b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/service/user/IAppUserService.java
@@ -0,0 +1,101 @@
+package com.arm.equipment.system.data.service.user;
+
+import com.arm.equipment.system.data.domain.user.AppUser;
+
+import java.util.List;
+
+/**
+ * APP用户
+ *
+ * @author admin
+ * @date 2023年03月13日 22:34:47
+ */
+public interface IAppUserService {
+ /**
+ * 保存或更新
+ * @param req
+ */
+ void save(AppUser req, String operator);
+
+ /**
+ * 插入
+ *
+ * @param appUser appUser
+ * @return int
+ */
+ int insertSelective(AppUser appUser);
+
+ /**
+ * 主键更新
+ *
+ * @param appUser appUser
+ * @return int
+ */
+ int updateSelectiveById(AppUser appUser);
+
+ /**
+ * 数量
+ *
+ * @param appUser appUser
+ * @return int
+ */
+ int getCount(AppUser appUser);
+
+ /**
+ * 主键查询
+ *
+ * @param id id
+ * @return AppUser
+ */
+ AppUser getOneById(Long id);
+
+ /**
+ * 多条
+ *
+ * @param appUser appUser
+ * @return List
+ */
+ List getList(AppUser appUser);
+
+ /**
+ * 分页
+ *
+ * @param appUser appUser
+ * @return List
+ */
+ List getPageList(AppUser appUser);
+
+ /**
+ * 审核
+ * @param id
+ * @param operator
+ */
+ void audit(Long id, String operator);
+
+ /**
+ * 取消审核
+ * @param id
+ * @param operator
+ */
+ void unaudit(Long id, String operator);
+
+ /**
+ * 删除
+ * @param id
+ * @param operator
+ */
+ void delete(Long id, String operator);
+
+ /**
+ * 登录
+ * @param req
+ * @return
+ */
+ AppUser login(AppUser req);
+
+ /**
+ * 注册
+ * @param req
+ */
+ void saveUser(AppUser req);
+}
diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/service/user/impl/AppUserServiceImpl.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/service/user/impl/AppUserServiceImpl.java
new file mode 100644
index 0000000..2ef4f1d
--- /dev/null
+++ b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/service/user/impl/AppUserServiceImpl.java
@@ -0,0 +1,172 @@
+package com.arm.equipment.system.data.service.user.impl;
+
+import com.arm.equipment.system.data.exception.BusinessException;
+import com.arm.equipment.system.data.util.WJAssert;
+import com.arm.equipment.system.data.enums.dict.EnumStatus;
+import com.arm.equipment.system.data.service.common.IIdWorkerService;
+import com.arm.equipment.system.data.mapper.user.IAppUserMapper;
+import com.arm.equipment.system.data.domain.user.AppUser;
+import com.arm.equipment.system.data.service.user.IAppUserService;
+import com.arm.equipment.system.data.util.passwordEncoder.BCryptPasswordEncoderUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.Date;
+import java.util.List;
+import java.util.Objects;
+
+/**
+ * APP用户
+ *
+ * @author admin
+ * @date 2023年03月13日 22:34:47
+ */
+@Service
+public class AppUserServiceImpl implements IAppUserService {
+ @Autowired
+ private IAppUserMapper appUserMapper;
+ @Autowired
+ private IIdWorkerService idWorkerService;
+ @Autowired
+ private BCryptPasswordEncoderUtils bCryptPasswordEncoder;
+
+ @Override
+ public void save(AppUser req, String operator) {
+ req.setOperator(operator);
+ if (null == req.getId()) {
+ insertSelective(req);
+ } else {
+ updateSelectiveById(req);
+ }
+ }
+
+ @Override
+ public int insertSelective(AppUser req) {
+ req.setId(idWorkerService.getNextId());
+ req.setStatus(EnumStatus.NEW.getCode());
+ checkStringLength(req, false);
+ return appUserMapper.insertSelective(req);
+ }
+
+ @Override
+ public int updateSelectiveById(AppUser appUser) {
+ WJAssert.notNull(appUser, "入参对象不能为空");
+ WJAssert.notNull(appUser.getId(), "id参数错误");
+ AppUser where = new AppUser();
+ where.setId(appUser.getId());
+ return appUserMapper.updateSelective(appUser, where);
+ }
+
+ @Override
+ public int getCount(AppUser appUser) {
+ checkStringLength(appUser, true);
+ return appUserMapper.getCount(appUser);
+ }
+
+
+ private boolean getCountByPhone(String phone) {
+ WJAssert.notBlank(phone, "手机号非法");
+ AppUser appUser = new AppUser();
+ appUser.setPhone(phone);
+ return appUserMapper.getCount(appUser) > 0;
+ }
+
+ private boolean getCountByUsername(String username) {
+ WJAssert.notBlank(username, "用户名非法");
+ AppUser appUser = new AppUser();
+ appUser.setUsername(username);
+ return appUserMapper.getCount(appUser) > 0;
+ }
+
+ @Override
+ public AppUser getOneById(Long id) {
+ WJAssert.notNull(id, "id参数错误");
+ AppUser where = new AppUser();
+ where.setId(id);
+ return appUserMapper.getOne(where);
+ }
+
+ @Override
+ public List getList(AppUser appUser) {
+ checkStringLength(appUser, true);
+ return appUserMapper.getList(appUser);
+ }
+
+ @Override
+ public List getPageList(AppUser appUser) {
+ checkStringLength(appUser, true);
+ return appUserMapper.getPageList(appUser);
+ }
+
+ @Override
+ public void audit(Long id, String operator) {
+ AppUser req = new AppUser();
+ req.setId(id);
+ req.setOperator(operator);
+ req.setStatus(EnumStatus.AUDIT.getCode());
+ updateSelectiveById(req);
+ }
+
+ @Override
+ public void unaudit(Long id, String operator) {
+ AppUser req = new AppUser();
+ req.setId(id);
+ req.setOperator(operator);
+ req.setStatus(EnumStatus.NEW.getCode());
+ updateSelectiveById(req);
+ }
+
+ @Override
+ public void delete(Long id, String operator) {
+ AppUser req = new AppUser();
+ req.setId(id);
+ req.setOperator(operator);
+ req.setStatus(EnumStatus.DEL.getCode());
+ updateSelectiveById(req);
+ }
+
+ @Override
+ public AppUser login(AppUser req) {
+ WJAssert.notBlank(req.getUsername(), "账号非法");
+ WJAssert.notBlank(req.getPassword(), "密码非法吗");
+ AppUser where = new AppUser();
+ where.setUsername(req.getUsername());
+ AppUser appUserDB = appUserMapper.getOne(where);
+ if (Objects.isNull(appUserDB) || !bCryptPasswordEncoder.matches(req.getPassword(), appUserDB.getPassword())) {
+ throw new BusinessException("账户不存在或密码错误");
+ }
+ appUserDB.setPassword(null);
+ appUserDB.setLoginTime(new Date());
+ updateSelectiveById(appUserDB);
+ return appUserDB;
+ }
+
+ @Override
+ public void saveUser(AppUser req) {
+ checkStringLength(req, false);
+ req.setPassword(bCryptPasswordEncoder.encode(req.getPassword()));
+ // 检查用户名
+ if (getCountByPhone(req.getPhone())) {
+ throw new BusinessException("用户名已存在");
+ }
+ // 检查用户名
+ if (getCountByUsername(req.getUsername())) {
+ throw new BusinessException("登录账号已存在");
+ }
+ req.setId(null);
+ req.setLoginTime(new Date());
+ insertSelective(req);
+ }
+
+ /**
+ * 参数校验注解默认使用的方法
+ */
+ private void checkStringLength(AppUser appUser, boolean nullAble) {
+ WJAssert.notNull(appUser, "入参对象不能为空");
+ WJAssert.limitMaxLength(appUser.getNickname(), nullAble, 50, "用户昵称不合法!");
+ WJAssert.limitMaxLength(appUser.getUsername(), nullAble, 20, "登录账号不合法!");
+ WJAssert.limitMaxLength(appUser.getPassword(), nullAble, 100, "密码不合法!");
+ WJAssert.limitMaxLength(appUser.getPhone(), nullAble, 11, "手机号不合法!");
+ WJAssert.limitMaxLength(appUser.getRemark(), true, 255, "备注不合法!");
+ }
+}
diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/service/weaponry/IWeaponryLendRecordService.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/service/weaponry/IWeaponryLendRecordService.java
new file mode 100644
index 0000000..fa4d74f
--- /dev/null
+++ b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/service/weaponry/IWeaponryLendRecordService.java
@@ -0,0 +1,107 @@
+package com.arm.equipment.system.data.service.weaponry;
+
+import com.arm.equipment.system.data.domain.weaponry.WeaponryLendRecord;
+
+import java.util.List;
+
+/**
+ * 装备武器借出记录
+ *
+ * @author admin
+ * @date 2023年03月23日 09:20:19
+ */
+public interface IWeaponryLendRecordService {
+ /**
+ * 保存或更新
+ *
+ * @param req
+ */
+ void save(WeaponryLendRecord req, String operator);
+
+ /**
+ * 插入
+ *
+ * @param weaponryLendRecord weaponryLendRecord
+ * @return int
+ */
+ int insertSelective(WeaponryLendRecord weaponryLendRecord);
+
+ /**
+ * 主键更新
+ *
+ * @param weaponryLendRecord weaponryLendRecord
+ * @return int
+ */
+ int updateSelectiveById(WeaponryLendRecord weaponryLendRecord);
+
+ /**
+ * 数量
+ *
+ * @param weaponryLendRecord weaponryLendRecord
+ * @return int
+ */
+ int getCount(WeaponryLendRecord weaponryLendRecord);
+
+ /**
+ * 主键查询
+ *
+ * @param id id
+ * @return WeaponryLendRecord
+ */
+ WeaponryLendRecord getOneById(Long id);
+
+ /**
+ * 多条
+ *
+ * @param weaponryLendRecord weaponryLendRecord
+ * @return List
+ */
+ List getList(WeaponryLendRecord weaponryLendRecord);
+
+ /**
+ * 分页
+ *
+ * @param weaponryLendRecord weaponryLendRecord
+ * @return List
+ */
+ List getPageList(WeaponryLendRecord weaponryLendRecord);
+
+ /**
+ * 审核拒绝
+ *
+ * @param id
+ * @param operator
+ */
+ void refuse(Long id, String operator);
+
+ /**
+ * 审核通过
+ *
+ * @param id
+ * @param operator
+ */
+ void adopt(Long id, String operator);
+
+ /**
+ * 删除
+ *
+ * @param id
+ * @param operator
+ */
+ void delete(Long id, String operator);
+
+ /**
+ * 借出
+ *
+ * @param req
+ */
+ void saveLend(WeaponryLendRecord req);
+
+ /**
+ * 获取未归还得总数
+ *
+ * @param weaponryId
+ * @return
+ */
+ int getCountByWeaponryId(Long weaponryId);
+}
diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/service/weaponry/IWeaponryReturnRecordService.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/service/weaponry/IWeaponryReturnRecordService.java
new file mode 100644
index 0000000..5094597
--- /dev/null
+++ b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/service/weaponry/IWeaponryReturnRecordService.java
@@ -0,0 +1,99 @@
+package com.arm.equipment.system.data.service.weaponry;
+
+import com.arm.equipment.system.data.domain.weaponry.WeaponryReturnRecord;
+
+import java.util.List;
+
+/**
+ * 装备武器归还记录
+ *
+ * @author admin
+ * @date 2023年03月23日 09:20:25
+ */
+public interface IWeaponryReturnRecordService {
+ /**
+ * 保存或更新
+ *
+ * @param req
+ */
+ void save(WeaponryReturnRecord req, String operator);
+
+ /**
+ * 插入
+ *
+ * @param weaponryReturnRecord weaponryReturnRecord
+ * @return int
+ */
+ int insertSelective(WeaponryReturnRecord weaponryReturnRecord);
+
+ /**
+ * 主键更新
+ *
+ * @param weaponryReturnRecord weaponryReturnRecord
+ * @return int
+ */
+ int updateSelectiveById(WeaponryReturnRecord weaponryReturnRecord);
+
+ /**
+ * 数量
+ *
+ * @param weaponryReturnRecord weaponryReturnRecord
+ * @return int
+ */
+ int getCount(WeaponryReturnRecord weaponryReturnRecord);
+
+ /**
+ * 主键查询
+ *
+ * @param id id
+ * @return WeaponryReturnRecord
+ */
+ WeaponryReturnRecord getOneById(Long id);
+
+ /**
+ * 多条
+ *
+ * @param weaponryReturnRecord weaponryReturnRecord
+ * @return List
+ */
+ List getList(WeaponryReturnRecord weaponryReturnRecord);
+
+ /**
+ * 分页
+ *
+ * @param weaponryReturnRecord weaponryReturnRecord
+ * @return List
+ */
+ List getPageList(WeaponryReturnRecord weaponryReturnRecord);
+
+ /**
+ * 审核
+ *
+ * @param id
+ * @param operator
+ */
+ void audit(Long id, String operator);
+
+ /**
+ * 取消审核
+ *
+ * @param id
+ * @param operator
+ */
+ void unaudit(Long id, String operator);
+
+ /**
+ * 删除
+ *
+ * @param id
+ * @param operator
+ */
+ void delete(Long id, String operator);
+
+ /**
+ * 保存退还记录
+ *
+ * @param lendRecordId
+ */
+ void saveReturn(Long lendRecordId);
+}
diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/service/weaponry/IWeaponryService.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/service/weaponry/IWeaponryService.java
new file mode 100644
index 0000000..fc31ffb
--- /dev/null
+++ b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/service/weaponry/IWeaponryService.java
@@ -0,0 +1,88 @@
+package com.arm.equipment.system.data.service.weaponry;
+
+import com.arm.equipment.system.data.domain.weaponry.Weaponry;
+
+import java.util.List;
+
+/**
+ * 装备武器
+ *
+ * @author admin
+ * @date 2023年03月23日 10:29:48
+ */
+public interface IWeaponryService {
+ /**
+ * 保存或更新
+ * @param req
+ */
+ void save(Weaponry req, String operator);
+
+ /**
+ * 插入
+ *
+ * @param weaponry weaponry
+ * @return int
+ */
+ int insertSelective(Weaponry weaponry);
+
+ /**
+ * 主键更新
+ *
+ * @param weaponry weaponry
+ * @return int
+ */
+ int updateSelectiveById(Weaponry weaponry);
+
+ /**
+ * 数量
+ *
+ * @param weaponry weaponry
+ * @return int
+ */
+ int getCount(Weaponry weaponry);
+
+ /**
+ * 主键查询
+ *
+ * @param id id
+ * @return Weaponry
+ */
+ Weaponry getOneById(Long id);
+
+ /**
+ * 多条
+ *
+ * @param weaponry weaponry
+ * @return List
+ */
+ List getList(Weaponry weaponry);
+
+ /**
+ * 分页
+ *
+ * @param weaponry weaponry
+ * @return List
+ */
+ List getPageList(Weaponry weaponry);
+
+ /**
+ * 审核
+ * @param id
+ * @param operator
+ */
+ void audit(Long id, String operator);
+
+ /**
+ * 取消审核
+ * @param id
+ * @param operator
+ */
+ void unaudit(Long id, String operator);
+
+ /**
+ * 删除
+ * @param id
+ * @param operator
+ */
+ void delete(Long id, String operator);
+}
diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/service/weaponry/impl/WeaponryLendRecordServiceImpl.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/service/weaponry/impl/WeaponryLendRecordServiceImpl.java
new file mode 100644
index 0000000..51bffa0
--- /dev/null
+++ b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/service/weaponry/impl/WeaponryLendRecordServiceImpl.java
@@ -0,0 +1,181 @@
+package com.arm.equipment.system.data.service.weaponry.impl;
+
+import com.arm.equipment.system.data.domain.weaponry.Weaponry;
+import com.arm.equipment.system.data.domain.weaponry.WeaponryLendRecord;
+import com.arm.equipment.system.data.enums.dict.EnumStatus;
+import com.arm.equipment.system.data.enums.dict.EnumWeaponryLendRecordReturnStatus;
+import com.arm.equipment.system.data.enums.dict.EnumWeaponryLendRecordStatus;
+import com.arm.equipment.system.data.exception.BusinessException;
+import com.arm.equipment.system.data.mapper.weaponry.IWeaponryLendRecordMapper;
+import com.arm.equipment.system.data.service.common.IIdWorkerService;
+import com.arm.equipment.system.data.service.weaponry.IWeaponryLendRecordService;
+import com.arm.equipment.system.data.service.weaponry.IWeaponryService;
+import com.arm.equipment.system.data.util.WJAssert;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.List;
+import java.util.Optional;
+import java.util.stream.Collectors;
+
+/**
+ * 装备武器借出记录
+ *
+ * @author admin
+ * @date 2023年03月23日 09:20:19
+ */
+@Service
+public class WeaponryLendRecordServiceImpl implements IWeaponryLendRecordService {
+ @Autowired
+ private IWeaponryLendRecordMapper weaponryLendRecordMapper;
+ @Autowired
+ private IIdWorkerService idWorkerService;
+ @Autowired
+ private IWeaponryService weaponryService;
+
+ @Override
+ public void save(WeaponryLendRecord req, String operator) {
+ req.setOperator(operator);
+ if (null == req.getId()) {
+ insertSelective(req);
+ } else {
+ updateSelectiveById(req);
+ }
+ }
+
+ @Override
+ public int insertSelective(WeaponryLendRecord req) {
+ req.setId(idWorkerService.getNextId());
+ req.setStatus(EnumStatus.NEW.getCode());
+ checkStringLength(req, false);
+ return weaponryLendRecordMapper.insertSelective(req);
+ }
+
+ @Override
+ public int updateSelectiveById(WeaponryLendRecord weaponryLendRecord) {
+ WJAssert.notNull(weaponryLendRecord, "入参对象不能为空");
+ WJAssert.notNull(weaponryLendRecord.getId(), "id参数错误");
+ WeaponryLendRecord where = new WeaponryLendRecord();
+ where.setId(weaponryLendRecord.getId());
+ return weaponryLendRecordMapper.updateSelective(weaponryLendRecord, where);
+ }
+
+ @Override
+ public int getCount(WeaponryLendRecord weaponryLendRecord) {
+ checkStringLength(weaponryLendRecord, true);
+ return weaponryLendRecordMapper.getCount(weaponryLendRecord);
+ }
+
+ @Override
+ public WeaponryLendRecord getOneById(Long id) {
+ WJAssert.notNull(id, "id参数错误");
+ WeaponryLendRecord where = new WeaponryLendRecord();
+ where.setId(id);
+ return weaponryLendRecordMapper.getOne(where);
+ }
+
+ @Override
+ public List getList(WeaponryLendRecord weaponryLendRecord) {
+ checkStringLength(weaponryLendRecord, true);
+ return weaponryLendRecordMapper.getList(weaponryLendRecord);
+ }
+
+ @Override
+ public List getPageList(WeaponryLendRecord weaponryLendRecord) {
+ checkStringLength(weaponryLendRecord, true);
+ return weaponryLendRecordMapper.getPageList(weaponryLendRecord)
+ .parallelStream()
+ .peek(item -> {
+ Weaponry weaponryDB = weaponryService.getOneById(item.getWeaponryId());
+ item.setWeaponry(weaponryDB);
+ }).collect(Collectors.toList());
+ }
+
+ /**
+ * 拒绝
+ *
+ * @param id
+ * @param operator
+ */
+ @Override
+ @Transactional(rollbackFor = Exception.class)
+ public void refuse(Long id, String operator) {
+ WeaponryLendRecord req = new WeaponryLendRecord();
+ req.setId(id);
+ req.setOperator(operator);
+ req.setStatus(EnumWeaponryLendRecordStatus.REFUSE.getCode());
+ updateSelectiveById(req);
+
+ //拒绝通过 归还锁定库存
+ WeaponryLendRecord weaponryLendRecordDB = getOneById(id);
+ Weaponry weaponryDB = weaponryService.getOneById(weaponryLendRecordDB.getWeaponryId());
+ weaponryDB.setLockInventory(weaponryDB.getLockInventory() - weaponryLendRecordDB.getNum());
+ weaponryService.updateSelectiveById(weaponryDB);
+
+ }
+
+ /**
+ * 通过
+ *
+ * @param id
+ * @param operator
+ */
+ @Override
+ public void adopt(Long id, String operator) {
+ WeaponryLendRecord req = new WeaponryLendRecord();
+ req.setId(id);
+ req.setOperator(operator);
+ req.setStatus(EnumWeaponryLendRecordStatus.ADOPT.getCode());
+ updateSelectiveById(req);
+ }
+
+ @Override
+ public void delete(Long id, String operator) {
+ WeaponryLendRecord req = new WeaponryLendRecord();
+ req.setId(id);
+ req.setOperator(operator);
+ req.setStatus(EnumStatus.DEL.getCode());
+ updateSelectiveById(req);
+ }
+
+ @Override
+ @Transactional(rollbackFor = Exception.class)
+ public void saveLend(WeaponryLendRecord req) {
+ WJAssert.notNull(req.getNum(), "数量非法");
+ WJAssert.notNull(req.getReturnTime(), "归还时间非法");
+ WJAssert.notNull(req.getWeaponryId(), "装备非法");
+ if (req.getNum() < 0) {
+ throw new BusinessException("数量非法");
+ }
+ Weaponry weaponryDB = Optional.ofNullable(weaponryService.getOneById(req.getWeaponryId()))
+ .orElseThrow(() -> new BusinessException("装备不存在"));
+ //剩余库存 = 总库存 - 锁定库存
+ if ((weaponryDB.getTotalInventory() - weaponryDB.getLockInventory()) < req.getNum()) {
+ throw new BusinessException("库存不足");
+ }
+ req.setWeaponryName(weaponryDB.getName());
+ insertSelective(req);
+
+ //增加锁定库存
+ weaponryDB.setLockInventory(weaponryDB.getLockInventory() + req.getNum());
+ weaponryService.updateSelectiveById(weaponryDB);
+ }
+
+ @Override
+ public int getCountByWeaponryId(Long weaponryId) {
+ WeaponryLendRecord where = new WeaponryLendRecord();
+ where.setWeaponryId(weaponryId);
+ where.setReturnStatus(EnumWeaponryLendRecordReturnStatus.NOT_RETURN.getCode());
+ where.setStatus(EnumWeaponryLendRecordStatus.ADOPT.getCode());
+ return getCount(where);
+ }
+
+ /**
+ * 参数校验注解默认使用的方法
+ */
+ private void checkStringLength(WeaponryLendRecord weaponryLendRecord, boolean nullAble) {
+ WJAssert.notNull(weaponryLendRecord, "入参对象不能为空");
+ WJAssert.limitMaxLength(weaponryLendRecord.getRemark(), true, 255, "备注不合法!");
+ }
+}
diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/service/weaponry/impl/WeaponryReturnRecordServiceImpl.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/service/weaponry/impl/WeaponryReturnRecordServiceImpl.java
new file mode 100644
index 0000000..e9a90c3
--- /dev/null
+++ b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/service/weaponry/impl/WeaponryReturnRecordServiceImpl.java
@@ -0,0 +1,162 @@
+package com.arm.equipment.system.data.service.weaponry.impl;
+
+import com.arm.equipment.system.data.domain.weaponry.Weaponry;
+import com.arm.equipment.system.data.domain.weaponry.WeaponryLendRecord;
+import com.arm.equipment.system.data.domain.weaponry.WeaponryReturnRecord;
+import com.arm.equipment.system.data.enums.dict.EnumStatus;
+import com.arm.equipment.system.data.enums.dict.EnumWeaponryLendRecordReturnStatus;
+import com.arm.equipment.system.data.enums.dict.EnumWeaponryLendRecordStatus;
+import com.arm.equipment.system.data.exception.BusinessException;
+import com.arm.equipment.system.data.mapper.weaponry.IWeaponryReturnRecordMapper;
+import com.arm.equipment.system.data.service.common.IIdWorkerService;
+import com.arm.equipment.system.data.service.weaponry.IWeaponryLendRecordService;
+import com.arm.equipment.system.data.service.weaponry.IWeaponryReturnRecordService;
+import com.arm.equipment.system.data.service.weaponry.IWeaponryService;
+import com.arm.equipment.system.data.util.WJAssert;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.List;
+import java.util.Optional;
+import java.util.stream.Collectors;
+
+/**
+ * 装备武器归还记录
+ *
+ * @author admin
+ * @date 2023年03月23日 09:20:25
+ */
+@Service
+public class WeaponryReturnRecordServiceImpl implements IWeaponryReturnRecordService {
+ @Autowired
+ private IWeaponryReturnRecordMapper weaponryReturnRecordMapper;
+ @Autowired
+ private IIdWorkerService idWorkerService;
+ @Autowired
+ private IWeaponryLendRecordService weaponryLendRecordService;
+ @Autowired
+ private IWeaponryService weaponryService;
+
+ @Override
+ public void save(WeaponryReturnRecord req, String operator) {
+ req.setOperator(operator);
+ if (null == req.getId()) {
+ insertSelective(req);
+ } else {
+ updateSelectiveById(req);
+ }
+ }
+
+ @Override
+ public int insertSelective(WeaponryReturnRecord req) {
+ req.setId(idWorkerService.getNextId());
+ req.setStatus(EnumStatus.NEW.getCode());
+ checkStringLength(req, false);
+ return weaponryReturnRecordMapper.insertSelective(req);
+ }
+
+ @Override
+ public int updateSelectiveById(WeaponryReturnRecord weaponryReturnRecord) {
+ WJAssert.notNull(weaponryReturnRecord, "入参对象不能为空");
+ WJAssert.notNull(weaponryReturnRecord.getId(), "id参数错误");
+ WeaponryReturnRecord where = new WeaponryReturnRecord();
+ where.setId(weaponryReturnRecord.getId());
+ return weaponryReturnRecordMapper.updateSelective(weaponryReturnRecord, where);
+ }
+
+ @Override
+ public int getCount(WeaponryReturnRecord weaponryReturnRecord) {
+ checkStringLength(weaponryReturnRecord, true);
+ return weaponryReturnRecordMapper.getCount(weaponryReturnRecord);
+ }
+
+ @Override
+ public WeaponryReturnRecord getOneById(Long id) {
+ WJAssert.notNull(id, "id参数错误");
+ WeaponryReturnRecord where = new WeaponryReturnRecord();
+ where.setId(id);
+ return weaponryReturnRecordMapper.getOne(where);
+ }
+
+ @Override
+ public List getList(WeaponryReturnRecord weaponryReturnRecord) {
+ checkStringLength(weaponryReturnRecord, true);
+ return weaponryReturnRecordMapper.getList(weaponryReturnRecord);
+ }
+
+ @Override
+ public List getPageList(WeaponryReturnRecord weaponryReturnRecord) {
+ checkStringLength(weaponryReturnRecord, true);
+ return weaponryReturnRecordMapper.getPageList(weaponryReturnRecord)
+ .parallelStream()
+ .peek(item -> {
+ Weaponry weaponryDB = weaponryService.getOneById(item.getWeaponryId());
+ item.setWeaponry(weaponryDB);
+ }).collect(Collectors.toList());
+ }
+
+ @Override
+ public void audit(Long id, String operator) {
+ WeaponryReturnRecord req = new WeaponryReturnRecord();
+ req.setId(id);
+ req.setOperator(operator);
+ req.setStatus(EnumStatus.AUDIT.getCode());
+ updateSelectiveById(req);
+ }
+
+ @Override
+ public void unaudit(Long id, String operator) {
+ WeaponryReturnRecord req = new WeaponryReturnRecord();
+ req.setId(id);
+ req.setOperator(operator);
+ req.setStatus(EnumStatus.NEW.getCode());
+ updateSelectiveById(req);
+ }
+
+ @Override
+ public void delete(Long id, String operator) {
+ WeaponryReturnRecord req = new WeaponryReturnRecord();
+ req.setId(id);
+ req.setOperator(operator);
+ req.setStatus(EnumStatus.DEL.getCode());
+ updateSelectiveById(req);
+ }
+
+ @Override
+ @Transactional(rollbackFor = Exception.class)
+ public void saveReturn(Long lendRecordId) {
+ WJAssert.notNull(lendRecordId, "ID非法");
+ WeaponryLendRecord weaponryLendRecordDB = Optional.ofNullable(weaponryLendRecordService.getOneById(lendRecordId))
+ .orElseThrow(() -> new BusinessException("借出记录不存在"));
+ if (!EnumWeaponryLendRecordStatus.ADOPT.getCode().equals(weaponryLendRecordDB.getStatus())
+ || !EnumWeaponryLendRecordReturnStatus.NOT_RETURN.getCode().equals(weaponryLendRecordDB.getReturnStatus())) {
+ throw new BusinessException("数据非法");
+ }
+ WeaponryReturnRecord req = new WeaponryReturnRecord();
+ req.setWeaponryId(weaponryLendRecordDB.getWeaponryId());
+ req.setLendRecordId(weaponryLendRecordDB.getId());
+ req.setNum(weaponryLendRecordDB.getNum());
+ req.setReturnTime(weaponryLendRecordDB.getReturnTime());
+ req.setWeaponryName(weaponryLendRecordDB.getWeaponryName());
+ insertSelective(req);
+
+ //修改借出归还状态
+ weaponryLendRecordDB.setReturnStatus(EnumWeaponryLendRecordReturnStatus.RETURN.getCode());
+ weaponryLendRecordService.updateSelectiveById(weaponryLendRecordDB);
+
+ //扣除锁定库存
+ Weaponry weaponryDB = Optional.ofNullable(weaponryService.getOneById(weaponryLendRecordDB.getWeaponryId()))
+ .orElseThrow(() -> new BusinessException("武器不存在"));
+ weaponryDB.setLockInventory(weaponryDB.getLockInventory() - weaponryLendRecordDB.getNum());
+ weaponryService.updateSelectiveById(weaponryDB);
+ }
+
+ /**
+ * 参数校验注解默认使用的方法
+ */
+ private void checkStringLength(WeaponryReturnRecord weaponryReturnRecord, boolean nullAble) {
+ WJAssert.notNull(weaponryReturnRecord, "入参对象不能为空");
+ WJAssert.limitMaxLength(weaponryReturnRecord.getRemark(), true, 255, "备注不合法!");
+ }
+}
diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/service/weaponry/impl/WeaponryServiceImpl.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/service/weaponry/impl/WeaponryServiceImpl.java
new file mode 100644
index 0000000..2ae92ee
--- /dev/null
+++ b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/service/weaponry/impl/WeaponryServiceImpl.java
@@ -0,0 +1,117 @@
+package com.arm.equipment.system.data.service.weaponry.impl;
+
+import com.arm.equipment.system.data.enums.dict.EnumStatus;
+import com.arm.equipment.system.data.util.WJAssert;
+import com.arm.equipment.system.data.service.common.IIdWorkerService;
+import com.arm.equipment.system.data.mapper.weaponry.IWeaponryMapper;
+import com.arm.equipment.system.data.domain.weaponry.Weaponry;
+import com.arm.equipment.system.data.service.weaponry.IWeaponryService;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+
+/**
+ * 装备武器
+ *
+ * @author admin
+ * @date 2023年03月23日 10:29:48
+ */
+@Service
+public class WeaponryServiceImpl implements IWeaponryService {
+ @Autowired
+ private IWeaponryMapper weaponryMapper;
+ @Autowired
+ private IIdWorkerService idWorkerService;
+
+ @Override
+ public void save(Weaponry req, String operator) {
+ req.setOperator(operator);
+ if (null == req.getId()) {
+ insertSelective(req);
+ } else {
+ updateSelectiveById(req);
+ }
+ }
+
+ @Override
+ public int insertSelective(Weaponry req) {
+ req.setId(idWorkerService.getNextId());
+ req.setStatus(EnumStatus.NEW.getCode());
+ checkStringLength(req, false);
+ return weaponryMapper.insertSelective(req);
+ }
+
+ @Override
+ public int updateSelectiveById(Weaponry weaponry) {
+ WJAssert.notNull(weaponry, "入参对象不能为空");
+ WJAssert.notNull(weaponry.getId(), "id参数错误");
+ Weaponry where = new Weaponry();
+ where.setId(weaponry.getId());
+ return weaponryMapper.updateSelective(weaponry, where);
+ }
+
+ @Override
+ public int getCount(Weaponry weaponry) {
+ checkStringLength(weaponry, true);
+ return weaponryMapper.getCount(weaponry);
+ }
+
+ @Override
+ public Weaponry getOneById(Long id) {
+ WJAssert.notNull(id, "id参数错误");
+ Weaponry where = new Weaponry();
+ where.setId(id);
+ return weaponryMapper.getOne(where);
+ }
+
+ @Override
+ public List getList(Weaponry weaponry) {
+ checkStringLength(weaponry, true);
+ return weaponryMapper.getList(weaponry);
+ }
+
+ @Override
+ public List getPageList(Weaponry weaponry) {
+ checkStringLength(weaponry, true);
+ return weaponryMapper.getPageList(weaponry);
+ }
+
+ @Override
+ public void audit(Long id, String operator) {
+ Weaponry req = new Weaponry();
+ req.setId(id);
+ req.setOperator(operator);
+ req.setStatus(EnumStatus.AUDIT.getCode());
+ updateSelectiveById(req);
+ }
+
+ @Override
+ public void unaudit(Long id, String operator) {
+ Weaponry req = new Weaponry();
+ req.setId(id);
+ req.setOperator(operator);
+ req.setStatus(EnumStatus.NEW.getCode());
+ updateSelectiveById(req);
+ }
+
+ @Override
+ public void delete(Long id, String operator) {
+ Weaponry req = new Weaponry();
+ req.setId(id);
+ req.setOperator(operator);
+ req.setStatus(EnumStatus.DEL.getCode());
+ updateSelectiveById(req);
+ }
+
+ /**
+ * 参数校验注解默认使用的方法
+ */
+ private void checkStringLength(Weaponry weaponry, boolean nullAble) {
+ WJAssert.notNull(weaponry, "入参对象不能为空");
+ WJAssert.limitMaxLength(weaponry.getName(), nullAble, 50, "武器名称不合法!");
+ WJAssert.limitMaxLength(weaponry.getImgPath(), nullAble, 200, "武器封面不合法!");
+ WJAssert.limitMaxLength(weaponry.getRemark(), true, 255, "备注不合法!");
+ }
+}
diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/util/AesUtil.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/util/AesUtil.java
new file mode 100644
index 0000000..d67e9e7
--- /dev/null
+++ b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/util/AesUtil.java
@@ -0,0 +1,80 @@
+package com.arm.equipment.system.data.util;
+
+import org.bouncycastle.util.encoders.Hex;
+import sun.misc.BASE64Decoder;
+
+import javax.crypto.Cipher;
+import javax.crypto.spec.SecretKeySpec;
+
+/**
+ * Aes 加密/解密工具类
+ */
+public class AesUtil {
+
+ private static final String ALGORITHM = "AES";
+ private static final String TRANSFORMATION = "AES/ECB/PKCS5Padding";
+
+
+ public String encrypt(String input, String key) {
+ byte[] decodeKey = Hex.decode(key);
+ byte[] crypted = null;
+ try {
+ SecretKeySpec skey = new SecretKeySpec(decodeKey, ALGORITHM);
+ Cipher cipher = Cipher.getInstance(TRANSFORMATION);
+ cipher.init(Cipher.ENCRYPT_MODE, skey);
+ crypted = cipher.doFinal(input.getBytes());
+ } catch (Exception e) {
+ System.out.println(e.toString());
+ }
+ return parseByte2HexStr(crypted);
+
+ }
+
+ /**
+ * 解密
+ *
+ * @param content 原文
+ * @param key 安全key
+ * @param platform 平台 @see EnumPlatform
+ * @return
+ * @throws Exception
+ */
+ public static String decrypt(String content, String key, Integer platform) throws Exception {
+ content = new String(new BASE64Decoder().decodeBuffer(content));
+ Cipher cipher = Cipher.getInstance(TRANSFORMATION);
+ byte[] keyBytes = key.getBytes();
+ SecretKeySpec sk = new SecretKeySpec(keyBytes, "AES");
+ //7.初始化密码器,第一个参数为加密(Encrypt_mode)或者解密(Decrypt_mode)操作,第二个参数为使用的KEY
+ cipher.init(Cipher.DECRYPT_MODE, sk);
+ byte[] bytes = parseHexStr2Byte(content);
+ byte[] decode = cipher.doFinal(bytes);
+ return new String(decode, "utf-8");
+ }
+
+ private static byte[] parseHexStr2Byte(String hexStr) {
+ if (hexStr.length() < 1) {
+ return null;
+ }
+ byte[] result = new byte[hexStr.length() / 2];
+ for (int i = 0; i < hexStr.length() / 2; i++) {
+ int high = Integer.parseInt(hexStr.substring(i * 2, i * 2 + 1), 16);
+ int low = Integer.parseInt(hexStr.substring(i * 2 + 1, i * 2 + 2), 16);
+ result[i] = (byte) (high * 16 + low);
+ }
+ return result;
+
+ }
+
+ private static String parseByte2HexStr(byte buf[]) {
+ StringBuffer sb = new StringBuffer();
+ for (int i = 0; i < buf.length; i++) {
+ String hex = Integer.toHexString(buf[i] & 0xFF);
+ if (hex.length() == 1) {
+ hex = '0' + hex;
+ }
+ sb.append(hex.toUpperCase());
+ }
+ return sb.toString();
+
+ }
+}
diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/util/BeanUtil.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/util/BeanUtil.java
new file mode 100644
index 0000000..97d2dd4
--- /dev/null
+++ b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/util/BeanUtil.java
@@ -0,0 +1,33 @@
+package com.arm.equipment.system.data.util;
+
+import org.springframework.beans.BeanWrapper;
+import org.springframework.beans.BeanWrapperImpl;
+
+import java.util.HashSet;
+import java.util.Set;
+
+/**
+ * @author admin
+ */
+public class BeanUtil {
+
+ /**
+ * 获得对象里是null的属性
+ * @param source
+ * @return
+ */
+ public static String[] getNullPropertyNames (Object source) {
+ final BeanWrapper src = new BeanWrapperImpl(source);
+ java.beans.PropertyDescriptor[] pds = src.getPropertyDescriptors();
+
+ Set emptyNames = new HashSet();
+ for(java.beans.PropertyDescriptor pd : pds) {
+ Object srcValue = src.getPropertyValue(pd.getName());
+ if (srcValue == null){
+ emptyNames.add(pd.getName());
+ }
+ }
+ String[] result = new String[emptyNames.size()];
+ return emptyNames.toArray(result);
+ }
+}
diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/util/DATAUtil.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/util/DATAUtil.java
new file mode 100644
index 0000000..556579d
--- /dev/null
+++ b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/util/DATAUtil.java
@@ -0,0 +1,67 @@
+package com.arm.equipment.system.data.util;
+
+import org.springframework.dao.DataAccessException;
+import org.springframework.jdbc.core.JdbcTemplate;
+
+import java.util.UUID;
+
+/**
+ * 基础数据单元
+ *
+ * Update by xy on 2017/4/27.
+ */
+public class DATAUtil {
+
+ /**
+ * 获得查询分页总页数
+ *
+ * @param sql
+ * @param jdbcTemplate
+ * @param pageSize
+ * @return
+ */
+ public static final int getPageCount(String sql, JdbcTemplate jdbcTemplate, int pageSize, Object... objects) {
+ try {
+ Integer totalCount = jdbcTemplate.queryForObject(sql, objects, Integer.class);
+ int pageCount = (totalCount - 1) / pageSize;
+ return pageCount + 1;
+ } catch (DataAccessException e) {
+ return 0;
+ }
+ }
+
+ /**
+ * 获取页总数
+ * @param totalCount
+ * @param pageSize
+ * @return
+ */
+ public static int getPageCount(int totalCount, int pageSize) {
+ int pageCount = (totalCount - 1) / pageSize;
+ return pageCount + 1;
+ }
+
+ /**
+ * 获取UUID
+ *
+ * @return
+ */
+ public static String uuid() {
+ return UUID.randomUUID().toString().replace("-", "");
+ }
+
+ /**
+ * 生成六位随机数
+ *
+ * @return
+ */
+ public static String getCode() {
+ String code = Math.round(Math.random() * 1000000) + "";
+ if (code.length() < 6) {
+ code = ((1+ Math.round(Math.random())) * 100000) +"";
+ //生成一个以1开头的6位数
+ }
+ code = code.substring(0,6);//防止第一次生成code时,round方法对六个9四舍五入导致可能超过6位的情况
+ return code;
+ }
+}
diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/util/DateUtils.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/util/DateUtils.java
new file mode 100644
index 0000000..571f585
--- /dev/null
+++ b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/util/DateUtils.java
@@ -0,0 +1,343 @@
+package com.arm.equipment.system.data.util;
+
+import org.apache.commons.lang.time.DateFormatUtils;
+
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 日期工具类, 继承org.apache.commons.lang.time.DateUtils类
+ */
+public class DateUtils extends org.apache.commons.lang.time.DateUtils {
+ /**
+ * 中文月份数组
+ */
+ public static final String[] NUM_ARRAY = {"一月", "二月", "三月", "四月", "五月", "六月", "七月", "八月", "九月", "十月", "十一月", "十二月"};
+
+ private static String[] parsePatterns = {
+ "yyyy-MM-dd", "yyyy-MM-dd HH:mm:ss", "yyyy-MM-dd HH:mm", "yyyy-MM",
+ "yyyy/MM/dd", "yyyy/MM/dd HH:mm:ss", "yyyy/MM/dd HH:mm", "yyyy/MM",
+ "yyyy.MM.dd", "yyyy.MM.dd HH:mm:ss", "yyyy.MM.dd HH:mm", "yyyy.MM",
+ "yyyy-MM-dd HH"};
+
+ /**
+ * 得到当前日期字符串 格式(yyyy-MM-dd)
+ */
+ public static String getDate() {
+ return getDate("yyyy-MM-dd");
+ }
+
+ /**
+ * 得到当前日期字符串 格式(yyyy-MM-dd) pattern可以为:"yyyy-MM-dd" "HH:mm:ss" "E"
+ */
+ public static String getDate(String pattern) {
+ return DateFormatUtils.format(new Date(), pattern);
+ }
+
+ /**
+ * 得到日期字符串 默认格式(yyyy-MM-dd) pattern可以为:"yyyy-MM-dd" "HH:mm:ss" "E"
+ */
+ public static String formatDate(Date date, Object... pattern) {
+ String formatDate = null;
+ if (pattern != null && pattern.length > 0) {
+ formatDate = DateFormatUtils.format(date, pattern[0].toString());
+ } else {
+ formatDate = DateFormatUtils.format(date, "yyyy-MM-dd");
+ }
+ return formatDate;
+ }
+
+ /**
+ * 得到日期时间字符串,转换格式(yyyy-MM-dd HH:mm:ss)
+ */
+ public static String formatDateTime(Date date) {
+ return formatDate(date, "yyyy-MM-dd HH:mm:ss");
+ }
+
+ /**
+ * 得到当前时间字符串 格式(HH:mm:ss)
+ */
+ public static String getTime() {
+ return formatDate(new Date(), "HH:mm:ss");
+ }
+
+ /**
+ * 得到当前日期和时间字符串 格式(yyyy-MM-dd HH:mm:ss)
+ */
+ public static String getDateTime() {
+ return formatDate(new Date(), "yyyy-MM-dd HH:mm:ss");
+ }
+
+ /**
+ * 得到当前年份字符串 格式(yyyy)
+ */
+ public static String getYear() {
+ return formatDate(new Date(), "yyyy");
+ }
+
+ /**
+ * 得到当前月份字符串 格式(MM)
+ */
+ public static String getMonth() {
+ return formatDate(new Date(), "MM");
+ }
+
+ /**
+ * 得到当天字符串 格式(dd)
+ */
+ public static String getDay() {
+ return formatDate(new Date(), "dd");
+ }
+
+ /**
+ * 得到当前星期字符串 格式(E)星期几
+ */
+ public static String getWeek() {
+ return formatDate(new Date(), "E");
+ }
+
+ /**
+ * 日期型字符串转化为日期 格式
+ * { "yyyy-MM-dd", "yyyy-MM-dd HH:mm:ss", "yyyy-MM-dd HH:mm",
+ * "yyyy/MM/dd", "yyyy/MM/dd HH:mm:ss", "yyyy/MM/dd HH:mm",
+ * "yyyy.MM.dd", "yyyy.MM.dd HH:mm:ss", "yyyy.MM.dd HH:mm" }
+ */
+ public static Date parseDate(Object str) {
+ if (str == null) {
+ return null;
+ }
+ try {
+ return parseDate(str.toString(), parsePatterns);
+ } catch (ParseException e) {
+ return null;
+ }
+ }
+
+ /**
+ * 获取过去的天数
+ *
+ * @param date
+ * @return
+ */
+ public static long pastDays(Date date) {
+ long t = new Date().getTime() - date.getTime();
+ return t / (24 * 60 * 60 * 1000);
+ }
+
+ /**
+ * 获取过去的小时
+ *
+ * @param date
+ * @return
+ */
+ public static long pastHour(Date date) {
+ long t = new Date().getTime() - date.getTime();
+ return t / (60 * 60 * 1000);
+ }
+
+ /**
+ * 获取过去的分钟
+ *
+ * @param date
+ * @return
+ */
+ public static long pastMinutes(Date date) {
+ long t = new Date().getTime() - date.getTime();
+ return t / (60 * 1000);
+ }
+
+ /**
+ * 转换为时间(天,时:分:秒.毫秒)
+ *
+ * @param timeMillis
+ * @return
+ */
+ public static String formatDateTime(long timeMillis) {
+ long day = timeMillis / (24 * 60 * 60 * 1000);
+ long hour = (timeMillis / (60 * 60 * 1000) - day * 24);
+ long min = ((timeMillis / (60 * 1000)) - day * 24 * 60 - hour * 60);
+ long s = (timeMillis / 1000 - day * 24 * 60 * 60 - hour * 60 * 60 - min * 60);
+ long sss = (timeMillis - day * 24 * 60 * 60 * 1000 - hour * 60 * 60 * 1000 - min * 60 * 1000 - s * 1000);
+ return (day > 0 ? day + "," : "") + hour + ":" + min + ":" + s + "." + sss;
+ }
+
+ /**
+ * 获取两个日期之间的天数
+ *
+ * @param before
+ * @param after
+ * @return
+ */
+ public static double getDistanceOfTwoDate(Date before, Date after) {
+ long beforeTime = before.getTime();
+ long afterTime = after.getTime();
+ return (afterTime - beforeTime) / (1000 * 60 * 60 * 24);
+ }
+
+ /**
+ * 获取在当前时间往后增加指定天数的Date
+ *
+ * @param appendDay
+ * @return
+ */
+ public static Date addAppendDay(int appendDay) {
+ SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
+ Date dt = new Date();
+ Calendar rightNow = Calendar.getInstance();
+ rightNow.setTime(dt);
+ rightNow.add(Calendar.DAY_OF_YEAR, appendDay);
+ return rightNow.getTime();
+ }
+
+ /**
+ * 获取日期的零点时间
+ *
+ * @param date
+ * @return
+ */
+ public static Date getStartTimeOfDate(Date date) {
+ Calendar cal = Calendar.getInstance();
+ cal.setTime(date);
+ cal.set(Calendar.HOUR_OF_DAY, 0);
+ cal.set(Calendar.MINUTE, 0);
+ cal.set(Calendar.SECOND, 0);
+ cal.set(Calendar.MILLISECOND, 0);
+ return cal.getTime();
+ }
+
+ /**
+ * 获取日期的23:59:59:999
+ *
+ * @param date
+ * @return
+ */
+ public static Date getEndTimeOfDate(Date date) {
+ Calendar cal = Calendar.getInstance();
+ cal.setTime(date);
+ cal.set(Calendar.HOUR_OF_DAY, 23);
+ cal.set(Calendar.MINUTE, 59);
+ cal.set(Calendar.SECOND, 59);
+ cal.set(Calendar.MILLISECOND, 999);
+ return cal.getTime();
+ }
+
+ /**
+ * 获取昨天日期时间
+ *
+ * @return
+ */
+ public static Date getYesterdayDateTime() {
+ Calendar cal = Calendar.getInstance();
+ cal.add(5, -1);
+ return cal.getTime();
+ }
+
+ /**
+ * 根据开始时间和结束时间返回时间段内的时间集合
+ *
+ * @param beginDate
+ * @param endDate
+ * @return List
+ */
+ public static List getDatesBetweenTwoDate(Date beginDate, Date endDate) {
+ if (beginDate.getTime() >= endDate.getTime()) {
+ throw new RuntimeException("endDate must after beginDate ...");
+ }
+ List lDate = new ArrayList();
+ lDate.add(beginDate);// 把开始时间加入集合
+ Calendar cal = Calendar.getInstance();
+ // 使用给定的 Date 设置此 Calendar 的时间
+ cal.setTime(beginDate);
+ boolean bContinue = true;
+ while (bContinue) {
+ // 根据日历的规则,为给定的日历字段添加或减去指定的时间量
+ cal.add(Calendar.DAY_OF_MONTH, 1);
+ // 测试此日期是否在指定日期之后
+ if (endDate.after(cal.getTime())) {
+ lDate.add(cal.getTime());
+ } else {
+ break;
+ }
+ }
+ lDate.add(endDate);// 把结束时间加入集合
+ return lDate;
+ }
+
+ /**
+ * 取得昨天0点整时间
+ *
+ * @return
+ */
+ public static Date getYesterDayZEROTIME() {
+ return getSpecifiedDay(-1, 0, 0, 0);
+ }
+
+
+ /**
+ * 获得指定
+ *
+ * @param day 整数,指定一月中的某天,正数为未来某天时间,负数为过去某天时间
+ * @param hour 正整数,一天当中的指定小时数
+ * @param minute 正整数,指定分钟数
+ * @param second 正整数,指定秒数
+ * @return
+ */
+ public static Date getSpecifiedDay(int day, int hour, int minute, int second) {
+ Calendar calendar = Calendar.getInstance();
+ calendar.set(Calendar.DATE, calendar.get(Calendar.DATE) + day);
+ calendar.set(Calendar.HOUR_OF_DAY, hour);
+ calendar.set(Calendar.MINUTE, minute);
+ calendar.set(Calendar.SECOND, second);
+ calendar.set(Calendar.MILLISECOND, 0);
+ return calendar.getTime();
+ }
+
+ /**
+ * 取得今天0点整时间
+ *
+ * @return
+ */
+ public static Date getZEROTIME() {
+ Calendar calendar = Calendar.getInstance();
+ calendar.set(Calendar.HOUR_OF_DAY, 0);
+ calendar.set(Calendar.MINUTE, 0);
+ calendar.set(Calendar.SECOND, 0);
+ calendar.set(Calendar.MILLISECOND, 0);
+ return calendar.getTime();
+ }
+
+ /**
+ * /**
+ * 获取当前时间前n个小时德开始与结束后时间
+ *
+ * @param type 0 开始 1结束
+ * @param n n个小时
+ * @return
+ */
+ public static Date getDateBeforeOneHour(Date date, int type, int n) {
+ Calendar calendar = Calendar.getInstance();
+ calendar.setTime(date);
+ calendar.set(Calendar.HOUR_OF_DAY, calendar.get(Calendar.HOUR_OF_DAY) - n);
+ String dateStr = formatDate(calendar.getTime(), "yyyy-MM-dd HH");
+ if (type == 1) {
+ return parseDate(dateStr + ":59:59");
+ }
+ return parseDate(dateStr + ":00:00");
+ }
+
+ /**
+ * 获取指定时间的当前小时
+ *
+ * @param date
+ * @return
+ */
+ public static int getHourByDate(Date date) {
+ Calendar calendar = Calendar.getInstance();
+ calendar.setTime(date);
+ return calendar.get(Calendar.HOUR_OF_DAY);
+ }
+}
diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/util/EasyExcelListener.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/util/EasyExcelListener.java
new file mode 100644
index 0000000..85acd99
--- /dev/null
+++ b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/util/EasyExcelListener.java
@@ -0,0 +1,32 @@
+package com.arm.equipment.system.data.util;
+
+import com.alibaba.excel.context.AnalysisContext;
+import com.alibaba.excel.event.AnalysisEventListener;
+import com.alibaba.excel.metadata.BaseRowModel;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class EasyExcelListener extends AnalysisEventListener {
+
+ private final static Logger logger = LoggerFactory.getLogger(EasyExcelListener.class);
+
+ private final List rows = new ArrayList<>();
+
+ @Override
+ public void invoke(T object, AnalysisContext context) {
+ rows.add(object);
+ }
+
+ @Override
+ public void doAfterAllAnalysed(AnalysisContext context) {
+ logger.info("read {} rows %n", rows.size());
+ }
+
+ public List getRows() {
+ logger.info("read {} rows %n", rows);
+ return rows;
+ }
+}
diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/util/EnvUtil.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/util/EnvUtil.java
new file mode 100644
index 0000000..3b90625
--- /dev/null
+++ b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/util/EnvUtil.java
@@ -0,0 +1,60 @@
+package com.arm.equipment.system.data.util;
+
+import org.springframework.context.EnvironmentAware;
+import org.springframework.core.env.Environment;
+import org.springframework.stereotype.Component;
+
+/**
+ * 判断当前系统运行环境
+ */
+@Component
+public class EnvUtil implements EnvironmentAware {
+ /** 系统环境 */
+ private static Environment environment;
+
+ /**
+ * 判断是否开发环境
+ * @return
+ */
+ public static boolean isDev() {
+ return isEnv("dev");
+ }
+
+ /**
+ * 判断是否测试环境
+ * @return
+ */
+ public static boolean isTest() {
+ return isEnv("test");
+ }
+
+ /**
+ * 判断是否生产环境
+ * @return
+ */
+ public static boolean isProd() {
+ return isEnv("prod");
+ }
+
+ /**
+ * 判断是否激活某个profile
+ * @param env
+ * @return
+ */
+ private static boolean isEnv(String env) {
+ return environment.getProperty("env").equalsIgnoreCase(env);
+ }
+
+ public static String getEnv() {
+ return environment.getProperty("env");
+ }
+
+ @Override
+ public void setEnvironment(Environment environment) {
+ EnvUtil.environment = environment;
+ }
+
+ public static boolean isESEnable() {
+ return true;
+ }
+}
diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/util/FileUtils.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/util/FileUtils.java
new file mode 100644
index 0000000..234126a
--- /dev/null
+++ b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/util/FileUtils.java
@@ -0,0 +1,115 @@
+package com.arm.equipment.system.data.util;
+
+import com.arm.equipment.system.data.exception.BusinessException;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.util.CollectionUtils;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URL;
+import java.net.URLConnection;
+import java.nio.ByteBuffer;
+import java.nio.channels.Channels;
+import java.nio.channels.ReadableByteChannel;
+import java.nio.channels.WritableByteChannel;
+import java.util.Map;
+
+/**
+ * 文件工具类
+ * @author admin
+ */
+public class FileUtils {
+
+ /**
+ * 获得文件的扩展名
+ * @param fileName
+ * @return
+ */
+ public static String getSuffix(String fileName) {
+ if (StringUtils.isEmpty(fileName)) {
+ return "";
+ }
+ return fileName.substring(fileName.lastIndexOf("."));
+ }
+
+ /**
+ * 获得路径中包含后缀的文件名
+ * @param path 文件路径
+ * @return
+ */
+ public static String getFileName(String path) {
+ return path.substring(path.lastIndexOf("/"));
+ }
+
+ public static String getFileNameWithoutSuffix(String path) {
+ if (StringUtils.isEmpty(path)) {
+ throw new BusinessException("文件路径非法");
+ }
+ // 有些人上传文件没有后缀
+ if (!path.contains(".")) {
+ return path;
+ }
+ return path.substring(0, path.lastIndexOf("."));
+ }
+
+ /**
+ * 获得远程路径文件的字节码
+ * @param url
+ * @return
+ * @throws IOException
+ */
+ public static byte[] getUrlBytes(String url) throws IOException {
+ WJAssert.hasLength(url, "URL不合法");
+ WJAssert.isTrue(url.contains("http"), "URL没有协议");
+ URL requestUrl = new URL(url);
+ InputStream inputStream = requestUrl.openStream();
+ ReadableByteChannel src = Channels.newChannel(inputStream);
+ ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
+ WritableByteChannel dest = Channels.newChannel(byteArrayOutputStream);
+ ByteBuffer buffer = ByteBuffer.allocate(10240);
+ while (src.read(buffer) != -1) {
+ buffer.flip();
+ while (buffer.hasRemaining()) {
+ dest.write(buffer);
+ }
+ buffer.clear();
+ }
+ inputStream.close();
+ src.close();
+ dest.close();
+ byteArrayOutputStream.close();
+ return byteArrayOutputStream.toByteArray();
+ }
+
+ /**
+ * 获得远程路径的字节码
+ * @param url
+ * @param header
+ * @return
+ * @throws IOException
+ */
+ public static byte[] getUrlBytes(String url, Map header) throws IOException {
+ URLConnection requestUrl = new URL(url).openConnection();
+ if(!CollectionUtils.isEmpty(header)) {
+ header.forEach((k, v) -> requestUrl.setRequestProperty(k, v));
+ }
+ InputStream inputStream = requestUrl.getInputStream();
+ ReadableByteChannel src = Channels.newChannel(inputStream);
+ ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
+ WritableByteChannel dest = Channels.newChannel(byteArrayOutputStream);
+ ByteBuffer buffer = ByteBuffer.allocate(10240);
+ while (src.read(buffer) != -1) {
+ buffer.flip();
+ while (buffer.hasRemaining()) {
+ dest.write(buffer);
+ }
+ buffer.clear();
+ }
+ inputStream.close();
+ src.close();
+ dest.close();
+ byteArrayOutputStream.close();
+ return byteArrayOutputStream.toByteArray();
+ }
+}
diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/util/IPUtil.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/util/IPUtil.java
new file mode 100644
index 0000000..3fbdc8b
--- /dev/null
+++ b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/util/IPUtil.java
@@ -0,0 +1,121 @@
+package com.arm.equipment.system.data.util;
+
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.http.HttpHeaders;
+import org.springframework.util.CollectionUtils;
+
+import javax.servlet.http.HttpServletRequest;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * ip工具类
+ */
+public class IPUtil {
+
+ private static final String IP_UTILS_FLAG = ",";
+
+ /**
+ * 获得用户远程地址
+ */
+ public static String getRemoteAddress(HttpHeaders headers) {
+ List remoteAddrList = headers.get("X-Real-IP");
+ if (CollectionUtils.isEmpty(remoteAddrList)) {
+ remoteAddrList = headers.get("X-Forwarded-For");
+ } else if (CollectionUtils.isEmpty(remoteAddrList)) {
+ remoteAddrList = headers.get("Proxy-Client-IP");
+ } else if (CollectionUtils.isEmpty(remoteAddrList)) {
+ remoteAddrList = headers.get("WL-Proxy-Client-IP");
+ }
+ if (CollectionUtils.isEmpty(remoteAddrList)) {
+ return "";
+ }
+ String remoteAddr = remoteAddrList.get(0);
+ //使用代理,则获取第一个IP地址
+ if (StringUtils.isNotBlank(remoteAddr) && remoteAddr.indexOf(IP_UTILS_FLAG) > 0) {
+ remoteAddr = remoteAddr.substring(0, remoteAddr.indexOf(IP_UTILS_FLAG));
+ }
+ return remoteAddr;
+ }
+
+ public static String getRemoteAddress(Map map) {
+ String remoteAddr = map.get("X-Real-IP");
+ if (StringUtils.isEmpty(remoteAddr)) {
+ remoteAddr = map.get("X-Forwarded-For");
+ } else if (StringUtils.isEmpty(remoteAddr)) {
+ remoteAddr = map.get("Proxy-Client-IP");
+ } else if (StringUtils.isEmpty(remoteAddr)) {
+ remoteAddr = map.get("WL-Proxy-Client-IP");
+ }
+ if (StringUtils.isEmpty(remoteAddr)) {
+ return "";
+ }
+ //使用代理,则获取第一个IP地址
+ if (StringUtils.isNotBlank(remoteAddr) && remoteAddr.indexOf(IP_UTILS_FLAG) > 0) {
+ remoteAddr = remoteAddr.substring(0, remoteAddr.indexOf(IP_UTILS_FLAG));
+ }
+ return remoteAddr;
+ }
+
+ public static String getRemoteAddress(HttpServletRequest request) {
+ String ip = request.getHeader("x-forwarded-for");
+ if (ip != null && ip.length() != 0 && !"unknown".equalsIgnoreCase(ip)) {
+ // 多次反向代理后会有多个ip值,第一个ip才是真实ip
+ if (ip.indexOf(IP_UTILS_FLAG) != -1) {
+ ip = ip.split(",")[0];
+ }
+ }
+ if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
+ ip = request.getHeader("Proxy-Client-IP");
+ }
+ if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
+ ip = request.getHeader("x-forwarded-for");
+ }
+ if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
+ ip = request.getHeader("remoteip");
+ }
+ if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
+ ip = request.getHeader("WL-Proxy-Client-IP");
+ }
+ if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
+ ip = request.getHeader("HTTP_CLIENT_IP");
+ }
+ if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
+ ip = request.getHeader("HTTP_X_FORWARDED_FOR");
+ }
+ if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
+ ip = request.getHeader("X-Real-IP");
+ }
+ if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
+ ip = request.getRemoteHost();
+ }
+
+ return ip.replaceAll(":", ".");
+ }
+
+
+ /**
+ * aj captcha使用的
+ *
+ * @param request
+ * @return
+ */
+ public static final String getRemoteId(HttpServletRequest request) {
+ String xfwd = IPUtil.getRemoteAddress(request);
+ String ip = getRemoteIpFromXfwd(xfwd);
+ String ua = request.getHeader("user-agent");
+ if (StringUtils.isNotBlank(ip)) {
+ return ip + ua;
+ }
+ return request.getRemoteAddr() + ua;
+ }
+
+ private static String getRemoteIpFromXfwd(String xfwd) {
+ if (StringUtils.isNotBlank(xfwd)) {
+ String[] ipList = xfwd.split(",");
+ return StringUtils.trim(ipList[0]);
+ }
+ return null;
+ }
+
+}
diff --git a/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/util/LocalDateUtils.java b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/util/LocalDateUtils.java
new file mode 100644
index 0000000..eddd23c
--- /dev/null
+++ b/src/arm-equipment-system-parent/arm-equipment-system-parent/data/src/main/java/com/arm/equipment/system/data/util/LocalDateUtils.java
@@ -0,0 +1,267 @@
+package com.arm.equipment.system.data.util;
+
+import java.time.*;
+import java.time.format.DateTimeFormatter;
+import java.time.temporal.ChronoUnit;
+import java.util.Date;
+import java.util.List;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+/**
+ * 基于java8 的日期工具类
+ * Created by liuyu on 2017/8/18.
+ */
+public class LocalDateUtils {
+
+ /**
+ * 收集起始日期到结束日期之间所有的日期并以集合方式返回
+ *
+ * @param start LocalDate 开始日期
+ * @param end LocalDate 结束日期
+ * @return 返回 String类型 日期 集合
+ */
+ public static List collectLocalDatesStrByTwoDate(LocalDate start, LocalDate end) {
+ // 用起始时间作为流的源头,按照每次加一天的方式创建一个无限流
+ return Stream.iterate(start, localDate -> localDate.plusDays(1))
+ // 截断无限流,长度为起始时间和结束时间的差+1个
+ .limit(ChronoUnit.DAYS.between(start, end) + 1)
+ // 由于最后要的是字符串,所以map转换一下
+ .map(LocalDate::toString)
+ // 把流收集为List
+ .collect(Collectors.toList());
+ }
+
+
+ /**
+ * 收集起始日期到结束日期之间所有的日期并以集合方式返回
+ *
+ * @param start String 开始日期
+ * @param end String 结束日期
+ * @return 返回 String类型 日期 集合
+ */
+ public static List collectLocalDatesStrByTwoDateStr(String start, String end) {
+ return collectLocalDatesStrByTwoDate(LocalDate.parse(start), LocalDate.parse(end));
+ }
+
+ /**
+ * 收集起始日期到结束日期之间所有的日期并以集合方式返回
+ *
+ * @param start LocalDate 开始日期
+ * @param end LocalDate 结束日期
+ * @return 返回 LocalDate类型 日期 集合
+ */
+ public static List collectLocalDatesByTwoDate(LocalDate start, LocalDate end) {
+ return Stream.iterate(start, localDate -> localDate.plusDays(1))
+ .limit(ChronoUnit.DAYS.between(start, end) + 1)
+ .collect(Collectors.toList());
+ }
+
+ /**
+ * 收集起始日期到结束日期之间所有的日期并以集合方式返回
+ *
+ * @param start String 开始日期
+ * @param end String 结束日期
+ * @return 返回 LocalDate类型 日期 集合
+ */
+ public static List collectLocalDatesByTwoDateStr(String start, String end) {
+ return collectLocalDatesByTwoDate(LocalDate.parse(start), LocalDate.parse(end));
+ }
+
+ /**
+ * 按周收集起始日期到结束日期之间所有的日期并以集合方式返回
+ *
+ * @param start LocalDate 开始日期
+ * @param end LocalDate 结束日期
+ * @return 返回 LocalDate类型 日期 集合
+ */
+ public static List