官方测试
This commit is contained in:
parent
5224cfb1a7
commit
bcf8893b00
127
server.log
127
server.log
|
@ -0,0 +1,127 @@
|
||||||
|
2025-04-21 17:06:00 [main] INFO com.yang.test.TestApplication - Starting TestApplication using Java 17.0.13 with PID 21100 (D:\project\Mbti\test\target\classes started by DENG in D:\project\Mbti\test)
|
||||||
|
2025-04-21 17:06:00 [main] DEBUG com.yang.test.TestApplication - Running with Spring Boot v3.4.4, Spring v6.2.5
|
||||||
|
2025-04-21 17:06:00 [main] INFO com.yang.test.TestApplication - No active profile set, falling back to 1 default profile: "default"
|
||||||
|
2025-04-21 17:06:01 [main] INFO o.s.b.w.e.tomcat.TomcatWebServer - Tomcat initialized with port 8080 (http)
|
||||||
|
2025-04-21 17:06:01 [main] INFO o.a.catalina.core.StandardService - Starting service [Tomcat]
|
||||||
|
2025-04-21 17:06:01 [main] INFO o.a.catalina.core.StandardEngine - Starting Servlet engine: [Apache Tomcat/10.1.39]
|
||||||
|
2025-04-21 17:06:01 [main] INFO o.a.c.c.C.[Tomcat].[localhost].[/] - Initializing Spring embedded WebApplicationContext
|
||||||
|
2025-04-21 17:06:01 [main] INFO o.s.b.w.s.c.ServletWebServerApplicationContext - Root WebApplicationContext: initialization completed in 1111 ms
|
||||||
|
2025-04-21 17:06:01 [main] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Starting...
|
||||||
|
2025-04-21 17:06:06 [main] INFO com.zaxxer.hikari.pool.HikariPool - HikariPool-1 - Added connection com.mysql.cj.jdbc.ConnectionImpl@64518270
|
||||||
|
2025-04-21 17:06:06 [main] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Start completed.
|
||||||
|
2025-04-21 17:06:07 [main] INFO o.s.b.w.e.tomcat.TomcatWebServer - Tomcat started on port 8080 (http) with context path '/'
|
||||||
|
2025-04-21 17:06:07 [main] INFO com.yang.test.TestApplication - Started TestApplication in 7.638 seconds (process running for 8.243)
|
||||||
|
2025-04-21 17:06:07 [main] INFO com.yang.test.TestApplication - MBTI测试系统启动成功! 服务运行在端口: 8080
|
||||||
|
2025-04-21 17:06:46 [http-nio-8080-exec-3] INFO o.a.c.c.C.[Tomcat].[localhost].[/] - Initializing Spring DispatcherServlet 'dispatcherServlet'
|
||||||
|
2025-04-21 17:06:46 [http-nio-8080-exec-3] INFO o.s.web.servlet.DispatcherServlet - Initializing Servlet 'dispatcherServlet'
|
||||||
|
2025-04-21 17:06:46 [http-nio-8080-exec-3] INFO o.s.web.servlet.DispatcherServlet - Completed initialization in 1 ms
|
||||||
|
2025-04-21 17:06:46 [http-nio-8080-exec-3] INFO c.y.test.controller.MbtiController - 开始获取题目, 测试ID: 1
|
||||||
|
2025-04-21 17:06:46 [http-nio-8080-exec-3] DEBUG c.y.t.mapper.MbtiMapper.getTestById - ==> Preparing: SELECT id, name FROM test WHERE id = ?
|
||||||
|
2025-04-21 17:06:46 [http-nio-8080-exec-3] DEBUG c.y.t.mapper.MbtiMapper.getTestById - ==> Parameters: 1(String)
|
||||||
|
2025-04-21 17:06:46 [http-nio-8080-exec-3] DEBUG c.y.t.mapper.MbtiMapper.getTestById - <== Total: 1
|
||||||
|
2025-04-21 17:06:46 [http-nio-8080-exec-3] DEBUG c.y.t.m.M.getQuestionsByTestId - ==> Preparing: SELECT id, name, type, ? as testId FROM question WHERE test_id = ? ORDER BY id
|
||||||
|
2025-04-21 17:06:46 [http-nio-8080-exec-3] DEBUG c.y.t.m.M.getQuestionsByTestId - ==> Parameters: 1(String), 1(String)
|
||||||
|
2025-04-21 17:06:46 [http-nio-8080-exec-3] DEBUG c.y.t.m.M.getQuestionsByTestId - <== Total: 93
|
||||||
|
2025-04-21 17:06:46 [http-nio-8080-exec-3] DEBUG c.y.t.m.M.getOptionsByQuestionIds - ==> Preparing: SELECT id, code, name, question_id as questionId, character_type as characterType FROM option_table WHERE question_id IN ( ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? ) ORDER BY question_id, id
|
||||||
|
2025-04-21 17:06:46 [http-nio-8080-exec-3] DEBUG c.y.t.m.M.getOptionsByQuestionIds - ==> Parameters: 1(Integer), 2(Integer), 3(Integer), 4(Integer), 5(Integer), 6(Integer), 7(Integer), 8(Integer), 9(Integer), 10(Integer), 11(Integer), 12(Integer), 13(Integer), 14(Integer), 15(Integer), 16(Integer), 17(Integer), 18(Integer), 19(Integer), 20(Integer), 21(Integer), 22(Integer), 23(Integer), 24(Integer), 25(Integer), 26(Integer), 27(Integer), 28(Integer), 29(Integer), 30(Integer), 31(Integer), 32(Integer), 33(Integer), 34(Integer), 35(Integer), 36(Integer), 37(Integer), 38(Integer), 39(Integer), 40(Integer), 41(Integer), 42(Integer), 43(Integer), 44(Integer), 45(Integer), 46(Integer), 47(Integer), 48(Integer), 49(Integer), 50(Integer), 51(Integer), 52(Integer), 53(Integer), 54(Integer), 55(Integer), 56(Integer), 57(Integer), 58(Integer), 59(Integer), 60(Integer), 61(Integer), 62(Integer), 63(Integer), 64(Integer), 65(Integer), 66(Integer), 67(Integer), 68(Integer), 69(Integer), 70(Integer), 71(Integer), 72(Integer), 73(Integer), 74(Integer), 75(Integer), 76(Integer), 77(Integer), 78(Integer), 79(Integer), 80(Integer), 81(Integer), 82(Integer), 83(Integer), 84(Integer), 85(Integer), 86(Integer), 87(Integer), 88(Integer), 89(Integer), 90(Integer), 91(Integer), 92(Integer), 93(Integer)
|
||||||
|
2025-04-21 17:06:46 [http-nio-8080-exec-3] DEBUG c.y.t.m.M.getOptionsByQuestionIds - <== Total: 186
|
||||||
|
2025-04-21 17:06:46 [http-nio-8080-exec-3] INFO c.y.test.controller.MbtiController - 获取题目完成, 测试ID: 1, 题目数量: 93, 总耗时: PT0.3134364S
|
||||||
|
2025-04-21 17:10:28 [http-nio-8080-exec-6] INFO c.y.test.controller.MbtiController - 开始获取题目, 测试ID: 1
|
||||||
|
2025-04-21 17:10:28 [http-nio-8080-exec-6] DEBUG c.y.t.mapper.MbtiMapper.getTestById - ==> Preparing: SELECT id, name FROM test WHERE id = ?
|
||||||
|
2025-04-21 17:10:28 [http-nio-8080-exec-6] DEBUG c.y.t.mapper.MbtiMapper.getTestById - ==> Parameters: 1(String)
|
||||||
|
2025-04-21 17:10:29 [http-nio-8080-exec-6] DEBUG c.y.t.mapper.MbtiMapper.getTestById - <== Total: 1
|
||||||
|
2025-04-21 17:10:29 [http-nio-8080-exec-6] DEBUG c.y.t.m.M.getQuestionsByTestId - ==> Preparing: SELECT id, name, type, ? as testId FROM question WHERE test_id = ? ORDER BY id
|
||||||
|
2025-04-21 17:10:29 [http-nio-8080-exec-6] DEBUG c.y.t.m.M.getQuestionsByTestId - ==> Parameters: 1(String), 1(String)
|
||||||
|
2025-04-21 17:10:29 [http-nio-8080-exec-6] DEBUG c.y.t.m.M.getQuestionsByTestId - <== Total: 93
|
||||||
|
2025-04-21 17:10:29 [http-nio-8080-exec-6] DEBUG c.y.t.m.M.getOptionsByQuestionIds - ==> Preparing: SELECT id, code, name, question_id as questionId, character_type as characterType FROM option_table WHERE question_id IN ( ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? ) ORDER BY question_id, id
|
||||||
|
2025-04-21 17:10:29 [http-nio-8080-exec-6] DEBUG c.y.t.m.M.getOptionsByQuestionIds - ==> Parameters: 1(Integer), 2(Integer), 3(Integer), 4(Integer), 5(Integer), 6(Integer), 7(Integer), 8(Integer), 9(Integer), 10(Integer), 11(Integer), 12(Integer), 13(Integer), 14(Integer), 15(Integer), 16(Integer), 17(Integer), 18(Integer), 19(Integer), 20(Integer), 21(Integer), 22(Integer), 23(Integer), 24(Integer), 25(Integer), 26(Integer), 27(Integer), 28(Integer), 29(Integer), 30(Integer), 31(Integer), 32(Integer), 33(Integer), 34(Integer), 35(Integer), 36(Integer), 37(Integer), 38(Integer), 39(Integer), 40(Integer), 41(Integer), 42(Integer), 43(Integer), 44(Integer), 45(Integer), 46(Integer), 47(Integer), 48(Integer), 49(Integer), 50(Integer), 51(Integer), 52(Integer), 53(Integer), 54(Integer), 55(Integer), 56(Integer), 57(Integer), 58(Integer), 59(Integer), 60(Integer), 61(Integer), 62(Integer), 63(Integer), 64(Integer), 65(Integer), 66(Integer), 67(Integer), 68(Integer), 69(Integer), 70(Integer), 71(Integer), 72(Integer), 73(Integer), 74(Integer), 75(Integer), 76(Integer), 77(Integer), 78(Integer), 79(Integer), 80(Integer), 81(Integer), 82(Integer), 83(Integer), 84(Integer), 85(Integer), 86(Integer), 87(Integer), 88(Integer), 89(Integer), 90(Integer), 91(Integer), 92(Integer), 93(Integer)
|
||||||
|
2025-04-21 17:10:29 [http-nio-8080-exec-6] DEBUG c.y.t.m.M.getOptionsByQuestionIds - <== Total: 186
|
||||||
|
2025-04-21 17:10:29 [http-nio-8080-exec-6] INFO c.y.test.controller.MbtiController - 获取题目完成, 测试ID: 1, 题目数量: 93, 总耗时: PT0.2429666S
|
||||||
|
2025-04-21 17:12:07 [SpringApplicationShutdownHook] INFO o.s.b.w.e.tomcat.GracefulShutdown - Commencing graceful shutdown. Waiting for active requests to complete
|
||||||
|
2025-04-21 17:12:08 [tomcat-shutdown] INFO o.s.b.w.e.tomcat.GracefulShutdown - Graceful shutdown complete
|
||||||
|
2025-04-21 17:12:08 [SpringApplicationShutdownHook] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Shutdown initiated...
|
||||||
|
2025-04-21 17:12:08 [SpringApplicationShutdownHook] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Shutdown completed.
|
||||||
|
2025-04-21 17:12:09 [main] INFO com.yang.test.TestApplication - Starting TestApplication using Java 17.0.13 with PID 12056 (D:\project\Mbti\test\target\classes started by DENG in D:\project\Mbti\test)
|
||||||
|
2025-04-21 17:12:09 [main] DEBUG com.yang.test.TestApplication - Running with Spring Boot v3.4.4, Spring v6.2.5
|
||||||
|
2025-04-21 17:12:09 [main] INFO com.yang.test.TestApplication - No active profile set, falling back to 1 default profile: "default"
|
||||||
|
2025-04-21 17:12:10 [main] INFO o.s.b.w.e.tomcat.TomcatWebServer - Tomcat initialized with port 8080 (http)
|
||||||
|
2025-04-21 17:12:10 [main] INFO o.a.catalina.core.StandardService - Starting service [Tomcat]
|
||||||
|
2025-04-21 17:12:10 [main] INFO o.a.catalina.core.StandardEngine - Starting Servlet engine: [Apache Tomcat/10.1.39]
|
||||||
|
2025-04-21 17:12:10 [main] INFO o.a.c.c.C.[Tomcat].[localhost].[/] - Initializing Spring embedded WebApplicationContext
|
||||||
|
2025-04-21 17:12:10 [main] INFO o.s.b.w.s.c.ServletWebServerApplicationContext - Root WebApplicationContext: initialization completed in 841 ms
|
||||||
|
2025-04-21 17:12:10 [main] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Starting...
|
||||||
|
2025-04-21 17:12:16 [main] INFO com.zaxxer.hikari.pool.HikariPool - HikariPool-1 - Added connection com.mysql.cj.jdbc.ConnectionImpl@2bb62414
|
||||||
|
2025-04-21 17:12:16 [main] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Start completed.
|
||||||
|
2025-04-21 17:12:16 [main] INFO o.s.b.w.e.tomcat.TomcatWebServer - Tomcat started on port 8080 (http) with context path '/'
|
||||||
|
2025-04-21 17:12:16 [main] INFO com.yang.test.TestApplication - Started TestApplication in 7.415 seconds (process running for 8.039)
|
||||||
|
2025-04-21 17:12:16 [main] INFO com.yang.test.TestApplication - MBTI测试系统启动成功! 服务运行在端口: 8080
|
||||||
|
2025-04-21 17:12:23 [http-nio-8080-exec-2] INFO o.a.c.c.C.[Tomcat].[localhost].[/] - Initializing Spring DispatcherServlet 'dispatcherServlet'
|
||||||
|
2025-04-21 17:12:23 [http-nio-8080-exec-2] INFO o.s.web.servlet.DispatcherServlet - Initializing Servlet 'dispatcherServlet'
|
||||||
|
2025-04-21 17:12:23 [http-nio-8080-exec-2] INFO o.s.web.servlet.DispatcherServlet - Completed initialization in 0 ms
|
||||||
|
2025-04-21 17:12:23 [http-nio-8080-exec-2] INFO c.y.test.controller.MbtiController - 开始获取题目, 测试ID: 1
|
||||||
|
2025-04-21 17:12:23 [http-nio-8080-exec-2] DEBUG c.y.t.mapper.MbtiMapper.getTestById - ==> Preparing: SELECT id, name FROM test WHERE id = ?
|
||||||
|
2025-04-21 17:12:23 [http-nio-8080-exec-2] DEBUG c.y.t.mapper.MbtiMapper.getTestById - ==> Parameters: 1(String)
|
||||||
|
2025-04-21 17:12:24 [http-nio-8080-exec-2] DEBUG c.y.t.mapper.MbtiMapper.getTestById - <== Total: 1
|
||||||
|
2025-04-21 17:12:24 [http-nio-8080-exec-2] DEBUG c.y.t.m.M.getQuestionsByTestId - ==> Preparing: SELECT id, name, type, ? as testId FROM question WHERE test_id = ? ORDER BY id
|
||||||
|
2025-04-21 17:12:24 [http-nio-8080-exec-2] DEBUG c.y.t.m.M.getQuestionsByTestId - ==> Parameters: 1(String), 1(String)
|
||||||
|
2025-04-21 17:12:24 [http-nio-8080-exec-2] DEBUG c.y.t.m.M.getQuestionsByTestId - <== Total: 93
|
||||||
|
2025-04-21 17:12:24 [http-nio-8080-exec-2] DEBUG c.y.t.m.M.getOptionsByQuestionIds - ==> Preparing: SELECT id, code, name, question_id as questionId, character_type as characterType FROM option_table WHERE question_id IN ( ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? ) ORDER BY question_id, id
|
||||||
|
2025-04-21 17:12:24 [http-nio-8080-exec-2] DEBUG c.y.t.m.M.getOptionsByQuestionIds - ==> Parameters: 1(Integer), 2(Integer), 3(Integer), 4(Integer), 5(Integer), 6(Integer), 7(Integer), 8(Integer), 9(Integer), 10(Integer), 11(Integer), 12(Integer), 13(Integer), 14(Integer), 15(Integer), 16(Integer), 17(Integer), 18(Integer), 19(Integer), 20(Integer), 21(Integer), 22(Integer), 23(Integer), 24(Integer), 25(Integer), 26(Integer), 27(Integer), 28(Integer), 29(Integer), 30(Integer), 31(Integer), 32(Integer), 33(Integer), 34(Integer), 35(Integer), 36(Integer), 37(Integer), 38(Integer), 39(Integer), 40(Integer), 41(Integer), 42(Integer), 43(Integer), 44(Integer), 45(Integer), 46(Integer), 47(Integer), 48(Integer), 49(Integer), 50(Integer), 51(Integer), 52(Integer), 53(Integer), 54(Integer), 55(Integer), 56(Integer), 57(Integer), 58(Integer), 59(Integer), 60(Integer), 61(Integer), 62(Integer), 63(Integer), 64(Integer), 65(Integer), 66(Integer), 67(Integer), 68(Integer), 69(Integer), 70(Integer), 71(Integer), 72(Integer), 73(Integer), 74(Integer), 75(Integer), 76(Integer), 77(Integer), 78(Integer), 79(Integer), 80(Integer), 81(Integer), 82(Integer), 83(Integer), 84(Integer), 85(Integer), 86(Integer), 87(Integer), 88(Integer), 89(Integer), 90(Integer), 91(Integer), 92(Integer), 93(Integer)
|
||||||
|
2025-04-21 17:12:24 [http-nio-8080-exec-2] DEBUG c.y.t.m.M.getOptionsByQuestionIds - <== Total: 186
|
||||||
|
2025-04-21 17:12:24 [http-nio-8080-exec-2] INFO c.y.test.controller.MbtiController - 获取题目完成, 测试ID: 1, 题目数量: 93, 总耗时: PT0.3188868S
|
||||||
|
2025-04-21 17:22:13 [http-nio-8080-exec-4] INFO c.y.test.controller.MbtiController - 开始获取题目, 测试ID: 1
|
||||||
|
2025-04-21 17:22:13 [http-nio-8080-exec-4] DEBUG c.y.t.mapper.MbtiMapper.getTestById - ==> Preparing: SELECT id, name FROM test WHERE id = ?
|
||||||
|
2025-04-21 17:22:13 [http-nio-8080-exec-4] DEBUG c.y.t.mapper.MbtiMapper.getTestById - ==> Parameters: 1(String)
|
||||||
|
2025-04-21 17:22:13 [http-nio-8080-exec-4] DEBUG c.y.t.mapper.MbtiMapper.getTestById - <== Total: 1
|
||||||
|
2025-04-21 17:22:13 [http-nio-8080-exec-4] DEBUG c.y.t.m.M.getQuestionsByTestId - ==> Preparing: SELECT id, name, type, ? as testId FROM question WHERE test_id = ? ORDER BY id
|
||||||
|
2025-04-21 17:22:13 [http-nio-8080-exec-4] DEBUG c.y.t.m.M.getQuestionsByTestId - ==> Parameters: 1(String), 1(String)
|
||||||
|
2025-04-21 17:22:13 [http-nio-8080-exec-4] DEBUG c.y.t.m.M.getQuestionsByTestId - <== Total: 93
|
||||||
|
2025-04-21 17:22:13 [http-nio-8080-exec-4] DEBUG c.y.t.m.M.getOptionsByQuestionIds - ==> Preparing: SELECT id, code, name, question_id as questionId, character_type as characterType FROM option_table WHERE question_id IN ( ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? , ? ) ORDER BY question_id, id
|
||||||
|
2025-04-21 17:22:13 [http-nio-8080-exec-4] DEBUG c.y.t.m.M.getOptionsByQuestionIds - ==> Parameters: 1(Integer), 2(Integer), 3(Integer), 4(Integer), 5(Integer), 6(Integer), 7(Integer), 8(Integer), 9(Integer), 10(Integer), 11(Integer), 12(Integer), 13(Integer), 14(Integer), 15(Integer), 16(Integer), 17(Integer), 18(Integer), 19(Integer), 20(Integer), 21(Integer), 22(Integer), 23(Integer), 24(Integer), 25(Integer), 26(Integer), 27(Integer), 28(Integer), 29(Integer), 30(Integer), 31(Integer), 32(Integer), 33(Integer), 34(Integer), 35(Integer), 36(Integer), 37(Integer), 38(Integer), 39(Integer), 40(Integer), 41(Integer), 42(Integer), 43(Integer), 44(Integer), 45(Integer), 46(Integer), 47(Integer), 48(Integer), 49(Integer), 50(Integer), 51(Integer), 52(Integer), 53(Integer), 54(Integer), 55(Integer), 56(Integer), 57(Integer), 58(Integer), 59(Integer), 60(Integer), 61(Integer), 62(Integer), 63(Integer), 64(Integer), 65(Integer), 66(Integer), 67(Integer), 68(Integer), 69(Integer), 70(Integer), 71(Integer), 72(Integer), 73(Integer), 74(Integer), 75(Integer), 76(Integer), 77(Integer), 78(Integer), 79(Integer), 80(Integer), 81(Integer), 82(Integer), 83(Integer), 84(Integer), 85(Integer), 86(Integer), 87(Integer), 88(Integer), 89(Integer), 90(Integer), 91(Integer), 92(Integer), 93(Integer)
|
||||||
|
2025-04-21 17:22:13 [http-nio-8080-exec-4] DEBUG c.y.t.m.M.getOptionsByQuestionIds - <== Total: 186
|
||||||
|
2025-04-21 17:22:13 [http-nio-8080-exec-4] INFO c.y.test.controller.MbtiController - 获取题目完成, 测试ID: 1, 题目数量: 93, 总耗时: PT0.2650471S
|
||||||
|
2025-04-21 17:24:33 [SpringApplicationShutdownHook] INFO o.s.b.w.e.tomcat.GracefulShutdown - Commencing graceful shutdown. Waiting for active requests to complete
|
||||||
|
2025-04-21 17:24:33 [tomcat-shutdown] INFO o.s.b.w.e.tomcat.GracefulShutdown - Graceful shutdown complete
|
||||||
|
2025-04-21 17:24:33 [SpringApplicationShutdownHook] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Shutdown initiated...
|
||||||
|
2025-04-21 17:24:33 [SpringApplicationShutdownHook] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Shutdown completed.
|
||||||
|
2025-04-21 17:28:16 [main] INFO com.yang.test.TestApplication - Starting TestApplication using Java 17.0.13 with PID 13076 (D:\project\Mbti\test\target\classes started by DENG in D:\project\Mbti\test)
|
||||||
|
2025-04-21 17:28:16 [main] DEBUG com.yang.test.TestApplication - Running with Spring Boot v3.4.4, Spring v6.2.5
|
||||||
|
2025-04-21 17:28:16 [main] INFO com.yang.test.TestApplication - No active profile set, falling back to 1 default profile: "default"
|
||||||
|
2025-04-21 17:28:17 [main] INFO o.s.b.w.e.tomcat.TomcatWebServer - Tomcat initialized with port 8080 (http)
|
||||||
|
2025-04-21 17:28:17 [main] INFO o.a.catalina.core.StandardService - Starting service [Tomcat]
|
||||||
|
2025-04-21 17:28:17 [main] INFO o.a.catalina.core.StandardEngine - Starting Servlet engine: [Apache Tomcat/10.1.39]
|
||||||
|
2025-04-21 17:28:17 [main] INFO o.a.c.c.C.[Tomcat].[localhost].[/] - Initializing Spring embedded WebApplicationContext
|
||||||
|
2025-04-21 17:28:17 [main] INFO o.s.b.w.s.c.ServletWebServerApplicationContext - Root WebApplicationContext: initialization completed in 842 ms
|
||||||
|
2025-04-21 17:28:17 [main] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Starting...
|
||||||
|
2025-04-21 17:28:23 [main] INFO com.zaxxer.hikari.pool.HikariPool - HikariPool-1 - Added connection com.mysql.cj.jdbc.ConnectionImpl@2bb62414
|
||||||
|
2025-04-21 17:28:23 [main] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Start completed.
|
||||||
|
2025-04-21 17:28:23 [main] INFO o.s.b.w.e.tomcat.TomcatWebServer - Tomcat started on port 8080 (http) with context path '/'
|
||||||
|
2025-04-21 17:28:23 [main] INFO com.yang.test.TestApplication - Started TestApplication in 7.294 seconds (process running for 7.834)
|
||||||
|
2025-04-21 17:28:23 [main] INFO com.yang.test.TestApplication - MBTI测试系统启动成功! 服务运行在端口: 8080
|
||||||
|
2025-04-21 17:28:54 [http-nio-8080-exec-1] INFO o.a.c.c.C.[Tomcat].[localhost].[/] - Initializing Spring DispatcherServlet 'dispatcherServlet'
|
||||||
|
2025-04-21 17:28:54 [http-nio-8080-exec-1] INFO o.s.web.servlet.DispatcherServlet - Initializing Servlet 'dispatcherServlet'
|
||||||
|
2025-04-21 17:28:54 [http-nio-8080-exec-1] INFO o.s.web.servlet.DispatcherServlet - Completed initialization in 0 ms
|
||||||
|
2025-04-21 17:28:54 [http-nio-8080-exec-1] INFO c.y.test.controller.MbtiController - 开始获取结果, ID: result_1744874809561
|
||||||
|
2025-04-21 17:28:54 [http-nio-8080-exec-1] DEBUG c.y.t.m.MbtiMapper.getResultById - ==> Preparing: SELECT id, type, dimensions, report, created_at as createdAt FROM results WHERE id = ?
|
||||||
|
2025-04-21 17:28:54 [http-nio-8080-exec-1] DEBUG c.y.t.m.MbtiMapper.getResultById - ==> Parameters: result_1744874809561(String)
|
||||||
|
2025-04-21 17:28:54 [http-nio-8080-exec-1] DEBUG c.y.t.m.MbtiMapper.getResultById - <== Total: 1
|
||||||
|
2025-04-21 17:28:54 [http-nio-8080-exec-1] INFO c.y.test.controller.MbtiController - 获取结果完成, ID: result_1744874809561, 总耗时: PT0.1893936S
|
||||||
|
2025-04-21 17:29:00 [http-nio-8080-exec-2] INFO c.y.test.controller.MbtiController - 开始获取结果, ID: result_1744874809561
|
||||||
|
2025-04-21 17:29:00 [http-nio-8080-exec-2] DEBUG c.y.t.m.MbtiMapper.getResultById - ==> Preparing: SELECT id, type, dimensions, report, created_at as createdAt FROM results WHERE id = ?
|
||||||
|
2025-04-21 17:29:00 [http-nio-8080-exec-2] DEBUG c.y.t.m.MbtiMapper.getResultById - ==> Parameters: result_1744874809561(String)
|
||||||
|
2025-04-21 17:29:01 [http-nio-8080-exec-2] DEBUG c.y.t.m.MbtiMapper.getResultById - <== Total: 1
|
||||||
|
2025-04-21 17:29:01 [http-nio-8080-exec-2] INFO c.y.test.controller.MbtiController - 获取结果完成, ID: result_1744874809561, 总耗时: PT0.1230948S
|
||||||
|
2025-04-21 17:29:13 [http-nio-8080-exec-4] INFO c.y.test.controller.MbtiController - 开始获取结果, ID: result_1744874809561
|
||||||
|
2025-04-21 17:29:13 [http-nio-8080-exec-4] DEBUG c.y.t.m.MbtiMapper.getResultById - ==> Preparing: SELECT id, type, dimensions, report, created_at as createdAt FROM results WHERE id = ?
|
||||||
|
2025-04-21 17:29:13 [http-nio-8080-exec-4] DEBUG c.y.t.m.MbtiMapper.getResultById - ==> Parameters: result_1744874809561(String)
|
||||||
|
2025-04-21 17:29:13 [http-nio-8080-exec-4] DEBUG c.y.t.m.MbtiMapper.getResultById - <== Total: 1
|
||||||
|
2025-04-21 17:29:13 [http-nio-8080-exec-4] INFO c.y.test.controller.MbtiController - 获取结果完成, ID: result_1744874809561, 总耗时: PT0.1314746S
|
||||||
|
2025-04-21 17:29:16 [http-nio-8080-exec-3] INFO c.y.test.controller.MbtiController - 开始获取结果, ID: result_1744874809561
|
||||||
|
2025-04-21 17:29:16 [http-nio-8080-exec-3] DEBUG c.y.t.m.MbtiMapper.getResultById - ==> Preparing: SELECT id, type, dimensions, report, created_at as createdAt FROM results WHERE id = ?
|
||||||
|
2025-04-21 17:29:16 [http-nio-8080-exec-3] DEBUG c.y.t.m.MbtiMapper.getResultById - ==> Parameters: result_1744874809561(String)
|
||||||
|
2025-04-21 17:29:16 [http-nio-8080-exec-3] DEBUG c.y.t.m.MbtiMapper.getResultById - <== Total: 1
|
||||||
|
2025-04-21 17:29:16 [http-nio-8080-exec-3] INFO c.y.test.controller.MbtiController - 获取结果完成, ID: result_1744874809561, 总耗时: PT0.0970814S
|
||||||
|
2025-04-21 17:29:40 [SpringApplicationShutdownHook] INFO o.s.b.w.e.tomcat.GracefulShutdown - Commencing graceful shutdown. Waiting for active requests to complete
|
||||||
|
2025-04-21 17:29:40 [tomcat-shutdown] INFO o.s.b.w.e.tomcat.GracefulShutdown - Graceful shutdown complete
|
||||||
|
2025-04-21 17:29:40 [SpringApplicationShutdownHook] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Shutdown initiated...
|
||||||
|
2025-04-21 17:29:40 [SpringApplicationShutdownHook] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Shutdown completed.
|
|
@ -3,15 +3,19 @@ package com.yang.test.controller;
|
||||||
import com.yang.test.domain.DTO.ResultRequest;
|
import com.yang.test.domain.DTO.ResultRequest;
|
||||||
import com.yang.test.domain.DTO.ResultResponse;
|
import com.yang.test.domain.DTO.ResultResponse;
|
||||||
import com.yang.test.domain.QuestionH;
|
import com.yang.test.domain.QuestionH;
|
||||||
|
import com.yang.test.domain.Result;
|
||||||
import com.yang.test.service.HldzyService;
|
import com.yang.test.service.HldzyService;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.web.bind.annotation.*;
|
import org.springframework.web.bind.annotation.*;
|
||||||
|
|
||||||
|
import java.time.Duration;
|
||||||
|
import java.time.Instant;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
|
@Slf4j
|
||||||
@RestController
|
@RestController
|
||||||
@RequestMapping("/api")
|
@RequestMapping("/api")
|
||||||
public class HldzyController {
|
public class HldzyController {
|
||||||
|
@ -23,30 +27,41 @@ public class HldzyController {
|
||||||
* 获取所有测试题目
|
* 获取所有测试题目
|
||||||
*/
|
*/
|
||||||
@GetMapping("/questionsH")
|
@GetMapping("/questionsH")
|
||||||
public Map<String, Object> getAllQuestions() {
|
public Result<?> getAllQuestions() {
|
||||||
|
Instant start = Instant.now();
|
||||||
|
log.info("开始获取所有题目");
|
||||||
|
|
||||||
|
try {
|
||||||
List<QuestionH> questions = hldzyService.getAllQuestions();
|
List<QuestionH> questions = hldzyService.getAllQuestions();
|
||||||
Collections.shuffle(questions); // 随机排序问题
|
Collections.shuffle(questions); // 随机排序问题
|
||||||
|
|
||||||
Map<String, Object> response = new HashMap<>();
|
log.info("获取题目完成, 题目数量: {}, 总耗时: {}",
|
||||||
response.put("code", 0);
|
questions.size(), Duration.between(start, Instant.now()));
|
||||||
response.put("message", "success");
|
|
||||||
response.put("data", questions);
|
|
||||||
|
|
||||||
return response;
|
return Result.success(questions);
|
||||||
|
} catch (Exception e) {
|
||||||
|
log.error("获取题目失败: {}", e.getMessage(), e);
|
||||||
|
return Result.error("获取题目失败: " + e.getMessage());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 提交测试结果并获取分析
|
* 提交测试结果并获取分析
|
||||||
*/
|
*/
|
||||||
@PostMapping("/results")
|
@PostMapping("/results")
|
||||||
public Map<String, Object> submitResult(@RequestBody ResultRequest request) {
|
public Result<?> submitResult(@RequestBody ResultRequest request) {
|
||||||
|
Instant start = Instant.now();
|
||||||
|
log.info("开始处理结果提交请求");
|
||||||
|
|
||||||
|
try {
|
||||||
ResultResponse result = hldzyService.calculateResult(request.getAnswers());
|
ResultResponse result = hldzyService.calculateResult(request.getAnswers());
|
||||||
|
|
||||||
Map<String, Object> response = new HashMap<>();
|
log.info("结果计算完成, 总耗时: {}", Duration.between(start, Instant.now()));
|
||||||
response.put("code", 0);
|
|
||||||
response.put("message", "success");
|
|
||||||
response.put("data", result);
|
|
||||||
|
|
||||||
return response;
|
return Result.success(result);
|
||||||
|
} catch (Exception e) {
|
||||||
|
log.error("处理结果提交请求失败: {}", e.getMessage(), e);
|
||||||
|
return Result.error("处理请求失败: " + e.getMessage());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -1,17 +1,15 @@
|
||||||
package com.yang.test.controller;
|
package com.yang.test.controller;
|
||||||
|
|
||||||
import com.yang.test.domain.Answer;
|
import com.yang.test.domain.Result;
|
||||||
import com.yang.test.domain.VO.QuestionVO;
|
import com.yang.test.domain.VO.ResultMVO;
|
||||||
import com.yang.test.domain.VO.ResultVO;
|
import com.yang.test.domain.VO.TestQuestionsVO;
|
||||||
import com.yang.test.service.MbtiService;
|
import com.yang.test.service.MbtiService;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.http.ResponseEntity;
|
|
||||||
import org.springframework.web.bind.annotation.*;
|
import org.springframework.web.bind.annotation.*;
|
||||||
|
|
||||||
import java.time.Duration;
|
import java.time.Duration;
|
||||||
import java.time.Instant;
|
import java.time.Instant;
|
||||||
import java.util.List;
|
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
@Slf4j
|
@Slf4j
|
||||||
|
@ -23,60 +21,64 @@ public class MbtiController {
|
||||||
private MbtiService mbtiService;
|
private MbtiService mbtiService;
|
||||||
|
|
||||||
@GetMapping("/questions")
|
@GetMapping("/questions")
|
||||||
public ResponseEntity<?> getQuestions(@RequestParam(value = "type", defaultValue = "simple") String testType) {
|
public Result<?> getQuestions(@RequestParam(value = "testId", defaultValue = "1") String testId) {
|
||||||
Instant start = Instant.now();
|
Instant start = Instant.now();
|
||||||
log.info("开始获取题目, 类型: {}", testType);
|
log.info("开始获取题目, 测试ID: {}", testId);
|
||||||
try {
|
try {
|
||||||
List<QuestionVO> questions = mbtiService.getQuestions(testType);
|
TestQuestionsVO testQuestions = mbtiService.getTestQuestions(testId);
|
||||||
|
|
||||||
log.info("获取题目完成, 类型: {}, 题目数量: {}, 总耗时: {}",
|
if (testQuestions == null) {
|
||||||
testType, questions.size(), Duration.between(start, Instant.now()));
|
return Result.error("未找到相关测试或题目");
|
||||||
|
}
|
||||||
|
|
||||||
return ResponseEntity.ok(questions);
|
log.info("获取题目完成, 测试ID: {}, 题目数量: {}, 总耗时: {}",
|
||||||
|
testId, testQuestions.getList().size(), Duration.between(start, Instant.now()));
|
||||||
|
|
||||||
|
return Result.success(testQuestions);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
log.error("获取题目失败: {}", e.getMessage(), e);
|
log.error("获取题目失败: {}", e.getMessage(), e);
|
||||||
return ResponseEntity.internalServerError().body(Map.of("error", "获取题目失败"));
|
return Result.error("获取题目失败: " + e.getMessage());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@PostMapping("/submit")
|
@PostMapping("/submit")
|
||||||
public ResponseEntity<?> submitAnswers(@RequestBody Answer answer,
|
public Result<?> submitAnswers(@RequestBody Map<String, Integer> answers,
|
||||||
@RequestParam(value = "type", defaultValue = "simple") String testType) {
|
@RequestParam(value = "testId", defaultValue = "1") String testId) {
|
||||||
Instant start = Instant.now();
|
Instant start = Instant.now();
|
||||||
log.info("开始处理答案提交请求");
|
log.info("开始处理答案提交请求");
|
||||||
|
|
||||||
try {
|
try {
|
||||||
String resultId = mbtiService.processAnswers(answer.getAnswers(), testType);
|
String resultId = mbtiService.processAnswers(answers, testId);
|
||||||
|
|
||||||
log.info("答案提交处理完成, 结果ID: {}, 总耗时: {}",
|
log.info("答案提交处理完成, 结果ID: {}, 总耗时: {}",
|
||||||
resultId, Duration.between(start, Instant.now()));
|
resultId, Duration.between(start, Instant.now()));
|
||||||
|
|
||||||
return ResponseEntity.ok(Map.of("resultId", resultId));
|
return Result.success(Map.of("resultId", resultId));
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
log.error("处理答案提交请求失败: {}", e.getMessage(), e);
|
log.error("处理答案提交请求失败: {}", e.getMessage(), e);
|
||||||
return ResponseEntity.internalServerError().body(Map.of("error", "处理请求失败"));
|
return Result.error("处理请求失败: " + e.getMessage());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@GetMapping("/result/{id}")
|
@GetMapping("/result/{id}")
|
||||||
public ResponseEntity<?> getResult(@PathVariable("id") String resultId) {
|
public Result<ResultMVO> getResult(@PathVariable("id") String resultId) {
|
||||||
Instant start = Instant.now();
|
Instant start = Instant.now();
|
||||||
log.info("开始获取结果, ID: {}", resultId);
|
log.info("开始获取结果, ID: {}", resultId);
|
||||||
|
|
||||||
try {
|
try {
|
||||||
ResultVO result = mbtiService.getResult(resultId);
|
ResultMVO result = mbtiService.getResult(resultId);
|
||||||
|
|
||||||
if (result == null) {
|
if (result == null) {
|
||||||
return ResponseEntity.notFound().build();
|
return Result.error("未找到相关结果");
|
||||||
}
|
}
|
||||||
|
|
||||||
log.info("获取结果完成, ID: {}, 类型: {}, 总耗时: {}",
|
log.info("获取结果完成, ID: {}, 总耗时: {}",
|
||||||
resultId, result.getType(), Duration.between(start, Instant.now()));
|
resultId, Duration.between(start, Instant.now()));
|
||||||
|
|
||||||
return ResponseEntity.ok(result);
|
return Result.success(result);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
log.error("获取结果失败: {}", e.getMessage(), e);
|
log.error("获取结果失败: {}", e.getMessage(), e);
|
||||||
return ResponseEntity.internalServerError().body(Map.of("error", "获取结果失败"));
|
return Result.error("获取结果失败: " + e.getMessage());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -1,9 +0,0 @@
|
||||||
package com.yang.test.domain;
|
|
||||||
|
|
||||||
import lombok.Data;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
@Data
|
|
||||||
public class Answer {
|
|
||||||
private List<Integer> answers;
|
|
||||||
}
|
|
|
@ -1,8 +1,12 @@
|
||||||
package com.yang.test.domain;
|
package com.yang.test.domain;
|
||||||
|
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
|
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Hldzy
|
||||||
|
*/
|
||||||
@Data
|
@Data
|
||||||
public class Category {
|
public class Category {
|
||||||
private Integer id;
|
private Integer id;
|
||||||
|
|
|
@ -3,6 +3,9 @@ package com.yang.test.domain.DTO;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Hldzy
|
||||||
|
*/
|
||||||
@Data
|
@Data
|
||||||
public class ResultRequest {
|
public class ResultRequest {
|
||||||
private Map<String, Integer> answers;
|
private Map<String, Integer> answers;
|
||||||
|
|
|
@ -2,8 +2,12 @@ package com.yang.test.domain.DTO;
|
||||||
|
|
||||||
import com.yang.test.domain.Category;
|
import com.yang.test.domain.Category;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
|
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Hldzy
|
||||||
|
*/
|
||||||
@Data
|
@Data
|
||||||
public class ResultResponse {
|
public class ResultResponse {
|
||||||
private String resultCode;
|
private String resultCode;
|
||||||
|
|
|
@ -4,6 +4,9 @@ import lombok.AllArgsConstructor;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
import lombok.NoArgsConstructor;
|
import lombok.NoArgsConstructor;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Mbti
|
||||||
|
*/
|
||||||
@Data
|
@Data
|
||||||
@NoArgsConstructor
|
@NoArgsConstructor
|
||||||
@AllArgsConstructor
|
@AllArgsConstructor
|
||||||
|
|
|
@ -1,16 +0,0 @@
|
||||||
package com.yang.test.domain;
|
|
||||||
|
|
||||||
import lombok.Data;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Date;
|
|
||||||
|
|
||||||
@Data
|
|
||||||
public class Question {
|
|
||||||
private Integer id;
|
|
||||||
private String question;
|
|
||||||
private String dimension;
|
|
||||||
private Integer direction;
|
|
||||||
private String type;
|
|
||||||
private Date createdAt;
|
|
||||||
private List<String> options;
|
|
||||||
}
|
|
|
@ -3,6 +3,9 @@ package com.yang.test.domain;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Hldzy
|
||||||
|
*/
|
||||||
@Data
|
@Data
|
||||||
public class QuestionH {
|
public class QuestionH {
|
||||||
private Long id;
|
private Long id;
|
||||||
|
|
|
@ -4,8 +4,11 @@ import lombok.Data;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Mbti
|
||||||
|
*/
|
||||||
@Data
|
@Data
|
||||||
public class Result {
|
public class ResultM {
|
||||||
private String id;
|
private String id;
|
||||||
private String type;
|
private String type;
|
||||||
private List<Dimension> dimensions;
|
private List<Dimension> dimensions;
|
|
@ -1,8 +1,12 @@
|
||||||
package com.yang.test.domain;
|
package com.yang.test.domain;
|
||||||
|
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
|
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Hldzy
|
||||||
|
*/
|
||||||
@Data
|
@Data
|
||||||
public class TestResult {
|
public class TestResult {
|
||||||
private Long id;
|
private Long id;
|
||||||
|
|
|
@ -1,13 +0,0 @@
|
||||||
package com.yang.test.domain.VO;
|
|
||||||
|
|
||||||
import lombok.Data;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
@Data
|
|
||||||
public class QuestionVO {
|
|
||||||
private Integer id;
|
|
||||||
private String question;
|
|
||||||
private List<String> options;
|
|
||||||
private String dimension;
|
|
||||||
private Integer direction;
|
|
||||||
}
|
|
|
@ -5,8 +5,11 @@ import com.yang.test.domain.Dimension;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Mbti
|
||||||
|
*/
|
||||||
@Data
|
@Data
|
||||||
public class ResultVO {
|
public class ResultMVO {
|
||||||
private String id;
|
private String id;
|
||||||
private String type;
|
private String type;
|
||||||
private List<Dimension> dimensions;
|
private List<Dimension> dimensions;
|
|
@ -1,41 +1,44 @@
|
||||||
package com.yang.test.mapper;
|
package com.yang.test.mapper;
|
||||||
|
|
||||||
|
import com.yang.test.domain.*;
|
||||||
|
|
||||||
import com.yang.test.domain.Question;
|
|
||||||
import com.yang.test.domain.Result;
|
|
||||||
import org.apache.ibatis.annotations.Mapper;
|
import org.apache.ibatis.annotations.Mapper;
|
||||||
|
import org.apache.ibatis.annotations.Param;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
@Mapper
|
@Mapper
|
||||||
public interface MbtiMapper {
|
public interface MbtiMapper {
|
||||||
/**
|
/**
|
||||||
* 根据类型获取题目列表
|
* 根据ID获取测试信息
|
||||||
* @param types 题目类型
|
|
||||||
* @return 题目列表
|
|
||||||
*/
|
*/
|
||||||
List<Question> getQuestionsByTypes(List<String> types);
|
Test getTestById(@Param("id") String id);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获取题目的维度和方向信息
|
* 获取测试的所有问题
|
||||||
* @param types 题目类型
|
|
||||||
* @return 维度和方向信息列表
|
|
||||||
*/
|
*/
|
||||||
List<Map<String, Object>> getQuestionDimensionsAndDirections(List<String> types);
|
List<Question> getQuestionsByTestId(@Param("testId") String testId);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取问题的所有选项
|
||||||
|
*/
|
||||||
|
List<Option> getOptionsByQuestionId(@Param("questionId") Integer questionId);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取问题的所有选项(批量)
|
||||||
|
*/
|
||||||
|
List<Option> getOptionsByQuestionIds(@Param("questionIds") List<Integer> questionIds);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 保存测试结果
|
* 保存测试结果
|
||||||
* @param result 结果对象
|
* @param result 结果对象
|
||||||
* @return 影响的行数
|
* @return 影响的行数
|
||||||
*/
|
*/
|
||||||
int saveResult(Result result);
|
int saveResult(ResultM result);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 根据ID获取结果
|
* 根据ID获取结果
|
||||||
* @param resultId 结果ID
|
* @param resultId 结果ID
|
||||||
* @return 结果对象
|
* @return 结果对象
|
||||||
*/
|
*/
|
||||||
Result getResultById(String resultId);
|
ResultM getResultById(String resultId);
|
||||||
}
|
}
|
|
@ -1,7 +1,7 @@
|
||||||
package com.yang.test.service;
|
package com.yang.test.service;
|
||||||
|
|
||||||
import com.yang.test.domain.DTO.ResultResponse;
|
|
||||||
import com.yang.test.domain.Category;
|
import com.yang.test.domain.Category;
|
||||||
|
import com.yang.test.domain.DTO.ResultResponse;
|
||||||
import com.yang.test.domain.QuestionH;
|
import com.yang.test.domain.QuestionH;
|
||||||
import com.yang.test.domain.TestResult;
|
import com.yang.test.domain.TestResult;
|
||||||
|
|
||||||
|
|
|
@ -1,43 +1,40 @@
|
||||||
package com.yang.test.service;
|
package com.yang.test.service;
|
||||||
|
|
||||||
|
import com.yang.test.domain.VO.ResultMVO;
|
||||||
|
import com.yang.test.domain.VO.TestQuestionsVO;
|
||||||
|
|
||||||
|
|
||||||
import com.yang.test.domain.VO.QuestionVO;
|
|
||||||
import com.yang.test.domain.VO.ResultVO;
|
|
||||||
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
public interface MbtiService {
|
public interface MbtiService {
|
||||||
/**
|
|
||||||
* 获取测试题目
|
|
||||||
* @param testType 测试类型
|
|
||||||
* @return 题目列表
|
|
||||||
*/
|
|
||||||
List<QuestionVO> getQuestions(String testType);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 处理用户提交的答案
|
* 获取测试和问题
|
||||||
* @param answers 用户答案
|
* @param testId 测试ID
|
||||||
* @param testType 测试类型
|
* @return 测试和问题信息
|
||||||
|
*/
|
||||||
|
TestQuestionsVO getTestQuestions(String testId);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 处理答案并生成结果
|
||||||
|
* @param answers 用户的答案
|
||||||
|
* @param testId 测试ID
|
||||||
* @return 结果ID
|
* @return 结果ID
|
||||||
*/
|
*/
|
||||||
String processAnswers(List<Integer> answers, String testType);
|
String processAnswers(Map<String, Integer> answers, String testId);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获取测试结果
|
* 获取测试结果
|
||||||
* @param resultId 结果ID
|
* @param resultId 结果ID
|
||||||
* @return 结果视图对象
|
* @return 结果视图对象
|
||||||
*/
|
*/
|
||||||
ResultVO getResult(String resultId);
|
ResultMVO getResult(String resultId);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 计算MBTI维度得分
|
* 计算MBTI维度得分
|
||||||
* @param answers 用户答案
|
* @param answers 用户答案
|
||||||
* @param testType 测试类型
|
|
||||||
* @return 维度得分映射
|
* @return 维度得分映射
|
||||||
*/
|
*/
|
||||||
Map<String, Double> calculateScores(List<Integer> answers, String testType);
|
Map<String, Double> calculateScores(Map<String, Integer> answers);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 根据得分确定MBTI类型
|
* 根据得分确定MBTI类型
|
||||||
|
|
|
@ -4,7 +4,6 @@ import com.fasterxml.jackson.databind.JsonNode;
|
||||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||||
import com.fasterxml.jackson.databind.node.ArrayNode;
|
import com.fasterxml.jackson.databind.node.ArrayNode;
|
||||||
import com.fasterxml.jackson.databind.node.ObjectNode;
|
import com.fasterxml.jackson.databind.node.ObjectNode;
|
||||||
|
|
||||||
import com.yang.test.domain.Dimension;
|
import com.yang.test.domain.Dimension;
|
||||||
import com.yang.test.service.DeepseekService;
|
import com.yang.test.service.DeepseekService;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
|
|
@ -1,15 +1,17 @@
|
||||||
package com.yang.test.service.serviceImpl;
|
package com.yang.test.service.serviceImpl;
|
||||||
|
|
||||||
import com.yang.test.mapper.HldzyMapper;
|
|
||||||
import com.yang.test.domain.DTO.ResultResponse;
|
|
||||||
import com.yang.test.domain.Category;
|
import com.yang.test.domain.Category;
|
||||||
|
import com.yang.test.domain.DTO.ResultResponse;
|
||||||
import com.yang.test.domain.QuestionH;
|
import com.yang.test.domain.QuestionH;
|
||||||
import com.yang.test.domain.TestResult;
|
import com.yang.test.domain.TestResult;
|
||||||
|
import com.yang.test.mapper.HldzyMapper;
|
||||||
import com.yang.test.service.HldzyService;
|
import com.yang.test.service.HldzyService;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
import java.util.*;
|
import java.util.HashMap;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
@Service
|
@Service
|
||||||
|
|
|
@ -1,21 +1,22 @@
|
||||||
package com.yang.test.service.serviceImpl;
|
package com.yang.test.service.serviceImpl;
|
||||||
|
|
||||||
|
import com.yang.test.domain.*;
|
||||||
import com.yang.test.mapper.MbtiMapper;
|
|
||||||
import com.yang.test.domain.Dimension;
|
|
||||||
import com.yang.test.domain.Question;
|
|
||||||
import com.yang.test.domain.Result;
|
|
||||||
import com.yang.test.domain.VO.QuestionVO;
|
import com.yang.test.domain.VO.QuestionVO;
|
||||||
import com.yang.test.domain.VO.ResultVO;
|
import com.yang.test.domain.VO.ResultMVO;
|
||||||
|
import com.yang.test.domain.VO.TestQuestionsVO;
|
||||||
|
import com.yang.test.mapper.MbtiMapper;
|
||||||
import com.yang.test.service.DeepseekService;
|
import com.yang.test.service.DeepseekService;
|
||||||
import com.yang.test.service.MbtiService;
|
import com.yang.test.service.MbtiService;
|
||||||
import lombok.Data;
|
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
import java.time.Instant;
|
import java.time.Instant;
|
||||||
import java.util.*;
|
import java.util.ArrayList;
|
||||||
|
import java.util.Date;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
@Slf4j
|
@Slf4j
|
||||||
@Service
|
@Service
|
||||||
|
@ -28,44 +29,55 @@ public class MbtiServiceImpl implements MbtiService {
|
||||||
private DeepseekService deepseekService;
|
private DeepseekService deepseekService;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public List<QuestionVO> getQuestions(String testType) {
|
public TestQuestionsVO getTestQuestions(String testId) {
|
||||||
List<String> types;
|
// 获取测试信息
|
||||||
switch (testType) {
|
Test test = mbtiMapper.getTestById(testId);
|
||||||
case "simple":
|
if (test == null) {
|
||||||
types = Collections.singletonList("simple");
|
return null;
|
||||||
break;
|
|
||||||
case "detailed":
|
|
||||||
types = Arrays.asList("simple", "detailed");
|
|
||||||
break;
|
|
||||||
case "full":
|
|
||||||
types = Arrays.asList("simple", "detailed", "full");
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
log.warn("无效的测试类型: {}, 使用simple类型", testType);
|
|
||||||
types = Collections.singletonList("simple");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
List<Question> questions = mbtiMapper.getQuestionsByTypes(types);
|
// 获取测试的所有问题
|
||||||
List<QuestionVO> questionVOs = new ArrayList<>();
|
List<Question> questions = mbtiMapper.getQuestionsByTestId(testId);
|
||||||
|
if (questions == null || questions.isEmpty()) {
|
||||||
for (Question q : questions) {
|
return null;
|
||||||
QuestionVO vo = new QuestionVO();
|
|
||||||
vo.setId(q.getId());
|
|
||||||
vo.setQuestion(q.getQuestion());
|
|
||||||
vo.setDimension(q.getDimension());
|
|
||||||
vo.setDirection(q.getDirection());
|
|
||||||
// 设置7级量表选项
|
|
||||||
vo.setOptions(Arrays.asList("非常不符合", "不符合", "有点不符合", "中立", "有点符合", "符合", "非常符合"));
|
|
||||||
questionVOs.add(vo);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return questionVOs;
|
// 获取所有问题ID
|
||||||
|
List<Integer> questionIds = questions.stream()
|
||||||
|
.map(Question::getId)
|
||||||
|
.collect(Collectors.toList());
|
||||||
|
|
||||||
|
// 批量获取所有选项
|
||||||
|
List<Option> allOptions = mbtiMapper.getOptionsByQuestionIds(questionIds);
|
||||||
|
|
||||||
|
// 按问题ID对选项进行分组
|
||||||
|
Map<Integer, List<Option>> optionsByQuestionId = allOptions.stream()
|
||||||
|
.collect(Collectors.groupingBy(Option::getQuestionId));
|
||||||
|
|
||||||
|
// 构建返回结果
|
||||||
|
List<QuestionVO> questionVOList = new ArrayList<>();
|
||||||
|
for (Question question : questions) {
|
||||||
|
QuestionVO questionVO = new QuestionVO();
|
||||||
|
questionVO.setId(question.getId());
|
||||||
|
questionVO.setName(question.getName());
|
||||||
|
questionVO.setType(question.getType());
|
||||||
|
questionVO.setInfoname(test.getName());
|
||||||
|
questionVO.setOption(optionsByQuestionId.getOrDefault(question.getId(), new ArrayList<>()));
|
||||||
|
questionVOList.add(questionVO);
|
||||||
|
}
|
||||||
|
|
||||||
|
TestQuestionsVO result = new TestQuestionsVO();
|
||||||
|
result.setId(test.getId());
|
||||||
|
result.setName(test.getName());
|
||||||
|
result.setList(questionVOList);
|
||||||
|
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String processAnswers(List<Integer> answers, String testType) {
|
public String processAnswers(Map<String, Integer> answers, String testType) {
|
||||||
// 计算MBTI维度得分
|
// 计算MBTI维度得分
|
||||||
Map<String, Double> scores = calculateScores(answers, testType);
|
Map<String, Double> scores = calculateScores(answers);
|
||||||
|
|
||||||
// 生成结果ID
|
// 生成结果ID
|
||||||
String resultId = generateResultId();
|
String resultId = generateResultId();
|
||||||
|
@ -75,18 +87,13 @@ public class MbtiServiceImpl implements MbtiService {
|
||||||
log.info("计算得到MBTI类型: {}, 得分: {}", mbtiType, scores);
|
log.info("计算得到MBTI类型: {}, 得分: {}", mbtiType, scores);
|
||||||
|
|
||||||
// 生成维度数据
|
// 生成维度数据
|
||||||
List<Dimension> dimensions = Arrays.asList(
|
List<Dimension> dimensions = generateDimensions(answers);
|
||||||
new Dimension("E", "I", Math.round(100 - scores.getOrDefault("EI", 0.0)), Math.round(scores.getOrDefault("EI", 0.0))),
|
|
||||||
new Dimension("S", "N", Math.round(100 - scores.getOrDefault("SN", 0.0)), Math.round(scores.getOrDefault("SN", 0.0))),
|
|
||||||
new Dimension("T", "F", Math.round(100 - scores.getOrDefault("TF", 0.0)), Math.round(scores.getOrDefault("TF", 0.0))),
|
|
||||||
new Dimension("J", "P", Math.round(100 - scores.getOrDefault("JP", 0.0)), Math.round(scores.getOrDefault("JP", 0.0)))
|
|
||||||
);
|
|
||||||
|
|
||||||
// 生成个性化报告
|
// 生成个性化报告
|
||||||
String report = deepseekService.generateReport(mbtiType, dimensions);
|
String report = deepseekService.generateReport(mbtiType, dimensions);
|
||||||
|
|
||||||
// 创建结果对象
|
// 创建结果对象
|
||||||
Result result = new Result();
|
ResultM result = new ResultM();
|
||||||
result.setId(resultId);
|
result.setId(resultId);
|
||||||
result.setType(mbtiType);
|
result.setType(mbtiType);
|
||||||
result.setDimensions(dimensions);
|
result.setDimensions(dimensions);
|
||||||
|
@ -101,136 +108,99 @@ public class MbtiServiceImpl implements MbtiService {
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ResultVO getResult(String resultId) {
|
public ResultMVO getResult(String resultId) {
|
||||||
Result result = mbtiMapper.getResultById(resultId);
|
ResultM result = mbtiMapper.getResultById(resultId);
|
||||||
|
|
||||||
if (result == null) {
|
if (result == null) {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 转换为视图对象
|
// 转换为视图对象
|
||||||
ResultVO resultVO = new ResultVO();
|
ResultMVO resultMVO = new ResultMVO();
|
||||||
resultVO.setId(result.getId());
|
resultMVO.setId(result.getId());
|
||||||
resultVO.setType(result.getType());
|
resultMVO.setType(result.getType());
|
||||||
resultVO.setDimensions(result.getDimensions());
|
resultMVO.setDimensions(result.getDimensions());
|
||||||
resultVO.setReport(result.getReport());
|
resultMVO.setReport(result.getReport());
|
||||||
|
|
||||||
return resultVO;
|
return resultMVO;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// @Override
|
||||||
|
// public Object getResult(String resultId) {
|
||||||
|
// // 实现获取结果的逻辑
|
||||||
|
// return mbtiMapper.getResultById(resultId);
|
||||||
|
// }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 计算MBTI维度得分
|
||||||
|
*/
|
||||||
@Override
|
@Override
|
||||||
public Map<String, Double> calculateScores(List<Integer> answers, String testType) {
|
public Map<String, Double> calculateScores(Map<String, Integer> answers) {
|
||||||
Map<String, Double> scores = new HashMap<>();
|
// 在此示例中,我们直接将原始分数作为得分,因为输入已经是每个维度的得分
|
||||||
|
return Map.of(
|
||||||
// 根据测试类型确定题目范围
|
"E", (double) answers.getOrDefault("E", 0),
|
||||||
List<String> types;
|
"I", (double) answers.getOrDefault("I", 0),
|
||||||
switch (testType) {
|
"S", (double) answers.getOrDefault("S", 0),
|
||||||
case "simple":
|
"N", (double) answers.getOrDefault("N", 0),
|
||||||
types = Collections.singletonList("simple");
|
"T", (double) answers.getOrDefault("T", 0),
|
||||||
break;
|
"F", (double) answers.getOrDefault("F", 0),
|
||||||
case "detailed":
|
"J", (double) answers.getOrDefault("J", 0),
|
||||||
types = Arrays.asList("simple", "detailed");
|
"P", (double) answers.getOrDefault("P", 0)
|
||||||
break;
|
);
|
||||||
case "full":
|
|
||||||
types = Arrays.asList("simple", "detailed", "full");
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
log.warn("无效的测试类型: {}", testType);
|
|
||||||
return scores;
|
|
||||||
}
|
|
||||||
|
|
||||||
// 查询题目信息
|
|
||||||
List<Map<String, Object>> questions = mbtiMapper.getQuestionDimensionsAndDirections(types);
|
|
||||||
|
|
||||||
// 计算每个维度的得分
|
|
||||||
Map<String, ScoreInfo> dimensionScores = new HashMap<>();
|
|
||||||
|
|
||||||
for (int i = 0; i < Math.min(answers.size(), questions.size()); i++) {
|
|
||||||
Map<String, Object> question = questions.get(i);
|
|
||||||
String dimension = (String) question.get("dimension");
|
|
||||||
int direction = ((Number) question.get("direction")).intValue();
|
|
||||||
|
|
||||||
// 确保答案在1-7的范围内
|
|
||||||
int answer = answers.get(i);
|
|
||||||
if (answer < 1) answer = 1;
|
|
||||||
if (answer > 7) answer = 7;
|
|
||||||
|
|
||||||
// 计算得分(考虑题目方向)
|
|
||||||
double score;
|
|
||||||
if (direction == 1) {
|
|
||||||
score = (answer - 1) * (100.0 / 6.0); // 正向题目:将1-7线性映射到0-100
|
|
||||||
} else {
|
|
||||||
score = (7 - answer) * (100.0 / 6.0); // 反向题目:将7-1线性映射到0-100
|
|
||||||
}
|
|
||||||
|
|
||||||
// 确保得分在0-100范围内
|
|
||||||
if (score < 0) score = 0;
|
|
||||||
if (score > 100) score = 100;
|
|
||||||
|
|
||||||
// 累加分数
|
|
||||||
ScoreInfo scoreInfo = dimensionScores.getOrDefault(dimension, new ScoreInfo());
|
|
||||||
scoreInfo.setTotal(scoreInfo.getTotal() + score);
|
|
||||||
scoreInfo.setCount(scoreInfo.getCount() + 1);
|
|
||||||
dimensionScores.put(dimension, scoreInfo);
|
|
||||||
}
|
|
||||||
|
|
||||||
// 计算每个维度的最终得分
|
|
||||||
for (Map.Entry<String, ScoreInfo> entry : dimensionScores.entrySet()) {
|
|
||||||
String dim = entry.getKey();
|
|
||||||
ScoreInfo info = entry.getValue();
|
|
||||||
|
|
||||||
if (info.getCount() > 0) {
|
|
||||||
// 计算平均分并确保在0-100范围内
|
|
||||||
double avgScore = info.getTotal() / info.getCount();
|
|
||||||
if (avgScore < 0) avgScore = 0;
|
|
||||||
if (avgScore > 100) avgScore = 100;
|
|
||||||
scores.put(dim, (double) Math.round(avgScore));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return scores;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 根据得分确定MBTI类型
|
||||||
|
*/
|
||||||
@Override
|
@Override
|
||||||
public String determineMbtiType(Map<String, Double> scores) {
|
public String determineMbtiType(Map<String, Double> scores) {
|
||||||
StringBuilder mbtiType = new StringBuilder();
|
String attitude = scores.get("E") >= scores.get("I") ? "E" : "I";
|
||||||
|
String perception = scores.get("S") >= scores.get("N") ? "S" : "N";
|
||||||
|
String judgment = scores.get("T") >= scores.get("F") ? "T" : "F";
|
||||||
|
String lifestyle = scores.get("J") >= scores.get("P") ? "J" : "P";
|
||||||
|
|
||||||
// 当分数等于50时,默认选择第二个类型
|
return attitude + perception + judgment + lifestyle;
|
||||||
if (scores.getOrDefault("EI", 0.0) >= 50) {
|
|
||||||
mbtiType.append("E");
|
|
||||||
} else {
|
|
||||||
mbtiType.append("I");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (scores.getOrDefault("SN", 0.0) >= 50) {
|
/**
|
||||||
mbtiType.append("S");
|
* 生成维度数据
|
||||||
} else {
|
*/
|
||||||
mbtiType.append("N");
|
private static List<Dimension> generateDimensions(Map<String, Integer> scores) {
|
||||||
|
List<Dimension> dimensions = new ArrayList<>();
|
||||||
|
|
||||||
|
dimensions.add(normalizeDimension("E", "I", scores));
|
||||||
|
dimensions.add(normalizeDimension("S", "N", scores));
|
||||||
|
dimensions.add(normalizeDimension("T", "F", scores));
|
||||||
|
dimensions.add(normalizeDimension("J", "P", scores));
|
||||||
|
|
||||||
|
return dimensions;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (scores.getOrDefault("TF", 0.0) >= 50) {
|
/**
|
||||||
mbtiType.append("T");
|
* 归一化并生成单个维度的数据
|
||||||
|
*/
|
||||||
|
private static Dimension normalizeDimension(String left, String right, Map<String, Integer> scores) {
|
||||||
|
int leftScore = scores.getOrDefault(left, 0);
|
||||||
|
int rightScore = scores.getOrDefault(right, 0);
|
||||||
|
|
||||||
|
double total = leftScore + rightScore;
|
||||||
|
|
||||||
|
long leftValue = Math.round((leftScore / total) * 100);
|
||||||
|
long rightValue = Math.round((rightScore / total) * 100);
|
||||||
|
|
||||||
|
// 确保总和为100
|
||||||
|
if (leftValue + rightValue != 100) {
|
||||||
|
if (leftValue > rightValue) {
|
||||||
|
leftValue = 100 - rightValue;
|
||||||
} else {
|
} else {
|
||||||
mbtiType.append("F");
|
rightValue = 100 - leftValue;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (scores.getOrDefault("JP", 0.0) >= 50) {
|
return new Dimension(left, right, leftValue, rightValue);
|
||||||
mbtiType.append("J");
|
|
||||||
} else {
|
|
||||||
mbtiType.append("P");
|
|
||||||
}
|
|
||||||
|
|
||||||
return mbtiType.toString();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private String generateResultId() {
|
private String generateResultId() {
|
||||||
return "result_" + Instant.now().toEpochMilli();
|
return "result_" + Instant.now().toEpochMilli();
|
||||||
}
|
}
|
||||||
|
|
||||||
// 内部类用于存储每个维度的分数信息
|
|
||||||
@Data
|
|
||||||
private static class ScoreInfo {
|
|
||||||
private double total = 0;
|
|
||||||
private int count = 0;
|
|
||||||
}
|
|
||||||
}
|
}
|
|
@ -1,36 +1,46 @@
|
||||||
<?xml version="1.0" encoding="UTF-8" ?>
|
<?xml version="1.0" encoding="UTF-8" ?>
|
||||||
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
||||||
<mapper namespace="com.yang.test.mapper.MbtiMapper">
|
<mapper namespace="com.yang.test.mapper.MbtiMapper">
|
||||||
<!-- 获取题目列表 -->
|
<!-- 根据ID获取测试信息 -->
|
||||||
<select id="getQuestionsByTypes" resultType="com.yang.test.domain.Question">
|
<select id="getTestById" resultType="com.yang.test.domain.Test">
|
||||||
SELECT id, question, dimension, direction, type, created_at as createdAt
|
SELECT id, name FROM test WHERE id = #{id}
|
||||||
FROM questions
|
</select>
|
||||||
WHERE type IN
|
|
||||||
<foreach item="item" collection="list" open="(" separator="," close=")">
|
<!-- 获取测试的所有问题 -->
|
||||||
#{item}
|
<select id="getQuestionsByTestId" resultType="com.yang.test.domain.Question">
|
||||||
</foreach>
|
SELECT id, name, type, #{testId} as testId
|
||||||
|
FROM question
|
||||||
|
WHERE test_id = #{testId}
|
||||||
ORDER BY id
|
ORDER BY id
|
||||||
</select>
|
</select>
|
||||||
|
|
||||||
<!-- 获取题目的维度和方向信息 -->
|
<!-- 获取问题的所有选项 -->
|
||||||
<select id="getQuestionDimensionsAndDirections" resultType="java.util.Map">
|
<select id="getOptionsByQuestionId" resultType="com.yang.test.domain.Option">
|
||||||
SELECT id, dimension, direction
|
SELECT id, code, name, question_id as questionId, character_type as characterType
|
||||||
FROM questions
|
FROM option_table
|
||||||
WHERE type IN
|
WHERE question_id = #{questionId}
|
||||||
<foreach item="item" collection="list" open="(" separator="," close=")">
|
|
||||||
#{item}
|
|
||||||
</foreach>
|
|
||||||
ORDER BY id
|
ORDER BY id
|
||||||
</select>
|
</select>
|
||||||
|
|
||||||
|
<!-- 获取问题的所有选项(批量) -->
|
||||||
|
<select id="getOptionsByQuestionIds" resultType="com.yang.test.domain.Option">
|
||||||
|
SELECT id, code, name, question_id as questionId, character_type as characterType
|
||||||
|
FROM option_table
|
||||||
|
WHERE question_id IN
|
||||||
|
<foreach item="id" collection="questionIds" open="(" separator="," close=")">
|
||||||
|
#{id}
|
||||||
|
</foreach>
|
||||||
|
ORDER BY question_id, id
|
||||||
|
</select>
|
||||||
|
|
||||||
<!-- 保存测试结果 -->
|
<!-- 保存测试结果 -->
|
||||||
<insert id="saveResult" parameterType="com.yang.test.domain.Result">
|
<insert id="saveResult" parameterType="com.yang.test.domain.ResultM">
|
||||||
INSERT INTO results (id, type, dimensions, report, created_at)
|
INSERT INTO results (id, type, dimensions, report, created_at)
|
||||||
VALUES (#{id}, #{type}, #{dimensions, typeHandler=com.yang.test.util.JsonTypeHandler}, #{report}, #{createdAt})
|
VALUES (#{id}, #{type}, #{dimensions, typeHandler=com.yang.test.util.JsonTypeHandler}, #{report}, #{createdAt})
|
||||||
</insert>
|
</insert>
|
||||||
|
|
||||||
<!-- 根据ID获取结果 -->
|
<!-- 根据ID获取结果 -->
|
||||||
<select id="getResultById" resultType="com.yang.test.domain.Result">
|
<select id="getResultById" resultType="com.yang.test.domain.ResultM">
|
||||||
SELECT id, type, dimensions, report, created_at as createdAt
|
SELECT id, type, dimensions, report, created_at as createdAt
|
||||||
FROM results
|
FROM results
|
||||||
WHERE id = #{resultId}
|
WHERE id = #{resultId}
|
||||||
|
|
Loading…
Reference in New Issue