From e51ada9d40bd0569b13c59a40411a97c9cdc1eda Mon Sep 17 00:00:00 2001 From: OpenClaw Agent Date: Tue, 15 Sep 2026 05:25:58 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E7=BB=9F=E4=B8=80=E5=BA=94=E7=94=A8?= =?UTF-8?q?=E5=90=8D=E4=B8=BA=E5=B7=A5=E6=97=B6=E6=89=93=E5=8D=A1=EF=BC=8C?= =?UTF-8?q?=E4=BC=98=E5=8C=96=E8=AE=BE=E7=BD=AE=E9=A1=B5=E4=B8=8E=E6=B3=A8?= =?UTF-8?q?=E5=86=8C=E7=99=BB=E5=BD=95=E4=BA=A4=E4=BA=92=EF=BC=8C=E5=8D=87?= =?UTF-8?q?=E7=BA=A7=E8=87=B3=20v1.0.1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 1 + README.md | 23 ++ android/app/build.gradle | 4 +- .../top/ouaone/workhours/MainActivity.java | 2 +- android/app/src/main/res/values/strings.xml | 2 +- index.html | 242 +++++++++++++++++- package.json | 2 +- sync.js | 10 +- verify_payroll.js | 1 + 9 files changed, 269 insertions(+), 18 deletions(-) diff --git a/.gitignore b/.gitignore index 65b20a3..8dc1abe 100644 --- a/.gitignore +++ b/.gitignore @@ -39,3 +39,4 @@ android/app/src/main/assets/www/* .DS_Store *.tmp *.apk +keystore-secure/ diff --git a/README.md b/README.md index 0ce8967..0dd4dc8 100644 --- a/README.md +++ b/README.md @@ -179,3 +179,26 @@ curl -s http://127.0.0.1:9522/api/health - 管理 API(登录态):`GET /api/mcp/status`(掩码)、`POST /api/mcp/token`(生成/重置,明文仅回一次)、 `GET /api/mcp/token`(复制用取回明文)、`POST /api/mcp/enabled` - 测试:`cd server && node --disable-warning=ExperimentalWarning test/mcp.test.js`(47 项,含多用户隔离验证) + +--- + +## 六、 Android 客户端与移动端打包 + +系统提供原生 Android 包装壳(WebView 容器,代码位于 `android/`),将 Web 资产打包至本地 `assets/www`,支持彻底离线断网运行与静默更新。 + +### 1. 原生功能特性 +- **纯本地离线优先 (Local-First)**:以 `file:///android_asset/www/index.html` 启动,无网络时本地打卡与薪酬核算 100% 完整可用。 +- **默认服务探活回退**:内置默认远程同步地址 `https://daka.kory.kdns.fr`,非 HTTP(S) 环境无需手动填写即可直接探活或注册/登录同步。 +- **沉浸式交互与返回拦截**:双击返回键安全退出防误触(提示「再按一次退出工时打卡」),状态栏与导航栏自适应沉浸。 +- **静态资源一键同步**:前端资产修改后,运行 `./android/copy-web-assets.sh` 即可自动同步至 Android 工程 assets 目录。 + +### 2. 本地与 CI/CD 自动构建 APK +- **本地编译**: + ```bash + cd android + ./gradlew assembleRelease + # 生成产物:android/app/build/outputs/apk/release/app-release-unsigned.apk + ``` +- **GitHub Actions 自动化发布**: + - 推送带 `v*` 格式的 Git Tag(如 `git tag v1.0.1 && git push github v1.0.1`)时,自动触发 `.github/workflows/build-apk.yml` 工作流。 + - 构建产物会自动签名并发布到 GitHub Releases,附带安装包与 SHA256 校验和。 diff --git a/android/app/build.gradle b/android/app/build.gradle index 7bdb060..b967ab8 100644 --- a/android/app/build.gradle +++ b/android/app/build.gradle @@ -10,8 +10,8 @@ android { applicationId "top.ouaone.workhours" minSdk 23 targetSdk 34 - versionCode 1 - versionName "1.0.0" + versionCode 2 + versionName "1.0.1" } signingConfigs { diff --git a/android/app/src/main/java/top/ouaone/workhours/MainActivity.java b/android/app/src/main/java/top/ouaone/workhours/MainActivity.java index f1eaea1..1383800 100644 --- a/android/app/src/main/java/top/ouaone/workhours/MainActivity.java +++ b/android/app/src/main/java/top/ouaone/workhours/MainActivity.java @@ -117,7 +117,7 @@ public class MainActivity extends AppCompatActivity { finish(); } else { lastBackPressTime = now; - Toast.makeText(MainActivity.this, "再按一次退出工时记账", Toast.LENGTH_SHORT).show(); + Toast.makeText(MainActivity.this, "再按一次退出工时打卡", Toast.LENGTH_SHORT).show(); } } }); diff --git a/android/app/src/main/res/values/strings.xml b/android/app/src/main/res/values/strings.xml index e339a42..cac06e0 100644 --- a/android/app/src/main/res/values/strings.xml +++ b/android/app/src/main/res/values/strings.xml @@ -1,3 +1,3 @@ - 工时记账 + 工时打卡 diff --git a/index.html b/index.html index 45887c2..83300a1 100644 --- a/index.html +++ b/index.html @@ -258,8 +258,8 @@
- -
+ +
{{ currentYear }}年{{ currentMonth + 1 }}月 @@ -267,9 +267,12 @@
- +
+
+ 系统设置 +
+
+ +
+

薪酬规则

+
+ + + +
+

满勤奖按「当月总工时 × 单价」计算,属于奖励,不并入当月工资。

+
+ +
+

奖惩标准

+
+ + +
+
+ +
+

发放周期

+
+ + + +
+

+ 1–{{ settings.cutoff }}日工时 → 当月{{ settings.payDayA }}号发;{{ settings.cutoff + 1 }}日–月底工时 + 当月奖惩 → 次月{{ settings.payDayB }}号一起发。 +

+
+ +
+

班次默认工时

+
+
+ 打卡默认班次 +
+ + +
+
+ + +
+

夜班跨天,工时全部归入开始打卡的那一天。

+
+ + +
+
+

云端同步

+ {{ syncStatusText }} +
+ + +
+
+ 当前账号 + {{ sync.user.username }} +
+
+ 最后同步 + {{ syncTimeText }} +
+
+

{{ sync.lastError }}

+
+ + + + + +
+ + +
+
+
+ + +
+
+
+ + +
+ + +
+
+

+ + + + +

+ +
+
+ + +
+
+

AI 接入 (MCP)

+ {{ mcpBadge.text }} +
+
+
+ 接入开关 + +
+
+ 访问令牌 + {{ mcp.masked }} +
+ + +
+

+ 端点 POST /mcp(Bearer 令牌鉴权),只读:AI 只能查询出勤、工时与薪酬,改不了任何数据。开关与令牌改动即时生效,无需重启;重置后旧客户端立即失效。 +

+
+ +
+

数据

+
+
+ 已存打卡记录 + {{ recordCount }} 天 +
+ + + + + + +
+
+ +

+ + +

+ + +
+ @@ -786,23 +992,33 @@
- +
+
+
+ + +
+
- -
- - +
+ +

- - + +