Переглянути джерело

bug修复,跟前端联调

zhangenzhi 1 місяць тому
батько
коміт
41acc376df
28 змінених файлів з 432 додано та 158 видалено
  1. BIN
      logs/2025-05-29/pavis-admin.2025-05-29.0.log.gz
  2. 148 0
      logs/pavis-admin.log
  3. 0 5
      pavis-common/.flattened-pom.xml
  4. 9 3
      pavis-module-aigc/pom.xml
  5. 0 1
      pavis-module-aigc/src/main/java/com/pavis/admin/aigc/model/req/KnowledgeReq.java
  6. 0 1
      pavis-module-aigc/src/main/java/com/pavis/admin/aigc/model/resp/KnowledgeDetailResp.java
  7. 0 1
      pavis-module-aigc/src/main/java/com/pavis/admin/aigc/model/resp/KnowledgeResp.java
  8. 1 0
      pavis-module-aigc/src/main/java/com/pavis/admin/aigc/service/impl/AigcAppServiceImpl.java
  9. 8 7
      pavis-module-aigc/src/main/java/com/pavis/admin/aigc/service/impl/DocServiceImpl.java
  10. 0 10
      pavis-module-aigc/src/main/java/com/pavis/admin/aigc/service/impl/EmbedStoreServiceImpl.java
  11. 6 6
      pavis-module-aigc/src/main/java/com/pavis/admin/aigc/service/impl/KnowledgeServiceImpl.java
  12. 15 17
      pavis-module-aigc/src/main/java/com/pavis/admin/aigc/service/impl/PvsChatServiceImpl.java
  13. 6 1
      pavis-module-system/src/main/java/com/pavis/admin/auth/AbstractLoginHandler.java
  14. 48 1
      pavis-module-system/src/main/java/com/pavis/admin/auth/handler/PhoneLoginHandler.java
  15. 5 0
      pavis-module-system/src/main/java/com/pavis/admin/system/model/entity/user/UserDO.java
  16. 8 0
      pavis-module-system/src/main/java/com/pavis/admin/system/model/query/UserQuery.java
  17. 7 1
      pavis-module-system/src/main/java/com/pavis/admin/system/model/req/user/UserReq.java
  18. 6 0
      pavis-module-system/src/main/java/com/pavis/admin/system/model/resp/user/UserResp.java
  19. 5 0
      pavis-webapi/.flattened-pom.xml
  20. 22 22
      pavis-webapi/src/main/java/com/pavis/admin/config/satoken/SaTokenConfiguration.java
  21. 0 1
      pavis-webapi/src/main/java/com/pavis/admin/controller/aigc/AigcAppController.java
  22. 1 2
      pavis-webapi/src/main/java/com/pavis/admin/controller/aigc/DocController.java
  23. 67 27
      pavis-webapi/src/main/java/com/pavis/admin/controller/common/CaptchaController.java
  24. 44 35
      pavis-webapi/src/main/resources/config/application-prod.yml
  25. 6 6
      pavis-webapi/src/main/resources/db/changelog/db.changelog-master.yaml
  26. 4 4
      pavis-webapi/src/main/resources/db/changelog/mysql/main_data.sql
  27. 4 2
      pavis-webapi/src/main/resources/db/changelog/mysql/main_table.sql
  28. 12 5
      pavis-webapi/src/main/resources/logback-spring.xml

BIN
logs/2025-05-29/pavis-admin.2025-05-29.0.log.gz


+ 148 - 0
logs/pavis-admin.log

@@ -0,0 +1,148 @@
+2025-06-23 14:27:13 INFO  [background-preinit] org.hibernate.validator.internal.util.Version - HV000001: Hibernate Validator 8.0.2.Final
+2025-06-23 14:27:13 INFO  [main] com.pavis.admin.PavisAdminApplication - Starting PavisAdminApplication using Java 17.0.3.1 with PID 15628 (D:\privacy\pvsai-admin\pvs-ai\pavis-admin\pavis-webapi\target\classes started by Administrator in D:\privacy\pvsai-admin\pvs-ai\pavis-admin)
+2025-06-23 14:27:13 INFO  [main] com.pavis.admin.PavisAdminApplication - The following 2 profiles are active: "generator", "prod"
+2025-06-23 14:27:16 INFO  [main] o.s.d.r.config.RepositoryConfigurationDelegate - Multiple Spring Data modules found, entering strict repository configuration mode
+2025-06-23 14:27:16 INFO  [main] o.s.d.r.config.RepositoryConfigurationDelegate - Bootstrapping Spring Data Redis repositories in DEFAULT mode.
+2025-06-23 14:27:16 INFO  [main] o.s.d.r.config.RepositoryConfigurationDelegate - Finished Spring Data repository scanning in 75 ms. Found 0 Redis repository interfaces.
+2025-06-23 14:27:16 WARN  [main] org.mybatis.spring.mapper.ClassPathMapperScanner - No MyBatis mapper was found in '[com.pavis.admin]' package. Please check your configuration.
+2025-06-23 14:27:17 INFO  [main] o.springframework.cloud.context.scope.GenericScope - BeanFactory id=e0e388cd-42de-3dd0-acb8-3d19a5624f78
+2025-06-23 14:27:17 WARN  [main] o.s.c.s.PostProcessorRegistrationDelegate$BeanPostProcessorChecker - Bean 'cn.crane4j.spring.boot.config.Crane4jAutoConfiguration' of type [cn.crane4j.spring.boot.config.Crane4jAutoConfiguration] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying). The currently created BeanPostProcessor [namedComponentAliasProcessor] is declared through a non-static factory method on that class; consider declaring it as static instead.
+2025-06-23 14:27:17 DEBUG [main] t.c.s.e.c.a.CrudRestControllerAutoConfiguration - [ContiNew Starter] - Auto Configuration 'Extension-CRUD REST Controller' completed initialization.
+2025-06-23 14:27:17 WARN  [main] o.s.c.s.PostProcessorRegistrationDelegate$BeanPostProcessorChecker - Bean 'top.continew.starter.extension.crud.autoconfigure.CrudRestControllerAutoConfiguration' of type [top.continew.starter.extension.crud.autoconfigure.CrudRestControllerAutoConfiguration] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying). Is this bean getting eagerly injected/applied to a currently created BeanPostProcessor [namedComponentAliasProcessor]? Check the corresponding BeanPostProcessor declaration and its dependencies/advisors. If this bean does not have to be post-processed, declare it with ROLE_INFRASTRUCTURE.
+2025-06-23 14:27:17 WARN  [main] o.s.c.s.PostProcessorRegistrationDelegate$BeanPostProcessorChecker - Bean 'crudApiAnnotationInterceptor' of type [top.continew.starter.extension.crud.aop.CrudApiAnnotationInterceptor] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying). Is this bean getting eagerly injected/applied to a currently created BeanPostProcessor [namedComponentAliasProcessor]? Check the corresponding BeanPostProcessor declaration and its dependencies/advisors. If this bean does not have to be post-processed, declare it with ROLE_INFRASTRUCTURE.
+2025-06-23 14:27:17 WARN  [main] o.s.c.s.PostProcessorRegistrationDelegate$BeanPostProcessorChecker - Bean 'crudApiAnnotationAdvisor' of type [top.continew.starter.extension.crud.aop.CrudApiAnnotationAdvisor] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying). Is this bean getting eagerly injected/applied to a currently created BeanPostProcessor [namedComponentAliasProcessor]? Check the corresponding BeanPostProcessor declaration and its dependencies/advisors. If this bean does not have to be post-processed, declare it with ROLE_INFRASTRUCTURE.
+2025-06-23 14:27:17 WARN  [main] o.s.c.s.PostProcessorRegistrationDelegate$BeanPostProcessorChecker - Bean 'com.alicp.jetcache.anno.config.JetCacheProxyConfiguration' of type [com.alicp.jetcache.anno.config.JetCacheProxyConfiguration$$SpringCGLIB$$0] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying). Is this bean getting eagerly injected/applied to a currently created BeanPostProcessor [namedComponentAliasProcessor]? Check the corresponding BeanPostProcessor declaration and its dependencies/advisors. If this bean does not have to be post-processed, declare it with ROLE_INFRASTRUCTURE.
+2025-06-23 14:27:17 WARN  [main] o.s.c.s.PostProcessorRegistrationDelegate$BeanPostProcessorChecker - Bean 'com.alicp.jetcache.anno.config.CommonConfiguration' of type [com.alicp.jetcache.anno.config.CommonConfiguration$$SpringCGLIB$$0] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying). Is this bean getting eagerly injected/applied to a currently created BeanPostProcessor [namedComponentAliasProcessor]? Check the corresponding BeanPostProcessor declaration and its dependencies/advisors. If this bean does not have to be post-processed, declare it with ROLE_INFRASTRUCTURE.
+2025-06-23 14:27:18 INFO  [main] o.s.boot.web.embedded.tomcat.TomcatWebServer - Tomcat initialized with port 8080 (http)
+2025-06-23 14:27:18 INFO  [main] org.apache.coyote.http11.Http11NioProtocol - Initializing ProtocolHandler ["http-nio-8080"]
+2025-06-23 14:27:18 INFO  [main] org.apache.catalina.core.StandardService - Starting service [Tomcat]
+2025-06-23 14:27:18 INFO  [main] org.apache.catalina.core.StandardEngine - Starting Servlet engine: [Apache Tomcat/10.1.40]
+2025-06-23 14:27:18 INFO  [main] o.a.c.core.ContainerBase.[Tomcat].[localhost].[/] - Initializing Spring embedded WebApplicationContext
+2025-06-23 14:27:18 INFO  [main] o.s.b.w.s.c.ServletWebServerApplicationContext - Root WebApplicationContext: initialization completed in 4577 ms
+2025-06-23 14:27:18 DEBUG [main] t.c.s.d.m.a.MybatisPlusAutoConfiguration - [ContiNew Starter] - Auto Configuration 'MyBatis Plus' completed initialization.
+2025-06-23 14:27:18 DEBUG [main] t.c.s.e.d.a.DataPermissionAutoConfiguration - [ContiNew Starter] - Auto Configuration 'DataPermission' completed initialization.
+2025-06-23 14:27:18 DEBUG [main] t.c.s.s.c.autoconfigure.CryptoAutoConfiguration - [ContiNew Starter] - Auto Configuration 'Security-Crypto' completed initialization.
+2025-06-23 14:27:19 DEBUG [main] t.c.s.d.m.a.i.MyBatisPlusIdGeneratorConfiguration - [ContiNew Starter] - Auto Configuration 'MyBatis Plus-IdGenerator-CosId' completed initialization.
+2025-06-23 14:27:19 WARN  [main] c.b.mybatisplus.core.injector.DefaultSqlInjector - class com.pavis.admin.system.model.entity.MessageUserDO ,Not found @TableId annotation, Cannot use Mybatis-Plus 'xxById' Method.
+2025-06-23 14:27:19 WARN  [main] c.b.mybatisplus.core.injector.DefaultSqlInjector - class com.pavis.admin.system.model.entity.RoleMenuDO ,Not found @TableId annotation, Cannot use Mybatis-Plus 'xxById' Method.
+2025-06-23 14:27:22 INFO  [main] com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Starting...
+2025-06-23 14:27:33 INFO  [main] com.zaxxer.hikari.pool.HikariPool - HikariPool-1 - Added connection com.mysql.cj.jdbc.ConnectionImpl@6eaa8abf
+2025-06-23 14:27:33 INFO  [main] com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Start completed.
+2025-06-23 14:27:34 INFO  [main] liquibase.changelog - Reading from pavis_admin.databasechangelog
+2025-06-23 14:27:34 INFO  [main] liquibase.ui - Database is up to date, no changesets to execute
+2025-06-23 14:27:34 INFO  [main] liquibase.changelog - Reading from pavis_admin.databasechangelog
+2025-06-23 14:27:34 INFO  [main] liquibase.util - UPDATE SUMMARY
+2025-06-23 14:27:34 INFO  [main] liquibase.util - Run:                          0
+2025-06-23 14:27:34 INFO  [main] liquibase.util - Previously run:               5
+2025-06-23 14:27:34 INFO  [main] liquibase.util - Filtered out:                 0
+2025-06-23 14:27:34 INFO  [main] liquibase.util - -------------------------------
+2025-06-23 14:27:34 INFO  [main] liquibase.util - Total change sets:            5
+2025-06-23 14:27:34 INFO  [main] liquibase.util - Update summary generated
+2025-06-23 14:27:34 INFO  [main] liquibase.lockservice - Successfully released change log lock
+2025-06-23 14:27:34 INFO  [main] liquibase.command - Command execution complete
+2025-06-23 14:27:35 DEBUG [main] t.c.s.trace.autoconfigure.TraceAutoConfiguration - [ContiNew Starter] - Auto Configuration 'Trace' completed initialization.
+2025-06-23 14:27:35 DEBUG [main] t.c.starter.log.autoconfigure.LogAutoConfiguration - [ContiNew Starter] - Auto Configuration 'Log-Interceptor' completed initialization.
+2025-06-23 14:27:35 DEBUG [main] t.c.s.web.autoconfigure.cors.CorsAutoConfiguration - [ContiNew Starter] - Auto Configuration 'Web-CorsFilter' completed initialization.
+2025-06-23 14:27:35 DEBUG [main] top.continew.starter.log.filter.LogFilter - Filter 'logFilter' configured for use
+2025-06-23 14:27:35 DEBUG [main] t.c.s.j.j.autoconfigure.JacksonAutoConfiguration - [ContiNew Starter] - Auto Configuration 'Jackson' completed initialization.
+2025-06-23 14:27:36 INFO  [main] c.pavis.admin.aigc.service.impl.AigcAppServiceImpl - initialize app config list...
+2025-06-23 14:27:37 DEBUG [main] t.c.s.s.p.a.PasswordEncoderAutoConfiguration - [ContiNew Starter] - Auto Configuration 'Security-PasswordEncoder' completed initialization.
+2025-06-23 14:27:37 WARN  [main] c.b.mybatisplus.core.injector.DefaultSqlInjector - class com.pavis.admin.system.model.entity.RoleDeptDO ,Not found @TableId annotation, Cannot use Mybatis-Plus 'xxById' Method.
+2025-06-23 14:27:37 DEBUG [main] t.c.s.c.a.threadpool.ThreadPoolAutoConfiguration - [ContiNew Starter] - Auto Configuration 'TaskExecutor' completed initialization.
+2025-06-23 14:27:38 INFO  [main] c.anji.captcha.service.impl.CaptchaServiceFactory - supported-captchaCache-service:[local]
+2025-06-23 14:27:38 INFO  [main] c.anji.captcha.service.impl.CaptchaServiceFactory - supported-captchaTypes-service:[clickWord, default, blockPuzzle]
+2025-06-23 14:27:38 DEBUG [main] t.c.s.c.b.a.c.BehaviorCaptchaCacheAutoConfiguration - [ContiNew Starter] - Auto Configuration 'Captcha-Behavior-Cache-Redis' completed initialization.
+2025-06-23 14:27:38 DEBUG [main] t.c.s.c.b.a.BehaviorCaptchaAutoConfiguration - [ContiNew Starter] - Auto Configuration 'Captcha-Behavior' completed initialization.
+2025-06-23 14:27:38 INFO  [main] com.anji.captcha.util.ImageUtils - 初始化底图:[SLIDING_BLOCK=[Ljava.lang.String;@7adc8212, ROTATE=[Ljava.lang.String;@6b50017c, ORIGINAL=[Ljava.lang.String;@470c40be, PIC_CLICK=[Ljava.lang.String;@652a16a8, ROTATE_BLOCK=[Ljava.lang.String;@7b78c40d]
+2025-06-23 14:27:38 INFO  [main] c.a.c.service.impl.BlockPuzzleCaptchaServiceImpl - --->>>初始化验证码底图<<<---blockPuzzle
+2025-06-23 14:27:38 DEBUG [main] t.c.s.c.g.a.GraphicCaptchaAutoConfiguration - [ContiNew Starter] - Auto Configuration 'Captcha-Graphic' completed initialization.
+2025-06-23 14:27:38 DEBUG [main] t.c.s.a.autoconfigure.SpringDocAutoConfiguration - [ContiNew Starter] - Auto Configuration 'ApiDoc' completed initialization.
+2025-06-23 14:27:38 DEBUG [main] t.c.s.a.s.autoconfigure.SaTokenAutoConfiguration - [ContiNew Starter] - Auto Configuration 'SaToken' completed initialization.
+2025-06-23 14:27:38 DEBUG [main] t.c.s.w.autoconfigure.mvc.WebMvcAutoConfiguration - [ContiNew Starter] - Auto Configuration 'Web MVC' completed initialization.
+2025-06-23 14:27:39 DEBUG [main] t.c.s.a.j.autoconfigure.JustAuthAutoConfiguration - [ContiNew Starter] - Auto Configuration 'JustAuth' completed initialization.
+2025-06-23 14:27:39 DEBUG [main] t.c.s.a.j.autoconfigure.JustAuthAutoConfiguration - [ContiNew Starter] - Auto Configuration 'JustAuth-AuthStateCache-Redis' completed initialization.
+2025-06-23 14:27:39 INFO  [main] c.a.s.c.j.c.e.b.AbstractScriptExecutor$SnailFileUtils - [FileUtils] [workspace] use user.home as workspace: C:\Users\Administrator/snailJob/worker
+2025-06-23 14:27:39 DEBUG [main] t.c.s.w.a.response.GlobalResponseAutoConfiguration - [ContiNew Starter] - Auto Configuration 'Web-Global Response' completed initialization.
+2025-06-23 14:27:39 DEBUG [main] t.c.s.e.c.a.CrudRequestMappingHandlerMapping - 279 mappings in 'requestMappingHandlerMapping'
+2025-06-23 14:27:40 INFO  [main] c.c.extension.spring.Crane4jApplicationContext - install container lifecycle processor [containerInstanceLifecycleProcessor]
+2025-06-23 14:27:40 INFO  [main] c.c.extension.spring.Crane4jApplicationContext - install container lifecycle processor [containerRegisterLogger]
+2025-06-23 14:27:40 INFO  [main] c.c.extension.spring.Crane4jApplicationContext - install container lifecycle processor [springCacheableContainerProcessor]
+2025-06-23 14:27:40 INFO  [main] c.c.extension.spring.BeanMethodContainerRegistrar - register method container factory [cn.crane4j.core.support.container.CacheableMethodContainerFactory] with name [cacheableMethodContainerFactory]
+2025-06-23 14:27:40 DEBUG [main] t.c.s.a.s.a.dao.SaTokenDaoConfiguration - [ContiNew Starter] - Auto Configuration 'SaToken-Dao-Redis' completed initialization.
+2025-06-23 14:27:40 DEBUG [main] t.c.s.c.r.autoconfigure.RedissonAutoConfiguration - [ContiNew Starter] - Auto Configuration 'Redisson' completed initialization.
+2025-06-23 14:27:40 INFO  [main] org.redisson.Version - Redisson 3.46.0
+2025-06-23 14:27:40 INFO  [redisson-netty-3-4] org.redisson.connection.ConnectionsHolder - 1 connections initialized for 192.168.1.202/192.168.1.202:6388
+2025-06-23 14:27:41 INFO  [redisson-netty-3-19] org.redisson.connection.ConnectionsHolder - 24 connections initialized for 192.168.1.202/192.168.1.202:6388
+2025-06-23 14:27:41 INFO  [main] c.a.jetcache.autoconfigure.AbstractCacheAutoInit - init cache area default , type= caffeine
+2025-06-23 14:27:41 INFO  [main] c.a.jetcache.autoconfigure.AbstractCacheAutoInit - init cache area default , type= redisson
+2025-06-23 14:27:41 INFO  [main] m.a.c.spring.redis.SpringRedisMachineIdDistributor - Distribute Remote instanceId:[InstanceId{instanceId=192.168.1.166:15628, stable=false}] - machineBit:[10] @ namespace:[pavis-admin].
+2025-06-23 14:27:41 INFO  [main] m.a.c.spring.redis.SpringRedisMachineIdDistributor - Distribute Remote machineState:[MachineState{machineId=1, lastTimeStamp=1750660061544}] - instanceId:[InstanceId{instanceId=192.168.1.166:15628, stable=false}] - machineBit:[10] @ namespace:[pavis-admin].
+2025-06-23 14:27:42 DEBUG [main] t.c.s.c.j.autoconfigure.JetCacheAutoConfiguration - [ContiNew Starter] - Auto Configuration 'JetCache' completed initialization.
+2025-06-23 14:27:42 DEBUG [main] t.c.s.c.autoconfigure.ValidatorAutoConfiguration - [ContiNew Starter] - Auto Configuration 'Validator' completed initialization.
+2025-06-23 14:27:42 DEBUG [main] t.c.s.m.mail.autoconfigure.MailAutoConfiguration - [ContiNew Starter] - Auto Configuration 'Mail' completed initialization.
+2025-06-23 14:27:42 DEBUG [main] t.c.s.m.w.autoconfigure.WebSocketAutoConfiguration - [ContiNew Starter] - Auto Configuration 'Messaging-WebSocket' completed initialization.
+2025-06-23 14:27:42 DEBUG [main] t.c.s.r.autoconfigure.RateLimiterAutoConfiguration - [ContiNew Starter] - Auto Configuration 'RateLimiter' completed initialization.
+2025-06-23 14:27:43 INFO  [main] c.c.extension.spring.Crane4jApplicationContext - register container provider [crane4jApplicationContext] from spring context
+2025-06-23 14:27:43 INFO  [main] c.c.extension.spring.Crane4jApplicationContext - register property mapping strategy manager [joinAsStringMappingStrategy](cn.crane4j.core.parser.handler.strategy.CollJoinAsStringMappingStrategy@6d2a92c2) from spring context
+2025-06-23 14:27:43 INFO  [main] c.c.extension.spring.Crane4jApplicationContext - register property mapping strategy manager [overwriteNotNullMappingStrategy](cn.crane4j.core.parser.handler.strategy.OverwriteNotNullMappingStrategy@6659e7f5) from spring context
+2025-06-23 14:27:43 INFO  [main] c.c.extension.spring.Crane4jApplicationContext - register property mapping strategy manager [overwriteMappingStrategy](cn.crane4j.core.parser.handler.strategy.OverwriteMappingStrategy@1b0cfe11) from spring context
+2025-06-23 14:27:43 INFO  [main] c.c.extension.spring.Crane4jApplicationContext - register property mapping strategy manager [referenceMappingStrategy](cn.crane4j.core.parser.handler.strategy.ReferenceMappingStrategy@681ae1ce) from spring context
+2025-06-23 14:27:43 INFO  [main] c.c.c.s.container.MethodInvokerContainerCreator - create method invoker container [UserRoleNameList] for method [public java.util.List com.pavis.admin.system.service.impl.RoleServiceImpl.listNameByIds(java.util.List)], mapping type is [ORDER_OF_KEYS]
+2025-06-23 14:27:43 INFO  [main] c.c.c.s.container.MethodInvokerContainerCreator - create method invoker container [UserRoleIdList] for method [public java.util.List com.pavis.admin.system.service.impl.UserRoleServiceImpl.listRoleIdByUserId(java.lang.Long)], mapping type is [ORDER_OF_KEYS]
+2025-06-23 14:27:43 INFO  [main] c.c.c.s.container.MethodInvokerContainerCreator - create method invoker container [UserNickname] for method [public abstract java.lang.String com.pavis.admin.common.service.CommonUserService.getNicknameById(java.lang.Long)], mapping type is [ORDER_OF_KEYS]
+2025-06-23 14:27:43 DEBUG [main] t.c.s.j.j.autoconfigure.JacksonAutoConfiguration - [ContiNew Starter] - Auto Configuration 'Jackson' completed initialization.
+2025-06-23 14:27:43 DEBUG [main] t.c.s.c.a.threadpool.AsyncAutoConfiguration - [ContiNew Starter] - Auto Configuration 'AsyncConfigurer' completed initialization.
+2025-06-23 14:27:43 INFO  [main] org.apache.coyote.http11.Http11NioProtocol - Starting ProtocolHandler ["http-nio-8080"]
+2025-06-23 14:27:43 INFO  [main] o.s.boot.web.embedded.tomcat.TomcatWebServer - Tomcat started on port 8080 (http) with context path '/'
+2025-06-23 14:27:43 INFO  [main] com.pavis.admin.PavisAdminApplication - Started PavisAdminApplication in 31.278 seconds (process running for 32.243)
+2025-06-23 14:27:43 INFO  [main] c.c.s.b.c.Crane4jAutoConfiguration$Crane4jInitializer - crane4j component initialization completed.
+2025-06-23 14:27:43 INFO  [main] o.d.x.file.storage.core.FileStorageServiceBuilder - 加载本地升级版存储平台:local_dev
+2025-06-23 14:27:43 INFO  [main] c.a.s.client.common.init.SnailJobStartListener - snail-job client is preparing to start... v1.4.0
+2025-06-23 14:27:43 INFO  [main] o.s.b.a.logging.ConditionEvaluationReportLogger - 
+
+Error starting ApplicationContext. To display the condition evaluation report re-run your application with 'debug' enabled.
+2025-06-23 14:27:43 ERROR [main] org.springframework.boot.SpringApplication - Application run failed
+java.lang.NoClassDefFoundError: io/grpc/InternalGlobalInterceptors
+	at io.grpc.internal.ServerImplBuilder.getTracerFactories(ServerImplBuilder.java:252)
+	at io.grpc.internal.ServerImplBuilder.build(ServerImplBuilder.java:243)
+	at io.grpc.ForwardingServerBuilder.build(ForwardingServerBuilder.java:201)
+	at com.aizuda.snailjob.client.common.rpc.server.SnailGrpcServer.start(SnailGrpcServer.java:80)
+	at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)
+	at com.aizuda.snailjob.client.common.init.SnailJobStartListener.run(SnailJobStartListener.java:40)
+	at org.springframework.boot.SpringApplication.lambda$callRunner$4(SpringApplication.java:787)
+	at org.springframework.util.function.ThrowingConsumer$1.acceptWithException(ThrowingConsumer.java:82)
+	at org.springframework.util.function.ThrowingConsumer.accept(ThrowingConsumer.java:60)
+	at org.springframework.util.function.ThrowingConsumer$1.accept(ThrowingConsumer.java:86)
+	at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:799)
+	at org.springframework.boot.SpringApplication.callRunner(SpringApplication.java:787)
+	at org.springframework.boot.SpringApplication.lambda$callRunners$3(SpringApplication.java:775)
+	at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.accept(ForEachOps.java:183)
+	at java.base/java.util.stream.SortedOps$SizedRefSortingSink.end(SortedOps.java:357)
+	at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:510)
+	at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499)
+	at java.base/java.util.stream.ForEachOps$ForEachOp.evaluateSequential(ForEachOps.java:150)
+	at java.base/java.util.stream.ForEachOps$ForEachOp$OfRef.evaluateSequential(ForEachOps.java:173)
+	at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
+	at java.base/java.util.stream.ReferencePipeline.forEach(ReferencePipeline.java:596)
+	at org.springframework.boot.SpringApplication.callRunners(SpringApplication.java:775)
+	at org.springframework.boot.SpringApplication.run(SpringApplication.java:342)
+	at org.springframework.boot.SpringApplication.run(SpringApplication.java:1364)
+	at org.springframework.boot.SpringApplication.run(SpringApplication.java:1353)
+	at com.pavis.admin.PavisAdminApplication.main(PavisAdminApplication.java:48)
+Caused by: java.lang.ClassNotFoundException: io.grpc.InternalGlobalInterceptors
+	at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:641)
+	at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:188)
+	at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:520)
+	... 26 common frames omitted
+2025-06-23 14:27:43 INFO  [main] c.a.s.client.common.init.SnailJobCloseListener - snail-job client about to shutdown v1.4.0
+2025-06-23 14:27:44 INFO  [main] c.aizuda.snailjob.client.core.report.AsyncReport - AsyncReport about to shutdown
+2025-06-23 14:27:44 INFO  [main] c.aizuda.snailjob.client.core.report.AsyncReport - AsyncReport has been shutdown
+2025-06-23 14:27:44 INFO  [main] c.a.s.client.common.init.SnailJobCloseListener - snail-job client closed successfully v1.4.0
+2025-06-23 14:27:44 INFO  [main] m.a.c.spring.redis.SpringRedisMachineIdDistributor - Revert Remote [MachineState{machineId=1, lastTimeStamp=1750660064023}] instanceId:[InstanceId{instanceId=192.168.1.166:15628, stable=false}] @ namespace:[pavis-admin].
+2025-06-23 14:27:44 INFO  [main] c.c.extension.spring.Crane4jApplicationContext - global configuration has been destroyed.
+2025-06-23 14:27:44 INFO  [main] cn.crane4j.core.container.DefaultContainerManager - clear all cache for container manager
+2025-06-23 14:27:44 INFO  [main] o.dromara.x.file.storage.core.FileStorageService - 销毁存储平台 local_dev 成功
+2025-06-23 14:27:44 INFO  [main] com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Shutdown initiated...
+2025-06-23 14:27:54 INFO  [main] com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Shutdown completed.
+2025-06-23 14:27:54 WARN  [main] o.s.beans.factory.support.DisposableBeanAdapter - Invocation of destroy method failed on bean with name 'methodResultAutoOperateAdvisor': org.springframework.beans.factory.BeanCreationNotAllowedException: Error creating bean with name 'methodResultAutoOperateSupport': Singleton bean creation not allowed while singletons of this factory are in destruction (Do not request a bean from a BeanFactory in a destroy method implementation!)
+2025-06-23 14:27:54 WARN  [main] o.s.beans.factory.support.DisposableBeanAdapter - Invocation of destroy method failed on bean with name 'methodArgumentAutoOperateAdvisor': org.springframework.beans.factory.BeanCreationNotAllowedException: Error creating bean with name 'argAutoOperateProxyMethodFactory': Singleton bean creation not allowed while singletons of this factory are in destruction (Do not request a bean from a BeanFactory in a destroy method implementation!)

+ 0 - 5
pavis-common/.flattened-pom.xml

@@ -45,11 +45,6 @@
       <groupId>top.continew</groupId>
       <artifactId>continew-starter-extension-crud-mp</artifactId>
     </dependency>
-    <dependency>
-      <groupId>cn.dev33</groupId>
-      <artifactId>sa-token-spring-boot3-starter</artifactId>
-      <version>1.37.0</version>
-    </dependency>
     <dependency>
       <groupId>top.continew</groupId>
       <artifactId>continew-starter-auth-satoken</artifactId>

+ 9 - 3
pavis-module-aigc/pom.xml

@@ -30,6 +30,12 @@
             <artifactId>spring-ai-starter-model-openai</artifactId>
             <version>${spring-ai.version}</version>
         </dependency>
+
+<!--        <dependency>-->
+<!--            <groupId>org.apache.tika</groupId>-->
+<!--            <artifactId>tika-parsers</artifactId>-->
+<!--            <version>3.0.0</version>-->
+<!--        </dependency>-->
         
         <dependency>
             <groupId>org.springframework.ai</groupId>
@@ -53,17 +59,17 @@
         <dependency>
             <groupId>dev.langchain4j</groupId>
             <artifactId>langchain4j</artifactId>
-            <version>${langchain4j-core.version}</version>
+            <version>${langchain4j.version}</version>
         </dependency>
         <dependency>
             <groupId>dev.langchain4j</groupId>
             <artifactId>langchain4j-core</artifactId>
-            <version>${langchain4j-core.version}</version>
+            <version>${langchain4j.version}</version>
         </dependency>
         <dependency>
             <groupId>dev.langchain4j</groupId>
             <artifactId>langchain4j-open-ai</artifactId>
-            <version>${langchain4j-core.version}</version>
+            <version>${langchain4j.version}</version>
         </dependency>
         <dependency>
             <groupId>dev.langchain4j</groupId>

+ 0 - 1
pavis-module-aigc/src/main/java/com/pavis/admin/aigc/model/req/KnowledgeReq.java

@@ -53,7 +53,6 @@ public class KnowledgeReq implements Serializable {
     @NotNull(message = "关联向量存储ID不能为空")
     private Long embedStoreId;
 
-
     /**
      * 知识库描述
      */

+ 0 - 1
pavis-module-aigc/src/main/java/com/pavis/admin/aigc/model/resp/KnowledgeDetailResp.java

@@ -143,7 +143,6 @@ public class KnowledgeDetailResp extends BaseDetailResp {
     @ExcelProperty(value = "平均检索相关度")
     private BigDecimal avgRelevance;
 
-
     /**
      * 知识库描述
      */

+ 0 - 1
pavis-module-aigc/src/main/java/com/pavis/admin/aigc/model/resp/KnowledgeResp.java

@@ -139,7 +139,6 @@ public class KnowledgeResp extends BaseResp {
 
     private ModelResp embedModel;
 
-
     /**
      * 知识库描述
      */

+ 1 - 0
pavis-module-aigc/src/main/java/com/pavis/admin/aigc/service/impl/AigcAppServiceImpl.java

@@ -37,6 +37,7 @@ import jakarta.annotation.PostConstruct;
 import lombok.RequiredArgsConstructor;
 
 import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
 import org.springframework.stereotype.Service;
 
 import top.continew.starter.core.exception.BusinessException;

+ 8 - 7
pavis-module-aigc/src/main/java/com/pavis/admin/aigc/service/impl/DocServiceImpl.java

@@ -1,7 +1,6 @@
 package com.pavis.admin.aigc.service.impl;
 
 import cn.hutool.core.util.StrUtil;
-import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.pavis.admin.aigc.common.dto.EmbeddingR;
 import com.pavis.admin.aigc.common.model.req.ChatReq;
 import com.pavis.admin.aigc.constant.EmbedConst;
@@ -16,6 +15,7 @@ import com.pavis.admin.aigc.model.resp.KnowledgeResp;
 import com.pavis.admin.aigc.service.KnowledgeService;
 import dev.langchain4j.data.document.Document;
 import dev.langchain4j.data.document.DocumentSplitter;
+import dev.langchain4j.data.document.loader.FileSystemDocumentLoader;
 import dev.langchain4j.data.document.loader.UrlDocumentLoader;
 import dev.langchain4j.data.document.parser.apache.tika.ApacheTikaDocumentParser;
 import dev.langchain4j.data.embedding.Embedding;
@@ -23,6 +23,7 @@ import dev.langchain4j.data.segment.TextSegment;
 import dev.langchain4j.model.embedding.EmbeddingModel;
 import dev.langchain4j.store.embedding.EmbeddingStore;
 import jakarta.annotation.Resource;
+import lombok.AllArgsConstructor;
 import lombok.RequiredArgsConstructor;
 
 import lombok.extern.slf4j.Slf4j;
@@ -48,7 +49,8 @@ import java.util.List;
  * @since 2025/05/26 17:28
  */
 @Service
-@RequiredArgsConstructor
+// @RequiredArgsConstructor
+@AllArgsConstructor
 @Slf4j
 public class DocServiceImpl extends BaseServiceImpl<DocMapper, DocDO, DocResp, DocDetailResp, DocQuery, DocReq> implements DocService {
     private final KnowledgeStoreFactory knowledgeStoreFactory;
@@ -66,9 +68,10 @@ public class DocServiceImpl extends BaseServiceImpl<DocMapper, DocDO, DocResp, D
 
     @Override
     public void embedDocsSlice(DocDO data, String url) {
-        List<EmbeddingR> list = embeddingDocs(new ChatReq().setDocsName(data.getName())
-            .setKnowledgeId(data.getKnowledgeId().toString())
-            .setUrl(url));
+        List<EmbeddingR> list = embeddingDocs(new ChatReq()
+                .setDocsName(data.getName())
+                .setKnowledgeId(data.getKnowledgeId().toString())
+                .setUrl(url));
         list.forEach(i -> {
             DocChunkDO docChunkDO = new DocChunkDO();
             docChunkDO.setKnowledgeId(data.getKnowledgeId());
@@ -94,7 +97,6 @@ public class DocServiceImpl extends BaseServiceImpl<DocMapper, DocDO, DocResp, D
         log.info(">>>>>>>>>>>>>> Docs文档向量解析开始,KnowledgeId={}, DocsName={}", req.getKnowledgeId(), req.getDocsName());
         Document document = UrlDocumentLoader.load(req.getUrl(), new ApacheTikaDocumentParser());
         document.metadata().put(EmbedConst.KNOWLEDGE, req.getKnowledgeId()).put(EmbedConst.FILENAME, req.getDocsName());
-        
         List<EmbeddingR> list = new ArrayList<>();
         try {
             DocumentSplitter splitter = EmbeddingProvider.splitter();
@@ -136,7 +138,6 @@ public class DocServiceImpl extends BaseServiceImpl<DocMapper, DocDO, DocResp, D
         throw new ServiceException("没有找到匹配的Embedding向量数据库");
     }
 
-
     @Override
     @Transactional
     public void clearDocSlices(String docsId) {

+ 0 - 10
pavis-module-aigc/src/main/java/com/pavis/admin/aigc/service/impl/EmbedStoreServiceImpl.java

@@ -1,19 +1,10 @@
 package com.pavis.admin.aigc.service.impl;
 
-import cn.hutool.core.util.StrUtil;
-import com.pavis.admin.aigc.core.llm.provider.EmbeddingProvider;
-import com.pavis.admin.aigc.mapper.DocMapper;
-import com.pavis.admin.aigc.model.entity.DocDO;
-import com.pavis.admin.aigc.service.KnowledgeService;
-import dev.langchain4j.data.segment.TextSegment;
-import dev.langchain4j.store.embedding.EmbeddingStore;
-import jakarta.annotation.Resource;
 import lombok.RequiredArgsConstructor;
 
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.stereotype.Service;
 
-import org.springframework.transaction.annotation.Transactional;
 import top.continew.starter.extension.crud.service.BaseServiceImpl;
 import com.pavis.admin.aigc.mapper.EmbedStoreMapper;
 import com.pavis.admin.aigc.model.entity.EmbedStoreDO;
@@ -36,7 +27,6 @@ import java.util.List;
 @RequiredArgsConstructor
 public class EmbedStoreServiceImpl extends BaseServiceImpl<EmbedStoreMapper, EmbedStoreDO, EmbedStoreResp, EmbedStoreDetailResp, EmbedStoreQuery, EmbedStoreReq> implements EmbedStoreService {
 
-
     @Override
     public List<EmbedStoreResp> selEmbedStore() {
         return baseMapper.selEmbedStore();

+ 6 - 6
pavis-module-aigc/src/main/java/com/pavis/admin/aigc/service/impl/KnowledgeServiceImpl.java

@@ -92,12 +92,12 @@ public class KnowledgeServiceImpl extends BaseServiceImpl<KnowledgeMapper, Knowl
     @Override
     public List<String> listSliceVectorIdsOfDoc(String docsId) {
         LambdaQueryWrapper<DocChunkDO> selectWrapper = Wrappers.<DocChunkDO>lambdaQuery()
-                .select(DocChunkDO::getEmbedStoreId)
-                .eq(DocChunkDO::getDocId, docsId);
+            .select(DocChunkDO::getEmbedStoreId)
+            .eq(DocChunkDO::getDocId, docsId);
         List<String> vectorIds = aigcDocsSliceMapper.selectList(selectWrapper)
-                .stream()
-                .map(DocChunkDO::getEmbedStoreId)
-                .toList();
+            .stream()
+            .map(DocChunkDO::getEmbedStoreId)
+            .toList();
         log.debug("slices of doc: [{}], count: [{}]", docsId, vectorIds.size());
         return vectorIds;
     }
@@ -121,7 +121,7 @@ public class KnowledgeServiceImpl extends BaseServiceImpl<KnowledgeMapper, Knowl
     @Transactional
     public void removeSlicesOfDoc(String docsId) {
         LambdaQueryWrapper<DocChunkDO> deleteWrapper = Wrappers.<DocChunkDO>lambdaQuery()
-                .eq(DocChunkDO::getDocId, docsId);
+            .eq(DocChunkDO::getDocId, docsId);
         int count = aigcDocsSliceMapper.delete(deleteWrapper);
         log.debug("remove all slices of doc: [{}], count: [{}]", docsId, count);
     }

+ 15 - 17
pavis-module-aigc/src/main/java/com/pavis/admin/aigc/service/impl/PvsChatServiceImpl.java

@@ -26,7 +26,6 @@ import com.pavis.admin.aigc.mapper.AppKnowledgeMapper;
 import com.pavis.admin.aigc.model.entity.AigcAppDO;
 import com.pavis.admin.aigc.model.entity.AigcMessageDO;
 import com.pavis.admin.aigc.service.AigcAppService;
-import com.pavis.admin.aigc.service.AigcMessageService;
 import com.pavis.admin.aigc.service.PvsChatService;
 import dev.langchain4j.model.output.TokenUsage;
 import lombok.AllArgsConstructor;
@@ -69,24 +68,23 @@ public class PvsChatServiceImpl implements PvsChatService {
         req.setRole(RoleEnum.USER.getName());
 
         try {
-            aigcAppService.chat(req)
-                    .onNext(e -> {
-                        text.append(e);
-                        emitter.send(new ChatResp(e));
-                    }).onComplete((e) -> {
-                        TokenUsage tokenUsage = e.tokenUsage();
-                        ChatResp res = new ChatResp(tokenUsage.totalTokenCount(), startTime);
-                        emitter.send(res);
-                        emitter.complete();
+            aigcAppService.chat(req).onNext(e -> {
+                text.append(e);
+                emitter.send(new ChatResp(e));
+            }).onComplete((e) -> {
+                TokenUsage tokenUsage = e.tokenUsage();
+                ChatResp res = new ChatResp(tokenUsage.totalTokenCount(), startTime);
+                emitter.send(res);
+                emitter.complete();
 
-                        // save assistant message
-                        req.setMessage(text.toString());
-                        req.setRole(RoleEnum.ASSISTANT.getName());
+                // save assistant message
+                req.setMessage(text.toString());
+                req.setRole(RoleEnum.ASSISTANT.getName());
 
-                    }).onError((e) -> {
-                        emitter.error(e.getMessage());
-                        throw new RuntimeException(e.getMessage());
-                    }).start();
+            }).onError((e) -> {
+                emitter.error(e.getMessage());
+                throw new RuntimeException(e.getMessage());
+            }).start();
         } catch (Exception e) {
             e.printStackTrace();
             emitter.error(e.getMessage());

+ 6 - 1
pavis-module-system/src/main/java/com/pavis/admin/auth/AbstractLoginHandler.java

@@ -107,7 +107,12 @@ public abstract class AbstractLoginHandler<T extends LoginReq> implements LoginH
      */
     protected void checkUserStatus(UserDO user) {
         CheckUtils.throwIfEqual(DisEnableStatusEnum.DISABLE, user.getStatus(), "此账号已被禁用,如有疑问,请联系管理员");
-        DeptDO dept = deptService.getById(user.getDeptId());
+        DeptDO dept=new DeptDO();
+        if(user.getDeptId()!=null) {
+            dept = deptService.getById(user.getDeptId());
+        }else {
+            dept = deptService.getById(1);
+        }
         CheckUtils.throwIfEqual(DisEnableStatusEnum.DISABLE, dept.getStatus(), "此账号所属部门已被禁用,如有疑问,请联系管理员");
     }
 }

+ 48 - 1
pavis-module-system/src/main/java/com/pavis/admin/auth/handler/PhoneLoginHandler.java

@@ -1,7 +1,14 @@
 
 package com.pavis.admin.auth.handler;
 
+import cn.hutool.core.util.IdUtil;
+import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.core.util.RandomUtil;
+import com.pavis.admin.system.model.entity.UserRoleDO;
+import com.pavis.admin.system.service.UserRoleService;
+import jakarta.annotation.Resource;
 import jakarta.servlet.http.HttpServletRequest;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 import com.pavis.admin.auth.AbstractLoginHandler;
 import com.pavis.admin.auth.enums.AuthTypeEnum;
@@ -13,6 +20,9 @@ import com.pavis.admin.system.model.resp.ClientResp;
 import top.continew.starter.cache.redisson.util.RedisUtils;
 import top.continew.starter.core.validation.ValidationUtils;
 
+import java.util.ArrayList;
+import java.util.List;
+
 /**
  * 手机号登录处理器
  *
@@ -22,18 +32,55 @@ import top.continew.starter.core.validation.ValidationUtils;
  */
 @Component
 public class PhoneLoginHandler extends AbstractLoginHandler<PhoneLoginReq> {
+    @Resource
+    private UserRoleService userRoleService;
 
     @Override
     public LoginResp login(PhoneLoginReq req, ClientResp client, HttpServletRequest request) {
         // 验证手机号
         UserDO user = userService.getByPhone(req.getPhone());
-        ValidationUtils.throwIfNull(user, "此手机号未绑定本系统账号");
+        //        ValidationUtils.throwIfNull(user, "此手机号未绑定本系统账号");
+
+        // 手机号未绑定用户则自动注册
+        if (ObjectUtil.isNull(user)) {
+            String randomStr = RandomUtil.randomString(RandomUtil.BASE_CHAR, 5);
+
+            // 设置基本信息
+            user = new UserDO();
+            String username = "user_" + randomStr + IdUtil.fastSimpleUUID();
+            user.setPhone(req.getPhone());
+            user.setUsername(username);
+            user.setNickname(username);
+            user.setIsFron(1); // 为前台角色
+
+            // 保存用户并获取用户id
+            userService.save(user);
+            user = userService.getByPhone(req.getPhone());
+
+            // 设置“插件用户角色”
+            UserRoleDO userRole = new UserRoleDO(user.getId(), 698168080014012469L);
+            List<UserRoleDO> users = new ArrayList<>();
+            users.add(userRole);
+            userRoleService.saveBatch(users);
+        }
+
         // 检查用户状态
         super.checkUserStatus(user);
         // 执行认证
         String token = super.authenticate(user, client);
         return LoginResp.builder().token(token).build();
     }
+    // @Override
+    // public LoginResp login(PhoneLoginReq req, ClientResp client, HttpServletRequest request) {
+    //     // 验证手机号
+    //     UserDO user = userService.getByPhone(req.getPhone());
+    //     ValidationUtils.throwIfNull(user, "此手机号未绑定本系统账号");
+    //     // 检查用户状态
+    //     super.checkUserStatus(user);
+    //     // 执行认证
+    //     String token = super.authenticate(user, client);
+    //     return LoginResp.builder().token(token).build();
+    // }
 
     @Override
     public void preLogin(PhoneLoginReq req, ClientResp client, HttpServletRequest request) {

+ 5 - 0
pavis-module-system/src/main/java/com/pavis/admin/system/model/entity/user/UserDO.java

@@ -93,4 +93,9 @@ public class UserDO extends BaseDO {
      * 部门 ID
      */
     private Long deptId;
+
+    /**
+     * 是否为前台用户
+     */
+    private Integer isFron;
 }

+ 8 - 0
pavis-module-system/src/main/java/com/pavis/admin/system/model/query/UserQuery.java

@@ -5,6 +5,8 @@ import io.swagger.v3.oas.annotations.media.Schema;
 import jakarta.validation.constraints.Size;
 import lombok.Data;
 import com.pavis.admin.common.enums.DisEnableStatusEnum;
+import top.continew.starter.data.core.annotation.Query;
+import top.continew.starter.data.core.enums.QueryType;
 
 import java.io.Serial;
 import java.io.Serializable;
@@ -30,6 +32,12 @@ public class UserQuery implements Serializable {
     @Schema(description = "关键词", example = "zhangsan")
     private String description;
 
+    /**
+     * 是否为前台用户
+     */
+    @Query(type = QueryType.LIKE)
+    private Integer isFron;
+
     /**
      * 状态
      */

+ 7 - 1
pavis-module-system/src/main/java/com/pavis/admin/system/model/req/user/UserReq.java

@@ -77,7 +77,7 @@ public class UserReq implements Serializable {
      * 所属部门
      */
     @Schema(description = "所属部门", example = "5")
-    @NotNull(message = "所属部门不能为空")
+    // @NotNull(message = "所属部门不能为空")
     private Long deptId;
 
     /**
@@ -99,4 +99,10 @@ public class UserReq implements Serializable {
      */
     @Schema(description = "状态", example = "1")
     private DisEnableStatusEnum status;
+
+    /**
+     * 是否为前台用户
+     */
+    @Schema(description = "是否为前台用户", example = "1")
+    private Integer isFron;
 }

+ 6 - 0
pavis-module-system/src/main/java/com/pavis/admin/system/model/resp/user/UserResp.java

@@ -112,6 +112,12 @@ public class UserResp extends BaseDetailResp {
     @Schema(description = "角色名称列表", example = "测试人员")
     private List<String> roleNames;
 
+    /**
+     * 是否为前台用户
+     */
+    @Schema(description = "是否为前台用户", example = "1")
+    private Integer isFron;
+
     @Override
     public Boolean getDisabled() {
         return this.getIsSystem() || Objects.equals(this.getId(), UserContextHolder.getUserId());

+ 5 - 0
pavis-webapi/.flattened-pom.xml

@@ -60,6 +60,11 @@
       <artifactId>spring-boot-starter-test</artifactId>
       <scope>test</scope>
     </dependency>
+    <dependency>
+      <groupId>cn.dev33</groupId>
+      <artifactId>sa-token-spring-boot3-starter</artifactId>
+      <version>1.42.0</version>
+    </dependency>
   </dependencies>
   <build>
     <finalName>${project.parent.name}</finalName>

+ 22 - 22
pavis-webapi/src/main/java/com/pavis/admin/config/satoken/SaTokenConfiguration.java

@@ -57,35 +57,35 @@ public class SaTokenConfiguration {
     public SaInterceptor saInterceptor() {
         SaManager.setSaSignTemplate(signTemplate);
         return new SaExtensionInterceptor(handle -> SaRouter.match(StringConstants.PATH_PATTERN)
-                .notMatch(properties.getSecurity().getExcludes())
-                .check(r -> {
-                    // 如果包含 sign,进行 API 接口参数签名验证
-                    SaRequest saRequest = SaHolder.getRequest();
-                    Collection<String> paramNames = saRequest.getParamNames();
-                    if (paramNames.stream().anyMatch(SaSignTemplate.sign::equals)) {
-                        try {
-                            SaSignUtil.checkRequest(saRequest);
-                        } catch (Exception e) {
-                            throw new BusinessException(e.getMessage());
-                        }
-                        return;
+            .notMatch(properties.getSecurity().getExcludes())
+            .check(r -> {
+                // 如果包含 sign,进行 API 接口参数签名验证
+                SaRequest saRequest = SaHolder.getRequest();
+                Collection<String> paramNames = saRequest.getParamNames();
+                if (paramNames.stream().anyMatch(SaSignTemplate.sign::equals)) {
+                    try {
+                        SaSignUtil.checkRequest(saRequest);
+                    } catch (Exception e) {
+                        throw new BusinessException(e.getMessage());
                     }
-                    // 不包含 sign 参数,进行普通登录验证
-                    StpUtil.checkLogin();
-                    if (SaRouter.isMatchCurrURI(loginPasswordProperties.getExcludes())) {
-                        return;
-                    }
-                    UserContext userContext = UserContextHolder.getContext();
-                    CheckUtils.throwIf(userContext.isPasswordExpired(), "密码已过期,请修改密码");
-                }));
+                    return;
+                }
+                // 不包含 sign 参数,进行普通登录验证
+                StpUtil.checkLogin();
+                if (SaRouter.isMatchCurrURI(loginPasswordProperties.getExcludes())) {
+                    return;
+                }
+                UserContext userContext = UserContextHolder.getContext();
+                CheckUtils.throwIf(userContext.isPasswordExpired(), "密码已过期,请修改密码");
+            }));
     }
 
     @Bean
     public FilterRegistrationBean saTokenContextFilterForJakartaServlet() {
         FilterRegistrationBean bean = new FilterRegistrationBean<>(new SaTokenContextFilterForJakartaServlet());
-// 配置 Filter 拦截的 URL 模式
+        // 配置 Filter 拦截的 URL 模式
         bean.addUrlPatterns("/*");
-// 设置 Filter 的执行顺序,数值越小越先执行
+        // 设置 Filter 的执行顺序,数值越小越先执行
         bean.setOrder(Ordered.HIGHEST_PRECEDENCE);
         bean.setAsyncSupported(true);
         bean.setDispatcherTypes(EnumSet.of(DispatcherType.ASYNC, DispatcherType.REQUEST));

+ 0 - 1
pavis-webapi/src/main/java/com/pavis/admin/controller/aigc/AigcAppController.java

@@ -1,6 +1,5 @@
 package com.pavis.admin.controller.aigc;
 
-import cn.dev33.satoken.annotation.SaIgnore;
 import com.pavis.admin.aigc.common.model.req.ChatReq;
 import com.pavis.admin.aigc.common.utils.StreamEmitter;
 import com.pavis.admin.aigc.service.PvsChatService;

+ 1 - 2
pavis-webapi/src/main/java/com/pavis/admin/controller/aigc/DocController.java

@@ -5,7 +5,6 @@ import com.pavis.admin.aigc.core.llm.exception.ServiceException;
 import com.pavis.admin.aigc.core.task.TaskManager;
 import com.pavis.admin.aigc.mapper.DocMapper;
 import com.pavis.admin.aigc.model.entity.DocDO;
-import com.pavis.admin.aigc.service.EmbedStoreService;
 import com.pavis.admin.aigc.service.KnowledgeService;
 import com.pavis.admin.common.context.UserContextHolder;
 import com.pavis.admin.system.service.FileService;
@@ -97,7 +96,7 @@ public class DocController extends BaseController<DocService, DocResp, DocDetail
             // clear before re-embed
             baseService.clearDocSlices(docsId);
             TaskManager.submitTask(userId, Executors.callable(() -> {
-                docService.embedDocsSlice(docs, docs.getStoragePath());
+                baseService.embedDocsSlice(docs, docs.getStoragePath());
             }));
         }
         return R.ok();

+ 67 - 27
pavis-webapi/src/main/java/com/pavis/admin/controller/common/CaptchaController.java

@@ -4,6 +4,7 @@ package com.pavis.admin.controller.common;
 import cn.dev33.satoken.annotation.SaIgnore;
 import cn.hutool.core.date.LocalDateTimeUtil;
 import cn.hutool.core.lang.Dict;
+import cn.hutool.core.lang.RegexPool;
 import cn.hutool.core.map.MapUtil;
 import cn.hutool.core.util.IdUtil;
 import cn.hutool.core.util.RandomUtil;
@@ -20,9 +21,11 @@ import jakarta.mail.MessagingException;
 import jakarta.servlet.http.HttpServletRequest;
 import jakarta.validation.constraints.Email;
 import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.Pattern;
 import lombok.RequiredArgsConstructor;
 import org.dromara.sms4j.api.SmsBlend;
 import org.dromara.sms4j.api.entity.SmsResponse;
+import org.dromara.sms4j.comm.constant.SupplierConstant;
 import org.dromara.sms4j.core.factory.SmsFactory;
 import org.springframework.http.HttpHeaders;
 import org.springframework.validation.annotation.Validated;
@@ -175,35 +178,72 @@ public class CaptchaController {
      */
     @Operation(summary = "获取短信验证码", description = "发送验证码到指定手机号")
     @GetMapping("/sms")
-    @RateLimiters({
-        @RateLimiter(name = CacheConstants.CAPTCHA_KEY_PREFIX + "MIN", key = "#phone + ':' + T(cn.hutool.extra.spring.SpringUtil).getProperty('captcha.sms.templateId')", rate = 2, interval = 1, unit = TimeUnit.MINUTES, message = "获取验证码操作太频繁,请稍后再试"),
-        @RateLimiter(name = CacheConstants.CAPTCHA_KEY_PREFIX + "HOUR", key = "#phone + ':' + T(cn.hutool.extra.spring.SpringUtil).getProperty('captcha.sms.templateId')", rate = 8, interval = 1, unit = TimeUnit.HOURS, message = "获取验证码操作太频繁,请稍后再试"),
-        @RateLimiter(name = CacheConstants.CAPTCHA_KEY_PREFIX + "DAY'", key = "#phone + ':' + T(cn.hutool.extra.spring.SpringUtil).getProperty('captcha.sms.templateId')", rate = 20, interval = 24, unit = TimeUnit.HOURS, message = "获取验证码操作太频繁,请稍后再试"),
-        @RateLimiter(name = CacheConstants.CAPTCHA_KEY_PREFIX, key = "#phone", rate = 100, interval = 24, unit = TimeUnit.HOURS, message = "获取验证码操作太频繁,请稍后再试"),
-        @RateLimiter(name = CacheConstants.CAPTCHA_KEY_PREFIX, key = "#phone", rate = 30, interval = 1, unit = TimeUnit.MINUTES, type = LimitType.IP, message = "获取验证码操作太频繁,请稍后再试")})
-    public R getSmsCaptcha(@NotBlank(message = "手机号不能为空") @Mobile String phone, CaptchaVO captchaReq) {
-        // 行为验证码校验
-        ResponseModel verificationRes = behaviorCaptchaService.verification(captchaReq);
-        ValidationUtils.throwIfNotEqual(verificationRes.getRepCode(), RepCodeEnum.SUCCESS.getCode(), verificationRes
-            .getRepMsg());
-        CaptchaProperties.CaptchaSms captchaSms = captchaProperties.getSms();
-        // 生成验证码
-        String captcha = RandomUtil.randomNumbers(captchaSms.getLength());
-        Long expirationInMinutes = captchaSms.getExpirationInMinutes();
-        // 获取短信配置
-        SmsConfigDO smsConfig = smsConfigService.getDefaultConfig();
-        SmsBlend smsBlend = smsConfig != null
-            ? SmsFactory.getBySupplier(smsConfig.getSupplier())
-            : SmsFactory.getSmsBlend();
-        Map<String, String> messageMap = MapUtil.newHashMap(2, true);
-        messageMap.put(captchaSms.getCodeKey(), captcha);
-        messageMap.put(captchaSms.getTimeKey(), String.valueOf(expirationInMinutes));
-        // 发送验证码
-        SmsResponse smsResponse = smsBlend.sendMessage(phone, (LinkedHashMap<String, String>)messageMap);
-        CheckUtils.throwIf(!smsResponse.isSuccess(), "验证码发送失败");
-        // 保存验证码
+    // @RateLimiters({
+    //     @RateLimiter(name = CacheConstants.CAPTCHA_KEY_PREFIX + "MIN", key = "#phone + ':' + T(cn.hutool.extra.spring.SpringUtil).getProperty('captcha.sms.templateId')", rate = 2, interval = 1, unit = TimeUnit.MINUTES, message = "获取验证码操作太频繁,请稍后再试"),
+    //     @RateLimiter(name = CacheConstants.CAPTCHA_KEY_PREFIX + "HOUR", key = "#phone + ':' + T(cn.hutool.extra.spring.SpringUtil).getProperty('captcha.sms.templateId')", rate = 8, interval = 1, unit = TimeUnit.HOURS, message = "获取验证码操作太频繁,请稍后再试"),
+    //     @RateLimiter(name = CacheConstants.CAPTCHA_KEY_PREFIX + "DAY'", key = "#phone + ':' + T(cn.hutool.extra.spring.SpringUtil).getProperty('captcha.sms.templateId')", rate = 20, interval = 24, unit = TimeUnit.HOURS, message = "获取验证码操作太频繁,请稍后再试"),
+    //     @RateLimiter(name = CacheConstants.CAPTCHA_KEY_PREFIX, key = "#phone", rate = 100, interval = 24, unit = TimeUnit.HOURS, message = "获取验证码操作太频繁,请稍后再试"),
+    //     @RateLimiter(name = CacheConstants.CAPTCHA_KEY_PREFIX, key = "#phone", rate = 30, interval = 1, unit = TimeUnit.MINUTES, type = LimitType.IP, message = "获取验证码操作太频繁,请稍后再试")})
+    public R getSmsCaptcha(@NotBlank(message = "手机号不能为空") @Pattern(regexp = RegexPool.MOBILE, message = "手机号格式错误") String phone,
+                           CaptchaVO captchaReq) {
+        int captchaEnabled = optionService.getValueByCode2Int("LOGIN_CAPTCHA_ENABLED"); // 是否开启验证码
+        String captcha; // 短信验证码
+        Long expirationInMinutes; // 过期时间
+        if (captchaEnabled == 0) {
+            // 关闭则不校验行为验证码且使用固定短信验证码
+            captcha = "1234";
+            CaptchaProperties.CaptchaSms captchaSms = captchaProperties.getSms();
+            expirationInMinutes = captchaSms.getExpirationInMinutes();
+        } else {
+            // 行为验证码校验
+            ResponseModel verificationRes = behaviorCaptchaService.verification(captchaReq);
+            ValidationUtils.throwIfNotEqual(verificationRes.getRepCode(), RepCodeEnum.SUCCESS.getCode(), verificationRes
+                    .getRepMsg());
+            CaptchaProperties.CaptchaSms captchaSms = captchaProperties.getSms();
+            // 生成验证码
+            captcha = RandomUtil.randomNumbers(captchaSms.getLength());
+            expirationInMinutes = captchaSms.getExpirationInMinutes();
+            // 获取短信配置
+            SmsConfigDO smsConfig = smsConfigService.getDefaultConfig();
+            SmsBlend smsBlend = smsConfig != null
+                    ? SmsFactory.getBySupplier(smsConfig.getSupplier())
+                    : SmsFactory.getSmsBlend();
+            Map<String, String> messageMap = MapUtil.newHashMap(2, true);
+            messageMap.put(captchaSms.getCodeKey(), captcha);
+            messageMap.put(captchaSms.getTimeKey(), String.valueOf(expirationInMinutes));
+            // 发送验证码
+            SmsResponse smsResponse = smsBlend.sendMessage(phone, (LinkedHashMap<String, String>)messageMap);
+            CheckUtils.throwIf(!smsResponse.isSuccess(), "验证码发送失败");
+        }
+
+        // 保存验证码到redis
         String captchaKey = CacheConstants.CAPTCHA_KEY_PREFIX + phone;
         RedisUtils.set(captchaKey, captcha, Duration.ofMinutes(expirationInMinutes));
         return R.ok("发送成功,验证码有效期 %s 分钟".formatted(expirationInMinutes));
     }
+    // public R getSmsCaptcha(@NotBlank(message = "手机号不能为空") @Mobile String phone, CaptchaVO captchaReq) {
+    //     // 行为验证码校验
+    //     ResponseModel verificationRes = behaviorCaptchaService.verification(captchaReq);
+    //     ValidationUtils.throwIfNotEqual(verificationRes.getRepCode(), RepCodeEnum.SUCCESS.getCode(), verificationRes
+    //         .getRepMsg());
+    //     CaptchaProperties.CaptchaSms captchaSms = captchaProperties.getSms();
+    //     // 生成验证码
+    //     String captcha = RandomUtil.randomNumbers(captchaSms.getLength());
+    //     Long expirationInMinutes = captchaSms.getExpirationInMinutes();
+    //     // 获取短信配置
+    //     SmsConfigDO smsConfig = smsConfigService.getDefaultConfig();
+    //     SmsBlend smsBlend = smsConfig != null
+    //         ? SmsFactory.getBySupplier(smsConfig.getSupplier())
+    //         : SmsFactory.getSmsBlend();
+    //     Map<String, String> messageMap = MapUtil.newHashMap(2, true);
+    //     messageMap.put(captchaSms.getCodeKey(), captcha);
+    //     messageMap.put(captchaSms.getTimeKey(), String.valueOf(expirationInMinutes));
+    //     // 发送验证码
+    //     SmsResponse smsResponse = smsBlend.sendMessage(phone, (LinkedHashMap<String, String>)messageMap);
+    //     CheckUtils.throwIf(!smsResponse.isSuccess(), "验证码发送失败");
+    //     // 保存验证码
+    //     String captchaKey = CacheConstants.CAPTCHA_KEY_PREFIX + phone;
+    //     RedisUtils.set(captchaKey, captcha, Duration.ofMinutes(expirationInMinutes));
+    //     return R.ok("发送成功,验证码有效期 %s 分钟".formatted(expirationInMinutes));
+    // }
 }

+ 44 - 35
pavis-webapi/src/main/resources/config/application-prod.yml

@@ -1,28 +1,36 @@
 --- ### 项目配置
 project:
   # URL(跨域配置默认放行此 URL,第三方登录回调默认使用此 URL 为前缀,请注意更改为你实际的前端 URL)
-  url: http://www.s-privacy.com
-  # 是否为生产环境
-  production: true
+  url: http://localhost:5173
 
 --- ### 服务器配置
 server:
   # HTTP 端口(默认 8080)
-  port: 18000
+  port: 5555
+
+--- ### Spring AI 配置
+spring:
+  ai:
+    openai:
+      base-url: https://dashscope.aliyuncs.com/compatible-mode
+      api-key: ${AI_DASHSCOPE_API_KEY:sk-e9855234f47346049809ce23ed3ebe3f}
+      chat:
+        options:
+          model: qwen-max-latest
 
 --- ### 数据源配置
 spring.datasource:
   type: com.zaxxer.hikari.HikariDataSource
   # 请务必提前创建好名为 continew_admin 的数据库,如果使用其他数据库名请注意同步修改 DB_NAME 配置
-  url: jdbc:mysql://${DB_HOST:127.0.0.1}:${DB_PORT:3306}/${DB_NAME:pavis_admin}?serverTimezone=Asia/Shanghai&useSSL=true&useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&autoReconnect=true&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true
+  url: jdbc:p6spy:mysql://${DB_HOST:192.168.1.202}:${DB_PORT:3889}/${DB_NAME:pavis_admin}?serverTimezone=Asia/Shanghai&useSSL=true&useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&autoReconnect=true&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true
   username: ${DB_USER:root}
   password: ${DB_PWD:123456}
-  driver-class-name: com.mysql.cj.jdbc.Driver
-#  # PostgreSQL 配置
-#  url: jdbc:postgresql://${DB_HOST:127.0.0.1}:${DB_PORT:5432}/${DB_NAME:pavis_admin}?serverTimezone=Asia/Shanghai&useSSL=true&useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&autoReconnect=true&stringtype=unspecified
-#  username: ${DB_USER:root}
-#  password: ${DB_PWD:123456}
-#  driver-class-name: org.postgresql.Driver
+  driver-class-name: com.p6spy.engine.spy.P6SpyDriver
+  #  # PostgreSQL 配置
+  #  url: jdbc:p6spy:postgresql://${DB_HOST:127.0.0.1}:${DB_PORT:5432}/${DB_NAME:pavis_admin}?serverTimezone=Asia/Shanghai&useSSL=true&useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&autoReconnect=true&stringtype=unspecified
+  #  username: ${DB_USER:root}
+  #  password: ${DB_PWD:123456}
+  #  driver-class-name: com.p6spy.engine.spy.P6SpyDriver
   # Hikari 连接池配置
   hikari:
     # 最大连接数量(默认 10,根据实际环境调整)
@@ -48,11 +56,11 @@ spring.data:
   ## Redis 配置(单机模式)
   redis:
     # 地址
-    host: ${REDIS_HOST:127.0.0.1}
+    host: ${REDIS_HOST:192.168.1.202}
     # 端口(默认 6379)
-    port: ${REDIS_PORT:6379}
+    port: ${REDIS_PORT:6388}
     # 密码(未设置密码时请注释掉)
-    password: ${REDIS_PWD:123456}
+    # password: ${REDIS_PWD:123456}
     # 数据库索引
     database: ${REDIS_DB:0}
     # 连接超时时间
@@ -67,7 +75,7 @@ spring.data:
 ## JetCache 配置
 jetcache:
   # 统计间隔(默认 0,表示不统计)
-  statIntervalMinutes: 0
+  statIntervalMinutes: 15
   ## 本地/进程级/一级缓存配置
   local:
     default:
@@ -95,18 +103,11 @@ jetcache:
       valueEncoder: java
       valueDecoder: java
 
---- ### 接口文档配置
-## 接口文档增强配置
-knife4j:
-  # 开启生产环境屏蔽
-  production: ${project.production}
-
 --- ### 跨域配置
 continew-starter.web.cors:
   enabled: true
   # 配置允许跨域的域名
-  allowed-origins:
-    - ${project.url}
+  allowed-origins: '*'
   # 配置允许跨域的请求方式
   allowed-methods: '*'
   # 配置允许跨域的请求头
@@ -119,14 +120,14 @@ continew-starter.web.cors:
 continew-starter.log:
   access-log:
     # 是否打印访问日志(类似于 Nginx access log)
-    enabled: false
+    enabled: true
 ## 项目日志配置(配置重叠部分,优先级高于 logback-spring.xml 中的配置)
 logging:
   level:
-    com.pavis.admin: INFO
-    top.continew.starter: INFO
+    top.continew.admin: DEBUG
+    top.continew.starter: DEBUG
   file:
-    path: ../logs
+    path: ./logs
 
 --- ### 安全配置:字段加/解密配置
 continew-starter.security:
@@ -177,9 +178,10 @@ captcha:
     expirationInMinutes: 5
 
 --- ### 短信配置
-## 提示:配置文件方式和 [系统管理/系统配置/短信配置] 功能可任选其一方式使用,也可共同使用,但实际开发时建议选择一种,注释或删除另一方
+## 提示:配置文件方式和 [短信配置] 功能可任选其一方式使用,也可共同使用,但实际开发时建议选择一种,注释或删除另一方
 sms:
-  is-print: false
+  http-log: true
+  is-print: true
 #  # 从 YAML 读取配置
 #  config-type: YAML
 #  blends:
@@ -192,7 +194,7 @@ sms:
 #      sdk-app-id: 你的应用ID
 
 --- ### 邮件配置
-## 提示:配置文件方式和 [系统管理/系统配置/邮件配置] 功能可任选其一方式使用,实际开发时请注释或删除另一方
+## 提示:配置文件方式和 [邮件配置] 功能可任选其一方式使用,实际开发时请注释或删除另一方
 #spring.mail:
 #  # 根据需要更换
 #  host: smtp.126.com
@@ -212,8 +214,7 @@ continew-starter.messaging.websocket:
   enabled: true
   path: /websocket
   # 配置允许跨域的域名
-  allowed-origins:
-    - ${project.url}
+  allowed-origins: '*'
 
 --- ### Sa-Token 扩展配置
 sa-token.extension:
@@ -226,6 +227,13 @@ sa-token.extension:
     - /*/*.css
     - /*/*.js
     - /websocket/**
+    # 接口文档相关资源
+    - /favicon.ico
+    - /doc.html
+    - /webjars/**
+    - /swagger-ui/**
+    - /swagger-resources/**
+    - /*/api-docs/**
     # 本地存储资源
     - /file/**
 
@@ -246,6 +254,7 @@ justauth:
 
 --- ### Snail Job 配置
 snail-job:
+  enabled: false
   # 客户端地址(默认自动获取本机 IP)
   #host: 127.0.0.1
   # 客户端端口(默认:1789)
@@ -253,7 +262,7 @@ snail-job:
   # 命名空间 ID
   namespace: ${SCHEDULE_NAMESPACE:764d604ec6fc45f68cd92514c40e9e1a}
   # 分组名
-  group: ${SCHEDULE_GROUP:continew-admin}
+  group: ${SCHEDULE_GROUP:pavis-admin}
   # 令牌
   token: ${SCHEDULE_TOKEN:SJ_Wyz3dmsdbDOkDujOTSSoBjGQP1BMsVnj}
   ## 服务端配置(任务调度中心)
@@ -267,6 +276,6 @@ snail-job:
       # URL
       url: http://127.0.0.1:8001/snail-job
       # 用户名
-      username:  ${SCHEDULE_USERNAME:admin}
+      username: ${SCHEDULE_USERNAME:admin}
       # 密码
-      password:  ${SCHEDULE_PASSWORD:admin}
+      password: ${SCHEDULE_PASSWORD:admin}

+ 6 - 6
pavis-webapi/src/main/resources/db/changelog/db.changelog-master.yaml

@@ -1,10 +1,10 @@
 databaseChangeLog:
-  - include:
-      file: db/changelog/mysql/main_table.sql
-  - include:
-      file: db/changelog/mysql/main_column.sql
-  - include:
-      file: db/changelog/mysql/main_data.sql
+#  - include:
+#      file: db/changelog/mysql/main_table.sql
+#  - include:
+#      file: db/changelog/mysql/main_column.sql
+#  - include:
+#      file: db/changelog/mysql/main_data.sql
   - include:
       file: db/changelog/mysql/plugin/plugin_schedule.sql
   - include:

+ 4 - 4
pavis-webapi/src/main/resources/db/changelog/mysql/main_data.sql

@@ -200,9 +200,9 @@ VALUES
 INSERT INTO `sys_option`
 (`id`, `category`, `name`, `code`, `value`, `default_value`, `description`)
 VALUES
-(1, 'SITE', '系统名称', 'SITE_TITLE', NULL, 'ContiNew Admin', '显示在浏览器标题栏和登录界面的系统名称'),
+(1, 'SITE', '系统名称', 'SITE_TITLE', NULL, 'Pvs Admin', '显示在浏览器标题栏和登录界面的系统名称'),
 (2, 'SITE', '系统描述', 'SITE_DESCRIPTION', NULL, '持续迭代优化的前后端分离中后台管理系统框架', '用于 SEO 的网站元描述'),
-(3, 'SITE', '版权声明', 'SITE_COPYRIGHT', NULL, 'Copyright © 2022 - present ContiNew Admin 版权所有', '显示在页面底部的版权声明文本'),
+(3, 'SITE', '版权声明', 'SITE_COPYRIGHT', NULL, 'Copyright © 2025 - present Pvs Admin 版权所有', '显示在页面底部的版权声明文本'),
 (4, 'SITE', '备案号', 'SITE_BEIAN', NULL, NULL, '工信部 ICP 备案编号(如:京ICP备12345678号)'),
 (5, 'SITE', '系统图标', 'SITE_FAVICON', NULL, '/favicon.ico', '浏览器标签页显示的网站图标(建议 .ico 格式)'),
 (6, 'SITE', '系统LOGO', 'SITE_LOGO', NULL, '/logo.svg', '显示在登录页面和系统导航栏的网站图标(建议 .svg 格式)'),
@@ -287,8 +287,8 @@ INSERT INTO `sys_role_dept` (`role_id`, `dept_id`) VALUES (547888897925840927, 5
 INSERT INTO `sys_storage`
 (`id`, `name`, `code`, `type`, `access_key`, `secret_key`, `endpoint`, `bucket_name`, `domain`, `description`, `is_default`, `sort`, `status`, `create_user`, `create_time`)
 VALUES
-(1, '开发环境', 'local_dev', 1, NULL, NULL, NULL, 'C:/continew-admin/data/file/', 'http://localhost:8000/file/', '本地存储', b'1', 1, 1, 1, NOW()),
-(2, '生产环境', 'local_prod', 1, NULL, NULL, NULL, '../data/file/', 'http://api.continew.top/file/', '本地存储', b'0', 2, 2, 1, NOW());
+(1, '开发环境', 'local_dev', 1, NULL, NULL, NULL, 'C:/pvs-admin/data/file/', 'http://localhost:8000/file/', '本地存储', b'1', 1, 1, 1, NOW()),
+(2, '生产环境', 'local_prod', 1, NULL, NULL, NULL, '../data/file/', 'http://192.168.1.202/file/', '本地存储', b'0', 2, 2, 1, NOW());
 
 -- 初始化客户端数据
 INSERT INTO `sys_client`

+ 4 - 2
pavis-webapi/src/main/resources/db/changelog/mysql/main_table.sql

@@ -80,7 +80,7 @@ CREATE TABLE IF NOT EXISTS `sys_user`
 (
     `id`             bigint(20)          NOT NULL AUTO_INCREMENT COMMENT 'ID',
     `username`       varchar(64)         NOT NULL COMMENT '用户名',
-    `nickname`       varchar(30)         NOT NULL COMMENT '昵称',
+    `nickname`       varchar(100)         NOT NULL COMMENT '昵称',
     `password`       varchar(255)                 DEFAULT NULL COMMENT '密码',
     `gender`         tinyint(1) UNSIGNED NOT NULL DEFAULT 0 COMMENT '性别(0:未知;1:男;2:女)',
     `email`          varchar(255)                 DEFAULT NULL COMMENT '邮箱',
@@ -88,9 +88,10 @@ CREATE TABLE IF NOT EXISTS `sys_user`
     `avatar`         longtext                     DEFAULT NULL COMMENT '头像',
     `description`    varchar(200)                 DEFAULT NULL COMMENT '描述',
     `status`         tinyint(1) UNSIGNED NOT NULL DEFAULT 1 COMMENT '状态(1:启用;2:禁用)',
+    `is_fron`         tinyint(1) UNSIGNED NOT NULL DEFAULT 1 COMMENT '是否为前台用户(0:否;1:是)',
     `is_system`      bit(1)              NOT NULL DEFAULT b'0' COMMENT '是否为系统内置数据',
     `pwd_reset_time` datetime                     DEFAULT NULL COMMENT '最后一次修改密码时间',
-    `dept_id`        bigint(20)          NOT NULL COMMENT '部门ID',
+    `dept_id`        bigint(20)          COMMENT '部门ID',
     `create_user`    bigint(20)                   DEFAULT NULL COMMENT '创建人',
     `create_time`    datetime            NOT NULL COMMENT '创建时间',
     `update_user`    bigint(20)                   DEFAULT NULL COMMENT '修改人',
@@ -544,6 +545,7 @@ CREATE TABLE IF NOT EXISTS `aigc_doc`
     `vector_status`     VARCHAR(20)  DEFAULT 'pending' COMMENT '向量化状态:pending/processing/completed/failed',
     `error_log`         TEXT         DEFAULT NULL COMMENT '错误日志',
     `retry_count`       INT          DEFAULT 0 COMMENT '重试次数',
+    `slice_num`       INT          DEFAULT 0 COMMENT '重试次数',
     `is_sensitive`      TINYINT(1)   DEFAULT 0 COMMENT '敏感内容标记',
     `version`           INT          DEFAULT 1 COMMENT '文档版本',
     `create_user`       BIGINT          NOT NULL COMMENT '创建人',

+ 12 - 5
pavis-webapi/src/main/resources/logback-spring.xml

@@ -83,13 +83,20 @@
         </root>
     </springProfile>
 
-    <!-- 生产环境:打印到控制台并输出到文件 -->
     <springProfile name="prod">
+        <!-- 如果配置的日志等级,和 application.yml 中的日志等级配置重叠,application.yml 配置优先级高 -->
         <root level="INFO">
-            <appender-ref ref="CONSOLE_PROD"/>
-            <appender-ref ref="ASYNC_FILE"/>
+            <appender-ref ref="CONSOLE"/>
         </root>
-        <!-- 日志保留天数(根据国家法律,网络运行状态、网络安全事件、个人敏感信息操作等相关记录,留存的日志不少于六个月,并且进行网络多机备份。) -->
-        <property name="FILE_MAX_HISTORY" value="180"/>
     </springProfile>
+
+    <!-- 生产环境:打印到控制台并输出到文件 -->
+<!--    <springProfile name="prod">-->
+<!--        <root level="INFO">-->
+<!--            <appender-ref ref="CONSOLE_PROD"/>-->
+<!--            <appender-ref ref="ASYNC_FILE"/>-->
+<!--        </root>-->
+<!--        &lt;!&ndash; 日志保留天数(根据国家法律,网络运行状态、网络安全事件、个人敏感信息操作等相关记录,留存的日志不少于六个月,并且进行网络多机备份。) &ndash;&gt;-->
+<!--        <property name="FILE_MAX_HISTORY" value="180"/>-->
+<!--    </springProfile>-->
 </configuration>