最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • Electron+Vue3 MAC 版日历开发记录(12)——Notion事件创建

    正文概述 掘金(叶梅树)   2021-06-13   619

    这是我参与更文挑战的第12天,活动详情查看: 更文挑战

    Electron+Vue3 MAC 版日历开发记录(12)——Notion事件创建

    经过昨天的动手 (Electron+Vue3 MAC 版日历开发记录(11)——Notion事件获取),关于 Notion 的使用,估计大家都不陌生。

    今天我们将继续学习使用 Notion API,用于创建「事件」。

    Notion API 使用

    要创建一条 Event 事件记录,在 Notion 里对应的是一条 Page。

    下面我们借助 Postman 向服务 post一条记录,具体如下 (在截稿之前,我把event_id属性移除了):

    Electron+Vue3 MAC 版日历开发记录(12)——Notion事件创建

    结果直接返回 page object,同时在 Notion 后台也能看到此条记录:

    Electron+Vue3 MAC 版日历开发记录(12)——Notion事件创建

    在列表中也能看到这条记录了:

    Electron+Vue3 MAC 版日历开发记录(12)——Notion事件创建

    创建 postEvent 函数

    根据 Postman 的模拟,我们直接用代码实现:

    // EventService.ts
    'use strict';
    import axios from 'axios';
    import wrapper from 'axios-cache-plugin';
    export default class EventService {
      headers: any;
      constructor() {
        this.headers = {
          'Notion-Version': import.meta.env.VITE_NOtion_VERSION,
          'Authorization': 'Bearer '+ import.meta.env.VITE_NOTION_KEY,
        };
      }
    
      /**
       * 提交title和start、end 到 Notion API
       */
      async postEvent(
        title: string,
        start: Date,
        end: Date,
        ) {
          const http = wrapper(axios, {
            maxCacheSize: 15,
          });
          const res = await http({
            url: import.meta.env.VITE_NOTION_PAGE_API,
            method: 'post',
            headers: this.headers,
            data: {
              'parent': { 'type': 'database_id', 'database_id': import.meta.env.VITE_NOTION_DATABASE_ID },
              'properties': {
                'title': {
                  'type': 'rich_text',
                  'rich_text': [{
                    'type': 'text',
                    'text': { 'content': title },
                  }],
                },
                'start': {
                  'type': 'date',
                  'date': { 'start': start },
                },
                'end': {
                  'type': 'date',
                  'date': { 'start': end },
                },
              },
            },
          });
    
          return res.data;
      }
    }
    

    代码就很简单了,只要提供 eventtitlestartend 三个字段即可。

    其中我们在 env 增加了:

    // .env
    VITE_NOtion_VERSION=2021-05-13
    VITE_NOTION_DATABASE_API=https://api.notion.com/v1/databases/
    VITE_NOTION_PAGE_API=https://api.notion.com/v1/pages
    

    增加创建页面

    之前我一直使用 Sidebar 组件,这里我使用了对话框组件 (Dialog):

    // EventCreateDialog.vue
    
    <template>
      <Dialog
        v-model:visible="eventDialogVisible"
        :modal="true"
        @click="$emit('update:visibleFullDialog', eventDialogVisible)"
      >
        <template #header>
          <h3>创建事件</h3>
        </template>
        <div class="p-fluid">
          <div class="p-field">
            <label for="eventInput">事件内容</label>
            <InputText
              id="eventInput"
              v-model="eventText"
              type="text"
            />
          </div>
        </div>
        <div class="p-fluid p-formgrid p-grid">
          <Calendar
            id="range"
            v-model="dates"
            date-format="MM d,yy"
            ::minDate="Date()"
            selection-mode="range"
            :inline="true"
          />
        </div>
        <template #footer>
          <Button
            label="取消"
            icon="pi pi-times"
            class="p-button-text"
            @click="$emit('update:visibleFullDialog', false)"
          />
          <Button
            label="确定"
            icon="pi pi-check"
            autofocus
            @click="add"
          />
        </template>
      </Dialog>
    </template>
    

    代码不用多说了,直接看界面效果:

    Electron+Vue3 MAC 版日历开发记录(12)——Notion事件创建

    这里主要还用到了 Calendar 组件,关键用到的属性是:selection-mode="range",可以手动选择事件的时间段,这样可以减少一个控件,直接拿到 startend 两个值:

    Electron+Vue3 MAC 版日历开发记录(12)——Notion事件创建

    有了数据了,就直接调用函数:

    add(): void {
      const start: Date = this.dates[0];
      const end: Date = this.dates[1] == null ? this.dates[0] : this.dates[1];
    
      this.eventService.postEvent(this.eventText, start, end)
        .then(() => {
          this.dates = [];
          this.eventText = '';
        });
      this.$emit('update:visibleFullDialog', false);
    },
    

    增加 Menu 入口

    由于功能越来越多,需要操作的动作和入口也持续增多,所以我把之前的「设置」按钮变成了「目录」功能,具体看代码:

    // FullCalendarMain.vue
    
    <event-create-dialog
      v-model:visibleFullDialog="visibleFullDialog"
    />
    <Menu
      id="overlay_tmenu"
      ref="menu"
      :model="items"
      :popup="true"
    />
    
    ...
    
    items: [
        {
          label:'操作',
          icon:'pi pi-fw pi-pencil',
          items:[
            {
              label:'创建事件',
              icon:'pi pi-fw pi-plus',
              command: this.goCreateEventView,
            },
            {
              label:'设置',
              icon:'pi pi-fw pi-cog',
              command: this.goSettingView,
            },
            {
              separator:true,
            },
            {
              label:'退出应用',
              icon:'pi pi-fw pi-power-off',
              command: this.quit,
            },
          ],
        },
    ],
    
    ...
    
    goCreateEventView(): void {
      this.visibleFullDialog = true;
    },
    

    入口如下所示:

    Electron+Vue3 MAC 版日历开发记录(12)——Notion事件创建

    小结

    好了,从目录中增加创建事件的入口,到事件创建界面,到网络请求,最后验证数据是否保存到 Notion 数据库中,到此,基本完成了 增加事件功能。增加一条记录后,页面和 Notion 后台能实时看到效果。

    Electron+Vue3 MAC 版日历开发记录(12)——Notion事件创建

    Electron+Vue3 MAC 版日历开发记录(12)——Notion事件创建

    至于整个过程中的边界问题都需要接下来一一处理,如:Event 事件功能如何与「亲朋好友的生日提醒」等相结合;如何把 Event 事件展示在其他页面上;以及删除 Event 事件和同步更新到 Notion 里。未完待续!


    起源地下载网 » Electron+Vue3 MAC 版日历开发记录(12)——Notion事件创建

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元