✅ 背景介绍
在团队办公和家庭日程管理场景中,多人共享同一日程并实时同步所有变更,是提升协作效率的关键。基于 HarmonyOS 分布式 KVStore,我们可以打造一个“分布式日程协作系统”,实现多端、多用户对同一日程数据的增删改查与即时同步。
🧱 实战目标
-
定义共享日程数据结构,支持多人同时编辑
-
实现添加、修改、删除日程事件
-
通过分布式 KVStore 自动同步各端数据
-
监听远端数据变更并实时更新 UI
🧑💻 核心模块与代码实现(基于 HarmonyOS 5.0.0)
1. 数据结构定义
interface SharedEvent {
id: string;
title: string;
date: string; // 格式:YYYY-MM-DD
time: string; // 格式:HH:mm
creator: string; // 创建者标识
}
2. 初始化分布式 Store
import distributedKVStore from '@ohos.data.distributedKVStore';
let kvStore: distributedKVStore.SingleKVStore;
async function initScheduleStore(context: Context) {
const manager = distributedKVStore.createKVManager({
context,
bundleName: 'com.example.schedule',
userInfo: { userId: '0', userType: distributedKVStore.UserType.SAME_USER_ID }
});
kvStore = await manager.getKVStore({
storeId: 'ScheduleStore',
storeType: distributedKVStore.KVStoreType.SINGLE_VERSION,
syncPolicy: distributedKVStore.SyncPolicy.IMMEDIATE
});
kvStore.on('dataChange', distributedKVStore.SubscribeType.SUBSCRIBE_TYPE_REMOTE, onRemoteChange);
}
3. 主组件状态管理
@Component
struct ScheduleApp {
private myName: string = `用户${Math.floor(Math.random()*1000)}`;
private events: SharedEvent[] = [];
private newTitle: string = '';
private newDate: string = this.formatDate(new Date());
private newTime: string = this.formatTime(new Date());
}
4. 加载与渲染日程
async aboutToAppear() {
const context = getContext(this);
await initScheduleStore(context);
await this.loadAllEvents();
}
async loadAllEvents() {
const keys = await kvStore.getKeys('');
const list: SharedEvent[] = [];
for (const key of keys) {
const val = await kvStore.get(key);
list.push(JSON.parse(val) as SharedEvent);
}
this.events = list.sort((a,b) => a.date + a.time < b.date + b.time ? -1 : 1);
}
build() {
Column({ space: 10 }) {
Text(`🗓️ 多人日程协作 - ${this.myName}`).fontSize(18)
ForEach(this.events, (e) => this.renderEvent(e), e=>e.id)
this.addEventForm()
}.padding(20)
}
private renderEvent(e: SharedEvent) {
return Row({ space: 10 })
.backgroundColor('#f2f8ff').borderRadius(8).padding(10).margin({ bottom:5 }) {
Text(`${e.date} ${e.time}`).fontSize(14)
Text(e.title).fontSize(16).flex(1)
Text(`by ${e.creator}`).fontSize(12).color('#888')
Button('修改').onClick(()=> this.editEvent(e))
Button('删除').onClick(()=> this.deleteEvent(e.id))
}
}
5. 添加、修改、删除操作
private addEvent() {
if (!this.newTitle.trim()) return;
const id = `evt_${Date.now()}`;
const ev: SharedEvent = {
id, title: this.newTitle, date: this.newDate,
time: this.newTime, creator: this.myName
};
kvStore.put(id, JSON.stringify(ev));
this.newTitle = '';
}
private async deleteEvent(id: string) {
await kvStore.delete(id);
}
private async editEvent(e: SharedEvent) {
// 简化:弹窗输入新标题,这里伪代码
const updatedTitle = prompt('输入新标题', e.title);
if (updatedTitle) {
e.title = updatedTitle;
kvStore.put(e.id, JSON.stringify(e));
}
}
6. 远端变更监听
function onRemoteChange(change: distributedKVStore.ChangeNotification) {
// 插入或更新
change.insertEntries.forEach(entry => {
const ev = JSON.parse(entry.value) as SharedEvent;
const idx = this.events.findIndex(x=>x.id===ev.id);
if (idx >= 0) this.events[idx] = ev;
else this.events.push(ev);
});
// 删除
change.deleteEntries.forEach(entry => {
this.events = this.events.filter(x=>x.id!==entry.key);
});
// 保持排序
this.events.sort((a,b) => a.date + a.time < b.date + b.time ? -1 : 1);
}
7. 添加日程表单
private addEventForm() {
return Column({ space: 5 }) {
TextInput({ placeholder: '事件标题', text: this.newTitle })
.onChange(v=> this.newTitle=v)
Row({ space:5 }) {
DatePicker({ value: this.newDate }).onChange(v=> this.newDate=v)
TimePicker({ value: this.newTime }).onChange(v=> this.newTime=v)
Button('添加').onClick(()=> this.addEvent())
}
}
}
⚠️ 常见问题与排查
问题 | 可能原因 | 解决方案 |
---|---|---|
同步冲突 | 多人几乎同时写入同一 key | 使用乐观锁或改成列表增量同步 |
加载延迟 | 网络或设备账号不一致 | 确保同一 HUAWEI ID、设置 IMMEDIATE |
UI 未刷新 | 监听回调没触发或状态变量未更新 | 确保 onRemoteChange 在组件上下文中注册 |
📦 权限配置(config.json)
"reqPermissions": [
{ "name": "ohos.permission.DISTRIBUTED_DATASYNC" }
]
🚀 拓展建议
-
引入冲突解决策略(版本号、时间戳比较)
-
日程重复规则(按周/月定期事件)
-
日程提醒(结合本地通知)
-
权限分组:只允许部分用户编辑、其他用户只读
-
与聊天、白板模块联动,构建完整协作平台
✅ 小结
本篇实现了一个分布式日程协作系统,支持多用户添加、修改、删除事件,并通过分布式 KVStore 实时同步各端,满足团队或家庭日程管理需求。它结合了多端同步、UI 渲染与数据处理,是分布式应用的重要典型场景。