摘要
本研究针对传统宠物医院管理模式存在的效率低下、信息不共享、服务流程繁琐等问题,设计并实现了一个基于 Python Django 框架的宠物医院管理系统。系统采用 B/S 架构,整合了客户管理、宠物管理、医生管理、诊疗管理、药品管理、库存管理、财务管理等功能模块,实现了宠物医院业务的全流程数字化管理。系统前端使用 Bootstrap 框架构建响应式界面,后端采用 Django REST framework 提供 API 服务,数据库使用 MySQL 存储业务数据。通过实际应用验证,系统具有良好的稳定性、可扩展性和用户体验,能够有效提高宠物医院的管理效率和服务质量。
1. 引言
1.1 研究背景与意义
随着人们生活水平的提高和对宠物情感需求的增加,宠物饲养数量不断攀升,宠物医院行业也迎来了快速发展。据统计,我国宠物市场规模已超过 3000 亿元,宠物医院数量超过 2 万家。然而,传统的宠物医院管理模式主要依赖手工记录和纸质档案,存在效率低下、信息不共享、服务流程繁琐等问题,难以满足现代宠物医院的管理需求。
互联网技术的发展为宠物医院管理带来了新的机遇。通过建立数字化管理系统,宠物医院可以实现客户信息、宠物信息、诊疗记录、药品库存等数据的集中管理和共享,提高工作效率和服务质量。同时,数字化管理系统还可以为宠物主人提供便捷的预约挂号、在线咨询、诊疗报告查询等服务,提升用户体验。
本研究旨在设计并实现一个基于 Python Django 框架的宠物医院管理系统,通过整合客户管理、宠物管理、医生管理、诊疗管理、药品管理、库存管理、财务管理等功能模块,实现宠物医院业务的全流程数字化管理。系统将为宠物医院提供高效的管理工具,为宠物主人提供便捷的服务渠道,具有重要的现实意义。
1.2 国内外研究现状
国外在宠物医院管理系统的研究和应用方面起步较早,已经形成了较为成熟的产品和技术体系。例如,美国的 IDEXX、VetMatrix,欧洲的 Vetronic Services 等公司开发的宠物医院管理系统,功能完善、操作简便,在国际市场上占据了较大份额。这些系统采用了先进的信息技术,如云计算、大数据分析、人工智能等,提高了宠物医院的管理效率和服务质量。
国内宠物医院管理系统的发展相对较晚,但近年来也取得了一定的进展。国内一些软件企业开发了针对宠物医院的管理系统,如宠知道、瑞派宠物医院管理系统等。这些系统在功能上基本满足了宠物医院的日常管理需求,但在系统稳定性、用户体验、数据分析等方面还存在一定的不足。
目前,国内外宠物医院管理系统仍存在一些问题,如系统功能不够完善、数据安全隐患、系统集成度低等。此外,随着宠物医院行业的不断发展,用户对管理系统的功能和服务提出了更高的要求,需要进一步加强技术创新和服务创新。
1.3 研究内容与方法
本研究的主要内容包括:
-
系统需求分析:通过问卷调查、访谈等方式,了解宠物医院管理人员、医生、护士和宠物主人的需求,明确系统的功能和性能要求。
-
系统设计:包括系统架构设计、数据库设计、功能模块设计等,确定系统的技术选型和实现方案。
-
系统实现:基于 Python Django 框架实现系统的各个功能模块,包括用户认证、客户管理、宠物管理、医生管理、诊疗管理、药品管理、库存管理、财务管理等。
-
系统测试:对系统进行功能测试、性能测试、安全测试等,确保系统的稳定性和可靠性。
-
系统部署与应用:将系统部署到生产环境中,进行实际应用验证,评估系统的使用效果和用户满意度。
本研究采用的研究方法包括:
-
文献研究法:查阅国内外相关文献,了解宠物医院管理系统的研究现状和发展趋势,为系统设计提供理论支持。
-
问卷调查法:通过问卷调查的方式,了解宠物医院管理人员、医生、护士和宠物主人的需求和意见,为系统功能设计提供依据。
-
案例分析法:分析国内外知名宠物医院管理系统的成功案例,借鉴其设计思路和实现方法,为本系统的设计和实现提供参考。
-
实验研究法:通过实验对比不同的技术方案和算法,选择最优的方案和算法,提高系统的性能和用户体验。
2. 系统需求分析
2.1 功能需求
通过对宠物医院管理人员、医生、护士和宠物主人的需求调研,确定系统的主要功能需求如下:
-
用户管理功能
- 用户注册、登录、信息修改
- 用户角色管理(管理员、医生、护士、前台、财务、宠物主人)
- 用户权限控制
-
客户管理功能
- 客户信息录入、修改、查询
- 客户档案管理
- 客户消费记录查询
- 客户回访管理
-
宠物管理功能
- 宠物信息录入、修改、查询
- 宠物健康档案管理
- 宠物疫苗接种记录管理
- 宠物诊疗历史记录查询
-
医生管理功能
- 医生信息录入、修改、查询
- 医生排班管理
- 医生出诊记录管理
- 医生绩效统计
-
诊疗管理功能
- 预约挂号管理
- 就诊登记
- 病历管理
- 检查检验管理
- 诊断结果管理
- 治疗方案制定
- 手术管理
- 麻醉管理
-
药品管理功能
- 药品信息录入、修改、查询
- 药品供应商管理
- 药品采购管理
- 药品库存管理
- 药品效期管理
- 药品发放管理
-
库存管理功能
- 医疗器械管理
- 耗材管理
- 库存盘点
- 库存预警
-
财务管理功能
- 收费管理
- 退费管理
- 收入统计
- 支出管理
- 财务报表生成
-
系统设置功能
- 基础数据设置(科室、病种、药品分类等)
- 系统参数设置
- 数据备份与恢复
- 操作日志管理
2.2 非功能需求
-
性能需求
- 系统响应时间应满足用户操作要求,一般查询操作响应时间不超过 3 秒,复杂操作响应时间不超过 10 秒
- 系统应支持至少 100 个并发用户同时在线操作
- 系统应能够处理大量数据,保证数据的完整性和一致性
-
安全性需求
- 系统应保证用户数据的安全性和隐私性,严格遵守相关法律法规
- 用户密码应进行加密存储,防止密码泄露
- 系统应具备完善的访问控制机制,防止非法访问和操作
- 系统应具备数据备份和恢复机制,防止数据丢失
-
可用性需求
- 系统应具备良好的用户界面和操作体验,使用户能够轻松上手
- 系统应提供完善的帮助文档和在线客服,解答用户疑问
- 系统应具备高可用性,保证每天 24 小时不间断运行
-
可扩展性需求
- 系统应具备良好的可扩展性,能够方便地添加新的功能模块
- 系统应支持数据量和用户数的不断增长,能够通过集群化部署实现性能提升
-
兼容性需求
- 系统应支持主流浏览器(Chrome、Firefox、Safari、Edge 等)
- 系统应支持多种操作系统(Windows、MacOS、Linux 等)
- 系统应支持移动端访问,提供良好的移动用户体验
3. 系统总体设计
3.1 系统架构设计
本系统采用 B/S(浏览器 / 服务器)架构,将整个系统分为客户端、应用服务器和数据库服务器三个层次。系统的总体架构如图 1 所示。
图 1:系统总体架构图
-
客户端:负责与用户交互,接收用户请求并展示系统响应结果。客户端可以是 Web 浏览器或移动应用。
-
Web 服务器:负责处理 HTTP 请求,静态资源的存储和分发,以及负载均衡。本系统使用 Nginx 作为 Web 服务器。
-
应用服务器:是系统的核心,负责处理业务逻辑和数据处理。应用服务器基于 Python Django 框架构建,提供 RESTful API 接口,实现与客户端的通信。应用服务器还包括任务队列和缓存服务,用于处理异步任务和提高系统性能。
-
数据库服务器:负责存储系统的所有数据,包括用户信息、客户信息、宠物信息、医生信息、诊疗记录、药品库存、财务数据等。本系统使用 MySQL 作为主要数据库,Redis 作为缓存数据库。
3.2 系统部署架构设计
系统部署架构采用分布式集群部署方式,以确保系统的高可用性和扩展性。系统部署架构如图 2 所示。

图 2:系统部署架构图
-
负载均衡器:采用 Nginx 或 HAProxy 实现,负责将用户请求分发到多个 Web 服务器,实现负载均衡和高可用性。
-
Nginx 服务器集群:部署多个 Nginx 服务器,处理 HTTP 请求和静态资源的分发。
-
应用服务器集群:部署多个 Django 应用服务器,处理业务逻辑和数据处理。应用服务器之间通过消息队列进行异步通信。
-
消息队列:采用 RabbitMQ 或 Kafka 实现,用于处理异步任务,如邮件发送、短信通知、报表生成等。
-
任务处理服务器集群:部署多个任务处理服务器,处理消息队列中的任务。
-
数据库集群:采用 MySQL 主从复制或集群技术,实现数据的高可用性和读写分离。
-
缓存集群:部署多个 Redis 服务器,实现数据缓存,提高系统性能。
-
监控系统:采用 Prometheus 和 Grafana 实现,对系统的各个组件进行实时监控和性能分析,确保系统的稳定运行。
3.3 系统用例图设计
系统用例图描述了系统与用户之间的交互关系,展示了系统的功能边界和用户角色。系统用例图如图 3 所示。
图 3:系统用例图
3.4 数据库设计
根据系统需求,设计了以下主要数据表:
-
用户表 (User):存储系统用户的基本信息,包括用户 ID、用户名、密码、角色、联系方式等。
-
科室表 (Department):存储医院科室信息,包括科室 ID、科室名称、科室描述等。
-
员工表 (Staff):存储医院员工信息,包括员工 ID、用户 ID、科室 ID、职位、职称等。
-
客户表 (Customer):存储客户信息,包括客户 ID、姓名、性别、年龄、联系方式、地址等。
-
宠物表 (Pet):存储宠物信息,包括宠物 ID、客户 ID、宠物名称、品种、性别、年龄、体重、毛色等。
-
宠物疫苗记录表 (PetVaccination):存储宠物疫苗接种记录,包括记录 ID、宠物 ID、疫苗名称、接种日期、下次接种日期等。
-
医生排班表 (DoctorSchedule):存储医生排班信息,包括排班 ID、医生 ID、日期、时间段、状态等。
-
预约挂号表 (Appointment):存储预约挂号信息,包括预约 ID、客户 ID、宠物 ID、医生 ID、预约日期、预约时间段、状态等。
-
病历表 (MedicalRecord):存储宠物病历信息,包括病历 ID、宠物 ID、医生 ID、就诊日期、主诉、现病史、体格检查、诊断结果、治疗方案等。
-
处方表 (Prescription):存储药品处方信息,包括处方 ID、病历 ID、药品 ID、用量、用法、天数等。
-
检查检验表 (Examination):存储检查检验信息,包括检查 ID、病历 ID、检查项目、检查日期、检查结果等。
-
药品表 (Drug):存储药品信息,包括药品 ID、药品名称、药品分类、规格、单位、价格、库存数量、供应商等。
-
药品库存表 (DrugInventory):存储药品库存信息,包括库存 ID、药品 ID、入库日期、入库数量、出库日期、出库数量、库存数量等。
-
收费记录表 (ChargeRecord):存储收费信息,包括收费 ID、病历 ID、项目名称、金额、收费日期、收费人员等。
-
退费记录表 (RefundRecord):存储退费信息,包括退费 ID、收费 ID、退费金额、退费原因、退费日期、退费人员等。
数据库表结构详细设计如下:
sql
-- 用户表
CREATE TABLE `user` (
`id` INT NOT NULL AUTO_INCREMENT COMMENT '用户ID',
`username` VARCHAR(50) NOT NULL COMMENT '用户名',
`password` VARCHAR(100) NOT NULL COMMENT '密码',
`role` TINYINT NOT NULL COMMENT '角色(1:管理员,2:医生,3:护士,4:前台,5:财务,6:宠物主人)',
`name` VARCHAR(50) DEFAULT NULL COMMENT '姓名',
`phone` VARCHAR(20) DEFAULT NULL COMMENT '电话',
`email` VARCHAR(50) DEFAULT NULL COMMENT '邮箱',
`avatar` VARCHAR(255) DEFAULT NULL COMMENT '头像',
`status` TINYINT NOT NULL DEFAULT 1 COMMENT '状态(0:禁用,1:启用)',
`create_time` DATETIME NOT NULL COMMENT '创建时间',
`update_time` DATETIME NOT NULL COMMENT '更新时间',
PRIMARY KEY (`id`),
UNIQUE KEY `idx_username` (`username`),
UNIQUE KEY `idx_phone` (`phone`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户表';
-- 科室表
CREATE TABLE `department` (
`id` INT NOT NULL AUTO_INCREMENT COMMENT '科室ID',
`name` VARCHAR(50) NOT NULL COMMENT '科室名称',
`description` VARCHAR(255) DEFAULT NULL COMMENT '科室描述',
`status` TINYINT NOT NULL DEFAULT 1 COMMENT '状态(0:禁用,1:启用)',
`create_time` DATETIME NOT NULL COMMENT '创建时间',
`update_time` DATETIME NOT NULL COMMENT '更新时间',
PRIMARY KEY (`id`),
UNIQUE KEY `idx_name` (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='科室表';
-- 员工表
CREATE TABLE `staff` (
`id` INT NOT NULL AUTO_INCREMENT COMMENT '员工ID',
`user_id` INT NOT NULL COMMENT '用户ID',
`department_id` INT NOT NULL COMMENT '科室ID',
`position` VARCHAR(50) NOT NULL COMMENT '职位',
`title` VARCHAR(50) DEFAULT NULL COMMENT '职称',
`id_card` VARCHAR(20) DEFAULT NULL COMMENT '身份证号',
`hire_date` DATE DEFAULT NULL COMMENT '入职日期',
`status` TINYINT NOT NULL DEFAULT 1 COMMENT '状态(0:离职,1:在职)',
`create_time` DATETIME NOT NULL COMMENT '创建时间',
`update_time` DATETIME NOT NULL COMMENT '更新时间',
PRIMARY KEY (`id`),
UNIQUE KEY `idx_user_id` (`user_id`),
FOREIGN KEY (`user_id`) REFERENCES `user` (`id`),
FOREIGN KEY (`department_id`) REFERENCES `department` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='员工表';
-- 客户表
CREATE TABLE `customer` (
`id` INT NOT NULL AUTO_INCREMENT COMMENT '客户ID',
`user_id` INT DEFAULT NULL COMMENT '用户ID',
`name` VARCHAR(50) NOT NULL COMMENT '姓名',
`gender` TINYINT DEFAULT NULL COMMENT '性别(1:男,2:女)',
`age` INT DEFAULT NULL COMMENT '年龄',
`phone` VARCHAR(20) NOT NULL COMMENT '电话',
`address` VARCHAR(255) DEFAULT NULL COMMENT '地址',
`remark` VARCHAR(255) DEFAULT NULL COMMENT '备注',
`status` TINYINT NOT NULL DEFAULT 1 COMMENT '状态(0:禁用,1:启用)',
`create_time` DATETIME NOT NULL COMMENT '创建时间',
`update_time` DATETIME NOT NULL COMMENT '更新时间',
PRIMARY KEY (`id`),
FOREIGN KEY (`user_id`) REFERENCES `user` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='客户表';
-- 宠物表
CREATE TABLE `pet` (
`id` INT NOT NULL AUTO_INCREMENT COMMENT '宠物ID',
`customer_id` INT NOT NULL COMMENT '客户ID',
`name` VARCHAR(50) NOT NULL COMMENT '宠物名称',
`species` VARCHAR(50) NOT NULL COMMENT '品种',
`gender` TINYINT NOT NULL COMMENT '性别(1:公,2:母)',
`age` INT NOT NULL COMMENT '年龄',
`weight` DECIMAL(5,2) DEFAULT NULL COMMENT '体重(kg)',
`color` VARCHAR(50) DEFAULT NULL COMMENT '毛色',
`chip_number` VARCHAR(50) DEFAULT NULL COMMENT '芯片编号',
`allergy_history` VARCHAR(255) DEFAULT NULL COMMENT '过敏史',
`medical_history` VARCHAR(255) DEFAULT NULL COMMENT '病史',
`status` TINYINT NOT NULL DEFAULT 1 COMMENT '状态(0:已去世,1:健康,2:患病)',
`create_time` DATETIME NOT NULL COMMENT '创建时间',
`update_time` DATETIME NOT NULL COMMENT '更新时间',
PRIMARY KEY (`id`),
FOREIGN KEY (`customer_id`) REFERENCES `customer` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='宠物表';
-- 宠物疫苗记录表
CREATE TABLE `pet_vaccination` (
`id` INT NOT NULL AUTO_INCREMENT COMMENT '记录ID',
`pet_id` INT NOT NULL COMMENT '宠物ID',
`vaccine_name` VARCHAR(50) NOT NULL COMMENT '疫苗名称',
`vaccination_date` DATE NOT NULL COMMENT '接种日期',
`next_vaccination_date` DATE DEFAULT NULL COMMENT '下次接种日期',
`vaccination_site` VARCHAR(50) DEFAULT NULL COMMENT '接种部位',
`vaccination_doctor` INT DEFAULT NULL COMMENT '接种医生',
`vaccine_batch` VARCHAR(50) DEFAULT NULL COMMENT '疫苗批次',
`remark` VARCHAR(255) DEFAULT NULL COMMENT '备注',
`create_time` DATETIME NOT NULL COMMENT '创建时间',
`update_time` DATETIME NOT NULL COMMENT '更新时间',
PRIMARY KEY (`id`),
FOREIGN KEY (`pet_id`) REFERENCES `pet` (`id`),
FOREIGN KEY (`vaccination_doctor`) REFERENCES `staff` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='宠物疫苗记录表';
-- 医生排班表
CREATE TABLE `doctor_schedule` (
`id` INT NOT NULL AUTO_INCREMENT COMMENT '排班ID',
`doctor_id` INT NOT NULL COMMENT '医生ID',
`schedule_date` DATE NOT NULL COMMENT '日期',
`time_slot` TINYINT NOT NULL COMMENT '时间段(1:上午,2:下午,3:晚上)',
`max_patients` INT NOT NULL DEFAULT 10 COMMENT '最大接诊数量',
`current_patients` INT NOT NULL DEFAULT 0 COMMENT '当前预约数量',
`status` TINYINT NOT NULL DEFAULT 1 COMMENT '状态(0:取消,1:正常)',
`create_time` DATETIME NOT NULL COMMENT '创建时间',
`update_time` DATETIME NOT NULL COMMENT '更新时间',
PRIMARY KEY (`id`),
UNIQUE KEY `idx_doctor_date_time` (`doctor_id`,`schedule_date`,`time_slot`),
FOREIGN KEY (`doctor_id`) REFERENCES `staff` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='医生排班表';
-- 预约挂号表
CREATE TABLE `appointment` (
`id` INT NOT NULL AUTO_INCREMENT COMMENT '预约ID',
`customer_id` INT NOT NULL COMMENT '客户ID',
`pet_id` INT NOT NULL COMMENT '宠物ID',
`doctor_id` INT NOT NULL COMMENT '医生ID',
`schedule_id` INT NOT NULL COMMENT '排班ID',
`appointment_date` DATE NOT NULL COMMENT '预约日期',
`time_slot` TINYINT NOT NULL COMMENT '时间段(1:上午,2:下午,3:晚上)',
`symptoms` VARCHAR(255) DEFAULT NULL COMMENT '症状描述',
`status` TINYINT NOT NULL DEFAULT 1 COMMENT '状态(1:待确认,2:已确认,3:已完成,4:已取消)',
`create_time` DATETIME NOT NULL COMMENT '创建时间',
`update_time` DATETIME NOT NULL COMMENT '更新时间',
PRIMARY KEY (`id`),
FOREIGN KEY (`customer_id`) REFERENCES `customer` (`id`),
FOREIGN KEY (`pet_id`) REFERENCES `pet` (`id`),
FOREIGN KEY (`doctor_id`) REFERENCES `staff` (`id`),
FOREIGN KEY (`schedule_id`) REFERENCES `doctor_schedule` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='预约挂号表';
-- 病历表
CREATE TABLE `medical_record` (
`id` INT NOT NULL AUTO_INCREMENT COMMENT '病历ID',
`pet_id` INT NOT NULL COMMENT '宠物ID',
`doctor_id` INT NOT NULL COMMENT '医生ID',
`appointment_id` INT DEFAULT NULL COMMENT '预约ID',
`visit_date` DATETIME NOT NULL COMMENT '就诊日期',
`chief_complaint` TEXT NOT NULL COMMENT '主诉',
`present_illness` TEXT DEFAULT NULL COMMENT '现病史',
`physical_examination` TEXT DEFAULT NULL COMMENT '体格检查',
`diagnosis` TEXT DEFAULT NULL COMMENT '诊断结果',
`treatment_plan` TEXT DEFAULT NULL COMMENT '治疗方案',
`follow_up` TEXT DEFAULT NULL COMMENT '随访建议',
`status` TINYINT NOT NULL DEFAULT 1 COMMENT '状态(1:未完成,2:已完成)',
`create_time` DATETIME NOT NULL COMMENT '创建时间',
`update_time` DATETIME NOT NULL COMMENT '更新时间',
PRIMARY KEY (`id`),
FOREIGN KEY (`pet_id`) REFERENCES `pet` (`id`),
FOREIGN KEY (`doctor_id`) REFERENCES `staff` (`id`),
FOREIGN KEY (`appointment_id`) REFERENCES `appointment` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='病历表';
-- 处方表
CREATE TABLE `prescription` (
`id` INT NOT NULL AUTO_INCREMENT COMMENT '处方ID',
`medical_record_id` INT NOT NULL COMMENT '病历ID',
`drug_id` INT NOT NULL COMMENT '药品ID',
`dosage` VARCHAR(50) NOT NULL COMMENT '用量',
`usage` VARCHAR(50) NOT NULL COMMENT '用法',
`duration` INT NOT NULL COMMENT '天数',
`total_quantity` INT NOT NULL COMMENT '总数量',
`status` TINYINT NOT NULL DEFAULT 1 COMMENT '状态(1:未发药,2:已发药)',
`create_time` DATETIME NOT NULL COMMENT '创建时间',
`update_time` DATETIME NOT NULL COMMENT '更新时间',
PRIMARY KEY (`id`),
FOREIGN KEY (`medical_record_id`) REFERENCES `medical_record` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='处方表';
-- 检查检验表
CREATE TABLE `examination` (
`id` INT NOT NULL AUTO_INCREMENT COMMENT '检查ID',
`medical_record_id` INT NOT NULL COMMENT '病历ID',
`examination_type` TINYINT NOT NULL COMMENT '检查类型(1:实验室检查,2:影像学检查,3:其他)',
`examination_item` VARCHAR(50) NOT NULL COMMENT '检查项目',
`examination_date` DATETIME NOT NULL COMMENT '检查日期',
`examination_result` TEXT DEFAULT NULL COMMENT '检查结果',
`doctor_id` INT DEFAULT NULL COMMENT '检查医生',
`status` TINYINT NOT NULL DEFAULT 1 COMMENT '状态(1:未完成,2:已完成)',
`create_time` DATETIME NOT NULL COMMENT '创建时间',
`update_time` DATETIME NOT NULL COMMENT '更新时间',
PRIMARY KEY (`id`),
FOREIGN KEY (`medical_record_id`) REFERENCES `medical_record` (`id`),
FOREIGN KEY (`doctor_id`) REFERENCES `staff` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='检查检验表';
-- 药品表
CREATE TABLE `drug` (
`id` INT NOT NULL AUTO_INCREMENT COMMENT '药品ID',
`name` VARCHAR(100) NOT NULL COMMENT '药品名称',
`category` TINYINT NOT NULL COMMENT '药品分类(1:抗生素,2:抗病毒药,3:驱虫药,4:消炎药,5:止痛药,6:营养药,7:其他)',
`specification` VARCHAR(50) NOT NULL COMMENT '规格',
`unit` VARCHAR(10) NOT NULL COMMENT '单位',
`price` DECIMAL(10,2) NOT NULL COMMENT '价格',
`manufacturer` VARCHAR(100) DEFAULT NULL COMMENT '生产厂家',
`shelf_life` INT DEFAULT NULL COMMENT '保质期(月)',
`storage_condition` VARCHAR(50) DEFAULT NULL COMMENT '储存条件',
`min_stock` INT NOT NULL DEFAULT 0 COMMENT '最低库存',
`max_stock` INT NOT NULL DEFAULT 100 COMMENT '最高库存',
`current_stock` INT NOT NULL DEFAULT 0 COMMENT '当前库存',
`status` TINYINT NOT NULL DEFAULT 1 COMMENT '状态(0:停用,1:启用)',
`create_time` DATETIME NOT NULL COMMENT '创建时间',
`update_time` DATETIME NOT NULL COMMENT '更新时间',
PRIMARY KEY (`id`),
UNIQUE KEY `idx_name_spec` (`name`,`specification`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='药品表';
-- 药品库存表
CREATE TABLE `drug_inventory` (
`id` INT NOT NULL AUTO_INCREMENT COMMENT '库存ID',
`drug_id` INT NOT NULL COMMENT '药品ID',
`inbound_date` DATETIME DEFAULT NULL COMMENT '入库日期',
`inbound_quantity` INT DEFAULT NULL COMMENT '入库数量',
`inbound_price` DECIMAL(10,2) DEFAULT NULL COMMENT '入库价格',
`inbound_supplier` VARCHAR(100) DEFAULT NULL COMMENT '入库供应商',
`outbound_date` DATETIME DEFAULT NULL COMMENT '出库日期',
`outbound_quantity` INT DEFAULT NULL COMMENT '出库数量',
`outbound_reason` VARCHAR(100) DEFAULT NULL COMMENT '出库原因',
`batch_number` VARCHAR(50) DEFAULT NULL COMMENT '批次号',
`expiry_date` DATE DEFAULT NULL COMMENT '过期日期',
`current_quantity` INT NOT NULL DEFAULT 0 COMMENT '当前数量',
`create_time` DATETIME NOT NULL COMMENT '创建时间',
`update_time` DATETIME NOT NULL COMMENT '更新时间',
PRIMARY KEY (`id`),
FOREIGN KEY (`drug_id`) REFERENCES `drug` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='药品库存表';
-- 收费记录表
CREATE TABLE `charge_record` (
`id` INT NOT NULL AUTO_INCREMENT COMMENT '收费ID',
`medical_record_id` INT NOT NULL COMMENT '病历ID',
`item_name` VARCHAR(100) NOT NULL COMMENT '项目名称',
`quantity` INT NOT NULL DEFAULT 1 COMMENT '数量',
`price` DECIMAL(10,2) NOT NULL COMMENT '单价',
`amount` DECIMAL(10,2) NOT NULL COMMENT '金额',
`charge_type` TINYINT NOT NULL COMMENT '收费类型(1:诊疗费,2:药品费,3:检查费,4:治疗费,5:手术费,6:其他)',
`charge_date` DATETIME NOT NULL COMMENT '收费日期',
`charge_staff_id` INT NOT NULL COMMENT '收费人员ID',
`payment_method` TINYINT NOT NULL COMMENT '支付方式(1:现金,2:微信,3:支付宝,4:银行卡,5:其他)',
`status` TINYINT NOT NULL DEFAULT 1 COMMENT '状态(1:已收费,2:已退费)',
`create_time` DATETIME NOT NULL COMMENT '创建时间',
`update_time` DATETIME NOT NULL COMMENT '更新时间',
PRIMARY KEY (`id`),
FOREIGN KEY (`medical_record_id`) REFERENCES `medical_record` (`id`),
FOREIGN KEY (`charge_staff_id`) REFERENCES `staff` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='收费记录表';
-- 退费记录表
CREATE TABLE `refund_record` (
`id` INT NOT NULL AUTO_INCREMENT COMMENT '退费ID',
`charge_id` INT NOT NULL COMMENT '收费ID',
`refund_amount` DECIMAL(10,2) NOT NULL COMMENT '退费金额',
`refund_reason` TEXT DEFAULT NULL COMMENT '退费原因',
`refund_date` DATETIME NOT NULL COMMENT '退费日期',
`refund_staff_id` INT NOT NULL COMMENT '退费人员ID',
`status` TINYINT NOT NULL DEFAULT 1 COMMENT '状态(1:已退费)',
`create_time` DATETIME NOT NULL COMMENT '创建时间',
`update_time` DATETIME NOT NULL COMMENT '更新时间',
PRIMARY KEY (`id`),
FOREIGN KEY (`charge_id`) REFERENCES `charge_record` (`id`),
FOREIGN KEY (`refund_staff_id`) REFERENCES `staff` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='退费记录表';
4. 系统详细设计与实现
4.1 后端服务实现
后端服务基于 Python Django 框架实现,采用 MVC 架构模式,将系统分为模型层、视图层和控制器层。以下是核心模块的实现细节:
-
用户认证与权限管理模块:基于 Django 的认证系统实现用户注册、登录、权限控制等功能,采用 JWT 实现无状态认证。
-
客户与宠物管理模块:实现客户信息和宠物信息的录入、修改、查询等功能,支持宠物健康档案的管理。
-
医生与排班管理模块:实现医生信息的管理和排班计划的制定,支持预约挂号的处理。
-
诊疗管理模块:实现病历的创建、修改、查询等功能,支持处方开具、检查检验安排等诊疗流程。
-
药品与库存管理模块:实现药品信息的管理、库存的出入库操作、库存预警等功能。
-
财务管理模块:实现收费、退费、财务统计等功能,支持各类财务报表的生成。
以下是诊疗管理模块的部分实现代码示例:
python
运行
# 诊疗管理模块
from django.shortcuts import render, get_object_or_404
from django.http import JsonResponse, HttpResponse
from django.views.decorators.csrf import csrf_exempt
from django.contrib.auth.decorators import login_required
from django.core.paginator import Paginator
from django.db.models import Q
import json
import os
from datetime import datetime
from .models import MedicalRecord, Prescription, Examination
from .serializers import MedicalRecordSerializer, PrescriptionSerializer, ExaminationSerializer
from utils.response import SuccessResponse, ErrorResponse
from utils.permissions import is_doctor, is_nurse
from utils.pagination import get_paginated_response
# 创建病历
@login_required
@is_doctor
def create_medical_record(request):
if request.method == 'POST':
try:
data = json.loads(request.body)
# 获取宠物信息
pet_id = data.get('pet_id')
if not pet_id:
return ErrorResponse("宠物ID不能为空")
# 获取医生信息(当前登录用户)
doctor_id = request.user.staff.id
# 创建病历
medical_record = MedicalRecord(
pet_id=pet_id,
doctor_id=doctor_id,
appointment_id=data.get('appointment_id'),
visit_date=datetime.now(),
chief_complaint=data.get('chief_complaint'),
present_illness=data.get('present_illness'),
physical_examination=data.get('physical_examination'),
diagnosis=data.get('diagnosis'),
treatment_plan=data.get('treatment_plan'),
follow_up=data.get('follow_up'),
status=1, # 未完成
create_time=datetime.now(),
update_time=datetime.now()
)
medical_record.save()
return SuccessResponse({"medical_record_id": medical_record.id}, "病历创建成功")
except Exception as e:
return ErrorResponse(f"病历创建失败: {str(e)}")
else:
return ErrorResponse("请求方法错误")
# 获取病历列表
@login_required
def get_medical_records(request):
try:
# 获取查询参数
pet_id = request.GET.get('pet_id')
doctor_id = request.GET.get('doctor_id')
start_date = request.GET.get('start_date')
end_date = request.GET.get('end_date')
status = request.GET.get('status')
page = request.GET.get('page', 1)
page_size = request.GET.get('page_size', 10)
# 构建查询条件
query = Q()
if pet_id:
query &= Q(pet_id=pet_id)
if doctor_id:
query &= Q(doctor_id=doctor_id)
if start_date and end_date:
query &= Q(visit_date__range=[start_date, end_date])
elif start_date:
query &= Q(visit_date__gte=start_date)
elif end_date:
query &= Q(visit_date__lte=end_date)
if status:
query &= Q(status=status)
# 获取病历列表
medical_records = MedicalRecord.objects.filter(query).order_by('-visit_date')
# 分页处理
paginator = Paginator(medical_records, page_size)
page_obj = paginator.get_page(page)
# 序列化数据
serializer = MedicalRecordSerializer(page_obj, many=True)
return get_paginated_response(serializer.data, page_obj, "病历列表获取成功")
except Exception as e:
return ErrorResponse(f"病历列表获取失败: {str(e)}")
# 获取病历详情
@login_required
def get_medical_record_detail(request, record_id):
try:
# 获取病历信息
medical_record = get_object_or_404(MedicalRecord, id=record_id)
# 序列化数据
serializer = MedicalRecordSerializer(medical_record)
# 获取处方信息
prescriptions = Prescription.objects.filter(medical_record_id=record_id)
prescription_serializer = PrescriptionSerializer(prescriptions, many=True)
# 获取检查检验信息
examinations = Examination.objects.filter(medical_record_id=record_id)
examination_serializer = ExaminationSerializer(examinations, many=True)
return SuccessResponse({
'medical_record': serializer.data,
'prescriptions': prescription_serializer.data,
'examinations': examination_serializer.data
}, "病历详情获取成功")
except Exception as e:
return ErrorResponse(f"病历详情获取失败: {str(e)}")
# 更新病历
@login_required
@is_doctor
def update_medical_record(request, record_id):
if request.method == 'POST':
try:
data = json.loads(request.body)
# 获取病历信息
medical_record = get_object_or_404(MedicalRecord, id=record_id)
# 更新病历信息
medical_record.chief_complaint = data.get('chief_complaint', medical_record.chief_complaint)
medical_record.present_illness = data.get('present_illness', medical_record.present_illness)
medical_record.physical_examination = data.get('physical_examination', medical_record.physical_examination)
medical_record.diagnosis = data.get('diagnosis', medical_record.diagnosis)
medical_record.treatment_plan = data.get('treatment_plan', medical_record.treatment_plan)
medical_record.follow_up = data.get('follow_up', medical_record.follow_up)
medical_record.status = data.get('status', medical_record.status)
medical_record.update_time = datetime.now()
medical_record.save()
return SuccessResponse("病历更新成功")
except Exception as e:
return ErrorResponse(f"病历更新失败: {str(e)}")
else:
return ErrorResponse("请求方法错误")
# 创建处方
@login_required
@is_doctor
def create_prescription(request):
if request.method == 'POST':
try:
data = json.loads(request.body)
# 获取病历信息
medical_record_id = data.get('medical_record_id')
if not medical_record_id:
return ErrorResponse("病历ID不能为空")
# 获取药品信息
drug_id = data.get('drug_id')
if not drug_id:
return ErrorResponse("药品ID不能为空")
# 创建处方
prescription = Prescription(
medical_record_id=medical_record_id,
drug_id=drug_id,
dosage=data.get('dosage'),
usage=data.get('usage'),
duration=data.get('duration'),
total_quantity=data.get('total_quantity'),
status=1, # 未发药
create_time=datetime.now(),
update_time=datetime.now()
)
prescription.save()
return SuccessResponse({"prescription_id": prescription.id}, "处方创建成功")
except Exception as e:
return ErrorResponse(f"处方创建失败: {str(e)}")
else:
return ErrorResponse("请求方法错误")
# 创建检查检验
@login_required
@is_doctor
def create_examination(request):
if request.method == 'POST':
try:
data = json.loads(request.body)
# 获取病历信息
medical_record_id = data.get('medical_record_id')
if not medical_record_id:
return ErrorResponse("病历ID不能为空")
# 创建检查检验
examination = Examination(
medical_record_id=medical_record_id,
examination_type=data.get('examination_type'),
examination_item=data.get('examination_item'),
examination_date=datetime.now(),
doctor_id=request.user.staff.id,
status=1, # 未完成
create_time=datetime.now(),
update_time=datetime.now()
)
examination.save()
return SuccessResponse({"examination_id": examination.id}, "检查检验创建成功")
except Exception as e:
return ErrorResponse(f"检查检验创建失败: {str(e)}")
else:
return ErrorResponse("请求方法错误")
# 更新检查检验结果
@login_required
@is_doctor
def update_examination_result(request, examination_id):
if request.method == 'POST':
try:
data = json.loads(request.body)
# 获取检查检验信息
examination = get_object_or_404(Examination, id=examination_id)
# 更新检查检验结果
examination.examination_result = data.get('examination_result', examination.examination_result)
examination.status = 2 # 已完成
examination.update_time = datetime.now()
examination.save()
return SuccessResponse("检查检验结果更新成功")
except Exception as e:
return ErrorResponse(f"检查检验结果更新失败: {str(e)}")
else:
return ErrorResponse("请求方法错误")
4.2 前端界面设计与实现
前端界面采用 Vue.js 框架实现,结合 Element UI 组件库构建美观、易用的用户界面。以下是系统主要界面的设计与实现:
-
登录界面:提供用户登录功能,支持用户名 / 密码登录。
-
首页:展示系统概览信息,包括今日预约、今日接诊、待处理事项等。
-
客户管理界面:展示客户列表,支持客户信息的新增、修改、查询等操作。
-
宠物管理界面:展示宠物列表,支持宠物信息的新增、修改、查询等操作,查看宠物健康档案。
-
医生排班界面:展示医生排班信息,支持排班计划的制定和调整。
-
预约挂号界面:展示预约列表,支持预约的新增、修改、取消等操作。
-
诊疗管理界面:展示病历列表,支持病历的创建、修改、查看等操作,开具处方和安排检查检验。
-
药品管理界面:展示药品列表,支持药品信息的新增、修改、查询等操作,管理药品库存。
-
库存管理界面:展示库存信息,支持库存的出入库操作,库存盘点和预警。
-
财务管理界面:展示收费记录和退费记录,支持财务统计和报表生成。
以下是诊疗管理界面的部分实现代码示例:
html
预览
<template>
<div class="medical-record-manage">
<el-card class="filter-card">
<el-form :inline="true" :model="filterForm" class="demo-form-inline">
<el-form-item label="宠物ID">
<el-input v-model="filterForm.pet_id" placeholder="请输入宠物ID"></el-input>
</el-form-item>
<el-form-item label="医生">
<el-select v-model="filterForm.doctor_id" placeholder="请选择医生">
<el-option
v-for="item in doctorList"
:key="item.id"
:label="item.name"
:value="item.id">
</el-option>
</el-select>
</el-form-item>
<el-form-item label="日期范围">
<el-date-picker
v-model="filterForm.dateRange"
type="daterange"
range-separator="至"
start-placeholder="开始日期"
end-placeholder="结束日期">
</el-date-picker>
</el-form-item>
<el-form-item label="状态">
<el-select v-model="filterForm.status" placeholder="请选择状态">
<el-option label="未完成" value="1"></el-option>
<el-option label="已完成" value="2"></el-option>
</el-select>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="search">查询</el-button>
<el-button @click="resetFilter">重置</el-button>
</el-form-item>
</el-form>
</el-card>
<el-card class="table-card">
<div slot="header" class="clearfix">
<span>病历列表</span>
<el-button style="float: right; margin-top: -5px" type="primary" @click="createMedicalRecord">
新增病历
</el-button>
</div>
<el-table
:data="medicalRecordList"
stripe
border
size="small"
@row-click="handleRowClick">
<el-table-column prop="id" label="病历ID"></el-table-column>
<el-table-column label="宠物信息">
<template slot-scope="scope">
<div>{{ scope.row.pet_name }}</div>
<div class="text-muted">{{ scope.row.pet_species }} | {{ scope.row.pet_gender_text }}</div>
</template>
</el-table-column>
<el-table-column label="客户信息">
<template slot-scope="scope">
<div>{{ scope.row.customer_name }}</div>
<div class="text-muted">{{ scope.row.customer_phone }}</div>
</template>
</el-table-column>
<el-table-column prop="doctor_name" label="医生"></el-table-column>
<el-table-column prop="visit_date" label="就诊日期"></el-table-column>
<el-table-column prop="chief_complaint" label="主诉"></el-table-column>
<el-table-column label="状态">
<template slot-scope="scope">
<el-tag :type="scope.row.status === 1 ? 'warning' : 'success'">
{{ scope.row.status_text }}
</el-tag>
</template>
</el-table-column>
<el-table-column label="操作">
<template slot-scope="scope">
<el-button
size="mini"
@click="viewMedicalRecord(scope.row.id)">
查看
</el-button>
<el-button
size="mini"
type="primary"
@click="editMedicalRecord(scope.row.id)"
v-if="scope.row.status === 1">
编辑
</el-button>
</template>
</el-table-column>
</el-table>
<el-pagination
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
:current-page="currentPage"
:page-sizes="[10, 20, 50, 100]"
:page-size="pageSize"
layout="total, sizes, prev, pager, next, jumper"
:total="total">
</el-pagination>
</el-card>
</div>
</template>
<script>
export default {
data() {
return {
medicalRecordList: [],
doctorList: [],
filterForm: {
pet_id: '',
doctor_id: '',
dateRange: [],
status: ''
},
currentPage: 1,
pageSize: 10,
total: 0,
loading: false
}
},
created() {
this.getDoctorList();
this.getMedicalRecordList();
},
methods: {
// 获取医生列表
getDoctorList() {
this.$axios.get('/api/staff/doctors/').then(response => {
this.doctorList = response.data.data;
}).catch(error => {
this.$message.error(error.message);
});
},
// 获取病历列表
getMedicalRecordList() {
this.loading = true;
let params = {
page: this.currentPage,
page_size: this.pageSize,
pet_id: this.filterForm.pet_id,
doctor_id: this.filterForm.doctor_id,
status: this.filterForm.status
};
if (this.filterForm.dateRange && this.filterForm.dateRange.length > 0) {
params.start_date = this.filterForm.dateRange[0];
params.end_date = this.filterForm.dateRange[1];
}
this.$axios.get('/api/medical-records/', { params }).then(response => {
this.medicalRecordList = response.data.data;
this.total = response.data.total;
this.loading = false;
}).catch(error => {
this.$message.error(error.message);
this.loading = false;
});
},
// 搜索
search() {
this.currentPage = 1;
this.getMedicalRecordList();
},
// 重置过滤条件
resetFilter() {
this.filterForm = {
pet_id: '',
doctor_id: '',
dateRange: [],
status: ''
};
this.currentPage = 1;
this.getMedicalRecordList();
},
// 分页相关
handleSizeChange(val) {
this.pageSize = val;
this.getMedicalRecordList();
},
handleCurrentChange(val) {
this.currentPage = val;
this.getMedicalRecordList();
},
// 新增病历
createMedicalRecord() {
this.$router.push({ name: 'MedicalRecordCreate' });
},
// 查看病历
viewMedicalRecord(id) {
this.$router.push({ name: 'MedicalRecordView', params: { id } });
},
// 编辑病历
editMedicalRecord(id) {
this.$router.push({ name: 'MedicalRecordEdit', params: { id } });
},
// 行点击事件
handleRowClick(row) {
this.viewMedicalRecord(row.id);
}
}
}
</script>
<style scoped>
.filter-card {
margin-bottom: 15px;
}
.table-card {
min-height: 600px;
}
.text-muted {
color: #909399;
font-size: 12px;
}
</style>
5. 系统测试与部署
5.1 系统测试
系统测试是确保系统质量的重要环节。本研究对系统进行了全面的测试,包括功能测试、性能测试、安全测试等。
-
功能测试:对系统的各个功能模块进行了详细的测试,确保系统功能完整、正确。测试结果表明,系统的各项功能均能正常运行,满足用户需求。
-
性能测试:使用 JMeter 工具对系统进行了性能测试,测试内容包括响应时间、并发用户数、吞吐量等。测试结果表明,系统在并发用户数不超过 100 的情况下,响应时间均能控制在 3 秒以内,满足系统性能需求。
-
安全测试:对系统进行了安全测试,包括 SQL 注入测试、XSS 攻击测试、密码安全测试等。测试结果表明,系统具有良好的安全性,能够有效防止各种安全攻击。
5.2 系统部署
系统采用 Docker 容器化技术进行部署,将系统的各个组件打包成独立的 Docker 镜像,通过 Docker Compose 进行统一管理和部署。系统部署步骤如下:
-
环境准备:安装 Docker 和 Docker Compose,配置好网络环境。
-
镜像构建:根据系统各个组件的 Dockerfile,构建相应的 Docker 镜像。
-
配置文件准备:准备好系统的配置文件,包括数据库配置、应用配置等。
-
容器部署:使用 Docker Compose 编排文件,部署系统的各个容器,包括 Web 服务器、应用服务器、数据库服务器等。
-
系统初始化:初始化数据库,导入基础数据,配置系统参数。
-
系统测试:部署完成后,对系统进行全面测试,确保系统正常运行。
6. 系统应用与评价
系统部署上线后,在某宠物医院进行了实际应用。通过一段时间的使用,系统得到了用户的一致好评。用户认为系统操作简单、功能完善、界面美观,能够有效提高工作效率和服务质量。
通过实际应用验证,系统具有以下优点:
-
功能完善:系统涵盖了宠物医院的各个业务环节,包括客户管理、宠物管理、医生管理、诊疗管理、药品管理、库存管理、财务管理等,满足了宠物医院的全面管理需求。
-
操作简便:系统采用直观的界面设计和友好的交互方式,使用户能够轻松上手,减少了培训成本。
-
数据安全:系统采用了多层次的数据安全保障措施,包括用户认证、权限控制、数据加密等,确保了用户数据的安全性和隐私性。
-
性能稳定:系统采用了分布式架构和缓存技术,具有良好的性能和稳定性,能够满足宠物医院的日常业务需求。
-
可扩展性强:系统采用了模块化设计和微服务架构,具有良好的可扩展性,能够方便地添加新的功能模块。
7. 结论与展望
7.1 研究成果总结
本研究设计并实现了一个基于 Python Django 框架的宠物医院管理系统,通过整合客户管理、宠物管理、医生管理、诊疗管理、药品管理、库存管理、财务管理等功能模块,实现了宠物医院业务的全流程数字化管理。系统采用 B/S 架构,前端使用 Vue.js 框架构建,后端使用 Django 框架实现,数据库使用 MySQL 存储业务数据。通过实际应用验证,系统具有良好的稳定性、可扩展性和用户体验,能够有效提高宠物医院的管理效率和服务质量。
7.2 研究不足与展望
尽管本研究取得了一定的成果,但仍存在一些不足之处。例如,系统的数据分析功能还不够完善,缺乏对业务数据的深度挖掘和分析;系统的移动端应用还不够完善,用户体验有待进一步提高。
在未来的研究中,我们将进一步完善系统的功能,加强数据分析和挖掘能力,为宠物医院提供更加全面、深入的业务分析和决策支持。同时,我们将进一步优化系统的移动端应用,提高用户体验,为用户提供更加便捷、高效的服务。此外,我们还将探索引入人工智能技术,如机器学习、自然语言处理等,提高系统的智能化水平,为宠物医院的管理和服务带来更多的创新和突破。
参考文献
博主介绍:硕士研究生,专注于信息化技术领域开发与管理,会使用java、标准c/c++等开发语言,以及毕业项目实战✌
从事基于java BS架构、CS架构、c/c++ 编程工作近16年,拥有近12年的管理工作经验,拥有较丰富的技术架构思想、较扎实的技术功底和资深的项目管理经验。
先后担任过技术总监、部门经理、项目经理、开发组长、java高级工程师及c++工程师等职位,在工业互联网、国家标识解析体系、物联网、分布式集群架构、大数据通道处理、接口开发、远程教育、办公OA、财务软件(工资、记账、决策、分析、报表统计等方面)、企业内部管理软件(ERP、CRM等)、arggis地图等信息化建设领域有较丰富的实战工作经验;拥有BS分布式架构集群、数据库负载集群架构、大数据存储集群架构,以及高并发分布式集群架构的设计、开发和部署实战经验;拥有大并发访问、大数据存储、即时消息等瓶颈解决方案和实战经验。
拥有产品研发和发明专利申请相关工作经验,完成发明专利构思、设计、编写、申请等工作,并获得发明专利1枚。
大家在毕设选题、项目升级、论文写作,就业毕业等相关问题都可以给我留言咨询,非常乐意帮助更多的人或加w 908925859。
相关博客地址:
csdn专业技术博客:https://blog.csdn.net/mr_lili_1986?type=blog
Iteye博客: https://www.iteye.com/blog/user/mr-lili-1986-163-com
七、其他案例:













