result = new HashMap<>();
-
- try {
- // 检查数据源配置
- result.put("devops_datasource_class", devopsDataSource.getClass().getSimpleName());
- result.put("youfool_datasource_class", youfoolDataSource.getClass().getSimpleName());
-
- // 测试两个数据源是否指向同一个数据库
- try (Connection devopsConn = devopsDataSource.getConnection();
- Connection youfoolConn = youfoolDataSource.getConnection()) {
-
- result.put("devops_url", devopsConn.getMetaData().getURL());
- result.put("youfool_url", youfoolConn.getMetaData().getURL());
- result.put("same_database", devopsConn.getMetaData().getURL().equals(youfoolConn.getMetaData().getURL()));
- }
-
- result.put("success", true);
-
- } catch (Exception e) {
- log.error("MyBatis数据源测试失败", e);
- result.put("success", false);
- result.put("message", "测试失败: " + e.getMessage());
- }
-
- return result;
- }
-}
\ No newline at end of file
diff --git a/src/main/java/com/chinaweal/youfool/devops/base/mapper/DictMapper.java b/src/main/java/com/chinaweal/youfool/devops/base/mapper/DictMapper.java
index e6e7f58..0890393 100644
--- a/src/main/java/com/chinaweal/youfool/devops/base/mapper/DictMapper.java
+++ b/src/main/java/com/chinaweal/youfool/devops/base/mapper/DictMapper.java
@@ -1,8 +1,7 @@
package com.chinaweal.youfool.devops.base.mapper;
-import com.chinaweal.youfool.devops.base.entity.Dict;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
-import org.springframework.stereotype.Repository;
+import com.chinaweal.youfool.devops.base.entity.Dict;
/**
*
@@ -12,7 +11,6 @@ import org.springframework.stereotype.Repository;
* @author chinaweal
* @since 2020-07-07
*/
-@Repository("devopsDictMapper")
public interface DictMapper extends BaseMapper {
}
diff --git a/src/main/java/com/chinaweal/youfool/devops/base/service/impl/DictServiceImpl.java b/src/main/java/com/chinaweal/youfool/devops/base/service/impl/DictServiceImpl.java
index fd09a32..c5f3812 100644
--- a/src/main/java/com/chinaweal/youfool/devops/base/service/impl/DictServiceImpl.java
+++ b/src/main/java/com/chinaweal/youfool/devops/base/service/impl/DictServiceImpl.java
@@ -25,7 +25,7 @@ import java.util.List;
* @since 2020-07-07
*/
@Service("devopsDictServiceImpl")
-@Transactional("devopsTransactionManager")
+//@Transactional("devopsTransactionManager")
public class DictServiceImpl extends ServiceImpl implements IDictService {
@Override
diff --git a/src/main/java/com/chinaweal/youfool/devops/config/DatabaseHealthChecker.java b/src/main/java/com/chinaweal/youfool/devops/config/DatabaseHealthChecker.java
deleted file mode 100644
index bf1e96d..0000000
--- a/src/main/java/com/chinaweal/youfool/devops/config/DatabaseHealthChecker.java
+++ /dev/null
@@ -1,194 +0,0 @@
-package com.chinaweal.youfool.devops.config;
-
-import com.chinaweal.youfool.devops.common.utils.ErrorLogUtils;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Qualifier;
-import org.springframework.boot.ApplicationArguments;
-import org.springframework.boot.ApplicationRunner;
-import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
-import org.springframework.stereotype.Component;
-
-import javax.sql.DataSource;
-import java.sql.Connection;
-import java.sql.PreparedStatement;
-import java.sql.ResultSet;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-/**
- * 数据库健康检查组件
- * 在应用启动时检查数据库连接状态
- * 支持配置开关控制
- */
-@Component
-@ConditionalOnProperty(name = "error-log.database-enabled", havingValue = "true", matchIfMissing = true)
-@Slf4j
-public class DatabaseHealthChecker implements ApplicationRunner {
-
- @Autowired
- private ErrorLogProperties errorLogProperties;
-
- @Autowired
- @Qualifier("devopsDS")
- private DataSource devopsDataSource;
-
- @Autowired
- @Qualifier("youfoolDS")
- private DataSource youfoolDataSource;
-
- @Override
- public void run(ApplicationArguments args) {
- // 检查是否启用了数据库健康检查
- if (errorLogProperties == null || !errorLogProperties.isEnabled() || !errorLogProperties.isDatabaseEnabled()) {
- log.info("数据库健康检查已禁用");
- return;
- }
-
- log.info("开始数据库健康检查...");
- ErrorLogUtils.logStartupInfo("开始数据库健康检查");
-
- List checkResults = new ArrayList<>();
- boolean allHealthy = true;
-
- // 检查DevOps数据源
- boolean devopsHealthy = checkDataSource("devopsDS", devopsDataSource);
- checkResults.add("DevOps数据源: " + (devopsHealthy ? "正常" : "异常"));
- if (!devopsHealthy) allHealthy = false;
-
- // 检查YouFool数据源
- boolean youfoolHealthy = checkDataSource("youfoolDS", youfoolDataSource);
- checkResults.add("YouFool数据源: " + (youfoolHealthy ? "正常" : "异常"));
- if (!youfoolHealthy) allHealthy = false;
-
- // 记录检查结果
- String resultSummary = "数据库健康检查完成 - " +
- (allHealthy ? "所有数据源正常" : "存在异常数据源");
-
- log.info("数据库健康检查结果:");
- for (String result : checkResults) {
- log.info(" - {}", result);
- }
-
- ErrorLogUtils.logStartupInfo(resultSummary + ": " + String.join(", ", checkResults));
-
- if (!allHealthy) {
- log.warn("数据库健康检查发现问题,请检查数据库配置和连接状态");
- }
- }
-
- /**
- * 检查单个数据源的健康状态
- */
- private boolean checkDataSource(String dataSourceName, DataSource dataSource) {
- try {
- log.debug("检查数据源: {}", dataSourceName);
-
- try (Connection connection = dataSource.getConnection()) {
- // 检查连接是否有效
- if (connection == null || connection.isClosed()) {
- log.error("数据源 {} 连接无效", dataSourceName);
- ErrorLogUtils.saveDatabaseError(dataSourceName + "连接无效",
- new RuntimeException("数据库连接为null或已关闭"));
- return false;
- }
-
- // 执行简单查询测试连接
- try (PreparedStatement ps = connection.prepareStatement("SELECT 1");
- ResultSet rs = ps.executeQuery()) {
-
- if (rs.next() && rs.getInt(1) == 1) {
- log.debug("数据源 {} 连接测试成功", dataSourceName);
-
- // 获取数据库基本信息
- String dbInfo = getDatabaseInfo(connection);
- log.info("数据源 {} 信息: {}", dataSourceName, dbInfo);
- ErrorLogUtils.logStartupInfo(dataSourceName + " 连接成功 - " + dbInfo);
-
- return true;
- } else {
- log.error("数据源 {} 查询测试失败", dataSourceName);
- ErrorLogUtils.saveDatabaseError(dataSourceName + "查询测试失败",
- new RuntimeException("SELECT 1 查询返回异常结果"));
- return false;
- }
- }
-
- }
- } catch (Exception e) {
- log.error("数据源 {} 健康检查失败", dataSourceName, e);
- ErrorLogUtils.saveDatabaseError(dataSourceName + "健康检查失败", e);
- return false;
- }
- }
-
- /**
- * 获取数据库基本信息
- */
- private String getDatabaseInfo(Connection connection) {
- try {
- String dbName = connection.getMetaData().getDatabaseProductName();
- String dbVersion = connection.getMetaData().getDatabaseProductVersion();
- String driverName = connection.getMetaData().getDriverName();
- String driverVersion = connection.getMetaData().getDriverVersion();
- String url = connection.getMetaData().getURL();
- String userName = connection.getMetaData().getUserName();
-
- return String.format("%s %s (Driver: %s %s, URL: %s, User: %s)",
- dbName, dbVersion, driverName, driverVersion, url, userName);
- } catch (Exception e) {
- log.warn("获取数据库信息失败", e);
- return "无法获取数据库信息";
- }
- }
-
- /**
- * 手动触发数据库健康检查(供其他组件调用)
- */
- public boolean performHealthCheck() {
- // 检查是否启用了数据库健康检查
- if (errorLogProperties == null || !errorLogProperties.isEnabled() || !errorLogProperties.isDatabaseEnabled()) {
- log.warn("数据库健康检查已禁用,跳过手动检查");
- return true; // 返回true表示没有问题(因为检查被禁用)
- }
-
- log.info("手动触发数据库健康检查");
-
- boolean devopsHealthy = checkDataSource("devopsDS", devopsDataSource);
- boolean youfoolHealthy = checkDataSource("youfoolDS", youfoolDataSource);
-
- boolean allHealthy = devopsHealthy && youfoolHealthy;
-
- String result = "手动健康检查结果: DevOps=" +
- (devopsHealthy ? "正常" : "异常") + ", YouFool=" +
- (youfoolHealthy ? "正常" : "异常");
-
- log.info(result);
- ErrorLogUtils.logStartupInfo(result);
-
- return allHealthy;
- }
-
- /**
- * 检查数据库健康状态(别名方法,用于SystemStatusTool等)
- */
- public boolean checkDatabaseHealth() {
- return performHealthCheck();
- }
-
- /**
- * 获取健康检查配置状态
- */
- public Map getHealthCheckStatus() {
- Map status = new HashMap<>();
- status.put("enabled", errorLogProperties != null &&
- errorLogProperties.isEnabled() &&
- errorLogProperties.isDatabaseEnabled());
- status.put("errorLogEnabled", errorLogProperties != null && errorLogProperties.isEnabled());
- status.put("databaseCheckEnabled", errorLogProperties != null && errorLogProperties.isDatabaseEnabled());
-
- return status;
- }
-}
\ No newline at end of file
diff --git a/src/main/java/com/chinaweal/youfool/devops/config/DevopsDataSource.java b/src/main/java/com/chinaweal/youfool/devops/config/DevopsDataSource.java
index 2f8613b..b50ada4 100644
--- a/src/main/java/com/chinaweal/youfool/devops/config/DevopsDataSource.java
+++ b/src/main/java/com/chinaweal/youfool/devops/config/DevopsDataSource.java
@@ -6,14 +6,15 @@ import com.chinaweal.youfool.framework.springboot.mybatis.plus.CommonMetaObjectH
import org.apache.commons.lang3.ArrayUtils;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Primary;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import javax.sql.DataSource;
+
/**
* 运维模块的数据源
*
@@ -21,14 +22,15 @@ import javax.sql.DataSource;
*/
@Configuration
-@MapperScan(basePackages = {"com.chinaweal.youfool.devops.repair.**.mapper", "com.chinaweal.youfool.devops.base.**.mapper", "com.chinaweal.youfool.devops.leaderassign.**.mapper", "com.chinaweal.youfool.devops.org.mapper", "com.chinaweal.youfool.devops.ai.**.mapper"}, sqlSessionTemplateRef = "devopsSqlSessionTemplate")
+@MapperScan(basePackages = {"com.chinaweal.youfool.framework.springboot.cms.**.mapper", "com.chinaweal.youfool.devops.**.mapper"})
public class DevopsDataSource {
@Autowired
private CommonMetaObjectHandler commonMetaObjectHandler;
- @Bean(name = "devopsSqlSessionFactory")
- public MybatisSqlSessionFactoryBean sqlSessionFactory(@Qualifier("devopsDS") DataSource dataSource) throws Exception {
+ @Bean
+ @Primary
+ public MybatisSqlSessionFactoryBean sqlSessionFactory(DataSource dataSource) throws Exception {
MybatisSqlSessionFactoryBean bean = new MybatisSqlSessionFactoryBean();
bean.setDataSource(dataSource);
GlobalConfig globalConfig = new GlobalConfig();
diff --git a/src/main/java/com/chinaweal/youfool/devops/config/FilterConfig.java b/src/main/java/com/chinaweal/youfool/devops/config/FilterConfig.java
index 4ecad03..6579a56 100644
--- a/src/main/java/com/chinaweal/youfool/devops/config/FilterConfig.java
+++ b/src/main/java/com/chinaweal/youfool/devops/config/FilterConfig.java
@@ -1,9 +1,5 @@
package com.chinaweal.youfool.devops.config;
-import com.chinaweal.youfool.framework.springboot.filter.RepeatlyReadFilter;
-import com.chinaweal.youfool.framework.springboot.filter.RestLogFilter;
-import org.springframework.boot.web.servlet.FilterRegistrationBean;
-import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
@@ -11,29 +7,4 @@ import org.springframework.context.annotation.Configuration;
*/
@Configuration
public class FilterConfig {
- /**
- * 日志记录过滤器
- */
- @Bean
- public FilterRegistrationBean restLogFilter() {
- FilterRegistrationBean registrationBean = new FilterRegistrationBean<>();
- registrationBean.setFilter(new RestLogFilter());
- registrationBean.addUrlPatterns("/*");
- registrationBean.setName("restLogFilter");
- registrationBean.setOrder(-99);
- return registrationBean;
- }
-
- /**
- * 开启重复读取request流,用于日志
- */
- @Bean
- public FilterRegistrationBean repeatlyReadFilter() {
- FilterRegistrationBean registrationBean = new FilterRegistrationBean<>();
- registrationBean.setFilter(new RepeatlyReadFilter());
- registrationBean.addUrlPatterns("/*");
- registrationBean.setName("repeatlyReadFilter");
- registrationBean.setOrder(-100);
- return registrationBean;
- }
}
diff --git a/src/main/java/com/chinaweal/youfool/devops/config/YoufoolDataSource.java b/src/main/java/com/chinaweal/youfool/devops/config/YoufoolDataSource.java
deleted file mode 100644
index 98b5991..0000000
--- a/src/main/java/com/chinaweal/youfool/devops/config/YoufoolDataSource.java
+++ /dev/null
@@ -1,59 +0,0 @@
-//package com.chinaweal.youfool.devops.config;
-//
-//import com.alibaba.druid.pool.DruidDataSource;
-//import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceBuilder;
-//import com.baomidou.mybatisplus.core.config.GlobalConfig;
-//import com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean;
-//import com.chinaweal.youfool.framework.springboot.mybatis.plus.CommonMetaObjectHandler;
-//import org.apache.ibatis.session.SqlSessionFactory;
-//import org.mybatis.spring.SqlSessionTemplate;
-//import org.mybatis.spring.annotation.MapperScan;
-//import org.springframework.beans.factory.annotation.Qualifier;
-//import org.springframework.boot.context.properties.ConfigurationProperties;
-//import org.springframework.context.annotation.Bean;
-//import org.springframework.context.annotation.Configuration;
-//import org.springframework.core.io.ClassPathResource;
-//import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
-//import org.springframework.jdbc.datasource.DataSourceTransactionManager;
-//
-//import javax.sql.DataSource;
-//
-///**
-// * youfool基础的数据源
-// *
-// * @author itluck
-// */
-//
-//@Configuration
-//@MapperScan(basePackages = "com.chinaweal.youfool.framework.springboot.**.mapper", sqlSessionTemplateRef = "youfoolSqlSessionTemplate")
-//public class YoufoolDataSource {
-//
-//
-// @Bean(name = "youfoolDS", initMethod = "init", destroyMethod = "close")
-// @ConfigurationProperties(prefix = "spring.datasource.youfool")
-// public DruidDataSource dataSource() {
-// return DruidDataSourceBuilder.create().build();
-// }
-//
-// @Bean(name = "youfoolSqlSessionFactory")
-// public MybatisSqlSessionFactoryBean sqlSessionFactory(@Qualifier("youfoolDS") DataSource dataSource) throws Exception {
-// MybatisSqlSessionFactoryBean bean = new MybatisSqlSessionFactoryBean();
-// bean.setDataSource(dataSource);
-// GlobalConfig globalConfig = new GlobalConfig();
-// globalConfig.setMetaObjectHandler(new CommonMetaObjectHandler());
-// bean.setGlobalConfig(globalConfig);
-// bean.setConfigLocation(new ClassPathResource("youfool/mybatis/mybatis-config.xml"));
-// bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath*:youfool/mybatis/mapper/**/*.xml"));
-// return bean;
-// }
-//
-// @Bean(name = "youfoolTransactionManager")
-// public DataSourceTransactionManager transactionManager(@Qualifier("youfoolDS") DataSource dataSource) {
-// return new DataSourceTransactionManager(dataSource);
-// }
-//
-// @Bean(name = "youfoolSqlSessionTemplate")
-// public SqlSessionTemplate sqlSessionTemplate(@Qualifier("youfoolSqlSessionFactory") SqlSessionFactory sqlSessionFactory) {
-// return new SqlSessionTemplate(sqlSessionFactory);
-// }
-//}
diff --git a/src/main/java/com/chinaweal/youfool/devops/websocket/server/BusinessSysServer.java b/src/main/java/com/chinaweal/youfool/devops/websocket/server/BusinessSysServer.java
index fc5b62f..0623e65 100644
--- a/src/main/java/com/chinaweal/youfool/devops/websocket/server/BusinessSysServer.java
+++ b/src/main/java/com/chinaweal/youfool/devops/websocket/server/BusinessSysServer.java
@@ -1,13 +1,11 @@
package com.chinaweal.youfool.devops.websocket.server;
+import jakarta.websocket.*;
+import jakarta.websocket.server.PathParam;
+import jakarta.websocket.server.ServerEndpoint;
import lombok.extern.slf4j.Slf4j;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
-import javax.websocket.*;
-import javax.websocket.server.PathParam;
-import javax.websocket.server.ServerEndpoint;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
@@ -18,13 +16,11 @@ import java.util.concurrent.ConcurrentHashMap;
*
* @author
*/
+@Slf4j
@ServerEndpoint("/websocket/businessSys/{userId}")
@Component
-@Slf4j
public class BusinessSysServer {
- private static final Logger log = LoggerFactory.getLogger(BusinessSysServer.class);
-
/**
* 存储起来,一个用户账号可能多页面打开,存储列表
*/
diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml
index 9416e51..506a957 100644
--- a/src/main/resources/application.yml
+++ b/src/main/resources/application.yml
@@ -45,6 +45,11 @@ spring:
max-request-size: 100MB
# Spring AI Configuration for Alibaba Qwen/DashScope
ai:
+ dashscope:
+ api-key: ${DASHSCOPE_API_KEY:sk-288824ef003e4e02bb963b8b3024b06a}
+ chat:
+ options:
+ model: ${QW_MODEL:qwen-plus}
openai:
# DashScope API configuration (OpenAI-compatible)
base-url: https://dashscope.aliyuncs.com/compatible-mode/v1