# 架構

本頁以一張圖呈現 go-web-monitor 各套件的層級關係，並列出每層的職責與跨層共用的設計原則。

## 系統概覽

```mermaid
graph TB
    Main[cmd/tui<br/>main] -->|util.Read / util.Save| Store[(.webMonitor.json)]
    Main -->|service.New| Monitor[service.Monitor]
    Main -->|service.NewUI| UI[service.UI]
    UI -->|Ticker 每分鐘 / refresh| Monitor
    UI -->|指令方法| Monitor
    Monitor -->|Check: HEAD → GET| Site[目標網站]
    Monitor -->|util.CheckExpire| TLS[目標網站 :443]
    Monitor -->|sendEmail / TestEmail| SMTP[service.SMTP]
    SMTP --> Mail[郵件伺服器]
    Monitor -->|Save| Store
```

## 分層

| 層 | 套件／檔案 | 職責 |
|----|-----------|------|
| 入口 | `cmd/tui/main.go` | 建立或讀取 `.webMonitor.json`，組裝 `Monitor` 與 `UI` 後執行 |
| 介面 | `internal/service/ui.go` | tview 介面、每分鐘排程、指令解析、表格與面板渲染 |
| 監控核心 | `internal/service/monitor.go` | 監控清單與狀態表、HTTP 探測、失敗計數、告警觸發、SMTP 設定管理 |
| 寄信 | `internal/service/smtp.go` | 依 port 選擇明文／隱式 TLS／STARTTLS，寄出 HTML 信件 |
| 工具 | `internal/util/` | JSON 設定檔讀寫、SSL 憑證剩餘天數 |
| 資料模型 | `internal/model/model.go` | `Website`、`Config`、`MonitorData` |

## 跨層原則

| 原則 | 實作 |
|------|------|
| 單一持久化檔案 | 所有狀態與設定都寫在當前目錄的 `.webMonitor.json`，沒有資料庫或外部服務 |
| 狀態集中於 Monitor | `UI` 不持有資料，只透過 `Monitor` 的 getter 與指令方法讀寫 |
| 共享狀態以 `sync.RWMutex` 保護 | `list`、`status`、`config`、`isShow` 由同一把鎖保護（覆蓋範圍不完整，見 [已知限制](/zh/known-limitations)） |
| 無外部相依的網路層 | HTTP、TLS、SMTP 全用標準庫；第三方套件只有 `tview` 與 `tcell` |

## 延伸閱讀

- 模組級完整圖（各模組內部、序列圖、狀態機）：[doc/architecture.zh.md](https://github.com/pardnchiu/go-web-monitor/blob/main/doc/architecture.zh.md)
- 每輪檢查的流程：[監控週期](/zh/monitoring-cycle)
