568 lines
16 KiB
HTML
568 lines
16 KiB
HTML
<!DOCTYPE html>
|
|
<html lang="zh-CN">
|
|
<head>
|
|
<meta charset="UTF-8">
|
|
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=2">
|
|
<meta name="theme-color" content="#222">
|
|
<meta name="generator" content="Hexo 6.1.0">
|
|
<link rel="apple-touch-icon" sizes="180x180" href="/images/apple-touch-icon-next.png">
|
|
<link rel="icon" type="image/png" sizes="32x32" href="/images/favicon-32x32-next.ico">
|
|
<link rel="icon" type="image/png" sizes="16x16" href="/images/favicon-16x16-next.ico">
|
|
<link rel="mask-icon" href="/images/logo.svg" color="#222">
|
|
|
|
<link rel="stylesheet" href="/css/main.css">
|
|
|
|
|
|
<link rel="stylesheet" href="/lib/font-awesome/css/all.min.css">
|
|
|
|
<script id="hexo-configurations">
|
|
var NexT = window.NexT || {};
|
|
var CONFIG = {"hostname":"zzzykj.cn","root":"/","scheme":"Mist","version":"7.8.0","exturl":false,"sidebar":{"position":"right","display":"post","padding":18,"offset":12,"onmobile":false},"copycode":{"enable":false,"show_result":false,"style":null},"back2top":{"enable":true,"sidebar":false,"scrollpercent":false},"bookmark":{"enable":false,"color":"#222","save":"auto"},"fancybox":false,"mediumzoom":false,"lazyload":false,"pangu":false,"comments":{"style":"tabs","active":null,"storage":true,"lazyload":false,"nav":null},"algolia":{"hits":{"per_page":10},"labels":{"input_placeholder":"Search for Posts","hits_empty":"We didn't find any results for the search: ${query}","hits_stats":"${hits} results found in ${time} ms"}},"localsearch":{"enable":false,"trigger":"auto","top_n_per_article":1,"unescape":false,"preload":false},"motion":{"enable":true,"async":false,"transition":{"post_block":"fadeIn","post_header":"slideDownIn","post_body":"slideDownIn","coll_header":"slideLeftIn","sidebar":"slideUpIn"}}};
|
|
</script>
|
|
|
|
<meta property="og:type" content="website">
|
|
<meta property="og:title" content="schedule">
|
|
<meta property="og:url" content="https://zzzykj.cn/schedule/index.html">
|
|
<meta property="og:site_name" content="啊卓的小站">
|
|
<meta property="og:locale" content="zh_CN">
|
|
<meta property="article:published_time" content="2022-03-14T14:27:14.000Z">
|
|
<meta property="article:modified_time" content="2022-03-14T14:27:27.704Z">
|
|
<meta property="article:author" content="啊卓">
|
|
<meta property="article:tag" content="啊卓,小卓,小站,博客,啊卓的博客">
|
|
<meta name="twitter:card" content="summary">
|
|
|
|
<link rel="canonical" href="https://zzzykj.cn/schedule/">
|
|
|
|
|
|
<script id="page-configurations">
|
|
// https://hexo.io/docs/variables.html
|
|
CONFIG.page = {
|
|
sidebar: "",
|
|
isHome : false,
|
|
isPost : false,
|
|
lang : 'zh-CN'
|
|
};
|
|
</script>
|
|
|
|
<title>schedule | 啊卓的小站
|
|
</title>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<noscript>
|
|
<style>
|
|
.use-motion .brand,
|
|
.use-motion .menu-item,
|
|
.sidebar-inner,
|
|
.use-motion .post-block,
|
|
.use-motion .pagination,
|
|
.use-motion .comments,
|
|
.use-motion .post-header,
|
|
.use-motion .post-body,
|
|
.use-motion .collection-header { opacity: initial; }
|
|
|
|
.use-motion .site-title,
|
|
.use-motion .site-subtitle {
|
|
opacity: initial;
|
|
top: initial;
|
|
}
|
|
|
|
.use-motion .logo-line-before i { left: initial; }
|
|
.use-motion .logo-line-after i { right: initial; }
|
|
</style>
|
|
</noscript>
|
|
|
|
<link rel="alternate" href="/atom.xml" title="啊卓的小站" type="application/atom+xml">
|
|
</head>
|
|
|
|
<body itemscope itemtype="http://schema.org/WebPage">
|
|
<div class="container use-motion">
|
|
<div class="headband"></div>
|
|
|
|
<header class="header" itemscope itemtype="http://schema.org/WPHeader">
|
|
<div class="header-inner"><div class="site-brand-container">
|
|
<div class="site-nav-toggle">
|
|
<div class="toggle" aria-label="切换导航栏">
|
|
<span class="toggle-line toggle-line-first"></span>
|
|
<span class="toggle-line toggle-line-middle"></span>
|
|
<span class="toggle-line toggle-line-last"></span>
|
|
</div>
|
|
</div>
|
|
|
|
<div class="site-meta">
|
|
|
|
<a href="/" class="brand" rel="start">
|
|
<span class="logo-line-before"><i></i></span>
|
|
<h1 class="site-title">啊卓的小站</h1>
|
|
<span class="logo-line-after"><i></i></span>
|
|
</a>
|
|
<p class="site-subtitle" itemprop="description">成长的路上, 你我并不孤独</p>
|
|
</div>
|
|
|
|
<div class="site-nav-right">
|
|
<div class="toggle popup-trigger">
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
|
|
|
|
|
|
<nav class="site-nav">
|
|
<ul id="menu" class="main-menu menu">
|
|
<li class="menu-item menu-item-home">
|
|
|
|
<a href="/" rel="section"><i class="fa fa-home fa-fw"></i>首页</a>
|
|
|
|
</li>
|
|
<li class="menu-item menu-item-about">
|
|
|
|
<a href="/about/" rel="section"><i class="fa fa-user fa-fw"></i>关于</a>
|
|
|
|
</li>
|
|
<li class="menu-item menu-item-tags">
|
|
|
|
<a href="/tags/" rel="section"><i class="fa fa-tags fa-fw"></i>标签<span class="badge">1</span></a>
|
|
|
|
</li>
|
|
<li class="menu-item menu-item-categories">
|
|
|
|
<a href="/categories/" rel="section"><i class="fa fa-th fa-fw"></i>分类<span class="badge">0</span></a>
|
|
|
|
</li>
|
|
<li class="menu-item menu-item-archives">
|
|
|
|
<a href="/archives/" rel="section"><i class="fa fa-archive fa-fw"></i>归档<span class="badge">2</span></a>
|
|
|
|
</li>
|
|
<li class="menu-item menu-item-schedule">
|
|
|
|
<a href="/schedule/" rel="section"><i class="fa fa-calendar fa-fw"></i>日程表</a>
|
|
|
|
</li>
|
|
<li class="menu-item menu-item-sitemap">
|
|
|
|
<a href="/sitemap.xml" rel="section"><i class="fa fa-sitemap fa-fw"></i>站点地图</a>
|
|
|
|
</li>
|
|
<li class="menu-item menu-item-commonweal">
|
|
|
|
<a href="/404/" rel="section"><i class="fa fa-heartbeat fa-fw"></i>公益 404</a>
|
|
|
|
</li>
|
|
</ul>
|
|
</nav>
|
|
|
|
|
|
|
|
|
|
</div>
|
|
</header>
|
|
|
|
|
|
<div class="back-to-top">
|
|
<i class="fa fa-arrow-up"></i>
|
|
<span>0%</span>
|
|
</div>
|
|
|
|
|
|
<main class="main">
|
|
<div class="main-inner">
|
|
<div class="content-wrap">
|
|
|
|
|
|
|
|
|
|
<div class="content page posts-expand">
|
|
|
|
|
|
|
|
|
|
|
|
<div class="post-block" lang="zh-CN">
|
|
<header class="post-header">
|
|
|
|
<h1 class="post-title" itemprop="name headline">schedule
|
|
</h1>
|
|
|
|
<div class="post-meta">
|
|
|
|
|
|
</div>
|
|
|
|
</header>
|
|
|
|
|
|
|
|
|
|
<div class="post-body">
|
|
<div class="event-list">
|
|
</div>
|
|
<script>
|
|
(function() {
|
|
// Initialization
|
|
var calendar = {
|
|
orderBy : 'startTime',
|
|
showLocation: false,
|
|
offsetMax : 72,
|
|
offsetMin : 4,
|
|
showDeleted : false,
|
|
singleEvents: true,
|
|
maxResults : 250
|
|
};
|
|
|
|
// Read config form theme config file
|
|
Object.assign(calendar, {"calendar_id":"<required>","api_key":"<required>","orderBy":"startTime","offsetMax":24,"offsetMin":4,"showDeleted":false,"singleEvents":true,"maxResults":250});
|
|
|
|
var now = new Date();
|
|
var timeMax = new Date();
|
|
var timeMin = new Date();
|
|
|
|
timeMax.setHours(now.getHours() + calendar.offsetMax);
|
|
timeMin.setHours(now.getHours() - calendar.offsetMin);
|
|
|
|
// Build URL
|
|
const params = {
|
|
key : calendar.api_key,
|
|
orderBy : calendar.orderBy,
|
|
timeMax : timeMax.toISOString(),
|
|
timeMin : timeMin.toISOString(),
|
|
showDeleted : calendar.showDeleted,
|
|
singleEvents: calendar.singleEvents,
|
|
maxResults : calendar.maxResults
|
|
};
|
|
|
|
var request_url = 'https://www.googleapis.com/calendar/v3/calendars/' + calendar.calendar_id + '/events?' + Object.entries(params).map(([key, value]) => `${key}=${encodeURIComponent(value)}`).join('&');
|
|
|
|
fetchData();
|
|
var fetchDataTimer = setInterval(fetchData, 60000);
|
|
window.addEventListener('pjax:send', () => {
|
|
clearInterval(fetchDataTimer);
|
|
});
|
|
|
|
function fetchData() {
|
|
var eventList = document.querySelector('.event-list');
|
|
if (!eventList) return;
|
|
|
|
fetch(request_url).then(response => {
|
|
return response.json();
|
|
}).then(data => {
|
|
if (data.items.length === 0) {
|
|
eventList.innerHTML = '<hr>';
|
|
return;
|
|
}
|
|
// Clean the event list
|
|
eventList.innerHTML = '';
|
|
var prevEnd = 0; // used to decide where to insert an <hr>
|
|
|
|
data.items.forEach(event => {
|
|
// Parse data
|
|
var utc = new Date().getTimezoneOffset() * 60000;
|
|
var start = event.start.dateTime = new Date(event.start.dateTime || (new Date(event.start.date).getTime() + utc));
|
|
var end = event.end.dateTime = new Date(event.end.dateTime || (new Date(event.end.date).getTime() + utc));
|
|
|
|
tense = judgeTense(now, start, end); // 0:now 1:future -1:past
|
|
|
|
if (tense === 1 && prevEnd < now) {
|
|
eventList.innerHTML += '<hr>';
|
|
}
|
|
|
|
eventDOM = buildEventDOM(tense, event);
|
|
eventList.innerHTML += eventDOM;
|
|
|
|
prevEnd = end;
|
|
});
|
|
});
|
|
}
|
|
|
|
function getRelativeTime(current, previous) {
|
|
var msPerMinute = 60 * 1000;
|
|
var msPerHour = msPerMinute * 60;
|
|
var msPerDay = msPerHour * 24;
|
|
var msPerMonth = msPerDay * 30;
|
|
var msPerYear = msPerDay * 365;
|
|
|
|
var elapsed = current - previous;
|
|
var tense = elapsed > 0 ? 'ago' : 'later';
|
|
|
|
elapsed = Math.abs(elapsed);
|
|
|
|
if ( elapsed < msPerHour ) {
|
|
return Math.round(elapsed / msPerMinute) + ' minutes ' + tense;
|
|
}
|
|
else if ( elapsed < msPerDay ) {
|
|
return Math.round(elapsed / msPerHour) + ' hours ' + tense;
|
|
}
|
|
else if ( elapsed < msPerMonth ) {
|
|
return 'about ' + Math.round(elapsed / msPerDay) + ' days ' + tense;
|
|
}
|
|
else if ( elapsed < msPerYear ) {
|
|
return 'about ' + Math.round(elapsed / msPerMonth) + ' months ' + tense;
|
|
}
|
|
else {
|
|
return 'about' + Math.round(elapsed / msPerYear) + ' years' + tense;
|
|
}
|
|
}
|
|
|
|
function judgeTense(now, eventStart, eventEnd) {
|
|
if (eventEnd < now) { return -1; }
|
|
else if (eventStart > now) { return 1; }
|
|
else { return 0; }
|
|
}
|
|
|
|
function buildEventDOM(tense, event) {
|
|
var tenseClass = '';
|
|
var start = event.start.dateTime;
|
|
var end = event.end.dateTime;
|
|
switch(tense) {
|
|
case 0 : // now
|
|
tenseClass = 'event-now';
|
|
break;
|
|
case 1 : // future
|
|
tenseClass = 'event-future';
|
|
break;
|
|
case -1: // past
|
|
tenseClass = 'event-past';
|
|
break;
|
|
default:
|
|
throw 'Time data error';
|
|
}
|
|
var durationFormat = {
|
|
weekday: 'short',
|
|
hour : '2-digit',
|
|
minute : '2-digit'
|
|
};
|
|
var relativeTimeStr = (tense === 0) ? 'NOW' : getRelativeTime(now, start);
|
|
var durationStr = start.toLocaleTimeString([], durationFormat) + ' - ' + end.toLocaleTimeString([], durationFormat);
|
|
|
|
var locationDOM = '';
|
|
if (calendar.showLocation && event.location) {
|
|
locationDOM = '<span class="event-location event-details">' + event.location + '</span>';
|
|
}
|
|
|
|
var eventContent = `<div class="event ${tenseClass}">
|
|
<h2 class="event-summary">
|
|
${event.summary}
|
|
<span class="event-relative-time">${relativeTimeStr}</span>
|
|
</h2>
|
|
${locationDOM}
|
|
<span class="event-duration event-details">${durationStr}</span>
|
|
</div>`;
|
|
return eventContent;
|
|
}
|
|
})();
|
|
</script>
|
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
</div>
|
|
|
|
|
|
<script>
|
|
window.addEventListener('tabs:register', () => {
|
|
let { activeClass } = CONFIG.comments;
|
|
if (CONFIG.comments.storage) {
|
|
activeClass = localStorage.getItem('comments_active') || activeClass;
|
|
}
|
|
if (activeClass) {
|
|
let activeTab = document.querySelector(`a[href="#comment-${activeClass}"]`);
|
|
if (activeTab) {
|
|
activeTab.click();
|
|
}
|
|
}
|
|
});
|
|
if (CONFIG.comments.storage) {
|
|
window.addEventListener('tabs:click', event => {
|
|
if (!event.target.matches('.tabs-comment .tab-content .tab-pane')) return;
|
|
let commentClass = event.target.classList[1];
|
|
localStorage.setItem('comments_active', commentClass);
|
|
});
|
|
}
|
|
</script>
|
|
|
|
</div>
|
|
|
|
|
|
<div class="toggle sidebar-toggle">
|
|
<span class="toggle-line toggle-line-first"></span>
|
|
<span class="toggle-line toggle-line-middle"></span>
|
|
<span class="toggle-line toggle-line-last"></span>
|
|
</div>
|
|
|
|
<aside class="sidebar">
|
|
<div class="sidebar-inner">
|
|
|
|
<ul class="sidebar-nav motion-element">
|
|
<li class="sidebar-nav-toc">
|
|
文章目录
|
|
</li>
|
|
<li class="sidebar-nav-overview">
|
|
站点概览
|
|
</li>
|
|
</ul>
|
|
|
|
<!--noindex-->
|
|
<div class="post-toc-wrap sidebar-panel">
|
|
</div>
|
|
<!--/noindex-->
|
|
|
|
<div class="site-overview-wrap sidebar-panel">
|
|
<div class="site-author motion-element" itemprop="author" itemscope itemtype="http://schema.org/Person">
|
|
<p class="site-author-name" itemprop="name">啊卓</p>
|
|
<div class="site-description" itemprop="description"></div>
|
|
</div>
|
|
<div class="site-state-wrap motion-element">
|
|
<nav class="site-state">
|
|
<div class="site-state-item site-state-posts">
|
|
<a href="/archives/">
|
|
|
|
<span class="site-state-item-count">2</span>
|
|
<span class="site-state-item-name">日志</span>
|
|
</a>
|
|
</div>
|
|
<div class="site-state-item site-state-tags">
|
|
<a href="/tags/">
|
|
|
|
<span class="site-state-item-count">1</span>
|
|
<span class="site-state-item-name">标签</span></a>
|
|
</div>
|
|
</nav>
|
|
</div>
|
|
<div class="links-of-author motion-element">
|
|
<span class="links-of-author-item">
|
|
<a href="https://github.com/yourname" title="GitHub → https://github.com/yourname" rel="noopener" target="_blank"><i class="fab fa-github fa-fw"></i>GitHub</a>
|
|
</span>
|
|
<span class="links-of-author-item">
|
|
<a href="mailto:yourname@gmail.com" title="E-Mail → mailto:yourname@gmail.com" rel="noopener" target="_blank"><i class="fa fa-envelope fa-fw"></i>E-Mail</a>
|
|
</span>
|
|
<span class="links-of-author-item">
|
|
<a href="https://weibo.com/yourname" title="Weibo → https://weibo.com/yourname" rel="noopener" target="_blank"><i class="fab fa-weibo fa-fw"></i>Weibo</a>
|
|
</span>
|
|
</div>
|
|
|
|
|
|
|
|
</div>
|
|
|
|
</div>
|
|
</aside>
|
|
<div id="sidebar-dimmer"></div>
|
|
|
|
|
|
</div>
|
|
</main>
|
|
|
|
<footer class="footer">
|
|
<div class="footer-inner">
|
|
|
|
|
|
|
|
<div class="beian" style="text-align: center"><a href="https://beian.miit.gov.cn/" rel="noopener" target="_blank">豫ICP备19045614号-2 </a>
|
|
<img src="http://www.beian.gov.cn/img/new/gongan.png" style="display: inline-block;">
|
|
|
|
©
|
|
<span itemprop="copyrightYear">2022</span>
|
|
<span class="with-love">
|
|
<i class="fa fa-heart"></i>
|
|
</span>
|
|
<span class="author" itemprop="copyrightHolder">啊卓</span>
|
|
</div>
|
|
|
|
|
|
<div class="copyright" style="display: none">
|
|
|
|
©
|
|
<span itemprop="copyrightYear">2022</span>
|
|
<span class="with-love">
|
|
<i class="fa fa-heart"></i>
|
|
</span>
|
|
<span class="author" itemprop="copyrightHolder">啊卓</span>
|
|
<!--  -->
|
|
<!-- <a target="_blank" rel="noopener" href="http://www.beian.miit.gov.cn/">豫ICP备19045614号-2</a>-->
|
|
<!--
|
|
<span class="post-count">博客全站共92字</span>
|
|
-->
|
|
</div>
|
|
|
|
<div style="text-align: center">
|
|
<script type="text/javascript">document.write(unescape("%3Cspan id='cnzz_stat_icon_1280972500'%3E%3C/span%3E%3Cscript src='https://s4.cnzz.com/z_stat.php%3Fid%3D1280972500%26online%3D1%26show%3Dline' type='text/javascript'%3E%3C/script%3E"));</script>
|
|
|
|
<div class="theme-info">
|
|
<div class="powered-by"></div>
|
|
<span class="post-count">博客全站共92字</span>
|
|
</div>
|
|
</div>
|
|
<div class="powered-by" style="display: none">
|
|
|
|
</div>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
</div>
|
|
</footer>
|
|
</div>
|
|
|
|
|
|
<script src="/lib/anime.min.js"></script>
|
|
<script src="/lib/velocity/velocity.min.js"></script>
|
|
<script src="/lib/velocity/velocity.ui.min.js"></script>
|
|
|
|
<script src="/js/utils.js"></script>
|
|
|
|
<script src="/js/motion.js"></script>
|
|
|
|
|
|
<script src="/js/schemes/muse.js"></script>
|
|
|
|
|
|
<script src="/js/next-boot.js"></script>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
</body>
|
|
</html>
|