Files
jiaohaoView/README.md
2025-12-13 18:52:08 +08:00

476 lines
11 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 胜透叫号系统 - 项目说明文档
## 📋 项目概览
**胜透叫号系统** 是一个基于 Vue 3 + TypeScript + Vite 开发的医疗透析患者叫号和管理系统。该系统是从完整的 Vue 3 后台管理模板 `vue-next-admin` 中独立提取出来的单页面应用,专门用于显示和管理患者叫号信息。
### 核心特性
- 🎯 **患者实时叫号**:支持后端 TTS 服务和前端浏览器 TTS 双种语音播报方式
- 🔊 **音频播放**:集成 WAV 格式音频播放,支持等待播放完成再重置状态
- 📊 **实时数据展示**:通过 WebSocket 实时获取患者状态变化
- 🎨 **大屏展示**:支持全屏展示、字体大小调整、数据脱敏显示
- 🎬 **多媒体支持**:支持时段内容显示(视频/图片轮播)
- ⚙️ **灵活配置**:支持环境变量配置各项服务地址
---
## 🔧 技术栈
| 技术 | 版本 | 说明 |
|-----|------|------|
| Vue.js | 3.x | 前端框架 |
| TypeScript | 4.x+ | 类型系统 |
| Vite | 2.6.14 | 构建工具 |
| Element Plus | 1.2.0 | UI 组件库 |
| Vue Router | 4.x | 路由管理 |
| Vuex | 4.x | 状态管理 |
| Axios | 0.24.0 | HTTP 请求库 |
| WebSocket | 原生 | 实时通信 |
| speak-tts | - | 前端语音合成 |
---
## 📁 项目结构
```
pcWeb/
├── src/
│ ├── views/
│ │ └── listCurrentHemoMeds/ # 主叫号页面
│ │ └── index.vue # 叫号系统主组件
│ ├── components/
│ │ └── webSocket/index.vue # WebSocket 实时通信组件
│ ├── api/
│ │ └── comm/ # 通用 API 接口
│ │ └── index.ts # 患者数据和媒体接口
│ ├── router/
│ │ └── route.ts # 路由配置(已简化)
│ ├── store/ # Vuex 状态管理
│ ├── assets/ # 静态资源
│ ├── utils/ # 工具函数
│ ├── App.vue # 根组件
│ └── main.ts # 应用入口
├── .env.development # 开发环境配置
├── .env.production # 生产环境配置
├── vite.config.ts # Vite 配置
├── tsconfig.json # TypeScript 配置
└── package.json # 项目依赖
```
---
## 🚀 快速开始
### 安装依赖
```bash
npm install
# 或
yarn install
# 或
cnpm install
```
### 开发模式运行
```bash
npm run dev
# 或
yarn dev
```
开发服务器将在 `http://localhost:8888` 启动
### 生产构建
```bash
npm run build
```
输出目录:`dist/`
---
## ⚙️ 环境配置
### 开发环境 (.env.development)
```env
# API 服务地址
VITE_API_URL = 'https://testbs.ihemodialysis.com/'
# WebSocket 地址
VITE_API_WSS = 'ws://testbs.ihemodialysis.com/broadcast'
# TTS 语音服务地址
VITE_TTS_URL = 'http://ikuai.m-iot.tech:62335/tts'
# 是否显示 Logo1=显示, 0=不显示)
VITE_SHOW_LOGO = '1'
```
### 生产环境 (.env.production)
```env
# 根据实际生产服务器地址配置
VITE_API_URL = 'https://bs.ihemodialysis.com/'
VITE_API_WSS = 'ws://bs.ihemodialysis.com/broadcast'
VITE_TTS_URL = 'http://ikuai.m-iot.tech:62335/tts'
```
### 环境变量加载
在代码中使用环境变量:
```typescript
// 获取 TTS 服务地址
const ttsUrl = import.meta.env.VITE_TTS_URL as string;
// 获取 API 地址
const apiUrl = import.meta.env.VITE_API_URL as string;
```
> **重要**:修改 `.env` 文件后需要重启开发服务器才能生效!
---
## 🎤 叫号系统详解
### 核心功能组件
#### 1. **叫号主页面** (`src/views/listCurrentHemoMeds/index.vue`)
该页面负责显示患者叫号信息,包含三个主要区域:
**左侧1/4 宽度)**
- 当前叫号:显示当前正在叫号的患者信息
- 已叫号患者:滚动显示已叫过号的患者列表
**右侧3/4 宽度)**
- 患者卡片列表:以卡片形式显示所有患者信息
- 支持 4 列响应式布局
- 已叫号患者显示为蓝色背景
**顶部**
- LOGO 和系统标题
- 日期时间显示
- 字体大小调整工具
#### 2. **叫号数据流**
```
WebSocket患者叫号事件
alertBody 函数处理事件
根据 大屏语音播报类型 选择播报方式
├── 0: 后端 TTS (ksjh0)
└── 1: 前端浏览器 TTS (ksjh1)
播放语音
等待播放完成
重置 UI 状态
```
#### 3. **两种语音播报方式**
**方式一:后端 TTS 服务 (ksjh0)**
```typescript
// 发送 FormData 到 TTS 服务
const params = new URLSearchParams();
params.append('text', `当前叫号 ${patientName},${deviceGroupName} ${bedJh.value}`);
params.append('lang', 'zh'); // 中文
params.append('spk_id', '0'); // 发音人 ID
params.append('rate', '+10%'); // 语速 (+10%)
params.append('vol', '6'); // 音量
const response = await fetch(ttsUrl, {
method: 'POST',
headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
body: params.toString(),
});
// 获取 WAV 音频,使用 HTML5 Audio 元素播放
const audioData = await response.arrayBuffer();
const audioBlob = new Blob([audioData], { type: 'audio/wav' });
// ... 播放逻辑
```
**方式二:前端浏览器 TTS (ksjh1)**
```typescript
// 使用 speak-tts 库进行本地语音合成
speech.value.speak({
text: `当前叫号 ${patientName},${deviceGroupName} ${bedJh.value}`,
rate: 10,
listeners: {
onstart: () => { /* 播放开始 */ },
onend: () => { /* 播放完成 */ },
},
});
```
#### 4. **状态管理关键变量**
| 变量名 | 类型 | 说明 |
|-------|------|------|
| `num` | ref | 0=空闲 1=播报中(防止重复播报) |
| `jhzhuangt` | ref | 显示/隐藏叫号大屏 |
| `xjzhuangtai` | ref | 显示/隐藏下机状态屏幕 |
| `patientNameJh` | ref | 当前叫号患者名 |
| `bedJh` | ref | 当前叫号患者床位 |
| `大屏语音播报类型` | ref | 0=后端TTS 1=前端TTS |
| `大屏展示数据脱敏` | ref | 是否脱敏显示患者信息 |
---
## 📡 API 接口
### 获取患者列表
**接口**`GET /api/listCurrentHemoMeds`
**参数**
```typescript
{
clientCode: string; // 机构代码
groupCode: string; // 分组代码(可选)
page: number; // 页码
size: number; // 每页条数
}
```
**响应**
```typescript
{
data: {
clientName: string; // 机构名称
大屏展示数据脱敏选项: 0 | 1; // 是否脱敏
大屏语音播报类型: 0 | 1; // 播报类型
rows: {
list: PatientInfo[]; // 患者列表
pages: number; // 总页数
total: number; // 总条数
endRow: number; // 当前行尾
};
已叫号列表: PatientInfo[]; // 已叫过号的患者
当前叫号列表: PatientInfo[]; // 当前叫号患者
}
}
```
### 获取时段媒体内容
**接口**`GET /api/listCurrentLcdMedia`
**参数**
```typescript
{
clientCode: string; // 机构代码
}
```
**响应**
```typescript
{
data: [
{
startHours: number; // 开始小时
endHours: number; // 结束小时
startMinutes: number; // 开始分钟
endMinutes: number; // 结束分钟
lcdMediaFilesList: [
{
filePath: string; // 文件路径
fileType: 'video' | 'image'; // 文件类型
}
];
}
]
}
```
### WebSocket 实时通信
**连接地址**:由 `VITE_API_WSS` 配置
**收到的事件格式**
```typescript
{
callType: '开始叫号' | '结束叫号' | '下机';
patientName: string; // 患者姓名
patPinyinCode: string; // 患者拼音代码(可选)
bedNo: string; // 床位号
deviceGroupName: string; // 设备分组名
}
```
---
## 🎯 使用场景
### 场景一:启动应用
1. 访问 `http://localhost:8888/?pagesize=10&clientCode=XXXXX`
2. 应用加载患者数据并显示
3. 与后端 WebSocket 建立连接
4. 等待患者叫号事件
### 场景二:接收叫号事件
1. WebSocket 接收 `callType='开始叫号'` 事件
2. 根据配置选择叫号方式后端TTS 或 前端TTS
3. 播放语音叫号
4. 显示全屏叫号大屏
5. 等待音频播放完成
6. 自动关闭大屏,重置 UI 状态
### 场景三:数据脱敏
如果后端返回 `大屏展示数据脱敏选项 = 1`,患者姓名将被脱敏处理:
```
原始:张三
脱敏Z三
```
---
## 🔍 常见问题
### Q1: 如何修改 TTS 服务地址?
编辑 `.env.development``.env.production`
```env
VITE_TTS_URL = 'http://your-tts-server:port/tts'
```
然后重启开发服务器。
### Q2: 语音播报没有声音?
1. 检查浏览器音量设置
2. 检查网络连接
3. 验证 TTS 服务地址是否正确
4. 查看浏览器控制台 (F12) 的错误信息
### Q3: 如何切换语音播报方式?
应用会自动根据后端返回的 `大屏语音播报类型` 字段选择:
- `0` = 使用后端 TTS 服务(推荐)
- `1` = 使用前端浏览器 TTS
后端无法配置时,联系管理员修改该配置。
### Q4: 如何调整叫号大屏的字体大小?
点击右下角 ⚙️ 工具图标,可调整:
- 叫号字体大小20-200px
- 已叫号字体大小20-200px
- 卡片字体大小20-100px
设置会保存到浏览器本地存储。
### Q5: 生产环境构建有什么注意事项?
```bash
# 生产构建
npm run build
# 生产构建前,需要确保:
# 1. .env.production 配置正确
# 2. 所有依赖已安装
# 3. 构建过程无错误
# 构建后生成 dist 目录,上传到服务器
```
---
## 📝 开发注意事项
### 1. 代码风格
使用 TypeScript 编写,遵循以下规范:
```typescript
// ✅ 推荐
const patientName: string = ref('');
const ksjh = async (patientName: string, bedNo: string): Promise<void> => {
// ...
};
// ❌ 避免
const patientName = ref('');
const ksjh = async (patientName, bedNo) => {
// ...
};
```
### 2. 组件更新
修改页面后会自动热更新HMR无需手动刷新浏览器。
### 3. 调试技巧
在浏览器控制台查看关键日志:
```javascript
// 查看当前 TTS URL
console.log('TTS URL:', ttsUrl);
// 查看 WebSocket 事件
console.log('WebSocket 事件:', data);
// 查看音频大小
console.log('音频数据大小:', audioData.byteLength);
```
---
## 🔐 安全建议
1. **不要在前端代码中暴露敏感信息**
- API 密钥应由后端管理
- 个人患者信息应启用脱敏显示
2. **CORS 跨域处理**
- TTS 服务需配置 CORS 头允许浏览器跨域请求
- 或在生产环境使用同域转发
3. **WebSocket 连接安全**
- 生产环境应使用 WSS加密WebSocket
- 验证连接身份
---
## 📞 支持和反馈
- **项目仓库**https://gitee.com/chenyincheng0624/pcWeb
- **技术栈**Vue 3 + Vite + TypeScript + Element Plus
- **原始模板**vue-next-admin
---
## 📄 许可证
MIT License
---
## 版本历史
| 版本 | 日期 | 说明 |
|-----|------|------|
| 1.0.0 | 2025-12-13 | 项目说明文档创建 |
---
**最后更新**2025-12-13
**项目名称**:胜透叫号系统 (listCurrentHemoMeds)
**版本**1.2.0