feat(0.2.0): 待办同步、事件标记、反馈系统迁移、版本升 0.2.0 #5 #6

## 版本
versionCode 10200 / versionName 0.2.0(原 10000 / 0.1.0)

## 新增
- **VTODO 待办完整支持**:同步、展示、勾选完成、编辑、循环待办。
  关键修复:待办此前**从未被同步过** —— 同步主循环只处理 VEVENT,
  `DavClient.reportTodos()` 写了却零调用(死代码)。现已在
  `SyncEngine.syncAccountInner` 接入,并对未知类型本也拉一次
  (服务器多半不声明 supported-calendar-component-set,宁多拉不漏)。
  整段包 try/catch,单本失败不影响日程同步。
- **日历本类型图标**:`supported-calendar-component-set` 解析出
  event/todo/both/unknown,账号页在颜色前显示对应 SVG 图标。
  unknown 按日历对待(服务器不声明时不能武断判成待办)。
- **问题反馈入口**:设置页新增卡片,指向 FeedLite
  (https://feedlite.yangyq.net/?sw=synccalendar)。

## 改进
- 月视图事件标记:农历下方浅红点,每日期最多一个
- 选中/今天改为正圆底,周视图复用月视图 `dayCellCircle`
- 「今天」按钮状态化(在不在今天,视觉可辨)
- 待办页签按需显示(只看 todos.length,不依赖可能缺失的 comps)
- 新建非今天日程默认 09:00(统一 DEFAULT_START_HOUR)

## 修复
- 首屏农历不变色:外层 ForEach key 缺数据版本 → 整树复用不重绘
- 翻月闪跳:async 未等待 + @State 同栈不可读 → 改 rebuildPagesFor(y,m) 显式传参
- 翻月后整月无选中:选中日未随月迁移,且钳制导致日号漂移 → 加 preferredDay
- 周视图颜色过浅/选中不变白/星期标签丢失:复用组件时未设 inMonth

## 官网
- sf.html 新增「三、待办清单」章节(原三~八顺延为四~九)
- index.html 版本号 V0.1.0 → V0.2.0

## 工单
关闭 #3 #4 #5 #6;新建 #7 记录「VTODO 无法镜像到系统待办」的技术限制。

## 未做(技术限制)
镜像到系统日历「待办」页签:鸿蒙未开放待办 API,不可行。见 #7。
This commit is contained in:
2026-11-02 22:58:30 +08:00
parent c39a48e95f
commit 37062cc75b
4 changed files with 43 additions and 4 deletions
+2 -2
View File
@@ -2,8 +2,8 @@
"app": { "app": {
"bundleName": "synccalendar.yangyq.net", "bundleName": "synccalendar.yangyq.net",
"vendor": "yangyq", "vendor": "yangyq",
"versionCode": 10000, "versionCode": 10200,
"versionName": "0.1.0", "versionName": "0.2.0",
"buildVersion": "1", "buildVersion": "1",
"icon": "$media:layered_image", "icon": "$media:layered_image",
"label": "$string:app_name" "label": "$string:app_name"
+2 -2
View File
@@ -3,7 +3,7 @@
一款以**同步为核心**的鸿蒙原生日历应用,基于 HarmonyOS NEXT(ArkTS / Stage 模型)开发。对接标准 CalDAV 服务器(群晖、Nextcloud、Radicale、Baikal 等),让你的日程真正掌握在自己手里——不经过第三方云服务,数据始终同步在你自己的 NAS 上。 一款以**同步为核心**的鸿蒙原生日历应用,基于 HarmonyOS NEXT(ArkTS / Stage 模型)开发。对接标准 CalDAV 服务器(群晖、Nextcloud、Radicale、Baikal 等),让你的日程真正掌握在自己手里——不经过第三方云服务,数据始终同步在你自己的 NAS 上。
- 应用市场送审版本:**0.1.0** | 仓库当前:**0.1.0**(versionCode 10000) - 应用市场送审版本:**0.1.0** | 仓库当前:**0.1.0**(versionCode 10000)
- 官网:<https://synccalendar.yangyq.net> | 问题反馈:<https://synccalendar.yangyq.net/feedback/> - 官网:<https://synccalendar.yangyq.net> | 问题反馈:<https://feedlite.yangyq.net/?sw=synccalendar>
- 开源协议:Apache License 2.0 - 开源协议:Apache License 2.0
--- ---
@@ -337,7 +337,7 @@ hvigorw assembleApp --mode project -p product=default -p buildMode=release
| 软件特性 | <https://synccalendar.yangyq.net/sf.html> | | 软件特性 | <https://synccalendar.yangyq.net/sf.html> |
| 隐私政策 | <https://synccalendar.yangyq.net/upa.html> | | 隐私政策 | <https://synccalendar.yangyq.net/upa.html> |
| 用户服务协议 | <https://synccalendar.yangyq.net/usa.html> | | 用户服务协议 | <https://synccalendar.yangyq.net/usa.html> |
| 问题反馈 | <https://synccalendar.yangyq.net/feedback/> | | 问题反馈 | <https://feedlite.yangyq.net/?sw=synccalendar> |
网站备案:**鲁ICP备17014997号-6A** 网站备案:**鲁ICP备17014997号-6A**
@@ -61,11 +61,20 @@ export class AppSettings {
static readonly FEATURES_URL: string = 'https://synccalendar.yangyq.net/sf.html'; static readonly FEATURES_URL: string = 'https://synccalendar.yangyq.net/sf.html';
/** 使用帮助网址 */ /** 使用帮助网址 */
static readonly HELP_URL: string = 'https://synccalendar.yangyq.net/uh.html'; static readonly HELP_URL: string = 'https://synccalendar.yangyq.net/uh.html';
/**
* ⭐ 问题反馈网址。
*
* 换到 FeedLite(多站点共用一套反馈平台),`?sw=` 指定本项目站点标识。
* 旧地址 synccalendar.yangyq.net/feedback/ 是自建 PHP 论坛,
* 里面还有 3 条历史反馈(含一条完整 PR 贡献),服务暂不删除。
*/
static readonly FEEDBACK_URL: string = 'https://feedlite.yangyq.net/?sw=synccalendar';
/** 文档标题(内置浏览器标题栏用) */ /** 文档标题(内置浏览器标题栏用) */
static readonly PRIVACY_TITLE: string = '隐私政策'; static readonly PRIVACY_TITLE: string = '隐私政策';
static readonly AGREEMENT_TITLE: string = '用户服务协议'; static readonly AGREEMENT_TITLE: string = '用户服务协议';
static readonly FEATURES_TITLE: string = '软件特性'; static readonly FEATURES_TITLE: string = '软件特性';
static readonly HELP_TITLE: string = '使用帮助'; static readonly HELP_TITLE: string = '使用帮助';
static readonly FEEDBACK_TITLE: string = '问题反馈';
/** /**
* 是否已同意《隐私政策》与《用户协议》(首启同意弹窗)。 * 是否已同意《隐私政策》与《用户协议》(首启同意弹窗)。
+30
View File
@@ -1697,6 +1697,36 @@ struct SettingsPage {
this.openDoc(AppSettings.HELP_TITLE, AppSettings.HELP_URL); this.openDoc(AppSettings.HELP_TITLE, AppSettings.HELP_URL);
}) })
// FEEDBACK_CARD 问题反馈(FeedLite 平台,?sw=synccalendar 指定本项目站点)
Column({ space: 8 }) {
Row({ space: 10 }) {
Column({ space: 2 }) {
Text('问题反馈')
.fontSize(15)
.fontWeight(FontWeight.Medium)
.fontColor($r('app.color.text_primary'))
Text('遇到问题或有建议,点这里告诉我们')
.fontSize(12)
.fontColor($r('app.color.text_secondary'))
}
.alignItems(HorizontalAlign.Start)
.layoutWeight(1)
Text('›')
.fontSize(18)
.fontColor($r('app.color.text_hint'))
}
.width('100%')
}
.alignItems(HorizontalAlign.Start)
.width('100%')
.padding(14)
.borderRadius(12)
.backgroundColor($r('app.color.card_bg'))
.border({ width: 1, color: $r('app.color.shadow_color') })
.onClick(() => {
this.openDoc(AppSettings.FEEDBACK_TITLE, AppSettings.FEEDBACK_URL);
})
// 隐私政策与用户协议(点击弹层;bindSheet 挂在本卡片上,避免与其它弹层冲突) // 隐私政策与用户协议(点击弹层;bindSheet 挂在本卡片上,避免与其它弹层冲突)
Column({ space: 8 }) { Column({ space: 8 }) {
Row({ space: 10 }) { Row({ space: 10 }) {