diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..23bd69d
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,20 @@
+# Build and Release Folders
+bin-debug/
+bin-release/
+[Oo]bj/
+[Bb]in/
+
+# Other files and folders
+.settings/
+
+# Executables
+*.swf
+*.air
+*.ipa
+*.apk
+
+# Project files, i.e. `.project`, `.actionScriptProperties` and `.flexProperties`
+# should NOT be excluded as they contain compiler settings and other important
+# information for Eclipse / Flash Builder.
+node_modules/
+dist/
diff --git a/CHANGELOG.md b/CHANGELOG.md
new file mode 100644
index 0000000..0c212b2
--- /dev/null
+++ b/CHANGELOG.md
@@ -0,0 +1,367 @@
+# vue-next-admin 更新日志
+
+🎉🎉🔥 `vue-next-admin` 基于 vue3.x 、Typescript、vite、Element plus 等,适配手机、平板、pc 的后台开源免费模板库(vue2.x 请切换 vue-prev-admin 分支)
+
+## 2.2.0
+
+`2022.07.10`
+
+⚡⚡⚡ [/sec/stores/userInfo.ts](https://gitee.com/lyt-top/vue-next-admin/blob/master/src/stores/userInfo.ts) 下添加了 `getApiUserInfo` 接口模拟数据 `setTimeout` 为 3 秒
+
+- 🌟 更新 依赖更新最新版本
+- 🐞 修复 [主界面重新授权按钮点击卡死不跳转登录界面#I5C3JS](https://gitee.com/lyt-top/vue-next-admin/issues/I5C3JS),感谢[@Hero-Typ](https://gitee.com/tian_yu_peng)
+- 🐞 修复 编译警告[#I5CVSB](https://gitee.com/lyt-top/vue-next-admin/issues/I5CVSB),全局替换成 `:deep(attr)`,感谢[@Linvas](https://gitee.com/linvas)。参考文档:[vue3 sfc-style](https://v3.cn.vuejs.org/api/sfc-style.html#style-scoped)。`node_modules\print-js\dist\print.js` 需 `print-js` 作者适配或去除 `package.json` 中的 `"print-js": "^1.6.0"`
+- 🐞 修复 [vue-next-admin-template-js 版本前端控制路由:userInfo.js 请求用户信息接口报错,加载不到路由 可以写个定时器模拟一下接口 一样的报错#I5F1HP](https://gitee.com/lyt-top/vue-next-admin/issues/I5F1HP),感谢[@白开水](https://gitee.com/libin951223)
+
+## 2.1.1
+
+`2022.05.27`
+
+- 🌟 更新 依赖更新最新版本
+- 🎯 优化 深色模式下,`` 时,`:active` 样式
+- 🎯 优化 [页面缓存在刷新之后失效 #I58U75](https://gitee.com/lyt-top/vue-next-admin/issues/I58U75)),感谢[@ls0428](https://gitee.com/ls0428)
+- 🎯 优化 [SvgIcon 对下载的 Svg 图像设置颜色无效 #I59ND0](https://gitee.com/lyt-top/vue-next-admin/issues/I59ND0)),感谢[@elus_z](https://gitee.com/elus_z)
+- 🎯 优化 `/src/utils/toolsValidate.ts` 工具类
+- 🐞 修复 [布局切换,TagsView 显示的 tab 会多一个出来 #I58WGM](https://gitee.com/lyt-top/vue-next-admin/issues/I58WGM),感谢[@lg_boy](https://gitee.com/lg_boy)
+- 🐞 修复 [如果设置顶部面包屑导航开启图标 isBreadcrumbIcon=true 后,样式有点问题 如果不开启就是正常的 #I58VB8](https://gitee.com/lyt-top/vue-next-admin/issues/I58VB8)
+- 🐞 修复 地址栏路由地址输入错误时,返回首页后,再次输入路由地址错误时,不跳转 404 问题
+- 🐞 修复 [2.1.0 版本的图标选择组件多次点击后功能失效 #I590TH](https://gitee.com/lyt-top/vue-next-admin/issues/I590TH),感谢[@quber](https://gitee.com/quber)
+
+## 2.1.0
+
+`2022.04.18`
+
+⚡⚡⚡ 此版本为破环性更新,优化内容如下:(谨慎更新!谨慎更新!!谨慎更新!!!)。因为 `vuex` 替换成 `pinia`
+
+- 🌟 更新 依赖更新最新版本
+- 🎯 优化 部分界面图片不显示问题(更换 gitee 在线图片地址源)
+- 🎯 优化 各界面方法引入与逻辑之间添加一行空行,方便区分内容
+- 🎯 优化 图标选择器 [#I4YAHB](https://gitee.com/lyt-top/vue-next-admin/issues/I4YAHB),感谢[@真有你的](https://gitee.com/sunliusen)
+- 🎯 优化 图标选择器 icon type 类型为 all 时,类型 ali、ele、awe 回显问题
+- 🎯 优化 去掉开发环境 i18n 控制台警告,页面代码:[i18n/index.ts](https://gitee.com/lyt-top/vue-next-admin/blob/master/src/i18n/index.ts)
+- 🎯 优化 `NextLoading.start()` 方法,防止第一次进入界面时出现短暂空白
+- 🎯 优化 地址栏有参数退出登录,再次登录不跳之前界面问题 `src/layout/navBars/breadcrumb/user.vue`
+- 🎯 优化 `SvgIcon` 组件,防止 `开启 Tagsview 图标` 时,`tagsView 右键菜单关闭` 报错问题,工作流不可连线、全屏时关闭按钮消失问题
+- 🎯 优化 [如果 url 中有中文等特殊字符,第一次切换该 tab 时 keep-alive 失效#I55JS7](https://gitee.com/lyt-top/vue-next-admin/issues/I55JS7),感谢[yuyong1566](https://gitee.com/yuyong1566)
+- 🎯 优化 [wangEditor](https://www.wangeditor.com/) 更新到 v5,[vue3 版本线上示例中 wangeditor 富文本编辑器 demo 实例,无法换行#I5565B](https://gitee.com/lyt-top/vue-next-admin/issues/I5565B),感谢@[jenchih](https://gitee.com/jenchih)
+- 🎯 优化 [在关闭 tagview 时,高度刷新时会会变化,出现滚动条](https://gitee.com/lyt-top/vue-next-admin/issues/I55FHM),感谢[张松](https://gitee.com/zs310071113)
+- 🎯 优化 [路由参数](https://lyt-top.gitee.io/vue-next-admin-preview/#/params/common)演示
+- 🎉 新增 [vuex](https://vuex.vuejs.org/) 替换成 [pinia](https://pinia.vuejs.org/getting-started.html)
+- 🎉 新增 tagsView 支持自定义 tagsView 名称(文章详情时有用),前往体验:[路由参数/普通路由](https://lyt-top.gitee.io/vue-next-admin-preview/#/params/common)。新增 tagsView 支持自定义名称国际化,感谢[@q7but](https://gitee.com/q7but)、[!22 add 添加自定义 tagVIewName 拓展,支持国际化](https://gitee.com/lyt-top/vue-next-admin/pulls/22/files)、感谢[@tony_tong_xin](https://gitee.com/tony_tong_xin)
+- 🐞 修复 适配 `"element-plus": "^2.1.9",2.2.0` 版本
+- 🐞 修复 [导航栏横向布局后,一级菜单显示问题#I4Z3M3](https://gitee.com/lyt-top/vue-next-admin/issues/I4Z3M3)
+- 🐞 修复 横向布局三级及以上导航菜单高亮、导航高度不统一问题
+- 🐞 修复 分栏模式下,选中的菜单是 primary 样式,鼠标移入字也变成 primary 色了,感谢群友@孤夜-流殇
+- 🐞 修复 [vuex 里面改了颜色 但是不生效 #I4WFMA](https://gitee.com/lyt-top/vue-next-admin/issues/I4WFMA)
+- 🐞 修复 全局主题 primary 清空颜色后报错,[#I4X0LG](https://gitee.com/lyt-top/vue-next-admin/issues/I4X0LG),感谢[面向 BUG 编程](https://gitee.com/fhtfy)
+- 🐞 修复 [.eslintrc.js 文件 rules 标签名错误 #I53IPK](https://gitee.com/lyt-top/vue-next-admin/issues/I53IPK),感谢[yuyong1566](https://gitee.com/yuyong1566)
+- 🐞 修复 `开启 Tagsview 图标` 时,`tagsView 右键菜单关闭` 报错问题
+- 🐞 修复 `router.push` 路径找不到时报错问题,`404、401 界面` 已移入到 `main` 主布局里(之前全屏)
+- 🐞 修复 [全局修改组件大小失效了](https://gitee.com/lyt-top/vue-next-admin/issues/I551RP),感谢[lg_boy](https://gitee.com/lg_boy)
+- 🐞 修复 [修改一下配置时,需要每次都清理 `window.localStorage` 浏览器永久缓存,配置才会生效,问题解决#I567R1](https://gitee.com/lyt-top/vue-next-admin/issues/I567R1),感谢[@lanbao123](https://gitee.com/lanbao123)
+- 🐞 修复 [标记为需要缓存的 tab 页后,再次从左侧菜单打开,还是显示被缓存的页面内容#I4UY3G](https://gitee.com/lyt-top/vue-next-admin/issues/I4UY3G),感谢@axcc1234、特别感谢群友@华仔
+- 🌈 重构 路由(`/src/router/index.ts`)解决 No match found for location with path "xxx"(前端控制,后端控制未解决) 问题
+
+## 2.0.2
+
+`2022.03.04`
+
+- 🌟 更新 依赖更新最新版本
+- 🎯 优化 Alert 提示添加边框
+- 🎯 优化 功能 / 数字滚动 演示界面
+- 🐞 修复 全局主题按钮颜色 :active 问题
+- 🐞 修复 Dropdown 下拉菜单样式问题
+- 🐞 修复 SvgIcon 图标组件动态切换时报警告问题,[SvgIcon 改变 name 时可能导致图像不显示](https://gitee.com/lyt-top/vue-next-admin/issues/I4VGE0),感谢@axcc1234
+
+## 2.0.1
+
+`2022.02.25`
+
+- 🌟 更新 依赖更新最新版本
+- 🎯 优化 svgIcon 图标组件
+- 🎯 优化 vite.config.ts 打包,感谢群友@YourObjec
+- 🐞 修复 tagViews 开启图标不显示问题(风格 5),感谢群友@坏人
+- 🐞 修复 [Element Plus 1.2.0-beta.6 以后的版本 el-table 在移动端无法左右滑动](https://gitee.com/lyt-top/vue-next-admin/issues/I4UPTP),感谢@YGDada
+
+## 2.0.0
+
+`2022.02.21`
+
+⚡⚡⚡ 此版本为破环性更新,优化内容如下:(谨慎更新!谨慎更新!!谨慎更新!!!)。演示界面建议直接覆盖文件。如需使用之前版本,请前往[gitee 发行版](https://gitee.com/lyt-top/vue-next-admin/releases) 进行对应版本下载。基础版会基于 `master` 分支进行修改
+
+- 🌟 更新 依赖更新最新版本
+- 🌟 更新 登录页、首页
+- 💔 移除 vue-web-screen-shot
+- 💔 移除 城市多级联动,完整 json 数据请去 [vue-next-admin-images/menu](https://gitee.com/lyt-top/vue-next-admin-images/tree/master/menu) 仓库查看
+- 💔 移除 功能/echartsTree 树图
+- 💔 移除 其它设置/Tagsview 风格 2、Tagsview 风格 3
+- 💔 移除 功能/验证器
+- 🚧 调整 src/api 编写方式
+- 🚧 调整 自定义封装公用组件演示,更好的维护
+- 🎉 新增 Volar 支持,vs code 配置参考 [Vue Language Features (Volar)](https://lyt-top.gitee.io/vue-next-admin-doc-preview/home/vscode/)
+- 🎉 新增 `SvgIcon` 支持本地 svg 图标使用
+- 🎉 新增 表单表格验证演示
+- 🎯 优化 全局主题(移除 success、info、warning、danger)
+- 🎯 优化 工作流(开源)
+- 🎯 优化 element plus svg 图标,`elementXXX` 改成 `ele-XXX`
+- 🌈 重构 深色模式
+- 🌹 合并 [处理 parent 的 h100 由于外层有 min-height 导致失效的问题](https://gitee.com/lyt-top/vue-next-admin/pulls/20),感谢@MaxNull、@21030442-mao
+- 🐞 修复 element plus 升级 `^1.3.0-beta.5` 后 组件 size 大小问题(大改:涉及布局、演示界面)
+- 🐞 修复 vs code 使用 Vue Language Features (Volar) 插件 代码报红问题(可以把公用的 ts 类型定义封装起来公用)
+
+## 1.2.2
+
+`2021.12.21`
+
+- 🌟 更新 依赖更新最新版本
+- 🎯 优化 iframes 滚动条问题
+- 🎯 优化 部署后每次都要强制刷新清浏览器缓存问题
+- 🎉 新增 工具类百分比验证演示
+- 🐞 修复 [tag-view 标签右键会超出浏览器 #I4KN78](https://gitee.com/lyt-top/vue-next-admin/issues/I4KN78)
+
+## 1.2.1
+
+`2021.12.12`
+
+- 🌟 更新 依赖更新最新版本
+- 🎯 优化 cropper 裁剪时卡顿问题 [#I4M2VQ](https://gitee.com/lyt-top/vue-next-admin/issues/I4M2VQ)
+- 🎯 优化 Wangeditor 富文本编辑器的问题 [#I4LPC1](https://gitee.com/lyt-top/vue-next-admin/issues/I4LPC1)、[#I4LM7I](https://gitee.com/lyt-top/vue-next-admin/issues/I4LM7I)
+- 🐞 修复 浏览器标题问题
+- 🐞 修复 element plus svg 图标引入
+- 🐞 修复 工作流不可以拖线连接问题
+
+## 1.2.0
+
+`2021.11.28`
+
+- 🌟 更新 依赖更新最新版本
+- 🎯 优化 深色模式
+- 🎯 优化 `/@/utils` 文件夹,合并删除单一内容
+- 🎯 优化 系统设置:菜单管理(新增、修改)、角色管理(新增菜单权限)、用户管理、部门管理、字典管理
+- 🎯 优化 登录界面逻辑、权限管理逻辑
+- 🎯 优化 同步 [vue-next-admin-images](https://gitee.com/lyt-top/vue-next-admin-images/tree/master/menu) 后端控制菜单模拟数据
+- 🎉 新增 适配 Font Icon 向 SVG Icon 迁移(改动大,"element-plus": "^1.2.0-beta.4" 谨慎更新)
+- 🐞 修复 热更新问题,感谢@甜蜜蜜
+- 🐞 修复 页面/element 字体图标演示
+- 🐞 修复 功能/图标选择器演示,新增高级功能 [issues #I4GJXQ](https://gitee.com/lyt-top/vue-next-admin/issues/I4GJXQ)
+
+## 1.1.2
+
+`2021.10.17`
+
+- 🌟 更新 依赖更新最新版本
+- 🐞 修复 开启全屏时,刷新界面被还原成未全屏的状态
+- 🎯 优化 tagsView 右键菜单关闭逻辑
+- 🎯 优化 wangeditor 富文本编辑器(增加双向绑定)
+- 🎉 新增 工作流(暂不开源)
+- 🎉 新增 基础版 ts(不带国际化),切换 `vue-next-admin-template` 分支
+
+## 1.1.1
+
+`2021.09.25`
+
+- 🌟 更新 依赖更新最新版本(`"element-plus": "^1.1.0-beta.13"` 版本运行错误,`^1.1.0-beta.16`修复横向菜单卡死问题)
+- 🐞 修复 Dialog 弹窗位置错误、Drawer 抽屉内边距、el-menu 菜单收起时背景色问题
+- 🎯 优化 锁屏界面自动锁屏(s/秒)必须设置至少 1 秒
+- 🎉 新增 分栏布局,鼠标移入当前项时,显示当前项菜单内容
+- 🎉 新增 工作流(未完成)
+
+## 1.1.0
+
+`2021.09.10`
+
+- 🌟 更新 依赖更新最新版本
+- 🎯 优化 小屏模式下登录页二维码遮挡标题问题
+- 🎉 新增 图片验证器
+- 🎉 新增 动态复杂表单
+- 🎉 新增 工作流(未完成)
+- 🎉 新增 深色主题(伪深色,样式变动大,谨慎更新)
+
+## 1.0.18
+
+`2021.08.29`
+
+- 🌟 更新 依赖更新最新版本
+- 🎯 优化 权限组件去掉顶级 div(`/src/components/auth`)
+- 🎉 新增 布局配置添加恢复默认按钮
+- 🐞 修复 升级 element plus 1.1.0-beta.7后项目无法启动、el-menu 菜单
+- 🐞 修复 表格固定列时的层级、设置了相对定位时,遮挡左侧导航菜单问题
+
+## 1.0.17
+
+`2021.08.22`
+
+- 🌟 更新 依赖更新最新版本
+- 🎯 优化 去除设置布局切换,重置主题样式(initSetLayoutChange),切换布局需手动设置样式,设置的样式自动同步各布局
+- 🎯 优化 Dropdown 下拉菜单用户账号靠边时换行问题
+- 🎯 优化 左侧导航菜单,共用菜单树,防止 `布局配置` 设置 `菜单 / 顶栏` 时,样式丢失等问题
+- 🐞 修复 固定 header 后没有回到顶部的 bug,拉取项目后运行不起来的 bug。!14,感谢@wjs0509
+- 🐞 修复 tagView 右键全屏后,浏览器窗口大小发生任何变化都会导致左边菜单显示出来,并且可点击打开对应页面。I46E6T
+- 🐞 修复 默认设置 `菜单 / 顶栏` 样式不生效问题(/@/src/store/modules/themeConfig.ts)
+
+## 1.0.16
+
+`2021.08.14`
+
+- 🌟 更新 依赖更新最新版本
+- 🎯 优化 菜单高亮(详情且详情设置了 meta.isHide 时,顶级菜单高亮),感谢群友@YourObject
+- 🎯 优化 详情路径写法:如父级(/pages/filtering),那么详情为(/pages/filtering/details?id=1)。这样写可实现(详情时,父级菜单高亮),否则写成(/pages/filteringDetails?id=1)顶级菜单将不会高亮。可参考:`页面/过滤筛选组件`,点击当前图片进行测试
+- 🎯 优化 tagsView 右键菜单全屏时,打开的界面高度问题
+- 🎯 优化 图表批量 resize 问题
+- 🐞 修复 菜单收起时(设置全局主题:primary 且有二级菜单时),文字高亮颜色不对
+- 🐞 修复 国际化 #I43NPE。可参考:`页面/过滤筛选组件`,点击顶部语言切换,进行底部分页国际化查看
+
+## 1.0.15
+
+`2021.08.06`
+
+- 🌟 更新 依赖更新最新版本
+- 🎯 优化 tagsView 右键菜单点击时的字段名(id 已修改成 contextMenuClickId)与路由中返回的 id 名冲突问题,感谢群友@伯牙已遇钟子期
+- 🎉 新增 多个 form 表单验证界面演示
+
+## 1.0.14
+
+`2021.07.29`
+
+- 🌟 更新 依赖更新最新版本(vue、vuex、vue-router),出现问题,请手动降级。版本查看:vnpm
+- 🎯 优化 数据可视化图表演示加载卡顿问题、优化有图表的演示界面
+- 🎯 优化 路由参数演示界面
+- 🎯 优化 tagsView 操作演示界面,由于存在相同路由多标签,必须要传全部参数值(query 或者 params)
+- 🎉 新增 开启 TagsView 共用,开启时:(多个路由菜单共用一个详情组件(参数为后点击的覆盖前面点击的),tagsView 中只会出现一个(不支持同时出现多个 tagsView 标签))。关闭时:(多个路由菜单共用一个详情组件,参数不同,会同时出现多个 tagsView 标签)
+- 🐞 修复 tagsView 共用(单标签)时,右键菜单功能点击,参数不对的问题(第 2n+个参数未覆盖第一个参数值)
+- 🐞 修复 多 tagsView 标签(参数不同)、单个 tagsView 标签公用(参数不同)所带来的刷新功能、横向自动滚动等问题
+- 🐞 修复 处理全屏若干问题,pr!12,感谢群友@另一个前端
+
+## 1.0.13
+
+`2021.07.25`
+
+- 🌟 更新 依赖更新最新版本
+- 🎉 新增 数据可视化演示界面(/visualizingDemo1、/visualizingDemo2)
+- 🎉 新增 登录页扫码登录
+
+## 1.0.12
+
+`2021.07.16`
+
+- 🌟 更新 依赖更新最新版本
+- 🎉 新增 数据可视化演示空界面(待完善)
+- 🎯 优化 tagsView 动态路由(xxx/:id/:name)时的右键菜单刷新、关闭其它时参数丢失问题(2021.07.15 优化)
+- 🐞 修复 路由带参数时,复制路径到登录页,跳转后参数消失的问题
+- 🐞 修复 设置多个外链,点击后,页面内容停留在上一个内容(内容未改变)、国际化处理、打开新窗口 sessionStorage 共享等
+
+## 1.0.11
+
+`2021.07.14`
+
+- 🌟 更新 依赖更新最新版本
+- 🎉 新增 路由参数、图片懒加载界面演示
+- ⚠️ 警告 Form 表单 `binding value must be a string or number`,解决:加上 `label-position="top"` 不报警告(等待官方修复)
+- 🎯 优化 锁屏界面动画效果、首页图表显示
+- 🎯 优化 tagsView 右键菜单 `关闭` 功能逻辑
+- 🐞 修复 开启 TagsView 拖拽报错及小于 `1000px` 时自动设置禁止拖拽(#I3ZRRI)
+- 🐞 修复 `iframe 内嵌、外链` 高度问题,使用 computed 进行计算
+- 🐞 修复 默认布局开启 `侧边栏 Logo` 与关闭 `菜单水平折叠`,切换到横向布局时,菜单看不见的问题
+- 🐞 修复 切换不同布局时,再去开启 `经典布局分割菜单` 功能不生效问题
+- 🐞 修复 浏览器窗口标题中/英文切换不实时生效的问题
+- 🐞 修复 切换布局时,某些功能不可以使用。部分界面不需要取消事件监听(proxy.mittBus.off('xxx'))
+- 🐞 修复 动态路由带参数,router-link 跳转问题(#I3YX6G)
+- 🐞 修复 横向菜单有二级菜单时,点击子级菜单不高亮问题
+- 🐞 修复 功能 tagsView 操作演示不生效
+
+## 1.0.10
+
+`2021.07.07`
+
+- 🌟 更新 依赖更新最新版本(字体图标无问题)
+- 🎯 优化 内嵌 iframe、外链,解决 tagsView 刷新问题
+
+## 1.0.9
+
+`2021.07.02`
+
+- 🌟 更新 依赖更新最新版本
+- 🎯 优化 图标选择器设置宽度、v-model 等问题
+- 🎯 优化 滚动通知栏在手机上的体验
+- 🎯 优化 系统管理/新增菜单(编辑菜单),使用 `图标选择器` 进行模拟
+- 🎯 优化 字体图标(自动载入) 逻辑
+- 🐞 修复 screenfull 全屏时,按键盘 esc 键图标不改变问题,感谢群友@伯牙已遇钟子期
+
+## 1.0.8
+
+`2021.06.29`
+
+- 🌟 更新 依赖更新最新版本
+- 🎉 新增 表单中英文切换演示
+- 🎯 优化 登录页查看密码 icon 图标
+- 🎯 优化 图标选择器
+- 🎯 优化 拖动指令
+- 🐞 修复 form 表单在页面小于 576px 时的排版问题
+
+## 1.0.7
+
+`2021.06.24`
+
+- 🌟 更新 依赖更新最新版本
+- 🎉 新增 拖动指令及其演示界面
+- 🎯 优化 锁屏界面,解锁提示
+- 🎯 优化 登录页在手机上显示的效果
+
+## 1.0.6
+
+`2021.06.23`
+
+- 🎯 优化 去掉内嵌 iframe 内边距(padding)
+- 🎯 优化 城市多级联动组件
+- 🎯 优化 Tree 树形控件改成表格组件
+- 🐞 修复 Cascader 级联选择器高度问题
+
+## 1.0.5
+
+`2021.06.22`
+
+- 🌟 更新 vite 降级为@vite2.3.7,降级方法 `cnpm install vite@2.3.7`,防止 element plus 字体图标消失
+- 🐞 修复 开启后端控制路由(isRequestRoutes = true)时,内嵌 iframe、外链不可使用的问题
+
+## 1.0.4
+
+`2021.06.19`
+
+- 🌟 更新 依赖更新最新版本("vite": "^2.3.7")热更新无问题
+- 🎉 新增 深克隆工具,方便开发,感谢@kangert(#6)
+- 🎯 优化 vuex 模块自动导入。感谢@kangert(#4),感谢群友@web 小学生-第五君
+- 🎯 优化 类型定义提高编码体验,修复不能将类型“string | undefined”分配给类型“string”的问题。感谢@kangert(#5)
+- 🎯 优化 `layout` 文件夹移动到与 `views` 文件夹同级(改动较大,`/@/views/layout` 变成 `/@/layout`)
+- 🎯 优化 页面有 `console.log` 时 `eslint` 不生效问题
+- 🎯 优化 页面、ts 中 `any` 类型问题(改动较大)
+- 🎯 优化 登录页在手机上显示的效果
+- 🎯 优化 多行注释信息,鼠标放到方法名即可查看,更加直观的知道方法参数等。引入方法时需去掉以 `.ts` 结尾的后缀(改动较大)
+- 🎯 优化 移除 `utils/storage.ts` 下的旧写法(改动较大)
+- 🎯 优化 拆分 `router` 下内容,路由、前端、后端控制分开写,方便理解
+- 🐞 修复 鼠标移入顶部用户信息栏 `开/关全屏` 文字反向问题
+- 🐞 修复 热更新时,NextLoading(界面 loading) 不消失问题 `window.nextLoading === undefined`
+- 🐞 修复 vuex 中不可以使用 `/@/api/xxx` 下的接口调用问题
+
+## 1.0.3
+
+`2021.06.02`
+
+- ❄️ 删除 G6 思维导图界面
+- 🌟 更新 手动更新 vue、vue-router、vuex 到最近最多人使用的版本,出现不可预测的问题请降低版本。版本查看:vue 版本查看
+- 🐞 修复 开启后端控制路由 `isRequestRoutes` 在非首页刷新页面后,回到首页的问题,感谢群友@伯牙已遇钟子期
+
+## 1.0.2
+
+`2021.06.01`
+
+- 🌟 更新 依赖更新最新版本
+- 🐞 修复 菜单搜索中文不可以搜索的问题,感谢群友@逍遥天意
+
+## 1.0.1
+
+`2021.05.31`
+
+- 🎉 新增 更新日志文件 `CHANGELOG.md`,以后每次更新都会在这里显示对应内容
+- 🌟 更新 依赖更新最新版本
+- 🐞 修复 分栏、经典布局路由设置 `meta.isHide` 为 `true` 时报错问题,感谢群友@29、@芭芭拉
+- 🐞 修复 经典布局点击 `tagsView` 左侧菜单数据不变问题
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000..6f6a7ea
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2021 lyt-Top
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
\ No newline at end of file
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..b9dd6d0
--- /dev/null
+++ b/README.md
@@ -0,0 +1,57 @@
+
+
+#### 🌈 介绍
+
+基于 vue3.x + CompositionAPI + typescript + vite + element plus + vue-router-next + next.vuex,适配手机、平板、pc 的后台开源免费模板,希望减少工作量,帮助大家实现快速开发。
+
+#### 🚧 安装 cnpm、yarn
+
+- 复制代码(桌面 cmd 运行) `npm install -g cnpm --registry=https://registry.npm.taobao.org`
+- 复制代码(桌面 cmd 运行) `npm install -g yarn`
+
+#### 🏭 环境支持
+
+| Edge | last 2 versions | last 2 versions | last 2 versions |
+| ------------------------------------------------------------------------ | --------------------------------------------------------------------------------- | ------------------------------------------------------------------------------ | ------------------------------------------------------------------------------ |
+|  |  |  |  |
+
+> 由于 Vue3 不再支持 IE11,故而 ElementPlus 也不支持 IE11 及之前版本。
+#### ⚡ 使用说明
+
+建议使用 cnpm,因为 yarn 有时会报错。node 版本[v16.x ~ v20.x)
+
+```bash
+# 克隆项目
+git clone -b v3.2 https://gitee.com/tiger1103/gfast-ui.git
+# 进入项目
+cd gfast-ui
+# 安装依赖
+npm install --registry=https://registry.npmmirror.com
+# 运行项目
+npm run dev
+# 打包发布
+npm run build
+```
+## ❤特别鸣谢
+
+* 感谢[VUE-NEXT-ADMIN](https://github.com/lyt-Top/vue-next-admin)
diff --git a/index.html b/index.html
new file mode 100644
index 0000000..60f47c4
--- /dev/null
+++ b/index.html
@@ -0,0 +1,22 @@
+
+
+
+
+
+
+
+
+
+ gfast3.2后台管理系统
+
+
+
+
+
+
diff --git a/package-lock.json b/package-lock.json
new file mode 100644
index 0000000..79609c4
--- /dev/null
+++ b/package-lock.json
@@ -0,0 +1,5311 @@
+{
+ "name": "vue-next-admin",
+ "version": "2.4.33",
+ "lockfileVersion": 3,
+ "requires": true,
+ "packages": {
+ "": {
+ "name": "vue-next-admin",
+ "version": "2.4.33",
+ "license": "MIT",
+ "dependencies": {
+ "@codemirror/lang-javascript": "^6.1.1",
+ "@codemirror/theme-one-dark": "^6.1.0",
+ "@element-plus/icons-vue": "^2.3.1",
+ "axios": "1.8.2",
+ "codemirror": "^6.0.1",
+ "countup.js": "^2.8.0",
+ "cropperjs": "^1.6.0",
+ "echarts": "^5.5.0",
+ "echarts-gl": "^2.0.9",
+ "echarts-wordcloud": "^2.1.0",
+ "element-plus": "^2.10.7",
+ "js-cookie": "^3.0.5",
+ "jsplumb": "^2.15.6",
+ "lodash": "^4.17.21",
+ "mitt": "^3.0.1",
+ "nprogress": "^0.2.0",
+ "pinia": "^2.1.7",
+ "print-js": "^1.6.0",
+ "qrcodejs2-fixes": "^0.0.2",
+ "qs": "^6.12.0",
+ "screenfull": "^6.0.2",
+ "sortablejs": "^1.15.2",
+ "spark-md5": "^3.0.2",
+ "splitpanes": "^3.1.5",
+ "vue": "^3.4.21",
+ "vue-clipboard3": "^2.0.0",
+ "vue-codemirror": "^6.1.1",
+ "vue-demi": "^0.14.7",
+ "vue-grid-layout": "^3.0.0-beta1",
+ "vue-i18n": "11.1.2",
+ "vue-router": "^4.3.0",
+ "vue-simple-uploader": "^1.0.0-beta.5",
+ "vue-ueditor-wrap": "^3.0.8"
+ },
+ "devDependencies": {
+ "@types/node": "^20.11.28",
+ "@types/nprogress": "^0.2.3",
+ "@types/sortablejs": "^1.15.8",
+ "@typescript-eslint/eslint-plugin": "^7.2.0",
+ "@typescript-eslint/parser": "^7.2.0",
+ "@vitejs/plugin-vue": "^5.1.2",
+ "@vue/compiler-sfc": "^3.4.21",
+ "dotenv": "^16.0.1",
+ "eslint": "^8.57.0",
+ "eslint-plugin-vue": "^9.23.0",
+ "prettier": "^3.2.5",
+ "sass": "^1.80.7",
+ "sass-loader": "^16.0.3",
+ "typescript": "^5.4.2",
+ "vite": "^5.1.2",
+ "vite-plugin-cdn-import": "^0.3.5",
+ "vite-plugin-compression": "^0.5.1",
+ "vite-plugin-vue-setup-extend-plus": "^0.1.0",
+ "vue-eslint-parser": "^9.4.1"
+ },
+ "engines": {
+ "node": ">=16.0.0",
+ "npm": ">=7.0.0"
+ }
+ },
+ "node_modules/@aashutoshrathi/word-wrap": {
+ "version": "1.2.6",
+ "resolved": "https://registry.npmmirror.com/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz",
+ "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/@babel/helper-string-parser": {
+ "version": "7.24.8",
+ "resolved": "https://registry.npmmirror.com/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz",
+ "integrity": "sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-validator-identifier": {
+ "version": "7.24.7",
+ "resolved": "https://registry.npmmirror.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz",
+ "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/parser": {
+ "version": "7.25.3",
+ "resolved": "https://registry.npmmirror.com/@babel/parser/-/parser-7.25.3.tgz",
+ "integrity": "sha512-iLTJKDbJ4hMvFPgQwwsVoxtHyWpKKPBrxkANrSYewDPaPpT5py5yeVkgPIJ7XYXhndxJpaA3PyALSXQ7u8e/Dw==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/types": "^7.25.2"
+ },
+ "bin": {
+ "parser": "bin/babel-parser.js"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@babel/runtime": {
+ "version": "7.25.0",
+ "resolved": "https://registry.npmmirror.com/@babel/runtime/-/runtime-7.25.0.tgz",
+ "integrity": "sha512-7dRy4DwXwtzBrPbZflqxnvfxLF8kdZXPkhymtDeFoFqE6ldzjQFgYTtYIFARcLEYDrqfBfYcZt1WqFxRoyC9Rw==",
+ "license": "MIT",
+ "dependencies": {
+ "regenerator-runtime": "^0.14.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/types": {
+ "version": "7.25.2",
+ "resolved": "https://registry.npmmirror.com/@babel/types/-/types-7.25.2.tgz",
+ "integrity": "sha512-YTnYtra7W9e6/oAZEHj0bJehPRUlLH9/fbpT5LfB0NhQXyALCRkRs3zH9v07IYhkgpqX6Z78FnuccZr/l4Fs4Q==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/helper-string-parser": "^7.24.8",
+ "@babel/helper-validator-identifier": "^7.24.7",
+ "to-fast-properties": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@codemirror/autocomplete": {
+ "version": "6.3.2",
+ "resolved": "https://registry.npmmirror.com/@codemirror/autocomplete/-/autocomplete-6.3.2.tgz",
+ "integrity": "sha512-+VzxrHWkuvSSt0fw4I57SULo/NMrLnNgm6JHrkbIYfDw9jZJNTruCwkv32TCqSeC8xIXhYWMuxawwr/xOoHr8w==",
+ "dependencies": {
+ "@codemirror/language": "^6.0.0",
+ "@codemirror/state": "^6.0.0",
+ "@codemirror/view": "^6.5.0",
+ "@lezer/common": "^1.0.0"
+ },
+ "peerDependencies": {
+ "@codemirror/language": "^6.0.0",
+ "@codemirror/state": "^6.0.0",
+ "@codemirror/view": "^6.0.0",
+ "@lezer/common": "^1.0.0"
+ }
+ },
+ "node_modules/@codemirror/commands": {
+ "version": "6.1.2",
+ "resolved": "https://registry.npmmirror.com/@codemirror/commands/-/commands-6.1.2.tgz",
+ "integrity": "sha512-sO3jdX1s0pam6lIdeSJLMN3DQ6mPEbM4yLvyKkdqtmd/UDwhXA5+AwFJ89rRXm6vTeOXBsE5cAmlos/t7MJdgg==",
+ "dependencies": {
+ "@codemirror/language": "^6.0.0",
+ "@codemirror/state": "^6.0.0",
+ "@codemirror/view": "^6.0.0",
+ "@lezer/common": "^1.0.0"
+ }
+ },
+ "node_modules/@codemirror/lang-javascript": {
+ "version": "6.1.1",
+ "resolved": "https://registry.npmmirror.com/@codemirror/lang-javascript/-/lang-javascript-6.1.1.tgz",
+ "integrity": "sha512-F4+kiuC5d5dUSJmff96tJQwpEXs/tX/4bapMRnZWW6bHKK1Fx6MunTzopkCUWRa9bF87GPmb9m7Qtg7Yv8f3uQ==",
+ "dependencies": {
+ "@codemirror/autocomplete": "^6.0.0",
+ "@codemirror/language": "^6.0.0",
+ "@codemirror/lint": "^6.0.0",
+ "@codemirror/state": "^6.0.0",
+ "@codemirror/view": "^6.0.0",
+ "@lezer/common": "^1.0.0",
+ "@lezer/javascript": "^1.0.0"
+ }
+ },
+ "node_modules/@codemirror/language": {
+ "version": "6.3.1",
+ "resolved": "https://registry.npmmirror.com/@codemirror/language/-/language-6.3.1.tgz",
+ "integrity": "sha512-MK+G1QKaGfSEUg9YEFaBkMBI6j1ge4VMBPZv9fDYotw7w695c42x5Ba1mmwBkesYnzYFBfte6Hh9TDcKa6xORQ==",
+ "dependencies": {
+ "@codemirror/state": "^6.0.0",
+ "@codemirror/view": "^6.0.0",
+ "@lezer/common": "^1.0.0",
+ "@lezer/highlight": "^1.0.0",
+ "@lezer/lr": "^1.0.0",
+ "style-mod": "^4.0.0"
+ }
+ },
+ "node_modules/@codemirror/lint": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmmirror.com/@codemirror/lint/-/lint-6.1.0.tgz",
+ "integrity": "sha512-mdvDQrjRmYPvQ3WrzF6Ewaao+NWERYtpthJvoQ3tK3t/44Ynhk8ZGjTSL9jMEv8CgSMogmt75X8ceOZRDSXHtQ==",
+ "dependencies": {
+ "@codemirror/state": "^6.0.0",
+ "@codemirror/view": "^6.0.0",
+ "crelt": "^1.0.5"
+ }
+ },
+ "node_modules/@codemirror/search": {
+ "version": "6.2.3",
+ "resolved": "https://registry.npmmirror.com/@codemirror/search/-/search-6.2.3.tgz",
+ "integrity": "sha512-V9n9233lopQhB1dyjsBK2Wc1i+8hcCqxl1wQ46c5HWWLePoe4FluV3TGHoZ04rBRlGjNyz9DTmpJErig8UE4jw==",
+ "dependencies": {
+ "@codemirror/state": "^6.0.0",
+ "@codemirror/view": "^6.0.0",
+ "crelt": "^1.0.5"
+ }
+ },
+ "node_modules/@codemirror/state": {
+ "version": "6.1.3",
+ "resolved": "https://registry.npmmirror.com/@codemirror/state/-/state-6.1.3.tgz",
+ "integrity": "sha512-0Rn7vadZ6EgHaKdIOwyhBWLdPDh1JM5USYqXjxwrvpmTKWu4wQ77twgAYEg1MU282XcrnV4ZqFf+00bu6UPCyg=="
+ },
+ "node_modules/@codemirror/theme-one-dark": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmmirror.com/@codemirror/theme-one-dark/-/theme-one-dark-6.1.0.tgz",
+ "integrity": "sha512-AiTHtFRu8+vWT9wWUWDM+cog6ZwgivJogB1Tm/g40NIpLwph7AnmxrSzWfvJN5fBVufsuwBxecQCNmdcR5D7Aw==",
+ "dependencies": {
+ "@codemirror/language": "^6.0.0",
+ "@codemirror/state": "^6.0.0",
+ "@codemirror/view": "^6.0.0",
+ "@lezer/highlight": "^1.0.0"
+ }
+ },
+ "node_modules/@codemirror/view": {
+ "version": "6.5.0",
+ "resolved": "https://registry.npmmirror.com/@codemirror/view/-/view-6.5.0.tgz",
+ "integrity": "sha512-dapE7AywjyYoHBHn4n+wCRKFqMEmYZHHlfyoSO+e1P6MK4az1wg9t7mfwbdI9mXuBzmPBX7NmU3Xmq+qmxDOLw==",
+ "dependencies": {
+ "@codemirror/state": "^6.0.0",
+ "style-mod": "^4.0.0",
+ "w3c-keyname": "^2.2.4"
+ }
+ },
+ "node_modules/@ctrl/tinycolor": {
+ "version": "3.5.0",
+ "resolved": "https://registry.npmjs.org/@ctrl/tinycolor/-/tinycolor-3.5.0.tgz",
+ "integrity": "sha512-tlJpwF40DEQcfR/QF+wNMVyGMaO9FQp6Z1Wahj4Gk3CJQYHwA2xVG7iKDFdW6zuxZY9XWOpGcfNCTsX4McOsOg==",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@element-plus/icons-vue": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmmirror.com/@element-plus/icons-vue/-/icons-vue-2.3.1.tgz",
+ "integrity": "sha512-XxVUZv48RZAd87ucGS48jPf6pKu0yV5UCg9f4FFwtrYxXOwWuVJo6wOvSLKEoMQKjv8GsX/mhP6UsC1lRwbUWg==",
+ "peerDependencies": {
+ "vue": "^3.2.0"
+ }
+ },
+ "node_modules/@esbuild/aix-ppc64": {
+ "version": "0.19.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.19.12.tgz",
+ "integrity": "sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==",
+ "cpu": [
+ "ppc64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "aix"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/android-arm": {
+ "version": "0.19.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.12.tgz",
+ "integrity": "sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/android-arm64": {
+ "version": "0.19.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.12.tgz",
+ "integrity": "sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/android-x64": {
+ "version": "0.19.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.12.tgz",
+ "integrity": "sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/darwin-arm64": {
+ "version": "0.19.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.12.tgz",
+ "integrity": "sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/darwin-x64": {
+ "version": "0.19.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.12.tgz",
+ "integrity": "sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/freebsd-arm64": {
+ "version": "0.19.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.12.tgz",
+ "integrity": "sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/freebsd-x64": {
+ "version": "0.19.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.12.tgz",
+ "integrity": "sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-arm": {
+ "version": "0.19.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.12.tgz",
+ "integrity": "sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-arm64": {
+ "version": "0.19.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.12.tgz",
+ "integrity": "sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-ia32": {
+ "version": "0.19.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.12.tgz",
+ "integrity": "sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-loong64": {
+ "version": "0.19.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.12.tgz",
+ "integrity": "sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==",
+ "cpu": [
+ "loong64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-mips64el": {
+ "version": "0.19.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.12.tgz",
+ "integrity": "sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==",
+ "cpu": [
+ "mips64el"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-ppc64": {
+ "version": "0.19.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.12.tgz",
+ "integrity": "sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==",
+ "cpu": [
+ "ppc64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-riscv64": {
+ "version": "0.19.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.12.tgz",
+ "integrity": "sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==",
+ "cpu": [
+ "riscv64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-s390x": {
+ "version": "0.19.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.12.tgz",
+ "integrity": "sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==",
+ "cpu": [
+ "s390x"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/linux-x64": {
+ "version": "0.19.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.12.tgz",
+ "integrity": "sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/netbsd-x64": {
+ "version": "0.19.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.12.tgz",
+ "integrity": "sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "netbsd"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/openbsd-x64": {
+ "version": "0.19.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.12.tgz",
+ "integrity": "sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "openbsd"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/sunos-x64": {
+ "version": "0.19.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.12.tgz",
+ "integrity": "sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "sunos"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/win32-arm64": {
+ "version": "0.19.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.12.tgz",
+ "integrity": "sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/win32-ia32": {
+ "version": "0.19.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.12.tgz",
+ "integrity": "sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@esbuild/win32-x64": {
+ "version": "0.19.12",
+ "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.12.tgz",
+ "integrity": "sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@eslint-community/eslint-utils": {
+ "version": "4.4.0",
+ "resolved": "https://registry.npmmirror.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz",
+ "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==",
+ "dev": true,
+ "dependencies": {
+ "eslint-visitor-keys": "^3.3.0"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "peerDependencies": {
+ "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0"
+ }
+ },
+ "node_modules/@eslint-community/regexpp": {
+ "version": "4.10.0",
+ "resolved": "https://registry.npmmirror.com/@eslint-community/regexpp/-/regexpp-4.10.0.tgz",
+ "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==",
+ "dev": true,
+ "engines": {
+ "node": "^12.0.0 || ^14.0.0 || >=16.0.0"
+ }
+ },
+ "node_modules/@eslint/eslintrc": {
+ "version": "2.1.4",
+ "resolved": "https://registry.npmmirror.com/@eslint/eslintrc/-/eslintrc-2.1.4.tgz",
+ "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==",
+ "dev": true,
+ "dependencies": {
+ "ajv": "^6.12.4",
+ "debug": "^4.3.2",
+ "espree": "^9.6.0",
+ "globals": "^13.19.0",
+ "ignore": "^5.2.0",
+ "import-fresh": "^3.2.1",
+ "js-yaml": "^4.1.0",
+ "minimatch": "^3.1.2",
+ "strip-json-comments": "^3.1.1"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ }
+ },
+ "node_modules/@eslint/js": {
+ "version": "8.57.0",
+ "resolved": "https://registry.npmmirror.com/@eslint/js/-/js-8.57.0.tgz",
+ "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ }
+ },
+ "node_modules/@floating-ui/core": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.1.0.tgz",
+ "integrity": "sha512-zbsLwtnHo84w1Kc8rScAo5GMk1GdecSlrflIbfnEBJwvTSj1SL6kkOYV+nHraMCPEy+RNZZUaZyL8JosDGCtGQ=="
+ },
+ "node_modules/@floating-ui/dom": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.1.1.tgz",
+ "integrity": "sha512-TpIO93+DIujg3g7SykEAGZMDtbJRrmnYRCNYSjJlvIbGhBjRSNTLVbNeDQBrzy9qDgUbiWdc7KA0uZHZ2tJmiw==",
+ "dependencies": {
+ "@floating-ui/core": "^1.1.0"
+ }
+ },
+ "node_modules/@humanwhocodes/config-array": {
+ "version": "0.11.14",
+ "resolved": "https://registry.npmmirror.com/@humanwhocodes/config-array/-/config-array-0.11.14.tgz",
+ "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==",
+ "deprecated": "Use @eslint/config-array instead",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@humanwhocodes/object-schema": "^2.0.2",
+ "debug": "^4.3.1",
+ "minimatch": "^3.0.5"
+ },
+ "engines": {
+ "node": ">=10.10.0"
+ }
+ },
+ "node_modules/@humanwhocodes/module-importer": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmmirror.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz",
+ "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==",
+ "dev": true,
+ "engines": {
+ "node": ">=12.22"
+ }
+ },
+ "node_modules/@humanwhocodes/object-schema": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmmirror.com/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz",
+ "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==",
+ "deprecated": "Use @eslint/object-schema instead",
+ "dev": true,
+ "license": "BSD-3-Clause"
+ },
+ "node_modules/@interactjs/actions": {
+ "version": "1.10.17",
+ "resolved": "https://registry.npmjs.org/@interactjs/actions/-/actions-1.10.17.tgz",
+ "integrity": "sha512-wyB1ZqpaZy5gmz6VDqK9KWh98xKnFgL7VyLvxHODFi9V0IYX4HJAAOBlhtfze0D1R1f1cY+gqPDK+dLaHMlE+w==",
+ "optionalDependencies": {
+ "@interactjs/interact": "1.10.17"
+ },
+ "peerDependencies": {
+ "@interactjs/core": "1.10.17",
+ "@interactjs/utils": "1.10.17"
+ }
+ },
+ "node_modules/@interactjs/auto-scroll": {
+ "version": "1.10.17",
+ "resolved": "https://registry.npmjs.org/@interactjs/auto-scroll/-/auto-scroll-1.10.17.tgz",
+ "integrity": "sha512-IQcW7N3xOaoL8RnAGOGMk0Y2gue7L4S3BT6Id4VBBu8so163DtLiZVW6jXu9rKVntzbluaAeqNZlfAVyu3kIWg==",
+ "optionalDependencies": {
+ "@interactjs/interact": "1.10.17"
+ },
+ "peerDependencies": {
+ "@interactjs/utils": "1.10.17"
+ }
+ },
+ "node_modules/@interactjs/auto-start": {
+ "version": "1.10.17",
+ "resolved": "https://registry.npmjs.org/@interactjs/auto-start/-/auto-start-1.10.17.tgz",
+ "integrity": "sha512-qYVxhAbYnwxjD/NLEegUoAST7WASJ4VmWNjsyWRx/js5Op+I4E2zteARIeZGgrutcGIXMCcQzhCMgE3PjOpbpw==",
+ "optionalDependencies": {
+ "@interactjs/interact": "1.10.17"
+ },
+ "peerDependencies": {
+ "@interactjs/core": "1.10.17",
+ "@interactjs/utils": "1.10.17"
+ }
+ },
+ "node_modules/@interactjs/core": {
+ "version": "1.10.17",
+ "resolved": "https://registry.npmjs.org/@interactjs/core/-/core-1.10.17.tgz",
+ "integrity": "sha512-rL9w+83HDRuXub8Ezqs+97CYLl/ne7bLT/sAeduUWaxYhsW9iOqBoob9JnkkCZOaOsYizWI1EWy0+fNc5ibtLQ==",
+ "peerDependencies": {
+ "@interactjs/utils": "1.10.17"
+ }
+ },
+ "node_modules/@interactjs/dev-tools": {
+ "version": "1.10.17",
+ "resolved": "https://registry.npmjs.org/@interactjs/dev-tools/-/dev-tools-1.10.17.tgz",
+ "integrity": "sha512-Oi9nEw3FfSwkNmW+V0WwdHqvzEkVHc24mH1v5EjRn60sqgrGLK9nTQ+NSuqcnUY8GxC3TkyuxnsOodxiadIRmA==",
+ "optionalDependencies": {
+ "@interactjs/interact": "1.10.17"
+ },
+ "peerDependencies": {
+ "@interactjs/modifiers": "1.10.17",
+ "@interactjs/utils": "1.10.17"
+ }
+ },
+ "node_modules/@interactjs/inertia": {
+ "version": "1.10.17",
+ "resolved": "https://registry.npmjs.org/@interactjs/inertia/-/inertia-1.10.17.tgz",
+ "integrity": "sha512-41vbYUjZIDCKt2/yhmjPrEW5+0uoL/hldFsll9pkvnLhmm12Xk0VXOlmR2zXKAmsTK3fJlKMyBYUX92qHLkyVQ==",
+ "dependencies": {
+ "@interactjs/offset": "1.10.17"
+ },
+ "optionalDependencies": {
+ "@interactjs/interact": "1.10.17"
+ },
+ "peerDependencies": {
+ "@interactjs/core": "1.10.17",
+ "@interactjs/modifiers": "1.10.17",
+ "@interactjs/utils": "1.10.17"
+ }
+ },
+ "node_modules/@interactjs/interact": {
+ "version": "1.10.17",
+ "resolved": "https://registry.npmjs.org/@interactjs/interact/-/interact-1.10.17.tgz",
+ "integrity": "sha512-NyKsf8EFudvdahBjPz1Gt5QnynVwa/2LUfBc2/w8QOnOBiyzUm0HLloJSaB8a50QbQkSWN243/Lgpd8GTMQvuQ==",
+ "dependencies": {
+ "@interactjs/core": "1.10.17",
+ "@interactjs/types": "1.10.17",
+ "@interactjs/utils": "1.10.17"
+ }
+ },
+ "node_modules/@interactjs/interactjs": {
+ "version": "1.10.17",
+ "resolved": "https://registry.npmjs.org/@interactjs/interactjs/-/interactjs-1.10.17.tgz",
+ "integrity": "sha512-hHmiukARbZhiM12zNKx0yQlFVl4C+NMeYNAYh6Mf9U3ZziQ47C+JEW8Gr7Zr/MxfNZyPu5nLKCpVQjh/JvBO9g==",
+ "dependencies": {
+ "@interactjs/actions": "1.10.17",
+ "@interactjs/auto-scroll": "1.10.17",
+ "@interactjs/auto-start": "1.10.17",
+ "@interactjs/core": "1.10.17",
+ "@interactjs/dev-tools": "1.10.17",
+ "@interactjs/inertia": "1.10.17",
+ "@interactjs/interact": "1.10.17",
+ "@interactjs/modifiers": "1.10.17",
+ "@interactjs/offset": "1.10.17",
+ "@interactjs/pointer-events": "1.10.17",
+ "@interactjs/reflow": "1.10.17",
+ "@interactjs/utils": "1.10.17"
+ }
+ },
+ "node_modules/@interactjs/modifiers": {
+ "version": "1.10.17",
+ "resolved": "https://registry.npmjs.org/@interactjs/modifiers/-/modifiers-1.10.17.tgz",
+ "integrity": "sha512-Dxw8kv9VBIxnhNvQncR6CKAGMzKXczLvuAUIdSPFYtyerX/XiDulJUqhR+jVKNp/WjF1DvdBxWo0kGGLbM84LQ==",
+ "dependencies": {
+ "@interactjs/snappers": "1.10.17"
+ },
+ "optionalDependencies": {
+ "@interactjs/interact": "1.10.17"
+ },
+ "peerDependencies": {
+ "@interactjs/core": "1.10.17",
+ "@interactjs/utils": "1.10.17"
+ }
+ },
+ "node_modules/@interactjs/offset": {
+ "version": "1.10.17",
+ "resolved": "https://registry.npmjs.org/@interactjs/offset/-/offset-1.10.17.tgz",
+ "integrity": "sha512-wWBnIQWgLrmJNTBbd/FdxHxAJjiXl/5ND8Jbw2DuP9gIGDxhFSdEt62Fgqimn9ICb8v8ycvSLObEmcvJF/8hQQ==",
+ "optionalDependencies": {
+ "@interactjs/interact": "1.10.17"
+ },
+ "peerDependencies": {
+ "@interactjs/core": "1.10.17",
+ "@interactjs/utils": "1.10.17"
+ }
+ },
+ "node_modules/@interactjs/pointer-events": {
+ "version": "1.10.17",
+ "resolved": "https://registry.npmjs.org/@interactjs/pointer-events/-/pointer-events-1.10.17.tgz",
+ "integrity": "sha512-VsfluouEKb8QRGyH6jQATCW+QdAd/3dkENS7rj2m+EcVUhz2Ob5mpMRopjALi4pwltMowqTfuJ4LtwMSX2G29A==",
+ "optionalDependencies": {
+ "@interactjs/interact": "1.10.17"
+ },
+ "peerDependencies": {
+ "@interactjs/core": "1.10.17",
+ "@interactjs/utils": "1.10.17"
+ }
+ },
+ "node_modules/@interactjs/reflow": {
+ "version": "1.10.17",
+ "resolved": "https://registry.npmjs.org/@interactjs/reflow/-/reflow-1.10.17.tgz",
+ "integrity": "sha512-ncpWP5k93FRQptEhjzPZsbuRRajd4rkW17lDavCrEjrDi/LHnYekWGqZTaFzfJ80n1x8xUm9ujDjxCTylNqEIA==",
+ "optionalDependencies": {
+ "@interactjs/interact": "1.10.17"
+ },
+ "peerDependencies": {
+ "@interactjs/core": "1.10.17",
+ "@interactjs/utils": "1.10.17"
+ }
+ },
+ "node_modules/@interactjs/snappers": {
+ "version": "1.10.17",
+ "resolved": "https://registry.npmjs.org/@interactjs/snappers/-/snappers-1.10.17.tgz",
+ "integrity": "sha512-m753DGsNOts797e3zDT6wqELoc+BlpIC1w+TyMyISRxU6n1RlS8Q6LHBGgwAgV79LHLaahv/a5haFF9H1VG0FQ==",
+ "optionalDependencies": {
+ "@interactjs/interact": "1.10.17"
+ },
+ "peerDependencies": {
+ "@interactjs/utils": "1.10.17"
+ }
+ },
+ "node_modules/@interactjs/types": {
+ "version": "1.10.17",
+ "resolved": "https://registry.npmjs.org/@interactjs/types/-/types-1.10.17.tgz",
+ "integrity": "sha512-X2JpoM7xUw0p9Me0tMaI0HNfcF/Hd07ZZlzpnpEMpGerUZOLoyeThrV9P+CrBHxZrluWJrigJbcdqXliFd0YMA=="
+ },
+ "node_modules/@interactjs/utils": {
+ "version": "1.10.17",
+ "resolved": "https://registry.npmjs.org/@interactjs/utils/-/utils-1.10.17.tgz",
+ "integrity": "sha512-sZAW08CkqgvqRjUIaLRjScjObcCzN9D75yekLA21EClYAZIhi4A+GEt2z/WqOCOksTaEPLYmQyhkpXcboc0LhQ=="
+ },
+ "node_modules/@intlify/core-base": {
+ "version": "11.1.2",
+ "resolved": "https://registry.npmmirror.com/@intlify/core-base/-/core-base-11.1.2.tgz",
+ "integrity": "sha512-nmG512G8QOABsserleechwHGZxzKSAlggGf9hQX0nltvSwyKNVuB/4o6iFeG2OnjXK253r8p8eSDOZf8PgFdWw==",
+ "license": "MIT",
+ "dependencies": {
+ "@intlify/message-compiler": "11.1.2",
+ "@intlify/shared": "11.1.2"
+ },
+ "engines": {
+ "node": ">= 16"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/kazupon"
+ }
+ },
+ "node_modules/@intlify/message-compiler": {
+ "version": "11.1.2",
+ "resolved": "https://registry.npmmirror.com/@intlify/message-compiler/-/message-compiler-11.1.2.tgz",
+ "integrity": "sha512-T/xbNDzi+Yv0Qn2Dfz2CWCAJiwNgU5d95EhhAEf4YmOgjCKktpfpiUSmLcBvK1CtLpPQ85AMMQk/2NCcXnNj1g==",
+ "license": "MIT",
+ "dependencies": {
+ "@intlify/shared": "11.1.2",
+ "source-map-js": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 16"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/kazupon"
+ }
+ },
+ "node_modules/@intlify/shared": {
+ "version": "11.1.2",
+ "resolved": "https://registry.npmmirror.com/@intlify/shared/-/shared-11.1.2.tgz",
+ "integrity": "sha512-dF2iMMy8P9uKVHV/20LA1ulFLL+MKSbfMiixSmn6fpwqzvix38OIc7ebgnFbBqElvghZCW9ACtzKTGKsTGTWGA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 16"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/kazupon"
+ }
+ },
+ "node_modules/@jridgewell/gen-mapping": {
+ "version": "0.3.3",
+ "resolved": "https://registry.npmmirror.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz",
+ "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==",
+ "dev": true,
+ "optional": true,
+ "peer": true,
+ "dependencies": {
+ "@jridgewell/set-array": "^1.0.1",
+ "@jridgewell/sourcemap-codec": "^1.4.10",
+ "@jridgewell/trace-mapping": "^0.3.9"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@jridgewell/resolve-uri": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmmirror.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz",
+ "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==",
+ "dev": true,
+ "optional": true,
+ "peer": true,
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@jridgewell/set-array": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmmirror.com/@jridgewell/set-array/-/set-array-1.1.2.tgz",
+ "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==",
+ "dev": true,
+ "optional": true,
+ "peer": true,
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@jridgewell/source-map": {
+ "version": "0.3.5",
+ "resolved": "https://registry.npmmirror.com/@jridgewell/source-map/-/source-map-0.3.5.tgz",
+ "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==",
+ "dev": true,
+ "optional": true,
+ "peer": true,
+ "dependencies": {
+ "@jridgewell/gen-mapping": "^0.3.0",
+ "@jridgewell/trace-mapping": "^0.3.9"
+ }
+ },
+ "node_modules/@jridgewell/sourcemap-codec": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmmirror.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz",
+ "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==",
+ "license": "MIT"
+ },
+ "node_modules/@jridgewell/trace-mapping": {
+ "version": "0.3.20",
+ "resolved": "https://registry.npmmirror.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz",
+ "integrity": "sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==",
+ "dev": true,
+ "optional": true,
+ "peer": true,
+ "dependencies": {
+ "@jridgewell/resolve-uri": "^3.1.0",
+ "@jridgewell/sourcemap-codec": "^1.4.14"
+ }
+ },
+ "node_modules/@lezer/common": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmmirror.com/@lezer/common/-/common-1.0.1.tgz",
+ "integrity": "sha512-8TR5++Q/F//tpDsLd5zkrvEX5xxeemafEaek7mUp7Y+bI8cKQXdSqhzTOBaOogETcMOVr0pT3BBPXp13477ciw=="
+ },
+ "node_modules/@lezer/highlight": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmmirror.com/@lezer/highlight/-/highlight-1.1.2.tgz",
+ "integrity": "sha512-CAun1WR1glxG9ZdOokTZwXbcwB7PXkIEyZRUMFBVwSrhTcogWq634/ByNImrkUnQhjju6xsIaOBIxvcRJtplXQ==",
+ "dependencies": {
+ "@lezer/common": "^1.0.0"
+ }
+ },
+ "node_modules/@lezer/javascript": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmmirror.com/@lezer/javascript/-/javascript-1.0.2.tgz",
+ "integrity": "sha512-IjOVeIRhM8IuafWNnk+UzRz7p4/JSOKBNINLYLsdSGuJS9Ju7vFdc82AlTt0jgtV5D8eBZf4g0vK4d3ttBNz7A==",
+ "dependencies": {
+ "@lezer/highlight": "^1.0.0",
+ "@lezer/lr": "^1.0.0"
+ }
+ },
+ "node_modules/@lezer/lr": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmmirror.com/@lezer/lr/-/lr-1.2.4.tgz",
+ "integrity": "sha512-L/52/oMJBFXXx8qBYF4UgktLP2geQ/qn5Fd8+5L/mqlLLCB9+qdKktFAtejd9FdFMaFx6lrP5rmLz4sN3Kplcg==",
+ "dependencies": {
+ "@lezer/common": "^1.0.0"
+ }
+ },
+ "node_modules/@nodelib/fs.scandir": {
+ "version": "2.1.5",
+ "resolved": "https://registry.npmmirror.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
+ "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
+ "dev": true,
+ "dependencies": {
+ "@nodelib/fs.stat": "2.0.5",
+ "run-parallel": "^1.1.9"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@nodelib/fs.stat": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmmirror.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
+ "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
+ "dev": true,
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@nodelib/fs.walk": {
+ "version": "1.2.8",
+ "resolved": "https://registry.npmmirror.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
+ "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
+ "dev": true,
+ "dependencies": {
+ "@nodelib/fs.scandir": "2.1.5",
+ "fastq": "^1.6.0"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@parcel/watcher": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmmirror.com/@parcel/watcher/-/watcher-2.5.0.tgz",
+ "integrity": "sha512-i0GV1yJnm2n3Yq1qw6QrUrd/LI9bE8WEBOTtOkpCXHHdyN3TAGgqAK/DAT05z4fq2x04cARXt2pDmjWjL92iTQ==",
+ "dev": true,
+ "hasInstallScript": true,
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "detect-libc": "^1.0.3",
+ "is-glob": "^4.0.3",
+ "micromatch": "^4.0.5",
+ "node-addon-api": "^7.0.0"
+ },
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ },
+ "optionalDependencies": {
+ "@parcel/watcher-android-arm64": "2.5.0",
+ "@parcel/watcher-darwin-arm64": "2.5.0",
+ "@parcel/watcher-darwin-x64": "2.5.0",
+ "@parcel/watcher-freebsd-x64": "2.5.0",
+ "@parcel/watcher-linux-arm-glibc": "2.5.0",
+ "@parcel/watcher-linux-arm-musl": "2.5.0",
+ "@parcel/watcher-linux-arm64-glibc": "2.5.0",
+ "@parcel/watcher-linux-arm64-musl": "2.5.0",
+ "@parcel/watcher-linux-x64-glibc": "2.5.0",
+ "@parcel/watcher-linux-x64-musl": "2.5.0",
+ "@parcel/watcher-win32-arm64": "2.5.0",
+ "@parcel/watcher-win32-ia32": "2.5.0",
+ "@parcel/watcher-win32-x64": "2.5.0"
+ }
+ },
+ "node_modules/@parcel/watcher-android-arm64": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmmirror.com/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.0.tgz",
+ "integrity": "sha512-qlX4eS28bUcQCdribHkg/herLe+0A9RyYC+mm2PXpncit8z5b3nSqGVzMNR3CmtAOgRutiZ02eIJJgP/b1iEFQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/watcher-darwin-arm64": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmmirror.com/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.0.tgz",
+ "integrity": "sha512-hyZ3TANnzGfLpRA2s/4U1kbw2ZI4qGxaRJbBH2DCSREFfubMswheh8TeiC1sGZ3z2jUf3s37P0BBlrD3sjVTUw==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/watcher-darwin-x64": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmmirror.com/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.0.tgz",
+ "integrity": "sha512-9rhlwd78saKf18fT869/poydQK8YqlU26TMiNg7AIu7eBp9adqbJZqmdFOsbZ5cnLp5XvRo9wcFmNHgHdWaGYA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/watcher-freebsd-x64": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmmirror.com/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.0.tgz",
+ "integrity": "sha512-syvfhZzyM8kErg3VF0xpV8dixJ+RzbUaaGaeb7uDuz0D3FK97/mZ5AJQ3XNnDsXX7KkFNtyQyFrXZzQIcN49Tw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/watcher-linux-arm-glibc": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmmirror.com/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.0.tgz",
+ "integrity": "sha512-0VQY1K35DQET3dVYWpOaPFecqOT9dbuCfzjxoQyif1Wc574t3kOSkKevULddcR9znz1TcklCE7Ht6NIxjvTqLA==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/watcher-linux-arm-musl": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmmirror.com/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.0.tgz",
+ "integrity": "sha512-6uHywSIzz8+vi2lAzFeltnYbdHsDm3iIB57d4g5oaB9vKwjb6N6dRIgZMujw4nm5r6v9/BQH0noq6DzHrqr2pA==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/watcher-linux-arm64-glibc": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmmirror.com/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.0.tgz",
+ "integrity": "sha512-BfNjXwZKxBy4WibDb/LDCriWSKLz+jJRL3cM/DllnHH5QUyoiUNEp3GmL80ZqxeumoADfCCP19+qiYiC8gUBjA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/watcher-linux-arm64-musl": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmmirror.com/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.0.tgz",
+ "integrity": "sha512-S1qARKOphxfiBEkwLUbHjCY9BWPdWnW9j7f7Hb2jPplu8UZ3nes7zpPOW9bkLbHRvWM0WDTsjdOTUgW0xLBN1Q==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/watcher-linux-x64-glibc": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmmirror.com/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.0.tgz",
+ "integrity": "sha512-d9AOkusyXARkFD66S6zlGXyzx5RvY+chTP9Jp0ypSTC9d4lzyRs9ovGf/80VCxjKddcUvnsGwCHWuF2EoPgWjw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/watcher-linux-x64-musl": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmmirror.com/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.0.tgz",
+ "integrity": "sha512-iqOC+GoTDoFyk/VYSFHwjHhYrk8bljW6zOhPuhi5t9ulqiYq1togGJB5e3PwYVFFfeVgc6pbz3JdQyDoBszVaA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/watcher-win32-arm64": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmmirror.com/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.0.tgz",
+ "integrity": "sha512-twtft1d+JRNkM5YbmexfcH/N4znDtjgysFaV9zvZmmJezQsKpkfLYJ+JFV3uygugK6AtIM2oADPkB2AdhBrNig==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/watcher-win32-ia32": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmmirror.com/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.0.tgz",
+ "integrity": "sha512-+rgpsNRKwo8A53elqbbHXdOMtY/tAtTzManTWShB5Kk54N8Q9mzNWV7tV+IbGueCbcj826MfWGU3mprWtuf1TA==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/watcher-win32-x64": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmmirror.com/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.0.tgz",
+ "integrity": "sha512-lPrxve92zEHdgeff3aiu4gDOIt4u7sJYha6wbdEZDCDUhtjTsOMiaJzG5lMY4GkWH8p0fMmO2Ppq5G5XXG+DQw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@popperjs/core": {
+ "name": "@sxzz/popperjs-es",
+ "version": "2.11.7",
+ "resolved": "https://registry.npmjs.org/@sxzz/popperjs-es/-/popperjs-es-2.11.7.tgz",
+ "integrity": "sha512-Ccy0NlLkzr0Ex2FKvh2X+OyERHXJ88XJ1MXtsI9y9fGexlaXaVTPzBCRBwIxFkORuOb+uBqeu+RqnpgYTEZRUQ=="
+ },
+ "node_modules/@rollup/pluginutils": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmmirror.com/@rollup/pluginutils/-/pluginutils-4.2.1.tgz",
+ "integrity": "sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==",
+ "dev": true,
+ "dependencies": {
+ "estree-walker": "^2.0.1",
+ "picomatch": "^2.2.2"
+ },
+ "engines": {
+ "node": ">= 8.0.0"
+ }
+ },
+ "node_modules/@rollup/rollup-android-arm-eabi": {
+ "version": "4.46.3",
+ "resolved": "https://registry.npmmirror.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.46.3.tgz",
+ "integrity": "sha512-UmTdvXnLlqQNOCJnyksjPs1G4GqXNGW1LrzCe8+8QoaLhhDeTXYBgJ3k6x61WIhlHX2U+VzEJ55TtIjR/HTySA==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ]
+ },
+ "node_modules/@rollup/rollup-android-arm64": {
+ "version": "4.46.3",
+ "resolved": "https://registry.npmmirror.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.46.3.tgz",
+ "integrity": "sha512-8NoxqLpXm7VyeI0ocidh335D6OKT0UJ6fHdnIxf3+6oOerZZc+O7r+UhvROji6OspyPm+rrIdb1gTXtVIqn+Sg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "android"
+ ]
+ },
+ "node_modules/@rollup/rollup-darwin-arm64": {
+ "version": "4.46.3",
+ "resolved": "https://registry.npmmirror.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.46.3.tgz",
+ "integrity": "sha512-csnNavqZVs1+7/hUKtgjMECsNG2cdB8F7XBHP6FfQjqhjF8rzMzb3SLyy/1BG7YSfQ+bG75Ph7DyedbUqwq1rA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
+ },
+ "node_modules/@rollup/rollup-darwin-x64": {
+ "version": "4.46.3",
+ "resolved": "https://registry.npmmirror.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.46.3.tgz",
+ "integrity": "sha512-r2MXNjbuYabSIX5yQqnT8SGSQ26XQc8fmp6UhlYJd95PZJkQD1u82fWP7HqvGUf33IsOC6qsiV+vcuD4SDP6iw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ]
+ },
+ "node_modules/@rollup/rollup-freebsd-arm64": {
+ "version": "4.46.3",
+ "resolved": "https://registry.npmmirror.com/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.46.3.tgz",
+ "integrity": "sha512-uluObTmgPJDuJh9xqxyr7MV61Imq+0IvVsAlWyvxAaBSNzCcmZlhfYcRhCdMaCsy46ccZa7vtDDripgs9Jkqsw==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ]
+ },
+ "node_modules/@rollup/rollup-freebsd-x64": {
+ "version": "4.46.3",
+ "resolved": "https://registry.npmmirror.com/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.46.3.tgz",
+ "integrity": "sha512-AVJXEq9RVHQnejdbFvh1eWEoobohUYN3nqJIPI4mNTMpsyYN01VvcAClxflyk2HIxvLpRcRggpX1m9hkXkpC/A==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "freebsd"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm-gnueabihf": {
+ "version": "4.46.3",
+ "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.46.3.tgz",
+ "integrity": "sha512-byyflM+huiwHlKi7VHLAYTKr67X199+V+mt1iRgJenAI594vcmGGddWlu6eHujmcdl6TqSNnvqaXJqZdnEWRGA==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm-musleabihf": {
+ "version": "4.46.3",
+ "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.46.3.tgz",
+ "integrity": "sha512-aLm3NMIjr4Y9LklrH5cu7yybBqoVCdr4Nvnm8WB7PKCn34fMCGypVNpGK0JQWdPAzR/FnoEoFtlRqZbBBLhVoQ==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm64-gnu": {
+ "version": "4.46.3",
+ "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.46.3.tgz",
+ "integrity": "sha512-VtilE6eznJRDIoFOzaagQodUksTEfLIsvXymS+UdJiSXrPW7Ai+WG4uapAc3F7Hgs791TwdGh4xyOzbuzIZrnw==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-arm64-musl": {
+ "version": "4.46.3",
+ "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.46.3.tgz",
+ "integrity": "sha512-dG3JuS6+cRAL0GQ925Vppafi0qwZnkHdPeuZIxIPXqkCLP02l7ka+OCyBoDEv8S+nKHxfjvjW4OZ7hTdHkx8/w==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-loongarch64-gnu": {
+ "version": "4.46.3",
+ "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.46.3.tgz",
+ "integrity": "sha512-iU8DxnxEKJptf8Vcx4XvAUdpkZfaz0KWfRrnIRrOndL0SvzEte+MTM7nDH4A2Now4FvTZ01yFAgj6TX/mZl8hQ==",
+ "cpu": [
+ "loong64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-ppc64-gnu": {
+ "version": "4.46.3",
+ "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.46.3.tgz",
+ "integrity": "sha512-VrQZp9tkk0yozJoQvQcqlWiqaPnLM6uY1qPYXvukKePb0fqaiQtOdMJSxNFUZFsGw5oA5vvVokjHrx8a9Qsz2A==",
+ "cpu": [
+ "ppc64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-riscv64-gnu": {
+ "version": "4.46.3",
+ "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.46.3.tgz",
+ "integrity": "sha512-uf2eucWSUb+M7b0poZ/08LsbcRgaDYL8NCGjUeFMwCWFwOuFcZ8D9ayPl25P3pl+D2FH45EbHdfyUesQ2Lt9wA==",
+ "cpu": [
+ "riscv64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-riscv64-musl": {
+ "version": "4.46.3",
+ "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.46.3.tgz",
+ "integrity": "sha512-7tnUcDvN8DHm/9ra+/nF7lLzYHDeODKKKrh6JmZejbh1FnCNZS8zMkZY5J4sEipy2OW1d1Ncc4gNHUd0DLqkSg==",
+ "cpu": [
+ "riscv64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-s390x-gnu": {
+ "version": "4.46.3",
+ "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.46.3.tgz",
+ "integrity": "sha512-MUpAOallJim8CsJK+4Lc9tQzlfPbHxWDrGXZm2z6biaadNpvh3a5ewcdat478W+tXDoUiHwErX/dOql7ETcLqg==",
+ "cpu": [
+ "s390x"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-x64-gnu": {
+ "version": "4.46.3",
+ "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.46.3.tgz",
+ "integrity": "sha512-F42IgZI4JicE2vM2PWCe0N5mR5vR0gIdORPqhGQ32/u1S1v3kLtbZ0C/mi9FFk7C5T0PgdeyWEPajPjaUpyoKg==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-linux-x64-musl": {
+ "version": "4.46.3",
+ "resolved": "https://registry.npmmirror.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.46.3.tgz",
+ "integrity": "sha512-oLc+JrwwvbimJUInzx56Q3ujL3Kkhxehg7O1gWAYzm8hImCd5ld1F2Gry5YDjR21MNb5WCKhC9hXgU7rRlyegQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "linux"
+ ]
+ },
+ "node_modules/@rollup/rollup-win32-arm64-msvc": {
+ "version": "4.46.3",
+ "resolved": "https://registry.npmmirror.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.46.3.tgz",
+ "integrity": "sha512-lOrQ+BVRstruD1fkWg9yjmumhowR0oLAAzavB7yFSaGltY8klttmZtCLvOXCmGE9mLIn8IBV/IFrQOWz5xbFPg==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@rollup/rollup-win32-ia32-msvc": {
+ "version": "4.46.3",
+ "resolved": "https://registry.npmmirror.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.46.3.tgz",
+ "integrity": "sha512-vvrVKPRS4GduGR7VMH8EylCBqsDcw6U+/0nPDuIjXQRbHJc6xOBj+frx8ksfZAh6+Fptw5wHrN7etlMmQnPQVg==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@rollup/rollup-win32-x64-msvc": {
+ "version": "4.46.3",
+ "resolved": "https://registry.npmmirror.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.46.3.tgz",
+ "integrity": "sha512-fi3cPxCnu3ZeM3EwKZPgXbWoGzm2XHgB/WShKI81uj8wG0+laobmqy5wbgEwzstlbLu4MyO8C19FyhhWseYKNQ==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "win32"
+ ]
+ },
+ "node_modules/@types/eslint": {
+ "version": "8.44.8",
+ "resolved": "https://registry.npmmirror.com/@types/eslint/-/eslint-8.44.8.tgz",
+ "integrity": "sha512-4K8GavROwhrYl2QXDXm0Rv9epkA8GBFu0EI+XrrnnuCl7u8CWBRusX7fXJfanhZTDWSAL24gDI/UqXyUM0Injw==",
+ "dev": true,
+ "optional": true,
+ "peer": true,
+ "dependencies": {
+ "@types/estree": "*",
+ "@types/json-schema": "*"
+ }
+ },
+ "node_modules/@types/eslint-scope": {
+ "version": "3.7.7",
+ "resolved": "https://registry.npmmirror.com/@types/eslint-scope/-/eslint-scope-3.7.7.tgz",
+ "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==",
+ "dev": true,
+ "optional": true,
+ "peer": true,
+ "dependencies": {
+ "@types/eslint": "*",
+ "@types/estree": "*"
+ }
+ },
+ "node_modules/@types/estree": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmmirror.com/@types/estree/-/estree-1.0.8.tgz",
+ "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@types/json-schema": {
+ "version": "7.0.15",
+ "resolved": "https://registry.npmmirror.com/@types/json-schema/-/json-schema-7.0.15.tgz",
+ "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==",
+ "dev": true,
+ "optional": true,
+ "peer": true
+ },
+ "node_modules/@types/lodash": {
+ "version": "4.14.191",
+ "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.191.tgz",
+ "integrity": "sha512-BdZ5BCCvho3EIXw6wUCXHe7rS53AIDPLE+JzwgT+OsJk53oBfbSmZZ7CX4VaRoN78N+TJpFi9QPlfIVNmJYWxQ=="
+ },
+ "node_modules/@types/lodash-es": {
+ "version": "4.17.6",
+ "resolved": "https://registry.npmjs.org/@types/lodash-es/-/lodash-es-4.17.6.tgz",
+ "integrity": "sha512-R+zTeVUKDdfoRxpAryaQNRKk3105Rrgx2CFRClIgRGaqDTdjsm8h6IYA8ir584W3ePzkZfst5xIgDwYrlh9HLg==",
+ "dependencies": {
+ "@types/lodash": "*"
+ }
+ },
+ "node_modules/@types/node": {
+ "version": "20.14.15",
+ "resolved": "https://registry.npmmirror.com/@types/node/-/node-20.14.15.tgz",
+ "integrity": "sha512-Fz1xDMCF/B00/tYSVMlmK7hVeLh7jE5f3B7X1/hmV0MJBwE27KlS7EvD/Yp+z1lm8mVhwV5w+n8jOZG8AfTlKw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "undici-types": "~5.26.4"
+ }
+ },
+ "node_modules/@types/nprogress": {
+ "version": "0.2.3",
+ "resolved": "https://registry.npmmirror.com/@types/nprogress/-/nprogress-0.2.3.tgz",
+ "integrity": "sha512-k7kRA033QNtC+gLc4VPlfnue58CM1iQLgn1IMAU8VPHGOj7oIHPp9UlhedEnD/Gl8evoCjwkZjlBORtZ3JByUA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@types/sortablejs": {
+ "version": "1.15.8",
+ "resolved": "https://registry.npmmirror.com/@types/sortablejs/-/sortablejs-1.15.8.tgz",
+ "integrity": "sha512-b79830lW+RZfwaztgs1aVPgbasJ8e7AXtZYHTELNXZPsERt4ymJdjV4OccDbHQAvHrCcFpbF78jkm0R6h/pZVg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@types/web-bluetooth": {
+ "version": "0.0.16",
+ "resolved": "https://registry.npmjs.org/@types/web-bluetooth/-/web-bluetooth-0.0.16.tgz",
+ "integrity": "sha512-oh8q2Zc32S6gd/j50GowEjKLoOVOwHP/bWVjKJInBwQqdOYMdPrf1oVlelTlyfFK3CKxL1uahMDAr+vy8T7yMQ=="
+ },
+ "node_modules/@typescript-eslint/eslint-plugin": {
+ "version": "7.18.0",
+ "resolved": "https://registry.npmmirror.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.18.0.tgz",
+ "integrity": "sha512-94EQTWZ40mzBc42ATNIBimBEDltSJ9RQHCC8vc/PDbxi4k8dVwUAv4o98dk50M1zB+JGFxp43FP7f8+FP8R6Sw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@eslint-community/regexpp": "^4.10.0",
+ "@typescript-eslint/scope-manager": "7.18.0",
+ "@typescript-eslint/type-utils": "7.18.0",
+ "@typescript-eslint/utils": "7.18.0",
+ "@typescript-eslint/visitor-keys": "7.18.0",
+ "graphemer": "^1.4.0",
+ "ignore": "^5.3.1",
+ "natural-compare": "^1.4.0",
+ "ts-api-utils": "^1.3.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || >=20.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "@typescript-eslint/parser": "^7.0.0",
+ "eslint": "^8.56.0"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@typescript-eslint/parser": {
+ "version": "7.18.0",
+ "resolved": "https://registry.npmmirror.com/@typescript-eslint/parser/-/parser-7.18.0.tgz",
+ "integrity": "sha512-4Z+L8I2OqhZV8qA132M4wNL30ypZGYOQVBfMgxDH/K5UX0PNqTu1c6za9ST5r9+tavvHiTWmBnKzpCJ/GlVFtg==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "@typescript-eslint/scope-manager": "7.18.0",
+ "@typescript-eslint/types": "7.18.0",
+ "@typescript-eslint/typescript-estree": "7.18.0",
+ "@typescript-eslint/visitor-keys": "7.18.0",
+ "debug": "^4.3.4"
+ },
+ "engines": {
+ "node": "^18.18.0 || >=20.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^8.56.0"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@typescript-eslint/scope-manager": {
+ "version": "7.18.0",
+ "resolved": "https://registry.npmmirror.com/@typescript-eslint/scope-manager/-/scope-manager-7.18.0.tgz",
+ "integrity": "sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/types": "7.18.0",
+ "@typescript-eslint/visitor-keys": "7.18.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || >=20.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/@typescript-eslint/type-utils": {
+ "version": "7.18.0",
+ "resolved": "https://registry.npmmirror.com/@typescript-eslint/type-utils/-/type-utils-7.18.0.tgz",
+ "integrity": "sha512-XL0FJXuCLaDuX2sYqZUUSOJ2sG5/i1AAze+axqmLnSkNEVMVYLF+cbwlB2w8D1tinFuSikHmFta+P+HOofrLeA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/typescript-estree": "7.18.0",
+ "@typescript-eslint/utils": "7.18.0",
+ "debug": "^4.3.4",
+ "ts-api-utils": "^1.3.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || >=20.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^8.56.0"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@typescript-eslint/types": {
+ "version": "7.18.0",
+ "resolved": "https://registry.npmmirror.com/@typescript-eslint/types/-/types-7.18.0.tgz",
+ "integrity": "sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^18.18.0 || >=20.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/@typescript-eslint/typescript-estree": {
+ "version": "7.18.0",
+ "resolved": "https://registry.npmmirror.com/@typescript-eslint/typescript-estree/-/typescript-estree-7.18.0.tgz",
+ "integrity": "sha512-aP1v/BSPnnyhMHts8cf1qQ6Q1IFwwRvAQGRvBFkWlo3/lH29OXA3Pts+c10nxRxIBrDnoMqzhgdwVe5f2D6OzA==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "@typescript-eslint/types": "7.18.0",
+ "@typescript-eslint/visitor-keys": "7.18.0",
+ "debug": "^4.3.4",
+ "globby": "^11.1.0",
+ "is-glob": "^4.0.3",
+ "minimatch": "^9.0.4",
+ "semver": "^7.6.0",
+ "ts-api-utils": "^1.3.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || >=20.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-2.0.1.tgz",
+ "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "balanced-match": "^1.0.0"
+ }
+ },
+ "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": {
+ "version": "9.0.5",
+ "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-9.0.5.tgz",
+ "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/@typescript-eslint/utils": {
+ "version": "7.18.0",
+ "resolved": "https://registry.npmmirror.com/@typescript-eslint/utils/-/utils-7.18.0.tgz",
+ "integrity": "sha512-kK0/rNa2j74XuHVcoCZxdFBMF+aq/vH83CXAOHieC+2Gis4mF8jJXT5eAfyD3K0sAxtPuwxaIOIOvhwzVDt/kw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@eslint-community/eslint-utils": "^4.4.0",
+ "@typescript-eslint/scope-manager": "7.18.0",
+ "@typescript-eslint/types": "7.18.0",
+ "@typescript-eslint/typescript-estree": "7.18.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || >=20.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^8.56.0"
+ }
+ },
+ "node_modules/@typescript-eslint/visitor-keys": {
+ "version": "7.18.0",
+ "resolved": "https://registry.npmmirror.com/@typescript-eslint/visitor-keys/-/visitor-keys-7.18.0.tgz",
+ "integrity": "sha512-cDF0/Gf81QpY3xYyJKDV14Zwdmid5+uuENhjH2EqFaF0ni+yAyq/LzMaIJdhNJXZI7uLzwIlA+V7oWoyn6Curg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@typescript-eslint/types": "7.18.0",
+ "eslint-visitor-keys": "^3.4.3"
+ },
+ "engines": {
+ "node": "^18.18.0 || >=20.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/@ungap/structured-clone": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmmirror.com/@ungap/structured-clone/-/structured-clone-1.2.0.tgz",
+ "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==",
+ "dev": true
+ },
+ "node_modules/@vitejs/plugin-vue": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-5.1.2.tgz",
+ "integrity": "sha512-nY9IwH12qeiJqumTCLJLE7IiNx7HZ39cbHaysEUd+Myvbz9KAqd2yq+U01Kab1R/H1BmiyM2ShTYlNH32Fzo3A==",
+ "dev": true,
+ "engines": {
+ "node": "^18.0.0 || >=20.0.0"
+ },
+ "peerDependencies": {
+ "vite": "^5.0.0",
+ "vue": "^3.2.25"
+ }
+ },
+ "node_modules/@vue/compiler-core": {
+ "version": "3.4.37",
+ "resolved": "https://registry.npmmirror.com/@vue/compiler-core/-/compiler-core-3.4.37.tgz",
+ "integrity": "sha512-ZDDT/KiLKuCRXyzWecNzC5vTcubGz4LECAtfGPENpo0nrmqJHwuWtRLxk/Sb9RAKtR9iFflFycbkjkY+W/PZUQ==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/parser": "^7.24.7",
+ "@vue/shared": "3.4.37",
+ "entities": "^5.0.0",
+ "estree-walker": "^2.0.2",
+ "source-map-js": "^1.2.0"
+ }
+ },
+ "node_modules/@vue/compiler-dom": {
+ "version": "3.4.37",
+ "resolved": "https://registry.npmmirror.com/@vue/compiler-dom/-/compiler-dom-3.4.37.tgz",
+ "integrity": "sha512-rIiSmL3YrntvgYV84rekAtU/xfogMUJIclUMeIKEtVBFngOL3IeZHhsH3UaFEgB5iFGpj6IW+8YuM/2Up+vVag==",
+ "license": "MIT",
+ "dependencies": {
+ "@vue/compiler-core": "3.4.37",
+ "@vue/shared": "3.4.37"
+ }
+ },
+ "node_modules/@vue/compiler-sfc": {
+ "version": "3.4.37",
+ "resolved": "https://registry.npmmirror.com/@vue/compiler-sfc/-/compiler-sfc-3.4.37.tgz",
+ "integrity": "sha512-vCfetdas40Wk9aK/WWf8XcVESffsbNkBQwS5t13Y/PcfqKfIwJX2gF+82th6dOpnpbptNMlMjAny80li7TaCIg==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/parser": "^7.24.7",
+ "@vue/compiler-core": "3.4.37",
+ "@vue/compiler-dom": "3.4.37",
+ "@vue/compiler-ssr": "3.4.37",
+ "@vue/shared": "3.4.37",
+ "estree-walker": "^2.0.2",
+ "magic-string": "^0.30.10",
+ "postcss": "^8.4.40",
+ "source-map-js": "^1.2.0"
+ }
+ },
+ "node_modules/@vue/compiler-ssr": {
+ "version": "3.4.37",
+ "resolved": "https://registry.npmmirror.com/@vue/compiler-ssr/-/compiler-ssr-3.4.37.tgz",
+ "integrity": "sha512-TyAgYBWrHlFrt4qpdACh8e9Ms6C/AZQ6A6xLJaWrCL8GCX5DxMzxyeFAEMfU/VFr4tylHm+a2NpfJpcd7+20XA==",
+ "license": "MIT",
+ "dependencies": {
+ "@vue/compiler-dom": "3.4.37",
+ "@vue/shared": "3.4.37"
+ }
+ },
+ "node_modules/@vue/devtools-api": {
+ "version": "6.6.3",
+ "resolved": "https://registry.npmmirror.com/@vue/devtools-api/-/devtools-api-6.6.3.tgz",
+ "integrity": "sha512-0MiMsFma/HqA6g3KLKn+AGpL1kgKhFWszC9U29NfpWK5LE7bjeXxySWJrOJ77hBz+TBrBQ7o4QJqbPbqbs8rJw==",
+ "license": "MIT"
+ },
+ "node_modules/@vue/reactivity": {
+ "version": "3.4.37",
+ "resolved": "https://registry.npmmirror.com/@vue/reactivity/-/reactivity-3.4.37.tgz",
+ "integrity": "sha512-UmdKXGx0BZ5kkxPqQr3PK3tElz6adTey4307NzZ3whZu19i5VavYal7u2FfOmAzlcDVgE8+X0HZ2LxLb/jgbYw==",
+ "license": "MIT",
+ "dependencies": {
+ "@vue/shared": "3.4.37"
+ }
+ },
+ "node_modules/@vue/runtime-core": {
+ "version": "3.4.37",
+ "resolved": "https://registry.npmmirror.com/@vue/runtime-core/-/runtime-core-3.4.37.tgz",
+ "integrity": "sha512-MNjrVoLV/sirHZoD7QAilU1Ifs7m/KJv4/84QVbE6nyAZGQNVOa1HGxaOzp9YqCG+GpLt1hNDC4RbH+KtanV7w==",
+ "license": "MIT",
+ "dependencies": {
+ "@vue/reactivity": "3.4.37",
+ "@vue/shared": "3.4.37"
+ }
+ },
+ "node_modules/@vue/runtime-dom": {
+ "version": "3.4.37",
+ "resolved": "https://registry.npmmirror.com/@vue/runtime-dom/-/runtime-dom-3.4.37.tgz",
+ "integrity": "sha512-Mg2EwgGZqtwKrqdL/FKMF2NEaOHuH+Ks9TQn3DHKyX//hQTYOun+7Tqp1eo0P4Ds+SjltZshOSRq6VsU0baaNg==",
+ "license": "MIT",
+ "dependencies": {
+ "@vue/reactivity": "3.4.37",
+ "@vue/runtime-core": "3.4.37",
+ "@vue/shared": "3.4.37",
+ "csstype": "^3.1.3"
+ }
+ },
+ "node_modules/@vue/server-renderer": {
+ "version": "3.4.37",
+ "resolved": "https://registry.npmmirror.com/@vue/server-renderer/-/server-renderer-3.4.37.tgz",
+ "integrity": "sha512-jZ5FAHDR2KBq2FsRUJW6GKDOAG9lUTX8aBEGq4Vf6B/35I9fPce66BornuwmqmKgfiSlecwuOb6oeoamYMohkg==",
+ "license": "MIT",
+ "dependencies": {
+ "@vue/compiler-ssr": "3.4.37",
+ "@vue/shared": "3.4.37"
+ },
+ "peerDependencies": {
+ "vue": "3.4.37"
+ }
+ },
+ "node_modules/@vue/shared": {
+ "version": "3.4.37",
+ "resolved": "https://registry.npmmirror.com/@vue/shared/-/shared-3.4.37.tgz",
+ "integrity": "sha512-nIh8P2fc3DflG8+5Uw8PT/1i17ccFn0xxN/5oE9RfV5SVnd7G0XEFRwakrnNFE/jlS95fpGXDVG5zDETS26nmg==",
+ "license": "MIT"
+ },
+ "node_modules/@vueuse/core": {
+ "version": "9.12.0",
+ "resolved": "https://registry.npmjs.org/@vueuse/core/-/core-9.12.0.tgz",
+ "integrity": "sha512-h/Di8Bvf6xRcvS/PvUVheiMYYz3U0tH3X25YxONSaAUBa841ayMwxkuzx/DGUMCW/wHWzD8tRy2zYmOC36r4sg==",
+ "dependencies": {
+ "@types/web-bluetooth": "^0.0.16",
+ "@vueuse/metadata": "9.12.0",
+ "@vueuse/shared": "9.12.0",
+ "vue-demi": "*"
+ }
+ },
+ "node_modules/@vueuse/metadata": {
+ "version": "9.12.0",
+ "resolved": "https://registry.npmjs.org/@vueuse/metadata/-/metadata-9.12.0.tgz",
+ "integrity": "sha512-9oJ9MM9lFLlmvxXUqsR1wLt1uF7EVbP5iYaHJYqk+G2PbMjY6EXvZeTjbdO89HgoF5cI6z49o2zT/jD9SVoNpQ=="
+ },
+ "node_modules/@vueuse/shared": {
+ "version": "9.12.0",
+ "resolved": "https://registry.npmjs.org/@vueuse/shared/-/shared-9.12.0.tgz",
+ "integrity": "sha512-TWuJLACQ0BVithVTRbex4Wf1a1VaRuSpVeyEd4vMUWl54PzlE0ciFUshKCXnlLuD0lxIaLK4Ypj3NXYzZh4+SQ==",
+ "dependencies": {
+ "vue-demi": "*"
+ }
+ },
+ "node_modules/@webassemblyjs/ast": {
+ "version": "1.11.6",
+ "resolved": "https://registry.npmmirror.com/@webassemblyjs/ast/-/ast-1.11.6.tgz",
+ "integrity": "sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==",
+ "dev": true,
+ "optional": true,
+ "peer": true,
+ "dependencies": {
+ "@webassemblyjs/helper-numbers": "1.11.6",
+ "@webassemblyjs/helper-wasm-bytecode": "1.11.6"
+ }
+ },
+ "node_modules/@webassemblyjs/floating-point-hex-parser": {
+ "version": "1.11.6",
+ "resolved": "https://registry.npmmirror.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz",
+ "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==",
+ "dev": true,
+ "optional": true,
+ "peer": true
+ },
+ "node_modules/@webassemblyjs/helper-api-error": {
+ "version": "1.11.6",
+ "resolved": "https://registry.npmmirror.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz",
+ "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==",
+ "dev": true,
+ "optional": true,
+ "peer": true
+ },
+ "node_modules/@webassemblyjs/helper-buffer": {
+ "version": "1.11.6",
+ "resolved": "https://registry.npmmirror.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz",
+ "integrity": "sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==",
+ "dev": true,
+ "optional": true,
+ "peer": true
+ },
+ "node_modules/@webassemblyjs/helper-numbers": {
+ "version": "1.11.6",
+ "resolved": "https://registry.npmmirror.com/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz",
+ "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==",
+ "dev": true,
+ "optional": true,
+ "peer": true,
+ "dependencies": {
+ "@webassemblyjs/floating-point-hex-parser": "1.11.6",
+ "@webassemblyjs/helper-api-error": "1.11.6",
+ "@xtuc/long": "4.2.2"
+ }
+ },
+ "node_modules/@webassemblyjs/helper-wasm-bytecode": {
+ "version": "1.11.6",
+ "resolved": "https://registry.npmmirror.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz",
+ "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==",
+ "dev": true,
+ "optional": true,
+ "peer": true
+ },
+ "node_modules/@webassemblyjs/helper-wasm-section": {
+ "version": "1.11.6",
+ "resolved": "https://registry.npmmirror.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz",
+ "integrity": "sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==",
+ "dev": true,
+ "optional": true,
+ "peer": true,
+ "dependencies": {
+ "@webassemblyjs/ast": "1.11.6",
+ "@webassemblyjs/helper-buffer": "1.11.6",
+ "@webassemblyjs/helper-wasm-bytecode": "1.11.6",
+ "@webassemblyjs/wasm-gen": "1.11.6"
+ }
+ },
+ "node_modules/@webassemblyjs/ieee754": {
+ "version": "1.11.6",
+ "resolved": "https://registry.npmmirror.com/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz",
+ "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==",
+ "dev": true,
+ "optional": true,
+ "peer": true,
+ "dependencies": {
+ "@xtuc/ieee754": "^1.2.0"
+ }
+ },
+ "node_modules/@webassemblyjs/leb128": {
+ "version": "1.11.6",
+ "resolved": "https://registry.npmmirror.com/@webassemblyjs/leb128/-/leb128-1.11.6.tgz",
+ "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==",
+ "dev": true,
+ "optional": true,
+ "peer": true,
+ "dependencies": {
+ "@xtuc/long": "4.2.2"
+ }
+ },
+ "node_modules/@webassemblyjs/utf8": {
+ "version": "1.11.6",
+ "resolved": "https://registry.npmmirror.com/@webassemblyjs/utf8/-/utf8-1.11.6.tgz",
+ "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==",
+ "dev": true,
+ "optional": true,
+ "peer": true
+ },
+ "node_modules/@webassemblyjs/wasm-edit": {
+ "version": "1.11.6",
+ "resolved": "https://registry.npmmirror.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz",
+ "integrity": "sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==",
+ "dev": true,
+ "optional": true,
+ "peer": true,
+ "dependencies": {
+ "@webassemblyjs/ast": "1.11.6",
+ "@webassemblyjs/helper-buffer": "1.11.6",
+ "@webassemblyjs/helper-wasm-bytecode": "1.11.6",
+ "@webassemblyjs/helper-wasm-section": "1.11.6",
+ "@webassemblyjs/wasm-gen": "1.11.6",
+ "@webassemblyjs/wasm-opt": "1.11.6",
+ "@webassemblyjs/wasm-parser": "1.11.6",
+ "@webassemblyjs/wast-printer": "1.11.6"
+ }
+ },
+ "node_modules/@webassemblyjs/wasm-gen": {
+ "version": "1.11.6",
+ "resolved": "https://registry.npmmirror.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz",
+ "integrity": "sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==",
+ "dev": true,
+ "optional": true,
+ "peer": true,
+ "dependencies": {
+ "@webassemblyjs/ast": "1.11.6",
+ "@webassemblyjs/helper-wasm-bytecode": "1.11.6",
+ "@webassemblyjs/ieee754": "1.11.6",
+ "@webassemblyjs/leb128": "1.11.6",
+ "@webassemblyjs/utf8": "1.11.6"
+ }
+ },
+ "node_modules/@webassemblyjs/wasm-opt": {
+ "version": "1.11.6",
+ "resolved": "https://registry.npmmirror.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz",
+ "integrity": "sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==",
+ "dev": true,
+ "optional": true,
+ "peer": true,
+ "dependencies": {
+ "@webassemblyjs/ast": "1.11.6",
+ "@webassemblyjs/helper-buffer": "1.11.6",
+ "@webassemblyjs/wasm-gen": "1.11.6",
+ "@webassemblyjs/wasm-parser": "1.11.6"
+ }
+ },
+ "node_modules/@webassemblyjs/wasm-parser": {
+ "version": "1.11.6",
+ "resolved": "https://registry.npmmirror.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz",
+ "integrity": "sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==",
+ "dev": true,
+ "optional": true,
+ "peer": true,
+ "dependencies": {
+ "@webassemblyjs/ast": "1.11.6",
+ "@webassemblyjs/helper-api-error": "1.11.6",
+ "@webassemblyjs/helper-wasm-bytecode": "1.11.6",
+ "@webassemblyjs/ieee754": "1.11.6",
+ "@webassemblyjs/leb128": "1.11.6",
+ "@webassemblyjs/utf8": "1.11.6"
+ }
+ },
+ "node_modules/@webassemblyjs/wast-printer": {
+ "version": "1.11.6",
+ "resolved": "https://registry.npmmirror.com/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz",
+ "integrity": "sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==",
+ "dev": true,
+ "optional": true,
+ "peer": true,
+ "dependencies": {
+ "@webassemblyjs/ast": "1.11.6",
+ "@xtuc/long": "4.2.2"
+ }
+ },
+ "node_modules/@xtuc/ieee754": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmmirror.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz",
+ "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==",
+ "dev": true,
+ "optional": true,
+ "peer": true
+ },
+ "node_modules/@xtuc/long": {
+ "version": "4.2.2",
+ "resolved": "https://registry.npmmirror.com/@xtuc/long/-/long-4.2.2.tgz",
+ "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==",
+ "dev": true,
+ "optional": true,
+ "peer": true
+ },
+ "node_modules/acorn": {
+ "version": "8.11.2",
+ "resolved": "https://registry.npmmirror.com/acorn/-/acorn-8.11.2.tgz",
+ "integrity": "sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==",
+ "dev": true,
+ "bin": {
+ "acorn": "bin/acorn"
+ },
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/acorn-import-assertions": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmmirror.com/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz",
+ "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==",
+ "dev": true,
+ "optional": true,
+ "peer": true,
+ "peerDependencies": {
+ "acorn": "^8"
+ }
+ },
+ "node_modules/acorn-jsx": {
+ "version": "5.3.2",
+ "resolved": "https://registry.npmmirror.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
+ "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
+ "dev": true,
+ "peerDependencies": {
+ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
+ }
+ },
+ "node_modules/ajv": {
+ "version": "6.12.6",
+ "resolved": "https://registry.npmmirror.com/ajv/-/ajv-6.12.6.tgz",
+ "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
+ "dev": true,
+ "dependencies": {
+ "fast-deep-equal": "^3.1.1",
+ "fast-json-stable-stringify": "^2.0.0",
+ "json-schema-traverse": "^0.4.1",
+ "uri-js": "^4.2.2"
+ }
+ },
+ "node_modules/ajv-keywords": {
+ "version": "3.5.2",
+ "resolved": "https://registry.npmmirror.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz",
+ "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==",
+ "dev": true,
+ "optional": true,
+ "peer": true,
+ "peerDependencies": {
+ "ajv": "^6.9.1"
+ }
+ },
+ "node_modules/ansi-regex": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/argparse": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmmirror.com/argparse/-/argparse-2.0.1.tgz",
+ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
+ "dev": true
+ },
+ "node_modules/array-union": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmmirror.com/array-union/-/array-union-2.1.0.tgz",
+ "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/async-validator": {
+ "version": "4.2.5",
+ "resolved": "https://registry.npmjs.org/async-validator/-/async-validator-4.2.5.tgz",
+ "integrity": "sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg=="
+ },
+ "node_modules/asynckit": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
+ "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="
+ },
+ "node_modules/axios": {
+ "version": "1.8.2",
+ "resolved": "https://registry.npmmirror.com/axios/-/axios-1.8.2.tgz",
+ "integrity": "sha512-ls4GYBm5aig9vWx8AWDSGLpnpDQRtWAfrjU+EuytuODrFBkqesN2RkOQCBzrA1RQNHw1SmRMSDDDSwzNAYQ6Rg==",
+ "license": "MIT",
+ "dependencies": {
+ "follow-redirects": "^1.15.6",
+ "form-data": "^4.0.0",
+ "proxy-from-env": "^1.1.0"
+ }
+ },
+ "node_modules/balanced-match": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
+ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
+ "dev": true
+ },
+ "node_modules/batch-processor": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/batch-processor/-/batch-processor-1.0.0.tgz",
+ "integrity": "sha512-xoLQD8gmmR32MeuBHgH0Tzd5PuSZx71ZsbhVxOCRbgktZEPe4SQy7s9Z50uPp0F/f7iw2XmkHN2xkgbMfckMDA=="
+ },
+ "node_modules/boolbase": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz",
+ "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==",
+ "dev": true
+ },
+ "node_modules/brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "dev": true,
+ "dependencies": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "node_modules/braces": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmmirror.com/braces/-/braces-3.0.3.tgz",
+ "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "fill-range": "^7.1.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/browserslist": {
+ "version": "4.22.2",
+ "resolved": "https://registry.npmmirror.com/browserslist/-/browserslist-4.22.2.tgz",
+ "integrity": "sha512-0UgcrvQmBDvZHFGdYUehrCNIazki7/lUP3kkoi/r3YB2amZbFM9J43ZRkJTXBUZK4gmx56+Sqk9+Vs9mwZx9+A==",
+ "dev": true,
+ "optional": true,
+ "peer": true,
+ "dependencies": {
+ "caniuse-lite": "^1.0.30001565",
+ "electron-to-chromium": "^1.4.601",
+ "node-releases": "^2.0.14",
+ "update-browserslist-db": "^1.0.13"
+ },
+ "bin": {
+ "browserslist": "cli.js"
+ },
+ "engines": {
+ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
+ }
+ },
+ "node_modules/buffer-from": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmmirror.com/buffer-from/-/buffer-from-1.1.2.tgz",
+ "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==",
+ "dev": true,
+ "optional": true,
+ "peer": true
+ },
+ "node_modules/call-bind": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmmirror.com/call-bind/-/call-bind-1.0.7.tgz",
+ "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==",
+ "license": "MIT",
+ "dependencies": {
+ "es-define-property": "^1.0.0",
+ "es-errors": "^1.3.0",
+ "function-bind": "^1.1.2",
+ "get-intrinsic": "^1.2.4",
+ "set-function-length": "^1.2.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/callsites": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmmirror.com/callsites/-/callsites-3.1.0.tgz",
+ "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/caniuse-lite": {
+ "version": "1.0.30001566",
+ "resolved": "https://registry.npmmirror.com/caniuse-lite/-/caniuse-lite-1.0.30001566.tgz",
+ "integrity": "sha512-ggIhCsTxmITBAMmK8yZjEhCO5/47jKXPu6Dha/wuCS4JePVL+3uiDEBuhu2aIoT+bqTOR8L76Ip1ARL9xYsEJA==",
+ "dev": true,
+ "optional": true,
+ "peer": true
+ },
+ "node_modules/chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/chokidar": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmmirror.com/chokidar/-/chokidar-4.0.1.tgz",
+ "integrity": "sha512-n8enUVCED/KVRQlab1hr3MVpcVMvxtZjmEa956u+4YijlmQED223XMSYj2tLuKvr4jcCTzNNMpQDUer72MMmzA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "readdirp": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 14.16.0"
+ },
+ "funding": {
+ "url": "https://paulmillr.com/funding/"
+ }
+ },
+ "node_modules/chrome-trace-event": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmmirror.com/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz",
+ "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==",
+ "dev": true,
+ "optional": true,
+ "peer": true,
+ "engines": {
+ "node": ">=6.0"
+ }
+ },
+ "node_modules/claygl": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/claygl/-/claygl-1.3.0.tgz",
+ "integrity": "sha512-+gGtJjT6SSHD2l2yC3MCubW/sCV40tZuSs5opdtn79vFSGUgp/lH139RNEQ6Jy078/L0aV8odCw8RSrUcMfLaQ=="
+ },
+ "node_modules/clipboard": {
+ "version": "2.0.11",
+ "resolved": "https://registry.npmjs.org/clipboard/-/clipboard-2.0.11.tgz",
+ "integrity": "sha512-C+0bbOqkezLIsmWSvlsXS0Q0bmkugu7jcfMIACB+RDEntIzQIkdr148we28AfSloQLRdZlYL/QYyrq05j/3Faw==",
+ "dependencies": {
+ "good-listener": "^1.2.2",
+ "select": "^1.1.2",
+ "tiny-emitter": "^2.0.0"
+ }
+ },
+ "node_modules/codemirror": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmmirror.com/codemirror/-/codemirror-6.0.1.tgz",
+ "integrity": "sha512-J8j+nZ+CdWmIeFIGXEFbFPtpiYacFMDR8GlHK3IyHQJMCaVRfGx9NT+Hxivv1ckLWPvNdZqndbr/7lVhrf/Svg==",
+ "dependencies": {
+ "@codemirror/autocomplete": "^6.0.0",
+ "@codemirror/commands": "^6.0.0",
+ "@codemirror/language": "^6.0.0",
+ "@codemirror/lint": "^6.0.0",
+ "@codemirror/search": "^6.0.0",
+ "@codemirror/state": "^6.0.0",
+ "@codemirror/view": "^6.0.0"
+ }
+ },
+ "node_modules/color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "node_modules/color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
+ "node_modules/combined-stream": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
+ "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
+ "dependencies": {
+ "delayed-stream": "~1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/commander": {
+ "version": "2.20.3",
+ "resolved": "https://registry.npmmirror.com/commander/-/commander-2.20.3.tgz",
+ "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
+ "dev": true,
+ "optional": true,
+ "peer": true
+ },
+ "node_modules/concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
+ "dev": true
+ },
+ "node_modules/countup.js": {
+ "version": "2.8.0",
+ "resolved": "https://registry.npmmirror.com/countup.js/-/countup.js-2.8.0.tgz",
+ "integrity": "sha512-f7xEhX0awl4NOElHulrl4XRfKoNH3rB+qfNSZZyjSZhaAoUk6elvhH+MNxMmlmuUJ2/QNTWPSA7U4mNtIAKljQ=="
+ },
+ "node_modules/crelt": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmmirror.com/crelt/-/crelt-1.0.5.tgz",
+ "integrity": "sha512-+BO9wPPi+DWTDcNYhr/W90myha8ptzftZT+LwcmUbbok0rcP/fequmFYCw8NMoH7pkAZQzU78b3kYrlua5a9eA=="
+ },
+ "node_modules/cropperjs": {
+ "version": "1.6.1",
+ "resolved": "https://registry.npmmirror.com/cropperjs/-/cropperjs-1.6.1.tgz",
+ "integrity": "sha512-F4wsi+XkDHCOMrHMYjrTEE4QBOrsHHN5/2VsVAaRq8P7E5z7xQpT75S+f/9WikmBEailas3+yo+6zPIomW+NOA=="
+ },
+ "node_modules/cross-spawn": {
+ "version": "7.0.3",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
+ "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
+ "dev": true,
+ "dependencies": {
+ "path-key": "^3.1.0",
+ "shebang-command": "^2.0.0",
+ "which": "^2.0.1"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/cssesc": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmmirror.com/cssesc/-/cssesc-3.0.0.tgz",
+ "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "cssesc": "bin/cssesc"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/csstype": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmmirror.com/csstype/-/csstype-3.1.3.tgz",
+ "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==",
+ "license": "MIT"
+ },
+ "node_modules/dayjs": {
+ "version": "1.11.13",
+ "resolved": "https://registry.npmmirror.com/dayjs/-/dayjs-1.11.13.tgz",
+ "integrity": "sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==",
+ "license": "MIT"
+ },
+ "node_modules/debug": {
+ "version": "4.3.4",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
+ "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
+ "dev": true,
+ "dependencies": {
+ "ms": "2.1.2"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/deep-is": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmmirror.com/deep-is/-/deep-is-0.1.4.tgz",
+ "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==",
+ "dev": true
+ },
+ "node_modules/define-data-property": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmmirror.com/define-data-property/-/define-data-property-1.1.4.tgz",
+ "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==",
+ "license": "MIT",
+ "dependencies": {
+ "es-define-property": "^1.0.0",
+ "es-errors": "^1.3.0",
+ "gopd": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/delayed-stream": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
+ "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/delegate": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/delegate/-/delegate-3.2.0.tgz",
+ "integrity": "sha512-IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw=="
+ },
+ "node_modules/detect-libc": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmmirror.com/detect-libc/-/detect-libc-1.0.3.tgz",
+ "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==",
+ "dev": true,
+ "license": "Apache-2.0",
+ "optional": true,
+ "bin": {
+ "detect-libc": "bin/detect-libc.js"
+ },
+ "engines": {
+ "node": ">=0.10"
+ }
+ },
+ "node_modules/dir-glob": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmmirror.com/dir-glob/-/dir-glob-3.0.1.tgz",
+ "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "path-type": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/doctrine": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
+ "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==",
+ "dev": true,
+ "dependencies": {
+ "esutils": "^2.0.2"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/dotenv": {
+ "version": "16.0.1",
+ "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.1.tgz",
+ "integrity": "sha512-1K6hR6wtk2FviQ4kEiSjFiH5rpzEVi8WW0x96aztHVMhEspNpc4DVOUTEHtEva5VThQ8IaBX1Pe4gSzpVVUsKQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/echarts": {
+ "version": "5.5.1",
+ "resolved": "https://registry.npmmirror.com/echarts/-/echarts-5.5.1.tgz",
+ "integrity": "sha512-Fce8upazaAXUVUVsjgV6mBnGuqgO+JNDlcgF79Dksy4+wgGpQB2lmYoO4TSweFg/mZITdpGHomw/cNBJZj1icA==",
+ "license": "Apache-2.0",
+ "dependencies": {
+ "tslib": "2.3.0",
+ "zrender": "5.6.0"
+ }
+ },
+ "node_modules/echarts-gl": {
+ "version": "2.0.9",
+ "resolved": "https://registry.npmjs.org/echarts-gl/-/echarts-gl-2.0.9.tgz",
+ "integrity": "sha512-oKeMdkkkpJGWOzjgZUsF41DOh6cMsyrGGXimbjK2l6Xeq/dBQu4ShG2w2Dzrs/1bD27b2pLTGSaUzouY191gzA==",
+ "dependencies": {
+ "claygl": "^1.2.1",
+ "zrender": "^5.1.1"
+ },
+ "peerDependencies": {
+ "echarts": "^5.1.2"
+ }
+ },
+ "node_modules/echarts-wordcloud": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmmirror.com/echarts-wordcloud/-/echarts-wordcloud-2.1.0.tgz",
+ "integrity": "sha512-Kt1JmbcROgb+3IMI48KZECK2AP5lG6bSsOEs+AsuwaWJxQom31RTNd6NFYI01E/YaI1PFZeueaupjlmzSQasjQ==",
+ "peerDependencies": {
+ "echarts": "^5.0.1"
+ }
+ },
+ "node_modules/electron-to-chromium": {
+ "version": "1.4.607",
+ "resolved": "https://registry.npmmirror.com/electron-to-chromium/-/electron-to-chromium-1.4.607.tgz",
+ "integrity": "sha512-YUlnPwE6eYxzwBnFmawA8LiLRfm70R2aJRIUv0n03uHt/cUzzYACOogmvk8M2+hVzt/kB80KJXx7d5f5JofPvQ==",
+ "dev": true,
+ "optional": true,
+ "peer": true
+ },
+ "node_modules/element-plus": {
+ "version": "2.10.7",
+ "resolved": "https://registry.npmmirror.com/element-plus/-/element-plus-2.10.7.tgz",
+ "integrity": "sha512-bL4yhepL8/0NEQA5+N2Q6ZVKLipIDkiQjK2mqtSmGh6CxJk1yaBMdG5HXfYkbk1htNcT3ULk9g23lzT323JGcA==",
+ "license": "MIT",
+ "dependencies": {
+ "@ctrl/tinycolor": "^3.4.1",
+ "@element-plus/icons-vue": "^2.3.1",
+ "@floating-ui/dom": "^1.0.1",
+ "@popperjs/core": "npm:@sxzz/popperjs-es@^2.11.7",
+ "@types/lodash": "^4.14.182",
+ "@types/lodash-es": "^4.17.6",
+ "@vueuse/core": "^9.1.0",
+ "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.2",
+ "memoize-one": "^6.0.0",
+ "normalize-wheel-es": "^1.2.0"
+ },
+ "peerDependencies": {
+ "vue": "^3.2.0"
+ }
+ },
+ "node_modules/element-resize-detector": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/element-resize-detector/-/element-resize-detector-1.2.4.tgz",
+ "integrity": "sha512-Fl5Ftk6WwXE0wqCgNoseKWndjzZlDCwuPTcoVZfCP9R3EHQF8qUtr3YUPNETegRBOKqQKPW3n4kiIWngGi8tKg==",
+ "dependencies": {
+ "batch-processor": "1.0.0"
+ }
+ },
+ "node_modules/enhanced-resolve": {
+ "version": "5.15.0",
+ "resolved": "https://registry.npmmirror.com/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz",
+ "integrity": "sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==",
+ "dev": true,
+ "optional": true,
+ "peer": true,
+ "dependencies": {
+ "graceful-fs": "^4.2.4",
+ "tapable": "^2.2.0"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
+ "node_modules/entities": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmmirror.com/entities/-/entities-5.0.0.tgz",
+ "integrity": "sha512-BeJFvFRJddxobhvEdm5GqHzRV/X+ACeuw0/BuuxsCh1EUZcAIz8+kYmBp/LrQuloy6K1f3a0M7+IhmZ7QnkISA==",
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=0.12"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/entities?sponsor=1"
+ }
+ },
+ "node_modules/es-define-property": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmmirror.com/es-define-property/-/es-define-property-1.0.0.tgz",
+ "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==",
+ "license": "MIT",
+ "dependencies": {
+ "get-intrinsic": "^1.2.4"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-errors": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmmirror.com/es-errors/-/es-errors-1.3.0.tgz",
+ "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-module-lexer": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmmirror.com/es-module-lexer/-/es-module-lexer-1.4.1.tgz",
+ "integrity": "sha512-cXLGjP0c4T3flZJKQSuziYoq7MlT+rnvfZjfp7h+I7K9BNX54kP9nyWvdbwjQ4u1iWbOL4u96fgeZLToQlZC7w==",
+ "dev": true,
+ "optional": true,
+ "peer": true
+ },
+ "node_modules/esbuild": {
+ "version": "0.19.12",
+ "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.12.tgz",
+ "integrity": "sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==",
+ "dev": true,
+ "hasInstallScript": true,
+ "bin": {
+ "esbuild": "bin/esbuild"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "optionalDependencies": {
+ "@esbuild/aix-ppc64": "0.19.12",
+ "@esbuild/android-arm": "0.19.12",
+ "@esbuild/android-arm64": "0.19.12",
+ "@esbuild/android-x64": "0.19.12",
+ "@esbuild/darwin-arm64": "0.19.12",
+ "@esbuild/darwin-x64": "0.19.12",
+ "@esbuild/freebsd-arm64": "0.19.12",
+ "@esbuild/freebsd-x64": "0.19.12",
+ "@esbuild/linux-arm": "0.19.12",
+ "@esbuild/linux-arm64": "0.19.12",
+ "@esbuild/linux-ia32": "0.19.12",
+ "@esbuild/linux-loong64": "0.19.12",
+ "@esbuild/linux-mips64el": "0.19.12",
+ "@esbuild/linux-ppc64": "0.19.12",
+ "@esbuild/linux-riscv64": "0.19.12",
+ "@esbuild/linux-s390x": "0.19.12",
+ "@esbuild/linux-x64": "0.19.12",
+ "@esbuild/netbsd-x64": "0.19.12",
+ "@esbuild/openbsd-x64": "0.19.12",
+ "@esbuild/sunos-x64": "0.19.12",
+ "@esbuild/win32-arm64": "0.19.12",
+ "@esbuild/win32-ia32": "0.19.12",
+ "@esbuild/win32-x64": "0.19.12"
+ }
+ },
+ "node_modules/escalade": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmmirror.com/escalade/-/escalade-3.1.1.tgz",
+ "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==",
+ "dev": true,
+ "optional": true,
+ "peer": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/escape-html": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
+ "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow=="
+ },
+ "node_modules/escape-string-regexp": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
+ "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/eslint": {
+ "version": "8.57.0",
+ "resolved": "https://registry.npmmirror.com/eslint/-/eslint-8.57.0.tgz",
+ "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@eslint-community/eslint-utils": "^4.2.0",
+ "@eslint-community/regexpp": "^4.6.1",
+ "@eslint/eslintrc": "^2.1.4",
+ "@eslint/js": "8.57.0",
+ "@humanwhocodes/config-array": "^0.11.14",
+ "@humanwhocodes/module-importer": "^1.0.1",
+ "@nodelib/fs.walk": "^1.2.8",
+ "@ungap/structured-clone": "^1.2.0",
+ "ajv": "^6.12.4",
+ "chalk": "^4.0.0",
+ "cross-spawn": "^7.0.2",
+ "debug": "^4.3.2",
+ "doctrine": "^3.0.0",
+ "escape-string-regexp": "^4.0.0",
+ "eslint-scope": "^7.2.2",
+ "eslint-visitor-keys": "^3.4.3",
+ "espree": "^9.6.1",
+ "esquery": "^1.4.2",
+ "esutils": "^2.0.2",
+ "fast-deep-equal": "^3.1.3",
+ "file-entry-cache": "^6.0.1",
+ "find-up": "^5.0.0",
+ "glob-parent": "^6.0.2",
+ "globals": "^13.19.0",
+ "graphemer": "^1.4.0",
+ "ignore": "^5.2.0",
+ "imurmurhash": "^0.1.4",
+ "is-glob": "^4.0.0",
+ "is-path-inside": "^3.0.3",
+ "js-yaml": "^4.1.0",
+ "json-stable-stringify-without-jsonify": "^1.0.1",
+ "levn": "^0.4.1",
+ "lodash.merge": "^4.6.2",
+ "minimatch": "^3.1.2",
+ "natural-compare": "^1.4.0",
+ "optionator": "^0.9.3",
+ "strip-ansi": "^6.0.1",
+ "text-table": "^0.2.0"
+ },
+ "bin": {
+ "eslint": "bin/eslint.js"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/eslint-plugin-vue": {
+ "version": "9.27.0",
+ "resolved": "https://registry.npmmirror.com/eslint-plugin-vue/-/eslint-plugin-vue-9.27.0.tgz",
+ "integrity": "sha512-5Dw3yxEyuBSXTzT5/Ge1X5kIkRTQ3nvBn/VwPwInNiZBSJOO/timWMUaflONnFBzU6NhB68lxnCda7ULV5N7LA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@eslint-community/eslint-utils": "^4.4.0",
+ "globals": "^13.24.0",
+ "natural-compare": "^1.4.0",
+ "nth-check": "^2.1.1",
+ "postcss-selector-parser": "^6.0.15",
+ "semver": "^7.6.0",
+ "vue-eslint-parser": "^9.4.3",
+ "xml-name-validator": "^4.0.0"
+ },
+ "engines": {
+ "node": "^14.17.0 || >=16.0.0"
+ },
+ "peerDependencies": {
+ "eslint": "^6.2.0 || ^7.0.0 || ^8.0.0 || ^9.0.0"
+ }
+ },
+ "node_modules/eslint-scope": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmmirror.com/eslint-scope/-/eslint-scope-5.1.1.tgz",
+ "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==",
+ "dev": true,
+ "optional": true,
+ "peer": true,
+ "dependencies": {
+ "esrecurse": "^4.3.0",
+ "estraverse": "^4.1.1"
+ },
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/eslint-visitor-keys": {
+ "version": "3.4.3",
+ "resolved": "https://registry.npmmirror.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz",
+ "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==",
+ "dev": true,
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ }
+ },
+ "node_modules/eslint/node_modules/eslint-scope": {
+ "version": "7.2.2",
+ "resolved": "https://registry.npmmirror.com/eslint-scope/-/eslint-scope-7.2.2.tgz",
+ "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==",
+ "dev": true,
+ "dependencies": {
+ "esrecurse": "^4.3.0",
+ "estraverse": "^5.2.0"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ }
+ },
+ "node_modules/eslint/node_modules/estraverse": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmmirror.com/estraverse/-/estraverse-5.3.0.tgz",
+ "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
+ "dev": true,
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/espree": {
+ "version": "9.6.1",
+ "resolved": "https://registry.npmmirror.com/espree/-/espree-9.6.1.tgz",
+ "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==",
+ "dev": true,
+ "dependencies": {
+ "acorn": "^8.9.0",
+ "acorn-jsx": "^5.3.2",
+ "eslint-visitor-keys": "^3.4.1"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ }
+ },
+ "node_modules/esquery": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmmirror.com/esquery/-/esquery-1.5.0.tgz",
+ "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==",
+ "dev": true,
+ "dependencies": {
+ "estraverse": "^5.1.0"
+ },
+ "engines": {
+ "node": ">=0.10"
+ }
+ },
+ "node_modules/esquery/node_modules/estraverse": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmmirror.com/estraverse/-/estraverse-5.3.0.tgz",
+ "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
+ "dev": true,
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/esrecurse": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmmirror.com/esrecurse/-/esrecurse-4.3.0.tgz",
+ "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
+ "dev": true,
+ "dependencies": {
+ "estraverse": "^5.2.0"
+ },
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/esrecurse/node_modules/estraverse": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmmirror.com/estraverse/-/estraverse-5.3.0.tgz",
+ "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
+ "dev": true,
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/estraverse": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmmirror.com/estraverse/-/estraverse-4.3.0.tgz",
+ "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
+ "dev": true,
+ "optional": true,
+ "peer": true,
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/estree-walker": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz",
+ "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w=="
+ },
+ "node_modules/esutils": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
+ "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/events": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmmirror.com/events/-/events-3.3.0.tgz",
+ "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==",
+ "dev": true,
+ "optional": true,
+ "peer": true,
+ "engines": {
+ "node": ">=0.8.x"
+ }
+ },
+ "node_modules/fast-deep-equal": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmmirror.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
+ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
+ "dev": true
+ },
+ "node_modules/fast-glob": {
+ "version": "3.3.2",
+ "resolved": "https://registry.npmmirror.com/fast-glob/-/fast-glob-3.3.2.tgz",
+ "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@nodelib/fs.stat": "^2.0.2",
+ "@nodelib/fs.walk": "^1.2.3",
+ "glob-parent": "^5.1.2",
+ "merge2": "^1.3.0",
+ "micromatch": "^4.0.4"
+ },
+ "engines": {
+ "node": ">=8.6.0"
+ }
+ },
+ "node_modules/fast-glob/node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmmirror.com/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/fast-json-stable-stringify": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmmirror.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
+ "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
+ "dev": true
+ },
+ "node_modules/fast-levenshtein": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmmirror.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
+ "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==",
+ "dev": true
+ },
+ "node_modules/fastq": {
+ "version": "1.15.0",
+ "resolved": "https://registry.npmmirror.com/fastq/-/fastq-1.15.0.tgz",
+ "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==",
+ "dev": true,
+ "dependencies": {
+ "reusify": "^1.0.4"
+ }
+ },
+ "node_modules/file-entry-cache": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz",
+ "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==",
+ "dev": true,
+ "dependencies": {
+ "flat-cache": "^3.0.4"
+ },
+ "engines": {
+ "node": "^10.12.0 || >=12.0.0"
+ }
+ },
+ "node_modules/fill-range": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmmirror.com/fill-range/-/fill-range-7.1.1.tgz",
+ "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "to-regex-range": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/find-up": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmmirror.com/find-up/-/find-up-5.0.0.tgz",
+ "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
+ "dev": true,
+ "dependencies": {
+ "locate-path": "^6.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/flat-cache": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz",
+ "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==",
+ "dev": true,
+ "dependencies": {
+ "flatted": "^3.1.0",
+ "rimraf": "^3.0.2"
+ },
+ "engines": {
+ "node": "^10.12.0 || >=12.0.0"
+ }
+ },
+ "node_modules/flatted": {
+ "version": "3.2.6",
+ "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.6.tgz",
+ "integrity": "sha512-0sQoMh9s0BYsm+12Huy/rkKxVu4R1+r96YX5cG44rHV0pQ6iC3Q+mkoMFaGWObMFYQxCVT+ssG1ksneA2MI9KQ==",
+ "dev": true
+ },
+ "node_modules/follow-redirects": {
+ "version": "1.15.6",
+ "resolved": "https://registry.npmmirror.com/follow-redirects/-/follow-redirects-1.15.6.tgz",
+ "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==",
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://github.com/sponsors/RubenVerborgh"
+ }
+ ],
+ "license": "MIT",
+ "engines": {
+ "node": ">=4.0"
+ },
+ "peerDependenciesMeta": {
+ "debug": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/form-data": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz",
+ "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==",
+ "dependencies": {
+ "asynckit": "^0.4.0",
+ "combined-stream": "^1.0.8",
+ "mime-types": "^2.1.12"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/fs-extra": {
+ "version": "10.1.0",
+ "resolved": "https://registry.npmmirror.com/fs-extra/-/fs-extra-10.1.0.tgz",
+ "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==",
+ "dev": true,
+ "dependencies": {
+ "graceful-fs": "^4.2.0",
+ "jsonfile": "^6.0.1",
+ "universalify": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/fs.realpath": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+ "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==",
+ "dev": true
+ },
+ "node_modules/fsevents": {
+ "version": "2.3.3",
+ "resolved": "https://registry.npmmirror.com/fsevents/-/fsevents-2.3.3.tgz",
+ "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
+ "dev": true,
+ "hasInstallScript": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
+ }
+ },
+ "node_modules/function-bind": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmmirror.com/function-bind/-/function-bind-1.1.2.tgz",
+ "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/get-intrinsic": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmmirror.com/get-intrinsic/-/get-intrinsic-1.2.4.tgz",
+ "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==",
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "function-bind": "^1.1.2",
+ "has-proto": "^1.0.1",
+ "has-symbols": "^1.0.3",
+ "hasown": "^2.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/glob": {
+ "version": "7.2.3",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
+ "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+ "dev": true,
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.1.1",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/glob-parent": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
+ "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
+ "dev": true,
+ "dependencies": {
+ "is-glob": "^4.0.3"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
+ "node_modules/glob-to-regexp": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmmirror.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz",
+ "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==",
+ "dev": true,
+ "optional": true,
+ "peer": true
+ },
+ "node_modules/globals": {
+ "version": "13.24.0",
+ "resolved": "https://registry.npmmirror.com/globals/-/globals-13.24.0.tgz",
+ "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "type-fest": "^0.20.2"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/globby": {
+ "version": "11.1.0",
+ "resolved": "https://registry.npmmirror.com/globby/-/globby-11.1.0.tgz",
+ "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "array-union": "^2.1.0",
+ "dir-glob": "^3.0.1",
+ "fast-glob": "^3.2.9",
+ "ignore": "^5.2.0",
+ "merge2": "^1.4.1",
+ "slash": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/good-listener": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/good-listener/-/good-listener-1.2.2.tgz",
+ "integrity": "sha512-goW1b+d9q/HIwbVYZzZ6SsTr4IgE+WA44A0GmPIQstuOrgsFcT7VEJ48nmr9GaRtNu0XTKacFLGnBPAM6Afouw==",
+ "dependencies": {
+ "delegate": "^3.1.2"
+ }
+ },
+ "node_modules/gopd": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmmirror.com/gopd/-/gopd-1.0.1.tgz",
+ "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==",
+ "license": "MIT",
+ "dependencies": {
+ "get-intrinsic": "^1.1.3"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/graceful-fs": {
+ "version": "4.2.11",
+ "resolved": "https://registry.npmmirror.com/graceful-fs/-/graceful-fs-4.2.11.tgz",
+ "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==",
+ "dev": true
+ },
+ "node_modules/graphemer": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmmirror.com/graphemer/-/graphemer-1.4.0.tgz",
+ "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==",
+ "dev": true
+ },
+ "node_modules/has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/has-property-descriptors": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmmirror.com/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz",
+ "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==",
+ "license": "MIT",
+ "dependencies": {
+ "es-define-property": "^1.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/has-proto": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmmirror.com/has-proto/-/has-proto-1.0.3.tgz",
+ "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/has-symbols": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmmirror.com/has-symbols/-/has-symbols-1.0.3.tgz",
+ "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/hasown": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmmirror.com/hasown/-/hasown-2.0.2.tgz",
+ "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
+ "license": "MIT",
+ "dependencies": {
+ "function-bind": "^1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/ignore": {
+ "version": "5.3.2",
+ "resolved": "https://registry.npmmirror.com/ignore/-/ignore-5.3.2.tgz",
+ "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 4"
+ }
+ },
+ "node_modules/immutable": {
+ "version": "5.0.3",
+ "resolved": "https://registry.npmmirror.com/immutable/-/immutable-5.0.3.tgz",
+ "integrity": "sha512-P8IdPQHq3lA1xVeBRi5VPqUm5HDgKnx0Ru51wZz5mjxHr5n3RWhjIpOFU7ybkUxfB+5IToy+OLaHYDBIWsv+uw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/import-fresh": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmmirror.com/import-fresh/-/import-fresh-3.3.0.tgz",
+ "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==",
+ "dev": true,
+ "dependencies": {
+ "parent-module": "^1.0.0",
+ "resolve-from": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/imurmurhash": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
+ "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.8.19"
+ }
+ },
+ "node_modules/inflight": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+ "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
+ "dev": true,
+ "dependencies": {
+ "once": "^1.3.0",
+ "wrappy": "1"
+ }
+ },
+ "node_modules/inherits": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
+ "dev": true
+ },
+ "node_modules/is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-glob": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
+ "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
+ "dev": true,
+ "dependencies": {
+ "is-extglob": "^2.1.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-number": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmmirror.com/is-number/-/is-number-7.0.0.tgz",
+ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.12.0"
+ }
+ },
+ "node_modules/is-path-inside": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmmirror.com/is-path-inside/-/is-path-inside-3.0.3.tgz",
+ "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-reference": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmmirror.com/is-reference/-/is-reference-1.2.1.tgz",
+ "integrity": "sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==",
+ "dev": true,
+ "dependencies": {
+ "@types/estree": "*"
+ }
+ },
+ "node_modules/isexe": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
+ "dev": true
+ },
+ "node_modules/jest-worker": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmmirror.com/jest-worker/-/jest-worker-27.5.1.tgz",
+ "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==",
+ "dev": true,
+ "optional": true,
+ "peer": true,
+ "dependencies": {
+ "@types/node": "*",
+ "merge-stream": "^2.0.0",
+ "supports-color": "^8.0.0"
+ },
+ "engines": {
+ "node": ">= 10.13.0"
+ }
+ },
+ "node_modules/jest-worker/node_modules/supports-color": {
+ "version": "8.1.1",
+ "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-8.1.1.tgz",
+ "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
+ "dev": true,
+ "optional": true,
+ "peer": true,
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/js-cookie": {
+ "version": "3.0.5",
+ "resolved": "https://registry.npmmirror.com/js-cookie/-/js-cookie-3.0.5.tgz",
+ "integrity": "sha512-cEiJEAEoIbWfCZYKWhVwFuvPX1gETRYPw6LlaTKoxD3s2AkXzkCjnp6h0V77ozyqj0jakteJ4YqDJT830+lVGw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/js-yaml": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmmirror.com/js-yaml/-/js-yaml-4.1.0.tgz",
+ "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
+ "dev": true,
+ "dependencies": {
+ "argparse": "^2.0.1"
+ },
+ "bin": {
+ "js-yaml": "bin/js-yaml.js"
+ }
+ },
+ "node_modules/json-parse-even-better-errors": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmmirror.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
+ "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==",
+ "dev": true,
+ "optional": true,
+ "peer": true
+ },
+ "node_modules/json-schema-traverse": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmmirror.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
+ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
+ "dev": true
+ },
+ "node_modules/json-stable-stringify-without-jsonify": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
+ "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==",
+ "dev": true
+ },
+ "node_modules/jsonfile": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmmirror.com/jsonfile/-/jsonfile-6.1.0.tgz",
+ "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==",
+ "dev": true,
+ "dependencies": {
+ "universalify": "^2.0.0"
+ },
+ "optionalDependencies": {
+ "graceful-fs": "^4.1.6"
+ }
+ },
+ "node_modules/jsplumb": {
+ "version": "2.15.6",
+ "resolved": "https://registry.npmjs.org/jsplumb/-/jsplumb-2.15.6.tgz",
+ "integrity": "sha512-sIpbpz5eMVM+vV+MQzFCidlaa1RsknrQs6LOTKYDjYUDdTAi2AN2bFi94TxB33TifcIsRNV1jebcaxg0tCoPzg=="
+ },
+ "node_modules/levn": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmmirror.com/levn/-/levn-0.4.1.tgz",
+ "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
+ "dev": true,
+ "dependencies": {
+ "prelude-ls": "^1.2.1",
+ "type-check": "~0.4.0"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/loader-runner": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmmirror.com/loader-runner/-/loader-runner-4.3.0.tgz",
+ "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==",
+ "dev": true,
+ "optional": true,
+ "peer": true,
+ "engines": {
+ "node": ">=6.11.5"
+ }
+ },
+ "node_modules/locate-path": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmmirror.com/locate-path/-/locate-path-6.0.0.tgz",
+ "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
+ "dev": true,
+ "dependencies": {
+ "p-locate": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/lodash": {
+ "version": "4.17.21",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
+ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
+ },
+ "node_modules/lodash-es": {
+ "version": "4.17.21",
+ "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz",
+ "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw=="
+ },
+ "node_modules/lodash-unified": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/lodash-unified/-/lodash-unified-1.0.3.tgz",
+ "integrity": "sha512-WK9qSozxXOD7ZJQlpSqOT+om2ZfcT4yO+03FuzAHD0wF6S0l0090LRPDx3vhTTLZ8cFKpBn+IOcVXK6qOcIlfQ==",
+ "peerDependencies": {
+ "@types/lodash-es": "*",
+ "lodash": "*",
+ "lodash-es": "*"
+ }
+ },
+ "node_modules/lodash.merge": {
+ "version": "4.6.2",
+ "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
+ "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
+ "dev": true
+ },
+ "node_modules/magic-string": {
+ "version": "0.30.11",
+ "resolved": "https://registry.npmmirror.com/magic-string/-/magic-string-0.30.11.tgz",
+ "integrity": "sha512-+Wri9p0QHMy+545hKww7YAu5NyzF8iomPL/RQazugQ9+Ez4Ic3mERMd8ZTX5rfK944j+560ZJi8iAwgak1Ac7A==",
+ "license": "MIT",
+ "dependencies": {
+ "@jridgewell/sourcemap-codec": "^1.5.0"
+ }
+ },
+ "node_modules/memoize-one": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-6.0.0.tgz",
+ "integrity": "sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw=="
+ },
+ "node_modules/merge-stream": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmmirror.com/merge-stream/-/merge-stream-2.0.0.tgz",
+ "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==",
+ "dev": true,
+ "optional": true,
+ "peer": true
+ },
+ "node_modules/merge2": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmmirror.com/merge2/-/merge2-1.4.1.tgz",
+ "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/micromatch": {
+ "version": "4.0.7",
+ "resolved": "https://registry.npmmirror.com/micromatch/-/micromatch-4.0.7.tgz",
+ "integrity": "sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "braces": "^3.0.3",
+ "picomatch": "^2.3.1"
+ },
+ "engines": {
+ "node": ">=8.6"
+ }
+ },
+ "node_modules/mime-db": {
+ "version": "1.52.0",
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
+ "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/mime-types": {
+ "version": "2.1.35",
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
+ "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
+ "dependencies": {
+ "mime-db": "1.52.0"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/minimatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "dev": true,
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/mitt": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmmirror.com/mitt/-/mitt-3.0.1.tgz",
+ "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==",
+ "license": "MIT"
+ },
+ "node_modules/ms": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+ "dev": true
+ },
+ "node_modules/nanoid": {
+ "version": "3.3.11",
+ "resolved": "https://registry.npmmirror.com/nanoid/-/nanoid-3.3.11.tgz",
+ "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "bin": {
+ "nanoid": "bin/nanoid.cjs"
+ },
+ "engines": {
+ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
+ }
+ },
+ "node_modules/natural-compare": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
+ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==",
+ "dev": true
+ },
+ "node_modules/neo-async": {
+ "version": "2.6.2",
+ "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz",
+ "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==",
+ "dev": true
+ },
+ "node_modules/node-addon-api": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmmirror.com/node-addon-api/-/node-addon-api-7.1.1.tgz",
+ "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==",
+ "dev": true,
+ "license": "MIT",
+ "optional": true
+ },
+ "node_modules/node-releases": {
+ "version": "2.0.14",
+ "resolved": "https://registry.npmmirror.com/node-releases/-/node-releases-2.0.14.tgz",
+ "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==",
+ "dev": true,
+ "optional": true,
+ "peer": true
+ },
+ "node_modules/normalize-wheel-es": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/normalize-wheel-es/-/normalize-wheel-es-1.2.0.tgz",
+ "integrity": "sha512-Wj7+EJQ8mSuXr2iWfnujrimU35R2W4FAErEyTmJoJ7ucwTn2hOUSsRehMb5RSYkxXGTM7Y9QpvPmp++w5ftoJw=="
+ },
+ "node_modules/nprogress": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/nprogress/-/nprogress-0.2.0.tgz",
+ "integrity": "sha512-I19aIingLgR1fmhftnbWWO3dXc0hSxqHQHQb3H8m+K3TnEn/iSeTZZOyvKXWqQESMwuUVnatlCnZdLBZZt2VSA=="
+ },
+ "node_modules/nth-check": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz",
+ "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==",
+ "dev": true,
+ "dependencies": {
+ "boolbase": "^1.0.0"
+ }
+ },
+ "node_modules/object-inspect": {
+ "version": "1.13.2",
+ "resolved": "https://registry.npmmirror.com/object-inspect/-/object-inspect-1.13.2.tgz",
+ "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+ "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
+ "dev": true,
+ "dependencies": {
+ "wrappy": "1"
+ }
+ },
+ "node_modules/optionator": {
+ "version": "0.9.3",
+ "resolved": "https://registry.npmmirror.com/optionator/-/optionator-0.9.3.tgz",
+ "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==",
+ "dev": true,
+ "dependencies": {
+ "@aashutoshrathi/word-wrap": "^1.2.3",
+ "deep-is": "^0.1.3",
+ "fast-levenshtein": "^2.0.6",
+ "levn": "^0.4.1",
+ "prelude-ls": "^1.2.1",
+ "type-check": "^0.4.0"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/p-limit": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmmirror.com/p-limit/-/p-limit-3.1.0.tgz",
+ "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
+ "dev": true,
+ "dependencies": {
+ "yocto-queue": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/p-locate": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmmirror.com/p-locate/-/p-locate-5.0.0.tgz",
+ "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
+ "dev": true,
+ "dependencies": {
+ "p-limit": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/parent-module": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmmirror.com/parent-module/-/parent-module-1.0.1.tgz",
+ "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
+ "dev": true,
+ "dependencies": {
+ "callsites": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/path-exists": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmmirror.com/path-exists/-/path-exists-4.0.0.tgz",
+ "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/path-is-absolute": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+ "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/path-key": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
+ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/path-type": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmmirror.com/path-type/-/path-type-4.0.0.tgz",
+ "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/picocolors": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-1.1.1.tgz",
+ "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
+ "license": "ISC"
+ },
+ "node_modules/picomatch": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
+ "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
+ "dev": true,
+ "engines": {
+ "node": ">=8.6"
+ }
+ },
+ "node_modules/pinia": {
+ "version": "2.1.7",
+ "resolved": "https://registry.npmmirror.com/pinia/-/pinia-2.1.7.tgz",
+ "integrity": "sha512-+C2AHFtcFqjPih0zpYuvof37SFxMQ7OEG2zV9jRI12i9BOy3YQVAHwdKtyyc8pDcDyIc33WCIsZaCFWU7WWxGQ==",
+ "dependencies": {
+ "@vue/devtools-api": "^6.5.0",
+ "vue-demi": ">=0.14.5"
+ },
+ "peerDependencies": {
+ "@vue/composition-api": "^1.4.0",
+ "typescript": ">=4.4.4",
+ "vue": "^2.6.14 || ^3.3.0"
+ },
+ "peerDependenciesMeta": {
+ "@vue/composition-api": {
+ "optional": true
+ },
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/postcss": {
+ "version": "8.5.6",
+ "resolved": "https://registry.npmmirror.com/postcss/-/postcss-8.5.6.tgz",
+ "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==",
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/postcss"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "nanoid": "^3.3.11",
+ "picocolors": "^1.1.1",
+ "source-map-js": "^1.2.1"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14"
+ }
+ },
+ "node_modules/postcss-selector-parser": {
+ "version": "6.1.2",
+ "resolved": "https://registry.npmmirror.com/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz",
+ "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "cssesc": "^3.0.0",
+ "util-deprecate": "^1.0.2"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/prelude-ls": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmmirror.com/prelude-ls/-/prelude-ls-1.2.1.tgz",
+ "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/prettier": {
+ "version": "3.3.3",
+ "resolved": "https://registry.npmmirror.com/prettier/-/prettier-3.3.3.tgz",
+ "integrity": "sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "prettier": "bin/prettier.cjs"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/prettier/prettier?sponsor=1"
+ }
+ },
+ "node_modules/print-js": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/print-js/-/print-js-1.6.0.tgz",
+ "integrity": "sha512-BfnOIzSKbqGRtO4o0rnj/K3681BSd2QUrsIZy/+WdCIugjIswjmx3lDEZpXB2ruGf9d4b3YNINri81+J0FsBWg=="
+ },
+ "node_modules/proxy-from-env": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmmirror.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
+ "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg=="
+ },
+ "node_modules/punycode": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmmirror.com/punycode/-/punycode-2.3.1.tgz",
+ "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/qrcodejs2-fixes": {
+ "version": "0.0.2",
+ "resolved": "https://registry.npmjs.org/qrcodejs2-fixes/-/qrcodejs2-fixes-0.0.2.tgz",
+ "integrity": "sha512-wMUXYMOixAEJlLnjk5MbLiFaz0gQObWYm/TIFWB5+j7sTY5gPyr09Cx1EpcLYbsgfFdN3wHjrKAhZofTuCBGhg=="
+ },
+ "node_modules/qs": {
+ "version": "6.13.0",
+ "resolved": "https://registry.npmmirror.com/qs/-/qs-6.13.0.tgz",
+ "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "side-channel": "^1.0.6"
+ },
+ "engines": {
+ "node": ">=0.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/queue-microtask": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmmirror.com/queue-microtask/-/queue-microtask-1.2.3.tgz",
+ "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
+ "dev": true
+ },
+ "node_modules/randombytes": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmmirror.com/randombytes/-/randombytes-2.1.0.tgz",
+ "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==",
+ "dev": true,
+ "optional": true,
+ "peer": true,
+ "dependencies": {
+ "safe-buffer": "^5.1.0"
+ }
+ },
+ "node_modules/readdirp": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmmirror.com/readdirp/-/readdirp-4.0.2.tgz",
+ "integrity": "sha512-yDMz9g+VaZkqBYS/ozoBJwaBhTbZo3UNYQHNRw1D3UFQB8oHB4uS/tAODO+ZLjGWmUbKnIlOWO+aaIiAxrUWHA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 14.16.0"
+ },
+ "funding": {
+ "type": "individual",
+ "url": "https://paulmillr.com/funding/"
+ }
+ },
+ "node_modules/regenerator-runtime": {
+ "version": "0.14.1",
+ "resolved": "https://registry.npmmirror.com/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz",
+ "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==",
+ "license": "MIT"
+ },
+ "node_modules/resolve-from": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmmirror.com/resolve-from/-/resolve-from-4.0.0.tgz",
+ "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/reusify": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmmirror.com/reusify/-/reusify-1.0.4.tgz",
+ "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",
+ "dev": true,
+ "engines": {
+ "iojs": ">=1.0.0",
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/rimraf": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
+ "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
+ "dev": true,
+ "dependencies": {
+ "glob": "^7.1.3"
+ },
+ "bin": {
+ "rimraf": "bin.js"
+ }
+ },
+ "node_modules/rollup": {
+ "version": "4.46.3",
+ "resolved": "https://registry.npmmirror.com/rollup/-/rollup-4.46.3.tgz",
+ "integrity": "sha512-RZn2XTjXb8t5g13f5YclGoilU/kwT696DIkY3sywjdZidNSi3+vseaQov7D7BZXVJCPv3pDWUN69C78GGbXsKw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/estree": "1.0.8"
+ },
+ "bin": {
+ "rollup": "dist/bin/rollup"
+ },
+ "engines": {
+ "node": ">=18.0.0",
+ "npm": ">=8.0.0"
+ },
+ "optionalDependencies": {
+ "@rollup/rollup-android-arm-eabi": "4.46.3",
+ "@rollup/rollup-android-arm64": "4.46.3",
+ "@rollup/rollup-darwin-arm64": "4.46.3",
+ "@rollup/rollup-darwin-x64": "4.46.3",
+ "@rollup/rollup-freebsd-arm64": "4.46.3",
+ "@rollup/rollup-freebsd-x64": "4.46.3",
+ "@rollup/rollup-linux-arm-gnueabihf": "4.46.3",
+ "@rollup/rollup-linux-arm-musleabihf": "4.46.3",
+ "@rollup/rollup-linux-arm64-gnu": "4.46.3",
+ "@rollup/rollup-linux-arm64-musl": "4.46.3",
+ "@rollup/rollup-linux-loongarch64-gnu": "4.46.3",
+ "@rollup/rollup-linux-ppc64-gnu": "4.46.3",
+ "@rollup/rollup-linux-riscv64-gnu": "4.46.3",
+ "@rollup/rollup-linux-riscv64-musl": "4.46.3",
+ "@rollup/rollup-linux-s390x-gnu": "4.46.3",
+ "@rollup/rollup-linux-x64-gnu": "4.46.3",
+ "@rollup/rollup-linux-x64-musl": "4.46.3",
+ "@rollup/rollup-win32-arm64-msvc": "4.46.3",
+ "@rollup/rollup-win32-ia32-msvc": "4.46.3",
+ "@rollup/rollup-win32-x64-msvc": "4.46.3",
+ "fsevents": "~2.3.2"
+ }
+ },
+ "node_modules/run-parallel": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmmirror.com/run-parallel/-/run-parallel-1.2.0.tgz",
+ "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
+ "dev": true,
+ "dependencies": {
+ "queue-microtask": "^1.2.2"
+ }
+ },
+ "node_modules/safe-buffer": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.2.1.tgz",
+ "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
+ "dev": true,
+ "optional": true,
+ "peer": true
+ },
+ "node_modules/sass": {
+ "version": "1.81.0",
+ "resolved": "https://registry.npmmirror.com/sass/-/sass-1.81.0.tgz",
+ "integrity": "sha512-Q4fOxRfhmv3sqCLoGfvrC9pRV8btc0UtqL9mN6Yrv6Qi9ScL55CVH1vlPP863ISLEEMNLLuu9P+enCeGHlnzhA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "chokidar": "^4.0.0",
+ "immutable": "^5.0.2",
+ "source-map-js": ">=0.6.2 <2.0.0"
+ },
+ "bin": {
+ "sass": "sass.js"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ },
+ "optionalDependencies": {
+ "@parcel/watcher": "^2.4.1"
+ }
+ },
+ "node_modules/sass-loader": {
+ "version": "16.0.3",
+ "resolved": "https://registry.npmmirror.com/sass-loader/-/sass-loader-16.0.3.tgz",
+ "integrity": "sha512-gosNorT1RCkuCMyihv6FBRR7BMV06oKRAs+l4UMp1mlcVg9rWN6KMmUj3igjQwmYys4mDP3etEYJgiHRbgHCHA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "neo-async": "^2.6.2"
+ },
+ "engines": {
+ "node": ">= 18.12.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ },
+ "peerDependencies": {
+ "@rspack/core": "0.x || 1.x",
+ "node-sass": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0",
+ "sass": "^1.3.0",
+ "sass-embedded": "*",
+ "webpack": "^5.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@rspack/core": {
+ "optional": true
+ },
+ "node-sass": {
+ "optional": true
+ },
+ "sass": {
+ "optional": true
+ },
+ "sass-embedded": {
+ "optional": true
+ },
+ "webpack": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/schema-utils": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmmirror.com/schema-utils/-/schema-utils-3.3.0.tgz",
+ "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==",
+ "dev": true,
+ "optional": true,
+ "peer": true,
+ "dependencies": {
+ "@types/json-schema": "^7.0.8",
+ "ajv": "^6.12.5",
+ "ajv-keywords": "^3.5.2"
+ },
+ "engines": {
+ "node": ">= 10.13.0"
+ }
+ },
+ "node_modules/screenfull": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/screenfull/-/screenfull-6.0.2.tgz",
+ "integrity": "sha512-AQdy8s4WhNvUZ6P8F6PB21tSPIYKniic+Ogx0AacBMjKP1GUHN2E9URxQHtCusiwxudnCKkdy4GrHXPPJSkCCw==",
+ "engines": {
+ "node": "^14.13.1 || >=16.0.0"
+ }
+ },
+ "node_modules/select": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/select/-/select-1.1.2.tgz",
+ "integrity": "sha512-OwpTSOfy6xSs1+pwcNrv0RBMOzI39Lp3qQKUTPVVPRjCdNa5JH/oPRiqsesIskK8TVgmRiHwO4KXlV2Li9dANA=="
+ },
+ "node_modules/semver": {
+ "version": "7.6.3",
+ "resolved": "https://registry.npmmirror.com/semver/-/semver-7.6.3.tgz",
+ "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==",
+ "dev": true,
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/serialize-javascript": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmmirror.com/serialize-javascript/-/serialize-javascript-6.0.1.tgz",
+ "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==",
+ "dev": true,
+ "optional": true,
+ "peer": true,
+ "dependencies": {
+ "randombytes": "^2.1.0"
+ }
+ },
+ "node_modules/set-function-length": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmmirror.com/set-function-length/-/set-function-length-1.2.2.tgz",
+ "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==",
+ "license": "MIT",
+ "dependencies": {
+ "define-data-property": "^1.1.4",
+ "es-errors": "^1.3.0",
+ "function-bind": "^1.1.2",
+ "get-intrinsic": "^1.2.4",
+ "gopd": "^1.0.1",
+ "has-property-descriptors": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/shebang-command": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
+ "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+ "dev": true,
+ "dependencies": {
+ "shebang-regex": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/shebang-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
+ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/side-channel": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmmirror.com/side-channel/-/side-channel-1.0.6.tgz",
+ "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.4",
+ "object-inspect": "^1.13.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/simple-uploader.js": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/simple-uploader.js/-/simple-uploader.js-0.6.0.tgz",
+ "integrity": "sha512-EXN+o+LD6PVnfzTq/usP8k8yYrI6wKrAx8e+fPcPLVzzttonkyn1KT+Ycx5JnPBSnp6lpiVhNG4JhDJucdPnhA=="
+ },
+ "node_modules/slash": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmmirror.com/slash/-/slash-3.0.0.tgz",
+ "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/sortablejs": {
+ "version": "1.15.2",
+ "resolved": "https://registry.npmmirror.com/sortablejs/-/sortablejs-1.15.2.tgz",
+ "integrity": "sha512-FJF5jgdfvoKn1MAKSdGs33bIqLi3LmsgVTliuX6iITj834F+JRQZN90Z93yql8h0K2t0RwDPBmxwlbZfDcxNZA==",
+ "license": "MIT"
+ },
+ "node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true,
+ "optional": true,
+ "peer": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/source-map-js": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmmirror.com/source-map-js/-/source-map-js-1.2.1.tgz",
+ "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==",
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/source-map-support": {
+ "version": "0.5.21",
+ "resolved": "https://registry.npmmirror.com/source-map-support/-/source-map-support-0.5.21.tgz",
+ "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==",
+ "dev": true,
+ "optional": true,
+ "peer": true,
+ "dependencies": {
+ "buffer-from": "^1.0.0",
+ "source-map": "^0.6.0"
+ }
+ },
+ "node_modules/sourcemap-codec": {
+ "version": "1.4.8",
+ "resolved": "https://registry.npmmirror.com/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz",
+ "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==",
+ "deprecated": "Please use @jridgewell/sourcemap-codec instead",
+ "dev": true
+ },
+ "node_modules/spark-md5": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/spark-md5/-/spark-md5-3.0.2.tgz",
+ "integrity": "sha512-wcFzz9cDfbuqe0FZzfi2or1sgyIrsDwmPwfZC4hiNidPdPINjeUwNfv5kldczoEAcjl9Y1L3SM7Uz2PUEQzxQw=="
+ },
+ "node_modules/splitpanes": {
+ "version": "3.1.5",
+ "resolved": "https://registry.npmmirror.com/splitpanes/-/splitpanes-3.1.5.tgz",
+ "integrity": "sha512-r3Mq2ITFQ5a2VXLOy4/Sb2Ptp7OfEO8YIbhVJqJXoFc9hc5nTXXkCvtVDjIGbvC0vdE7tse+xTM9BMjsszP6bw=="
+ },
+ "node_modules/strip-ansi": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "dev": true,
+ "dependencies": {
+ "ansi-regex": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/strip-json-comments": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmmirror.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
+ "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/style-mod": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmmirror.com/style-mod/-/style-mod-4.0.0.tgz",
+ "integrity": "sha512-OPhtyEjyyN9x3nhPsu76f52yUGXiZcgvsrFVtvTkyGRQJ0XK+GPc6ov1z+lRpbeabka+MYEQxOYRnt5nF30aMw=="
+ },
+ "node_modules/supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/tapable": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmmirror.com/tapable/-/tapable-2.2.1.tgz",
+ "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==",
+ "dev": true,
+ "optional": true,
+ "peer": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/terser": {
+ "version": "5.25.0",
+ "resolved": "https://registry.npmmirror.com/terser/-/terser-5.25.0.tgz",
+ "integrity": "sha512-we0I9SIsfvNUMP77zC9HG+MylwYYsGFSBG8qm+13oud2Yh+O104y614FRbyjpxys16jZwot72Fpi827YvGzuqg==",
+ "dev": true,
+ "optional": true,
+ "peer": true,
+ "dependencies": {
+ "@jridgewell/source-map": "^0.3.3",
+ "acorn": "^8.8.2",
+ "commander": "^2.20.0",
+ "source-map-support": "~0.5.20"
+ },
+ "bin": {
+ "terser": "bin/terser"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/terser-webpack-plugin": {
+ "version": "5.3.9",
+ "resolved": "https://registry.npmmirror.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.9.tgz",
+ "integrity": "sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==",
+ "dev": true,
+ "optional": true,
+ "peer": true,
+ "dependencies": {
+ "@jridgewell/trace-mapping": "^0.3.17",
+ "jest-worker": "^27.4.5",
+ "schema-utils": "^3.1.1",
+ "serialize-javascript": "^6.0.1",
+ "terser": "^5.16.8"
+ },
+ "engines": {
+ "node": ">= 10.13.0"
+ },
+ "peerDependencies": {
+ "webpack": "^5.1.0"
+ },
+ "peerDependenciesMeta": {
+ "@swc/core": {
+ "optional": true
+ },
+ "esbuild": {
+ "optional": true
+ },
+ "uglify-js": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/text-table": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
+ "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==",
+ "dev": true
+ },
+ "node_modules/tiny-emitter": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/tiny-emitter/-/tiny-emitter-2.1.0.tgz",
+ "integrity": "sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q=="
+ },
+ "node_modules/to-fast-properties": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmmirror.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
+ "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/to-regex-range": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmmirror.com/to-regex-range/-/to-regex-range-5.0.1.tgz",
+ "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-number": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=8.0"
+ }
+ },
+ "node_modules/ts-api-utils": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmmirror.com/ts-api-utils/-/ts-api-utils-1.3.0.tgz",
+ "integrity": "sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=16"
+ },
+ "peerDependencies": {
+ "typescript": ">=4.2.0"
+ }
+ },
+ "node_modules/tslib": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.0.tgz",
+ "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg=="
+ },
+ "node_modules/type-check": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmmirror.com/type-check/-/type-check-0.4.0.tgz",
+ "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==",
+ "dev": true,
+ "dependencies": {
+ "prelude-ls": "^1.2.1"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/type-fest": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmmirror.com/type-fest/-/type-fest-0.20.2.tgz",
+ "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/typescript": {
+ "version": "5.5.4",
+ "resolved": "https://registry.npmmirror.com/typescript/-/typescript-5.5.4.tgz",
+ "integrity": "sha512-Mtq29sKDAEYP7aljRgtPOpTvOfbwRWlS6dPRzwjdE+C0R4brX/GUyhHSecbHMFLNBLcJIPt9nl9yG5TZ1weH+Q==",
+ "devOptional": true,
+ "license": "Apache-2.0",
+ "bin": {
+ "tsc": "bin/tsc",
+ "tsserver": "bin/tsserver"
+ },
+ "engines": {
+ "node": ">=14.17"
+ }
+ },
+ "node_modules/undici-types": {
+ "version": "5.26.5",
+ "resolved": "https://registry.npmmirror.com/undici-types/-/undici-types-5.26.5.tgz",
+ "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==",
+ "dev": true
+ },
+ "node_modules/universalify": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmmirror.com/universalify/-/universalify-2.0.1.tgz",
+ "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==",
+ "dev": true,
+ "engines": {
+ "node": ">= 10.0.0"
+ }
+ },
+ "node_modules/update-browserslist-db": {
+ "version": "1.0.13",
+ "resolved": "https://registry.npmmirror.com/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz",
+ "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==",
+ "dev": true,
+ "optional": true,
+ "peer": true,
+ "dependencies": {
+ "escalade": "^3.1.1",
+ "picocolors": "^1.0.0"
+ },
+ "bin": {
+ "update-browserslist-db": "cli.js"
+ },
+ "peerDependencies": {
+ "browserslist": ">= 4.21.0"
+ }
+ },
+ "node_modules/uri-js": {
+ "version": "4.4.1",
+ "resolved": "https://registry.npmmirror.com/uri-js/-/uri-js-4.4.1.tgz",
+ "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
+ "dev": true,
+ "dependencies": {
+ "punycode": "^2.1.0"
+ }
+ },
+ "node_modules/util-deprecate": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmmirror.com/util-deprecate/-/util-deprecate-1.0.2.tgz",
+ "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/vite": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/vite/-/vite-5.1.2.tgz",
+ "integrity": "sha512-uwiFebQbTWRIGbCaTEBVAfKqgqKNKMJ2uPXsXeLIZxM8MVMjoS3j0cG8NrPxdDIadaWnPSjrkLWffLSC+uiP3Q==",
+ "dev": true,
+ "dependencies": {
+ "esbuild": "^0.19.3",
+ "postcss": "^8.4.35",
+ "rollup": "^4.2.0"
+ },
+ "bin": {
+ "vite": "bin/vite.js"
+ },
+ "engines": {
+ "node": "^18.0.0 || >=20.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/vitejs/vite?sponsor=1"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.3"
+ },
+ "peerDependencies": {
+ "@types/node": "^18.0.0 || >=20.0.0",
+ "less": "*",
+ "lightningcss": "^1.21.0",
+ "sass": "*",
+ "stylus": "*",
+ "sugarss": "*",
+ "terser": "^5.4.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/node": {
+ "optional": true
+ },
+ "less": {
+ "optional": true
+ },
+ "lightningcss": {
+ "optional": true
+ },
+ "sass": {
+ "optional": true
+ },
+ "stylus": {
+ "optional": true
+ },
+ "sugarss": {
+ "optional": true
+ },
+ "terser": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/vite-plugin-cdn-import": {
+ "version": "0.3.5",
+ "resolved": "https://registry.npmmirror.com/vite-plugin-cdn-import/-/vite-plugin-cdn-import-0.3.5.tgz",
+ "integrity": "sha512-e1raoalfBiIhv+hnMeSp1UNjloDDBhHpeFxkwRRdPBmTdDRqdEEn8owUmT5u8UBSVCs4xN3n/od4a91vXEhXPQ==",
+ "dev": true,
+ "dependencies": {
+ "rollup-plugin-external-globals": "^0.6.1"
+ }
+ },
+ "node_modules/vite-plugin-cdn-import/node_modules/magic-string": {
+ "version": "0.25.9",
+ "resolved": "https://registry.npmmirror.com/magic-string/-/magic-string-0.25.9.tgz",
+ "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==",
+ "dev": true,
+ "dependencies": {
+ "sourcemap-codec": "^1.4.8"
+ }
+ },
+ "node_modules/vite-plugin-cdn-import/node_modules/rollup": {
+ "version": "2.79.1",
+ "resolved": "https://registry.npmmirror.com/rollup/-/rollup-2.79.1.tgz",
+ "integrity": "sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==",
+ "dev": true,
+ "peer": true,
+ "bin": {
+ "rollup": "dist/bin/rollup"
+ },
+ "engines": {
+ "node": ">=10.0.0"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.2"
+ }
+ },
+ "node_modules/vite-plugin-cdn-import/node_modules/rollup-plugin-external-globals": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmmirror.com/rollup-plugin-external-globals/-/rollup-plugin-external-globals-0.6.1.tgz",
+ "integrity": "sha512-mlp3KNa5sE4Sp9UUR2rjBrxjG79OyZAh/QC18RHIjM+iYkbBwNXSo8DHRMZWtzJTrH8GxQ+SJvCTN3i14uMXIA==",
+ "dev": true,
+ "dependencies": {
+ "@rollup/pluginutils": "^4.0.0",
+ "estree-walker": "^2.0.1",
+ "is-reference": "^1.2.1",
+ "magic-string": "^0.25.7"
+ },
+ "peerDependencies": {
+ "rollup": "^2.25.0"
+ }
+ },
+ "node_modules/vite-plugin-compression": {
+ "version": "0.5.1",
+ "resolved": "https://registry.npmmirror.com/vite-plugin-compression/-/vite-plugin-compression-0.5.1.tgz",
+ "integrity": "sha512-5QJKBDc+gNYVqL/skgFAP81Yuzo9R+EAf19d+EtsMF/i8kFUpNi3J/H01QD3Oo8zBQn+NzoCIFkpPLynoOzaJg==",
+ "dev": true,
+ "dependencies": {
+ "chalk": "^4.1.2",
+ "debug": "^4.3.3",
+ "fs-extra": "^10.0.0"
+ },
+ "peerDependencies": {
+ "vite": ">=2.0.0"
+ }
+ },
+ "node_modules/vite-plugin-vue-setup-extend-plus": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmmirror.com/vite-plugin-vue-setup-extend-plus/-/vite-plugin-vue-setup-extend-plus-0.1.0.tgz",
+ "integrity": "sha512-pa27KIsHIBvBMv4xz9uB3UCfAuP2tr7PLlFhCS9vw+aXd326LEHsvhqd3hCQDOR5MjlQVyQH6vwuGr3u+KRiiw==",
+ "dev": true
+ },
+ "node_modules/vue": {
+ "version": "3.4.37",
+ "resolved": "https://registry.npmmirror.com/vue/-/vue-3.4.37.tgz",
+ "integrity": "sha512-3vXvNfkKTBsSJ7JP+LyR7GBuwQuckbWvuwAid3xbqK9ppsKt/DUvfqgZ48fgOLEfpy1IacL5f8QhUVl77RaI7A==",
+ "license": "MIT",
+ "dependencies": {
+ "@vue/compiler-dom": "3.4.37",
+ "@vue/compiler-sfc": "3.4.37",
+ "@vue/runtime-dom": "3.4.37",
+ "@vue/server-renderer": "3.4.37",
+ "@vue/shared": "3.4.37"
+ },
+ "peerDependencies": {
+ "typescript": "*"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/vue-clipboard3": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/vue-clipboard3/-/vue-clipboard3-2.0.0.tgz",
+ "integrity": "sha512-Q9S7dzWGax7LN5iiSPcu/K1GGm2gcBBlYwmMsUc5/16N6w90cbKow3FnPmPs95sungns4yvd9/+JhbAznECS2A==",
+ "dependencies": {
+ "clipboard": "^2.0.6"
+ }
+ },
+ "node_modules/vue-codemirror": {
+ "version": "6.1.1",
+ "resolved": "https://registry.npmmirror.com/vue-codemirror/-/vue-codemirror-6.1.1.tgz",
+ "integrity": "sha512-rTAYo44owd282yVxKtJtnOi7ERAcXTeviwoPXjIc6K/IQYUsoDkzPvw/JDFtSP6T7Cz/2g3EHaEyeyaQCKoDMg==",
+ "dependencies": {
+ "@codemirror/commands": "6.x",
+ "@codemirror/language": "6.x",
+ "@codemirror/state": "6.x",
+ "@codemirror/view": "6.x"
+ },
+ "peerDependencies": {
+ "codemirror": "6.x",
+ "vue": "3.x"
+ }
+ },
+ "node_modules/vue-demi": {
+ "version": "0.14.10",
+ "resolved": "https://registry.npmmirror.com/vue-demi/-/vue-demi-0.14.10.tgz",
+ "integrity": "sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==",
+ "hasInstallScript": true,
+ "license": "MIT",
+ "bin": {
+ "vue-demi-fix": "bin/vue-demi-fix.js",
+ "vue-demi-switch": "bin/vue-demi-switch.js"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/antfu"
+ },
+ "peerDependencies": {
+ "@vue/composition-api": "^1.0.0-rc.1",
+ "vue": "^3.0.0-0 || ^2.6.0"
+ },
+ "peerDependenciesMeta": {
+ "@vue/composition-api": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/vue-eslint-parser": {
+ "version": "9.4.3",
+ "resolved": "https://registry.npmmirror.com/vue-eslint-parser/-/vue-eslint-parser-9.4.3.tgz",
+ "integrity": "sha512-2rYRLWlIpaiN8xbPiDyXZXRgLGOtWxERV7ND5fFAv5qo1D2N9Fu9MNajBNc6o13lZ+24DAWCkQCvj4klgmcITg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "debug": "^4.3.4",
+ "eslint-scope": "^7.1.1",
+ "eslint-visitor-keys": "^3.3.0",
+ "espree": "^9.3.1",
+ "esquery": "^1.4.0",
+ "lodash": "^4.17.21",
+ "semver": "^7.3.6"
+ },
+ "engines": {
+ "node": "^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/mysticatea"
+ },
+ "peerDependencies": {
+ "eslint": ">=6.0.0"
+ }
+ },
+ "node_modules/vue-eslint-parser/node_modules/eslint-scope": {
+ "version": "7.2.2",
+ "resolved": "https://registry.npmmirror.com/eslint-scope/-/eslint-scope-7.2.2.tgz",
+ "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "esrecurse": "^4.3.0",
+ "estraverse": "^5.2.0"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/vue-eslint-parser/node_modules/estraverse": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmmirror.com/estraverse/-/estraverse-5.3.0.tgz",
+ "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/vue-grid-layout": {
+ "version": "3.0.0-beta1",
+ "resolved": "https://registry.npmjs.org/vue-grid-layout/-/vue-grid-layout-3.0.0-beta1.tgz",
+ "integrity": "sha512-MsW0yfYNtnAO/uDhfZvkP6effxSJxvhAFbIL37x6Rn3vW9xf0WHVefKaSbQMLpSq3mXnR6ut0pg2Cd5lqIIZzg==",
+ "dependencies": {
+ "@interactjs/actions": "^1.10.2",
+ "@interactjs/auto-start": "^1.10.2",
+ "@interactjs/dev-tools": "^1.10.2",
+ "@interactjs/interactjs": "^1.10.2",
+ "@interactjs/modifiers": "^1.10.2",
+ "element-resize-detector": "^1.2.1",
+ "mitt": "^2.1.0"
+ }
+ },
+ "node_modules/vue-grid-layout/node_modules/mitt": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/mitt/-/mitt-2.1.0.tgz",
+ "integrity": "sha512-ILj2TpLiysu2wkBbWjAmww7TkZb65aiQO+DkVdUTBpBXq+MHYiETENkKFMtsJZX1Lf4pe4QOrTSjIfUwN5lRdg=="
+ },
+ "node_modules/vue-i18n": {
+ "version": "11.1.2",
+ "resolved": "https://registry.npmmirror.com/vue-i18n/-/vue-i18n-11.1.2.tgz",
+ "integrity": "sha512-MfdkdKGUHN+jkkaMT5Zbl4FpRmN7kfelJIwKoUpJ32ONIxdFhzxZiLTVaAXkAwvH3y9GmWpoiwjDqbPIkPIMFA==",
+ "license": "MIT",
+ "dependencies": {
+ "@intlify/core-base": "11.1.2",
+ "@intlify/shared": "11.1.2",
+ "@vue/devtools-api": "^6.5.0"
+ },
+ "engines": {
+ "node": ">= 16"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/kazupon"
+ },
+ "peerDependencies": {
+ "vue": "^3.0.0"
+ }
+ },
+ "node_modules/vue-router": {
+ "version": "4.4.3",
+ "resolved": "https://registry.npmmirror.com/vue-router/-/vue-router-4.4.3.tgz",
+ "integrity": "sha512-sv6wmNKx2j3aqJQDMxLFzs/u/mjA9Z5LCgy6BE0f7yFWMjrPLnS/sPNn8ARY/FXw6byV18EFutn5lTO6+UsV5A==",
+ "license": "MIT",
+ "dependencies": {
+ "@vue/devtools-api": "^6.6.3"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/posva"
+ },
+ "peerDependencies": {
+ "vue": "^3.2.0"
+ }
+ },
+ "node_modules/vue-simple-uploader": {
+ "version": "1.0.0-beta.5",
+ "resolved": "https://registry.npmjs.org/vue-simple-uploader/-/vue-simple-uploader-1.0.0-beta.5.tgz",
+ "integrity": "sha512-VJFQvYTqx8vd4OOAopafcHdRp25iBqUywbBDohpS+nLerUbotAfkH4WsCzaTWFFSF2PRLdbPX1yxijADxv+sGg==",
+ "dependencies": {
+ "simple-uploader.js": "^0.6.0"
+ },
+ "engines": {
+ "node": ">= 4.0.0",
+ "npm": ">= 3.0.0"
+ },
+ "peerDependencies": {
+ "vue": ">=3.1"
+ }
+ },
+ "node_modules/vue-ueditor-wrap": {
+ "version": "3.0.8",
+ "resolved": "https://registry.npmmirror.com/vue-ueditor-wrap/-/vue-ueditor-wrap-3.0.8.tgz",
+ "integrity": "sha512-U1s30pKcz8rr6v2F2ivnomOf1vF1N+n+aNClas4jXfiEf4E5FEtNwkFJBugcyf2VTRFK0UVpx5WspX5nwmImYw==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/runtime": "7.x"
+ },
+ "peerDependencies": {
+ "vue": "^3.0.0"
+ }
+ },
+ "node_modules/w3c-keyname": {
+ "version": "2.2.6",
+ "resolved": "https://registry.npmmirror.com/w3c-keyname/-/w3c-keyname-2.2.6.tgz",
+ "integrity": "sha512-f+fciywl1SJEniZHD6H+kUO8gOnwIr7f4ijKA6+ZvJFjeGi1r4PDLl53Ayud9O/rk64RqgoQine0feoeOU0kXg=="
+ },
+ "node_modules/watchpack": {
+ "version": "2.4.0",
+ "resolved": "https://registry.npmmirror.com/watchpack/-/watchpack-2.4.0.tgz",
+ "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==",
+ "dev": true,
+ "optional": true,
+ "peer": true,
+ "dependencies": {
+ "glob-to-regexp": "^0.4.1",
+ "graceful-fs": "^4.1.2"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
+ "node_modules/webpack": {
+ "version": "5.89.0",
+ "resolved": "https://registry.npmmirror.com/webpack/-/webpack-5.89.0.tgz",
+ "integrity": "sha512-qyfIC10pOr70V+jkmud8tMfajraGCZMBWJtrmuBymQKCrLTRejBI8STDp1MCyZu/QTdZSeacCQYpYNQVOzX5kw==",
+ "dev": true,
+ "optional": true,
+ "peer": true,
+ "dependencies": {
+ "@types/eslint-scope": "^3.7.3",
+ "@types/estree": "^1.0.0",
+ "@webassemblyjs/ast": "^1.11.5",
+ "@webassemblyjs/wasm-edit": "^1.11.5",
+ "@webassemblyjs/wasm-parser": "^1.11.5",
+ "acorn": "^8.7.1",
+ "acorn-import-assertions": "^1.9.0",
+ "browserslist": "^4.14.5",
+ "chrome-trace-event": "^1.0.2",
+ "enhanced-resolve": "^5.15.0",
+ "es-module-lexer": "^1.2.1",
+ "eslint-scope": "5.1.1",
+ "events": "^3.2.0",
+ "glob-to-regexp": "^0.4.1",
+ "graceful-fs": "^4.2.9",
+ "json-parse-even-better-errors": "^2.3.1",
+ "loader-runner": "^4.2.0",
+ "mime-types": "^2.1.27",
+ "neo-async": "^2.6.2",
+ "schema-utils": "^3.2.0",
+ "tapable": "^2.1.1",
+ "terser-webpack-plugin": "^5.3.7",
+ "watchpack": "^2.4.0",
+ "webpack-sources": "^3.2.3"
+ },
+ "bin": {
+ "webpack": "bin/webpack.js"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ },
+ "peerDependenciesMeta": {
+ "webpack-cli": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/webpack-sources": {
+ "version": "3.2.3",
+ "resolved": "https://registry.npmmirror.com/webpack-sources/-/webpack-sources-3.2.3.tgz",
+ "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==",
+ "dev": true,
+ "optional": true,
+ "peer": true,
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
+ "node_modules/which": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+ "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+ "dev": true,
+ "dependencies": {
+ "isexe": "^2.0.0"
+ },
+ "bin": {
+ "node-which": "bin/node-which"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
+ "dev": true
+ },
+ "node_modules/xml-name-validator": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz",
+ "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==",
+ "dev": true,
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/yocto-queue": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmmirror.com/yocto-queue/-/yocto-queue-0.1.0.tgz",
+ "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/zrender": {
+ "version": "5.6.0",
+ "resolved": "https://registry.npmmirror.com/zrender/-/zrender-5.6.0.tgz",
+ "integrity": "sha512-uzgraf4njmmHAbEUxMJ8Oxg+P3fT04O+9p7gY+wJRVxo8Ge+KmYv0WJev945EH4wFuc4OY2NLXz46FZrWS9xJg==",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "tslib": "2.3.0"
+ }
+ }
+ }
+}
diff --git a/package.json b/package.json
new file mode 100644
index 0000000..ba20ccb
--- /dev/null
+++ b/package.json
@@ -0,0 +1,94 @@
+{
+ "name": "vue-next-admin",
+ "version": "2.4.33",
+ "description": "vue3 vite next admin template",
+ "author": "lyt_20201208",
+ "license": "MIT",
+ "type": "module",
+ "scripts": {
+ "dev": "vite",
+ "build": "vite build",
+ "lint-fix": "eslint --fix --ext .js --ext .jsx --ext .vue src/"
+ },
+ "dependencies": {
+ "@codemirror/lang-javascript": "^6.1.1",
+ "@codemirror/theme-one-dark": "^6.1.0",
+ "@element-plus/icons-vue": "^2.3.1",
+ "axios": "1.8.2",
+ "codemirror": "^6.0.1",
+ "countup.js": "^2.8.0",
+ "cropperjs": "^1.6.0",
+ "echarts": "^5.5.0",
+ "echarts-gl": "^2.0.9",
+ "echarts-wordcloud": "^2.1.0",
+ "element-plus": "^2.10.7",
+ "js-cookie": "^3.0.5",
+ "jsplumb": "^2.15.6",
+ "lodash": "^4.17.21",
+ "mitt": "^3.0.1",
+ "nprogress": "^0.2.0",
+ "pinia": "^2.1.7",
+ "print-js": "^1.6.0",
+ "qrcodejs2-fixes": "^0.0.2",
+ "qs": "^6.12.0",
+ "screenfull": "^6.0.2",
+ "sortablejs": "^1.15.2",
+ "spark-md5": "^3.0.2",
+ "splitpanes": "^3.1.5",
+ "vue": "^3.4.21",
+ "vue-clipboard3": "^2.0.0",
+ "vue-codemirror": "^6.1.1",
+ "vue-demi": "^0.14.7",
+ "vue-grid-layout": "^3.0.0-beta1",
+ "vue-i18n": "11.1.2",
+ "vue-router": "^4.3.0",
+ "vue-simple-uploader": "^1.0.0-beta.5",
+ "vue-ueditor-wrap": "^3.0.8"
+ },
+ "devDependencies": {
+ "@types/node": "^20.11.28",
+ "@types/nprogress": "^0.2.3",
+ "@types/sortablejs": "^1.15.8",
+ "@typescript-eslint/eslint-plugin": "^7.2.0",
+ "@typescript-eslint/parser": "^7.2.0",
+ "@vitejs/plugin-vue": "^5.1.2",
+ "@vue/compiler-sfc": "^3.4.21",
+ "dotenv": "^16.0.1",
+ "eslint": "^8.57.0",
+ "eslint-plugin-vue": "^9.23.0",
+ "prettier": "^3.2.5",
+ "sass": "^1.80.7",
+ "sass-loader": "^16.0.3",
+ "typescript": "^5.4.2",
+ "vite": "^5.1.2",
+ "vite-plugin-cdn-import": "^0.3.5",
+ "vite-plugin-compression": "^0.5.1",
+ "vite-plugin-vue-setup-extend-plus": "^0.1.0",
+ "vue-eslint-parser": "^9.4.1"
+ },
+ "browserslist": [
+ "> 1%",
+ "last 2 versions",
+ "not dead"
+ ],
+ "bugs": {
+ "url": "https://gitee.com/lyt-top/vue-next-admin/issues"
+ },
+ "engines": {
+ "node": ">=16.0.0",
+ "npm": ">=7.0.0"
+ },
+ "keywords": [
+ "vue",
+ "vue3",
+ "vuejs/vue-next",
+ "element-ui",
+ "element-plus",
+ "vue-next-admin",
+ "next-admin"
+ ],
+ "repository": {
+ "type": "git",
+ "url": "https://gitee.com/lyt-top/vue-next-admin.git"
+ }
+}
diff --git a/plugins.d.ts b/plugins.d.ts
new file mode 100644
index 0000000..be0457a
--- /dev/null
+++ b/plugins.d.ts
@@ -0,0 +1,4 @@
+declare module 'vue-grid-layout';
+declare module 'qrcodejs2-fixes';
+declare module 'splitpanes';
+declare module 'js-cookie';
diff --git a/public/at.alicdn.com/t/font_2298093_y6u00apwst.css b/public/at.alicdn.com/t/font_2298093_y6u00apwst.css
new file mode 100644
index 0000000..f89e609
--- /dev/null
+++ b/public/at.alicdn.com/t/font_2298093_y6u00apwst.css
@@ -0,0 +1,427 @@
+@font-face {
+ font-family: "iconfont"; /* Project id 2298093 */
+ src: url('./font_2298093_y6u00apwst.woff2?t=1627014681704') format('woff2'),
+ url('./font_2298093_y6u00apwst.woff?t=1627014681704') format('woff'),
+ url('./font_2298093_y6u00apwst.ttf?t=1627014681704') format('truetype');
+}
+
+.iconfont {
+ font-family: "iconfont" !important;
+ font-size: 16px;
+ font-style: normal;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+}
+
+.icon-diannao101:before {
+ content: "\e670";
+}
+
+.icon-diannao:before {
+ content: "\e618";
+}
+
+.icon-diannao1:before {
+ content: "\e622";
+}
+
+.icon-diannao-shuju:before {
+ content: "\e63e";
+}
+
+.icon-shoujidiannao:before {
+ content: "\e62e";
+}
+
+.icon-diannaobangong:before {
+ content: "\e647";
+}
+
+.icon-LoggedinPC:before {
+ content: "\e604";
+}
+
+.icon-barcode-qr:before {
+ content: "\e61e";
+}
+
+.icon-zhongduancanshuchaxun:before {
+ content: "\e638";
+}
+
+.icon-shouye_dongtaihui:before {
+ content: "\e606";
+}
+
+.icon-putong:before {
+ content: "\e603";
+}
+
+.icon-dongtai:before {
+ content: "\e659";
+}
+
+.icon-wenducanshu-05:before {
+ content: "\e634";
+}
+
+.icon-zhongduancanshu:before {
+ content: "\e63b";
+}
+
+.icon-tongzhi1:before {
+ content: "\e63a";
+}
+
+.icon-tongzhi2:before {
+ content: "\e649";
+}
+
+.icon-tongzhi3:before {
+ content: "\e648";
+}
+
+.icon-tongzhi4:before {
+ content: "\e60c";
+}
+
+.icon-dianhua:before {
+ content: "\e615";
+}
+
+.icon-xianshimima:before {
+ content: "\e63c";
+}
+
+.icon-yincangmima:before {
+ content: "\e63d";
+}
+
+.icon-shuxing:before {
+ content: "\e67a";
+}
+
+.icon-juxingkaobei:before {
+ content: "\e7a5";
+}
+
+.icon-shuxingtu:before {
+ content: "\e685";
+}
+
+.icon-bolangneng:before {
+ content: "\e745";
+}
+
+.icon-bolangnengshiyanchang:before {
+ content: "\e746";
+}
+
+.icon--chaifenhang:before {
+ content: "\e6d1";
+}
+
+.icon--chaifenlie:before {
+ content: "\e6d0";
+}
+
+.icon-tupianyulan:before {
+ content: "\e67e";
+}
+
+.icon-15tupianyulan:before {
+ content: "\e624";
+}
+
+.icon-728bianjiqi_zitidaxiao:before {
+ content: "\e660";
+}
+
+.icon-ziti:before {
+ content: "\e7b1";
+}
+
+.icon-font-size:before {
+ content: "\eaef";
+}
+
+.icon-tuodong:before {
+ content: "\e6a8";
+}
+
+.icon-zhongyingwen1:before {
+ content: "\e7a3";
+}
+
+.icon-fuhao-yingwen:before {
+ content: "\e714";
+}
+
+.icon-fuhao-zhongwen:before {
+ content: "\e712";
+}
+
+.icon-diqiu:before {
+ content: "\e689";
+}
+
+.icon-xingqiu:before {
+ content: "\e65c";
+}
+
+.icon-diqiu1:before {
+ content: "\e631";
+}
+
+.icon-huanjingxingqiu:before {
+ content: "\e617";
+}
+
+.icon-zidingyibuju:before {
+ content: "\e637";
+}
+
+.icon-dayin:before {
+ content: "\e612";
+}
+
+.icon-step:before {
+ content: "\e601";
+}
+
+.icon-30xuanzhongyuanxingfill:before {
+ content: "\e677";
+}
+
+.icon-shibai:before {
+ content: "\e60b";
+}
+
+.icon-7_round_solid:before {
+ content: "\e64d";
+}
+
+.icon-6_round_solid:before {
+ content: "\e64e";
+}
+
+.icon-9_round_solid:before {
+ content: "\e64f";
+}
+
+.icon-1_round_solid:before {
+ content: "\e650";
+}
+
+.icon-5_round_solid:before {
+ content: "\e651";
+}
+
+.icon-2_round_solid:before {
+ content: "\e654";
+}
+
+.icon-0_round_solid:before {
+ content: "\e655";
+}
+
+.icon-3_round_solid:before {
+ content: "\e656";
+}
+
+.icon-4_round_solid:before {
+ content: "\e657";
+}
+
+.icon-8_round_solid:before {
+ content: "\e658";
+}
+
+.icon-radio-off-full:before {
+ content: "\ea6b";
+}
+
+.icon-tongzhi:before {
+ content: "\e600";
+}
+
+.icon-ditu:before {
+ content: "\e8bc";
+}
+
+.icon-ico:before {
+ content: "\e646";
+}
+
+.icon-chazhaobiaodanliebiao:before {
+ content: "\e76a";
+}
+
+.icon-biaodan:before {
+ content: "\e61d";
+}
+
+.icon-siweidaotu:before {
+ content: "\e614";
+}
+
+.icon-jiliandongxuanzeqi:before {
+ content: "\e616";
+}
+
+.icon-caijian:before {
+ content: "\e611";
+}
+
+.icon-fuwenben:before {
+ content: "\e7e4";
+}
+
+.icon-fuwenbenkuang:before {
+ content: "\e66f";
+}
+
+.icon-shangchuan:before {
+ content: "\e663";
+}
+
+.icon-xuanzeqi:before {
+ content: "\e635";
+}
+
+.icon-fangkuang:before {
+ content: "\e642";
+}
+
+.icon-gouxuan-weixuanzhong-xianxingfangkuang:before {
+ content: "\e77b";
+}
+
+.icon-shidu:before {
+ content: "\e60a";
+}
+
+.icon-yangan:before {
+ content: "\e67d";
+}
+
+.icon-wendu:before {
+ content: "\e686";
+}
+
+.icon-zaosheng:before {
+ content: "\e61c";
+}
+
+.icon-jinridaiban:before {
+ content: "\e60f";
+}
+
+.icon-AIshiyanshi:before {
+ content: "\e609";
+}
+
+.icon-shenqingkaiban:before {
+ content: "\e639";
+}
+
+.icon-zhongyingwenqiehuan:before {
+ content: "\e611";
+}
+
+.icon-zhongyingwen:before {
+ content: "\e605";
+}
+
+.icon-zhongyingzhuanhuan:before {
+ content: "\e6a2";
+}
+
+.icon-zhongyingwenyuyan:before {
+ content: "\e609";
+}
+
+.icon-shuju:before {
+ content: "\e613";
+}
+
+.icon-ico_shuju:before {
+ content: "\e6ff";
+}
+
+.icon-shuju1:before {
+ content: "\e60e";
+}
+
+.icon-fuzhiyemian:before {
+ content: "\e772";
+}
+
+.icon-caozuo-wailian:before {
+ content: "\e711";
+}
+
+.icon-icon-:before {
+ content: "\e620";
+}
+
+.icon-gerenzhongxin:before {
+ content: "\e60d";
+}
+
+.icon-caidan:before {
+ content: "\e652";
+}
+
+.icon-xitongshezhi:before {
+ content: "\e69b";
+}
+
+.icon-neiqianshujuchucun:before {
+ content: "\e62f";
+}
+
+.icon-shouye:before {
+ content: "\e653";
+}
+
+.icon-quanxian:before {
+ content: "\e610";
+}
+
+.icon-zujian:before {
+ content: "\e85e";
+}
+
+.icon-crew_feature:before {
+ content: "\e602";
+}
+
+.icon-gongju:before {
+ content: "\e62d";
+}
+
+.icon-skin:before {
+ content: "\e636";
+}
+
+.icon-shixinyuan:before {
+ content: "\e669";
+}
+
+.icon-webicon318:before {
+ content: "\e6a9";
+}
+
+.icon-dian:before {
+ content: "\e608";
+}
+
+.icon-fullscreen:before {
+ content: "\e623";
+}
+
+.icon-tuichuquanping:before {
+ content: "\e641";
+}
+
diff --git a/public/at.alicdn.com/t/font_2298093_y6u00apwst.ttf b/public/at.alicdn.com/t/font_2298093_y6u00apwst.ttf
new file mode 100644
index 0000000..2d3a61d
Binary files /dev/null and b/public/at.alicdn.com/t/font_2298093_y6u00apwst.ttf differ
diff --git a/public/at.alicdn.com/t/font_2298093_y6u00apwst.woff b/public/at.alicdn.com/t/font_2298093_y6u00apwst.woff
new file mode 100644
index 0000000..c3575c3
Binary files /dev/null and b/public/at.alicdn.com/t/font_2298093_y6u00apwst.woff differ
diff --git a/public/at.alicdn.com/t/font_2298093_y6u00apwst.woff2 b/public/at.alicdn.com/t/font_2298093_y6u00apwst.woff2
new file mode 100644
index 0000000..9eaf90e
Binary files /dev/null and b/public/at.alicdn.com/t/font_2298093_y6u00apwst.woff2 differ
diff --git a/public/favicon.ico b/public/favicon.ico
new file mode 100644
index 0000000..84d3760
Binary files /dev/null and b/public/favicon.ico differ
diff --git a/public/netdna.bootstrapcdn.com/css/font-awesome.min.css b/public/netdna.bootstrapcdn.com/css/font-awesome.min.css
new file mode 100644
index 0000000..540440c
--- /dev/null
+++ b/public/netdna.bootstrapcdn.com/css/font-awesome.min.css
@@ -0,0 +1,4 @@
+/*!
+ * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome
+ * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License)
+ */@font-face{font-family:'FontAwesome';src:url('../fonts/fontawesome-webfont.eot?v=4.7.0');src:url('../fonts/fontawesome-webfont.eot?#iefix&v=4.7.0') format('embedded-opentype'),url('../fonts/fontawesome-webfont.woff2?v=4.7.0') format('woff2'),url('../fonts/fontawesome-webfont.woff?v=4.7.0') format('woff'),url('../fonts/fontawesome-webfont.ttf?v=4.7.0') format('truetype'),url('../fonts/fontawesome-webfont.svg?v=4.7.0#fontawesomeregular') format('svg');font-weight:normal;font-style:normal}.fa{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571429em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em;text-align:center}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:solid .08em #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left{margin-right:.3em}.fa.fa-pull-right{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}.fa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scale(-1, 1);-ms-transform:scale(-1, 1);transform:scale(-1, 1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scale(1, -1);-ms-transform:scale(1, -1);transform:scale(1, -1)}:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-flip-horizontal,:root .fa-flip-vertical{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:"\f000"}.fa-music:before{content:"\f001"}.fa-search:before{content:"\f002"}.fa-envelope-o:before{content:"\f003"}.fa-heart:before{content:"\f004"}.fa-star:before{content:"\f005"}.fa-star-o:before{content:"\f006"}.fa-user:before{content:"\f007"}.fa-film:before{content:"\f008"}.fa-th-large:before{content:"\f009"}.fa-th:before{content:"\f00a"}.fa-th-list:before{content:"\f00b"}.fa-check:before{content:"\f00c"}.fa-remove:before,.fa-close:before,.fa-times:before{content:"\f00d"}.fa-search-plus:before{content:"\f00e"}.fa-search-minus:before{content:"\f010"}.fa-power-off:before{content:"\f011"}.fa-signal:before{content:"\f012"}.fa-gear:before,.fa-cog:before{content:"\f013"}.fa-trash-o:before{content:"\f014"}.fa-home:before{content:"\f015"}.fa-file-o:before{content:"\f016"}.fa-clock-o:before{content:"\f017"}.fa-road:before{content:"\f018"}.fa-download:before{content:"\f019"}.fa-arrow-circle-o-down:before{content:"\f01a"}.fa-arrow-circle-o-up:before{content:"\f01b"}.fa-inbox:before{content:"\f01c"}.fa-play-circle-o:before{content:"\f01d"}.fa-rotate-right:before,.fa-repeat:before{content:"\f01e"}.fa-refresh:before{content:"\f021"}.fa-list-alt:before{content:"\f022"}.fa-lock:before{content:"\f023"}.fa-flag:before{content:"\f024"}.fa-headphones:before{content:"\f025"}.fa-volume-off:before{content:"\f026"}.fa-volume-down:before{content:"\f027"}.fa-volume-up:before{content:"\f028"}.fa-qrcode:before{content:"\f029"}.fa-barcode:before{content:"\f02a"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-print:before{content:"\f02f"}.fa-camera:before{content:"\f030"}.fa-font:before{content:"\f031"}.fa-bold:before{content:"\f032"}.fa-italic:before{content:"\f033"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-align-left:before{content:"\f036"}.fa-align-center:before{content:"\f037"}.fa-align-right:before{content:"\f038"}.fa-align-justify:before{content:"\f039"}.fa-list:before{content:"\f03a"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-indent:before{content:"\f03c"}.fa-video-camera:before{content:"\f03d"}.fa-photo:before,.fa-image:before,.fa-picture-o:before{content:"\f03e"}.fa-pencil:before{content:"\f040"}.fa-map-marker:before{content:"\f041"}.fa-adjust:before{content:"\f042"}.fa-tint:before{content:"\f043"}.fa-edit:before,.fa-pencil-square-o:before{content:"\f044"}.fa-share-square-o:before{content:"\f045"}.fa-check-square-o:before{content:"\f046"}.fa-arrows:before{content:"\f047"}.fa-step-backward:before{content:"\f048"}.fa-fast-backward:before{content:"\f049"}.fa-backward:before{content:"\f04a"}.fa-play:before{content:"\f04b"}.fa-pause:before{content:"\f04c"}.fa-stop:before{content:"\f04d"}.fa-forward:before{content:"\f04e"}.fa-fast-forward:before{content:"\f050"}.fa-step-forward:before{content:"\f051"}.fa-eject:before{content:"\f052"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-plus-circle:before{content:"\f055"}.fa-minus-circle:before{content:"\f056"}.fa-times-circle:before{content:"\f057"}.fa-check-circle:before{content:"\f058"}.fa-question-circle:before{content:"\f059"}.fa-info-circle:before{content:"\f05a"}.fa-crosshairs:before{content:"\f05b"}.fa-times-circle-o:before{content:"\f05c"}.fa-check-circle-o:before{content:"\f05d"}.fa-ban:before{content:"\f05e"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrow-down:before{content:"\f063"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-expand:before{content:"\f065"}.fa-compress:before{content:"\f066"}.fa-plus:before{content:"\f067"}.fa-minus:before{content:"\f068"}.fa-asterisk:before{content:"\f069"}.fa-exclamation-circle:before{content:"\f06a"}.fa-gift:before{content:"\f06b"}.fa-leaf:before{content:"\f06c"}.fa-fire:before{content:"\f06d"}.fa-eye:before{content:"\f06e"}.fa-eye-slash:before{content:"\f070"}.fa-warning:before,.fa-exclamation-triangle:before{content:"\f071"}.fa-plane:before{content:"\f072"}.fa-calendar:before{content:"\f073"}.fa-random:before{content:"\f074"}.fa-comment:before{content:"\f075"}.fa-magnet:before{content:"\f076"}.fa-chevron-up:before{content:"\f077"}.fa-chevron-down:before{content:"\f078"}.fa-retweet:before{content:"\f079"}.fa-shopping-cart:before{content:"\f07a"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-arrows-v:before{content:"\f07d"}.fa-arrows-h:before{content:"\f07e"}.fa-bar-chart-o:before,.fa-bar-chart:before{content:"\f080"}.fa-twitter-square:before{content:"\f081"}.fa-facebook-square:before{content:"\f082"}.fa-camera-retro:before{content:"\f083"}.fa-key:before{content:"\f084"}.fa-gears:before,.fa-cogs:before{content:"\f085"}.fa-comments:before{content:"\f086"}.fa-thumbs-o-up:before{content:"\f087"}.fa-thumbs-o-down:before{content:"\f088"}.fa-star-half:before{content:"\f089"}.fa-heart-o:before{content:"\f08a"}.fa-sign-out:before{content:"\f08b"}.fa-linkedin-square:before{content:"\f08c"}.fa-thumb-tack:before{content:"\f08d"}.fa-external-link:before{content:"\f08e"}.fa-sign-in:before{content:"\f090"}.fa-trophy:before{content:"\f091"}.fa-github-square:before{content:"\f092"}.fa-upload:before{content:"\f093"}.fa-lemon-o:before{content:"\f094"}.fa-phone:before{content:"\f095"}.fa-square-o:before{content:"\f096"}.fa-bookmark-o:before{content:"\f097"}.fa-phone-square:before{content:"\f098"}.fa-twitter:before{content:"\f099"}.fa-facebook-f:before,.fa-facebook:before{content:"\f09a"}.fa-github:before{content:"\f09b"}.fa-unlock:before{content:"\f09c"}.fa-credit-card:before{content:"\f09d"}.fa-feed:before,.fa-rss:before{content:"\f09e"}.fa-hdd-o:before{content:"\f0a0"}.fa-bullhorn:before{content:"\f0a1"}.fa-bell:before{content:"\f0f3"}.fa-certificate:before{content:"\f0a3"}.fa-hand-o-right:before{content:"\f0a4"}.fa-hand-o-left:before{content:"\f0a5"}.fa-hand-o-up:before{content:"\f0a6"}.fa-hand-o-down:before{content:"\f0a7"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-globe:before{content:"\f0ac"}.fa-wrench:before{content:"\f0ad"}.fa-tasks:before{content:"\f0ae"}.fa-filter:before{content:"\f0b0"}.fa-briefcase:before{content:"\f0b1"}.fa-arrows-alt:before{content:"\f0b2"}.fa-group:before,.fa-users:before{content:"\f0c0"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-cloud:before{content:"\f0c2"}.fa-flask:before{content:"\f0c3"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-copy:before,.fa-files-o:before{content:"\f0c5"}.fa-paperclip:before{content:"\f0c6"}.fa-save:before,.fa-floppy-o:before{content:"\f0c7"}.fa-square:before{content:"\f0c8"}.fa-navicon:before,.fa-reorder:before,.fa-bars:before{content:"\f0c9"}.fa-list-ul:before{content:"\f0ca"}.fa-list-ol:before{content:"\f0cb"}.fa-strikethrough:before{content:"\f0cc"}.fa-underline:before{content:"\f0cd"}.fa-table:before{content:"\f0ce"}.fa-magic:before{content:"\f0d0"}.fa-truck:before{content:"\f0d1"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-square:before{content:"\f0d3"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-plus:before{content:"\f0d5"}.fa-money:before{content:"\f0d6"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-up:before{content:"\f0d8"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-columns:before{content:"\f0db"}.fa-unsorted:before,.fa-sort:before{content:"\f0dc"}.fa-sort-down:before,.fa-sort-desc:before{content:"\f0dd"}.fa-sort-up:before,.fa-sort-asc:before{content:"\f0de"}.fa-envelope:before{content:"\f0e0"}.fa-linkedin:before{content:"\f0e1"}.fa-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-legal:before,.fa-gavel:before{content:"\f0e3"}.fa-dashboard:before,.fa-tachometer:before{content:"\f0e4"}.fa-comment-o:before{content:"\f0e5"}.fa-comments-o:before{content:"\f0e6"}.fa-flash:before,.fa-bolt:before{content:"\f0e7"}.fa-sitemap:before{content:"\f0e8"}.fa-umbrella:before{content:"\f0e9"}.fa-paste:before,.fa-clipboard:before{content:"\f0ea"}.fa-lightbulb-o:before{content:"\f0eb"}.fa-exchange:before{content:"\f0ec"}.fa-cloud-download:before{content:"\f0ed"}.fa-cloud-upload:before{content:"\f0ee"}.fa-user-md:before{content:"\f0f0"}.fa-stethoscope:before{content:"\f0f1"}.fa-suitcase:before{content:"\f0f2"}.fa-bell-o:before{content:"\f0a2"}.fa-coffee:before{content:"\f0f4"}.fa-cutlery:before{content:"\f0f5"}.fa-file-text-o:before{content:"\f0f6"}.fa-building-o:before{content:"\f0f7"}.fa-hospital-o:before{content:"\f0f8"}.fa-ambulance:before{content:"\f0f9"}.fa-medkit:before{content:"\f0fa"}.fa-fighter-jet:before{content:"\f0fb"}.fa-beer:before{content:"\f0fc"}.fa-h-square:before{content:"\f0fd"}.fa-plus-square:before{content:"\f0fe"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angle-down:before{content:"\f107"}.fa-desktop:before{content:"\f108"}.fa-laptop:before{content:"\f109"}.fa-tablet:before{content:"\f10a"}.fa-mobile-phone:before,.fa-mobile:before{content:"\f10b"}.fa-circle-o:before{content:"\f10c"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-spinner:before{content:"\f110"}.fa-circle:before{content:"\f111"}.fa-mail-reply:before,.fa-reply:before{content:"\f112"}.fa-github-alt:before{content:"\f113"}.fa-folder-o:before{content:"\f114"}.fa-folder-open-o:before{content:"\f115"}.fa-smile-o:before{content:"\f118"}.fa-frown-o:before{content:"\f119"}.fa-meh-o:before{content:"\f11a"}.fa-gamepad:before{content:"\f11b"}.fa-keyboard-o:before{content:"\f11c"}.fa-flag-o:before{content:"\f11d"}.fa-flag-checkered:before{content:"\f11e"}.fa-terminal:before{content:"\f120"}.fa-code:before{content:"\f121"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"\f123"}.fa-location-arrow:before{content:"\f124"}.fa-crop:before{content:"\f125"}.fa-code-fork:before{content:"\f126"}.fa-unlink:before,.fa-chain-broken:before{content:"\f127"}.fa-question:before{content:"\f128"}.fa-info:before{content:"\f129"}.fa-exclamation:before{content:"\f12a"}.fa-superscript:before{content:"\f12b"}.fa-subscript:before{content:"\f12c"}.fa-eraser:before{content:"\f12d"}.fa-puzzle-piece:before{content:"\f12e"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-shield:before{content:"\f132"}.fa-calendar-o:before{content:"\f133"}.fa-fire-extinguisher:before{content:"\f134"}.fa-rocket:before{content:"\f135"}.fa-maxcdn:before{content:"\f136"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-html5:before{content:"\f13b"}.fa-css3:before{content:"\f13c"}.fa-anchor:before{content:"\f13d"}.fa-unlock-alt:before{content:"\f13e"}.fa-bullseye:before{content:"\f140"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-rss-square:before{content:"\f143"}.fa-play-circle:before{content:"\f144"}.fa-ticket:before{content:"\f145"}.fa-minus-square:before{content:"\f146"}.fa-minus-square-o:before{content:"\f147"}.fa-level-up:before{content:"\f148"}.fa-level-down:before{content:"\f149"}.fa-check-square:before{content:"\f14a"}.fa-pencil-square:before{content:"\f14b"}.fa-external-link-square:before{content:"\f14c"}.fa-share-square:before{content:"\f14d"}.fa-compass:before{content:"\f14e"}.fa-toggle-down:before,.fa-caret-square-o-down:before{content:"\f150"}.fa-toggle-up:before,.fa-caret-square-o-up:before{content:"\f151"}.fa-toggle-right:before,.fa-caret-square-o-right:before{content:"\f152"}.fa-euro:before,.fa-eur:before{content:"\f153"}.fa-gbp:before{content:"\f154"}.fa-dollar:before,.fa-usd:before{content:"\f155"}.fa-rupee:before,.fa-inr:before{content:"\f156"}.fa-cny:before,.fa-rmb:before,.fa-yen:before,.fa-jpy:before{content:"\f157"}.fa-ruble:before,.fa-rouble:before,.fa-rub:before{content:"\f158"}.fa-won:before,.fa-krw:before{content:"\f159"}.fa-bitcoin:before,.fa-btc:before{content:"\f15a"}.fa-file:before{content:"\f15b"}.fa-file-text:before{content:"\f15c"}.fa-sort-alpha-asc:before{content:"\f15d"}.fa-sort-alpha-desc:before{content:"\f15e"}.fa-sort-amount-asc:before{content:"\f160"}.fa-sort-amount-desc:before{content:"\f161"}.fa-sort-numeric-asc:before{content:"\f162"}.fa-sort-numeric-desc:before{content:"\f163"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbs-down:before{content:"\f165"}.fa-youtube-square:before{content:"\f166"}.fa-youtube:before{content:"\f167"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-youtube-play:before{content:"\f16a"}.fa-dropbox:before{content:"\f16b"}.fa-stack-overflow:before{content:"\f16c"}.fa-instagram:before{content:"\f16d"}.fa-flickr:before{content:"\f16e"}.fa-adn:before{content:"\f170"}.fa-bitbucket:before{content:"\f171"}.fa-bitbucket-square:before{content:"\f172"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-long-arrow-down:before{content:"\f175"}.fa-long-arrow-up:before{content:"\f176"}.fa-long-arrow-left:before{content:"\f177"}.fa-long-arrow-right:before{content:"\f178"}.fa-apple:before{content:"\f179"}.fa-windows:before{content:"\f17a"}.fa-android:before{content:"\f17b"}.fa-linux:before{content:"\f17c"}.fa-dribbble:before{content:"\f17d"}.fa-skype:before{content:"\f17e"}.fa-foursquare:before{content:"\f180"}.fa-trello:before{content:"\f181"}.fa-female:before{content:"\f182"}.fa-male:before{content:"\f183"}.fa-gittip:before,.fa-gratipay:before{content:"\f184"}.fa-sun-o:before{content:"\f185"}.fa-moon-o:before{content:"\f186"}.fa-archive:before{content:"\f187"}.fa-bug:before{content:"\f188"}.fa-vk:before{content:"\f189"}.fa-weibo:before{content:"\f18a"}.fa-renren:before{content:"\f18b"}.fa-pagelines:before{content:"\f18c"}.fa-stack-exchange:before{content:"\f18d"}.fa-arrow-circle-o-right:before{content:"\f18e"}.fa-arrow-circle-o-left:before{content:"\f190"}.fa-toggle-left:before,.fa-caret-square-o-left:before{content:"\f191"}.fa-dot-circle-o:before{content:"\f192"}.fa-wheelchair:before{content:"\f193"}.fa-vimeo-square:before{content:"\f194"}.fa-turkish-lira:before,.fa-try:before{content:"\f195"}.fa-plus-square-o:before{content:"\f196"}.fa-space-shuttle:before{content:"\f197"}.fa-slack:before{content:"\f198"}.fa-envelope-square:before{content:"\f199"}.fa-wordpress:before{content:"\f19a"}.fa-openid:before{content:"\f19b"}.fa-institution:before,.fa-bank:before,.fa-university:before{content:"\f19c"}.fa-mortar-board:before,.fa-graduation-cap:before{content:"\f19d"}.fa-yahoo:before{content:"\f19e"}.fa-google:before{content:"\f1a0"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-square:before{content:"\f1a2"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-stumbleupon:before{content:"\f1a4"}.fa-delicious:before{content:"\f1a5"}.fa-digg:before{content:"\f1a6"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-drupal:before{content:"\f1a9"}.fa-joomla:before{content:"\f1aa"}.fa-language:before{content:"\f1ab"}.fa-fax:before{content:"\f1ac"}.fa-building:before{content:"\f1ad"}.fa-child:before{content:"\f1ae"}.fa-paw:before{content:"\f1b0"}.fa-spoon:before{content:"\f1b1"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-recycle:before{content:"\f1b8"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-tree:before{content:"\f1bb"}.fa-spotify:before{content:"\f1bc"}.fa-deviantart:before{content:"\f1bd"}.fa-soundcloud:before{content:"\f1be"}.fa-database:before{content:"\f1c0"}.fa-file-pdf-o:before{content:"\f1c1"}.fa-file-word-o:before{content:"\f1c2"}.fa-file-excel-o:before{content:"\f1c3"}.fa-file-powerpoint-o:before{content:"\f1c4"}.fa-file-photo-o:before,.fa-file-picture-o:before,.fa-file-image-o:before{content:"\f1c5"}.fa-file-zip-o:before,.fa-file-archive-o:before{content:"\f1c6"}.fa-file-sound-o:before,.fa-file-audio-o:before{content:"\f1c7"}.fa-file-movie-o:before,.fa-file-video-o:before{content:"\f1c8"}.fa-file-code-o:before{content:"\f1c9"}.fa-vine:before{content:"\f1ca"}.fa-codepen:before{content:"\f1cb"}.fa-jsfiddle:before{content:"\f1cc"}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-saver:before,.fa-support:before,.fa-life-ring:before{content:"\f1cd"}.fa-circle-o-notch:before{content:"\f1ce"}.fa-ra:before,.fa-resistance:before,.fa-rebel:before{content:"\f1d0"}.fa-ge:before,.fa-empire:before{content:"\f1d1"}.fa-git-square:before{content:"\f1d2"}.fa-git:before{content:"\f1d3"}.fa-y-combinator-square:before,.fa-yc-square:before,.fa-hacker-news:before{content:"\f1d4"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-qq:before{content:"\f1d6"}.fa-wechat:before,.fa-weixin:before{content:"\f1d7"}.fa-send:before,.fa-paper-plane:before{content:"\f1d8"}.fa-send-o:before,.fa-paper-plane-o:before{content:"\f1d9"}.fa-history:before{content:"\f1da"}.fa-circle-thin:before{content:"\f1db"}.fa-header:before{content:"\f1dc"}.fa-paragraph:before{content:"\f1dd"}.fa-sliders:before{content:"\f1de"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-bomb:before{content:"\f1e2"}.fa-soccer-ball-o:before,.fa-futbol-o:before{content:"\f1e3"}.fa-tty:before{content:"\f1e4"}.fa-binoculars:before{content:"\f1e5"}.fa-plug:before{content:"\f1e6"}.fa-slideshare:before{content:"\f1e7"}.fa-twitch:before{content:"\f1e8"}.fa-yelp:before{content:"\f1e9"}.fa-newspaper-o:before{content:"\f1ea"}.fa-wifi:before{content:"\f1eb"}.fa-calculator:before{content:"\f1ec"}.fa-paypal:before{content:"\f1ed"}.fa-google-wallet:before{content:"\f1ee"}.fa-cc-visa:before{content:"\f1f0"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-bell-slash:before{content:"\f1f6"}.fa-bell-slash-o:before{content:"\f1f7"}.fa-trash:before{content:"\f1f8"}.fa-copyright:before{content:"\f1f9"}.fa-at:before{content:"\f1fa"}.fa-eyedropper:before{content:"\f1fb"}.fa-paint-brush:before{content:"\f1fc"}.fa-birthday-cake:before{content:"\f1fd"}.fa-area-chart:before{content:"\f1fe"}.fa-pie-chart:before{content:"\f200"}.fa-line-chart:before{content:"\f201"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-bicycle:before{content:"\f206"}.fa-bus:before{content:"\f207"}.fa-ioxhost:before{content:"\f208"}.fa-angellist:before{content:"\f209"}.fa-cc:before{content:"\f20a"}.fa-shekel:before,.fa-sheqel:before,.fa-ils:before{content:"\f20b"}.fa-meanpath:before{content:"\f20c"}.fa-buysellads:before{content:"\f20d"}.fa-connectdevelop:before{content:"\f20e"}.fa-dashcube:before{content:"\f210"}.fa-forumbee:before{content:"\f211"}.fa-leanpub:before{content:"\f212"}.fa-sellsy:before{content:"\f213"}.fa-shirtsinbulk:before{content:"\f214"}.fa-simplybuilt:before{content:"\f215"}.fa-skyatlas:before{content:"\f216"}.fa-cart-plus:before{content:"\f217"}.fa-cart-arrow-down:before{content:"\f218"}.fa-diamond:before{content:"\f219"}.fa-ship:before{content:"\f21a"}.fa-user-secret:before{content:"\f21b"}.fa-motorcycle:before{content:"\f21c"}.fa-street-view:before{content:"\f21d"}.fa-heartbeat:before{content:"\f21e"}.fa-venus:before{content:"\f221"}.fa-mars:before{content:"\f222"}.fa-mercury:before{content:"\f223"}.fa-intersex:before,.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-venus-double:before{content:"\f226"}.fa-mars-double:before{content:"\f227"}.fa-venus-mars:before{content:"\f228"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-neuter:before{content:"\f22c"}.fa-genderless:before{content:"\f22d"}.fa-facebook-official:before{content:"\f230"}.fa-pinterest-p:before{content:"\f231"}.fa-whatsapp:before{content:"\f232"}.fa-server:before{content:"\f233"}.fa-user-plus:before{content:"\f234"}.fa-user-times:before{content:"\f235"}.fa-hotel:before,.fa-bed:before{content:"\f236"}.fa-viacoin:before{content:"\f237"}.fa-train:before{content:"\f238"}.fa-subway:before{content:"\f239"}.fa-medium:before{content:"\f23a"}.fa-yc:before,.fa-y-combinator:before{content:"\f23b"}.fa-optin-monster:before{content:"\f23c"}.fa-opencart:before{content:"\f23d"}.fa-expeditedssl:before{content:"\f23e"}.fa-battery-4:before,.fa-battery:before,.fa-battery-full:before{content:"\f240"}.fa-battery-3:before,.fa-battery-three-quarters:before{content:"\f241"}.fa-battery-2:before,.fa-battery-half:before{content:"\f242"}.fa-battery-1:before,.fa-battery-quarter:before{content:"\f243"}.fa-battery-0:before,.fa-battery-empty:before{content:"\f244"}.fa-mouse-pointer:before{content:"\f245"}.fa-i-cursor:before{content:"\f246"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-sticky-note:before{content:"\f249"}.fa-sticky-note-o:before{content:"\f24a"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-diners-club:before{content:"\f24c"}.fa-clone:before{content:"\f24d"}.fa-balance-scale:before{content:"\f24e"}.fa-hourglass-o:before{content:"\f250"}.fa-hourglass-1:before,.fa-hourglass-start:before{content:"\f251"}.fa-hourglass-2:before,.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-3:before,.fa-hourglass-end:before{content:"\f253"}.fa-hourglass:before{content:"\f254"}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:"\f255"}.fa-hand-stop-o:before,.fa-hand-paper-o:before{content:"\f256"}.fa-hand-scissors-o:before{content:"\f257"}.fa-hand-lizard-o:before{content:"\f258"}.fa-hand-spock-o:before{content:"\f259"}.fa-hand-pointer-o:before{content:"\f25a"}.fa-hand-peace-o:before{content:"\f25b"}.fa-trademark:before{content:"\f25c"}.fa-registered:before{content:"\f25d"}.fa-creative-commons:before{content:"\f25e"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-tripadvisor:before{content:"\f262"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-get-pocket:before{content:"\f265"}.fa-wikipedia-w:before{content:"\f266"}.fa-safari:before{content:"\f267"}.fa-chrome:before{content:"\f268"}.fa-firefox:before{content:"\f269"}.fa-opera:before{content:"\f26a"}.fa-internet-explorer:before{content:"\f26b"}.fa-tv:before,.fa-television:before{content:"\f26c"}.fa-contao:before{content:"\f26d"}.fa-500px:before{content:"\f26e"}.fa-amazon:before{content:"\f270"}.fa-calendar-plus-o:before{content:"\f271"}.fa-calendar-minus-o:before{content:"\f272"}.fa-calendar-times-o:before{content:"\f273"}.fa-calendar-check-o:before{content:"\f274"}.fa-industry:before{content:"\f275"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-map-o:before{content:"\f278"}.fa-map:before{content:"\f279"}.fa-commenting:before{content:"\f27a"}.fa-commenting-o:before{content:"\f27b"}.fa-houzz:before{content:"\f27c"}.fa-vimeo:before{content:"\f27d"}.fa-black-tie:before{content:"\f27e"}.fa-fonticons:before{content:"\f280"}.fa-reddit-alien:before{content:"\f281"}.fa-edge:before{content:"\f282"}.fa-credit-card-alt:before{content:"\f283"}.fa-codiepie:before{content:"\f284"}.fa-modx:before{content:"\f285"}.fa-fort-awesome:before{content:"\f286"}.fa-usb:before{content:"\f287"}.fa-product-hunt:before{content:"\f288"}.fa-mixcloud:before{content:"\f289"}.fa-scribd:before{content:"\f28a"}.fa-pause-circle:before{content:"\f28b"}.fa-pause-circle-o:before{content:"\f28c"}.fa-stop-circle:before{content:"\f28d"}.fa-stop-circle-o:before{content:"\f28e"}.fa-shopping-bag:before{content:"\f290"}.fa-shopping-basket:before{content:"\f291"}.fa-hashtag:before{content:"\f292"}.fa-bluetooth:before{content:"\f293"}.fa-bluetooth-b:before{content:"\f294"}.fa-percent:before{content:"\f295"}.fa-gitlab:before{content:"\f296"}.fa-wpbeginner:before{content:"\f297"}.fa-wpforms:before{content:"\f298"}.fa-envira:before{content:"\f299"}.fa-universal-access:before{content:"\f29a"}.fa-wheelchair-alt:before{content:"\f29b"}.fa-question-circle-o:before{content:"\f29c"}.fa-blind:before{content:"\f29d"}.fa-audio-description:before{content:"\f29e"}.fa-volume-control-phone:before{content:"\f2a0"}.fa-braille:before{content:"\f2a1"}.fa-assistive-listening-systems:before{content:"\f2a2"}.fa-asl-interpreting:before,.fa-american-sign-language-interpreting:before{content:"\f2a3"}.fa-deafness:before,.fa-hard-of-hearing:before,.fa-deaf:before{content:"\f2a4"}.fa-glide:before{content:"\f2a5"}.fa-glide-g:before{content:"\f2a6"}.fa-signing:before,.fa-sign-language:before{content:"\f2a7"}.fa-low-vision:before{content:"\f2a8"}.fa-viadeo:before{content:"\f2a9"}.fa-viadeo-square:before{content:"\f2aa"}.fa-snapchat:before{content:"\f2ab"}.fa-snapchat-ghost:before{content:"\f2ac"}.fa-snapchat-square:before{content:"\f2ad"}.fa-pied-piper:before{content:"\f2ae"}.fa-first-order:before{content:"\f2b0"}.fa-yoast:before{content:"\f2b1"}.fa-themeisle:before{content:"\f2b2"}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:"\f2b3"}.fa-fa:before,.fa-font-awesome:before{content:"\f2b4"}.fa-handshake-o:before{content:"\f2b5"}.fa-envelope-open:before{content:"\f2b6"}.fa-envelope-open-o:before{content:"\f2b7"}.fa-linode:before{content:"\f2b8"}.fa-address-book:before{content:"\f2b9"}.fa-address-book-o:before{content:"\f2ba"}.fa-vcard:before,.fa-address-card:before{content:"\f2bb"}.fa-vcard-o:before,.fa-address-card-o:before{content:"\f2bc"}.fa-user-circle:before{content:"\f2bd"}.fa-user-circle-o:before{content:"\f2be"}.fa-user-o:before{content:"\f2c0"}.fa-id-badge:before{content:"\f2c1"}.fa-drivers-license:before,.fa-id-card:before{content:"\f2c2"}.fa-drivers-license-o:before,.fa-id-card-o:before{content:"\f2c3"}.fa-quora:before{content:"\f2c4"}.fa-free-code-camp:before{content:"\f2c5"}.fa-telegram:before{content:"\f2c6"}.fa-thermometer-4:before,.fa-thermometer:before,.fa-thermometer-full:before{content:"\f2c7"}.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:"\f2c8"}.fa-thermometer-2:before,.fa-thermometer-half:before{content:"\f2c9"}.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:"\f2ca"}.fa-thermometer-0:before,.fa-thermometer-empty:before{content:"\f2cb"}.fa-shower:before{content:"\f2cc"}.fa-bathtub:before,.fa-s15:before,.fa-bath:before{content:"\f2cd"}.fa-podcast:before{content:"\f2ce"}.fa-window-maximize:before{content:"\f2d0"}.fa-window-minimize:before{content:"\f2d1"}.fa-window-restore:before{content:"\f2d2"}.fa-times-rectangle:before,.fa-window-close:before{content:"\f2d3"}.fa-times-rectangle-o:before,.fa-window-close-o:before{content:"\f2d4"}.fa-bandcamp:before{content:"\f2d5"}.fa-grav:before{content:"\f2d6"}.fa-etsy:before{content:"\f2d7"}.fa-imdb:before{content:"\f2d8"}.fa-ravelry:before{content:"\f2d9"}.fa-eercast:before{content:"\f2da"}.fa-microchip:before{content:"\f2db"}.fa-snowflake-o:before{content:"\f2dc"}.fa-superpowers:before{content:"\f2dd"}.fa-wpexplorer:before{content:"\f2de"}.fa-meetup:before{content:"\f2e0"}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0, 0, 0, 0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}
diff --git a/public/netdna.bootstrapcdn.com/fonts/fontawesome-webfont.eot b/public/netdna.bootstrapcdn.com/fonts/fontawesome-webfont.eot
new file mode 100644
index 0000000..e9f60ca
Binary files /dev/null and b/public/netdna.bootstrapcdn.com/fonts/fontawesome-webfont.eot differ
diff --git a/public/netdna.bootstrapcdn.com/fonts/fontawesome-webfont.svg b/public/netdna.bootstrapcdn.com/fonts/fontawesome-webfont.svg
new file mode 100644
index 0000000..855c845
--- /dev/null
+++ b/public/netdna.bootstrapcdn.com/fonts/fontawesome-webfont.svg
@@ -0,0 +1,2671 @@
+
+
+
diff --git a/public/netdna.bootstrapcdn.com/fonts/fontawesome-webfont.ttf b/public/netdna.bootstrapcdn.com/fonts/fontawesome-webfont.ttf
new file mode 100644
index 0000000..35acda2
Binary files /dev/null and b/public/netdna.bootstrapcdn.com/fonts/fontawesome-webfont.ttf differ
diff --git a/public/netdna.bootstrapcdn.com/fonts/fontawesome-webfont.woff2 b/public/netdna.bootstrapcdn.com/fonts/fontawesome-webfont.woff2
new file mode 100644
index 0000000..4d13fc6
Binary files /dev/null and b/public/netdna.bootstrapcdn.com/fonts/fontawesome-webfont.woff2 differ
diff --git a/shim.d.ts b/shim.d.ts
new file mode 100644
index 0000000..3e9bfd0
--- /dev/null
+++ b/shim.d.ts
@@ -0,0 +1,13 @@
+/* eslint-disable */
+
+// 声明文件,*.vue 后缀的文件交给 vue 模块来处理
+declare module '*.vue' {
+ import type { DefineComponent } from 'vue';
+ const component: DefineComponent<{}, {}, any>;
+ export default component;
+}
+
+// 声明文件,定义全局变量。其它 app.config.globalProperties.xxx,使用 getCurrentInstance() 来获取
+interface Window {
+ nextLoading: boolean;
+}
diff --git a/source.d.ts b/source.d.ts
new file mode 100644
index 0000000..2f9c768
--- /dev/null
+++ b/source.d.ts
@@ -0,0 +1,6 @@
+declare module '*.json';
+declare module '*.png';
+declare module '*.jpg';
+declare module '*.scss';
+declare module '*.ts';
+declare module '*.js';
diff --git a/src/App.vue b/src/App.vue
new file mode 100644
index 0000000..c06763c
--- /dev/null
+++ b/src/App.vue
@@ -0,0 +1,96 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/src/api/items.ts b/src/api/items.ts
new file mode 100644
index 0000000..0a4300e
--- /dev/null
+++ b/src/api/items.ts
@@ -0,0 +1,53 @@
+// 查询列表
+export function getItems(f: Function, query: Object) {
+ query = query || { pageSize: 10000 };
+ return f(query);
+}
+
+export function setItems(response: any, k: string, v: string):Array {
+ const data: Array = [];
+ k = k || 'id';
+ v = v || 'name';
+ if (response.data && response.data.list && response.data.list.length > 0) {
+ response.data.list.forEach((e: any) => {
+ data.push({
+ key: e[k].toString(),
+ value: e[v].toString(),
+ });
+ });
+ }
+ return data;
+}
+
+// 选项类型接口
+export interface ItemOptions {
+ key:string,
+ value:string
+}
+
+/** 通过 options 数组获取 key 对应的 value */
+export function getOptionValue(key: any, options: Array,keyName:string,valName:string) {
+ keyName = keyName??'key'
+ valName = valName??'value'
+ const option = options.find((value) => {
+ return key + '' === value[keyName];
+ });
+ if (option !== undefined) {
+ return option[valName];
+ }
+}
+
+export function isEmpty(v: any) {
+ if (v === '' || v === undefined || v === null) {
+ return true;
+ }
+
+ if (typeof v === 'object') {
+ if (Array.isArray(v)) {
+ return v.length === 0;
+ } else {
+ return Object.keys(v).length === 0;
+ }
+ }
+ return false;
+}
diff --git a/src/api/login/index.ts b/src/api/login/index.ts
new file mode 100644
index 0000000..b22986f
--- /dev/null
+++ b/src/api/login/index.ts
@@ -0,0 +1,33 @@
+import request from '/@/utils/request';
+
+/**
+ * 登录api接口集合
+ * @method signIn 用户登录
+ */
+export function login(params: object){
+ return request({
+ url: '/api/v1/system/login',
+ method: 'post',
+ data: params,
+ });
+}
+
+/**
+ * 获取验证码
+ */
+export function captcha(){
+ return request({
+ url:"/api/v1/pub/captcha/get",
+ method:"get"
+ })
+}
+
+/**
+ * 退出登录
+ */
+export function logout(){
+ return request({
+ url: '/api/v1/system/logout',
+ method: 'get',
+ });
+}
diff --git a/src/api/menu/index.ts b/src/api/menu/index.ts
new file mode 100644
index 0000000..9c16bb7
--- /dev/null
+++ b/src/api/menu/index.ts
@@ -0,0 +1,26 @@
+import request from '/@/utils/request';
+
+/**
+ * 后端控制菜单模拟json,路径在 https://gitee.com/lyt-top/vue-next-admin-images/tree/master/menu
+ * 后端控制路由,isRequestRoutes 为 true,则开启后端控制路由
+ * @method getMenuAdmin 获取后端动态路由菜单(admin)
+ * @method getMenuTest 获取后端动态路由菜单(test)
+ */
+export function useMenuApi() {
+ return {
+ getMenuAdmin: (params?: object) => {
+ return request({
+ url: '/gitee/lyt-top/vue-next-admin-images/raw/master/menu/adminMenu.json',
+ method: 'get',
+ params,
+ });
+ },
+ getMenuTest: (params?: object) => {
+ return request({
+ url: '/gitee/lyt-top/vue-next-admin-images/raw/master/menu/testMenu.json',
+ method: 'get',
+ params,
+ });
+ },
+ };
+}
diff --git a/src/api/system/cache/index.ts b/src/api/system/cache/index.ts
new file mode 100644
index 0000000..7d81f3e
--- /dev/null
+++ b/src/api/system/cache/index.ts
@@ -0,0 +1,9 @@
+import request from '/@/utils/request';
+
+// 清除缓存
+export function removeCache() {
+ return request({
+ url: '/api/v1/system/cache/remove',
+ method: 'delete'
+ })
+}
diff --git a/src/api/system/config/index.ts b/src/api/system/config/index.ts
new file mode 100644
index 0000000..c3824c6
--- /dev/null
+++ b/src/api/system/config/index.ts
@@ -0,0 +1,42 @@
+import request from '/@/utils/request';
+
+
+export function getConfigList(query:Object) {
+ return request({
+ url: '/api/v1/system/config/list',
+ method: 'get',
+ params:query
+ })
+}
+
+export function getConfig(id:number) {
+ return request({
+ url: '/api/v1/system/config/get',
+ method: 'get',
+ params:{id}
+ })
+}
+
+export function addConfig(data:any) {
+ return request({
+ url: '/api/v1/system/config/add',
+ method: 'post',
+ data:data
+ })
+}
+
+export function editConfig(data:any) {
+ return request({
+ url: '/api/v1/system/config/edit',
+ method: 'put',
+ data:data
+ })
+}
+
+export function deleteConfig(ids:number[]) {
+ return request({
+ url: '/api/v1/system/config/delete',
+ method: 'delete',
+ data:{ids}
+ })
+}
diff --git a/src/api/system/dept/index.ts b/src/api/system/dept/index.ts
new file mode 100644
index 0000000..95a9b42
--- /dev/null
+++ b/src/api/system/dept/index.ts
@@ -0,0 +1,36 @@
+import request from '/@/utils/request';
+
+export function getDeptList(query?:Object) {
+ return request({
+ url: '/api/v1/system/dept/list',
+ method: 'get',
+ params:query
+ })
+}
+
+
+export function addDept(data:object) {
+ return request({
+ url: '/api/v1/system/dept/add',
+ method: 'post',
+ data:data
+ })
+}
+
+
+export function editDept(data:object) {
+ return request({
+ url: '/api/v1/system/dept/edit',
+ method: 'put',
+ data:data
+ })
+}
+
+
+export function deleteDept(id:number) {
+ return request({
+ url: '/api/v1/system/dept/delete',
+ method: 'delete',
+ data:{id}
+ })
+}
diff --git a/src/api/system/dict/data.ts b/src/api/system/dict/data.ts
new file mode 100644
index 0000000..c97ae71
--- /dev/null
+++ b/src/api/system/dict/data.ts
@@ -0,0 +1,70 @@
+import request from '/@/utils/request';
+import {ref ,toRefs,ToRefs} from 'vue'
+// 根据字典类型查询字典数据信息
+export function getDicts(dictType :string,defaultValue?:string):Promise {
+ let dv = defaultValue??''
+ let params ={
+ dictType:dictType,
+ defaultValue:dv
+ }
+ return request({
+ url: '/api/v1/system/dict/data/getDictData',
+ method: 'get',
+ params:params
+ })
+}
+
+/**
+ * 获取字典数据
+ */
+export function useDict(...args:string[]):ToRefs{
+ const res:any = ref({});
+ args.forEach((d:string) => {
+ res.value[d] = [];
+ getDicts(d).then(resp => {
+ res.value[d] = resp.data.values.map((p:any) => ({ label: p.value, value: p.key, isDefault: p.isDefault }))
+ })
+ })
+ return toRefs(res.value);
+}
+
+
+export function getDataList(query:Object) {
+ return request({
+ url: '/api/v1/system/dict/data/list',
+ method: 'get',
+ params:query
+ })
+}
+
+export function getData(dictCode:number) {
+ return request({
+ url: '/api/v1/system/dict/data/get',
+ method: 'get',
+ params:{dictCode}
+ })
+}
+
+export function addData(data:any) {
+ return request({
+ url: '/api/v1/system/dict/data/add',
+ method: 'post',
+ data:data
+ })
+}
+
+export function editData(data:any) {
+ return request({
+ url: '/api/v1/system/dict/data/edit',
+ method: 'put',
+ data:data
+ })
+}
+
+export function deleteData(ids:number[]) {
+ return request({
+ url: '/api/v1/system/dict/data/delete',
+ method: 'delete',
+ data:{ids}
+ })
+}
diff --git a/src/api/system/dict/type.ts b/src/api/system/dict/type.ts
new file mode 100644
index 0000000..0163dbc
--- /dev/null
+++ b/src/api/system/dict/type.ts
@@ -0,0 +1,52 @@
+import request from '/@/utils/request';
+
+export function getTypeList(query:Object) {
+ return request({
+ url: '/api/v1/system/dict/type/list',
+ method: 'get',
+ params:query
+ })
+}
+
+export function getType(dictId:number) {
+ return request({
+ url: '/api/v1/system/dict/type/get',
+ method: 'get',
+ params:{dictId}
+ })
+}
+
+export function addType(data:any) {
+ return request({
+ url: '/api/v1/system/dict/type/add',
+ method: 'post',
+ data:data
+ })
+}
+
+export function editType(data:any) {
+ return request({
+ url: '/api/v1/system/dict/type/edit',
+ method: 'put',
+ data:data
+ })
+}
+
+
+export function deleteType(dictIds:number[]) {
+ return request({
+ url: '/api/v1/system/dict/type/delete',
+ method: 'delete',
+ data:{dictIds}
+ })
+}
+
+
+// 获取字典选择框列表
+export function optionselect() {
+ return request({
+ url: '/api/v1/system/dict/type/optionSelect',
+ method: 'get'
+ })
+}
+
diff --git a/src/api/system/menu/index.ts b/src/api/system/menu/index.ts
new file mode 100644
index 0000000..758ea1c
--- /dev/null
+++ b/src/api/system/menu/index.ts
@@ -0,0 +1,57 @@
+import request from '/@/utils/request';
+
+export function getMenuList(query:Object) {
+ return request({
+ url: '/api/v1/system/menu/list',
+ method: 'get',
+ params:query
+ })
+}
+
+export function getUserMenus() {
+ return request({
+ url: '/api/v1/system/user/getUserMenus',
+ method: 'get'
+ })
+}
+
+export function getMenuParams() {
+ return request({
+ url: '/api/v1/system/menu/getParams',
+ method: 'get'
+ })
+}
+
+export function addMenu(data:Object) {
+ return request({
+ url: '/api/v1/system/menu/add',
+ method: 'post',
+ data:data
+ })
+}
+
+export function getMenuInfo(id:number) {
+ return request({
+ url: '/api/v1/system/menu/get',
+ method: 'get',
+ params:{id}
+ })
+}
+
+export function updateMenu(data:Object) {
+ return request({
+ url: '/api/v1/system/menu/update',
+ method: 'put',
+ data:data
+ })
+}
+
+
+// 删除菜单
+export function delMenu(menuId:number) {
+ return request({
+ url: '/api/v1/system/menu/delete',
+ method: 'delete',
+ data:{ids:[menuId]}
+ })
+}
diff --git a/src/api/system/monitor/loginLog/index.ts b/src/api/system/monitor/loginLog/index.ts
new file mode 100644
index 0000000..d2fcb61
--- /dev/null
+++ b/src/api/system/monitor/loginLog/index.ts
@@ -0,0 +1,28 @@
+import request from '/@/utils/request';
+
+
+export function logList(query:object) {
+ return request({
+ url: '/api/v1/system/loginLog/list',
+ method: 'get',
+ params:query
+ })
+}
+
+
+export function deleteLog(ids:number[]) {
+ return request({
+ url: '/api/v1/system/loginLog/delete',
+ method: 'delete',
+ params:{ids}
+ })
+}
+
+
+
+export function clearLog() {
+ return request({
+ url: '/api/v1/system/loginLog/clear',
+ method: 'delete',
+ })
+}
diff --git a/src/api/system/monitor/operLog/index.ts b/src/api/system/monitor/operLog/index.ts
new file mode 100644
index 0000000..569ec7a
--- /dev/null
+++ b/src/api/system/monitor/operLog/index.ts
@@ -0,0 +1,37 @@
+import request from '/@/utils/request'
+// 查询操作日志列表
+export function listSysOperLog(query:object) {
+ return request({
+ url: '/api/v1/system/operLog/list',
+ method: 'get',
+ params: query
+ })
+}
+// 查询操作日志详细
+export function getSysOperLog(operId:number) {
+ return request({
+ url: '/api/v1/system/operLog/get',
+ method: 'get',
+ params: {
+ operId: operId.toString()
+ }
+ })
+}
+// 删除操作日志
+export function delSysOperLog(operIds:number[]) {
+ return request({
+ url: '/api/v1/system/operLog/delete',
+ method: 'delete',
+ data:{
+ operIds:operIds
+ }
+ })
+}
+
+
+export function clearOperLog() {
+ return request({
+ url: '/api/v1/system/operLog/clear',
+ method: 'delete',
+ })
+}
diff --git a/src/api/system/monitor/server/index.ts b/src/api/system/monitor/server/index.ts
new file mode 100644
index 0000000..6603ce1
--- /dev/null
+++ b/src/api/system/monitor/server/index.ts
@@ -0,0 +1,9 @@
+import request from '/@/utils/request';
+
+
+export function getSysInfo() {
+ return request({
+ url: '/api/v1/system/monitor/server',
+ method: 'get'
+ })
+}
diff --git a/src/api/system/monitor/userOnline/index.ts b/src/api/system/monitor/userOnline/index.ts
new file mode 100644
index 0000000..ed49e1b
--- /dev/null
+++ b/src/api/system/monitor/userOnline/index.ts
@@ -0,0 +1,18 @@
+import request from '/@/utils/request';
+
+// 查询列表
+export function listSysUserOnline(query:object) {
+ return request({
+ url: '/api/v1/system/online/list',
+ method: 'get',
+ params: query
+ })
+}
+
+export function forceLogout(ids:number[]) {
+ return request({
+ url: '/api/v1/system/online/forceLogout',
+ method: 'delete',
+ data: {ids}
+ })
+}
diff --git a/src/api/system/personal/index.ts b/src/api/system/personal/index.ts
new file mode 100644
index 0000000..24eb1f6
--- /dev/null
+++ b/src/api/system/personal/index.ts
@@ -0,0 +1,28 @@
+import request from '/@/utils/request';
+
+export function getPersonalInfo() {
+ return request({
+ url: '/api/v1/system/personal/getPersonalInfo',
+ method: 'get',
+ })
+}
+
+
+export function editPersonal(data:object) {
+ return request({
+ url: '/api/v1/system/personal/edit',
+ method: 'put',
+ data:data
+ })
+}
+
+//重置個人密碼
+export function resetPwdPersonal(data:object) {
+ return request({
+ url: '/api/v1/system/personal/resetPwd',
+ method: 'put',
+ data:data
+ })
+}
+
+
diff --git a/src/api/system/post/index.ts b/src/api/system/post/index.ts
new file mode 100644
index 0000000..a84f0bc
--- /dev/null
+++ b/src/api/system/post/index.ts
@@ -0,0 +1,35 @@
+import request from '/@/utils/request';
+
+export function getPostList(query:Object) {
+ return request({
+ url: '/api/v1/system/post/list',
+ method: 'get',
+ params:query
+ })
+}
+
+export function addPost(data:object) {
+ return request({
+ url: '/api/v1/system/post/add',
+ method: 'post',
+ data:data
+ })
+}
+
+
+export function editPost(data:object) {
+ return request({
+ url: '/api/v1/system/post/edit',
+ method: 'put',
+ data:data
+ })
+}
+
+
+export function deletePost(ids:number[]) {
+ return request({
+ url: '/api/v1/system/post/delete',
+ method: 'delete',
+ data:{ids}
+ })
+}
diff --git a/src/api/system/role/index.ts b/src/api/system/role/index.ts
new file mode 100644
index 0000000..68dc955
--- /dev/null
+++ b/src/api/system/role/index.ts
@@ -0,0 +1,70 @@
+import request from '/@/utils/request';
+
+export function getRoleList(query:Object) {
+ return request({
+ url: '/api/v1/system/role/list',
+ method: 'get',
+ params:query
+ })
+}
+
+export function getRoleParams() {
+ return request({
+ url: '/api/v1/system/role/getParams',
+ method: 'get'
+ })
+}
+
+export function addRole(data:object) {
+ return request({
+ url: '/api/v1/system/role/add',
+ method: 'post',
+ data:data
+ })
+}
+
+export function getRole(id:number) {
+ return request({
+ url: '/api/v1/system/role/get',
+ method: 'get',
+ params:{id}
+ })
+}
+
+
+export function editRole(data:object) {
+ return request({
+ url: '/api/v1/system/role/edit',
+ method: 'put',
+ data:data
+ })
+}
+
+
+export function deleteRole(id:number) {
+ return request({
+ url: '/api/v1/system/role/delete',
+ method: 'delete',
+ data:{ids:[id]}
+ })
+}
+
+export function dataScope(data:any) {
+ return request({
+ url: '/api/v1/system/role/dataScope',
+ method: 'put',
+ data:data
+ })
+}
+
+
+// 根据角色ID查询部门树结构
+export function roleDeptTreeSelect(roleId:number) {
+ return request({
+ url: '/api/v1/system/role/deptTreeSelect',
+ method: 'get',
+ params:{roleId}
+ })
+}
+
+
diff --git a/src/api/system/user/index.ts b/src/api/system/user/index.ts
new file mode 100644
index 0000000..e036799
--- /dev/null
+++ b/src/api/system/user/index.ts
@@ -0,0 +1,75 @@
+import request from '/@/utils/request';
+
+export function getUserList(query:Object) {
+ return request({
+ url: '/api/v1/system/user/list',
+ method: 'get',
+ params:query
+ })
+}
+
+export function getDeptTree() {
+ return request({
+ url: '/api/v1/system/dept/treeSelect',
+ method: 'get'
+ })
+}
+
+export function getParams() {
+ return request({
+ url: '/api/v1/system/user/params',
+ method: 'get'
+ })
+}
+
+export function getEditUser(id:number) {
+ return request({
+ url: '/api/v1/system/user/getEdit',
+ method: 'get',
+ params:{id}
+ })
+}
+
+export function addUser(data:object) {
+ return request({
+ url: '/api/v1/system/user/add',
+ method: 'post',
+ data:data
+ })
+}
+
+
+export function editUser(data:object) {
+ return request({
+ url: '/api/v1/system/user/edit',
+ method: 'put',
+ data:data
+ })
+}
+
+export function resetUserPwd(userId:number, password:string) {
+ return request({
+ url: '/api/v1/system/user/resetPwd',
+ method: 'put',
+ data:{userId,password}
+ })
+}
+
+export function changeUserStatus(userId:number, status:number) {
+ return request({
+ url: '/api/v1/system/user/setStatus',
+ method: 'put',
+ data:{userId,status}
+ })
+}
+
+
+export function deleteUser(ids:number[]) {
+ return request({
+ url: '/api/v1/system/user/delete',
+ method: 'delete',
+ data:{ids}
+ })
+}
+
+
diff --git a/src/assets/401.png b/src/assets/401.png
new file mode 100644
index 0000000..ce306da
Binary files /dev/null and b/src/assets/401.png differ
diff --git a/src/assets/404.png b/src/assets/404.png
new file mode 100644
index 0000000..903c8e0
Binary files /dev/null and b/src/assets/404.png differ
diff --git a/src/assets/bg.jpg b/src/assets/bg.jpg
new file mode 100644
index 0000000..4272d37
Binary files /dev/null and b/src/assets/bg.jpg differ
diff --git a/src/assets/login-icon-two.svg b/src/assets/login-icon-two.svg
new file mode 100644
index 0000000..ef48bc2
--- /dev/null
+++ b/src/assets/login-icon-two.svg
@@ -0,0 +1,9 @@
+
diff --git a/src/assets/logo-mini.svg b/src/assets/logo-mini.svg
new file mode 100644
index 0000000..4d687f6
--- /dev/null
+++ b/src/assets/logo-mini.svg
@@ -0,0 +1,9 @@
+
diff --git a/src/components/auth/auth.vue b/src/components/auth/auth.vue
new file mode 100644
index 0000000..ae010d4
--- /dev/null
+++ b/src/components/auth/auth.vue
@@ -0,0 +1,30 @@
+
+
+
+
+
diff --git a/src/components/auth/authAll.vue b/src/components/auth/authAll.vue
new file mode 100644
index 0000000..76c5e01
--- /dev/null
+++ b/src/components/auth/authAll.vue
@@ -0,0 +1,31 @@
+
+
+
+
+
diff --git a/src/components/auth/auths.vue b/src/components/auth/auths.vue
new file mode 100644
index 0000000..ef31019
--- /dev/null
+++ b/src/components/auth/auths.vue
@@ -0,0 +1,36 @@
+
+
+
+
+
diff --git a/src/components/cropper/index.vue b/src/components/cropper/index.vue
new file mode 100644
index 0000000..b23a266
--- /dev/null
+++ b/src/components/cropper/index.vue
@@ -0,0 +1,149 @@
+
+
+
+
+
+
![]()
+
+
+
预览
+
+
+
![]()
+
+
100 x 100
+
+
+
+
![]()
+
+
50 x 50
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/components/editor/index.vue b/src/components/editor/index.vue
new file mode 100644
index 0000000..78e5726
--- /dev/null
+++ b/src/components/editor/index.vue
@@ -0,0 +1,115 @@
+
+
+
+
+
diff --git a/src/components/editor/toolbar.ts b/src/components/editor/toolbar.ts
new file mode 100644
index 0000000..14a9bf3
--- /dev/null
+++ b/src/components/editor/toolbar.ts
@@ -0,0 +1,60 @@
+/**
+ * 工具栏配置
+ */
+export const toolbarKeys = [
+ 'headerSelect',
+ 'blockquote',
+ '|',
+ 'bold',
+ 'underline',
+ 'italic',
+ {
+ key: 'group-more-style',
+ title: '更多',
+ iconSvg:
+ '',
+ menuKeys: ['through', 'code', 'sup', 'sub', 'clearStyle'],
+ },
+ 'color',
+ 'bgColor',
+ '|',
+ 'fontSize',
+ 'fontFamily',
+ 'lineHeight',
+ '|',
+ 'bulletedList',
+ 'numberedList',
+ 'todo',
+ {
+ key: 'group-justify',
+ title: '对齐',
+ iconSvg:
+ '',
+ menuKeys: ['justifyLeft', 'justifyRight', 'justifyCenter', 'justifyJustify'],
+ },
+ {
+ key: 'group-indent',
+ title: '缩进',
+ iconSvg:
+ '',
+ menuKeys: ['indent', 'delIndent'],
+ },
+ '|',
+ 'emotion',
+ 'insertLink',
+ {
+ key: 'group-image',
+ title: '图片',
+ iconSvg:
+ '',
+ menuKeys: ['uploadImage'],
+ },
+ 'insertTable',
+ 'codeBlock',
+ 'divider',
+ '|',
+ 'undo',
+ 'redo',
+ '|',
+ 'fullScreen',
+];
diff --git a/src/components/iconSelector/index.vue b/src/components/iconSelector/index.vue
new file mode 100644
index 0000000..07de786
--- /dev/null
+++ b/src/components/iconSelector/index.vue
@@ -0,0 +1,252 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
{{ title }}
+
+ ali
+ ele
+ awe
+
+
+
+
+
+
+
+
+
+
diff --git a/src/components/myCodeMirror/index.vue b/src/components/myCodeMirror/index.vue
new file mode 100644
index 0000000..7b380cf
--- /dev/null
+++ b/src/components/myCodeMirror/index.vue
@@ -0,0 +1,56 @@
+
+
+
+
+
diff --git a/src/components/noticeBar/index.vue b/src/components/noticeBar/index.vue
new file mode 100644
index 0000000..b982ba7
--- /dev/null
+++ b/src/components/noticeBar/index.vue
@@ -0,0 +1,195 @@
+
+
+
+
+
+
+
diff --git a/src/components/pagination/index.vue b/src/components/pagination/index.vue
new file mode 100644
index 0000000..ee3e06a
--- /dev/null
+++ b/src/components/pagination/index.vue
@@ -0,0 +1,100 @@
+
+
+
+
+
+
+
diff --git a/src/components/svgIcon/index.vue b/src/components/svgIcon/index.vue
new file mode 100644
index 0000000..1fab298
--- /dev/null
+++ b/src/components/svgIcon/index.vue
@@ -0,0 +1,73 @@
+
+
+
+
+
+
![]()
+
+
+
+
+
diff --git a/src/i18n/index.ts b/src/i18n/index.ts
new file mode 100644
index 0000000..35ec3e9
--- /dev/null
+++ b/src/i18n/index.ts
@@ -0,0 +1,68 @@
+import { createI18n } from 'vue-i18n';
+import pinia from '/@/stores/index';
+import { storeToRefs } from 'pinia';
+import { useThemeConfig } from '/@/stores/themeConfig';
+import zhcnLocale from 'element-plus/es/locale/lang/zh-cn';
+import enLocale from 'element-plus/es/locale/lang/en';
+import zhtwLocale from 'element-plus/es/locale/lang/zh-tw';
+
+import nextZhcn from '/@/i18n/lang/zh-cn';
+import nextEn from '/@/i18n/lang/en';
+import nextZhtw from '/@/i18n/lang/zh-tw';
+
+import pagesLoginZhcn from '/@/i18n/pages/login/zh-cn';
+import pagesLoginEn from '/@/i18n/pages/login/en';
+import pagesLoginZhtw from '/@/i18n/pages/login/zh-tw';
+import pagesFormI18nZhcn from '/@/i18n/pages/formI18n/zh-cn';
+import pagesFormI18nEn from '/@/i18n/pages/formI18n/en';
+import pagesFormI18nZhtw from '/@/i18n/pages/formI18n/zh-tw';
+
+// 定义语言国际化内容
+/**
+ * 说明:
+ * /src/i18n/lang 下的 ts 为框架的国际化内容
+ * /src/i18n/pages 下的 ts 为各界面的国际化内容
+ */
+const messages = {
+ [zhcnLocale.name]: {
+ ...zhcnLocale,
+ message: {
+ ...nextZhcn,
+ ...pagesLoginZhcn,
+ ...pagesFormI18nZhcn,
+ },
+ },
+ [enLocale.name]: {
+ ...enLocale,
+ message: {
+ ...nextEn,
+ ...pagesLoginEn,
+ ...pagesFormI18nEn,
+ },
+ },
+ [zhtwLocale.name]: {
+ ...zhtwLocale,
+ message: {
+ ...nextZhtw,
+ ...pagesLoginZhtw,
+ ...pagesFormI18nZhtw,
+ },
+ },
+};
+
+// 读取 pinia 默认语言
+const stores = useThemeConfig(pinia);
+const { themeConfig } = storeToRefs(stores);
+
+// 导出语言国际化
+// https://vue-i18n.intlify.dev/guide/essentials/fallback.html#explicit-fallback-with-one-locale
+export const i18n = createI18n({
+ silentTranslationWarn: true,
+ missingWarn: false,
+ silentFallbackWarn: true,
+ fallbackWarn: false,
+ locale: themeConfig.value.globalI18n,
+ fallbackLocale: zhcnLocale.name,
+ legacy: false,
+ messages,
+});
diff --git a/src/i18n/lang/en.ts b/src/i18n/lang/en.ts
new file mode 100644
index 0000000..46ae830
--- /dev/null
+++ b/src/i18n/lang/en.ts
@@ -0,0 +1,180 @@
+// 定义内容
+export default {
+ router: {
+ home: 'home',
+ system: 'system',
+ systemMenu: 'systemMenu',
+ systemRole: 'systemRole',
+ systemUser: 'systemUser',
+ systemDept: 'systemDept',
+ systemDic: 'systemDic',
+ limits: 'limits',
+ limitsFrontEnd: 'FrontEnd',
+ limitsFrontEndPage: 'FrontEndPage',
+ limitsFrontEndBtn: 'FrontEndBtn',
+ limitsBackEnd: 'BackEnd',
+ limitsBackEndEndPage: 'BackEndEndPage',
+ menu: 'menu',
+ menu1: 'menu1',
+ menu11: 'menu11',
+ menu12: 'menu12',
+ menu121: 'menu121',
+ menu122: 'menu122',
+ menu13: 'menu13',
+ menu2: 'menu2',
+ funIndex: 'function',
+ funTagsView: 'funTagsView',
+ funCountup: 'countup',
+ funWangEditor: 'wangEditor',
+ funCropper: 'cropper',
+ funQrcode: 'qrcode',
+ funEchartsMap: 'EchartsMap',
+ funPrintJs: 'PrintJs',
+ funClipboard: 'Copy cut',
+ funGridLayout: 'Drag layout',
+ funSplitpanes: 'Pane splitter',
+ funDragVerify: 'Validator',
+ pagesIndex: 'pages',
+ pagesFiltering: 'Filtering',
+ pagesFilteringDetails: 'FilteringDetails',
+ pagesFilteringDetails1: 'FilteringDetails1',
+ pagesIocnfont: 'iconfont icon',
+ pagesElement: 'element icon',
+ pagesAwesome: 'awesome icon',
+ pagesFormAdapt: 'FormAdapt',
+ pagesTableRules: 'pagesTableRules',
+ pagesFormI18n: 'FormI18n',
+ pagesFormRules: 'Multi form validation',
+ pagesDynamicForm: 'Dynamic complex form',
+ pagesWorkflow: 'Workflow',
+ pagesListAdapt: 'ListAdapt',
+ pagesWaterfall: 'Waterfall',
+ pagesSteps: 'Steps',
+ pagesPreview: 'Large preview',
+ pagesWaves: 'Wave effect',
+ pagesTree: 'tree alter table',
+ pagesDrag: 'Drag command',
+ pagesLazyImg: 'Image lazy loading',
+ makeIndex: 'makeIndex',
+ makeSelector: 'Icon selector',
+ makeNoticeBar: 'notification bar',
+ makeSvgDemo: 'Svgicon demo',
+ paramsIndex: 'Routing parameters',
+ paramsCommon: 'General routing',
+ paramsDynamic: 'Dynamic routing',
+ paramsCommonDetails: 'General routing details',
+ paramsDynamicDetails: 'Dynamic routing details',
+ chartIndex: 'chartIndex',
+ visualizingIndex: 'visualizingIndex',
+ visualizingLinkDemo1: 'visualizingLinkDemo1',
+ visualizingLinkDemo2: 'visualizingLinkDemo2',
+ personal: 'personal',
+ tools: 'tools',
+ layoutLinkView: 'LinkView',
+ layoutIfameView: 'IfameView',
+ },
+ staticRoutes: {
+ signIn: 'signIn',
+ notFound: 'notFound',
+ noPower: 'noPower',
+ },
+ user: {
+ title0: 'Component size',
+ title1: 'Language switching',
+ title2: 'Menu search',
+ title3: 'Layout configuration',
+ title4: 'news',
+ title5: 'Full screen on',
+ title6: 'Full screen off',
+ dropdownLarge: 'large',
+ dropdownDefault: 'default',
+ dropdownSmall: 'small',
+ dropdown1: 'home page',
+ dropdown2: 'Personal Center',
+ dropdown3: '404',
+ dropdown4: '401',
+ dropdown5: 'Log out',
+ dropdown6: 'Code warehouse',
+ searchPlaceholder: 'Menu search: support Chinese, routing path',
+ newTitle: 'notice',
+ newBtn: 'All read',
+ newGo: 'Go to the notification center',
+ newDesc: 'No notice',
+ logOutTitle: 'Tips',
+ logOutMessage: 'This operation will log out. Do you want to continue?',
+ logOutConfirm: 'determine',
+ logOutCancel: 'cancel',
+ logOutExit: 'Exiting',
+ },
+ tagsView: {
+ refresh: 'refresh',
+ close: 'close',
+ closeOther: 'closeOther',
+ closeAll: 'closeAll',
+ fullscreen: 'fullscreen',
+ closeFullscreen: 'closeFullscreen',
+ },
+ notFound: {
+ foundTitle: 'Wrong address input, please re-enter the address~',
+ foundMsg: 'You can check the web address first, and then re-enter or give us feedback.',
+ foundBtn: 'Back to home page',
+ },
+ noAccess: {
+ accessTitle: 'You are not authorized to operate~',
+ accessMsg: 'Contact information: add QQ group discussion 665452019',
+ accessBtn: 'Reauthorization',
+ },
+ layout: {
+ configTitle: 'Layout configuration',
+ oneTitle: 'Global Themes',
+ twoTopTitle: 'top bar set up',
+ twoMenuTitle: 'Menu set up',
+ twoColumnsTitle: 'Columns set up',
+ twoTopBar: 'Top bar background',
+ twoTopBarColor: 'Top bar default font color',
+ twoIsTopBarColorGradual: 'Top bar gradient',
+ twoMenuBar: 'Menu background',
+ twoMenuBarColor: 'Menu default font color',
+ twoIsMenuBarColorGradual: 'Menu gradient',
+ twoColumnsMenuBar: 'Column menu background',
+ twoColumnsMenuBarColor: 'Default font color bar menu',
+ twoIsColumnsMenuBarColorGradual: 'Column gradient',
+ threeTitle: 'Interface settings',
+ threeIsCollapse: 'Menu horizontal collapse',
+ threeIsUniqueOpened: 'Menu accordion',
+ threeIsFixedHeader: 'Fixed header',
+ threeIsClassicSplitMenu: 'Classic layout split menu',
+ threeIsLockScreen: 'Open the lock screen',
+ threeLockScreenTime: 'screen locking(s/s)',
+ fourTitle: 'Interface display',
+ fourIsShowLogo: 'Sidebar logo',
+ fourIsBreadcrumb: 'Open breadcrumb',
+ fourIsBreadcrumbIcon: 'Open breadcrumb icon',
+ fourIsTagsview: 'Open tagsview',
+ fourIsTagsviewIcon: 'Open tagsview Icon',
+ fourIsCacheTagsView: 'Enable tagsview cache',
+ fourIsSortableTagsView: 'Enable tagsview drag',
+ fourIsShareTagsView: 'Enable tagsview sharing',
+ fourIsFooter: 'Open footer',
+ fourIsGrayscale: 'Grey model',
+ fourIsInvert: 'Color weak mode',
+ fourIsDark: 'Dark Mode',
+ fourIsWartermark: 'Turn on watermark',
+ fourWartermarkText: 'Watermark copy',
+ fiveTitle: 'Other settings',
+ fiveTagsStyle: 'Tagsview style',
+ fiveAnimation: 'page animation',
+ fiveColumnsAsideStyle: 'Column style',
+ fiveColumnsAsideLayout: 'Column layout',
+ sixTitle: 'Layout switch',
+ sixDefaults: 'One',
+ sixClassic: 'Two',
+ sixTransverse: 'Three',
+ sixColumns: 'Four',
+ tipText: 'Click the button below to copy the layout configuration to `/src/stores/themeConfig.ts` It has been modified in.',
+ copyText: 'replication configuration',
+ resetText: 'restore default',
+ copyTextSuccess: 'Copy succeeded!',
+ copyTextError: 'Copy failed!',
+ },
+};
diff --git a/src/i18n/lang/zh-cn.ts b/src/i18n/lang/zh-cn.ts
new file mode 100644
index 0000000..79ef328
--- /dev/null
+++ b/src/i18n/lang/zh-cn.ts
@@ -0,0 +1,180 @@
+// 定义内容
+export default {
+ router: {
+ home: '首页',
+ system: '系统设置',
+ systemMenu: '菜单管理',
+ systemRole: '角色管理',
+ systemUser: '用户管理',
+ systemDept: '部门管理',
+ systemDic: '字典管理',
+ limits: '权限管理',
+ limitsFrontEnd: '前端控制',
+ limitsFrontEndPage: '页面权限',
+ limitsFrontEndBtn: '按钮权限',
+ limitsBackEnd: '后端控制',
+ limitsBackEndEndPage: '页面权限',
+ menu: '菜单嵌套',
+ menu1: '菜单1',
+ menu11: '菜单11',
+ menu12: '菜单12',
+ menu121: '菜单121',
+ menu122: '菜单122',
+ menu13: '菜单13',
+ menu2: '菜单2',
+ funIndex: '功能',
+ funTagsView: 'tagsView 操作',
+ funCountup: '数字滚动',
+ funWangEditor: 'Editor 编辑器',
+ funCropper: '图片裁剪',
+ funQrcode: '二维码生成',
+ funEchartsMap: '地理坐标/地图',
+ funPrintJs: '页面打印',
+ funClipboard: '复制剪切',
+ funGridLayout: '拖拽布局',
+ funSplitpanes: '窗格拆分器',
+ funDragVerify: '验证器',
+ pagesIndex: '页面',
+ pagesFiltering: '过滤筛选组件',
+ pagesFilteringDetails: '过滤筛选组件详情',
+ pagesFilteringDetails1: '过滤筛选组件详情111',
+ pagesIocnfont: 'ali 字体图标',
+ pagesElement: 'ele 字体图标',
+ pagesAwesome: 'awe 字体图标',
+ pagesFormAdapt: '表单自适应',
+ pagesTableRules: '表单表格验证',
+ pagesFormI18n: '表单国际化',
+ pagesFormRules: '多表单验证',
+ pagesDynamicForm: '动态复杂表单',
+ pagesWorkflow: '工作流',
+ pagesListAdapt: '列表自适应',
+ pagesWaterfall: '瀑布屏',
+ pagesSteps: '步骤条',
+ pagesPreview: '大图预览',
+ pagesWaves: '波浪效果',
+ pagesTree: '树形改表格',
+ pagesDrag: '拖动指令',
+ pagesLazyImg: '图片懒加载',
+ makeIndex: '组件封装',
+ makeSelector: '图标选择器',
+ makeNoticeBar: '滚动通知栏',
+ makeSvgDemo: 'svgIcon 演示',
+ paramsIndex: '路由参数',
+ paramsCommon: '普通路由',
+ paramsDynamic: '动态路由',
+ paramsCommonDetails: '普通路由详情',
+ paramsDynamicDetails: '动态路由详情',
+ chartIndex: '大数据图表',
+ visualizingIndex: '数据可视化',
+ visualizingLinkDemo1: '数据可视化演示1',
+ visualizingLinkDemo2: '数据可视化演示2',
+ personal: '个人中心',
+ tools: '工具类集合',
+ layoutLinkView: '外链',
+ layoutIfameView: '内嵌 iframe',
+ },
+ staticRoutes: {
+ signIn: '登录',
+ notFound: '找不到此页面',
+ noPower: '没有权限',
+ },
+ user: {
+ title0: '组件大小',
+ title1: '语言切换',
+ title2: '菜单搜索',
+ title3: '布局配置',
+ title4: '消息',
+ title5: '开全屏',
+ title6: '关全屏',
+ dropdownLarge: '大型',
+ dropdownDefault: '默认',
+ dropdownSmall: '小型',
+ dropdown1: '首页',
+ dropdown2: '个人中心',
+ dropdown3: '404',
+ dropdown4: '401',
+ dropdown5: '退出登录',
+ dropdown6: '代码仓库',
+ searchPlaceholder: '菜单搜索:支持中文、路由路径',
+ newTitle: '通知',
+ newBtn: '全部已读',
+ newGo: '前往通知中心',
+ newDesc: '暂无通知',
+ logOutTitle: '提示',
+ logOutMessage: '此操作将退出登录, 是否继续?',
+ logOutConfirm: '确定',
+ logOutCancel: '取消',
+ logOutExit: '退出中',
+ },
+ tagsView: {
+ refresh: '刷新',
+ close: '关闭',
+ closeOther: '关闭其它',
+ closeAll: '全部关闭',
+ fullscreen: '当前页全屏',
+ closeFullscreen: '关闭全屏',
+ },
+ notFound: {
+ foundTitle: '地址输入错误,请重新输入地址~',
+ foundMsg: '您可以先检查网址,然后重新输入或给我们反馈问题。',
+ foundBtn: '返回首页',
+ },
+ noAccess: {
+ accessTitle: '您未被授权,没有操作权限~',
+ accessMsg: '联系方式:加QQ群探讨 665452019',
+ accessBtn: '重新授权',
+ },
+ layout: {
+ configTitle: '布局配置',
+ oneTitle: '全局主题',
+ twoTopTitle: '顶栏设置',
+ twoMenuTitle: '菜单设置',
+ twoColumnsTitle: '分栏设置',
+ twoTopBar: '顶栏背景',
+ twoTopBarColor: '顶栏默认字体颜色',
+ twoIsTopBarColorGradual: '顶栏背景渐变',
+ twoMenuBar: '菜单背景',
+ twoMenuBarColor: '菜单默认字体颜色',
+ twoIsMenuBarColorGradual: '菜单背景渐变',
+ twoColumnsMenuBar: '分栏菜单背景',
+ twoColumnsMenuBarColor: '分栏菜单默认字体颜色',
+ twoIsColumnsMenuBarColorGradual: '分栏菜单背景渐变',
+ threeTitle: '界面设置',
+ threeIsCollapse: '菜单水平折叠',
+ threeIsUniqueOpened: '菜单手风琴',
+ threeIsFixedHeader: '固定 Header',
+ threeIsClassicSplitMenu: '经典布局分割菜单',
+ threeIsLockScreen: '开启锁屏',
+ threeLockScreenTime: '自动锁屏(s/秒)',
+ fourTitle: '界面显示',
+ fourIsShowLogo: '侧边栏 Logo',
+ fourIsBreadcrumb: '开启 Breadcrumb',
+ fourIsBreadcrumbIcon: '开启 Breadcrumb 图标',
+ fourIsTagsview: '开启 Tagsview',
+ fourIsTagsviewIcon: '开启 Tagsview 图标',
+ fourIsCacheTagsView: '开启 TagsView 缓存',
+ fourIsSortableTagsView: '开启 TagsView 拖拽',
+ fourIsShareTagsView: '开启 TagsView 共用',
+ fourIsFooter: '开启 Footer',
+ fourIsGrayscale: '灰色模式',
+ fourIsInvert: '色弱模式',
+ fourIsDark: '深色模式',
+ fourIsWartermark: '开启水印',
+ fourWartermarkText: '水印文案',
+ fiveTitle: '其它设置',
+ fiveTagsStyle: 'Tagsview 风格',
+ fiveAnimation: '主页面切换动画',
+ fiveColumnsAsideStyle: '分栏高亮风格',
+ fiveColumnsAsideLayout: '分栏布局风格',
+ sixTitle: '布局切换',
+ sixDefaults: '默认',
+ sixClassic: '经典',
+ sixTransverse: '横向',
+ sixColumns: '分栏',
+ tipText: '点击下方按钮,复制布局配置去 `src/stores/themeConfig.ts` 中修改。',
+ copyText: '一键复制配置',
+ resetText: '一键恢复默认',
+ copyTextSuccess: '复制成功!',
+ copyTextError: '复制失败!',
+ },
+};
diff --git a/src/i18n/lang/zh-tw.ts b/src/i18n/lang/zh-tw.ts
new file mode 100644
index 0000000..d900abb
--- /dev/null
+++ b/src/i18n/lang/zh-tw.ts
@@ -0,0 +1,180 @@
+// 定义内容
+export default {
+ router: {
+ home: '首頁',
+ system: '系統設置',
+ systemMenu: '選單管理',
+ systemRole: '角色管理',
+ systemUser: '用戶管理',
+ systemDept: '部門管理',
+ systemDic: '字典管理',
+ limits: '許可權管理',
+ limitsFrontEnd: '前端控制',
+ limitsFrontEndPage: '頁面許可權',
+ limitsFrontEndBtn: '按鈕許可權',
+ limitsBackEnd: '後端控制',
+ limitsBackEndEndPage: '頁面許可權',
+ menu: '選單嵌套',
+ menu1: '選單1',
+ menu11: '選單11',
+ menu12: '選單12',
+ menu121: '選單121',
+ menu122: '選單122',
+ menu13: '選單13',
+ menu2: '選單2',
+ funIndex: '功能',
+ funTagsView: 'tagsView 操作',
+ funCountup: '數位滾動',
+ funWangEditor: 'Editor 編輯器',
+ funCropper: '圖片裁剪',
+ funQrcode: '二維碼生成',
+ funEchartsMap: '地理座標/地圖',
+ funPrintJs: '頁面列印',
+ funClipboard: '複製剪切',
+ funGridLayout: '拖拽佈局',
+ funSplitpanes: '窗格折開器',
+ funDragVerify: '驗證器',
+ pagesIndex: '頁面',
+ pagesFiltering: '過濾篩選組件',
+ pagesFilteringDetails: '過濾篩選組件詳情',
+ pagesFilteringDetails1: '過濾篩選組件詳情111',
+ pagesIocnfont: 'ali 字體圖標',
+ pagesElement: 'ele 字體圖標',
+ pagesAwesome: 'awe 字體圖標',
+ pagesFormAdapt: '表單自我調整',
+ pagesTableRules: '表單表格驗證',
+ pagesFormI18n: '表單國際化',
+ pagesFormRules: '多表單驗證',
+ pagesDynamicForm: '動態複雜表單',
+ pagesWorkflow: '工作流',
+ pagesListAdapt: '清單自我調整',
+ pagesWaterfall: '瀑布屏',
+ pagesSteps: '步驟條',
+ pagesPreview: '大圖預覽',
+ pagesWaves: '波浪效果',
+ pagesTree: '樹形改表格',
+ pagesDrag: '拖動指令',
+ pagesLazyImg: '圖片懶加載',
+ makeIndex: '組件封裝',
+ makeSelector: '圖標選擇器',
+ makeNoticeBar: '滾動通知欄',
+ makeSvgDemo: 'svgIcon 演示',
+ paramsIndex: '路由參數',
+ paramsCommon: '普通路由',
+ paramsDynamic: '動態路由',
+ paramsCommonDetails: '普通路由詳情',
+ paramsDynamicDetails: '動態路由詳情',
+ chartIndex: '大資料圖表',
+ visualizingIndex: '數據視覺化',
+ visualizingLinkDemo1: '數據視覺化演示1',
+ visualizingLinkDemo2: '數據視覺化演示2',
+ personal: '個人中心',
+ tools: '工具類集合',
+ layoutLinkView: '外鏈',
+ layoutIfameView: '内嵌 iframe',
+ },
+ staticRoutes: {
+ signIn: '登入',
+ notFound: '找不到此頁面',
+ noPower: '沒有許可權',
+ },
+ user: {
+ title0: '組件大小',
+ title1: '語言切換',
+ title2: '選單蒐索',
+ title3: '佈局配寘',
+ title4: '消息',
+ title5: '開全屏',
+ title6: '關全屏',
+ dropdownLarge: '大型',
+ dropdownDefault: '默認',
+ dropdownSmall: '小型',
+ dropdown1: '首頁',
+ dropdown2: '個人中心',
+ dropdown3: '404',
+ dropdown4: '401',
+ dropdown5: '登出',
+ dropdown6: '程式碼倉庫',
+ searchPlaceholder: '選單蒐索:支援中文、路由路徑',
+ newTitle: '通知',
+ newBtn: '全部已讀',
+ newGo: '前往通知中心',
+ newDesc: '暫無通知',
+ logOutTitle: '提示',
+ logOutMessage: '此操作將登出,是否繼續?',
+ logOutConfirm: '確定',
+ logOutCancel: '取消',
+ logOutExit: '退出中',
+ },
+ tagsView: {
+ refresh: '重繪',
+ close: '關閉',
+ closeOther: '關閉其它',
+ closeAll: '全部關閉',
+ fullscreen: '當前頁全屏',
+ closeFullscreen: '關閉全屏',
+ },
+ notFound: {
+ foundTitle: '地址輸入錯誤,請重新輸入地址~',
+ foundMsg: '您可以先檢查網址,然後重新輸入或給我們迴響問題。',
+ foundBtn: '返回首頁',
+ },
+ noAccess: {
+ accessTitle: '您未被授權,沒有操作許可權~',
+ accessMsg: '聯繫方式:加QQ群探討665452019',
+ accessBtn: '重新授權',
+ },
+ layout: {
+ configTitle: '佈局配寘',
+ oneTitle: '全域主題',
+ twoTopTitle: '頂欄設定',
+ twoMenuTitle: '選單設定',
+ twoColumnsTitle: '分欄設定',
+ twoTopBar: '頂欄背景',
+ twoTopBarColor: '頂欄默認字體顏色',
+ twoIsTopBarColorGradual: '頂欄背景漸變',
+ twoMenuBar: '選單背景',
+ twoMenuBarColor: '選單默認字體顏色',
+ twoIsMenuBarColorGradual: '選單背景漸變',
+ twoColumnsMenuBar: '分欄選單背景',
+ twoColumnsMenuBarColor: '分欄選單默認字體顏色',
+ twoIsColumnsMenuBarColorGradual: '分欄選單背景漸變',
+ threeTitle: '介面設定',
+ threeIsCollapse: '選單水准折疊',
+ threeIsUniqueOpened: '選單手風琴',
+ threeIsFixedHeader: '固定 Header',
+ threeIsClassicSplitMenu: '經典佈局分割選單',
+ threeIsLockScreen: '開啟鎖屏',
+ threeLockScreenTime: '自動鎖屏(s/秒)',
+ fourTitle: '介面顯示',
+ fourIsShowLogo: '側邊欄 Logo',
+ fourIsBreadcrumb: '開啟 Breadcrumb',
+ fourIsBreadcrumbIcon: '開啟 Breadcrumb 圖標',
+ fourIsTagsview: '開啟 Tagsview',
+ fourIsTagsviewIcon: '開啟 Tagsview 圖標',
+ fourIsCacheTagsView: '開啟 TagsView 緩存',
+ fourIsSortableTagsView: '開啟 TagsView 拖拽',
+ fourIsShareTagsView: '開啟 TagsView 共用',
+ fourIsFooter: '開啟 Footer',
+ fourIsGrayscale: '灰色模式',
+ fourIsInvert: '色弱模式',
+ fourIsDark: '深色模式',
+ fourIsWartermark: '開啟浮水印',
+ fourWartermarkText: '浮水印文案',
+ fiveTitle: '其它設定',
+ fiveTagsStyle: 'Tagsview 風格',
+ fiveAnimation: '主頁面切換動畫',
+ fiveColumnsAsideStyle: '分欄高亮風格',
+ fiveColumnsAsideLayout: '分欄佈局風格',
+ sixTitle: '佈局切換',
+ sixDefaults: '默認',
+ sixClassic: '經典',
+ sixTransverse: '橫向',
+ sixColumns: '分欄',
+ tipText: '點擊下方按鈕,複製佈局配寘去`src/stores/themeConfig.ts`中修改。',
+ copyText: '一鍵複製配寘',
+ resetText: '一鍵恢復默認',
+ copyTextSuccess: '複製成功!',
+ copyTextError: '複製失敗!',
+ },
+};
diff --git a/src/i18n/pages/formI18n/en.ts b/src/i18n/pages/formI18n/en.ts
new file mode 100644
index 0000000..b3c54d6
--- /dev/null
+++ b/src/i18n/pages/formI18n/en.ts
@@ -0,0 +1,13 @@
+// 定义内容
+export default {
+ formI18nLabel: {
+ name: 'name',
+ email: 'email',
+ autograph: 'autograph',
+ },
+ formI18nPlaceholder: {
+ name: 'Please enter your name',
+ email: 'Please enter the users Department',
+ autograph: 'Please enter the login account name',
+ },
+};
diff --git a/src/i18n/pages/formI18n/zh-cn.ts b/src/i18n/pages/formI18n/zh-cn.ts
new file mode 100644
index 0000000..0bed3ec
--- /dev/null
+++ b/src/i18n/pages/formI18n/zh-cn.ts
@@ -0,0 +1,13 @@
+// 定义内容
+export default {
+ formI18nLabel: {
+ name: '姓名',
+ email: '用户归属部门',
+ autograph: '登陆账户名',
+ },
+ formI18nPlaceholder: {
+ name: '请输入姓名',
+ email: '请输入用户归属部门',
+ autograph: '请输入登陆账户名',
+ },
+};
diff --git a/src/i18n/pages/formI18n/zh-tw.ts b/src/i18n/pages/formI18n/zh-tw.ts
new file mode 100644
index 0000000..393ac03
--- /dev/null
+++ b/src/i18n/pages/formI18n/zh-tw.ts
@@ -0,0 +1,13 @@
+// 定义内容
+export default {
+ formI18nLabel: {
+ name: '姓名',
+ email: '用戶歸屬部門',
+ autograph: '登入帳戶名',
+ },
+ formI18nPlaceholder: {
+ name: '請輸入姓名',
+ email: '請輸入用戶歸屬部門',
+ autograph: '請輸入登入帳戶名',
+ },
+};
diff --git a/src/i18n/pages/login/en.ts b/src/i18n/pages/login/en.ts
new file mode 100644
index 0000000..2654a18
--- /dev/null
+++ b/src/i18n/pages/login/en.ts
@@ -0,0 +1,29 @@
+// 定义内容
+export default {
+ label: {
+ one1: 'User name login',
+ two2: 'Mobile number',
+ },
+ link: {
+ one3: 'Third party login',
+ two4: 'Links',
+ },
+ account: {
+ accountPlaceholder1: 'The user name admin or not is common',
+ accountPlaceholder2: 'Password: 123456',
+ accountPlaceholder3: 'Please enter the verification code',
+ accountBtnText: 'Sign in',
+ },
+ mobile: {
+ placeholder1: 'Please input mobile phone number',
+ placeholder2: 'Please enter the verification code',
+ codeText: 'Get code',
+ btnText: 'Sign in',
+ msgText:
+ 'Warm tip: it is recommended to use Google, Microsoft edge, version 79.0.1072.62 and above browsers, and 360 browser, please use speed mode',
+ },
+ scan: {
+ text: 'Open the mobile phone to scan and quickly log in / register',
+ },
+ signInText: 'welcome back!',
+};
diff --git a/src/i18n/pages/login/zh-cn.ts b/src/i18n/pages/login/zh-cn.ts
new file mode 100644
index 0000000..f92edbf
--- /dev/null
+++ b/src/i18n/pages/login/zh-cn.ts
@@ -0,0 +1,28 @@
+// 定义内容
+export default {
+ label: {
+ one1: '用户名登录',
+ two2: '手机号登录',
+ },
+ link: {
+ one3: '第三方登录',
+ two4: '友情链接',
+ },
+ account: {
+ accountPlaceholder1: '用户名 admin',
+ accountPlaceholder2: '密码:123456',
+ accountPlaceholder3: '请输入验证码',
+ accountBtnText: '登 录',
+ },
+ mobile: {
+ placeholder1: '请输入手机号',
+ placeholder2: '请输入验证码',
+ codeText: '获取验证码',
+ btnText: '登 录',
+ msgText: '* 温馨提示:建议使用谷歌、Microsoft Edge,版本 79.0.1072.62 及以上浏览器,360浏览器请使用极速模式',
+ },
+ scan: {
+ text: '打开手机扫一扫,快速加群交流',
+ },
+ signInText: '欢迎回来!',
+};
diff --git a/src/i18n/pages/login/zh-tw.ts b/src/i18n/pages/login/zh-tw.ts
new file mode 100644
index 0000000..138e8c8
--- /dev/null
+++ b/src/i18n/pages/login/zh-tw.ts
@@ -0,0 +1,28 @@
+// 定义内容
+export default {
+ label: {
+ one1: '用戶名登入',
+ two2: '手機號登入',
+ },
+ link: {
+ one3: '協力廠商登入',
+ two4: '友情連結',
+ },
+ account: {
+ accountPlaceholder1: '用戶名admin或不輸均為common',
+ accountPlaceholder2: '密碼:123456',
+ accountPlaceholder3: '請輸入驗證碼',
+ accountBtnText: '登入',
+ },
+ mobile: {
+ placeholder1: '請輸入手機號',
+ placeholder2: '請輸入驗證碼',
+ codeText: '獲取驗證碼',
+ btnText: '登入',
+ msgText: '* 溫馨提示:建議使用穀歌、Microsoft Edge,版本79.0.1072.62及以上瀏覽器,360瀏覽器請使用極速模式',
+ },
+ scan: {
+ text: '打開手機掃一掃,快速登錄/注册',
+ },
+ signInText: '歡迎回來!',
+};
diff --git a/src/layout/component/aside.vue b/src/layout/component/aside.vue
new file mode 100644
index 0000000..d4ee363
--- /dev/null
+++ b/src/layout/component/aside.vue
@@ -0,0 +1,163 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/layout/component/columnsAside.vue b/src/layout/component/columnsAside.vue
new file mode 100644
index 0000000..079ef5f
--- /dev/null
+++ b/src/layout/component/columnsAside.vue
@@ -0,0 +1,305 @@
+
+
+
+
+ -
+
+
+
+ {{
+ $t(v.meta.title) && $t(v.meta.title).length >= 4
+ ? $t(v.meta.title).substr(0, themeConfig.columnsAsideLayout === 'columns-vertical' ? 4 : 3)
+ : $t(v.meta.title)
+ }}
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/layout/component/header.vue b/src/layout/component/header.vue
new file mode 100644
index 0000000..21c9e2d
--- /dev/null
+++ b/src/layout/component/header.vue
@@ -0,0 +1,34 @@
+
+
+
+
+
diff --git a/src/layout/component/main.vue b/src/layout/component/main.vue
new file mode 100644
index 0000000..18eba60
--- /dev/null
+++ b/src/layout/component/main.vue
@@ -0,0 +1,101 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/src/layout/footer/index.vue b/src/layout/footer/index.vue
new file mode 100644
index 0000000..7074293
--- /dev/null
+++ b/src/layout/footer/index.vue
@@ -0,0 +1,47 @@
+
+
+
+
+
+
+
diff --git a/src/layout/index.vue b/src/layout/index.vue
new file mode 100644
index 0000000..50643a4
--- /dev/null
+++ b/src/layout/index.vue
@@ -0,0 +1,54 @@
+
+
+
+
+
diff --git a/src/layout/lockScreen/index.vue b/src/layout/lockScreen/index.vue
new file mode 100644
index 0000000..b9173c2
--- /dev/null
+++ b/src/layout/lockScreen/index.vue
@@ -0,0 +1,372 @@
+
+
+
+
+
+
+
+
+ {{ time.hm }}{{ time.s }}
+
+
{{ time.mdq }}
+
+
+
+
+
+
+
+

+
+
Administrator
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/layout/logo/index.vue b/src/layout/logo/index.vue
new file mode 100644
index 0000000..67178af
--- /dev/null
+++ b/src/layout/logo/index.vue
@@ -0,0 +1,84 @@
+
+
+
![]()
+
{{ themeConfig.globalTitle }}
+
+
+
![]()
+
+
+
+
+
+
diff --git a/src/layout/main/classic.vue b/src/layout/main/classic.vue
new file mode 100644
index 0000000..b92290f
--- /dev/null
+++ b/src/layout/main/classic.vue
@@ -0,0 +1,35 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/layout/main/columns.vue b/src/layout/main/columns.vue
new file mode 100644
index 0000000..0aa1d31
--- /dev/null
+++ b/src/layout/main/columns.vue
@@ -0,0 +1,41 @@
+
+
+
+
+
+
+
+
+
diff --git a/src/layout/main/defaults.vue b/src/layout/main/defaults.vue
new file mode 100644
index 0000000..0e028d8
--- /dev/null
+++ b/src/layout/main/defaults.vue
@@ -0,0 +1,48 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/layout/main/transverse.vue b/src/layout/main/transverse.vue
new file mode 100644
index 0000000..538f911
--- /dev/null
+++ b/src/layout/main/transverse.vue
@@ -0,0 +1,17 @@
+
+
+
+
+
+
+
+
+
diff --git a/src/layout/navBars/breadcrumb/breadcrumb.vue b/src/layout/navBars/breadcrumb/breadcrumb.vue
new file mode 100644
index 0000000..609dee9
--- /dev/null
+++ b/src/layout/navBars/breadcrumb/breadcrumb.vue
@@ -0,0 +1,163 @@
+
+
+
+
+
+
+
diff --git a/src/layout/navBars/breadcrumb/closeFull.vue b/src/layout/navBars/breadcrumb/closeFull.vue
new file mode 100644
index 0000000..6c786bb
--- /dev/null
+++ b/src/layout/navBars/breadcrumb/closeFull.vue
@@ -0,0 +1,61 @@
+
+
+
+
+
+
+
diff --git a/src/layout/navBars/breadcrumb/index.vue b/src/layout/navBars/breadcrumb/index.vue
new file mode 100644
index 0000000..2810718
--- /dev/null
+++ b/src/layout/navBars/breadcrumb/index.vue
@@ -0,0 +1,119 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/layout/navBars/breadcrumb/search.vue b/src/layout/navBars/breadcrumb/search.vue
new file mode 100644
index 0000000..d2a5713
--- /dev/null
+++ b/src/layout/navBars/breadcrumb/search.vue
@@ -0,0 +1,138 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ $t(item.meta.title) }}
+
+
+
+
+
+
+
+
+
+
diff --git a/src/layout/navBars/breadcrumb/setings.vue b/src/layout/navBars/breadcrumb/setings.vue
new file mode 100644
index 0000000..b7e5263
--- /dev/null
+++ b/src/layout/navBars/breadcrumb/setings.vue
@@ -0,0 +1,816 @@
+
+
+
+
+
+ {{ $t('message.layout.oneTitle') }}
+
+
+
{{ $t('message.layout.fourIsDark') }}
+
+
+
+
+
+
+ {{ $t('message.layout.twoTopTitle') }}
+
+
{{ $t('message.layout.twoTopBar') }}
+
+
+
+
+
+
{{ $t('message.layout.twoTopBarColor') }}
+
+
+
+
+
+
{{ $t('message.layout.twoIsTopBarColorGradual') }}
+
+
+
+
+
+
+ {{ $t('message.layout.twoMenuTitle') }}
+
+
{{ $t('message.layout.twoMenuBar') }}
+
+
+
+
+
+
{{ $t('message.layout.twoMenuBarColor') }}
+
+
+
+
+
+
{{ $t('message.layout.twoIsMenuBarColorGradual') }}
+
+
+
+
+
+
+ {{
+ $t('message.layout.twoColumnsTitle')
+ }}
+
+
{{ $t('message.layout.twoColumnsMenuBar') }}
+
+
+
+
+
+
+
{{ $t('message.layout.twoColumnsMenuBarColor') }}
+
+
+
+
+
+
+
{{ $t('message.layout.twoIsColumnsMenuBarColorGradual') }}
+
+
+
+
+
+
+ {{ $t('message.layout.threeTitle') }}
+
+
{{ $t('message.layout.threeIsCollapse') }}
+
+
+
+
+
+
{{ $t('message.layout.threeIsUniqueOpened') }}
+
+
+
+
+
+
{{ $t('message.layout.threeIsFixedHeader') }}
+
+
+
+
+
+
{{ $t('message.layout.threeIsClassicSplitMenu') }}
+
+
+
+
+
+
+
{{ $t('message.layout.threeIsLockScreen') }}
+
+
+
+
+
+
{{ $t('message.layout.threeLockScreenTime') }}
+
+
+
+
+
+
+
+ {{ $t('message.layout.fourTitle') }}
+
+
{{ $t('message.layout.fourIsShowLogo') }}
+
+
+
+
+
+
{{ $t('message.layout.fourIsBreadcrumb') }}
+
+
+
+
+
+
{{ $t('message.layout.fourIsBreadcrumbIcon') }}
+
+
+
+
+
+
{{ $t('message.layout.fourIsTagsview') }}
+
+
+
+
+
+
{{ $t('message.layout.fourIsTagsviewIcon') }}
+
+
+
+
+
+
{{ $t('message.layout.fourIsCacheTagsView') }}
+
+
+
+
+
+
{{ $t('message.layout.fourIsSortableTagsView') }}
+
+
+
+
+
+
{{ $t('message.layout.fourIsShareTagsView') }}
+
+
+
+
+
+
{{ $t('message.layout.fourIsFooter') }}
+
+
+
+
+
+
{{ $t('message.layout.fourIsGrayscale') }}
+
+
+
+
+
+
{{ $t('message.layout.fourIsInvert') }}
+
+
+
+
+
+
{{ $t('message.layout.fourIsWartermark') }}
+
+
+
+
+
+
{{ $t('message.layout.fourWartermarkText') }}
+
+
+
+
+
+
+ {{ $t('message.layout.fiveTitle') }}
+
+
{{ $t('message.layout.fiveTagsStyle') }}
+
+
+
+
+
+
+
+
+
+
{{ $t('message.layout.fiveAnimation') }}
+
+
+
+
+
+
+
+
+
+
{{ $t('message.layout.fiveColumnsAsideStyle') }}
+
+
+
+
+
+
+
+
+
{{ $t('message.layout.fiveColumnsAsideLayout') }}
+
+
+
+
+
+
+
+
+
+ {{ $t('message.layout.sixTitle') }}
+
+
+
+
+
+
+
{{ $t('message.layout.sixDefaults') }}
+
+
+
+
+
+
+
+
+
{{ $t('message.layout.sixClassic') }}
+
+
+
+
+
+
+
+
+
{{ $t('message.layout.sixTransverse') }}
+
+
+
+
+
+
+
+
+
{{ $t('message.layout.sixColumns') }}
+
+
+
+
+
+
+
+
+
+
+ {{ $t('message.layout.copyText') }}
+
+
+
+
+
+ {{ $t('message.layout.resetText') }}
+
+
+
+
+
+
+
+
+
+
diff --git a/src/layout/navBars/breadcrumb/user.vue b/src/layout/navBars/breadcrumb/user.vue
new file mode 100644
index 0000000..c8a38a1
--- /dev/null
+++ b/src/layout/navBars/breadcrumb/user.vue
@@ -0,0 +1,318 @@
+
+
+
+
+
+
+
+
+ {{ $t('message.user.dropdownLarge') }}
+ {{ $t('message.user.dropdownDefault') }}
+ {{ $t('message.user.dropdownSmall') }}
+
+
+
+
+
+
+
+
+
+ 简体中文
+ English
+ 繁體中文
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ userInfos.userName === '' ? 'common' : userInfos.userName }}
+
+
+
+
+
+
+ {{ $t('message.user.dropdown1') }}
+ {{ $t('message.user.dropdown6') }}
+ {{ $t('message.user.dropdown2') }}
+ {{ $t('message.user.dropdown3') }}
+ {{ $t('message.user.dropdown4') }}
+ {{ $t('message.user.dropdown5') }}
+
+
+
+
+
+
+
+
+
+
diff --git a/src/layout/navBars/breadcrumb/userNews.vue b/src/layout/navBars/breadcrumb/userNews.vue
new file mode 100644
index 0000000..26182bc
--- /dev/null
+++ b/src/layout/navBars/breadcrumb/userNews.vue
@@ -0,0 +1,115 @@
+
+
+
+
{{ $t('message.user.newTitle') }}
+
{{ $t('message.user.newBtn') }}
+
+
+
+
+
{{ v.label }}
+
+ {{ v.value }}
+
+
{{ v.time }}
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/layout/navBars/index.vue b/src/layout/navBars/index.vue
new file mode 100644
index 0000000..f41a0cf
--- /dev/null
+++ b/src/layout/navBars/index.vue
@@ -0,0 +1,40 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/src/layout/navBars/tagsView/contextmenu.vue b/src/layout/navBars/tagsView/contextmenu.vue
new file mode 100644
index 0000000..c717aae
--- /dev/null
+++ b/src/layout/navBars/tagsView/contextmenu.vue
@@ -0,0 +1,138 @@
+
+
+
+
+
+
+
+
+
diff --git a/src/layout/navBars/tagsView/tagsView.vue b/src/layout/navBars/tagsView/tagsView.vue
new file mode 100644
index 0000000..0b82438
--- /dev/null
+++ b/src/layout/navBars/tagsView/tagsView.vue
@@ -0,0 +1,734 @@
+
+
+
+
+
+
+
diff --git a/src/layout/navMenu/horizontal.vue b/src/layout/navMenu/horizontal.vue
new file mode 100644
index 0000000..022668b
--- /dev/null
+++ b/src/layout/navMenu/horizontal.vue
@@ -0,0 +1,157 @@
+
+
+
+
+
+
+
diff --git a/src/layout/navMenu/subItem.vue b/src/layout/navMenu/subItem.vue
new file mode 100644
index 0000000..3fcefd3
--- /dev/null
+++ b/src/layout/navMenu/subItem.vue
@@ -0,0 +1,48 @@
+
+
+
+
+
+ {{ $t(val.meta.title) }}
+
+
+
+
+
+
+
+ {{ $t(val.meta.title) }}
+
+
+
+
+ {{ $t(val.meta.title) }}
+
+
+
+
+
+
+
+
diff --git a/src/layout/navMenu/vertical.vue b/src/layout/navMenu/vertical.vue
new file mode 100644
index 0000000..1bfa825
--- /dev/null
+++ b/src/layout/navMenu/vertical.vue
@@ -0,0 +1,101 @@
+
+
+
+
+
+
+ {{ $t(val.meta.title) }}
+
+
+
+
+
+
+
+ {{ $t(val.meta.title) }}
+
+
+ {{ $t(val.meta.title) }}
+
+
+
+
+
+
+
+
diff --git a/src/layout/routerView/iframes.vue b/src/layout/routerView/iframes.vue
new file mode 100644
index 0000000..43e71c5
--- /dev/null
+++ b/src/layout/routerView/iframes.vue
@@ -0,0 +1,66 @@
+
+
+
+
+
+
+
diff --git a/src/layout/routerView/link.vue b/src/layout/routerView/link.vue
new file mode 100644
index 0000000..a48f002
--- /dev/null
+++ b/src/layout/routerView/link.vue
@@ -0,0 +1,61 @@
+
+
+
+
+
diff --git a/src/layout/routerView/parent.vue b/src/layout/routerView/parent.vue
new file mode 100644
index 0000000..db22141
--- /dev/null
+++ b/src/layout/routerView/parent.vue
@@ -0,0 +1,88 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/main.ts b/src/main.ts
new file mode 100644
index 0000000..37fd06d
--- /dev/null
+++ b/src/main.ts
@@ -0,0 +1,62 @@
+import { createApp } from 'vue';
+import pinia from '/@/stores/index';
+import App from './App.vue';
+import router from './router';
+import { directive } from '/@/utils/directive';
+import { i18n } from '/@/i18n/index';
+import other from '/@/utils/other';
+
+import ElementPlus from 'element-plus';
+
+import 'element-plus/dist/index.css';
+import '/@/theme/index.scss';
+import mitt from 'mitt';
+import VueGridLayout from 'vue-grid-layout';
+import {getUpFileUrl, handleTree, parseTime, selectDictLabel} from '/@/utils/gfast';
+import {useDict} from '/@/api/system/dict/data';
+import {getItems, setItems, getOptionValue, isEmpty} from '/@/api/items'
+// 分页组件
+import pagination from '/@/components/pagination/index.vue'
+
+// 大文件上传组件
+// @ts-ignore
+import uploader from 'vue-simple-uploader'
+import 'vue-simple-uploader/dist/style.css'
+
+
+const app = createApp(App);
+
+directive(app);
+other.elSvg(app);
+
+app.component('pagination', pagination)
+app.use(pinia)
+ .use(uploader)
+ .use(router)
+ .use(ElementPlus)
+ .use(i18n)
+ .use(VueGridLayout)
+ .mount('#app');
+
+app.config.globalProperties.getUpFileUrl=getUpFileUrl
+app.config.globalProperties.handleTree=handleTree
+app.config.globalProperties.useDict=useDict
+app.config.globalProperties.selectDictLabel=selectDictLabel
+
+app.config.globalProperties.getItems=getItems
+app.config.globalProperties.setItems=setItems
+app.config.globalProperties.getOptionValue=getOptionValue
+app.config.globalProperties.isEmpty=isEmpty
+app.config.globalProperties.parseTime=parseTime
+
+const globalProperties={
+ mittBus: mitt(),
+ i18n
+}
+
+
+//必须合并vue默认的变量,否则有问题
+app.config.globalProperties = Object.assign(
+ app.config.globalProperties,
+ globalProperties
+);
diff --git a/src/router/backEnd.ts b/src/router/backEnd.ts
new file mode 100644
index 0000000..c957492
--- /dev/null
+++ b/src/router/backEnd.ts
@@ -0,0 +1,179 @@
+import { RouteRecordRaw } from 'vue-router';
+import pinia from '/@/stores/index';
+import { useUserInfo } from '/@/stores/userInfo';
+import { useRequestOldRoutes } from '/@/stores/requestOldRoutes';
+import { Session } from '/@/utils/storage';
+import { NextLoading } from '/@/utils/loading';
+import { demoRoutes,dynamicRoutes, notFoundAndNoPower } from '/@/router/route';
+import { formatTwoStageRoutes, formatFlatteningRoutes, router } from '/@/router/index';
+import { useRoutesList } from '/@/stores/routesList';
+import { useTagsViewRoutes } from '/@/stores/tagsViewRoutes';
+import { getUserMenus } from '/@/api/system/menu/index';
+
+
+
+const layouModules: any = import.meta.glob('../layout/routerView/*.{vue,tsx}');
+const viewsModules: any = import.meta.glob('../views/**/*.{vue,tsx}');
+
+// 后端控制路由
+
+/**
+ * 获取目录下的 .vue、.tsx 全部文件
+ * @method import.meta.glob
+ * @link 参考:https://cn.vitejs.dev/guide/features.html#json
+ */
+const dynamicViewsModules: Record = Object.assign({}, { ...layouModules }, { ...viewsModules });
+
+/**
+ * 后端控制路由:初始化方法,防止刷新时路由丢失
+ * @method NextLoading 界面 loading 动画开始执行
+ * @method useUserInfo().setUserInfos() 触发初始化用户信息 pinia
+ * @method useRequestOldRoutes().setRequestOldRoutes() 存储接口原始路由(未处理component),根据需求选择使用
+ * @method setAddRoute 添加动态路由
+ * @method setFilterMenuAndCacheTagsViewRoutes 设置路由到 vuex routesList 中(已处理成多级嵌套路由)及缓存多级嵌套数组处理后的一维数组
+ */
+export async function initBackEndControlRoutes() {
+ // 界面 loading 动画开始执行
+ if (window.nextLoading === undefined) NextLoading.start();
+ // 无 token 停止执行下一步
+ if (!Session.get('token')) return false;
+ // 触发初始化用户信息 pinia
+ // https://gitee.com/lyt-top/vue-next-admin/issues/I5F1HP
+ await useUserInfo().setUserInfos();
+ await useUserInfo().setPermissions();
+ // 获取路由菜单数据
+ await getBackEndControlRoutes();
+ let menuRoute = Session.get('userMenu')
+ // 存储接口原始路由(未处理component),根据需求选择使用
+ useRequestOldRoutes().setRequestOldRoutes(JSON.parse(JSON.stringify(menuRoute)));
+ // 处理路由(component),替换 dynamicRoutes(/@/router/route)第一个顶级 children 的路由
+ dynamicRoutes[0].children?.push(...await backEndComponent(menuRoute),...demoRoutes);
+ // 添加动态路由
+ await setAddRoute();
+ // 设置路由到 vuex routesList 中(已处理成多级嵌套路由)及缓存多级嵌套数组处理后的一维数组
+ await setFilterMenuAndCacheTagsViewRoutes();
+}
+
+/**
+ * 设置路由到 vuex routesList 中(已处理成多级嵌套路由)及缓存多级嵌套数组处理后的一维数组
+ * @description 用于左侧菜单、横向菜单的显示
+ * @description 用于 tagsView、菜单搜索中:未过滤隐藏的(isHide)
+ */
+export function setFilterMenuAndCacheTagsViewRoutes() {
+ const storesRoutesList = useRoutesList(pinia);
+ storesRoutesList.setRoutesList(dynamicRoutes[0].children as any);
+ setCacheTagsViewRoutes();
+}
+
+/**
+ * 缓存多级嵌套数组处理后的一维数组
+ * @description 用于 tagsView、菜单搜索中:未过滤隐藏的(isHide)
+ */
+export function setCacheTagsViewRoutes() {
+ const storesTagsView = useTagsViewRoutes(pinia);
+ storesTagsView.setTagsViewRoutes(formatTwoStageRoutes(formatFlatteningRoutes(dynamicRoutes))[0].children);
+}
+
+/**
+ * 处理路由格式及添加捕获所有路由或 404 Not found 路由
+ * @description 替换 dynamicRoutes(/@/router/route)第一个顶级 children 的路由
+ * @returns 返回替换后的路由数组
+ */
+export function setFilterRouteEnd() {
+ let filterRouteEnd: any = formatTwoStageRoutes(formatFlatteningRoutes(dynamicRoutes));
+ filterRouteEnd[0].children = [...filterRouteEnd[0].children, ...notFoundAndNoPower];
+ return filterRouteEnd;
+}
+
+/**
+ * 添加动态路由
+ * @method router.addRoute
+ * @description 此处循环为 dynamicRoutes(/@/router/route)第一个顶级 children 的路由一维数组,非多级嵌套
+ * @link 参考:https://next.router.vuejs.org/zh/api/#addroute
+ */
+export async function setAddRoute() {
+ await setFilterRouteEnd().forEach((route: RouteRecordRaw) => {
+ const routeName: any = route.name;
+ if (!router.hasRoute(routeName)) router.addRoute(route);
+ });
+}
+
+/**
+ * 请求后端路由菜单接口
+ * @description isRequestRoutes 为 true,则开启后端控制路由
+ * @returns 返回后端路由菜单数据
+ */
+export async function getBackEndControlRoutes() {
+ let menuRoute = Session.get('userMenu')
+ let permissions = Session.get('permissions')
+ if (!menuRoute || !permissions) {
+ await refreshBackEndControlRoutes()
+ }
+}
+
+/**
+ * 请求后端路由菜单接口刷新菜单及权限
+ * @description isRequestRoutes 为 true,则开启后端控制路由
+ * @returns 返回后端路由菜单数据
+ */
+export async function refreshBackEndControlRoutes() {
+ // 获取路由
+ await getUserMenus().then((res:any)=>{
+ Session.set('userMenu',res.data.menuList)
+ Session.set('permissions',res.data.permissions)
+ })
+ await useUserInfo().setPermissions()
+}
+
+/**
+ * 重新请求后端路由菜单接口
+ * @description 用于菜单管理界面刷新菜单(未进行测试)
+ * @description 路径:/src/views/system/menu/component/addMenu.vue
+ */
+export function setBackEndControlRefreshRoutes() {
+ getBackEndControlRoutes();
+}
+
+/**
+ * 后端路由 component 转换
+ * @param routes 后端返回的路由表数组
+ * @returns 返回处理成函数后的 component
+ */
+export function backEndComponent(routes: any) {
+ if (!routes) return;
+ return routes.map((item: any) => {
+ if(item.children&&item.children.length>0){
+ item.children.some((ci:any)=>{
+ if(!ci.meta.isHide){
+ item.redirect = ci
+ return true
+ }
+ return false
+ })
+ }
+ if (item.component) item.component = dynamicImport(dynamicViewsModules, item.component as string);
+ item.children && backEndComponent(item.children);
+ return item;
+ });
+}
+
+/**
+ * 后端路由 component 转换函数
+ * @param dynamicViewsModules 获取目录下的 .vue、.tsx 全部文件
+ * @param component 当前要处理项 component
+ * @returns 返回处理成函数后的 component
+ */
+export function dynamicImport(dynamicViewsModules: Record, component: string) {
+ const keys = Object.keys(dynamicViewsModules);
+ const matchKeys = keys.filter((key) => {
+ const k = key.replace(/..\/views|../, '');
+ return k.startsWith(`${component}`) || k.startsWith(`/${component}`);
+ });
+ if (matchKeys?.length === 1) {
+ const matchKey = matchKeys[0];
+ return dynamicViewsModules[matchKey];
+ }
+ if (matchKeys?.length > 1) {
+ return false;
+ }
+}
diff --git a/src/router/frontEnd.ts b/src/router/frontEnd.ts
new file mode 100644
index 0000000..67fc3fa
--- /dev/null
+++ b/src/router/frontEnd.ts
@@ -0,0 +1,148 @@
+import { RouteRecordRaw } from 'vue-router';
+import { storeToRefs } from 'pinia';
+import { formatTwoStageRoutes, formatFlatteningRoutes, router } from '/@/router/index';
+import { dynamicRoutes, notFoundAndNoPower } from '/@/router/route';
+import pinia from '/@/stores/index';
+import { Session } from '/@/utils/storage';
+import { useUserInfo } from '/@/stores/userInfo';
+import { useTagsViewRoutes } from '/@/stores/tagsViewRoutes';
+import { useRoutesList } from '/@/stores/routesList';
+import { NextLoading } from '/@/utils/loading';
+
+// 前端控制路由
+
+/**
+ * 前端控制路由:初始化方法,防止刷新时路由丢失
+ * @method NextLoading 界面 loading 动画开始执行
+ * @method useUserInfo(pinia).setUserInfos() 触发初始化用户信息 pinia
+ * @method setAddRoute 添加动态路由
+ * @method setFilterMenuAndCacheTagsViewRoutes 设置递归过滤有权限的路由到 vuex routesList 中(已处理成多级嵌套路由)及缓存多级嵌套数组处理后的一维数组
+ */
+export async function initFrontEndControlRoutes() {
+ // 界面 loading 动画开始执行
+ if (window.nextLoading === undefined) NextLoading.start();
+ // 无 token 停止执行下一步
+ if (!Session.get('token')) return false;
+ // 触发初始化用户信息 pinia
+ // https://gitee.com/lyt-top/vue-next-admin/issues/I5F1HP
+ await useUserInfo(pinia).setUserInfos();
+ // 添加动态路由
+ await setAddRoute();
+ // 设置递归过滤有权限的路由到 vuex routesList 中(已处理成多级嵌套路由)及缓存多级嵌套数组处理后的一维数组
+ await setFilterMenuAndCacheTagsViewRoutes();
+}
+
+/**
+ * 添加动态路由
+ * @method router.addRoute
+ * @description 此处循环为 dynamicRoutes(/@/router/route)第一个顶级 children 的路由一维数组,非多级嵌套
+ * @link 参考:https://next.router.vuejs.org/zh/api/#addroute
+ */
+export async function setAddRoute() {
+ await setFilterRouteEnd().forEach((route: RouteRecordRaw) => {
+ router.addRoute(route);
+ });
+}
+
+/**
+ * 删除/重置路由
+ * @method router.removeRoute
+ * @description 此处循环为 dynamicRoutes(/@/router/route)第一个顶级 children 的路由一维数组,非多级嵌套
+ * @link 参考:https://next.router.vuejs.org/zh/api/#push
+ */
+export async function frontEndsResetRoute() {
+ await setFilterRouteEnd().forEach((route: RouteRecordRaw) => {
+ const routeName: any = route.name;
+ router.hasRoute(routeName) && router.removeRoute(routeName);
+ });
+}
+
+/**
+ * 获取有当前用户权限标识的路由数组,进行对原路由的替换
+ * @description 替换 dynamicRoutes(/@/router/route)第一个顶级 children 的路由
+ * @returns 返回替换后的路由数组
+ */
+export function setFilterRouteEnd() {
+ let filterRouteEnd: any = formatTwoStageRoutes(formatFlatteningRoutes(dynamicRoutes));
+ filterRouteEnd[0].children = [...setFilterRoute(filterRouteEnd[0].children), ...notFoundAndNoPower];
+ return filterRouteEnd;
+}
+
+/**
+ * 获取当前用户权限标识去比对路由表(未处理成多级嵌套路由)
+ * @description 这里主要用于动态路由的添加,router.addRoute
+ * @link 参考:https://next.router.vuejs.org/zh/api/#addroute
+ * @param chil dynamicRoutes(/@/router/route)第一个顶级 children 的下路由集合
+ * @returns 返回有当前用户权限标识的路由数组
+ */
+export function setFilterRoute(chil: any) {
+ const stores = useUserInfo(pinia);
+ const { userInfos } = storeToRefs(stores);
+ let filterRoute: any = [];
+ chil.forEach((route: any) => {
+ if (route.meta.roles) {
+ route.meta.roles.forEach((metaRoles: any) => {
+ userInfos.value.roles.forEach((roles: any) => {
+ if (metaRoles === roles) filterRoute.push({ ...route });
+ });
+ });
+ }
+ });
+ return filterRoute;
+}
+
+/**
+ * 缓存多级嵌套数组处理后的一维数组
+ * @description 用于 tagsView、菜单搜索中:未过滤隐藏的(isHide)
+ */
+export function setCacheTagsViewRoutes() {
+ // 获取有权限的路由,否则 tagsView、菜单搜索中无权限的路由也将显示
+ const stores = useUserInfo(pinia);
+ const storesTagsView = useTagsViewRoutes(pinia);
+ const { userInfos } = storeToRefs(stores);
+ let rolesRoutes = setFilterHasRolesMenu(dynamicRoutes, userInfos.value.roles);
+ // 添加到 pinia setTagsViewRoutes 中
+ storesTagsView.setTagsViewRoutes(formatTwoStageRoutes(formatFlatteningRoutes(rolesRoutes))[0].children);
+}
+
+/**
+ * 设置递归过滤有权限的路由到 vuex routesList 中(已处理成多级嵌套路由)及缓存多级嵌套数组处理后的一维数组
+ * @description 用于左侧菜单、横向菜单的显示
+ * @description 用于 tagsView、菜单搜索中:未过滤隐藏的(isHide)
+ */
+export function setFilterMenuAndCacheTagsViewRoutes() {
+ const stores = useUserInfo(pinia);
+ const storesRoutesList = useRoutesList(pinia);
+ const { userInfos } = storeToRefs(stores);
+ storesRoutesList.setRoutesList(setFilterHasRolesMenu(dynamicRoutes[0].children, userInfos.value.roles));
+ setCacheTagsViewRoutes();
+}
+
+/**
+ * 判断路由 `meta.roles` 中是否包含当前登录用户权限字段
+ * @param roles 用户权限标识,在 userInfos(用户信息)的 roles(登录页登录时缓存到浏览器)数组
+ * @param route 当前循环时的路由项
+ * @returns 返回对比后有权限的路由项
+ */
+export function hasRoles(roles: any, route: any) {
+ if (route.meta && route.meta.roles) return roles.some((role: any) => route.meta.roles.includes(role));
+ else return true;
+}
+
+/**
+ * 获取当前用户权限标识去比对路由表,设置递归过滤有权限的路由
+ * @param routes 当前路由 children
+ * @param roles 用户权限标识,在 userInfos(用户信息)的 roles(登录页登录时缓存到浏览器)数组
+ * @returns 返回有权限的路由数组 `meta.roles` 中控制
+ */
+export function setFilterHasRolesMenu(routes: any, roles: any) {
+ const menu: any = [];
+ routes.forEach((route: any) => {
+ const item = { ...route };
+ if (hasRoles(roles, item)) {
+ if (item.children) item.children = setFilterHasRolesMenu(item.children, roles);
+ menu.push(item);
+ }
+ });
+ return menu;
+}
diff --git a/src/router/index.ts b/src/router/index.ts
new file mode 100644
index 0000000..da607b1
--- /dev/null
+++ b/src/router/index.ts
@@ -0,0 +1,131 @@
+import { createRouter, createWebHashHistory } from 'vue-router';
+import NProgress from 'nprogress';
+import 'nprogress/nprogress.css';
+import pinia from '/@/stores/index';
+import { storeToRefs } from 'pinia';
+import { useKeepALiveNames } from '/@/stores/keepAliveNames';
+import { useRoutesList } from '/@/stores/routesList';
+import { useThemeConfig } from '/@/stores/themeConfig';
+import { Session } from '/@/utils/storage';
+import { staticRoutes } from '/@/router/route';
+import { initFrontEndControlRoutes } from '/@/router/frontEnd';
+import { initBackEndControlRoutes } from '/@/router/backEnd';
+
+/**
+ * 1、前端控制路由时:isRequestRoutes 为 false,需要写 roles,需要走 setFilterRoute 方法。
+ * 2、后端控制路由时:isRequestRoutes 为 true,不需要写 roles,不需要走 setFilterRoute 方法),
+ * 相关方法已拆解到对应的 `backEnd.ts` 与 `frontEnd.ts`(他们互不影响,不需要同时改 2 个文件)。
+ * 特别说明:
+ * 1、前端控制:路由菜单由前端去写(无菜单管理界面,有角色管理界面),角色管理中有 roles 属性,需返回到 userInfo 中。
+ * 2、后端控制:路由菜单由后端返回(有菜单管理界面、有角色管理界面)
+ */
+
+// 读取 `/src/stores/themeConfig.ts` 是否开启后端控制路由配置
+const storesThemeConfig = useThemeConfig(pinia);
+const { themeConfig } = storeToRefs(storesThemeConfig);
+const { isRequestRoutes } = themeConfig.value;
+
+/**
+ * 创建一个可以被 Vue 应用程序使用的路由实例
+ * @method createRouter(options: RouterOptions): Router
+ * @link 参考:https://next.router.vuejs.org/zh/api/#createrouter
+ */
+export const router = createRouter({
+ history: createWebHashHistory(),
+ routes: staticRoutes,
+});
+
+/**
+ * 路由多级嵌套数组处理成一维数组
+ * @param arr 传入路由菜单数据数组
+ * @returns 返回处理后的一维路由菜单数组
+ */
+export function formatFlatteningRoutes(arr: any) {
+ if (arr.length <= 0) return false;
+ for (let i = 0; i < arr.length; i++) {
+ if (arr[i].children) {
+ arr = arr.slice(0, i + 1).concat(arr[i].children, arr.slice(i + 1));
+ }
+ }
+ return arr;
+}
+
+/**
+ * 一维数组处理成多级嵌套数组(只保留二级:也就是二级以上全部处理成只有二级,keep-alive 支持二级缓存)
+ * @description isKeepAlive 处理 `name` 值,进行缓存。顶级关闭,全部不缓存
+ * @link 参考:https://v3.cn.vuejs.org/api/built-in-components.html#keep-alive
+ * @param arr 处理后的一维路由菜单数组
+ * @returns 返回将一维数组重新处理成 `定义动态路由(dynamicRoutes)` 的格式
+ */
+export function formatTwoStageRoutes(arr: any) {
+ if (arr.length <= 0) return false;
+ const newArr: any = [];
+ const cacheList: Array = [];
+ arr.forEach((v: any) => {
+ if (v.path === '/') {
+ newArr.push({ component: v.component, name: v.name, path: v.path, redirect: v.redirect, meta: v.meta, children: [] });
+ } else {
+ // 判断是否是动态路由(xx/:id/:name),用于 tagsView 等中使用
+ // 修复:https://gitee.com/lyt-top/vue-next-admin/issues/I3YX6G
+ if (v.path.indexOf('/:') > -1) {
+ v.meta['isDynamic'] = true;
+ v.meta['isDynamicPath'] = v.path;
+ }
+ newArr[0].children.push({ ...v });
+ // 存 name 值,keep-alive 中 include 使用,实现路由的缓存
+ // 路径:/@/layout/routerView/parent.vue
+ if (newArr[0].meta.isKeepAlive && v.meta.isKeepAlive) {
+ cacheList.push(v.name);
+ const stores = useKeepALiveNames(pinia);
+ stores.setCacheKeepAlive(cacheList);
+ }
+ }
+ });
+ return newArr;
+}
+
+// 路由加载前
+router.beforeEach(async (to, from, next) => {
+ NProgress.configure({ showSpinner: false });
+ if (to.meta.title) NProgress.start();
+ const token = Session.get('token');
+ if (to.path === '/login' && !token) {
+ next();
+ NProgress.done();
+ } else {
+ if (!token) {
+ next(`/login?redirect=${to.path}¶ms=${JSON.stringify(to.query ? to.query : to.params)}`);
+ Session.clear();
+ NProgress.done();
+ } else if (token && to.path === '/login') {
+ next('/home');
+ NProgress.done();
+ } else {
+ const storesRoutesList = useRoutesList(pinia);
+ const { routesList } = storeToRefs(storesRoutesList);
+ if (routesList.value.length === 0) {
+ if (isRequestRoutes) {
+ // 后端控制路由:路由数据初始化,防止刷新时丢失
+ await initBackEndControlRoutes();
+ // 动态添加路由:防止非首页刷新时跳转回首页的问题
+ // 确保 addRoute() 时动态添加的路由已经被完全加载上去
+ next({ ...to, replace: true });
+ } else {
+ // https://gitee.com/lyt-top/vue-next-admin/issues/I5F1HP
+ await initFrontEndControlRoutes();
+ next({ ...to, replace: true });
+ }
+ } else {
+ next();
+ }
+ }
+ }
+});
+
+// 路由加载后
+router.afterEach(() => {
+ NProgress.done();
+});
+
+// 导出路由
+export default router;
diff --git a/src/router/route.ts b/src/router/route.ts
new file mode 100644
index 0000000..6d7c30f
--- /dev/null
+++ b/src/router/route.ts
@@ -0,0 +1,1125 @@
+import { RouteRecordRaw } from 'vue-router';
+
+/**
+ * 路由meta对象参数说明
+ * meta: {
+ * title: 菜单栏及 tagsView 栏、菜单搜索名称(国际化)
+ * isLink: 是否超链接菜单,开启外链条件,`1、isLink: 链接地址不为空`
+ * isHide: 是否隐藏此路由
+ * isKeepAlive: 是否缓存组件状态
+ * isAffix: 是否固定在 tagsView 栏上
+ * isIframe: 是否内嵌窗口,开启条件,`1、isIframe:true 2、isLink:链接地址不为空`
+ * roles: 当前路由权限标识,取角色管理。控制路由显示、隐藏。超级管理员:admin 普通角色:common
+ * icon: 菜单、tagsView 图标,阿里:加 `iconfont xxx`,fontawesome:加 `fa xxx`
+ * }
+ */
+
+/**
+ * 定义动态路由
+ * 前端添加路由,请在顶级节点的 `children 数组` 里添加
+ * @description 未开启 isRequestRoutes 为 true 时使用(前端控制路由),开启时第一个顶级 children 的路由将被替换成接口请求回来的路由数据
+ * @description 各字段请查看 `/@/views/system/menu/component/addMenu.vue 下的 ruleForm`
+ * @returns 返回路由菜单数据
+ */
+export const dynamicRoutes: Array = [
+ {
+ path: '/',
+ name: '/',
+ component: () => import('/@/layout/index.vue'),
+ redirect: '/home',
+ meta: {
+ isKeepAlive: true,
+ },
+ children: [
+ {
+ path: '/home',
+ name: 'home',
+ component: () => import('/@/views/home/index.vue'),
+ meta: {
+ title: 'message.router.home',
+ isLink: '',
+ isHide: false,
+ isKeepAlive: true,
+ isAffix: true,
+ isIframe: false,
+ roles: ['admin', 'common'],
+ icon: 'iconfont icon-shouye',
+ },
+ },
+ {
+ path: '/personal',
+ name: 'personals',
+ component: () => import('/@/views/system/personal/index.vue'),
+ meta: {
+ title: '个人中心',
+ isLink: '',
+ isHide: true,
+ isKeepAlive: true,
+ isAffix: false,
+ isIframe: false,
+ roles: ['admin'],
+ icon: 'iconfont icon-diannao',
+ },
+ }
+ ],
+ },
+];
+
+export const demoRoutes:Array = [
+ {
+ path: '/demo',
+ name: 'demo',
+ component: () => import('/@/layout/routerView/parent.vue'),
+ redirect: '/demo/system/menu',
+ meta: {
+ title: '案例演示',
+ isLink: '',
+ isHide: false,
+ isKeepAlive: true,
+ isAffix: false,
+ isIframe: false,
+ roles: ['admin'],
+ icon: 'iconfont icon-diannao',
+ },
+ children:[
+ {
+ path: '/demo/system',
+ name: 'system',
+ component: () => import('/@/layout/routerView/parent.vue'),
+ redirect: '/system/menu',
+ meta: {
+ title: 'message.router.system',
+ isLink: '',
+ isHide: false,
+ isKeepAlive: true,
+ isAffix: false,
+ isIframe: false,
+ roles: ['admin'],
+ icon: 'iconfont icon-xitongshezhi',
+ },
+ children: [
+ {
+ path: '/demo/system/menu',
+ name: 'systemMenu',
+ component: () => import('/@/views/system/menu/index.vue'),
+ meta: {
+ title: 'message.router.systemMenu',
+ isLink: '',
+ isHide: false,
+ isKeepAlive: true,
+ isAffix: false,
+ isIframe: false,
+ roles: ['admin'],
+ icon: 'iconfont icon-caidan',
+ },
+ },
+ {
+ path: '/demo/system/role',
+ name: 'systemRole',
+ component: () => import('/@/views/system/role/index.vue'),
+ meta: {
+ title: 'message.router.systemRole',
+ isLink: '',
+ isHide: false,
+ isKeepAlive: true,
+ isAffix: false,
+ isIframe: false,
+ roles: ['admin'],
+ icon: 'ele-ColdDrink',
+ },
+ },
+ {
+ path: '/demo/system/user',
+ name: 'systemUser',
+ component: () => import('/@/views/system/user/index.vue'),
+ meta: {
+ title: 'message.router.systemUser',
+ isLink: '',
+ isHide: false,
+ isKeepAlive: true,
+ isAffix: false,
+ isIframe: false,
+ roles: ['admin'],
+ icon: 'iconfont icon-icon-',
+ },
+ },
+ {
+ path: '/demo/system/dept',
+ name: 'systemDept',
+ component: () => import('/@/views/system/dept/index.vue'),
+ meta: {
+ title: 'message.router.systemDept',
+ isLink: '',
+ isHide: false,
+ isKeepAlive: true,
+ isAffix: false,
+ isIframe: false,
+ roles: ['admin'],
+ icon: 'ele-OfficeBuilding',
+ },
+ },
+ ],
+ },
+ {
+ path: '/demo/menu',
+ name: 'menu',
+ component: () => import('/@/layout/routerView/parent.vue'),
+ redirect: '/menu/menu1',
+ meta: {
+ title: 'message.router.menu',
+ isLink: '',
+ isHide: false,
+ isKeepAlive: true,
+ isAffix: false,
+ isIframe: false,
+ roles: ['admin', 'common'],
+ icon: 'iconfont icon-caidan',
+ },
+ children: [
+ {
+ path: '/demo/menu/menu1',
+ name: 'menu1',
+ component: () => import('/@/layout/routerView/parent.vue'),
+ redirect: '/menu/menu1/menu11',
+ meta: {
+ title: 'message.router.menu1',
+ isLink: '',
+ isHide: false,
+ isKeepAlive: true,
+ isAffix: false,
+ isIframe: false,
+ roles: ['admin', 'common'],
+ icon: 'iconfont icon-caidan',
+ },
+ children: [
+ {
+ path: '/demo/menu/menu1/menu11',
+ name: 'menu11',
+ component: () => import('/@/views/menu/menu1/menu11/index.vue'),
+ meta: {
+ title: 'message.router.menu11',
+ isLink: '',
+ isHide: false,
+ isKeepAlive: true,
+ isAffix: false,
+ isIframe: false,
+ roles: ['admin', 'common'],
+ icon: 'iconfont icon-caidan',
+ },
+ },
+ {
+ path: '/demo/menu/menu1/menu12',
+ name: 'menu12',
+ component: () => import('/@/layout/routerView/parent.vue'),
+ redirect: '/menu/menu1/menu12/menu121',
+ meta: {
+ title: 'message.router.menu12',
+ isLink: '',
+ isHide: false,
+ isKeepAlive: true,
+ isAffix: false,
+ isIframe: false,
+ roles: ['admin', 'common'],
+ icon: 'iconfont icon-caidan',
+ },
+ children: [
+ {
+ path: '/demo/menu/menu1/menu12/menu121',
+ name: 'menu121',
+ component: () => import('/@/views/menu/menu1/menu12/menu121/index.vue'),
+ meta: {
+ title: 'message.router.menu121',
+ isLink: '',
+ isHide: false,
+ isKeepAlive: true,
+ isAffix: false,
+ isIframe: false,
+ roles: ['admin', 'common'],
+ icon: 'iconfont icon-caidan',
+ },
+ },
+ {
+ path: '/demo/menu/menu1/menu12/menu122',
+ name: 'menu122',
+ component: () => import('/@/views/menu/menu1/menu12/menu122/index.vue'),
+ meta: {
+ title: 'message.router.menu122',
+ isLink: '',
+ isHide: false,
+ isKeepAlive: true,
+ isAffix: false,
+ isIframe: false,
+ roles: ['admin', 'common'],
+ icon: 'iconfont icon-caidan',
+ },
+ },
+ ],
+ },
+ {
+ path: '/demo/menu/menu1/menu13',
+ name: 'menu13',
+ component: () => import('/@/views/menu/menu1/menu13/index.vue'),
+ meta: {
+ title: 'message.router.menu13',
+ isLink: '',
+ isHide: false,
+ isKeepAlive: true,
+ isAffix: false,
+ isIframe: false,
+ roles: ['admin', 'common'],
+ icon: 'iconfont icon-caidan',
+ },
+ },
+ ],
+ },
+ {
+ path: '/demo/menu/menu2',
+ name: 'menu2',
+ component: () => import('/@/views/menu/menu2/index.vue'),
+ meta: {
+ title: 'message.router.menu2',
+ isLink: '',
+ isHide: false,
+ isKeepAlive: true,
+ isAffix: false,
+ isIframe: false,
+ roles: ['admin', 'common'],
+ icon: 'iconfont icon-caidan',
+ },
+ },
+ ],
+ },
+ {
+ path: '/demo/fun',
+ name: 'funIndex',
+ component: () => import('/@/layout/routerView/parent.vue'),
+ redirect: '/fun/tagsView',
+ meta: {
+ title: 'message.router.funIndex',
+ isLink: '',
+ isHide: false,
+ isKeepAlive: true,
+ isAffix: false,
+ isIframe: false,
+ roles: ['admin', 'common'],
+ icon: 'iconfont icon-crew_feature',
+ },
+ children: [
+ {
+ path: '/demo/fun/tagsView',
+ name: 'funTagsView',
+ component: () => import('/@/views/fun/tagsView/index.vue'),
+ meta: {
+ title: 'message.router.funTagsView',
+ isLink: '',
+ isHide: false,
+ isKeepAlive: true,
+ isAffix: false,
+ isIframe: false,
+ roles: ['admin', 'common'],
+ icon: 'ele-Pointer',
+ },
+ },
+ {
+ path: '/demo/fun/countup',
+ name: 'funCountup',
+ component: () => import('/@/views/fun/countup/index.vue'),
+ meta: {
+ title: 'message.router.funCountup',
+ isLink: '',
+ isHide: false,
+ isKeepAlive: true,
+ isAffix: false,
+ isIframe: false,
+ roles: ['admin', 'common'],
+ icon: 'ele-Odometer',
+ },
+ },
+ {
+ path: '/demo/fun/codemirror',
+ name: 'demoCodeMirror',
+ component: () => import('/@/views/fun/codemirror/index.vue'),
+ meta: {
+ title: '代码编辑器',
+ isLink: '',
+ isHide: false,
+ isKeepAlive: true,
+ isAffix: false,
+ isIframe: false,
+ roles: ['admin', 'common'],
+ icon: 'ele-Odometer',
+ },
+ },
+ {
+ path: '/demo/fun/cropper',
+ name: 'funCropper',
+ component: () => import('/@/views/fun/cropper/index.vue'),
+ meta: {
+ title: 'message.router.funCropper',
+ isLink: '',
+ isHide: false,
+ isKeepAlive: true,
+ isAffix: false,
+ isIframe: false,
+ roles: ['admin', 'common'],
+ icon: 'iconfont icon-caijian',
+ },
+ },
+ {
+ path: '/demo/fun/qrcode',
+ name: 'funQrcode',
+ component: () => import('/@/views/fun/qrcode/index.vue'),
+ meta: {
+ title: 'message.router.funQrcode',
+ isLink: '',
+ isHide: false,
+ isKeepAlive: true,
+ isAffix: false,
+ isIframe: false,
+ roles: ['admin', 'common'],
+ icon: 'iconfont icon-ico',
+ },
+ },
+ {
+ path: '/demo/fun/echartsMap',
+ name: 'funEchartsMap',
+ component: () => import('/@/views/fun/echartsMap/index.vue'),
+ meta: {
+ title: 'message.router.funEchartsMap',
+ isLink: '',
+ isHide: false,
+ isKeepAlive: true,
+ isAffix: false,
+ isIframe: false,
+ roles: ['admin', 'common'],
+ icon: 'iconfont icon-ditu',
+ },
+ },
+ {
+ path: '/demo/fun/printJs',
+ name: 'funPrintJs',
+ component: () => import('/@/views/fun/printJs/index.vue'),
+ meta: {
+ title: 'message.router.funPrintJs',
+ isLink: '',
+ isHide: false,
+ isKeepAlive: true,
+ isAffix: false,
+ isIframe: false,
+ roles: ['admin', 'common'],
+ icon: 'ele-Printer',
+ },
+ },
+ {
+ path: '/demo/fun/clipboard',
+ name: 'funClipboard',
+ component: () => import('/@/views/fun/clipboard/index.vue'),
+ meta: {
+ title: 'message.router.funClipboard',
+ isLink: '',
+ isHide: false,
+ isKeepAlive: true,
+ isAffix: false,
+ isIframe: false,
+ roles: ['admin', 'common'],
+ icon: 'ele-DocumentCopy',
+ },
+ },
+ {
+ path: '/demo/fun/gridLayout',
+ name: 'funGridLayout',
+ component: () => import('/@/views/fun/gridLayout/index.vue'),
+ meta: {
+ title: 'message.router.funGridLayout',
+ isLink: '',
+ isHide: false,
+ isKeepAlive: true,
+ isAffix: false,
+ isIframe: false,
+ roles: ['admin', 'common'],
+ icon: 'iconfont icon-tuodong',
+ },
+ },
+ {
+ path: '/demo/fun/splitpanes',
+ name: 'funSplitpanes',
+ component: () => import('/@/views/fun/splitpanes/index.vue'),
+ meta: {
+ title: 'message.router.funSplitpanes',
+ isLink: '',
+ isHide: false,
+ isKeepAlive: true,
+ isAffix: false,
+ isIframe: false,
+ roles: ['admin', 'common'],
+ icon: 'iconfont icon--chaifenlie',
+ },
+ },
+ ],
+ },
+ {
+ path: '/demo/pages',
+ name: 'pagesIndex',
+ component: () => import('/@/layout/routerView/parent.vue'),
+ redirect: '/pages/filtering',
+ meta: {
+ title: 'message.router.pagesIndex',
+ isLink: '',
+ isHide: false,
+ isKeepAlive: true,
+ isAffix: false,
+ isIframe: false,
+ roles: ['admin', 'common'],
+ icon: 'iconfont icon-fuzhiyemian',
+ },
+ children: [
+ {
+ path: '/demo/pages/filtering',
+ name: 'pagesFiltering',
+ component: () => import('/@/views/pages/filtering/index.vue'),
+ meta: {
+ title: 'message.router.pagesFiltering',
+ isLink: '',
+ isHide: false,
+ isKeepAlive: true,
+ isAffix: false,
+ isIframe: false,
+ roles: ['admin', 'common'],
+ icon: 'ele-Sell',
+ },
+ /**
+ * 注意此处详情写法:
+ * 1、嵌套进父级里时,面包屑显示为:首页/页面/过滤筛选组件/过滤筛选组件详情
+ * 2、不嵌套进父级时,面包屑显示为:首页/页面/过滤筛选组件/过滤筛选组件详情
+ * 3、想要父级不高亮,面包屑显示为:首页/页面/过滤筛选组件详情,设置路径为:/pages/filteringDetails
+ */
+ children: [
+ {
+ path: '/demo/pages/filtering/details',
+ name: 'pagesFilteringDetails',
+ component: () => import('/@/views/pages/filtering/details.vue'),
+ meta: {
+ title: 'message.router.pagesFilteringDetails',
+ isLink: '',
+ isHide: true,
+ isKeepAlive: false,
+ isAffix: false,
+ isIframe: false,
+ roles: ['admin', 'common'],
+ icon: 'ele-Sunny',
+ },
+ },
+ ],
+ },
+ {
+ path: '/demo/pages/filtering/details1',
+ name: 'pagesFilteringDetails1',
+ component: () => import('/@/views/pages/filtering/details1.vue'),
+ meta: {
+ title: 'message.router.pagesFilteringDetails1',
+ isLink: '',
+ isHide: true,
+ isKeepAlive: false,
+ isAffix: false,
+ isIframe: false,
+ roles: ['admin', 'common'],
+ icon: 'ele-Sunny',
+ },
+ },
+ {
+ path: '/demo/pages/iocnfont',
+ name: 'pagesIocnfont',
+ component: () => import('/@/views/pages/iocnfont/index.vue'),
+ meta: {
+ title: 'message.router.pagesIocnfont',
+ isLink: '',
+ isHide: false,
+ isKeepAlive: true,
+ isAffix: false,
+ isIframe: false,
+ roles: ['admin', 'common'],
+ icon: 'ele-Present',
+ },
+ },
+ {
+ path: '/demo/pages/element',
+ name: 'pagesElement',
+ component: () => import('/@/views/pages/element/index.vue'),
+ meta: {
+ title: 'message.router.pagesElement',
+ isLink: '',
+ isHide: false,
+ isKeepAlive: true,
+ isAffix: false,
+ isIframe: false,
+ roles: ['admin', 'common'],
+ icon: 'ele-Eleme',
+ },
+ },
+ {
+ path: '/demo/pages/awesome',
+ name: 'pagesAwesome',
+ component: () => import('/@/views/pages/awesome/index.vue'),
+ meta: {
+ title: 'message.router.pagesAwesome',
+ isLink: '',
+ isHide: false,
+ isKeepAlive: true,
+ isAffix: false,
+ isIframe: false,
+ roles: ['admin', 'common'],
+ icon: 'ele-SetUp',
+ },
+ },
+ {
+ path: '/demo/pages/formAdapt',
+ name: 'pagesFormAdapt',
+ component: () => import('/@/views/pages/formAdapt/index.vue'),
+ meta: {
+ title: 'message.router.pagesFormAdapt',
+ isLink: '',
+ isHide: false,
+ isKeepAlive: true,
+ isAffix: false,
+ isIframe: false,
+ roles: ['admin', 'common'],
+ icon: 'iconfont icon-biaodan',
+ },
+ },
+ {
+ path: '/demo/pages/tableRules',
+ name: 'pagesTableRules',
+ component: () => import('/@/views/pages/tableRules/index.vue'),
+ meta: {
+ title: 'message.router.pagesTableRules',
+ isLink: '',
+ isHide: false,
+ isKeepAlive: true,
+ isAffix: false,
+ isIframe: false,
+ roles: ['admin', 'common'],
+ icon: 'iconfont icon-jiliandongxuanzeqi',
+ },
+ },
+ {
+ path: '/demo/pages/formI18n',
+ name: 'pagesFormI18n',
+ component: () => import('/@/views/pages/formI18n/index.vue'),
+ meta: {
+ title: 'message.router.pagesFormI18n',
+ isLink: '',
+ isHide: false,
+ isKeepAlive: true,
+ isAffix: false,
+ isIframe: false,
+ roles: ['admin', 'common'],
+ icon: 'iconfont icon-diqiu',
+ },
+ },
+ {
+ path: '/demo/pages/formRules',
+ name: 'pagesFormRules',
+ component: () => import('/@/views/pages/formRules/index.vue'),
+ meta: {
+ title: 'message.router.pagesFormRules',
+ isLink: '',
+ isHide: false,
+ isKeepAlive: true,
+ isAffix: false,
+ isIframe: false,
+ roles: ['admin', 'common'],
+ icon: 'iconfont icon-shuxing',
+ },
+ },
+ {
+ path: '/demo/pages/listAdapt',
+ name: 'pagesListAdapt',
+ component: () => import('/@/views/pages/listAdapt/index.vue'),
+ meta: {
+ title: 'message.router.pagesListAdapt',
+ isLink: '',
+ isHide: false,
+ isKeepAlive: true,
+ isAffix: false,
+ isIframe: false,
+ roles: ['admin', 'common'],
+ icon: 'iconfont icon-chazhaobiaodanliebiao',
+ },
+ },
+ {
+ path: '/demo/pages/waterfall',
+ name: 'pagesWaterfall',
+ component: () => import('/@/views/pages/waterfall/index.vue'),
+ meta: {
+ title: 'message.router.pagesWaterfall',
+ isLink: '',
+ isHide: false,
+ isKeepAlive: true,
+ isAffix: false,
+ isIframe: false,
+ roles: ['admin', 'common'],
+ icon: 'iconfont icon-zidingyibuju',
+ },
+ },
+ {
+ path: '/demo/pages/steps',
+ name: 'pagesSteps',
+ component: () => import('/@/views/pages/steps/index.vue'),
+ meta: {
+ title: 'message.router.pagesSteps',
+ isLink: '',
+ isHide: false,
+ isKeepAlive: true,
+ isAffix: false,
+ isIframe: false,
+ roles: ['admin', 'common'],
+ icon: 'iconfont icon-step',
+ },
+ },
+ {
+ path: '/demo/pages/preview',
+ name: 'pagesPreview',
+ component: () => import('/@/views/pages/preview/index.vue'),
+ meta: {
+ title: 'message.router.pagesPreview',
+ isLink: '',
+ isHide: false,
+ isKeepAlive: true,
+ isAffix: false,
+ isIframe: false,
+ roles: ['admin', 'common'],
+ icon: 'iconfont icon-15tupianyulan',
+ },
+ },
+ {
+ path: '/demo/pages/waves',
+ name: 'pagesWaves',
+ component: () => import('/@/views/pages/waves/index.vue'),
+ meta: {
+ title: 'message.router.pagesWaves',
+ isLink: '',
+ isHide: false,
+ isKeepAlive: true,
+ isAffix: false,
+ isIframe: false,
+ roles: ['admin', 'common'],
+ icon: 'iconfont icon-bolangneng',
+ },
+ },
+ {
+ path: '/demo/pages/tree',
+ name: 'pagesTree',
+ component: () => import('/@/views/pages/tree/index.vue'),
+ meta: {
+ title: 'message.router.pagesTree',
+ isLink: '',
+ isHide: false,
+ isKeepAlive: true,
+ isAffix: false,
+ isIframe: false,
+ roles: ['admin', 'common'],
+ icon: 'iconfont icon-shuxingtu',
+ },
+ },
+ {
+ path: '/demo/pages/drag',
+ name: 'pagesDrag',
+ component: () => import('/@/views/pages/drag/index.vue'),
+ meta: {
+ title: 'message.router.pagesDrag',
+ isLink: '',
+ isHide: false,
+ isKeepAlive: true,
+ isAffix: false,
+ isIframe: false,
+ roles: ['admin', 'common'],
+ icon: 'ele-Pointer',
+ },
+ },
+ {
+ path: '/demo/pages/lazyImg',
+ name: 'pagesLazyImg',
+ component: () => import('/@/views/pages/lazyImg/index.vue'),
+ meta: {
+ title: 'message.router.pagesLazyImg',
+ isLink: '',
+ isHide: false,
+ isKeepAlive: true,
+ isAffix: false,
+ isIframe: false,
+ roles: ['admin'],
+ icon: 'ele-PictureFilled',
+ },
+ },
+ {
+ path: '/demo/pages/dynamicForm',
+ name: 'pagesDynamicForm',
+ component: () => import('/@/views/pages/dynamicForm/index.vue'),
+ meta: {
+ title: 'message.router.pagesDynamicForm',
+ isLink: '',
+ isHide: false,
+ isKeepAlive: true,
+ isAffix: false,
+ isIframe: false,
+ roles: ['admin'],
+ icon: 'iconfont icon-diannao',
+ },
+ },
+ {
+ path: '/demo/pages/workflow',
+ name: 'pagesWorkflow',
+ component: () => import('/@/views/pages/workflow/index.vue'),
+ meta: {
+ title: 'message.router.pagesWorkflow',
+ isLink: '',
+ isHide: false,
+ isKeepAlive: true,
+ isAffix: false,
+ isIframe: false,
+ roles: ['admin'],
+ icon: 'ele-Connection',
+ },
+ },
+ ],
+ },
+ {
+ path: '/demo/make',
+ name: 'makeIndex',
+ component: () => import('/@/layout/routerView/parent.vue'),
+ redirect: '/make/selector',
+ meta: {
+ title: 'message.router.makeIndex',
+ isLink: '',
+ isHide: false,
+ isKeepAlive: true,
+ isAffix: false,
+ isIframe: false,
+ roles: ['admin'],
+ icon: 'iconfont icon-siweidaotu',
+ },
+ children: [
+ {
+ path: '/demo/make/selector',
+ name: 'makeSelector',
+ component: () => import('/@/views/make/selector/index.vue'),
+ meta: {
+ title: 'message.router.makeSelector',
+ isLink: '',
+ isHide: false,
+ isKeepAlive: true,
+ isAffix: false,
+ isIframe: false,
+ roles: ['admin', 'common'],
+ icon: 'iconfont icon-xuanzeqi',
+ },
+ },
+ {
+ path: '/demo/make/noticeBar',
+ name: 'makeNoticeBar',
+ component: () => import('/@/views/make/noticeBar/index.vue'),
+ meta: {
+ title: 'message.router.makeNoticeBar',
+ isLink: '',
+ isHide: false,
+ isKeepAlive: true,
+ isAffix: false,
+ isIframe: false,
+ roles: ['admin', 'common'],
+ icon: 'ele-Bell',
+ },
+ },
+ {
+ path: '/demo/make/svgDemo',
+ name: 'makeSvgDemo',
+ component: () => import('/@/views/make/svgDemo/index.vue'),
+ meta: {
+ title: 'message.router.makeSvgDemo',
+ isLink: '',
+ isHide: false,
+ isKeepAlive: true,
+ isAffix: false,
+ isIframe: false,
+ roles: ['admin', 'common'],
+ icon: 'fa fa-thumbs-o-up',
+ },
+ },
+ ],
+ },
+ {
+ path: '/demo/params',
+ name: 'paramsIndex',
+ component: () => import('/@/layout/routerView/parent.vue'),
+ redirect: '/params/common',
+ meta: {
+ title: 'message.router.paramsIndex',
+ isLink: '',
+ isHide: false,
+ isKeepAlive: true,
+ isAffix: false,
+ isIframe: false,
+ roles: ['admin'],
+ icon: 'iconfont icon-zhongduancanshu',
+ },
+ children: [
+ {
+ path: '/demo/params/common',
+ name: 'paramsCommon',
+ component: () => import('/@/views/params/common/index.vue'),
+ meta: {
+ title: 'message.router.paramsCommon',
+ isLink: '',
+ isHide: false,
+ isKeepAlive: true,
+ isAffix: false,
+ isIframe: false,
+ roles: ['admin'],
+ icon: 'iconfont icon-putong',
+ },
+ },
+ {
+ path: '/demo/params/common/details',
+ name: 'paramsCommonDetails',
+ component: () => import('/@/views/params/common/details.vue'),
+ meta: {
+ title: 'message.router.paramsCommonDetails',
+ isLink: '',
+ isHide: true,
+ isKeepAlive: true,
+ isAffix: false,
+ isIframe: false,
+ roles: ['admin'],
+ icon: 'ele-Comment',
+ },
+ },
+ {
+ path: '/demo/params/dynamic',
+ name: 'paramsDynamic',
+ component: () => import('/@/views/params/dynamic/index.vue'),
+ meta: {
+ title: 'message.router.paramsDynamic',
+ isLink: '',
+ isHide: false,
+ isKeepAlive: true,
+ isAffix: false,
+ isIframe: false,
+ roles: ['admin'],
+ icon: 'iconfont icon-dongtai',
+ },
+ },
+ /**
+ * tagsViewName 为要设置不同的 "tagsView 名称" 字段
+ * 如若需设置不同 "tagsView 名称",tagsViewName 字段必须要有
+ */
+ {
+ path: '/demo/params/dynamic/details/:t/:id/:tagsViewName',
+ name: 'paramsDynamicDetails',
+ component: () => import('/@/views/params/dynamic/details.vue'),
+ meta: {
+ title: 'message.router.paramsDynamicDetails',
+ isLink: '',
+ isHide: true,
+ isKeepAlive: true,
+ isAffix: false,
+ isIframe: false,
+ roles: ['admin'],
+ icon: 'ele-Lightning',
+ },
+ },
+ ],
+ },
+ {
+ path: '/demo/visualizing',
+ name: 'visualizingIndex',
+ component: () => import('/@/layout/routerView/parent.vue'),
+ redirect: '/visualizing/visualizingLinkDemo1',
+ meta: {
+ title: 'message.router.visualizingIndex',
+ isLink: '',
+ isHide: false,
+ isKeepAlive: true,
+ isAffix: false,
+ isIframe: false,
+ roles: ['admin'],
+ icon: 'ele-ChatLineRound',
+ },
+ children: [
+ {
+ path: '/demo/visualizing/visualizingLinkDemo1',
+ name: 'visualizingLinkDemo1',
+ component: () => import('/@/layout/routerView/link.vue'),
+ meta: {
+ title: 'message.router.visualizingLinkDemo1',
+ isLink: `#/visualizingDemo1`,
+ isHide: false,
+ isKeepAlive: false,
+ isAffix: false,
+ isIframe: false,
+ roles: ['admin'],
+ icon: 'iconfont icon-caozuo-wailian',
+ },
+ },
+ {
+ path: '/demo/visualizing/visualizingLinkDemo2',
+ name: 'visualizingLinkDemo2',
+ component: () => import('/@/layout/routerView/link.vue'),
+ meta: {
+ title: 'message.router.visualizingLinkDemo2',
+ isLink: `#/visualizingDemo2`,
+ isHide: false,
+ isKeepAlive: false,
+ isAffix: false,
+ isIframe: false,
+ roles: ['admin'],
+ icon: 'iconfont icon-caozuo-wailian',
+ },
+ },
+ ],
+ },
+ {
+ path: '/demo/chart',
+ name: 'chartIndex',
+ component: () => import('/@/views/chart/index.vue'),
+ meta: {
+ title: 'message.router.chartIndex',
+ isLink: '',
+ isHide: false,
+ isKeepAlive: true,
+ isAffix: false,
+ isIframe: false,
+ roles: ['admin', 'common'],
+ icon: 'iconfont icon-ico_shuju',
+ },
+ },
+ {
+ path: '/demo/personal',
+ name: 'personal',
+ component: () => import('/@/views/personal/index.vue'),
+ meta: {
+ title: 'message.router.personal',
+ isLink: '',
+ isHide: false,
+ isKeepAlive: true,
+ isAffix: false,
+ isIframe: false,
+ roles: ['admin', 'common'],
+ icon: 'iconfont icon-gerenzhongxin',
+ },
+ },
+ {
+ path: '/demo/tools',
+ name: 'tools',
+ component: () => import('/@/views/tools/index.vue'),
+ meta: {
+ title: 'message.router.tools',
+ isLink: '',
+ isHide: false,
+ isKeepAlive: true,
+ isAffix: false,
+ isIframe: false,
+ roles: ['admin', 'common'],
+ icon: 'iconfont icon-gongju',
+ },
+ },
+ {
+ path: '/demo/link',
+ name: 'layoutLinkView',
+ component: () => import('/@/layout/routerView/link.vue'),
+ meta: {
+ title: 'message.router.layoutLinkView',
+ isLink: 'https://element-plus.gitee.io/#/zh-CN/component/installation',
+ isHide: false,
+ isKeepAlive: false,
+ isAffix: false,
+ isIframe: false,
+ roles: ['admin'],
+ icon: 'iconfont icon-caozuo-wailian',
+ },
+ },
+ {
+ path: '/demo/iframes',
+ name: 'layoutIfameView',
+ component: () => import('/@/layout/routerView/iframes.vue'),
+ meta: {
+ title: 'message.router.layoutIfameView',
+ isLink: 'https://nodejs.org/zh-cn/',
+ isHide: false,
+ isKeepAlive: false,
+ isAffix: false,
+ isIframe: true,
+ roles: ['admin'],
+ icon: 'iconfont icon-neiqianshujuchucun',
+ },
+ },
+ ]
+ }
+]
+
+/**
+ * 定义404、401界面
+ * @link 参考:https://next.router.vuejs.org/zh/guide/essentials/history-mode.html#netlify
+ */
+export const notFoundAndNoPower = [
+ {
+ path: '/:path(.*)*',
+ name: 'notFound',
+ component: () => import('/@/views/error/404.vue'),
+ meta: {
+ title: 'message.staticRoutes.notFound',
+ isHide: true,
+ },
+ },
+ {
+ path: '/401',
+ name: 'noPower',
+ component: () => import('/@/views/error/401.vue'),
+ meta: {
+ title: 'message.staticRoutes.noPower',
+ isHide: true,
+ },
+ },
+];
+
+/**
+ * 定义静态路由(默认路由)
+ * 此路由不要动,前端添加路由的话,请在 `dynamicRoutes 数组` 中添加
+ * @description 前端控制直接改 dynamicRoutes 中的路由,后端控制不需要修改,请求接口路由数据时,会覆盖 dynamicRoutes 第一个顶级 children 的内容(全屏,不包含 layout 中的路由出口)
+ * @returns 返回路由菜单数据
+ */
+export const staticRoutes: Array = [
+ {
+ path: '/login',
+ name: 'login',
+ component: () => import('/@/views/login/index.vue'),
+ meta: {
+ title: '登录',
+ },
+ },
+ /**
+ * 提示:写在这里的为全屏界面,不建议写在这里
+ * 请写在 `dynamicRoutes` 路由数组中
+ */
+ {
+ path: '/visualizingDemo1',
+ name: 'visualizingDemo1',
+ component: () => import('/@/views/visualizing/demo1.vue'),
+ meta: {
+ title: 'message.router.visualizingLinkDemo1',
+ },
+ },
+ {
+ path: '/visualizingDemo2',
+ name: 'visualizingDemo2',
+ component: () => import('/@/views/visualizing/demo2.vue'),
+ meta: {
+ title: 'message.router.visualizingLinkDemo2',
+ },
+ },
+ {
+ path: '/:pathMatch(.*)*',
+ component: () => import('/@/layout/routerView/parent.vue'),
+ meta: {
+ title: '加载中',
+ },
+ }
+];
diff --git a/src/stores/bigUpload.ts b/src/stores/bigUpload.ts
new file mode 100644
index 0000000..5418d6b
--- /dev/null
+++ b/src/stores/bigUpload.ts
@@ -0,0 +1,13 @@
+import { defineStore } from 'pinia';
+import {bigUploadStates} from "/@/stores/interface";
+
+export const bigUpload = defineStore('bigUpload', {
+ state:():bigUploadStates=>({
+ panelShow:false
+ }),
+ actions: {
+ async setPanelShow(bool: boolean) {
+ this.panelShow = bool;
+ }
+ },
+})
diff --git a/src/stores/index.ts b/src/stores/index.ts
new file mode 100644
index 0000000..27c377e
--- /dev/null
+++ b/src/stores/index.ts
@@ -0,0 +1,8 @@
+// https://pinia.vuejs.org/
+import { createPinia } from 'pinia';
+
+// 创建
+const pinia = createPinia();
+
+// 导出
+export default pinia;
diff --git a/src/stores/interface/index.ts b/src/stores/interface/index.ts
new file mode 100644
index 0000000..336b021
--- /dev/null
+++ b/src/stores/interface/index.ts
@@ -0,0 +1,97 @@
+/**
+ * 定义接口来定义对象的类型
+ * `stores` 全部类型定义在这里
+ */
+
+// 用户信息
+export interface UserInfosState {
+ id:number
+ authBtnList: string[];
+ avatar: string;
+ roles: string[];
+ time: number;
+ userName: string;
+ userNickname:string
+}
+export interface UserInfosStates {
+ userInfos: UserInfosState;
+ permissions:string[]
+}
+
+// 路由缓存列表
+export interface KeepAliveNamesState {
+ keepAliveNames: string[];
+ cachedViews: string[];
+}
+
+// 后端返回原始路由(未处理时)
+export interface RequestOldRoutesState {
+ requestOldRoutes: string[];
+}
+
+// TagsView 路由列表
+export interface TagsViewRoutesState {
+ tagsViewRoutes: string[];
+ isTagsViewCurrenFull: Boolean;
+}
+
+// 路由列表
+export interface RoutesListState {
+ routesList: string[];
+ isColumnsMenuHover: Boolean;
+ isColumnsNavHover: Boolean;
+}
+
+// 布局配置
+export interface ThemeConfigState {
+ isDrawer: boolean;
+ primary: string;
+ topBar: string;
+ topBarColor: string;
+ isTopBarColorGradual: boolean;
+ menuBar: string;
+ menuBarColor: string;
+ isMenuBarColorGradual: boolean;
+ columnsMenuBar: string;
+ columnsMenuBarColor: string;
+ isColumnsMenuBarColorGradual: boolean;
+ isCollapse: boolean;
+ isUniqueOpened: boolean;
+ isFixedHeader: boolean;
+ isFixedHeaderChange: boolean;
+ isClassicSplitMenu: boolean;
+ isLockScreen: boolean;
+ lockScreenTime: number;
+ isShowLogo: boolean;
+ isShowLogoChange: boolean;
+ isBreadcrumb: boolean;
+ isTagsview: boolean;
+ isBreadcrumbIcon: boolean;
+ isTagsviewIcon: boolean;
+ isCacheTagsView: boolean;
+ isSortableTagsView: boolean;
+ isShareTagsView: boolean;
+ isFooter: boolean;
+ isGrayscale: boolean;
+ isInvert: boolean;
+ isIsDark: boolean;
+ isWartermark: boolean;
+ wartermarkText: string;
+ tagsStyle: string;
+ animation: string;
+ columnsAsideStyle: string;
+ columnsAsideLayout: string;
+ layout: string;
+ isRequestRoutes: boolean;
+ globalTitle: string;
+ globalViceTitle: string;
+ globalI18n: string;
+ globalComponentSize: string;
+}
+export interface ThemeConfigStates {
+ themeConfig: ThemeConfigState;
+}
+
+export interface bigUploadStates {
+ panelShow : boolean
+}
diff --git a/src/stores/keepAliveNames.ts b/src/stores/keepAliveNames.ts
new file mode 100644
index 0000000..32e0389
--- /dev/null
+++ b/src/stores/keepAliveNames.ts
@@ -0,0 +1,37 @@
+import { defineStore } from 'pinia';
+import { KeepAliveNamesState } from './interface';
+
+/**
+ * 路由缓存列表
+ * @methods setCacheKeepAlive 设置要缓存的路由 names(开启 Tagsview)
+ * @methods addCachedView 添加要缓存的路由 names(关闭 Tagsview)
+ * @methods delCachedView 删除要缓存的路由 names(关闭 Tagsview)
+ * @methods delOthersCachedViews 右键菜单`关闭其它`,删除要缓存的路由 names(关闭 Tagsview)
+ * @methods delAllCachedViews 右键菜单`全部关闭`,删除要缓存的路由 names(关闭 Tagsview)
+ */
+export const useKeepALiveNames = defineStore('keepALiveNames', {
+ state: (): KeepAliveNamesState => ({
+ keepAliveNames: [],
+ cachedViews: [],
+ }),
+ actions: {
+ async setCacheKeepAlive(data: Array) {
+ this.keepAliveNames = data;
+ },
+ async addCachedView(view: any) {
+ if (this.cachedViews.includes(view.name)) return;
+ if (view.meta.isKeepAlive) this.cachedViews.push(view.name);
+ },
+ async delCachedView(view: any) {
+ const index = this.cachedViews.indexOf(view.name);
+ index > -1 && this.cachedViews.splice(index, 1);
+ },
+ async delOthersCachedViews(view: any) {
+ if (view.meta.isKeepAlive) this.cachedViews = [view.name];
+ else this.cachedViews = [];
+ },
+ async delAllCachedViews() {
+ this.cachedViews = [];
+ },
+ },
+});
diff --git a/src/stores/requestOldRoutes.ts b/src/stores/requestOldRoutes.ts
new file mode 100644
index 0000000..be9b5cd
--- /dev/null
+++ b/src/stores/requestOldRoutes.ts
@@ -0,0 +1,17 @@
+import { defineStore } from 'pinia';
+import { RequestOldRoutesState } from './interface';
+
+/**
+ * 后端返回原始路由(未处理时)
+ * @methods setCacheKeepAlive 设置接口原始路由数据
+ */
+export const useRequestOldRoutes = defineStore('requestOldRoutes', {
+ state: (): RequestOldRoutesState => ({
+ requestOldRoutes: [],
+ }),
+ actions: {
+ async setRequestOldRoutes(routes: Array) {
+ this.requestOldRoutes = routes;
+ },
+ },
+});
diff --git a/src/stores/routesList.ts b/src/stores/routesList.ts
new file mode 100644
index 0000000..7dd2b28
--- /dev/null
+++ b/src/stores/routesList.ts
@@ -0,0 +1,27 @@
+import { defineStore } from 'pinia';
+import { RoutesListState } from './interface';
+
+/**
+ * 路由列表
+ * @methods setRoutesList 设置路由数据
+ * @methods setColumnsMenuHover 设置分栏布局菜单鼠标移入 boolean
+ * @methods setColumnsNavHover 设置分栏布局最左侧导航鼠标移入 boolean
+ */
+export const useRoutesList = defineStore('routesList', {
+ state: (): RoutesListState => ({
+ routesList: [],
+ isColumnsMenuHover: false,
+ isColumnsNavHover: false,
+ }),
+ actions: {
+ async setRoutesList(data: Array) {
+ this.routesList = data;
+ },
+ async setColumnsMenuHover(bool: Boolean) {
+ this.isColumnsMenuHover = bool;
+ },
+ async setColumnsNavHover(bool: Boolean) {
+ this.isColumnsNavHover = bool;
+ },
+ },
+});
diff --git a/src/stores/tagsViewRoutes.ts b/src/stores/tagsViewRoutes.ts
new file mode 100644
index 0000000..7a5e6f4
--- /dev/null
+++ b/src/stores/tagsViewRoutes.ts
@@ -0,0 +1,24 @@
+import { defineStore } from 'pinia';
+import { TagsViewRoutesState } from './interface';
+import { Session } from '/@/utils/storage';
+
+/**
+ * TagsView 路由列表
+ * @methods setTagsViewRoutes 设置 TagsView 路由列表
+ * @methods setCurrenFullscreen 设置开启/关闭全屏时的 boolean 状态
+ */
+export const useTagsViewRoutes = defineStore('tagsViewRoutes', {
+ state: (): TagsViewRoutesState => ({
+ tagsViewRoutes: [],
+ isTagsViewCurrenFull: false,
+ }),
+ actions: {
+ async setTagsViewRoutes(data: Array) {
+ this.tagsViewRoutes = data;
+ },
+ setCurrenFullscreen(bool: Boolean) {
+ Session.set('isTagsViewCurrenFull', bool);
+ this.isTagsViewCurrenFull = bool;
+ },
+ },
+});
diff --git a/src/stores/themeConfig.ts b/src/stores/themeConfig.ts
new file mode 100644
index 0000000..2c12fb1
--- /dev/null
+++ b/src/stores/themeConfig.ts
@@ -0,0 +1,146 @@
+import { defineStore } from 'pinia';
+import { ThemeConfigStates, ThemeConfigState } from './interface';
+
+/**
+ * 布局配置
+ * 修复:https://gitee.com/lyt-top/vue-next-admin/issues/I567R1,感谢@lanbao123
+ * 2020.05.28 by lyt 优化。开发时配置不生效问题
+ * 修改配置时:
+ * 1、需要每次都清理 `window.localStorage` 浏览器永久缓存
+ * 2、或者点击布局配置最底部 `一键恢复默认` 按钮即可看到效果
+ */
+export const useThemeConfig = defineStore('themeConfig', {
+ state: (): ThemeConfigStates => ({
+ themeConfig: {
+ // 是否开启布局配置抽屉
+ isDrawer: false,
+
+ /**
+ * 全局主题
+ */
+ // 默认 primary 主题颜色
+ primary: '#409eff',
+ // 是否开启深色模式
+ isIsDark: false,
+
+ /**
+ * 菜单 / 顶栏
+ * 注意:v1.0.17 版本去除设置布局切换,重置主题样式(initSetLayoutChange),
+ * 切换布局需手动设置样式,设置的样式自动同步各布局,
+ * 代码位置:/@/layout/navBars/breadcrumb/setings.vue
+ */
+ // 默认顶栏导航背景颜色
+ topBar: '#ffffff',
+ // 默认顶栏导航字体颜色
+ topBarColor: '#606266',
+ // 是否开启顶栏背景颜色渐变
+ isTopBarColorGradual: false,
+ // 默认菜单导航背景颜色
+ menuBar: '#354E67',
+ // 默认菜单导航字体颜色
+ menuBarColor: '#eaeaea',
+ // 是否开启菜单背景颜色渐变
+ isMenuBarColorGradual: false,
+ // 默认分栏菜单背景颜色
+ columnsMenuBar: '#545c64',
+ // 默认分栏菜单字体颜色
+ columnsMenuBarColor: '#e6e6e6',
+ // 是否开启分栏菜单背景颜色渐变
+ isColumnsMenuBarColorGradual: false,
+
+ /**
+ * 界面设置
+ */
+ // 是否开启菜单水平折叠效果
+ isCollapse: false,
+ // 是否开启菜单手风琴效果
+ isUniqueOpened: false,
+ // 是否开启固定 Header
+ isFixedHeader: false,
+ // 初始化变量,用于更新菜单 el-scrollbar 的高度,请勿删除
+ isFixedHeaderChange: false,
+ // 是否开启经典布局分割菜单(仅经典布局生效)
+ isClassicSplitMenu: false,
+ // 是否开启自动锁屏
+ isLockScreen: false,
+ // 开启自动锁屏倒计时(s/秒)
+ lockScreenTime: 30,
+
+ /**
+ * 界面显示
+ */
+ // 是否开启侧边栏 Logo
+ isShowLogo: true,
+ // 初始化变量,用于 el-scrollbar 的高度更新,请勿删除
+ isShowLogoChange: false,
+ // 是否开启 Breadcrumb,强制经典、横向布局不显示
+ isBreadcrumb: true,
+ // 是否开启 Tagsview
+ isTagsview: true,
+ // 是否开启 Breadcrumb 图标
+ isBreadcrumbIcon: false,
+ // 是否开启 Tagsview 图标
+ isTagsviewIcon: false,
+ // 是否开启 TagsView 缓存
+ isCacheTagsView: false,
+ // 是否开启 TagsView 拖拽
+ isSortableTagsView: true,
+ // 是否开启 TagsView 共用
+ isShareTagsView: false,
+ // 是否开启 Footer 底部版权信息
+ isFooter: false,
+ // 是否开启灰色模式
+ isGrayscale: false,
+ // 是否开启色弱模式
+ isInvert: false,
+ // 是否开启水印
+ isWartermark: false,
+ // 水印文案
+ wartermarkText: 'GFastV3',
+
+ /**
+ * 其它设置
+ */
+ // Tagsview 风格:可选值"",默认 tags-style-five
+ // 定义的值与 `/src/layout/navBars/tagsView/tagsView.vue` 中的 class 同名
+ tagsStyle: 'tags-style-five',
+ // 主页面切换动画:可选值"",默认 slide-right
+ animation: 'slide-right',
+ // 分栏高亮风格:可选值"",默认 columns-round
+ columnsAsideStyle: 'columns-round',
+ // 分栏布局风格:可选值"",默认 columns-horizontal
+ columnsAsideLayout: 'columns-vertical',
+
+ /**
+ * 布局切换
+ * 注意:为了演示,切换布局时,颜色会被还原成默认,代码位置:/@/layout/navBars/breadcrumb/setings.vue
+ * 中的 `initSetLayoutChange(设置布局切换,重置主题样式)` 方法
+ */
+ // 布局切换:可选值"",默认 defaults
+ layout: 'defaults',
+
+ /**
+ * 后端控制路由
+ */
+ // 是否开启后端控制路由
+ isRequestRoutes: true,
+
+ /**
+ * 全局网站标题 / 副标题
+ */
+ // 网站主标题(菜单导航、浏览器当前网页标题)
+ globalTitle: 'gfast3.2后台管理系统',
+ // 网站副标题(登录页顶部文字)
+ globalViceTitle: 'gfast3.2后台管理系统',
+ // 默认初始语言,可选值"",默认 zh-cn
+ globalI18n: 'zh-cn',
+ // 默认全局组件大小,可选值"",默认 'large'
+ globalComponentSize: 'large',
+ },
+ }),
+ actions: {
+ setThemeConfig(data: ThemeConfigState) {
+ this.themeConfig = data;
+ },
+ },
+});
diff --git a/src/stores/userInfo.ts b/src/stores/userInfo.ts
new file mode 100644
index 0000000..aaebd87
--- /dev/null
+++ b/src/stores/userInfo.ts
@@ -0,0 +1,69 @@
+import { defineStore } from 'pinia';
+import Cookies from 'js-cookie';
+import { UserInfosStates } from './interface';
+import { Session } from '/@/utils/storage';
+
+/**
+ * 用户信息
+ * @methods setUserInfos 设置用户信息
+ */
+export const useUserInfo = defineStore('userInfo', {
+ state: (): UserInfosStates => ({
+ userInfos: {
+ id:0,
+ userName: '',
+ userNickname:'',
+ avatar: '',
+ roles: [],
+ time: 0,
+ authBtnList:[],
+ },
+ permissions:[],
+ }),
+ actions: {
+ async setUserInfos() {
+ // 模拟数据,请求接口时,记得删除多余代码及对应依赖的引入
+ const userName = Cookies.get('userName');
+ // 模拟数据
+ let defaultRoles: Array = [];
+ let defaultAuthBtnList: Array = [];
+ // admin 页面权限标识,对应路由 meta.roles,用于控制路由的显示/隐藏
+ let adminRoles: Array = ['admin'];
+ // admin 按钮权限标识
+ let adminAuthBtnList: Array = ['btn.add', 'btn.del', 'btn.edit', 'btn.link'];
+ // test 页面权限标识,对应路由 meta.roles,用于控制路由的显示/隐藏
+ let testRoles: Array = ['common'];
+ // test 按钮权限标识
+ let testAuthBtnList: Array = ['btn.add', 'btn.link'];
+ // 不同用户模拟不同的用户权限
+ if (userName === 'admin') {
+ defaultRoles = adminRoles;
+ defaultAuthBtnList = adminAuthBtnList;
+ } else {
+ defaultRoles = testRoles;
+ defaultAuthBtnList = testAuthBtnList;
+ }
+ // 用户信息模拟数据
+ const userInfos = {
+ id:0,
+ userName: userName,
+ userNickname: "",
+ avatar:
+ userName === 'admin'
+ ? 'https://ss0.bdstatic.com/70cFvHSh_Q1YnxGkpoWK1HF6hhy/it/u=1813762643,1914315241&fm=26&gp=0.jpg'
+ : 'https://ss1.bdstatic.com/70cFuXSh_Q1YnxGkpoWK1HF6hhy/it/u=317673774,2961727727&fm=26&gp=0.jpg',
+ time: new Date().getTime(),
+ roles: defaultRoles,
+ authBtnList: defaultAuthBtnList,
+ };
+ if (Session.get('userInfo')) {
+ this.userInfos = Session.get('userInfo');
+ } else {
+ this.userInfos = userInfos;
+ }
+ },
+ async setPermissions() {
+ this.permissions = Session.get('permissions')
+ },
+ },
+});
diff --git a/src/theme/app.scss b/src/theme/app.scss
new file mode 100644
index 0000000..0951c92
--- /dev/null
+++ b/src/theme/app.scss
@@ -0,0 +1,286 @@
+/* 初始化样式
+------------------------------- */
+* {
+ margin: 0;
+ padding: 0;
+ box-sizing: border-box;
+}
+
+:root {
+ --next-color-white: #ffffff;
+ --next-bg-main-color: #f8f8f8;
+ --next-bg-color: #f5f5ff;
+ --next-border-color-light: #f1f2f3;
+ --next-color-primary-lighter: #ecf5ff;
+ --next-color-success-lighter: #f0f9eb;
+ --next-color-warning-lighter: #fdf6ec;
+ --next-color-danger-lighter: #fef0f0;
+ --next-color-dark-hover: #0000001a;
+ --next-color-menu-hover: rgba(0, 0, 0, 0.2);
+ --next-color-user-hover: rgba(0, 0, 0, 0.04);
+ --next-color-seting-main: #e9eef3;
+ --next-color-seting-aside: #d3dce6;
+ --next-color-seting-header: #b3c0d1;
+}
+
+html,
+body,
+#app {
+ margin: 0;
+ padding: 0;
+ width: 100%;
+ height: 100%;
+ font-family: Helvetica Neue, Helvetica, PingFang SC, Hiragino Sans GB, Microsoft YaHei, SimSun, sans-serif;
+ font-weight: 400;
+ -webkit-font-smoothing: antialiased;
+ -webkit-tap-highlight-color: transparent;
+ background-color: var(--next-bg-main-color);
+ font-size: 14px;
+ overflow: hidden;
+ position: relative;
+}
+
+/* 主布局样式
+------------------------------- */
+.layout-container {
+ width: 100%;
+ height: 100%;
+ .layout-aside {
+ background: var(--next-bg-menuBar);
+ box-shadow: 2px 0 6px rgb(0 21 41 / 1%);
+ height: inherit;
+ position: relative;
+ z-index: 1;
+ display: flex;
+ flex-direction: column;
+ overflow-x: hidden !important;
+ .el-scrollbar__view {
+ overflow: hidden;
+ }
+ }
+ .layout-header {
+ padding: 0 !important;
+ }
+ .layout-main {
+ padding: 0 !important;
+ overflow: hidden;
+ width: 100%;
+ background-color: var(--next-bg-main-color);
+ }
+ .el-scrollbar {
+ width: 100%;
+ }
+ // 此字段多次用到,建议不删除,如需修改,请重写覆盖样式
+ .layout-view-bg-white {
+ background: var(--el-color-white);
+ width: 100%;
+ height: 100%;
+ border-radius: 4px;
+ border: 1px solid var(--el-border-color-light, #ebeef5);
+ }
+ .layout-el-aside-br-color {
+ border-right: 1px solid var(--el-border-color-light, #ebeef5);
+ }
+ // pc端左侧导航样式
+ .layout-aside-pc-220 {
+ width: 220px !important;
+ transition: width 0.3s ease;
+ }
+ .layout-aside-pc-64 {
+ width: 64px !important;
+ transition: width 0.3s ease;
+ }
+ .layout-aside-pc-1 {
+ width: 1px !important;
+ transition: width 0.3s ease;
+ }
+ // 手机端左侧导航样式
+ .layout-aside-mobile {
+ position: fixed;
+ top: 0;
+ left: -220px;
+ width: 220px;
+ z-index: 9999999;
+ }
+ .layout-aside-mobile-close {
+ left: -220px;
+ transition: all 0.3s cubic-bezier(0.39, 0.58, 0.57, 1);
+ }
+ .layout-aside-mobile-open {
+ left: 0;
+ transition: all 0.3s cubic-bezier(0.22, 0.61, 0.36, 1);
+ }
+ .layout-aside-mobile-mode {
+ position: fixed;
+ top: 0;
+ right: 0;
+ bottom: 0;
+ left: 0;
+ height: 100%;
+ background-color: rgba(0, 0, 0, 0.5);
+ z-index: 9999998;
+ animation: error-img 0.3s;
+ }
+ .layout-scrollbar {
+ @extend .el-scrollbar;
+ padding: 15px;
+ }
+ .layout-mian-height-50 {
+ height: calc(100vh - 50px);
+ }
+ .layout-columns-warp {
+ flex: 1;
+ display: flex;
+ overflow: hidden;
+ }
+ .layout-hide {
+ display: none;
+ }
+}
+
+/* element plus 全局样式
+------------------------------- */
+.layout-breadcrumb-seting {
+ .el-divider {
+ background-color: rgb(230, 230, 230);
+ }
+}
+
+/* nprogress 进度条跟随主题颜色
+------------------------------- */
+#nprogress {
+ .bar {
+ background: var(--el-color-primary) !important;
+ z-index: 9999999 !important;
+ }
+}
+
+/* flex 弹性布局
+------------------------------- */
+.flex {
+ display: flex;
+}
+.flex-auto {
+ flex: 1;
+ overflow: hidden;
+}
+.flex-center {
+ @extend .flex;
+ flex-direction: column;
+ width: 100%;
+ overflow: hidden;
+}
+.flex-margin {
+ margin: auto;
+}
+.flex-warp {
+ display: flex;
+ flex-wrap: wrap;
+ align-content: flex-start;
+ margin: 0 -5px;
+ .flex-warp-item {
+ padding: 5px;
+ .flex-warp-item-box {
+ width: 100%;
+ height: 100%;
+ }
+ }
+}
+
+/* cursor 鼠标形状
+------------------------------- */
+// 默认
+.cursor-default {
+ cursor: default !important;
+}
+// 帮助
+.cursor-help {
+ cursor: help !important;
+}
+// 手指
+.cursor-pointer {
+ cursor: pointer !important;
+}
+// 移动
+.cursor-move {
+ cursor: move !important;
+}
+
+/* 宽高 100%
+------------------------------- */
+.w100 {
+ width: 100% !important;
+}
+.h100 {
+ height: 100% !important;
+}
+.vh100 {
+ height: 100vh !important;
+}
+.max100vh {
+ max-height: 100vh !important;
+}
+.min100vh {
+ min-height: 100vh !important;
+}
+
+/* 颜色值
+------------------------------- */
+.color-primary {
+ color: var(--el-color-primary);
+}
+.color-success {
+ color: var(--el-color-success);
+}
+.color-warning {
+ color: var(--el-color-warning);
+}
+.color-danger {
+ color: var(--el-color-danger);
+}
+.color-info {
+ color: var(--el-color-info);
+}
+
+/* 字体大小全局样式
+------------------------------- */
+@for $i from 10 through 32 {
+ .font#{$i} {
+ font-size: #{$i}px !important;
+ }
+}
+
+/* 外边距、内边距全局样式
+------------------------------- */
+@for $i from 1 through 35 {
+ .mt#{$i} {
+ margin-top: #{$i}px !important;
+ }
+ .mr#{$i} {
+ margin-right: #{$i}px !important;
+ }
+ .mb#{$i} {
+ margin-bottom: #{$i}px !important;
+ }
+ .ml#{$i} {
+ margin-left: #{$i}px !important;
+ }
+ .pt#{$i} {
+ padding-top: #{$i}px !important;
+ }
+ .pr#{$i} {
+ padding-right: #{$i}px !important;
+ }
+ .pb#{$i} {
+ padding-bottom: #{$i}px !important;
+ }
+ .pl#{$i} {
+ padding-left: #{$i}px !important;
+ }
+}
+
+.link-type, .link-type:focus {
+ color: #337ab7;
+ cursor: pointer;
+ text-decoration: none;
+}
diff --git a/src/theme/common/transition.scss b/src/theme/common/transition.scss
new file mode 100644
index 0000000..a03a7bb
--- /dev/null
+++ b/src/theme/common/transition.scss
@@ -0,0 +1,94 @@
+/* 页面切换动画
+------------------------------- */
+.slide-right-enter-active,
+.slide-right-leave-active,
+.slide-left-enter-active,
+.slide-left-leave-active {
+ will-change: transform;
+ transition: all 0.3s ease;
+}
+// slide-right
+.slide-right-enter-from {
+ opacity: 0;
+ transform: translateX(-20px);
+}
+.slide-right-leave-to {
+ opacity: 0;
+ transform: translateX(20px);
+}
+// slide-left
+.slide-left-enter-from {
+ @extend .slide-right-leave-to;
+}
+.slide-left-leave-to {
+ @extend .slide-right-enter-from;
+}
+// opacitys
+.opacitys-enter-active,
+.opacitys-leave-active {
+ will-change: transform;
+ transition: all 0.3s ease;
+}
+.opacitys-enter-from,
+.opacitys-leave-to {
+ opacity: 0;
+}
+
+/* Breadcrumb 面包屑过渡动画
+------------------------------- */
+.breadcrumb-enter-active,
+.breadcrumb-leave-active {
+ transition: all 0.5s ease;
+}
+.breadcrumb-enter-from,
+.breadcrumb-leave-active {
+ opacity: 0;
+ transform: translateX(20px);
+}
+.breadcrumb-leave-active {
+ position: absolute;
+ z-index: -1;
+}
+
+/* logo 过渡动画
+------------------------------- */
+@keyframes logoAnimation {
+ 0% {
+ transform: scale(0);
+ }
+ 80% {
+ transform: scale(1.2);
+ }
+ 100% {
+ transform: scale(1);
+ }
+}
+
+/* 404、401 过渡动画
+------------------------------- */
+@keyframes error-num {
+ 0% {
+ transform: translateY(60px);
+ opacity: 0;
+ }
+ 100% {
+ transform: translateY(0);
+ opacity: 1;
+ }
+}
+@keyframes error-img {
+ 0% {
+ opacity: 0;
+ }
+ 100% {
+ opacity: 1;
+ }
+}
+@keyframes error-img-two {
+ 0% {
+ opacity: 1;
+ }
+ 100% {
+ opacity: 0;
+ }
+}
diff --git a/src/theme/dark.scss b/src/theme/dark.scss
new file mode 100644
index 0000000..593b757
--- /dev/null
+++ b/src/theme/dark.scss
@@ -0,0 +1,245 @@
+/* 深色模式样式
+------------------------------- */
+[data-theme='dark'] {
+ // 变量(自定义时,只需修改这里的值)
+ --next-bg-main: #1f1f1f;
+ --next-color-white: #ffffff;
+ --next-color-disabled: #191919;
+ --next-color-bar: #dadada;
+ --next-color-primary: #303030;
+ --next-border-color: #424242;
+ --next-border-black: #333333;
+ --next-border-columns: #2a2a2a;
+ --next-color-seting: #505050;
+ --next-text-color-regular: #9b9da1;
+ --next-text-color-placeholder: #7a7a7a;
+ --next-color-hover: #3c3c3c;
+ --next-color-hover-rgba: rgba(0, 0, 0, 0.3);
+
+ // root
+ --next-bg-main-color: var(--next-bg-main) !important;
+ --next-bg-topBar: var(--next-color-disabled) !important;
+ --next-bg-topBarColor: var(--next-color-bar) !important;
+ --next-bg-menuBar: var(--next-color-disabled) !important;
+ --next-bg-menuBarColor: var(--next-color-bar) !important;
+ --next-bg-columnsMenuBar: var(--next-color-disabled) !important;
+ --next-bg-columnsMenuBarColor: var(--next-color-bar) !important;
+ --next-border-color-light: var(--next-border-black) !important;
+ --next-color-primary-lighter: var(--next-color-primary) !important;
+ --next-color-success-lighter: var(--next-color-primary) !important;
+ --next-color-warning-lighter: var(--next-color-primary) !important;
+ --next-color-danger-lighter: var(--next-color-primary) !important;
+ --next-bg-color: var(--next-color-primary) !important;
+ --next-color-dark-hover: var(--next-color-hover) !important;
+ --next-color-menu-hover: var(--next-color-hover-rgba) !important;
+ --next-color-user-hover: var(--next-color-hover-rgba) !important;
+ --next-color-seting-main: var(--next-color-seting) !important;
+ --next-color-seting-aside: var(--next-color-hover) !important;
+ --next-color-seting-header: var(--next-color-primary) !important;
+
+ // element plus
+ --el-color-white: var(--next-color-disabled) !important;
+ --el-text-color-primary: var(--next-color-bar) !important;
+ --el-border-color: var(--next-border-black) !important;
+ --el-border-color-light: var(--next-border-black) !important;
+ --el-border-color-lighter: var(--next-border-black) !important;
+ --el-border-color-extra-light: var(--el-color-primary-light-8) !important;
+ --el-text-color-regular: var(--next-text-color-regular) !important;
+ --el-bg-color: var(--next-color-disabled) !important;
+ --el-color-primary-light-9: var(--next-color-hover) !important;
+ --el-text-color-disabled: var(--next-text-color-placeholder) !important;
+ --el-text-color-disabled-base: var(--el-color-primary) !important;
+ --el-text-color-placeholder: var(--next-text-color-placeholder) !important;
+ --el-disabled-bg-color: var(--next-color-disabled) !important;
+ --el-fill-base: var(--next-color-white) !important;
+ --el-fill-colo: var(--next-color-hover-rgba) !important;
+ --el-fill-color: var(--next-color-hover-rgba) !important;
+ --el-fill-color-blank: var(--next-color-disabled) !important;
+ --el-fill-color-light: var(--next-color-hover-rgba) !important;
+ --el-bg-color-overlay: var(--el-color-primary-light-9) !important;
+ --el-mask-color: rgb(42 42 42 / 80%);
+ --el-color-success-light-9: #1c2518;
+ --el-color-warning-light-9: #292218;
+ --el-color-danger-light-9: #2b1d1d;
+ --el-color-info-light-9: #202121;
+ --el-color-primary-light-8: #1d3043;
+ --el-color-success-light-8: #25371c;
+ --el-color-warning-light-8: #3e301c;
+ --el-color-info-light-8: #2d2d2f;
+ --el-color-danger-light-8: #412626;
+
+ // button
+ .el-button {
+ &:hover {
+ border-color: var(--next-border-color) !important;
+ }
+ }
+ .el-button--primary,
+ .el-button--info,
+ .el-button--danger,
+ .el-button--success,
+ .el-button--warning {
+ --el-button-text-color: var(--next-color-white) !important;
+ --el-button-hover-text-color: var(--next-color-white) !important;
+ --el-button-disabled-text-color: var(--next-color-white) !important;
+ &:hover {
+ border-color: var(--el-button-hover-border-color, var(--el-button-hover-bg-color)) !important;
+ }
+ }
+
+ // drawer
+ .el-divider__text {
+ background-color: var(--el-color-white) !important;
+ }
+ .el-drawer {
+ border-left: 1px solid var(--next-border-color-light) !important;
+ }
+
+ // tabs
+ .el-tabs--border-card {
+ background-color: var(--el-color-white) !important;
+ }
+ .el-tabs--border-card > .el-tabs__header .el-tabs__item.is-active {
+ background: var(--next-color-primary-lighter);
+ }
+
+ // alert / notice-bar
+ .home-card-item {
+ border: 1px solid var(--next-border-color-light) !important;
+ }
+ .el-alert,
+ .notice-bar {
+ border: 1px solid var(--next-border-color) !important;
+ background-color: var(--next-color-disabled) !important;
+ }
+
+ // menu
+ .layout-aside {
+ border-right: 1px solid var(--next-border-color-light) !important;
+ }
+
+ // colorPicker
+ .el-color-picker__mask {
+ background: unset !important;
+ }
+ .el-color-picker__trigger {
+ border: 1px solid var(--next-border-color-light) !important;
+ }
+
+ // popper / dropdown
+ .el-popper {
+ border: 1px solid var(--next-border-color) !important;
+ color: var(--el-text-color-primary) !important;
+ .el-popper__arrow:before {
+ background: var(--el-color-white) !important;
+ border: 1px solid var(--next-border-color);
+ }
+ a {
+ color: var(--el-text-color-primary) !important;
+ }
+ }
+ .el-popper,
+ .el-dropdown-menu {
+ background: var(--el-color-white) !important;
+ }
+ .el-dropdown-menu__item:hover:not(.is-disabled) {
+ background: var(--el-bg-color) !important;
+ }
+ .el-dropdown-menu__item.is-disabled {
+ font-weight: 700 !important;
+ }
+
+ // input
+ .el-input-group__append,
+ .el-input-group__prepend {
+ border: var(--el-input-border) !important;
+ border-right: none !important;
+ background: var(--next-color-disabled) !important;
+ border-left: 0 !important;
+ }
+ .el-input-number__decrease,
+ .el-input-number__increase {
+ background: var(--next-color-disabled) !important;
+ }
+
+ // tag
+ .el-select .el-select__tags .el-tag {
+ background-color: var(--next-bg-color) !important;
+ }
+
+ // pagination
+ .el-pagination.is-background .el-pager li:not(.disabled).active {
+ color: var(--next-color-white) !important;
+ }
+ .el-pagination.is-background .btn-next,
+ .el-pagination.is-background .btn-prev,
+ .el-pagination.is-background .el-pager li {
+ background-color: var(--next-bg-color);
+ }
+
+ // radio
+ .el-radio-button:not(.is-active) .el-radio-button__inner {
+ border: 1px solid var(--next-border-color-light) !important;
+ border-left: 0 !important;
+ }
+ .el-radio-button.is-active .el-radio-button__inner {
+ color: var(--next-color-white) !important;
+ }
+
+ // countup
+ .countup-card-item-flex {
+ color: var(--el-text-color-primary) !important;
+ }
+
+ // editor
+ .editor-container {
+ .w-e-toolbar {
+ background: var(--el-color-white) !important;
+ border: 1px solid var(--next-border-color-light) !important;
+ .w-e-menu:hover {
+ background: var(--next-color-user-hover) !important;
+ i {
+ color: var(--el-text-color-primary) !important;
+ }
+ }
+ }
+ .w-e-text-container {
+ border: 1px solid var(--next-border-color-light) !important;
+ border-top: none !important;
+ .w-e-text {
+ background: var(--el-color-white) !important;
+ }
+ }
+ }
+
+ // date-picker
+ .el-picker-panel {
+ background: var(--el-color-white) !important;
+ }
+
+ // dialog
+ .el-dialog {
+ border: 1px solid var(--el-border-color-lighter);
+ .el-dialog__header {
+ color: var(--el-text-color-primary) !important;
+ }
+ }
+
+ // columns
+ .layout-columns-aside ul .layout-columns-active {
+ color: var(--next-color-white) !important;
+ }
+ .layout-columns-aside {
+ border-right: 1px solid var(--next-border-columns);
+ }
+
+ // tagsView
+ .tags-style-one {
+ .is-active {
+ color: var(--el-text-color-primary) !important;
+ }
+ .layout-navbars-tagsview-ul-li:hover {
+ border-color: var(--el-border-color-lighter) !important;
+ }
+ }
+}
diff --git a/src/theme/element.scss b/src/theme/element.scss
new file mode 100644
index 0000000..17c36d4
--- /dev/null
+++ b/src/theme/element.scss
@@ -0,0 +1,269 @@
+@use 'mixins/index.scss' as *;
+
+/* Button 按钮
+------------------------------- */
+// 第三方字体图标大小
+.el-button i.el-icon,
+.el-button i.iconfont,
+.el-button i.fa,
+.el-button--default i.iconfont,
+.el-button--default i.fa {
+ font-size: 14px !important;
+ margin-right: 5px;
+}
+.el-button--small i.iconfont,
+.el-button--small i.fa {
+ font-size: 12px !important;
+ margin-right: 5px;
+}
+
+// 菜单搜索
+.el-autocomplete-suggestion__wrap {
+ max-height: 280px !important;
+}
+
+/* Alert 警告
+------------------------------- */
+.el-alert {
+ border: 1px solid;
+}
+.el-alert__title {
+ word-break: break-all;
+}
+
+/* Message 消息提示
+------------------------------- */
+.el-message {
+ min-width: unset !important;
+ padding: 15px !important;
+ box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.02);
+}
+
+/* NavMenu 导航菜单
+------------------------------- */
+// 鼠标 hover 时颜色
+.el-menu-hover-bg-color {
+ background-color: var(--next-color-menu-hover) !important;
+}
+// 默认样式修改
+.el-menu {
+ border-right: none !important;
+ width: 220px;
+}
+.el-menu-item {
+ height: 56px !important;
+ line-height: 56px !important;
+}
+.el-menu-item,
+.el-sub-menu__title {
+ color: var(--next-bg-menuBarColor);
+}
+// 修复点击左侧菜单折叠再展开时,宽度不跟随问题
+.el-menu--collapse {
+ width: 64px !important;
+}
+// 外部链接时
+.el-menu-item a,
+.el-menu-item a:hover,
+.el-menu-item i,
+.el-sub-menu__title i {
+ color: inherit;
+ text-decoration: none;
+}
+// 第三方图标字体间距/大小设置
+.el-menu-item .iconfont,
+.el-sub-menu .iconfont,
+.el-menu-item .fa,
+.el-sub-menu .fa {
+ @include generalIcon;
+}
+// 水平菜单、横向菜单高亮 背景色,鼠标 hover 时,有子级菜单的背景色
+.el-menu-item.is-active,
+.el-sub-menu.is-active .el-sub-menu__title,
+.el-sub-menu:not(.is-opened):hover .el-sub-menu__title {
+ @extend .el-menu-hover-bg-color;
+}
+.el-sub-menu.is-active.is-opened .el-sub-menu__title {
+ background-color: unset !important;
+}
+// 子级菜单背景颜色
+// .el-menu--inline {
+// background: var(--next-bg-menuBar-light-1);
+// }
+// 水平菜单、横向菜单折叠 a 标签
+.el-popper.is-dark a {
+ color: var(--el-color-white) !important;
+ text-decoration: none;
+}
+// 水平菜单、横向菜单折叠背景色
+.el-popper.is-pure.is-light {
+ // 水平菜单
+ .el-menu--vertical {
+ background: var(--next-bg-menuBar);
+ .el-sub-menu.is-active .el-sub-menu__title {
+ color: var(--el-menu-active-color);
+ }
+ .el-popper.is-pure.is-light {
+ .el-menu--vertical {
+ .el-sub-menu .el-sub-menu__title {
+ background-color: unset !important;
+ color: var(--next-bg-menuBarColor);
+ }
+ .el-sub-menu.is-active .el-sub-menu__title {
+ color: var(--el-menu-active-color);
+ }
+ }
+ }
+ }
+ // 横向菜单
+ .el-menu--horizontal {
+ background: var(--next-bg-topBar);
+ .el-menu-item,
+ .el-sub-menu {
+ height: 50px !important;
+ line-height: 50px !important;
+ color: var(--next-bg-topBarColor);
+ .el-sub-menu__title {
+ height: 50px !important;
+ line-height: 50px !important;
+ color: var(--next-bg-topBarColor);
+ }
+ .el-popper.is-pure.is-light {
+ .el-menu--horizontal {
+ .el-sub-menu .el-sub-menu__title {
+ background-color: unset !important;
+ color: var(--next-bg-topBarColor);
+ }
+ .el-sub-menu.is-active .el-sub-menu__title {
+ color: var(--el-menu-active-color);
+ }
+ }
+ }
+ }
+ .el-menu-item.is-active,
+ .el-sub-menu.is-active .el-sub-menu__title {
+ color: var(--el-menu-active-color);
+ }
+ }
+}
+// 横向菜单(经典、横向)布局
+.el-menu.el-menu--horizontal {
+ border-bottom: none !important;
+ width: 100% !important;
+ .el-menu-item,
+ .el-sub-menu__title {
+ height: 50px !important;
+ color: var(--next-bg-topBarColor);
+ }
+ .el-menu-item:not(.is-active):hover,
+ .el-sub-menu:not(.is-active):hover .el-sub-menu__title {
+ color: var(--next-bg-topBarColor);
+ }
+}
+
+/* Tabs 标签页
+------------------------------- */
+.el-tabs__nav-wrap::after {
+ height: 1px !important;
+}
+
+/* Dropdown 下拉菜单
+------------------------------- */
+.el-dropdown-menu {
+ list-style: none !important; /*修复 Dropdown 下拉菜单样式问题 2022.03.04*/
+}
+.el-dropdown-menu .el-dropdown-menu__item {
+ white-space: nowrap;
+ &:not(.is-disabled):hover {
+ background-color: var(--el-dropdown-menuItem-hover-fill);
+ color: var(--el-dropdown-menuItem-hover-color);
+ }
+}
+
+/* Steps 步骤条
+------------------------------- */
+.el-step__icon-inner {
+ font-size: 30px !important;
+ font-weight: 400 !important;
+}
+.el-step__title {
+ font-size: 14px;
+}
+
+/* Dialog 对话框
+------------------------------- */
+.el-overlay {
+ overflow: hidden;
+ .el-overlay-dialog {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ position: unset !important;
+ width: 100%;
+ height: 100%;
+ .el-dialog {
+ margin: 0 auto !important;
+ position: absolute;
+ .el-dialog__body {
+ padding: 20px !important;
+ }
+ }
+ }
+}
+.el-dialog__body {
+ max-height: calc(90vh - 111px) !important;
+ overflow-y: auto;
+ overflow-x: hidden;
+}
+
+/* Card 卡片
+------------------------------- */
+.el-card__header {
+ padding: 15px 20px;
+}
+
+/* Table 表格 element plus 2.2.0 版本
+------------------------------- */
+.el-table {
+ .el-button.is-text {
+ padding: 0;
+ }
+}
+
+/* scrollbar
+------------------------------- */
+.el-scrollbar__bar {
+ z-index: 4;
+}
+.el-scrollbar__wrap {
+ max-height: 100%; /*防止页面切换时,滚动条高度不变的问题(滚动条高度非滚动条滚动高度)*/
+}
+.el-select-dropdown .el-scrollbar__wrap {
+ overflow-x: scroll !important;
+}
+.el-select-dropdown__wrap {
+ max-height: 274px !important; /*修复Select 选择器高度问题*/
+}
+.el-cascader-menu__wrap.el-scrollbar__wrap {
+ height: 204px !important; /*修复Cascader 级联选择器高度问题*/
+}
+
+/* Drawer 抽屉
+------------------------------- */
+.el-drawer {
+ --el-drawer-padding-primary: unset !important;
+ .el-drawer__header {
+ padding: 0 15px !important;
+ height: 50px;
+ display: flex;
+ align-items: center;
+ margin-bottom: 0 !important;
+ border-bottom: 1px solid var(--el-border-color);
+ color: var(--el-text-color-primary);
+ }
+ .el-drawer__body {
+ width: 100%;
+ height: 100%;
+ overflow: auto;
+ }
+}
diff --git a/src/theme/iconSelector.scss b/src/theme/iconSelector.scss
new file mode 100644
index 0000000..970201e
--- /dev/null
+++ b/src/theme/iconSelector.scss
@@ -0,0 +1,70 @@
+/* Popover 弹出框(图标选择器)
+------------------------------- */
+.icon-selector-popper {
+ padding: 0 !important;
+ .icon-selector-warp {
+ height: 260px;
+ overflow: hidden;
+ .icon-selector-warp-title {
+ height: 40px;
+ line-height: 40px;
+ padding: 0 15px;
+ .icon-selector-warp-title-tab {
+ span {
+ cursor: pointer;
+ &:hover {
+ color: var(--el-color-primary);
+ text-decoration: underline;
+ }
+ }
+ .span-active {
+ color: var(--el-color-primary);
+ text-decoration: underline;
+ }
+ }
+ }
+ .icon-selector-warp-row {
+ height: 230px;
+ overflow: hidden;
+ border-top: 1px solid var(--el-border-color);
+ .el-row {
+ padding: 15px;
+ }
+ .el-scrollbar__bar.is-horizontal {
+ display: none;
+ }
+ .icon-selector-warp-item {
+ display: flex;
+ border: 1px solid var(--el-border-color);
+ padding: 5px;
+ border-radius: 5px;
+ margin-bottom: 10px;
+ .icon-selector-warp-item-value {
+ i {
+ font-size: 20px;
+ color: var(--el-text-color-regular);
+ }
+ }
+ &:hover {
+ cursor: pointer;
+ background-color: var(--el-color-primary-light-9);
+ border: 1px solid var(--el-color-primary-light-5);
+ .icon-selector-warp-item-value {
+ i {
+ color: var(--el-color-primary);
+ }
+ }
+ }
+ }
+ .icon-selector-active {
+ background-color: var(--el-color-primary-light-9);
+ border: 1px solid var(--el-color-primary-light-5);
+ .icon-selector-warp-item-value {
+ i {
+ color: var(--el-color-primary);
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/src/theme/index.scss b/src/theme/index.scss
new file mode 100644
index 0000000..2dd75b1
--- /dev/null
+++ b/src/theme/index.scss
@@ -0,0 +1,8 @@
+@use './app.scss' as *;
+@use 'common/transition.scss' as *;
+@use './other.scss' as *;
+@use './element.scss' as *;
+@use './iconSelector.scss' as *;
+@use './media/media.scss' as *;
+@use './waves.scss' as *;
+@use './dark.scss' as *;
diff --git a/src/theme/loading.scss b/src/theme/loading.scss
new file mode 100644
index 0000000..c28c7b9
--- /dev/null
+++ b/src/theme/loading.scss
@@ -0,0 +1,51 @@
+.loading-next {
+ width: 100%;
+ height: 100%;
+}
+.loading-next .loading-next-box {
+ position: absolute;
+ top: 50%;
+ left: 50%;
+ transform: translate(-50%, -50%);
+}
+.loading-next .loading-next-box-warp {
+ width: 80px;
+ height: 80px;
+}
+.loading-next .loading-next-box-warp .loading-next-box-item {
+ width: 33.333333%;
+ height: 33.333333%;
+ background: var(--el-color-primary);
+ float: left;
+ animation: loading-next-animation 1.2s infinite ease;
+ border-radius: 1px;
+}
+.loading-next .loading-next-box-warp .loading-next-box-item:nth-child(7) {
+ animation-delay: 0s;
+}
+.loading-next .loading-next-box-warp .loading-next-box-item:nth-child(4),
+.loading-next .loading-next-box-warp .loading-next-box-item:nth-child(8) {
+ animation-delay: 0.1s;
+}
+.loading-next .loading-next-box-warp .loading-next-box-item:nth-child(1),
+.loading-next .loading-next-box-warp .loading-next-box-item:nth-child(5),
+.loading-next .loading-next-box-warp .loading-next-box-item:nth-child(9) {
+ animation-delay: 0.2s;
+}
+.loading-next .loading-next-box-warp .loading-next-box-item:nth-child(2),
+.loading-next .loading-next-box-warp .loading-next-box-item:nth-child(6) {
+ animation-delay: 0.3s;
+}
+.loading-next .loading-next-box-warp .loading-next-box-item:nth-child(3) {
+ animation-delay: 0.4s;
+}
+@keyframes loading-next-animation {
+ 0%,
+ 70%,
+ 100% {
+ transform: scale3D(1, 1, 1);
+ }
+ 35% {
+ transform: scale3D(0, 0, 1);
+ }
+}
diff --git a/src/theme/media/chart.scss b/src/theme/media/chart.scss
new file mode 100644
index 0000000..0d04443
--- /dev/null
+++ b/src/theme/media/chart.scss
@@ -0,0 +1,94 @@
+@use './index.scss' as *;
+
+/* 页面宽度小于768px
+------------------------------- */
+@media screen and (max-width: $sm) {
+ .big-data-down-left {
+ width: 100% !important;
+ flex-direction: unset !important;
+ flex-wrap: wrap;
+ .flex-warp-item {
+ min-height: 196.24px;
+ padding: 0 7.5px 15px 15px !important;
+ .flex-warp-item-box {
+ border: none !important;
+ border-bottom: 1px solid #ebeef5 !important;
+ }
+ }
+ }
+ .big-data-down-center {
+ width: 100% !important;
+ .big-data-down-center-one,
+ .big-data-down-center-two {
+ min-height: 196.24px;
+ padding-left: 15px !important;
+ .big-data-down-center-one-content {
+ border: none !important;
+ border-bottom: 1px solid #ebeef5 !important;
+ }
+ .flex-warp-item-box {
+ @extend .big-data-down-center-one-content;
+ }
+ }
+ }
+ .big-data-down-right {
+ .flex-warp-item {
+ .flex-warp-item-box {
+ border: none !important;
+ border-bottom: 1px solid #ebeef5 !important;
+ }
+ &:nth-of-type(2) {
+ padding-left: 15px !important;
+ }
+ &:last-of-type {
+ .flex-warp-item-box {
+ border: none !important;
+ }
+ }
+ }
+ }
+}
+
+/* 页面宽度大于768px小于1200px
+------------------------------- */
+@media screen and (min-width: $sm) and (max-width: $lg) {
+ .chart-warp-bottom {
+ .big-data-down-left {
+ width: 50% !important;
+ }
+ .big-data-down-center {
+ width: 50% !important;
+ }
+ .big-data-down-right {
+ .flex-warp-item {
+ width: 50% !important;
+ &:nth-of-type(2) {
+ padding-left: 7.5px !important;
+ }
+ }
+ }
+ }
+}
+
+/* 页面宽度小于1200px
+------------------------------- */
+@media screen and (max-width: $lg) {
+ .chart-warp-top {
+ .up-left {
+ display: none;
+ }
+ }
+ .chart-warp-bottom {
+ overflow-y: auto !important;
+ flex-wrap: wrap;
+ .big-data-down-right {
+ width: 100% !important;
+ flex-direction: unset !important;
+ flex-wrap: wrap;
+ .flex-warp-item {
+ min-height: 196.24px;
+ padding: 0 7.5px 15px 15px !important;
+ }
+ }
+ }
+}
diff --git a/src/theme/media/cityLinkage.scss b/src/theme/media/cityLinkage.scss
new file mode 100644
index 0000000..950e009
--- /dev/null
+++ b/src/theme/media/cityLinkage.scss
@@ -0,0 +1,10 @@
+@use './index.scss' as *;
+
+/* 页面宽度小于576px
+------------------------------- */
+@media screen and (max-width: $xs) {
+ .el-cascader__dropdown.el-popper {
+ overflow: auto;
+ max-width: 100%;
+ }
+}
diff --git a/src/theme/media/date.scss b/src/theme/media/date.scss
new file mode 100644
index 0000000..785667a
--- /dev/null
+++ b/src/theme/media/date.scss
@@ -0,0 +1,25 @@
+@use './index.scss' as *;
+
+/* 页面宽度小于768px
+------------------------------- */
+@media screen and (max-width: $sm) {
+ // 时间选择器适配
+ .el-date-range-picker {
+ width: 100vw;
+ .el-picker-panel__body {
+ min-width: 100%;
+ .el-date-range-picker__content {
+ .el-date-range-picker__header div {
+ margin-left: 22px;
+ margin-right: 0px;
+ }
+ & + .el-date-range-picker__content {
+ .el-date-range-picker__header div {
+ margin-left: 0px;
+ margin-right: 22px;
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/src/theme/media/dialog.scss b/src/theme/media/dialog.scss
new file mode 100644
index 0000000..6614eaf
--- /dev/null
+++ b/src/theme/media/dialog.scss
@@ -0,0 +1,12 @@
+@use './index.scss' as *;
+
+/* 页面宽度小于800px
+------------------------------- */
+@media screen and (max-width: 800px) {
+ .el-dialog {
+ width: 90% !important;
+ }
+ .el-dialog.is-fullscreen {
+ width: 100% !important;
+ }
+}
diff --git a/src/theme/media/error.scss b/src/theme/media/error.scss
new file mode 100644
index 0000000..5a83795
--- /dev/null
+++ b/src/theme/media/error.scss
@@ -0,0 +1,45 @@
+@use './index.scss' as *;
+
+/* 页面宽度小于768px
+------------------------------- */
+@media screen and (max-width: $sm) {
+ .error {
+ .error-flex {
+ flex-direction: column-reverse !important;
+ height: auto !important;
+ width: 100% !important;
+ }
+ .right,
+ .left {
+ flex: unset !important;
+ display: flex !important;
+ }
+ .left-item {
+ margin: auto !important;
+ }
+ .right img {
+ max-width: 450px !important;
+ @extend .left-item;
+ }
+ }
+}
+
+/* 页面宽度大于768px小于992px
+------------------------------- */
+@media screen and (min-width: $sm) and (max-width: $md) {
+ .error {
+ .error-flex {
+ padding-left: 30px !important;
+ }
+ }
+}
+
+/* 页面宽度小于1200px
+------------------------------- */
+@media screen and (max-width: $lg) {
+ .error {
+ .error-flex {
+ padding: 0 30px;
+ }
+ }
+}
diff --git a/src/theme/media/form.scss b/src/theme/media/form.scss
new file mode 100644
index 0000000..1af75b3
--- /dev/null
+++ b/src/theme/media/form.scss
@@ -0,0 +1,18 @@
+@use './index.scss' as *;
+
+/* 页面宽度小于576px
+------------------------------- */
+@media screen and (max-width: $xs) {
+ .el-form-item__label {
+ width: 100% !important;
+ text-align: left !important;
+ // 移动端 label 右对齐问题
+ justify-content: flex-start !important;
+ }
+ .el-form-item__content {
+ margin-left: 0 !important;
+ }
+ .el-form-item {
+ display: unset !important;
+ }
+}
diff --git a/src/theme/media/home.scss b/src/theme/media/home.scss
new file mode 100644
index 0000000..b313afc
--- /dev/null
+++ b/src/theme/media/home.scss
@@ -0,0 +1,23 @@
+@use './index.scss' as *;
+
+/* 页面宽度小于768px
+------------------------------- */
+@media screen and (max-width: $sm) {
+ .home-media,
+ .home-media-sm {
+ margin-top: 15px;
+ }
+}
+
+/* 页面宽度小于1200px
+------------------------------- */
+@media screen and (max-width: $lg) {
+ .home-media-lg {
+ margin-top: 15px;
+ }
+ .home-monitor {
+ .flex-warp-item {
+ width: 33.33% !important;
+ }
+ }
+}
diff --git a/src/theme/media/index.scss b/src/theme/media/index.scss
new file mode 100644
index 0000000..4761c0c
--- /dev/null
+++ b/src/theme/media/index.scss
@@ -0,0 +1,15 @@
+/* 栅格布局(媒体查询变量)
+* https://developer.mozilla.org/zh-CN/docs/Learn/CSS/CSS_layout/Media_queries
+* $us ≥376px 响应式栅格
+* $xs ≥576px 响应式栅格
+* $sm ≥768px 响应式栅格
+* $md ≥992px 响应式栅格
+* $lg ≥1200px 响应式栅格
+* $xl ≥1920px 响应式栅格
+------------------------------- */
+$us: 376px;
+$xs: 576px;
+$sm: 768px;
+$md: 992px;
+$lg: 1200px;
+$xl: 1920px;
diff --git a/src/theme/media/layout.scss b/src/theme/media/layout.scss
new file mode 100644
index 0000000..62c378d
--- /dev/null
+++ b/src/theme/media/layout.scss
@@ -0,0 +1,55 @@
+@use './index.scss' as *;
+
+/* 页面宽度小于576px
+------------------------------- */
+@media screen and (max-width: $xs) {
+ // MessageBox 弹框
+ .el-message-box {
+ width: 80% !important;
+ }
+}
+
+/* 页面宽度小于768px
+------------------------------- */
+@media screen and (max-width: $sm) {
+ // Breadcrumb 面包屑
+ .layout-navbars-breadcrumb-hide {
+ display: none;
+ }
+ // 外链视图
+ .layout-view-link {
+ a {
+ max-width: 80%;
+ text-align: center;
+ }
+ }
+ // 菜单搜索
+ .layout-search-dialog {
+ .el-autocomplete {
+ width: 80% !important;
+ }
+ }
+}
+
+/* 页面宽度小于1000px
+------------------------------- */
+@media screen and (max-width: 1000px) {
+ // 布局配置
+ .layout-drawer-content-flex {
+ position: relative;
+ &::after {
+ content: '手机版不支持切换布局';
+ position: absolute;
+ top: 0;
+ right: 0;
+ bottom: 0;
+ left: 0;
+ z-index: 1;
+ text-align: center;
+ height: 140px;
+ line-height: 140px;
+ background: rgba(255, 255, 255, 0.9);
+ color: #666666;
+ }
+ }
+}
diff --git a/src/theme/media/login.scss b/src/theme/media/login.scss
new file mode 100644
index 0000000..8832f2d
--- /dev/null
+++ b/src/theme/media/login.scss
@@ -0,0 +1,61 @@
+@use './index.scss' as *;
+
+/* 页面宽度小于992px
+------------------------------- */
+@media screen and (max-width: $lg) {
+ .login-container {
+ .login-icon-group {
+ &::before {
+ content: '';
+ height: 70% !important;
+ transition: all 0.3s ease;
+ }
+ &::after {
+ content: '';
+ width: 100px !important;
+ height: 200px !important;
+ transition: all 0.3s ease;
+ }
+ }
+ }
+}
+
+/* 页面宽度小于992px
+------------------------------- */
+@media screen and (max-width: $md) {
+ .login-content {
+
+ }
+}
+
+/* 页面宽度小于576px
+------------------------------- */
+@media screen and (max-width: $xs) {
+ .login-container {
+ .login-icon-group {
+ display: none !important;
+ }
+ .login-content {
+ width: 100% !important;
+ height: 100% !important;
+ padding: 20px 0 !important;
+ border-radius: 0 !important;
+ box-shadow: unset !important;
+ border: none !important;
+ }
+ .el-form-item {
+ display: flex !important;
+ }
+ }
+}
+
+/* 页面宽度小于375px
+------------------------------- */
+@media screen and (max-width: $us) {
+ .login-container {
+ .login-content-title {
+ font-size: 18px !important;
+ transition: all 0.3s ease;
+ }
+ }
+}
diff --git a/src/theme/media/media.scss b/src/theme/media/media.scss
new file mode 100644
index 0000000..2cc0ae7
--- /dev/null
+++ b/src/theme/media/media.scss
@@ -0,0 +1,13 @@
+@use './login.scss' as *;
+@use './error.scss' as *;
+@use './layout.scss' as *;
+@use './personal.scss' as *;
+@use './tagsView.scss' as *;
+@use './home.scss' as *;
+@use './chart.scss' as *;
+@use './form.scss' as *;
+@use './scrollbar.scss' as *;
+@use './pagination.scss' as *;
+@use './dialog.scss' as *;
+@use './cityLinkage.scss' as *;
+@use './date.scss' as *;
diff --git a/src/theme/media/pagination.scss b/src/theme/media/pagination.scss
new file mode 100644
index 0000000..38f0a21
--- /dev/null
+++ b/src/theme/media/pagination.scss
@@ -0,0 +1,15 @@
+@use './index.scss' as *;
+
+/* 页面宽度小于576px
+------------------------------- */
+@media screen and (max-width: $xs) {
+ .el-pager,
+ .el-pagination__jump {
+ display: none !important;
+ }
+}
+
+// 默认居中对齐
+.el-pagination {
+ text-align: center !important;
+}
diff --git a/src/theme/media/personal.scss b/src/theme/media/personal.scss
new file mode 100644
index 0000000..4d515a9
--- /dev/null
+++ b/src/theme/media/personal.scss
@@ -0,0 +1,16 @@
+@use './index.scss' as *;
+
+/* 页面宽度小于768px
+------------------------------- */
+@media screen and (max-width: $sm) {
+ .personal-info {
+ padding-left: 0 !important;
+ margin-top: 15px;
+ }
+ .personal-recommend-col {
+ margin-bottom: 15px;
+ &:last-of-type {
+ margin-bottom: 0;
+ }
+ }
+}
diff --git a/src/theme/media/scrollbar.scss b/src/theme/media/scrollbar.scss
new file mode 100644
index 0000000..e60247a
--- /dev/null
+++ b/src/theme/media/scrollbar.scss
@@ -0,0 +1,56 @@
+@use './index.scss' as *;
+
+/* 页面宽度小于768px
+------------------------------- */
+@media screen and (max-width: $sm) {
+ // 滚动条的宽度
+ ::-webkit-scrollbar {
+ width: 3px !important;
+ height: 3px !important;
+ }
+ ::-webkit-scrollbar-track-piece {
+ background-color: var(--next-bg-main-color);
+ }
+ // 滚动条的设置
+ ::-webkit-scrollbar-thumb {
+ background-color: rgba(144, 147, 153, 0.3);
+ background-clip: padding-box;
+ min-height: 28px;
+ border-radius: 5px;
+ transition: 0.3s background-color;
+ }
+ ::-webkit-scrollbar-thumb:hover {
+ background-color: rgba(144, 147, 153, 0.5);
+ }
+ // element plus scrollbar
+ .el-scrollbar__bar.is-vertical {
+ width: 2px !important;
+ }
+ .el-scrollbar__bar.is-horizontal {
+ height: 2px !important;
+ }
+}
+
+/* 页面宽度大于768px
+------------------------------- */
+@media screen and (min-width: 769px) {
+ // 滚动条的宽度
+ ::-webkit-scrollbar {
+ width: 7px;
+ height: 7px;
+ }
+ ::-webkit-scrollbar-track-piece {
+ background-color: var(--next-bg-main-color);
+ }
+ // 滚动条的设置
+ ::-webkit-scrollbar-thumb {
+ background-color: rgba(144, 147, 153, 0.3);
+ background-clip: padding-box;
+ min-height: 28px;
+ border-radius: 5px;
+ transition: 0.3s background-color;
+ }
+ ::-webkit-scrollbar-thumb:hover {
+ background-color: rgba(144, 147, 153, 0.5);
+ }
+}
diff --git a/src/theme/media/tagsView.scss b/src/theme/media/tagsView.scss
new file mode 100644
index 0000000..b5a69ab
--- /dev/null
+++ b/src/theme/media/tagsView.scss
@@ -0,0 +1,11 @@
+@use './index.scss' as *;
+
+/* 页面宽度小于768px
+------------------------------- */
+@media screen and (max-width: $sm) {
+ .tags-view-form {
+ .tags-view-form-col {
+ margin-bottom: 20px;
+ }
+ }
+}
diff --git a/src/theme/mixins/index.scss b/src/theme/mixins/index.scss
new file mode 100644
index 0000000..61f3c6b
--- /dev/null
+++ b/src/theme/mixins/index.scss
@@ -0,0 +1,56 @@
+/* 第三方图标字体间距/大小设置
+------------------------------- */
+@mixin generalIcon {
+ font-size: 14px !important;
+ display: inline-block;
+ vertical-align: middle;
+ margin-right: 5px;
+ width: 24px;
+ text-align: center;
+ justify-content: center;
+}
+
+/* 文本不换行
+------------------------------- */
+@mixin text-no-wrap() {
+ text-overflow: ellipsis;
+ overflow: hidden;
+ white-space: nowrap;
+}
+
+/* 多行文本溢出
+ ------------------------------- */
+@mixin text-ellipsis($line: 2) {
+ overflow: hidden;
+ word-break: break-all;
+ text-overflow: ellipsis;
+ display: -webkit-box;
+ -webkit-line-clamp: $line;
+ -webkit-box-orient: vertical;
+}
+
+/* 滚动条(页面未使用) div 中使用:
+ ------------------------------- */
+// .test {
+// @include scrollBar;
+// }
+@mixin scrollBar {
+ // 滚动条凹槽的颜色,还可以设置边框属性
+ &::-webkit-scrollbar-track-piece {
+ background-color: #f8f8f8;
+ }
+ // 滚动条的宽度
+ &::-webkit-scrollbar {
+ width: 9px;
+ height: 9px;
+ }
+ // 滚动条的设置
+ &::-webkit-scrollbar-thumb {
+ background-color: #dddddd;
+ background-clip: padding-box;
+ min-height: 28px;
+ }
+ &::-webkit-scrollbar-thumb:hover {
+ background-color: #bbb;
+ }
+}
diff --git a/src/theme/other.scss b/src/theme/other.scss
new file mode 100644
index 0000000..a0451b8
--- /dev/null
+++ b/src/theme/other.scss
@@ -0,0 +1,36 @@
+/* wangeditor富文本编辑器
+------------------------------- */
+.editor-container {
+ z-index: 9999;
+ .w-e-toolbar {
+ border: 1px solid var(--el-border-color-light, #ebeef5) !important;
+ border-bottom: 1px solid var(--el-border-color-light, #ebeef5) !important;
+ border-top-left-radius: 3px;
+ border-top-right-radius: 3px;
+ z-index: 2 !important;
+ }
+ .w-e-text-container {
+ border: 1px solid var(--el-border-color-light, #ebeef5) !important;
+ border-top: none !important;
+ border-bottom-left-radius: 3px;
+ border-bottom-right-radius: 3px;
+ z-index: 1 !important;
+ }
+}
+
+[data-theme='dark'] {
+ // textarea - css vars
+ --w-e-textarea-bg-color: var(--el-color-white) !important;
+ --w-e-textarea-color: var(--el-text-color-primary) !important;
+
+ // toolbar - css vars
+ --w-e-toolbar-color: var(--el-text-color-primary) !important;
+ --w-e-toolbar-bg-color: var(--el-color-white) !important;
+ --w-e-toolbar-active-color: var(--el-text-color-primary) !important;
+ --w-e-toolbar-active-bg-color: var(--next-color-menu-hover) !important;
+ --w-e-toolbar-border-color: var(--el-border-color-light, #ebeef5) !important;
+
+ // modal - css vars
+ --w-e-modal-button-bg-color: var(--el-color-primary) !important;
+ --w-e-modal-button-border-color: var(--el-color-primary) !important;
+}
diff --git a/src/theme/waves.scss b/src/theme/waves.scss
new file mode 100644
index 0000000..23add2c
--- /dev/null
+++ b/src/theme/waves.scss
@@ -0,0 +1,101 @@
+/* Waves v0.6.0
+* http://fian.my.id/Waves
+*
+* Copyright 2014 Alfiana E. Sibuea and other contributors
+* Released under the MIT license
+* https://github.com/fians/Waves/blob/master/LICENSE
+*/
+.waves-effect {
+ position: relative;
+ cursor: pointer;
+ display: inline-block;
+ overflow: hidden;
+ -webkit-user-select: none;
+ -moz-user-select: none;
+ -ms-user-select: none;
+ user-select: none;
+ -webkit-tap-highlight-color: transparent;
+ vertical-align: middle;
+ z-index: 1;
+ will-change: opacity, transform;
+ transition: all 0.3s ease-out;
+}
+.waves-effect .waves-ripple {
+ position: absolute;
+ border-radius: 50%;
+ width: 20px;
+ height: 20px;
+ margin-top: -10px;
+ margin-left: -10px;
+ opacity: 0;
+ background: rgba(0, 0, 0, 0.2);
+ transition: all 0.7s ease-out;
+ transition-property: opacity, -webkit-transform;
+ transition-property: transform, opacity;
+ transition-property: transform, opacity, -webkit-transform;
+ -webkit-transform: scale(0);
+ transform: scale(0);
+ pointer-events: none;
+}
+.waves-effect.waves-light .waves-ripple {
+ background-color: rgba(255, 255, 255, 0.45);
+}
+.waves-effect.waves-red .waves-ripple {
+ background-color: rgba(244, 67, 54, 0.7);
+}
+.waves-effect.waves-yellow .waves-ripple {
+ background-color: rgba(255, 235, 59, 0.7);
+}
+.waves-effect.waves-orange .waves-ripple {
+ background-color: rgba(255, 152, 0, 0.7);
+}
+.waves-effect.waves-purple .waves-ripple {
+ background-color: rgba(156, 39, 176, 0.7);
+}
+.waves-effect.waves-green .waves-ripple {
+ background-color: rgba(76, 175, 80, 0.7);
+}
+.waves-effect.waves-teal .waves-ripple {
+ background-color: rgba(0, 150, 136, 0.7);
+}
+.waves-effect input[type='button'],
+.waves-effect input[type='reset'],
+.waves-effect input[type='submit'] {
+ border: 0;
+ font-style: normal;
+ font-size: inherit;
+ text-transform: inherit;
+ background: none;
+}
+.waves-notransition {
+ transition: none !important;
+}
+.waves-circle {
+ -webkit-transform: translateZ(0);
+ transform: translateZ(0);
+ -webkit-mask-image: -webkit-radial-gradient(circle, #fff 100%, #000 100%);
+}
+.waves-input-wrapper {
+ border-radius: 0.2em;
+ vertical-align: bottom;
+}
+.waves-input-wrapper .waves-button-input {
+ position: relative;
+ top: 0;
+ left: 0;
+ z-index: 1;
+}
+.waves-circle {
+ text-align: center;
+ width: 2.5em;
+ height: 2.5em;
+ line-height: 2.5em;
+ border-radius: 50%;
+ -webkit-mask-image: none;
+}
+.waves-block {
+ display: block;
+}
+a.waves-effect .waves-ripple {
+ z-index: -1;
+}
diff --git a/src/utils/arrayOperation.ts b/src/utils/arrayOperation.ts
new file mode 100644
index 0000000..f71620d
--- /dev/null
+++ b/src/utils/arrayOperation.ts
@@ -0,0 +1,66 @@
+/**
+ * 判断两数组字符串是否相同(用于按钮权限验证),数组字符串中存在相同时会自动去重(按钮权限标识不会重复)
+ * @param news 新数据
+ * @param old 源数据
+ * @returns 两数组相同返回 `true`,反之则反
+ */
+export function judementSameArr(newArr: unknown[] | string[], oldArr: string[]): boolean {
+ const news = removeDuplicate(newArr);
+ const olds = removeDuplicate(oldArr);
+ let count = 0;
+ const leng = news.length;
+ for (let i in olds) {
+ for (let j in news) {
+ if (olds[i] === news[j]) count++;
+ }
+ }
+ return count === leng ? true : false;
+}
+
+/**
+ * 判断两个对象是否相同
+ * @param a 要比较的对象一
+ * @param b 要比较的对象二
+ * @returns 相同返回 true,反之则反
+ */
+export function isObjectValueEqual(a: { [key: string]: any }, b: { [key: string]: any }) {
+ if (!a || !b) return false;
+ let aProps = Object.getOwnPropertyNames(a);
+ let bProps = Object.getOwnPropertyNames(b);
+ if (aProps.length != bProps.length) return false;
+ for (let i = 0; i < aProps.length; i++) {
+ let propName = aProps[i];
+ let propA = a[propName];
+ let propB = b[propName];
+ if (!b.hasOwnProperty(propName)) return false;
+ if (propA instanceof Object) {
+ if (!isObjectValueEqual(propA, propB)) return false;
+ } else if (propA !== propB) {
+ return false;
+ }
+ }
+ return true;
+}
+
+/**
+ * 数组、数组对象去重
+ * @param arr 数组内容
+ * @param attr 需要去重的键值(数组对象)
+ * @returns
+ */
+export function removeDuplicate(arr: any, attr?: string) {
+ if (!arr && !arr.length) {
+ return arr;
+ } else {
+ if (attr) {
+ const obj: any = {};
+ const newArr = arr.reduce((cur: any, item: any) => {
+ obj[item[attr]] ? '' : (obj[item[attr]] = true && item[attr] && cur.push(item));
+ return cur;
+ }, []);
+ return newArr;
+ } else {
+ return Array.from(new Set([...arr]));
+ }
+ }
+}
diff --git a/src/utils/authDirective.ts b/src/utils/authDirective.ts
new file mode 100644
index 0000000..9d30bc3
--- /dev/null
+++ b/src/utils/authDirective.ts
@@ -0,0 +1,42 @@
+import type { App } from 'vue';
+import { useUserInfo } from '/@/stores/userInfo';
+import { judementSameArr } from '/@/utils/arrayOperation';
+
+/**
+ * 用户权限指令
+ * @directive 单个权限验证(v-auth="xxx")
+ * @directive 多个权限验证,满足一个则显示(v-auths="[xxx,xxx]")
+ * @directive 多个权限验证,全部满足则显示(v-auth-all="[xxx,xxx]")
+ */
+export function authDirective(app: App) {
+ const allPermissions = "*/*/*"
+ const stores = useUserInfo();
+ // 单个权限验证(v-auth="xxx")
+ app.directive('auth', {
+ mounted(el, binding) {
+ if (stores.permissions.includes(allPermissions)) return
+ if (!stores.permissions.some((v: string) => v === binding.value)) el.parentNode.removeChild(el);
+ },
+ });
+ // 多个权限验证,满足一个则显示(v-auths="[xxx,xxx]")
+ app.directive('auths', {
+ mounted(el, binding) {
+ if (stores.permissions.includes(allPermissions)) return
+ let flag = false;
+ stores.permissions.map((val: string) => {
+ binding.value.map((v: string) => {
+ if (val === v) flag = true;
+ });
+ });
+ if (!flag) el.parentNode.removeChild(el);
+ },
+ });
+ // 多个权限验证,全部满足则显示(v-auth-all="[xxx,xxx]")
+ app.directive('auth-all', {
+ mounted(el, binding) {
+ if (stores.permissions.includes(allPermissions)) return
+ const flag = judementSameArr(binding.value, stores.permissions);
+ if (!flag) el.parentNode.removeChild(el);
+ },
+ });
+}
diff --git a/src/utils/authFunction.ts b/src/utils/authFunction.ts
new file mode 100644
index 0000000..84c0ab4
--- /dev/null
+++ b/src/utils/authFunction.ts
@@ -0,0 +1,38 @@
+import { useUserInfo } from '/@/stores/userInfo';
+import { judementSameArr } from '/@/utils/arrayOperation';
+
+/**
+ * 单个权限验证
+ * @param value 权限值
+ * @returns 有权限,返回 `true`,反之则反
+ */
+export function auth(value: string): boolean {
+ const stores = useUserInfo();
+ return stores.userInfos.authBtnList.some((v: string) => v === value);
+}
+
+/**
+ * 多个权限验证,满足一个则为 true
+ * @param value 权限值
+ * @returns 有权限,返回 `true`,反之则反
+ */
+export function auths(value: Array): boolean {
+ let flag = false;
+ const stores = useUserInfo();
+ stores.userInfos.authBtnList.map((val: string) => {
+ value.map((v: string) => {
+ if (val === v) flag = true;
+ });
+ });
+ return flag;
+}
+
+/**
+ * 多个权限验证,全部满足则为 true
+ * @param value 权限值
+ * @returns 有权限,返回 `true`,反之则反
+ */
+export function authAll(value: Array): boolean {
+ const stores = useUserInfo();
+ return judementSameArr(value, stores.userInfos.authBtnList);
+}
diff --git a/src/utils/build.ts b/src/utils/build.ts
new file mode 100644
index 0000000..24be5d8
--- /dev/null
+++ b/src/utils/build.ts
@@ -0,0 +1,125 @@
+import importToCDN from 'vite-plugin-cdn-import';
+
+/**
+ * 打包相关
+ * 注意 prodUrl:使用的是 jsdelivr 还是 unpkg。它们的 path 可能不一致
+ * 文章链接:https://blog.csdn.net/qq_34450741/article/details/129766676,使用的是 jsdelivr
+ * @description importToCDN https://github.com/mmf-fe/vite-plugin-cdn-import
+ * @description cdn 在线引入的 cdn 地址配置。path:https://www.jsdelivr.com/ || https://unpkg.com/
+ * @description external 打包时,过滤包导入。参考:https://rollupjs.org/configuration-options/#external
+ */
+export const buildConfig = {
+ cdn() {
+ return importToCDN({
+ prodUrl: 'https://unpkg.com/{name}@{version}/{path}',
+ modules: [
+ // autoComplete('vue'),
+ // autoComplete('axios'),
+ {
+ name: 'vue',
+ var: 'Vue',
+ path: 'dist/vue.global.js',
+ },
+ {
+ name: 'vue-demi',
+ var: 'VueDemi',
+ path: 'lib/index.iife.js',
+ },
+ {
+ name: 'vue-router',
+ var: 'VueRouter',
+ path: 'dist/vue-router.global.js',
+ },
+ {
+ name: 'element-plus',
+ var: 'ElementPlus',
+ path: 'dist/index.full.js',
+ },
+ // {
+ // name: '@element-plus/icons-vue',
+ // var: 'ElementPlusIconsVue',
+ // path: 'dist/index.iife.min.js',
+ // },
+ // {
+ // name: 'echarts',
+ // var: 'echarts',
+ // path: 'dist/echarts.min.js',
+ // },
+ // {
+ // name: 'echarts-gl',
+ // var: 'echarts-gl',
+ // path: 'dist/echarts-gl.min.js',
+ // },
+ // {
+ // name: 'echarts-wordcloud',
+ // var: 'echarts-wordcloud',
+ // path: 'dist/echarts-wordcloud.min.js',
+ // },
+ // {
+ // name: 'vue-i18n',
+ // var: 'VueI18n',
+ // path: 'dist/vue-i18n.global.min.js',
+ // },
+ // {
+ // name: 'jsplumb',
+ // var: 'jsPlumb',
+ // path: 'dist/js/jsplumb.min.js',
+ // },
+ // {
+ // name: 'cropperjs',
+ // var: 'Cropper',
+ // path: 'dist/cropper.min.js',
+ // },
+ // {
+ // name: 'sortablejs',
+ // var: 'Sortable',
+ // path: 'Sortable.min.js',
+ // },
+ // {
+ // name: 'qrcodejs2-fixes',
+ // var: 'QRCode',
+ // path: 'qrcode.min.js',
+ // },
+ // {
+ // name: 'print-js',
+ // var: 'printJS',
+ // path: 'dist/print.min.js',
+ // },
+ // {
+ // name: '@wangeditor/editor',
+ // var: 'wangEditor',
+ // path: 'dist/index.min.js',
+ // },
+ // {
+ // name: '@wangeditor/editor-for-vue',
+ // var: 'WangEditorForVue',
+ // path: 'dist/index.min.js',
+ // },
+ // {
+ // name: 'vue-grid-layout',
+ // var: 'VueGridLayout',
+ // path: 'https://cdn.jsdelivr.net/npm/vue-grid-layout@3.0.0-beta1/dist/vue-grid-layout.umd.min.js',
+ // },
+ ],
+ });
+ },
+ external: [
+ 'vue',
+ // 'axios',
+ 'vue-router',
+ 'element-plus',
+ // '@element-plus/icons-vue',
+ // 'echarts',
+ // 'echarts-gl',
+ // 'echarts-wordcloud',
+ // 'vue-i18n',
+ // 'jsplumb',
+ // 'cropperjs',
+ // 'sortablejs',
+ // 'qrcodejs2-fixes',
+ // 'print-js',
+ // '@wangeditor/editor',
+ // '@wangeditor/editor-for-vue',
+ // 'vue-grid-layout',
+ ],
+};
diff --git a/src/utils/commonFunction.ts b/src/utils/commonFunction.ts
new file mode 100644
index 0000000..1c069e6
--- /dev/null
+++ b/src/utils/commonFunction.ts
@@ -0,0 +1,65 @@
+// 通用函数
+import useClipboard from 'vue-clipboard3';
+import { ElMessage } from 'element-plus';
+import { formatDate } from '/@/utils/formatTime';
+import { useI18n } from 'vue-i18n';
+
+export default function () {
+ const { t } = useI18n();
+ const { toClipboard } = useClipboard();
+ //百分比格式化
+ const percentFormat = (row: any, column: number, cellValue: any) => {
+ return cellValue ? `${cellValue}%` : '-';
+ };
+ //列表日期时间格式化
+ const dateFormatYMD = (row: any, column: number, cellValue: any) => {
+ if (!cellValue) return '-';
+ return formatDate(new Date(cellValue), 'YYYY-mm-dd');
+ };
+ //列表日期时间格式化
+ const dateFormatYMDHMS = (row: any, column: number, cellValue: any) => {
+ if (!cellValue) return '-';
+ return formatDate(new Date(cellValue), 'YYYY-mm-dd HH:MM:SS');
+ };
+ //列表日期时间格式化
+ const dateFormatHMS = (row: any, column: number, cellValue: any) => {
+ if (!cellValue) return '-';
+ let time = 0;
+ if (typeof row === 'number') time = row;
+ if (typeof cellValue === 'number') time = cellValue;
+ return formatDate(new Date(time * 1000), 'HH:MM:SS');
+ };
+ // 小数格式化
+ const scaleFormat = (value: any = 0, scale: number = 4) => {
+ return Number.parseFloat(value).toFixed(scale);
+ };
+ // 小数格式化
+ const scale2Format = (value: any = 0) => {
+ return Number.parseFloat(value).toFixed(2);
+ };
+ // 点击复制文本
+ const copyText = (text: string) => {
+ return new Promise((resolve, reject) => {
+ try {
+ //复制
+ toClipboard(text);
+ //下面可以设置复制成功的提示框等操作
+ ElMessage.success(t('message.layout.copyTextSuccess'));
+ resolve(text);
+ } catch (e) {
+ //复制失败
+ ElMessage.error(t('message.layout.copyTextError'));
+ reject(e);
+ }
+ });
+ };
+ return {
+ percentFormat,
+ dateFormatYMD,
+ dateFormatYMDHMS,
+ dateFormatHMS,
+ scaleFormat,
+ scale2Format,
+ copyText,
+ };
+}
diff --git a/src/utils/customDirective.ts b/src/utils/customDirective.ts
new file mode 100644
index 0000000..c67350f
--- /dev/null
+++ b/src/utils/customDirective.ts
@@ -0,0 +1,178 @@
+import type { App } from 'vue';
+
+/**
+ * 按钮波浪指令
+ * @directive 默认方式:v-waves,如 ``
+ * @directive 参数方式:v-waves=" |light|red|orange|purple|green|teal",如 ``
+ */
+export function wavesDirective(app: App) {
+ app.directive('waves', {
+ mounted(el, binding) {
+ el.classList.add('waves-effect');
+ binding.value && el.classList.add(`waves-${binding.value}`);
+ function setConvertStyle(obj: { [key: string]: unknown }) {
+ let style: string = '';
+ for (let i in obj) {
+ if (obj.hasOwnProperty(i)) style += `${i}:${obj[i]};`;
+ }
+ return style;
+ }
+ function onCurrentClick(e: { [key: string]: unknown }) {
+ let elDiv = document.createElement('div');
+ elDiv.classList.add('waves-ripple');
+ el.appendChild(elDiv);
+ let styles = {
+ left: `${e.layerX}px`,
+ top: `${e.layerY}px`,
+ opacity: 1,
+ transform: `scale(${(el.clientWidth / 100) * 10})`,
+ 'transition-duration': `750ms`,
+ 'transition-timing-function': `cubic-bezier(0.250, 0.460, 0.450, 0.940)`,
+ };
+ elDiv.setAttribute('style', setConvertStyle(styles));
+ setTimeout(() => {
+ elDiv.setAttribute(
+ 'style',
+ setConvertStyle({
+ opacity: 0,
+ transform: styles.transform,
+ left: styles.left,
+ top: styles.top,
+ })
+ );
+ setTimeout(() => {
+ elDiv && el.removeChild(elDiv);
+ }, 750);
+ }, 450);
+ }
+ el.addEventListener('mousedown', onCurrentClick, false);
+ },
+ unmounted(el) {
+ el.addEventListener('mousedown', () => {});
+ },
+ });
+}
+
+/**
+ * 自定义拖动指令
+ * @description 使用方式:v-drag="[dragDom,dragHeader]",如 ``
+ * @description dragDom 要拖动的元素,dragHeader 要拖动的 Header 位置
+ * @link 注意:https://github.com/element-plus/element-plus/issues/522
+ * @lick 参考:https://blog.csdn.net/weixin_46391323/article/details/105228020?utm_medium=distribute.pc_relevant.none-task-blog-baidujs_title-10&spm=1001.2101.3001.4242
+ */
+export function dragDirective(app: App) {
+ app.directive('drag', {
+ mounted(el, binding) {
+ if (!binding.value) return false;
+
+ const dragDom = document.querySelector(binding.value[0]) as HTMLElement;
+ const dragHeader = document.querySelector(binding.value[1]) as HTMLElement;
+
+ dragHeader.onmouseover = () => (dragHeader.style.cursor = `move`);
+
+ function down(e: any, type: string) {
+ // 鼠标按下,计算当前元素距离可视区的距离
+ const disX = type === 'pc' ? e.clientX - dragHeader.offsetLeft : e.touches[0].clientX - dragHeader.offsetLeft;
+ const disY = type === 'pc' ? e.clientY - dragHeader.offsetTop : e.touches[0].clientY - dragHeader.offsetTop;
+
+ // body当前宽度
+ const screenWidth = document.body.clientWidth;
+ // 可见区域高度(应为body高度,可某些环境下无法获取)
+ const screenHeight = document.documentElement.clientHeight;
+
+ // 对话框宽度
+ const dragDomWidth = dragDom.offsetWidth;
+ // 对话框高度
+ const dragDomheight = dragDom.offsetHeight;
+
+ const minDragDomLeft = dragDom.offsetLeft;
+ const maxDragDomLeft = screenWidth - dragDom.offsetLeft - dragDomWidth;
+
+ const minDragDomTop = dragDom.offsetTop;
+ const maxDragDomTop = screenHeight - dragDom.offsetTop - dragDomheight;
+
+ // 获取到的值带px 正则匹配替换
+ let styL: any = getComputedStyle(dragDom).left;
+ let styT: any = getComputedStyle(dragDom).top;
+
+ // 注意在ie中 第一次获取到的值为组件自带50% 移动之后赋值为px
+ if (styL.includes('%')) {
+ styL = +document.body.clientWidth * (+styL.replace(/\%/g, '') / 100);
+ styT = +document.body.clientHeight * (+styT.replace(/\%/g, '') / 100);
+ } else {
+ styL = +styL.replace(/\px/g, '');
+ styT = +styT.replace(/\px/g, '');
+ }
+
+ return {
+ disX,
+ disY,
+ minDragDomLeft,
+ maxDragDomLeft,
+ minDragDomTop,
+ maxDragDomTop,
+ styL,
+ styT,
+ };
+ }
+
+ function move(e: any, type: string, obj: any) {
+ let { disX, disY, minDragDomLeft, maxDragDomLeft, minDragDomTop, maxDragDomTop, styL, styT } = obj;
+
+ // 通过事件委托,计算移动的距离
+ let left = type === 'pc' ? e.clientX - disX : e.touches[0].clientX - disX;
+ let top = type === 'pc' ? e.clientY - disY : e.touches[0].clientY - disY;
+
+ // 边界处理
+ if (-left > minDragDomLeft) {
+ left = -minDragDomLeft;
+ } else if (left > maxDragDomLeft) {
+ left = maxDragDomLeft;
+ }
+
+ if (-top > minDragDomTop) {
+ top = -minDragDomTop;
+ } else if (top > maxDragDomTop) {
+ top = maxDragDomTop;
+ }
+
+ // 移动当前元素
+ dragDom.style.cssText += `;left:${left + styL}px;top:${top + styT}px;`;
+ }
+
+ /**
+ * pc端
+ * onmousedown 鼠标按下触发事件
+ * onmousemove 鼠标按下时持续触发事件
+ * onmouseup 鼠标抬起触发事件
+ */
+ dragHeader.onmousedown = (e) => {
+ const obj = down(e, 'pc');
+ document.onmousemove = (e) => {
+ move(e, 'pc', obj);
+ };
+ document.onmouseup = () => {
+ document.onmousemove = null;
+ document.onmouseup = null;
+ };
+ };
+
+ /**
+ * 移动端
+ * ontouchstart 当按下手指时,触发ontouchstart
+ * ontouchmove 当移动手指时,触发ontouchmove
+ * ontouchend 当移走手指时,触发ontouchend
+ */
+ dragHeader.ontouchstart = (e) => {
+ const obj = down(e, 'app');
+ document.ontouchmove = (e) => {
+ move(e, 'app', obj);
+ };
+ document.ontouchend = () => {
+ document.ontouchmove = null;
+ document.ontouchend = null;
+ };
+ };
+ },
+ });
+}
diff --git a/src/utils/directive.ts b/src/utils/directive.ts
new file mode 100644
index 0000000..a75b187
--- /dev/null
+++ b/src/utils/directive.ts
@@ -0,0 +1,18 @@
+import type { App } from 'vue';
+import { authDirective } from '/@/utils/authDirective';
+import { wavesDirective, dragDirective } from '/@/utils/customDirective';
+
+/**
+ * 导出指令方法:v-xxx
+ * @methods authDirective 用户权限指令,用法:v-auth
+ * @methods wavesDirective 按钮波浪指令,用法:v-waves
+ * @methods dragDirective 自定义拖动指令,用法:v-drag
+ */
+export function directive(app: App) {
+ // 用户权限指令
+ authDirective(app);
+ // 按钮波浪指令
+ wavesDirective(app);
+ // 自定义拖动指令
+ dragDirective(app);
+}
diff --git a/src/utils/formatTime.ts b/src/utils/formatTime.ts
new file mode 100644
index 0000000..441e30c
--- /dev/null
+++ b/src/utils/formatTime.ts
@@ -0,0 +1,137 @@
+/**
+ * 时间日期转换
+ * @param date 当前时间,new Date() 格式
+ * @param format 需要转换的时间格式字符串
+ * @description format 字符串随意,如 `YYYY-mm、YYYY-mm-dd`
+ * @description format 季度:"YYYY-mm-dd HH:MM:SS QQQQ"
+ * @description format 星期:"YYYY-mm-dd HH:MM:SS WWW"
+ * @description format 几周:"YYYY-mm-dd HH:MM:SS ZZZ"
+ * @description format 季度 + 星期 + 几周:"YYYY-mm-dd HH:MM:SS WWW QQQQ ZZZ"
+ * @returns 返回拼接后的时间字符串
+ */
+export function formatDate(date: Date, format: string): string {
+ let we = date.getDay(); // 星期
+ let z = getWeek(date); // 周
+ let qut = Math.floor((date.getMonth() + 3) / 3).toString(); // 季度
+ const opt: { [key: string]: string } = {
+ 'Y+': date.getFullYear().toString(), // 年
+ 'm+': (date.getMonth() + 1).toString(), // 月(月份从0开始,要+1)
+ 'd+': date.getDate().toString(), // 日
+ 'H+': date.getHours().toString(), // 时
+ 'M+': date.getMinutes().toString(), // 分
+ 'S+': date.getSeconds().toString(), // 秒
+ 'q+': qut, // 季度
+ };
+ // 中文数字 (星期)
+ const week: { [key: string]: string } = {
+ '0': '日',
+ '1': '一',
+ '2': '二',
+ '3': '三',
+ '4': '四',
+ '5': '五',
+ '6': '六',
+ };
+ // 中文数字(季度)
+ const quarter: { [key: string]: string } = {
+ '1': '一',
+ '2': '二',
+ '3': '三',
+ '4': '四',
+ };
+ if (/(W+)/.test(format))
+ format = format.replace(RegExp.$1, RegExp.$1.length > 1 ? (RegExp.$1.length > 2 ? '星期' + week[we] : '周' + week[we]) : week[we]);
+ if (/(Q+)/.test(format)) format = format.replace(RegExp.$1, RegExp.$1.length == 4 ? '第' + quarter[qut] + '季度' : quarter[qut]);
+ if (/(Z+)/.test(format)) format = format.replace(RegExp.$1, RegExp.$1.length == 3 ? '第' + z + '周' : z + '');
+ for (let k in opt) {
+ let r = new RegExp('(' + k + ')').exec(format);
+ // 若输入的长度不为1,则前面补零
+ if (r) format = format.replace(r[1], RegExp.$1.length == 1 ? opt[k] : opt[k].padStart(RegExp.$1.length, '0'));
+ }
+ return format;
+}
+
+/**
+ * 获取当前日期是第几周
+ * @param dateTime 当前传入的日期值
+ * @returns 返回第几周数字值
+ */
+export function getWeek(dateTime: Date): number {
+ let temptTime = new Date(dateTime.getTime());
+ // 周几
+ let weekday = temptTime.getDay() || 7;
+ // 周1+5天=周六
+ temptTime.setDate(temptTime.getDate() - weekday + 1 + 5);
+ let firstDay = new Date(temptTime.getFullYear(), 0, 1);
+ let dayOfWeek = firstDay.getDay();
+ let spendDay = 1;
+ if (dayOfWeek != 0) spendDay = 7 - dayOfWeek + 1;
+ firstDay = new Date(temptTime.getFullYear(), 0, 1 + spendDay);
+ let d = Math.ceil((temptTime.valueOf() - firstDay.valueOf()) / 86400000);
+ let result = Math.ceil(d / 7);
+ return result;
+}
+
+/**
+ * 将时间转换为 `几秒前`、`几分钟前`、`几小时前`、`几天前`
+ * @param param 当前时间,new Date() 格式或者字符串时间格式
+ * @param format 需要转换的时间格式字符串
+ * @description param 10秒: 10 * 1000
+ * @description param 1分: 60 * 1000
+ * @description param 1小时: 60 * 60 * 1000
+ * @description param 24小时:60 * 60 * 24 * 1000
+ * @description param 3天: 60 * 60* 24 * 1000 * 3
+ * @returns 返回拼接后的时间字符串
+ */
+export function formatPast(param: string | Date, format: string = 'YYYY-mm-dd'): string {
+ // 传入格式处理、存储转换值
+ let t: any, s: number;
+ // 获取js 时间戳
+ let time: number = new Date().getTime();
+ // 是否是对象
+ typeof param === 'string' || 'object' ? (t = new Date(param).getTime()) : (t = param);
+ // 当前时间戳 - 传入时间戳
+ time = Number.parseInt(`${time - t}`);
+ if (time < 10000) {
+ // 10秒内
+ return '刚刚';
+ } else if (time < 60000 && time >= 10000) {
+ // 超过10秒少于1分钟内
+ s = Math.floor(time / 1000);
+ return `${s}秒前`;
+ } else if (time < 3600000 && time >= 60000) {
+ // 超过1分钟少于1小时
+ s = Math.floor(time / 60000);
+ return `${s}分钟前`;
+ } else if (time < 86400000 && time >= 3600000) {
+ // 超过1小时少于24小时
+ s = Math.floor(time / 3600000);
+ return `${s}小时前`;
+ } else if (time < 259200000 && time >= 86400000) {
+ // 超过1天少于3天内
+ s = Math.floor(time / 86400000);
+ return `${s}天前`;
+ } else {
+ // 超过3天
+ let date = typeof param === 'string' || 'object' ? new Date(param) : param;
+ return formatDate(date, format);
+ }
+}
+
+/**
+ * 时间问候语
+ * @param param 当前时间,new Date() 格式
+ * @description param 调用 `formatAxis(new Date())` 输出 `上午好`
+ * @returns 返回拼接后的时间字符串
+ */
+export function formatAxis(param: Date): string {
+ let hour: number = new Date(param).getHours();
+ if (hour < 6) return '凌晨好';
+ else if (hour < 9) return '早上好';
+ else if (hour < 12) return '上午好';
+ else if (hour < 14) return '中午好';
+ else if (hour < 17) return '下午好';
+ else if (hour < 19) return '傍晚好';
+ else if (hour < 22) return '晚上好';
+ else return '夜里好';
+}
diff --git a/src/utils/getStyleSheets.ts b/src/utils/getStyleSheets.ts
new file mode 100644
index 0000000..90252c3
--- /dev/null
+++ b/src/utils/getStyleSheets.ts
@@ -0,0 +1,101 @@
+import { nextTick } from 'vue';
+import * as svg from '@element-plus/icons-vue';
+
+// 获取阿里字体图标
+const getAlicdnIconfont = () => {
+ return new Promise((resolve, reject) => {
+ nextTick(() => {
+ const styles: any = document.styleSheets;
+ let sheetsList = [];
+ let sheetsIconList = [];
+ for (let i = 0; i < styles.length; i++) {
+ if (styles[i].href && styles[i].href.indexOf('at.alicdn.com') > -1) {
+ sheetsList.push(styles[i]);
+ }
+ }
+ for (let i = 0; i < sheetsList.length; i++) {
+ for (let j = 0; j < sheetsList[i].cssRules.length; j++) {
+ if (sheetsList[i].cssRules[j].selectorText && sheetsList[i].cssRules[j].selectorText.indexOf('.icon-') > -1) {
+ sheetsIconList.push(
+ `${sheetsList[i].cssRules[j].selectorText.substring(1, sheetsList[i].cssRules[j].selectorText.length).replace(/\:\:before/gi, '')}`
+ );
+ }
+ }
+ }
+ if (sheetsIconList.length > 0) resolve(sheetsIconList);
+ else reject('未获取到值,请刷新重试');
+ });
+ });
+};
+
+// 初始化获取 css 样式,获取 element plus 自带 svg 图标,增加了 ele- 前缀,使用时:ele-Aim
+const getElementPlusIconfont = () => {
+ return new Promise((resolve, reject) => {
+ nextTick(() => {
+ const icons = svg as any;
+ const sheetsIconList = [];
+ for (const i in icons) {
+ sheetsIconList.push(`ele-${icons[i].name}`);
+ }
+ if (sheetsIconList.length > 0) resolve(sheetsIconList);
+ else reject('未获取到值,请刷新重试');
+ });
+ });
+};
+
+// 初始化获取 css 样式,这里使用 fontawesome 的图标
+const getAwesomeIconfont = () => {
+ return new Promise((resolve, reject) => {
+ nextTick(() => {
+ const styles: any = document.styleSheets;
+ let sheetsList = [];
+ let sheetsIconList = [];
+ for (let i = 0; i < styles.length; i++) {
+ if (styles[i].href && styles[i].href.indexOf('netdna.bootstrapcdn.com') > -1) {
+ sheetsList.push(styles[i]);
+ }
+ }
+ for (let i = 0; i < sheetsList.length; i++) {
+ for (let j = 0; j < sheetsList[i].cssRules.length; j++) {
+ if (
+ sheetsList[i].cssRules[j].selectorText &&
+ sheetsList[i].cssRules[j].selectorText.indexOf('.fa-') === 0 &&
+ sheetsList[i].cssRules[j].selectorText.indexOf(',') === -1
+ ) {
+ if (/::before/.test(sheetsList[i].cssRules[j].selectorText)) {
+ sheetsIconList.push(
+ `${sheetsList[i].cssRules[j].selectorText.substring(1, sheetsList[i].cssRules[j].selectorText.length).replace(/\:\:before/gi, '')}`
+ );
+ }
+ }
+ }
+ }
+ if (sheetsIconList.length > 0) resolve(sheetsIconList.reverse());
+ else reject('未获取到值,请刷新重试');
+ });
+ });
+};
+
+/**
+ * 获取字体图标 `document.styleSheets`
+ * @method ali 获取阿里字体图标 ``
+ * @method ele 获取 element plus 自带图标 ``
+ * @method ali 获取 fontawesome 的图标 ``
+ */
+const initIconfont = {
+ // iconfont
+ ali: () => {
+ return getAlicdnIconfont();
+ },
+ // element plus
+ ele: () => {
+ return getElementPlusIconfont();
+ },
+ // fontawesome
+ awe: () => {
+ return getAwesomeIconfont();
+ },
+};
+
+// 导出方法
+export default initIconfont;
diff --git a/src/utils/gfast.ts b/src/utils/gfast.ts
new file mode 100644
index 0000000..7902b71
--- /dev/null
+++ b/src/utils/gfast.ts
@@ -0,0 +1,108 @@
+import {Session} from "/@/utils/storage";
+
+/**
+ * 通用js方法封装处理
+ * Copyright (c) 2022 gfast
+ */
+
+export const baseURL:string|undefined|boolean = import.meta.env.VITE_API_URL
+
+
+export function getUpFileUrl(url:string){
+ if(!url){
+ return url
+ }
+ if (/^http|^blob/i.test(url)) {
+ return url
+ }
+ let reg = new RegExp('^/*' + baseURL + "/*");
+ return baseURL+url.replace(reg,'')
+}
+
+
+
+/**
+ * 构造树型结构数据
+ * @param {*} data 数据源
+ * @param {*} id id字段 默认 'id'
+ * @param {*} parentId 父节点字段 默认 'parentId'
+ * @param {*} children 孩子节点字段 默认 'children'
+ * @param {*} rootId 根Id 默认 0
+ */
+export function handleTree(data:any[], id:string, parentId:string, children:string, rootId:number):any[] {
+ id = id || 'id'
+ parentId = parentId || 'parentId'
+ children = children || 'children'
+ rootId = rootId || 0
+ //对源数据深度克隆
+ const cloneData = JSON.parse(JSON.stringify(data))
+ //循环所有项
+ const treeData = cloneData.filter((father:any) => {
+ let branchArr = cloneData.filter((child:any) => {
+ //返回每一项的子级数组
+ return father[id] === child[parentId]
+ });
+ branchArr.length > 0 ? father[children] = branchArr : '';
+ //返回第一层
+ return father[parentId] === rootId;
+ });
+ return treeData != '' ? treeData : data;
+}
+
+
+// 回显数据字典
+export function selectDictLabel(data:any[], value:string):string {
+ let actions:string[]=[]
+ data.map((item) => {
+ if (item.value == value) {
+ actions.push(item.label);
+ return false;
+ }
+ })
+ return actions.join('');
+}
+
+export function getToken():string{
+ return Session.get('token')
+}
+
+// 日期格式化
+export function parseTime(time:any, pattern:string) {
+ if (arguments.length === 0 || !time) {
+ return null
+ }
+ const format = pattern || '{y}-{m}-{d} {h}:{i}:{s}'
+ let date
+ if (typeof time === 'object') {
+ date = time
+ } else {
+ if ((typeof time === 'string') && (/^[0-9]+$/.test(time))) {
+ time = parseInt(time)
+ } else if (typeof time === 'string') {
+ time = time.replace(new RegExp(/-/gm), '/');
+ }
+ if ((typeof time === 'number') && (time.toString().length === 10)) {
+ time = time * 1000
+ }
+ date = new Date(time)
+ }
+ const formatObj:any = {
+ y: date.getFullYear(),
+ m: date.getMonth() + 1,
+ d: date.getDate(),
+ h: date.getHours(),
+ i: date.getMinutes(),
+ s: date.getSeconds(),
+ a: date.getDay()
+ }
+ const time_str = format.replace(/{(y|m|d|h|i|s|a)+}/g, (result, key) => {
+ let value = formatObj[key]
+ // Note: getDay() returns 0 on Sunday
+ if (key === 'a') { return ['日', '一', '二', '三', '四', '五', '六'][value] }
+ if (result.length > 0 && value < 10) {
+ value = '0' + value
+ }
+ return value || 0
+ })
+ return time_str
+}
diff --git a/src/utils/loading.ts b/src/utils/loading.ts
new file mode 100644
index 0000000..c23fb77
--- /dev/null
+++ b/src/utils/loading.ts
@@ -0,0 +1,42 @@
+import { nextTick } from 'vue';
+import '/@/theme/loading.scss';
+
+/**
+ * 页面全局 Loading
+ * @method start 创建 loading
+ * @method done 移除 loading
+ */
+export const NextLoading = {
+ // 创建 loading
+ start: () => {
+ const bodys: Element = document.body;
+ const div = document.createElement('div');
+ div.setAttribute('class', 'loading-next');
+ const htmls = `
+
+ `;
+ div.innerHTML = htmls;
+ bodys.insertBefore(div, bodys.childNodes[0]);
+ window.nextLoading = true;
+ },
+ // 移除 loading
+ done: () => {
+ nextTick(() => {
+ window.nextLoading = false;
+ const el = document.querySelector('.loading-next');
+ el?.parentNode?.removeChild(el);
+ });
+ },
+};
diff --git a/src/utils/other.ts b/src/utils/other.ts
new file mode 100644
index 0000000..6bb4fbd
--- /dev/null
+++ b/src/utils/other.ts
@@ -0,0 +1,200 @@
+import { nextTick } from 'vue';
+import type { App } from 'vue';
+import * as svg from '@element-plus/icons-vue';
+import router from '/@/router/index';
+import pinia from '/@/stores/index';
+import { storeToRefs } from 'pinia';
+import { useThemeConfig } from '/@/stores/themeConfig';
+import { i18n } from '/@/i18n/index';
+import { Local } from '/@/utils/storage';
+import SvgIcon from '/@/components/svgIcon/index.vue';
+
+/**
+ * 导出全局注册 element plus svg 图标
+ * @param app vue 实例
+ * @description 使用:https://element-plus.gitee.io/zh-CN/component/icon.html
+ */
+export function elSvg(app: App) {
+ const icons = svg as any;
+ for (const i in icons) {
+ app.component(`ele-${icons[i].name}`, icons[i]);
+ }
+ app.component('SvgIcon', SvgIcon);
+}
+
+/**
+ * 设置浏览器标题国际化
+ * @method const title = useTitle(); ==> title()
+ */
+export function useTitle() {
+ const stores = useThemeConfig(pinia);
+ const { themeConfig } = storeToRefs(stores);
+ nextTick(() => {
+ let webTitle = '';
+ let globalTitle: string = themeConfig.value.globalTitle;
+ const { path, meta } = router.currentRoute.value;
+ if (path === '/login') {
+ webTitle = meta.title;
+ } else {
+ webTitle = setTagsViewNameI18n(router.currentRoute.value);
+ }
+ document.title = `${webTitle} - ${globalTitle}` || globalTitle;
+ });
+}
+
+/**
+ * 设置 自定义 tagsView 名称、 自定义 tagsView 名称国际化
+ * @param params 路由 query、params 中的 tagsViewName
+ * @returns 返回当前 tagsViewName 名称
+ */
+export function setTagsViewNameI18n(item: any) {
+ let tagsViewName: any = '';
+ const { query, params, meta } = item;
+ if (query?.tagsViewName || params?.tagsViewName) {
+ if (/\/zh-cn|en|zh-tw\//.test(query?.tagsViewName) || /\/(zh-cn|en|zh-tw)\//.test(params?.tagsViewName)) {
+ // 国际化
+ const urlTagsParams = (query?.tagsViewName && JSON.parse(query?.tagsViewName)) || (params?.tagsViewName && JSON.parse(params?.tagsViewName));
+ tagsViewName = urlTagsParams[i18n.global.locale];
+ } else {
+ // 非国际化
+ tagsViewName = query?.tagsViewName || params?.tagsViewName;
+ }
+ } else {
+ // 非自定义 tagsView 名称
+ tagsViewName = i18n.global.t(meta.title);
+ }
+ return tagsViewName;
+}
+
+/**
+ * 图片懒加载
+ * @param el dom 目标元素
+ * @param arr 列表数据
+ * @description data-xxx 属性用于存储页面或应用程序的私有自定义数据
+ */
+export const lazyImg = (el: any, arr: any) => {
+ const io = new IntersectionObserver((res) => {
+ res.forEach((v: any) => {
+ if (v.isIntersecting) {
+ const { img, key } = v.target.dataset;
+ v.target.src = img;
+ v.target.onload = () => {
+ io.unobserve(v.target);
+ arr[key]['loading'] = false;
+ };
+ }
+ });
+ });
+ nextTick(() => {
+ document.querySelectorAll(el).forEach((img) => io.observe(img));
+ });
+};
+
+/**
+ * 全局组件大小
+ * @returns 返回 `window.localStorage` 中读取的缓存值 `globalComponentSize`
+ */
+export const globalComponentSize = (): string => {
+ const stores = useThemeConfig(pinia);
+ const { themeConfig } = storeToRefs(stores);
+ return Local.get('themeConfig')?.globalComponentSize || themeConfig.value?.globalComponentSize;
+};
+
+/**
+ * 对象深克隆
+ * @param obj 源对象
+ * @returns 克隆后的对象
+ */
+export function deepClone(obj: any) {
+ let newObj: any;
+ try {
+ newObj = obj.push ? [] : {};
+ } catch (error) {
+ newObj = {};
+ }
+ for (let attr in obj) {
+ if (obj[attr] && typeof obj[attr] === 'object') {
+ newObj[attr] = deepClone(obj[attr]);
+ } else {
+ newObj[attr] = obj[attr];
+ }
+ }
+ return newObj;
+}
+
+/**
+ * 判断是否是移动端
+ */
+export function isMobile() {
+ if (
+ navigator.userAgent.match(
+ /('phone|pad|pod|iPhone|iPod|ios|iPad|Android|Mobile|BlackBerry|IEMobile|MQQBrowser|JUC|Fennec|wOSBrowser|BrowserNG|WebOS|Symbian|Windows Phone')/i
+ )
+ ) {
+ return true;
+ } else {
+ return false;
+ }
+}
+
+/**
+ * 判断数组对象中所有属性是否为空,为空则删除当前行对象
+ * @description @感谢大黄
+ * @param list 数组对象
+ * @returns 删除空值后的数组对象
+ */
+export function handleEmpty(list: any) {
+ const arr = [];
+ for (const i in list) {
+ const d = [];
+ for (const j in list[i]) {
+ d.push(list[i][j]);
+ }
+ const leng = d.filter((item) => item === '').length;
+ if (leng !== d.length) {
+ arr.push(list[i]);
+ }
+ }
+ return arr;
+}
+
+/**
+ * 统一批量导出
+ * @method elSvg 导出全局注册 element plus svg 图标
+ * @method useTitle 设置浏览器标题国际化
+ * @method setTagsViewNameI18n 设置 自定义 tagsView 名称、 自定义 tagsView 名称国际化
+ * @method lazyImg 图片懒加载
+ * @method globalComponentSize() element plus 全局组件大小
+ * @method deepClone 对象深克隆
+ * @method isMobile 判断是否是移动端
+ * @method handleEmpty 判断数组对象中所有属性是否为空,为空则删除当前行对象
+ */
+const other = {
+ elSvg: (app: App) => {
+ elSvg(app);
+ },
+ useTitle: () => {
+ useTitle();
+ },
+ setTagsViewNameI18n(route: any) {
+ return setTagsViewNameI18n(route);
+ },
+ lazyImg: (el: any, arr: any) => {
+ lazyImg(el, arr);
+ },
+ globalComponentSize: () => {
+ return globalComponentSize();
+ },
+ deepClone: (obj: any) => {
+ return deepClone(obj);
+ },
+ isMobile: () => {
+ return isMobile();
+ },
+ handleEmpty: (list: any) => {
+ return handleEmpty(list);
+ },
+};
+
+// 统一批量导出
+export default other;
diff --git a/src/utils/request.ts b/src/utils/request.ts
new file mode 100644
index 0000000..341b786
--- /dev/null
+++ b/src/utils/request.ts
@@ -0,0 +1,68 @@
+import axios, { AxiosInstance } from 'axios';
+import { ElMessage, ElMessageBox } from 'element-plus';
+import { Session } from '/@/utils/storage';
+import qs from 'qs';
+
+// 配置新建一个 axios 实例
+const service: AxiosInstance = axios.create({
+ baseURL: import.meta.env.VITE_API_URL,
+ timeout: 50000,
+ headers: { 'Content-Type': 'application/json' },
+ paramsSerializer: {
+ serialize(params) {
+ return qs.stringify(params, { allowDots: true,arrayFormat: 'brackets' });
+ },
+ },
+});
+
+// 添加请求拦截器
+service.interceptors.request.use(
+ (config) => {
+ // 在发送请求之前做些什么 token
+ if (Session.get('token')) {
+ config.headers!['Authorization'] = `Bearer ${Session.get('token')}`;
+ }
+ return config;
+ },
+ (error) => {
+ // 对请求错误做些什么
+ return Promise.reject(error);
+ }
+);
+
+// 添加响应拦截器
+service.interceptors.response.use(
+ (response) => {
+ // 对响应数据做点什么
+ const res = response.data;
+ const code = response.data.code
+ if (code === 401) {
+ ElMessageBox.alert('登录状态已过期,请重新登录', '提示', {confirmButtonText:'确定'})
+ .then(() => {
+ Session.clear(); // 清除浏览器全部临时缓存
+ window.location.href = '/'; // 去登录页
+ })
+ .catch(() => {});
+ } else if (code !== 0) {
+ ElMessage.error(res.message)
+ return Promise.reject(new Error(res.message))
+ } else {
+ return res
+ }
+ },
+ (error) => {
+ // 对响应错误做点什么
+ if (error.message.indexOf('timeout') != -1) {
+ ElMessage.error('网络超时');
+ } else if (error.message == 'Network Error') {
+ ElMessage.error('网络连接错误');
+ } else {
+ if (error.response.data) ElMessage.error(error.response.statusText);
+ else ElMessage.error('接口路径找不到');
+ }
+ return Promise.reject(error);
+ }
+);
+
+// 导出 axios 实例
+export default service;
diff --git a/src/utils/setIconfont.ts b/src/utils/setIconfont.ts
new file mode 100644
index 0000000..0ecbb2a
--- /dev/null
+++ b/src/utils/setIconfont.ts
@@ -0,0 +1,48 @@
+// 字体图标 url
+const cssCdnUrlList: Array = [
+ import.meta.env.BASE_URL+'at.alicdn.com/t/font_2298093_y6u00apwst.css',
+ import.meta.env.BASE_URL+'netdna.bootstrapcdn.com/css/font-awesome.min.css',
+];
+// 第三方 js url
+const jsCdnUrlList: Array = [];
+
+// 动态批量设置字体图标
+export function setCssCdn() {
+ if (cssCdnUrlList.length <= 0) return false;
+ cssCdnUrlList.map((v) => {
+ let link = document.createElement('link');
+ link.rel = 'stylesheet';
+ link.href = v;
+ link.crossOrigin = 'anonymous';
+ document.getElementsByTagName('head')[0].appendChild(link);
+ });
+}
+
+// 动态批量设置第三方js
+export function setJsCdn() {
+ if (jsCdnUrlList.length <= 0) return false;
+ jsCdnUrlList.map((v) => {
+ let link = document.createElement('script');
+ link.src = v;
+ document.body.appendChild(link);
+ });
+}
+
+/**
+ * 批量设置字体图标、动态js
+ * @method cssCdn 动态批量设置字体图标
+ * @method jsCdn 动态批量设置第三方js
+ */
+const setIntroduction = {
+ // 设置css
+ cssCdn: () => {
+ setCssCdn();
+ },
+ // 设置js
+ jsCdn: () => {
+ setJsCdn();
+ },
+};
+
+// 导出函数方法
+export default setIntroduction;
diff --git a/src/utils/storage.ts b/src/utils/storage.ts
new file mode 100644
index 0000000..a983f80
--- /dev/null
+++ b/src/utils/storage.ts
@@ -0,0 +1,59 @@
+import Cookies from 'js-cookie';
+
+/**
+ * window.localStorage 浏览器永久缓存
+ * @method set 设置永久缓存
+ * @method get 获取永久缓存
+ * @method remove 移除永久缓存
+ * @method clear 移除全部永久缓存
+ */
+export const Local = {
+ // 设置永久缓存
+ set(key: string, val: any) {
+ window.localStorage.setItem(key, JSON.stringify(val));
+ },
+ // 获取永久缓存
+ get(key: string) {
+ let json: any = window.localStorage.getItem(key);
+ return JSON.parse(json);
+ },
+ // 移除永久缓存
+ remove(key: string) {
+ window.localStorage.removeItem(key);
+ },
+ // 移除全部永久缓存
+ clear() {
+ window.localStorage.clear();
+ },
+};
+
+/**
+ * window.sessionStorage 浏览器临时缓存
+ * @method set 设置临时缓存
+ * @method get 获取临时缓存
+ * @method remove 移除临时缓存
+ * @method clear 移除全部临时缓存
+ */
+export const Session = {
+ // 设置临时缓存
+ set(key: string, val: any) {
+ if (key === 'token') return Cookies.set(key, val);
+ window.sessionStorage.setItem(key, JSON.stringify(val));
+ },
+ // 获取临时缓存
+ get(key: string) {
+ if (key === 'token') return Cookies.get(key);
+ let json: any = window.sessionStorage.getItem(key);
+ return JSON.parse(json);
+ },
+ // 移除临时缓存
+ remove(key: string) {
+ if (key === 'token') return Cookies.remove(key);
+ window.sessionStorage.removeItem(key);
+ },
+ // 移除全部临时缓存
+ clear() {
+ Cookies.remove('token');
+ window.sessionStorage.clear();
+ },
+};
diff --git a/src/utils/theme.ts b/src/utils/theme.ts
new file mode 100644
index 0000000..5561e64
--- /dev/null
+++ b/src/utils/theme.ts
@@ -0,0 +1,59 @@
+import { ElMessage } from 'element-plus';
+
+/**
+ * hex颜色转rgb颜色
+ * @param str 颜色值字符串
+ * @returns 返回处理后的颜色值
+ */
+export function hexToRgb(str: any) {
+ let hexs: any = '';
+ let reg = /^\#?[0-9A-Fa-f]{6}$/;
+ if (!reg.test(str)) return ElMessage.warning('输入错误的hex');
+ str = str.replace('#', '');
+ hexs = str.match(/../g);
+ for (let i = 0; i < 3; i++) hexs[i] = parseInt(hexs[i], 16);
+ return hexs;
+}
+
+/**
+ * rgb颜色转Hex颜色
+ * @param r 代表红色
+ * @param g 代表绿色
+ * @param b 代表蓝色
+ * @returns 返回处理后的颜色值
+ */
+export function rgbToHex(r: any, g: any, b: any) {
+ let reg = /^\d{1,3}$/;
+ if (!reg.test(r) || !reg.test(g) || !reg.test(b)) return ElMessage.warning('输入错误的rgb颜色值');
+ let hexs = [r.toString(16), g.toString(16), b.toString(16)];
+ for (let i = 0; i < 3; i++) if (hexs[i].length == 1) hexs[i] = `0${hexs[i]}`;
+ return `#${hexs.join('')}`;
+}
+
+/**
+ * 加深颜色值
+ * @param color 颜色值字符串
+ * @param level 加深的程度,限0-1之间
+ * @returns 返回处理后的颜色值
+ */
+export function getDarkColor(color: string, level: number) {
+ let reg = /^\#?[0-9A-Fa-f]{6}$/;
+ if (!reg.test(color)) return ElMessage.warning('输入错误的hex颜色值');
+ let rgb = hexToRgb(color);
+ for (let i = 0; i < 3; i++) rgb[i] = Math.floor(rgb[i] * (1 - level));
+ return rgbToHex(rgb[0], rgb[1], rgb[2]);
+}
+
+/**
+ * 变浅颜色值
+ * @param color 颜色值字符串
+ * @param level 加深的程度,限0-1之间
+ * @returns 返回处理后的颜色值
+ */
+export function getLightColor(color: string, level: number) {
+ let reg = /^\#?[0-9A-Fa-f]{6}$/;
+ if (!reg.test(color)) return ElMessage.warning('输入错误的hex颜色值');
+ let rgb = hexToRgb(color);
+ for (let i = 0; i < 3; i++) rgb[i] = Math.floor((255 - rgb[i]) * level + rgb[i]);
+ return rgbToHex(rgb[0], rgb[1], rgb[2]);
+}
diff --git a/src/utils/toolsValidate.ts b/src/utils/toolsValidate.ts
new file mode 100644
index 0000000..f2cb9d6
--- /dev/null
+++ b/src/utils/toolsValidate.ts
@@ -0,0 +1,370 @@
+/**
+ * 2020.11.29 lyt 整理
+ * 工具类集合,适用于平时开发
+ * 新增多行注释信息,鼠标放到方法名即可查看
+ */
+
+/**
+ * 验证百分比(不可以小数)
+ * @param val 当前值字符串
+ * @returns 返回处理后的字符串
+ */
+export function verifyNumberPercentage(val: string): string {
+ // 匹配空格
+ let v = val.replace(/(^\s*)|(\s*$)/g, '');
+ // 只能是数字和小数点,不能是其他输入
+ v = v.replace(/[^\d]/g, '');
+ // 不能以0开始
+ v = v.replace(/^0/g, '');
+ // 数字超过100,赋值成最大值100
+ v = v.replace(/^[1-9]\d\d{1,3}$/, '100');
+ // 返回结果
+ return v;
+}
+
+/**
+ * 验证百分比(可以小数)
+ * @param val 当前值字符串
+ * @returns 返回处理后的字符串
+ */
+export function verifyNumberPercentageFloat(val: string): string {
+ let v = verifyNumberIntegerAndFloat(val);
+ // 数字超过100,赋值成最大值100
+ v = v.replace(/^[1-9]\d\d{1,3}$/, '100');
+ // 超过100之后不给再输入值
+ v = v.replace(/^100\.$/, '100');
+ // 返回结果
+ return v;
+}
+
+/**
+ * 小数或整数(不可以负数)
+ * @param val 当前值字符串
+ * @returns 返回处理后的字符串
+ */
+export function verifyNumberIntegerAndFloat(val: string) {
+ // 匹配空格
+ let v = val.replace(/(^\s*)|(\s*$)/g, '');
+ // 只能是数字和小数点,不能是其他输入
+ v = v.replace(/[^\d.]/g, '');
+ // 以0开始只能输入一个
+ v = v.replace(/^0{2}$/g, '0');
+ // 保证第一位只能是数字,不能是点
+ v = v.replace(/^\./g, '');
+ // 小数只能出现1位
+ v = v.replace('.', '$#$').replace(/\./g, '').replace('$#$', '.');
+ // 小数点后面保留2位
+ v = v.replace(/^(\-)*(\d+)\.(\d\d).*$/, '$1$2.$3');
+ // 返回结果
+ return v;
+}
+
+/**
+ * 正整数验证
+ * @param val 当前值字符串
+ * @returns 返回处理后的字符串
+ */
+export function verifiyNumberInteger(val: string) {
+ // 匹配空格
+ let v = val.replace(/(^\s*)|(\s*$)/g, '');
+ // 去掉 '.' , 防止贴贴的时候出现问题 如 0.1.12.12
+ v = v.replace(/[\.]*/g, '');
+ // 去掉以 0 开始后面的数, 防止贴贴的时候出现问题 如 00121323
+ v = v.replace(/(^0[\d]*)$/g, '0');
+ // 首位是0,只能出现一次
+ v = v.replace(/^0\d$/g, '0');
+ // 只匹配数字
+ v = v.replace(/[^\d]/g, '');
+ // 返回结果
+ return v;
+}
+
+/**
+ * 去掉中文及空格
+ * @param val 当前值字符串
+ * @returns 返回处理后的字符串
+ */
+export function verifyCnAndSpace(val: string) {
+ // 匹配中文与空格
+ let v = val.replace(/[\u4e00-\u9fa5\s]+/g, '');
+ // 匹配空格
+ v = v.replace(/(^\s*)|(\s*$)/g, '');
+ // 返回结果
+ return v;
+}
+
+/**
+ * 去掉英文及空格
+ * @param val 当前值字符串
+ * @returns 返回处理后的字符串
+ */
+export function verifyEnAndSpace(val: string) {
+ // 匹配英文与空格
+ let v = val.replace(/[a-zA-Z]+/g, '');
+ // 匹配空格
+ v = v.replace(/(^\s*)|(\s*$)/g, '');
+ // 返回结果
+ return v;
+}
+
+/**
+ * 禁止输入空格
+ * @param val 当前值字符串
+ * @returns 返回处理后的字符串
+ */
+export function verifyAndSpace(val: string) {
+ // 匹配空格
+ let v = val.replace(/(^\s*)|(\s*$)/g, '');
+ // 返回结果
+ return v;
+}
+
+/**
+ * 金额用 `,` 区分开
+ * @param val 当前值字符串
+ * @returns 返回处理后的字符串
+ */
+export function verifyNumberComma(val: string) {
+ // 调用小数或整数(不可以负数)方法
+ let v: any = verifyNumberIntegerAndFloat(val);
+ // 字符串转成数组
+ v = v.toString().split('.');
+ // \B 匹配非单词边界,两边都是单词字符或者两边都是非单词字符
+ v[0] = v[0].replace(/\B(?=(\d{3})+(?!\d))/g, ',');
+ // 数组转字符串
+ v = v.join('.');
+ // 返回结果
+ return v;
+}
+
+/**
+ * 匹配文字变色(搜索时)
+ * @param val 当前值字符串
+ * @param text 要处理的字符串值
+ * @param color 搜索到时字体高亮颜色
+ * @returns 返回处理后的字符串
+ */
+export function verifyTextColor(val: string, text = '', color = 'red') {
+ // 返回内容,添加颜色
+ let v = text.replace(new RegExp(val, 'gi'), `${val}`);
+ // 返回结果
+ return v;
+}
+
+/**
+ * 数字转中文大写
+ * @param val 当前值字符串
+ * @param unit 默认:仟佰拾亿仟佰拾万仟佰拾元角分
+ * @returns 返回处理后的字符串
+ */
+export function verifyNumberCnUppercase(val: any, unit = '仟佰拾亿仟佰拾万仟佰拾元角分', v = '') {
+ // 当前内容字符串添加 2个0,为什么??
+ val += '00';
+ // 返回某个指定的字符串值在字符串中首次出现的位置,没有出现,则该方法返回 -1
+ let lookup = val.indexOf('.');
+ // substring:不包含结束下标内容,substr:包含结束下标内容
+ if (lookup >= 0) val = val.substring(0, lookup) + val.substr(lookup + 1, 2);
+ // 根据内容 val 的长度,截取返回对应大写
+ unit = unit.substr(unit.length - val.length);
+ // 循环截取拼接大写
+ for (let i = 0; i < val.length; i++) {
+ v += '零壹贰叁肆伍陆柒捌玖'.substr(val.substr(i, 1), 1) + unit.substr(i, 1);
+ }
+ // 正则处理
+ v = v
+ .replace(/零角零分$/, '整')
+ .replace(/零[仟佰拾]/g, '零')
+ .replace(/零{2,}/g, '零')
+ .replace(/零([亿|万])/g, '$1')
+ .replace(/零+元/, '元')
+ .replace(/亿零{0,3}万/, '亿')
+ .replace(/^元/, '零元');
+ // 返回结果
+ return v;
+}
+
+/**
+ * 手机号码
+ * @param val 当前值字符串
+ * @returns 返回 true: 手机号码正确
+ */
+export function verifyPhone(val: string) {
+ // false: 手机号码不正确
+ if (!/^((12[0-9])|(13[0-9])|(14[5|7])|(15([0-3]|[5-9]))|(18[0|1,5-9]))\d{8}$/.test(val)) return false;
+ // true: 手机号码正确
+ else return true;
+}
+
+/**
+ * 国内电话号码
+ * @param val 当前值字符串
+ * @returns 返回 true: 国内电话号码正确
+ */
+export function verifyTelPhone(val: string) {
+ // false: 国内电话号码不正确
+ if (!/\d{3}-\d{8}|\d{4}-\d{7}/.test(val)) return false;
+ // true: 国内电话号码正确
+ else return true;
+}
+
+/**
+ * 登录账号 (字母开头,允许5-16字节,允许字母数字下划线)
+ * @param val 当前值字符串
+ * @returns 返回 true: 登录账号正确
+ */
+export function verifyAccount(val: string) {
+ // false: 登录账号不正确
+ if (!/^[a-zA-Z][a-zA-Z0-9_]{4,15}$/.test(val)) return false;
+ // true: 登录账号正确
+ else return true;
+}
+
+/**
+ * 密码 (以字母开头,长度在6~16之间,只能包含字母、数字和下划线)
+ * @param val 当前值字符串
+ * @returns 返回 true: 密码正确
+ */
+export function verifyPassword(val: string) {
+ // false: 密码不正确
+ if (!/^[a-zA-Z]\w{5,15}$/.test(val)) return false;
+ // true: 密码正确
+ else return true;
+}
+
+/**
+ * 强密码 (字母+数字+特殊字符,长度在6-16之间)
+ * @param val 当前值字符串
+ * @returns 返回 true: 强密码正确
+ */
+export function verifyPasswordPowerful(val: string) {
+ // false: 强密码不正确
+ if (!/^(?![a-zA-z]+$)(?!\d+$)(?![!@#$%^&\.*]+$)(?![a-zA-z\d]+$)(?![a-zA-z!@#$%^&\.*]+$)(?![\d!@#$%^&\.*]+$)[a-zA-Z\d!@#$%^&\.*]{6,16}$/.test(val))
+ return false;
+ // true: 强密码正确
+ else return true;
+}
+
+/**
+ * 密码强度
+ * @param val 当前值字符串
+ * @description 弱:纯数字,纯字母,纯特殊字符
+ * @description 中:字母+数字,字母+特殊字符,数字+特殊字符
+ * @description 强:字母+数字+特殊字符
+ * @returns 返回处理后的字符串:弱、中、强
+ */
+export function verifyPasswordStrength(val: string) {
+ let v = '';
+ // 弱:纯数字,纯字母,纯特殊字符
+ if (/^(?:\d+|[a-zA-Z]+|[!@#$%^&\.*]+){6,16}$/.test(val)) v = '弱';
+ // 中:字母+数字,字母+特殊字符,数字+特殊字符
+ if (/^(?![a-zA-z]+$)(?!\d+$)(?![!@#$%^&\.*]+$)[a-zA-Z\d!@#$%^&\.*]{6,16}$/.test(val)) v = '中';
+ // 强:字母+数字+特殊字符
+ if (/^(?![a-zA-z]+$)(?!\d+$)(?![!@#$%^&\.*]+$)(?![a-zA-z\d]+$)(?![a-zA-z!@#$%^&\.*]+$)(?![\d!@#$%^&\.*]+$)[a-zA-Z\d!@#$%^&\.*]{6,16}$/.test(val))
+ v = '强';
+ // 返回结果
+ return v;
+}
+
+/**
+ * IP地址
+ * @param val 当前值字符串
+ * @returns 返回 true: IP地址正确
+ */
+export function verifyIPAddress(val: string) {
+ // false: IP地址不正确
+ if (
+ !/^(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])$/.test(
+ val
+ )
+ )
+ return false;
+ // true: IP地址正确
+ else return true;
+}
+
+/**
+ * 邮箱
+ * @param val 当前值字符串
+ * @returns 返回 true: 邮箱正确
+ */
+export function verifyEmail(val: string) {
+ // false: 邮箱不正确
+ if (
+ !/^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/.test(
+ val
+ )
+ )
+ return false;
+ // true: 邮箱正确
+ else return true;
+}
+
+/**
+ * 身份证
+ * @param val 当前值字符串
+ * @returns 返回 true: 身份证正确
+ */
+export function verifyIdCard(val: string) {
+ // false: 身份证不正确
+ if (!/^[1-9]\d{5}(18|19|20)\d{2}((0[1-9])|(1[0-2]))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$/.test(val)) return false;
+ // true: 身份证正确
+ else return true;
+}
+
+/**
+ * 姓名
+ * @param val 当前值字符串
+ * @returns 返回 true: 姓名正确
+ */
+export function verifyFullName(val: string) {
+ // false: 姓名不正确
+ if (!/^[\u4e00-\u9fa5]{1,6}(·[\u4e00-\u9fa5]{1,6}){0,2}$/.test(val)) return false;
+ // true: 姓名正确
+ else return true;
+}
+
+/**
+ * 邮政编码
+ * @param val 当前值字符串
+ * @returns 返回 true: 邮政编码正确
+ */
+export function verifyPostalCode(val: string) {
+ // false: 邮政编码不正确
+ if (!/^[1-9][0-9]{5}$/.test(val)) return false;
+ // true: 邮政编码正确
+ else return true;
+}
+
+/**
+ * url 处理
+ * @param val 当前值字符串
+ * @returns 返回 true: url 正确
+ */
+export function verifyUrl(val: string) {
+ // false: url不正确
+ if (
+ !/^(?:(?:(?:https?|ftp):)?\/\/)(?:\S+(?::\S*)?@)?(?:(?!(?:10|127)(?:\.\d{1,3}){3})(?!(?:169\.254|192\.168)(?:\.\d{1,3}){2})(?!172\.(?:1[6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z\u00a1-\uffff0-9]-*)*[a-z\u00a1-\uffff0-9]+)(?:\.(?:[a-z\u00a1-\uffff0-9]-*)*[a-z\u00a1-\uffff0-9]+)*(?:\.(?:[a-z\u00a1-\uffff]{2,})).?)(?::\d{2,5})?(?:[/?#]\S*)?$/i.test(
+ val
+ )
+ )
+ return false;
+ // true: url正确
+ else return true;
+}
+
+/**
+ * 车牌号
+ * @param val 当前值字符串
+ * @returns 返回 true:车牌号正确
+ */
+export function verifyCarNum(val: string) {
+ // false: 车牌号不正确
+ if (
+ !/^(([京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领][A-Z](([0-9]{5}[DF])|([DF]([A-HJ-NP-Z0-9])[0-9]{4})))|([京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领][A-Z][A-HJ-NP-Z0-9]{4}[A-HJ-NP-Z0-9挂学警港澳使领]))$/.test(
+ val
+ )
+ )
+ return false;
+ // true:车牌号正确
+ else return true;
+}
diff --git a/src/utils/wartermark.ts b/src/utils/wartermark.ts
new file mode 100644
index 0000000..b897ed1
--- /dev/null
+++ b/src/utils/wartermark.ts
@@ -0,0 +1,47 @@
+// 页面添加水印效果
+const setWatermark = (str: string) => {
+ const id = '1.23452384164.123412416';
+ if (document.getElementById(id) !== null) document.body.removeChild(document.getElementById(id));
+ const can = document.createElement('canvas');
+ can.width = 200;
+ can.height = 130;
+ const cans: any = can.getContext('2d');
+ cans.rotate((-20 * Math.PI) / 180);
+ cans.font = '12px Vedana';
+ cans.fillStyle = 'rgba(200, 200, 200, 0.30)';
+ cans.textBaseline = 'Middle';
+ cans.fillText(str, can.width / 10, can.height / 2);
+ const div = document.createElement('div');
+ div.id = id;
+ div.style.pointerEvents = 'none';
+ div.style.top = '15px';
+ div.style.left = '0px';
+ div.style.position = 'fixed';
+ div.style.zIndex = '10000000';
+ div.style.width = `${document.documentElement.clientWidth}px`;
+ div.style.height = `${document.documentElement.clientHeight}px`;
+ div.style.background = `url(${can.toDataURL('image/png')}) left top repeat`;
+ document.body.appendChild(div);
+ return id;
+};
+
+/**
+ * 页面添加水印效果
+ * @method set 设置水印
+ * @method del 删除水印
+ */
+const watermark = {
+ // 设置水印
+ set: (str: string) => {
+ let id = setWatermark(str);
+ if (document.getElementById(id) === null) id = setWatermark(str);
+ },
+ // 删除水印
+ del: () => {
+ let id = '1.23452384164.123412416';
+ if (document.getElementById(id) !== null) document.body.removeChild(document.getElementById(id));
+ },
+};
+
+// 导出方法
+export default watermark;
diff --git a/src/views/chart/chart.scss b/src/views/chart/chart.scss
new file mode 100644
index 0000000..9ba92cb
--- /dev/null
+++ b/src/views/chart/chart.scss
@@ -0,0 +1,434 @@
+.chart-scrollbar {
+ .chart-warp {
+ display: flex;
+ flex-direction: column;
+ height: 100%;
+ .chart-warp-bottom {
+ flex: 1;
+ overflow: hidden;
+ display: flex;
+ .big-data-down-left,
+ .big-data-down-right {
+ width: 30%;
+ display: flex;
+ flex-direction: column;
+ .flex-warp-item {
+ padding: 0 7.5px 15px 15px;
+ width: 100%;
+ height: 33.33%;
+ .flex-warp-item-box {
+ width: 100%;
+ height: 100%;
+ background: var(--el-color-white);
+ border: 1px solid var(--el-border-color-lighter);
+ border-radius: 4px;
+ display: flex;
+ flex-direction: column;
+ padding: 15px;
+ transition: all ease 0.3s;
+ &:hover {
+ box-shadow: 0 2px 12px 0 rgb(0 0 0 / 10%);
+ transition: all ease 0.3s;
+ }
+ .flex-title {
+ margin-bottom: 15px;
+ display: flex;
+ justify-content: space-between;
+ .flex-title-small {
+ font-size: 12px;
+ }
+ }
+ .flex-content {
+ flex: 1;
+ font-size: 12px;
+ }
+ .flex-content-overflow {
+ overflow: hidden;
+ }
+ }
+ }
+ }
+ .big-data-down-left {
+ color: var(--el-text-color-primary);
+ .sky {
+ display: flex;
+ align-items: center;
+ .sky-left {
+ font-size: 30px;
+ }
+ .sky-center {
+ flex: 1;
+ overflow: hidden;
+ padding: 0 10px;
+ font {
+ margin-right: 15px;
+ }
+ .span {
+ background: #22bc76;
+ border-radius: 2px;
+ padding: 0 5px;
+ color: var(--el-color-white);
+ }
+ }
+ .sky-right {
+ span {
+ font-size: 30px;
+ }
+ font {
+ font-size: 20px;
+ }
+ }
+ }
+ .sky-dd {
+ .sky-dl {
+ display: flex;
+ align-items: center;
+ height: 28px;
+ overflow: hidden;
+ div {
+ flex: 1;
+ overflow: hidden;
+ i {
+ font-size: 14px;
+ }
+ }
+ .tip {
+ overflow: hidden;
+ white-space: nowrap;
+ text-overflow: ellipsis;
+ }
+ }
+ .sky-dl-first {
+ color: var(--el-color-primary);
+ }
+ }
+ .d-states {
+ display: flex;
+ .d-states-item {
+ flex: 1;
+ display: flex;
+ align-items: center;
+ overflow: hidden;
+ i {
+ font-size: 20px;
+ height: 33px;
+ width: 33px;
+ line-height: 33px;
+ text-align: center;
+ border-radius: 100%;
+ flex-shrink: 1;
+ color: var(--el-color-white);
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ }
+ .i-bg1 {
+ background: #22bc76;
+ }
+ .i-bg2 {
+ background: #e2356d;
+ }
+ .i-bg3 {
+ background: #43bbef;
+ }
+ .d-states-flex {
+ overflow: hidden;
+ padding: 0 10px 0;
+ .d-states-item-label {
+ color: var(--el-color-primary);
+ overflow: hidden;
+ white-space: nowrap;
+ text-overflow: ellipsis;
+ }
+ .d-states-item-value {
+ font-size: 14px;
+ text-align: center;
+ margin-top: 3px;
+ color: var(--el-color-primary);
+ }
+ }
+ }
+ }
+ .d-btn {
+ margin-top: 5px;
+ .d-btn-item {
+ border: 1px solid var(--el-color-primary);
+ display: flex;
+ width: 100%;
+ border-radius: 35px;
+ align-items: center;
+ padding: 5px;
+ margin-top: 15px;
+ cursor: pointer;
+ transition: all ease 0.3s;
+ color: var(--el-color-primary);
+ .d-btn-item-left {
+ font-size: 20px;
+ border: 1px solid var(--el-color-primary);
+ width: 25px;
+ height: 25px;
+ line-height: 25px;
+ border-radius: 100%;
+ text-align: center;
+ font-size: 14px;
+ }
+ .d-btn-item-center {
+ padding: 0 10px;
+ flex: 1;
+ }
+ .d-btn-item-eight {
+ text-align: right;
+ padding-right: 10px;
+ }
+ }
+ }
+ }
+ .big-data-down-center {
+ width: 40%;
+ display: flex;
+ flex-direction: column;
+ .big-data-down-center-one {
+ height: 66.67%;
+ padding: 0 7.5px 15px;
+ .big-data-down-center-one-content {
+ height: 100%;
+ background: var(--el-color-white);
+ padding: 15px;
+ border: 1px solid var(--el-border-color-lighter);
+ border-radius: 4px;
+ transition: all ease 0.3s;
+ &:hover {
+ box-shadow: 0 2px 12px 0 rgb(0 0 0 / 10%);
+ transition: all ease 0.3s;
+ }
+ }
+ }
+ .big-data-down-center-two {
+ padding: 0 7.5px 15px;
+ height: 33.33%;
+ .flex-warp-item-box {
+ width: 100%;
+ height: 100%;
+ background: var(--el-color-white);
+ display: flex;
+ flex-direction: column;
+ padding: 15px;
+ border: 1px solid var(--el-border-color-lighter);
+ border-radius: 4px;
+ transition: all ease 0.3s;
+ &:hover {
+ box-shadow: 0 2px 12px 0 rgb(0 0 0 / 10%);
+ transition: all ease 0.3s;
+ }
+ .flex-title {
+ margin-bottom: 15px;
+ color: var(--el-text-color-primary);
+ display: flex;
+ justify-content: space-between;
+ .flex-title-small {
+ font-size: 12px;
+ }
+ }
+ .flex-content {
+ flex: 1;
+ font-size: 12px;
+ display: flex;
+ height: calc(100% - 30px);
+ .flex-content-left {
+ display: flex;
+ flex-wrap: wrap;
+ width: 120px;
+ height: 100%;
+ .monitor-item {
+ width: 50%;
+ display: flex;
+ align-items: center;
+ .monitor-wave {
+ cursor: pointer;
+ width: 40px;
+ height: 40px;
+ position: relative;
+ background-color: var(--el-color-primary);
+ border-radius: 50%;
+ overflow: hidden;
+ text-align: center;
+ &::before,
+ &::after {
+ content: '';
+ position: absolute;
+ left: 50%;
+ width: 40px;
+ height: 40px;
+ background: #f4f4f4;
+ animation: roateOne 10s linear infinite;
+ transform: translateX(-50%);
+ z-index: 1;
+ }
+ &::before {
+ bottom: 10px;
+ border-radius: 60%;
+ }
+ &::after {
+ bottom: 8px;
+ opacity: 0.7;
+ border-radius: 37%;
+ }
+ .monitor-z-index {
+ position: relative;
+ z-index: 2;
+ color: var(--el-color-primary);
+ display: flex;
+ align-items: center;
+ height: 100%;
+ justify-content: center;
+ }
+ }
+ @keyframes roateOne {
+ 0% {
+ transform: translate(-50%, 0) rotateZ(0deg);
+ }
+ 50% {
+ transform: translate(-50%, -2%) rotateZ(180deg);
+ }
+ 100% {
+ transform: translate(-50%, 0%) rotateZ(360deg);
+ }
+ }
+ .monitor-active {
+ background-color: #22bc76;
+ .monitor-z-index {
+ color: #22bc76;
+ }
+ }
+ }
+ }
+ .flex-content-right {
+ flex: 1;
+ }
+ }
+ }
+ }
+ }
+ .big-data-down-right {
+ .flex-warp-item {
+ padding: 0 15px 15px 7.5px;
+ .flex-title {
+ color: var(--el-text-color-primary);
+ }
+ .flex-content {
+ display: flex;
+ flex-direction: column;
+ .task {
+ display: flex;
+ height: 45px;
+ .task-item {
+ flex: 1;
+ color: var(--el-color-white);
+ display: flex;
+ justify-content: center;
+ .task-item-box {
+ position: relative;
+ width: 45px;
+ height: 45px;
+ overflow: hidden;
+ border-radius: 100%;
+ z-index: 0;
+ display: flex;
+ align-items: center;
+ flex-direction: column;
+ justify-content: center;
+ box-shadow: 0 10px 12px 0 rgba(0, 0, 0, 0.3);
+ &::before {
+ content: '';
+ position: absolute;
+ z-index: -2;
+ left: -50%;
+ top: -50%;
+ width: 200%;
+ height: 200%;
+ background-repeat: no-repeat;
+ background-size: 50% 50%, 50% 50%;
+ background-position: 0 0, 100% 0, 100% 100%, 0 100%;
+ background-image: linear-gradient(#19d4ae, #19d4ae), linear-gradient(#5ab1ef, #5ab1ef), linear-gradient(#fa6e86, #fa6e86),
+ linear-gradient(#ffb980, #ffb980);
+ animation: rotate 2s linear infinite;
+ }
+ &::after {
+ content: '';
+ position: absolute;
+ z-index: -1;
+ left: 1px;
+ top: 1px;
+ width: calc(100% - 2px);
+ height: calc(100% - 2px);
+ border-radius: 100%;
+ }
+ .task-item-value {
+ text-align: center;
+ font-size: 14px;
+ font-weight: bold;
+ }
+ .task-item-label {
+ text-align: center;
+ }
+ }
+ .task1 {
+ &::after {
+ background: #5492be;
+ }
+ }
+ .task2 {
+ &::after {
+ background: #43a177;
+ }
+ }
+ .task3 {
+ &::after {
+ background: #a76077;
+ }
+ }
+ }
+ .task-first-item {
+ flex-direction: column;
+ text-align: center;
+ color: var(--el-color-primary);
+ .task-first {
+ font-size: 20px;
+ }
+ }
+ }
+ .progress {
+ color: var(--el-text-color-primary);
+ display: flex;
+ flex-direction: column;
+ flex: 1;
+ justify-content: space-between;
+ margin-top: 15px;
+ .progress-item {
+ height: 33.33%;
+ display: flex;
+ align-items: center;
+ .progress-box {
+ flex: 1;
+ width: 100%;
+ margin-left: 10px;
+ :deep(.el-progress__text) {
+ color: var(--el-text-color-primary);
+ font-size: 12px !important;
+ text-align: right;
+ }
+ :deep(.el-progress-bar__outer) {
+ background-color: rgba(0, 0, 0, 0.1) !important;
+ }
+ :deep(.el-progress-bar) {
+ margin-right: -22px !important;
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+}
diff --git a/src/views/chart/chart.ts b/src/views/chart/chart.ts
new file mode 100644
index 0000000..6d10fd6
--- /dev/null
+++ b/src/views/chart/chart.ts
@@ -0,0 +1,59 @@
+/**
+ * sky 天气
+ * @returns 返回模拟数据
+ */
+export const skyList = [
+ {
+ v1: '时间',
+ v2: '天气',
+ v3: '温度',
+ v5: '降水',
+ v7: '风力',
+ type: 'title',
+ },
+ {
+ v1: '今天',
+ v2: 'ele-Sunny',
+ v3: '20°/26°',
+ v5: '50%',
+ v7: '13m/s',
+ },
+ {
+ v1: '明天',
+ v2: 'ele-Lightning',
+ v3: '20°/26°',
+ v5: '50%',
+ v7: '13m/s',
+ },
+];
+
+/**
+ * 当前设置状态
+ * @returns 返回模拟数据
+ */
+export const dBtnList = [
+ {
+ v2: '阳光玫瑰种植',
+ v3: '126天',
+ v4: '设备在线',
+ },
+];
+
+/**
+ * 当前设备监测
+ * @returns 返回模拟数据
+ */
+export const chartData4List = [
+ {
+ label: '温度',
+ },
+ {
+ label: '光照',
+ },
+ {
+ label: '湿度',
+ },
+ {
+ label: '风力',
+ },
+];
diff --git a/src/views/chart/head.vue b/src/views/chart/head.vue
new file mode 100644
index 0000000..82842e8
--- /dev/null
+++ b/src/views/chart/head.vue
@@ -0,0 +1,107 @@
+
+
+
+
+ {{ time.txt }}
+
+
+ 智慧农业系统平台
+
+
+
+
+
+
+
diff --git a/src/views/chart/index.vue b/src/views/chart/index.vue
new file mode 100644
index 0000000..a133fdf
--- /dev/null
+++ b/src/views/chart/index.vue
@@ -0,0 +1,492 @@
+
+
+
+
+
+
+
diff --git a/src/views/demo/map2.ts b/src/views/demo/map2.ts
new file mode 100644
index 0000000..fcd7490
--- /dev/null
+++ b/src/views/demo/map2.ts
@@ -0,0 +1,16 @@
+import {defineComponent,h} from "vue";
+
+export default defineComponent({
+ name:"baiduMap",
+ props:{
+ src:{
+ type:String,
+ default:'',
+ }
+ },
+ setup(prop){
+ return ()=>{
+ return h('script',{src:prop.src,type:'text/javascript'})
+ }
+ },
+})
diff --git a/src/views/error/401.vue b/src/views/error/401.vue
new file mode 100644
index 0000000..711fa25
--- /dev/null
+++ b/src/views/error/401.vue
@@ -0,0 +1,118 @@
+
+
+
+
+
+
401
+
{{ $t('message.noAccess.accessTitle') }}
+
{{ $t('message.noAccess.accessMsg') }}
+
+ {{ $t('message.noAccess.accessBtn') }}
+
+
+
+
+

+
+
+
+
+
+
+
+
diff --git a/src/views/error/404.vue b/src/views/error/404.vue
new file mode 100644
index 0000000..3a7ce22
--- /dev/null
+++ b/src/views/error/404.vue
@@ -0,0 +1,115 @@
+
+
+
+
+
+
404
+
{{ $t('message.notFound.foundTitle') }}
+
{{ $t('message.notFound.foundMsg') }}
+
+ {{ $t('message.notFound.foundBtn') }}
+
+
+
+
+

+
+
+
+
+
+
+
+
diff --git a/src/views/fun/clipboard/index.vue b/src/views/fun/clipboard/index.vue
new file mode 100644
index 0000000..a92eed0
--- /dev/null
+++ b/src/views/fun/clipboard/index.vue
@@ -0,0 +1,38 @@
+
+
+
+
+
+ 复制链接
+
+
+
+
+
+
+
diff --git a/src/views/fun/codemirror/index.vue b/src/views/fun/codemirror/index.vue
new file mode 100644
index 0000000..1e0385a
--- /dev/null
+++ b/src/views/fun/codemirror/index.vue
@@ -0,0 +1,58 @@
+
+
+
+
+
diff --git a/src/views/fun/countup/index.vue b/src/views/fun/countup/index.vue
new file mode 100644
index 0000000..267570c
--- /dev/null
+++ b/src/views/fun/countup/index.vue
@@ -0,0 +1,159 @@
+
+
+
+
+
+
+
+
+
{{ v.title }}
+
+
{{ v.tip }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 重置/刷新数值
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/fun/cropper/index.vue b/src/views/fun/cropper/index.vue
new file mode 100644
index 0000000..83ebfc7
--- /dev/null
+++ b/src/views/fun/cropper/index.vue
@@ -0,0 +1,63 @@
+
+
+
+
+
+
+
![]()
+
+
+
+
+
+ 更换头像
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/fun/echartsMap/index.vue b/src/views/fun/echartsMap/index.vue
new file mode 100644
index 0000000..633c673
--- /dev/null
+++ b/src/views/fun/echartsMap/index.vue
@@ -0,0 +1,141 @@
+
+
+
+
+
diff --git a/src/views/fun/echartsMap/mock.ts b/src/views/fun/echartsMap/mock.ts
new file mode 100644
index 0000000..16623c7
--- /dev/null
+++ b/src/views/fun/echartsMap/mock.ts
@@ -0,0 +1,387 @@
+// 地图模拟数据
+export const echartsMapList = [
+ { name: '海门', value: 9 },
+ { name: '鄂尔多斯', value: 12 },
+ { name: '招远', value: 12 },
+ { name: '舟山', value: 12 },
+ { name: '齐齐哈尔', value: 14 },
+ { name: '盐城', value: 15 },
+ { name: '赤峰', value: 16 },
+ { name: '青岛', value: 18 },
+ { name: '乳山', value: 18 },
+ { name: '金昌', value: 19 },
+ { name: '泉州', value: 21 },
+ { name: '莱西', value: 21 },
+ { name: '日照', value: 21 },
+ { name: '胶南', value: 22 },
+ { name: '南通', value: 23 },
+ { name: '拉萨', value: 24 },
+ { name: '云浮', value: 24 },
+ { name: '梅州', value: 25 },
+ { name: '文登', value: 25 },
+ { name: '上海', value: 25 },
+ { name: '攀枝花', value: 25 },
+ { name: '威海', value: 25 },
+ { name: '承德', value: 25 },
+ { name: '厦门', value: 26 },
+ { name: '汕尾', value: 26 },
+ { name: '潮州', value: 26 },
+ { name: '丹东', value: 27 },
+ { name: '太仓', value: 27 },
+ { name: '曲靖', value: 27 },
+ { name: '烟台', value: 28 },
+ { name: '福州', value: 29 },
+ { name: '瓦房店', value: 30 },
+ { name: '即墨', value: 30 },
+ { name: '抚顺', value: 31 },
+ { name: '玉溪', value: 31 },
+ { name: '张家口', value: 31 },
+ { name: '阳泉', value: 31 },
+ { name: '莱州', value: 32 },
+ { name: '湖州', value: 32 },
+ { name: '汕头', value: 32 },
+ { name: '昆山', value: 33 },
+ { name: '宁波', value: 33 },
+ { name: '湛江', value: 33 },
+ { name: '揭阳', value: 34 },
+ { name: '荣成', value: 34 },
+ { name: '连云港', value: 35 },
+ { name: '葫芦岛', value: 35 },
+ { name: '常熟', value: 36 },
+ { name: '东莞', value: 36 },
+ { name: '河源', value: 36 },
+ { name: '淮安', value: 36 },
+ { name: '泰州', value: 36 },
+ { name: '南宁', value: 37 },
+ { name: '营口', value: 37 },
+ { name: '惠州', value: 37 },
+ { name: '江阴', value: 37 },
+ { name: '蓬莱', value: 37 },
+ { name: '韶关', value: 38 },
+ { name: '嘉峪关', value: 38 },
+ { name: '广州', value: 38 },
+ { name: '延安', value: 38 },
+ { name: '太原', value: 39 },
+ { name: '清远', value: 39 },
+ { name: '中山', value: 39 },
+ { name: '昆明', value: 39 },
+ { name: '寿光', value: 40 },
+ { name: '盘锦', value: 40 },
+ { name: '长治', value: 41 },
+ { name: '深圳', value: 360 },
+ { name: '珠海', value: 42 },
+ { name: '宿迁', value: 43 },
+ { name: '咸阳', value: 43 },
+ { name: '铜川', value: 44 },
+ { name: '平度', value: 44 },
+ { name: '佛山', value: 44 },
+ { name: '海口', value: 44 },
+ { name: '江门', value: 45 },
+ { name: '章丘', value: 45 },
+ { name: '肇庆', value: 46 },
+ { name: '大连', value: 47 },
+ { name: '临汾', value: 47 },
+ { name: '吴江', value: 47 },
+ { name: '石嘴山', value: 49 },
+ { name: '沈阳', value: 50 },
+ { name: '苏州', value: 50 },
+ { name: '茂名', value: 50 },
+ { name: '嘉兴', value: 51 },
+ { name: '长春', value: 51 },
+ { name: '胶州', value: 52 },
+ { name: '银川', value: 52 },
+ { name: '张家港', value: 52 },
+ { name: '三门峡', value: 53 },
+ { name: '锦州', value: 54 },
+ { name: '南昌', value: 54 },
+ { name: '柳州', value: 54 },
+ { name: '三亚', value: 54 },
+ { name: '自贡', value: 56 },
+ { name: '吉林', value: 56 },
+ { name: '阳江', value: 57 },
+ { name: '泸州', value: 57 },
+ { name: '西宁', value: 57 },
+ { name: '宜宾', value: 58 },
+ { name: '呼和浩特', value: 58 },
+ { name: '成都', value: 58 },
+ { name: '大同', value: 58 },
+ { name: '镇江', value: 59 },
+ { name: '桂林', value: 59 },
+ { name: '张家界', value: 59 },
+ { name: '宜兴', value: 59 },
+ { name: '北海', value: 60 },
+ { name: '西安', value: 61 },
+ { name: '金坛', value: 62 },
+ { name: '东营', value: 62 },
+ { name: '牡丹江', value: 63 },
+ { name: '遵义', value: 63 },
+ { name: '绍兴', value: 63 },
+ { name: '扬州', value: 64 },
+ { name: '常州', value: 64 },
+ { name: '潍坊', value: 65 },
+ { name: '重庆', value: 66 },
+ { name: '台州', value: 67 },
+ { name: '南京', value: 67 },
+ { name: '滨州', value: 70 },
+ { name: '贵阳', value: 71 },
+ { name: '无锡', value: 71 },
+ { name: '本溪', value: 71 },
+ { name: '克拉玛依', value: 72 },
+ { name: '渭南', value: 72 },
+ { name: '马鞍山', value: 72 },
+ { name: '宝鸡', value: 72 },
+ { name: '焦作', value: 75 },
+ { name: '句容', value: 75 },
+ { name: '北京', value: 79 },
+ { name: '徐州', value: 79 },
+ { name: '衡水', value: 80 },
+ { name: '包头', value: 80 },
+ { name: '绵阳', value: 80 },
+ { name: '乌鲁木齐', value: 84 },
+ { name: '枣庄', value: 84 },
+ { name: '杭州', value: 84 },
+ { name: '淄博', value: 85 },
+ { name: '鞍山', value: 86 },
+ { name: '溧阳', value: 86 },
+ { name: '库尔勒', value: 86 },
+ { name: '安阳', value: 90 },
+ { name: '开封', value: 90 },
+ { name: '济南', value: 92 },
+ { name: '德阳', value: 93 },
+ { name: '温州', value: 95 },
+ { name: '九江', value: 96 },
+ { name: '邯郸', value: 98 },
+ { name: '临安', value: 99 },
+ { name: '兰州', value: 99 },
+ { name: '沧州', value: 100 },
+ { name: '临沂', value: 103 },
+ { name: '南充', value: 104 },
+ { name: '天津', value: 105 },
+ { name: '富阳', value: 106 },
+ { name: '泰安', value: 112 },
+ { name: '诸暨', value: 112 },
+ { name: '郑州', value: 113 },
+ { name: '哈尔滨', value: 114 },
+ { name: '聊城', value: 116 },
+ { name: '芜湖', value: 117 },
+ { name: '唐山', value: 119 },
+ { name: '平顶山', value: 119 },
+ { name: '邢台', value: 119 },
+ { name: '德州', value: 120 },
+ { name: '济宁', value: 120 },
+ { name: '荆州', value: 127 },
+ { name: '宜昌', value: 130 },
+ { name: '义乌', value: 132 },
+ { name: '丽水', value: 133 },
+ { name: '洛阳', value: 134 },
+ { name: '秦皇岛', value: 136 },
+ { name: '株洲', value: 143 },
+ { name: '石家庄', value: 147 },
+ { name: '莱芜', value: 148 },
+ { name: '常德', value: 152 },
+ { name: '保定', value: 153 },
+ { name: '湘潭', value: 154 },
+ { name: '金华', value: 157 },
+ { name: '岳阳', value: 169 },
+ { name: '长沙', value: 175 },
+ { name: '衢州', value: 177 },
+ { name: '廊坊', value: 93 },
+ { name: '菏泽', value: 194 },
+ { name: '合肥', value: 229 },
+ { name: '武汉', value: 273 },
+ { name: '大庆', value: 279 },
+];
+
+// 地图经纬度数据
+export const echartsMapData = {
+ 海门: [121.15, 31.89],
+ 鄂尔多斯: [109.781327, 39.608266],
+ 招远: [120.38, 37.35],
+ 舟山: [122.207216, 29.985295],
+ 齐齐哈尔: [123.97, 47.33],
+ 盐城: [120.13, 33.38],
+ 赤峰: [118.87, 42.28],
+ 青岛: [120.33, 36.07],
+ 乳山: [121.52, 36.89],
+ 金昌: [102.188043, 38.520089],
+ 泉州: [118.58, 24.93],
+ 莱西: [120.53, 36.86],
+ 日照: [119.46, 35.42],
+ 胶南: [119.97, 35.88],
+ 南通: [121.05, 32.08],
+ 拉萨: [91.11, 29.97],
+ 云浮: [112.02, 22.93],
+ 梅州: [116.1, 24.55],
+ 文登: [122.05, 37.2],
+ 上海: [121.48, 31.22],
+ 攀枝花: [101.718637, 26.582347],
+ 威海: [122.1, 37.5],
+ 承德: [117.93, 40.97],
+ 厦门: [118.1, 24.46],
+ 汕尾: [115.375279, 22.786211],
+ 潮州: [116.63, 23.68],
+ 丹东: [124.37, 40.13],
+ 太仓: [121.1, 31.45],
+ 曲靖: [103.79, 25.51],
+ 烟台: [121.39, 37.52],
+ 福州: [119.3, 26.08],
+ 瓦房店: [121.979603, 39.627114],
+ 即墨: [120.45, 36.38],
+ 抚顺: [123.97, 41.97],
+ 玉溪: [102.52, 24.35],
+ 张家口: [114.87, 40.82],
+ 阳泉: [113.57, 37.85],
+ 莱州: [119.942327, 37.177017],
+ 湖州: [120.1, 30.86],
+ 汕头: [116.69, 23.39],
+ 昆山: [120.95, 31.39],
+ 宁波: [121.56, 29.86],
+ 湛江: [110.359377, 21.270708],
+ 揭阳: [116.35, 23.55],
+ 荣成: [122.41, 37.16],
+ 连云港: [119.16, 34.59],
+ 葫芦岛: [120.836932, 40.711052],
+ 常熟: [120.74, 31.64],
+ 东莞: [113.75, 23.04],
+ 河源: [114.68, 23.73],
+ 淮安: [119.15, 33.5],
+ 泰州: [119.9, 32.49],
+ 南宁: [108.33, 22.84],
+ 营口: [122.18, 40.65],
+ 惠州: [114.4, 23.09],
+ 江阴: [120.26, 31.91],
+ 蓬莱: [120.75, 37.8],
+ 韶关: [113.62, 24.84],
+ 嘉峪关: [98.289152, 39.77313],
+ 广州: [113.23, 23.16],
+ 延安: [109.47, 36.6],
+ 太原: [112.53, 37.87],
+ 清远: [113.01, 23.7],
+ 中山: [113.38, 22.52],
+ 昆明: [102.73, 25.04],
+ 寿光: [118.73, 36.86],
+ 盘锦: [122.070714, 41.119997],
+ 长治: [113.08, 36.18],
+ 深圳: [114.07, 22.62],
+ 珠海: [113.52, 22.3],
+ 宿迁: [118.3, 33.96],
+ 咸阳: [108.72, 34.36],
+ 铜川: [109.11, 35.09],
+ 平度: [119.97, 36.77],
+ 佛山: [113.11, 23.05],
+ 海口: [110.35, 20.02],
+ 江门: [113.06, 22.61],
+ 章丘: [117.53, 36.72],
+ 肇庆: [112.44, 23.05],
+ 大连: [121.62, 38.92],
+ 临汾: [111.5, 36.08],
+ 吴江: [120.63, 31.16],
+ 石嘴山: [106.39, 39.04],
+ 沈阳: [123.38, 41.8],
+ 苏州: [120.62, 31.32],
+ 茂名: [110.88, 21.68],
+ 嘉兴: [120.76, 30.77],
+ 长春: [125.35, 43.88],
+ 胶州: [120.03336, 36.264622],
+ 银川: [106.27, 38.47],
+ 张家港: [120.555821, 31.875428],
+ 三门峡: [111.19, 34.76],
+ 锦州: [121.15, 41.13],
+ 南昌: [115.89, 28.68],
+ 柳州: [109.4, 24.33],
+ 三亚: [109.511909, 18.252847],
+ 自贡: [104.778442, 29.33903],
+ 吉林: [126.57, 43.87],
+ 阳江: [111.95, 21.85],
+ 泸州: [105.39, 28.91],
+ 西宁: [101.74, 36.56],
+ 宜宾: [104.56, 29.77],
+ 呼和浩特: [111.65, 40.82],
+ 成都: [104.06, 30.67],
+ 大同: [113.3, 40.12],
+ 镇江: [119.44, 32.2],
+ 桂林: [110.28, 25.29],
+ 张家界: [110.479191, 29.117096],
+ 宜兴: [119.82, 31.36],
+ 北海: [109.12, 21.49],
+ 西安: [108.95, 34.27],
+ 金坛: [119.56, 31.74],
+ 东营: [118.49, 37.46],
+ 牡丹江: [129.58, 44.6],
+ 遵义: [106.9, 27.7],
+ 绍兴: [120.58, 30.01],
+ 扬州: [119.42, 32.39],
+ 常州: [119.95, 31.79],
+ 潍坊: [119.1, 36.62],
+ 重庆: [106.54, 29.59],
+ 台州: [121.420757, 28.656386],
+ 南京: [118.78, 32.04],
+ 滨州: [118.03, 37.36],
+ 贵阳: [106.71, 26.57],
+ 无锡: [120.29, 31.59],
+ 本溪: [123.73, 41.3],
+ 克拉玛依: [84.77, 45.59],
+ 渭南: [109.5, 34.52],
+ 马鞍山: [118.48, 31.56],
+ 宝鸡: [107.15, 34.38],
+ 焦作: [113.21, 35.24],
+ 句容: [119.16, 31.95],
+ 北京: [116.46, 39.92],
+ 徐州: [117.2, 34.26],
+ 衡水: [115.72, 37.72],
+ 包头: [110, 40.58],
+ 绵阳: [104.73, 31.48],
+ 乌鲁木齐: [87.68, 43.77],
+ 枣庄: [117.57, 34.86],
+ 杭州: [120.19, 30.26],
+ 淄博: [118.05, 36.78],
+ 鞍山: [122.85, 41.12],
+ 溧阳: [119.48, 31.43],
+ 库尔勒: [86.06, 41.68],
+ 安阳: [114.35, 36.1],
+ 开封: [114.35, 34.79],
+ 济南: [117, 36.65],
+ 德阳: [104.37, 31.13],
+ 温州: [120.65, 28.01],
+ 九江: [115.97, 29.71],
+ 邯郸: [114.47, 36.6],
+ 临安: [119.72, 30.23],
+ 兰州: [103.73, 36.03],
+ 沧州: [116.83, 38.33],
+ 临沂: [118.35, 35.05],
+ 南充: [106.110698, 30.837793],
+ 天津: [117.2, 39.13],
+ 富阳: [119.95, 30.07],
+ 泰安: [117.13, 36.18],
+ 诸暨: [120.23, 29.71],
+ 郑州: [113.65, 34.76],
+ 哈尔滨: [126.63, 45.75],
+ 聊城: [115.97, 36.45],
+ 芜湖: [118.38, 31.33],
+ 唐山: [118.02, 39.63],
+ 平顶山: [113.29, 33.75],
+ 邢台: [114.48, 37.05],
+ 德州: [116.29, 37.45],
+ 济宁: [116.59, 35.38],
+ 荆州: [112.239741, 30.335165],
+ 宜昌: [111.3, 30.7],
+ 义乌: [120.06, 29.32],
+ 丽水: [119.92, 28.45],
+ 洛阳: [112.44, 34.7],
+ 秦皇岛: [119.57, 39.95],
+ 株洲: [113.16, 27.83],
+ 石家庄: [114.48, 38.03],
+ 莱芜: [117.67, 36.19],
+ 常德: [111.69, 29.05],
+ 保定: [115.48, 38.85],
+ 湘潭: [112.91, 27.87],
+ 金华: [119.64, 29.12],
+ 岳阳: [113.09, 29.37],
+ 长沙: [113, 28.21],
+ 衢州: [118.88, 28.97],
+ 廊坊: [116.7, 39.53],
+ 菏泽: [115.480656, 35.23375],
+ 合肥: [117.27, 31.86],
+ 武汉: [114.31, 30.52],
+ 大庆: [125.03, 46.58],
+};
diff --git a/src/views/fun/gridLayout/index.vue b/src/views/fun/gridLayout/index.vue
new file mode 100644
index 0000000..2a8c666
--- /dev/null
+++ b/src/views/fun/gridLayout/index.vue
@@ -0,0 +1,62 @@
+
+
+
+
+
+
+
+ {{ item.i }}
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/fun/printJs/index.vue b/src/views/fun/printJs/index.vue
new file mode 100644
index 0000000..0340612
--- /dev/null
+++ b/src/views/fun/printJs/index.vue
@@ -0,0 +1,44 @@
+
+
+
+
+
+
+ 点击打印演示
+
+
+
+
+
+
diff --git a/src/views/fun/qrcode/index.vue b/src/views/fun/qrcode/index.vue
new file mode 100644
index 0000000..e4a36e5
--- /dev/null
+++ b/src/views/fun/qrcode/index.vue
@@ -0,0 +1,79 @@
+
+
+
+
+
+
+
diff --git a/src/views/fun/splitpanes/index.vue b/src/views/fun/splitpanes/index.vue
new file mode 100644
index 0000000..eb70c61
--- /dev/null
+++ b/src/views/fun/splitpanes/index.vue
@@ -0,0 +1,54 @@
+
+
+
+
+
+ 1
+
+
+ 2
+ 3
+
+
+ 4
+
+
+
+
+
+
+
+
diff --git a/src/views/fun/tagsView/index.vue b/src/views/fun/tagsView/index.vue
new file mode 100644
index 0000000..7c65fc6
--- /dev/null
+++ b/src/views/fun/tagsView/index.vue
@@ -0,0 +1,118 @@
+
+
+
+
+
+
+
diff --git a/src/views/home/index.vue b/src/views/home/index.vue
new file mode 100644
index 0000000..6475fba
--- /dev/null
+++ b/src/views/home/index.vue
@@ -0,0 +1,643 @@
+
+
+
+
+
+
+
+
{{ v.num1 }}
+
{{ v.num2 }}%
+
{{ v.num3 }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
快捷导航工具
+
+
+
+
+
+
+
{{ v.label }}
+
{{ v.value }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/login/component/account.vue b/src/views/login/component/account.vue
new file mode 100644
index 0000000..447d358
--- /dev/null
+++ b/src/views/login/component/account.vue
@@ -0,0 +1,261 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
![]()
+
+
+
+
+
+ {{ $t('message.account.accountBtnText') }}
+
+
+
+
+
+
+
+
+
diff --git a/src/views/login/component/mobile.vue b/src/views/login/component/mobile.vue
new file mode 100644
index 0000000..9664bb0
--- /dev/null
+++ b/src/views/login/component/mobile.vue
@@ -0,0 +1,84 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ $t('message.mobile.codeText') }}
+
+
+
+
+ {{ $t('message.mobile.btnText') }}
+
+
+ {{ $t('message.mobile.msgText') }}
+
+
+
+
+
+
diff --git a/src/views/login/component/scan.vue b/src/views/login/component/scan.vue
new file mode 100644
index 0000000..776ad20
--- /dev/null
+++ b/src/views/login/component/scan.vue
@@ -0,0 +1,59 @@
+
+
+
+
{{ $t('message.scan.text') }}
+
+
+
+
+
+
diff --git a/src/views/login/index.vue b/src/views/login/index.vue
new file mode 100644
index 0000000..af800db
--- /dev/null
+++ b/src/views/login/index.vue
@@ -0,0 +1,204 @@
+
+
+
+
+
+
+
+
![]()
+
{{ getThemeConfig.globalViceTitle }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/make/noticeBar/index.vue b/src/views/make/noticeBar/index.vue
new file mode 100644
index 0000000..2bb8730
--- /dev/null
+++ b/src/views/make/noticeBar/index.vue
@@ -0,0 +1,164 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ v }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/make/selector/index.vue b/src/views/make/selector/index.vue
new file mode 100644
index 0000000..db7c34a
--- /dev/null
+++ b/src/views/make/selector/index.vue
@@ -0,0 +1,126 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/make/svgDemo/index.vue b/src/views/make/svgDemo/index.vue
new file mode 100644
index 0000000..36fd320
--- /dev/null
+++ b/src/views/make/svgDemo/index.vue
@@ -0,0 +1,59 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/menu/menu1/menu11/index.vue b/src/views/menu/menu1/menu11/index.vue
new file mode 100644
index 0000000..944beb8
--- /dev/null
+++ b/src/views/menu/menu1/menu11/index.vue
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
diff --git a/src/views/menu/menu1/menu12/menu121/index.vue b/src/views/menu/menu1/menu12/menu121/index.vue
new file mode 100644
index 0000000..791130b
--- /dev/null
+++ b/src/views/menu/menu1/menu12/menu121/index.vue
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
diff --git a/src/views/menu/menu1/menu12/menu122/index.vue b/src/views/menu/menu1/menu12/menu122/index.vue
new file mode 100644
index 0000000..3db8096
--- /dev/null
+++ b/src/views/menu/menu1/menu12/menu122/index.vue
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
diff --git a/src/views/menu/menu1/menu13/index.vue b/src/views/menu/menu1/menu13/index.vue
new file mode 100644
index 0000000..f984dcc
--- /dev/null
+++ b/src/views/menu/menu1/menu13/index.vue
@@ -0,0 +1,27 @@
+
+
+
+
+
+
+
diff --git a/src/views/menu/menu2/index.vue b/src/views/menu/menu2/index.vue
new file mode 100644
index 0000000..0081506
--- /dev/null
+++ b/src/views/menu/menu2/index.vue
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
diff --git a/src/views/pages/awesome/index.vue b/src/views/pages/awesome/index.vue
new file mode 100644
index 0000000..52b53bb
--- /dev/null
+++ b/src/views/pages/awesome/index.vue
@@ -0,0 +1,87 @@
+
+
+
+
+
+
+
diff --git a/src/views/pages/drag/index.vue b/src/views/pages/drag/index.vue
new file mode 100644
index 0000000..1b79498
--- /dev/null
+++ b/src/views/pages/drag/index.vue
@@ -0,0 +1,66 @@
+
+
+
+
+
+
+
+ 点击打开 Dialog
+
+
+
+
+
+
+
+
+
+
+
+ 拖动指令效果(v-drag)
+
+ 鼠标放标题头进行 Dialog 对话框拖动
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/pages/dynamicForm/index.vue b/src/views/pages/dynamicForm/index.vue
new file mode 100644
index 0000000..d6a7a68
--- /dev/null
+++ b/src/views/pages/dynamicForm/index.vue
@@ -0,0 +1,204 @@
+
+
+
+
+
diff --git a/src/views/pages/dynamicForm/mock.ts b/src/views/pages/dynamicForm/mock.ts
new file mode 100644
index 0000000..2293fe9
--- /dev/null
+++ b/src/views/pages/dynamicForm/mock.ts
@@ -0,0 +1,119 @@
+// 表单数据选项(自行扩展)
+export const formData = [
+ {
+ label: '姓名',
+ prop: 'name',
+ placeholder: '请输入姓名',
+ clearable: true,
+ disabled: false,
+ required: true,
+ type: 'input',
+ i18n: false,
+ i18nText: '',
+ isShow: true,
+ xs: 24,
+ sm: 12,
+ md: 8,
+ lg: 6,
+ xl: 4,
+ },
+ {
+ label: '邮箱',
+ prop: 'email',
+ placeholder: '请输入用户邮箱',
+ clearable: true,
+ disabled: false,
+ required: true,
+ type: 'input',
+ i18n: false,
+ i18nText: '',
+ isShow: true,
+ xs: 24,
+ sm: 12,
+ md: 8,
+ lg: 6,
+ xl: 4,
+ },
+ {
+ label: '登陆时间',
+ prop: 'autograph',
+ placeholder: '选择时间',
+ clearable: true,
+ disabled: false,
+ required: true,
+ type: 'date',
+ i18n: false,
+ i18nText: '',
+ isShow: true,
+ xs: 24,
+ sm: 12,
+ md: 8,
+ lg: 6,
+ xl: 4,
+ },
+ {
+ label: '职务',
+ prop: 'occupation',
+ placeholder: '请选择职务',
+ clearable: true,
+ disabled: false,
+ required: true,
+ type: 'select',
+ i18n: false,
+ i18nText: '',
+ options: [
+ {
+ label: '计算机 / 互联网 / 通信',
+ value: '1',
+ },
+ {
+ label: '生产 / 工艺 / 制造',
+ value: '2',
+ },
+ {
+ label: '医疗 / 护理 / 制药',
+ value: '3',
+ },
+ ],
+ isShow: true,
+ xs: 24,
+ sm: 12,
+ md: 8,
+ lg: 6,
+ xl: 4,
+ },
+ {
+ label: '',
+ prop: '',
+ placeholder: '',
+ clearable: true,
+ disabled: false,
+ required: true,
+ type: '',
+ i18n: false,
+ i18nText: '',
+ isShow: true,
+ xs: 24,
+ sm: 24,
+ md: 24,
+ lg: 24,
+ xl: 24,
+ },
+ {
+ label: '备注',
+ prop: 'remarks',
+ placeholder: '请输入',
+ clearable: true,
+ disabled: false,
+ required: true,
+ type: 'textarea',
+ i18n: false,
+ i18nText: '',
+ isShow: true,
+ xs: 24,
+ sm: 24,
+ md: 24,
+ lg: 24,
+ xl: 24,
+ },
+];
diff --git a/src/views/pages/element/index.vue b/src/views/pages/element/index.vue
new file mode 100644
index 0000000..0bb2454
--- /dev/null
+++ b/src/views/pages/element/index.vue
@@ -0,0 +1,89 @@
+
+
+
+
+
+
+
diff --git a/src/views/pages/filtering/details.vue b/src/views/pages/filtering/details.vue
new file mode 100644
index 0000000..a2e5417
--- /dev/null
+++ b/src/views/pages/filtering/details.vue
@@ -0,0 +1,39 @@
+
+
+
+
+
filtering-details 测试界面
+
+
+
+
+
+
diff --git a/src/views/pages/filtering/details1.vue b/src/views/pages/filtering/details1.vue
new file mode 100644
index 0000000..2fde1b4
--- /dev/null
+++ b/src/views/pages/filtering/details1.vue
@@ -0,0 +1,39 @@
+
+
+
+
+
diff --git a/src/views/pages/filtering/index.vue b/src/views/pages/filtering/index.vue
new file mode 100644
index 0000000..82ea3fd
--- /dev/null
+++ b/src/views/pages/filtering/index.vue
@@ -0,0 +1,355 @@
+
+
+
+
+
{{ val.title }}
+
+
{{
+ v.label
+ }}
+
+ {{ val.isMore ? '收起' : '展开' }}
+
+
+
+
+
+
+
+
+
+
+
![]()
+
+
+
{{ v.title }}
+
+
+
+ 评价 {{ v.evaluate }}
+ 收藏 {{ v.collection }}
+
+
+
+ ¥
+ {{ v.price }}
+
+ 月销{{ v.monSales }}笔
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/pages/filtering/mock.ts b/src/views/pages/filtering/mock.ts
new file mode 100644
index 0000000..22e0f38
--- /dev/null
+++ b/src/views/pages/filtering/mock.ts
@@ -0,0 +1,201 @@
+// 导航数据
+export const filtering = [
+ {
+ title: '权限',
+ isMore: false,
+ isShowMore: false,
+ id: 0,
+ children: [
+ {
+ id: '01',
+ label: '全部',
+ active: true,
+ },
+ {
+ id: '02',
+ label: '普通用户',
+ active: false,
+ },
+ {
+ id: '03',
+ label: '管理员',
+ active: false,
+ },
+ ],
+ },
+ {
+ title: '布局',
+ isMore: false,
+ isShowMore: false,
+ id: 1,
+ children: [
+ {
+ id: 11,
+ label: '全部',
+ active: true,
+ },
+ {
+ id: 12,
+ label: '默认',
+ active: false,
+ },
+ {
+ id: 13,
+ label: '经典',
+ active: false,
+ },
+ {
+ id: 14,
+ label: '横向',
+ active: false,
+ },
+ {
+ id: 15,
+ label: '分栏',
+ active: false,
+ },
+ ],
+ },
+ {
+ title: '配置',
+ isMore: false,
+ isShowMore: false,
+ id: 2,
+ children: [
+ {
+ id: 21,
+ label: '全部',
+ active: true,
+ },
+ {
+ id: 22,
+ label: '开启 Breadcrumb',
+ active: false,
+ },
+ {
+ id: 23,
+ label: '开启 Tags-View',
+ active: false,
+ },
+ {
+ id: 24,
+ label: '固定 Header',
+ active: false,
+ },
+ {
+ id: 25,
+ label: '侧边栏 Logo',
+ active: false,
+ },
+ {
+ id: 26,
+ label: '开启折叠 NavMenu',
+ active: false,
+ },
+ {
+ id: 27,
+ label: '开启一个 NavMenu 展开',
+ active: false,
+ },
+ {
+ id: 28,
+ label: '登录用户头像',
+ active: false,
+ },
+ ],
+ },
+];
+
+// 列表数据
+export const filterList = [
+ {
+ img: 'http://news.sznews.com/pic/2020-08/14/9d9c9a60-f0af-41aa-b617-683b07c87642.jpg',
+ title: '嘉陵江2020年第1号洪水”在嘉陵江支流涪江形成',
+ evaluate: (Math.random() * 10).toFixed(2),
+ collection: (Math.random() * 100).toFixed(2),
+ price: (Math.random() * 10).toFixed(2),
+ monSales: (Math.random() * 20).toFixed(2),
+ id: 1,
+ },
+ {
+ img: 'http://www.sznews.com/news/pic/2020-08/13/0ea47d3c-feb9-4bd7-8597-a8a373aa6340c6ec12c7-3b33-4528-91a6-85ec8ca1df67_watermark.png',
+ title: '让《民法典》走近群众 盐田街道开展人民调解宣传活动',
+ evaluate: (Math.random() * 10).toFixed(2),
+ collection: (Math.random() * 100).toFixed(2),
+ price: (Math.random() * 10).toFixed(2),
+ monSales: (Math.random() * 20).toFixed(2),
+ id: 2,
+ },
+ {
+ img: 'http://www.sznews.com/photo/pic/2020-08/12/a08d6eb0-1d53-4f76-a313-ad3e5d701f98.jpg',
+ title: '记者手记:可可西里,“挪”向“藏羚羊大产房”的14个半小时',
+ evaluate: (Math.random() * 10).toFixed(2),
+ collection: (Math.random() * 100).toFixed(2),
+ price: (Math.random() * 10).toFixed(2),
+ monSales: (Math.random() * 20).toFixed(2),
+ id: 3,
+ },
+ {
+ img: 'http://www.sznews.com/photo/pic/2020-08/11/43cc0e14-9bca-45b9-9a8b-342e09d6a4c7.jpg',
+ title: '以优异成绩庆祝深圳经济特区建立40周年',
+ evaluate: (Math.random() * 10).toFixed(2),
+ collection: (Math.random() * 100).toFixed(2),
+ price: (Math.random() * 10).toFixed(2),
+ monSales: (Math.random() * 20).toFixed(2),
+ id: 4,
+ },
+ {
+ img: 'http://www.sznews.com/photo/pic/2020-08/11/a4dc322b-68ec-40e6-8906-3124142c3e49.jpg',
+ title: '草原上的“太阳姑娘”',
+ evaluate: (Math.random() * 10).toFixed(2),
+ collection: (Math.random() * 100).toFixed(2),
+ price: (Math.random() * 10).toFixed(2),
+ monSales: (Math.random() * 20).toFixed(2),
+ id: 5,
+ },
+ {
+ img: 'http://www.sznews.com/zhuanti/pic/2020-08/07/57f087b4-4812-46cc-adb9-ead73621284e.png',
+ title: '奇观天下|带你走进非洲野生动物观光第一目的地',
+ evaluate: (Math.random() * 10).toFixed(2),
+ collection: (Math.random() * 100).toFixed(2),
+ price: (Math.random() * 10).toFixed(2),
+ monSales: (Math.random() * 20).toFixed(2),
+ id: 6,
+ },
+ {
+ img: 'http://news.sznews.com/pic/2020-09/02/t2_(101X54X600X335)7cd39301-d9cf-45f1-91c3-9575b1e5ce0e.jpg.2',
+ title: '五角大楼发布“中国军力报告” 华春莹: 罔顾事实,充满偏见',
+ evaluate: (Math.random() * 10).toFixed(2),
+ collection: (Math.random() * 100).toFixed(2),
+ price: (Math.random() * 10).toFixed(2),
+ monSales: (Math.random() * 20).toFixed(2),
+ id: 7,
+ },
+ {
+ img: 'http://news.sznews.com/pic/2020-09/02/b8b41d9c-0508-4498-8d37-6e597493769f.jpg',
+ title: '最新地铁消息汇总:4号线北延、2号线三期、8号线一期等今年通车',
+ evaluate: (Math.random() * 10).toFixed(2),
+ collection: (Math.random() * 100).toFixed(2),
+ price: (Math.random() * 10).toFixed(2),
+ monSales: (Math.random() * 20).toFixed(2),
+ id: 8,
+ },
+ {
+ img: 'http://www.sznews.com/photo/pic/2020-08/10/1635374c-f4d6-475c-ac47-1334176f365d.png',
+ title: '9月1日深圳新增5例无症状感染者!钟南山这段话冲上热搜!',
+ evaluate: (Math.random() * 10).toFixed(2),
+ collection: (Math.random() * 100).toFixed(2),
+ price: (Math.random() * 10).toFixed(2),
+ monSales: (Math.random() * 20).toFixed(2),
+ id: 9,
+ },
+ {
+ img: 'http://www.sznews.com/news/pic/2020-08/13/646e5458-92b7-4636-9940-9b0799babfe1.png',
+ title: '全能“小福宝” 为文明社区建设添砖加瓦',
+ evaluate: (Math.random() * 10).toFixed(2),
+ collection: (Math.random() * 100).toFixed(2),
+ price: (Math.random() * 10).toFixed(2),
+ monSales: (Math.random() * 20).toFixed(2),
+ id: 10,
+ },
+];
diff --git a/src/views/pages/formAdapt/index.vue b/src/views/pages/formAdapt/index.vue
new file mode 100644
index 0000000..3bbfe04
--- /dev/null
+++ b/src/views/pages/formAdapt/index.vue
@@ -0,0 +1,114 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 更新个人信息
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/pages/formI18n/index.vue b/src/views/pages/formI18n/index.vue
new file mode 100644
index 0000000..b9fe6b8
--- /dev/null
+++ b/src/views/pages/formI18n/index.vue
@@ -0,0 +1,59 @@
+
+
+
+
+
diff --git a/src/views/pages/formRules/component/formRulesOne.vue b/src/views/pages/formRules/component/formRulesOne.vue
new file mode 100644
index 0000000..ff9e568
--- /dev/null
+++ b/src/views/pages/formRules/component/formRulesOne.vue
@@ -0,0 +1,68 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/pages/formRules/component/formRulesThree.vue b/src/views/pages/formRules/component/formRulesThree.vue
new file mode 100644
index 0000000..145aed4
--- /dev/null
+++ b/src/views/pages/formRules/component/formRulesThree.vue
@@ -0,0 +1,50 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/pages/formRules/component/formRulesTwo.vue b/src/views/pages/formRules/component/formRulesTwo.vue
new file mode 100644
index 0000000..fcb0604
--- /dev/null
+++ b/src/views/pages/formRules/component/formRulesTwo.vue
@@ -0,0 +1,52 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/pages/formRules/index.vue b/src/views/pages/formRules/index.vue
new file mode 100644
index 0000000..9c24343
--- /dev/null
+++ b/src/views/pages/formRules/index.vue
@@ -0,0 +1,80 @@
+
+
+
+
+
diff --git a/src/views/pages/iocnfont/index.vue b/src/views/pages/iocnfont/index.vue
new file mode 100644
index 0000000..48a44f9
--- /dev/null
+++ b/src/views/pages/iocnfont/index.vue
@@ -0,0 +1,87 @@
+
+
+
+
+
+
+
diff --git a/src/views/pages/lazyImg/index.vue b/src/views/pages/lazyImg/index.vue
new file mode 100644
index 0000000..ad63f8a
--- /dev/null
+++ b/src/views/pages/lazyImg/index.vue
@@ -0,0 +1,194 @@
+
+
+
+
+
+
+
+
+
+
![]()
+
+
+
{{ v.title }}
+
+
+
+ 评价 {{ v.evaluate }}
+ 收藏 {{ v.collection }}
+
+
+
+ ¥
+ {{ v.price }}
+
+ 月销{{ v.monSales }}笔
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/pages/lazyImg/mock.ts b/src/views/pages/lazyImg/mock.ts
new file mode 100644
index 0000000..4eb3d29
--- /dev/null
+++ b/src/views/pages/lazyImg/mock.ts
@@ -0,0 +1,313 @@
+// 列表数据
+export const filterList = [
+ {
+ img: 'https://news.sznews.com/pic/2021-03/09/e37326cc-4583-48f3-aa00-ecc2392d319d.jpg',
+ title: '36分钟,深圳平均通勤时间出炉!GDP10强城市中仅输杭州',
+ evaluate: (Math.random() * 10).toFixed(2),
+ collection: (Math.random() * 100).toFixed(2),
+ price: (Math.random() * 10).toFixed(2),
+ monSales: (Math.random() * 20).toFixed(2),
+ id: 1,
+ loading: true,
+ },
+ {
+ img: 'http://news.sznews.com/pic/2021-03/09/78cf72b6-e2d9-459d-a368-470414a027f4679cf4ea-26fa-48c8-9fee-c2d092a91400.png',
+ title: '为爱而动,“红色鹊桥”三八妇女节交友联谊活动助力深圳女孩脱单',
+ evaluate: (Math.random() * 10).toFixed(2),
+ collection: (Math.random() * 100).toFixed(2),
+ price: (Math.random() * 10).toFixed(2),
+ monSales: (Math.random() * 20).toFixed(2),
+ id: 2,
+ loading: true,
+ },
+ {
+ img: 'http://news.sznews.com/pic/2021-03/09/1faf3c6e-1250-4e6b-b072-4a331553e027.jpg',
+ title: '粤桂协作“背水一战” 解决广西大化县3.7万人饮水难题',
+ evaluate: (Math.random() * 10).toFixed(2),
+ collection: (Math.random() * 100).toFixed(2),
+ price: (Math.random() * 10).toFixed(2),
+ monSales: (Math.random() * 20).toFixed(2),
+ id: 3,
+ loading: true,
+ },
+ {
+ img: 'https://news.sznews.com/pic/2021-03/09/9fcf6dd4-1e80-4497-bdc9-83dc7246d170.jpg.2',
+ title: '城镇就业女性平均薪酬6847元 女性职场渗透率提升',
+ evaluate: (Math.random() * 10).toFixed(2),
+ collection: (Math.random() * 100).toFixed(2),
+ price: (Math.random() * 10).toFixed(2),
+ monSales: (Math.random() * 20).toFixed(2),
+ id: 4,
+ loading: true,
+ },
+ {
+ img: 'https://news.sznews.com/pic/2021-03/09/1bd78227-4126-4a43-bdf6-48ead6edd1bf.jpg.2',
+ title: '深圳:实现“从0到1”源头创新,推进大湾区综合性国家科学中心建设!',
+ evaluate: (Math.random() * 10).toFixed(2),
+ collection: (Math.random() * 100).toFixed(2),
+ price: (Math.random() * 10).toFixed(2),
+ monSales: (Math.random() * 20).toFixed(2),
+ id: 5,
+ loading: true,
+ },
+ {
+ img: 'http://news.sznews.com/pic/2021-03/08/9ea943a3-3ae8-4f49-8296-711ec36ef8c6_watermark.png',
+ title: '煖声音第126期|愿你有诗酒趁年华的洒脱,也有岁月沉淀后的坚定从容',
+ evaluate: (Math.random() * 10).toFixed(2),
+ collection: (Math.random() * 100).toFixed(2),
+ price: (Math.random() * 10).toFixed(2),
+ monSales: (Math.random() * 20).toFixed(2),
+ id: 6,
+ loading: true,
+ },
+ {
+ img: 'https://news.sznews.com/pic/2021-03/08/a95ba232-1422-4f7e-b85f-c61d486c8659.jpg.2',
+ title: '姐妹们一起来吐槽,最不能接受男人的缺点!',
+ evaluate: (Math.random() * 10).toFixed(2),
+ collection: (Math.random() * 100).toFixed(2),
+ price: (Math.random() * 10).toFixed(2),
+ monSales: (Math.random() * 20).toFixed(2),
+ id: 7,
+ loading: true,
+ },
+ {
+ img: 'http://news.sznews.com/pic/2021-03/08/76816bf0-3899-4c7e-bc6e-079b5ba8725e.jpg',
+ title: '民生小事 | 手机遗落出租车 热心民警帮找回',
+ evaluate: (Math.random() * 10).toFixed(2),
+ collection: (Math.random() * 100).toFixed(2),
+ price: (Math.random() * 10).toFixed(2),
+ monSales: (Math.random() * 20).toFixed(2),
+ id: 8,
+ loading: true,
+ },
+ {
+ img: 'https://news.sznews.com/pic/2021-03/08/28ed70d4-71f5-4abb-bf7b-0294bece9e43.jpg.2',
+ title: '“十三五”:深圳交上靓丽答卷 发展动力加快转换',
+ evaluate: (Math.random() * 10).toFixed(2),
+ collection: (Math.random() * 100).toFixed(2),
+ price: (Math.random() * 10).toFixed(2),
+ monSales: (Math.random() * 20).toFixed(2),
+ id: 9,
+ loading: true,
+ },
+ {
+ img: 'http://news.sznews.com/pic/2021-03/05/d13ae31f-fd45-431a-b48e-c5895bbc193e.png',
+ title: '深圳湾公园一女子落水,三名男子接力及时施救',
+ evaluate: (Math.random() * 10).toFixed(2),
+ collection: (Math.random() * 100).toFixed(2),
+ price: (Math.random() * 10).toFixed(2),
+ monSales: (Math.random() * 20).toFixed(2),
+ id: 10,
+ loading: true,
+ },
+ {
+ img: 'http://z0.sinaimg.cn/auto/resize?size=235_156&img=http://n.sinaimg.cn/spider20210704/653/w930h523/20210704/d5d2-krwipas6444058.jpg',
+ title: '36分钟,深圳平均通勤时间出炉!GDP10强城市中仅输杭州',
+ evaluate: (Math.random() * 10).toFixed(2),
+ collection: (Math.random() * 100).toFixed(2),
+ price: (Math.random() * 10).toFixed(2),
+ monSales: (Math.random() * 20).toFixed(2),
+ id: 1,
+ loading: true,
+ },
+ {
+ img: 'http://z0.sinaimg.cn/auto/resize?size=235_156&img=http://n.sinaimg.cn/spider20210704/766/w930h636/20210704/b1ae-krwipas6332914.jpg',
+ title: '为爱而动,“红色鹊桥”三八妇女节交友联谊活动助力深圳女孩脱单',
+ evaluate: (Math.random() * 10).toFixed(2),
+ collection: (Math.random() * 100).toFixed(2),
+ price: (Math.random() * 10).toFixed(2),
+ monSales: (Math.random() * 20).toFixed(2),
+ id: 2,
+ loading: true,
+ },
+ {
+ img: 'http://z0.sinaimg.cn/auto/resize?size=235_156&img=http://n.sinaimg.cn/spider20210704/750/w930h620/20210704/2886-krwipas6264821.jpg',
+ title: '粤桂协作“背水一战” 解决广西大化县3.7万人饮水难题',
+ evaluate: (Math.random() * 10).toFixed(2),
+ collection: (Math.random() * 100).toFixed(2),
+ price: (Math.random() * 10).toFixed(2),
+ monSales: (Math.random() * 20).toFixed(2),
+ id: 3,
+ loading: true,
+ },
+ {
+ img: 'http://z0.sinaimg.cn/auto/resize?size=235_156&img=http://n.sinaimg.cn/spider20210704/750/w930h620/20210704/767c-krwipas6387862.jpg',
+ title: '城镇就业女性平均薪酬6847元 女性职场渗透率提升',
+ evaluate: (Math.random() * 10).toFixed(2),
+ collection: (Math.random() * 100).toFixed(2),
+ price: (Math.random() * 10).toFixed(2),
+ monSales: (Math.random() * 20).toFixed(2),
+ id: 4,
+ loading: true,
+ },
+ {
+ img: 'http://z0.sinaimg.cn/auto/resize?size=235_156&img=http://n.sinaimg.cn/spider20210704/111/w1024h687/20210704/1f65-krwipas5871436.jpg',
+ title: '盛夏的那考河湿地公园!',
+ evaluate: (Math.random() * 10).toFixed(2),
+ collection: (Math.random() * 100).toFixed(2),
+ price: (Math.random() * 10).toFixed(2),
+ monSales: (Math.random() * 20).toFixed(2),
+ id: 5,
+ loading: true,
+ },
+ {
+ img: 'http://z0.sinaimg.cn/auto/resize?size=235_156&img=http://n.sinaimg.cn/spider20210704/657/w930h527/20210704/7eae-krwipas5866609.jpg',
+ title: '煖声音第126期|愿你有诗酒趁年华的洒脱,也有岁月沉淀后的坚定从容',
+ evaluate: (Math.random() * 10).toFixed(2),
+ collection: (Math.random() * 100).toFixed(2),
+ price: (Math.random() * 10).toFixed(2),
+ monSales: (Math.random() * 20).toFixed(2),
+ id: 6,
+ loading: true,
+ },
+ {
+ img: 'http://z0.sinaimg.cn/auto/resize?size=235_156&img=http://n.sinaimg.cn/spider20210703/760/w930h630/20210703/124e-krwipas5596390.jpg',
+ title: '姐妹们一起来吐槽,最不能接受男人的缺点!',
+ evaluate: (Math.random() * 10).toFixed(2),
+ collection: (Math.random() * 100).toFixed(2),
+ price: (Math.random() * 10).toFixed(2),
+ monSales: (Math.random() * 20).toFixed(2),
+ id: 7,
+ loading: true,
+ },
+ {
+ img: 'http://z0.sinaimg.cn/auto/resize?size=235_156&img=http://n.sinaimg.cn/spider20210703/27/w930h697/20210703/9630-krwipas5514972.jpg',
+ title: '民生小事 | 手机遗落出租车 热心民警帮找回',
+ evaluate: (Math.random() * 10).toFixed(2),
+ collection: (Math.random() * 100).toFixed(2),
+ price: (Math.random() * 10).toFixed(2),
+ monSales: (Math.random() * 20).toFixed(2),
+ id: 8,
+ loading: true,
+ },
+ {
+ img: 'http://z0.sinaimg.cn/auto/resize?size=235_156&img=http://n.sinaimg.cn/spider20210703/750/w930h620/20210703/2fe3-krwipas5388050.jpg',
+ title: '“十三五”:深圳交上靓丽答卷 发展动力加快转换',
+ evaluate: (Math.random() * 10).toFixed(2),
+ collection: (Math.random() * 100).toFixed(2),
+ price: (Math.random() * 10).toFixed(2),
+ monSales: (Math.random() * 20).toFixed(2),
+ id: 9,
+ loading: true,
+ },
+ {
+ img: 'http://z0.sinaimg.cn/auto/resize?size=235_156&img=http://n.sinaimg.cn/spider20210703/724/w930h594/20210703/98b6-krwipas5234060.jpg',
+ title: '深圳湾公园一女子落水,三名男子接力及时施救',
+ evaluate: (Math.random() * 10).toFixed(2),
+ collection: (Math.random() * 100).toFixed(2),
+ price: (Math.random() * 10).toFixed(2),
+ monSales: (Math.random() * 20).toFixed(2),
+ id: 10,
+ loading: true,
+ },
+ {
+ img: 'http://z0.sinaimg.cn/auto/resize?size=235_156&img=http://n.sinaimg.cn/spider20210703/750/w930h620/20210703/f765-krwipas5194727.jpg',
+ title: '36分钟,深圳平均通勤时间出炉!GDP10强城市中仅输杭州',
+ evaluate: (Math.random() * 10).toFixed(2),
+ collection: (Math.random() * 100).toFixed(2),
+ price: (Math.random() * 10).toFixed(2),
+ monSales: (Math.random() * 20).toFixed(2),
+ id: 1,
+ loading: true,
+ },
+ {
+ img: 'http://z0.sinaimg.cn/auto/resize?size=235_156&img=http://n.sinaimg.cn/spider20210702/750/w930h620/20210702/5dde-krwipas4724976.jpg',
+ title: '为爱而动,“红色鹊桥”三八妇女节交友联谊活动助力深圳女孩脱单',
+ evaluate: (Math.random() * 10).toFixed(2),
+ collection: (Math.random() * 100).toFixed(2),
+ price: (Math.random() * 10).toFixed(2),
+ monSales: (Math.random() * 20).toFixed(2),
+ id: 2,
+ loading: true,
+ },
+ {
+ img: 'http://z0.sinaimg.cn/auto/resize?size=235_156&img=http://n.sinaimg.cn/spider20210702/750/w930h620/20210702/f45e-krwipas4566804.jpg',
+ title: '粤桂协作“背水一战” 解决广西大化县3.7万人饮水难题',
+ evaluate: (Math.random() * 10).toFixed(2),
+ collection: (Math.random() * 100).toFixed(2),
+ price: (Math.random() * 10).toFixed(2),
+ monSales: (Math.random() * 20).toFixed(2),
+ id: 3,
+ loading: true,
+ },
+ {
+ img: 'http://z0.sinaimg.cn/auto/resize?size=235_156&img=http://n.sinaimg.cn/spider20210702/750/w930h620/20210702/5579-krwipas4551382.jpg',
+ title: '城镇就业女性平均薪酬6847元 女性职场渗透率提升',
+ evaluate: (Math.random() * 10).toFixed(2),
+ collection: (Math.random() * 100).toFixed(2),
+ price: (Math.random() * 10).toFixed(2),
+ monSales: (Math.random() * 20).toFixed(2),
+ id: 4,
+ loading: true,
+ },
+ {
+ img: 'http://z0.sinaimg.cn/auto/resize?size=235_156&img=http://n.sinaimg.cn/spider20210702/750/w930h620/20210702/7c75-krwipas4543661.jpg',
+ title: '深圳:实现“从0到1”源头创新,推进大湾区综合性国家科学中心建设!',
+ evaluate: (Math.random() * 10).toFixed(2),
+ collection: (Math.random() * 100).toFixed(2),
+ price: (Math.random() * 10).toFixed(2),
+ monSales: (Math.random() * 20).toFixed(2),
+ id: 5,
+ loading: true,
+ },
+ {
+ img: 'http://z0.sinaimg.cn/auto/resize?size=235_156&img=http://n.sinaimg.cn/spider20210702/653/w930h523/20210702/ece2-krwipas4411140.jpg',
+ title: '煖声音第126期|愿你有诗酒趁年华的洒脱,也有岁月沉淀后的坚定从容',
+ evaluate: (Math.random() * 10).toFixed(2),
+ collection: (Math.random() * 100).toFixed(2),
+ price: (Math.random() * 10).toFixed(2),
+ monSales: (Math.random() * 20).toFixed(2),
+ id: 6,
+ loading: true,
+ },
+ {
+ img: 'http://z0.sinaimg.cn/auto/resize?size=235_156&img=http://n.sinaimg.cn/spider20210702/750/w930h620/20210702/f5c2-krwipas4215211.jpg',
+ title: '姐妹们一起来吐槽,最不能接受男人的缺点!',
+ evaluate: (Math.random() * 10).toFixed(2),
+ collection: (Math.random() * 100).toFixed(2),
+ price: (Math.random() * 10).toFixed(2),
+ monSales: (Math.random() * 20).toFixed(2),
+ id: 7,
+ loading: true,
+ },
+ {
+ img: 'http://z0.sinaimg.cn/auto/resize?size=235_156&img=http://n.sinaimg.cn/spider20210701/720/w930h590/20210701/eabc-krwipas3509204.jpg',
+ title: '民生小事 | 手机遗落出租车 热心民警帮找回',
+ evaluate: (Math.random() * 10).toFixed(2),
+ collection: (Math.random() * 100).toFixed(2),
+ price: (Math.random() * 10).toFixed(2),
+ monSales: (Math.random() * 20).toFixed(2),
+ id: 8,
+ loading: true,
+ },
+ {
+ img: 'http://z0.sinaimg.cn/auto/resize?size=235_156&img=http://n.sinaimg.cn/spider20210701/797/w930h667/20210701/4667-krwipas3365057.jpg',
+ title: '“十三五”:深圳交上靓丽答卷 发展动力加快转换',
+ evaluate: (Math.random() * 10).toFixed(2),
+ collection: (Math.random() * 100).toFixed(2),
+ price: (Math.random() * 10).toFixed(2),
+ monSales: (Math.random() * 20).toFixed(2),
+ id: 9,
+ loading: true,
+ },
+ {
+ img: 'http://z0.sinaimg.cn/auto/resize?size=235_156&img=http://n.sinaimg.cn/spider20210701/750/w930h620/20210701/baea-krwipas2976622.jpg',
+ title: '民众前往中共一大纪念馆参观',
+ evaluate: (Math.random() * 10).toFixed(2),
+ collection: (Math.random() * 100).toFixed(2),
+ price: (Math.random() * 10).toFixed(2),
+ monSales: (Math.random() * 20).toFixed(2),
+ id: 10,
+ loading: true,
+ },
+ {
+ img: 'http://z0.sinaimg.cn/auto/resize?size=235_156&img=http://n.sinaimg.cn/spider20210630/617/w850h567/20210630/5c96-krwipas1819108.jpg',
+ title: '延吉灯光秀美轮美奂 市民徜徉璀璨夜景',
+ evaluate: (Math.random() * 10).toFixed(2),
+ collection: (Math.random() * 100).toFixed(2),
+ price: (Math.random() * 10).toFixed(2),
+ monSales: (Math.random() * 20).toFixed(2),
+ id: 10,
+ loading: true,
+ },
+];
diff --git a/src/views/pages/listAdapt/index.vue b/src/views/pages/listAdapt/index.vue
new file mode 100644
index 0000000..15e27bc
--- /dev/null
+++ b/src/views/pages/listAdapt/index.vue
@@ -0,0 +1,209 @@
+
+
+
+
+
+
+
+
+
+
![]()
+
+
+
{{ v.title }}
+
+
+
+ 评价 {{ v.evaluate }}
+ 收藏 {{ v.collection }}
+
+
+
+ ¥
+ {{ v.price }}
+
+ 月销{{ v.monSales }}笔
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/pages/listAdapt/mock.ts b/src/views/pages/listAdapt/mock.ts
new file mode 100644
index 0000000..a31e9e3
--- /dev/null
+++ b/src/views/pages/listAdapt/mock.ts
@@ -0,0 +1,93 @@
+// 列表数据
+export const filterList = [
+ {
+ img: 'https://news.sznews.com/pic/2021-03/09/e37326cc-4583-48f3-aa00-ecc2392d319d.jpg',
+ title: '36分钟,深圳平均通勤时间出炉!GDP10强城市中仅输杭州',
+ evaluate: (Math.random() * 10).toFixed(2),
+ collection: (Math.random() * 100).toFixed(2),
+ price: (Math.random() * 10).toFixed(2),
+ monSales: (Math.random() * 20).toFixed(2),
+ id: 1,
+ },
+ {
+ img: 'http://news.sznews.com/pic/2021-03/09/78cf72b6-e2d9-459d-a368-470414a027f4679cf4ea-26fa-48c8-9fee-c2d092a91400.png',
+ title: '为爱而动,“红色鹊桥”三八妇女节交友联谊活动助力深圳女孩脱单',
+ evaluate: (Math.random() * 10).toFixed(2),
+ collection: (Math.random() * 100).toFixed(2),
+ price: (Math.random() * 10).toFixed(2),
+ monSales: (Math.random() * 20).toFixed(2),
+ id: 2,
+ },
+ {
+ img: 'http://news.sznews.com/pic/2021-03/09/1faf3c6e-1250-4e6b-b072-4a331553e027.jpg',
+ title: '粤桂协作“背水一战” 解决广西大化县3.7万人饮水难题',
+ evaluate: (Math.random() * 10).toFixed(2),
+ collection: (Math.random() * 100).toFixed(2),
+ price: (Math.random() * 10).toFixed(2),
+ monSales: (Math.random() * 20).toFixed(2),
+ id: 3,
+ },
+ {
+ img: 'https://news.sznews.com/pic/2021-03/09/9fcf6dd4-1e80-4497-bdc9-83dc7246d170.jpg.2',
+ title: '城镇就业女性平均薪酬6847元 女性职场渗透率提升',
+ evaluate: (Math.random() * 10).toFixed(2),
+ collection: (Math.random() * 100).toFixed(2),
+ price: (Math.random() * 10).toFixed(2),
+ monSales: (Math.random() * 20).toFixed(2),
+ id: 4,
+ },
+ {
+ img: 'https://news.sznews.com/pic/2021-03/09/1bd78227-4126-4a43-bdf6-48ead6edd1bf.jpg.2',
+ title: '深圳:实现“从0到1”源头创新,推进大湾区综合性国家科学中心建设!',
+ evaluate: (Math.random() * 10).toFixed(2),
+ collection: (Math.random() * 100).toFixed(2),
+ price: (Math.random() * 10).toFixed(2),
+ monSales: (Math.random() * 20).toFixed(2),
+ id: 5,
+ },
+ {
+ img: 'http://news.sznews.com/pic/2021-03/08/9ea943a3-3ae8-4f49-8296-711ec36ef8c6_watermark.png',
+ title: '煖声音第126期|愿你有诗酒趁年华的洒脱,也有岁月沉淀后的坚定从容',
+ evaluate: (Math.random() * 10).toFixed(2),
+ collection: (Math.random() * 100).toFixed(2),
+ price: (Math.random() * 10).toFixed(2),
+ monSales: (Math.random() * 20).toFixed(2),
+ id: 6,
+ },
+ {
+ img: 'https://news.sznews.com/pic/2021-03/08/a95ba232-1422-4f7e-b85f-c61d486c8659.jpg.2',
+ title: '姐妹们一起来吐槽,最不能接受男人的缺点!',
+ evaluate: (Math.random() * 10).toFixed(2),
+ collection: (Math.random() * 100).toFixed(2),
+ price: (Math.random() * 10).toFixed(2),
+ monSales: (Math.random() * 20).toFixed(2),
+ id: 7,
+ },
+ {
+ img: 'http://news.sznews.com/pic/2021-03/08/76816bf0-3899-4c7e-bc6e-079b5ba8725e.jpg',
+ title: '民生小事 | 手机遗落出租车 热心民警帮找回',
+ evaluate: (Math.random() * 10).toFixed(2),
+ collection: (Math.random() * 100).toFixed(2),
+ price: (Math.random() * 10).toFixed(2),
+ monSales: (Math.random() * 20).toFixed(2),
+ id: 8,
+ },
+ {
+ img: 'https://news.sznews.com/pic/2021-03/08/28ed70d4-71f5-4abb-bf7b-0294bece9e43.jpg.2',
+ title: '“十三五”:深圳交上靓丽答卷 发展动力加快转换',
+ evaluate: (Math.random() * 10).toFixed(2),
+ collection: (Math.random() * 100).toFixed(2),
+ price: (Math.random() * 10).toFixed(2),
+ monSales: (Math.random() * 20).toFixed(2),
+ id: 9,
+ },
+ {
+ img: 'http://news.sznews.com/pic/2021-03/05/d13ae31f-fd45-431a-b48e-c5895bbc193e.png',
+ title: '深圳湾公园一女子落水,三名男子接力及时施救',
+ evaluate: (Math.random() * 10).toFixed(2),
+ collection: (Math.random() * 100).toFixed(2),
+ price: (Math.random() * 10).toFixed(2),
+ monSales: (Math.random() * 20).toFixed(2),
+ id: 10,
+ },
+];
diff --git a/src/views/pages/preview/index.vue b/src/views/pages/preview/index.vue
new file mode 100644
index 0000000..c52baee
--- /dev/null
+++ b/src/views/pages/preview/index.vue
@@ -0,0 +1,28 @@
+
+
+
+
+
+
+
+
+
diff --git a/src/views/pages/steps/index.vue b/src/views/pages/steps/index.vue
new file mode 100644
index 0000000..becc196
--- /dev/null
+++ b/src/views/pages/steps/index.vue
@@ -0,0 +1,51 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 下一步
+
+
+
+
+
+
diff --git a/src/views/pages/tableRules/index.vue b/src/views/pages/tableRules/index.vue
new file mode 100644
index 0000000..2e17cde
--- /dev/null
+++ b/src/views/pages/tableRules/index.vue
@@ -0,0 +1,129 @@
+
+
+
+
+
+
+ *
+ {{ item.label }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 表格验证
+ 新增一行
+
+
+
+
+
+
diff --git a/src/views/pages/tree/index.vue b/src/views/pages/tree/index.vue
new file mode 100644
index 0000000..c079f84
--- /dev/null
+++ b/src/views/pages/tree/index.vue
@@ -0,0 +1,258 @@
+
+
+
+
+
+
+
+
+ {{ node.label }}
+
+ {{ data.label1 }}
+ {{ data.label2 }}
+
+
+
+
+
+
+
+ 选择元素
+
+
+
+
+
+
+
+
diff --git a/src/views/pages/waterfall/index.vue b/src/views/pages/waterfall/index.vue
new file mode 100644
index 0000000..48b48ea
--- /dev/null
+++ b/src/views/pages/waterfall/index.vue
@@ -0,0 +1,174 @@
+
+
+
+
+
+
+
diff --git a/src/views/pages/waves/index.vue b/src/views/pages/waves/index.vue
new file mode 100644
index 0000000..405c71a
--- /dev/null
+++ b/src/views/pages/waves/index.vue
@@ -0,0 +1,134 @@
+
+
+
+ 可选参数 v-waves=" |light|red|orange|purple|green|teal"
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/pages/workflow/component/contextmenu/index.vue b/src/views/pages/workflow/component/contextmenu/index.vue
new file mode 100644
index 0000000..f55e06f
--- /dev/null
+++ b/src/views/pages/workflow/component/contextmenu/index.vue
@@ -0,0 +1,107 @@
+
+
+
+
+
+
+
+
+
diff --git a/src/views/pages/workflow/component/drawer/index.vue b/src/views/pages/workflow/component/drawer/index.vue
new file mode 100644
index 0000000..74478a2
--- /dev/null
+++ b/src/views/pages/workflow/component/drawer/index.vue
@@ -0,0 +1,73 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/pages/workflow/component/drawer/line.vue b/src/views/pages/workflow/component/drawer/line.vue
new file mode 100644
index 0000000..a19c92a
--- /dev/null
+++ b/src/views/pages/workflow/component/drawer/line.vue
@@ -0,0 +1,62 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 重置
+
+
+
+ 保存
+
+
+
+
+
+
+
diff --git a/src/views/pages/workflow/component/drawer/node.vue b/src/views/pages/workflow/component/drawer/node.vue
new file mode 100644
index 0000000..8270d2d
--- /dev/null
+++ b/src/views/pages/workflow/component/drawer/node.vue
@@ -0,0 +1,272 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 重置
+
+
+
+ 保存
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 重置
+
+
+
+ 保存
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/pages/workflow/component/tool/help.vue b/src/views/pages/workflow/component/tool/help.vue
new file mode 100644
index 0000000..09198b5
--- /dev/null
+++ b/src/views/pages/workflow/component/tool/help.vue
@@ -0,0 +1,39 @@
+
+
+
+
+
diff --git a/src/views/pages/workflow/component/tool/index.vue b/src/views/pages/workflow/component/tool/index.vue
new file mode 100644
index 0000000..2cb9940
--- /dev/null
+++ b/src/views/pages/workflow/component/tool/index.vue
@@ -0,0 +1,79 @@
+
+
+
+
+
+
+
diff --git a/src/views/pages/workflow/index.vue b/src/views/pages/workflow/index.vue
new file mode 100644
index 0000000..8a2a687
--- /dev/null
+++ b/src/views/pages/workflow/index.vue
@@ -0,0 +1,693 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ val.title }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/pages/workflow/js/config.ts b/src/views/pages/workflow/js/config.ts
new file mode 100644
index 0000000..3784c02
--- /dev/null
+++ b/src/views/pages/workflow/js/config.ts
@@ -0,0 +1,99 @@
+// jsplumb 默认配置
+export const jsplumbDefaults = {
+ // 多个锚点 [源锚点,目标锚点]
+ Anchors: [
+ 'Top',
+ 'TopCenter',
+ 'TopRight',
+ 'TopLeft',
+ 'Right',
+ 'RightMiddle',
+ 'Bottom',
+ 'BottomCenter',
+ 'BottomRight',
+ 'BottomLeft',
+ 'Left',
+ 'LeftMiddle',
+ ],
+ // 连线的容器id
+ Container: 'workflow-right',
+ // 设置链接线的形状,如直线或者曲线之类的。anchor可以去设置锚点的位置。可选值""
+ Connector: ['Bezier', { curviness: 100 }],
+ // 节点是否可以用鼠标拖动使其断开,默认为true。即用鼠标链接上的连线,也可以使用鼠标拖动让其断开。设置成false,可以让其拖动也不会自动断开
+ ConnectionsDetachable: false,
+ // 删除线的时候节点不删除
+ DeleteEndpointsOnDetach: false,
+ // 每当添加或以其他方式创建 Endpoint 并且 jsPlumb 尚未给出任何明确的 Endpoint 定义时将使用
+ Endpoint: ['Blank', { Overlays: '' }],
+ // 连接中源和目标端点的默认外观
+ EndpointStyle: { fill: '#1879ffa1', outlineWidth: 1 },
+ // jsPlumb 的内部日志记录是否打开
+ LogEnabled: true,
+ // 连接器的默认外观
+ PaintStyle: {
+ stroke: '#E0E3E7',
+ strokeWidth: 1,
+ outlineStroke: 'transparent',
+ outlineWidth: 10,
+ },
+ // 用于配置任何可拖动元素的默认选项jsPlumb.draggable
+ DragOptions: { cursor: 'pointer', zIndex: 2000 },
+ // 添加到连接器和端点的默认叠加层。已弃用:从 4.x 开始,将不支持此功能。并非所有叠加层都可以连接到连接器和端点。
+ Overlays: [
+ [
+ 'Arrow',
+ {
+ width: 10, // 箭头尾部的宽度
+ length: 8, // 从箭头的尾部到头部的距离
+ location: 1, // 位置,建议使用0~1之间
+ direction: 1, // 方向,默认值为1(表示向前),可选-1(表示向后)
+ foldback: 0.623, // 折回,也就是尾翼的角度,默认0.623,当为1时,为正三角
+ },
+ ],
+ [
+ 'Label',
+ {
+ label: '',
+ location: 0.5,
+ cssClass: 'aLabel',
+ },
+ ],
+ ],
+ // 默认渲染模式 svg、canvas
+ RenderMode: 'svg',
+ // 悬停状态下连接的默认外观
+ HoverPaintStyle: { stroke: '#b0b2b5', strokeWidth: 1 },
+ // 悬停状态下端点的默认外观
+ EndpointHoverStyle: { fill: 'red' },
+ // 端点和连接的默认范围。范围提供了对哪些端点可以连接到哪些其他端点的基本控制
+ Scope: 'jsPlumb_DefaultScope',
+};
+
+// 整个节点作为source或者target
+export const jsplumbMakeSource = {
+ // 设置可以拖拽的类名,只要鼠标移动到该类名上的DOM,就可以拖拽连线
+ filter: '.workflow-icon-drag',
+ filterExclude: false,
+ anchor: 'Continuous',
+ // 是否允许自己连接自己
+ allowLoopback: true,
+ maxConnections: -1,
+};
+
+// 整个节点作为source或者target
+export const jsplumbMakeTarget = {
+ filter: '.workflow-icon-drag',
+ filterExclude: false,
+ // 是否允许自己连接自己
+ anchor: 'Continuous',
+ allowLoopback: true,
+ dropOptions: { hoverClass: 'ef-drop-hover' },
+};
+
+// 连线参数
+export const jsplumbConnect = {
+ isSource: true,
+ isTarget: true,
+ // 动态锚点、提供了4个方向 Continuous、AutoDefault
+ anchor: 'Continuous',
+};
diff --git a/src/views/pages/workflow/js/mock.ts b/src/views/pages/workflow/js/mock.ts
new file mode 100644
index 0000000..151c3ac
--- /dev/null
+++ b/src/views/pages/workflow/js/mock.ts
@@ -0,0 +1,262 @@
+// 左侧菜单导航数据
+export const leftNavList = [
+ {
+ title: '工作流',
+ icon: 'iconfont icon-shouye',
+ isOpen: true,
+ id: '1',
+ children: [
+ {
+ icon: 'iconfont icon-gongju',
+ name: '引擎',
+ id: '11',
+ form: [
+ {
+ type: 'input',
+ label: '客户姓名',
+ prop: 'name',
+ placeholder: '请输入客户姓名',
+ required: true,
+ disabled: false,
+ },
+ {
+ type: 'select',
+ label: '性别',
+ prop: 'sex',
+ placeholder: '请选择性别',
+ required: true,
+ disabled: false,
+ options: [
+ {
+ value: '0',
+ label: '女',
+ },
+ {
+ value: '1',
+ label: '男',
+ },
+ ],
+ },
+ {
+ type: 'input',
+ label: '员工编号',
+ prop: 'number',
+ placeholder: '请输入员工编号',
+ required: true,
+ disabled: false,
+ },
+ {
+ type: 'input',
+ label: '办公电话',
+ prop: 'mobile',
+ placeholder: '请输入办公电话',
+ required: true,
+ disabled: false,
+ },
+ {
+ type: 'select',
+ label: '权限分配',
+ prop: 'role',
+ placeholder: '请选择性别',
+ required: true,
+ disabled: false,
+ options: [
+ {
+ value: '0',
+ label: '编辑权限',
+ },
+ {
+ value: '1',
+ label: '删除权限',
+ },
+ ],
+ },
+ {
+ type: 'checkbox',
+ label: '模块选择',
+ prop: 'module',
+ placeholder: '请选择模块',
+ required: true,
+ disabled: false,
+ },
+ ],
+ },
+ {
+ icon: 'iconfont icon-shouye_dongtaihui',
+ name: '模版',
+ id: '12',
+ form: [
+ {
+ type: 'input',
+ label: '等级',
+ prop: 'grade',
+ placeholder: '请输入等级',
+ required: true,
+ disabled: false,
+ },
+ {
+ type: 'input',
+ label: '登记密码',
+ prop: 'password',
+ placeholder: '请输入登记密码',
+ required: true,
+ disabled: false,
+ },
+ ],
+ },
+ {
+ icon: 'iconfont icon-zhongduancanshuchaxun',
+ name: '名称',
+ id: '13',
+ form: [
+ {
+ type: 'input',
+ label: '数据表',
+ prop: 'dataSheet',
+ placeholder: '请输入数据表',
+ required: true,
+ disabled: false,
+ },
+ {
+ type: 'input',
+ label: '字段配置',
+ prop: 'field',
+ placeholder: '请输入字段配置',
+ required: true,
+ disabled: false,
+ },
+ ],
+ },
+ {
+ icon: 'iconfont icon-zhongduancanshu',
+ name: '版本',
+ id: '14',
+ form: [
+ {
+ type: 'input',
+ label: '发布模板',
+ prop: 'publish',
+ placeholder: '请输入发布模板',
+ required: true,
+ disabled: false,
+ },
+ ],
+ },
+ {
+ icon: 'iconfont icon-bolangnengshiyanchang',
+ name: '建模',
+ id: '15',
+ form: [
+ {
+ type: 'input',
+ label: '内容模板',
+ prop: 'content',
+ placeholder: '请输入内容模板',
+ required: true,
+ disabled: false,
+ },
+ ],
+ },
+ {
+ icon: 'iconfont icon-xingqiu',
+ name: '节点',
+ id: '16',
+ form: [
+ {
+ type: 'input',
+ label: '活动名称6',
+ prop: 'name16',
+ },
+ ],
+ },
+ ],
+ },
+ {
+ title: '流程',
+ isOpen: true,
+ icon: 'iconfont icon-caijian',
+ id: '2',
+ children: [
+ {
+ icon: 'iconfont icon-fuwenben',
+ name: '实例',
+ id: '21',
+ form: [
+ {
+ type: 'input',
+ label: '活动名称7',
+ prop: 'name21',
+ },
+ ],
+ },
+ {
+ icon: 'iconfont icon-fuwenbenkuang',
+ name: '轨迹',
+ id: '22',
+ form: [
+ {
+ type: 'input',
+ label: '活动名称8',
+ prop: 'name22',
+ },
+ ],
+ },
+ {
+ icon: 'iconfont icon-shangchuan',
+ name: '数据',
+ id: '23',
+ form: [
+ {
+ type: 'input',
+ label: '活动名称9',
+ prop: 'name23',
+ },
+ ],
+ },
+ ],
+ },
+ {
+ title: '任务',
+ isOpen: true,
+ icon: 'iconfont icon-shuju',
+ id: '3',
+ children: [
+ {
+ icon: 'iconfont icon-icon-',
+ name: '参与人',
+ id: '31',
+ form: [
+ {
+ type: 'input',
+ label: '活动名称1',
+ prop: 'name31',
+ },
+ ],
+ },
+ {
+ icon: 'iconfont icon-gerenzhongxin',
+ name: '执行人',
+ id: '32',
+ form: [
+ {
+ type: 'input',
+ label: '活动名称2',
+ prop: 'name32',
+ },
+ ],
+ },
+ {
+ icon: 'iconfont icon-fangkuang',
+ name: '工单',
+ id: '33',
+ form: [
+ {
+ type: 'input',
+ label: '活动名称3',
+ prop: 'name33',
+ },
+ ],
+ },
+ ],
+ },
+];
diff --git a/src/views/params/common/details.vue b/src/views/params/common/details.vue
new file mode 100644
index 0000000..9ba885e
--- /dev/null
+++ b/src/views/params/common/details.vue
@@ -0,0 +1,52 @@
+
+
+
+
paramsCommonDetails
+
路径:path: {{ params.path }}
+
参数:query: {{ params.query }}
+
+
+
+
+
diff --git a/src/views/params/common/index.vue b/src/views/params/common/index.vue
new file mode 100644
index 0000000..733156c
--- /dev/null
+++ b/src/views/params/common/index.vue
@@ -0,0 +1,100 @@
+
+
+
+
+
+
+
+ 1、设置非国际化:格式:tagsViewName=xxx
+
+ 2、设置国际化:格式:tagsViewName=JSON.stringify({"zh-cn":"测试用","en":"test+page","zh-tw":"測試用"})
+
+ 3、设置国际化后,去顶栏切换语言查看演示效果
+
+
+
+
+
+
+
+
+ 普通路由传参
+
+
+
+ {{ tagsViewNameIsI18n ? '普通的演示' : '国际化演示' }}
+
+
+
+
+
+
+
+
diff --git a/src/views/params/dynamic/details.vue b/src/views/params/dynamic/details.vue
new file mode 100644
index 0000000..7283ba1
--- /dev/null
+++ b/src/views/params/dynamic/details.vue
@@ -0,0 +1,52 @@
+
+
+
+
paramsDynamicDetails
+
路径:path: {{ params.path }}
+
参数:params: {{ params.params }}
+
+
+
+
+
diff --git a/src/views/params/dynamic/index.vue b/src/views/params/dynamic/index.vue
new file mode 100644
index 0000000..e5246fe
--- /dev/null
+++ b/src/views/params/dynamic/index.vue
@@ -0,0 +1,102 @@
+
+
+
+
+
+
+
+ 1、设置非国际化:格式:tagsViewName=xxx
+
+ 2、设置国际化:格式:tagsViewName=JSON.stringify({"zh-cn":"测试用","en":"test+page","zh-tw":"測試用"})
+
+ 3、设置国际化后,去顶栏切换语言查看演示效果
+
+
+
+
+
+
+
+
+ 动态路由传参
+
+
+
+ {{ tagsViewNameIsI18n ? '普通的演示' : '国际化演示' }}
+
+
+
+
+
+
+
+
diff --git a/src/views/personal/index.vue b/src/views/personal/index.vue
new file mode 100644
index 0000000..d8bc786
--- /dev/null
+++ b/src/views/personal/index.vue
@@ -0,0 +1,387 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ currentTime }},admin,生活变的再糟糕,也不妨碍我变得更好!
+
+
+
+ 昵称:
+ 小柒
+
+
+ 身份:
+ 超级管理
+
+
+
+
+
+
+ 登录IP:
+ 192.168.1.1
+
+
+ 登录时间:
+ 2021-02-05 18:47:26
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 消息通知
+ 更多
+
+
+
+
+
+
+
+
+
+
+
+
+
+
{{ v.title }}
+
{{ v.msg }}
+
+
+
+
+
+
+
+
+
+
+ 基本信息
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 更新个人信息
+
+
+
+
+
+ 账号安全
+
+
+
+
+
密保手机
+
已绑定手机:132****4108
+
+
+ 立即修改
+
+
+
+
+
+
+
密保问题
+
已设置密保问题,账号安全大幅度提升
+
+
+ 立即设置
+
+
+
+
+
+
+
绑定QQ
+
已绑定QQ:110****566
+
+
+ 立即设置
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/personal/mock.ts b/src/views/personal/mock.ts
new file mode 100644
index 0000000..ff57575
--- /dev/null
+++ b/src/views/personal/mock.ts
@@ -0,0 +1,66 @@
+/**
+ * 消息通知
+ * @returns 返回模拟数据
+ */
+export const newsInfoList: Array