From 76cf7053f96d5f69e5f1dee76f304434d13ebdb9 Mon Sep 17 00:00:00 2001
From: mjsoftware <1406993111@qq.com>
Date: Sun, 18 Feb 2024 17:11:58 +0800
Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96=EF=BC=9A=E6=96=B0=E5=A2=9E?=
 =?UTF-8?q?=E4=BE=A7=E8=BE=B9=E6=A0=8F-=E4=BA=BA=E7=94=9F=E5=80=92?=
 =?UTF-8?q?=E8=AE=A1=E6=97=B6?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 settings.yaml                  |   2 +
 src/css/style.less             | 108 +++++++++++++++++++++++++++++++++
 src/js/common.js               |  90 ++++++++++++++++++++++++++-
 templates/widget/timelife.html |  10 +++
 4 files changed, 209 insertions(+), 1 deletion(-)
 create mode 100644 templates/widget/timelife.html

diff --git a/settings.yaml b/settings.yaml
index 4010805..a735535 100644
--- a/settings.yaml
+++ b/settings.yaml
@@ -642,6 +642,8 @@ spec:
                   label:  文章标签模块
                 - value: 'tagcloud'
                   label:  文章标签云模块
+                - value: 'timelife'
+                  label:  人生倒计时
             - $formkit: select
               name: position
               label: 模块位置
diff --git a/src/css/style.less b/src/css/style.less
index ff05a6b..fdc0a8c 100644
--- a/src/css/style.less
+++ b/src/css/style.less
@@ -3195,6 +3195,114 @@ button.swiper-pagination-bullet {
       line-height: 1.4em;
     }
   }
+
+  /*人生计时器*/
+  &.timelife {
+
+    .item {
+      margin-bottom: 15px;
+
+      &:last-child {
+        margin-bottom: 0;
+      }
+
+      .title {
+        font-size: 12px;
+        color: var(--main);
+        margin-bottom: 5px;
+        display: flex;
+        align-items: center;
+
+        .text {
+          color: var(--theme);
+          font-weight: 500;
+          font-size: 14px;
+          margin: 0 5px;
+        }
+      }
+
+      .progress {
+        display: flex;
+        align-items: center;
+
+        &-bar {
+          height: 10px;
+          border-radius: 5px;
+          overflow: hidden;
+          background: var(--dark-b);
+          width: 0;
+          min-width: 0;
+          flex: 1;
+          margin-right: 5px;
+
+          &-inner {
+            width: 0;
+            height: 100%;
+            border-radius: 5px;
+            transition: width 0.35s;
+            animation: progress 750ms linear infinite;
+
+            &-0 {
+              background: #bde6ff;
+              background-image: linear-gradient(135deg,
+              #50bfff 25%,
+              transparent 25%,
+              transparent 50%,
+              #50bfff 50%,
+              #50bfff 75%,
+              transparent 75%,
+              transparent 100%);
+              background-size: 30px 30px;
+            }
+
+            &-1 {
+              background: #ffd980;
+              background-image: linear-gradient(135deg,
+              #f7ba2a 25%,
+              transparent 25%,
+              transparent 50%,
+              #f7ba2a 50%,
+              #f7ba2a 75%,
+              transparent 75%,
+              transparent 100%);
+              background-size: 30px 30px;
+            }
+
+            &-2 {
+              background: #ffa9a9;
+              background-image: linear-gradient(135deg,
+              #ff4949 25%,
+              transparent 25%,
+              transparent 50%,
+              #ff4949 50%,
+              #ff4949 75%,
+              transparent 75%,
+              transparent 100%);
+              background-size: 30px 30px;
+            }
+
+            &-3 {
+              background: #67c23a;
+              background-image: linear-gradient(135deg,
+              #4f9e28 25%,
+              transparent 25%,
+              transparent 50%,
+              #4f9e28 50%,
+              #4f9e28 75%,
+              transparent 75%,
+              transparent 100%);
+              background-size: 30px 30px;
+            }
+          }
+        }
+
+        &-percentage {
+          width: 38px;
+          color: var(--main);
+        }
+      }
+    }
+  }
 }
 
 .main-content {
diff --git a/src/js/common.js b/src/js/common.js
index 4e90a3f..1e82f17 100644
--- a/src/js/common.js
+++ b/src/js/common.js
@@ -425,6 +425,94 @@ const commonContext = {
 
     webCopyright.innerText = '© '+getYear + '-'+nowYear+' '+ DreamConfig.site_title
   },
+  /* 激活侧边栏人生倒计时 */
+  initTimeCount() {
+    if (!$('.card.widget.timelife').length) {
+      return
+    }
+    let timelife = [
+      {
+        title: '今日已经过去',
+        endTitle: '小时',
+        num: 0,
+        percent: '0%',
+      },
+      {
+        title: '这周已经过去',
+        endTitle: '天',
+        num: 0,
+        percent: '0%',
+      },
+      {
+        title: '本月已经过去',
+        endTitle: '天',
+        num: 0,
+        percent: '0%',
+      },
+      {
+        title: '今年已经过去',
+        endTitle: '个月',
+        num: 0,
+        percent: '0%',
+      },
+    ]
+    {
+      let nowDate = +new Date()
+      let todayStartDate = new Date(new Date().toLocaleDateString()).getTime()
+      let todayPassHours = (nowDate - todayStartDate) / 1000 / 60 / 60
+      let todayPassHoursPercent = (todayPassHours / 24) * 100
+      timelife[0].num = parseInt(todayPassHours)
+      timelife[0].percent = parseInt(todayPassHoursPercent) + '%'
+    }
+    {
+      let weeks = {
+        0: 7,
+        1: 1,
+        2: 2,
+        3: 3,
+        4: 4,
+        5: 5,
+        6: 6,
+      }
+      let weekDay = weeks[new Date().getDay()]
+      let weekDayPassPercent = (weekDay / 7) * 100
+      timelife[1].num = parseInt(weekDay)
+      timelife[1].percent = parseInt(weekDayPassPercent) + '%'
+    }
+    {
+      let year = new Date().getFullYear()
+      let date = new Date().getDate()
+      let month = new Date().getMonth() + 1
+      let monthAll = new Date(year, month, 0).getDate()
+      let monthPassPercent = (date / monthAll) * 100
+      timelife[2].num = date
+      timelife[2].percent = parseInt(monthPassPercent) + '%'
+    }
+    {
+      let month = new Date().getMonth() + 1
+      let yearPass = (month / 12) * 100
+      timelife[3].num = month
+      timelife[3].percent = parseInt(yearPass) + '%'
+    }
+    let htmlStr = ''
+    timelife.forEach((item, index) => {
+      htmlStr += `
+						<div class="item">
+							<div class="title">
+								${item.title}
+								<span class="text">${item.num}</span>
+								${item.endTitle}
+							</div>
+							<div class="progress">
+								<div class="progress-bar">
+									<div class="progress-bar-inner progress-bar-inner-${index}" style="width: ${item.percent}"></div>
+								</div>
+								<div class="progress-percentage">${item.percent}</div>
+							</div>
+						</div>`
+    })
+    $('.aside-timelife').html(htmlStr)
+  },
   /* 初始化评论区 */
   initComment() {
     if (!window.CommentWidget) {
@@ -472,7 +560,7 @@ const commonContext = {
 window.commonContext = commonContext
 
 !(function () {
-  const loads = ['initCarousel', 'sparkInput', 'websiteTime', 'initComment', 'webCopyright']
+  const loads = ['initCarousel', 'sparkInput', 'websiteTime', 'initComment', 'webCopyright', 'initTimeCount']
   const omits = ['initEffects', 'loadMaintain', 'showThemeVersion']
 
   Object.keys(commonContext).forEach(
diff --git a/templates/widget/timelife.html b/templates/widget/timelife.html
new file mode 100644
index 0000000..c123c5a
--- /dev/null
+++ b/templates/widget/timelife.html
@@ -0,0 +1,10 @@
+<div xmlns:th="https://www.thymeleaf.org"
+     th:fragment="widget (hide)"
+     th:class="'card widget timelife ' + ${hide}">
+
+    <div class="card-title">
+        <i class="ri-hourglass-line card-title-label"></i>
+        <span>人生倒计时</span>
+    </div>
+    <div class="card-content aside-timelife"></div>
+</div>