diff --git a/src/main/java/com/zsc/edu/dify/framework/RestClientConfig.java b/src/main/java/com/zsc/edu/dify/framework/RestClientConfig.java deleted file mode 100644 index d273deb..0000000 --- a/src/main/java/com/zsc/edu/dify/framework/RestClientConfig.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.zsc.edu.dify.framework; - -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.web.client.RestClient; - -/** - * @author zhuang - */ -@Configuration -public class RestClientConfig { - - @Bean - public RestClient restClient() { - return RestClient.builder().build(); - } -} \ No newline at end of file diff --git a/src/main/java/com/zsc/edu/dify/framework/WebClientConfig.java b/src/main/java/com/zsc/edu/dify/framework/WebClientConfig.java new file mode 100644 index 0000000..534d113 --- /dev/null +++ b/src/main/java/com/zsc/edu/dify/framework/WebClientConfig.java @@ -0,0 +1,31 @@ +package com.zsc.edu.dify.framework; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.http.client.ClientHttpRequestFactory; +import org.springframework.http.client.SimpleClientHttpRequestFactory; +import org.springframework.http.client.reactive.ReactorClientHttpConnector; +import org.springframework.web.client.RestClient; +import org.springframework.web.reactive.function.client.WebClient; +import reactor.netty.http.client.HttpClient; + +import java.time.Duration; + +/** + * @author zhuang + */ +@Configuration +public class WebClientConfig { + + @Bean + public RestClient restClient() { + // 配置超时参数 + SimpleClientHttpRequestFactory requestFactory = new SimpleClientHttpRequestFactory(); + requestFactory.setConnectTimeout((int) Duration.ofMinutes(30).toMillis()); // 设置连接超时时间为5秒 + requestFactory.setReadTimeout((int) Duration.ofMinutes(30).toMillis()); // 设置读取超时时间为5秒 + + return RestClient.builder() + .requestFactory(requestFactory) + .build(); + } +} \ No newline at end of file diff --git a/src/main/java/com/zsc/edu/dify/framework/json/JsonConfig.java b/src/main/java/com/zsc/edu/dify/framework/json/JsonConfig.java index f1bf319..f912a19 100644 --- a/src/main/java/com/zsc/edu/dify/framework/json/JsonConfig.java +++ b/src/main/java/com/zsc/edu/dify/framework/json/JsonConfig.java @@ -1,6 +1,7 @@ package com.zsc.edu.dify.framework.json; import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule; import org.springframework.boot.autoconfigure.jackson.Jackson2ObjectMapperBuilderCustomizer; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -13,7 +14,8 @@ public class JsonConfig { @Bean public Jackson2ObjectMapperBuilderCustomizer customizer() { - return builder -> builder.serializationInclusion(JsonInclude.Include.NON_NULL) + return builder -> builder + .serializationInclusion(JsonInclude.Include.NON_NULL) .serializationInclusion(JsonInclude.Include.NON_EMPTY); } } 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 92da44e..deafa51 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 @@ -29,7 +29,7 @@ public class CustomAccessDeniedHandler implements AccessDeniedHandler { @Override public void handle(HttpServletRequest request, HttpServletResponse response, AccessDeniedException ex) throws IOException, ServletException { -// ex.printStackTrace(); + ex.printStackTrace(); response.setContentType("application/json;charset=utf-8"); ExceptionResult result; if (ex instanceof MissingCsrfTokenException) { @@ -37,17 +37,17 @@ public class CustomAccessDeniedHandler implements AccessDeniedHandler { // 会话已注销,返回401 response.setStatus(HttpStatus.UNAUTHORIZED.value()); result = new ExceptionResult("凭证已过期,请重新登录", HttpStatus.UNAUTHORIZED.value(), - LocalDateTime.now()); + LocalDateTime.now()); } else if (ex instanceof AuthorizationDeniedException) { - // 403 - response.setStatus(HttpStatus.FORBIDDEN.value()); - result = new ExceptionResult("当前账号已在其他设备登录,请先退出再尝试登录", HttpStatus.FORBIDDEN.value(), - LocalDateTime.now()); + // 会话已存在,禁止重复登录,返回401 + response.setStatus(HttpStatus.UNAUTHORIZED.value()); + result = new ExceptionResult("当前账号已在其他设备登录,请先退出再尝试登录", HttpStatus.UNAUTHORIZED.value(), + LocalDateTime.now()); } else { // 403 response.setStatus(HttpStatus.FORBIDDEN.value()); result = new ExceptionResult("禁止操作", HttpStatus.FORBIDDEN.value(), - LocalDateTime.now()); + LocalDateTime.now()); } response.getWriter().print(objectMapper.writeValueAsString(result)); response.flushBuffer(); diff --git a/src/main/java/com/zsc/edu/dify/framework/security/SpringSecurityConfig.java b/src/main/java/com/zsc/edu/dify/framework/security/SpringSecurityConfig.java index 617698a..7c09f2d 100644 --- a/src/main/java/com/zsc/edu/dify/framework/security/SpringSecurityConfig.java +++ b/src/main/java/com/zsc/edu/dify/framework/security/SpringSecurityConfig.java @@ -10,7 +10,6 @@ import org.springframework.security.authentication.ProviderManager; import org.springframework.security.authentication.dao.DaoAuthenticationProvider; import org.springframework.security.config.annotation.method.configuration.EnableMethodSecurity; import org.springframework.security.config.annotation.web.builders.HttpSecurity; -import org.springframework.security.config.annotation.web.reactive.EnableWebFluxSecurity; import org.springframework.security.core.session.SessionRegistry; import org.springframework.security.core.session.SessionRegistryImpl; import org.springframework.security.core.userdetails.UserDetailsService; @@ -39,6 +38,7 @@ public class SpringSecurityConfig { private final CustomAuthenticationSuccessHandler customAuthenticationSuccessHandler; private final CustomAuthenticationEntryPoint customAuthenticationEntryPoint; private final CustomAccessDeniedHandler customAccessDeniedHandler; + private final CustomSessionInformationExpiredStrategy customSessionInformationExpiredStrategy; // private final SessionRegistry sessionRegistry; @Resource @@ -59,6 +59,14 @@ public class SpringSecurityConfig { return new HttpSessionEventPublisher(); } + @Bean + public ConcurrentSessionControlAuthenticationStrategy concurrentSessionControlAuthenticationStrategy() { + ConcurrentSessionControlAuthenticationStrategy concurrentSessionControlAuthenticationStrategy = new ConcurrentSessionControlAuthenticationStrategy(sessionRegistry()); + concurrentSessionControlAuthenticationStrategy.setMaximumSessions(1); + concurrentSessionControlAuthenticationStrategy.setExceptionIfMaximumExceeded(true); + return concurrentSessionControlAuthenticationStrategy; + } + @Bean public PersistentTokenRepository persistentTokenRepository() { JdbcTokenRepositoryImpl tokenRepository = new JdbcTokenRepositoryImpl(); @@ -75,7 +83,7 @@ public class SpringSecurityConfig { } @Bean - public JsonAuthenticationFilter jsonAuthenticationFilter() throws Exception { + public JsonAuthenticationFilter jsonAuthenticationFilter() { JsonAuthenticationFilter filter = new JsonAuthenticationFilter(); filter.setAuthenticationSuccessHandler(customAuthenticationSuccessHandler); filter.setAuthenticationFailureHandler(customAuthenticationFailureHandler); @@ -89,21 +97,19 @@ public class SpringSecurityConfig { @Bean public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { - return http .authorizeHttpRequests(auth -> auth .requestMatchers(HttpMethod.GET, "/api/rest/user/menu","/api/rest/user/register","/api/rest/user/send-email").permitAll() .requestMatchers(HttpMethod.POST, "/api/rest/user/login","/api/rest/user/register").permitAll() .requestMatchers("/api/rest/user/me").permitAll() - .requestMatchers("/v1/**").authenticated() .requestMatchers("/api/**").authenticated() ) .addFilterAt(jsonAuthenticationFilter(), UsernamePasswordAuthenticationFilter.class) .formLogin(form -> form - .loginPage("/user/login") - .loginProcessingUrl("/api/rest/user/login") - .successHandler(customAuthenticationSuccessHandler) - .failureHandler(customAuthenticationFailureHandler)) + .loginPage("/user/login") + .loginProcessingUrl("/api/rest/user/login") + .successHandler(customAuthenticationSuccessHandler) + .failureHandler(customAuthenticationFailureHandler)) .logout(logout -> logout .logoutUrl("/api/rest/user/logout") .logoutSuccessHandler((request, response, authentication) -> {})) @@ -115,13 +121,14 @@ public class SpringSecurityConfig { .rememberMe(rememberMe -> rememberMe .userDetailsService(userDetailsService) .tokenRepository(persistentTokenRepository())) - .csrf(csrf -> - csrf.ignoringRequestMatchers("v1/**","/api/internal/**", "/api/rest/user/logout","/api/rest/user/register")) + .csrf(csrf -> csrf + .sessionAuthenticationStrategy(concurrentSessionControlAuthenticationStrategy()) + .ignoringRequestMatchers("v1/**","/api/internal/**", "/api/rest/user/logout","/api/rest/user/register")) .sessionManagement(session -> session .maximumSessions(1) .maxSessionsPreventsLogin(true) .sessionRegistry(sessionRegistry()) -// .expiredSessionStrategy(customSessionInformationExpiredStrategy) + .expiredSessionStrategy(customSessionInformationExpiredStrategy) ).build(); } } diff --git a/src/main/java/com/zsc/edu/dify/modules/dify/controller/PPTController.java b/src/main/java/com/zsc/edu/dify/modules/dify/controller/PPTController.java index bdd7fba..48ead56 100644 --- a/src/main/java/com/zsc/edu/dify/modules/dify/controller/PPTController.java +++ b/src/main/java/com/zsc/edu/dify/modules/dify/controller/PPTController.java @@ -31,11 +31,11 @@ public class PPTController { * @param request * @return */ - @PostMapping("/run") + @PostMapping("/run/{appId}") @OperationLogAnnotation(content = "'dify工作流'", operationType = "运行") - public WorkflowRunResponse runWorkflow(@RequestBody WorkflowRunRequest request) { + public WorkflowRunResponse runWorkflow(@RequestBody WorkflowRunRequest request, @PathVariable String appId) { request.setUserId(SecurityUtil.getUserInfo().id.toString()); - return ExceptionUtil.difyException(() -> difyWorkflowService.run(request, "ee3889b6-50fa-463e-b956-3b93447727fc")); + return ExceptionUtil.difyException(() -> difyWorkflowService.run(request, appId)); } /** diff --git a/src/main/java/com/zsc/edu/dify/modules/dify/controller/Spider2Controller.java b/src/main/java/com/zsc/edu/dify/modules/dify/controller/Spider2Controller.java index c9f6c5a..9016c20 100644 --- a/src/main/java/com/zsc/edu/dify/modules/dify/controller/Spider2Controller.java +++ b/src/main/java/com/zsc/edu/dify/modules/dify/controller/Spider2Controller.java @@ -30,11 +30,11 @@ public class Spider2Controller { * @param request * @return */ - @PostMapping("/run") + @PostMapping("/run/{appId}") @OperationLogAnnotation(content = "'dify工作流'", operationType = "运行") - public WorkflowRunResponse runWorkflow(@RequestBody WorkflowRunRequest request) { + public WorkflowRunResponse runWorkflow(@RequestBody WorkflowRunRequest request, @PathVariable String appId) { request.setUserId(SecurityUtil.getUserInfo().id.toString()); - return ExceptionUtil.difyException(() -> difyWorkflowService.run(request, "c736edd0-925d-4877-9223-56aab7342311")); + return ExceptionUtil.difyException(() -> difyWorkflowService.run(request, appId)); } /** diff --git a/src/main/java/com/zsc/edu/dify/modules/dify/controller/SpiderController.java b/src/main/java/com/zsc/edu/dify/modules/dify/controller/SpiderController.java index 51bafed..5a773b8 100644 --- a/src/main/java/com/zsc/edu/dify/modules/dify/controller/SpiderController.java +++ b/src/main/java/com/zsc/edu/dify/modules/dify/controller/SpiderController.java @@ -6,6 +6,7 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.zsc.edu.dify.modules.dify.dto.SpiderDto; import jakarta.annotation.Resource; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; import org.springframework.http.HttpHeaders; import org.springframework.http.MediaType; import org.springframework.security.access.prepost.PreAuthorize; @@ -21,8 +22,11 @@ public class SpiderController { @Resource private ObjectMapper objectMapper; - private static final String SPIDER_URL = "http://47.112.173.8:6806/api/v1"; - private static final String API_KEY = "77c068fd-d5b6-4c33-97d8-db5511a09b26"; + @Value("${quanguo.url}") + private String SPIDER_URL; + + @Value("${quanguo.api-key}") + private String API_KEY; @PostMapping("/run") public JSONObject run(@RequestBody SpiderDto dto) throws JsonProcessingException { 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 35f02df..3095ef6 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 @@ -129,7 +129,7 @@ public class V1ChatController { String apiKey = appEntityService.getApikey(appId); String userId = SecurityUtil.getUserInfo().id.toString(); try{ - difyChat.deleteConversation(conversationId, apiKey,userId); + difyChat.deleteConversation(conversationId, apiKey, userId); }catch (RuntimeException e){ throw new ApiException("删除会话失败"+e.getMessage()); } 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 b8f8aa3..bf144c4 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 @@ -2,28 +2,37 @@ package com.zsc.edu.dify.modules.dify.controller; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.zsc.edu.dify.framework.mybatisplus.DataPermission; +import com.zsc.edu.dify.modules.dify.dto.WorkflowDeptDto; import com.zsc.edu.dify.modules.dify.entity.AppEntity; +import com.zsc.edu.dify.modules.dify.entity.WorkflowDept; import com.zsc.edu.dify.modules.dify.service.AppEntityService; +import com.zsc.edu.dify.modules.dify.service.WorkflowDeptService; 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; import io.github.guoshiqiufeng.dify.server.dto.response.DatasetApiKeyResponseVO; import jakarta.annotation.Resource; +import lombok.AllArgsConstructor; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.web.bind.annotation.*; +import java.util.ArrayList; import java.util.List; +@AllArgsConstructor @RestController @RequestMapping("/api/v1/server") public class V1ServerController { - @Resource private DifyServer difyServer; - @Resource + private AppEntityService appEntityService; + private final WorkflowDeptService workflowDeptService; + /** * 获取应用列表 * @param mode 模式 chat\agent-chat\completion\advanced-chat\workflow @@ -31,9 +40,8 @@ public class V1ServerController { * @return */ @GetMapping("/apps") - @DataPermission - public List getApps(String mode, String name) { - return appEntityService.getApps(mode, name); + public List getApps(String mode, String name, Integer type) { + return appEntityService.getApps(mode, name, type); } /** @@ -114,8 +122,21 @@ public class V1ServerController { * @return */ @GetMapping("/apps/type") - @DataPermission +// @DataPermission public List getAppsByAppType(Integer appType){ return appEntityService.selectByAppType(appType); } + + @PostMapping("/link") + public ResponseEntity link(@RequestBody WorkflowDeptDto workflowDeptDto) { + List workflowDepts = new ArrayList<>(); + for (Long deptId: workflowDeptDto.getDeptIds()) { + workflowDepts.add(new WorkflowDept(workflowDeptDto.getWorkflowId(), deptId)); + } + // 删除旧的关联关系 + workflowDeptService.remove(new LambdaQueryWrapper().eq(WorkflowDept::getWorkflowId, workflowDeptDto.getWorkflowId())); + return workflowDeptService.saveBatch(workflowDepts) ? + ResponseEntity.ok("关联成功") : + ResponseEntity.status(HttpStatus.BAD_REQUEST).body("关联失败"); + } } diff --git a/src/main/java/com/zsc/edu/dify/modules/dify/controller/WordController.java b/src/main/java/com/zsc/edu/dify/modules/dify/controller/WordController.java index 4908420..8101d5e 100644 --- a/src/main/java/com/zsc/edu/dify/modules/dify/controller/WordController.java +++ b/src/main/java/com/zsc/edu/dify/modules/dify/controller/WordController.java @@ -31,10 +31,10 @@ public class WordController { * 用户 id可以改为从上下文(token)获取, * apikey 建议在数据库进行存储,前端调用时传智能体 id,从数据库查询 */ - @PostMapping("/completions") + @PostMapping("/completions/{appId}") @OperationLogAnnotation(content = "'dify对话'", operationType = "发送") - public ChatMessageSendResponse sendChatMessage(@RequestBody ChatMessageSendRequest sendRequest){ - sendRequest.setApiKey(appEntityService.getApikey("baca08c1-e92b-4dc9-a445-3584803f54d4")); + public ChatMessageSendResponse sendChatMessage(@RequestBody ChatMessageSendRequest sendRequest, @PathVariable String appId){ + sendRequest.setApiKey(appEntityService.getApikey(appId)); sendRequest.setUserId(SecurityUtil.getUserInfo().id.toString()); return ExceptionUtil.difyException(()->difyChat.send(sendRequest)); } diff --git a/src/main/java/com/zsc/edu/dify/modules/dify/dto/WorkflowDeptDto.java b/src/main/java/com/zsc/edu/dify/modules/dify/dto/WorkflowDeptDto.java new file mode 100644 index 0000000..afe46f1 --- /dev/null +++ b/src/main/java/com/zsc/edu/dify/modules/dify/dto/WorkflowDeptDto.java @@ -0,0 +1,12 @@ +package com.zsc.edu.dify.modules.dify.dto; + +import jakarta.validation.constraints.NotNull; +import lombok.Data; + +@Data +public class WorkflowDeptDto { + @NotNull + private String workflowId; + @NotNull + private Long[] deptIds; +} diff --git a/src/main/java/com/zsc/edu/dify/modules/dify/entity/AppEntity.java b/src/main/java/com/zsc/edu/dify/modules/dify/entity/AppEntity.java index cbaedbb..be27d36 100644 --- a/src/main/java/com/zsc/edu/dify/modules/dify/entity/AppEntity.java +++ b/src/main/java/com/zsc/edu/dify/modules/dify/entity/AppEntity.java @@ -19,7 +19,6 @@ import java.util.Map; @EqualsAndHashCode(callSuper = true) @Getter @Setter -@Data @TableName("apps_entity") public class AppEntity extends AppsResponseVO { diff --git a/src/main/java/com/zsc/edu/dify/modules/dify/entity/WorkflowData.java b/src/main/java/com/zsc/edu/dify/modules/dify/entity/WorkflowData.java index 28dedcd..04f0b01 100644 --- a/src/main/java/com/zsc/edu/dify/modules/dify/entity/WorkflowData.java +++ b/src/main/java/com/zsc/edu/dify/modules/dify/entity/WorkflowData.java @@ -14,7 +14,6 @@ import lombok.Setter; @Getter @Setter -@Data @TableName("workflow_data") public class WorkflowData{ @TableId diff --git a/src/main/java/com/zsc/edu/dify/modules/dify/entity/WorkflowDept.java b/src/main/java/com/zsc/edu/dify/modules/dify/entity/WorkflowDept.java new file mode 100644 index 0000000..294183c --- /dev/null +++ b/src/main/java/com/zsc/edu/dify/modules/dify/entity/WorkflowDept.java @@ -0,0 +1,12 @@ +package com.zsc.edu.dify.modules.dify.entity; + +import lombok.*; + +@Getter +@Setter +@AllArgsConstructor +@NoArgsConstructor +public class WorkflowDept { + private String workflowId; + private Long deptId; +} diff --git a/src/main/java/com/zsc/edu/dify/modules/dify/repo/AppEntityRepository.java b/src/main/java/com/zsc/edu/dify/modules/dify/repo/AppEntityRepository.java index 4cb1182..dbd2172 100644 --- a/src/main/java/com/zsc/edu/dify/modules/dify/repo/AppEntityRepository.java +++ b/src/main/java/com/zsc/edu/dify/modules/dify/repo/AppEntityRepository.java @@ -2,10 +2,15 @@ package com.zsc.edu.dify.modules.dify.repo; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.zsc.edu.dify.modules.dify.entity.AppEntity; +import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Select; +import java.util.List; + public interface AppEntityRepository extends BaseMapper { @Select("select api_key from apps_entity where id = #{appId}") String selectApiKey(String appId); + + List selectByAppType(@Param("deptId") Long deptId, @Param("appType") Integer appType); } diff --git a/src/main/java/com/zsc/edu/dify/modules/dify/repo/WorkflowDeptRepository.java b/src/main/java/com/zsc/edu/dify/modules/dify/repo/WorkflowDeptRepository.java new file mode 100644 index 0000000..b9a758c --- /dev/null +++ b/src/main/java/com/zsc/edu/dify/modules/dify/repo/WorkflowDeptRepository.java @@ -0,0 +1,7 @@ +package com.zsc.edu.dify.modules.dify.repo; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.zsc.edu.dify.modules.dify.entity.WorkflowDept; + +public interface WorkflowDeptRepository extends BaseMapper { +} diff --git a/src/main/java/com/zsc/edu/dify/modules/dify/service/AppEntityService.java b/src/main/java/com/zsc/edu/dify/modules/dify/service/AppEntityService.java index e2c9399..ad6dc2a 100644 --- a/src/main/java/com/zsc/edu/dify/modules/dify/service/AppEntityService.java +++ b/src/main/java/com/zsc/edu/dify/modules/dify/service/AppEntityService.java @@ -2,12 +2,11 @@ package com.zsc.edu.dify.modules.dify.service; import com.baomidou.mybatisplus.extension.service.IService; import com.zsc.edu.dify.modules.dify.entity.AppEntity; -import io.github.guoshiqiufeng.dify.server.dto.response.AppsResponseVO; import java.util.List; public interface AppEntityService extends IService { - List getApps(String mode, String name); + List getApps(String mode, String name, Integer appType); boolean enabledApp(String id); diff --git a/src/main/java/com/zsc/edu/dify/modules/dify/service/Impl/AppEntityServiceImpl.java b/src/main/java/com/zsc/edu/dify/modules/dify/service/Impl/AppEntityServiceImpl.java index 2cdc6a2..de99b4c 100644 --- a/src/main/java/com/zsc/edu/dify/modules/dify/service/Impl/AppEntityServiceImpl.java +++ b/src/main/java/com/zsc/edu/dify/modules/dify/service/Impl/AppEntityServiceImpl.java @@ -3,9 +3,12 @@ package com.zsc.edu.dify.modules.dify.service.Impl; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.zsc.edu.dify.exception.ConstraintException; +import com.zsc.edu.dify.framework.security.SecurityUtil; import com.zsc.edu.dify.modules.dify.entity.AppEntity; +import com.zsc.edu.dify.modules.dify.entity.WorkflowDept; import com.zsc.edu.dify.modules.dify.mapper.AppEntityMapper; import com.zsc.edu.dify.modules.dify.repo.AppEntityRepository; +import com.zsc.edu.dify.modules.dify.repo.WorkflowDeptRepository; import com.zsc.edu.dify.modules.dify.service.AppEntityService; import io.github.guoshiqiufeng.dify.server.DifyServer; import io.github.guoshiqiufeng.dify.server.dto.response.ApiKeyResponseVO; @@ -14,6 +17,7 @@ import jakarta.annotation.Resource; import lombok.AllArgsConstructor; import org.springframework.cache.annotation.Cacheable; import org.springframework.stereotype.Service; +import org.springframework.util.StringUtils; import java.util.*; @@ -23,16 +27,23 @@ import java.util.*; @AllArgsConstructor @Service public class AppEntityServiceImpl extends ServiceImpl implements AppEntityService { - @Resource - private AppEntityMapper appEntityMapper; - @Resource - private DifyServer difyServer; - @Resource - private AppEntityRepository appEntityRepository; + + private final AppEntityMapper appEntityMapper; + + private final DifyServer difyServer; + + private final AppEntityRepository appEntityRepository; + + private final WorkflowDeptRepository workflowDeptRepository; + @Override - public List getApps(String mode, String name) { - return addApps(difyServer.apps(mode, name)); + public List getApps(String mode, String name, Integer type) { + return this.lambdaQuery() + .eq(StringUtils.hasText(mode), AppEntity::getMode, mode) + .eq(StringUtils.hasText(name), AppEntity::getName, name) + .eq(Objects.nonNull(type), AppEntity::getAppType, type) + .list(); } /** @@ -97,17 +108,8 @@ public class AppEntityServiceImpl extends ServiceImpl selectByAppType(Integer appType) { - return this.lambdaQuery() - .eq(AppEntity::getAppType, appType) - .list(); + Long deptId = SecurityUtil.getUserInfo().getDept().getId(); + return baseMapper.selectByAppType(deptId, appType); } -} - - - - - - - - +} \ No newline at end of file diff --git a/src/main/java/com/zsc/edu/dify/modules/dify/service/Impl/WorkflowDeptServiceImpl.java b/src/main/java/com/zsc/edu/dify/modules/dify/service/Impl/WorkflowDeptServiceImpl.java new file mode 100644 index 0000000..ab34f5e --- /dev/null +++ b/src/main/java/com/zsc/edu/dify/modules/dify/service/Impl/WorkflowDeptServiceImpl.java @@ -0,0 +1,11 @@ +package com.zsc.edu.dify.modules.dify.service.Impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.zsc.edu.dify.modules.dify.entity.WorkflowDept; +import com.zsc.edu.dify.modules.dify.repo.WorkflowDeptRepository; +import com.zsc.edu.dify.modules.dify.service.WorkflowDeptService; +import org.springframework.stereotype.Service; + +@Service +public class WorkflowDeptServiceImpl extends ServiceImpl implements WorkflowDeptService { +} diff --git a/src/main/java/com/zsc/edu/dify/modules/dify/service/WorkflowDeptService.java b/src/main/java/com/zsc/edu/dify/modules/dify/service/WorkflowDeptService.java new file mode 100644 index 0000000..115f5c5 --- /dev/null +++ b/src/main/java/com/zsc/edu/dify/modules/dify/service/WorkflowDeptService.java @@ -0,0 +1,7 @@ +package com.zsc.edu.dify.modules.dify.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.zsc.edu.dify.modules.dify.entity.WorkflowDept; + +public interface WorkflowDeptService extends IService { +} diff --git a/src/main/resources/application-dev.yml b/src/main/resources/application-dev.yml index 202dbc6..e794550 100644 --- a/src/main/resources/application-dev.yml +++ b/src/main/resources/application-dev.yml @@ -59,6 +59,10 @@ spring: socketFactoryClass: javax.net.ssl.SSLSocketFactory #表示开启 DEBUG 模式,这样,邮件发送过程的日志会在控制台打印出来,方便排查错误 debug: true + http: + client: + connect-timeout: 1800000 + read-timeout: 1800000 storage: attachment: ./storage/attachment @@ -70,9 +74,16 @@ jwt: dify: url: http://47.112.173.8:6800/ # 请替换为实际的 Dify 服务地址 +# url: http://172.16.35.190 # 请替换为实际的 Dify 服务地址 server: email: 2913129173@qq.com # 请替换为实际的 Dify 服务邮箱,若不需要调用 server相关接口可不填 password: tian14384, # 请替换为实际的 Dify 服务密码,若不需要调用 server相关接口可不填 +# email: admin@admin.com # 请替换为实际的 Dify 服务邮箱,若不需要调用 server相关接口可不填 +# password: Anheng@keji_777 # 请替换为实际的 Dify 服务密码,若不需要调用 server相关接口可不填 dataset: api-key: dataset-kN5WTJ8jR877YfN1A34JceVg # 请替换为实际的知识库api-key, 若不需要调用知识库可不填 +quanguo: + url: http://${QUANGUO_HOST:47.112.173.8:6806/api/v1} + api-key: ${QUANGUO_API_KEY:77c068fd-d5b6-4c33-97d8-db5511a09b26} + diff --git a/src/main/resources/application-prod.yml b/src/main/resources/application-prod.yml index 970d1a8..73d6981 100644 --- a/src/main/resources/application-prod.yml +++ b/src/main/resources/application-prod.yml @@ -3,21 +3,35 @@ server: mybatis-plus: type-aliases-package: com.zsc.edu.dify.modules.*.entity - mapper-locations: classpath:mappers/*/*.xml + mapper-locations: classpath*:mappers/*/*.xml type-handlers-package: com.zsc.edu.dify.framework.mybatisplus configuration: log-impl: org.apache.ibatis.logging.stdout.StdOutImpl + default-enum-type-handler: com.baomidou.mybatisplus.core.handlers.MybatisEnumTypeHandler + map-underscore-to-camel-case: true spring: datasource: - url: jdbc:postgresql://localhost:5432/gateway?ssl=false&TimeZone=Asia/Shanghai + url: jdbc:postgresql://${POSTGRES_HOST:postgres}:5432/dify?ssl=false&TimeZone=Asia/Shanghai username: postgres - password: 123456 + password: postgres driver-class-name: org.postgresql.Driver + hikari: + max-lifetime: 1800000 + idle-timeout: 600000 + validation-timeout: 5000 + data: + redis: + host: 43.139.10.64 + port: 16379 + password: servlet: multipart: max-file-size: 40MB max-request-size: 40MB + jackson: + # 属性为空不序列化 + default-property-inclusion: non_null mail: # 配置 SMTP 服务器地址 host: smtp.qq.com @@ -33,10 +47,29 @@ spring: properties: mail: smtp: + auth: true + starttls: + enable: true socketFactoryClass: javax.net.ssl.SSLSocketFactory #表示开启 DEBUG 模式,这样,邮件发送过程的日志会在控制台打印出来,方便排查错误 debug: true + storage: attachment: ./storage/attachment temp: ./storage/temp +jwt: + secret: your_secret_key_here + expiration: 3600 + +dify: + url: http://${DIFY_HOST:localhost}/ # 请替换为实际的 Dify 服务地址 + server: + email: ${DIFY_EMAIL:admin@admin.com} # 请替换为实际的 Dify 服务邮箱,若不需要调用 server相关接口可不填 + password: ${DIFY_PASSWORD:Anheng@keji_777} # 请替换为实际的 Dify 服务密码,若不需要调用 server相关接口可不填 + dataset: + api-key: ${DIFY_DATASET_API_KEY:dataset-kN5WTJ8jR877YfN1A34JceVg} # 请替换为实际的知识库api-key, 若不需要调用知识库可不填 + +guangzhou: + url: ${GUANGZHOU_HOST:http://47.112.173.8:6806/api/v1} + api-key: ${GUANGZHOU_API_KEY:ed01e58b-c537-4837-9907-8d9bec2efa55} \ No newline at end of file diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 74d59ea..1396ae8 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -1,6 +1,6 @@ spring: profiles: - active: dev + active: ${PROF_ACTIVE:dev} docker: compose: enabled: false diff --git a/src/main/resources/mappers/dify/AppEntityRepository.xml b/src/main/resources/mappers/dify/AppEntityRepository.xml new file mode 100644 index 0000000..bb8682f --- /dev/null +++ b/src/main/resources/mappers/dify/AppEntityRepository.xml @@ -0,0 +1,20 @@ + + + + + + + \ No newline at end of file diff --git a/src/test/java/com/zsc/edu/dify/modules/dify/repo/AppEntityRepositoryTest.java b/src/test/java/com/zsc/edu/dify/modules/dify/repo/AppEntityRepositoryTest.java new file mode 100644 index 0000000..4eed5b1 --- /dev/null +++ b/src/test/java/com/zsc/edu/dify/modules/dify/repo/AppEntityRepositoryTest.java @@ -0,0 +1,18 @@ +package com.zsc.edu.dify.modules.dify.repo; + +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; + +import static org.junit.jupiter.api.Assertions.*; + +@SpringBootTest +class AppEntityRepositoryTest { + + @Autowired + private AppEntityRepository appEntityRepository; + @Test + void selectByAppType() { + appEntityRepository.selectByAppType(1L, 1); + } +} \ No newline at end of file