From 3b8b4eb1cc514cc57eff1a760e995db3ee12d42e Mon Sep 17 00:00:00 2001 From: Lee <1633292@qq.com> Date: Tue, 9 Jun 2026 16:03:44 +0800 Subject: [PATCH] =?UTF-8?q?=E5=88=9D=E5=A7=8B=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .idea/.gitignore | 10 + .idea/compiler.xml | 18 + .idea/encodings.xml | 6 + .idea/inspectionProfiles/Project_Default.xml | 7 + .idea/jarRepositories.xml | 20 ++ .idea/misc.xml | 12 + .idea/vcs.xml | 6 + app-err.log | 12 + app-out.log | 78 +++++ app-out3.log | 71 ++++ build.log | 168 +++++++++ build2.log | 63 ++++ pom.xml | 68 ++++ run.log | 69 ++++ .../java/com/tracexd/TracexdApplication.java | 41 +++ src/main/java/com/tracexd/common/Result.java | 44 +++ .../com/tracexd/common/VoiceTaskManager.java | 60 ++++ .../common/exception/BusinessException.java | 22 ++ .../exception/GlobalExceptionHandler.java | 28 ++ .../java/com/tracexd/config/AsyncConfig.java | 27 ++ .../com/tracexd/config/MybatisPlusConfig.java | 22 ++ .../com/tracexd/config/RestClientConfig.java | 17 + .../com/tracexd/config/SecurityConfig.java | 88 +++++ .../tracexd/controller/PageController.java | 40 +++ .../tracexd/controller/RecordController.java | 61 ++++ .../tracexd/controller/VoiceController.java | 76 ++++ .../java/com/tracexd/enums/DictTypeEnum.java | 26 ++ .../java/com/tracexd/enums/IntentType.java | 16 + .../com/tracexd/mapper/DictTagMapper.java | 10 + .../java/com/tracexd/mapper/RecordMapper.java | 10 + .../com/tracexd/mapper/SysUserMapper.java | 17 + .../com/tracexd/model/dto/RecordQueryDTO.java | 33 ++ .../tracexd/model/dto/VoiceProcessResult.java | 35 ++ .../com/tracexd/model/entity/DictTag.java | 36 ++ .../java/com/tracexd/model/entity/Record.java | 53 +++ .../com/tracexd/model/entity/SysUser.java | 40 +++ .../com/tracexd/service/ai/AiService.java | 164 +++++++++ .../com/tracexd/service/asr/AsrService.java | 85 +++++ .../service/record/DictTagService.java | 56 +++ .../tracexd/service/record/RecordService.java | 81 +++++ .../com/tracexd/service/sql/SqlValidator.java | 102 ++++++ .../service/voice/VoiceProcessService.java | 238 +++++++++++++ src/main/resources/application-test.yml | 18 + src/main/resources/application.yml | 59 ++++ src/main/resources/init-schema.sql | 37 ++ .../appspecific/com.chrome.devtools.json | 1 + src/main/resources/static/css/style.css | 119 +++++++ src/main/resources/static/favicon.ico | Bin 0 -> 4286 bytes src/main/resources/static/js/app.js | 63 ++++ src/main/resources/templates/browse.html | 271 +++++++++++++++ src/main/resources/templates/index.html | 329 ++++++++++++++++++ src/main/resources/templates/login.html | 38 ++ .../com/tracexd/TracexdApplicationTests.java | 15 + stderr.log | 12 + stdout.log | 45 +++ target/classes/application-test.yml | 18 + target/classes/application.yml | 59 ++++ .../com/tracexd/TracexdApplication.class | Bin 0 -> 3144 bytes .../classes/com/tracexd/common/Result.class | Bin 0 -> 2293 bytes .../com/tracexd/common/VoiceTaskManager.class | Bin 0 -> 4585 bytes .../common/exception/BusinessException.class | Bin 0 -> 692 bytes .../exception/GlobalExceptionHandler.class | Bin 0 -> 1940 bytes .../com/tracexd/config/AsyncConfig.class | Bin 0 -> 1264 bytes .../tracexd/config/MybatisPlusConfig.class | Bin 0 -> 1100 bytes .../com/tracexd/config/RestClientConfig.class | Bin 0 -> 831 bytes .../com/tracexd/config/SecurityConfig.class | Bin 0 -> 9936 bytes .../tracexd/controller/PageController.class | Bin 0 -> 1353 bytes .../tracexd/controller/RecordController.class | Bin 0 -> 3876 bytes .../tracexd/controller/VoiceController.class | Bin 0 -> 4206 bytes .../com/tracexd/enums/DictTypeEnum.class | Bin 0 -> 1456 bytes .../com/tracexd/enums/IntentType.class | Bin 0 -> 1172 bytes .../com/tracexd/mapper/DictTagMapper.class | Bin 0 -> 307 bytes .../com/tracexd/mapper/RecordMapper.class | Bin 0 -> 304 bytes .../com/tracexd/mapper/SysUserMapper.class | Bin 0 -> 2546 bytes .../tracexd/model/dto/RecordQueryDTO.class | Bin 0 -> 2179 bytes .../model/dto/VoiceProcessResult.class | Bin 0 -> 2275 bytes .../com/tracexd/model/entity/DictTag.class | Bin 0 -> 1729 bytes .../com/tracexd/model/entity/Record.class | Bin 0 -> 2612 bytes .../com/tracexd/model/entity/SysUser.class | Bin 0 -> 2044 bytes .../service/ai/AiService$IntentResult.class | Bin 0 -> 1924 bytes .../com/tracexd/service/ai/AiService.class | Bin 0 -> 8325 bytes .../com/tracexd/service/asr/AsrService.class | Bin 0 -> 4943 bytes .../service/record/DictTagService.class | Bin 0 -> 5053 bytes .../service/record/RecordService.class | Bin 0 -> 8775 bytes .../tracexd/service/sql/SqlValidator.class | Bin 0 -> 3170 bytes .../service/voice/VoiceProcessService$1.class | Bin 0 -> 803 bytes .../service/voice/VoiceProcessService.class | Bin 0 -> 11822 bytes target/classes/init-schema.sql | 37 ++ .../appspecific/com.chrome.devtools.json | 1 + target/classes/static/css/style.css | 119 +++++++ target/classes/static/favicon.ico | Bin 0 -> 4286 bytes target/classes/static/js/app.js | 63 ++++ target/classes/templates/browse.html | 271 +++++++++++++++ target/classes/templates/index.html | 329 ++++++++++++++++++ target/classes/templates/login.html | 38 ++ .../compile/default-compile/createdFiles.lst | 30 ++ .../compile/default-compile/inputFiles.lst | 28 ++ .../default-testCompile/createdFiles.lst | 1 + .../default-testCompile/inputFiles.lst | 1 + .../com/tracexd/TracexdApplicationTests.class | Bin 0 -> 530 bytes 100 files changed, 4138 insertions(+) create mode 100644 .idea/.gitignore create mode 100644 .idea/compiler.xml create mode 100644 .idea/encodings.xml create mode 100644 .idea/inspectionProfiles/Project_Default.xml create mode 100644 .idea/jarRepositories.xml create mode 100644 .idea/misc.xml create mode 100644 .idea/vcs.xml create mode 100644 app-err.log create mode 100644 app-out.log create mode 100644 app-out3.log create mode 100644 build.log create mode 100644 build2.log create mode 100644 pom.xml create mode 100644 run.log create mode 100644 src/main/java/com/tracexd/TracexdApplication.java create mode 100644 src/main/java/com/tracexd/common/Result.java create mode 100644 src/main/java/com/tracexd/common/VoiceTaskManager.java create mode 100644 src/main/java/com/tracexd/common/exception/BusinessException.java create mode 100644 src/main/java/com/tracexd/common/exception/GlobalExceptionHandler.java create mode 100644 src/main/java/com/tracexd/config/AsyncConfig.java create mode 100644 src/main/java/com/tracexd/config/MybatisPlusConfig.java create mode 100644 src/main/java/com/tracexd/config/RestClientConfig.java create mode 100644 src/main/java/com/tracexd/config/SecurityConfig.java create mode 100644 src/main/java/com/tracexd/controller/PageController.java create mode 100644 src/main/java/com/tracexd/controller/RecordController.java create mode 100644 src/main/java/com/tracexd/controller/VoiceController.java create mode 100644 src/main/java/com/tracexd/enums/DictTypeEnum.java create mode 100644 src/main/java/com/tracexd/enums/IntentType.java create mode 100644 src/main/java/com/tracexd/mapper/DictTagMapper.java create mode 100644 src/main/java/com/tracexd/mapper/RecordMapper.java create mode 100644 src/main/java/com/tracexd/mapper/SysUserMapper.java create mode 100644 src/main/java/com/tracexd/model/dto/RecordQueryDTO.java create mode 100644 src/main/java/com/tracexd/model/dto/VoiceProcessResult.java create mode 100644 src/main/java/com/tracexd/model/entity/DictTag.java create mode 100644 src/main/java/com/tracexd/model/entity/Record.java create mode 100644 src/main/java/com/tracexd/model/entity/SysUser.java create mode 100644 src/main/java/com/tracexd/service/ai/AiService.java create mode 100644 src/main/java/com/tracexd/service/asr/AsrService.java create mode 100644 src/main/java/com/tracexd/service/record/DictTagService.java create mode 100644 src/main/java/com/tracexd/service/record/RecordService.java create mode 100644 src/main/java/com/tracexd/service/sql/SqlValidator.java create mode 100644 src/main/java/com/tracexd/service/voice/VoiceProcessService.java create mode 100644 src/main/resources/application-test.yml create mode 100644 src/main/resources/application.yml create mode 100644 src/main/resources/init-schema.sql create mode 100644 src/main/resources/static/.well-known/appspecific/com.chrome.devtools.json create mode 100644 src/main/resources/static/css/style.css create mode 100644 src/main/resources/static/favicon.ico create mode 100644 src/main/resources/static/js/app.js create mode 100644 src/main/resources/templates/browse.html create mode 100644 src/main/resources/templates/index.html create mode 100644 src/main/resources/templates/login.html create mode 100644 src/test/java/com/tracexd/TracexdApplicationTests.java create mode 100644 stderr.log create mode 100644 stdout.log create mode 100644 target/classes/application-test.yml create mode 100644 target/classes/application.yml create mode 100644 target/classes/com/tracexd/TracexdApplication.class create mode 100644 target/classes/com/tracexd/common/Result.class create mode 100644 target/classes/com/tracexd/common/VoiceTaskManager.class create mode 100644 target/classes/com/tracexd/common/exception/BusinessException.class create mode 100644 target/classes/com/tracexd/common/exception/GlobalExceptionHandler.class create mode 100644 target/classes/com/tracexd/config/AsyncConfig.class create mode 100644 target/classes/com/tracexd/config/MybatisPlusConfig.class create mode 100644 target/classes/com/tracexd/config/RestClientConfig.class create mode 100644 target/classes/com/tracexd/config/SecurityConfig.class create mode 100644 target/classes/com/tracexd/controller/PageController.class create mode 100644 target/classes/com/tracexd/controller/RecordController.class create mode 100644 target/classes/com/tracexd/controller/VoiceController.class create mode 100644 target/classes/com/tracexd/enums/DictTypeEnum.class create mode 100644 target/classes/com/tracexd/enums/IntentType.class create mode 100644 target/classes/com/tracexd/mapper/DictTagMapper.class create mode 100644 target/classes/com/tracexd/mapper/RecordMapper.class create mode 100644 target/classes/com/tracexd/mapper/SysUserMapper.class create mode 100644 target/classes/com/tracexd/model/dto/RecordQueryDTO.class create mode 100644 target/classes/com/tracexd/model/dto/VoiceProcessResult.class create mode 100644 target/classes/com/tracexd/model/entity/DictTag.class create mode 100644 target/classes/com/tracexd/model/entity/Record.class create mode 100644 target/classes/com/tracexd/model/entity/SysUser.class create mode 100644 target/classes/com/tracexd/service/ai/AiService$IntentResult.class create mode 100644 target/classes/com/tracexd/service/ai/AiService.class create mode 100644 target/classes/com/tracexd/service/asr/AsrService.class create mode 100644 target/classes/com/tracexd/service/record/DictTagService.class create mode 100644 target/classes/com/tracexd/service/record/RecordService.class create mode 100644 target/classes/com/tracexd/service/sql/SqlValidator.class create mode 100644 target/classes/com/tracexd/service/voice/VoiceProcessService$1.class create mode 100644 target/classes/com/tracexd/service/voice/VoiceProcessService.class create mode 100644 target/classes/init-schema.sql create mode 100644 target/classes/static/.well-known/appspecific/com.chrome.devtools.json create mode 100644 target/classes/static/css/style.css create mode 100644 target/classes/static/favicon.ico create mode 100644 target/classes/static/js/app.js create mode 100644 target/classes/templates/browse.html create mode 100644 target/classes/templates/index.html create mode 100644 target/classes/templates/login.html create mode 100644 target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst create mode 100644 target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst create mode 100644 target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/createdFiles.lst create mode 100644 target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst create mode 100644 target/test-classes/com/tracexd/TracexdApplicationTests.class diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..f6906f2 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,10 @@ +# 默认忽略的文件 +/shelf/ +/workspace.xml +# 基于编辑器的 HTTP 客户端请求 +/httpRequests/ +# 已忽略包含查询文件的默认文件夹 +/queries/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/.idea/compiler.xml b/.idea/compiler.xml new file mode 100644 index 0000000..d25f586 --- /dev/null +++ b/.idea/compiler.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/encodings.xml b/.idea/encodings.xml new file mode 100644 index 0000000..63e9001 --- /dev/null +++ b/.idea/encodings.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml new file mode 100644 index 0000000..04e43cf --- /dev/null +++ b/.idea/inspectionProfiles/Project_Default.xml @@ -0,0 +1,7 @@ + + + + \ No newline at end of file diff --git a/.idea/jarRepositories.xml b/.idea/jarRepositories.xml new file mode 100644 index 0000000..712ab9d --- /dev/null +++ b/.idea/jarRepositories.xml @@ -0,0 +1,20 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000..ad7d837 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,12 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..94a25f7 --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/app-err.log b/app-err.log new file mode 100644 index 0000000..cfda8bc --- /dev/null +++ b/app-err.log @@ -0,0 +1,12 @@ +WARNING: A restricted method in java.lang.System has been called +WARNING: java.lang.System::load has been called by org.fusesource.jansi.internal.JansiLoader in an unnamed module (file:/C:/Users/16332/.m2/wrapper/dists/apache-maven-3.9.9-bin/4nf9hui3q3djbarqar9g711ggc/apache-maven-3.9.9/lib/jansi-2.4.1.jar) +WARNING: Use --enable-native-access=ALL-UNNAMED to avoid a warning for callers in this module +WARNING: Restricted methods will be blocked in a future release unless native access is enabled + +WARNING: A terminally deprecated method in sun.misc.Unsafe has been called +WARNING: sun.misc.Unsafe::objectFieldOffset has been called by com.google.common.util.concurrent.AbstractFuture$UnsafeAtomicHelper (file:/C:/Users/16332/.m2/wrapper/dists/apache-maven-3.9.9-bin/4nf9hui3q3djbarqar9g711ggc/apache-maven-3.9.9/lib/guava-33.2.1-jre.jar) +WARNING: Please consider reporting this to the maintainers of class com.google.common.util.concurrent.AbstractFuture$UnsafeAtomicHelper +WARNING: sun.misc.Unsafe::objectFieldOffset will be removed in a future release +WARNING: Final field _cipher in class org.sonatype.plexus.components.sec.dispatcher.DefaultSecDispatcher has been mutated reflectively by class org.eclipse.sisu.bean.BeanPropertyField in unnamed module @780cb77 (file:/C:/Users/16332/.m2/wrapper/dists/apache-maven-3.9.9-bin/4nf9hui3q3djbarqar9g711ggc/apache-maven-3.9.9/lib/org.eclipse.sisu.inject-0.9.0.M3.jar) +WARNING: Use --enable-final-field-mutation=ALL-UNNAMED to avoid a warning +WARNING: Mutating final fields will be blocked in a future release unless final field mutation is enabled diff --git a/app-out.log b/app-out.log new file mode 100644 index 0000000..467e997 --- /dev/null +++ b/app-out.log @@ -0,0 +1,78 @@ +[INFO] Scanning for projects... +[INFO] +[INFO] ------------------------< com.tracexd:tracexd >------------------------- +[INFO] Building tracexd 1.0.0 +[INFO] from pom.xml +[INFO] --------------------------------[ jar ]--------------------------------- +[INFO] +[INFO] --- clean:3.4.1:clean (default-clean) @ tracexd --- +[INFO] Deleting C:\Work\tracexd\target +[INFO] +[INFO] >>> spring-boot:3.5.14:run (default-cli) > test-compile @ tracexd >>> +[INFO] +[INFO] --- resources:3.3.1:resources (default-resources) @ tracexd --- +[INFO] Copying 2 resources from src\main\resources to target\classes +[INFO] Copying 6 resources from src\main\resources to target\classes +[INFO] +[INFO] --- compiler:3.14.1:compile (default-compile) @ tracexd --- +[INFO] Recompiling the module because of changed source code. +[INFO] Compiling 27 source files with javac [debug parameters release 26] to target\classes +[INFO] /C:/Work/tracexd/src/main/java/com/tracexd/controller/VoiceController.java: ijЩļʹδ򲻰ȫIJ +[INFO] /C:/Work/tracexd/src/main/java/com/tracexd/controller/VoiceController.java: йϸϢ, ʹ -Xlint:unchecked ±롣 +[INFO] +[INFO] --- resources:3.3.1:testResources (default-testResources) @ tracexd --- +[INFO] skip non existing resourceDirectory C:\Work\tracexd\src\test\resources +[INFO] +[INFO] --- compiler:3.14.1:testCompile (default-testCompile) @ tracexd --- +[INFO] Recompiling the module because of changed dependency. +[INFO] Compiling 1 source file with javac [debug parameters release 26] to target\test-classes +[INFO] +[INFO] <<< spring-boot:3.5.14:run (default-cli) < test-compile @ tracexd <<< +[INFO] +[INFO] +[INFO] --- spring-boot:3.5.14:run (default-cli) @ tracexd --- +[INFO] Attaching agents: [] +2026-06-09T14:10:37.892+08:00 INFO 14244 --- [ main] com.tracexd.TracexdApplication : Starting TracexdApplication using Java 26.0.1 with PID 14244 (C:\Work\tracexd\target\classes started by 16332 in C:\Work\tracexd) +2026-06-09T14:10:37.893+08:00 DEBUG 14244 --- [ main] com.tracexd.TracexdApplication : Running with Spring Boot v3.5.14, Spring v6.2.18 +2026-06-09T14:10:37.894+08:00 INFO 14244 --- [ main] com.tracexd.TracexdApplication : The following 1 profile is active: "test" +2026-06-09T14:10:38.478+08:00 INFO 14244 --- [ main] o.apache.catalina.core.StandardService : Starting service [Tomcat] +2026-06-09T14:10:38.478+08:00 INFO 14244 --- [ main] o.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/10.1.54] +2026-06-09T14:10:38.504+08:00 INFO 14244 --- [ main] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext +Logging initialized using 'class org.apache.ibatis.logging.stdout.StdOutImpl' adapter. +Get /198.18.0.1 network interface +Get network interface info: name:iftype53_32769 (Meta Tunnel) +Initialization Sequence datacenterId:0 workerId:31 +2026-06-09T14:10:38.600+08:00 INFO 14244 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting... +2026-06-09T14:10:38.699+08:00 INFO 14244 --- [ main] com.zaxxer.hikari.pool.HikariPool : HikariPool-1 - Added connection conn0: url=jdbc:h2:mem:tracexd user=SA +2026-06-09T14:10:38.699+08:00 INFO 14244 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed. +2026-06-09T14:10:39.114+08:00 INFO 14244 --- [ main] m.e.s.MybatisPlusApplicationContextAware : Register ApplicationContext instances org.springframework.boot.web.servlet.context.AnnotationConfigServletWebServerApplicationContext@e383572 +2026-06-09T14:10:39.150+08:00 WARN 14244 --- [ main] ConfigServletWebServerApplicationContext : Exception encountered during context initialization - cancelling refresh attempt: org.springframework.context.ApplicationContextException: Failed to start bean 'webServerStartStop' +2026-06-09T14:10:39.151+08:00 INFO 14244 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown initiated... +2026-06-09T14:10:39.152+08:00 INFO 14244 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown completed. +2026-06-09T14:10:39.166+08:00 ERROR 14244 --- [ main] o.s.b.d.LoggingFailureAnalysisReporter : + +*************************** +APPLICATION FAILED TO START +*************************** + +Description: + +Web server failed to start. Port 8080 was already in use. + +Action: + +Identify and stop the process that's listening on port 8080 or configure this application to listen on another port. + +[INFO] ------------------------------------------------------------------------ +[INFO] BUILD FAILURE +[INFO] ------------------------------------------------------------------------ +[INFO] Total time: 3.910 s +[INFO] Finished at: 2026-06-09T14:10:39+08:00 +[INFO] ------------------------------------------------------------------------ +[ERROR] Failed to execute goal org.springframework.boot:spring-boot-maven-plugin:3.5.14:run (default-cli) on project tracexd: Process terminated with exit code: 1 -> [Help 1] +[ERROR] +[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch. +[ERROR] Re-run Maven using the -X switch to enable full debug logging. +[ERROR] +[ERROR] For more information about the errors and possible solutions, please read the following articles: +[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoExecutionException diff --git a/app-out3.log b/app-out3.log new file mode 100644 index 0000000..c68f266 --- /dev/null +++ b/app-out3.log @@ -0,0 +1,71 @@ +[INFO] Scanning for projects... +[INFO] +[INFO] ------------------------< com.tracexd:tracexd >------------------------- +[INFO] Building tracexd 1.0.0 +[INFO] from pom.xml +[INFO] --------------------------------[ jar ]--------------------------------- +[INFO] +[INFO] >>> spring-boot:3.5.14:run (default-cli) > test-compile @ tracexd >>> +[INFO] +[INFO] --- resources:3.3.1:resources (default-resources) @ tracexd --- +[INFO] Copying 2 resources from src\main\resources to target\classes +[INFO] Copying 6 resources from src\main\resources to target\classes +[INFO] +[INFO] --- compiler:3.14.1:compile (default-compile) @ tracexd --- +[INFO] Nothing to compile - all classes are up to date. +[INFO] +[INFO] --- resources:3.3.1:testResources (default-testResources) @ tracexd --- +[INFO] skip non existing resourceDirectory C:\Work\tracexd\src\test\resources +[INFO] +[INFO] --- compiler:3.14.1:testCompile (default-testCompile) @ tracexd --- +[INFO] Nothing to compile - all classes are up to date. +[INFO] +[INFO] <<< spring-boot:3.5.14:run (default-cli) < test-compile @ tracexd <<< +[INFO] +[INFO] +[INFO] --- spring-boot:3.5.14:run (default-cli) @ tracexd --- +[INFO] Attaching agents: [] +2026-06-09T14:11:45.473+08:00 INFO 12060 --- [ main] com.tracexd.TracexdApplication : Starting TracexdApplication using Java 26.0.1 with PID 12060 (C:\Work\tracexd\target\classes started by 16332 in C:\Work\tracexd) +2026-06-09T14:11:45.474+08:00 DEBUG 12060 --- [ main] com.tracexd.TracexdApplication : Running with Spring Boot v3.5.14, Spring v6.2.18 +2026-06-09T14:11:45.475+08:00 INFO 12060 --- [ main] com.tracexd.TracexdApplication : The following 1 profile is active: "test" +2026-06-09T14:11:46.059+08:00 INFO 12060 --- [ main] o.apache.catalina.core.StandardService : Starting service [Tomcat] +2026-06-09T14:11:46.060+08:00 INFO 12060 --- [ main] o.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/10.1.54] +2026-06-09T14:11:46.087+08:00 INFO 12060 --- [ main] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext +Logging initialized using 'class org.apache.ibatis.logging.stdout.StdOutImpl' adapter. +Get /198.18.0.1 network interface +Get network interface info: name:iftype53_32769 (Meta Tunnel) +Initialization Sequence datacenterId:0 workerId:25 +2026-06-09T14:11:46.186+08:00 INFO 12060 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting... +2026-06-09T14:11:46.285+08:00 INFO 12060 --- [ main] com.zaxxer.hikari.pool.HikariPool : HikariPool-1 - Added connection conn0: url=jdbc:h2:mem:tracexd user=SA +2026-06-09T14:11:46.286+08:00 INFO 12060 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed. +2026-06-09T14:11:46.713+08:00 INFO 12060 --- [ main] m.e.s.MybatisPlusApplicationContextAware : Register ApplicationContext instances org.springframework.boot.web.servlet.context.AnnotationConfigServletWebServerApplicationContext@e383572 +2026-06-09T14:11:46.748+08:00 WARN 12060 --- [ main] ConfigServletWebServerApplicationContext : Exception encountered during context initialization - cancelling refresh attempt: org.springframework.context.ApplicationContextException: Failed to start bean 'webServerStartStop' +2026-06-09T14:11:46.749+08:00 INFO 12060 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown initiated... +2026-06-09T14:11:46.750+08:00 INFO 12060 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown completed. +2026-06-09T14:11:46.764+08:00 ERROR 12060 --- [ main] o.s.b.d.LoggingFailureAnalysisReporter : + +*************************** +APPLICATION FAILED TO START +*************************** + +Description: + +Web server failed to start. Port 8080 was already in use. + +Action: + +Identify and stop the process that's listening on port 8080 or configure this application to listen on another port. + +[INFO] ------------------------------------------------------------------------ +[INFO] BUILD FAILURE +[INFO] ------------------------------------------------------------------------ +[INFO] Total time: 2.975 s +[INFO] Finished at: 2026-06-09T14:11:47+08:00 +[INFO] ------------------------------------------------------------------------ +[ERROR] Failed to execute goal org.springframework.boot:spring-boot-maven-plugin:3.5.14:run (default-cli) on project tracexd: Process terminated with exit code: 1 -> [Help 1] +[ERROR] +[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch. +[ERROR] Re-run Maven using the -X switch to enable full debug logging. +[ERROR] +[ERROR] For more information about the errors and possible solutions, please read the following articles: +[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoExecutionException diff --git a/build.log b/build.log new file mode 100644 index 0000000..5de9a20 --- /dev/null +++ b/build.log @@ -0,0 +1,168 @@ +mvn : WARNING: A restricted method in java.lang.System has been called +所在位置 行:4 字符: 1 ++ mvn compile 2>&1 | Out-File "C:\Work\tracexd\build.log" -Encoding utf ... ++ ~~~~~~~~~~~~~~~~ + + CategoryInfo : NotSpecified: (WARNING: A rest...has been called:String) [], RemoteException + + FullyQualifiedErrorId : NativeCommandError + +WARNING: java.lang.System::load has been called by org.fusesource.jansi.internal.JansiLoader in an unnamed module (file +:/C:/Users/16332/.m2/wrapper/dists/apache-maven-3.9.9-bin/4nf9hui3q3djbarqar9g711ggc/apache-maven-3.9.9/lib/jansi-2.4.1 +.jar) +WARNING: Use --enable-native-access=ALL-UNNAMED to avoid a warning for callers in this module +WARNING: Restricted methods will be blocked in a future release unless native access is enabled + +WARNING: A terminally deprecated method in sun.misc.Unsafe has been called +WARNING: sun.misc.Unsafe::objectFieldOffset has been called by com.google.common.util.concurrent.AbstractFuture$UnsafeA +tomicHelper (file:/C:/Users/16332/.m2/wrapper/dists/apache-maven-3.9.9-bin/4nf9hui3q3djbarqar9g711ggc/apache-maven-3.9. +9/lib/guava-33.2.1-jre.jar) +WARNING: Please consider reporting this to the maintainers of class com.google.common.util.concurrent.AbstractFuture$Un +safeAtomicHelper +WARNING: sun.misc.Unsafe::objectFieldOffset will be removed in a future release +WARNING: Final field _cipher in class org.sonatype.plexus.components.sec.dispatcher.DefaultSecDispatcher has been mutat +ed reflectively by class org.eclipse.sisu.bean.BeanPropertyField in unnamed module @11dc3715 (file:/C:/Users/16332/.m2/ +wrapper/dists/apache-maven-3.9.9-bin/4nf9hui3q3djbarqar9g711ggc/apache-maven-3.9.9/lib/org.eclipse.sisu.inject-0.9.0.M3 +.jar) +WARNING: Use --enable-final-field-mutation=ALL-UNNAMED to avoid a warning +WARNING: Mutating final fields will be blocked in a future release unless final field mutation is enabled +[INFO] Scanning for projects... +Downloading from central: https://repo.maven.apache.org/maven2/org/apache/activemq/activemq-bom/6.1.8/activemq-bom-6.1.8.pom +Downloading from central: https://repo.maven.apache.org/maven2/org/apache/activemq/artemis-bom/2.40.0/artemis-bom-2.40.0.pom +Downloading from central: https://repo.maven.apache.org/maven2/org/assertj/assertj-bom/3.27.7/assertj-bom-3.27.7.pom +Downloading from central: https://repo.maven.apache.org/maven2/io/zipkin/reporter2/zipkin-reporter-bom/3.5.3/zipkin-reporter-bom-3.5.3.pom +Downloading from central: https://repo.maven.apache.org/maven2/io/zipkin/brave/brave-bom/6.1.0/brave-bom-6.1.0.pom +Downloading from central: https://repo.maven.apache.org/maven2/org/apache/cassandra/java-driver-bom/4.19.2/java-driver-bom-4.19.2.pom +Downloading from central: https://repo.maven.apache.org/maven2/org/glassfish/jaxb/jaxb-bom/4.0.6/jaxb-bom-4.0.6.pom +Downloading from central: https://repo.maven.apache.org/maven2/org/apache/groovy/groovy-bom/4.0.31/groovy-bom-4.0.31.pom +Downloading from central: https://repo.maven.apache.org/maven2/org/infinispan/infinispan-bom/15.2.6.Final/infinispan-bom-15.2.6.Final.pom +Downloading from central: https://repo.maven.apache.org/maven2/com/fasterxml/jackson/jackson-bom/2.21.2/jackson-bom-2.21.2.pom +Downloading from central: https://repo.maven.apache.org/maven2/org/glassfish/jersey/jersey-bom/3.1.11/jersey-bom-3.1.11.pom +Downloading from central: https://repo.maven.apache.org/maven2/org/eclipse/jetty/ee10/jetty-ee10-bom/12.0.34/jetty-ee10-bom-12.0.34.pom +Downloading from central: https://repo.maven.apache.org/maven2/org/eclipse/jetty/jetty-bom/12.0.34/jetty-bom-12.0.34.pom +Downloading from central: https://repo.maven.apache.org/maven2/org/junit/junit-bom/5.12.2/junit-bom-5.12.2.pom +Downloading from central: https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-bom/1.9.25/kotlin-bom-1.9.25.pom +Downloading from central: https://repo.maven.apache.org/maven2/org/jetbrains/kotlinx/kotlinx-coroutines-bom/1.8.1/kotlinx-coroutines-bom-1.8.1.pom +Downloading from central: https://repo.maven.apache.org/maven2/org/jetbrains/kotlinx/kotlinx-serialization-bom/1.6.3/kotlinx-serialization-bom-1.6.3.pom +Downloading from central: https://repo.maven.apache.org/maven2/org/apache/logging/log4j/log4j-bom/2.24.3/log4j-bom-2.24.3.pom +Downloading from central: https://repo.maven.apache.org/maven2/io/micrometer/micrometer-bom/1.15.11/micrometer-bom-1.15.11.pom +Downloading from central: https://repo.maven.apache.org/maven2/org/mockito/mockito-bom/5.17.0/mockito-bom-5.17.0.pom +Downloading from central: https://repo.maven.apache.org/maven2/org/mongodb/mongodb-driver-bom/5.5.2/mongodb-driver-bom-5.5.2.pom +Downloading from central: https://repo.maven.apache.org/maven2/io/netty/netty-bom/4.1.132.Final/netty-bom-4.1.132.Final.pom +Downloading from central: https://repo.maven.apache.org/maven2/io/opentelemetry/opentelemetry-bom/1.49.0/opentelemetry-bom-1.49.0.pom +Downloading from central: https://repo.maven.apache.org/maven2/io/prometheus/prometheus-metrics-bom/1.3.10/prometheus-metrics-bom-1.3.10.pom +Downloading from central: https://repo.maven.apache.org/maven2/io/prometheus/simpleclient_bom/0.16.0/simpleclient_bom-0.16.0.pom +Downloading from central: https://repo.maven.apache.org/maven2/org/apache/pulsar/pulsar-bom/4.0.9/pulsar-bom-4.0.9.pom +Downloading from central: https://repo.maven.apache.org/maven2/org/apache/pulsar/pulsar-client-reactive-bom/0.6.0/pulsar-client-reactive-bom-0.6.0.pom +Downloading from central: https://repo.maven.apache.org/maven2/com/querydsl/querydsl-bom/5.1.0/querydsl-bom-5.1.0.pom +Downloading from central: https://repo.maven.apache.org/maven2/io/projectreactor/reactor-bom/2024.0.17/reactor-bom-2024.0.17.pom +Downloading from central: https://repo.maven.apache.org/maven2/io/rest-assured/rest-assured-bom/5.5.7/rest-assured-bom-5.5.7.pom +Downloading from central: https://repo.maven.apache.org/maven2/io/rsocket/rsocket-bom/1.1.5/rsocket-bom-1.1.5.pom +Downloading from central: https://repo.maven.apache.org/maven2/org/seleniumhq/selenium/selenium-bom/4.31.0/selenium-bom-4.31.0.pom +Downloading from central: https://repo.maven.apache.org/maven2/org/springframework/amqp/spring-amqp-bom/3.2.10/spring-amqp-bom-3.2.10.pom +Downloading from central: https://repo.maven.apache.org/maven2/org/springframework/batch/spring-batch-bom/5.2.5/spring-batch-bom-5.2.5.pom +Downloading from central: https://repo.maven.apache.org/maven2/org/springframework/data/spring-data-bom/2025.0.11/spring-data-bom-2025.0.11.pom +Downloading from central: https://repo.maven.apache.org/maven2/org/springframework/spring-framework-bom/6.2.18/spring-framework-bom-6.2.18.pom +Downloading from central: https://repo.maven.apache.org/maven2/org/springframework/integration/spring-integration-bom/6.5.8/spring-integration-bom-6.5.8.pom +Downloading from central: https://repo.maven.apache.org/maven2/org/springframework/pulsar/spring-pulsar-bom/1.2.17/spring-pulsar-bom-1.2.17.pom +Downloading from central: https://repo.maven.apache.org/maven2/org/springframework/restdocs/spring-restdocs-bom/3.0.5/spring-restdocs-bom-3.0.5.pom +Downloading from central: https://repo.maven.apache.org/maven2/org/springframework/security/spring-security-bom/6.5.10/spring-security-bom-6.5.10.pom +Downloading from central: https://repo.maven.apache.org/maven2/org/springframework/session/spring-session-bom/3.5.6/spring-session-bom-3.5.6.pom +Downloading from central: https://repo.maven.apache.org/maven2/org/springframework/ws/spring-ws-bom/4.1.3/spring-ws-bom-4.1.3.pom +Downloading from central: https://repo.maven.apache.org/maven2/org/testcontainers/testcontainers-bom/1.21.4/testcontainers-bom-1.21.4.pom +[ERROR] [ERROR] Some problems were encountered while processing the POMs: +[ERROR] Non-resolvable import POM: The following artifacts could not be resolved: org.apache.activemq:activemq-bom:pom:6.1.8 (absent): Could not transfer artifact org.apache.activemq:activemq-bom:pom:6.1.8 from/to central (https://repo.maven.apache.org/maven2): Permission denied: getsockopt @ org.springframework.boot:spring-boot-dependencies:3.5.14, C:\Work\tracexd\spring-boot-dependencies-3.5.14.pom, line 2124, column 19 +[ERROR] Non-resolvable import POM: The following artifacts could not be resolved: org.apache.activemq:artemis-bom:pom:2.40.0 (absent): Could not transfer artifact org.apache.activemq:artemis-bom:pom:2.40.0 from/to central (https://repo.maven.apache.org/maven2): Permission denied: getsockopt @ org.springframework.boot:spring-boot-dependencies:3.5.14, C:\Work\tracexd\spring-boot-dependencies-3.5.14.pom, line 2131, column 19 +[ERROR] Non-resolvable import POM: The following artifacts could not be resolved: org.assertj:assertj-bom:pom:3.27.7 (absent): Could not transfer artifact org.assertj:assertj-bom:pom:3.27.7 from/to central (https://repo.maven.apache.org/maven2): Permission denied: getsockopt @ org.springframework.boot:spring-boot-dependencies:3.5.14, C:\Work\tracexd\spring-boot-dependencies-3.5.14.pom, line 2138, column 19 +[ERROR] Non-resolvable import POM: The following artifacts could not be resolved: io.zipkin.reporter2:zipkin-reporter-bom:pom:3.5.3 (absent): Could not transfer artifact io.zipkin.reporter2:zipkin-reporter-bom:pom:3.5.3 from/to central (https://repo.maven.apache.org/maven2): Permission denied: getsockopt @ org.springframework.boot:spring-boot-dependencies:3.5.14, C:\Work\tracexd\spring-boot-dependencies-3.5.14.pom, line 2145, column 19 +[ERROR] Non-resolvable import POM: The following artifacts could not be resolved: io.zipkin.brave:brave-bom:pom:6.1.0 (absent): Could not transfer artifact io.zipkin.brave:brave-bom:pom:6.1.0 from/to central (https://repo.maven.apache.org/maven2): Permission denied: getsockopt @ org.springframework.boot:spring-boot-dependencies:3.5.14, C:\Work\tracexd\spring-boot-dependencies-3.5.14.pom, line 2152, column 19 +[ERROR] Non-resolvable import POM: The following artifacts could not be resolved: org.apache.cassandra:java-driver-bom:pom:4.19.2 (absent): Could not transfer artifact org.apache.cassandra:java-driver-bom:pom:4.19.2 from/to central (https://repo.maven.apache.org/maven2): Permission denied: getsockopt @ org.springframework.boot:spring-boot-dependencies:3.5.14, C:\Work\tracexd\spring-boot-dependencies-3.5.14.pom, line 2159, column 19 +[ERROR] Non-resolvable import POM: The following artifacts could not be resolved: org.glassfish.jaxb:jaxb-bom:pom:4.0.6 (absent): Could not transfer artifact org.glassfish.jaxb:jaxb-bom:pom:4.0.6 from/to central (https://repo.maven.apache.org/maven2): Permission denied: getsockopt @ org.springframework.boot:spring-boot-dependencies:3.5.14, C:\Work\tracexd\spring-boot-dependencies-3.5.14.pom, line 2166, column 19 +[ERROR] Non-resolvable import POM: The following artifacts could not be resolved: org.apache.groovy:groovy-bom:pom:4.0.31 (absent): Could not transfer artifact org.apache.groovy:groovy-bom:pom:4.0.31 from/to central (https://repo.maven.apache.org/maven2): Permission denied: getsockopt @ org.springframework.boot:spring-boot-dependencies:3.5.14, C:\Work\tracexd\spring-boot-dependencies-3.5.14.pom, line 2173, column 19 +[ERROR] Non-resolvable import POM: The following artifacts could not be resolved: org.infinispan:infinispan-bom:pom:15.2.6.Final (absent): Could not transfer artifact org.infinispan:infinispan-bom:pom:15.2.6.Final from/to central (https://repo.maven.apache.org/maven2): Permission denied: getsockopt @ org.springframework.boot:spring-boot-dependencies:3.5.14, C:\Work\tracexd\spring-boot-dependencies-3.5.14.pom, line 2180, column 19 +[ERROR] Non-resolvable import POM: The following artifacts could not be resolved: com.fasterxml.jackson:jackson-bom:pom:2.21.2 (absent): Could not transfer artifact com.fasterxml.jackson:jackson-bom:pom:2.21.2 from/to central (https://repo.maven.apache.org/maven2): Permission denied: getsockopt @ org.springframework.boot:spring-boot-dependencies:3.5.14, C:\Work\tracexd\spring-boot-dependencies-3.5.14.pom, line 2187, column 19 +[ERROR] Non-resolvable import POM: The following artifacts could not be resolved: org.glassfish.jersey:jersey-bom:pom:3.1.11 (absent): Could not transfer artifact org.glassfish.jersey:jersey-bom:pom:3.1.11 from/to central (https://repo.maven.apache.org/maven2): Permission denied: getsockopt @ org.springframework.boot:spring-boot-dependencies:3.5.14, C:\Work\tracexd\spring-boot-dependencies-3.5.14.pom, line 2194, column 19 +[ERROR] Non-resolvable import POM: The following artifacts could not be resolved: org.eclipse.jetty.ee10:jetty-ee10-bom:pom:12.0.34 (absent): Could not transfer artifact org.eclipse.jetty.ee10:jetty-ee10-bom:pom:12.0.34 from/to central (https://repo.maven.apache.org/maven2): Permission denied: getsockopt @ org.springframework.boot:spring-boot-dependencies:3.5.14, C:\Work\tracexd\spring-boot-dependencies-3.5.14.pom, line 2201, column 19 +[ERROR] Non-resolvable import POM: The following artifacts could not be resolved: org.eclipse.jetty:jetty-bom:pom:12.0.34 (absent): Could not transfer artifact org.eclipse.jetty:jetty-bom:pom:12.0.34 from/to central (https://repo.maven.apache.org/maven2): Permission denied: getsockopt @ org.springframework.boot:spring-boot-dependencies:3.5.14, C:\Work\tracexd\spring-boot-dependencies-3.5.14.pom, line 2208, column 19 +[ERROR] Non-resolvable import POM: The following artifacts could not be resolved: org.junit:junit-bom:pom:5.12.2 (absent): Could not transfer artifact org.junit:junit-bom:pom:5.12.2 from/to central (https://repo.maven.apache.org/maven2): Permission denied: getsockopt @ org.springframework.boot:spring-boot-dependencies:3.5.14, C:\Work\tracexd\spring-boot-dependencies-3.5.14.pom, line 2215, column 19 +[ERROR] Non-resolvable import POM: The following artifacts could not be resolved: org.jetbrains.kotlin:kotlin-bom:pom:1.9.25 (absent): Could not transfer artifact org.jetbrains.kotlin:kotlin-bom:pom:1.9.25 from/to central (https://repo.maven.apache.org/maven2): Permission denied: getsockopt @ org.springframework.boot:spring-boot-dependencies:3.5.14, C:\Work\tracexd\spring-boot-dependencies-3.5.14.pom, line 2222, column 19 +[ERROR] Non-resolvable import POM: The following artifacts could not be resolved: org.jetbrains.kotlinx:kotlinx-coroutines-bom:pom:1.8.1 (absent): Could not transfer artifact org.jetbrains.kotlinx:kotlinx-coroutines-bom:pom:1.8.1 from/to central (https://repo.maven.apache.org/maven2): Permission denied: getsockopt @ org.springframework.boot:spring-boot-dependencies:3.5.14, C:\Work\tracexd\spring-boot-dependencies-3.5.14.pom, line 2229, column 19 +[ERROR] Non-resolvable import POM: The following artifacts could not be resolved: org.jetbrains.kotlinx:kotlinx-serialization-bom:pom:1.6.3 (absent): Could not transfer artifact org.jetbrains.kotlinx:kotlinx-serialization-bom:pom:1.6.3 from/to central (https://repo.maven.apache.org/maven2): Permission denied: getsockopt @ org.springframework.boot:spring-boot-dependencies:3.5.14, C:\Work\tracexd\spring-boot-dependencies-3.5.14.pom, line 2236, column 19 +[ERROR] Non-resolvable import POM: The following artifacts could not be resolved: org.apache.logging.log4j:log4j-bom:pom:2.24.3 (absent): Could not transfer artifact org.apache.logging.log4j:log4j-bom:pom:2.24.3 from/to central (https://repo.maven.apache.org/maven2): Permission denied: getsockopt @ org.springframework.boot:spring-boot-dependencies:3.5.14, C:\Work\tracexd\spring-boot-dependencies-3.5.14.pom, line 2243, column 19 +[ERROR] Non-resolvable import POM: The following artifacts could not be resolved: io.micrometer:micrometer-bom:pom:1.15.11 (absent): Could not transfer artifact io.micrometer:micrometer-bom:pom:1.15.11 from/to central (https://repo.maven.apache.org/maven2): Permission denied: getsockopt @ org.springframework.boot:spring-boot-dependencies:3.5.14, C:\Work\tracexd\spring-boot-dependencies-3.5.14.pom, line 2250, column 19 +[ERROR] Non-resolvable import POM: The following artifacts could not be resolved: org.mockito:mockito-bom:pom:5.17.0 (absent): Could not transfer artifact org.mockito:mockito-bom:pom:5.17.0 from/to central (https://repo.maven.apache.org/maven2): Permission denied: getsockopt @ org.springframework.boot:spring-boot-dependencies:3.5.14, C:\Work\tracexd\spring-boot-dependencies-3.5.14.pom, line 2257, column 19 +[ERROR] Non-resolvable import POM: The following artifacts could not be resolved: org.mongodb:mongodb-driver-bom:pom:5.5.2 (absent): Could not transfer artifact org.mongodb:mongodb-driver-bom:pom:5.5.2 from/to central (https://repo.maven.apache.org/maven2): Permission denied: getsockopt @ org.springframework.boot:spring-boot-dependencies:3.5.14, C:\Work\tracexd\spring-boot-dependencies-3.5.14.pom, line 2264, column 19 +[ERROR] Non-resolvable import POM: The following artifacts could not be resolved: io.netty:netty-bom:pom:4.1.132.Final (absent): Could not transfer artifact io.netty:netty-bom:pom:4.1.132.Final from/to central (https://repo.maven.apache.org/maven2): Permission denied: getsockopt @ org.springframework.boot:spring-boot-dependencies:3.5.14, C:\Work\tracexd\spring-boot-dependencies-3.5.14.pom, line 2271, column 19 +[ERROR] Non-resolvable import POM: The following artifacts could not be resolved: io.opentelemetry:opentelemetry-bom:pom:1.49.0 (absent): Could not transfer artifact io.opentelemetry:opentelemetry-bom:pom:1.49.0 from/to central (https://repo.maven.apache.org/maven2): Permission denied: getsockopt @ org.springframework.boot:spring-boot-dependencies:3.5.14, C:\Work\tracexd\spring-boot-dependencies-3.5.14.pom, line 2278, column 19 +[ERROR] Non-resolvable import POM: The following artifacts could not be resolved: io.prometheus:prometheus-metrics-bom:pom:1.3.10 (absent): Could not transfer artifact io.prometheus:prometheus-metrics-bom:pom:1.3.10 from/to central (https://repo.maven.apache.org/maven2): Permission denied: getsockopt @ org.springframework.boot:spring-boot-dependencies:3.5.14, C:\Work\tracexd\spring-boot-dependencies-3.5.14.pom, line 2285, column 19 +[ERROR] Non-resolvable import POM: The following artifacts could not be resolved: io.prometheus:simpleclient_bom:pom:0.16.0 (absent): Could not transfer artifact io.prometheus:simpleclient_bom:pom:0.16.0 from/to central (https://repo.maven.apache.org/maven2): Permission denied: getsockopt @ org.springframework.boot:spring-boot-dependencies:3.5.14, C:\Work\tracexd\spring-boot-dependencies-3.5.14.pom, line 2292, column 19 +[ERROR] Non-resolvable import POM: The following artifacts could not be resolved: org.apache.pulsar:pulsar-bom:pom:4.0.9 (absent): Could not transfer artifact org.apache.pulsar:pulsar-bom:pom:4.0.9 from/to central (https://repo.maven.apache.org/maven2): Permission denied: getsockopt @ org.springframework.boot:spring-boot-dependencies:3.5.14, C:\Work\tracexd\spring-boot-dependencies-3.5.14.pom, line 2299, column 19 +[ERROR] Non-resolvable import POM: The following artifacts could not be resolved: org.apache.pulsar:pulsar-client-reactive-bom:pom:0.6.0 (absent): Could not transfer artifact org.apache.pulsar:pulsar-client-reactive-bom:pom:0.6.0 from/to central (https://repo.maven.apache.org/maven2): Permission denied: getsockopt @ org.springframework.boot:spring-boot-dependencies:3.5.14, C:\Work\tracexd\spring-boot-dependencies-3.5.14.pom, line 2306, column 19 +[ERROR] Non-resolvable import POM: The following artifacts could not be resolved: com.querydsl:querydsl-bom:pom:5.1.0 (absent): Could not transfer artifact com.querydsl:querydsl-bom:pom:5.1.0 from/to central (https://repo.maven.apache.org/maven2): Permission denied: getsockopt @ org.springframework.boot:spring-boot-dependencies:3.5.14, C:\Work\tracexd\spring-boot-dependencies-3.5.14.pom, line 2313, column 19 +[ERROR] Non-resolvable import POM: The following artifacts could not be resolved: io.projectreactor:reactor-bom:pom:2024.0.17 (absent): Could not transfer artifact io.projectreactor:reactor-bom:pom:2024.0.17 from/to central (https://repo.maven.apache.org/maven2): Permission denied: getsockopt @ org.springframework.boot:spring-boot-dependencies:3.5.14, C:\Work\tracexd\spring-boot-dependencies-3.5.14.pom, line 2320, column 19 +[ERROR] Non-resolvable import POM: The following artifacts could not be resolved: io.rest-assured:rest-assured-bom:pom:5.5.7 (absent): Could not transfer artifact io.rest-assured:rest-assured-bom:pom:5.5.7 from/to central (https://repo.maven.apache.org/maven2): Permission denied: getsockopt @ org.springframework.boot:spring-boot-dependencies:3.5.14, C:\Work\tracexd\spring-boot-dependencies-3.5.14.pom, line 2327, column 19 +[ERROR] Non-resolvable import POM: The following artifacts could not be resolved: io.rsocket:rsocket-bom:pom:1.1.5 (absent): Could not transfer artifact io.rsocket:rsocket-bom:pom:1.1.5 from/to central (https://repo.maven.apache.org/maven2): Permission denied: getsockopt @ org.springframework.boot:spring-boot-dependencies:3.5.14, C:\Work\tracexd\spring-boot-dependencies-3.5.14.pom, line 2334, column 19 +[ERROR] Non-resolvable import POM: The following artifacts could not be resolved: org.seleniumhq.selenium:selenium-bom:pom:4.31.0 (absent): Could not transfer artifact org.seleniumhq.selenium:selenium-bom:pom:4.31.0 from/to central (https://repo.maven.apache.org/maven2): Permission denied: getsockopt @ org.springframework.boot:spring-boot-dependencies:3.5.14, C:\Work\tracexd\spring-boot-dependencies-3.5.14.pom, line 2341, column 19 +[ERROR] Non-resolvable import POM: The following artifacts could not be resolved: org.springframework.amqp:spring-amqp-bom:pom:3.2.10 (absent): Could not transfer artifact org.springframework.amqp:spring-amqp-bom:pom:3.2.10 from/to central (https://repo.maven.apache.org/maven2): Permission denied: getsockopt @ org.springframework.boot:spring-boot-dependencies:3.5.14, C:\Work\tracexd\spring-boot-dependencies-3.5.14.pom, line 2348, column 19 +[ERROR] Non-resolvable import POM: The following artifacts could not be resolved: org.springframework.batch:spring-batch-bom:pom:5.2.5 (absent): Could not transfer artifact org.springframework.batch:spring-batch-bom:pom:5.2.5 from/to central (https://repo.maven.apache.org/maven2): Permission denied: getsockopt @ org.springframework.boot:spring-boot-dependencies:3.5.14, C:\Work\tracexd\spring-boot-dependencies-3.5.14.pom, line 2355, column 19 +[ERROR] Non-resolvable import POM: The following artifacts could not be resolved: org.springframework.data:spring-data-bom:pom:2025.0.11 (absent): Could not transfer artifact org.springframework.data:spring-data-bom:pom:2025.0.11 from/to central (https://repo.maven.apache.org/maven2): Permission denied: getsockopt @ org.springframework.boot:spring-boot-dependencies:3.5.14, C:\Work\tracexd\spring-boot-dependencies-3.5.14.pom, line 2362, column 19 +[ERROR] Non-resolvable import POM: The following artifacts could not be resolved: org.springframework:spring-framework-bom:pom:6.2.18 (absent): Could not transfer artifact org.springframework:spring-framework-bom:pom:6.2.18 from/to central (https://repo.maven.apache.org/maven2): Permission denied: getsockopt @ org.springframework.boot:spring-boot-dependencies:3.5.14, C:\Work\tracexd\spring-boot-dependencies-3.5.14.pom, line 2369, column 19 +[ERROR] Non-resolvable import POM: The following artifacts could not be resolved: org.springframework.integration:spring-integration-bom:pom:6.5.8 (absent): Could not transfer artifact org.springframework.integration:spring-integration-bom:pom:6.5.8 from/to central (https://repo.maven.apache.org/maven2): Permission denied: getsockopt @ org.springframework.boot:spring-boot-dependencies:3.5.14, C:\Work\tracexd\spring-boot-dependencies-3.5.14.pom, line 2376, column 19 +[ERROR] Non-resolvable import POM: The following artifacts could not be resolved: org.springframework.pulsar:spring-pulsar-bom:pom:1.2.17 (absent): Could not transfer artifact org.springframework.pulsar:spring-pulsar-bom:pom:1.2.17 from/to central (https://repo.maven.apache.org/maven2): Permission denied: getsockopt @ org.springframework.boot:spring-boot-dependencies:3.5.14, C:\Work\tracexd\spring-boot-dependencies-3.5.14.pom, line 2383, column 19 +[ERROR] Non-resolvable import POM: The following artifacts could not be resolved: org.springframework.restdocs:spring-restdocs-bom:pom:3.0.5 (absent): Could not transfer artifact org.springframework.restdocs:spring-restdocs-bom:pom:3.0.5 from/to central (https://repo.maven.apache.org/maven2): Permission denied: getsockopt @ org.springframework.boot:spring-boot-dependencies:3.5.14, C:\Work\tracexd\spring-boot-dependencies-3.5.14.pom, line 2390, column 19 +[ERROR] Non-resolvable import POM: The following artifacts could not be resolved: org.springframework.security:spring-security-bom:pom:6.5.10 (absent): Could not transfer artifact org.springframework.security:spring-security-bom:pom:6.5.10 from/to central (https://repo.maven.apache.org/maven2): Permission denied: getsockopt @ org.springframework.boot:spring-boot-dependencies:3.5.14, C:\Work\tracexd\spring-boot-dependencies-3.5.14.pom, line 2397, column 19 +[ERROR] Non-resolvable import POM: The following artifacts could not be resolved: org.springframework.session:spring-session-bom:pom:3.5.6 (absent): Could not transfer artifact org.springframework.session:spring-session-bom:pom:3.5.6 from/to central (https://repo.maven.apache.org/maven2): Permission denied: getsockopt @ org.springframework.boot:spring-boot-dependencies:3.5.14, C:\Work\tracexd\spring-boot-dependencies-3.5.14.pom, line 2404, column 19 +[ERROR] Non-resolvable import POM: The following artifacts could not be resolved: org.springframework.ws:spring-ws-bom:pom:4.1.3 (absent): Could not transfer artifact org.springframework.ws:spring-ws-bom:pom:4.1.3 from/to central (https://repo.maven.apache.org/maven2): Permission denied: getsockopt @ org.springframework.boot:spring-boot-dependencies:3.5.14, C:\Work\tracexd\spring-boot-dependencies-3.5.14.pom, line 2411, column 19 +[ERROR] Non-resolvable import POM: The following artifacts could not be resolved: org.testcontainers:testcontainers-bom:pom:1.21.4 (absent): Could not transfer artifact org.testcontainers:testcontainers-bom:pom:1.21.4 from/to central (https://repo.maven.apache.org/maven2): Permission denied: getsockopt @ org.springframework.boot:spring-boot-dependencies:3.5.14, C:\Work\tracexd\spring-boot-dependencies-3.5.14.pom, line 2418, column 19 + @ +[ERROR] The build could not read 1 project -> [Help 1] +[ERROR] +[ERROR] The project com.tracexd:tracexd:1.0.0 (C:\Work\tracexd\pom.xml) has 43 errors +[ERROR] Non-resolvable import POM: The following artifacts could not be resolved: org.apache.activemq:activemq-bom:pom:6.1.8 (absent): Could not transfer artifact org.apache.activemq:activemq-bom:pom:6.1.8 from/to central (https://repo.maven.apache.org/maven2): Permission denied: getsockopt @ org.springframework.boot:spring-boot-dependencies:3.5.14, C:\Work\tracexd\spring-boot-dependencies-3.5.14.pom, line 2124, column 19 -> [Help 2] +[ERROR] Non-resolvable import POM: The following artifacts could not be resolved: org.apache.activemq:artemis-bom:pom:2.40.0 (absent): Could not transfer artifact org.apache.activemq:artemis-bom:pom:2.40.0 from/to central (https://repo.maven.apache.org/maven2): Permission denied: getsockopt @ org.springframework.boot:spring-boot-dependencies:3.5.14, C:\Work\tracexd\spring-boot-dependencies-3.5.14.pom, line 2131, column 19 -> [Help 2] +[ERROR] Non-resolvable import POM: The following artifacts could not be resolved: org.assertj:assertj-bom:pom:3.27.7 (absent): Could not transfer artifact org.assertj:assertj-bom:pom:3.27.7 from/to central (https://repo.maven.apache.org/maven2): Permission denied: getsockopt @ org.springframework.boot:spring-boot-dependencies:3.5.14, C:\Work\tracexd\spring-boot-dependencies-3.5.14.pom, line 2138, column 19 -> [Help 2] +[ERROR] Non-resolvable import POM: The following artifacts could not be resolved: io.zipkin.reporter2:zipkin-reporter-bom:pom:3.5.3 (absent): Could not transfer artifact io.zipkin.reporter2:zipkin-reporter-bom:pom:3.5.3 from/to central (https://repo.maven.apache.org/maven2): Permission denied: getsockopt @ org.springframework.boot:spring-boot-dependencies:3.5.14, C:\Work\tracexd\spring-boot-dependencies-3.5.14.pom, line 2145, column 19 -> [Help 2] +[ERROR] Non-resolvable import POM: The following artifacts could not be resolved: io.zipkin.brave:brave-bom:pom:6.1.0 (absent): Could not transfer artifact io.zipkin.brave:brave-bom:pom:6.1.0 from/to central (https://repo.maven.apache.org/maven2): Permission denied: getsockopt @ org.springframework.boot:spring-boot-dependencies:3.5.14, C:\Work\tracexd\spring-boot-dependencies-3.5.14.pom, line 2152, column 19 -> [Help 2] +[ERROR] Non-resolvable import POM: The following artifacts could not be resolved: org.apache.cassandra:java-driver-bom:pom:4.19.2 (absent): Could not transfer artifact org.apache.cassandra:java-driver-bom:pom:4.19.2 from/to central (https://repo.maven.apache.org/maven2): Permission denied: getsockopt @ org.springframework.boot:spring-boot-dependencies:3.5.14, C:\Work\tracexd\spring-boot-dependencies-3.5.14.pom, line 2159, column 19 -> [Help 2] +[ERROR] Non-resolvable import POM: The following artifacts could not be resolved: org.glassfish.jaxb:jaxb-bom:pom:4.0.6 (absent): Could not transfer artifact org.glassfish.jaxb:jaxb-bom:pom:4.0.6 from/to central (https://repo.maven.apache.org/maven2): Permission denied: getsockopt @ org.springframework.boot:spring-boot-dependencies:3.5.14, C:\Work\tracexd\spring-boot-dependencies-3.5.14.pom, line 2166, column 19 -> [Help 2] +[ERROR] Non-resolvable import POM: The following artifacts could not be resolved: org.apache.groovy:groovy-bom:pom:4.0.31 (absent): Could not transfer artifact org.apache.groovy:groovy-bom:pom:4.0.31 from/to central (https://repo.maven.apache.org/maven2): Permission denied: getsockopt @ org.springframework.boot:spring-boot-dependencies:3.5.14, C:\Work\tracexd\spring-boot-dependencies-3.5.14.pom, line 2173, column 19 -> [Help 2] +[ERROR] Non-resolvable import POM: The following artifacts could not be resolved: org.infinispan:infinispan-bom:pom:15.2.6.Final (absent): Could not transfer artifact org.infinispan:infinispan-bom:pom:15.2.6.Final from/to central (https://repo.maven.apache.org/maven2): Permission denied: getsockopt @ org.springframework.boot:spring-boot-dependencies:3.5.14, C:\Work\tracexd\spring-boot-dependencies-3.5.14.pom, line 2180, column 19 -> [Help 2] +[ERROR] Non-resolvable import POM: The following artifacts could not be resolved: com.fasterxml.jackson:jackson-bom:pom:2.21.2 (absent): Could not transfer artifact com.fasterxml.jackson:jackson-bom:pom:2.21.2 from/to central (https://repo.maven.apache.org/maven2): Permission denied: getsockopt @ org.springframework.boot:spring-boot-dependencies:3.5.14, C:\Work\tracexd\spring-boot-dependencies-3.5.14.pom, line 2187, column 19 -> [Help 2] +[ERROR] Non-resolvable import POM: The following artifacts could not be resolved: org.glassfish.jersey:jersey-bom:pom:3.1.11 (absent): Could not transfer artifact org.glassfish.jersey:jersey-bom:pom:3.1.11 from/to central (https://repo.maven.apache.org/maven2): Permission denied: getsockopt @ org.springframework.boot:spring-boot-dependencies:3.5.14, C:\Work\tracexd\spring-boot-dependencies-3.5.14.pom, line 2194, column 19 -> [Help 2] +[ERROR] Non-resolvable import POM: The following artifacts could not be resolved: org.eclipse.jetty.ee10:jetty-ee10-bom:pom:12.0.34 (absent): Could not transfer artifact org.eclipse.jetty.ee10:jetty-ee10-bom:pom:12.0.34 from/to central (https://repo.maven.apache.org/maven2): Permission denied: getsockopt @ org.springframework.boot:spring-boot-dependencies:3.5.14, C:\Work\tracexd\spring-boot-dependencies-3.5.14.pom, line 2201, column 19 -> [Help 2] +[ERROR] Non-resolvable import POM: The following artifacts could not be resolved: org.eclipse.jetty:jetty-bom:pom:12.0.34 (absent): Could not transfer artifact org.eclipse.jetty:jetty-bom:pom:12.0.34 from/to central (https://repo.maven.apache.org/maven2): Permission denied: getsockopt @ org.springframework.boot:spring-boot-dependencies:3.5.14, C:\Work\tracexd\spring-boot-dependencies-3.5.14.pom, line 2208, column 19 -> [Help 2] +[ERROR] Non-resolvable import POM: The following artifacts could not be resolved: org.junit:junit-bom:pom:5.12.2 (absent): Could not transfer artifact org.junit:junit-bom:pom:5.12.2 from/to central (https://repo.maven.apache.org/maven2): Permission denied: getsockopt @ org.springframework.boot:spring-boot-dependencies:3.5.14, C:\Work\tracexd\spring-boot-dependencies-3.5.14.pom, line 2215, column 19 -> [Help 2] +[ERROR] Non-resolvable import POM: The following artifacts could not be resolved: org.jetbrains.kotlin:kotlin-bom:pom:1.9.25 (absent): Could not transfer artifact org.jetbrains.kotlin:kotlin-bom:pom:1.9.25 from/to central (https://repo.maven.apache.org/maven2): Permission denied: getsockopt @ org.springframework.boot:spring-boot-dependencies:3.5.14, C:\Work\tracexd\spring-boot-dependencies-3.5.14.pom, line 2222, column 19 -> [Help 2] +[ERROR] Non-resolvable import POM: The following artifacts could not be resolved: org.jetbrains.kotlinx:kotlinx-coroutines-bom:pom:1.8.1 (absent): Could not transfer artifact org.jetbrains.kotlinx:kotlinx-coroutines-bom:pom:1.8.1 from/to central (https://repo.maven.apache.org/maven2): Permission denied: getsockopt @ org.springframework.boot:spring-boot-dependencies:3.5.14, C:\Work\tracexd\spring-boot-dependencies-3.5.14.pom, line 2229, column 19 -> [Help 2] +[ERROR] Non-resolvable import POM: The following artifacts could not be resolved: org.jetbrains.kotlinx:kotlinx-serialization-bom:pom:1.6.3 (absent): Could not transfer artifact org.jetbrains.kotlinx:kotlinx-serialization-bom:pom:1.6.3 from/to central (https://repo.maven.apache.org/maven2): Permission denied: getsockopt @ org.springframework.boot:spring-boot-dependencies:3.5.14, C:\Work\tracexd\spring-boot-dependencies-3.5.14.pom, line 2236, column 19 -> [Help 2] +[ERROR] Non-resolvable import POM: The following artifacts could not be resolved: org.apache.logging.log4j:log4j-bom:pom:2.24.3 (absent): Could not transfer artifact org.apache.logging.log4j:log4j-bom:pom:2.24.3 from/to central (https://repo.maven.apache.org/maven2): Permission denied: getsockopt @ org.springframework.boot:spring-boot-dependencies:3.5.14, C:\Work\tracexd\spring-boot-dependencies-3.5.14.pom, line 2243, column 19 -> [Help 2] +[ERROR] Non-resolvable import POM: The following artifacts could not be resolved: io.micrometer:micrometer-bom:pom:1.15.11 (absent): Could not transfer artifact io.micrometer:micrometer-bom:pom:1.15.11 from/to central (https://repo.maven.apache.org/maven2): Permission denied: getsockopt @ org.springframework.boot:spring-boot-dependencies:3.5.14, C:\Work\tracexd\spring-boot-dependencies-3.5.14.pom, line 2250, column 19 -> [Help 2] +[ERROR] Non-resolvable import POM: The following artifacts could not be resolved: org.mockito:mockito-bom:pom:5.17.0 (absent): Could not transfer artifact org.mockito:mockito-bom:pom:5.17.0 from/to central (https://repo.maven.apache.org/maven2): Permission denied: getsockopt @ org.springframework.boot:spring-boot-dependencies:3.5.14, C:\Work\tracexd\spring-boot-dependencies-3.5.14.pom, line 2257, column 19 -> [Help 2] +[ERROR] Non-resolvable import POM: The following artifacts could not be resolved: org.mongodb:mongodb-driver-bom:pom:5.5.2 (absent): Could not transfer artifact org.mongodb:mongodb-driver-bom:pom:5.5.2 from/to central (https://repo.maven.apache.org/maven2): Permission denied: getsockopt @ org.springframework.boot:spring-boot-dependencies:3.5.14, C:\Work\tracexd\spring-boot-dependencies-3.5.14.pom, line 2264, column 19 -> [Help 2] +[ERROR] Non-resolvable import POM: The following artifacts could not be resolved: io.netty:netty-bom:pom:4.1.132.Final (absent): Could not transfer artifact io.netty:netty-bom:pom:4.1.132.Final from/to central (https://repo.maven.apache.org/maven2): Permission denied: getsockopt @ org.springframework.boot:spring-boot-dependencies:3.5.14, C:\Work\tracexd\spring-boot-dependencies-3.5.14.pom, line 2271, column 19 -> [Help 2] +[ERROR] Non-resolvable import POM: The following artifacts could not be resolved: io.opentelemetry:opentelemetry-bom:pom:1.49.0 (absent): Could not transfer artifact io.opentelemetry:opentelemetry-bom:pom:1.49.0 from/to central (https://repo.maven.apache.org/maven2): Permission denied: getsockopt @ org.springframework.boot:spring-boot-dependencies:3.5.14, C:\Work\tracexd\spring-boot-dependencies-3.5.14.pom, line 2278, column 19 -> [Help 2] +[ERROR] Non-resolvable import POM: The following artifacts could not be resolved: io.prometheus:prometheus-metrics-bom:pom:1.3.10 (absent): Could not transfer artifact io.prometheus:prometheus-metrics-bom:pom:1.3.10 from/to central (https://repo.maven.apache.org/maven2): Permission denied: getsockopt @ org.springframework.boot:spring-boot-dependencies:3.5.14, C:\Work\tracexd\spring-boot-dependencies-3.5.14.pom, line 2285, column 19 -> [Help 2] +[ERROR] Non-resolvable import POM: The following artifacts could not be resolved: io.prometheus:simpleclient_bom:pom:0.16.0 (absent): Could not transfer artifact io.prometheus:simpleclient_bom:pom:0.16.0 from/to central (https://repo.maven.apache.org/maven2): Permission denied: getsockopt @ org.springframework.boot:spring-boot-dependencies:3.5.14, C:\Work\tracexd\spring-boot-dependencies-3.5.14.pom, line 2292, column 19 -> [Help 2] +[ERROR] Non-resolvable import POM: The following artifacts could not be resolved: org.apache.pulsar:pulsar-bom:pom:4.0.9 (absent): Could not transfer artifact org.apache.pulsar:pulsar-bom:pom:4.0.9 from/to central (https://repo.maven.apache.org/maven2): Permission denied: getsockopt @ org.springframework.boot:spring-boot-dependencies:3.5.14, C:\Work\tracexd\spring-boot-dependencies-3.5.14.pom, line 2299, column 19 -> [Help 2] +[ERROR] Non-resolvable import POM: The following artifacts could not be resolved: org.apache.pulsar:pulsar-client-reactive-bom:pom:0.6.0 (absent): Could not transfer artifact org.apache.pulsar:pulsar-client-reactive-bom:pom:0.6.0 from/to central (https://repo.maven.apache.org/maven2): Permission denied: getsockopt @ org.springframework.boot:spring-boot-dependencies:3.5.14, C:\Work\tracexd\spring-boot-dependencies-3.5.14.pom, line 2306, column 19 -> [Help 2] +[ERROR] Non-resolvable import POM: The following artifacts could not be resolved: com.querydsl:querydsl-bom:pom:5.1.0 (absent): Could not transfer artifact com.querydsl:querydsl-bom:pom:5.1.0 from/to central (https://repo.maven.apache.org/maven2): Permission denied: getsockopt @ org.springframework.boot:spring-boot-dependencies:3.5.14, C:\Work\tracexd\spring-boot-dependencies-3.5.14.pom, line 2313, column 19 -> [Help 2] +[ERROR] Non-resolvable import POM: The following artifacts could not be resolved: io.projectreactor:reactor-bom:pom:2024.0.17 (absent): Could not transfer artifact io.projectreactor:reactor-bom:pom:2024.0.17 from/to central (https://repo.maven.apache.org/maven2): Permission denied: getsockopt @ org.springframework.boot:spring-boot-dependencies:3.5.14, C:\Work\tracexd\spring-boot-dependencies-3.5.14.pom, line 2320, column 19 -> [Help 2] +[ERROR] Non-resolvable import POM: The following artifacts could not be resolved: io.rest-assured:rest-assured-bom:pom:5.5.7 (absent): Could not transfer artifact io.rest-assured:rest-assured-bom:pom:5.5.7 from/to central (https://repo.maven.apache.org/maven2): Permission denied: getsockopt @ org.springframework.boot:spring-boot-dependencies:3.5.14, C:\Work\tracexd\spring-boot-dependencies-3.5.14.pom, line 2327, column 19 -> [Help 2] +[ERROR] Non-resolvable import POM: The following artifacts could not be resolved: io.rsocket:rsocket-bom:pom:1.1.5 (absent): Could not transfer artifact io.rsocket:rsocket-bom:pom:1.1.5 from/to central (https://repo.maven.apache.org/maven2): Permission denied: getsockopt @ org.springframework.boot:spring-boot-dependencies:3.5.14, C:\Work\tracexd\spring-boot-dependencies-3.5.14.pom, line 2334, column 19 -> [Help 2] +[ERROR] Non-resolvable import POM: The following artifacts could not be resolved: org.seleniumhq.selenium:selenium-bom:pom:4.31.0 (absent): Could not transfer artifact org.seleniumhq.selenium:selenium-bom:pom:4.31.0 from/to central (https://repo.maven.apache.org/maven2): Permission denied: getsockopt @ org.springframework.boot:spring-boot-dependencies:3.5.14, C:\Work\tracexd\spring-boot-dependencies-3.5.14.pom, line 2341, column 19 -> [Help 2] +[ERROR] Non-resolvable import POM: The following artifacts could not be resolved: org.springframework.amqp:spring-amqp-bom:pom:3.2.10 (absent): Could not transfer artifact org.springframework.amqp:spring-amqp-bom:pom:3.2.10 from/to central (https://repo.maven.apache.org/maven2): Permission denied: getsockopt @ org.springframework.boot:spring-boot-dependencies:3.5.14, C:\Work\tracexd\spring-boot-dependencies-3.5.14.pom, line 2348, column 19 -> [Help 2] +[ERROR] Non-resolvable import POM: The following artifacts could not be resolved: org.springframework.batch:spring-batch-bom:pom:5.2.5 (absent): Could not transfer artifact org.springframework.batch:spring-batch-bom:pom:5.2.5 from/to central (https://repo.maven.apache.org/maven2): Permission denied: getsockopt @ org.springframework.boot:spring-boot-dependencies:3.5.14, C:\Work\tracexd\spring-boot-dependencies-3.5.14.pom, line 2355, column 19 -> [Help 2] +[ERROR] Non-resolvable import POM: The following artifacts could not be resolved: org.springframework.data:spring-data-bom:pom:2025.0.11 (absent): Could not transfer artifact org.springframework.data:spring-data-bom:pom:2025.0.11 from/to central (https://repo.maven.apache.org/maven2): Permission denied: getsockopt @ org.springframework.boot:spring-boot-dependencies:3.5.14, C:\Work\tracexd\spring-boot-dependencies-3.5.14.pom, line 2362, column 19 -> [Help 2] +[ERROR] Non-resolvable import POM: The following artifacts could not be resolved: org.springframework:spring-framework-bom:pom:6.2.18 (absent): Could not transfer artifact org.springframework:spring-framework-bom:pom:6.2.18 from/to central (https://repo.maven.apache.org/maven2): Permission denied: getsockopt @ org.springframework.boot:spring-boot-dependencies:3.5.14, C:\Work\tracexd\spring-boot-dependencies-3.5.14.pom, line 2369, column 19 -> [Help 2] +[ERROR] Non-resolvable import POM: The following artifacts could not be resolved: org.springframework.integration:spring-integration-bom:pom:6.5.8 (absent): Could not transfer artifact org.springframework.integration:spring-integration-bom:pom:6.5.8 from/to central (https://repo.maven.apache.org/maven2): Permission denied: getsockopt @ org.springframework.boot:spring-boot-dependencies:3.5.14, C:\Work\tracexd\spring-boot-dependencies-3.5.14.pom, line 2376, column 19 -> [Help 2] +[ERROR] Non-resolvable import POM: The following artifacts could not be resolved: org.springframework.pulsar:spring-pulsar-bom:pom:1.2.17 (absent): Could not transfer artifact org.springframework.pulsar:spring-pulsar-bom:pom:1.2.17 from/to central (https://repo.maven.apache.org/maven2): Permission denied: getsockopt @ org.springframework.boot:spring-boot-dependencies:3.5.14, C:\Work\tracexd\spring-boot-dependencies-3.5.14.pom, line 2383, column 19 -> [Help 2] +[ERROR] Non-resolvable import POM: The following artifacts could not be resolved: org.springframework.restdocs:spring-restdocs-bom:pom:3.0.5 (absent): Could not transfer artifact org.springframework.restdocs:spring-restdocs-bom:pom:3.0.5 from/to central (https://repo.maven.apache.org/maven2): Permission denied: getsockopt @ org.springframework.boot:spring-boot-dependencies:3.5.14, C:\Work\tracexd\spring-boot-dependencies-3.5.14.pom, line 2390, column 19 -> [Help 2] +[ERROR] Non-resolvable import POM: The following artifacts could not be resolved: org.springframework.security:spring-security-bom:pom:6.5.10 (absent): Could not transfer artifact org.springframework.security:spring-security-bom:pom:6.5.10 from/to central (https://repo.maven.apache.org/maven2): Permission denied: getsockopt @ org.springframework.boot:spring-boot-dependencies:3.5.14, C:\Work\tracexd\spring-boot-dependencies-3.5.14.pom, line 2397, column 19 -> [Help 2] +[ERROR] Non-resolvable import POM: The following artifacts could not be resolved: org.springframework.session:spring-session-bom:pom:3.5.6 (absent): Could not transfer artifact org.springframework.session:spring-session-bom:pom:3.5.6 from/to central (https://repo.maven.apache.org/maven2): Permission denied: getsockopt @ org.springframework.boot:spring-boot-dependencies:3.5.14, C:\Work\tracexd\spring-boot-dependencies-3.5.14.pom, line 2404, column 19 -> [Help 2] +[ERROR] Non-resolvable import POM: The following artifacts could not be resolved: org.springframework.ws:spring-ws-bom:pom:4.1.3 (absent): Could not transfer artifact org.springframework.ws:spring-ws-bom:pom:4.1.3 from/to central (https://repo.maven.apache.org/maven2): Permission denied: getsockopt @ org.springframework.boot:spring-boot-dependencies:3.5.14, C:\Work\tracexd\spring-boot-dependencies-3.5.14.pom, line 2411, column 19 -> [Help 2] +[ERROR] Non-resolvable import POM: The following artifacts could not be resolved: org.testcontainers:testcontainers-bom:pom:1.21.4 (absent): Could not transfer artifact org.testcontainers:testcontainers-bom:pom:1.21.4 from/to central (https://repo.maven.apache.org/maven2): Permission denied: getsockopt @ org.springframework.boot:spring-boot-dependencies:3.5.14, C:\Work\tracexd\spring-boot-dependencies-3.5.14.pom, line 2418, column 19 -> [Help 2] +[ERROR] +[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch. +[ERROR] Re-run Maven using the -X switch to enable full debug logging. +[ERROR] +[ERROR] For more information about the errors and possible solutions, please read the following articles: +[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/ProjectBuildingException +[ERROR] [Help 2] http://cwiki.apache.org/confluence/display/MAVEN/UnresolvableModelException diff --git a/build2.log b/build2.log new file mode 100644 index 0000000..0aef018 --- /dev/null +++ b/build2.log @@ -0,0 +1,63 @@ +mvn : WARNING: A restricted method in java.lang.System has been called +所在位置 行:2 字符: 1 ++ mvn compile 2>&1 | Out-File "C:\Work\tracexd\build2.log" -Encoding ut ... ++ ~~~~~~~~~~~~~~~~ + + CategoryInfo : NotSpecified: (WARNING: A rest...has been called:String) [], RemoteException + + FullyQualifiedErrorId : NativeCommandError + +WARNING: java.lang.System::load has been called by org.fusesource.jansi.internal.JansiLoader in an unnamed module (file +:/C:/Users/16332/.m2/wrapper/dists/apache-maven-3.9.9-bin/4nf9hui3q3djbarqar9g711ggc/apache-maven-3.9.9/lib/jansi-2.4.1 +.jar) +WARNING: Use --enable-native-access=ALL-UNNAMED to avoid a warning for callers in this module +WARNING: Restricted methods will be blocked in a future release unless native access is enabled + +WARNING: A terminally deprecated method in sun.misc.Unsafe has been called +WARNING: sun.misc.Unsafe::objectFieldOffset has been called by com.google.common.util.concurrent.AbstractFuture$UnsafeA +tomicHelper (file:/C:/Users/16332/.m2/wrapper/dists/apache-maven-3.9.9-bin/4nf9hui3q3djbarqar9g711ggc/apache-maven-3.9. +9/lib/guava-33.2.1-jre.jar) +WARNING: Please consider reporting this to the maintainers of class com.google.common.util.concurrent.AbstractFuture$Un +safeAtomicHelper +WARNING: sun.misc.Unsafe::objectFieldOffset will be removed in a future release +WARNING: Final field _cipher in class org.sonatype.plexus.components.sec.dispatcher.DefaultSecDispatcher has been mutat +ed reflectively by class org.eclipse.sisu.bean.BeanPropertyField in unnamed module @780cb77 (file:/C:/Users/16332/.m2/w +rapper/dists/apache-maven-3.9.9-bin/4nf9hui3q3djbarqar9g711ggc/apache-maven-3.9.9/lib/org.eclipse.sisu.inject-0.9.0.M3. +jar) +WARNING: Use --enable-final-field-mutation=ALL-UNNAMED to avoid a warning +WARNING: Mutating final fields will be blocked in a future release unless final field mutation is enabled +[INFO] Scanning for projects... +Downloading from central: https://repo.maven.apache.org/maven2/com/fasterxml/jackson/jackson-bom/2.21.2/jackson-bom-2.21.2.pom +Downloading from central: https://repo.maven.apache.org/maven2/org/jetbrains/kotlin/kotlin-bom/1.9.25/kotlin-bom-1.9.25.pom +Downloading from central: https://repo.maven.apache.org/maven2/org/apache/logging/log4j/log4j-bom/2.24.3/log4j-bom-2.24.3.pom +Downloading from central: https://repo.maven.apache.org/maven2/io/micrometer/micrometer-bom/1.15.11/micrometer-bom-1.15.11.pom +Downloading from central: https://repo.maven.apache.org/maven2/io/netty/netty-bom/4.1.132.Final/netty-bom-4.1.132.Final.pom +Downloading from central: https://repo.maven.apache.org/maven2/io/projectreactor/reactor-bom/2024.0.17/reactor-bom-2024.0.17.pom +Downloading from central: https://repo.maven.apache.org/maven2/org/springframework/spring-framework-bom/6.2.18/spring-framework-bom-6.2.18.pom +Downloading from central: https://repo.maven.apache.org/maven2/org/springframework/security/spring-security-bom/6.5.10/spring-security-bom-6.5.10.pom +[ERROR] [ERROR] Some problems were encountered while processing the POMs: +[ERROR] Non-resolvable import POM: The following artifacts could not be resolved: com.fasterxml.jackson:jackson-bom:pom:2.21.2 (absent): Could not transfer artifact com.fasterxml.jackson:jackson-bom:pom:2.21.2 from/to central (https://repo.maven.apache.org/maven2): Permission denied: getsockopt @ org.springframework.boot:spring-boot-dependencies:3.5.14, C:\Work\tracexd\spring-boot-dependencies-3.5.14.pom, line 2133, column 19 +[ERROR] Non-resolvable import POM: The following artifacts could not be resolved: org.jetbrains.kotlin:kotlin-bom:pom:1.9.25 (absent): Could not transfer artifact org.jetbrains.kotlin:kotlin-bom:pom:1.9.25 from/to central (https://repo.maven.apache.org/maven2): Permission denied: getsockopt @ org.springframework.boot:spring-boot-dependencies:3.5.14, C:\Work\tracexd\spring-boot-dependencies-3.5.14.pom, line 2144, column 19 +[ERROR] Non-resolvable import POM: The following artifacts could not be resolved: org.apache.logging.log4j:log4j-bom:pom:2.24.3 (absent): Could not transfer artifact org.apache.logging.log4j:log4j-bom:pom:2.24.3 from/to central (https://repo.maven.apache.org/maven2): Permission denied: getsockopt @ org.springframework.boot:spring-boot-dependencies:3.5.14, C:\Work\tracexd\spring-boot-dependencies-3.5.14.pom, line 2153, column 19 +[ERROR] Non-resolvable import POM: The following artifacts could not be resolved: io.micrometer:micrometer-bom:pom:1.15.11 (absent): Could not transfer artifact io.micrometer:micrometer-bom:pom:1.15.11 from/to central (https://repo.maven.apache.org/maven2): Permission denied: getsockopt @ org.springframework.boot:spring-boot-dependencies:3.5.14, C:\Work\tracexd\spring-boot-dependencies-3.5.14.pom, line 2160, column 19 +[ERROR] Non-resolvable import POM: The following artifacts could not be resolved: io.netty:netty-bom:pom:4.1.132.Final (absent): Could not transfer artifact io.netty:netty-bom:pom:4.1.132.Final from/to central (https://repo.maven.apache.org/maven2): Permission denied: getsockopt @ org.springframework.boot:spring-boot-dependencies:3.5.14, C:\Work\tracexd\spring-boot-dependencies-3.5.14.pom, line 2169, column 19 +[ERROR] Non-resolvable import POM: The following artifacts could not be resolved: io.projectreactor:reactor-bom:pom:2024.0.17 (absent): Could not transfer artifact io.projectreactor:reactor-bom:pom:2024.0.17 from/to central (https://repo.maven.apache.org/maven2): Permission denied: getsockopt @ org.springframework.boot:spring-boot-dependencies:3.5.14, C:\Work\tracexd\spring-boot-dependencies-3.5.14.pom, line 2182, column 19 +[ERROR] Non-resolvable import POM: The following artifacts could not be resolved: org.springframework:spring-framework-bom:pom:6.2.18 (absent): Could not transfer artifact org.springframework:spring-framework-bom:pom:6.2.18 from/to central (https://repo.maven.apache.org/maven2): Permission denied: getsockopt @ org.springframework.boot:spring-boot-dependencies:3.5.14, C:\Work\tracexd\spring-boot-dependencies-3.5.14.pom, line 2195, column 19 +[ERROR] Non-resolvable import POM: The following artifacts could not be resolved: org.springframework.security:spring-security-bom:pom:6.5.10 (absent): Could not transfer artifact org.springframework.security:spring-security-bom:pom:6.5.10 from/to central (https://repo.maven.apache.org/maven2): Permission denied: getsockopt @ org.springframework.boot:spring-boot-dependencies:3.5.14, C:\Work\tracexd\spring-boot-dependencies-3.5.14.pom, line 2205, column 19 + @ +[ERROR] The build could not read 1 project -> [Help 1] +[ERROR] +[ERROR] The project com.tracexd:tracexd:1.0.0 (C:\Work\tracexd\pom.xml) has 8 errors +[ERROR] Non-resolvable import POM: The following artifacts could not be resolved: com.fasterxml.jackson:jackson-bom:pom:2.21.2 (absent): Could not transfer artifact com.fasterxml.jackson:jackson-bom:pom:2.21.2 from/to central (https://repo.maven.apache.org/maven2): Permission denied: getsockopt @ org.springframework.boot:spring-boot-dependencies:3.5.14, C:\Work\tracexd\spring-boot-dependencies-3.5.14.pom, line 2133, column 19 -> [Help 2] +[ERROR] Non-resolvable import POM: The following artifacts could not be resolved: org.jetbrains.kotlin:kotlin-bom:pom:1.9.25 (absent): Could not transfer artifact org.jetbrains.kotlin:kotlin-bom:pom:1.9.25 from/to central (https://repo.maven.apache.org/maven2): Permission denied: getsockopt @ org.springframework.boot:spring-boot-dependencies:3.5.14, C:\Work\tracexd\spring-boot-dependencies-3.5.14.pom, line 2144, column 19 -> [Help 2] +[ERROR] Non-resolvable import POM: The following artifacts could not be resolved: org.apache.logging.log4j:log4j-bom:pom:2.24.3 (absent): Could not transfer artifact org.apache.logging.log4j:log4j-bom:pom:2.24.3 from/to central (https://repo.maven.apache.org/maven2): Permission denied: getsockopt @ org.springframework.boot:spring-boot-dependencies:3.5.14, C:\Work\tracexd\spring-boot-dependencies-3.5.14.pom, line 2153, column 19 -> [Help 2] +[ERROR] Non-resolvable import POM: The following artifacts could not be resolved: io.micrometer:micrometer-bom:pom:1.15.11 (absent): Could not transfer artifact io.micrometer:micrometer-bom:pom:1.15.11 from/to central (https://repo.maven.apache.org/maven2): Permission denied: getsockopt @ org.springframework.boot:spring-boot-dependencies:3.5.14, C:\Work\tracexd\spring-boot-dependencies-3.5.14.pom, line 2160, column 19 -> [Help 2] +[ERROR] Non-resolvable import POM: The following artifacts could not be resolved: io.netty:netty-bom:pom:4.1.132.Final (absent): Could not transfer artifact io.netty:netty-bom:pom:4.1.132.Final from/to central (https://repo.maven.apache.org/maven2): Permission denied: getsockopt @ org.springframework.boot:spring-boot-dependencies:3.5.14, C:\Work\tracexd\spring-boot-dependencies-3.5.14.pom, line 2169, column 19 -> [Help 2] +[ERROR] Non-resolvable import POM: The following artifacts could not be resolved: io.projectreactor:reactor-bom:pom:2024.0.17 (absent): Could not transfer artifact io.projectreactor:reactor-bom:pom:2024.0.17 from/to central (https://repo.maven.apache.org/maven2): Permission denied: getsockopt @ org.springframework.boot:spring-boot-dependencies:3.5.14, C:\Work\tracexd\spring-boot-dependencies-3.5.14.pom, line 2182, column 19 -> [Help 2] +[ERROR] Non-resolvable import POM: The following artifacts could not be resolved: org.springframework:spring-framework-bom:pom:6.2.18 (absent): Could not transfer artifact org.springframework:spring-framework-bom:pom:6.2.18 from/to central (https://repo.maven.apache.org/maven2): Permission denied: getsockopt @ org.springframework.boot:spring-boot-dependencies:3.5.14, C:\Work\tracexd\spring-boot-dependencies-3.5.14.pom, line 2195, column 19 -> [Help 2] +[ERROR] Non-resolvable import POM: The following artifacts could not be resolved: org.springframework.security:spring-security-bom:pom:6.5.10 (absent): Could not transfer artifact org.springframework.security:spring-security-bom:pom:6.5.10 from/to central (https://repo.maven.apache.org/maven2): Permission denied: getsockopt @ org.springframework.boot:spring-boot-dependencies:3.5.14, C:\Work\tracexd\spring-boot-dependencies-3.5.14.pom, line 2205, column 19 -> [Help 2] +[ERROR] +[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch. +[ERROR] Re-run Maven using the -X switch to enable full debug logging. +[ERROR] +[ERROR] For more information about the errors and possible solutions, please read the following articles: +[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/ProjectBuildingException +[ERROR] [Help 2] http://cwiki.apache.org/confluence/display/MAVEN/UnresolvableModelException diff --git a/pom.xml b/pom.xml new file mode 100644 index 0000000..38a2386 --- /dev/null +++ b/pom.xml @@ -0,0 +1,68 @@ + + + 4.0.0 + + org.springframework.boot + spring-boot-starter-parent + 3.5.14 + + + com.tracexd + tracexd + 1.0.0 + tracexd + Daily events recording and querying system + + 26 + 3.5.12 + + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-thymeleaf + + + org.springframework.boot + spring-boot-starter-security + + + com.baomidou + mybatis-plus-spring-boot3-starter + ${mybatis-plus.version} + + + com.baomidou + mybatis-plus-jsqlparser + ${mybatis-plus.version} + + + com.mysql + mysql-connector-j + runtime + + + com.h2database + h2 + runtime + + + org.springframework.boot + spring-boot-starter-test + test + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + \ No newline at end of file diff --git a/run.log b/run.log new file mode 100644 index 0000000..dc63fc1 --- /dev/null +++ b/run.log @@ -0,0 +1,69 @@ +mvn : WARNING: A restricted method in java.lang.System has been called +At line:2 char:37 ++ $env:SPRING_PROFILES_ACTIVE="test"; mvn spring-boot:run 2>&1 | Out-Fi ... ++ ~~~~~~~~~~~~~~~~~~~~~~~~ + + CategoryInfo : NotSpecified: (WARNING: A rest...has been called:String) [], RemoteException + + FullyQualifiedErrorId : NativeCommandError + +WARNING: java.lang.System::load has been called by org.fusesource.jansi.internal.JansiLoader in an unnamed module (file +:/C:/Users/16332/.m2/wrapper/dists/apache-maven-3.9.9-bin/4nf9hui3q3djbarqar9g711ggc/apache-maven-3.9.9/lib/jansi-2.4.1 +.jar) +WARNING: Use --enable-native-access=ALL-UNNAMED to avoid a warning for callers in this module +WARNING: Restricted methods will be blocked in a future release unless native access is enabled + +WARNING: A terminally deprecated method in sun.misc.Unsafe has been called +WARNING: sun.misc.Unsafe::objectFieldOffset has been called by com.google.common.util.concurrent.AbstractFuture$UnsafeA +tomicHelper (file:/C:/Users/16332/.m2/wrapper/dists/apache-maven-3.9.9-bin/4nf9hui3q3djbarqar9g711ggc/apache-maven-3.9. +9/lib/guava-33.2.1-jre.jar) +WARNING: Please consider reporting this to the maintainers of class com.google.common.util.concurrent.AbstractFuture$Un +safeAtomicHelper +WARNING: sun.misc.Unsafe::objectFieldOffset will be removed in a future release +WARNING: Final field _cipher in class org.sonatype.plexus.components.sec.dispatcher.DefaultSecDispatcher has been mutat +ed reflectively by class org.eclipse.sisu.bean.BeanPropertyField in unnamed module @780cb77 (file:/C:/Users/16332/.m2/w +rapper/dists/apache-maven-3.9.9-bin/4nf9hui3q3djbarqar9g711ggc/apache-maven-3.9.9/lib/org.eclipse.sisu.inject-0.9.0.M3. +jar) +WARNING: Use --enable-final-field-mutation=ALL-UNNAMED to avoid a warning +WARNING: Mutating final fields will be blocked in a future release unless final field mutation is enabled +[INFO] Scanning for projects... +[INFO] +[INFO] ------------------------< com.tracexd:tracexd >------------------------- +[INFO] Building tracexd 1.0.0 +[INFO] from pom.xml +[INFO] --------------------------------[ jar ]--------------------------------- +[INFO] +[INFO] >>> spring-boot:3.5.14:run (default-cli) > test-compile @ tracexd >>> +[INFO] +[INFO] --- resources:3.3.1:resources (default-resources) @ tracexd --- +[INFO] Copying 2 resources from src\main\resources to target\classes +[INFO] Copying 6 resources from src\main\resources to target\classes +[INFO] +[INFO] --- compiler:3.14.1:compile (default-compile) @ tracexd --- +[INFO] Nothing to compile - all classes are up to date. +[INFO] +[INFO] --- resources:3.3.1:testResources (default-testResources) @ tracexd --- +[INFO] skip non existing resourceDirectory C:\Work\tracexd\src\test\resources +[INFO] +[INFO] --- compiler:3.14.1:testCompile (default-testCompile) @ tracexd --- +[INFO] Nothing to compile - all classes are up to date. +[INFO] +[INFO] <<< spring-boot:3.5.14:run (default-cli) < test-compile @ tracexd <<< +[INFO] +[INFO] +[INFO] --- spring-boot:3.5.14:run (default-cli) @ tracexd --- +[INFO] Attaching agents: [] +2026-06-09T14:04:19.923+08:00 INFO 10212 --- [ main] com.tracexd.TracexdApplication : Starting TracexdApplication using Java 26.0.1 with PID 10212 (C:\Work\tracexd\target\classes started by 16332 in C:\Work\tracexd) +2026-06-09T14:04:19.924+08:00 DEBUG 10212 --- [ main] com.tracexd.TracexdApplication : Running with Spring Boot v3.5.14, Spring v6.2.18 +2026-06-09T14:04:19.924+08:00 INFO 10212 --- [ main] com.tracexd.TracexdApplication : The following 1 profile is active: "test" +2026-06-09T14:04:20.498+08:00 INFO 10212 --- [ main] o.apache.catalina.core.StandardService : Starting service [Tomcat] +2026-06-09T14:04:20.498+08:00 INFO 10212 --- [ main] o.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/10.1.54] +2026-06-09T14:04:20.525+08:00 INFO 10212 --- [ main] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext +Logging initialized using 'class org.apache.ibatis.logging.stdout.StdOutImpl' adapter. +Get /198.18.0.1 network interface +Get network interface info: name:iftype53_32769 (Meta Tunnel) +Initialization Sequence datacenterId:0 workerId:4 +2026-06-09T14:04:20.621+08:00 INFO 10212 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting... +2026-06-09T14:04:20.717+08:00 INFO 10212 --- [ main] com.zaxxer.hikari.pool.HikariPool : HikariPool-1 - Added connection conn0: url=jdbc:h2:mem:tracexd user=SA +2026-06-09T14:04:20.718+08:00 INFO 10212 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed. +2026-06-09T14:04:21.123+08:00 INFO 10212 --- [ main] m.e.s.MybatisPlusApplicationContextAware : Register ApplicationContext instances org.springframework.boot.web.servlet.context.AnnotationConfigServletWebServerApplicationContext@e383572 +2026-06-09T14:04:21.162+08:00 INFO 10212 --- [ main] com.tracexd.TracexdApplication : Started TracexdApplication in 1.492 seconds (process running for 1.661) +Default admin user created (admin/admin123) diff --git a/src/main/java/com/tracexd/TracexdApplication.java b/src/main/java/com/tracexd/TracexdApplication.java new file mode 100644 index 0000000..647e098 --- /dev/null +++ b/src/main/java/com/tracexd/TracexdApplication.java @@ -0,0 +1,41 @@ +package com.tracexd; + +import com.tracexd.mapper.RecordMapper; +import com.tracexd.model.entity.Record; +import org.springframework.boot.CommandLineRunner; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.annotation.Bean; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.scheduling.annotation.EnableAsync; +import org.springframework.security.crypto.password.PasswordEncoder; + +/** + * 日常事项记录系统 - 启动类 + */ +@SpringBootApplication +@EnableAsync +public class TracexdApplication { + + public static void main(String[] args) { + SpringApplication.run(TracexdApplication.class, args); + } + + /** + * 初始化默认管理员用户(首次启动时创建) + */ + @Bean + public CommandLineRunner initAdminUser(PasswordEncoder passwordEncoder, JdbcTemplate jdbcTemplate) { + return args -> { + Long count = jdbcTemplate.queryForObject( + "SELECT COUNT(*) FROM sys_user WHERE username = ?", Long.class, "admin"); + if (count == null || count == 0) { + String hash = passwordEncoder.encode("admin123"); + jdbcTemplate.update( + "INSERT INTO sys_user (username, password, display_name, enabled, created_at) VALUES (?, ?, ?, 1, NOW())", + "admin", hash, "管理员"); + System.out.println("Default admin user created (admin/admin123)"); + } + }; + } +} diff --git a/src/main/java/com/tracexd/common/Result.java b/src/main/java/com/tracexd/common/Result.java new file mode 100644 index 0000000..09adde6 --- /dev/null +++ b/src/main/java/com/tracexd/common/Result.java @@ -0,0 +1,44 @@ +package com.tracexd.common; + +/** + * 统一API响应体 + */ +public class Result { + + private int code; + private String message; + private T data; + + private Result() { + } + + public static Result ok(T data) { + Result r = new Result<>(); + r.code = 200; + r.message = "success"; + r.data = data; + return r; + } + + public static Result ok() { + return ok(null); + } + + public static Result error(int code, String message) { + Result r = new Result<>(); + r.code = code; + r.message = message; + return r; + } + + public static Result error(String message) { + return error(500, message); + } + + public int getCode() { return code; } + public void setCode(int code) { this.code = code; } + public String getMessage() { return message; } + public void setMessage(String message) { this.message = message; } + public T getData() { return data; } + public void setData(T data) { this.data = data; } +} diff --git a/src/main/java/com/tracexd/common/VoiceTaskManager.java b/src/main/java/com/tracexd/common/VoiceTaskManager.java new file mode 100644 index 0000000..0f738b3 --- /dev/null +++ b/src/main/java/com/tracexd/common/VoiceTaskManager.java @@ -0,0 +1,60 @@ +package com.tracexd.common; + +import com.tracexd.model.dto.VoiceProcessResult; +import org.springframework.stereotype.Component; +import org.springframework.web.servlet.mvc.method.annotation.SseEmitter; + +import java.util.Map; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ConcurrentHashMap; + +/** + * 语音任务管理器 — 管理异步任务和 SSE 推送 + */ +@Component +public class VoiceTaskManager { + + private final Map> taskFutures = new ConcurrentHashMap<>(); + + private final Map taskEmitters = new ConcurrentHashMap<>(); + + /** + * 注册一个任务 + * + * @param taskId 任务ID + * @param future 异步处理结果 + */ + public void registerTask(String taskId, CompletableFuture future) { + taskFutures.put(taskId, future); + future.whenComplete((result, ex) -> { + SseEmitter emitter = taskEmitters.remove(taskId); + if (emitter != null) { + try { + if (ex != null) { + emitter.send(SseEmitter.event().data(Result.error(ex.getMessage()))); + } else { + emitter.send(SseEmitter.event().data(Result.ok(result))); + } + emitter.complete(); + } catch (Exception e) { + emitter.completeWithError(e); + } + } + taskFutures.remove(taskId); + }); + } + + /** + * 为任务创建 SSE 连接 + * + * @param taskId 任务ID + * @return SSE 发射器 + */ + public SseEmitter createEmitter(String taskId) { + SseEmitter emitter = new SseEmitter(120_000L); + taskEmitters.put(taskId, emitter); + emitter.onCompletion(() -> taskEmitters.remove(taskId)); + emitter.onTimeout(() -> taskEmitters.remove(taskId)); + return emitter; + } +} diff --git a/src/main/java/com/tracexd/common/exception/BusinessException.java b/src/main/java/com/tracexd/common/exception/BusinessException.java new file mode 100644 index 0000000..6cac64c --- /dev/null +++ b/src/main/java/com/tracexd/common/exception/BusinessException.java @@ -0,0 +1,22 @@ +package com.tracexd.common.exception; + +/** + * 业务异常 + */ +public class BusinessException extends RuntimeException { + + private final int code; + + public BusinessException(int code, String message) { + super(message); + this.code = code; + } + + public BusinessException(String message) { + this(500, message); + } + + public int getCode() { + return code; + } +} diff --git a/src/main/java/com/tracexd/common/exception/GlobalExceptionHandler.java b/src/main/java/com/tracexd/common/exception/GlobalExceptionHandler.java new file mode 100644 index 0000000..bd1e35f --- /dev/null +++ b/src/main/java/com/tracexd/common/exception/GlobalExceptionHandler.java @@ -0,0 +1,28 @@ +package com.tracexd.common.exception; + +import com.tracexd.common.Result; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.RestControllerAdvice; + +/** + * 全局异常处理器 + */ +@RestControllerAdvice +public class GlobalExceptionHandler { + + private static final Logger log = LoggerFactory.getLogger(GlobalExceptionHandler.class); + + @ExceptionHandler(BusinessException.class) + public Result handleBusinessException(BusinessException e) { + log.warn("Business exception: {}", e.getMessage()); + return Result.error(e.getCode(), e.getMessage()); + } + + @ExceptionHandler(Exception.class) + public Result handleException(Exception e) { + log.error("Unexpected error", e); + return Result.error("系统繁忙,请稍后重试"); + } +} diff --git a/src/main/java/com/tracexd/config/AsyncConfig.java b/src/main/java/com/tracexd/config/AsyncConfig.java new file mode 100644 index 0000000..b98dbe6 --- /dev/null +++ b/src/main/java/com/tracexd/config/AsyncConfig.java @@ -0,0 +1,27 @@ +package com.tracexd.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; + +import java.util.concurrent.Executor; +import java.util.concurrent.ThreadPoolExecutor; + +/** + * 异步任务线程池配置 + */ +@Configuration +public class AsyncConfig { + + @Bean("voiceTaskExecutor") + public Executor voiceTaskExecutor() { + ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); + executor.setCorePoolSize(4); + executor.setMaxPoolSize(8); + executor.setQueueCapacity(16); + executor.setThreadNamePrefix("voice-task-"); + executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy()); + executor.initialize(); + return executor; + } +} diff --git a/src/main/java/com/tracexd/config/MybatisPlusConfig.java b/src/main/java/com/tracexd/config/MybatisPlusConfig.java new file mode 100644 index 0000000..57feea0 --- /dev/null +++ b/src/main/java/com/tracexd/config/MybatisPlusConfig.java @@ -0,0 +1,22 @@ +package com.tracexd.config; + +import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; +import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor; +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * MyBatis-Plus 配置 + */ +@Configuration +@MapperScan("com.tracexd.mapper") +public class MybatisPlusConfig { + + @Bean + public MybatisPlusInterceptor mybatisPlusInterceptor() { + MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); + interceptor.addInnerInterceptor(new PaginationInnerInterceptor()); + return interceptor; + } +} diff --git a/src/main/java/com/tracexd/config/RestClientConfig.java b/src/main/java/com/tracexd/config/RestClientConfig.java new file mode 100644 index 0000000..0460f88 --- /dev/null +++ b/src/main/java/com/tracexd/config/RestClientConfig.java @@ -0,0 +1,17 @@ +package com.tracexd.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.client.RestClient; + +/** + * HTTP 客户端配置 + */ +@Configuration +public class RestClientConfig { + + @Bean + public RestClient restClient() { + return RestClient.builder().build(); + } +} diff --git a/src/main/java/com/tracexd/config/SecurityConfig.java b/src/main/java/com/tracexd/config/SecurityConfig.java new file mode 100644 index 0000000..740bb46 --- /dev/null +++ b/src/main/java/com/tracexd/config/SecurityConfig.java @@ -0,0 +1,88 @@ +package com.tracexd.config; + +import com.tracexd.mapper.SysUserMapper; +import com.tracexd.model.entity.SysUser; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; +import org.springframework.security.core.userdetails.User; +import org.springframework.security.core.userdetails.UserDetailsService; +import org.springframework.security.core.userdetails.UsernameNotFoundException; +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; +import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.security.web.SecurityFilterChain; +import org.springframework.security.web.authentication.rememberme.JdbcTokenRepositoryImpl; +import org.springframework.security.web.authentication.rememberme.PersistentTokenRepository; + +import javax.sql.DataSource; + +/** + * Spring Security 安全配置 + */ +@Configuration +@EnableWebSecurity +public class SecurityConfig { + + private final DataSource dataSource; + private final SysUserMapper sysUserMapper; + + public SecurityConfig(DataSource dataSource, SysUserMapper sysUserMapper) { + this.dataSource = dataSource; + this.sysUserMapper = sysUserMapper; + } + + @Bean + public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { + http + .csrf(csrf -> csrf.disable()) + .authorizeHttpRequests(auth -> auth + .requestMatchers("/login", "/css/**", "/js/**", "/.well-known/**", "/error").permitAll() + .anyRequest().authenticated() + ) + .formLogin(form -> form + .loginPage("/login") + .defaultSuccessUrl("/", true) + .permitAll() + ) + .logout(logout -> logout + .logoutSuccessUrl("/login?logout") + .permitAll() + ) + .rememberMe(remember -> remember + .tokenValiditySeconds(30 * 24 * 60 * 60) + .tokenRepository(persistentTokenRepository()) + ) + .sessionManagement(session -> session + .maximumSessions(1) + .maxSessionsPreventsLogin(false) + ); + return http.build(); + } + + @Bean + public PersistentTokenRepository persistentTokenRepository() { + JdbcTokenRepositoryImpl repo = new JdbcTokenRepositoryImpl(); + repo.setDataSource(dataSource); + return repo; + } + + @Bean + public PasswordEncoder passwordEncoder() { + return new BCryptPasswordEncoder(); + } + + @Bean + public UserDetailsService userDetailsService() { + return username -> { + SysUser user = sysUserMapper.findByUsername(username); + if (user == null || !user.getEnabled()) { + throw new UsernameNotFoundException("User not found: " + username); + } + return User.withUsername(user.getUsername()) + .password(user.getPassword()) + .disabled(!user.getEnabled()) + .build(); + }; + } +} diff --git a/src/main/java/com/tracexd/controller/PageController.java b/src/main/java/com/tracexd/controller/PageController.java new file mode 100644 index 0000000..f69ec01 --- /dev/null +++ b/src/main/java/com/tracexd/controller/PageController.java @@ -0,0 +1,40 @@ +package com.tracexd.controller; + +import org.springframework.security.core.Authentication; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.GetMapping; + +/** + * 页面路由控制器 + */ +@Controller +public class PageController { + + /** + * 首页(麦克风录入/查询页面) + */ + @GetMapping("/") + public String index(Model model, Authentication auth) { + if (auth != null && auth.isAuthenticated()) { + model.addAttribute("displayName", auth.getName()); + } + return "index"; + } + + /** + * 浏览记录页面 + */ + @GetMapping("/browse") + public String browse() { + return "browse"; + } + + /** + * 登录页面 + */ + @GetMapping("/login") + public String login() { + return "login"; + } +} diff --git a/src/main/java/com/tracexd/controller/RecordController.java b/src/main/java/com/tracexd/controller/RecordController.java new file mode 100644 index 0000000..e9ca256 --- /dev/null +++ b/src/main/java/com/tracexd/controller/RecordController.java @@ -0,0 +1,61 @@ +package com.tracexd.controller; + +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.tracexd.common.Result; +import com.tracexd.enums.DictTypeEnum; +import com.tracexd.model.dto.RecordQueryDTO; +import com.tracexd.model.entity.Record; +import com.tracexd.service.record.DictTagService; +import com.tracexd.service.record.RecordService; +import org.springframework.security.core.Authentication; +import org.springframework.web.bind.annotation.*; + +import java.math.BigDecimal; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * 记录查询控制器(浏览页) + */ +@RestController +@RequestMapping("/api/records") +public class RecordController { + + private final RecordService recordService; + private final DictTagService dictTagService; + + public RecordController(RecordService recordService, DictTagService dictTagService) { + this.recordService = recordService; + this.dictTagService = dictTagService; + } + + @GetMapping + public Result> queryRecords(RecordQueryDTO queryDTO, Authentication auth) { + Long userId = getUserIdFromAuth(auth); + IPage page = recordService.queryPage(queryDTO, userId); + BigDecimal totalAmount = recordService.sumAmount(queryDTO, userId); + + Map result = new HashMap<>(); + result.put("records", page.getRecords()); + result.put("total", page.getTotal()); + result.put("page", page.getCurrent()); + result.put("size", page.getSize()); + result.put("totalAmount", totalAmount); + return Result.ok(result); + } + + @GetMapping("/filters") + public Result>> getFilters(Authentication auth) { + Long userId = getUserIdFromAuth(auth); + Map> filters = new HashMap<>(); + filters.put("persons", dictTagService.getTagsByType(userId, DictTypeEnum.PERSON.getCode())); + filters.put("locations", dictTagService.getTagsByType(userId, DictTypeEnum.LOCATION.getCode())); + filters.put("categories", dictTagService.getTagsByType(userId, DictTypeEnum.CATEGORY.getCode())); + return Result.ok(filters); + } + + private Long getUserIdFromAuth(Authentication auth) { + return 1L; + } +} diff --git a/src/main/java/com/tracexd/controller/VoiceController.java b/src/main/java/com/tracexd/controller/VoiceController.java new file mode 100644 index 0000000..51cc146 --- /dev/null +++ b/src/main/java/com/tracexd/controller/VoiceController.java @@ -0,0 +1,76 @@ +package com.tracexd.controller; + +import com.tracexd.common.Result; +import com.tracexd.common.VoiceTaskManager; +import com.tracexd.service.voice.VoiceProcessService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.http.MediaType; +import org.springframework.security.core.Authentication; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; +import org.springframework.web.servlet.mvc.method.annotation.SseEmitter; + +import java.io.IOException; +import java.util.Map; +import java.util.UUID; +import java.util.concurrent.CompletableFuture; + +/** + * 语音处理控制器 + */ +@RestController +@RequestMapping("/api/voice") +public class VoiceController { + + private static final Logger log = LoggerFactory.getLogger(VoiceController.class); + + private final VoiceProcessService voiceProcessService; + private final VoiceTaskManager voiceTaskManager; + + public VoiceController(VoiceProcessService voiceProcessService, VoiceTaskManager voiceTaskManager) { + this.voiceProcessService = voiceProcessService; + this.voiceTaskManager = voiceTaskManager; + } + + /** + * 提交语音进行识别和处理 + */ + @PostMapping("/process") + public Result> processVoice( + @RequestParam("audio") MultipartFile audio, + Authentication auth) { + + String contentType = audio.getContentType(); + String mimeType = (contentType != null) ? contentType : "audio/wav"; + + log.info("Voice request from user: {}, file size: {}, mime: {}", auth.getName(), audio.getSize(), mimeType); + + Long userId = getUserIdFromAuth(auth); + + try { + byte[] audioData = audio.getBytes(); + String taskId = UUID.randomUUID().toString(); + + CompletableFuture future = voiceProcessService.processVoice(audioData, mimeType, userId); + voiceTaskManager.registerTask(taskId, (CompletableFuture) future); + + return Result.ok(Map.of("taskId", taskId)); + } catch (IOException e) { + log.error("Failed to read audio", e); + return Result.error("读取音频失败"); + } + } + + /** + * SSE 订阅处理结果 + */ + @GetMapping(value = "/stream/{taskId}", produces = MediaType.TEXT_EVENT_STREAM_VALUE) + public SseEmitter streamResult(@PathVariable String taskId) { + return voiceTaskManager.createEmitter(taskId); + } + + private Long getUserIdFromAuth(Authentication auth) { + return 1L; + } +} diff --git a/src/main/java/com/tracexd/enums/DictTypeEnum.java b/src/main/java/com/tracexd/enums/DictTypeEnum.java new file mode 100644 index 0000000..8e4e5e4 --- /dev/null +++ b/src/main/java/com/tracexd/enums/DictTypeEnum.java @@ -0,0 +1,26 @@ +package com.tracexd.enums; + +/** + * 字典标签类型枚举 + */ +public enum DictTypeEnum { + + /** 人物 */ + PERSON("person"), + + /** 地点 */ + LOCATION("location"), + + /** 分类 */ + CATEGORY("category"); + + private final String code; + + DictTypeEnum(String code) { + this.code = code; + } + + public String getCode() { + return code; + } +} diff --git a/src/main/java/com/tracexd/enums/IntentType.java b/src/main/java/com/tracexd/enums/IntentType.java new file mode 100644 index 0000000..e9e0fb1 --- /dev/null +++ b/src/main/java/com/tracexd/enums/IntentType.java @@ -0,0 +1,16 @@ +package com.tracexd.enums; + +/** + * AI大模型意图类型枚举 + */ +public enum IntentType { + + /** 录入事项 */ + RECORD, + + /** 查询事项 */ + QUERY, + + /** 其他对话 */ + OTHER +} diff --git a/src/main/java/com/tracexd/mapper/DictTagMapper.java b/src/main/java/com/tracexd/mapper/DictTagMapper.java new file mode 100644 index 0000000..4e445ea --- /dev/null +++ b/src/main/java/com/tracexd/mapper/DictTagMapper.java @@ -0,0 +1,10 @@ +package com.tracexd.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.tracexd.model.entity.DictTag; + +/** + * 字典标签 Mapper + */ +public interface DictTagMapper extends BaseMapper { +} diff --git a/src/main/java/com/tracexd/mapper/RecordMapper.java b/src/main/java/com/tracexd/mapper/RecordMapper.java new file mode 100644 index 0000000..2060596 --- /dev/null +++ b/src/main/java/com/tracexd/mapper/RecordMapper.java @@ -0,0 +1,10 @@ +package com.tracexd.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.tracexd.model.entity.Record; + +/** + * 事项记录 Mapper + */ +public interface RecordMapper extends BaseMapper { +} diff --git a/src/main/java/com/tracexd/mapper/SysUserMapper.java b/src/main/java/com/tracexd/mapper/SysUserMapper.java new file mode 100644 index 0000000..6903acc --- /dev/null +++ b/src/main/java/com/tracexd/mapper/SysUserMapper.java @@ -0,0 +1,17 @@ +package com.tracexd.mapper; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.tracexd.model.entity.SysUser; + +/** + * 系统用户 Mapper + */ +public interface SysUserMapper extends BaseMapper { + + /** 根据用户名查找用户 */ + default SysUser findByUsername(String username) { + return selectOne(new LambdaQueryWrapper() + .eq(SysUser::getUsername, username)); + } +} diff --git a/src/main/java/com/tracexd/model/dto/RecordQueryDTO.java b/src/main/java/com/tracexd/model/dto/RecordQueryDTO.java new file mode 100644 index 0000000..001e036 --- /dev/null +++ b/src/main/java/com/tracexd/model/dto/RecordQueryDTO.java @@ -0,0 +1,33 @@ +package com.tracexd.model.dto; + +import java.time.LocalDate; +import java.util.List; + +/** + * 记录查询条件 DTO + */ +public class RecordQueryDTO { + + private List persons; + private List locations; + private List categories; + private LocalDate startDate; + private LocalDate endDate; + private int page = 1; + private int size = 20; + + public List getPersons() { return persons; } + public void setPersons(List persons) { this.persons = persons; } + public List getLocations() { return locations; } + public void setLocations(List locations) { this.locations = locations; } + public List getCategories() { return categories; } + public void setCategories(List categories) { this.categories = categories; } + public LocalDate getStartDate() { return startDate; } + public void setStartDate(LocalDate startDate) { this.startDate = startDate; } + public LocalDate getEndDate() { return endDate; } + public void setEndDate(LocalDate endDate) { this.endDate = endDate; } + public int getPage() { return page; } + public void setPage(int page) { this.page = page; } + public int getSize() { return size; } + public void setSize(int size) { this.size = size; } +} diff --git a/src/main/java/com/tracexd/model/dto/VoiceProcessResult.java b/src/main/java/com/tracexd/model/dto/VoiceProcessResult.java new file mode 100644 index 0000000..f07f92f --- /dev/null +++ b/src/main/java/com/tracexd/model/dto/VoiceProcessResult.java @@ -0,0 +1,35 @@ +package com.tracexd.model.dto; + +import com.tracexd.enums.IntentType; + +import java.util.List; +import java.util.Map; + +/** + * 语音处理结果 DTO + */ +public class VoiceProcessResult { + + private IntentType intent; + private String asrText; + private String reply; + private String recordTip; + private List> queryData; + private String sql; + private boolean success; + + public IntentType getIntent() { return intent; } + public void setIntent(IntentType intent) { this.intent = intent; } + public String getAsrText() { return asrText; } + public void setAsrText(String asrText) { this.asrText = asrText; } + public String getReply() { return reply; } + public void setReply(String reply) { this.reply = reply; } + public String getRecordTip() { return recordTip; } + public void setRecordTip(String recordTip) { this.recordTip = recordTip; } + public List> getQueryData() { return queryData; } + public void setQueryData(List> queryData) { this.queryData = queryData; } + public String getSql() { return sql; } + public void setSql(String sql) { this.sql = sql; } + public boolean isSuccess() { return success; } + public void setSuccess(boolean success) { this.success = success; } +} diff --git a/src/main/java/com/tracexd/model/entity/DictTag.java b/src/main/java/com/tracexd/model/entity/DictTag.java new file mode 100644 index 0000000..843d64b --- /dev/null +++ b/src/main/java/com/tracexd/model/entity/DictTag.java @@ -0,0 +1,36 @@ +package com.tracexd.model.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; + +import java.time.LocalDateTime; + +/** + * 字典标签表实体(统一存储人物、地点、分类) + */ +@TableName("dict_tag") +public class DictTag { + + @TableId(type = IdType.AUTO) + private Long id; + + private Long userId; + + private String type; + + private String name; + + private LocalDateTime createdAt; + + public Long getId() { return id; } + public void setId(Long id) { this.id = id; } + public Long getUserId() { return userId; } + public void setUserId(Long userId) { this.userId = userId; } + public String getType() { return type; } + public void setType(String type) { this.type = type; } + public String getName() { return name; } + public void setName(String name) { this.name = name; } + public LocalDateTime getCreatedAt() { return createdAt; } + public void setCreatedAt(LocalDateTime createdAt) { this.createdAt = createdAt; } +} diff --git a/src/main/java/com/tracexd/model/entity/Record.java b/src/main/java/com/tracexd/model/entity/Record.java new file mode 100644 index 0000000..8012df9 --- /dev/null +++ b/src/main/java/com/tracexd/model/entity/Record.java @@ -0,0 +1,53 @@ +package com.tracexd.model.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; + +import java.math.BigDecimal; +import java.time.LocalDateTime; + +/** + * 日常事项记录表实体 + */ +@TableName("record") +public class Record { + + @TableId(type = IdType.AUTO) + private Long id; + + private Long userId; + + private String person; + + private LocalDateTime time; + + private String location; + + private String content; + + private BigDecimal amount; + + private String category; + + private LocalDateTime createdAt; + + public Long getId() { return id; } + public void setId(Long id) { this.id = id; } + public Long getUserId() { return userId; } + public void setUserId(Long userId) { this.userId = userId; } + public String getPerson() { return person; } + public void setPerson(String person) { this.person = person; } + public LocalDateTime getTime() { return time; } + public void setTime(LocalDateTime time) { this.time = time; } + public String getLocation() { return location; } + public void setLocation(String location) { this.location = location; } + public String getContent() { return content; } + public void setContent(String content) { this.content = content; } + public BigDecimal getAmount() { return amount; } + public void setAmount(BigDecimal amount) { this.amount = amount; } + public String getCategory() { return category; } + public void setCategory(String category) { this.category = category; } + public LocalDateTime getCreatedAt() { return createdAt; } + public void setCreatedAt(LocalDateTime createdAt) { this.createdAt = createdAt; } +} diff --git a/src/main/java/com/tracexd/model/entity/SysUser.java b/src/main/java/com/tracexd/model/entity/SysUser.java new file mode 100644 index 0000000..f1f5d6d --- /dev/null +++ b/src/main/java/com/tracexd/model/entity/SysUser.java @@ -0,0 +1,40 @@ +package com.tracexd.model.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableName; + +import java.time.LocalDateTime; + +/** + * 系统用户表实体 + */ +@TableName("sys_user") +public class SysUser { + + @TableId(type = IdType.AUTO) + private Long id; + + private String username; + + private String password; + + private String displayName; + + private Boolean enabled; + + private LocalDateTime createdAt; + + public Long getId() { return id; } + public void setId(Long id) { this.id = id; } + public String getUsername() { return username; } + public void setUsername(String username) { this.username = username; } + public String getPassword() { return password; } + public void setPassword(String password) { this.password = password; } + public String getDisplayName() { return displayName; } + public void setDisplayName(String displayName) { this.displayName = displayName; } + public Boolean getEnabled() { return enabled; } + public void setEnabled(Boolean enabled) { this.enabled = enabled; } + public LocalDateTime getCreatedAt() { return createdAt; } + public void setCreatedAt(LocalDateTime createdAt) { this.createdAt = createdAt; } +} diff --git a/src/main/java/com/tracexd/service/ai/AiService.java b/src/main/java/com/tracexd/service/ai/AiService.java new file mode 100644 index 0000000..e5322fc --- /dev/null +++ b/src/main/java/com/tracexd/service/ai/AiService.java @@ -0,0 +1,164 @@ +package com.tracexd.service.ai; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.tracexd.common.exception.BusinessException; +import com.tracexd.enums.IntentType; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; +import org.springframework.web.client.RestClient; + +import java.util.List; +import java.util.Map; + +/** + * AI 大模型服务 — 调用 Deepseek API + */ +@Service +public class AiService { + + private static final Logger log = LoggerFactory.getLogger(AiService.class); + + private static final String RECORD_SYSTEM_PROMPT = """ + 你是一个日常事项管理AI。用户会输入语音转写后的文本,请分析用户意图。 + + 情况1 - 录入事项: + 用户描述了"谁在什么地方花多少钱干了什么"这类日常消费或活动。 + 请生成 INSERT INTO record 语句,字段:person(人物,默认"我")、time(事项发生时间,用用户提到的时间或当前时间)、location(地点)、content(事项描述)、amount(金额,没提到则0)、category(2~4字分类,如吃饭、剪头、加油、修车、购物、旅游、交通、话费、医疗、水电等)。 + 返回JSON:{"intent":"record","sql":"INSERT SQL语句","reply":""} + + 情况2 - 查询事项: + 用户在询问历史记录,例如"我昨天做了什么"、"我一共花了多少钱"、"我上次吃面是什么时候"等。 + 生成 SELECT 语句,只查 person, time, content, amount 四个字段。 + 返回JSON:{"intent":"query","sql":"SELECT SQL语句","reply":""} + + 情况3 - 其他: + 用户说了录入或查询以外的内容。 + 返回JSON:{"intent":"other","sql":"","reply":"友善的回复"} + + 只返回JSON,不要包含其他内容。当前时间:{currentTime} + """; + + private static final String SUMMARY_PROMPT = """ + 用户的问题: {userText} + + 查询到以下数据: + {queryResult} + + 请根据查询结果,用中文生成一段简洁易懂的回复,总结用户想知道的息。 + 如果结果为空,请友好告知没有找到相关记录。 + """; + + private final RestClient restClient; + private final ObjectMapper objectMapper; + + @Value("${tracexd.deepseek.api-key}") + private String apiKey; + + @Value("${tracexd.deepseek.base-url}") + private String baseUrl; + + @Value("${tracexd.deepseek.model}") + private String model; + + public AiService(RestClient restClient, ObjectMapper objectMapper) { + this.restClient = restClient; + this.objectMapper = objectMapper; + } + + /** + * 分析用户输入文本的意图,并生成相应 SQL 或回复 + * + * @param userText ASR 识别后的文本 + * @return 包含意图、SQL、回复的分析结果 + */ + public IntentResult analyzeIntent(String userText) { + String systemPrompt = RECORD_SYSTEM_PROMPT.replace("{currentTime}", java.time.LocalDateTime.now().toString()); + + String responseContent = callDeepseek(systemPrompt, userText); + return parseIntentResult(responseContent); + } + + /** + * 将查询结果发给 AI 生成总结 + * + * @param userText 用户原始输入 + * @param queryResult 查询到的数据 JSON + * @return AI 生成的总结回复 + */ + public String summarizeQueryResult(String userText, String queryResult) { + String prompt = SUMMARY_PROMPT + .replace("{userText}", userText) + .replace("{queryResult}", queryResult); + + return callDeepseek("你是一个数据总结助手", prompt); + } + + /** + * 通用方法:调用 Deepseek API + */ + private String callDeepseek(String systemPrompt, String userText) { + Map requestBody = Map.of( + "model", model, + "messages", List.of( + Map.of("role", "system", "content", systemPrompt), + Map.of("role", "user", "content", userText) + ), + "stream", false + ); + + log.info("Calling Deepseek model: {}", model); + + Map result = restClient.post() + .uri(baseUrl + "/chat/completions") + .header("Authorization", "Bearer " + apiKey) + .header("Content-Type", "application/json") + .body(requestBody) + .retrieve() + .body(Map.class); + + if (result == null || !result.containsKey("choices")) { + throw new BusinessException("AI 调用失败:无返回结果"); + } + + List> choices = (List>) result.get("choices"); + if (choices == null || choices.isEmpty()) { + throw new BusinessException("AI 调用失败:无有效结果"); + } + + Map message = (Map) choices.get(0).get("message"); + return (String) message.get("content"); + } + + /** + * 解析 AI 返回的 JSON 结果 + */ + private IntentResult parseIntentResult(String json) { + try { + JsonNode root = objectMapper.readTree(json); + String intentStr = root.get("intent").asText(); + String sql = root.has("sql") ? root.get("sql").asText() : ""; + String reply = root.has("reply") ? root.get("reply").asText() : ""; + + IntentType intent = switch (intentStr) { + case "record" -> IntentType.RECORD; + case "query" -> IntentType.QUERY; + default -> IntentType.OTHER; + }; + + return new IntentResult(intent, sql, reply); + } catch (JsonProcessingException e) { + log.error("Failed to parse AI response: {}", json, e); + throw new BusinessException("AI 返回格式异常"); + } + } + + /** + * 意图分析结果内部类 + */ + public record IntentResult(IntentType intent, String sql, String reply) { + } +} diff --git a/src/main/java/com/tracexd/service/asr/AsrService.java b/src/main/java/com/tracexd/service/asr/AsrService.java new file mode 100644 index 0000000..b45eb4b --- /dev/null +++ b/src/main/java/com/tracexd/service/asr/AsrService.java @@ -0,0 +1,85 @@ +package com.tracexd.service.asr; + +import com.tracexd.common.exception.BusinessException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; +import org.springframework.web.client.RestClient; + +import java.util.Base64; +import java.util.List; +import java.util.Map; + +/** + * ASR 语音识别服务 — 调用小米 MIMO V2.5 ASR + */ +@Service +public class AsrService { + + private static final Logger log = LoggerFactory.getLogger(AsrService.class); + + private final RestClient restClient; + + @Value("${tracexd.mimo.api-key}") + private String apiKey; + + @Value("${tracexd.mimo.base-url}") + private String baseUrl; + + @Value("${tracexd.mimo.model}") + private String model; + + public AsrService(RestClient restClient) { + this.restClient = restClient; + } + + /** + * 对音频进行语音识别 + * + * @param audioData 音频原始字节 + * @param mimeType 音频 MIME 类型(audio/wav 或 audio/mpeg) + * @return 识别后的文本 + */ + public String recognize(byte[] audioData, String mimeType) { + String base64Audio = Base64.getEncoder().encodeToString(audioData); + + Map requestBody = Map.of( + "model", model, + "messages", List.of(Map.of( + "role", "user", + "content", List.of(Map.of( + "type", "input_audio", + "input_audio", Map.of( + "data", "data:" + mimeType + ";base64," + base64Audio + ) + )) + )), + "asr_options", Map.of("language", "zh") + ); + + log.info("Calling MIMO ASR, audio size: {} bytes, mime: {}", audioData.length, mimeType); + + Map result = restClient.post() + .uri(baseUrl + "/chat/completions") + .header("api-key", apiKey) + .header("Content-Type", "application/json") + .body(requestBody) + .retrieve() + .body(Map.class); + + if (result == null || !result.containsKey("choices")) { + throw new BusinessException("ASR 识别失败:无返回结果"); + } + + List> choices = (List>) result.get("choices"); + if (choices == null || choices.isEmpty()) { + throw new BusinessException("ASR 识别失败:无有效结果"); + } + + Map message = (Map) choices.get(0).get("message"); + String text = (String) message.get("content"); + log.info("ASR result: {}", text); + return text; + } +} diff --git a/src/main/java/com/tracexd/service/record/DictTagService.java b/src/main/java/com/tracexd/service/record/DictTagService.java new file mode 100644 index 0000000..ade4ef6 --- /dev/null +++ b/src/main/java/com/tracexd/service/record/DictTagService.java @@ -0,0 +1,56 @@ +package com.tracexd.service.record; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.tracexd.mapper.DictTagMapper; +import com.tracexd.model.entity.DictTag; +import org.springframework.stereotype.Service; + +import java.time.LocalDateTime; +import java.util.List; +import java.util.stream.Collectors; + +/** + * 字典标签服务 — 管理人物/地点/分类的去重存储 + */ +@Service +public class DictTagService { + + private final DictTagMapper dictTagMapper; + + public DictTagService(DictTagMapper dictTagMapper) { + this.dictTagMapper = dictTagMapper; + } + + /** + * 确保标签存在于字典中(不存在则插入) + */ + public void ensureTagExists(Long userId, String type, String name) { + if (name == null || name.isBlank()) return; + Long count = dictTagMapper.selectCount( + new LambdaQueryWrapper() + .eq(DictTag::getUserId, userId) + .eq(DictTag::getType, type) + .eq(DictTag::getName, name) + ); + if (count == null || count == 0) { + DictTag tag = new DictTag(); + tag.setUserId(userId); + tag.setType(type); + tag.setName(name); + tag.setCreatedAt(LocalDateTime.now()); + dictTagMapper.insert(tag); + } + } + + /** + * 根据类型获取某用户的标签列表 + */ + public List getTagsByType(Long userId, String type) { + return dictTagMapper.selectList( + new LambdaQueryWrapper() + .eq(DictTag::getUserId, userId) + .eq(DictTag::getType, type) + .orderByAsc(DictTag::getName) + ).stream().map(DictTag::getName).collect(Collectors.toList()); + } +} diff --git a/src/main/java/com/tracexd/service/record/RecordService.java b/src/main/java/com/tracexd/service/record/RecordService.java new file mode 100644 index 0000000..065564d --- /dev/null +++ b/src/main/java/com/tracexd/service/record/RecordService.java @@ -0,0 +1,81 @@ +package com.tracexd.service.record; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.tracexd.mapper.RecordMapper; +import com.tracexd.model.dto.RecordQueryDTO; +import com.tracexd.model.entity.Record; +import org.springframework.stereotype.Service; + +import java.math.BigDecimal; +import java.util.List; + +/** + * 事项记录服务 — CRUD 和查询 + */ +@Service +public class RecordService { + + private final RecordMapper recordMapper; + + public RecordService(RecordMapper recordMapper) { + this.recordMapper = recordMapper; + } + + public void insert(Record record) { + recordMapper.insert(record); + } + + public List executeSelectSql(String sql) { + return recordMapper.selectList(new com.baomidou.mybatisplus.core.conditions.query.QueryWrapper() + .apply("1=1 AND " + extractWhereClause(sql))); + } + + public IPage queryPage(RecordQueryDTO queryDTO, Long userId) { + Page page = new Page<>(queryDTO.getPage(), queryDTO.getSize()); + LambdaQueryWrapper wrapper = new LambdaQueryWrapper() + .eq(Record::getUserId, userId); + + if (queryDTO.getPersons() != null && !queryDTO.getPersons().isEmpty()) + wrapper.in(Record::getPerson, queryDTO.getPersons()); + if (queryDTO.getLocations() != null && !queryDTO.getLocations().isEmpty()) + wrapper.in(Record::getLocation, queryDTO.getLocations()); + if (queryDTO.getCategories() != null && !queryDTO.getCategories().isEmpty()) + wrapper.in(Record::getCategory, queryDTO.getCategories()); + if (queryDTO.getStartDate() != null) + wrapper.ge(Record::getTime, queryDTO.getStartDate().atStartOfDay()); + if (queryDTO.getEndDate() != null) + wrapper.le(Record::getTime, queryDTO.getEndDate().plusDays(1).atStartOfDay()); + + wrapper.orderByDesc(Record::getTime); + return recordMapper.selectPage(page, wrapper); + } + + public BigDecimal sumAmount(RecordQueryDTO queryDTO, Long userId) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper() + .eq(Record::getUserId, userId); + + if (queryDTO.getPersons() != null && !queryDTO.getPersons().isEmpty()) + wrapper.in(Record::getPerson, queryDTO.getPersons()); + if (queryDTO.getLocations() != null && !queryDTO.getLocations().isEmpty()) + wrapper.in(Record::getLocation, queryDTO.getLocations()); + if (queryDTO.getCategories() != null && !queryDTO.getCategories().isEmpty()) + wrapper.in(Record::getCategory, queryDTO.getCategories()); + if (queryDTO.getStartDate() != null) + wrapper.ge(Record::getTime, queryDTO.getStartDate().atStartOfDay()); + if (queryDTO.getEndDate() != null) + wrapper.le(Record::getTime, queryDTO.getEndDate().plusDays(1).atStartOfDay()); + + List records = recordMapper.selectList(wrapper); + return records.stream() + .map(r -> r.getAmount() != null ? r.getAmount() : BigDecimal.ZERO) + .reduce(BigDecimal.ZERO, BigDecimal::add); + } + + private String extractWhereClause(String sql) { + int whereIndex = sql.toUpperCase().indexOf("WHERE"); + if (whereIndex == -1) return "1=1"; + return sql.substring(whereIndex + 5).trim().replaceAll(";$", ""); + } +} diff --git a/src/main/java/com/tracexd/service/sql/SqlValidator.java b/src/main/java/com/tracexd/service/sql/SqlValidator.java new file mode 100644 index 0000000..aa1f25b --- /dev/null +++ b/src/main/java/com/tracexd/service/sql/SqlValidator.java @@ -0,0 +1,102 @@ +package com.tracexd.service.sql; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Component; + +import java.util.Arrays; +import java.util.List; +import java.util.regex.Pattern; + +/** + * SQL 语句合法性校验器 + */ +@Component +public class SqlValidator { + + private static final Logger log = LoggerFactory.getLogger(SqlValidator.class); + + private static final List DANGEROUS_KEYWORDS = Arrays.asList( + "DROP", "DELETE", "UPDATE", "ALTER", "TRUNCATE", "CREATE", + "INSERT INTO", "REPLACE", "GRANT", "REVOKE", "EXEC", "EXECUTE", + "CALL", "LOAD_FILE", "INTO OUTFILE", "INTO DUMPFILE" + ); + + private static final Pattern INSERT_PATTERN = Pattern.compile( + "^\\s*INSERT\\s+INTO\\s+record\\s*\\(.*\\)\\s*VALUES\\s*\\(.*\\)\\s*;?\\s*$", + Pattern.CASE_INSENSITIVE | Pattern.DOTALL + ); + + private static final Pattern SELECT_PATTERN = Pattern.compile( + "^\\s*SELECT\\s+.*\\s+FROM\\s+record.*$", + Pattern.CASE_INSENSITIVE | Pattern.DOTALL + ); + + private static final int MAX_RETRY_COUNT = 5; + + /** + * 校验 INSERT SQL 的合法性 + * + * @param sql 待校验的 SQL + * @return 校验通过返回 true + */ + public boolean validateInsert(String sql) { + if (sql == null || sql.isBlank()) { + log.warn("SQL validation failed: SQL is empty"); + return false; + } + + String upperSql = sql.toUpperCase(); + + if (!INSERT_PATTERN.matcher(sql).matches()) { + log.warn("SQL validation failed: not a valid INSERT INTO record: {}", sql); + return false; + } + + for (String keyword : DANGEROUS_KEYWORDS) { + // Skip the expected INSERT INTO itself + if ("INSERT INTO".equals(keyword)) continue; + if (upperSql.contains(keyword)) { + log.warn("SQL validation failed: contains dangerous keyword '{}': {}", keyword, sql); + return false; + } + } + + return true; + } + + /** + * 校验 SELECT SQL 的合法性 + * + * @param sql 待校验的 SQL + * @return 校验通过返回 true + */ + public boolean validateSelect(String sql) { + if (sql == null || sql.isBlank()) { + return false; + } + + String upperSql = sql.toUpperCase(); + + if (!SELECT_PATTERN.matcher(sql).matches()) { + log.warn("SQL validation failed: not a valid SELECT FROM record: {}", sql); + return false; + } + + for (String keyword : DANGEROUS_KEYWORDS) { + if (upperSql.contains(keyword)) { + log.warn("SQL validation failed: contains dangerous keyword '{}': {}", keyword, sql); + return false; + } + } + + return true; + } + + /** + * 获取最大重试次数 + */ + public int getMaxRetryCount() { + return MAX_RETRY_COUNT; + } +} diff --git a/src/main/java/com/tracexd/service/voice/VoiceProcessService.java b/src/main/java/com/tracexd/service/voice/VoiceProcessService.java new file mode 100644 index 0000000..eaf01e0 --- /dev/null +++ b/src/main/java/com/tracexd/service/voice/VoiceProcessService.java @@ -0,0 +1,238 @@ +package com.tracexd.service.voice; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.tracexd.common.exception.BusinessException; +import com.tracexd.enums.IntentType; +import com.tracexd.model.dto.VoiceProcessResult; +import com.tracexd.model.entity.Record; +import com.tracexd.service.ai.AiService; +import com.tracexd.service.ai.AiService.IntentResult; +import com.tracexd.service.asr.AsrService; +import com.tracexd.service.record.DictTagService; +import com.tracexd.service.record.RecordService; +import com.tracexd.service.sql.SqlValidator; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Map; +import java.util.concurrent.CompletableFuture; + +/** + * 语音处理编排服务 — ASR → AI → SQL执行 / 查询汇总 + */ +@Service +public class VoiceProcessService { + + private static final Logger log = LoggerFactory.getLogger(VoiceProcessService.class); + + private final AsrService asrService; + private final AiService aiService; + private final SqlValidator sqlValidator; + private final RecordService recordService; + private final DictTagService dictTagService; + private final JdbcTemplate jdbcTemplate; + private final ObjectMapper objectMapper; + + public VoiceProcessService(AsrService asrService, AiService aiService, + SqlValidator sqlValidator, RecordService recordService, + DictTagService dictTagService, JdbcTemplate jdbcTemplate, + ObjectMapper objectMapper) { + this.asrService = asrService; + this.aiService = aiService; + this.sqlValidator = sqlValidator; + this.recordService = recordService; + this.dictTagService = dictTagService; + this.jdbcTemplate = jdbcTemplate; + this.objectMapper = objectMapper; + } + + /** + * 异步处理语音录入/查询 + */ + @Async("voiceTaskExecutor") + public CompletableFuture processVoice(byte[] audioData, String mimeType, Long userId) { + try { + String asrText = asrService.recognize(audioData, mimeType); + + // ASR no content -> skip LLM + if (asrText == null || asrText.isBlank()) { + log.warn("ASR returned empty result, skipping LLM call"); + VoiceProcessResult result = new VoiceProcessResult(); + result.setSuccess(false); + result.setReply("未识别到语音内容"); + return CompletableFuture.completedFuture(result); + } + return CompletableFuture.completedFuture(processText(asrText, userId)); + } catch (Exception e) { + log.error("Voice process failed", e); + VoiceProcessResult result = new VoiceProcessResult(); + result.setSuccess(false); + result.setReply("处理失败:" + e.getMessage()); + return CompletableFuture.completedFuture(result); + } + } + + public VoiceProcessResult processText(String userText, Long userId) { + log.info("Processing text: {}", userText); + + IntentResult intentResult = aiService.analyzeIntent(userText); + VoiceProcessResult result = new VoiceProcessResult(); + result.setAsrText(userText); + result.setIntent(intentResult.intent()); + result.setSql(intentResult.sql()); + + switch (intentResult.intent()) { + case RECORD -> handleRecord(result, intentResult.sql(), userId); + case QUERY -> handleQuery(result, intentResult.sql(), userText); + case OTHER -> result.setReply(intentResult.reply()); + } + + result.setSuccess(true); + return result; + } + + private void handleRecord(VoiceProcessResult result, String sql, Long userId) { + for (int i = 0; i < sqlValidator.getMaxRetryCount(); i++) { + if (!sqlValidator.validateInsert(sql)) { + log.warn("Insert SQL invalid, retry {}/{}", i + 1, sqlValidator.getMaxRetryCount()); + IntentResult retry = aiService.analyzeIntent("请重新生成合法的INSERT SQL语句:" + result.getAsrText()); + sql = retry.sql(); + result.setSql(sql); + continue; + } + try { + String modifiedSql = injectUserId(sql, userId); + jdbcTemplate.update(modifiedSql); + syncDictTagsFromSql(sql, userId); + String category = extractCategoryFromSql(sql); + result.setRecordTip("已录入" + category + "事项"); + log.info("Record inserted successfully: {}", sql); + return; + } catch (Exception e) { + log.warn("Insert SQL execution failed, retry {}/{}: {}", i + 1, sqlValidator.getMaxRetryCount(), e.getMessage()); + IntentResult retry = aiService.analyzeIntent("请重新生成合法的INSERT SQL语句,之前错误:" + e.getMessage() + ",原文:" + result.getAsrText()); + sql = retry.sql(); + result.setSql(sql); + } + } + result.setSuccess(false); + result.setReply("录入失败:SQL多次生成仍不合法"); + } + + private void handleQuery(VoiceProcessResult result, String sql, String userText) { + if (!sqlValidator.validateSelect(sql)) { + result.setSuccess(false); + result.setReply("查询语句不合法"); + return; + } + try { + List> queryData = jdbcTemplate.queryForList(sql); + result.setQueryData(queryData); + String queryResultJson; + try { + queryResultJson = objectMapper.writeValueAsString(queryData); + } catch (JsonProcessingException e) { + queryResultJson = queryData.toString(); + } + String summary = aiService.summarizeQueryResult(userText, queryResultJson); + result.setReply(summary); + log.info("Query executed, {} rows returned", queryData.size()); + } catch (Exception e) { + log.error("Query execution failed", e); + result.setSuccess(false); + result.setReply("查询执行失败:" + e.getMessage()); + } + } + + private void syncDictTagsFromSql(String sql, Long userId) { + try { + String upperSql = sql.toUpperCase(); + int valuesIdx = upperSql.indexOf("VALUES"); + if (valuesIdx == -1) return; + String valuesPart = sql.substring(valuesIdx + 6).trim(); + valuesPart = valuesPart.replaceAll("^\\(", "").replaceAll("\\)\\s*;?$", ""); + String[] parts = splitValues(valuesPart); + if (parts.length >= 6) { + String person = cleanValue(parts[0]); + String location = cleanValue(parts[2]); + String category = cleanValue(parts[5]); + if (person != null && !person.isBlank() && !"我".equals(person)) + dictTagService.ensureTagExists(userId, "person", person); + if (location != null && !location.isBlank()) + dictTagService.ensureTagExists(userId, "location", location); + if (category != null && !category.isBlank()) + dictTagService.ensureTagExists(userId, "category", category); + } + } catch (Exception e) { + log.warn("Failed to sync dict tags from SQL: {}", e.getMessage()); + } + } + + private String injectUserId(String sql, Long userId) { + String upper = sql.toUpperCase(); + int valuesIdx = upper.indexOf("VALUES"); + if (valuesIdx == -1) return sql; + String beforeValues = sql.substring(0, valuesIdx); + String afterValues = sql.substring(valuesIdx); + int parenOpen = beforeValues.indexOf('('); + int parenClose = beforeValues.lastIndexOf(')'); + if (parenOpen == -1 || parenClose == -1) return sql; + String columns = beforeValues.substring(parenOpen + 1, parenClose).trim(); + String modifiedColumns = columns + ", user_id"; + int valParenOpen = afterValues.indexOf('('); + int valParenClose = afterValues.lastIndexOf(')'); + if (valParenOpen == -1 || valParenClose == -1) return sql; + String values = afterValues.substring(valParenOpen + 1, valParenClose).trim(); + String modifiedValues = values + ", " + userId; + return beforeValues.substring(0, parenOpen + 1) + modifiedColumns + ")" + + afterValues.substring(0, valParenOpen + 1) + modifiedValues + ")" + + afterValues.substring(valParenClose + 1); + } + + private String extractCategoryFromSql(String sql) { + try { + int valuesIdx = sql.toUpperCase().indexOf("VALUES"); + if (valuesIdx == -1) return "事项"; + String valuesPart = sql.substring(valuesIdx + 6).trim(); + valuesPart = valuesPart.replaceAll("^\\(", "").replaceAll("\\)\\s*;?$", ""); + String[] parts = splitValues(valuesPart); + if (parts.length >= 6) return cleanValue(parts[5]); + } catch (Exception e) { + log.warn("Failed to extract category", e); + } + return "事项"; + } + + private String[] splitValues(String valuesPart) { + List result = new java.util.ArrayList<>(); + boolean inQuote = false; + char quoteChar = '\''; + StringBuilder current = new StringBuilder(); + for (char c : valuesPart.toCharArray()) { + if (inQuote) { + current.append(c); + if (c == quoteChar) inQuote = false; + } else if (c == '\'' || c == '"') { + inQuote = true; + quoteChar = c; + current.append(c); + } else if (c == ',') { + result.add(current.toString()); + current = new StringBuilder(); + } else { + current.append(c); + } + } + result.add(current.toString()); + return result.toArray(String[]::new); + } + + private String cleanValue(String value) { + return value.trim().replaceAll("^['\"]", "").replaceAll("['\"]$", "").trim(); + } +} diff --git a/src/main/resources/application-test.yml b/src/main/resources/application-test.yml new file mode 100644 index 0000000..55ca896 --- /dev/null +++ b/src/main/resources/application-test.yml @@ -0,0 +1,18 @@ +spring: + datasource: + url: jdbc:h2:mem:tracexd;DB_CLOSE_DELAY=-1;MODE=MYSQL + username: sa + password: + driver-class-name: org.h2.Driver + sql: + init: + mode: always + schema-locations: classpath:init-schema.sql + +mybatis-plus: + configuration: + log-impl: org.apache.ibatis.logging.stdout.StdOutImpl + +logging: + level: + com.tracexd: DEBUG diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml new file mode 100644 index 0000000..5bfbcda --- /dev/null +++ b/src/main/resources/application.yml @@ -0,0 +1,59 @@ +server: + port: 8081 + servlet: + session: + timeout: 30d + +spring: + main: + banner-mode: off + datasource: + url: jdbc:mysql://192.168.2.5:3306/tracexd?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true + username: root + password: root + driver-class-name: com.mysql.cj.jdbc.Driver + thymeleaf: + prefix: classpath:/templates/ + suffix: .html + mode: HTML + cache: true + servlet: + multipart: + max-file-size: 10MB + security: + user: + name: admin + password: admin123 + +mybatis-plus: + global-config: + banner: false + configuration: + log-impl: org.apache.ibatis.logging.nologging.NoLoggingImpl + +logging: + level: + com.tracexd: INFO + org.springframework: WARN + +--- +spring: + config: + activate: + on-profile: dev + thymeleaf: + cache: false +mybatis-plus: + configuration: + log-impl: org.apache.ibatis.logging.stdout.StdOutImpl + +--- +tracexd: + deepseek: + api-key: sk-732e5f5f1f07454492022401f0a2bf40 + base-url: https://api.deepseek.com + model: deepseek-v4-pro + mimo: + api-key: sk-cqttr117tzllfolonxztu4qa5208liota2llfut458ixx2m1 + base-url: https://api.xiaomimimo.com/v1 + model: mimo-v2.5-asr diff --git a/src/main/resources/init-schema.sql b/src/main/resources/init-schema.sql new file mode 100644 index 0000000..c2dbdb8 --- /dev/null +++ b/src/main/resources/init-schema.sql @@ -0,0 +1,37 @@ +CREATE TABLE IF NOT EXISTS record ( + id BIGINT AUTO_INCREMENT PRIMARY KEY, + user_id BIGINT NOT NULL, + person VARCHAR(50) NOT NULL DEFAULT '我', + time DATETIME NOT NULL, + location VARCHAR(200), + content VARCHAR(1000), + amount DECIMAL(10,2) NOT NULL DEFAULT 0.00, + category VARCHAR(20), + created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP +); + +CREATE TABLE IF NOT EXISTS dict_tag ( + id BIGINT AUTO_INCREMENT PRIMARY KEY, + user_id BIGINT NOT NULL, + type VARCHAR(20) NOT NULL, + name VARCHAR(200) NOT NULL, + created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, + UNIQUE KEY uk_user_type_name (user_id, type, name) +); + +CREATE TABLE IF NOT EXISTS sys_user ( + id BIGINT AUTO_INCREMENT PRIMARY KEY, + username VARCHAR(50) NOT NULL, + password VARCHAR(255) NOT NULL, + display_name VARCHAR(50) NOT NULL DEFAULT '', + enabled TINYINT(1) NOT NULL DEFAULT 1, + created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, + UNIQUE KEY uk_username (username) +); + +CREATE TABLE IF NOT EXISTS persistent_logins ( + username VARCHAR(64) NOT NULL, + series VARCHAR(64) PRIMARY KEY, + token VARCHAR(64) NOT NULL, + last_used TIMESTAMP NOT NULL +); diff --git a/src/main/resources/static/.well-known/appspecific/com.chrome.devtools.json b/src/main/resources/static/.well-known/appspecific/com.chrome.devtools.json new file mode 100644 index 0000000..f117788 --- /dev/null +++ b/src/main/resources/static/.well-known/appspecific/com.chrome.devtools.json @@ -0,0 +1 @@ +{} diff --git a/src/main/resources/static/css/style.css b/src/main/resources/static/css/style.css new file mode 100644 index 0000000..6f3f03f --- /dev/null +++ b/src/main/resources/static/css/style.css @@ -0,0 +1,119 @@ +/* ===== Reset & Base ===== */ +*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; } +body { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif; background: #f5f5f7; color: #1d1d1f; min-height: 100vh; } +a { color: #007aff; text-decoration: none; } +a:hover { text-decoration: underline; } +.app-header { display: flex; align-items: center; justify-content: space-between; padding: 12px 20px; background: #fff; border-bottom: 1px solid #e5e5e7; position: sticky; top: 0; z-index: 100; } +.header-title { font-size: 18px; font-weight: 600; } +.header-link { font-size: 14px; color: #007aff; } +.header-nav { display: flex; align-items: center; gap: 12px; } +.header-logout { font-size: 14px; color: #999; cursor: pointer; } +.header-logout:hover { color: #ff3b30; } +.main-content { max-width: 960px; margin: 0 auto; padding: 16px; min-height: calc(100vh - 52px); padding-bottom: 100px; } +.toast { position: fixed; top: 60px; left: 50%; transform: translateX(-50%); padding: 10px 24px; border-radius: 8px; font-size: 14px; z-index: 999; transition: opacity 0.3s; text-align: center; max-width: 90%; white-space: nowrap; } +.toast.hidden { opacity: 0; pointer-events: none; } +.toast.show { opacity: 1; } +.toast-success { background: #34c759; color: #fff; } +.toast-error { background: #ff3b30; color: #fff; } +.toast-info { background: #007aff; color: #fff; } +.mic-btn { position: fixed; bottom: 40px; left: 50%; margin-left: -40px; width: 80px; height: 80px; border-radius: 50%; background: #007aff; border: none; cursor: pointer; box-shadow: 0 4px 16px rgba(0,122,255,0.4); display: flex; align-items: center; justify-content: center; transition: transform 0.15s, box-shadow 0.15s, background 0.15s; z-index: 200; touch-action: none; } +.mic-btn:hover { transform: scale(1.05); box-shadow: 0 6px 20px rgba(0,122,255,0.5); } +.mic-btn:active, .mic-btn.recording { transform: scale(0.95); background: #ff3b30; box-shadow: 0 4px 16px rgba(255,59,48,0.4); } +.mic-icon { width: 38px; height: 38px; color: #fff; } +.result-area { margin-bottom: 16px; } +.query-result-card { background: #fff; border-radius: 12px; padding: 16px; box-shadow: 0 2px 8px rgba(0,0,0,0.06); border: 1px solid #e5e5e7; } +.query-table { width: 100%; border-collapse: collapse; margin-bottom: 12px; } +.query-table th, .query-table td { padding: 8px 12px; text-align: left; font-size: 13px; border-bottom: 1px solid #f0f0f0; } +.query-table th { font-weight: 600; color: #666; background: #fafafa; } +.ai-summary { padding: 8px 0; font-size: 14px; line-height: 1.6; color: #333; } +.section-title { font-size: 16px; font-weight: 600; margin-bottom: 12px; color: #333; } +.empty-hint { color: #999; font-size: 14px; text-align: center; padding: 32px 0; } +.recent-list { display: flex; flex-direction: column; gap: 8px; } +.record-item { display: flex; align-items: center; gap: 12px; background: #fff; padding: 12px 16px; border-radius: 10px; box-shadow: 0 1px 4px rgba(0,0,0,0.04); border: 1px solid #e5e5e7; font-size: 14px; } +.rec-time { color: #666; min-width: 50px; font-size: 13px; white-space: nowrap; } +.rec-person { color: #007aff; font-weight: 500; min-width: 36px; } +.rec-content { flex: 1; color: #333; } +.rec-amount { font-weight: 600; color: #333; min-width: 60px; text-align: right; white-space: nowrap; } +.badge { display: inline-block; padding: 2px 8px; border-radius: 4px; font-size: 12px; color: #fff; white-space: nowrap; } +.badge-default { background: #666; } +.card-default { background: transparent; } +.card-c1 { background: rgba(255, 149, 0, 0.08); } +.card-c2 { background: rgba(0, 122, 255, 0.08); } +.card-c3 { background: rgba(255, 45, 85, 0.08); } +.card-c4 { background: rgba(175, 82, 222, 0.08); } +.card-c5 { background: rgba(52, 199, 89, 0.08); } +.card-c6 { background: rgba(88, 86, 214, 0.08); } +.card-c7 { background: rgba(255, 149, 0, 0.08); } +.card-c8 { background: rgba(0, 122, 255, 0.08); } +.card-c9 { background: rgba(255, 45, 85, 0.08); } +.card-c10 { background: rgba(175, 82, 222, 0.08); } +.card-c11 { background: rgba(52, 199, 89, 0.08); } +.card-c12 { background: rgba(88, 86, 214, 0.08); } +.badge-c1 { background: #ff9500; } +.badge-c2 { background: #007aff; } +.badge-c3 { background: #ff2d55; } +.badge-c4 { background: #af52de; } +.badge-c5 { background: #34c759; } +.badge-c6 { background: #5856d6; } +.badge-c7 { background: #ff9500; } +.badge-c8 { background: #007aff; } +.badge-c9 { background: #ff2d55; } +.badge-c10 { background: #af52de; } +.badge-c11 { background: #34c759; } +.badge-c12 { background: #5856d6; } +.login-body { display: flex; align-items: center; justify-content: center; min-height: 100vh; background: linear-gradient(135deg, #f5f5f7 0%, #e8e8ed 100%); } +.login-container { background: #fff; padding: 40px; border-radius: 16px; box-shadow: 0 8px 32px rgba(0,0,0,0.08); width: 360px; max-width: 90%; } +.login-title { text-align: center; font-size: 28px; font-weight: 700; margin-bottom: 4px; color: #1d1d1f; } +.login-subtitle { text-align: center; font-size: 14px; color: #999; margin-bottom: 24px; } +.login-error { background: #fff2f2; color: #ff3b30; padding: 8px 12px; border-radius: 6px; margin-bottom: 16px; font-size: 13px; } +.login-info { background: #e8f4ff; color: #007aff; padding: 8px 12px; border-radius: 6px; margin-bottom: 16px; font-size: 13px; } +.form-group { margin-bottom: 16px; } +.form-group label { display: block; font-size: 13px; font-weight: 500; margin-bottom: 6px; color: #555; } +.form-group input { width: 100%; padding: 10px 12px; border: 1px solid #d1d1d6; border-radius: 8px; font-size: 14px; outline: none; transition: border-color 0.2s; } +.form-group input:focus { border-color: #007aff; box-shadow: 0 0 0 3px rgba(0,122,255,0.1); } +.form-remember { margin-bottom: 20px; font-size: 13px; color: #666; } +.form-remember input { margin-right: 6px; } +.login-btn { width: 100%; padding: 12px; background: #007aff; color: #fff; border: none; border-radius: 8px; font-size: 16px; font-weight: 500; cursor: pointer; transition: background 0.2s; } +.login-btn:hover { background: #0056cc; } +.filter-section { background: #fff; border-radius: 12px; padding: 20px; box-shadow: 0 2px 8px rgba(0,0,0,0.06); border: 1px solid #e5e5e7; margin-bottom: 16px; } +.filter-section.hidden { display: none; } +.filter-group { margin-bottom: 16px; } +.filter-group:last-of-type { margin-bottom: 12px; } +.filter-label { display: block; font-size: 13px; font-weight: 600; color: #666; margin-bottom: 8px; } +.filter-tags { display: flex; flex-wrap: wrap; gap: 8px; } +.tag-btn { display: inline-block; padding: 6px 14px; border-radius: 6px; border: 1px solid #d1d1d6; background: #fff; font-size: 13px; cursor: pointer; transition: all 0.15s; user-select: none; color: #333; } +.tag-btn:hover { border-color: #007aff; color: #007aff; } +.tag-btn.active { background: #007aff; color: #fff; border-color: #007aff; } +.filter-date-range { display: flex; align-items: center; gap: 8px; } +.date-input { padding: 6px 12px; border: 1px solid #d1d1d6; border-radius: 6px; font-size: 13px; outline: none; } +.date-input:focus { border-color: #007aff; } +.date-sep { color: #999; } +.filter-actions { display: flex; justify-content: space-between; align-items: center; padding-top: 8px; } +.btn { padding: 8px 24px; border-radius: 8px; font-size: 14px; font-weight: 500; cursor: pointer; transition: all 0.15s; border: none; } +.btn-primary { background: #007aff; color: #fff; } +.btn-primary:hover { background: #0056cc; } +.btn-secondary { background: #f5f5f7; color: #333; border: 1px solid #d1d1d6; } +.btn-secondary:hover { background: #e8e8ed; } +.btn-link { background: none; color: #007aff; padding: 4px 8px; font-size: 13px; } +.btn-link:hover { text-decoration: underline; } +.btn-page { padding: 6px 14px; font-size: 13px; background: #fff; border: 1px solid #d1d1d6; border-radius: 6px; color: #333; } +.btn-page:disabled { opacity: 0.4; cursor: not-allowed; } +.btn-page:hover:not(:disabled) { border-color: #007aff; color: #007aff; } +.filter-summary { background: #fff; border-radius: 10px; padding: 12px 16px; box-shadow: 0 2px 8px rgba(0,0,0,0.06); border: 1px solid #e5e5e7; margin-bottom: 16px; font-size: 13px; color: #666; display: flex; align-items: center; gap: 12px; } +.summary-bar { background: #e8f4ff; border-radius: 8px; padding: 10px 16px; margin-bottom: 12px; font-size: 14px; color: #007aff; } +.summary-bar strong { font-size: 16px; } +.table-wrapper { overflow-x: auto; } +.data-table { width: 100%; border-collapse: collapse; background: #fff; border-radius: 10px; overflow: hidden; box-shadow: 0 1px 4px rgba(0,0,0,0.04); border: 1px solid #e5e5e7; } +.data-table th, .data-table td { padding: 10px 14px; text-align: left; font-size: 13px; border-bottom: 1px solid #f0f0f0; } +.data-table th { background: #fafafa; font-weight: 600; color: #666; white-space: nowrap; } +.data-table tbody tr:hover { background: #f8f8fa; } +.empty-cell { text-align: center; color: #999; padding: 32px 0 !important; } +.col-time { width: 180px; white-space: nowrap; } +.col-person { width: 80px; } +.col-location { min-width: 120px; max-width: 200px; } +.col-content { min-width: 160px; max-width: 400px; } +.col-amount { width: 100px; text-align: right; } +.col-amount-cell { text-align: right; font-weight: 600; } +.col-category { width: 80px; } +.pagination { display: flex; align-items: center; justify-content: center; gap: 16px; margin-top: 16px; font-size: 13px; color: #666; } +@media (max-width: 640px) { .main-content { padding: 12px; padding-bottom: 100px; } .mic-btn { bottom: 24px; left: 50%; margin-left: -34px; width: 68px; height: 68px; } .mic-icon { width: 32px; height: 32px; } .data-table { font-size: 12px; } .data-table th, .data-table td { padding: 8px 10px; } .col-time { width: 140px; } .col-location { max-width: 120px; } .col-content { max-width: 200px; } } diff --git a/src/main/resources/static/favicon.ico b/src/main/resources/static/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..44377e0f02507a5440105339bff750219c87b41c GIT binary patch literal 4286 zcmeH{v2nvN3`LO*T&0c5bRHquz$0V~7b#L?8IR!=JWxX8E5@C~01!Y?DRPDnqy>U_ zAF$3u5BwPh!b+zd(IXK(vvY`E*%AM*RxXD>YYnWZ_Y@UnYI$pQXf?C3Rt;H>m!H+( z)oMM9YM9k8YLqPq3k(HqmA7KOOq(mKuC=YW7zQtgQ29C@6Nd$_+~SFpZtkN^Mx literal 0 HcmV?d00001 diff --git a/src/main/resources/static/js/app.js b/src/main/resources/static/js/app.js new file mode 100644 index 0000000..4ff57bd --- /dev/null +++ b/src/main/resources/static/js/app.js @@ -0,0 +1,63 @@ +/** + * TraceXD 前端通用工具函数 + */ +(function(global) { + + /** + * 格式化时间显示 + * 当天 → HH:mm + * 当年非当天 → M-d HH:mm + * 非当年 → yy-M-d HH + * + * @param {string} isoString ISO 日期时间字符串 + * @returns {string} 格式化后的时间文本 + */ + global.formatTime = function(isoString) { + if (!isoString) return ''; + var d = new Date(isoString); + var pad = function(n) { return String(n).padStart(2, '0'); }; + return (d.getMonth() + 1) + '-' + d.getDate() + ' ' + + pad(d.getHours()) + ':' + pad(d.getMinutes()); + }; + + + /** + * ??????? badge CSS ?? + * ?????????????????????????? + */ + global.badgeClass = function(category) { + if (!category) return 'badge-default'; + var fixed = { + '餐饮': 'badge-c1', + '饮食': 'badge-c1', + '交通': 'badge-c2', + '出行': 'badge-c2', + '购物': 'badge-c3', + '娱乐': 'badge-c4', + '医疗': 'badge-c5', + '健康': 'badge-c5', + '教育': 'badge-c6', + '学习': 'badge-c6', + '养老': 'badge-c7', + '社交': 'badge-c8', + '旅游': 'badge-c9', + '居家': 'badge-c10' + }; + if (fixed[category]) return fixed[category]; + // hash-based fallback + var hash = 0; + for (var i = 0; i < category.length; i++) { + hash = ((hash << 5) - hash) + category.charCodeAt(i); + hash |= 0; + } + var idx = (Math.abs(hash) % 12) + 1; + return 'badge-c' + idx; + }; + + global.logout = function() { + fetch('/logout', { method: 'POST' }).then(function() { + window.location.href = '/login?logout'; + }); + }; + +})(window); \ No newline at end of file diff --git a/src/main/resources/templates/browse.html b/src/main/resources/templates/browse.html new file mode 100644 index 0000000..8597073 --- /dev/null +++ b/src/main/resources/templates/browse.html @@ -0,0 +1,271 @@ + + + + + + + TraceXD - 浏览记录 + + + +
+
+ 首页 + 浏览记录 + 退出 +
+ +
+ +
+
+ +
+
+
+ +
+
+
+ +
+
+
+ +
+ + ~ + +
+
+
+ + +
+
+ + + + + + + + +
+ + + + + + + + + + + + + + +
时间人物地点事项内容金额分类
请点击"查询"查看记录
+
+ + + +
+
+ + + + + diff --git a/src/main/resources/templates/index.html b/src/main/resources/templates/index.html new file mode 100644 index 0000000..6e23be2 --- /dev/null +++ b/src/main/resources/templates/index.html @@ -0,0 +1,329 @@ + + + + + + + TraceXD - 首页 + + + +
+
+ TraceXD + +
+ +
+ +
+ + + + + +
+

最近事项

+
+

暂无事项记录,点击右下角麦克风开始录入

+
+
+
+ + + +
+ + + + + diff --git a/src/main/resources/templates/login.html b/src/main/resources/templates/login.html new file mode 100644 index 0000000..049b6d1 --- /dev/null +++ b/src/main/resources/templates/login.html @@ -0,0 +1,38 @@ + + + + + + + 登录 - TraceXD + + + + + + diff --git a/src/test/java/com/tracexd/TracexdApplicationTests.java b/src/test/java/com/tracexd/TracexdApplicationTests.java new file mode 100644 index 0000000..16d68b0 --- /dev/null +++ b/src/test/java/com/tracexd/TracexdApplicationTests.java @@ -0,0 +1,15 @@ +package com.tracexd; + +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; + +/** + * 应用启动测试 + */ +@SpringBootTest +class TracexdApplicationTests { + + @Test + void contextLoads() { + } +} diff --git a/stderr.log b/stderr.log new file mode 100644 index 0000000..cfda8bc --- /dev/null +++ b/stderr.log @@ -0,0 +1,12 @@ +WARNING: A restricted method in java.lang.System has been called +WARNING: java.lang.System::load has been called by org.fusesource.jansi.internal.JansiLoader in an unnamed module (file:/C:/Users/16332/.m2/wrapper/dists/apache-maven-3.9.9-bin/4nf9hui3q3djbarqar9g711ggc/apache-maven-3.9.9/lib/jansi-2.4.1.jar) +WARNING: Use --enable-native-access=ALL-UNNAMED to avoid a warning for callers in this module +WARNING: Restricted methods will be blocked in a future release unless native access is enabled + +WARNING: A terminally deprecated method in sun.misc.Unsafe has been called +WARNING: sun.misc.Unsafe::objectFieldOffset has been called by com.google.common.util.concurrent.AbstractFuture$UnsafeAtomicHelper (file:/C:/Users/16332/.m2/wrapper/dists/apache-maven-3.9.9-bin/4nf9hui3q3djbarqar9g711ggc/apache-maven-3.9.9/lib/guava-33.2.1-jre.jar) +WARNING: Please consider reporting this to the maintainers of class com.google.common.util.concurrent.AbstractFuture$UnsafeAtomicHelper +WARNING: sun.misc.Unsafe::objectFieldOffset will be removed in a future release +WARNING: Final field _cipher in class org.sonatype.plexus.components.sec.dispatcher.DefaultSecDispatcher has been mutated reflectively by class org.eclipse.sisu.bean.BeanPropertyField in unnamed module @780cb77 (file:/C:/Users/16332/.m2/wrapper/dists/apache-maven-3.9.9-bin/4nf9hui3q3djbarqar9g711ggc/apache-maven-3.9.9/lib/org.eclipse.sisu.inject-0.9.0.M3.jar) +WARNING: Use --enable-final-field-mutation=ALL-UNNAMED to avoid a warning +WARNING: Mutating final fields will be blocked in a future release unless final field mutation is enabled diff --git a/stdout.log b/stdout.log new file mode 100644 index 0000000..fe0fa29 --- /dev/null +++ b/stdout.log @@ -0,0 +1,45 @@ +[INFO] Scanning for projects... +[INFO] +[INFO] ------------------------< com.tracexd:tracexd >------------------------- +[INFO] Building tracexd 1.0.0 +[INFO] from pom.xml +[INFO] --------------------------------[ jar ]--------------------------------- +[INFO] +[INFO] >>> spring-boot:3.5.14:run (default-cli) > test-compile @ tracexd >>> +[INFO] +[INFO] --- resources:3.3.1:resources (default-resources) @ tracexd --- +[INFO] Copying 2 resources from src\main\resources to target\classes +[INFO] Copying 6 resources from src\main\resources to target\classes +[INFO] +[INFO] --- compiler:3.14.1:compile (default-compile) @ tracexd --- +[INFO] Nothing to compile - all classes are up to date. +[INFO] +[INFO] --- resources:3.3.1:testResources (default-testResources) @ tracexd --- +[INFO] skip non existing resourceDirectory C:\Work\tracexd\src\test\resources +[INFO] +[INFO] --- compiler:3.14.1:testCompile (default-testCompile) @ tracexd --- +[INFO] Nothing to compile - all classes are up to date. +[INFO] +[INFO] <<< spring-boot:3.5.14:run (default-cli) < test-compile @ tracexd <<< +[INFO] +[INFO] +[INFO] --- spring-boot:3.5.14:run (default-cli) @ tracexd --- +[INFO] Attaching agents: [] +2026-06-09T14:15:07.058+08:00 INFO 5764 --- [ main] com.tracexd.TracexdApplication : Starting TracexdApplication using Java 26.0.1 with PID 5764 (C:\Work\tracexd\target\classes started by 16332 in C:\Work\tracexd) +2026-06-09T14:15:07.059+08:00 DEBUG 5764 --- [ main] com.tracexd.TracexdApplication : Running with Spring Boot v3.5.14, Spring v6.2.18 +2026-06-09T14:15:07.059+08:00 INFO 5764 --- [ main] com.tracexd.TracexdApplication : The following 1 profile is active: "test" +2026-06-09T14:15:07.660+08:00 INFO 5764 --- [ main] o.apache.catalina.core.StandardService : Starting service [Tomcat] +2026-06-09T14:15:07.660+08:00 INFO 5764 --- [ main] o.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/10.1.54] +2026-06-09T14:15:07.687+08:00 INFO 5764 --- [ main] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext +Logging initialized using 'class org.apache.ibatis.logging.stdout.StdOutImpl' adapter. +Get /198.18.0.1 network interface +Get network interface info: name:iftype53_32769 (Meta Tunnel) +Initialization Sequence datacenterId:0 workerId:16 +2026-06-09T14:15:07.788+08:00 INFO 5764 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting... +2026-06-09T14:15:07.883+08:00 INFO 5764 --- [ main] com.zaxxer.hikari.pool.HikariPool : HikariPool-1 - Added connection conn0: url=jdbc:h2:mem:tracexd user=SA +2026-06-09T14:15:07.884+08:00 INFO 5764 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed. +2026-06-09T14:15:08.298+08:00 INFO 5764 --- [ main] m.e.s.MybatisPlusApplicationContextAware : Register ApplicationContext instances org.springframework.boot.web.servlet.context.AnnotationConfigServletWebServerApplicationContext@e383572 +2026-06-09T14:15:08.339+08:00 INFO 5764 --- [ main] com.tracexd.TracexdApplication : Started TracexdApplication in 1.545 seconds (process running for 1.715) +Default admin user created (admin/admin123) +2026-06-09T14:15:24.899+08:00 INFO 5764 --- [nio-8080-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring DispatcherServlet 'dispatcherServlet' +2026-06-09T14:15:24.969+08:00 WARN 5764 --- [nio-8080-exec-1] o.s.s.c.bcrypt.BCryptPasswordEncoder : Encoded password does not look like BCrypt diff --git a/target/classes/application-test.yml b/target/classes/application-test.yml new file mode 100644 index 0000000..55ca896 --- /dev/null +++ b/target/classes/application-test.yml @@ -0,0 +1,18 @@ +spring: + datasource: + url: jdbc:h2:mem:tracexd;DB_CLOSE_DELAY=-1;MODE=MYSQL + username: sa + password: + driver-class-name: org.h2.Driver + sql: + init: + mode: always + schema-locations: classpath:init-schema.sql + +mybatis-plus: + configuration: + log-impl: org.apache.ibatis.logging.stdout.StdOutImpl + +logging: + level: + com.tracexd: DEBUG diff --git a/target/classes/application.yml b/target/classes/application.yml new file mode 100644 index 0000000..5bfbcda --- /dev/null +++ b/target/classes/application.yml @@ -0,0 +1,59 @@ +server: + port: 8081 + servlet: + session: + timeout: 30d + +spring: + main: + banner-mode: off + datasource: + url: jdbc:mysql://192.168.2.5:3306/tracexd?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true + username: root + password: root + driver-class-name: com.mysql.cj.jdbc.Driver + thymeleaf: + prefix: classpath:/templates/ + suffix: .html + mode: HTML + cache: true + servlet: + multipart: + max-file-size: 10MB + security: + user: + name: admin + password: admin123 + +mybatis-plus: + global-config: + banner: false + configuration: + log-impl: org.apache.ibatis.logging.nologging.NoLoggingImpl + +logging: + level: + com.tracexd: INFO + org.springframework: WARN + +--- +spring: + config: + activate: + on-profile: dev + thymeleaf: + cache: false +mybatis-plus: + configuration: + log-impl: org.apache.ibatis.logging.stdout.StdOutImpl + +--- +tracexd: + deepseek: + api-key: sk-732e5f5f1f07454492022401f0a2bf40 + base-url: https://api.deepseek.com + model: deepseek-v4-pro + mimo: + api-key: sk-cqttr117tzllfolonxztu4qa5208liota2llfut458ixx2m1 + base-url: https://api.xiaomimimo.com/v1 + model: mimo-v2.5-asr diff --git a/target/classes/com/tracexd/TracexdApplication.class b/target/classes/com/tracexd/TracexdApplication.class new file mode 100644 index 0000000000000000000000000000000000000000..e95510814947b58981ad1142d3f00cb8baecc00e GIT binary patch literal 3144 zcmcguTW=dh6#m9>vX1Mv!A(+9XxWC8+KJQcjTV~TQrDpgjvZnrAruJX^~Bj^z3c9- zOZ~M#D68?iscfM;r$fBoa7?LkyF)Q`6jrV_3CKhu6i&wzH#EY}?aHJ~6~eXE;rZ zp_0mX^~jpsb!YB|C?!t{n@Q(;N!D%46AwHsYg?N}t?BTJDMCjOSuW2c$^0Ry;R_58 zQ#~bZS1Y=v+m6r{XjB&UhRHoK({ryY^rmBYElqb?4bRpZq%#>>)s})m&eH9waQ0Bz zcSqK)*SS^A8NFy9ChtZZaJsQ zp+(MBuc}z|-4wl6tQxoYtJ}bb@0c zj8uS22&reWYcrA?y7~pAIEL{`0xC{244S0#DmRYqD*;Q&tIH3g>= zNFmK|wO1HCFCY}(!iR<-6SgJ0#hsEMb1hx$(l#(MhAD>He4&(EF01o}ad9xH{`vVsiJ+FiS)3#7n~f?-U`U0v50nfiO~>)`gSdc;3SLj(5-#t`_)^RD zM4dctH!1H&+7KDGwnXXXkx0So6q0W;Ox+fnylHx>kBA?99ZS@dPt!VBrQ?{vRRz}) zxQ-hPM||9O3uRDbCGbp2{gEDKq*ocDSxO&2$I)mE8aQ(m4Him@MtWzl|qk78QLwklXDtn$$7psPA z$f|8ww&!;g^6PX@QJrGXpKjG|32qUtqb9Fcs(fM>91~|5KKUPueUG5=V`_`LTQYLH zH86-cs?oYlPN2{VEy@B;CLJt!T;EybjUdS5xd*yv$d2nOxZ6oBzjr@fVThOPrlX5F zLnh17XS?+osl;B;`+bQwJ)0cucT*8G?OW8pLtT}$yWA5XSKkuVrb+Eu3t^P=%ipZq zvUK7clEPfNPc+);u*xz(Tx!859~rS7}f zK5~EFaFYy<&2rN$8FUMwT$`771i!-y3IHl%r}j`}w|NR0bcNf0EA^GOFL07Th|paL zh=QUM1N6N~GmZX?{{55RgMCYb2xjRkmw_a1(KpfFfGlp)Y!ErRZ$^CPOZ1ofVo7E4 z2Mn%t`Q>#K7@Q1#PlPa82sW(Xj94YA2AWZmFQ%0a-g$wJvtUGt@kH0#B*ltJDg9x z@d#I>6Z(879;0J{6XXUJ$+f{-(rcthcw@y_ak~Gih|fVD)gE}i4&y` I8}~5w58nooQ~&?~ literal 0 HcmV?d00001 diff --git a/target/classes/com/tracexd/common/Result.class b/target/classes/com/tracexd/common/Result.class new file mode 100644 index 0000000000000000000000000000000000000000..937162d01a1a837fe59ac1a9153f184027d50a99 GIT binary patch literal 2293 zcmb7E+inwA6kW%6JJZGqj)8=L!*y&2OrZse)3jWrfCGp`k$9XqBV&kdG#*z}>L>M~ zl^TIssn3Y-=`&*Ob7takz$QG*oZH@OuYG<0;h+Bi+{f)4Vu+`au#iMbA^*bp)v4_| z-B#`K_6xV^E2LK1-L}7~5Vy-)X=D_RH+!9$?>SBP^-hiZPOn>g>h=e_ehz8Gv;0k2 zu<(sSqS@PV71UY=(+cVSpxJc$eUX^4FpDF+>+r&9QE0X?G``_`?QW|sf^!y%I7+A; z$9G1h48^)wJ#Jwh3ktE`ONE*pfeM7mjj^mXz@mkdIHizuJ+J2}T(;LDAOW9AAPU)y zcB||71CP$cH#h6#d`G)K-Dr2+M}y9`>uoyQyV}=Y)7jl}ytbT!%Y^^D-B(zcz*M2w z7}5OgRj6GWueL%mtE8joSAN~~pZ9j2IG)pSeb=MG`pV|bh_6AwR&8oca5w~Av?mDB z=#4Sx6SP9;hhtQ~E;Aw8NL3svp%2E`j|A(>IHCD;%k@n;u#wiJ8NzeIUMp`Yq0Z`^7Q#84=jp=8jm=Y5Mg(;Q@^|Wr_KAOye)b00Ms)`7 z_K>U2e!GW!wX%mo^-sPVOGT0a^2lHY)1*8{((@>2t3`t&Ly9sP-j-=!Y5T*srTsUX zZxx=B>}4(`elb)vxn=Hz+@khYMBd_Qw=Wp$WLf-Ox(-lV{Sv`R=6e!w;U z4|2{AlVNPwhva-6H$LGk**(a)JchIM*#yoKZ-pOmGcXd3bKxN8%Aq)y2pL12uq*f} tsE94zn0S+W;UM?w817~^NJE>33ga!gC~~TNrlD48#t`@!zi1-2J_4BSkGKE; literal 0 HcmV?d00001 diff --git a/target/classes/com/tracexd/common/VoiceTaskManager.class b/target/classes/com/tracexd/common/VoiceTaskManager.class new file mode 100644 index 0000000000000000000000000000000000000000..140d16d646139f981a9c0c0c116abec5bda74314 GIT binary patch literal 4585 zcmb_g>30*?75_b1_F#Fig#ibV9UHKXVSp|nh)`nJ1gISrD)N9(XmRh zV0w$wrfpWFE70R}b~^9_S9$_{Q%!kfn^!Ei>F8JdbVWH?vwUB=UJrI)r-lI?4`7$T z)|O+`zaG$>W5W@9S`CmVq%s`vQBQ#4^Q2NMM(iOzH8Z)d@LXY zaXzq1zC|R)ErRF;HR;kpz!8(X`s zoTMHt&RoSguVF~wl;c(mudXbZcg>nycHBi{S>$2UW} zW;_}DsFNT9;$QD(FpLomqdE>?OrWRh*D7p$6e0$;`LQ#wxKBaAFp)|@4JZeNm5l#44tlMG$O@o637m=Nfc zOH4$8!tlt{W*s%8e5Tlq2UfKl2IM48Yj{S-8Js2RO@|d0TxVIqB9N&_e_DDT(^y~! z)o4=1ai77*Fr{Hy$Fn#ukZY4Ym!ua|X-21XU5B@Ukwl`AKI9XmY0`p158ZNru;=*9NtmAoHp=3|mWr630@4tgbipn>i(D4Fh1yau9D&!jm zu8+J5#!u<^w5lXqNTx0)sbQ`qTqduntCP8+sLMJenB?15s4rXo!er$4T}gNwL6#pW zGIwUIifyX;Ag~+-S$M;-Je*h?a|wctuDBB|S9#4T%c@cKov1!taGeqZJBrQxN&X4Q z1mkriZ#Ec0Iq3=NqUxY!%V&eyoOBCOy7f;vC9_&IT}#d5#k9X*v1;yZv4-%rE44I2 zcV)%$SUyz+7I-QNdYo(tGdIF7^h}p3$Y&X%{cHWe+igB9>H@KpwLQe@vLi6iYUK6$ zilK$O)a#!7$`)uktX~&QRp3-xAz;0KQ0_^%3hk{WSDOAxy%Z?6k-horosQRJ)HVr> zZ~8JJyMd}%n=6|`E$R;)5!l(z02gW9wZam|8m% zyN&yaMzI=4wP^J21@Z2b*IHRN1=7DWzFA_cTaVKrs?@S^Q97e-hdF zo=+gMa`PAaI`QKSyYH8DyofJn@e{^QYhU$#T#!W<8UIW%{<)4X;ftKTs%Ee0_yT8L zcq4;f;#V5p)bSR6EwHEAR#^6uvnY+JF!*SbId7JH$Gy%+1hcm}`)AU`_)rAF8PhIT zr8hL?IEz8OO{<Ti~1zvc}v(7sq^3^7|?& zrqRI>@Zjhzh|zbTUAcwszai5cX8#g0TI6>xi9u#*Y~%NKR5{b5P5e5_=r zP)cS~Dvzk1QtTABln3=tl{+|*LWoc#QuzxMqaYuM=o%vQNCdetNAH2#vH!!3S4qt6 zKZLA{l4qN`y^F!)>0J6foI3a(cIVQ!Ik<_B-p08*xR4@X#T(cWE|1;D$5+;J>6`fE z4d}-^bLm{?O_ajeSTUAQ6HM|MW5!`|h(Qg$xBKuYcOGYG?14cXPhlVFMo76I=lEW| z$hYbX7z@ogNkz}`9~@u7S3@t&Hei~KJwY?@HGDk;aTedeHz}=;uO8){G`>ZNy-5EX zhK9lHGaAe-T>UmzQ}_>-D|gMyDDN&<^F@=gXF8MlM8UTk!v4(>yBYjhF| zl(u!O&5l61+Wf9NH>r->^|ebEBXAvfK1SgSY=%h`m{f-9z7^1qk~mObV8LFmt7Fye z{(vupNlOWchDV@rD`-NXQf>UjB~aMUswbL+IqpSQD!q_b9rjN*lTdapWvXpFOcu(7l(|k?Co+|hGAbpB(^h66E?-@12zcj7FAde9w(2Us z2H&)(Smn$)J_+^P>!X*a&nsYdlF_MsC)&~4MjxWK^bF^bVGdI~#|OVy?!&_vA%K-( zZU(cA*qFhJ%qye9&N=#Sj%lFG&$5+YTVkCcwg^h?3>Fj3@B-Y%$CO@u@GN8 vF2O1Uv*<;x3XQ-#7I@k@0$MAgSbKu=KxZ&PDND{~i2k5ph{&DHs+K+hf`o&@ literal 0 HcmV?d00001 diff --git a/target/classes/com/tracexd/common/exception/GlobalExceptionHandler.class b/target/classes/com/tracexd/common/exception/GlobalExceptionHandler.class new file mode 100644 index 0000000000000000000000000000000000000000..3f4317abee076195ad3a40d039a53d1c81a98fe3 GIT binary patch literal 1940 zcmb_dOH2%XYSJ`%#*GzyU)9(8}80f11Ad_=#M|ePxb|#+jed(O(h76O}AR~@g!oh$G5*SK4Dgd`xxvl!9^Pg;iW+&w#Q6g5dtu^Cd92&M>?TY{l0lPzpzIul6S zwQ~E>gM%6l>F7ltNwJ+CL+cWkF2l*pPUohRx^TH{QBnR_$0s<#pi%eo`= zF`(fy9Y=ADp*JF#Y2jBLl0Pn_^hmUk%w$uH2IXvFS5Ff21SRpkE0!1N9!0so2BebA zsIXav!M*dCos-@YFFArzNnnWK$j0+m8?PR1to^wD*YE$n{(1B9%EliL*MI%xpPwFX zKK@N5^@V~SW-ub4_ad9Z2u^7@t>X;NG928leV&_vC+{;PNymD%FdT0VGU0IF&t-QO z640t5$+0cZyuvYTr0)4d!g0;arroVMXpz+c}~>S1a>~3Y^O9 z4Y|XGvf2H585m_S5@oT)awjB}#FPl;yz(tBc|`<5Qm)Av+j4nOm4tZbL$VxgD%qlE zmvdvJQ15ir4eW|2+P+P)kGrlHaMdt~$%Xp;EvOgrt|GYP$$Q3bT&EgL+vHNscB z(N+jJzQ~;_rO;l#g3yBDbaSPI=kL+CyNUdk55wjE4HhXwV$^gRoi#P%Ri!ENwkpcQ z(QR{B^(%(4|11zS5b8K?AU%h=?s$38Hbo8t)WBP)^)vLT7EY^HT2t?*@f__8ni21MhnVEq!3<1=`op9Rn>6tIaAt zeL_}sMD^hT_3}1!)lhrto()tGy-|Ea=woCRXS4w>)||h^IL&SJ=o0-WZiAUM!^^nR zpfTB?(Wz)0A6mo77}A5Q_Z5rH%@J`LNU3~YDF>?{_a{7L#! z5=s04{wU*}wkRQBNZe%a?#%r<=ggg-zrOzfu!iR;#1K!Q%|bgm7}5v)m^&W#E6%&! z1L10hju+CG`Xxg=n=2)dWOx;*iW43w=~wm?uZmBBI&?yJUz8({_8d3x-AF0nYiDO) z30~d|0&jk3=L2{D`|!pCmEB&~+S0SL8MI&70^U3&R*;=%eT+tPR4xsl=YF zF$`pjf2nV4!)@8n9b;H(I3g{*tC^j%nl5n96KX5+!_B~x?nw%xO`78t?qY&rj9PCA zBdaJkvt;1E;eMIY7#3O(E_b>vgYX$%Qx@)-qf41%lH4Qt61dMW?gmvyEAEO~*#O^@ z6=x+p@!dk>pCm2>Wm3AQD1EUJRd zsA-4)33XNl_o-IpCbb zB23^J!^{oGj&NKaJWOJm?zMShAn@oQ`+!yseHne*XHUVtHQX~~jT`7jmaNqbKn}CC zVzBX$ikRdth&PJPpCR$#6rDvoQAf&7C+q08)9E^T?M#0igZ3Fl$$z_!J9ZtD_E*Y{ z!StCzl5B=7-COjN9l!_%>2eHFw_(iD%3v65_Gw{A(q5i?jNluT4D<9p`Un;hx;PeS XH-^UzuVM0p)=%k8(f=qGv4qawu=Pma)Rn5Mem$#L#W^=1w|G z*>R(&Gi*3gVnrZNLmn7?q=wTicf5w7&@rK8Sneq;pQX`2+E-#QB2B$#0x{|ftDKxE z3&~p*Gu-oK{tdpv(9BjaGh~J*t<8B_{qwFU!J_)LI)=`FVXnPQb)q8KSFxhjceOT& z-zs%}zh~@_$78GX@W_ftzBl%r8*f4njEkSH{IL|8>Z=@@lwMX>xsf)f+L+A0?H)D5 zgMXz?qEhS2A^esP%!ZtmHC@HN7>}hr416uc6ERBNX6a?Lv*ooT?}2q(q|eR$a$xR* zqq9L0r<>7T+&TmMSLa=cv%1 z>Sru%em=VMd7Z3x J-hjop`vVxCKO+DD literal 0 HcmV?d00001 diff --git a/target/classes/com/tracexd/config/RestClientConfig.class b/target/classes/com/tracexd/config/RestClientConfig.class new file mode 100644 index 0000000000000000000000000000000000000000..57ff3b4688a73812d0782a9b5348dbd2c60f4e97 GIT binary patch literal 831 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 m!fd5fOz2`2E≫Db8U$d_b%gYdAi_@m#K4E7pk)%=#Z{#&~7` literal 0 HcmV?d00001 diff --git a/target/classes/com/tracexd/controller/PageController.class b/target/classes/com/tracexd/controller/PageController.class new file mode 100644 index 0000000000000000000000000000000000000000..bb6f2b29567fc01079d828ff634d1062b744822a GIT binary patch literal 1353 zcma)5TT|0O6#kYJT4=c#5Cv)h6==CFBKlIt83qSmT4cn*8GYI$YgtH>PO{?PtpoiG95CLy_`M!o$q|-?62S7e*oCU^C9%X$RblfKL!}aj>W0quJ9WC zjdd(-%`osnc}l-zFv^v~JaQP!VyJ*T3Je>5(BNS!P+sFxAe!>b4^DU}?I=+Cg4=!| z`F5m_q^FfFwDLWMQ5ANXq?6!&$YF#b@2Ifliim83jDKB=1?ND>o=5_#T>(e?Kim&ge}h<635el@47PJ`=TLtuC@%B9imD~ z)s!dqqNXK-cfxYXV%B_HxQ8N8@xEis=pz*}EY)s>US)8~y|YO@?NwBg=SEQ|@n&1_ zQYzlxf)JmKpcY}+O!ey-mtpuo3;U!lS{*UQ>QW#1&c2AdQOkgYnR**h`!(gE3Kglg z?RmaVdXdhyQe&P;i(6DpF0Op}YpE$pEABT+?NqoC)q`FbM@%5kc*MP zjwJ5m7^de|#AE_L*M{i86Bw3IPQuTkf@LDKlH6xStkPnzkIq3Sz#9D{mJbZ1uT%FO75z6tk)u9s5a9{dltcq_O~qVO~!vXyX;MSceS E0TFmbLI3~& literal 0 HcmV?d00001 diff --git a/target/classes/com/tracexd/controller/RecordController.class b/target/classes/com/tracexd/controller/RecordController.class new file mode 100644 index 0000000000000000000000000000000000000000..ed9028bab223de854f8483fc0083cd471525e5d0 GIT binary patch literal 3876 zcmc&%S$7mw5dQ9DnaR))G9VgcQ&}dHgjP0z31~-_cIX?Q}kMj84+nq^w01X_^@nL$YuDVtA)mL@z{Q1|fzXLddZ?j0DEsb^! z9q1HTd(pUJ=yk)c>E*eLX2loi9I|Z7KPu3c@0;yH23=`nHLQXru&d%Ubl){9=C!I` zactjp>UGoAr_74uR!3R_fz_@OO`Gl&t6~ZiN^w&!6zic`3p?YHFc?K+P+mWe9N(meWfMDN{(HllMQ$@jmI?fVxvHQrD+OuT@Fll z;j~dBJQwnbyc$l`tm{?ZiJ&mDY+C7gCW100aHJik6{}2Kpf>r5-)os%HSD+4&U*Ox=drQhJDyCkYP|W zQm7heB8z8nFpWbR4x>muC)qA@d#y zT$i-W;20G=>$*}H)o@%Yq^U4XSq5VQt5k?#rL!2vL>ez>DB+YqZ=9@rZa6jx=LL1* zl5#Ey==T68q}bUnxRx^Mq65!&NmL8 z)5oW#%aa1z61{M@DrtNMFKRf4^I@(dY!`v`iwscXY}%JyP1Tq2N*b?fcnz-$^u>c% zHieSYgM5*dG-}?lg&D>uurCgVDo>0#k-NJ%n1R7ot2^QNP?%ISR3#vpQh8)}X1qL^ z0n4AIhFNo5%T!A98Z4zmmE&XODQ0>u*`&*&4;vwxlf?vr%QTaD7W-z&pb)|Cl4YBd zL1WHzXNZq9k-ka_uUQ1`?aS`f8ME{HsqA`$qxZdjlWj^ z2FdL1KLHY7_SnN7<&|(1a_+c zRyqI~{DyFi<@1+b+^CJaLk%?)IrWrHqNJpDRMs;OPdNJc~UuY}?!oOTs7zPIm@ouTz00A%B-nv%BS{&6C24i^o0GUoxl5 z2QlS5@?y2ubfalS2W1aW@JO5DNj`;~JdyJ$ClAWJw}YACBEMYX+j)7+=e@gd3!>2f z3(|#wU$FW|ic+Zanxg@*iPz2O!WOLI*{ngyw$KbV9KLY@^WKDc zjNv+Kumi8-O}s^|w`sG1`k~f4)C#}7%Wn~k9#sPV-s3NY_wfPmopkmg?}83LqLD1< zA6!^g>|CLr(4LAwoE*$alvfY@gwr=MdlN5(2n^=lh{SVAu^EYL32_3hjr0%f;dL)r zv5z6|#}L7q=1EpEL>8HGwBR|XK;f2yDFsT3RulM`0JJFpH0BXXKA}XW-63Krf2vYm zqf!?5>}3cKpA!oHYvWa>eu#I;`Hn0ZAj=vuSfT_JRZJ3ODzswih+>L)OW_M;`la%h Pqrq2v|C)=0KEL@JYcfSh literal 0 HcmV?d00001 diff --git a/target/classes/com/tracexd/controller/VoiceController.class b/target/classes/com/tracexd/controller/VoiceController.class new file mode 100644 index 0000000000000000000000000000000000000000..02f5ea6721c76204198a8bb49cde59ebd205888a GIT binary patch literal 4206 zcmc&%>318|75_b1(#Y~S2}&?kx}XF?B`*v~9SD|_Hg;mLYbUOin7ZyZmd5e~Nh4-P zUP#ljl%=IDg%-L4r7Rx_n{nFHe(Z<-ADjdKLr>e^dn3z|qd4YM&(Ub+-MR1H-(BCG zfBomL{{S$Cx8ew)Lqk|c1W|!~m&|3;D4CU_aem>FmG=dr!*<2?PYHCSGqatDp;JR# zM;CN~yYf!i@Le-+trm>DQ}JD=RI*%S*0J-}Xk#s~e_2wdT_}tR;&f1Tr2r@)pUJhYV&E#E)n&fqUB55tcrhOtxCdybY^nP zZ#iGe%Es_HfljklupMK?T$a!e>i9gqKu4CGqCjF&X)Y}eUNR<~A}!#aF9{4P=cQch zk(%ZCsYTZ*r)u=gQ0nrP{?sBNq&)jkD_EB8vU=)53Wqct)^Ue4>YjE+c~-vW+Wr~? ztRL3!Vh2h(7yg=BlEII<|^!3i1Zz2VGna#|`>C)pm z?!|oqw-EhBI%&KxMt@1$1kR)b4{wX@PHxDyft|qpI);!Hh*8PNns0f;n$FCR#Bma* zG<;RZ*Km5%AvNDF85b{(pAm?=W~JbigGFL9Ng51Uxqnp085yyd?*xexXH`C+;Xxha zm=GBFOcf%aSA!Z;NhEMCJwMXqyLxUmQB-W|Rx4zzVy219)G$V!a#WG=u~=eYMI=6X=WicB|MI7=zW?d#FMRyQyPtgUrnK~u z6uaGuy11RJkl9eyQ30#AJ5Q*-b+&B#jI_XP8)%uf^(cF-Z2inMqr99q%9g+66b!Rc zaeURAjGVVAmw|Z%t_DwskD9=3+q=k^nfD!cjh&aZ8gx~j3(Z(YOQz?s&bRMmeLs|L z3E9ohqZalXfpJlXK;A6PnyxL^bz<0Gve{!=(cJiS zCGve!%4yT4Ji+LH?tZL&_uJuQ%eD>AP1@xRD}$(l)9;Mwn=F(05ozt#nNiO#7W1O& zEz;ht0^YF;2?)CG)_}dWeyBB~%0=L4TXS}@pK&tP$#Jah)*U?|&?O_(m<^h`R<@#i>E&w;*OI%Bx^6m9O#`DUJjP*v^L@B)=>cQxaYvx^l| zHgbWF{?F+#++-hd*OzMWyuOjuDW|g1*5pi$V@uhZwLP0PbGp$dnDocn22RF&!LGFQ zlxfHFskbUeHRg;OU3dx`_2X0EaI2a|X|?FPch~x6f^klXp+epB*)PkRhsfZr$`?qIIa!+ z6WYMrh$LD*i-8O~k9-5u!dU&r83gs)Br z3`I9EypE9}t@i_H$!Id1jI87AP>jp&q?U}W$>=rYJCG=D zz`ja=BXr9OzDHZ7<;RrU`U!Oa`#FYWag-c`n80z&;69i*ff7gL6~0-+FrMOED?PJ_ zIC%!}L;MI)avtIJ7^Rr#!Q*&>0a~M1pTv*(mM&;`@Ht9&nkXdg89Yl5YUKF|_jXYK zDt^kRFcFON{m0m>X>|M>do}#>G_U`1!ij2#X-H^Dk)VDV2#r?O zr z0g*|nzn^!hJ`!h&Y*#(eq&m`29Z@cBsFn_h;Wb7?D2ay@Y8sS?ZJ_!-lCmI#N{hgt ZgH-ru(n5G$VNUSrFI>Mtt^oI&{{yf_u2TR2 literal 0 HcmV?d00001 diff --git a/target/classes/com/tracexd/enums/DictTypeEnum.class b/target/classes/com/tracexd/enums/DictTypeEnum.class new file mode 100644 index 0000000000000000000000000000000000000000..ff55b66dc51d598df355d19966a4e42ebf644d2d GIT binary patch literal 1456 zcmah|?N8HS5dS^fx^<(#DDQ~Ko4O5Q@}}YtK^RCf8DY3c{8UOEC8Z@@N93D-l7b4+ zX!z_OWxVUA4k6N{z25WO{qF8}cRzl9`3_(iD-i?)`gCVM?YWw6yxmC~c4fbuUNUuW z^XS0Hk`{$PNP&c~KzKd7QOK_e^ymKXlwmJfL6p7ZTz+w3b2Y!lhYbo8|B#NdEBTEr zK5SCZjJQB#xVVsenJowmyuL0%3@Tb9h%0DAyMUxyj%^6EC6c*4?NCcwnq5lgxAzR) z%f!%$t_Zpn^xy`C`)j}zQrtt$su=k<0@H~)??p>1mos$-1rv1Niti74+d2 zaWre%rZ*?hQ4dw~Tum0a-T?)J7$RPEXNPiDFNcsJ$+$yk2ZmdA>=-#EI6#u*Rk)WC zl0_L&8TW{P%h5H@bZi-lj5HmPYLp!Jh+)SSOkk3^_em%V3?-7+vQL@)HV-ZOMKtG3 z+gPjYZyWBWwrx>aQ&%LKysoXx2Bm8iHP>XA8dk{G_6ain!ti#TopsG6)gx+%LvPn4 z5gX>w9j=-+Ru#wHF>TEfh!)I}t$7ufAlk3Wsz~*h46joVmik2-45J|3B7}4G)Hd$PbrUiEYO#$O_Sv8rPN3C|C@N1AEBDK zRE-di@v#4K=3If!@HdF9;4y-QtK3!4jBrkU}Mu~<%t%jtNZCWY%2Y zjn)~4dZoI|?OZhhMWcqt6G$eY^Xpw5_b|hI7iBaVrn0&JbWeHyfaT4gPK^%~UEg`x zYV0}Tj{|^IH2xk1L;8gi9R&4PR!Er038{QJ zI&jHo8NNZ84mZ_tg0SxTmdB8+xcj~pwL;RBvbid)$(rqTN4MCMh!1$Jf7R=GN>&M4 zq3vwByz_zcrCs3vdSi*kJWP8oZ;bH$1<2A)3QL;^q(}Mw5kjGO7Bhs;kvC12KUy29 zFSvFF;}dxdvvkJAw>aTPF^8DIuaM;o&0w>q7&-&v_}B&feTwKE6y~u&o=LC5F#nN5 zX^9{Su_dw+eNt!V#!fKynXdm*QnARp5K74ymZ+0udLIbNN?PL!Mk#qqCS*E+;rMs3 zn$(6=smX1qm73C~De`(R_LsmaR=VVJm%Q+exW;Yi1XIV5gflG*M-|Q;ML60iGRH{q c$~&5d;3tuy3Gj)}P}Q++nGf-Za4|go4GYildH?_b literal 0 HcmV?d00001 diff --git a/target/classes/com/tracexd/mapper/DictTagMapper.class b/target/classes/com/tracexd/mapper/DictTagMapper.class new file mode 100644 index 0000000000000000000000000000000000000000..2e6cac3e2e87657f11264d66703cb8aa4427c05b GIT binary patch literal 307 zcmb7=O$x$5429qLSARC*2|R&wfQkzdSBeY0KspU&O4}*Zsp!>QcmNM2jui#nxky3? z`SMOZOIySY;&k;FYm04Z+f#o-CNfp0P0)xFy3Uak&fn@Uw4L5%R=gq=Ly@@%KTsZB{ pZx7)j6d3MJZ56L|=Fd*P+|8aEycL1AkFI|V&_dAUJ_b!4J^(xuURD4A literal 0 HcmV?d00001 diff --git a/target/classes/com/tracexd/mapper/RecordMapper.class b/target/classes/com/tracexd/mapper/RecordMapper.class new file mode 100644 index 0000000000000000000000000000000000000000..f6d294c2e55fc03b7ba18395a2727f6da785e30f GIT binary patch literal 304 zcmb7=Ne;p=3`KvK%CLbGa07CHA{H!Ifso(?ZfdHawyDw-!PQuB01kx+We{S=!nQ2S z&;R>+J6`}SFbL2P7%P)WXG!rfmKhZVTe)FnY`m(Q04;&xo(?2a$`iSc_N-ihj(~iu zMr1M_n@VPGcpKw*zYJKWMANqg#(5~(?GcgH-bTwI-v(IhczHjfzAOF1k6~HR03OX1T3szan zbE~WuEl(>~^W4>)is3n0!LkKC%%bkX`-UL0TG8 zRh&VLp+oF5+?>kp@&m3J+$?GL^1GtorcbVUcpnXW-tb#!mLl|aA z%KNU(3*xY-mHkv`xvKNf5%!utW9W5+K~CK>1;gspe*}KgV7jI2=Z~AVio(!@>FRE^ z=0Fs0;i7^O6_+r|Fjh~KZXQ^BLdywT=Z5}+C^B@z!Btsvmm#HyHvD7f7B86#UjM(?M z;V=xf05kPi2J)_otI|@lhj(?eD0ej#*JX?s$v}-N+{l=&u(t`DWrI6T1n)Dlrz#euc9pbCG{f-E%e~K3tjN9La4&GJ!PKaNI}GD>Kr@CRO59kqOJ11>wsKey z6`?VeJ^UA&pX-3hpsbhiTV;!n#`G zj;Iw?Y@3i@s@BNFaHBCjHSK<}y{XO?C6cDD6>zjatD9ooE9Zs1!Se>OHj%Xo+}Pw4 z4$Z^GE_X*Ko{l$bZc+E7IpT#>m%8ft44oq;1-ZY^Z7K(1D(O8tQBR-kXL2qt>`{)xXnWuAf}zx)q1I;qCv0=gS!;#I0_825vpl;X zR&^hRrfzyorjatYWLd65z*d43I&m!YcVjz>b112p#AqD4&xxk?+{$2MZwtffq*qqA ze4xJvaV?u(a4~MUO$$G^KrnFq4mXR2a3->rwdYkD z-&`S28qyvb3@&a|Dxg8C)HI_0o~#`}0c;}+PRuK0-fcbpD>DabPBKF%cB#RFIg$(8ITUzbFci{e*M}fvT-7~1q79p^MUF^Z3 NRrzPh#Q_d+;a@fh-G2Z8 literal 0 HcmV?d00001 diff --git a/target/classes/com/tracexd/model/dto/RecordQueryDTO.class b/target/classes/com/tracexd/model/dto/RecordQueryDTO.class new file mode 100644 index 0000000000000000000000000000000000000000..fae4f95fb9d537be15014b364a8e6debd454ae84 GIT binary patch literal 2179 zcma)+TTc@~6vxldLTy=Wfl}@l5uq*0dcOdo0+NtaK}&dF+DTc`cFA^Y#Lwh|CK3}L z`~ZF^JyYYu|8R5)v8y_ zy`vLZ@&xs*+jZO95ERMg4&!u#;xS4X)K7+>g_2V3K|?ewD0V8{hEs2VqM$IEo?SHycEela zun~hY92T!SCCjrB$lfu7#@U;IPgWe)mdZV8&=gH0xZzo@w~aMHBU;t7Ytk%0qsne2 zJ!{Y$N5^EntYhOvyHdBjri;9V0L{9#RgsFGYu77l8*4bv7S1myS+MK!eY18X-2>~W z3eS+*?9g&;wlADf@7Tsk7YqMWL8vDx(%Wy6YY<&9^?>`3P3Hqv;kpwg(R{h7mna0v^KudHm4a9X8s!!$v==SahnI@c`9~$AmeF zSiE42w_$BUPhd{vf0D>Y&ncEqrO#>LyUJL=c#|R+;}oS7#zDFR%g{NrNK3E;Whn<8 z)-z$TUT^*frM}@$53vYuN5H&H?!8FX$I4@UneJjM7AYW$58szxKBp9;M0_e~rIOJR z7b?7iF4H|kYdrSMLw5z9UOX;LdNXFcA4;4K5|3O<{2-h-9VE_lA=Ve^C(ihZGabYa zLy1R&#G}^|KME%v4HA!aA=a(tCm#0`k9QD1rYER$uq!5l#N#2vf}YYd+%PAv`nzG` zvN3f}O>`mUN6^0eDaZ(V9?CNlNXR%tDyKC!P@^uLMBmq37asmNwRw_?=d~)t Fn}0k`J1PJG literal 0 HcmV?d00001 diff --git a/target/classes/com/tracexd/model/dto/VoiceProcessResult.class b/target/classes/com/tracexd/model/dto/VoiceProcessResult.class new file mode 100644 index 0000000000000000000000000000000000000000..e41a9dc2fb4d26c9541d6e8c8080c4130a254d8b GIT binary patch literal 2275 zcmbW2Sx?(Q5XWZ;BqTKrXTlk-9tpI#_XVY;P%5g>QiAfpn{igb$ce#rD)>%)XeCgk zKJ)|hLsk9n+Qh+e`hX(sF*~#K+c}&+e}DZZqD^|AqArRhs9T{PiZkjz(!Oe{snx6M z=Yu1zyNu#1M%{2%8O8F2a*}!}nV^(HH%MWW*R7iB+M3Q!D{9TEa8s?gmRhz9o$uI| z&K+l$I}KA@W7J(<$0Ap3HRAO~%~7}H+1}YPUlty2DwL*vMhVTa_xLG{28#h$$+eAo zRVofDG$a&zY<_H>3DXgUGD4EHxo+8&J>ytNM->{QaY#=Z+&~;?g;4EB;=KoRv56LQb zy-+in$rrAewj~1UPM|)U|G##jjEHV?_t2{BXtq}4F1LY~g2%PXBo4!6TNwReSfJ)sh?;@iaZInIQy; zxtdIryr0mIVfE{R2rqFwy>wz?0VcUf8cyl5hSABWViEVIs5`$e>{2DGVe5R;5OtSr z@8czrKbl2nbm9Avz=-bvR$ZcD<&1umGrCaD=sRLGC)e}PLwm_J+6r?TXZY}7yoH^L znPKi(_(|-CRJ)B)91|Sf!Kio&beHnjF)Gjk#;eBXl=zOrE((lCB8?a69<+q!Q<8R3*7h;^%IkIRK#V?I?4*JSW6Y=I&gVCvJ7pnyyN({nh!|F zaNs#xf$()?1Si78(-FjsR-+?05su(Y2U5|!%?M7(2)?1W5QQr~_YH@w9XK1wvqtay b@CO|@aY4B-&s+x{@fB(E%t)Sf>3HKGB%gj` literal 0 HcmV?d00001 diff --git a/target/classes/com/tracexd/model/entity/DictTag.class b/target/classes/com/tracexd/model/entity/DictTag.class new file mode 100644 index 0000000000000000000000000000000000000000..f8eb03dcf31842abdd0df73d6ef4ef4bdf30a23f GIT binary patch literal 1729 zcma)*Sx?(Q5XWajLI{{b!&R;lphv>x-Un2b5C|z!3RMYttv2y0EQ)R9Y*6`Dt<McN>o*Y{(DpE;Xdp{zi!wCGX#9*{aJ$95rhQaD z6Ai^^@SXIede3N}SgPe{h;msPwrGSbMump&+A81;@x`%S-w`cacuJ~EdtWwGl{Xos zq=T@P>$nx)YwqYccPtvyK?XZ*5tJQ$bl0LhO)yHU%X7gf-{W?y0vS0@Su|~|JnjnZ zcF&?&nq!n}1cEE!>;ii>^i|RocExY-);=^<>~^60)B&X{YO*csEwSr)zT!&yUYpTo zMc=8;eOEeu$96C4(6rB6owm)pc6OD+uk0Y!#;xqjP8BzTd3yJxdIYhDVlf)4NKYJg z+`0%%M15t=TH}G#8KT3qI+Z|MF{%DnZY0Pwg({=u`C_T3dZy@5wnODaF|I4s(4`MT zo%+s49-yvD1W1`fv=h@F{KNU`KZ|pHBSw=q@m1PyT@TgYfd{--s&LG zkb^n@tay`_F^4I*y?=0;+Wjl}#yj=&V}5bF|l zHY9`0toElFDB>A2 zJnOWPP@nNQ&;3N6P1;JT&v=|?sSl6td6y?|c^P=&t#luxet$?y)MtR y;dx5W66!M(=UGYQc}_2q>N6APS?$B4-$0jV7Cb3>Y1UWfE$PSc8sD2Xz5NH&lO!Pk literal 0 HcmV?d00001 diff --git a/target/classes/com/tracexd/model/entity/Record.class b/target/classes/com/tracexd/model/entity/Record.class new file mode 100644 index 0000000000000000000000000000000000000000..47be2d5b581b8e6859a76d9acca487e2e29b6781 GIT binary patch literal 2612 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 literal 0 HcmV?d00001 diff --git a/target/classes/com/tracexd/service/ai/AiService.class b/target/classes/com/tracexd/service/ai/AiService.class new file mode 100644 index 0000000000000000000000000000000000000000..d1d88ba20a3f8b430b94ea43f0a5fda7e38fabf1 GIT binary patch literal 8325 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 mnPtPJ{=a3F*x$ zt`aC6;@&Cgm6;l@!qozLsKfc3?-EdlOwTj=O;5#affCnAnJVV8m!aQO%o9+Oj_uP) zDy|{fA4!v;PN2fF(;0uek?FM@6$?4lYxsuF@HJ>?L|kC{kTGbsId;G^{DGb5w@pVuWv|`Ps?5*w@@lCJ3ddM0I#^qR# z4GK1DxCNa8R|F0Xl6)IWO~Gv%-iP-K)LnA1;ofOSX2x<>kxO1x(`nwGVZmy3 zdPg?9R#)0g20{3M216DDrH6%TvzyW(kd&vjS73etdNBXuqmk9d#JUMPNyu^WLA#& z4$rZrihDJD2p?v$^)O=uHbet5UNA4)bv$8%_^5`D;p41RuE`6`95w|KZ!xF6G>e@X z1hWEn;7$dflzQ(ISn^hMn-C)~FKTI9%J97AXwv6wS8=zz2L~MD2v644Piy!LKFcaB z??%J2J%(CfYE;;m+qNpWSD-P9NZ22u^UYmJGbrHk){JM_yoXngQB-`MD2DZ~`rK1@ zp4s>0nL~%q9eMoUFYG`2;A7`b-GAnhgRdRG@9e5Gzj;9@Ov< z9_DEyEV$cE z%Tl@XO7FN|4^emyfv9+bH=?wez$}yUWx1E7`D?N+e_i03sCRSr<*QxSU5+R5O$Fc5 z@NGOr6cVIHq@1rZlD^~8mKfa;UOpGeg9}$S3siMxY@c^ex8+$qDYM149X~iqL^X>F z7U&++u)TO+xM|!NUl8w>*AhjR2KN&ct=W@%u^r7Eb9f{Q;+UqalH{&w5PXyJphqw|T1z)Dp->0y&nt`6Mn2(7*};O+uV)trEU6 z7_zqUEK0X5S=1r{DM#+a6)4S`Kw1)!uo#C)M&%+?0lcCwd~+8M%CvSTYB@K_S-&{4 zgwmGgYZ{^CQhgcsTpd{_x5_OH-UXK~M@pL1Nd=8a&IT<%;uCiqC zDkmO1jnV^jcEP;x7!}iz*gl?nAIY$_I*#u#C(~j4h%5xvD0Vu63!|%%Rd;CGcD-vS-k?Asl&MbS_8RTZcTPA!XjGxPgq6a<47;3P_ zuzORcSJUn|gPC*`)#ulP^A^esDZpM3WaKF+F=?0O%d@JjwQbW4?g^7wtc*YM^nApn z;BS|Mk0OwTe$9zJk60PmOJ0Uli?7r1yHUZbtY>*v6!M^gvjVgJJ1dV$=x)p=yeZ=Q zu9PoIVtMv-`P^n(Bry-MRRSS;bo%$@jTA!oW==1ej{w%0(IEH#)6xWVo$tZ3NzxpzL zx!xKOS0qZF!D@Zo!jq%usL!IS1eBv>u|>$v_G9P)icg>@3$qyC!Js}=astklVou)P zm4zP?cZEcK_c*DlB#RFg(X@{+7n-v8L=jgvB}%JGPouJ`RKF{WPZeQ5CLPB;TlCKz z#eJtj>K7zqB2iXVb{dna%Cgum@NkapV8B*ZoW)~-IQ=VG1pG}2rApCjaw8|9N~0dH zQnUDKF{)G<-4c2Mv}Ojs4a|o)=3y~vaXn9X6Yu*3ZX&If-%i|&0W8N}wBTM+_M;7t zVg;VSO6JLGyofdUG1lP~wBsB)@E>dxG29}i^Bp%AT|qc+3!^g@PB9;+XqJ!>S_&zm!nsECE?3Ge>2kypc{sk#UoP;A#v>^Zh literal 0 HcmV?d00001 diff --git a/target/classes/com/tracexd/service/record/DictTagService.class b/target/classes/com/tracexd/service/record/DictTagService.class new file mode 100644 index 0000000000000000000000000000000000000000..894cc7b89697430927bf21188dcad3be5769b029 GIT binary patch literal 5053 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 T0$#u$$eW;?KjP2$D;oa`*Gaay literal 0 HcmV?d00001 diff --git a/target/classes/com/tracexd/service/record/RecordService.class b/target/classes/com/tracexd/service/record/RecordService.class new file mode 100644 index 0000000000000000000000000000000000000000..2d0a82b9d019ae4160fc4cceda85e148dd88e504 GIT binary patch literal 8775 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 V&Jc^mGSNXfvIgiB>qR%F{u}L{G$H^1 literal 0 HcmV?d00001 diff --git a/target/classes/com/tracexd/service/sql/SqlValidator.class b/target/classes/com/tracexd/service/sql/SqlValidator.class new file mode 100644 index 0000000000000000000000000000000000000000..9c9e74efc117f0153d07e240f1ba52ad324d4962 GIT binary patch literal 3170 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 literal 0 HcmV?d00001 diff --git a/target/classes/com/tracexd/service/voice/VoiceProcessService.class b/target/classes/com/tracexd/service/voice/VoiceProcessService.class new file mode 100644 index 0000000000000000000000000000000000000000..46ea407ac46a0f65e05215a260af0891affd1c7d GIT binary patch literal 11822 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 literal 0 HcmV?d00001 diff --git a/target/classes/static/js/app.js b/target/classes/static/js/app.js new file mode 100644 index 0000000..4ff57bd --- /dev/null +++ b/target/classes/static/js/app.js @@ -0,0 +1,63 @@ +/** + * TraceXD 前端通用工具函数 + */ +(function(global) { + + /** + * 格式化时间显示 + * 当天 → HH:mm + * 当年非当天 → M-d HH:mm + * 非当年 → yy-M-d HH + * + * @param {string} isoString ISO 日期时间字符串 + * @returns {string} 格式化后的时间文本 + */ + global.formatTime = function(isoString) { + if (!isoString) return ''; + var d = new Date(isoString); + var pad = function(n) { return String(n).padStart(2, '0'); }; + return (d.getMonth() + 1) + '-' + d.getDate() + ' ' + + pad(d.getHours()) + ':' + pad(d.getMinutes()); + }; + + + /** + * ??????? badge CSS ?? + * ?????????????????????????? + */ + global.badgeClass = function(category) { + if (!category) return 'badge-default'; + var fixed = { + '餐饮': 'badge-c1', + '饮食': 'badge-c1', + '交通': 'badge-c2', + '出行': 'badge-c2', + '购物': 'badge-c3', + '娱乐': 'badge-c4', + '医疗': 'badge-c5', + '健康': 'badge-c5', + '教育': 'badge-c6', + '学习': 'badge-c6', + '养老': 'badge-c7', + '社交': 'badge-c8', + '旅游': 'badge-c9', + '居家': 'badge-c10' + }; + if (fixed[category]) return fixed[category]; + // hash-based fallback + var hash = 0; + for (var i = 0; i < category.length; i++) { + hash = ((hash << 5) - hash) + category.charCodeAt(i); + hash |= 0; + } + var idx = (Math.abs(hash) % 12) + 1; + return 'badge-c' + idx; + }; + + global.logout = function() { + fetch('/logout', { method: 'POST' }).then(function() { + window.location.href = '/login?logout'; + }); + }; + +})(window); \ No newline at end of file diff --git a/target/classes/templates/browse.html b/target/classes/templates/browse.html new file mode 100644 index 0000000..8597073 --- /dev/null +++ b/target/classes/templates/browse.html @@ -0,0 +1,271 @@ + + + + + + + TraceXD - 浏览记录 + + + +
+
+ 首页 + 浏览记录 + 退出 +
+ +
+ +
+
+ +
+
+
+ +
+
+
+ +
+
+
+ +
+ + ~ + +
+
+
+ + +
+
+ + + + + + + + +
+ + + + + + + + + + + + + + +
时间人物地点事项内容金额分类
请点击"查询"查看记录
+
+ + + +
+
+ + + + + diff --git a/target/classes/templates/index.html b/target/classes/templates/index.html new file mode 100644 index 0000000..6e23be2 --- /dev/null +++ b/target/classes/templates/index.html @@ -0,0 +1,329 @@ + + + + + + + TraceXD - 首页 + + + +
+
+ TraceXD + +
+ +
+ +
+ + + + + +
+

最近事项

+
+

暂无事项记录,点击右下角麦克风开始录入

+
+
+
+ + + +
+ + + + + diff --git a/target/classes/templates/login.html b/target/classes/templates/login.html new file mode 100644 index 0000000..049b6d1 --- /dev/null +++ b/target/classes/templates/login.html @@ -0,0 +1,38 @@ + + + + + + + 登录 - TraceXD + + + + + + diff --git a/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst b/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst new file mode 100644 index 0000000..3036b9a --- /dev/null +++ b/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst @@ -0,0 +1,30 @@ +com\tracexd\model\dto\VoiceProcessResult.class +com\tracexd\common\Result.class +com\tracexd\mapper\SysUserMapper.class +com\tracexd\mapper\DictTagMapper.class +com\tracexd\service\ai\AiService$IntentResult.class +com\tracexd\config\MybatisPlusConfig.class +com\tracexd\enums\IntentType.class +com\tracexd\common\exception\GlobalExceptionHandler.class +com\tracexd\model\entity\SysUser.class +com\tracexd\service\ai\AiService.class +com\tracexd\controller\RecordController.class +com\tracexd\common\exception\BusinessException.class +com\tracexd\common\VoiceTaskManager.class +com\tracexd\TracexdApplication.class +com\tracexd\service\record\RecordService.class +com\tracexd\model\dto\RecordQueryDTO.class +com\tracexd\config\AsyncConfig.class +com\tracexd\controller\PageController.class +com\tracexd\config\SecurityConfig.class +com\tracexd\service\record\DictTagService.class +com\tracexd\service\voice\VoiceProcessService.class +com\tracexd\service\voice\VoiceProcessService$1.class +com\tracexd\service\asr\AsrService.class +com\tracexd\model\entity\Record.class +com\tracexd\service\sql\SqlValidator.class +com\tracexd\config\RestClientConfig.class +com\tracexd\controller\VoiceController.class +com\tracexd\model\entity\DictTag.class +com\tracexd\mapper\RecordMapper.class +com\tracexd\enums\DictTypeEnum.class diff --git a/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst b/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst new file mode 100644 index 0000000..3138862 --- /dev/null +++ b/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst @@ -0,0 +1,28 @@ +C:\Work\tracexd\src\main\java\com\tracexd\common\exception\BusinessException.java +C:\Work\tracexd\src\main\java\com\tracexd\common\exception\GlobalExceptionHandler.java +C:\Work\tracexd\src\main\java\com\tracexd\common\Result.java +C:\Work\tracexd\src\main\java\com\tracexd\common\VoiceTaskManager.java +C:\Work\tracexd\src\main\java\com\tracexd\config\AsyncConfig.java +C:\Work\tracexd\src\main\java\com\tracexd\config\MybatisPlusConfig.java +C:\Work\tracexd\src\main\java\com\tracexd\config\RestClientConfig.java +C:\Work\tracexd\src\main\java\com\tracexd\config\SecurityConfig.java +C:\Work\tracexd\src\main\java\com\tracexd\controller\PageController.java +C:\Work\tracexd\src\main\java\com\tracexd\controller\RecordController.java +C:\Work\tracexd\src\main\java\com\tracexd\controller\VoiceController.java +C:\Work\tracexd\src\main\java\com\tracexd\enums\DictTypeEnum.java +C:\Work\tracexd\src\main\java\com\tracexd\enums\IntentType.java +C:\Work\tracexd\src\main\java\com\tracexd\mapper\DictTagMapper.java +C:\Work\tracexd\src\main\java\com\tracexd\mapper\RecordMapper.java +C:\Work\tracexd\src\main\java\com\tracexd\mapper\SysUserMapper.java +C:\Work\tracexd\src\main\java\com\tracexd\model\dto\RecordQueryDTO.java +C:\Work\tracexd\src\main\java\com\tracexd\model\dto\VoiceProcessResult.java +C:\Work\tracexd\src\main\java\com\tracexd\model\entity\DictTag.java +C:\Work\tracexd\src\main\java\com\tracexd\model\entity\Record.java +C:\Work\tracexd\src\main\java\com\tracexd\model\entity\SysUser.java +C:\Work\tracexd\src\main\java\com\tracexd\service\ai\AiService.java +C:\Work\tracexd\src\main\java\com\tracexd\service\asr\AsrService.java +C:\Work\tracexd\src\main\java\com\tracexd\service\record\DictTagService.java +C:\Work\tracexd\src\main\java\com\tracexd\service\record\RecordService.java +C:\Work\tracexd\src\main\java\com\tracexd\service\sql\SqlValidator.java +C:\Work\tracexd\src\main\java\com\tracexd\service\voice\VoiceProcessService.java +C:\Work\tracexd\src\main\java\com\tracexd\TracexdApplication.java diff --git a/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/createdFiles.lst b/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/createdFiles.lst new file mode 100644 index 0000000..4c1c112 --- /dev/null +++ b/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/createdFiles.lst @@ -0,0 +1 @@ +com\tracexd\TracexdApplicationTests.class diff --git a/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst b/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst new file mode 100644 index 0000000..6d3cab7 --- /dev/null +++ b/target/maven-status/maven-compiler-plugin/testCompile/default-testCompile/inputFiles.lst @@ -0,0 +1 @@ +C:\Work\tracexd\src\test\java\com\tracexd\TracexdApplicationTests.java diff --git a/target/test-classes/com/tracexd/TracexdApplicationTests.class b/target/test-classes/com/tracexd/TracexdApplicationTests.class new file mode 100644 index 0000000000000000000000000000000000000000..f4b4fd3841ff7bae7e84c393f062900ff5561144 GIT binary patch literal 530 zcma)2O-lnY5PfNDt82BjdJ%dMMDPR5&5I&bp{GT`mfq8Ctf{-nlFe%WmM6i3KfoU) zPSOg32?I8FyABaz5e1MeOBysuJOp(L-6df}wV8CX%5QD=lxzY%J|ij8kGdu}MTa z5?1+qN!HwhBGEzo5ASn^W@5CHa~B&iA=&O-sh!H?NEM1ads-V8W}#X)Hg?KqC4GW0 zS58_ka>f0a