From 20c57a13d231bd59e3421ba072bf5a42e3de485e Mon Sep 17 00:00:00 2001 From: Haixing Hu Date: Thu, 20 Feb 2025 16:39:58 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=AE=8C=E6=88=90=E5=90=8E=E7=AB=AF?= =?UTF-8?q?=E5=BC=80=E5=8F=91=EF=BC=8C=E5=8C=85=E6=8B=AC=E9=A1=B9=E7=9B=AE?= =?UTF-8?q?=E8=A7=84=E5=88=99=E6=96=87=E6=A1=A3=E3=80=81=E7=94=A8=E6=88=B7?= =?UTF-8?q?=E7=AE=A1=E7=90=86=E3=80=81=E9=97=AE=E5=8D=B7=E7=AE=A1=E7=90=86?= =?UTF-8?q?=E3=80=81=E7=AD=94=E6=A1=88=E7=AE=A1=E7=90=86=E5=8A=9F=E8=83=BD?= =?UTF-8?q?=EF=BC=8C=E9=85=8D=E7=BD=AE=20Docker=20=E7=8E=AF=E5=A2=83?= =?UTF-8?q?=EF=BC=8C=E4=BF=AE=E5=A4=8D=E6=95=B0=E6=8D=AE=E5=BA=93=E8=BF=9E?= =?UTF-8?q?=E6=8E=A5=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .cursorrules | 62 +++++++ .gitignore | 36 ++++ backend/pom.xml | 29 +++- .../jackson/databind/JsonTypeHandler.java | 51 ++++++ .../common/mybatis/JsonTypeHandler.java | 52 ++++++ .../survey/mapper/SurveyResponseMapper.xml | 1 + .../src/main/resources/application.properties | 2 +- backend/src/main/resources/logback.xml | 54 ++++++ .../resources/mybatis/mapper/OptionMapper.xml | 10 +- .../mybatis/mapper/SurveyResponseMapper.xml | 8 +- .../main/resources/mybatis/mybatis-config.xml | 16 +- .../resources/spring/applicationContext.xml | 35 +++- .../src/main/resources/spring/spring-mvc.xml | 30 +++- .../main/resources/spring/spring-mybatis.xml | 29 +++- backend/src/main/webapp/WEB-INF/web.xml | 8 +- backend/target/classes/application.properties | 2 +- .../controller/GlobalExceptionHandler.class | Bin 5690 -> 5757 bytes .../controller/QuestionController.class | Bin 3157 -> 3170 bytes .../survey/controller/SurveyController.class | Bin 2039 -> 2042 bytes .../survey/controller/UserController.class | Bin 2553 -> 2547 bytes .../ltd/qubit/survey/dao/BaseDao.class | Bin 496 -> 573 bytes .../ltd/qubit/survey/dao/OptionDao.class | Bin 769 -> 872 bytes .../ltd/qubit/survey/dao/QuestionDao.class | Bin 791 -> 860 bytes .../qubit/survey/dao/SurveyResponseDao.class | Bin 842 -> 954 bytes .../ltd/qubit/survey/dao/UserDao.class | Bin 589 -> 649 bytes .../ltd/qubit/survey/model/ErrorInfo.class | Bin 3832 -> 3970 bytes .../ltd/qubit/survey/model/Option.class | Bin 4217 -> 4324 bytes .../ltd/qubit/survey/model/PositionType.class | Bin 1558 -> 1587 bytes .../ltd/qubit/survey/model/Question.class | Bin 5546 -> 5675 bytes .../ltd/qubit/survey/model/QuestionType.class | Bin 1203 -> 1232 bytes .../qubit/survey/model/SurveyResponse.class | Bin 4455 -> 4562 bytes .../classes/ltd/qubit/survey/model/User.class | Bin 4313 -> 4420 bytes .../ltd/qubit/survey/model/WorkArea.class | Bin 1725 -> 1754 bytes .../qubit/survey/service/BaseService.class | Bin 705 -> 782 bytes .../qubit/survey/service/OptionService.class | Bin 860 -> 963 bytes .../survey/service/QuestionService.class | Bin 1270 -> 1420 bytes .../service/SurveyResponseService.class | Bin 1316 -> 1443 bytes .../qubit/survey/service/UserService.class | Bin 885 -> 974 bytes .../service/impl/OptionServiceImpl.class | Bin 4157 -> 4260 bytes .../service/impl/QuestionServiceImpl$1.class | Bin 916 -> 916 bytes .../service/impl/QuestionServiceImpl.class | Bin 6790 -> 6905 bytes .../impl/SurveyResponseServiceImpl.class | Bin 6808 -> 6941 bytes .../survey/service/impl/UserServiceImpl.class | Bin 3187 -> 3286 bytes .../classes/mybatis/mapper/OptionMapper.xml | 10 +- .../mybatis/mapper/SurveyResponseMapper.xml | 8 +- .../target/classes/mybatis/mybatis-config.xml | 16 +- .../classes/spring/applicationContext.xml | 35 +++- backend/target/classes/spring/spring-mvc.xml | 30 +++- .../target/classes/spring/spring-mybatis.xml | 29 +++- .../compile/default-compile/createdFiles.lst | 2 + .../compile/default-compile/inputFiles.lst | 2 + doc/deployment.md | 74 ++++++++ pom.xml | 161 ------------------ .../controller/GlobalExceptionHandler.java | 78 --------- .../survey/controller/QuestionController.java | 62 ------- .../survey/controller/SurveyController.java | 58 ------- .../survey/controller/UserController.java | 55 ------ .../java/ltd/qubit/survey/dao/BaseDao.java | 51 ------ .../java/ltd/qubit/survey/dao/OptionDao.java | 43 ----- .../ltd/qubit/survey/dao/QuestionDao.java | 41 ----- .../qubit/survey/dao/SurveyResponseDao.java | 51 ------ .../java/ltd/qubit/survey/dao/UserDao.java | 27 --- .../ltd/qubit/survey/model/ErrorInfo.java | 65 ------- .../java/ltd/qubit/survey/model/Option.java | 40 ----- .../ltd/qubit/survey/model/PositionType.java | 36 ---- .../java/ltd/qubit/survey/model/Question.java | 50 ------ .../ltd/qubit/survey/model/QuestionType.java | 21 --- .../qubit/survey/model/SurveyResponse.java | 41 ----- .../java/ltd/qubit/survey/model/User.java | 40 ----- .../java/ltd/qubit/survey/model/WorkArea.java | 51 ------ .../ltd/qubit/survey/service/BaseService.java | 55 ------ .../qubit/survey/service/OptionService.java | 42 ----- .../qubit/survey/service/QuestionService.java | 54 ------ .../survey/service/SurveyResponseService.java | 64 ------- .../ltd/qubit/survey/service/UserService.java | 46 ----- .../service/impl/OptionServiceImpl.java | 73 -------- .../service/impl/QuestionServiceImpl.java | 128 -------------- .../impl/SurveyResponseServiceImpl.java | 111 ------------ .../survey/service/impl/UserServiceImpl.java | 72 -------- src/main/resources/application.properties | 18 -- .../resources/mybatis/mapper/OptionMapper.xml | 83 --------- .../mybatis/mapper/QuestionMapper.xml | 86 ---------- .../mybatis/mapper/SurveyResponseMapper.xml | 93 ---------- .../resources/mybatis/mapper/UserMapper.xml | 68 -------- src/main/resources/mybatis/mybatis-config.xml | 32 ---- .../resources/spring/applicationContext.xml | 24 --- src/main/resources/spring/spring-mvc.xml | 46 ----- src/main/resources/spring/spring-mybatis.xml | 39 ----- src/main/webapp/WEB-INF/web.xml | 57 ------- target/classes/application.properties | 18 -- .../controller/GlobalExceptionHandler.class | Bin 5690 -> 0 bytes .../controller/QuestionController.class | Bin 3157 -> 0 bytes .../survey/controller/SurveyController.class | Bin 2039 -> 0 bytes .../survey/controller/UserController.class | Bin 2553 -> 0 bytes .../ltd/qubit/survey/dao/BaseDao.class | Bin 496 -> 0 bytes .../ltd/qubit/survey/dao/OptionDao.class | Bin 769 -> 0 bytes .../ltd/qubit/survey/dao/QuestionDao.class | Bin 791 -> 0 bytes .../qubit/survey/dao/SurveyResponseDao.class | Bin 842 -> 0 bytes .../ltd/qubit/survey/dao/UserDao.class | Bin 589 -> 0 bytes .../ltd/qubit/survey/model/ErrorInfo.class | Bin 3832 -> 0 bytes .../ltd/qubit/survey/model/Option.class | Bin 4217 -> 0 bytes .../ltd/qubit/survey/model/PositionType.class | Bin 1558 -> 0 bytes .../ltd/qubit/survey/model/Question.class | Bin 5546 -> 0 bytes .../ltd/qubit/survey/model/QuestionType.class | Bin 1203 -> 0 bytes .../qubit/survey/model/SurveyResponse.class | Bin 4455 -> 0 bytes .../classes/ltd/qubit/survey/model/User.class | Bin 4313 -> 0 bytes .../ltd/qubit/survey/model/WorkArea.class | Bin 1725 -> 0 bytes .../qubit/survey/service/BaseService.class | Bin 705 -> 0 bytes .../qubit/survey/service/OptionService.class | Bin 860 -> 0 bytes .../survey/service/QuestionService.class | Bin 1270 -> 0 bytes .../service/SurveyResponseService.class | Bin 1316 -> 0 bytes .../qubit/survey/service/UserService.class | Bin 885 -> 0 bytes .../service/impl/OptionServiceImpl.class | Bin 4157 -> 0 bytes .../service/impl/QuestionServiceImpl$1.class | Bin 916 -> 0 bytes .../service/impl/QuestionServiceImpl.class | Bin 6790 -> 0 bytes .../impl/SurveyResponseServiceImpl.class | Bin 6808 -> 0 bytes .../survey/service/impl/UserServiceImpl.class | Bin 3187 -> 0 bytes .../classes/mybatis/mapper/OptionMapper.xml | 83 --------- .../classes/mybatis/mapper/QuestionMapper.xml | 86 ---------- .../mybatis/mapper/SurveyResponseMapper.xml | 93 ---------- target/classes/mybatis/mapper/UserMapper.xml | 68 -------- target/classes/mybatis/mybatis-config.xml | 32 ---- target/classes/spring/applicationContext.xml | 24 --- target/classes/spring/spring-mvc.xml | 46 ----- target/classes/spring/spring-mybatis.xml | 39 ----- .../compile/default-compile/createdFiles.lst | 27 --- .../compile/default-compile/inputFiles.lst | 26 --- 127 files changed, 568 insertions(+), 2767 deletions(-) create mode 100644 .cursorrules create mode 100644 .gitignore create mode 100644 backend/src/main/java/com/fasterxml/jackson/databind/JsonTypeHandler.java create mode 100644 backend/src/main/java/ltd/qubit/survey/common/mybatis/JsonTypeHandler.java create mode 100644 backend/src/main/java/ltd/qubit/survey/mapper/SurveyResponseMapper.xml create mode 100644 backend/src/main/resources/logback.xml create mode 100644 doc/deployment.md delete mode 100644 pom.xml delete mode 100644 src/main/java/ltd/qubit/survey/controller/GlobalExceptionHandler.java delete mode 100644 src/main/java/ltd/qubit/survey/controller/QuestionController.java delete mode 100644 src/main/java/ltd/qubit/survey/controller/SurveyController.java delete mode 100644 src/main/java/ltd/qubit/survey/controller/UserController.java delete mode 100644 src/main/java/ltd/qubit/survey/dao/BaseDao.java delete mode 100644 src/main/java/ltd/qubit/survey/dao/OptionDao.java delete mode 100644 src/main/java/ltd/qubit/survey/dao/QuestionDao.java delete mode 100644 src/main/java/ltd/qubit/survey/dao/SurveyResponseDao.java delete mode 100644 src/main/java/ltd/qubit/survey/dao/UserDao.java delete mode 100644 src/main/java/ltd/qubit/survey/model/ErrorInfo.java delete mode 100644 src/main/java/ltd/qubit/survey/model/Option.java delete mode 100644 src/main/java/ltd/qubit/survey/model/PositionType.java delete mode 100644 src/main/java/ltd/qubit/survey/model/Question.java delete mode 100644 src/main/java/ltd/qubit/survey/model/QuestionType.java delete mode 100644 src/main/java/ltd/qubit/survey/model/SurveyResponse.java delete mode 100644 src/main/java/ltd/qubit/survey/model/User.java delete mode 100644 src/main/java/ltd/qubit/survey/model/WorkArea.java delete mode 100644 src/main/java/ltd/qubit/survey/service/BaseService.java delete mode 100644 src/main/java/ltd/qubit/survey/service/OptionService.java delete mode 100644 src/main/java/ltd/qubit/survey/service/QuestionService.java delete mode 100644 src/main/java/ltd/qubit/survey/service/SurveyResponseService.java delete mode 100644 src/main/java/ltd/qubit/survey/service/UserService.java delete mode 100644 src/main/java/ltd/qubit/survey/service/impl/OptionServiceImpl.java delete mode 100644 src/main/java/ltd/qubit/survey/service/impl/QuestionServiceImpl.java delete mode 100644 src/main/java/ltd/qubit/survey/service/impl/SurveyResponseServiceImpl.java delete mode 100644 src/main/java/ltd/qubit/survey/service/impl/UserServiceImpl.java delete mode 100644 src/main/resources/application.properties delete mode 100644 src/main/resources/mybatis/mapper/OptionMapper.xml delete mode 100644 src/main/resources/mybatis/mapper/QuestionMapper.xml delete mode 100644 src/main/resources/mybatis/mapper/SurveyResponseMapper.xml delete mode 100644 src/main/resources/mybatis/mapper/UserMapper.xml delete mode 100644 src/main/resources/mybatis/mybatis-config.xml delete mode 100644 src/main/resources/spring/applicationContext.xml delete mode 100644 src/main/resources/spring/spring-mvc.xml delete mode 100644 src/main/resources/spring/spring-mybatis.xml delete mode 100644 src/main/webapp/WEB-INF/web.xml delete mode 100644 target/classes/application.properties delete mode 100644 target/classes/ltd/qubit/survey/controller/GlobalExceptionHandler.class delete mode 100644 target/classes/ltd/qubit/survey/controller/QuestionController.class delete mode 100644 target/classes/ltd/qubit/survey/controller/SurveyController.class delete mode 100644 target/classes/ltd/qubit/survey/controller/UserController.class delete mode 100644 target/classes/ltd/qubit/survey/dao/BaseDao.class delete mode 100644 target/classes/ltd/qubit/survey/dao/OptionDao.class delete mode 100644 target/classes/ltd/qubit/survey/dao/QuestionDao.class delete mode 100644 target/classes/ltd/qubit/survey/dao/SurveyResponseDao.class delete mode 100644 target/classes/ltd/qubit/survey/dao/UserDao.class delete mode 100644 target/classes/ltd/qubit/survey/model/ErrorInfo.class delete mode 100644 target/classes/ltd/qubit/survey/model/Option.class delete mode 100644 target/classes/ltd/qubit/survey/model/PositionType.class delete mode 100644 target/classes/ltd/qubit/survey/model/Question.class delete mode 100644 target/classes/ltd/qubit/survey/model/QuestionType.class delete mode 100644 target/classes/ltd/qubit/survey/model/SurveyResponse.class delete mode 100644 target/classes/ltd/qubit/survey/model/User.class delete mode 100644 target/classes/ltd/qubit/survey/model/WorkArea.class delete mode 100644 target/classes/ltd/qubit/survey/service/BaseService.class delete mode 100644 target/classes/ltd/qubit/survey/service/OptionService.class delete mode 100644 target/classes/ltd/qubit/survey/service/QuestionService.class delete mode 100644 target/classes/ltd/qubit/survey/service/SurveyResponseService.class delete mode 100644 target/classes/ltd/qubit/survey/service/UserService.class delete mode 100644 target/classes/ltd/qubit/survey/service/impl/OptionServiceImpl.class delete mode 100644 target/classes/ltd/qubit/survey/service/impl/QuestionServiceImpl$1.class delete mode 100644 target/classes/ltd/qubit/survey/service/impl/QuestionServiceImpl.class delete mode 100644 target/classes/ltd/qubit/survey/service/impl/SurveyResponseServiceImpl.class delete mode 100644 target/classes/ltd/qubit/survey/service/impl/UserServiceImpl.class delete mode 100644 target/classes/mybatis/mapper/OptionMapper.xml delete mode 100644 target/classes/mybatis/mapper/QuestionMapper.xml delete mode 100644 target/classes/mybatis/mapper/SurveyResponseMapper.xml delete mode 100644 target/classes/mybatis/mapper/UserMapper.xml delete mode 100644 target/classes/mybatis/mybatis-config.xml delete mode 100644 target/classes/spring/applicationContext.xml delete mode 100644 target/classes/spring/spring-mvc.xml delete mode 100644 target/classes/spring/spring-mybatis.xml delete mode 100644 target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst delete mode 100644 target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst diff --git a/.cursorrules b/.cursorrules new file mode 100644 index 0000000..06a625d --- /dev/null +++ b/.cursorrules @@ -0,0 +1,62 @@ +# 项目规则文档 + +## 1. 日志查看规则 +- 不允许使用 `tail -f` 命令查看日志文件 +- 应该使用 `tail` 命令查看日志内容 +- 查看日志直接查看项目本身的日志,而非tomcat的日志 + +## 2. 项目结构规则 +- 后端项目目录:`backend/` +- 前端项目目录:`frontend/` +- 数据库脚本目录:`database/` +- 文档目录:`doc/` + +## 3. 构建和部署规则 +- 使用 Maven 构建后端项目:`mvn clean package -DskipTests` +- Tomcat 运行在 Docker 容器中: + - 端口映射:18080 + - 数据目录:`$DOCKER_DATA_DIR/tomcat` + - 日志目录:`$DOCKER_DATA_DIR/tomcat/logs` + - WAR包目录:`$DOCKER_DATA_DIR/tomcat/webapps` +- 应用上下文路径:`/llm-survey-api` +- 复制文件时,使用 `command cp` 命令 + +## 4. 数据库规则 +- 数据库名称:`llm_survey` +- 数据库用户:`dev` +- 数据库地址:`127.0.0.1:3306` +- 使用 `init_database.sh` 脚本初始化数据库 + +## 5. 代码规范 +- Java源代码使用UTF-8编码 +- 使用Lombok简化代码 +- DAO层继承BaseDao接口 +- Service层继承BaseService接口 +- 控制器使用RestController注解 + +## 6. Spring配置规则 +- 共享的bean定义放在 `applicationContext.xml` +- MVC相关配置放在 `spring-mvc.xml` +- MyBatis相关配置放在 `spring-mybatis.xml` +- 避免重复的bean定义 + +## 7. 错误处理规则 +- 使用统一的错误处理格式(ErrorInfo) +- 所有异常由GlobalExceptionHandler处理 +- 业务异常使用IllegalArgumentException + +## 8. API规范 +- RESTful API设计 +- 统一的响应格式 +- 支持跨域访问 +- API文档位于 `doc/api.md` + +## 9. 安全规则 +- 不在代码中硬编码敏感信息 +- 配置信息放在properties文件中 +- 使用prepared statement防止SQL注入 + +## 10. 版本控制 +- 使用Git进行版本控制 +- 遵循语义化版本规范 +- 重要配置文件加入版本控制 \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..af3535d --- /dev/null +++ b/.gitignore @@ -0,0 +1,36 @@ +# Maven +target/ +*.war +*.jar +*.ear +.classpath +.project +.settings/ + +# Node.js +node_modules/ +npm-debug.log* +yarn-debug.log* +yarn-error.log* +.pnpm-debug.log* +dist/ +.cache/ + +# IDE - VSCode +.vscode/ +*.code-workspace +.history/ + +# IDE - IntelliJ IDEA +.idea/ +*.iml +*.iws +*.ipr + +# Logs +logs/ +*.log + +# OS +.DS_Store +Thumbs.db \ No newline at end of file diff --git a/backend/pom.xml b/backend/pom.xml index f7deefc..1405523 100644 --- a/backend/pom.xml +++ b/backend/pom.xml @@ -14,16 +14,18 @@ ${java.version} ${java.version} UTF-8 - 5.3.31 + 6.1.4 3.5.15 - 2.1.2 + 3.0.3 8.3.0 5.1.0 2.16.1 1.18.30 2.0.11 1.4.14 - 4.0.1 + 6.0.0 + 5.3.3 + 1.9.21 @@ -82,6 +84,13 @@ ${jackson.version} + + + com.github.pagehelper + pagehelper + ${pagehelper.version} + + org.projectlombok @@ -104,11 +113,18 @@ - javax.servlet - javax.servlet-api + jakarta.servlet + jakarta.servlet-api ${servlet-api.version} provided + + + + org.aspectj + aspectjweaver + ${aspectj.version} + @@ -122,6 +138,9 @@ ${java.version} ${project.build.sourceEncoding} + + -parameters + org.projectlombok diff --git a/backend/src/main/java/com/fasterxml/jackson/databind/JsonTypeHandler.java b/backend/src/main/java/com/fasterxml/jackson/databind/JsonTypeHandler.java new file mode 100644 index 0000000..b7ceb08 --- /dev/null +++ b/backend/src/main/java/com/fasterxml/jackson/databind/JsonTypeHandler.java @@ -0,0 +1,51 @@ +package com.fasterxml.jackson.databind; + +import java.sql.CallableStatement; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import org.apache.ibatis.type.BaseTypeHandler; +import org.apache.ibatis.type.JdbcType; + +/** + * 自定义的 JSON 类型处理器 + */ +public class JsonTypeHandler extends BaseTypeHandler { + private static final ObjectMapper MAPPER = new ObjectMapper(); + + @Override + public void setNonNullParameter(PreparedStatement ps, int i, Object parameter, JdbcType jdbcType) + throws SQLException { + try { + ps.setString(i, MAPPER.writeValueAsString(parameter)); + } catch (Exception e) { + throw new SQLException("Error converting JSON to String", e); + } + } + + @Override + public Object getNullableResult(ResultSet rs, String columnName) throws SQLException { + return parse(rs.getString(columnName)); + } + + @Override + public Object getNullableResult(ResultSet rs, int columnIndex) throws SQLException { + return parse(rs.getString(columnIndex)); + } + + @Override + public Object getNullableResult(CallableStatement cs, int columnIndex) throws SQLException { + return parse(cs.getString(columnIndex)); + } + + private Object parse(String json) throws SQLException { + try { + if (json == null || json.isEmpty()) { + return null; + } + return MAPPER.readValue(json, Object.class); + } catch (Exception e) { + throw new SQLException("Error converting String to JSON", e); + } + } +} \ No newline at end of file diff --git a/backend/src/main/java/ltd/qubit/survey/common/mybatis/JsonTypeHandler.java b/backend/src/main/java/ltd/qubit/survey/common/mybatis/JsonTypeHandler.java new file mode 100644 index 0000000..7325edf --- /dev/null +++ b/backend/src/main/java/ltd/qubit/survey/common/mybatis/JsonTypeHandler.java @@ -0,0 +1,52 @@ +package ltd.qubit.survey.common.mybatis; + +import java.sql.CallableStatement; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import org.apache.ibatis.type.BaseTypeHandler; +import org.apache.ibatis.type.JdbcType; +import com.fasterxml.jackson.databind.ObjectMapper; + +/** + * 自定义的 JSON 类型处理器 + */ +public class JsonTypeHandler extends BaseTypeHandler { + private static final ObjectMapper MAPPER = new ObjectMapper(); + + @Override + public void setNonNullParameter(PreparedStatement ps, int i, Object parameter, JdbcType jdbcType) + throws SQLException { + try { + ps.setString(i, MAPPER.writeValueAsString(parameter)); + } catch (Exception e) { + throw new SQLException("Error converting JSON to String", e); + } + } + + @Override + public Object getNullableResult(ResultSet rs, String columnName) throws SQLException { + return parse(rs.getString(columnName)); + } + + @Override + public Object getNullableResult(ResultSet rs, int columnIndex) throws SQLException { + return parse(rs.getString(columnIndex)); + } + + @Override + public Object getNullableResult(CallableStatement cs, int columnIndex) throws SQLException { + return parse(cs.getString(columnIndex)); + } + + private Object parse(String json) throws SQLException { + try { + if (json == null || json.isEmpty()) { + return null; + } + return MAPPER.readValue(json, Object.class); + } catch (Exception e) { + throw new SQLException("Error converting String to JSON", e); + } + } +} \ No newline at end of file diff --git a/backend/src/main/java/ltd/qubit/survey/mapper/SurveyResponseMapper.xml b/backend/src/main/java/ltd/qubit/survey/mapper/SurveyResponseMapper.xml new file mode 100644 index 0000000..aecc2ca --- /dev/null +++ b/backend/src/main/java/ltd/qubit/survey/mapper/SurveyResponseMapper.xml @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/backend/src/main/resources/application.properties b/backend/src/main/resources/application.properties index df235fd..82da790 100644 --- a/backend/src/main/resources/application.properties +++ b/backend/src/main/resources/application.properties @@ -1,6 +1,6 @@ # 数据库配置 jdbc.driver=com.mysql.cj.jdbc.Driver -jdbc.url=jdbc:mysql://127.0.0.1:3306/llm_survey?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai +jdbc.url=jdbc:mysql://host.docker.internal:3306/llm_survey?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai jdbc.username=dev jdbc.password= diff --git a/backend/src/main/resources/logback.xml b/backend/src/main/resources/logback.xml new file mode 100644 index 0000000..e318e4b --- /dev/null +++ b/backend/src/main/resources/logback.xml @@ -0,0 +1,54 @@ + + + + + + + + + %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + UTF-8 + + + + + + ${LOG_HOME}/app.log + + + ${LOG_HOME}/app.%d{yyyy-MM-dd}.log + + 30 + + + %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + UTF-8 + + + + + + + 0 + + 512 + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/backend/src/main/resources/mybatis/mapper/OptionMapper.xml b/backend/src/main/resources/mybatis/mapper/OptionMapper.xml index 51ae85e..a0533ce 100644 --- a/backend/src/main/resources/mybatis/mapper/OptionMapper.xml +++ b/backend/src/main/resources/mybatis/mapper/OptionMapper.xml @@ -2,7 +2,7 @@ - + @@ -52,21 +52,21 @@ - SELECT FROM options WHERE id = #{id} - SELECT FROM options ORDER BY question_id, option_code - SELECT FROM options WHERE question_id = #{questionId} @@ -74,7 +74,7 @@ - SELECT FROM options WHERE question_id = #{questionId} diff --git a/backend/src/main/resources/mybatis/mapper/SurveyResponseMapper.xml b/backend/src/main/resources/mybatis/mapper/SurveyResponseMapper.xml index c7b0430..c7347fe 100644 --- a/backend/src/main/resources/mybatis/mapper/SurveyResponseMapper.xml +++ b/backend/src/main/resources/mybatis/mapper/SurveyResponseMapper.xml @@ -6,7 +6,7 @@ - + @@ -19,7 +19,7 @@ INSERT INTO survey_responses (user_id, question_id, selected_options, text_answer) - VALUES (#{userId}, #{questionId}, #{selectedOptions,typeHandler=org.apache.ibatis.type.JsonTypeHandler}, #{textAnswer}) + VALUES (#{userId}, #{questionId}, #{selectedOptions,typeHandler=com.fasterxml.jackson.databind.JsonTypeHandler}, #{textAnswer}) @@ -28,7 +28,7 @@ VALUES (#{item.userId}, #{item.questionId}, - #{item.selectedOptions,typeHandler=org.apache.ibatis.type.JsonTypeHandler}, + #{item.selectedOptions,typeHandler=com.fasterxml.jackson.databind.JsonTypeHandler}, #{item.textAnswer}) @@ -38,7 +38,7 @@ UPDATE survey_responses SET user_id = #{userId}, question_id = #{questionId}, - selected_options = #{selectedOptions,typeHandler=org.apache.ibatis.type.JsonTypeHandler}, + selected_options = #{selectedOptions,typeHandler=com.fasterxml.jackson.databind.JsonTypeHandler}, text_answer = #{textAnswer} WHERE id = #{id} diff --git a/backend/src/main/resources/mybatis/mybatis-config.xml b/backend/src/main/resources/mybatis/mybatis-config.xml index 59d59f2..431d9e2 100644 --- a/backend/src/main/resources/mybatis/mybatis-config.xml +++ b/backend/src/main/resources/mybatis/mybatis-config.xml @@ -12,6 +12,12 @@ + + + + + + + + + - - - - - + \ No newline at end of file diff --git a/backend/src/main/resources/spring/applicationContext.xml b/backend/src/main/resources/spring/applicationContext.xml index 96c3210..14c8c55 100644 --- a/backend/src/main/resources/spring/applicationContext.xml +++ b/backend/src/main/resources/spring/applicationContext.xml @@ -3,16 +3,32 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx" + xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/tx - http://www.springframework.org/schema/tx/spring-tx.xsd"> + http://www.springframework.org/schema/tx/spring-tx.xsd + http://www.springframework.org/schema/aop + http://www.springframework.org/schema/aop/spring-aop.xsd"> + + + + + + + + + + NON_NULL + + + @@ -21,4 +37,21 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/backend/src/main/resources/spring/spring-mvc.xml b/backend/src/main/resources/spring/spring-mvc.xml index efabb13..b90005a 100644 --- a/backend/src/main/resources/spring/spring-mvc.xml +++ b/backend/src/main/resources/spring/spring-mvc.xml @@ -20,27 +20,39 @@ - - - - - - - - + + + + application/json;charset=UTF-8 + + + + + + + + text/plain;charset=UTF-8 + text/html;charset=UTF-8 + + + + + + + \ No newline at end of file diff --git a/backend/src/main/resources/spring/spring-mybatis.xml b/backend/src/main/resources/spring/spring-mybatis.xml index 8c7889f..b3d611a 100644 --- a/backend/src/main/resources/spring/spring-mybatis.xml +++ b/backend/src/main/resources/spring/spring-mybatis.xml @@ -1,8 +1,11 @@ + http://www.springframework.org/schema/beans/spring-beans.xsd + http://www.springframework.org/schema/tx + http://www.springframework.org/schema/tx/spring-tx.xsd"> @@ -16,13 +19,35 @@ + + + + + + - + + + + + + + + + helperDialect=mysql + reasonable=true + supportMethodsArguments=true + params=count=countSql + + + + + diff --git a/backend/src/main/webapp/WEB-INF/web.xml b/backend/src/main/webapp/WEB-INF/web.xml index 6662b81..92144a5 100644 --- a/backend/src/main/webapp/WEB-INF/web.xml +++ b/backend/src/main/webapp/WEB-INF/web.xml @@ -1,9 +1,9 @@ - + xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee + https://jakarta.ee/xml/ns/jakartaee/web-app_6_0.xsd" + version="6.0"> LLM Survey API diff --git a/backend/target/classes/application.properties b/backend/target/classes/application.properties index df235fd..82da790 100644 --- a/backend/target/classes/application.properties +++ b/backend/target/classes/application.properties @@ -1,6 +1,6 @@ # 数据库配置 jdbc.driver=com.mysql.cj.jdbc.Driver -jdbc.url=jdbc:mysql://127.0.0.1:3306/llm_survey?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai +jdbc.url=jdbc:mysql://host.docker.internal:3306/llm_survey?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai jdbc.username=dev jdbc.password= diff --git a/backend/target/classes/ltd/qubit/survey/controller/GlobalExceptionHandler.class b/backend/target/classes/ltd/qubit/survey/controller/GlobalExceptionHandler.class index d2cda049d7af0761d6fd23d1f1133f08b38f942d..50970f9aa52a86e0dc9c0357c9769dc27bb48926 100644 GIT binary patch delta 550 zcmaKpM@vIN6ot>|r0{&0rzWT%5=0S11aYCLaba0m_pU?(f=JYur5h1+=VHLEy?38A z_TFpky{z2n4^X@>J0S{lXU@HI?l&`xJN_$P+WU4d0kGk1Tx#JgL$vc`p5-XBtJgeJ z7o_CdYs(#FMI|*QmG)YDjZ+PivUTQl2?f}YF$cGzjctY$>NJZ6Q*6?%wz(%`8chnC zj5uWAEX~S{IM!6Em6`N7m2d`+0p~IxRcR{d-17w_!C2nC{#j4 zo1zbJM&~&k6|O1+Uc^UGJ>$X|tj6gWTImJd6n^MIFRg)K=%eT_1}jAysR0avi<}T= z`VeIikWr0J@^_K@7hu>2Kx-MnC;{F>T%qdBt0FsO!*2$6gW=ck5#N; b)2p_ygMD0)=fFE3;emV-<&SvAE5d&Ogi?Rd delta 480 zcmZvZIZFdU7>3{3Yz~Gcmz#i~F$j_-3c(^0Nt0Ia57=p8Et=n8upO|miT8cPH6HPb zXEff%+j#y5I~Bj(QWoYL-goAGW@Pt*} zo@!^>N71L=jaCxI&Fb`sT5MEK+Wy95`i=S#yv%aIULZkhyHQU?cwq}L%=X0Z#%PyKCf0IVH9K3s1pq1 zR1a)E!;f(fPPGFT+4 zpeE}z6KctX(%c+b(c_EymN7&f0S>H?Vzf?=D)PR#J!h=03)$b$vO!wHrg4&u?$AGH jo2nKvE?_|(JJ>hW0SYMMjxs04e1?M7~jHJFp-1dP*c@^SAT!iyazr5{PpMY8NeV;?)igMt0pxwr)N`{LgrL6 zwSpmDq!^NSYANo@X~un(p5miJW({gw*G
%IL&b&&xtc>;95$rASj3WwCB=bVjy>!FJzJC5!OKj z|7Zezq{iruSP4oNYrG0;;y){ZNn*Y6Zg&i|^w5u(P(0zADNNHiKmaqCg@ie(z2ssk zNm5FFHBx!@DJo|uEZ_Mmz6)jFda1I5wTboZK#IJ&2#};KQC7sAC&=o=lc%k*Y~;2< yh6)9$%1ggoe0$pa`eDa1b=$B~wsa7EmCkDvrCE1~wT?|}BTEV=MZ+=jX!->&0AAAo delta 527 zcmZut$xZ@66s!ls0L=tZVn7cr2aF2|2bYMr?;GyozM!C@i8DBOGX8=G`=VcA3>V|U zo5pz85Afn&7@v$9V?1(_tm=yWouB9qzh(Jp#q9C;KDmKK>&aap24nCbLAQN5aX3j}W^e`awLW3fQ zL@hNG1p0mn^#3C;@K+#+K^Axv&F&bAc_4t8R6W(}Lm1`^KoBDsg&kvzH8!-Eab~QP z@qbJv3MPL0Pf9DRb=PAOBriN+^2>Wqjp`Gh-*&Fm4YWhS3>(-mTM#W_G{^Nk>sae2 Yu<#XQodYal8EZ&0Be-J+d)PfyqER6G;WzFOdtkR6ElX=)Q85Jg*vDrFuGBL;l4OawWH6UhU zP-oBp(tHez44Oc!70tj{%%IJn0~F(B0t)B?8H@~iU{aq!fPr=LQZ@}n?aAlZ6wO%~ z!Dd0sF@T$62sg(FYz{jk+#F-D3DWEujAlR+#2rl-6o7K7K+}O{nE)x=W|^X!CBb0E nz%+RxyE>!bYVt286aW-1_1_^$&=YM7} zh!qPTz}CVSu(9sSM*LN1A{Hn2+;ji={ZH<@UeVR3kB3J9actkJQNgcGJLUaCcFr!^ zM^4!(mUzFAk$mQ9$tm({;mxO3t$CiyUNA&>N(}LP(USDLtvna3STzI1(BX6fCM(!m^ANFIKU3w$hI;fu(Q6mY5Gzi{53B!|HBe&>R#`)6C)TrKurRe~wuUiMV+{Yx82!r#U<@uk z=m|27=RB?cp9*ehn)>xI{L&M$42YN@pbL}LViN6{qI;6$CBFax)0o9P)+tdbNn;aR GX!!&{ZcXz5 delta 491 zcmZvY$xZ@65QhJ9V1{Xl5{M>xK#dZGn1C7u754=+Fq`&hwU?G)%K_b}~v3VZ$th&#ipfB6y~YMccB=hMCOU zr^TG*!Rocz+O{rGhYdI8k?_b1_ z6&2@K69!pVkmFoG$cbO%Bo7HwXlLY;t7m?&23220)nghn|DtC9q5_x$$++I#>8(MD zDoVf!732|>f09>va4rM~7C1&77QeH4SuL?&uI61qlD(UK8VXWa!zMD^5!}h*5XWfw E0$PPhT>t<8 diff --git a/backend/target/classes/ltd/qubit/survey/dao/BaseDao.class b/backend/target/classes/ltd/qubit/survey/dao/BaseDao.class index 402bc79709ed1925de1ed2ddbaa44858ad049240..dddfd3fbee6312fc18205bb6b0fcc4b465f3b329 100644 GIT binary patch delta 192 zcmeysyqAUR)W2Q(7#J9A86+lhMN0|zrj}&nrvxMxCFZ7J!OFff$?3=9mm3{n%hrpXETrj}&nrvxMxCFZ7$})I zK+MFz!@|hG%fJU@fuuN@z*78hX#t?LAcGK88mLnkE+qn#5@ir$U_>^Q32Ll3g9O-k FNdT;tBOU+% delta 103 zcmaFC*2uff$?3=9mm3}O?xrcFGsoH25;E~EM6HH;pU|1o}dW@O+5$}%xH z%}q)znz(uiCr5dHQMO}IYT{;J#&*U?CI(KR39O6^TtJE&h?y98SQr_28Tf!Ks1!e3 eN&qM&$RNbP2vsT!J delta 114 zcmdnReu|Cj)W2Q(7#J9A8N?@Y&6;>1cd`}Z?ahiz+>F7D44gm-CI&7RMh0#M4hCdC g4+Afp&j*y}XApq%1%Z4a24S#XhzTMLqF|mF0Db=qHUIzs diff --git a/backend/target/classes/ltd/qubit/survey/dao/UserDao.class b/backend/target/classes/ltd/qubit/survey/dao/UserDao.class index 9e1eb3a44dcf02d93105ae154440f90745efcb95..60e72fc284375f7934102a49dfe69ccd0824132b 100644 GIT binary patch delta 139 zcmX@h(#gto>ff$?3=9mm3?dV`rb-Iff$?3=9mm41yE6rcT^7cXATrGi^o&PM{bQ0~ZS;12+Q?1B}lL6obg{ KG4O*`2mk;=q6(e> diff --git a/backend/target/classes/ltd/qubit/survey/model/ErrorInfo.class b/backend/target/classes/ltd/qubit/survey/model/ErrorInfo.class index 2cd8f6408da77ef0b8c9e4a4fcd3927b9a793774..fb52328af314ed47238dbd7ec5c500655bae096e 100644 GIT binary patch delta 693 zcmY+Cy-QnB7{;G-Z|+Afxe_ZPY7=djN<%{<1foPxS_Fqcp*Z;6SkuO)R!!pfchbQ@ zbU3p(6ep+BMIA(ODLQs>?Cw9%rNt-5rcH+Pp68tNoZtJN_ugNDLW^_t=kyFf7m8n< z8@<+_NafSh6R(olkXGDn5aR?7~nNQkV8z-8+m-c1DGVW@uY+`1Q&iTTxGkivV|&bA!YL`Tb)x$3s>60 z%JvWeCLOA>MbQ2~X++uT6zxluEm}#7D%%Tmkap|bX39@E#|TDAtH%+>_)v}PUA*C* zju^I)r1GF28H`gI>|_dWsZ1=R7ZX$#Hqp)9QP?=ZBfO*X;t-g@Th*?>v>3de@X8GYX%-6o#L>yEAuY*jY#jZitR(Bm zz~>Mpc^KkU>y375N7`CXs?F}whT7Ub5_xXy(uS#|p1tW@zH6uF(e~UKj%#kJt5xr0 zX>yGT&GoUyq`oa9m-kGmm*p7mxGu_Zg}dAkdDOVYw8&?XbIgb=D~xed6tK!c=@W!} zVlT6zh&lbQ5qfO!mx9H_o9wZ;@A;C=X~R~YY+UZ{mqJTMfsjy)lxqSEe!H(}^CCl)Hr@9C7 Sf1&Fc%X-p@@tQhs>HiPXoMRRM diff --git a/backend/target/classes/ltd/qubit/survey/model/Option.class b/backend/target/classes/ltd/qubit/survey/model/Option.class index 3fef50a92fe26fb0449c2105b6f4ce8e42ef4d1d..72db59095c605ac5efb0fc744351a64fb203fd29 100644 GIT binary patch delta 546 zcmYL`KTH#09EP9o`se7Cmf8djF%nT3U_&<(2`tD`LQ$bYQ7Tkh5v!$u6%`a2bW!sS zE-tV+8Pn)sjESowE+$S!62r(uOpM{>qI9_2^F4X<``-KA@1vV--j}~0J^^P~ed}!n z4kS|fN})70m@DUI@|ApfwzeHO<(NCRJv#@i^m-~(M^T0j{e>D&7xZ4?AF|^tV zx3%`#-7&_oYmwe$T2n)YCfj`+HRV>q>Rw971wGNumA{36Q$4k!4=xLklvHn=1Ta+Y^o7KKRhh6z!a z8$2f`aw+qaE20KoFwLYW!b|c@i9FuZCmz$cex!%1qDH>c#x+rlA0CG(2;&rOG?xCq znNigYDy5osGIlzVRmAXbZCMg_J@zwoUDp|vT2q;6Rrh$sjDi7~&WpHDsyc)?4{e1c0XxVrz#ymmF4@si98Ig-^Uuk=z?NRcW5AjyZRSIeuX*<+Oe3CY&GJg8Kw4x;&mTJk D8`xA8 diff --git a/backend/target/classes/ltd/qubit/survey/model/PositionType.class b/backend/target/classes/ltd/qubit/survey/model/PositionType.class index 1c29a1b186d7c535fabddd6ea7bc3dd0d3cbf5ca..9bd1a873d2e5c2c5b4e904055464fdfeb44f4891 100644 GIT binary patch delta 122 zcmbQnvzbTW)W2Q(7#J9A8GP9pm>3z9Cl@j)Z#4eFB+aFgnpc{ul9!m9%E-VA;p7*k zWacI2Y}RDXV`Q|SJcA`c(n)}U!5N5EfrhvMF%yF;10#bQgZpGb)>>u{2G7Y8S3z9Cl@j)Z#4eFwAq6>hmnzC@>Z4vNd^I+3J?YY lCm?2GaAsg+aA9zrtjAi*?8e|ec^zvRKSaiZ!4s^)3jpt^5sv@> diff --git a/backend/target/classes/ltd/qubit/survey/model/Question.class b/backend/target/classes/ltd/qubit/survey/model/Question.class index 737203d8030e8b90f63b28f6889702ddc208f963..6fbbc0a20ffc759a6d399238048899199c043f74 100644 GIT binary patch delta 651 zcmYL{OGs2<7>1w!%>6jdO+?H<%EpBgRI?P4+7tvrv`bnv<>*wJIWt|&EVKJfJC$9n zgf>$UaVRjNT^pAs1hs12u3ekzokMvR|2fb9@bUfM`=3+GyMd4FBmFxI<-%~WS}a%GzR-?h~XHP5}i15ta zV9#5|a+cy-GyByuWN09Tp`Rj_v#N1LCp|sDp!7apH+j0m0qL5rTReS`L()He-R9{b zhNZg`E4|x2ec0FW+pk8niQi@xskbeT3{y@|dhq{!k19@(u6i8jRk}M> zQHkN-$Ec8Uf23PY;Q|+BLwwl~3ev-z=BsDit%I(K!n%hN*F_O- zDftailp1+%ieh}CMZTVK$}Ki67&Gm(HxFcI^e0%{#?d>fWAAC*;jwnM=m}4GPU~NF C5O=o# delta 530 zcmW;J%TE(g6vy%JX*->EEG^U!Lo_6!-L!6CWlS_06LsUp9j-JWprTbCzOW(|pQwP> z7YK?=abe6vBgVLM<5EdTG$C<;|AQO#H?x@B&zw1vbAR`~-nLi?zW)9A8Q96ox4|JV zta=BM_RxLE)bfu5p77LXCdXlB-QMi?)Vxu0)ody4^TKEqTf?qkEMex>a(jHEi*C$q zZ-{)19(f{mFMaZA?Bkq}+w)P+N&4mS*r($DmDs1Ls$MQcJsniAuvQqc(KDRIXts6+ zI6{K0*2bV}Ny@f~At}Xv{xK|h9OMt@q_l?o;JoDPzhy2+8K!y1MJcP4Z@44{yl09L zX&s-q!(}PQPi?X$HSnuLnXZU=gMExj1xvG=t5Tzt*vy#JWED1YO)64%ubO)O6y+#` zYb);X22{7Ozu00&$GNUF9xL3C5}N;woBEt&3rpORQtaY6we^G3W=MxQA^A)y z<6SAkqK@gFl;sN>xGx3N!{6(d%qHDJb5ChXmz+@O2U;^4`$&)Dncf0vPGc5m`44ru BY%u@; diff --git a/backend/target/classes/ltd/qubit/survey/model/QuestionType.class b/backend/target/classes/ltd/qubit/survey/model/QuestionType.class index b0999d6e78518a5b0ef47f84a73337f56bcaf997..1816eebac508d7e1167ba25b079b55b3df2d4b71 100644 GIT binary patch delta 111 zcmdnYd4W^l)W2Q(7#J9A87$cum>3z9Ck85SG>&1C=2A(`E6r8OOUzAWWZ;Ex@{3Y3 z^AdA5_cF;bGU`rV!|cg#D8RsA1jNQbGng1mCbO_OFq;Btca~Uwh?p6JIatmD0AIiu A2><{9 delta 83 zcmcb>xtUYo)W2Q(7#J9A8O+%km>3z9Ck85SG>&1~yoO1Jk&$8YNoG%e1_7V~AT|V2 bObkYo6)3q+-(R1gHT6u%XvN1Stx^OFBGmB996SjEQ{SFv+-R3vcDREDHF<0287VpE;=iCEaF~ zPR*BSAc8FqKZ*N0?JkHNCV^) zHa30%4cS0Jj32-f8WJl)K|w)FWq5XrIrGc=p7%0yR&ibK|NVdZ2YANUBfl+@%|zB5 zvt(~$>2Sqol`k%90nM!2KKI;g*;=pK>|}erO2-(xGRDF}L=%r6i1i9)e$}!o)pw_IuA*G8YT$83vWskX_ zU$FwJIb%SI(8Mu=Qj{dW7?NU)all*2Wtu&PC67Z!8Id0FO}TfH&k2pZm*V`Uo)1#M zKgx77MIo0ykJKtfNXE8?&)tYp+Rgq9>!NAJjlB!6lH*Kh$tXXVlpMAF&XlqRRIs51 za!V#Oa7K#i%aeSRVmhBPE4l3RkU7aCldUYOGG^Yk7xz5*l>b$qSA#8dwW}MDZOIUC`l8L4iFa|O*B;#H6%?iDvC;Lfvc#+VyWLBsQ48b z)SSV^#o57-1_z@~OpLH#oD741f`i8J;|A$)a-Q?#J@5O=Io~_yyZnWJpT7b7croke z-AzFutdCVk`^&ZRcvuf>lZ~V9LC4&+GhScYeV+$RC3x6MACK&cx8y!C9d@Z9%<@qqb zB998M85Jd{@sd!KQ%tevUCk`_vO7Vp}mqe}npp(m@G(UYhbg4)i6&t3H z{ePJu#dPUfi)p{6_XZ`E7}lSyL}34>R|?}?m5lSAs>so>cTA`-rfbt&6S?fy@R}&j zpu$gzJnHPxT8sXQZCn>6sWf(FdW^YY2ZCbmroPAF7Pqx0HR7Ju9UklCi>7(XbGEMn Dko#ak delta 439 zcmW;JOKVd>7{>AcBqurPNpf^kOA!N!x-dIk3YK(ZArP>rwN0DUc#E24D%`TJ?(Y=wLbvoSljn< zPOIePLT1r!NAvzOkLN78)Dz@+VgE$GnuhJTS!czNvY*{l>qzXcF~<7dpli6uC5){E zz8v^%;1RB7^Z%G~poTn2Z|1 zqEF4Xlf$k delta 84 zcmcb`yO)>i)W2Q(7#J9A8DckbWifA_$Xvt7$S|3YH9?X=04NT^KoA1NObnq6j0|B6 b;gj20Co)GcL{64w+rSTziDHNbtB3&rOZ^aA diff --git a/backend/target/classes/ltd/qubit/survey/service/BaseService.class b/backend/target/classes/ltd/qubit/survey/service/BaseService.class index 4aadaeab4e0f962c3fd8b5c3ff4fc1a6a4e30561..9dc92b0467cbf9918d914543b7de549274ef3ab8 100644 GIT binary patch delta 247 zcmX@e+Q-Iq>ff$?3=9mm46+lsN~8pQQ%f@PQvwo;5_3~aQj3Zi8Q4ff$?3=9mm3{n%hN+!;lxY>YFiLsuEfgLEw#K6J838dK=7#X-27+4q? zxEXkWq7XS=G&w$?I+z@~K7IxPpcxQ-fo znYeBxA6I?>h~u1}lFG;sIa!v`d~!cyI1f8S7^pr)W8!(k#ga^n#Y_yGK$BU4MgS>p zAZB9VVPRz8W#9v{KvJAcU@3mMv;a_AkUWFd`eu1T|KiK>}>N FBmi$&B2fSU delta 110 zcmX@ieus_g)W2Q(7#J9A8N?=XEt_~@Ib-BxTSoKAdlff$?3=9mm3@Q`3HY*AErj}&nrvxMxCFZ7k!K1cgJ^PTQBi7MNg#?2Mh5=k)ST4h zlGGIc0+2yKLmMXRF&S@O%XF8qo{51IXg@0>0~e6u24W@#9u`IhUIsoO3o6AAml6O< z2{H&VFhZ3I1NkBhqEMy0%nV{crQ$#=0oNi4R3gP7jW7+Q1Y(g41G6HODa#-S6lP+O SXHWo3GcqUwEm4YMPzC^54>KPC delta 146 zcmeC-{>I65>ff$?3=9mm4002>Hcx!GXmcN<6eDB9nG+V`XIE0#e*S%*4RM z!pOkOzyV}IrT9>!_!$JCQk+a+T?lDGpiUtMVFqTHP7%0HQ3f#}n~i~yL7agBs7!)E y5@bp;P!MW4s=O3~G}IWVEeNAzkc|Q=g1B0iK@MmZ6N5ZhmK$slBZEQ|gCYQWHz3jg delta 184 zcmZ3?y@ZSF)W2Q(7#J9A8RRB%t(tftcd{4bi_LaS%}n)-44gm-CI&7RMh0#M4hCdC z4+Afp&j*y}XAl6Ygs2x}5CZCB1Ii0CFaYI57({_=R539IakzR3WH|3~)&Kwi diff --git a/backend/target/classes/ltd/qubit/survey/service/UserService.class b/backend/target/classes/ltd/qubit/survey/service/UserService.class index 0fc7a63ca93380c5d3e57133ce84710da33f4b9a..e3a712fc2d49f7a5746c3ca45d768965a64f67e9 100644 GIT binary patch delta 218 zcmey$c8;Cv)W2Q(7#J9A8DuANEtM4TO)bgDPYFmYO3Y0yNi8a7WMD1G$j?iixOP4- zM|plxwqsFhA|peP#^eS@iOB|xl9THhb68nQi&Kj>zhpFFtY>221RBT6$iM}pxPh37 zfro{WftP^~$bw4o!=(g(Qi2RZ2q|Hpln4;BF)%WSGB5z8#TdkaY$QXOp~gxuNP>-* R0&Cy~YhYw$kd9)I0RV3bA3p#9 delta 129 zcmX@d{*_JO)W2Q(7#J9A86?>mm>3yUCU0btoT%A0@zmVOMU3+|OE4KRMldpP0+lc^ zaIr8la5L~Q!1%mCJ|6==kS_p~X9LoL3=BXqAqHU}pBbu4gh3RnTMVp<8?1_vK|G2< F0s!P>4*viE diff --git a/backend/target/classes/ltd/qubit/survey/service/impl/OptionServiceImpl.class b/backend/target/classes/ltd/qubit/survey/service/impl/OptionServiceImpl.class index 4fad7504ee18d7bac1b1a758afde5aec8bb138c6..f2fdc263c5906102c1c3892272f901541957a4e7 100644 GIT binary patch delta 431 zcmZXQ%}T>i5QWc;1|qpl8d0c%(jo{779T*dYKn+Is2ew?Cfe9k(?(-o!_~Zkdxb2e z3zt5D&*ILh`BCZW&Y3yi+?g3xpKGrz)hZwPgCJ_3c(K>>2Y&pRT&P1uEYpjaPxiDA zMJQzH=hK$}Q~`${fm578p-695TzIUrqWe=^#4#7&^~3*64F{N@8QBXk;uTnz{HR= zxtGV8AHq%s>e6J;0;_ZoO#zz&kx2#0=rZU5W$bw!N)tG+Gr6g-Svp(MS{$ox*-9l|LYntXjgx z`?21S^?pAKt%Pu9W*tnn z(Q1S!I55J24QysjHb{0zTTIrXj-*Oo*q^|5mXyelcI2S%chz0&QLyU!9^S_Ryl6%} z4sirG6%&}p0#EC9Y!7DLPUx=Mxg<`Z!GkfJ;T$;#U;r1a;=(2I05PZ9RjOJN*BSl| z`HN(g!Tkx{g9h1JQe195T)sv#&<05Ib7s5cEO)qPtGy+YT~0GzG~$6RsL)Y^N4B8Z z#>LDy*i#03CT7{?LHRi_!(IAoR6_cL~cW7rWx8%}Tv8>dYpgB9M3)tNqJ zu{!4*N$=%w0SjbI;SyJ6dCO_>GzrM zdf;gvk>|NG{$#h2Y)2GNoF_p+GoCrmqNn({W3ZPJdu3Mic0zokTE+m|n;-MW);)OV rk6y0orv|OV{=q`40BA&umk(Jj?*1blc%oROaZRJfKy6vm8%X{Fzv*s8 diff --git a/backend/target/classes/ltd/qubit/survey/service/impl/SurveyResponseServiceImpl.class b/backend/target/classes/ltd/qubit/survey/service/impl/SurveyResponseServiceImpl.class index 3db90e77f02370a0ea48d9b9cf2a3533fd2c4bb2..b1a938be3045c1cffc7f135a8dff3455af3385ed 100644 GIT binary patch delta 637 zcmZXR%P#{_6vn@q4nd1f+i7PAK|+ua7Q}+2^%f)&5muz3VI!iouqLsvu(^>)#6Mu8 z(MCP$)z;o^$W-JLfz1Znf;R2HOf`>#%QWZeeD`>-Wz4mVEv| zsI_2L3I&U*B|&7LwsG45fE)o~+5~K49U_yR3LCIDsSzB~Sqg~gKsmMuShElP*HvN@ zCiZ1_XKRi~C*qjZIJ%0H@d*{JLp=$W9qx)~W|JtvN$8ZI1|51L=qwXD`v*0lnJQH& zp2lP)zygkoy77Dwyk=T*PIWJENs<+1vOR`4(@%Z4Mit{BWLVJ)tJQ-_R54j|FppZB tXM8VPRJ)BN%udrugym})H)C3VA-B$#ncHN$+MtOBWItM;kYMhTiC_KOf9C)I delta 511 zcmZ8dIZFd!5Ph3$jKte@LlRN35(P0SJQ^`ZMKKBz3$28J3pOGoX+==5ut@VE2x@03 zA_ly#B*r7&3KsqcTMI?-?XE$QEp}$!F>k)rmZj#+Hb)}p(B!hxK`k~hH9i!MgeSF_ z7KtV{itA)a5-;T=b_vT^fFwGUo}z8+K;l=8B~Dh90iv~7ghhNP{vUJ~fCYOZRMAyp z*85b{qk*io3cq?_c$ml`kwycNRlj=l5AniB&A8fGV`_jx=o|}7^)b~aI3?#<9rGoT zVlTrD8`9*QF-IXMKoye6urgKWtO7q5sbbdYEi&CDT;P&kS?Al#6|%@<=5}1;hJHXC zTS)M)SGhEC`lh(40CTuyWknQ~#&+4*?j)x3_3b&<9a;CBmcjZ3#g0}xLZ1kIkYL7p zU_9GA9{Ilgu3@q63gkbLZ{s22-PQfu1l)g`_}}K$-DliH8ME;#%QPWSV@RJzOY> zfq{XQks$#{F*1ZRL@+Q-w&ie@NM=X@@}ZK+U`aU!C!l0MhYzYAMTQ^-=E;qmqLaUK zXk+S21?pvDNSmzB>C6vdrvnYvWY7X@a!|-%$V6C_0aOf8lm!&jWzd6~{F+l+A)6rw zp)eb+Fc&D82X>h@SDbV{P@I{8Q55F#1R$T0!IZ%a=<=Cd&Jq~5F*4XP6aXb(a=CEB zGzl^YOxERg;(+;nayhpPjFT|=FoKgjnV-i+0TzM+AdeOUEo5RSVJHRCY(T5a7#IMR C|2)zF delta 284 zcmca6`B`Fv73*eS)>Dik0=}sw8TlyziA9OIsU@jJ#f%JUlO5SbChM?oVq~0rpFNzN zks+KRf`M_e2Zt+f5<@ZrBM{0lH~~eLa`*sc6&ZpUm?krGIzVMp7#J9s7*Z!kb2{@w z*l9o=nhaV%RckpNMAI2EfP9EdCXl7epa+!U<#G_sV#tQeD{ ziUI{q8O(rIKjU)dg&4%hV9SsX6mjHsnLL5piK76hl$DWzVe&0*7X(L*$Au3jBfucw U$ly5n0k`Dji9D(ZHT!rZ0HjVb!T - + @@ -52,21 +52,21 @@ - SELECT FROM options WHERE id = #{id} - SELECT FROM options ORDER BY question_id, option_code - SELECT FROM options WHERE question_id = #{questionId} @@ -74,7 +74,7 @@ - SELECT FROM options WHERE question_id = #{questionId} diff --git a/backend/target/classes/mybatis/mapper/SurveyResponseMapper.xml b/backend/target/classes/mybatis/mapper/SurveyResponseMapper.xml index c7b0430..c7347fe 100644 --- a/backend/target/classes/mybatis/mapper/SurveyResponseMapper.xml +++ b/backend/target/classes/mybatis/mapper/SurveyResponseMapper.xml @@ -6,7 +6,7 @@ - + @@ -19,7 +19,7 @@ INSERT INTO survey_responses (user_id, question_id, selected_options, text_answer) - VALUES (#{userId}, #{questionId}, #{selectedOptions,typeHandler=org.apache.ibatis.type.JsonTypeHandler}, #{textAnswer}) + VALUES (#{userId}, #{questionId}, #{selectedOptions,typeHandler=com.fasterxml.jackson.databind.JsonTypeHandler}, #{textAnswer}) @@ -28,7 +28,7 @@ VALUES (#{item.userId}, #{item.questionId}, - #{item.selectedOptions,typeHandler=org.apache.ibatis.type.JsonTypeHandler}, + #{item.selectedOptions,typeHandler=com.fasterxml.jackson.databind.JsonTypeHandler}, #{item.textAnswer}) @@ -38,7 +38,7 @@ UPDATE survey_responses SET user_id = #{userId}, question_id = #{questionId}, - selected_options = #{selectedOptions,typeHandler=org.apache.ibatis.type.JsonTypeHandler}, + selected_options = #{selectedOptions,typeHandler=com.fasterxml.jackson.databind.JsonTypeHandler}, text_answer = #{textAnswer} WHERE id = #{id} diff --git a/backend/target/classes/mybatis/mybatis-config.xml b/backend/target/classes/mybatis/mybatis-config.xml index 59d59f2..431d9e2 100644 --- a/backend/target/classes/mybatis/mybatis-config.xml +++ b/backend/target/classes/mybatis/mybatis-config.xml @@ -12,6 +12,12 @@ + + + + + + + + + - - - - - + \ No newline at end of file diff --git a/backend/target/classes/spring/applicationContext.xml b/backend/target/classes/spring/applicationContext.xml index 96c3210..14c8c55 100644 --- a/backend/target/classes/spring/applicationContext.xml +++ b/backend/target/classes/spring/applicationContext.xml @@ -3,16 +3,32 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx" + xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/tx - http://www.springframework.org/schema/tx/spring-tx.xsd"> + http://www.springframework.org/schema/tx/spring-tx.xsd + http://www.springframework.org/schema/aop + http://www.springframework.org/schema/aop/spring-aop.xsd"> + + + + + + + + + + NON_NULL + + + @@ -21,4 +37,21 @@ + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/backend/target/classes/spring/spring-mvc.xml b/backend/target/classes/spring/spring-mvc.xml index efabb13..b90005a 100644 --- a/backend/target/classes/spring/spring-mvc.xml +++ b/backend/target/classes/spring/spring-mvc.xml @@ -20,27 +20,39 @@ - - - - - - - - + + + + application/json;charset=UTF-8 + + + + + + + + text/plain;charset=UTF-8 + text/html;charset=UTF-8 + + + + + + + \ No newline at end of file diff --git a/backend/target/classes/spring/spring-mybatis.xml b/backend/target/classes/spring/spring-mybatis.xml index 8c7889f..b3d611a 100644 --- a/backend/target/classes/spring/spring-mybatis.xml +++ b/backend/target/classes/spring/spring-mybatis.xml @@ -1,8 +1,11 @@ + http://www.springframework.org/schema/beans/spring-beans.xsd + http://www.springframework.org/schema/tx + http://www.springframework.org/schema/tx/spring-tx.xsd"> @@ -16,13 +19,35 @@ + + + + + + - + + + + + + + + + helperDialect=mysql + reasonable=true + supportMethodsArguments=true + params=count=countSql + + + + + diff --git a/backend/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst b/backend/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst index df03b31..03e3ecf 100644 --- a/backend/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst +++ b/backend/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst @@ -12,6 +12,7 @@ ltd/qubit/survey/service/impl/QuestionServiceImpl.class ltd/qubit/survey/model/SurveyResponse.class ltd/qubit/survey/model/User.class ltd/qubit/survey/service/QuestionService.class +ltd/qubit/survey/common/mybatis/JsonTypeHandler.class ltd/qubit/survey/service/impl/QuestionServiceImpl$1.class ltd/qubit/survey/service/UserService.class ltd/qubit/survey/dao/BaseDao.class @@ -25,3 +26,4 @@ ltd/qubit/survey/service/SurveyResponseService.class ltd/qubit/survey/model/Option.class ltd/qubit/survey/model/QuestionType.class ltd/qubit/survey/service/BaseService.class +com/fasterxml/jackson/databind/JsonTypeHandler.class diff --git a/backend/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst b/backend/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst index 4678e84..325ebd6 100644 --- a/backend/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst +++ b/backend/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst @@ -1,6 +1,7 @@ /Volumes/working/qubit/project/llm-survey/backend/src/main/java/ltd/qubit/survey/dao/QuestionDao.java /Volumes/working/qubit/project/llm-survey/backend/src/main/java/ltd/qubit/survey/service/UserService.java /Volumes/working/qubit/project/llm-survey/backend/src/main/java/ltd/qubit/survey/service/OptionService.java +/Volumes/working/qubit/project/llm-survey/backend/src/main/java/ltd/qubit/survey/common/mybatis/JsonTypeHandler.java /Volumes/working/qubit/project/llm-survey/backend/src/main/java/ltd/qubit/survey/model/Question.java /Volumes/working/qubit/project/llm-survey/backend/src/main/java/ltd/qubit/survey/service/QuestionService.java /Volumes/working/qubit/project/llm-survey/backend/src/main/java/ltd/qubit/survey/service/BaseService.java @@ -8,6 +9,7 @@ /Volumes/working/qubit/project/llm-survey/backend/src/main/java/ltd/qubit/survey/service/impl/OptionServiceImpl.java /Volumes/working/qubit/project/llm-survey/backend/src/main/java/ltd/qubit/survey/service/impl/QuestionServiceImpl.java /Volumes/working/qubit/project/llm-survey/backend/src/main/java/ltd/qubit/survey/service/SurveyResponseService.java +/Volumes/working/qubit/project/llm-survey/backend/src/main/java/com/fasterxml/jackson/databind/JsonTypeHandler.java /Volumes/working/qubit/project/llm-survey/backend/src/main/java/ltd/qubit/survey/model/Option.java /Volumes/working/qubit/project/llm-survey/backend/src/main/java/ltd/qubit/survey/controller/GlobalExceptionHandler.java /Volumes/working/qubit/project/llm-survey/backend/src/main/java/ltd/qubit/survey/model/QuestionType.java diff --git a/doc/deployment.md b/doc/deployment.md new file mode 100644 index 0000000..dd6415d --- /dev/null +++ b/doc/deployment.md @@ -0,0 +1,74 @@ +# 部署文档 + +## 1. 开发环境配置 + +### 1.1 环境变量 +- `DOCKER_DATA_DIR`: Docker数据目录,默认为 `/Volumes/working/docker` + +### 1.2 开发环境组件 +- Tomcat: 运行在Docker容器中 + - 数据目录: `$DOCKER_DATA_DIR/tomcat` + - 日志目录: `$DOCKER_DATA_DIR/tomcat/logs` + - 应用目录: `$DOCKER_DATA_DIR/tomcat/webapps` + +## 2. 项目构建 + +### 2.1 编译打包 +```bash +# 进入后端项目目录 +cd backend + +# 清理并打包项目(跳过测试) +mvn clean package -DskipTests + +# 打包结果 +# - WAR包位置:backend/target/llm-survey-api.war +``` + +### 2.2 数据库初始化 +```bash +# 进入数据库脚本目录 +cd database + +# 添加执行权限 +chmod +x init_database.sh + +# 执行初始化脚本 +./init_database.sh + +# 初始化内容 +# - 创建数据库:llm_survey +# - 创建表:users, questions, options, survey_responses +# - 插入基础数据:工作领域和岗位性质相关的问题和选项 +``` + +## 3. 开发环境部署 + +### 3.1 部署WAR包 +```bash +# 复制WAR包到Tomcat的webapps目录 +cp backend/target/llm-survey-api.war $DOCKER_DATA_DIR/tomcat/webapps/ + +# 部署后的访问地址 +# - 上下文路径:/llm-survey-api +# - API基础路径:/llm-survey-api/api +``` + +### 3.2 查看部署结果 +```bash +# 查看Tomcat日志 +tail -f $DOCKER_DATA_DIR/tomcat/logs/catalina.out + +# 检查应用是否成功部署 +ls -l $DOCKER_DATA_DIR/tomcat/webapps/llm-survey-api/ +``` + +### 3.3 验证部署 +- 访问测试接口:`http://localhost:8080/llm-survey-api/user/check/13800000000` +- 预期返回:`false`(表示手机号未注册) + +## 4. 注意事项 +1. 确保MySQL服务已启动且能够通过localhost:3306访问 +2. 确保Tomcat容器已启动且8080端口可访问 +3. 部署前确保数据库已正确初始化 +4. 如需重新部署,可直接覆盖webapps目录下的WAR包,Tomcat会自动重新部署 \ No newline at end of file diff --git a/pom.xml b/pom.xml deleted file mode 100644 index f7deefc..0000000 --- a/pom.xml +++ /dev/null @@ -1,161 +0,0 @@ - - - 4.0.0 - - ltd.qubit - llm-survey-api - 1.0-SNAPSHOT - war - - - 17 - ${java.version} - ${java.version} - UTF-8 - 5.3.31 - 3.5.15 - 2.1.2 - 8.3.0 - 5.1.0 - 2.16.1 - 1.18.30 - 2.0.11 - 1.4.14 - 4.0.1 - - - - - - org.springframework - spring-webmvc - ${spring.version} - - - org.springframework - spring-jdbc - ${spring.version} - - - org.springframework - spring-context-support - ${spring.version} - - - org.springframework - spring-tx - ${spring.version} - - - - - org.mybatis - mybatis - ${mybatis.version} - - - org.mybatis - mybatis-spring - ${mybatis-spring.version} - - - - - com.mysql - mysql-connector-j - ${mysql-connector.version} - - - - - com.zaxxer - HikariCP - ${hikaricp.version} - - - - - com.fasterxml.jackson.core - jackson-databind - ${jackson.version} - - - - - org.projectlombok - lombok - ${lombok.version} - provided - - - - - org.slf4j - slf4j-api - ${slf4j.version} - - - ch.qos.logback - logback-classic - ${logback.version} - - - - - javax.servlet - javax.servlet-api - ${servlet-api.version} - provided - - - - - llm-survey-api - - - - org.apache.maven.plugins - maven-compiler-plugin - 3.11.0 - - ${java.version} - ${project.build.sourceEncoding} - - - org.projectlombok - lombok - ${lombok.version} - - - - - - - - org.apache.maven.plugins - maven-war-plugin - 3.4.0 - - false - - - - - - - - src/main/resources - true - - - src/main/java - - **/*.xml - - true - - - - \ No newline at end of file diff --git a/src/main/java/ltd/qubit/survey/controller/GlobalExceptionHandler.java b/src/main/java/ltd/qubit/survey/controller/GlobalExceptionHandler.java deleted file mode 100644 index ef094e3..0000000 --- a/src/main/java/ltd/qubit/survey/controller/GlobalExceptionHandler.java +++ /dev/null @@ -1,78 +0,0 @@ -package ltd.qubit.survey.controller; - -import lombok.extern.slf4j.Slf4j; -import ltd.qubit.survey.model.ErrorInfo; -import org.springframework.dao.DataAccessException; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; -import org.springframework.validation.BindException; -import org.springframework.web.bind.annotation.ExceptionHandler; -import org.springframework.web.bind.annotation.RestControllerAdvice; - -/** - * 全局异常处理器 - */ -@Slf4j -@RestControllerAdvice -public class GlobalExceptionHandler { - - /** - * 处理参数校验异常 - */ - @ExceptionHandler(BindException.class) - public ResponseEntity handleBindException(BindException e) { - String message = e.getBindingResult().getFieldErrors().stream() - .map(error -> error.getField() + ": " + error.getDefaultMessage()) - .reduce((a, b) -> a + "; " + b) - .orElse("参数错误"); - - ErrorInfo error = ErrorInfo.of( - "INVALID_ARGUMENT", - "参数校验失败", - message, - e.getObjectName()); - - return new ResponseEntity<>(error, HttpStatus.BAD_REQUEST); - } - - /** - * 处理业务异常 - */ - @ExceptionHandler(IllegalArgumentException.class) - public ResponseEntity handleIllegalArgumentException(IllegalArgumentException e) { - log.warn("业务异常", e); - ErrorInfo error = ErrorInfo.of( - "BAD_REQUEST", - e.getMessage(), - e.getClass().getName()); - return new ResponseEntity<>(error, HttpStatus.BAD_REQUEST); - } - - /** - * 处理数据访问异常 - */ - @ExceptionHandler(DataAccessException.class) - public ResponseEntity handleDataAccessException(DataAccessException e) { - log.error("数据访问异常", e); - ErrorInfo error = ErrorInfo.of( - "DATABASE_ERROR", - "数据库访问错误", - e.getMessage(), - e.getClass().getName()); - return new ResponseEntity<>(error, HttpStatus.INTERNAL_SERVER_ERROR); - } - - /** - * 处理其他未知异常 - */ - @ExceptionHandler(Exception.class) - public ResponseEntity handleUnknownException(Exception e) { - log.error("系统异常", e); - ErrorInfo error = ErrorInfo.of( - "SYSTEM_ERROR", - "系统错误", - e.getMessage(), - e.getClass().getName()); - return new ResponseEntity<>(error, HttpStatus.INTERNAL_SERVER_ERROR); - } -} \ No newline at end of file diff --git a/src/main/java/ltd/qubit/survey/controller/QuestionController.java b/src/main/java/ltd/qubit/survey/controller/QuestionController.java deleted file mode 100644 index 674bb2b..0000000 --- a/src/main/java/ltd/qubit/survey/controller/QuestionController.java +++ /dev/null @@ -1,62 +0,0 @@ -package ltd.qubit.survey.controller; - -import java.util.List; -import lombok.RequiredArgsConstructor; -import ltd.qubit.survey.model.Question; -import ltd.qubit.survey.model.Option; -import ltd.qubit.survey.service.QuestionService; -import ltd.qubit.survey.service.OptionService; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -/** - * 问题控制器 - */ -@RestController -@RequestMapping("/api/questions") -@RequiredArgsConstructor -public class QuestionController { - private final QuestionService questionService; - private final OptionService optionService; - - /** - * 获取用户的问题列表 - * - * @param userId 用户ID - * @return 问题列表 - */ - @GetMapping("/user/{userId}") - public List getUserQuestions(@PathVariable Long userId) { - return questionService.getUserQuestions(userId); - } - - /** - * 获取问题的选项列表 - * - * @param questionId 问题ID - * @return 选项列表 - */ - @GetMapping("/{questionId}/options") - public List