更新记录

1.0.20251024(2025-10-24)

  1. 鸿蒙日历组件控制

平台兼容性

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[] 本次申请的是否弹窗

错误码

  • 小于0的错误码是微信自己的错误码不在下方列表中
错误码 描述
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>

需要帮助?有其他插件的需求?联系我!

隐私、权限声明

1. 本插件需要申请的系统权限列表:

ohos.permission.READ_CALENDAR 读日历权限 ohos.permission.WRITE_CALENDAR 写日历权限

2. 本插件采集的数据、发送的服务器地址、以及数据用途说明:

3. 本插件是否包含广告,如包含需详细说明广告表达方式、展示频率:

暂无用户评论。