gemercheung 2 年之前
父節點
當前提交
5e50c71945

+ 3 - 1
package.json

@@ -23,6 +23,8 @@
   "dependencies": {
     "@ant-design/icons-vue": "^6.1.0",
     "@types/node": "^18.7.18",
+    "@wangeditor/editor": "^5.1.23",
+    "@wangeditor/editor-for-vue": "^5.1.12",
     "ant-design-vue": "3.3.0-beta.3",
     "axios": "^0.27.2",
     "dayjs": "^1.11.6",
@@ -38,7 +40,7 @@
     "vue-i18n": "^9.2.2",
     "vue-router": "4",
     "vue3-autocounter": "^1.0.6",
-    "vue3-otp-input": "^0.3.8"
+    "vue3-otp-input": "0.3.8"
   },
   "devDependencies": {
     "@types/lodash-es": "^4.17.6",

+ 4 - 4
src/api/room.ts

@@ -23,7 +23,7 @@ export type SRoom = {
   roomCoverUrl: string
   roomViewCount: number
   createTime: string
-  useTimeList?: Dayjs[],
+  useTimeList?: [Dayjs, Dayjs],
   visitPassword?: string,
   maxMan?: number,
   isRoamMode?: boolean,
@@ -45,7 +45,7 @@ export interface RoomScene {
 
 export type AuthUser = {
   userName: string
-  useTimeList?: Dayjs[]
+  useTimeList?: [Dayjs, Dayjs]
 }
 export interface Room {
   id: number
@@ -57,7 +57,7 @@ export interface Room {
   leaderName: string
   roomStatus?: number
   hostStatus?: number
-  useTimeList?: Dayjs[],
+  useTimeList?: [Dayjs, Dayjs],
   visitPassword?: string,
   maxMan?: number,
   isRoamMode?: boolean,
@@ -109,7 +109,7 @@ const localToServer = (room: Room): SRoom => ({
   userObjList: room.userObjList,
   image: room.scenesAlbum,
   head: room.scenesAvatar,
-  video: [room.scenesVideo],
+  video: [room.scenesVideo || ''],
 })
 
 export const fetchRomms = async (status: number = 1): Promise<Rooms> => {

+ 0 - 1
src/components.d.ts

@@ -37,7 +37,6 @@ declare module '@vue/runtime-core' {
     ATable: typeof import('ant-design-vue/es')['Table']
     ATabPane: typeof import('ant-design-vue/es')['TabPane']
     ATabs: typeof import('ant-design-vue/es')['Tabs']
-    ATextarea: typeof import('ant-design-vue/es')['Textarea']
     AUpload: typeof import('ant-design-vue/es')['Upload']
     BarChartOutlined: typeof import('@ant-design/icons-vue')['BarChartOutlined']
     CloseOutlined: typeof import('@ant-design/icons-vue')['CloseOutlined']

+ 2 - 1
src/store/modules/room.ts

@@ -15,6 +15,7 @@ import {
 } from '@/api'
 
 import { Room as SRoom, Scenes } from '@/api'
+import { Dayjs } from 'dayjs'
 
 export type { RoomScene } from '@/api'
 export type Rooms = Room[]
@@ -48,7 +49,7 @@ export const createRoom = (room: Partial<Room>): Room => {
     desc: '',
     cover: '',
     scenes: [],
-    useTimeList: [],
+    useTimeList: ['' as unknown as Dayjs, '' as unknown as Dayjs],
     maxMan: 10,
     ...room,
 

+ 7 - 4
src/views/room/edit-room/album-list.vue

@@ -30,7 +30,7 @@
         </div>
 
         <div v-else class="scene-sign">
-          <a-image v-if="item" :src="item" />
+          <a-image v-if="item" :src="item" :height="118" />
           <span class="delete-scene" @click="deleteAblum(index)">
             <close-outlined class="delete-scene-icon" />
           </span>
@@ -44,6 +44,7 @@
 import { computed, ref, watch, unref } from 'vue'
 import { Modal, message } from 'ant-design-vue'
 import type { UploadChangeParam } from 'ant-design-vue'
+import { baseURL } from '@/env'
 import { useI18n } from '@/hook/useI18n'
 import { watchEffect } from 'vue'
 
@@ -65,7 +66,9 @@ export interface FileItem {
 
 const { t } = useI18n()
 
-defineOptions<{ name: 'RoomSceneList' }>()
+defineOptions({
+  name: 'RoomSceneList'
+})
 const props = defineProps<{ data: string[] }>()
 
 const addMarked = Symbol('add-album')
@@ -107,11 +110,11 @@ const handleABlumChange = (info: UploadChangeParam) => {
 const handleBeforeUpload = (file: any) => {
   const isJpgOrPng = file.type === 'image/jpeg' || file.type === 'image/png'
   if (!isJpgOrPng) {
-    message.error('You can only upload JPG file!')
+    message.error('上传类型有误!')
   }
   const isLt5M = file.size / 1024 / 1024 < 5
   if (!isLt5M) {
-    message.error('Image must smaller than 5MB!')
+    message.error('上传超出大小!')
   }
   return isJpgOrPng && isLt5M
 }

+ 2 - 2
src/views/room/edit-room/avatar.vue

@@ -4,7 +4,7 @@
     name="file"
     accept=".png,.jpg,.jpeg"
     :show-upload-list="false"
-    action="https://v4-test.4dkankan.com/takelook/upload/file"
+    :action="baseURL + '/takelook/upload/file'"
     :max-count="1"
     class="uploader"
     :headers="{
@@ -33,7 +33,7 @@
 import { ref } from 'vue'
 import { message, type UploadChangeParam } from 'ant-design-vue'
 import type { FileItem } from './album-list.vue'
-
+import { baseURL } from '@/env'
 import { watchEffect } from 'vue'
 const emit = defineEmits(['sync'])
 const avatarFile = ref<any[]>([])

+ 60 - 38
src/views/room/edit-room/index.vue

@@ -88,13 +88,33 @@
           </a-form-item> -->
 
           <a-form-item :label="t('room.form.desc')" name="desc">
-            <a-textarea
+            <!-- <QuillEditor style="{minHeight: '400px';}" theme="snow" v-model:content="current.desc"  /> -->
+
+            <div style="border: 1px solid #ccc">
+              <!-- <Toolbar
+                style="border-bottom: 1px solid #ccc"
+                :editor="editorRef"
+                :defaultConfig="{}"
+                mode="simple"
+              /> -->
+              <Editor
+                style="height: 150px; overflow-y: hidden"
+                v-model="current.desc"
+                :defaultConfig="{
+                  maxLength: 200,
+                  placeholder: t('room.form.descplaceHolder')
+                }"
+                mode="simple"
+                @onCreated="handleEditorCreated"
+              />
+            </div>
+            <!-- <a-textarea
               v-model:value="current.desc"
               :placeholder="t('room.form.descplaceHolder')"
               :maxlength="200"
               show-count
               :disabled="isRoomEnd"
-            />
+            /> -->
           </a-form-item>
           <!-- <h4>{{ t('room.form.host') }}</h4> -->
 
@@ -126,10 +146,7 @@
             />
           </a-form-item>
           <a-form-item label="视频" name="title">
-            <EditVideo
-              :data="current.scenesVideo"
-              @sync="handleVideoSync"
-            />
+            <EditVideo :data="current.scenesVideo" @sync="handleVideoSync" />
           </a-form-item>
 
           <a-form-item
@@ -161,7 +178,6 @@
               :disabled="isRoomEnd"
               :disabledDate="disabledDate"
               :disabledTime="disabledTime"
-              @calendarChange="onRangeChange"
               v-model:value="current.useTimeList"
             />
           </a-form-item>
@@ -298,7 +314,8 @@ import {
   reactive,
   computed,
   unref,
-  createVNode
+  createVNode,
+  shallowRef
 } from 'vue'
 
 import { createRoom, useRoomStore } from '@/store/modules/room'
@@ -320,11 +337,14 @@ import duration from 'dayjs/plugin/duration'
 import { addAuthUser } from '@/api'
 import { ExclamationCircleOutlined } from '@ant-design/icons-vue'
 import { useScript } from '@/hook/useScript'
-import { onMounted } from 'vue'
+import { onMounted, onBeforeUnmount } from 'vue'
 import type { UploadChangeParam } from 'ant-design-vue'
 import { watchEffect } from 'vue'
+import '@wangeditor/editor/dist/css/style.css' // 引入 css
+import { Editor, Toolbar } from '@wangeditor/editor-for-vue'
 
 dayjs.extend(duration)
+
 // const titleValidator = ref({
 //   validator: (_, value) =>
 //     !value.includes(' ')
@@ -334,12 +354,20 @@ dayjs.extend(duration)
 
 interface AuthUserFormState {
   userName: string
-  useTimeList?: Dayjs[]
+  useTimeList?: [Dayjs, Dayjs]
 }
 
 export default defineComponent({
   name: 'EditRoom',
-  components: { EditScenes, VOtpInput, EditAlbum, EditAvatar, EditVideo },
+  components: {
+    EditScenes,
+    VOtpInput,
+    EditAlbum,
+    EditAvatar,
+    EditVideo,
+    Editor,
+    Toolbar
+  },
   props,
   setup(props) {
     const visible = ref(true)
@@ -362,13 +390,16 @@ export default defineComponent({
       }
       return unref(getLocale)
     })
+    const editorRef = shallowRef()
 
     const otpInput = ref('')
     const formRef = ref<FormInstance>()
     const current = reactive(createRoom(props.room || {}))
     // current.scenesAlbum = []
     if (current.useTimeList?.length) {
-      current.useTimeList = current.useTimeList?.map(i => dayjs(i))
+      current.useTimeList = current.useTimeList?.map(i =>
+        dayjs(i)
+      ) as unknown as [Dayjs, Dayjs]
     }
     if (!current.visitPassword) {
       current.visitPassword = ''
@@ -427,7 +458,7 @@ export default defineComponent({
     //   }))
     // }
 
-    const handleNickRegex = async (_: any, value: string) => {
+    const handleNickRegex = async (_: any, value: string): Promise<void> => {
       console.log('value', value)
       const regex = new RegExp(
         '^([\u4E00-\uFA29]|[\uE7C7-\uE7F3]|[a-zA-Z0-9_]){1,15}$'
@@ -435,7 +466,7 @@ export default defineComponent({
       if (value?.length && !regex.test(value)) {
         return Promise.reject(t('room.nickNameRegrexError'))
       }
-      return Promise.resolve('')
+      return Promise.resolve()
     }
 
     const handleAuthConfirm = async () => {
@@ -484,7 +515,7 @@ export default defineComponent({
       }
     }
 
-    const onRangeChange = (range: Dayjs[]) => {
+    const onRangeChange = (range: [Dayjs, Dayjs]): void => {
       const select = range.map((i, index) => {
         if (i) {
           const diff = i.diff(dayjs(), 'minutes')
@@ -606,7 +637,11 @@ export default defineComponent({
     onMounted(() => {
       // initMap()
     })
-
+    onBeforeUnmount(() => {
+      const editor = editorRef.value
+      if (editor == null) return
+      editor.destroy()
+    })
     const handleAvatarChange = (info: UploadChangeParam) => {
       // if (info.file.status !== 'uploading') {
       //   console.log(info.file, info.fileList)
@@ -637,6 +672,12 @@ export default defineComponent({
       console.log('avatarURL', avatarURL)
       current.scenesAvatar = avatarURL
     }
+    const handleEditorCreated = (editor: any) => {
+      editorRef.value = editor // 记录 editor 实例,重要!
+      // const toolbar = DomEditor.getToolbar(editor)
+      // const curToolbarConfig = toolbar.getConfig()
+      // console.log(curToolbarConfig.toolbarKeys) // 当前菜单排序和分组
+    }
 
     return {
       handleNickRegex,
@@ -670,7 +711,9 @@ export default defineComponent({
       handleAvatarChange,
       handleAlbumSync,
       handleAvatarSync,
-      handleVideoSync
+      handleVideoSync,
+      editorRef,
+      handleEditorCreated
     }
   }
 })
@@ -837,25 +880,4 @@ export default defineComponent({
     margin: 0;
   }
 }
-
-// .album-list {
-//   .album-list-item {
-//     .list-item {
-//       width: 100%;
-//       height: 100%;
-//       overflow: hidden;
-//       display: flex;
-//       justify-content: center;
-//       align-items: center;
-//       height: 120px;
-//       overflow: hidden;
-//       img {
-//         max-width: 100%;
-//         // height: 100%;
-//         display: block;
-//         object-fit: cover;
-//       }
-//     }
-//   }
-// }
 </style>

+ 5 - 2
src/views/room/edit-room/scene-list.vue

@@ -15,7 +15,10 @@
           </span>
           <p class="title">{{ item.title }}</p>
 
-          <div v-if="(Number(item.status) !== SceneStatus.SUCCESS)" class="status-cover">
+          <div
+            v-if="Number(item.status) !== SceneStatus.SUCCESS"
+            class="status-cover"
+          >
             <p>{{ sceneStatusDesc(item.status) }}</p>
           </div>
         </div>
@@ -41,7 +44,7 @@ import { useI18n } from '@/hook/useI18n'
 
 const { t } = useI18n()
 
-defineOptions<{ name: 'RoomSceneList' }>()
+defineOptions({ name: 'RoomSceneList' })
 const props = defineProps<{ scenes: Scene[] }>()
 const emit = defineEmits<{
   (e: 'delete', scene: Scene): void

+ 2 - 2
src/views/room/edit-room/video.vue

@@ -4,7 +4,7 @@
     name="file"
     :show-upload-list="false"
     accept=".mp4"
-    action="https://v4-test.4dkankan.com/takelook/upload/file"
+    :action="baseURL + '/takelook/upload/file'"
     :max-count="1"
     class="uploader"
     :headers="{
@@ -43,7 +43,7 @@
 import { ref } from 'vue'
 import { message, type UploadChangeParam } from 'ant-design-vue'
 import type { FileItem } from './album-list.vue'
-
+import { baseURL } from '@/env'
 import { watchEffect } from 'vue'
 import { nextTick } from 'vue'
 const emit = defineEmits(['sync'])

+ 3 - 1
src/views/room/modal/mini-sync.vue

@@ -17,7 +17,9 @@
 <script lang="ts" setup>
 import { ref } from 'vue'
 
-defineOptions<{ name: 'MiniSync' }>()
+defineOptions({
+  name: 'MiniSync'
+})
 defineProps<{
   title: string
   miniCode: string

+ 3 - 1
src/views/scene/list.vue

@@ -59,7 +59,9 @@ import { TableColumnsType } from 'ant-design-vue'
 
 const { t } = useI18n()
 
-defineOptions<{ name: 'SceneList' }>()
+defineOptions({
+  name: 'SceneList'
+})
 
 type SceneKey = Scene['num']
 

+ 11 - 12
src/views/statistic/tab/tab1.vue

@@ -83,7 +83,7 @@
             </li>
           </ul>
           <div class="topic-list-empty" v-else>
-             <a-empty :image="simpleImage" />
+            <a-empty :image="simpleImage" />
           </div>
         </a-card>
       </a-col>
@@ -97,7 +97,7 @@
             </li>
           </ul>
           <div class="topic-list-empty" v-else>
-             <a-empty :image="simpleImage" />
+            <a-empty :image="simpleImage" />
           </div>
         </a-card>
       </a-col>
@@ -141,7 +141,7 @@
           <!-- userVisitList?.length -->
           <div id="chart-2" class="chart" v-if="userVisitList?.length"></div>
           <div class="chart-empty" v-else>
-             <a-empty :image="simpleImage" />
+            <a-empty :image="simpleImage" />
           </div>
         </a-card>
       </a-col>
@@ -151,10 +151,9 @@
         <a-card title="">
           <div id="chart-3" class="chart" v-if="userMsgManList?.length"></div>
           <div class="chart-empty" v-else>
-             <a-empty :image="simpleImage" />
+            <a-empty :image="simpleImage" />
           </div>
         </a-card>
-        
       </a-col>
     </a-row>
   </div>
@@ -175,13 +174,13 @@ import Vue3Autocounter from 'vue3-autocounter'
 import * as echarts from 'echarts'
 import type { ECharts } from 'echarts'
 import { useStatisticStore } from '@/store/modules/statistic'
-import { Empty } from 'ant-design-vue';
+import { Empty } from 'ant-design-vue'
 const statisticStore = useStatisticStore()
 const { t } = useI18n()
 const takeLookList = computed(() => statisticStore.top5.takeLookList)
 const danmakuList = computed(() => statisticStore.top5.danmakuList)
 const heroStatus = computed(() => statisticStore.roomData)
-const simpleImage  = Empty.PRESENTED_IMAGE_SIMPLE;
+const simpleImage = Empty.PRESENTED_IMAGE_SIMPLE
 let onlineTimeChart: ECharts
 let roomUseVisitChart: ECharts
 let roomMsgChart: ECharts
@@ -192,11 +191,11 @@ const props = defineProps<{
 
 interface FormState {
   roomTitle: string
-  userTime: string[]
+  userTime: [string, string]
 }
 const formState: UnwrapRef<FormState> = reactive({
   roomTitle: '',
-  userTime: []
+  userTime: ['', '']
 })
 
 const onelineTimeCount = computed(() => statisticStore.onlineTimeCount)
@@ -486,7 +485,7 @@ watch(
       initTab()
     } else {
       formState.roomTitle = ''
-      formState.userTime = []
+      formState.userTime = ['', '']
     }
   },
   {
@@ -515,7 +514,7 @@ const handleResize = () => {
 const handleFinish = async () => {
   await statisticStore.fetchRoomVisitChart({
     timeList: formState.userTime
-      ? formState.userTime.map(item => item.toString())
+      ? formState.userTime.filter(i => i).map(item => item.toString())
       : [],
     roomTitle: formState.roomTitle?.length ? formState.roomTitle : ''
   })
@@ -609,7 +608,7 @@ const handleFinish = async () => {
     }
   }
 }
-.chart-empty{
+.chart-empty {
   min-height: 500px;
   display: flex;
   justify-content: center;

+ 11 - 12
src/views/statistic/tab/tab2.vue

@@ -73,7 +73,7 @@
 
 <script lang="ts" setup>
 import { computed, onMounted, UnwrapRef, watch, reactive, unref } from 'vue'
-import { TableColumnProps } from 'ant-design-vue'
+import { TableColumnProps, TablePaginationConfig } from 'ant-design-vue'
 import { useStatisticStore } from '@/store/modules/statistic'
 import { useI18n } from '@/hook/useI18n'
 
@@ -84,11 +84,11 @@ const props = defineProps<{
 
 const statisticStore = useStatisticStore()
 // const total = computed(() => statisticStore.allRoom.total)
-const pagination = computed(() => {
+const pagination = computed<TablePaginationConfig>(() => {
   return {
     current: statisticStore.allRoom.pageNum,
     total: statisticStore.allRoom.total,
-    pageSize: statisticStore.allRoom.pageSize, //每页中显示10条数据
+    pageSize: statisticStore.allRoom.pageSize,
     showSizeChanger: true,
     onChange: (current: number, page: any) => {
       console.log('page', current, page)
@@ -96,19 +96,19 @@ const pagination = computed(() => {
       pagination.value.pageSize = page
       fetchList()
     },
-    pageSizeOptions: ['10', '20', '50', '100'], //每页中显示的数据
+    pageSizeOptions: ['10', '20', '50', '100'],
     showTotal: (total: string) => t('statistic.pageCount').replace('%N%', total) //分页中显示总的数据
-  }
+  } as unknown as TablePaginationConfig
 })
 
 const roomList = computed(() => statisticStore.allRoom.list)
 interface FormState {
   roomTitle: string
-  userTime: string[]
+  userTime: [string, string]
 }
 const formState: UnwrapRef<FormState> = reactive({
   roomTitle: '',
-  userTime: []
+  userTime: ['', '']
 })
 
 const columns: TableColumnProps[] = [
@@ -123,8 +123,7 @@ const columns: TableColumnProps[] = [
   },
   {
     title: t('statistic.relatedScenes'),
-    dataIndex: 'sceneNameListStr',
-   
+    dataIndex: 'sceneNameListStr'
   },
   {
     title: t('statistic.duration'),
@@ -158,7 +157,7 @@ const fetchList = () => {
     pageNum: pagination.value.current,
     pageSize: pagination.value.pageSize,
     timeList: formState.userTime
-      ? formState.userTime.map(item => item.toString())
+      ? formState.userTime.filter(i => i).map(item => item.toString())
       : [],
     roomTitle: formState.roomTitle?.length ? formState.roomTitle : ''
   })
@@ -168,7 +167,7 @@ const exportList = () => {
     pageNum: pagination.value.current,
     pageSize: pagination.value.pageSize,
     timeList: formState.userTime
-      ? formState.userTime.map(item => item.toString())
+      ? formState.userTime.filter(i => i).map(item => item.toString())
       : [],
     roomTitle: formState.roomTitle?.length ? formState.roomTitle : ''
   })
@@ -183,7 +182,7 @@ watch(
       fetchList()
     } else {
       formState.roomTitle = ''
-      formState.userTime = []
+      formState.userTime = ['', '']
     }
   },
   {

+ 8 - 8
src/views/statistic/tab/tab3.vue

@@ -80,7 +80,7 @@
 
 <script lang="ts" setup>
 import { computed, onMounted, UnwrapRef, watch, unref, reactive } from 'vue'
-import { TableColumnProps } from 'ant-design-vue'
+import { TableColumnProps, TablePaginationConfig } from 'ant-design-vue'
 import { useStatisticStore } from '@/store/modules/statistic'
 import dayjs from 'dayjs'
 import { useI18n } from '@/hook/useI18n'
@@ -98,11 +98,11 @@ console.log('msgList', msgList)
 
 interface FormState {
   roomTitle: string
-  userTime: string[]
+  userTime: [string, string]
 }
 const formState: UnwrapRef<FormState> = reactive({
   roomTitle: '',
-  userTime: []
+  userTime: ['', '']
 })
 const columns: TableColumnProps[] = [
   {
@@ -146,7 +146,7 @@ const columns: TableColumnProps[] = [
   }
 ]
 
-const pagination = computed(() => {
+const pagination = computed<TablePaginationConfig>(() => {
   return {
     current: statisticStore.roomMsg.pageNum,
     total: statisticStore.roomMsg.total,
@@ -160,7 +160,7 @@ const pagination = computed(() => {
     },
     pageSizeOptions: ['10', '20', '50', '100'], //每页中显示的数据
     showTotal: (total: string) => t('statistic.pageCount').replace('%N%', total) //分页中显示总的数据
-  }
+  } as unknown as TablePaginationConfig
 })
 
 const fetchList = () => {
@@ -172,7 +172,7 @@ const fetchList = () => {
       // startTime: formState.userTime?.length ? formState.userTime[0] : '',
       // endTime: formState.userTime?.length ? formState.userTime[1] : '',
       timeList: formState.userTime
-        ? formState.userTime.map(item => item.toString())
+        ? formState.userTime.filter(i => i).map(item => item.toString())
         : [],
       roomTitle: formState.roomTitle?.length ? formState.roomTitle : ''
     })
@@ -188,7 +188,7 @@ const exportList = () => {
       // startTime: formState.userTime?.length ? formState.userTime[0] : '',
       // endTime: formState.userTime?.length ? formState.userTime[1] : '',
       timeList: formState.userTime
-        ? formState.userTime.map(item => item.toString())
+        ? formState.userTime.filter(i => i).map(item => item.toString())
         : [],
       roomTitle: formState.roomTitle?.length ? formState.roomTitle : ''
     })
@@ -204,7 +204,7 @@ watch(
       fetchList()
     } else {
       formState.roomTitle = ''
-      formState.userTime = []
+      formState.userTime = ['', '']
     }
   },
   {

+ 333 - 6
yarn.lock

@@ -47,7 +47,7 @@
   resolved "https://mirrors.cloud.tencent.com/npm/@babel/parser/-/parser-7.22.7.tgz#df8cf085ce92ddbdbf668a7f186ce848c9036cae"
   integrity sha512-7NF8pOkHP5o2vpmGgNGcfAeCvOYhGLyA3Z4eBQkT1RJlWu47n63bCs93QfJ2hIAFCil7L5P2IWhs1oToVgrL0Q==
 
-"@babel/runtime@^7.10.5":
+"@babel/runtime@^7.10.5", "@babel/runtime@^7.12.0":
   version "7.22.6"
   resolved "https://mirrors.cloud.tencent.com/npm/@babel/runtime/-/runtime-7.22.6.tgz#57d64b9ae3cff1d67eb067ae117dac087f5bd438"
   integrity sha512-wDb5pWm4WDdF6LFUde3Jl8WzPA+3ZbxYqkC6xAXuD3irdEHN1k0NfTRrJD8ZD378SJ61miMLCqIOXYhd8x+AJQ==
@@ -210,11 +210,21 @@
     core-js "^3.15.1"
     nanopop "^2.1.0"
 
+"@transloadit/prettier-bytes@0.0.7":
+  version "0.0.7"
+  resolved "https://mirrors.cloud.tencent.com/npm/@transloadit/prettier-bytes/-/prettier-bytes-0.0.7.tgz#cdb5399f445fdd606ed833872fa0cabdbc51686b"
+  integrity sha512-VeJbUb0wEKbcwaSlj5n+LscBl9IPgLPkHVGBkh00cztv6X4L/TJXK58LzFuBKX7/GAfiGhIwH67YTLTlzvIzBA==
+
 "@types/estree@^1.0.0":
   version "1.0.1"
   resolved "https://mirrors.cloud.tencent.com/npm/@types/estree/-/estree-1.0.1.tgz#aa22750962f3bf0e79d753d3cc067f010c95f194"
   integrity sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==
 
+"@types/event-emitter@^0.3.3":
+  version "0.3.3"
+  resolved "https://mirrors.cloud.tencent.com/npm/@types/event-emitter/-/event-emitter-0.3.3.tgz#727032a9fc67565f96bbd78b2e2809275c97d7e7"
+  integrity sha512-UfnOK1pIxO7P+EgPRZXD9jMpimd8QEFcEZ5R67R1UhGbv4zghU5+NE7U8M8G9H5Jc8FI51rqDWQs6FtUfq2e/Q==
+
 "@types/json-schema@^7.0.9":
   version "7.0.12"
   resolved "https://mirrors.cloud.tencent.com/npm/@types/json-schema/-/json-schema-7.0.12.tgz#d70faba7039d5fca54c83c7dbab41051d2b6f6cb"
@@ -331,6 +341,49 @@
     "@typescript-eslint/types" "5.62.0"
     eslint-visitor-keys "^3.3.0"
 
+"@uppy/companion-client@^2.2.2":
+  version "2.2.2"
+  resolved "https://mirrors.cloud.tencent.com/npm/@uppy/companion-client/-/companion-client-2.2.2.tgz#c70b42fdcca728ef88b3eebf7ee3e2fa04b4923b"
+  integrity sha512-5mTp2iq97/mYSisMaBtFRry6PTgZA6SIL7LePteOV5x0/DxKfrZW3DEiQERJmYpHzy7k8johpm2gHnEKto56Og==
+  dependencies:
+    "@uppy/utils" "^4.1.2"
+    namespace-emitter "^2.0.1"
+
+"@uppy/core@^2.1.1":
+  version "2.3.4"
+  resolved "https://mirrors.cloud.tencent.com/npm/@uppy/core/-/core-2.3.4.tgz#260b85b6bf3aa03cdc67da231f8c69cfbfdcc84a"
+  integrity sha512-iWAqppC8FD8mMVqewavCz+TNaet6HPXitmGXpGGREGrakZ4FeuWytVdrelydzTdXx6vVKkOmI2FLztGg73sENQ==
+  dependencies:
+    "@transloadit/prettier-bytes" "0.0.7"
+    "@uppy/store-default" "^2.1.1"
+    "@uppy/utils" "^4.1.3"
+    lodash.throttle "^4.1.1"
+    mime-match "^1.0.2"
+    namespace-emitter "^2.0.1"
+    nanoid "^3.1.25"
+    preact "^10.5.13"
+
+"@uppy/store-default@^2.1.1":
+  version "2.1.1"
+  resolved "https://mirrors.cloud.tencent.com/npm/@uppy/store-default/-/store-default-2.1.1.tgz#62a656a099bdaa012306e054d093754cb2d36e3e"
+  integrity sha512-xnpTxvot2SeAwGwbvmJ899ASk5tYXhmZzD/aCFsXePh/v8rNvR2pKlcQUH7cF/y4baUGq3FHO/daKCok/mpKqQ==
+
+"@uppy/utils@^4.1.2", "@uppy/utils@^4.1.3":
+  version "4.1.3"
+  resolved "https://mirrors.cloud.tencent.com/npm/@uppy/utils/-/utils-4.1.3.tgz#9d0be6ece4df25f228d30ef40be0f14208258ce3"
+  integrity sha512-nTuMvwWYobnJcytDO3t+D6IkVq/Qs4Xv3vyoEZ+Iaf8gegZP+rEyoaFT2CK5XLRMienPyqRqNbIfRuFaOWSIFw==
+  dependencies:
+    lodash.throttle "^4.1.1"
+
+"@uppy/xhr-upload@^2.0.3":
+  version "2.1.3"
+  resolved "https://mirrors.cloud.tencent.com/npm/@uppy/xhr-upload/-/xhr-upload-2.1.3.tgz#0d4e355332fe0c6eb372d7731315e04d02aeeb18"
+  integrity sha512-YWOQ6myBVPs+mhNjfdWsQyMRWUlrDLMoaG7nvf/G6Y3GKZf8AyjFDjvvJ49XWQ+DaZOftGkHmF1uh/DBeGivJQ==
+  dependencies:
+    "@uppy/companion-client" "^2.2.2"
+    "@uppy/utils" "^4.1.2"
+    nanoid "^3.1.25"
+
 "@vitejs/plugin-vue@^3.1.0":
   version "3.2.0"
   resolved "https://mirrors.cloud.tencent.com/npm/@vitejs/plugin-vue/-/plugin-vue-3.2.0.tgz#a1484089dd85d6528f435743f84cdd0d215bbb54"
@@ -568,6 +621,84 @@
   resolved "https://mirrors.cloud.tencent.com/npm/@vue/shared/-/shared-3.3.4.tgz#06e83c5027f464eef861c329be81454bc8b70780"
   integrity sha512-7OjdcV8vQ74eiz1TZLzZP4JwqM5fA94K6yntPS5Z25r9HDuGNzaGdgvwKYq6S+MxwF0TFRwe50fIR/MYnakdkQ==
 
+"@wangeditor/basic-modules@^1.1.7":
+  version "1.1.7"
+  resolved "https://mirrors.cloud.tencent.com/npm/@wangeditor/basic-modules/-/basic-modules-1.1.7.tgz#a9c3ccf4ef53332f29550d59d3676e15f395946f"
+  integrity sha512-cY9CPkLJaqF05STqfpZKWG4LpxTMeGSIIF1fHvfm/mz+JXatCagjdkbxdikOuKYlxDdeqvOeBmsUBItufDLXZg==
+  dependencies:
+    is-url "^1.2.4"
+
+"@wangeditor/code-highlight@^1.0.3":
+  version "1.0.3"
+  resolved "https://mirrors.cloud.tencent.com/npm/@wangeditor/code-highlight/-/code-highlight-1.0.3.tgz#90256857714d5c0cf83ac475aea64db7bf29a7cd"
+  integrity sha512-iazHwO14XpCuIWJNTQTikqUhGKyqj+dUNWJ9288Oym9M2xMVHvnsOmDU2sgUDWVy+pOLojReMPgXCsvvNlOOhw==
+  dependencies:
+    prismjs "^1.23.0"
+
+"@wangeditor/core@^1.1.19":
+  version "1.1.19"
+  resolved "https://mirrors.cloud.tencent.com/npm/@wangeditor/core/-/core-1.1.19.tgz#f9155f7fd92d03cb1982405b3b82e54c31f1c2b0"
+  integrity sha512-KevkB47+7GhVszyYF2pKGKtCSj/YzmClsD03C3zTt+9SR2XWT5T0e3yQqg8baZpcMvkjs1D8Dv4fk8ok/UaS2Q==
+  dependencies:
+    "@types/event-emitter" "^0.3.3"
+    event-emitter "^0.3.5"
+    html-void-elements "^2.0.0"
+    i18next "^20.4.0"
+    scroll-into-view-if-needed "^2.2.28"
+    slate-history "^0.66.0"
+
+"@wangeditor/editor-for-vue@^5.1.12":
+  version "5.1.12"
+  resolved "https://mirrors.cloud.tencent.com/npm/@wangeditor/editor-for-vue/-/editor-for-vue-5.1.12.tgz#f7d5f239b39cdfc01d31151488de8443fe6edc64"
+  integrity sha512-0Ds3D8I+xnpNWezAeO7HmPRgTfUxHLMd9JKcIw+QzvSmhC5xUHbpCcLU+KLmeBKTR/zffnS5GQo6qi3GhTMJWQ==
+
+"@wangeditor/editor@^5.1.23":
+  version "5.1.23"
+  resolved "https://mirrors.cloud.tencent.com/npm/@wangeditor/editor/-/editor-5.1.23.tgz#c9d2007b7cb0ceef6b72692b4ee87b01ee2367b3"
+  integrity sha512-0RxfeVTuK1tktUaPROnCoFfaHVJpRAIE2zdS0mpP+vq1axVQpLjM8+fCvKzqYIkH0Pg+C+44hJpe3VVroSkEuQ==
+  dependencies:
+    "@uppy/core" "^2.1.1"
+    "@uppy/xhr-upload" "^2.0.3"
+    "@wangeditor/basic-modules" "^1.1.7"
+    "@wangeditor/code-highlight" "^1.0.3"
+    "@wangeditor/core" "^1.1.19"
+    "@wangeditor/list-module" "^1.0.5"
+    "@wangeditor/table-module" "^1.1.4"
+    "@wangeditor/upload-image-module" "^1.0.2"
+    "@wangeditor/video-module" "^1.1.4"
+    dom7 "^3.0.0"
+    is-hotkey "^0.2.0"
+    lodash.camelcase "^4.3.0"
+    lodash.clonedeep "^4.5.0"
+    lodash.debounce "^4.0.8"
+    lodash.foreach "^4.5.0"
+    lodash.isequal "^4.5.0"
+    lodash.throttle "^4.1.1"
+    lodash.toarray "^4.4.0"
+    nanoid "^3.2.0"
+    slate "^0.72.0"
+    snabbdom "^3.1.0"
+
+"@wangeditor/list-module@^1.0.5":
+  version "1.0.5"
+  resolved "https://mirrors.cloud.tencent.com/npm/@wangeditor/list-module/-/list-module-1.0.5.tgz#3fc0b167acddf885536b45fa0c127f9c6adaea33"
+  integrity sha512-uDuYTP6DVhcYf7mF1pTlmNn5jOb4QtcVhYwSSAkyg09zqxI1qBqsfUnveeDeDqIuptSJhkh81cyxi+MF8sEPOQ==
+
+"@wangeditor/table-module@^1.1.4":
+  version "1.1.4"
+  resolved "https://mirrors.cloud.tencent.com/npm/@wangeditor/table-module/-/table-module-1.1.4.tgz#757d4a5868b2b658041cd323854a4d707c8347e9"
+  integrity sha512-5saanU9xuEocxaemGdNi9t8MCDSucnykEC6jtuiT72kt+/Hhh4nERYx1J20OPsTCCdVr7hIyQenFD1iSRkIQ6w==
+
+"@wangeditor/upload-image-module@^1.0.2":
+  version "1.0.2"
+  resolved "https://mirrors.cloud.tencent.com/npm/@wangeditor/upload-image-module/-/upload-image-module-1.0.2.tgz#89e9b9467e10cbc6b11dc5748e08dd23aaebee30"
+  integrity sha512-z81lk/v71OwPDYeQDxj6cVr81aDP90aFuywb8nPD6eQeECtOymrqRODjpO6VGvCVxVck8nUxBHtbxKtjgcwyiA==
+
+"@wangeditor/video-module@^1.1.4":
+  version "1.1.4"
+  resolved "https://mirrors.cloud.tencent.com/npm/@wangeditor/video-module/-/video-module-1.1.4.tgz#b9df1b3ab2cd53f678b19b4d927e200774a6f532"
+  integrity sha512-ZdodDPqKQrgx3IwWu4ZiQmXI8EXZ3hm2/fM6E3t5dB8tCaIGWQZhmqd6P5knfkRAd3z2+YRSRbxOGfoRSp/rLg==
+
 acorn-jsx@^5.3.2:
   version "5.3.2"
   resolved "https://mirrors.cloud.tencent.com/npm/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937"
@@ -892,6 +1023,14 @@ csstype@^3.1.1:
   resolved "https://mirrors.cloud.tencent.com/npm/csstype/-/csstype-3.1.2.tgz#1d4bf9d572f11c14031f0436e1c10bc1f571f50b"
   integrity sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==
 
+d@1, d@^1.0.1:
+  version "1.0.1"
+  resolved "https://mirrors.cloud.tencent.com/npm/d/-/d-1.0.1.tgz#8698095372d58dbee346ffd0c7093f99f8f9eb5a"
+  integrity sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==
+  dependencies:
+    es5-ext "^0.10.50"
+    type "^1.0.1"
+
 dayjs@^1.10.5, dayjs@^1.11.6:
   version "1.11.9"
   resolved "https://mirrors.cloud.tencent.com/npm/dayjs/-/dayjs-1.11.9.tgz#9ca491933fadd0a60a2c19f6c237c03517d71d1a"
@@ -950,6 +1089,13 @@ dom-scroll-into-view@^2.0.0:
   resolved "https://mirrors.cloud.tencent.com/npm/dom-scroll-into-view/-/dom-scroll-into-view-2.0.1.tgz#0decc8522801fd8d3f1c6ba355a74d382c5f989b"
   integrity sha512-bvVTQe1lfaUr1oFzZX80ce9KLDlZ3iU+XGNE/bz9HnGdklTieqsbmsLHe+rT2XWqopvL0PckkYqN7ksmm5pe3w==
 
+dom7@^3.0.0:
+  version "3.0.0"
+  resolved "https://mirrors.cloud.tencent.com/npm/dom7/-/dom7-3.0.0.tgz#b861ce5d67a6becd7aaa3ad02942ff14b1240331"
+  integrity sha512-oNlcUdHsC4zb7Msx7JN3K0Nro1dzJ48knvBOnDPKJ2GV9wl1i5vydJZUSyOfrkKFDZEud/jBsTk92S/VGSAe/g==
+  dependencies:
+    ssr-window "^3.0.0-alpha.1"
+
 eastasianwidth@^0.2.0:
   version "0.2.0"
   resolved "https://mirrors.cloud.tencent.com/npm/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb"
@@ -985,6 +1131,32 @@ es-module-lexer@^1.0.3:
   resolved "https://mirrors.cloud.tencent.com/npm/es-module-lexer/-/es-module-lexer-1.3.0.tgz#6be9c9e0b4543a60cd166ff6f8b4e9dae0b0c16f"
   integrity sha512-vZK7T0N2CBmBOixhmjdqx2gWVbFZ4DXZ/NyRMZVlJXPa7CyFS+/a4QQsDGDQy9ZfEzxFuNEsMLeQJnKP2p5/JA==
 
+es5-ext@^0.10.35, es5-ext@^0.10.50, es5-ext@~0.10.14:
+  version "0.10.62"
+  resolved "https://mirrors.cloud.tencent.com/npm/es5-ext/-/es5-ext-0.10.62.tgz#5e6adc19a6da524bf3d1e02bbc8960e5eb49a9a5"
+  integrity sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA==
+  dependencies:
+    es6-iterator "^2.0.3"
+    es6-symbol "^3.1.3"
+    next-tick "^1.1.0"
+
+es6-iterator@^2.0.3:
+  version "2.0.3"
+  resolved "https://mirrors.cloud.tencent.com/npm/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7"
+  integrity sha1-p96IkUGgWpSwhUQDstCg+/qY87c=
+  dependencies:
+    d "1"
+    es5-ext "^0.10.35"
+    es6-symbol "^3.1.1"
+
+es6-symbol@^3.1.1, es6-symbol@^3.1.3:
+  version "3.1.3"
+  resolved "https://mirrors.cloud.tencent.com/npm/es6-symbol/-/es6-symbol-3.1.3.tgz#bad5d3c1bcdac28269f4cb331e431c78ac705d18"
+  integrity sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==
+  dependencies:
+    d "^1.0.1"
+    ext "^1.1.2"
+
 esbuild-android-64@0.15.18:
   version "0.15.18"
   resolved "https://mirrors.cloud.tencent.com/npm/esbuild-android-64/-/esbuild-android-64-0.15.18.tgz#20a7ae1416c8eaade917fb2453c1259302c637a5"
@@ -1255,6 +1427,14 @@ esutils@^2.0.2:
   resolved "https://mirrors.cloud.tencent.com/npm/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64"
   integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==
 
+event-emitter@^0.3.5:
+  version "0.3.5"
+  resolved "https://mirrors.cloud.tencent.com/npm/event-emitter/-/event-emitter-0.3.5.tgz#df8c69eef1647923c7157b9ce83840610b02cc39"
+  integrity sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=
+  dependencies:
+    d "1"
+    es5-ext "~0.10.14"
+
 execa@^7.0.0:
   version "7.1.1"
   resolved "https://mirrors.cloud.tencent.com/npm/execa/-/execa-7.1.1.tgz#3eb3c83d239488e7b409d48e8813b76bb55c9c43"
@@ -1270,6 +1450,13 @@ execa@^7.0.0:
     signal-exit "^3.0.7"
     strip-final-newline "^3.0.0"
 
+ext@^1.1.2:
+  version "1.7.0"
+  resolved "https://mirrors.cloud.tencent.com/npm/ext/-/ext-1.7.0.tgz#0ea4383c0103d60e70be99e9a7f11027a33c4f5f"
+  integrity sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==
+  dependencies:
+    type "^2.7.2"
+
 fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3:
   version "3.1.3"
   resolved "https://mirrors.cloud.tencent.com/npm/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525"
@@ -1469,6 +1656,11 @@ he@^1.2.0:
   resolved "https://mirrors.cloud.tencent.com/npm/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f"
   integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==
 
+html-void-elements@^2.0.0:
+  version "2.0.1"
+  resolved "https://mirrors.cloud.tencent.com/npm/html-void-elements/-/html-void-elements-2.0.1.tgz#29459b8b05c200b6c5ee98743c41b979d577549f"
+  integrity sha512-0quDb7s97CfemeJAnW9wC0hw78MtW7NU3hqtCD75g2vFlDLt36llsYD7uB7SUzojLMP24N5IatXf7ylGXiGG9A==
+
 human-signals@^4.3.0:
   version "4.3.1"
   resolved "https://mirrors.cloud.tencent.com/npm/human-signals/-/human-signals-4.3.1.tgz#ab7f811e851fca97ffbd2c1fe9a958964de321b2"
@@ -1479,6 +1671,13 @@ husky@^8.0.1:
   resolved "https://mirrors.cloud.tencent.com/npm/husky/-/husky-8.0.3.tgz#4936d7212e46d1dea28fef29bb3a108872cd9184"
   integrity sha512-+dQSyqPh4x1hlO1swXBiNb2HzTDN1I2IGLQx1GrBuiqFJfoMrnZWwVmatvSiO+Iz8fBUnf+lekwNo4c2LlXItg==
 
+i18next@^20.4.0:
+  version "20.6.1"
+  resolved "https://mirrors.cloud.tencent.com/npm/i18next/-/i18next-20.6.1.tgz#535e5f6e5baeb685c7d25df70db63bf3cc0aa345"
+  integrity sha512-yCMYTMEJ9ihCwEQQ3phLo7I/Pwycf8uAx+sRHwwk5U9Aui/IZYgQRyMqXafQOw5QQ7DM1Z+WyEXWIqSuJHhG2A==
+  dependencies:
+    "@babel/runtime" "^7.12.0"
+
 iconv-lite@^0.6.3:
   version "0.6.3"
   resolved "https://mirrors.cloud.tencent.com/npm/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501"
@@ -1496,6 +1695,11 @@ image-size@~0.5.0:
   resolved "https://mirrors.cloud.tencent.com/npm/image-size/-/image-size-0.5.5.tgz#09dfd4ab9d20e29eb1c3e80b8990378df9e3cb9c"
   integrity sha1-Cd/Uq50g4p6xw+gLiZA3jfnjy5w=
 
+immer@^9.0.6:
+  version "9.0.21"
+  resolved "https://mirrors.cloud.tencent.com/npm/immer/-/immer-9.0.21.tgz#1e025ea31a40f24fb064f1fef23e931496330176"
+  integrity sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA==
+
 immutable@^4.0.0:
   version "4.3.1"
   resolved "https://mirrors.cloud.tencent.com/npm/immutable/-/immutable-4.3.1.tgz#17988b356097ab0719e2f741d56f3ec6c317f9dc"
@@ -1568,6 +1772,11 @@ is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1:
   dependencies:
     is-extglob "^2.1.1"
 
+is-hotkey@^0.2.0:
+  version "0.2.0"
+  resolved "https://mirrors.cloud.tencent.com/npm/is-hotkey/-/is-hotkey-0.2.0.tgz#1835a68171a91e5c9460869d96336947c8340cef"
+  integrity sha512-UknnZK4RakDmTgz4PI1wIph5yxSs/mvChWs9ifnlXsKuXgWmOkY/hAE0H/k2MIqH0RlRye0i1oC07MCRSD28Mw==
+
 is-number@^7.0.0:
   version "7.0.0"
   resolved "https://mirrors.cloud.tencent.com/npm/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b"
@@ -1583,11 +1792,21 @@ is-plain-object@3.0.1:
   resolved "https://mirrors.cloud.tencent.com/npm/is-plain-object/-/is-plain-object-3.0.1.tgz#662d92d24c0aa4302407b0d45d21f2251c85f85b"
   integrity sha512-Xnpx182SBMrr/aBik8y+GuR4U1L9FqMSojwDQwPMmxyC6bvEqly9UBCxhauBF5vNh2gwWJNX6oDV7O+OM4z34g==
 
+is-plain-object@^5.0.0:
+  version "5.0.0"
+  resolved "https://mirrors.cloud.tencent.com/npm/is-plain-object/-/is-plain-object-5.0.0.tgz#4427f50ab3429e9025ea7d52e9043a9ef4159344"
+  integrity sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==
+
 is-stream@^3.0.0:
   version "3.0.0"
   resolved "https://mirrors.cloud.tencent.com/npm/is-stream/-/is-stream-3.0.0.tgz#e6bfd7aa6bef69f4f472ce9bb681e3e57b4319ac"
   integrity sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==
 
+is-url@^1.2.4:
+  version "1.2.4"
+  resolved "https://mirrors.cloud.tencent.com/npm/is-url/-/is-url-1.2.4.tgz#04a4df46d28c4cff3d73d01ff06abeb318a1aa52"
+  integrity sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==
+
 is-what@^3.14.1:
   version "3.14.1"
   resolved "https://mirrors.cloud.tencent.com/npm/is-what/-/is-what-3.14.1.tgz#e1222f46ddda85dead0fd1c9df131760e77755c1"
@@ -1705,11 +1924,46 @@ lodash-es@^4.17.15, lodash-es@^4.17.21:
   resolved "https://mirrors.cloud.tencent.com/npm/lodash-es/-/lodash-es-4.17.21.tgz#43e626c46e6591b7750beb2b50117390c609e3ee"
   integrity sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==
 
+lodash.camelcase@^4.3.0:
+  version "4.3.0"
+  resolved "https://mirrors.cloud.tencent.com/npm/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz#b28aa6288a2b9fc651035c7711f65ab6190331a6"
+  integrity sha1-soqmKIorn8ZRA1x3EfZathkDMaY=
+
+lodash.clonedeep@^4.5.0:
+  version "4.5.0"
+  resolved "https://mirrors.cloud.tencent.com/npm/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef"
+  integrity sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=
+
+lodash.debounce@^4.0.8:
+  version "4.0.8"
+  resolved "https://mirrors.cloud.tencent.com/npm/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af"
+  integrity sha1-gteb/zCmfEAF/9XiUVMArZyk168=
+
+lodash.foreach@^4.5.0:
+  version "4.5.0"
+  resolved "https://mirrors.cloud.tencent.com/npm/lodash.foreach/-/lodash.foreach-4.5.0.tgz#1a6a35eace401280c7f06dddec35165ab27e3e53"
+  integrity sha1-Gmo16s5AEoDH8G3d7DUWWrJ+PlM=
+
+lodash.isequal@^4.5.0:
+  version "4.5.0"
+  resolved "https://mirrors.cloud.tencent.com/npm/lodash.isequal/-/lodash.isequal-4.5.0.tgz#415c4478f2bcc30120c22ce10ed3226f7d3e18e0"
+  integrity sha1-QVxEePK8wwEgwizhDtMib30+GOA=
+
 lodash.merge@^4.6.2:
   version "4.6.2"
   resolved "https://mirrors.cloud.tencent.com/npm/lodash.merge/-/lodash.merge-4.6.2.tgz#558aa53b43b661e1925a0afdfa36a9a1085fe57a"
   integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==
 
+lodash.throttle@^4.1.1:
+  version "4.1.1"
+  resolved "https://mirrors.cloud.tencent.com/npm/lodash.throttle/-/lodash.throttle-4.1.1.tgz#c23e91b710242ac70c37f1e1cda9274cc39bf2f4"
+  integrity sha1-wj6RtxAkKscMN/HhzaknTMOb8vQ=
+
+lodash.toarray@^4.4.0:
+  version "4.4.0"
+  resolved "https://mirrors.cloud.tencent.com/npm/lodash.toarray/-/lodash.toarray-4.4.0.tgz#24c4bfcd6b2fba38bfd0594db1179d8e9b656561"
+  integrity sha1-JMS/zWsvuji/0FlNsRedjptlZWE=
+
 lodash@^4.17.21:
   version "4.17.21"
   resolved "https://mirrors.cloud.tencent.com/npm/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c"
@@ -1798,6 +2052,13 @@ mime-db@1.52.0:
   resolved "https://mirrors.cloud.tencent.com/npm/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70"
   integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==
 
+mime-match@^1.0.2:
+  version "1.0.2"
+  resolved "https://mirrors.cloud.tencent.com/npm/mime-match/-/mime-match-1.0.2.tgz#3f87c31e9af1a5fd485fb9db134428b23bbb7ba8"
+  integrity sha1-P4fDHprxpf1IX7nbE0Qosju7e6g=
+  dependencies:
+    wildcard "^1.1.0"
+
 mime-types@^2.1.12:
   version "2.1.35"
   resolved "https://mirrors.cloud.tencent.com/npm/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a"
@@ -1871,7 +2132,12 @@ muggle-string@^0.3.1:
   resolved "https://mirrors.cloud.tencent.com/npm/muggle-string/-/muggle-string-0.3.1.tgz#e524312eb1728c63dd0b2ac49e3282e6ed85963a"
   integrity sha512-ckmWDJjphvd/FvZawgygcUeQCxzvohjFO5RxTjj4eq8kw359gFF3E1brjfI+viLMxss5JrHTDRHZvu2/tuy0Qg==
 
-nanoid@^3.3.6:
+namespace-emitter@^2.0.1:
+  version "2.0.1"
+  resolved "https://mirrors.cloud.tencent.com/npm/namespace-emitter/-/namespace-emitter-2.0.1.tgz#978d51361c61313b4e6b8cf6f3853d08dfa2b17c"
+  integrity sha512-N/sMKHniSDJBjfrkbS/tpkPj4RAbvW3mr8UAzvlMHyun93XEm83IAvhWtJVHo+RHn/oO8Job5YN4b+wRjSVp5g==
+
+nanoid@^3.1.25, nanoid@^3.2.0, nanoid@^3.3.6:
   version "3.3.6"
   resolved "https://mirrors.cloud.tencent.com/npm/nanoid/-/nanoid-3.3.6.tgz#443380c856d6e9f9824267d960b4236ad583ea4c"
   integrity sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==
@@ -1900,6 +2166,11 @@ needle@^3.1.0:
     iconv-lite "^0.6.3"
     sax "^1.2.4"
 
+next-tick@^1.1.0:
+  version "1.1.0"
+  resolved "https://mirrors.cloud.tencent.com/npm/next-tick/-/next-tick-1.1.0.tgz#1836ee30ad56d67ef281b22bd199f709449b35eb"
+  integrity sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==
+
 normalize-path@^3.0.0, normalize-path@~3.0.0:
   version "3.0.0"
   resolved "https://mirrors.cloud.tencent.com/npm/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65"
@@ -2089,6 +2360,11 @@ postcss@^8.1.10, postcss@^8.4.18:
     picocolors "^1.0.0"
     source-map-js "^1.0.2"
 
+preact@^10.5.13:
+  version "10.16.0"
+  resolved "https://mirrors.cloud.tencent.com/npm/preact/-/preact-10.16.0.tgz#68a06d70b191b8a313ea722d61e09c6b2a79a37e"
+  integrity sha512-XTSj3dJ4roKIC93pald6rWuB2qQJO9gO2iLLyTe87MrjQN+HklueLsmskbywEWqCHlclgz3/M4YLL2iBr9UmMA==
+
 prelude-ls@^1.2.1:
   version "1.2.1"
   resolved "https://mirrors.cloud.tencent.com/npm/prelude-ls/-/prelude-ls-1.2.1.tgz#debc6489d7a6e6b0e7611888cec880337d316396"
@@ -2106,6 +2382,11 @@ prettier@^2.7.1:
   resolved "https://mirrors.cloud.tencent.com/npm/prettier/-/prettier-2.8.8.tgz#e8c5d7e98a4305ffe3de2e1fc4aca1a71c28b1da"
   integrity sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==
 
+prismjs@^1.23.0:
+  version "1.29.0"
+  resolved "https://mirrors.cloud.tencent.com/npm/prismjs/-/prismjs-1.29.0.tgz#f113555a8fa9b57c35e637bba27509dcf802dd12"
+  integrity sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==
+
 prr@~1.0.1:
   version "1.0.1"
   resolved "https://mirrors.cloud.tencent.com/npm/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476"
@@ -2224,7 +2505,7 @@ sax@^1.2.4:
   resolved "https://mirrors.cloud.tencent.com/npm/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9"
   integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==
 
-scroll-into-view-if-needed@^2.2.25:
+scroll-into-view-if-needed@^2.2.25, scroll-into-view-if-needed@^2.2.28:
   version "2.2.31"
   resolved "https://mirrors.cloud.tencent.com/npm/scroll-into-view-if-needed/-/scroll-into-view-if-needed-2.2.31.tgz#d3c482959dc483e37962d1521254e3295d0d1587"
   integrity sha512-dGCXy99wZQivjmjIqihaBQNjryrz5rueJY7eHfTdyWEiR4ttYpsajb14rn9s5d4DY4EcY6+4+U/maARBXJedkA==
@@ -2284,6 +2565,22 @@ slash@^3.0.0:
   resolved "https://mirrors.cloud.tencent.com/npm/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634"
   integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==
 
+slate-history@^0.66.0:
+  version "0.66.0"
+  resolved "https://mirrors.cloud.tencent.com/npm/slate-history/-/slate-history-0.66.0.tgz#ac63fddb903098ceb4c944433e3f75fe63acf940"
+  integrity sha512-6MWpxGQZiMvSINlCbMW43E2YBSVMCMCIwQfBzGssjWw4kb0qfvj0pIdblWNRQZD0hR6WHP+dHHgGSeVdMWzfng==
+  dependencies:
+    is-plain-object "^5.0.0"
+
+slate@^0.72.0:
+  version "0.72.8"
+  resolved "https://mirrors.cloud.tencent.com/npm/slate/-/slate-0.72.8.tgz#5a018edf24e45448655293a68bfbcf563aa5ba81"
+  integrity sha512-/nJwTswQgnRurpK+bGJFH1oM7naD5qDmHd89JyiKNT2oOKD8marW0QSBtuFnwEbL5aGCS8AmrhXQgNOsn4osAw==
+  dependencies:
+    immer "^9.0.6"
+    is-plain-object "^5.0.0"
+    tiny-warning "^1.0.3"
+
 slice-ansi@^3.0.0:
   version "3.0.0"
   resolved "https://mirrors.cloud.tencent.com/npm/slice-ansi/-/slice-ansi-3.0.0.tgz#31ddc10930a1b7e0b67b08c96c2f49b77a789787"
@@ -2310,6 +2607,11 @@ slice-ansi@^5.0.0:
     ansi-styles "^6.0.0"
     is-fullwidth-code-point "^4.0.0"
 
+snabbdom@^3.1.0:
+  version "3.5.1"
+  resolved "https://mirrors.cloud.tencent.com/npm/snabbdom/-/snabbdom-3.5.1.tgz#25f80ef15b194baea703d9d5441892e369de18e1"
+  integrity sha512-wHMNIOjkm/YNE5EM3RCbr/+DVgPg6AqQAX1eOxO46zYNvCXjKP5Y865tqQj3EXnaMBjkxmQA5jFuDpDK/dbfiA==
+
 "source-map-js@>=0.6.2 <2.0.0", source-map-js@^1.0.2:
   version "1.0.2"
   resolved "https://mirrors.cloud.tencent.com/npm/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c"
@@ -2325,6 +2627,11 @@ sourcemap-codec@^1.4.8:
   resolved "https://mirrors.cloud.tencent.com/npm/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz#ea804bd94857402e6992d05a38ef1ae35a9ab4c4"
   integrity sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==
 
+ssr-window@^3.0.0-alpha.1:
+  version "3.0.0"
+  resolved "https://mirrors.cloud.tencent.com/npm/ssr-window/-/ssr-window-3.0.0.tgz#fd5b82801638943e0cc704c4691801435af7ac37"
+  integrity sha512-q+8UfWDg9Itrg0yWK7oe5p/XRCJpJF9OBtXfOPgSJl+u3Xd5KI328RUEvUqSMVM9CiQUEf1QdBzJMkYGErj9QA==
+
 string-argv@^0.3.1:
   version "0.3.2"
   resolved "https://mirrors.cloud.tencent.com/npm/string-argv/-/string-argv-0.3.2.tgz#2b6d0ef24b656274d957d54e0a4bbf6153dc02b6"
@@ -2401,6 +2708,11 @@ through@^2.3.8:
   resolved "https://mirrors.cloud.tencent.com/npm/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5"
   integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=
 
+tiny-warning@^1.0.3:
+  version "1.0.3"
+  resolved "https://mirrors.cloud.tencent.com/npm/tiny-warning/-/tiny-warning-1.0.3.tgz#94a30db453df4c643d0fd566060d60a875d84754"
+  integrity sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==
+
 to-fast-properties@^2.0.0:
   version "2.0.0"
   resolved "https://mirrors.cloud.tencent.com/npm/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e"
@@ -2452,6 +2764,16 @@ type-fest@^0.21.3:
   resolved "https://mirrors.cloud.tencent.com/npm/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37"
   integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==
 
+type@^1.0.1:
+  version "1.2.0"
+  resolved "https://mirrors.cloud.tencent.com/npm/type/-/type-1.2.0.tgz#848dd7698dafa3e54a6c479e759c4bc3f18847a0"
+  integrity sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==
+
+type@^2.7.2:
+  version "2.7.2"
+  resolved "https://mirrors.cloud.tencent.com/npm/type/-/type-2.7.2.tgz#2376a15a3a28b1efa0f5350dcf72d24df6ef98d0"
+  integrity sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==
+
 typescript@^4.6.4:
   version "4.9.5"
   resolved "https://mirrors.cloud.tencent.com/npm/typescript/-/typescript-4.9.5.tgz#095979f9bcc0d09da324d58d03ce8f8374cbe65a"
@@ -2622,9 +2944,9 @@ vue3-autocounter@^1.0.6:
   integrity sha512-jOgCD2WaOjt/tOAAGKDm2DTyQRdKyfqJv5ElUz/vR0ZJgUd4yDd6UX6+2YU3LQpY4qoFNZkzLloAfALAqK041g==
 
 vue3-otp-input@^0.3.8:
-  version "0.4.1"
-  resolved "https://mirrors.cloud.tencent.com/npm/vue3-otp-input/-/vue3-otp-input-0.4.1.tgz#4757cc771bb0c723e34b78857424322079d07fae"
-  integrity sha512-wVl9i3DcWlO0C7fBI9V+RIP3crm/1tY72fuhvb3YM2JfbLoYofB96aPl5AgFhA0Cse5bQEMYtIvOeiqW3rfbAw==
+  version "1.0.0"
+  resolved "https://mirrors.cloud.tencent.com/npm/vue3-otp-input/-/vue3-otp-input-1.0.0.tgz#888abd3d5be2a37b3b4aa3fd158148e2e7ad9a76"
+  integrity sha512-aP5+bGUOlBsssppmJC9SEZYvMgunMPs0RafRaMxoPSUkOt4OQ4Nmzua/j9hXn/yoDUiYqJ3gmnGzPpn8MmfSog==
 
 vue@^3.2.37:
   version "3.3.4"
@@ -2661,6 +2983,11 @@ which@^2.0.1:
   dependencies:
     isexe "^2.0.0"
 
+wildcard@^1.1.0:
+  version "1.1.2"
+  resolved "https://mirrors.cloud.tencent.com/npm/wildcard/-/wildcard-1.1.2.tgz#a7020453084d8cd2efe70ba9d3696263de1710a5"
+  integrity sha1-pwIEUwhNjNLv5wup02liY94XEKU=
+
 wrap-ansi@^6.2.0:
   version "6.2.0"
   resolved "https://mirrors.cloud.tencent.com/npm/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53"