diff --git a/README.md b/README.md index df4ac0a..4db1bb0 100644 --- a/README.md +++ b/README.md @@ -1,80 +1,166 @@ -# 医院预约挂号小程序 +# 苏州肛泰中医院 · 预约挂号系统 -基于 **Taro 4.x + React + TypeScript** 的医院预约挂号小程序,配套 **Node.js + Express** 后端 API。 +基于 **Taro 4.x + React + TypeScript** 的微信小程序,配套 **Node.js + Express + MySQL** 后端 API 和运营管理后台。 + +线上地址:`https://y.szgtlive.com` ## 功能概览 -- 医院简介(轮播 Banner + 详细介绍 + 联系方式) -- 分栏展示:医院简介 / 科室设置 / 医院荣誉 -- 预约挂号:选择科室 → 选择医生 → 选择日期时段 → 填写姓名电话 -- 我的预约:查看列表 / 查看详情 / 取消预约 -- 预约成功页与温馨提示 +### 小程序端(5 个 TabBar 页 + 2 个二级页) + +- **首页**:医院名称(后台可配置)、三栏中心入口(独立图标图片 + 名称 + 预约咨询)、轮播 Banner +- **医院简介**:轮播图 + 医院详细介绍 + 联系方式 + 地址 +- **自助预约**:选择中心 → 填写姓名/电话/年龄/症状 → 选择预约日期 → 提交 +- **在线自测**:7 道问卷题 → 自动评分 → 提交为意向客户 +- **电话咨询**:直接拨打后台配置的咨询电话 +- **中心详情页**:名称 + 简介 → 立即预约/电话咨询按钮 → 配图 +- **预约成功页**:成功提示 + 返回首页 + +### 手机号授权(可开关) + +- 打开小程序时自动弹出手机号授权(微信官方 `getPhoneNumber`) +- 通过 Button `openType="getPhoneNumber"` 获取 code,后端调微信 API 解密手机号 +- 管理后台可控制开关、配置 AppID/AppSecret +- 同一手机号只创建一条意向客户记录,后续操作补充升级来源 + +### 位置采集(可开关) + +- 授权时可选采集模糊位置(`getFuzzyLocation` 到市级别) +- 管理后台显示地区名称(如"江苏省苏州市") +- 未开通时可关闭,关闭后不调用定位 API + +### 管理后台(单页应用) + +- **概览**:预约统计 + 最近预约列表 +- **首页内容**:轮播图管理 + 三中心管理(图标图片/配图/简介等) +- **医院简介**:简介文字 + 轮播图片管理 +- **系统设置**:医院名称、咨询电话、地址、微信手机号授权开关、AppID/AppSecret、高德 Key、位置采集开关、企业微信通知配置 +- **预约管理**:查看/确认/完成/取消/删除预约,搜索过滤 +- **意向客户**:查看客户列表、问卷详情(中文显示)、来源筛选 +- **账号设置**:修改密码 + +### 企业微信通知 + +- 新预约、新意向客户时自动推送 Markdown 消息到企业微信群 +- 支持多个 Webhook 地址(每行一个) +- 通知内容包含患者姓名、电话、科室、日期、症状等详情 +- 管理后台可发送测试通知 ## 目录结构 ``` . -├── src/ # 小程序前端(Taro + React + TS) -│ ├── pages/ # 5 个页面(3 tabBar + 2 二级页) -│ ├── components/ # 通用组件 -│ ├── services/ # API 请求封装 -│ ├── store/ # Zustand 状态 -│ ├── data/ # Mock 数据 -│ ├── types/ # TS 类型定义 -│ ├── styles/ # 全局样式 -│ └── utils/ # 工具函数 -├── server/ # Node.js 后端 API -│ ├── src/ -│ │ ├── routes/ # 业务路由 -│ │ ├── data.js # Mock 数据 -│ │ └── index.js # 入口 -│ ├── package.json -│ └── README.md -└── README.md +├── src/ # 小程序前端(Taro + React + TypeScript) +│ ├── pages/ # 页面 +│ │ ├── home/ # 首页 +│ │ ├── hospital/ # 医院简介 +│ │ ├── appointment/ # 自助预约 +│ │ ├── self-test/ # 在线自测 +│ │ ├── center/ # 中心详情 +│ │ ├── success/ # 预约成功 +│ │ ├── mine/ # 我的(保留) +│ │ └── phone-consult/ # 电话咨询占位 +│ ├── components/ # 通用组件(PhoneAuthModal 等) +│ ├── custom-tab-bar/ # 自定义 TabBar(第5个直接拨号) +│ ├── services/ # API 请求封装 +│ ├── types/ # TypeScript 类型定义 +│ ├── styles/ # 全局样式(theme/variables/compat) +│ └── utils/ # 工具函数 +├── server/ # Node.js 后端 API +│ └── src/ +│ ├── modules/ # 业务模块 +│ │ ├── adminAuth/ # 管理员认证 +│ │ ├── appointment/ # 预约 +│ │ ├── banner/ # 轮播图 +│ │ ├── center/ # 中心 +│ │ ├── config/ # 站点/首页配置 +│ │ ├── lead/ # 意向客户 +│ │ ├── notification/ # 企业微信通知 +│ │ ├── wechat/ # 微信手机号服务 +│ │ ├── upload/ # 文件上传 +│ │ └── ... # 其他模块 +│ ├── seeds/ # 种子数据 +│ ├── utils/ # 工具函数 +│ ├── schema.sql # 数据库表结构 +│ └── index.js # 入口 +├── admin/ # 运营管理后台(单页应用) +│ ├── index.html +│ ├── app.js +│ └── styles.css +├── scripts/ # 部署脚本 +├── dist/ # 构建产物(微信小程序) +└── project.config.json # 微信开发者工具配置 ``` ## 快速开始 -### 1. 小程序预览 +### 环境要求 -项目根目录已配置 Taro 模板,可直接通过 IDE 内的预览服务打开二维码,在微信开发者工具中扫码体验。 +- Node.js 18+ +- MySQL 8.0+ +- 微信开发者工具(最新稳定版) -### 2. 启动后端 +### 1. 后端 ```bash cd server npm install +# 创建数据库并导入 schema +mysql -u root -p < src/schema.sql +# 配置环境变量 +cp .env.example .env +# 编辑 .env 填写数据库连接信息 npm start # 监听 http://localhost:3000 ``` -## 后端 API +### 2. 小程序前端 -详见 [server/README.md](server/README.md)。 - -主要接口: -- `GET /api/hospitals` — 医院列表 -- `GET /api/departments` — 科室列表 -- `GET /api/doctors?departmentId=` — 医生列表 -- `POST /api/appointments` — 创建预约 -- `GET /api/appointments?phone=` — 我的预约 -- `PUT /api/appointments/:id/cancel` — 取消预约 - -## 小程序接入真实后端 - -修改 `src/services/request.ts` 中的 `BASE_URL`: - -```ts -const BASE_URL = 'http://localhost:3000'; +```bash +npm install +npm run build:weapp +# 用微信开发者工具打开 dist/ 目录 ``` -然后把 `src/services/*.ts` 中返回 mock 数据的函数改为调用 `request()`,并把 `src/data/*.ts` 删除即可完成对接。 +### 3. 管理后台 + +管理后台为静态文件,通过后端 Express 托管在 `/admin` 路径下,或通过 Nginx 单独部署。 + +访问 `https://y.szgtlive.com/admin/` 即可。 + +## 主要 API + +| 接口 | 说明 | +|------|------| +| `POST /api/v1/appointments` | 创建预约 | +| `GET /api/v1/appointments` | 预约列表 | +| `PUT /api/v1/appointments/:id/confirm` | 确认预约 | +| `PUT /api/v1/appointments/:id/complete` | 标记完成 | +| `PUT /api/v1/appointments/:id/cancel` | 取消预约 | +| `POST /api/v1/leads` | 提交意向客户 | +| `GET /api/v1/leads` | 意向客户列表 | +| `GET /api/v1/centers` | 中心列表 | +| `GET /api/v1/config/home` | 首页配置 | +| `GET /api/v1/config/site` | 站点配置 | +| `PUT /api/config/site` | 更新站点配置(管理员) | +| `POST /api/v1/wechat/phone` | 微信手机号解密 | +| `GET /api/v1/wechat/phone-required` | 手机号授权开关 | +| `POST /api/v1/notification/test` | 测试通知 | +| `POST /api/admin/auth/login` | 管理员登录 | ## 技术栈 -- 前端:Taro 4.1.9、React 18、TypeScript 5、Sass -- 后端:Node.js、Express 4、CORS +- **前端**:Taro 4.x、React 18、TypeScript 5、Sass +- **后端**:Node.js、Express 4、MySQL(mysql2/promise) +- **部署**:PM2 进程管理、Nginx 反向代理、HTTPS +- **通知**:企业微信 Webhook ## 数据存储 -当前为内存 Mock,重启服务后预约数据会清空。生产环境请替换为 MySQL / PostgreSQL / MongoDB 等持久化方案。 +MySQL 持久化存储,主要表: +- `centers` — 中心(含 icon_image 图标图片 + image 详情配图) +- `appointments` — 预约记录 +- `leads` — 意向客户(唯一约束 phone+source 去重) +- `home_config` — 首页配置 + 系统设置(JSON) +- `banners` / `hospital_images` / `hospital_intro` — 内容管理 +- `admins` — 管理员账号