
1. 智慧医院综合管理系统全栈开发从零搭建前后端分离骨架智慧医院综合管理系统是一套面向医院日常运营的后台管理平台核心能力包括科室维护、医生排班、患者预约挂号、药品库存预警以及基于 RBAC 的角色权限管控。它适合有一定 Java 和 Vue 基础、想完整走一遍前后端分离项目落地流程的开发者也适合需要快速交付医院管理类项目骨架的技术团队。整套系统采用 SpringBoot3 提供 RESTful 接口、Vue3 负责页面渲染前后端通过 JSON 通信、JWT 做无状态认证后端跑在 8080 端口、上下文路径为 /api前端跑在 5173 端口。我在实际搭建这类项目时发现最容易卡住的不是业务逻辑本身而是环境初始化、跨域配置、Token 传递和权限拦截这几处地基环节。地基没打牢后面每加一个业务模块都要回头改配置。所以这篇内容会按先跑通底层、再叠业务的顺序来写每一步都给出可复制的配置和命令你跟着敲就能得到一个能登录、能鉴权、能增删改查的医院管理骨架。整篇内容覆盖六个部分先讲清楚项目要解决的真实问题和角色场景再说明如何准备一个稳定的模型调用入口来辅助开发接着给出后端和前端的完整可复制配置然后做接口联调验证再集中排查几类高频报错最后给出接入文档和 API Key 的获取路径。全程不涉及任何网络工具所有操作都在本地开发环境完成。需要提前说明的是本文的技术栈版本以 SpringBoot 3.5.x、Vue 3.4、Vite 5.x、MyBatis-Plus 3.5.3.1、JJWT 0.11.5、MySQL 8.0 为基准JDK 使用 17。版本差异会导致部分 API 写法不同比如 SpringSecurity 6.x 的配置方式和 5.x 差别较大下面给出的都是 6.x 的写法。2. 开发前的模型调用准备TaoToken 接入与 API Key 获取在正式写业务代码之前有一个环节值得先处理好开发过程中我们经常需要让模型帮忙生成建表 SQL、补全 Mapper、解释报错信息。如果每次都要切换工具、重新配置效率会很低。TaoToken 提供了一套统一的模型调用入口可以让你在编码助手、命令行工具里用同一套 Base URL 和 Key 来调用不同模型减少来回切换的成本。TaoToken 的官网入口是 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content API 基础地址是 https://taotoken.net/api 。注意 API 地址不带任何查询参数配置时直接填这个即可。它的作用是把你本地工具发出的模型请求转发到对应的模型服务你只需要维护一个 Key就能在多个工具里复用。获取 Key 的路径很直接进入控制台后创建 API Key复制出来保存好。控制台地址是 https://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_contentconsoleutm_campaignrewrite API Key 管理页在 https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi-keysutm_campaignrewrite 。如果你只是想先试试模型对话效果可以打开模型对话页 https://taotoken.net/chat?utm_sourcetaotoken_aicg_blog_endutm_contentchatutm_campaignrewrite 直接体验。这里要强调一个配置三件套的概念无论你用的是哪类编码工具接入时都需要同时填对三个东西——Base URL、API Key、Model ID。少填一个或者填错一个都会导致请求失败。Base URL 统一用 https://taotoken.net/api Key 用你刚创建的那串Model ID 按你实际想调用的模型名称填写。这三者在后面的配置片段里会反复出现建议先记牢。对于长期做编码和 Agent 任务的场景可以考虑 Coding Plan入口在 https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding-planutm_campaignrewrite 。它的定位是给需要持续调用模型的开发流程提供更稳定的额度支持。如果你用的是 Claude Code 这类命令行工具接入文档在 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite 里面有对应的环境变量配置说明。需要提醒的是模型调用只是辅助开发的手段它帮你生成代码片段、解释报错但最终的配置校验、接口联调、权限验证还是要在本地环境里真实跑一遍。下面进入正式的项目搭建环节。3. 可复制配置SpringBoot3 后端与 Vue3 前端初始化这一节给出可以直接复制使用的配置片段。先看后端。用 Spring Initializr 生成骨架时构建工具选 Maven语言 JavaSpringBoot 版本 3.5.xGroup 填 com.lumosArtifact 填 hospital打包方式 JarJava 版本 17配置文件格式选 YAML。依赖勾选 Spring Web、Spring Security、MySQL Driver、Validation、Lombok、Spring Boot DevTools。生成后解压用 IDEA 打开等 Maven 拉完依赖。MyBatis-Plus 和 JJWT 不在初始化器里需要手动加到 pom.xmldependency groupIdcom.baomidou/groupId artifactIdmybatis-plus-boot-starter/artifactId version3.5.3.1/version /dependency dependency groupIdio.jsonwebtoken/groupId artifactIdjjwt-api/artifactId version0.11.5/version /dependency dependency groupIdio.jsonwebtoken/groupId artifactIdjjwt-impl/artifactId version0.11.5/version scoperuntime/scope /dependency dependency groupIdio.jsonwebtoken/groupId artifactIdjjwt-jackson/artifactId version0.11.5/version scoperuntime/scope /dependencyapplication.yml 的关键配置如下注意上下文路径和端口要和前端对齐server: port: 8080 servlet: context-path: /api spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/hospital?useUnicodetruecharacterEncodingutf8serverTimezoneAsia/Shanghai username: root password: 你的数据库密码 jackson: date-format: yyyy-MM-dd HH:mm:ss time-zone: GMT8 mybatis-plus: configuration: map-underscore-to-camel-case: true log-impl: org.apache.ibatis.logging.stdout.StdOutImpl global-config: db-config: logic-delete-field: deleted logic-delete-value: 1 logic-not-delete-value: 0这里map-underscore-to-camel-case: true是必须的否则数据库的 dept_name 字段映射不到实体的 deptName查询结果会是 null。逻辑删除配置让 MyBatis-Plus 自动处理 deleted 字段删除操作变成更新。前端初始化命令npm create vitelatest hospital-front -- --template vue cd hospital-front npm install npm install element-plus axios vue-router4Axios 封装文件 src/utils/request.js 的核心逻辑import axios from axios import { ElMessage } from element-plus import router from ../router const request axios.create({ baseURL: http://localhost:8080/api, timeout: 10000 }) request.interceptors.request.use(config { const token localStorage.getItem(token) if (token) { config.headers.Authorization Bearer ${token} } return config }) request.interceptors.response.use( response { const res response.data if (res.code 401) { localStorage.removeItem(token) router.push(/login) ElMessage.error(登录已过期请重新登录) return Promise.reject(new Error(未授权)) } return res }, error { ElMessage.error(error.message || 请求失败) return Promise.reject(error) } ) export default request注意Bearer ${token}中间的空格不能少后端过滤器是按这个前缀截取的。baseURL 里的 /api 要和后端 context-path 一致否则会出现 404。如果你在编码工具里配置模型辅助开发对应的 settings 片段大致如下以支持自定义 Base URL 的工具为例{ baseUrl: https://taotoken.net/api, apiKey: 你的API Key, model: 你的Model ID }这三项就是前面说的配置三件套缺一不可。填完后可以先发一条测试请求确认连通。4. 接口联调验证登录、鉴权与业务接口跑通配置写完后必须真实跑一遍验证。先执行建表 SQL把用户、角色、用户角色关联、菜单、角色菜单关联这五张权限表建好再建科室、排班、预约、药品、库存五张业务表。所有表主键自增高频查询字段建索引逻辑删除字段默认 0。启动后端运行 HospitalApplication.java控制台看到 Tomcat started on port 8080 且没有异常堆栈说明启动成功。如果报数据库连接失败先检查 yml 里的账号密码和数据库名。用 Postman 调登录接口验证POST http://localhost:8080/api/auth/login Content-Type: application/json { username: admin, password: 123456 }正常返回结构应该是{ code: 200, msg: 登录成功, data: { token: eyJhbGciOiJIUzI1NiJ9..., username: admin, roles: [ROLE_ADMIN] } }拿到 token 后访问需要权限的接口在 Header 里加Authorization: Bearer eyJhbGciOiJIUzI1NiJ9...。如果返回 200 和业务数据说明鉴权链路通了如果返回 403说明角色权限没匹配上检查 PreAuthorize 注解里的角色标识和数据库里存的 role_code 是否一致。前端启动npm run dev浏览器打开 http://localhost:5173 输入管理员账号密码登录。登录成功后应该自动跳转到科室管理页侧边栏根据角色动态渲染菜单。逐个测试新增科室、编辑、删除、分页搜索再测医生排班和预约挂号。重点验证边界场景重复预约同一个医生应该被拦截号源已满时预约应该失败并提示用患者账号访问管理员接口应该返回 403。联调时打开浏览器 F12 的 Network 面板看每个请求的 Request Headers 里有没有 AuthorizationResponse 的 code 是不是 200。这一步能帮你快速定位是前端没带 token还是后端拦截了请求。5. 本篇常见报错排查401、跨域、字段映射与 Token 过期实际搭建过程中下面几类报错出现频率最高逐个给出原因和解决动作。第一类是登录返回 401 用户名或密码错误。常见原因有三个数据库里存的是明文密码而 SpringSecurity 用 BCrypt 校验自然对不上自定义 UserDetailsService 查询用户角色时权限集合为空导致认证通过但授权失败Token 携带格式错误前端没加 Bearer 前缀。解决方式是插入管理员账号时用 BCryptPasswordEncoder 加密后再存从用户角色中间表查出角色并封装成 ROLE_xxx 放进权限集合前端请求拦截器统一拼接 Bearer 前缀。第二类是前端请求报 CORS 跨域错误控制台出现 local proxy failed 或 Access-Control-Allow-Origin 相关提示。原因是 Security 配置里 CORS 没生效或者允许的 Origin 配成了 * 同时又开了 allowCredentialstrue浏览器规则不允许这种组合。解决方式是在 SecurityFilterChain 里显式开启 .cors()精确配置前端地址 http://localhost:5173不用通配符并保证 CORS 过滤器在 Security 过滤器之前执行。第三类是 MyBatis-Plus 查询结果字段为 null报 reading choices 之类的映射异常。原因是 yml 没开启下划线转驼峰数据库的 dept_name 映射不到 deptName。解决方式就是前面配置里的map-underscore-to-camel-case: true加上后重启即可。第四类是 JWT 过期后前端没有自动跳登录页。原因是后端 Token 过期抛异常时没统一返回 401前端响应拦截器也没捕获。解决方式是 JWT 过滤器捕获过期异常返回 code401前端拦截器判断 code401 后清除本地 token 并跳转 /login。第五类涉及 OAuth 相关报错如果你在编码工具里配置模型调用时看到 OAuth 认证失败通常是 Key 填错或 Base URL 带了多余路径。检查配置三件套Base URL 用 https://taotoken.net/api Key 用控制台创建的原始串Model ID 和实际调用的一致。三者对齐后重新发起请求。排查这类问题的通用思路是先看后端控制台有没有异常堆栈再看浏览器 Network 里请求的实际 URL、Header 和响应体最后对照配置逐项核对。大部分报错都能通过这三步定位到具体环节。6. 接入文档与 API Key 获取路径项目骨架跑通后如果你想把模型调用能力固化到日常开发流程里可以按下面的路径操作。API Key 在 https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi-keysutm_campaignrewrite 创建和管理创建后复制保存配置到你的编码工具里。完整的接入说明和参数解释在 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite 里面有不同工具的环境变量配置示例。如果你更习惯在网页里直接和模型对话来生成 SQL 或调试代码模型对话入口是 https://taotoken.net/chat?utm_sourcetaotoken_aicg_blog_endutm_contentchatutm_campaignrewrite 。对于需要长期跑编码和 Agent 任务的场景Coding Plan 在 https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding-planutm_campaignrewrite 可以作为持续开发的额度方案。配置时再强调一次三件套Base URL 填 https://taotoken.net/api API Key 填你创建的那串Model ID 按实际调用的模型名填。这三项在编码工具、命令行工具、IDE 插件里的位置不同但含义一致。填完后发一条最简单的请求验证连通确认返回正常再进入正式开发。回到项目本身这套智慧医院管理系统的骨架已经能支撑后续业务扩展。你可以在这个基础上继续加门诊叫号、病历管理、报表统计等模块底层的认证、鉴权、分页、异常处理都已经封装好新增业务时只需要写实体、Mapper、Service、Controller 四层代码前端复用表格加弹窗的模板即可。真正花时间的往往不是写业务而是把地基配置对齐这也是本文把配置和排错放在前面的原因。