Browse Source

操作日志

wucl 2 years ago
parent
commit
83df5423ac
22 changed files with 685 additions and 0 deletions
  1. 4 0
      biz-base/src/main/java/com/dayou/controller/BusinessOpportunityController.java
  2. 7 0
      biz-base/src/main/java/com/dayou/controller/CustomerController.java
  3. 4 0
      biz-base/src/main/java/com/dayou/controller/DepartmentController.java
  4. 4 0
      biz-base/src/main/java/com/dayou/controller/ItemController.java
  5. 4 0
      biz-base/src/main/java/com/dayou/controller/ItemStageController.java
  6. 4 0
      biz-base/src/main/java/com/dayou/controller/ItemUserLogController.java
  7. 4 0
      biz-base/src/main/java/com/dayou/controller/MarketLogController.java
  8. 4 0
      biz-base/src/main/java/com/dayou/controller/NoteController.java
  9. 83 0
      biz-base/src/main/java/com/dayou/controller/OperationLogController.java
  10. 4 0
      biz-base/src/main/java/com/dayou/controller/PaymentCollectionController.java
  11. 4 0
      biz-base/src/main/java/com/dayou/controller/PostController.java
  12. 3 0
      biz-base/src/main/java/com/dayou/controller/PostPrivilegeController.java
  13. 7 0
      biz-base/src/main/java/com/dayou/controller/UserController.java
  14. 4 0
      biz-base/src/main/java/com/dayou/controller/UserPostController.java
  15. 4 0
      biz-base/src/main/java/com/dayou/controller/VisitController.java
  16. 196 0
      common/src/main/java/com/dayou/utils/IpUtils.java
  17. 16 0
      dao/src/main/java/com/dayou/mapper/OperationLogMapper.java
  18. 30 0
      dao/src/main/resources/mapper/OperationLogMapper.xml
  19. 75 0
      domain/src/main/java/com/dayou/entity/OperationLog.java
  20. 130 0
      service/src/main/java/com/dayou/aspect/OperationLogAop.java
  21. 28 0
      service/src/main/java/com/dayou/service/IOperationLogService.java
  22. 66 0
      service/src/main/java/com/dayou/service/impl/OperationLogServiceImpl.java

+ 4 - 0
biz-base/src/main/java/com/dayou/controller/BusinessOpportunityController.java

@@ -1,5 +1,6 @@
 package com.dayou.controller;
 
+import com.dayou.annotation.OperLog;
 import com.dayou.vo.BusinessOpportunityVO;
 import org.apache.poi.xssf.usermodel.XSSFWorkbook;
 import lombok.extern.slf4j.Slf4j;
@@ -55,6 +56,7 @@ public class BusinessOpportunityController extends BaseController {
     /**
      * 商机新增
      */
+    @OperLog(title = "新增商机")
     @PostMapping("")
     public RestResponse<Boolean> save(@RequestBody BusinessOpportunity businessOpportunity) {
         Boolean ret = businessOpportunityService.add(businessOpportunity);
@@ -64,6 +66,7 @@ public class BusinessOpportunityController extends BaseController {
     /**
      * 商机更新
      */
+    @OperLog(title = "更新商机")
     @PutMapping("")
     public RestResponse<Boolean> update(@RequestBody BusinessOpportunity businessOpportunity) {
         Boolean ret = businessOpportunityService.update(businessOpportunity);
@@ -73,6 +76,7 @@ public class BusinessOpportunityController extends BaseController {
     /**
      * 商机删除
      */
+    @OperLog(title = "删除商机")
     @DeleteMapping("/{id}")
     public RestResponse<Boolean> delete(@PathVariable Long id) {
         Boolean ret = businessOpportunityService.delete(id);

+ 7 - 0
biz-base/src/main/java/com/dayou/controller/CustomerController.java

@@ -1,6 +1,8 @@
 package com.dayou.controller;
 
+import com.dayou.annotation.OperLog;
 import com.dayou.dto.CustomerDTO;
+import com.dayou.enums.OperationTypeEnum;
 import org.apache.poi.xssf.usermodel.XSSFWorkbook;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -56,6 +58,7 @@ public class CustomerController extends BaseController {
     /**
      * 客户表新增
      */
+    @OperLog(title = "新增客户")
     @PostMapping("")
     public RestResponse<Boolean> save(@RequestBody CustomerDTO customer) {
         Boolean ret = customerService.add(customer);
@@ -65,6 +68,7 @@ public class CustomerController extends BaseController {
     /**
      * 客户表更新
      */
+    @OperLog(title = "更新客户")
     @PutMapping("")
     public RestResponse<Boolean> update(@RequestBody CustomerDTO customer) {
         Boolean ret = customerService.update(customer);
@@ -74,6 +78,7 @@ public class CustomerController extends BaseController {
     /**
      * 客户表删除
      */
+    @OperLog(title = "删除客户")
     @DeleteMapping("/{id}")
     public RestResponse<Boolean> delete(@PathVariable Long id) {
         Boolean ret = customerService.delete(id);
@@ -97,6 +102,7 @@ public class CustomerController extends BaseController {
     /**
      * 客户信息模板下载
      */
+    @OperLog(title = "客户信息模板下载",businessType = OperationTypeEnum.EXPORT)
     @GetMapping(value = "/download/importTemplate")
     public void importTemplate() {
         try {
@@ -114,6 +120,7 @@ public class CustomerController extends BaseController {
     /**
      * 客户信息导入
      */
+    @OperLog(title = "客户信息导入",businessType = OperationTypeEnum.IMPORT)
     @PostMapping("/importExcel")
     public RestResponse<Boolean> importExcel(@RequestPart("file") MultipartFile file) {
         customerService.importExcel(file);

+ 4 - 0
biz-base/src/main/java/com/dayou/controller/DepartmentController.java

@@ -1,6 +1,7 @@
 package com.dayou.controller;
 
 import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.dayou.annotation.OperLog;
 import com.dayou.vo.DepartmentStatVO;
 import com.dayou.vo.DepartmentVO;
 import org.apache.poi.xssf.usermodel.XSSFWorkbook;
@@ -54,6 +55,7 @@ public class DepartmentController extends BaseController {
     /**
      * 机构新增
      */
+    @OperLog(title = "新增部门")
     @PostMapping("")
     public RestResponse<Boolean> save(@RequestBody Department department) {
         Boolean ret = departmentService.add(department);
@@ -63,6 +65,7 @@ public class DepartmentController extends BaseController {
     /**
      * 机构更新
      */
+    @OperLog(title = "更新部门")
     @PutMapping("")
     public RestResponse<Boolean> update(@RequestBody Department department) {
         Boolean ret = departmentService.update(department);
@@ -72,6 +75,7 @@ public class DepartmentController extends BaseController {
     /**
      * 机构删除
      */
+    @OperLog(title = "删除部门")
     @DeleteMapping("/{id}")
     public RestResponse<Boolean> delete(@PathVariable Long id) {
         Boolean ret = departmentService.delete(id);

+ 4 - 0
biz-base/src/main/java/com/dayou/controller/ItemController.java

@@ -1,5 +1,6 @@
 package com.dayou.controller;
 
+import com.dayou.annotation.OperLog;
 import com.dayou.dto.ItemDTO;
 import com.dayou.vo.DepartmentStatVO;
 import com.dayou.vo.ItemStatVO;
@@ -59,6 +60,7 @@ public class ItemController extends BaseController {
     /**
      * 项目信息表新增
      */
+    @OperLog(title = "新增项目")
     @PostMapping("")
     public RestResponse<Boolean> save(@RequestBody ItemDTO itemDTO) {
         Boolean ret = itemService.add(itemDTO);
@@ -68,6 +70,7 @@ public class ItemController extends BaseController {
     /**
      * 项目信息表更新
      */
+    @OperLog(title = "更新项目")
     @PutMapping("")
     public RestResponse<Boolean> update(@RequestBody ItemDTO itemDTO) {
         Boolean ret = itemService.update(itemDTO);
@@ -77,6 +80,7 @@ public class ItemController extends BaseController {
     /**
      * 项目信息表删除
      */
+    @OperLog(title = "删除项目")
     @DeleteMapping("/{id}")
     public RestResponse<Boolean> delete(@PathVariable Long id) {
         Boolean ret = itemService.delete(id);

+ 4 - 0
biz-base/src/main/java/com/dayou/controller/ItemStageController.java

@@ -1,5 +1,6 @@
 package com.dayou.controller;
 
+import com.dayou.annotation.OperLog;
 import com.dayou.vo.ItemStageVO;
 import org.apache.poi.xssf.usermodel.XSSFWorkbook;
 import lombok.extern.slf4j.Slf4j;
@@ -59,6 +60,7 @@ public class ItemStageController extends BaseController {
     /**
      * 项目阶段表新增
      */
+    @OperLog(title = "新增项目阶段")
     @PostMapping("")
     public RestResponse<Boolean> save(@RequestBody @Valid  ItemStage itemStage) {
         Boolean ret = itemStageService.add(itemStage);
@@ -68,6 +70,7 @@ public class ItemStageController extends BaseController {
     /**
      * 项目阶段表更新
      */
+    @OperLog(title = "更新项目阶段列表")
     @PutMapping("")
     public RestResponse<Boolean> update(@RequestBody ItemStage itemStage) {
         Boolean ret = itemStageService.update(itemStage);
@@ -77,6 +80,7 @@ public class ItemStageController extends BaseController {
     /**
      * 项目阶段表删除
      */
+    @OperLog(title = "删除项目阶段列表")
     @DeleteMapping("/{id}")
     public RestResponse<Boolean> delete(@PathVariable Long id) {
         Boolean ret = itemStageService.delete(id);

+ 4 - 0
biz-base/src/main/java/com/dayou/controller/ItemUserLogController.java

@@ -1,5 +1,6 @@
 package com.dayou.controller;
 
+import com.dayou.annotation.OperLog;
 import com.dayou.vo.ItemLogCollectVO;
 import com.dayou.vo.ItemUserLogVO;
 import com.dayou.vo.LogEcharsVO;
@@ -60,6 +61,7 @@ public class ItemUserLogController extends BaseController {
     /**
      * 项目用户日志新增
      */
+    @OperLog(title = "新增项目用户日志")
     @PostMapping("")
     public RestResponse<Boolean> save(@RequestBody ItemUserLog itemUserLog) {
         Boolean ret = itemUserLogService.add(itemUserLog);
@@ -69,6 +71,7 @@ public class ItemUserLogController extends BaseController {
     /**
      * 项目用户日志更新
      */
+    @OperLog(title = "更新项目用户日志")
     @PutMapping("")
     public RestResponse<Boolean> update(@RequestBody ItemUserLog itemUserLog) {
         Boolean ret = itemUserLogService.update(itemUserLog);
@@ -78,6 +81,7 @@ public class ItemUserLogController extends BaseController {
     /**
      * 项目用户日志删除
      */
+    @OperLog(title = "删除项目用户日志")
     @DeleteMapping("/{id}")
     public RestResponse<Boolean> delete(@PathVariable Long id) {
         Boolean ret = itemUserLogService.delete(id);

+ 4 - 0
biz-base/src/main/java/com/dayou/controller/MarketLogController.java

@@ -1,5 +1,6 @@
 package com.dayou.controller;
 
+import com.dayou.annotation.OperLog;
 import com.dayou.vo.ItemLogCollectVO;
 import org.apache.poi.xssf.usermodel.XSSFWorkbook;
 import lombok.extern.slf4j.Slf4j;
@@ -57,6 +58,7 @@ public class MarketLogController extends BaseController {
     /**
      * 市场人员日志新增
      */
+    @OperLog(title = "新增市场人员日志")
     @PostMapping("")
     public RestResponse<Boolean> save(@RequestBody MarketLog marketLog) {
         Boolean ret = marketLogService.add(marketLog);
@@ -66,6 +68,7 @@ public class MarketLogController extends BaseController {
     /**
      * 市场人员日志更新
      */
+    @OperLog(title = "更新市场人员日志")
     @PutMapping("")
     public RestResponse<Boolean> update(@RequestBody MarketLog marketLog) {
         Boolean ret = marketLogService.update(marketLog);
@@ -75,6 +78,7 @@ public class MarketLogController extends BaseController {
     /**
      * 市场人员日志删除
      */
+    @OperLog(title = "删除市场人员日志")
     @DeleteMapping("/{id}")
     public RestResponse<Boolean> delete(@PathVariable Long id) {
         Boolean ret = marketLogService.delete(id);

+ 4 - 0
biz-base/src/main/java/com/dayou/controller/NoteController.java

@@ -1,5 +1,6 @@
 package com.dayou.controller;
 
+import com.dayou.annotation.OperLog;
 import com.dayou.vo.NoteCountVO;
 import org.apache.poi.xssf.usermodel.XSSFWorkbook;
 import lombok.extern.slf4j.Slf4j;
@@ -55,6 +56,7 @@ public class NoteController extends BaseController {
     /**
      * 便签新增
      */
+    @OperLog(title = "新增便签")
     @PostMapping("")
     public RestResponse<Boolean> save(@RequestBody Note note) {
         Boolean ret = noteService.add(note);
@@ -64,6 +66,7 @@ public class NoteController extends BaseController {
     /**
      * 便签更新
      */
+    @OperLog(title = "更新便签")
     @PutMapping("")
     public RestResponse<Boolean> update(@RequestBody Note note) {
         Boolean ret = noteService.update(note);
@@ -73,6 +76,7 @@ public class NoteController extends BaseController {
     /**
      * 便签删除
      */
+    @OperLog(title = "删除便签")
     @DeleteMapping("/{id}")
     public RestResponse<Boolean> delete(@PathVariable Long id) {
         Boolean ret = noteService.delete(id);

+ 83 - 0
biz-base/src/main/java/com/dayou/controller/OperationLogController.java

@@ -0,0 +1,83 @@
+package com.dayou.controller;
+
+import org.apache.poi.xssf.usermodel.XSSFWorkbook;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RequestMapping;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import org.springframework.web.bind.annotation.RestController;
+import com.dayou.controller.BaseController;
+import com.dayou.service.IOperationLogService;
+import com.dayou.entity.OperationLog;
+import com.dayou.common.RestResponse;
+import org.springframework.web.bind.annotation.*;
+import com.dayou.utils.ConvertUtil;
+import com.dayou.utils.HttpKit;
+import com.dayou.exception.ErrorCode;
+import java.util.Date;
+import java.util.List;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import org.springframework.http.MediaType;
+import org.springframework.web.multipart.MultipartFile;
+/**
+ * 系统操作日志
+ *
+ * @author wucl
+ * @since 2023-01-16
+ */
+@RestController
+@RequestMapping("operationLog")
+@Slf4j
+public class OperationLogController extends BaseController {
+    @Autowired
+    private IOperationLogService operationLogService;
+
+    /**
+    * 系统操作日志列表
+    */
+    @GetMapping("")
+    public RestResponse<Page<OperationLog>> page(OperationLog operationLog, Page page){
+        Page<OperationLog> pages=operationLogService.selectPage(page,operationLog);
+        return RestResponse.data(pages);
+    }
+
+    /**
+     * 系统操作日志详情
+     */
+    @GetMapping("/{id}")
+    public RestResponse<OperationLog> detail(@PathVariable Long id){
+        OperationLog xOperationLog =operationLogService.detail(id);
+        return RestResponse.data(xOperationLog);
+     }
+
+    /**
+     * 系统操作日志新增
+     */
+    @PostMapping("")
+    public RestResponse<Boolean> save(@RequestBody OperationLog operationLog) {
+        Boolean ret = operationLogService.add(operationLog);
+        return RestResponse.data(ret);
+    }
+
+    /**
+     * 系统操作日志更新
+     */
+    @PutMapping("")
+    public RestResponse<Boolean> update(@RequestBody OperationLog operationLog) {
+        Boolean ret = operationLogService.update(operationLog);
+        return RestResponse.data(ret);
+    }
+
+    /**
+     * 系统操作日志删除
+     */
+    @DeleteMapping("/{id}")
+    public RestResponse<Boolean> delete(@PathVariable Long id) {
+        Boolean ret = operationLogService.delete(id);
+        return RestResponse.data(ret);
+    }
+
+
+}
+

+ 4 - 0
biz-base/src/main/java/com/dayou/controller/PaymentCollectionController.java

@@ -1,5 +1,6 @@
 package com.dayou.controller;
 
+import com.dayou.annotation.OperLog;
 import com.dayou.vo.ItemPaymentVO;
 import com.dayou.vo.PaymentCollectionVO;
 import org.apache.poi.xssf.usermodel.XSSFWorkbook;
@@ -60,6 +61,7 @@ public class PaymentCollectionController extends BaseController {
     /**
      * 回款记录新增
      */
+    @OperLog(title = "新增回款")
     @PostMapping("")
     public RestResponse<Boolean> save(@RequestBody PaymentCollection paymentCollection) {
         Boolean ret = paymentCollectionService.add(paymentCollection);
@@ -69,6 +71,7 @@ public class PaymentCollectionController extends BaseController {
     /**
      * 回款记录更新
      */
+    @OperLog(title = "更新回款记录")
     @PutMapping("")
     public RestResponse<Boolean> update(@RequestBody PaymentCollection paymentCollection) {
         Boolean ret = paymentCollectionService.update(paymentCollection);
@@ -78,6 +81,7 @@ public class PaymentCollectionController extends BaseController {
     /**
      * 回款记录删除
      */
+    @OperLog(title = "删除回款记录")
     @DeleteMapping("/{id}")
     public RestResponse<Boolean> delete(@PathVariable Long id) {
         Boolean ret = paymentCollectionService.delete(id);

+ 4 - 0
biz-base/src/main/java/com/dayou/controller/PostController.java

@@ -1,5 +1,6 @@
 package com.dayou.controller;
 
+import com.dayou.annotation.OperLog;
 import com.dayou.vo.PostVO;
 import org.apache.poi.xssf.usermodel.XSSFWorkbook;
 import lombok.extern.slf4j.Slf4j;
@@ -52,6 +53,7 @@ public class PostController extends BaseController {
     /**
      * 岗位新增
      */
+    @OperLog(title = "新增岗位")
     @PostMapping("")
     public RestResponse<Boolean> save(@RequestBody Post post) {
         Boolean ret = postService.add(post);
@@ -61,6 +63,7 @@ public class PostController extends BaseController {
     /**
      * 岗位更新
      */
+    @OperLog(title = "更新岗位")
     @PutMapping("")
     public RestResponse<Boolean> update(@RequestBody Post post) {
         Boolean ret = postService.update(post);
@@ -70,6 +73,7 @@ public class PostController extends BaseController {
     /**
      * 岗位删除
      */
+    @OperLog(title = "删除岗位")
     @DeleteMapping("/{id}")
     public RestResponse<Boolean> delete(@PathVariable Long id) {
         Boolean ret = postService.delete(id);

+ 3 - 0
biz-base/src/main/java/com/dayou/controller/PostPrivilegeController.java

@@ -53,6 +53,7 @@ public class PostPrivilegeController extends BaseController {
     /**
      * 岗位菜单权限新增
      */
+    @OperLog(title = "新增岗位菜单权限")
     @PostMapping("")
     public RestResponse<Boolean> save(@RequestBody PostPrivilege postPrivilege) {
         Boolean ret = postPrivilegeService.add(postPrivilege);
@@ -62,6 +63,7 @@ public class PostPrivilegeController extends BaseController {
     /**
      * 岗位菜单权限更新
      */
+    @OperLog(title = "更新岗位菜单权限")
     @PutMapping("")
     public RestResponse<Boolean> update(@RequestBody PostPrivilege postPrivilege) {
         Boolean ret = postPrivilegeService.update(postPrivilege);
@@ -71,6 +73,7 @@ public class PostPrivilegeController extends BaseController {
     /**
      * 岗位菜单权限删除
      */
+    @OperLog(title = "删除岗位菜单权限")
     @DeleteMapping("/{id}")
     public RestResponse<Boolean> delete(@PathVariable Long id) {
         Boolean ret = postPrivilegeService.delete(id);

+ 7 - 0
biz-base/src/main/java/com/dayou/controller/UserController.java

@@ -67,6 +67,7 @@ public class UserController extends BaseController {
     /**
      * 基础用户新增
      */
+    @OperLog(title = "用户新增")
     @PostMapping("")
     public RestResponse<Boolean> save(@RequestBody @Valid UserVO user) {
         Boolean ret = userService.xSave(user);
@@ -76,6 +77,7 @@ public class UserController extends BaseController {
     /**
      * 基础用户更新
      */
+    @OperLog(title = "用户更新")
     @PutMapping("")
     public RestResponse<Boolean> update(@RequestBody @Valid UserVO user) {
         Boolean ret = userService.xUpdate(user);
@@ -85,6 +87,7 @@ public class UserController extends BaseController {
     /**
      * 基础用户删除
      */
+    @OperLog(title = "用户删除")
     @DeleteMapping("/{id}")
     public RestResponse<Boolean> delete(@PathVariable Long id) {
         Boolean ret = userService.delete(id);
@@ -107,6 +110,7 @@ public class UserController extends BaseController {
     /**
      * 基础用户模板下载
      */
+    @OperLog(title = "基础用户模板下载",businessType = OperationTypeEnum.EXPORT)
     @GetMapping(value = "/download/importTemplate")
     public void importTemplate() {
         try {
@@ -124,6 +128,7 @@ public class UserController extends BaseController {
     /**
      * 基础用户导入
      */
+    @OperLog(title = "基础用户模板导入",businessType = OperationTypeEnum.IMPORT)
     @PostMapping("/importExcel")
     public RestResponse<Boolean> importExcel(@RequestPart("file") MultipartFile file) {
         userService.importExcel(file);
@@ -190,6 +195,7 @@ public class UserController extends BaseController {
      * @param id
      * @return
      */
+    @OperLog(title = "重置密码",businessType = OperationTypeEnum.RESET)
     @PutMapping("/resetPassword/{id}")
     public RestResponse<Boolean> restPassword(@PathVariable Long id){
         Boolean result = userService.restPassword(id);
@@ -201,6 +207,7 @@ public class UserController extends BaseController {
      * @param passwordDTO
      * @return
      */
+    @OperLog(title = "修改密码",businessType = OperationTypeEnum.SET)
     @PutMapping("/updatePassword")
     public RestResponse<Boolean> updatePassword(@RequestBody UpdatePasswordDTO passwordDTO){
         Boolean result = userService.updatePassword(passwordDTO);

+ 4 - 0
biz-base/src/main/java/com/dayou/controller/UserPostController.java

@@ -1,5 +1,6 @@
 package com.dayou.controller;
 
+import com.dayou.annotation.OperLog;
 import org.apache.poi.xssf.usermodel.XSSFWorkbook;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -54,6 +55,7 @@ public class UserPostController extends BaseController {
     /**
      * 用户岗位新增
      */
+    @OperLog(title = "新增用户岗位")
     @PostMapping("")
     public RestResponse<Boolean> save(@RequestBody UserPost userPost) {
         Boolean ret = userPostService.add(userPost);
@@ -63,6 +65,7 @@ public class UserPostController extends BaseController {
     /**
      * 用户岗位更新
      */
+    @OperLog(title = "更新用户岗位")
     @PutMapping("")
     public RestResponse<Boolean> update(@RequestBody UserPost userPost) {
         Boolean ret = userPostService.update(userPost);
@@ -72,6 +75,7 @@ public class UserPostController extends BaseController {
     /**
      * 用户岗位删除
      */
+    @OperLog(title = "删除用户岗位")
     @DeleteMapping("/{id}")
     public RestResponse<Boolean> delete(@PathVariable Long id) {
         Boolean ret = userPostService.delete(id);

+ 4 - 0
biz-base/src/main/java/com/dayou/controller/VisitController.java

@@ -1,5 +1,6 @@
 package com.dayou.controller;
 
+import com.dayou.annotation.OperLog;
 import com.dayou.vo.VisitVO;
 import org.apache.poi.xssf.usermodel.XSSFWorkbook;
 import lombok.extern.slf4j.Slf4j;
@@ -55,6 +56,7 @@ public class VisitController extends BaseController {
     /**
      * 拜访记录表新增
      */
+    @OperLog(title = "新增拜访记录")
     @PostMapping("")
     public RestResponse<Boolean> save(@RequestBody Visit visit) {
         Boolean ret = visitService.add(visit);
@@ -64,6 +66,7 @@ public class VisitController extends BaseController {
     /**
      * 拜访记录表更新
      */
+    @OperLog(title = "更新拜访记录")
     @PutMapping("")
     public RestResponse<Boolean> update(@RequestBody Visit visit) {
         Boolean ret = visitService.update(visit);
@@ -73,6 +76,7 @@ public class VisitController extends BaseController {
     /**
      * 拜访记录表删除
      */
+    @OperLog(title = "删除拜访记录")
     @DeleteMapping("/{id}")
     public RestResponse<Boolean> delete(@PathVariable Long id) {
         Boolean ret = visitService.delete(id);

+ 196 - 0
common/src/main/java/com/dayou/utils/IpUtils.java

@@ -0,0 +1,196 @@
+package com.dayou.utils;
+
+import javax.servlet.http.HttpServletRequest;
+import java.net.*;
+import java.text.MessageFormat;
+import java.util.Enumeration;
+import java.util.Objects;
+
+/**
+ * 获取IP方法
+ *
+ * @author ruoyi
+ */
+public class IpUtils {
+    public static String getIpAddr(HttpServletRequest request) {
+        if (request == null) {
+            return "unknown";
+        }
+        String ip = request.getHeader("x-forwarded-for");
+        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("WL-Proxy-Client-IP");
+        }
+        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.getRemoteAddr();
+        }
+
+        if (Objects.isNull(ip) || ip.isEmpty()) {
+            return "127.0.0.1";
+        }
+
+        return "0:0:0:0:0:0:0:1".equals(ip) ? "127.0.0.1" : ip.split(",")[0];
+    }
+
+    public static boolean internalIp(String ip) {
+        byte[] addr = textToNumericFormatV4(ip);
+        if (null != addr) {
+            return internalIp(addr) || "127.0.0.1".equals(ip);
+        }
+        return false;
+    }
+
+    private static boolean internalIp(byte[] addr) {
+        final byte b0 = addr[0];
+        final byte b1 = addr[1];
+        // 10.x.x.x/8
+        final byte SECTION_1 = 0x0A;
+        // 172.16.x.x/12
+        final byte SECTION_2 = (byte) 0xAC;
+        final byte SECTION_3 = (byte) 0x10;
+        final byte SECTION_4 = (byte) 0x1F;
+        // 192.168.x.x/16
+        final byte SECTION_5 = (byte) 0xC0;
+        final byte SECTION_6 = (byte) 0xA8;
+        switch (b0) {
+            case SECTION_1:
+                return true;
+            case SECTION_2:
+                if (b1 >= SECTION_3 && b1 <= SECTION_4) {
+                    return true;
+                }
+            case SECTION_5:
+                switch (b1) {
+                    case SECTION_6:
+                        return true;
+                    default:
+                        break;
+                }
+            default:
+                return false;
+        }
+    }
+
+    /**
+     * 将IPv4地址转换成字节
+     *
+     * @param text IPv4地址
+     * @return byte 字节
+     */
+    public static byte[] textToNumericFormatV4(String text) {
+        if (text.length() == 0) {
+            return null;
+        }
+
+        byte[] bytes = new byte[4];
+        String[] elements = text.split("\\.", -1);
+        try {
+            long l;
+            int i;
+            switch (elements.length) {
+                case 1:
+                    l = Long.parseLong(elements[0]);
+                    if ((l < 0L) || (l > 4294967295L)) {
+                        return null;
+                    }
+                    bytes[0] = (byte) (int) (l >> 24 & 0xFF);
+                    bytes[1] = (byte) (int) ((l & 0xFFFFFF) >> 16 & 0xFF);
+                    bytes[2] = (byte) (int) ((l & 0xFFFF) >> 8 & 0xFF);
+                    bytes[3] = (byte) (int) (l & 0xFF);
+                    break;
+                case 2:
+                    l = Integer.parseInt(elements[0]);
+                    if ((l < 0L) || (l > 255L)) {
+                        return null;
+                    }
+                    bytes[0] = (byte) (int) (l & 0xFF);
+                    l = Integer.parseInt(elements[1]);
+                    if ((l < 0L) || (l > 16777215L)) {
+                        return null;
+                    }
+                    bytes[1] = (byte) (int) (l >> 16 & 0xFF);
+                    bytes[2] = (byte) (int) ((l & 0xFFFF) >> 8 & 0xFF);
+                    bytes[3] = (byte) (int) (l & 0xFF);
+                    break;
+                case 3:
+                    for (i = 0; i < 2; ++i) {
+                        l = Integer.parseInt(elements[i]);
+                        if ((l < 0L) || (l > 255L)) {
+                            return null;
+                        }
+                        bytes[i] = (byte) (int) (l & 0xFF);
+                    }
+                    l = Integer.parseInt(elements[2]);
+                    if ((l < 0L) || (l > 65535L)) {
+                        return null;
+                    }
+                    bytes[2] = (byte) (int) (l >> 8 & 0xFF);
+                    bytes[3] = (byte) (int) (l & 0xFF);
+                    break;
+                case 4:
+                    for (i = 0; i < 4; ++i) {
+                        l = Integer.parseInt(elements[i]);
+                        if ((l < 0L) || (l > 255L)) {
+                            return null;
+                        }
+                        bytes[i] = (byte) (int) (l & 0xFF);
+                    }
+                    break;
+                default:
+                    return null;
+            }
+        } catch (NumberFormatException e) {
+            return null;
+        }
+        return bytes;
+    }
+
+    public static String getHostIp() {
+        try {
+            Enumeration<NetworkInterface> networks = NetworkInterface.getNetworkInterfaces();
+            while (networks.hasMoreElements()) {
+                Enumeration<InetAddress> addrs = networks.nextElement().getInetAddresses();
+                while (addrs.hasMoreElements()) {
+                    InetAddress ip = addrs.nextElement();
+                    System.out.println("ip="+ip.getHostAddress());
+                    System.out.println(MessageFormat.format("{0},{1},{2}",ip instanceof Inet4Address,!ip.isSiteLocalAddress(),!ip.isLoopbackAddress()));
+                    if (ip instanceof Inet4Address && !ip.isLoopbackAddress()) {
+                        // 从网卡获取外网IP
+                        System.out.println("return ip="+ip.getHostAddress());
+                        return ip.getHostAddress();
+                    }
+                }
+            }
+        } catch (SocketException e) {
+            e.printStackTrace();
+        }
+
+
+        try {
+            return InetAddress.getLocalHost().getHostAddress();
+        } catch (UnknownHostException e) {
+        }
+        return "127.0.0.1";
+    }
+
+    public static String getHostName() {
+        try {
+            return InetAddress.getLocalHost().getHostName();
+        } catch (UnknownHostException e) {
+        }
+        return "未知";
+    }
+
+    public static void main(String[] args) {
+        System.out.println(getHostIp());
+    }
+}

+ 16 - 0
dao/src/main/java/com/dayou/mapper/OperationLogMapper.java

@@ -0,0 +1,16 @@
+package com.dayou.mapper;
+
+import com.dayou.entity.OperationLog;
+import com.dayou.dao.CustomBaseMapper;
+
+/**
+ * <p>
+ * 系统操作日志 Mapper 接口
+ * </p>
+ *
+ * @author wucl
+ * @since 2023-01-16
+ */
+public interface OperationLogMapper extends CustomBaseMapper<OperationLog> {
+
+}

+ 30 - 0
dao/src/main/resources/mapper/OperationLogMapper.xml

@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.dayou.mapper.OperationLogMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.dayou.entity.OperationLog">
+        <result column="id" property="id" />
+        <result column="deleted" property="deleted" />
+        <result column="created" property="created" />
+        <result column="modified" property="modified" />
+        <result column="user_id" property="userId" />
+        <result column="user_name" property="userName" />
+        <result column="title" property="title" />
+        <result column="operation_type" property="operationType" />
+        <result column="operation_url" property="operationUrl" />
+        <result column="operation_param" property="operationParam" />
+        <result column="operation_time" property="operationTime" />
+        <result column="ip" property="ip" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id,
+        deleted,
+        created,
+        modified,
+        user_id, user_name,title, operation_type, operation_url, operation_param, operation_time,ip
+    </sql>
+
+</mapper>

+ 75 - 0
domain/src/main/java/com/dayou/entity/OperationLog.java

@@ -0,0 +1,75 @@
+package com.dayou.entity;
+import com.dayou.common.BaseEntity;
+import java.time.LocalDateTime;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import com.dayou.annotation.ExcelSheet;
+import com.dayou.annotation.ExportCell;
+import com.dayou.annotation.ImportCell;
+/**
+ * <p>
+ * 系统操作日志
+ * </p>
+ *
+ * @author wucl
+ * @since 2023-01-16
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ExcelSheet(sheetName = "系统操作日志")
+public class OperationLog extends BaseEntity {
+
+    private static final long serialVersionUID=1L;
+
+    /**
+     * 用户id
+     */
+    private Long userId;
+
+    /**
+     * 用户姓名
+     */
+    private String userName;
+
+    /**
+     * 模块标题
+     */
+    @ImportCell
+    @ExportCell(columnName = "模块标题")
+    private String title;
+
+    /**
+     * 业务类型
+     */
+    @ImportCell
+    @ExportCell(columnName = "业务类型")
+    private String operationType;
+
+    /**
+     * 请求URL
+     */
+    @ImportCell
+    @ExportCell(columnName = "请求URL")
+    private String operationUrl;
+
+    /**
+     * 请求参数
+     */
+    @ImportCell
+    @ExportCell(columnName = "请求参数")
+    private String operationParam;
+
+    /**
+     * 操作时间
+     */
+    @ImportCell
+    @ExportCell(columnName = "操作时间")
+    private LocalDateTime operationTime;
+
+    /**
+     * 客户端ip
+     */
+    private String ip;
+
+
+}

+ 130 - 0
service/src/main/java/com/dayou/aspect/OperationLogAop.java

@@ -0,0 +1,130 @@
+package com.dayou.aspect;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONException;
+import com.dayou.annotation.OperLog;
+import com.dayou.entity.OperationLog;
+import com.dayou.enums.OperationTypeEnum;
+import com.dayou.service.IOperationLogService;
+import com.dayou.utils.HttpKit;
+import com.dayou.utils.IpUtils;
+import com.dayou.utils.LoginContext;
+import com.dayou.utils.SpringContextHolder;
+import jdk.internal.org.objectweb.asm.tree.analysis.Value;
+import lombok.extern.slf4j.Slf4j;
+import org.aspectj.lang.JoinPoint;
+import org.aspectj.lang.ProceedingJoinPoint;
+import org.aspectj.lang.annotation.AfterReturning;
+import org.aspectj.lang.annotation.Around;
+import org.aspectj.lang.annotation.Aspect;
+import org.aspectj.lang.annotation.Pointcut;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpMethod;
+import org.springframework.stereotype.Component;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.servlet.ServletResponse;
+import javax.servlet.http.HttpServletRequest;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Date;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * 类说明:
+ *
+ * @author: wucl
+ * @since: 2023/1/16
+ * created with IntelliJ IDEA.
+ */
+@Slf4j
+@Component
+@Aspect
+public class OperationLogAop {
+
+    @Autowired
+    private IOperationLogService operationLogService;
+
+    @AfterReturning("@annotation(operLog)")
+    public void operationLogAround(JoinPoint joinPoint, OperLog operLog){
+        try {
+            OperationLog operationLog = new OperationLog();
+            HttpServletRequest request = HttpKit.getRequest();
+            Long userId = LoginContext.getUserId();
+            String userName = LoginContext.getUserName();
+            Object[] args = joinPoint.getArgs();
+            getControllerMethodDescription(operLog,operationLog,args);
+            operationLog.setUserId(userId);
+            operationLog.setUserName(userName);
+            operationLog.setOperationUrl(request.getRequestURI());
+            operationLog.setIp(IpUtils.getIpAddr(request));
+            operationLog.setOperationTime(LocalDateTime.now());
+            operationLogService.save(operationLog);
+
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        } catch (Throwable e) {
+            throw new RuntimeException(e);
+        }
+    }
+
+    /**
+     * 获取注解中对方法的描述信息 用于Controller层注解
+     *
+     * @param log     日志
+     * @param operLog 操作日志
+     * @throws Exception
+     */
+    public void getControllerMethodDescription(OperLog log, OperationLog operLog, Object[] args) throws Exception {
+        String method = SpringContextHolder.currentReq().getMethod();
+        OperationTypeEnum operationTypeEnum = null;
+        if (log.businessType() == OperationTypeEnum.DEFAULT_OP) {
+            if (HttpMethod.POST.name().equalsIgnoreCase(method)) {
+                operationTypeEnum = OperationTypeEnum.ADD;
+            } else if (HttpMethod.PUT.name().equalsIgnoreCase(method)) {
+                operationTypeEnum = OperationTypeEnum.EDIT;
+            } else if (HttpMethod.DELETE.name().equalsIgnoreCase(method)) {
+                operationTypeEnum = OperationTypeEnum.DELETE;
+            } else {
+                operationTypeEnum = OperationTypeEnum.DEFAULT_OP;
+            }
+        } else {
+            operationTypeEnum = log.businessType();
+        }
+
+        // 设置action动作
+        operLog.setOperationType(operationTypeEnum.getCode());
+        // 设置标题
+        operLog.setTitle(log.title());
+        // 是否需要保存request,参数和值
+        // 获取参数的信息,传入到数据库中。
+        setRequestValue(operLog, args);
+    }
+
+    /**
+     * 获取请求的参数,放到log中
+     *
+     * @param operLog 操作日志
+     * @throws Exception 异常
+     */
+    private void setRequestValue(OperationLog operLog, Object[] args) throws Exception {
+        List<?> param = new ArrayList<>(Arrays.asList(args)).stream().filter(p -> !(p instanceof ServletResponse))
+                .filter(e -> !(e instanceof MultipartFile))
+                .collect(Collectors.toList());
+        String params = "{}";
+        try {
+            params = JSON.toJSONString(param, true);
+            log.debug("args:{}", param);
+        } catch (JSONException e) {
+            log.error("记录日志出错 请求参数param json 转换失败  ", e);
+        }
+        // 数据过长
+        if (params.length() > 1500) {
+            params = params.substring(0, 1500);
+        }
+        operLog.setOperationParam(params);
+    }
+}

+ 28 - 0
service/src/main/java/com/dayou/service/IOperationLogService.java

@@ -0,0 +1,28 @@
+package com.dayou.service;
+import com.dayou.entity.OperationLog;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import org.apache.poi.xssf.usermodel.XSSFWorkbook;
+import org.springframework.web.multipart.MultipartFile;
+/**
+ * <p>
+ * 系统操作日志 服务类
+ * </p>
+ *
+ * @author wucl
+ * @since 2023-01-16
+ */
+public interface IOperationLogService extends IService<OperationLog> {
+
+        Page<OperationLog> selectPage(Page page,OperationLog operationLog);
+
+        OperationLog detail(Long id);
+
+        Boolean add(OperationLog operationLog);
+
+        Boolean update(OperationLog operationLog);
+
+        Boolean delete(Long id);
+
+}

+ 66 - 0
service/src/main/java/com/dayou/service/impl/OperationLogServiceImpl.java

@@ -0,0 +1,66 @@
+package com.dayou.service.impl;
+
+import com.dayou.entity.OperationLog;
+import com.dayou.mapper.OperationLogMapper;
+import com.dayou.service.IOperationLogService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
+import com.dayou.utils.ExcelUtil;
+import org.apache.poi.ss.usermodel.Cell;
+import org.apache.poi.ss.usermodel.CellStyle;
+import org.apache.poi.ss.usermodel.Row;
+import org.apache.poi.ss.usermodel.Sheet;
+import org.apache.poi.xssf.usermodel.XSSFWorkbook;
+import org.springframework.web.multipart.MultipartFile;
+import java.util.List;
+import java.util.ArrayList;
+import org.springframework.transaction.annotation.Transactional;
+import com.dayou.enums.BatchTaskTypeEnum;
+
+/**
+ * <p>
+ * 系统操作日志 服务实现类
+ * </p>
+ *
+ * @author wucl
+ * @since 2023-01-16
+ */
+@Service
+public class OperationLogServiceImpl extends ServiceImpl<OperationLogMapper, OperationLog> implements IOperationLogService {
+
+
+    @Override
+    @SuppressWarnings("unchecked")
+    public Page<OperationLog> selectPage(Page page,OperationLog operationLog){
+        return this.page(page, new QueryWrapper<OperationLog>(operationLog));
+    }
+
+
+    @Override
+    public OperationLog detail(Long id){
+        return this.getById(id);
+    }
+
+    @Override
+    public Boolean add(OperationLog operationLog){
+        return  this.save(operationLog);
+    }
+
+    @Override
+    public Boolean update(OperationLog operationLog){
+        return  this.updateById(operationLog);
+    }
+
+    @Override
+    public Boolean delete(Long id){
+        //逻辑删除
+        return this.removeById(id);
+    }
+}