john 8 月之前
父節點
當前提交
52b160322a

+ 5 - 2
frontEndMobile/package.json

@@ -17,11 +17,13 @@
   },
   "dependencies": {
     "axios": "^1.7.7",
+    "dayjs": "^1.11.13",
     "pinia": "^2.1.7",
     "qa": "^0.0.19",
     "vant": "^4.9.8",
     "vue": "^3.5.12",
-    "vue-router": "^4.4.5"
+    "vue-router": "^4.4.5",
+    "vue3-hash-calendar": "^1.1.3"
   },
   "volta": {
     "node": "18.20.4"
@@ -33,7 +35,8 @@
     "@vue/compiler-sfc": "^3.5.12",
     "less": "^4.2.0",
     "path": "^0.12.7",
-    "sass-embedded": "^1.80.7",
+    "sass": "^1.81.0",
+    "sass-embedded": "^1.81.0",
     "typescript": "~5.6.2",
     "vite": "^5.4.10",
     "vue-tsc": "^2.1.8"

+ 44 - 19
frontEndMobile/src/App.vue

@@ -1,14 +1,14 @@
 <script setup lang="ts">
-import { showToast } from 'vant';
-import { watch, ref } from 'vue'
+import { showToast } from 'vant'
+import { watch, ref, onMounted } from 'vue'
 import { useRouter, useRoute } from 'vue-router'
 
 const router = useRouter()
 const route = useRoute()
 const title = ref('首页')
 const isBack = ref(false)
-// import HelloWorld from './components/HelloWorld.vue'
-// import tabbar from '@/components/tabbar.vue'
+const active = ref('首页')
+const isTabbar = ref(true)
 
 watch(
   route,
@@ -21,36 +21,61 @@ watch(
 )
 
 watch(title, (newValue) => {
-  isBack.value = newValue !== '首页'
+  pageInit(newValue)
 })
-const onClickRight = () => {
+const onClickLeft = () => {
+  router.go(-1)
+}
 
+function pageInit(newValue) {
+  isBack.value = ['首页', '我的'].indexOf(newValue) < 0
+  isTabbar.value = ['首页', '我的'].indexOf(newValue) > -1
+  if(['首页', '我的', '记账'].indexOf(newValue) > -1) {
+    active.value = newValue
+  }
 }
+
+onMounted(() => {
+  setTimeout(() => {
+    title.value = route.meta.title || '首页'
+  }, 300)
+
+})
 </script>
 
 <template>
-  <!-- <div>
-    <a href="https://vite.dev" target="_blank">
-      <img src="/vite.svg" class="logo" alt="Vite logo" />
-    </a>
-    <a href="https://vuejs.org/" target="_blank">
-      <img src="./assets/vue.svg" class="logo vue" alt="Vue logo" />
-    </a>
-  </div>
-  <HelloWorld msg="Vite + Vue" /><tabbar /> -->
   <van-nav-bar
     :title="title"
     :left-text="isBack ? '返回' : ''"
     :left-arrow="isBack"
-    @click-right="onClickRight"
+    @click-left="onClickLeft"
   />
-  <div class="view-box">
+  <div :class="['view-box', !isTabbar && 'no-tabbar']">
     <RouterView />
   </div>
+  <van-tabbar v-model="active" v-if="isTabbar || false">
+    <van-tabbar-item name="首页" to="/home" icon="balance-list-o">明细</van-tabbar-item>
+    <van-tabbar-item name="记账" to="/accountLog" class="add-box" icon="add-o">记账</van-tabbar-item>
+    <van-tabbar-item name="我的" to="/me" icon="contact-o">我的</van-tabbar-item>
+  </van-tabbar>
 </template>
 
-<style scoped>
+<style scoped lang="scss">
 .view-box {
-  height: calc(100vh - 70px);
+  height: calc(
+    100vh - 98px + constant(safe-area-inset-bottom)
+  ); /* 兼容 iOS < 11.2 */
+  height: calc(
+    100vh - 98px + env(safe-area-inset-bottom)
+  ); /* 兼容 iOS >= 11.2 */
+  overflow-y: scroll;
+  &.no-tabbar {
+    height: calc(
+      100vh - 46px + constant(safe-area-inset-bottom)
+    ); /* 兼容 iOS < 11.2 */
+    height: calc(
+      100vh - 46px + constant(ssafe-area-inset-bottom)
+    ); /* 兼容 iOS >= 11.2 */
+  }
 }
 </style>

+ 63 - 0
frontEndMobile/src/components/RecordInRow.vue

@@ -0,0 +1,63 @@
+<template>
+  <div
+    v-for="(item, index) in time_record_list"
+    :key="`${yearStr}_${monthlyStr}_${index}`"
+    class="records_time_box"
+  >
+    <div class="time-box">
+      <div>11月30日</div>
+      <div>
+        <span>收入: 888</span>
+        <span>支出: 888</span>
+      </div>
+    </div>
+    <!-- 日期 -->
+    <div
+      v-for="(record, recordIndex) in item.record_list"
+      class="record-box"
+      :key="`${yearStr}_${monthlyStr}_${index}_${recordIndex}`"
+    >
+      <div>零食</div>
+      <div>-8</div>
+    </div>
+  </div>
+</template>
+
+<script setup>
+import { toRefs, defineProps } from 'vue'
+
+const props = defineProps({
+  time_record_list: Object,
+  yearStr: String,
+  monthlyStr: String
+})
+
+const { time_record_list } = toRefs(props)
+const { yearStr } = toRefs(props)
+const { monthlyStr } = toRefs(props)
+</script>
+
+<style lang="scss" scoped>
+/* 当月详细账单 */
+.records-box {
+  background-color: #999;
+  overflow-y: scroll;
+  height: calc(100vh - 96px - 75px);
+  border-top: 1px solid #999;
+  .records_time_box {
+    border-bottom: 1px solid #999;
+    .time-box {
+      display: flex;
+      justify-content: space-between;
+      padding: 5px 12px;
+      font-size: 12px;
+      color: #999;
+    }
+    .record-box {
+      display: flex;
+      justify-content: space-between;
+      padding: 5px 12px;
+    }
+  }
+}
+</style>

+ 4 - 0
frontEndMobile/src/main.ts

@@ -1,8 +1,11 @@
 import { createApp } from 'vue'
 // 1. 引入你需要的组件
 import vant from 'vant'
+import VueHashCalendar from 'vue3-hash-calendar';
+
 // 2. 引入组件样式
 import 'vant/lib/index.css'
+import 'vue3-hash-calendar/es/index.css';
 
 import { createPinia } from 'pinia'
 
@@ -20,4 +23,5 @@ setupRouter(app);
 setupStore(app);
 app.use(pinia)
 app.use(vant)
+app.use(VueHashCalendar)
 app.mount('#app')

+ 0 - 2
frontEndMobile/src/router/routes/index.ts

@@ -9,9 +9,7 @@ console.log(66666, modules);
 const routes: RouteRecordRaw[] = []
 
 Object.keys(modules).forEach((key) => {
-  console.log(12, key)
   const modulesRoutes = modules[key].default || {}
-
   let modRoutesList = []
   if (Array.isArray(modulesRoutes)) {
     modRoutesList = [...modulesRoutes]

+ 16 - 0
frontEndMobile/src/router/routes/modules/common.ts

@@ -11,6 +11,22 @@ const routes: RouteRecordRaw[] = [
     },
     component: () => import('@/views/HomePage.vue')
   },
+  {
+    path: '/me',
+    name: 'me',
+    meta: {
+      title: '我的'
+    },
+    component: () => import('@/views/MePage.vue')
+  },
+  {
+    path: '/accountLog',
+    name: 'accountLog',
+    meta: {
+      title: '记账'
+    },
+    component: () => import('@/views/AccountLogPage.vue')
+  },
   {
     path: '/login',
     name: 'login',

+ 41 - 0
frontEndMobile/src/views/AccountLogPage.vue

@@ -0,0 +1,41 @@
+<template>
+  <vue-hash-calendar
+    :change-year-fast="true"
+    @change="calendarChange"
+    show-arrow
+  />
+  <!-- <div @click="getuserToken">getuserToken</div>
+  <br />
+  <div @click="getuserInfo">getuserInfo</div>
+
+  <br /> -->
+
+  <!-- mark-date 标记 -->
+</template>
+
+<script setup>
+import { onMounted } from 'vue'
+import dayjs from 'dayjs'
+import { loginUser, getUserInfo } from '@/api/api.ts'
+async function getuserToken() {
+  const res = await loginUser({
+    account: 'x.czvufulcym@qqxhjl.ee',
+    account_type: 2,
+    password: 'admin'
+  })
+  console.log(13, res.data.token)
+  window.localStorage.setItem('token', res.data.token)
+}
+async function getuserInfo() {
+  const res = await getUserInfo()
+  console.log(13, res)
+}
+
+onMounted(() => {
+  console.log('home onShow')
+})
+
+const calendarChange = (date) => {
+  console.log(40, dayjs(date).format('YYYY-MM-DD'))
+}
+</script>

+ 127 - 17
frontEndMobile/src/views/HomePage.vue

@@ -1,25 +1,135 @@
 <template>
   <div>
-    99999
+    <div class="time-box title-fs">
+      <div class="yarn-box">
+        <div class="year" @click="selectTime">{{ yearStr }}年</div>
+        <div>收入</div>
+      </div>
+      <div class="yarn-box space-between">
+        <div>支出</div>
+        <div><van-icon name="eye-o" /></div>
+      </div>
+    </div>
+    <div class="time-box">
+      <div class="yarn-box">
+        <div class="year right-line" @click="selectTime">
+          {{ monthlyStr }}月
+        </div>
+        <div>0.00</div>
+      </div>
+      <div class="yarn-box">
+        <div>99999</div>
+      </div>
+    </div>
   </div>
-  <div @click="getuserToken">Home</div>
-  <div @click="getuserInfo">getuserInfo</div>
+
+  <!-- 时间列表 -->
+  <div class="records-box">
+    <RecordInRow :time_record_list="time_record_list" :monthlyStr="monthlyStr" :yearStr=yearStr></RecordInRow>
+  </div>
+
+  <!-- 选择时间 -->
+  <van-action-sheet v-model:show="showSelectTime" title="" :closeable="false">
+    <van-date-picker
+      @cancel="cancelSelectTime"
+      @confirm="confirmSelectTime"
+      :columns-type="['year', 'month']"
+      v-model="currentDateAfter"
+      title="选择日期"
+    />
+  </van-action-sheet>
 </template>
 
 <script setup>
-console.log(77777);
-
-import { loginUser, getUserInfo } from '@/api/api.ts'
-/* async function getuserToken() {
-  const res = await loginUser({
-    account: 'x.czvufulcym@qqxhjl.ee',
-    account_type: 2,
-    password: 'admin'
-  })
-  console.log(13, res);
-} */
-async function getuserInfo() {
-  const res = await getUserInfo()
-  console.log(13, res);
+import { ref, computed, watch, onMounted } from 'vue'
+import dayjs from 'dayjs'
+import RecordInRow from "@/components/RecordInRow.vue"
+
+const showSelectTime = ref(false)
+const currentDate = ref([])
+const currentDateAfter = ref([])
+
+const time_record_list = ref([])
+
+const selectTime = () => {
+  if (!currentDate.value.length) {
+    const timeStr = dayjs().format('YYYY,MM')
+    currentDate.value = timeStr.split(',')
+  }
+  showSelectTime.value = true
+
+  currentDateAfter.value = currentDate.value
+}
+
+const cancelSelectTime = () => {
+  showSelectTime.value = false
+}
+
+const confirmSelectTime = ({ selectedValues }) => {
+  currentDate.value = selectedValues
+  cancelSelectTime()
 }
+
+const yearStr = computed(() => {
+  if (!currentDate.value.length) {
+    const timeStr = dayjs().format('YYYY,MM')
+    return timeStr.split(',')[0]
+  }
+  return `${currentDate.value[0]}`
+})
+const monthlyStr = computed(() => {
+  if (!currentDate.value.length) {
+    const timeStr = dayjs().format('YYYY,MM')
+    return timeStr.split(',')[1]
+  }
+  return `${currentDate.value[1]}`
+})
+
+onMounted(() => {
+  for (let index = 0; index < 40; index++) {
+    const elm = {
+      name: 'name' + index,
+      record_list: []
+    }
+    for (let j = 0; j < 10; j++) {
+      elm.record_list.push({})
+    }
+
+    time_record_list.value.push(elm)
+  }
+})
 </script>
+
+<style scoped lang="scss">
+.time-box {
+  display: flex;
+  justify-content: space-between;
+  padding: 0 12px 12px;
+
+  .yarn-box {
+    width: 40%;
+    display: flex;
+
+    .year {
+      width: 60px;
+      &.right-line {
+        text-align: left;
+      }
+    }
+  }
+  font-size: 20px;
+  &.title-fs {
+    font-size: 12px;
+    padding-bottom: 0;
+    padding-top: 12px;
+    .yarn-box {
+      text-align: left;
+    }
+    .yarn-box.space-between {
+      justify-content: space-between;
+    }
+  }
+}
+
+
+</style>

+ 3 - 0
frontEndMobile/src/views/MePage.vue

@@ -0,0 +1,3 @@
+<template>
+  <div>me</div>
+</template>

+ 33 - 19
frontEndMobile/vite.config.ts

@@ -1,27 +1,41 @@
-import { defineConfig } from 'vite'
-import vue from '@vitejs/plugin-vue'
-import { resolve, dirname } from 'path';
-import { fileURLToPath } from 'url';
-
-
-// 获取当前文件的目录
-// const __dirname = dirname(fileURLToPath(import.meta.url));
+import { defineConfig } from 'vite';
+import vue from '@vitejs/plugin-vue';
+import { resolve } from 'path';
 
 // https://vitejs.dev/config/
 export default defineConfig({
- resolve: {
-   alias: {
-     '@': resolve(__dirname, './src')
-   }
- },
+  // 路径解析
+  resolve: {
+    alias: {
+      '@': resolve(__dirname, './src'), // 使用 '@' 作为 src 路径别名
+    },
+  },
+  // 插件配置
   plugins: [vue()],
+  // 开发服务器配置
   server: {
-    host: 'localhost',
-    port: 3031,
-    open: true // 启动服务时自动打开浏览器
+    host: '0.0.0.0', // 允许外部设备访问
+    port: 3032, // 自定义端口
+    open: true, // 启动服务时自动打开默认浏览器
+    strictPort: true, // 如果端口被占用,则直接退出,而不是尝试下一个可用端口
+    cors: true, // 启用 CORS
   },
+  // 构建配置
   build: {
     outDir: 'dist', // 构建输出目录
-    sourcemap: true, // 生成 sourcemap 以便于调试
-  }
-})
+    sourcemap: true, // 生成 source map,便于调试
+    chunkSizeWarningLimit: 500, // 调整 chunk 大小警告阈值(默认 500KB)
+    rollupOptions: {
+      output: {
+        manualChunks: {
+          // 将依赖拆分成独立的 chunk
+          vendor: ['vue'], // 单独打包 Vue 相关库
+        },
+      },
+    },
+  },
+  // 其他优化选项
+  optimizeDeps: {
+    include: ['vue'], // 提前优化 vue 相关依赖
+  },
+});

+ 308 - 125
frontEndMobile/yarn.lock

@@ -186,6 +186,95 @@
   resolved "https://registry.npmmirror.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz#3188bcb273a414b0d215fd22a58540b989b9409a"
   integrity sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==
 
+"@parcel/watcher-android-arm64@2.5.0":
+  version "2.5.0"
+  resolved "https://registry.npmmirror.com/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.0.tgz#e32d3dda6647791ee930556aee206fcd5ea0fb7a"
+  integrity sha512-qlX4eS28bUcQCdribHkg/herLe+0A9RyYC+mm2PXpncit8z5b3nSqGVzMNR3CmtAOgRutiZ02eIJJgP/b1iEFQ==
+
+"@parcel/watcher-darwin-arm64@2.5.0":
+  version "2.5.0"
+  resolved "https://registry.npmmirror.com/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.0.tgz#0d9e680b7e9ec1c8f54944f1b945aa8755afb12f"
+  integrity sha512-hyZ3TANnzGfLpRA2s/4U1kbw2ZI4qGxaRJbBH2DCSREFfubMswheh8TeiC1sGZ3z2jUf3s37P0BBlrD3sjVTUw==
+
+"@parcel/watcher-darwin-x64@2.5.0":
+  version "2.5.0"
+  resolved "https://registry.npmmirror.com/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.0.tgz#f9f1d5ce9d5878d344f14ef1856b7a830c59d1bb"
+  integrity sha512-9rhlwd78saKf18fT869/poydQK8YqlU26TMiNg7AIu7eBp9adqbJZqmdFOsbZ5cnLp5XvRo9wcFmNHgHdWaGYA==
+
+"@parcel/watcher-freebsd-x64@2.5.0":
+  version "2.5.0"
+  resolved "https://registry.npmmirror.com/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.0.tgz#2b77f0c82d19e84ff4c21de6da7f7d096b1a7e82"
+  integrity sha512-syvfhZzyM8kErg3VF0xpV8dixJ+RzbUaaGaeb7uDuz0D3FK97/mZ5AJQ3XNnDsXX7KkFNtyQyFrXZzQIcN49Tw==
+
+"@parcel/watcher-linux-arm-glibc@2.5.0":
+  version "2.5.0"
+  resolved "https://registry.npmmirror.com/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.0.tgz#92ed322c56dbafa3d2545dcf2803334aee131e42"
+  integrity sha512-0VQY1K35DQET3dVYWpOaPFecqOT9dbuCfzjxoQyif1Wc574t3kOSkKevULddcR9znz1TcklCE7Ht6NIxjvTqLA==
+
+"@parcel/watcher-linux-arm-musl@2.5.0":
+  version "2.5.0"
+  resolved "https://registry.npmmirror.com/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.0.tgz#cd48e9bfde0cdbbd2ecd9accfc52967e22f849a4"
+  integrity sha512-6uHywSIzz8+vi2lAzFeltnYbdHsDm3iIB57d4g5oaB9vKwjb6N6dRIgZMujw4nm5r6v9/BQH0noq6DzHrqr2pA==
+
+"@parcel/watcher-linux-arm64-glibc@2.5.0":
+  version "2.5.0"
+  resolved "https://registry.npmmirror.com/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.0.tgz#7b81f6d5a442bb89fbabaf6c13573e94a46feb03"
+  integrity sha512-BfNjXwZKxBy4WibDb/LDCriWSKLz+jJRL3cM/DllnHH5QUyoiUNEp3GmL80ZqxeumoADfCCP19+qiYiC8gUBjA==
+
+"@parcel/watcher-linux-arm64-musl@2.5.0":
+  version "2.5.0"
+  resolved "https://registry.npmmirror.com/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.0.tgz#dcb8ff01077cdf59a18d9e0a4dff7a0cfe5fd732"
+  integrity sha512-S1qARKOphxfiBEkwLUbHjCY9BWPdWnW9j7f7Hb2jPplu8UZ3nes7zpPOW9bkLbHRvWM0WDTsjdOTUgW0xLBN1Q==
+
+"@parcel/watcher-linux-x64-glibc@2.5.0":
+  version "2.5.0"
+  resolved "https://registry.npmmirror.com/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.0.tgz#2e254600fda4e32d83942384d1106e1eed84494d"
+  integrity sha512-d9AOkusyXARkFD66S6zlGXyzx5RvY+chTP9Jp0ypSTC9d4lzyRs9ovGf/80VCxjKddcUvnsGwCHWuF2EoPgWjw==
+
+"@parcel/watcher-linux-x64-musl@2.5.0":
+  version "2.5.0"
+  resolved "https://registry.npmmirror.com/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.0.tgz#01fcea60fedbb3225af808d3f0a7b11229792eef"
+  integrity sha512-iqOC+GoTDoFyk/VYSFHwjHhYrk8bljW6zOhPuhi5t9ulqiYq1togGJB5e3PwYVFFfeVgc6pbz3JdQyDoBszVaA==
+
+"@parcel/watcher-win32-arm64@2.5.0":
+  version "2.5.0"
+  resolved "https://registry.npmmirror.com/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.0.tgz#87cdb16e0783e770197e52fb1dc027bb0c847154"
+  integrity sha512-twtft1d+JRNkM5YbmexfcH/N4znDtjgysFaV9zvZmmJezQsKpkfLYJ+JFV3uygugK6AtIM2oADPkB2AdhBrNig==
+
+"@parcel/watcher-win32-ia32@2.5.0":
+  version "2.5.0"
+  resolved "https://registry.npmmirror.com/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.0.tgz#778c39b56da33e045ba21c678c31a9f9d7c6b220"
+  integrity sha512-+rgpsNRKwo8A53elqbbHXdOMtY/tAtTzManTWShB5Kk54N8Q9mzNWV7tV+IbGueCbcj826MfWGU3mprWtuf1TA==
+
+"@parcel/watcher-win32-x64@2.5.0":
+  version "2.5.0"
+  resolved "https://registry.npmmirror.com/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.0.tgz#33873876d0bbc588aacce38e90d1d7480ce81cb7"
+  integrity sha512-lPrxve92zEHdgeff3aiu4gDOIt4u7sJYha6wbdEZDCDUhtjTsOMiaJzG5lMY4GkWH8p0fMmO2Ppq5G5XXG+DQw==
+
+"@parcel/watcher@^2.4.1":
+  version "2.5.0"
+  resolved "https://registry.npmmirror.com/@parcel/watcher/-/watcher-2.5.0.tgz#5c88818b12b8de4307a9d3e6dc3e28eba0dfbd10"
+  integrity sha512-i0GV1yJnm2n3Yq1qw6QrUrd/LI9bE8WEBOTtOkpCXHHdyN3TAGgqAK/DAT05z4fq2x04cARXt2pDmjWjL92iTQ==
+  dependencies:
+    detect-libc "^1.0.3"
+    is-glob "^4.0.3"
+    micromatch "^4.0.5"
+    node-addon-api "^7.0.0"
+  optionalDependencies:
+    "@parcel/watcher-android-arm64" "2.5.0"
+    "@parcel/watcher-darwin-arm64" "2.5.0"
+    "@parcel/watcher-darwin-x64" "2.5.0"
+    "@parcel/watcher-freebsd-x64" "2.5.0"
+    "@parcel/watcher-linux-arm-glibc" "2.5.0"
+    "@parcel/watcher-linux-arm-musl" "2.5.0"
+    "@parcel/watcher-linux-arm64-glibc" "2.5.0"
+    "@parcel/watcher-linux-arm64-musl" "2.5.0"
+    "@parcel/watcher-linux-x64-glibc" "2.5.0"
+    "@parcel/watcher-linux-x64-musl" "2.5.0"
+    "@parcel/watcher-win32-arm64" "2.5.0"
+    "@parcel/watcher-win32-ia32" "2.5.0"
+    "@parcel/watcher-win32-x64" "2.5.0"
+
 "@rollup/rollup-android-arm-eabi@4.25.0":
   version "4.25.0"
   resolved "https://registry.npmmirror.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.25.0.tgz#3e7eda4c0c1de6d2415343002d742ff95e38dca7"
@@ -518,11 +607,25 @@ brace-expansion@^2.0.1:
   dependencies:
     balanced-match "^1.0.0"
 
+braces@^3.0.3:
+  version "3.0.3"
+  resolved "https://registry.npmmirror.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789"
+  integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==
+  dependencies:
+    fill-range "^7.1.1"
+
 buffer-builder@^0.2.0:
   version "0.2.0"
   resolved "https://registry.npmmirror.com/buffer-builder/-/buffer-builder-0.2.0.tgz#3322cd307d8296dab1f604618593b261a3fade8f"
   integrity sha512-7VPMEPuYznPSoR21NE1zvd2Xna6c/CloiZCfcMXR1Jny6PjX0N4Nsa38zcBFo/FMK+BlA+FLKbJCQ0i2yxp+Xg==
 
+chokidar@^4.0.0:
+  version "4.0.1"
+  resolved "https://registry.npmmirror.com/chokidar/-/chokidar-4.0.1.tgz#4a6dff66798fb0f72a94f616abbd7e1a19f31d41"
+  integrity sha512-n8enUVCED/KVRQlab1hr3MVpcVMvxtZjmEa956u+4YijlmQED223XMSYj2tLuKvr4jcCTzNNMpQDUer72MMmzA==
+  dependencies:
+    readdirp "^4.0.1"
+
 cliui@^8.0.1:
   version "8.0.1"
   resolved "https://registry.npmmirror.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa"
@@ -578,6 +681,11 @@ csstype@^3.1.3:
   resolved "https://registry.npmmirror.com/csstype/-/csstype-3.1.3.tgz#d80ff294d114fb0e6ac500fbf85b60137d7eff81"
   integrity sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==
 
+dayjs@^1.11.13:
+  version "1.11.13"
+  resolved "https://registry.npmmirror.com/dayjs/-/dayjs-1.11.13.tgz#92430b0139055c3ebb60150aa13e860a4b5a366c"
+  integrity sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==
+
 de-indent@^1.0.2:
   version "1.0.2"
   resolved "https://registry.npmmirror.com/de-indent/-/de-indent-1.0.2.tgz#b2038e846dc33baa5796128d0804b455b8c1e21d"
@@ -595,6 +703,11 @@ delayed-stream@~1.0.0:
   resolved "https://registry.npmmirror.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619"
   integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==
 
+detect-libc@^1.0.3:
+  version "1.0.3"
+  resolved "https://registry.npmmirror.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b"
+  integrity sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==
+
 diff@^4.0.1:
   version "4.0.2"
   resolved "https://registry.npmmirror.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d"
@@ -666,6 +779,13 @@ events-to-array@^1.0.1:
   resolved "https://registry.npmmirror.com/events-to-array/-/events-to-array-1.1.2.tgz#2d41f563e1fe400ed4962fe1a4d5c6a7539df7f6"
   integrity sha512-inRWzRY7nG+aXZxBzEqYKB3HPgwflZRopAjDCHv0whhRx+MTUr1ei0ICZUypdyE0HRm4L2d5VEcIqLD6yl+BFA==
 
+fill-range@^7.1.1:
+  version "7.1.1"
+  resolved "https://registry.npmmirror.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292"
+  integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==
+  dependencies:
+    to-regex-range "^5.0.1"
+
 follow-redirects@^1.15.6:
   version "1.15.9"
   resolved "https://registry.npmmirror.com/follow-redirects/-/follow-redirects-1.15.9.tgz#a604fa10e443bf98ca94228d9eebcc2e8a2c8ee1"
@@ -757,11 +877,28 @@ inherits@2.0.3:
   resolved "https://registry.npmmirror.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de"
   integrity sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==
 
+is-extglob@^2.1.1:
+  version "2.1.1"
+  resolved "https://registry.npmmirror.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2"
+  integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==
+
 is-fullwidth-code-point@^3.0.0:
   version "3.0.0"
   resolved "https://registry.npmmirror.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d"
   integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==
 
+is-glob@^4.0.3:
+  version "4.0.3"
+  resolved "https://registry.npmmirror.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084"
+  integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==
+  dependencies:
+    is-extglob "^2.1.1"
+
+is-number@^7.0.0:
+  version "7.0.0"
+  resolved "https://registry.npmmirror.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b"
+  integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==
+
 is-what@^3.14.1:
   version "3.14.1"
   resolved "https://registry.npmmirror.com/is-what/-/is-what-3.14.1.tgz#e1222f46ddda85dead0fd1c9df131760e77755c1"
@@ -799,6 +936,14 @@ make-dir@^2.1.0:
     pify "^4.0.1"
     semver "^5.6.0"
 
+micromatch@^4.0.5:
+  version "4.0.8"
+  resolved "https://registry.npmmirror.com/micromatch/-/micromatch-4.0.8.tgz#d66fa18f3a47076789320b9b1af32bd86d9fa202"
+  integrity sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==
+  dependencies:
+    braces "^3.0.3"
+    picomatch "^2.3.1"
+
 mime-db@1.52.0:
   version "1.52.0"
   resolved "https://registry.npmmirror.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70"
@@ -860,6 +1005,11 @@ needle@^3.1.0:
     iconv-lite "^0.6.3"
     sax "^1.2.4"
 
+node-addon-api@^7.0.0:
+  version "7.1.1"
+  resolved "https://registry.npmmirror.com/node-addon-api/-/node-addon-api-7.1.1.tgz#1aba6693b0f255258a049d621329329322aad558"
+  integrity sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==
+
 once@^1.3.0:
   version "1.4.0"
   resolved "https://registry.npmmirror.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
@@ -900,6 +1050,11 @@ picocolors@^1.0.0, picocolors@^1.1.1:
   resolved "https://registry.npmmirror.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b"
   integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==
 
+picomatch@^2.3.1:
+  version "2.3.1"
+  resolved "https://registry.npmmirror.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42"
+  integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==
+
 pify@^4.0.1:
   version "4.0.1"
   resolved "https://registry.npmmirror.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231"
@@ -958,6 +1113,11 @@ qa@^0.0.19:
     ws "^8.17.0"
     yargs "^17.7.2"
 
+readdirp@^4.0.1:
+  version "4.0.2"
+  resolved "https://registry.npmmirror.com/readdirp/-/readdirp-4.0.2.tgz#388fccb8b75665da3abffe2d8f8ed59fe74c230a"
+  integrity sha512-yDMz9g+VaZkqBYS/ozoBJwaBhTbZo3UNYQHNRw1D3UFQB8oHB4uS/tAODO+ZLjGWmUbKnIlOWO+aaIiAxrUWHA==
+
 require-directory@^2.1.1:
   version "2.1.1"
   resolved "https://registry.npmmirror.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42"
@@ -1002,110 +1162,110 @@ rxjs@^7.4.0:
   resolved "https://registry.npmmirror.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a"
   integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==
 
-sass-embedded-android-arm64@1.80.7:
-  version "1.80.7"
-  resolved "https://registry.npmmirror.com/sass-embedded-android-arm64/-/sass-embedded-android-arm64-1.80.7.tgz#e5a28e08585b54b95ae782ca33d2c8ff53cc2e1e"
-  integrity sha512-Gwl/OY80uEA14MLm7efJvc1ErgGT51SvAv4/kIpTziOJpkk+999/nrEJHQ6YAJ7r5DuQcKvC3lHipcENUIpP9A==
-
-sass-embedded-android-arm@1.80.7:
-  version "1.80.7"
-  resolved "https://registry.npmmirror.com/sass-embedded-android-arm/-/sass-embedded-android-arm-1.80.7.tgz#6e8ed9b0988e6682833f970945ae54dbab95958a"
-  integrity sha512-pMxJ70yOGXYGmfoGlAMKqnr/nuP/UgKV3jc7v5kpmWGpPPMF2u63DM2QkvTqM32FyfwyxSycVaNFNT+gPomTiw==
-
-sass-embedded-android-ia32@1.80.7:
-  version "1.80.7"
-  resolved "https://registry.npmmirror.com/sass-embedded-android-ia32/-/sass-embedded-android-ia32-1.80.7.tgz#eb1d5554f44b599a460d6213a25e85975c09fe94"
-  integrity sha512-CJccGPgBePPYiXhyQWvgHF8AqjIDSGf+mcC4Ac/f5upRd9Z/vhQVrJfsDxt4c4tV0HGEfbQpT9xOCYF1Z6luZQ==
-
-sass-embedded-android-riscv64@1.80.7:
-  version "1.80.7"
-  resolved "https://registry.npmmirror.com/sass-embedded-android-riscv64/-/sass-embedded-android-riscv64-1.80.7.tgz#9a204555cf4d31c8d9b3893a25dd4be27ef37c6c"
-  integrity sha512-kIGcyuhNes9NUDzJ9VHy/ZGKdADCCt7JAwiC7lFSc6/xs5rJtGRn6hZ+mcG7gQWAezb5oK/VMQl8ps7HBFUEXw==
-
-sass-embedded-android-x64@1.80.7:
-  version "1.80.7"
-  resolved "https://registry.npmmirror.com/sass-embedded-android-x64/-/sass-embedded-android-x64-1.80.7.tgz#386f3ab0a6c13d84f0ac7d503c8210c2fdf295f8"
-  integrity sha512-oLMQiFpbSczOrGZSWlZvVJ1T9L6nDjS2u8PTxfT0MFX/FT3EhaxylHeiYKrmtY4epRufNCC/G96DMVqnSNa1QQ==
-
-sass-embedded-darwin-arm64@1.80.7:
-  version "1.80.7"
-  resolved "https://registry.npmmirror.com/sass-embedded-darwin-arm64/-/sass-embedded-darwin-arm64-1.80.7.tgz#16ea36eb9912ac629b67bc237e37df121c3f6e10"
-  integrity sha512-Vi5BbTWd9OO0tC60CPw5IY7w3Tccr1/Gy2DdkfE4qP6Rc368WmUis5ceG8ehAye0IT7aoRXpw8XTzWyXAZHbfw==
-
-sass-embedded-darwin-x64@1.80.7:
-  version "1.80.7"
-  resolved "https://registry.npmmirror.com/sass-embedded-darwin-x64/-/sass-embedded-darwin-x64-1.80.7.tgz#88e3cc6e821e5ec1d9e9ffb708e8cc928faefab0"
-  integrity sha512-yeANclgSHJ7K/XLG4Lnk7aQ5dk7K+oqIOtoOP0bjXgWsdPbes9V7k1ZJ9mZGl+f/XAPaRRPqjKs4WHU9s8m8MA==
-
-sass-embedded-linux-arm64@1.80.7:
-  version "1.80.7"
-  resolved "https://registry.npmmirror.com/sass-embedded-linux-arm64/-/sass-embedded-linux-arm64-1.80.7.tgz#c7fc8911590690b433819bbd18413aa72953271d"
-  integrity sha512-Idb5K9LHHWklN7A/kqWUd6sktA36V70bSjZ/gvCDu/5CBJBkMsVNdrxcdpGzrZe7pYV4XUTkMZOwf91owEywtQ==
-
-sass-embedded-linux-arm@1.80.7:
-  version "1.80.7"
-  resolved "https://registry.npmmirror.com/sass-embedded-linux-arm/-/sass-embedded-linux-arm-1.80.7.tgz#a7fc36a28f4ddff2d323233f35bf44ea24932748"
-  integrity sha512-ZttC6H2Z9YXUVFlprqZ0AgXuHdzqhvhUWsG7UUqkND9JSHvyFSwRij4h90aOK3gKg3PBGI4yG5tonLq2yV525A==
-
-sass-embedded-linux-ia32@1.80.7:
-  version "1.80.7"
-  resolved "https://registry.npmmirror.com/sass-embedded-linux-ia32/-/sass-embedded-linux-ia32-1.80.7.tgz#b49a09f3ad7f4b850743c6e4f8641ca5e45343bb"
-  integrity sha512-xKnWWEFz1jFc9xDAG7nMcjPBCTuiJbqvTmEtwQoWj79hQrzVdkLM6SiUGVbGa1c2s2fJMS3Bg2fkDJBK6/BcuQ==
-
-sass-embedded-linux-musl-arm64@1.80.7:
-  version "1.80.7"
-  resolved "https://registry.npmmirror.com/sass-embedded-linux-musl-arm64/-/sass-embedded-linux-musl-arm64-1.80.7.tgz#e76bf9c27155045d52e50347b7ed72d21a3f4ff2"
-  integrity sha512-7+GCYIh+c1BG4ot/PbTvVXUxd2GxDWcMxV7i3sARStQBDpTZFfohWdjUytLyqGxQgJIrbq0Q60Ucrw6HUJtJ9A==
-
-sass-embedded-linux-musl-arm@1.80.7:
-  version "1.80.7"
-  resolved "https://registry.npmmirror.com/sass-embedded-linux-musl-arm/-/sass-embedded-linux-musl-arm-1.80.7.tgz#13894262bd3512f68f405ec5e7d8672c49d4d0e0"
-  integrity sha512-gJLfSFiiuGaqWjaj0bcuhOlQ+t1jS9StuzXnW1b9gy2I6Y0uCprgbbELgtRVPSZlCG2BBolR76YCGQTB85M43Q==
-
-sass-embedded-linux-musl-ia32@1.80.7:
-  version "1.80.7"
-  resolved "https://registry.npmmirror.com/sass-embedded-linux-musl-ia32/-/sass-embedded-linux-musl-ia32-1.80.7.tgz#059b408cf686348e39719a02f0195c0456b889a6"
-  integrity sha512-Iw2E6P1lha335C5tGNgPjLD7Oll7OdLBJ7uPKaU+I7KbiOPk7ELsxUL9AYIrKO0/MLtgxGqOWWfTo/5cvU8xSA==
-
-sass-embedded-linux-musl-riscv64@1.80.7:
-  version "1.80.7"
-  resolved "https://registry.npmmirror.com/sass-embedded-linux-musl-riscv64/-/sass-embedded-linux-musl-riscv64-1.80.7.tgz#95b082ecadc32191139a540327d447eac36081bf"
-  integrity sha512-gd92dkDVpTh4xJb2hpX82E6el30h4MxCb7VJLwtbQSrQuxOlZgaDX4plMSZifsNTLvOsafdLCYyI+QsZRr8bkA==
-
-sass-embedded-linux-musl-x64@1.80.7:
-  version "1.80.7"
-  resolved "https://registry.npmmirror.com/sass-embedded-linux-musl-x64/-/sass-embedded-linux-musl-x64-1.80.7.tgz#3117be5592ff65a8e93323bca452695ccb98519b"
-  integrity sha512-i5udU+i0LZrL3dhHAgIfK7LBaHtScwAceiykndNIHyRXc1TY2DX3lG0EolVUvPyWFUNnvGCgxZF8oUToPzJ+pw==
-
-sass-embedded-linux-riscv64@1.80.7:
-  version "1.80.7"
-  resolved "https://registry.npmmirror.com/sass-embedded-linux-riscv64/-/sass-embedded-linux-riscv64-1.80.7.tgz#6a4cb268d319e5f194f0065f767a666b5226c140"
-  integrity sha512-DvnXvu019c6THNQnSWfy2eY/HFWZ2ogGUjRkdKAxj7U7i/YD+bsDIxdDQHZ48qzOguzx8n2aRa/clriM0HQPUA==
-
-sass-embedded-linux-x64@1.80.7:
-  version "1.80.7"
-  resolved "https://registry.npmmirror.com/sass-embedded-linux-x64/-/sass-embedded-linux-x64-1.80.7.tgz#dc50e838e9afb48663c80f70a12920a070727bbb"
-  integrity sha512-nQB+IZwCzVPpPkP5L9zV416/AGPLky7L2GGPWtvxG2CEeTV1Rzet+gkhzk2eYEdbh+3py/w9YVRTaQuZ3QV0vQ==
-
-sass-embedded-win32-arm64@1.80.7:
-  version "1.80.7"
-  resolved "https://registry.npmmirror.com/sass-embedded-win32-arm64/-/sass-embedded-win32-arm64-1.80.7.tgz#7c8110ad2b02474da27b14f4a99e5040b1b06a86"
-  integrity sha512-Q6Rh/CM30m8txoKK5SIVamnwPXs028Mvfq4Ol4saHgSYro9kY/HTrrWlG/RPd6sPvYBCYIm1mX8oBteDUMCajQ==
-
-sass-embedded-win32-ia32@1.80.7:
-  version "1.80.7"
-  resolved "https://registry.npmmirror.com/sass-embedded-win32-ia32/-/sass-embedded-win32-ia32-1.80.7.tgz#c678d605bf1a01a2cf77a4d052c891925a1f7298"
-  integrity sha512-VZMRp81KWUZZDqNwkL3yTDT+VRxB7ScJKUJD1M8fq6P1nyJP35+r1byXLF4UQMoNgpC5B16txxMvqdkv43OqAA==
-
-sass-embedded-win32-x64@1.80.7:
-  version "1.80.7"
-  resolved "https://registry.npmmirror.com/sass-embedded-win32-x64/-/sass-embedded-win32-x64-1.80.7.tgz#67d716449ed702cc96388c47e76a40ab691bb174"
-  integrity sha512-4p+GzOJJ1KqxPKrkIkKisod4YAcC70fj4WMRLrQLLuUW+MzAvtKgX2+ZJf90D50CozSdgETGBvdPSj3VLjBzZw==
-
-sass-embedded@^1.80.7:
-  version "1.80.7"
-  resolved "https://registry.npmmirror.com/sass-embedded/-/sass-embedded-1.80.7.tgz#68c51318dd6fba5d802c80de8c1df20c0f8ea966"
-  integrity sha512-OwF0QvpDUjW2udPCvxgaObU0tQHycpsIgCDtHBVHuOqZ2LN0OkkY+uxSO7bOaw9wD7vXtt+1V+jiIZDTxiSRVQ==
+sass-embedded-android-arm64@1.81.0:
+  version "1.81.0"
+  resolved "https://registry.npmmirror.com/sass-embedded-android-arm64/-/sass-embedded-android-arm64-1.81.0.tgz#b4fc7bd750da2c17f3e2c4b113e9a14e2384a4d2"
+  integrity sha512-I36P77/PKAHx6sqOmexO2iEY5kpsmQ1VxcgITZSOxPMQhdB6m4t3bTabfDuWQQmCrqqiNFtLQHeytB65bUqwiw==
+
+sass-embedded-android-arm@1.81.0:
+  version "1.81.0"
+  resolved "https://registry.npmmirror.com/sass-embedded-android-arm/-/sass-embedded-android-arm-1.81.0.tgz#89c0c7d85c592a44a5f46218cb8367dbb2e9770e"
+  integrity sha512-NWEmIuaIEsGFNsIRa+5JpIpPJyZ32H15E85CNZqEIhhwWlk9UNw7vlOCmTH8MtabtnACwC/2NG8VyNa3nxKzUQ==
+
+sass-embedded-android-ia32@1.81.0:
+  version "1.81.0"
+  resolved "https://registry.npmmirror.com/sass-embedded-android-ia32/-/sass-embedded-android-ia32-1.81.0.tgz#b02d10067f4933b874b6f5e2fdb0561ad8c1fbbd"
+  integrity sha512-k8V1usXw30w1GVxvrteG1RzgYJzYQ9PfL2aeOqGdroBN7zYTD9VGJXTGcxA4IeeRxmRd7szVW2mKXXS472fh8g==
+
+sass-embedded-android-riscv64@1.81.0:
+  version "1.81.0"
+  resolved "https://registry.npmmirror.com/sass-embedded-android-riscv64/-/sass-embedded-android-riscv64-1.81.0.tgz#7c9617b83e7baffd1fe0af2e81db7653a45e900d"
+  integrity sha512-RXlanyLXEpN/DEehXgLuKPsqT//GYlsGFxKXgRiCc8hIPAueFLQXKJmLWlL3BEtHgmFdbsStIu4aZCcb1hOFlQ==
+
+sass-embedded-android-x64@1.81.0:
+  version "1.81.0"
+  resolved "https://registry.npmmirror.com/sass-embedded-android-x64/-/sass-embedded-android-x64-1.81.0.tgz#3539a1808bf2a9cf5292a95a7862a518d79df34d"
+  integrity sha512-RQG0FxGQ1DERNyUDED8+BDVaLIjI+BNg8lVcyqlLZUrWY6NhzjwYEeiN/DNZmMmHtqDucAPNDcsdVUNQqsBy2A==
+
+sass-embedded-darwin-arm64@1.81.0:
+  version "1.81.0"
+  resolved "https://registry.npmmirror.com/sass-embedded-darwin-arm64/-/sass-embedded-darwin-arm64-1.81.0.tgz#8bc30f515d7b738d8de62336718e98ad09bc1d23"
+  integrity sha512-gLKbsfII9Ppua76N41ODFnKGutla9qv0OGAas8gxe0jYBeAQFi/1iKQYdNtQtKi4mA9n5TQTqz+HHCKszZCoyA==
+
+sass-embedded-darwin-x64@1.81.0:
+  version "1.81.0"
+  resolved "https://registry.npmmirror.com/sass-embedded-darwin-x64/-/sass-embedded-darwin-x64-1.81.0.tgz#b5e77c4a2f87c1e6fc6106eec20d45af31a97f95"
+  integrity sha512-7uMOlT9hD2KUJCbTN2XcfghDxt/rc50ujjfSjSHjX1SYj7mGplkINUXvVbbvvaV2wt6t9vkGkCo5qNbeBhfwBg==
+
+sass-embedded-linux-arm64@1.81.0:
+  version "1.81.0"
+  resolved "https://registry.npmmirror.com/sass-embedded-linux-arm64/-/sass-embedded-linux-arm64-1.81.0.tgz#68640ab2d411da43d40ebcbaa94356895190ad51"
+  integrity sha512-jy4bvhdUmqbyw1jv1f3Uxl+MF8EU/Y/GDx4w6XPJm4Ds+mwH/TwnyAwsxxoBhWfnBnW8q2ADy039DlS5p+9csQ==
+
+sass-embedded-linux-arm@1.81.0:
+  version "1.81.0"
+  resolved "https://registry.npmmirror.com/sass-embedded-linux-arm/-/sass-embedded-linux-arm-1.81.0.tgz#747bb0e3d3c4b0e376bd4b83135688a90bd14e5f"
+  integrity sha512-REqR9qM4RchCE3cKqzRy9Q4zigIV82SbSpCi/O4O3oK3pg2I1z7vkb3TiJsivusG/li7aqKZGmYOtAXjruGQDA==
+
+sass-embedded-linux-ia32@1.81.0:
+  version "1.81.0"
+  resolved "https://registry.npmmirror.com/sass-embedded-linux-ia32/-/sass-embedded-linux-ia32-1.81.0.tgz#5031a66ce62f2221f0f75e3feeb3dd198061def6"
+  integrity sha512-ga/Jk4q5Bn1aC+iHJteDZuLSKnmBUiS3dEg1fnl/Z7GaHIChceKDJOw0zNaILRXI0qT2E1at9MwzoRaRA5Nn/g==
+
+sass-embedded-linux-musl-arm64@1.81.0:
+  version "1.81.0"
+  resolved "https://registry.npmmirror.com/sass-embedded-linux-musl-arm64/-/sass-embedded-linux-musl-arm64-1.81.0.tgz#c27478494eab3a863c813fe2c6e9f83d0ca86b49"
+  integrity sha512-hpntWf5kjkoxncA1Vh8vhsUOquZ8AROZKx0rQh7ZjSRs4JrYZASz1cfevPKaEM3wIim/nYa6TJqm0VqWsrERlA==
+
+sass-embedded-linux-musl-arm@1.81.0:
+  version "1.81.0"
+  resolved "https://registry.npmmirror.com/sass-embedded-linux-musl-arm/-/sass-embedded-linux-musl-arm-1.81.0.tgz#916b228a5fef451537082212d8b6edc62772544a"
+  integrity sha512-oWVUvQ4d5Kx1Md75YXZl5z1WBjc+uOhfRRqzkJ3nWc8tjszxJN+y/5EOJavhsNI3/2yoTt6eMXRTqDD9b0tWSQ==
+
+sass-embedded-linux-musl-ia32@1.81.0:
+  version "1.81.0"
+  resolved "https://registry.npmmirror.com/sass-embedded-linux-musl-ia32/-/sass-embedded-linux-musl-ia32-1.81.0.tgz#d2f906d905f14495ae3ab864c6646da791733a28"
+  integrity sha512-UEXUYkBuqTSwg5JNWiNlfMZ1Jx6SJkaEdx+fsL3Tk099L8cKSoJWH2EPz4ZJjNbyIMymrSdVfymheTeZ8u24xA==
+
+sass-embedded-linux-musl-riscv64@1.81.0:
+  version "1.81.0"
+  resolved "https://registry.npmmirror.com/sass-embedded-linux-musl-riscv64/-/sass-embedded-linux-musl-riscv64-1.81.0.tgz#a12fcb70d71d5bb375fae4096324a0382cddbe78"
+  integrity sha512-1D7OznytbIhx2XDHWi1nuQ8d/uCVR7FGGzELgaU//T8A9DapVTUgPKvB70AF1k4GzChR9IXU/WvFZs2hDTbaJg==
+
+sass-embedded-linux-musl-x64@1.81.0:
+  version "1.81.0"
+  resolved "https://registry.npmmirror.com/sass-embedded-linux-musl-x64/-/sass-embedded-linux-musl-x64-1.81.0.tgz#10928f88ab95ed5796bbeef18b2f051f22061f74"
+  integrity sha512-ia6VCTeVDQtBSMktXRFza1AZCt8/6aUoujot6Ugf4KmdytQqPJIHxkHaGftm5xwi9WdrMGYS7zgolToPijR11A==
+
+sass-embedded-linux-riscv64@1.81.0:
+  version "1.81.0"
+  resolved "https://registry.npmmirror.com/sass-embedded-linux-riscv64/-/sass-embedded-linux-riscv64-1.81.0.tgz#6db6f365e20e80be08dfc59f9ad7c3d5a5b2577e"
+  integrity sha512-KbxSsqu4tT1XbhZfJV/5NfW0VtJIGlD58RjqJqJBi8Rnjrx29/upBsuwoDWtsPV/LhoGwwU1XkSa9Q1ifCz4fQ==
+
+sass-embedded-linux-x64@1.81.0:
+  version "1.81.0"
+  resolved "https://registry.npmmirror.com/sass-embedded-linux-x64/-/sass-embedded-linux-x64-1.81.0.tgz#32954a89ad2f7d2479f7267713a9c867397a1d4e"
+  integrity sha512-AMDeVY2T9WAnSFkuQcsOn5c29GRs/TuqnCiblKeXfxCSKym5uKdBl/N7GnTV6OjzoxiJBbkYKdVIaS5By7Gj4g==
+
+sass-embedded-win32-arm64@1.81.0:
+  version "1.81.0"
+  resolved "https://registry.npmmirror.com/sass-embedded-win32-arm64/-/sass-embedded-win32-arm64-1.81.0.tgz#e38673b05380b39d254b14181a0f5ce3b2ed94f1"
+  integrity sha512-YOmBRYnygwWUmCoH14QbMRHjcvCJufeJBAp0m61tOJXIQh64ziwV4mjdqjS/Rx3zhTT4T+nulDUw4d3kLiMncA==
+
+sass-embedded-win32-ia32@1.81.0:
+  version "1.81.0"
+  resolved "https://registry.npmmirror.com/sass-embedded-win32-ia32/-/sass-embedded-win32-ia32-1.81.0.tgz#328af7ea0453b4ed280cdd47f01bb0e832f851ee"
+  integrity sha512-HFfr/C+uLJGGTENdnssuNTmXI/xnIasUuEHEKqI+2J0FHCWT5cpz3PGAOHymPyJcZVYGUG/7gIxIx/d7t0LFYw==
+
+sass-embedded-win32-x64@1.81.0:
+  version "1.81.0"
+  resolved "https://registry.npmmirror.com/sass-embedded-win32-x64/-/sass-embedded-win32-x64-1.81.0.tgz#c41c2a3e78890d962ec5050e75a573c7b57cbb73"
+  integrity sha512-wxj52jDcIAwWcXb7ShZ7vQYKcVUkJ+04YM9l46jDY+qwHzliGuorAUyujLyKTE9heGD3gShJ3wPPC1lXzq6v9A==
+
+sass-embedded@^1.81.0:
+  version "1.81.0"
+  resolved "https://registry.npmmirror.com/sass-embedded/-/sass-embedded-1.81.0.tgz#91d04fc1e21aa32e35daff69ce0db2dfcd1652a1"
+  integrity sha512-uZQ2Faxb1oWBHpeSSzjxnhClbMb3QadN0ql0ZFNuqWOLUxwaVhrMlMhPq6TDPbbfDUjihuwrMCuy695Bgna5RA==
   dependencies:
     "@bufbuild/protobuf" "^2.0.0"
     buffer-builder "^0.2.0"
@@ -1116,26 +1276,37 @@ sass-embedded@^1.80.7:
     sync-child-process "^1.0.2"
     varint "^6.0.0"
   optionalDependencies:
-    sass-embedded-android-arm "1.80.7"
-    sass-embedded-android-arm64 "1.80.7"
-    sass-embedded-android-ia32 "1.80.7"
-    sass-embedded-android-riscv64 "1.80.7"
-    sass-embedded-android-x64 "1.80.7"
-    sass-embedded-darwin-arm64 "1.80.7"
-    sass-embedded-darwin-x64 "1.80.7"
-    sass-embedded-linux-arm "1.80.7"
-    sass-embedded-linux-arm64 "1.80.7"
-    sass-embedded-linux-ia32 "1.80.7"
-    sass-embedded-linux-musl-arm "1.80.7"
-    sass-embedded-linux-musl-arm64 "1.80.7"
-    sass-embedded-linux-musl-ia32 "1.80.7"
-    sass-embedded-linux-musl-riscv64 "1.80.7"
-    sass-embedded-linux-musl-x64 "1.80.7"
-    sass-embedded-linux-riscv64 "1.80.7"
-    sass-embedded-linux-x64 "1.80.7"
-    sass-embedded-win32-arm64 "1.80.7"
-    sass-embedded-win32-ia32 "1.80.7"
-    sass-embedded-win32-x64 "1.80.7"
+    sass-embedded-android-arm "1.81.0"
+    sass-embedded-android-arm64 "1.81.0"
+    sass-embedded-android-ia32 "1.81.0"
+    sass-embedded-android-riscv64 "1.81.0"
+    sass-embedded-android-x64 "1.81.0"
+    sass-embedded-darwin-arm64 "1.81.0"
+    sass-embedded-darwin-x64 "1.81.0"
+    sass-embedded-linux-arm "1.81.0"
+    sass-embedded-linux-arm64 "1.81.0"
+    sass-embedded-linux-ia32 "1.81.0"
+    sass-embedded-linux-musl-arm "1.81.0"
+    sass-embedded-linux-musl-arm64 "1.81.0"
+    sass-embedded-linux-musl-ia32 "1.81.0"
+    sass-embedded-linux-musl-riscv64 "1.81.0"
+    sass-embedded-linux-musl-x64 "1.81.0"
+    sass-embedded-linux-riscv64 "1.81.0"
+    sass-embedded-linux-x64 "1.81.0"
+    sass-embedded-win32-arm64 "1.81.0"
+    sass-embedded-win32-ia32 "1.81.0"
+    sass-embedded-win32-x64 "1.81.0"
+
+sass@^1.81.0:
+  version "1.81.0"
+  resolved "https://registry.npmmirror.com/sass/-/sass-1.81.0.tgz#a9010c0599867909dfdbad057e4a6fbdd5eec941"
+  integrity sha512-Q4fOxRfhmv3sqCLoGfvrC9pRV8btc0UtqL9mN6Yrv6Qi9ScL55CVH1vlPP863ISLEEMNLLuu9P+enCeGHlnzhA==
+  dependencies:
+    chokidar "^4.0.0"
+    immutable "^5.0.2"
+    source-map-js ">=0.6.2 <2.0.0"
+  optionalDependencies:
+    "@parcel/watcher" "^2.4.1"
 
 sax@^1.2.4:
   version "1.4.1"
@@ -1157,7 +1328,7 @@ sisteransi@^1.0.5:
   resolved "https://registry.npmmirror.com/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed"
   integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==
 
-source-map-js@^1.2.0, source-map-js@^1.2.1:
+"source-map-js@>=0.6.2 <2.0.0", source-map-js@^1.2.0, source-map-js@^1.2.1:
   version "1.2.1"
   resolved "https://registry.npmmirror.com/source-map-js/-/source-map-js-1.2.1.tgz#1ce5650fddd87abc099eda37dcff024c2667ae46"
   integrity sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==
@@ -1232,6 +1403,13 @@ tap-yaml@^1.0.0:
   dependencies:
     yaml "^1.10.2"
 
+to-regex-range@^5.0.1:
+  version "5.0.1"
+  resolved "https://registry.npmmirror.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4"
+  integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==
+  dependencies:
+    is-number "^7.0.0"
+
 ts-deepmerge@^6.0.3:
   version "6.2.1"
   resolved "https://registry.npmmirror.com/ts-deepmerge/-/ts-deepmerge-6.2.1.tgz#4d564b44bc2a69e35a0b08bfa904ef176372e7dd"
@@ -1322,6 +1500,11 @@ vue-tsc@^2.1.8:
     "@vue/language-core" "2.1.10"
     semver "^7.5.4"
 
+vue3-hash-calendar@^1.1.3:
+  version "1.1.3"
+  resolved "https://registry.npmmirror.com/vue3-hash-calendar/-/vue3-hash-calendar-1.1.3.tgz#f97ba1bc7ed4a1413377be6bf2f0c7f99ad6be3e"
+  integrity sha512-BQyr3NtzlUOzEqb8e28TpIETtFdpvv6N90S4dSljYOqkK83hQKaMzKF2KEfuFqQwA1FOfK1eUS2lJgITSAnL4A==
+
 vue@*, vue@^3.5.12:
   version "3.5.12"
   resolved "https://registry.npmmirror.com/vue/-/vue-3.5.12.tgz#e08421c601b3617ea2c9ef0413afcc747130b36c"

+ 2 - 2
node_expores/utils/authorization.js

@@ -19,11 +19,11 @@ export function generateToken(payload) {
 
 // 验证token
 export function verifyToken(req, res, next) {
-  const token = req.headers.authorization;
+  const token = req.headers.authorization.split(" ")[1];
   jwt.verify(token, secretKey, function (err, decoded) {
     if (err) {
       console.log("verify error", err);
-      return res.status(404).json({ code: "404", msg: "token无效" });
+      return res.json({ code: "404", msg: "token无效" });
     }
     req.body.userInfo = decoded
     next();