更新记录
1.0.20251024(2025-10-24)
- 鸿蒙日历组件控制
平台兼容性
uni-app(4.56)
| Vue2 |
Vue3 |
Chrome |
Safari |
app-vue |
app-nvue |
Android |
iOS |
鸿蒙 |
| × |
× |
× |
× |
× |
× |
× |
× |
√ |
| 微信小程序 |
支付宝小程序 |
抖音小程序 |
百度小程序 |
快手小程序 |
京东小程序 |
鸿蒙元服务 |
QQ小程序 |
飞书小程序 |
快应用-华为 |
快应用-联盟 |
| × |
× |
× |
× |
× |
× |
× |
× |
× |
× |
× |
uni-app x(4.56)
| Chrome |
Safari |
Android |
iOS |
鸿蒙 |
微信小程序 |
| × |
× |
× |
× |
√ |
× |
引入插件
- 点击插件试用引入到项目
- 按照下方示例测试
- 先插件试用,完全符合需求后购买
- 本插件仅适用鸿蒙
所需申请权限
- ohos.permission.READ_CALENDAR 读日历权限
- ohos.permission.WRITE_CALENDAR 写日历权限
插件引入
import * as cmsCalendar from "@/uni_modules/cms-calendar";
插件方法
| 方法 |
描述 |
参数 |
| init(object) |
初始化日历 |
InitOption |
| setConfig(object) |
设置日历配置 |
SetConfigOption |
| getConfig(object) |
获取日历配置 |
GetConfigOption |
| addEvent(object) |
新增日程 |
AddEventOption |
| addEvents(object) |
批量新增日程 |
AddEventsOption |
| editEvent(object) |
跳转系统编辑日程 |
EditEventOption |
| deleteEvent(object) |
删除日程 |
DeleteEventOption |
| deleteEvents(object) |
批量删除日程 |
DeleteEventsOption |
| updateEvent(object) |
更新日程 |
UpdateEventOption |
| getEvents(object) |
获取已添加日程 |
GetEventsOption |
| checkPermissions(object) |
校验权限(公用) |
RequestPermissionsOption |
| requestPermissions(object) |
申请权限(公用) |
RequestPermissionsOption |
InitOption
| 参数 |
类型 |
描述 |
必填 |
| name |
string |
账户名称 |
是 |
| type |
string |
账户类型 (本地:local 邮箱:email 生日:birthday 支持CalDAV协议:caldav 订阅:subscribed) |
否 |
| displayName |
string |
账户显示在日历应用上的名称(面向用户)。不填时,默认为空字符串,长度限制为0~64字符 |
否 |
| success |
()=>void |
成功回调 |
否 |
| fail |
(errCode : number, errMsg : string)=>void |
失败回调 |
否 |
| complete |
()=>void |
完成回调 |
否 |
SetConfigOption
| 参数 |
类型 |
描述 |
必填 |
| enableReminder |
boolean |
打开日程提醒 |
是 |
| color |
string |
设置日历账户颜色 #ff8981 |
是 |
| success |
()=>void |
成功回调 |
否 |
| fail |
(errCode : number, errMsg : string)=>void |
失败回调 |
否 |
| complete |
()=>void |
完成回调 |
否 |
GetConfigOption
| 参数 |
类型 |
描述 |
必填 |
| success |
(CalendarConfigOption)=>void |
成功回调 |
否 |
| fail |
(errCode : number, errMsg : string)=>void |
失败回调 |
否 |
| complete |
()=>void |
完成回调 |
否 |
CalendarConfigOption
| 参数 |
类型 |
描述 |
| enableReminder |
boolean |
日程提醒 |
| color |
string |
日历账户颜色 |
AddEventOption
| 参数 |
类型 |
描述 |
必填 |
| data |
CalendarEvent |
日程参数 |
是 |
| success |
(number)=>void |
成功回调 会回传本次添加成功的日历id |
否 |
| fail |
(errCode : number, errMsg : string)=>void |
失败回调 |
否 |
| complete |
()=>void |
完成回调 |
否 |
AddEventsOption
| 参数 |
类型 |
描述 |
必填 |
| data |
CalendarEvent[] |
日程参数 |
是 |
| success |
()=>void |
成功回调 |
否 |
| fail |
(errCode : number, errMsg : string)=>void |
失败回调 |
否 |
| complete |
()=>void |
完成回调 |
否 |
EditEventOption
| 参数 |
类型 |
描述 |
必填 |
| data |
CalendarEvent |
日程参数 |
是 |
| success |
(number)=>void |
成功回调 会回传本次添加成功的日历id |
否 |
| fail |
(errCode : number, errMsg : string)=>void |
失败回调 |
否 |
| complete |
()=>void |
完成回调 |
否 |
UpdateEventOption
| 参数 |
类型 |
描述 |
必填 |
| data |
CalendarEvent |
日程参数,编辑时需传id |
是 |
| success |
()=>void |
成功回调 |
否 |
| fail |
(errCode : number, errMsg : string)=>void |
失败回调 |
否 |
| complete |
()=>void |
完成回调 |
否 |
DeleteEventOption
| 参数 |
类型 |
描述 |
必填 |
| eventId |
number |
删除的日程Id |
是 |
| success |
()=>void |
成功回调 |
否 |
| fail |
(errCode : number, errMsg : string)=>void |
失败回调 |
否 |
| complete |
()=>void |
完成回调 |
否 |
DeleteEventsOption
| 参数 |
类型 |
描述 |
必填 |
| eventId |
number[] |
删除的日程Id数组 |
是 |
| success |
()=>void |
成功回调 |
否 |
| fail |
(errCode : number, errMsg : string)=>void |
失败回调 |
否 |
| complete |
()=>void |
完成回调 |
否 |
GetEventsOption
| 参数 |
类型 |
描述 |
必填 |
| success |
(number)=>void |
成功回调 |
否 |
| fail |
(errCode : number, errMsg : string)=>void |
失败回调 |
否 |
| complete |
()=>void |
完成回调 |
否 |
RequestPermissionsOption
| 参数 |
类型 |
描述 |
必填 |
| data |
string[] |
需要申请的权限数组 |
是 |
| isOnSetting |
boolean |
如果被拒绝后是否需要调用系统弹窗申请权限 |
否 |
| success |
(PermissionRequestResultOption)=>void |
成功回调 |
否 |
| fail |
(errCode : number, errMsg : string)=>void |
失败回调 |
否 |
| complete |
()=>void |
完成回调 |
否 |
PermissionRequestResultOption
| 参数 |
类型 |
描述 |
| permissions |
string[] |
本次申请的权限数组 |
| authResults |
number[] |
本次申请权限结果 0 代表已授权 -1未授权 |
| dialogShownResults |
boolean[] |
本次申请的是否弹窗 |
错误码
| 错误码 |
描述 |
| 9010001 |
未调用init方法,或init调用失败 |
| 9010002 |
未能成功申请权限 |
| 9010003 |
请检查CalendarEvent是否合法 |
uniapp示例
所有方法需在 init() 方法调用之后
<template>
<view>
<button type="primary" @click="checkPermissions">查询是否授权</button>
<button type="primary" @click="requestPermissions">申请权限</button>
<button type="primary" @click="init(account1)">初始化日历(账号1)</button>
<button type="primary" @click="init(account2)">初始化日历(账号2)</button>
<button type="primary" @click="setConfig">设置日历配置</button>
<button type="primary" @click="getConfig">获取日历配置</button>
<button type="primary" @click="addEvent">新增日程</button>
<button type="primary" @click="editEvent">跳转系统编辑日程</button>
<button type="primary" @click="updateEvent">更新日程</button>
<button type="primary" @click="deleteEvent">删除日程</button>
<button type="primary" @click="addEvents">批量新增日程</button>
<button type="primary" @click="deleteEvents">批量删除日程</button>
<button type="primary" @click="getEvents">获取已添加日程</button>
<button type="primary" @click="clearEvents">清空所有已添加日程</button>
</view>
</template>
<script>
import * as cmsCalendar from "@/uni_modules/cms-calendar";
function getTestData(type, id) {
// 计算本周五的日期(当前周的周五,0点0分0秒)
const today = new Date();
const currentDay = today.getDay(); // 0-6,0是周日,5是周五
let daysToFriday = 5 - currentDay;
// 如果今天是周六(6)或周日(0),需要计算到下周五的天数
if (daysToFriday < 0) {
daysToFriday += 7;
}
// 构建本周五的日期对象(00:00:00)
const friday = new Date(today);
friday.setDate(today.getDate() + daysToFriday);
friday.setHours(11, 0, 0, 0);
const startTime = friday.getTime(); // 本周五的时间戳(13位)
const endTime = startTime + 60 * 60 * 1000;
// 截止日期:本周五往后推一年(简化处理,按365天计算)
const expireTime = startTime + 365 * 24 * 60 * 60 * 1000; // 一年的毫秒数
let opt = {
// 日程基本信息
type: 0, // 0表示普通日程
startTime: startTime, // 本周五 00:00:00 的时间戳
endTime: endTime, // 本周五往后推一年的时间戳
title: "年度项目规划会议",
isAllDay: false, // 非全天日程
timeZone: "Asia/Shanghai", // 时区
description: "讨论年度项目进度规划及资源分配,需携带季度报告",
identifier: "proj-year-plan-1001", // 自定义唯一标识
isLunar: false, // 非农历日程
// 地点信息
location: {
location: "公司3楼会议室A",
longitude: 121.4737,
latitude: 31.2304
},
// 参与者信息
attendee: [{
name: "张三",
email: "zhangsan@example.com",
role: "organizer", // 组织者
status: 2, // 接受
type: 1 // 主送者
},
{
name: "李四",
email: "lisi@example.com",
role: "participant", // 参与者
status: 1, // 暂定
type: 1 // 主送者
},
{
name: "王五",
email: "wangwu@example.com",
role: "participant",
status: 4, // 未响应
type: 2 // 抄送者
}
],
// 提醒时间(提前30分钟、15分钟、5分钟)
reminderTime: [30, 15, 5],
// 实例时间同步更新为开始和结束时间
instanceStartTime: startTime,
instanceEndTime: expireTime,
// 重复规则
recurrenceRule: {
recurrenceFrequency: 2, // 每周重复
expire: expireTime, // 重复截止日期与日程截止日期一致(一年后)
count: 52, // 每周重复一次,一年约52周
interval: 1, // 每周重复一次
excludedDates: [], // 可根据需要添加排除日期
daysOfWeek: [5], // 每周五重复(与本周五对应)
daysOfMonth: [], // 与每周重复规则不冲突,留空
daysOfYear: [], // 留空
weeksOfMonth: [], // 留空
weeksOfYear: [], // 留空
monthsOfYear: [] // 留空
}
};
if (type == 'add') {
delete opt.instanceStartTime;
delete opt.instanceEndTime;
} else if (type == 'edit') {
opt.id = id;
}
return opt; // 建议返回配置对象以便使用
}
export default {
data() {
return {
account1: {
name: "MyCalendar1",
type: "local",
displayName: "MyCalendarDisplayName1",
},
account2: {
name: "MyCalendar2",
type: "local",
displayName: "MyCalendarDisplayName2",
},
startTime: "",
endTime: "",
}
},
mounted() {
},
methods: {
checkPermissions() {
// ohos.permission.READ_CALENDAR 读日历权限
// ohos.permission.WRITE_CALENDAR 写日历权限
cmsCalendar.checkPermissions({
data: ["ohos.permission.READ_CALENDAR", "ohos.permission.WRITE_CALENDAR"],
success: result => {
console.log("checkPermissions result:", result);
if (result.authResults.every(item => item === 0)) {
this.toast("权限已全部授权")
} else {
this.toast("未授权权限")
}
},
fail: (errCode, errMsg) => {
this.toast(`method:checkPermissions ,errCode:${errCode},errMsg:${errMsg}`, true)
},
complete: () => {
console.log("checkPermissions complete")
}
})
},
requestPermissions() {
// ohos.permission.READ_CALENDAR 读日历权限
// ohos.permission.WRITE_CALENDAR 写日历权限
cmsCalendar.requestPermissions({
isOnSetting: true,
data: ["ohos.permission.READ_CALENDAR", "ohos.permission.WRITE_CALENDAR"],
success: result => {
console.log("requestPermissions result:", result);
if (result.authResults.every(item => item === 0)) {
this.toast("权限已全部授权")
} else {
this.toast("未授权权限")
}
},
fail: (errCode, errMsg) => {
this.toast(`method:requestPermissions ,errCode:${errCode},errMsg:${errMsg}`, true)
},
complete: () => {
console.log("requestPermissions complete")
}
})
},
toast(title, modal = false) {
if (modal) {
uni.showModal({
title: "提示",
content: title
})
} else {
uni.showToast({
title,
icon: "none",
duration: 3000
})
}
},
init(opt) {
cmsCalendar.init({
...opt,
success: () => {
this.toast("init success")
},
fail: (errCode, errMsg) => {
this.toast(`method:init ,errCode:${errCode},errMsg:${errMsg}`, true)
},
complete: () => {
console.log("init complete")
}
});
},
setConfig() {
cmsCalendar.setConfig({
enableReminder: true,
color: "#ff8981",
success: () => {
this.toast("setConfig success")
},
fail: (errCode, errMsg) => {
this.toast(`method:setConfig ,errCode:${errCode},errMsg:${errMsg}`, true)
},
complete: () => {
console.log("setConfig complete")
}
});
},
getConfig() {
cmsCalendar.getConfig({
success: (opt) => {
console.log('getConfig:', JSON.stringify(opt));
this.toast("getConfig success");
},
fail: (errCode, errMsg) => {
this.toast(`method:getConfig ,errCode:${errCode},errMsg:${errMsg}`, true)
},
complete: () => {
console.log("getConfig complete")
}
});
},
addEvent() {
cmsCalendar.addEvent({
data: getTestData('add'),
success: (eventId) => {
console.log('addEvent:', eventId);
this.lastEventId = eventId;
this.toast("addEvent success");
},
fail: (errCode, errMsg) => {
this.toast(`method:addEvent ,errCode:${errCode},errMsg:${errMsg}`, true)
},
complete: () => {
console.log("addEvent complete")
}
});
},
editEvent() {
cmsCalendar.editEvent({
data: getTestData('add'),
success: (eventId) => {
console.log('editEvent:', eventId);
this.lastEventId = eventId;
this.toast("editEvent success");
},
fail: (errCode, errMsg) => {
this.toast(`method:editEvent ,errCode:${errCode},errMsg:${errMsg}`, true)
},
complete: () => {
console.log("editEvent complete")
}
});
},
addEvents() {
cmsCalendar.addEvents({
data: [getTestData('add')],
success: () => {
this.toast("addEvents success");
},
fail: (errCode, errMsg) => {
this.toast(`method:addEvents ,errCode:${errCode},errMsg:${errMsg}`, true)
},
complete: () => {
console.log("addEvents complete")
}
});
},
deleteEvent() {
if (!this.lastEventId) {
this.toast("请先添加一个日程后再调用删除");
return;
}
cmsCalendar.deleteEvent({
eventId: this.lastEventId,
success: () => {
this.toast("deleteEvent success");
},
fail: (errCode, errMsg) => {
this.toast(`method:deleteEvent ,errCode:${errCode},errMsg:${errMsg}`, true)
},
complete: () => {
this.lastEventId = "";
console.log("deleteEvent complete")
}
});
},
deleteEvents() {
if (!this.lastEventId) {
this.toast("请先添加一个日程后再调用删除");
return;
}
cmsCalendar.deleteEvents({
eventIds: [this.lastEventId],
success: () => {
this.toast("deleteEvents success");
},
fail: (errCode, errMsg) => {
this.toast(`method:deleteEvents ,errCode:${errCode},errMsg:${errMsg}`, true)
},
complete: () => {
this.lastEventId = "";
console.log("deleteEvents complete")
}
});
},
updateEvent() {
if (!this.lastEventId) {
this.toast("请先添加一个日程后再调用编辑");
return;
}
cmsCalendar.updateEvent({
data: getTestData('edit', this.lastEventId),
success: () => {
this.toast("updateEvent success");
},
fail: (errCode, errMsg) => {
this.toast(`method:updateEvent ,errCode:${errCode},errMsg:${errMsg}`, true)
},
complete: () => {
console.log("updateEvent complete")
}
});
},
getEvents() {
cmsCalendar.getEvents({
success: (list) => {
console.log('getEvents:', list);
this.toast("getEvents success count:" + list.length);
},
fail: (errCode, errMsg) => {
this.toast(`method:getEvents ,errCode:${errCode},errMsg:${errMsg}`, true)
},
complete: () => {
console.log("getEvents complete")
}
});
},
clearEvents() {
cmsCalendar.getEvents({
success: (list) => {
let eventIds = list.map(item => item.id);
if (!eventIds.length) {
this.toast(`当前暂未添加日程`)
return;
}
cmsCalendar.deleteEvents({
eventIds,
success: () => {
this.toast(`清除所有日程成功,共清除${eventIds.length}`)
}
})
},
fail: (errCode, errMsg) => {
this.toast(`method:getEvents ,errCode:${errCode},errMsg:${errMsg}`, true)
},
complete: () => {
console.log("getEvents complete")
}
});
}
}
}
</script>
需要帮助?有其他插件的需求?联系我!