Переглянути джерело

feat: 第二次版本提交

SongZihuan 4 місяців тому
батько
коміт
0bccbd510a

+ 0 - 14
.env.beta

@@ -1,14 +0,0 @@
-# assets name add hash
-VITE_HASH=false
-
-# visualize bundle
-VITE_VISUALIZE=false
-
-# api base
-VITE_API_BASE_URL=
-
-# router base
-VITE_ROUTE_BASE=
-
-# assets path in build
-VITE_ASSETS_BASE=

+ 5 - 5
.env.development

@@ -1,11 +1,11 @@
-# dev server.ts
-VITE_PORT=4451
+# assets name add hash
+VITE_HASH=false
+
+# visualize bundle
+VITE_VISUALIZE=false
 
 # proxy target url
 VITE_PROXY_TARGET=
 
 # api base
 VITE_API_BASE_URL=
-
-# router base
-VITE_ROUTE_BASE=

+ 2 - 8
.env.production

@@ -1,14 +1,8 @@
-# use compress to gzip
-VITE_GZIP=false
+# assets name add hash
+VITE_HASH=false
 
 # visualize bundle
 VITE_VISUALIZE=false
 
 # api base
 VITE_API_BASE_URL=
-
-# router base
-VITE_ROUTE_BASE=
-
-# assets path in build
-VITE_ASSETS_BASE=

+ 41 - 0
.github/ISSUE_TEMPLATE/1-bug.md

@@ -0,0 +1,41 @@
+---
+name: 遇到错误或反常情况
+about: 如果你遇到Bug(错误、不合理的情况)请通过此Issue反馈。
+---
+## Bug提交
+### 问题
+
+请简单概况问题。
+
+### 发生阶段
+
+* 运行(`go run`)
+* 构建(`go build`)
+* 构建后运行
+* 其他(请详细描述)
+
+(请在上述类型中选择或自行补充)
+
+### 你再做什么
+
+请详细说明你在做什么。
+
+### 项目运行的情况
+
+项目运行的情况是什么?
+
+例如:调用了某个API,数据库的写入或读取。
+
+### 发生了什么事情
+
+发生了什么错误?
+
+并且请把日志(若有)、命令行输出一并告诉我们。
+
+### 正确到结果应该是
+
+你希望正常的结果应该是什么?
+
+### 其他补充
+
+你的其他补充。

+ 7 - 0
.github/ISSUE_TEMPLATE/2-thank.md

@@ -0,0 +1,7 @@
+---
+name: 分享喜悦
+about: 如果我们的项目对你有帮助,或者你想分享一些喜悦(和项目有关的)欢迎使用此模板。
+---
+## 分享喜悦
+
+请简单叙述发生的事情,并为我们留言吧。

+ 1 - 0
.github/ISSUE_TEMPLATE/config.yaml

@@ -0,0 +1 @@
+blank_issues_enabled: true

+ 14 - 0
.github/pull-request-template.md

@@ -0,0 +1,14 @@
+<!-- 请务必在创建PR前,在右侧 Labels 选项中加上label的其中一个: [feature]、[fix]、[documentation] 。以便于Actions自动生成Releases时自动对PR进行归类。-->
+
+**在提出此拉取请求时,我确认了以下几点(请复选框):**
+
+- [ ] 我已阅读并理解[LICENSE](LICENSE),并自愿成为本项目的贡献者。
+- [ ] 我已检查没有与此请求重复的拉取请求。
+- [ ] 我已经考虑过,并确认这份呈件对其他人很有价值。
+- [ ] 我接受此提交可能不会被使用,并根据维护人员的意愿关闭拉取请求。
+
+**填写PR内容:**
+
+-
+-
+-

+ 111 - 14
README.md

@@ -1,27 +1,124 @@
-# Vue 3 + TypeScript + Vite + eslint 项目模板
+# Vite + Vue3 + TypeScript + Element Plus + Pinia 项目模板
+技术栈:node.js + TypeScript + Vite + Vue 3 + Vue Router 4 + Axios + Pinia + Element Plus
 
-## 特性
+node.js: 作者本人使用`18.19.0`。
 
-1.技术栈:vite + vue3全家桶 + ts + prettier + eslint + vant;
+pnpm: 作者本人使用`8.12.1`。
 
-2.适配:可修改变量为H5项目进行移动项目适配;
+其他细节可见:[package.json](./package.json)
 
-3.动画:使用gsap动画库;
+## 许可(License)
+本项目使用[MIT LICENSE](./LICENSE)许可证发布。
 
-4.vite插件:日常项目常用插件已备。
+MIT License: [mit-license.org](https://mit-license.org/)
 
-## 安装
+## 配置文件
+配置文件通常为`.env`开头的文件。例如开发模式会读取`.env.development`文件,生产模式会读取`.env.production`文件。
+当然,读取文件的后缀是根据`pacckage.json`中的指令决定的。具体更详细的说明可见后文。
 
-项目git clone后,直接`pnpm install`安装依赖
+配置项如下:
+```.env
+VITE_HASH # 对于资源文件(例如图片)在build的时候,是否在文件名上添加哈希。具体作用见后文。
+VITE_VISUALIZE # 是否在构建时生成构建分析报告(HTML交互式报告)。具体作用见后文。
+VITE_API_BASE_URL # API请求前缀。具体作用见后文。
+VITE_PROXY_TARGET # 代理目标。具体作用见后文。
+```
 
-## 使用
+### 读取配置文件的说明
+```json
+{
+  "scripts": {
+    "dev": "vite",
+    "build": "vue-tsc && vite build",
+    "build:beta": "vue-tsc && vite build --mode beta",
+    "preview": "vite preview"
+  }
+}
+```
+在程序`dev`中,调用`vite`指令会读取`.env.development`文件,而程序`build`则会调用`vite build`指令且读取`.env.production`文件。
+你也可以通过`--mode`参数指定需要读取的文件,例如`vite build --mode beta`会读取`.env.beta`文件。
 
-开发: `pnpm dev`
+### 资源文件名添加哈希的说明(VITE_HASH)
+资源文件名添加哈希,可以保证每次项目重新构建时,资源文件名称不同,可以防止浏览器缓存问题(浏览器缓存旧版本的资源文件而不是使用新构建时的资源文件)。
+在开发模式时建议设置为`false`,因为这样可以方便调试。在生产模式时建议设置为`true`,因为这样可以保证资源文件的唯一性。
 
-测试打包:`pnpm build:beta` 
+### 构建时生成HTML交互式报告(VITE_VISUALIZE)
+启用`visualizer` 构建时插件。改插件通常用于 JavaScript 应用的打包分析。它可以帮助开发者可视化地理解最终打包产物的结构、大小分布以及依赖关系。
+他会在构建目录下生成报告的交互页面(例如:`./dist/report`),内部浏览完毕后建议删除该目录再上传到生产环境,当然你也可以保留以供你的用户浏览。
 
-正式打包:`pnpm build`
+### API请求前缀(VITE_API_BASE_URL)
+**该配置需要与后端同步(请见后文)**
 
-## 推荐的编辑器插件安装
+**此处不考请求跨域问题,默认为不跨域**
 
-- [VS Code](https://code.visualstudio.com/) + [Volar](https://marketplace.visualstudio.com/items?itemName=Vue.volar) (and disable Vetur) + [TypeScript Vue Plugin (Volar)](https://marketplace.visualstudio.com/items?itemName=Vue.vscode-typescript-vue-plugin).
+例如你的API请求前缀为`https://api.example.com`,那么你可以在`.env`文件中设置`VITE_API_BASE_URL = https://api.example.com `。
+
+当然,如果你的API的路径都具有一个固定的前缀(例如:`/api/v1`),那么你可以射中`VITE_API_BASE_URL = https://api.example.com/api/v1 `,
+这样当系统请求`/user/info`的时候就会请求` https://api.example.com/api/v1/user/info `。
+
+这样做还要一种好处,例如你后端简体的api是`/user/info`,正常来说前端应该请求` https://api.example.com/user/info `,其中`/user/info`会单独写在项目的`api`文件中,
+并且和`VITE_API_BASE_URL`拼接生成最终请求地址(` https://api.example.com/user/info `)。
+但是当你后端使用Nginx(或其他技术)做了反向代理,将`/api/v1`代理到了`/`,那么前端就应该请求` https://api.example.com/api/v1/user/info `,
+此时只需要修改`VITE_API_BASE_URL`的值为(` https://api.example.com/api/v1 `)即可,而不需要修改项目中的`api`文件中的`user/info`。
+
+#### 与后端同步配置
+该配置在一般情况下应该与后端配置文件的`http.baseapi`保持一致。注意,`http.baseapi`的默认值是`/api`,当`http.baseapi`为空时也会使用默认值。
+
+若使用了Nginx(或其他技术)的反向代理,则请确保`VITE_API_BASE_URL`的值与反向代理的值保持一致。即访问`VITE_API_BASE_URL`的值时,会被代理到后端的`http.baseapi`。
+
+### 代理目标(VITE_PROXY_TARGET)
+**仅用于测试环境**
+
+开启后,将会将`/api`开头的请求转发到`VITE_PROXY_TARGET`上。
+例如,请求`axios.get('/api/user/info')`则反向代理到`VITE_PROXY_TARGET + '/api/user/info'`上。
+
+这么做的一个主要原因是解决跨域问题。前端在测试时通常是`localhost:8080`(端口号可能不同),后端可能则不在此地址上(尽管也可能在`localhost`上,但端口号不同,则仍然可能造成跨域)。
+因此需要vite进行一个反向代理。
+
+生产环境下不需要此功能,通常使用Nginx(或其他技术)解决问题,让后端和前端在一起,即同一个IP或域名,同一个端口号(例如常见的443和80)。
+
+## 运行和构建
+**下文使用npm为例,作者实际上使用的是pnpm。**
+
+**当然,你可以尝试使用yarn,作者在此之前并未尝试过。**
+
+运行前,你需要安装一些`node`模块。请执行:
+```shell
+npm install
+```
+
+### 运行
+开发运行模式请执行(配置文件为`.env.development`,你应该对其进行修改为你的配置):
+```shell
+npm run dev
+```
+
+你将在命令行看到服务启动的提示,以及监听地址。
+访问监听地址,你就可以看到前端了。
+
+通过此方式启动的开发运行模式具有热模块替换(HMR)、快速重新加载等特性,适合开发调试。
+
+### 构建
+对于生产环境构建,请执行(配置文件为`.env.production`,你应该对其进行修改为你的配置):
+```shell
+npm run build
+```
+
+构建的结果将在`.\dist-production`下。
+
+构建完成后,可以通过执行`preview`命令,来启动一个简易服务器(类似于Nginx)来部署构建结果:
+```shell
+npm run preview
+```
+
+这并不是开发运行模式,而是把经过上述方式构建生成的文件(`.\dist-production`)模拟生产环境进行预览。
+在运行此命令之前,你应该先进行构建,并生成`.\dist-production`目录。
+
+## 鸣谢
+感谢Jetbrains AI Assistant(中国大陆版)为本项目提供了AI(人工智能)技术支持。
+
+感谢Vite、Vue、Vue Router、Vuex、Axios、Element Plus等开源项目为本项目提供了技术支持。
+
+感谢Github平台为本项目提供了代码托管服务。
+
+特别鸣谢本项目所有贡献者和贡献团体对本项目的支持,你可以从PR记录、Commit记录中查看到他们的名字和贡献。

+ 0 - 11
hooks/ref.ts

@@ -1,11 +0,0 @@
-import { Ref, ref, UnwrapRef } from 'vue'
-
-type UseRef<T> = [Ref<UnwrapRef<T>>, (value: UnwrapRef<T>) => void]
-
-export default function useRef<T = any>(initValue: T): UseRef<T> {
-  const refValue = ref<T>(initValue)
-  const setRefValue = (value: UnwrapRef<T>) => {
-    refValue.value = value
-  }
-  return [refValue, setRefValue]
-}

+ 0 - 24
mock/GET_ACTIVITY_DETAIL.ts

@@ -1,24 +0,0 @@
-// 活动信息
-import { MockMethod } from 'vite-plugin-mock'
-export default [
-  {
-    // url: '/api/v2/activity/fool/64',
-    // method: 'get',
-    // response: () => {
-    //   return {
-    //     status: true,
-    //     code: 200,
-    //     start_time: '2023-01-18 00:00:00',
-    //     succ: true,
-    //     is_open: true,
-    //     end_time: '2023-03-01 23:59:59',
-    //     message: '成功',
-    //     data: {
-    //       start_time: '2023-01-18 00:00:00',
-    //       is_open: true,
-    //       end_time: '2023-03-01 23:59:59'
-    //     }
-    //   }
-    // }
-  }
-] as MockMethod[]

+ 2 - 0
package.json

@@ -15,8 +15,10 @@
     "@vueuse/core": "^10.1.2",
     "axios": "^1.3.6",
     "crypto-es": "1.2.7",
+    "element-plus": "^2.9.1",
     "html2canvas": "1.4.1",
     "jsencrypt": "3.2.1",
+    "normalize.css": "^8.0.1",
     "path": "^0.12.7",
     "pinia": "^2.0.35",
     "vant": "^4.2.0",

+ 602 - 548
pnpm-lock.yaml

@@ -1,5 +1,9 @@
 lockfileVersion: '6.0'
 
+settings:
+  autoInstallPeers: true
+  excludeLinksFromLockfile: false
+
 dependencies:
   '@sky-serein/js-utils':
     specifier: 0.0.11
@@ -16,12 +20,18 @@ dependencies:
   crypto-es:
     specifier: 1.2.7
     version: 1.2.7
+  element-plus:
+    specifier: ^2.9.1
+    version: 2.9.1(vue@3.2.47)
   html2canvas:
     specifier: 1.4.1
     version: 1.4.1
   jsencrypt:
     specifier: 3.2.1
     version: 3.2.1
+  normalize.css:
+    specifier: ^8.0.1
+    version: 8.0.1
   path:
     specifier: ^0.12.7
     version: 0.12.7
@@ -150,6 +160,226 @@ packages:
       '@babel/helper-validator-identifier': 7.19.1
       to-fast-properties: 2.0.0
 
+  /@ctrl/tinycolor@3.6.1:
+    resolution: {integrity: sha512-SITSV6aIXsuVNV3f3O0f2n/cgyEDWoSqtZMYiAmcsYHydcKrOz3gUxB/iXd/Qf08+IZX4KpgNbvUdMBmWz+kcA==}
+    engines: {node: '>=10'}
+    dev: false
+
+  /@element-plus/icons-vue@2.3.1(vue@3.2.47):
+    resolution: {integrity: sha512-XxVUZv48RZAd87ucGS48jPf6pKu0yV5UCg9f4FFwtrYxXOwWuVJo6wOvSLKEoMQKjv8GsX/mhP6UsC1lRwbUWg==}
+    peerDependencies:
+      vue: ^3.2.0
+    dependencies:
+      vue: 3.2.47
+    dev: false
+
+  /@esbuild/android-arm64@0.17.17:
+    resolution: {integrity: sha512-jaJ5IlmaDLFPNttv0ofcwy/cfeY4bh/n705Tgh+eLObbGtQBK3EPAu+CzL95JVE4nFAliyrnEu0d32Q5foavqg==}
+    engines: {node: '>=12'}
+    cpu: [arm64]
+    os: [android]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/android-arm@0.17.17:
+    resolution: {integrity: sha512-E6VAZwN7diCa3labs0GYvhEPL2M94WLF8A+czO8hfjREXxba8Ng7nM5VxV+9ihNXIY1iQO1XxUU4P7hbqbICxg==}
+    engines: {node: '>=12'}
+    cpu: [arm]
+    os: [android]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/android-x64@0.17.17:
+    resolution: {integrity: sha512-446zpfJ3nioMC7ASvJB1pszHVskkw4u/9Eu8s5yvvsSDTzYh4p4ZIRj0DznSl3FBF0Z/mZfrKXTtt0QCoFmoHA==}
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [android]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/darwin-arm64@0.17.17:
+    resolution: {integrity: sha512-m/gwyiBwH3jqfUabtq3GH31otL/0sE0l34XKpSIqR7NjQ/XHQ3lpmQHLHbG8AHTGCw8Ao059GvV08MS0bhFIJQ==}
+    engines: {node: '>=12'}
+    cpu: [arm64]
+    os: [darwin]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/darwin-x64@0.17.17:
+    resolution: {integrity: sha512-4utIrsX9IykrqYaXR8ob9Ha2hAY2qLc6ohJ8c0CN1DR8yWeMrTgYFjgdeQ9LIoTOfLetXjuCu5TRPHT9yKYJVg==}
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [darwin]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/freebsd-arm64@0.17.17:
+    resolution: {integrity: sha512-4PxjQII/9ppOrpEwzQ1b0pXCsFLqy77i0GaHodrmzH9zq2/NEhHMAMJkJ635Ns4fyJPFOlHMz4AsklIyRqFZWA==}
+    engines: {node: '>=12'}
+    cpu: [arm64]
+    os: [freebsd]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/freebsd-x64@0.17.17:
+    resolution: {integrity: sha512-lQRS+4sW5S3P1sv0z2Ym807qMDfkmdhUYX30GRBURtLTrJOPDpoU0kI6pVz1hz3U0+YQ0tXGS9YWveQjUewAJw==}
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [freebsd]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/linux-arm64@0.17.17:
+    resolution: {integrity: sha512-2+pwLx0whKY1/Vqt8lyzStyda1v0qjJ5INWIe+d8+1onqQxHLLi3yr5bAa4gvbzhZqBztifYEu8hh1La5+7sUw==}
+    engines: {node: '>=12'}
+    cpu: [arm64]
+    os: [linux]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/linux-arm@0.17.17:
+    resolution: {integrity: sha512-biDs7bjGdOdcmIk6xU426VgdRUpGg39Yz6sT9Xp23aq+IEHDb/u5cbmu/pAANpDB4rZpY/2USPhCA+w9t3roQg==}
+    engines: {node: '>=12'}
+    cpu: [arm]
+    os: [linux]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/linux-ia32@0.17.17:
+    resolution: {integrity: sha512-IBTTv8X60dYo6P2t23sSUYym8fGfMAiuv7PzJ+0LcdAndZRzvke+wTVxJeCq4WgjppkOpndL04gMZIFvwoU34Q==}
+    engines: {node: '>=12'}
+    cpu: [ia32]
+    os: [linux]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/linux-loong64@0.14.54:
+    resolution: {integrity: sha512-bZBrLAIX1kpWelV0XemxBZllyRmM6vgFQQG2GdNb+r3Fkp0FOh1NJSvekXDs7jq70k4euu1cryLMfU+mTXlEpw==}
+    engines: {node: '>=12'}
+    cpu: [loong64]
+    os: [linux]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/linux-loong64@0.17.17:
+    resolution: {integrity: sha512-WVMBtcDpATjaGfWfp6u9dANIqmU9r37SY8wgAivuKmgKHE+bWSuv0qXEFt/p3qXQYxJIGXQQv6hHcm7iWhWjiw==}
+    engines: {node: '>=12'}
+    cpu: [loong64]
+    os: [linux]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/linux-mips64el@0.17.17:
+    resolution: {integrity: sha512-2kYCGh8589ZYnY031FgMLy0kmE4VoGdvfJkxLdxP4HJvWNXpyLhjOvxVsYjYZ6awqY4bgLR9tpdYyStgZZhi2A==}
+    engines: {node: '>=12'}
+    cpu: [mips64el]
+    os: [linux]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/linux-ppc64@0.17.17:
+    resolution: {integrity: sha512-KIdG5jdAEeAKogfyMTcszRxy3OPbZhq0PPsW4iKKcdlbk3YE4miKznxV2YOSmiK/hfOZ+lqHri3v8eecT2ATwQ==}
+    engines: {node: '>=12'}
+    cpu: [ppc64]
+    os: [linux]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/linux-riscv64@0.17.17:
+    resolution: {integrity: sha512-Cj6uWLBR5LWhcD/2Lkfg2NrkVsNb2sFM5aVEfumKB2vYetkA/9Uyc1jVoxLZ0a38sUhFk4JOVKH0aVdPbjZQeA==}
+    engines: {node: '>=12'}
+    cpu: [riscv64]
+    os: [linux]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/linux-s390x@0.17.17:
+    resolution: {integrity: sha512-lK+SffWIr0XsFf7E0srBjhpkdFVJf3HEgXCwzkm69kNbRar8MhezFpkIwpk0qo2IOQL4JE4mJPJI8AbRPLbuOQ==}
+    engines: {node: '>=12'}
+    cpu: [s390x]
+    os: [linux]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/linux-x64@0.17.17:
+    resolution: {integrity: sha512-XcSGTQcWFQS2jx3lZtQi7cQmDYLrpLRyz1Ns1DzZCtn898cWfm5Icx/DEWNcTU+T+tyPV89RQtDnI7qL2PObPg==}
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [linux]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/netbsd-x64@0.17.17:
+    resolution: {integrity: sha512-RNLCDmLP5kCWAJR+ItLM3cHxzXRTe4N00TQyQiimq+lyqVqZWGPAvcyfUBM0isE79eEZhIuGN09rAz8EL5KdLA==}
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [netbsd]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/openbsd-x64@0.17.17:
+    resolution: {integrity: sha512-PAXswI5+cQq3Pann7FNdcpSUrhrql3wKjj3gVkmuz6OHhqqYxKvi6GgRBoaHjaG22HV/ZZEgF9TlS+9ftHVigA==}
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [openbsd]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/sunos-x64@0.17.17:
+    resolution: {integrity: sha512-V63egsWKnx/4V0FMYkr9NXWrKTB5qFftKGKuZKFIrAkO/7EWLFnbBZNM1CvJ6Sis+XBdPws2YQSHF1Gqf1oj/Q==}
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [sunos]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/win32-arm64@0.17.17:
+    resolution: {integrity: sha512-YtUXLdVnd6YBSYlZODjWzH+KzbaubV0YVd6UxSfoFfa5PtNJNaW+1i+Hcmjpg2nEe0YXUCNF5bkKy1NnBv1y7Q==}
+    engines: {node: '>=12'}
+    cpu: [arm64]
+    os: [win32]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/win32-ia32@0.17.17:
+    resolution: {integrity: sha512-yczSLRbDdReCO74Yfc5tKG0izzm+lPMYyO1fFTcn0QNwnKmc3K+HdxZWLGKg4pZVte7XVgcFku7TIZNbWEJdeQ==}
+    engines: {node: '>=12'}
+    cpu: [ia32]
+    os: [win32]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /@esbuild/win32-x64@0.17.17:
+    resolution: {integrity: sha512-FNZw7H3aqhF9OyRQbDDnzUApDXfC1N6fgBhkqEO2jvYCJ+DxMTfZVqg3AX0R1khg1wHTBRD5SdcibSJ+XF6bFg==}
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [win32]
+    requiresBuild: true
+    dev: true
+    optional: true
+
   /@eslint-community/eslint-utils@4.4.0(eslint@8.38.0):
     resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==}
     engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
@@ -187,6 +417,23 @@ packages:
     engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
     dev: true
 
+  /@floating-ui/core@1.6.8:
+    resolution: {integrity: sha512-7XJ9cPU+yI2QeLS+FCSlqNFZJq8arvswefkZrYI1yQBbftw6FyrZOxYSh+9S7z7TpeWlRt9zJ5IhM1WIL334jA==}
+    dependencies:
+      '@floating-ui/utils': 0.2.8
+    dev: false
+
+  /@floating-ui/dom@1.6.12:
+    resolution: {integrity: sha512-NP83c0HjokcGVEMeoStg317VD9W7eDlGK7457dMBANbKA6GJZdc7rjujdgqzTaz93jkGgc5P/jeWbaCHnMNc+w==}
+    dependencies:
+      '@floating-ui/core': 1.6.8
+      '@floating-ui/utils': 0.2.8
+    dev: false
+
+  /@floating-ui/utils@0.2.8:
+    resolution: {integrity: sha512-kym7SodPp8/wloecOpcmSnWJsK7M0E5Wg8UcFA+uO4B9s5d0ywXOEro/8HM9x0rW+TljRzul/14UYz3TleT3ig==}
+    dev: false
+
   /@humanwhocodes/config-array@0.11.8:
     resolution: {integrity: sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==}
     engines: {node: '>=10.10.0'}
@@ -295,6 +542,10 @@ packages:
     resolution: {integrity: sha512-mxKSojEK6aCyZAjjvnPV4fywmHxsYzDi9jpyqh3F/ZCtVLT9G7nH78dj8fBlgcDo39jNXqto7+sfJ1Uo4TcuZw==}
     dev: false
 
+  /@sxzz/popperjs-es@2.11.7:
+    resolution: {integrity: sha512-Ccy0NlLkzr0Ex2FKvh2X+OyERHXJ88XJ1MXtsI9y9fGexlaXaVTPzBCRBwIxFkORuOb+uBqeu+RqnpgYTEZRUQ==}
+    dev: false
+
   /@trysound/sax@0.2.0:
     resolution: {integrity: sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==}
     engines: {node: '>=10.13.0'}
@@ -319,6 +570,16 @@ packages:
     resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==}
     dev: true
 
+  /@types/lodash-es@4.17.12:
+    resolution: {integrity: sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==}
+    dependencies:
+      '@types/lodash': 4.17.13
+    dev: false
+
+  /@types/lodash@4.17.13:
+    resolution: {integrity: sha512-lfx+dftrEZcdBPczf9d0Qv0x+j/rfNCMuC6OcfXmO8gkfeNAY88PgKUbvG56whcN23gc27yenwF6oJZXGFpYxg==}
+    dev: false
+
   /@types/mockjs@1.0.7:
     resolution: {integrity: sha512-OCxXz6hEaJOVpRwuJMiVY5a6LtJcih+br9gwB/Q8ooOBikvk5FpBQ31OlNimXo3EqKha1Z7PFBni+q9m+8NCWg==}
     dev: true
@@ -330,6 +591,10 @@ packages:
     resolution: {integrity: sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==}
     dev: true
 
+  /@types/web-bluetooth@0.0.16:
+    resolution: {integrity: sha512-oh8q2Zc32S6gd/j50GowEjKLoOVOwHP/bWVjKJInBwQqdOYMdPrf1oVlelTlyfFK3CKxL1uahMDAr+vy8T7yMQ==}
+    dev: false
+
   /@types/web-bluetooth@0.0.17:
     resolution: {integrity: sha512-4p9vcSmxAayx72yn70joFoL44c9MO/0+iVEBIQXe3v2h2SiAsEIo/G5v6ObFWvNKRFjbrVadNf9LqEEZeQPzdA==}
 
@@ -613,9 +878,25 @@ packages:
       - '@vue/composition-api'
       - vue
 
+  /@vueuse/core@9.13.0(vue@3.2.47):
+    resolution: {integrity: sha512-pujnclbeHWxxPRqXWmdkKV5OX4Wk4YeK7wusHqRwU0Q7EFusHoqNA/aPhB6KCh9hEqJkLAJo7bb0Lh9b+OIVzw==}
+    dependencies:
+      '@types/web-bluetooth': 0.0.16
+      '@vueuse/metadata': 9.13.0
+      '@vueuse/shared': 9.13.0(vue@3.2.47)
+      vue-demi: 0.14.0(vue@3.2.47)
+    transitivePeerDependencies:
+      - '@vue/composition-api'
+      - vue
+    dev: false
+
   /@vueuse/metadata@10.1.2:
     resolution: {integrity: sha512-3mc5BqN9aU2SqBeBuWE7ne4OtXHoHKggNgxZR2K+zIW4YLsy6xoZ4/9vErQs6tvoKDX6QAqm3lvsrv0mczAwIQ==}
 
+  /@vueuse/metadata@9.13.0:
+    resolution: {integrity: sha512-gdU7TKNAUVlXXLbaF+ZCfte8BjRJQWPCa2J55+7/h+yDtzw3vOoGQDRXzI6pyKyo6bXFT5/QoPE4hAknExjRLQ==}
+    dev: false
+
   /@vueuse/shared@10.1.2(vue@3.2.47):
     resolution: {integrity: sha512-1uoUTPBlgyscK9v6ScGeVYDDzlPSFXBlxuK7SfrDGyUTBiznb3mNceqhwvZHjtDRELZEN79V5uWPTF1VDV8svA==}
     dependencies:
@@ -624,6 +905,15 @@ packages:
       - '@vue/composition-api'
       - vue
 
+  /@vueuse/shared@9.13.0(vue@3.2.47):
+    resolution: {integrity: sha512-UrnhU+Cnufu4S6JLCPZnkWh0WwZGUp72ktOF2DFptMlOs3TOdVv8xJN53zhHGARmVOsz5KqOls09+J1NR6sBKw==}
+    dependencies:
+      vue-demi: 0.14.0(vue@3.2.47)
+    transitivePeerDependencies:
+      - '@vue/composition-api'
+      - vue
+    dev: false
+
   /acorn-jsx@5.3.2(acorn@8.8.2):
     resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==}
     peerDependencies:
@@ -714,6 +1004,10 @@ packages:
       es-shim-unscopables: 1.0.0
     dev: true
 
+  /async-validator@4.2.5:
+    resolution: {integrity: sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg==}
+    dev: false
+
   /asynckit@0.4.0:
     resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==}
     dev: false
@@ -843,7 +1137,7 @@ packages:
       normalize-path: 3.0.0
       readdirp: 3.6.0
     optionalDependencies:
-      fsevents: registry.npmmirror.com/fsevents@2.3.2
+      fsevents: 2.3.2
     dev: true
 
   /cliui@8.0.1:
@@ -969,6 +1263,10 @@ packages:
   /csstype@2.6.21:
     resolution: {integrity: sha512-Z1PhmomIfypOpoMjRQB70jfvy/wxT50qW08YXO5lMIJkrdq4yOTR+AW7FqutScmB9NkLwxo+jU+kZLbofZZq/w==}
 
+  /dayjs@1.11.13:
+    resolution: {integrity: sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==}
+    dev: false
+
   /de-indent@1.0.2:
     resolution: {integrity: sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==}
     dev: true
@@ -1085,6 +1383,31 @@ packages:
     resolution: {integrity: sha512-jlBzY4tFcJaiUjzhRTCWAqRvTO/fWzjA3Bls0mykzGZ7zvcMP7h05W6UcgzfT9Ca1SW2xyKDOFRyI0pQeRNZGw==}
     dev: true
 
+  /element-plus@2.9.1(vue@3.2.47):
+    resolution: {integrity: sha512-9Agqf/jt4Ugk7EZ6C5LME71sgkvauPCsnvJN12Xid2XVobjufxMGpRE4L7pS4luJMOmFAH3J0NgYEGZT5r+NDg==}
+    peerDependencies:
+      vue: ^3.2.0
+    dependencies:
+      '@ctrl/tinycolor': 3.6.1
+      '@element-plus/icons-vue': 2.3.1(vue@3.2.47)
+      '@floating-ui/dom': 1.6.12
+      '@popperjs/core': /@sxzz/popperjs-es@2.11.7
+      '@types/lodash': 4.17.13
+      '@types/lodash-es': 4.17.12
+      '@vueuse/core': 9.13.0(vue@3.2.47)
+      async-validator: 4.2.5
+      dayjs: 1.11.13
+      escape-html: 1.0.3
+      lodash: 4.17.21
+      lodash-es: 4.17.21
+      lodash-unified: 1.0.3(@types/lodash-es@4.17.12)(lodash-es@4.17.21)(lodash@4.17.21)
+      memoize-one: 6.0.0
+      normalize-wheel-es: 1.2.0
+      vue: 3.2.47
+    transitivePeerDependencies:
+      - '@vue/composition-api'
+    dev: false
+
   /emoji-regex@8.0.0:
     resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==}
     dev: true
@@ -1163,80 +1486,259 @@ packages:
       is-symbol: 1.0.4
     dev: true
 
-  /esbuild@0.14.54:
-    resolution: {integrity: sha512-Cy9llcy8DvET5uznocPyqL3BFRrFXSVqbgpMJ9Wz8oVjZlh/zUSNbPRbov0VX7VxN2JH1Oa0uNxZ7eLRb62pJA==}
+  /esbuild-android-64@0.14.54:
+    resolution: {integrity: sha512-Tz2++Aqqz0rJ7kYBfz+iqyE3QMycD4vk7LBRyWaAVFgFtQ/O8EJOnVmTOiDWYZ/uYzB4kvP+bqejYdVKzE5lAQ==}
     engines: {node: '>=12'}
-    hasBin: true
+    cpu: [x64]
+    os: [android]
     requiresBuild: true
-    optionalDependencies:
-      '@esbuild/linux-loong64': registry.npmmirror.com/@esbuild/linux-loong64@0.14.54
-      esbuild-android-64: registry.npmmirror.com/esbuild-android-64@0.14.54
-      esbuild-android-arm64: registry.npmmirror.com/esbuild-android-arm64@0.14.54
-      esbuild-darwin-64: registry.npmmirror.com/esbuild-darwin-64@0.14.54
-      esbuild-darwin-arm64: registry.npmmirror.com/esbuild-darwin-arm64@0.14.54
-      esbuild-freebsd-64: registry.npmmirror.com/esbuild-freebsd-64@0.14.54
-      esbuild-freebsd-arm64: registry.npmmirror.com/esbuild-freebsd-arm64@0.14.54
-      esbuild-linux-32: registry.npmmirror.com/esbuild-linux-32@0.14.54
-      esbuild-linux-64: registry.npmmirror.com/esbuild-linux-64@0.14.54
-      esbuild-linux-arm: registry.npmmirror.com/esbuild-linux-arm@0.14.54
-      esbuild-linux-arm64: registry.npmmirror.com/esbuild-linux-arm64@0.14.54
-      esbuild-linux-mips64le: registry.npmmirror.com/esbuild-linux-mips64le@0.14.54
-      esbuild-linux-ppc64le: registry.npmmirror.com/esbuild-linux-ppc64le@0.14.54
-      esbuild-linux-riscv64: registry.npmmirror.com/esbuild-linux-riscv64@0.14.54
-      esbuild-linux-s390x: registry.npmmirror.com/esbuild-linux-s390x@0.14.54
-      esbuild-netbsd-64: registry.npmmirror.com/esbuild-netbsd-64@0.14.54
-      esbuild-openbsd-64: registry.npmmirror.com/esbuild-openbsd-64@0.14.54
-      esbuild-sunos-64: registry.npmmirror.com/esbuild-sunos-64@0.14.54
-      esbuild-windows-32: registry.npmmirror.com/esbuild-windows-32@0.14.54
-      esbuild-windows-64: registry.npmmirror.com/esbuild-windows-64@0.14.54
-      esbuild-windows-arm64: registry.npmmirror.com/esbuild-windows-arm64@0.14.54
     dev: true
+    optional: true
 
-  /esbuild@0.17.17:
-    resolution: {integrity: sha512-/jUywtAymR8jR4qsa2RujlAF7Krpt5VWi72Q2yuLD4e/hvtNcFQ0I1j8m/bxq238pf3/0KO5yuXNpuLx8BE1KA==}
+  /esbuild-android-arm64@0.14.54:
+    resolution: {integrity: sha512-F9E+/QDi9sSkLaClO8SOV6etqPd+5DgJje1F9lOWoNncDdOBL2YF59IhsWATSt0TLZbYCf3pNlTHvVV5VfHdvg==}
     engines: {node: '>=12'}
-    hasBin: true
+    cpu: [arm64]
+    os: [android]
     requiresBuild: true
-    optionalDependencies:
-      '@esbuild/android-arm': registry.npmmirror.com/@esbuild/android-arm@0.17.17
-      '@esbuild/android-arm64': registry.npmmirror.com/@esbuild/android-arm64@0.17.17
-      '@esbuild/android-x64': registry.npmmirror.com/@esbuild/android-x64@0.17.17
-      '@esbuild/darwin-arm64': registry.npmmirror.com/@esbuild/darwin-arm64@0.17.17
-      '@esbuild/darwin-x64': registry.npmmirror.com/@esbuild/darwin-x64@0.17.17
-      '@esbuild/freebsd-arm64': registry.npmmirror.com/@esbuild/freebsd-arm64@0.17.17
-      '@esbuild/freebsd-x64': registry.npmmirror.com/@esbuild/freebsd-x64@0.17.17
-      '@esbuild/linux-arm': registry.npmmirror.com/@esbuild/linux-arm@0.17.17
-      '@esbuild/linux-arm64': registry.npmmirror.com/@esbuild/linux-arm64@0.17.17
-      '@esbuild/linux-ia32': registry.npmmirror.com/@esbuild/linux-ia32@0.17.17
-      '@esbuild/linux-loong64': registry.npmmirror.com/@esbuild/linux-loong64@0.17.17
-      '@esbuild/linux-mips64el': registry.npmmirror.com/@esbuild/linux-mips64el@0.17.17
-      '@esbuild/linux-ppc64': registry.npmmirror.com/@esbuild/linux-ppc64@0.17.17
-      '@esbuild/linux-riscv64': registry.npmmirror.com/@esbuild/linux-riscv64@0.17.17
-      '@esbuild/linux-s390x': registry.npmmirror.com/@esbuild/linux-s390x@0.17.17
-      '@esbuild/linux-x64': registry.npmmirror.com/@esbuild/linux-x64@0.17.17
-      '@esbuild/netbsd-x64': registry.npmmirror.com/@esbuild/netbsd-x64@0.17.17
-      '@esbuild/openbsd-x64': registry.npmmirror.com/@esbuild/openbsd-x64@0.17.17
-      '@esbuild/sunos-x64': registry.npmmirror.com/@esbuild/sunos-x64@0.17.17
-      '@esbuild/win32-arm64': registry.npmmirror.com/@esbuild/win32-arm64@0.17.17
-      '@esbuild/win32-ia32': registry.npmmirror.com/@esbuild/win32-ia32@0.17.17
-      '@esbuild/win32-x64': registry.npmmirror.com/@esbuild/win32-x64@0.17.17
     dev: true
+    optional: true
 
-  /escalade@3.1.1:
-    resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==}
-    engines: {node: '>=6'}
+  /esbuild-darwin-64@0.14.54:
+    resolution: {integrity: sha512-jtdKWV3nBviOd5v4hOpkVmpxsBy90CGzebpbO9beiqUYVMBtSc0AL9zGftFuBon7PNDcdvNCEuQqw2x0wP9yug==}
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [darwin]
+    requiresBuild: true
     dev: true
+    optional: true
 
-  /escape-html@1.0.3:
-    resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==}
+  /esbuild-darwin-arm64@0.14.54:
+    resolution: {integrity: sha512-OPafJHD2oUPyvJMrsCvDGkRrVCar5aVyHfWGQzY1dWnzErjrDuSETxwA2HSsyg2jORLY8yBfzc1MIpUkXlctmw==}
+    engines: {node: '>=12'}
+    cpu: [arm64]
+    os: [darwin]
+    requiresBuild: true
     dev: true
+    optional: true
 
-  /escape-string-regexp@4.0.0:
-    resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==}
-    engines: {node: '>=10'}
+  /esbuild-freebsd-64@0.14.54:
+    resolution: {integrity: sha512-OKwd4gmwHqOTp4mOGZKe/XUlbDJ4Q9TjX0hMPIDBUWWu/kwhBAudJdBoxnjNf9ocIB6GN6CPowYpR/hRCbSYAg==}
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [freebsd]
+    requiresBuild: true
     dev: true
+    optional: true
 
-  /escape-string-regexp@5.0.0:
+  /esbuild-freebsd-arm64@0.14.54:
+    resolution: {integrity: sha512-sFwueGr7OvIFiQT6WeG0jRLjkjdqWWSrfbVwZp8iMP+8UHEHRBvlaxL6IuKNDwAozNUmbb8nIMXa7oAOARGs1Q==}
+    engines: {node: '>=12'}
+    cpu: [arm64]
+    os: [freebsd]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /esbuild-linux-32@0.14.54:
+    resolution: {integrity: sha512-1ZuY+JDI//WmklKlBgJnglpUL1owm2OX+8E1syCD6UAxcMM/XoWd76OHSjl/0MR0LisSAXDqgjT3uJqT67O3qw==}
+    engines: {node: '>=12'}
+    cpu: [ia32]
+    os: [linux]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /esbuild-linux-64@0.14.54:
+    resolution: {integrity: sha512-EgjAgH5HwTbtNsTqQOXWApBaPVdDn7XcK+/PtJwZLT1UmpLoznPd8c5CxqsH2dQK3j05YsB3L17T8vE7cp4cCg==}
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [linux]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /esbuild-linux-arm64@0.14.54:
+    resolution: {integrity: sha512-WL71L+0Rwv+Gv/HTmxTEmpv0UgmxYa5ftZILVi2QmZBgX3q7+tDeOQNqGtdXSdsL8TQi1vIaVFHUPDe0O0kdig==}
+    engines: {node: '>=12'}
+    cpu: [arm64]
+    os: [linux]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /esbuild-linux-arm@0.14.54:
+    resolution: {integrity: sha512-qqz/SjemQhVMTnvcLGoLOdFpCYbz4v4fUo+TfsWG+1aOu70/80RV6bgNpR2JCrppV2moUQkww+6bWxXRL9YMGw==}
+    engines: {node: '>=12'}
+    cpu: [arm]
+    os: [linux]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /esbuild-linux-mips64le@0.14.54:
+    resolution: {integrity: sha512-qTHGQB8D1etd0u1+sB6p0ikLKRVuCWhYQhAHRPkO+OF3I/iSlTKNNS0Lh2Oc0g0UFGguaFZZiPJdJey3AGpAlw==}
+    engines: {node: '>=12'}
+    cpu: [mips64el]
+    os: [linux]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /esbuild-linux-ppc64le@0.14.54:
+    resolution: {integrity: sha512-j3OMlzHiqwZBDPRCDFKcx595XVfOfOnv68Ax3U4UKZ3MTYQB5Yz3X1mn5GnodEVYzhtZgxEBidLWeIs8FDSfrQ==}
+    engines: {node: '>=12'}
+    cpu: [ppc64]
+    os: [linux]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /esbuild-linux-riscv64@0.14.54:
+    resolution: {integrity: sha512-y7Vt7Wl9dkOGZjxQZnDAqqn+XOqFD7IMWiewY5SPlNlzMX39ocPQlOaoxvT4FllA5viyV26/QzHtvTjVNOxHZg==}
+    engines: {node: '>=12'}
+    cpu: [riscv64]
+    os: [linux]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /esbuild-linux-s390x@0.14.54:
+    resolution: {integrity: sha512-zaHpW9dziAsi7lRcyV4r8dhfG1qBidQWUXweUjnw+lliChJqQr+6XD71K41oEIC3Mx1KStovEmlzm+MkGZHnHA==}
+    engines: {node: '>=12'}
+    cpu: [s390x]
+    os: [linux]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /esbuild-netbsd-64@0.14.54:
+    resolution: {integrity: sha512-PR01lmIMnfJTgeU9VJTDY9ZerDWVFIUzAtJuDHwwceppW7cQWjBBqP48NdeRtoP04/AtO9a7w3viI+PIDr6d+w==}
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [netbsd]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /esbuild-openbsd-64@0.14.54:
+    resolution: {integrity: sha512-Qyk7ikT2o7Wu76UsvvDS5q0amJvmRzDyVlL0qf5VLsLchjCa1+IAvd8kTBgUxD7VBUUVgItLkk609ZHUc1oCaw==}
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [openbsd]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /esbuild-sunos-64@0.14.54:
+    resolution: {integrity: sha512-28GZ24KmMSeKi5ueWzMcco6EBHStL3B6ubM7M51RmPwXQGLe0teBGJocmWhgwccA1GeFXqxzILIxXpHbl9Q/Kw==}
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [sunos]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /esbuild-windows-32@0.14.54:
+    resolution: {integrity: sha512-T+rdZW19ql9MjS7pixmZYVObd9G7kcaZo+sETqNH4RCkuuYSuv9AGHUVnPoP9hhuE1WM1ZimHz1CIBHBboLU7w==}
+    engines: {node: '>=12'}
+    cpu: [ia32]
+    os: [win32]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /esbuild-windows-64@0.14.54:
+    resolution: {integrity: sha512-AoHTRBUuYwXtZhjXZbA1pGfTo8cJo3vZIcWGLiUcTNgHpJJMC1rVA44ZereBHMJtotyN71S8Qw0npiCIkW96cQ==}
+    engines: {node: '>=12'}
+    cpu: [x64]
+    os: [win32]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /esbuild-windows-arm64@0.14.54:
+    resolution: {integrity: sha512-M0kuUvXhot1zOISQGXwWn6YtS+Y/1RT9WrVIOywZnJHo3jCDyewAc79aKNQWFCQm+xNHVTq9h8dZKvygoXQQRg==}
+    engines: {node: '>=12'}
+    cpu: [arm64]
+    os: [win32]
+    requiresBuild: true
+    dev: true
+    optional: true
+
+  /esbuild@0.14.54:
+    resolution: {integrity: sha512-Cy9llcy8DvET5uznocPyqL3BFRrFXSVqbgpMJ9Wz8oVjZlh/zUSNbPRbov0VX7VxN2JH1Oa0uNxZ7eLRb62pJA==}
+    engines: {node: '>=12'}
+    hasBin: true
+    requiresBuild: true
+    optionalDependencies:
+      '@esbuild/linux-loong64': 0.14.54
+      esbuild-android-64: 0.14.54
+      esbuild-android-arm64: 0.14.54
+      esbuild-darwin-64: 0.14.54
+      esbuild-darwin-arm64: 0.14.54
+      esbuild-freebsd-64: 0.14.54
+      esbuild-freebsd-arm64: 0.14.54
+      esbuild-linux-32: 0.14.54
+      esbuild-linux-64: 0.14.54
+      esbuild-linux-arm: 0.14.54
+      esbuild-linux-arm64: 0.14.54
+      esbuild-linux-mips64le: 0.14.54
+      esbuild-linux-ppc64le: 0.14.54
+      esbuild-linux-riscv64: 0.14.54
+      esbuild-linux-s390x: 0.14.54
+      esbuild-netbsd-64: 0.14.54
+      esbuild-openbsd-64: 0.14.54
+      esbuild-sunos-64: 0.14.54
+      esbuild-windows-32: 0.14.54
+      esbuild-windows-64: 0.14.54
+      esbuild-windows-arm64: 0.14.54
+    dev: true
+
+  /esbuild@0.17.17:
+    resolution: {integrity: sha512-/jUywtAymR8jR4qsa2RujlAF7Krpt5VWi72Q2yuLD4e/hvtNcFQ0I1j8m/bxq238pf3/0KO5yuXNpuLx8BE1KA==}
+    engines: {node: '>=12'}
+    hasBin: true
+    requiresBuild: true
+    optionalDependencies:
+      '@esbuild/android-arm': 0.17.17
+      '@esbuild/android-arm64': 0.17.17
+      '@esbuild/android-x64': 0.17.17
+      '@esbuild/darwin-arm64': 0.17.17
+      '@esbuild/darwin-x64': 0.17.17
+      '@esbuild/freebsd-arm64': 0.17.17
+      '@esbuild/freebsd-x64': 0.17.17
+      '@esbuild/linux-arm': 0.17.17
+      '@esbuild/linux-arm64': 0.17.17
+      '@esbuild/linux-ia32': 0.17.17
+      '@esbuild/linux-loong64': 0.17.17
+      '@esbuild/linux-mips64el': 0.17.17
+      '@esbuild/linux-ppc64': 0.17.17
+      '@esbuild/linux-riscv64': 0.17.17
+      '@esbuild/linux-s390x': 0.17.17
+      '@esbuild/linux-x64': 0.17.17
+      '@esbuild/netbsd-x64': 0.17.17
+      '@esbuild/openbsd-x64': 0.17.17
+      '@esbuild/sunos-x64': 0.17.17
+      '@esbuild/win32-arm64': 0.17.17
+      '@esbuild/win32-ia32': 0.17.17
+      '@esbuild/win32-x64': 0.17.17
+    dev: true
+
+  /escalade@3.1.1:
+    resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==}
+    engines: {node: '>=6'}
+    dev: true
+
+  /escape-html@1.0.3:
+    resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==}
+
+  /escape-string-regexp@4.0.0:
+    resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==}
+    engines: {node: '>=10'}
+    dev: true
+
+  /escape-string-regexp@5.0.0:
     resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==}
     engines: {node: '>=12'}
     dev: true
@@ -1683,6 +2185,14 @@ packages:
     resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==}
     dev: true
 
+  /fsevents@2.3.2:
+    resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==}
+    engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
+    os: [darwin]
+    requiresBuild: true
+    dev: true
+    optional: true
+
   /function-bind@1.1.1:
     resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==}
     dev: true
@@ -2083,13 +2593,28 @@ packages:
       p-locate: 5.0.0
     dev: true
 
+  /lodash-es@4.17.21:
+    resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==}
+    dev: false
+
+  /lodash-unified@1.0.3(@types/lodash-es@4.17.12)(lodash-es@4.17.21)(lodash@4.17.21):
+    resolution: {integrity: sha512-WK9qSozxXOD7ZJQlpSqOT+om2ZfcT4yO+03FuzAHD0wF6S0l0090LRPDx3vhTTLZ8cFKpBn+IOcVXK6qOcIlfQ==}
+    peerDependencies:
+      '@types/lodash-es': '*'
+      lodash: '*'
+      lodash-es: '*'
+    dependencies:
+      '@types/lodash-es': 4.17.12
+      lodash: 4.17.21
+      lodash-es: 4.17.21
+    dev: false
+
   /lodash.merge@4.6.2:
     resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==}
     dev: true
 
   /lodash@4.17.21:
     resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==}
-    dev: true
 
   /lru-cache@6.0.0:
     resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==}
@@ -2118,6 +2643,10 @@ packages:
     resolution: {integrity: sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==}
     dev: false
 
+  /memoize-one@6.0.0:
+    resolution: {integrity: sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==}
+    dev: false
+
   /merge2@1.4.1:
     resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==}
     engines: {node: '>= 8'}
@@ -2229,6 +2758,14 @@ packages:
     engines: {node: '>=0.10.0'}
     dev: true
 
+  /normalize-wheel-es@1.2.0:
+    resolution: {integrity: sha512-Wj7+EJQ8mSuXr2iWfnujrimU35R2W4FAErEyTmJoJ7ucwTn2hOUSsRehMb5RSYkxXGTM7Y9QpvPmp++w5ftoJw==}
+    dev: false
+
+  /normalize.css@8.0.1:
+    resolution: {integrity: sha512-qizSNPO93t1YUuUhP22btGOo3chcvDFqFaj2TRybP0DMxkHOCTYwp3n34fel4a31ORXy4m1Xq0Gyqpb5m33qIg==}
+    dev: false
+
   /nth-check@2.1.1:
     resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==}
     dependencies:
@@ -2536,7 +3073,7 @@ packages:
     engines: {node: '>=10.0.0'}
     hasBin: true
     optionalDependencies:
-      fsevents: registry.npmmirror.com/fsevents@2.3.2
+      fsevents: 2.3.2
     dev: true
 
   /rollup@3.21.4:
@@ -2544,7 +3081,7 @@ packages:
     engines: {node: '>=14.18.0', npm: '>=8.0.0'}
     hasBin: true
     optionalDependencies:
-      fsevents: registry.npmmirror.com/fsevents@2.3.2
+      fsevents: 2.3.2
     dev: true
 
   /run-parallel@1.2.0:
@@ -3023,7 +3560,7 @@ packages:
       sass: 1.62.0
       terser: 5.17.1
     optionalDependencies:
-      fsevents: registry.npmmirror.com/fsevents@2.3.2
+      fsevents: 2.3.2
     dev: true
 
   /vue-demi@0.14.0(vue@3.2.47):
@@ -3187,486 +3724,3 @@ packages:
     resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==}
     engines: {node: '>=10'}
     dev: true
-
-  registry.npmmirror.com/@esbuild/android-arm64@0.17.17:
-    resolution: {integrity: sha512-jaJ5IlmaDLFPNttv0ofcwy/cfeY4bh/n705Tgh+eLObbGtQBK3EPAu+CzL95JVE4nFAliyrnEu0d32Q5foavqg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@esbuild/android-arm64/-/android-arm64-0.17.17.tgz}
-    name: '@esbuild/android-arm64'
-    version: 0.17.17
-    engines: {node: '>=12'}
-    cpu: [arm64]
-    os: [android]
-    requiresBuild: true
-    dev: true
-    optional: true
-
-  registry.npmmirror.com/@esbuild/android-arm@0.17.17:
-    resolution: {integrity: sha512-E6VAZwN7diCa3labs0GYvhEPL2M94WLF8A+czO8hfjREXxba8Ng7nM5VxV+9ihNXIY1iQO1XxUU4P7hbqbICxg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@esbuild/android-arm/-/android-arm-0.17.17.tgz}
-    name: '@esbuild/android-arm'
-    version: 0.17.17
-    engines: {node: '>=12'}
-    cpu: [arm]
-    os: [android]
-    requiresBuild: true
-    dev: true
-    optional: true
-
-  registry.npmmirror.com/@esbuild/android-x64@0.17.17:
-    resolution: {integrity: sha512-446zpfJ3nioMC7ASvJB1pszHVskkw4u/9Eu8s5yvvsSDTzYh4p4ZIRj0DznSl3FBF0Z/mZfrKXTtt0QCoFmoHA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@esbuild/android-x64/-/android-x64-0.17.17.tgz}
-    name: '@esbuild/android-x64'
-    version: 0.17.17
-    engines: {node: '>=12'}
-    cpu: [x64]
-    os: [android]
-    requiresBuild: true
-    dev: true
-    optional: true
-
-  registry.npmmirror.com/@esbuild/darwin-arm64@0.17.17:
-    resolution: {integrity: sha512-m/gwyiBwH3jqfUabtq3GH31otL/0sE0l34XKpSIqR7NjQ/XHQ3lpmQHLHbG8AHTGCw8Ao059GvV08MS0bhFIJQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@esbuild/darwin-arm64/-/darwin-arm64-0.17.17.tgz}
-    name: '@esbuild/darwin-arm64'
-    version: 0.17.17
-    engines: {node: '>=12'}
-    cpu: [arm64]
-    os: [darwin]
-    requiresBuild: true
-    dev: true
-    optional: true
-
-  registry.npmmirror.com/@esbuild/darwin-x64@0.17.17:
-    resolution: {integrity: sha512-4utIrsX9IykrqYaXR8ob9Ha2hAY2qLc6ohJ8c0CN1DR8yWeMrTgYFjgdeQ9LIoTOfLetXjuCu5TRPHT9yKYJVg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@esbuild/darwin-x64/-/darwin-x64-0.17.17.tgz}
-    name: '@esbuild/darwin-x64'
-    version: 0.17.17
-    engines: {node: '>=12'}
-    cpu: [x64]
-    os: [darwin]
-    requiresBuild: true
-    dev: true
-    optional: true
-
-  registry.npmmirror.com/@esbuild/freebsd-arm64@0.17.17:
-    resolution: {integrity: sha512-4PxjQII/9ppOrpEwzQ1b0pXCsFLqy77i0GaHodrmzH9zq2/NEhHMAMJkJ635Ns4fyJPFOlHMz4AsklIyRqFZWA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.17.tgz}
-    name: '@esbuild/freebsd-arm64'
-    version: 0.17.17
-    engines: {node: '>=12'}
-    cpu: [arm64]
-    os: [freebsd]
-    requiresBuild: true
-    dev: true
-    optional: true
-
-  registry.npmmirror.com/@esbuild/freebsd-x64@0.17.17:
-    resolution: {integrity: sha512-lQRS+4sW5S3P1sv0z2Ym807qMDfkmdhUYX30GRBURtLTrJOPDpoU0kI6pVz1hz3U0+YQ0tXGS9YWveQjUewAJw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@esbuild/freebsd-x64/-/freebsd-x64-0.17.17.tgz}
-    name: '@esbuild/freebsd-x64'
-    version: 0.17.17
-    engines: {node: '>=12'}
-    cpu: [x64]
-    os: [freebsd]
-    requiresBuild: true
-    dev: true
-    optional: true
-
-  registry.npmmirror.com/@esbuild/linux-arm64@0.17.17:
-    resolution: {integrity: sha512-2+pwLx0whKY1/Vqt8lyzStyda1v0qjJ5INWIe+d8+1onqQxHLLi3yr5bAa4gvbzhZqBztifYEu8hh1La5+7sUw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@esbuild/linux-arm64/-/linux-arm64-0.17.17.tgz}
-    name: '@esbuild/linux-arm64'
-    version: 0.17.17
-    engines: {node: '>=12'}
-    cpu: [arm64]
-    os: [linux]
-    requiresBuild: true
-    dev: true
-    optional: true
-
-  registry.npmmirror.com/@esbuild/linux-arm@0.17.17:
-    resolution: {integrity: sha512-biDs7bjGdOdcmIk6xU426VgdRUpGg39Yz6sT9Xp23aq+IEHDb/u5cbmu/pAANpDB4rZpY/2USPhCA+w9t3roQg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@esbuild/linux-arm/-/linux-arm-0.17.17.tgz}
-    name: '@esbuild/linux-arm'
-    version: 0.17.17
-    engines: {node: '>=12'}
-    cpu: [arm]
-    os: [linux]
-    requiresBuild: true
-    dev: true
-    optional: true
-
-  registry.npmmirror.com/@esbuild/linux-ia32@0.17.17:
-    resolution: {integrity: sha512-IBTTv8X60dYo6P2t23sSUYym8fGfMAiuv7PzJ+0LcdAndZRzvke+wTVxJeCq4WgjppkOpndL04gMZIFvwoU34Q==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@esbuild/linux-ia32/-/linux-ia32-0.17.17.tgz}
-    name: '@esbuild/linux-ia32'
-    version: 0.17.17
-    engines: {node: '>=12'}
-    cpu: [ia32]
-    os: [linux]
-    requiresBuild: true
-    dev: true
-    optional: true
-
-  registry.npmmirror.com/@esbuild/linux-loong64@0.14.54:
-    resolution: {integrity: sha512-bZBrLAIX1kpWelV0XemxBZllyRmM6vgFQQG2GdNb+r3Fkp0FOh1NJSvekXDs7jq70k4euu1cryLMfU+mTXlEpw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@esbuild/linux-loong64/-/linux-loong64-0.14.54.tgz}
-    name: '@esbuild/linux-loong64'
-    version: 0.14.54
-    engines: {node: '>=12'}
-    cpu: [loong64]
-    os: [linux]
-    requiresBuild: true
-    dev: true
-    optional: true
-
-  registry.npmmirror.com/@esbuild/linux-loong64@0.17.17:
-    resolution: {integrity: sha512-WVMBtcDpATjaGfWfp6u9dANIqmU9r37SY8wgAivuKmgKHE+bWSuv0qXEFt/p3qXQYxJIGXQQv6hHcm7iWhWjiw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@esbuild/linux-loong64/-/linux-loong64-0.17.17.tgz}
-    name: '@esbuild/linux-loong64'
-    version: 0.17.17
-    engines: {node: '>=12'}
-    cpu: [loong64]
-    os: [linux]
-    requiresBuild: true
-    dev: true
-    optional: true
-
-  registry.npmmirror.com/@esbuild/linux-mips64el@0.17.17:
-    resolution: {integrity: sha512-2kYCGh8589ZYnY031FgMLy0kmE4VoGdvfJkxLdxP4HJvWNXpyLhjOvxVsYjYZ6awqY4bgLR9tpdYyStgZZhi2A==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@esbuild/linux-mips64el/-/linux-mips64el-0.17.17.tgz}
-    name: '@esbuild/linux-mips64el'
-    version: 0.17.17
-    engines: {node: '>=12'}
-    cpu: [mips64el]
-    os: [linux]
-    requiresBuild: true
-    dev: true
-    optional: true
-
-  registry.npmmirror.com/@esbuild/linux-ppc64@0.17.17:
-    resolution: {integrity: sha512-KIdG5jdAEeAKogfyMTcszRxy3OPbZhq0PPsW4iKKcdlbk3YE4miKznxV2YOSmiK/hfOZ+lqHri3v8eecT2ATwQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@esbuild/linux-ppc64/-/linux-ppc64-0.17.17.tgz}
-    name: '@esbuild/linux-ppc64'
-    version: 0.17.17
-    engines: {node: '>=12'}
-    cpu: [ppc64]
-    os: [linux]
-    requiresBuild: true
-    dev: true
-    optional: true
-
-  registry.npmmirror.com/@esbuild/linux-riscv64@0.17.17:
-    resolution: {integrity: sha512-Cj6uWLBR5LWhcD/2Lkfg2NrkVsNb2sFM5aVEfumKB2vYetkA/9Uyc1jVoxLZ0a38sUhFk4JOVKH0aVdPbjZQeA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@esbuild/linux-riscv64/-/linux-riscv64-0.17.17.tgz}
-    name: '@esbuild/linux-riscv64'
-    version: 0.17.17
-    engines: {node: '>=12'}
-    cpu: [riscv64]
-    os: [linux]
-    requiresBuild: true
-    dev: true
-    optional: true
-
-  registry.npmmirror.com/@esbuild/linux-s390x@0.17.17:
-    resolution: {integrity: sha512-lK+SffWIr0XsFf7E0srBjhpkdFVJf3HEgXCwzkm69kNbRar8MhezFpkIwpk0qo2IOQL4JE4mJPJI8AbRPLbuOQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@esbuild/linux-s390x/-/linux-s390x-0.17.17.tgz}
-    name: '@esbuild/linux-s390x'
-    version: 0.17.17
-    engines: {node: '>=12'}
-    cpu: [s390x]
-    os: [linux]
-    requiresBuild: true
-    dev: true
-    optional: true
-
-  registry.npmmirror.com/@esbuild/linux-x64@0.17.17:
-    resolution: {integrity: sha512-XcSGTQcWFQS2jx3lZtQi7cQmDYLrpLRyz1Ns1DzZCtn898cWfm5Icx/DEWNcTU+T+tyPV89RQtDnI7qL2PObPg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@esbuild/linux-x64/-/linux-x64-0.17.17.tgz}
-    name: '@esbuild/linux-x64'
-    version: 0.17.17
-    engines: {node: '>=12'}
-    cpu: [x64]
-    os: [linux]
-    requiresBuild: true
-    dev: true
-    optional: true
-
-  registry.npmmirror.com/@esbuild/netbsd-x64@0.17.17:
-    resolution: {integrity: sha512-RNLCDmLP5kCWAJR+ItLM3cHxzXRTe4N00TQyQiimq+lyqVqZWGPAvcyfUBM0isE79eEZhIuGN09rAz8EL5KdLA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@esbuild/netbsd-x64/-/netbsd-x64-0.17.17.tgz}
-    name: '@esbuild/netbsd-x64'
-    version: 0.17.17
-    engines: {node: '>=12'}
-    cpu: [x64]
-    os: [netbsd]
-    requiresBuild: true
-    dev: true
-    optional: true
-
-  registry.npmmirror.com/@esbuild/openbsd-x64@0.17.17:
-    resolution: {integrity: sha512-PAXswI5+cQq3Pann7FNdcpSUrhrql3wKjj3gVkmuz6OHhqqYxKvi6GgRBoaHjaG22HV/ZZEgF9TlS+9ftHVigA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@esbuild/openbsd-x64/-/openbsd-x64-0.17.17.tgz}
-    name: '@esbuild/openbsd-x64'
-    version: 0.17.17
-    engines: {node: '>=12'}
-    cpu: [x64]
-    os: [openbsd]
-    requiresBuild: true
-    dev: true
-    optional: true
-
-  registry.npmmirror.com/@esbuild/sunos-x64@0.17.17:
-    resolution: {integrity: sha512-V63egsWKnx/4V0FMYkr9NXWrKTB5qFftKGKuZKFIrAkO/7EWLFnbBZNM1CvJ6Sis+XBdPws2YQSHF1Gqf1oj/Q==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@esbuild/sunos-x64/-/sunos-x64-0.17.17.tgz}
-    name: '@esbuild/sunos-x64'
-    version: 0.17.17
-    engines: {node: '>=12'}
-    cpu: [x64]
-    os: [sunos]
-    requiresBuild: true
-    dev: true
-    optional: true
-
-  registry.npmmirror.com/@esbuild/win32-arm64@0.17.17:
-    resolution: {integrity: sha512-YtUXLdVnd6YBSYlZODjWzH+KzbaubV0YVd6UxSfoFfa5PtNJNaW+1i+Hcmjpg2nEe0YXUCNF5bkKy1NnBv1y7Q==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@esbuild/win32-arm64/-/win32-arm64-0.17.17.tgz}
-    name: '@esbuild/win32-arm64'
-    version: 0.17.17
-    engines: {node: '>=12'}
-    cpu: [arm64]
-    os: [win32]
-    requiresBuild: true
-    dev: true
-    optional: true
-
-  registry.npmmirror.com/@esbuild/win32-ia32@0.17.17:
-    resolution: {integrity: sha512-yczSLRbDdReCO74Yfc5tKG0izzm+lPMYyO1fFTcn0QNwnKmc3K+HdxZWLGKg4pZVte7XVgcFku7TIZNbWEJdeQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@esbuild/win32-ia32/-/win32-ia32-0.17.17.tgz}
-    name: '@esbuild/win32-ia32'
-    version: 0.17.17
-    engines: {node: '>=12'}
-    cpu: [ia32]
-    os: [win32]
-    requiresBuild: true
-    dev: true
-    optional: true
-
-  registry.npmmirror.com/@esbuild/win32-x64@0.17.17:
-    resolution: {integrity: sha512-FNZw7H3aqhF9OyRQbDDnzUApDXfC1N6fgBhkqEO2jvYCJ+DxMTfZVqg3AX0R1khg1wHTBRD5SdcibSJ+XF6bFg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/@esbuild/win32-x64/-/win32-x64-0.17.17.tgz}
-    name: '@esbuild/win32-x64'
-    version: 0.17.17
-    engines: {node: '>=12'}
-    cpu: [x64]
-    os: [win32]
-    requiresBuild: true
-    dev: true
-    optional: true
-
-  registry.npmmirror.com/esbuild-android-64@0.14.54:
-    resolution: {integrity: sha512-Tz2++Aqqz0rJ7kYBfz+iqyE3QMycD4vk7LBRyWaAVFgFtQ/O8EJOnVmTOiDWYZ/uYzB4kvP+bqejYdVKzE5lAQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/esbuild-android-64/-/esbuild-android-64-0.14.54.tgz}
-    name: esbuild-android-64
-    version: 0.14.54
-    engines: {node: '>=12'}
-    cpu: [x64]
-    os: [android]
-    requiresBuild: true
-    dev: true
-    optional: true
-
-  registry.npmmirror.com/esbuild-android-arm64@0.14.54:
-    resolution: {integrity: sha512-F9E+/QDi9sSkLaClO8SOV6etqPd+5DgJje1F9lOWoNncDdOBL2YF59IhsWATSt0TLZbYCf3pNlTHvVV5VfHdvg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/esbuild-android-arm64/-/esbuild-android-arm64-0.14.54.tgz}
-    name: esbuild-android-arm64
-    version: 0.14.54
-    engines: {node: '>=12'}
-    cpu: [arm64]
-    os: [android]
-    requiresBuild: true
-    dev: true
-    optional: true
-
-  registry.npmmirror.com/esbuild-darwin-64@0.14.54:
-    resolution: {integrity: sha512-jtdKWV3nBviOd5v4hOpkVmpxsBy90CGzebpbO9beiqUYVMBtSc0AL9zGftFuBon7PNDcdvNCEuQqw2x0wP9yug==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/esbuild-darwin-64/-/esbuild-darwin-64-0.14.54.tgz}
-    name: esbuild-darwin-64
-    version: 0.14.54
-    engines: {node: '>=12'}
-    cpu: [x64]
-    os: [darwin]
-    requiresBuild: true
-    dev: true
-    optional: true
-
-  registry.npmmirror.com/esbuild-darwin-arm64@0.14.54:
-    resolution: {integrity: sha512-OPafJHD2oUPyvJMrsCvDGkRrVCar5aVyHfWGQzY1dWnzErjrDuSETxwA2HSsyg2jORLY8yBfzc1MIpUkXlctmw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.54.tgz}
-    name: esbuild-darwin-arm64
-    version: 0.14.54
-    engines: {node: '>=12'}
-    cpu: [arm64]
-    os: [darwin]
-    requiresBuild: true
-    dev: true
-    optional: true
-
-  registry.npmmirror.com/esbuild-freebsd-64@0.14.54:
-    resolution: {integrity: sha512-OKwd4gmwHqOTp4mOGZKe/XUlbDJ4Q9TjX0hMPIDBUWWu/kwhBAudJdBoxnjNf9ocIB6GN6CPowYpR/hRCbSYAg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.54.tgz}
-    name: esbuild-freebsd-64
-    version: 0.14.54
-    engines: {node: '>=12'}
-    cpu: [x64]
-    os: [freebsd]
-    requiresBuild: true
-    dev: true
-    optional: true
-
-  registry.npmmirror.com/esbuild-freebsd-arm64@0.14.54:
-    resolution: {integrity: sha512-sFwueGr7OvIFiQT6WeG0jRLjkjdqWWSrfbVwZp8iMP+8UHEHRBvlaxL6IuKNDwAozNUmbb8nIMXa7oAOARGs1Q==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.54.tgz}
-    name: esbuild-freebsd-arm64
-    version: 0.14.54
-    engines: {node: '>=12'}
-    cpu: [arm64]
-    os: [freebsd]
-    requiresBuild: true
-    dev: true
-    optional: true
-
-  registry.npmmirror.com/esbuild-linux-32@0.14.54:
-    resolution: {integrity: sha512-1ZuY+JDI//WmklKlBgJnglpUL1owm2OX+8E1syCD6UAxcMM/XoWd76OHSjl/0MR0LisSAXDqgjT3uJqT67O3qw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/esbuild-linux-32/-/esbuild-linux-32-0.14.54.tgz}
-    name: esbuild-linux-32
-    version: 0.14.54
-    engines: {node: '>=12'}
-    cpu: [ia32]
-    os: [linux]
-    requiresBuild: true
-    dev: true
-    optional: true
-
-  registry.npmmirror.com/esbuild-linux-64@0.14.54:
-    resolution: {integrity: sha512-EgjAgH5HwTbtNsTqQOXWApBaPVdDn7XcK+/PtJwZLT1UmpLoznPd8c5CxqsH2dQK3j05YsB3L17T8vE7cp4cCg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/esbuild-linux-64/-/esbuild-linux-64-0.14.54.tgz}
-    name: esbuild-linux-64
-    version: 0.14.54
-    engines: {node: '>=12'}
-    cpu: [x64]
-    os: [linux]
-    requiresBuild: true
-    dev: true
-    optional: true
-
-  registry.npmmirror.com/esbuild-linux-arm64@0.14.54:
-    resolution: {integrity: sha512-WL71L+0Rwv+Gv/HTmxTEmpv0UgmxYa5ftZILVi2QmZBgX3q7+tDeOQNqGtdXSdsL8TQi1vIaVFHUPDe0O0kdig==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.54.tgz}
-    name: esbuild-linux-arm64
-    version: 0.14.54
-    engines: {node: '>=12'}
-    cpu: [arm64]
-    os: [linux]
-    requiresBuild: true
-    dev: true
-    optional: true
-
-  registry.npmmirror.com/esbuild-linux-arm@0.14.54:
-    resolution: {integrity: sha512-qqz/SjemQhVMTnvcLGoLOdFpCYbz4v4fUo+TfsWG+1aOu70/80RV6bgNpR2JCrppV2moUQkww+6bWxXRL9YMGw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/esbuild-linux-arm/-/esbuild-linux-arm-0.14.54.tgz}
-    name: esbuild-linux-arm
-    version: 0.14.54
-    engines: {node: '>=12'}
-    cpu: [arm]
-    os: [linux]
-    requiresBuild: true
-    dev: true
-    optional: true
-
-  registry.npmmirror.com/esbuild-linux-mips64le@0.14.54:
-    resolution: {integrity: sha512-qTHGQB8D1etd0u1+sB6p0ikLKRVuCWhYQhAHRPkO+OF3I/iSlTKNNS0Lh2Oc0g0UFGguaFZZiPJdJey3AGpAlw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.54.tgz}
-    name: esbuild-linux-mips64le
-    version: 0.14.54
-    engines: {node: '>=12'}
-    cpu: [mips64el]
-    os: [linux]
-    requiresBuild: true
-    dev: true
-    optional: true
-
-  registry.npmmirror.com/esbuild-linux-ppc64le@0.14.54:
-    resolution: {integrity: sha512-j3OMlzHiqwZBDPRCDFKcx595XVfOfOnv68Ax3U4UKZ3MTYQB5Yz3X1mn5GnodEVYzhtZgxEBidLWeIs8FDSfrQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.54.tgz}
-    name: esbuild-linux-ppc64le
-    version: 0.14.54
-    engines: {node: '>=12'}
-    cpu: [ppc64]
-    os: [linux]
-    requiresBuild: true
-    dev: true
-    optional: true
-
-  registry.npmmirror.com/esbuild-linux-riscv64@0.14.54:
-    resolution: {integrity: sha512-y7Vt7Wl9dkOGZjxQZnDAqqn+XOqFD7IMWiewY5SPlNlzMX39ocPQlOaoxvT4FllA5viyV26/QzHtvTjVNOxHZg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.54.tgz}
-    name: esbuild-linux-riscv64
-    version: 0.14.54
-    engines: {node: '>=12'}
-    cpu: [riscv64]
-    os: [linux]
-    requiresBuild: true
-    dev: true
-    optional: true
-
-  registry.npmmirror.com/esbuild-linux-s390x@0.14.54:
-    resolution: {integrity: sha512-zaHpW9dziAsi7lRcyV4r8dhfG1qBidQWUXweUjnw+lliChJqQr+6XD71K41oEIC3Mx1KStovEmlzm+MkGZHnHA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.54.tgz}
-    name: esbuild-linux-s390x
-    version: 0.14.54
-    engines: {node: '>=12'}
-    cpu: [s390x]
-    os: [linux]
-    requiresBuild: true
-    dev: true
-    optional: true
-
-  registry.npmmirror.com/esbuild-netbsd-64@0.14.54:
-    resolution: {integrity: sha512-PR01lmIMnfJTgeU9VJTDY9ZerDWVFIUzAtJuDHwwceppW7cQWjBBqP48NdeRtoP04/AtO9a7w3viI+PIDr6d+w==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.54.tgz}
-    name: esbuild-netbsd-64
-    version: 0.14.54
-    engines: {node: '>=12'}
-    cpu: [x64]
-    os: [netbsd]
-    requiresBuild: true
-    dev: true
-    optional: true
-
-  registry.npmmirror.com/esbuild-openbsd-64@0.14.54:
-    resolution: {integrity: sha512-Qyk7ikT2o7Wu76UsvvDS5q0amJvmRzDyVlL0qf5VLsLchjCa1+IAvd8kTBgUxD7VBUUVgItLkk609ZHUc1oCaw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.54.tgz}
-    name: esbuild-openbsd-64
-    version: 0.14.54
-    engines: {node: '>=12'}
-    cpu: [x64]
-    os: [openbsd]
-    requiresBuild: true
-    dev: true
-    optional: true
-
-  registry.npmmirror.com/esbuild-sunos-64@0.14.54:
-    resolution: {integrity: sha512-28GZ24KmMSeKi5ueWzMcco6EBHStL3B6ubM7M51RmPwXQGLe0teBGJocmWhgwccA1GeFXqxzILIxXpHbl9Q/Kw==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/esbuild-sunos-64/-/esbuild-sunos-64-0.14.54.tgz}
-    name: esbuild-sunos-64
-    version: 0.14.54
-    engines: {node: '>=12'}
-    cpu: [x64]
-    os: [sunos]
-    requiresBuild: true
-    dev: true
-    optional: true
-
-  registry.npmmirror.com/esbuild-windows-32@0.14.54:
-    resolution: {integrity: sha512-T+rdZW19ql9MjS7pixmZYVObd9G7kcaZo+sETqNH4RCkuuYSuv9AGHUVnPoP9hhuE1WM1ZimHz1CIBHBboLU7w==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/esbuild-windows-32/-/esbuild-windows-32-0.14.54.tgz}
-    name: esbuild-windows-32
-    version: 0.14.54
-    engines: {node: '>=12'}
-    cpu: [ia32]
-    os: [win32]
-    requiresBuild: true
-    dev: true
-    optional: true
-
-  registry.npmmirror.com/esbuild-windows-64@0.14.54:
-    resolution: {integrity: sha512-AoHTRBUuYwXtZhjXZbA1pGfTo8cJo3vZIcWGLiUcTNgHpJJMC1rVA44ZereBHMJtotyN71S8Qw0npiCIkW96cQ==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/esbuild-windows-64/-/esbuild-windows-64-0.14.54.tgz}
-    name: esbuild-windows-64
-    version: 0.14.54
-    engines: {node: '>=12'}
-    cpu: [x64]
-    os: [win32]
-    requiresBuild: true
-    dev: true
-    optional: true
-
-  registry.npmmirror.com/esbuild-windows-arm64@0.14.54:
-    resolution: {integrity: sha512-M0kuUvXhot1zOISQGXwWn6YtS+Y/1RT9WrVIOywZnJHo3jCDyewAc79aKNQWFCQm+xNHVTq9h8dZKvygoXQQRg==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.54.tgz}
-    name: esbuild-windows-arm64
-    version: 0.14.54
-    engines: {node: '>=12'}
-    cpu: [arm64]
-    os: [win32]
-    requiresBuild: true
-    dev: true
-    optional: true
-
-  registry.npmmirror.com/fsevents@2.3.2:
-    resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==, registry: https://registry.npm.taobao.org/, tarball: https://registry.npmmirror.com/fsevents/-/fsevents-2.3.2.tgz}
-    name: fsevents
-    version: 2.3.2
-    engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
-    os: [darwin]
-    requiresBuild: true
-    dev: true
-    optional: true

+ 0 - 1
public/vite.svg

@@ -1 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" class="iconify iconify--logos" width="31.88" height="32" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 257"><defs><linearGradient id="IconifyId1813088fe1fbc01fb466" x1="-.828%" x2="57.636%" y1="7.652%" y2="78.411%"><stop offset="0%" stop-color="#41D1FF"></stop><stop offset="100%" stop-color="#BD34FE"></stop></linearGradient><linearGradient id="IconifyId1813088fe1fbc01fb467" x1="43.376%" x2="50.316%" y1="2.242%" y2="89.03%"><stop offset="0%" stop-color="#FFEA83"></stop><stop offset="8.333%" stop-color="#FFDD35"></stop><stop offset="100%" stop-color="#FFA800"></stop></linearGradient></defs><path fill="url(#IconifyId1813088fe1fbc01fb466)" d="M255.153 37.938L134.897 252.976c-2.483 4.44-8.862 4.466-11.382.048L.875 37.958c-2.746-4.814 1.371-10.646 6.827-9.67l120.385 21.517a6.537 6.537 0 0 0 2.322-.004l117.867-21.483c5.438-.991 9.574 4.796 6.877 9.62Z"></path><path fill="url(#IconifyId1813088fe1fbc01fb467)" d="M185.432.063L96.44 17.501a3.268 3.268 0 0 0-2.634 3.014l-5.474 92.456a3.268 3.268 0 0 0 3.997 3.378l24.777-5.718c2.318-.535 4.413 1.507 3.936 3.838l-7.361 36.047c-.495 2.426 1.782 4.5 4.151 3.78l15.304-4.649c2.372-.72 4.652 1.36 4.15 3.788l-11.698 56.621c-.732 3.542 3.979 5.473 5.943 2.437l1.313-2.028l72.516-144.72c1.215-2.423-.88-5.186-3.54-4.672l-25.505 4.922c-2.396.462-4.435-1.77-3.759-4.114l16.646-57.705c.677-2.35-1.37-4.583-3.769-4.113Z"></path></svg>

+ 0 - 1
src/App.vue

@@ -1,6 +1,5 @@
 <script setup lang="ts">
   import { placeholderLoading } from '@/utils/placeholder-loading'
-
   placeholderLoading()
 </script>
 

+ 0 - 25
src/api/activity-status.ts

@@ -1,25 +0,0 @@
-// import useMessageStore from '@/store/message'
-import { http } from '@/utils/request'
-import url from './url'
-
-const flag = ref(true)
-
-export function getActivityStatus() {
-  if (!flag.value) {
-    return
-  }
-  flag.value = false
-  return http.get<ActivityStatus>(url.GET_ACTIVITY_DETAIL).finally(() => {
-    flag.value = true
-  })
-}
-
-/**
- * 活动验证
- */
-// export async function VerificationActivity() {
-//   const res = await getActivityStatus()
-//   if (res?.code !== 200) {
-//     await useMessageStore().openMessage(res!.code, res?.message)
-//   }
-// }

+ 0 - 6
src/api/api.d.ts

@@ -1,6 +0,0 @@
-// 活动状态
-interface ActivityStatus {
-  end_time: string
-  is_open: boolean
-  start_time: string
-}

+ 0 - 28
src/api/url.ts

@@ -1,28 +0,0 @@
-const ACTIVITY_ID = 64
-
-export const url = {
-  // 活动详情
-  GET_ACTIVITY_DETAIL: `/api/v2/activity/fool/${ACTIVITY_ID}`,
-  // 中奖日志(通知)
-  GET_ALL_REWARD: `/api/v2/activity/all_reward/${ACTIVITY_ID}`,
-  // 中奖日志(个人明细)
-  GET_MY_TEAM_REWARD_LOG: `/api/v2/activity/get_my_team_reward_log/${ACTIVITY_ID}`,
-  // 分享信息
-  GET_SHARE_INFO: `/api/v2/activity/app_share/title?activity_id=${ACTIVITY_ID}`,
-  // 查询用户所有信息
-  GET_USER_ALL_INFO: '/api/v2/activity/capsule_toys/user_all_info',
-  // 查询用户所有信息(立即参与)
-  GET_USER_ALL_INFO_IS_APP: '/api/v2/activity/capsule_toys/user_all_info?is_app=1',
-  // 任务列表
-  GET_ALL_TASK: '/api/v2/activity/capsule_toys/all_task',
-  // 签到
-  GET_SIGN_IN: '/api/v2/activity/capsule_toys/sign_in',
-  // 扭蛋
-  GET_DRAW: '/api/v2/activity/capsule_toys/draw',
-  // 超级扭蛋
-  GET_DRAW_SUPER: '/api/v2/activity/capsule_toys/draw_super',
-  // 金币流水
-  GET_COINS_FLOW: '/api/v2/activity/capsule_toys/coins_flow'
-}
-
-export default url

+ 0 - 1
src/assets/icons/xiaoxi-zhihui.svg

@@ -1 +0,0 @@
-<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg class="icon" width="200px" height="200.00px" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg"><path d="M523.946667 85.333333C802.773333 85.333333 982.826667 307.541333 982.826667 511.338667c0 242.837333-197.397333 448-458.837334 448-84.16 0-150.464-16.597333-221.610666-55.402667l-88.618667 50.197333c-27.797333 8.426667-50.474667 5.162667-68.010667-9.834666-17.557333-14.997333-25.130667-34.730667-22.72-59.2a19570.688 19570.688 0 0 0 29.653334-106.368C123.008 741.76 64 656.426667 64 511.338667 64 307.541333 245.141333 85.333333 523.946667 85.333333z m-1.28 64C304.064 149.333333 128 317.12 128 522.666667c0 77.354667 24.874667 151.125333 70.634667 213.184l5.397333 7.125333 18.218667 23.509333-36.970667 128.746667a0.32 0.32 0 0 0 0.490667 0.384l113.408-63.829333 26.752 14.592C385.237333 878.72 452.544 896 522.666667 896 741.269333 896 917.333333 728.213333 917.333333 522.666667S741.269333 149.333333 522.666667 149.333333z m-192 320a53.333333 53.333333 0 1 1 0 106.666667 53.333333 53.333333 0 0 1 0-106.666667z m182.848 0a53.333333 53.333333 0 1 1 0 106.666667 53.333333 53.333333 0 0 1 0-106.666667z m182.869333 0a53.333333 53.333333 0 1 1 0 106.666667 53.333333 53.333333 0 0 1 0-106.666667z" fill="#111111" /></svg>

BIN
src/assets/images/test.jpg


+ 0 - 122
src/assets/styles/common.scss

@@ -1,122 +0,0 @@
-:root {
-  // ios安全区域变量(用来取值后赋给全局)
-  --sa-ios-top: constant(safe-area-inset-top);
-  --sa-ios-top: env(safe-area-inset-top);
-
-  --sa-ios-right: constant(safe-area-inset-right);
-  --sa-ios-right: env(safe-area-inset-right);
-
-  --sa-ios-bottom: constant(safe-area-inset-bottom);
-  --sa-ios-bottom: env(safe-area-inset-bottom);
-
-  --sa-ios-left: constant(safe-area-inset-left);
-  --sa-ios-left: env(safe-area-inset-left);
-
-  // 不支持全屏的安全区域值/全局安全区域取值变量名
-  --sa-top: 0px;
-  --sa-right: 0px;
-  --sa-bottom: 0px;
-  --sa-left: 0px;
-}
-
-.van-popup__close-icon {
-  //margin-top: -22px;
-  transform: scale(.8);
-}
-
-.van-pull-refresh__head {
-  display: flex;
-  align-items: center;
-  justify-content: center;
-}
-
-.pull-down-wrapper {
-
-  .van-loading__text, .van-pull-refresh__text {
-    color: #fff;
-  }
-}
-
-.body-container {
-  position: relative;
-  margin: auto;
-  height: 100%;
-  max-width: 1080px;
-  overflow: auto;
-}
-
-.overlay-container {
-  position: fixed;
-  top: 0;
-  left: 0;
-  width: 100%;
-  height: 100%;
-  background: rgba(0, 0, 0, .8);
-  z-index: 5;
-  @include flex-center;
-
-  .overlay-wrapper {
-    position: relative;
-  }
-
-  .overlay-close {
-    width: 43px;
-    position: absolute;
-    top: 0;
-    right: 0;
-    margin: 40px 46px;
-    @include extend-click;
-  }
-}
-
-.slide-bottom-container {
-  position: fixed;
-  bottom: 0;
-  left: 0;
-  width: 100%;
-  z-index: 5;
-}
-
-.slide-bottom-enter-from,
-.slide-bottom-leave-to {
-  transform: translateY(100vh);
-}
-
-.slide-bottom-enter-active,
-.slide-bottom-leave-active {
-  transition: transform 0.3s linear;
-}
-
-.fade-enter-from {
-  opacity: 0;
-}
-
-.fade-enter-active {
-  transition: all 0.3s linear;
-}
-
-.dialog-message-content {
-  @include flex-center;
-  flex-direction: column;
-  padding: 70px 0 50px;
-
-  .text {
-    font-size: 36px;
-    color: #ffffff;
-  }
-
-  .btn {
-    margin-top: 60px;
-    @include flex-center;
-
-    img {
-      height: 95px;
-    }
-  }
-
-  .btn-group {
-    img:last-child {
-      margin-left: 50px;
-    }
-  }
-}

+ 0 - 108
src/assets/styles/reset.scss

@@ -1,108 +0,0 @@
-/* 重置浏览器CSS */
-
-html,
-body {
-  height: 100%;
-  width: 100%;
-  font-family: "Microsoft YaHei", "PingFang SC", "sans-serif";
-  -webkit-font-smoothing: antialiased;
-  -moz-osx-font-smoothing: grayscale;
-  position: relative;
-  overflow: hidden;
-  font-size: 16px;
-
-  &, *, ::after, ::before, :after, :before {
-    -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
-    -webkit-overflow-scrolling: touch;
-    -webkit-touch-callout: none;
-    padding: 0;
-    margin: 0;
-    box-sizing: border-box;
-    outline: none;
-    line-height: 1;
-  }
-}
-
-
-input,
-button,
-img {
-  outline: none;
-  border: 0;
-}
-
-input[type="search"] {
-  -webkit-appearance: none;
-}
-
-[type="search"]::-webkit-search-decoration {
-  display: none;
-}
-
-input::-webkit-search-cancel-button {
-  display: none;
-}
-
-button:focus {
-  outline: unset;
-}
-
-button:focus-visible {
-  outline: 1px solid #000;
-}
-
-textarea {
-  font-family: 'inherit', serif;
-}
-
-ol,
-ul {
-  list-style: none;
-}
-
-span {
-  display: inline-block;
-}
-
-a:active,
-a:hover {
-  outline: 0;
-}
-
-a,
-a:visited {
-  text-decoration: none;
-  outline: 0;
-  color: inherit;
-}
-
-em, i {
-  font-style: normal;
-  font-weight: normal;
-}
-
-label {
-  word-wrap: break-word;
-  word-break: break-all;
-  user-select: none;
-}
-
-table {
-  border-collapse: collapse;
-  border-spacing: 0;
-}
-
-.clear:after {
-  content: ' ';
-  display: block;
-  clear: both;
-  visibility: hidden;
-  line-height: 0;
-  height: 0;
-}
-
-[v-cloak],
-[hidden],
-.hide {
-  display: none;
-}

+ 0 - 52
src/assets/styles/scrollbar.scss

@@ -1,52 +0,0 @@
-/**
- * Chrome
- */
-
-//  滚动条的轨道(里面装有Thumb)
-::-webkit-scrollbar-track {
-  background: transparent;
-}
-
-// 滚动条整体部分
-::-webkit-scrollbar {
-  width: 0;
-  height: 0;
-  background-color: #2448aa;
-  display: none;
-}
-
-// 滚动条里面的小方块,能向上向下移动(或往左往右移动,取决于是垂直滚动条还是水平滚动条)
-::-webkit-scrollbar-thumb {
-  background: #7da0ff;
-  border-radius: 0;
-  transition: all 0.1s linear;
-}
-
-::-webkit-scrollbar-thumb:hover {
-  background: #7da0ff;
-}
-
-::-webkit-scrollbar-thumb:active {
-  background: #7da0ff;
-}
-
-// 滚动条的轨道的两端按钮,允许通过点击微调小方块的位置。
-::-webkit-scrollbar-button {
-}
-
-// 内层轨道,滚动条中间部分(除去)
-::-webkit-scrollbar-track-piece {
-}
-
-/**
- * Firefox
- */
-.ff-scrollbar {
-  scrollbar-color: #7da0ff transparent;
-  scrollbar-width: thin;
-
-  * {
-    scrollbar-color: #7da0ff transparent;
-    scrollbar-width: thin;
-  }
-}

+ 0 - 89
src/components/GsapCom.vue

@@ -1,89 +0,0 @@
-<template>
-  <h2>GASP</h2>
-  <br />
-  <button @click="handleStart1">开始</button>
-  <button @click="handlePause">暂停</button>
-  <button @click="handleRevert1">回到刚才动画开始</button>
-  <button @click="handleReverse">回退</button>
-  <div class="box1"></div>
-  <button @click="handleStart2">开始</button>
-  <button @click="handleRevert2">回到刚才动画开始</button>
-  <div class="box2"></div>
-  <div class="box3"></div>
-  <div class="box4"></div>
-</template>
-
-<script setup lang="ts">
-  import { gsap } from 'gsap'
-  import { showToast } from 'vant'
-  import 'vant/es/toast/style'
-
-  let a1: any = null
-  let a2: any = null
-
-  function handleStart1() {
-    a1 = gsap.to('.box1', {
-      duration: 2,
-      x: 200,
-      y: 40,
-      repeat: 1,
-      yoyo: true,
-      onStart: () => {
-        showToast({ message: '动画开始' })
-      },
-      onComplete: () => {
-        showToast({ message: '动画结束' })
-      }
-    })
-    a1.play()
-  }
-
-  function handlePause() {
-    a1.pause()
-  }
-
-  function handleRevert1() {
-    a1.revert()
-  }
-
-  function handleReverse() {
-    a1.reverse()
-  }
-
-  function handleStart2() {
-    a2 = gsap.timeline()
-    a2.to('.box2', { duration: 2, x: 200, ease: 'bounce' })
-      .to('.box3', { duration: 2, x: 200, rotation: 200, scale: 0.8, opacity: 0.5 }, 0.5)
-      .to('.box4', { duration: 2, x: 200, rotation: 0, scale: 1, opacity: 1, ease: 'strong.inOut' }, '-=1')
-  }
-
-  function handleRevert2() {
-    a2.revert()
-  }
-
-  onMounted(() => {})
-</script>
-
-<style scoped lang="scss">
-  [class^='box'] {
-    width: 100px;
-    height: 100px;
-    margin-bottom: 50px;
-  }
-
-  .box1 {
-    background-color: skyblue;
-  }
-
-  .box2,
-  .box3,
-  .box4 {
-    background-color: #075151;
-  }
-
-  button {
-    margin: 0 10px 10px 0;
-    padding: 0 10px;
-    height: 40px;
-  }
-</style>

+ 0 - 11
src/hooks/ref.ts

@@ -1,11 +0,0 @@
-import { Ref, ref, UnwrapRef } from 'vue'
-
-type UseRef<T> = [Ref<UnwrapRef<T>>, (value: UnwrapRef<T>) => void]
-
-export default function useRef<T = any>(initValue: T): UseRef<T> {
-  const refValue = ref<T>(initValue)
-  const setRefValue = (value: UnwrapRef<T>) => {
-    refValue.value = value
-  }
-  return [refValue, setRefValue]
-}

+ 2 - 4
src/main.ts

@@ -2,10 +2,8 @@ import { createApp } from 'vue'
 import App from './App.vue'
 import store from '@/store'
 import router from '@/router'
-
-import '@/assets/styles/reset.scss'
-import '@/assets/styles/scrollbar.scss'
-import '@/assets/styles/common.scss'
+import 'normalize.css'
+import 'element-plus/dist/index.css'
 
 const app = createApp(App)
 

+ 50 - 41
src/utils/encrypt.ts

@@ -1,45 +1,54 @@
-import CryptoES from 'crypto-es'
-import { JSEncrypt } from 'jsencrypt'
+// import CryptoES from 'crypto-es'
+// import { JSEncrypt } from 'jsencrypt'
 
-/**
- * AES加密
- * @param content 需要加密的内容
- * @param key 秘钥
- */
-export function encryptAES(content: string, key: string) {
-  const cfg = {
-    mode: CryptoES.mode.ECB,
-    padding: CryptoES.pad.ZeroPadding
-  }
-  const newKey = CryptoES.enc.Utf8.parse(key)
-  const contentStr = CryptoES.enc.Utf8.parse(content)
-  const encrypted = CryptoES.AES.encrypt(contentStr, newKey, cfg)
-  return CryptoES.enc.Base64.stringify(encrypted.ciphertext)
-}
+// /**
+//  * AES加密
+//  * @param content 需要加密的内容
+//  * @param key 秘钥
+//  */
+// export function encryptAES(content: string, key: string) {
+//   const cfg = {
+//     mode: CryptoES.mode.ECB,
+//     padding: CryptoES.pad.ZeroPadding
+//   }
+//   const newKey = CryptoES.enc.Utf8.parse(key)
+//   const contentStr = CryptoES.enc.Utf8.parse(content)
+//   const encrypted = CryptoES.AES.encrypt(contentStr, newKey, cfg)
+//   return CryptoES.enc.Base64.stringify(encrypted.ciphertext)
+// }
+//
+// /**
+//  * AES解密
+//  * @param content 内容
+//  * @param key 秘钥
+//  */
+// function decryptAES(content: string, key: string) {
+//   const cfg = {
+//     mode: CryptoES.mode.ECB,
+//     padding: CryptoES.pad.ZeroPadding
+//   }
+//   const newKey = CryptoES.enc.Utf8.parse(key)
+//   const contentStr = CryptoES.enc.Base64.stringify(CryptoES.enc.Base64.parse(content))
+//   const decrypt = CryptoES.AES.decrypt(contentStr, newKey, cfg)
+//   return decrypt.toString(CryptoES.enc.Utf8)
+// }
+//
+// /**
+//  * RSA加密
+//  * @param content 需要加密的内容
+//  * @param publicKey 秘钥
+//  */
+// export function encryptRSA(content: string, publicKey: string) {
+//   const encrypt = new JSEncrypt()f
+//   encrypt.setPublicKey(publicKey)
+//   return encrypt.encrypt(content)
+// }
 
-/**
- * AES解密
- * @param content 内容
- * @param key 秘钥
- */
-function decryptAES(content: string, key: string) {
-  const cfg = {
-    mode: CryptoES.mode.ECB,
-    padding: CryptoES.pad.ZeroPadding
-  }
-  const newKey = CryptoES.enc.Utf8.parse(key)
-  const contentStr = CryptoES.enc.Base64.stringify(CryptoES.enc.Base64.parse(content))
-  const decrypt = CryptoES.AES.decrypt(contentStr, newKey, cfg)
-  return decrypt.toString(CryptoES.enc.Utf8)
+export async function sha256(message: string) {
+  const msgUint8 = new TextEncoder().encode(message)// encode as (utf-8) Uint8Array
+  const hashBuffer = await crypto.subtle.digest('SHA-256', msgUint8)// hash the message
+  const hashArray = Array.from(new Uint8Array(hashBuffer))// convert buffer to byte array
+  return hashArray.map(b => b.toString(16).padStart(2, '0')).join('')// convert bytes to hex string
 }
 
-/**
- * RSA加密
- * @param content 需要加密的内容
- * @param publicKey 秘钥
- */
-export function encryptRSA(content: string, publicKey: string) {
-  const encrypt = new JSEncrypt()
-  encrypt.setPublicKey(publicKey)
-  return encrypt.encrypt(content)
-}
+

+ 29 - 0
src/utils/price.ts

@@ -0,0 +1,29 @@
+export const getRealPrice = (realPrice?: number): number => {
+    if (typeof realPrice === "number" && realPrice >= 0) {
+        return realPrice
+    }
+
+    return 0
+}
+
+export const getFacePrice = (hotPrice?: number, realPrice?: number): number => {
+    realPrice = getRealPrice(realPrice)
+
+    if (typeof hotPrice !== "number" || hotPrice < 0) {
+        return realPrice
+    }
+
+    if (hotPrice < realPrice) {
+        return hotPrice
+    }
+
+    return realPrice
+}
+
+export const getTotalPrice = (hotPrice?: number, realPrice?: number, num?: number): number => {
+    if (typeof num !== "number" || num <= 0) {
+        return 0
+    }
+
+    return getFacePrice(hotPrice, realPrice) * num
+}

+ 112 - 21
src/utils/request.ts

@@ -1,12 +1,34 @@
-import axios, { AxiosInstance, AxiosError, AxiosResponse, InternalAxiosRequestConfig } from 'axios'
+import axios, { AxiosInstance, AxiosError, AxiosResponse } from 'axios'
+import {getXtoken, setXtoken} from "@/store/user"
+import {ElMessage} from "element-plus"
+import useUserStore, {isLogin} from "@/store/user"
+import { ElMessageBox } from "element-plus"
 
-const service: AxiosInstance = axios.create({
-  baseURL: import.meta.env.VITE_API_BASE || '/'
-})
+export const config = {
+    baseURL: import.meta.env.VITE_API_BASE || '/api'
+}
+
+const service: AxiosInstance = axios.create(config)
 
 service.interceptors.request.use(
-  (config: InternalAxiosRequestConfig) => {
-    return config
+  (config): any => {
+    const headers = {
+        ...config.headers,
+        'Content-Type': "application/form-data",
+        "Accept": "application/json",
+    }
+
+    const xtoken = getXtoken()
+    if (xtoken) {
+        headers["X-Token"] = xtoken
+    } else if (headers["X-Token"]) {
+        delete headers["X-Token"]
+    }
+
+    return {
+        ...config,
+        headers: headers
+    }
   },
   (error: AxiosError) => {
     return Promise.reject(error)
@@ -16,30 +38,99 @@ service.interceptors.request.use(
 service.interceptors.response.use(
   (response: AxiosResponse) => {
     if (response.status === 200) {
-      return response.data
+      if (response.data.code >= 1) {// 公共错误
+          if (response.data.code === 1) {
+              ElMessageBox.alert(response.data.msg || "您遇到了未知的错误", '提示', {
+                  confirmButtonText: '好的',
+                  callback: () => {},
+              })
+              return Promise.reject(response)
+          } else if (response.data.code === 2) {
+              const userStore = useUserStore()
+              const router = useRouter()
+              const route = useRoute()
+
+              if (isLogin()) {
+                  ElMessageBox.alert('您的登录已经过期,请重新登录。', '提示', {
+                      confirmButtonText: '好的',
+                      callback: () => {
+                          userStore.logout()
+                          ElMessage({
+                              type: 'success',
+                              message: '账号退出成功',
+                          })
+                          router.push({
+                              "path": "/login",
+                              "query": {
+                                  "redirect": encodeURIComponent(route.fullPath),
+                              },
+                          })
+                      },
+                  })
+              } else {
+                  ElMessageBox.alert('请登陆后再新建操作。', '提示', {
+                      confirmButtonText: '好的',
+                      callback: () => {},
+                  })
+              }
+          } else if (response.data.code === 3 || response.data.code === 4) {
+              ElMessageBox.alert('你的权限不足。', '提示', {
+                  confirmButtonText: '好的',
+                  callback: () => {},
+              })
+          } else if (response.data.code === 5) {
+              // 静默
+
+              // ElMessageBox.alert('非测试模式,无法访问API。', '提示', {
+              //     confirmButtonText: '好的',
+              //     callback: () => {},
+              // })
+          }
+          return Promise.reject(response)
+      } else if (response.data.code <= 1) {// 针对性错误
+          ElMessageBox.alert(response.data.msg || "您遇到了错误", '提示', {
+              confirmButtonText: '好的',
+              callback: () => {},
+          })
+          return Promise.reject(response)
+      } else if (response.data.code === 0) {// 正常
+          const newToken = response.headers["X-Token"]
+          if (newToken && getXtoken()) {
+              setXtoken(newToken)
+          }
+
+          return Promise.resolve(response)
+      }
+      return Promise.reject(response)
     }
-    return Promise.reject()
+
+    ElMessageBox.alert("您遇到了未知的错误", '提示', {
+        confirmButtonText: '好的',
+        callback: () => {},
+    })
+    return Promise.reject(response)
+
   },
   (error: AxiosError) => {
     return Promise.reject(error)
   }
 )
-export default service
 
-export interface Result<T = unknown> {
+export type Success = Result<success>
+export type SuccessData = ResultData<success>
+
+export type Result<T = unknown> = Promise<ResultData<T>> | any
+export type ResultData<T = unknown> = AxiosResponse<result<T>> | any
+
+export interface success {
+    success: boolean
+}
+
+export interface result<T = unknown> {
   message: string
   code: number
   data: T
-
-  [key: string]: any
+  [key: string]: any // 任意额外数学
 }
 
-export const http = {
-  get<T = any>(url: string, data?: object): Promise<Result<T>> {
-    return service.get<T, Result<T>>(url, data)
-  },
-
-  post<T = any>(url: string, data?: object): Promise<Result<T>> {
-    return service.post<T, Result<T>>(url, data)
-  }
-}
+export default service

+ 11 - 0
src/utils/str.ts

@@ -40,6 +40,13 @@ export const average = (arr: number[]) => arr.reduce((a, b) => a + b) / arr.leng
  */
 export const isMobile = (phone: string) => /^1[0-9]{10}$/.test(phone)
 
+/**
+ * 是否是合法邮箱
+ * @param email
+ * @returns {boolean}
+ */
+export const isEmail = (email: string) => /^.+@.+\..+$/i.test(email)
+
 /**
  * 获取滚动的坐标
  * @param {Window} el
@@ -66,3 +73,7 @@ export const scrollToTop = () => {
     window.scrollTo(0, c - c / 8)
   }
 }
+
+export function maskPhoneNumber(phoneNumber: string) {
+  return phoneNumber.replace(/^(\d{3})\d{4}(\d{4})$/, '$1****$2');
+}

+ 28 - 0
src/utils/time.ts

@@ -0,0 +1,28 @@
+export function formatDate(timestamp: number, type?: number) {
+    if(!timestamp) {
+        return '--'
+    }
+    
+    const myDate = new Date(timestamp * 1000)
+    const y = myDate.getFullYear()
+    const m = (myDate.getMonth() + 1).toString().padStart(2, '0')
+    const d = myDate.getDate().toString().padStart(2, '0')//日
+    const hh = myDate.getHours().toString().padStart(2, '0')
+    const mm = myDate.getMinutes().toString().padStart(2, '0')
+    const ss = myDate.getSeconds().toString().padStart(2, '0')
+
+    if(type == 1) {//yyyy-mm
+        return [y, m].join('-')
+    } else if(type == 2) {//yyyy-mm-dd
+        return [y, m, d].join('-')
+    } else if(type == 3) {//2020年02月
+        return y + '年' + m + '月'
+    } else if(type == 4) {//2020.02.02 00:00:00
+        return [y, m, d].join('.') + ' ' + [hh, mm, ss].join(':')
+    } else if(type == 5) {//2020.02.02
+        return [y, m, d].join('.')
+    }
+    
+    //2020-02-02 00:00:00
+    return [y, m, d].join('-') + ' ' + [hh, mm, ss].join(':')
+}

+ 1 - 5
src/utils/tools.ts

@@ -1,9 +1,5 @@
 export function getEnv() {
-  const env = import.meta.env
-  if (env.VITE_ASSETS_BASE && typeof env.VITE_ASSETS_BASE === 'string' && !/^http/.test(env.VITE_ASSETS_BASE)) {
-    env.VITE_ASSETS_BASE = window.location.origin + env.VITE_ASSETS_BASE
-  }
-  return env
+  return import.meta.env
 }
 
 /**

+ 1 - 10
src/vite-env.d.ts

@@ -1,19 +1,10 @@
 /// <reference types="vite/client" />
 /// <reference types="vite-svg-loader" />
-//declare声明宣告, 声明一个ambient module(即:没有内部实现的 module声明)
-declare module 'views/index。vue'
-declare module '*.vue' {
-  import { DefineComponent } from 'vue'
-  const component: DefineComponent<{}, {}, any>
-  export default component
-}
-//vite-env.d.ts
 
-/// <reference types="vite/client" />
+declare module 'views/index.vue'
 
 declare module '*.vue' {
   import { DefineComponent } from 'vue'
-  // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/ban-types
   const component: DefineComponent<{}, {}, any>
   export default component
 }