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 2f5d222..193a128 100644 Binary files a/backend/target/classes/com/gpf/pethospital/controller/AppointmentController.class and b/backend/target/classes/com/gpf/pethospital/controller/AppointmentController.class differ diff --git a/backend/target/classes/com/gpf/pethospital/controller/NoticeController.class b/backend/target/classes/com/gpf/pethospital/controller/NoticeController.class index 6826327..88b1dca 100644 Binary files a/backend/target/classes/com/gpf/pethospital/controller/NoticeController.class and b/backend/target/classes/com/gpf/pethospital/controller/NoticeController.class differ diff --git a/backend/target/classes/com/gpf/pethospital/controller/PetController.class b/backend/target/classes/com/gpf/pethospital/controller/PetController.class index 00e9bfc..251f963 100644 Binary files a/backend/target/classes/com/gpf/pethospital/controller/PetController.class and b/backend/target/classes/com/gpf/pethospital/controller/PetController.class differ diff --git a/backend/target/classes/com/gpf/pethospital/controller/StatsController.class b/backend/target/classes/com/gpf/pethospital/controller/StatsController.class index 9467636..9d977f7 100644 Binary files a/backend/target/classes/com/gpf/pethospital/controller/StatsController.class and b/backend/target/classes/com/gpf/pethospital/controller/StatsController.class differ diff --git a/backend/target/classes/com/gpf/pethospital/entity/PrescriptionItem.class b/backend/target/classes/com/gpf/pethospital/entity/PrescriptionItem.class index ef73a02..a7a60cd 100644 Binary files a/backend/target/classes/com/gpf/pethospital/entity/PrescriptionItem.class and b/backend/target/classes/com/gpf/pethospital/entity/PrescriptionItem.class differ 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 @@ +