Thanks to visit codestin.com
Credit goes to github.com

Skip to content

feat: iLife798接水功能#125

Merged
BenderBlog merged 26 commits into
BenderBlog:mainfrom
A1nair:feature/dorm-water
Mar 28, 2026
Merged

feat: iLife798接水功能#125
BenderBlog merged 26 commits into
BenderBlog:mainfrom
A1nair:feature/dorm-water

Conversation

@A1nair
Copy link
Copy Markdown
Contributor

@A1nair A1nair commented Mar 24, 2026

改动预览

核心改动:

  • 新增宿舍水机主页面与扫码页:lib/page/dorm_water/dorm_water_window.dart
  • 新增宿舍水机仓储层 API:lib/repository/dorm_water_session.dart
  • 首页工具箱新增入口卡片
    • lib/page/homepage/toolbox/dorm_water_card.dart
    • ``lib/page/homepage/homepage.dart`
  • 新增凭证持久化字段:lib/repository/preference.dart
  • 增加多语言文案:
    zh_CN.yaml
    zh_TW.yaml
    en_US.yaml
  • 引入扫码依赖:
    lib/repository/preference.dart

页面设计

lib/page/dorm_water/dorm_water_window.dart

1) 登录页(宿舍水机)

  • 输入项:手机号、图形验证码、短信验证码
  • 验证码区域支持点击刷新
  • 双按钮操作:发送短信码 + 登录
  • 异常与成功反馈统一使用 toast

2) 设备列表页

  • 三态渲染:加载中 / 加载失败 / 空列表 / 正常列表
  • 每个设备提供:
    • 收藏移除(星标)
    • 启动/停止接水(播放/停止图标)
  • 顶部 AppBar 提供:
    • 二维码扫码添加设备 (mobile_scanner)
    • 退出登录

3) 扫码页

  • 使用 mobile_scanner 实时扫码
  • 自动提取二维码 URL 最后段作为设备 ID
  • 扫码成功后返回上一页并触发“添加收藏设备”

API

lib/repository/dorm_water_session.dart

Base URL:https://i.ilife798.com

接口划分:

  • 验证码与登录
    • GET /api/v1/captcha/ -> getCaptcha()
    • POST /api/v1/acc/login/code -> sendSmsCode()
    • POST /api/v1/acc/login -> login()
  • 设备与控制
    • GET /api/v1/ui/app/master -> getDeviceList()
    • GET /api/v1/dev/favo -> toggleDeviceFavorite()
    • GET /api/v1/dev/start -> startWater()
    • GET /api/v1/dev/end -> endWater()
    • GET /api/v1/ui/app/dev/status -> checkDeviceStatus()

鉴权与会话:

  • 登录成功后持久化 token/uid/eid -> preference.dart
  • 业务请求使用 Authorization: token
  • 短信发送依赖验证码阶段生成的 session_currentSessionId

平台兼容:

  • 根据平台区分 User-Agent,适配 Android / iOS 请求特征。
  • 瑕疵:没有抓到Android端获取数字验证码的ua,可改进。

功能设计

主流程

  1. 首页工具箱点击“宿舍水机”进入模块
  2. 首次进入加载验证码并校验本地 token 登录态
  3. 输入图形码发送短信,输入短信码完成登录
  4. 拉取收藏设备列表并展示
  5. 对设备执行启停接水;启动后进入状态轮询
  6. 支持扫码新增收藏设备、移除收藏、退出登录

状态轮询策略

位置:lib/page/dorm_water/dorm_water_window.dart

策略说明:

  • 每秒轮询一次,最多 60 次
  • 设备状态连续 3 次为 99 才判定真正结束,降低瞬时抖动误判
  • 超时后自动收敛状态并给出提示

i18n

  • 新增 dorm_water.* 全量文案键(中简/中繁/英文)
  • 首页工具箱新增文案键 homepage.toolbox.dorm_water
  • 统一 toast 反馈关键行为(发送、登录、拉取、启停、收藏变更)

A1nair added 25 commits March 20, 2026 15:46
- add `DormWaterCard` to homepage small-function grid
- add `DormWaterWindow` as placeholder page
- add i18n key for dorm water card title
Add complete water dispensing control flow with robust state synchronization:

Features:
- Start/end water dispensing via API with user feedback
- Real-time device status polling (1-second interval, max 60 seconds)
- Consecutive status detection (requires 3x status==99) to prevent
  network fluctuations from causing false "device ready" signals
- Direct play/stop icon toggle on device card for better UX
- Automatic state cleanup and counter reset on water operations

UI/UX Improvements:
- Remove modal dialog approach, now using inline card button control
- Play icon → Stop icon during water dispensing
- Real-time status feedback via toast notifications
- Support for 3 languages with 9 new i18n strings

Robustness:
- Handles network interruptions gracefully (retries polling)
- Mounted widget checks to prevent setState after unmount
- Timeout protection (60 seconds max polling duration)
- Proper state synchronization between UI and backend device status
Implement platform detection and custom User-Agent headers for all dorm water
API requests to comply with backend requirements.

Changes:
- Add platform detection via dart:io Platform
- Implement _getUserAgent() method with platform-specific UA strings:
  - iOS captcha: iLife798/3.1.1 (iPhone; iOS 26.2; Scale/3.00)
  - iOS others: iOS_ilife798_3.1.1
  - Android all: Android_ilife798_2.0.11
  - Other platforms: default to iOS UA
- Add User-Agent header to all 6 API requests:
  - getCaptcha() - uses special captcha UA
  - sendSmsCode(), login(), getDeviceList()
  - startWater(), endWater(), checkDeviceStatus()
…agement

- Integrate mobile_scanner for native QR code scanning
- Implement toggleDeviceFavorite() API method in DormWaterSession
- Create _QrCodeScannerPage with camera and torch toggle
- Extract device ID from QR code URL format (https://i.hnkzy.com/q/1/{did})
- Add scan QR code button in AppBar (qrcode_line icon left of logout)
- Auto-add scanned devices to favorites and refresh device list
- Add i18n strings: scan_qr_code, device_id, add_device_failed
- Support zh_CN, en_US, zh_TW languages
- Lower mobile_scanner version to resolve MLKit pod conflicts
…vorites

- Change _loadDevices() call to setState with removeWhere
- Only remove the unfavorited device from list instead of full refresh
- Keep user on the dorm water page after unfavoriting
- Improve UX by avoiding unnecessary navigation
super.initState();
_session = DormWaterSession();
_checkLoginStatus();
_loadCaptcha();
Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

考虑把这个函数扔到 didChangeDependencies,initState 里面不要执行 setState()

}

// Format: https://i.hnkzy.com/q/1/{did}
String deviceId = text;
Copy link
Copy Markdown
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

加一个判断,万一不是 hnkzy.com

- Move `_loadCaptcha` from `initState` to `didChangeDependencies` to follow lifecycle best practices.
- Add domain validation for `hnkzy.com` in QR code scanner to prevent processing invalid links.
@BenderBlog BenderBlog merged commit 9d27e20 into BenderBlog:main Mar 28, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants