From f9bfb8556b18f3b5c1e173a5e01ae219e97ceaca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=AD=90=E7=90=A6?= <95332614+wangziqi0409@users.noreply.github.com> Date: Mon, 9 Feb 2026 21:14:30 +0800 Subject: [PATCH] add --- ...络工程毕业设计论文撰写规范-(应用开发类).md | 307 +++ AGENTS.md | 43 + admin_activity_diagram.drawio | 195 ++ admin_entity.drawio | 14 + admin_function_structure.drawio | 107 + admin_sequence_diagram.drawio | 152 ++ admin_use_case.drawio | 68 + .../controller/AppointmentController.java | 2 + .../controller/NoticeController.java | 11 + .../pethospital/controller/PetController.java | 2 + .../controller/StatsController.java | 7 +- .../pethospital/entity/PrescriptionItem.java | 3 +- .../src/main/resources/application-dev.yml | 6 +- backend/src/main/resources/schema.sql | 44 +- backend/target/classes/application-dev.yml | 25 +- backend/target/classes/application.yml | 4 + .../controller/AppointmentController.class | Bin 6477 -> 6612 bytes .../controller/NoticeController.class | Bin 6495 -> 6976 bytes .../controller/PetController.class | Bin 6704 -> 6754 bytes .../controller/StatsController.class | Bin 5341 -> 5376 bytes .../pethospital/entity/PrescriptionItem.class | Bin 8539 -> 8597 bytes backend/target/classes/schema-h2.sql | 242 -- backend/target/classes/schema.sql | 362 +-- class_diagram.drawio | 67 + frontend/package-lock.json | 3 + frontend/src/pages/AppointmentPage.vue | 70 +- frontend/src/pages/MedicalRecordPage.vue | 75 +- frontend/src/pages/MessagePage.vue | 11 + frontend/src/pages/OrderPage.vue | 22 +- frontend/src/pages/PetPage.vue | 55 +- frontend/src/pages/PrescriptionPage.vue | 22 +- frontend/src/pages/ReportPage.vue | 76 +- frontend/src/pages/StockInPage.vue | 38 +- frontend/src/pages/StockOutPage.vue | 38 +- frontend/src/pages/UserPage.vue | 23 + frontend/src/pages/VisitPage.vue | 51 +- pet_hospital_class_diagram.puml | 527 +++++ pet_hospital_sequence_diagram.puml | 64 + pet_hospital_use_case_diagram.puml | 92 + system_er_diagram.drawio | 236 ++ thesis_with_diagrams.md | 2059 +++++++++++++++++ uml_diagrams_readme.md | 56 + updated_uml_diagrams_readme.md | 72 + user_activity_diagram.drawio | 189 ++ user_entity.drawio | 14 + user_function_structure.drawio | 89 + user_sequence_diagram.drawio | 180 ++ user_use_case.drawio | 62 + ~$宠物医院管理系统毕业论文-正确转换版.docx | Bin 0 -> 162 bytes 爱维宠物医院管理系统毕业论文-含图表版.docx | Bin 0 -> 63036 bytes 爱维宠物医院管理系统毕业论文-改进版.docx | Bin 0 -> 61736 bytes 爱维宠物医院管理系统毕业论文-正确转换版.docx | Bin 0 -> 62716 bytes ...物医院管理系统毕业论文-由markdown转换版.docx | Bin 0 -> 60838 bytes 爱维宠物医院管理系统毕业论文.md | 1639 +++++++++++++ 54 files changed, 6963 insertions(+), 461 deletions(-) create mode 100644 2026届网络工程毕业设计论文撰写规范-(应用开发类).md create mode 100644 AGENTS.md create mode 100644 admin_activity_diagram.drawio create mode 100644 admin_entity.drawio create mode 100644 admin_function_structure.drawio create mode 100644 admin_sequence_diagram.drawio create mode 100644 admin_use_case.drawio delete mode 100644 backend/target/classes/schema-h2.sql create mode 100644 class_diagram.drawio create mode 100644 pet_hospital_class_diagram.puml create mode 100644 pet_hospital_sequence_diagram.puml create mode 100644 pet_hospital_use_case_diagram.puml create mode 100644 system_er_diagram.drawio create mode 100644 thesis_with_diagrams.md create mode 100644 uml_diagrams_readme.md create mode 100644 updated_uml_diagrams_readme.md create mode 100644 user_activity_diagram.drawio create mode 100644 user_entity.drawio create mode 100644 user_function_structure.drawio create mode 100644 user_sequence_diagram.drawio create mode 100644 user_use_case.drawio create mode 100644 ~$宠物医院管理系统毕业论文-正确转换版.docx create mode 100644 爱维宠物医院管理系统毕业论文-含图表版.docx create mode 100644 爱维宠物医院管理系统毕业论文-改进版.docx create mode 100644 爱维宠物医院管理系统毕业论文-正确转换版.docx create mode 100644 爱维宠物医院管理系统毕业论文-由markdown转换版.docx create mode 100644 爱维宠物医院管理系统毕业论文.md diff --git a/2026届网络工程毕业设计论文撰写规范-(应用开发类).md b/2026届网络工程毕业设计论文撰写规范-(应用开发类).md new file mode 100644 index 0000000..24b37cd --- /dev/null +++ b/2026届网络工程毕业设计论文撰写规范-(应用开发类).md @@ -0,0 +1,307 @@ +# 2026届网络工程毕业设计 + +# 论文撰写规范(应用开发类) + +中文摘要 (3-5 个关键词) + +# 英文摘要 + +# 目录 + +# 第1章绪论 + +1.1 课题来源及意义 + +1.2 课题研究现状 + +1.3当前存在的问题 + +1.4 课题研究目标 + +# 第2章主要技术和框架 + +2.1 主要技术 (开发系统或平台所需相关技术的介绍) + +# 2.2 框架和开发模式(开发系统或平台所使用的框架和开发模式的介绍) + +# 第3章XXXXX的系统分析 + +# 3.1需求分析(包括功能需求分析和性能需求分析) + +3.2可行性分析(包括技术可行性、操作可行性、经济可行性,社会可行性等) + +3.3 用例图(根据系统角色划分用例图,若有两个角色就有两个用例图) + +3.3.1 用户用例图(需先对用例图进行描述,其实也就是对该系统的用户角色进行权限分析,再画出具体用户用例图,用例图如下所示) + +![image](https://cdn-mineru.openxlab.org.cn/result/2026-01-30/cb195f07-5e0a-4b42-8211-f649b1c1b2df/fedda2aecd9c17cf7f678bd9dfce3c4005225a98e76f2b3c551c72ab00f31ab0.jpg) + + + +图3.1用户用例图 + + +3.3.2 管理员用例图(需先对用例图进行描述,其实也就是对该系统的用户角色进行权限分析,再画出具体用户用例图,用例图如下所示) + +![image](https://cdn-mineru.openxlab.org.cn/result/2026-01-30/cb195f07-5e0a-4b42-8211-f649b1c1b2df/85b57ee2a2135507c52a9eaab015e3bbf5218d259fefa8256bf6efc10fa0b42a.jpg) + + + +图3.2管理员用例图 + + +3.4 用例描述(用例描述是对用例图中用例的详细说明,它详细阐述了用例的功 + +能实现过程、输入输出、前置条件、后置条件以及可能的异常情况等,是对用例图 + +的补充和细化,使系统功能更加清晰具体。需分别对每个用例列举3个左右的用 + +例描述。) + +例:(1)用户管理地址用例描述如下表3.1所示。 + + +表 3.1 用户管理地址用例描述 + + +
用例名称:管理地址
执行者:用户
简要说明:用户对收货地址进行添加、修改、删除等管理操作
基本事件流: +1.用户登录平台,进入地址管理界面 +2.系统显示已有地址列表 +3.用户选择添加新地址,输入详细地址信息,验证通过后存储地址 +4.若修改地址,系统更新后提示成功,若删除地址,确认操作后数据库移除该地址记录
(2)用户查看商品用例描述如下表3.2所示。 +表3.2用户查看商品用例
用例名称:查看商品
执行者:用户
简要说明:用户分类浏览平台上的闲置商品
基本事件流: +1.用户登录平台,进入查看商品界面 +2.选择商品分类,如闲置书籍、衣服、手机等; +3.系统加载并显示该分类下的商品列表 +4.用户可点击具体商品,查看详细信息,如介绍、图片、价格等
+ +# 3.5 系统性能分析 + +# 第4章XXXXX的系统设计 + +4.1系统功能设计(先总体概述一段该系统的主要角色有哪几个,分别包含什么主 + +要功能,再给出功能结构图。) + +具体如图4.1和图4.2所示。 + +![image](https://cdn-mineru.openxlab.org.cn/result/2026-01-30/cb195f07-5e0a-4b42-8211-f649b1c1b2df/eac455914323329b18745df5545040771c017cdc8a0d678f5569589c30bf1f4e.jpg) + + + +图4.1用户功能结构图 + + +![image](https://cdn-mineru.openxlab.org.cn/result/2026-01-30/cb195f07-5e0a-4b42-8211-f649b1c1b2df/18177e942ba24fd2a163cebfaf31c07e24ad1f0c3c3bb57deb63dff73bc44a22.jpg) + + + +图4.2管理员功能结构图 + + +4.2 类图(根据给定的初步类图,详细描述每个类的属性、方法以及类之间的具体关系。) + +![image](https://cdn-mineru.openxlab.org.cn/result/2026-01-30/cb195f07-5e0a-4b42-8211-f649b1c1b2df/e677faab545e5c9b75f847b7d786df1e0c2e764b6475056e4ed0f2b769dcf25f.jpg) + + + +图4.3系统类图 + + +4.3 序列图(展示了对象之间随时间顺序发生的消息传递,通常用于描述用例的实现过程或系统中某个功能的动态行为。至少需列举系统角色各一个序列图,在给出序列图之前还需将过程的详细步骤写出。如:用户登录序列图、管理员删除账号序列图。) + +![image](https://cdn-mineru.openxlab.org.cn/result/2026-01-30/cb195f07-5e0a-4b42-8211-f649b1c1b2df/b707fad3bc4d4d52a6b9da497d9bfdc7c365eac728f93991ea0c2488b2ccb653.jpg) + + + +图4.4用户购买商品功能序列图 + + +4.4 活动图(活动图可以清晰地描述系统的动态行为和工作流程。例如,在描述一个在线购物系统的订单处理流程时,可以通过活动图展示从用户下单到订单完成的各个步骤。论文中至少需描述各个角色各一个活动的活动图,如用户更新个人信息活动图,管理员删除用户信息活动图。) + +# 4.4.1 用户填写个人信息活动图 + +用户填写个人信息过程可分为以下几步: + +(1) 用户输入验证账号密码。 + +(2) 数据库查询用户数据,并判断用户是否存在。 + +(3) 登录成功后,用户填写个人信息并提交。 + +(4) 系统接收提交的个人信息后,将其发送至数据库进行更新保存。 + +(5) 用户确认信息更新无误后,更新界面。 + +用户填写个人信息活动图如下图4.7所示。 + +![image](https://cdn-mineru.openxlab.org.cn/result/2026-01-30/cb195f07-5e0a-4b42-8211-f649b1c1b2df/1167b27131dd2f56dcf570a6d1f2ad3888a8cb31390877f532d47161d49aaabc.jpg) + + + +图4.7 用户填写个人信息活动图 + + +# 4.5 数据库设计 + +撰写说明: + +本章是重点章节,很多同学搞不清概念设计、逻辑设计和物理设计的关系,请参见另外一个文档《2026届网络工程毕业论文第4章-数据库设计撰写规范(应用开发类补充说明).docx》: + +4.5.1 概念设计(概念设计包括两部分:实体属性图(不少于8个实体,每个实体 + +标明属性图的主码)和总体E-R图) + +# (1) 管理员实体 + +管理员实体属性图如图4.9所示。 + +![image](https://cdn-mineru.openxlab.org.cn/result/2026-01-30/cb195f07-5e0a-4b42-8211-f649b1c1b2df/f0139dd7d92cc9b47066ec9de102f1667c1ce1e48206094d7a2bdef274205425.jpg) + + + +图4.9管理员实体属性图 + + +# (2)用户实体 + +用户实体属性图如图4.10所示。 + +![image](https://cdn-mineru.openxlab.org.cn/result/2026-01-30/cb195f07-5e0a-4b42-8211-f649b1c1b2df/6d6a6cb8e810b97076d80cd79891215ff2119fc737339c35edd15ad884bba839.jpg) + + + +图4.10用户实体属性图 + + +![image](https://cdn-mineru.openxlab.org.cn/result/2026-01-30/cb195f07-5e0a-4b42-8211-f649b1c1b2df/0f95a66d6d06fcc3c2727444cdea2f4793ac489748efa04d7bfa75c3578d1d9c.jpg) + + + +图4.系统E-R图(标明各个实体之间的关联) + + +4.5.2 逻辑设计(将E-R图中的实体关系转换为逻辑结构设计,即关系模式。 + +其中,一个实体转换为 1 个单独的关系模式。 + +实体间联系有3种,1:1,1:n,n:m。 + +1:n 联系要将 1 端实体如用户的主码加入到 n 端如评论实体的关系模式中。 + +n:m 联系要将联系如上图中的购买转换成一个单独的关系模式,并将两端的主 + +码放入该关系模式作为属性。)关系模式中需标明主外码 + +上图转换为逻辑结构如下所示: + +(1) 用户表:(用户 id, 用户账号, 密码, 用户姓名, 性别, 联系电话, 头像, 积分,余额) + +(2) 管理员表: (管理员 id, 创建时间, 管理员名称, 密码, 管理员类型) + +(3) 收货地址表:(收货地址id,用户id,地址,收货人,电话,是否为默认地址) + +(4) 购物车表:(购物车id,商品表名,商品,商品名称,图片,购买数量,单价,会员价,商品类型) + +(5) 订单表:(订单id,订单编号,用户id,规格,上架时间,商品详情,团购价,拼团人数) + +(6) 团购商品表:(团购商品id,购买数量,价格,折扣价,总价,商品类型id,支付类型,物流,购物车id) + +(7) 商品类型表:(商品类型 id,创建时间,类型数量) + +(8) 评论表:(评论id,用户id,头像,用户名,评论内容,回复内容) + +(9) 公告表:(公告id,创建时间,标题,简介,图片,内容,管理员id) + +(10) 购买表:(用户 id,团购商品 id,购买日期,购买时间)(购买表的外键为: + +用户id,团购商品id) + +4.5.3 物理设计(将上述关系模式转换为一个个物理表结构,一个关系模式转换为一个物理表,至少包含8张物理表) + +如:(1)系统根据MySQL数据库数据存储的特性设计数据库关系表: + + +表 4.1 管理员表 (admin 表) + + +
字段名称字段意义数据类型长度完整性约束
admin_id管理员 idint10主键
admin_name管理员姓名varchar10非空
admin_password管理员密码varchar20非空
admin_email管理员邮箱varchar20非空
admin_phone管理员手机号varchar11非空
+ + +表 4.2 用户表 (user 表) + + +
字段名称字段意义数据类型长度完整性约束
user_id用户idint10主键
user_name用户昵称varchar10非空
user_password用户密码varchar20非空
user/mobile用户电话varchar11非空
user_realname用户真实姓名varchar10非空
user_score信誉分int4非空
+ + +表4.3商品表 (product表) + + +
字段名称字段意义数据类型长度完整性约束
product_id商品idint10主键
product_name商品名称varchar10非空
product_title商品概要varchar50非空
product_intro商品详情varchar100非空
+ +4.6图形界面设计(实现某一个具体功能的界面设计,至少系统中各角色各列举1 + +# 个功能界面设计) + +如:删除购物车界面设计 + +![image](https://cdn-mineru.openxlab.org.cn/result/2026-01-30/cb195f07-5e0a-4b42-8211-f649b1c1b2df/5f2eaca38a994385483bc816a9956ee51e2a41baf561d9e08f613b9938c1de46.jpg) + + + +图4. 删除购物车界面设计图 + + +# 第5章XXXXX的系统实现 + +只写出主要功能的实现结果即可,并给出运行截图(不写用户注册、登录), + +运行截图中需输入数据的地方要有数据输入,且输入的数据必须真实,不可输入 + +类似 1111 类数据。可按系统角色进行实现,再进行角色详细功能实现。如: + +# 5.1 用户功能模块 + +# 5.1.1 购物车 + +# 5.1.2 我的订单 + +·· + +# 5.2 管理员功能模块 + +# 5.2.1 账号管理 + +# 5.2.2 订单管理 + +·· + +# 第6章XXXXX的系统测试 + +# 6.1 系统测试概述 + +6.1.1 测试的背景 + +6.1.2 测试的意义 + +6.1.3 测试的环境 + +# 6.2 系统测试用例设计 + +6.2.1XXXX功能测试 + +6.2.2XXXX功能测试 + +6.2.3XXXX功能测试 + +6.2.4 安全性测试 + +6.2.5 兼容性测试 + +# 第7章结论 + +参考文献 + +致谢 + +附录 \ No newline at end of file diff --git a/AGENTS.md b/AGENTS.md new file mode 100644 index 0000000..789f6a7 --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,43 @@ +# Repository Guidelines + +## Project Structure & Module Organization +- `backend/` is a Spring Boot 2.7 (Java 17) service with MyBatis-Plus and JWT security. + - Main code: `backend/src/main/java/com/gpf/pethospital` + - Config: `backend/src/main/resources/application.yml` and `application-dev.yml` +- `frontend/` is a Vue 3 + Vite app with Pinia and TDesign. + - Source: `frontend/src/` (pages, router, store, layouts, styles) + - Static assets: `frontend/src/assets/` +- `docs/` and `*.drawio` contain documentation and UML/ER diagrams. +- `frp/` and `start_frp.sh` include FRP configuration/scripts. + +## Build, Test, and Development Commands +Backend (from `backend/`): +- `mvn spring-boot:run` — run the API locally. +- `mvn clean package` — build a runnable jar. +- `mvn test` — run Spring Boot tests (if present). + +Frontend (from `frontend/`): +- `npm install` — install dependencies. +- `npm run dev` — start Vite dev server. +- `npm run build` — production build. +- `npm run preview` — preview the production build. + +## Coding Style & Naming Conventions +- Java: 4-space indentation, standard Spring Boot conventions, packages under `com.gpf.pethospital`. +- Vue/TypeScript: ES module syntax, semicolons used; follow existing file structure. +- Use descriptive, domain-specific names (e.g., `AppointmentController`, `appointmentService`). + +## Testing Guidelines +- No dedicated test directories are present yet. +- Backend tests should go in `backend/src/test/java` using Spring Boot Test. +- Frontend has no test runner configured; if adding, include a script in `frontend/package.json`. + +## Commit & Pull Request Guidelines +- Current commit history uses short Chinese descriptions like “添加…” and “将…更改为…”. +- Keep messages short, imperative, and meaningful; avoid placeholder commits like “1”. +- PRs should include: a clear summary, testing performed (or “not run”), and screenshots for UI changes. + +## Configuration & Security Notes +- `application-dev.yml` contains local MySQL defaults (user `root`, password `password`). + Update credentials via environment or local overrides; do not commit real secrets. +- JWT secrets are currently hardcoded in config; rotate for real deployments. diff --git a/admin_activity_diagram.drawio b/admin_activity_diagram.drawio new file mode 100644 index 0000000..ad7d3b5 --- /dev/null +++ b/admin_activity_diagram.drawio @@ -0,0 +1,195 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/admin_entity.drawio b/admin_entity.drawio new file mode 100644 index 0000000..a1a0fd0 --- /dev/null +++ b/admin_entity.drawio @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/admin_function_structure.drawio b/admin_function_structure.drawio new file mode 100644 index 0000000..b7999ef --- /dev/null +++ b/admin_function_structure.drawio @@ -0,0 +1,107 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/admin_sequence_diagram.drawio b/admin_sequence_diagram.drawio new file mode 100644 index 0000000..4f5669a --- /dev/null +++ b/admin_sequence_diagram.drawio @@ -0,0 +1,152 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/admin_use_case.drawio b/admin_use_case.drawio new file mode 100644 index 0000000..b1f1660 --- /dev/null +++ b/admin_use_case.drawio @@ -0,0 +1,68 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/backend/src/main/java/com/gpf/pethospital/controller/AppointmentController.java b/backend/src/main/java/com/gpf/pethospital/controller/AppointmentController.java index b0ec840..19f7490 100644 --- a/backend/src/main/java/com/gpf/pethospital/controller/AppointmentController.java +++ b/backend/src/main/java/com/gpf/pethospital/controller/AppointmentController.java @@ -26,6 +26,8 @@ public class AppointmentController { AuthUser user = SecurityUtils.currentUser(); if (user != null && "CUSTOMER".equals(user.getRole())) { appointment.setCustomerId(user.getId()); + } else if (appointment.getCustomerId() == null) { + return ApiResponse.error(400, "customerId required"); } if (appointment.getStatus() == null) { appointment.setStatus("PENDING"); diff --git a/backend/src/main/java/com/gpf/pethospital/controller/NoticeController.java b/backend/src/main/java/com/gpf/pethospital/controller/NoticeController.java index 78ae7f2..1105733 100644 --- a/backend/src/main/java/com/gpf/pethospital/controller/NoticeController.java +++ b/backend/src/main/java/com/gpf/pethospital/controller/NoticeController.java @@ -4,7 +4,9 @@ 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.security.AuthUser; import com.gpf.pethospital.service.NoticeService; +import com.gpf.pethospital.util.SecurityUtils; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.web.bind.annotation.*; @@ -42,6 +44,15 @@ public class NoticeController { @PreAuthorize("hasRole('ADMIN')") @PostMapping("/notices") public ApiResponse create(@RequestBody Notice notice) { + if (notice.getPublisherId() == null) { + AuthUser user = SecurityUtils.currentUser(); + if (user != null) { + notice.setPublisherId(user.getId()); + } + } + if (notice.getPublisherId() == null) { + return ApiResponse.error(400, "publisherId required"); + } if (notice.getStatus() == null) { notice.setStatus(1); } diff --git a/backend/src/main/java/com/gpf/pethospital/controller/PetController.java b/backend/src/main/java/com/gpf/pethospital/controller/PetController.java index ec190bc..46a9da0 100644 --- a/backend/src/main/java/com/gpf/pethospital/controller/PetController.java +++ b/backend/src/main/java/com/gpf/pethospital/controller/PetController.java @@ -38,6 +38,8 @@ public class PetController { AuthUser user = SecurityUtils.currentUser(); if (user != null && "CUSTOMER".equals(user.getRole())) { pet.setOwnerId(user.getId()); + } else if (pet.getOwnerId() == null) { + return ApiResponse.error(400, "ownerId required"); } petService.save(pet); return ApiResponse.success("created", 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 index 4ebe2ad..dd63d59 100644 --- a/backend/src/main/java/com/gpf/pethospital/controller/StatsController.java +++ b/backend/src/main/java/com/gpf/pethospital/controller/StatsController.java @@ -55,8 +55,11 @@ public class StatsController { 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()); + if (!result.isEmpty()) { + Map row = result.get(0); + if (row != null && row.get("total") != null) { + total = new BigDecimal(row.get("total").toString()); + } } data.put("orderAmountTotal", total); return ApiResponse.success(data); diff --git a/backend/src/main/java/com/gpf/pethospital/entity/PrescriptionItem.java b/backend/src/main/java/com/gpf/pethospital/entity/PrescriptionItem.java index 9cf5d7c..7919e67 100644 --- a/backend/src/main/java/com/gpf/pethospital/entity/PrescriptionItem.java +++ b/backend/src/main/java/com/gpf/pethospital/entity/PrescriptionItem.java @@ -46,7 +46,8 @@ public class PrescriptionItem { /** * 用法用量 */ - private String usage; + @TableField("usage_desc") + private String usageDesc; /** * 用药天数 diff --git a/backend/src/main/resources/application-dev.yml b/backend/src/main/resources/application-dev.yml index e219fda..7d3db33 100644 --- a/backend/src/main/resources/application-dev.yml +++ b/backend/src/main/resources/application-dev.yml @@ -9,9 +9,9 @@ spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver - url: jdbc:mysql://localhost:3306/pet_hospital_dev?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2B8 + url: jdbc:mysql://localhost:3307/pet_hospital_dev?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2B8 username: root - password: password + password: qq5211314 hikari: maximum-pool-size: 20 minimum-idle: 10 @@ -30,7 +30,7 @@ spring: sql: init: - mode: always + mode: never schema-locations: classpath*:schema.sql data-locations: classpath*:data.sql diff --git a/backend/src/main/resources/schema.sql b/backend/src/main/resources/schema.sql index 22298e9..622e153 100644 --- a/backend/src/main/resources/schema.sql +++ b/backend/src/main/resources/schema.sql @@ -58,7 +58,13 @@ CREATE TABLE IF NOT EXISTS prescription_item ( id BIGINT AUTO_INCREMENT PRIMARY KEY, prescription_id BIGINT NOT NULL, drug_id BIGINT NOT NULL, + drug_name VARCHAR(100), + specification VARCHAR(100), quantity INT NOT NULL, + usage_desc VARCHAR(200), + days INT, + unit_price DECIMAL(10,2), + subtotal DECIMAL(10,2), dosage VARCHAR(100), frequency VARCHAR(50), duration VARCHAR(50), @@ -92,6 +98,12 @@ CREATE TABLE IF NOT EXISTS drug ( specification VARCHAR(100), unit_price DECIMAL(10,2), stock_quantity INT DEFAULT 0, + stock INT DEFAULT 0, + alert_threshold INT, + purchase_price DECIMAL(10,2), + sale_price DECIMAL(10,2), + approval_number VARCHAR(100), + expiry_date TIMESTAMP NULL, unit VARCHAR(20), status INT DEFAULT 1, create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP, @@ -150,6 +162,14 @@ CREATE TABLE IF NOT EXISTS `user` ( CREATE TABLE IF NOT EXISTS medical_record ( id BIGINT AUTO_INCREMENT PRIMARY KEY, visit_id BIGINT NOT NULL, + chief_complaint TEXT, + present_illness TEXT, + physical_examination TEXT, + examination_results TEXT, + diagnosis TEXT, + treatment_plan TEXT, + advice TEXT, + status VARCHAR(20), record_type VARCHAR(50), -- CHECKUP体检, DIAGNOSIS诊断, TREATMENT治疗 content TEXT, attachment_urls TEXT, @@ -162,11 +182,18 @@ CREATE TABLE IF NOT EXISTS medical_record ( -- 检查并创建message表 CREATE TABLE IF NOT EXISTS message ( id BIGINT AUTO_INCREMENT PRIMARY KEY, + user_id BIGINT, + user_name VARCHAR(100), + contact VARCHAR(100), + title VARCHAR(200), 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已读 + reply TEXT, + reply_time TIMESTAMP NULL, + reply_user_id BIGINT, create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP, update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, deleted INT DEFAULT 0 @@ -177,6 +204,7 @@ CREATE TABLE IF NOT EXISTS notice ( id BIGINT AUTO_INCREMENT PRIMARY KEY, title VARCHAR(200) NOT NULL, content TEXT NOT NULL, + is_top INT DEFAULT 0, publisher_id BIGINT NOT NULL, publish_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP, status INT DEFAULT 1, @@ -188,6 +216,13 @@ CREATE TABLE IF NOT EXISTS notice ( -- 检查并创建report表 CREATE TABLE IF NOT EXISTS report ( id BIGINT AUTO_INCREMENT PRIMARY KEY, + visit_id BIGINT, + pet_id BIGINT, + type VARCHAR(50), + title VARCHAR(200), + summary TEXT, + attachment_url VARCHAR(255), + doctor_id BIGINT, report_type VARCHAR(50) NOT NULL, -- REVENUE收入, CUSTOMER客户, PET宠物, DRUG药品 report_data JSON, period_start DATE, @@ -206,6 +241,7 @@ CREATE TABLE IF NOT EXISTS stock_in ( unit_price DECIMAL(10,2), supplier VARCHAR(100), operator_id BIGINT, + stock_in_time TIMESTAMP NULL, remark TEXT, create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP, update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, @@ -216,10 +252,12 @@ CREATE TABLE IF NOT EXISTS stock_in ( CREATE TABLE IF NOT EXISTS stock_out ( id BIGINT AUTO_INCREMENT PRIMARY KEY, drug_id BIGINT NOT NULL, + prescription_id BIGINT, quantity INT NOT NULL, unit_price DECIMAL(10,2), purpose VARCHAR(100), -- 用途:销售、损耗等 operator_id BIGINT, + stock_out_time TIMESTAMP NULL, remark TEXT, create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP, update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, @@ -230,6 +268,10 @@ CREATE TABLE IF NOT EXISTS stock_out ( CREATE TABLE IF NOT EXISTS vaccine_record ( id BIGINT AUTO_INCREMENT PRIMARY KEY, pet_id BIGINT NOT NULL, + type VARCHAR(20), -- VACCINE疫苗, DEWORMING驱虫 + item_name VARCHAR(100), + execute_date DATE, + next_reminder_date DATE, vaccine_name VARCHAR(100) NOT NULL, dose_number INT, injection_date DATE, @@ -239,4 +281,4 @@ CREATE TABLE IF NOT EXISTS vaccine_record ( 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 index 366ffe9..7d3db33 100644 --- a/backend/target/classes/application-dev.yml +++ b/backend/target/classes/application-dev.yml @@ -8,33 +8,30 @@ spring: 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 + driver-class-name: com.mysql.cj.jdbc.Driver + url: jdbc:mysql://localhost:3307/pet_hospital_dev?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2B8 + username: root + password: qq5211314 hikari: - maximum-pool-size: 10 - minimum-idle: 5 + maximum-pool-size: 20 + minimum-idle: 10 connection-timeout: 30000 + idle-timeout: 600000 + max-lifetime: 1800000 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 + ddl-auto: update show-sql: true sql: init: - mode: always - schema-locations: classpath*:schema-h2.sql + mode: never + schema-locations: classpath*:schema.sql data-locations: classpath*:data.sql mybatis-plus: diff --git a/backend/target/classes/application.yml b/backend/target/classes/application.yml index b83f286..0001a01 100644 --- a/backend/target/classes/application.yml +++ b/backend/target/classes/application.yml @@ -25,6 +25,10 @@ mybatis-plus: logic-not-delete-value: 0 mapper-locations: classpath*:mapper/**/*.xml +# 数据库配置 +database: + type: mysql + # JWT配置 jwt: secret: pet-hospital-secret-key-2024-guanpengfei-graduate-design diff --git a/backend/target/classes/com/gpf/pethospital/controller/AppointmentController.class b/backend/target/classes/com/gpf/pethospital/controller/AppointmentController.class index 2f5d222ba2b56f025a5d0d08e95b4e703724a017..193a128c688a923bac5c119c5f6095523a499193 100644 GIT binary patch delta 2213 zcma)6X>?OX7`-n`v-G9V*NuSImePfWQueYnl!gN728d7!B32rq0xcx1h@w#ucUc@2 zK}1jyacu=cp@^cg$R;X^8!C#5iW@4TqQ^TgO~Kk)q5HO^>wp+es8rExeDT@w#`%gzBvsweqXg6J<-d8-YWW_ zuZS@uiDXrCC@}l{{yM*c{4B3H<`|S?M+Wj#^hZYpHd2qRuc~hdSTRt6Wpq*bFmL$? zxn;1*7~G=CP!>~wp%xUX@E}D&cM)rd7b(WHgd!f8>i1REhwmPtVkErc7UN`7iGrbG zkvUn+Ge?UUQ%6TJj2cCis~CmRqOWPBwHOzx7>i59LQ|n>yn=z;?-a*PX&uL5f(kP# z8F^N5ao6$DD8M8YmtwL=HLp~AVv4-zas`94#A;K#IBIs4U!h_usu@pBpm1hY?FVwnK%tl2ZmeD%}os!M8Wb*ej6+$A zA4^m$70K32+bGF#pNjiMxwV^lnSu=IMS2&xyj;Z!nOn7$+B35%!1QLxcMq#rCH7d; zlt;x$Yo_wJh_|I#*Wd|h___^4Y-6l3U)%8wzO~?_itq5fSQWd&x~!cUuJ$-3=4d10 z`jOdNTkG@dyuN@1zlnWXw&`~T$>N}vERy0no1cUM>xDb6Q}8LKJqAYp$HRmK*pP^) zIZNaYz>a6|EJul=p)z035t|iGz{&GyWMJ!ww{yEB8Qly=S+`y2q{Vd$At8iL%hAq7 zm>NQQ#X7{fLU8Sd8mlbPx;LXou#pS>cEj${281xEB6}k&t}Pg1K!r9;X~ytIk{ThS z%wTLlM@HF+v0i`_T!>60qX$tQQsG7#yy&7wpArtHE&9=D!V3)8gi>t4Mh3fyTy_}8 zpGArViR~N_VNF~Q@iAaCnmI=C)E16g`B)TAS_l+u!;7uT55dA8P(tMc%`GUd+>BDO zG`>Ty3~-utBGP%r+F7TNE@nF zpuIC{D|}&B{+}fptpT%Z`XGeG? zVuuyVS)@h0a2VUX*w4GewQx}PBZ*b<1_d7q;7#n5U=ox7-qH=~Y&_?RZcvbOnk5~Q zzP&vWhdI21cU#R`OEz6y3o=+USC;3n6{c0>uvrFGXjgGy??mS`V`d0`y?}DI;A+_z z^Zwl!$$I?_g%yQNw1>?xjIB`=L^?*WfJW+$Ww$yR>E}Eg!F!BHx+`rm@OUoXXO|fD z8qrNjx3KGE$Fo3=a5!hk2mdwXL$ZYp`A9dU(jiOcD33`4(B6)Z@d+^tMd{C5lamM_0h;eBP#o45c;H}oxSj^*h zXm^LOXgL-TFV^nW@myk|J)q+m#1Co@>39n9O6?IHkJU@Dkt>p^h+~9l0C9vVhd9EN zN*rNIDBxtJwpypMZ3TP1u?1@?wZ}GNt?Z-lH%op!fOdKYWFJy7KE*MPo5ZmW&as~n z8SuGorbcv}^DnqB?BkdCit}WypJ2`WfFJP_er6SgXTP-0e&rrJ&z!~?`~l}bGKtq3 delta 2147 zcmZvcd0bRg6vuyW9y4#@0s2OU%>@Ju7zfD>B?pBOblB1;5zTCrNlX@HhRn*QvduQD zYYS$jmRpNy+OWA~nU>~OwwKv%*`k$wK7G<%HpQ_6s?L;%X%U423fM7oCOfXh z$EYZPsFMpt8j3NFbwrGp3*gpJf>NfM3x#r4ZXTUjhRZdWF+qSiqogErQY41q3JsOG zlC3c>mq%d|Kc|Y7SX>jUHB7-&@?^HJu+GykM}U}-IYoznA|8dvf73Nwi!8F{^ZMO2 zGGG+^b|+DJ)?pWxK_PM>IUjQWP7>$22_7oJy*&jCqtx zgyn3pk{a29XE^$21;ny>Vz15nlsq~5D-~bk8wuZP_zvGQtG+XKNsJjka<)HdSctS9 z_*uXxc1q1;vNg$O7ofQt8oW)eI*-ri^+`CzovF~%MG1c}kJV*f0TWiT_12`oD$0jw zi1hD;2*g5x4bM@}Mk@dn&to;UTtz~odtF1?EKmp3S&Mb#?n=_DXgN3HY(rG}z}<+~ ztpkII4I-%pnw?}y5b0I+Anbdf+V$)pa;mbnKnmE~G1P=AeWcKa%Qlh)k!%5dA<;jP zTuLIxdZQ1Gq@f?|NWpOQH(X2(o!IT76YKE;c@=??co8p=M=z5N1*S9TBf%CG_I*8# zZlKSER}kPwT4>WIYG0*K5~#D8gn%u0tt+}if_XQRb!&n- z9H}+I(t)u6AEAK98zFY0th!%HD=HE!?U*Ryb(FQ?Dt>MRRt2cB(J4R%{WIw*vXD$s z=D=aZIMkRc?T)dO>M%&YkuPW^CDMGc5v`f_I?;x93a5kS`DKMhI%$NHh=gz!IYdID zhk)OsVnU#j+E)5PK(->xV;hZe9&skJvz@*jKJvU4Y(VdhLYHkrE>h`Ac~*vSi%Tug=F!(IbWfAJiZ3jlF! z`=;PsYWCwm7pv7|j0cz7i2>EE0ZglKP+444<)9+TsnR{vP|ZX-+AuSS*+vFA+ELGI zWbVakWHe-qp_?wCIw_<&aUmT=lt0A=u&mHo-N15j5QoSgI^Vz)FwyowI822j8cAYM zNtftt>B^9UwDug3_x=y$eKHpUa>M`<#WUsu+QpLvJyd*%k4RIV2qWka{!09n6+}~+ z$!QOoFrQV&C&k=sL~RwFYY}bNZ()n#2Lx`FS6~UPyj{ODh`U>`i1a=BeTJS-`hNW( zL(d`ou+9uUo%B-u2}4&JS+|i!xTPX$!NR!Z8h*A^(f%|W`=|VoG852G; yQ0k;Ur~VhTH$?F$zNCI%I7~Q3Ir9UK;{<-8EDH60?dttTi&WZl62Ie5B>V@+gt%Y; diff --git a/backend/target/classes/com/gpf/pethospital/controller/NoticeController.class b/backend/target/classes/com/gpf/pethospital/controller/NoticeController.class index 682632788b4a773898164a55e2ef9a44f9b530f7..88b1dcac9fe00ea6a3cd252a363c57f62fbf96ec 100644 GIT binary patch delta 2430 zcmaJ>30PEB6#nllym98u0MC&nln_&aK~ekENGTO82XG4s#au>s!RW9!i$rEqnUyVS zy~?ayD$UF#+(yK5sa(r!v(hrNtZcKg)lBW&H}gRB%MaeXbIv{YKmR%Rzwcf%&T}5z#Q$||jQhkw}tbqZ4C0`*h zC-Maph$zHBhR(`Fy}j=xX$(dp<}5cO8^c5l#|Q?S?;@(bl_Qp}%1NVbfC)D-*lSz* zNb$;318%QO06j2DL@{nANZISHA#OQo&I?*B@_XIN0MTI~YS|bqVhl=^Rfe>vTSSb* zc;&F6AZnrr7bYnVW5;$hBB9JHyZmA7TSZ)r3dLnC?(Y^cne#LfPiMIW8Ssdx!XyTB zpthVg461jQn@~dlVPDOeD#8n&k`d)d2+&Ho?2%RII@~6pUc~K~u2e;hw9LSr0)is$ z!rjW=s4myfWU$hRa#bp$+*Ps}GcZfUeY{{4b?@@{Oc-OrYz7mbrEgSCtr>NANW{a0 z(Orl$)nSf^xm2J~NHILh&{yfHOH?KpjLICLgKZYieq6*8n9h)*3>V^*146W=4o`_# zz+;`&*m=QTUWaEzEaWkfm#V7u;<_rw ztnFeiQPTQ)>ukO4M>BrHNdZ5L_yxZzF|j*MB{BGeT2ABJlr^>(MJFXYPIC?XBVsm6 zqmB5NduK(=Cm<`$bsU>0}^4y6-c7L zE@+SL=%4~-5IpEgX@E|2!$!j3u@G5$%1pv0G!n*Uit=LNNE1bP*)}@b0!jw9(4)hv zc#YmRO5BPb4BN(n`LG>3C>XD!=n;lrCP=1wwqVYf=Ui#=85q@ySXq+ZZ| zlV(9rM59*_3FwV0(FbX`hL*DFw;z42`!^56LaO-yAF8s;ZyrlN4&oys{xJa>p-+g8 z*3RM}MZ#zCiFy{TW^(AFnFv9CDu-zc!>9NxGK2Av86;#p?l;~x}P`GJ*pm|m8&pZz<#n7=}FbzLH2yM~4yLon6flEXt>*S;;H3Z4 z^u;vb8(P)jTUAW_z)z6>9X;RElS$w|kjPKrH~fx2@mIwAyOnn);+>-%W-5K2F{alc F@jst8GFkut delta 2056 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 Je!&U&{su^DmvaCB diff --git a/backend/target/classes/com/gpf/pethospital/controller/StatsController.class b/backend/target/classes/com/gpf/pethospital/controller/StatsController.class index 9467636a4870ea0f767c60157c30efec7ff7760c..9d977f7212100c072e7b68ba61ec921192905a5a 100644 GIT binary patch delta 494 zcmX|+%}Z2K7{-5R?p%-F5$854I8cHhp#ySPZc;>D!s>2t) zYHsCom0p)MMRkQKQ^n>=Uc@xJp4u>%+(dX&QED!`rKwq0tGsz~uCj(m zh8V*;WXJ7E%Hwvddx#4mCMg-AwK;B^kywS*h-)&js@?%=L|n_XgwIgV1`XU6++l%^ zagcl5#}4p}60DfZI^!}^^wGwIP($3{I1hM;#Z8XTLpx!nM4OPh%Sa1j*O}gPJ_?*o zS?go5J`qC+>Yt>rHMts3b3$`Q(<(nt<%W31bE#2zO$+8ll9$YY>oCilxm!5uzv8tB z0#pIvzwFnvD5vNTO_JnI7V$QVhza7I^z#9x1(jrhMd@AX-%HjEpZUgj+4YA^9hv^* I7r%-B2Y;}BuK)l5 delta 459 zcmYL^yHAr*7{-66Eu8X|w4W7%CWc^GfTZ~rSZHL|Xjm}}=1VjI(-@M1;spNyVK~8o ziHU`Qm`)Xo1}Rj$U$_YA$?tui&Z>nMBAv@4F9Or>(U)=G<~yqKQ7m1B zLs3&R1NmY5W>TM`+MI&;o~day-1}gWMr` zeH6^6IG_0fw#8Q_&C|K_r zUCl(W>}?@|s|046WiNY|_M)1a>93}l`nPE&`|i0H_Reyf*#E%!)({mv_Bjn*XGXk{V{<@ zh2FAGkF8IyU~I27wmrk|sPOmo+}azN)f5Ca^!3CxC3@mpJR!;QBs#Rgti4*)JKz6> z2VdeVH@^0w4`;QF-qX%+1Y=s0uhXgLrw#hnIKLNEX~W*CbT_62WrSr~tG^>hu$e_= zL2xI3clF|K?SQ{-@jWpNU<({*z{Tv>V|-?e8oHN53s7nfrSo|oLoVRc1-*5@76^m~ z9$=r|(#a3T+H38HA$V~Oke)Z<(=N8lbKa3Dbr*^-yol6@BPfRZe*WiPd5 z2Q6$xF100Jk5wE^&O0=Re4#CSwZYa}f>wvBZDX&*3Y#|-CBNw+TXMT?nq?NU;ZUP3 zd!_BGD=ci~&_Y}C8g$s?9Z4paHruk-8fMqQc43|VCT%p^>gICW*lr^> zX}#4aXVqp)zSh={Mhn?+bCoUo5j@H@tuL7PvUTuo{QWgzZMFUFoaYIz|g$kMz-v3`#IaYxjC9n-o=#^@np@KOZ zz}&L(5Kfeprv$be0?Ah8r(9LxjAl&ts!)mUz)n4@WYMCOMN8CfXZl~FG@mpp?Z{2V zs`8nv^rXs_fMz76jpwFfRi!n9N+qxhyX~rqq+HcJR2%jytL7=ur|d=Nrz~1CBdS+g zqcr#6X|*U0<)va(ojP<(uj`b+UQX2!w}uhlixAS6VQQ(Ok+R$(oiGk@C=a?%ViSJ61mVO zhjD-?9qUEIb3|@zl5KdNC<8m?4!l5=i9OPT7cn#d4<=*rzQL+4nV!T0Af=TVK z!u610uhyL_R(w3Scr`TDmpO{gHXC7%jhXb@Ik-T)dW2P?Y<$k&Ieg2Ohv+*ljUQ3?AA+ih0RR91 delta 2790 zcma)8Yfw~W7=GS`-GzmPg^lHo7$nYa$ly4ZVZrD`Sx}8lI?Na&V;fYC&ItIUiyPge zOzn7yrL=olRN^9vnPys+-3z-&)6~?DrfJ6CO*7eZzO%a=w$Fhd=bY!eJkR%j&--1@ zj-?YzJg5IXd=$Wy_-WV^5|^{LyQ4E4YZP&0W^{&oZc)Y7w7(p&8(gzk*PW=lJ0r(Y z?CI&cqq|yh1X=5Qy22Z*Qf#lsFK(ArFivF+xSSh1*7k;t_UvHJmmYkDuif}28$I~e z*qMDY{fuD9X!mv)C%miV2ct44C})l9b2bT#iJaQVym$d^B~yBh`s#Y!$&nm z*t7uU@g^6)_p{3^ew{E&eJs`SEBrcx2O+}*4m`lO*=(vk$al8Y0T1C}mIMu0%y%Cm zcJ>I|``Bt{`?c&ParRWQHt+OVQ=@9qlGorijUOQ!*>ba4%kI>&>uhZ0W{Z}5qc#=uQ_1Dawd_am zC>M60u_wRC=8&~H0&D@?@y%hPEVW@CW37|BA3lclxFx`<26k73VCVq6!PEdQq?w!0 zjF_UiO0-`u>YK4>enQmL%vYLE;7N0)se$^FnpaFc8vZ}~0t7hW`0NXm=w?gQIOm^< zeZ_WxVkPhtw&OtF1==5Qgd4Stcx%%TCYT(v2tQ;2^1}!JPI$g(X8t-F0eoeG~#k|rm^1wK1b^I zmult__xA?zk{qE+@|50MLN#lZ7K zZfuavc!4Mb+hiSHB+A4t>B38hM&QAyEW^vJ%)${_idTrTF~LAyCGz4|slaPQIlRBm z<8`83ap7<5CGyE7IEy!k@+5?Dyh)TV*Wmz$i2QOB-oaZ$7s+~T#oI&$(u;o9MiG$h zxC@K+5f(}mVGI)$$rzfkpQu=lp$Rdf68RakF+x--zoV4mQIuiS2$t-=J?`rOeND$@ zmaklvi)fg6C^|#OkugMI|BJ9^%9-$)&J9vGdC&~1Ox?){d6UKFmG($#rs$)OnOYN9 zNR!n#h(qk|ly-~}IpC2t9Hwd-s-y|;5~brRT6ToUi8k@zJt7zX&d%W|k((=P9LI<< zXzCc=C(6W!%G)Xr^@;lX%i?@a^ZB$JpW$;hWU%lBpK*N0l85Mf J{D=t@{|Bpsb#?#% diff --git a/backend/target/classes/schema-h2.sql b/backend/target/classes/schema-h2.sql deleted file mode 100644 index 22298e9..0000000 --- a/backend/target/classes/schema-h2.sql +++ /dev/null @@ -1,242 +0,0 @@ --- 如果表不存在则创建表,如果存在则添加缺失的列 - --- 检查并创建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 index c28ec10..622e153 100644 --- a/backend/target/classes/schema.sql +++ b/backend/target/classes/schema.sql @@ -1,84 +1,70 @@ --- 用户表 -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 ( +-- 检查并创建appointment表或添加缺失列 +CREATE TABLE IF NOT EXISTS appointment ( 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, + customer_id BIGINT NOT NULL, + pet_id BIGINT NOT NULL, + doctor_id BIGINT, department VARCHAR(50), - title VARCHAR(50), - phone VARCHAR(20), - email VARCHAR(100), - avatar VARCHAR(255), - status INT DEFAULT 1, + 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, - customer_id BIGINT NOT NULL, symptoms TEXT, diagnosis TEXT, treatment_plan TEXT, - visit_date DATE, 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 NOT NULL, - doctor_id BIGINT NOT NULL, - customer_id BIGINT NOT NULL, + visit_id BIGINT, + doctor_id BIGINT, + customer_id BIGINT, total_amount DECIMAL(10,2), - status VARCHAR(20) DEFAULT 'ACTIVE', + 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, + drug_name VARCHAR(100), + specification VARCHAR(100), quantity INT NOT NULL, + usage_desc VARCHAR(200), + days INT, + unit_price DECIMAL(10,2), + subtotal DECIMAL(10,2), dosage VARCHAR(100), frequency VARCHAR(50), duration VARCHAR(50), @@ -88,23 +74,7 @@ CREATE TABLE IF NOT EXISTS prescription_item ( 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 -); - --- 订单表 +-- 检查并创建order_info表 CREATE TABLE IF NOT EXISTS order_info ( id BIGINT AUTO_INCREMENT PRIMARY KEY, visit_id BIGINT, @@ -119,25 +89,189 @@ CREATE TABLE IF NOT EXISTS order_info ( deleted INT DEFAULT 0 ); --- 预约表 -CREATE TABLE IF NOT EXISTS appointment ( +-- 检查并创建drug表 +CREATE TABLE IF NOT EXISTS drug ( 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', + name VARCHAR(100) NOT NULL, + category VARCHAR(50), + manufacturer VARCHAR(100), + specification VARCHAR(100), + unit_price DECIMAL(10,2), + stock_quantity INT DEFAULT 0, + stock INT DEFAULT 0, + alert_threshold INT, + purchase_price DECIMAL(10,2), + sale_price DECIMAL(10,2), + approval_number VARCHAR(100), + expiry_date TIMESTAMP NULL, + 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, + chief_complaint TEXT, + present_illness TEXT, + physical_examination TEXT, + examination_results TEXT, + diagnosis TEXT, + treatment_plan TEXT, + advice TEXT, + status VARCHAR(20), + 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, + user_id BIGINT, + user_name VARCHAR(100), + contact VARCHAR(100), + title VARCHAR(200), + 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已读 + reply TEXT, + reply_time TIMESTAMP NULL, + reply_user_id BIGINT, + 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, + is_top INT DEFAULT 0, + 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, + visit_id BIGINT, + pet_id BIGINT, + type VARCHAR(50), + title VARCHAR(200), + summary TEXT, + attachment_url VARCHAR(255), + doctor_id BIGINT, + 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, + stock_in_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 +); + +-- 检查并创建stock_out表 +CREATE TABLE IF NOT EXISTS stock_out ( + id BIGINT AUTO_INCREMENT PRIMARY KEY, + drug_id BIGINT NOT NULL, + prescription_id BIGINT, + quantity INT NOT NULL, + unit_price DECIMAL(10,2), + purpose VARCHAR(100), -- 用途:销售、损耗等 + operator_id BIGINT, + stock_out_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 +); + +-- 检查并创建vaccine_record表 CREATE TABLE IF NOT EXISTS vaccine_record ( id BIGINT AUTO_INCREMENT PRIMARY KEY, pet_id BIGINT NOT NULL, + type VARCHAR(20), -- VACCINE疫苗, DEWORMING驱虫 + item_name VARCHAR(100), + execute_date DATE, + next_reminder_date DATE, vaccine_name VARCHAR(100) NOT NULL, dose_number INT, injection_date DATE, @@ -148,83 +282,3 @@ CREATE TABLE IF NOT EXISTS vaccine_record ( 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/class_diagram.drawio b/class_diagram.drawio new file mode 100644 index 0000000..5e2615b --- /dev/null +++ b/class_diagram.drawio @@ -0,0 +1,67 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 91e43fa..28a6e2f 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -1429,6 +1429,7 @@ "version": "5.9.3", "devOptional": true, "license": "Apache-2.0", + "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -1448,6 +1449,7 @@ "version": "5.4.21", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "esbuild": "^0.21.3", "postcss": "^8.4.43", @@ -1520,6 +1522,7 @@ "node_modules/vue": { "version": "3.5.27", "license": "MIT", + "peer": true, "dependencies": { "@vue/compiler-dom": "3.5.27", "@vue/compiler-sfc": "3.5.27", diff --git a/frontend/src/pages/AppointmentPage.vue b/frontend/src/pages/AppointmentPage.vue index b094646..0d57ee3 100644 --- a/frontend/src/pages/AppointmentPage.vue +++ b/frontend/src/pages/AppointmentPage.vue @@ -14,6 +14,9 @@ +