# 医院物业 SaaS 管理后台 — Windows 部署指南
> 本文档指导在 Windows Server / Windows 10/11 上完整部署本系统,包含 MariaDB、Redis、后端应用的安装与配置。
---
## 目录
1. [环境要求](#1-环境要求)
2. [安装 JDK 17](#2-安装-jdk-17)
3. [安装 MariaDB 10.6+](#3-安装-mariadb-106)
4. [安装 Redis for Windows](#4-安装-redis-for-windows)
5. [初始化数据库](#5-初始化数据库)
6. [编译打包](#6-编译打包)
7. [配置应用](#7-配置应用)
8. [启动应用](#8-启动应用)
9. [注册为 Windows 服务(开机自启)](#9-注册为-windows-服务开机自启)
10. [验证部署](#10-验证部署)
11. [防火墙配置](#11-防火墙配置)
12. [日常运维](#12-日常运维)
13. [常见问题](#13-常见问题)
---
## 1. 环境要求
| 组件 | 最低版本 | 推荐版本 | 说明 |
|------|----------|----------|------|
| 操作系统 | Windows Server 2016 / Win 10 | Windows Server 2019+ | 64 位 |
| JDK | 17 | 17 (Eclipse Temurin) | 不要用 JRE,需完整 JDK 编译 |
| Maven | 3.9+ | 3.9.x | 仅编译时需要 |
| MariaDB | 10.6 | 10.11 LTS | 兼容 MySQL 协议 |
| Redis | 6.0 | 7.x (Windows 移植版) | 缓存与权限广播 |
| 内存 | 4 GB | 8 GB+ | 后端默认 512MB JVM |
| 磁盘 | 10 GB | 50 GB+ | 含数据库与日志 |
---
## 2. 安装 JDK 17
### 2.1 下载安装
1. 访问 [Eclipse Temurin 下载页](https://adoptium.net/temurin/releases/?version=17)
2. 选择 **Windows x64 .msi** 安装包
3. 运行安装程序,勾选 **Set JAVA_HOME variable**
4. 默认安装路径:`C:\Program Files\Eclipse Adoptium\jdk-17.x.x.x-hotspot`
### 2.2 验证
```powershell
java -version
# 输出应包含 openjdk version "17.x.x"
echo $env:JAVA_HOME
# 应输出 JDK 安装路径
```
### 2.3 手动配置环境变量(如安装时未自动配置)
1. 右键 **此电脑** → **属性** → **高级系统设置** → **环境变量**
2. 新建系统变量:
- 变量名:`JAVA_HOME`
- 变量值:`C:\Program Files\Eclipse Adoptium\jdk-17.x.x.x-hotspot`
3. 编辑 `Path`,添加:`%JAVA_HOME%\bin`
---
## 3. 安装 MariaDB 10.6+
### 3.1 下载安装
1. 访问 [MariaDB 下载页](https://mariadb.org/download/)
2. 选择 **Windows x86_64 MSI** 安装包
3. 运行安装程序:
- 设置 root 密码(本例使用 `root`)
- 勾选 **Enable networking**(端口 3306)
- 字符集选择 **UTF-8 (utf8mb4)**
- 勾选 **Install as Windows Service**,服务名 `MySQL`(MariaDB 默认服务名)
### 3.2 验证
```powershell
# 使用完整路径(根据实际安装版本调整)
& "C:\Program Files\MariaDB 10.3\bin\mysql.exe" -uroot -proot -e "SELECT VERSION();"
```
### 3.3 配置字符集(如安装时未设置)
编辑 MariaDB 配置文件 `C:\ProgramData\MariaDB\data\my.ini`(或安装目录下的 `my.ini`),在 `[mysqld]` 段添加:
```ini
[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
[client]
default-character-set = utf8mb4
[mysql]
default-character-set = utf8mb4
```
修改后重启服务:
```powershell
Restart-Service MySQL
```
---
## 4. 安装 Redis for Windows
Redis 官方不提供 Windows 版本,需使用社区移植版。
### 方案 A:使用 Memurai(推荐,商用需授权)
1. 访问 [Memurai 官网](https://www.memurai.com/get-memurai) 下载安装
2. 安装后自动注册为 Windows 服务,默认端口 6379
### 方案 B:使用 tporadowski/redis-portable
1. 访问 [GitHub Releases](https://github.com/tporadowski/redis/releases) 下载 `.msi` 安装包
2. 安装时勾选 **Add to PATH** 和 **Install as Windows Service**
3. 默认端口 6379,无密码
### 方案 C:使用 WSL2 运行原生 Redis
```powershell
# 在 WSL2 Ubuntu 中
sudo apt update && sudo apt install redis-server -y
sudo sed -i 's/^bind .*/bind 0.0.0.0/' /etc/redis/redis.conf
sudo service redis-server start
# 验证(Windows 侧连接 WSL 的 Redis)
redis-cli -h $(wsl hostname -I | ForEach-Object { $_.Trim() }) ping
```
### 验证 Redis
```powershell
# 如果安装了 redis-cli
redis-cli ping
# 应输出 PONG
```
---
## 5. 初始化数据库
### 5.1 执行建表脚本
```powershell
# 进入项目目录
cd D:\git\git\医院后勤管理
# 执行初始化脚本(根据 MariaDB 实际安装路径调整)
& "C:\Program Files\MariaDB 10.3\bin\mysql.exe" -uroot -proot --default-character-set=utf8mb4 -e "source D:/git/git/医院后勤管理/backend/src/main/resources/db/init.sql"
```
### 5.2 验证
```powershell
& "C:\Program Files\MariaDB 10.3\bin\mysql.exe" -uroot -proot --default-character-set=utf8mb4 hospital_mgmt -e "SHOW TABLES; SELECT id, username, user_type FROM sys_user;"
```
应看到 48 张表和一条 `superadmin` 初始管理员记录。
---
## 6. 编译打包
### 6.1 安装 Maven
1. 访问 [Maven 下载页](https://maven.apache.org/download.cgi)
2. 下载 **Binary zip archive** (`apache-maven-3.9.x-bin.zip`)
3. 解压到 `C:\apache-maven-3.9.x`
4. 添加环境变量:
- 新建 `MAVEN_HOME` = `C:\apache-maven-3.9.x`
- 在 `Path` 中添加 `%MAVEN_HOME%\bin`
验证:
```powershell
mvn -version
# 应输出 Maven 3.9.x + Java 17
```
### 6.2 编译打包
```powershell
cd D:\git\git\医院后勤管理\backend
# 编译打包(跳过测试,生产部署前建议先跑测试)
mvn clean package -DskipTests
# 生成的 jar 包位置
# backend\target\hospital-mgmt-1.0.0.jar
```
### 6.3 部署目录结构
建议创建独立部署目录:
```powershell
# 创建部署目录
New-Item -ItemType Directory -Path "C:\hospital-mgmt" -Force
New-Item -ItemType Directory -Path "C:\hospital-mgmt\logs" -Force
New-Item -ItemType Directory -Path "C:\hospital-mgmt\config" -Force
# 复制 jar 包
Copy-Item "D:\git\git\医院后勤管理\backend\target\hospital-mgmt-1.0.0.jar" "C:\hospital-mgmt\app.jar"
```
---
## 7. 配置应用
### 7.1 创建外部配置文件
在 `C:\hospital-mgmt\config\` 下创建 `application-prod.yml`:
```yaml
server:
port: 8080
servlet:
context-path: /api/v1
spring:
datasource:
driver-class-name: org.mariadb.jdbc.Driver
url: jdbc:mariadb://localhost:3306/hospital_mgmt?useUnicode=true&characterEncoding=utf8mb4&serverTimezone=Asia/Shanghai
username: root
password: root # 修改为实际密码
hikari:
maximum-pool-size: 20
minimum-idle: 10
idle-timeout: 600000
max-lifetime: 1800000
data:
redis:
host: localhost
port: 6379
password: # 如 Redis 设置了密码,在此填写
lettuce:
pool:
max-active: 16
max-idle: 8
min-idle: 4
mybatis-plus:
configuration:
map-underscore-to-camel-case: true
global-config:
db-config:
id-type: assign_id
logic-delete-field: deleted
logic-delete-value: 1
logic-not-delete-value: 0
mapper-locations: classpath*:mapper/**/*.xml
jwt:
secret: your-production-jwt-secret-at-least-32-chars-long # 生产环境务必修改!
expiration: 7200
refresh-expiration: 604800
permission:
redis-channel: permission:changed
async:
pool:
core-size: 4
max-size: 8
queue-capacity: 1000
upload:
max-size: 20
springdoc:
api-docs:
path: /swagger-docs
swagger-ui:
path: /swagger-ui.html
logging:
level:
com.hospital.mgmt: INFO
file:
name: C:/hospital-mgmt/logs/hospital-mgmt.log
logback:
rollingpolicy:
max-file-size: 50MB
max-history: 30
```
### 7.2 关键配置项说明
| 配置项 | 说明 | 默认值 | 生产建议 |
|--------|------|--------|----------|
| `spring.datasource.password` | 数据库密码 | root | 使用强密码 |
| `spring.data.redis.password` | Redis 密码 | (空) | 建议设置 |
| `jwt.secret` | JWT 签名密钥 | (内置默认) | **必须修改**,至少32字符 |
| `jwt.expiration` | Token 有效期(秒) | 7200 (2h) | 按需调整 |
| `logging.file.name` | 日志文件路径 | (控制台) | 指定文件路径 |
| `spring.datasource.hikari.maximum-pool-size` | 最大连接数 | 20 | 根据并发量调整 |
---
## 8. 启动应用
### 8.1 命令行前台启动(测试用)
```powershell
cd C:\hospital-mgmt
java -Xms256m -Xmx512m -XX:+UseG1GC ^
-Dspring.config.additional-location=file:./config/ ^
-Dspring.profiles.active=prod ^
-jar app.jar
```
看到以下日志表示启动成功:
```
Started HospitalMgmtApplication in x.xxx seconds
```
### 8.2 后台启动
```powershell
Start-Process -FilePath "java" `
-ArgumentList "-Xms256m","-Xmx512m","-XX:+UseG1GC","-Dspring.config.additional-location=file:./config/","-Dspring.profiles.active=prod","-jar","app.jar" `
-WorkingDirectory "C:\hospital-mgmt" `
-WindowStyle Hidden `
-RedirectStandardOutput "C:\hospital-mgmt\logs\startup.log" `
-RedirectStandardError "C:\hospital-mgmt\logs\startup-error.log"
```
---
## 9. 注册为 Windows 服务(开机自启)
推荐使用 [WinSW](https://github.com/winsw/winsw) 将 Java 应用注册为 Windows 服务。
### 9.1 下载 WinSW
1. 从 [WinSW Releases](https://github.com/winsw/winsw/releases) 下载 `WinSW-x64.exe`
2. 重命名为 `hospital-mgmt-service.exe`
3. 复制到 `C:\hospital-mgmt\`
### 9.2 创建服务配置文件
在 `C:\hospital-mgmt\` 下创建 `hospital-mgmt-service.xml`:
```xml
hospital-mgmt
Hospital Management Backend
医院物业 SaaS 管理后台后端服务
%JAVA_HOME%\bin\java.exe
-Xms256m -Xmx512m -XX:+UseG1GC -Dspring.config.additional-location=file:./config/ -Dspring.profiles.active=prod -jar app.jar
C:\hospital-mgmt
C:\hospital-mgmt\logs\service
10240
5
5 minutes
Automatic
MariaDB
```
> **注意**:`` 中的 `MariaDB` 需与实际 MariaDB Windows 服务名一致。可通过 `Get-Service *maria*,*mysql*` 查看服务名。
### 9.3 安装并启动服务
```powershell
# 以管理员身份运行
cd C:\hospital-mgmt
# 安装服务
.\hospital-mgmt-service.exe install
# 启动服务
.\hospital-mgmt-service.exe start
# 查看状态
.\hospital-mgmt-service.exe status
# 或使用 Windows 命令
Get-Service hospital-mgmt
```
### 9.4 常用服务管理命令
```powershell
# 停止
.\hospital-mgmt-service.exe stop
# 卸载
.\hospital-mgmt-service.exe uninstall
# 重启
.\hospital-mgmt-service.exe restart
```
---
## 10. 验证部署
### 10.1 检查应用状态
```powershell
# 检查服务是否运行
Get-Service hospital-mgmt
# 检查端口是否监听
netstat -ano | findstr :8080
# 测试 API 健康检查
Invoke-RestMethod -Uri "http://localhost:8080/api/v1/swagger-docs" -Method Head
```
### 10.2 检查数据库连接
```powershell
& "C:\Program Files\MariaDB 10.3\bin\mysql.exe" -uroot -proot hospital_mgmt -e "SELECT COUNT(*) AS table_count FROM information_schema.tables WHERE table_schema='hospital_mgmt';"
```
### 10.3 检查 Redis 连接
```powershell
redis-cli ping
# PONG
```
### 10.4 访问 Swagger UI
浏览器打开:`http://localhost:8080/api/v1/swagger-ui.html`
### 10.5 测试登录
```powershell
# 使用默认管理员账号登录
$body = @{
username = "superadmin"
password = "admin123"
} | ConvertTo-Json
Invoke-RestMethod -Uri "http://localhost:8080/api/v1/auth/login" -Method Post -Body $body -ContentType "application/json"
```
---
## 11. 防火墙配置
如果需要从其他机器访问,需开放端口:
```powershell
# 以管理员身份运行
# 开放后端 API 端口
New-NetFirewallRule -DisplayName "Hospital Mgmt API" -Direction Inbound -Protocol TCP -LocalPort 8080 -Action Allow
# 开放 MariaDB 端口(如需远程访问数据库)
New-NetFirewallRule -DisplayName "MariaDB" -Direction Inbound -Protocol TCP -LocalPort 3306 -Action Allow
# 开放 Redis 端口(如需远程访问,不建议)
# New-NetFirewallRule -DisplayName "Redis" -Direction Inbound -Protocol TCP -LocalPort 6379 -Action Allow
```
> **安全建议**:Redis 和 MariaDB 端口不应对外网开放,仅后端应用本机访问即可。
---
## 12. 日常运维
### 12.1 日志位置
| 日志 | 路径 |
|------|------|
| 应用日志 | `C:\hospital-mgmt\logs\hospital-mgmt.log` |
| WinSW 服务日志 | `C:\hospital-mgmt\logs\service\` |
| MariaDB 日志 | MariaDB 安装目录 `data\*.err` |
| Redis 日志 | Redis 安装目录或 Windows 事件日志 |
### 12.2 日志清理
应用日志默认保留 30 天(通过 logback 配置)。如需手动清理:
```powershell
# 删除 30 天前的日志
Get-ChildItem "C:\hospital-mgmt\logs\" -Recurse -File |
Where-Object { $_.LastWriteTime -lt (Get-Date).AddDays(-30) } |
Remove-Item -Force
```
### 12.3 数据库备份
```powershell
# 创建备份目录
New-Item -ItemType Directory -Path "C:\hospital-mgmt\backups" -Force
# 执行备份
$timestamp = Get-Date -Format "yyyyMMdd_HHmmss"
& "C:\Program Files\MariaDB 10.3\bin\mysqldump.exe" -uroot -proot --default-character-set=utf8mb4 --single-transaction hospital_mgmt > "C:\hospital-mgmt\backups\hospital_mgmt_$timestamp.sql"
```
可配合 Windows 任务计划程序实现自动备份:
```powershell
# 创建每天凌晨2点的备份任务
$action = New-ScheduledTaskAction -Execute "powershell.exe" -Argument "-File C:\hospital-mgmt\backup.ps1"
$trigger = New-ScheduledTaskTrigger -Daily -At 2am
Register-ScheduledTask -TaskName "HospitalMgmt-DB-Backup" -Action $action -Trigger $trigger -User "SYSTEM" -RunLevel Highest
```
### 12.4 应用更新
```powershell
# 1. 停止服务
cd C:\hospital-mgmt
.\hospital-mgmt-service.exe stop
# 2. 备份旧版本
Copy-Item "app.jar" "app.jar.bak" -Force
# 3. 替换 jar 包
Copy-Item "D:\git\git\医院后勤管理\backend\target\hospital-mgmt-1.0.0.jar" "app.jar" -Force
# 4. 启动服务
.\hospital-mgmt-service.exe start
# 5. 验证
Get-Service hospital-mgmt
```
---
## 13. 常见问题
### Q1: 启动报错 `Communications link failure`(数据库连接失败)
**排查步骤**:
1. 确认 MariaDB 服务正在运行:`Get-Service MySQL`
2. 确认端口可达:`Test-NetConnection localhost -Port 3306`
3. 确认用户名密码正确:`mysql -uroot -proot -e "SELECT 1;"`
4. 检查配置文件中 `spring.datasource.url` 是否正确
### Q2: 启动报错 `Unable to connect to Redis`(Redis 连接失败)
**排查步骤**:
1. 确认 Redis 服务运行:`Get-Service *redis*`
2. 测试连接:`redis-cli ping`
3. 如 Redis 设置了密码,确认 `spring.data.redis.password` 配置正确
4. 如使用 WSL2 运行 Redis,需将 `spring.data.redis.host` 改为 WSL 的 IP 地址
### Q3: 端口 8080 被占用
```powershell
# 查找占用进程
netstat -ano | findstr :8080
# 结束进程(替换 PID)
taskkill /PID /F
# 或修改应用端口
# 在 application-prod.yml 中修改 server.port
```
### Q4: JVM 内存不足
编辑 `hospital-mgmt-service.xml` 中的 `` 部分,增大内存:
```
-Xms512m -Xmx1024m
```
### Q5: 日志中文乱码
1. 确保 Windows 系统区域设置支持 UTF-8:
- **设置** → **时间和语言** → **语言和区域** → **管理语言设置** → **更改系统区域设置** → 勾选 **Beta: 使用 Unicode UTF-8 提供全球语言支持**
2. 重启电脑
### Q6: 服务启动后立即停止
1. 查看服务日志:`C:\hospital-mgmt\logs\service\`
2. 查看应用日志:`C:\hospital-mgmt\logs\hospital-mgmt.log`
3. 手动前台启动排查:`java -jar app.jar -Dspring.profiles.active=prod`
### Q7: MariaDB 服务名与 WinSW 配置不一致
```powershell
# 查看实际 MariaDB 服务名
Get-Service | Where-Object { $_.Name -match "maria|mysql" }
# 修改 hospital-mgmt-service.xml 中 为实际服务名
# 例如:MySQL 或 MariaDB10
```
---
## 附录:一键部署脚本
将以下内容保存为 `C:\hospital-mgmt\deploy.ps1`,可快速完成部署:
```powershell
# ============================================
# 医院物业 SaaS 管理后台 - Windows 一键部署脚本
# 使用方式: 以管理员身份运行 PowerShell
# .\deploy.ps1
# ============================================
$ErrorActionPreference = "Stop"
# ---- 配置区 ----
$ProjectDir = "D:\git\git\医院后勤管理"
$DeployDir = "C:\hospital-mgmt"
$MariaDBPath = "C:\Program Files\MariaDB 10.3\bin"
$DbUser = "root"
$DbPass = "root"
$DbName = "hospital_mgmt"
Write-Host "===== 医院物业 SaaS 管理后台 - 部署开始 =====" -ForegroundColor Cyan
# 1. 创建部署目录
Write-Host "[1/6] 创建部署目录..." -ForegroundColor Yellow
New-Item -ItemType Directory -Path $DeployDir -Force | Out-Null
New-Item -ItemType Directory -Path "$DeployDir\logs" -Force | Out-Null
New-Item -ItemType Directory -Path "$DeployDir\config" -Force | Out-Null
New-Item -ItemType Directory -Path "$DeployDir\backups" -Force | Out-Null
# 2. 编译打包
Write-Host "[2/6] 编译打包..." -ForegroundColor Yellow
Push-Location "$ProjectDir\backend"
mvn clean package -DskipTests -q
if ($LASTEXITCODE -ne 0) { throw "Maven 打包失败" }
Pop-Location
# 3. 复制文件
Write-Host "[3/6] 复制文件..." -ForegroundColor Yellow
Copy-Item "$ProjectDir\backend\target\hospital-mgmt-1.0.0.jar" "$DeployDir\app.jar" -Force
# 4. 初始化数据库
Write-Host "[4/6] 初始化数据库..." -ForegroundColor Yellow
$mysqlExe = "$MariaDBPath\mysql.exe"
if (Test-Path $mysqlExe) {
& $mysqlExe -u$DbUser -p$DbPass --default-character-set=utf8mb4 -e "source $($ProjectDir -replace '\\','/')/backend/src/main/resources/db/init.sql"
Write-Host " 数据库初始化完成" -ForegroundColor Green
} else {
Write-Host " 警告: 未找到 mysql.exe ($mysqlExe),请手动执行 init.sql" -ForegroundColor Red
}
# 5. 复制配置文件(如不存在)
Write-Host "[5/6] 配置文件..." -ForegroundColor Yellow
if (-not (Test-Path "$DeployDir\config\application-prod.yml")) {
Copy-Item "$ProjectDir\backend\src\main\resources\application-prod.yml" "$DeployDir\config\application-prod.yml"
Write-Host " 已复制默认生产配置,请检查并修改!" -ForegroundColor Yellow
} else {
Write-Host " 配置文件已存在,跳过" -ForegroundColor Green
}
# 6. 完成提示
Write-Host "[6/6] 部署完成!" -ForegroundColor Green
Write-Host ""
Write-Host "===== 下一步操作 =====" -ForegroundColor Cyan
Write-Host "1. 编辑配置文件: $DeployDir\config\application-prod.yml"
Write-Host "2. 前台测试启动:"
Write-Host " cd $DeployDir"
Write-Host " java -Xms256m -Xmx512m -Dspring.config.additional-location=file:./config/ -Dspring.profiles.active=prod -jar app.jar"
Write-Host "3. 注册为 Windows 服务(需下载 WinSW):"
Write-Host " .\hospital-mgmt-service.exe install"
Write-Host "4. 访问 Swagger: http://localhost:8080/api/v1/swagger-ui.html"
Write-Host "5. 默认管理员: superadmin / admin123"
Write-Host ""
Write-Host "===== 部署结束 =====" -ForegroundColor Cyan
```
---
## 默认账号
| 角色 | 用户名 | 密码 |
|------|--------|------|
| 超级管理员 | superadmin | admin123 |
> **生产环境务必修改默认密码和 JWT 密钥!**