feat(dify模块与system模块): 添加了日志监控操作

This commit is contained in:
zhuangtianxiang 2025-05-08 15:56:55 +08:00
parent c1f8f896d6
commit 4549317bb2
12 changed files with 66 additions and 2 deletions

View File

@ -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报错修改
}

View File

@ -44,4 +44,6 @@ public class CustomAccessDeniedHandler implements AccessDeniedHandler {
response.getWriter().print(objectMapper.writeValueAsString(result));
response.flushBuffer();
}
//TODO 403错误修改
}

View File

@ -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);

View File

@ -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);
}

View File

@ -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);
}

View File

@ -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);
}

View File

@ -13,6 +13,7 @@ public enum FunctionTypeEnum implements IEnum<String>, IState<FunctionTypeEnum>
create("create", "create"),
update("update", "update"),
delete("delete", "delete"),
run("run", "run"),
other("other", "other");
private final String code;

View File

@ -26,6 +26,10 @@ public enum ModuleTypeEnum implements IEnum<String>, IState<ModuleTypeEnum> {
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;

View File

@ -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<User>().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);
}

View File

@ -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);
}

View File

@ -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);
}

View File

@ -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;