基于SpringBoot+Vue的中医院问诊系统:领域建模与全栈实现 📅 发布时间:2026/9/4 4:33:38 👁 浏览次数: 简介本资源是一套面向高校计算机专业课程设计与毕业设计的中医院问诊系统完整实现方案基于SpringBootVue前后端分离架构适用于Java全栈开发初学者及中级学习者开展实战项目训练。系统涵盖患者挂号、医生问诊、电子病历管理、处方开具等核心中医诊疗业务流程具备可运行、可调试、可扩展特性。压缩包共857个文件含220个Java后端逻辑类、158个Vue前端组件、123个图片资源、63个JS交互脚本及4个SQL脚本含建库建表与初始数据辅以bat启动脚本、yml配置文件与Maven构建支持整体大小为23.37MB。目前已有77人下载学习配套数据库脚本经MySQL 5.7实测可用IDEANavicat开发环境开箱即用目录结构规范模块划分清晰便于理解分层架构与接口对接逻辑。1. 项目背景与核心价值为什么是中医院问诊系统最近几年无论是课程设计还是毕业设计选择做一个“在线问诊系统”的同学越来越多。这确实是个好选题它技术栈主流SpringBoot Vue业务逻辑清晰能覆盖从后端API到前端交互的完整流程。但如果你只是做一个普适的“在线问诊”说实话已经有点审美疲劳了很难在众多相似项目中脱颖而出。这时候“中医院问诊系统”这个细分领域就显出了它的独特价值。我当年带学生做毕设时就发现一个现象很多同学的项目功能都差不多挂号、问诊、开药、支付一套流程走下来技术实现上大同小异。评委老师看多了难免会觉得缺乏新意。而“中医院”这个限定词不仅仅是换个名字那么简单它意味着你的系统需要承载一套完全不同的业务逻辑和知识体系。西医问诊核心可能是检查单、化验指标、标准化处方而中医问诊其灵魂在于“望闻问切”的辨证论治过程以及由此衍生的个性化诊疗方案比如中药方剂、针灸推拿建议、饮食起居指导等。所以这个项目的核心价值绝不仅仅是“又一个SpringBootVue的CRUD项目”。它的挑战和价值在于你如何用现代Web技术去建模和实现一套古老而复杂的医学逻辑。你需要思考如何在前端页面上优雅地收集“舌苔颜色淡红、红、绛紫”、“脉象浮、沉、迟、数”这样的信息如何在后端设计数据表来存储一个可能包含十几味药材、每味药材还有不同剂量的中药处方如何根据用户输入的“症状如畏寒、发热、汗出”和“体征”通过一定的规则哪怕是简单的规则引擎推荐可能的“证型如风寒感冒、风热感冒”当你把这些问题都思考清楚并实现出来你的项目就从一个简单的“信息管理系统”升级为一个具有领域特色的“业务系统”。这不仅能让你在答辩时有的放矢深入讲解你的领域建模思路更能向评委展示你解决复杂业务问题的能力这才是高分毕设的秘诀。2. 系统核心模块设计与领域建模拿到一个“中医院问诊系统”的需求第一步不是急着建SpringBoot工程而是要进行领域分析。我们需要抛开技术先想清楚这个系统到底要管哪些“东西”以及这些东西之间如何关联。这个过程就是领域建模它是整个项目坚实的地基。2.1 核心实体与关系梳理基于中医问诊流程我们可以抽象出以下几个核心实体患者 (Patient)基础信息之外需要特别关注与中医体质相关的字段例如constitution体质类型如平和质、气虚质等这可以作为后续健康管理的依据。医生 (Doctor)除了常规信息应有department科室如内科、针灸科、推拿科、specialty擅长领域如脾胃病、妇科调理等字段。中医医生还可能关联title职称如主任医师、教授。问诊记录 (Consultation)这是系统的核心业务实体。它关联患者和医生。其字段设计需体现中医特色tongueCondition(舌象)文本描述或可设计为结构化数据舌质、舌苔颜色、厚薄等。pulseCondition(脉象)同上。symptoms(症状描述)详细记录患者主诉。syndromeDifferentiation(辨证结论)医生诊断后的证型如“肝郁脾虚”。advice(医嘱)包括生活调养建议如“避风寒节饮食”。处方 (Prescription)与一次问诊记录关联。一个处方包含多味药材。处方头信息prescriptionName(方名如“逍遥散加减”)usage(用法如“水煎服日一剂分两次温服”)。处方详情 (PrescriptionDetail)这是一个“处方”和“药材”之间的关联实体记录了处方中每一味药的具体信息。herbId(药材ID)dosage(剂量如“10g”)notes(备注如“先煎”、“后下”)。这是中药处方非常关键的一点直接影响药效。药材库 (Herb)维护一个基础药材信息表包含name(名称如“黄芪”)、property(药性如“甘微温”)、meridianTropism(归经如“归脾、肺经”)、efficacy(功效如“补气升阳固表止汗”)。它们之间的关系可以用一句话描述一位患者通过一次问诊记录找到一位医生医生根据问诊的“望闻问切”信息进行辨证并开具一张或多张处方每张处方由多味药材按特定剂量和煎法组成。2.2 数据库表结构设计示例基于以上分析我们可以设计出部分核心表结构。这里以MySQL为例给出关键字段问诊记录表 (consultation)CREATE TABLE consultation ( id bigint(20) NOT NULL AUTO_INCREMENT COMMENT 主键, patient_id bigint(20) NOT NULL COMMENT 患者ID, doctor_id bigint(20) NOT NULL COMMENT 医生ID, consultation_no varchar(32) NOT NULL COMMENT 问诊单号, symptoms text COMMENT 症状描述, tongue_condition varchar(255) DEFAULT NULL COMMENT 舌象, pulse_condition varchar(255) DEFAULT NULL COMMENT 脉象, syndrome_differentiation varchar(255) DEFAULT NULL COMMENT 辨证结论, advice text COMMENT 医嘱, status tinyint(4) DEFAULT 0 COMMENT 状态0待接诊1进行中2已完成, create_time datetime DEFAULT CURRENT_TIMESTAMP COMMENT 创建时间, PRIMARY KEY (id), KEY idx_patient_id (patient_id), KEY idx_doctor_id (doctor_id) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT问诊记录表;处方表 (prescription)CREATE TABLE prescription ( id bigint(20) NOT NULL AUTO_INCREMENT COMMENT 主键, consultation_id bigint(20) NOT NULL COMMENT 关联问诊ID, prescription_name varchar(255) NOT NULL COMMENT 处方名称, usage_desc varchar(500) DEFAULT NULL COMMENT 用法用量描述, total_price decimal(10,2) DEFAULT NULL COMMENT 总价可计算, create_time datetime DEFAULT CURRENT_TIMESTAMP COMMENT 开具时间, PRIMARY KEY (id), KEY idx_consultation_id (consultation_id) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT处方表;处方详情表 (prescription_detail)CREATE TABLE prescription_detail ( id bigint(20) NOT NULL AUTO_INCREMENT COMMENT 主键, prescription_id bigint(20) NOT NULL COMMENT 处方ID, herb_id bigint(20) NOT NULL COMMENT 药材ID, dosage varchar(50) NOT NULL COMMENT 剂量如10g, notes varchar(255) DEFAULT NULL COMMENT 煎法备注如先煎、后下, sequence int(11) DEFAULT NULL COMMENT 药材在方中的顺序, PRIMARY KEY (id), KEY idx_prescription_id (prescription_id), KEY idx_herb_id (herb_id) ) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COMMENT处方详情表;注意prescription_detail表中的sequence字段非常重要。中药方剂讲究“君臣佐使”药材的顺序有时具有含义。在前端展示和打印处方时应按照此顺序排列这是体现专业性的细节。2.3 业务边界与扩展思考在基础问诊和处方之外这个系统还有很多可以深挖和扩展的点这些正是你项目的亮点智能辅助辨证规则引擎可以建立一个简单的症状-证型知识库。当医生输入一系列症状如“发热、恶寒、无汗、脉浮紧”时系统可以在后台通过规则匹配提示可能的证型“风寒表实证”供医生参考。这可以用一个独立的syndrome_rule表来实现虽然简单但足以让项目增色不少。药材库存与划价将Herb实体与库存、价格关联在开具处方时实时计算总价并减少库存实现一个小型药房管理模块。复诊与病历归档将每次的问诊记录、处方串联起来形成患者的完整电子病历方便医生查看历史诊疗情况。体质辨识问卷在患者注册或初诊时引导其完成一份标准化的中医体质辨识问卷如中华中医药学会发布的九种体质问卷系统自动分析出体质类型存入患者档案。这为后续的“治未病”健康指导提供了数据基础。领域建模阶段想得越细后续开发就越顺畅项目的深度和完整性也越高。3. 技术栈选型与前后端分离架构实战确定了业务模型接下来就要用技术把它实现。SpringBoot Vue 是当下非常成熟且主流的前后端分离方案选择它们没错但如何组织好这个架构里面有不少门道。3.1 后端SpringBoot工程结构规划我不推荐使用单模块的SpringBoot工程。对于毕业设计级别的项目虽然不大但采用多模块设计能让你更好地理解工程化思想。一个清晰的结构如下tcm-consultation-system (父工程pom打包) ├── tcm-common -- 通用模块 │ ├── 常量、枚举、通用工具类、统一异常定义、基础DTO ├── tcm-dao -- 数据持久层模块 │ ├── Entity实体类、Mapper接口、XML映射文件 ├── tcm-service -- 业务逻辑层模块 │ ├── Service接口及其实现 ├── tcm-controller -- Web控制层模块 │ ├── Controller、DTO、VO └── tcm-app -- 应用启动模块 ├── 主启动类、全局配置、拦截器、过滤器各模块依赖关系app-controller-service-dao-common。common被所有模块依赖。关键依赖pom.xml除了基础的spring-boot-starter-web、mybatis-spring-boot-starter、mysql-connector-java我强烈建议引入以下依赖来提升开发效率和项目质量Lombok通过注解自动生成Getter/Setter、构造方法等让实体类和DTO非常简洁。MapStruct用于实体、DTO、VO之间的优雅转换比手动set/get或BeanUtils.copyProperties更安全、高效。Spring Validation在Controller层对入参进行校验如NotBlank、NotNull。Knife4jSwagger的增强版用于自动生成和调试API文档。这对于前后端协作至关重要。Hutool一个非常强大的Java工具库涵盖了字符串、日期、加密、IO等方方面面能极大减少你写工具类的时间。3.2 前端Vue工程与组件化设计前端使用Vue CLI创建一个标准项目。核心在于如何组织组件以应对中医问诊这种表单复杂、交互多的场景。路由规划 (router/index.js)const routes [ { path: /, redirect: /home }, { path: /home, component: () import(/views/Home.vue) }, { path: /login, component: () import(/views/Login.vue) }, // 患者端 { path: /patient, component: () import(/views/patient/Index.vue), children: [ { path: consult, component: () import(/views/patient/Consult.vue) }, // 发起问诊 { path: records, component: () import(/views/patient/Records.vue) }, // 我的问诊记录 { path: prescriptions, component: () import(/views/patient/Prescriptions.vue) }, // 我的处方 ] }, // 医生端 { path: /doctor, component: () import(/views/doctor/Index.vue), children: [ { path: task, component: () import(/views/doctor/TaskList.vue) }, // 待接诊列表 { path: diagnose/:id, component: () import(/views/doctor/Diagnose.vue) }, // 诊断页面 { path: herb-library, component: () import(/views/doctor/HerbLibrary.vue) }, // 药材库 ] }, // 管理员端... ];核心组件设计HerbSelector.vue一个通用的药材选择器组件。应该具备搜索、按功效/归经筛选、分页展示已选药材列表可调整剂量和备注的功能。这个组件将在医生开具处方的页面中被复用。SymptomInput.vue症状输入组件。可以设计为标签输入方便快速选择常见症状结合富文本编辑器用于详细描述的模式。PrescriptionViewer.vue处方查看/打印组件。严格按照“君臣佐使”顺序依据sequence字段展示药材并格式化显示用法、煎法等。状态管理对于毕业设计规模的项目如果全局状态不多如用户信息使用Vuex/Pinia可能稍显繁重。可以考虑优先使用provide/inject或Event Bus来处理跨层级组件通信。但如果涉及复杂的处方编辑状态如临时保存的处方草稿引入Pinia进行集中管理会是更清晰的选择。3.3 前后端交互与API设计规范前后端分离的核心是API契约。设计一套清晰、规范的API是项目联调顺畅的保障。统一响应体// 在 common 模块中定义 Data public class RT { private Integer code; // 状态码如 200成功500失败 private String msg; // 提示信息 private T data; // 响应数据 public static T RT ok(T data) { RT r new R(); r.setCode(200); r.setMsg(操作成功); r.setData(data); return r; } public static T RT error(String msg) { RT r new R(); r.setCode(500); r.setMsg(msg); return r; } }RESTful风格API示例GET /api/patient/consultations获取当前患者的问诊列表。POST /api/patient/consultations患者发起新的问诊。GET /api/doctor/consultations/pending医生获取待接诊列表。PUT /api/doctor/consultations/{id}医生接诊并填写诊断信息这是一个复合操作可能会更新问诊记录、创建处方。GET /api/herbs?name黄芪property温查询药材库。一个复杂API的设计思考医生开具处方这个操作涉及多个实体的创建和更新不适合拆分成多个细小API。可以采用一个“领域服务”来统一处理。前端提交将完整的处方数据包含处方头信息和药材明细列表作为一个JSON对象提交。后端接收使用一个PrescriptionRequestDTO来接收。Data public class PrescriptionRequestDTO { private Long consultationId; private String prescriptionName; private String usageDesc; private ListPrescriptionItemDTO items; // 药材明细列表 } Data public class PrescriptionItemDTO { private Long herbId; private String dosage; private String notes; private Integer sequence; }服务层处理在Transactional注解的保护下依次创建Prescription实体和多个PrescriptionDetail实体并更新Consultation状态。任何一步失败整个事务回滚保证数据一致性。4. 核心功能实现与中医特色逻辑详解有了架构和设计我们来深入两个最具中医特色的功能实现细节问诊信息收集与处方管理。4.1 中医问诊信息的数据采集与前端实现如何让医生方便、准确地录入“望闻问切”信息这是前端体验的关键。舌象与脉象的选择器 与其让医生自由输入文本不如提供结构化选择这样更规范也便于后续数据分析。我们可以使用el-select配合多级el-option来实现。template div el-form-item label舌象 el-select v-modeltongueData.part1 placeholder舌质 el-option label淡红 value淡红/el-option el-option label红 value红/el-option el-option label绛 value绛/el-option el-option label紫 value紫/el-option /el-select el-select v-modeltongueData.part2 placeholder舌苔 el-option label薄白 value薄白/el-option el-option label白厚 value白厚/el-option el-option label黄腻 value黄腻/el-option el-option label少苔 value少苔/el-option /el-select !-- 可以继续添加舌形、瘀点等选项 -- /el-form-item el-form-item label脉象 el-select v-modelpulseData multiple placeholder请选择 !-- 脉象可多选 -- el-option label浮 value浮/el-option el-option label沉 value沉/el-option el-option label迟 value迟/el-option el-option label数 value数/el-option el-option label弦 value弦/el-option el-option label滑 value滑/el-option /el-select /el-form-item /div /template script export default { data() { return { tongueData: { part1: , part2: }, pulseData: [] }; }, methods: { // 在提交前将结构化数据拼接成字符串或直接以JSON格式提交 getTongueCondition() { return [this.tongueData.part1, this.tongueData.part2].filter(Boolean).join(); } } }; /script症状的智能输入与联想 症状描述是问诊的核心。我们可以实现一个类似“标签输入”的组件并支持从预置的症状库中联想。后端维护一个symptom表包含常见症状词条。前端输入时监听输入框向后端发送请求查询匹配的症状。用户可以选择联想出的词条自动添加到标签中。最终提交时将标签数组转换为字符串如“发热恶寒咳嗽痰白清稀”。这样既保证了输入的灵活性又提高了数据的规范性。4.2 中药处方的创建、编辑与展示逻辑这是系统的业务核心复杂度最高。处方创建页面(DoctorDiagnose.vue)逻辑加载问诊信息进入页面时根据路由参数consultationId调用API加载患者的问诊基本信息症状、舌脉等。集成药材选择器页面中引入HerbSelector组件。当医生从选择器中添加药材时该组件通过$emit事件将药材对象包含id, name, dosage, notes等传递给父组件。维护处方草稿父组件维护一个prescriptionItems数组。收到添加事件后将新药材push进数组并自动为其生成一个sequence可按添加顺序或允许医生手动调整。实时计算与预览每当prescriptionItems变化实时计算总价调用后端接口或前端粗略估算并实时预览处方格式。提交处方填写处方名、用法后将consultationId、prescriptionName、usageDesc和prescriptionItems数组封装成PrescriptionRequestDTO提交给后端/api/doctor/prescriptions接口。后端处方服务(PrescriptionService.java)关键代码Service Transactional public class PrescriptionService { Autowired private ConsultationMapper consultationMapper; Autowired private PrescriptionMapper prescriptionMapper; Autowired private PrescriptionDetailMapper detailMapper; public void createPrescription(PrescriptionRequestDTO dto) { // 1. 校验问诊单是否存在且状态允许开方 Consultation consultation consultationMapper.selectById(dto.getConsultationId()); if (consultation null || !consultation.getStatus().equals(ConsultationStatus.IN_PROGRESS.getCode())) { throw new BusinessException(问诊单状态不允许开立处方); } // 2. 创建处方主记录 Prescription prescription new Prescription(); prescription.setConsultationId(dto.getConsultationId()); prescription.setPrescriptionName(dto.getPrescriptionName()); prescription.setUsageDesc(dto.getUsageDesc()); prescriptionMapper.insert(prescription); // 3. 批量创建处方明细 ListPrescriptionDetail details dto.getItems().stream().map(item - { PrescriptionDetail detail new PrescriptionDetail(); detail.setPrescriptionId(prescription.getId()); detail.setHerbId(item.getHerbId()); detail.setDosage(item.getDosage()); detail.setNotes(item.getNotes()); detail.setSequence(item.getSequence()); return detail; }).collect(Collectors.toList()); if (!details.isEmpty()) { // 使用MyBatis Plus的saveBatch方法 detailMapper.insertBatch(details); } // 4. 更新问诊单状态为“已完成” consultation.setStatus(ConsultationStatus.COMPLETED.getCode()); consultationMapper.updateById(consultation); } }处方展示与打印 创建一个PrescriptionViewer.vue组件用于展示或打印格式化的处方。重点在于按sequence排序并按照中医处方的传统格式排版如药名、剂量、备注分列对齐。可以使用table或Flex布局实现。对于打印可以调用浏览器的window.print()方法并配合media printCSS媒体查询来优化打印样式。5. 项目部署、运行与常见问题排查一个能跑起来的项目才是好项目。这里给出从源码到运行的完整路径和可能遇到的坑。5.1 环境准备与数据库初始化后端环境JDK确保安装JDK 8或11SpringBoot 2.x的常用版本。在终端输入java -version验证。Maven用于管理依赖和构建。安装后配置好国内镜像如阿里云镜像以加速下载。MySQL安装5.7或8.0版本。创建一个空数据库例如tcm_consultation。IDEIntelliJ IDEA或Eclipse。前端环境Node.js安装LTS版本如16.x, 18.x。自带npm。Vue CLI可选。如果项目是用Vue CLI创建的可能需要全局安装vue/cli。但更常见的是项目已包含所有依赖直接用npm install即可。数据库初始化在你的MySQLtcm_consultation数据库中运行项目resources目录下的SQL脚本如果提供。如果没有你需要根据第2章设计的表结构手动创建所有表。重要记得修改后端配置文件application.yml或application.properties中的数据库连接信息。spring: datasource: url: jdbc:mysql://localhost:3306/tcm_consultation?useUnicodetruecharacterEncodingutf-8serverTimezoneAsia/Shanghai username: root password: your_password driver-class-name: com.mysql.cj.jdbc.Driver5.2 前后端项目启动步骤后端启动用IDE导入Maven项目等待依赖下载完成。找到主启动类通常位于tcm-app模块下类名如TcmConsultationApplication直接运行其main方法。看到控制台输出类似Tomcat started on port(s): 8080的日志即表示启动成功。访问http://localhost:8080/doc.html如果你集成了Knife4j应该能看到API文档页面。前端启动在终端中进入前端项目根目录包含package.json的文件夹。运行npm install或cnpm install安装所有依赖。常见坑网络问题可能导致安装失败或缓慢。可以尝试配置npm淘宝镜像npm config set registry https://registry.npmmirror.com。依赖安装成功后运行npm run serve启动开发服务器。控制台会输出本地访问地址通常是http://localhost:8081。浏览器打开即可看到前端页面。注意前端需要配置API代理解决开发时的跨域问题。在vue.config.js文件中配置module.exports { devServer: { proxy: { /api: { target: http://localhost:8080, // 后端地址 changeOrigin: true, pathRewrite: { ^/api: // 根据后端实际路径决定是否重写 } } } } }5.3 常见问题与解决方案前端运行报错Module not found或Cannot find module原因node_modules依赖不完整或损坏。解决删除node_modules文件夹和package-lock.json文件重新运行npm install。确保网络通畅。后端启动报错Failed to configure a DataSource原因数据库连接配置错误或MySQL服务未启动。解决检查application.yml中的数据库URL、用户名、密码是否正确。在终端运行mysql -u root -p确认MySQL服务已启动并可连接。前后端联调时前端请求后端API返回404原因代理配置错误或后端Controller路径不匹配。解决检查前端vue.config.js中的proxy配置确保target指向正确的后端地址和端口。打开浏览器开发者工具的“网络(Network)”选项卡查看请求的实际URL是否被正确代理。核对后端RequestMapping或GetMapping等注解的路径是否与前端请求的路径一致。打包部署后访问前端页面空白或JS/CSS加载失败原因前端静态资源路径问题。Vue项目默认打包后资源路径是绝对路径/如果部署到子路径下如http://yourdomain.com/tcm/就会出现问题。解决在前端项目根目录创建或修改vue.config.js添加publicPath配置。module.exports { publicPath: process.env.NODE_ENV production ? /tcm/ // 生产环境子路径 : /, // 开发环境路径 // ... 其他配置 }同时后端如果需要托管前端静态资源也要确保能正确映射到这个子路径。数据库插入中文乱码原因数据库、连接字符串或表字段的字符集不是utf8mb4。解决确保MySQL数据库和表的字符集为utf8mb4排序规则为utf8mb4_general_ci。确保JDBC连接字符串中包含参数useUnicodetruecharacterEncodingutf-8。检查实体类字段是否使用了正确的类型如String。这个项目从领域设计到技术实现涵盖了一个完整业务系统的核心思考。真正动手做下来你会对SpringBootVue的全栈开发、对复杂业务的数据建模、对前后端协同的细节有非常深刻的理解。记住把“中医”这个特色做透你的项目就成功了一大半。本文还有配套的精品资源点击获取