Browse Source

Merge branch 'main' of http://39.108.216.210:3000/web/admin into main

duy 1 month ago
parent
commit
0b8945e9d2
7 changed files with 1309 additions and 291 deletions
  1. 6 6
      package.json
  2. 53 0
      src/api/modules/system/notice.js
  3. 2 2
      src/config/index.json
  4. 156 0
      src/styles/view/notice.scss
  5. 252 2
      src/views/system/notice.vue
  6. 541 0
      src/views/system/notice_bak.vue
  7. 299 281
      yarn.lock

+ 6 - 6
package.json

@@ -17,7 +17,7 @@
         "lint:fix": "eslint . --fix"
     },
     "dependencies": {
-        "axios": "^1.7.7",
+        "axios": "^1.7.8",
         "crypto-js": "^4.2.0",
         "dayjs": "^1.11.13",
         "echarts": "^5.5.1",
@@ -27,16 +27,16 @@
         "js-fast-way": "^0.5.7",
         "js-md5": "^0.8.3",
         "nprogress": "^0.2.0",
-        "pinia": "^2.2.6",
+        "pinia": "^2.2.7",
         "vue": "3.5.13",
-        "vue-router": "^4.4.5",
+        "vue-router": "^4.5.0",
         "vuedraggable": "^4.1.0"
     },
     "devDependencies": {
         "@iconify-json/iconoir": "^1.2.4",
         "@iconify-json/ri": "^1.2.3",
         "@unocss/eslint-config": "^0.58.9",
-        "@vitejs/plugin-vue": "^5.2.0",
+        "@vitejs/plugin-vue": "^5.2.1",
         "@vojtechlanka/vue-tags-input": "^3",
         "@vue/compiler-sfc": "^3.5.13",
         "archiver": "^7.0.1",
@@ -45,9 +45,9 @@
         "eslint-plugin-vue": "^9.24.0",
         "sass": "^1.78.0",
         "screenfull": "^6.0.2",
-        "typescript": "^5.6.3",
+        "typescript": "^5.7.2",
         "unocss": "^0.58.9",
         "unocss-preset-extra": "^0.5.3",
-        "vite": "^5.4.11"
+        "vite": "^6.0.1"
     }
 }

+ 53 - 0
src/api/modules/system/notice.js

@@ -0,0 +1,53 @@
+import { HcApi } from '../../request/index'
+
+export default {
+    async getList(form) {
+        return HcApi({
+            url: '/api/blade-manager/systemMsg/page',
+            method: 'get',
+            params: form,
+        })
+    },
+    async getAwaitMsg() {
+        return HcApi({
+            url: '/api/blade-manager/systemMsg/getAwaitMsg',
+            method: 'get',
+            params: {},
+        })
+    },
+    async remove(ids) {
+        return HcApi({
+            url: '/api/blade-manager/systemMsg/remove',
+            method: 'get',
+            params: { ids: ids },
+        })
+    },
+    async add(form) {
+        return HcApi({
+            url: '/api/blade-manager/systemMsg/add',
+            method: 'post',
+            data: form,
+        })
+    },
+    async update(form) {
+        return HcApi({
+            url: '/api/blade-manager/systemMsg/update',
+            method: 'post',
+            data: form,
+        })
+    },
+    async cancelPush(id) {
+        return HcApi({
+            url: '/api/blade-manager/systemMsg/cancelPush',
+            method: 'get',
+            params: { id },
+        })
+    },
+    async getClinetAll() {
+        return HcApi({
+            url: '/api/blade-system/client/getClinetAll',
+            method: 'get',
+            params: {},
+        })
+    },
+}

+ 2 - 2
src/config/index.json

@@ -1,7 +1,7 @@
 {
     "version": "20230607160059",
-    "target1": "http://39.108.216.210:8090",
-    "target": "http://192.168.0.109:8090",
+    "target": "http://39.108.216.210:8090",
+    "target2": "http://192.168.0.109:8090",
     "vite": {
         "port": 5188,
         "host": "0.0.0.0"

+ 156 - 0
src/styles/view/notice.scss

@@ -0,0 +1,156 @@
+//通用弹窗
+.el-dialog__wrapper.hc-system-announcement-dialog .el-dialog {
+    text-align: left;
+    .el-dialog__header {
+        position: relative;
+        border-bottom: 1px solid #eee;
+        padding: 10px 14px 10px;
+        .el-dialog__headerbtn {
+            top: 14px;
+            right: 14px;
+        }
+    }
+    .el-dialog__body {
+        position: relative;
+        padding: 14px;
+        text-align: unset;
+    }
+    .el-dialog__footer {
+        position: relative;
+        border-top: 1px solid #eee;
+        text-align: center;
+        padding: 10px;
+        .el-button {
+            padding: 10px 20px;
+        }
+        .el-button + span {
+            margin-left: 60px;
+        }
+        .el-button + .el-button {
+            margin-left: 60px;
+        }
+        span + .el-button {
+            margin-left: 60px;
+        }
+    }
+}
+
+.el-dialog__wrapper.hc-system-announcement-dialog.h-full .el-dialog {
+    margin-top: 5vh !important;
+    height: calc(100% - 10vh) !important;
+    .el-dialog__body {
+        height: calc(100% - 130px);
+        overflow: auto;
+    }
+}
+.el-dialog__wrapper.hc-system-announcement-dialog.black-card .el-dialog {
+    margin-top: 15vh !important;
+    height: calc(100% - 39vh) !important;
+    .el-dialog__body {
+        height: calc(100% - 73px);
+        overflow: auto;
+    }
+}
+
+.block {
+    width: 100%;
+}
+
+.hc-system-announcement-black-card {
+    position: relative;
+    background: #20222A;
+    color: white;
+    padding: 14px;
+    box-sizing: border-box;
+    border-radius: 5px;
+    display: flex;
+    align-items: center;
+    margin-bottom: 20px;
+    .icon-box {
+        position: relative;
+        text-align: center;
+        margin-right: 24px;
+        width: 95px;
+        .name {
+            font-size: 26px;
+            margin-bottom: 10px;
+        }
+        .icon {
+            position: relative;
+            i {
+                font-size: 50px;
+            }
+        }
+    }
+    .content {
+        position: relative;
+        flex: 1;
+        .top-box {
+            position: relative;
+            display: flex;
+            align-items: end;
+            margin-bottom: 10px;
+            .left {
+                position: relative;
+                .name {
+                    font-size: 14px;
+                    margin-right: 15px;
+                }
+                .num {
+                    font-size: 50px;
+                    font-weight: bold;
+                }
+            }
+            .right {
+                position: relative;
+                margin-left: 120px;
+                .name {
+                    font-size: 14px;
+                    margin-right: 15px;
+                }
+                .user {
+                    font-size: 30px;
+                    font-weight: bold;
+                }
+            }
+        }
+    }
+    .text-box {
+        position: relative;
+        margin-bottom: 10px;
+        .name {
+            font-size: 14px;
+            margin-right: 15px;
+        }
+        .text {
+            font-size: 22px;
+            font-weight: bold;
+            margin-top: 8px;
+        }
+    }
+    .time-box {
+        position: relative;
+        display: flex;
+        align-items: baseline;
+        vertical-align: bottom;
+        .name {
+            font-size: 14px;
+            margin-right: 15px;
+        }
+        .time {
+            font-size: 26px;
+            font-weight: bold;
+        }
+    }
+}
+
+.el-divider.hc-system-announcement-black-divider {
+    margin-top: 40px !important;
+    margin-bottom: 20px !important;
+    .el-divider__text {
+        font-size: 18px;
+    }
+    &.top {
+        margin-top:5px !important;
+    }
+}

+ 252 - 2
src/views/system/notice.vue

@@ -1,11 +1,261 @@
 <template>
-    <div>111</div>
+    <hc-card>
+        <template #header>
+            <div class="mr-10px w-140px">
+                <el-select v-model="searchForm.msgType" class="block" clearable filterable placeholder="请选择公告类型">
+                    <el-option label="更新公告" value="1" />
+                    <el-option label="普通公告" value="2" />
+                </el-select>
+            </div>
+            <div class="mr-10px w-140px">
+                <el-select v-model="searchForm.pushStatus" class="block" clearable filterable placeholder="发布状态">
+                    <el-option label="待发布" value="1" />
+                    <el-option label="已发布" value="2" />
+                    <el-option label="已取消" value="3" />
+                </el-select>
+            </div>
+            <el-button type="primary" @click="searchClick">搜索</el-button>
+        </template>
+        <template #extra>
+            <el-badge :value="releasedNum" style="margin-right: 18px;">
+                <el-button @click="releasedShow">待发布</el-button>
+            </el-badge>
+            <el-button type="primary" @click="generalShow">发布普通公告</el-button>
+            <el-button type="warning" @click="systemUpdateShow">发布系统公告</el-button>
+            <el-button type="danger" @click="handleDelete">批量删除公告</el-button>
+        </template>
+        <hc-table
+            ref="tableRef" :column="tableColumn" :datas="tableData" :loading="tableLoading"
+            is-check :check-style="{ width: 29 }" :index-style="{ width: 60 }" @selection-change="tableCheckChange"
+        >
+            <template #msgType="{ row }">
+                <span v-if="row.msgType === 1">更新公告</span>
+                <span v-if="row.msgType === 2">普通公告</span>
+            </template>
+            <template #pushDateTime="{ row }">
+                <template v-if="row.msgType === 1">
+                    <span>剩余</span>
+                    <el-tag type="danger" size="small">{{ row.msgWarnTime }}分钟</el-tag>
+                    <span>进行提醒,</span>
+                    <el-tag type="danger" size="small">{{ row.msgCountDownTime }}分钟</el-tag>
+                    <span>开始进入倒计时</span>
+                </template>
+                <template v-else>
+                    <span>-</span>
+                </template>
+            </template>
+            <template #pushStatus="{ row }">
+                <el-tag v-if="row.pushStatus === 3" type="danger" effect="dark" size="small">已取消</el-tag>
+                <el-tag v-if="row.pushStatus === 2" type="success" effect="dark" size="small">已发布</el-tag>
+                <el-tag v-if="row.pushStatus === 1" type="info" effect="dark" size="small">待发布</el-tag>
+            </template>
+            <template #action="{ row }">
+                <el-link type="warning" :disabled="row.pushStatus !== 3" @click="handleEdit(row)">修改</el-link>
+                <el-link type="danger" :disabled="row.pushStatus !== 1" @click="handleCancel(row)">取消发布</el-link>
+            </template>
+        </hc-table>
+        <template #action>
+            <hc-pages :pages="searchForm" @change="pageChange" />
+        </template>
+
+        <!-- 待发布 -->
+        <hc-dialog v-model="isReleasedShow" title="待发布的公告" class="hc-system-announcement-dialog black-card" widths="660px" :footer="false" @close="releasedCancel">
+            <el-divider v-if="releasedData.updateMsg.length > 0" content-position="left" class="hc-system-announcement-black-divider top">更新公告</el-divider>
+            <div v-for="(item, index) in releasedData.updateMsg" :key="index" class="hc-system-announcement-black-card">
+                <div class="icon-box">
+                    <div class="name">{{ index === 0 ? '前 端' : '后 端' }}</div>
+                    <div class="icon">
+                        <i class="iconfont iconicon_notice" />
+                    </div>
+                </div>
+                <div class="content">
+                    <div class="top-box">
+                        <div class="left">
+                            <span class="name">待发布:</span>
+                            <span class="num">{{ item.awaitMsgTotal }}</span>
+                        </div>
+                        <div class="right">
+                            <span class="name">创建人:</span>
+                            <span class="user">{{ item.creatUserName }}</span>
+                        </div>
+                    </div>
+                    <div class="time-box">
+                        <span class="name">发布时间:</span>
+                        <span class="time">{{ item.pushDateTime }}</span>
+                    </div>
+                </div>
+            </div>
+            <el-divider v-if="releasedData.systemMsg.length > 0" content-position="left" class="hc-system-announcement-black-divider">普通公告</el-divider>
+            <div v-for="(item, index) in releasedData.systemMsg" :key="index" class="hc-system-announcement-black-card">
+                <div class="icon-box">
+                    <div class="name">公 告</div>
+                    <div class="icon">
+                        <i class="iconfont iconicon_notice" />
+                    </div>
+                </div>
+                <div class="content">
+                    <div class="top-box">
+                        <div class="left">
+                            <span class="name">待发布:</span>
+                            <span class="num">{{ item.awaitMsgTotal }}</span>
+                        </div>
+                        <div class="right">
+                            <span class="name">创建人:</span>
+                            <span class="user">{{ item.creatUserName }}</span>
+                        </div>
+                    </div>
+                    <div class="time-box">
+                        <span class="name">发布时间:</span>
+                        <span class="time">{{ item.pushDateTime }}</span>
+                    </div>
+                </div>
+            </div>
+        </hc-dialog>
+    </hc-card>
 </template>
 
 <script setup>
+import { onActivated, ref } from 'vue'
+import { arrToId, getArrValue, getObjValue } from 'js-fast-way'
+import { reloadPage } from '~uti/tools'
+import { HcDelMsg } from 'hc-vue3-ui'
+import mainApi from '~api/system/notice'
+
+//激活
+onActivated(() => {
+    searchForm.value.current = 1
+    getTableData()
+    getAwaitMsgApi()
+})
+
+//获取待发布的数据
+const releasedNum = ref(0)
+const releasedData = ref({
+    systemMsg: [],
+    updateMsg: [],
+})
+const getAwaitMsgApi = async () => {
+    const { data } = await mainApi.getAwaitMsg()
+    const { msgTotal, systemMsg, updateMsg } = getObjValue(data)
+    releasedData.value = {
+        systemMsg: systemMsg,
+        updateMsg: updateMsg,
+    }
+    releasedNum.value = msgTotal
+}
+
+//搜索表单
+const searchForm = ref({
+    msgType: null, pushStatus: null,
+    current: 1, size: 30, total: 0,
+})
+
+//搜索
+const searchClick = () => {
+    searchForm.value.current = 1
+    getTableData()
+}
+
+//分页
+const pageChange = ({ current, size }) => {
+    searchForm.value.current = current
+    searchForm.value.size = size
+    getTableData()
+}
+
+//表格数据
+const tableRef = ref(null)
+const tableColumn = ref([
+    { key: 'msgType', name: '公告类型', width: 100 },
+    { key: 'pushSystem', name: '推送系统', minWidth: 220 },
+    { key: 'msgContent', name: '公告内容', minWidth: 240 },
+    { key: 'pushRemark', name: '发布备注' },
+    { key: 'pushDateTime', name: '发布时间', width: 240, align: 'center' },
+    { key: 'pushDateTime', name: '时间配置', width: 340, align: 'center' },
+    { key: 'creatUserName', name: '创建人', width: 100, align: 'center' },
+    { key: 'cancelDateTime', name: '取消时间', width: 160, align: 'center' },
+    { key: 'pushStatus', name: '发布状态', width: 80, align: 'center' },
+    { key: 'action', name: '操作', width: 120, align: 'center', fixed: 'right' },
+])
+
+//获取表格数据
+const tableLoading = ref(true)
+const tableData = ref([])
+const getTableData = async () => {
+    tableData.value = []
+    tableLoading.value = true
+    const { data } = await mainApi.getList(searchForm.value)
+    tableLoading.value = false
+    tableData.value = getArrValue(data?.records)
+    searchForm.value.total = data?.total || 0
+}
+
+//表格被选择
+const tableCheckKeys = ref([])
+const tableCheckChange = (rows) => {
+    tableCheckKeys.value = rows
+}
+
+//修改
+const handleEdit = (row) => {
 
+}
+
+//取消发布
+const handleCancel = async (row) => {
+    const { isRes } = await mainApi.remove(row.id)
+    if (!isRes) return
+    getTableData().then()
+}
+
+//待发布
+const isReleasedShow = ref(false)
+const releasedShow = () => {
+    isReleasedShow.value = true
+}
+
+const releasedCancel = () => {
+    isReleasedShow.value = false
+}
+
+//发布普通公告
+const generalShow = () => {
+
+}
+
+//发布系统公告
+const systemUpdateShow = () => {
+
+}
+
+//批量删除公告
+const handleDelete = () => {
+    const rows = tableCheckKeys.value
+    if (rows.length <= 0) {
+        window.$message.warning('请先勾选数据')
+        return false
+    }
+    //判断是否满足条件
+    const result = rows.every(({ pushStatus }) => {
+        return pushStatus === 3
+    })
+    if (!result) {
+        window.$message.warning('请选择已取消的数据')
+        return
+    }
+    //确认删除
+    HcDelMsg(async (resolve) => {
+        //发起请求
+        const ids = arrToId(rows)
+        const { isRes } = await mainApi.remove(ids)
+        resolve() //关闭弹窗的回调
+        if (!isRes) return
+        window.$message.success('删除成功')
+        reloadPage()
+    })
+}
 </script>
 
 <style lang="scss">
-
+@import "~src/styles/view/notice";
 </style>

+ 541 - 0
src/views/system/notice_bak.vue

@@ -0,0 +1,541 @@
+<template>
+    <div class="hc-system-announcement-box">
+        <div class="card-body">
+            <div class="card-main">
+                <div class="header">
+                    <div class="title">
+                        <div style="width: 140px">
+                            <el-select v-model="searchForm.msgType" class="block" clearable filterable placeholder="请选择公告类型" size="small">
+                                <el-option label="更新公告" value="1" />
+                                <el-option label="普通公告" value="2" />
+                            </el-select>
+                        </div>
+                        <div style="width: 100px; margin-left: 12px; margin-right: 12px;">
+                            <el-select v-model="searchForm.pushStatus" class="block" clearable filterable placeholder="发布状态" size="small">
+                                <el-option label="待发布" value="1" />
+                                <el-option label="已发布" value="2" />
+                                <el-option label="已取消" value="3" />
+                            </el-select>
+                        </div>
+                        <el-button size="small" type="primary" @click="searchClick">搜索</el-button>
+                    </div>
+                    <div class="extra">
+                        <el-badge :value="releasedNum" style="margin-right: 18px;">
+                            <el-button size="small" @click="releasedShow">待发布</el-button>
+                        </el-badge>
+                        <el-button size="small" type="primary" @click="generalShow">发布普通公告</el-button>
+                        <el-button size="small" type="warning" @click="systemUpdateShow">发布系统公告</el-button>
+                        <el-button size="small" type="danger" @click="handleDelete">批量删除公告</el-button>
+                    </div>
+                </div>
+                <div v-loading="isLoading" class="content">
+                    <el-table ref="tableRef" :data="tableData" border style="width: 100%;" height="100%" @selection-change="tableSelection">
+                        <el-table-column type="selection" width="50" align="center" fixed="left" />
+                        <el-table-column type="index" label="序号" width="50" align="center" />
+                        <el-table-column prop="msgType" label="公告类型" width="100" align="center">
+                            <template #default="{ row }">
+                                <span v-if="row.msgType === 1">更新公告</span>
+                                <span v-if="row.msgType === 2">普通公告</span>
+                            </template>
+                        </el-table-column>
+                        <el-table-column prop="pushSystem" label="推送系统" min-width="220" />
+                        <el-table-column prop="msgContent" label="公告内容" min-width="240" />
+                        <el-table-column prop="pushRemark" label="发布备注" />
+                        <el-table-column prop="pushDateTime" label="发布时间" width="160" align="center" />
+                        <el-table-column prop="pushDateTime" label="时间配置" width="340">
+                            <template #default="{ row }">
+                                <template v-if="row.msgType === 1">
+                                    <span>剩余</span>
+                                    <el-tag type="danger" size="mini">{{ row.msgWarnTime }}分钟</el-tag>
+                                    <span>进行提醒,</span>
+                                    <el-tag type="danger" size="mini">{{ row.msgCountDownTime }}分钟</el-tag>
+                                    <span>开始进入倒计时</span>
+                                </template>
+                                <template v-else>
+                                    <span>-</span>
+                                </template>
+                            </template>
+                        </el-table-column>
+                        <el-table-column prop="creatUserName" label="创建人" width="100" />
+                        <el-table-column prop="cancelDateTime" label="取消时间" width="160" align="center" />
+                        <el-table-column prop="pushStatus" label="发布状态" width="80" align="center">
+                            <template #default="{ row }">
+                                <el-tag v-if="row.pushStatus === 3" type="danger" effect="dark" size="mini">已取消</el-tag>
+                                <el-tag v-if="row.pushStatus === 2" type="success" effect="dark" size="mini">已发布</el-tag>
+                                <el-tag v-if="row.pushStatus === 1" type="info" effect="dark" size="mini">待发布</el-tag>
+                            </template>
+                        </el-table-column>
+                        <el-table-column prop="action" label="操作" width="180" align="center" fixed="right">
+                            <template #default="{ row }">
+                                <el-button size="mini" :disabled="row.pushStatus !== 3" @click="handleEdit(row)">编辑</el-button>
+                                <el-button size="mini" type="danger" :disabled="row.pushStatus !== 1" @click="handleCancel(row)">取消发布</el-button>
+                            </template>
+                        </el-table-column>
+                    </el-table>
+                </div>
+                <div class="action">
+                    <el-pagination
+                        :current-page="searchForm.current"
+                        :page-sizes="[20, 30, 40, 50]"
+                        :page-size="searchForm.size"
+                        layout="total, prev, pager, next, sizes, jumper"
+                        :total="searchForm.total"
+                        @size-change="handleSizeChange"
+                        @current-change="handleCurrentChange"
+                    />
+                </div>
+            </div>
+        </div>
+
+        <!-- 待发布 -->
+        <el-dialog
+            v-model:visible="isReleasedShow" class="hc-system-announcement-dialog black-card" title="待发布的公告"
+            append-to-body center destroy-on-close width="660px" @closed="releasedCancel"
+        >
+            <el-divider v-if="releasedData.updateMsg.length > 0" content-position="left" class="hc-system-announcement-black-divider top">更新公告</el-divider>
+            <div v-for="(item, index) in releasedData.updateMsg" :key="index" class="hc-system-announcement-black-card">
+                <div class="icon-box">
+                    <div class="name">{{ index === 0 ? '前 端' : '后 端' }}</div>
+                    <div class="icon">
+                        <i class="iconfont iconicon_notice" />
+                    </div>
+                </div>
+                <div class="content">
+                    <div class="top-box">
+                        <div class="left">
+                            <span class="name">待发布:</span>
+                            <span class="num">{{ item.awaitMsgTotal }}</span>
+                        </div>
+                        <div class="right">
+                            <span class="name">创建人:</span>
+                            <span class="user">{{ item.creatUserName }}</span>
+                        </div>
+                    </div>
+                    <div class="time-box">
+                        <span class="name">发布时间:</span>
+                        <span class="time">{{ item.pushDateTime }}</span>
+                    </div>
+                </div>
+            </div>
+            <el-divider v-if="releasedData.systemMsg.length > 0" content-position="left" class="hc-system-announcement-black-divider">普通公告</el-divider>
+            <div v-for="(item, index) in releasedData.systemMsg" :key="index" class="hc-system-announcement-black-card">
+                <div class="icon-box">
+                    <div class="name">公 告</div>
+                    <div class="icon">
+                        <i class="iconfont iconicon_notice" />
+                    </div>
+                </div>
+                <div class="content">
+                    <div class="top-box">
+                        <div class="left">
+                            <span class="name">待发布:</span>
+                            <span class="num">{{ item.awaitMsgTotal }}</span>
+                        </div>
+                        <div class="right">
+                            <span class="name">创建人:</span>
+                            <span class="user">{{ item.creatUserName }}</span>
+                        </div>
+                    </div>
+                    <div class="time-box">
+                        <span class="name">发布时间:</span>
+                        <span class="time">{{ item.pushDateTime }}</span>
+                    </div>
+                </div>
+            </div>
+        </el-dialog>
+
+        <!-- 发布普通公告 -->
+        <el-dialog
+            v-model:visible="isGeneralShow" class="hc-system-announcement-dialog w-700px" title="发布普通公告"
+            width="700px" append-to-body center destroy-on-close @closed="generalCancel"
+        >
+            <el-form ref="generalFormRef" :model="generalFormModel" :rules="generalFormRules" class="hc-system-announcement-form" label-width="auto">
+                <el-form-item label="公告内容:" prop="msgContent">
+                    <el-input v-model="generalFormModel.msgContent" type="textarea" rows="3" />
+                </el-form-item>
+                <el-form-item label="发布备注:" prop="pushRemark">
+                    <el-input v-model="generalFormModel.pushRemark" type="textarea" />
+                </el-form-item>
+                <el-form-item label="发布配置:" prop="pushDateTime">
+                    <el-date-picker v-model="generalFormModel.pushDateTime" type="datetime" placeholder="选择日期时间" :picker-options="pickerOptions" format="yyyy-MM-dd HH:mm:ss" value-format="yyyy-MM-dd HH:mm:ss" />
+                </el-form-item>
+                <el-form-item label="停留时间:" prop="msgShowTime">
+                    <el-select v-model="generalFormModel.msgShowTime" clearable filterable style="width: 190px;">
+                        <el-option v-for="i in 60" :label="`${i}分钟`" :value="i" />
+                    </el-select>
+                </el-form-item>
+                <el-form-item label="涉及系统:" prop="pushSystem">
+                    <el-checkbox-group v-model="generalFormModel.pushSystem">
+                        <el-checkbox v-for="item in systemClinet" :label="item.clientId">{{ item.name || item.clientId }}</el-checkbox>
+                    </el-checkbox-group>
+                </el-form-item>
+            </el-form>
+            <template #footer>
+                <div>
+                    <el-button @click="generalCancel">取消</el-button>
+                    <el-button type="primary" @click="generalFormSubmit">发布</el-button>
+                </div>
+            </template>
+        </el-dialog>
+
+        <!-- 发布系统公告 -->
+        <el-dialog
+            v-model:visible="isSystemUpdateShow" class="hc-system-announcement-dialog h-full w-700px" title="发布系统公告"
+            width="700px" append-to-body center destroy-on-close @closed="systemUpdateCancel"
+        >
+            <el-form ref="updateFormRef" :model="updateFormModel" :rules="updateFormRules" class="hc-system-announcement-form" label-width="auto">
+                <el-form-item label="公告内容:" prop="msgContent">
+                    <el-input v-model="updateFormModel.msgContent" type="textarea" rows="3" />
+                </el-form-item>
+                <el-form-item label="发布备注:" prop="pushRemark">
+                    <el-input v-model="updateFormModel.pushRemark" type="textarea" />
+                </el-form-item>
+                <el-form-item label="更新类型:" prop="updateServerType">
+                    <el-checkbox-group v-model="updateFormModel.updateServerType">
+                        <el-checkbox label="1">前端页面</el-checkbox>
+                        <el-checkbox label="2">后端接口</el-checkbox>
+                    </el-checkbox-group>
+                </el-form-item>
+                <el-form-item label="更新原因:" prop="updateCodeType">
+                    <el-radio-group v-model="updateFormModel.updateCodeType">
+                        <el-radio label="1">新功能需求</el-radio>
+                        <el-radio label="2">bug修复</el-radio>
+                    </el-radio-group>
+                </el-form-item>
+                <el-form-item label="发布配置:" prop="pushDateTime">
+                    <el-date-picker v-model="updateFormModel.pushDateTime" type="datetime" placeholder="选择日期时间" :picker-options="pickerOptions" format="yyyy-MM-dd HH:mm:ss" value-format="yyyy-MM-dd HH:mm:ss" />
+                </el-form-item>
+                <el-form-item label="时间配置:" prop="msgWarnTime">
+                    <span>剩余</span>
+                    <span style="margin-left: 5px">
+                        <el-select v-model="updateFormModel.msgWarnTime" clearable filterable size="small" style="width: 90px;" placeholder="分钟">
+                            <el-option v-for="i in 60" :label="`${i}分钟`" :value="i" />
+                        </el-select>
+                    </span>
+                    <span style="margin-left: 5px">进行提醒,</span>
+                    <span style="margin-left: 5px">
+                        <el-select v-model="updateFormModel.msgCountDownTime" clearable filterable size="small" style="width: 90px;" placeholder="时间">
+                            <el-option v-for="i in 60" :label="`${i}分钟`" :value="i" />
+                        </el-select>
+                    </span>
+                    <span style="margin-left: 5px">开始进入倒计时</span>
+                </el-form-item>
+                <el-form-item label="涉及系统:" prop="pushSystem">
+                    <el-checkbox-group v-model="updateFormModel.pushSystem">
+                        <el-checkbox v-for="item in systemClinet" :label="item.clientId">{{ item.name || item.clientId }}</el-checkbox>
+                    </el-checkbox-group>
+                </el-form-item>
+            </el-form>
+            <template #footer>
+                <div>
+                    <el-button @click="systemUpdateCancel">取消</el-button>
+                    <el-button type="primary" @click="updateFormSubmit">发布</el-button>
+                </div>
+            </template>
+        </el-dialog>
+    </div>
+</template>
+
+<script>
+//{getList, getAwaitMsg, getClinetAll, add, update, cancelPush, remove}
+import mainApi from '~api/system/notice'
+export default {
+    data() {
+        return {
+            //搜索
+            searchForm: { current: 1, size: 20, total: 0 },
+            //公告列表
+            isLoading: false,
+            tableData: [],
+            tableMultiple: [],
+            //待发布
+            isReleasedShow: false,
+            releasedNum: 0,
+            releasedData: {
+                systemMsg: [],
+                updateMsg: [],
+            },
+            //普通公告
+            isGeneralShow: false,
+            generalFormModel: {
+                pushSystem: [],
+            },
+            generalFormRules: {
+                msgContent: [
+                    { required: true, message: '请填写公告内容', trigger: 'blur' },
+                ],
+                pushDateTime: [
+                    { required: true, message: '请选择发布配置', trigger: 'blur' },
+                ],
+                msgShowTime: [
+                    { required: true, message: '请选择停留时间', trigger: 'blur' },
+                ],
+                pushSystem: [
+                    { required: true, message: '请选择涉及系统', trigger: 'blur' },
+                ],
+            },
+            //系统更新
+            isSystemUpdateShow: false,
+            updateFormModel: {
+                updateServerType: [],
+                pushSystem: [],
+            },
+            updateFormRules: {
+                msgContent: [
+                    { required: true, message: '请填写公告内容', trigger: 'blur' },
+                ],
+                updateServerType: [
+                    { required: true, message: '请选择更新类型', trigger: 'blur' },
+                ],
+                updateCodeType: [
+                    { required: true, message: '请选择更新原因', trigger: 'blur' },
+                ],
+                pushDateTime: [{
+                    required: true, trigger: 'blur',
+                    validator: (rule, value, callback) => {
+                        const { msgCountDownTime } = this.updateFormModel
+                        if (!value) {
+                            callback(new Error('请选择剩余进行提醒时间'))
+                        } else if (!msgCountDownTime) {
+                            callback(new Error('请选择进入倒计时时间'))
+                        } else {
+                            callback()
+                        }
+                    },
+                }],
+                msgWarnTime: [
+                    { required: true, message: '请选择时间配置', trigger: 'blur' },
+                ],
+                pushSystem: [
+                    { required: true, message: '请选择涉及系统', trigger: 'blur' },
+                ],
+            },
+            systemClinet: [],
+            //日期时间
+            pickerOptions: {
+                shortcuts: [{
+                    text: '三分钟',
+                    onClick(picker) {
+                        const date = new Date()
+                        date.setTime(date.getTime() + 3 * 60 * 1000)
+                        picker.$emit('pick', date)
+                    },
+                }, {
+                    text: '五分钟',
+                    onClick(picker) {
+                        const date = new Date()
+                        date.setTime(date.getTime() + 5 * 60 * 1000)
+                        picker.$emit('pick', date)
+                    },
+                }, {
+                    text: '十分钟',
+                    onClick(picker) {
+                        const date = new Date()
+                        date.setTime(date.getTime() + 10 * 60 * 1000)
+                        picker.$emit('pick', date)
+                    },
+                }, {
+                    text: '三十分钟',
+                    onClick(picker) {
+                        const date = new Date()
+                        date.setTime(date.getTime() + 30 * 60 * 1000)
+                        picker.$emit('pick', date)
+                    },
+                }],
+            },
+        }
+    },
+    created() {
+        this.searchClick()
+        this.getAwaitMsgApi()
+    },
+    methods: {
+        //获取待发布公告
+        async getAwaitMsgApi() {
+            let _this = this
+            mainApi.getAwaitMsg().then(({ data }) => {
+                const { msgTotal, systemMsg, updateMsg } = data.data || {}
+                _this.releasedData = {
+                    systemMsg: systemMsg,
+                    updateMsg: updateMsg,
+                }
+                _this.releasedNum = msgTotal
+            })
+        },
+        handleSizeChange(val) {
+            this.searchForm.size = val
+        },
+        handleCurrentChange(val) {
+            this.searchForm.current = val
+        },
+        //搜索
+        searchClick() {
+            this.searchForm.current = 1
+            this.getTableData()
+        },
+        //获取表格数据
+        async getTableData() {
+            this.isLoading = true
+            const res = await mainApi.getList(this.searchForm)
+            const { code, data, msg } = res.data || {}
+            const { records, total } = data || {}
+            this.tableData = records
+            this.searchForm.total = total
+            if (code !== 200) {
+                this.$message.error(msg)
+            }
+            this.isLoading = false
+        },
+        //表格多选
+        tableSelection(val) {
+            this.tableMultiple = val
+        },
+        //表格编辑
+        handleEdit(row) {
+            const form = JSON.parse(JSON.stringify(row))
+            if (form.msgType === 1) {
+                form.updateServerType = form.updateServerType.split(',')
+                form.pushSystem = form.pushSystem.split(',')
+                this.updateFormModel = form
+                this.systemUpdateShow()
+            } else {
+                form.pushSystem = form.pushSystem.split(',')
+                this.generalFormModel = form
+                this.generalShow()
+            }
+        },
+        //表格删除
+        async handleDelete() {
+            const arr = this.tableMultiple
+            if (arr.length <= 0) {
+                this.$message.warning('请先勾选数据')
+                return
+            }
+            //判断是否满足条件
+            const result = arr.every(({ pushStatus }) => {
+                return pushStatus === 3
+            })
+            if (!result) {
+                this.$message.error('请选择已取消的数据')
+                return
+            }
+            const ids = arr.flat().map(item => item.id).join(',')
+            mainApi.remove(ids).then(({ data }) => {
+                this.$message.success(data.msg || '操作成功')
+                this.tableMultiple = []
+                this.searchClick()
+                this.getAwaitMsgApi()
+            })
+        },
+        //取消发布
+        handleCancel(row) {
+            mainApi.cancelPush(row.id).then(({ data }) => {
+                this.$message.success(data.msg || '操作成功')
+                this.searchClick()
+                this.getAwaitMsgApi()
+            })
+        },
+        //待发布打开
+        releasedShow() {
+            this.isReleasedShow = true
+        },
+        //待发布关闭
+        releasedCancel() {
+            this.isReleasedShow = false
+        },
+        //打开普通公告
+        generalShow() {
+            this.isGeneralShow = true
+            this.getClinetAllApi()
+        },
+        //获取应用列表
+        async getClinetAllApi() {
+            const res = await mainApi.getClinetAll()
+            const { data } = res.data || []
+            this.systemClinet = data
+        },
+        async generalFormSubmit() {
+            const isForm = await this.getFormValidate('generalFormRef')
+            if (!isForm) return
+            let form = JSON.parse(JSON.stringify(this.generalFormModel))
+            form.pushSystem = form.pushSystem.join(',')
+            form.msgType = 2
+            if (form.id) {
+                mainApi.update(form).then(({ data }) => {
+                    this.$message.success(data.msg || '操作成功')
+                    this.generalCancel()
+                    this.searchClick()
+                    this.getAwaitMsgApi()
+                })
+            } else {
+                mainApi.add(form).then(({ data }) => {
+                    this.$message.success(data.msg || '操作成功')
+                    this.generalCancel()
+                    this.searchClick()
+                    this.getAwaitMsgApi()
+                })
+            }
+        },
+        //普通公告关闭
+        generalCancel() {
+            this.isGeneralShow = false
+            this.generalFormModel = {
+                pushSystem: [],
+            }
+        },
+        //系统更新公告
+        systemUpdateShow() {
+            this.isSystemUpdateShow = true
+            this.getClinetAllApi()
+        },
+        //系统更新公告提交
+        async updateFormSubmit() {
+            const isForm = await this.getFormValidate('updateFormRef')
+            if (!isForm) return
+            let form = JSON.parse(JSON.stringify(this.updateFormModel))
+            form.pushSystem = form.pushSystem.join(',')
+            form.updateServerType = form.updateServerType.join(',')
+            form.msgType = 1
+            if (form.id) {
+                mainApi.update(form).then(({ data }) => {
+                    this.$message.success(data.msg || '操作成功')
+                    this.systemUpdateCancel()
+                    this.searchClick()
+                    this.getAwaitMsgApi()
+                })
+            } else {
+                mainApi.add(form).then(({ data }) => {
+                    this.$message.success(data.msg || '操作成功')
+                    this.systemUpdateCancel()
+                    this.searchClick()
+                    this.getAwaitMsgApi()
+                })
+            }
+        },
+        //系统更新公告关闭
+        systemUpdateCancel() {
+            this.isSystemUpdateShow = false
+            this.updateFormModel = {
+                updateServerType: [],
+                pushSystem: [],
+            }
+        },
+        //验证表单
+        async getFormValidate(ref) {
+            return new Promise(resolve => {
+                if (!ref) {
+                    resolve(false)
+                    return
+                }
+                this.$refs[ref].validate((valid) => {
+                    resolve(!!valid)
+                })
+            })
+        },
+    },
+}
+</script>
+
+<style lang="scss">
+@import "../../styles/view/notice";
+</style>

+ 299 - 281
yarn.lock

@@ -353,120 +353,125 @@
   resolved "http://39.108.216.210:9000/@element-plus/icons-vue/-/icons-vue-2.3.1.tgz#1f635ad5fdd5c85ed936481525570e82b5a8307a"
   integrity sha512-XxVUZv48RZAd87ucGS48jPf6pKu0yV5UCg9f4FFwtrYxXOwWuVJo6wOvSLKEoMQKjv8GsX/mhP6UsC1lRwbUWg==
 
-"@esbuild/aix-ppc64@0.21.5":
-  version "0.21.5"
-  resolved "http://39.108.216.210:9000/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz#c7184a326533fcdf1b8ee0733e21c713b975575f"
-  integrity sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==
-
-"@esbuild/android-arm64@0.21.5":
-  version "0.21.5"
-  resolved "http://39.108.216.210:9000/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz#09d9b4357780da9ea3a7dfb833a1f1ff439b4052"
-  integrity sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==
-
-"@esbuild/android-arm@0.21.5":
-  version "0.21.5"
-  resolved "http://39.108.216.210:9000/@esbuild/android-arm/-/android-arm-0.21.5.tgz#9b04384fb771926dfa6d7ad04324ecb2ab9b2e28"
-  integrity sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==
-
-"@esbuild/android-x64@0.21.5":
-  version "0.21.5"
-  resolved "http://39.108.216.210:9000/@esbuild/android-x64/-/android-x64-0.21.5.tgz#29918ec2db754cedcb6c1b04de8cd6547af6461e"
-  integrity sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==
-
-"@esbuild/darwin-arm64@0.21.5":
-  version "0.21.5"
-  resolved "http://39.108.216.210:9000/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz#e495b539660e51690f3928af50a76fb0a6ccff2a"
-  integrity sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==
-
-"@esbuild/darwin-x64@0.21.5":
-  version "0.21.5"
-  resolved "http://39.108.216.210:9000/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz#c13838fa57372839abdddc91d71542ceea2e1e22"
-  integrity sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==
-
-"@esbuild/freebsd-arm64@0.21.5":
-  version "0.21.5"
-  resolved "http://39.108.216.210:9000/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz#646b989aa20bf89fd071dd5dbfad69a3542e550e"
-  integrity sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==
-
-"@esbuild/freebsd-x64@0.21.5":
-  version "0.21.5"
-  resolved "http://39.108.216.210:9000/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz#aa615cfc80af954d3458906e38ca22c18cf5c261"
-  integrity sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==
-
-"@esbuild/linux-arm64@0.21.5":
-  version "0.21.5"
-  resolved "http://39.108.216.210:9000/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz#70ac6fa14f5cb7e1f7f887bcffb680ad09922b5b"
-  integrity sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==
-
-"@esbuild/linux-arm@0.21.5":
-  version "0.21.5"
-  resolved "http://39.108.216.210:9000/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz#fc6fd11a8aca56c1f6f3894f2bea0479f8f626b9"
-  integrity sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==
-
-"@esbuild/linux-ia32@0.21.5":
-  version "0.21.5"
-  resolved "http://39.108.216.210:9000/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz#3271f53b3f93e3d093d518d1649d6d68d346ede2"
-  integrity sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==
-
-"@esbuild/linux-loong64@0.21.5":
-  version "0.21.5"
-  resolved "http://39.108.216.210:9000/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz#ed62e04238c57026aea831c5a130b73c0f9f26df"
-  integrity sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==
-
-"@esbuild/linux-mips64el@0.21.5":
-  version "0.21.5"
-  resolved "http://39.108.216.210:9000/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz#e79b8eb48bf3b106fadec1ac8240fb97b4e64cbe"
-  integrity sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==
-
-"@esbuild/linux-ppc64@0.21.5":
-  version "0.21.5"
-  resolved "http://39.108.216.210:9000/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz#5f2203860a143b9919d383ef7573521fb154c3e4"
-  integrity sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==
-
-"@esbuild/linux-riscv64@0.21.5":
-  version "0.21.5"
-  resolved "http://39.108.216.210:9000/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz#07bcafd99322d5af62f618cb9e6a9b7f4bb825dc"
-  integrity sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==
-
-"@esbuild/linux-s390x@0.21.5":
-  version "0.21.5"
-  resolved "http://39.108.216.210:9000/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz#b7ccf686751d6a3e44b8627ababc8be3ef62d8de"
-  integrity sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==
-
-"@esbuild/linux-x64@0.21.5":
-  version "0.21.5"
-  resolved "http://39.108.216.210:9000/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz#6d8f0c768e070e64309af8004bb94e68ab2bb3b0"
-  integrity sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==
-
-"@esbuild/netbsd-x64@0.21.5":
-  version "0.21.5"
-  resolved "http://39.108.216.210:9000/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz#bbe430f60d378ecb88decb219c602667387a6047"
-  integrity sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==
-
-"@esbuild/openbsd-x64@0.21.5":
-  version "0.21.5"
-  resolved "http://39.108.216.210:9000/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz#99d1cf2937279560d2104821f5ccce220cb2af70"
-  integrity sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==
-
-"@esbuild/sunos-x64@0.21.5":
-  version "0.21.5"
-  resolved "http://39.108.216.210:9000/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz#08741512c10d529566baba837b4fe052c8f3487b"
-  integrity sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==
-
-"@esbuild/win32-arm64@0.21.5":
-  version "0.21.5"
-  resolved "http://39.108.216.210:9000/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz#675b7385398411240735016144ab2e99a60fc75d"
-  integrity sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==
-
-"@esbuild/win32-ia32@0.21.5":
-  version "0.21.5"
-  resolved "http://39.108.216.210:9000/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz#1bfc3ce98aa6ca9a0969e4d2af72144c59c1193b"
-  integrity sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==
-
-"@esbuild/win32-x64@0.21.5":
-  version "0.21.5"
-  resolved "http://39.108.216.210:9000/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz#acad351d582d157bb145535db2a6ff53dd514b5c"
-  integrity sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==
+"@esbuild/aix-ppc64@0.24.0":
+  version "0.24.0"
+  resolved "http://39.108.216.210:9000/@esbuild/aix-ppc64/-/aix-ppc64-0.24.0.tgz#b57697945b50e99007b4c2521507dc613d4a648c"
+  integrity sha512-WtKdFM7ls47zkKHFVzMz8opM7LkcsIp9amDUBIAWirg70RM71WRSjdILPsY5Uv1D42ZpUfaPILDlfactHgsRkw==
+
+"@esbuild/android-arm64@0.24.0":
+  version "0.24.0"
+  resolved "http://39.108.216.210:9000/@esbuild/android-arm64/-/android-arm64-0.24.0.tgz#1add7e0af67acefd556e407f8497e81fddad79c0"
+  integrity sha512-Vsm497xFM7tTIPYK9bNTYJyF/lsP590Qc1WxJdlB6ljCbdZKU9SY8i7+Iin4kyhV/KV5J2rOKsBQbB77Ab7L/w==
+
+"@esbuild/android-arm@0.24.0":
+  version "0.24.0"
+  resolved "http://39.108.216.210:9000/@esbuild/android-arm/-/android-arm-0.24.0.tgz#ab7263045fa8e090833a8e3c393b60d59a789810"
+  integrity sha512-arAtTPo76fJ/ICkXWetLCc9EwEHKaeya4vMrReVlEIUCAUncH7M4bhMQ+M9Vf+FFOZJdTNMXNBrWwW+OXWpSew==
+
+"@esbuild/android-x64@0.24.0":
+  version "0.24.0"
+  resolved "http://39.108.216.210:9000/@esbuild/android-x64/-/android-x64-0.24.0.tgz#e8f8b196cfdfdd5aeaebbdb0110983460440e705"
+  integrity sha512-t8GrvnFkiIY7pa7mMgJd7p8p8qqYIz1NYiAoKc75Zyv73L3DZW++oYMSHPRarcotTKuSs6m3hTOa5CKHaS02TQ==
+
+"@esbuild/darwin-arm64@0.24.0":
+  version "0.24.0"
+  resolved "http://39.108.216.210:9000/@esbuild/darwin-arm64/-/darwin-arm64-0.24.0.tgz#2d0d9414f2acbffd2d86e98253914fca603a53dd"
+  integrity sha512-CKyDpRbK1hXwv79soeTJNHb5EiG6ct3efd/FTPdzOWdbZZfGhpbcqIpiD0+vwmpu0wTIL97ZRPZu8vUt46nBSw==
+
+"@esbuild/darwin-x64@0.24.0":
+  version "0.24.0"
+  resolved "http://39.108.216.210:9000/@esbuild/darwin-x64/-/darwin-x64-0.24.0.tgz#33087aab31a1eb64c89daf3d2cf8ce1775656107"
+  integrity sha512-rgtz6flkVkh58od4PwTRqxbKH9cOjaXCMZgWD905JOzjFKW+7EiUObfd/Kav+A6Gyud6WZk9w+xu6QLytdi2OA==
+
+"@esbuild/freebsd-arm64@0.24.0":
+  version "0.24.0"
+  resolved "http://39.108.216.210:9000/@esbuild/freebsd-arm64/-/freebsd-arm64-0.24.0.tgz#bb76e5ea9e97fa3c753472f19421075d3a33e8a7"
+  integrity sha512-6Mtdq5nHggwfDNLAHkPlyLBpE5L6hwsuXZX8XNmHno9JuL2+bg2BX5tRkwjyfn6sKbxZTq68suOjgWqCicvPXA==
+
+"@esbuild/freebsd-x64@0.24.0":
+  version "0.24.0"
+  resolved "http://39.108.216.210:9000/@esbuild/freebsd-x64/-/freebsd-x64-0.24.0.tgz#e0e2ce9249fdf6ee29e5dc3d420c7007fa579b93"
+  integrity sha512-D3H+xh3/zphoX8ck4S2RxKR6gHlHDXXzOf6f/9dbFt/NRBDIE33+cVa49Kil4WUjxMGW0ZIYBYtaGCa2+OsQwQ==
+
+"@esbuild/linux-arm64@0.24.0":
+  version "0.24.0"
+  resolved "http://39.108.216.210:9000/@esbuild/linux-arm64/-/linux-arm64-0.24.0.tgz#d1b2aa58085f73ecf45533c07c82d81235388e75"
+  integrity sha512-TDijPXTOeE3eaMkRYpcy3LarIg13dS9wWHRdwYRnzlwlA370rNdZqbcp0WTyyV/k2zSxfko52+C7jU5F9Tfj1g==
+
+"@esbuild/linux-arm@0.24.0":
+  version "0.24.0"
+  resolved "http://39.108.216.210:9000/@esbuild/linux-arm/-/linux-arm-0.24.0.tgz#8e4915df8ea3e12b690a057e77a47b1d5935ef6d"
+  integrity sha512-gJKIi2IjRo5G6Glxb8d3DzYXlxdEj2NlkixPsqePSZMhLudqPhtZ4BUrpIuTjJYXxvF9njql+vRjB2oaC9XpBw==
+
+"@esbuild/linux-ia32@0.24.0":
+  version "0.24.0"
+  resolved "http://39.108.216.210:9000/@esbuild/linux-ia32/-/linux-ia32-0.24.0.tgz#8200b1110666c39ab316572324b7af63d82013fb"
+  integrity sha512-K40ip1LAcA0byL05TbCQ4yJ4swvnbzHscRmUilrmP9Am7//0UjPreh4lpYzvThT2Quw66MhjG//20mrufm40mA==
+
+"@esbuild/linux-loong64@0.24.0":
+  version "0.24.0"
+  resolved "http://39.108.216.210:9000/@esbuild/linux-loong64/-/linux-loong64-0.24.0.tgz#6ff0c99cf647504df321d0640f0d32e557da745c"
+  integrity sha512-0mswrYP/9ai+CU0BzBfPMZ8RVm3RGAN/lmOMgW4aFUSOQBjA31UP8Mr6DDhWSuMwj7jaWOT0p0WoZ6jeHhrD7g==
+
+"@esbuild/linux-mips64el@0.24.0":
+  version "0.24.0"
+  resolved "http://39.108.216.210:9000/@esbuild/linux-mips64el/-/linux-mips64el-0.24.0.tgz#3f720ccd4d59bfeb4c2ce276a46b77ad380fa1f3"
+  integrity sha512-hIKvXm0/3w/5+RDtCJeXqMZGkI2s4oMUGj3/jM0QzhgIASWrGO5/RlzAzm5nNh/awHE0A19h/CvHQe6FaBNrRA==
+
+"@esbuild/linux-ppc64@0.24.0":
+  version "0.24.0"
+  resolved "http://39.108.216.210:9000/@esbuild/linux-ppc64/-/linux-ppc64-0.24.0.tgz#9d6b188b15c25afd2e213474bf5f31e42e3aa09e"
+  integrity sha512-HcZh5BNq0aC52UoocJxaKORfFODWXZxtBaaZNuN3PUX3MoDsChsZqopzi5UupRhPHSEHotoiptqikjN/B77mYQ==
+
+"@esbuild/linux-riscv64@0.24.0":
+  version "0.24.0"
+  resolved "http://39.108.216.210:9000/@esbuild/linux-riscv64/-/linux-riscv64-0.24.0.tgz#f989fdc9752dfda286c9cd87c46248e4dfecbc25"
+  integrity sha512-bEh7dMn/h3QxeR2KTy1DUszQjUrIHPZKyO6aN1X4BCnhfYhuQqedHaa5MxSQA/06j3GpiIlFGSsy1c7Gf9padw==
+
+"@esbuild/linux-s390x@0.24.0":
+  version "0.24.0"
+  resolved "http://39.108.216.210:9000/@esbuild/linux-s390x/-/linux-s390x-0.24.0.tgz#29ebf87e4132ea659c1489fce63cd8509d1c7319"
+  integrity sha512-ZcQ6+qRkw1UcZGPyrCiHHkmBaj9SiCD8Oqd556HldP+QlpUIe2Wgn3ehQGVoPOvZvtHm8HPx+bH20c9pvbkX3g==
+
+"@esbuild/linux-x64@0.24.0":
+  version "0.24.0"
+  resolved "http://39.108.216.210:9000/@esbuild/linux-x64/-/linux-x64-0.24.0.tgz#4af48c5c0479569b1f359ffbce22d15f261c0cef"
+  integrity sha512-vbutsFqQ+foy3wSSbmjBXXIJ6PL3scghJoM8zCL142cGaZKAdCZHyf+Bpu/MmX9zT9Q0zFBVKb36Ma5Fzfa8xA==
+
+"@esbuild/netbsd-x64@0.24.0":
+  version "0.24.0"
+  resolved "http://39.108.216.210:9000/@esbuild/netbsd-x64/-/netbsd-x64-0.24.0.tgz#1ae73d23cc044a0ebd4f198334416fb26c31366c"
+  integrity sha512-hjQ0R/ulkO8fCYFsG0FZoH+pWgTTDreqpqY7UnQntnaKv95uP5iW3+dChxnx7C3trQQU40S+OgWhUVwCjVFLvg==
+
+"@esbuild/openbsd-arm64@0.24.0":
+  version "0.24.0"
+  resolved "http://39.108.216.210:9000/@esbuild/openbsd-arm64/-/openbsd-arm64-0.24.0.tgz#5d904a4f5158c89859fd902c427f96d6a9e632e2"
+  integrity sha512-MD9uzzkPQbYehwcN583yx3Tu5M8EIoTD+tUgKF982WYL9Pf5rKy9ltgD0eUgs8pvKnmizxjXZyLt0z6DC3rRXg==
+
+"@esbuild/openbsd-x64@0.24.0":
+  version "0.24.0"
+  resolved "http://39.108.216.210:9000/@esbuild/openbsd-x64/-/openbsd-x64-0.24.0.tgz#4c8aa88c49187c601bae2971e71c6dc5e0ad1cdf"
+  integrity sha512-4ir0aY1NGUhIC1hdoCzr1+5b43mw99uNwVzhIq1OY3QcEwPDO3B7WNXBzaKY5Nsf1+N11i1eOfFcq+D/gOS15Q==
+
+"@esbuild/sunos-x64@0.24.0":
+  version "0.24.0"
+  resolved "http://39.108.216.210:9000/@esbuild/sunos-x64/-/sunos-x64-0.24.0.tgz#8ddc35a0ea38575fa44eda30a5ee01ae2fa54dd4"
+  integrity sha512-jVzdzsbM5xrotH+W5f1s+JtUy1UWgjU0Cf4wMvffTB8m6wP5/kx0KiaLHlbJO+dMgtxKV8RQ/JvtlFcdZ1zCPA==
+
+"@esbuild/win32-arm64@0.24.0":
+  version "0.24.0"
+  resolved "http://39.108.216.210:9000/@esbuild/win32-arm64/-/win32-arm64-0.24.0.tgz#6e79c8543f282c4539db684a207ae0e174a9007b"
+  integrity sha512-iKc8GAslzRpBytO2/aN3d2yb2z8XTVfNV0PjGlCxKo5SgWmNXx82I/Q3aG1tFfS+A2igVCY97TJ8tnYwpUWLCA==
+
+"@esbuild/win32-ia32@0.24.0":
+  version "0.24.0"
+  resolved "http://39.108.216.210:9000/@esbuild/win32-ia32/-/win32-ia32-0.24.0.tgz#057af345da256b7192d18b676a02e95d0fa39103"
+  integrity sha512-vQW36KZolfIudCcTnaTpmLQ24Ha1RjygBo39/aLkM2kmjkWmZGEJ5Gn9l5/7tzXA42QGIoWbICfg6KLLkIw6yw==
+
+"@esbuild/win32-x64@0.24.0":
+  version "0.24.0"
+  resolved "http://39.108.216.210:9000/@esbuild/win32-x64/-/win32-x64-0.24.0.tgz#168ab1c7e1c318b922637fad8f339d48b01e1244"
+  integrity sha512-7IAFPrjSQIJrGsK6flwg7NFmwBoSTyF3rl7If0hNUFQU4ilTsEPL6GuMuU9BfIWVVGuRnuIidkSMC+c0Otu8IA==
 
 "@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.4.0":
   version "4.4.0"
@@ -692,87 +697,102 @@
     estree-walker "^2.0.2"
     picomatch "^2.3.1"
 
-"@rollup/rollup-android-arm-eabi@4.21.0":
-  version "4.21.0"
-  resolved "http://39.108.216.210:9000/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.21.0.tgz#d941173f82f9b041c61b0dc1a2a91dcd06e4b31e"
-  integrity sha512-WTWD8PfoSAJ+qL87lE7votj3syLavxunWhzCnx3XFxFiI/BA/r3X7MUM8dVrH8rb2r4AiO8jJsr3ZjdaftmnfA==
-
-"@rollup/rollup-android-arm64@4.21.0":
-  version "4.21.0"
-  resolved "http://39.108.216.210:9000/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.21.0.tgz#7e7157c8543215245ceffc445134d9e843ba51c0"
-  integrity sha512-a1sR2zSK1B4eYkiZu17ZUZhmUQcKjk2/j9Me2IDjk1GHW7LB5Z35LEzj9iJch6gtUfsnvZs1ZNyDW2oZSThrkA==
-
-"@rollup/rollup-darwin-arm64@4.21.0":
-  version "4.21.0"
-  resolved "http://39.108.216.210:9000/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.21.0.tgz#f0a18a4fc8dc6eb1e94a51fa2adb22876f477947"
-  integrity sha512-zOnKWLgDld/svhKO5PD9ozmL6roy5OQ5T4ThvdYZLpiOhEGY+dp2NwUmxK0Ld91LrbjrvtNAE0ERBwjqhZTRAA==
-
-"@rollup/rollup-darwin-x64@4.21.0":
-  version "4.21.0"
-  resolved "http://39.108.216.210:9000/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.21.0.tgz#34b7867613e5cc42d2b85ddc0424228cc33b43f0"
-  integrity sha512-7doS8br0xAkg48SKE2QNtMSFPFUlRdw9+votl27MvT46vo44ATBmdZdGysOevNELmZlfd+NEa0UYOA8f01WSrg==
-
-"@rollup/rollup-linux-arm-gnueabihf@4.21.0":
-  version "4.21.0"
-  resolved "http://39.108.216.210:9000/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.21.0.tgz#422b19ff9ae02b05d3395183d1d43b38c7c8be0b"
-  integrity sha512-pWJsfQjNWNGsoCq53KjMtwdJDmh/6NubwQcz52aEwLEuvx08bzcy6tOUuawAOncPnxz/3siRtd8hiQ32G1y8VA==
-
-"@rollup/rollup-linux-arm-musleabihf@4.21.0":
-  version "4.21.0"
-  resolved "http://39.108.216.210:9000/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.21.0.tgz#568aa29195ef6fc57ec6ed3f518923764406a8ee"
-  integrity sha512-efRIANsz3UHZrnZXuEvxS9LoCOWMGD1rweciD6uJQIx2myN3a8Im1FafZBzh7zk1RJ6oKcR16dU3UPldaKd83w==
-
-"@rollup/rollup-linux-arm64-gnu@4.21.0":
-  version "4.21.0"
-  resolved "http://39.108.216.210:9000/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.21.0.tgz#22309c8bcba9a73114f69165c72bc94b2fbec085"
-  integrity sha512-ZrPhydkTVhyeGTW94WJ8pnl1uroqVHM3j3hjdquwAcWnmivjAwOYjTEAuEDeJvGX7xv3Z9GAvrBkEzCgHq9U1w==
-
-"@rollup/rollup-linux-arm64-musl@4.21.0":
-  version "4.21.0"
-  resolved "http://39.108.216.210:9000/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.21.0.tgz#c93c388af6d33f082894b8a60839d7265b2b9bc5"
-  integrity sha512-cfaupqd+UEFeURmqNP2eEvXqgbSox/LHOyN9/d2pSdV8xTrjdg3NgOFJCtc1vQ/jEke1qD0IejbBfxleBPHnPw==
-
-"@rollup/rollup-linux-powerpc64le-gnu@4.21.0":
-  version "4.21.0"
-  resolved "http://39.108.216.210:9000/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.21.0.tgz#493c5e19e395cf3c6bd860c7139c8a903dea72b4"
-  integrity sha512-ZKPan1/RvAhrUylwBXC9t7B2hXdpb/ufeu22pG2psV7RN8roOfGurEghw1ySmX/CmDDHNTDDjY3lo9hRlgtaHg==
-
-"@rollup/rollup-linux-riscv64-gnu@4.21.0":
-  version "4.21.0"
-  resolved "http://39.108.216.210:9000/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.21.0.tgz#a2eab4346fbe5909165ce99adb935ba30c9fb444"
-  integrity sha512-H1eRaCwd5E8eS8leiS+o/NqMdljkcb1d6r2h4fKSsCXQilLKArq6WS7XBLDu80Yz+nMqHVFDquwcVrQmGr28rg==
-
-"@rollup/rollup-linux-s390x-gnu@4.21.0":
-  version "4.21.0"
-  resolved "http://39.108.216.210:9000/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.21.0.tgz#0bc49a79db4345d78d757bb1b05e73a1b42fa5c3"
-  integrity sha512-zJ4hA+3b5tu8u7L58CCSI0A9N1vkfwPhWd/puGXwtZlsB5bTkwDNW/+JCU84+3QYmKpLi+XvHdmrlwUwDA6kqw==
-
-"@rollup/rollup-linux-x64-gnu@4.21.0":
-  version "4.21.0"
-  resolved "http://39.108.216.210:9000/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.21.0.tgz#4fd36a6a41f3406d8693321b13d4f9b7658dd4b9"
-  integrity sha512-e2hrvElFIh6kW/UNBQK/kzqMNY5mO+67YtEh9OA65RM5IJXYTWiXjX6fjIiPaqOkBthYF1EqgiZ6OXKcQsM0hg==
-
-"@rollup/rollup-linux-x64-musl@4.21.0":
-  version "4.21.0"
-  resolved "http://39.108.216.210:9000/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.21.0.tgz#10ebb13bd4469cbad1a5d9b073bd27ec8a886200"
-  integrity sha512-1vvmgDdUSebVGXWX2lIcgRebqfQSff0hMEkLJyakQ9JQUbLDkEaMsPTLOmyccyC6IJ/l3FZuJbmrBw/u0A0uCQ==
-
-"@rollup/rollup-win32-arm64-msvc@4.21.0":
-  version "4.21.0"
-  resolved "http://39.108.216.210:9000/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.21.0.tgz#2fef1a90f1402258ef915ae5a94cc91a5a1d5bfc"
-  integrity sha512-s5oFkZ/hFcrlAyBTONFY1TWndfyre1wOMwU+6KCpm/iatybvrRgmZVM+vCFwxmC5ZhdlgfE0N4XorsDpi7/4XQ==
-
-"@rollup/rollup-win32-ia32-msvc@4.21.0":
-  version "4.21.0"
-  resolved "http://39.108.216.210:9000/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.21.0.tgz#a18ad47a95c5f264defb60acdd8c27569f816fc1"
-  integrity sha512-G9+TEqRnAA6nbpqyUqgTiopmnfgnMkR3kMukFBDsiyy23LZvUCpiUwjTRx6ezYCjJODXrh52rBR9oXvm+Fp5wg==
-
-"@rollup/rollup-win32-x64-msvc@4.21.0":
-  version "4.21.0"
-  resolved "http://39.108.216.210:9000/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.21.0.tgz#20c09cf44dcb082140cc7f439dd679fe4bba3375"
-  integrity sha512-2jsCDZwtQvRhejHLfZ1JY6w6kEuEtfF9nzYsZxzSlNVKDX+DpsDJ+Rbjkm74nvg2rdx0gwBS+IMdvwJuq3S9pQ==
-
-"@types/estree@1.0.5", "@types/estree@^1.0.0":
+"@rollup/rollup-android-arm-eabi@4.27.4":
+  version "4.27.4"
+  resolved "http://39.108.216.210:9000/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.27.4.tgz#e3c9cc13f144ba033df4d2c3130a214dc8e3473e"
+  integrity sha512-2Y3JT6f5MrQkICUyRVCw4oa0sutfAsgaSsb0Lmmy1Wi2y7X5vT9Euqw4gOsCyy0YfKURBg35nhUKZS4mDcfULw==
+
+"@rollup/rollup-android-arm64@4.27.4":
+  version "4.27.4"
+  resolved "http://39.108.216.210:9000/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.27.4.tgz#0474250fcb5871aca952e249a0c3270fc4310b55"
+  integrity sha512-wzKRQXISyi9UdCVRqEd0H4cMpzvHYt1f/C3CoIjES6cG++RHKhrBj2+29nPF0IB5kpy9MS71vs07fvrNGAl/iA==
+
+"@rollup/rollup-darwin-arm64@4.27.4":
+  version "4.27.4"
+  resolved "http://39.108.216.210:9000/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.27.4.tgz#77c29b4f9c430c1624f1a6835f2a7e82be3d16f2"
+  integrity sha512-PlNiRQapift4LNS8DPUHuDX/IdXiLjf8mc5vdEmUR0fF/pyy2qWwzdLjB+iZquGr8LuN4LnUoSEvKRwjSVYz3Q==
+
+"@rollup/rollup-darwin-x64@4.27.4":
+  version "4.27.4"
+  resolved "http://39.108.216.210:9000/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.27.4.tgz#7d87711f641a458868758cbf110fb32eabd6a25a"
+  integrity sha512-o9bH2dbdgBDJaXWJCDTNDYa171ACUdzpxSZt+u/AAeQ20Nk5x+IhA+zsGmrQtpkLiumRJEYef68gcpn2ooXhSQ==
+
+"@rollup/rollup-freebsd-arm64@4.27.4":
+  version "4.27.4"
+  resolved "http://39.108.216.210:9000/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.27.4.tgz#662f808d2780e4e91021ac9ee7ed800862bb9a57"
+  integrity sha512-NBI2/i2hT9Q+HySSHTBh52da7isru4aAAo6qC3I7QFVsuhxi2gM8t/EI9EVcILiHLj1vfi+VGGPaLOUENn7pmw==
+
+"@rollup/rollup-freebsd-x64@4.27.4":
+  version "4.27.4"
+  resolved "http://39.108.216.210:9000/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.27.4.tgz#71e5a7bcfcbe51d8b65d158675acec1307edea79"
+  integrity sha512-wYcC5ycW2zvqtDYrE7deary2P2UFmSh85PUpAx+dwTCO9uw3sgzD6Gv9n5X4vLaQKsrfTSZZ7Z7uynQozPVvWA==
+
+"@rollup/rollup-linux-arm-gnueabihf@4.27.4":
+  version "4.27.4"
+  resolved "http://39.108.216.210:9000/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.27.4.tgz#08f67fcec61ee18f8b33b3f403a834ab8f3aa75d"
+  integrity sha512-9OwUnK/xKw6DyRlgx8UizeqRFOfi9mf5TYCw1uolDaJSbUmBxP85DE6T4ouCMoN6pXw8ZoTeZCSEfSaYo+/s1w==
+
+"@rollup/rollup-linux-arm-musleabihf@4.27.4":
+  version "4.27.4"
+  resolved "http://39.108.216.210:9000/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.27.4.tgz#2e1ad4607f86475b1731556359c6070eb8f4b109"
+  integrity sha512-Vgdo4fpuphS9V24WOV+KwkCVJ72u7idTgQaBoLRD0UxBAWTF9GWurJO9YD9yh00BzbkhpeXtm6na+MvJU7Z73A==
+
+"@rollup/rollup-linux-arm64-gnu@4.27.4":
+  version "4.27.4"
+  resolved "http://39.108.216.210:9000/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.27.4.tgz#c65d559dcb0d3dabea500cf7b8215959ae6cccf8"
+  integrity sha512-pleyNgyd1kkBkw2kOqlBx+0atfIIkkExOTiifoODo6qKDSpnc6WzUY5RhHdmTdIJXBdSnh6JknnYTtmQyobrVg==
+
+"@rollup/rollup-linux-arm64-musl@4.27.4":
+  version "4.27.4"
+  resolved "http://39.108.216.210:9000/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.27.4.tgz#6739f7eb33e20466bb88748519c98ce8dee23922"
+  integrity sha512-caluiUXvUuVyCHr5DxL8ohaaFFzPGmgmMvwmqAITMpV/Q+tPoaHZ/PWa3t8B2WyoRcIIuu1hkaW5KkeTDNSnMA==
+
+"@rollup/rollup-linux-powerpc64le-gnu@4.27.4":
+  version "4.27.4"
+  resolved "http://39.108.216.210:9000/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.27.4.tgz#8d9fe9471c256e55278cb1f7b1c977cd8fe6df20"
+  integrity sha512-FScrpHrO60hARyHh7s1zHE97u0KlT/RECzCKAdmI+LEoC1eDh/RDji9JgFqyO+wPDb86Oa/sXkily1+oi4FzJQ==
+
+"@rollup/rollup-linux-riscv64-gnu@4.27.4":
+  version "4.27.4"
+  resolved "http://39.108.216.210:9000/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.27.4.tgz#9a467f7ad5b61c9d66b24e79a3c57cb755d02c35"
+  integrity sha512-qyyprhyGb7+RBfMPeww9FlHwKkCXdKHeGgSqmIXw9VSUtvyFZ6WZRtnxgbuz76FK7LyoN8t/eINRbPUcvXB5fw==
+
+"@rollup/rollup-linux-s390x-gnu@4.27.4":
+  version "4.27.4"
+  resolved "http://39.108.216.210:9000/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.27.4.tgz#efaddf22df27b87a267a731fbeb9539e92cd4527"
+  integrity sha512-PFz+y2kb6tbh7m3A7nA9++eInGcDVZUACulf/KzDtovvdTizHpZaJty7Gp0lFwSQcrnebHOqxF1MaKZd7psVRg==
+
+"@rollup/rollup-linux-x64-gnu@4.27.4":
+  version "4.27.4"
+  resolved "http://39.108.216.210:9000/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.27.4.tgz#a959eccb04b07fd1591d7ff745a6865faa7042cd"
+  integrity sha512-Ni8mMtfo+o/G7DVtweXXV/Ol2TFf63KYjTtoZ5f078AUgJTmaIJnj4JFU7TK/9SVWTaSJGxPi5zMDgK4w+Ez7Q==
+
+"@rollup/rollup-linux-x64-musl@4.27.4":
+  version "4.27.4"
+  resolved "http://39.108.216.210:9000/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.27.4.tgz#927764f1da1f2dd50943716dec93796d10cb6e99"
+  integrity sha512-5AeeAF1PB9TUzD+3cROzFTnAJAcVUGLuR8ng0E0WXGkYhp6RD6L+6szYVX+64Rs0r72019KHZS1ka1q+zU/wUw==
+
+"@rollup/rollup-win32-arm64-msvc@4.27.4":
+  version "4.27.4"
+  resolved "http://39.108.216.210:9000/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.27.4.tgz#030b6cc607d845da23dced624e47fb45de105840"
+  integrity sha512-yOpVsA4K5qVwu2CaS3hHxluWIK5HQTjNV4tWjQXluMiiiu4pJj4BN98CvxohNCpcjMeTXk/ZMJBRbgRg8HBB6A==
+
+"@rollup/rollup-win32-ia32-msvc@4.27.4":
+  version "4.27.4"
+  resolved "http://39.108.216.210:9000/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.27.4.tgz#3457a3f44a84f51d8097c3606429e01f0d2d0ec2"
+  integrity sha512-KtwEJOaHAVJlxV92rNYiG9JQwQAdhBlrjNRp7P9L8Cb4Rer3in+0A+IPhJC9y68WAi9H0sX4AiG2NTsVlmqJeQ==
+
+"@rollup/rollup-win32-x64-msvc@4.27.4":
+  version "4.27.4"
+  resolved "http://39.108.216.210:9000/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.27.4.tgz#67d516613c9f2fe42e2d8b78e252d0003179d92c"
+  integrity sha512-3j4jx1TppORdTAoBJRd+/wJRGCPC0ETWkXOecJ6PPZLj6SptXkrXcNqdj0oclbKML6FkQltdz7bBA3rUSirZug==
+
+"@types/estree@1.0.6":
+  version "1.0.6"
+  resolved "http://39.108.216.210:9000/@types/estree/-/estree-1.0.6.tgz#628effeeae2064a1b4e79f78e81d87b7e5fc7b50"
+  integrity sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==
+
+"@types/estree@^1.0.0":
   version "1.0.5"
   resolved "http://39.108.216.210:9000/@types/estree/-/estree-1.0.5.tgz#a6ce3e556e00fd9895dd872dd172ad0d4bd687f4"
   integrity sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==
@@ -1074,10 +1094,10 @@
     fast-glob "^3.3.2"
     magic-string "^0.30.8"
 
-"@vitejs/plugin-vue@^5.2.0":
-  version "5.2.0"
-  resolved "http://39.108.216.210:9000/@vitejs/plugin-vue/-/plugin-vue-5.2.0.tgz#994f3b4f12d3590c5a6895df4cbd270d9a6d5e17"
-  integrity sha512-7n7KdUEtx/7Yl7I/WVAMZ1bEb0eVvXF3ummWTeLcs/9gvo9pJhuLdouSXGjdZ/MKD1acf1I272+X0RMua4/R3g==
+"@vitejs/plugin-vue@^5.2.1":
+  version "5.2.1"
+  resolved "http://39.108.216.210:9000/@vitejs/plugin-vue/-/plugin-vue-5.2.1.tgz#d1491f678ee3af899f7ae57d9c21dc52a65c7133"
+  integrity sha512-cxh314tzaWwOLqVes2gnnCtvBDcM1UMdn+iFR+UjAn411dPT3tOmqrJjbMd7koZpMAmBM/GqeV4n9ge7JSiJJQ==
 
 "@vojtechlanka/vue-tags-input@^3":
   version "3.1.1"
@@ -1416,6 +1436,15 @@ axios@^1.7.7:
     form-data "^4.0.0"
     proxy-from-env "^1.1.0"
 
+axios@^1.7.8:
+  version "1.7.8"
+  resolved "http://39.108.216.210:9000/axios/-/axios-1.7.8.tgz#1997b1496b394c21953e68c14aaa51b7b5de3d6e"
+  integrity sha512-Uu0wb7KNqK2t5K+YQyVCLM76prD5sRFjKHbJYCP1J7JFGEQ6nN7HWn9+04LAeiJ3ji54lgS/gZCH1oxyrf1SPw==
+  dependencies:
+    follow-redirects "^1.15.6"
+    form-data "^4.0.0"
+    proxy-from-env "^1.1.0"
+
 b4a@^1.6.4:
   version "1.6.6"
   resolved "http://39.108.216.210:9000/b4a/-/b4a-1.6.6.tgz#a4cc349a3851987c3c4ac2d7785c18744f6da9ba"
@@ -1760,34 +1789,35 @@ entities@^4.5.0:
   resolved "http://39.108.216.210:9000/entities/-/entities-4.5.0.tgz#5d268ea5e7113ec74c4d033b79ea5a35a488fb48"
   integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==
 
-esbuild@^0.21.3:
-  version "0.21.5"
-  resolved "http://39.108.216.210:9000/esbuild/-/esbuild-0.21.5.tgz#9ca301b120922959b766360d8ac830da0d02997d"
-  integrity sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==
+esbuild@^0.24.0:
+  version "0.24.0"
+  resolved "http://39.108.216.210:9000/esbuild/-/esbuild-0.24.0.tgz#f2d470596885fcb2e91c21eb3da3b3c89c0b55e7"
+  integrity sha512-FuLPevChGDshgSicjisSooU0cemp/sGXR841D5LHMB7mTVOmsEHcAxaH3irL53+8YDIeVNQEySh4DaYU/iuPqQ==
   optionalDependencies:
-    "@esbuild/aix-ppc64" "0.21.5"
-    "@esbuild/android-arm" "0.21.5"
-    "@esbuild/android-arm64" "0.21.5"
-    "@esbuild/android-x64" "0.21.5"
-    "@esbuild/darwin-arm64" "0.21.5"
-    "@esbuild/darwin-x64" "0.21.5"
-    "@esbuild/freebsd-arm64" "0.21.5"
-    "@esbuild/freebsd-x64" "0.21.5"
-    "@esbuild/linux-arm" "0.21.5"
-    "@esbuild/linux-arm64" "0.21.5"
-    "@esbuild/linux-ia32" "0.21.5"
-    "@esbuild/linux-loong64" "0.21.5"
-    "@esbuild/linux-mips64el" "0.21.5"
-    "@esbuild/linux-ppc64" "0.21.5"
-    "@esbuild/linux-riscv64" "0.21.5"
-    "@esbuild/linux-s390x" "0.21.5"
-    "@esbuild/linux-x64" "0.21.5"
-    "@esbuild/netbsd-x64" "0.21.5"
-    "@esbuild/openbsd-x64" "0.21.5"
-    "@esbuild/sunos-x64" "0.21.5"
-    "@esbuild/win32-arm64" "0.21.5"
-    "@esbuild/win32-ia32" "0.21.5"
-    "@esbuild/win32-x64" "0.21.5"
+    "@esbuild/aix-ppc64" "0.24.0"
+    "@esbuild/android-arm" "0.24.0"
+    "@esbuild/android-arm64" "0.24.0"
+    "@esbuild/android-x64" "0.24.0"
+    "@esbuild/darwin-arm64" "0.24.0"
+    "@esbuild/darwin-x64" "0.24.0"
+    "@esbuild/freebsd-arm64" "0.24.0"
+    "@esbuild/freebsd-x64" "0.24.0"
+    "@esbuild/linux-arm" "0.24.0"
+    "@esbuild/linux-arm64" "0.24.0"
+    "@esbuild/linux-ia32" "0.24.0"
+    "@esbuild/linux-loong64" "0.24.0"
+    "@esbuild/linux-mips64el" "0.24.0"
+    "@esbuild/linux-ppc64" "0.24.0"
+    "@esbuild/linux-riscv64" "0.24.0"
+    "@esbuild/linux-s390x" "0.24.0"
+    "@esbuild/linux-x64" "0.24.0"
+    "@esbuild/netbsd-x64" "0.24.0"
+    "@esbuild/openbsd-arm64" "0.24.0"
+    "@esbuild/openbsd-x64" "0.24.0"
+    "@esbuild/sunos-x64" "0.24.0"
+    "@esbuild/win32-arm64" "0.24.0"
+    "@esbuild/win32-ia32" "0.24.0"
+    "@esbuild/win32-x64" "0.24.0"
 
 escalade@^3.1.1:
   version "3.1.2"
@@ -2668,11 +2698,6 @@ picocolors@^1.0.0:
   resolved "http://39.108.216.210:9000/picocolors/-/picocolors-1.0.0.tgz#cb5bdc74ff3f51892236eaf79d68bc44564ab81c"
   integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==
 
-picocolors@^1.0.1:
-  version "1.0.1"
-  resolved "http://39.108.216.210:9000/picocolors/-/picocolors-1.0.1.tgz#a8ad579b571952f0e5d25892de5445bcfe25aaa1"
-  integrity sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==
-
 picocolors@^1.1.0:
   version "1.1.0"
   resolved "http://39.108.216.210:9000/picocolors/-/picocolors-1.1.0.tgz#5358b76a78cde483ba5cef6a9dc9671440b27d59"
@@ -2688,10 +2713,10 @@ picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1:
   resolved "http://39.108.216.210:9000/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42"
   integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==
 
-pinia@^2.2.6:
-  version "2.2.6"
-  resolved "http://39.108.216.210:9000/pinia/-/pinia-2.2.6.tgz#ff93f35b8c02033eaedc8c92ad5f10f215d6c804"
-  integrity sha512-vIsR8JkDN5Ga2vAxqOE2cJj4VtsHnzpR1Fz30kClxlh0yCHfec6uoMeM3e/ddqmwFUejK3NlrcQa/shnpyT4hA==
+pinia@^2.2.7:
+  version "2.2.7"
+  resolved "http://39.108.216.210:9000/pinia/-/pinia-2.2.7.tgz#692ecbc259f92409b245b2dcc2564284e040b334"
+  integrity sha512-M+X9Eh9V5De+8wyj0rD1cgB0zy1mPN/aBEpCI9y+DgVmzXV2dIwjYBluJ5cMQd/jAoHs0VW+EyUSHMZv/Wtcnw==
   dependencies:
     "@vue/devtools-api" "^6.6.3"
     vue-demi "^0.14.10"
@@ -2722,15 +2747,6 @@ postcss@^8.4.38:
     picocolors "^1.0.0"
     source-map-js "^1.2.0"
 
-postcss@^8.4.43:
-  version "8.4.45"
-  resolved "http://39.108.216.210:9000/postcss/-/postcss-8.4.45.tgz#538d13d89a16ef71edbf75d895284ae06b79e603"
-  integrity sha512-7KTLTdzdZZYscUc65XmjFiB73vBhBfbPztCYdUNvlaso9PrzjzcmjqBPR0lNGkcVlcO4BjiO5rK/qNz+XAen1Q==
-  dependencies:
-    nanoid "^3.3.7"
-    picocolors "^1.0.1"
-    source-map-js "^1.2.0"
-
 postcss@^8.4.47:
   version "8.4.47"
   resolved "http://39.108.216.210:9000/postcss/-/postcss-8.4.47.tgz#5bf6c9a010f3e724c503bf03ef7947dcb0fea365"
@@ -2740,7 +2756,7 @@ postcss@^8.4.47:
     picocolors "^1.1.0"
     source-map-js "^1.2.1"
 
-postcss@^8.4.48:
+postcss@^8.4.48, postcss@^8.4.49:
   version "8.4.49"
   resolved "http://39.108.216.210:9000/postcss/-/postcss-8.4.49.tgz#4ea479048ab059ab3ae61d082190fabfd994fe19"
   integrity sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==
@@ -2848,29 +2864,31 @@ rimraf@^3.0.2:
   dependencies:
     glob "^7.1.3"
 
-rollup@^4.20.0:
-  version "4.21.0"
-  resolved "http://39.108.216.210:9000/rollup/-/rollup-4.21.0.tgz#28db5f5c556a5180361d35009979ccc749560b9d"
-  integrity sha512-vo+S/lfA2lMS7rZ2Qoubi6I5hwZwzXeUIctILZLbHI+laNtvhhOIon2S1JksA5UEDQ7l3vberd0fxK44lTYjbQ==
+rollup@^4.23.0:
+  version "4.27.4"
+  resolved "http://39.108.216.210:9000/rollup/-/rollup-4.27.4.tgz#b23e4ef4fe4d0d87f5237dacf63f95a499503897"
+  integrity sha512-RLKxqHEMjh/RGLsDxAEsaLO3mWgyoU6x9w6n1ikAzet4B3gI2/3yP6PWY2p9QzRTh6MfEIXB3MwsOY0Iv3vNrw==
   dependencies:
-    "@types/estree" "1.0.5"
+    "@types/estree" "1.0.6"
   optionalDependencies:
-    "@rollup/rollup-android-arm-eabi" "4.21.0"
-    "@rollup/rollup-android-arm64" "4.21.0"
-    "@rollup/rollup-darwin-arm64" "4.21.0"
-    "@rollup/rollup-darwin-x64" "4.21.0"
-    "@rollup/rollup-linux-arm-gnueabihf" "4.21.0"
-    "@rollup/rollup-linux-arm-musleabihf" "4.21.0"
-    "@rollup/rollup-linux-arm64-gnu" "4.21.0"
-    "@rollup/rollup-linux-arm64-musl" "4.21.0"
-    "@rollup/rollup-linux-powerpc64le-gnu" "4.21.0"
-    "@rollup/rollup-linux-riscv64-gnu" "4.21.0"
-    "@rollup/rollup-linux-s390x-gnu" "4.21.0"
-    "@rollup/rollup-linux-x64-gnu" "4.21.0"
-    "@rollup/rollup-linux-x64-musl" "4.21.0"
-    "@rollup/rollup-win32-arm64-msvc" "4.21.0"
-    "@rollup/rollup-win32-ia32-msvc" "4.21.0"
-    "@rollup/rollup-win32-x64-msvc" "4.21.0"
+    "@rollup/rollup-android-arm-eabi" "4.27.4"
+    "@rollup/rollup-android-arm64" "4.27.4"
+    "@rollup/rollup-darwin-arm64" "4.27.4"
+    "@rollup/rollup-darwin-x64" "4.27.4"
+    "@rollup/rollup-freebsd-arm64" "4.27.4"
+    "@rollup/rollup-freebsd-x64" "4.27.4"
+    "@rollup/rollup-linux-arm-gnueabihf" "4.27.4"
+    "@rollup/rollup-linux-arm-musleabihf" "4.27.4"
+    "@rollup/rollup-linux-arm64-gnu" "4.27.4"
+    "@rollup/rollup-linux-arm64-musl" "4.27.4"
+    "@rollup/rollup-linux-powerpc64le-gnu" "4.27.4"
+    "@rollup/rollup-linux-riscv64-gnu" "4.27.4"
+    "@rollup/rollup-linux-s390x-gnu" "4.27.4"
+    "@rollup/rollup-linux-x64-gnu" "4.27.4"
+    "@rollup/rollup-linux-x64-musl" "4.27.4"
+    "@rollup/rollup-win32-arm64-msvc" "4.27.4"
+    "@rollup/rollup-win32-ia32-msvc" "4.27.4"
+    "@rollup/rollup-win32-x64-msvc" "4.27.4"
     fsevents "~2.3.2"
 
 run-parallel@^1.1.9:
@@ -3144,10 +3162,10 @@ type-fest@^0.20.2:
   resolved "http://39.108.216.210:9000/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4"
   integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==
 
-typescript@^5.6.3:
-  version "5.6.3"
-  resolved "http://39.108.216.210:9000/typescript/-/typescript-5.6.3.tgz#5f3449e31c9d94febb17de03cc081dd56d81db5b"
-  integrity sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==
+typescript@^5.7.2:
+  version "5.7.2"
+  resolved "http://39.108.216.210:9000/typescript/-/typescript-5.7.2.tgz#3169cf8c4c8a828cde53ba9ecb3d2b1d5dd67be6"
+  integrity sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==
 
 ufo@^1.3.2:
   version "1.4.0"
@@ -3219,14 +3237,14 @@ util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1:
   resolved "http://39.108.216.210:9000/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
   integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==
 
-vite@^5.4.11:
-  version "5.4.11"
-  resolved "http://39.108.216.210:9000/vite/-/vite-5.4.11.tgz#3b415cd4aed781a356c1de5a9ebafb837715f6e5"
-  integrity sha512-c7jFQRklXua0mTzneGW9QVyxFjUgwcihC4bXEtujIo2ouWCe1Ajt/amn2PCxYnhYfd5k09JX3SB7OYWFKYqj8Q==
+vite@^6.0.1:
+  version "6.0.1"
+  resolved "http://39.108.216.210:9000/vite/-/vite-6.0.1.tgz#24c9caf24998f0598de37bed67e50ec5b9dfeaf0"
+  integrity sha512-Ldn6gorLGr4mCdFnmeAOLweJxZ34HjKnDm4HGo6P66IEqTxQb36VEdFJQENKxWjupNfoIjvRUnswjn1hpYEpjQ==
   dependencies:
-    esbuild "^0.21.3"
-    postcss "^8.4.43"
-    rollup "^4.20.0"
+    esbuild "^0.24.0"
+    postcss "^8.4.49"
+    rollup "^4.23.0"
   optionalDependencies:
     fsevents "~2.3.3"
 
@@ -3253,10 +3271,10 @@ vue-eslint-parser@^9.4.2:
     lodash "^4.17.21"
     semver "^7.3.6"
 
-vue-router@^4.4.5:
-  version "4.4.5"
-  resolved "http://39.108.216.210:9000/vue-router/-/vue-router-4.4.5.tgz#bdf535e4cf32414ebdea6b4b403593efdb541388"
-  integrity sha512-4fKZygS8cH1yCyuabAXGUAsyi1b2/o/OKgu/RUb+znIYOxPRxdkytJEx+0wGcpBE1pX6vUgh5jwWOKRGvuA/7Q==
+vue-router@^4.5.0:
+  version "4.5.0"
+  resolved "http://39.108.216.210:9000/vue-router/-/vue-router-4.5.0.tgz#58fc5fe374e10b6018f910328f756c3dae081f14"
+  integrity sha512-HDuk+PuH5monfNuY+ct49mNmkCRK4xJAV9Ts4z9UFc4rzdDnxQLyCMGGc8pKhZhHTVzfanpNwB/lwqevcBwI4w==
   dependencies:
     "@vue/devtools-api" "^6.6.4"