From c09ce065fe4a7985e70876bd30a3f506db5454ca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=80=81=E7=8E=8B?= <1702282943@qq.com> Date: Fri, 30 Jan 2026 08:59:06 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=90=8E=E7=AB=AF=E4=BB=A3?= =?UTF-8?q?=E7=A0=81=E3=80=81=E6=95=B0=E6=8D=AE=E5=BA=93=E6=96=87=E6=A1=A3?= =?UTF-8?q?=E5=92=8CFRP=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/backend_complete.log | 313 +++++++++++ backend/backend_final.log | 79 +++ backend/backend_final_fixed.log | 276 ++++++++++ backend/backend_final_flow.log | 188 +++++++ backend/backend_full_flow.log | 344 ++++++++++++ backend/backend_jwt_fixed.log | 429 +++++++++++++++ backend/backend_output.log | 454 ++++++++++++++++ backend/backend_output_new.log | 271 ++++++++++ backend/backend_test_tables.log | 218 ++++++++ backend/backend_with_correct_schema.log | 489 ++++++++++++++++++ backend/backend_with_init.log | 2 + backend/backend_with_schema.log | 79 +++ backend/backend_working.log | 180 +++++++ backend/pom.xml | 131 +++++ .../pethospital/PetHospitalApplication.java | 17 + .../gpf/pethospital/common/ApiResponse.java | 37 ++ .../pethospital/config/MybatisPlusConfig.java | 37 ++ .../pethospital/config/SecurityConfig.java | 49 ++ .../com/gpf/pethospital/config/WebConfig.java | 17 + .../controller/AppointmentController.java | 72 +++ .../controller/AuthController.java | 82 +++ .../controller/DrugController.java | 58 +++ .../controller/MedicalRecordController.java | 50 ++ .../controller/MessageController.java | 65 +++ .../controller/NoticeController.java | 66 +++ .../controller/OrderController.java | 53 ++ .../pethospital/controller/PetController.java | 79 +++ .../controller/PrescriptionController.java | 54 ++ .../PrescriptionItemController.java | 47 ++ .../controller/ReportController.java | 58 +++ .../controller/StatsController.java | 64 +++ .../controller/StockInController.java | 52 ++ .../controller/StockOutController.java | 52 ++ .../controller/UserController.java | 115 ++++ .../controller/VaccineRecordController.java | 59 +++ .../controller/VisitController.java | 57 ++ .../com/gpf/pethospital/dto/LoginRequest.java | 26 + .../gpf/pethospital/dto/RegisterRequest.java | 46 ++ .../com/gpf/pethospital/dto/ReplyRequest.java | 16 + .../gpf/pethospital/entity/Appointment.java | 83 +++ .../java/com/gpf/pethospital/entity/Drug.java | 93 ++++ .../gpf/pethospital/entity/MedicalRecord.java | 82 +++ .../com/gpf/pethospital/entity/Message.java | 82 +++ .../com/gpf/pethospital/entity/Notice.java | 62 +++ .../com/gpf/pethospital/entity/Order.java | 78 +++ .../java/com/gpf/pethospital/entity/Pet.java | 78 +++ .../gpf/pethospital/entity/Prescription.java | 57 ++ .../pethospital/entity/PrescriptionItem.java | 83 +++ .../com/gpf/pethospital/entity/Report.java | 72 +++ .../com/gpf/pethospital/entity/StockIn.java | 67 +++ .../com/gpf/pethospital/entity/StockOut.java | 72 +++ .../java/com/gpf/pethospital/entity/User.java | 72 +++ .../gpf/pethospital/entity/VaccineRecord.java | 68 +++ .../com/gpf/pethospital/entity/Visit.java | 93 ++++ .../pethospital/mapper/AppointmentMapper.java | 9 + .../gpf/pethospital/mapper/DrugMapper.java | 9 + .../mapper/MedicalRecordMapper.java | 9 + .../gpf/pethospital/mapper/MessageMapper.java | 9 + .../gpf/pethospital/mapper/NoticeMapper.java | 9 + .../gpf/pethospital/mapper/OrderMapper.java | 9 + .../com/gpf/pethospital/mapper/PetMapper.java | 9 + .../mapper/PrescriptionItemMapper.java | 9 + .../mapper/PrescriptionMapper.java | 9 + .../gpf/pethospital/mapper/ReportMapper.java | 9 + .../gpf/pethospital/mapper/StockInMapper.java | 9 + .../pethospital/mapper/StockOutMapper.java | 9 + .../gpf/pethospital/mapper/UserMapper.java | 9 + .../mapper/VaccineRecordMapper.java | 9 + .../gpf/pethospital/mapper/VisitMapper.java | 9 + .../gpf/pethospital/security/AuthUser.java | 25 + .../security/JwtAuthenticationFilter.java | 55 ++ .../service/AppointmentService.java | 7 + .../gpf/pethospital/service/DrugService.java | 7 + .../service/MedicalRecordService.java | 7 + .../pethospital/service/MessageService.java | 7 + .../pethospital/service/NoticeService.java | 7 + .../gpf/pethospital/service/OrderService.java | 7 + .../gpf/pethospital/service/PetService.java | 7 + .../service/PrescriptionItemService.java | 7 + .../service/PrescriptionService.java | 7 + .../pethospital/service/ReportService.java | 7 + .../pethospital/service/StockInService.java | 7 + .../pethospital/service/StockOutService.java | 7 + .../gpf/pethospital/service/UserService.java | 7 + .../service/VaccineRecordService.java | 7 + .../gpf/pethospital/service/VisitService.java | 7 + .../service/impl/AppointmentServiceImpl.java | 11 + .../service/impl/DrugServiceImpl.java | 11 + .../impl/MedicalRecordServiceImpl.java | 11 + .../service/impl/MessageServiceImpl.java | 11 + .../service/impl/NoticeServiceImpl.java | 11 + .../service/impl/OrderServiceImpl.java | 11 + .../service/impl/PetServiceImpl.java | 11 + .../impl/PrescriptionItemServiceImpl.java | 11 + .../service/impl/PrescriptionServiceImpl.java | 11 + .../service/impl/ReportServiceImpl.java | 11 + .../service/impl/StockInServiceImpl.java | 11 + .../service/impl/StockOutServiceImpl.java | 11 + .../service/impl/UserServiceImpl.java | 11 + .../impl/VaccineRecordServiceImpl.java | 11 + .../service/impl/VisitServiceImpl.java | 11 + .../com/gpf/pethospital/util/JwtUtil.java | 41 ++ .../gpf/pethospital/util/SecurityUtils.java | 15 + .../src/main/resources/application-dev.yml | 61 +++ backend/src/main/resources/application.yml | 36 ++ backend/src/main/resources/data.sql | 17 + backend/src/main/resources/schema-h2.sql | 242 +++++++++ backend/src/main/resources/schema.sql | 230 ++++++++ backend/target/classes/application-dev.yml | 61 +++ backend/target/classes/application.yml | 36 ++ .../pethospital/PetHospitalApplication.class | Bin 0 -> 854 bytes .../gpf/pethospital/common/ApiResponse.class | Bin 0 -> 1956 bytes .../config/MybatisPlusConfig$1.class | Bin 0 -> 1488 bytes .../config/MybatisPlusConfig.class | Bin 0 -> 1359 bytes .../pethospital/config/SecurityConfig.class | Bin 0 -> 5693 bytes .../gpf/pethospital/config/WebConfig.class | Bin 0 -> 1447 bytes .../controller/AppointmentController.class | Bin 0 -> 6477 bytes .../controller/AuthController.class | Bin 0 -> 7341 bytes .../controller/DrugController.class | Bin 0 -> 5904 bytes .../controller/MedicalRecordController.class | Bin 0 -> 5311 bytes .../controller/MessageController.class | Bin 0 -> 6165 bytes .../controller/NoticeController.class | Bin 0 -> 6495 bytes .../controller/OrderController.class | Bin 0 -> 5468 bytes .../controller/PetController.class | Bin 0 -> 6704 bytes .../controller/PrescriptionController.class | Bin 0 -> 5782 bytes .../PrescriptionItemController.class | Bin 0 -> 5204 bytes .../controller/ReportController.class | Bin 0 -> 5944 bytes .../controller/StatsController.class | Bin 0 -> 5341 bytes .../controller/StockInController.class | Bin 0 -> 5254 bytes .../controller/StockOutController.class | Bin 0 -> 5317 bytes .../controller/UserController.class | Bin 0 -> 9231 bytes .../controller/VaccineRecordController.class | Bin 0 -> 6257 bytes .../controller/VisitController.class | Bin 0 -> 5705 bytes .../gpf/pethospital/dto/LoginRequest.class | Bin 0 -> 959 bytes .../gpf/pethospital/dto/RegisterRequest.class | Bin 0 -> 1430 bytes .../gpf/pethospital/dto/ReplyRequest.class | Bin 0 -> 722 bytes .../gpf/pethospital/entity/Appointment.class | Bin 0 -> 8502 bytes .../com/gpf/pethospital/entity/Drug.class | Bin 0 -> 9537 bytes .../pethospital/entity/MedicalRecord.class | Bin 0 -> 8599 bytes .../com/gpf/pethospital/entity/Message.class | Bin 0 -> 8251 bytes .../com/gpf/pethospital/entity/Notice.class | Bin 0 -> 6289 bytes .../com/gpf/pethospital/entity/Order.class | Bin 0 -> 7435 bytes .../com/gpf/pethospital/entity/Pet.class | Bin 0 -> 7860 bytes .../gpf/pethospital/entity/Prescription.class | Bin 0 -> 5869 bytes .../pethospital/entity/PrescriptionItem.class | Bin 0 -> 8539 bytes .../com/gpf/pethospital/entity/Report.class | Bin 0 -> 7241 bytes .../com/gpf/pethospital/entity/StockIn.class | Bin 0 -> 6348 bytes .../com/gpf/pethospital/entity/StockOut.class | Bin 0 -> 6887 bytes .../com/gpf/pethospital/entity/User.class | Bin 0 -> 7190 bytes .../pethospital/entity/VaccineRecord.class | Bin 0 -> 7007 bytes .../com/gpf/pethospital/entity/Visit.class | Bin 0 -> 9553 bytes .../mapper/AppointmentMapper.class | Bin 0 -> 410 bytes .../gpf/pethospital/mapper/DrugMapper.class | Bin 0 -> 389 bytes .../mapper/MedicalRecordMapper.class | Bin 0 -> 416 bytes .../pethospital/mapper/MessageMapper.class | Bin 0 -> 398 bytes .../gpf/pethospital/mapper/NoticeMapper.class | Bin 0 -> 395 bytes .../gpf/pethospital/mapper/OrderMapper.class | Bin 0 -> 392 bytes .../gpf/pethospital/mapper/PetMapper.class | Bin 0 -> 386 bytes .../mapper/PrescriptionItemMapper.class | Bin 0 -> 425 bytes .../mapper/PrescriptionMapper.class | Bin 0 -> 413 bytes .../gpf/pethospital/mapper/ReportMapper.class | Bin 0 -> 395 bytes .../pethospital/mapper/StockInMapper.class | Bin 0 -> 398 bytes .../pethospital/mapper/StockOutMapper.class | Bin 0 -> 401 bytes .../gpf/pethospital/mapper/UserMapper.class | Bin 0 -> 389 bytes .../mapper/VaccineRecordMapper.class | Bin 0 -> 416 bytes .../gpf/pethospital/mapper/VisitMapper.class | Bin 0 -> 392 bytes .../gpf/pethospital/security/AuthUser.class | Bin 0 -> 840 bytes .../security/JwtAuthenticationFilter.class | Bin 0 -> 4015 bytes .../service/AppointmentService.class | Bin 0 -> 340 bytes .../gpf/pethospital/service/DrugService.class | Bin 0 -> 319 bytes .../service/MedicalRecordService.class | Bin 0 -> 346 bytes .../pethospital/service/MessageService.class | Bin 0 -> 328 bytes .../pethospital/service/NoticeService.class | Bin 0 -> 325 bytes .../pethospital/service/OrderService.class | Bin 0 -> 322 bytes .../gpf/pethospital/service/PetService.class | Bin 0 -> 316 bytes .../service/PrescriptionItemService.class | Bin 0 -> 355 bytes .../service/PrescriptionService.class | Bin 0 -> 343 bytes .../pethospital/service/ReportService.class | Bin 0 -> 325 bytes .../pethospital/service/StockInService.class | Bin 0 -> 328 bytes .../pethospital/service/StockOutService.class | Bin 0 -> 331 bytes .../gpf/pethospital/service/UserService.class | Bin 0 -> 319 bytes .../service/VaccineRecordService.class | Bin 0 -> 346 bytes .../pethospital/service/VisitService.class | Bin 0 -> 322 bytes .../service/impl/AppointmentServiceImpl.class | Bin 0 -> 757 bytes .../service/impl/DrugServiceImpl.class | Bin 0 -> 708 bytes .../impl/MedicalRecordServiceImpl.class | Bin 0 -> 771 bytes .../service/impl/MessageServiceImpl.class | Bin 0 -> 729 bytes .../service/impl/NoticeServiceImpl.class | Bin 0 -> 722 bytes .../service/impl/OrderServiceImpl.class | Bin 0 -> 715 bytes .../service/impl/PetServiceImpl.class | Bin 0 -> 701 bytes .../impl/PrescriptionItemServiceImpl.class | Bin 0 -> 792 bytes .../impl/PrescriptionServiceImpl.class | Bin 0 -> 764 bytes .../service/impl/ReportServiceImpl.class | Bin 0 -> 722 bytes .../service/impl/StockInServiceImpl.class | Bin 0 -> 729 bytes .../service/impl/StockOutServiceImpl.class | Bin 0 -> 736 bytes .../service/impl/UserServiceImpl.class | Bin 0 -> 708 bytes .../impl/VaccineRecordServiceImpl.class | Bin 0 -> 771 bytes .../service/impl/VisitServiceImpl.class | Bin 0 -> 715 bytes .../com/gpf/pethospital/util/JwtUtil.class | Bin 0 -> 2317 bytes .../gpf/pethospital/util/SecurityUtils.class | Bin 0 -> 1026 bytes backend/target/classes/data.sql | 17 + backend/target/classes/schema-h2.sql | 242 +++++++++ backend/target/classes/schema.sql | 230 ++++++++ .../compile/default-compile/createdFiles.lst | 90 ++++ .../compile/default-compile/inputFiles.lst | 89 ++++ database_er_diagram.mmd | 107 ++++ database_schema_documentation.md | 283 ++++++++++ frp_setup_guide.md | 144 ++++++ simple_er_diagram.txt | 142 +++++ start_frp.sh | 69 +++ 210 files changed, 8560 insertions(+) create mode 100644 backend/backend_complete.log create mode 100644 backend/backend_final.log create mode 100644 backend/backend_final_fixed.log create mode 100644 backend/backend_final_flow.log create mode 100644 backend/backend_full_flow.log create mode 100644 backend/backend_jwt_fixed.log create mode 100644 backend/backend_output.log create mode 100644 backend/backend_output_new.log create mode 100644 backend/backend_test_tables.log create mode 100644 backend/backend_with_correct_schema.log create mode 100644 backend/backend_with_init.log create mode 100644 backend/backend_with_schema.log create mode 100644 backend/backend_working.log create mode 100644 backend/pom.xml create mode 100644 backend/src/main/java/com/gpf/pethospital/PetHospitalApplication.java create mode 100644 backend/src/main/java/com/gpf/pethospital/common/ApiResponse.java create mode 100644 backend/src/main/java/com/gpf/pethospital/config/MybatisPlusConfig.java create mode 100644 backend/src/main/java/com/gpf/pethospital/config/SecurityConfig.java create mode 100644 backend/src/main/java/com/gpf/pethospital/config/WebConfig.java create mode 100644 backend/src/main/java/com/gpf/pethospital/controller/AppointmentController.java create mode 100644 backend/src/main/java/com/gpf/pethospital/controller/AuthController.java create mode 100644 backend/src/main/java/com/gpf/pethospital/controller/DrugController.java create mode 100644 backend/src/main/java/com/gpf/pethospital/controller/MedicalRecordController.java create mode 100644 backend/src/main/java/com/gpf/pethospital/controller/MessageController.java create mode 100644 backend/src/main/java/com/gpf/pethospital/controller/NoticeController.java create mode 100644 backend/src/main/java/com/gpf/pethospital/controller/OrderController.java create mode 100644 backend/src/main/java/com/gpf/pethospital/controller/PetController.java create mode 100644 backend/src/main/java/com/gpf/pethospital/controller/PrescriptionController.java create mode 100644 backend/src/main/java/com/gpf/pethospital/controller/PrescriptionItemController.java create mode 100644 backend/src/main/java/com/gpf/pethospital/controller/ReportController.java create mode 100644 backend/src/main/java/com/gpf/pethospital/controller/StatsController.java create mode 100644 backend/src/main/java/com/gpf/pethospital/controller/StockInController.java create mode 100644 backend/src/main/java/com/gpf/pethospital/controller/StockOutController.java create mode 100644 backend/src/main/java/com/gpf/pethospital/controller/UserController.java create mode 100644 backend/src/main/java/com/gpf/pethospital/controller/VaccineRecordController.java create mode 100644 backend/src/main/java/com/gpf/pethospital/controller/VisitController.java create mode 100644 backend/src/main/java/com/gpf/pethospital/dto/LoginRequest.java create mode 100644 backend/src/main/java/com/gpf/pethospital/dto/RegisterRequest.java create mode 100644 backend/src/main/java/com/gpf/pethospital/dto/ReplyRequest.java create mode 100644 backend/src/main/java/com/gpf/pethospital/entity/Appointment.java create mode 100644 backend/src/main/java/com/gpf/pethospital/entity/Drug.java create mode 100644 backend/src/main/java/com/gpf/pethospital/entity/MedicalRecord.java create mode 100644 backend/src/main/java/com/gpf/pethospital/entity/Message.java create mode 100644 backend/src/main/java/com/gpf/pethospital/entity/Notice.java create mode 100644 backend/src/main/java/com/gpf/pethospital/entity/Order.java create mode 100644 backend/src/main/java/com/gpf/pethospital/entity/Pet.java create mode 100644 backend/src/main/java/com/gpf/pethospital/entity/Prescription.java create mode 100644 backend/src/main/java/com/gpf/pethospital/entity/PrescriptionItem.java create mode 100644 backend/src/main/java/com/gpf/pethospital/entity/Report.java create mode 100644 backend/src/main/java/com/gpf/pethospital/entity/StockIn.java create mode 100644 backend/src/main/java/com/gpf/pethospital/entity/StockOut.java create mode 100644 backend/src/main/java/com/gpf/pethospital/entity/User.java create mode 100644 backend/src/main/java/com/gpf/pethospital/entity/VaccineRecord.java create mode 100644 backend/src/main/java/com/gpf/pethospital/entity/Visit.java create mode 100644 backend/src/main/java/com/gpf/pethospital/mapper/AppointmentMapper.java create mode 100644 backend/src/main/java/com/gpf/pethospital/mapper/DrugMapper.java create mode 100644 backend/src/main/java/com/gpf/pethospital/mapper/MedicalRecordMapper.java create mode 100644 backend/src/main/java/com/gpf/pethospital/mapper/MessageMapper.java create mode 100644 backend/src/main/java/com/gpf/pethospital/mapper/NoticeMapper.java create mode 100644 backend/src/main/java/com/gpf/pethospital/mapper/OrderMapper.java create mode 100644 backend/src/main/java/com/gpf/pethospital/mapper/PetMapper.java create mode 100644 backend/src/main/java/com/gpf/pethospital/mapper/PrescriptionItemMapper.java create mode 100644 backend/src/main/java/com/gpf/pethospital/mapper/PrescriptionMapper.java create mode 100644 backend/src/main/java/com/gpf/pethospital/mapper/ReportMapper.java create mode 100644 backend/src/main/java/com/gpf/pethospital/mapper/StockInMapper.java create mode 100644 backend/src/main/java/com/gpf/pethospital/mapper/StockOutMapper.java create mode 100644 backend/src/main/java/com/gpf/pethospital/mapper/UserMapper.java create mode 100644 backend/src/main/java/com/gpf/pethospital/mapper/VaccineRecordMapper.java create mode 100644 backend/src/main/java/com/gpf/pethospital/mapper/VisitMapper.java create mode 100644 backend/src/main/java/com/gpf/pethospital/security/AuthUser.java create mode 100644 backend/src/main/java/com/gpf/pethospital/security/JwtAuthenticationFilter.java create mode 100644 backend/src/main/java/com/gpf/pethospital/service/AppointmentService.java create mode 100644 backend/src/main/java/com/gpf/pethospital/service/DrugService.java create mode 100644 backend/src/main/java/com/gpf/pethospital/service/MedicalRecordService.java create mode 100644 backend/src/main/java/com/gpf/pethospital/service/MessageService.java create mode 100644 backend/src/main/java/com/gpf/pethospital/service/NoticeService.java create mode 100644 backend/src/main/java/com/gpf/pethospital/service/OrderService.java create mode 100644 backend/src/main/java/com/gpf/pethospital/service/PetService.java create mode 100644 backend/src/main/java/com/gpf/pethospital/service/PrescriptionItemService.java create mode 100644 backend/src/main/java/com/gpf/pethospital/service/PrescriptionService.java create mode 100644 backend/src/main/java/com/gpf/pethospital/service/ReportService.java create mode 100644 backend/src/main/java/com/gpf/pethospital/service/StockInService.java create mode 100644 backend/src/main/java/com/gpf/pethospital/service/StockOutService.java create mode 100644 backend/src/main/java/com/gpf/pethospital/service/UserService.java create mode 100644 backend/src/main/java/com/gpf/pethospital/service/VaccineRecordService.java create mode 100644 backend/src/main/java/com/gpf/pethospital/service/VisitService.java create mode 100644 backend/src/main/java/com/gpf/pethospital/service/impl/AppointmentServiceImpl.java create mode 100644 backend/src/main/java/com/gpf/pethospital/service/impl/DrugServiceImpl.java create mode 100644 backend/src/main/java/com/gpf/pethospital/service/impl/MedicalRecordServiceImpl.java create mode 100644 backend/src/main/java/com/gpf/pethospital/service/impl/MessageServiceImpl.java create mode 100644 backend/src/main/java/com/gpf/pethospital/service/impl/NoticeServiceImpl.java create mode 100644 backend/src/main/java/com/gpf/pethospital/service/impl/OrderServiceImpl.java create mode 100644 backend/src/main/java/com/gpf/pethospital/service/impl/PetServiceImpl.java create mode 100644 backend/src/main/java/com/gpf/pethospital/service/impl/PrescriptionItemServiceImpl.java create mode 100644 backend/src/main/java/com/gpf/pethospital/service/impl/PrescriptionServiceImpl.java create mode 100644 backend/src/main/java/com/gpf/pethospital/service/impl/ReportServiceImpl.java create mode 100644 backend/src/main/java/com/gpf/pethospital/service/impl/StockInServiceImpl.java create mode 100644 backend/src/main/java/com/gpf/pethospital/service/impl/StockOutServiceImpl.java create mode 100644 backend/src/main/java/com/gpf/pethospital/service/impl/UserServiceImpl.java create mode 100644 backend/src/main/java/com/gpf/pethospital/service/impl/VaccineRecordServiceImpl.java create mode 100644 backend/src/main/java/com/gpf/pethospital/service/impl/VisitServiceImpl.java create mode 100644 backend/src/main/java/com/gpf/pethospital/util/JwtUtil.java create mode 100644 backend/src/main/java/com/gpf/pethospital/util/SecurityUtils.java create mode 100644 backend/src/main/resources/application-dev.yml create mode 100644 backend/src/main/resources/application.yml create mode 100644 backend/src/main/resources/data.sql create mode 100644 backend/src/main/resources/schema-h2.sql create mode 100644 backend/src/main/resources/schema.sql create mode 100644 backend/target/classes/application-dev.yml create mode 100644 backend/target/classes/application.yml create mode 100644 backend/target/classes/com/gpf/pethospital/PetHospitalApplication.class create mode 100644 backend/target/classes/com/gpf/pethospital/common/ApiResponse.class create mode 100644 backend/target/classes/com/gpf/pethospital/config/MybatisPlusConfig$1.class create mode 100644 backend/target/classes/com/gpf/pethospital/config/MybatisPlusConfig.class create mode 100644 backend/target/classes/com/gpf/pethospital/config/SecurityConfig.class create mode 100644 backend/target/classes/com/gpf/pethospital/config/WebConfig.class create mode 100644 backend/target/classes/com/gpf/pethospital/controller/AppointmentController.class create mode 100644 backend/target/classes/com/gpf/pethospital/controller/AuthController.class create mode 100644 backend/target/classes/com/gpf/pethospital/controller/DrugController.class create mode 100644 backend/target/classes/com/gpf/pethospital/controller/MedicalRecordController.class create mode 100644 backend/target/classes/com/gpf/pethospital/controller/MessageController.class create mode 100644 backend/target/classes/com/gpf/pethospital/controller/NoticeController.class create mode 100644 backend/target/classes/com/gpf/pethospital/controller/OrderController.class create mode 100644 backend/target/classes/com/gpf/pethospital/controller/PetController.class create mode 100644 backend/target/classes/com/gpf/pethospital/controller/PrescriptionController.class create mode 100644 backend/target/classes/com/gpf/pethospital/controller/PrescriptionItemController.class create mode 100644 backend/target/classes/com/gpf/pethospital/controller/ReportController.class create mode 100644 backend/target/classes/com/gpf/pethospital/controller/StatsController.class create mode 100644 backend/target/classes/com/gpf/pethospital/controller/StockInController.class create mode 100644 backend/target/classes/com/gpf/pethospital/controller/StockOutController.class create mode 100644 backend/target/classes/com/gpf/pethospital/controller/UserController.class create mode 100644 backend/target/classes/com/gpf/pethospital/controller/VaccineRecordController.class create mode 100644 backend/target/classes/com/gpf/pethospital/controller/VisitController.class create mode 100644 backend/target/classes/com/gpf/pethospital/dto/LoginRequest.class create mode 100644 backend/target/classes/com/gpf/pethospital/dto/RegisterRequest.class create mode 100644 backend/target/classes/com/gpf/pethospital/dto/ReplyRequest.class create mode 100644 backend/target/classes/com/gpf/pethospital/entity/Appointment.class create mode 100644 backend/target/classes/com/gpf/pethospital/entity/Drug.class create mode 100644 backend/target/classes/com/gpf/pethospital/entity/MedicalRecord.class create mode 100644 backend/target/classes/com/gpf/pethospital/entity/Message.class create mode 100644 backend/target/classes/com/gpf/pethospital/entity/Notice.class create mode 100644 backend/target/classes/com/gpf/pethospital/entity/Order.class create mode 100644 backend/target/classes/com/gpf/pethospital/entity/Pet.class create mode 100644 backend/target/classes/com/gpf/pethospital/entity/Prescription.class create mode 100644 backend/target/classes/com/gpf/pethospital/entity/PrescriptionItem.class create mode 100644 backend/target/classes/com/gpf/pethospital/entity/Report.class create mode 100644 backend/target/classes/com/gpf/pethospital/entity/StockIn.class create mode 100644 backend/target/classes/com/gpf/pethospital/entity/StockOut.class create mode 100644 backend/target/classes/com/gpf/pethospital/entity/User.class create mode 100644 backend/target/classes/com/gpf/pethospital/entity/VaccineRecord.class create mode 100644 backend/target/classes/com/gpf/pethospital/entity/Visit.class create mode 100644 backend/target/classes/com/gpf/pethospital/mapper/AppointmentMapper.class create mode 100644 backend/target/classes/com/gpf/pethospital/mapper/DrugMapper.class create mode 100644 backend/target/classes/com/gpf/pethospital/mapper/MedicalRecordMapper.class create mode 100644 backend/target/classes/com/gpf/pethospital/mapper/MessageMapper.class create mode 100644 backend/target/classes/com/gpf/pethospital/mapper/NoticeMapper.class create mode 100644 backend/target/classes/com/gpf/pethospital/mapper/OrderMapper.class create mode 100644 backend/target/classes/com/gpf/pethospital/mapper/PetMapper.class create mode 100644 backend/target/classes/com/gpf/pethospital/mapper/PrescriptionItemMapper.class create mode 100644 backend/target/classes/com/gpf/pethospital/mapper/PrescriptionMapper.class create mode 100644 backend/target/classes/com/gpf/pethospital/mapper/ReportMapper.class create mode 100644 backend/target/classes/com/gpf/pethospital/mapper/StockInMapper.class create mode 100644 backend/target/classes/com/gpf/pethospital/mapper/StockOutMapper.class create mode 100644 backend/target/classes/com/gpf/pethospital/mapper/UserMapper.class create mode 100644 backend/target/classes/com/gpf/pethospital/mapper/VaccineRecordMapper.class create mode 100644 backend/target/classes/com/gpf/pethospital/mapper/VisitMapper.class create mode 100644 backend/target/classes/com/gpf/pethospital/security/AuthUser.class create mode 100644 backend/target/classes/com/gpf/pethospital/security/JwtAuthenticationFilter.class create mode 100644 backend/target/classes/com/gpf/pethospital/service/AppointmentService.class create mode 100644 backend/target/classes/com/gpf/pethospital/service/DrugService.class create mode 100644 backend/target/classes/com/gpf/pethospital/service/MedicalRecordService.class create mode 100644 backend/target/classes/com/gpf/pethospital/service/MessageService.class create mode 100644 backend/target/classes/com/gpf/pethospital/service/NoticeService.class create mode 100644 backend/target/classes/com/gpf/pethospital/service/OrderService.class create mode 100644 backend/target/classes/com/gpf/pethospital/service/PetService.class create mode 100644 backend/target/classes/com/gpf/pethospital/service/PrescriptionItemService.class create mode 100644 backend/target/classes/com/gpf/pethospital/service/PrescriptionService.class create mode 100644 backend/target/classes/com/gpf/pethospital/service/ReportService.class create mode 100644 backend/target/classes/com/gpf/pethospital/service/StockInService.class create mode 100644 backend/target/classes/com/gpf/pethospital/service/StockOutService.class create mode 100644 backend/target/classes/com/gpf/pethospital/service/UserService.class create mode 100644 backend/target/classes/com/gpf/pethospital/service/VaccineRecordService.class create mode 100644 backend/target/classes/com/gpf/pethospital/service/VisitService.class create mode 100644 backend/target/classes/com/gpf/pethospital/service/impl/AppointmentServiceImpl.class create mode 100644 backend/target/classes/com/gpf/pethospital/service/impl/DrugServiceImpl.class create mode 100644 backend/target/classes/com/gpf/pethospital/service/impl/MedicalRecordServiceImpl.class create mode 100644 backend/target/classes/com/gpf/pethospital/service/impl/MessageServiceImpl.class create mode 100644 backend/target/classes/com/gpf/pethospital/service/impl/NoticeServiceImpl.class create mode 100644 backend/target/classes/com/gpf/pethospital/service/impl/OrderServiceImpl.class create mode 100644 backend/target/classes/com/gpf/pethospital/service/impl/PetServiceImpl.class create mode 100644 backend/target/classes/com/gpf/pethospital/service/impl/PrescriptionItemServiceImpl.class create mode 100644 backend/target/classes/com/gpf/pethospital/service/impl/PrescriptionServiceImpl.class create mode 100644 backend/target/classes/com/gpf/pethospital/service/impl/ReportServiceImpl.class create mode 100644 backend/target/classes/com/gpf/pethospital/service/impl/StockInServiceImpl.class create mode 100644 backend/target/classes/com/gpf/pethospital/service/impl/StockOutServiceImpl.class create mode 100644 backend/target/classes/com/gpf/pethospital/service/impl/UserServiceImpl.class create mode 100644 backend/target/classes/com/gpf/pethospital/service/impl/VaccineRecordServiceImpl.class create mode 100644 backend/target/classes/com/gpf/pethospital/service/impl/VisitServiceImpl.class create mode 100644 backend/target/classes/com/gpf/pethospital/util/JwtUtil.class create mode 100644 backend/target/classes/com/gpf/pethospital/util/SecurityUtils.class create mode 100644 backend/target/classes/data.sql create mode 100644 backend/target/classes/schema-h2.sql create mode 100644 backend/target/classes/schema.sql create mode 100644 backend/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst create mode 100644 backend/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst create mode 100644 database_er_diagram.mmd create mode 100644 database_schema_documentation.md create mode 100644 frp_setup_guide.md create mode 100644 simple_er_diagram.txt create mode 100644 start_frp.sh diff --git a/backend/backend_complete.log b/backend/backend_complete.log new file mode 100644 index 0000000..d725c37 --- /dev/null +++ b/backend/backend_complete.log @@ -0,0 +1,313 @@ +[INFO] Scanning for projects... +[INFO] +[INFO] ------------------------< com.gpf:pet-hospital >------------------------ +[INFO] Building 爱维宠物医院管理平台 1.0.0 +[INFO] --------------------------------[ jar ]--------------------------------- +[INFO] +[INFO] >>> spring-boot-maven-plugin:2.7.18:run (default-cli) > test-compile @ pet-hospital >>> +[INFO] +[INFO] --- maven-resources-plugin:3.2.0:resources (default-resources) @ pet-hospital --- +[INFO] Using 'UTF-8' encoding to copy filtered resources. +[INFO] Using 'UTF-8' encoding to copy filtered properties files. +[INFO] Copying 2 resources +[INFO] Copying 1 resource +[INFO] +[INFO] --- maven-compiler-plugin:3.10.1:compile (default-compile) @ pet-hospital --- +[INFO] Nothing to compile - all classes are up to date +[INFO] +[INFO] --- maven-resources-plugin:3.2.0:testResources (default-testResources) @ pet-hospital --- +[INFO] Using 'UTF-8' encoding to copy filtered resources. +[INFO] Using 'UTF-8' encoding to copy filtered properties files. +[INFO] skip non existing resourceDirectory /mnt/d/bs/gpf_pet_hospital/backend/src/test/resources +[INFO] +[INFO] --- maven-compiler-plugin:3.10.1:testCompile (default-testCompile) @ pet-hospital --- +[INFO] No sources to compile +[INFO] +[INFO] <<< spring-boot-maven-plugin:2.7.18:run (default-cli) < test-compile @ pet-hospital <<< +[INFO] +[INFO] +[INFO] --- spring-boot-maven-plugin:2.7.18:run (default-cli) @ pet-hospital --- +[INFO] Attaching agents: [] + + . ____ _ __ _ _ + /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \ +( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \ + \\/ ___)| |_)| | | | | || (_| | ) ) ) ) + ' |____| .__|_| |_|_| |_\__, | / / / / + =========|_|==============|___/=/_/_/_/ + :: Spring Boot :: (v2.7.18) + +2026-01-29 12:16:50.735 INFO 6824 --- [ main] c.g.pethospital.PetHospitalApplication : Starting PetHospitalApplication using Java 17.0.17 on LAPTOP-FS8K5GSO with PID 6824 (/mnt/d/bs/gpf_pet_hospital/backend/target/classes started by wangzq in /mnt/d/bs/gpf_pet_hospital/backend) +2026-01-29 12:16:50.740 INFO 6824 --- [ main] c.g.pethospital.PetHospitalApplication : The following 1 profile is active: "dev" +2026-01-29 12:16:56.239 INFO 6824 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8081 (http) +2026-01-29 12:16:56.265 INFO 6824 --- [ main] o.apache.catalina.core.StandardService : Starting service [Tomcat] +2026-01-29 12:16:56.266 INFO 6824 --- [ main] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.83] +2026-01-29 12:16:56.426 INFO 6824 --- [ main] o.a.c.c.C.[Tomcat].[localhost].[/api] : Initializing Spring embedded WebApplicationContext +2026-01-29 12:16:56.426 INFO 6824 --- [ main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 5611 ms +2026-01-29 12:16:56.484 INFO 6824 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting... +2026-01-29 12:16:57.245 INFO 6824 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed. +2026-01-29 12:16:57.269 INFO 6824 --- [ main] o.s.b.a.h2.H2ConsoleAutoConfiguration : H2 console available at '/h2-console'. Database available at 'jdbc:h2:mem:testdb' +Logging initialized using 'class org.apache.ibatis.logging.stdout.StdOutImpl' adapter. +Initialization Sequence datacenterId:1 workerId:21 + _ _ |_ _ _|_. ___ _ | _ +| | |\/|_)(_| | |_\ |_)||_|_\ + / | + 3.5.5 +2026-01-29 12:16:59.759 WARN 6824 --- [ main] .s.s.UserDetailsServiceAutoConfiguration : + +Using generated security password: 926319ab-f1b3-4bae-8d73-5c7dc57ed41e + +This generated password is for development use only. Your security configuration must be updated before running your application in production. + +2026-01-29 12:17:00.150 INFO 6824 --- [ main] o.s.s.web.DefaultSecurityFilterChain : Will secure any request with [org.springframework.security.web.session.DisableEncodeUrlFilter@26be9a6, org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter@4d518c66, org.springframework.security.web.context.SecurityContextPersistenceFilter@5a4dda2, org.springframework.security.web.header.HeaderWriterFilter@6df4af5, org.springframework.security.web.authentication.logout.LogoutFilter@582e9152, com.gpf.pethospital.security.JwtAuthenticationFilter@411fa0ce, org.springframework.security.web.savedrequest.RequestCacheAwareFilter@34045582, org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter@1edccfd4, org.springframework.security.web.authentication.AnonymousAuthenticationFilter@251d7fdd, org.springframework.security.web.session.SessionManagementFilter@250d440, org.springframework.security.web.access.ExceptionTranslationFilter@4966bab1, org.springframework.security.web.access.intercept.AuthorizationFilter@60b5e80d] +2026-01-29 12:17:01.506 INFO 6824 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8081 (http) with context path '/api' +2026-01-29 12:17:01.520 INFO 6824 --- [ main] c.g.pethospital.PetHospitalApplication : Started PetHospitalApplication in 12.044 seconds (JVM running for 12.638) +2026-01-29 12:17:06.961 INFO 6824 --- [nio-8081-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/api] : Initializing Spring DispatcherServlet 'dispatcherServlet' +2026-01-29 12:17:06.961 INFO 6824 --- [nio-8081-exec-1] o.s.web.servlet.DispatcherServlet : Initializing Servlet 'dispatcherServlet' +2026-01-29 12:17:06.963 INFO 6824 --- [nio-8081-exec-1] o.s.web.servlet.DispatcherServlet : Completed initialization in 1 ms +Creating a new SqlSession +SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@3c9c63df] was not registered for synchronization because synchronization is not active +JDBC Connection [HikariProxyConnection@598865562 wrapping conn0: url=jdbc:h2:mem:testdb user=SA] will not be managed by Spring +==> Preparing: SELECT id,username,phone,email,password,role,status,avatar,create_time,update_time,deleted FROM `user` WHERE deleted=0 AND (username = ? OR phone = ? OR email = ?) +==> Parameters: admin123(String), admin123(String), admin123(String) +<== Total: 0 +Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@3c9c63df] +Creating a new SqlSession +SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@66aeebc4] was not registered for synchronization because synchronization is not active +JDBC Connection [HikariProxyConnection@947374894 wrapping conn0: url=jdbc:h2:mem:testdb user=SA] will not be managed by Spring +==> Preparing: SELECT COUNT( * ) AS total FROM `user` WHERE deleted=0 AND (username = ? OR phone = ? OR email = ?) +==> Parameters: customer(String), 13900139001(String), customer@example.com(String) +<== Columns: TOTAL +<== Row: 0 +<== Total: 1 +Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@66aeebc4] +Creating a new SqlSession +SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@407d98a4] was not registered for synchronization because synchronization is not active +JDBC Connection [HikariProxyConnection@952904848 wrapping conn0: url=jdbc:h2:mem:testdb user=SA] will not be managed by Spring +==> Preparing: INSERT INTO `user` ( username, phone, email, password, role, status, create_time, update_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ? ) +==> Parameters: customer(String), 13900139001(String), customer@example.com(String), $2a$10$xQOy/03sZQwPYhFu613TA.pfqYWVVwm8ObpQ7qnhuiW4vHpbEN7fy(String), CUSTOMER(String), 1(Integer), 2026-01-29T12:17:11.108203849(LocalDateTime), 2026-01-29T12:17:11.108203849(LocalDateTime) +<== Updates: 1 +Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@407d98a4] +Creating a new SqlSession +SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@7038ac66] was not registered for synchronization because synchronization is not active +JDBC Connection [HikariProxyConnection@2130660369 wrapping conn0: url=jdbc:h2:mem:testdb user=SA] will not be managed by Spring +==> Preparing: SELECT id,username,phone,email,password,role,status,avatar,create_time,update_time,deleted FROM `user` WHERE deleted=0 AND (username = ? OR phone = ? OR email = ?) +==> Parameters: customer(String), customer(String), customer(String) +<== Columns: ID, USERNAME, PHONE, EMAIL, PASSWORD, ROLE, STATUS, AVATAR, CREATE_TIME, UPDATE_TIME, DELETED +<== Row: 1, customer, 13900139001, customer@example.com, $2a$10$xQOy/03sZQwPYhFu613TA.pfqYWVVwm8ObpQ7qnhuiW4vHpbEN7fy, CUSTOMER, 1, null, 2026-01-29 12:17:11.108204, 2026-01-29 12:17:11.108204, 0 +<== Total: 1 +Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@7038ac66] +Creating a new SqlSession +SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@79f8c3da] was not registered for synchronization because synchronization is not active +JDBC Connection [HikariProxyConnection@1968400554 wrapping conn0: url=jdbc:h2:mem:testdb user=SA] will not be managed by Spring +==> Preparing: INSERT INTO pet ( owner_id, name, breed, gender, create_time, update_time ) VALUES ( ?, ?, ?, ?, ?, ? ) +==> Parameters: 1(Long), 小黄(String), 拉布拉多(String), F(String), 2026-01-29T12:17:18.870163031(LocalDateTime), 2026-01-29T12:17:18.870163031(LocalDateTime) +<== Updates: 1 +Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@79f8c3da] +Creating a new SqlSession +SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@70112bd5] was not registered for synchronization because synchronization is not active +JDBC Connection [HikariProxyConnection@1858967151 wrapping conn0: url=jdbc:h2:mem:testdb user=SA] will not be managed by Spring +==> Preparing: INSERT INTO appointment ( customer_id, pet_id, appointment_date, time_slot, status, remark, create_time, update_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ? ) +Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@70112bd5] +2026-01-29 12:17:23.261 ERROR 6824 --- [nio-8081-exec-8] o.a.c.c.C.[.[.[.[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [/api] threw exception [Request processing failed; nested exception is org.springframework.jdbc.BadSqlGrammarException: +### Error updating database. Cause: org.h2.jdbc.JdbcSQLSyntaxErrorException: Column "TIME_SLOT" not found; SQL statement: +INSERT INTO appointment ( customer_id, pet_id, appointment_date, time_slot, status, remark, create_time, update_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ? ) [42122-214] +### The error may exist in com/gpf/pethospital/mapper/AppointmentMapper.java (best guess) +### The error may involve com.gpf.pethospital.mapper.AppointmentMapper.insert +### The error occurred while executing an update +### SQL: INSERT INTO appointment ( customer_id, pet_id, appointment_date, time_slot, status, remark, create_time, update_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ? ) +### Cause: org.h2.jdbc.JdbcSQLSyntaxErrorException: Column "TIME_SLOT" not found; SQL statement: +INSERT INTO appointment ( customer_id, pet_id, appointment_date, time_slot, status, remark, create_time, update_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ? ) [42122-214] +; bad SQL grammar []; nested exception is org.h2.jdbc.JdbcSQLSyntaxErrorException: Column "TIME_SLOT" not found; SQL statement: +INSERT INTO appointment ( customer_id, pet_id, appointment_date, time_slot, status, remark, create_time, update_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ? ) [42122-214]] with root cause + +org.h2.jdbc.JdbcSQLSyntaxErrorException: Column "TIME_SLOT" not found; SQL statement: +INSERT INTO appointment ( customer_id, pet_id, appointment_date, time_slot, status, remark, create_time, update_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ? ) [42122-214] + at org.h2.message.DbException.getJdbcSQLException(DbException.java:502) ~[h2-2.1.214.jar:2.1.214] + at org.h2.message.DbException.getJdbcSQLException(DbException.java:477) ~[h2-2.1.214.jar:2.1.214] + at org.h2.message.DbException.get(DbException.java:223) ~[h2-2.1.214.jar:2.1.214] + at org.h2.message.DbException.get(DbException.java:199) ~[h2-2.1.214.jar:2.1.214] + at org.h2.table.Table.getColumn(Table.java:749) ~[h2-2.1.214.jar:2.1.214] + at org.h2.command.Parser.parseColumn(Parser.java:1256) ~[h2-2.1.214.jar:2.1.214] + at org.h2.command.Parser.parseColumnList(Parser.java:1241) ~[h2-2.1.214.jar:2.1.214] + at org.h2.command.Parser.parseInsert(Parser.java:1641) ~[h2-2.1.214.jar:2.1.214] + at org.h2.command.Parser.parsePrepared(Parser.java:814) ~[h2-2.1.214.jar:2.1.214] + at org.h2.command.Parser.parse(Parser.java:689) ~[h2-2.1.214.jar:2.1.214] + at org.h2.command.Parser.parse(Parser.java:661) ~[h2-2.1.214.jar:2.1.214] + at org.h2.command.Parser.prepareCommand(Parser.java:569) ~[h2-2.1.214.jar:2.1.214] + at org.h2.engine.SessionLocal.prepareLocal(SessionLocal.java:631) ~[h2-2.1.214.jar:2.1.214] + at org.h2.engine.SessionLocal.prepareCommand(SessionLocal.java:554) ~[h2-2.1.214.jar:2.1.214] + at org.h2.jdbc.JdbcConnection.prepareCommand(JdbcConnection.java:1116) ~[h2-2.1.214.jar:2.1.214] + at org.h2.jdbc.JdbcPreparedStatement.(JdbcPreparedStatement.java:92) ~[h2-2.1.214.jar:2.1.214] + at org.h2.jdbc.JdbcConnection.prepareStatement(JdbcConnection.java:1099) ~[h2-2.1.214.jar:2.1.214] + at com.zaxxer.hikari.pool.ProxyConnection.prepareStatement(ProxyConnection.java:372) ~[HikariCP-4.0.3.jar:na] + at com.zaxxer.hikari.pool.HikariProxyConnection.prepareStatement(HikariProxyConnection.java) ~[HikariCP-4.0.3.jar:na] + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na] + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[na:na] + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na] + at java.base/java.lang.reflect.Method.invoke(Method.java:569) ~[na:na] + at org.apache.ibatis.logging.jdbc.ConnectionLogger.invoke(ConnectionLogger.java:53) ~[mybatis-3.5.15.jar:3.5.15] + at jdk.proxy3/jdk.proxy3.$Proxy64.prepareStatement(Unknown Source) ~[na:na] + at org.apache.ibatis.executor.statement.PreparedStatementHandler.instantiateStatement(PreparedStatementHandler.java:84) ~[mybatis-3.5.15.jar:3.5.15] + at org.apache.ibatis.executor.statement.BaseStatementHandler.prepare(BaseStatementHandler.java:90) ~[mybatis-3.5.15.jar:3.5.15] + at org.apache.ibatis.executor.statement.RoutingStatementHandler.prepare(RoutingStatementHandler.java:60) ~[mybatis-3.5.15.jar:3.5.15] + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na] + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[na:na] + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na] + at java.base/java.lang.reflect.Method.invoke(Method.java:569) ~[na:na] + at org.apache.ibatis.plugin.Invocation.proceed(Invocation.java:49) ~[mybatis-3.5.15.jar:3.5.15] + at com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor.intercept(MybatisPlusInterceptor.java:106) ~[mybatis-plus-extension-3.5.5.jar:3.5.5] + at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:59) ~[mybatis-3.5.15.jar:3.5.15] + at jdk.proxy2/jdk.proxy2.$Proxy106.prepare(Unknown Source) ~[na:na] + at org.apache.ibatis.executor.SimpleExecutor.prepareStatement(SimpleExecutor.java:90) ~[mybatis-3.5.15.jar:3.5.15] + at org.apache.ibatis.executor.SimpleExecutor.doUpdate(SimpleExecutor.java:49) ~[mybatis-3.5.15.jar:3.5.15] + at org.apache.ibatis.executor.BaseExecutor.update(BaseExecutor.java:117) ~[mybatis-3.5.15.jar:3.5.15] + at org.apache.ibatis.executor.CachingExecutor.update(CachingExecutor.java:76) ~[mybatis-3.5.15.jar:3.5.15] + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na] + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[na:na] + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na] + at java.base/java.lang.reflect.Method.invoke(Method.java:569) ~[na:na] + at org.apache.ibatis.plugin.Invocation.proceed(Invocation.java:49) ~[mybatis-3.5.15.jar:3.5.15] + at com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor.intercept(MybatisPlusInterceptor.java:106) ~[mybatis-plus-extension-3.5.5.jar:3.5.5] + at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:59) ~[mybatis-3.5.15.jar:3.5.15] + at jdk.proxy2/jdk.proxy2.$Proxy105.update(Unknown Source) ~[na:na] + at org.apache.ibatis.session.defaults.DefaultSqlSession.update(DefaultSqlSession.java:197) ~[mybatis-3.5.15.jar:3.5.15] + at org.apache.ibatis.session.defaults.DefaultSqlSession.insert(DefaultSqlSession.java:184) ~[mybatis-3.5.15.jar:3.5.15] + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na] + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[na:na] + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na] + at java.base/java.lang.reflect.Method.invoke(Method.java:569) ~[na:na] + at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:425) ~[mybatis-spring-2.1.2.jar:2.1.2] + at jdk.proxy2/jdk.proxy2.$Proxy71.insert(Unknown Source) ~[na:na] + at org.mybatis.spring.SqlSessionTemplate.insert(SqlSessionTemplate.java:272) ~[mybatis-spring-2.1.2.jar:2.1.2] + at com.baomidou.mybatisplus.core.override.MybatisMapperMethod.execute(MybatisMapperMethod.java:59) ~[mybatis-plus-core-3.5.5.jar:3.5.5] + at com.baomidou.mybatisplus.core.override.MybatisMapperProxy$PlainMethodInvoker.invoke(MybatisMapperProxy.java:152) ~[mybatis-plus-core-3.5.5.jar:3.5.5] + at com.baomidou.mybatisplus.core.override.MybatisMapperProxy.invoke(MybatisMapperProxy.java:89) ~[mybatis-plus-core-3.5.5.jar:3.5.5] + at jdk.proxy2/jdk.proxy2.$Proxy77.insert(Unknown Source) ~[na:na] + at com.baomidou.mybatisplus.extension.service.IService.save(IService.java:60) ~[mybatis-plus-extension-3.5.5.jar:3.5.5] + at com.baomidou.mybatisplus.extension.service.IService$$FastClassBySpringCGLIB$$f8525d18.invoke() ~[mybatis-plus-extension-3.5.5.jar:3.5.5] + at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218) ~[spring-core-5.3.31.jar:5.3.31] + at org.springframework.aop.framework.CglibAopProxy.invokeMethod(CglibAopProxy.java:386) ~[spring-aop-5.3.31.jar:5.3.31] + at org.springframework.aop.framework.CglibAopProxy.access$000(CglibAopProxy.java:85) ~[spring-aop-5.3.31.jar:5.3.31] + at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:703) ~[spring-aop-5.3.31.jar:5.3.31] + at com.gpf.pethospital.service.impl.AppointmentServiceImpl$$EnhancerBySpringCGLIB$$4a795df8.save() ~[classes/:na] + at com.gpf.pethospital.controller.AppointmentController.create(AppointmentController.java:33) ~[classes/:na] + at com.gpf.pethospital.controller.AppointmentController$$FastClassBySpringCGLIB$$4329551c.invoke() ~[classes/:na] + at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218) ~[spring-core-5.3.31.jar:5.3.31] + at org.springframework.aop.framework.CglibAopProxy.invokeMethod(CglibAopProxy.java:386) ~[spring-aop-5.3.31.jar:5.3.31] + at org.springframework.aop.framework.CglibAopProxy.access$000(CglibAopProxy.java:85) ~[spring-aop-5.3.31.jar:5.3.31] + at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:703) ~[spring-aop-5.3.31.jar:5.3.31] + at com.gpf.pethospital.controller.AppointmentController$$EnhancerBySpringCGLIB$$e7e92bd4.create() ~[classes/:na] + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na] + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[na:na] + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na] + at java.base/java.lang.reflect.Method.invoke(Method.java:569) ~[na:na] + at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:205) ~[spring-web-5.3.31.jar:5.3.31] + at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:150) ~[spring-web-5.3.31.jar:5.3.31] + at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:117) ~[spring-webmvc-5.3.31.jar:5.3.31] + at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:895) ~[spring-webmvc-5.3.31.jar:5.3.31] + at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808) ~[spring-webmvc-5.3.31.jar:5.3.31] + at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) ~[spring-webmvc-5.3.31.jar:5.3.31] + at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1072) ~[spring-webmvc-5.3.31.jar:5.3.31] + at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:965) ~[spring-webmvc-5.3.31.jar:5.3.31] + at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) ~[spring-webmvc-5.3.31.jar:5.3.31] + at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:909) ~[spring-webmvc-5.3.31.jar:5.3.31] + at javax.servlet.http.HttpServlet.service(HttpServlet.java:555) ~[tomcat-embed-core-9.0.83.jar:4.0.FR] + at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) ~[spring-webmvc-5.3.31.jar:5.3.31] + at javax.servlet.http.HttpServlet.service(HttpServlet.java:623) ~[tomcat-embed-core-9.0.83.jar:4.0.FR] + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:209) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51) ~[tomcat-embed-websocket-9.0.83.jar:9.0.83] + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:337) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.access.intercept.AuthorizationFilter.doFilter(AuthorizationFilter.java:96) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:346) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:122) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:116) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:346) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:126) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:81) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:346) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:109) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:346) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:149) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:346) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:63) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:346) ~[spring-security-web-5.7.11.jar:5.7.11] + at com.gpf.pethospital.security.JwtAuthenticationFilter.doFilterInternal(JwtAuthenticationFilter.java:45) ~[classes/:na] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) ~[spring-web-5.3.31.jar:5.3.31] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:346) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:103) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:89) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:346) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.header.HeaderWriterFilter.doHeadersAfter(HeaderWriterFilter.java:90) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:75) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) ~[spring-web-5.3.31.jar:5.3.31] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:346) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:112) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:82) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:346) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:55) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) ~[spring-web-5.3.31.jar:5.3.31] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:346) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.session.DisableEncodeUrlFilter.doFilterInternal(DisableEncodeUrlFilter.java:42) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) ~[spring-web-5.3.31.jar:5.3.31] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:346) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:221) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:186) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:354) ~[spring-web-5.3.31.jar:5.3.31] + at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:267) ~[spring-web-5.3.31.jar:5.3.31] + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) ~[spring-web-5.3.31.jar:5.3.31] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) ~[spring-web-5.3.31.jar:5.3.31] + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) ~[spring-web-5.3.31.jar:5.3.31] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) ~[spring-web-5.3.31.jar:5.3.31] + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) ~[spring-web-5.3.31.jar:5.3.31] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) ~[spring-web-5.3.31.jar:5.3.31] + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:168) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:481) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:130) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:342) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:390) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:928) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1794) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at java.base/java.lang.Thread.run(Thread.java:840) ~[na:na] + +Creating a new SqlSession +SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@337f2551] was not registered for synchronization because synchronization is not active +JDBC Connection [HikariProxyConnection@1035521358 wrapping conn0: url=jdbc:h2:mem:testdb user=SA] will not be managed by Spring +==> Preparing: SELECT id,username,phone,email,password,role,status,avatar,create_time,update_time,deleted FROM `user` WHERE deleted=0 AND (username = ? OR phone = ? OR email = ?) +==> Parameters: admin123(String), admin123(String), admin123(String) +<== Total: 0 +Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@337f2551] +2026-01-29 12:17:30.582 INFO 6824 --- [ionShutdownHook] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown initiated... +2026-01-29 12:17:30.584 INFO 6824 --- [ionShutdownHook] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown completed. +[INFO] ------------------------------------------------------------------------ +[INFO] BUILD FAILURE +[INFO] ------------------------------------------------------------------------ +[INFO] Total time: 49.018 s +[INFO] Finished at: 2026-01-29T12:17:30+08:00 +[INFO] ------------------------------------------------------------------------ +[ERROR] Failed to execute goal org.springframework.boot:spring-boot-maven-plugin:2.7.18:run (default-cli) on project pet-hospital: Application finished with exit code: 143 -> [Help 1] +[ERROR] +[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch. +[ERROR] Re-run Maven using the -X switch to enable full debug logging. +[ERROR] +[ERROR] For more information about the errors and possible solutions, please read the following articles: +[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoExecutionException diff --git a/backend/backend_final.log b/backend/backend_final.log new file mode 100644 index 0000000..be8e012 --- /dev/null +++ b/backend/backend_final.log @@ -0,0 +1,79 @@ +[INFO] Scanning for projects... +[INFO] +[INFO] ------------------------< com.gpf:pet-hospital >------------------------ +[INFO] Building 爱维宠物医院管理平台 1.0.0 +[INFO] --------------------------------[ jar ]--------------------------------- +[INFO] +[INFO] >>> spring-boot-maven-plugin:2.7.18:run (default-cli) > test-compile @ pet-hospital >>> +[INFO] +[INFO] --- maven-resources-plugin:3.2.0:resources (default-resources) @ pet-hospital --- +[INFO] Using 'UTF-8' encoding to copy filtered resources. +[INFO] Using 'UTF-8' encoding to copy filtered properties files. +[INFO] Copying 2 resources +[INFO] Copying 1 resource +[INFO] +[INFO] --- maven-compiler-plugin:3.10.1:compile (default-compile) @ pet-hospital --- +[INFO] Nothing to compile - all classes are up to date +[INFO] +[INFO] --- maven-resources-plugin:3.2.0:testResources (default-testResources) @ pet-hospital --- +[INFO] Using 'UTF-8' encoding to copy filtered resources. +[INFO] Using 'UTF-8' encoding to copy filtered properties files. +[INFO] skip non existing resourceDirectory /mnt/d/bs/gpf_pet_hospital/backend/src/test/resources +[INFO] +[INFO] --- maven-compiler-plugin:3.10.1:testCompile (default-testCompile) @ pet-hospital --- +[INFO] No sources to compile +[INFO] +[INFO] <<< spring-boot-maven-plugin:2.7.18:run (default-cli) < test-compile @ pet-hospital <<< +[INFO] +[INFO] +[INFO] --- spring-boot-maven-plugin:2.7.18:run (default-cli) @ pet-hospital --- +[INFO] Attaching agents: [] + + . ____ _ __ _ _ + /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \ +( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \ + \\/ ___)| |_)| | | | | || (_| | ) ) ) ) + ' |____| .__|_| |_|_| |_\__, | / / / / + =========|_|==============|___/=/_/_/_/ + :: Spring Boot :: (v2.7.18) + +2026-01-29 12:09:25.156 INFO 6050 --- [ main] c.g.pethospital.PetHospitalApplication : Starting PetHospitalApplication using Java 17.0.17 on LAPTOP-FS8K5GSO with PID 6050 (/mnt/d/bs/gpf_pet_hospital/backend/target/classes started by wangzq in /mnt/d/bs/gpf_pet_hospital/backend) +2026-01-29 12:09:25.161 INFO 6050 --- [ main] c.g.pethospital.PetHospitalApplication : The following 1 profile is active: "dev" +2026-01-29 12:09:30.848 INFO 6050 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8081 (http) +2026-01-29 12:09:30.873 INFO 6050 --- [ main] o.apache.catalina.core.StandardService : Starting service [Tomcat] +2026-01-29 12:09:30.873 INFO 6050 --- [ main] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.83] +2026-01-29 12:09:31.043 INFO 6050 --- [ main] o.a.c.c.C.[Tomcat].[localhost].[/api] : Initializing Spring embedded WebApplicationContext +2026-01-29 12:09:31.043 INFO 6050 --- [ main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 5806 ms +2026-01-29 12:09:31.101 INFO 6050 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting... +2026-01-29 12:09:31.897 INFO 6050 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed. +2026-01-29 12:09:31.923 INFO 6050 --- [ main] o.s.b.a.h2.H2ConsoleAutoConfiguration : H2 console available at '/h2-console'. Database available at 'jdbc:h2:mem:testdb' +Logging initialized using 'class org.apache.ibatis.logging.stdout.StdOutImpl' adapter. +Initialization Sequence datacenterId:1 workerId:6 + _ _ |_ _ _|_. ___ _ | _ +| | |\/|_)(_| | |_\ |_)||_|_\ + / | + 3.5.5 +2026-01-29 12:09:34.317 WARN 6050 --- [ main] .s.s.UserDetailsServiceAutoConfiguration : + +Using generated security password: 332a46eb-449c-42d8-94b3-6f0bba3c5735 + +This generated password is for development use only. Your security configuration must be updated before running your application in production. + +2026-01-29 12:09:34.688 INFO 6050 --- [ main] o.s.s.web.DefaultSecurityFilterChain : Will secure any request with [org.springframework.security.web.session.DisableEncodeUrlFilter@21edd891, org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter@de579ff, org.springframework.security.web.context.SecurityContextPersistenceFilter@7abeabe9, org.springframework.security.web.header.HeaderWriterFilter@22d477c2, org.springframework.security.web.authentication.logout.LogoutFilter@bb3ecfe, com.gpf.pethospital.security.JwtAuthenticationFilter@7971c2a9, org.springframework.security.web.savedrequest.RequestCacheAwareFilter@1b52699c, org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter@250d440, org.springframework.security.web.authentication.AnonymousAuthenticationFilter@2fd39436, org.springframework.security.web.session.SessionManagementFilter@448c92fc, org.springframework.security.web.access.ExceptionTranslationFilter@79ecc507, org.springframework.security.web.access.intercept.AuthorizationFilter@582e9152] +2026-01-29 12:09:36.166 INFO 6050 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8081 (http) with context path '/api' +2026-01-29 12:09:36.179 INFO 6050 --- [ main] c.g.pethospital.PetHospitalApplication : Started PetHospitalApplication in 12.27 seconds (JVM running for 12.892) +2026-01-29 12:09:53.265 INFO 6050 --- [ionShutdownHook] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown initiated... +2026-01-29 12:09:53.269 INFO 6050 --- [ionShutdownHook] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown completed. +[INFO] ------------------------------------------------------------------------ +[INFO] BUILD FAILURE +[INFO] ------------------------------------------------------------------------ +[INFO] Total time: 37.310 s +[INFO] Finished at: 2026-01-29T12:09:53+08:00 +[INFO] ------------------------------------------------------------------------ +[ERROR] Failed to execute goal org.springframework.boot:spring-boot-maven-plugin:2.7.18:run (default-cli) on project pet-hospital: Application finished with exit code: 143 -> [Help 1] +[ERROR] +[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch. +[ERROR] Re-run Maven using the -X switch to enable full debug logging. +[ERROR] +[ERROR] For more information about the errors and possible solutions, please read the following articles: +[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoExecutionException diff --git a/backend/backend_final_fixed.log b/backend/backend_final_fixed.log new file mode 100644 index 0000000..ee108dc --- /dev/null +++ b/backend/backend_final_fixed.log @@ -0,0 +1,276 @@ +[INFO] Scanning for projects... +[INFO] +[INFO] ------------------------< com.gpf:pet-hospital >------------------------ +[INFO] Building 爱维宠物医院管理平台 1.0.0 +[INFO] --------------------------------[ jar ]--------------------------------- +[INFO] +[INFO] >>> spring-boot-maven-plugin:2.7.18:run (default-cli) > test-compile @ pet-hospital >>> +[INFO] +[INFO] --- maven-resources-plugin:3.2.0:resources (default-resources) @ pet-hospital --- +[INFO] Using 'UTF-8' encoding to copy filtered resources. +[INFO] Using 'UTF-8' encoding to copy filtered properties files. +[INFO] Copying 2 resources +[INFO] Copying 2 resources +[INFO] +[INFO] --- maven-compiler-plugin:3.10.1:compile (default-compile) @ pet-hospital --- +[INFO] Nothing to compile - all classes are up to date +[INFO] +[INFO] --- maven-resources-plugin:3.2.0:testResources (default-testResources) @ pet-hospital --- +[INFO] Using 'UTF-8' encoding to copy filtered resources. +[INFO] Using 'UTF-8' encoding to copy filtered properties files. +[INFO] skip non existing resourceDirectory /mnt/d/bs/gpf_pet_hospital/backend/src/test/resources +[INFO] +[INFO] --- maven-compiler-plugin:3.10.1:testCompile (default-testCompile) @ pet-hospital --- +[INFO] No sources to compile +[INFO] +[INFO] <<< spring-boot-maven-plugin:2.7.18:run (default-cli) < test-compile @ pet-hospital <<< +[INFO] +[INFO] +[INFO] --- spring-boot-maven-plugin:2.7.18:run (default-cli) @ pet-hospital --- +[INFO] Attaching agents: [] + + . ____ _ __ _ _ + /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \ +( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \ + \\/ ___)| |_)| | | | | || (_| | ) ) ) ) + ' |____| .__|_| |_|_| |_\__, | / / / / + =========|_|==============|___/=/_/_/_/ + :: Spring Boot :: (v2.7.18) + +2026-01-29 12:17:52.260 INFO 6984 --- [ main] c.g.pethospital.PetHospitalApplication : Starting PetHospitalApplication using Java 17.0.17 on LAPTOP-FS8K5GSO with PID 6984 (/mnt/d/bs/gpf_pet_hospital/backend/target/classes started by wangzq in /mnt/d/bs/gpf_pet_hospital/backend) +2026-01-29 12:17:52.265 INFO 6984 --- [ main] c.g.pethospital.PetHospitalApplication : The following 1 profile is active: "dev" +2026-01-29 12:17:57.768 INFO 6984 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8081 (http) +2026-01-29 12:17:57.795 INFO 6984 --- [ main] o.apache.catalina.core.StandardService : Starting service [Tomcat] +2026-01-29 12:17:57.796 INFO 6984 --- [ main] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.83] +2026-01-29 12:17:57.957 INFO 6984 --- [ main] o.a.c.c.C.[Tomcat].[localhost].[/api] : Initializing Spring embedded WebApplicationContext +2026-01-29 12:17:57.957 INFO 6984 --- [ main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 5612 ms +2026-01-29 12:17:58.012 INFO 6984 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting... +2026-01-29 12:17:58.796 INFO 6984 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed. +2026-01-29 12:17:58.826 INFO 6984 --- [ main] o.s.b.a.h2.H2ConsoleAutoConfiguration : H2 console available at '/h2-console'. Database available at 'jdbc:h2:mem:testdb' +Logging initialized using 'class org.apache.ibatis.logging.stdout.StdOutImpl' adapter. +Initialization Sequence datacenterId:1 workerId:16 + _ _ |_ _ _|_. ___ _ | _ +| | |\/|_)(_| | |_\ |_)||_|_\ + / | + 3.5.5 +2026-01-29 12:18:01.177 WARN 6984 --- [ main] .s.s.UserDetailsServiceAutoConfiguration : + +Using generated security password: 26737b8f-8750-49cd-b844-01692eface7e + +This generated password is for development use only. Your security configuration must be updated before running your application in production. + +2026-01-29 12:18:01.533 INFO 6984 --- [ main] o.s.s.web.DefaultSecurityFilterChain : Will secure any request with [org.springframework.security.web.session.DisableEncodeUrlFilter@435e416c, org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter@6af310c7, org.springframework.security.web.context.SecurityContextPersistenceFilter@21edd891, org.springframework.security.web.header.HeaderWriterFilter@340cb97f, org.springframework.security.web.authentication.logout.LogoutFilter@370c9018, com.gpf.pethospital.security.JwtAuthenticationFilter@4aed311e, org.springframework.security.web.savedrequest.RequestCacheAwareFilter@7971c2a9, org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter@60b5e80d, org.springframework.security.web.authentication.AnonymousAuthenticationFilter@4c38cd16, org.springframework.security.web.session.SessionManagementFilter@582e9152, org.springframework.security.web.access.ExceptionTranslationFilter@291a4791, org.springframework.security.web.access.intercept.AuthorizationFilter@482c351d] +2026-01-29 12:18:03.110 INFO 6984 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8081 (http) with context path '/api' +2026-01-29 12:18:03.124 INFO 6984 --- [ main] c.g.pethospital.PetHospitalApplication : Started PetHospitalApplication in 12.261 seconds (JVM running for 12.885) +2026-01-29 12:18:11.902 INFO 6984 --- [nio-8081-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/api] : Initializing Spring DispatcherServlet 'dispatcherServlet' +2026-01-29 12:18:11.902 INFO 6984 --- [nio-8081-exec-1] o.s.web.servlet.DispatcherServlet : Initializing Servlet 'dispatcherServlet' +2026-01-29 12:18:11.903 INFO 6984 --- [nio-8081-exec-1] o.s.web.servlet.DispatcherServlet : Completed initialization in 1 ms +Creating a new SqlSession +SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@1f20fef4] was not registered for synchronization because synchronization is not active +JDBC Connection [HikariProxyConnection@208105529 wrapping conn0: url=jdbc:h2:mem:testdb user=SA] will not be managed by Spring +==> Preparing: SELECT id,username,phone,email,password,role,status,avatar,create_time,update_time,deleted FROM `user` WHERE deleted=0 AND (username = ? OR phone = ? OR email = ?) +==> Parameters: customer(String), customer(String), customer(String) +<== Columns: ID, USERNAME, PHONE, EMAIL, PASSWORD, ROLE, STATUS, AVATAR, CREATE_TIME, UPDATE_TIME, DELETED +<== Row: 3, customer, 13900139000, customer@example.com, $2a$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi, CUSTOMER, 1, null, 2026-01-29 12:17:59.555682, 2026-01-29 12:17:59.555682, 0 +<== Total: 1 +Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@1f20fef4] +Creating a new SqlSession +SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@2b030f70] was not registered for synchronization because synchronization is not active +JDBC Connection [HikariProxyConnection@1718503198 wrapping conn0: url=jdbc:h2:mem:testdb user=SA] will not be managed by Spring +==> Preparing: INSERT INTO appointment ( customer_id, pet_id, appointment_date, time_slot, status, remark, create_time, update_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ? ) +Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@2b030f70] +2026-01-29 12:18:20.043 ERROR 6984 --- [nio-8081-exec-3] o.a.c.c.C.[.[.[.[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [/api] threw exception [Request processing failed; nested exception is org.springframework.jdbc.BadSqlGrammarException: +### Error updating database. Cause: org.h2.jdbc.JdbcSQLSyntaxErrorException: Column "TIME_SLOT" not found; SQL statement: +INSERT INTO appointment ( customer_id, pet_id, appointment_date, time_slot, status, remark, create_time, update_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ? ) [42122-214] +### The error may exist in com/gpf/pethospital/mapper/AppointmentMapper.java (best guess) +### The error may involve com.gpf.pethospital.mapper.AppointmentMapper.insert +### The error occurred while executing an update +### SQL: INSERT INTO appointment ( customer_id, pet_id, appointment_date, time_slot, status, remark, create_time, update_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ? ) +### Cause: org.h2.jdbc.JdbcSQLSyntaxErrorException: Column "TIME_SLOT" not found; SQL statement: +INSERT INTO appointment ( customer_id, pet_id, appointment_date, time_slot, status, remark, create_time, update_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ? ) [42122-214] +; bad SQL grammar []; nested exception is org.h2.jdbc.JdbcSQLSyntaxErrorException: Column "TIME_SLOT" not found; SQL statement: +INSERT INTO appointment ( customer_id, pet_id, appointment_date, time_slot, status, remark, create_time, update_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ? ) [42122-214]] with root cause + +org.h2.jdbc.JdbcSQLSyntaxErrorException: Column "TIME_SLOT" not found; SQL statement: +INSERT INTO appointment ( customer_id, pet_id, appointment_date, time_slot, status, remark, create_time, update_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ? ) [42122-214] + at org.h2.message.DbException.getJdbcSQLException(DbException.java:502) ~[h2-2.1.214.jar:2.1.214] + at org.h2.message.DbException.getJdbcSQLException(DbException.java:477) ~[h2-2.1.214.jar:2.1.214] + at org.h2.message.DbException.get(DbException.java:223) ~[h2-2.1.214.jar:2.1.214] + at org.h2.message.DbException.get(DbException.java:199) ~[h2-2.1.214.jar:2.1.214] + at org.h2.table.Table.getColumn(Table.java:749) ~[h2-2.1.214.jar:2.1.214] + at org.h2.command.Parser.parseColumn(Parser.java:1256) ~[h2-2.1.214.jar:2.1.214] + at org.h2.command.Parser.parseColumnList(Parser.java:1241) ~[h2-2.1.214.jar:2.1.214] + at org.h2.command.Parser.parseInsert(Parser.java:1641) ~[h2-2.1.214.jar:2.1.214] + at org.h2.command.Parser.parsePrepared(Parser.java:814) ~[h2-2.1.214.jar:2.1.214] + at org.h2.command.Parser.parse(Parser.java:689) ~[h2-2.1.214.jar:2.1.214] + at org.h2.command.Parser.parse(Parser.java:661) ~[h2-2.1.214.jar:2.1.214] + at org.h2.command.Parser.prepareCommand(Parser.java:569) ~[h2-2.1.214.jar:2.1.214] + at org.h2.engine.SessionLocal.prepareLocal(SessionLocal.java:631) ~[h2-2.1.214.jar:2.1.214] + at org.h2.engine.SessionLocal.prepareCommand(SessionLocal.java:554) ~[h2-2.1.214.jar:2.1.214] + at org.h2.jdbc.JdbcConnection.prepareCommand(JdbcConnection.java:1116) ~[h2-2.1.214.jar:2.1.214] + at org.h2.jdbc.JdbcPreparedStatement.(JdbcPreparedStatement.java:92) ~[h2-2.1.214.jar:2.1.214] + at org.h2.jdbc.JdbcConnection.prepareStatement(JdbcConnection.java:1099) ~[h2-2.1.214.jar:2.1.214] + at com.zaxxer.hikari.pool.ProxyConnection.prepareStatement(ProxyConnection.java:372) ~[HikariCP-4.0.3.jar:na] + at com.zaxxer.hikari.pool.HikariProxyConnection.prepareStatement(HikariProxyConnection.java) ~[HikariCP-4.0.3.jar:na] + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na] + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[na:na] + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na] + at java.base/java.lang.reflect.Method.invoke(Method.java:569) ~[na:na] + at org.apache.ibatis.logging.jdbc.ConnectionLogger.invoke(ConnectionLogger.java:53) ~[mybatis-3.5.15.jar:3.5.15] + at jdk.proxy3/jdk.proxy3.$Proxy64.prepareStatement(Unknown Source) ~[na:na] + at org.apache.ibatis.executor.statement.PreparedStatementHandler.instantiateStatement(PreparedStatementHandler.java:84) ~[mybatis-3.5.15.jar:3.5.15] + at org.apache.ibatis.executor.statement.BaseStatementHandler.prepare(BaseStatementHandler.java:90) ~[mybatis-3.5.15.jar:3.5.15] + at org.apache.ibatis.executor.statement.RoutingStatementHandler.prepare(RoutingStatementHandler.java:60) ~[mybatis-3.5.15.jar:3.5.15] + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na] + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[na:na] + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na] + at java.base/java.lang.reflect.Method.invoke(Method.java:569) ~[na:na] + at org.apache.ibatis.plugin.Invocation.proceed(Invocation.java:49) ~[mybatis-3.5.15.jar:3.5.15] + at com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor.intercept(MybatisPlusInterceptor.java:106) ~[mybatis-plus-extension-3.5.5.jar:3.5.5] + at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:59) ~[mybatis-3.5.15.jar:3.5.15] + at jdk.proxy2/jdk.proxy2.$Proxy106.prepare(Unknown Source) ~[na:na] + at org.apache.ibatis.executor.SimpleExecutor.prepareStatement(SimpleExecutor.java:90) ~[mybatis-3.5.15.jar:3.5.15] + at org.apache.ibatis.executor.SimpleExecutor.doUpdate(SimpleExecutor.java:49) ~[mybatis-3.5.15.jar:3.5.15] + at org.apache.ibatis.executor.BaseExecutor.update(BaseExecutor.java:117) ~[mybatis-3.5.15.jar:3.5.15] + at org.apache.ibatis.executor.CachingExecutor.update(CachingExecutor.java:76) ~[mybatis-3.5.15.jar:3.5.15] + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na] + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[na:na] + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na] + at java.base/java.lang.reflect.Method.invoke(Method.java:569) ~[na:na] + at org.apache.ibatis.plugin.Invocation.proceed(Invocation.java:49) ~[mybatis-3.5.15.jar:3.5.15] + at com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor.intercept(MybatisPlusInterceptor.java:106) ~[mybatis-plus-extension-3.5.5.jar:3.5.5] + at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:59) ~[mybatis-3.5.15.jar:3.5.15] + at jdk.proxy2/jdk.proxy2.$Proxy105.update(Unknown Source) ~[na:na] + at org.apache.ibatis.session.defaults.DefaultSqlSession.update(DefaultSqlSession.java:197) ~[mybatis-3.5.15.jar:3.5.15] + at org.apache.ibatis.session.defaults.DefaultSqlSession.insert(DefaultSqlSession.java:184) ~[mybatis-3.5.15.jar:3.5.15] + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na] + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[na:na] + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na] + at java.base/java.lang.reflect.Method.invoke(Method.java:569) ~[na:na] + at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:425) ~[mybatis-spring-2.1.2.jar:2.1.2] + at jdk.proxy2/jdk.proxy2.$Proxy71.insert(Unknown Source) ~[na:na] + at org.mybatis.spring.SqlSessionTemplate.insert(SqlSessionTemplate.java:272) ~[mybatis-spring-2.1.2.jar:2.1.2] + at com.baomidou.mybatisplus.core.override.MybatisMapperMethod.execute(MybatisMapperMethod.java:59) ~[mybatis-plus-core-3.5.5.jar:3.5.5] + at com.baomidou.mybatisplus.core.override.MybatisMapperProxy$PlainMethodInvoker.invoke(MybatisMapperProxy.java:152) ~[mybatis-plus-core-3.5.5.jar:3.5.5] + at com.baomidou.mybatisplus.core.override.MybatisMapperProxy.invoke(MybatisMapperProxy.java:89) ~[mybatis-plus-core-3.5.5.jar:3.5.5] + at jdk.proxy2/jdk.proxy2.$Proxy77.insert(Unknown Source) ~[na:na] + at com.baomidou.mybatisplus.extension.service.IService.save(IService.java:60) ~[mybatis-plus-extension-3.5.5.jar:3.5.5] + at com.baomidou.mybatisplus.extension.service.IService$$FastClassBySpringCGLIB$$f8525d18.invoke() ~[mybatis-plus-extension-3.5.5.jar:3.5.5] + at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218) ~[spring-core-5.3.31.jar:5.3.31] + at org.springframework.aop.framework.CglibAopProxy.invokeMethod(CglibAopProxy.java:386) ~[spring-aop-5.3.31.jar:5.3.31] + at org.springframework.aop.framework.CglibAopProxy.access$000(CglibAopProxy.java:85) ~[spring-aop-5.3.31.jar:5.3.31] + at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:703) ~[spring-aop-5.3.31.jar:5.3.31] + at com.gpf.pethospital.service.impl.AppointmentServiceImpl$$EnhancerBySpringCGLIB$$cb78fdc9.save() ~[classes/:na] + at com.gpf.pethospital.controller.AppointmentController.create(AppointmentController.java:33) ~[classes/:na] + at com.gpf.pethospital.controller.AppointmentController$$FastClassBySpringCGLIB$$4329551c.invoke() ~[classes/:na] + at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218) ~[spring-core-5.3.31.jar:5.3.31] + at org.springframework.aop.framework.CglibAopProxy.invokeMethod(CglibAopProxy.java:386) ~[spring-aop-5.3.31.jar:5.3.31] + at org.springframework.aop.framework.CglibAopProxy.access$000(CglibAopProxy.java:85) ~[spring-aop-5.3.31.jar:5.3.31] + at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:703) ~[spring-aop-5.3.31.jar:5.3.31] + at com.gpf.pethospital.controller.AppointmentController$$EnhancerBySpringCGLIB$$29d26cb5.create() ~[classes/:na] + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na] + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[na:na] + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na] + at java.base/java.lang.reflect.Method.invoke(Method.java:569) ~[na:na] + at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:205) ~[spring-web-5.3.31.jar:5.3.31] + at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:150) ~[spring-web-5.3.31.jar:5.3.31] + at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:117) ~[spring-webmvc-5.3.31.jar:5.3.31] + at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:895) ~[spring-webmvc-5.3.31.jar:5.3.31] + at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808) ~[spring-webmvc-5.3.31.jar:5.3.31] + at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) ~[spring-webmvc-5.3.31.jar:5.3.31] + at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1072) ~[spring-webmvc-5.3.31.jar:5.3.31] + at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:965) ~[spring-webmvc-5.3.31.jar:5.3.31] + at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) ~[spring-webmvc-5.3.31.jar:5.3.31] + at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:909) ~[spring-webmvc-5.3.31.jar:5.3.31] + at javax.servlet.http.HttpServlet.service(HttpServlet.java:555) ~[tomcat-embed-core-9.0.83.jar:4.0.FR] + at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) ~[spring-webmvc-5.3.31.jar:5.3.31] + at javax.servlet.http.HttpServlet.service(HttpServlet.java:623) ~[tomcat-embed-core-9.0.83.jar:4.0.FR] + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:209) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51) ~[tomcat-embed-websocket-9.0.83.jar:9.0.83] + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:337) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.access.intercept.AuthorizationFilter.doFilter(AuthorizationFilter.java:96) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:346) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:122) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:116) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:346) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:126) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:81) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:346) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:109) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:346) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:149) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:346) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:63) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:346) ~[spring-security-web-5.7.11.jar:5.7.11] + at com.gpf.pethospital.security.JwtAuthenticationFilter.doFilterInternal(JwtAuthenticationFilter.java:45) ~[classes/:na] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) ~[spring-web-5.3.31.jar:5.3.31] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:346) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:103) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:89) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:346) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.header.HeaderWriterFilter.doHeadersAfter(HeaderWriterFilter.java:90) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:75) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) ~[spring-web-5.3.31.jar:5.3.31] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:346) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:112) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:82) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:346) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:55) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) ~[spring-web-5.3.31.jar:5.3.31] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:346) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.session.DisableEncodeUrlFilter.doFilterInternal(DisableEncodeUrlFilter.java:42) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) ~[spring-web-5.3.31.jar:5.3.31] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:346) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:221) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:186) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:354) ~[spring-web-5.3.31.jar:5.3.31] + at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:267) ~[spring-web-5.3.31.jar:5.3.31] + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) ~[spring-web-5.3.31.jar:5.3.31] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) ~[spring-web-5.3.31.jar:5.3.31] + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) ~[spring-web-5.3.31.jar:5.3.31] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) ~[spring-web-5.3.31.jar:5.3.31] + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) ~[spring-web-5.3.31.jar:5.3.31] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) ~[spring-web-5.3.31.jar:5.3.31] + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:168) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:481) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:130) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:342) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:390) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:928) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1794) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at java.base/java.lang.Thread.run(Thread.java:840) ~[na:na] + +2026-01-29 12:18:53.316 INFO 6984 --- [ionShutdownHook] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown initiated... +2026-01-29 12:18:53.318 INFO 6984 --- [ionShutdownHook] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown completed. +[INFO] ------------------------------------------------------------------------ +[INFO] BUILD FAILURE +[INFO] ------------------------------------------------------------------------ +[INFO] Total time: 01:10 min +[INFO] Finished at: 2026-01-29T12:18:53+08:00 +[INFO] ------------------------------------------------------------------------ +[ERROR] Failed to execute goal org.springframework.boot:spring-boot-maven-plugin:2.7.18:run (default-cli) on project pet-hospital: Application finished with exit code: 143 -> [Help 1] +[ERROR] +[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch. +[ERROR] Re-run Maven using the -X switch to enable full debug logging. +[ERROR] +[ERROR] For more information about the errors and possible solutions, please read the following articles: +[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoExecutionException diff --git a/backend/backend_final_flow.log b/backend/backend_final_flow.log new file mode 100644 index 0000000..b8b6c4b --- /dev/null +++ b/backend/backend_final_flow.log @@ -0,0 +1,188 @@ +[INFO] Scanning for projects... +[INFO] +[INFO] ------------------------< com.gpf:pet-hospital >------------------------ +[INFO] Building 爱维宠物医院管理平台 1.0.0 +[INFO] --------------------------------[ jar ]--------------------------------- +[INFO] +[INFO] >>> spring-boot-maven-plugin:2.7.18:run (default-cli) > test-compile @ pet-hospital >>> +[INFO] +[INFO] --- maven-resources-plugin:3.2.0:resources (default-resources) @ pet-hospital --- +[INFO] Using 'UTF-8' encoding to copy filtered resources. +[INFO] Using 'UTF-8' encoding to copy filtered properties files. +[INFO] Copying 2 resources +[INFO] Copying 3 resources +[INFO] +[INFO] --- maven-compiler-plugin:3.10.1:compile (default-compile) @ pet-hospital --- +[INFO] Nothing to compile - all classes are up to date +[INFO] +[INFO] --- maven-resources-plugin:3.2.0:testResources (default-testResources) @ pet-hospital --- +[INFO] Using 'UTF-8' encoding to copy filtered resources. +[INFO] Using 'UTF-8' encoding to copy filtered properties files. +[INFO] skip non existing resourceDirectory /mnt/d/bs/gpf_pet_hospital/backend/src/test/resources +[INFO] +[INFO] --- maven-compiler-plugin:3.10.1:testCompile (default-testCompile) @ pet-hospital --- +[INFO] No sources to compile +[INFO] +[INFO] <<< spring-boot-maven-plugin:2.7.18:run (default-cli) < test-compile @ pet-hospital <<< +[INFO] +[INFO] +[INFO] --- spring-boot-maven-plugin:2.7.18:run (default-cli) @ pet-hospital --- +[INFO] Attaching agents: [] + + . ____ _ __ _ _ + /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \ +( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \ + \\/ ___)| |_)| | | | | || (_| | ) ) ) ) + ' |____| .__|_| |_|_| |_\__, | / / / / + =========|_|==============|___/=/_/_/_/ + :: Spring Boot :: (v2.7.18) + +2026-01-29 12:23:12.006 INFO 7496 --- [ main] c.g.pethospital.PetHospitalApplication : Starting PetHospitalApplication using Java 17.0.17 on LAPTOP-FS8K5GSO with PID 7496 (/mnt/d/bs/gpf_pet_hospital/backend/target/classes started by wangzq in /mnt/d/bs/gpf_pet_hospital/backend) +2026-01-29 12:23:12.011 INFO 7496 --- [ main] c.g.pethospital.PetHospitalApplication : The following 1 profile is active: "dev" +2026-01-29 12:23:17.378 INFO 7496 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8081 (http) +2026-01-29 12:23:17.408 INFO 7496 --- [ main] o.apache.catalina.core.StandardService : Starting service [Tomcat] +2026-01-29 12:23:17.408 INFO 7496 --- [ main] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.83] +2026-01-29 12:23:17.592 INFO 7496 --- [ main] o.a.c.c.C.[Tomcat].[localhost].[/api] : Initializing Spring embedded WebApplicationContext +2026-01-29 12:23:17.593 INFO 7496 --- [ main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 5498 ms +2026-01-29 12:23:17.652 INFO 7496 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting... +2026-01-29 12:23:18.530 INFO 7496 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed. +2026-01-29 12:23:18.554 INFO 7496 --- [ main] o.s.b.a.h2.H2ConsoleAutoConfiguration : H2 console available at '/h2-console'. Database available at 'jdbc:h2:mem:testdb' +Logging initialized using 'class org.apache.ibatis.logging.stdout.StdOutImpl' adapter. +Initialization Sequence datacenterId:1 workerId:11 + _ _ |_ _ _|_. ___ _ | _ +| | |\/|_)(_| | |_\ |_)||_|_\ + / | + 3.5.5 +2026-01-29 12:23:19.273 WARN 7496 --- [ main] ConfigServletWebServerApplicationContext : Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'appointmentController' defined in file [/mnt/d/bs/gpf_pet_hospital/backend/target/classes/com/gpf/pethospital/controller/AppointmentController.class]: Unsatisfied dependency expressed through constructor parameter 0; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'appointmentServiceImpl': Unsatisfied dependency expressed through field 'baseMapper'; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'appointmentMapper' defined in file [/mnt/d/bs/gpf_pet_hospital/backend/target/classes/com/gpf/pethospital/mapper/AppointmentMapper.class]: Unsatisfied dependency expressed through bean property 'sqlSessionTemplate'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dataSourceScriptDatabaseInitializer' defined in class path resource [org/springframework/boot/autoconfigure/sql/init/DataSourceInitializationConfiguration.class]: Invocation of init method failed; nested exception is org.springframework.jdbc.datasource.init.ScriptStatementFailedException: Failed to execute SQL script statement #4 of URL [file:/mnt/d/bs/gpf_pet_hospital/backend/target/classes/data.sql]: INSERT INTO pet (name, species, breed, gender, age, owner_id, health_status) VALUES ('小白', '狗', '金毛', 'M', 3, 3, '健康'); nested exception is org.h2.jdbc.JdbcSQLSyntaxErrorException: Column "AGE" not found; SQL statement: +INSERT INTO pet (name, species, breed, gender, age, owner_id, health_status) VALUES ('小白', '狗', '金毛', 'M', 3, 3, '健康') [42122-214] +2026-01-29 12:23:19.274 INFO 7496 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown initiated... +2026-01-29 12:23:19.275 INFO 7496 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown completed. +2026-01-29 12:23:19.280 INFO 7496 --- [ main] o.apache.catalina.core.StandardService : Stopping service [Tomcat] +2026-01-29 12:23:19.294 INFO 7496 --- [ main] ConditionEvaluationReportLoggingListener : + +Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled. +2026-01-29 12:23:19.381 ERROR 7496 --- [ main] o.s.boot.SpringApplication : Application run failed + +org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'appointmentController' defined in file [/mnt/d/bs/gpf_pet_hospital/backend/target/classes/com/gpf/pethospital/controller/AppointmentController.class]: Unsatisfied dependency expressed through constructor parameter 0; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'appointmentServiceImpl': Unsatisfied dependency expressed through field 'baseMapper'; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'appointmentMapper' defined in file [/mnt/d/bs/gpf_pet_hospital/backend/target/classes/com/gpf/pethospital/mapper/AppointmentMapper.class]: Unsatisfied dependency expressed through bean property 'sqlSessionTemplate'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dataSourceScriptDatabaseInitializer' defined in class path resource [org/springframework/boot/autoconfigure/sql/init/DataSourceInitializationConfiguration.class]: Invocation of init method failed; nested exception is org.springframework.jdbc.datasource.init.ScriptStatementFailedException: Failed to execute SQL script statement #4 of URL [file:/mnt/d/bs/gpf_pet_hospital/backend/target/classes/data.sql]: INSERT INTO pet (name, species, breed, gender, age, owner_id, health_status) VALUES ('小白', '狗', '金毛', 'M', 3, 3, '健康'); nested exception is org.h2.jdbc.JdbcSQLSyntaxErrorException: Column "AGE" not found; SQL statement: +INSERT INTO pet (name, species, breed, gender, age, owner_id, health_status) VALUES ('小白', '狗', '金毛', 'M', 3, 3, '健康') [42122-214] + at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:801) ~[spring-beans-5.3.31.jar:5.3.31] + at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:224) ~[spring-beans-5.3.31.jar:5.3.31] + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1372) ~[spring-beans-5.3.31.jar:5.3.31] + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1222) ~[spring-beans-5.3.31.jar:5.3.31] + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:582) ~[spring-beans-5.3.31.jar:5.3.31] + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:542) ~[spring-beans-5.3.31.jar:5.3.31] + at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335) ~[spring-beans-5.3.31.jar:5.3.31] + at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) ~[spring-beans-5.3.31.jar:5.3.31] + at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333) ~[spring-beans-5.3.31.jar:5.3.31] + at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208) ~[spring-beans-5.3.31.jar:5.3.31] + at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:955) ~[spring-beans-5.3.31.jar:5.3.31] + at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:929) ~[spring-context-5.3.31.jar:5.3.31] + at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:591) ~[spring-context-5.3.31.jar:5.3.31] + at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:147) ~[spring-boot-2.7.18.jar:2.7.18] + at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:732) ~[spring-boot-2.7.18.jar:2.7.18] + at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:409) ~[spring-boot-2.7.18.jar:2.7.18] + at org.springframework.boot.SpringApplication.run(SpringApplication.java:308) ~[spring-boot-2.7.18.jar:2.7.18] + at org.springframework.boot.SpringApplication.run(SpringApplication.java:1300) ~[spring-boot-2.7.18.jar:2.7.18] + at org.springframework.boot.SpringApplication.run(SpringApplication.java:1289) ~[spring-boot-2.7.18.jar:2.7.18] + at com.gpf.pethospital.PetHospitalApplication.main(PetHospitalApplication.java:15) ~[classes/:na] +Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'appointmentServiceImpl': Unsatisfied dependency expressed through field 'baseMapper'; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'appointmentMapper' defined in file [/mnt/d/bs/gpf_pet_hospital/backend/target/classes/com/gpf/pethospital/mapper/AppointmentMapper.class]: Unsatisfied dependency expressed through bean property 'sqlSessionTemplate'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dataSourceScriptDatabaseInitializer' defined in class path resource [org/springframework/boot/autoconfigure/sql/init/DataSourceInitializationConfiguration.class]: Invocation of init method failed; nested exception is org.springframework.jdbc.datasource.init.ScriptStatementFailedException: Failed to execute SQL script statement #4 of URL [file:/mnt/d/bs/gpf_pet_hospital/backend/target/classes/data.sql]: INSERT INTO pet (name, species, breed, gender, age, owner_id, health_status) VALUES ('小白', '狗', '金毛', 'M', 3, 3, '健康'); nested exception is org.h2.jdbc.JdbcSQLSyntaxErrorException: Column "AGE" not found; SQL statement: +INSERT INTO pet (name, species, breed, gender, age, owner_id, health_status) VALUES ('小白', '狗', '金毛', 'M', 3, 3, '健康') [42122-214] + at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.resolveFieldValue(AutowiredAnnotationBeanPostProcessor.java:713) ~[spring-beans-5.3.31.jar:5.3.31] + at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:693) ~[spring-beans-5.3.31.jar:5.3.31] + at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:119) ~[spring-beans-5.3.31.jar:5.3.31] + at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessProperties(AutowiredAnnotationBeanPostProcessor.java:408) ~[spring-beans-5.3.31.jar:5.3.31] + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1431) ~[spring-beans-5.3.31.jar:5.3.31] + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:619) ~[spring-beans-5.3.31.jar:5.3.31] + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:542) ~[spring-beans-5.3.31.jar:5.3.31] + at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335) ~[spring-beans-5.3.31.jar:5.3.31] + at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) ~[spring-beans-5.3.31.jar:5.3.31] + at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333) ~[spring-beans-5.3.31.jar:5.3.31] + at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208) ~[spring-beans-5.3.31.jar:5.3.31] + at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:276) ~[spring-beans-5.3.31.jar:5.3.31] + at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1391) ~[spring-beans-5.3.31.jar:5.3.31] + at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1311) ~[spring-beans-5.3.31.jar:5.3.31] + at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:911) ~[spring-beans-5.3.31.jar:5.3.31] + at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:788) ~[spring-beans-5.3.31.jar:5.3.31] + ... 19 common frames omitted +Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'appointmentMapper' defined in file [/mnt/d/bs/gpf_pet_hospital/backend/target/classes/com/gpf/pethospital/mapper/AppointmentMapper.class]: Unsatisfied dependency expressed through bean property 'sqlSessionTemplate'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dataSourceScriptDatabaseInitializer' defined in class path resource [org/springframework/boot/autoconfigure/sql/init/DataSourceInitializationConfiguration.class]: Invocation of init method failed; nested exception is org.springframework.jdbc.datasource.init.ScriptStatementFailedException: Failed to execute SQL script statement #4 of URL [file:/mnt/d/bs/gpf_pet_hospital/backend/target/classes/data.sql]: INSERT INTO pet (name, species, breed, gender, age, owner_id, health_status) VALUES ('小白', '狗', '金毛', 'M', 3, 3, '健康'); nested exception is org.h2.jdbc.JdbcSQLSyntaxErrorException: Column "AGE" not found; SQL statement: +INSERT INTO pet (name, species, breed, gender, age, owner_id, health_status) VALUES ('小白', '狗', '金毛', 'M', 3, 3, '健康') [42122-214] + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireByType(AbstractAutowireCapableBeanFactory.java:1534) ~[spring-beans-5.3.31.jar:5.3.31] + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1417) ~[spring-beans-5.3.31.jar:5.3.31] + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:619) ~[spring-beans-5.3.31.jar:5.3.31] + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:542) ~[spring-beans-5.3.31.jar:5.3.31] + at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335) ~[spring-beans-5.3.31.jar:5.3.31] + at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) ~[spring-beans-5.3.31.jar:5.3.31] + at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333) ~[spring-beans-5.3.31.jar:5.3.31] + at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208) ~[spring-beans-5.3.31.jar:5.3.31] + at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:276) ~[spring-beans-5.3.31.jar:5.3.31] + at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1391) ~[spring-beans-5.3.31.jar:5.3.31] + at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1311) ~[spring-beans-5.3.31.jar:5.3.31] + at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.resolveFieldValue(AutowiredAnnotationBeanPostProcessor.java:710) ~[spring-beans-5.3.31.jar:5.3.31] + ... 34 common frames omitted +Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dataSourceScriptDatabaseInitializer' defined in class path resource [org/springframework/boot/autoconfigure/sql/init/DataSourceInitializationConfiguration.class]: Invocation of init method failed; nested exception is org.springframework.jdbc.datasource.init.ScriptStatementFailedException: Failed to execute SQL script statement #4 of URL [file:/mnt/d/bs/gpf_pet_hospital/backend/target/classes/data.sql]: INSERT INTO pet (name, species, breed, gender, age, owner_id, health_status) VALUES ('小白', '狗', '金毛', 'M', 3, 3, '健康'); nested exception is org.h2.jdbc.JdbcSQLSyntaxErrorException: Column "AGE" not found; SQL statement: +INSERT INTO pet (name, species, breed, gender, age, owner_id, health_status) VALUES ('小白', '狗', '金毛', 'M', 3, 3, '健康') [42122-214] + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1804) ~[spring-beans-5.3.31.jar:5.3.31] + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:620) ~[spring-beans-5.3.31.jar:5.3.31] + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:542) ~[spring-beans-5.3.31.jar:5.3.31] + at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335) ~[spring-beans-5.3.31.jar:5.3.31] + at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) ~[spring-beans-5.3.31.jar:5.3.31] + at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333) ~[spring-beans-5.3.31.jar:5.3.31] + at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208) ~[spring-beans-5.3.31.jar:5.3.31] + at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:322) ~[spring-beans-5.3.31.jar:5.3.31] + at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208) ~[spring-beans-5.3.31.jar:5.3.31] + at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:276) ~[spring-beans-5.3.31.jar:5.3.31] + at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1391) ~[spring-beans-5.3.31.jar:5.3.31] + at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1311) ~[spring-beans-5.3.31.jar:5.3.31] + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireByType(AbstractAutowireCapableBeanFactory.java:1519) ~[spring-beans-5.3.31.jar:5.3.31] + ... 45 common frames omitted +Caused by: org.springframework.jdbc.datasource.init.ScriptStatementFailedException: Failed to execute SQL script statement #4 of URL [file:/mnt/d/bs/gpf_pet_hospital/backend/target/classes/data.sql]: INSERT INTO pet (name, species, breed, gender, age, owner_id, health_status) VALUES ('小白', '狗', '金毛', 'M', 3, 3, '健康'); nested exception is org.h2.jdbc.JdbcSQLSyntaxErrorException: Column "AGE" not found; SQL statement: +INSERT INTO pet (name, species, breed, gender, age, owner_id, health_status) VALUES ('小白', '狗', '金毛', 'M', 3, 3, '健康') [42122-214] + at org.springframework.jdbc.datasource.init.ScriptUtils.executeSqlScript(ScriptUtils.java:282) ~[spring-jdbc-5.3.31.jar:5.3.31] + at org.springframework.jdbc.datasource.init.ResourceDatabasePopulator.populate(ResourceDatabasePopulator.java:254) ~[spring-jdbc-5.3.31.jar:5.3.31] + at org.springframework.jdbc.datasource.init.DatabasePopulatorUtils.execute(DatabasePopulatorUtils.java:54) ~[spring-jdbc-5.3.31.jar:5.3.31] + at org.springframework.boot.jdbc.init.DataSourceScriptDatabaseInitializer.runScripts(DataSourceScriptDatabaseInitializer.java:90) ~[spring-boot-2.7.18.jar:2.7.18] + at org.springframework.boot.sql.init.AbstractScriptDatabaseInitializer.runScripts(AbstractScriptDatabaseInitializer.java:145) ~[spring-boot-2.7.18.jar:2.7.18] + at org.springframework.boot.sql.init.AbstractScriptDatabaseInitializer.applyScripts(AbstractScriptDatabaseInitializer.java:107) ~[spring-boot-2.7.18.jar:2.7.18] + at org.springframework.boot.sql.init.AbstractScriptDatabaseInitializer.applyDataScripts(AbstractScriptDatabaseInitializer.java:101) ~[spring-boot-2.7.18.jar:2.7.18] + at org.springframework.boot.sql.init.AbstractScriptDatabaseInitializer.initializeDatabase(AbstractScriptDatabaseInitializer.java:76) ~[spring-boot-2.7.18.jar:2.7.18] + at org.springframework.boot.sql.init.AbstractScriptDatabaseInitializer.afterPropertiesSet(AbstractScriptDatabaseInitializer.java:65) ~[spring-boot-2.7.18.jar:2.7.18] + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1863) ~[spring-beans-5.3.31.jar:5.3.31] + at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1800) ~[spring-beans-5.3.31.jar:5.3.31] + ... 57 common frames omitted +Caused by: org.h2.jdbc.JdbcSQLSyntaxErrorException: Column "AGE" not found; SQL statement: +INSERT INTO pet (name, species, breed, gender, age, owner_id, health_status) VALUES ('小白', '狗', '金毛', 'M', 3, 3, '健康') [42122-214] + at org.h2.message.DbException.getJdbcSQLException(DbException.java:502) ~[h2-2.1.214.jar:2.1.214] + at org.h2.message.DbException.getJdbcSQLException(DbException.java:477) ~[h2-2.1.214.jar:2.1.214] + at org.h2.message.DbException.get(DbException.java:223) ~[h2-2.1.214.jar:2.1.214] + at org.h2.message.DbException.get(DbException.java:199) ~[h2-2.1.214.jar:2.1.214] + at org.h2.table.Table.getColumn(Table.java:749) ~[h2-2.1.214.jar:2.1.214] + at org.h2.command.Parser.parseColumn(Parser.java:1256) ~[h2-2.1.214.jar:2.1.214] + at org.h2.command.Parser.parseColumnList(Parser.java:1241) ~[h2-2.1.214.jar:2.1.214] + at org.h2.command.Parser.parseInsert(Parser.java:1641) ~[h2-2.1.214.jar:2.1.214] + at org.h2.command.Parser.parsePrepared(Parser.java:814) ~[h2-2.1.214.jar:2.1.214] + at org.h2.command.Parser.parse(Parser.java:689) ~[h2-2.1.214.jar:2.1.214] + at org.h2.command.Parser.parse(Parser.java:661) ~[h2-2.1.214.jar:2.1.214] + at org.h2.command.Parser.prepareCommand(Parser.java:569) ~[h2-2.1.214.jar:2.1.214] + at org.h2.engine.SessionLocal.prepareLocal(SessionLocal.java:631) ~[h2-2.1.214.jar:2.1.214] + at org.h2.engine.SessionLocal.prepareCommand(SessionLocal.java:554) ~[h2-2.1.214.jar:2.1.214] + at org.h2.jdbc.JdbcConnection.prepareCommand(JdbcConnection.java:1116) ~[h2-2.1.214.jar:2.1.214] + at org.h2.jdbc.JdbcStatement.executeInternal(JdbcStatement.java:237) ~[h2-2.1.214.jar:2.1.214] + at org.h2.jdbc.JdbcStatement.execute(JdbcStatement.java:223) ~[h2-2.1.214.jar:2.1.214] + at com.zaxxer.hikari.pool.ProxyStatement.execute(ProxyStatement.java:94) ~[HikariCP-4.0.3.jar:na] + at com.zaxxer.hikari.pool.HikariProxyStatement.execute(HikariProxyStatement.java) ~[HikariCP-4.0.3.jar:na] + at org.springframework.jdbc.datasource.init.ScriptUtils.executeSqlScript(ScriptUtils.java:261) ~[spring-jdbc-5.3.31.jar:5.3.31] + ... 67 common frames omitted + +[INFO] ------------------------------------------------------------------------ +[INFO] BUILD FAILURE +[INFO] ------------------------------------------------------------------------ +[INFO] Total time: 16.764 s +[INFO] Finished at: 2026-01-29T12:23:19+08:00 +[INFO] ------------------------------------------------------------------------ +[ERROR] Failed to execute goal org.springframework.boot:spring-boot-maven-plugin:2.7.18:run (default-cli) on project pet-hospital: Application finished with exit code: 1 -> [Help 1] +[ERROR] +[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch. +[ERROR] Re-run Maven using the -X switch to enable full debug logging. +[ERROR] +[ERROR] For more information about the errors and possible solutions, please read the following articles: +[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoExecutionException diff --git a/backend/backend_full_flow.log b/backend/backend_full_flow.log new file mode 100644 index 0000000..cfca15b --- /dev/null +++ b/backend/backend_full_flow.log @@ -0,0 +1,344 @@ +[INFO] Scanning for projects... +[INFO] +[INFO] ------------------------< com.gpf:pet-hospital >------------------------ +[INFO] Building 爱维宠物医院管理平台 1.0.0 +[INFO] --------------------------------[ jar ]--------------------------------- +[INFO] +[INFO] >>> spring-boot-maven-plugin:2.7.18:run (default-cli) > test-compile @ pet-hospital >>> +[INFO] +[INFO] --- maven-resources-plugin:3.2.0:resources (default-resources) @ pet-hospital --- +[INFO] Using 'UTF-8' encoding to copy filtered resources. +[INFO] Using 'UTF-8' encoding to copy filtered properties files. +[INFO] Copying 2 resources +[INFO] Copying 3 resources +[INFO] +[INFO] --- maven-compiler-plugin:3.10.1:compile (default-compile) @ pet-hospital --- +[INFO] Nothing to compile - all classes are up to date +[INFO] +[INFO] --- maven-resources-plugin:3.2.0:testResources (default-testResources) @ pet-hospital --- +[INFO] Using 'UTF-8' encoding to copy filtered resources. +[INFO] Using 'UTF-8' encoding to copy filtered properties files. +[INFO] skip non existing resourceDirectory /mnt/d/bs/gpf_pet_hospital/backend/src/test/resources +[INFO] +[INFO] --- maven-compiler-plugin:3.10.1:testCompile (default-testCompile) @ pet-hospital --- +[INFO] No sources to compile +[INFO] +[INFO] <<< spring-boot-maven-plugin:2.7.18:run (default-cli) < test-compile @ pet-hospital <<< +[INFO] +[INFO] +[INFO] --- spring-boot-maven-plugin:2.7.18:run (default-cli) @ pet-hospital --- +[INFO] Attaching agents: [] + + . ____ _ __ _ _ + /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \ +( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \ + \\/ ___)| |_)| | | | | || (_| | ) ) ) ) + ' |____| .__|_| |_|_| |_\__, | / / / / + =========|_|==============|___/=/_/_/_/ + :: Spring Boot :: (v2.7.18) + +2026-01-29 12:21:46.885 INFO 7324 --- [ main] c.g.pethospital.PetHospitalApplication : Starting PetHospitalApplication using Java 17.0.17 on LAPTOP-FS8K5GSO with PID 7324 (/mnt/d/bs/gpf_pet_hospital/backend/target/classes started by wangzq in /mnt/d/bs/gpf_pet_hospital/backend) +2026-01-29 12:21:46.888 INFO 7324 --- [ main] c.g.pethospital.PetHospitalApplication : The following 1 profile is active: "dev" +2026-01-29 12:21:52.609 INFO 7324 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8081 (http) +2026-01-29 12:21:52.633 INFO 7324 --- [ main] o.apache.catalina.core.StandardService : Starting service [Tomcat] +2026-01-29 12:21:52.634 INFO 7324 --- [ main] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.83] +2026-01-29 12:21:52.800 INFO 7324 --- [ main] o.a.c.c.C.[Tomcat].[localhost].[/api] : Initializing Spring embedded WebApplicationContext +2026-01-29 12:21:52.801 INFO 7324 --- [ main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 5830 ms +2026-01-29 12:21:52.855 INFO 7324 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting... +2026-01-29 12:21:53.685 INFO 7324 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed. +2026-01-29 12:21:53.707 INFO 7324 --- [ main] o.s.b.a.h2.H2ConsoleAutoConfiguration : H2 console available at '/h2-console'. Database available at 'jdbc:h2:mem:testdb' +Logging initialized using 'class org.apache.ibatis.logging.stdout.StdOutImpl' adapter. +Initialization Sequence datacenterId:1 workerId:15 + _ _ |_ _ _|_. ___ _ | _ +| | |\/|_)(_| | |_\ |_)||_|_\ + / | + 3.5.5 +2026-01-29 12:21:56.382 WARN 7324 --- [ main] .s.s.UserDetailsServiceAutoConfiguration : + +Using generated security password: 3ae24633-3a04-4e91-9dd2-f686ccd8de18 + +This generated password is for development use only. Your security configuration must be updated before running your application in production. + +2026-01-29 12:21:56.775 INFO 7324 --- [ main] o.s.s.web.DefaultSecurityFilterChain : Will secure any request with [org.springframework.security.web.session.DisableEncodeUrlFilter@240f350a, org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter@706f6d26, org.springframework.security.web.context.SecurityContextPersistenceFilter@6a1568d6, org.springframework.security.web.header.HeaderWriterFilter@40df6090, org.springframework.security.web.authentication.logout.LogoutFilter@6b27b2d0, com.gpf.pethospital.security.JwtAuthenticationFilter@3af2f846, org.springframework.security.web.savedrequest.RequestCacheAwareFilter@1b37fbec, org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter@bb3ecfe, org.springframework.security.web.authentication.AnonymousAuthenticationFilter@6af65f29, org.springframework.security.web.session.SessionManagementFilter@291a4791, org.springframework.security.web.access.ExceptionTranslationFilter@11a3a45f, org.springframework.security.web.access.intercept.AuthorizationFilter@62b6c045] +2026-01-29 12:21:58.151 INFO 7324 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8081 (http) with context path '/api' +2026-01-29 12:21:58.168 INFO 7324 --- [ main] c.g.pethospital.PetHospitalApplication : Started PetHospitalApplication in 12.599 seconds (JVM running for 13.252) +2026-01-29 12:22:05.764 INFO 7324 --- [nio-8081-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/api] : Initializing Spring DispatcherServlet 'dispatcherServlet' +2026-01-29 12:22:05.765 INFO 7324 --- [nio-8081-exec-1] o.s.web.servlet.DispatcherServlet : Initializing Servlet 'dispatcherServlet' +2026-01-29 12:22:05.766 INFO 7324 --- [nio-8081-exec-1] o.s.web.servlet.DispatcherServlet : Completed initialization in 1 ms +Creating a new SqlSession +SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@31b23466] was not registered for synchronization because synchronization is not active +JDBC Connection [HikariProxyConnection@155985460 wrapping conn0: url=jdbc:h2:mem:testdb user=SA] will not be managed by Spring +==> Preparing: SELECT id,username,phone,email,password,role,status,avatar,create_time,update_time,deleted FROM `user` WHERE deleted=0 AND (username = ? OR phone = ? OR email = ?) +==> Parameters: admin(String), admin(String), admin(String) +<== Columns: ID, USERNAME, PHONE, EMAIL, PASSWORD, ROLE, STATUS, AVATAR, CREATE_TIME, UPDATE_TIME, DELETED +<== Row: 1, admin, 13800138000, admin@example.com, $2a$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi, ADMIN, 1, null, 2026-01-29 12:21:54.441399, 2026-01-29 12:21:54.441399, 0 +<== Total: 1 +Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@31b23466] +Creating a new SqlSession +SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@11618e07] was not registered for synchronization because synchronization is not active +JDBC Connection [HikariProxyConnection@1428743376 wrapping conn0: url=jdbc:h2:mem:testdb user=SA] will not be managed by Spring +==> Preparing: INSERT INTO prescription ( visit_id, doctor_id, status, create_time, update_time ) VALUES ( ?, ?, ?, ?, ? ) +==> Parameters: 1(Long), 1(Long), DRAFT(String), 2026-01-29T12:22:11.451463382(LocalDateTime), 2026-01-29T12:22:11.451463382(LocalDateTime) +<== Updates: 1 +Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@11618e07] +Creating a new SqlSession +SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@1eccf175] was not registered for synchronization because synchronization is not active +JDBC Connection [HikariProxyConnection@1908255895 wrapping conn0: url=jdbc:h2:mem:testdb user=SA] will not be managed by Spring +==> Preparing: SELECT COUNT(*) AS total FROM appointment WHERE deleted = 0 +==> Parameters: +<== Columns: TOTAL +<== Row: 0 +<== Total: 1 +Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@1eccf175] +Creating a new SqlSession +SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@530348d5] was not registered for synchronization because synchronization is not active +JDBC Connection [HikariProxyConnection@1397845812 wrapping conn0: url=jdbc:h2:mem:testdb user=SA] will not be managed by Spring +==> Preparing: SELECT COUNT(*) AS total FROM appointment WHERE deleted = 0 +==> Parameters: +<== Columns: TOTAL +<== Row: 0 +<== Total: 1 +Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@530348d5] +Creating a new SqlSession +SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@773e0205] was not registered for synchronization because synchronization is not active +JDBC Connection [HikariProxyConnection@2046423698 wrapping conn0: url=jdbc:h2:mem:testdb user=SA] will not be managed by Spring +==> Preparing: SELECT id,username,phone,email,password,role,status,avatar,create_time,update_time,deleted FROM `user` WHERE deleted=0 AND (username = ? OR phone = ? OR email = ?) +==> Parameters: customer(String), customer(String), customer(String) +<== Columns: ID, USERNAME, PHONE, EMAIL, PASSWORD, ROLE, STATUS, AVATAR, CREATE_TIME, UPDATE_TIME, DELETED +<== Row: 3, customer, 13900139000, customer@example.com, $2a$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi, CUSTOMER, 1, null, 2026-01-29 12:21:54.449498, 2026-01-29 12:21:54.449498, 0 +<== Total: 1 +Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@773e0205] +Creating a new SqlSession +SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@1402ee31] was not registered for synchronization because synchronization is not active +JDBC Connection [HikariProxyConnection@449123009 wrapping conn0: url=jdbc:h2:mem:testdb user=SA] will not be managed by Spring +==> Preparing: SELECT id,username,phone,email,password,role,status,avatar,create_time,update_time,deleted FROM `user` WHERE deleted=0 AND (username = ? OR phone = ? OR email = ?) +==> Parameters: admin(String), admin(String), admin(String) +<== Columns: ID, USERNAME, PHONE, EMAIL, PASSWORD, ROLE, STATUS, AVATAR, CREATE_TIME, UPDATE_TIME, DELETED +<== Row: 1, admin, 13800138000, admin@example.com, $2a$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi, ADMIN, 1, null, 2026-01-29 12:21:54.441399, 2026-01-29 12:21:54.441399, 0 +<== Total: 1 +Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@1402ee31] +Creating a new SqlSession +SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@393abbd] was not registered for synchronization because synchronization is not active +JDBC Connection [HikariProxyConnection@503935856 wrapping conn0: url=jdbc:h2:mem:testdb user=SA] will not be managed by Spring +==> Preparing: SELECT COUNT(*) AS total FROM appointment WHERE deleted = 0 AND (customer_id = ?) +==> Parameters: 3(Long) +<== Columns: TOTAL +<== Row: 0 +<== Total: 1 +Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@393abbd] +Creating a new SqlSession +SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@22dbff1c] was not registered for synchronization because synchronization is not active +JDBC Connection [HikariProxyConnection@126819480 wrapping conn0: url=jdbc:h2:mem:testdb user=SA] will not be managed by Spring +==> Preparing: SELECT COUNT(*) AS total FROM appointment WHERE deleted = 0 +==> Parameters: +<== Columns: TOTAL +<== Row: 0 +<== Total: 1 +Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@22dbff1c] +Creating a new SqlSession +SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@27695f1d] was not registered for synchronization because synchronization is not active +JDBC Connection [HikariProxyConnection@1044329755 wrapping conn0: url=jdbc:h2:mem:testdb user=SA] will not be managed by Spring +==> Preparing: SELECT COUNT(*) AS total FROM pet WHERE deleted = 0 +==> Parameters: +<== Columns: TOTAL +<== Row: 1 +<== Total: 1 +==> Preparing: SELECT id,owner_id,name,breed,gender,birthday,weight,photo,remark,create_time,update_time,deleted FROM pet WHERE deleted=0 LIMIT ? +Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@27695f1d] +2026-01-29 12:22:42.469 ERROR 7324 --- [nio-8081-exec-6] o.a.c.c.C.[.[.[.[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [/api] threw exception [Request processing failed; nested exception is org.springframework.jdbc.BadSqlGrammarException: +### Error querying database. Cause: org.h2.jdbc.JdbcSQLSyntaxErrorException: Column "BIRTHDAY" not found; SQL statement: +SELECT id,owner_id,name,breed,gender,birthday,weight,photo,remark,create_time,update_time,deleted FROM pet WHERE deleted=0 LIMIT ? [42122-214] +### The error may exist in com/gpf/pethospital/mapper/PetMapper.java (best guess) +### The error may involve com.gpf.pethospital.mapper.PetMapper.selectList +### The error occurred while executing a query +### SQL: SELECT id,owner_id,name,breed,gender,birthday,weight,photo,remark,create_time,update_time,deleted FROM pet WHERE deleted=0 LIMIT ? +### Cause: org.h2.jdbc.JdbcSQLSyntaxErrorException: Column "BIRTHDAY" not found; SQL statement: +SELECT id,owner_id,name,breed,gender,birthday,weight,photo,remark,create_time,update_time,deleted FROM pet WHERE deleted=0 LIMIT ? [42122-214] +; bad SQL grammar []; nested exception is org.h2.jdbc.JdbcSQLSyntaxErrorException: Column "BIRTHDAY" not found; SQL statement: +SELECT id,owner_id,name,breed,gender,birthday,weight,photo,remark,create_time,update_time,deleted FROM pet WHERE deleted=0 LIMIT ? [42122-214]] with root cause + +org.h2.jdbc.JdbcSQLSyntaxErrorException: Column "BIRTHDAY" not found; SQL statement: +SELECT id,owner_id,name,breed,gender,birthday,weight,photo,remark,create_time,update_time,deleted FROM pet WHERE deleted=0 LIMIT ? [42122-214] + at org.h2.message.DbException.getJdbcSQLException(DbException.java:502) ~[h2-2.1.214.jar:2.1.214] + at org.h2.message.DbException.getJdbcSQLException(DbException.java:477) ~[h2-2.1.214.jar:2.1.214] + at org.h2.message.DbException.get(DbException.java:223) ~[h2-2.1.214.jar:2.1.214] + at org.h2.message.DbException.get(DbException.java:199) ~[h2-2.1.214.jar:2.1.214] + at org.h2.expression.ExpressionColumn.getColumnException(ExpressionColumn.java:244) ~[h2-2.1.214.jar:2.1.214] + at org.h2.expression.ExpressionColumn.optimizeOther(ExpressionColumn.java:226) ~[h2-2.1.214.jar:2.1.214] + at org.h2.expression.ExpressionColumn.optimize(ExpressionColumn.java:213) ~[h2-2.1.214.jar:2.1.214] + at org.h2.command.query.Select.optimizeExpressionsAndPreserveAliases(Select.java:1285) ~[h2-2.1.214.jar:2.1.214] + at org.h2.command.query.Select.prepareExpressions(Select.java:1167) ~[h2-2.1.214.jar:2.1.214] + at org.h2.command.query.Query.prepare(Query.java:218) ~[h2-2.1.214.jar:2.1.214] + at org.h2.command.Parser.prepareCommand(Parser.java:575) ~[h2-2.1.214.jar:2.1.214] + at org.h2.engine.SessionLocal.prepareLocal(SessionLocal.java:631) ~[h2-2.1.214.jar:2.1.214] + at org.h2.engine.SessionLocal.prepareCommand(SessionLocal.java:554) ~[h2-2.1.214.jar:2.1.214] + at org.h2.jdbc.JdbcConnection.prepareCommand(JdbcConnection.java:1116) ~[h2-2.1.214.jar:2.1.214] + at org.h2.jdbc.JdbcPreparedStatement.(JdbcPreparedStatement.java:92) ~[h2-2.1.214.jar:2.1.214] + at org.h2.jdbc.JdbcConnection.prepareStatement(JdbcConnection.java:288) ~[h2-2.1.214.jar:2.1.214] + at com.zaxxer.hikari.pool.ProxyConnection.prepareStatement(ProxyConnection.java:337) ~[HikariCP-4.0.3.jar:na] + at com.zaxxer.hikari.pool.HikariProxyConnection.prepareStatement(HikariProxyConnection.java) ~[HikariCP-4.0.3.jar:na] + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na] + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[na:na] + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na] + at java.base/java.lang.reflect.Method.invoke(Method.java:569) ~[na:na] + at org.apache.ibatis.logging.jdbc.ConnectionLogger.invoke(ConnectionLogger.java:53) ~[mybatis-3.5.15.jar:3.5.15] + at jdk.proxy3/jdk.proxy3.$Proxy64.prepareStatement(Unknown Source) ~[na:na] + at org.apache.ibatis.executor.statement.PreparedStatementHandler.instantiateStatement(PreparedStatementHandler.java:88) ~[mybatis-3.5.15.jar:3.5.15] + at org.apache.ibatis.executor.statement.BaseStatementHandler.prepare(BaseStatementHandler.java:90) ~[mybatis-3.5.15.jar:3.5.15] + at org.apache.ibatis.executor.statement.RoutingStatementHandler.prepare(RoutingStatementHandler.java:60) ~[mybatis-3.5.15.jar:3.5.15] + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na] + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[na:na] + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na] + at java.base/java.lang.reflect.Method.invoke(Method.java:569) ~[na:na] + at org.apache.ibatis.plugin.Invocation.proceed(Invocation.java:49) ~[mybatis-3.5.15.jar:3.5.15] + at com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor.intercept(MybatisPlusInterceptor.java:106) ~[mybatis-plus-extension-3.5.5.jar:3.5.5] + at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:59) ~[mybatis-3.5.15.jar:3.5.15] + at jdk.proxy2/jdk.proxy2.$Proxy106.prepare(Unknown Source) ~[na:na] + at org.apache.ibatis.executor.SimpleExecutor.prepareStatement(SimpleExecutor.java:90) ~[mybatis-3.5.15.jar:3.5.15] + at org.apache.ibatis.executor.SimpleExecutor.doQuery(SimpleExecutor.java:64) ~[mybatis-3.5.15.jar:3.5.15] + at org.apache.ibatis.executor.BaseExecutor.queryFromDatabase(BaseExecutor.java:336) ~[mybatis-3.5.15.jar:3.5.15] + at org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:158) ~[mybatis-3.5.15.jar:3.5.15] + at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:110) ~[mybatis-3.5.15.jar:3.5.15] + at com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor.intercept(MybatisPlusInterceptor.java:81) ~[mybatis-plus-extension-3.5.5.jar:3.5.5] + at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:59) ~[mybatis-3.5.15.jar:3.5.15] + at jdk.proxy2/jdk.proxy2.$Proxy105.query(Unknown Source) ~[na:na] + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:154) ~[mybatis-3.5.15.jar:3.5.15] + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:147) ~[mybatis-3.5.15.jar:3.5.15] + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:142) ~[mybatis-3.5.15.jar:3.5.15] + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na] + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[na:na] + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na] + at java.base/java.lang.reflect.Method.invoke(Method.java:569) ~[na:na] + at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:425) ~[mybatis-spring-2.1.2.jar:2.1.2] + at jdk.proxy2/jdk.proxy2.$Proxy71.selectList(Unknown Source) ~[na:na] + at org.mybatis.spring.SqlSessionTemplate.selectList(SqlSessionTemplate.java:224) ~[mybatis-spring-2.1.2.jar:2.1.2] + at com.baomidou.mybatisplus.core.override.MybatisMapperMethod.executeForMany(MybatisMapperMethod.java:164) ~[mybatis-plus-core-3.5.5.jar:3.5.5] + at com.baomidou.mybatisplus.core.override.MybatisMapperMethod.execute(MybatisMapperMethod.java:77) ~[mybatis-plus-core-3.5.5.jar:3.5.5] + at com.baomidou.mybatisplus.core.override.MybatisMapperProxy$PlainMethodInvoker.invoke(MybatisMapperProxy.java:152) ~[mybatis-plus-core-3.5.5.jar:3.5.5] + at com.baomidou.mybatisplus.core.override.MybatisMapperProxy.invoke(MybatisMapperProxy.java:89) ~[mybatis-plus-core-3.5.5.jar:3.5.5] + at jdk.proxy2/jdk.proxy2.$Proxy85.selectList(Unknown Source) ~[na:na] + at com.baomidou.mybatisplus.core.mapper.BaseMapper.selectPage(BaseMapper.java:348) ~[mybatis-plus-core-3.5.5.jar:3.5.5] + at java.base/java.lang.invoke.MethodHandle.invokeWithArguments(MethodHandle.java:732) ~[na:na] + at com.baomidou.mybatisplus.core.override.MybatisMapperProxy$DefaultMethodInvoker.invoke(MybatisMapperProxy.java:166) ~[mybatis-plus-core-3.5.5.jar:3.5.5] + at com.baomidou.mybatisplus.core.override.MybatisMapperProxy.invoke(MybatisMapperProxy.java:89) ~[mybatis-plus-core-3.5.5.jar:3.5.5] + at jdk.proxy2/jdk.proxy2.$Proxy85.selectPage(Unknown Source) ~[na:na] + at com.baomidou.mybatisplus.extension.service.IService.page(IService.java:448) ~[mybatis-plus-extension-3.5.5.jar:3.5.5] + at com.baomidou.mybatisplus.extension.service.IService$$FastClassBySpringCGLIB$$f8525d18.invoke() ~[mybatis-plus-extension-3.5.5.jar:3.5.5] + at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218) ~[spring-core-5.3.31.jar:5.3.31] + at org.springframework.aop.framework.CglibAopProxy.invokeMethod(CglibAopProxy.java:386) ~[spring-aop-5.3.31.jar:5.3.31] + at org.springframework.aop.framework.CglibAopProxy.access$000(CglibAopProxy.java:85) ~[spring-aop-5.3.31.jar:5.3.31] + at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:703) ~[spring-aop-5.3.31.jar:5.3.31] + at com.gpf.pethospital.service.impl.PetServiceImpl$$EnhancerBySpringCGLIB$$e0f570e.page() ~[classes/:na] + at com.gpf.pethospital.controller.PetController.list(PetController.java:33) ~[classes/:na] + at com.gpf.pethospital.controller.PetController$$FastClassBySpringCGLIB$$78a1db9c.invoke() ~[classes/:na] + at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218) ~[spring-core-5.3.31.jar:5.3.31] + at org.springframework.aop.framework.CglibAopProxy.invokeMethod(CglibAopProxy.java:386) ~[spring-aop-5.3.31.jar:5.3.31] + at org.springframework.aop.framework.CglibAopProxy.access$000(CglibAopProxy.java:85) ~[spring-aop-5.3.31.jar:5.3.31] + at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:703) ~[spring-aop-5.3.31.jar:5.3.31] + at com.gpf.pethospital.controller.PetController$$EnhancerBySpringCGLIB$$28c5e4ba.list() ~[classes/:na] + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na] + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[na:na] + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na] + at java.base/java.lang.reflect.Method.invoke(Method.java:569) ~[na:na] + at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:205) ~[spring-web-5.3.31.jar:5.3.31] + at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:150) ~[spring-web-5.3.31.jar:5.3.31] + at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:117) ~[spring-webmvc-5.3.31.jar:5.3.31] + at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:895) ~[spring-webmvc-5.3.31.jar:5.3.31] + at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808) ~[spring-webmvc-5.3.31.jar:5.3.31] + at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) ~[spring-webmvc-5.3.31.jar:5.3.31] + at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1072) ~[spring-webmvc-5.3.31.jar:5.3.31] + at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:965) ~[spring-webmvc-5.3.31.jar:5.3.31] + at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) ~[spring-webmvc-5.3.31.jar:5.3.31] + at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898) ~[spring-webmvc-5.3.31.jar:5.3.31] + at javax.servlet.http.HttpServlet.service(HttpServlet.java:529) ~[tomcat-embed-core-9.0.83.jar:4.0.FR] + at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) ~[spring-webmvc-5.3.31.jar:5.3.31] + at javax.servlet.http.HttpServlet.service(HttpServlet.java:623) ~[tomcat-embed-core-9.0.83.jar:4.0.FR] + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:209) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51) ~[tomcat-embed-websocket-9.0.83.jar:9.0.83] + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:337) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.access.intercept.AuthorizationFilter.doFilter(AuthorizationFilter.java:96) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:346) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:122) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:116) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:346) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:126) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:81) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:346) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:109) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:346) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:149) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:346) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:63) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:346) ~[spring-security-web-5.7.11.jar:5.7.11] + at com.gpf.pethospital.security.JwtAuthenticationFilter.doFilterInternal(JwtAuthenticationFilter.java:45) ~[classes/:na] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) ~[spring-web-5.3.31.jar:5.3.31] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:346) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:103) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:89) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:346) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.header.HeaderWriterFilter.doHeadersAfter(HeaderWriterFilter.java:90) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:75) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) ~[spring-web-5.3.31.jar:5.3.31] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:346) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:112) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:82) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:346) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:55) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) ~[spring-web-5.3.31.jar:5.3.31] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:346) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.session.DisableEncodeUrlFilter.doFilterInternal(DisableEncodeUrlFilter.java:42) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) ~[spring-web-5.3.31.jar:5.3.31] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:346) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:221) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:186) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:354) ~[spring-web-5.3.31.jar:5.3.31] + at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:267) ~[spring-web-5.3.31.jar:5.3.31] + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) ~[spring-web-5.3.31.jar:5.3.31] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) ~[spring-web-5.3.31.jar:5.3.31] + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) ~[spring-web-5.3.31.jar:5.3.31] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) ~[spring-web-5.3.31.jar:5.3.31] + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) ~[spring-web-5.3.31.jar:5.3.31] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) ~[spring-web-5.3.31.jar:5.3.31] + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:168) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:481) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:130) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:342) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:390) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:928) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1794) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at java.base/java.lang.Thread.run(Thread.java:840) ~[na:na] + +2026-01-29 12:22:57.837 INFO 7324 --- [ionShutdownHook] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown initiated... +2026-01-29 12:22:57.838 INFO 7324 --- [ionShutdownHook] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown completed. +[INFO] ------------------------------------------------------------------------ +[INFO] BUILD FAILURE +[INFO] ------------------------------------------------------------------------ +[INFO] Total time: 01:20 min +[INFO] Finished at: 2026-01-29T12:22:57+08:00 +[INFO] ------------------------------------------------------------------------ +[ERROR] Failed to execute goal org.springframework.boot:spring-boot-maven-plugin:2.7.18:run (default-cli) on project pet-hospital: Application finished with exit code: 143 -> [Help 1] +[ERROR] +[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch. +[ERROR] Re-run Maven using the -X switch to enable full debug logging. +[ERROR] +[ERROR] For more information about the errors and possible solutions, please read the following articles: +[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoExecutionException diff --git a/backend/backend_jwt_fixed.log b/backend/backend_jwt_fixed.log new file mode 100644 index 0000000..f02f47d --- /dev/null +++ b/backend/backend_jwt_fixed.log @@ -0,0 +1,429 @@ +[INFO] Scanning for projects... +[INFO] +[INFO] ------------------------< com.gpf:pet-hospital >------------------------ +[INFO] Building 爱维宠物医院管理平台 1.0.0 +[INFO] --------------------------------[ jar ]--------------------------------- +[INFO] +[INFO] >>> spring-boot-maven-plugin:2.7.18:run (default-cli) > test-compile @ pet-hospital >>> +[INFO] +[INFO] --- maven-resources-plugin:3.2.0:resources (default-resources) @ pet-hospital --- +[INFO] Using 'UTF-8' encoding to copy filtered resources. +[INFO] Using 'UTF-8' encoding to copy filtered properties files. +[INFO] Copying 2 resources +[INFO] Copying 1 resource +[INFO] +[INFO] --- maven-compiler-plugin:3.10.1:compile (default-compile) @ pet-hospital --- +[INFO] Nothing to compile - all classes are up to date +[INFO] +[INFO] --- maven-resources-plugin:3.2.0:testResources (default-testResources) @ pet-hospital --- +[INFO] Using 'UTF-8' encoding to copy filtered resources. +[INFO] Using 'UTF-8' encoding to copy filtered properties files. +[INFO] skip non existing resourceDirectory /mnt/d/bs/gpf_pet_hospital/backend/src/test/resources +[INFO] +[INFO] --- maven-compiler-plugin:3.10.1:testCompile (default-testCompile) @ pet-hospital --- +[INFO] No sources to compile +[INFO] +[INFO] <<< spring-boot-maven-plugin:2.7.18:run (default-cli) < test-compile @ pet-hospital <<< +[INFO] +[INFO] +[INFO] --- spring-boot-maven-plugin:2.7.18:run (default-cli) @ pet-hospital --- +[INFO] Attaching agents: [] + + . ____ _ __ _ _ + /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \ +( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \ + \\/ ___)| |_)| | | | | || (_| | ) ) ) ) + ' |____| .__|_| |_|_| |_\__, | / / / / + =========|_|==============|___/=/_/_/_/ + :: Spring Boot :: (v2.7.18) + +2026-01-29 12:11:44.343 INFO 6533 --- [ main] c.g.pethospital.PetHospitalApplication : Starting PetHospitalApplication using Java 17.0.17 on LAPTOP-FS8K5GSO with PID 6533 (/mnt/d/bs/gpf_pet_hospital/backend/target/classes started by wangzq in /mnt/d/bs/gpf_pet_hospital/backend) +2026-01-29 12:11:44.348 INFO 6533 --- [ main] c.g.pethospital.PetHospitalApplication : The following 1 profile is active: "dev" +2026-01-29 12:11:49.720 INFO 6533 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8081 (http) +2026-01-29 12:11:49.746 INFO 6533 --- [ main] o.apache.catalina.core.StandardService : Starting service [Tomcat] +2026-01-29 12:11:49.746 INFO 6533 --- [ main] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.83] +2026-01-29 12:11:49.915 INFO 6533 --- [ main] o.a.c.c.C.[Tomcat].[localhost].[/api] : Initializing Spring embedded WebApplicationContext +2026-01-29 12:11:49.915 INFO 6533 --- [ main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 5483 ms +2026-01-29 12:11:49.970 INFO 6533 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting... +2026-01-29 12:11:50.790 INFO 6533 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed. +2026-01-29 12:11:50.821 INFO 6533 --- [ main] o.s.b.a.h2.H2ConsoleAutoConfiguration : H2 console available at '/h2-console'. Database available at 'jdbc:h2:mem:testdb' +Logging initialized using 'class org.apache.ibatis.logging.stdout.StdOutImpl' adapter. +Initialization Sequence datacenterId:1 workerId:16 + _ _ |_ _ _|_. ___ _ | _ +| | |\/|_)(_| | |_\ |_)||_|_\ + / | + 3.5.5 +2026-01-29 12:11:53.249 WARN 6533 --- [ main] .s.s.UserDetailsServiceAutoConfiguration : + +Using generated security password: 609d260c-f511-4bb7-8d09-763961b92f36 + +This generated password is for development use only. Your security configuration must be updated before running your application in production. + +2026-01-29 12:11:53.571 INFO 6533 --- [ main] o.s.s.web.DefaultSecurityFilterChain : Will secure any request with [org.springframework.security.web.session.DisableEncodeUrlFilter@797fcf9, org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter@16bd7ae1, org.springframework.security.web.context.SecurityContextPersistenceFilter@69796bd0, org.springframework.security.web.header.HeaderWriterFilter@7abeabe9, org.springframework.security.web.authentication.logout.LogoutFilter@46394f65, com.gpf.pethospital.security.JwtAuthenticationFilter@15d114ce, org.springframework.security.web.savedrequest.RequestCacheAwareFilter@8c0a23f, org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter@26c8b296, org.springframework.security.web.authentication.AnonymousAuthenticationFilter@3312f4f4, org.springframework.security.web.session.SessionManagementFilter@8c43966, org.springframework.security.web.access.ExceptionTranslationFilter@251c8145, org.springframework.security.web.access.intercept.AuthorizationFilter@391515c7] +2026-01-29 12:11:55.004 INFO 6533 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8081 (http) with context path '/api' +2026-01-29 12:11:55.018 INFO 6533 --- [ main] c.g.pethospital.PetHospitalApplication : Started PetHospitalApplication in 11.983 seconds (JVM running for 12.531) +2026-01-29 12:12:01.117 INFO 6533 --- [nio-8081-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/api] : Initializing Spring DispatcherServlet 'dispatcherServlet' +2026-01-29 12:12:01.118 INFO 6533 --- [nio-8081-exec-1] o.s.web.servlet.DispatcherServlet : Initializing Servlet 'dispatcherServlet' +2026-01-29 12:12:01.120 INFO 6533 --- [nio-8081-exec-1] o.s.web.servlet.DispatcherServlet : Completed initialization in 1 ms +Creating a new SqlSession +SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@3c9c63df] was not registered for synchronization because synchronization is not active +JDBC Connection [HikariProxyConnection@598865562 wrapping conn0: url=jdbc:h2:mem:testdb user=SA] will not be managed by Spring +==> Preparing: SELECT id,username,phone,email,password,role,status,avatar,create_time,update_time,deleted FROM `user` WHERE deleted=0 AND (username = ? OR phone = ? OR email = ?) +==> Parameters: admin(String), admin(String), admin(String) +<== Total: 0 +Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@3c9c63df] +Creating a new SqlSession +SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@4d78424f] was not registered for synchronization because synchronization is not active +JDBC Connection [HikariProxyConnection@905814132 wrapping conn0: url=jdbc:h2:mem:testdb user=SA] will not be managed by Spring +==> Preparing: SELECT COUNT( * ) AS total FROM `user` WHERE deleted=0 AND (username = ? OR phone = ? OR email = ?) +==> Parameters: admin(String), 13800138000(String), admin@example.com(String) +<== Columns: TOTAL +<== Row: 0 +<== Total: 1 +Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@4d78424f] +Creating a new SqlSession +SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@5bd3eccd] was not registered for synchronization because synchronization is not active +JDBC Connection [HikariProxyConnection@1551126099 wrapping conn0: url=jdbc:h2:mem:testdb user=SA] will not be managed by Spring +==> Preparing: INSERT INTO `user` ( username, phone, email, password, role, status, create_time, update_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ? ) +==> Parameters: admin(String), 13800138000(String), admin@example.com(String), $2a$10$m3/z7X3iQBgyaxxexhuKFuELrtYEWeWp819vohmW3WrY6pWj/R5HK(String), CUSTOMER(String), 1(Integer), 2026-01-29T12:12:05.326822806(LocalDateTime), 2026-01-29T12:12:05.326822806(LocalDateTime) +<== Updates: 1 +Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@5bd3eccd] +Creating a new SqlSession +SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@35fa3ce5] was not registered for synchronization because synchronization is not active +JDBC Connection [HikariProxyConnection@993903658 wrapping conn0: url=jdbc:h2:mem:testdb user=SA] will not be managed by Spring +==> Preparing: SELECT id,username,phone,email,password,role,status,avatar,create_time,update_time,deleted FROM `user` WHERE deleted=0 AND (username = ? OR phone = ? OR email = ?) +==> Parameters: admin(String), admin(String), admin(String) +<== Columns: ID, USERNAME, PHONE, EMAIL, PASSWORD, ROLE, STATUS, AVATAR, CREATE_TIME, UPDATE_TIME, DELETED +<== Row: 1, admin, 13800138000, admin@example.com, $2a$10$m3/z7X3iQBgyaxxexhuKFuELrtYEWeWp819vohmW3WrY6pWj/R5HK, CUSTOMER, 1, null, 2026-01-29 12:12:05.326823, 2026-01-29 12:12:05.326823, 0 +<== Total: 1 +Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@35fa3ce5] +Creating a new SqlSession +SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@4fbe9fd8] was not registered for synchronization because synchronization is not active +JDBC Connection [HikariProxyConnection@1098479711 wrapping conn0: url=jdbc:h2:mem:testdb user=SA] will not be managed by Spring +==> Preparing: SELECT id,username,phone,email,password,role,status,avatar,create_time,update_time,deleted FROM `user` WHERE deleted=0 AND (username = ? OR phone = ? OR email = ?) +==> Parameters: admin(String), admin(String), admin(String) +<== Columns: ID, USERNAME, PHONE, EMAIL, PASSWORD, ROLE, STATUS, AVATAR, CREATE_TIME, UPDATE_TIME, DELETED +<== Row: 1, admin, 13800138000, admin@example.com, $2a$10$m3/z7X3iQBgyaxxexhuKFuELrtYEWeWp819vohmW3WrY6pWj/R5HK, CUSTOMER, 1, null, 2026-01-29 12:12:05.326823, 2026-01-29 12:12:05.326823, 0 +<== Total: 1 +Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@4fbe9fd8] +Creating a new SqlSession +SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@2f3cfa05] was not registered for synchronization because synchronization is not active +JDBC Connection [HikariProxyConnection@142534824 wrapping conn0: url=jdbc:h2:mem:testdb user=SA] will not be managed by Spring +==> Preparing: SELECT id,username,phone,email,password,role,status,avatar,create_time,update_time,deleted FROM `user` WHERE deleted=0 AND (username = ? OR phone = ? OR email = ?) +==> Parameters: admin(String), admin(String), admin(String) +<== Columns: ID, USERNAME, PHONE, EMAIL, PASSWORD, ROLE, STATUS, AVATAR, CREATE_TIME, UPDATE_TIME, DELETED +<== Row: 1, admin, 13800138000, admin@example.com, $2a$10$m3/z7X3iQBgyaxxexhuKFuELrtYEWeWp819vohmW3WrY6pWj/R5HK, CUSTOMER, 1, null, 2026-01-29 12:12:05.326823, 2026-01-29 12:12:05.326823, 0 +<== Total: 1 +Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@2f3cfa05] +Creating a new SqlSession +SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@337f2551] was not registered for synchronization because synchronization is not active +JDBC Connection [HikariProxyConnection@2089142133 wrapping conn0: url=jdbc:h2:mem:testdb user=SA] will not be managed by Spring +==> Preparing: SELECT id,username,phone,email,password,role,status,avatar,create_time,update_time,deleted FROM `user` WHERE deleted=0 AND (username = ? OR phone = ? OR email = ?) +==> Parameters: admin(String), admin(String), admin(String) +<== Columns: ID, USERNAME, PHONE, EMAIL, PASSWORD, ROLE, STATUS, AVATAR, CREATE_TIME, UPDATE_TIME, DELETED +<== Row: 1, admin, 13800138000, admin@example.com, $2a$10$m3/z7X3iQBgyaxxexhuKFuELrtYEWeWp819vohmW3WrY6pWj/R5HK, CUSTOMER, 1, null, 2026-01-29 12:12:05.326823, 2026-01-29 12:12:05.326823, 0 +<== Total: 1 +Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@337f2551] +Creating a new SqlSession +SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@58aced53] was not registered for synchronization because synchronization is not active +JDBC Connection [HikariProxyConnection@1449859126 wrapping conn0: url=jdbc:h2:mem:testdb user=SA] will not be managed by Spring +==> Preparing: SELECT COUNT( * ) AS total FROM `user` WHERE deleted=0 AND (username = ? OR phone = ? OR email = ?) +==> Parameters: admin(String), 13800138000(String), admin@example.com(String) +<== Columns: TOTAL +<== Row: 1 +<== Total: 1 +Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@58aced53] +Creating a new SqlSession +SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@6153cf09] was not registered for synchronization because synchronization is not active +JDBC Connection [HikariProxyConnection@1871986003 wrapping conn0: url=jdbc:h2:mem:testdb user=SA] will not be managed by Spring +==> Preparing: SELECT COUNT( * ) AS total FROM `user` WHERE deleted=0 AND (username = ? OR phone = ? OR email = ?) +==> Parameters: admin123(String), 13900139000(String), admin123@example.com(String) +<== Columns: TOTAL +<== Row: 0 +<== Total: 1 +Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@6153cf09] +Creating a new SqlSession +SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@6baba479] was not registered for synchronization because synchronization is not active +JDBC Connection [HikariProxyConnection@782841704 wrapping conn0: url=jdbc:h2:mem:testdb user=SA] will not be managed by Spring +==> Preparing: INSERT INTO `user` ( username, phone, email, password, role, status, create_time, update_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ? ) +==> Parameters: admin123(String), 13900139000(String), admin123@example.com(String), $2a$10$/.neXm.CfrMpzxtwb9/nqeKxVQwOaim7Y77IUqmMH4XtlRVdgcNr.(String), CUSTOMER(String), 1(Integer), 2026-01-29T12:14:01.189417382(LocalDateTime), 2026-01-29T12:14:01.189417382(LocalDateTime) +<== Updates: 1 +Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@6baba479] +Creating a new SqlSession +SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@7038ac66] was not registered for synchronization because synchronization is not active +JDBC Connection [HikariProxyConnection@2130660369 wrapping conn0: url=jdbc:h2:mem:testdb user=SA] will not be managed by Spring +==> Preparing: SELECT id,username,phone,email,password,role,status,avatar,create_time,update_time,deleted FROM `user` WHERE deleted=0 AND (username = ? OR phone = ? OR email = ?) +==> Parameters: admin123(String), admin123(String), admin123(String) +<== Columns: ID, USERNAME, PHONE, EMAIL, PASSWORD, ROLE, STATUS, AVATAR, CREATE_TIME, UPDATE_TIME, DELETED +<== Row: 2, admin123, 13900139000, admin123@example.com, $2a$10$/.neXm.CfrMpzxtwb9/nqeKxVQwOaim7Y77IUqmMH4XtlRVdgcNr., CUSTOMER, 1, null, 2026-01-29 12:14:01.189417, 2026-01-29 12:14:01.189417, 0 +<== Total: 1 +Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@7038ac66] +Creating a new SqlSession +SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@57e83702] was not registered for synchronization because synchronization is not active +JDBC Connection [HikariProxyConnection@1496302479 wrapping conn0: url=jdbc:h2:mem:testdb user=SA] will not be managed by Spring +==> Preparing: SELECT id,username,phone,email,password,role,status,avatar,create_time,update_time,deleted FROM `user` WHERE deleted=0 AND (username = ? OR phone = ? OR email = ?) +==> Parameters: admin123(String), admin123(String), admin123(String) +<== Columns: ID, USERNAME, PHONE, EMAIL, PASSWORD, ROLE, STATUS, AVATAR, CREATE_TIME, UPDATE_TIME, DELETED +<== Row: 2, admin123, 13900139000, admin123@example.com, $2a$10$/.neXm.CfrMpzxtwb9/nqeKxVQwOaim7Y77IUqmMH4XtlRVdgcNr., CUSTOMER, 1, null, 2026-01-29 12:14:01.189417, 2026-01-29 12:14:01.189417, 0 +<== Total: 1 +Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@57e83702] +Creating a new SqlSession +SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@234e6504] was not registered for synchronization because synchronization is not active +JDBC Connection [HikariProxyConnection@1656828531 wrapping conn0: url=jdbc:h2:mem:testdb user=SA] will not be managed by Spring +==> Preparing: SELECT COUNT(*) AS total FROM pet WHERE deleted = 0 AND (owner_id = ?) +==> Parameters: 2(Long) +<== Columns: TOTAL +<== Row: 0 +<== Total: 1 +Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@234e6504] +Creating a new SqlSession +SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@1a43436d] was not registered for synchronization because synchronization is not active +JDBC Connection [HikariProxyConnection@2100380753 wrapping conn0: url=jdbc:h2:mem:testdb user=SA] will not be managed by Spring +==> Preparing: SELECT COUNT(*) AS total FROM pet WHERE deleted = 0 AND (owner_id = ?) +==> Parameters: 2(Long) +<== Columns: TOTAL +<== Row: 0 +<== Total: 1 +Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@1a43436d] +Creating a new SqlSession +SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@649b7e0d] was not registered for synchronization because synchronization is not active +JDBC Connection [HikariProxyConnection@67890336 wrapping conn0: url=jdbc:h2:mem:testdb user=SA] will not be managed by Spring +==> Preparing: SELECT COUNT(*) AS total FROM report WHERE deleted = 0 +==> Parameters: +<== Columns: TOTAL +<== Row: 0 +<== Total: 1 +Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@649b7e0d] +Creating a new SqlSession +SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@63c52e8c] was not registered for synchronization because synchronization is not active +JDBC Connection [HikariProxyConnection@1349410361 wrapping conn0: url=jdbc:h2:mem:testdb user=SA] will not be managed by Spring +==> Preparing: SELECT COUNT(*) AS total FROM order_info WHERE deleted = 0 AND (customer_id = ?) +==> Parameters: 2(Long) +<== Columns: TOTAL +<== Row: 0 +<== Total: 1 +Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@63c52e8c] +Creating a new SqlSession +SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@39c88552] was not registered for synchronization because synchronization is not active +JDBC Connection [HikariProxyConnection@912272537 wrapping conn0: url=jdbc:h2:mem:testdb user=SA] will not be managed by Spring +==> Preparing: SELECT COUNT(*) AS total FROM order_info WHERE deleted = 0 AND (customer_id = ?) +==> Parameters: 2(Long) +<== Columns: TOTAL +<== Row: 0 +<== Total: 1 +Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@39c88552] +Creating a new SqlSession +SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@27aa8fcf] was not registered for synchronization because synchronization is not active +JDBC Connection [HikariProxyConnection@22254561 wrapping conn0: url=jdbc:h2:mem:testdb user=SA] will not be managed by Spring +==> Preparing: SELECT id,username,phone,email,password,role,status,avatar,create_time,update_time,deleted FROM `user` WHERE deleted=0 AND (username = ? OR phone = ? OR email = ?) +==> Parameters: admin123(String), admin123(String), admin123(String) +<== Columns: ID, USERNAME, PHONE, EMAIL, PASSWORD, ROLE, STATUS, AVATAR, CREATE_TIME, UPDATE_TIME, DELETED +<== Row: 2, admin123, 13900139000, admin123@example.com, $2a$10$/.neXm.CfrMpzxtwb9/nqeKxVQwOaim7Y77IUqmMH4XtlRVdgcNr., CUSTOMER, 1, null, 2026-01-29 12:14:01.189417, 2026-01-29 12:14:01.189417, 0 +<== Total: 1 +Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@27aa8fcf] +Creating a new SqlSession +SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@67592afd] was not registered for synchronization because synchronization is not active +JDBC Connection [HikariProxyConnection@111282002 wrapping conn0: url=jdbc:h2:mem:testdb user=SA] will not be managed by Spring +==> Preparing: INSERT INTO pet ( owner_id, name, breed, gender, create_time, update_time ) VALUES ( ?, ?, ?, ?, ?, ? ) +==> Parameters: 2(Long), 小白(String), 金毛(String), M(String), 2026-01-29T12:16:24.527753394(LocalDateTime), 2026-01-29T12:16:24.527753394(LocalDateTime) +<== Updates: 1 +Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@67592afd] +Creating a new SqlSession +SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@2b91672] was not registered for synchronization because synchronization is not active +JDBC Connection [HikariProxyConnection@2134699660 wrapping conn0: url=jdbc:h2:mem:testdb user=SA] will not be managed by Spring +==> Preparing: INSERT INTO appointment ( customer_id, pet_id, appointment_date, time_slot, status, remark, create_time, update_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ? ) +Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@2b91672] +2026-01-29 12:16:30.731 ERROR 6533 --- [nio-8081-exec-8] o.a.c.c.C.[.[.[.[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [/api] threw exception [Request processing failed; nested exception is org.springframework.jdbc.BadSqlGrammarException: +### Error updating database. Cause: org.h2.jdbc.JdbcSQLSyntaxErrorException: Column "TIME_SLOT" not found; SQL statement: +INSERT INTO appointment ( customer_id, pet_id, appointment_date, time_slot, status, remark, create_time, update_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ? ) [42122-214] +### The error may exist in com/gpf/pethospital/mapper/AppointmentMapper.java (best guess) +### The error may involve com.gpf.pethospital.mapper.AppointmentMapper.insert +### The error occurred while executing an update +### SQL: INSERT INTO appointment ( customer_id, pet_id, appointment_date, time_slot, status, remark, create_time, update_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ? ) +### Cause: org.h2.jdbc.JdbcSQLSyntaxErrorException: Column "TIME_SLOT" not found; SQL statement: +INSERT INTO appointment ( customer_id, pet_id, appointment_date, time_slot, status, remark, create_time, update_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ? ) [42122-214] +; bad SQL grammar []; nested exception is org.h2.jdbc.JdbcSQLSyntaxErrorException: Column "TIME_SLOT" not found; SQL statement: +INSERT INTO appointment ( customer_id, pet_id, appointment_date, time_slot, status, remark, create_time, update_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ? ) [42122-214]] with root cause + +org.h2.jdbc.JdbcSQLSyntaxErrorException: Column "TIME_SLOT" not found; SQL statement: +INSERT INTO appointment ( customer_id, pet_id, appointment_date, time_slot, status, remark, create_time, update_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ? ) [42122-214] + at org.h2.message.DbException.getJdbcSQLException(DbException.java:502) ~[h2-2.1.214.jar:2.1.214] + at org.h2.message.DbException.getJdbcSQLException(DbException.java:477) ~[h2-2.1.214.jar:2.1.214] + at org.h2.message.DbException.get(DbException.java:223) ~[h2-2.1.214.jar:2.1.214] + at org.h2.message.DbException.get(DbException.java:199) ~[h2-2.1.214.jar:2.1.214] + at org.h2.table.Table.getColumn(Table.java:749) ~[h2-2.1.214.jar:2.1.214] + at org.h2.command.Parser.parseColumn(Parser.java:1256) ~[h2-2.1.214.jar:2.1.214] + at org.h2.command.Parser.parseColumnList(Parser.java:1241) ~[h2-2.1.214.jar:2.1.214] + at org.h2.command.Parser.parseInsert(Parser.java:1641) ~[h2-2.1.214.jar:2.1.214] + at org.h2.command.Parser.parsePrepared(Parser.java:814) ~[h2-2.1.214.jar:2.1.214] + at org.h2.command.Parser.parse(Parser.java:689) ~[h2-2.1.214.jar:2.1.214] + at org.h2.command.Parser.parse(Parser.java:661) ~[h2-2.1.214.jar:2.1.214] + at org.h2.command.Parser.prepareCommand(Parser.java:569) ~[h2-2.1.214.jar:2.1.214] + at org.h2.engine.SessionLocal.prepareLocal(SessionLocal.java:631) ~[h2-2.1.214.jar:2.1.214] + at org.h2.engine.SessionLocal.prepareCommand(SessionLocal.java:554) ~[h2-2.1.214.jar:2.1.214] + at org.h2.jdbc.JdbcConnection.prepareCommand(JdbcConnection.java:1116) ~[h2-2.1.214.jar:2.1.214] + at org.h2.jdbc.JdbcPreparedStatement.(JdbcPreparedStatement.java:92) ~[h2-2.1.214.jar:2.1.214] + at org.h2.jdbc.JdbcConnection.prepareStatement(JdbcConnection.java:1099) ~[h2-2.1.214.jar:2.1.214] + at com.zaxxer.hikari.pool.ProxyConnection.prepareStatement(ProxyConnection.java:372) ~[HikariCP-4.0.3.jar:na] + at com.zaxxer.hikari.pool.HikariProxyConnection.prepareStatement(HikariProxyConnection.java) ~[HikariCP-4.0.3.jar:na] + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na] + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[na:na] + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na] + at java.base/java.lang.reflect.Method.invoke(Method.java:569) ~[na:na] + at org.apache.ibatis.logging.jdbc.ConnectionLogger.invoke(ConnectionLogger.java:53) ~[mybatis-3.5.15.jar:3.5.15] + at jdk.proxy3/jdk.proxy3.$Proxy64.prepareStatement(Unknown Source) ~[na:na] + at org.apache.ibatis.executor.statement.PreparedStatementHandler.instantiateStatement(PreparedStatementHandler.java:84) ~[mybatis-3.5.15.jar:3.5.15] + at org.apache.ibatis.executor.statement.BaseStatementHandler.prepare(BaseStatementHandler.java:90) ~[mybatis-3.5.15.jar:3.5.15] + at org.apache.ibatis.executor.statement.RoutingStatementHandler.prepare(RoutingStatementHandler.java:60) ~[mybatis-3.5.15.jar:3.5.15] + at jdk.internal.reflect.GeneratedMethodAccessor15.invoke(Unknown Source) ~[na:na] + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na] + at java.base/java.lang.reflect.Method.invoke(Method.java:569) ~[na:na] + at org.apache.ibatis.plugin.Invocation.proceed(Invocation.java:49) ~[mybatis-3.5.15.jar:3.5.15] + at com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor.intercept(MybatisPlusInterceptor.java:106) ~[mybatis-plus-extension-3.5.5.jar:3.5.5] + at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:59) ~[mybatis-3.5.15.jar:3.5.15] + at jdk.proxy2/jdk.proxy2.$Proxy106.prepare(Unknown Source) ~[na:na] + at org.apache.ibatis.executor.SimpleExecutor.prepareStatement(SimpleExecutor.java:90) ~[mybatis-3.5.15.jar:3.5.15] + at org.apache.ibatis.executor.SimpleExecutor.doUpdate(SimpleExecutor.java:49) ~[mybatis-3.5.15.jar:3.5.15] + at org.apache.ibatis.executor.BaseExecutor.update(BaseExecutor.java:117) ~[mybatis-3.5.15.jar:3.5.15] + at org.apache.ibatis.executor.CachingExecutor.update(CachingExecutor.java:76) ~[mybatis-3.5.15.jar:3.5.15] + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na] + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[na:na] + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na] + at java.base/java.lang.reflect.Method.invoke(Method.java:569) ~[na:na] + at org.apache.ibatis.plugin.Invocation.proceed(Invocation.java:49) ~[mybatis-3.5.15.jar:3.5.15] + at com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor.intercept(MybatisPlusInterceptor.java:106) ~[mybatis-plus-extension-3.5.5.jar:3.5.5] + at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:59) ~[mybatis-3.5.15.jar:3.5.15] + at jdk.proxy2/jdk.proxy2.$Proxy105.update(Unknown Source) ~[na:na] + at org.apache.ibatis.session.defaults.DefaultSqlSession.update(DefaultSqlSession.java:197) ~[mybatis-3.5.15.jar:3.5.15] + at org.apache.ibatis.session.defaults.DefaultSqlSession.insert(DefaultSqlSession.java:184) ~[mybatis-3.5.15.jar:3.5.15] + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na] + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[na:na] + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na] + at java.base/java.lang.reflect.Method.invoke(Method.java:569) ~[na:na] + at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:425) ~[mybatis-spring-2.1.2.jar:2.1.2] + at jdk.proxy2/jdk.proxy2.$Proxy71.insert(Unknown Source) ~[na:na] + at org.mybatis.spring.SqlSessionTemplate.insert(SqlSessionTemplate.java:272) ~[mybatis-spring-2.1.2.jar:2.1.2] + at com.baomidou.mybatisplus.core.override.MybatisMapperMethod.execute(MybatisMapperMethod.java:59) ~[mybatis-plus-core-3.5.5.jar:3.5.5] + at com.baomidou.mybatisplus.core.override.MybatisMapperProxy$PlainMethodInvoker.invoke(MybatisMapperProxy.java:152) ~[mybatis-plus-core-3.5.5.jar:3.5.5] + at com.baomidou.mybatisplus.core.override.MybatisMapperProxy.invoke(MybatisMapperProxy.java:89) ~[mybatis-plus-core-3.5.5.jar:3.5.5] + at jdk.proxy2/jdk.proxy2.$Proxy77.insert(Unknown Source) ~[na:na] + at com.baomidou.mybatisplus.extension.service.IService.save(IService.java:60) ~[mybatis-plus-extension-3.5.5.jar:3.5.5] + at com.baomidou.mybatisplus.extension.service.IService$$FastClassBySpringCGLIB$$f8525d18.invoke() ~[mybatis-plus-extension-3.5.5.jar:3.5.5] + at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218) ~[spring-core-5.3.31.jar:5.3.31] + at org.springframework.aop.framework.CglibAopProxy.invokeMethod(CglibAopProxy.java:386) ~[spring-aop-5.3.31.jar:5.3.31] + at org.springframework.aop.framework.CglibAopProxy.access$000(CglibAopProxy.java:85) ~[spring-aop-5.3.31.jar:5.3.31] + at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:703) ~[spring-aop-5.3.31.jar:5.3.31] + at com.gpf.pethospital.service.impl.AppointmentServiceImpl$$EnhancerBySpringCGLIB$$4448a06d.save() ~[classes/:na] + at com.gpf.pethospital.controller.AppointmentController.create(AppointmentController.java:33) ~[classes/:na] + at com.gpf.pethospital.controller.AppointmentController$$FastClassBySpringCGLIB$$4329551c.invoke() ~[classes/:na] + at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218) ~[spring-core-5.3.31.jar:5.3.31] + at org.springframework.aop.framework.CglibAopProxy.invokeMethod(CglibAopProxy.java:386) ~[spring-aop-5.3.31.jar:5.3.31] + at org.springframework.aop.framework.CglibAopProxy.access$000(CglibAopProxy.java:85) ~[spring-aop-5.3.31.jar:5.3.31] + at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:703) ~[spring-aop-5.3.31.jar:5.3.31] + at com.gpf.pethospital.controller.AppointmentController$$EnhancerBySpringCGLIB$$181e5b83.create() ~[classes/:na] + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na] + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[na:na] + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na] + at java.base/java.lang.reflect.Method.invoke(Method.java:569) ~[na:na] + at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:205) ~[spring-web-5.3.31.jar:5.3.31] + at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:150) ~[spring-web-5.3.31.jar:5.3.31] + at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:117) ~[spring-webmvc-5.3.31.jar:5.3.31] + at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:895) ~[spring-webmvc-5.3.31.jar:5.3.31] + at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808) ~[spring-webmvc-5.3.31.jar:5.3.31] + at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) ~[spring-webmvc-5.3.31.jar:5.3.31] + at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1072) ~[spring-webmvc-5.3.31.jar:5.3.31] + at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:965) ~[spring-webmvc-5.3.31.jar:5.3.31] + at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) ~[spring-webmvc-5.3.31.jar:5.3.31] + at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:909) ~[spring-webmvc-5.3.31.jar:5.3.31] + at javax.servlet.http.HttpServlet.service(HttpServlet.java:555) ~[tomcat-embed-core-9.0.83.jar:4.0.FR] + at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) ~[spring-webmvc-5.3.31.jar:5.3.31] + at javax.servlet.http.HttpServlet.service(HttpServlet.java:623) ~[tomcat-embed-core-9.0.83.jar:4.0.FR] + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:209) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51) ~[tomcat-embed-websocket-9.0.83.jar:9.0.83] + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:337) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.access.intercept.AuthorizationFilter.doFilter(AuthorizationFilter.java:96) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:346) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:122) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:116) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:346) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:126) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:81) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:346) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:109) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:346) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:149) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:346) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:63) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:346) ~[spring-security-web-5.7.11.jar:5.7.11] + at com.gpf.pethospital.security.JwtAuthenticationFilter.doFilterInternal(JwtAuthenticationFilter.java:45) ~[classes/:na] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) ~[spring-web-5.3.31.jar:5.3.31] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:346) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:103) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:89) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:346) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.header.HeaderWriterFilter.doHeadersAfter(HeaderWriterFilter.java:90) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:75) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) ~[spring-web-5.3.31.jar:5.3.31] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:346) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:112) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:82) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:346) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:55) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) ~[spring-web-5.3.31.jar:5.3.31] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:346) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.session.DisableEncodeUrlFilter.doFilterInternal(DisableEncodeUrlFilter.java:42) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) ~[spring-web-5.3.31.jar:5.3.31] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:346) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:221) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:186) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:354) ~[spring-web-5.3.31.jar:5.3.31] + at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:267) ~[spring-web-5.3.31.jar:5.3.31] + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) ~[spring-web-5.3.31.jar:5.3.31] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) ~[spring-web-5.3.31.jar:5.3.31] + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) ~[spring-web-5.3.31.jar:5.3.31] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) ~[spring-web-5.3.31.jar:5.3.31] + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) ~[spring-web-5.3.31.jar:5.3.31] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) ~[spring-web-5.3.31.jar:5.3.31] + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:168) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:481) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:130) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:342) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:390) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:928) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1794) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at java.base/java.lang.Thread.run(Thread.java:840) ~[na:na] + +2026-01-29 12:16:37.467 INFO 6533 --- [ionShutdownHook] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown initiated... +2026-01-29 12:16:37.469 INFO 6533 --- [ionShutdownHook] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown completed. +[INFO] ------------------------------------------------------------------------ +[INFO] BUILD FAILURE +[INFO] ------------------------------------------------------------------------ +[INFO] Total time: 05:02 min +[INFO] Finished at: 2026-01-29T12:16:37+08:00 +[INFO] ------------------------------------------------------------------------ +[ERROR] Failed to execute goal org.springframework.boot:spring-boot-maven-plugin:2.7.18:run (default-cli) on project pet-hospital: Application finished with exit code: 143 -> [Help 1] +[ERROR] +[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch. +[ERROR] Re-run Maven using the -X switch to enable full debug logging. +[ERROR] +[ERROR] For more information about the errors and possible solutions, please read the following articles: +[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoExecutionException diff --git a/backend/backend_output.log b/backend/backend_output.log new file mode 100644 index 0000000..58a3817 --- /dev/null +++ b/backend/backend_output.log @@ -0,0 +1,454 @@ +[INFO] Scanning for projects... +[INFO] +[INFO] ------------------------< com.gpf:pet-hospital >------------------------ +[INFO] Building 爱维宠物医院管理平台 1.0.0 +[INFO] --------------------------------[ jar ]--------------------------------- +[INFO] +[INFO] >>> spring-boot-maven-plugin:2.7.18:run (default-cli) > test-compile @ pet-hospital >>> +[INFO] +[INFO] --- maven-resources-plugin:3.2.0:resources (default-resources) @ pet-hospital --- +[INFO] Using 'UTF-8' encoding to copy filtered resources. +[INFO] Using 'UTF-8' encoding to copy filtered properties files. +[INFO] Copying 2 resources +[INFO] Copying 0 resource +[INFO] +[INFO] --- maven-compiler-plugin:3.10.1:compile (default-compile) @ pet-hospital --- +[INFO] Nothing to compile - all classes are up to date +[INFO] +[INFO] --- maven-resources-plugin:3.2.0:testResources (default-testResources) @ pet-hospital --- +[INFO] Using 'UTF-8' encoding to copy filtered resources. +[INFO] Using 'UTF-8' encoding to copy filtered properties files. +[INFO] skip non existing resourceDirectory /mnt/d/bs/gpf_pet_hospital/backend/src/test/resources +[INFO] +[INFO] --- maven-compiler-plugin:3.10.1:testCompile (default-testCompile) @ pet-hospital --- +[INFO] No sources to compile +[INFO] +[INFO] <<< spring-boot-maven-plugin:2.7.18:run (default-cli) < test-compile @ pet-hospital <<< +[INFO] +[INFO] +[INFO] --- spring-boot-maven-plugin:2.7.18:run (default-cli) @ pet-hospital --- +[INFO] Attaching agents: [] + + . ____ _ __ _ _ + /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \ +( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \ + \\/ ___)| |_)| | | | | || (_| | ) ) ) ) + ' |____| .__|_| |_|_| |_\__, | / / / / + =========|_|==============|___/=/_/_/_/ + :: Spring Boot :: (v2.7.18) + +2026-01-29 12:04:47.805 INFO 5373 --- [ main] c.g.pethospital.PetHospitalApplication : Starting PetHospitalApplication using Java 17.0.17 on LAPTOP-FS8K5GSO with PID 5373 (/mnt/d/bs/gpf_pet_hospital/backend/target/classes started by wangzq in /mnt/d/bs/gpf_pet_hospital/backend) +2026-01-29 12:04:47.811 INFO 5373 --- [ main] c.g.pethospital.PetHospitalApplication : The following 1 profile is active: "dev" +2026-01-29 12:04:53.186 INFO 5373 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8081 (http) +2026-01-29 12:04:53.211 INFO 5373 --- [ main] o.apache.catalina.core.StandardService : Starting service [Tomcat] +2026-01-29 12:04:53.212 INFO 5373 --- [ main] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.83] +2026-01-29 12:04:53.398 INFO 5373 --- [ main] o.a.c.c.C.[Tomcat].[localhost].[/api] : Initializing Spring embedded WebApplicationContext +2026-01-29 12:04:53.398 INFO 5373 --- [ main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 5482 ms +2026-01-29 12:04:53.460 INFO 5373 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting... +2026-01-29 12:04:54.407 INFO 5373 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed. +2026-01-29 12:04:54.438 INFO 5373 --- [ main] o.s.b.a.h2.H2ConsoleAutoConfiguration : H2 console available at '/h2-console'. Database available at 'jdbc:h2:mem:testdb' +Logging initialized using 'class org.apache.ibatis.logging.stdout.StdOutImpl' adapter. +Initialization Sequence datacenterId:1 workerId:11 + _ _ |_ _ _|_. ___ _ | _ +| | |\/|_)(_| | |_\ |_)||_|_\ + / | + 3.5.5 +2026-01-29 12:04:56.741 WARN 5373 --- [ main] .s.s.UserDetailsServiceAutoConfiguration : + +Using generated security password: bcbf67e6-f301-431f-9886-fb2c36acea73 + +This generated password is for development use only. Your security configuration must be updated before running your application in production. + +2026-01-29 12:04:57.057 INFO 5373 --- [ main] o.s.s.web.DefaultSecurityFilterChain : Will secure any request with [org.springframework.security.web.session.DisableEncodeUrlFilter@35145874, org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter@77524ca7, org.springframework.security.web.context.SecurityContextPersistenceFilter@fbe70d8, org.springframework.security.web.header.HeaderWriterFilter@265c1a7c, org.springframework.security.web.authentication.logout.LogoutFilter@49580ca8, com.gpf.pethospital.security.JwtAuthenticationFilter@11df2829, org.springframework.security.web.savedrequest.RequestCacheAwareFilter@7d2c345d, org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter@5db948c9, org.springframework.security.web.authentication.AnonymousAuthenticationFilter@18e4674d, org.springframework.security.web.session.SessionManagementFilter@78c262ba, org.springframework.security.web.access.ExceptionTranslationFilter@740a0d5e, org.springframework.security.web.access.intercept.AuthorizationFilter@5b733ef7] +2026-01-29 12:04:58.379 INFO 5373 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8081 (http) with context path '/api' +2026-01-29 12:04:58.391 INFO 5373 --- [ main] c.g.pethospital.PetHospitalApplication : Started PetHospitalApplication in 11.994 seconds (JVM running for 12.596) +2026-01-29 12:05:12.695 INFO 5373 --- [nio-8081-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/api] : Initializing Spring DispatcherServlet 'dispatcherServlet' +2026-01-29 12:05:12.695 INFO 5373 --- [nio-8081-exec-1] o.s.web.servlet.DispatcherServlet : Initializing Servlet 'dispatcherServlet' +2026-01-29 12:05:12.696 INFO 5373 --- [nio-8081-exec-1] o.s.web.servlet.DispatcherServlet : Completed initialization in 1 ms +Creating a new SqlSession +SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@5dfce1d1] was not registered for synchronization because synchronization is not active +JDBC Connection [HikariProxyConnection@61730178 wrapping conn0: url=jdbc:h2:mem:testdb user=SA] will not be managed by Spring +==> Preparing: SELECT id,username,phone,email,password,role,status,avatar,create_time,update_time,deleted FROM user WHERE deleted=0 AND (username = ? OR phone = ? OR email = ?) +Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@5dfce1d1] +2026-01-29 12:05:13.662 ERROR 5373 --- [nio-8081-exec-1] o.a.c.c.C.[.[.[.[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [/api] threw exception [Request processing failed; nested exception is org.springframework.jdbc.BadSqlGrammarException: +### Error querying database. Cause: org.h2.jdbc.JdbcSQLSyntaxErrorException: Syntax error in SQL statement "SELECT id,username,phone,email,password,role,status,avatar,create_time,update_time,deleted FROM [*]user WHERE deleted=0 AND (username = ? OR phone = ? OR email = ?)"; expected "identifier"; SQL statement: +SELECT id,username,phone,email,password,role,status,avatar,create_time,update_time,deleted FROM user WHERE deleted=0 AND (username = ? OR phone = ? OR email = ?) [42001-214] +### The error may exist in com/gpf/pethospital/mapper/UserMapper.java (best guess) +### The error may involve com.gpf.pethospital.mapper.UserMapper.selectList +### The error occurred while executing a query +### SQL: SELECT id,username,phone,email,password,role,status,avatar,create_time,update_time,deleted FROM user WHERE deleted=0 AND (username = ? OR phone = ? OR email = ?) +### Cause: org.h2.jdbc.JdbcSQLSyntaxErrorException: Syntax error in SQL statement "SELECT id,username,phone,email,password,role,status,avatar,create_time,update_time,deleted FROM [*]user WHERE deleted=0 AND (username = ? OR phone = ? OR email = ?)"; expected "identifier"; SQL statement: +SELECT id,username,phone,email,password,role,status,avatar,create_time,update_time,deleted FROM user WHERE deleted=0 AND (username = ? OR phone = ? OR email = ?) [42001-214] +; bad SQL grammar []; nested exception is org.h2.jdbc.JdbcSQLSyntaxErrorException: Syntax error in SQL statement "SELECT id,username,phone,email,password,role,status,avatar,create_time,update_time,deleted FROM [*]user WHERE deleted=0 AND (username = ? OR phone = ? OR email = ?)"; expected "identifier"; SQL statement: +SELECT id,username,phone,email,password,role,status,avatar,create_time,update_time,deleted FROM user WHERE deleted=0 AND (username = ? OR phone = ? OR email = ?) [42001-214]] with root cause + +org.h2.jdbc.JdbcSQLSyntaxErrorException: Syntax error in SQL statement "SELECT id,username,phone,email,password,role,status,avatar,create_time,update_time,deleted FROM [*]user WHERE deleted=0 AND (username = ? OR phone = ? OR email = ?)"; expected "identifier"; SQL statement: +SELECT id,username,phone,email,password,role,status,avatar,create_time,update_time,deleted FROM user WHERE deleted=0 AND (username = ? OR phone = ? OR email = ?) [42001-214] + at org.h2.message.DbException.getJdbcSQLException(DbException.java:502) ~[h2-2.1.214.jar:2.1.214] + at org.h2.message.DbException.getJdbcSQLException(DbException.java:477) ~[h2-2.1.214.jar:2.1.214] + at org.h2.message.DbException.getSyntaxError(DbException.java:261) ~[h2-2.1.214.jar:2.1.214] + at org.h2.command.Parser.readIdentifier(Parser.java:5656) ~[h2-2.1.214.jar:2.1.214] + at org.h2.command.Parser.readTablePrimary(Parser.java:1814) ~[h2-2.1.214.jar:2.1.214] + at org.h2.command.Parser.readTableReference(Parser.java:2334) ~[h2-2.1.214.jar:2.1.214] + at org.h2.command.Parser.parseSelectFromPart(Parser.java:2772) ~[h2-2.1.214.jar:2.1.214] + at org.h2.command.Parser.parseSelect(Parser.java:2878) ~[h2-2.1.214.jar:2.1.214] + at org.h2.command.Parser.parseQueryPrimary(Parser.java:2762) ~[h2-2.1.214.jar:2.1.214] + at org.h2.command.Parser.parseQueryTerm(Parser.java:2633) ~[h2-2.1.214.jar:2.1.214] + at org.h2.command.Parser.parseQueryExpressionBody(Parser.java:2612) ~[h2-2.1.214.jar:2.1.214] + at org.h2.command.Parser.parseQueryExpressionBodyAndEndOfQuery(Parser.java:2605) ~[h2-2.1.214.jar:2.1.214] + at org.h2.command.Parser.parseQueryExpression(Parser.java:2598) ~[h2-2.1.214.jar:2.1.214] + at org.h2.command.Parser.parseQuery(Parser.java:2567) ~[h2-2.1.214.jar:2.1.214] + at org.h2.command.Parser.parsePrepared(Parser.java:724) ~[h2-2.1.214.jar:2.1.214] + at org.h2.command.Parser.parse(Parser.java:689) ~[h2-2.1.214.jar:2.1.214] + at org.h2.command.Parser.parse(Parser.java:661) ~[h2-2.1.214.jar:2.1.214] + at org.h2.command.Parser.prepareCommand(Parser.java:569) ~[h2-2.1.214.jar:2.1.214] + at org.h2.engine.SessionLocal.prepareLocal(SessionLocal.java:631) ~[h2-2.1.214.jar:2.1.214] + at org.h2.engine.SessionLocal.prepareCommand(SessionLocal.java:554) ~[h2-2.1.214.jar:2.1.214] + at org.h2.jdbc.JdbcConnection.prepareCommand(JdbcConnection.java:1116) ~[h2-2.1.214.jar:2.1.214] + at org.h2.jdbc.JdbcPreparedStatement.(JdbcPreparedStatement.java:92) ~[h2-2.1.214.jar:2.1.214] + at org.h2.jdbc.JdbcConnection.prepareStatement(JdbcConnection.java:288) ~[h2-2.1.214.jar:2.1.214] + at com.zaxxer.hikari.pool.ProxyConnection.prepareStatement(ProxyConnection.java:337) ~[HikariCP-4.0.3.jar:na] + at com.zaxxer.hikari.pool.HikariProxyConnection.prepareStatement(HikariProxyConnection.java) ~[HikariCP-4.0.3.jar:na] + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na] + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[na:na] + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na] + at java.base/java.lang.reflect.Method.invoke(Method.java:569) ~[na:na] + at org.apache.ibatis.logging.jdbc.ConnectionLogger.invoke(ConnectionLogger.java:53) ~[mybatis-3.5.15.jar:3.5.15] + at jdk.proxy3/jdk.proxy3.$Proxy64.prepareStatement(Unknown Source) ~[na:na] + at org.apache.ibatis.executor.statement.PreparedStatementHandler.instantiateStatement(PreparedStatementHandler.java:88) ~[mybatis-3.5.15.jar:3.5.15] + at org.apache.ibatis.executor.statement.BaseStatementHandler.prepare(BaseStatementHandler.java:90) ~[mybatis-3.5.15.jar:3.5.15] + at org.apache.ibatis.executor.statement.RoutingStatementHandler.prepare(RoutingStatementHandler.java:60) ~[mybatis-3.5.15.jar:3.5.15] + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na] + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[na:na] + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na] + at java.base/java.lang.reflect.Method.invoke(Method.java:569) ~[na:na] + at org.apache.ibatis.plugin.Invocation.proceed(Invocation.java:49) ~[mybatis-3.5.15.jar:3.5.15] + at com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor.intercept(MybatisPlusInterceptor.java:106) ~[mybatis-plus-extension-3.5.5.jar:3.5.5] + at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:59) ~[mybatis-3.5.15.jar:3.5.15] + at jdk.proxy2/jdk.proxy2.$Proxy106.prepare(Unknown Source) ~[na:na] + at org.apache.ibatis.executor.SimpleExecutor.prepareStatement(SimpleExecutor.java:90) ~[mybatis-3.5.15.jar:3.5.15] + at org.apache.ibatis.executor.SimpleExecutor.doQuery(SimpleExecutor.java:64) ~[mybatis-3.5.15.jar:3.5.15] + at org.apache.ibatis.executor.BaseExecutor.queryFromDatabase(BaseExecutor.java:336) ~[mybatis-3.5.15.jar:3.5.15] + at org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:158) ~[mybatis-3.5.15.jar:3.5.15] + at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:110) ~[mybatis-3.5.15.jar:3.5.15] + at com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor.intercept(MybatisPlusInterceptor.java:81) ~[mybatis-plus-extension-3.5.5.jar:3.5.5] + at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:59) ~[mybatis-3.5.15.jar:3.5.15] + at jdk.proxy2/jdk.proxy2.$Proxy105.query(Unknown Source) ~[na:na] + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:154) ~[mybatis-3.5.15.jar:3.5.15] + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:147) ~[mybatis-3.5.15.jar:3.5.15] + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:142) ~[mybatis-3.5.15.jar:3.5.15] + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na] + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[na:na] + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na] + at java.base/java.lang.reflect.Method.invoke(Method.java:569) ~[na:na] + at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:425) ~[mybatis-spring-2.1.2.jar:2.1.2] + at jdk.proxy2/jdk.proxy2.$Proxy71.selectList(Unknown Source) ~[na:na] + at org.mybatis.spring.SqlSessionTemplate.selectList(SqlSessionTemplate.java:224) ~[mybatis-spring-2.1.2.jar:2.1.2] + at com.baomidou.mybatisplus.core.override.MybatisMapperMethod.executeForMany(MybatisMapperMethod.java:164) ~[mybatis-plus-core-3.5.5.jar:3.5.5] + at com.baomidou.mybatisplus.core.override.MybatisMapperMethod.execute(MybatisMapperMethod.java:77) ~[mybatis-plus-core-3.5.5.jar:3.5.5] + at com.baomidou.mybatisplus.core.override.MybatisMapperProxy$PlainMethodInvoker.invoke(MybatisMapperProxy.java:152) ~[mybatis-plus-core-3.5.5.jar:3.5.5] + at com.baomidou.mybatisplus.core.override.MybatisMapperProxy.invoke(MybatisMapperProxy.java:89) ~[mybatis-plus-core-3.5.5.jar:3.5.5] + at jdk.proxy2/jdk.proxy2.$Proxy78.selectList(Unknown Source) ~[na:na] + at com.baomidou.mybatisplus.core.mapper.BaseMapper.selectOne(BaseMapper.java:222) ~[mybatis-plus-core-3.5.5.jar:3.5.5] + at java.base/java.lang.invoke.MethodHandle.invokeWithArguments(MethodHandle.java:732) ~[na:na] + at com.baomidou.mybatisplus.core.override.MybatisMapperProxy$DefaultMethodInvoker.invoke(MybatisMapperProxy.java:166) ~[mybatis-plus-core-3.5.5.jar:3.5.5] + at com.baomidou.mybatisplus.core.override.MybatisMapperProxy.invoke(MybatisMapperProxy.java:89) ~[mybatis-plus-core-3.5.5.jar:3.5.5] + at jdk.proxy2/jdk.proxy2.$Proxy78.selectOne(Unknown Source) ~[na:na] + at com.baomidou.mybatisplus.extension.service.impl.ServiceImpl.getOne(ServiceImpl.java:242) ~[mybatis-plus-extension-3.5.5.jar:3.5.5] + at com.baomidou.mybatisplus.extension.service.IService.getOne(IService.java:327) ~[mybatis-plus-extension-3.5.5.jar:3.5.5] + at com.baomidou.mybatisplus.extension.service.IService$$FastClassBySpringCGLIB$$f8525d18.invoke() ~[mybatis-plus-extension-3.5.5.jar:3.5.5] + at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218) ~[spring-core-5.3.31.jar:5.3.31] + at org.springframework.aop.framework.CglibAopProxy.invokeMethod(CglibAopProxy.java:386) ~[spring-aop-5.3.31.jar:5.3.31] + at org.springframework.aop.framework.CglibAopProxy.access$000(CglibAopProxy.java:85) ~[spring-aop-5.3.31.jar:5.3.31] + at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:703) ~[spring-aop-5.3.31.jar:5.3.31] + at com.gpf.pethospital.service.impl.UserServiceImpl$$EnhancerBySpringCGLIB$$1dbf3365.getOne() ~[classes/:na] + at com.gpf.pethospital.controller.AuthController.login(AuthController.java:67) ~[classes/:na] + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na] + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[na:na] + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na] + at java.base/java.lang.reflect.Method.invoke(Method.java:569) ~[na:na] + at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:205) ~[spring-web-5.3.31.jar:5.3.31] + at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:150) ~[spring-web-5.3.31.jar:5.3.31] + at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:117) ~[spring-webmvc-5.3.31.jar:5.3.31] + at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:895) ~[spring-webmvc-5.3.31.jar:5.3.31] + at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808) ~[spring-webmvc-5.3.31.jar:5.3.31] + at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) ~[spring-webmvc-5.3.31.jar:5.3.31] + at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1072) ~[spring-webmvc-5.3.31.jar:5.3.31] + at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:965) ~[spring-webmvc-5.3.31.jar:5.3.31] + at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) ~[spring-webmvc-5.3.31.jar:5.3.31] + at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:909) ~[spring-webmvc-5.3.31.jar:5.3.31] + at javax.servlet.http.HttpServlet.service(HttpServlet.java:555) ~[tomcat-embed-core-9.0.83.jar:4.0.FR] + at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) ~[spring-webmvc-5.3.31.jar:5.3.31] + at javax.servlet.http.HttpServlet.service(HttpServlet.java:623) ~[tomcat-embed-core-9.0.83.jar:4.0.FR] + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:209) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51) ~[tomcat-embed-websocket-9.0.83.jar:9.0.83] + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:337) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.access.intercept.AuthorizationFilter.doFilter(AuthorizationFilter.java:96) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:346) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:122) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:116) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:346) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:126) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:81) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:346) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:109) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:346) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:149) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:346) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:63) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:346) ~[spring-security-web-5.7.11.jar:5.7.11] + at com.gpf.pethospital.security.JwtAuthenticationFilter.doFilterInternal(JwtAuthenticationFilter.java:45) ~[classes/:na] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) ~[spring-web-5.3.31.jar:5.3.31] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:346) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:103) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:89) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:346) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.header.HeaderWriterFilter.doHeadersAfter(HeaderWriterFilter.java:90) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:75) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) ~[spring-web-5.3.31.jar:5.3.31] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:346) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:112) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:82) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:346) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:55) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) ~[spring-web-5.3.31.jar:5.3.31] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:346) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.session.DisableEncodeUrlFilter.doFilterInternal(DisableEncodeUrlFilter.java:42) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) ~[spring-web-5.3.31.jar:5.3.31] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:346) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:221) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:186) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:354) ~[spring-web-5.3.31.jar:5.3.31] + at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:267) ~[spring-web-5.3.31.jar:5.3.31] + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) ~[spring-web-5.3.31.jar:5.3.31] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) ~[spring-web-5.3.31.jar:5.3.31] + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) ~[spring-web-5.3.31.jar:5.3.31] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) ~[spring-web-5.3.31.jar:5.3.31] + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) ~[spring-web-5.3.31.jar:5.3.31] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) ~[spring-web-5.3.31.jar:5.3.31] + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:168) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:481) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:130) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:342) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:390) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:928) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1794) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at java.base/java.lang.Thread.run(Thread.java:840) ~[na:na] + +Creating a new SqlSession +SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@4d886b99] was not registered for synchronization because synchronization is not active +JDBC Connection [HikariProxyConnection@1331623698 wrapping conn0: url=jdbc:h2:mem:testdb user=SA] will not be managed by Spring +==> Preparing: SELECT COUNT( * ) AS total FROM user WHERE deleted=0 AND (username = ? OR phone = ? OR email = ?) +Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@4d886b99] +2026-01-29 12:05:38.384 ERROR 5373 --- [nio-8081-exec-2] o.a.c.c.C.[.[.[.[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [/api] threw exception [Request processing failed; nested exception is org.springframework.jdbc.BadSqlGrammarException: +### Error querying database. Cause: org.h2.jdbc.JdbcSQLSyntaxErrorException: Syntax error in SQL statement "SELECT COUNT( * ) AS total FROM [*]user WHERE deleted=0 AND (username = ? OR phone = ? OR email = ?)"; expected "identifier"; SQL statement: +SELECT COUNT( * ) AS total FROM user WHERE deleted=0 AND (username = ? OR phone = ? OR email = ?) [42001-214] +### The error may exist in com/gpf/pethospital/mapper/UserMapper.java (best guess) +### The error may involve com.gpf.pethospital.mapper.UserMapper.selectCount +### The error occurred while executing a query +### SQL: SELECT COUNT( * ) AS total FROM user WHERE deleted=0 AND (username = ? OR phone = ? OR email = ?) +### Cause: org.h2.jdbc.JdbcSQLSyntaxErrorException: Syntax error in SQL statement "SELECT COUNT( * ) AS total FROM [*]user WHERE deleted=0 AND (username = ? OR phone = ? OR email = ?)"; expected "identifier"; SQL statement: +SELECT COUNT( * ) AS total FROM user WHERE deleted=0 AND (username = ? OR phone = ? OR email = ?) [42001-214] +; bad SQL grammar []; nested exception is org.h2.jdbc.JdbcSQLSyntaxErrorException: Syntax error in SQL statement "SELECT COUNT( * ) AS total FROM [*]user WHERE deleted=0 AND (username = ? OR phone = ? OR email = ?)"; expected "identifier"; SQL statement: +SELECT COUNT( * ) AS total FROM user WHERE deleted=0 AND (username = ? OR phone = ? OR email = ?) [42001-214]] with root cause + +org.h2.jdbc.JdbcSQLSyntaxErrorException: Syntax error in SQL statement "SELECT COUNT( * ) AS total FROM [*]user WHERE deleted=0 AND (username = ? OR phone = ? OR email = ?)"; expected "identifier"; SQL statement: +SELECT COUNT( * ) AS total FROM user WHERE deleted=0 AND (username = ? OR phone = ? OR email = ?) [42001-214] + at org.h2.message.DbException.getJdbcSQLException(DbException.java:502) ~[h2-2.1.214.jar:2.1.214] + at org.h2.message.DbException.getJdbcSQLException(DbException.java:477) ~[h2-2.1.214.jar:2.1.214] + at org.h2.message.DbException.getSyntaxError(DbException.java:261) ~[h2-2.1.214.jar:2.1.214] + at org.h2.command.Parser.readIdentifier(Parser.java:5656) ~[h2-2.1.214.jar:2.1.214] + at org.h2.command.Parser.readTablePrimary(Parser.java:1814) ~[h2-2.1.214.jar:2.1.214] + at org.h2.command.Parser.readTableReference(Parser.java:2334) ~[h2-2.1.214.jar:2.1.214] + at org.h2.command.Parser.parseSelectFromPart(Parser.java:2772) ~[h2-2.1.214.jar:2.1.214] + at org.h2.command.Parser.parseSelect(Parser.java:2878) ~[h2-2.1.214.jar:2.1.214] + at org.h2.command.Parser.parseQueryPrimary(Parser.java:2762) ~[h2-2.1.214.jar:2.1.214] + at org.h2.command.Parser.parseQueryTerm(Parser.java:2633) ~[h2-2.1.214.jar:2.1.214] + at org.h2.command.Parser.parseQueryExpressionBody(Parser.java:2612) ~[h2-2.1.214.jar:2.1.214] + at org.h2.command.Parser.parseQueryExpressionBodyAndEndOfQuery(Parser.java:2605) ~[h2-2.1.214.jar:2.1.214] + at org.h2.command.Parser.parseQueryExpression(Parser.java:2598) ~[h2-2.1.214.jar:2.1.214] + at org.h2.command.Parser.parseQuery(Parser.java:2567) ~[h2-2.1.214.jar:2.1.214] + at org.h2.command.Parser.parsePrepared(Parser.java:724) ~[h2-2.1.214.jar:2.1.214] + at org.h2.command.Parser.parse(Parser.java:689) ~[h2-2.1.214.jar:2.1.214] + at org.h2.command.Parser.parse(Parser.java:661) ~[h2-2.1.214.jar:2.1.214] + at org.h2.command.Parser.prepareCommand(Parser.java:569) ~[h2-2.1.214.jar:2.1.214] + at org.h2.engine.SessionLocal.prepareLocal(SessionLocal.java:631) ~[h2-2.1.214.jar:2.1.214] + at org.h2.engine.SessionLocal.prepareCommand(SessionLocal.java:554) ~[h2-2.1.214.jar:2.1.214] + at org.h2.jdbc.JdbcConnection.prepareCommand(JdbcConnection.java:1116) ~[h2-2.1.214.jar:2.1.214] + at org.h2.jdbc.JdbcPreparedStatement.(JdbcPreparedStatement.java:92) ~[h2-2.1.214.jar:2.1.214] + at org.h2.jdbc.JdbcConnection.prepareStatement(JdbcConnection.java:288) ~[h2-2.1.214.jar:2.1.214] + at com.zaxxer.hikari.pool.ProxyConnection.prepareStatement(ProxyConnection.java:337) ~[HikariCP-4.0.3.jar:na] + at com.zaxxer.hikari.pool.HikariProxyConnection.prepareStatement(HikariProxyConnection.java) ~[HikariCP-4.0.3.jar:na] + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na] + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[na:na] + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na] + at java.base/java.lang.reflect.Method.invoke(Method.java:569) ~[na:na] + at org.apache.ibatis.logging.jdbc.ConnectionLogger.invoke(ConnectionLogger.java:53) ~[mybatis-3.5.15.jar:3.5.15] + at jdk.proxy3/jdk.proxy3.$Proxy64.prepareStatement(Unknown Source) ~[na:na] + at org.apache.ibatis.executor.statement.PreparedStatementHandler.instantiateStatement(PreparedStatementHandler.java:88) ~[mybatis-3.5.15.jar:3.5.15] + at org.apache.ibatis.executor.statement.BaseStatementHandler.prepare(BaseStatementHandler.java:90) ~[mybatis-3.5.15.jar:3.5.15] + at org.apache.ibatis.executor.statement.RoutingStatementHandler.prepare(RoutingStatementHandler.java:60) ~[mybatis-3.5.15.jar:3.5.15] + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na] + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[na:na] + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na] + at java.base/java.lang.reflect.Method.invoke(Method.java:569) ~[na:na] + at org.apache.ibatis.plugin.Invocation.proceed(Invocation.java:49) ~[mybatis-3.5.15.jar:3.5.15] + at com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor.intercept(MybatisPlusInterceptor.java:106) ~[mybatis-plus-extension-3.5.5.jar:3.5.5] + at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:59) ~[mybatis-3.5.15.jar:3.5.15] + at jdk.proxy2/jdk.proxy2.$Proxy106.prepare(Unknown Source) ~[na:na] + at org.apache.ibatis.executor.SimpleExecutor.prepareStatement(SimpleExecutor.java:90) ~[mybatis-3.5.15.jar:3.5.15] + at org.apache.ibatis.executor.SimpleExecutor.doQuery(SimpleExecutor.java:64) ~[mybatis-3.5.15.jar:3.5.15] + at org.apache.ibatis.executor.BaseExecutor.queryFromDatabase(BaseExecutor.java:336) ~[mybatis-3.5.15.jar:3.5.15] + at org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:158) ~[mybatis-3.5.15.jar:3.5.15] + at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:110) ~[mybatis-3.5.15.jar:3.5.15] + at com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor.intercept(MybatisPlusInterceptor.java:81) ~[mybatis-plus-extension-3.5.5.jar:3.5.5] + at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:59) ~[mybatis-3.5.15.jar:3.5.15] + at jdk.proxy2/jdk.proxy2.$Proxy105.query(Unknown Source) ~[na:na] + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:154) ~[mybatis-3.5.15.jar:3.5.15] + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:147) ~[mybatis-3.5.15.jar:3.5.15] + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:142) ~[mybatis-3.5.15.jar:3.5.15] + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectOne(DefaultSqlSession.java:75) ~[mybatis-3.5.15.jar:3.5.15] + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na] + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[na:na] + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na] + at java.base/java.lang.reflect.Method.invoke(Method.java:569) ~[na:na] + at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:425) ~[mybatis-spring-2.1.2.jar:2.1.2] + at jdk.proxy2/jdk.proxy2.$Proxy71.selectOne(Unknown Source) ~[na:na] + at org.mybatis.spring.SqlSessionTemplate.selectOne(SqlSessionTemplate.java:160) ~[mybatis-spring-2.1.2.jar:2.1.2] + at com.baomidou.mybatisplus.core.override.MybatisMapperMethod.execute(MybatisMapperMethod.java:87) ~[mybatis-plus-core-3.5.5.jar:3.5.5] + at com.baomidou.mybatisplus.core.override.MybatisMapperProxy$PlainMethodInvoker.invoke(MybatisMapperProxy.java:152) ~[mybatis-plus-core-3.5.5.jar:3.5.5] + at com.baomidou.mybatisplus.core.override.MybatisMapperProxy.invoke(MybatisMapperProxy.java:89) ~[mybatis-plus-core-3.5.5.jar:3.5.5] + at jdk.proxy2/jdk.proxy2.$Proxy78.selectCount(Unknown Source) ~[na:na] + at com.baomidou.mybatisplus.extension.service.IService.count(IService.java:397) ~[mybatis-plus-extension-3.5.5.jar:3.5.5] + at com.baomidou.mybatisplus.extension.service.IService$$FastClassBySpringCGLIB$$f8525d18.invoke() ~[mybatis-plus-extension-3.5.5.jar:3.5.5] + at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218) ~[spring-core-5.3.31.jar:5.3.31] + at org.springframework.aop.framework.CglibAopProxy.invokeMethod(CglibAopProxy.java:386) ~[spring-aop-5.3.31.jar:5.3.31] + at org.springframework.aop.framework.CglibAopProxy.access$000(CglibAopProxy.java:85) ~[spring-aop-5.3.31.jar:5.3.31] + at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:703) ~[spring-aop-5.3.31.jar:5.3.31] + at com.gpf.pethospital.service.impl.UserServiceImpl$$EnhancerBySpringCGLIB$$1dbf3365.count() ~[classes/:na] + at com.gpf.pethospital.controller.AuthController.register(AuthController.java:45) ~[classes/:na] + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na] + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[na:na] + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na] + at java.base/java.lang.reflect.Method.invoke(Method.java:569) ~[na:na] + at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:205) ~[spring-web-5.3.31.jar:5.3.31] + at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:150) ~[spring-web-5.3.31.jar:5.3.31] + at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:117) ~[spring-webmvc-5.3.31.jar:5.3.31] + at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:895) ~[spring-webmvc-5.3.31.jar:5.3.31] + at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808) ~[spring-webmvc-5.3.31.jar:5.3.31] + at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) ~[spring-webmvc-5.3.31.jar:5.3.31] + at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1072) ~[spring-webmvc-5.3.31.jar:5.3.31] + at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:965) ~[spring-webmvc-5.3.31.jar:5.3.31] + at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) ~[spring-webmvc-5.3.31.jar:5.3.31] + at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:909) ~[spring-webmvc-5.3.31.jar:5.3.31] + at javax.servlet.http.HttpServlet.service(HttpServlet.java:555) ~[tomcat-embed-core-9.0.83.jar:4.0.FR] + at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) ~[spring-webmvc-5.3.31.jar:5.3.31] + at javax.servlet.http.HttpServlet.service(HttpServlet.java:623) ~[tomcat-embed-core-9.0.83.jar:4.0.FR] + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:209) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51) ~[tomcat-embed-websocket-9.0.83.jar:9.0.83] + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:337) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.access.intercept.AuthorizationFilter.doFilter(AuthorizationFilter.java:96) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:346) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:122) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:116) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:346) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:126) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:81) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:346) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:109) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:346) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:149) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:346) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:63) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:346) ~[spring-security-web-5.7.11.jar:5.7.11] + at com.gpf.pethospital.security.JwtAuthenticationFilter.doFilterInternal(JwtAuthenticationFilter.java:45) ~[classes/:na] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) ~[spring-web-5.3.31.jar:5.3.31] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:346) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:103) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:89) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:346) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.header.HeaderWriterFilter.doHeadersAfter(HeaderWriterFilter.java:90) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:75) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) ~[spring-web-5.3.31.jar:5.3.31] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:346) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:112) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:82) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:346) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:55) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) ~[spring-web-5.3.31.jar:5.3.31] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:346) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.session.DisableEncodeUrlFilter.doFilterInternal(DisableEncodeUrlFilter.java:42) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) ~[spring-web-5.3.31.jar:5.3.31] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:346) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:221) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:186) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:354) ~[spring-web-5.3.31.jar:5.3.31] + at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:267) ~[spring-web-5.3.31.jar:5.3.31] + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) ~[spring-web-5.3.31.jar:5.3.31] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) ~[spring-web-5.3.31.jar:5.3.31] + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) ~[spring-web-5.3.31.jar:5.3.31] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) ~[spring-web-5.3.31.jar:5.3.31] + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) ~[spring-web-5.3.31.jar:5.3.31] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) ~[spring-web-5.3.31.jar:5.3.31] + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:168) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:481) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:130) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:342) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:390) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:928) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1794) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at java.base/java.lang.Thread.run(Thread.java:840) ~[na:na] + +2026-01-29 12:07:30.955 INFO 5373 --- [ionShutdownHook] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown initiated... +2026-01-29 12:07:30.957 INFO 5373 --- [ionShutdownHook] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown completed. +[INFO] ------------------------------------------------------------------------ +[INFO] BUILD FAILURE +[INFO] ------------------------------------------------------------------------ +[INFO] Total time: 02:52 min +[INFO] Finished at: 2026-01-29T12:07:31+08:00 +[INFO] ------------------------------------------------------------------------ +[ERROR] Failed to execute goal org.springframework.boot:spring-boot-maven-plugin:2.7.18:run (default-cli) on project pet-hospital: Application finished with exit code: 143 -> [Help 1] +[ERROR] +[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch. +[ERROR] Re-run Maven using the -X switch to enable full debug logging. +[ERROR] +[ERROR] For more information about the errors and possible solutions, please read the following articles: +[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoExecutionException diff --git a/backend/backend_output_new.log b/backend/backend_output_new.log new file mode 100644 index 0000000..edfa5b1 --- /dev/null +++ b/backend/backend_output_new.log @@ -0,0 +1,271 @@ +[INFO] Scanning for projects... +[INFO] +[INFO] ------------------------< com.gpf:pet-hospital >------------------------ +[INFO] Building 爱维宠物医院管理平台 1.0.0 +[INFO] --------------------------------[ jar ]--------------------------------- +[INFO] +[INFO] >>> spring-boot-maven-plugin:2.7.18:run (default-cli) > test-compile @ pet-hospital >>> +[INFO] +[INFO] --- maven-resources-plugin:3.2.0:resources (default-resources) @ pet-hospital --- +[INFO] Using 'UTF-8' encoding to copy filtered resources. +[INFO] Using 'UTF-8' encoding to copy filtered properties files. +[INFO] Copying 2 resources +[INFO] Copying 0 resource +[INFO] +[INFO] --- maven-compiler-plugin:3.10.1:compile (default-compile) @ pet-hospital --- +[INFO] Changes detected - recompiling the module! +[INFO] Compiling 89 source files to /mnt/d/bs/gpf_pet_hospital/backend/target/classes +[INFO] /mnt/d/bs/gpf_pet_hospital/backend/src/main/java/com/gpf/pethospital/util/JwtUtil.java: /mnt/d/bs/gpf_pet_hospital/backend/src/main/java/com/gpf/pethospital/util/JwtUtil.java uses or overrides a deprecated API. +[INFO] /mnt/d/bs/gpf_pet_hospital/backend/src/main/java/com/gpf/pethospital/util/JwtUtil.java: Recompile with -Xlint:deprecation for details. +[INFO] +[INFO] --- maven-resources-plugin:3.2.0:testResources (default-testResources) @ pet-hospital --- +[INFO] Using 'UTF-8' encoding to copy filtered resources. +[INFO] Using 'UTF-8' encoding to copy filtered properties files. +[INFO] skip non existing resourceDirectory /mnt/d/bs/gpf_pet_hospital/backend/src/test/resources +[INFO] +[INFO] --- maven-compiler-plugin:3.10.1:testCompile (default-testCompile) @ pet-hospital --- +[INFO] No sources to compile +[INFO] +[INFO] <<< spring-boot-maven-plugin:2.7.18:run (default-cli) < test-compile @ pet-hospital <<< +[INFO] +[INFO] +[INFO] --- spring-boot-maven-plugin:2.7.18:run (default-cli) @ pet-hospital --- +[INFO] Attaching agents: [] + + . ____ _ __ _ _ + /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \ +( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \ + \\/ ___)| |_)| | | | | || (_| | ) ) ) ) + ' |____| .__|_| |_|_| |_\__, | / / / / + =========|_|==============|___/=/_/_/_/ + :: Spring Boot :: (v2.7.18) + +2026-01-29 12:07:59.679 INFO 5891 --- [ main] c.g.pethospital.PetHospitalApplication : Starting PetHospitalApplication using Java 17.0.17 on LAPTOP-FS8K5GSO with PID 5891 (/mnt/d/bs/gpf_pet_hospital/backend/target/classes started by wangzq in /mnt/d/bs/gpf_pet_hospital/backend) +2026-01-29 12:07:59.683 INFO 5891 --- [ main] c.g.pethospital.PetHospitalApplication : The following 1 profile is active: "dev" +2026-01-29 12:08:05.074 INFO 5891 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8081 (http) +2026-01-29 12:08:05.099 INFO 5891 --- [ main] o.apache.catalina.core.StandardService : Starting service [Tomcat] +2026-01-29 12:08:05.099 INFO 5891 --- [ main] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.83] +2026-01-29 12:08:05.262 INFO 5891 --- [ main] o.a.c.c.C.[Tomcat].[localhost].[/api] : Initializing Spring embedded WebApplicationContext +2026-01-29 12:08:05.263 INFO 5891 --- [ main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 5506 ms +2026-01-29 12:08:05.337 INFO 5891 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting... +2026-01-29 12:08:06.177 INFO 5891 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed. +2026-01-29 12:08:06.202 INFO 5891 --- [ main] o.s.b.a.h2.H2ConsoleAutoConfiguration : H2 console available at '/h2-console'. Database available at 'jdbc:h2:mem:testdb' +Logging initialized using 'class org.apache.ibatis.logging.stdout.StdOutImpl' adapter. +Initialization Sequence datacenterId:1 workerId:12 + _ _ |_ _ _|_. ___ _ | _ +| | |\/|_)(_| | |_\ |_)||_|_\ + / | + 3.5.5 +2026-01-29 12:08:08.609 WARN 5891 --- [ main] .s.s.UserDetailsServiceAutoConfiguration : + +Using generated security password: 07eb8acb-7b5d-4e82-b3ad-dce7bd7d3078 + +This generated password is for development use only. Your security configuration must be updated before running your application in production. + +2026-01-29 12:08:08.986 INFO 5891 --- [ main] o.s.s.web.DefaultSecurityFilterChain : Will secure any request with [org.springframework.security.web.session.DisableEncodeUrlFilter@626b639e, org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter@273fa9e, org.springframework.security.web.context.SecurityContextPersistenceFilter@3b35798, org.springframework.security.web.header.HeaderWriterFilter@7d2c345d, org.springframework.security.web.authentication.logout.LogoutFilter@39e53bef, com.gpf.pethospital.security.JwtAuthenticationFilter@527a8665, org.springframework.security.web.savedrequest.RequestCacheAwareFilter@4702e7a5, org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter@73bb1337, org.springframework.security.web.authentication.AnonymousAuthenticationFilter@7ab2a07e, org.springframework.security.web.session.SessionManagementFilter@7d1c164a, org.springframework.security.web.access.ExceptionTranslationFilter@fbe70d8, org.springframework.security.web.access.intercept.AuthorizationFilter@4b957db0] +2026-01-29 12:08:10.363 INFO 5891 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8081 (http) with context path '/api' +2026-01-29 12:08:10.378 INFO 5891 --- [ main] c.g.pethospital.PetHospitalApplication : Started PetHospitalApplication in 11.89 seconds (JVM running for 12.459) +2026-01-29 12:08:41.327 INFO 5891 --- [nio-8081-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/api] : Initializing Spring DispatcherServlet 'dispatcherServlet' +2026-01-29 12:08:41.328 INFO 5891 --- [nio-8081-exec-1] o.s.web.servlet.DispatcherServlet : Initializing Servlet 'dispatcherServlet' +2026-01-29 12:08:41.330 INFO 5891 --- [nio-8081-exec-1] o.s.web.servlet.DispatcherServlet : Completed initialization in 0 ms +Creating a new SqlSession +SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@121856cf] was not registered for synchronization because synchronization is not active +JDBC Connection [HikariProxyConnection@754552516 wrapping conn0: url=jdbc:h2:mem:testdb user=SA] will not be managed by Spring +==> Preparing: SELECT COUNT( * ) AS total FROM `user` WHERE deleted=0 AND (username = ? OR phone = ? OR email = ?) +Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@121856cf] +2026-01-29 12:08:42.218 ERROR 5891 --- [nio-8081-exec-1] o.a.c.c.C.[.[.[.[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [/api] threw exception [Request processing failed; nested exception is org.springframework.jdbc.BadSqlGrammarException: +### Error querying database. Cause: org.h2.jdbc.JdbcSQLSyntaxErrorException: Table "USER" not found (this database is empty); SQL statement: +SELECT COUNT( * ) AS total FROM `user` WHERE deleted=0 AND (username = ? OR phone = ? OR email = ?) [42104-214] +### The error may exist in com/gpf/pethospital/mapper/UserMapper.java (best guess) +### The error may involve com.gpf.pethospital.mapper.UserMapper.selectCount +### The error occurred while executing a query +### SQL: SELECT COUNT( * ) AS total FROM `user` WHERE deleted=0 AND (username = ? OR phone = ? OR email = ?) +### Cause: org.h2.jdbc.JdbcSQLSyntaxErrorException: Table "USER" not found (this database is empty); SQL statement: +SELECT COUNT( * ) AS total FROM `user` WHERE deleted=0 AND (username = ? OR phone = ? OR email = ?) [42104-214] +; bad SQL grammar []; nested exception is org.h2.jdbc.JdbcSQLSyntaxErrorException: Table "USER" not found (this database is empty); SQL statement: +SELECT COUNT( * ) AS total FROM `user` WHERE deleted=0 AND (username = ? OR phone = ? OR email = ?) [42104-214]] with root cause + +org.h2.jdbc.JdbcSQLSyntaxErrorException: Table "USER" not found (this database is empty); SQL statement: +SELECT COUNT( * ) AS total FROM `user` WHERE deleted=0 AND (username = ? OR phone = ? OR email = ?) [42104-214] + at org.h2.message.DbException.getJdbcSQLException(DbException.java:502) ~[h2-2.1.214.jar:2.1.214] + at org.h2.message.DbException.getJdbcSQLException(DbException.java:477) ~[h2-2.1.214.jar:2.1.214] + at org.h2.message.DbException.get(DbException.java:223) ~[h2-2.1.214.jar:2.1.214] + at org.h2.message.DbException.get(DbException.java:199) ~[h2-2.1.214.jar:2.1.214] + at org.h2.command.Parser.getTableOrViewNotFoundDbException(Parser.java:8385) ~[h2-2.1.214.jar:2.1.214] + at org.h2.command.Parser.getTableOrViewNotFoundDbException(Parser.java:8369) ~[h2-2.1.214.jar:2.1.214] + at org.h2.command.Parser.readTableOrView(Parser.java:8358) ~[h2-2.1.214.jar:2.1.214] + at org.h2.command.Parser.readTablePrimary(Parser.java:1863) ~[h2-2.1.214.jar:2.1.214] + at org.h2.command.Parser.readTableReference(Parser.java:2334) ~[h2-2.1.214.jar:2.1.214] + at org.h2.command.Parser.parseSelectFromPart(Parser.java:2772) ~[h2-2.1.214.jar:2.1.214] + at org.h2.command.Parser.parseSelect(Parser.java:2878) ~[h2-2.1.214.jar:2.1.214] + at org.h2.command.Parser.parseQueryPrimary(Parser.java:2762) ~[h2-2.1.214.jar:2.1.214] + at org.h2.command.Parser.parseQueryTerm(Parser.java:2633) ~[h2-2.1.214.jar:2.1.214] + at org.h2.command.Parser.parseQueryExpressionBody(Parser.java:2612) ~[h2-2.1.214.jar:2.1.214] + at org.h2.command.Parser.parseQueryExpressionBodyAndEndOfQuery(Parser.java:2605) ~[h2-2.1.214.jar:2.1.214] + at org.h2.command.Parser.parseQueryExpression(Parser.java:2598) ~[h2-2.1.214.jar:2.1.214] + at org.h2.command.Parser.parseQuery(Parser.java:2567) ~[h2-2.1.214.jar:2.1.214] + at org.h2.command.Parser.parsePrepared(Parser.java:724) ~[h2-2.1.214.jar:2.1.214] + at org.h2.command.Parser.parse(Parser.java:689) ~[h2-2.1.214.jar:2.1.214] + at org.h2.command.Parser.parse(Parser.java:661) ~[h2-2.1.214.jar:2.1.214] + at org.h2.command.Parser.prepareCommand(Parser.java:569) ~[h2-2.1.214.jar:2.1.214] + at org.h2.engine.SessionLocal.prepareLocal(SessionLocal.java:631) ~[h2-2.1.214.jar:2.1.214] + at org.h2.engine.SessionLocal.prepareCommand(SessionLocal.java:554) ~[h2-2.1.214.jar:2.1.214] + at org.h2.jdbc.JdbcConnection.prepareCommand(JdbcConnection.java:1116) ~[h2-2.1.214.jar:2.1.214] + at org.h2.jdbc.JdbcPreparedStatement.(JdbcPreparedStatement.java:92) ~[h2-2.1.214.jar:2.1.214] + at org.h2.jdbc.JdbcConnection.prepareStatement(JdbcConnection.java:288) ~[h2-2.1.214.jar:2.1.214] + at com.zaxxer.hikari.pool.ProxyConnection.prepareStatement(ProxyConnection.java:337) ~[HikariCP-4.0.3.jar:na] + at com.zaxxer.hikari.pool.HikariProxyConnection.prepareStatement(HikariProxyConnection.java) ~[HikariCP-4.0.3.jar:na] + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na] + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[na:na] + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na] + at java.base/java.lang.reflect.Method.invoke(Method.java:569) ~[na:na] + at org.apache.ibatis.logging.jdbc.ConnectionLogger.invoke(ConnectionLogger.java:53) ~[mybatis-3.5.15.jar:3.5.15] + at jdk.proxy3/jdk.proxy3.$Proxy64.prepareStatement(Unknown Source) ~[na:na] + at org.apache.ibatis.executor.statement.PreparedStatementHandler.instantiateStatement(PreparedStatementHandler.java:88) ~[mybatis-3.5.15.jar:3.5.15] + at org.apache.ibatis.executor.statement.BaseStatementHandler.prepare(BaseStatementHandler.java:90) ~[mybatis-3.5.15.jar:3.5.15] + at org.apache.ibatis.executor.statement.RoutingStatementHandler.prepare(RoutingStatementHandler.java:60) ~[mybatis-3.5.15.jar:3.5.15] + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na] + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[na:na] + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na] + at java.base/java.lang.reflect.Method.invoke(Method.java:569) ~[na:na] + at org.apache.ibatis.plugin.Invocation.proceed(Invocation.java:49) ~[mybatis-3.5.15.jar:3.5.15] + at com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor.intercept(MybatisPlusInterceptor.java:106) ~[mybatis-plus-extension-3.5.5.jar:3.5.5] + at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:59) ~[mybatis-3.5.15.jar:3.5.15] + at jdk.proxy2/jdk.proxy2.$Proxy107.prepare(Unknown Source) ~[na:na] + at org.apache.ibatis.executor.SimpleExecutor.prepareStatement(SimpleExecutor.java:90) ~[mybatis-3.5.15.jar:3.5.15] + at org.apache.ibatis.executor.SimpleExecutor.doQuery(SimpleExecutor.java:64) ~[mybatis-3.5.15.jar:3.5.15] + at org.apache.ibatis.executor.BaseExecutor.queryFromDatabase(BaseExecutor.java:336) ~[mybatis-3.5.15.jar:3.5.15] + at org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:158) ~[mybatis-3.5.15.jar:3.5.15] + at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:110) ~[mybatis-3.5.15.jar:3.5.15] + at com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor.intercept(MybatisPlusInterceptor.java:81) ~[mybatis-plus-extension-3.5.5.jar:3.5.5] + at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:59) ~[mybatis-3.5.15.jar:3.5.15] + at jdk.proxy2/jdk.proxy2.$Proxy106.query(Unknown Source) ~[na:na] + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:154) ~[mybatis-3.5.15.jar:3.5.15] + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:147) ~[mybatis-3.5.15.jar:3.5.15] + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:142) ~[mybatis-3.5.15.jar:3.5.15] + at org.apache.ibatis.session.defaults.DefaultSqlSession.selectOne(DefaultSqlSession.java:75) ~[mybatis-3.5.15.jar:3.5.15] + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na] + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[na:na] + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na] + at java.base/java.lang.reflect.Method.invoke(Method.java:569) ~[na:na] + at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:425) ~[mybatis-spring-2.1.2.jar:2.1.2] + at jdk.proxy2/jdk.proxy2.$Proxy71.selectOne(Unknown Source) ~[na:na] + at org.mybatis.spring.SqlSessionTemplate.selectOne(SqlSessionTemplate.java:160) ~[mybatis-spring-2.1.2.jar:2.1.2] + at com.baomidou.mybatisplus.core.override.MybatisMapperMethod.execute(MybatisMapperMethod.java:87) ~[mybatis-plus-core-3.5.5.jar:3.5.5] + at com.baomidou.mybatisplus.core.override.MybatisMapperProxy$PlainMethodInvoker.invoke(MybatisMapperProxy.java:152) ~[mybatis-plus-core-3.5.5.jar:3.5.5] + at com.baomidou.mybatisplus.core.override.MybatisMapperProxy.invoke(MybatisMapperProxy.java:89) ~[mybatis-plus-core-3.5.5.jar:3.5.5] + at jdk.proxy2/jdk.proxy2.$Proxy78.selectCount(Unknown Source) ~[na:na] + at com.baomidou.mybatisplus.extension.service.IService.count(IService.java:397) ~[mybatis-plus-extension-3.5.5.jar:3.5.5] + at com.baomidou.mybatisplus.extension.service.IService$$FastClassBySpringCGLIB$$f8525d18.invoke() ~[mybatis-plus-extension-3.5.5.jar:3.5.5] + at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218) ~[spring-core-5.3.31.jar:5.3.31] + at org.springframework.aop.framework.CglibAopProxy.invokeMethod(CglibAopProxy.java:386) ~[spring-aop-5.3.31.jar:5.3.31] + at org.springframework.aop.framework.CglibAopProxy.access$000(CglibAopProxy.java:85) ~[spring-aop-5.3.31.jar:5.3.31] + at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:703) ~[spring-aop-5.3.31.jar:5.3.31] + at com.gpf.pethospital.service.impl.UserServiceImpl$$EnhancerBySpringCGLIB$$4a59e45d.count() ~[classes/:na] + at com.gpf.pethospital.controller.AuthController.register(AuthController.java:45) ~[classes/:na] + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na] + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[na:na] + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na] + at java.base/java.lang.reflect.Method.invoke(Method.java:569) ~[na:na] + at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:205) ~[spring-web-5.3.31.jar:5.3.31] + at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:150) ~[spring-web-5.3.31.jar:5.3.31] + at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:117) ~[spring-webmvc-5.3.31.jar:5.3.31] + at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:895) ~[spring-webmvc-5.3.31.jar:5.3.31] + at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808) ~[spring-webmvc-5.3.31.jar:5.3.31] + at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) ~[spring-webmvc-5.3.31.jar:5.3.31] + at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1072) ~[spring-webmvc-5.3.31.jar:5.3.31] + at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:965) ~[spring-webmvc-5.3.31.jar:5.3.31] + at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) ~[spring-webmvc-5.3.31.jar:5.3.31] + at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:909) ~[spring-webmvc-5.3.31.jar:5.3.31] + at javax.servlet.http.HttpServlet.service(HttpServlet.java:555) ~[tomcat-embed-core-9.0.83.jar:4.0.FR] + at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) ~[spring-webmvc-5.3.31.jar:5.3.31] + at javax.servlet.http.HttpServlet.service(HttpServlet.java:623) ~[tomcat-embed-core-9.0.83.jar:4.0.FR] + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:209) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51) ~[tomcat-embed-websocket-9.0.83.jar:9.0.83] + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:337) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.access.intercept.AuthorizationFilter.doFilter(AuthorizationFilter.java:96) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:346) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:122) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:116) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:346) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:126) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:81) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:346) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:109) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:346) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:149) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:346) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:63) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:346) ~[spring-security-web-5.7.11.jar:5.7.11] + at com.gpf.pethospital.security.JwtAuthenticationFilter.doFilterInternal(JwtAuthenticationFilter.java:45) ~[classes/:na] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) ~[spring-web-5.3.31.jar:5.3.31] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:346) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:103) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:89) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:346) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.header.HeaderWriterFilter.doHeadersAfter(HeaderWriterFilter.java:90) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:75) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) ~[spring-web-5.3.31.jar:5.3.31] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:346) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:112) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:82) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:346) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:55) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) ~[spring-web-5.3.31.jar:5.3.31] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:346) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.session.DisableEncodeUrlFilter.doFilterInternal(DisableEncodeUrlFilter.java:42) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) ~[spring-web-5.3.31.jar:5.3.31] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:346) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:221) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:186) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:354) ~[spring-web-5.3.31.jar:5.3.31] + at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:267) ~[spring-web-5.3.31.jar:5.3.31] + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) ~[spring-web-5.3.31.jar:5.3.31] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) ~[spring-web-5.3.31.jar:5.3.31] + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) ~[spring-web-5.3.31.jar:5.3.31] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) ~[spring-web-5.3.31.jar:5.3.31] + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) ~[spring-web-5.3.31.jar:5.3.31] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) ~[spring-web-5.3.31.jar:5.3.31] + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:168) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:481) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:130) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:342) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:390) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:928) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1794) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at java.base/java.lang.Thread.run(Thread.java:840) ~[na:na] + +2026-01-29 12:08:51.001 INFO 5891 --- [ionShutdownHook] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown initiated... +2026-01-29 12:08:51.003 INFO 5891 --- [ionShutdownHook] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown completed. +[INFO] ------------------------------------------------------------------------ +[INFO] BUILD FAILURE +[INFO] ------------------------------------------------------------------------ +[INFO] Total time: 01:16 min +[INFO] Finished at: 2026-01-29T12:08:51+08:00 +[INFO] ------------------------------------------------------------------------ +[ERROR] Failed to execute goal org.springframework.boot:spring-boot-maven-plugin:2.7.18:run (default-cli) on project pet-hospital: Application finished with exit code: 143 -> [Help 1] +[ERROR] +[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch. +[ERROR] Re-run Maven using the -X switch to enable full debug logging. +[ERROR] +[ERROR] For more information about the errors and possible solutions, please read the following articles: +[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoExecutionException diff --git a/backend/backend_test_tables.log b/backend/backend_test_tables.log new file mode 100644 index 0000000..7cea338 --- /dev/null +++ b/backend/backend_test_tables.log @@ -0,0 +1,218 @@ +[INFO] Scanning for projects... +[INFO] +[INFO] ------------------------< com.gpf:pet-hospital >------------------------ +[INFO] Building 爱维宠物医院管理平台 1.0.0 +[INFO] --------------------------------[ jar ]--------------------------------- +[INFO] +[INFO] >>> spring-boot-maven-plugin:2.7.18:run (default-cli) > test-compile @ pet-hospital >>> +[INFO] +[INFO] --- maven-resources-plugin:3.2.0:resources (default-resources) @ pet-hospital --- +[INFO] Using 'UTF-8' encoding to copy filtered resources. +[INFO] Using 'UTF-8' encoding to copy filtered properties files. +[INFO] Copying 2 resources +[INFO] Copying 1 resource +[INFO] +[INFO] --- maven-compiler-plugin:3.10.1:compile (default-compile) @ pet-hospital --- +[INFO] Nothing to compile - all classes are up to date +[INFO] +[INFO] --- maven-resources-plugin:3.2.0:testResources (default-testResources) @ pet-hospital --- +[INFO] Using 'UTF-8' encoding to copy filtered resources. +[INFO] Using 'UTF-8' encoding to copy filtered properties files. +[INFO] skip non existing resourceDirectory /mnt/d/bs/gpf_pet_hospital/backend/src/test/resources +[INFO] +[INFO] --- maven-compiler-plugin:3.10.1:testCompile (default-testCompile) @ pet-hospital --- +[INFO] No sources to compile +[INFO] +[INFO] <<< spring-boot-maven-plugin:2.7.18:run (default-cli) < test-compile @ pet-hospital <<< +[INFO] +[INFO] +[INFO] --- spring-boot-maven-plugin:2.7.18:run (default-cli) @ pet-hospital --- +[INFO] Attaching agents: [] + + . ____ _ __ _ _ + /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \ +( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \ + \\/ ___)| |_)| | | | | || (_| | ) ) ) ) + ' |____| .__|_| |_|_| |_\__, | / / / / + =========|_|==============|___/=/_/_/_/ + :: Spring Boot :: (v2.7.18) + +2026-01-29 12:10:45.802 INFO 6379 --- [ main] c.g.pethospital.PetHospitalApplication : Starting PetHospitalApplication using Java 17.0.17 on LAPTOP-FS8K5GSO with PID 6379 (/mnt/d/bs/gpf_pet_hospital/backend/target/classes started by wangzq in /mnt/d/bs/gpf_pet_hospital/backend) +2026-01-29 12:10:45.807 INFO 6379 --- [ main] c.g.pethospital.PetHospitalApplication : The following 1 profile is active: "dev" +2026-01-29 12:10:51.211 INFO 6379 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8081 (http) +2026-01-29 12:10:51.236 INFO 6379 --- [ main] o.apache.catalina.core.StandardService : Starting service [Tomcat] +2026-01-29 12:10:51.236 INFO 6379 --- [ main] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.83] +2026-01-29 12:10:51.393 INFO 6379 --- [ main] o.a.c.c.C.[Tomcat].[localhost].[/api] : Initializing Spring embedded WebApplicationContext +2026-01-29 12:10:51.394 INFO 6379 --- [ main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 5501 ms +2026-01-29 12:10:51.447 INFO 6379 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting... +2026-01-29 12:10:52.275 INFO 6379 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed. +2026-01-29 12:10:52.301 INFO 6379 --- [ main] o.s.b.a.h2.H2ConsoleAutoConfiguration : H2 console available at '/h2-console'. Database available at 'jdbc:h2:mem:testdb' +Logging initialized using 'class org.apache.ibatis.logging.stdout.StdOutImpl' adapter. +Initialization Sequence datacenterId:1 workerId:16 + _ _ |_ _ _|_. ___ _ | _ +| | |\/|_)(_| | |_\ |_)||_|_\ + / | + 3.5.5 +2026-01-29 12:10:54.594 WARN 6379 --- [ main] .s.s.UserDetailsServiceAutoConfiguration : + +Using generated security password: 65907ba7-9111-4082-a03f-e9415af71a0f + +This generated password is for development use only. Your security configuration must be updated before running your application in production. + +2026-01-29 12:10:54.914 INFO 6379 --- [ main] o.s.s.web.DefaultSecurityFilterChain : Will secure any request with [org.springframework.security.web.session.DisableEncodeUrlFilter@26be9a6, org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter@4d518c66, org.springframework.security.web.context.SecurityContextPersistenceFilter@5a4dda2, org.springframework.security.web.header.HeaderWriterFilter@6df4af5, org.springframework.security.web.authentication.logout.LogoutFilter@582e9152, com.gpf.pethospital.security.JwtAuthenticationFilter@411fa0ce, org.springframework.security.web.savedrequest.RequestCacheAwareFilter@34045582, org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter@1edccfd4, org.springframework.security.web.authentication.AnonymousAuthenticationFilter@251d7fdd, org.springframework.security.web.session.SessionManagementFilter@250d440, org.springframework.security.web.access.ExceptionTranslationFilter@4966bab1, org.springframework.security.web.access.intercept.AuthorizationFilter@60b5e80d] +2026-01-29 12:10:56.356 INFO 6379 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8081 (http) with context path '/api' +2026-01-29 12:10:56.372 INFO 6379 --- [ main] c.g.pethospital.PetHospitalApplication : Started PetHospitalApplication in 11.887 seconds (JVM running for 12.549) +2026-01-29 12:11:04.613 INFO 6379 --- [nio-8081-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/api] : Initializing Spring DispatcherServlet 'dispatcherServlet' +2026-01-29 12:11:04.614 INFO 6379 --- [nio-8081-exec-1] o.s.web.servlet.DispatcherServlet : Initializing Servlet 'dispatcherServlet' +2026-01-29 12:11:04.616 INFO 6379 --- [nio-8081-exec-1] o.s.web.servlet.DispatcherServlet : Completed initialization in 1 ms +Creating a new SqlSession +SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@4643f176] was not registered for synchronization because synchronization is not active +JDBC Connection [HikariProxyConnection@1864698444 wrapping conn0: url=jdbc:h2:mem:testdb user=SA] will not be managed by Spring +==> Preparing: SELECT COUNT( * ) AS total FROM `user` WHERE deleted=0 AND (username = ? OR phone = ? OR email = ?) +==> Parameters: admin(String), 13800138000(String), admin@example.com(String) +<== Columns: TOTAL +<== Row: 0 +<== Total: 1 +Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@4643f176] +Creating a new SqlSession +SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@3ec2f335] was not registered for synchronization because synchronization is not active +JDBC Connection [HikariProxyConnection@1531731496 wrapping conn0: url=jdbc:h2:mem:testdb user=SA] will not be managed by Spring +==> Preparing: INSERT INTO `user` ( username, phone, email, password, role, status, create_time, update_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ? ) +==> Parameters: admin(String), 13800138000(String), admin@example.com(String), $2a$10$u68s2dGuJN0ETaIThD74HeDNq9hkdpKQ2aNxQjPW7jTG8/yr.ZId.(String), CUSTOMER(String), 1(Integer), 2026-01-29T12:11:05.481399469(LocalDateTime), 2026-01-29T12:11:05.481399469(LocalDateTime) +<== Updates: 1 +Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@3ec2f335] +Creating a new SqlSession +SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@d12e787] was not registered for synchronization because synchronization is not active +JDBC Connection [HikariProxyConnection@1057347592 wrapping conn0: url=jdbc:h2:mem:testdb user=SA] will not be managed by Spring +==> Preparing: SELECT id,username,phone,email,password,role,status,avatar,create_time,update_time,deleted FROM `user` WHERE deleted=0 AND (username = ? OR phone = ? OR email = ?) +==> Parameters: admin(String), admin(String), admin(String) +<== Columns: ID, USERNAME, PHONE, EMAIL, PASSWORD, ROLE, STATUS, AVATAR, CREATE_TIME, UPDATE_TIME, DELETED +<== Row: 1, admin, 13800138000, admin@example.com, $2a$10$u68s2dGuJN0ETaIThD74HeDNq9hkdpKQ2aNxQjPW7jTG8/yr.ZId., CUSTOMER, 1, null, 2026-01-29 12:11:05.481399, 2026-01-29 12:11:05.481399, 0 +<== Total: 1 +Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@d12e787] +2026-01-29 12:11:08.292 ERROR 6379 --- [nio-8081-exec-2] o.a.c.c.C.[.[.[.[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [/api] threw exception [Request processing failed; nested exception is io.jsonwebtoken.io.DecodingException: Illegal base64 character: '-'] with root cause + +io.jsonwebtoken.io.DecodingException: Illegal base64 character: '-' + at io.jsonwebtoken.io.Base64.ctoi(Base64.java:221) ~[jjwt-api-0.11.5.jar:0.11.5] + at io.jsonwebtoken.io.Base64.decodeFast(Base64.java:270) ~[jjwt-api-0.11.5.jar:0.11.5] + at io.jsonwebtoken.io.Base64Decoder.decode(Base64Decoder.java:36) ~[jjwt-api-0.11.5.jar:0.11.5] + at io.jsonwebtoken.io.Base64Decoder.decode(Base64Decoder.java:23) ~[jjwt-api-0.11.5.jar:0.11.5] + at io.jsonwebtoken.io.ExceptionPropagatingDecoder.decode(ExceptionPropagatingDecoder.java:36) ~[jjwt-api-0.11.5.jar:0.11.5] + at io.jsonwebtoken.impl.DefaultJwtBuilder.signWith(DefaultJwtBuilder.java:132) ~[jjwt-impl-0.11.5.jar:0.11.5] + at com.gpf.pethospital.util.JwtUtil.generateToken(JwtUtil.java:31) ~[classes/:na] + at com.gpf.pethospital.controller.AuthController.login(AuthController.java:74) ~[classes/:na] + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na] + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[na:na] + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na] + at java.base/java.lang.reflect.Method.invoke(Method.java:569) ~[na:na] + at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:205) ~[spring-web-5.3.31.jar:5.3.31] + at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:150) ~[spring-web-5.3.31.jar:5.3.31] + at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:117) ~[spring-webmvc-5.3.31.jar:5.3.31] + at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:895) ~[spring-webmvc-5.3.31.jar:5.3.31] + at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808) ~[spring-webmvc-5.3.31.jar:5.3.31] + at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) ~[spring-webmvc-5.3.31.jar:5.3.31] + at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1072) ~[spring-webmvc-5.3.31.jar:5.3.31] + at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:965) ~[spring-webmvc-5.3.31.jar:5.3.31] + at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) ~[spring-webmvc-5.3.31.jar:5.3.31] + at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:909) ~[spring-webmvc-5.3.31.jar:5.3.31] + at javax.servlet.http.HttpServlet.service(HttpServlet.java:555) ~[tomcat-embed-core-9.0.83.jar:4.0.FR] + at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) ~[spring-webmvc-5.3.31.jar:5.3.31] + at javax.servlet.http.HttpServlet.service(HttpServlet.java:623) ~[tomcat-embed-core-9.0.83.jar:4.0.FR] + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:209) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51) ~[tomcat-embed-websocket-9.0.83.jar:9.0.83] + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:337) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.access.intercept.AuthorizationFilter.doFilter(AuthorizationFilter.java:96) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:346) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:122) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:116) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:346) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:126) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:81) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:346) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:109) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:346) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:149) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:346) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:63) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:346) ~[spring-security-web-5.7.11.jar:5.7.11] + at com.gpf.pethospital.security.JwtAuthenticationFilter.doFilterInternal(JwtAuthenticationFilter.java:45) ~[classes/:na] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) ~[spring-web-5.3.31.jar:5.3.31] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:346) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:103) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:89) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:346) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.header.HeaderWriterFilter.doHeadersAfter(HeaderWriterFilter.java:90) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:75) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) ~[spring-web-5.3.31.jar:5.3.31] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:346) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:112) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:82) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:346) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:55) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) ~[spring-web-5.3.31.jar:5.3.31] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:346) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.session.DisableEncodeUrlFilter.doFilterInternal(DisableEncodeUrlFilter.java:42) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) ~[spring-web-5.3.31.jar:5.3.31] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:346) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:221) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:186) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:354) ~[spring-web-5.3.31.jar:5.3.31] + at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:267) ~[spring-web-5.3.31.jar:5.3.31] + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) ~[spring-web-5.3.31.jar:5.3.31] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) ~[spring-web-5.3.31.jar:5.3.31] + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) ~[spring-web-5.3.31.jar:5.3.31] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) ~[spring-web-5.3.31.jar:5.3.31] + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) ~[spring-web-5.3.31.jar:5.3.31] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) ~[spring-web-5.3.31.jar:5.3.31] + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:168) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:481) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:130) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:342) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:390) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:928) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1794) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at java.base/java.lang.Thread.run(Thread.java:840) ~[na:na] + +Creating a new SqlSession +SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@9b849ba] was not registered for synchronization because synchronization is not active +JDBC Connection [HikariProxyConnection@125810429 wrapping conn0: url=jdbc:h2:mem:testdb user=SA] will not be managed by Spring +==> Preparing: SELECT COUNT( * ) AS total FROM `user` WHERE deleted=0 AND (username = ? OR phone = ? OR email = ?) +==> Parameters: admin(String), 13800138000(String), admin@example.com(String) +<== Columns: TOTAL +<== Row: 1 +<== Total: 1 +Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@9b849ba] +2026-01-29 12:11:28.228 INFO 6379 --- [ionShutdownHook] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown initiated... +2026-01-29 12:11:28.231 INFO 6379 --- [ionShutdownHook] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown completed. +[INFO] ------------------------------------------------------------------------ +[INFO] BUILD FAILURE +[INFO] ------------------------------------------------------------------------ +[INFO] Total time: 51.530 s +[INFO] Finished at: 2026-01-29T12:11:28+08:00 +[INFO] ------------------------------------------------------------------------ +[ERROR] Failed to execute goal org.springframework.boot:spring-boot-maven-plugin:2.7.18:run (default-cli) on project pet-hospital: Application finished with exit code: 143 -> [Help 1] +[ERROR] +[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch. +[ERROR] Re-run Maven using the -X switch to enable full debug logging. +[ERROR] +[ERROR] For more information about the errors and possible solutions, please read the following articles: +[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoExecutionException diff --git a/backend/backend_with_correct_schema.log b/backend/backend_with_correct_schema.log new file mode 100644 index 0000000..ab4cb13 --- /dev/null +++ b/backend/backend_with_correct_schema.log @@ -0,0 +1,489 @@ +[INFO] Scanning for projects... +[INFO] +[INFO] ------------------------< com.gpf:pet-hospital >------------------------ +[INFO] Building 爱维宠物医院管理平台 1.0.0 +[INFO] --------------------------------[ jar ]--------------------------------- +[INFO] +[INFO] >>> spring-boot-maven-plugin:2.7.18:run (default-cli) > test-compile @ pet-hospital >>> +[INFO] +[INFO] --- maven-resources-plugin:3.2.0:resources (default-resources) @ pet-hospital --- +[INFO] Using 'UTF-8' encoding to copy filtered resources. +[INFO] Using 'UTF-8' encoding to copy filtered properties files. +[INFO] Copying 2 resources +[INFO] Copying 3 resources +[INFO] +[INFO] --- maven-compiler-plugin:3.10.1:compile (default-compile) @ pet-hospital --- +[INFO] Nothing to compile - all classes are up to date +[INFO] +[INFO] --- maven-resources-plugin:3.2.0:testResources (default-testResources) @ pet-hospital --- +[INFO] Using 'UTF-8' encoding to copy filtered resources. +[INFO] Using 'UTF-8' encoding to copy filtered properties files. +[INFO] skip non existing resourceDirectory /mnt/d/bs/gpf_pet_hospital/backend/src/test/resources +[INFO] +[INFO] --- maven-compiler-plugin:3.10.1:testCompile (default-testCompile) @ pet-hospital --- +[INFO] No sources to compile +[INFO] +[INFO] <<< spring-boot-maven-plugin:2.7.18:run (default-cli) < test-compile @ pet-hospital <<< +[INFO] +[INFO] +[INFO] --- spring-boot-maven-plugin:2.7.18:run (default-cli) @ pet-hospital --- +[INFO] Attaching agents: [] + + . ____ _ __ _ _ + /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \ +( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \ + \\/ ___)| |_)| | | | | || (_| | ) ) ) ) + ' |____| .__|_| |_|_| |_\__, | / / / / + =========|_|==============|___/=/_/_/_/ + :: Spring Boot :: (v2.7.18) + +2026-01-29 12:19:06.333 INFO 7141 --- [ main] c.g.pethospital.PetHospitalApplication : Starting PetHospitalApplication using Java 17.0.17 on LAPTOP-FS8K5GSO with PID 7141 (/mnt/d/bs/gpf_pet_hospital/backend/target/classes started by wangzq in /mnt/d/bs/gpf_pet_hospital/backend) +2026-01-29 12:19:06.337 INFO 7141 --- [ main] c.g.pethospital.PetHospitalApplication : The following 1 profile is active: "dev" +2026-01-29 12:19:11.871 INFO 7141 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8081 (http) +2026-01-29 12:19:11.896 INFO 7141 --- [ main] o.apache.catalina.core.StandardService : Starting service [Tomcat] +2026-01-29 12:19:11.896 INFO 7141 --- [ main] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.83] +2026-01-29 12:19:12.057 INFO 7141 --- [ main] o.a.c.c.C.[Tomcat].[localhost].[/api] : Initializing Spring embedded WebApplicationContext +2026-01-29 12:19:12.058 INFO 7141 --- [ main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 5645 ms +2026-01-29 12:19:12.111 INFO 7141 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting... +2026-01-29 12:19:12.854 INFO 7141 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed. +2026-01-29 12:19:12.876 INFO 7141 --- [ main] o.s.b.a.h2.H2ConsoleAutoConfiguration : H2 console available at '/h2-console'. Database available at 'jdbc:h2:mem:testdb' +Logging initialized using 'class org.apache.ibatis.logging.stdout.StdOutImpl' adapter. +Initialization Sequence datacenterId:1 workerId:8 + _ _ |_ _ _|_. ___ _ | _ +| | |\/|_)(_| | |_\ |_)||_|_\ + / | + 3.5.5 +2026-01-29 12:19:15.314 WARN 7141 --- [ main] .s.s.UserDetailsServiceAutoConfiguration : + +Using generated security password: 77b1aeeb-4e18-4223-9721-ff793ec89ea1 + +This generated password is for development use only. Your security configuration must be updated before running your application in production. + +2026-01-29 12:19:15.635 INFO 7141 --- [ main] o.s.s.web.DefaultSecurityFilterChain : Will secure any request with [org.springframework.security.web.session.DisableEncodeUrlFilter@240f350a, org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter@706f6d26, org.springframework.security.web.context.SecurityContextPersistenceFilter@6a1568d6, org.springframework.security.web.header.HeaderWriterFilter@40df6090, org.springframework.security.web.authentication.logout.LogoutFilter@6b27b2d0, com.gpf.pethospital.security.JwtAuthenticationFilter@3af2f846, org.springframework.security.web.savedrequest.RequestCacheAwareFilter@1b37fbec, org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter@bb3ecfe, org.springframework.security.web.authentication.AnonymousAuthenticationFilter@6af65f29, org.springframework.security.web.session.SessionManagementFilter@291a4791, org.springframework.security.web.access.ExceptionTranslationFilter@11a3a45f, org.springframework.security.web.access.intercept.AuthorizationFilter@62b6c045] +2026-01-29 12:19:16.997 INFO 7141 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8081 (http) with context path '/api' +2026-01-29 12:19:17.013 INFO 7141 --- [ main] c.g.pethospital.PetHospitalApplication : Started PetHospitalApplication in 12.033 seconds (JVM running for 12.689) +2026-01-29 12:19:22.832 INFO 7141 --- [nio-8081-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/api] : Initializing Spring DispatcherServlet 'dispatcherServlet' +2026-01-29 12:19:22.832 INFO 7141 --- [nio-8081-exec-1] o.s.web.servlet.DispatcherServlet : Initializing Servlet 'dispatcherServlet' +2026-01-29 12:19:22.833 INFO 7141 --- [nio-8081-exec-1] o.s.web.servlet.DispatcherServlet : Completed initialization in 0 ms +Creating a new SqlSession +SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@31b23466] was not registered for synchronization because synchronization is not active +JDBC Connection [HikariProxyConnection@155985460 wrapping conn0: url=jdbc:h2:mem:testdb user=SA] will not be managed by Spring +==> Preparing: SELECT id,username,phone,email,password,role,status,avatar,create_time,update_time,deleted FROM `user` WHERE deleted=0 AND (username = ? OR phone = ? OR email = ?) +==> Parameters: customer(String), customer(String), customer(String) +<== Columns: ID, USERNAME, PHONE, EMAIL, PASSWORD, ROLE, STATUS, AVATAR, CREATE_TIME, UPDATE_TIME, DELETED +<== Row: 3, customer, 13900139000, customer@example.com, $2a$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi, CUSTOMER, 1, null, 2026-01-29 12:19:13.654131, 2026-01-29 12:19:13.654131, 0 +<== Total: 1 +Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@31b23466] +Creating a new SqlSession +SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@1562f046] was not registered for synchronization because synchronization is not active +JDBC Connection [HikariProxyConnection@495463010 wrapping conn0: url=jdbc:h2:mem:testdb user=SA] will not be managed by Spring +==> Preparing: INSERT INTO appointment ( customer_id, pet_id, appointment_date, time_slot, status, remark, create_time, update_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ? ) +==> Parameters: 3(Long), 1(Long), 2026-02-01(LocalDate), 09:00-10:00(String), PENDING(String), 常规检查(String), 2026-01-29T12:19:31.025850900(LocalDateTime), 2026-01-29T12:19:31.025850900(LocalDateTime) +<== Updates: 1 +Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@1562f046] +Creating a new SqlSession +SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@7e0b09b] was not registered for synchronization because synchronization is not active +JDBC Connection [HikariProxyConnection@153570839 wrapping conn0: url=jdbc:h2:mem:testdb user=SA] will not be managed by Spring +==> Preparing: SELECT id,username,phone,email,password,role,status,avatar,create_time,update_time,deleted FROM `user` WHERE deleted=0 AND (username = ? OR phone = ? OR email = ?) +==> Parameters: admin(String), admin(String), admin(String) +<== Columns: ID, USERNAME, PHONE, EMAIL, PASSWORD, ROLE, STATUS, AVATAR, CREATE_TIME, UPDATE_TIME, DELETED +<== Row: 1, admin, 13800138000, admin@example.com, $2a$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi, ADMIN, 1, null, 2026-01-29 12:19:13.645158, 2026-01-29 12:19:13.645158, 0 +<== Total: 1 +Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@7e0b09b] +Creating a new SqlSession +SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@14fac782] was not registered for synchronization because synchronization is not active +JDBC Connection [HikariProxyConnection@2084292749 wrapping conn0: url=jdbc:h2:mem:testdb user=SA] will not be managed by Spring +==> Preparing: INSERT INTO prescription ( visit_id, doctor_id, status, create_time, update_time ) VALUES ( ?, ?, ?, ?, ? ) +==> Parameters: 1(Long), 1(Long), DRAFT(String), 2026-01-29T12:19:48.104064819(LocalDateTime), 2026-01-29T12:19:48.104064819(LocalDateTime) +Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@14fac782] +2026-01-29 12:19:48.218 ERROR 7141 --- [nio-8081-exec-9] o.a.c.c.C.[.[.[.[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [/api] threw exception [Request processing failed; nested exception is org.springframework.dao.DataIntegrityViolationException: +### Error updating database. Cause: org.h2.jdbc.JdbcSQLIntegrityConstraintViolationException: NULL not allowed for column "CUSTOMER_ID"; SQL statement: +INSERT INTO prescription ( visit_id, doctor_id, status, create_time, update_time ) VALUES ( ?, ?, ?, ?, ? ) [23502-214] +### The error may exist in com/gpf/pethospital/mapper/PrescriptionMapper.java (best guess) +### The error may involve com.gpf.pethospital.mapper.PrescriptionMapper.insert-Inline +### The error occurred while setting parameters +### SQL: INSERT INTO prescription ( visit_id, doctor_id, status, create_time, update_time ) VALUES ( ?, ?, ?, ?, ? ) +### Cause: org.h2.jdbc.JdbcSQLIntegrityConstraintViolationException: NULL not allowed for column "CUSTOMER_ID"; SQL statement: +INSERT INTO prescription ( visit_id, doctor_id, status, create_time, update_time ) VALUES ( ?, ?, ?, ?, ? ) [23502-214] +; NULL not allowed for column "CUSTOMER_ID"; SQL statement: +INSERT INTO prescription ( visit_id, doctor_id, status, create_time, update_time ) VALUES ( ?, ?, ?, ?, ? ) [23502-214]; nested exception is org.h2.jdbc.JdbcSQLIntegrityConstraintViolationException: NULL not allowed for column "CUSTOMER_ID"; SQL statement: +INSERT INTO prescription ( visit_id, doctor_id, status, create_time, update_time ) VALUES ( ?, ?, ?, ?, ? ) [23502-214]] with root cause + +org.h2.jdbc.JdbcSQLIntegrityConstraintViolationException: NULL not allowed for column "CUSTOMER_ID"; SQL statement: +INSERT INTO prescription ( visit_id, doctor_id, status, create_time, update_time ) VALUES ( ?, ?, ?, ?, ? ) [23502-214] + at org.h2.message.DbException.getJdbcSQLException(DbException.java:508) ~[h2-2.1.214.jar:2.1.214] + at org.h2.message.DbException.getJdbcSQLException(DbException.java:477) ~[h2-2.1.214.jar:2.1.214] + at org.h2.message.DbException.get(DbException.java:223) ~[h2-2.1.214.jar:2.1.214] + at org.h2.message.DbException.get(DbException.java:199) ~[h2-2.1.214.jar:2.1.214] + at org.h2.table.Column.validateConvertUpdateSequence(Column.java:365) ~[h2-2.1.214.jar:2.1.214] + at org.h2.table.Table.convertInsertRow(Table.java:926) ~[h2-2.1.214.jar:2.1.214] + at org.h2.command.dml.Insert.insertRows(Insert.java:167) ~[h2-2.1.214.jar:2.1.214] + at org.h2.command.dml.Insert.update(Insert.java:135) ~[h2-2.1.214.jar:2.1.214] + at org.h2.command.CommandContainer.executeUpdateWithGeneratedKeys(CommandContainer.java:242) ~[h2-2.1.214.jar:2.1.214] + at org.h2.command.CommandContainer.update(CommandContainer.java:163) ~[h2-2.1.214.jar:2.1.214] + at org.h2.command.Command.executeUpdate(Command.java:252) ~[h2-2.1.214.jar:2.1.214] + at org.h2.jdbc.JdbcPreparedStatement.execute(JdbcPreparedStatement.java:254) ~[h2-2.1.214.jar:2.1.214] + at com.zaxxer.hikari.pool.ProxyPreparedStatement.execute(ProxyPreparedStatement.java:44) ~[HikariCP-4.0.3.jar:na] + at com.zaxxer.hikari.pool.HikariProxyPreparedStatement.execute(HikariProxyPreparedStatement.java) ~[HikariCP-4.0.3.jar:na] + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na] + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[na:na] + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na] + at java.base/java.lang.reflect.Method.invoke(Method.java:569) ~[na:na] + at org.apache.ibatis.logging.jdbc.PreparedStatementLogger.invoke(PreparedStatementLogger.java:58) ~[mybatis-3.5.15.jar:3.5.15] + at jdk.proxy3/jdk.proxy3.$Proxy107.execute(Unknown Source) ~[na:na] + at org.apache.ibatis.executor.statement.PreparedStatementHandler.update(PreparedStatementHandler.java:48) ~[mybatis-3.5.15.jar:3.5.15] + at org.apache.ibatis.executor.statement.RoutingStatementHandler.update(RoutingStatementHandler.java:75) ~[mybatis-3.5.15.jar:3.5.15] + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na] + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[na:na] + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na] + at java.base/java.lang.reflect.Method.invoke(Method.java:569) ~[na:na] + at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:61) ~[mybatis-3.5.15.jar:3.5.15] + at jdk.proxy2/jdk.proxy2.$Proxy106.update(Unknown Source) ~[na:na] + at org.apache.ibatis.executor.SimpleExecutor.doUpdate(SimpleExecutor.java:50) ~[mybatis-3.5.15.jar:3.5.15] + at org.apache.ibatis.executor.BaseExecutor.update(BaseExecutor.java:117) ~[mybatis-3.5.15.jar:3.5.15] + at org.apache.ibatis.executor.CachingExecutor.update(CachingExecutor.java:76) ~[mybatis-3.5.15.jar:3.5.15] + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na] + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[na:na] + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na] + at java.base/java.lang.reflect.Method.invoke(Method.java:569) ~[na:na] + at org.apache.ibatis.plugin.Invocation.proceed(Invocation.java:49) ~[mybatis-3.5.15.jar:3.5.15] + at com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor.intercept(MybatisPlusInterceptor.java:106) ~[mybatis-plus-extension-3.5.5.jar:3.5.5] + at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:59) ~[mybatis-3.5.15.jar:3.5.15] + at jdk.proxy2/jdk.proxy2.$Proxy105.update(Unknown Source) ~[na:na] + at org.apache.ibatis.session.defaults.DefaultSqlSession.update(DefaultSqlSession.java:197) ~[mybatis-3.5.15.jar:3.5.15] + at org.apache.ibatis.session.defaults.DefaultSqlSession.insert(DefaultSqlSession.java:184) ~[mybatis-3.5.15.jar:3.5.15] + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na] + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[na:na] + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na] + at java.base/java.lang.reflect.Method.invoke(Method.java:569) ~[na:na] + at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:425) ~[mybatis-spring-2.1.2.jar:2.1.2] + at jdk.proxy2/jdk.proxy2.$Proxy71.insert(Unknown Source) ~[na:na] + at org.mybatis.spring.SqlSessionTemplate.insert(SqlSessionTemplate.java:272) ~[mybatis-spring-2.1.2.jar:2.1.2] + at com.baomidou.mybatisplus.core.override.MybatisMapperMethod.execute(MybatisMapperMethod.java:59) ~[mybatis-plus-core-3.5.5.jar:3.5.5] + at com.baomidou.mybatisplus.core.override.MybatisMapperProxy$PlainMethodInvoker.invoke(MybatisMapperProxy.java:152) ~[mybatis-plus-core-3.5.5.jar:3.5.5] + at com.baomidou.mybatisplus.core.override.MybatisMapperProxy.invoke(MybatisMapperProxy.java:89) ~[mybatis-plus-core-3.5.5.jar:3.5.5] + at jdk.proxy2/jdk.proxy2.$Proxy86.insert(Unknown Source) ~[na:na] + at com.baomidou.mybatisplus.extension.service.IService.save(IService.java:60) ~[mybatis-plus-extension-3.5.5.jar:3.5.5] + at com.baomidou.mybatisplus.extension.service.IService$$FastClassBySpringCGLIB$$f8525d18.invoke() ~[mybatis-plus-extension-3.5.5.jar:3.5.5] + at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218) ~[spring-core-5.3.31.jar:5.3.31] + at org.springframework.aop.framework.CglibAopProxy.invokeMethod(CglibAopProxy.java:386) ~[spring-aop-5.3.31.jar:5.3.31] + at org.springframework.aop.framework.CglibAopProxy.access$000(CglibAopProxy.java:85) ~[spring-aop-5.3.31.jar:5.3.31] + at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:703) ~[spring-aop-5.3.31.jar:5.3.31] + at com.gpf.pethospital.service.impl.PrescriptionServiceImpl$$EnhancerBySpringCGLIB$$834c711.save() ~[classes/:na] + at com.gpf.pethospital.controller.PrescriptionController.create(PrescriptionController.java:28) ~[classes/:na] + at com.gpf.pethospital.controller.PrescriptionController$$FastClassBySpringCGLIB$$6a1d26f5.invoke() ~[classes/:na] + at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218) ~[spring-core-5.3.31.jar:5.3.31] + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:792) ~[spring-aop-5.3.31.jar:5.3.31] + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) ~[spring-aop-5.3.31.jar:5.3.31] + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:762) ~[spring-aop-5.3.31.jar:5.3.31] + at org.springframework.security.authorization.method.AuthorizationManagerBeforeMethodInterceptor.invoke(AuthorizationManagerBeforeMethodInterceptor.java:162) ~[spring-security-core-5.7.11.jar:5.7.11] + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.3.31.jar:5.3.31] + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:762) ~[spring-aop-5.3.31.jar:5.3.31] + at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:707) ~[spring-aop-5.3.31.jar:5.3.31] + at com.gpf.pethospital.controller.PrescriptionController$$EnhancerBySpringCGLIB$$a4312665.create() ~[classes/:na] + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na] + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[na:na] + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na] + at java.base/java.lang.reflect.Method.invoke(Method.java:569) ~[na:na] + at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:205) ~[spring-web-5.3.31.jar:5.3.31] + at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:150) ~[spring-web-5.3.31.jar:5.3.31] + at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:117) ~[spring-webmvc-5.3.31.jar:5.3.31] + at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:895) ~[spring-webmvc-5.3.31.jar:5.3.31] + at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808) ~[spring-webmvc-5.3.31.jar:5.3.31] + at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) ~[spring-webmvc-5.3.31.jar:5.3.31] + at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1072) ~[spring-webmvc-5.3.31.jar:5.3.31] + at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:965) ~[spring-webmvc-5.3.31.jar:5.3.31] + at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) ~[spring-webmvc-5.3.31.jar:5.3.31] + at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:909) ~[spring-webmvc-5.3.31.jar:5.3.31] + at javax.servlet.http.HttpServlet.service(HttpServlet.java:555) ~[tomcat-embed-core-9.0.83.jar:4.0.FR] + at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) ~[spring-webmvc-5.3.31.jar:5.3.31] + at javax.servlet.http.HttpServlet.service(HttpServlet.java:623) ~[tomcat-embed-core-9.0.83.jar:4.0.FR] + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:209) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51) ~[tomcat-embed-websocket-9.0.83.jar:9.0.83] + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:337) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.access.intercept.AuthorizationFilter.doFilter(AuthorizationFilter.java:96) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:346) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:122) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:116) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:346) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:126) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:81) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:346) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:109) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:346) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:149) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:346) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:63) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:346) ~[spring-security-web-5.7.11.jar:5.7.11] + at com.gpf.pethospital.security.JwtAuthenticationFilter.doFilterInternal(JwtAuthenticationFilter.java:45) ~[classes/:na] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) ~[spring-web-5.3.31.jar:5.3.31] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:346) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:103) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:89) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:346) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.header.HeaderWriterFilter.doHeadersAfter(HeaderWriterFilter.java:90) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:75) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) ~[spring-web-5.3.31.jar:5.3.31] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:346) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:112) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:82) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:346) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:55) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) ~[spring-web-5.3.31.jar:5.3.31] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:346) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.session.DisableEncodeUrlFilter.doFilterInternal(DisableEncodeUrlFilter.java:42) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) ~[spring-web-5.3.31.jar:5.3.31] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:346) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:221) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:186) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:354) ~[spring-web-5.3.31.jar:5.3.31] + at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:267) ~[spring-web-5.3.31.jar:5.3.31] + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) ~[spring-web-5.3.31.jar:5.3.31] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) ~[spring-web-5.3.31.jar:5.3.31] + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) ~[spring-web-5.3.31.jar:5.3.31] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) ~[spring-web-5.3.31.jar:5.3.31] + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) ~[spring-web-5.3.31.jar:5.3.31] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) ~[spring-web-5.3.31.jar:5.3.31] + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:168) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:481) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:130) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:342) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:390) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:928) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1794) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at java.base/java.lang.Thread.run(Thread.java:840) ~[na:na] + +Creating a new SqlSession +SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@1402ee31] was not registered for synchronization because synchronization is not active +JDBC Connection [HikariProxyConnection@449123009 wrapping conn0: url=jdbc:h2:mem:testdb user=SA] will not be managed by Spring +==> Preparing: SELECT id,username,phone,email,password,role,status,avatar,create_time,update_time,deleted FROM `user` WHERE deleted=0 AND (username = ? OR phone = ? OR email = ?) +==> Parameters: customer(String), customer(String), customer(String) +<== Columns: ID, USERNAME, PHONE, EMAIL, PASSWORD, ROLE, STATUS, AVATAR, CREATE_TIME, UPDATE_TIME, DELETED +<== Row: 3, customer, 13900139000, customer@example.com, $2a$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi, CUSTOMER, 1, null, 2026-01-29 12:19:13.654131, 2026-01-29 12:19:13.654131, 0 +<== Total: 1 +Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@1402ee31] +Creating a new SqlSession +SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@d3345fe] was not registered for synchronization because synchronization is not active +JDBC Connection [HikariProxyConnection@503378629 wrapping conn0: url=jdbc:h2:mem:testdb user=SA] will not be managed by Spring +==> Preparing: SELECT COUNT(*) AS total FROM prescription WHERE deleted = 0 +==> Parameters: +<== Columns: TOTAL +<== Row: 0 +<== Total: 1 +Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@d3345fe] +Creating a new SqlSession +SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@22dbff1c] was not registered for synchronization because synchronization is not active +JDBC Connection [HikariProxyConnection@543824485 wrapping conn0: url=jdbc:h2:mem:testdb user=SA] will not be managed by Spring +==> Preparing: INSERT INTO prescription ( status, create_time, update_time ) VALUES ( ?, ?, ? ) +==> Parameters: DRAFT(String), 2026-01-29T12:20:41.789304708(LocalDateTime), 2026-01-29T12:20:41.789304708(LocalDateTime) +Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@22dbff1c] +2026-01-29 12:20:41.792 ERROR 7141 --- [nio-8081-exec-4] o.a.c.c.C.[.[.[.[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [/api] threw exception [Request processing failed; nested exception is org.springframework.dao.DataIntegrityViolationException: +### Error updating database. Cause: org.h2.jdbc.JdbcSQLIntegrityConstraintViolationException: NULL not allowed for column "VISIT_ID"; SQL statement: +INSERT INTO prescription ( status, create_time, update_time ) VALUES ( ?, ?, ? ) [23502-214] +### The error may exist in com/gpf/pethospital/mapper/PrescriptionMapper.java (best guess) +### The error may involve com.gpf.pethospital.mapper.PrescriptionMapper.insert-Inline +### The error occurred while setting parameters +### SQL: INSERT INTO prescription ( status, create_time, update_time ) VALUES ( ?, ?, ? ) +### Cause: org.h2.jdbc.JdbcSQLIntegrityConstraintViolationException: NULL not allowed for column "VISIT_ID"; SQL statement: +INSERT INTO prescription ( status, create_time, update_time ) VALUES ( ?, ?, ? ) [23502-214] +; NULL not allowed for column "VISIT_ID"; SQL statement: +INSERT INTO prescription ( status, create_time, update_time ) VALUES ( ?, ?, ? ) [23502-214]; nested exception is org.h2.jdbc.JdbcSQLIntegrityConstraintViolationException: NULL not allowed for column "VISIT_ID"; SQL statement: +INSERT INTO prescription ( status, create_time, update_time ) VALUES ( ?, ?, ? ) [23502-214]] with root cause + +org.h2.jdbc.JdbcSQLIntegrityConstraintViolationException: NULL not allowed for column "VISIT_ID"; SQL statement: +INSERT INTO prescription ( status, create_time, update_time ) VALUES ( ?, ?, ? ) [23502-214] + at org.h2.message.DbException.getJdbcSQLException(DbException.java:508) ~[h2-2.1.214.jar:2.1.214] + at org.h2.message.DbException.getJdbcSQLException(DbException.java:477) ~[h2-2.1.214.jar:2.1.214] + at org.h2.message.DbException.get(DbException.java:223) ~[h2-2.1.214.jar:2.1.214] + at org.h2.message.DbException.get(DbException.java:199) ~[h2-2.1.214.jar:2.1.214] + at org.h2.table.Column.validateConvertUpdateSequence(Column.java:365) ~[h2-2.1.214.jar:2.1.214] + at org.h2.table.Table.convertInsertRow(Table.java:926) ~[h2-2.1.214.jar:2.1.214] + at org.h2.command.dml.Insert.insertRows(Insert.java:167) ~[h2-2.1.214.jar:2.1.214] + at org.h2.command.dml.Insert.update(Insert.java:135) ~[h2-2.1.214.jar:2.1.214] + at org.h2.command.CommandContainer.executeUpdateWithGeneratedKeys(CommandContainer.java:242) ~[h2-2.1.214.jar:2.1.214] + at org.h2.command.CommandContainer.update(CommandContainer.java:163) ~[h2-2.1.214.jar:2.1.214] + at org.h2.command.Command.executeUpdate(Command.java:252) ~[h2-2.1.214.jar:2.1.214] + at org.h2.jdbc.JdbcPreparedStatement.execute(JdbcPreparedStatement.java:254) ~[h2-2.1.214.jar:2.1.214] + at com.zaxxer.hikari.pool.ProxyPreparedStatement.execute(ProxyPreparedStatement.java:44) ~[HikariCP-4.0.3.jar:na] + at com.zaxxer.hikari.pool.HikariProxyPreparedStatement.execute(HikariProxyPreparedStatement.java) ~[HikariCP-4.0.3.jar:na] + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na] + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[na:na] + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na] + at java.base/java.lang.reflect.Method.invoke(Method.java:569) ~[na:na] + at org.apache.ibatis.logging.jdbc.PreparedStatementLogger.invoke(PreparedStatementLogger.java:58) ~[mybatis-3.5.15.jar:3.5.15] + at jdk.proxy3/jdk.proxy3.$Proxy107.execute(Unknown Source) ~[na:na] + at org.apache.ibatis.executor.statement.PreparedStatementHandler.update(PreparedStatementHandler.java:48) ~[mybatis-3.5.15.jar:3.5.15] + at org.apache.ibatis.executor.statement.RoutingStatementHandler.update(RoutingStatementHandler.java:75) ~[mybatis-3.5.15.jar:3.5.15] + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na] + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[na:na] + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na] + at java.base/java.lang.reflect.Method.invoke(Method.java:569) ~[na:na] + at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:61) ~[mybatis-3.5.15.jar:3.5.15] + at jdk.proxy2/jdk.proxy2.$Proxy106.update(Unknown Source) ~[na:na] + at org.apache.ibatis.executor.SimpleExecutor.doUpdate(SimpleExecutor.java:50) ~[mybatis-3.5.15.jar:3.5.15] + at org.apache.ibatis.executor.BaseExecutor.update(BaseExecutor.java:117) ~[mybatis-3.5.15.jar:3.5.15] + at org.apache.ibatis.executor.CachingExecutor.update(CachingExecutor.java:76) ~[mybatis-3.5.15.jar:3.5.15] + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na] + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[na:na] + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na] + at java.base/java.lang.reflect.Method.invoke(Method.java:569) ~[na:na] + at org.apache.ibatis.plugin.Invocation.proceed(Invocation.java:49) ~[mybatis-3.5.15.jar:3.5.15] + at com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor.intercept(MybatisPlusInterceptor.java:106) ~[mybatis-plus-extension-3.5.5.jar:3.5.5] + at org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:59) ~[mybatis-3.5.15.jar:3.5.15] + at jdk.proxy2/jdk.proxy2.$Proxy105.update(Unknown Source) ~[na:na] + at org.apache.ibatis.session.defaults.DefaultSqlSession.update(DefaultSqlSession.java:197) ~[mybatis-3.5.15.jar:3.5.15] + at org.apache.ibatis.session.defaults.DefaultSqlSession.insert(DefaultSqlSession.java:184) ~[mybatis-3.5.15.jar:3.5.15] + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na] + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[na:na] + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na] + at java.base/java.lang.reflect.Method.invoke(Method.java:569) ~[na:na] + at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:425) ~[mybatis-spring-2.1.2.jar:2.1.2] + at jdk.proxy2/jdk.proxy2.$Proxy71.insert(Unknown Source) ~[na:na] + at org.mybatis.spring.SqlSessionTemplate.insert(SqlSessionTemplate.java:272) ~[mybatis-spring-2.1.2.jar:2.1.2] + at com.baomidou.mybatisplus.core.override.MybatisMapperMethod.execute(MybatisMapperMethod.java:59) ~[mybatis-plus-core-3.5.5.jar:3.5.5] + at com.baomidou.mybatisplus.core.override.MybatisMapperProxy$PlainMethodInvoker.invoke(MybatisMapperProxy.java:152) ~[mybatis-plus-core-3.5.5.jar:3.5.5] + at com.baomidou.mybatisplus.core.override.MybatisMapperProxy.invoke(MybatisMapperProxy.java:89) ~[mybatis-plus-core-3.5.5.jar:3.5.5] + at jdk.proxy2/jdk.proxy2.$Proxy86.insert(Unknown Source) ~[na:na] + at com.baomidou.mybatisplus.extension.service.IService.save(IService.java:60) ~[mybatis-plus-extension-3.5.5.jar:3.5.5] + at com.baomidou.mybatisplus.extension.service.IService$$FastClassBySpringCGLIB$$f8525d18.invoke() ~[mybatis-plus-extension-3.5.5.jar:3.5.5] + at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218) ~[spring-core-5.3.31.jar:5.3.31] + at org.springframework.aop.framework.CglibAopProxy.invokeMethod(CglibAopProxy.java:386) ~[spring-aop-5.3.31.jar:5.3.31] + at org.springframework.aop.framework.CglibAopProxy.access$000(CglibAopProxy.java:85) ~[spring-aop-5.3.31.jar:5.3.31] + at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:703) ~[spring-aop-5.3.31.jar:5.3.31] + at com.gpf.pethospital.service.impl.PrescriptionServiceImpl$$EnhancerBySpringCGLIB$$834c711.save() ~[classes/:na] + at com.gpf.pethospital.controller.PrescriptionController.create(PrescriptionController.java:28) ~[classes/:na] + at com.gpf.pethospital.controller.PrescriptionController$$FastClassBySpringCGLIB$$6a1d26f5.invoke() ~[classes/:na] + at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218) ~[spring-core-5.3.31.jar:5.3.31] + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:792) ~[spring-aop-5.3.31.jar:5.3.31] + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) ~[spring-aop-5.3.31.jar:5.3.31] + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:762) ~[spring-aop-5.3.31.jar:5.3.31] + at org.springframework.security.authorization.method.AuthorizationManagerBeforeMethodInterceptor.invoke(AuthorizationManagerBeforeMethodInterceptor.java:162) ~[spring-security-core-5.7.11.jar:5.7.11] + at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) ~[spring-aop-5.3.31.jar:5.3.31] + at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.proceed(CglibAopProxy.java:762) ~[spring-aop-5.3.31.jar:5.3.31] + at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:707) ~[spring-aop-5.3.31.jar:5.3.31] + at com.gpf.pethospital.controller.PrescriptionController$$EnhancerBySpringCGLIB$$a4312665.create() ~[classes/:na] + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na] + at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[na:na] + at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na] + at java.base/java.lang.reflect.Method.invoke(Method.java:569) ~[na:na] + at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:205) ~[spring-web-5.3.31.jar:5.3.31] + at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:150) ~[spring-web-5.3.31.jar:5.3.31] + at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:117) ~[spring-webmvc-5.3.31.jar:5.3.31] + at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:895) ~[spring-webmvc-5.3.31.jar:5.3.31] + at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808) ~[spring-webmvc-5.3.31.jar:5.3.31] + at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) ~[spring-webmvc-5.3.31.jar:5.3.31] + at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1072) ~[spring-webmvc-5.3.31.jar:5.3.31] + at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:965) ~[spring-webmvc-5.3.31.jar:5.3.31] + at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) ~[spring-webmvc-5.3.31.jar:5.3.31] + at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:909) ~[spring-webmvc-5.3.31.jar:5.3.31] + at javax.servlet.http.HttpServlet.service(HttpServlet.java:555) ~[tomcat-embed-core-9.0.83.jar:4.0.FR] + at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) ~[spring-webmvc-5.3.31.jar:5.3.31] + at javax.servlet.http.HttpServlet.service(HttpServlet.java:623) ~[tomcat-embed-core-9.0.83.jar:4.0.FR] + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:209) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51) ~[tomcat-embed-websocket-9.0.83.jar:9.0.83] + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:337) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.access.intercept.AuthorizationFilter.doFilter(AuthorizationFilter.java:96) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:346) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:122) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:116) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:346) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:126) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:81) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:346) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:109) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:346) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:149) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:346) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:63) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:346) ~[spring-security-web-5.7.11.jar:5.7.11] + at com.gpf.pethospital.security.JwtAuthenticationFilter.doFilterInternal(JwtAuthenticationFilter.java:45) ~[classes/:na] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) ~[spring-web-5.3.31.jar:5.3.31] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:346) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:103) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:89) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:346) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.header.HeaderWriterFilter.doHeadersAfter(HeaderWriterFilter.java:90) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:75) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) ~[spring-web-5.3.31.jar:5.3.31] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:346) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:112) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:82) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:346) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:55) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) ~[spring-web-5.3.31.jar:5.3.31] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:346) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.session.DisableEncodeUrlFilter.doFilterInternal(DisableEncodeUrlFilter.java:42) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) ~[spring-web-5.3.31.jar:5.3.31] + at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:346) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:221) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:186) ~[spring-security-web-5.7.11.jar:5.7.11] + at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:354) ~[spring-web-5.3.31.jar:5.3.31] + at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:267) ~[spring-web-5.3.31.jar:5.3.31] + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) ~[spring-web-5.3.31.jar:5.3.31] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) ~[spring-web-5.3.31.jar:5.3.31] + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93) ~[spring-web-5.3.31.jar:5.3.31] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) ~[spring-web-5.3.31.jar:5.3.31] + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201) ~[spring-web-5.3.31.jar:5.3.31] + at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117) ~[spring-web-5.3.31.jar:5.3.31] + at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:178) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:153) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:168) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:481) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:130) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:342) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:390) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:928) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1794) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) ~[tomcat-embed-core-9.0.83.jar:9.0.83] + at java.base/java.lang.Thread.run(Thread.java:840) ~[na:na] + +2026-01-29 12:21:21.609 INFO 7141 --- [ionShutdownHook] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown initiated... +2026-01-29 12:21:21.611 INFO 7141 --- [ionShutdownHook] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown completed. +[INFO] ------------------------------------------------------------------------ +[INFO] BUILD FAILURE +[INFO] ------------------------------------------------------------------------ +[INFO] Total time: 02:24 min +[INFO] Finished at: 2026-01-29T12:21:21+08:00 +[INFO] ------------------------------------------------------------------------ +[ERROR] Failed to execute goal org.springframework.boot:spring-boot-maven-plugin:2.7.18:run (default-cli) on project pet-hospital: Application finished with exit code: 143 -> [Help 1] +[ERROR] +[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch. +[ERROR] Re-run Maven using the -X switch to enable full debug logging. +[ERROR] +[ERROR] For more information about the errors and possible solutions, please read the following articles: +[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoExecutionException diff --git a/backend/backend_with_init.log b/backend/backend_with_init.log new file mode 100644 index 0000000..5326745 --- /dev/null +++ b/backend/backend_with_init.log @@ -0,0 +1,2 @@ +Error: Could not find or load main class org.springframework.boot.loader.PropertiesLauncher +Caused by: java.lang.ClassNotFoundException: org.springframework.boot.loader.PropertiesLauncher diff --git a/backend/backend_with_schema.log b/backend/backend_with_schema.log new file mode 100644 index 0000000..3d2f67e --- /dev/null +++ b/backend/backend_with_schema.log @@ -0,0 +1,79 @@ +[INFO] Scanning for projects... +[INFO] +[INFO] ------------------------< com.gpf:pet-hospital >------------------------ +[INFO] Building 爱维宠物医院管理平台 1.0.0 +[INFO] --------------------------------[ jar ]--------------------------------- +[INFO] +[INFO] >>> spring-boot-maven-plugin:2.7.18:run (default-cli) > test-compile @ pet-hospital >>> +[INFO] +[INFO] --- maven-resources-plugin:3.2.0:resources (default-resources) @ pet-hospital --- +[INFO] Using 'UTF-8' encoding to copy filtered resources. +[INFO] Using 'UTF-8' encoding to copy filtered properties files. +[INFO] Copying 2 resources +[INFO] Copying 1 resource +[INFO] +[INFO] --- maven-compiler-plugin:3.10.1:compile (default-compile) @ pet-hospital --- +[INFO] Nothing to compile - all classes are up to date +[INFO] +[INFO] --- maven-resources-plugin:3.2.0:testResources (default-testResources) @ pet-hospital --- +[INFO] Using 'UTF-8' encoding to copy filtered resources. +[INFO] Using 'UTF-8' encoding to copy filtered properties files. +[INFO] skip non existing resourceDirectory /mnt/d/bs/gpf_pet_hospital/backend/src/test/resources +[INFO] +[INFO] --- maven-compiler-plugin:3.10.1:testCompile (default-testCompile) @ pet-hospital --- +[INFO] No sources to compile +[INFO] +[INFO] <<< spring-boot-maven-plugin:2.7.18:run (default-cli) < test-compile @ pet-hospital <<< +[INFO] +[INFO] +[INFO] --- spring-boot-maven-plugin:2.7.18:run (default-cli) @ pet-hospital --- +[INFO] Attaching agents: [] + + . ____ _ __ _ _ + /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \ +( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \ + \\/ ___)| |_)| | | | | || (_| | ) ) ) ) + ' |____| .__|_| |_|_| |_\__, | / / / / + =========|_|==============|___/=/_/_/_/ + :: Spring Boot :: (v2.7.18) + +2026-01-29 12:10:07.544 INFO 6203 --- [ main] c.g.pethospital.PetHospitalApplication : Starting PetHospitalApplication using Java 17.0.17 on LAPTOP-FS8K5GSO with PID 6203 (/mnt/d/bs/gpf_pet_hospital/backend/target/classes started by wangzq in /mnt/d/bs/gpf_pet_hospital/backend) +2026-01-29 12:10:07.549 INFO 6203 --- [ main] c.g.pethospital.PetHospitalApplication : The following 1 profile is active: "dev" +2026-01-29 12:10:13.073 INFO 6203 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8081 (http) +2026-01-29 12:10:13.103 INFO 6203 --- [ main] o.apache.catalina.core.StandardService : Starting service [Tomcat] +2026-01-29 12:10:13.104 INFO 6203 --- [ main] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.83] +2026-01-29 12:10:13.299 INFO 6203 --- [ main] o.a.c.c.C.[Tomcat].[localhost].[/api] : Initializing Spring embedded WebApplicationContext +2026-01-29 12:10:13.300 INFO 6203 --- [ main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 5675 ms +2026-01-29 12:10:13.353 INFO 6203 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting... +2026-01-29 12:10:14.132 INFO 6203 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed. +2026-01-29 12:10:14.158 INFO 6203 --- [ main] o.s.b.a.h2.H2ConsoleAutoConfiguration : H2 console available at '/h2-console'. Database available at 'jdbc:h2:mem:testdb' +Logging initialized using 'class org.apache.ibatis.logging.stdout.StdOutImpl' adapter. +Initialization Sequence datacenterId:1 workerId:16 + _ _ |_ _ _|_. ___ _ | _ +| | |\/|_)(_| | |_\ |_)||_|_\ + / | + 3.5.5 +2026-01-29 12:10:16.530 WARN 6203 --- [ main] .s.s.UserDetailsServiceAutoConfiguration : + +Using generated security password: a12500af-8981-4b37-ac7e-b23ca72f676d + +This generated password is for development use only. Your security configuration must be updated before running your application in production. + +2026-01-29 12:10:16.846 INFO 6203 --- [ main] o.s.s.web.DefaultSecurityFilterChain : Will secure any request with [org.springframework.security.web.session.DisableEncodeUrlFilter@46394f65, org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter@31aab981, org.springframework.security.web.context.SecurityContextPersistenceFilter@76c86567, org.springframework.security.web.header.HeaderWriterFilter@4966bab1, org.springframework.security.web.authentication.logout.LogoutFilter@357f6391, com.gpf.pethospital.security.JwtAuthenticationFilter@26be9a6, org.springframework.security.web.savedrequest.RequestCacheAwareFilter@5a4dda2, org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter@34045582, org.springframework.security.web.authentication.AnonymousAuthenticationFilter@4d518c66, org.springframework.security.web.session.SessionManagementFilter@1b52699c, org.springframework.security.web.access.ExceptionTranslationFilter@38e83838, org.springframework.security.web.access.intercept.AuthorizationFilter@7971c2a9] +2026-01-29 12:10:18.165 INFO 6203 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8081 (http) with context path '/api' +2026-01-29 12:10:18.180 INFO 6203 --- [ main] c.g.pethospital.PetHospitalApplication : Started PetHospitalApplication in 12.026 seconds (JVM running for 12.681) +2026-01-29 12:10:28.895 INFO 6203 --- [ionShutdownHook] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown initiated... +2026-01-29 12:10:28.897 INFO 6203 --- [ionShutdownHook] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Shutdown completed. +[INFO] ------------------------------------------------------------------------ +[INFO] BUILD FAILURE +[INFO] ------------------------------------------------------------------------ +[INFO] Total time: 30.614 s +[INFO] Finished at: 2026-01-29T12:10:28+08:00 +[INFO] ------------------------------------------------------------------------ +[ERROR] Failed to execute goal org.springframework.boot:spring-boot-maven-plugin:2.7.18:run (default-cli) on project pet-hospital: Application finished with exit code: 143 -> [Help 1] +[ERROR] +[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch. +[ERROR] Re-run Maven using the -X switch to enable full debug logging. +[ERROR] +[ERROR] For more information about the errors and possible solutions, please read the following articles: +[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoExecutionException diff --git a/backend/backend_working.log b/backend/backend_working.log new file mode 100644 index 0000000..59d5b61 --- /dev/null +++ b/backend/backend_working.log @@ -0,0 +1,180 @@ +[INFO] Scanning for projects... +[INFO] +[INFO] ------------------------< com.gpf:pet-hospital >------------------------ +[INFO] Building 爱维宠物医院管理平台 1.0.0 +[INFO] --------------------------------[ jar ]--------------------------------- +[INFO] +[INFO] >>> spring-boot-maven-plugin:2.7.18:run (default-cli) > test-compile @ pet-hospital >>> +[INFO] +[INFO] --- maven-resources-plugin:3.2.0:resources (default-resources) @ pet-hospital --- +[INFO] Using 'UTF-8' encoding to copy filtered resources. +[INFO] Using 'UTF-8' encoding to copy filtered properties files. +[INFO] Copying 2 resources +[INFO] Copying 3 resources +[INFO] +[INFO] --- maven-compiler-plugin:3.10.1:compile (default-compile) @ pet-hospital --- +[INFO] Nothing to compile - all classes are up to date +[INFO] +[INFO] --- maven-resources-plugin:3.2.0:testResources (default-testResources) @ pet-hospital --- +[INFO] Using 'UTF-8' encoding to copy filtered resources. +[INFO] Using 'UTF-8' encoding to copy filtered properties files. +[INFO] skip non existing resourceDirectory /mnt/d/bs/gpf_pet_hospital/backend/src/test/resources +[INFO] +[INFO] --- maven-compiler-plugin:3.10.1:testCompile (default-testCompile) @ pet-hospital --- +[INFO] No sources to compile +[INFO] +[INFO] <<< spring-boot-maven-plugin:2.7.18:run (default-cli) < test-compile @ pet-hospital <<< +[INFO] +[INFO] +[INFO] --- spring-boot-maven-plugin:2.7.18:run (default-cli) @ pet-hospital --- +[INFO] Attaching agents: [] + + . ____ _ __ _ _ + /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \ +( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \ + \\/ ___)| |_)| | | | | || (_| | ) ) ) ) + ' |____| .__|_| |_|_| |_\__, | / / / / + =========|_|==============|___/=/_/_/_/ + :: Spring Boot :: (v2.7.18) + +2026-01-29 12:24:05.772 INFO 7628 --- [ main] c.g.pethospital.PetHospitalApplication : Starting PetHospitalApplication using Java 17.0.17 on LAPTOP-FS8K5GSO with PID 7628 (/mnt/d/bs/gpf_pet_hospital/backend/target/classes started by wangzq in /mnt/d/bs/gpf_pet_hospital/backend) +2026-01-29 12:24:05.778 INFO 7628 --- [ main] c.g.pethospital.PetHospitalApplication : The following 1 profile is active: "dev" +2026-01-29 12:24:11.364 INFO 7628 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8081 (http) +2026-01-29 12:24:11.390 INFO 7628 --- [ main] o.apache.catalina.core.StandardService : Starting service [Tomcat] +2026-01-29 12:24:11.390 INFO 7628 --- [ main] org.apache.catalina.core.StandardEngine : Starting Servlet engine: [Apache Tomcat/9.0.83] +2026-01-29 12:24:11.547 INFO 7628 --- [ main] o.a.c.c.C.[Tomcat].[localhost].[/api] : Initializing Spring embedded WebApplicationContext +2026-01-29 12:24:11.547 INFO 7628 --- [ main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 5683 ms +2026-01-29 12:24:11.602 INFO 7628 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Starting... +2026-01-29 12:24:12.451 INFO 7628 --- [ main] com.zaxxer.hikari.HikariDataSource : HikariPool-1 - Start completed. +2026-01-29 12:24:12.476 INFO 7628 --- [ main] o.s.b.a.h2.H2ConsoleAutoConfiguration : H2 console available at '/h2-console'. Database available at 'jdbc:h2:mem:testdb' +Logging initialized using 'class org.apache.ibatis.logging.stdout.StdOutImpl' adapter. +Initialization Sequence datacenterId:1 workerId:22 + _ _ |_ _ _|_. ___ _ | _ +| | |\/|_)(_| | |_\ |_)||_|_\ + / | + 3.5.5 +2026-01-29 12:24:14.953 WARN 7628 --- [ main] .s.s.UserDetailsServiceAutoConfiguration : + +Using generated security password: 894a2f39-1097-4906-9582-c51d7962caac + +This generated password is for development use only. Your security configuration must be updated before running your application in production. + +2026-01-29 12:24:15.337 INFO 7628 --- [ main] o.s.s.web.DefaultSecurityFilterChain : Will secure any request with [org.springframework.security.web.session.DisableEncodeUrlFilter@4aed311e, org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter@4c38cd16, org.springframework.security.web.context.SecurityContextPersistenceFilter@7971c2a9, org.springframework.security.web.header.HeaderWriterFilter@11c88cca, org.springframework.security.web.authentication.logout.LogoutFilter@111c229c, com.gpf.pethospital.security.JwtAuthenticationFilter@7ddcb0dc, org.springframework.security.web.savedrequest.RequestCacheAwareFilter@60b5e80d, org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter@31aab981, org.springframework.security.web.authentication.AnonymousAuthenticationFilter@f5bf288, org.springframework.security.web.session.SessionManagementFilter@349c4d1c, org.springframework.security.web.access.ExceptionTranslationFilter@340cb97f, org.springframework.security.web.access.intercept.AuthorizationFilter@320be73] +2026-01-29 12:24:16.661 INFO 7628 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8081 (http) with context path '/api' +2026-01-29 12:24:16.675 INFO 7628 --- [ main] c.g.pethospital.PetHospitalApplication : Started PetHospitalApplication in 12.299 seconds (JVM running for 12.864) +2026-01-29 12:24:21.966 INFO 7628 --- [nio-8081-exec-1] o.a.c.c.C.[Tomcat].[localhost].[/api] : Initializing Spring DispatcherServlet 'dispatcherServlet' +2026-01-29 12:24:21.966 INFO 7628 --- [nio-8081-exec-1] o.s.web.servlet.DispatcherServlet : Initializing Servlet 'dispatcherServlet' +2026-01-29 12:24:21.968 INFO 7628 --- [nio-8081-exec-1] o.s.web.servlet.DispatcherServlet : Completed initialization in 1 ms +Creating a new SqlSession +SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@1f20fef4] was not registered for synchronization because synchronization is not active +JDBC Connection [HikariProxyConnection@208105529 wrapping conn0: url=jdbc:h2:mem:testdb user=SA] will not be managed by Spring +==> Preparing: SELECT id,username,phone,email,password,role,status,avatar,create_time,update_time,deleted FROM `user` WHERE deleted=0 AND (username = ? OR phone = ? OR email = ?) +==> Parameters: customer(String), customer(String), customer(String) +<== Columns: ID, USERNAME, PHONE, EMAIL, PASSWORD, ROLE, STATUS, AVATAR, CREATE_TIME, UPDATE_TIME, DELETED +<== Row: 3, customer, 13900139000, customer@example.com, $2a$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi, CUSTOMER, 1, null, 2026-01-29 12:24:13.2463, 2026-01-29 12:24:13.2463, 0 +<== Total: 1 +Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@1f20fef4] +Creating a new SqlSession +SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@75e8fc76] was not registered for synchronization because synchronization is not active +JDBC Connection [HikariProxyConnection@1168243154 wrapping conn0: url=jdbc:h2:mem:testdb user=SA] will not be managed by Spring +==> Preparing: SELECT COUNT(*) AS total FROM pet WHERE deleted = 0 AND (owner_id = ?) +==> Parameters: 3(Long) +<== Columns: TOTAL +<== Row: 1 +<== Total: 1 +==> Preparing: SELECT id,owner_id,name,breed,gender,birthday,weight,photo,remark,create_time,update_time,deleted FROM pet WHERE deleted=0 AND (owner_id = ?) LIMIT ? +==> Parameters: 3(Long), 10(Long) +<== Columns: ID, OWNER_ID, NAME, BREED, GENDER, BIRTHDAY, WEIGHT, PHOTO, REMARK, CREATE_TIME, UPDATE_TIME, DELETED +<== Row: 1, 3, 小白, 金毛, MALE, 2023-01-01, null, null, null, 2026-01-29 12:24:13.247041, 2026-01-29 12:24:13.247041, 0 +<== Total: 1 +Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@75e8fc76] +Creating a new SqlSession +SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@41493577] was not registered for synchronization because synchronization is not active +JDBC Connection [HikariProxyConnection@2016262451 wrapping conn0: url=jdbc:h2:mem:testdb user=SA] will not be managed by Spring +==> Preparing: INSERT INTO appointment ( customer_id, pet_id, appointment_date, time_slot, status, remark, create_time, update_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ? ) +==> Parameters: 3(Long), 1(Long), 2026-02-01(LocalDate), 09:00-10:00(String), PENDING(String), 常规检查(String), 2026-01-29T12:24:32.546247898(LocalDateTime), 2026-01-29T12:24:32.546247898(LocalDateTime) +<== Updates: 1 +Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@41493577] +Creating a new SqlSession +SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@bf1d89a] was not registered for synchronization because synchronization is not active +JDBC Connection [HikariProxyConnection@87439252 wrapping conn0: url=jdbc:h2:mem:testdb user=SA] will not be managed by Spring +==> Preparing: SELECT id,username,phone,email,password,role,status,avatar,create_time,update_time,deleted FROM `user` WHERE deleted=0 AND (username = ? OR phone = ? OR email = ?) +==> Parameters: admin(String), admin(String), admin(String) +<== Columns: ID, USERNAME, PHONE, EMAIL, PASSWORD, ROLE, STATUS, AVATAR, CREATE_TIME, UPDATE_TIME, DELETED +<== Row: 1, admin, 13800138000, admin@example.com, $2a$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi, ADMIN, 1, null, 2026-01-29 12:24:13.23867, 2026-01-29 12:24:13.23867, 0 +<== Total: 1 +Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@bf1d89a] +2026-01-29 12:24:40.495 WARN 7628 --- [nio-8081-exec-8] .w.s.m.s.DefaultHandlerExceptionResolver : Resolved [org.springframework.web.bind.MissingServletRequestParameterException: Required request parameter 'status' for method parameter type String is not present] +Creating a new SqlSession +SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@4c2f1f92] was not registered for synchronization because synchronization is not active +JDBC Connection [HikariProxyConnection@1931573387 wrapping conn0: url=jdbc:h2:mem:testdb user=SA] will not be managed by Spring +==> Preparing: UPDATE appointment SET status=?, update_time=? WHERE id=? AND deleted=0 +==> Parameters: ARRIVED(String), 2026-01-29T12:24:45.469184613(LocalDateTime), 1(Long) +<== Updates: 1 +Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@4c2f1f92] +Creating a new SqlSession +SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@2cd992d5] was not registered for synchronization because synchronization is not active +JDBC Connection [HikariProxyConnection@1326776275 wrapping conn0: url=jdbc:h2:mem:testdb user=SA] will not be managed by Spring +==> Preparing: SELECT id,username,phone,email,password,role,status,avatar,create_time,update_time,deleted FROM `user` WHERE deleted=0 AND (username = ? OR phone = ? OR email = ?) +==> Parameters: customer(String), customer(String), customer(String) +<== Columns: ID, USERNAME, PHONE, EMAIL, PASSWORD, ROLE, STATUS, AVATAR, CREATE_TIME, UPDATE_TIME, DELETED +<== Row: 3, customer, 13900139000, customer@example.com, $2a$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi, CUSTOMER, 1, null, 2026-01-29 12:24:13.2463, 2026-01-29 12:24:13.2463, 0 +<== Total: 1 +Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@2cd992d5] +Creating a new SqlSession +SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@47af24ef] was not registered for synchronization because synchronization is not active +JDBC Connection [HikariProxyConnection@630841539 wrapping conn0: url=jdbc:h2:mem:testdb user=SA] will not be managed by Spring +==> Preparing: INSERT INTO visit ( appointment_id, customer_id, pet_id, doctor_id, status, payment_status, create_time, update_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ? ) +==> Parameters: 1(Long), 3(Long), 1(Long), 1(Long), COMPLETED(String), UNPAID(String), 2026-01-29T12:24:49.989305686(LocalDateTime), 2026-01-29T12:24:49.989305686(LocalDateTime) +<== Updates: 1 +Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@47af24ef] +Creating a new SqlSession +SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@15774d6c] was not registered for synchronization because synchronization is not active +JDBC Connection [HikariProxyConnection@1399738390 wrapping conn0: url=jdbc:h2:mem:testdb user=SA] will not be managed by Spring +==> Preparing: INSERT INTO prescription ( visit_id, doctor_id, status, create_time, update_time ) VALUES ( ?, ?, ?, ?, ? ) +==> Parameters: 1(Long), 1(Long), SUBMITTED(String), 2026-01-29T12:24:54.704878297(LocalDateTime), 2026-01-29T12:24:54.704878297(LocalDateTime) +<== Updates: 1 +Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@15774d6c] +Creating a new SqlSession +SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@3f2e9c5] was not registered for synchronization because synchronization is not active +JDBC Connection [HikariProxyConnection@1704824955 wrapping conn0: url=jdbc:h2:mem:testdb user=SA] will not be managed by Spring +==> Preparing: INSERT INTO order_info ( visit_id, customer_id, amount, status, payment_method, remark, create_time, update_time ) VALUES ( ?, ?, ?, ?, ?, ?, ?, ? ) +==> Parameters: 1(Long), 3(Long), 50.00(BigDecimal), PAID(String), WECHAT(String), 支付处方费用(String), 2026-01-29T12:24:58.817900417(LocalDateTime), 2026-01-29T12:24:58.817900417(LocalDateTime) +<== Updates: 1 +Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@3f2e9c5] +Creating a new SqlSession +Creating a new SqlSession +SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@48c4f857] was not registered for synchronization because synchronization is not active +SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@7b6b5f95] was not registered for synchronization because synchronization is not active +JDBC Connection [HikariProxyConnection@1731465716 wrapping conn0: url=jdbc:h2:mem:testdb user=SA] will not be managed by Spring +JDBC Connection [HikariProxyConnection@1306442745 wrapping conn1: url=jdbc:h2:mem:testdb user=SA] will not be managed by Spring +==> Preparing: SELECT COUNT(*) AS total FROM order_info WHERE deleted = 0 AND (customer_id = ?) +==> Preparing: SELECT COUNT(*) AS total FROM visit WHERE deleted = 0 AND (customer_id = ?) +==> Parameters: 2(Long) +==> Parameters: 2(Long) +<== Columns: TOTAL +<== Row: 0 +<== Columns: TOTAL +<== Total: 1 +<== Row: 0 +Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@7b6b5f95] +<== Total: 1 +Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@48c4f857] +Creating a new SqlSession +SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@338fc1da] was not registered for synchronization because synchronization is not active +JDBC Connection [HikariProxyConnection@46490719 wrapping conn0: url=jdbc:h2:mem:testdb user=SA] will not be managed by Spring +==> Preparing: SELECT COUNT(*) AS total FROM pet WHERE deleted = 0 AND (owner_id = ?) +==> Parameters: 2(Long) +<== Columns: TOTAL +<== Row: 0 +<== Total: 1 +Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@338fc1da] +Creating a new SqlSession +SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@5490b9c8] was not registered for synchronization because synchronization is not active +JDBC Connection [HikariProxyConnection@1309118785 wrapping conn0: url=jdbc:h2:mem:testdb user=SA] will not be managed by Spring +==> Preparing: SELECT COUNT(*) AS total FROM pet WHERE deleted = 0 AND (owner_id = ?) +==> Parameters: 2(Long) +<== Columns: TOTAL +<== Row: 0 +<== Total: 1 +Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@5490b9c8] diff --git a/backend/pom.xml b/backend/pom.xml new file mode 100644 index 0000000..9af278b --- /dev/null +++ b/backend/pom.xml @@ -0,0 +1,131 @@ + + + 4.0.0 + + org.springframework.boot + spring-boot-starter-parent + 2.7.18 + + + + com.gpf + pet-hospital + 1.0.0 + 爱维宠物医院管理平台 + 爱维宠物医院管理平台后端服务 + + + 17 + 8.0.33 + 3.5.5 + 0.11.5 + + + + + + org.springframework.boot + spring-boot-starter-web + + + + + org.springframework.boot + spring-boot-starter-security + + + + + org.springframework.boot + spring-boot-starter-validation + + + + + jakarta.validation + jakarta.validation-api + 3.0.2 + + + + + com.mysql + mysql-connector-j + runtime + + + + + com.baomidou + mybatis-plus-boot-starter + ${mybatis-plus.version} + + + + + io.jsonwebtoken + jjwt-api + ${jwt.version} + + + io.jsonwebtoken + jjwt-impl + ${jwt.version} + runtime + + + io.jsonwebtoken + jjwt-jackson + ${jwt.version} + runtime + + + + + com.h2database + h2 + runtime + + + + + org.projectlombok + lombok + true + + + + + org.springframework.boot + spring-boot-starter-test + test + + + + + org.springframework.security + spring-security-test + test + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + org.projectlombok + lombok + + + + + + + diff --git a/backend/src/main/java/com/gpf/pethospital/PetHospitalApplication.java b/backend/src/main/java/com/gpf/pethospital/PetHospitalApplication.java new file mode 100644 index 0000000..771b3ec --- /dev/null +++ b/backend/src/main/java/com/gpf/pethospital/PetHospitalApplication.java @@ -0,0 +1,17 @@ +package com.gpf.pethospital; + +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +/** + * 爱维宠物医院管理平台主应用 + */ +@SpringBootApplication +@MapperScan("com.gpf.pethospital.mapper") +public class PetHospitalApplication { + + public static void main(String[] args) { + SpringApplication.run(PetHospitalApplication.class, args); + } +} diff --git a/backend/src/main/java/com/gpf/pethospital/common/ApiResponse.java b/backend/src/main/java/com/gpf/pethospital/common/ApiResponse.java new file mode 100644 index 0000000..b812df2 --- /dev/null +++ b/backend/src/main/java/com/gpf/pethospital/common/ApiResponse.java @@ -0,0 +1,37 @@ +package com.gpf.pethospital.common; + +public class ApiResponse { + private final int code; + private final String message; + private final T data; + + private ApiResponse(int code, String message, T data) { + this.code = code; + this.message = message; + this.data = data; + } + + public static ApiResponse success(T data) { + return new ApiResponse<>(0, "ok", data); + } + + public static ApiResponse success(String message, T data) { + return new ApiResponse<>(0, message, data); + } + + public static ApiResponse error(int code, String message) { + return new ApiResponse<>(code, message, null); + } + + public int getCode() { + return code; + } + + public String getMessage() { + return message; + } + + public T getData() { + return data; + } +} diff --git a/backend/src/main/java/com/gpf/pethospital/config/MybatisPlusConfig.java b/backend/src/main/java/com/gpf/pethospital/config/MybatisPlusConfig.java new file mode 100644 index 0000000..8e0e39f --- /dev/null +++ b/backend/src/main/java/com/gpf/pethospital/config/MybatisPlusConfig.java @@ -0,0 +1,37 @@ +package com.gpf.pethospital.config; + +import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler; +import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor; +import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor; +import org.apache.ibatis.reflection.MetaObject; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import java.time.LocalDateTime; + +@Configuration +public class MybatisPlusConfig { + @Bean + public MybatisPlusInterceptor mybatisPlusInterceptor() { + MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); + interceptor.addInnerInterceptor(new PaginationInnerInterceptor()); + return interceptor; + } + + @Bean + public MetaObjectHandler metaObjectHandler() { + return new MetaObjectHandler() { + @Override + public void insertFill(MetaObject metaObject) { + LocalDateTime now = LocalDateTime.now(); + strictInsertFill(metaObject, "createTime", LocalDateTime.class, now); + strictInsertFill(metaObject, "updateTime", LocalDateTime.class, now); + } + + @Override + public void updateFill(MetaObject metaObject) { + strictUpdateFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now()); + } + }; + } +} diff --git a/backend/src/main/java/com/gpf/pethospital/config/SecurityConfig.java b/backend/src/main/java/com/gpf/pethospital/config/SecurityConfig.java new file mode 100644 index 0000000..9278a36 --- /dev/null +++ b/backend/src/main/java/com/gpf/pethospital/config/SecurityConfig.java @@ -0,0 +1,49 @@ +package com.gpf.pethospital.config; + +import com.gpf.pethospital.security.JwtAuthenticationFilter; +import com.gpf.pethospital.util.JwtUtil; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.security.config.annotation.method.configuration.EnableMethodSecurity; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.http.SessionCreationPolicy; +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; +import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.security.web.SecurityFilterChain; +import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; +import org.springframework.security.web.util.matcher.AntPathRequestMatcher; + +@Configuration +@EnableMethodSecurity +public class SecurityConfig { + @Value("${jwt.secret}") + private String jwtSecret; + + @Value("${jwt.expiration}") + private long jwtExpiration; + + @Bean + public JwtUtil jwtUtil() { + return new JwtUtil(jwtSecret, jwtExpiration); + } + + @Bean + public PasswordEncoder passwordEncoder() { + return new BCryptPasswordEncoder(); + } + + @Bean + public SecurityFilterChain filterChain(HttpSecurity http, JwtUtil jwtUtil) throws Exception { + http + .csrf(csrf -> csrf.disable()) + .sessionManagement(session -> session.sessionCreationPolicy(SessionCreationPolicy.STATELESS)) + .authorizeHttpRequests(auth -> auth + .requestMatchers(new AntPathRequestMatcher("/auth/**")).permitAll() + .requestMatchers(new AntPathRequestMatcher("/public/**")).permitAll() + .anyRequest().authenticated() + ) + .addFilterBefore(new JwtAuthenticationFilter(jwtUtil), UsernamePasswordAuthenticationFilter.class); + return http.build(); + } +} diff --git a/backend/src/main/java/com/gpf/pethospital/config/WebConfig.java b/backend/src/main/java/com/gpf/pethospital/config/WebConfig.java new file mode 100644 index 0000000..ccbd146 --- /dev/null +++ b/backend/src/main/java/com/gpf/pethospital/config/WebConfig.java @@ -0,0 +1,17 @@ +package com.gpf.pethospital.config; + +import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.config.annotation.CorsRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +@Configuration +public class WebConfig implements WebMvcConfigurer { + @Override + public void addCorsMappings(CorsRegistry registry) { + registry.addMapping("/**") + .allowedOrigins("*") + .allowedMethods("GET", "POST", "PUT", "DELETE", "PATCH") + .allowedHeaders("*") + .maxAge(3600); + } +} diff --git a/backend/src/main/java/com/gpf/pethospital/controller/AppointmentController.java b/backend/src/main/java/com/gpf/pethospital/controller/AppointmentController.java new file mode 100644 index 0000000..b0ec840 --- /dev/null +++ b/backend/src/main/java/com/gpf/pethospital/controller/AppointmentController.java @@ -0,0 +1,72 @@ +package com.gpf.pethospital.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.gpf.pethospital.common.ApiResponse; +import com.gpf.pethospital.entity.Appointment; +import com.gpf.pethospital.security.AuthUser; +import com.gpf.pethospital.service.AppointmentService; +import com.gpf.pethospital.util.SecurityUtils; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import java.time.LocalDateTime; + +@RestController +@RequestMapping("/appointments") +public class AppointmentController { + private final AppointmentService appointmentService; + + public AppointmentController(AppointmentService appointmentService) { + this.appointmentService = appointmentService; + } + + @PostMapping + public ApiResponse create(@RequestBody Appointment appointment) { + AuthUser user = SecurityUtils.currentUser(); + if (user != null && "CUSTOMER".equals(user.getRole())) { + appointment.setCustomerId(user.getId()); + } + if (appointment.getStatus() == null) { + appointment.setStatus("PENDING"); + } + appointmentService.save(appointment); + return ApiResponse.success("created", null); + } + + @GetMapping + public ApiResponse list(@RequestParam(defaultValue = "1") long page, + @RequestParam(defaultValue = "10") long size) { + AuthUser user = SecurityUtils.currentUser(); + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + if (user != null && "CUSTOMER".equals(user.getRole())) { + wrapper.eq(Appointment::getCustomerId, user.getId()); + } + return ApiResponse.success(appointmentService.page(new Page<>(page, size), wrapper)); + } + + @PreAuthorize("hasAnyRole('ADMIN','DOCTOR')") + @GetMapping("/admin") + public ApiResponse adminList(@RequestParam(defaultValue = "1") long page, + @RequestParam(defaultValue = "10") long size, + @RequestParam(required = false) String status) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + if (status != null && !status.isBlank()) { + wrapper.eq(Appointment::getStatus, status); + } + return ApiResponse.success(appointmentService.page(new Page<>(page, size), wrapper)); + } + + @PreAuthorize("hasAnyRole('ADMIN','DOCTOR')") + @PutMapping("/{id}/status") + public ApiResponse updateStatus(@PathVariable Long id, @RequestParam String status) { + Appointment update = new Appointment(); + update.setId(id); + update.setStatus(status); + if ("CANCELLED".equals(status)) { + update.setCancelTime(LocalDateTime.now()); + } + appointmentService.updateById(update); + return ApiResponse.success("updated", null); + } +} diff --git a/backend/src/main/java/com/gpf/pethospital/controller/AuthController.java b/backend/src/main/java/com/gpf/pethospital/controller/AuthController.java new file mode 100644 index 0000000..134b77d --- /dev/null +++ b/backend/src/main/java/com/gpf/pethospital/controller/AuthController.java @@ -0,0 +1,82 @@ +package com.gpf.pethospital.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.gpf.pethospital.common.ApiResponse; +import com.gpf.pethospital.dto.LoginRequest; +import com.gpf.pethospital.dto.RegisterRequest; +import com.gpf.pethospital.entity.User; +import com.gpf.pethospital.service.UserService; +import com.gpf.pethospital.util.JwtUtil; +import jakarta.validation.Valid; +import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.HashMap; +import java.util.Map; + +@RestController +@RequestMapping("/auth") +public class AuthController { + private final UserService userService; + private final PasswordEncoder passwordEncoder; + private final JwtUtil jwtUtil; + + public AuthController(UserService userService, PasswordEncoder passwordEncoder, JwtUtil jwtUtil) { + this.userService = userService; + this.passwordEncoder = passwordEncoder; + this.jwtUtil = jwtUtil; + } + + @PostMapping("/register") + public ApiResponse register(@Valid @RequestBody RegisterRequest request) { + if ((request.getPhone() == null || request.getPhone().isBlank()) + && (request.getEmail() == null || request.getEmail().isBlank())) { + return ApiResponse.error(400, "phone or email is required"); + } + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(User::getUsername, request.getUsername()) + .or() + .eq(request.getPhone() != null && !request.getPhone().isBlank(), User::getPhone, request.getPhone()) + .or() + .eq(request.getEmail() != null && !request.getEmail().isBlank(), User::getEmail, request.getEmail()); + if (userService.count(wrapper) > 0) { + return ApiResponse.error(409, "user already exists"); + } + User user = new User(); + user.setUsername(request.getUsername()); + user.setPhone(request.getPhone()); + user.setEmail(request.getEmail()); + user.setPassword(passwordEncoder.encode(request.getPassword())); + user.setRole("CUSTOMER"); + user.setStatus(1); + userService.save(user); + return ApiResponse.success("registered", null); + } + + @PostMapping("/login") + public ApiResponse login(@Valid @RequestBody LoginRequest request) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(User::getUsername, request.getAccount()) + .or() + .eq(User::getPhone, request.getAccount()) + .or() + .eq(User::getEmail, request.getAccount()); + User user = userService.getOne(wrapper); + if (user == null || user.getStatus() != null && user.getStatus() == 0) { + return ApiResponse.error(401, "invalid account or disabled"); + } + if (!passwordEncoder.matches(request.getPassword(), user.getPassword())) { + return ApiResponse.error(401, "invalid account or password"); + } + String token = jwtUtil.generateToken(user.getId(), user.getRole(), user.getUsername()); + Map data = new HashMap<>(); + data.put("token", token); + data.put("role", user.getRole()); + data.put("userId", user.getId()); + data.put("username", user.getUsername()); + return ApiResponse.success(data); + } +} diff --git a/backend/src/main/java/com/gpf/pethospital/controller/DrugController.java b/backend/src/main/java/com/gpf/pethospital/controller/DrugController.java new file mode 100644 index 0000000..4a93099 --- /dev/null +++ b/backend/src/main/java/com/gpf/pethospital/controller/DrugController.java @@ -0,0 +1,58 @@ +package com.gpf.pethospital.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.gpf.pethospital.common.ApiResponse; +import com.gpf.pethospital.entity.Drug; +import com.gpf.pethospital.service.DrugService; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +@RestController +@RequestMapping("/drugs") +public class DrugController { + private final DrugService drugService; + + public DrugController(DrugService drugService) { + this.drugService = drugService; + } + + @PreAuthorize("hasRole('ADMIN')") + @GetMapping + public ApiResponse list(@RequestParam(defaultValue = "1") long page, + @RequestParam(defaultValue = "10") long size, + @RequestParam(required = false) String keyword) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + if (keyword != null && !keyword.isBlank()) { + wrapper.like(Drug::getName, keyword) + .or() + .like(Drug::getSpecification, keyword); + } + return ApiResponse.success(drugService.page(new Page<>(page, size), wrapper)); + } + + @PreAuthorize("hasRole('ADMIN')") + @PostMapping + public ApiResponse create(@RequestBody Drug drug) { + if (drug.getStatus() == null) { + drug.setStatus(1); + } + drugService.save(drug); + return ApiResponse.success("created", null); + } + + @PreAuthorize("hasRole('ADMIN')") + @PutMapping("/{id}") + public ApiResponse update(@PathVariable Long id, @RequestBody Drug drug) { + drug.setId(id); + drugService.updateById(drug); + return ApiResponse.success("updated", null); + } + + @PreAuthorize("hasRole('ADMIN')") + @DeleteMapping("/{id}") + public ApiResponse delete(@PathVariable Long id) { + drugService.removeById(id); + return ApiResponse.success("deleted", null); + } +} diff --git a/backend/src/main/java/com/gpf/pethospital/controller/MedicalRecordController.java b/backend/src/main/java/com/gpf/pethospital/controller/MedicalRecordController.java new file mode 100644 index 0000000..355a704 --- /dev/null +++ b/backend/src/main/java/com/gpf/pethospital/controller/MedicalRecordController.java @@ -0,0 +1,50 @@ +package com.gpf.pethospital.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.gpf.pethospital.common.ApiResponse; +import com.gpf.pethospital.entity.MedicalRecord; +import com.gpf.pethospital.service.MedicalRecordService; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +@RestController +@RequestMapping("/medical-records") +public class MedicalRecordController { + private final MedicalRecordService medicalRecordService; + + public MedicalRecordController(MedicalRecordService medicalRecordService) { + this.medicalRecordService = medicalRecordService; + } + + @PreAuthorize("hasAnyRole('ADMIN','DOCTOR')") + @PostMapping + public ApiResponse create(@RequestBody MedicalRecord record) { + if (record.getStatus() == null) { + record.setStatus("DRAFT"); + } + medicalRecordService.save(record); + return ApiResponse.success("created", null); + } + + @GetMapping + public ApiResponse list(@RequestParam Long visitId) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper() + .eq(MedicalRecord::getVisitId, visitId); + return ApiResponse.success(medicalRecordService.list(wrapper)); + } + + @PreAuthorize("hasAnyRole('ADMIN','DOCTOR')") + @PutMapping("/{id}") + public ApiResponse update(@PathVariable Long id, @RequestBody MedicalRecord record) { + record.setId(id); + medicalRecordService.updateById(record); + return ApiResponse.success("updated", null); + } + + @PreAuthorize("hasRole('ADMIN')") + @DeleteMapping("/{id}") + public ApiResponse delete(@PathVariable Long id) { + medicalRecordService.removeById(id); + return ApiResponse.success("deleted", null); + } +} diff --git a/backend/src/main/java/com/gpf/pethospital/controller/MessageController.java b/backend/src/main/java/com/gpf/pethospital/controller/MessageController.java new file mode 100644 index 0000000..786a7cd --- /dev/null +++ b/backend/src/main/java/com/gpf/pethospital/controller/MessageController.java @@ -0,0 +1,65 @@ +package com.gpf.pethospital.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.gpf.pethospital.common.ApiResponse; +import com.gpf.pethospital.dto.ReplyRequest; +import com.gpf.pethospital.entity.Message; +import com.gpf.pethospital.security.AuthUser; +import com.gpf.pethospital.service.MessageService; +import com.gpf.pethospital.util.SecurityUtils; +import jakarta.validation.Valid; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import java.time.LocalDateTime; + +@RestController +@RequestMapping("/messages") +public class MessageController { + private final MessageService messageService; + + public MessageController(MessageService messageService) { + this.messageService = messageService; + } + + @PostMapping + public ApiResponse create(@RequestBody Message message) { + AuthUser user = SecurityUtils.currentUser(); + if (user != null) { + message.setUserId(user.getId()); + message.setUserName(user.getUsername()); + } + message.setStatus("PENDING"); + messageService.save(message); + return ApiResponse.success("created", null); + } + + @PreAuthorize("hasRole('ADMIN')") + @GetMapping("/admin") + public ApiResponse list(@RequestParam(defaultValue = "1") long page, + @RequestParam(defaultValue = "10") long size, + @RequestParam(required = false) String status) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + if (status != null && !status.isBlank()) { + wrapper.eq(Message::getStatus, status); + } + return ApiResponse.success(messageService.page(new Page<>(page, size), wrapper)); + } + + @PreAuthorize("hasRole('ADMIN')") + @PutMapping("/admin/{id}/reply") + public ApiResponse reply(@PathVariable Long id, @Valid @RequestBody ReplyRequest request) { + AuthUser user = SecurityUtils.currentUser(); + Message update = new Message(); + update.setId(id); + update.setReply(request.getReply()); + update.setStatus("PROCESSED"); + update.setReplyTime(LocalDateTime.now()); + if (user != null) { + update.setReplyUserId(user.getId()); + } + messageService.updateById(update); + return ApiResponse.success("updated", null); + } +} diff --git a/backend/src/main/java/com/gpf/pethospital/controller/NoticeController.java b/backend/src/main/java/com/gpf/pethospital/controller/NoticeController.java new file mode 100644 index 0000000..78ae7f2 --- /dev/null +++ b/backend/src/main/java/com/gpf/pethospital/controller/NoticeController.java @@ -0,0 +1,66 @@ +package com.gpf.pethospital.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.gpf.pethospital.common.ApiResponse; +import com.gpf.pethospital.entity.Notice; +import com.gpf.pethospital.service.NoticeService; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +@RestController +@RequestMapping +public class NoticeController { + private final NoticeService noticeService; + + public NoticeController(NoticeService noticeService) { + this.noticeService = noticeService; + } + + @GetMapping("/public/notices") + public ApiResponse publicList(@RequestParam(defaultValue = "1") long page, + @RequestParam(defaultValue = "10") long size) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper() + .eq(Notice::getStatus, 1) + .orderByDesc(Notice::getIsTop) + .orderByDesc(Notice::getCreateTime); + return ApiResponse.success(noticeService.page(new Page<>(page, size), wrapper)); + } + + @GetMapping("/public/notices/{id}") + public ApiResponse publicDetail(@PathVariable Long id) { + return ApiResponse.success(noticeService.getById(id)); + } + + @PreAuthorize("hasRole('ADMIN')") + @GetMapping("/notices") + public ApiResponse list(@RequestParam(defaultValue = "1") long page, + @RequestParam(defaultValue = "10") long size) { + return ApiResponse.success(noticeService.page(new Page<>(page, size))); + } + + @PreAuthorize("hasRole('ADMIN')") + @PostMapping("/notices") + public ApiResponse create(@RequestBody Notice notice) { + if (notice.getStatus() == null) { + notice.setStatus(1); + } + noticeService.save(notice); + return ApiResponse.success("created", null); + } + + @PreAuthorize("hasRole('ADMIN')") + @PutMapping("/notices/{id}") + public ApiResponse update(@PathVariable Long id, @RequestBody Notice notice) { + notice.setId(id); + noticeService.updateById(notice); + return ApiResponse.success("updated", null); + } + + @PreAuthorize("hasRole('ADMIN')") + @DeleteMapping("/notices/{id}") + public ApiResponse delete(@PathVariable Long id) { + noticeService.removeById(id); + return ApiResponse.success("deleted", null); + } +} diff --git a/backend/src/main/java/com/gpf/pethospital/controller/OrderController.java b/backend/src/main/java/com/gpf/pethospital/controller/OrderController.java new file mode 100644 index 0000000..42bbf41 --- /dev/null +++ b/backend/src/main/java/com/gpf/pethospital/controller/OrderController.java @@ -0,0 +1,53 @@ +package com.gpf.pethospital.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.gpf.pethospital.common.ApiResponse; +import com.gpf.pethospital.entity.Order; +import com.gpf.pethospital.security.AuthUser; +import com.gpf.pethospital.service.OrderService; +import com.gpf.pethospital.util.SecurityUtils; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +@RestController +@RequestMapping("/orders") +public class OrderController { + private final OrderService orderService; + + public OrderController(OrderService orderService) { + this.orderService = orderService; + } + + @PostMapping + public ApiResponse create(@RequestBody Order order) { + AuthUser user = SecurityUtils.currentUser(); + if (user != null && "CUSTOMER".equals(user.getRole())) { + order.setCustomerId(user.getId()); + } + if (order.getStatus() == null) { + order.setStatus("UNPAID"); + } + orderService.save(order); + return ApiResponse.success("created", null); + } + + @GetMapping + public ApiResponse list(@RequestParam(defaultValue = "1") long page, + @RequestParam(defaultValue = "10") long size) { + AuthUser user = SecurityUtils.currentUser(); + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + if (user != null && "CUSTOMER".equals(user.getRole())) { + wrapper.eq(Order::getCustomerId, user.getId()); + } + return ApiResponse.success(orderService.page(new Page<>(page, size), wrapper)); + } + + @PreAuthorize("hasAnyRole('ADMIN','DOCTOR')") + @PutMapping("/{id}") + public ApiResponse update(@PathVariable Long id, @RequestBody Order order) { + order.setId(id); + orderService.updateById(order); + return ApiResponse.success("updated", null); + } +} diff --git a/backend/src/main/java/com/gpf/pethospital/controller/PetController.java b/backend/src/main/java/com/gpf/pethospital/controller/PetController.java new file mode 100644 index 0000000..ec190bc --- /dev/null +++ b/backend/src/main/java/com/gpf/pethospital/controller/PetController.java @@ -0,0 +1,79 @@ +package com.gpf.pethospital.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.gpf.pethospital.common.ApiResponse; +import com.gpf.pethospital.entity.Pet; +import com.gpf.pethospital.security.AuthUser; +import com.gpf.pethospital.service.PetService; +import com.gpf.pethospital.util.SecurityUtils; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +@RestController +@RequestMapping("/pets") +public class PetController { + private final PetService petService; + + public PetController(PetService petService) { + this.petService = petService; + } + + @GetMapping + public ApiResponse list(@RequestParam(defaultValue = "1") long page, + @RequestParam(defaultValue = "10") long size, + @RequestParam(required = false) Long ownerId) { + AuthUser user = SecurityUtils.currentUser(); + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + if (user != null && "CUSTOMER".equals(user.getRole())) { + wrapper.eq(Pet::getOwnerId, user.getId()); + } else if (ownerId != null) { + wrapper.eq(Pet::getOwnerId, ownerId); + } + return ApiResponse.success(petService.page(new Page<>(page, size), wrapper)); + } + + @PostMapping + public ApiResponse create(@RequestBody Pet pet) { + AuthUser user = SecurityUtils.currentUser(); + if (user != null && "CUSTOMER".equals(user.getRole())) { + pet.setOwnerId(user.getId()); + } + petService.save(pet); + return ApiResponse.success("created", null); + } + + @PutMapping("/{id}") + public ApiResponse update(@PathVariable Long id, @RequestBody Pet pet) { + AuthUser user = SecurityUtils.currentUser(); + if (user != null && "CUSTOMER".equals(user.getRole())) { + Pet existing = petService.getById(id); + if (existing == null || !existing.getOwnerId().equals(user.getId())) { + return ApiResponse.error(403, "forbidden"); + } + } + pet.setId(id); + petService.updateById(pet); + return ApiResponse.success("updated", null); + } + + @DeleteMapping("/{id}") + public ApiResponse delete(@PathVariable Long id) { + AuthUser user = SecurityUtils.currentUser(); + if (user != null && "CUSTOMER".equals(user.getRole())) { + Pet existing = petService.getById(id); + if (existing == null || !existing.getOwnerId().equals(user.getId())) { + return ApiResponse.error(403, "forbidden"); + } + } + petService.removeById(id); + return ApiResponse.success("deleted", null); + } + + @PreAuthorize("hasRole('ADMIN')") + @GetMapping("/admin/all") + public ApiResponse adminList(@RequestParam(defaultValue = "1") long page, + @RequestParam(defaultValue = "10") long size) { + return ApiResponse.success(petService.page(new Page<>(page, size))); + } +} diff --git a/backend/src/main/java/com/gpf/pethospital/controller/PrescriptionController.java b/backend/src/main/java/com/gpf/pethospital/controller/PrescriptionController.java new file mode 100644 index 0000000..6651659 --- /dev/null +++ b/backend/src/main/java/com/gpf/pethospital/controller/PrescriptionController.java @@ -0,0 +1,54 @@ +package com.gpf.pethospital.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.gpf.pethospital.common.ApiResponse; +import com.gpf.pethospital.entity.Prescription; +import com.gpf.pethospital.security.AuthUser; +import com.gpf.pethospital.service.PrescriptionService; +import com.gpf.pethospital.util.SecurityUtils; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +@RestController +@RequestMapping("/prescriptions") +public class PrescriptionController { + private final PrescriptionService prescriptionService; + + public PrescriptionController(PrescriptionService prescriptionService) { + this.prescriptionService = prescriptionService; + } + + @PreAuthorize("hasAnyRole('ADMIN','DOCTOR')") + @PostMapping + public ApiResponse create(@RequestBody Prescription prescription) { + if (prescription.getStatus() == null) { + prescription.setStatus("DRAFT"); + } + prescriptionService.save(prescription); + return ApiResponse.success("created", null); + } + + @GetMapping + public ApiResponse list(@RequestParam(defaultValue = "1") long page, + @RequestParam(defaultValue = "10") long size, + @RequestParam(required = false) Long visitId) { + AuthUser user = SecurityUtils.currentUser(); + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + if (visitId != null) { + wrapper.eq(Prescription::getVisitId, visitId); + } + if (user != null && "DOCTOR".equals(user.getRole())) { + wrapper.eq(Prescription::getDoctorId, user.getId()); + } + return ApiResponse.success(prescriptionService.page(new Page<>(page, size), wrapper)); + } + + @PreAuthorize("hasAnyRole('ADMIN','DOCTOR')") + @PutMapping("/{id}") + public ApiResponse update(@PathVariable Long id, @RequestBody Prescription prescription) { + prescription.setId(id); + prescriptionService.updateById(prescription); + return ApiResponse.success("updated", null); + } +} diff --git a/backend/src/main/java/com/gpf/pethospital/controller/PrescriptionItemController.java b/backend/src/main/java/com/gpf/pethospital/controller/PrescriptionItemController.java new file mode 100644 index 0000000..153e97a --- /dev/null +++ b/backend/src/main/java/com/gpf/pethospital/controller/PrescriptionItemController.java @@ -0,0 +1,47 @@ +package com.gpf.pethospital.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.gpf.pethospital.common.ApiResponse; +import com.gpf.pethospital.entity.PrescriptionItem; +import com.gpf.pethospital.service.PrescriptionItemService; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +@RestController +@RequestMapping("/prescription-items") +public class PrescriptionItemController { + private final PrescriptionItemService prescriptionItemService; + + public PrescriptionItemController(PrescriptionItemService prescriptionItemService) { + this.prescriptionItemService = prescriptionItemService; + } + + @GetMapping + public ApiResponse list(@RequestParam Long prescriptionId) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper() + .eq(PrescriptionItem::getPrescriptionId, prescriptionId); + return ApiResponse.success(prescriptionItemService.list(wrapper)); + } + + @PreAuthorize("hasAnyRole('ADMIN','DOCTOR')") + @PostMapping + public ApiResponse create(@RequestBody PrescriptionItem item) { + prescriptionItemService.save(item); + return ApiResponse.success("created", null); + } + + @PreAuthorize("hasAnyRole('ADMIN','DOCTOR')") + @PutMapping("/{id}") + public ApiResponse update(@PathVariable Long id, @RequestBody PrescriptionItem item) { + item.setId(id); + prescriptionItemService.updateById(item); + return ApiResponse.success("updated", null); + } + + @PreAuthorize("hasAnyRole('ADMIN','DOCTOR')") + @DeleteMapping("/{id}") + public ApiResponse delete(@PathVariable Long id) { + prescriptionItemService.removeById(id); + return ApiResponse.success("deleted", null); + } +} diff --git a/backend/src/main/java/com/gpf/pethospital/controller/ReportController.java b/backend/src/main/java/com/gpf/pethospital/controller/ReportController.java new file mode 100644 index 0000000..1fc769b --- /dev/null +++ b/backend/src/main/java/com/gpf/pethospital/controller/ReportController.java @@ -0,0 +1,58 @@ +package com.gpf.pethospital.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.gpf.pethospital.common.ApiResponse; +import com.gpf.pethospital.entity.Report; +import com.gpf.pethospital.security.AuthUser; +import com.gpf.pethospital.service.ReportService; +import com.gpf.pethospital.util.SecurityUtils; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +@RestController +@RequestMapping("/reports") +public class ReportController { + private final ReportService reportService; + + public ReportController(ReportService reportService) { + this.reportService = reportService; + } + + @PreAuthorize("hasAnyRole('ADMIN','DOCTOR')") + @PostMapping + public ApiResponse create(@RequestBody Report report) { + reportService.save(report); + return ApiResponse.success("created", null); + } + + @GetMapping + public ApiResponse list(@RequestParam(defaultValue = "1") long page, + @RequestParam(defaultValue = "10") long size, + @RequestParam(required = false) Long petId) { + AuthUser user = SecurityUtils.currentUser(); + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + if (petId != null) { + wrapper.eq(Report::getPetId, petId); + } + if (user != null && "DOCTOR".equals(user.getRole())) { + wrapper.eq(Report::getDoctorId, user.getId()); + } + return ApiResponse.success(reportService.page(new Page<>(page, size), wrapper)); + } + + @PreAuthorize("hasAnyRole('ADMIN','DOCTOR')") + @PutMapping("/{id}") + public ApiResponse update(@PathVariable Long id, @RequestBody Report report) { + report.setId(id); + reportService.updateById(report); + return ApiResponse.success("updated", null); + } + + @PreAuthorize("hasRole('ADMIN')") + @DeleteMapping("/{id}") + public ApiResponse delete(@PathVariable Long id) { + reportService.removeById(id); + return ApiResponse.success("deleted", null); + } +} diff --git a/backend/src/main/java/com/gpf/pethospital/controller/StatsController.java b/backend/src/main/java/com/gpf/pethospital/controller/StatsController.java new file mode 100644 index 0000000..4ebe2ad --- /dev/null +++ b/backend/src/main/java/com/gpf/pethospital/controller/StatsController.java @@ -0,0 +1,64 @@ +package com.gpf.pethospital.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.gpf.pethospital.common.ApiResponse; +import com.gpf.pethospital.entity.Order; +import com.gpf.pethospital.entity.User; +import com.gpf.pethospital.service.AppointmentService; +import com.gpf.pethospital.service.OrderService; +import com.gpf.pethospital.service.PetService; +import com.gpf.pethospital.service.UserService; +import com.gpf.pethospital.service.VisitService; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.math.BigDecimal; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@RestController +@RequestMapping("/admin/stats") +public class StatsController { + private final OrderService orderService; + private final AppointmentService appointmentService; + private final VisitService visitService; + private final PetService petService; + private final UserService userService; + + public StatsController(OrderService orderService, + AppointmentService appointmentService, + VisitService visitService, + PetService petService, + UserService userService) { + this.orderService = orderService; + this.appointmentService = appointmentService; + this.visitService = visitService; + this.petService = petService; + this.userService = userService; + } + + @PreAuthorize("hasRole('ADMIN')") + @GetMapping + public ApiResponse summary() { + Map data = new HashMap<>(); + data.put("orders", orderService.count()); + data.put("appointments", appointmentService.count()); + data.put("visits", visitService.count()); + data.put("pets", petService.count()); + data.put("customers", userService.count(new LambdaQueryWrapper().eq(User::getRole, "CUSTOMER"))); + + QueryWrapper wrapper = new QueryWrapper<>(); + wrapper.select("SUM(amount) AS total"); + List> result = orderService.listMaps(wrapper); + BigDecimal total = BigDecimal.ZERO; + if (!result.isEmpty() && result.get(0).get("total") != null) { + total = new BigDecimal(result.get(0).get("total").toString()); + } + data.put("orderAmountTotal", total); + return ApiResponse.success(data); + } +} diff --git a/backend/src/main/java/com/gpf/pethospital/controller/StockInController.java b/backend/src/main/java/com/gpf/pethospital/controller/StockInController.java new file mode 100644 index 0000000..8335850 --- /dev/null +++ b/backend/src/main/java/com/gpf/pethospital/controller/StockInController.java @@ -0,0 +1,52 @@ +package com.gpf.pethospital.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.gpf.pethospital.common.ApiResponse; +import com.gpf.pethospital.entity.Drug; +import com.gpf.pethospital.entity.StockIn; +import com.gpf.pethospital.service.DrugService; +import com.gpf.pethospital.service.StockInService; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.bind.annotation.*; + +@RestController +@RequestMapping("/stock-in") +public class StockInController { + private final StockInService stockInService; + private final DrugService drugService; + + public StockInController(StockInService stockInService, DrugService drugService) { + this.stockInService = stockInService; + this.drugService = drugService; + } + + @PreAuthorize("hasRole('ADMIN')") + @GetMapping + public ApiResponse list(@RequestParam(defaultValue = "1") long page, + @RequestParam(defaultValue = "10") long size, + @RequestParam(required = false) Long drugId) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + if (drugId != null) { + wrapper.eq(StockIn::getDrugId, drugId); + } + return ApiResponse.success(stockInService.page(new Page<>(page, size), wrapper)); + } + + @PreAuthorize("hasRole('ADMIN')") + @PostMapping + @Transactional + public ApiResponse create(@RequestBody StockIn stockIn) { + stockInService.save(stockIn); + if (stockIn.getDrugId() != null && stockIn.getQuantity() != null) { + Drug drug = drugService.getById(stockIn.getDrugId()); + if (drug != null) { + int current = drug.getStock() == null ? 0 : drug.getStock(); + drug.setStock(current + stockIn.getQuantity()); + drugService.updateById(drug); + } + } + return ApiResponse.success("created", null); + } +} diff --git a/backend/src/main/java/com/gpf/pethospital/controller/StockOutController.java b/backend/src/main/java/com/gpf/pethospital/controller/StockOutController.java new file mode 100644 index 0000000..152d8b6 --- /dev/null +++ b/backend/src/main/java/com/gpf/pethospital/controller/StockOutController.java @@ -0,0 +1,52 @@ +package com.gpf.pethospital.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.gpf.pethospital.common.ApiResponse; +import com.gpf.pethospital.entity.Drug; +import com.gpf.pethospital.entity.StockOut; +import com.gpf.pethospital.service.DrugService; +import com.gpf.pethospital.service.StockOutService; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.bind.annotation.*; + +@RestController +@RequestMapping("/stock-out") +public class StockOutController { + private final StockOutService stockOutService; + private final DrugService drugService; + + public StockOutController(StockOutService stockOutService, DrugService drugService) { + this.stockOutService = stockOutService; + this.drugService = drugService; + } + + @PreAuthorize("hasRole('ADMIN')") + @GetMapping + public ApiResponse list(@RequestParam(defaultValue = "1") long page, + @RequestParam(defaultValue = "10") long size, + @RequestParam(required = false) Long drugId) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + if (drugId != null) { + wrapper.eq(StockOut::getDrugId, drugId); + } + return ApiResponse.success(stockOutService.page(new Page<>(page, size), wrapper)); + } + + @PreAuthorize("hasRole('ADMIN')") + @PostMapping + @Transactional + public ApiResponse create(@RequestBody StockOut stockOut) { + stockOutService.save(stockOut); + if (stockOut.getDrugId() != null && stockOut.getQuantity() != null) { + Drug drug = drugService.getById(stockOut.getDrugId()); + if (drug != null) { + int current = drug.getStock() == null ? 0 : drug.getStock(); + drug.setStock(Math.max(0, current - stockOut.getQuantity())); + drugService.updateById(drug); + } + } + return ApiResponse.success("created", null); + } +} diff --git a/backend/src/main/java/com/gpf/pethospital/controller/UserController.java b/backend/src/main/java/com/gpf/pethospital/controller/UserController.java new file mode 100644 index 0000000..b0f7f0a --- /dev/null +++ b/backend/src/main/java/com/gpf/pethospital/controller/UserController.java @@ -0,0 +1,115 @@ +package com.gpf.pethospital.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.gpf.pethospital.common.ApiResponse; +import com.gpf.pethospital.entity.User; +import com.gpf.pethospital.security.AuthUser; +import com.gpf.pethospital.service.UserService; +import com.gpf.pethospital.util.SecurityUtils; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.web.bind.annotation.*; + +import java.util.HashMap; +import java.util.Map; + +@RestController +@RequestMapping("/users") +public class UserController { + private final UserService userService; + private final PasswordEncoder passwordEncoder; + + public UserController(UserService userService, PasswordEncoder passwordEncoder) { + this.userService = userService; + this.passwordEncoder = passwordEncoder; + } + + @GetMapping("/me") + public ApiResponse me() { + AuthUser authUser = SecurityUtils.currentUser(); + if (authUser == null) { + return ApiResponse.error(401, "unauthorized"); + } + User user = userService.getById(authUser.getId()); + if (user != null) { + user.setPassword(null); + } + return ApiResponse.success(user); + } + + @PutMapping("/me") + public ApiResponse updateMe(@RequestBody User payload) { + AuthUser authUser = SecurityUtils.currentUser(); + if (authUser == null) { + return ApiResponse.error(401, "unauthorized"); + } + User update = new User(); + update.setId(authUser.getId()); + update.setUsername(payload.getUsername()); + update.setPhone(payload.getPhone()); + update.setEmail(payload.getEmail()); + update.setAvatar(payload.getAvatar()); + userService.updateById(update); + return ApiResponse.success("updated", null); + } + + @PreAuthorize("hasRole('ADMIN')") + @GetMapping + public ApiResponse list(@RequestParam(defaultValue = "1") long page, + @RequestParam(defaultValue = "10") long size, + @RequestParam(required = false) String role) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + if (role != null && !role.isBlank()) { + wrapper.eq(User::getRole, role); + } + Page result = userService.page(new Page<>(page, size), wrapper); + result.getRecords().forEach(u -> u.setPassword(null)); + return ApiResponse.success(result); + } + + @PreAuthorize("hasRole('ADMIN')") + @PostMapping + public ApiResponse create(@RequestBody User user) { + if (user.getPassword() == null || user.getPassword().isBlank()) { + return ApiResponse.error(400, "password required"); + } + user.setPassword(passwordEncoder.encode(user.getPassword())); + if (user.getStatus() == null) { + user.setStatus(1); + } + userService.save(user); + return ApiResponse.success("created", null); + } + + @PreAuthorize("hasRole('ADMIN')") + @PutMapping("/{id}/status") + public ApiResponse updateStatus(@PathVariable Long id, @RequestParam Integer status) { + User update = new User(); + update.setId(id); + update.setStatus(status); + userService.updateById(update); + return ApiResponse.success("updated", null); + } + + @PreAuthorize("hasRole('ADMIN')") + @PutMapping("/{id}/reset-password") + public ApiResponse resetPassword(@PathVariable Long id, @RequestParam String newPassword) { + User update = new User(); + update.setId(id); + update.setPassword(passwordEncoder.encode(newPassword)); + userService.updateById(update); + return ApiResponse.success("updated", null); + } + + @PreAuthorize("hasRole('ADMIN')") + @GetMapping("/stats") + public ApiResponse stats() { + Map data = new HashMap<>(); + data.put("total", userService.count()); + data.put("admins", userService.count(new LambdaQueryWrapper().eq(User::getRole, "ADMIN"))); + data.put("doctors", userService.count(new LambdaQueryWrapper().eq(User::getRole, "DOCTOR"))); + data.put("customers", userService.count(new LambdaQueryWrapper().eq(User::getRole, "CUSTOMER"))); + return ApiResponse.success(data); + } +} diff --git a/backend/src/main/java/com/gpf/pethospital/controller/VaccineRecordController.java b/backend/src/main/java/com/gpf/pethospital/controller/VaccineRecordController.java new file mode 100644 index 0000000..6878514 --- /dev/null +++ b/backend/src/main/java/com/gpf/pethospital/controller/VaccineRecordController.java @@ -0,0 +1,59 @@ +package com.gpf.pethospital.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.gpf.pethospital.common.ApiResponse; +import com.gpf.pethospital.entity.Pet; +import com.gpf.pethospital.entity.VaccineRecord; +import com.gpf.pethospital.security.AuthUser; +import com.gpf.pethospital.service.PetService; +import com.gpf.pethospital.service.VaccineRecordService; +import com.gpf.pethospital.util.SecurityUtils; +import org.springframework.web.bind.annotation.*; + +@RestController +@RequestMapping("/vaccines") +public class VaccineRecordController { + private final VaccineRecordService vaccineRecordService; + private final PetService petService; + + public VaccineRecordController(VaccineRecordService vaccineRecordService, PetService petService) { + this.vaccineRecordService = vaccineRecordService; + this.petService = petService; + } + + @GetMapping + public ApiResponse list(@RequestParam Long petId, + @RequestParam(defaultValue = "1") long page, + @RequestParam(defaultValue = "10") long size) { + AuthUser user = SecurityUtils.currentUser(); + if (user != null && "CUSTOMER".equals(user.getRole())) { + Pet pet = petService.getById(petId); + if (pet == null || !pet.getOwnerId().equals(user.getId())) { + return ApiResponse.error(403, "forbidden"); + } + } + LambdaQueryWrapper wrapper = new LambdaQueryWrapper() + .eq(VaccineRecord::getPetId, petId); + return ApiResponse.success(vaccineRecordService.page(new Page<>(page, size), wrapper)); + } + + @PostMapping + public ApiResponse create(@RequestBody VaccineRecord record) { + vaccineRecordService.save(record); + return ApiResponse.success("created", null); + } + + @PutMapping("/{id}") + public ApiResponse update(@PathVariable Long id, @RequestBody VaccineRecord record) { + record.setId(id); + vaccineRecordService.updateById(record); + return ApiResponse.success("updated", null); + } + + @DeleteMapping("/{id}") + public ApiResponse delete(@PathVariable Long id) { + vaccineRecordService.removeById(id); + return ApiResponse.success("deleted", null); + } +} diff --git a/backend/src/main/java/com/gpf/pethospital/controller/VisitController.java b/backend/src/main/java/com/gpf/pethospital/controller/VisitController.java new file mode 100644 index 0000000..beb881f --- /dev/null +++ b/backend/src/main/java/com/gpf/pethospital/controller/VisitController.java @@ -0,0 +1,57 @@ +package com.gpf.pethospital.controller; + +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.gpf.pethospital.common.ApiResponse; +import com.gpf.pethospital.entity.Visit; +import com.gpf.pethospital.security.AuthUser; +import com.gpf.pethospital.service.VisitService; +import com.gpf.pethospital.util.SecurityUtils; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +@RestController +@RequestMapping("/visits") +public class VisitController { + private final VisitService visitService; + + public VisitController(VisitService visitService) { + this.visitService = visitService; + } + + @PreAuthorize("hasAnyRole('ADMIN','DOCTOR')") + @PostMapping + public ApiResponse create(@RequestBody Visit visit) { + if (visit.getStatus() == null) { + visit.setStatus("IN_PROGRESS"); + } + if (visit.getPaymentStatus() == null) { + visit.setPaymentStatus("UNPAID"); + } + visitService.save(visit); + return ApiResponse.success("created", null); + } + + @GetMapping + public ApiResponse list(@RequestParam(defaultValue = "1") long page, + @RequestParam(defaultValue = "10") long size) { + AuthUser user = SecurityUtils.currentUser(); + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + if (user != null) { + if ("CUSTOMER".equals(user.getRole())) { + wrapper.eq(Visit::getCustomerId, user.getId()); + } else if ("DOCTOR".equals(user.getRole())) { + wrapper.eq(Visit::getDoctorId, user.getId()); + } + } + return ApiResponse.success(visitService.page(new Page<>(page, size), wrapper)); + } + + @PreAuthorize("hasAnyRole('ADMIN','DOCTOR')") + @PutMapping("/{id}") + public ApiResponse update(@PathVariable Long id, @RequestBody Visit visit) { + visit.setId(id); + visitService.updateById(visit); + return ApiResponse.success("updated", null); + } +} diff --git a/backend/src/main/java/com/gpf/pethospital/dto/LoginRequest.java b/backend/src/main/java/com/gpf/pethospital/dto/LoginRequest.java new file mode 100644 index 0000000..8fbd115 --- /dev/null +++ b/backend/src/main/java/com/gpf/pethospital/dto/LoginRequest.java @@ -0,0 +1,26 @@ +package com.gpf.pethospital.dto; + +import jakarta.validation.constraints.NotBlank; + +public class LoginRequest { + @NotBlank + private String account; + @NotBlank + private String password; + + public String getAccount() { + return account; + } + + public void setAccount(String account) { + this.account = account; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } +} diff --git a/backend/src/main/java/com/gpf/pethospital/dto/RegisterRequest.java b/backend/src/main/java/com/gpf/pethospital/dto/RegisterRequest.java new file mode 100644 index 0000000..011cb1b --- /dev/null +++ b/backend/src/main/java/com/gpf/pethospital/dto/RegisterRequest.java @@ -0,0 +1,46 @@ +package com.gpf.pethospital.dto; + +import jakarta.validation.constraints.Email; +import jakarta.validation.constraints.NotBlank; + +public class RegisterRequest { + @NotBlank + private String username; + private String phone; + @Email + private String email; + @NotBlank + private String password; + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public String getPhone() { + return phone; + } + + public void setPhone(String phone) { + this.phone = phone; + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } +} diff --git a/backend/src/main/java/com/gpf/pethospital/dto/ReplyRequest.java b/backend/src/main/java/com/gpf/pethospital/dto/ReplyRequest.java new file mode 100644 index 0000000..868b5cd --- /dev/null +++ b/backend/src/main/java/com/gpf/pethospital/dto/ReplyRequest.java @@ -0,0 +1,16 @@ +package com.gpf.pethospital.dto; + +import jakarta.validation.constraints.NotBlank; + +public class ReplyRequest { + @NotBlank + private String reply; + + public String getReply() { + return reply; + } + + public void setReply(String reply) { + this.reply = reply; + } +} diff --git a/backend/src/main/java/com/gpf/pethospital/entity/Appointment.java b/backend/src/main/java/com/gpf/pethospital/entity/Appointment.java new file mode 100644 index 0000000..2de36d7 --- /dev/null +++ b/backend/src/main/java/com/gpf/pethospital/entity/Appointment.java @@ -0,0 +1,83 @@ +package com.gpf.pethospital.entity; + +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.experimental.Accessors; + +import java.time.LocalDate; +import java.time.LocalDateTime; + +/** + * 门诊预约实体 + */ +@Data +@Accessors(chain = true) +@TableName("appointment") +public class Appointment { + + @TableId(type = IdType.AUTO) + private Long id; + + /** + * 顾客ID + */ + private Long customerId; + + /** + * 宠物ID + */ + private Long petId; + + /** + * 预约医生ID(可为空,表示不指定医生) + */ + private Long doctorId; + + /** + * 科室 + */ + private String department; + + /** + * 预约日期 + */ + private LocalDate appointmentDate; + + /** + * 预约时段(例如:09:00-10:00) + */ + private String timeSlot; + + /** + * 预约状态:PENDING-待确认, CONFIRMED-已确认, ARRIVED-已到诊, CANCELLED-已取消, NO_SHOW-爽约 + */ + private String status; + + /** + * 备注 + */ + private String remark; + + /** + * 取消时间 + */ + private LocalDateTime cancelTime; + + /** + * 创建时间 + */ + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** + * 更新时间 + */ + @TableField(fill = FieldFill.INSERT_UPDATE) + private LocalDateTime updateTime; + + /** + * 删除标记:0-未删除, 1-已删除 + */ + @TableLogic + private Integer deleted; +} diff --git a/backend/src/main/java/com/gpf/pethospital/entity/Drug.java b/backend/src/main/java/com/gpf/pethospital/entity/Drug.java new file mode 100644 index 0000000..d46c5d2 --- /dev/null +++ b/backend/src/main/java/com/gpf/pethospital/entity/Drug.java @@ -0,0 +1,93 @@ +package com.gpf.pethospital.entity; + +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.experimental.Accessors; + +import java.math.BigDecimal; +import java.time.LocalDateTime; + +/** + * 药品实体 + */ +@Data +@Accessors(chain = true) +@TableName("drug") +public class Drug { + + @TableId(type = IdType.AUTO) + private Long id; + + /** + * 药品名称 + */ + private String name; + + /** + * 规格 + */ + private String specification; + + /** + * 单位(如:片、盒、瓶) + */ + private String unit; + + /** + * 当前库存数量 + */ + private Integer stock; + + /** + * 预警阈值 + */ + private Integer alertThreshold; + + /** + * 进价 + */ + private BigDecimal purchasePrice; + + /** + * 售价 + */ + private BigDecimal salePrice; + + /** + * 生产厂家 + */ + private String manufacturer; + + /** + * 批准文号 + */ + private String approvalNumber; + + /** + * 有效期 + */ + private LocalDateTime expiryDate; + + /** + * 状态:0-禁用, 1-启用 + */ + private Integer status; + + /** + * 创建时间 + */ + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** + * 更新时间 + */ + @TableField(fill = FieldFill.INSERT_UPDATE) + private LocalDateTime updateTime; + + /** + * 删除标记:0-未删除, 1-已删除 + */ + @TableLogic + private Integer deleted; +} diff --git a/backend/src/main/java/com/gpf/pethospital/entity/MedicalRecord.java b/backend/src/main/java/com/gpf/pethospital/entity/MedicalRecord.java new file mode 100644 index 0000000..a056ec4 --- /dev/null +++ b/backend/src/main/java/com/gpf/pethospital/entity/MedicalRecord.java @@ -0,0 +1,82 @@ +package com.gpf.pethospital.entity; + +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.experimental.Accessors; + +import java.time.LocalDateTime; + +/** + * 病历实体 + */ +@Data +@Accessors(chain = true) +@TableName("medical_record") +public class MedicalRecord { + + @TableId(type = IdType.AUTO) + private Long id; + + /** + * 就诊记录ID + */ + private Long visitId; + + /** + * 主诉 + */ + private String chiefComplaint; + + /** + * 现病史 + */ + private String presentIllness; + + /** + * 体格检查 + */ + private String physicalExamination; + + /** + * 检查结果 + */ + private String examinationResults; + + /** + * 诊断结论 + */ + private String diagnosis; + + /** + * 治疗方案 + */ + private String treatmentPlan; + + /** + * 医嘱 + */ + private String advice; + + /** + * 状态:DRAFT-草稿, COMPLETED-已完成 + */ + private String status; + + /** + * 创建时间 + */ + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** + * 更新时间 + */ + @TableField(fill = FieldFill.INSERT_UPDATE) + private LocalDateTime updateTime; + + /** + * 删除标记:0-未删除, 1-已删除 + */ + @TableLogic + private Integer deleted; +} diff --git a/backend/src/main/java/com/gpf/pethospital/entity/Message.java b/backend/src/main/java/com/gpf/pethospital/entity/Message.java new file mode 100644 index 0000000..fd040f1 --- /dev/null +++ b/backend/src/main/java/com/gpf/pethospital/entity/Message.java @@ -0,0 +1,82 @@ +package com.gpf.pethospital.entity; + +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.experimental.Accessors; + +import java.time.LocalDateTime; + +/** + * 留言实体 + */ +@Data +@Accessors(chain = true) +@TableName("message") +public class Message { + + @TableId(type = IdType.AUTO) + private Long id; + + /** + * 留言人ID + */ + private Long userId; + + /** + * 留言人姓名 + */ + private String userName; + + /** + * 联系方式 + */ + private String contact; + + /** + * 标题 + */ + private String title; + + /** + * 内容 + */ + private String content; + + /** + * 处理状态:PENDING-待处理, PROCESSED-已处理 + */ + private String status; + + /** + * 回复内容 + */ + private String reply; + + /** + * 回复时间 + */ + private LocalDateTime replyTime; + + /** + * 回复者ID + */ + private Long replyUserId; + + /** + * 创建时间 + */ + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** + * 更新时间 + */ + @TableField(fill = FieldFill.INSERT_UPDATE) + private LocalDateTime updateTime; + + /** + * 删除标记:0-未删除, 1-已删除 + */ + @TableLogic + private Integer deleted; +} diff --git a/backend/src/main/java/com/gpf/pethospital/entity/Notice.java b/backend/src/main/java/com/gpf/pethospital/entity/Notice.java new file mode 100644 index 0000000..633be31 --- /dev/null +++ b/backend/src/main/java/com/gpf/pethospital/entity/Notice.java @@ -0,0 +1,62 @@ +package com.gpf.pethospital.entity; + +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.experimental.Accessors; + +import java.time.LocalDateTime; + +/** + * 公告实体 + */ +@Data +@Accessors(chain = true) +@TableName("notice") +public class Notice { + + @TableId(type = IdType.AUTO) + private Long id; + + /** + * 标题 + */ + private String title; + + /** + * 内容 + */ + private String content; + + /** + * 是否置顶:0-否, 1-是 + */ + private Integer isTop; + + /** + * 状态:0-下架, 1-上架 + */ + private Integer status; + + /** + * 发布者ID + */ + private Long publisherId; + + /** + * 创建时间 + */ + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** + * 更新时间 + */ + @TableField(fill = FieldFill.INSERT_UPDATE) + private LocalDateTime updateTime; + + /** + * 删除标记:0-未删除, 1-已删除 + */ + @TableLogic + private Integer deleted; +} diff --git a/backend/src/main/java/com/gpf/pethospital/entity/Order.java b/backend/src/main/java/com/gpf/pethospital/entity/Order.java new file mode 100644 index 0000000..5901b47 --- /dev/null +++ b/backend/src/main/java/com/gpf/pethospital/entity/Order.java @@ -0,0 +1,78 @@ +package com.gpf.pethospital.entity; + +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableLogic; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.annotation.IdType; +import lombok.Data; +import lombok.experimental.Accessors; + +import java.math.BigDecimal; +import java.time.LocalDateTime; + +/** + * 订单实体 + */ +@Data +@Accessors(chain = true) +@TableName("order_info") +public class Order { + + @TableId(type = IdType.AUTO) + private Long id; + + /** + * 就诊记录ID + */ + private Long visitId; + + /** + * 顾客ID + */ + private Long customerId; + + /** + * 订单金额 + */ + private BigDecimal amount; + + /** + * 订单状态:UNPAID-未支付, PAID-已支付, CANCELLED-已取消, REFUNDING-退款中, REFUNDED-已退款 + */ + private String status; + + /** + * 支付方式:OFFLINE-线下支付, ALIPAY-支付宝, WECHAT-微信支付 + */ + private String paymentMethod; + + /** + * 支付时间 + */ + private LocalDateTime paymentTime; + + /** + * 备注 + */ + private String remark; + + /** + * 创建时间 + */ + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** + * 更新时间 + */ + @TableField(fill = FieldFill.INSERT_UPDATE) + private LocalDateTime updateTime; + + /** + * 删除标记:0-未删除, 1-已删除 + */ + @TableLogic + private Integer deleted; +} diff --git a/backend/src/main/java/com/gpf/pethospital/entity/Pet.java b/backend/src/main/java/com/gpf/pethospital/entity/Pet.java new file mode 100644 index 0000000..3cd3f98 --- /dev/null +++ b/backend/src/main/java/com/gpf/pethospital/entity/Pet.java @@ -0,0 +1,78 @@ +package com.gpf.pethospital.entity; + +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.experimental.Accessors; + +import java.time.LocalDate; +import java.time.LocalDateTime; + +/** + * 宠物实体 + */ +@Data +@Accessors(chain = true) +@TableName("pet") +public class Pet { + + @TableId(type = IdType.AUTO) + private Long id; + + /** + * 宠物主人ID + */ + private Long ownerId; + + /** + * 宠物名称 + */ + private String name; + + /** + * 品种 + */ + private String breed; + + /** + * 性别:MALE-雄性, FEMALE-雌性 + */ + private String gender; + + /** + * 生日 + */ + private LocalDate birthday; + + /** + * 体重(kg) + */ + private Double weight; + + /** + * 照片URL + */ + private String photo; + + /** + * 备注 + */ + private String remark; + + /** + * 创建时间 + */ + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** + * 更新时间 + */ + @TableField(fill = FieldFill.INSERT_UPDATE) + private LocalDateTime updateTime; + + /** + * 删除标记:0-未删除, 1-已删除 + */ + @TableLogic + private Integer deleted; +} diff --git a/backend/src/main/java/com/gpf/pethospital/entity/Prescription.java b/backend/src/main/java/com/gpf/pethospital/entity/Prescription.java new file mode 100644 index 0000000..03879bf --- /dev/null +++ b/backend/src/main/java/com/gpf/pethospital/entity/Prescription.java @@ -0,0 +1,57 @@ +package com.gpf.pethospital.entity; + +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.experimental.Accessors; + +import java.time.LocalDateTime; + +/** + * 处方实体 + */ +@Data +@Accessors(chain = true) +@TableName("prescription") +public class Prescription { + + @TableId(type = IdType.AUTO) + private Long id; + + /** + * 就诊记录ID + */ + private Long visitId; + + /** + * 医生ID + */ + private Long doctorId; + + /** + * 处方状态:DRAFT-草稿, SUBMITTED-已提交, ISSUED-已发药, VOIDED-已作废 + */ + private String status; + + /** + * 备注 + */ + private String remark; + + /** + * 创建时间 + */ + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** + * 更新时间 + */ + @TableField(fill = FieldFill.INSERT_UPDATE) + private LocalDateTime updateTime; + + /** + * 删除标记:0-未删除, 1-已删除 + */ + @TableLogic + private Integer deleted; +} diff --git a/backend/src/main/java/com/gpf/pethospital/entity/PrescriptionItem.java b/backend/src/main/java/com/gpf/pethospital/entity/PrescriptionItem.java new file mode 100644 index 0000000..9cf5d7c --- /dev/null +++ b/backend/src/main/java/com/gpf/pethospital/entity/PrescriptionItem.java @@ -0,0 +1,83 @@ +package com.gpf.pethospital.entity; + +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.experimental.Accessors; + +import java.math.BigDecimal; +import java.time.LocalDateTime; + +/** + * 处方明细实体 + */ +@Data +@Accessors(chain = true) +@TableName("prescription_item") +public class PrescriptionItem { + + @TableId(type = IdType.AUTO) + private Long id; + + /** + * 处方ID + */ + private Long prescriptionId; + + /** + * 药品ID + */ + private Long drugId; + + /** + * 药品名称(冗余字段,方便查询) + */ + private String drugName; + + /** + * 规格 + */ + private String specification; + + /** + * 数量 + */ + private Integer quantity; + + /** + * 用法用量 + */ + private String usage; + + /** + * 用药天数 + */ + private Integer days; + + /** + * 单价 + */ + private BigDecimal unitPrice; + + /** + * 小计 + */ + private BigDecimal subtotal; + + /** + * 创建时间 + */ + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** + * 更新时间 + */ + @TableField(fill = FieldFill.INSERT_UPDATE) + private LocalDateTime updateTime; + + /** + * 删除标记:0-未删除, 1-已删除 + */ + @TableLogic + private Integer deleted; +} diff --git a/backend/src/main/java/com/gpf/pethospital/entity/Report.java b/backend/src/main/java/com/gpf/pethospital/entity/Report.java new file mode 100644 index 0000000..86bcb7f --- /dev/null +++ b/backend/src/main/java/com/gpf/pethospital/entity/Report.java @@ -0,0 +1,72 @@ +package com.gpf.pethospital.entity; + +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.experimental.Accessors; + +import java.time.LocalDateTime; + +/** + * 检查报告实体 + */ +@Data +@Accessors(chain = true) +@TableName("report") +public class Report { + + @TableId(type = IdType.AUTO) + private Long id; + + /** + * 就诊记录ID + */ + private Long visitId; + + /** + * 宠物ID + */ + private Long petId; + + /** + * 报告类型(如:血常规、X光、B超等) + */ + private String type; + + /** + * 报告名称 + */ + private String title; + + /** + * 报告内容摘要 + */ + private String summary; + + /** + * 附件URL(图片或PDF) + */ + private String attachmentUrl; + + /** + * 检查医生ID + */ + private Long doctorId; + + /** + * 创建时间 + */ + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** + * 更新时间 + */ + @TableField(fill = FieldFill.INSERT_UPDATE) + private LocalDateTime updateTime; + + /** + * 删除标记:0-未删除, 1-已删除 + */ + @TableLogic + private Integer deleted; +} diff --git a/backend/src/main/java/com/gpf/pethospital/entity/StockIn.java b/backend/src/main/java/com/gpf/pethospital/entity/StockIn.java new file mode 100644 index 0000000..0bc96fc --- /dev/null +++ b/backend/src/main/java/com/gpf/pethospital/entity/StockIn.java @@ -0,0 +1,67 @@ +package com.gpf.pethospital.entity; + +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableLogic; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.annotation.IdType; +import lombok.Data; +import lombok.experimental.Accessors; + +import java.time.LocalDateTime; + +/** + * 入库流水实体 + */ +@Data +@Accessors(chain = true) +@TableName("stock_in") +public class StockIn { + + @TableId(type = IdType.AUTO) + private Long id; + + /** + * 药品ID + */ + private Long drugId; + + /** + * 入库数量 + */ + private Integer quantity; + + /** + * 经办人ID + */ + private Long operatorId; + + /** + * 入库时间 + */ + private LocalDateTime stockInTime; + + /** + * 备注 + */ + private String remark; + + /** + * 创建时间 + */ + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** + * 更新时间 + */ + @TableField(fill = FieldFill.INSERT_UPDATE) + private LocalDateTime updateTime; + + /** + * 删除标记:0-未删除, 1-已删除 + */ + @TableLogic + private Integer deleted; +} diff --git a/backend/src/main/java/com/gpf/pethospital/entity/StockOut.java b/backend/src/main/java/com/gpf/pethospital/entity/StockOut.java new file mode 100644 index 0000000..23cc3ad --- /dev/null +++ b/backend/src/main/java/com/gpf/pethospital/entity/StockOut.java @@ -0,0 +1,72 @@ +package com.gpf.pethospital.entity; + +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableLogic; +import com.baomidou.mybatisplus.annotation.TableName; +import com.baomidou.mybatisplus.annotation.IdType; +import lombok.Data; +import lombok.experimental.Accessors; + +import java.time.LocalDateTime; + +/** + * 出库/消耗流水实体 + */ +@Data +@Accessors(chain = true) +@TableName("stock_out") +public class StockOut { + + @TableId(type = IdType.AUTO) + private Long id; + + /** + * 药品ID + */ + private Long drugId; + + /** + * 处方ID(可为空) + */ + private Long prescriptionId; + + /** + * 出库数量 + */ + private Integer quantity; + + /** + * 经办人ID + */ + private Long operatorId; + + /** + * 出库时间 + */ + private LocalDateTime stockOutTime; + + /** + * 备注 + */ + private String remark; + + /** + * 创建时间 + */ + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** + * 更新时间 + */ + @TableField(fill = FieldFill.INSERT_UPDATE) + private LocalDateTime updateTime; + + /** + * 删除标记:0-未删除, 1-已删除 + */ + @TableLogic + private Integer deleted; +} diff --git a/backend/src/main/java/com/gpf/pethospital/entity/User.java b/backend/src/main/java/com/gpf/pethospital/entity/User.java new file mode 100644 index 0000000..adbb94e --- /dev/null +++ b/backend/src/main/java/com/gpf/pethospital/entity/User.java @@ -0,0 +1,72 @@ +package com.gpf.pethospital.entity; + +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.experimental.Accessors; + +import java.time.LocalDateTime; + +/** + * 用户实体 + */ +@Data +@Accessors(chain = true) +@TableName("`user`") +public class User { + + @TableId(type = IdType.AUTO) + private Long id; + + /** + * 用户名/姓名 + */ + private String username; + + /** + * 手机号 + */ + private String phone; + + /** + * 邮箱 + */ + private String email; + + /** + * 密码(加密后) + */ + private String password; + + /** + * 角色:ADMIN-管理员, DOCTOR-医生, CUSTOMER-顾客 + */ + private String role; + + /** + * 状态:0-禁用, 1-启用 + */ + private Integer status; + + /** + * 头像URL + */ + private String avatar; + + /** + * 创建时间 + */ + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** + * 更新时间 + */ + @TableField(fill = FieldFill.INSERT_UPDATE) + private LocalDateTime updateTime; + + /** + * 删除标记:0-未删除, 1-已删除 + */ + @TableLogic + private Integer deleted; +} diff --git a/backend/src/main/java/com/gpf/pethospital/entity/VaccineRecord.java b/backend/src/main/java/com/gpf/pethospital/entity/VaccineRecord.java new file mode 100644 index 0000000..40ff488 --- /dev/null +++ b/backend/src/main/java/com/gpf/pethospital/entity/VaccineRecord.java @@ -0,0 +1,68 @@ +package com.gpf.pethospital.entity; + +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.experimental.Accessors; + +import java.time.LocalDate; +import java.time.LocalDateTime; + +/** + * 疫苗/驱虫记录实体 + */ +@Data +@Accessors(chain = true) +@TableName("vaccine_record") +public class VaccineRecord { + + @TableId(type = IdType.AUTO) + private Long id; + + /** + * 宠物ID + */ + private Long petId; + + /** + * 记录类型:VACCINE-疫苗, DEWORMING-驱虫 + */ + private String type; + + /** + * 项目名称(如:狂犬疫苗、体内驱虫等) + */ + private String itemName; + + /** + * 执行日期 + */ + private LocalDate executeDate; + + /** + * 下次提醒日期 + */ + private LocalDate nextReminderDate; + + /** + * 备注 + */ + private String remark; + + /** + * 创建时间 + */ + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** + * 更新时间 + */ + @TableField(fill = FieldFill.INSERT_UPDATE) + private LocalDateTime updateTime; + + /** + * 删除标记:0-未删除, 1-已删除 + */ + @TableLogic + private Integer deleted; +} diff --git a/backend/src/main/java/com/gpf/pethospital/entity/Visit.java b/backend/src/main/java/com/gpf/pethospital/entity/Visit.java new file mode 100644 index 0000000..952d95a --- /dev/null +++ b/backend/src/main/java/com/gpf/pethospital/entity/Visit.java @@ -0,0 +1,93 @@ +package com.gpf.pethospital.entity; + +import com.baomidou.mybatisplus.annotation.*; +import lombok.Data; +import lombok.experimental.Accessors; + +import java.math.BigDecimal; +import java.time.LocalDateTime; + +/** + * 就诊记录实体 + */ +@Data +@Accessors(chain = true) +@TableName("visit") +public class Visit { + + @TableId(type = IdType.AUTO) + private Long id; + + /** + * 预约ID(可为空,现场挂号无预约) + */ + private Long appointmentId; + + /** + * 顾客ID + */ + private Long customerId; + + /** + * 宠物ID + */ + private Long petId; + + /** + * 接诊医生ID + */ + private Long doctorId; + + /** + * 就诊状态:IN_PROGRESS-就诊中, COMPLETED-已完成 + */ + private String status; + + /** + * 总费用 + */ + private BigDecimal totalAmount; + + /** + * 支付状态:UNPAID-未支付, PAID-已支付, REFUNDING-退款中, REFUNDED-已退款 + */ + private String paymentStatus; + + /** + * 支付方式:OFFLINE-线下支付, ALIPAY-支付宝, WECHAT-微信支付 + */ + private String paymentMethod; + + /** + * 支付时间 + */ + private LocalDateTime paymentTime; + + /** + * 开始就诊时间 + */ + private LocalDateTime startTime; + + /** + * 结束就诊时间 + */ + private LocalDateTime endTime; + + /** + * 创建时间 + */ + @TableField(fill = FieldFill.INSERT) + private LocalDateTime createTime; + + /** + * 更新时间 + */ + @TableField(fill = FieldFill.INSERT_UPDATE) + private LocalDateTime updateTime; + + /** + * 删除标记:0-未删除, 1-已删除 + */ + @TableLogic + private Integer deleted; +} diff --git a/backend/src/main/java/com/gpf/pethospital/mapper/AppointmentMapper.java b/backend/src/main/java/com/gpf/pethospital/mapper/AppointmentMapper.java new file mode 100644 index 0000000..48cda86 --- /dev/null +++ b/backend/src/main/java/com/gpf/pethospital/mapper/AppointmentMapper.java @@ -0,0 +1,9 @@ +package com.gpf.pethospital.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.gpf.pethospital.entity.Appointment; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface AppointmentMapper extends BaseMapper { +} diff --git a/backend/src/main/java/com/gpf/pethospital/mapper/DrugMapper.java b/backend/src/main/java/com/gpf/pethospital/mapper/DrugMapper.java new file mode 100644 index 0000000..93bc8ad --- /dev/null +++ b/backend/src/main/java/com/gpf/pethospital/mapper/DrugMapper.java @@ -0,0 +1,9 @@ +package com.gpf.pethospital.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.gpf.pethospital.entity.Drug; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface DrugMapper extends BaseMapper { +} diff --git a/backend/src/main/java/com/gpf/pethospital/mapper/MedicalRecordMapper.java b/backend/src/main/java/com/gpf/pethospital/mapper/MedicalRecordMapper.java new file mode 100644 index 0000000..2917944 --- /dev/null +++ b/backend/src/main/java/com/gpf/pethospital/mapper/MedicalRecordMapper.java @@ -0,0 +1,9 @@ +package com.gpf.pethospital.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.gpf.pethospital.entity.MedicalRecord; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface MedicalRecordMapper extends BaseMapper { +} diff --git a/backend/src/main/java/com/gpf/pethospital/mapper/MessageMapper.java b/backend/src/main/java/com/gpf/pethospital/mapper/MessageMapper.java new file mode 100644 index 0000000..e356ead --- /dev/null +++ b/backend/src/main/java/com/gpf/pethospital/mapper/MessageMapper.java @@ -0,0 +1,9 @@ +package com.gpf.pethospital.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.gpf.pethospital.entity.Message; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface MessageMapper extends BaseMapper { +} diff --git a/backend/src/main/java/com/gpf/pethospital/mapper/NoticeMapper.java b/backend/src/main/java/com/gpf/pethospital/mapper/NoticeMapper.java new file mode 100644 index 0000000..f2a9002 --- /dev/null +++ b/backend/src/main/java/com/gpf/pethospital/mapper/NoticeMapper.java @@ -0,0 +1,9 @@ +package com.gpf.pethospital.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.gpf.pethospital.entity.Notice; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface NoticeMapper extends BaseMapper { +} diff --git a/backend/src/main/java/com/gpf/pethospital/mapper/OrderMapper.java b/backend/src/main/java/com/gpf/pethospital/mapper/OrderMapper.java new file mode 100644 index 0000000..50993aa --- /dev/null +++ b/backend/src/main/java/com/gpf/pethospital/mapper/OrderMapper.java @@ -0,0 +1,9 @@ +package com.gpf.pethospital.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.gpf.pethospital.entity.Order; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface OrderMapper extends BaseMapper { +} diff --git a/backend/src/main/java/com/gpf/pethospital/mapper/PetMapper.java b/backend/src/main/java/com/gpf/pethospital/mapper/PetMapper.java new file mode 100644 index 0000000..bd7d18f --- /dev/null +++ b/backend/src/main/java/com/gpf/pethospital/mapper/PetMapper.java @@ -0,0 +1,9 @@ +package com.gpf.pethospital.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.gpf.pethospital.entity.Pet; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface PetMapper extends BaseMapper { +} diff --git a/backend/src/main/java/com/gpf/pethospital/mapper/PrescriptionItemMapper.java b/backend/src/main/java/com/gpf/pethospital/mapper/PrescriptionItemMapper.java new file mode 100644 index 0000000..f79b744 --- /dev/null +++ b/backend/src/main/java/com/gpf/pethospital/mapper/PrescriptionItemMapper.java @@ -0,0 +1,9 @@ +package com.gpf.pethospital.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.gpf.pethospital.entity.PrescriptionItem; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface PrescriptionItemMapper extends BaseMapper { +} diff --git a/backend/src/main/java/com/gpf/pethospital/mapper/PrescriptionMapper.java b/backend/src/main/java/com/gpf/pethospital/mapper/PrescriptionMapper.java new file mode 100644 index 0000000..338ea17 --- /dev/null +++ b/backend/src/main/java/com/gpf/pethospital/mapper/PrescriptionMapper.java @@ -0,0 +1,9 @@ +package com.gpf.pethospital.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.gpf.pethospital.entity.Prescription; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface PrescriptionMapper extends BaseMapper { +} diff --git a/backend/src/main/java/com/gpf/pethospital/mapper/ReportMapper.java b/backend/src/main/java/com/gpf/pethospital/mapper/ReportMapper.java new file mode 100644 index 0000000..8ab6391 --- /dev/null +++ b/backend/src/main/java/com/gpf/pethospital/mapper/ReportMapper.java @@ -0,0 +1,9 @@ +package com.gpf.pethospital.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.gpf.pethospital.entity.Report; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface ReportMapper extends BaseMapper { +} diff --git a/backend/src/main/java/com/gpf/pethospital/mapper/StockInMapper.java b/backend/src/main/java/com/gpf/pethospital/mapper/StockInMapper.java new file mode 100644 index 0000000..ac6b989 --- /dev/null +++ b/backend/src/main/java/com/gpf/pethospital/mapper/StockInMapper.java @@ -0,0 +1,9 @@ +package com.gpf.pethospital.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.gpf.pethospital.entity.StockIn; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface StockInMapper extends BaseMapper { +} diff --git a/backend/src/main/java/com/gpf/pethospital/mapper/StockOutMapper.java b/backend/src/main/java/com/gpf/pethospital/mapper/StockOutMapper.java new file mode 100644 index 0000000..236b8d2 --- /dev/null +++ b/backend/src/main/java/com/gpf/pethospital/mapper/StockOutMapper.java @@ -0,0 +1,9 @@ +package com.gpf.pethospital.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.gpf.pethospital.entity.StockOut; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface StockOutMapper extends BaseMapper { +} diff --git a/backend/src/main/java/com/gpf/pethospital/mapper/UserMapper.java b/backend/src/main/java/com/gpf/pethospital/mapper/UserMapper.java new file mode 100644 index 0000000..c00a316 --- /dev/null +++ b/backend/src/main/java/com/gpf/pethospital/mapper/UserMapper.java @@ -0,0 +1,9 @@ +package com.gpf.pethospital.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.gpf.pethospital.entity.User; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface UserMapper extends BaseMapper { +} diff --git a/backend/src/main/java/com/gpf/pethospital/mapper/VaccineRecordMapper.java b/backend/src/main/java/com/gpf/pethospital/mapper/VaccineRecordMapper.java new file mode 100644 index 0000000..841579c --- /dev/null +++ b/backend/src/main/java/com/gpf/pethospital/mapper/VaccineRecordMapper.java @@ -0,0 +1,9 @@ +package com.gpf.pethospital.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.gpf.pethospital.entity.VaccineRecord; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface VaccineRecordMapper extends BaseMapper { +} diff --git a/backend/src/main/java/com/gpf/pethospital/mapper/VisitMapper.java b/backend/src/main/java/com/gpf/pethospital/mapper/VisitMapper.java new file mode 100644 index 0000000..1d6f7af --- /dev/null +++ b/backend/src/main/java/com/gpf/pethospital/mapper/VisitMapper.java @@ -0,0 +1,9 @@ +package com.gpf.pethospital.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.gpf.pethospital.entity.Visit; +import org.apache.ibatis.annotations.Mapper; + +@Mapper +public interface VisitMapper extends BaseMapper { +} diff --git a/backend/src/main/java/com/gpf/pethospital/security/AuthUser.java b/backend/src/main/java/com/gpf/pethospital/security/AuthUser.java new file mode 100644 index 0000000..978ea46 --- /dev/null +++ b/backend/src/main/java/com/gpf/pethospital/security/AuthUser.java @@ -0,0 +1,25 @@ +package com.gpf.pethospital.security; + +public class AuthUser { + private final Long id; + private final String username; + private final String role; + + public AuthUser(Long id, String username, String role) { + this.id = id; + this.username = username; + this.role = role; + } + + public Long getId() { + return id; + } + + public String getUsername() { + return username; + } + + public String getRole() { + return role; + } +} diff --git a/backend/src/main/java/com/gpf/pethospital/security/JwtAuthenticationFilter.java b/backend/src/main/java/com/gpf/pethospital/security/JwtAuthenticationFilter.java new file mode 100644 index 0000000..985a125 --- /dev/null +++ b/backend/src/main/java/com/gpf/pethospital/security/JwtAuthenticationFilter.java @@ -0,0 +1,55 @@ +package com.gpf.pethospital.security; + +import com.gpf.pethospital.util.JwtUtil; +import io.jsonwebtoken.Claims; +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.authority.SimpleGrantedAuthority; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.util.StringUtils; +import org.springframework.web.filter.OncePerRequestFilter; + +import javax.servlet.FilterChain; +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +import java.io.IOException; +import java.util.Collections; + +public class JwtAuthenticationFilter extends OncePerRequestFilter { + private final JwtUtil jwtUtil; + + public JwtAuthenticationFilter(JwtUtil jwtUtil) { + this.jwtUtil = jwtUtil; + } + + @Override + protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) + throws ServletException, IOException { + String token = resolveToken(request); + if (StringUtils.hasText(token)) { + try { + Claims claims = jwtUtil.parseToken(token); + String username = claims.get("username", String.class); + String role = claims.get("role", String.class); + Number uid = claims.get("uid", Number.class); + Long userId = uid == null ? null : uid.longValue(); + SimpleGrantedAuthority authority = new SimpleGrantedAuthority("ROLE_" + role); + AuthUser principal = new AuthUser(userId, username, role); + Authentication auth = new UsernamePasswordAuthenticationToken(principal, null, Collections.singleton(authority)); + SecurityContextHolder.getContext().setAuthentication(auth); + } catch (Exception ignored) { + } + } + filterChain.doFilter(request, response); + } + + private String resolveToken(HttpServletRequest request) { + String bearer = request.getHeader("Authorization"); + if (StringUtils.hasText(bearer) && bearer.startsWith("Bearer ")) { + return bearer.substring(7); + } + return null; + } +} diff --git a/backend/src/main/java/com/gpf/pethospital/service/AppointmentService.java b/backend/src/main/java/com/gpf/pethospital/service/AppointmentService.java new file mode 100644 index 0000000..cb2f685 --- /dev/null +++ b/backend/src/main/java/com/gpf/pethospital/service/AppointmentService.java @@ -0,0 +1,7 @@ +package com.gpf.pethospital.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.gpf.pethospital.entity.Appointment; + +public interface AppointmentService extends IService { +} diff --git a/backend/src/main/java/com/gpf/pethospital/service/DrugService.java b/backend/src/main/java/com/gpf/pethospital/service/DrugService.java new file mode 100644 index 0000000..355c484 --- /dev/null +++ b/backend/src/main/java/com/gpf/pethospital/service/DrugService.java @@ -0,0 +1,7 @@ +package com.gpf.pethospital.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.gpf.pethospital.entity.Drug; + +public interface DrugService extends IService { +} diff --git a/backend/src/main/java/com/gpf/pethospital/service/MedicalRecordService.java b/backend/src/main/java/com/gpf/pethospital/service/MedicalRecordService.java new file mode 100644 index 0000000..a51ea41 --- /dev/null +++ b/backend/src/main/java/com/gpf/pethospital/service/MedicalRecordService.java @@ -0,0 +1,7 @@ +package com.gpf.pethospital.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.gpf.pethospital.entity.MedicalRecord; + +public interface MedicalRecordService extends IService { +} diff --git a/backend/src/main/java/com/gpf/pethospital/service/MessageService.java b/backend/src/main/java/com/gpf/pethospital/service/MessageService.java new file mode 100644 index 0000000..2f1a84a --- /dev/null +++ b/backend/src/main/java/com/gpf/pethospital/service/MessageService.java @@ -0,0 +1,7 @@ +package com.gpf.pethospital.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.gpf.pethospital.entity.Message; + +public interface MessageService extends IService { +} diff --git a/backend/src/main/java/com/gpf/pethospital/service/NoticeService.java b/backend/src/main/java/com/gpf/pethospital/service/NoticeService.java new file mode 100644 index 0000000..23c344b --- /dev/null +++ b/backend/src/main/java/com/gpf/pethospital/service/NoticeService.java @@ -0,0 +1,7 @@ +package com.gpf.pethospital.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.gpf.pethospital.entity.Notice; + +public interface NoticeService extends IService { +} diff --git a/backend/src/main/java/com/gpf/pethospital/service/OrderService.java b/backend/src/main/java/com/gpf/pethospital/service/OrderService.java new file mode 100644 index 0000000..cd85d8f --- /dev/null +++ b/backend/src/main/java/com/gpf/pethospital/service/OrderService.java @@ -0,0 +1,7 @@ +package com.gpf.pethospital.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.gpf.pethospital.entity.Order; + +public interface OrderService extends IService { +} diff --git a/backend/src/main/java/com/gpf/pethospital/service/PetService.java b/backend/src/main/java/com/gpf/pethospital/service/PetService.java new file mode 100644 index 0000000..88e08d5 --- /dev/null +++ b/backend/src/main/java/com/gpf/pethospital/service/PetService.java @@ -0,0 +1,7 @@ +package com.gpf.pethospital.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.gpf.pethospital.entity.Pet; + +public interface PetService extends IService { +} diff --git a/backend/src/main/java/com/gpf/pethospital/service/PrescriptionItemService.java b/backend/src/main/java/com/gpf/pethospital/service/PrescriptionItemService.java new file mode 100644 index 0000000..05a4e64 --- /dev/null +++ b/backend/src/main/java/com/gpf/pethospital/service/PrescriptionItemService.java @@ -0,0 +1,7 @@ +package com.gpf.pethospital.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.gpf.pethospital.entity.PrescriptionItem; + +public interface PrescriptionItemService extends IService { +} diff --git a/backend/src/main/java/com/gpf/pethospital/service/PrescriptionService.java b/backend/src/main/java/com/gpf/pethospital/service/PrescriptionService.java new file mode 100644 index 0000000..beb7dc1 --- /dev/null +++ b/backend/src/main/java/com/gpf/pethospital/service/PrescriptionService.java @@ -0,0 +1,7 @@ +package com.gpf.pethospital.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.gpf.pethospital.entity.Prescription; + +public interface PrescriptionService extends IService { +} diff --git a/backend/src/main/java/com/gpf/pethospital/service/ReportService.java b/backend/src/main/java/com/gpf/pethospital/service/ReportService.java new file mode 100644 index 0000000..dfaf158 --- /dev/null +++ b/backend/src/main/java/com/gpf/pethospital/service/ReportService.java @@ -0,0 +1,7 @@ +package com.gpf.pethospital.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.gpf.pethospital.entity.Report; + +public interface ReportService extends IService { +} diff --git a/backend/src/main/java/com/gpf/pethospital/service/StockInService.java b/backend/src/main/java/com/gpf/pethospital/service/StockInService.java new file mode 100644 index 0000000..e2ac014 --- /dev/null +++ b/backend/src/main/java/com/gpf/pethospital/service/StockInService.java @@ -0,0 +1,7 @@ +package com.gpf.pethospital.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.gpf.pethospital.entity.StockIn; + +public interface StockInService extends IService { +} diff --git a/backend/src/main/java/com/gpf/pethospital/service/StockOutService.java b/backend/src/main/java/com/gpf/pethospital/service/StockOutService.java new file mode 100644 index 0000000..f944f89 --- /dev/null +++ b/backend/src/main/java/com/gpf/pethospital/service/StockOutService.java @@ -0,0 +1,7 @@ +package com.gpf.pethospital.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.gpf.pethospital.entity.StockOut; + +public interface StockOutService extends IService { +} diff --git a/backend/src/main/java/com/gpf/pethospital/service/UserService.java b/backend/src/main/java/com/gpf/pethospital/service/UserService.java new file mode 100644 index 0000000..2fb9f1d --- /dev/null +++ b/backend/src/main/java/com/gpf/pethospital/service/UserService.java @@ -0,0 +1,7 @@ +package com.gpf.pethospital.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.gpf.pethospital.entity.User; + +public interface UserService extends IService { +} diff --git a/backend/src/main/java/com/gpf/pethospital/service/VaccineRecordService.java b/backend/src/main/java/com/gpf/pethospital/service/VaccineRecordService.java new file mode 100644 index 0000000..14d67bf --- /dev/null +++ b/backend/src/main/java/com/gpf/pethospital/service/VaccineRecordService.java @@ -0,0 +1,7 @@ +package com.gpf.pethospital.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.gpf.pethospital.entity.VaccineRecord; + +public interface VaccineRecordService extends IService { +} diff --git a/backend/src/main/java/com/gpf/pethospital/service/VisitService.java b/backend/src/main/java/com/gpf/pethospital/service/VisitService.java new file mode 100644 index 0000000..d02b870 --- /dev/null +++ b/backend/src/main/java/com/gpf/pethospital/service/VisitService.java @@ -0,0 +1,7 @@ +package com.gpf.pethospital.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.gpf.pethospital.entity.Visit; + +public interface VisitService extends IService { +} diff --git a/backend/src/main/java/com/gpf/pethospital/service/impl/AppointmentServiceImpl.java b/backend/src/main/java/com/gpf/pethospital/service/impl/AppointmentServiceImpl.java new file mode 100644 index 0000000..d5e1e05 --- /dev/null +++ b/backend/src/main/java/com/gpf/pethospital/service/impl/AppointmentServiceImpl.java @@ -0,0 +1,11 @@ +package com.gpf.pethospital.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.gpf.pethospital.entity.Appointment; +import com.gpf.pethospital.mapper.AppointmentMapper; +import com.gpf.pethospital.service.AppointmentService; +import org.springframework.stereotype.Service; + +@Service +public class AppointmentServiceImpl extends ServiceImpl implements AppointmentService { +} diff --git a/backend/src/main/java/com/gpf/pethospital/service/impl/DrugServiceImpl.java b/backend/src/main/java/com/gpf/pethospital/service/impl/DrugServiceImpl.java new file mode 100644 index 0000000..eaf4429 --- /dev/null +++ b/backend/src/main/java/com/gpf/pethospital/service/impl/DrugServiceImpl.java @@ -0,0 +1,11 @@ +package com.gpf.pethospital.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.gpf.pethospital.entity.Drug; +import com.gpf.pethospital.mapper.DrugMapper; +import com.gpf.pethospital.service.DrugService; +import org.springframework.stereotype.Service; + +@Service +public class DrugServiceImpl extends ServiceImpl implements DrugService { +} diff --git a/backend/src/main/java/com/gpf/pethospital/service/impl/MedicalRecordServiceImpl.java b/backend/src/main/java/com/gpf/pethospital/service/impl/MedicalRecordServiceImpl.java new file mode 100644 index 0000000..da636a5 --- /dev/null +++ b/backend/src/main/java/com/gpf/pethospital/service/impl/MedicalRecordServiceImpl.java @@ -0,0 +1,11 @@ +package com.gpf.pethospital.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.gpf.pethospital.entity.MedicalRecord; +import com.gpf.pethospital.mapper.MedicalRecordMapper; +import com.gpf.pethospital.service.MedicalRecordService; +import org.springframework.stereotype.Service; + +@Service +public class MedicalRecordServiceImpl extends ServiceImpl implements MedicalRecordService { +} diff --git a/backend/src/main/java/com/gpf/pethospital/service/impl/MessageServiceImpl.java b/backend/src/main/java/com/gpf/pethospital/service/impl/MessageServiceImpl.java new file mode 100644 index 0000000..30daa34 --- /dev/null +++ b/backend/src/main/java/com/gpf/pethospital/service/impl/MessageServiceImpl.java @@ -0,0 +1,11 @@ +package com.gpf.pethospital.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.gpf.pethospital.entity.Message; +import com.gpf.pethospital.mapper.MessageMapper; +import com.gpf.pethospital.service.MessageService; +import org.springframework.stereotype.Service; + +@Service +public class MessageServiceImpl extends ServiceImpl implements MessageService { +} diff --git a/backend/src/main/java/com/gpf/pethospital/service/impl/NoticeServiceImpl.java b/backend/src/main/java/com/gpf/pethospital/service/impl/NoticeServiceImpl.java new file mode 100644 index 0000000..07b7dbc --- /dev/null +++ b/backend/src/main/java/com/gpf/pethospital/service/impl/NoticeServiceImpl.java @@ -0,0 +1,11 @@ +package com.gpf.pethospital.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.gpf.pethospital.entity.Notice; +import com.gpf.pethospital.mapper.NoticeMapper; +import com.gpf.pethospital.service.NoticeService; +import org.springframework.stereotype.Service; + +@Service +public class NoticeServiceImpl extends ServiceImpl implements NoticeService { +} diff --git a/backend/src/main/java/com/gpf/pethospital/service/impl/OrderServiceImpl.java b/backend/src/main/java/com/gpf/pethospital/service/impl/OrderServiceImpl.java new file mode 100644 index 0000000..916bbaf --- /dev/null +++ b/backend/src/main/java/com/gpf/pethospital/service/impl/OrderServiceImpl.java @@ -0,0 +1,11 @@ +package com.gpf.pethospital.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.gpf.pethospital.entity.Order; +import com.gpf.pethospital.mapper.OrderMapper; +import com.gpf.pethospital.service.OrderService; +import org.springframework.stereotype.Service; + +@Service +public class OrderServiceImpl extends ServiceImpl implements OrderService { +} diff --git a/backend/src/main/java/com/gpf/pethospital/service/impl/PetServiceImpl.java b/backend/src/main/java/com/gpf/pethospital/service/impl/PetServiceImpl.java new file mode 100644 index 0000000..2ce7f8f --- /dev/null +++ b/backend/src/main/java/com/gpf/pethospital/service/impl/PetServiceImpl.java @@ -0,0 +1,11 @@ +package com.gpf.pethospital.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.gpf.pethospital.entity.Pet; +import com.gpf.pethospital.mapper.PetMapper; +import com.gpf.pethospital.service.PetService; +import org.springframework.stereotype.Service; + +@Service +public class PetServiceImpl extends ServiceImpl implements PetService { +} diff --git a/backend/src/main/java/com/gpf/pethospital/service/impl/PrescriptionItemServiceImpl.java b/backend/src/main/java/com/gpf/pethospital/service/impl/PrescriptionItemServiceImpl.java new file mode 100644 index 0000000..3a94ca2 --- /dev/null +++ b/backend/src/main/java/com/gpf/pethospital/service/impl/PrescriptionItemServiceImpl.java @@ -0,0 +1,11 @@ +package com.gpf.pethospital.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.gpf.pethospital.entity.PrescriptionItem; +import com.gpf.pethospital.mapper.PrescriptionItemMapper; +import com.gpf.pethospital.service.PrescriptionItemService; +import org.springframework.stereotype.Service; + +@Service +public class PrescriptionItemServiceImpl extends ServiceImpl implements PrescriptionItemService { +} diff --git a/backend/src/main/java/com/gpf/pethospital/service/impl/PrescriptionServiceImpl.java b/backend/src/main/java/com/gpf/pethospital/service/impl/PrescriptionServiceImpl.java new file mode 100644 index 0000000..bb56ef7 --- /dev/null +++ b/backend/src/main/java/com/gpf/pethospital/service/impl/PrescriptionServiceImpl.java @@ -0,0 +1,11 @@ +package com.gpf.pethospital.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.gpf.pethospital.entity.Prescription; +import com.gpf.pethospital.mapper.PrescriptionMapper; +import com.gpf.pethospital.service.PrescriptionService; +import org.springframework.stereotype.Service; + +@Service +public class PrescriptionServiceImpl extends ServiceImpl implements PrescriptionService { +} diff --git a/backend/src/main/java/com/gpf/pethospital/service/impl/ReportServiceImpl.java b/backend/src/main/java/com/gpf/pethospital/service/impl/ReportServiceImpl.java new file mode 100644 index 0000000..392a44c --- /dev/null +++ b/backend/src/main/java/com/gpf/pethospital/service/impl/ReportServiceImpl.java @@ -0,0 +1,11 @@ +package com.gpf.pethospital.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.gpf.pethospital.entity.Report; +import com.gpf.pethospital.mapper.ReportMapper; +import com.gpf.pethospital.service.ReportService; +import org.springframework.stereotype.Service; + +@Service +public class ReportServiceImpl extends ServiceImpl implements ReportService { +} diff --git a/backend/src/main/java/com/gpf/pethospital/service/impl/StockInServiceImpl.java b/backend/src/main/java/com/gpf/pethospital/service/impl/StockInServiceImpl.java new file mode 100644 index 0000000..b7b307c --- /dev/null +++ b/backend/src/main/java/com/gpf/pethospital/service/impl/StockInServiceImpl.java @@ -0,0 +1,11 @@ +package com.gpf.pethospital.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.gpf.pethospital.entity.StockIn; +import com.gpf.pethospital.mapper.StockInMapper; +import com.gpf.pethospital.service.StockInService; +import org.springframework.stereotype.Service; + +@Service +public class StockInServiceImpl extends ServiceImpl implements StockInService { +} diff --git a/backend/src/main/java/com/gpf/pethospital/service/impl/StockOutServiceImpl.java b/backend/src/main/java/com/gpf/pethospital/service/impl/StockOutServiceImpl.java new file mode 100644 index 0000000..8102a8e --- /dev/null +++ b/backend/src/main/java/com/gpf/pethospital/service/impl/StockOutServiceImpl.java @@ -0,0 +1,11 @@ +package com.gpf.pethospital.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.gpf.pethospital.entity.StockOut; +import com.gpf.pethospital.mapper.StockOutMapper; +import com.gpf.pethospital.service.StockOutService; +import org.springframework.stereotype.Service; + +@Service +public class StockOutServiceImpl extends ServiceImpl implements StockOutService { +} diff --git a/backend/src/main/java/com/gpf/pethospital/service/impl/UserServiceImpl.java b/backend/src/main/java/com/gpf/pethospital/service/impl/UserServiceImpl.java new file mode 100644 index 0000000..b8d7c0e --- /dev/null +++ b/backend/src/main/java/com/gpf/pethospital/service/impl/UserServiceImpl.java @@ -0,0 +1,11 @@ +package com.gpf.pethospital.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.gpf.pethospital.entity.User; +import com.gpf.pethospital.mapper.UserMapper; +import com.gpf.pethospital.service.UserService; +import org.springframework.stereotype.Service; + +@Service +public class UserServiceImpl extends ServiceImpl implements UserService { +} diff --git a/backend/src/main/java/com/gpf/pethospital/service/impl/VaccineRecordServiceImpl.java b/backend/src/main/java/com/gpf/pethospital/service/impl/VaccineRecordServiceImpl.java new file mode 100644 index 0000000..4297287 --- /dev/null +++ b/backend/src/main/java/com/gpf/pethospital/service/impl/VaccineRecordServiceImpl.java @@ -0,0 +1,11 @@ +package com.gpf.pethospital.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.gpf.pethospital.entity.VaccineRecord; +import com.gpf.pethospital.mapper.VaccineRecordMapper; +import com.gpf.pethospital.service.VaccineRecordService; +import org.springframework.stereotype.Service; + +@Service +public class VaccineRecordServiceImpl extends ServiceImpl implements VaccineRecordService { +} diff --git a/backend/src/main/java/com/gpf/pethospital/service/impl/VisitServiceImpl.java b/backend/src/main/java/com/gpf/pethospital/service/impl/VisitServiceImpl.java new file mode 100644 index 0000000..7d0f8a2 --- /dev/null +++ b/backend/src/main/java/com/gpf/pethospital/service/impl/VisitServiceImpl.java @@ -0,0 +1,11 @@ +package com.gpf.pethospital.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.gpf.pethospital.entity.Visit; +import com.gpf.pethospital.mapper.VisitMapper; +import com.gpf.pethospital.service.VisitService; +import org.springframework.stereotype.Service; + +@Service +public class VisitServiceImpl extends ServiceImpl implements VisitService { +} diff --git a/backend/src/main/java/com/gpf/pethospital/util/JwtUtil.java b/backend/src/main/java/com/gpf/pethospital/util/JwtUtil.java new file mode 100644 index 0000000..a9e4ee2 --- /dev/null +++ b/backend/src/main/java/com/gpf/pethospital/util/JwtUtil.java @@ -0,0 +1,41 @@ +package com.gpf.pethospital.util; + +import io.jsonwebtoken.Claims; +import io.jsonwebtoken.Jwts; +import io.jsonwebtoken.SignatureAlgorithm; + +import java.util.Date; +import java.util.HashMap; +import java.util.Map; + +public class JwtUtil { + private final String secret; + private final long expirationMs; + + public JwtUtil(String secret, long expirationMs) { + this.secret = secret; + this.expirationMs = expirationMs; + } + + public String generateToken(Long userId, String role, String username) { + Map claims = new HashMap<>(); + claims.put("uid", userId); + claims.put("role", role); + claims.put("username", username); + Date now = new Date(); + Date exp = new Date(now.getTime() + expirationMs); + return Jwts.builder() + .setClaims(claims) + .setIssuedAt(now) + .setExpiration(exp) + .signWith(SignatureAlgorithm.HS256, secret) + .compact(); + } + + public Claims parseToken(String token) { + return Jwts.parser() + .setSigningKey(secret) + .parseClaimsJws(token) + .getBody(); + } +} diff --git a/backend/src/main/java/com/gpf/pethospital/util/SecurityUtils.java b/backend/src/main/java/com/gpf/pethospital/util/SecurityUtils.java new file mode 100644 index 0000000..9d27588 --- /dev/null +++ b/backend/src/main/java/com/gpf/pethospital/util/SecurityUtils.java @@ -0,0 +1,15 @@ +package com.gpf.pethospital.util; + +import com.gpf.pethospital.security.AuthUser; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.context.SecurityContextHolder; + +public class SecurityUtils { + public static AuthUser currentUser() { + Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); + if (authentication != null && authentication.getPrincipal() instanceof AuthUser) { + return (AuthUser) authentication.getPrincipal(); + } + return null; + } +} diff --git a/backend/src/main/resources/application-dev.yml b/backend/src/main/resources/application-dev.yml new file mode 100644 index 0000000..366ffe9 --- /dev/null +++ b/backend/src/main/resources/application-dev.yml @@ -0,0 +1,61 @@ +server: + port: 8081 + servlet: + context-path: /api + +spring: + application: + name: pet-hospital + + datasource: + driver-class-name: org.h2.Driver + url: jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE;MODE=MYSQL; + username: sa + password: password + hikari: + maximum-pool-size: 10 + minimum-idle: 5 + connection-timeout: 30000 + + jackson: + time-zone: GMT+8 + date-format: yyyy-MM-dd HH:mm:ss + + h2: + console: + enabled: true + path: /h2-console + + jpa: + hibernate: + ddl-auto: create-drop + show-sql: true + + sql: + init: + mode: always + schema-locations: classpath*:schema-h2.sql + data-locations: classpath*:data.sql + +mybatis-plus: + configuration: + map-underscore-to-camel-case: true + log-impl: org.apache.ibatis.logging.stdout.StdOutImpl + global-config: + db-config: + id-type: auto + logic-delete-field: deleted + logic-delete-value: 1 + logic-not-delete-value: 0 + mapper-locations: classpath*:mapper/**/*.xml + ddl-auto: create-drop + +# JWT配置 +jwt: + secret: petHospitalSecretKey2024GuanPengFeiGraduateDesign + expiration: 86400000 # 24小时 + +# 文件上传配置 +file: + upload-path: /tmp/pet-hospital/uploads/ + max-size: 10MB \ No newline at end of file diff --git a/backend/src/main/resources/application.yml b/backend/src/main/resources/application.yml new file mode 100644 index 0000000..b83f286 --- /dev/null +++ b/backend/src/main/resources/application.yml @@ -0,0 +1,36 @@ +server: + port: 8080 + servlet: + context-path: /api + +spring: + profiles: + active: dev + application: + name: pet-hospital + + jackson: + time-zone: GMT+8 + date-format: yyyy-MM-dd HH:mm:ss + +mybatis-plus: + configuration: + map-underscore-to-camel-case: true + log-impl: org.apache.ibatis.logging.stdout.StdOutImpl + global-config: + db-config: + id-type: auto + logic-delete-field: deleted + logic-delete-value: 1 + logic-not-delete-value: 0 + mapper-locations: classpath*:mapper/**/*.xml + +# JWT配置 +jwt: + secret: pet-hospital-secret-key-2024-guanpengfei-graduate-design + expiration: 86400000 # 24小时 + +# 文件上传配置 +file: + upload-path: /tmp/pet-hospital/uploads/ + max-size: 10MB diff --git a/backend/src/main/resources/data.sql b/backend/src/main/resources/data.sql new file mode 100644 index 0000000..1f3337f --- /dev/null +++ b/backend/src/main/resources/data.sql @@ -0,0 +1,17 @@ +-- 插入初始管理员用户 +INSERT INTO `user` (username, password, phone, email, role, status) VALUES ('admin', '$2a$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', '13800138000', 'admin@example.com', 'ADMIN', 1); + +-- 插入初始医生用户 +INSERT INTO `user` (username, password, phone, email, role, status) VALUES ('doctor', '$2a$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', '13700137000', 'doctor@example.com', 'DOCTOR', 1); + +-- 插入初始顾客用户 +INSERT INTO `user` (username, password, phone, email, role, status) VALUES ('customer', '$2a$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', '13900139000', 'customer@example.com', 'CUSTOMER', 1); + +-- 插入示例宠物 +INSERT INTO pet (name, species, breed, gender, birthday, owner_id) VALUES ('小白', '狗', '金毛', 'MALE', '2023-01-01', 3); + +-- 插入示例医生 +INSERT INTO doctor (name, department, title, phone, email, status) VALUES ('张医生', '内科', '主治医师', '13600136000', 'zhang@hospital.com', 1); + +-- 插入示例药品 +INSERT INTO drug (name, category, manufacturer, specification, unit_price, stock_quantity, unit, status) VALUES ('阿莫西林', '抗生素', '制药厂A', '0.25g*24粒', 25.50, 100, '盒', 1); \ No newline at end of file diff --git a/backend/src/main/resources/schema-h2.sql b/backend/src/main/resources/schema-h2.sql new file mode 100644 index 0000000..22298e9 --- /dev/null +++ b/backend/src/main/resources/schema-h2.sql @@ -0,0 +1,242 @@ +-- 如果表不存在则创建表,如果存在则添加缺失的列 + +-- 检查并创建appointment表或添加缺失列 +CREATE TABLE IF NOT EXISTS appointment ( + id BIGINT AUTO_INCREMENT PRIMARY KEY, + customer_id BIGINT NOT NULL, + pet_id BIGINT NOT NULL, + doctor_id BIGINT, + department VARCHAR(50), + appointment_date DATE, + time_slot VARCHAR(20), -- 添加这个缺失的列 + status VARCHAR(20) DEFAULT 'PENDING', + remark TEXT, + cancel_time TIMESTAMP NULL, + create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + deleted INT DEFAULT 0 +); + +-- 检查并创建visit表 +CREATE TABLE IF NOT EXISTS visit ( + id BIGINT AUTO_INCREMENT PRIMARY KEY, + appointment_id BIGINT, + customer_id BIGINT NOT NULL, + pet_id BIGINT NOT NULL, + doctor_id BIGINT NOT NULL, + symptoms TEXT, + diagnosis TEXT, + treatment_plan TEXT, + status VARCHAR(20) DEFAULT 'PENDING', + total_amount DECIMAL(10,2), + payment_status VARCHAR(20) DEFAULT 'UNPAID', + payment_method VARCHAR(20), + payment_time TIMESTAMP NULL, + start_time TIMESTAMP, + end_time TIMESTAMP, + create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + deleted INT DEFAULT 0 +); + +-- 检查并创建prescription表 +CREATE TABLE IF NOT EXISTS prescription ( + id BIGINT AUTO_INCREMENT PRIMARY KEY, + visit_id BIGINT, + doctor_id BIGINT, + customer_id BIGINT, + total_amount DECIMAL(10,2), + status VARCHAR(20) DEFAULT 'DRAFT', + remark TEXT, + create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + deleted INT DEFAULT 0 +); + +-- 检查并创建prescription_item表 +CREATE TABLE IF NOT EXISTS prescription_item ( + id BIGINT AUTO_INCREMENT PRIMARY KEY, + prescription_id BIGINT NOT NULL, + drug_id BIGINT NOT NULL, + quantity INT NOT NULL, + dosage VARCHAR(100), + frequency VARCHAR(50), + duration VARCHAR(50), + usage_instructions TEXT, + create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + deleted INT DEFAULT 0 +); + +-- 检查并创建order_info表 +CREATE TABLE IF NOT EXISTS order_info ( + id BIGINT AUTO_INCREMENT PRIMARY KEY, + visit_id BIGINT, + customer_id BIGINT NOT NULL, + amount DECIMAL(10,2), + status VARCHAR(20) DEFAULT 'UNPAID', + payment_method VARCHAR(20), + payment_time TIMESTAMP NULL, + remark TEXT, + create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + deleted INT DEFAULT 0 +); + +-- 检查并创建drug表 +CREATE TABLE IF NOT EXISTS drug ( + id BIGINT AUTO_INCREMENT PRIMARY KEY, + name VARCHAR(100) NOT NULL, + category VARCHAR(50), + manufacturer VARCHAR(100), + specification VARCHAR(100), + unit_price DECIMAL(10,2), + stock_quantity INT DEFAULT 0, + unit VARCHAR(20), + status INT DEFAULT 1, + create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + deleted INT DEFAULT 0 +); + +-- 检查并创建pet表 +CREATE TABLE IF NOT EXISTS pet ( + id BIGINT AUTO_INCREMENT PRIMARY KEY, + owner_id BIGINT NOT NULL, + name VARCHAR(50) NOT NULL, + species VARCHAR(50), + breed VARCHAR(100), + gender VARCHAR(10), -- 修改为VARCHAR以支持MALE/FEMALE + birthday DATE, -- 添加birthday字段而不是age + weight DOUBLE, -- 添加weight字段 + photo VARCHAR(255), -- 添加photo字段 + remark TEXT, -- 添加remark字段 + create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + deleted INT DEFAULT 0 +); + +-- 检查并创建doctor表 +CREATE TABLE IF NOT EXISTS doctor ( + id BIGINT AUTO_INCREMENT PRIMARY KEY, + name VARCHAR(50) NOT NULL, + department VARCHAR(50), + title VARCHAR(50), + phone VARCHAR(20), + email VARCHAR(100), + avatar VARCHAR(255), + status INT DEFAULT 1, + create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + deleted INT DEFAULT 0 +); + +-- 检查并创建user表 +CREATE TABLE IF NOT EXISTS `user` ( + id BIGINT AUTO_INCREMENT PRIMARY KEY, + username VARCHAR(50) NOT NULL UNIQUE, + phone VARCHAR(20), + email VARCHAR(100), + password VARCHAR(255) NOT NULL, + role VARCHAR(20) DEFAULT 'CUSTOMER', + status INT DEFAULT 1, + avatar VARCHAR(255), + create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + deleted INT DEFAULT 0 +); + +-- 检查并创建medical_record表 +CREATE TABLE IF NOT EXISTS medical_record ( + id BIGINT AUTO_INCREMENT PRIMARY KEY, + visit_id BIGINT NOT NULL, + record_type VARCHAR(50), -- CHECKUP体检, DIAGNOSIS诊断, TREATMENT治疗 + content TEXT, + attachment_urls TEXT, + doctor_id BIGINT, + create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + deleted INT DEFAULT 0 +); + +-- 检查并创建message表 +CREATE TABLE IF NOT EXISTS message ( + id BIGINT AUTO_INCREMENT PRIMARY KEY, + sender_id BIGINT, + receiver_id BIGINT NOT NULL, + content TEXT NOT NULL, + type VARCHAR(20) DEFAULT 'NOTICE', -- NOTICE通知, CHAT聊天 + status VARCHAR(20) DEFAULT 'UNREAD', -- UNREAD未读, READ已读 + create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + deleted INT DEFAULT 0 +); + +-- 检查并创建notice表 +CREATE TABLE IF NOT EXISTS notice ( + id BIGINT AUTO_INCREMENT PRIMARY KEY, + title VARCHAR(200) NOT NULL, + content TEXT NOT NULL, + publisher_id BIGINT NOT NULL, + publish_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + status INT DEFAULT 1, + create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + deleted INT DEFAULT 0 +); + +-- 检查并创建report表 +CREATE TABLE IF NOT EXISTS report ( + id BIGINT AUTO_INCREMENT PRIMARY KEY, + report_type VARCHAR(50) NOT NULL, -- REVENUE收入, CUSTOMER客户, PET宠物, DRUG药品 + report_data JSON, + period_start DATE, + period_end DATE, + generated_by BIGINT, + create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + deleted INT DEFAULT 0 +); + +-- 检查并创建stock_in表 +CREATE TABLE IF NOT EXISTS stock_in ( + id BIGINT AUTO_INCREMENT PRIMARY KEY, + drug_id BIGINT NOT NULL, + quantity INT NOT NULL, + unit_price DECIMAL(10,2), + supplier VARCHAR(100), + operator_id BIGINT, + remark TEXT, + create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + deleted INT DEFAULT 0 +); + +-- 检查并创建stock_out表 +CREATE TABLE IF NOT EXISTS stock_out ( + id BIGINT AUTO_INCREMENT PRIMARY KEY, + drug_id BIGINT NOT NULL, + quantity INT NOT NULL, + unit_price DECIMAL(10,2), + purpose VARCHAR(100), -- 用途:销售、损耗等 + operator_id BIGINT, + remark TEXT, + create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + deleted INT DEFAULT 0 +); + +-- 检查并创建vaccine_record表 +CREATE TABLE IF NOT EXISTS vaccine_record ( + id BIGINT AUTO_INCREMENT PRIMARY KEY, + pet_id BIGINT NOT NULL, + vaccine_name VARCHAR(100) NOT NULL, + dose_number INT, + injection_date DATE, + next_appointment_date DATE, + doctor_id BIGINT, + remark TEXT, + create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + deleted INT DEFAULT 0 +); \ No newline at end of file diff --git a/backend/src/main/resources/schema.sql b/backend/src/main/resources/schema.sql new file mode 100644 index 0000000..c28ec10 --- /dev/null +++ b/backend/src/main/resources/schema.sql @@ -0,0 +1,230 @@ +-- 用户表 +CREATE TABLE IF NOT EXISTS `user` ( + id BIGINT AUTO_INCREMENT PRIMARY KEY, + username VARCHAR(50) NOT NULL UNIQUE, + phone VARCHAR(20), + email VARCHAR(100), + password VARCHAR(255) NOT NULL, + role VARCHAR(20) DEFAULT 'CUSTOMER', + status INT DEFAULT 1, + avatar VARCHAR(255), + create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + deleted INT DEFAULT 0 +); + +-- 宠物表 +CREATE TABLE IF NOT EXISTS pet ( + id BIGINT AUTO_INCREMENT PRIMARY KEY, + name VARCHAR(50) NOT NULL, + species VARCHAR(50), + breed VARCHAR(100), + gender CHAR(1), + age INT, + owner_id BIGINT NOT NULL, + health_status VARCHAR(100), + vaccination_status VARCHAR(100), + create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + deleted INT DEFAULT 0 +); + +-- 医生表 +CREATE TABLE IF NOT EXISTS doctor ( + id BIGINT AUTO_INCREMENT PRIMARY KEY, + name VARCHAR(50) NOT NULL, + department VARCHAR(50), + title VARCHAR(50), + phone VARCHAR(20), + email VARCHAR(100), + avatar VARCHAR(255), + status INT DEFAULT 1, + create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + deleted INT DEFAULT 0 +); + +-- 就诊记录表 +CREATE TABLE IF NOT EXISTS visit ( + id BIGINT AUTO_INCREMENT PRIMARY KEY, + pet_id BIGINT NOT NULL, + doctor_id BIGINT NOT NULL, + customer_id BIGINT NOT NULL, + symptoms TEXT, + diagnosis TEXT, + treatment_plan TEXT, + visit_date DATE, + status VARCHAR(20) DEFAULT 'PENDING', + create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + deleted INT DEFAULT 0 +); + +-- 处方表 +CREATE TABLE IF NOT EXISTS prescription ( + id BIGINT AUTO_INCREMENT PRIMARY KEY, + visit_id BIGINT NOT NULL, + doctor_id BIGINT NOT NULL, + customer_id BIGINT NOT NULL, + total_amount DECIMAL(10,2), + status VARCHAR(20) DEFAULT 'ACTIVE', + create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + deleted INT DEFAULT 0 +); + +-- 处方明细表 +CREATE TABLE IF NOT EXISTS prescription_item ( + id BIGINT AUTO_INCREMENT PRIMARY KEY, + prescription_id BIGINT NOT NULL, + drug_id BIGINT NOT NULL, + quantity INT NOT NULL, + dosage VARCHAR(100), + frequency VARCHAR(50), + duration VARCHAR(50), + usage_instructions TEXT, + create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + deleted INT DEFAULT 0 +); + +-- 药品表 +CREATE TABLE IF NOT EXISTS drug ( + id BIGINT AUTO_INCREMENT PRIMARY KEY, + name VARCHAR(100) NOT NULL, + category VARCHAR(50), + manufacturer VARCHAR(100), + specification VARCHAR(100), + unit_price DECIMAL(10,2), + stock_quantity INT DEFAULT 0, + unit VARCHAR(20), + status INT DEFAULT 1, + create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + deleted INT DEFAULT 0 +); + +-- 订单表 +CREATE TABLE IF NOT EXISTS order_info ( + id BIGINT AUTO_INCREMENT PRIMARY KEY, + visit_id BIGINT, + customer_id BIGINT NOT NULL, + amount DECIMAL(10,2), + status VARCHAR(20) DEFAULT 'UNPAID', + payment_method VARCHAR(20), + payment_time TIMESTAMP NULL, + remark TEXT, + create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + deleted INT DEFAULT 0 +); + +-- 预约表 +CREATE TABLE IF NOT EXISTS appointment ( + id BIGINT AUTO_INCREMENT PRIMARY KEY, + pet_id BIGINT NOT NULL, + doctor_id BIGINT NOT NULL, + customer_id BIGINT NOT NULL, + appointment_date DATE NOT NULL, + appointment_time TIME NOT NULL, + reason TEXT, + status VARCHAR(20) DEFAULT 'PENDING', + create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + deleted INT DEFAULT 0 +); + +-- 疫苗接种记录表 +CREATE TABLE IF NOT EXISTS vaccine_record ( + id BIGINT AUTO_INCREMENT PRIMARY KEY, + pet_id BIGINT NOT NULL, + vaccine_name VARCHAR(100) NOT NULL, + dose_number INT, + injection_date DATE, + next_appointment_date DATE, + doctor_id BIGINT, + remark TEXT, + create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + deleted INT DEFAULT 0 +); + +-- 库存入库表 +CREATE TABLE IF NOT EXISTS stock_in ( + id BIGINT AUTO_INCREMENT PRIMARY KEY, + drug_id BIGINT NOT NULL, + quantity INT NOT NULL, + unit_price DECIMAL(10,2), + supplier VARCHAR(100), + operator_id BIGINT, + remark TEXT, + create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + deleted INT DEFAULT 0 +); + +-- 库存出库表 +CREATE TABLE IF NOT EXISTS stock_out ( + id BIGINT AUTO_INCREMENT PRIMARY KEY, + drug_id BIGINT NOT NULL, + quantity INT NOT NULL, + unit_price DECIMAL(10,2), + purpose VARCHAR(100), -- 用途:销售、损耗等 + operator_id BIGINT, + remark TEXT, + create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + deleted INT DEFAULT 0 +); + +-- 消息表 +CREATE TABLE IF NOT EXISTS message ( + id BIGINT AUTO_INCREMENT PRIMARY KEY, + sender_id BIGINT, + receiver_id BIGINT NOT NULL, + content TEXT NOT NULL, + type VARCHAR(20) DEFAULT 'NOTICE', -- NOTICE通知, CHAT聊天 + status VARCHAR(20) DEFAULT 'UNREAD', -- UNREAD未读, READ已读 + create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + deleted INT DEFAULT 0 +); + +-- 公告表 +CREATE TABLE IF NOT EXISTS notice ( + id BIGINT AUTO_INCREMENT PRIMARY KEY, + title VARCHAR(200) NOT NULL, + content TEXT NOT NULL, + publisher_id BIGINT NOT NULL, + publish_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + status INT DEFAULT 1, + create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + deleted INT DEFAULT 0 +); + +-- 医疗记录表 +CREATE TABLE IF NOT EXISTS medical_record ( + id BIGINT AUTO_INCREMENT PRIMARY KEY, + visit_id BIGINT NOT NULL, + record_type VARCHAR(50), -- CHECKUP体检, DIAGNOSIS诊断, TREATMENT治疗 + content TEXT, + attachment_urls TEXT, + doctor_id BIGINT, + create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + deleted INT DEFAULT 0 +); + +-- 报表统计表 +CREATE TABLE IF NOT EXISTS report ( + id BIGINT AUTO_INCREMENT PRIMARY KEY, + report_type VARCHAR(50) NOT NULL, -- REVENUE收入, CUSTOMER客户, PET宠物, DRUG药品 + report_data JSON, + period_start DATE, + period_end DATE, + generated_by BIGINT, + create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + deleted INT DEFAULT 0 +); \ No newline at end of file diff --git a/backend/target/classes/application-dev.yml b/backend/target/classes/application-dev.yml new file mode 100644 index 0000000..366ffe9 --- /dev/null +++ b/backend/target/classes/application-dev.yml @@ -0,0 +1,61 @@ +server: + port: 8081 + servlet: + context-path: /api + +spring: + application: + name: pet-hospital + + datasource: + driver-class-name: org.h2.Driver + url: jdbc:h2:mem:testdb;DB_CLOSE_DELAY=-1;DB_CLOSE_ON_EXIT=FALSE;MODE=MYSQL; + username: sa + password: password + hikari: + maximum-pool-size: 10 + minimum-idle: 5 + connection-timeout: 30000 + + jackson: + time-zone: GMT+8 + date-format: yyyy-MM-dd HH:mm:ss + + h2: + console: + enabled: true + path: /h2-console + + jpa: + hibernate: + ddl-auto: create-drop + show-sql: true + + sql: + init: + mode: always + schema-locations: classpath*:schema-h2.sql + data-locations: classpath*:data.sql + +mybatis-plus: + configuration: + map-underscore-to-camel-case: true + log-impl: org.apache.ibatis.logging.stdout.StdOutImpl + global-config: + db-config: + id-type: auto + logic-delete-field: deleted + logic-delete-value: 1 + logic-not-delete-value: 0 + mapper-locations: classpath*:mapper/**/*.xml + ddl-auto: create-drop + +# JWT配置 +jwt: + secret: petHospitalSecretKey2024GuanPengFeiGraduateDesign + expiration: 86400000 # 24小时 + +# 文件上传配置 +file: + upload-path: /tmp/pet-hospital/uploads/ + max-size: 10MB \ No newline at end of file diff --git a/backend/target/classes/application.yml b/backend/target/classes/application.yml new file mode 100644 index 0000000..b83f286 --- /dev/null +++ b/backend/target/classes/application.yml @@ -0,0 +1,36 @@ +server: + port: 8080 + servlet: + context-path: /api + +spring: + profiles: + active: dev + application: + name: pet-hospital + + jackson: + time-zone: GMT+8 + date-format: yyyy-MM-dd HH:mm:ss + +mybatis-plus: + configuration: + map-underscore-to-camel-case: true + log-impl: org.apache.ibatis.logging.stdout.StdOutImpl + global-config: + db-config: + id-type: auto + logic-delete-field: deleted + logic-delete-value: 1 + logic-not-delete-value: 0 + mapper-locations: classpath*:mapper/**/*.xml + +# JWT配置 +jwt: + secret: pet-hospital-secret-key-2024-guanpengfei-graduate-design + expiration: 86400000 # 24小时 + +# 文件上传配置 +file: + upload-path: /tmp/pet-hospital/uploads/ + max-size: 10MB diff --git a/backend/target/classes/com/gpf/pethospital/PetHospitalApplication.class b/backend/target/classes/com/gpf/pethospital/PetHospitalApplication.class new file mode 100644 index 0000000000000000000000000000000000000000..9e827cb6d9f90f7516e804ae75270ae8756aae54 GIT binary patch literal 854 zcma)5O>fgc5Ph2_aT)>*DHPfQgH?wcnzyJLF1>hx~cG18_gk}#dv>E!B;!5yL=#;;YFJ)CDER+)&Kb7w7>ibnuWGWF(8Qnz}w<7d7{N!YZ9Et;prIv7dQtjN|j*tW{D!TWN-PIJ=o?nu)TUoYg#Y=fNh2vvtUc(N2DG zd}{PkrIi(NCTlIo?ZXp>=G2@^hOL>>@?Dk3(th;041<|TM79uCd3)t-x(ih@9L@fp z2j3$Xiq5k$TsQuL;=-ncy1gb$dpYq`pPvfPnv<3iyK__7M7~je&i(cDk3Dq^yB{j; zR4x~)RGtE@jSK4`nB%p~g`J4X8KN*yCs!MKP0OlLNaq>_fc$Grh~;XzT>NXnPef5j zJ5PkBLtBB$| zcY_QG7+{;MP29tM0`bMq0~pX5M57;}1q TebNK6ACZ1c?Vp^1l{okd2`c7u literal 0 HcmV?d00001 diff --git a/backend/target/classes/com/gpf/pethospital/common/ApiResponse.class b/backend/target/classes/com/gpf/pethospital/common/ApiResponse.class new file mode 100644 index 0000000000000000000000000000000000000000..219a61c3130ca5e9070930b656374e7d3f4ebf88 GIT binary patch literal 1956 zcmbVMYflqF6g|@iOG|-LY7wd;qPSfi^=%>rLo^1Gf)5&^ep|{~7Ta#K-J19h{4sve zL}H?eKfoVlJhQunZ7IoWHrbiEbMHB4?wvco|NQs`U=0tGh#;yUmO>mu0_h|DgI=ub z&06vK{*h621cpjx({$DaqH19;fng*RBvTkcN?@UCHHx*?yJE|54y|^}bo6?WwuaR# zZnVr-M!RJ-+lD}_Y8`M8TM}R_g>j?>l!no6>owXlXVG>zJALx$W z>*c9i9Y#(dV!cn&`=UIUk(W>h8J>53t+Be3WL$giBa=1JYKUeO7`Pk}0Er-M?QRX^<(%UlS2QPG6 zZy1hYQ^xe5gVSA}RB3mrRi;~@qz=eMNOJOSmMV|V0<5c&CnQSu2s=R~e%a4Lhef5f zx94aJfciB5p*C*Vwq*;f4a)LAhyBzLWjT{WJWvT@RZhhRmvIp)}`5k5arWaKl# zSw=nx?#OfZ7&#`%a)nmSi^nXkaz!MUU$`@=K&r~hH-}hroacPYEUt0o?d7>Q&-rMS!Ju$3 z0KVkwq`ZLzU+^ZSNbuB848MtHE>QQ>7p^^_L+;+VD=g*txzuo}Pc3;yNW!=X5Z!c% zRG;W2iKO-smq=S2z%%Lccn2Es)6D>vQ3M#JB~LYyF%juIUV*F{7Jb&oLDrc?;j>2E zGI*z(>S6VYEm>uoroSaHRw|!p$YLgiTn4kq3(SY=zS&WF-7%!~R{H9gCo0>{ zCxJq#T)#x6mc~s1&2Uw0qp<>W8O-B0!|;69H2gi=Q?9>bT9&}qQr&S|y6j4$t#mUi zf$pj^i$R)>t?w&eMj_WC$S{c``mtNXl5Igx_QU=RInS2N@gG^GmEATqt=sH*e8>P_*E}sY_x1Aw$I_Py8$~~41i;{fE+KF_{;2aB+K`RMVN5Uy?)JPjiXgkeA>B^4sSuB>t9O7{8 z>Kq1PYjhHGDp0;M{Q?V@HeH{msHwCgr{@}q2Nq-Qzrk7$dY5&3XB(E|v5}(uQsBU? zjWT8#Ji~K=*+D{a?+9#iM6TNnEP47sdH$~BaZodRwyoT-zmYc)DOK0JmP*_VEjvt z%8yZ^THsdkIshvC#Poh;HGd^i+5IsmL8^JM#3lvTVfWa#R#yQP22gzmoK-m~*$bAw|Xp+D> WbgoHM@f0sYNfj@-Y78K7%HKa9!+!|? literal 0 HcmV?d00001 diff --git a/backend/target/classes/com/gpf/pethospital/config/MybatisPlusConfig.class b/backend/target/classes/com/gpf/pethospital/config/MybatisPlusConfig.class new file mode 100644 index 0000000000000000000000000000000000000000..7246fa013182431c34697ea008ba522a33c3ae62 GIT binary patch literal 1359 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 atV5h}27kn#De5`4e<2Tl#ozG;4*n0L+#VkQ literal 0 HcmV?d00001 diff --git a/backend/target/classes/com/gpf/pethospital/config/WebConfig.class b/backend/target/classes/com/gpf/pethospital/config/WebConfig.class new file mode 100644 index 0000000000000000000000000000000000000000..df949d983042d8197ff8c10e206581a36171e918 GIT binary patch literal 1447 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 A=Kufz literal 0 HcmV?d00001 diff --git a/backend/target/classes/com/gpf/pethospital/controller/AuthController.class b/backend/target/classes/com/gpf/pethospital/controller/AuthController.class new file mode 100644 index 0000000000000000000000000000000000000000..89512d18f32118ae2429168a093343cacc8291bb GIT binary patch literal 7341 zcmb_h349dQ8UMfCO?I=Ha4Zl70wfS1CyOF@1keye2?+rcAO+jn$?lL0+3c({vtVp% z?V+u$ZMD@}Y(;xX)gE{dAhaH}rLC>Ctv$4@Z7tRw_Oh2+tMvb7XOmfW11j=kcHX@C z-uHd)`~KfCFAu#uaxZ`tVo?}A_=5;2C_=Hor0wbsHJVV9ebM#3+qIZ2P`q4E>h?+j ze@*S?5`<6^L|8#76oJN=F&OPjZHuNfyWg--!l3rP@1+h zvs*KF=rK*8wxiH;QpnfQO=F}@QtSi;6ER6(VoJ5ForW22O~#D4W(utAFwDNFl`{2Y z-!@Yn)cAHFYH6{wsoO)*m^qZPjc9gRbVKfXhj~Q76igKeZr^Edvh{?(+=9xb`7XLP zL(>#SIZg@UR0Y#9LttT{-NY%mOY74uTQj?~i_@A#lZN^eecHX~6NyR;kEb1@oj9l6UK%swYC2FEAq|#Z($*r6%Vp zb*s{(7P_g$!&r!#AZiuVpC}$Xi6Ma|+V%L{ZNo?m=yudfr&5M#N4r<2lQAjH@#`51mP&J$ z(wq{BNy17BJ5#|~I9tG{T`X``jmH9+cxlR?@jBQglAM|pEN2A5Cykj41D7fSfyI*a zJSntUK&{!D&pv-u)RlvtmN9YA*>acA~Qs#nlLprK2)h)!oabD=n$AAy?Jb^(UP`|aOt2h+ToW! z>lJLk1@xRX<~c{Dyf7;aRu4}ip&i`{HcEaW@^gY#PHtAvlbv*;O@`nW1zWS2$tIan zya{g(;w=g;!dnHFpG>A=F4ml!C(z(UUQ55qq{5gkbCVi5=8uV3kUhABM1s>+kj4&yfTix>7N&VQxv^8bHH1q9 z!ls*hGx_dP1#iRK<^IyKm}XInPVZXRUgJg7vFIz1*21_9?+oH{1@Dqbs4fIrSrR&o zK0P^F55i0`%`qo<A}~`=()D`0Qq5>Ci%eX%)ZT=&^<~&1#ch%J|Coa7 za6PR)sM@i9jaF~;T0IB89<5z(NKf8SSX{QGOG&#F+=x#y2XSLY@9g~*Qi$iIyDu>t?-9%JNIWxiKX}=z7)il6?{cjqcSHjodqPOlTv9r zggY4_Y{aw>?k1RIVr`3uu#fJP<4i?ci2X7q4lp%&w~&pZf=y6C+>hW;5MNdBHEG?d zu|z?XP~m8|X6i)CrCK~w#JNf7sKHcXoopTBolbqNzT%xcUj9Y#z|Y*x8FKD(0v zyI*HYix%X~MyK$%P!rqwjNvz^@{@&tB$H6KTnTg+wn>5S36}gq39CSqGVRIk-}we9 zyr>X+uG*RDwgp-oQRBynr?DHaW#`TVGXF436x7?>e-Wg)CLc;=&A#pAHCcW_`75bx z8OvmBfN9nBcgbj^2yA}+owU483Z34?Mp_@#HtUv7s5K{(2HPh2Da2N`U<~ZkdZWF} zdQo+hHoC#EY$~3T-;}HzPN&AwA00#4tXw%8Y2O@KGg!0+RMS?YPOW!Th_VyV<77BD zckw8Yb2z+mZQXWgl@TA3+9qU+B(Pz86MLJeR}%ya3i|!nwv0MN@=G?s8&_>rW`~@b zOX{V$Gt2WAduH5REq#5QNPkT`%pj;Z>KbrL^;kyMGR3!=_0C&M#;MUc-x99EtiYK( zFEG!uo$)xZ1MfD{W=vbH%LF}F zhF2MeZSgBOmC47}#A0!3SWFi)f?}p3D#WauTIlXHV@R%0*+meYQoN$xUzta zGcwkw$#_Dusyhs0Af57_8Msw3-?W*9GC-Ry^t>Hy)W)i{t6__pNObGA)-(x^O)SFA zlSI|%m-(@k)|+#^O{vS>&jXes`Gbi?V!rIQPvKyp9L!~p(UxQ{>~t8K6%=*sY4VgQ zwC$j1VE1r*Qo=1`BUJGS&_@mYh{&@?jw13r(7E&Ij`skMON#IZQvH!n3El&|Pp#Vz zQCGhY!McWhD64DShsk$x-iJT&x11}0nWU^h31(peX7eC$4xZs`U1mN0jKA=SoE*8r z8A-`fo2l~HkUIU9<1#-9Xd+%ycnSOse@C%YMm$GWR7Mon4`bS4l*!vLX70i)j;b;f zRnCMmSzHsTK7a*#520bpek@woFoGyRx+TL{c0U@1aSneoj3&E`ZbUG!2Lb;GRyw3) zey*34A|$C4F-E$|A?4h;J$3gW*l-XnK9pRy8`NP}q%EUEJ9Svs*_aXE*&_#J-sKFq zbW=|w*UJ68@gOerVHj#pVF1JH+IILsRl!t$XfvQr$u&|X?6;F!P5aojw* zvKn(SAN4$wT!I?3pcZTCfFx(qJOH}^jr;&w#E+fD*w2H$`*AwE{w3_V&%jeWsCx#> z@GqQ+qdX@Yb)6{Ax{jk~@eg`r2_D5iN$De(_4qgbL)Se=ZIsb>&-2|2oM}a9@}$sF z%HipFD2VbP)e!tS%9oxgAE$&q&V03liy}ekz<+u9@FM=l`vl5+iPy^)LRdH|F-7=^ zazcb-A(2(elR@V}#+?uW!Si_sOLx(B#hg2m2atDo0g{EnF_Rgm%gLgp|s|cUnOiz2zfxEE|50K&!y8H>A4N8El%$P6> z5FEj?1PL2(el}$Q(uwO`fb1sU+v)lMxh)qVQNo-dK~qk5X6PkoGVj8CC*e~D|4WDw z7D2R!D)L|;O7meL`1ch4I}Qvcg+-Z=&|ymPT|wv)8op(9!#LRCTfq>#_YSUK!^@xW zAMW6Ng?-VpPxBtNpFeVd_p18H1H<_GE>!tf>_J6+U{3C`4Dx#>=P=#uN`jf_>p<6~at?%nQDU+T+^=30`dRqi4nwooSQG?nj zVj8AE6IhwFGkQALujiz9!gh0}XIOgD&U%h*S<=zBIr((wNLOG=iUU2;88nkppt-Bu zb~l*z_l8T`qL?bsp;q@9cE(KEc|9}KXLzQYv+^!abfh{qWqPKab@fwu=?v*zMy4-i z>{snWj*-hrCx$vy#4sK4C}wE52{T7&+~YZBHZ2e}-L0fxz*qT5oJ7smFb53+RTN_l z3A8l@*e6Eg*|s%cdb*p>)NQ0?42!W$ zdC79p(6nn;bMF*1qa}(~4J)uxVEH7CNv$cGT0h+6+kavXGtx6shG*yr1)%LZt4r)3 zn!D|KMjCTK3_4atv0B3#+$ONBoI)JSkdcm@c|f{3IvW*Mx~{Teh zG1g&y6dN>b#O(qL${jDWp6LzwcSE2yExjJk@bWx)<|xA_vYt#!ha%gsIf`}-Tkslz z=|$HFR}lQ5Vddq%et}s{iBjh&%2q~VlEH1BX3Fc%Q|KtqpGESAsFapl&bM5+d_qZ&a!rIbIU;q^GoHIB^KgZ>(U zhVVes)*16m!!pkreU|iTILiGgX-S`kV>lkgof_TAq6g|IbpabI_(sjjQWWhsHjLmYP(uzYB;I%td^(p zhUM14VjxxCn3GAf-%R>pBZgzhYOs~S(I|GCSz7cMPHAwI9`m@h5FZUo`I6IbBxR>% zxRlKtv_aW&;y^KBuvOX3R41L*a7LZ9u>46ya%wO~t-njdo7DQHFSowOOfx{{9a)2W z7%obErr^cngRzqSW({vq(lts~wh0y8pyuAH;caSeRyY?xD>=%D;_U*BMbjskYSV_* z;iU5!I^^~NR*g`{7`vcfw@&(#w_t6IK#! zbhm(*Zo{EZ(qSls+0>=8Y+-gP;k}^A1SgCQ=M*h=snBGeCFbaW96D_~3<>e^A~}6J zC@cgzC!d`rs!n+FtkDz=CMRd8V+8>@{7JUeJ-v+RR||MA~mtm+ho=H>awweq~lNKcKrZnRisuGyEj0=Ny@{ zT~F_JWJjJc&7q+vxXRCC^b3Zr1GXibmUnF1li0hwSzv8hxu<2H-p4?s8zUI>JETX| zb3C6C8%IMO@w8Ex*H2pZ0me${dcGJ+*HW_I$Xi~oO272E)vVxFuVUzRxXyHBs)BVV z3%BYZ0}AXee+^3wSU&rf$$9i|Rf#i$T-Pc5d|NJ+zLJ9jA6PeO&bn#nqCqCVFXVcw zof;z5)j{?ZI9eK_{j`2v^>2XEh{-TfUlJz#69kU`|4t3~oVV zu)I+N50oJ}IAf=gOhXfWy2(V^arRg7x{A{Nprrj#gXLFviELInetjq1DE`8VvbZrs zQ%>(F{>Iwv<(Jao0+O(ZUu7bGwur0mGHg{db5!BI9DRtr9ek?!Sj$C-me!{beS*CR z9_HVvP{8X^$+Er{alDVcS;1<&A0J?k`+TVaA7s0VUvc;l_z*tKBb4|T5aoYh|5el- zzKCg?svD}FMQcOVFzO${;)d!glnB+GdkuBNn9sjg&=?LKYIzdTt5|$^!J>;;+E9HN zO%=F?#g}mF1q!Y7QO>1CTu+2^DQg~<^83je+=BI3;3Hm3CLg*olwfXTj)y)N$_tjA8K!kax*pO@erT6xI2veIo!|oV0_4L zpJw}P{BFNJ!1lfI`~3EuY~LS$z;E~X*Y*NOl%(x^79`!yc0tlgwhNLLv0acflkI|} zTK~3RxQYi4$KP=g?|Oy^15Z|Q3Zz{{9d#4Q2)>K&@u_?^j_Q}NB#P;xE;jc?B>s&A zJ^%ZhiQrkE`8Zq8vHt_^4gBGUc%J?F9RCp=;FtInev9An&IP^ShrK^>O^kc~jKAXV GX!swNguYP# literal 0 HcmV?d00001 diff --git a/backend/target/classes/com/gpf/pethospital/controller/MedicalRecordController.class b/backend/target/classes/com/gpf/pethospital/controller/MedicalRecordController.class new file mode 100644 index 0000000000000000000000000000000000000000..55506c5ba0cbdafde79ee9a1b394e26875e1c7b5 GIT binary patch literal 5311 zcmcgw`+F2u8Gg@_WH;L(3EM!SjcrJ2bESi|1%5@@&GgfxkX6h$Yyhh)g?&N4F_ z8fqH1!LTM}!FGxxwRwTgQuNJ~ zbe7D56nHQnC(sREH%bflWYcIvdlDTQwjd+W7bifLJ=0rm+%M2NFTE+x@TxBH^!4ZK zN1yT>vpkLo!yVYpeQtf<;l7)<^~W9}4ny`f+=;uA=+f{W+%2#t z4*Ytj7ie;gB^qvP6i48>Z2wa!bPFU4jx;=3Orr<)Cb3JyeYjuX{y1HnE7@gzxMEI9 zw_=xFicY%KLP5GT(s)!!XrsvSSJlQI|7OYAB>Dt~6^uEj9RO4C4s8pnrMlUvH$mT%}L)cA^aoSoI$kM0lOZRNs zS~NY~tyU_wx^*I zu*~zuoF#oSKg#_@X-S{VIXs@k6B_a=>UY-7ZkCtqMOoV{iveQ zD9JR&aXg6$4NqdSA@>F37Dz1^?!t&&WEe2})VEW>qE_^80XcS&BA(r1*W zISmD+sXJa%-4H1Zsr9Ed%&YbHt+#&4oG&wHIx+>5StOQub#H`0prkKqu#|L-(v=^= zgLbHQwuXv&w=H}ZK#Qny1TqaN+9zcajHaHtwj7JjykQMH^VJfmdGzUmtf+8KVM*Zb zTzQFfDt23b3h6FNX4ZgUYE2q0o>ot*Py+Se3Ns6B6% z<#@F;C!J|UYMv=?vpmii#KGrqvdLR8nQiy4kw@RDxMs=Zz#$;f|68G zOtTM{%Qo8pRb&JXX-6PR{9b%n`a#!=q17 z39VC6-3Xc9h`Z+Ah68L|_#`uybiE^XahbvoL?d~flppK;^rbLop9>1L zz{tky-dfe3NVhcx&2nWmaP0qH{K1X0S25|(yEapMD_i}1RX0$F9^N8%2gQf!yW@y$d#=ZX z6O=%=y#>EZA}qHE7&?a@EVeXSFt03 z*~~rS4eY$kwVQmU8LCrilKc&z4LkV%&WPgfn&NIek55zAXZ)R_Z56@ue13tS1U`$; z@w=U)&vV_2F1~;-a^g$;Bn4-_%z@y2@hc(L^F*Ky+;bhhC$6CX8U}dRUBLryqjyXp z9=eJL6Lu3WL-Gj~OMkkG}Ow=7nsUhvbMSPW-I(eS2;p@cn4X)B^GvDOQ1`kFM;G zAl+U=x*gy1ky4&--2hi>g45u{Dz@+Y*zSlL_6J1u;zKlH(FPH^HSA8cUemuqHz zock2xG9d|$D6q#G!K#}Tpp#B}BF@j$fM!CV7r2UMQ}Ci@i$MDketZKo-}i*Z`_NDD zQ@&I@{YU8givufoET1?;YmU9b`7VCMiI*0YW3~)trdII5ON`({UFs$Oo#IFMBcPLe zKa_eINBMm+b7}=2yM#wLHZnzjyqja0S@6d@IX;sq`Qxn|mosPmajQ?d%h%za$W*W3 z+*_0##D$`Q3OB_t#T}3=Kf}-Yts`A^>Sn(zzGCh$w&RT++c#phph kU*M%z@EbmN@cFl7(rb8~w7!Px_!DQ-oc%N2!e6lCKU{_k?f?J) literal 0 HcmV?d00001 diff --git a/backend/target/classes/com/gpf/pethospital/controller/MessageController.class b/backend/target/classes/com/gpf/pethospital/controller/MessageController.class new file mode 100644 index 0000000000000000000000000000000000000000..fcadbbd10b703500b9281c8f23856d6116e73835 GIT binary patch literal 6165 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 Qf8lI`vwy|k@eefr2O(N64FCWD literal 0 HcmV?d00001 diff --git a/backend/target/classes/com/gpf/pethospital/controller/NoticeController.class b/backend/target/classes/com/gpf/pethospital/controller/NoticeController.class new file mode 100644 index 0000000000000000000000000000000000000000..682632788b4a773898164a55e2ef9a44f9b530f7 GIT binary patch literal 6495 zcmcIod3+pY8GgQ8yV*|KWT9yT6`D}m9Hm2*t4-6AUa%z%p{Xeap-gtaBtvF*wllLS z0TC4iF9dIka(E)(Q3TRUIlNF5?+X<1Kt=!bKlP_SpKoUNN;mBmwZCrW{jT?W-{(DN zp8fZcCjj)}uQAl1Hi9}0^=J@izTTKJbj!$$>z9vSFO!}?!#Xo#dg}#hJG(|25k+GJ zF%9#e3Ft{Xt&eBN^sMwIY&UCqhQ+yz=h&7d9evRD%%t2@m=I{n_*28unc|8-&p;&> zZm=Al4>$KlFkhfw?H@Jlw3)JVdU|@)@Ju&rU(q2nbrr4^k~Ys zLeaY%Bb${@3{9wwQ~eeVahxJh&uME~ptrNjmu7D6o^4x`rl-5PY}R%>eRyjwlT^3$ z#;_2r5iHWM7;OSAMH~|uPmW7RATniGIeGb*Kx=2BYv7n2@M+{&_#Mr=mi=s#6@H|F1?M@iIhNh$kMcRMv!S(=8eXvC8=A{ z^+JD%V68xVrQ2l2Grj3B5Y;{Fl-c?Ou02T`oHU|qutCGc=oe_DO2eMv<%rWl#%NLe zFt!*uYp_YfW^CbZx4643fbyFINoHrQGDUqvFVS!*5_CG(n4+x~RZUD?vVW^-%2~pG?S7;8b49kt;;wYGNqe>2Ur=5*q4_pnN zx};pV%ghW-y$4eo_9^vF=aGCNFf8R}&X~cnXBjTpvanpJjQlF9iYm@&b<-O)+^lX| zTKT3TW>Lh|{x@rQi`swo@%9g!5E@6hm0wbmN0 z1vi#(csF6lTgxND`hcA@tj%;Tg?Dch{SmxZprhys33dqMhSl$k=h6(mEjJ`(R#lBC z?h-g7kzutoQ%fzsd@oH&wgf>6Q+r~#1MgQwY-&wgD+ z4a?K;ddkpP@G|zBCxOhmZgskCM~)RNEk{h(r1APQ>_7eHgrJ`{U_0Zwn^n1aOxa?e z?M&+XZ%BoPI$dIAQy3$-yVg0fq(D$mD z24*;Q7FPOAX6j~v>aiFyyor1S5{o*^kCe3)v2&UF_diszf`*W-= z4r7Hpnpq}x*p}>E(Z6|nVsJ$llYh~c4M9y8*j_o0lsoE4glj|KE&^v&5dbV)?0k}w z^u93f4E-;~35;`oMHDN=!4P3A2151cLQmdkr=|&fL(pXiTyu<9RRPIKKz-f+lYf9+ z^*LlHR{~vA-qFH9Xb2i7whC3-Vzb|B6|Hf~vSN{xL07em{7NC1qxq`zMnEeCrC0fB zv1rf5ffa1n&N)fB)l?O8;oz(n|5b_wUudh=j_*ib@w)+?=46igX|sq-^G4hDT#uzO zD7@~12K+dNpWvqv{7l2o@r$y?B-Am0kS7c_bDr(6kDG5;UfINL70?atxYWp`Ea@&A zu8fbbkbf;dh}5e;Agh_tCEzgMF_XqW`MJS~yQNXPFDr5nMY*kl%Yg@RRr zAc9xe)*XK{ z*g_Tx=N6?}&taTjLxt9a3I%XC@Bpy11m>240xdXzN4OrstWXHV`f>%a9`(hFu(QEq z+$ivP!5+J44+UFW8N!FrtHjCUTPn^9U!0}BC$tsBX)EB_7UFpv%ob7c8A|bhi-RTL z9Xb(shjAnXZ!!e0qh|)|pMlmBc+kdOA(&fhuq(bz9Kt}+J>tF#oI`zA(dW*kaaWfh z+fh)Z14r={O7~TwQVY?Xhxlj#;wOBF%d~h>spGpqpoNe1Q#>K?G`(3UD_KYKvX%zgg^ZMo7;0-uAYWXNb8+Ya>9!E)cnIv3O4v7)3#;Cxfej4xi%S5F7X*zT-&MV2+k^Ux|1t;PPdZIbJ|Bb z&uNl$p3@%Ex5wY(a~k$jXI`c)T*-4*uB+&1Mf6`-8G#f{O|d2aM1ueS&V*Wr?{T#T&-t#W w+~fNk|A4{Vp86%o8!*{73v5e?i-S0OL?w8~^|S literal 0 HcmV?d00001 diff --git a/backend/target/classes/com/gpf/pethospital/controller/OrderController.class b/backend/target/classes/com/gpf/pethospital/controller/OrderController.class new file mode 100644 index 0000000000000000000000000000000000000000..62be403b3471984bdadc1ce4186bd249d46ed767 GIT binary patch literal 5468 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 literal 0 HcmV?d00001 diff --git a/backend/target/classes/com/gpf/pethospital/controller/ReportController.class b/backend/target/classes/com/gpf/pethospital/controller/ReportController.class new file mode 100644 index 0000000000000000000000000000000000000000..651f1e76457f1d23b1aa0f0cfadf33eea7550ca5 GIT binary patch literal 5944 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 literal 0 HcmV?d00001 diff --git a/backend/target/classes/com/gpf/pethospital/controller/StockInController.class b/backend/target/classes/com/gpf/pethospital/controller/StockInController.class new file mode 100644 index 0000000000000000000000000000000000000000..4c98751849c0b0ab52ba38bfa7aa75f99ccc2a2e GIT binary patch literal 5254 zcmbtY`+pQy760DdB$F(Y2MeS|(h?{w$r9K?Aq6&2LwIy)2#{bXAhna-n`OxC&N4F_ z2-df)Z^gIxto2c~K4>lBrPe3as@1B$`Dgf(eySh8cV?2^giRVhO+LGG=iGbG<9p6M z=iGhyzc+pkU?=__Lj+L`H9BfhC(v@nm@tx-QOG3^jh>MiPoS>XESTOdfoNyfNCWE8 zpdqGX33P$`GIljexdClhIum9_ z3Um)tW8wzW(;ULpDJ8#2M>ARkmSmk$ZiY?Qf^7Dbm!>qt1^SfGQNzxgS-X_XPmUU% z=@zY$OZ6S8Y{;6PX&2n&*^+c7lLJP6G;17D<719dEJ`ParHICf;tCzDxI>_pWNT6& z)fwnAKX=czt#Q*!x}{>#cD&^9zEUBhq@@(oHXU!qN`Z(xE3mC|V6ID2w^O=qCuz7- zV8^^x%JZHqxD=VB(K(ZL77ad#0!fFBoQ$Czt5j5U(6Y`02f9XSvD5d`{K({`XJie}NT!tzsn=Ou;ib?isn>&kj(`|C(WN1wV?DYB?yY7M zX?cRuS2TyDTVzPk5X~)RGSYPgdaF37dMw_~C#4|Ws3VE{2$5?{kn@Ua{7%HM8TV`0 zqGKz11lCm3Qx-hao18u|0u4Foskl#P1>%g!avTlVg&ad|Gq&m2jvYKoTzaHr_zaW^ zm5b8_Pv)dUU3;-p!!8{U;w=K}s;Mx2YAcQ#u_E)`lS+$3Xq#y#d2UU^GA|gTmZa0l zx&>*6hjh2Vs%kPqGnI%K`mjgGUS&c(rTFP4hW&U*Lt4iHJS?!Z%sRA$Yt4c;Vpt`@ z&7_uAI}Yj?#33p>q3DOk1X?@Om3mFXpkyA=F@$0AaYLB`J(X^oURym5Dh%*JeXEWU z6#%hPk)baYRP}g-s$?9=_pFN16DmMY3Jg|?8TK5Lj=UYb>T;{ZUks=4sD`)ecnpTX z>M~YlVZt7lGj5XEAOR9j;+)PGt%EA#X9tZuL0mp7U_!NG$RMjh>KIdgsHiN#0>XFN za8LK!Sy_**YPG53i~^!go-G-ctCX{JnJL{S8{ebg&LMZ-x)J9 zvfnaXw;qnb11gZ_&pPwwV^tkZC8?xiLP_eVE~yMgJzCZJNgWr|`g;~yKWyfha7zyD zf1J6e(zW3!s0_f6q`1FJ$Ga7GJwzombc>pMpN{vdxz=zlP_05#kA^3iLCUU9vsC8{ ztIx@m@{G;B=QFaX%0N9nByd-{z!PC+J1oBdc4Q^bcyMynni!tIM^u&g=$y*m;F&Mi(|zR^mFT?51@cJpi;ki zflAk9!))C$mmibCxuEM1=wEzMoUe7EJ*~3=nk-I(WWI6sy;T98U7k|As6^wiXJp0? z8pY5-4KraX@ZcMOwKt)-w+)q8(DHJ`bWH|9U!h=oet$#X?HI6~T+%J71UjZ%dd_yn zldjB^992UNzqluhjx5@)mptsqz7o@&LpPCetzRP;6U<*jwk12)_3b&B9$eQYu%#;B zb8<8}%AA!nW^_pImmUo-sszr{I9t`3D4V5o&!Tw`F@Z|g^VyKQo|R)p$(k;CViSAI zP0X|P4%eBE%tqP8g7Fs=9KXsePKWv^BbGS4vzuHm=)mGN-2Og1c9 zzIdUbw|CpwN$y*=ww$76P_);w09F>4d1`yLHjF_LBz}RrE0WTD9N5GR+a)I>_n9gS zw}yTx-~TqMvcp@=q7h}w?UlFFzW-;de+tU}Xh{0ew81R!?C!R0&!sPlL1K5C>+tIs zeuLj?xTWJI{BBl_3=IzOHxDlybDfusus z>G)lSbT#~ieNB03D7c!58ve=-V&SEXumBIN=G{I*ff2;juL~T-)kUAr8YZV&e2g<6 z=i6~Um150_s}PCxSD+=jub}Zck|Ov7zvJ8hEa&$MH1KZTggfv_QaXZdxQI{jjSPG- z!XGI?5qz5Ch6u@OQl-St;Iovhq`m-+|3J@8EIob|%XZYY)!sr&Tip#xLR;+=-gGR% zMK{rYeAVi!xT~%1I#x&V3$$Ouy35>IQ=!~lRBRO$>%dB00hMxFD2Lodz}NVR z;Olsb&t{Ik!R=4G_$IzZ!ngTZ6D8$4{5<30yXE2c!r}K%;8_lTfFFj){DZnFz_ZHy z_1Cc>f@ABau;~^C`FP+K_H&|9QLZBuAs~GRyKiB0_Z0eHf);%SF*TgRzFpmSstp`H zb`1klIII9|?7ohpmkKaSQQJ>=VR^ghU zZhibM<45>0cP4N@F5@|xO?_vu&f*Kj8oW6wG=+1UE$-hVWQ4yg2mUHiT{ZrV>XCZ!e3hpIr=h%y%^T!)FJ|BOFKVHr8 zJLB*1$16B~Z~O!PxWSLr%Qx}F@%RU?;=?bJZ-8c^zOvMv*#SPr#Q(@ACn*X3( zLq^1w{|jj%`cqOP_?eGIoFnyX;)~q(^hpSpF8(FoTloGf#>nsSGX8)+F=}2RHAd>6 K@hbj?w*LVgY8RRS literal 0 HcmV?d00001 diff --git a/backend/target/classes/com/gpf/pethospital/controller/StockOutController.class b/backend/target/classes/com/gpf/pethospital/controller/StockOutController.class new file mode 100644 index 0000000000000000000000000000000000000000..31ce38dd78d49bd7367605754e03c9fc07dc3a85 GIT binary patch literal 5317 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 Dl3!6w literal 0 HcmV?d00001 diff --git a/backend/target/classes/com/gpf/pethospital/controller/VaccineRecordController.class b/backend/target/classes/com/gpf/pethospital/controller/VaccineRecordController.class new file mode 100644 index 0000000000000000000000000000000000000000..82c8cb85593f7b1d41f0c97521fc24768cc3dde4 GIT binary patch literal 6257 zcmcgwd3Y3O9e%&fG08H7upA{6XrMrI&<{D)k?iuZ>f`&(Z1zZYG0{i!Je&FEo8R|4-rqU% z#6K@R24DmJ8bt(E8me{FpjM#qs5xXBwwWFtc#(lz?bM8ZnT9+`05WJi8qVCGQqlV0f# zSqUkyva1|JFMM3eEq5laG-}W>4UGa(s*&f_a#dd4dCGVcG0e~~Q^zdK7Fb$Ng{*Jc zMz2g{UCSTd#~V*z3h!K*_V-agf!3DR3IfAJ#-^-4s7T{=m?Kcvv9EXU?wwnEqL_-AkLJwTh9u~5Sz9oJ)ViCaSgx>X*} zn#zn>Ek(yer^j0lPQg;#prJ)aE7~f6LSvNMi~^RSUYmzIlLBoyzLrDaT+6hrQ)a&{ z#BuwrWKyQ1SckZV^*VEdAzwBYsAtMa8=Ep#kMuH5+M^R{ zr0Y72f(eVh<*0N(qYu^-fV~>U&9lh8quw3yTTa`wGwWK65FvG%AO&N6K z>9A;2#wR6xGimy!(Wx|v2N_?Py2w{K*D(4k8XmZJi~tpneLD8zSxhZ2n@C8HDZ9Q5 z^b-y;1=c|whg4mt_RJw!hdanT;Y!n&Oq6wajuQA>fnCL7a6|9b|fW;pMo*mED6nEM<2zo1qt_DpYkiM(e}-q@qdbNW&qG zD^t!;KqJspshAzC19L%3N?Qi#dGIx4bquLuzOYbhtn`p`Oy(=0OonMIFkRKBRL0(^ zI%sm2nPPl5zyL2&}$(R8}ktYJ6Cz^mv($mn%ulh~CR$TpW&-%ZuWETF2`Ycb(i7xH&@uOzzk52K8)q?pdf> zk*MVw-XyT7;JZ%FG6SZ)$sNe17+PCTCS*ocqdGjuw$+&)VsA?}+d&;}PD)mqu-hq` zC?3FDRIz&Nm`*#|8~Oz9xcaD4k_@?u6;_@~HLlQ*}E{j)|fSArF;gphWdE~A;DMsC%%<#CoQDO^DUvwT+& zG`7i-aaBf=Npsl)g-L;gH6&C8qp_%51>yw64psK7Q#8LiOIHcpP?q1gnTu?-6JdiD z=m^eCsPb3p(&RV06#wDOs1Ka~p8fi=R+X)cw^EgR*H}zyW$fabT2){$|s~T4^^*M{zTIx`PxADo_d3S(UrP#E#^AK(A=b*JMJBO(sjQ&qz`vK#+{FIrvZ_t)fb|<8ruIsofL9YtH>H; z3bF$p<_?utFn~Pki{{ojhTrMm>!R06MSO_{la6|(AVhS6gdmw`S zv1f}5IIIu}y{%roh$5Y~EUw>it`DRaNlWZ6XwC{2!*YSIwUt)Q_hF`ZxC9_Fbq=H}$JnS(1i^ydV6 z@~r9A=j^sy*^ma;`+YW8-sOykYh}^2M)x}oX49L#8p8isgP80th}V+o4Vqg_!h5W zd{;k>c^aBUbmrgD$=vuhpG5GT0EQS>-{t-HcrJ9#_wfVXH}d|6^u{mnOZ*zY#qaQY P?nb%$2mA?tLDRng(#uL4 literal 0 HcmV?d00001 diff --git a/backend/target/classes/com/gpf/pethospital/controller/VisitController.class b/backend/target/classes/com/gpf/pethospital/controller/VisitController.class new file mode 100644 index 0000000000000000000000000000000000000000..58799dbb7c8a6a30315225d0c9e85d12d47f3c93 GIT binary patch literal 5705 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 Y8~nC7`(1JNN1ln1=1=$w{)XoN0Jzqau>b%7 literal 0 HcmV?d00001 diff --git a/backend/target/classes/com/gpf/pethospital/dto/LoginRequest.class b/backend/target/classes/com/gpf/pethospital/dto/LoginRequest.class new file mode 100644 index 0000000000000000000000000000000000000000..6e46c2e7733810f2ee7e73ca6c68cfe4c3c9842f GIT binary patch literal 959 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 literal 0 HcmV?d00001 diff --git a/backend/target/classes/com/gpf/pethospital/entity/Drug.class b/backend/target/classes/com/gpf/pethospital/entity/Drug.class new file mode 100644 index 0000000000000000000000000000000000000000..8c234ab43e4f7743e20b9dee7ab3314de88fc63a GIT binary patch literal 9537 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 WL{a$-K7XV?qZWtt7y27gu=!u}tZ3~3 literal 0 HcmV?d00001 diff --git a/backend/target/classes/com/gpf/pethospital/entity/MedicalRecord.class b/backend/target/classes/com/gpf/pethospital/entity/MedicalRecord.class new file mode 100644 index 0000000000000000000000000000000000000000..bc2be256df5f9c4925af6d25daf87dc3d4ee7100 GIT binary patch literal 8599 zcmd5>X>=Ra6~52bW@%)}yT>-Wl6px{prtM2>`n|0c4A`3G>{S|(!`!bmW(t`Nmp9B z(o&#M2z1{_m$U^6VJT(l0+jA8bmN>JdQN}!Pk;ANntu1qlQfd2LHX65Q5H(^P{ZSs!@W)!bj|q?M!6Z*QQZBbqH$BEZEk;vBKg~&b0G*n|6=Fj8n9g zMwdq262DZmN_c^ZTrO{wN-Wi@k9aJ=2B`gdEU z<(wnwXKQp0hg-6?IiD|-Z0S8uqx0DtcZ!zjEaHjNXf&2fX|#$XAv1f#&RFbvgGPhW zRdP&cS@MT98lg3Uq8a8}v-YATNO!-@!A*LyfH&QyLb91I)F>?}%S&11XYq?Px|rUG z*2`Ks%dybN9iAqd$UD}&RUC~1d5K1Ernd-+WX$~b>zB=(psqm=*6r}op{p5usYV8k z3JT6!=n}Nf;E)F@`;Jp*gGL)!Gi0$~iJ6-<+QQ5zm~(EAvU^OUZM5BWZ!5oQSBe89O$fJsVv}UT%plqnKWIK2prw1(Jqd5Lvng$E->UujdnAn3lLA5 zsB~b&tVVknp#ib2oDm$jN~5=NAc?@NHz_!HwMN%)um!;_GB4Qsc8#trduL>7u=hHR zOgezn0(Q)k9sT96_Q?7REH zdDSZ>Q^})Lf3K81i2r|2Ig!0XM!hvg`R-*D$VH3C#(|u*C7&;#?@^4d=|UB&T>*%ubs{ za}lMvh}VchSrtXpHr&+LwvFCLs+>8ahq7pG?L)<5-^z-II)}i@I)~~8f2F#iG~l+T zrlFF-A#{~+YcWI&K zLZm{$S+I&Ig`7qyUc*GBN1B>+s$~nl-HlZ4-Ed`IR^iHhhh*0;a5`O)dbbO%UEK&$ z;CgqjRQ6f#p!&G-zOf!jTe%Dp)a$bRLamZiSsV#UxLA*;T|#PBN?4`1usUx{Lfxek z($K|}Z`~kf5iFuA!SZcFGQG>Gq|5fYTu^lZh17OIURNBsoH;yYE~yFm5xoM>U%Gds_&xCly4Vwr2N`An)0+}YpSlz!l`ltg;V9$ zh^4%r9ZPw?FX9y3!h%sWQ&=u$EEH+XBJDLR_6vEX-e{?pEwvL>j*F*UG+^nz=xzY^ z7u60RxwTMmN>0&Sa_eF#5u%?*=@<0NF#U=b4ZjwYs_qZ${E@<8EA76jyN(z)Gfts+ zRM0W+fLB0Q^l~$w%~_??WT9|)d1>^t%Z3`FoEuldukpCb3uKQ=NsO7f+>Gs5qY?V8 zpyz8Ea?s9h5Npm=iNa=WcCe>5JEUi2xn}pu>|k#tJNTw1JJ{i72U~7-uvN_tzN=;j z->E#_Acio=Ch~c!IF>U@C94#smjta^(L;U>AErMDI{Wlcj3&32=sYZ6o3M0@%cEP4msfDm?xa5wSJP+qa)lUHo-=ySM0~+6`L@5#m>v~ zh@-IIY0&XMYWbCng z$es1%^L)wJg87hp>dC8p$=ICvko)S%Bfezp+kD7p)sxrxlCih*A)i}MzQmV|y`K;H zf_k#yOU4$_hrGI;yvdi0oum(WsGhvtmyGSC4|#1p`3he$Hv2y0b@k*ceaRoB4`BrG zz!=4qOG9{gF&7db|Gq90j#RXhd~Sq+$8ZTAMw|WH>}C!N08D?NX?JZ$Nb(i z*{~*;vWjNA)V$eWv$J7ME{he-ZmIckf6bnTHMzuAG(6NzL2*HCH#R$InuV6)2%6 zJ)jw*4WJpLU2kJhy8^Z8?HXJ5qgon4y#@4poi%jusXyv zeV4uot5X!{Hu@HT{sGlB$H9+4(+ucLM;mE(JHB6D$s5?we_=||wsMj@H{&!}1QoaiVKfwRw zP{rg@^dm1Gf;{56`@O4b@6sVy?tXOWF??{Pj2@Gv1izlch2==_1SFCuC7I;t`oIQR zFb0yN3n&+nN^ETAWRV2zo$Qv{vW^7*UA6@ literal 0 HcmV?d00001 diff --git a/backend/target/classes/com/gpf/pethospital/entity/Message.class b/backend/target/classes/com/gpf/pethospital/entity/Message.class new file mode 100644 index 0000000000000000000000000000000000000000..d3643a820cf2e8a75c41cc0ec0f9b717e9b41b06 GIT binary patch literal 8251 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 literal 0 HcmV?d00001 diff --git a/backend/target/classes/com/gpf/pethospital/entity/Order.class b/backend/target/classes/com/gpf/pethospital/entity/Order.class new file mode 100644 index 0000000000000000000000000000000000000000..f5423b2137ec16ee5e8bbc71c4fa38b7856f0dae GIT binary patch literal 7435 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 literal 0 HcmV?d00001 diff --git a/backend/target/classes/com/gpf/pethospital/entity/Prescription.class b/backend/target/classes/com/gpf/pethospital/entity/Prescription.class new file mode 100644 index 0000000000000000000000000000000000000000..8d9d19c516d8a384668cf29404ca0ca9e0e57abd GIT binary patch literal 5869 zcmb_g`*Ryt75>(iv@2nDPTS^friWpujU2Q8hQ_p zozKERR!7c69;Svn%l>9@t$v|ccY}4mS@!~`T6AlH7hEo$X}HaD!>b3LU(?XzRcL*w zV}8l6t(AnieiH-2mVU`=dck5v^bMLA5`9L+F9&`j?7YpyFm`f6&AoTTWHO@ZlIX+~3mJ zg91EmVgi#I(rYfafJ-|(7K6&Y5+`++iK4KXafQLAVBT%w9>L6!c|P1h(fv9TuNU2U zcF(Cz6#Z{7aWCE&!sntT3~w1NzKD{E6PVJFrI}^5?YC_~tBn`7-(=#=5%{d!d(nHJ ziCN5P=%b0**!J&^%p@Fu;4PSVOT;_ZJ_E4}izeQRw{d6Jo#y(iU*TEOHy3j_iBmdG zn>d5FZ*k>tj>5&9YRf%+LBpY>lZfrOTGbGPWZA?D&S}`S>1?>Oey!{T4|oB`t$qPle0gvB!YO= z@i)DS-zsiiUZtj4ueO>+r;RJFIOHu>N*YqZ)5JX%b8RnpYOn58Z5F$*Z}i zTAQnGL(Wm;AdxxFI}J~4km^hY>mGM@OisCr^vD6y%`oswH~7-6SSg$odAM@MX*iqA zP7O{XN5d*FFdMKDWdjB^TTxI?#m7~Cb1NeYTVc#|zbVHfeNNd<2=rSSLYVC&f^cQ+ z6gC~7eZrKJ4A~<^Q+BGGiz^Q`owig*mzakB zP~YhY`R%(z@!RdZ?FH$h(d_lnXsY?q_?+^i z@xhJ251o<6z3jIdWtYLt>@ygzF76UlMYkD3uHqEKLj;|?54d;rEwxJFKHm?TLBpws z;nW<+;OQK`g>UQlj<^k;(JUcS{8fjo$CnDpj{R zy5##Ct$OLE`F{&hCe$0@55>Bo(jwNSOw2mf>arKOB?I5pP>Jv2VXrc!P3~1ED8%Rl zg&ZE6kiugVQs>x2t8;9krA~ZG8{_sa)@p8Jw(2ySZd1n(G#tEP_mVb6$B#7ZxjB?R z815kUv1aJueJ$QBPNCsETYdaKz~>z<-iZgPVy(&U9#LP)FH1`KWyvVNtP^9@hbX_x z#k=tyQdkcrsUD_^HK9^v_-mH<@X zvZaZ7kngSJUqJsUm2vV=BAF#&0=aKHc~>Htg<}G_u$?@TNM^a1K;E&Pyf2Z=@-czD zYdiT+BAHcY0{M>Zf zeg*2Y`eUFOdw`%ByI>6nP(gtPtU?SlZx0eQZx3060yLyRgVs<4N?m2Z_TF#{ycq6q z6yDkbnh5BQ!`j_w@n-1Zj}QBCiG95o*GBMON-6%Md>!wjl;*#{|H5TT8Aie1@P0}< zed5pf03`!o!t?kbr7XUIpWs83a=3;k@nK4N{05)HM<|*2J2vo9N`3ez$NU(jeqK%s z_&B8jEyI8FAEQ*z4)WIh1f@Z30=w}^N<;V**R_h>y76!H>o8u%P8~h`Gqjg+dnjiA z4`P&@nsm~X_@yOuQkjWG5={&56nh-MEaNFO9qlo9t;LzQL%t>5p1&}#i)p!cKTYIm z=pTjBiPV&I?vX-iovv*ZCayp~at-%CBKnWoDWR}ZN@ECz4^_wPv{cd8CCRYTk?Ode zk*Z8v#Rv#lwyjGQonNu^NHuL6Qf0JN42h66V`rs`(V$q_NHuTgq$<}|F-FK5Np{A1 zxNfykz4$9Wjn8mb()bHLOR0zM^CvouaK;1pH9k)%g=sv4$0?;*aXp4FP|EOG#~1n5 z@dRD;2}%Zj%pb0vq?E<)v5T%LoRQ9>{Tzks>`3V_G>r}eO}owkI_)0OF^qHsh%l+G zT?&?o!8*w8y$Y;v1$XcX3Pmw)pmbQtIz{B~sNn*MkN?T_ro_*z$!bNxg=R sc9j36@D&-(UzLS@p1QB``FfMN>?tb5px@;4EWXE9j?(w>Lp%rTzu$(f1^@s6 literal 0 HcmV?d00001 diff --git a/backend/target/classes/com/gpf/pethospital/entity/PrescriptionItem.class b/backend/target/classes/com/gpf/pethospital/entity/PrescriptionItem.class new file mode 100644 index 0000000000000000000000000000000000000000..ef73a023e62af6291ef0b87266c603726ba05a87 GIT binary patch literal 8539 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 G`hNl5dA#ia literal 0 HcmV?d00001 diff --git a/backend/target/classes/com/gpf/pethospital/entity/Report.class b/backend/target/classes/com/gpf/pethospital/entity/Report.class new file mode 100644 index 0000000000000000000000000000000000000000..7cd0c10714f25d3ba802490e3a341794cf7c1d54 GIT binary patch literal 7241 zcmcgx+j|>V5uao0vX)l1;`=sfnlwu4YZVHi$vT%NPMkW}iHV)07oc5R8(WDixzZ|N zu7v_66bgaTmH?&P8YqEMXp%PES}x`Lc!ei;fxm!fK3c+W&N-6S%GMD)@O_qccIG#~ zbN0-cIkWN~|9$mWM6`>37o#R>j#9{^Fhv9Mj+E@Nddyz&lYR zo+#w!N0_M9q&8-Wp2?Q7-gt&}YfNfqT^Ni?(`ix{bqfl4%S*1Hb|2HUSIlazUXv_F zg)w%{Wu~g~swrn)%Rvy>L6z04_Q4O6k zX)|pR6q_r$j_1x~7cl`#O~AuVdZIArZKbziB6Cjuz(ZvxC#b8>hgD%2>A#P`Z#U^3v<*)^&#Q&S z>Ff7FbU<T@uG&3@mohz_9n#}wzlO`C-)0p9avhuJ=M_9>I zo>nns^}9_v%IYN4d;MW$>fEOXiHE$eR0zZ(T)stO*%>Q zf_fI6)9z>?Kj(NSvL43Gmpmu$l?46CPbMSoW4h739?9qNziH~nX@sS+HT*kP`yt7W zmQh6(UEZ3rId^Y9U+^3+i^mo;Ji%3G)+sDzGlg<`ad{S&(o(KmN;_3tdd7j@cxFV< zP(%3f4DU(6Lwk?S91*m&Aul<~Sk}$)K%tY_9MU!2kf(GSg998RQm)ut*4qNRF!7Rr_vOo zPA)f{_1qDIektf-wQ_yg%q}ssK}VED8BrEEbn?o3m<1g=7FUFh6_xO_Tni)L)xs!o zs;Sx~`jH3Y`Mg^k%{ir#TZ+=Ff;L~bvOxoubn)p>2n{iCcAfMT0J{Xu;(bjkmm_*_Kzd*7AyO+DDm#yy#M%3ZO#Q z9AsL837xYxMR0uxOlxt)`wG5`xJ%kje*YSr~{mP>YcX) zI-~OraK5SDc`(o!{ds`%&GpV(1D)~e5#YR`-g#S~Gn)SZ=S}s_BZ1C%0|;=wt=@TW zpflc#0-Oixoeu^&zn?yUeaPE$1XoVT=)mA5eATJq>emVXJal zlJjH1oHsSh$wjitxlVFE9L#xh!<<}jtDLt;&W{JjXhXxCT)eBCw@S`W&?7-H+SD+o zItcV$+AKLg8O(WG!<^~_(VYE~^HcQcpm`27%&CqZ%{e4F@k@&0Y`zCq3#ZAY!GY%} z9J)C88X4y)+@)p7!hllWGhlc+^aVzvXt+_zvuob#Y@2ntp*kM3+ z*byttn8@qYet{BJ*oyc-JMAbyJ8i>?GRV-NsAc#-d+Zi~_SiA2g+Vb5YO!KI&^|j3 z&_3I=;tVo12$BypW+wm|vs&k zTEn1r4O(Nh`#@862S8JHr`5rrP7Ug?I(?vNy9=OcyW8qwP`3tkS=~O+3A+cN6LzoF z!=PRb>alt&pwLCs#%AA9uPW&qDxj50DlXBZ^cn2_F7Yg#Meoo=DRGWI3tck}h{xzL zNFh2X^7J`KVVV>R^m#}T%87A$98#2uVwAoB$)Iy0MPG!}LQjeHbPiICF4Hyo5~Mi& zg8oTghGf!T=`ZvIqy+t){!Cwi)Qa}y5 zXy+kyh$(XEYmhocfyU_Tkh(;f?xJr%>K0F+*Lwz1k2sHZ>YI>y=~=AFBb167Z%}KL zj5nz}N=^7P#GBNs#FqbuSUF@KMZ$&n=TM!*I}iyz48xph96*1s=06Ij0nXYpv& z@^x0GFn+*;3dd{cNl>&Rg@={s%n=DNOfbt6zW=K}YloeIHU3 zY4Z&I0Fpt^V`DxKsfB)zSCSt>iqYR_k}g7u)4%8r`Vk~kbW;!g7*c{abJG>-z6M1o zN`?^Fz$C;q3}3r%Vnr8)D}V|nv{I#E5g)9Etk-IAbS1ck4=`vK<2sj`SFlYx;$JfA z0fG1b$>$C6e{6!y+CBCb_S)#HAv8(+tx0M;HvnlWb5*Ju+l_IWFmWTo8fQaLP0K}6 z?kl*j@~5NFC>rEQn-{9@OtaYF{Pwz?%M+I(e0Jh9hR-2}!I&kWA4QbSi@_nDj`zby@E740hb_n?=a8L;xQT%Vi7^Gj*YxG;P{sU)6 Bj3@vA literal 0 HcmV?d00001 diff --git a/backend/target/classes/com/gpf/pethospital/entity/StockIn.class b/backend/target/classes/com/gpf/pethospital/entity/StockIn.class new file mode 100644 index 0000000000000000000000000000000000000000..d5e471b5e4200602626049c5b3c5cc935f672a88 GIT binary patch literal 6348 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 MJfN58DozCBzXmRnrT_o{ literal 0 HcmV?d00001 diff --git a/backend/target/classes/com/gpf/pethospital/entity/Visit.class b/backend/target/classes/com/gpf/pethospital/entity/Visit.class new file mode 100644 index 0000000000000000000000000000000000000000..875d7cc13643fc8ae396f0c5b2765566dd563b8a GIT binary patch literal 9553 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 literal 0 HcmV?d00001 diff --git a/backend/target/classes/com/gpf/pethospital/mapper/DrugMapper.class b/backend/target/classes/com/gpf/pethospital/mapper/DrugMapper.class new file mode 100644 index 0000000000000000000000000000000000000000..95de6cd3b520a1e015d2dd7a9a8adf6ef96108f2 GIT binary patch literal 389 zcmb7=&q@P942OSHwQH-QS06x+<^fg(MLew(EO^hZ>2}KQ%rJk1zM2Ogz=sm2TcpsN zhe-mNeBsOY&*v9_JDe35DO@$Sr`9dVNnG0CbmWeDc1}D!`P9A)Wr0J5ixqz`b!=Li z)hlUYfw2N@05#iQzuQFpy5^{Z>r%)KFMp^<4zfilOy;^Z9FrG?MYRtttA7G-hk<7SJt=0j+>>B l9{h-RA86}U=36Kn3+2qY{m-4<;FkSjSYJM_S%3uBAI@@-n;Cj&uqT?5nOl|qWIiE$%yQJWz t^07qqI6Gaw=pW!6{6JIE6EbW67Tbd;^K6g6#kR literal 0 HcmV?d00001 diff --git a/backend/target/classes/com/gpf/pethospital/mapper/MessageMapper.class b/backend/target/classes/com/gpf/pethospital/mapper/MessageMapper.class new file mode 100644 index 0000000000000000000000000000000000000000..47b6f6f15d4c05215750c12b05e37c0378650e51 GIT binary patch literal 398 zcmb7=!A`?442J&pu!^q&W@-5Zjg@UA|kHIExsO1o(qnX6WwakWFhJAz66~8hy z>}q-}S5l=6V*}bSO7^XN_C2-hl9P?0>7zC}+0yPg{-6vd3tKx*eJ2LC*oEfBKY`c7 z!mbK&$)@#IMShzbOc%cIDtWMtK795^-__<92Iuo$*IIe9(Uy(eIp>qg@h%!%6uzs8 p16NBSJE$c79iVTca&^RDPvby+hE|!LBOGEf_rqxD7ew`ak=f3YMxwDPFd-7M^#rh8hr;oiZwen=6EgQLU&LW9IO#-5rCtuj4F*vDkZQygd>YyS}V0!%=9)Bpeg literal 0 HcmV?d00001 diff --git a/backend/target/classes/com/gpf/pethospital/mapper/OrderMapper.class b/backend/target/classes/com/gpf/pethospital/mapper/OrderMapper.class new file mode 100644 index 0000000000000000000000000000000000000000..47f377538255d87a87c961002805cc3c11781f68 GIT binary patch literal 392 zcmb7=&q@P948}86yS6Iy>I--@53nle!P82?g7@q;PN&R2W@d%Hng<`ihZ56WMCr}L zB!Nu61Tj6-*W2UZJJn%sTYwb}bc?qwTXa68~sDQ07re!E9x;r_v`@pqoR{y7{Nz%`kAt zz`mHW8yV`mTETo3`qc5Gv9fmYhwXZQfr88DUPc_hm~2|h_uhvhD8XlOsR>CVMd~(; lW*|iR{eUA`Ep8|{l6N8wgH)Bo37o=g$a6T8JeB@Az&DS6d7l6P literal 0 HcmV?d00001 diff --git a/backend/target/classes/com/gpf/pethospital/mapper/PetMapper.class b/backend/target/classes/com/gpf/pethospital/mapper/PetMapper.class new file mode 100644 index 0000000000000000000000000000000000000000..cd12a1625abf90148d03a569dac33b6adde9e29e GIT binary patch literal 386 zcmb7=O-{o=429nmXlVHnTlR=0K0p8o7Oa9mRATQ0lTMY)j4~6XUX29@;7|xB6(DuT z!uFGFKkM`7*ZT*6D;#B*7@SqUr8>M)khJtM*u)LB9D;Q8DCvGw8Fmd$R{X})u&e2z zTuGHOObuw*FWI;D#rM>%OHMY1rjOd_%}N6?5P&CDyS6HL74IG$Jg*9R5QG)Qg7?{V+)mm2kYt6vng<`ihZ3h-M5tao zWG2icAM+(2pKtE~Z~+Gej0~JL-eMbGFmRsx6eLrJmO|i&50O(7C1mmLHnY7O$^~p2 zI9$*xVMngT`+C7mE?{f`SFoDAm1p0hUDlK(g|1K9i2RMcro?NMfyqo-N4bw|AXb~u zvic|Re7LZw!!Ao+{?aKgO9RuH?_u%&B9zW{VsXdJ;VOolv#JhD;pqjL%aYt@BAI!jQO1Y|D0#dNmdtfI}hNvI&$Hire!YJHxWQS5k-}wVJF49)If;!8PDgI3W9P)vLY(#SaX4f+R5)Mp8&k`s zrl)cxRm?C}pbesA+vykEQ@1WT>fqWwq=J_p*gXf?q7)`eT^o+Q7lo$ShvvmUf!9OB zzJ!>l<9a8N-{uO_rR{ws54uh7Ui`JY+WbLbw&+t+C(k6Rk) z<{_C0llhWwzP>*`0bJoI!^q&g@-5Zjm4c+XkHIExsO1o(qayk0?cO~MrwqFW#|wUE zYS`8EST3YW8O8>*VwCJ#`{H|QmnA0~L(@ksbh4q{a+Ed7U{cuHaq2rUu(NGwKKm!| za%kAL5SMIPZY=Wa++bSxzN_TUHu~_%AHR#$FAPqfdTndv*+yG7a^sv&s^eWWIGg#d qCJtQ9h3sHS{Ck1ccDYW(U`N-U&Ka6zx{t7r$q=VF&^XrmA@Bq2pL^l} literal 0 HcmV?d00001 diff --git a/backend/target/classes/com/gpf/pethospital/mapper/StockOutMapper.class b/backend/target/classes/com/gpf/pethospital/mapper/StockOutMapper.class new file mode 100644 index 0000000000000000000000000000000000000000..755994b2b678dff112d304ed48ae2897a6a81d91 GIT binary patch literal 401 zcmb7=!Ait15QhJ(x^-6t!ILi_cyS(}D(JyeWx;~?X^q{~HVI84?5lb30emQNwu_2; z^N`Gh$$ZH-AD?gU0IqP9VWMzeyPg{VOkT&O3*JQTsAuo>KxK6G%Ob`5@t9#(;ke~j zrjBhxi>lRi%rI4;HKbzKnaBnd}qnV>ZS)4kS*ceh7R4@`Qb8 literal 0 HcmV?d00001 diff --git a/backend/target/classes/com/gpf/pethospital/mapper/UserMapper.class b/backend/target/classes/com/gpf/pethospital/mapper/UserMapper.class new file mode 100644 index 0000000000000000000000000000000000000000..de4e5e818956b61ee1b6cb70aeb33ba87a46c755 GIT binary patch literal 389 zcmb7=&q@P942OSHwQH-QS06x+<^fg(J$PCXTJ)Y>)9sYqnPL72eKik0fDa{3w@9Hk z50eBk`NEg)pU*DBt@R?3{Rd4dS1NvcRFj#fm?eIyNo6 z)GKLXfw2N@05#iQzuQFpy5^{Z>r%)KFMp^<4zfilOy;^Z9FrG?MYRtttA7G-hk<xi0$Wxr;JkI@7;1}$%c!dA} literal 0 HcmV?d00001 diff --git a/backend/target/classes/com/gpf/pethospital/mapper/VaccineRecordMapper.class b/backend/target/classes/com/gpf/pethospital/mapper/VaccineRecordMapper.class new file mode 100644 index 0000000000000000000000000000000000000000..f62be0692809fef5f29ed632eb7f4fcfcbddb352 GIT binary patch literal 416 zcmb7=!Ab)$5QhI$?b@o~QD4Ag=K)p)J$R}JE%ZK{j@y*oBqUj(ujauA@S((Xixi6& z56Of~^38nn`Stz*;0_lB1_~4HTB`jkc}Xi5y-D0q%ic?%1#4}r%tX7eeD3cG94lO| z`HiVzThmLm7M%(V6=+MU*tKTqI%+o+Clh_s#heK8!+hi@JCwp`ZfeV^3!>nrhtP8R zPvC9;;m}2FGHLVMrMxc{#&g#NEl;M&<*)v5ooqW&xSn+x(aOR^Q#JBntxH+W*{EPC9 zJ(gRkQiiz!4Gtyy*1q_j+Fi-X#?bUpg-(9F?l{V1Ww2P=+HvYTF{q1u)4cen;ng^> z&mb<@w3`_6o7`Zz_I+2$y=`>u>JQuH@B@SMr(Q=|8I-b-TjzXI6z`&@RQRqY4qR=7 k>_|xb`+z30T+=W(&~u~-L%U4x8IG|S>k=ng=c=Cq-@Vv**Z=?k literal 0 HcmV?d00001 diff --git a/backend/target/classes/com/gpf/pethospital/security/AuthUser.class b/backend/target/classes/com/gpf/pethospital/security/AuthUser.class new file mode 100644 index 0000000000000000000000000000000000000000..9b34430086b247a648163b268afc04ee9a2b33fa GIT binary patch literal 840 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 W{3i*~5%@jv(a|gDwd?o`(*FnJxQpHZ literal 0 HcmV?d00001 diff --git a/backend/target/classes/com/gpf/pethospital/service/AppointmentService.class b/backend/target/classes/com/gpf/pethospital/service/AppointmentService.class new file mode 100644 index 0000000000000000000000000000000000000000..fe1e8711d46dcb28d9598ece36021a3c5993b576 GIT binary patch literal 340 zcmbV|!D_-l5QhI%+o-+t*0*pE9;1R6K@fV#6Kv8kjwHKlb|U&}9{K=%sM0kprP!N? znSp`%_`mu1yu1UL<0(N;VN$qSmwu}~$<77OVk#Y|IdVaI>AhnsHCf5NR|y6R&wFz; zx-z!Zulb$|N${vJy^?a{YJPLAuFts<4!&xGrjw8j?CdXi{ex2&Wn5Y#Z9@u&%`G_H z+yR|+N4HMVf#v*HDP5!rkaT^BQ8&k5>-}v{ literal 0 HcmV?d00001 diff --git a/backend/target/classes/com/gpf/pethospital/service/DrugService.class b/backend/target/classes/com/gpf/pethospital/service/DrugService.class new file mode 100644 index 0000000000000000000000000000000000000000..4d9b08a053dc452f6d5e9c652993727924188d59 GIT binary patch literal 319 zcmbV|I}U@t!4a3hE@5|#T+PA*cqk*HF~-tj9?g6+ z-`wt(D}W`&9y$!uL>D|Q54nLESjY)KiZ)rYu!;~4x%rb<{>5knUKf`jl6=%O9^l_6!N qty`C16)=n)Zh7MW`lSpSg&i6bgd(bAAR;1ieag-794H+Y13ZAWl4#OxBN5NB}V!jO% zimZbk!|Xu`h0f$omprRNVWr8_(r`LiQbua^fv#UT1~-tg61FUeA@hI1p8p4Q-VFWv tkh0QNZyj&xF$@A-77?vvS}z}ei%uV>)K(1bI=c0@fEJu4_u)2ma0kSUXXO9@ literal 0 HcmV?d00001 diff --git a/backend/target/classes/com/gpf/pethospital/service/NoticeService.class b/backend/target/classes/com/gpf/pethospital/service/NoticeService.class new file mode 100644 index 0000000000000000000000000000000000000000..444dfc853046095b2b3493ec5876bc7c5f25a542 GIT binary patch literal 325 zcmbV|v2MaZ42J)sloYyDyhRso=osi&2`QpOp5PKpdeP-B$~g#LjiC>~Lsh+`5mGZU z*p>%>_UG%*lo9cr*^>!gjfW1yI1#1bsZcTBg$YH@ zLyuwpWQ0Oza<2=XRiSXw=4oL$ogFDFwfZ18ZyduQkg*c3FvM`${(}AOAJ9cJ^lL-P rNmspO{FToz40K^4TFbOvJ^7ZLJpuZ4cunqO(A41r^J!&- literal 0 HcmV?d00001 diff --git a/backend/target/classes/com/gpf/pethospital/service/PetService.class b/backend/target/classes/com/gpf/pethospital/service/PetService.class new file mode 100644 index 0000000000000000000000000000000000000000..c99cc2215de681f55a962fab1a58742d3fddc73c GIT binary patch literal 316 zcmbV|J#NB45JtZx5Mxr1Q>0`IN+&6ikSr0&Cs>=ojAidy-Z8>gOOXTQP$;&8h(wuU zewukRZ@w>|UjW|l6kww8lDSIf^+DGpN9Su6Q)*Ami8In4B*||ZV5;z3n3K_^vAN!* z1!WT8QDHq0QsXM#yH;0SYJ`1VwqDa&$a;462Hak83Sq*zHPSYu!0|meivIz99f$5+ s$O=n0s6_9P!Xj~PlhKCDe(~~8a5bFJ+bBHrG3!4BOc0EDj&Q7tA0gRe1poj5 literal 0 HcmV?d00001 diff --git a/backend/target/classes/com/gpf/pethospital/service/PrescriptionItemService.class b/backend/target/classes/com/gpf/pethospital/service/PrescriptionItemService.class new file mode 100644 index 0000000000000000000000000000000000000000..464a50af0b585267892bc14d5fad544492cb9bcb GIT binary patch literal 355 zcmb7=O-{ow5Jo?jpR{Ge0eS|!V42corAn1R$_X4ZgsBqSvL_L}8Ve48D7^Mh?Q>ZG^h&xG!+2 zaJw^u(XDZfeyn$7rNH$GR~z5)v+s4cuZ?gDZJ#u~3AvO(KlIHBr!cFyaYp(`3d8ms zTy75;{|Q}=N9SVXgk}HBt6Y@|^UC+p(wf_xV)2Li-634|RJh1>l^+RAP>g+w**NFl Dm*I0{ literal 0 HcmV?d00001 diff --git a/backend/target/classes/com/gpf/pethospital/service/PrescriptionService.class b/backend/target/classes/com/gpf/pethospital/service/PrescriptionService.class new file mode 100644 index 0000000000000000000000000000000000000000..85563d1dd5beba3ce7efd8c64fcb6d0cf5cb7540 GIT binary patch literal 343 zcmbV|O-chn5Jta_Ka<3bOHW}fTuyW;2mysTK~Gzb6=u4d?wVk(=E4JbD6un&U~uK4 zs-U1A->dhJ*EayyIIA!-AQuMe;uA&I=a8eQ?J0BGieq|6oL!Qr5`6Qut8i>^zOh?N zz4aa4w;Og^;nd)2k7{ig{_dmV?So%7iFIdDRa8&A~JP(+mn))1zX)ZqjfzWQN literal 0 HcmV?d00001 diff --git a/backend/target/classes/com/gpf/pethospital/service/ReportService.class b/backend/target/classes/com/gpf/pethospital/service/ReportService.class new file mode 100644 index 0000000000000000000000000000000000000000..d1ee4bee8c9a0c38ef3df73a6180a92262e5dc7e GIT binary patch literal 325 zcmbV|v5vwp42J)396ew;@fIv(xUs;9goK22eS)-@UaB;S8W+KBXfg4e8!3{>rOM)H@ut2p`ZB6J153$;_yD4WZ5 zT2RIjdICQ;NUB_^H?EfDAyuq{H+7J-XR<*%`(Q5bIDvkmbE~+nNWiRK!SU)1=(HVr u)gjB84|kh*9t#W-S63M=v}tyao-`-7LmDT6k0w5wR{>Pt%ECsduIm# literal 0 HcmV?d00001 diff --git a/backend/target/classes/com/gpf/pethospital/service/StockInService.class b/backend/target/classes/com/gpf/pethospital/service/StockInService.class new file mode 100644 index 0000000000000000000000000000000000000000..fe2cff3a49a9453333b287f4ab7d4af0fb343fc2 GIT binary patch literal 328 zcmbV|F^A>YPBH?NKjJP zmJ2`o`SN=@1Ng=$Ku2JrT`tpNBMaiK^MzrRNl#^MG|8Bq-Y;$Z-v;OjeC|}OWTtE? zf07+(4$v2vT`7rjxmmkP=Ep>_@kLg7Ne3qDjk6Ev@`e)_#wN9jtC9rr)hjq!y#f7d whhBZivf<-hCz?kBVeG0>)52uU^6|6i^m_?a^qG89V)*2F|X1ga?7AQXQ47 zlr3bMm!vtuqrhvA$(5_k-UV5oa>d3sRq&F2n5;L>j?~=^C$P#)VHJm#1Z*+|$H^Vg xw_#{1M3xPoMxXd27FcI4w3D|Q54~LGNi1u pP3sb@0)|nf>nfqO%-!b6m*VVsg!5tOy6C$n0Uda49>Q6aobUy>B+tbV9NlvKwh$%|jo+hZ18HLGjeX z%)r2W{NL>M+dlxWmv?gtvEIBO$JPIrd zwNbKECYPUSLD~nH2&|5*RN0C%+sdj-m1kF%t&{ZY$vC#=g8n$;1j2-KqkP+tfQxUz zQTz|+%W!mSMaHx5uBD>4NMM%Ow$b#?Wgp?`p7in7xl49EY+M+527zD1|r&@sS>goMNpsrw~0!8Eyxa!yoUje!T?p(^rGRTX0g z+w$O_{qyzvd;ze;V}OyuOX>=pm3v*19Gov%Os+ju4X32v*|Wq$6JVn7bTp08xv`nv zB}Ymnz=OhD$4HDT_`}t@I3-5dmwD|qeF<65&i*1dKRAVX%$YS(SETT{y$46ze?S-g v(7g>=VL1&l(JE31V^>!xtvPR3KmV0{?apY86vk~#+dly#1bv=i-q-L35Upjs literal 0 HcmV?d00001 diff --git a/backend/target/classes/com/gpf/pethospital/service/impl/AppointmentServiceImpl.class b/backend/target/classes/com/gpf/pethospital/service/impl/AppointmentServiceImpl.class new file mode 100644 index 0000000000000000000000000000000000000000..dd4145a8851ad49e195ee9b03fcdf7a0bfd20b52 GIT binary patch literal 757 zcmbVKO-~y!5Pi-Ep=nx5C`gD?Z@>W`5n4cskSbM5dmt!xCzvp>{*dj3=4WxL)C0F( z`lArD3rInUI3P=7zwz_T&fE9@;qN_wBW$!$L%oGY2Td#qWMgOKNI662u8?LrQi-C^ zizxN)q-`W;Wz^w@##)l`xg0!!AAA;AIwVW!SfIYWGi+g5V85(4@fXtTbm^j}r1IAV zdfq#-$!MEqYPHZ7*n8{o{5yfhi96Q9#SOMwP&qMY#3)**6qFv6B&IV zJGltT=vx=AWlTC~m!@97I48q5wAh3!COcB_Vk2_=$VgTgXzu=jxZ^|(9ggKS(8ec@ bo$B1gXRI));|s?cR?)5YHGJj0Yx15Pi-kO;h?oLE^}%fdfWdH?4#~NJt9@f^v6KXESuywrp?O{3|$B;?N(^ zABC7*8flTD9FV2)yz%&r=Xvgb|GEQkj%Ne3(C(u%L>E1QWNr&NQ?{T>TgqZRQ;~wp z%OLel)FzNMGHAb|xt3J8Tu%OiPwWfy#$+g72((8pr+qvUcvJCZZXunHOB)q8X*{)lS3j&?@_EHNRreyS&vY2WAP0ezSoTPTH@~QGv;fG)+E-47SO?UCv zZ8eHittA3`6UvN=rDyUVHNk(%G~QahP|j&DtGb_SH`$t|O{BQ4(~^trDVy(Uw7}0F zOl;}r`Xg21oHov?_FjKiD<$y!YsvJ5o>Cwd?VT|;^8Z`InvGKHGZ~yGlP$a|^tJU@ zGDPjQjccbjgOK0_`aDxC7!R1>#dF1WpOLIF(0z3a@sk5B4B1x4zyJqqhqd3uV;nMS Uz^-lCULZe<6B391 zfbySEXSX0V(uxDJH1>?gZ)Tp~pZnY20QT^qj~3cJbOz{RO<|O|LeGpVcV;2@W z`oMN^5==ptE}ZL_D3D7_Pmekp;WK(7Ng-AAsbq;P#l8|x*FMnwdINPWfffd0t81W- e*J20txr;X#ir2=v*cRSmqu$@)z3f%~Ch!;ZNA2bS literal 0 HcmV?d00001 diff --git a/backend/target/classes/com/gpf/pethospital/service/impl/MessageServiceImpl.class b/backend/target/classes/com/gpf/pethospital/service/impl/MessageServiceImpl.class new file mode 100644 index 0000000000000000000000000000000000000000..4471d603e38cedb86fb7db9dd21b485cfbd4a924 GIT binary patch literal 729 zcmbVKO-~y!5Pi-EY16b6Xh9r%qa5l3;n>-YTwfMaYA(Lr~B-UxlHDP(h3>X~sRU%E<{iY692zG1*Jk92E}7 zPqk>owfoc>Gll09&aFvR5dNPH$A9{DwDJL^@t%TyY<=FKY-J_c#A>%uZHUE&oF+Q+rj4`0oVQP}-bNuQFY99cX(wbmsW3TMT_y|D|qjy|x>uYxJ* z)`f36CJN-z!qaj(GQ7h;22IS9sZ;XFut|I&NH-Yh@Be_hlSBt2iS;os#7l{zX5Ysv XtPASmwZslKu-U9zcq40F{}%WIH%;BW literal 0 HcmV?d00001 diff --git a/backend/target/classes/com/gpf/pethospital/service/impl/NoticeServiceImpl.class b/backend/target/classes/com/gpf/pethospital/service/impl/NoticeServiceImpl.class new file mode 100644 index 0000000000000000000000000000000000000000..018721c8cafef87b549580ed80727fc3ae59e50f GIT binary patch literal 722 zcmbVKO-md>5PiKLu5LCleniMIw>5_}gxp325d>lM;D){TjJ<0mGu=&hk8yuiE(v(> z2l%7Jno+@l#e+0d_p7dck9u8q_cyly_OUZW2i*aBBlNK%kmRoK%hI`oer=n@V(}nyP0%4UfSR&s-jJB zW+Rimpc!B&u>0D())Rr=k-g9Y>nRz1R+X9dKUG$6W;3<9DyGU)jh~Xecu7IvNBWvV z(^^ZWZZHv8o6y{-Sb3)Z*HFCCti7fBrE*St`KWx_fMjW*Hj(1usW3TMUiAD?twy+s z;lx%x*T+5PiKLu5Q-&5e?*++a?E_;Bi!tKp?P5ARG4HyIZc6%yc*1J?j1}@gR8c z2joWuYsLr@SUiM*>U!1H@9}Et_n*6a0LOUUM+@y9Is46{ibI4&q*DvlrN0;6m%{8rOvaJePk1-^Y1#)TW>1iJ_yhTq|ONJ(UrsR|LlK4W9t})Pke+zXjg%$=9t81W-O^Jg#@8Tu4 V1hug(v4tJ%*5@ni$yxR90}rUr*f0P9 literal 0 HcmV?d00001 diff --git a/backend/target/classes/com/gpf/pethospital/service/impl/PetServiceImpl.class b/backend/target/classes/com/gpf/pethospital/service/impl/PetServiceImpl.class new file mode 100644 index 0000000000000000000000000000000000000000..75bb8fd25a88106047c9a60942f76e9f4f406eb5 GIT binary patch literal 701 zcmbVKO-~y!5Pi-Efe;8EZKWQ$RFnf2=LIB$RH;&0p{B~+2}786*S2ggkRQc?6A}l0 z06(f?c3YHIia1o3#`DJGH=gHt`t|S#;0W)!XrS3atA{q06tamc^w_w9&t0jD+1MnG zJ};xDn?yFUvpQ0^;t6Rke6EMT!DsOmmJZo+I#y`zejIhMte`8tslU*k(xr=@lga-j zIHU9zM+aSn53gOC=PR^M-8m`r2W;tUS&S)sH{)C)TLU*S`N#yW@Sk8SU2;@77`#Sb zH#M(O^_3~C40&ozDuZy}*7yHYqr-*83*$WnEoHydUbZlcY~nPlva;jF881IGf4{uF zJ9K53&?l~h*`6O&t?mCXS4QFew^FzZ8gXRN>%>}@OhASmbYz%BESW4NO9o2psvuospuKkwbti!adSa_%po=xJz1nYM9eqJf TY=~`O6I=DZjW@Da`EP+|2@cX- literal 0 HcmV?d00001 diff --git a/backend/target/classes/com/gpf/pethospital/service/impl/PrescriptionItemServiceImpl.class b/backend/target/classes/com/gpf/pethospital/service/impl/PrescriptionItemServiceImpl.class new file mode 100644 index 0000000000000000000000000000000000000000..f6a859a28f7be74595f0c5dbdaaf64dcf10fdcc8 GIT binary patch literal 792 zcmbVKO>YxH41JT2211~v1te~8D;$^u#|@ECC8SCLA%b$BY~9qb^P!p9LVi|HNF4Y9 zocnta-fb&ENqRsldFFZTXZwwR{`&p{z$-i&qJ!=Ly%GA@QYcDq^}=||N50l}wJ@1e zsOqHYYbKZ2JDn(=a!HzPsPyat9Lil`Ys`-GM4`L?Y(Bs(g>l2T497Z9KJh7VHr3w* z?<1u$a>zn`n92S@IKWWhw>Z^`~s%JJGxtO%*^}_IioSN0AYSGhfG&-f$!4lMQi=94|hZQ={>nsZ_i{IzpF%T9SGdhbtt zTS9N12luhto_ly8XA}Pr_zhQ$_>ceq literal 0 HcmV?d00001 diff --git a/backend/target/classes/com/gpf/pethospital/service/impl/PrescriptionServiceImpl.class b/backend/target/classes/com/gpf/pethospital/service/impl/PrescriptionServiceImpl.class new file mode 100644 index 0000000000000000000000000000000000000000..c7d1fa71592c01a9286851621a9b874173b6e81b GIT binary patch literal 764 zcmbVKO=}cE5PiKLS>0^18jT?2l3S8P`Wl=V5J3>u5M0@N@1(M+WTw06?uqWt@+5fh zEdD65W=voMLk?k}x~t~(tFG7Y&)=WF0KCPkAv)*|&>NwTHH9p9rJfsC^0}*YxtyEC z(HB+J^evH%?5vIyZa62+r7!gKfAUfG3Tww~Ih`nU_x5K4JW)8R`4;{{drFrsdQPUe zPjD6}=7D_@>J_p9h6?(j(=7)TdhgviDU2s<>9i{66uy{wA(gF(%S|yef$RLX*h`lj z72Zr9>eGzb(ySgiQ+PV%g*B-P(&TqT^ho)RTW?Vs?P2OX3@6McciJ3kw~6 zV7s^orlhYfT+4A8}zLN<4Wo*7s0sVjA{oSDSY z=VjD%lgLJPR!0g~JSWYC&-LUH{E)N4+CE!OBZc<%&a{VD3STR}g+J4t(z%PClgXO| zC*)m7|IqZ%SJ-*!UE_&D=g^&!!p4{_9hb$7!cQ~HB{Lkmxyh#{aD|_eopjDoVQ>7B zLfu+JrfM)#cs=2THK`0j|GTF6PqX${>KDd)3i?s`s0P`}Lb8d|@~JQztuA{0s752w zM1SJSFsJWanY7iot=jx@VXlnAr;}1d3Yv0cvG1F;F3B`FEADNNU0CSo1KY(}Fa=$^ zaH(UWKrSskJ(&*;g7iE%P+N|sES#C1Ws#z1%X57aM7v@noZT?2i*kvOQ&UA)DH Vpf=t~Y+)0_dVh}(vRCyVfd}+n+qVD! literal 0 HcmV?d00001 diff --git a/backend/target/classes/com/gpf/pethospital/service/impl/StockInServiceImpl.class b/backend/target/classes/com/gpf/pethospital/service/impl/StockInServiceImpl.class new file mode 100644 index 0000000000000000000000000000000000000000..929a44f9107b26100254d3ff82825bbf7907167f GIT binary patch literal 729 zcmbVKO-~y!5Pi-Eq1#Z}^aF9^1{~@G;>w1)=e?p;h6*tIR&OPin76DkLO zKz~%l>_Vibia4N^#(v}R8_(PK=kM(ufD?R3&_cV1P9I%t2&B0!Wu|ONXSR~%B2$rq zE2<#%&!|lxYh=*=nsP0vbcLKgfHCg{Hil#Gk5;a2+8Go}JBrZhJyR-XBPHyqE@Yq<6SrE*St`8eX&2Bm8&wTToL%gS`LzH0fm zRyE@}lBunHuD?(%)XwU0J?h6xb*%(;zgOI+)H4di8h$dyMmB{tEaCpd`ne3wlbN4; zRq7wsU&#=)*ETMkUb-X29(rsv7LQ#g_+ztie91^Q80a3}K>XrF3w@6DF_2)3W53yV Z@e13F+IY>eg*O;9>s!3zwXS~;+ym8j-FE;0 literal 0 HcmV?d00001 diff --git a/backend/target/classes/com/gpf/pethospital/service/impl/StockOutServiceImpl.class b/backend/target/classes/com/gpf/pethospital/service/impl/StockOutServiceImpl.class new file mode 100644 index 0000000000000000000000000000000000000000..31971ad0edf30f6ab682f382bb1e2dc94d4ec9b9 GIT binary patch literal 736 zcmbVKO=}x55PkAT+_-L&CTU5Jy}1okm(t6+hEfOwoCfOPyS$d|Np>Y6X_NYA^;9UO zKcGLVbaoSmI2a$o!bop4dZYJt{{H**2f!!1YNLjF3ylt%*b+!mo6E7XIZbRK^Tk+2 z3N9;x)Ze2vfvk~1`zuPdq}*k4cmqy&FR;}kL$NPV@4g+i@I>H4$v1OT>2#di;3%r> z0YS9sf$bs9jEaTl2EQwkM_Sff`+{6Kr@dT?Jgs1|wp5!)adB6g^w*ay zf7z1q)@+v29@@gE`j|?y4j-JCa^GL5D<$yyTfwbzJ)%Htee4dbpUL1n znc38Ug!sXU8af=yW1x*^ d96Qy%iRaj1RL3sI8eU+pTK93lYgzvi_zzWU;ROHy literal 0 HcmV?d00001 diff --git a/backend/target/classes/com/gpf/pethospital/service/impl/UserServiceImpl.class b/backend/target/classes/com/gpf/pethospital/service/impl/UserServiceImpl.class new file mode 100644 index 0000000000000000000000000000000000000000..dba3363be4e1cb6da0ecd283776ef6d171bd4ca5 GIT binary patch literal 708 zcmbVKO>Yx15Pi-^Q$nDS1|*K0NIBrD*G(fKq)L@S4-Mq*B+h1F*S2hLO8!+jA#vab z@T02EE+B2CCYovTQ} zWkrzsThu0yH8N-lUWCc0;eTk>Q>U}xVFJjRM|s< z&rDY%>7Xm{X5X#a1%cKFyVL?l6Ega$$miOBQuB->{fS+uY^FSw_;0Wk*AxWKCj0oS zwrWMn))Ik7Q%a4Bg=g~Hir_zG8ttr}E9bPAW!;aJo9s-}CQ{s1X~}qZ3NuvSQ)_{r z-<{gRFZ2bK;tXnMWqa?wsErbMbzLxhu4fd8MSE|Ijr{-Cux7)F^{EWblSx-z<@(0@ zuQEjKwT)Y+{|!Qd*XZy}v0yx4f)~#f+sBM#g@N|l9}wR;&_IuEc?@*%gl(_#+jxp2 VMom0p+rV@5tNj=Q-pl+Kz&*$5)t&$V literal 0 HcmV?d00001 diff --git a/backend/target/classes/com/gpf/pethospital/service/impl/VaccineRecordServiceImpl.class b/backend/target/classes/com/gpf/pethospital/service/impl/VaccineRecordServiceImpl.class new file mode 100644 index 0000000000000000000000000000000000000000..5fbce5400d7b6fd357245e0a73d78ff82aba50e5 GIT binary patch literal 771 zcmbVKO-~y!5Pi-EY16cnk0Np4&>QWc?zIXap-Po1g&qjX-PsIbVAr;6FOZ+r6A}l0 z0Q{$_vkOR#wBk@%8vBjMZ)Tq7{?F|lfPHNB(L%e2&H!DkC=4@K=&5l9&s?dC#ndE@ zJ};xD>qIuPvpQ0^7?9VoPSKTUdgrSPrdoBLDkDV@3KIhlN! zU}Cb2Ege(l!t5Wm9{LJjUwYp3QlazR%}8N&B&5H}VoKq}Omp$9k6dQ*i3wccCub*} zag?@4FD0rQZOT@4Jydu-=D9Vg43g!cX8KPB_ZrJ6jQ14uQUOP`ueofpiPK^^et6Iv z`}~(np34O2D0_ph|)-=jPHVY#*1Bxu6M07KIP3bxFp@SrK@5 zAK1=MgDL3Bg$o@M1#)TO>3NQZ_=uj2q=+i>sbtAmihUzU*BI!2zJdBJjur-Dt81W- ew_*qNxr=vL71YLiu`R4&z1}ylDSH+F0r(4Ev+gVa literal 0 HcmV?d00001 diff --git a/backend/target/classes/com/gpf/pethospital/service/impl/VisitServiceImpl.class b/backend/target/classes/com/gpf/pethospital/service/impl/VisitServiceImpl.class new file mode 100644 index 0000000000000000000000000000000000000000..bb66179fde3d27b62c39e132d1c43e2edeb99c5c GIT binary patch literal 715 zcmbVK%W4}j6g~1Yahn=ed!*~(fxP-=P!V-IP9T;W*4nK+UN)*bDPVVvN>JbLgwq4iWFQ{ z1gU>TZ30;%gZ3+$Ye~7w%B13U3&>Vi6cCjV!rJT2LH`3|2w82qS+5ZEk z6e!lFbkP$SzVxjALZEeGueHD+C8IBje5U=Cnq{2XP3>G|Q{}0QpOUS(q#$sdz64Ma ztD}_c5`parEsTnV=jnIVgjXsx+6bR3=d_m<@OkAY8~e106xWY^$#`?m^B>h&FoWL2 z7JjZzsTAm-UMwjdeOD_b@Zqvxgj|cIHu4%+!@>lZROPiArBRjz+p|3ikT zy|!`f^z%L>_=qmA7K_GvCiw7rv306YLEo?fnf1V?w#}4=bnAfIXD0O`{!Q(?%+ijKKL~RbOg~R(0yP$H&R8T zTu43GJCHd?pl#kPo6drOe=M;bLOVhl!a6#j3k>J1QmRmSnyN@=->Ozj$0(+1j#*4) z4xPtb>0XsNTM{RlJ;B~|Y_nWQE3{4>UFa6j<%^1G8;)s}H>v_6qaiBLEMO1AjX%^E@>(-+_al$fzFdycMV5|F$}-@8P#zeHw3hTbhgZrbcxF-&6pxNLBz34Vmpj+ zOlX+YF@=;suW6+Ys#f_>?m5;oSylv+25qlq7W2{;7#vGv&#_tZ^yvFk#Tf~%XiW@ZIOTNrA!cA2`X z;~rLcqgA5q5JX^W>_eQJYNS!a7xJ~LV+|QzC3~e}sE+F8Rkrkks)wwO4cuqXR1BM? zCNOaRr9X7l%;X`y(eOyeCbk6PXQ^Tdd6pi>iVJq#x_l{+YHo@D%cLpPwvHWq%ffe0 z=M_-qkTsO}K(H!L{2jj6@Pm#Y@sq%%))T9mXX7kcd7kn#QH{>k@UuYdtmnIWj-7KB zb{m^+*~+sQyRv3k-mjJRq`hVA6)A~kt(;NZHf&RUH-rIa-{et7vKI}wG-u|98h&{) z#nIqMn|_gkEK3eExutqpV72*FS&O5uwE$Wr=Tr%6Lk*#|Ji|6QxRBK48eQGx>5iM4 zGpKAG9{ad*w@Ins+$EoO&AUSS z2Hgorj7_U%=j4j1u1RmaC{wC)aE&jAk1v=HQS}mW7gf&)S3d{4otA;;gSr{-@rLVQ{}DaljLVXoXD@sz9DsW8IbsX#syxDWX#R!UH{ z57Ub(`p^cAvdUZZ>>lCLTp%8Z_Kw#P^J9nGs}slD!AWoX7Q?h0nG32-Jop+PC;vdi zIKs`jwl_$|19g1jLp)f=ESI)A=6v`acW9*5vFt}3Ukm)on0_~{Swy(M%#>p2h`H zk-lmEnSQ_arKQQ1C;=eeOaX{s+&9{V2;~td&ybSjfDz(?LP4k!LLxw=(B3!h*4fsvt@WD6PvKvb z6O;pj3kQA^LX49%C{-n*dgWQq?9AtH9{cOh*KYte(6o_5-a^5_9Oenj`{J!|0}=Y} z>)yWf3}OC}3YB?G$TylhHWpB{U^^(mAv}q+?~Nzq*7j2WTHxt$g|8K~nVIC4>(XwUr_CTF^~j8g6z z;T^mb@i+s!8>QNl&(tu-WmksfRn}bIiTAnIXV9nN@ims& zF<{|3OK0SO8w>&zaSJuJWWkE}%&-0h))C5t7pxjJd1=otmn}93oJk(vj6}9 literal 0 HcmV?d00001 diff --git a/backend/target/classes/data.sql b/backend/target/classes/data.sql new file mode 100644 index 0000000..1f3337f --- /dev/null +++ b/backend/target/classes/data.sql @@ -0,0 +1,17 @@ +-- 插入初始管理员用户 +INSERT INTO `user` (username, password, phone, email, role, status) VALUES ('admin', '$2a$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', '13800138000', 'admin@example.com', 'ADMIN', 1); + +-- 插入初始医生用户 +INSERT INTO `user` (username, password, phone, email, role, status) VALUES ('doctor', '$2a$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', '13700137000', 'doctor@example.com', 'DOCTOR', 1); + +-- 插入初始顾客用户 +INSERT INTO `user` (username, password, phone, email, role, status) VALUES ('customer', '$2a$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', '13900139000', 'customer@example.com', 'CUSTOMER', 1); + +-- 插入示例宠物 +INSERT INTO pet (name, species, breed, gender, birthday, owner_id) VALUES ('小白', '狗', '金毛', 'MALE', '2023-01-01', 3); + +-- 插入示例医生 +INSERT INTO doctor (name, department, title, phone, email, status) VALUES ('张医生', '内科', '主治医师', '13600136000', 'zhang@hospital.com', 1); + +-- 插入示例药品 +INSERT INTO drug (name, category, manufacturer, specification, unit_price, stock_quantity, unit, status) VALUES ('阿莫西林', '抗生素', '制药厂A', '0.25g*24粒', 25.50, 100, '盒', 1); \ No newline at end of file diff --git a/backend/target/classes/schema-h2.sql b/backend/target/classes/schema-h2.sql new file mode 100644 index 0000000..22298e9 --- /dev/null +++ b/backend/target/classes/schema-h2.sql @@ -0,0 +1,242 @@ +-- 如果表不存在则创建表,如果存在则添加缺失的列 + +-- 检查并创建appointment表或添加缺失列 +CREATE TABLE IF NOT EXISTS appointment ( + id BIGINT AUTO_INCREMENT PRIMARY KEY, + customer_id BIGINT NOT NULL, + pet_id BIGINT NOT NULL, + doctor_id BIGINT, + department VARCHAR(50), + appointment_date DATE, + time_slot VARCHAR(20), -- 添加这个缺失的列 + status VARCHAR(20) DEFAULT 'PENDING', + remark TEXT, + cancel_time TIMESTAMP NULL, + create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + deleted INT DEFAULT 0 +); + +-- 检查并创建visit表 +CREATE TABLE IF NOT EXISTS visit ( + id BIGINT AUTO_INCREMENT PRIMARY KEY, + appointment_id BIGINT, + customer_id BIGINT NOT NULL, + pet_id BIGINT NOT NULL, + doctor_id BIGINT NOT NULL, + symptoms TEXT, + diagnosis TEXT, + treatment_plan TEXT, + status VARCHAR(20) DEFAULT 'PENDING', + total_amount DECIMAL(10,2), + payment_status VARCHAR(20) DEFAULT 'UNPAID', + payment_method VARCHAR(20), + payment_time TIMESTAMP NULL, + start_time TIMESTAMP, + end_time TIMESTAMP, + create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + deleted INT DEFAULT 0 +); + +-- 检查并创建prescription表 +CREATE TABLE IF NOT EXISTS prescription ( + id BIGINT AUTO_INCREMENT PRIMARY KEY, + visit_id BIGINT, + doctor_id BIGINT, + customer_id BIGINT, + total_amount DECIMAL(10,2), + status VARCHAR(20) DEFAULT 'DRAFT', + remark TEXT, + create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + deleted INT DEFAULT 0 +); + +-- 检查并创建prescription_item表 +CREATE TABLE IF NOT EXISTS prescription_item ( + id BIGINT AUTO_INCREMENT PRIMARY KEY, + prescription_id BIGINT NOT NULL, + drug_id BIGINT NOT NULL, + quantity INT NOT NULL, + dosage VARCHAR(100), + frequency VARCHAR(50), + duration VARCHAR(50), + usage_instructions TEXT, + create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + deleted INT DEFAULT 0 +); + +-- 检查并创建order_info表 +CREATE TABLE IF NOT EXISTS order_info ( + id BIGINT AUTO_INCREMENT PRIMARY KEY, + visit_id BIGINT, + customer_id BIGINT NOT NULL, + amount DECIMAL(10,2), + status VARCHAR(20) DEFAULT 'UNPAID', + payment_method VARCHAR(20), + payment_time TIMESTAMP NULL, + remark TEXT, + create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + deleted INT DEFAULT 0 +); + +-- 检查并创建drug表 +CREATE TABLE IF NOT EXISTS drug ( + id BIGINT AUTO_INCREMENT PRIMARY KEY, + name VARCHAR(100) NOT NULL, + category VARCHAR(50), + manufacturer VARCHAR(100), + specification VARCHAR(100), + unit_price DECIMAL(10,2), + stock_quantity INT DEFAULT 0, + unit VARCHAR(20), + status INT DEFAULT 1, + create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + deleted INT DEFAULT 0 +); + +-- 检查并创建pet表 +CREATE TABLE IF NOT EXISTS pet ( + id BIGINT AUTO_INCREMENT PRIMARY KEY, + owner_id BIGINT NOT NULL, + name VARCHAR(50) NOT NULL, + species VARCHAR(50), + breed VARCHAR(100), + gender VARCHAR(10), -- 修改为VARCHAR以支持MALE/FEMALE + birthday DATE, -- 添加birthday字段而不是age + weight DOUBLE, -- 添加weight字段 + photo VARCHAR(255), -- 添加photo字段 + remark TEXT, -- 添加remark字段 + create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + deleted INT DEFAULT 0 +); + +-- 检查并创建doctor表 +CREATE TABLE IF NOT EXISTS doctor ( + id BIGINT AUTO_INCREMENT PRIMARY KEY, + name VARCHAR(50) NOT NULL, + department VARCHAR(50), + title VARCHAR(50), + phone VARCHAR(20), + email VARCHAR(100), + avatar VARCHAR(255), + status INT DEFAULT 1, + create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + deleted INT DEFAULT 0 +); + +-- 检查并创建user表 +CREATE TABLE IF NOT EXISTS `user` ( + id BIGINT AUTO_INCREMENT PRIMARY KEY, + username VARCHAR(50) NOT NULL UNIQUE, + phone VARCHAR(20), + email VARCHAR(100), + password VARCHAR(255) NOT NULL, + role VARCHAR(20) DEFAULT 'CUSTOMER', + status INT DEFAULT 1, + avatar VARCHAR(255), + create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + deleted INT DEFAULT 0 +); + +-- 检查并创建medical_record表 +CREATE TABLE IF NOT EXISTS medical_record ( + id BIGINT AUTO_INCREMENT PRIMARY KEY, + visit_id BIGINT NOT NULL, + record_type VARCHAR(50), -- CHECKUP体检, DIAGNOSIS诊断, TREATMENT治疗 + content TEXT, + attachment_urls TEXT, + doctor_id BIGINT, + create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + deleted INT DEFAULT 0 +); + +-- 检查并创建message表 +CREATE TABLE IF NOT EXISTS message ( + id BIGINT AUTO_INCREMENT PRIMARY KEY, + sender_id BIGINT, + receiver_id BIGINT NOT NULL, + content TEXT NOT NULL, + type VARCHAR(20) DEFAULT 'NOTICE', -- NOTICE通知, CHAT聊天 + status VARCHAR(20) DEFAULT 'UNREAD', -- UNREAD未读, READ已读 + create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + deleted INT DEFAULT 0 +); + +-- 检查并创建notice表 +CREATE TABLE IF NOT EXISTS notice ( + id BIGINT AUTO_INCREMENT PRIMARY KEY, + title VARCHAR(200) NOT NULL, + content TEXT NOT NULL, + publisher_id BIGINT NOT NULL, + publish_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + status INT DEFAULT 1, + create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + deleted INT DEFAULT 0 +); + +-- 检查并创建report表 +CREATE TABLE IF NOT EXISTS report ( + id BIGINT AUTO_INCREMENT PRIMARY KEY, + report_type VARCHAR(50) NOT NULL, -- REVENUE收入, CUSTOMER客户, PET宠物, DRUG药品 + report_data JSON, + period_start DATE, + period_end DATE, + generated_by BIGINT, + create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + deleted INT DEFAULT 0 +); + +-- 检查并创建stock_in表 +CREATE TABLE IF NOT EXISTS stock_in ( + id BIGINT AUTO_INCREMENT PRIMARY KEY, + drug_id BIGINT NOT NULL, + quantity INT NOT NULL, + unit_price DECIMAL(10,2), + supplier VARCHAR(100), + operator_id BIGINT, + remark TEXT, + create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + deleted INT DEFAULT 0 +); + +-- 检查并创建stock_out表 +CREATE TABLE IF NOT EXISTS stock_out ( + id BIGINT AUTO_INCREMENT PRIMARY KEY, + drug_id BIGINT NOT NULL, + quantity INT NOT NULL, + unit_price DECIMAL(10,2), + purpose VARCHAR(100), -- 用途:销售、损耗等 + operator_id BIGINT, + remark TEXT, + create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + deleted INT DEFAULT 0 +); + +-- 检查并创建vaccine_record表 +CREATE TABLE IF NOT EXISTS vaccine_record ( + id BIGINT AUTO_INCREMENT PRIMARY KEY, + pet_id BIGINT NOT NULL, + vaccine_name VARCHAR(100) NOT NULL, + dose_number INT, + injection_date DATE, + next_appointment_date DATE, + doctor_id BIGINT, + remark TEXT, + create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + deleted INT DEFAULT 0 +); \ No newline at end of file diff --git a/backend/target/classes/schema.sql b/backend/target/classes/schema.sql new file mode 100644 index 0000000..c28ec10 --- /dev/null +++ b/backend/target/classes/schema.sql @@ -0,0 +1,230 @@ +-- 用户表 +CREATE TABLE IF NOT EXISTS `user` ( + id BIGINT AUTO_INCREMENT PRIMARY KEY, + username VARCHAR(50) NOT NULL UNIQUE, + phone VARCHAR(20), + email VARCHAR(100), + password VARCHAR(255) NOT NULL, + role VARCHAR(20) DEFAULT 'CUSTOMER', + status INT DEFAULT 1, + avatar VARCHAR(255), + create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + deleted INT DEFAULT 0 +); + +-- 宠物表 +CREATE TABLE IF NOT EXISTS pet ( + id BIGINT AUTO_INCREMENT PRIMARY KEY, + name VARCHAR(50) NOT NULL, + species VARCHAR(50), + breed VARCHAR(100), + gender CHAR(1), + age INT, + owner_id BIGINT NOT NULL, + health_status VARCHAR(100), + vaccination_status VARCHAR(100), + create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + deleted INT DEFAULT 0 +); + +-- 医生表 +CREATE TABLE IF NOT EXISTS doctor ( + id BIGINT AUTO_INCREMENT PRIMARY KEY, + name VARCHAR(50) NOT NULL, + department VARCHAR(50), + title VARCHAR(50), + phone VARCHAR(20), + email VARCHAR(100), + avatar VARCHAR(255), + status INT DEFAULT 1, + create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + deleted INT DEFAULT 0 +); + +-- 就诊记录表 +CREATE TABLE IF NOT EXISTS visit ( + id BIGINT AUTO_INCREMENT PRIMARY KEY, + pet_id BIGINT NOT NULL, + doctor_id BIGINT NOT NULL, + customer_id BIGINT NOT NULL, + symptoms TEXT, + diagnosis TEXT, + treatment_plan TEXT, + visit_date DATE, + status VARCHAR(20) DEFAULT 'PENDING', + create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + deleted INT DEFAULT 0 +); + +-- 处方表 +CREATE TABLE IF NOT EXISTS prescription ( + id BIGINT AUTO_INCREMENT PRIMARY KEY, + visit_id BIGINT NOT NULL, + doctor_id BIGINT NOT NULL, + customer_id BIGINT NOT NULL, + total_amount DECIMAL(10,2), + status VARCHAR(20) DEFAULT 'ACTIVE', + create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + deleted INT DEFAULT 0 +); + +-- 处方明细表 +CREATE TABLE IF NOT EXISTS prescription_item ( + id BIGINT AUTO_INCREMENT PRIMARY KEY, + prescription_id BIGINT NOT NULL, + drug_id BIGINT NOT NULL, + quantity INT NOT NULL, + dosage VARCHAR(100), + frequency VARCHAR(50), + duration VARCHAR(50), + usage_instructions TEXT, + create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + deleted INT DEFAULT 0 +); + +-- 药品表 +CREATE TABLE IF NOT EXISTS drug ( + id BIGINT AUTO_INCREMENT PRIMARY KEY, + name VARCHAR(100) NOT NULL, + category VARCHAR(50), + manufacturer VARCHAR(100), + specification VARCHAR(100), + unit_price DECIMAL(10,2), + stock_quantity INT DEFAULT 0, + unit VARCHAR(20), + status INT DEFAULT 1, + create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + deleted INT DEFAULT 0 +); + +-- 订单表 +CREATE TABLE IF NOT EXISTS order_info ( + id BIGINT AUTO_INCREMENT PRIMARY KEY, + visit_id BIGINT, + customer_id BIGINT NOT NULL, + amount DECIMAL(10,2), + status VARCHAR(20) DEFAULT 'UNPAID', + payment_method VARCHAR(20), + payment_time TIMESTAMP NULL, + remark TEXT, + create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + deleted INT DEFAULT 0 +); + +-- 预约表 +CREATE TABLE IF NOT EXISTS appointment ( + id BIGINT AUTO_INCREMENT PRIMARY KEY, + pet_id BIGINT NOT NULL, + doctor_id BIGINT NOT NULL, + customer_id BIGINT NOT NULL, + appointment_date DATE NOT NULL, + appointment_time TIME NOT NULL, + reason TEXT, + status VARCHAR(20) DEFAULT 'PENDING', + create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + deleted INT DEFAULT 0 +); + +-- 疫苗接种记录表 +CREATE TABLE IF NOT EXISTS vaccine_record ( + id BIGINT AUTO_INCREMENT PRIMARY KEY, + pet_id BIGINT NOT NULL, + vaccine_name VARCHAR(100) NOT NULL, + dose_number INT, + injection_date DATE, + next_appointment_date DATE, + doctor_id BIGINT, + remark TEXT, + create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + deleted INT DEFAULT 0 +); + +-- 库存入库表 +CREATE TABLE IF NOT EXISTS stock_in ( + id BIGINT AUTO_INCREMENT PRIMARY KEY, + drug_id BIGINT NOT NULL, + quantity INT NOT NULL, + unit_price DECIMAL(10,2), + supplier VARCHAR(100), + operator_id BIGINT, + remark TEXT, + create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + deleted INT DEFAULT 0 +); + +-- 库存出库表 +CREATE TABLE IF NOT EXISTS stock_out ( + id BIGINT AUTO_INCREMENT PRIMARY KEY, + drug_id BIGINT NOT NULL, + quantity INT NOT NULL, + unit_price DECIMAL(10,2), + purpose VARCHAR(100), -- 用途:销售、损耗等 + operator_id BIGINT, + remark TEXT, + create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + deleted INT DEFAULT 0 +); + +-- 消息表 +CREATE TABLE IF NOT EXISTS message ( + id BIGINT AUTO_INCREMENT PRIMARY KEY, + sender_id BIGINT, + receiver_id BIGINT NOT NULL, + content TEXT NOT NULL, + type VARCHAR(20) DEFAULT 'NOTICE', -- NOTICE通知, CHAT聊天 + status VARCHAR(20) DEFAULT 'UNREAD', -- UNREAD未读, READ已读 + create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + deleted INT DEFAULT 0 +); + +-- 公告表 +CREATE TABLE IF NOT EXISTS notice ( + id BIGINT AUTO_INCREMENT PRIMARY KEY, + title VARCHAR(200) NOT NULL, + content TEXT NOT NULL, + publisher_id BIGINT NOT NULL, + publish_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + status INT DEFAULT 1, + create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + deleted INT DEFAULT 0 +); + +-- 医疗记录表 +CREATE TABLE IF NOT EXISTS medical_record ( + id BIGINT AUTO_INCREMENT PRIMARY KEY, + visit_id BIGINT NOT NULL, + record_type VARCHAR(50), -- CHECKUP体检, DIAGNOSIS诊断, TREATMENT治疗 + content TEXT, + attachment_urls TEXT, + doctor_id BIGINT, + create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + deleted INT DEFAULT 0 +); + +-- 报表统计表 +CREATE TABLE IF NOT EXISTS report ( + id BIGINT AUTO_INCREMENT PRIMARY KEY, + report_type VARCHAR(50) NOT NULL, -- REVENUE收入, CUSTOMER客户, PET宠物, DRUG药品 + report_data JSON, + period_start DATE, + period_end DATE, + generated_by BIGINT, + create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + deleted INT DEFAULT 0 +); \ No newline at end of file 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 new file mode 100644 index 0000000..aed6c1f --- /dev/null +++ b/backend/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst @@ -0,0 +1,90 @@ +com/gpf/pethospital/controller/MessageController.class +com/gpf/pethospital/controller/PetController.class +com/gpf/pethospital/mapper/UserMapper.class +com/gpf/pethospital/entity/Order.class +com/gpf/pethospital/controller/NoticeController.class +com/gpf/pethospital/mapper/StockInMapper.class +com/gpf/pethospital/service/PrescriptionItemService.class +com/gpf/pethospital/service/PetService.class +com/gpf/pethospital/entity/Drug.class +com/gpf/pethospital/util/JwtUtil.class +com/gpf/pethospital/dto/LoginRequest.class +com/gpf/pethospital/controller/OrderController.class +com/gpf/pethospital/mapper/NoticeMapper.class +com/gpf/pethospital/controller/VaccineRecordController.class +com/gpf/pethospital/mapper/MedicalRecordMapper.class +com/gpf/pethospital/config/WebConfig.class +com/gpf/pethospital/service/MedicalRecordService.class +com/gpf/pethospital/entity/Notice.class +com/gpf/pethospital/controller/StatsController.class +com/gpf/pethospital/entity/Prescription.class +com/gpf/pethospital/mapper/PrescriptionItemMapper.class +com/gpf/pethospital/entity/Appointment.class +com/gpf/pethospital/security/AuthUser.class +com/gpf/pethospital/util/SecurityUtils.class +com/gpf/pethospital/entity/VaccineRecord.class +com/gpf/pethospital/service/impl/StockInServiceImpl.class +com/gpf/pethospital/service/OrderService.class +com/gpf/pethospital/config/SecurityConfig.class +com/gpf/pethospital/mapper/VisitMapper.class +com/gpf/pethospital/config/MybatisPlusConfig$1.class +com/gpf/pethospital/mapper/MessageMapper.class +com/gpf/pethospital/service/impl/PetServiceImpl.class +com/gpf/pethospital/dto/RegisterRequest.class +com/gpf/pethospital/entity/StockIn.class +com/gpf/pethospital/service/VaccineRecordService.class +com/gpf/pethospital/entity/MedicalRecord.class +com/gpf/pethospital/service/ReportService.class +com/gpf/pethospital/controller/StockInController.class +com/gpf/pethospital/service/impl/OrderServiceImpl.class +com/gpf/pethospital/service/impl/StockOutServiceImpl.class +com/gpf/pethospital/entity/Report.class +com/gpf/pethospital/service/impl/MessageServiceImpl.class +com/gpf/pethospital/service/MessageService.class +com/gpf/pethospital/controller/DrugController.class +com/gpf/pethospital/entity/Visit.class +com/gpf/pethospital/mapper/PetMapper.class +com/gpf/pethospital/controller/StockOutController.class +com/gpf/pethospital/service/impl/VisitServiceImpl.class +com/gpf/pethospital/config/MybatisPlusConfig.class +com/gpf/pethospital/PetHospitalApplication.class +com/gpf/pethospital/controller/ReportController.class +com/gpf/pethospital/mapper/VaccineRecordMapper.class +com/gpf/pethospital/common/ApiResponse.class +com/gpf/pethospital/controller/MedicalRecordController.class +com/gpf/pethospital/controller/PrescriptionItemController.class +com/gpf/pethospital/security/JwtAuthenticationFilter.class +com/gpf/pethospital/service/impl/ReportServiceImpl.class +com/gpf/pethospital/service/impl/AppointmentServiceImpl.class +com/gpf/pethospital/controller/AppointmentController.class +com/gpf/pethospital/service/UserService.class +com/gpf/pethospital/entity/Message.class +com/gpf/pethospital/mapper/AppointmentMapper.class +com/gpf/pethospital/service/impl/PrescriptionServiceImpl.class +com/gpf/pethospital/mapper/DrugMapper.class +com/gpf/pethospital/controller/AuthController.class +com/gpf/pethospital/service/NoticeService.class +com/gpf/pethospital/service/DrugService.class +com/gpf/pethospital/service/impl/UserServiceImpl.class +com/gpf/pethospital/service/StockOutService.class +com/gpf/pethospital/service/impl/PrescriptionItemServiceImpl.class +com/gpf/pethospital/entity/User.class +com/gpf/pethospital/mapper/StockOutMapper.class +com/gpf/pethospital/dto/ReplyRequest.class +com/gpf/pethospital/entity/Pet.class +com/gpf/pethospital/service/impl/NoticeServiceImpl.class +com/gpf/pethospital/entity/PrescriptionItem.class +com/gpf/pethospital/entity/StockOut.class +com/gpf/pethospital/service/impl/DrugServiceImpl.class +com/gpf/pethospital/service/StockInService.class +com/gpf/pethospital/service/AppointmentService.class +com/gpf/pethospital/mapper/PrescriptionMapper.class +com/gpf/pethospital/mapper/ReportMapper.class +com/gpf/pethospital/service/PrescriptionService.class +com/gpf/pethospital/mapper/OrderMapper.class +com/gpf/pethospital/controller/VisitController.class +com/gpf/pethospital/service/impl/MedicalRecordServiceImpl.class +com/gpf/pethospital/service/impl/VaccineRecordServiceImpl.class +com/gpf/pethospital/service/VisitService.class +com/gpf/pethospital/controller/PrescriptionController.class +com/gpf/pethospital/controller/UserController.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 new file mode 100644 index 0000000..2a926c0 --- /dev/null +++ b/backend/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst @@ -0,0 +1,89 @@ +/mnt/d/bs/gpf_pet_hospital/backend/src/main/java/com/gpf/pethospital/common/ApiResponse.java +/mnt/d/bs/gpf_pet_hospital/backend/src/main/java/com/gpf/pethospital/service/PetService.java +/mnt/d/bs/gpf_pet_hospital/backend/src/main/java/com/gpf/pethospital/service/impl/AppointmentServiceImpl.java +/mnt/d/bs/gpf_pet_hospital/backend/src/main/java/com/gpf/pethospital/controller/PrescriptionItemController.java +/mnt/d/bs/gpf_pet_hospital/backend/src/main/java/com/gpf/pethospital/controller/VaccineRecordController.java +/mnt/d/bs/gpf_pet_hospital/backend/src/main/java/com/gpf/pethospital/service/impl/PrescriptionServiceImpl.java +/mnt/d/bs/gpf_pet_hospital/backend/src/main/java/com/gpf/pethospital/controller/ReportController.java +/mnt/d/bs/gpf_pet_hospital/backend/src/main/java/com/gpf/pethospital/mapper/MessageMapper.java +/mnt/d/bs/gpf_pet_hospital/backend/src/main/java/com/gpf/pethospital/mapper/VisitMapper.java +/mnt/d/bs/gpf_pet_hospital/backend/src/main/java/com/gpf/pethospital/controller/AuthController.java +/mnt/d/bs/gpf_pet_hospital/backend/src/main/java/com/gpf/pethospital/entity/Visit.java +/mnt/d/bs/gpf_pet_hospital/backend/src/main/java/com/gpf/pethospital/mapper/StockOutMapper.java +/mnt/d/bs/gpf_pet_hospital/backend/src/main/java/com/gpf/pethospital/service/impl/PrescriptionItemServiceImpl.java +/mnt/d/bs/gpf_pet_hospital/backend/src/main/java/com/gpf/pethospital/controller/VisitController.java +/mnt/d/bs/gpf_pet_hospital/backend/src/main/java/com/gpf/pethospital/service/impl/ReportServiceImpl.java +/mnt/d/bs/gpf_pet_hospital/backend/src/main/java/com/gpf/pethospital/service/MessageService.java +/mnt/d/bs/gpf_pet_hospital/backend/src/main/java/com/gpf/pethospital/entity/Drug.java +/mnt/d/bs/gpf_pet_hospital/backend/src/main/java/com/gpf/pethospital/mapper/ReportMapper.java +/mnt/d/bs/gpf_pet_hospital/backend/src/main/java/com/gpf/pethospital/controller/MedicalRecordController.java +/mnt/d/bs/gpf_pet_hospital/backend/src/main/java/com/gpf/pethospital/mapper/NoticeMapper.java +/mnt/d/bs/gpf_pet_hospital/backend/src/main/java/com/gpf/pethospital/entity/VaccineRecord.java +/mnt/d/bs/gpf_pet_hospital/backend/src/main/java/com/gpf/pethospital/service/impl/MessageServiceImpl.java +/mnt/d/bs/gpf_pet_hospital/backend/src/main/java/com/gpf/pethospital/mapper/PrescriptionItemMapper.java +/mnt/d/bs/gpf_pet_hospital/backend/src/main/java/com/gpf/pethospital/service/NoticeService.java +/mnt/d/bs/gpf_pet_hospital/backend/src/main/java/com/gpf/pethospital/service/StockOutService.java +/mnt/d/bs/gpf_pet_hospital/backend/src/main/java/com/gpf/pethospital/service/ReportService.java +/mnt/d/bs/gpf_pet_hospital/backend/src/main/java/com/gpf/pethospital/controller/MessageController.java +/mnt/d/bs/gpf_pet_hospital/backend/src/main/java/com/gpf/pethospital/controller/StockInController.java +/mnt/d/bs/gpf_pet_hospital/backend/src/main/java/com/gpf/pethospital/service/DrugService.java +/mnt/d/bs/gpf_pet_hospital/backend/src/main/java/com/gpf/pethospital/service/PrescriptionService.java +/mnt/d/bs/gpf_pet_hospital/backend/src/main/java/com/gpf/pethospital/dto/LoginRequest.java +/mnt/d/bs/gpf_pet_hospital/backend/src/main/java/com/gpf/pethospital/service/UserService.java +/mnt/d/bs/gpf_pet_hospital/backend/src/main/java/com/gpf/pethospital/service/impl/DrugServiceImpl.java +/mnt/d/bs/gpf_pet_hospital/backend/src/main/java/com/gpf/pethospital/mapper/PetMapper.java +/mnt/d/bs/gpf_pet_hospital/backend/src/main/java/com/gpf/pethospital/entity/Pet.java +/mnt/d/bs/gpf_pet_hospital/backend/src/main/java/com/gpf/pethospital/service/impl/PetServiceImpl.java +/mnt/d/bs/gpf_pet_hospital/backend/src/main/java/com/gpf/pethospital/config/WebConfig.java +/mnt/d/bs/gpf_pet_hospital/backend/src/main/java/com/gpf/pethospital/controller/DrugController.java +/mnt/d/bs/gpf_pet_hospital/backend/src/main/java/com/gpf/pethospital/controller/UserController.java +/mnt/d/bs/gpf_pet_hospital/backend/src/main/java/com/gpf/pethospital/entity/Message.java +/mnt/d/bs/gpf_pet_hospital/backend/src/main/java/com/gpf/pethospital/controller/OrderController.java +/mnt/d/bs/gpf_pet_hospital/backend/src/main/java/com/gpf/pethospital/mapper/UserMapper.java +/mnt/d/bs/gpf_pet_hospital/backend/src/main/java/com/gpf/pethospital/entity/StockIn.java +/mnt/d/bs/gpf_pet_hospital/backend/src/main/java/com/gpf/pethospital/service/impl/StockOutServiceImpl.java +/mnt/d/bs/gpf_pet_hospital/backend/src/main/java/com/gpf/pethospital/entity/Order.java +/mnt/d/bs/gpf_pet_hospital/backend/src/main/java/com/gpf/pethospital/service/MedicalRecordService.java +/mnt/d/bs/gpf_pet_hospital/backend/src/main/java/com/gpf/pethospital/entity/MedicalRecord.java +/mnt/d/bs/gpf_pet_hospital/backend/src/main/java/com/gpf/pethospital/service/PrescriptionItemService.java +/mnt/d/bs/gpf_pet_hospital/backend/src/main/java/com/gpf/pethospital/controller/PrescriptionController.java +/mnt/d/bs/gpf_pet_hospital/backend/src/main/java/com/gpf/pethospital/PetHospitalApplication.java +/mnt/d/bs/gpf_pet_hospital/backend/src/main/java/com/gpf/pethospital/config/MybatisPlusConfig.java +/mnt/d/bs/gpf_pet_hospital/backend/src/main/java/com/gpf/pethospital/entity/Prescription.java +/mnt/d/bs/gpf_pet_hospital/backend/src/main/java/com/gpf/pethospital/mapper/StockInMapper.java +/mnt/d/bs/gpf_pet_hospital/backend/src/main/java/com/gpf/pethospital/security/JwtAuthenticationFilter.java +/mnt/d/bs/gpf_pet_hospital/backend/src/main/java/com/gpf/pethospital/service/impl/UserServiceImpl.java +/mnt/d/bs/gpf_pet_hospital/backend/src/main/java/com/gpf/pethospital/entity/Appointment.java +/mnt/d/bs/gpf_pet_hospital/backend/src/main/java/com/gpf/pethospital/service/impl/VaccineRecordServiceImpl.java +/mnt/d/bs/gpf_pet_hospital/backend/src/main/java/com/gpf/pethospital/mapper/OrderMapper.java +/mnt/d/bs/gpf_pet_hospital/backend/src/main/java/com/gpf/pethospital/mapper/DrugMapper.java +/mnt/d/bs/gpf_pet_hospital/backend/src/main/java/com/gpf/pethospital/service/AppointmentService.java +/mnt/d/bs/gpf_pet_hospital/backend/src/main/java/com/gpf/pethospital/service/VisitService.java +/mnt/d/bs/gpf_pet_hospital/backend/src/main/java/com/gpf/pethospital/controller/NoticeController.java +/mnt/d/bs/gpf_pet_hospital/backend/src/main/java/com/gpf/pethospital/service/impl/NoticeServiceImpl.java +/mnt/d/bs/gpf_pet_hospital/backend/src/main/java/com/gpf/pethospital/service/StockInService.java +/mnt/d/bs/gpf_pet_hospital/backend/src/main/java/com/gpf/pethospital/entity/User.java +/mnt/d/bs/gpf_pet_hospital/backend/src/main/java/com/gpf/pethospital/entity/Notice.java +/mnt/d/bs/gpf_pet_hospital/backend/src/main/java/com/gpf/pethospital/controller/AppointmentController.java +/mnt/d/bs/gpf_pet_hospital/backend/src/main/java/com/gpf/pethospital/util/SecurityUtils.java +/mnt/d/bs/gpf_pet_hospital/backend/src/main/java/com/gpf/pethospital/mapper/PrescriptionMapper.java +/mnt/d/bs/gpf_pet_hospital/backend/src/main/java/com/gpf/pethospital/config/SecurityConfig.java +/mnt/d/bs/gpf_pet_hospital/backend/src/main/java/com/gpf/pethospital/entity/StockOut.java +/mnt/d/bs/gpf_pet_hospital/backend/src/main/java/com/gpf/pethospital/util/JwtUtil.java +/mnt/d/bs/gpf_pet_hospital/backend/src/main/java/com/gpf/pethospital/mapper/MedicalRecordMapper.java +/mnt/d/bs/gpf_pet_hospital/backend/src/main/java/com/gpf/pethospital/mapper/VaccineRecordMapper.java +/mnt/d/bs/gpf_pet_hospital/backend/src/main/java/com/gpf/pethospital/security/AuthUser.java +/mnt/d/bs/gpf_pet_hospital/backend/src/main/java/com/gpf/pethospital/dto/RegisterRequest.java +/mnt/d/bs/gpf_pet_hospital/backend/src/main/java/com/gpf/pethospital/entity/PrescriptionItem.java +/mnt/d/bs/gpf_pet_hospital/backend/src/main/java/com/gpf/pethospital/controller/StockOutController.java +/mnt/d/bs/gpf_pet_hospital/backend/src/main/java/com/gpf/pethospital/service/OrderService.java +/mnt/d/bs/gpf_pet_hospital/backend/src/main/java/com/gpf/pethospital/mapper/AppointmentMapper.java +/mnt/d/bs/gpf_pet_hospital/backend/src/main/java/com/gpf/pethospital/service/impl/StockInServiceImpl.java +/mnt/d/bs/gpf_pet_hospital/backend/src/main/java/com/gpf/pethospital/service/VaccineRecordService.java +/mnt/d/bs/gpf_pet_hospital/backend/src/main/java/com/gpf/pethospital/service/impl/OrderServiceImpl.java +/mnt/d/bs/gpf_pet_hospital/backend/src/main/java/com/gpf/pethospital/dto/ReplyRequest.java +/mnt/d/bs/gpf_pet_hospital/backend/src/main/java/com/gpf/pethospital/controller/PetController.java +/mnt/d/bs/gpf_pet_hospital/backend/src/main/java/com/gpf/pethospital/service/impl/VisitServiceImpl.java +/mnt/d/bs/gpf_pet_hospital/backend/src/main/java/com/gpf/pethospital/controller/StatsController.java +/mnt/d/bs/gpf_pet_hospital/backend/src/main/java/com/gpf/pethospital/service/impl/MedicalRecordServiceImpl.java +/mnt/d/bs/gpf_pet_hospital/backend/src/main/java/com/gpf/pethospital/entity/Report.java diff --git a/database_er_diagram.mmd b/database_er_diagram.mmd new file mode 100644 index 0000000..d80d147 --- /dev/null +++ b/database_er_diagram.mmd @@ -0,0 +1,107 @@ +graph TD + subgraph "用户管理模块" + User((User)) + Doctor((Doctor)) + end + + subgraph "宠物管理模块" + Pet((Pet)) + end + + subgraph "预约管理模块" + Appointment((Appointment)) + end + + subgraph "就诊管理模块" + Visit((Visit)) + end + + subgraph "处方管理模块" + Prescription((Prescription)) + PrescriptionItem((PrescriptionItem)) + end + + subgraph "药品管理模块" + Drug((Drug)) + end + + subgraph "订单管理模块" + Order((Order)) + end + + subgraph "库存管理模块" + StockIn((StockIn)) + StockOut((StockOut)) + end + + subgraph "病历管理模块" + MedicalRecord((MedicalRecord)) + end + + subgraph "消息通知模块" + Message((Message)) + Notice((Notice)) + end + + subgraph "报表管理模块" + Report((Report)) + end + + subgraph "疫苗管理模块" + VaccineRecord((VaccineRecord)) + end + + %% 用户关系 + User --> Pet : 拥有(ownerId) + User --> Appointment : 创建(customerId) + User --> Visit : 就诊(customerId) + User --> Prescription : 处方(customerId) + User --> Order : 订单(customerId) + User --> Message : 发送/接收(senderId/receiverId) + User --> Notice : 发布(publisherId) + User --> Report : 生成(generatedBy) + User --> StockIn : 入库(operatorId) + User --> StockOut : 出库(operatorId) + + %% 医生关系 + Doctor --> Appointment : 接诊(doctorId) + Doctor --> Visit : 诊治(doctorId) + Doctor --> Prescription : 开具(doctorId) + Doctor --> MedicalRecord : 记录(doctorId) + Doctor --> VaccineRecord : 注射(doctorId) + + %% 宠物关系 + Pet --> Appointment : 预约(petId) + Pet --> Visit : 就诊(petId) + Pet --> VaccineRecord : 接种(petId) + + %% 预约关系 + Appointment --> Visit : 关联(appointmentId) + + %% 就诊关系 + Visit --> Prescription : 对应(visitId) + Visit --> Order : 产生(visitId) + Visit --> MedicalRecord : 记录(visitId) + + %% 处方关系 + Prescription --> PrescriptionItem : 包含(prescriptionId) + + %% 药品关系 + Drug --> PrescriptionItem : 包含(drugId) + Drug --> StockIn : 入库(drugId) + Drug --> StockOut : 出库(drugId) + + %% 报表关系 + Report --> Appointment : 统计 + Report --> Visit : 统计 + Report --> Order : 统计 + Report --> Prescription : 统计 + + style User fill:#e1f5fe + style Doctor fill:#e8f5e8 + style Pet fill:#fff3e0 + style Appointment fill:#f3e5f5 + style Visit fill:#e0f2f1 + style Prescription fill:#ede7f6 + style Drug fill:#e0f7fa + style Order fill:#fff8e1 \ No newline at end of file diff --git a/database_schema_documentation.md b/database_schema_documentation.md new file mode 100644 index 0000000..83e47c3 --- /dev/null +++ b/database_schema_documentation.md @@ -0,0 +1,283 @@ +# 宠物医院管理系统 - 数据库表结构文档 + +## 1. 用户表 (user) + +| 字段名 | 类型 | 说明 | +|--------|------|------| +| id | BIGINT | 主键,自增长 | +| username | VARCHAR(50) | 用户名,唯一 | +| phone | VARCHAR(20) | 手机号 | +| email | VARCHAR(100) | 邮箱 | +| password | VARCHAR(255) | 密码(加密存储) | +| role | VARCHAR(20) | 角色(ADMIN/DOCTOR/CUSTOMER) | +| status | INT | 状态(1-启用,0-禁用) | +| avatar | VARCHAR(255) | 头像URL | +| create_time | TIMESTAMP | 创建时间 | +| update_time | TIMESTAMP | 更新时间 | +| deleted | INT | 删除标记(0-未删除,1-已删除) | + +## 2. 医生表 (doctor) + +| 字段名 | 类型 | 说明 | +|--------|------|------| +| id | BIGINT | 主键,自增长 | +| name | VARCHAR(50) | 医生姓名 | +| department | VARCHAR(50) | 所属科室 | +| title | VARCHAR(50) | 职称 | +| phone | VARCHAR(20) | 联系电话 | +| email | VARCHAR(100) | 邮箱 | +| avatar | VARCHAR(255) | 头像URL | +| status | INT | 状态(1-启用,0-禁用) | +| create_time | TIMESTAMP | 创建时间 | +| update_time | TIMESTAMP | 更新时间 | +| deleted | INT | 删除标记 | + +## 3. 宠物表 (pet) + +| 字段名 | 类型 | 说明 | +|--------|------|------| +| id | BIGINT | 主键,自增长 | +| owner_id | BIGINT | 主人ID(外键关联user表) | +| name | VARCHAR(50) | 宠物名称 | +| species | VARCHAR(50) | 物种(猫/狗等) | +| breed | VARCHAR(100) | 品种 | +| gender | VARCHAR(10) | 性别(MALE/FEMALE) | +| birthday | DATE | 生日 | +| weight | DOUBLE | 体重 | +| photo | VARCHAR(255) | 照片URL | +| remark | TEXT | 备注 | +| create_time | TIMESTAMP | 创建时间 | +| update_time | TIMESTAMP | 更新时间 | +| deleted | INT | 删除标记 | + +## 4. 预约表 (appointment) + +| 字段名 | 类型 | 说明 | +|--------|------|------| +| id | BIGINT | 主键,自增长 | +| customer_id | BIGINT | 顾客ID(外键关联user表) | +| pet_id | BIGINT | 宠物ID(外键关联pet表) | +| doctor_id | BIGINT | 医生ID(外键关联doctor表,可空) | +| department | VARCHAR(50) | 科室 | +| appointment_date | DATE | 预约日期 | +| time_slot | VARCHAR(20) | 预约时段(如:09:00-10:00) | +| status | VARCHAR(20) | 状态(PENDING/CONFIRMED/ARRIVED/CANCELLED/NO_SHOW) | +| remark | TEXT | 备注 | +| cancel_time | TIMESTAMP | 取消时间 | +| create_time | TIMESTAMP | 创建时间 | +| update_time | TIMESTAMP | 更新时间 | +| deleted | INT | 删除标记 | + +## 5. 就诊记录表 (visit) + +| 字段名 | 类型 | 说明 | +|--------|------|------| +| id | BIGINT | 主键,自增长 | +| appointment_id | BIGINT | 预约ID(外键关联appointment表,可空) | +| customer_id | BIGINT | 顾客ID(外键关联user表) | +| pet_id | BIGINT | 宠物ID(外键关联pet表) | +| doctor_id | BIGINT | 医生ID(外键关联doctor表) | +| symptoms | TEXT | 症状描述 | +| diagnosis | TEXT | 诊断结果 | +| treatment_plan | TEXT | 治疗方案 | +| status | VARCHAR(20) | 状态(IN_PROGRESS/COMPLETED/CANCELLED) | +| total_amount | DECIMAL(10,2) | 总金额 | +| payment_status | VARCHAR(20) | 支付状态(UNPAID/PAID/REFUNDING/REFUNDED) | +| payment_method | VARCHAR(20) | 支付方式(OFFLINE/ALIPAY/WECHAT) | +| payment_time | TIMESTAMP | 支付时间 | +| start_time | TIMESTAMP | 开始时间 | +| end_time | TIMESTAMP | 结束时间 | +| create_time | TIMESTAMP | 创建时间 | +| update_time | TIMESTAMP | 更新时间 | +| deleted | INT | 删除标记 | + +## 6. 处方表 (prescription) + +| 字段名 | 类型 | 说明 | +|--------|------|------| +| id | BIGINT | 主键,自增长 | +| visit_id | BIGINT | 就诊ID(外键关联visit表) | +| doctor_id | BIGINT | 医生ID(外键关联doctor表) | +| customer_id | BIGINT | 顾客ID(外键关联user表) | +| total_amount | DECIMAL(10,2) | 总金额 | +| status | VARCHAR(20) | 状态(DRAFT/SUBMITTED/ISSUED/VOIDED) | +| remark | TEXT | 备注 | +| create_time | TIMESTAMP | 创建时间 | +| update_time | TIMESTAMP | 更新时间 | +| deleted | INT | 删除标记 | + +## 7. 处方明细表 (prescription_item) + +| 字段名 | 类型 | 说明 | +|--------|------|------| +| id | BIGINT | 主键,自增长 | +| prescription_id | BIGINT | 处方ID(外键关联prescription表) | +| drug_id | BIGINT | 药品ID(外键关联drug表) | +| quantity | INT | 数量 | +| dosage | VARCHAR(100) | 用量 | +| frequency | VARCHAR(50) | 频次 | +| duration | VARCHAR(50) | 疗程 | +| usage_instructions | TEXT | 用法说明 | +| create_time | TIMESTAMP | 创建时间 | +| update_time | TIMESTAMP | 更新时间 | +| deleted | INT | 删除标记 | + +## 8. 药品表 (drug) + +| 字段名 | 类型 | 说明 | +|--------|------|------| +| id | BIGINT | 主键,自增长 | +| name | VARCHAR(100) | 药品名称 | +| category | VARCHAR(50) | 分类 | +| manufacturer | VARCHAR(100) | 生产厂家 | +| specification | VARCHAR(100) | 规格 | +| unit_price | DECIMAL(10,2) | 单价 | +| stock_quantity | INT | 库存数量 | +| unit | VARCHAR(20) | 单位 | +| status | INT | 状态(1-启用,0-禁用) | +| create_time | TIMESTAMP | 创建时间 | +| update_time | TIMESTAMP | 更新时间 | +| deleted | INT | 删除标记 | + +## 9. 订单表 (order_info) + +| 字段名 | 类型 | 说明 | +|--------|------|------| +| id | BIGINT | 主键,自增长 | +| visit_id | BIGINT | 就诊ID(外键关联visit表,可空) | +| customer_id | BIGINT | 顾客ID(外键关联user表) | +| amount | DECIMAL(10,2) | 金额 | +| status | VARCHAR(20) | 状态(UNPAID/PAID/CANCELLED/REFUNDING/REFUNDED) | +| payment_method | VARCHAR(20) | 支付方式(OFFLINE/ALIPAY/WECHAT) | +| payment_time | TIMESTAMP | 支付时间 | +| remark | TEXT | 备注 | +| create_time | TIMESTAMP | 创建时间 | +| update_time | TIMESTAMP | 更新时间 | +| deleted | INT | 删除标记 | + +## 10. 病历表 (medical_record) + +| 字段名 | 类型 | 说明 | +|--------|------|------| +| id | BIGINT | 主键,自增长 | +| visit_id | BIGINT | 就诊ID(外键关联visit表) | +| record_type | VARCHAR(50) | 记录类型(CHECKUP/EXAMINATION/DIAGNOSIS/TREATMENT) | +| content | TEXT | 内容 | +| attachment_urls | TEXT | 附件URL(JSON格式) | +| doctor_id | BIGINT | 医生ID(外键关联doctor表) | +| create_time | TIMESTAMP | 创建时间 | +| update_time | TIMESTAMP | 更新时间 | +| deleted | INT | 删除标记 | + +## 11. 消息表 (message) + +| 字段名 | 类型 | 说明 | +|--------|------|------| +| id | BIGINT | 主键,自增长 | +| sender_id | BIGINT | 发送者ID(外键关联user表,可空) | +| receiver_id | BIGINT | 接收者ID(外键关联user表) | +| content | TEXT | 消息内容 | +| type | VARCHAR(20) | 类型(NOTICE/CHAT) | +| status | VARCHAR(20) | 状态(UNREAD/READ) | +| create_time | TIMESTAMP | 创建时间 | +| update_time | TIMESTAMP | 更新时间 | +| deleted | INT | 删除标记 | + +## 12. 公告表 (notice) + +| 字段名 | 类型 | 说明 | +|--------|------|------| +| id | BIGINT | 主键,自增长 | +| title | VARCHAR(200) | 标题 | +| content | TEXT | 内容 | +| publisher_id | BIGINT | 发布者ID(外键关联user表) | +| publish_time | TIMESTAMP | 发布时间 | +| status | INT | 状态(1-发布,0-撤销) | +| create_time | TIMESTAMP | 创建时间 | +| update_time | TIMESTAMP | 更新时间 | +| deleted | INT | 删除标记 | + +## 13. 报表表 (report) + +| 字段名 | 类型 | 说明 | +|--------|------|------| +| id | BIGINT | 主键,自增长 | +| report_type | VARCHAR(50) | 报表类型(REVENUE/CUSTOMER/PET/DRUG) | +| report_data | JSON | 报表数据(JSON格式) | +| period_start | DATE | 统计周期开始 | +| period_end | DATE | 统计周期结束 | +| generated_by | BIGINT | 生成者ID(外键关联user表) | +| create_time | TIMESTAMP | 创建时间 | +| update_time | TIMESTAMP | 更新时间 | +| deleted | INT | 删除标记 | + +## 14. 入库记录表 (stock_in) + +| 字段名 | 类型 | 说明 | +|--------|------|------| +| id | BIGINT | 主键,自增长 | +| drug_id | BIGINT | 药品ID(外键关联drug表) | +| quantity | INT | 数量 | +| unit_price | DECIMAL(10,2) | 单价 | +| supplier | VARCHAR(100) | 供应商 | +| operator_id | BIGINT | 操作员ID(外键关联user表) | +| remark | TEXT | 备注 | +| create_time | TIMESTAMP | 创建时间 | +| update_time | TIMESTAMP | 更新时间 | +| deleted | INT | 删除标记 | + +## 15. 出库记录表 (stock_out) + +| 字段名 | 类型 | 说明 | +|--------|------|------| +| id | BIGINT | 主键,自增长 | +| drug_id | BIGINT | 药品ID(外键关联drug表) | +| quantity | INT | 数量 | +| unit_price | DECIMAL(10,2) | 单价 | +| purpose | VARCHAR(100) | 用途(销售/损耗等) | +| operator_id | BIGINT | 操作员ID(外键关联user表) | +| remark | TEXT | 备注 | +| create_time | TIMESTAMP | 创建时间 | +| update_time | TIMESTAMP | 更新时间 | +| deleted | INT | 删除标记 | + +## 16. 疫苗接种记录表 (vaccine_record) + +| 字段名 | 类型 | 说明 | +|--------|------|------| +| id | BIGINT | 主键,自增长 | +| pet_id | BIGINT | 宠物ID(外键关联pet表) | +| vaccine_name | VARCHAR(100) | 疫苗名称 | +| dose_number | INT | 剂次 | +| injection_date | DATE | 接种日期 | +| next_appointment_date | DATE | 下次预约日期 | +| doctor_id | BIGINT | 医生ID(外键关联doctor表) | +| remark | TEXT | 备注 | +| create_time | TIMESTAMP | 创建时间 | +| update_time | TIMESTAMP | 更新时间 | +| deleted | INT | 删除标记 | + +## 主要业务流程关系 + +### 1. 预约流程 +Customer → Appointment → Visit → Prescription → Order + +### 2. 库存管理 +Drug ↔ StockIn/StockOut + +### 3. 病历管理 +Visit → MedicalRecord + +### 4. 疫苗管理 +Pet → VaccineRecord + +### 5. 消息通知 +User ↔ Message/Notice + +## 数据完整性约束 + +1. **外键约束**:确保所有外键引用的有效性 +2. **软删除**:使用deleted字段实现软删除,保留历史数据 +3. **时间戳**:所有表都有create_time和update_time字段 +4. **默认值**:合理设置字段默认值(如status默认为1) +5. **枚举约束**:状态字段使用预定义的枚举值 \ No newline at end of file diff --git a/frp_setup_guide.md b/frp_setup_guide.md new file mode 100644 index 0000000..5f0eb68 --- /dev/null +++ b/frp_setup_guide.md @@ -0,0 +1,144 @@ +# FRP 内网穿透工具安装指南 + +## 当前状态 +- 已安装: frps (服务器端) - 位于 `/mnt/d/bs/gpf_pet_hospital/frp/frps` +- 已安装: frpc (客户端) - 位于 `/mnt/d/bs/gpf_pet_hospital/frp/frpc` +- 版本: FRP 0.66.0 for Linux AMD64 + +## 方法一:手动下载 (推荐) + +### 1. 下载最新版本的FRP +```bash +# 进入项目目录 +cd /mnt/d/bs/gpf_pet_hospital + +# 下载最新版本的FRP +wget https://github.com/fatedier/frp/releases/download/v0.66.0/frp_0.66.0_linux_amd64.tar.gz + +# 解压 +tar -xzf frp_0.66.0_linux_amd64.tar.gz + +# 将frpc移动到frp目录 +mv frp_0.66.0_linux_amd64/frpc frp/ + +# 清理 +rm -rf frp_0.66.0_linux_amd64 frp_0.66.0_linux_amd64.tar.gz +``` + +### 2. 配置FRPC +创建配置文件 `/mnt/d/bs/gpf_pet_hospital/frp/frpc.ini`: + +```ini +[common] +server_addr = 你的公网IP或域名 +server_port = 7000 + +[web] +type = http +local_port = 5173 +custom_domains = your-domain.com + +[backend] +type = tcp +local_port = 8081 +remote_port = 8081 +``` + +## 方法二:使用Docker (如果可用) + +```bash +# 启动FRPS服务器 +docker run -d --name frps \ + -p 7000:7000 \ + -p 7500:7500 \ + -p 8080:80 \ + --restart=always \ + snowdreamtech/frps:0.50.0 + +# 启动FRPC客户端 +docker run -d --name frpc \ + --restart=always \ + -v /mnt/d/bs/gpf_pet_hospital/frp/frpc.ini:/etc/frp/frpc.ini \ + snowdreamtech/frpc:0.50.0 +``` + +## 方法三:编译安装 (如果有Go环境) + +```bash +# 安装Go (如果未安装) +# Ubuntu/Debian: sudo apt-get install golang-go + +# 克隆仓库 +git clone https://github.com/fatedier/frp.git +cd frp +git checkout v0.66.0 + +# 编译 +make frpc + +# 复制到目标位置 +cp bin/frpc /mnt/d/bs/gpf_pet_hospital/frp/ +``` + +## 用于宠物医院管理系统的典型配置 + +### FRPS 服务器配置 (frps.ini) +```ini +[common] +bind_port = 7000 +dashboard_port = 7500 +dashboard_user = admin +dashboard_pwd = admin +vhost_http_port = 80 +vhost_https_port = 443 +token = your_token_here +``` + +### FRPC 客户端配置 (frpc.ini) +```ini +[common] +server_addr = 你的公网服务器IP +server_port = 7000 +token = your_token_here + +[pet-hospital-frontend] +type = http +local_port = 5173 +custom_domains = hospital.yourdomain.com + +[pet-hospital-backend] +type = tcp +local_port = 8081 +remote_port = 8081 + +[pet-hospital-admin] +type = http +local_port = 5173 +custom_domains = admin.yourdomain.com +``` + +## 启动服务 + +### 启动FRPS服务器 (在公网服务器) +```bash +cd /mnt/d/bs/gpf_pet_hospital/frp +./frps -c frps.ini +``` + +### 启动FRPC客户端 (在本地机器) +```bash +cd /mnt/d/bs/gpf_pet_hospital/frp +./frpc -c frpc.ini +``` + +## 注意事项 +1. 确保防火墙开放相应端口 (7000, 80, 443等) +2. 在生产环境中使用强密码和密钥 +3. 定期更新FRP版本以获得安全补丁 +4. 监控FRP服务的运行状态 + +## 故障排除 +- 检查网络连接 +- 确认端口未被占用 +- 查看FRP日志文件 +- 验证配置文件语法 \ No newline at end of file diff --git a/simple_er_diagram.txt b/simple_er_diagram.txt new file mode 100644 index 0000000..7da863e --- /dev/null +++ b/simple_er_diagram.txt @@ -0,0 +1,142 @@ +============================================================ + 宠物医院管理系统 - 实体关系图 +============================================================ + +┌─────────────┐ ┌─────────────┐ +│ User │◄────────┤ Pet │ +│─────────────│ │─────────────│ +│ id (PK) │ │ id (PK) │ +│ username │ │ owner_id (FK)│ +│ phone │ │ name │ +│ email │ │ species │ +│ password │ │ breed │ +│ role │ │ gender │ +│ status │ │ birthday │ +│ ... │ │ ... │ +└─────────────┘ └─────────────┘ + │ │ + │ │ + │ 1 │ 1..* + │ │ + ▼ ▼ +┌─────────────┐ ┌─────────────┐ +│ Appointment │◄────────┤ Visit │ +│─────────────│ │─────────────│ +│ id (PK) │ │ id (PK) │ +│ customer_id │ │ appointment │ +│ pet_id (FK) │ │ _id (FK) │ +│ doctor_id │ │ customer_id │ +│ date │ │ pet_id (FK) │ +│ time_slot │ │ doctor_id │ +│ status │ │ symptoms │ +│ ... │ │ diagnosis │ +└─────────────┘ │ ... │ + └─────────────┘ + │ + │ + │ 1 + │ + ▼ +┌─────────────┐ ┌─────────────┐ +│ Doctor │ │Prescription │ +│─────────────│ │─────────────│ +│ id (PK) │◄────────┤ id (PK) │ +│ name │ │ visit_id (FK)│ +│ department │ │ doctor_id │ +│ title │ │ customer_id │ +│ ... │ │ total_amount│ +└─────────────┘ │ status │ + │ ... │ + └─────────────┘ + │ + │ 1 + │ + ▼ + ┌─────────────┐ + │Prescription │ + │ Item │ + │─────────────│ + │ id (PK) │ + │ prescr_id │ + │ (FK) │ + │ drug_id (FK)│ + │ quantity │ + │ ... │ + └─────────────┘ + │ + │ + │ 1 + │ + ▼ + ┌─────────────┐ + │ Drug │ + │─────────────│ + │ id (PK) │ + │ name │ + │ category │ + │ price │ + │ stock_qty │ + │ ... │ + └─────────────┘ + │ + ┌──────────┼──────────┐ + │ │ │ + ▼ ▼ ▼ + ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ + │ Stock In │ │ Stock Out │ │ Order │ + │─────────────│ │─────────────│ │─────────────│ + │ drug_id (FK)│ │ drug_id (FK)│ │ visit_id │ + │ quantity │ │ quantity │ │ (FK) │ + │ ... │ │ ... │ │ amount │ + └─────────────┘ └─────────────┘ │ status │ + │ ... │ + └─────────────┘ + +============================================================ + 关系说明 +============================================================ + +1. User (1) ───── (0..*) Pet + - 一个用户可以拥有零个或多个宠物 + +2. User (1) ───── (0..*) Appointment + - 一个用户可以创建零个或多个预约 + +3. Pet (1) ───── (0..*) Appointment + - 一个宠物可以有零个或多个预约 + +4. Doctor (1) ──── (0..*) Appointment + - 一个医生可以接收零个或多个预约 + +5. Appointment (0..1) ──── (0..1) Visit + - 一个预约最多对应一个就诊记录 + +6. Visit (1) ───── (0..*) Prescription + - 一个就诊可以开具零个或多个处方 + +7. Prescription (1) ──── (1..*) PrescriptionItem + - 一个处方包含一个或多个处方明细 + +8. Drug (1) ───── (0..*) PrescriptionItem + - 一种药品可以在零个或多个处方中出现 + +9. Visit (1) ───── (0..*) Order + - 一次就诊可以产生零个或多个订单 + +10. Drug (1) ───── (0..*) StockIn/StockOut + - 一种药品可以有零个或多个出入库记录 + +============================================================ + 业务流程 +============================================================ + +顾客 (User) → 预约 (Appointment) → 就诊 (Visit) → +处方 (Prescription) → 订单 (Order) → 支付 + +医生 (User) → 诊断 (Visit) → 开具处方 (Prescription) → +用药指导 (PrescriptionItem) + +药品 (Drug) ←→ 库存管理 (StockIn/StockOut) → +成本控制 (Order) + +============================================================ \ No newline at end of file diff --git a/start_frp.sh b/start_frp.sh new file mode 100644 index 0000000..cbcf30d --- /dev/null +++ b/start_frp.sh @@ -0,0 +1,69 @@ +#!/bin/bash + +# 宠物医院管理系统 - FRP内网穿透启动脚本 + +echo "===========================================" +echo " 宠物医院管理系统 - FRP内网穿透启动脚本" +echo "===========================================" + +# 检查frpc是否存在 +if [ ! -f "./frp/frpc" ]; then + echo "错误: 未找到frpc客户端程序" + echo "请先按照frp_setup_guide.md中的说明下载并安装frpc" + echo "" + echo "快速安装命令:" + echo "cd /mnt/d/bs/gpf_pet_hospital" + echo "wget https://github.com/fatedier/frp/releases/download/v0.66.0/frp_0.66.0_linux_amd64.tar.gz" + echo "tar -xzf frp_0.66.0_linux_amd64.tar.gz" + echo "mv frp_0.66.0_linux_amd64/frpc frp/" + echo "rm -rf frp_0.66.0_linux_amd64 frp_0.66.0_linux_amd64.tar.gz" + exit 1 +fi + +# 检查配置文件是否存在 +if [ ! -f "./frp/frpc.ini" ]; then + echo "错误: 未找到frpc配置文件" + echo "请确保 ./frp/frpc.ini 存在" + exit 1 +fi + +echo "检查本地服务状态..." +# 检查前端服务 +if netstat -tuln | grep -q ":5173 "; then + echo "✓ 前端服务 (Vue) 正在运行" +else + echo "✗ 前端服务 (Vue) 未检测到,请确保已启动: npx vite --host 0.0.0.0 --port 5173" +fi + +# 检查后端服务 +if netstat -tuln | grep -q ":8081 "; then + echo "✓ 后端服务 (Spring Boot) 正在运行" +else + echo "✗ 后端服务 (Spring Boot) 未检测到,请确保已启动: cd backend && mvn spring-boot:run" +fi + +echo "" +echo "启动FRP客户端..." +echo "注意: 请确保FRP服务器端已在公网服务器上启动" + +# 启动frpc +cd ./frp +chmod +x frpc +./frpc -c frpc.ini & + +FRP_PID=$! +echo "FRP客户端已启动 (PID: $FRP_PID)" + +echo "" +echo "===========================================" +echo " FRP内网穿透已启动" +echo "===========================================" +echo "服务映射:" +echo " 本地:5173 -> 公网:HTTP (通过域名访问)" +echo " 本地:8081 -> 公网:8081 (TCP)" +echo "" +echo "要停止FRP客户端,请运行: kill $FRP_PID" +echo "===========================================" + +# 显示FRP进程 +ps aux | grep frpc | grep -v grep \ No newline at end of file