diff --git a/src/main/java/com/zsc/edu/dify/exception/ApiExceptionHandler.java b/src/main/java/com/zsc/edu/dify/exception/ApiExceptionHandler.java index ef4ace2..1f93af1 100644 --- a/src/main/java/com/zsc/edu/dify/exception/ApiExceptionHandler.java +++ b/src/main/java/com/zsc/edu/dify/exception/ApiExceptionHandler.java @@ -64,5 +64,5 @@ public class ApiExceptionHandler { log.error("ApiException: {}", objectMapper.writeValueAsString(Map.of("msg", ex.getMessage()))); return new ResponseEntity<>(objectMapper.writeValueAsString(Map.of("msg", ex.getMessage())), HttpStatus.INTERNAL_SERVER_ERROR); } - +//TODo 403报错修改 } diff --git a/src/main/java/com/zsc/edu/dify/framework/security/CustomAccessDeniedHandler.java b/src/main/java/com/zsc/edu/dify/framework/security/CustomAccessDeniedHandler.java index e10ac4f..309c6ff 100644 --- a/src/main/java/com/zsc/edu/dify/framework/security/CustomAccessDeniedHandler.java +++ b/src/main/java/com/zsc/edu/dify/framework/security/CustomAccessDeniedHandler.java @@ -44,4 +44,6 @@ public class CustomAccessDeniedHandler implements AccessDeniedHandler { response.getWriter().print(objectMapper.writeValueAsString(result)); response.flushBuffer(); } + + //TODO 403错误修改 } diff --git a/src/main/java/com/zsc/edu/dify/modules/dify/controller/V1ChatController.java b/src/main/java/com/zsc/edu/dify/modules/dify/controller/V1ChatController.java index 699dc2d..c08cbb9 100644 --- a/src/main/java/com/zsc/edu/dify/modules/dify/controller/V1ChatController.java +++ b/src/main/java/com/zsc/edu/dify/modules/dify/controller/V1ChatController.java @@ -1,6 +1,7 @@ package com.zsc.edu.dify.modules.dify.controller; import com.zsc.edu.dify.modules.dify.repo.AppEntityRepository; +import com.zsc.edu.dify.modules.operationLog.entity.OperationLogAnnotation; import io.github.guoshiqiufeng.dify.chat.DifyChat; import io.github.guoshiqiufeng.dify.chat.dto.request.ChatMessageSendRequest; import io.github.guoshiqiufeng.dify.chat.dto.request.MessageConversationsRequest; @@ -38,6 +39,7 @@ public class V1ChatController { */ @PostMapping("/completions/{appid}") @PreAuthorize("hasAuthority('dify:chat:query')") + @OperationLogAnnotation(content = "'dify对话'", operationType = "发送") public ChatMessageSendResponse sendChatMessage( @RequestBody ChatMessageSendRequest sendRequest, @PathVariable String appid @@ -103,6 +105,7 @@ public class V1ChatController { */ @DeleteMapping("/conversation") @PreAuthorize("hasAuthority('dify:chat:delete')") + @OperationLogAnnotation(content = "'dify对话", operationType = "删除") public void deleteConversation(@RequestParam String conversationId, @RequestParam String userId, @RequestParam String appid) { String apiKey = appEntityRepository.selectApiKey(appid); difyChat.deleteConversation(conversationId, apiKey, userId); diff --git a/src/main/java/com/zsc/edu/dify/modules/dify/controller/V1DatasetController.java b/src/main/java/com/zsc/edu/dify/modules/dify/controller/V1DatasetController.java index a358135..ee56a4a 100644 --- a/src/main/java/com/zsc/edu/dify/modules/dify/controller/V1DatasetController.java +++ b/src/main/java/com/zsc/edu/dify/modules/dify/controller/V1DatasetController.java @@ -1,5 +1,6 @@ package com.zsc.edu.dify.modules.dify.controller; +import com.zsc.edu.dify.modules.operationLog.entity.OperationLogAnnotation; import io.github.guoshiqiufeng.dify.core.pojo.DifyPageResult; import io.github.guoshiqiufeng.dify.dataset.DifyDataset; import io.github.guoshiqiufeng.dify.dataset.dto.request.*; @@ -8,7 +9,7 @@ import jakarta.annotation.Resource; import org.springframework.beans.factory.annotation.Value; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.web.bind.annotation.*; - +//TODO 操作日志 @RestController @RequestMapping("/api/v1/dataset") public class V1DatasetController { @@ -31,6 +32,7 @@ public class V1DatasetController { return difyDataset.page(request); } + //TODO 接口报错 /** * 通过文件创建文档 * @@ -39,6 +41,7 @@ public class V1DatasetController { */ @PostMapping("/createDocumentByFile") @PreAuthorize("hasAuthority('dify:dataset:create')") + @OperationLogAnnotation(content = "'dify知识库文档'", operationType = "新建") public DocumentCreateResponse createDocumentByFile(DocumentCreateByFileRequest request){ return difyDataset.createDocumentByFile(request); } @@ -78,6 +81,7 @@ public class V1DatasetController { */ @DeleteMapping("/deleteDocument") @PreAuthorize("hasAuthority('dify:dataset:delete')") + @OperationLogAnnotation(content = "'dify知识库文档'", operationType = "删除") public void deleteDocument(String datasetId, String documentId){ difyDataset.deleteDocument(datasetId, documentId, apiKey); } @@ -90,6 +94,7 @@ public class V1DatasetController { */ @PostMapping("/createSegment") @PreAuthorize("hasAuthority('dify:dataset:create')") + @OperationLogAnnotation(content = "'dify知识库文档分段'", operationType = "新建") public SegmentResponse createSegment(@RequestBody SegmentCreateRequest request){ return difyDataset.createSegment(request); } @@ -102,6 +107,7 @@ public class V1DatasetController { */ @PostMapping("/createSegmentChildChunk") @PreAuthorize("hasAuthority('dify:dataset:create')") + @OperationLogAnnotation(content = "'dify知识库文档子分段'", operationType = "新建") public SegmentChildChunkCreateResponse createSegmentChildChunk(@RequestBody SegmentChildChunkCreateRequest request){ return difyDataset.createSegmentChildChunk(request); } diff --git a/src/main/java/com/zsc/edu/dify/modules/dify/controller/V1ServerController.java b/src/main/java/com/zsc/edu/dify/modules/dify/controller/V1ServerController.java index 6f6477d..cd3183f 100644 --- a/src/main/java/com/zsc/edu/dify/modules/dify/controller/V1ServerController.java +++ b/src/main/java/com/zsc/edu/dify/modules/dify/controller/V1ServerController.java @@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.zsc.edu.dify.modules.dify.entity.AppEntity; import com.zsc.edu.dify.modules.dify.service.DifyServerService; +import com.zsc.edu.dify.modules.operationLog.entity.OperationLogAnnotation; import io.github.guoshiqiufeng.dify.server.DifyServer; import io.github.guoshiqiufeng.dify.server.dto.response.ApiKeyResponseVO; import io.github.guoshiqiufeng.dify.server.dto.response.AppsResponseVO; @@ -97,6 +98,7 @@ public class V1ServerController { */ @PostMapping("/app/{id}/toggle") @PreAuthorize("hasAuthority('dify:server:update')") + @OperationLogAnnotation(content = "'dify服务启用状态'", operationType = "更新") public boolean enabledApp(@PathVariable String id) { return difyServerService.enabledApp(id); } diff --git a/src/main/java/com/zsc/edu/dify/modules/dify/controller/V1WorkflowController.java b/src/main/java/com/zsc/edu/dify/modules/dify/controller/V1WorkflowController.java index 688dba3..8e13bad 100644 --- a/src/main/java/com/zsc/edu/dify/modules/dify/controller/V1WorkflowController.java +++ b/src/main/java/com/zsc/edu/dify/modules/dify/controller/V1WorkflowController.java @@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.zsc.edu.dify.modules.dify.entity.WorkflowData; import com.zsc.edu.dify.modules.dify.repo.AppEntityRepository; import com.zsc.edu.dify.modules.dify.service.DifyWorkflowService; +import com.zsc.edu.dify.modules.operationLog.entity.OperationLogAnnotation; import io.github.guoshiqiufeng.dify.core.pojo.DifyPageResult; import io.github.guoshiqiufeng.dify.workflow.DifyWorkflow; import io.github.guoshiqiufeng.dify.workflow.dto.request.WorkflowLogsRequest; @@ -37,6 +38,7 @@ public class V1WorkflowController { */ @PostMapping("/run/{appId}") @PreAuthorize("hasAuthority('dify:workflow:run')") + @OperationLogAnnotation(content = "'dify工作流'", operationType = "运行") public WorkflowRunResponse runWorkflow(@RequestBody WorkflowRunRequest request, @PathVariable String appId) { return difyWorkflowService.run(request, appId); } diff --git a/src/main/java/com/zsc/edu/dify/modules/operationLog/entity/FunctionTypeEnum.java b/src/main/java/com/zsc/edu/dify/modules/operationLog/entity/FunctionTypeEnum.java index 162d28c..9ac48d7 100644 --- a/src/main/java/com/zsc/edu/dify/modules/operationLog/entity/FunctionTypeEnum.java +++ b/src/main/java/com/zsc/edu/dify/modules/operationLog/entity/FunctionTypeEnum.java @@ -13,6 +13,7 @@ public enum FunctionTypeEnum implements IEnum, IState create("create", "create"), update("update", "update"), delete("delete", "delete"), + run("run", "run"), other("other", "other"); private final String code; diff --git a/src/main/java/com/zsc/edu/dify/modules/operationLog/entity/ModuleTypeEnum.java b/src/main/java/com/zsc/edu/dify/modules/operationLog/entity/ModuleTypeEnum.java index 200b32d..865f91a 100644 --- a/src/main/java/com/zsc/edu/dify/modules/operationLog/entity/ModuleTypeEnum.java +++ b/src/main/java/com/zsc/edu/dify/modules/operationLog/entity/ModuleTypeEnum.java @@ -26,6 +26,10 @@ public enum ModuleTypeEnum implements IEnum, IState { notice("notice", "notice"), bulletin("bulletin", "bulletin"), attachment("attachment", "attachment"), + v1chat("v1chat","v1chat"), + v1dataset("v1dataset","v1dataset"), + v1server("v1server","v1server"), + v1workflow("v1workflow","v1workflow"), other("other", "other"); private final String code; diff --git a/src/main/java/com/zsc/edu/dify/modules/system/controller/DeptController.java b/src/main/java/com/zsc/edu/dify/modules/system/controller/DeptController.java index e98070f..8f1318c 100644 --- a/src/main/java/com/zsc/edu/dify/modules/system/controller/DeptController.java +++ b/src/main/java/com/zsc/edu/dify/modules/system/controller/DeptController.java @@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.zsc.edu.dify.exception.ConstraintException; import com.zsc.edu.dify.framework.mybatisplus.DataPermission; +import com.zsc.edu.dify.modules.operationLog.entity.OperationLogAnnotation; import com.zsc.edu.dify.modules.system.dto.DeptDto; import com.zsc.edu.dify.modules.system.entity.Dept; import com.zsc.edu.dify.modules.system.entity.User; @@ -62,6 +63,7 @@ public class DeptController { */ @PostMapping @PreAuthorize("hasAuthority('system:dept:create')") + @OperationLogAnnotation(content = "'部门'", operationType = "新建") public Dept create(@RequestBody DeptDto dto) { return service.create(dto); } @@ -75,6 +77,7 @@ public class DeptController { */ @PatchMapping("/{id}") @PreAuthorize("hasAuthority('system:dept:update')") + @OperationLogAnnotation(content = "'部门'", operationType = "更新") public Boolean update(@RequestBody DeptDto dto, @PathVariable("id") Long id) { return service.edit(dto, id); } @@ -86,6 +89,7 @@ public class DeptController { */ @DeleteMapping("/{id}") @PreAuthorize("hasAuthority('system:dept:delete')") + @OperationLogAnnotation(content = "'部门'", operationType = "删除") public Boolean delete(@PathVariable("id") Long id) { // 是否存在用户绑定此部门 boolean hasUser = userService.count(new LambdaQueryWrapper().eq(User::getDeptId, id)) > 0; @@ -100,6 +104,7 @@ public class DeptController { * */ @PatchMapping("/toggle/{id}") @PreAuthorize("hasAuthority('system:dept:update')") + @OperationLogAnnotation(content = "'部门'", operationType = "更新启用") public Boolean toggle(@PathVariable("id") Long id) { return service.toggle(id); } diff --git a/src/main/java/com/zsc/edu/dify/modules/system/controller/MenuController.java b/src/main/java/com/zsc/edu/dify/modules/system/controller/MenuController.java index 8a0f889..bfb4d95 100644 --- a/src/main/java/com/zsc/edu/dify/modules/system/controller/MenuController.java +++ b/src/main/java/com/zsc/edu/dify/modules/system/controller/MenuController.java @@ -2,6 +2,7 @@ package com.zsc.edu.dify.modules.system.controller; import com.zsc.edu.dify.framework.mybatisplus.DataPermission; import com.zsc.edu.dify.framework.security.UserDetailsImpl; +import com.zsc.edu.dify.modules.operationLog.entity.OperationLogAnnotation; import com.zsc.edu.dify.modules.system.dto.MenuDto; import com.zsc.edu.dify.modules.system.entity.Menu; import com.zsc.edu.dify.modules.system.service.MenuService; @@ -28,6 +29,7 @@ public class MenuController { */ @PostMapping @PreAuthorize("hasAuthority('system:menu:create')") + @OperationLogAnnotation(content = "'菜单'", operationType = "新建") public Menu create(@RequestBody MenuDto dto) { return service.create(dto); } @@ -37,6 +39,7 @@ public class MenuController { */ @PatchMapping("/{id}") @PreAuthorize("hasAuthority('system:menu:update')") + @OperationLogAnnotation(content = "'菜单'", operationType = "更新") public Menu update(@RequestBody MenuDto dto, @PathVariable("id") Long id) { return service.update(dto, id); } @@ -46,6 +49,7 @@ public class MenuController { */ @DeleteMapping("/{id}") @PreAuthorize("hasAuthority('system:menu:delete')") + @OperationLogAnnotation(content = "'菜单'", operationType = "删除") public Boolean delete(@PathVariable("id") Long id) { return service.delete(id); } diff --git a/src/main/java/com/zsc/edu/dify/modules/system/controller/RoleController.java b/src/main/java/com/zsc/edu/dify/modules/system/controller/RoleController.java index 1d11872..831ef98 100644 --- a/src/main/java/com/zsc/edu/dify/modules/system/controller/RoleController.java +++ b/src/main/java/com/zsc/edu/dify/modules/system/controller/RoleController.java @@ -3,6 +3,7 @@ package com.zsc.edu.dify.modules.system.controller; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.zsc.edu.dify.framework.mybatisplus.DataPermission; //import com.zsc.edu.dify.modules.system.dto.RoleAuthCreateDto; +import com.zsc.edu.dify.modules.operationLog.entity.OperationLogAnnotation; import com.zsc.edu.dify.modules.system.dto.RoleDto; import com.zsc.edu.dify.modules.system.entity.Role; import com.zsc.edu.dify.modules.system.query.RoleQuery; @@ -45,6 +46,7 @@ public class RoleController { */ @PostMapping @PreAuthorize("hasAuthority('system:role:create')") + @OperationLogAnnotation(content = "'角色'", operationType = "新建") public Role create(@RequestBody RoleDto dto) { return service.create(dto); } @@ -58,6 +60,7 @@ public class RoleController { */ @PatchMapping("{id}") @PreAuthorize("hasAuthority('system:role:update')") + @OperationLogAnnotation(content = "'角色'", operationType = "更新") public Role update(@RequestBody RoleDto dto, @PathVariable("id") Long id) { return service.edit(dto, id); } @@ -70,6 +73,7 @@ public class RoleController { */ @PatchMapping("{id}/toggle") @PreAuthorize("hasAuthority('system:role:update')") + @OperationLogAnnotation(content = "'角色'", operationType = "更新启用") public Boolean toggle(@PathVariable("id") Long id) { return service.toggle(id); } @@ -94,6 +98,7 @@ public class RoleController { */ @DeleteMapping("{id}") @PreAuthorize("hasAuthority('system:role:delete')") + @OperationLogAnnotation(content = "'角色'", operationType = "删除") public Boolean delete(@PathVariable Long id) { return service.delete(id); } diff --git a/src/main/resources/sql.sql b/src/main/resources/sql.sql new file mode 100644 index 0000000..5c56de1 --- /dev/null +++ b/src/main/resources/sql.sql @@ -0,0 +1,30 @@ +create table operation_log +( + id bigint generated by default as identity + constraint operation_log_pk + primary key, + module_type varchar not null, + function_type varchar not null, + content varchar, + make_time timestamp, + create_id bigint, + dept_id bigint +); + +comment on column operation_log.id is '主键'; + +comment on column operation_log.module_type is '模块类型'; + +comment on column operation_log.function_type is '操作类型'; + +comment on column operation_log.content is '操作内容'; + +comment on column operation_log.make_time is '操作时间'; + +comment on column operation_log.create_id is '创建人ID'; + +comment on column operation_log.dept_id is '所属部门'; + +alter table operation_log + owner to gitea; +