## 更新记录

> 说明：本文件用于记录每次客户端代码层面的更新内容，按时间倒序排列。

---

### 2026-01-29

- **挖矿任务持久化重构（替换 SQLite 为本地日志文件）**
  - 移除 `sqflite_common_ffi` 及 SQLite 依赖，避免在 Windows / Linux 环境下对系统 `libsqlite3` 的安装要求。
  - `DatabaseService` 改为基于 `bin/mining_tasks.log` 的 JSON 行存储：
    - 新挖矿任务创建时追加写入 `.log`；
    - 挖矿任务完成后，从 `.log` 中删除对应记录；
    - 客户端启动时读取 `.log`，仅保留未过期任务，并自动恢复最新一条未完成的挖矿任务。

- **退出流程优化**
  - 新增 `ClientProvider.shutdown()`，在点击“退出程序”时：
    - 停止与服务器的连接和心跳；
    - 停止当前挖矿进程和持续挖矿任务；
    - 关闭自动刷新定时器，确保退出后不会残留后台矿工进程。

- **文档与多平台说明**
  - README 中补充了“持续挖矿中”状态标识（蓝色指示灯）及 `bin/mining_tasks.log` 的作用说明。
  - 增加 Linux 构建脚本（`build_linux.sh`）和运行脚本（`start_linux_app.sh`）的使用说明，支持在 Linux 环境下一键安装依赖并运行客户端。

### 2026-01-23

- **网络与构建相关**
  - 配置 Flutter 使用国内镜像源（`PUB_HOSTED_URL` / `FLUTTER_STORAGE_BASE_URL`），解决 `pub.dev` 访问失败问题。
  - 清理并修复 Windows 构建缓存（CMake 路径不一致导致的构建失败）。
  - 排查 `sqlite3` 原生资产构建失败的原因（无法访问 GitHub 下载预编译库），为后续在有外网环境下构建做准备。

- **数据库与路径**
  - 移除未使用的 `package:path/path.dart` 导入，database 层统一通过 `PathUtils.binFile` 处理路径。

- **重连与认证逻辑**
  - `ClientCore`：
    - 为 TCP 连接新增**指数退避重连策略**：10s、20s、40s、80s、160s，最多重试 5 次，并在连接成功后重置重试次数。
    - 在连接错误、连接关闭和心跳超时（超过 60 分钟未收到 ping）时触发重连。
    - **重连成功后自动发送 `auth.machineCode` 认证消息**（在已成功获取机器码和身份信息的前提下）。

- **持续挖矿（SustainMiner）**
  - 从 `mining.windows.conf` 的 `[sustain]` 段读取配置，校验必填字段与矿工程序路径。
  - 当没有租约任务时自动启动持续挖矿，有租约任务到来时暂停，租约结束后自动恢复持续挖矿。
  - 新增持续挖矿进程监控：
    - 监听矿工进程退出事件，如果在持续挖矿运行且未暂停的情况下进程意外退出，5 秒后自动重启持续挖矿。

- **状态与 UI 展示**
  - `ClientStatus`：
    - 新增 `sustainingMining` 状态，用于表示“持续挖矿中”，在界面上显示为**蓝色圆点 + 文案「持续挖矿中」**。
  - `ClientProvider`：
    - 根据是否有租约任务 / 持续挖矿任务，区分显示：
      - `mining`：租约挖矿中。
      - `sustainingMining`：持续挖矿中。
    - 统一通过 `_getMiningInfo()` 构造当前挖矿信息（支持租约挖矿和持续挖矿），供界面展示。
  - `MainScreen`：
    - “挖矿信息”按钮在以下状态下可用：`ClientStatus.mining` 或 `ClientStatus.sustainingMining`，并且存在 `miningInfo`。
    - 点击后进入同一套挖矿信息界面。
  - `MiningInfoScreen`：
    - 复用同一界面展示日志和当前任务信息。
    - 当为**持续挖矿**时，不再显示“结束时间”和“剩余时间”区域，仅展示基本任务信息和日志。

