eventRegistryEventConsumers = new HashMap<>();
-
- // MYBATIS SQL SESSION FACTORY /////////////////////////////////////
-
- protected boolean isDbHistoryUsed = true;
- protected DbSqlSessionFactory dbSqlSessionFactory;
- protected SqlSessionFactory sqlSessionFactory;
- protected TransactionFactory transactionFactory;
- protected TransactionContextFactory transactionContextFactory;
-
- /**
- * If set to true, enables bulk insert (grouping sql inserts together). Default true.
- * For some databases (eg DB2+z/OS) needs to be set to false.
- */
- protected boolean isBulkInsertEnabled = true;
-
- /**
- * Some databases have a limit of how many parameters one sql insert can have (eg SQL Server, 2000 params (!= insert statements) ). Tweak this parameter in case of exceptions indicating too much
- * is being put into one bulk insert, or make it higher if your database can cope with it and there are inserts with a huge amount of data.
- *
- * By default: 100 (55 for mssql server as it has a hard limit of 2000 parameters in a statement)
- */
- protected int maxNrOfStatementsInBulkInsert = 100;
-
- public int DEFAULT_MAX_NR_OF_STATEMENTS_BULK_INSERT_SQL_SERVER = 55; // currently Execution has most params (35). 2000 / 35 = 57.
-
- protected String mybatisMappingFile;
- protected Set> customMybatisMappers;
- protected Set customMybatisXMLMappers;
- protected List customMybatisInterceptors;
-
- protected Set dependentEngineMyBatisXmlMappers;
- protected List dependentEngineMybatisTypeAliasConfigs;
- protected List dependentEngineMybatisTypeHandlerConfigs;
-
- // SESSION FACTORIES ///////////////////////////////////////////////
- protected List customSessionFactories;
- protected Map, SessionFactory> sessionFactories;
-
- protected boolean enableEventDispatcher = true;
- protected FlowableEventDispatcher eventDispatcher;
- protected List eventListeners;
- protected Map> typedEventListeners;
- protected List additionalEventDispatchActions;
-
- protected LoggingListener loggingListener;
-
- protected boolean transactionsExternallyManaged;
-
- /**
- * Flag that can be set to configure or not a relational database is used. This is useful for custom implementations that do not use relational databases at all.
- *
- * If true (default), the {@link AbstractEngineConfiguration#getDatabaseSchemaUpdate()} value will be used to determine what needs to happen wrt the database schema.
- *
- * If false, no validation or schema creation will be done. That means that the database schema must have been created 'manually' before but the engine does not validate whether the schema is
- * correct. The {@link AbstractEngineConfiguration#getDatabaseSchemaUpdate()} value will not be used.
- */
- protected boolean usingRelationalDatabase = true;
-
- /**
- * Flag that can be set to configure whether or not a schema is used. This is useful for custom implementations that do not use relational databases at all.
- * Setting {@link #usingRelationalDatabase} to true will automatically imply using a schema.
- */
- protected boolean usingSchemaMgmt = true;
-
- /**
- * Allows configuring a database table prefix which is used for all runtime operations of the process engine. For example, if you specify a prefix named 'PRE1.', Flowable will query for executions
- * in a table named 'PRE1.ACT_RU_EXECUTION_'.
- *
- *
- * NOTE: the prefix is not respected by automatic database schema management. If you use {@link AbstractEngineConfiguration#DB_SCHEMA_UPDATE_CREATE_DROP} or
- * {@link AbstractEngineConfiguration#DB_SCHEMA_UPDATE_TRUE}, Flowable will create the database tables using the default names, regardless of the prefix configured here.
- */
- protected String databaseTablePrefix = "";
-
- /**
- * Escape character for doing wildcard searches.
- *
- * This will be added at then end of queries that include for example a LIKE clause. For example: SELECT * FROM table WHERE column LIKE '%\%%' ESCAPE '\';
- */
- protected String databaseWildcardEscapeCharacter;
-
- /**
- * database catalog to use
- */
- protected String databaseCatalog = "";
-
- /**
- * In some situations you want to set the schema to use for table checks / generation if the database metadata doesn't return that correctly, see https://jira.codehaus.org/browse/ACT-1220,
- * https://jira.codehaus.org/browse/ACT-1062
- */
- protected String databaseSchema;
-
- /**
- * Set to true in case the defined databaseTablePrefix is a schema-name, instead of an actual table name prefix. This is relevant for checking if Flowable-tables exist, the databaseTablePrefix
- * will not be used here - since the schema is taken into account already, adding a prefix for the table-check will result in wrong table-names.
- */
- protected boolean tablePrefixIsSchema;
-
- /**
- * Set to true if the latest version of a definition should be retrieved, ignoring a possible parent deployment id value
- */
- protected boolean alwaysLookupLatestDefinitionVersion;
-
- /**
- * Set to true if by default lookups should fallback to the default tenant (an empty string by default or a defined tenant value)
- */
- protected boolean fallbackToDefaultTenant;
-
- /**
- * Default tenant provider that is executed when looking up definitions, in case the global or local fallback to default tenant value is true
- */
- protected DefaultTenantProvider defaultTenantProvider = (tenantId, scope, scopeKey) -> NO_TENANT_ID;
-
- /**
- * Enables the MyBatis plugin that logs the execution time of sql statements.
- */
- protected boolean enableLogSqlExecutionTime;
-
- protected Properties databaseTypeMappings = getDefaultDatabaseTypeMappings();
-
- /**
- * Duration between the checks when acquiring a lock.
- */
- protected Duration lockPollRate = Duration.ofSeconds(10);
-
- /**
- * Duration to wait for the DB Schema lock before giving up.
- */
- protected Duration schemaLockWaitTime = Duration.ofMinutes(5);
-
- // DATA MANAGERS //////////////////////////////////////////////////////////////////
-
- protected PropertyDataManager propertyDataManager;
- protected ByteArrayDataManager byteArrayDataManager;
- protected TableDataManager tableDataManager;
-
- // ENTITY MANAGERS ////////////////////////////////////////////////////////////////
-
- protected PropertyEntityManager propertyEntityManager;
- protected ByteArrayEntityManager byteArrayEntityManager;
-
- protected List customPreDeployers;
- protected List customPostDeployers;
- protected List deployers;
-
- // CONFIGURATORS ////////////////////////////////////////////////////////////
-
- protected boolean enableConfiguratorServiceLoader = true; // Enabled by default. In certain environments this should be set to false (eg osgi)
- protected List configurators; // The injected configurators
- protected List allConfigurators; // Including auto-discovered configurators
- protected EngineConfigurator idmEngineConfigurator;
- protected EngineConfigurator eventRegistryConfigurator;
-
- public static final String PRODUCT_NAME_POSTGRES = "PostgreSQL";
- public static final String PRODUCT_NAME_CRDB = "CockroachDB";
-
- public static final String DATABASE_TYPE_H2 = "h2";
- public static final String DATABASE_TYPE_HSQL = "hsql";
- public static final String DATABASE_TYPE_MYSQL = "mysql";
- public static final String DATABASE_TYPE_ORACLE = "oracle";
- public static final String DATABASE_TYPE_POSTGRES = "postgres";
- public static final String DATABASE_TYPE_MSSQL = "mssql";
- public static final String DATABASE_TYPE_DB2 = "db2";
- public static final String DATABASE_TYPE_COCKROACHDB = "cockroachdb";
-
- public static Properties getDefaultDatabaseTypeMappings() {
- Properties databaseTypeMappings = new Properties();
- databaseTypeMappings.setProperty("H2", DATABASE_TYPE_H2);
- databaseTypeMappings.setProperty("HSQL Database Engine", DATABASE_TYPE_HSQL);
- databaseTypeMappings.setProperty("MySQL", DATABASE_TYPE_MYSQL);
- databaseTypeMappings.setProperty("MariaDB", DATABASE_TYPE_MYSQL);
- databaseTypeMappings.setProperty("Oracle", DATABASE_TYPE_ORACLE);
- databaseTypeMappings.setProperty(PRODUCT_NAME_POSTGRES, DATABASE_TYPE_POSTGRES);
- databaseTypeMappings.setProperty("Microsoft SQL Server", DATABASE_TYPE_MSSQL);
- databaseTypeMappings.setProperty(DATABASE_TYPE_DB2, DATABASE_TYPE_DB2);
- databaseTypeMappings.setProperty("DB2", DATABASE_TYPE_DB2);
- databaseTypeMappings.setProperty("DB2/NT", DATABASE_TYPE_DB2);
- databaseTypeMappings.setProperty("DB2/NT64", DATABASE_TYPE_DB2);
- databaseTypeMappings.setProperty("DB2 UDP", DATABASE_TYPE_DB2);
- databaseTypeMappings.setProperty("DB2/LINUX", DATABASE_TYPE_DB2);
- databaseTypeMappings.setProperty("DB2/LINUX390", DATABASE_TYPE_DB2);
- databaseTypeMappings.setProperty("DB2/LINUXX8664", DATABASE_TYPE_DB2);
- databaseTypeMappings.setProperty("DB2/LINUXZ64", DATABASE_TYPE_DB2);
- databaseTypeMappings.setProperty("DB2/LINUXPPC64", DATABASE_TYPE_DB2);
- databaseTypeMappings.setProperty("DB2/LINUXPPC64LE", DATABASE_TYPE_DB2);
- databaseTypeMappings.setProperty("DB2/400 SQL", DATABASE_TYPE_DB2);
- databaseTypeMappings.setProperty("DB2/6000", DATABASE_TYPE_DB2);
- databaseTypeMappings.setProperty("DB2 UDB iSeries", DATABASE_TYPE_DB2);
- databaseTypeMappings.setProperty("DB2/AIX64", DATABASE_TYPE_DB2);
- databaseTypeMappings.setProperty("DB2/HPUX", DATABASE_TYPE_DB2);
- databaseTypeMappings.setProperty("DB2/HP64", DATABASE_TYPE_DB2);
- databaseTypeMappings.setProperty("DB2/SUN", DATABASE_TYPE_DB2);
- databaseTypeMappings.setProperty("DB2/SUN64", DATABASE_TYPE_DB2);
- databaseTypeMappings.setProperty("DB2/PTX", DATABASE_TYPE_DB2);
- databaseTypeMappings.setProperty("DB2/2", DATABASE_TYPE_DB2);
- databaseTypeMappings.setProperty("DB2 UDB AS400", DATABASE_TYPE_DB2);
- databaseTypeMappings.setProperty(PRODUCT_NAME_CRDB, DATABASE_TYPE_COCKROACHDB);
- databaseTypeMappings.setProperty("DM DBMS", DATABASE_TYPE_ORACLE); // dhb52: DM support
- return databaseTypeMappings;
- }
-
- protected Map beans;
-
- protected IdGenerator idGenerator;
- protected boolean usePrefixId;
-
- protected Clock clock;
- protected ObjectMapper objectMapper;
-
- // Variables
-
- public static final int DEFAULT_GENERIC_MAX_LENGTH_STRING = 4000;
- public static final int DEFAULT_ORACLE_MAX_LENGTH_STRING = 2000;
-
- /**
- * Define a max length for storing String variable types in the database. Mainly used for the Oracle NVARCHAR2 limit of 2000 characters
- */
- protected int maxLengthStringVariableType = -1;
-
- protected void initEngineConfigurations() {
- addEngineConfiguration(getEngineCfgKey(), getEngineScopeType(), this);
- }
-
- // DataSource
- // ///////////////////////////////////////////////////////////////
-
- protected void initDataSource() {
- if (dataSource == null) {
- if (dataSourceJndiName != null) {
- try {
- dataSource = (DataSource) new InitialContext().lookup(dataSourceJndiName);
- } catch (Exception e) {
- throw new FlowableException("couldn't lookup datasource from " + dataSourceJndiName + ": " + e.getMessage(), e);
- }
-
- } else if (jdbcUrl != null) {
- if ((jdbcDriver == null) || (jdbcUsername == null)) {
- throw new FlowableException("DataSource or JDBC properties have to be specified in a process engine configuration");
- }
-
- logger.debug("initializing datasource to db: {}", jdbcUrl);
-
- if (logger.isInfoEnabled()) {
- logger.info("Configuring Datasource with following properties (omitted password for security)");
- logger.info("datasource driver : {}", jdbcDriver);
- logger.info("datasource url : {}", jdbcUrl);
- logger.info("datasource user name : {}", jdbcUsername);
- }
-
- PooledDataSource pooledDataSource = new PooledDataSource(this.getClass().getClassLoader(), jdbcDriver, jdbcUrl, jdbcUsername, jdbcPassword);
-
- if (jdbcMaxActiveConnections > 0) {
- pooledDataSource.setPoolMaximumActiveConnections(jdbcMaxActiveConnections);
- }
- if (jdbcMaxIdleConnections > 0) {
- pooledDataSource.setPoolMaximumIdleConnections(jdbcMaxIdleConnections);
- }
- if (jdbcMaxCheckoutTime > 0) {
- pooledDataSource.setPoolMaximumCheckoutTime(jdbcMaxCheckoutTime);
- }
- if (jdbcMaxWaitTime > 0) {
- pooledDataSource.setPoolTimeToWait(jdbcMaxWaitTime);
- }
- if (jdbcPingEnabled) {
- pooledDataSource.setPoolPingEnabled(true);
- if (jdbcPingQuery != null) {
- pooledDataSource.setPoolPingQuery(jdbcPingQuery);
- }
- pooledDataSource.setPoolPingConnectionsNotUsedFor(jdbcPingConnectionNotUsedFor);
- }
- if (jdbcDefaultTransactionIsolationLevel > 0) {
- pooledDataSource.setDefaultTransactionIsolationLevel(jdbcDefaultTransactionIsolationLevel);
- }
- dataSource = pooledDataSource;
- }
- }
-
- if (databaseType == null) {
- initDatabaseType();
- }
- }
-
- public void initDatabaseType() {
- Connection connection = null;
- try {
- connection = dataSource.getConnection();
- DatabaseMetaData databaseMetaData = connection.getMetaData();
- String databaseProductName = databaseMetaData.getDatabaseProductName();
- logger.debug("database product name: '{}'", databaseProductName);
-
- // CRDB does not expose the version through the jdbc driver, so we need to fetch it through version().
- if (PRODUCT_NAME_POSTGRES.equalsIgnoreCase(databaseProductName)) {
- try (PreparedStatement preparedStatement = connection.prepareStatement("select version() as version;");
- ResultSet resultSet = preparedStatement.executeQuery()) {
- String version = null;
- if (resultSet.next()) {
- version = resultSet.getString("version");
- }
-
- if (StringUtils.isNotEmpty(version) && version.toLowerCase().startsWith(PRODUCT_NAME_CRDB.toLowerCase())) {
- databaseProductName = PRODUCT_NAME_CRDB;
- logger.info("CockroachDB version '{}' detected", version);
- }
- }
- }
-
- databaseType = databaseTypeMappings.getProperty(databaseProductName);
- if (databaseType == null) {
- throw new FlowableException("couldn't deduct database type from database product name '" + databaseProductName + "'");
- }
- logger.debug("using database type: {}", databaseType);
-
- } catch (SQLException e) {
- throw new RuntimeException("Exception while initializing Database connection", e);
- } finally {
- try {
- if (connection != null) {
- connection.close();
- }
- } catch (SQLException e) {
- logger.error("Exception while closing the Database connection", e);
- }
- }
-
- // Special care for MSSQL, as it has a hard limit of 2000 params per statement (incl bulk statement).
- // Especially with executions, with 100 as default, this limit is passed.
- if (DATABASE_TYPE_MSSQL.equals(databaseType)) {
- maxNrOfStatementsInBulkInsert = DEFAULT_MAX_NR_OF_STATEMENTS_BULK_INSERT_SQL_SERVER;
- }
- }
-
- public void initSchemaManager() {
- if (this.commonSchemaManager == null) {
- this.commonSchemaManager = new CommonDbSchemaManager();
- }
- }
-
- // session factories ////////////////////////////////////////////////////////
-
- public void addSessionFactory(SessionFactory sessionFactory) {
- sessionFactories.put(sessionFactory.getSessionType(), sessionFactory);
- }
-
- public void initCommandContextFactory() {
- if (commandContextFactory == null) {
- commandContextFactory = new CommandContextFactory();
- }
- }
-
- public void initTransactionContextFactory() {
- if (transactionContextFactory == null) {
- transactionContextFactory = new StandaloneMybatisTransactionContextFactory();
- }
- }
-
- public void initCommandExecutors() {
- initDefaultCommandConfig();
- initSchemaCommandConfig();
- initCommandInvoker();
- initCommandInterceptors();
- initCommandExecutor();
- }
-
-
- public void initDefaultCommandConfig() {
- if (defaultCommandConfig == null) {
- defaultCommandConfig = new CommandConfig();
- }
- }
-
- public void initSchemaCommandConfig() {
- if (schemaCommandConfig == null) {
- schemaCommandConfig = new CommandConfig();
- }
- }
-
- public void initCommandInvoker() {
- if (commandInvoker == null) {
- commandInvoker = new DefaultCommandInvoker();
- }
- }
-
- public void initCommandInterceptors() {
- if (commandInterceptors == null) {
- commandInterceptors = new ArrayList<>();
- if (customPreCommandInterceptors != null) {
- commandInterceptors.addAll(customPreCommandInterceptors);
- }
- commandInterceptors.addAll(getDefaultCommandInterceptors());
- if (customPostCommandInterceptors != null) {
- commandInterceptors.addAll(customPostCommandInterceptors);
- }
- commandInterceptors.add(commandInvoker);
- }
- }
-
- public Collection extends CommandInterceptor> getDefaultCommandInterceptors() {
- if (defaultCommandInterceptors == null) {
- List interceptors = new ArrayList<>();
- interceptors.add(new LogInterceptor());
-
- if (DATABASE_TYPE_COCKROACHDB.equals(databaseType)) {
- interceptors.add(new CrDbRetryInterceptor());
- }
-
- CommandInterceptor transactionInterceptor = createTransactionInterceptor();
- if (transactionInterceptor != null) {
- interceptors.add(transactionInterceptor);
- }
-
- if (commandContextFactory != null) {
- String engineCfgKey = getEngineCfgKey();
- CommandContextInterceptor commandContextInterceptor = new CommandContextInterceptor(commandContextFactory,
- classLoader, useClassForNameClassLoading, clock, objectMapper);
- engineConfigurations.put(engineCfgKey, this);
- commandContextInterceptor.setEngineCfgKey(engineCfgKey);
- commandContextInterceptor.setEngineConfigurations(engineConfigurations);
- interceptors.add(commandContextInterceptor);
- }
-
- if (transactionContextFactory != null) {
- interceptors.add(new TransactionContextInterceptor(transactionContextFactory));
- }
-
- List additionalCommandInterceptors = getAdditionalDefaultCommandInterceptors();
- if (additionalCommandInterceptors != null) {
- interceptors.addAll(additionalCommandInterceptors);
- }
-
- defaultCommandInterceptors = interceptors;
- }
- return defaultCommandInterceptors;
- }
-
- public abstract String getEngineCfgKey();
-
- public abstract String getEngineScopeType();
-
- public List getAdditionalDefaultCommandInterceptors() {
- return null;
- }
-
- public void initCommandExecutor() {
- if (commandExecutor == null) {
- CommandInterceptor first = initInterceptorChain(commandInterceptors);
- commandExecutor = new CommandExecutorImpl(getDefaultCommandConfig(), first);
- }
- }
-
- public CommandInterceptor initInterceptorChain(List chain) {
- if (chain == null || chain.isEmpty()) {
- throw new FlowableException("invalid command interceptor chain configuration: " + chain);
- }
- for (int i = 0; i < chain.size() - 1; i++) {
- chain.get(i).setNext(chain.get(i + 1));
- }
- return chain.get(0);
- }
-
- public abstract CommandInterceptor createTransactionInterceptor();
-
-
- public void initBeans() {
- if (beans == null) {
- beans = new HashMap<>();
- }
- }
-
- // id generator
- // /////////////////////////////////////////////////////////////
-
- public void initIdGenerator() {
- if (idGenerator == null) {
- idGenerator = new StrongUuidGenerator();
- }
- }
-
- public void initObjectMapper() {
- if (objectMapper == null) {
- objectMapper = new ObjectMapper();
- objectMapper.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
- }
- }
-
- public void initClock() {
- if (clock == null) {
- clock = new DefaultClockImpl();
- }
- }
-
- // Data managers ///////////////////////////////////////////////////////////
-
- public void initDataManagers() {
- if (propertyDataManager == null) {
- propertyDataManager = new MybatisPropertyDataManager(idGenerator);
- }
-
- if (byteArrayDataManager == null) {
- byteArrayDataManager = new MybatisByteArrayDataManager(idGenerator);
- }
- }
-
- // Entity managers //////////////////////////////////////////////////////////
-
- public void initEntityManagers() {
- if (propertyEntityManager == null) {
- propertyEntityManager = new PropertyEntityManagerImpl(this, propertyDataManager);
- }
-
- if (byteArrayEntityManager == null) {
- byteArrayEntityManager = new ByteArrayEntityManagerImpl(byteArrayDataManager, getEngineCfgKey(), this::getEventDispatcher);
- }
-
- if (tableDataManager == null) {
- tableDataManager = new TableDataManagerImpl(this);
- }
- }
-
- // services
- // /////////////////////////////////////////////////////////////////
-
- protected void initService(Object service) {
- if (service instanceof CommonEngineServiceImpl) {
- ((CommonEngineServiceImpl) service).setCommandExecutor(commandExecutor);
- }
- }
-
- // myBatis SqlSessionFactory
- // ////////////////////////////////////////////////
-
- public void initSessionFactories() {
- if (sessionFactories == null) {
- sessionFactories = new HashMap<>();
-
- if (usingRelationalDatabase) {
- initDbSqlSessionFactory();
- }
-
- addSessionFactory(new GenericManagerFactory(EntityCache.class, EntityCacheImpl.class));
-
- if (isLoggingSessionEnabled()) {
- if (!sessionFactories.containsKey(LoggingSession.class)) {
- LoggingSessionFactory loggingSessionFactory = new LoggingSessionFactory();
- loggingSessionFactory.setLoggingListener(loggingListener);
- loggingSessionFactory.setObjectMapper(objectMapper);
- sessionFactories.put(LoggingSession.class, loggingSessionFactory);
- }
- }
-
- commandContextFactory.setSessionFactories(sessionFactories);
-
- } else {
- if (usingRelationalDatabase) {
- initDbSqlSessionFactoryEntitySettings();
- }
- }
-
- if (customSessionFactories != null) {
- for (SessionFactory sessionFactory : customSessionFactories) {
- addSessionFactory(sessionFactory);
- }
- }
- }
-
- public void initDbSqlSessionFactory() {
- if (dbSqlSessionFactory == null) {
- dbSqlSessionFactory = createDbSqlSessionFactory();
- }
- dbSqlSessionFactory.setDatabaseType(databaseType);
- dbSqlSessionFactory.setSqlSessionFactory(sqlSessionFactory);
- dbSqlSessionFactory.setDbHistoryUsed(isDbHistoryUsed);
- dbSqlSessionFactory.setDatabaseTablePrefix(databaseTablePrefix);
- dbSqlSessionFactory.setTablePrefixIsSchema(tablePrefixIsSchema);
- dbSqlSessionFactory.setDatabaseCatalog(databaseCatalog);
- dbSqlSessionFactory.setDatabaseSchema(databaseSchema);
- dbSqlSessionFactory.setMaxNrOfStatementsInBulkInsert(maxNrOfStatementsInBulkInsert);
-
- initDbSqlSessionFactoryEntitySettings();
-
- addSessionFactory(dbSqlSessionFactory);
- }
-
- public DbSqlSessionFactory createDbSqlSessionFactory() {
- return new DbSqlSessionFactory(usePrefixId);
- }
-
- protected abstract void initDbSqlSessionFactoryEntitySettings();
-
- protected void defaultInitDbSqlSessionFactoryEntitySettings(List> insertOrder, List> deleteOrder) {
- if (insertOrder != null) {
- for (Class extends Entity> clazz : insertOrder) {
- dbSqlSessionFactory.getInsertionOrder().add(clazz);
-
- if (isBulkInsertEnabled) {
- dbSqlSessionFactory.getBulkInserteableEntityClasses().add(clazz);
- }
- }
- }
-
- if (deleteOrder != null) {
- for (Class extends Entity> clazz : deleteOrder) {
- dbSqlSessionFactory.getDeletionOrder().add(clazz);
- }
- }
- }
-
- public void initTransactionFactory() {
- if (transactionFactory == null) {
- if (transactionsExternallyManaged) {
- transactionFactory = new ManagedTransactionFactory();
- Properties properties = new Properties();
- properties.put("closeConnection", "false");
- this.transactionFactory.setProperties(properties);
- } else {
- transactionFactory = new JdbcTransactionFactory();
- }
- }
- }
-
- public void initSqlSessionFactory() {
- if (sqlSessionFactory == null) {
- InputStream inputStream = null;
- try {
- inputStream = getMyBatisXmlConfigurationStream();
-
- Environment environment = new Environment("default", transactionFactory, dataSource);
- Reader reader = new InputStreamReader(inputStream);
- Properties properties = new Properties();
- properties.put("prefix", databaseTablePrefix);
-
- String wildcardEscapeClause = "";
- if ((databaseWildcardEscapeCharacter != null) && (databaseWildcardEscapeCharacter.length() != 0)) {
- wildcardEscapeClause = " escape '" + databaseWildcardEscapeCharacter + "'";
- }
- properties.put("wildcardEscapeClause", wildcardEscapeClause);
-
- // set default properties
- properties.put("limitBefore", "");
- properties.put("limitAfter", "");
- properties.put("limitBetween", "");
- properties.put("limitBeforeNativeQuery", "");
- properties.put("limitAfterNativeQuery", "");
- properties.put("blobType", "BLOB");
- properties.put("boolValue", "TRUE");
-
- if (databaseType != null) {
- properties.load(getResourceAsStream(pathToEngineDbProperties()));
- }
-
- Configuration configuration = initMybatisConfiguration(environment, reader, properties);
- sqlSessionFactory = new DefaultSqlSessionFactory(configuration);
-
- } catch (Exception e) {
- throw new FlowableException("Error while building ibatis SqlSessionFactory: " + e.getMessage(), e);
- } finally {
- IoUtil.closeSilently(inputStream);
- }
- } else {
- // This is needed when the SQL Session Factory is created by another engine.
- // When custom XML Mappers are registered with this engine they need to be loaded in the configuration as well
- applyCustomMybatisCustomizations(sqlSessionFactory.getConfiguration());
- }
- }
-
- public String pathToEngineDbProperties() {
- return "org/flowable/common/db/properties/" + databaseType + ".properties";
- }
-
- public Configuration initMybatisConfiguration(Environment environment, Reader reader, Properties properties) {
- XMLConfigBuilder parser = new XMLConfigBuilder(reader, "", properties);
- Configuration configuration = parser.getConfiguration();
-
- if (databaseType != null) {
- configuration.setDatabaseId(databaseType);
- }
-
- configuration.setEnvironment(environment);
-
- initMybatisTypeHandlers(configuration);
- initCustomMybatisInterceptors(configuration);
- if (isEnableLogSqlExecutionTime()) {
- initMyBatisLogSqlExecutionTimePlugin(configuration);
- }
-
- configuration = parseMybatisConfiguration(parser);
- return configuration;
- }
-
- public void initCustomMybatisMappers(Configuration configuration) {
- if (getCustomMybatisMappers() != null) {
- for (Class> clazz : getCustomMybatisMappers()) {
- if (!configuration.hasMapper(clazz)) {
- configuration.addMapper(clazz);
- }
- }
- }
- }
-
- public void initMybatisTypeHandlers(Configuration configuration) {
- // When mapping into Map there is currently a problem with MyBatis.
- // It will return objects which are driver specific.
- // Therefore we are registering the mappings between Object.class and the specific jdbc type here.
- // see https://github.com/mybatis/mybatis-3/issues/2216 for more info
- TypeHandlerRegistry handlerRegistry = configuration.getTypeHandlerRegistry();
-
- handlerRegistry.register(Object.class, JdbcType.BOOLEAN, new BooleanTypeHandler());
- handlerRegistry.register(Object.class, JdbcType.BIT, new BooleanTypeHandler());
-
- handlerRegistry.register(Object.class, JdbcType.TINYINT, new ByteTypeHandler());
-
- handlerRegistry.register(Object.class, JdbcType.SMALLINT, new ShortTypeHandler());
-
- handlerRegistry.register(Object.class, JdbcType.INTEGER, new IntegerTypeHandler());
-
- handlerRegistry.register(Object.class, JdbcType.FLOAT, new FloatTypeHandler());
-
- handlerRegistry.register(Object.class, JdbcType.DOUBLE, new DoubleTypeHandler());
-
- handlerRegistry.register(Object.class, JdbcType.CHAR, new StringTypeHandler());
- handlerRegistry.register(Object.class, JdbcType.CLOB, new ClobTypeHandler());
- handlerRegistry.register(Object.class, JdbcType.VARCHAR, new StringTypeHandler());
- handlerRegistry.register(Object.class, JdbcType.LONGVARCHAR, new StringTypeHandler());
- handlerRegistry.register(Object.class, JdbcType.NVARCHAR, new NStringTypeHandler());
- handlerRegistry.register(Object.class, JdbcType.NCHAR, new NStringTypeHandler());
- handlerRegistry.register(Object.class, JdbcType.NCLOB, new NClobTypeHandler());
-
- handlerRegistry.register(Object.class, JdbcType.ARRAY, new ArrayTypeHandler());
-
- handlerRegistry.register(Object.class, JdbcType.BIGINT, new LongTypeHandler());
-
- handlerRegistry.register(Object.class, JdbcType.REAL, new BigDecimalTypeHandler());
- handlerRegistry.register(Object.class, JdbcType.DECIMAL, new BigDecimalTypeHandler());
- handlerRegistry.register(Object.class, JdbcType.NUMERIC, new BigDecimalTypeHandler());
-
- handlerRegistry.register(Object.class, JdbcType.BLOB, new BlobInputStreamTypeHandler());
- handlerRegistry.register(Object.class, JdbcType.LONGVARBINARY, new BlobTypeHandler());
-
- handlerRegistry.register(Object.class, JdbcType.DATE, new DateOnlyTypeHandler());
- handlerRegistry.register(Object.class, JdbcType.TIME, new TimeOnlyTypeHandler());
- handlerRegistry.register(Object.class, JdbcType.TIMESTAMP, new DateTypeHandler());
-
- handlerRegistry.register(Object.class, JdbcType.SQLXML, new SqlxmlTypeHandler());
- }
-
- public void initCustomMybatisInterceptors(Configuration configuration) {
- if (customMybatisInterceptors!=null){
- for (Interceptor interceptor :customMybatisInterceptors){
- configuration.addInterceptor(interceptor);
- }
- }
- }
-
- public void initMyBatisLogSqlExecutionTimePlugin(Configuration configuration) {
- configuration.addInterceptor(new LogSqlExecutionTimePlugin());
- }
-
- public Configuration parseMybatisConfiguration(XMLConfigBuilder parser) {
- Configuration configuration = parser.parse();
-
- applyCustomMybatisCustomizations(configuration);
- return configuration;
- }
-
- protected void applyCustomMybatisCustomizations(Configuration configuration) {
- initCustomMybatisMappers(configuration);
-
- if (dependentEngineMybatisTypeAliasConfigs != null) {
- for (MybatisTypeAliasConfigurator typeAliasConfig : dependentEngineMybatisTypeAliasConfigs) {
- typeAliasConfig.configure(configuration.getTypeAliasRegistry());
- }
- }
- if (dependentEngineMybatisTypeHandlerConfigs != null) {
- for (MybatisTypeHandlerConfigurator typeHandlerConfig : dependentEngineMybatisTypeHandlerConfigs) {
- typeHandlerConfig.configure(configuration.getTypeHandlerRegistry());
- }
- }
-
- parseDependentEngineMybatisXMLMappers(configuration);
- parseCustomMybatisXMLMappers(configuration);
- }
-
- public void parseCustomMybatisXMLMappers(Configuration configuration) {
- if (getCustomMybatisXMLMappers() != null) {
- for (String resource : getCustomMybatisXMLMappers()) {
- parseMybatisXmlMapping(configuration, resource);
- }
- }
- }
-
- public void parseDependentEngineMybatisXMLMappers(Configuration configuration) {
- if (getDependentEngineMyBatisXmlMappers() != null) {
- for (String resource : getDependentEngineMyBatisXmlMappers()) {
- parseMybatisXmlMapping(configuration, resource);
- }
- }
- }
-
- protected void parseMybatisXmlMapping(Configuration configuration, String resource) {
- // see XMLConfigBuilder.mapperElement()
- XMLMapperBuilder mapperParser = new XMLMapperBuilder(getResourceAsStream(resource), configuration, resource, configuration.getSqlFragments());
- mapperParser.parse();
- }
-
- protected InputStream getResourceAsStream(String resource) {
- ClassLoader classLoader = getClassLoader();
- if (classLoader != null) {
- return getClassLoader().getResourceAsStream(resource);
- } else {
- return this.getClass().getClassLoader().getResourceAsStream(resource);
- }
- }
-
- public void setMybatisMappingFile(String file) {
- this.mybatisMappingFile = file;
- }
-
- public String getMybatisMappingFile() {
- return mybatisMappingFile;
- }
-
- public abstract InputStream getMyBatisXmlConfigurationStream();
-
- public void initConfigurators() {
-
- allConfigurators = new ArrayList<>();
- allConfigurators.addAll(getEngineSpecificEngineConfigurators());
-
- // Configurators that are explicitly added to the config
- if (configurators != null) {
- allConfigurators.addAll(configurators);
- }
-
- // Auto discovery through ServiceLoader
- if (enableConfiguratorServiceLoader) {
- ClassLoader classLoader = getClassLoader();
- if (classLoader == null) {
- classLoader = ReflectUtil.getClassLoader();
- }
-
- ServiceLoader configuratorServiceLoader = ServiceLoader.load(EngineConfigurator.class, classLoader);
- int nrOfServiceLoadedConfigurators = 0;
- for (EngineConfigurator configurator : configuratorServiceLoader) {
- allConfigurators.add(configurator);
- nrOfServiceLoadedConfigurators++;
- }
-
- if (nrOfServiceLoadedConfigurators > 0) {
- logger.info("Found {} auto-discoverable Process Engine Configurator{}", nrOfServiceLoadedConfigurators, nrOfServiceLoadedConfigurators > 1 ? "s" : "");
- }
-
- if (!allConfigurators.isEmpty()) {
-
- // Order them according to the priorities (useful for dependent
- // configurator)
- allConfigurators.sort(new Comparator() {
-
- @Override
- public int compare(EngineConfigurator configurator1, EngineConfigurator configurator2) {
- int priority1 = configurator1.getPriority();
- int priority2 = configurator2.getPriority();
-
- if (priority1 < priority2) {
- return -1;
- } else if (priority1 > priority2) {
- return 1;
- }
- return 0;
- }
- });
-
- // Execute the configurators
- logger.info("Found {} Engine Configurators in total:", allConfigurators.size());
- for (EngineConfigurator configurator : allConfigurators) {
- logger.info("{} (priority:{})", configurator.getClass(), configurator.getPriority());
- }
-
- }
-
- }
- }
-
- public void close() {
- if (forceCloseMybatisConnectionPool && dataSource instanceof PooledDataSource) {
- /*
- * When the datasource is created by a Flowable engine (i.e. it's an instance of PooledDataSource),
- * the connection pool needs to be closed when closing the engine.
- * Note that calling forceCloseAll() multiple times (as is the case when running with multiple engine) is ok.
- */
- ((PooledDataSource) dataSource).forceCloseAll();
- }
- }
-
- protected List getEngineSpecificEngineConfigurators() {
- // meant to be overridden if needed
- return Collections.emptyList();
- }
-
- public void configuratorsBeforeInit() {
- for (EngineConfigurator configurator : allConfigurators) {
- logger.info("Executing beforeInit() of {} (priority:{})", configurator.getClass(), configurator.getPriority());
- configurator.beforeInit(this);
- }
- }
-
- public void configuratorsAfterInit() {
- for (EngineConfigurator configurator : allConfigurators) {
- logger.info("Executing configure() of {} (priority:{})", configurator.getClass(), configurator.getPriority());
- configurator.configure(this);
- }
- }
-
- public LockManager getLockManager(String lockName) {
- return new LockManagerImpl(commandExecutor, lockName, getLockPollRate(), getEngineCfgKey());
- }
-
- // getters and setters
- // //////////////////////////////////////////////////////
-
- public abstract String getEngineName();
-
- public ClassLoader getClassLoader() {
- return classLoader;
- }
-
- public AbstractEngineConfiguration setClassLoader(ClassLoader classLoader) {
- this.classLoader = classLoader;
- return this;
- }
-
- public boolean isUseClassForNameClassLoading() {
- return useClassForNameClassLoading;
- }
-
- public AbstractEngineConfiguration setUseClassForNameClassLoading(boolean useClassForNameClassLoading) {
- this.useClassForNameClassLoading = useClassForNameClassLoading;
- return this;
- }
-
- public void addEngineLifecycleListener(EngineLifecycleListener engineLifecycleListener) {
- if (this.engineLifecycleListeners == null) {
- this.engineLifecycleListeners = new ArrayList<>();
- }
- this.engineLifecycleListeners.add(engineLifecycleListener);
- }
-
- public List getEngineLifecycleListeners() {
- return engineLifecycleListeners;
- }
-
- public AbstractEngineConfiguration setEngineLifecycleListeners(List engineLifecycleListeners) {
- this.engineLifecycleListeners = engineLifecycleListeners;
- return this;
- }
-
- public String getDatabaseType() {
- return databaseType;
- }
-
- public AbstractEngineConfiguration setDatabaseType(String databaseType) {
- this.databaseType = databaseType;
- return this;
- }
-
- public DataSource getDataSource() {
- return dataSource;
- }
-
- public AbstractEngineConfiguration setDataSource(DataSource dataSource) {
- this.dataSource = dataSource;
- return this;
- }
-
- public SchemaManager getSchemaManager() {
- return schemaManager;
- }
-
- public AbstractEngineConfiguration setSchemaManager(SchemaManager schemaManager) {
- this.schemaManager = schemaManager;
- return this;
- }
-
- public SchemaManager getCommonSchemaManager() {
- return commonSchemaManager;
- }
-
- public AbstractEngineConfiguration setCommonSchemaManager(SchemaManager commonSchemaManager) {
- this.commonSchemaManager = commonSchemaManager;
- return this;
- }
-
- public Command getSchemaManagementCmd() {
- return schemaManagementCmd;
- }
-
- public AbstractEngineConfiguration setSchemaManagementCmd(Command schemaManagementCmd) {
- this.schemaManagementCmd = schemaManagementCmd;
- return this;
- }
-
- public String getJdbcDriver() {
- return jdbcDriver;
- }
-
- public AbstractEngineConfiguration setJdbcDriver(String jdbcDriver) {
- this.jdbcDriver = jdbcDriver;
- return this;
- }
-
- public String getJdbcUrl() {
- return jdbcUrl;
- }
-
- public AbstractEngineConfiguration setJdbcUrl(String jdbcUrl) {
- this.jdbcUrl = jdbcUrl;
- return this;
- }
-
- public String getJdbcUsername() {
- return jdbcUsername;
- }
-
- public AbstractEngineConfiguration setJdbcUsername(String jdbcUsername) {
- this.jdbcUsername = jdbcUsername;
- return this;
- }
-
- public String getJdbcPassword() {
- return jdbcPassword;
- }
-
- public AbstractEngineConfiguration setJdbcPassword(String jdbcPassword) {
- this.jdbcPassword = jdbcPassword;
- return this;
- }
-
- public int getJdbcMaxActiveConnections() {
- return jdbcMaxActiveConnections;
- }
-
- public AbstractEngineConfiguration setJdbcMaxActiveConnections(int jdbcMaxActiveConnections) {
- this.jdbcMaxActiveConnections = jdbcMaxActiveConnections;
- return this;
- }
-
- public int getJdbcMaxIdleConnections() {
- return jdbcMaxIdleConnections;
- }
-
- public AbstractEngineConfiguration setJdbcMaxIdleConnections(int jdbcMaxIdleConnections) {
- this.jdbcMaxIdleConnections = jdbcMaxIdleConnections;
- return this;
- }
-
- public int getJdbcMaxCheckoutTime() {
- return jdbcMaxCheckoutTime;
- }
-
- public AbstractEngineConfiguration setJdbcMaxCheckoutTime(int jdbcMaxCheckoutTime) {
- this.jdbcMaxCheckoutTime = jdbcMaxCheckoutTime;
- return this;
- }
-
- public int getJdbcMaxWaitTime() {
- return jdbcMaxWaitTime;
- }
-
- public AbstractEngineConfiguration setJdbcMaxWaitTime(int jdbcMaxWaitTime) {
- this.jdbcMaxWaitTime = jdbcMaxWaitTime;
- return this;
- }
-
- public boolean isJdbcPingEnabled() {
- return jdbcPingEnabled;
- }
-
- public AbstractEngineConfiguration setJdbcPingEnabled(boolean jdbcPingEnabled) {
- this.jdbcPingEnabled = jdbcPingEnabled;
- return this;
- }
-
- public int getJdbcPingConnectionNotUsedFor() {
- return jdbcPingConnectionNotUsedFor;
- }
-
- public AbstractEngineConfiguration setJdbcPingConnectionNotUsedFor(int jdbcPingConnectionNotUsedFor) {
- this.jdbcPingConnectionNotUsedFor = jdbcPingConnectionNotUsedFor;
- return this;
- }
-
- public int getJdbcDefaultTransactionIsolationLevel() {
- return jdbcDefaultTransactionIsolationLevel;
- }
-
- public AbstractEngineConfiguration setJdbcDefaultTransactionIsolationLevel(int jdbcDefaultTransactionIsolationLevel) {
- this.jdbcDefaultTransactionIsolationLevel = jdbcDefaultTransactionIsolationLevel;
- return this;
- }
-
- public String getJdbcPingQuery() {
- return jdbcPingQuery;
- }
-
- public AbstractEngineConfiguration setJdbcPingQuery(String jdbcPingQuery) {
- this.jdbcPingQuery = jdbcPingQuery;
- return this;
- }
-
- public String getDataSourceJndiName() {
- return dataSourceJndiName;
- }
-
- public AbstractEngineConfiguration setDataSourceJndiName(String dataSourceJndiName) {
- this.dataSourceJndiName = dataSourceJndiName;
- return this;
- }
-
- public CommandConfig getSchemaCommandConfig() {
- return schemaCommandConfig;
- }
-
- public AbstractEngineConfiguration setSchemaCommandConfig(CommandConfig schemaCommandConfig) {
- this.schemaCommandConfig = schemaCommandConfig;
- return this;
- }
-
- public boolean isTransactionsExternallyManaged() {
- return transactionsExternallyManaged;
- }
-
- public AbstractEngineConfiguration setTransactionsExternallyManaged(boolean transactionsExternallyManaged) {
- this.transactionsExternallyManaged = transactionsExternallyManaged;
- return this;
- }
-
- public Map getBeans() {
- return beans;
- }
-
- public AbstractEngineConfiguration setBeans(Map beans) {
- this.beans = beans;
- return this;
- }
-
- public IdGenerator getIdGenerator() {
- return idGenerator;
- }
-
- public AbstractEngineConfiguration setIdGenerator(IdGenerator idGenerator) {
- this.idGenerator = idGenerator;
- return this;
- }
-
- public boolean isUsePrefixId() {
- return usePrefixId;
- }
-
- public AbstractEngineConfiguration setUsePrefixId(boolean usePrefixId) {
- this.usePrefixId = usePrefixId;
- return this;
- }
-
- public String getXmlEncoding() {
- return xmlEncoding;
- }
-
- public AbstractEngineConfiguration setXmlEncoding(String xmlEncoding) {
- this.xmlEncoding = xmlEncoding;
- return this;
- }
-
- public CommandConfig getDefaultCommandConfig() {
- return defaultCommandConfig;
- }
-
- public AbstractEngineConfiguration setDefaultCommandConfig(CommandConfig defaultCommandConfig) {
- this.defaultCommandConfig = defaultCommandConfig;
- return this;
- }
-
- public CommandExecutor getCommandExecutor() {
- return commandExecutor;
- }
-
- public AbstractEngineConfiguration setCommandExecutor(CommandExecutor commandExecutor) {
- this.commandExecutor = commandExecutor;
- return this;
- }
-
- public CommandContextFactory getCommandContextFactory() {
- return commandContextFactory;
- }
-
- public AbstractEngineConfiguration setCommandContextFactory(CommandContextFactory commandContextFactory) {
- this.commandContextFactory = commandContextFactory;
- return this;
- }
-
- public CommandInterceptor getCommandInvoker() {
- return commandInvoker;
- }
-
- public AbstractEngineConfiguration setCommandInvoker(CommandInterceptor commandInvoker) {
- this.commandInvoker = commandInvoker;
- return this;
- }
-
- public AgendaOperationRunner getAgendaOperationRunner() {
- return agendaOperationRunner;
- }
-
- public AbstractEngineConfiguration setAgendaOperationRunner(AgendaOperationRunner agendaOperationRunner) {
- this.agendaOperationRunner = agendaOperationRunner;
- return this;
- }
-
- public List getCustomPreCommandInterceptors() {
- return customPreCommandInterceptors;
- }
-
- public AbstractEngineConfiguration setCustomPreCommandInterceptors(List customPreCommandInterceptors) {
- this.customPreCommandInterceptors = customPreCommandInterceptors;
- return this;
- }
-
- public List getCustomPostCommandInterceptors() {
- return customPostCommandInterceptors;
- }
-
- public AbstractEngineConfiguration setCustomPostCommandInterceptors(List customPostCommandInterceptors) {
- this.customPostCommandInterceptors = customPostCommandInterceptors;
- return this;
- }
-
- public List getCommandInterceptors() {
- return commandInterceptors;
- }
-
- public AbstractEngineConfiguration setCommandInterceptors(List commandInterceptors) {
- this.commandInterceptors = commandInterceptors;
- return this;
- }
-
- public Map getEngineConfigurations() {
- return engineConfigurations;
- }
-
- public AbstractEngineConfiguration setEngineConfigurations(Map engineConfigurations) {
- this.engineConfigurations = engineConfigurations;
- return this;
- }
-
- public void addEngineConfiguration(String key, String scopeType, AbstractEngineConfiguration engineConfiguration) {
- if (engineConfigurations == null) {
- engineConfigurations = new HashMap<>();
- }
- engineConfigurations.put(key, engineConfiguration);
- engineConfigurations.put(scopeType, engineConfiguration);
- }
-
- public Map getServiceConfigurations() {
- return serviceConfigurations;
- }
-
- public AbstractEngineConfiguration setServiceConfigurations(Map serviceConfigurations) {
- this.serviceConfigurations = serviceConfigurations;
- return this;
- }
-
- public void addServiceConfiguration(String key, AbstractServiceConfiguration serviceConfiguration) {
- if (serviceConfigurations == null) {
- serviceConfigurations = new HashMap<>();
- }
- serviceConfigurations.put(key, serviceConfiguration);
- }
-
- public Map getEventRegistryEventConsumers() {
- return eventRegistryEventConsumers;
- }
-
- public AbstractEngineConfiguration setEventRegistryEventConsumers(Map eventRegistryEventConsumers) {
- this.eventRegistryEventConsumers = eventRegistryEventConsumers;
- return this;
- }
-
- public void addEventRegistryEventConsumer(String key, EventRegistryEventConsumer eventRegistryEventConsumer) {
- if (eventRegistryEventConsumers == null) {
- eventRegistryEventConsumers = new HashMap<>();
- }
- eventRegistryEventConsumers.put(key, eventRegistryEventConsumer);
- }
-
- public AbstractEngineConfiguration setDefaultCommandInterceptors(Collection extends CommandInterceptor> defaultCommandInterceptors) {
- this.defaultCommandInterceptors = defaultCommandInterceptors;
- return this;
- }
-
- public SqlSessionFactory getSqlSessionFactory() {
- return sqlSessionFactory;
- }
-
- public AbstractEngineConfiguration setSqlSessionFactory(SqlSessionFactory sqlSessionFactory) {
- this.sqlSessionFactory = sqlSessionFactory;
- return this;
- }
-
- public boolean isDbHistoryUsed() {
- return isDbHistoryUsed;
- }
-
- public AbstractEngineConfiguration setDbHistoryUsed(boolean isDbHistoryUsed) {
- this.isDbHistoryUsed = isDbHistoryUsed;
- return this;
- }
-
- public DbSqlSessionFactory getDbSqlSessionFactory() {
- return dbSqlSessionFactory;
- }
-
- public AbstractEngineConfiguration setDbSqlSessionFactory(DbSqlSessionFactory dbSqlSessionFactory) {
- this.dbSqlSessionFactory = dbSqlSessionFactory;
- return this;
- }
-
- public TransactionFactory getTransactionFactory() {
- return transactionFactory;
- }
-
- public AbstractEngineConfiguration setTransactionFactory(TransactionFactory transactionFactory) {
- this.transactionFactory = transactionFactory;
- return this;
- }
-
- public TransactionContextFactory getTransactionContextFactory() {
- return transactionContextFactory;
- }
-
- public AbstractEngineConfiguration setTransactionContextFactory(TransactionContextFactory transactionContextFactory) {
- this.transactionContextFactory = transactionContextFactory;
- return this;
- }
-
- public int getMaxNrOfStatementsInBulkInsert() {
- return maxNrOfStatementsInBulkInsert;
- }
-
- public AbstractEngineConfiguration setMaxNrOfStatementsInBulkInsert(int maxNrOfStatementsInBulkInsert) {
- this.maxNrOfStatementsInBulkInsert = maxNrOfStatementsInBulkInsert;
- return this;
- }
-
- public boolean isBulkInsertEnabled() {
- return isBulkInsertEnabled;
- }
-
- public AbstractEngineConfiguration setBulkInsertEnabled(boolean isBulkInsertEnabled) {
- this.isBulkInsertEnabled = isBulkInsertEnabled;
- return this;
- }
-
- public Set> getCustomMybatisMappers() {
- return customMybatisMappers;
- }
-
- public AbstractEngineConfiguration setCustomMybatisMappers(Set> customMybatisMappers) {
- this.customMybatisMappers = customMybatisMappers;
- return this;
- }
-
- public Set getCustomMybatisXMLMappers() {
- return customMybatisXMLMappers;
- }
-
- public AbstractEngineConfiguration setCustomMybatisXMLMappers(Set customMybatisXMLMappers) {
- this.customMybatisXMLMappers = customMybatisXMLMappers;
- return this;
- }
-
- public Set getDependentEngineMyBatisXmlMappers() {
- return dependentEngineMyBatisXmlMappers;
- }
-
- public AbstractEngineConfiguration setCustomMybatisInterceptors(List customMybatisInterceptors) {
- this.customMybatisInterceptors = customMybatisInterceptors;
- return this;
- }
-
- public List getCustomMybatisInterceptors() {
- return customMybatisInterceptors;
- }
-
- public AbstractEngineConfiguration setDependentEngineMyBatisXmlMappers(Set dependentEngineMyBatisXmlMappers) {
- this.dependentEngineMyBatisXmlMappers = dependentEngineMyBatisXmlMappers;
- return this;
- }
-
- public List getDependentEngineMybatisTypeAliasConfigs() {
- return dependentEngineMybatisTypeAliasConfigs;
- }
-
- public AbstractEngineConfiguration setDependentEngineMybatisTypeAliasConfigs(List dependentEngineMybatisTypeAliasConfigs) {
- this.dependentEngineMybatisTypeAliasConfigs = dependentEngineMybatisTypeAliasConfigs;
- return this;
- }
-
- public List getDependentEngineMybatisTypeHandlerConfigs() {
- return dependentEngineMybatisTypeHandlerConfigs;
- }
-
- public AbstractEngineConfiguration setDependentEngineMybatisTypeHandlerConfigs(List dependentEngineMybatisTypeHandlerConfigs) {
- this.dependentEngineMybatisTypeHandlerConfigs = dependentEngineMybatisTypeHandlerConfigs;
- return this;
- }
-
- public List getCustomSessionFactories() {
- return customSessionFactories;
- }
-
- public AbstractEngineConfiguration addCustomSessionFactory(SessionFactory sessionFactory) {
- if (customSessionFactories == null) {
- customSessionFactories = new ArrayList<>();
- }
- customSessionFactories.add(sessionFactory);
- return this;
- }
-
- public AbstractEngineConfiguration setCustomSessionFactories(List customSessionFactories) {
- this.customSessionFactories = customSessionFactories;
- return this;
- }
-
- public boolean isUsingRelationalDatabase() {
- return usingRelationalDatabase;
- }
-
- public AbstractEngineConfiguration setUsingRelationalDatabase(boolean usingRelationalDatabase) {
- this.usingRelationalDatabase = usingRelationalDatabase;
- return this;
- }
-
- public boolean isUsingSchemaMgmt() {
- return usingSchemaMgmt;
- }
-
- public AbstractEngineConfiguration setUsingSchemaMgmt(boolean usingSchema) {
- this.usingSchemaMgmt = usingSchema;
- return this;
- }
-
- public String getDatabaseTablePrefix() {
- return databaseTablePrefix;
- }
-
- public AbstractEngineConfiguration setDatabaseTablePrefix(String databaseTablePrefix) {
- this.databaseTablePrefix = databaseTablePrefix;
- return this;
- }
-
- public String getDatabaseWildcardEscapeCharacter() {
- return databaseWildcardEscapeCharacter;
- }
-
- public AbstractEngineConfiguration setDatabaseWildcardEscapeCharacter(String databaseWildcardEscapeCharacter) {
- this.databaseWildcardEscapeCharacter = databaseWildcardEscapeCharacter;
- return this;
- }
-
- public String getDatabaseCatalog() {
- return databaseCatalog;
- }
-
- public AbstractEngineConfiguration setDatabaseCatalog(String databaseCatalog) {
- this.databaseCatalog = databaseCatalog;
- return this;
- }
-
- public String getDatabaseSchema() {
- return databaseSchema;
- }
-
- public AbstractEngineConfiguration setDatabaseSchema(String databaseSchema) {
- this.databaseSchema = databaseSchema;
- return this;
- }
-
- public boolean isTablePrefixIsSchema() {
- return tablePrefixIsSchema;
- }
-
- public AbstractEngineConfiguration setTablePrefixIsSchema(boolean tablePrefixIsSchema) {
- this.tablePrefixIsSchema = tablePrefixIsSchema;
- return this;
- }
-
- public boolean isAlwaysLookupLatestDefinitionVersion() {
- return alwaysLookupLatestDefinitionVersion;
- }
-
- public AbstractEngineConfiguration setAlwaysLookupLatestDefinitionVersion(boolean alwaysLookupLatestDefinitionVersion) {
- this.alwaysLookupLatestDefinitionVersion = alwaysLookupLatestDefinitionVersion;
- return this;
- }
-
- public boolean isFallbackToDefaultTenant() {
- return fallbackToDefaultTenant;
- }
-
- public AbstractEngineConfiguration setFallbackToDefaultTenant(boolean fallbackToDefaultTenant) {
- this.fallbackToDefaultTenant = fallbackToDefaultTenant;
- return this;
- }
-
- /**
- * @return name of the default tenant
- * @deprecated use {@link AbstractEngineConfiguration#getDefaultTenantProvider()} instead
- */
- @Deprecated
- public String getDefaultTenantValue() {
- return getDefaultTenantProvider().getDefaultTenant(null, null, null);
- }
-
- public AbstractEngineConfiguration setDefaultTenantValue(String defaultTenantValue) {
- this.defaultTenantProvider = (tenantId, scope, scopeKey) -> defaultTenantValue;
- return this;
- }
-
- public DefaultTenantProvider getDefaultTenantProvider() {
- return defaultTenantProvider;
- }
-
- public AbstractEngineConfiguration setDefaultTenantProvider(DefaultTenantProvider defaultTenantProvider) {
- this.defaultTenantProvider = defaultTenantProvider;
- return this;
- }
-
- public boolean isEnableLogSqlExecutionTime() {
- return enableLogSqlExecutionTime;
- }
-
- public void setEnableLogSqlExecutionTime(boolean enableLogSqlExecutionTime) {
- this.enableLogSqlExecutionTime = enableLogSqlExecutionTime;
- }
-
- public Map, SessionFactory> getSessionFactories() {
- return sessionFactories;
- }
-
- public AbstractEngineConfiguration setSessionFactories(Map, SessionFactory> sessionFactories) {
- this.sessionFactories = sessionFactories;
- return this;
- }
-
- public String getDatabaseSchemaUpdate() {
- return databaseSchemaUpdate;
- }
-
- public AbstractEngineConfiguration setDatabaseSchemaUpdate(String databaseSchemaUpdate) {
- this.databaseSchemaUpdate = databaseSchemaUpdate;
- return this;
- }
-
- public boolean isUseLockForDatabaseSchemaUpdate() {
- return useLockForDatabaseSchemaUpdate;
- }
-
- public AbstractEngineConfiguration setUseLockForDatabaseSchemaUpdate(boolean useLockForDatabaseSchemaUpdate) {
- this.useLockForDatabaseSchemaUpdate = useLockForDatabaseSchemaUpdate;
- return this;
- }
-
- public boolean isEnableEventDispatcher() {
- return enableEventDispatcher;
- }
-
- public AbstractEngineConfiguration setEnableEventDispatcher(boolean enableEventDispatcher) {
- this.enableEventDispatcher = enableEventDispatcher;
- return this;
- }
-
- public FlowableEventDispatcher getEventDispatcher() {
- return eventDispatcher;
- }
-
- public AbstractEngineConfiguration setEventDispatcher(FlowableEventDispatcher eventDispatcher) {
- this.eventDispatcher = eventDispatcher;
- return this;
- }
-
- public List getEventListeners() {
- return eventListeners;
- }
-
- public AbstractEngineConfiguration setEventListeners(List eventListeners) {
- this.eventListeners = eventListeners;
- return this;
- }
-
- public Map> getTypedEventListeners() {
- return typedEventListeners;
- }
-
- public AbstractEngineConfiguration setTypedEventListeners(Map> typedEventListeners) {
- this.typedEventListeners = typedEventListeners;
- return this;
- }
-
- public List getAdditionalEventDispatchActions() {
- return additionalEventDispatchActions;
- }
-
- public AbstractEngineConfiguration setAdditionalEventDispatchActions(List additionalEventDispatchActions) {
- this.additionalEventDispatchActions = additionalEventDispatchActions;
- return this;
- }
-
- public void initEventDispatcher() {
- if (this.eventDispatcher == null) {
- this.eventDispatcher = new FlowableEventDispatcherImpl();
- }
-
- initAdditionalEventDispatchActions();
-
- this.eventDispatcher.setEnabled(enableEventDispatcher);
-
- initEventListeners();
- initTypedEventListeners();
- }
-
- protected void initEventListeners() {
- if (eventListeners != null) {
- for (FlowableEventListener listenerToAdd : eventListeners) {
- this.eventDispatcher.addEventListener(listenerToAdd);
- }
- }
- }
-
- protected void initAdditionalEventDispatchActions() {
- if (this.additionalEventDispatchActions == null) {
- this.additionalEventDispatchActions = new ArrayList<>();
- }
- }
-
- protected void initTypedEventListeners() {
- if (typedEventListeners != null) {
- for (Map.Entry> listenersToAdd : typedEventListeners.entrySet()) {
- // Extract types from the given string
- FlowableEngineEventType[] types = FlowableEngineEventType.getTypesFromString(listenersToAdd.getKey());
-
- for (FlowableEventListener listenerToAdd : listenersToAdd.getValue()) {
- this.eventDispatcher.addEventListener(listenerToAdd, types);
- }
- }
- }
- }
-
- public boolean isLoggingSessionEnabled() {
- return loggingListener != null;
- }
-
- public LoggingListener getLoggingListener() {
- return loggingListener;
- }
-
- public void setLoggingListener(LoggingListener loggingListener) {
- this.loggingListener = loggingListener;
- }
-
- public Clock getClock() {
- return clock;
- }
-
- public AbstractEngineConfiguration setClock(Clock clock) {
- this.clock = clock;
- return this;
- }
-
- public ObjectMapper getObjectMapper() {
- return objectMapper;
- }
-
- public AbstractEngineConfiguration setObjectMapper(ObjectMapper objectMapper) {
- this.objectMapper = objectMapper;
- return this;
- }
-
- public int getMaxLengthString() {
- if (maxLengthStringVariableType == -1) {
- if ("oracle".equalsIgnoreCase(databaseType)) {
- return DEFAULT_ORACLE_MAX_LENGTH_STRING;
- } else {
- return DEFAULT_GENERIC_MAX_LENGTH_STRING;
- }
- } else {
- return maxLengthStringVariableType;
- }
- }
-
- public int getMaxLengthStringVariableType() {
- return maxLengthStringVariableType;
- }
-
- public AbstractEngineConfiguration setMaxLengthStringVariableType(int maxLengthStringVariableType) {
- this.maxLengthStringVariableType = maxLengthStringVariableType;
- return this;
- }
-
- public PropertyDataManager getPropertyDataManager() {
- return propertyDataManager;
- }
-
- public Duration getLockPollRate() {
- return lockPollRate;
- }
-
- public AbstractEngineConfiguration setLockPollRate(Duration lockPollRate) {
- this.lockPollRate = lockPollRate;
- return this;
- }
-
- public Duration getSchemaLockWaitTime() {
- return schemaLockWaitTime;
- }
-
- public void setSchemaLockWaitTime(Duration schemaLockWaitTime) {
- this.schemaLockWaitTime = schemaLockWaitTime;
- }
-
- public AbstractEngineConfiguration setPropertyDataManager(PropertyDataManager propertyDataManager) {
- this.propertyDataManager = propertyDataManager;
- return this;
- }
-
- public PropertyEntityManager getPropertyEntityManager() {
- return propertyEntityManager;
- }
-
- public AbstractEngineConfiguration setPropertyEntityManager(PropertyEntityManager propertyEntityManager) {
- this.propertyEntityManager = propertyEntityManager;
- return this;
- }
-
- public ByteArrayDataManager getByteArrayDataManager() {
- return byteArrayDataManager;
- }
-
- public AbstractEngineConfiguration setByteArrayDataManager(ByteArrayDataManager byteArrayDataManager) {
- this.byteArrayDataManager = byteArrayDataManager;
- return this;
- }
-
- public ByteArrayEntityManager getByteArrayEntityManager() {
- return byteArrayEntityManager;
- }
-
- public AbstractEngineConfiguration setByteArrayEntityManager(ByteArrayEntityManager byteArrayEntityManager) {
- this.byteArrayEntityManager = byteArrayEntityManager;
- return this;
- }
-
- public TableDataManager getTableDataManager() {
- return tableDataManager;
- }
-
- public AbstractEngineConfiguration setTableDataManager(TableDataManager tableDataManager) {
- this.tableDataManager = tableDataManager;
- return this;
- }
-
- public List getDeployers() {
- return deployers;
- }
-
- public AbstractEngineConfiguration setDeployers(List deployers) {
- this.deployers = deployers;
- return this;
- }
-
- public List getCustomPreDeployers() {
- return customPreDeployers;
- }
-
- public AbstractEngineConfiguration setCustomPreDeployers(List customPreDeployers) {
- this.customPreDeployers = customPreDeployers;
- return this;
- }
-
- public List getCustomPostDeployers() {
- return customPostDeployers;
- }
-
- public AbstractEngineConfiguration setCustomPostDeployers(List customPostDeployers) {
- this.customPostDeployers = customPostDeployers;
- return this;
- }
-
- public boolean isEnableConfiguratorServiceLoader() {
- return enableConfiguratorServiceLoader;
- }
-
- public AbstractEngineConfiguration setEnableConfiguratorServiceLoader(boolean enableConfiguratorServiceLoader) {
- this.enableConfiguratorServiceLoader = enableConfiguratorServiceLoader;
- return this;
- }
-
- public List getConfigurators() {
- return configurators;
- }
-
- public AbstractEngineConfiguration addConfigurator(EngineConfigurator configurator) {
- if (configurators == null) {
- configurators = new ArrayList<>();
- }
- configurators.add(configurator);
- return this;
- }
-
- /**
- * @return All {@link EngineConfigurator} instances. Will only contain values after init of the engine.
- * Use the {@link #getConfigurators()} or {@link #addConfigurator(EngineConfigurator)} methods otherwise.
- */
- public List getAllConfigurators() {
- return allConfigurators;
- }
-
- public AbstractEngineConfiguration setConfigurators(List configurators) {
- this.configurators = configurators;
- return this;
- }
-
- public EngineConfigurator getIdmEngineConfigurator() {
- return idmEngineConfigurator;
- }
-
- public AbstractEngineConfiguration setIdmEngineConfigurator(EngineConfigurator idmEngineConfigurator) {
- this.idmEngineConfigurator = idmEngineConfigurator;
- return this;
- }
-
- public EngineConfigurator getEventRegistryConfigurator() {
- return eventRegistryConfigurator;
- }
-
- public AbstractEngineConfiguration setEventRegistryConfigurator(EngineConfigurator eventRegistryConfigurator) {
- this.eventRegistryConfigurator = eventRegistryConfigurator;
- return this;
- }
-
- public AbstractEngineConfiguration setForceCloseMybatisConnectionPool(boolean forceCloseMybatisConnectionPool) {
- this.forceCloseMybatisConnectionPool = forceCloseMybatisConnectionPool;
- return this;
- }
-
- public boolean isForceCloseMybatisConnectionPool() {
- return forceCloseMybatisConnectionPool;
- }
-}
diff --git a/sql/dm/flowable-patch/src/main/resources/META-INF/package-info.md b/sql/dm/flowable-patch/src/main/resources/META-INF/package-info.md
deleted file mode 100644
index 1932c7a3fc573f2c2f5c35b9797a6e11106cb34f..0000000000000000000000000000000000000000
--- a/sql/dm/flowable-patch/src/main/resources/META-INF/package-info.md
+++ /dev/null
@@ -1 +0,0 @@
-防止IDEA将`.`和`/`混为一谈
\ No newline at end of file
diff --git a/sql/dm/flowable-patch/src/main/resources/META-INF/services/liquibase.database.Database b/sql/dm/flowable-patch/src/main/resources/META-INF/services/liquibase.database.Database
deleted file mode 100644
index efbcfcca21102738a8dab638c90bbe234d552489..0000000000000000000000000000000000000000
--- a/sql/dm/flowable-patch/src/main/resources/META-INF/services/liquibase.database.Database
+++ /dev/null
@@ -1,21 +0,0 @@
-liquibase.database.core.CockroachDatabase
-liquibase.database.core.DB2Database
-liquibase.database.core.Db2zDatabase
-liquibase.database.core.DerbyDatabase
-liquibase.database.core.Firebird3Database
-liquibase.database.core.FirebirdDatabase
-liquibase.database.core.H2Database
-liquibase.database.core.HsqlDatabase
-liquibase.database.core.InformixDatabase
-liquibase.database.core.Ingres9Database
-liquibase.database.core.MSSQLDatabase
-liquibase.database.core.MariaDBDatabase
-liquibase.database.core.MockDatabase
-liquibase.database.core.MySQLDatabase
-liquibase.database.core.OracleDatabase
-liquibase.database.core.PostgresDatabase
-liquibase.database.core.SQLiteDatabase
-liquibase.database.core.SybaseASADatabase
-liquibase.database.core.SybaseDatabase
-liquibase.database.core.DmDatabase
-liquibase.database.core.UnsupportedDatabase
diff --git a/yudao-dependencies/pom.xml b/yudao-dependencies/pom.xml
index 8d8ea44dcc6846899bb8ff428b944cdc970b3e73..98b5641bdedb9e6cf3935aeaa7a71645ffe2a450 100644
--- a/yudao-dependencies/pom.xml
+++ b/yudao-dependencies/pom.xml
@@ -14,13 +14,16 @@
https://github.com/YunaiV/ruoyi-vue-pro
- 2025.09-SNAPSHOT
- 1.7.2
+ 2025.09-jdk8-SNAPSHOT
+ 1.6.0
- 3.5.5
+ 5.3.39
+ 5.8.16
+ 2.7.18
- 2.8.11
+ 1.8.0
4.5.0
+ 2.5
1.2.27
3.5.19
@@ -38,31 +41,30 @@
2.2.7
- 9.5.0
- 3.5.2
+ 8.12.0
+ 2.7.15
0.33.0
- 8.0.2.RELEASE
+ 7.2.11.RELEASE
1.1.11
- 5.2.0
+ 4.11.0
- 7.0.1
+ 6.8.0
1.4.0
1.21.2
1.18.38
1.6.3
5.8.40
- 6.0.0-M22
1.3.0
- 2.4.1
+ 2.4
1.2.83
33.4.8-jre
2.14.5
3.11.1
3.18.0
0.1.55
- 3.2.2
+ 2.9.3
2.7.0
3.0.6
4.2.4.Final
@@ -76,6 +78,8 @@
2.1.1
2.1.0
4.7.7-20250808.182223
+
+ 1.2.13
@@ -88,6 +92,20 @@
pom
import
+
+ org.springframework
+ spring-framework-bom
+ ${spring.framework.version}
+ pom
+ import
+
+
+ org.springframework.security
+ spring-security-bom
+ ${spring.security.version}
+ pom
+ import
+
org.springframework.boot
spring-boot-dependencies
@@ -153,18 +171,12 @@
com.github.xiaoymin
- knife4j-openapi3-jakarta-spring-boot-starter
+ knife4j-openapi3-spring-boot-starter
${knife4j.version}
-
-
- org.springdoc
- springdoc-openapi-starter-webmvc-ui
-
-
org.springdoc
- springdoc-openapi-starter-webmvc-ui
+ springdoc-openapi-ui
${springdoc.version}
@@ -177,7 +189,7 @@
com.alibaba
- druid-spring-boot-3-starter
+ druid-spring-boot-starter
${druid.version}
@@ -188,12 +200,12 @@
com.baomidou
- mybatis-plus-spring-boot3-starter
+ mybatis-plus-boot-starter
${mybatis-plus.version}
com.baomidou
- mybatis-plus-jsqlparser
+ mybatis-plus-jsqlparser-4.9
${mybatis-plus.version}
@@ -203,7 +215,7 @@
com.baomidou
- dynamic-datasource-spring-boot3-starter
+ dynamic-datasource-spring-boot-starter
${dynamic-datasource.version}
@@ -253,8 +265,18 @@
org.springframework.boot
spring-boot-starter-actuator
+
+ org.redisson
+
+ redisson-spring-data-35
+
+
+ org.redisson
+ redisson-spring-data-27
+ ${redisson.version}
+
com.dameng
@@ -383,14 +405,6 @@
${spring-boot-admin.version}
-
-
- cn.iocoder.boot
- yudao-spring-boot-starter-test
- ${revision}
- test
-
-
org.mockito
mockito-inline
@@ -478,11 +492,6 @@
hutool-all
${hutool-5.version}
-
- org.dromara.hutool
- hutool-extra
- ${hutool-6.version}
-
cn.idev.excel
@@ -599,12 +608,12 @@
org.jeecgframework.jimureport
- jimureport-spring-boot3-starter-fastjson2
+ jimureport-spring-boot-starter
${jimureport.version}
org.jeecgframework.jimureport
- jimubi-spring-boot3-starter
+ jimubi-spring-boot-starter
${jimubi.version}
@@ -654,6 +663,18 @@
org.eclipse.paho.client.mqttv3
${mqtt.version}
+
+
+
+ ch.qos.logback
+ logback-core
+ ${logback.version}
+
+
+ ch.qos.logback
+ logback-classic
+ ${logback.version}
+
diff --git a/yudao-framework/pom.xml b/yudao-framework/pom.xml
index 76e674099b9d377a18508c013692cbdc703f9c24..d22b4638b724f550fe2f11783afaf4e58dfc0f75 100644
--- a/yudao-framework/pom.xml
+++ b/yudao-framework/pom.xml
@@ -23,7 +23,6 @@
yudao-spring-boot-starter-mq
yudao-spring-boot-starter-excel
- yudao-spring-boot-starter-test
yudao-spring-boot-starter-biz-tenant
yudao-spring-boot-starter-biz-data-permission
diff --git a/yudao-framework/yudao-common/pom.xml b/yudao-framework/yudao-common/pom.xml
index 4ede9eff2db3f5c4a88fc113bf207ca5842736c7..f364df7c3544d26151ecf6c85492ad6aca58d096 100644
--- a/yudao-framework/yudao-common/pom.xml
+++ b/yudao-framework/yudao-common/pom.xml
@@ -60,7 +60,7 @@
org.springdoc
- springdoc-openapi-starter-webmvc-ui
+ springdoc-openapi-ui
provided
diff --git a/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/biz/infra/logger/ApiAccessLogCommonApi.java b/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/biz/infra/logger/ApiAccessLogCommonApi.java
index efa9ca18380ee936ec1ccf4439de298cf5652641..3f4ff25bef23d668e620b4c9fc7e5e207ac0ec29 100644
--- a/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/biz/infra/logger/ApiAccessLogCommonApi.java
+++ b/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/biz/infra/logger/ApiAccessLogCommonApi.java
@@ -1,9 +1,10 @@
package cn.iocoder.yudao.framework.common.biz.infra.logger;
import cn.iocoder.yudao.framework.common.biz.infra.logger.dto.ApiAccessLogCreateReqDTO;
-import jakarta.validation.Valid;
import org.springframework.scheduling.annotation.Async;
+import javax.validation.Valid;
+
/**
* API 访问日志的 API 接口
*
diff --git a/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/biz/infra/logger/ApiErrorLogCommonApi.java b/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/biz/infra/logger/ApiErrorLogCommonApi.java
index 98743be31f76f9cfd36314632affde84107c3732..8905d0a4893593ea80066ea78b37e67a05e2fbbc 100644
--- a/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/biz/infra/logger/ApiErrorLogCommonApi.java
+++ b/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/biz/infra/logger/ApiErrorLogCommonApi.java
@@ -1,10 +1,10 @@
package cn.iocoder.yudao.framework.common.biz.infra.logger;
import cn.iocoder.yudao.framework.common.biz.infra.logger.dto.ApiErrorLogCreateReqDTO;
-
-import jakarta.validation.Valid;
import org.springframework.scheduling.annotation.Async;
+import javax.validation.Valid;
+
/**
* API 错误日志的 API 接口
*
diff --git a/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/biz/infra/logger/dto/ApiAccessLogCreateReqDTO.java b/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/biz/infra/logger/dto/ApiAccessLogCreateReqDTO.java
index b579cd31bc98da7b74ba6703b45e8184b3d10830..d4263576cb06dcee107acdc7dd5a81f879126f9b 100644
--- a/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/biz/infra/logger/dto/ApiAccessLogCreateReqDTO.java
+++ b/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/biz/infra/logger/dto/ApiAccessLogCreateReqDTO.java
@@ -1,8 +1,8 @@
package cn.iocoder.yudao.framework.common.biz.infra.logger.dto;
-import jakarta.validation.constraints.NotNull;
import lombok.Data;
+import javax.validation.constraints.NotNull;
import java.time.LocalDateTime;
/**
diff --git a/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/biz/infra/logger/dto/ApiErrorLogCreateReqDTO.java b/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/biz/infra/logger/dto/ApiErrorLogCreateReqDTO.java
index ae5cd1d4da00d0f6587cfe598d8f11db7be093f5..e5939f53b550dfdc0c9640151d4741dfb8feccc6 100644
--- a/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/biz/infra/logger/dto/ApiErrorLogCreateReqDTO.java
+++ b/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/biz/infra/logger/dto/ApiErrorLogCreateReqDTO.java
@@ -2,7 +2,7 @@ package cn.iocoder.yudao.framework.common.biz.infra.logger.dto;
import lombok.Data;
-import jakarta.validation.constraints.NotNull;
+import javax.validation.constraints.NotNull;
import java.time.LocalDateTime;
/**
diff --git a/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/biz/system/logger/OperateLogCommonApi.java b/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/biz/system/logger/OperateLogCommonApi.java
index 96753e0f6a18b58c892f3ad8a0dcfda5e59969c9..845181f4ec4661a82b3e8ef9c717a47523712399 100644
--- a/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/biz/system/logger/OperateLogCommonApi.java
+++ b/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/biz/system/logger/OperateLogCommonApi.java
@@ -1,9 +1,10 @@
package cn.iocoder.yudao.framework.common.biz.system.logger;
import cn.iocoder.yudao.framework.common.biz.system.logger.dto.OperateLogCreateReqDTO;
-import jakarta.validation.Valid;
import org.springframework.scheduling.annotation.Async;
+import javax.validation.Valid;
+
/**
* 操作日志 API 接口
*
diff --git a/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/biz/system/logger/dto/OperateLogCreateReqDTO.java b/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/biz/system/logger/dto/OperateLogCreateReqDTO.java
index a2d799025186a15c62b0b5a94d77acb978b05fb8..561697a6a2843b37672f5ee6733f1c395f32f750 100644
--- a/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/biz/system/logger/dto/OperateLogCreateReqDTO.java
+++ b/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/biz/system/logger/dto/OperateLogCreateReqDTO.java
@@ -1,10 +1,11 @@
package cn.iocoder.yudao.framework.common.biz.system.logger.dto;
import cn.iocoder.yudao.framework.common.enums.UserTypeEnum;
-import jakarta.validation.constraints.NotEmpty;
-import jakarta.validation.constraints.NotNull;
import lombok.Data;
+import javax.validation.constraints.NotEmpty;
+import javax.validation.constraints.NotNull;
+
/**
* 系统操作日志 Create Request DTO
*
diff --git a/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/biz/system/oauth2/OAuth2TokenCommonApi.java b/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/biz/system/oauth2/OAuth2TokenCommonApi.java
index c23d936c9a9068e8271b0927b7b9749c611e7067..7c692c8dfd2aea50f36bbea7826b9b6b1099abf2 100644
--- a/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/biz/system/oauth2/OAuth2TokenCommonApi.java
+++ b/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/biz/system/oauth2/OAuth2TokenCommonApi.java
@@ -4,7 +4,7 @@ import cn.iocoder.yudao.framework.common.biz.system.oauth2.dto.OAuth2AccessToken
import cn.iocoder.yudao.framework.common.biz.system.oauth2.dto.OAuth2AccessTokenCreateReqDTO;
import cn.iocoder.yudao.framework.common.biz.system.oauth2.dto.OAuth2AccessTokenRespDTO;
-import jakarta.validation.Valid;
+import javax.validation.Valid;
/**
* OAuth2.0 Token API 接口
diff --git a/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/biz/system/oauth2/dto/OAuth2AccessTokenCreateReqDTO.java b/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/biz/system/oauth2/dto/OAuth2AccessTokenCreateReqDTO.java
index 72dcd9be8216bf7fb67744e8a55546e38c669d57..12df04a68eb2688b2896d3ad0a425581c7800170 100644
--- a/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/biz/system/oauth2/dto/OAuth2AccessTokenCreateReqDTO.java
+++ b/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/biz/system/oauth2/dto/OAuth2AccessTokenCreateReqDTO.java
@@ -4,7 +4,7 @@ import cn.iocoder.yudao.framework.common.enums.UserTypeEnum;
import cn.iocoder.yudao.framework.common.validation.InEnum;
import lombok.Data;
-import jakarta.validation.constraints.NotNull;
+import javax.validation.constraints.NotNull;
import java.io.Serializable;
import java.util.List;
diff --git a/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/pojo/PageParam.java b/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/pojo/PageParam.java
index 268d117f95744785489a5c795e29e53f29f6f9f3..97819f993825ec23fefc5ba155f448870f91b3eb 100644
--- a/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/pojo/PageParam.java
+++ b/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/pojo/PageParam.java
@@ -3,9 +3,9 @@ package cn.iocoder.yudao.framework.common.pojo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
-import jakarta.validation.constraints.Min;
-import jakarta.validation.constraints.Max;
-import jakarta.validation.constraints.NotNull;
+import javax.validation.constraints.Min;
+import javax.validation.constraints.Max;
+import javax.validation.constraints.NotNull;
import java.io.Serializable;
@Schema(description="分页参数")
diff --git a/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/util/http/HttpUtils.java b/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/util/http/HttpUtils.java
index 85a644f1f162adde7c4f626ec52cd9f75ddd243f..3f662a85e7256ad9840d2151b8a26a6924ff9ccc 100644
--- a/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/util/http/HttpUtils.java
+++ b/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/util/http/HttpUtils.java
@@ -7,11 +7,12 @@ import cn.hutool.core.util.ReflectUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.http.HttpRequest;
import cn.hutool.http.HttpResponse;
-import jakarta.servlet.http.HttpServletRequest;
+import lombok.SneakyThrows;
import org.springframework.util.StringUtils;
import org.springframework.web.util.UriComponents;
import org.springframework.web.util.UriComponentsBuilder;
+import javax.servlet.http.HttpServletRequest;
import java.net.URI;
import java.net.URLEncoder;
import java.nio.charset.Charset;
@@ -31,8 +32,9 @@ public class HttpUtils {
* @param value 参数
* @return 编码后的参数
*/
+ @SneakyThrows
public static String encodeUtf8(String value) {
- return URLEncoder.encode(value, StandardCharsets.UTF_8);
+ return URLEncoder.encode(value, StandardCharsets.UTF_8.name());
}
@SuppressWarnings("unchecked")
diff --git a/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/util/servlet/ServletUtils.java b/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/util/servlet/ServletUtils.java
index 905f5d5416a97b54dc5d568cc2f550c17bc4289a..3bffc2fda3d58d7a88dda7bbf2567aed04a5d97a 100644
--- a/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/util/servlet/ServletUtils.java
+++ b/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/util/servlet/ServletUtils.java
@@ -1,16 +1,19 @@
package cn.iocoder.yudao.framework.common.util.servlet;
+import cn.hutool.core.io.IoUtil;
import cn.hutool.core.util.StrUtil;
-import cn.hutool.extra.servlet.JakartaServletUtil;
+import cn.hutool.extra.servlet.ServletUtil;
import cn.iocoder.yudao.framework.common.util.json.JsonUtils;
-import jakarta.servlet.ServletRequest;
-import jakarta.servlet.http.HttpServletRequest;
-import jakarta.servlet.http.HttpServletResponse;
import org.springframework.http.MediaType;
import org.springframework.web.context.request.RequestAttributes;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
+import javax.servlet.ServletRequest;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.io.IOException;
+import java.net.URLEncoder;
import java.util.Map;
/**
@@ -29,7 +32,22 @@ public class ServletUtils {
@SuppressWarnings("deprecation") // 必须使用 APPLICATION_JSON_UTF8_VALUE,否则会乱码
public static void writeJSON(HttpServletResponse response, Object object) {
String content = JsonUtils.toJsonString(object);
- JakartaServletUtil.write(response, content, MediaType.APPLICATION_JSON_UTF8_VALUE);
+ ServletUtil.write(response, content, MediaType.APPLICATION_JSON_UTF8_VALUE);
+ }
+
+ /**
+ * 返回附件
+ *
+ * @param response 响应
+ * @param filename 文件名
+ * @param content 附件内容
+ */
+ public static void writeAttachment(HttpServletResponse response, String filename, byte[] content) throws IOException {
+ // 设置 header 和 contentType
+ response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(filename, "UTF-8"));
+ response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE);
+ // 输出附件
+ IoUtil.write(response.getOutputStream(), false, content);
}
/**
@@ -67,7 +85,7 @@ public class ServletUtils {
if (request == null) {
return null;
}
- return JakartaServletUtil.getClientIP(request);
+ return ServletUtil.getClientIP(request);
}
public static boolean isJsonRequest(ServletRequest request) {
@@ -77,7 +95,7 @@ public class ServletUtils {
public static String getBody(HttpServletRequest request) {
// 只有在 json 请求在读取,因为只有 CacheRequestBodyFilter 才会进行缓存,支持重复读取
if (isJsonRequest(request)) {
- return JakartaServletUtil.getBody(request);
+ return ServletUtil.getBody(request);
}
return null;
}
@@ -85,21 +103,21 @@ public class ServletUtils {
public static byte[] getBodyBytes(HttpServletRequest request) {
// 只有在 json 请求在读取,因为只有 CacheRequestBodyFilter 才会进行缓存,支持重复读取
if (isJsonRequest(request)) {
- return JakartaServletUtil.getBodyBytes(request);
+ return ServletUtil.getBodyBytes(request);
}
return null;
}
public static String getClientIP(HttpServletRequest request) {
- return JakartaServletUtil.getClientIP(request);
+ return ServletUtil.getClientIP(request);
}
public static Map getParamMap(HttpServletRequest request) {
- return JakartaServletUtil.getParamMap(request);
+ return ServletUtil.getParamMap(request);
}
public static Map getHeaderMap(HttpServletRequest request) {
- return JakartaServletUtil.getHeaderMap(request);
+ return ServletUtil.getHeaderMap(request);
}
}
diff --git a/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/util/validation/ValidationUtils.java b/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/util/validation/ValidationUtils.java
index a71ebd30583654ab7240b2428160871409694cd9..436a9e6690732ad65d4ee01cc29afa8724036624 100644
--- a/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/util/validation/ValidationUtils.java
+++ b/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/util/validation/ValidationUtils.java
@@ -4,10 +4,10 @@ import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.lang.Assert;
import org.springframework.util.StringUtils;
-import jakarta.validation.ConstraintViolation;
-import jakarta.validation.ConstraintViolationException;
-import jakarta.validation.Validation;
-import jakarta.validation.Validator;
+import javax.validation.ConstraintViolation;
+import javax.validation.ConstraintViolationException;
+import javax.validation.Validation;
+import javax.validation.Validator;
import java.util.Set;
import java.util.regex.Pattern;
diff --git a/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/validation/InEnum.java b/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/validation/InEnum.java
index 407d01b0a1ba864d76d28940173e4ab39b9f18f7..d27a6431e84809ea07ed7d00caa3b77e3b5316a3 100644
--- a/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/validation/InEnum.java
+++ b/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/validation/InEnum.java
@@ -1,9 +1,9 @@
package cn.iocoder.yudao.framework.common.validation;
import cn.iocoder.yudao.framework.common.core.ArrayValuable;
-import jakarta.validation.Constraint;
-import jakarta.validation.Payload;
+import javax.validation.Constraint;
+import javax.validation.Payload;
import java.lang.annotation.*;
@Target({
diff --git a/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/validation/InEnumCollectionValidator.java b/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/validation/InEnumCollectionValidator.java
index b21a92948675f86647b608520c757242cf559819..b0551bd8f2c70bc0fb67c7afae20e57923cc87e1 100644
--- a/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/validation/InEnumCollectionValidator.java
+++ b/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/validation/InEnumCollectionValidator.java
@@ -2,9 +2,9 @@ package cn.iocoder.yudao.framework.common.validation;
import cn.hutool.core.collection.CollUtil;
import cn.iocoder.yudao.framework.common.core.ArrayValuable;
-import jakarta.validation.ConstraintValidator;
-import jakarta.validation.ConstraintValidatorContext;
+import javax.validation.ConstraintValidator;
+import javax.validation.ConstraintValidatorContext;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
diff --git a/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/validation/InEnumValidator.java b/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/validation/InEnumValidator.java
index e80eac4bdb3c4c550da2a98fd8753c1848b145da..bd7e287846843796e701ca6d0ffcc143656766b5 100644
--- a/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/validation/InEnumValidator.java
+++ b/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/validation/InEnumValidator.java
@@ -1,9 +1,9 @@
package cn.iocoder.yudao.framework.common.validation;
import cn.iocoder.yudao.framework.common.core.ArrayValuable;
-import jakarta.validation.ConstraintValidator;
-import jakarta.validation.ConstraintValidatorContext;
+import javax.validation.ConstraintValidator;
+import javax.validation.ConstraintValidatorContext;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
diff --git a/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/validation/Mobile.java b/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/validation/Mobile.java
index bcb75f65ee784c081e3b93f5d1ba1424ea9d2e02..4c7cb10ba1a80255ee3c1a9346dd696049eb8ae2 100644
--- a/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/validation/Mobile.java
+++ b/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/validation/Mobile.java
@@ -1,7 +1,7 @@
package cn.iocoder.yudao.framework.common.validation;
-import jakarta.validation.Constraint;
-import jakarta.validation.Payload;
+import javax.validation.Constraint;
+import javax.validation.Payload;
import java.lang.annotation.*;
@Target({
diff --git a/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/validation/MobileValidator.java b/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/validation/MobileValidator.java
index f2def564b1e131f0a6e42b738aea8103ae07886c..0bddfcb213f81dab2723066a842d8e0726e46451 100644
--- a/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/validation/MobileValidator.java
+++ b/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/validation/MobileValidator.java
@@ -3,8 +3,8 @@ package cn.iocoder.yudao.framework.common.validation;
import cn.hutool.core.util.StrUtil;
import cn.iocoder.yudao.framework.common.util.validation.ValidationUtils;
-import jakarta.validation.ConstraintValidator;
-import jakarta.validation.ConstraintValidatorContext;
+import javax.validation.ConstraintValidator;
+import javax.validation.ConstraintValidatorContext;
public class MobileValidator implements ConstraintValidator {
diff --git a/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/validation/Telephone.java b/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/validation/Telephone.java
index fa534e1c6bfe90a7957a20ef5ead3f1ee33698d3..910601fd0f12efce8e07d749d28d443d60fc9f34 100644
--- a/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/validation/Telephone.java
+++ b/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/validation/Telephone.java
@@ -1,7 +1,7 @@
package cn.iocoder.yudao.framework.common.validation;
-import jakarta.validation.Constraint;
-import jakarta.validation.Payload;
+import javax.validation.Constraint;
+import javax.validation.Payload;
import java.lang.annotation.*;
@Target({
diff --git a/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/validation/TelephoneValidator.java b/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/validation/TelephoneValidator.java
index 1406e07067bd8ee4b0a93e3c40d734cb32c9a5c1..d214cfeef4574913612019b32c2b6d9a690ccb64 100644
--- a/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/validation/TelephoneValidator.java
+++ b/yudao-framework/yudao-common/src/main/java/cn/iocoder/yudao/framework/common/validation/TelephoneValidator.java
@@ -3,8 +3,8 @@ package cn.iocoder.yudao.framework.common.validation;
import cn.hutool.core.text.CharSequenceUtil;
import cn.hutool.core.util.PhoneUtil;
-import jakarta.validation.ConstraintValidator;
-import jakarta.validation.ConstraintValidatorContext;
+import javax.validation.ConstraintValidator;
+import javax.validation.ConstraintValidatorContext;
public class TelephoneValidator implements ConstraintValidator {
diff --git a/yudao-framework/yudao-common/src/test/java/cn/iocoder/yudao/framework/common/util/collection/CollectionUtilsTest.java b/yudao-framework/yudao-common/src/test/java/cn/iocoder/yudao/framework/common/util/collection/CollectionUtilsTest.java
deleted file mode 100644
index 0e44645bc537be62d545e5b70400299c46decdbb..0000000000000000000000000000000000000000
--- a/yudao-framework/yudao-common/src/test/java/cn/iocoder/yudao/framework/common/util/collection/CollectionUtilsTest.java
+++ /dev/null
@@ -1,64 +0,0 @@
-package cn.iocoder.yudao.framework.common.util.collection;
-
-import lombok.AllArgsConstructor;
-import lombok.Data;
-import org.junit.jupiter.api.Test;
-
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.List;
-import java.util.function.BiFunction;
-
-import static org.junit.jupiter.api.Assertions.assertEquals;
-
-/**
- * {@link CollectionUtils} 的单元测试
- */
-public class CollectionUtilsTest {
-
- @Data
- @AllArgsConstructor
- private static class Dog {
-
- private Integer id;
- private String name;
- private String code;
-
- }
-
- @Test
- public void testDiffList() {
- // 准备参数
- Collection oldList = Arrays.asList(
- new Dog(1, "花花", "hh"),
- new Dog(2, "旺财", "wc")
- );
- Collection newList = Arrays.asList(
- new Dog(null, "花花2", "hh"),
- new Dog(null, "小白", "xb")
- );
- BiFunction sameFunc = (oldObj, newObj) -> {
- boolean same = oldObj.getCode().equals(newObj.getCode());
- // 如果相等的情况下,需要设置下 id,后续好更新
- if (same) {
- newObj.setId(oldObj.getId());
- }
- return same;
- };
-
- // 调用
- List> result = CollectionUtils.diffList(oldList, newList, sameFunc);
- // 断言
- assertEquals(result.size(), 3);
- // 断言 create
- assertEquals(result.get(0).size(), 1);
- assertEquals(result.get(0).get(0), new Dog(null, "小白", "xb"));
- // 断言 update
- assertEquals(result.get(1).size(), 1);
- assertEquals(result.get(1).get(0), new Dog(1, "花花2", "hh"));
- // 断言 delete
- assertEquals(result.get(2).size(), 1);
- assertEquals(result.get(2).get(0), new Dog(2, "旺财", "wc"));
- }
-
-}
diff --git a/yudao-framework/yudao-spring-boot-starter-biz-data-permission/pom.xml b/yudao-framework/yudao-spring-boot-starter-biz-data-permission/pom.xml
index 802ff1904eb1066a09f6ee82eed402be9a326b51..6c6e82856987e1c3dc668ffd81b262ce1c8cb292 100644
--- a/yudao-framework/yudao-spring-boot-starter-biz-data-permission/pom.xml
+++ b/yudao-framework/yudao-spring-boot-starter-biz-data-permission/pom.xml
@@ -34,12 +34,6 @@
yudao-spring-boot-starter-mybatis
-
-
- cn.iocoder.boot
- yudao-spring-boot-starter-test
- test
-
diff --git a/yudao-framework/yudao-spring-boot-starter-biz-data-permission/src/test/java/cn/iocoder/yudao/framework/datapermission/core/aop/DataPermissionAnnotationInterceptorTest.java b/yudao-framework/yudao-spring-boot-starter-biz-data-permission/src/test/java/cn/iocoder/yudao/framework/datapermission/core/aop/DataPermissionAnnotationInterceptorTest.java
deleted file mode 100644
index ba97ede2fcbd9f23662873238ed200dfeddba4e4..0000000000000000000000000000000000000000
--- a/yudao-framework/yudao-spring-boot-starter-biz-data-permission/src/test/java/cn/iocoder/yudao/framework/datapermission/core/aop/DataPermissionAnnotationInterceptorTest.java
+++ /dev/null
@@ -1,108 +0,0 @@
-package cn.iocoder.yudao.framework.datapermission.core.aop;
-
-import cn.hutool.core.collection.CollUtil;
-import cn.iocoder.yudao.framework.datapermission.core.annotation.DataPermission;
-import cn.iocoder.yudao.framework.test.core.ut.BaseMockitoUnitTest;
-import org.aopalliance.intercept.MethodInvocation;
-import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.Test;
-import org.mockito.InjectMocks;
-import org.mockito.Mock;
-
-import java.lang.reflect.Method;
-
-import static org.junit.jupiter.api.Assertions.*;
-import static org.mockito.Mockito.when;
-
-/**
- * {@link DataPermissionAnnotationInterceptor} 的单元测试
- *
- * @author 芋道源码
- */
-public class DataPermissionAnnotationInterceptorTest extends BaseMockitoUnitTest {
-
- @InjectMocks
- private DataPermissionAnnotationInterceptor interceptor;
-
- @Mock
- private MethodInvocation methodInvocation;
-
- @BeforeEach
- public void setUp() {
- interceptor.getDataPermissionCache().clear();
- }
-
- @Test // 无 @DataPermission 注解
- public void testInvoke_none() throws Throwable {
- // 参数
- mockMethodInvocation(TestNone.class);
-
- // 调用
- Object result = interceptor.invoke(methodInvocation);
- // 断言
- assertEquals("none", result);
- assertEquals(1, interceptor.getDataPermissionCache().size());
- assertTrue(CollUtil.getFirst(interceptor.getDataPermissionCache().values()).enable());
- }
-
- @Test // 在 Method 上有 @DataPermission 注解
- public void testInvoke_method() throws Throwable {
- // 参数
- mockMethodInvocation(TestMethod.class);
-
- // 调用
- Object result = interceptor.invoke(methodInvocation);
- // 断言
- assertEquals("method", result);
- assertEquals(1, interceptor.getDataPermissionCache().size());
- assertFalse(CollUtil.getFirst(interceptor.getDataPermissionCache().values()).enable());
- }
-
- @Test // 在 Class 上有 @DataPermission 注解
- public void testInvoke_class() throws Throwable {
- // 参数
- mockMethodInvocation(TestClass.class);
-
- // 调用
- Object result = interceptor.invoke(methodInvocation);
- // 断言
- assertEquals("class", result);
- assertEquals(1, interceptor.getDataPermissionCache().size());
- assertFalse(CollUtil.getFirst(interceptor.getDataPermissionCache().values()).enable());
- }
-
- private void mockMethodInvocation(Class> clazz) throws Throwable {
- Object targetObject = clazz.newInstance();
- Method method = targetObject.getClass().getMethod("echo");
- when(methodInvocation.getThis()).thenReturn(targetObject);
- when(methodInvocation.getMethod()).thenReturn(method);
- when(methodInvocation.proceed()).then(invocationOnMock -> method.invoke(targetObject));
- }
-
- static class TestMethod {
-
- @DataPermission(enable = false)
- public String echo() {
- return "method";
- }
-
- }
-
- @DataPermission(enable = false)
- static class TestClass {
-
- public String echo() {
- return "class";
- }
-
- }
-
- static class TestNone {
-
- public String echo() {
- return "none";
- }
-
- }
-
-}
diff --git a/yudao-framework/yudao-spring-boot-starter-biz-data-permission/src/test/java/cn/iocoder/yudao/framework/datapermission/core/aop/DataPermissionContextHolderTest.java b/yudao-framework/yudao-spring-boot-starter-biz-data-permission/src/test/java/cn/iocoder/yudao/framework/datapermission/core/aop/DataPermissionContextHolderTest.java
deleted file mode 100644
index 688b92d9f24fa39fb85689bf1e1e719f9a84787e..0000000000000000000000000000000000000000
--- a/yudao-framework/yudao-spring-boot-starter-biz-data-permission/src/test/java/cn/iocoder/yudao/framework/datapermission/core/aop/DataPermissionContextHolderTest.java
+++ /dev/null
@@ -1,66 +0,0 @@
-package cn.iocoder.yudao.framework.datapermission.core.aop;
-
-import cn.iocoder.yudao.framework.datapermission.core.annotation.DataPermission;
-import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.Test;
-
-import static org.junit.jupiter.api.Assertions.assertEquals;
-import static org.junit.jupiter.api.Assertions.assertSame;
-import static org.mockito.Mockito.mock;
-
-/**
- * {@link DataPermissionContextHolder} 的单元测试
- *
- * @author 芋道源码
- */
-class DataPermissionContextHolderTest {
-
- @BeforeEach
- public void setUp() {
- DataPermissionContextHolder.clear();
- }
-
- @Test
- public void testGet() {
- // mock 方法
- DataPermission dataPermission01 = mock(DataPermission.class);
- DataPermissionContextHolder.add(dataPermission01);
- DataPermission dataPermission02 = mock(DataPermission.class);
- DataPermissionContextHolder.add(dataPermission02);
-
- // 调用
- DataPermission result = DataPermissionContextHolder.get();
- // 断言
- assertSame(result, dataPermission02);
- }
-
- @Test
- public void testPush() {
- // 调用
- DataPermission dataPermission01 = mock(DataPermission.class);
- DataPermissionContextHolder.add(dataPermission01);
- DataPermission dataPermission02 = mock(DataPermission.class);
- DataPermissionContextHolder.add(dataPermission02);
- // 断言
- DataPermission first = DataPermissionContextHolder.getAll().get(0);
- DataPermission second = DataPermissionContextHolder.getAll().get(1);
- assertSame(dataPermission01, first);
- assertSame(dataPermission02, second);
- }
-
- @Test
- public void testRemove() {
- // mock 方法
- DataPermission dataPermission01 = mock(DataPermission.class);
- DataPermissionContextHolder.add(dataPermission01);
- DataPermission dataPermission02 = mock(DataPermission.class);
- DataPermissionContextHolder.add(dataPermission02);
-
- // 调用
- DataPermission result = DataPermissionContextHolder.remove();
- // 断言
- assertSame(result, dataPermission02);
- assertEquals(1, DataPermissionContextHolder.getAll().size());
- }
-
-}
diff --git a/yudao-framework/yudao-spring-boot-starter-biz-data-permission/src/test/java/cn/iocoder/yudao/framework/datapermission/core/db/DataPermissionRuleHandlerTest.java b/yudao-framework/yudao-spring-boot-starter-biz-data-permission/src/test/java/cn/iocoder/yudao/framework/datapermission/core/db/DataPermissionRuleHandlerTest.java
deleted file mode 100644
index c7a0d085e21bf13143109b61c737bbb8f23fc36d..0000000000000000000000000000000000000000
--- a/yudao-framework/yudao-spring-boot-starter-biz-data-permission/src/test/java/cn/iocoder/yudao/framework/datapermission/core/db/DataPermissionRuleHandlerTest.java
+++ /dev/null
@@ -1,540 +0,0 @@
-package cn.iocoder.yudao.framework.datapermission.core.db;
-
-import cn.iocoder.yudao.framework.datapermission.core.rule.DataPermissionRule;
-import cn.iocoder.yudao.framework.datapermission.core.rule.DataPermissionRuleFactory;
-import cn.iocoder.yudao.framework.mybatis.core.util.MyBatisUtils;
-import cn.iocoder.yudao.framework.test.core.ut.BaseMockitoUnitTest;
-import com.baomidou.mybatisplus.extension.plugins.inner.DataPermissionInterceptor;
-import net.sf.jsqlparser.expression.Alias;
-import net.sf.jsqlparser.expression.Expression;
-import net.sf.jsqlparser.expression.LongValue;
-import net.sf.jsqlparser.expression.operators.relational.EqualsTo;
-import net.sf.jsqlparser.expression.operators.relational.ExpressionList;
-import net.sf.jsqlparser.expression.operators.relational.InExpression;
-import net.sf.jsqlparser.expression.operators.relational.ParenthesedExpressionList;
-import net.sf.jsqlparser.schema.Column;
-import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.Test;
-import org.mockito.InjectMocks;
-import org.mockito.Mock;
-
-import java.util.Arrays;
-import java.util.Set;
-
-import static cn.iocoder.yudao.framework.common.util.collection.SetUtils.asSet;
-import static org.junit.jupiter.api.Assertions.assertEquals;
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.Mockito.when;
-
-/**
- * {@link DataPermissionRuleHandler} 的单元测试
- * 主要复用了 MyBatis Plus 的 TenantLineInnerInterceptorTest 的单元测试
- * 不过它的单元测试不是很规范,考虑到是复用的,所以暂时不进行修改~
- *
- * @author 芋道源码
- */
-public class DataPermissionRuleHandlerTest extends BaseMockitoUnitTest {
-
- @InjectMocks
- private DataPermissionRuleHandler handler;
-
- @Mock
- private DataPermissionRuleFactory ruleFactory;
-
- private DataPermissionInterceptor interceptor;
-
- @BeforeEach
- public void setUp() {
- interceptor = new DataPermissionInterceptor(handler);
-
- // 租户的数据权限规则
- DataPermissionRule tenantRule = new DataPermissionRule() {
-
- private static final String COLUMN = "tenant_id";
-
- @Override
- public Set getTableNames() {
- return asSet("entity", "entity1", "entity2", "entity3", "t1", "t2", "sys_dict_item", // 支持 MyBatis Plus 的单元测试
- "t_user", "t_role"); // 满足自己的单元测试
- }
-
- @Override
- public Expression getExpression(String tableName, Alias tableAlias) {
- Column column = MyBatisUtils.buildColumn(tableName, tableAlias, COLUMN);
- LongValue value = new LongValue(1L);
- return new EqualsTo(column, value);
- }
-
- };
- // 部门的数据权限规则
- DataPermissionRule deptRule = new DataPermissionRule() {
-
- private static final String COLUMN = "dept_id";
-
- @Override
- public Set getTableNames() {
- return asSet("t_user"); // 满足自己的单元测试
- }
-
- @Override
- public Expression getExpression(String tableName, Alias tableAlias) {
- Column column = MyBatisUtils.buildColumn(tableName, tableAlias, COLUMN);
- ExpressionList values = new ExpressionList<>(new LongValue(10L),
- new LongValue(20L));
- return new InExpression(column, new ParenthesedExpressionList((values)));
- }
-
- };
- // 设置到上下文
- when(ruleFactory.getDataPermissionRule(any())).thenReturn(Arrays.asList(tenantRule, deptRule));
- }
-
- @Test
- void delete() {
- assertSql("delete from entity where id = ?",
- "DELETE FROM entity WHERE id = ? AND entity.tenant_id = 1");
- }
-
- @Test
- void update() {
- assertSql("update entity set name = ? where id = ?",
- "UPDATE entity SET name = ? WHERE id = ? AND entity.tenant_id = 1");
- }
-
- @Test
- void selectSingle() {
- // 单表
- assertSql("select * from entity where id = ?",
- "SELECT * FROM entity WHERE id = ? AND entity.tenant_id = 1");
-
- assertSql("select * from entity where id = ? or name = ?",
- "SELECT * FROM entity WHERE (id = ? OR name = ?) AND entity.tenant_id = 1");
-
- assertSql("SELECT * FROM entity WHERE (id = ? OR name = ?)",
- "SELECT * FROM entity WHERE (id = ? OR name = ?) AND entity.tenant_id = 1");
-
- /* not */
- assertSql("SELECT * FROM entity WHERE not (id = ? OR name = ?)",
- "SELECT * FROM entity WHERE NOT (id = ? OR name = ?) AND entity.tenant_id = 1");
- }
-
- @Test
- void selectSubSelectIn() {
- /* in */
- assertSql("SELECT * FROM entity e WHERE e.id IN (select e1.id from entity1 e1 where e1.id = ?)",
- "SELECT * FROM entity e WHERE e.id IN (SELECT e1.id FROM entity1 e1 WHERE e1.id = ? AND e1.tenant_id = 1) AND e.tenant_id = 1");
- // 在最前
- assertSql("SELECT * FROM entity e WHERE e.id IN " +
- "(select e1.id from entity1 e1 where e1.id = ?) and e.id = ?",
- "SELECT * FROM entity e WHERE e.id IN " +
- "(SELECT e1.id FROM entity1 e1 WHERE e1.id = ? AND e1.tenant_id = 1) AND e.id = ? AND e.tenant_id = 1");
- // 在最后
- assertSql("SELECT * FROM entity e WHERE e.id = ? and e.id IN " +
- "(select e1.id from entity1 e1 where e1.id = ?)",
- "SELECT * FROM entity e WHERE e.id = ? AND e.id IN " +
- "(SELECT e1.id FROM entity1 e1 WHERE e1.id = ? AND e1.tenant_id = 1) AND e.tenant_id = 1");
- // 在中间
- assertSql("SELECT * FROM entity e WHERE e.id = ? and e.id IN " +
- "(select e1.id from entity1 e1 where e1.id = ?) and e.id = ?",
- "SELECT * FROM entity e WHERE e.id = ? AND e.id IN " +
- "(SELECT e1.id FROM entity1 e1 WHERE e1.id = ? AND e1.tenant_id = 1) AND e.id = ? AND e.tenant_id = 1");
- }
-
- @Test
- void selectSubSelectEq() {
- /* = */
- assertSql("SELECT * FROM entity e WHERE e.id = (select e1.id from entity1 e1 where e1.id = ?)",
- "SELECT * FROM entity e WHERE e.id = (SELECT e1.id FROM entity1 e1 WHERE e1.id = ? AND e1.tenant_id = 1) AND e.tenant_id = 1");
- }
-
- @Test
- void selectSubSelectInnerNotEq() {
- /* inner not = */
- assertSql("SELECT * FROM entity e WHERE not (e.id = (select e1.id from entity1 e1 where e1.id = ?))",
- "SELECT * FROM entity e WHERE NOT (e.id = (SELECT e1.id FROM entity1 e1 WHERE e1.id = ? AND e1.tenant_id = 1)) AND e.tenant_id = 1");
-
- assertSql("SELECT * FROM entity e WHERE not (e.id = (select e1.id from entity1 e1 where e1.id = ?) and e.id = ?)",
- "SELECT * FROM entity e WHERE NOT (e.id = (SELECT e1.id FROM entity1 e1 WHERE e1.id = ? AND e1.tenant_id = 1) AND e.id = ?) AND e.tenant_id = 1");
- }
-
- @Test
- void selectSubSelectExists() {
- /* EXISTS */
- assertSql("SELECT * FROM entity e WHERE EXISTS (select e1.id from entity1 e1 where e1.id = ?)",
- "SELECT * FROM entity e WHERE EXISTS (SELECT e1.id FROM entity1 e1 WHERE e1.id = ? AND e1.tenant_id = 1) AND e.tenant_id = 1");
-
-
- /* NOT EXISTS */
- assertSql("SELECT * FROM entity e WHERE NOT EXISTS (select e1.id from entity1 e1 where e1.id = ?)",
- "SELECT * FROM entity e WHERE NOT EXISTS (SELECT e1.id FROM entity1 e1 WHERE e1.id = ? AND e1.tenant_id = 1) AND e.tenant_id = 1");
- }
-
- @Test
- void selectSubSelect() {
- /* >= */
- assertSql("SELECT * FROM entity e WHERE e.id >= (select e1.id from entity1 e1 where e1.id = ?)",
- "SELECT * FROM entity e WHERE e.id >= (SELECT e1.id FROM entity1 e1 WHERE e1.id = ? AND e1.tenant_id = 1) AND e.tenant_id = 1");
-
-
- /* <= */
- assertSql("SELECT * FROM entity e WHERE e.id <= (select e1.id from entity1 e1 where e1.id = ?)",
- "SELECT * FROM entity e WHERE e.id <= (SELECT e1.id FROM entity1 e1 WHERE e1.id = ? AND e1.tenant_id = 1) AND e.tenant_id = 1");
-
-
- /* <> */
- assertSql("SELECT * FROM entity e WHERE e.id <> (select e1.id from entity1 e1 where e1.id = ?)",
- "SELECT * FROM entity e WHERE e.id <> (SELECT e1.id FROM entity1 e1 WHERE e1.id = ? AND e1.tenant_id = 1) AND e.tenant_id = 1");
- }
-
- @Test
- void selectFromSelect() {
- assertSql("SELECT * FROM (select e.id from entity e WHERE e.id = (select e1.id from entity1 e1 where e1.id = ?))",
- "SELECT * FROM (SELECT e.id FROM entity e WHERE e.id = (SELECT e1.id FROM entity1 e1 WHERE e1.id = ? AND e1.tenant_id = 1) AND e.tenant_id = 1)");
- }
-
- @Test
- void selectBodySubSelect() {
- assertSql("select t1.col1,(select t2.col2 from t2 t2 where t1.col1=t2.col1) from t1 t1",
- "SELECT t1.col1, (SELECT t2.col2 FROM t2 t2 WHERE t1.col1 = t2.col1 AND t2.tenant_id = 1) FROM t1 t1 WHERE t1.tenant_id = 1");
- }
-
- @Test
- void selectLeftJoin() {
- // left join
- assertSql("SELECT * FROM entity e " +
- "left join entity1 e1 on e1.id = e.id " +
- "WHERE e.id = ? OR e.name = ?",
- "SELECT * FROM entity e " +
- "LEFT JOIN entity1 e1 ON e1.id = e.id AND e1.tenant_id = 1 " +
- "WHERE (e.id = ? OR e.name = ?) AND e.tenant_id = 1");
-
- assertSql("SELECT * FROM entity e " +
- "left join entity1 e1 on e1.id = e.id " +
- "WHERE (e.id = ? OR e.name = ?)",
- "SELECT * FROM entity e " +
- "LEFT JOIN entity1 e1 ON e1.id = e.id AND e1.tenant_id = 1 " +
- "WHERE (e.id = ? OR e.name = ?) AND e.tenant_id = 1");
-
- assertSql("SELECT * FROM entity e " +
- "left join entity1 e1 on e1.id = e.id " +
- "left join entity2 e2 on e1.id = e2.id",
- "SELECT * FROM entity e " +
- "LEFT JOIN entity1 e1 ON e1.id = e.id AND e1.tenant_id = 1 " +
- "LEFT JOIN entity2 e2 ON e1.id = e2.id AND e2.tenant_id = 1 " +
- "WHERE e.tenant_id = 1");
- }
-
- @Test
- void selectRightJoin() {
- // right join
- assertSql("SELECT * FROM entity e " +
- "right join entity1 e1 on e1.id = e.id",
- "SELECT * FROM entity e " +
- "RIGHT JOIN entity1 e1 ON e1.id = e.id AND e.tenant_id = 1 " +
- "WHERE e1.tenant_id = 1");
-
- assertSql("SELECT * FROM with_as_1 e " +
- "right join entity1 e1 on e1.id = e.id",
- "SELECT * FROM with_as_1 e " +
- "RIGHT JOIN entity1 e1 ON e1.id = e.id " +
- "WHERE e1.tenant_id = 1");
-
- assertSql("SELECT * FROM entity e " +
- "right join entity1 e1 on e1.id = e.id " +
- "WHERE e.id = ? OR e.name = ?",
- "SELECT * FROM entity e " +
- "RIGHT JOIN entity1 e1 ON e1.id = e.id AND e.tenant_id = 1 " +
- "WHERE (e.id = ? OR e.name = ?) AND e1.tenant_id = 1");
-
- assertSql("SELECT * FROM entity e " +
- "right join entity1 e1 on e1.id = e.id " +
- "right join entity2 e2 on e1.id = e2.id ",
- "SELECT * FROM entity e " +
- "RIGHT JOIN entity1 e1 ON e1.id = e.id AND e.tenant_id = 1 " +
- "RIGHT JOIN entity2 e2 ON e1.id = e2.id AND e1.tenant_id = 1 " +
- "WHERE e2.tenant_id = 1");
- }
-
- @Test
- void selectMixJoin() {
- assertSql("SELECT * FROM entity e " +
- "right join entity1 e1 on e1.id = e.id " +
- "left join entity2 e2 on e1.id = e2.id",
- "SELECT * FROM entity e " +
- "RIGHT JOIN entity1 e1 ON e1.id = e.id AND e.tenant_id = 1 " +
- "LEFT JOIN entity2 e2 ON e1.id = e2.id AND e2.tenant_id = 1 " +
- "WHERE e1.tenant_id = 1");
-
- assertSql("SELECT * FROM entity e " +
- "left join entity1 e1 on e1.id = e.id " +
- "right join entity2 e2 on e1.id = e2.id",
- "SELECT * FROM entity e " +
- "LEFT JOIN entity1 e1 ON e1.id = e.id AND e1.tenant_id = 1 " +
- "RIGHT JOIN entity2 e2 ON e1.id = e2.id AND e.tenant_id = 1 " +
- "WHERE e2.tenant_id = 1");
-
- assertSql("SELECT * FROM entity e " +
- "left join entity1 e1 on e1.id = e.id " +
- "inner join entity2 e2 on e1.id = e2.id",
- "SELECT * FROM entity e " +
- "LEFT JOIN entity1 e1 ON e1.id = e.id AND e1.tenant_id = 1 " +
- "INNER JOIN entity2 e2 ON e1.id = e2.id AND e.tenant_id = 1 AND e2.tenant_id = 1");
- }
-
-
- @Test
- void selectJoinSubSelect() {
- assertSql("select * from (select * from entity) e1 " +
- "left join entity2 e2 on e1.id = e2.id",
- "SELECT * FROM (SELECT * FROM entity WHERE entity.tenant_id = 1) e1 " +
- "LEFT JOIN entity2 e2 ON e1.id = e2.id AND e2.tenant_id = 1");
-
- assertSql("select * from entity1 e1 " +
- "left join (select * from entity2) e2 " +
- "on e1.id = e2.id",
- "SELECT * FROM entity1 e1 " +
- "LEFT JOIN (SELECT * FROM entity2 WHERE entity2.tenant_id = 1) e2 " +
- "ON e1.id = e2.id " +
- "WHERE e1.tenant_id = 1");
- }
-
- @Test
- void selectSubJoin() {
-
- assertSql("select * FROM " +
- "(entity1 e1 right JOIN entity2 e2 ON e1.id = e2.id)",
- "SELECT * FROM " +
- "(entity1 e1 RIGHT JOIN entity2 e2 ON e1.id = e2.id AND e1.tenant_id = 1) " +
- "WHERE e2.tenant_id = 1");
-
- assertSql("select * FROM " +
- "(entity1 e1 LEFT JOIN entity2 e2 ON e1.id = e2.id)",
- "SELECT * FROM " +
- "(entity1 e1 LEFT JOIN entity2 e2 ON e1.id = e2.id AND e2.tenant_id = 1) " +
- "WHERE e1.tenant_id = 1");
-
-
- assertSql("select * FROM " +
- "(entity1 e1 LEFT JOIN entity2 e2 ON e1.id = e2.id) " +
- "right join entity3 e3 on e1.id = e3.id",
- "SELECT * FROM " +
- "(entity1 e1 LEFT JOIN entity2 e2 ON e1.id = e2.id AND e2.tenant_id = 1) " +
- "RIGHT JOIN entity3 e3 ON e1.id = e3.id AND e1.tenant_id = 1 " +
- "WHERE e3.tenant_id = 1");
-
-
- assertSql("select * FROM entity e " +
- "LEFT JOIN (entity1 e1 right join entity2 e2 ON e1.id = e2.id) " +
- "on e.id = e2.id",
- "SELECT * FROM entity e " +
- "LEFT JOIN (entity1 e1 RIGHT JOIN entity2 e2 ON e1.id = e2.id AND e1.tenant_id = 1) " +
- "ON e.id = e2.id AND e2.tenant_id = 1 " +
- "WHERE e.tenant_id = 1");
-
- assertSql("select * FROM entity e " +
- "LEFT JOIN (entity1 e1 left join entity2 e2 ON e1.id = e2.id) " +
- "on e.id = e2.id",
- "SELECT * FROM entity e " +
- "LEFT JOIN (entity1 e1 LEFT JOIN entity2 e2 ON e1.id = e2.id AND e2.tenant_id = 1) " +
- "ON e.id = e2.id AND e1.tenant_id = 1 " +
- "WHERE e.tenant_id = 1");
-
- assertSql("select * FROM entity e " +
- "RIGHT JOIN (entity1 e1 left join entity2 e2 ON e1.id = e2.id) " +
- "on e.id = e2.id",
- "SELECT * FROM entity e " +
- "RIGHT JOIN (entity1 e1 LEFT JOIN entity2 e2 ON e1.id = e2.id AND e2.tenant_id = 1) " +
- "ON e.id = e2.id AND e.tenant_id = 1 " +
- "WHERE e1.tenant_id = 1");
- }
-
-
- @Test
- void selectLeftJoinMultipleTrailingOn() {
- // 多个 on 尾缀的
- assertSql("SELECT * FROM entity e " +
- "LEFT JOIN entity1 e1 " +
- "LEFT JOIN entity2 e2 ON e2.id = e1.id " +
- "ON e1.id = e.id " +
- "WHERE (e.id = ? OR e.NAME = ?)",
- "SELECT * FROM entity e " +
- "LEFT JOIN entity1 e1 " +
- "LEFT JOIN entity2 e2 ON e2.id = e1.id AND e2.tenant_id = 1 " +
- "ON e1.id = e.id AND e1.tenant_id = 1 " +
- "WHERE (e.id = ? OR e.NAME = ?) AND e.tenant_id = 1");
-
- assertSql("SELECT * FROM entity e " +
- "LEFT JOIN entity1 e1 " +
- "LEFT JOIN with_as_A e2 ON e2.id = e1.id " +
- "ON e1.id = e.id " +
- "WHERE (e.id = ? OR e.NAME = ?)",
- "SELECT * FROM entity e " +
- "LEFT JOIN entity1 e1 " +
- "LEFT JOIN with_as_A e2 ON e2.id = e1.id " +
- "ON e1.id = e.id AND e1.tenant_id = 1 " +
- "WHERE (e.id = ? OR e.NAME = ?) AND e.tenant_id = 1");
- }
-
- @Test
- void selectInnerJoin() {
- // inner join
- assertSql("SELECT * FROM entity e " +
- "inner join entity1 e1 on e1.id = e.id " +
- "WHERE e.id = ? OR e.name = ?",
- "SELECT * FROM entity e " +
- "INNER JOIN entity1 e1 ON e1.id = e.id AND e.tenant_id = 1 AND e1.tenant_id = 1 " +
- "WHERE e.id = ? OR e.name = ?");
-
- assertSql("SELECT * FROM entity e " +
- "inner join entity1 e1 on e1.id = e.id " +
- "WHERE (e.id = ? OR e.name = ?)",
- "SELECT * FROM entity e " +
- "INNER JOIN entity1 e1 ON e1.id = e.id AND e.tenant_id = 1 AND e1.tenant_id = 1 " +
- "WHERE (e.id = ? OR e.name = ?)");
-
- // 隐式内连接
- assertSql("SELECT * FROM entity,entity1 " +
- "WHERE entity.id = entity1.id",
- "SELECT * FROM entity, entity1 " +
- "WHERE entity.id = entity1.id AND entity.tenant_id = 1 AND entity1.tenant_id = 1");
-
- // 隐式内连接
- assertSql("SELECT * FROM entity a, with_as_entity1 b " +
- "WHERE a.id = b.id",
- "SELECT * FROM entity a, with_as_entity1 b " +
- "WHERE a.id = b.id AND a.tenant_id = 1");
-
- assertSql("SELECT * FROM with_as_entity a, with_as_entity1 b " +
- "WHERE a.id = b.id",
- "SELECT * FROM with_as_entity a, with_as_entity1 b " +
- "WHERE a.id = b.id");
-
- // SubJoin with 隐式内连接
- assertSql("SELECT * FROM (entity,entity1) " +
- "WHERE entity.id = entity1.id",
- "SELECT * FROM (entity, entity1) " +
- "WHERE entity.id = entity1.id " +
- "AND entity.tenant_id = 1 AND entity1.tenant_id = 1");
-
- assertSql("SELECT * FROM ((entity,entity1),entity2) " +
- "WHERE entity.id = entity1.id and entity.id = entity2.id",
- "SELECT * FROM ((entity, entity1), entity2) " +
- "WHERE entity.id = entity1.id AND entity.id = entity2.id " +
- "AND entity.tenant_id = 1 AND entity1.tenant_id = 1 AND entity2.tenant_id = 1");
-
- assertSql("SELECT * FROM (entity,(entity1,entity2)) " +
- "WHERE entity.id = entity1.id and entity.id = entity2.id",
- "SELECT * FROM (entity, (entity1, entity2)) " +
- "WHERE entity.id = entity1.id AND entity.id = entity2.id " +
- "AND entity.tenant_id = 1 AND entity1.tenant_id = 1 AND entity2.tenant_id = 1");
-
- // 沙雕的括号写法
- assertSql("SELECT * FROM (((entity,entity1))) " +
- "WHERE entity.id = entity1.id",
- "SELECT * FROM (((entity, entity1))) " +
- "WHERE entity.id = entity1.id " +
- "AND entity.tenant_id = 1 AND entity1.tenant_id = 1");
-
- }
-
-
- @Test
- void selectWithAs() {
- assertSql("with with_as_A as (select * from entity) select * from with_as_A",
- "WITH with_as_A AS (SELECT * FROM entity WHERE entity.tenant_id = 1) SELECT * FROM with_as_A");
- }
-
-
- @Test
- void selectIgnoreTable() {
- assertSql(" SELECT dict.dict_code, item.item_text AS \"text\", item.item_value AS \"value\" FROM sys_dict_item item INNER JOIN sys_dict dict ON dict.id = item.dict_id WHERE dict.dict_code IN (1, 2, 3) AND item.item_value IN (1, 2, 3)",
- "SELECT dict.dict_code, item.item_text AS \"text\", item.item_value AS \"value\" FROM sys_dict_item item INNER JOIN sys_dict dict ON dict.id = item.dict_id AND item.tenant_id = 1 WHERE dict.dict_code IN (1, 2, 3) AND item.item_value IN (1, 2, 3)");
- }
-
- private void assertSql(String sql, String targetSql) {
- assertEquals(targetSql, interceptor.parserSingle(sql, null));
- }
-
- // ========== 额外的测试 ==========
-
- @Test
- public void testSelectSingle() {
- // 单表
- assertSql("select * from t_user where id = ?",
- "SELECT * FROM t_user WHERE id = ? AND t_user.tenant_id = 1 AND t_user.dept_id IN (10, 20)");
-
- assertSql("select * from t_user where id = ? or name = ?",
- "SELECT * FROM t_user WHERE (id = ? OR name = ?) AND t_user.tenant_id = 1 AND t_user.dept_id IN (10, 20)");
-
- assertSql("SELECT * FROM t_user WHERE (id = ? OR name = ?)",
- "SELECT * FROM t_user WHERE (id = ? OR name = ?) AND t_user.tenant_id = 1 AND t_user.dept_id IN (10, 20)");
-
- /* not */
- assertSql("SELECT * FROM t_user WHERE not (id = ? OR name = ?)",
- "SELECT * FROM t_user WHERE NOT (id = ? OR name = ?) AND t_user.tenant_id = 1 AND t_user.dept_id IN (10, 20)");
- }
-
- @Test
- public void testSelectLeftJoin() {
- // left join
- assertSql("SELECT * FROM t_user e " +
- "left join t_role e1 on e1.id = e.id " +
- "WHERE e.id = ? OR e.name = ?",
- "SELECT * FROM t_user e " +
- "LEFT JOIN t_role e1 ON e1.id = e.id AND e1.tenant_id = 1 " +
- "WHERE (e.id = ? OR e.name = ?) AND e.tenant_id = 1 AND e.dept_id IN (10, 20)");
-
- // 条件 e.id = ? OR e.name = ? 带括号
- assertSql("SELECT * FROM t_user e " +
- "left join t_role e1 on e1.id = e.id " +
- "WHERE (e.id = ? OR e.name = ?)",
- "SELECT * FROM t_user e " +
- "LEFT JOIN t_role e1 ON e1.id = e.id AND e1.tenant_id = 1 " +
- "WHERE (e.id = ? OR e.name = ?) AND e.tenant_id = 1 AND e.dept_id IN (10, 20)");
- }
-
- @Test
- public void testSelectRightJoin() {
- // right join
- assertSql("SELECT * FROM t_user e " +
- "right join t_role e1 on e1.id = e.id " +
- "WHERE e.id = ? OR e.name = ?",
- "SELECT * FROM t_user e " +
- "RIGHT JOIN t_role e1 ON e1.id = e.id AND e.tenant_id = 1 AND e.dept_id IN (10, 20) " +
- "WHERE (e.id = ? OR e.name = ?) AND e1.tenant_id = 1");
-
- // 条件 e.id = ? OR e.name = ? 带括号
- assertSql("SELECT * FROM t_user e " +
- "right join t_role e1 on e1.id = e.id " +
- "WHERE (e.id = ? OR e.name = ?)",
- "SELECT * FROM t_user e " +
- "RIGHT JOIN t_role e1 ON e1.id = e.id AND e.tenant_id = 1 AND e.dept_id IN (10, 20) " +
- "WHERE (e.id = ? OR e.name = ?) AND e1.tenant_id = 1");
- }
-
- @Test
- public void testSelectInnerJoin() {
- // inner join
- assertSql("SELECT * FROM t_user e " +
- "inner join entity1 e1 on e1.id = e.id " +
- "WHERE e.id = ? OR e.name = ?",
- "SELECT * FROM t_user e " +
- "INNER JOIN entity1 e1 ON e1.id = e.id AND e.tenant_id = 1 AND e.dept_id IN (10, 20) AND e1.tenant_id = 1 " +
- "WHERE e.id = ? OR e.name = ?");
-
- // 条件 e.id = ? OR e.name = ? 带括号
- assertSql("SELECT * FROM t_user e " +
- "inner join entity1 e1 on e1.id = e.id " +
- "WHERE (e.id = ? OR e.name = ?)",
- "SELECT * FROM t_user e " +
- "INNER JOIN entity1 e1 ON e1.id = e.id AND e.tenant_id = 1 AND e.dept_id IN (10, 20) AND e1.tenant_id = 1 " +
- "WHERE (e.id = ? OR e.name = ?)");
-
- // 没有 On 的 inner join
- assertSql("SELECT * FROM entity,entity1 " +
- "WHERE entity.id = entity1.id",
- "SELECT * FROM entity, entity1 " +
- "WHERE entity.id = entity1.id AND entity.tenant_id = 1 AND entity1.tenant_id = 1");
- }
-
-}
diff --git a/yudao-framework/yudao-spring-boot-starter-biz-data-permission/src/test/java/cn/iocoder/yudao/framework/datapermission/core/rule/DataPermissionRuleFactoryImplTest.java b/yudao-framework/yudao-spring-boot-starter-biz-data-permission/src/test/java/cn/iocoder/yudao/framework/datapermission/core/rule/DataPermissionRuleFactoryImplTest.java
deleted file mode 100644
index 17dddc929e6380eb0ccb533c05f142e557895653..0000000000000000000000000000000000000000
--- a/yudao-framework/yudao-spring-boot-starter-biz-data-permission/src/test/java/cn/iocoder/yudao/framework/datapermission/core/rule/DataPermissionRuleFactoryImplTest.java
+++ /dev/null
@@ -1,145 +0,0 @@
-package cn.iocoder.yudao.framework.datapermission.core.rule;
-
-import cn.iocoder.yudao.framework.datapermission.core.annotation.DataPermission;
-import cn.iocoder.yudao.framework.datapermission.core.aop.DataPermissionContextHolder;
-import cn.iocoder.yudao.framework.test.core.ut.BaseMockitoUnitTest;
-import net.sf.jsqlparser.expression.Alias;
-import net.sf.jsqlparser.expression.Expression;
-import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.Test;
-import org.mockito.InjectMocks;
-import org.mockito.Spy;
-import org.springframework.core.annotation.AnnotationUtils;
-
-import java.util.Arrays;
-import java.util.List;
-import java.util.Set;
-
-import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomString;
-import static org.junit.jupiter.api.Assertions.*;
-
-/**
- * {@link DataPermissionRuleFactoryImpl} 单元测试
- *
- * @author 芋道源码
- */
-class DataPermissionRuleFactoryImplTest extends BaseMockitoUnitTest {
-
- @InjectMocks
- private DataPermissionRuleFactoryImpl dataPermissionRuleFactory;
-
- @Spy
- private List rules = Arrays.asList(new DataPermissionRule01(),
- new DataPermissionRule02());
-
- @BeforeEach
- public void setUp() {
- DataPermissionContextHolder.clear();
- }
-
- @Test
- public void testGetDataPermissionRule_02() {
- // 准备参数
- String mappedStatementId = randomString();
-
- // 调用
- List result = dataPermissionRuleFactory.getDataPermissionRule(mappedStatementId);
- // 断言
- assertSame(rules, result);
- }
-
- @Test
- public void testGetDataPermissionRule_03() {
- // 准备参数
- String mappedStatementId = randomString();
- // mock 方法
- DataPermissionContextHolder.add(AnnotationUtils.findAnnotation(TestClass03.class, DataPermission.class));
-
- // 调用
- List result = dataPermissionRuleFactory.getDataPermissionRule(mappedStatementId);
- // 断言
- assertTrue(result.isEmpty());
- }
-
- @Test
- public void testGetDataPermissionRule_04() {
- // 准备参数
- String mappedStatementId = randomString();
- // mock 方法
- DataPermissionContextHolder.add(AnnotationUtils.findAnnotation(TestClass04.class, DataPermission.class));
-
- // 调用
- List result = dataPermissionRuleFactory.getDataPermissionRule(mappedStatementId);
- // 断言
- assertEquals(1, result.size());
- assertEquals(DataPermissionRule01.class, result.get(0).getClass());
- }
-
- @Test
- public void testGetDataPermissionRule_05() {
- // 准备参数
- String mappedStatementId = randomString();
- // mock 方法
- DataPermissionContextHolder.add(AnnotationUtils.findAnnotation(TestClass05.class, DataPermission.class));
-
- // 调用
- List result = dataPermissionRuleFactory.getDataPermissionRule(mappedStatementId);
- // 断言
- assertEquals(1, result.size());
- assertEquals(DataPermissionRule02.class, result.get(0).getClass());
- }
-
- @Test
- public void testGetDataPermissionRule_06() {
- // 准备参数
- String mappedStatementId = randomString();
- // mock 方法
- DataPermissionContextHolder.add(AnnotationUtils.findAnnotation(TestClass06.class, DataPermission.class));
-
- // 调用
- List result = dataPermissionRuleFactory.getDataPermissionRule(mappedStatementId);
- // 断言
- assertSame(rules, result);
- }
-
- @DataPermission(enable = false)
- static class TestClass03 {}
-
- @DataPermission(includeRules = DataPermissionRule01.class)
- static class TestClass04 {}
-
- @DataPermission(excludeRules = DataPermissionRule01.class)
- static class TestClass05 {}
-
- @DataPermission
- static class TestClass06 {}
-
- static class DataPermissionRule01 implements DataPermissionRule {
-
- @Override
- public Set getTableNames() {
- return null;
- }
-
- @Override
- public Expression getExpression(String tableName, Alias tableAlias) {
- return null;
- }
-
- }
-
- static class DataPermissionRule02 implements DataPermissionRule {
-
- @Override
- public Set getTableNames() {
- return null;
- }
-
- @Override
- public Expression getExpression(String tableName, Alias tableAlias) {
- return null;
- }
-
- }
-
-}
diff --git a/yudao-framework/yudao-spring-boot-starter-biz-data-permission/src/test/java/cn/iocoder/yudao/framework/datapermission/core/rule/dept/DeptDataPermissionRuleTest.java b/yudao-framework/yudao-spring-boot-starter-biz-data-permission/src/test/java/cn/iocoder/yudao/framework/datapermission/core/rule/dept/DeptDataPermissionRuleTest.java
deleted file mode 100644
index 7faae00877d69d85e40c21a91e74b8c3970ca1b1..0000000000000000000000000000000000000000
--- a/yudao-framework/yudao-spring-boot-starter-biz-data-permission/src/test/java/cn/iocoder/yudao/framework/datapermission/core/rule/dept/DeptDataPermissionRuleTest.java
+++ /dev/null
@@ -1,238 +0,0 @@
-package cn.iocoder.yudao.framework.datapermission.core.rule.dept;
-
-import cn.hutool.core.collection.CollUtil;
-import cn.hutool.core.util.ReflectUtil;
-import cn.iocoder.yudao.framework.common.biz.system.permission.PermissionCommonApi;
-import cn.iocoder.yudao.framework.common.biz.system.permission.dto.DeptDataPermissionRespDTO;
-import cn.iocoder.yudao.framework.common.enums.UserTypeEnum;
-import cn.iocoder.yudao.framework.common.util.collection.SetUtils;
-import cn.iocoder.yudao.framework.security.core.LoginUser;
-import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils;
-import cn.iocoder.yudao.framework.test.core.ut.BaseMockitoUnitTest;
-import net.sf.jsqlparser.expression.Alias;
-import net.sf.jsqlparser.expression.Expression;
-import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.Test;
-import org.mockito.InjectMocks;
-import org.mockito.Mock;
-import org.mockito.MockedStatic;
-
-import java.util.Map;
-
-import static cn.iocoder.yudao.framework.datapermission.core.rule.dept.DeptDataPermissionRule.EXPRESSION_NULL;
-import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomPojo;
-import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomString;
-import static org.junit.jupiter.api.Assertions.*;
-import static org.mockito.ArgumentMatchers.eq;
-import static org.mockito.ArgumentMatchers.same;
-import static org.mockito.Mockito.mockStatic;
-import static org.mockito.Mockito.when;
-
-/**
- * {@link DeptDataPermissionRule} 的单元测试
- *
- * @author 芋道源码
- */
-class DeptDataPermissionRuleTest extends BaseMockitoUnitTest {
-
- @InjectMocks
- private DeptDataPermissionRule rule;
-
- @Mock
- private PermissionCommonApi permissionApi;
-
- @BeforeEach
- @SuppressWarnings("unchecked")
- public void setUp() {
- // 清空 rule
- rule.getTableNames().clear();
- ((Map) ReflectUtil.getFieldValue(rule, "deptColumns")).clear();
- ((Map) ReflectUtil.getFieldValue(rule, "deptColumns")).clear();
- }
-
- @Test // 无 LoginUser
- public void testGetExpression_noLoginUser() {
- // 准备参数
- String tableName = randomString();
- Alias tableAlias = new Alias(randomString());
- // mock 方法
-
- // 调用
- Expression expression = rule.getExpression(tableName, tableAlias);
- // 断言
- assertNull(expression);
- }
-
- @Test // 无数据权限时
- public void testGetExpression_noDeptDataPermission() {
- try (MockedStatic securityFrameworkUtilsMock
- = mockStatic(SecurityFrameworkUtils.class)) {
- // 准备参数
- String tableName = "t_user";
- Alias tableAlias = new Alias("u");
- // mock 方法
- LoginUser loginUser = randomPojo(LoginUser.class, o -> o.setId(1L)
- .setUserType(UserTypeEnum.ADMIN.getValue()));
- securityFrameworkUtilsMock.when(SecurityFrameworkUtils::getLoginUser).thenReturn(loginUser);
- // mock 方法(permissionApi 返回 null)
- when(permissionApi.getDeptDataPermission(eq(loginUser.getId()))).thenReturn(null);
-
- // 调用
- NullPointerException exception = assertThrows(NullPointerException.class,
- () -> rule.getExpression(tableName, tableAlias));
- // 断言
- assertEquals("LoginUser(1) Table(t_user/u) 未返回数据权限", exception.getMessage());
- }
- }
-
- @Test // 全部数据权限
- public void testGetExpression_allDeptDataPermission() {
- try (MockedStatic securityFrameworkUtilsMock
- = mockStatic(SecurityFrameworkUtils.class)) {
- // 准备参数
- String tableName = "t_user";
- Alias tableAlias = new Alias("u");
- // mock 方法(LoginUser)
- LoginUser loginUser = randomPojo(LoginUser.class, o -> o.setId(1L)
- .setUserType(UserTypeEnum.ADMIN.getValue()));
- securityFrameworkUtilsMock.when(SecurityFrameworkUtils::getLoginUser).thenReturn(loginUser);
- // mock 方法(DeptDataPermissionRespDTO)
- DeptDataPermissionRespDTO deptDataPermission = new DeptDataPermissionRespDTO().setAll(true);
- when(permissionApi.getDeptDataPermission(same(1L))).thenReturn(deptDataPermission);
-
- // 调用
- Expression expression = rule.getExpression(tableName, tableAlias);
- // 断言
- assertNull(expression);
- assertSame(deptDataPermission, loginUser.getContext(DeptDataPermissionRule.CONTEXT_KEY, DeptDataPermissionRespDTO.class));
- }
- }
-
- @Test // 即不能查看部门,又不能查看自己,则说明 100% 无权限
- public void testGetExpression_noDept_noSelf() {
- try (MockedStatic securityFrameworkUtilsMock
- = mockStatic(SecurityFrameworkUtils.class)) {
- // 准备参数
- String tableName = "t_user";
- Alias tableAlias = new Alias("u");
- // mock 方法(LoginUser)
- LoginUser loginUser = randomPojo(LoginUser.class, o -> o.setId(1L)
- .setUserType(UserTypeEnum.ADMIN.getValue()));
- securityFrameworkUtilsMock.when(SecurityFrameworkUtils::getLoginUser).thenReturn(loginUser);
- // mock 方法(DeptDataPermissionRespDTO)
- DeptDataPermissionRespDTO deptDataPermission = new DeptDataPermissionRespDTO();
- when(permissionApi.getDeptDataPermission(same(1L))).thenReturn(deptDataPermission);
-
- // 调用
- Expression expression = rule.getExpression(tableName, tableAlias);
- // 断言
- assertEquals("null = null", expression.toString());
- assertSame(deptDataPermission, loginUser.getContext(DeptDataPermissionRule.CONTEXT_KEY, DeptDataPermissionRespDTO.class));
- }
- }
-
- @Test // 拼接 Dept 和 User 的条件(字段都不符合)
- public void testGetExpression_noDeptColumn_noSelfColumn() {
- try (MockedStatic securityFrameworkUtilsMock
- = mockStatic(SecurityFrameworkUtils.class)) {
- // 准备参数
- String tableName = "t_user";
- Alias tableAlias = new Alias("u");
- // mock 方法(LoginUser)
- LoginUser loginUser = randomPojo(LoginUser.class, o -> o.setId(1L)
- .setUserType(UserTypeEnum.ADMIN.getValue()));
- securityFrameworkUtilsMock.when(SecurityFrameworkUtils::getLoginUser).thenReturn(loginUser);
- // mock 方法(DeptDataPermissionRespDTO)
- DeptDataPermissionRespDTO deptDataPermission = new DeptDataPermissionRespDTO()
- .setDeptIds(SetUtils.asSet(10L, 20L)).setSelf(true);
- when(permissionApi.getDeptDataPermission(same(1L))).thenReturn(deptDataPermission);
-
- // 调用
- Expression expression = rule.getExpression(tableName, tableAlias);
- // 断言
- assertSame(EXPRESSION_NULL, expression);
- assertSame(deptDataPermission, loginUser.getContext(DeptDataPermissionRule.CONTEXT_KEY, DeptDataPermissionRespDTO.class));
- }
- }
-
- @Test // 拼接 Dept 和 User 的条件(self 符合)
- public void testGetExpression_noDeptColumn_yesSelfColumn() {
- try (MockedStatic securityFrameworkUtilsMock
- = mockStatic(SecurityFrameworkUtils.class)) {
- // 准备参数
- String tableName = "t_user";
- Alias tableAlias = new Alias("u");
- // mock 方法(LoginUser)
- LoginUser loginUser = randomPojo(LoginUser.class, o -> o.setId(1L)
- .setUserType(UserTypeEnum.ADMIN.getValue()));
- securityFrameworkUtilsMock.when(SecurityFrameworkUtils::getLoginUser).thenReturn(loginUser);
- // mock 方法(DeptDataPermissionRespDTO)
- DeptDataPermissionRespDTO deptDataPermission = new DeptDataPermissionRespDTO()
- .setSelf(true);
- when(permissionApi.getDeptDataPermission(same(1L))).thenReturn(deptDataPermission);
- // 添加 user 字段配置
- rule.addUserColumn("t_user", "id");
-
- // 调用
- Expression expression = rule.getExpression(tableName, tableAlias);
- // 断言
- assertEquals("u.id = 1", expression.toString());
- assertSame(deptDataPermission, loginUser.getContext(DeptDataPermissionRule.CONTEXT_KEY, DeptDataPermissionRespDTO.class));
- }
- }
-
- @Test // 拼接 Dept 和 User 的条件(dept 符合)
- public void testGetExpression_yesDeptColumn_noSelfColumn() {
- try (MockedStatic securityFrameworkUtilsMock
- = mockStatic(SecurityFrameworkUtils.class)) {
- // 准备参数
- String tableName = "t_user";
- Alias tableAlias = new Alias("u");
- // mock 方法(LoginUser)
- LoginUser loginUser = randomPojo(LoginUser.class, o -> o.setId(1L)
- .setUserType(UserTypeEnum.ADMIN.getValue()));
- securityFrameworkUtilsMock.when(SecurityFrameworkUtils::getLoginUser).thenReturn(loginUser);
- // mock 方法(DeptDataPermissionRespDTO)
- DeptDataPermissionRespDTO deptDataPermission = new DeptDataPermissionRespDTO()
- .setDeptIds(CollUtil.newLinkedHashSet(10L, 20L));
- when(permissionApi.getDeptDataPermission(same(1L))).thenReturn(deptDataPermission);
- // 添加 dept 字段配置
- rule.addDeptColumn("t_user", "dept_id");
-
- // 调用
- Expression expression = rule.getExpression(tableName, tableAlias);
- // 断言
- assertEquals("u.dept_id IN (10, 20)", expression.toString());
- assertSame(deptDataPermission, loginUser.getContext(DeptDataPermissionRule.CONTEXT_KEY, DeptDataPermissionRespDTO.class));
- }
- }
-
- @Test // 拼接 Dept 和 User 的条件(dept + self 符合)
- public void testGetExpression_yesDeptColumn_yesSelfColumn() {
- try (MockedStatic securityFrameworkUtilsMock
- = mockStatic(SecurityFrameworkUtils.class)) {
- // 准备参数
- String tableName = "t_user";
- Alias tableAlias = new Alias("u");
- // mock 方法(LoginUser)
- LoginUser loginUser = randomPojo(LoginUser.class, o -> o.setId(1L)
- .setUserType(UserTypeEnum.ADMIN.getValue()));
- securityFrameworkUtilsMock.when(SecurityFrameworkUtils::getLoginUser).thenReturn(loginUser);
- // mock 方法(DeptDataPermissionRespDTO)
- DeptDataPermissionRespDTO deptDataPermission = new DeptDataPermissionRespDTO()
- .setDeptIds(CollUtil.newLinkedHashSet(10L, 20L)).setSelf(true);
- when(permissionApi.getDeptDataPermission(same(1L))).thenReturn(deptDataPermission);
- // 添加 user 字段配置
- rule.addUserColumn("t_user", "id");
- // 添加 dept 字段配置
- rule.addDeptColumn("t_user", "dept_id");
-
- // 调用
- Expression expression = rule.getExpression(tableName, tableAlias);
- // 断言
- assertEquals("(u.dept_id IN (10, 20) OR u.id = 1)", expression.toString());
- assertSame(deptDataPermission, loginUser.getContext(DeptDataPermissionRule.CONTEXT_KEY, DeptDataPermissionRespDTO.class));
- }
- }
-
-}
diff --git a/yudao-framework/yudao-spring-boot-starter-biz-data-permission/src/test/java/cn/iocoder/yudao/framework/datapermission/core/util/DataPermissionUtilsTest.java b/yudao-framework/yudao-spring-boot-starter-biz-data-permission/src/test/java/cn/iocoder/yudao/framework/datapermission/core/util/DataPermissionUtilsTest.java
deleted file mode 100644
index 1cc57c2586e100cb9dc672ae2d2ff262f6aea619..0000000000000000000000000000000000000000
--- a/yudao-framework/yudao-spring-boot-starter-biz-data-permission/src/test/java/cn/iocoder/yudao/framework/datapermission/core/util/DataPermissionUtilsTest.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package cn.iocoder.yudao.framework.datapermission.core.util;
-
-import cn.iocoder.yudao.framework.datapermission.core.aop.DataPermissionContextHolder;
-import org.junit.jupiter.api.Test;
-
-import static org.junit.jupiter.api.Assertions.*;
-
-public class DataPermissionUtilsTest {
-
- @Test
- public void testExecuteIgnore() {
- DataPermissionUtils.executeIgnore(() -> assertFalse(DataPermissionContextHolder.get().enable()));
- }
-
-}
diff --git a/yudao-framework/yudao-spring-boot-starter-biz-ip/pom.xml b/yudao-framework/yudao-spring-boot-starter-biz-ip/pom.xml
index bc800c85d0d2c2ff9f14334c4323e2c4db49af9b..46026d4bc5eaac25e301f3c2349e32f0c51a210f 100644
--- a/yudao-framework/yudao-spring-boot-starter-biz-ip/pom.xml
+++ b/yudao-framework/yudao-spring-boot-starter-biz-ip/pom.xml
@@ -43,12 +43,6 @@
provided
-
-
- cn.iocoder.boot
- yudao-spring-boot-starter-test
- test
-
diff --git a/yudao-framework/yudao-spring-boot-starter-biz-ip/src/test/java/cn/iocoder/yudao/framework/ip/core/utils/AreaUtilsTest.java b/yudao-framework/yudao-spring-boot-starter-biz-ip/src/test/java/cn/iocoder/yudao/framework/ip/core/utils/AreaUtilsTest.java
deleted file mode 100644
index cc23819c49fefa14d9492d71bd9fe58af9965973..0000000000000000000000000000000000000000
--- a/yudao-framework/yudao-spring-boot-starter-biz-ip/src/test/java/cn/iocoder/yudao/framework/ip/core/utils/AreaUtilsTest.java
+++ /dev/null
@@ -1,36 +0,0 @@
-package cn.iocoder.yudao.framework.ip.core.utils;
-
-
-import cn.iocoder.yudao.framework.ip.core.Area;
-import cn.iocoder.yudao.framework.ip.core.enums.AreaTypeEnum;
-import org.junit.jupiter.api.Test;
-
-import static org.junit.jupiter.api.Assertions.assertEquals;
-
-/**
- * {@link AreaUtils} 的单元测试
- *
- * @author 芋道源码
- */
-public class AreaUtilsTest {
-
- @Test
- public void testGetArea() {
- // 调用:北京
- Area area = AreaUtils.getArea(110100);
- // 断言
- assertEquals(area.getId(), 110100);
- assertEquals(area.getName(), "北京市");
- assertEquals(area.getType(), AreaTypeEnum.CITY.getType());
- assertEquals(area.getParent().getId(), 110000);
- assertEquals(area.getChildren().size(), 16);
- }
-
- @Test
- public void testFormat() {
- assertEquals(AreaUtils.format(110105), "北京市 北京市 朝阳区");
- assertEquals(AreaUtils.format(1), "中国");
- assertEquals(AreaUtils.format(2), "蒙古");
- }
-
-}
diff --git a/yudao-framework/yudao-spring-boot-starter-biz-ip/src/test/java/cn/iocoder/yudao/framework/ip/core/utils/IPUtilsTest.java b/yudao-framework/yudao-spring-boot-starter-biz-ip/src/test/java/cn/iocoder/yudao/framework/ip/core/utils/IPUtilsTest.java
deleted file mode 100644
index 761a1aa63feadccb042cfedd6713bee096cf0b6c..0000000000000000000000000000000000000000
--- a/yudao-framework/yudao-spring-boot-starter-biz-ip/src/test/java/cn/iocoder/yudao/framework/ip/core/utils/IPUtilsTest.java
+++ /dev/null
@@ -1,47 +0,0 @@
-package cn.iocoder.yudao.framework.ip.core.utils;
-
-import cn.iocoder.yudao.framework.ip.core.Area;
-import org.junit.jupiter.api.Test;
-import org.lionsoul.ip2region.xdb.Searcher;
-
-
-import static org.junit.jupiter.api.Assertions.assertEquals;
-
-/**
- * {@link IPUtils} 的单元测试
- *
- * @author wanglhup
- */
-public class IPUtilsTest {
-
- @Test
- public void testGetAreaId_string() {
- // 120.202.4.0|120.202.4.255|420600
- Integer areaId = IPUtils.getAreaId("120.202.4.50");
- assertEquals(420600, areaId);
- }
-
- @Test
- public void testGetAreaId_long() throws Exception {
- // 120.203.123.0|120.203.133.255|360900
- long ip = Searcher.checkIP("120.203.123.250");
- Integer areaId = IPUtils.getAreaId(ip);
- assertEquals(360900, areaId);
- }
-
- @Test
- public void testGetArea_string() {
- // 120.202.4.0|120.202.4.255|420600
- Area area = IPUtils.getArea("120.202.4.50");
- assertEquals("襄阳市", area.getName());
- }
-
- @Test
- public void testGetArea_long() throws Exception {
- // 120.203.123.0|120.203.133.255|360900
- long ip = Searcher.checkIP("120.203.123.252");
- Area area = IPUtils.getArea(ip);
- assertEquals("宜春市", area.getName());
- }
-
-}
diff --git a/yudao-framework/yudao-spring-boot-starter-biz-tenant/pom.xml b/yudao-framework/yudao-spring-boot-starter-biz-tenant/pom.xml
index c1a537613ed3adfc8d3ab7c6420d1084e5e170cb..b831767fc6ca913f754aa331743bcacd369d35d3 100644
--- a/yudao-framework/yudao-spring-boot-starter-biz-tenant/pom.xml
+++ b/yudao-framework/yudao-spring-boot-starter-biz-tenant/pom.xml
@@ -66,13 +66,6 @@
true
-
-
- cn.iocoder.boot
- yudao-spring-boot-starter-test
- test
-
-
com.google.guava
diff --git a/yudao-framework/yudao-spring-boot-starter-biz-tenant/src/main/java/cn/iocoder/yudao/framework/tenant/config/YudaoTenantAutoConfiguration.java b/yudao-framework/yudao-spring-boot-starter-biz-tenant/src/main/java/cn/iocoder/yudao/framework/tenant/config/YudaoTenantAutoConfiguration.java
index b79e09203d27b3a1f8debee56ef44262b461f447..e91a23617893d717013de935868235fa31b0fdea 100644
--- a/yudao-framework/yudao-spring-boot-starter-biz-tenant/src/main/java/cn/iocoder/yudao/framework/tenant/config/YudaoTenantAutoConfiguration.java
+++ b/yudao-framework/yudao-spring-boot-starter-biz-tenant/src/main/java/cn/iocoder/yudao/framework/tenant/config/YudaoTenantAutoConfiguration.java
@@ -22,7 +22,6 @@ import cn.iocoder.yudao.framework.web.config.WebProperties;
import cn.iocoder.yudao.framework.web.core.handler.GlobalExceptionHandler;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.TenantLineInnerInterceptor;
-import jakarta.annotation.Resource;
import org.springframework.boot.autoconfigure.AutoConfiguration;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
@@ -44,7 +43,11 @@ import org.springframework.web.servlet.mvc.method.RequestMappingInfo;
import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping;
import org.springframework.web.util.pattern.PathPattern;
-import java.util.*;
+import javax.annotation.Resource;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Set;
import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList;
diff --git a/yudao-framework/yudao-spring-boot-starter-biz-tenant/src/main/java/cn/iocoder/yudao/framework/tenant/core/security/TenantSecurityWebFilter.java b/yudao-framework/yudao-spring-boot-starter-biz-tenant/src/main/java/cn/iocoder/yudao/framework/tenant/core/security/TenantSecurityWebFilter.java
index 5858ec73a63b20417356e4a3e3e9964de9d537de..b68aea77ca485ae056e1477746c00ad88a15a919 100644
--- a/yudao-framework/yudao-spring-boot-starter-biz-tenant/src/main/java/cn/iocoder/yudao/framework/tenant/core/security/TenantSecurityWebFilter.java
+++ b/yudao-framework/yudao-spring-boot-starter-biz-tenant/src/main/java/cn/iocoder/yudao/framework/tenant/core/security/TenantSecurityWebFilter.java
@@ -12,13 +12,13 @@ import cn.iocoder.yudao.framework.tenant.core.service.TenantFrameworkService;
import cn.iocoder.yudao.framework.web.config.WebProperties;
import cn.iocoder.yudao.framework.web.core.filter.ApiRequestFilter;
import cn.iocoder.yudao.framework.web.core.handler.GlobalExceptionHandler;
-import jakarta.servlet.FilterChain;
-import jakarta.servlet.ServletException;
-import jakarta.servlet.http.HttpServletRequest;
-import jakarta.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j;
import org.springframework.util.AntPathMatcher;
+import javax.servlet.FilterChain;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Objects;
import java.util.Set;
diff --git a/yudao-framework/yudao-spring-boot-starter-biz-tenant/src/main/java/cn/iocoder/yudao/framework/tenant/core/web/TenantContextWebFilter.java b/yudao-framework/yudao-spring-boot-starter-biz-tenant/src/main/java/cn/iocoder/yudao/framework/tenant/core/web/TenantContextWebFilter.java
index 41b7b4d7104a8a4977f4d53ffeb03f810ffb59b0..8e37727d9d2ca54c82c9e6f51dd39b7e340ab768 100644
--- a/yudao-framework/yudao-spring-boot-starter-biz-tenant/src/main/java/cn/iocoder/yudao/framework/tenant/core/web/TenantContextWebFilter.java
+++ b/yudao-framework/yudao-spring-boot-starter-biz-tenant/src/main/java/cn/iocoder/yudao/framework/tenant/core/web/TenantContextWebFilter.java
@@ -4,10 +4,10 @@ import cn.iocoder.yudao.framework.tenant.core.context.TenantContextHolder;
import cn.iocoder.yudao.framework.web.core.util.WebFrameworkUtils;
import org.springframework.web.filter.OncePerRequestFilter;
-import jakarta.servlet.FilterChain;
-import jakarta.servlet.ServletException;
-import jakarta.servlet.http.HttpServletRequest;
-import jakarta.servlet.http.HttpServletResponse;
+import javax.servlet.FilterChain;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
diff --git a/yudao-framework/yudao-spring-boot-starter-biz-tenant/src/main/java/cn/iocoder/yudao/framework/tenant/core/web/TenantVisitContextInterceptor.java b/yudao-framework/yudao-spring-boot-starter-biz-tenant/src/main/java/cn/iocoder/yudao/framework/tenant/core/web/TenantVisitContextInterceptor.java
index 9ac70d83132c94ffe831e6b1251c2c239e5af753..c0a760ed200a8fde8cb0ba0f151715175fcc2903 100644
--- a/yudao-framework/yudao-spring-boot-starter-biz-tenant/src/main/java/cn/iocoder/yudao/framework/tenant/core/web/TenantVisitContextInterceptor.java
+++ b/yudao-framework/yudao-spring-boot-starter-biz-tenant/src/main/java/cn/iocoder/yudao/framework/tenant/core/web/TenantVisitContextInterceptor.java
@@ -8,12 +8,13 @@ import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils;
import cn.iocoder.yudao.framework.tenant.config.TenantProperties;
import cn.iocoder.yudao.framework.tenant.core.context.TenantContextHolder;
import cn.iocoder.yudao.framework.web.core.util.WebFrameworkUtils;
-import jakarta.servlet.http.HttpServletRequest;
-import jakarta.servlet.http.HttpServletResponse;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.servlet.HandlerInterceptor;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception0;
@RequiredArgsConstructor
diff --git a/yudao-framework/yudao-spring-boot-starter-biz-tenant/src/main/java/org/springframework/messaging/handler/invocation/InvocableHandlerMethod.java b/yudao-framework/yudao-spring-boot-starter-biz-tenant/src/main/java/org/springframework/messaging/handler/invocation/InvocableHandlerMethod.java
index de330fdc058e52e88bda7d998302b081d6622355..059d8f97febb8b270ea3d487622dcd073f17effc 100644
--- a/yudao-framework/yudao-spring-boot-starter-biz-tenant/src/main/java/org/springframework/messaging/handler/invocation/InvocableHandlerMethod.java
+++ b/yudao-framework/yudao-spring-boot-starter-biz-tenant/src/main/java/org/springframework/messaging/handler/invocation/InvocableHandlerMethod.java
@@ -1,5 +1,5 @@
/*
- * Copyright 2002-2023 the original author or authors.
+ * Copyright 2002-2021 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
@@ -16,11 +16,6 @@
package org.springframework.messaging.handler.invocation;
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-import java.lang.reflect.Type;
-import java.util.Arrays;
-
import cn.iocoder.yudao.framework.tenant.core.context.TenantContextHolder;
import cn.iocoder.yudao.framework.tenant.core.util.TenantUtils;
import org.springframework.core.DefaultParameterNameDiscoverer;
@@ -32,6 +27,11 @@ import org.springframework.messaging.Message;
import org.springframework.messaging.handler.HandlerMethod;
import org.springframework.util.ObjectUtils;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.lang.reflect.Type;
+import java.util.Arrays;
+
import static cn.iocoder.yudao.framework.web.core.util.WebFrameworkUtils.HEADER_TENANT_ID;
/**
@@ -50,12 +50,10 @@ public class InvocableHandlerMethod extends HandlerMethod {
private static final Object[] EMPTY_ARGS = new Object[0];
-
private HandlerMethodArgumentResolverComposite resolvers = new HandlerMethodArgumentResolverComposite();
private ParameterNameDiscoverer parameterNameDiscoverer = new DefaultParameterNameDiscoverer();
-
/**
* Create an instance from a {@code HandlerMethod}.
*/
@@ -83,7 +81,6 @@ public class InvocableHandlerMethod extends HandlerMethod {
super(bean, methodName, parameterTypes);
}
-
/**
* Set {@link HandlerMethodArgumentResolver HandlerMethodArgumentResolvers} to use for resolving method argument values.
*/
@@ -94,13 +91,12 @@ public class InvocableHandlerMethod extends HandlerMethod {
/**
* Set the ParameterNameDiscoverer for resolving parameter names when needed
* (e.g. default request attribute name).
- * Default is a {@link org.springframework.core.DefaultParameterNameDiscoverer}.
+ *
Default is a {@link DefaultParameterNameDiscoverer}.
*/
public void setParameterNameDiscoverer(ParameterNameDiscoverer parameterNameDiscoverer) {
this.parameterNameDiscoverer = parameterNameDiscoverer;
}
-
/**
* Invoke the method after resolving its argument values in the context of the given message.
*
Argument values are commonly resolved through
@@ -204,21 +200,20 @@ public class InvocableHandlerMethod extends HandlerMethod {
}
catch (IllegalArgumentException ex) {
assertTargetBean(getBridgedMethod(), getBean(), args);
- String text = (ex.getMessage() == null || ex.getCause() instanceof NullPointerException) ?
- "Illegal argument": ex.getMessage();
+ String text = (ex.getMessage() != null ? ex.getMessage() : "Illegal argument");
throw new IllegalStateException(formatInvokeError(text, args), ex);
}
catch (InvocationTargetException ex) {
// Unwrap for HandlerExceptionResolvers ...
Throwable targetException = ex.getTargetException();
- if (targetException instanceof RuntimeException runtimeException) {
- throw runtimeException;
+ if (targetException instanceof RuntimeException) {
+ throw (RuntimeException) targetException;
}
- else if (targetException instanceof Error error) {
- throw error;
+ else if (targetException instanceof Error) {
+ throw (Error) targetException;
}
- else if (targetException instanceof Exception exception) {
- throw exception;
+ else if (targetException instanceof Exception) {
+ throw (Exception) targetException;
}
else {
throw new IllegalStateException(formatInvokeError("Invocation failure", args), targetException);
@@ -230,8 +225,7 @@ public class InvocableHandlerMethod extends HandlerMethod {
return new AsyncResultMethodParameter(returnValue);
}
-
- private class AsyncResultMethodParameter extends AnnotatedMethodParameter {
+ private class AsyncResultMethodParameter extends HandlerMethodParameter {
@Nullable
private final Object returnValue;
diff --git a/yudao-framework/yudao-spring-boot-starter-excel/pom.xml b/yudao-framework/yudao-spring-boot-starter-excel/pom.xml
index b1218183cb3c7554a7abac651657b118845bdb60..0249c8841abcd18b39cc1435337113d84ce4020e 100644
--- a/yudao-framework/yudao-spring-boot-starter-excel/pom.xml
+++ b/yudao-framework/yudao-spring-boot-starter-excel/pom.xml
@@ -62,13 +62,6 @@
yudao-spring-boot-starter-biz-ip
true
-
-
-
- cn.iocoder.boot
- yudao-spring-boot-starter-test
- test
-
diff --git a/yudao-framework/yudao-spring-boot-starter-excel/src/main/java/cn/iocoder/yudao/framework/dict/validation/InDict.java b/yudao-framework/yudao-spring-boot-starter-excel/src/main/java/cn/iocoder/yudao/framework/dict/validation/InDict.java
index de7498775ce27ca24e4f88d23e3a53a0cbb1b00b..4e52edf443ca7048c7ab9600607eab0df16f6cbe 100644
--- a/yudao-framework/yudao-spring-boot-starter-excel/src/main/java/cn/iocoder/yudao/framework/dict/validation/InDict.java
+++ b/yudao-framework/yudao-spring-boot-starter-excel/src/main/java/cn/iocoder/yudao/framework/dict/validation/InDict.java
@@ -1,13 +1,8 @@
package cn.iocoder.yudao.framework.dict.validation;
-import jakarta.validation.Constraint;
-import jakarta.validation.Payload;
-
-import java.lang.annotation.Documented;
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
+import javax.validation.Constraint;
+import javax.validation.Payload;
+import java.lang.annotation.*;
@Target({
ElementType.METHOD,
diff --git a/yudao-framework/yudao-spring-boot-starter-excel/src/main/java/cn/iocoder/yudao/framework/dict/validation/InDictCollectionValidator.java b/yudao-framework/yudao-spring-boot-starter-excel/src/main/java/cn/iocoder/yudao/framework/dict/validation/InDictCollectionValidator.java
index a7184b066aed7064f3328cacc44dfeb3aed6da11..7d34b583be09e49a9bec7936eb0b34757b049238 100644
--- a/yudao-framework/yudao-spring-boot-starter-excel/src/main/java/cn/iocoder/yudao/framework/dict/validation/InDictCollectionValidator.java
+++ b/yudao-framework/yudao-spring-boot-starter-excel/src/main/java/cn/iocoder/yudao/framework/dict/validation/InDictCollectionValidator.java
@@ -2,9 +2,9 @@ package cn.iocoder.yudao.framework.dict.validation;
import cn.hutool.core.collection.CollUtil;
import cn.iocoder.yudao.framework.dict.core.DictFrameworkUtils;
-import jakarta.validation.ConstraintValidator;
-import jakarta.validation.ConstraintValidatorContext;
+import javax.validation.ConstraintValidator;
+import javax.validation.ConstraintValidatorContext;
import java.util.Collection;
import java.util.List;
diff --git a/yudao-framework/yudao-spring-boot-starter-excel/src/main/java/cn/iocoder/yudao/framework/dict/validation/InDictValidator.java b/yudao-framework/yudao-spring-boot-starter-excel/src/main/java/cn/iocoder/yudao/framework/dict/validation/InDictValidator.java
index b67f017750251f0bccd41012ffc4ab9f1e7244d9..d46238040a4ae7f1a607ec0f6df11553bdbf6871 100644
--- a/yudao-framework/yudao-spring-boot-starter-excel/src/main/java/cn/iocoder/yudao/framework/dict/validation/InDictValidator.java
+++ b/yudao-framework/yudao-spring-boot-starter-excel/src/main/java/cn/iocoder/yudao/framework/dict/validation/InDictValidator.java
@@ -2,9 +2,9 @@ package cn.iocoder.yudao.framework.dict.validation;
import cn.hutool.core.util.StrUtil;
import cn.iocoder.yudao.framework.dict.core.DictFrameworkUtils;
-import jakarta.validation.ConstraintValidator;
-import jakarta.validation.ConstraintValidatorContext;
+import javax.validation.ConstraintValidator;
+import javax.validation.ConstraintValidatorContext;
import java.util.List;
public class InDictValidator implements ConstraintValidator {
diff --git a/yudao-framework/yudao-spring-boot-starter-excel/src/main/java/cn/iocoder/yudao/framework/excel/core/util/ExcelUtils.java b/yudao-framework/yudao-spring-boot-starter-excel/src/main/java/cn/iocoder/yudao/framework/excel/core/util/ExcelUtils.java
index f05d3e51e5448e15b45dffb4abeb15bc4a27ec6e..3eaafec18f3b4ac61f04941384611f1f2c574020 100644
--- a/yudao-framework/yudao-spring-boot-starter-excel/src/main/java/cn/iocoder/yudao/framework/excel/core/util/ExcelUtils.java
+++ b/yudao-framework/yudao-spring-boot-starter-excel/src/main/java/cn/iocoder/yudao/framework/excel/core/util/ExcelUtils.java
@@ -5,9 +5,9 @@ import cn.idev.excel.converters.longconverter.LongStringConverter;
import cn.iocoder.yudao.framework.common.util.http.HttpUtils;
import cn.iocoder.yudao.framework.excel.core.handler.ColumnWidthMatchStyleStrategy;
import cn.iocoder.yudao.framework.excel.core.handler.SelectSheetWriteHandler;
-import jakarta.servlet.http.HttpServletResponse;
import org.springframework.web.multipart.MultipartFile;
+import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;
diff --git a/yudao-framework/yudao-spring-boot-starter-excel/src/test/java/cn/iocoder/yudao/framework/dict/core/util/DictFrameworkUtilsTest.java b/yudao-framework/yudao-spring-boot-starter-excel/src/test/java/cn/iocoder/yudao/framework/dict/core/util/DictFrameworkUtilsTest.java
deleted file mode 100644
index fa0d172c966968edda36838fa58755867b4840c9..0000000000000000000000000000000000000000
--- a/yudao-framework/yudao-spring-boot-starter-excel/src/test/java/cn/iocoder/yudao/framework/dict/core/util/DictFrameworkUtilsTest.java
+++ /dev/null
@@ -1,60 +0,0 @@
-package cn.iocoder.yudao.framework.dict.core.util;
-
-import cn.iocoder.yudao.framework.common.biz.system.dict.DictDataCommonApi;
-import cn.iocoder.yudao.framework.common.biz.system.dict.dto.DictDataRespDTO;
-import cn.iocoder.yudao.framework.dict.core.DictFrameworkUtils;
-import cn.iocoder.yudao.framework.test.core.ut.BaseMockitoUnitTest;
-import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.Test;
-import org.mockito.Mock;
-
-import java.util.List;
-
-import static cn.iocoder.yudao.framework.test.core.util.RandomUtils.randomPojo;
-import static org.junit.jupiter.api.Assertions.assertEquals;
-import static org.mockito.ArgumentMatchers.eq;
-import static org.mockito.Mockito.when;
-
-/**
- * {@link DictFrameworkUtils} 的单元测试
- */
-public class DictFrameworkUtilsTest extends BaseMockitoUnitTest {
-
- @Mock
- private DictDataCommonApi dictDataApi;
-
- @BeforeEach
- public void setUp() {
- DictFrameworkUtils.init(dictDataApi);
- DictFrameworkUtils.clearCache();
- }
-
- @Test
- public void testParseDictDataLabel() {
- // mock 数据
- List dictDatas = List.of(
- randomPojo(DictDataRespDTO.class, o -> o.setDictType("animal").setValue("cat").setLabel("猫")),
- randomPojo(DictDataRespDTO.class, o -> o.setDictType("animal").setValue("dog").setLabel("狗"))
- );
- // mock 方法
- when(dictDataApi.getDictDataList(eq("animal"))).thenReturn(dictDatas);
-
- // 断言返回值
- assertEquals("狗", DictFrameworkUtils.parseDictDataLabel("animal", "dog"));
- }
-
- @Test
- public void testParseDictDataValue() {
- // mock 数据
- List dictDatas = List.of(
- randomPojo(DictDataRespDTO.class, o -> o.setDictType("animal").setValue("cat").setLabel("猫")),
- randomPojo(DictDataRespDTO.class, o -> o.setDictType("animal").setValue("dog").setLabel("狗"))
- );
- // mock 方法
- when(dictDataApi.getDictDataList(eq("animal"))).thenReturn(dictDatas);
-
- // 断言返回值
- assertEquals("dog", DictFrameworkUtils.parseDictDataValue("animal", "狗"));
- }
-
-}
diff --git a/yudao-framework/yudao-spring-boot-starter-job/src/main/java/cn/iocoder/yudao/framework/quartz/core/handler/JobHandlerInvoker.java b/yudao-framework/yudao-spring-boot-starter-job/src/main/java/cn/iocoder/yudao/framework/quartz/core/handler/JobHandlerInvoker.java
index d9b299056c0898fc647a6551b77c85b980b298b5..736126fec6486edca768396c7a45bfb7dddbcef3 100644
--- a/yudao-framework/yudao-spring-boot-starter-job/src/main/java/cn/iocoder/yudao/framework/quartz/core/handler/JobHandlerInvoker.java
+++ b/yudao-framework/yudao-spring-boot-starter-job/src/main/java/cn/iocoder/yudao/framework/quartz/core/handler/JobHandlerInvoker.java
@@ -13,8 +13,9 @@ import org.quartz.PersistJobDataAfterExecution;
import org.springframework.context.ApplicationContext;
import org.springframework.scheduling.quartz.QuartzJobBean;
-import jakarta.annotation.Resource;
+import javax.annotation.Resource;
import java.time.LocalDateTime;
+import java.time.temporal.ChronoUnit;
import static cn.hutool.core.exceptions.ExceptionUtil.getRootCauseMessage;
diff --git a/yudao-framework/yudao-spring-boot-starter-job/src/main/java/cn/iocoder/yudao/framework/quartz/core/service/JobLogFrameworkService.java b/yudao-framework/yudao-spring-boot-starter-job/src/main/java/cn/iocoder/yudao/framework/quartz/core/service/JobLogFrameworkService.java
index cd99cadba9c45ee816485d3844b3eb20d3243106..418dbfcd62bc567cc42b4b012fa35e74a39a4c5c 100644
--- a/yudao-framework/yudao-spring-boot-starter-job/src/main/java/cn/iocoder/yudao/framework/quartz/core/service/JobLogFrameworkService.java
+++ b/yudao-framework/yudao-spring-boot-starter-job/src/main/java/cn/iocoder/yudao/framework/quartz/core/service/JobLogFrameworkService.java
@@ -1,7 +1,7 @@
package cn.iocoder.yudao.framework.quartz.core.service;
-import jakarta.validation.constraints.NotEmpty;
-import jakarta.validation.constraints.NotNull;
+import javax.validation.constraints.NotEmpty;
+import javax.validation.constraints.NotNull;
import java.time.LocalDateTime;
/**
diff --git a/yudao-framework/yudao-spring-boot-starter-monitor/src/main/java/cn/iocoder/yudao/framework/tracer/config/YudaoTracerAutoConfiguration.java b/yudao-framework/yudao-spring-boot-starter-monitor/src/main/java/cn/iocoder/yudao/framework/tracer/config/YudaoTracerAutoConfiguration.java
index 596b5167570a4c02bcca48d631443a14cd90350e..2f8aa704054f8844e19f424a4c39a7fd98b06bbc 100644
--- a/yudao-framework/yudao-spring-boot-starter-monitor/src/main/java/cn/iocoder/yudao/framework/tracer/config/YudaoTracerAutoConfiguration.java
+++ b/yudao-framework/yudao-spring-boot-starter-monitor/src/main/java/cn/iocoder/yudao/framework/tracer/config/YudaoTracerAutoConfiguration.java
@@ -18,7 +18,7 @@ import org.springframework.context.annotation.Bean;
@ConditionalOnClass(name = {
"org.apache.skywalking.apm.toolkit.opentracing.SkywalkingTracer", // 来自 apm-toolkit-opentracing.jar
// "io.opentracing.Tracer", // 来自 opentracing-api.jar
- "jakarta.servlet.Filter"
+ "javax.servlet.Filter"
})
@EnableConfigurationProperties(TracerProperties.class)
@ConditionalOnProperty(prefix = "yudao.tracer", value = "enable", matchIfMissing = true)
diff --git a/yudao-framework/yudao-spring-boot-starter-monitor/src/main/java/cn/iocoder/yudao/framework/tracer/core/filter/TraceFilter.java b/yudao-framework/yudao-spring-boot-starter-monitor/src/main/java/cn/iocoder/yudao/framework/tracer/core/filter/TraceFilter.java
index e8d7ca1b159a0db37cb490b962ad375bce124d93..91ac30fd598d1fcd71abe9bd72f1d04599c115d7 100644
--- a/yudao-framework/yudao-spring-boot-starter-monitor/src/main/java/cn/iocoder/yudao/framework/tracer/core/filter/TraceFilter.java
+++ b/yudao-framework/yudao-spring-boot-starter-monitor/src/main/java/cn/iocoder/yudao/framework/tracer/core/filter/TraceFilter.java
@@ -3,10 +3,10 @@ package cn.iocoder.yudao.framework.tracer.core.filter;
import cn.iocoder.yudao.framework.common.util.monitor.TracerUtils;
import org.springframework.web.filter.OncePerRequestFilter;
-import jakarta.servlet.FilterChain;
-import jakarta.servlet.ServletException;
-import jakarta.servlet.http.HttpServletRequest;
-import jakarta.servlet.http.HttpServletResponse;
+import javax.servlet.FilterChain;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
diff --git a/yudao-framework/yudao-spring-boot-starter-mybatis/pom.xml b/yudao-framework/yudao-spring-boot-starter-mybatis/pom.xml
index 3272059d85e94fc63bde30e68d80feaa9dbcfa74..3f6c7ed4b59836c9ee5930dae316291066eb9ba5 100644
--- a/yudao-framework/yudao-spring-boot-starter-mybatis/pom.xml
+++ b/yudao-framework/yudao-spring-boot-starter-mybatis/pom.xml
@@ -71,25 +71,19 @@
com.alibaba
- druid-spring-boot-3-starter
+ druid-spring-boot-starter
com.baomidou
- mybatis-plus-spring-boot3-starter
+ mybatis-plus-boot-starter
com.baomidou
- mybatis-plus-jsqlparser
+ mybatis-plus-jsqlparser-4.9
com.baomidou
- dynamic-datasource-spring-boot3-starter
-
-
- org.springframework.boot
- spring-boot-starter-undertow
-
-
+ dynamic-datasource-spring-boot-starter
diff --git a/yudao-framework/yudao-spring-boot-starter-mybatis/src/main/java/cn/iocoder/yudao/framework/datasource/config/YudaoDataSourceAutoConfiguration.java b/yudao-framework/yudao-spring-boot-starter-mybatis/src/main/java/cn/iocoder/yudao/framework/datasource/config/YudaoDataSourceAutoConfiguration.java
index 879a19aae373eaa791209aaa5899f6f3a3991ae5..7032b48376d01cec7494cc38e9cf3119b8644937 100644
--- a/yudao-framework/yudao-spring-boot-starter-mybatis/src/main/java/cn/iocoder/yudao/framework/datasource/config/YudaoDataSourceAutoConfiguration.java
+++ b/yudao-framework/yudao-spring-boot-starter-mybatis/src/main/java/cn/iocoder/yudao/framework/datasource/config/YudaoDataSourceAutoConfiguration.java
@@ -1,7 +1,7 @@
package cn.iocoder.yudao.framework.datasource.config;
import cn.iocoder.yudao.framework.datasource.core.filter.DruidAdRemoveFilter;
-import com.alibaba.druid.spring.boot3.autoconfigure.properties.DruidStatProperties;
+import com.alibaba.druid.spring.boot.autoconfigure.properties.DruidStatProperties;
import org.springframework.boot.autoconfigure.AutoConfiguration;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
diff --git a/yudao-framework/yudao-spring-boot-starter-mybatis/src/main/java/cn/iocoder/yudao/framework/datasource/core/filter/DruidAdRemoveFilter.java b/yudao-framework/yudao-spring-boot-starter-mybatis/src/main/java/cn/iocoder/yudao/framework/datasource/core/filter/DruidAdRemoveFilter.java
index 18a86a8f48a2ae9b0bf583f482cd089d4c8c487f..78e8a3e64a1fa05c9fdc50e28c0792bb347c2d6d 100644
--- a/yudao-framework/yudao-spring-boot-starter-mybatis/src/main/java/cn/iocoder/yudao/framework/datasource/core/filter/DruidAdRemoveFilter.java
+++ b/yudao-framework/yudao-spring-boot-starter-mybatis/src/main/java/cn/iocoder/yudao/framework/datasource/core/filter/DruidAdRemoveFilter.java
@@ -3,10 +3,10 @@ package cn.iocoder.yudao.framework.datasource.core.filter;
import com.alibaba.druid.util.Utils;
import org.springframework.web.filter.OncePerRequestFilter;
-import jakarta.servlet.FilterChain;
-import jakarta.servlet.ServletException;
-import jakarta.servlet.http.HttpServletRequest;
-import jakarta.servlet.http.HttpServletResponse;
+import javax.servlet.FilterChain;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
diff --git a/yudao-framework/yudao-spring-boot-starter-mybatis/src/main/java/cn/iocoder/yudao/framework/mybatis/core/util/MyBatisUtils.java b/yudao-framework/yudao-spring-boot-starter-mybatis/src/main/java/cn/iocoder/yudao/framework/mybatis/core/util/MyBatisUtils.java
index 56f51d91df241e0213ec314ac5188b3826eff8ed..89b35f9266b269ae5bcd67ec85a43928a87f6fbe 100644
--- a/yudao-framework/yudao-spring-boot-starter-mybatis/src/main/java/cn/iocoder/yudao/framework/mybatis/core/util/MyBatisUtils.java
+++ b/yudao-framework/yudao-spring-boot-starter-mybatis/src/main/java/cn/iocoder/yudao/framework/mybatis/core/util/MyBatisUtils.java
@@ -53,14 +53,14 @@ public class MyBatisUtils {
if (CollUtil.isEmpty(sortingFields)) {
return;
}
- if (wrapper instanceof QueryWrapper) {
+ if (wrapper instanceof QueryWrapper) {
QueryWrapper query = (QueryWrapper) wrapper;
for (SortingField sortingField : sortingFields) {
query.orderBy(true,
SortingField.ORDER_ASC.equals(sortingField.getOrder()),
StrUtil.toUnderlineCase(sortingField.getField()));
}
- } else if (wrapper instanceof LambdaQueryWrapper) {
+ } else if (wrapper instanceof LambdaQueryWrapper) {
// LambdaQueryWrapper 不直接支持字符串字段排序,使用 last 方法拼接 ORDER BY
LambdaQueryWrapper lambdaQuery = (LambdaQueryWrapper) wrapper;
StringBuilder orderBy = new StringBuilder();
diff --git a/yudao-framework/yudao-spring-boot-starter-protection/pom.xml b/yudao-framework/yudao-spring-boot-starter-protection/pom.xml
index 7e7279eb84dbdc5fd21223039e1578627dddd91f..7d387eb8e645884b966045dfcd9ef7de960de2e1 100644
--- a/yudao-framework/yudao-spring-boot-starter-protection/pom.xml
+++ b/yudao-framework/yudao-spring-boot-starter-protection/pom.xml
@@ -35,13 +35,6 @@
lock4j-redisson-spring-boot-starter
true
-
-
-
- cn.iocoder.boot
- yudao-spring-boot-starter-test
- test
-
diff --git a/yudao-framework/yudao-spring-boot-starter-protection/src/main/java/cn/iocoder/yudao/framework/idempotent/core/keyresolver/impl/ExpressionIdempotentKeyResolver.java b/yudao-framework/yudao-spring-boot-starter-protection/src/main/java/cn/iocoder/yudao/framework/idempotent/core/keyresolver/impl/ExpressionIdempotentKeyResolver.java
index 665d327e900478da58180242f62bc0a76fa253e8..50b4a2c1948b90fe655d6a0849f361942537a417 100644
--- a/yudao-framework/yudao-spring-boot-starter-protection/src/main/java/cn/iocoder/yudao/framework/idempotent/core/keyresolver/impl/ExpressionIdempotentKeyResolver.java
+++ b/yudao-framework/yudao-spring-boot-starter-protection/src/main/java/cn/iocoder/yudao/framework/idempotent/core/keyresolver/impl/ExpressionIdempotentKeyResolver.java
@@ -5,7 +5,7 @@ import cn.iocoder.yudao.framework.idempotent.core.annotation.Idempotent;
import cn.iocoder.yudao.framework.idempotent.core.keyresolver.IdempotentKeyResolver;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.reflect.MethodSignature;
-import org.springframework.core.DefaultParameterNameDiscoverer;
+import org.springframework.core.LocalVariableTableParameterNameDiscoverer;
import org.springframework.core.ParameterNameDiscoverer;
import org.springframework.expression.Expression;
import org.springframework.expression.ExpressionParser;
@@ -21,8 +21,7 @@ import java.lang.reflect.Method;
*/
public class ExpressionIdempotentKeyResolver implements IdempotentKeyResolver {
- private final ParameterNameDiscoverer parameterNameDiscoverer = new DefaultParameterNameDiscoverer();
-
+ private final ParameterNameDiscoverer parameterNameDiscoverer = new LocalVariableTableParameterNameDiscoverer();
private final ExpressionParser expressionParser = new SpelExpressionParser();
@Override
diff --git a/yudao-framework/yudao-spring-boot-starter-protection/src/main/java/cn/iocoder/yudao/framework/signature/core/aop/ApiSignatureAspect.java b/yudao-framework/yudao-spring-boot-starter-protection/src/main/java/cn/iocoder/yudao/framework/signature/core/aop/ApiSignatureAspect.java
index e568346aa32768c9251d7824ddf97adee811ba03..d2d2308426fd41cbf0a9d5640ae13a5d666bd2f5 100644
--- a/yudao-framework/yudao-spring-boot-starter-protection/src/main/java/cn/iocoder/yudao/framework/signature/core/aop/ApiSignatureAspect.java
+++ b/yudao-framework/yudao-spring-boot-starter-protection/src/main/java/cn/iocoder/yudao/framework/signature/core/aop/ApiSignatureAspect.java
@@ -11,13 +11,13 @@ import cn.iocoder.yudao.framework.common.exception.enums.GlobalErrorCodeConstant
import cn.iocoder.yudao.framework.common.util.servlet.ServletUtils;
import cn.iocoder.yudao.framework.signature.core.annotation.ApiSignature;
import cn.iocoder.yudao.framework.signature.core.redis.ApiSignatureRedisDAO;
-import jakarta.servlet.http.HttpServletRequest;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
+import javax.servlet.http.HttpServletRequest;
import java.util.Map;
import java.util.Objects;
import java.util.SortedMap;
diff --git a/yudao-framework/yudao-spring-boot-starter-protection/src/test/java/cn/iocoder/yudao/framework/signature/core/ApiSignatureTest.java b/yudao-framework/yudao-spring-boot-starter-protection/src/test/java/cn/iocoder/yudao/framework/signature/core/ApiSignatureTest.java
deleted file mode 100644
index 442374061223040f49eab926cbfd68a86ede8842..0000000000000000000000000000000000000000
--- a/yudao-framework/yudao-spring-boot-starter-protection/src/test/java/cn/iocoder/yudao/framework/signature/core/ApiSignatureTest.java
+++ /dev/null
@@ -1,74 +0,0 @@
-package cn.iocoder.yudao.framework.signature.core;
-
-import cn.hutool.core.map.MapUtil;
-import cn.hutool.core.util.IdUtil;
-import cn.hutool.crypto.digest.DigestUtil;
-import cn.iocoder.yudao.framework.signature.core.annotation.ApiSignature;
-import cn.iocoder.yudao.framework.signature.core.aop.ApiSignatureAspect;
-import cn.iocoder.yudao.framework.signature.core.redis.ApiSignatureRedisDAO;
-import jakarta.servlet.http.HttpServletRequest;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.ExtendWith;
-import org.mockito.InjectMocks;
-import org.mockito.Mock;
-import org.mockito.junit.jupiter.MockitoExtension;
-
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.io.StringReader;
-import java.util.concurrent.TimeUnit;
-
-import static org.junit.jupiter.api.Assertions.assertTrue;
-import static org.mockito.ArgumentMatchers.eq;
-import static org.mockito.Mockito.*;
-
-/**
- * {@link ApiSignatureTest} 的单元测试
- */
-@ExtendWith(MockitoExtension.class)
-public class ApiSignatureTest {
-
- @InjectMocks
- private ApiSignatureAspect apiSignatureAspect;
-
- @Mock
- private ApiSignatureRedisDAO signatureRedisDAO;
-
- @Test
- public void testSignatureGet() throws IOException {
- // 搞一个签名
- Long timestamp = System.currentTimeMillis();
- String nonce = IdUtil.randomUUID();
- String appId = "xxxxxx";
- String appSecret = "yyyyyy";
- String signString = "k1=v1&v1=k1testappId=xxxxxx&nonce=" + nonce + "×tamp=" + timestamp + "yyyyyy";
- String sign = DigestUtil.sha256Hex(signString);
-
- // 准备参数
- ApiSignature apiSignature = mock(ApiSignature.class);
- when(apiSignature.appId()).thenReturn("appId");
- when(apiSignature.timestamp()).thenReturn("timestamp");
- when(apiSignature.nonce()).thenReturn("nonce");
- when(apiSignature.sign()).thenReturn("sign");
- when(apiSignature.timeout()).thenReturn(60);
- when(apiSignature.timeUnit()).thenReturn(TimeUnit.SECONDS);
- HttpServletRequest request = mock(HttpServletRequest.class);
- when(request.getHeader(eq("appId"))).thenReturn(appId);
- when(request.getHeader(eq("timestamp"))).thenReturn(String.valueOf(timestamp));
- when(request.getHeader(eq("nonce"))).thenReturn(nonce);
- when(request.getHeader(eq("sign"))).thenReturn(sign);
- when(request.getParameterMap()).thenReturn(MapUtil.builder()
- .put("v1", new String[]{"k1"}).put("k1", new String[]{"v1"}).build());
- when(request.getContentType()).thenReturn("application/json");
- when(request.getReader()).thenReturn(new BufferedReader(new StringReader("test")));
- // mock 方法
- when(signatureRedisDAO.getAppSecret(eq(appId))).thenReturn(appSecret);
- when(signatureRedisDAO.setNonce(eq(appId), eq(nonce), eq(120), eq(TimeUnit.SECONDS))).thenReturn(true);
-
- // 调用
- boolean result = apiSignatureAspect.verifySignature(apiSignature, request);
- // 断言结果
- assertTrue(result);
- }
-
-}
\ No newline at end of file
diff --git a/yudao-framework/yudao-spring-boot-starter-redis/pom.xml b/yudao-framework/yudao-spring-boot-starter-redis/pom.xml
index 8f4e580a05d332baac2f23b9e82cf4a2ee0e1d68..3e059bac301e373b0861d9249fb5a215c07d181c 100644
--- a/yudao-framework/yudao-spring-boot-starter-redis/pom.xml
+++ b/yudao-framework/yudao-spring-boot-starter-redis/pom.xml
@@ -26,6 +26,10 @@
org.redisson
redisson-spring-boot-starter
+
+ org.redisson
+ redisson-spring-data-27
+
org.springframework.boot
diff --git a/yudao-framework/yudao-spring-boot-starter-redis/src/main/java/cn/iocoder/yudao/framework/redis/config/YudaoRedisAutoConfiguration.java b/yudao-framework/yudao-spring-boot-starter-redis/src/main/java/cn/iocoder/yudao/framework/redis/config/YudaoRedisAutoConfiguration.java
index 01eeb049d5cf3f1c9305cab4c1c0b9bfeb777799..ff02c933718c648d692e0a17f6a3d802268847be 100644
--- a/yudao-framework/yudao-spring-boot-starter-redis/src/main/java/cn/iocoder/yudao/framework/redis/config/YudaoRedisAutoConfiguration.java
+++ b/yudao-framework/yudao-spring-boot-starter-redis/src/main/java/cn/iocoder/yudao/framework/redis/config/YudaoRedisAutoConfiguration.java
@@ -3,7 +3,7 @@ package cn.iocoder.yudao.framework.redis.config;
import cn.hutool.core.util.ReflectUtil;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
-import org.redisson.spring.starter.RedissonAutoConfigurationV2;
+import org.redisson.spring.starter.RedissonAutoConfiguration;
import org.springframework.boot.autoconfigure.AutoConfiguration;
import org.springframework.context.annotation.Bean;
import org.springframework.data.redis.connection.RedisConnectionFactory;
@@ -13,7 +13,7 @@ import org.springframework.data.redis.serializer.RedisSerializer;
/**
* Redis 配置类
*/
-@AutoConfiguration(before = RedissonAutoConfigurationV2.class) // 目的:使用自己定义的 RedisTemplate Bean
+@AutoConfiguration(before = RedissonAutoConfiguration.class) // 目的:使用自己定义的 RedisTemplate Bean
public class YudaoRedisAutoConfiguration {
/**
diff --git a/yudao-framework/yudao-spring-boot-starter-security/src/main/java/cn/iocoder/yudao/framework/operatelog/core/service/LogRecordServiceImpl.java b/yudao-framework/yudao-spring-boot-starter-security/src/main/java/cn/iocoder/yudao/framework/operatelog/core/service/LogRecordServiceImpl.java
index 7000f6ede343042e423c6418ede099c2d3cf3f82..798a7ea8e8b1b6987b40c94980bf6c9f9490f666 100644
--- a/yudao-framework/yudao-spring-boot-starter-security/src/main/java/cn/iocoder/yudao/framework/operatelog/core/service/LogRecordServiceImpl.java
+++ b/yudao-framework/yudao-spring-boot-starter-security/src/main/java/cn/iocoder/yudao/framework/operatelog/core/service/LogRecordServiceImpl.java
@@ -8,10 +8,10 @@ import cn.iocoder.yudao.framework.security.core.LoginUser;
import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils;
import com.mzt.logapi.beans.LogRecord;
import com.mzt.logapi.service.ILogRecordService;
-import jakarta.annotation.Resource;
-import jakarta.servlet.http.HttpServletRequest;
import lombok.extern.slf4j.Slf4j;
+import javax.annotation.Resource;
+import javax.servlet.http.HttpServletRequest;
import java.util.List;
/**
diff --git a/yudao-framework/yudao-spring-boot-starter-security/src/main/java/cn/iocoder/yudao/framework/security/config/AuthorizeRequestsCustomizer.java b/yudao-framework/yudao-spring-boot-starter-security/src/main/java/cn/iocoder/yudao/framework/security/config/AuthorizeRequestsCustomizer.java
index 1b6bf68aae01cf380eaf1191bcfdbd65f065ebe1..337400f68b912c515eaa459e7ff49cbed1512cfd 100644
--- a/yudao-framework/yudao-spring-boot-starter-security/src/main/java/cn/iocoder/yudao/framework/security/config/AuthorizeRequestsCustomizer.java
+++ b/yudao-framework/yudao-spring-boot-starter-security/src/main/java/cn/iocoder/yudao/framework/security/config/AuthorizeRequestsCustomizer.java
@@ -1,12 +1,13 @@
package cn.iocoder.yudao.framework.security.config;
import cn.iocoder.yudao.framework.web.config.WebProperties;
-import jakarta.annotation.Resource;
import org.springframework.core.Ordered;
import org.springframework.security.config.Customizer;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configurers.AuthorizeHttpRequestsConfigurer;
+import javax.annotation.Resource;
+
/**
* 自定义的 URL 的安全配置
* 目的:每个 Maven Module 可以自定义规则!
diff --git a/yudao-framework/yudao-spring-boot-starter-security/src/main/java/cn/iocoder/yudao/framework/security/config/SecurityProperties.java b/yudao-framework/yudao-spring-boot-starter-security/src/main/java/cn/iocoder/yudao/framework/security/config/SecurityProperties.java
index 936e447f1470a2ee20136beba96227eb3c9da10b..3d19f32a65c2b4b8505fe6265c56cc94c7456992 100644
--- a/yudao-framework/yudao-spring-boot-starter-security/src/main/java/cn/iocoder/yudao/framework/security/config/SecurityProperties.java
+++ b/yudao-framework/yudao-spring-boot-starter-security/src/main/java/cn/iocoder/yudao/framework/security/config/SecurityProperties.java
@@ -4,8 +4,8 @@ import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.validation.annotation.Validated;
-import jakarta.validation.constraints.NotEmpty;
-import jakarta.validation.constraints.NotNull;
+import javax.validation.constraints.NotEmpty;
+import javax.validation.constraints.NotNull;
import java.util.Collections;
import java.util.List;
diff --git a/yudao-framework/yudao-spring-boot-starter-security/src/main/java/cn/iocoder/yudao/framework/security/config/YudaoSecurityAutoConfiguration.java b/yudao-framework/yudao-spring-boot-starter-security/src/main/java/cn/iocoder/yudao/framework/security/config/YudaoSecurityAutoConfiguration.java
index 8874b15593e744f59d5b9f743617743c785f1b80..b3793bc0e578f69a7d3ccbbb87e5458b63cf1887 100644
--- a/yudao-framework/yudao-spring-boot-starter-security/src/main/java/cn/iocoder/yudao/framework/security/config/YudaoSecurityAutoConfiguration.java
+++ b/yudao-framework/yudao-spring-boot-starter-security/src/main/java/cn/iocoder/yudao/framework/security/config/YudaoSecurityAutoConfiguration.java
@@ -9,7 +9,7 @@ import cn.iocoder.yudao.framework.security.core.handler.AuthenticationEntryPoint
import cn.iocoder.yudao.framework.security.core.service.SecurityFrameworkService;
import cn.iocoder.yudao.framework.security.core.service.SecurityFrameworkServiceImpl;
import cn.iocoder.yudao.framework.web.core.handler.GlobalExceptionHandler;
-import jakarta.annotation.Resource;
+import javax.annotation.Resource;
import org.springframework.beans.factory.config.MethodInvokingFactoryBean;
import org.springframework.boot.autoconfigure.AutoConfiguration;
import org.springframework.boot.autoconfigure.AutoConfigureOrder;
diff --git a/yudao-framework/yudao-spring-boot-starter-security/src/main/java/cn/iocoder/yudao/framework/security/config/YudaoWebSecurityConfigurerAdapter.java b/yudao-framework/yudao-spring-boot-starter-security/src/main/java/cn/iocoder/yudao/framework/security/config/YudaoWebSecurityConfigurerAdapter.java
index 0c7b31521a37d829cdaf1cfc667b297653641d72..f5bb27968300aadb826528dab0d23f82fa9d6788 100644
--- a/yudao-framework/yudao-spring-boot-starter-security/src/main/java/cn/iocoder/yudao/framework/security/config/YudaoWebSecurityConfigurerAdapter.java
+++ b/yudao-framework/yudao-spring-boot-starter-security/src/main/java/cn/iocoder/yudao/framework/security/config/YudaoWebSecurityConfigurerAdapter.java
@@ -5,9 +5,6 @@ import cn.iocoder.yudao.framework.security.core.filter.TokenAuthenticationFilter
import cn.iocoder.yudao.framework.web.config.WebProperties;
import com.google.common.collect.HashMultimap;
import com.google.common.collect.Multimap;
-import jakarta.annotation.Resource;
-import jakarta.annotation.security.PermitAll;
-import jakarta.servlet.DispatcherType;
import org.springframework.boot.autoconfigure.AutoConfiguration;
import org.springframework.boot.autoconfigure.AutoConfigureOrder;
import org.springframework.context.ApplicationContext;
@@ -31,6 +28,9 @@ import org.springframework.web.servlet.mvc.method.RequestMappingInfo;
import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping;
import org.springframework.web.util.pattern.PathPattern;
+import javax.annotation.Resource;
+import javax.annotation.security.PermitAll;
+import javax.servlet.DispatcherType;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
diff --git a/yudao-framework/yudao-spring-boot-starter-security/src/main/java/cn/iocoder/yudao/framework/security/core/filter/TokenAuthenticationFilter.java b/yudao-framework/yudao-spring-boot-starter-security/src/main/java/cn/iocoder/yudao/framework/security/core/filter/TokenAuthenticationFilter.java
index 8aaea2e654e354836b2d480ef33cdd3920d31788..8035a7aa85727f8569a8dc8588b1e53ea296ebae 100644
--- a/yudao-framework/yudao-spring-boot-starter-security/src/main/java/cn/iocoder/yudao/framework/security/core/filter/TokenAuthenticationFilter.java
+++ b/yudao-framework/yudao-spring-boot-starter-security/src/main/java/cn/iocoder/yudao/framework/security/core/filter/TokenAuthenticationFilter.java
@@ -12,14 +12,14 @@ import cn.iocoder.yudao.framework.security.core.LoginUser;
import cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils;
import cn.iocoder.yudao.framework.web.core.handler.GlobalExceptionHandler;
import cn.iocoder.yudao.framework.web.core.util.WebFrameworkUtils;
-import jakarta.servlet.FilterChain;
-import jakarta.servlet.ServletException;
-import jakarta.servlet.http.HttpServletRequest;
-import jakarta.servlet.http.HttpServletResponse;
import lombok.RequiredArgsConstructor;
import org.springframework.security.access.AccessDeniedException;
import org.springframework.web.filter.OncePerRequestFilter;
+import javax.servlet.FilterChain;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
diff --git a/yudao-framework/yudao-spring-boot-starter-security/src/main/java/cn/iocoder/yudao/framework/security/core/handler/AccessDeniedHandlerImpl.java b/yudao-framework/yudao-spring-boot-starter-security/src/main/java/cn/iocoder/yudao/framework/security/core/handler/AccessDeniedHandlerImpl.java
index 0ec5262bcaae765232bfa07df0b690beb727866a..33f3f14f4e02f285245ac967e88537aeaeef4077 100644
--- a/yudao-framework/yudao-spring-boot-starter-security/src/main/java/cn/iocoder/yudao/framework/security/core/handler/AccessDeniedHandlerImpl.java
+++ b/yudao-framework/yudao-spring-boot-starter-security/src/main/java/cn/iocoder/yudao/framework/security/core/handler/AccessDeniedHandlerImpl.java
@@ -8,14 +8,16 @@ import lombok.extern.slf4j.Slf4j;
import org.springframework.security.access.AccessDeniedException;
import org.springframework.security.web.access.AccessDeniedHandler;
import org.springframework.security.web.access.ExceptionTranslationFilter;
+import org.springframework.stereotype.Component;
-import jakarta.servlet.FilterChain;
-import jakarta.servlet.ServletException;
-import jakarta.servlet.http.HttpServletRequest;
-import jakarta.servlet.http.HttpServletResponse;
+import javax.servlet.FilterChain;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import static cn.iocoder.yudao.framework.common.exception.enums.GlobalErrorCodeConstants.FORBIDDEN;
+import static cn.iocoder.yudao.framework.common.exception.enums.GlobalErrorCodeConstants.UNAUTHORIZED;
/**
* 访问一个需要认证的 URL 资源,已经认证(登录)但是没有权限的情况下,返回 {@link GlobalErrorCodeConstants#FORBIDDEN} 错误码。
diff --git a/yudao-framework/yudao-spring-boot-starter-security/src/main/java/cn/iocoder/yudao/framework/security/core/handler/AuthenticationEntryPointImpl.java b/yudao-framework/yudao-spring-boot-starter-security/src/main/java/cn/iocoder/yudao/framework/security/core/handler/AuthenticationEntryPointImpl.java
index 9d9caa6aae9ee353babc10ea826d750b4c9f09f3..0a451e0762757208558a75627484f735302197b3 100644
--- a/yudao-framework/yudao-spring-boot-starter-security/src/main/java/cn/iocoder/yudao/framework/security/core/handler/AuthenticationEntryPointImpl.java
+++ b/yudao-framework/yudao-spring-boot-starter-security/src/main/java/cn/iocoder/yudao/framework/security/core/handler/AuthenticationEntryPointImpl.java
@@ -8,9 +8,9 @@ import org.springframework.security.core.AuthenticationException;
import org.springframework.security.web.AuthenticationEntryPoint;
import org.springframework.security.web.access.ExceptionTranslationFilter;
-import jakarta.servlet.FilterChain;
-import jakarta.servlet.http.HttpServletRequest;
-import jakarta.servlet.http.HttpServletResponse;
+import javax.servlet.FilterChain;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
import static cn.iocoder.yudao.framework.common.exception.enums.GlobalErrorCodeConstants.UNAUTHORIZED;
diff --git a/yudao-framework/yudao-spring-boot-starter-security/src/main/java/cn/iocoder/yudao/framework/security/core/util/SecurityFrameworkUtils.java b/yudao-framework/yudao-spring-boot-starter-security/src/main/java/cn/iocoder/yudao/framework/security/core/util/SecurityFrameworkUtils.java
index 4f8024474bbc216a6239f580a8a7be33181f7ab0..f2f1e4848be9d94243fd9b4f11a6508f4025ebfc 100644
--- a/yudao-framework/yudao-spring-boot-starter-security/src/main/java/cn/iocoder/yudao/framework/security/core/util/SecurityFrameworkUtils.java
+++ b/yudao-framework/yudao-spring-boot-starter-security/src/main/java/cn/iocoder/yudao/framework/security/core/util/SecurityFrameworkUtils.java
@@ -13,7 +13,7 @@ import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.web.authentication.WebAuthenticationDetailsSource;
import org.springframework.util.StringUtils;
-import jakarta.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletRequest;
import java.util.Collections;
/**
diff --git a/yudao-framework/yudao-spring-boot-starter-test/pom.xml b/yudao-framework/yudao-spring-boot-starter-test/pom.xml
deleted file mode 100644
index 04576fee6c2225e0cb1b0d73fa9a172a93c661c0..0000000000000000000000000000000000000000
--- a/yudao-framework/yudao-spring-boot-starter-test/pom.xml
+++ /dev/null
@@ -1,60 +0,0 @@
-
-
-
- cn.iocoder.boot
- yudao-framework
- ${revision}
-
- 4.0.0
- yudao-spring-boot-starter-test
- jar
-
- ${project.artifactId}
- 测试组件,用于单元测试、集成测试
- https://github.com/YunaiV/ruoyi-vue-pro
-
-
-
- cn.iocoder.boot
- yudao-common
-
-
-
-
- cn.iocoder.boot
- yudao-spring-boot-starter-mybatis
-
-
-
- cn.iocoder.boot
- yudao-spring-boot-starter-redis
-
-
-
-
- org.mockito
- mockito-inline
-
-
- org.springframework.boot
- spring-boot-starter-test
-
-
-
- com.h2database
- h2
-
-
-
- com.github.fppt
- jedis-mock
-
-
-
- uk.co.jemos.podam
- podam
-
-
-
diff --git a/yudao-framework/yudao-spring-boot-starter-test/src/main/java/cn/iocoder/yudao/framework/test/config/RedisTestConfiguration.java b/yudao-framework/yudao-spring-boot-starter-test/src/main/java/cn/iocoder/yudao/framework/test/config/RedisTestConfiguration.java
deleted file mode 100644
index 46222911e95cea49a62d60cd6ed416fa55679517..0000000000000000000000000000000000000000
--- a/yudao-framework/yudao-spring-boot-starter-test/src/main/java/cn/iocoder/yudao/framework/test/config/RedisTestConfiguration.java
+++ /dev/null
@@ -1,35 +0,0 @@
-package cn.iocoder.yudao.framework.test.config;
-
-import com.github.fppt.jedismock.RedisServer;
-import org.springframework.boot.autoconfigure.data.redis.RedisProperties;
-import org.springframework.boot.context.properties.EnableConfigurationProperties;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.context.annotation.Lazy;
-
-import java.io.IOException;
-
-/**
- * Redis 测试 Configuration,主要实现内嵌 Redis 的启动
- *
- * @author 芋道源码
- */
-@Configuration(proxyBeanMethods = false)
-@Lazy(false) // 禁止延迟加载
-@EnableConfigurationProperties(RedisProperties.class)
-public class RedisTestConfiguration {
-
- /**
- * 创建模拟的 Redis Server 服务器
- */
- @Bean
- public RedisServer redisServer(RedisProperties properties) throws IOException {
- RedisServer redisServer = new RedisServer(properties.getPort());
- // 一次执行多个单元测试时,貌似创建多个 spring 容器,导致不进行 stop。这样,就导致端口被占用,无法启动。。。
- try {
- redisServer.start();
- } catch (Exception ignore) {}
- return redisServer;
- }
-
-}
diff --git a/yudao-framework/yudao-spring-boot-starter-test/src/main/java/cn/iocoder/yudao/framework/test/config/SqlInitializationTestConfiguration.java b/yudao-framework/yudao-spring-boot-starter-test/src/main/java/cn/iocoder/yudao/framework/test/config/SqlInitializationTestConfiguration.java
deleted file mode 100644
index abaec9d84f64ca7b9b2dbaffa624cf493d358e8a..0000000000000000000000000000000000000000
--- a/yudao-framework/yudao-spring-boot-starter-test/src/main/java/cn/iocoder/yudao/framework/test/config/SqlInitializationTestConfiguration.java
+++ /dev/null
@@ -1,52 +0,0 @@
-package cn.iocoder.yudao.framework.test.config;
-
-import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
-import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
-import org.springframework.boot.autoconfigure.condition.ConditionalOnSingleCandidate;
-import org.springframework.boot.autoconfigure.sql.init.SqlInitializationProperties;
-import org.springframework.boot.context.properties.EnableConfigurationProperties;
-import org.springframework.boot.jdbc.init.DataSourceScriptDatabaseInitializer;
-import org.springframework.boot.sql.init.AbstractScriptDatabaseInitializer;
-import org.springframework.boot.sql.init.DatabaseInitializationSettings;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.context.annotation.Lazy;
-
-import javax.sql.DataSource;
-
-/**
- * SQL 初始化的测试 Configuration
- *
- * 为什么不使用 org.springframework.boot.autoconfigure.sql.init.DataSourceInitializationConfiguration 呢?
- * 因为我们在单元测试会使用 spring.main.lazy-initialization 为 true,开启延迟加载。此时,会导致 DataSourceInitializationConfiguration 初始化
- * 不过呢,当前类的实现代码,基本是复制 DataSourceInitializationConfiguration 的哈!
- *
- * @author 芋道源码
- */
-@Configuration(proxyBeanMethods = false)
-@ConditionalOnMissingBean(AbstractScriptDatabaseInitializer.class)
-@ConditionalOnSingleCandidate(DataSource.class)
-@ConditionalOnClass(name = "org.springframework.jdbc.datasource.init.DatabasePopulator")
-@Lazy(value = false) // 禁止延迟加载
-@EnableConfigurationProperties(SqlInitializationProperties.class)
-public class SqlInitializationTestConfiguration {
-
- @Bean
- public DataSourceScriptDatabaseInitializer dataSourceScriptDatabaseInitializer(DataSource dataSource,
- SqlInitializationProperties initializationProperties) {
- DatabaseInitializationSettings settings = createFrom(initializationProperties);
- return new DataSourceScriptDatabaseInitializer(dataSource, settings);
- }
-
- static DatabaseInitializationSettings createFrom(SqlInitializationProperties properties) {
- DatabaseInitializationSettings settings = new DatabaseInitializationSettings();
- settings.setSchemaLocations(properties.getSchemaLocations());
- settings.setDataLocations(properties.getDataLocations());
- settings.setContinueOnError(properties.isContinueOnError());
- settings.setSeparator(properties.getSeparator());
- settings.setEncoding(properties.getEncoding());
- settings.setMode(properties.getMode());
- return settings;
- }
-
-}
diff --git a/yudao-framework/yudao-spring-boot-starter-test/src/main/java/cn/iocoder/yudao/framework/test/core/ut/BaseDbAndRedisUnitTest.java b/yudao-framework/yudao-spring-boot-starter-test/src/main/java/cn/iocoder/yudao/framework/test/core/ut/BaseDbAndRedisUnitTest.java
deleted file mode 100644
index 46a6927d61860aeb33d6e8dd6c67d82cc884ec44..0000000000000000000000000000000000000000
--- a/yudao-framework/yudao-spring-boot-starter-test/src/main/java/cn/iocoder/yudao/framework/test/core/ut/BaseDbAndRedisUnitTest.java
+++ /dev/null
@@ -1,55 +0,0 @@
-package cn.iocoder.yudao.framework.test.core.ut;
-
-import cn.hutool.extra.spring.SpringUtil;
-import cn.iocoder.yudao.framework.datasource.config.YudaoDataSourceAutoConfiguration;
-import cn.iocoder.yudao.framework.mybatis.config.YudaoMybatisAutoConfiguration;
-import cn.iocoder.yudao.framework.redis.config.YudaoRedisAutoConfiguration;
-import cn.iocoder.yudao.framework.test.config.RedisTestConfiguration;
-import cn.iocoder.yudao.framework.test.config.SqlInitializationTestConfiguration;
-import com.alibaba.druid.spring.boot3.autoconfigure.DruidDataSourceAutoConfigure;
-import com.baomidou.mybatisplus.autoconfigure.MybatisPlusAutoConfiguration;
-import org.redisson.spring.starter.RedissonAutoConfiguration;
-import org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration;
-import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
-import org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration;
-import org.springframework.boot.test.context.SpringBootTest;
-import org.springframework.context.annotation.Import;
-import org.springframework.test.context.ActiveProfiles;
-import org.springframework.test.context.jdbc.Sql;
-
-/**
- * 依赖内存 DB + Redis 的单元测试
- *
- * 相比 {@link BaseDbUnitTest} 来说,额外增加了内存 Redis
- *
- * @author 芋道源码
- */
-@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.NONE, classes = BaseDbAndRedisUnitTest.Application.class)
-@ActiveProfiles("unit-test") // 设置使用 application-unit-test 配置文件
-@Sql(scripts = "/sql/clean.sql", executionPhase = Sql.ExecutionPhase.AFTER_TEST_METHOD) // 每个单元测试结束后,清理 DB
-public class BaseDbAndRedisUnitTest {
-
- @Import({
- // DB 配置类
- YudaoDataSourceAutoConfiguration.class, // 自己的 DB 配置类
- DataSourceAutoConfiguration.class, // Spring DB 自动配置类
- DataSourceTransactionManagerAutoConfiguration.class, // Spring 事务自动配置类
- DruidDataSourceAutoConfigure.class, // Druid 自动配置类
- SqlInitializationTestConfiguration.class, // SQL 初始化
- // MyBatis 配置类
- YudaoMybatisAutoConfiguration.class, // 自己的 MyBatis 配置类
- MybatisPlusAutoConfiguration.class, // MyBatis 的自动配置类
-
- // Redis 配置类
- RedisTestConfiguration.class, // Redis 测试配置类,用于启动 RedisServer
- YudaoRedisAutoConfiguration.class, // 自己的 Redis 配置类
- RedisAutoConfiguration.class, // Spring Redis 自动配置类
- RedissonAutoConfiguration.class, // Redisson 自动配置类
-
- // 其它配置类
- SpringUtil.class
- })
- public static class Application {
- }
-
-}
diff --git a/yudao-framework/yudao-spring-boot-starter-test/src/main/java/cn/iocoder/yudao/framework/test/core/ut/BaseDbUnitTest.java b/yudao-framework/yudao-spring-boot-starter-test/src/main/java/cn/iocoder/yudao/framework/test/core/ut/BaseDbUnitTest.java
deleted file mode 100644
index 98b06f95f3500f75ddbb7e39651b176f36540e52..0000000000000000000000000000000000000000
--- a/yudao-framework/yudao-spring-boot-starter-test/src/main/java/cn/iocoder/yudao/framework/test/core/ut/BaseDbUnitTest.java
+++ /dev/null
@@ -1,47 +0,0 @@
-package cn.iocoder.yudao.framework.test.core.ut;
-
-import cn.hutool.extra.spring.SpringUtil;
-import cn.iocoder.yudao.framework.datasource.config.YudaoDataSourceAutoConfiguration;
-import cn.iocoder.yudao.framework.mybatis.config.YudaoMybatisAutoConfiguration;
-import cn.iocoder.yudao.framework.test.config.SqlInitializationTestConfiguration;
-import com.alibaba.druid.spring.boot3.autoconfigure.DruidDataSourceAutoConfigure;
-import com.baomidou.mybatisplus.autoconfigure.MybatisPlusAutoConfiguration;
-import com.github.yulichang.autoconfigure.MybatisPlusJoinAutoConfiguration;
-import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
-import org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration;
-import org.springframework.boot.test.context.SpringBootTest;
-import org.springframework.context.annotation.Import;
-import org.springframework.test.context.ActiveProfiles;
-import org.springframework.test.context.jdbc.Sql;
-
-/**
- * 依赖内存 DB 的单元测试
- *
- * 注意,Service 层同样适用。对于 Service 层的单元测试,我们针对自己模块的 Mapper 走的是 H2 内存数据库,针对别的模块的 Service 走的是 Mock 方法
- *
- * @author 芋道源码
- */
-@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.NONE, classes = BaseDbUnitTest.Application.class)
-@ActiveProfiles("unit-test") // 设置使用 application-unit-test 配置文件
-@Sql(scripts = "/sql/clean.sql", executionPhase = Sql.ExecutionPhase.AFTER_TEST_METHOD) // 每个单元测试结束后,清理 DB
-public class BaseDbUnitTest {
-
- @Import({
- // DB 配置类
- YudaoDataSourceAutoConfiguration.class, // 自己的 DB 配置类
- DataSourceAutoConfiguration.class, // Spring DB 自动配置类
- DataSourceTransactionManagerAutoConfiguration.class, // Spring 事务自动配置类
- DruidDataSourceAutoConfigure.class, // Druid 自动配置类
- SqlInitializationTestConfiguration.class, // SQL 初始化
- // MyBatis 配置类
- YudaoMybatisAutoConfiguration.class, // 自己的 MyBatis 配置类
- MybatisPlusAutoConfiguration.class, // MyBatis 的自动配置类
- MybatisPlusJoinAutoConfiguration.class, // MyBatis 的Join配置类
-
- // 其它配置类
- SpringUtil.class
- })
- public static class Application {
- }
-
-}
diff --git a/yudao-framework/yudao-spring-boot-starter-test/src/main/java/cn/iocoder/yudao/framework/test/core/ut/BaseMockitoUnitTest.java b/yudao-framework/yudao-spring-boot-starter-test/src/main/java/cn/iocoder/yudao/framework/test/core/ut/BaseMockitoUnitTest.java
deleted file mode 100644
index 26048695c5a331556b6816f7ffd7bae953138129..0000000000000000000000000000000000000000
--- a/yudao-framework/yudao-spring-boot-starter-test/src/main/java/cn/iocoder/yudao/framework/test/core/ut/BaseMockitoUnitTest.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package cn.iocoder.yudao.framework.test.core.ut;
-
-import org.junit.jupiter.api.extension.ExtendWith;
-import org.mockito.junit.jupiter.MockitoExtension;
-
-/**
- * 纯 Mockito 的单元测试
- *
- * @author 芋道源码
- */
-@ExtendWith(MockitoExtension.class)
-public class BaseMockitoUnitTest {
-}
diff --git a/yudao-framework/yudao-spring-boot-starter-test/src/main/java/cn/iocoder/yudao/framework/test/core/ut/BaseRedisUnitTest.java b/yudao-framework/yudao-spring-boot-starter-test/src/main/java/cn/iocoder/yudao/framework/test/core/ut/BaseRedisUnitTest.java
deleted file mode 100644
index ff6315a2dd222cbde38ca4a94aa2feb8ed1481fb..0000000000000000000000000000000000000000
--- a/yudao-framework/yudao-spring-boot-starter-test/src/main/java/cn/iocoder/yudao/framework/test/core/ut/BaseRedisUnitTest.java
+++ /dev/null
@@ -1,36 +0,0 @@
-package cn.iocoder.yudao.framework.test.core.ut;
-
-import cn.hutool.extra.spring.SpringUtil;
-import cn.iocoder.yudao.framework.redis.config.YudaoRedisAutoConfiguration;
-import cn.iocoder.yudao.framework.test.config.RedisTestConfiguration;
-import org.redisson.spring.starter.RedissonAutoConfiguration;
-import org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration;
-import org.springframework.boot.test.context.SpringBootTest;
-import org.springframework.context.annotation.Import;
-import org.springframework.test.context.ActiveProfiles;
-
-/**
- * 依赖内存 Redis 的单元测试
- *
- * 相比 {@link BaseDbUnitTest} 来说,从内存 DB 改成了内存 Redis
- *
- * @author 芋道源码
- */
-@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.NONE, classes = BaseRedisUnitTest.Application.class)
-@ActiveProfiles("unit-test") // 设置使用 application-unit-test 配置文件
-public class BaseRedisUnitTest {
-
- @Import({
- // Redis 配置类
- RedisTestConfiguration.class, // Redis 测试配置类,用于启动 RedisServer
- RedisAutoConfiguration.class, // Spring Redis 自动配置类
- YudaoRedisAutoConfiguration.class, // 自己的 Redis 配置类
- RedissonAutoConfiguration.class, // Redisson 自动配置类
-
- // 其它配置类
- SpringUtil.class
- })
- public static class Application {
- }
-
-}
diff --git a/yudao-framework/yudao-spring-boot-starter-test/src/main/java/cn/iocoder/yudao/framework/test/core/ut/package-info.java b/yudao-framework/yudao-spring-boot-starter-test/src/main/java/cn/iocoder/yudao/framework/test/core/ut/package-info.java
deleted file mode 100644
index bda7aad2524dc40cdc03233caba81794ae1d7243..0000000000000000000000000000000000000000
--- a/yudao-framework/yudao-spring-boot-starter-test/src/main/java/cn/iocoder/yudao/framework/test/core/ut/package-info.java
+++ /dev/null
@@ -1,4 +0,0 @@
-/**
- * 提供单元测试 Unit Test 的基类
- */
-package cn.iocoder.yudao.framework.test.core.ut;
diff --git a/yudao-framework/yudao-spring-boot-starter-test/src/main/java/cn/iocoder/yudao/framework/test/core/util/AssertUtils.java b/yudao-framework/yudao-spring-boot-starter-test/src/main/java/cn/iocoder/yudao/framework/test/core/util/AssertUtils.java
deleted file mode 100644
index e98f4980fcdf6cded420031a3c351e1f82a0a7bf..0000000000000000000000000000000000000000
--- a/yudao-framework/yudao-spring-boot-starter-test/src/main/java/cn/iocoder/yudao/framework/test/core/util/AssertUtils.java
+++ /dev/null
@@ -1,101 +0,0 @@
-package cn.iocoder.yudao.framework.test.core.util;
-
-import cn.hutool.core.util.ArrayUtil;
-import cn.hutool.core.util.ReflectUtil;
-import cn.iocoder.yudao.framework.common.exception.ErrorCode;
-import cn.iocoder.yudao.framework.common.exception.ServiceException;
-import cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil;
-import org.junit.jupiter.api.Assertions;
-import org.junit.jupiter.api.function.Executable;
-
-import java.lang.reflect.Field;
-import java.util.Arrays;
-import java.util.Objects;
-
-import static org.junit.jupiter.api.Assertions.assertThrows;
-
-/**
- * 单元测试,assert 断言工具类
- *
- * @author 芋道源码
- */
-public class AssertUtils {
-
- /**
- * 比对两个对象的属性是否一致
- *
- * 注意,如果 expected 存在的属性,actual 不存在的时候,会进行忽略
- *
- * @param expected 期望对象
- * @param actual 实际对象
- * @param ignoreFields 忽略的属性数组
- */
- public static void assertPojoEquals(Object expected, Object actual, String... ignoreFields) {
- Field[] expectedFields = ReflectUtil.getFields(expected.getClass());
- Arrays.stream(expectedFields).forEach(expectedField -> {
- // 忽略 jacoco 自动生成的 $jacocoData 属性的情况
- if (expectedField.isSynthetic()) {
- return;
- }
- // 如果是忽略的属性,则不进行比对
- if (ArrayUtil.contains(ignoreFields, expectedField.getName())) {
- return;
- }
- // 忽略不存在的属性
- Field actualField = ReflectUtil.getField(actual.getClass(), expectedField.getName());
- if (actualField == null) {
- return;
- }
- // 比对
- Assertions.assertEquals(
- ReflectUtil.getFieldValue(expected, expectedField),
- ReflectUtil.getFieldValue(actual, actualField),
- String.format("Field(%s) 不匹配", expectedField.getName())
- );
- });
- }
-
- /**
- * 比对两个对象的属性是否一致
- *
- * 注意,如果 expected 存在的属性,actual 不存在的时候,会进行忽略
- *
- * @param expected 期望对象
- * @param actual 实际对象
- * @param ignoreFields 忽略的属性数组
- * @return 是否一致
- */
- public static boolean isPojoEquals(Object expected, Object actual, String... ignoreFields) {
- Field[] expectedFields = ReflectUtil.getFields(expected.getClass());
- return Arrays.stream(expectedFields).allMatch(expectedField -> {
- // 如果是忽略的属性,则不进行比对
- if (ArrayUtil.contains(ignoreFields, expectedField.getName())) {
- return true;
- }
- // 忽略不存在的属性
- Field actualField = ReflectUtil.getField(actual.getClass(), expectedField.getName());
- if (actualField == null) {
- return true;
- }
- return Objects.equals(ReflectUtil.getFieldValue(expected, expectedField),
- ReflectUtil.getFieldValue(actual, actualField));
- });
- }
-
- /**
- * 执行方法,校验抛出的 Service 是否符合条件
- *
- * @param executable 业务异常
- * @param errorCode 错误码对象
- * @param messageParams 消息参数
- */
- public static void assertServiceException(Executable executable, ErrorCode errorCode, Object... messageParams) {
- // 调用方法
- ServiceException serviceException = assertThrows(ServiceException.class, executable);
- // 校验错误码
- Assertions.assertEquals(errorCode.getCode(), serviceException.getCode(), "错误码不匹配");
- String message = ServiceExceptionUtil.doFormat(errorCode.getCode(), errorCode.getMsg(), messageParams);
- Assertions.assertEquals(message, serviceException.getMessage(), "错误提示不匹配");
- }
-
-}
diff --git a/yudao-framework/yudao-spring-boot-starter-test/src/main/java/cn/iocoder/yudao/framework/test/core/util/RandomUtils.java b/yudao-framework/yudao-spring-boot-starter-test/src/main/java/cn/iocoder/yudao/framework/test/core/util/RandomUtils.java
deleted file mode 100644
index 1cafbcd4586703ba88047848ac538d4daf9005b2..0000000000000000000000000000000000000000
--- a/yudao-framework/yudao-spring-boot-starter-test/src/main/java/cn/iocoder/yudao/framework/test/core/util/RandomUtils.java
+++ /dev/null
@@ -1,146 +0,0 @@
-package cn.iocoder.yudao.framework.test.core.util;
-
-import cn.hutool.core.date.LocalDateTimeUtil;
-import cn.hutool.core.util.ArrayUtil;
-import cn.hutool.core.util.RandomUtil;
-import cn.hutool.core.util.StrUtil;
-import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
-import uk.co.jemos.podam.api.PodamFactory;
-import uk.co.jemos.podam.api.PodamFactoryImpl;
-
-import java.lang.reflect.Type;
-import java.time.LocalDateTime;
-import java.util.Arrays;
-import java.util.Date;
-import java.util.List;
-import java.util.Set;
-import java.util.function.Consumer;
-import java.util.stream.Collectors;
-import java.util.stream.Stream;
-
-/**
- * 随机工具类
- *
- * @author 芋道源码
- */
-public class RandomUtils {
-
- private static final int RANDOM_STRING_LENGTH = 10;
-
- private static final int TINYINT_MAX = 127;
-
- private static final int RANDOM_DATE_MAX = 30;
-
- private static final int RANDOM_COLLECTION_LENGTH = 5;
-
- private static final PodamFactory PODAM_FACTORY = new PodamFactoryImpl();
-
- static {
- // 字符串
- PODAM_FACTORY.getStrategy().addOrReplaceTypeManufacturer(String.class,
- (dataProviderStrategy, attributeMetadata, map) -> randomString());
- // Integer
- PODAM_FACTORY.getStrategy().addOrReplaceTypeManufacturer(Integer.class, (dataProviderStrategy, attributeMetadata, map) -> {
- // 如果是 status 的字段,返回 0 或 1
- if ("status".equals(attributeMetadata.getAttributeName())) {
- return RandomUtil.randomEle(CommonStatusEnum.values()).getStatus();
- }
- // 如果是 type、status 结尾的字段,返回 tinyint 范围
- if (StrUtil.endWithAnyIgnoreCase(attributeMetadata.getAttributeName(),
- "type", "status", "category", "scope", "result")) {
- return RandomUtil.randomInt(0, TINYINT_MAX + 1);
- }
- return RandomUtil.randomInt();
- });
- // LocalDateTime
- PODAM_FACTORY.getStrategy().addOrReplaceTypeManufacturer(LocalDateTime.class,
- (dataProviderStrategy, attributeMetadata, map) -> randomLocalDateTime());
- // Boolean
- PODAM_FACTORY.getStrategy().addOrReplaceTypeManufacturer(Boolean.class, (dataProviderStrategy, attributeMetadata, map) -> {
- // 如果是 deleted 的字段,返回非删除
- if ("deleted".equals(attributeMetadata.getAttributeName())) {
- return false;
- }
- return RandomUtil.randomBoolean();
- });
- }
-
- public static String randomString() {
- return RandomUtil.randomString(RANDOM_STRING_LENGTH);
- }
-
- public static Long randomLongId() {
- return RandomUtil.randomLong(0, Long.MAX_VALUE);
- }
-
- public static Integer randomInteger() {
- return RandomUtil.randomInt(0, Integer.MAX_VALUE);
- }
-
- public static Date randomDate() {
- return RandomUtil.randomDay(0, RANDOM_DATE_MAX);
- }
-
- public static LocalDateTime randomLocalDateTime() {
- // 设置 Nano 为零的原因,避免 MySQL、H2 存储不到时间戳
- return LocalDateTimeUtil.of(randomDate()).withNano(0);
- }
-
- public static Short randomShort() {
- return (short) RandomUtil.randomInt(0, Short.MAX_VALUE);
- }
-
- public static Set randomSet(Class clazz) {
- return Stream.iterate(0, i -> i).limit(RandomUtil.randomInt(1, RANDOM_COLLECTION_LENGTH))
- .map(i -> randomPojo(clazz)).collect(Collectors.toSet());
- }
-
- public static Integer randomCommonStatus() {
- return RandomUtil.randomEle(CommonStatusEnum.values()).getStatus();
- }
-
- public static String randomEmail() {
- return randomString() + "@qq.com";
- }
-
- public static String randomMobile() {
- return "13800138" + RandomUtil.randomNumbers(3);
- }
-
- public static String randomURL() {
- return "https://www.iocoder.cn/" + randomString();
- }
-
- @SafeVarargs
- public static T randomPojo(Class clazz, Consumer... consumers) {
- T pojo = PODAM_FACTORY.manufacturePojo(clazz);
- // 非空时,回调逻辑。通过它,可以实现 Pojo 的进一步处理
- if (ArrayUtil.isNotEmpty(consumers)) {
- Arrays.stream(consumers).forEach(consumer -> consumer.accept(pojo));
- }
- return pojo;
- }
-
- @SafeVarargs
- public static T randomPojo(Class clazz, Type type, Consumer... consumers) {
- T pojo = PODAM_FACTORY.manufacturePojo(clazz, type);
- // 非空时,回调逻辑。通过它,可以实现 Pojo 的进一步处理
- if (ArrayUtil.isNotEmpty(consumers)) {
- Arrays.stream(consumers).forEach(consumer -> consumer.accept(pojo));
- }
- return pojo;
- }
-
- @SafeVarargs
- public static List randomPojoList(Class clazz, Consumer... consumers) {
- int size = RandomUtil.randomInt(1, RANDOM_COLLECTION_LENGTH);
- return randomPojoList(clazz, size, consumers);
- }
-
- @SafeVarargs
- public static List randomPojoList(Class clazz, int size, Consumer... consumers) {
- return Stream.iterate(0, i -> i).limit(size).map(o -> randomPojo(clazz, consumers))
- .collect(Collectors.toList());
- }
-
-}
diff --git a/yudao-framework/yudao-spring-boot-starter-test/src/main/java/cn/iocoder/yudao/framework/test/package-info.java b/yudao-framework/yudao-spring-boot-starter-test/src/main/java/cn/iocoder/yudao/framework/test/package-info.java
deleted file mode 100644
index 3a17f5190037e5621e4dc2e6c575952cbfc8995a..0000000000000000000000000000000000000000
--- a/yudao-framework/yudao-spring-boot-starter-test/src/main/java/cn/iocoder/yudao/framework/test/package-info.java
+++ /dev/null
@@ -1,4 +0,0 @@
-/**
- * 测试组件,用于单元测试、集成测试等等
- */
-package cn.iocoder.yudao.framework.test;
diff --git "a/yudao-framework/yudao-spring-boot-starter-test/\343\200\212\350\212\213\351\201\223 Spring Boot \345\215\225\345\205\203\346\265\213\350\257\225 Test \345\205\245\351\227\250\343\200\213.md" "b/yudao-framework/yudao-spring-boot-starter-test/\343\200\212\350\212\213\351\201\223 Spring Boot \345\215\225\345\205\203\346\265\213\350\257\225 Test \345\205\245\351\227\250\343\200\213.md"
deleted file mode 100644
index c6d0e9a9059953bb981c41feec0621069ee34ec6..0000000000000000000000000000000000000000
--- "a/yudao-framework/yudao-spring-boot-starter-test/\343\200\212\350\212\213\351\201\223 Spring Boot \345\215\225\345\205\203\346\265\213\350\257\225 Test \345\205\245\351\227\250\343\200\213.md"
+++ /dev/null
@@ -1 +0,0 @@
-
diff --git a/yudao-framework/yudao-spring-boot-starter-web/pom.xml b/yudao-framework/yudao-spring-boot-starter-web/pom.xml
index d909688741b79da53fbbb28495e1d602d12acbc6..dadd9f6ab7dbdfdde53367e95223c7ccf84c7dc3 100644
--- a/yudao-framework/yudao-spring-boot-starter-web/pom.xml
+++ b/yudao-framework/yudao-spring-boot-starter-web/pom.xml
@@ -40,11 +40,11 @@
com.github.xiaoymin
- knife4j-openapi3-jakarta-spring-boot-starter
+ knife4j-openapi3-spring-boot-starter
org.springdoc
- springdoc-openapi-starter-webmvc-ui
+ springdoc-openapi-ui
diff --git a/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/apilog/config/YudaoApiLogAutoConfiguration.java b/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/apilog/config/YudaoApiLogAutoConfiguration.java
index 156004be3e7bd9bc6aa66c7d2621022ab65b3228..a0305bbf9da84831864826054dd5d23a7da35a9f 100644
--- a/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/apilog/config/YudaoApiLogAutoConfiguration.java
+++ b/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/apilog/config/YudaoApiLogAutoConfiguration.java
@@ -6,7 +6,7 @@ import cn.iocoder.yudao.framework.common.biz.infra.logger.ApiAccessLogCommonApi;
import cn.iocoder.yudao.framework.common.enums.WebFilterOrderEnum;
import cn.iocoder.yudao.framework.web.config.WebProperties;
import cn.iocoder.yudao.framework.web.config.YudaoWebAutoConfiguration;
-import jakarta.servlet.Filter;
+import javax.servlet.Filter;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.AutoConfiguration;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
diff --git a/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/apilog/core/filter/ApiAccessLogFilter.java b/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/apilog/core/filter/ApiAccessLogFilter.java
index 1094ebdad7b157149baf923583ee06358497038d..4267048c614ded1087fdc277089b2d41cbc4f294 100644
--- a/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/apilog/core/filter/ApiAccessLogFilter.java
+++ b/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/apilog/core/filter/ApiAccessLogFilter.java
@@ -22,14 +22,14 @@ import cn.iocoder.yudao.framework.web.core.util.WebFrameworkUtils;
import com.fasterxml.jackson.databind.JsonNode;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
-import jakarta.servlet.FilterChain;
-import jakarta.servlet.ServletException;
-import jakarta.servlet.http.HttpServletRequest;
-import jakarta.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.method.HandlerMethod;
+import javax.servlet.FilterChain;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.time.LocalDateTime;
import java.time.temporal.ChronoUnit;
@@ -162,7 +162,8 @@ public class ApiAccessLogFilter extends ApiRequestFilter {
// ========== 解析 @ApiAccessLog、@Swagger 注解 ==========
private static OperateTypeEnum parseOperateLogType(HttpServletRequest request) {
- RequestMethod requestMethod = RequestMethod.resolve(request.getMethod());
+ RequestMethod requestMethod = ArrayUtil.firstMatch(method ->
+ StrUtil.equalsAnyIgnoreCase(method.name(), request.getMethod()), RequestMethod.values());
if (requestMethod == null) {
return OperateTypeEnum.OTHER;
}
@@ -237,7 +238,7 @@ public class ApiAccessLogFilter extends ApiRequestFilter {
return;
}
// 情况三:Object,遍历处理
- Iterator> iterator = node.properties().iterator();
+ Iterator> iterator = node.fields();
while (iterator.hasNext()) {
Map.Entry entry = iterator.next();
if (ArrayUtil.contains(sanitizeKeys, entry.getKey())
diff --git a/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/apilog/core/interceptor/ApiAccessLogInterceptor.java b/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/apilog/core/interceptor/ApiAccessLogInterceptor.java
index 7d6b456461efab799960f0dcffc793ade16d552f..3629fc40446ddc07c21ab90aed91ae0ea9900f52 100644
--- a/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/apilog/core/interceptor/ApiAccessLogInterceptor.java
+++ b/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/apilog/core/interceptor/ApiAccessLogInterceptor.java
@@ -6,13 +6,13 @@ import cn.hutool.core.io.resource.ResourceUtil;
import cn.hutool.core.util.StrUtil;
import cn.iocoder.yudao.framework.common.util.servlet.ServletUtils;
import cn.iocoder.yudao.framework.common.util.spring.SpringUtils;
-import jakarta.servlet.http.HttpServletRequest;
-import jakarta.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j;
import org.springframework.util.StopWatch;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
import java.lang.reflect.Method;
import java.util.List;
import java.util.Map;
diff --git a/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/desensitize/core/slider/handler/AbstractSliderDesensitizationHandler.java b/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/desensitize/core/slider/handler/AbstractSliderDesensitizationHandler.java
index 7b563291805dde565a0fa1f487e5d7988f300d2e..1e56d094b7b99d0cd0bb8a3a42ac5068ec1c203a 100644
--- a/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/desensitize/core/slider/handler/AbstractSliderDesensitizationHandler.java
+++ b/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/desensitize/core/slider/handler/AbstractSliderDesensitizationHandler.java
@@ -1,5 +1,6 @@
package cn.iocoder.yudao.framework.desensitize.core.slider.handler;
+import cn.hutool.core.util.StrUtil;
import cn.iocoder.yudao.framework.common.util.spring.SpringExpressionUtils;
import cn.iocoder.yudao.framework.desensitize.core.base.handler.DesensitizationHandler;
@@ -47,7 +48,7 @@ public abstract class AbstractSliderDesensitizationHandler
* @return 构建后的替换符
*/
private String buildReplacerByLength(String replacer, int length) {
- return replacer.repeat(length);
+ return StrUtil.repeat(replacer, length);
}
/**
diff --git a/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/encrypt/config/ApiEncryptProperties.java b/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/encrypt/config/ApiEncryptProperties.java
index 135eb85bb035f9a0dc62730b8fd162f174c98f6d..3b2a5a16c5aacdc904a49c826ee5c5e9ea0e9b86 100644
--- a/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/encrypt/config/ApiEncryptProperties.java
+++ b/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/encrypt/config/ApiEncryptProperties.java
@@ -1,11 +1,12 @@
package cn.iocoder.yudao.framework.encrypt.config;
-import jakarta.validation.constraints.NotEmpty;
-import jakarta.validation.constraints.NotNull;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.validation.annotation.Validated;
+import javax.validation.constraints.NotEmpty;
+import javax.validation.constraints.NotNull;
+
/**
* HTTP API 加解密配置
*
diff --git a/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/encrypt/core/filter/ApiDecryptRequestWrapper.java b/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/encrypt/core/filter/ApiDecryptRequestWrapper.java
index b9f015a7ec8d4021ee06cf9d4839d840fe24ff66..ea3386e605de666e40aef4adb6428033a7b02605 100644
--- a/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/encrypt/core/filter/ApiDecryptRequestWrapper.java
+++ b/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/encrypt/core/filter/ApiDecryptRequestWrapper.java
@@ -5,11 +5,11 @@ import cn.hutool.core.util.StrUtil;
import cn.hutool.crypto.asymmetric.AsymmetricDecryptor;
import cn.hutool.crypto.asymmetric.KeyType;
import cn.hutool.crypto.symmetric.SymmetricDecryptor;
-import jakarta.servlet.ReadListener;
-import jakarta.servlet.ServletInputStream;
-import jakarta.servlet.http.HttpServletRequest;
-import jakarta.servlet.http.HttpServletRequestWrapper;
+import javax.servlet.ReadListener;
+import javax.servlet.ServletInputStream;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletRequestWrapper;
import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.IOException;
diff --git a/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/encrypt/core/filter/ApiEncryptFilter.java b/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/encrypt/core/filter/ApiEncryptFilter.java
index 126a76a01ff0d50ad773823076772b1ddcbe91fb..262b1ea93d611a3760a7bde76aa16a1a0cd76a6b 100644
--- a/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/encrypt/core/filter/ApiEncryptFilter.java
+++ b/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/encrypt/core/filter/ApiEncryptFilter.java
@@ -14,10 +14,6 @@ import cn.iocoder.yudao.framework.encrypt.core.annotation.ApiEncrypt;
import cn.iocoder.yudao.framework.web.config.WebProperties;
import cn.iocoder.yudao.framework.web.core.filter.ApiRequestFilter;
import cn.iocoder.yudao.framework.web.core.handler.GlobalExceptionHandler;
-import jakarta.servlet.FilterChain;
-import jakarta.servlet.ServletException;
-import jakarta.servlet.http.HttpServletRequest;
-import jakarta.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpMethod;
import org.springframework.web.method.HandlerMethod;
@@ -25,6 +21,10 @@ import org.springframework.web.servlet.HandlerExecutionChain;
import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping;
import org.springframework.web.util.ServletRequestPathUtils;
+import javax.servlet.FilterChain;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.invalidParamException;
diff --git a/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/encrypt/core/filter/ApiEncryptResponseWrapper.java b/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/encrypt/core/filter/ApiEncryptResponseWrapper.java
index fed38917b9d060b5d4e2e4e12c6089b31b8598d0..fc49442c314f360512903ae1805253f4f9b00805 100644
--- a/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/encrypt/core/filter/ApiEncryptResponseWrapper.java
+++ b/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/encrypt/core/filter/ApiEncryptResponseWrapper.java
@@ -4,11 +4,11 @@ import cn.hutool.crypto.asymmetric.AsymmetricEncryptor;
import cn.hutool.crypto.asymmetric.KeyType;
import cn.hutool.crypto.symmetric.SymmetricEncryptor;
import cn.iocoder.yudao.framework.encrypt.config.ApiEncryptProperties;
-import jakarta.servlet.ServletOutputStream;
-import jakarta.servlet.WriteListener;
-import jakarta.servlet.http.HttpServletResponse;
-import jakarta.servlet.http.HttpServletResponseWrapper;
+import javax.servlet.ServletOutputStream;
+import javax.servlet.WriteListener;
+import javax.servlet.http.HttpServletResponse;
+import javax.servlet.http.HttpServletResponseWrapper;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
diff --git a/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/swagger/config/Knife4jOpenApiCustomizer.java b/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/swagger/config/Knife4jOpenApiCustomizer.java
index f8996f75be7730fe5c7bfcf6277f6ce6c16b8378..18faf7fe8a7c272afb9fd931702caad3c04a15cb 100644
--- a/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/swagger/config/Knife4jOpenApiCustomizer.java
+++ b/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/swagger/config/Knife4jOpenApiCustomizer.java
@@ -10,8 +10,8 @@ import io.swagger.v3.oas.annotations.tags.Tag;
import io.swagger.v3.oas.models.OpenAPI;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.ArrayUtils;
+import org.springdoc.core.SpringDocConfigProperties;
import org.springdoc.core.customizers.GlobalOpenApiCustomizer;
-import org.springdoc.core.properties.SpringDocConfigProperties;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider;
import org.springframework.context.annotation.Configuration;
diff --git a/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/swagger/config/SwaggerProperties.java b/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/swagger/config/SwaggerProperties.java
index 5374d3aca2dc224255004fdfd24f5a32529dc877..13a15688104cd01cd41cc5b526024d7647efab07 100644
--- a/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/swagger/config/SwaggerProperties.java
+++ b/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/swagger/config/SwaggerProperties.java
@@ -3,7 +3,7 @@ package cn.iocoder.yudao.framework.swagger.config;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
-import jakarta.validation.constraints.NotEmpty;
+import javax.validation.constraints.NotEmpty;
/**
* Swagger 配置属性
diff --git a/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/swagger/config/YudaoSwaggerAutoConfiguration.java b/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/swagger/config/YudaoSwaggerAutoConfiguration.java
index dec79d8eb6b7e903bcd83a5429a83cbe89b608e2..60fbebfabb9c1fecc5c51cae9eef8897db654052 100644
--- a/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/swagger/config/YudaoSwaggerAutoConfiguration.java
+++ b/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/swagger/config/YudaoSwaggerAutoConfiguration.java
@@ -10,14 +10,10 @@ import io.swagger.v3.oas.models.media.StringSchema;
import io.swagger.v3.oas.models.parameters.Parameter;
import io.swagger.v3.oas.models.security.SecurityRequirement;
import io.swagger.v3.oas.models.security.SecurityScheme;
+import org.springdoc.core.*;
import org.springdoc.core.customizers.OpenApiBuilderCustomizer;
import org.springdoc.core.customizers.ServerBaseUrlCustomizer;
-import org.springdoc.core.models.GroupedOpenApi;
-import org.springdoc.core.properties.SpringDocConfigProperties;
import org.springdoc.core.providers.JavadocProvider;
-import org.springdoc.core.service.OpenAPIService;
-import org.springdoc.core.service.SecurityService;
-import org.springdoc.core.utils.PropertyResolverUtils;
import org.springframework.boot.autoconfigure.AutoConfiguration;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
diff --git a/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/web/config/WebProperties.java b/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/web/config/WebProperties.java
index 8091e9afab7a4ee07c4b1fbd75139df692fb50b9..03f4d70b6b28d2d3e8db8f5cfa302cb84d4e2781 100644
--- a/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/web/config/WebProperties.java
+++ b/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/web/config/WebProperties.java
@@ -7,9 +7,9 @@ import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.servlet.config.annotation.PathMatchConfigurer;
-import jakarta.validation.Valid;
-import jakarta.validation.constraints.NotEmpty;
-import jakarta.validation.constraints.NotNull;
+import javax.validation.Valid;
+import javax.validation.constraints.NotEmpty;
+import javax.validation.constraints.NotNull;
@ConfigurationProperties(prefix = "yudao.web")
@Validated
diff --git a/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/web/config/YudaoWebAutoConfiguration.java b/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/web/config/YudaoWebAutoConfiguration.java
index 9126c7e8eadfb452d1fe2802bef32c7b11dd5d79..65defd131866e139d0ed0934e89e42b276f39939 100644
--- a/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/web/config/YudaoWebAutoConfiguration.java
+++ b/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/web/config/YudaoWebAutoConfiguration.java
@@ -7,8 +7,6 @@ import cn.iocoder.yudao.framework.web.core.filter.DemoFilter;
import cn.iocoder.yudao.framework.web.core.handler.GlobalExceptionHandler;
import cn.iocoder.yudao.framework.web.core.handler.GlobalResponseBodyHandler;
import cn.iocoder.yudao.framework.web.core.util.WebFrameworkUtils;
-import jakarta.annotation.Resource;
-import jakarta.servlet.Filter;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.AutoConfiguration;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
@@ -27,6 +25,9 @@ import org.springframework.web.filter.CorsFilter;
import org.springframework.web.servlet.config.annotation.PathMatchConfigurer;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
+import javax.annotation.Resource;
+import javax.servlet.Filter;
+
@AutoConfiguration
@EnableConfigurationProperties(WebProperties.class)
public class YudaoWebAutoConfiguration implements WebMvcConfigurer {
diff --git a/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/web/core/filter/ApiRequestFilter.java b/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/web/core/filter/ApiRequestFilter.java
index 7b064e8d6e75046ec83ddd36770eb54066cc6ad6..42cb6a665812aba3359b2009190eae34372ce81f 100644
--- a/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/web/core/filter/ApiRequestFilter.java
+++ b/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/web/core/filter/ApiRequestFilter.java
@@ -5,7 +5,7 @@ import cn.iocoder.yudao.framework.web.config.WebProperties;
import lombok.RequiredArgsConstructor;
import org.springframework.web.filter.OncePerRequestFilter;
-import jakarta.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletRequest;
/**
* 过滤 /admin-api、/app-api 等 API 请求的过滤器
diff --git a/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/web/core/filter/CacheRequestBodyFilter.java b/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/web/core/filter/CacheRequestBodyFilter.java
index 49958fc096530b64f0f3bc1a91412974e7ef1fff..6ddca049e0faf534a4cb607478fb5e289d837a17 100644
--- a/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/web/core/filter/CacheRequestBodyFilter.java
+++ b/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/web/core/filter/CacheRequestBodyFilter.java
@@ -4,10 +4,10 @@ import cn.hutool.core.util.StrUtil;
import cn.iocoder.yudao.framework.common.util.servlet.ServletUtils;
import org.springframework.web.filter.OncePerRequestFilter;
-import jakarta.servlet.FilterChain;
-import jakarta.servlet.ServletException;
-import jakarta.servlet.http.HttpServletRequest;
-import jakarta.servlet.http.HttpServletResponse;
+import javax.servlet.FilterChain;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
diff --git a/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/web/core/filter/CacheRequestBodyWrapper.java b/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/web/core/filter/CacheRequestBodyWrapper.java
index b5f38d96fd961187493b9871e70b73888fed6592..414aca83a4679ce83193612fbe744a9034172720 100644
--- a/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/web/core/filter/CacheRequestBodyWrapper.java
+++ b/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/web/core/filter/CacheRequestBodyWrapper.java
@@ -1,11 +1,11 @@
package cn.iocoder.yudao.framework.web.core.filter;
import cn.iocoder.yudao.framework.common.util.servlet.ServletUtils;
-import jakarta.servlet.ReadListener;
-import jakarta.servlet.ServletInputStream;
-import jakarta.servlet.http.HttpServletRequest;
-import jakarta.servlet.http.HttpServletRequestWrapper;
+import javax.servlet.ReadListener;
+import javax.servlet.ServletInputStream;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletRequestWrapper;
import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.InputStreamReader;
diff --git a/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/web/core/filter/DemoFilter.java b/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/web/core/filter/DemoFilter.java
index eece3046a056553063ba1ff268f56dfb160a4489..8e37247d26a45f31025968dae640a451f69bfd27 100644
--- a/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/web/core/filter/DemoFilter.java
+++ b/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/web/core/filter/DemoFilter.java
@@ -6,9 +6,9 @@ import cn.iocoder.yudao.framework.common.util.servlet.ServletUtils;
import cn.iocoder.yudao.framework.web.core.util.WebFrameworkUtils;
import org.springframework.web.filter.OncePerRequestFilter;
-import jakarta.servlet.FilterChain;
-import jakarta.servlet.http.HttpServletRequest;
-import jakarta.servlet.http.HttpServletResponse;
+import javax.servlet.FilterChain;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
import static cn.iocoder.yudao.framework.common.exception.enums.GlobalErrorCodeConstants.DEMO_DENY;
diff --git a/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/web/core/handler/GlobalExceptionHandler.java b/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/web/core/handler/GlobalExceptionHandler.java
index b99925e651507e780f3d5a2f61b919ab496ad9fa..156d7e04aa1bf6a414e8990d55ec67b42a2caaeb 100644
--- a/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/web/core/handler/GlobalExceptionHandler.java
+++ b/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/web/core/handler/GlobalExceptionHandler.java
@@ -17,10 +17,6 @@ import cn.iocoder.yudao.framework.common.util.servlet.ServletUtils;
import cn.iocoder.yudao.framework.web.core.util.WebFrameworkUtils;
import com.fasterxml.jackson.databind.exc.InvalidFormatException;
import com.google.common.util.concurrent.UncheckedExecutionException;
-import jakarta.servlet.http.HttpServletRequest;
-import jakarta.validation.ConstraintViolation;
-import jakarta.validation.ConstraintViolationException;
-import jakarta.validation.ValidationException;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.converter.HttpMessageNotReadableException;
@@ -38,8 +34,11 @@ import org.springframework.web.bind.annotation.RestControllerAdvice;
import org.springframework.web.method.annotation.MethodArgumentTypeMismatchException;
import org.springframework.web.multipart.MaxUploadSizeExceededException;
import org.springframework.web.servlet.NoHandlerFoundException;
-import org.springframework.web.servlet.resource.NoResourceFoundException;
+import javax.servlet.http.HttpServletRequest;
+import javax.validation.ConstraintViolation;
+import javax.validation.ConstraintViolationException;
+import javax.validation.ValidationException;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;
@@ -100,9 +99,6 @@ public class GlobalExceptionHandler {
if (ex instanceof NoHandlerFoundException) {
return noHandlerFoundExceptionHandler((NoHandlerFoundException) ex);
}
- if (ex instanceof NoResourceFoundException) {
- return noResourceFoundExceptionHandler(request, (NoResourceFoundException) ex);
- }
if (ex instanceof HttpRequestMethodNotSupportedException) {
return httpRequestMethodNotSupportedExceptionHandler((HttpRequestMethodNotSupportedException) ex);
}
@@ -236,15 +232,6 @@ public class GlobalExceptionHandler {
return CommonResult.error(NOT_FOUND.getCode(), String.format("请求地址不存在:%s", ex.getRequestURL()));
}
- /**
- * 处理 SpringMVC 请求地址不存在
- */
- @ExceptionHandler(NoResourceFoundException.class)
- private CommonResult> noResourceFoundExceptionHandler(HttpServletRequest req, NoResourceFoundException ex) {
- log.warn("[noResourceFoundExceptionHandler]", ex);
- return CommonResult.error(NOT_FOUND.getCode(), String.format("请求地址不存在:%s", ex.getResourcePath()));
- }
-
/**
* 处理 SpringMVC 请求方法不正确
*
diff --git a/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/web/core/util/WebFrameworkUtils.java b/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/web/core/util/WebFrameworkUtils.java
index 248e8a4155dd4a6810aebc16e545e81f95b7496d..ea713a5ca7844b960d86a3056b3df7a7a5dab0fb 100644
--- a/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/web/core/util/WebFrameworkUtils.java
+++ b/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/web/core/util/WebFrameworkUtils.java
@@ -5,12 +5,13 @@ import cn.iocoder.yudao.framework.common.enums.TerminalEnum;
import cn.iocoder.yudao.framework.common.enums.UserTypeEnum;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
import cn.iocoder.yudao.framework.web.config.WebProperties;
-import jakarta.servlet.ServletRequest;
-import jakarta.servlet.http.HttpServletRequest;
import org.springframework.web.context.request.RequestAttributes;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
+import javax.servlet.ServletRequest;
+import javax.servlet.http.HttpServletRequest;
+
/**
* 专属于 web 包的工具类
*
diff --git a/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/xss/core/filter/XssFilter.java b/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/xss/core/filter/XssFilter.java
index d33086a4259cfaf4fca271837b8cf93c9b0b9830..5f2ce6e3d374f7cdb47d803843802ba03f8a00cc 100644
--- a/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/xss/core/filter/XssFilter.java
+++ b/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/xss/core/filter/XssFilter.java
@@ -6,10 +6,10 @@ import lombok.AllArgsConstructor;
import org.springframework.util.PathMatcher;
import org.springframework.web.filter.OncePerRequestFilter;
-import jakarta.servlet.FilterChain;
-import jakarta.servlet.ServletException;
-import jakarta.servlet.http.HttpServletRequest;
-import jakarta.servlet.http.HttpServletResponse;
+import javax.servlet.FilterChain;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
diff --git a/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/xss/core/filter/XssRequestWrapper.java b/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/xss/core/filter/XssRequestWrapper.java
index 427eb9baac5f8379a131c1d2c6f67cd48611f613..1466a97cc1f85c3264a0c6343de63cf1c4901b7b 100644
--- a/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/xss/core/filter/XssRequestWrapper.java
+++ b/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/xss/core/filter/XssRequestWrapper.java
@@ -2,8 +2,8 @@ package cn.iocoder.yudao.framework.xss.core.filter;
import cn.iocoder.yudao.framework.xss.core.clean.XssCleaner;
-import jakarta.servlet.http.HttpServletRequest;
-import jakarta.servlet.http.HttpServletRequestWrapper;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletRequestWrapper;
import java.util.LinkedHashMap;
import java.util.Map;
diff --git a/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/xss/core/json/XssStringJsonDeserializer.java b/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/xss/core/json/XssStringJsonDeserializer.java
index 047b19d38c89981778e67ff1b75616673b1cde6a..003244378b404f2e1833d426f3e7d04a2a0368cd 100644
--- a/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/xss/core/json/XssStringJsonDeserializer.java
+++ b/yudao-framework/yudao-spring-boot-starter-web/src/main/java/cn/iocoder/yudao/framework/xss/core/json/XssStringJsonDeserializer.java
@@ -7,11 +7,11 @@ import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonToken;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.deser.std.StringDeserializer;
-import jakarta.servlet.http.HttpServletRequest;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.util.PathMatcher;
+import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
/**
diff --git a/yudao-framework/yudao-spring-boot-starter-web/src/test/java/cn/iocoder/yudao/framework/desensitize/core/DesensitizeTest.java b/yudao-framework/yudao-spring-boot-starter-web/src/test/java/cn/iocoder/yudao/framework/desensitize/core/DesensitizeTest.java
deleted file mode 100644
index dd214f0c3e4f0718e1517d204a8d56bf67e6fada..0000000000000000000000000000000000000000
--- a/yudao-framework/yudao-spring-boot-starter-web/src/test/java/cn/iocoder/yudao/framework/desensitize/core/DesensitizeTest.java
+++ /dev/null
@@ -1,94 +0,0 @@
-package cn.iocoder.yudao.framework.desensitize.core;
-
-import cn.iocoder.yudao.framework.common.util.json.JsonUtils;
-import cn.iocoder.yudao.framework.desensitize.core.annotation.Address;
-import cn.iocoder.yudao.framework.desensitize.core.regex.annotation.EmailDesensitize;
-import cn.iocoder.yudao.framework.desensitize.core.regex.annotation.RegexDesensitize;
-import cn.iocoder.yudao.framework.desensitize.core.slider.annotation.*;
-import lombok.Data;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.ExtendWith;
-import org.mockito.junit.jupiter.MockitoExtension;
-
-import static org.junit.jupiter.api.Assertions.assertEquals;
-import static org.junit.jupiter.api.Assertions.assertNotNull;
-
-/**
- * {@link DesensitizeTest} 的单元测试
- */
-@ExtendWith(MockitoExtension.class)
-public class DesensitizeTest {
-
- @Test
- public void test() {
- // 准备参数
- DesensitizeDemo desensitizeDemo = new DesensitizeDemo();
- desensitizeDemo.setNickname("芋道源码");
- desensitizeDemo.setBankCard("9988002866797031");
- desensitizeDemo.setCarLicense("粤A66666");
- desensitizeDemo.setFixedPhone("01086551122");
- desensitizeDemo.setIdCard("530321199204074611");
- desensitizeDemo.setPassword("123456");
- desensitizeDemo.setPhoneNumber("13248765917");
- desensitizeDemo.setSlider1("ABCDEFG");
- desensitizeDemo.setSlider2("ABCDEFG");
- desensitizeDemo.setSlider3("ABCDEFG");
- desensitizeDemo.setEmail("1@email.com");
- desensitizeDemo.setRegex("你好,我是芋道源码");
- desensitizeDemo.setAddress("北京市海淀区上地十街10号");
- desensitizeDemo.setOrigin("芋道源码");
-
- // 调用
- DesensitizeDemo d = JsonUtils.parseObject(JsonUtils.toJsonString(desensitizeDemo), DesensitizeDemo.class);
- // 断言
- assertNotNull(d);
- assertEquals("芋***", d.getNickname());
- assertEquals("998800********31", d.getBankCard());
- assertEquals("粤A6***6", d.getCarLicense());
- assertEquals("0108*****22", d.getFixedPhone());
- assertEquals("530321**********11", d.getIdCard());
- assertEquals("******", d.getPassword());
- assertEquals("132****5917", d.getPhoneNumber());
- assertEquals("#######", d.getSlider1());
- assertEquals("ABC*EFG", d.getSlider2());
- assertEquals("*******", d.getSlider3());
- assertEquals("1****@email.com", d.getEmail());
- assertEquals("你好,我是*", d.getRegex());
- assertEquals("北京市海淀区上地十街10号*", d.getAddress());
- assertEquals("芋道源码", d.getOrigin());
- }
-
- @Data
- public static class DesensitizeDemo {
-
- @ChineseNameDesensitize
- private String nickname;
- @BankCardDesensitize
- private String bankCard;
- @CarLicenseDesensitize
- private String carLicense;
- @FixedPhoneDesensitize
- private String fixedPhone;
- @IdCardDesensitize
- private String idCard;
- @PasswordDesensitize
- private String password;
- @MobileDesensitize
- private String phoneNumber;
- @SliderDesensitize(prefixKeep = 6, suffixKeep = 1, replacer = "#")
- private String slider1;
- @SliderDesensitize(prefixKeep = 3, suffixKeep = 3)
- private String slider2;
- @SliderDesensitize(prefixKeep = 10)
- private String slider3;
- @EmailDesensitize
- private String email;
- @RegexDesensitize(regex = "芋道源码", replacer = "*")
- private String regex;
- @Address
- private String address;
- private String origin;
-
- }
-
-}
diff --git a/yudao-framework/yudao-spring-boot-starter-web/src/test/java/cn/iocoder/yudao/framework/desensitize/core/annotation/Address.java b/yudao-framework/yudao-spring-boot-starter-web/src/test/java/cn/iocoder/yudao/framework/desensitize/core/annotation/Address.java
deleted file mode 100644
index 13012098175e9f7c580102107c97809cf14f3b11..0000000000000000000000000000000000000000
--- a/yudao-framework/yudao-spring-boot-starter-web/src/test/java/cn/iocoder/yudao/framework/desensitize/core/annotation/Address.java
+++ /dev/null
@@ -1,30 +0,0 @@
-package cn.iocoder.yudao.framework.desensitize.core.annotation;
-
-import cn.iocoder.yudao.framework.desensitize.core.DesensitizeTest;
-import cn.iocoder.yudao.framework.desensitize.core.handler.AddressHandler;
-import cn.iocoder.yudao.framework.desensitize.core.base.annotation.DesensitizeBy;
-import com.fasterxml.jackson.annotation.JacksonAnnotationsInside;
-
-import java.lang.annotation.Documented;
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-/**
- * 地址
- *
- * 用于 {@link DesensitizeTest} 测试使用
- *
- * @author gaibu
- */
-@Documented
-@Target({ElementType.FIELD})
-@Retention(RetentionPolicy.RUNTIME)
-@JacksonAnnotationsInside
-@DesensitizeBy(handler = AddressHandler.class)
-public @interface Address {
-
- String replacer() default "*";
-
-}
diff --git a/yudao-framework/yudao-spring-boot-starter-web/src/test/java/cn/iocoder/yudao/framework/desensitize/core/handler/AddressHandler.java b/yudao-framework/yudao-spring-boot-starter-web/src/test/java/cn/iocoder/yudao/framework/desensitize/core/handler/AddressHandler.java
deleted file mode 100644
index 7a8455f8d1258384fa719083e8ba28739182f69c..0000000000000000000000000000000000000000
--- a/yudao-framework/yudao-spring-boot-starter-web/src/test/java/cn/iocoder/yudao/framework/desensitize/core/handler/AddressHandler.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package cn.iocoder.yudao.framework.desensitize.core.handler;
-
-import cn.iocoder.yudao.framework.desensitize.core.DesensitizeTest;
-import cn.iocoder.yudao.framework.desensitize.core.base.handler.DesensitizationHandler;
-import cn.iocoder.yudao.framework.desensitize.core.annotation.Address;
-
-/**
- * {@link Address} 的脱敏处理器
- *
- * 用于 {@link DesensitizeTest} 测试使用
- */
-public class AddressHandler implements DesensitizationHandler {
-
- @Override
- public String desensitize(String origin, Address annotation) {
- return origin + annotation.replacer();
- }
-
-}
diff --git a/yudao-framework/yudao-spring-boot-starter-websocket/src/main/java/cn/iocoder/yudao/framework/websocket/config/WebSocketProperties.java b/yudao-framework/yudao-spring-boot-starter-websocket/src/main/java/cn/iocoder/yudao/framework/websocket/config/WebSocketProperties.java
index f1d84f7a0dcfda4eb106d6734c201c39a2bd6ffd..aa618fb04e100682de1ccde8947a9c8acda8487b 100644
--- a/yudao-framework/yudao-spring-boot-starter-websocket/src/main/java/cn/iocoder/yudao/framework/websocket/config/WebSocketProperties.java
+++ b/yudao-framework/yudao-spring-boot-starter-websocket/src/main/java/cn/iocoder/yudao/framework/websocket/config/WebSocketProperties.java
@@ -4,8 +4,8 @@ import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.validation.annotation.Validated;
-import jakarta.validation.constraints.NotEmpty;
-import jakarta.validation.constraints.NotNull;
+import javax.validation.constraints.NotEmpty;
+import javax.validation.constraints.NotNull;
/**
* WebSocket 配置项
diff --git a/yudao-framework/yudao-spring-boot-starter-websocket/src/main/java/cn/iocoder/yudao/framework/websocket/core/security/WebSocketAuthorizeRequestsCustomizer.java b/yudao-framework/yudao-spring-boot-starter-websocket/src/main/java/cn/iocoder/yudao/framework/websocket/core/security/WebSocketAuthorizeRequestsCustomizer.java
index f260dfc201a8c408be54f168b4524299b45ceb20..dd0a0ecf120c17e25e45c54be748017cd8769125 100644
--- a/yudao-framework/yudao-spring-boot-starter-websocket/src/main/java/cn/iocoder/yudao/framework/websocket/core/security/WebSocketAuthorizeRequestsCustomizer.java
+++ b/yudao-framework/yudao-spring-boot-starter-websocket/src/main/java/cn/iocoder/yudao/framework/websocket/core/security/WebSocketAuthorizeRequestsCustomizer.java
@@ -5,6 +5,7 @@ import cn.iocoder.yudao.framework.websocket.config.WebSocketProperties;
import lombok.RequiredArgsConstructor;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configurers.AuthorizeHttpRequestsConfigurer;
+import org.springframework.security.config.annotation.web.configurers.ExpressionUrlAuthorizationConfigurer;
/**
* WebSocket 的权限自定义
diff --git a/yudao-module-ai/pom.xml b/yudao-module-ai/pom.xml
deleted file mode 100644
index 06c9cc0ca9aa38d846f2595c1836a5827e09444b..0000000000000000000000000000000000000000
--- a/yudao-module-ai/pom.xml
+++ /dev/null
@@ -1,245 +0,0 @@
-
-
-
- cn.iocoder.boot
- yudao
- ${revision}
-
- 4.0.0
- jar
- yudao-module-ai
-
- ${project.artifactId}
-
- ai 模块下,接入 LLM 大模型,支持聊天、绘图、音乐、写作、思维导图等功能。
- 目前已接入各种模型,不限于:
- 国内:通义千问、文心一言、讯飞星火、智谱 GLM、DeepSeek
- 国外:OpenAI、Ollama、Midjourney、StableDiffusion、Suno
-
-
- 1.0.1
- 1.0.0.3
- 1.0.2
-
-
-
-
- cn.iocoder.boot
- yudao-module-system
- ${revision}
-
-
- cn.iocoder.boot
- yudao-module-infra
- ${revision}
-
-
-
-
-
- cn.iocoder.boot
- yudao-spring-boot-starter-biz-tenant
-
-
-
-
- cn.iocoder.boot
- yudao-spring-boot-starter-security
-
-
-
-
- cn.iocoder.boot
- yudao-spring-boot-starter-mybatis
-
-
-
-
- cn.iocoder.boot
- yudao-spring-boot-starter-job
-
-
-
-
- cn.iocoder.boot
- yudao-spring-boot-starter-test
-
-
-
-
- cn.iocoder.boot
- yudao-spring-boot-starter-excel
-
-
-
-
- org.springframework.ai
- spring-ai-starter-model-openai
- ${spring-ai.version}
-
-
- org.springframework.ai
- spring-ai-starter-model-azure-openai
- ${spring-ai.version}
-
-
- org.springframework.ai
- spring-ai-starter-model-anthropic
- ${spring-ai.version}
-
-
- org.springframework.ai
- spring-ai-starter-model-deepseek
- ${spring-ai.version}
-
-
- org.springframework.ai
- spring-ai-starter-model-ollama
- ${spring-ai.version}
-
-
- org.springframework.ai
- spring-ai-starter-model-stability-ai
- ${spring-ai.version}
-
-
-
- org.springframework.ai
- spring-ai-starter-model-zhipuai
- ${spring-ai.version}
-
-
- org.springframework.ai
- spring-ai-starter-model-minimax
- ${spring-ai.version}
-
-
-
-
- com.alibaba.cloud.ai
- spring-ai-alibaba-starter-dashscope
- ${alibaba-ai.version}
-
-
-
-
- org.springaicommunity
- qianfan-spring-boot-starter
- 1.0.0
-
-
-
- org.springaicommunity
- moonshot-spring-boot-starter
- 1.0.0
-
-
-
-
-
- org.springframework.ai
- spring-ai-starter-vector-store-qdrant
- ${spring-ai.version}
-
-
-
-
- org.springframework.ai
- spring-ai-starter-vector-store-redis
- ${spring-ai.version}
-
-
- cn.iocoder.boot
- yudao-spring-boot-starter-redis
-
-
-
-
- org.springframework.ai
- spring-ai-starter-vector-store-milvus
- ${spring-ai.version}
-
-
-
- org.slf4j
- slf4j-reload4j
-
-
-
-
-
-
- org.springframework.ai
- spring-ai-tika-document-reader
- ${spring-ai.version}
-
-
-
- spring-cloud-function-context
- org.springframework.cloud
-
-
- spring-cloud-function-core
- org.springframework.cloud
-
-
-
-
-
-
-
-
- org.springframework.ai
- spring-ai-starter-mcp-server-webmvc
- ${spring-ai.version}
-
-
-
- org.springframework.ai
- spring-ai-starter-mcp-client
- ${spring-ai.version}
-
-
-
-
- dev.tinyflow
- tinyflow-java-core
- ${tinyflow.version}
-
-
- com.jfinal
- enjoy
-
-
-
- com.agentsflex
- agents-flex-store-elasticsearch
-
-
-
- org.codehaus.groovy
- groovy-all
-
-
-
- org.slf4j
- slf4j-simple
-
-
- org.apache.logging.log4j
- log4j-slf4j-impl
-
-
- org.slf4j
- slf4j-reload4j
-
-
-
-
-
-
\ No newline at end of file
diff --git a/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/chat/AiChatConversationController.java b/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/chat/AiChatConversationController.java
deleted file mode 100644
index ddd426d2833dba56522efe7adff4917f7fdb7269..0000000000000000000000000000000000000000
--- a/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/chat/AiChatConversationController.java
+++ /dev/null
@@ -1,118 +0,0 @@
-package cn.iocoder.yudao.module.ai.controller.admin.chat;
-
-import cn.hutool.core.collection.CollUtil;
-import cn.hutool.core.util.ObjUtil;
-import cn.iocoder.yudao.framework.common.pojo.CommonResult;
-import cn.iocoder.yudao.framework.common.pojo.PageResult;
-import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
-import cn.iocoder.yudao.module.ai.controller.admin.chat.vo.conversation.AiChatConversationCreateMyReqVO;
-import cn.iocoder.yudao.module.ai.controller.admin.chat.vo.conversation.AiChatConversationPageReqVO;
-import cn.iocoder.yudao.module.ai.controller.admin.chat.vo.conversation.AiChatConversationRespVO;
-import cn.iocoder.yudao.module.ai.controller.admin.chat.vo.conversation.AiChatConversationUpdateMyReqVO;
-import cn.iocoder.yudao.module.ai.dal.dataobject.chat.AiChatConversationDO;
-import cn.iocoder.yudao.module.ai.service.chat.AiChatConversationService;
-import cn.iocoder.yudao.module.ai.service.chat.AiChatMessageService;
-import com.fhs.core.trans.anno.TransMethodResult;
-import io.swagger.v3.oas.annotations.Operation;
-import io.swagger.v3.oas.annotations.Parameter;
-import io.swagger.v3.oas.annotations.tags.Tag;
-import jakarta.annotation.Resource;
-import jakarta.validation.Valid;
-import org.springframework.security.access.prepost.PreAuthorize;
-import org.springframework.validation.annotation.Validated;
-import org.springframework.web.bind.annotation.*;
-
-import java.util.List;
-import java.util.Map;
-
-import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
-import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList;
-import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId;
-
-@Tag(name = "管理后台 - AI 聊天对话")
-@RestController
-@RequestMapping("/ai/chat/conversation")
-@Validated
-public class AiChatConversationController {
-
- @Resource
- private AiChatConversationService chatConversationService;
- @Resource
- private AiChatMessageService chatMessageService;
-
- @PostMapping("/create-my")
- @Operation(summary = "创建【我的】聊天对话")
- public CommonResult createChatConversationMy(@RequestBody @Valid AiChatConversationCreateMyReqVO createReqVO) {
- return success(chatConversationService.createChatConversationMy(createReqVO, getLoginUserId()));
- }
-
- @PutMapping("/update-my")
- @Operation(summary = "更新【我的】聊天对话")
- public CommonResult updateChatConversationMy(@RequestBody @Valid AiChatConversationUpdateMyReqVO updateReqVO) {
- chatConversationService.updateChatConversationMy(updateReqVO, getLoginUserId());
- return success(true);
- }
-
- @GetMapping("/my-list")
- @Operation(summary = "获得【我的】聊天对话列表")
- @TransMethodResult
- public CommonResult> getChatConversationMyList() {
- List list = chatConversationService.getChatConversationListByUserId(getLoginUserId());
- return success(BeanUtils.toBean(list, AiChatConversationRespVO.class));
- }
-
- @GetMapping("/get-my")
- @Operation(summary = "获得【我的】聊天对话")
- @Parameter(name = "id", required = true, description = "对话编号", example = "1024")
- @TransMethodResult
- public CommonResult getChatConversationMy(@RequestParam("id") Long id) {
- AiChatConversationDO conversation = chatConversationService.getChatConversation(id);
- if (conversation != null && ObjUtil.notEqual(conversation.getUserId(), getLoginUserId())) {
- conversation = null;
- }
- return success(BeanUtils.toBean(conversation, AiChatConversationRespVO.class));
- }
-
- @DeleteMapping("/delete-my")
- @Operation(summary = "删除聊天对话")
- @Parameter(name = "id", required = true, description = "对话编号", example = "1024")
- public CommonResult deleteChatConversationMy(@RequestParam("id") Long id) {
- chatConversationService.deleteChatConversationMy(id, getLoginUserId());
- return success(true);
- }
-
- @DeleteMapping("/delete-by-unpinned")
- @Operation(summary = "删除未置顶的聊天对话")
- public CommonResult deleteChatConversationMyByUnpinned() {
- chatConversationService.deleteChatConversationMyByUnpinned(getLoginUserId());
- return success(true);
- }
-
- // ========== 对话管理 ==========
-
- @GetMapping("/page")
- @Operation(summary = "获得对话分页", description = "用于【对话管理】菜单")
- @PreAuthorize("@ss.hasPermission('ai:chat-conversation:query')")
- @TransMethodResult
- public CommonResult> getChatConversationPage(AiChatConversationPageReqVO pageReqVO) {
- PageResult pageResult = chatConversationService.getChatConversationPage(pageReqVO);
- if (CollUtil.isEmpty(pageResult.getList())) {
- return success(PageResult.empty());
- }
- // 拼接关联数据
- Map messageCountMap = chatMessageService.getChatMessageCountMap(
- convertList(pageResult.getList(), AiChatConversationDO::getId));
- return success(BeanUtils.toBean(pageResult, AiChatConversationRespVO.class,
- conversation -> conversation.setMessageCount(messageCountMap.getOrDefault(conversation.getId(), 0))));
- }
-
- @Operation(summary = "管理员删除对话")
- @DeleteMapping("/delete-by-admin")
- @Parameter(name = "id", required = true, description = "对话编号", example = "1024")
- @PreAuthorize("@ss.hasPermission('ai:chat-conversation:delete')")
- public CommonResult deleteChatConversationByAdmin(@RequestParam("id") Long id) {
- chatConversationService.deleteChatConversationByAdmin(id);
- return success(true);
- }
-
-}
diff --git a/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/chat/AiChatMessageController.http b/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/chat/AiChatMessageController.http
deleted file mode 100644
index 017714e097a15986e193e3235d941da25f4202d2..0000000000000000000000000000000000000000
--- a/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/chat/AiChatMessageController.http
+++ /dev/null
@@ -1,66 +0,0 @@
-### 发送消息(段式)
-POST {{baseUrl}}/ai/chat/message/send
-Content-Type: application/json
-Authorization: {{token}}
-tenant-id: {{adminTenantId}}
-
-{
- "conversationId": "1781604279872581724",
- "content": "你是 OpenAI 么?"
-}
-
-### 发送消息(流式)
-POST {{baseUrl}}/ai/chat/message/send-stream
-Content-Type: application/json
-Authorization: {{token}}
-tenant-id: {{adminTenantId}}
-
-{
- "conversationId": "1781604279872581724",
- "content": "1+1=?"
-}
-
-### 发送消息(流式)【带文件】
-POST {{baseUrl}}/ai/chat/message/send-stream
-Content-Type: application/json
-Authorization: {{token}}
-tenant-id: {{adminTenantId}}
-
-{
- "conversationId": "1781604279872581797",
- "content": "图片里有什么?",
- "attachmentUrls": ["http://test.yudao.iocoder.cn/1755531278.jpeg"]
-}
-
-### 发送消息(流式)【追问带文件】
-POST {{baseUrl}}/ai/chat/message/send-stream
-Content-Type: application/json
-Authorization: {{token}}
-tenant-id: {{adminTenantId}}
-
-{
- "conversationId": "1781604279872581799",
- "content": "说下图片里,有哪些字?",
- "useContext": true
-}
-
-### 发送消息(流式)【联网搜索】
-POST {{baseUrl}}/ai/chat/message/send-stream
-Content-Type: application/json
-Authorization: {{token}}
-tenant-id: {{adminTenantId}}
-
-{
- "conversationId": "1781604279872581799",
- "content": "今天是周几?",
- "useSearch": true
-}
-
-### 获得指定对话的消息列表
-GET {{baseUrl}}/ai/chat/message/list-by-conversation-id?conversationId=1781604279872581799
-Authorization: {{token}}
-tenant-id: {{adminTenantId}}
-
-### 删除消息
-DELETE {{baseUrl}}/ai/chat/message/delete?id=50
-Authorization: {{token}}
\ No newline at end of file
diff --git a/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/chat/AiChatMessageController.java b/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/chat/AiChatMessageController.java
deleted file mode 100644
index bfd1e41caf32ddd837dc04cce410607ae49cd285..0000000000000000000000000000000000000000
--- a/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/chat/AiChatMessageController.java
+++ /dev/null
@@ -1,157 +0,0 @@
-package cn.iocoder.yudao.module.ai.controller.admin.chat;
-
-import cn.hutool.core.collection.CollUtil;
-import cn.hutool.core.util.ObjUtil;
-import cn.iocoder.yudao.framework.common.pojo.CommonResult;
-import cn.iocoder.yudao.framework.common.pojo.PageResult;
-import cn.iocoder.yudao.framework.common.util.collection.MapUtils;
-import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
-import cn.iocoder.yudao.module.ai.controller.admin.chat.vo.message.AiChatMessagePageReqVO;
-import cn.iocoder.yudao.module.ai.controller.admin.chat.vo.message.AiChatMessageRespVO;
-import cn.iocoder.yudao.module.ai.controller.admin.chat.vo.message.AiChatMessageSendReqVO;
-import cn.iocoder.yudao.module.ai.controller.admin.chat.vo.message.AiChatMessageSendRespVO;
-import cn.iocoder.yudao.module.ai.dal.dataobject.chat.AiChatConversationDO;
-import cn.iocoder.yudao.module.ai.dal.dataobject.chat.AiChatMessageDO;
-import cn.iocoder.yudao.module.ai.dal.dataobject.knowledge.AiKnowledgeDocumentDO;
-import cn.iocoder.yudao.module.ai.dal.dataobject.knowledge.AiKnowledgeSegmentDO;
-import cn.iocoder.yudao.module.ai.dal.dataobject.model.AiChatRoleDO;
-import cn.iocoder.yudao.module.ai.service.chat.AiChatConversationService;
-import cn.iocoder.yudao.module.ai.service.chat.AiChatMessageService;
-import cn.iocoder.yudao.module.ai.service.knowledge.AiKnowledgeDocumentService;
-import cn.iocoder.yudao.module.ai.service.knowledge.AiKnowledgeSegmentService;
-import cn.iocoder.yudao.module.ai.service.model.AiChatRoleService;
-import io.swagger.v3.oas.annotations.Operation;
-import io.swagger.v3.oas.annotations.Parameter;
-import io.swagger.v3.oas.annotations.tags.Tag;
-import jakarta.annotation.Resource;
-import jakarta.validation.Valid;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.http.MediaType;
-import org.springframework.security.access.prepost.PreAuthorize;
-import org.springframework.web.bind.annotation.*;
-import reactor.core.publisher.Flux;
-
-import java.util.Collections;
-import java.util.List;
-import java.util.Map;
-
-import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
-import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.*;
-import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId;
-
-@Tag(name = "管理后台 - 聊天消息")
-@RestController
-@RequestMapping("/ai/chat/message")
-@Slf4j
-public class AiChatMessageController {
-
- @Resource
- private AiChatMessageService chatMessageService;
- @Resource
- private AiChatConversationService chatConversationService;
- @Resource
- private AiChatRoleService chatRoleService;
- @Resource
- private AiKnowledgeSegmentService knowledgeSegmentService;
- @Resource
- private AiKnowledgeDocumentService knowledgeDocumentService;
-
- @Operation(summary = "发送消息(段式)", description = "一次性返回,响应较慢")
- @PostMapping("/send")
- public CommonResult sendMessage(@Valid @RequestBody AiChatMessageSendReqVO sendReqVO) {
- return success(chatMessageService.sendMessage(sendReqVO, getLoginUserId()));
- }
-
- @Operation(summary = "发送消息(流式)", description = "流式返回,响应较快")
- @PostMapping(value = "/send-stream", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
- public Flux> sendChatMessageStream(@Valid @RequestBody AiChatMessageSendReqVO sendReqVO) {
- return chatMessageService.sendChatMessageStream(sendReqVO, getLoginUserId());
- }
-
- @Operation(summary = "获得指定对话的消息列表")
- @GetMapping("/list-by-conversation-id")
- @Parameter(name = "conversationId", required = true, description = "对话编号", example = "1024")
- public CommonResult> getChatMessageListByConversationId(
- @RequestParam("conversationId") Long conversationId) {
- AiChatConversationDO conversation = chatConversationService.getChatConversation(conversationId);
- if (conversation == null || ObjUtil.notEqual(conversation.getUserId(), getLoginUserId())) {
- return success(Collections.emptyList());
- }
- // 1. 获取消息列表
- List messageList = chatMessageService.getChatMessageListByConversationId(conversationId);
- if (CollUtil.isEmpty(messageList)) {
- return success(Collections.emptyList());
- }
-
- // 2. 拼接数据,主要是知识库段落信息
- Map segmentMap = knowledgeSegmentService.getKnowledgeSegmentMap(convertListByFlatMap(messageList,
- message -> CollUtil.isEmpty(message.getSegmentIds()) ? null : message.getSegmentIds().stream()));
- Map documentMap = knowledgeDocumentService.getKnowledgeDocumentMap(
- convertList(segmentMap.values(), AiKnowledgeSegmentDO::getDocumentId));
- List messageVOList = BeanUtils.toBean(messageList, AiChatMessageRespVO.class);
- for (int i = 0; i < messageList.size(); i++) {
- AiChatMessageDO message = messageList.get(i);
- if (CollUtil.isEmpty(message.getSegmentIds())) {
- continue;
- }
- // 设置知识库段落信息
- messageVOList.get(i).setSegments(convertList(message.getSegmentIds(), segmentId -> {
- AiKnowledgeSegmentDO segment = segmentMap.get(segmentId);
- if (segment == null) {
- return null;
- }
- AiKnowledgeDocumentDO document = documentMap.get(segment.getDocumentId());
- if (document == null) {
- return null;
- }
- return new AiChatMessageRespVO.KnowledgeSegment().setId(segment.getId()).setContent(segment.getContent())
- .setDocumentId(segment.getDocumentId()).setDocumentName(document.getName());
- }));
- }
- return success(messageVOList);
- }
-
- @Operation(summary = "删除消息")
- @DeleteMapping("/delete")
- @Parameter(name = "id", required = true, description = "消息编号", example = "1024")
- public CommonResult deleteChatMessage(@RequestParam("id") Long id) {
- chatMessageService.deleteChatMessage(id, getLoginUserId());
- return success(true);
- }
-
- @Operation(summary = "删除指定对话的消息")
- @DeleteMapping("/delete-by-conversation-id")
- @Parameter(name = "conversationId", required = true, description = "对话编号", example = "1024")
- public CommonResult deleteChatMessageByConversationId(@RequestParam("conversationId") Long conversationId) {
- chatMessageService.deleteChatMessageByConversationId(conversationId, getLoginUserId());
- return success(true);
- }
-
- // ========== 对话管理 ==========
-
- @GetMapping("/page")
- @Operation(summary = "获得消息分页", description = "用于【对话管理】菜单")
- @PreAuthorize("@ss.hasPermission('ai:chat-conversation:query')")
- public CommonResult> getChatMessagePage(AiChatMessagePageReqVO pageReqVO) {
- PageResult pageResult = chatMessageService.getChatMessagePage(pageReqVO);
- if (CollUtil.isEmpty(pageResult.getList())) {
- return success(PageResult.empty());
- }
- // 拼接数据
- Map roleMap = chatRoleService.getChatRoleMap(
- convertSet(pageResult.getList(), AiChatMessageDO::getRoleId));
- return success(BeanUtils.toBean(pageResult, AiChatMessageRespVO.class,
- respVO -> MapUtils.findAndThen(roleMap, respVO.getRoleId(),
- role -> respVO.setRoleName(role.getName()))));
- }
-
- @Operation(summary = "管理员删除消息")
- @DeleteMapping("/delete-by-admin")
- @Parameter(name = "id", required = true, description = "消息编号", example = "1024")
- @PreAuthorize("@ss.hasPermission('ai:chat-message:delete')")
- public CommonResult deleteChatMessageByAdmin(@RequestParam("id") Long id) {
- chatMessageService.deleteChatMessageByAdmin(id);
- return success(true);
- }
-
-}
diff --git a/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/chat/vo/conversation/AiChatConversationCreateMyReqVO.java b/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/chat/vo/conversation/AiChatConversationCreateMyReqVO.java
deleted file mode 100644
index 84595bea23ae797e785f67c0bf4db92375f20efb..0000000000000000000000000000000000000000
--- a/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/chat/vo/conversation/AiChatConversationCreateMyReqVO.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package cn.iocoder.yudao.module.ai.controller.admin.chat.vo.conversation;
-
-import io.swagger.v3.oas.annotations.media.Schema;
-import lombok.Data;
-
-@Schema(description = "管理后台 - AI 聊天对话创建【我的】 Request VO")
-@Data
-public class AiChatConversationCreateMyReqVO {
-
- @Schema(description = "聊天角色编号", example = "666")
- private Long roleId;
-
- @Schema(description = "知识库编号", example = "1204")
- private Long knowledgeId;
-
-}
diff --git a/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/chat/vo/conversation/AiChatConversationPageReqVO.java b/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/chat/vo/conversation/AiChatConversationPageReqVO.java
deleted file mode 100644
index 967e866ea72540db307b9c9266a5a1ce84e3f60e..0000000000000000000000000000000000000000
--- a/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/chat/vo/conversation/AiChatConversationPageReqVO.java
+++ /dev/null
@@ -1,26 +0,0 @@
-package cn.iocoder.yudao.module.ai.controller.admin.chat.vo.conversation;
-
-import cn.iocoder.yudao.framework.common.pojo.PageParam;
-import io.swagger.v3.oas.annotations.media.Schema;
-import lombok.Data;
-import org.springframework.format.annotation.DateTimeFormat;
-
-import java.time.LocalDateTime;
-
-import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
-
-@Schema(description = "管理后台 - AI 聊天对话的分页 Request VO")
-@Data
-public class AiChatConversationPageReqVO extends PageParam {
-
- @Schema(description = "用户编号", example = "1024")
- private Long userId;
-
- @Schema(description = "对话标题", example = "你好")
- private String title;
-
- @Schema(description = "创建时间")
- @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
- private LocalDateTime[] createTime;
-
-}
diff --git a/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/chat/vo/conversation/AiChatConversationRespVO.java b/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/chat/vo/conversation/AiChatConversationRespVO.java
deleted file mode 100644
index 7da37ebc9be913295aa7fc47c469e06c8b344450..0000000000000000000000000000000000000000
--- a/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/chat/vo/conversation/AiChatConversationRespVO.java
+++ /dev/null
@@ -1,71 +0,0 @@
-package cn.iocoder.yudao.module.ai.controller.admin.chat.vo.conversation;
-
-import cn.iocoder.yudao.module.ai.dal.dataobject.model.AiModelDO;
-import cn.iocoder.yudao.module.ai.dal.dataobject.model.AiChatRoleDO;
-import com.fhs.core.trans.anno.Trans;
-import com.fhs.core.trans.constant.TransType;
-import com.fhs.core.trans.vo.VO;
-import io.swagger.v3.oas.annotations.media.Schema;
-import lombok.Data;
-
-import java.time.LocalDateTime;
-
-@Schema(description = "管理后台 - AI 聊天对话 Response VO")
-@Data
-public class AiChatConversationRespVO implements VO {
-
- @Schema(description = "对话编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
- private Long id;
-
- @Schema(description = "用户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "2048")
- private Long userId;
-
- @Schema(description = "对话标题", requiredMode = Schema.RequiredMode.REQUIRED, example = "我是一个标题")
- private String title;
-
- @Schema(description = "是否置顶", requiredMode = Schema.RequiredMode.REQUIRED, example = "true")
- private Boolean pinned;
-
- @Schema(description = "角色编号", example = "1")
- @Trans(type = TransType.SIMPLE, target = AiChatRoleDO.class, fields = {"name", "avatar"}, refs = {"roleName", "roleAvatar"})
- private Long roleId;
-
- @Schema(description = "模型编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
- @Trans(type = TransType.SIMPLE, target = AiModelDO.class, fields = "name", ref = "modelName")
- private Long modelId;
-
- @Schema(description = "模型标志", requiredMode = Schema.RequiredMode.REQUIRED, example = "ERNIE-Bot-turbo-0922")
- private String model;
-
- @Schema(description = "模型名字", requiredMode = Schema.RequiredMode.REQUIRED, example = "张三")
- private String modelName;
-
- @Schema(description = "角色设定", example = "一个快乐的程序员")
- private String systemMessage;
-
- @Schema(description = "温度参数", requiredMode = Schema.RequiredMode.REQUIRED, example = "0.8")
- private Double temperature;
-
- @Schema(description = "单条回复的最大 Token 数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "4096")
- private Integer maxTokens;
-
- @Schema(description = "上下文的最大 Message 数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "10")
- private Integer maxContexts;
-
- @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
- private LocalDateTime createTime;
-
- // ========== 关联 role 信息 ==========
-
- @Schema(description = "角色头像", example = "https://www.iocoder.cn/1.png")
- private String roleAvatar;
-
- @Schema(description = "角色名字", example = "小黄")
- private String roleName;
-
- // ========== 仅在【对话管理】时加载 ==========
-
- @Schema(description = "消息数量", example = "20")
- private Integer messageCount;
-
-}
diff --git a/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/chat/vo/conversation/AiChatConversationUpdateMyReqVO.java b/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/chat/vo/conversation/AiChatConversationUpdateMyReqVO.java
deleted file mode 100644
index 2b57572c4e038424b50c4786d0486c41f4f138d1..0000000000000000000000000000000000000000
--- a/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/chat/vo/conversation/AiChatConversationUpdateMyReqVO.java
+++ /dev/null
@@ -1,39 +0,0 @@
-package cn.iocoder.yudao.module.ai.controller.admin.chat.vo.conversation;
-
-import io.swagger.v3.oas.annotations.media.Schema;
-import jakarta.validation.constraints.NotNull;
-import lombok.Data;
-
-@Schema(description = "管理后台 - AI 聊天对话更新【我的】 Request VO")
-@Data
-public class AiChatConversationUpdateMyReqVO {
-
- @Schema(description = "对话编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
- @NotNull(message = "对话编号不能为空")
- private Long id;
-
- @Schema(description = "对话标题", example = "我是一个标题")
- private String title;
-
- @Schema(description = "是否置顶", example = "true")
- private Boolean pinned;
-
- @Schema(description = "模型编号", example = "1")
- private Long modelId;
-
- @Schema(description = "知识库编号", example = "1")
- private Long knowledgeId;
-
- @Schema(description = "角色设定", example = "一个快乐的程序员")
- private String systemMessage;
-
- @Schema(description = "温度参数", example = "0.8")
- private Double temperature;
-
- @Schema(description = "单条回复的最大 Token 数量", example = "4096")
- private Integer maxTokens;
-
- @Schema(description = "上下文的最大 Message 数量", example = "10")
- private Integer maxContexts;
-
-}
diff --git a/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/chat/vo/message/AiChatMessagePageReqVO.java b/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/chat/vo/message/AiChatMessagePageReqVO.java
deleted file mode 100644
index 7ccb6aa0b62423880d364d361202ca9022b5c292..0000000000000000000000000000000000000000
--- a/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/chat/vo/message/AiChatMessagePageReqVO.java
+++ /dev/null
@@ -1,29 +0,0 @@
-package cn.iocoder.yudao.module.ai.controller.admin.chat.vo.message;
-
-import cn.iocoder.yudao.framework.common.pojo.PageParam;
-import io.swagger.v3.oas.annotations.media.Schema;
-import lombok.Data;
-import org.springframework.format.annotation.DateTimeFormat;
-
-import java.time.LocalDateTime;
-
-import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
-
-@Schema(description = "管理后台 - AI 聊天消息的分页 Request VO")
-@Data
-public class AiChatMessagePageReqVO extends PageParam {
-
- @Schema(description = "对话编号", example = "2048")
- private Long conversationId;
-
- @Schema(description = "用户编号", example = "1024")
- private Long userId;
-
- @Schema(description = "消息内容", example = "你好")
- private String content;
-
- @Schema(description = "创建时间")
- @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
- private LocalDateTime[] createTime;
-
-}
diff --git a/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/chat/vo/message/AiChatMessageRespVO.java b/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/chat/vo/message/AiChatMessageRespVO.java
deleted file mode 100644
index b0f13e3c2effebea822400cc9dfe85e14867c824..0000000000000000000000000000000000000000
--- a/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/chat/vo/message/AiChatMessageRespVO.java
+++ /dev/null
@@ -1,85 +0,0 @@
-package cn.iocoder.yudao.module.ai.controller.admin.chat.vo.message;
-
-import cn.iocoder.yudao.module.ai.framework.ai.core.webserch.AiWebSearchResponse;
-import io.swagger.v3.oas.annotations.media.Schema;
-import lombok.Data;
-
-import java.time.LocalDateTime;
-import java.util.List;
-
-@Schema(description = "管理后台 - AI 聊天消息 Response VO")
-@Data
-public class AiChatMessageRespVO {
-
- @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
- private Long id;
-
- @Schema(description = "对话编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "2048")
- private Long conversationId;
-
- @Schema(description = "回复消息编号", example = "1024")
- private Long replyId;
-
- @Schema(description = "消息类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "role")
- private String type; // 参见 MessageType 枚举类
-
- @Schema(description = "用户编号", example = "4096")
- private Long userId;
-
- @Schema(description = "角色编号", example = "888")
- private Long roleId;
-
- @Schema(description = "模型标志", requiredMode = Schema.RequiredMode.REQUIRED, example = "gpt-3.5-turbo")
- private String model;
-
- @Schema(description = "模型编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "123")
- private Long modelId;
-
- @Schema(description = "聊天内容", requiredMode = Schema.RequiredMode.REQUIRED, example = "你好,你好啊")
- private String content;
-
- @Schema(description = "推理内容", example = "要达到这个目标,你需要...")
- private String reasoningContent;
-
- @Schema(description = "是否携带上下文", requiredMode = Schema.RequiredMode.REQUIRED, example = "true")
- private Boolean useContext;
-
- @Schema(description = "知识库段落编号数组", example = "[1,2,3]")
- private List segmentIds;
-
- @Schema(description = "知识库段落数组")
- private List segments;
-
- @Schema(description = "联网搜索的网页内容数组")
- private List webSearchPages;
-
- @Schema(description = "附件 URL 数组", example = "https://www.iocoder.cn/1.png")
- private List attachmentUrls;
-
- @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED, example = "2024-05-12 12:51")
- private LocalDateTime createTime;
-
- // ========== 仅在【对话管理】时加载 ==========
-
- @Schema(description = "角色名字", example = "小黄")
- private String roleName;
-
- @Schema(description = "知识库段落", example = "Java 开发手册")
- @Data
- public static class KnowledgeSegment {
-
- @Schema(description = "段落编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
- private Long id;
-
- @Schema(description = "切片内容", requiredMode = Schema.RequiredMode.REQUIRED, example = "Java 开发手册")
- private String content;
-
- @Schema(description = "文档编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "24790")
- private Long documentId;
-
- @Schema(description = "文档名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "产品使用手册")
- private String documentName;
-
- }
-
-}
diff --git a/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/chat/vo/message/AiChatMessageSendReqVO.java b/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/chat/vo/message/AiChatMessageSendReqVO.java
deleted file mode 100644
index 06ce0d10d64ced71e2dc23250d682819fd8ee784..0000000000000000000000000000000000000000
--- a/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/chat/vo/message/AiChatMessageSendReqVO.java
+++ /dev/null
@@ -1,31 +0,0 @@
-package cn.iocoder.yudao.module.ai.controller.admin.chat.vo.message;
-
-import io.swagger.v3.oas.annotations.media.Schema;
-import jakarta.validation.constraints.NotEmpty;
-import jakarta.validation.constraints.NotNull;
-import lombok.Data;
-
-import java.util.List;
-
-@Schema(description = "管理后台 - AI 聊天消息发送 Request VO")
-@Data
-public class AiChatMessageSendReqVO {
-
- @Schema(description = "聊天对话编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
- @NotNull(message = "聊天对话编号不能为空")
- private Long conversationId;
-
- @Schema(description = "聊天内容", requiredMode = Schema.RequiredMode.REQUIRED, example = "帮我写个 Java 算法")
- @NotEmpty(message = "聊天内容不能为空")
- private String content;
-
- @Schema(description = "是否携带上下文", example = "true")
- private Boolean useContext;
-
- @Schema(description = "是否联网搜索", example = "true")
- private Boolean useSearch;
-
- @Schema(description = "附件 URL 数组", example = "https://www.iocoder.cn/1.png")
- private List attachmentUrls;
-
-}
diff --git a/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/chat/vo/message/AiChatMessageSendRespVO.java b/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/chat/vo/message/AiChatMessageSendRespVO.java
deleted file mode 100644
index 520712b9b4670612a1409d1da54acc009be73ef9..0000000000000000000000000000000000000000
--- a/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/chat/vo/message/AiChatMessageSendRespVO.java
+++ /dev/null
@@ -1,50 +0,0 @@
-package cn.iocoder.yudao.module.ai.controller.admin.chat.vo.message;
-
-import cn.iocoder.yudao.module.ai.framework.ai.core.webserch.AiWebSearchResponse;
-import io.swagger.v3.oas.annotations.media.Schema;
-import lombok.Data;
-
-import java.time.LocalDateTime;
-import java.util.List;
-
-@Schema(description = "管理后台 - AI 聊天消息发送 Response VO")
-@Data
-public class AiChatMessageSendRespVO {
-
- @Schema(description = "发送消息", requiredMode = Schema.RequiredMode.REQUIRED)
- private Message send;
-
- @Schema(description = "接收消息", requiredMode = Schema.RequiredMode.REQUIRED)
- private Message receive;
-
- @Schema(description = "消息")
- @Data
- public static class Message {
-
- @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
- private Long id;
-
- @Schema(description = "消息类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "role")
- private String type; // 参见 MessageType 枚举类
-
- @Schema(description = "聊天内容", requiredMode = Schema.RequiredMode.REQUIRED, example = "你好,你好啊")
- private String content;
-
- @Schema(description = "推理内容", example = "要达到这个目标,你需要...")
- private String reasoningContent;
-
- @Schema(description = "知识库段落编号数组", example = "[1,2,3]")
- private List segmentIds;
-
- @Schema(description = "知识库段落数组")
- private List segments;
-
- @Schema(description = "联网搜索的网页内容数组")
- private List webSearchPages;
-
- @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
- private LocalDateTime createTime;
-
- }
-
-}
diff --git a/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/image/AiImageController.http b/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/image/AiImageController.http
deleted file mode 100644
index 9047610c0fe7dc53eebbb94cb362ebe4315539bd..0000000000000000000000000000000000000000
--- a/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/image/AiImageController.http
+++ /dev/null
@@ -1,42 +0,0 @@
-### 生成图片:OpenAI(DALL)
-POST {{baseUrl}}/ai/image/draw
-Content-Type: application/json
-Authorization: {{token}}
-
-{
- "platform": "OpenAI",
- "prompt": "可爱的小喵星人",
- "model": "dall-e-3",
- "height": "1024",
- "width": "1024",
- "options": {
- "style": "vivid"
- }
-}
-
-### 生成图片:StableDiffusion
-POST {{baseUrl}}/ai/image/draw
-Content-Type: application/json
-Authorization: {{token}}
-
-{
- "platform": "StableDiffusion",
- "prompt": "中国长城",
- "model": "stable-diffusion-v1-6",
- "height": "1024",
- "width": "1024",
- "style": "vivid"
-}
-
-### 生成图片:生成图片(Midjourney)
-POST {{baseUrl}}/ai/image/midjourney/imagine
-Content-Type: application/json
-Authorization: {{token}}
-
-{
- "prompt": "中国旗袍",
- "model": "midjourney",
- "width": "1",
- "height": "1",
- "version": "6.0"
-}
\ No newline at end of file
diff --git a/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/image/AiImageController.java b/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/image/AiImageController.java
deleted file mode 100644
index 1d9503f364c8b17f0d48f5a30ae1f7c84a1865ad..0000000000000000000000000000000000000000
--- a/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/image/AiImageController.java
+++ /dev/null
@@ -1,139 +0,0 @@
-package cn.iocoder.yudao.module.ai.controller.admin.image;
-
-import cn.hutool.core.util.ObjUtil;
-import cn.iocoder.yudao.module.ai.framework.ai.core.model.midjourney.api.MidjourneyApi;
-import cn.iocoder.yudao.framework.common.pojo.CommonResult;
-import cn.iocoder.yudao.framework.common.pojo.PageResult;
-import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
-import cn.iocoder.yudao.framework.tenant.core.aop.TenantIgnore;
-import cn.iocoder.yudao.module.ai.controller.admin.image.vo.*;
-import cn.iocoder.yudao.module.ai.controller.admin.image.vo.midjourney.AiMidjourneyActionReqVO;
-import cn.iocoder.yudao.module.ai.controller.admin.image.vo.midjourney.AiMidjourneyImagineReqVO;
-import cn.iocoder.yudao.module.ai.dal.dataobject.image.AiImageDO;
-import cn.iocoder.yudao.module.ai.service.image.AiImageService;
-import io.swagger.v3.oas.annotations.Operation;
-import io.swagger.v3.oas.annotations.Parameter;
-import io.swagger.v3.oas.annotations.tags.Tag;
-import jakarta.annotation.Resource;
-import jakarta.annotation.security.PermitAll;
-import jakarta.validation.Valid;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.security.access.prepost.PreAuthorize;
-import org.springframework.validation.annotation.Validated;
-import org.springframework.web.bind.annotation.*;
-
-import java.util.List;
-
-import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
-import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId;
-
-@Tag(name = "管理后台 - AI 绘画")
-@RestController
-@RequestMapping("/ai/image")
-@Slf4j
-public class AiImageController {
-
- @Resource
- private AiImageService imageService;
-
- @GetMapping("/my-page")
- @Operation(summary = "获取【我的】绘图分页")
- public CommonResult> getImagePageMy(@Validated AiImagePageReqVO pageReqVO) {
- PageResult pageResult = imageService.getImagePageMy(getLoginUserId(), pageReqVO);
- return success(BeanUtils.toBean(pageResult, AiImageRespVO.class));
- }
-
- @GetMapping("/public-page")
- @Operation(summary = "获取公开的绘图分页")
- public CommonResult> getImagePagePublic(AiImagePublicPageReqVO pageReqVO) {
- PageResult pageResult = imageService.getImagePagePublic(pageReqVO);
- return success(BeanUtils.toBean(pageResult, AiImageRespVO.class));
- }
-
- @GetMapping("/get-my")
- @Operation(summary = "获取【我的】绘图记录")
- @Parameter(name = "id", required = true, description = "绘画编号", example = "1024")
- public CommonResult getImageMy(@RequestParam("id") Long id) {
- AiImageDO image = imageService.getImage(id);
- if (image == null || ObjUtil.notEqual(getLoginUserId(), image.getUserId())) {
- return success(null);
- }
- return success(BeanUtils.toBean(image, AiImageRespVO.class));
- }
-
- @GetMapping("/my-list-by-ids")
- @Operation(summary = "获取【我的】绘图记录列表")
- @Parameter(name = "ids", required = true, description = "绘画编号数组", example = "1024,2048")
- public CommonResult> getImageListMyByIds(@RequestParam("ids") List ids) {
- List imageList = imageService.getImageList(ids);
- imageList.removeIf(item -> !ObjUtil.equal(getLoginUserId(), item.getUserId()));
- return success(BeanUtils.toBean(imageList, AiImageRespVO.class));
- }
-
- @Operation(summary = "生成图片")
- @PostMapping("/draw")
- public CommonResult drawImage(@Valid @RequestBody AiImageDrawReqVO drawReqVO) {
- return success(imageService.drawImage(getLoginUserId(), drawReqVO));
- }
-
- @Operation(summary = "删除【我的】绘画记录")
- @DeleteMapping("/delete-my")
- @Parameter(name = "id", required = true, description = "绘画编号", example = "1024")
- public CommonResult deleteImageMy(@RequestParam("id") Long id) {
- imageService.deleteImageMy(id, getLoginUserId());
- return success(true);
- }
-
- // ================ midjourney 专属 ================
-
- @Operation(summary = "【Midjourney】生成图片")
- @PostMapping("/midjourney/imagine")
- public CommonResult midjourneyImagine(@Valid @RequestBody AiMidjourneyImagineReqVO reqVO) {
- Long imageId = imageService.midjourneyImagine(getLoginUserId(), reqVO);
- return success(imageId);
- }
-
- @Operation(summary = "【Midjourney】通知图片进展", description = "由 Midjourney Proxy 回调")
- @PostMapping("/midjourney/notify") // 必须是 POST 方法,否则会报错
- @PermitAll
- @TenantIgnore
- public CommonResult midjourneyNotify(@Valid @RequestBody MidjourneyApi.Notify notify) {
- imageService.midjourneyNotify(notify);
- return success(true);
- }
-
- @Operation(summary = "【Midjourney】Action 操作(二次生成图片)", description = "例如说:放大、缩小、U1、U2 等")
- @PostMapping("/midjourney/action")
- public CommonResult midjourneyAction(@Valid @RequestBody AiMidjourneyActionReqVO reqVO) {
- Long imageId = imageService.midjourneyAction(getLoginUserId(), reqVO);
- return success(imageId);
- }
-
- // ================ 绘图管理 ================
-
- @GetMapping("/page")
- @Operation(summary = "获得绘画分页")
- @PreAuthorize("@ss.hasPermission('ai:image:query')")
- public CommonResult> getImagePage(@Valid AiImagePageReqVO pageReqVO) {
- PageResult pageResult = imageService.getImagePage(pageReqVO);
- return success(BeanUtils.toBean(pageResult, AiImageRespVO.class));
- }
-
- @PutMapping("/update")
- @Operation(summary = "更新绘画")
- @PreAuthorize("@ss.hasPermission('ai:image:update')")
- public CommonResult updateImage(@Valid @RequestBody AiImageUpdateReqVO updateReqVO) {
- imageService.updateImage(updateReqVO);
- return success(true);
- }
-
- @DeleteMapping("/delete")
- @Operation(summary = "删除绘画")
- @Parameter(name = "id", description = "编号", required = true)
- @PreAuthorize("@ss.hasPermission('ai:image:delete')")
- public CommonResult deleteImage(@RequestParam("id") Long id) {
- imageService.deleteImage(id);
- return success(true);
- }
-
-}
\ No newline at end of file
diff --git a/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/image/vo/AiImageDrawReqVO.java b/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/image/vo/AiImageDrawReqVO.java
deleted file mode 100644
index 02225ea496b42e16d43de3896718a6fe3f17c343..0000000000000000000000000000000000000000
--- a/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/image/vo/AiImageDrawReqVO.java
+++ /dev/null
@@ -1,49 +0,0 @@
-package cn.iocoder.yudao.module.ai.controller.admin.image.vo;
-
-import io.swagger.v3.oas.annotations.media.Schema;
-import jakarta.validation.constraints.NotEmpty;
-import jakarta.validation.constraints.NotNull;
-import jakarta.validation.constraints.Size;
-import lombok.Data;
-import org.springframework.ai.openai.OpenAiImageOptions;
-import org.springframework.ai.stabilityai.api.StabilityAiImageOptions;
-
-import java.util.Map;
-
-@Schema(description = "管理后台 - AI 绘画 Request VO")
-@Data
-public class AiImageDrawReqVO {
-
- @Schema(description = "模型编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
- @NotNull(message = "模型编号不能为空")
- private Long modelId;
-
- @Schema(description = "提示词", requiredMode = Schema.RequiredMode.REQUIRED, example = "画一个长城")
- @NotEmpty(message = "提示词不能为空")
- @Size(max = 1200, message = "提示词最大 1200")
- private String prompt;
-
- /**
- * 1. dall-e-2 模型:256x256、512x512、1024x1024
- * 2. dall-e-3 模型:1024x1024, 1792x1024, 或 1024x1792
- */
- @Schema(description = "图片高度")
- @NotNull(message = "图片高度不能为空")
- private Integer height;
-
- @Schema(description = "图片宽度")
- @NotNull(message = "图片宽度不能为空")
- private Integer width;
-
- // ========== 各平台绘画的拓展参数 ==========
-
- /**
- * 绘制参数,不同 platform 的不同参数
- *
- * 1. {@link OpenAiImageOptions}
- * 2. {@link StabilityAiImageOptions}
- */
- @Schema(description = "绘制参数")
- private Map options;
-
-}
diff --git a/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/image/vo/AiImagePageReqVO.java b/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/image/vo/AiImagePageReqVO.java
deleted file mode 100644
index 3b48686b9c31f1cdb2275b1c1dfdb7e395cbba9c..0000000000000000000000000000000000000000
--- a/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/image/vo/AiImagePageReqVO.java
+++ /dev/null
@@ -1,35 +0,0 @@
-package cn.iocoder.yudao.module.ai.controller.admin.image.vo;
-
-import cn.iocoder.yudao.framework.common.pojo.PageParam;
-import io.swagger.v3.oas.annotations.media.Schema;
-import lombok.Data;
-import org.springframework.format.annotation.DateTimeFormat;
-
-import java.time.LocalDateTime;
-
-import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
-
-@Schema(description = "管理后台 - AI 绘画分页 Request VO")
-@Data
-public class AiImagePageReqVO extends PageParam {
-
- @Schema(description = "用户编号", example = "28987")
- private Long userId;
-
- @Schema(description = "平台", example = "OpenAI")
- private String platform;
-
- @Schema(description = "提示词", example = "1")
- private String prompt;
-
- @Schema(description = "绘画状态", example = "1")
- private Integer status;
-
- @Schema(description = "是否发布", example = "1")
- private Boolean publicStatus;
-
- @Schema(description = "创建时间")
- @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
- private LocalDateTime[] createTime;
-
-}
\ No newline at end of file
diff --git a/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/image/vo/AiImagePublicPageReqVO.java b/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/image/vo/AiImagePublicPageReqVO.java
deleted file mode 100644
index e7ff80a982782fbae3f0d3f2da605c114437ba79..0000000000000000000000000000000000000000
--- a/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/image/vo/AiImagePublicPageReqVO.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package cn.iocoder.yudao.module.ai.controller.admin.image.vo;
-
-import cn.iocoder.yudao.framework.common.pojo.PageParam;
-import io.swagger.v3.oas.annotations.media.Schema;
-import lombok.Data;
-
-@Schema(description = "管理后台 - AI 绘画公开的分页 Request VO")
-@Data
-public class AiImagePublicPageReqVO extends PageParam {
-
- @Schema(description = "提示词")
- private String prompt;
-
-}
\ No newline at end of file
diff --git a/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/image/vo/AiImageRespVO.java b/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/image/vo/AiImageRespVO.java
deleted file mode 100644
index fa3a957fe9b4e9bf8b6545703f3b42fa17adc64d..0000000000000000000000000000000000000000
--- a/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/image/vo/AiImageRespVO.java
+++ /dev/null
@@ -1,60 +0,0 @@
-package cn.iocoder.yudao.module.ai.controller.admin.image.vo;
-
-import cn.iocoder.yudao.module.ai.framework.ai.core.model.midjourney.api.MidjourneyApi;
-import io.swagger.v3.oas.annotations.media.Schema;
-import lombok.Data;
-
-import java.time.LocalDateTime;
-import java.util.List;
-import java.util.Map;
-
-@Schema(description = "管理后台 - AI 绘画 Response VO")
-@Data
-public class AiImageRespVO {
-
- @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
- private Long id;
-
- @Schema(description = "用户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
- private Long userId;
-
- @Schema(description = "平台", requiredMode = Schema.RequiredMode.REQUIRED, example = "OpenAI")
- private String platform; // 参见 AiPlatformEnum 枚举
-
- @Schema(description = "模型", requiredMode = Schema.RequiredMode.REQUIRED, example = "stable-diffusion-v1-6")
- private String model;
-
- @Schema(description = "提示词", requiredMode = Schema.RequiredMode.REQUIRED, example = "南极的小企鹅")
- private String prompt;
-
- @Schema(description = "图片宽度", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
- private Integer width;
-
- @Schema(description = "图片高度", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
- private Integer height;
-
- @Schema(description = "绘画状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "10")
- private Integer status;
-
- @Schema(description = "是否发布", requiredMode = Schema.RequiredMode.REQUIRED, example = "public")
- private Boolean publicStatus;
-
- @Schema(description = "图片地址", example = "https://www.iocoder.cn/1.png")
- private String picUrl;
-
- @Schema(description = "绘画错误信息", example = "图片错误信息")
- private String errorMessage;
-
- @Schema(description = "绘制参数")
- private Map options;
-
- @Schema(description = "mj buttons 按钮")
- private List buttons;
-
- @Schema(description = "完成时间")
- private LocalDateTime finishTime;
-
- @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
- private LocalDateTime createTime;
-
-}
diff --git a/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/image/vo/AiImageUpdateReqVO.java b/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/image/vo/AiImageUpdateReqVO.java
deleted file mode 100644
index 45df01015b0a601dcc9434d0f3720e7abd84d2f5..0000000000000000000000000000000000000000
--- a/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/image/vo/AiImageUpdateReqVO.java
+++ /dev/null
@@ -1,18 +0,0 @@
-package cn.iocoder.yudao.module.ai.controller.admin.image.vo;
-
-import io.swagger.v3.oas.annotations.media.Schema;
-import jakarta.validation.constraints.NotNull;
-import lombok.Data;
-
-@Schema(description = "管理后台 - AI 绘画修改 Request VO")
-@Data
-public class AiImageUpdateReqVO {
-
- @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "15583")
- @NotNull(message = "编号不能为空")
- private Long id;
-
- @Schema(description = "是否发布", example = "true")
- private Boolean publicStatus;
-
-}
\ No newline at end of file
diff --git a/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/image/vo/midjourney/AiMidjourneyActionReqVO.java b/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/image/vo/midjourney/AiMidjourneyActionReqVO.java
deleted file mode 100644
index 28803a051c28a0d303153e88afc96016c290c67d..0000000000000000000000000000000000000000
--- a/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/image/vo/midjourney/AiMidjourneyActionReqVO.java
+++ /dev/null
@@ -1,20 +0,0 @@
-package cn.iocoder.yudao.module.ai.controller.admin.image.vo.midjourney;
-
-import io.swagger.v3.oas.annotations.media.Schema;
-import jakarta.validation.constraints.NotEmpty;
-import jakarta.validation.constraints.NotNull;
-import lombok.Data;
-
-@Schema(description = "管理后台 - AI 绘图操作(Midjourney) Request VO")
-@Data
-public class AiMidjourneyActionReqVO {
-
- @Schema(description = "图片编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
- @NotNull(message = "图片编号不能为空")
- private Long id;
-
- @Schema(description = "操作按钮编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "MJ::JOB::variation::4::06aa3e66-0e97-49cc-8201-e0295d883de4")
- @NotEmpty(message = "操作按钮编号不能为空")
- private String customId;
-
-}
diff --git a/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/image/vo/midjourney/AiMidjourneyImagineReqVO.java b/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/image/vo/midjourney/AiMidjourneyImagineReqVO.java
deleted file mode 100644
index efb5906157b54aa7a867ef1bd737ce0b0b102d83..0000000000000000000000000000000000000000
--- a/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/image/vo/midjourney/AiMidjourneyImagineReqVO.java
+++ /dev/null
@@ -1,35 +0,0 @@
-package cn.iocoder.yudao.module.ai.controller.admin.image.vo.midjourney;
-
-import io.swagger.v3.oas.annotations.media.Schema;
-import jakarta.validation.constraints.NotEmpty;
-import jakarta.validation.constraints.NotNull;
-import lombok.Data;
-
-@Schema(description = "管理后台 - AI 绘画生成(Midjourney) Request VO")
-@Data
-public class AiMidjourneyImagineReqVO {
-
- @Schema(description = "提示词", requiredMode = Schema.RequiredMode.REQUIRED, example = "中国神龙")
- @NotEmpty(message = "提示词不能为空!")
- private String prompt;
-
- @Schema(description = "模型编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
- @NotNull(message = "模型编号不能为空")
- private Long modelId;
-
- @Schema(description = "图片宽度", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
- @NotNull(message = "图片宽度不能为空")
- private Integer width;
-
- @Schema(description = "图片高度", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
- @NotNull(message = "图片高度不能为空")
- private Integer height;
-
- @Schema(description = "版本号", requiredMode = Schema.RequiredMode.REQUIRED, example = "6.0")
- @NotEmpty(message = "版本号不能为空")
- private String version;
-
- @Schema(description = "参考图", example = "https://www.iocoder.cn/x.png")
- private String referImageUrl;
-
-}
diff --git a/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/knowledge/AiKnowledgeController.http b/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/knowledge/AiKnowledgeController.http
deleted file mode 100644
index a0f127865ac13eb2da5d356f51ef9782e490ccbb..0000000000000000000000000000000000000000
--- a/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/knowledge/AiKnowledgeController.http
+++ /dev/null
@@ -1,35 +0,0 @@
-### 创建知识库
-POST {{baseUrl}}/ai/knowledge/create
-Content-Type: application/json
-Authorization: {{token}}
-tenant-id: {{adminTenantId}}
-
-{
- "name": "测试标题",
- "description": "测试描述",
- "embeddingModelId": 30,
- "topK": 3,
- "similarityThreshold": 0.5,
- "status": 0
-}
-
-### 更新知识库
-PUT {{baseUrl}}/ai/knowledge/update
-Content-Type: application/json
-Authorization: {{token}}
-tenant-id: {{adminTenantId}}
-
-{
- "id": 1,
- "name": "测试标题(更新)",
- "description": "测试描述",
- "embeddingModelId": 30,
- "topK": 5,
- "similarityThreshold": 0.6,
- "status": 0
-}
-
-### 获取知识库分页
-GET {{baseUrl}}/ai/knowledge/page?pageNo=1&pageSize=10
-Authorization: {{token}}
-tenant-id: {{adminTenantId}}
\ No newline at end of file
diff --git a/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/knowledge/AiKnowledgeController.java b/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/knowledge/AiKnowledgeController.java
deleted file mode 100644
index b9daa9513582a867a83fa3e8497cf38efb2285a5..0000000000000000000000000000000000000000
--- a/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/knowledge/AiKnowledgeController.java
+++ /dev/null
@@ -1,84 +0,0 @@
-package cn.iocoder.yudao.module.ai.controller.admin.knowledge;
-
-import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
-import cn.iocoder.yudao.framework.common.pojo.CommonResult;
-import cn.iocoder.yudao.framework.common.pojo.PageResult;
-import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
-import cn.iocoder.yudao.module.ai.controller.admin.knowledge.vo.knowledge.AiKnowledgePageReqVO;
-import cn.iocoder.yudao.module.ai.controller.admin.knowledge.vo.knowledge.AiKnowledgeRespVO;
-import cn.iocoder.yudao.module.ai.controller.admin.knowledge.vo.knowledge.AiKnowledgeSaveReqVO;
-import cn.iocoder.yudao.module.ai.dal.dataobject.knowledge.AiKnowledgeDO;
-import cn.iocoder.yudao.module.ai.service.knowledge.AiKnowledgeService;
-import io.swagger.v3.oas.annotations.Operation;
-import io.swagger.v3.oas.annotations.Parameter;
-import io.swagger.v3.oas.annotations.tags.Tag;
-import jakarta.annotation.Resource;
-import jakarta.validation.Valid;
-import org.springframework.security.access.prepost.PreAuthorize;
-import org.springframework.validation.annotation.Validated;
-import org.springframework.web.bind.annotation.*;
-
-import java.util.List;
-
-import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
-import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList;
-
-@Tag(name = "管理后台 - AI 知识库")
-@RestController
-@RequestMapping("/ai/knowledge")
-@Validated
-public class AiKnowledgeController {
-
- @Resource
- private AiKnowledgeService knowledgeService;
-
- @GetMapping("/page")
- @Operation(summary = "获取知识库分页")
- @PreAuthorize("@ss.hasPermission('ai:knowledge:query')")
- public CommonResult> getKnowledgePage(@Valid AiKnowledgePageReqVO pageReqVO) {
- PageResult pageResult = knowledgeService.getKnowledgePage(pageReqVO);
- return success(BeanUtils.toBean(pageResult, AiKnowledgeRespVO.class));
- }
-
- @GetMapping("/get")
- @Operation(summary = "获得知识库")
- @Parameter(name = "id", description = "编号", required = true, example = "1024")
- @PreAuthorize("@ss.hasPermission('ai:knowledge:query')")
- public CommonResult getKnowledge(@RequestParam("id") Long id) {
- AiKnowledgeDO knowledge = knowledgeService.getKnowledge(id);
- return success(BeanUtils.toBean(knowledge, AiKnowledgeRespVO.class));
- }
-
- @PostMapping("/create")
- @Operation(summary = "创建知识库")
- @PreAuthorize("@ss.hasPermission('ai:knowledge:create')")
- public CommonResult createKnowledge(@RequestBody @Valid AiKnowledgeSaveReqVO createReqVO) {
- return success(knowledgeService.createKnowledge(createReqVO));
- }
-
- @PutMapping("/update")
- @Operation(summary = "更新知识库")
- @PreAuthorize("@ss.hasPermission('ai:knowledge:update')")
- public CommonResult updateKnowledge(@RequestBody @Valid AiKnowledgeSaveReqVO updateReqVO) {
- knowledgeService.updateKnowledge(updateReqVO);
- return success(true);
- }
-
- @DeleteMapping("/delete")
- @Operation(summary = "删除知识库")
- @Parameter(name = "id", description = "编号", required = true, example = "1024")
- @PreAuthorize("@ss.hasPermission('ai:knowledge:delete')")
- public CommonResult deleteKnowledge(@RequestParam("id") Long id) {
- knowledgeService.deleteKnowledge(id);
- return success(true);
- }
-
- @GetMapping("/simple-list")
- @Operation(summary = "获得知识库的精简列表")
- public CommonResult> getKnowledgeSimpleList() {
- List list = knowledgeService.getKnowledgeSimpleListByStatus(CommonStatusEnum.ENABLE.getStatus());
- return success(convertList(list, knowledge -> new AiKnowledgeRespVO()
- .setId(knowledge.getId()).setName(knowledge.getName())));
- }
-
-}
diff --git a/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/knowledge/AiKnowledgeDocumentController.http b/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/knowledge/AiKnowledgeDocumentController.http
deleted file mode 100644
index 1c858ed3ebcc66e04353a0cee7e0b22dbb42d074..0000000000000000000000000000000000000000
--- a/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/knowledge/AiKnowledgeDocumentController.http
+++ /dev/null
@@ -1,35 +0,0 @@
-### 创建知识文档
-POST {{baseUrl}}/ai/knowledge/document/create
-Content-Type: application/json
-Authorization: Bearer {{token}}
-tenant-id: {{adminTenantId}}
-
-{
- "knowledgeId": 2,
- "name": "测试文档",
- "url": "https://static.iocoder.cn/README.md",
- "segmentMaxTokens": 800
-}
-
-### 批量创建知识文档
-POST {{baseUrl}}/ai/knowledge/document/create-list
-Content-Type: application/json
-Authorization: Bearer {{token}}
-tenant-id: {{adminTenantId}}
-
-{
- "knowledgeId": 1,
- "list": [
- {
- "name": "测试文档1",
- "url": "https://static.iocoder.cn/README.md",
- "segmentMaxTokens": 800
- },
- {
- "name": "测试文档2",
- "url": "https://static.iocoder.cn/README_yudao.md",
- "segmentMaxTokens": 400
- }
- ]
-}
-
diff --git a/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/knowledge/AiKnowledgeDocumentController.java b/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/knowledge/AiKnowledgeDocumentController.java
deleted file mode 100644
index 68fe49a8a70675ddac5723b60a302111b92e5825..0000000000000000000000000000000000000000
--- a/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/knowledge/AiKnowledgeDocumentController.java
+++ /dev/null
@@ -1,90 +0,0 @@
-package cn.iocoder.yudao.module.ai.controller.admin.knowledge;
-
-import cn.iocoder.yudao.framework.common.pojo.CommonResult;
-import cn.iocoder.yudao.framework.common.pojo.PageResult;
-import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
-import cn.iocoder.yudao.module.ai.controller.admin.knowledge.vo.document.*;
-import cn.iocoder.yudao.module.ai.controller.admin.knowledge.vo.knowledge.AiKnowledgeDocumentCreateReqVO;
-import cn.iocoder.yudao.module.ai.dal.dataobject.knowledge.AiKnowledgeDocumentDO;
-import cn.iocoder.yudao.module.ai.service.knowledge.AiKnowledgeDocumentService;
-import io.swagger.v3.oas.annotations.Operation;
-import io.swagger.v3.oas.annotations.tags.Tag;
-import jakarta.annotation.Resource;
-import jakarta.validation.Valid;
-import org.springframework.security.access.prepost.PreAuthorize;
-import org.springframework.validation.annotation.Validated;
-import org.springframework.web.bind.annotation.*;
-
-import java.util.List;
-
-import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
-
-@Tag(name = "管理后台 - AI 知识库文档")
-@RestController
-@RequestMapping("/ai/knowledge/document")
-@Validated
-public class AiKnowledgeDocumentController {
-
- @Resource
- private AiKnowledgeDocumentService documentService;
-
- @GetMapping("/page")
- @Operation(summary = "获取文档分页")
- @PreAuthorize("@ss.hasPermission('ai:knowledge:query')")
- public CommonResult> getKnowledgeDocumentPage(
- @Valid AiKnowledgeDocumentPageReqVO pageReqVO) {
- PageResult pageResult = documentService.getKnowledgeDocumentPage(pageReqVO);
- return success(BeanUtils.toBean(pageResult, AiKnowledgeDocumentRespVO.class));
- }
-
- @GetMapping("/get")
- @Operation(summary = "获取文档详情")
- @PreAuthorize("@ss.hasPermission('ai:knowledge:query')")
- public CommonResult getKnowledgeDocument(@RequestParam("id") Long id) {
- AiKnowledgeDocumentDO document = documentService.getKnowledgeDocument(id);
- return success(BeanUtils.toBean(document, AiKnowledgeDocumentRespVO.class));
- }
-
- @PostMapping("/create")
- @Operation(summary = "新建文档(单个)")
- @PreAuthorize("@ss.hasPermission('ai:knowledge:create')")
- public CommonResult createKnowledgeDocument(@RequestBody @Valid AiKnowledgeDocumentCreateReqVO reqVO) {
- Long id = documentService.createKnowledgeDocument(reqVO);
- return success(id);
- }
-
- @PostMapping("/create-list")
- @Operation(summary = "新建文档(多个)")
- @PreAuthorize("@ss.hasPermission('ai:knowledge:create')")
- public CommonResult> createKnowledgeDocumentList(
- @RequestBody @Valid AiKnowledgeDocumentCreateListReqVO reqVO) {
- List ids = documentService.createKnowledgeDocumentList(reqVO);
- return success(ids);
- }
-
- @PutMapping("/update")
- @Operation(summary = "更新文档")
- @PreAuthorize("@ss.hasPermission('ai:knowledge:update')")
- public CommonResult updateKnowledgeDocument(@Valid @RequestBody AiKnowledgeDocumentUpdateReqVO reqVO) {
- documentService.updateKnowledgeDocument(reqVO);
- return success(true);
- }
-
- @PutMapping("/update-status")
- @Operation(summary = "更新文档状态")
- @PreAuthorize("@ss.hasPermission('ai:knowledge:update')")
- public CommonResult updateKnowledgeDocumentStatus(
- @Valid @RequestBody AiKnowledgeDocumentUpdateStatusReqVO reqVO) {
- documentService.updateKnowledgeDocumentStatus(reqVO);
- return success(true);
- }
-
- @DeleteMapping("/delete")
- @Operation(summary = "删除文档")
- @PreAuthorize("@ss.hasPermission('ai:knowledge:delete')")
- public CommonResult deleteKnowledgeDocument(@RequestParam("id") Long id) {
- documentService.deleteKnowledgeDocument(id);
- return success(true);
- }
-
-}
diff --git a/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/knowledge/AiKnowledgeSegmentController.http b/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/knowledge/AiKnowledgeSegmentController.http
deleted file mode 100644
index 09018da3dcbf6f13ab34f7a230497a603e9f99c4..0000000000000000000000000000000000000000
--- a/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/knowledge/AiKnowledgeSegmentController.http
+++ /dev/null
@@ -1,17 +0,0 @@
-### 切片内容
-GET {{baseUrl}}/ai/knowledge/segment/split?url=https://static.iocoder.cn/README_yudao.md&segmentMaxTokens=800
-Content-Type: application/json
-Authorization: Bearer {{token}}
-tenant-id: {{adminTenantId}}
-
-### 搜索段落内容
-GET {{baseUrl}}/ai/knowledge/segment/search?knowledgeId=2&content=如何使用这个产品&topK=5&similarityThreshold=0.1
-Content-Type: application/json
-Authorization: Bearer {{token}}
-tenant-id: {{adminTenantId}}
-
-### 获取文档处理列表
-GET {{baseUrl}}/ai/knowledge/segment/get-process-list?documentIds=1,2,3
-Content-Type: application/json
-Authorization: Bearer {{token}}
-tenant-id: {{adminTenantId}}
\ No newline at end of file
diff --git a/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/knowledge/AiKnowledgeSegmentController.java b/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/knowledge/AiKnowledgeSegmentController.java
deleted file mode 100644
index 34f324491bf8d2a7c7cdbdef16aee1adc6c85462..0000000000000000000000000000000000000000
--- a/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/knowledge/AiKnowledgeSegmentController.java
+++ /dev/null
@@ -1,130 +0,0 @@
-package cn.iocoder.yudao.module.ai.controller.admin.knowledge;
-
-import cn.hutool.core.collection.CollUtil;
-import cn.iocoder.yudao.framework.common.pojo.CommonResult;
-import cn.iocoder.yudao.framework.common.pojo.PageResult;
-import cn.iocoder.yudao.framework.common.util.collection.MapUtils;
-import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
-import cn.iocoder.yudao.module.ai.controller.admin.knowledge.vo.segment.*;
-import cn.iocoder.yudao.module.ai.dal.dataobject.knowledge.AiKnowledgeDocumentDO;
-import cn.iocoder.yudao.module.ai.dal.dataobject.knowledge.AiKnowledgeSegmentDO;
-import cn.iocoder.yudao.module.ai.service.knowledge.AiKnowledgeDocumentService;
-import cn.iocoder.yudao.module.ai.service.knowledge.AiKnowledgeSegmentService;
-import cn.iocoder.yudao.module.ai.service.knowledge.bo.AiKnowledgeSegmentSearchReqBO;
-import cn.iocoder.yudao.module.ai.service.knowledge.bo.AiKnowledgeSegmentSearchRespBO;
-import io.swagger.v3.oas.annotations.Operation;
-import io.swagger.v3.oas.annotations.Parameter;
-import io.swagger.v3.oas.annotations.Parameters;
-import io.swagger.v3.oas.annotations.tags.Tag;
-import jakarta.annotation.Resource;
-import jakarta.validation.Valid;
-import org.hibernate.validator.constraints.URL;
-import org.springframework.security.access.prepost.PreAuthorize;
-import org.springframework.validation.annotation.Validated;
-import org.springframework.web.bind.annotation.*;
-
-import java.util.Collections;
-import java.util.List;
-import java.util.Map;
-
-import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
-import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertSet;
-
-@Tag(name = "管理后台 - AI 知识库段落")
-@RestController
-@RequestMapping("/ai/knowledge/segment")
-@Validated
-public class AiKnowledgeSegmentController {
-
- @Resource
- private AiKnowledgeSegmentService segmentService;
- @Resource
- private AiKnowledgeDocumentService documentService;
-
- @GetMapping("/get")
- @Operation(summary = "获取段落详情")
- @Parameter(name = "id", description = "段落编号", required = true, example = "1024")
- @PreAuthorize("@ss.hasPermission('ai:knowledge:query')")
- public CommonResult getKnowledgeSegment(@RequestParam("id") Long id) {
- AiKnowledgeSegmentDO segment = segmentService.getKnowledgeSegment(id);
- return success(BeanUtils.toBean(segment, AiKnowledgeSegmentRespVO.class));
- }
-
- @GetMapping("/page")
- @Operation(summary = "获取段落分页")
- @PreAuthorize("@ss.hasPermission('ai:knowledge:query')")
- public CommonResult> getKnowledgeSegmentPage(
- @Valid AiKnowledgeSegmentPageReqVO pageReqVO) {
- PageResult pageResult = segmentService.getKnowledgeSegmentPage(pageReqVO);
- return success(BeanUtils.toBean(pageResult, AiKnowledgeSegmentRespVO.class));
- }
-
- @PostMapping("/create")
- @Operation(summary = "创建段落")
- @PreAuthorize("@ss.hasPermission('ai:knowledge:create')")
- public CommonResult createKnowledgeSegment(@Valid @RequestBody AiKnowledgeSegmentSaveReqVO createReqVO) {
- return success(segmentService.createKnowledgeSegment(createReqVO));
- }
-
- @PutMapping("/update")
- @Operation(summary = "更新段落内容")
- @PreAuthorize("@ss.hasPermission('ai:knowledge:update')")
- public CommonResult updateKnowledgeSegment(@Valid @RequestBody AiKnowledgeSegmentSaveReqVO reqVO) {
- segmentService.updateKnowledgeSegment(reqVO);
- return success(true);
- }
-
- @PutMapping("/update-status")
- @Operation(summary = "启禁用段落内容")
- @PreAuthorize("@ss.hasPermission('ai:knowledge:update')")
- public CommonResult updateKnowledgeSegmentStatus(
- @Valid @RequestBody AiKnowledgeSegmentUpdateStatusReqVO reqVO) {
- segmentService.updateKnowledgeSegmentStatus(reqVO);
- return success(true);
- }
-
- @GetMapping("/split")
- @Operation(summary = "切片内容")
- @Parameters({
- @Parameter(name = "url", description = "文档 URL", required = true),
- @Parameter(name = "segmentMaxTokens", description = "分段的最大 Token 数", required = true)
- })
- @PreAuthorize("@ss.hasPermission('ai:knowledge:query')")
- public CommonResult> splitContent(
- @RequestParam("url") @URL String url,
- @RequestParam(value = "segmentMaxTokens") Integer segmentMaxTokens) {
- List segments = segmentService.splitContent(url, segmentMaxTokens);
- return success(BeanUtils.toBean(segments, AiKnowledgeSegmentRespVO.class));
- }
-
- @GetMapping("/get-process-list")
- @Operation(summary = "获取文档处理列表")
- @Parameter(name = "documentIds", description = "文档编号列表", required = true, example = "1,2,3")
- @PreAuthorize("@ss.hasPermission('ai:knowledge:query')")
- public CommonResult> getKnowledgeSegmentProcessList(
- @RequestParam("documentIds") List documentIds) {
- List list = segmentService.getKnowledgeSegmentProcessList(documentIds);
- return success(list);
- }
-
- @GetMapping("/search")
- @Operation(summary = "搜索段落内容")
- @PreAuthorize("@ss.hasPermission('ai:knowledge:query')")
- public CommonResult> searchKnowledgeSegment(
- @Valid AiKnowledgeSegmentSearchReqVO reqVO) {
- // 1. 搜索段落
- List segments = segmentService
- .searchKnowledgeSegment(BeanUtils.toBean(reqVO, AiKnowledgeSegmentSearchReqBO.class));
- if (CollUtil.isEmpty(segments)) {
- return success(Collections.emptyList());
- }
-
- // 2. 拼接 VO
- Map documentMap = documentService.getKnowledgeDocumentMap(convertSet(
- segments, AiKnowledgeSegmentSearchRespBO::getDocumentId));
- return success(BeanUtils.toBean(segments, AiKnowledgeSegmentSearchRespVO.class,
- segment -> MapUtils.findAndThen(documentMap, segment.getDocumentId(),
- document -> segment.setDocumentName(document.getName()))));
- }
-
-}
diff --git a/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/knowledge/vo/document/AiKnowledgeDocumentCreateListReqVO.java b/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/knowledge/vo/document/AiKnowledgeDocumentCreateListReqVO.java
deleted file mode 100644
index 6545c0bc1cd6c3d0400d4f27e6c291d32f83d112..0000000000000000000000000000000000000000
--- a/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/knowledge/vo/document/AiKnowledgeDocumentCreateListReqVO.java
+++ /dev/null
@@ -1,42 +0,0 @@
-package cn.iocoder.yudao.module.ai.controller.admin.knowledge.vo.document;
-
-import io.swagger.v3.oas.annotations.media.Schema;
-import jakarta.validation.constraints.NotBlank;
-import jakarta.validation.constraints.NotEmpty;
-import jakarta.validation.constraints.NotNull;
-import lombok.Data;
-import org.hibernate.validator.constraints.URL;
-
-import java.util.List;
-
-@Schema(description = "管理后台 - AI 知识库文档批量创建 Request VO")
-@Data
-public class AiKnowledgeDocumentCreateListReqVO {
-
- @Schema(description = "知识库编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1204")
- @NotNull(message = "知识库编号不能为空")
- private Long knowledgeId;
-
- @Schema(description = "分段的最大 Token 数", requiredMode = Schema.RequiredMode.REQUIRED, example = "800")
- @NotNull(message = "分段的最大 Token 数不能为空")
- private Integer segmentMaxTokens;
-
- @Schema(description = "文档列表", requiredMode = Schema.RequiredMode.REQUIRED)
- @NotEmpty(message = "文档列表不能为空")
- private List list;
-
- @Schema(description = "文档")
- @Data
- public static class Document {
-
- @Schema(description = "文档名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "三方登陆")
- @NotBlank(message = "文档名称不能为空")
- private String name;
-
- @Schema(description = "文档 URL", requiredMode = Schema.RequiredMode.REQUIRED, example = "https://doc.iocoder.cn")
- @URL(message = "文档 URL 格式不正确")
- private String url;
-
- }
-
-}
\ No newline at end of file
diff --git a/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/knowledge/vo/document/AiKnowledgeDocumentPageReqVO.java b/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/knowledge/vo/document/AiKnowledgeDocumentPageReqVO.java
deleted file mode 100644
index 15bb603c213b3cf6fc4c332d0d3ffc74bc4367a5..0000000000000000000000000000000000000000
--- a/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/knowledge/vo/document/AiKnowledgeDocumentPageReqVO.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package cn.iocoder.yudao.module.ai.controller.admin.knowledge.vo.document;
-
-import cn.iocoder.yudao.framework.common.pojo.PageParam;
-import io.swagger.v3.oas.annotations.media.Schema;
-import lombok.Data;
-
-@Schema(description = "管理后台 - AI 知识库文档的分页 Request VO")
-@Data
-public class AiKnowledgeDocumentPageReqVO extends PageParam {
-
- @Schema(description = "知识库编号", example = "1")
- private Long knowledgeId;
-
- @Schema(description = "文档名称", example = "Java 开发手册")
- private String name;
-
-}
diff --git a/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/knowledge/vo/document/AiKnowledgeDocumentRespVO.java b/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/knowledge/vo/document/AiKnowledgeDocumentRespVO.java
deleted file mode 100644
index 7aef94a3f4f03ee786000954835cba7abd7ce9c9..0000000000000000000000000000000000000000
--- a/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/knowledge/vo/document/AiKnowledgeDocumentRespVO.java
+++ /dev/null
@@ -1,45 +0,0 @@
-package cn.iocoder.yudao.module.ai.controller.admin.knowledge.vo.document;
-
-import io.swagger.v3.oas.annotations.media.Schema;
-import lombok.Data;
-
-import java.time.LocalDateTime;
-
-@Schema(description = "管理后台 - AI 知识库文档 Response VO")
-@Data
-public class AiKnowledgeDocumentRespVO {
-
- @Schema(description = "文档编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "24790")
- private Long id;
-
- @Schema(description = "知识库编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "24790")
- private Long knowledgeId;
-
- @Schema(description = "文档名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "Java 开发手册")
- private String name;
-
- @Schema(description = "文档 URL", requiredMode = Schema.RequiredMode.REQUIRED, example = "https://doc.iocoder.cn")
- private String url;
-
- @Schema(description = "文档内容", requiredMode = Schema.RequiredMode.REQUIRED, example = "Java 是一门面向对象的语言.....")
- private String content;
-
- @Schema(description = "文档内容长度", requiredMode = Schema.RequiredMode.REQUIRED, example = "2048")
- private Integer contentLength;
-
- @Schema(description = "文档 Token 数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
- private Integer tokens;
-
- @Schema(description = "分片最大 Token 数", requiredMode = Schema.RequiredMode.REQUIRED, example = "512")
- private Integer segmentMaxTokens;
-
- @Schema(description = "召回次数", requiredMode = Schema.RequiredMode.REQUIRED, example = "10")
- private Integer retrievalCount;
-
- @Schema(description = "文档状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "0")
- private Integer status;
-
- @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
- private LocalDateTime createTime;
-
-}
diff --git a/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/knowledge/vo/document/AiKnowledgeDocumentUpdateReqVO.java b/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/knowledge/vo/document/AiKnowledgeDocumentUpdateReqVO.java
deleted file mode 100644
index e6dbe5cbd741249655c1e62a0435581f59323ff5..0000000000000000000000000000000000000000
--- a/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/knowledge/vo/document/AiKnowledgeDocumentUpdateReqVO.java
+++ /dev/null
@@ -1,21 +0,0 @@
-package cn.iocoder.yudao.module.ai.controller.admin.knowledge.vo.document;
-
-import io.swagger.v3.oas.annotations.media.Schema;
-import jakarta.validation.constraints.NotNull;
-import lombok.Data;
-
-@Schema(description = "管理后台 - AI 知识库文档更新 Request VO")
-@Data
-public class AiKnowledgeDocumentUpdateReqVO {
-
- @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "15583")
- @NotNull(message = "编号不能为空")
- private Long id;
-
- @Schema(description = "名称", example = "Java 开发手册")
- private String name;
-
- @Schema(description = "分片最大 Token 数", example = "1000")
- private Integer segmentMaxTokens;
-
-}
diff --git a/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/knowledge/vo/document/AiKnowledgeDocumentUpdateStatusReqVO.java b/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/knowledge/vo/document/AiKnowledgeDocumentUpdateStatusReqVO.java
deleted file mode 100644
index 93d393ab4a995a3a085df9661f7d100a79909dab..0000000000000000000000000000000000000000
--- a/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/knowledge/vo/document/AiKnowledgeDocumentUpdateStatusReqVO.java
+++ /dev/null
@@ -1,22 +0,0 @@
-package cn.iocoder.yudao.module.ai.controller.admin.knowledge.vo.document;
-
-import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
-import cn.iocoder.yudao.framework.common.validation.InEnum;
-import io.swagger.v3.oas.annotations.media.Schema;
-import jakarta.validation.constraints.NotNull;
-import lombok.Data;
-
-@Schema(description = "管理后台 - AI 知识库文档更新状态 Request VO")
-@Data
-public class AiKnowledgeDocumentUpdateStatusReqVO {
-
- @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "15583")
- @NotNull(message = "编号不能为空")
- private Long id;
-
- @Schema(description = "状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "0")
- @NotNull(message = "状态不能为空")
- @InEnum(CommonStatusEnum.class)
- private Integer status;
-
-}
\ No newline at end of file
diff --git a/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/knowledge/vo/knowledge/AiKnowledgeDocumentCreateReqVO.java b/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/knowledge/vo/knowledge/AiKnowledgeDocumentCreateReqVO.java
deleted file mode 100644
index 1d2e49307aa61a5964f9b648dd19508dfe6d520a..0000000000000000000000000000000000000000
--- a/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/knowledge/vo/knowledge/AiKnowledgeDocumentCreateReqVO.java
+++ /dev/null
@@ -1,30 +0,0 @@
-package cn.iocoder.yudao.module.ai.controller.admin.knowledge.vo.knowledge;
-
-import io.swagger.v3.oas.annotations.media.Schema;
-import jakarta.validation.constraints.NotBlank;
-import jakarta.validation.constraints.NotNull;
-import lombok.Data;
-import org.hibernate.validator.constraints.URL;
-
-
-@Schema(description = "管理后台 - AI 知识库文档的创建 Request VO")
-@Data
-public class AiKnowledgeDocumentCreateReqVO {
-
- @Schema(description = "知识库编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1204")
- @NotNull(message = "知识库编号不能为空")
- private Long knowledgeId;
-
- @Schema(description = "文档名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "三方登陆")
- @NotBlank(message = "文档名称不能为空")
- private String name;
-
- @Schema(description = "文档 URL", requiredMode = Schema.RequiredMode.REQUIRED, example = "https://doc.iocoder.cn")
- @URL(message = "文档 URL 格式不正确")
- private String url;
-
- @Schema(description = "分段的最大 Token 数", requiredMode = Schema.RequiredMode.REQUIRED, example = "800")
- @NotNull(message = "分段的最大 Token 数不能为空")
- private Integer segmentMaxTokens;
-
-}
diff --git a/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/knowledge/vo/knowledge/AiKnowledgePageReqVO.java b/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/knowledge/vo/knowledge/AiKnowledgePageReqVO.java
deleted file mode 100644
index dc7943cf25ab33fbed6e8029957c32f9421a28c7..0000000000000000000000000000000000000000
--- a/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/knowledge/vo/knowledge/AiKnowledgePageReqVO.java
+++ /dev/null
@@ -1,29 +0,0 @@
-package cn.iocoder.yudao.module.ai.controller.admin.knowledge.vo.knowledge;
-
-import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
-import cn.iocoder.yudao.framework.common.pojo.PageParam;
-import cn.iocoder.yudao.framework.common.validation.InEnum;
-import io.swagger.v3.oas.annotations.media.Schema;
-import lombok.Data;
-import org.springframework.format.annotation.DateTimeFormat;
-
-import java.time.LocalDateTime;
-
-import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
-
-@Schema(description = "管理后台 - AI 知识库的分页 Request VO")
-@Data
-public class AiKnowledgePageReqVO extends PageParam {
-
- @Schema(description = "知识库名称", example = "芋艿")
- private String name;
-
- @Schema(description = "是否启用", example = "1")
- @InEnum(CommonStatusEnum.class)
- private Integer status;
-
- @Schema(description = "创建时间")
- @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
- private LocalDateTime[] createTime;
-
-}
diff --git a/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/knowledge/vo/knowledge/AiKnowledgeRespVO.java b/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/knowledge/vo/knowledge/AiKnowledgeRespVO.java
deleted file mode 100644
index 5e83b85a72aa3e525f177d8d7f69873024347277..0000000000000000000000000000000000000000
--- a/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/knowledge/vo/knowledge/AiKnowledgeRespVO.java
+++ /dev/null
@@ -1,39 +0,0 @@
-package cn.iocoder.yudao.module.ai.controller.admin.knowledge.vo.knowledge;
-
-import io.swagger.v3.oas.annotations.media.Schema;
-import lombok.Data;
-
-import java.time.LocalDateTime;
-
-@Schema(description = "管理后台 - AI 知识库 Response VO")
-@Data
-public class AiKnowledgeRespVO {
-
- @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "24790")
- private Long id;
-
- @Schema(description = "知识库名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "ruoyi-vue-pro 用户指南")
- private String name;
-
- @Schema(description = "知识库描述", example = "帮助你快速构建系统")
- private String description;
-
- @Schema(description = "向量模型编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "14")
- private Long embeddingModelId;
-
- @Schema(description = "向量模型标识", requiredMode = Schema.RequiredMode.REQUIRED, example = "qwen-72b-chat")
- private String embeddingModel;
-
- @Schema(description = "topK", requiredMode = Schema.RequiredMode.REQUIRED, example = "3")
- private Integer topK;
-
- @Schema(description = "相似度阈值", requiredMode = Schema.RequiredMode.REQUIRED, example = "0.7")
- private Double similarityThreshold;
-
- @Schema(description = "状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
- private Integer status;
-
- @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
- private LocalDateTime createTime;
-
-}
diff --git a/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/knowledge/vo/knowledge/AiKnowledgeSaveReqVO.java b/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/knowledge/vo/knowledge/AiKnowledgeSaveReqVO.java
deleted file mode 100644
index 774b7234a7464ad5ecdb5cc1b07b06b1fbf063de..0000000000000000000000000000000000000000
--- a/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/knowledge/vo/knowledge/AiKnowledgeSaveReqVO.java
+++ /dev/null
@@ -1,41 +0,0 @@
-package cn.iocoder.yudao.module.ai.controller.admin.knowledge.vo.knowledge;
-
-import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
-import cn.iocoder.yudao.framework.common.validation.InEnum;
-import io.swagger.v3.oas.annotations.media.Schema;
-import jakarta.validation.constraints.NotBlank;
-import jakarta.validation.constraints.NotNull;
-import lombok.Data;
-
-@Schema(description = "管理后台 - AI 知识库新增/修改 Request VO")
-@Data
-public class AiKnowledgeSaveReqVO {
-
- @Schema(description = "对话编号", example = "1204")
- private Long id;
-
- @Schema(description = "知识库名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "ruoyi-vue-pro 用户指南")
- @NotBlank(message = "知识库名称不能为空")
- private String name;
-
- @Schema(description = "知识库描述", requiredMode = Schema.RequiredMode.REQUIRED, example = "存储 ruoyi-vue-pro 操作文档")
- private String description;
-
- @Schema(description = "向量模型编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
- @NotNull(message = "向量模型不能为空")
- private Long embeddingModelId;
-
- @Schema(description = "topK", requiredMode = Schema.RequiredMode.REQUIRED, example = "3")
- @NotNull(message = "topK 不能为空")
- private Integer topK;
-
- @Schema(description = "相似性阈值", requiredMode = Schema.RequiredMode.REQUIRED, example = "0.5")
- @NotNull(message = "相似性阈值不能为空")
- private Double similarityThreshold;
-
- @Schema(description = "是否启用", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
- @NotNull(message = "是否启用不能为空")
- @InEnum(CommonStatusEnum.class)
- private Integer status;
-
-}
diff --git a/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/knowledge/vo/segment/AiKnowledgeSegmentPageReqVO.java b/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/knowledge/vo/segment/AiKnowledgeSegmentPageReqVO.java
deleted file mode 100644
index f53d5be07617abb7904d7316e7f995b7cdda0b0b..0000000000000000000000000000000000000000
--- a/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/knowledge/vo/segment/AiKnowledgeSegmentPageReqVO.java
+++ /dev/null
@@ -1,23 +0,0 @@
-package cn.iocoder.yudao.module.ai.controller.admin.knowledge.vo.segment;
-
-import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
-import cn.iocoder.yudao.framework.common.pojo.PageParam;
-import cn.iocoder.yudao.framework.common.validation.InEnum;
-import io.swagger.v3.oas.annotations.media.Schema;
-import lombok.Data;
-
-@Schema(description = "管理后台 - AI 知识库分段的分页 Request VO")
-@Data
-public class AiKnowledgeSegmentPageReqVO extends PageParam {
-
- @Schema(description = "文档编号", example = "1")
- private Integer documentId;
-
- @Schema(description = "分段内容关键字", example = "Java 开发")
- private String content;
-
- @Schema(description = "分段状态", example = "1")
- @InEnum(CommonStatusEnum.class)
- private Integer status;
-
-}
diff --git a/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/knowledge/vo/segment/AiKnowledgeSegmentProcessRespVO.java b/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/knowledge/vo/segment/AiKnowledgeSegmentProcessRespVO.java
deleted file mode 100644
index a6b95265b76092b276961d783d81b8b8a96a727f..0000000000000000000000000000000000000000
--- a/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/knowledge/vo/segment/AiKnowledgeSegmentProcessRespVO.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package cn.iocoder.yudao.module.ai.controller.admin.knowledge.vo.segment;
-
-import io.swagger.v3.oas.annotations.media.Schema;
-import lombok.Data;
-
-@Schema(description = "管理后台 - AI 知识库段落向量进度 Response VO")
-@Data
-public class AiKnowledgeSegmentProcessRespVO {
-
- @Schema(description = "文档编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
- private Long documentId;
-
- @Schema(description = "总段落数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "10")
- private Long count;
-
- @Schema(description = "已向量化段落数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "5")
- private Long embeddingCount;
-
-}
\ No newline at end of file
diff --git a/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/knowledge/vo/segment/AiKnowledgeSegmentRespVO.java b/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/knowledge/vo/segment/AiKnowledgeSegmentRespVO.java
deleted file mode 100644
index 24c452621affe9d7bea704055dd814fa55ae00a9..0000000000000000000000000000000000000000
--- a/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/knowledge/vo/segment/AiKnowledgeSegmentRespVO.java
+++ /dev/null
@@ -1,40 +0,0 @@
-package cn.iocoder.yudao.module.ai.controller.admin.knowledge.vo.segment;
-
-import io.swagger.v3.oas.annotations.media.Schema;
-import lombok.Data;
-
-@Schema(description = "管理后台 - AI 知识库文档分片 Response VO")
-@Data
-public class AiKnowledgeSegmentRespVO {
-
- @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "24790")
- private Long id;
-
- @Schema(description = "文档编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "24790")
- private Long documentId;
-
- @Schema(description = "知识库编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "24790")
- private Long knowledgeId;
-
- @Schema(description = "向量库编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1858496a-1dde-4edf-a43e-0aed08f37f8c")
- private String vectorId;
-
- @Schema(description = "切片内容", requiredMode = Schema.RequiredMode.REQUIRED, example = "Java 开发手册")
- private String content;
-
- @Schema(description = "切片内容长度", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
- private Integer contentLength;
-
- @Schema(description = "token 数量", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
- private Integer tokens;
-
- @Schema(description = "召回次数", requiredMode = Schema.RequiredMode.REQUIRED, example = "10")
- private Integer retrievalCount;
-
- @Schema(description = "文档状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
- private Integer status;
-
- @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
- private Long createTime;
-
-}
diff --git a/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/knowledge/vo/segment/AiKnowledgeSegmentSaveReqVO.java b/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/knowledge/vo/segment/AiKnowledgeSegmentSaveReqVO.java
deleted file mode 100644
index 0c5dad11dbf7fc376a72b0af86bd38cf50834c3d..0000000000000000000000000000000000000000
--- a/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/knowledge/vo/segment/AiKnowledgeSegmentSaveReqVO.java
+++ /dev/null
@@ -1,21 +0,0 @@
-package cn.iocoder.yudao.module.ai.controller.admin.knowledge.vo.segment;
-
-import io.swagger.v3.oas.annotations.media.Schema;
-import jakarta.validation.constraints.NotEmpty;
-import lombok.Data;
-
-@Schema(description = "管理后台 - AI 新增/修改知识库段落 request VO")
-@Data
-public class AiKnowledgeSegmentSaveReqVO {
-
- @Schema(description = "编号", example = "24790")
- private Long id;
-
- @Schema(description = "知识库文档编号", example = "1024")
- private Long documentId;
-
- @Schema(description = "切片内容", requiredMode = Schema.RequiredMode.REQUIRED, example = "Java 开发手册")
- @NotEmpty(message = "切片内容不能为空")
- private String content;
-
-}
diff --git a/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/knowledge/vo/segment/AiKnowledgeSegmentSearchReqVO.java b/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/knowledge/vo/segment/AiKnowledgeSegmentSearchReqVO.java
deleted file mode 100644
index 3b3cd984b9fb52d88d7bc2e473fb0aa331926c83..0000000000000000000000000000000000000000
--- a/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/knowledge/vo/segment/AiKnowledgeSegmentSearchReqVO.java
+++ /dev/null
@@ -1,27 +0,0 @@
-package cn.iocoder.yudao.module.ai.controller.admin.knowledge.vo.segment;
-
-import io.swagger.v3.oas.annotations.media.Schema;
-import lombok.Data;
-
-import jakarta.validation.constraints.NotEmpty;
-import jakarta.validation.constraints.NotNull;
-
-@Schema(description = "管理后台 - AI 知识库段落搜索 Request VO")
-@Data
-public class AiKnowledgeSegmentSearchReqVO {
-
- @Schema(description = "知识库编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
- @NotNull(message = "知识库编号不能为空")
- private Long knowledgeId;
-
- @Schema(description = "内容", requiredMode = Schema.RequiredMode.REQUIRED, example = "如何使用这个产品")
- @NotEmpty(message = "内容不能为空")
- private String content;
-
- @Schema(description = "最大返回数量", example = "5")
- private Integer topK;
-
- @Schema(description = "相似度阈值", example = "0.7")
- private Double similarityThreshold;
-
-}
diff --git a/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/knowledge/vo/segment/AiKnowledgeSegmentSearchRespVO.java b/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/knowledge/vo/segment/AiKnowledgeSegmentSearchRespVO.java
deleted file mode 100644
index 50bbc5c8678abf35f27df8616fff420a47adf387..0000000000000000000000000000000000000000
--- a/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/knowledge/vo/segment/AiKnowledgeSegmentSearchRespVO.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package cn.iocoder.yudao.module.ai.controller.admin.knowledge.vo.segment;
-
-import io.swagger.v3.oas.annotations.media.Schema;
-import lombok.Data;
-
-@Schema(description = "管理后台 - AI 知识库段落搜索 Response VO")
-@Data
-public class AiKnowledgeSegmentSearchRespVO extends AiKnowledgeSegmentRespVO {
-
- @Schema(description = "文档名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "产品使用手册")
- private String documentName;
-
- @Schema(description = "相似度分数", requiredMode = Schema.RequiredMode.REQUIRED, example = "0.95")
- private Double score;
-
-}
\ No newline at end of file
diff --git a/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/knowledge/vo/segment/AiKnowledgeSegmentUpdateStatusReqVO.java b/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/knowledge/vo/segment/AiKnowledgeSegmentUpdateStatusReqVO.java
deleted file mode 100644
index 2516c7dfb28f341c6712e47c913d01cf4240b98e..0000000000000000000000000000000000000000
--- a/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/knowledge/vo/segment/AiKnowledgeSegmentUpdateStatusReqVO.java
+++ /dev/null
@@ -1,22 +0,0 @@
-package cn.iocoder.yudao.module.ai.controller.admin.knowledge.vo.segment;
-
-import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
-import cn.iocoder.yudao.framework.common.validation.InEnum;
-import io.swagger.v3.oas.annotations.media.Schema;
-import jakarta.validation.constraints.NotNull;
-import lombok.Data;
-
-
-@Schema(description = "管理后台 - AI 知识库段落的更新状态 Request VO")
-@Data
-public class AiKnowledgeSegmentUpdateStatusReqVO {
-
- @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "24790")
- private Long id;
-
- @Schema(description = "是否启用", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
- @NotNull(message = "是否启用不能为空")
- @InEnum(CommonStatusEnum.class)
- private Integer status;
-
-}
diff --git a/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/mindmap/AiMindMapController.java b/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/mindmap/AiMindMapController.java
deleted file mode 100644
index db015e5149425f636ce48e070be903ef1fa37973..0000000000000000000000000000000000000000
--- a/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/mindmap/AiMindMapController.java
+++ /dev/null
@@ -1,57 +0,0 @@
-package cn.iocoder.yudao.module.ai.controller.admin.mindmap;
-
-import cn.iocoder.yudao.framework.common.pojo.CommonResult;
-import cn.iocoder.yudao.framework.common.pojo.PageResult;
-import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
-import cn.iocoder.yudao.module.ai.controller.admin.mindmap.vo.AiMindMapGenerateReqVO;
-import cn.iocoder.yudao.module.ai.controller.admin.mindmap.vo.AiMindMapPageReqVO;
-import cn.iocoder.yudao.module.ai.controller.admin.mindmap.vo.AiMindMapRespVO;
-import cn.iocoder.yudao.module.ai.dal.dataobject.mindmap.AiMindMapDO;
-import cn.iocoder.yudao.module.ai.service.mindmap.AiMindMapService;
-import io.swagger.v3.oas.annotations.Operation;
-import io.swagger.v3.oas.annotations.Parameter;
-import io.swagger.v3.oas.annotations.tags.Tag;
-import jakarta.annotation.Resource;
-import jakarta.validation.Valid;
-import org.springframework.http.MediaType;
-import org.springframework.security.access.prepost.PreAuthorize;
-import org.springframework.web.bind.annotation.*;
-import reactor.core.publisher.Flux;
-
-import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
-import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId;
-
-@Tag(name = "管理后台 - AI 思维导图")
-@RestController
-@RequestMapping("/ai/mind-map")
-public class AiMindMapController {
-
- @Resource
- private AiMindMapService mindMapService;
-
- @PostMapping(value = "/generate-stream", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
- @Operation(summary = "导图生成(流式)", description = "流式返回,响应较快")
- public Flux> generateMindMap(@RequestBody @Valid AiMindMapGenerateReqVO generateReqVO) {
- return mindMapService.generateMindMap(generateReqVO, getLoginUserId());
- }
-
- // ================ 导图管理 ================
-
- @DeleteMapping("/delete")
- @Operation(summary = "删除思维导图")
- @Parameter(name = "id", description = "编号", required = true)
- @PreAuthorize("@ss.hasPermission('ai:mind-map:delete')")
- public CommonResult deleteMindMap(@RequestParam("id") Long id) {
- mindMapService.deleteMindMap(id);
- return success(true);
- }
-
- @GetMapping("/page")
- @Operation(summary = "获得思维导图分页")
- @PreAuthorize("@ss.hasPermission('ai:mind-map:query')")
- public CommonResult> getMindMapPage(@Valid AiMindMapPageReqVO pageReqVO) {
- PageResult pageResult = mindMapService.getMindMapPage(pageReqVO);
- return success(BeanUtils.toBean(pageResult, AiMindMapRespVO.class));
- }
-
-}
diff --git a/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/mindmap/vo/AiMindMapGenerateReqVO.java b/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/mindmap/vo/AiMindMapGenerateReqVO.java
deleted file mode 100644
index 08404bb0f1c4db45e56894c651bf85cc6dc01fe9..0000000000000000000000000000000000000000
--- a/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/mindmap/vo/AiMindMapGenerateReqVO.java
+++ /dev/null
@@ -1,15 +0,0 @@
-package cn.iocoder.yudao.module.ai.controller.admin.mindmap.vo;
-
-import io.swagger.v3.oas.annotations.media.Schema;
-import jakarta.validation.constraints.NotBlank;
-import lombok.Data;
-
-@Schema(description = "管理后台 - AI 思维导图生成 Request VO")
-@Data
-public class AiMindMapGenerateReqVO {
-
- @Schema(description = "思维导图内容提示", example = "Java 学习路线")
- @NotBlank(message = "思维导图内容提示不能为空")
- private String prompt;
-
-}
\ No newline at end of file
diff --git a/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/mindmap/vo/AiMindMapPageReqVO.java b/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/mindmap/vo/AiMindMapPageReqVO.java
deleted file mode 100644
index f7769b4e6b65cef5647f3843bc9bffc31c0c91ab..0000000000000000000000000000000000000000
--- a/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/mindmap/vo/AiMindMapPageReqVO.java
+++ /dev/null
@@ -1,28 +0,0 @@
-package cn.iocoder.yudao.module.ai.controller.admin.mindmap.vo;
-
-import cn.iocoder.yudao.framework.common.pojo.PageParam;
-import io.swagger.v3.oas.annotations.media.Schema;
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-import lombok.ToString;
-import org.springframework.format.annotation.DateTimeFormat;
-
-import java.time.LocalDateTime;
-
-import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
-
-@Schema(description = "管理后台 - AI 思维导图分页 Request VO")
-@Data
-public class AiMindMapPageReqVO extends PageParam {
-
- @Schema(description = "用户编号", example = "4325")
- private Long userId;
-
- @Schema(description = "生成内容提示", example = "Java 学习路线")
- private String prompt;
-
- @Schema(description = "创建时间")
- @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
- private LocalDateTime[] createTime;
-
-}
\ No newline at end of file
diff --git a/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/mindmap/vo/AiMindMapRespVO.java b/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/mindmap/vo/AiMindMapRespVO.java
deleted file mode 100644
index f65e809e91050502d50f766cf798a3344ba243cc..0000000000000000000000000000000000000000
--- a/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/mindmap/vo/AiMindMapRespVO.java
+++ /dev/null
@@ -1,36 +0,0 @@
-package cn.iocoder.yudao.module.ai.controller.admin.mindmap.vo;
-
-import io.swagger.v3.oas.annotations.media.Schema;
-import lombok.Data;
-
-import java.time.LocalDateTime;
-
-@Schema(description = "管理后台 - AI 思维导图 Response VO")
-@Data
-public class AiMindMapRespVO {
-
- @Schema(description = "编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "3373")
- private Long id;
-
- @Schema(description = "用户编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "4325")
- private Long userId;
-
- @Schema(description = "生成内容提示", requiredMode = Schema.RequiredMode.REQUIRED, example = "Java 学习路线")
- private String prompt;
-
- @Schema(description = "生成的思维导图内容")
- private String generatedContent;
-
- @Schema(description = "平台", requiredMode = Schema.RequiredMode.REQUIRED, example = "OpenAI")
- private String platform;
-
- @Schema(description = "模型", requiredMode = Schema.RequiredMode.REQUIRED, example = "gpt-3.5-turbo-0125")
- private String model;
-
- @Schema(description = "错误信息")
- private String errorMessage;
-
- @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
- private LocalDateTime createTime;
-
-}
\ No newline at end of file
diff --git a/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/model/AiApiKeyController.java b/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/model/AiApiKeyController.java
deleted file mode 100644
index c109b033ca0a1e55e5c7b26b0509700b4809321a..0000000000000000000000000000000000000000
--- a/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/model/AiApiKeyController.java
+++ /dev/null
@@ -1,83 +0,0 @@
-package cn.iocoder.yudao.module.ai.controller.admin.model;
-
-import cn.iocoder.yudao.framework.common.pojo.CommonResult;
-import cn.iocoder.yudao.framework.common.pojo.PageResult;
-import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
-import cn.iocoder.yudao.module.ai.controller.admin.model.vo.apikey.AiApiKeyPageReqVO;
-import cn.iocoder.yudao.module.ai.controller.admin.model.vo.apikey.AiApiKeyRespVO;
-import cn.iocoder.yudao.module.ai.controller.admin.model.vo.apikey.AiApiKeySaveReqVO;
-import cn.iocoder.yudao.module.ai.controller.admin.model.vo.model.AiModelRespVO;
-import cn.iocoder.yudao.module.ai.dal.dataobject.model.AiApiKeyDO;
-import cn.iocoder.yudao.module.ai.service.model.AiApiKeyService;
-import io.swagger.v3.oas.annotations.Operation;
-import io.swagger.v3.oas.annotations.Parameter;
-import io.swagger.v3.oas.annotations.tags.Tag;
-import jakarta.annotation.Resource;
-import jakarta.validation.Valid;
-import org.springframework.security.access.prepost.PreAuthorize;
-import org.springframework.validation.annotation.Validated;
-import org.springframework.web.bind.annotation.*;
-
-import java.util.List;
-
-import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
-import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList;
-
-@Tag(name = "管理后台 - AI API 密钥")
-@RestController
-@RequestMapping("/ai/api-key")
-@Validated
-public class AiApiKeyController {
-
- @Resource
- private AiApiKeyService apiKeyService;
-
- @PostMapping("/create")
- @Operation(summary = "创建 API 密钥")
- @PreAuthorize("@ss.hasPermission('ai:api-key:create')")
- public CommonResult createApiKey(@Valid @RequestBody AiApiKeySaveReqVO createReqVO) {
- return success(apiKeyService.createApiKey(createReqVO));
- }
-
- @PutMapping("/update")
- @Operation(summary = "更新 API 密钥")
- @PreAuthorize("@ss.hasPermission('ai:api-key:update')")
- public CommonResult updateApiKey(@Valid @RequestBody AiApiKeySaveReqVO updateReqVO) {
- apiKeyService.updateApiKey(updateReqVO);
- return success(true);
- }
-
- @DeleteMapping("/delete")
- @Operation(summary = "删除 API 密钥")
- @Parameter(name = "id", description = "编号", required = true)
- @PreAuthorize("@ss.hasPermission('ai:api-key:delete')")
- public CommonResult deleteApiKey(@RequestParam("id") Long id) {
- apiKeyService.deleteApiKey(id);
- return success(true);
- }
-
- @GetMapping("/get")
- @Operation(summary = "获得 API 密钥")
- @Parameter(name = "id", description = "编号", required = true, example = "1024")
- @PreAuthorize("@ss.hasPermission('ai:api-key:query')")
- public CommonResult getApiKey(@RequestParam("id") Long id) {
- AiApiKeyDO apiKey = apiKeyService.getApiKey(id);
- return success(BeanUtils.toBean(apiKey, AiApiKeyRespVO.class));
- }
-
- @GetMapping("/page")
- @Operation(summary = "获得 API 密钥分页")
- @PreAuthorize("@ss.hasPermission('ai:api-key:query')")
- public CommonResult> getApiKeyPage(@Valid AiApiKeyPageReqVO pageReqVO) {
- PageResult pageResult = apiKeyService.getApiKeyPage(pageReqVO);
- return success(BeanUtils.toBean(pageResult, AiApiKeyRespVO.class));
- }
-
- @GetMapping("/simple-list")
- @Operation(summary = "获得 API 密钥分页列表")
- public CommonResult> getApiKeySimpleList() {
- List list = apiKeyService.getApiKeyList();
- return success(convertList(list, key -> new AiModelRespVO().setId(key.getId()).setName(key.getName())));
- }
-
-}
\ No newline at end of file
diff --git a/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/model/AiChatRoleController.java b/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/model/AiChatRoleController.java
deleted file mode 100644
index 804e2115276127b7b51b510c1b30308b5e837b5a..0000000000000000000000000000000000000000
--- a/yudao-module-ai/src/main/java/cn/iocoder/yudao/module/ai/controller/admin/model/AiChatRoleController.java
+++ /dev/null
@@ -1,128 +0,0 @@
-package cn.iocoder.yudao.module.ai.controller.admin.model;
-
-import cn.hutool.core.util.ObjUtil;
-import cn.iocoder.yudao.framework.common.pojo.CommonResult;
-import cn.iocoder.yudao.framework.common.pojo.PageResult;
-import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
-import cn.iocoder.yudao.module.ai.controller.admin.model.vo.chatRole.AiChatRolePageReqVO;
-import cn.iocoder.yudao.module.ai.controller.admin.model.vo.chatRole.AiChatRoleRespVO;
-import cn.iocoder.yudao.module.ai.controller.admin.model.vo.chatRole.AiChatRoleSaveMyReqVO;
-import cn.iocoder.yudao.module.ai.controller.admin.model.vo.chatRole.AiChatRoleSaveReqVO;
-import cn.iocoder.yudao.module.ai.dal.dataobject.model.AiChatRoleDO;
-import cn.iocoder.yudao.module.ai.service.model.AiChatRoleService;
-import com.fhs.core.trans.anno.TransMethodResult;
-import io.swagger.v3.oas.annotations.Operation;
-import io.swagger.v3.oas.annotations.Parameter;
-import io.swagger.v3.oas.annotations.tags.Tag;
-import jakarta.annotation.Resource;
-import jakarta.validation.Valid;
-import org.springframework.security.access.prepost.PreAuthorize;
-import org.springframework.validation.annotation.Validated;
-import org.springframework.web.bind.annotation.*;
-
-import java.util.List;
-
-import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
-import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId;
-
-@Tag(name = "管理后台 - AI 聊天角色")
-@RestController
-@RequestMapping("/ai/chat-role")
-@Validated
-public class AiChatRoleController {
-
- @Resource
- private AiChatRoleService chatRoleService;
-
- @GetMapping("/my-page")
- @Operation(summary = "获得【我的】聊天角色分页")
- @TransMethodResult
- public CommonResult> getChatRoleMyPage(@Valid AiChatRolePageReqVO pageReqVO) {
- PageResult pageResult = chatRoleService.getChatRoleMyPage(pageReqVO, getLoginUserId());
- return success(BeanUtils.toBean(pageResult, AiChatRoleRespVO.class));
- }
-
- @GetMapping("/get-my")
- @Operation(summary = "获得【我的】聊天角色")
- @Parameter(name = "id", description = "编号", required = true, example = "1024")
- @TransMethodResult
- public CommonResult getChatRoleMy(@RequestParam("id") Long id) {
- AiChatRoleDO chatRole = chatRoleService.getChatRole(id);
- if (ObjUtil.notEqual(chatRole.getUserId(), getLoginUserId())) {
- return success(null);
- }
- return success(BeanUtils.toBean(chatRole, AiChatRoleRespVO.class));
- }
-
- @PostMapping("/create-my")
- @Operation(summary = "创建【我的】聊天角色")
- public CommonResult createChatRoleMy(@Valid @RequestBody AiChatRoleSaveMyReqVO createReqVO) {
- return success(chatRoleService.createChatRoleMy(createReqVO, getLoginUserId()));
- }
-
- @PutMapping("/update-my")
- @Operation(summary = "更新【我的】聊天角色")
- public CommonResult