Compare commits

..

19 Commits

Author SHA1 Message Date
xiaoxian521
504b45783f release: update 3.6.3 2022-11-01 16:18:12 +08:00
xiaoxian521
27bc135bd2 fix: 修复当token过期后,如果页面有多个请求会重复刷新token 2022-11-01 16:06:22 +08:00
xiaoxian521
4d91d2017c perf: 优化代码 2022-10-31 10:22:01 +08:00
xiaoxian521
523c979488 docs: update 2022-10-28 15:57:11 +08:00
xiaoxian521
d2bba801d9 chore: update 2022-10-28 14:07:47 +08:00
一万
ceb1ec6e6d feat: add danmaku demo (#362)
* feat: add danmaku demo

* fix: /@/改为@/

* fix: update
2022-10-28 12:27:59 +08:00
xiaoxian521
aa83ea83fa feat: 静态资源分类打包 2022-10-27 15:51:59 +08:00
xiaoxian521
4a7d5d6573 style: update 2022-10-27 14:40:43 +08:00
xiaoxian521
b69db2ff2c fix: 修复tailwindcss最新版新增的collapse属性与平台class类名冲突 2022-10-27 14:33:36 +08:00
xiaoxian521
c288d438dc release: update 3.6.2 2022-10-27 12:58:44 +08:00
xiaoxian521
94f72cd6d9 refactor: 使用@/别名替换/@/别名 2022-10-27 12:43:01 +08:00
xiaoxian521
307944cdb5 release: update 3.6.1 2022-10-27 02:42:33 +08:00
xiaoxian521
f5a75356df feat: 打包构建添加可选 gzipbrotli 压缩模式 2022-10-27 02:35:56 +08:00
xiaoxian521
54ebd19875 feat: 添加打包是否启动cdn替换本地库配置,默认false不启动 2022-10-26 19:44:44 +08:00
xiaoxian521
303fc25af3 fix: 修复路由中父级name不应和子级name重复,会造成重定向跳转404问题 2022-10-26 11:09:33 +08:00
xiaoxian521
a455072d7a chore: update axios latest 2022-10-26 00:16:34 +08:00
xiaoxian521
2bbf04b191 chore: update 2022-10-25 17:36:35 +08:00
xiaoxian521
e4c33a7d22 fix: 修复title过长显示样式问题 2022-10-25 15:50:18 +08:00
xiaoxian521
6765ce8644 workflow: update 2022-10-25 13:33:31 +08:00
132 changed files with 1540 additions and 442 deletions

View File

@@ -8,4 +8,12 @@ VITE_ROUTER_HISTORY = "hash"
VITE_PROXY_DOMAIN_REAL = ""
# 是否为打包后的文件提供传统浏览器兼容性支持 支持 true 不支持 false
VITE_LEGACY = false
VITE_LEGACY = false
# 是否在打包时使用cdn替换本地库 替换 true 不替换 false
VITE_CDN = false
# 是否启用gzip压缩或brotli压缩分两种情况删除原始文件和不删除原始文件
# 压缩时不删除原始文件的配置gzip、brotli、both同时开启 gzip 与 brotli 压缩、none不开启压缩默认
# 压缩时删除原始文件的配置gzip-clear、brotli-clear、both-clear同时开启 gzip 与 brotli 压缩、none不开启压缩默认
VITE_COMPRESSION = "none"

View File

@@ -12,3 +12,11 @@ VITE_PROXY_DOMAIN_REAL = ""
# 是否为打包后的文件提供传统浏览器兼容性支持 支持 true 不支持 false
VITE_LEGACY = false
# 是否在打包时使用cdn替换本地库 替换 true 不替换 false
VITE_CDN = false
# 是否启用gzip压缩或brotli压缩分两种情况删除原始文件和不删除原始文件
# 压缩时不删除原始文件的配置gzip、brotli、both同时开启 gzip 与 brotli 压缩、none不开启压缩默认
# 压缩时删除原始文件的配置gzip-clear、brotli-clear、both-clear同时开启 gzip 与 brotli 压缩、none不开启压缩默认
VITE_COMPRESSION = "none"

View File

@@ -4,7 +4,7 @@ permissions:
on:
push:
branches:
- gitee
- master
jobs:
deploy:
concurrency: ci-${{ github.ref }}

View File

@@ -1,3 +1,37 @@
# 3.6.3 (2022-11-01)
### 🎫 Feat
- Static resource classification and packaging
- Add danmaku component `demo`
### 🐞 Bug fixes
- Fix the `collapse` property added in the latest version of `tailwindcss` conflicts with the platform `class` class name
- Fix that when the `token` expires, if the page has multiple requests, the `token` will be refreshed repeatedly
# 3.6.2 (2022-10-27)
### ✔️ refactor
- Replace `/@/` alias with `@/` alias
# 3.6.1 (2022-10-27)
### 🎫 Feat
- Add whether to start `cdn` for packaging to replace the local library configuration, the default `false` does not start
- Added optional `gzip` and `brotli` compression modes for packaging builds
### 🐞 Bug fixes
- Fix `title` too long display style problem
- Fix the parent `name` in the route should not be repeated with the child `name`, which will cause redirection to jump `404` problem
### 🍏 Perf
- Upgrade `axios` to the latest version
# 3.6.0 (2022-10-25)
### 🎫 Feat

View File

@@ -1,3 +1,37 @@
# 3.6.3 (2022-11-01)
### 🎫 Feat
- Static resource classification and packaging
- Add danmaku component `demo`
### 🐞 Bug fixes
- Fix the `collapse` property added in the latest version of `tailwindcss` conflicts with the platform `class` class name
- Fix that when the `token` expires, if the page has multiple requests, the `token` will be refreshed repeatedly
# 3.6.2 (2022-10-27)
### ✔️ refactor
- Replace `/@/` alias with `@/` alias
# 3.6.1 (2022-10-27)
### 🎫 Feat
- Add whether to start `cdn` for packaging to replace the local library configuration, the default `false` does not start
- Added optional `gzip` and `brotli` compression modes for packaging builds
### 🐞 Bug fixes
- Fix `title` too long display style problem
- Fix the parent `name` in the route should not be repeated with the child `name`, which will cause redirection to jump `404` problem
### 🍏 Perf
- Upgrade `axios` to the latest version
# 3.6.0 (2022-10-25)
### 🎫 Feat

View File

@@ -1,3 +1,37 @@
# 3.6.3 (2022-11-01)
### 🎫 Feat
- 静态资源分类打包
- 添加弹幕组件 `demo`
### 🐞 Bug fixes
- 修复 `tailwindcss` 最新版新增的 `collapse` 属性与平台 `class` 类名冲突
- 修复当 `token` 过期后,如果页面有多个请求会重复刷新 `token`
# 3.6.2 (2022-10-27)
### ✔️ refactor
- 使用`@/`别名替换`/@/`别名
# 3.6.1 (2022-10-27)
### 🎫 Feat
- 添加打包是否启动`cdn`替换本地库配置,默认`false`不启动
- 添加打包构建可选`gzip``brotli`压缩模式
### 🐞 Bug fixes
- 修复`title`过长显示样式问题
- 修复路由中父级`name`不应和子级`name`重复,会造成重定向跳转`404`问题
### 🍏 Perf
- 升级`axios`至最新版
# 3.6.0 (2022-10-25)
### 🎫 Feat

View File

@@ -21,9 +21,10 @@ vue-pure-admin is a free and open source middle and back-end template. Using the
- [Click me to view foreign document site 1](https://xiaoxian521.github.io/pure-admin-doc)
- [Click me to view foreign document site 2](https://pure-admin-doc.vercel.app)
## Thin
## Thin version (offering non-internationalized and internationalized versions)
- [Click Watch Thin](https://github.com/xiaoxian521/pure-admin-thin)
- [Click me to view the non-internationalized version](https://github.com/xiaoxian521/pure-admin-thin)
- [Click me to view Internationalization version](https://github.com/xiaoxian521/pure-admin-thin/tree/i18n)
## Tauri

View File

@@ -21,9 +21,10 @@ vue-pure-admin 是一个免费开源的中后台模版。使用了最新的`vue3
- [点我查看国外文档站 1](https://xiaoxian521.github.io/pure-admin-doc)
- [点我查看国外文档站 2](https://pure-admin-doc.vercel.app)
## 精简版
## 精简版(提供非国际化、国际化两个版本选择)
- [点我查看精简版](https://github.com/xiaoxian521/pure-admin-thin)
- [点我查看非国际化精简版](https://github.com/xiaoxian521/pure-admin-thin)
- [点我查看国际化精简版](https://github.com/xiaoxian521/pure-admin-thin/tree/i18n)
## Tauri 版

67
build/cdn.ts Normal file
View File

@@ -0,0 +1,67 @@
import { Plugin as importToCDN } from "vite-plugin-cdn-import";
/**
* @description 打包时采用`cdn`模式仅限外网使用默认不采用如果需要采用cdn模式请在 .env.production 文件,将 VITE_CDN 设置成true
* 平台采用国内cdnhttps://www.bootcdn.cn当然你也可以选择 https://unpkg.com 或者 https://www.jsdelivr.com
* 提醒mockjs不能用cdn模式引入会报错。正确的方式是生产环境删除mockjs使用真实的后端请求
* 注意上面提到的仅限外网使用也不是完全肯定的如果你们公司内网部署的有相关js、css文件也可以将下面配置对应改一下整一套内网版cdn
*/
export const cdn = importToCDN({
//prodUrl解释 name: 对应下面modules的nameversion: 自动读取本地package.json中dependencies依赖中对应包的版本号path: 对应下面modules的path
prodUrl: "https://cdn.bootcdn.net/ajax/libs/{name}/{version}/{path}",
modules: [
{
name: "vue",
var: "Vue",
path: "vue.global.prod.min.js"
},
{
name: "vue-router",
var: "VueRouter",
path: "vue-router.global.min.js"
},
{
name: "vue-i18n",
var: "VueI18n",
path: "vue-i18n.runtime.global.prod.min.js"
},
// 项目中没有直接安装vue-demi但是pinia用到了所以需要在引入pinia前引入vue-demihttps://github.com/vuejs/pinia/blob/v2/packages/pinia/package.json#L77
{
name: "vue-demi",
var: "VueDemi",
path: "index.iife.min.js"
},
{
name: "pinia",
var: "Pinia",
path: "pinia.iife.min.js"
},
{
name: "element-plus",
var: "ElementPlus",
path: "index.full.min.js",
css: "index.min.css"
},
{
name: "axios",
var: "axios",
path: "axios.min.js"
},
{
name: "dayjs",
var: "dayjs",
path: "dayjs.min.js"
},
{
name: "echarts",
var: "echarts",
path: "echarts.min.js"
},
{
name: "lodash",
var: "lodash",
// 可写`完整路径`,会替换`prodUrl`
path: "https://cdn.bootcdn.net/ajax/libs/lodash.js/4.17.21/lodash.min.js"
}
]
});

63
build/compress.ts Normal file
View File

@@ -0,0 +1,63 @@
import type { Plugin } from "vite";
import { isArray } from "@pureadmin/utils";
import compressPlugin from "vite-plugin-compression";
export const configCompressPlugin = (
compress: ViteCompression
): Plugin | Plugin[] => {
if (compress === "none") return null;
const gz = {
// 生成的压缩包后缀
ext: ".gz",
// 体积大于threshold才会被压缩
threshold: 0,
// 默认压缩.js|mjs|json|css|html后缀文件设置成true压缩全部文件
filter: () => true,
// 压缩后是否删除原始文件
deleteOriginFile: false
};
const br = {
ext: ".br",
algorithm: "brotliCompress",
threshold: 0,
filter: () => true,
deleteOriginFile: false
};
const codeList = [
{ k: "gzip", v: gz },
{ k: "brotli", v: br },
{ k: "both", v: [gz, br] }
];
const plugins: Plugin[] = [];
codeList.forEach(item => {
if (compress.includes(item.k)) {
if (compress.includes("clear")) {
if (isArray(item.v)) {
item.v.forEach(vItem => {
plugins.push(
compressPlugin(Object.assign(vItem, { deleteOriginFile: true }))
);
});
} else {
plugins.push(
compressPlugin(Object.assign(item.v, { deleteOriginFile: true }))
);
}
} else {
if (isArray(item.v)) {
item.v.forEach(vItem => {
plugins.push(compressPlugin(vItem));
});
} else {
plugins.push(compressPlugin(item.v));
}
}
}
});
return plugins;
};

View File

@@ -7,7 +7,9 @@ const warpperEnv = (envConf: Recordable): ViteEnv => {
VITE_PROXY_DOMAIN: "",
VITE_PROXY_DOMAIN_REAL: "",
VITE_ROUTER_HISTORY: "",
VITE_LEGACY: false
VITE_LEGACY: false,
VITE_CDN: false,
VITE_COMPRESSION: "none"
};
for (const envName of Object.keys(envConf)) {

View File

@@ -1,3 +1,4 @@
import { cdn } from "./cdn";
import { resolve } from "path";
import vue from "@vitejs/plugin-vue";
import { viteBuildInfo } from "./info";
@@ -5,14 +6,20 @@ import svgLoader from "vite-svg-loader";
import legacy from "@vitejs/plugin-legacy";
import vueJsx from "@vitejs/plugin-vue-jsx";
import { viteMockServe } from "vite-plugin-mock";
import { configCompressPlugin } from "./compress";
import VueI18n from "@intlify/vite-plugin-vue-i18n";
import { visualizer } from "rollup-plugin-visualizer";
import removeConsole from "vite-plugin-remove-console";
import themePreprocessorPlugin from "@pureadmin/theme";
import { genScssMultipleScopeVars } from "/@/layout/theme";
import DefineOptions from "unplugin-vue-define-options/vite";
import { genScssMultipleScopeVars } from "../src/layout/theme";
export function getPluginsList(command, VITE_LEGACY) {
export function getPluginsList(
command: string,
VITE_LEGACY: boolean,
VITE_CDN: boolean,
VITE_COMPRESSION: ViteCompression
) {
const prodMock = true;
const lifecycle = process.env.npm_lifecycle_event;
return [
@@ -25,6 +32,8 @@ export function getPluginsList(command, VITE_LEGACY) {
}),
// jsx、tsx语法支持
vueJsx(),
VITE_CDN ? cdn : null,
configCompressPlugin(VITE_COMPRESSION),
DefineOptions(),
// 线上环境删除console
removeConsole({ external: ["src/assets/iconfont/iconfont.js"] }),

View File

@@ -94,6 +94,7 @@ menus:
hsPdf: PDF Preview
hsExecl: Export Excel
hsInfiniteScroll: Table Infinite Scroll
hsdanmaku: Danmaku Components
status:
hsLoad: Loading...
login:

View File

@@ -94,6 +94,7 @@ menus:
hsPdf: PDF预览
hsExecl: 导出Excel
hsInfiniteScroll: 表格无限滚动
hsdanmaku: 弹幕组件
status:
hsLoad: 加载中...
login:

View File

@@ -68,8 +68,8 @@ const permissionRouter = {
path: "/permission/page/index",
name: "PermissionPage",
meta: {
roles: ["admin", "common"],
title: "menus.permissionPage"
title: "menus.permissionPage",
roles: ["admin", "common"]
}
},
{

View File

@@ -10,8 +10,8 @@ export default [
return {
success: true,
data: {
accessToken: "eyJhbGciOiJIUzUxMiJ9.admin",
refreshToken: "eyJhbGciOiJIUzUxMiJ9.adminRefresh",
accessToken: "eyJhbGciOiJIUzUxMiJ9.newAdmin",
refreshToken: "eyJhbGciOiJIUzUxMiJ9.newAdminRefresh",
// `expires`选择这种日期格式是为了方便调试,后端直接设置时间戳或许更方便(每次都应该递增)。如果后端返回的是时间戳格式,前端开发请来到这个目录`src/utils/auth.ts`,把第`38`行的代码换成expires = data.expires即可。
expires: "2023/10/30 23:59:59"
}

View File

@@ -1,6 +1,6 @@
{
"name": "vue-pure-admin",
"version": "3.6.0",
"version": "3.6.3",
"private": true,
"scripts": {
"dev": "NODE_OPTIONS=--max-old-space-size=4096 vite",
@@ -36,13 +36,13 @@
"@pureadmin/descriptions": "^1.1.0",
"@pureadmin/table": "^1.2.0",
"@pureadmin/utils": "^1.1.5",
"@vueuse/core": "^9.3.0",
"@vueuse/core": "^9.4.0",
"@vueuse/motion": "^2.0.0-beta.12",
"@vueuse/shared": "^9.3.0",
"@vueuse/shared": "^9.4.0",
"@wangeditor/editor": "^5.1.21",
"@wangeditor/editor-for-vue": "^5.1.12",
"animate.css": "^4.1.1",
"axios": "^0.27.2",
"axios": "^1.1.3",
"china-area-data": "^5.0.1",
"cropperjs": "^1.5.12",
"dayjs": "^1.11.5",
@@ -66,7 +66,7 @@
"resize-observer-polyfill": "^1.5.1",
"responsive-storage": "^2.1.0",
"sortablejs": "^1.15.0",
"swiper": "^8.4.3",
"swiper": "^8.4.4",
"typeit": "^8.7.0",
"v-contextmenu": "3.0.0",
"vue": "^3.2.40",
@@ -74,13 +74,14 @@
"vue-i18n": "^9.2.2",
"vue-json-pretty": "^2.2.2",
"vue-pdf-embed": "^1.1.4",
"vue-router": "^4.1.5",
"vue-router": "^4.1.6",
"vue-types": "^4.2.1",
"vue-virtual-scroller": "^2.0.0-alpha.1",
"vue3-danmaku": "^1.0.0",
"vuedraggable": "^4.1.0",
"vxe-table": "^4.3.5",
"xe-utils": "^3.5.7",
"xgplayer": "^2.32.0",
"xgplayer": "^2.32.1",
"xlsx": "^0.18.5"
},
"devDependencies": {
@@ -142,11 +143,13 @@
"stylelint-config-recommended": "^6.0.0",
"stylelint-config-standard": "^24.0.0",
"stylelint-order": "^5.0.0",
"tailwindcss": "^3.1.8",
"tailwindcss": "^3.2.1",
"terser": "^5.15.0",
"typescript": "^4.7.4",
"unplugin-vue-define-options": "0.7.3",
"vite": "^3.1.8",
"vite-plugin-cdn-import": "^0.3.5",
"vite-plugin-compression": "^0.5.1",
"vite-plugin-mock": "^2.9.6",
"vite-plugin-remove-console": "^1.1.0",
"vite-svg-loader": "^3.6.0",

184
pnpm-lock.yaml generated
View File

@@ -41,14 +41,14 @@ specifiers:
"@vue/eslint-config-prettier": ^7.0.0
"@vue/eslint-config-typescript": ^10.0.0
"@vue/runtime-core": ^3.2.40
"@vueuse/core": ^9.3.0
"@vueuse/core": ^9.4.0
"@vueuse/motion": ^2.0.0-beta.12
"@vueuse/shared": ^9.3.0
"@vueuse/shared": ^9.4.0
"@wangeditor/editor": ^5.1.21
"@wangeditor/editor-for-vue": ^5.1.12
animate.css: ^4.1.1
autoprefixer: ^10.4.12
axios: ^0.27.2
axios: ^1.1.3
china-area-data: ^5.0.1
cloc: ^2.10.0
cropperjs: ^1.5.12
@@ -97,14 +97,16 @@ specifiers:
stylelint-config-recommended: ^6.0.0
stylelint-config-standard: ^24.0.0
stylelint-order: ^5.0.0
swiper: ^8.4.3
tailwindcss: ^3.1.8
swiper: ^8.4.4
tailwindcss: ^3.2.1
terser: ^5.15.0
typeit: ^8.7.0
typescript: ^4.7.4
unplugin-vue-define-options: 0.7.3
v-contextmenu: 3.0.0
vite: ^3.1.8
vite-plugin-cdn-import: ^0.3.5
vite-plugin-compression: ^0.5.1
vite-plugin-mock: ^2.9.6
vite-plugin-remove-console: ^1.1.0
vite-svg-loader: ^3.6.0
@@ -114,14 +116,15 @@ specifiers:
vue-i18n: ^9.2.2
vue-json-pretty: ^2.2.2
vue-pdf-embed: ^1.1.4
vue-router: ^4.1.5
vue-router: ^4.1.6
vue-tsc: ^0.40.13
vue-types: ^4.2.1
vue-virtual-scroller: ^2.0.0-alpha.1
vue3-danmaku: ^1.0.0
vuedraggable: ^4.1.0
vxe-table: ^4.3.5
xe-utils: ^3.5.7
xgplayer: ^2.32.0
xgplayer: ^2.32.1
xlsx: ^0.18.5
dependencies:
@@ -133,13 +136,13 @@ dependencies:
"@pureadmin/descriptions": 1.1.0
"@pureadmin/table": 1.2.0
"@pureadmin/utils": 1.1.5_888d42e6b1d4aaf209a7326195b5949d
"@vueuse/core": 9.3.0_vue@3.2.40
"@vueuse/core": 9.4.0_vue@3.2.40
"@vueuse/motion": 2.0.0-beta.12_vue@3.2.40
"@vueuse/shared": 9.3.0_vue@3.2.40
"@vueuse/shared": 9.4.0_vue@3.2.40
"@wangeditor/editor": 5.1.21
"@wangeditor/editor-for-vue": 5.1.12_671b67f2147af6cd32d57e9d16d7b064
animate.css: 4.1.1
axios: 0.27.2
axios: 1.1.3
china-area-data: 5.0.1
cropperjs: 1.5.12
dayjs: 1.11.5
@@ -163,7 +166,7 @@ dependencies:
resize-observer-polyfill: 1.5.1
responsive-storage: 2.1.0
sortablejs: 1.15.0
swiper: 8.4.3
swiper: 8.4.4
typeit: 8.7.0
v-contextmenu: 3.0.0_vue@3.2.40
vue: 3.2.40
@@ -171,13 +174,14 @@ dependencies:
vue-i18n: 9.2.2_vue@3.2.40
vue-json-pretty: 2.2.2_vue@3.2.40
vue-pdf-embed: 1.1.4_vue@3.2.40
vue-router: 4.1.5_vue@3.2.40
vue-router: 4.1.6_vue@3.2.40
vue-types: 4.2.1_vue@3.2.40
vue-virtual-scroller: 2.0.0-alpha.1_vue@3.2.40
vue3-danmaku: 1.0.0_vue@3.2.40
vuedraggable: 4.1.0_vue@3.2.40
vxe-table: 4.3.5_vue@3.2.40+xe-utils@3.5.7
xe-utils: 3.5.7
xgplayer: 2.32.0
xgplayer: 2.32.1
xlsx: 0.18.5
devDependencies:
@@ -239,11 +243,13 @@ devDependencies:
stylelint-config-recommended: 6.0.0_stylelint@14.13.0
stylelint-config-standard: 24.0.0_stylelint@14.13.0
stylelint-order: 5.0.0_stylelint@14.13.0
tailwindcss: 3.1.8
tailwindcss: 3.2.1
terser: 5.15.1
typescript: 4.8.4
unplugin-vue-define-options: 0.7.3_vite@3.1.8+vue@3.2.40
vite: 3.1.8_sass@1.55.0+terser@5.15.1
vite-plugin-cdn-import: 0.3.5
vite-plugin-compression: 0.5.1_vite@3.1.8
vite-plugin-mock: 2.9.6_mockjs@1.1.0+vite@3.1.8
vite-plugin-remove-console: 1.1.0
vite-svg-loader: 3.6.0
@@ -1681,10 +1687,10 @@ packages:
}
dev: false
/@types/web-bluetooth/0.0.15:
/@types/web-bluetooth/0.0.16:
resolution:
{
integrity: sha512-w7hEHXnPMEZ+4nGKl/KDRVpxkwYxYExuHOYXyzIzCDzEZ9ZCGMAewulr9IqJu2LR4N37fcnb1XVeuZ09qgOxhA==
integrity: sha512-oh8q2Zc32S6gd/j50GowEjKLoOVOwHP/bWVjKJInBwQqdOYMdPrf1oVlelTlyfFK3CKxL1uahMDAr+vy8T7yMQ==
}
dev: false
@@ -2080,6 +2086,13 @@ packages:
}
dev: false
/@vue/devtools-api/6.4.5:
resolution:
{
integrity: sha512-JD5fcdIuFxU4fQyXUu3w2KpAJHzTVdN+p4iOX2lMWSHMOoQdMAcpFLZzm9Z/2nmsoZ1a96QEhZ26e50xLBsgOQ==
}
dev: false
/@vue/eslint-config-prettier/7.0.0_eslint@8.25.0+prettier@2.7.1:
resolution:
{
@@ -2215,15 +2228,15 @@ packages:
vue-demi: 0.13.11_vue@3.2.40
dev: false
/@vueuse/core/9.3.0_vue@3.2.40:
/@vueuse/core/9.4.0_vue@3.2.40:
resolution:
{
integrity: sha512-64Rna8IQDWpdrJxgitDg7yv1yTp41ZmvV8zlLEylK4QQLWAhz1OFGZDPZ8bU4lwcGgbEJ2sGi2jrdNh4LttUSQ==
integrity: sha512-JzgenGj1ZF2BHOen5rsFiAyyI9sXAv7aKhNLlm9b7SwYQeKTcxTWdhudonURCSP3Egl9NQaRBzes2lv/1JUt/Q==
}
dependencies:
"@types/web-bluetooth": 0.0.15
"@vueuse/metadata": 9.3.0
"@vueuse/shared": 9.3.0_vue@3.2.40
"@types/web-bluetooth": 0.0.16
"@vueuse/metadata": 9.4.0
"@vueuse/shared": 9.4.0_vue@3.2.40
vue-demi: 0.13.11_vue@3.2.40
transitivePeerDependencies:
- "@vue/composition-api"
@@ -2237,10 +2250,10 @@ packages:
}
dev: false
/@vueuse/metadata/9.3.0:
/@vueuse/metadata/9.4.0:
resolution:
{
integrity: sha512-GnnfjbzIPJIh9ngL9s9oGU1+Hx/h5/KFqTfJykzh/1xjaHkedV9g0MASpdmPZIP+ynNhKAcEfA6g5i8KXwtoMA==
integrity: sha512-7GKMdGAsJyQJl35MYOz/RDpP0FxuiZBRDSN79QIPbdqYx4Sd0sVTnIC68KJ6Oln0t0SouvSUMvRHuno216Ud2Q==
}
dev: false
@@ -2283,10 +2296,10 @@ packages:
vue-demi: 0.13.11_vue@3.2.40
dev: false
/@vueuse/shared/9.3.0_vue@3.2.40:
/@vueuse/shared/9.4.0_vue@3.2.40:
resolution:
{
integrity: sha512-caGUWLY0DpPC6l31KxeUy6vPVNA0yKxx81jFYLoMpyP6cF84FG5Dkf69DfSUqL57wX8JcUkJDMnQaQIZPWFEQQ==
integrity: sha512-fTuem51KwMCnqUKkI8B57qAIMcFovtGgsCtAeqxIzH3i6nE9VYge+gVfneNHAAy7lj8twbkNfqQSygOPJTm4tQ==
}
dependencies:
vue-demi: 0.13.11_vue@3.2.40
@@ -2852,14 +2865,15 @@ packages:
postcss-value-parser: 4.2.0
dev: true
/axios/0.27.2:
/axios/1.1.3:
resolution:
{
integrity: sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==
integrity: sha512-00tXVRwKx/FZr/IDVFt4C+f9FYairX517WoGCL6dpOntqLkZofjhu43F/Xl44UOpqa+9sLFDrG/XAnFsUYgkDA==
}
dependencies:
follow-redirects: 1.15.2
form-data: 4.0.0
proxy-from-env: 1.1.0
transitivePeerDependencies:
- debug
dev: false
@@ -3579,10 +3593,10 @@ packages:
type: 1.2.0
dev: false
/danmu.js/1.1.1:
/danmu.js/1.1.2:
resolution:
{
integrity: sha512-UmnwBCMbedOw8p6Xrl2HZECOmtCOJ3wL709IBQti+u1tHpDyt/rTjbu3I+NUZ8JzBMf3nscf4fAaWXV/mpKx5g==
integrity: sha512-QbJYDP7qJ70fZgq+2bm2xj4jLNymC1wYKfb8cM8Y89w3GRdbCgxV39Znoj45AWU3WYzK/CVN7papo+BmoJ7RjQ==
}
dependencies:
event-emitter: 0.3.5
@@ -3673,10 +3687,10 @@ packages:
engines: { node: ">=8" }
dev: true
/defined/1.0.0:
/defined/1.0.1:
resolution:
{
integrity: sha512-Y2caI5+ZwS5c3RiNDJ6u53VhQHv+hHKwhkI1iHvceKUHw9Df6EK2zRLfjejRgMuCuxK7PfSWIMwWecceVvThjQ==
integrity: sha512-hsBd2qSVCRE+5PmNdHt1uzyrFu5d3RwmFDKzyNZMFq/EwDNJF7Ee5+D5oEKF0hU6LhtoUF1macFvOe4AskQC1Q==
}
dev: true
@@ -3697,8 +3711,8 @@ packages:
hasBin: true
dependencies:
acorn-node: 1.8.2
defined: 1.0.0
minimist: 1.2.6
defined: 1.0.1
minimist: 1.2.7
dev: true
/didyoumean/1.2.2:
@@ -3935,7 +3949,7 @@ packages:
"@popperjs/core": /@sxzz/popperjs-es/2.11.7
"@types/lodash": 4.14.186
"@types/lodash-es": 4.17.6
"@vueuse/core": 9.3.0_vue@3.2.40
"@vueuse/core": 9.4.0_vue@3.2.40
async-validator: 4.2.5
dayjs: 1.11.5
escape-html: 1.0.3
@@ -5513,6 +5527,15 @@ packages:
}
engines: { node: ">=0.10.0" }
/is-reference/1.2.1:
resolution:
{
integrity: sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==
}
dependencies:
"@types/estree": 0.0.39
dev: true
/is-regexp/1.0.0:
resolution:
{
@@ -6170,10 +6193,10 @@ packages:
kind-of: 6.0.3
dev: true
/minimist/1.2.6:
/minimist/1.2.7:
resolution:
{
integrity: sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==
integrity: sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==
}
dev: true
@@ -6920,10 +6943,10 @@ packages:
postcss-selector-parser: 6.0.10
dev: true
/postcss-nested/5.0.6_postcss@8.4.17:
/postcss-nested/6.0.0_postcss@8.4.17:
resolution:
{
integrity: sha512-rKqm2Fk0KbA8Vt3AdGN0FB9OBOMDVajMG6ZCf/GoHgdxUJ4sBFp0A/uMIRm+MJUdo33YXEtjqIz8u7DAp8B7DA==
integrity: sha512-0DkamqrPcmkBDsLn+vQDIrtkSbNkv5AD/M322ySo9kqFkCIYklym2xEmWkwo+Y3/qZo34tzEPNUw4y7yMCdv5w==
}
engines: { node: ">=12.0" }
peerDependencies:
@@ -7259,6 +7282,13 @@ packages:
engines: { node: ">= 0.6.0" }
dev: false
/proxy-from-env/1.1.0:
resolution:
{
integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==
}
dev: false
/pump/3.0.0:
resolution:
{
@@ -7523,6 +7553,23 @@ packages:
glob: 7.2.3
dev: true
/rollup-plugin-external-globals/0.6.1:
resolution:
{
integrity: sha512-mlp3KNa5sE4Sp9UUR2rjBrxjG79OyZAh/QC18RHIjM+iYkbBwNXSo8DHRMZWtzJTrH8GxQ+SJvCTN3i14uMXIA==
}
peerDependencies:
rollup: ^2.25.0
peerDependenciesMeta:
rollup:
optional: true
dependencies:
"@rollup/pluginutils": 4.2.1
estree-walker: 2.0.2
is-reference: 1.2.1
magic-string: 0.25.9
dev: true
/rollup-plugin-visualizer/5.8.2:
resolution:
{
@@ -8235,10 +8282,10 @@ packages:
stable: 0.1.8
dev: true
/swiper/8.4.3:
/swiper/8.4.4:
resolution:
{
integrity: sha512-+Ne/3rSZ1t28r//Upg8AdLgXJ+/nTw79GZFl6RQb2TckfnX6JTQZWWiNTT3uqP9Cyixb+OhT9fRBqAWnjM444A==
integrity: sha512-jA/8BfOZwT8PqPSnMX0TENZYitXEhNa7ZSNj1Diqh5LZyUJoBQaZcqAiPQ/PIg1+IPaRn/V8ZYVb0nxHMh51yw==
}
engines: { node: ">= 4.7.0" }
requiresBuild: true
@@ -8268,10 +8315,10 @@ packages:
strip-ansi: 6.0.1
dev: true
/tailwindcss/3.1.8:
/tailwindcss/3.2.1:
resolution:
{
integrity: sha512-YSneUCZSFDYMwk+TGq8qYFdCA3yfBRdBlS7txSq0LUmzyeqRe3a8fBQzbz9M3WS/iFT4BNf/nmw9mEzrnSaC0g==
integrity: sha512-Uw+GVSxp5CM48krnjHObqoOwlCt5Qo6nw1jlCRwfGy68dSYb/LwS9ZFidYGRiM+w6rMawkZiu1mEMAsHYAfoLg==
}
engines: { node: ">=12.13.0" }
hasBin: true
@@ -8286,6 +8333,7 @@ packages:
glob-parent: 6.0.2
is-glob: 4.0.3
lilconfig: 2.0.6
micromatch: 4.0.5
normalize-path: 3.0.0
object-hash: 3.0.0
picocolors: 1.0.0
@@ -8293,7 +8341,7 @@ packages:
postcss-import: 14.1.0_postcss@8.4.17
postcss-js: 4.0.0_postcss@8.4.17
postcss-load-config: 3.1.4_postcss@8.4.17
postcss-nested: 5.0.6_postcss@8.4.17
postcss-nested: 6.0.0_postcss@8.4.17
postcss-selector-parser: 6.0.10
postcss-value-parser: 4.2.0
quick-lru: 5.1.1
@@ -8681,6 +8729,33 @@ packages:
spdx-expression-parse: 3.0.1
dev: true
/vite-plugin-cdn-import/0.3.5:
resolution:
{
integrity: sha512-e1raoalfBiIhv+hnMeSp1UNjloDDBhHpeFxkwRRdPBmTdDRqdEEn8owUmT5u8UBSVCs4xN3n/od4a91vXEhXPQ==
}
dependencies:
rollup-plugin-external-globals: 0.6.1
transitivePeerDependencies:
- rollup
dev: true
/vite-plugin-compression/0.5.1_vite@3.1.8:
resolution:
{
integrity: sha512-5QJKBDc+gNYVqL/skgFAP81Yuzo9R+EAf19d+EtsMF/i8kFUpNi3J/H01QD3Oo8zBQn+NzoCIFkpPLynoOzaJg==
}
peerDependencies:
vite: ">=2.0.0"
dependencies:
chalk: 4.1.2
debug: 4.3.4
fs-extra: 10.1.0
vite: 3.1.8_sass@1.55.0+terser@5.15.1
transitivePeerDependencies:
- supports-color
dev: true
/vite-plugin-mock/2.9.6_mockjs@1.1.0+vite@3.1.8:
resolution:
{
@@ -8875,15 +8950,15 @@ packages:
vue: 3.2.40
dev: false
/vue-router/4.1.5_vue@3.2.40:
/vue-router/4.1.6_vue@3.2.40:
resolution:
{
integrity: sha512-IsvoF5D2GQ/EGTs/Th4NQms9gd2NSqV+yylxIyp/OYp8xOwxmU8Kj/74E9DTSYAyH5LX7idVUngN3JSj1X4xcQ==
integrity: sha512-DYWYwsG6xNPmLq/FmZn8Ip+qrhFEzA14EI12MsMgVxvHFDYvlr4NXpVF5hrRH1wVcDP8fGi5F4rxuJSl8/r+EQ==
}
peerDependencies:
vue: ^3.2.0
dependencies:
"@vue/devtools-api": 6.4.4
"@vue/devtools-api": 6.4.5
vue: 3.2.40
dev: false
@@ -8954,6 +9029,17 @@ packages:
"@vue/shared": 3.2.40
dev: false
/vue3-danmaku/1.0.0_vue@3.2.40:
resolution:
{
integrity: sha512-1DVPQeQBdv/iGyuumebZLKPHcfvSgPwxe/ExKF1jc/dJ3MINbXkw23iIajE8JKNvttagOX7eZnuwWnQ4ug8pqg==
}
peerDependencies:
vue: ^3.0.0
dependencies:
vue: 3.2.40
dev: false
/vuedraggable/4.1.0_vue@3.2.40:
resolution:
{
@@ -9131,16 +9217,16 @@ packages:
generate-source-map: 0.0.5
dev: false
/xgplayer/2.32.0:
/xgplayer/2.32.1:
resolution:
{
integrity: sha512-OT5VKU2j4729+bJhrR1BPLIrEF1JYeoDyPe9gLoFodh8XS+i26LbWaM2dOFy7uh+9ZiGUioHkSPDeM1jDrWfdw==
integrity: sha512-jUs6108INqnzEn3DTGre6pHW3KroM2w0VKuJNEvOIkoD2oUB+MW5ZZ0PsIwijX/oQRpmvq422CUgo4uqXVidEQ==
}
hasBin: true
dependencies:
chalk: 2.4.2
commander: 2.20.3
danmu.js: 1.1.1
danmu.js: 1.1.2
downloadjs: 1.4.7
draggabilly: 2.4.1
event-emitter: 0.3.5

View File

@@ -1,5 +1,5 @@
{
"Version": "3.6.0",
"Version": "3.6.3",
"Title": "PureAdmin",
"FixedHeader": true,
"HiddenSideBar": false,

Binary file not shown.

Before

Width:  |  Height:  |  Size: 23 KiB

View File

Before

Width:  |  Height:  |  Size: 477 B

After

Width:  |  Height:  |  Size: 477 B

View File

@@ -1,5 +1,5 @@
import { defineComponent, Fragment } from "vue";
import { hasAuth } from "/@/router/utils";
import { hasAuth } from "@/router/utils";
export default defineComponent({
name: "Auth",

View File

@@ -1,5 +1,5 @@
import { PropType } from "vue";
import { propTypes } from "/@/utils/propTypes";
import { propTypes } from "@/utils/propTypes";
export const countToProps = {
startVal: propTypes.number.def(0),
endVal: propTypes.number.def(2020),

View File

@@ -1,5 +1,5 @@
import { PropType } from "vue";
import { propTypes } from "/@/utils/propTypes";
import { propTypes } from "@/utils/propTypes";
export const reboundProps = {
delay: propTypes.number.def(1),
blur: propTypes.number.def(2),

View File

@@ -1,5 +1,5 @@
import { defineComponent, ref } from "vue";
import { propTypes } from "/@/utils/propTypes";
import { propTypes } from "@/utils/propTypes";
import "./filpper.css";
const props = {

View File

@@ -1,7 +1,7 @@
<script setup lang="ts">
import { cloneDeep } from "lodash-unified";
import { ref, computed, CSSProperties, toRef, watch } from "vue";
import { IconJson } from "/@/components/ReIcon/data";
import { IconJson } from "@/components/ReIcon/data";
type ParameterCSSProperties = (item?: string) => CSSProperties | undefined;
defineOptions({

View File

@@ -2,8 +2,8 @@
import { reactive, getCurrentInstance, onBeforeMount, onUnmounted } from "vue";
import { deviceDetection } from "@pureadmin/utils";
import AMapLoader from "@amap/amap-jsapi-loader";
import { mapJson } from "/@/api/mock";
import car from "/@/assets/car.png";
import { mapJson } from "@/api/mock";
import car from "@/assets/car.png";
export interface MapConfigureInter {
on: Fn;

View File

@@ -10,7 +10,7 @@ import {
import "./index.scss";
import { cloneDeep } from "lodash-unified";
import { isString } from "@pureadmin/utils";
import { propTypes } from "/@/utils/propTypes";
import { propTypes } from "@/utils/propTypes";
import { IconifyIconOffline } from "../../ReIcon";
import QRCode, { QRCodeRenderersOptions } from "qrcode";

View File

@@ -1,5 +1,5 @@
import { defineComponent, ref, computed, PropType } from "vue";
import { useEpThemeStoreHook } from "/@/store/modules/epTheme";
import { useEpThemeStoreHook } from "@/store/modules/epTheme";
import { IconifyIconOffline } from "../../ReIcon";
export const loadingSvg = `

View File

@@ -1,4 +1,4 @@
import { hasAuth } from "/@/router/utils";
import { hasAuth } from "@/router/utils";
import { Directive, type DirectiveBinding } from "vue";
export const auth: Directive = {

View File

@@ -1,7 +1,7 @@
import { Directive, type DirectiveBinding, type VNode } from "vue";
import elementResizeDetectorMaker from "element-resize-detector";
import type { Erd } from "element-resize-detector";
import { emitter } from "/@/utils/mitt";
import { emitter } from "@/utils/mitt";
const erd: Erd = elementResizeDetectorMaker({
strategy: "scroll"

View File

@@ -1,8 +1,8 @@
<script setup lang="ts">
import { useGlobal } from "@pureadmin/utils";
import backTop from "/@/assets/svg/back_top.svg?component";
import backTop from "@/assets/svg/back_top.svg?component";
import { h, computed, Transition, defineComponent } from "vue";
import { usePermissionStoreHook } from "/@/store/modules/permission";
import { usePermissionStoreHook } from "@/store/modules/permission";
const props = defineProps({
fixedHeader: Boolean

View File

@@ -2,12 +2,11 @@
import Search from "./search/index.vue";
import Notice from "./notice/index.vue";
import mixNav from "./sidebar/mixNav.vue";
import avatars from "/@/assets/avatars.jpg";
import { useNav } from "/@/layout/hooks/useNav";
import { useNav } from "@/layout/hooks/useNav";
import Breadcrumb from "./sidebar/breadCrumb.vue";
import topCollapse from "./sidebar/topCollapse.vue";
import { useTranslationLang } from "../hooks/useTranslationLang";
import globalization from "/@/assets/svg/globalization.svg?component";
import globalization from "@/assets/svg/globalization.svg?component";
const {
layout,
@@ -82,8 +81,11 @@ const { t, locale, translationCh, translationEn } = useTranslationLang();
</el-dropdown>
<!-- 退出登录 -->
<el-dropdown trigger="click">
<span class="el-dropdown-link navbar-bg-hover">
<img v-if="avatars" :src="avatars" :style="avatarsStyle" />
<span class="el-dropdown-link navbar-bg-hover select-none">
<img
src="https://avatars.githubusercontent.com/u/44761321?v=4"
:style="avatarsStyle"
/>
<p v-if="username" class="dark:text-white">{{ username }}</p>
</span>
<template #dropdown>

View File

@@ -1,7 +1,7 @@
<script setup lang="ts">
import { ref } from "vue";
import { onClickOutside } from "@vueuse/core";
import { emitter } from "/@/utils/mitt";
import { emitter } from "@/utils/mitt";
let show = ref<Boolean>(false);
const target = ref(null);

View File

@@ -17,9 +17,10 @@
</template>
<script lang="ts" setup>
import enterOutlined from "/@/assets/svg/enter_outlined.svg?component";
import mdiKeyboardEsc from "/@/assets/svg/mdi_keyboard_esc.svg?component";
import mdiKeyboardEsc from "@/assets/svg/keyboard_esc.svg?component";
import enterOutlined from "@/assets/svg/enter_outlined.svg?component";
</script>
<style lang="scss" scoped>
.search-footer {
display: flex;

View File

@@ -3,12 +3,12 @@ import { useRouter } from "vue-router";
import { cloneDeep } from "lodash-unified";
import SearchResult from "./SearchResult.vue";
import SearchFooter from "./SearchFooter.vue";
import { useNav } from "/@/layout/hooks/useNav";
import { transformI18n } from "/@/plugins/i18n";
import { useNav } from "@/layout/hooks/useNav";
import { transformI18n } from "@/plugins/i18n";
import { deleteChildren } from "@pureadmin/utils";
import { useDebounceFn, onKeyStroke } from "@vueuse/core";
import { ref, watch, computed, nextTick, shallowRef } from "vue";
import { usePermissionStoreHook } from "/@/store/modules/permission";
import { usePermissionStoreHook } from "@/store/modules/permission";
interface Props {
/** 弹窗显隐 */

View File

@@ -1,9 +1,9 @@
<script lang="ts" setup>
import { computed } from "vue";
import { useI18n } from "vue-i18n";
import { useEpThemeStoreHook } from "/@/store/modules/epTheme";
import { useRenderIcon } from "/@/components/ReIcon/src/hooks";
import enterOutlined from "/@/assets/svg/enter_outlined.svg?component";
import { useEpThemeStoreHook } from "@/store/modules/epTheme";
import { useRenderIcon } from "@/components/ReIcon/src/hooks";
import enterOutlined from "@/assets/svg/enter_outlined.svg?component";
const { t } = useI18n();

View File

@@ -8,18 +8,18 @@ import {
nextTick,
useCssModule
} from "vue";
import { getConfig } from "/@/config";
import { getConfig } from "@/config";
import { useRouter } from "vue-router";
import panel from "../panel/index.vue";
import { emitter } from "/@/utils/mitt";
import { resetRouter } from "/@/router";
import { emitter } from "@/utils/mitt";
import { resetRouter } from "@/router";
import { templateRef } from "@vueuse/core";
import { removeToken } from "/@/utils/auth";
import { routerArrays } from "/@/layout/types";
import { useNav } from "/@/layout/hooks/useNav";
import { useAppStoreHook } from "/@/store/modules/app";
import { useMultiTagsStoreHook } from "/@/store/modules/multiTags";
import { useDataThemeChange } from "/@/layout/hooks/useDataThemeChange";
import { removeToken } from "@/utils/auth";
import { routerArrays } from "@/layout/types";
import { useNav } from "@/layout/hooks/useNav";
import { useAppStoreHook } from "@/store/modules/app";
import { useMultiTagsStoreHook } from "@/store/modules/multiTags";
import { useDataThemeChange } from "@/layout/hooks/useDataThemeChange";
import {
useDark,
debounce,
@@ -29,8 +29,8 @@ import {
} from "@pureadmin/utils";
import { toggleTheme } from "@pureadmin/theme/dist/browser-utils";
import dayIcon from "/@/assets/svg/day.svg?component";
import darkIcon from "/@/assets/svg/dark.svg?component";
import dayIcon from "@/assets/svg/day.svg?component";
import darkIcon from "@/assets/svg/dark.svg?component";
const router = useRouter();
const { device } = useNav();

View File

@@ -1,9 +1,9 @@
<script setup lang="ts">
import { isEqual } from "lodash-unified";
import { transformI18n } from "/@/plugins/i18n";
import { transformI18n } from "@/plugins/i18n";
import { ref, watch, onMounted, toRaw } from "vue";
import { getParentPaths, findRouteByPath } from "/@/router/utils";
import { useMultiTagsStoreHook } from "/@/store/modules/multiTags";
import { getParentPaths, findRouteByPath } from "@/router/utils";
import { useMultiTagsStoreHook } from "@/store/modules/multiTags";
import { useRoute, useRouter, RouteLocationMatched } from "vue-router";
const route = useRoute();

View File

@@ -3,11 +3,10 @@ import Search from "../search/index.vue";
import Notice from "../notice/index.vue";
import { ref, watch, nextTick } from "vue";
import SidebarItem from "./sidebarItem.vue";
import avatars from "/@/assets/avatars.jpg";
import { useNav } from "/@/layout/hooks/useNav";
import { useNav } from "@/layout/hooks/useNav";
import { useTranslationLang } from "../../hooks/useTranslationLang";
import { usePermissionStoreHook } from "/@/store/modules/permission";
import globalization from "/@/assets/svg/globalization.svg?component";
import { usePermissionStoreHook } from "@/store/modules/permission";
import globalization from "@/assets/svg/globalization.svg?component";
const menuRef = ref();
@@ -97,7 +96,10 @@ watch(
<!-- 退出登录 -->
<el-dropdown trigger="click">
<span class="el-dropdown-link navbar-bg-hover">
<img v-if="avatars" :src="avatars" :style="avatarsStyle" />
<img
src="https://avatars.githubusercontent.com/u/44761321?v=4"
:style="avatarsStyle"
/>
<p v-if="username" class="dark:text-white">{{ username }}</p>
</span>
<template #dropdown>

View File

@@ -1,5 +1,5 @@
<script setup lang="ts">
import { useNav } from "/@/layout/hooks/useNav";
import { useNav } from "@/layout/hooks/useNav";
const props = defineProps({
collapse: Boolean
@@ -9,7 +9,7 @@ const { title } = useNav();
</script>
<template>
<div class="sidebar-logo-container" :class="{ collapse: props.collapse }">
<div class="sidebar-logo-container" :class="{ collapses: props.collapse }">
<transition name="sidebarLogoFade">
<router-link
v-if="props.collapse"
@@ -51,6 +51,12 @@ const { title } = useNav();
margin-top: 5px;
.sidebar-title {
display: block;
width: 160px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
text-align: left;
color: #1890ff;
font-weight: 600;
font-size: 20px;
@@ -59,7 +65,7 @@ const { title } = useNav();
}
}
.collapse {
.collapses {
.sidebar-logo {
margin-right: 0;
}

View File

@@ -1,15 +1,14 @@
<script setup lang="ts">
import Search from "../search/index.vue";
import Notice from "../notice/index.vue";
import avatars from "/@/assets/avatars.jpg";
import { useNav } from "/@/layout/hooks/useNav";
import { transformI18n } from "/@/plugins/i18n";
import { useNav } from "@/layout/hooks/useNav";
import { transformI18n } from "@/plugins/i18n";
import { ref, toRaw, watch, onMounted, nextTick } from "vue";
import { useRenderIcon } from "/@/components/ReIcon/src/hooks";
import { getParentPaths, findRouteByPath } from "/@/router/utils";
import { useRenderIcon } from "@/components/ReIcon/src/hooks";
import { getParentPaths, findRouteByPath } from "@/router/utils";
import { useTranslationLang } from "../../hooks/useTranslationLang";
import { usePermissionStoreHook } from "/@/store/modules/permission";
import globalization from "/@/assets/svg/globalization.svg?component";
import { usePermissionStoreHook } from "@/store/modules/permission";
import globalization from "@/assets/svg/globalization.svg?component";
const menuRef = ref();
let defaultActive = ref(null);
@@ -128,8 +127,11 @@ watch(
</el-dropdown>
<!-- 退出登录 -->
<el-dropdown trigger="click">
<span class="el-dropdown-link navbar-bg-hover">
<img v-if="avatars" :src="avatars" :style="avatarsStyle" />
<span class="el-dropdown-link navbar-bg-hover select-none">
<img
src="https://avatars.githubusercontent.com/u/44761321?v=4"
:style="avatarsStyle"
/>
<p v-if="username" class="dark:text-white">{{ username }}</p>
</span>
<template #dropdown>

View File

@@ -1,9 +1,9 @@
<script setup lang="ts">
import path from "path";
import { childrenType } from "../../types";
import { useNav } from "/@/layout/hooks/useNav";
import { transformI18n } from "/@/plugins/i18n";
import { useRenderIcon } from "/@/components/ReIcon/src/hooks";
import { useNav } from "@/layout/hooks/useNav";
import { transformI18n } from "@/plugins/i18n";
import { useRenderIcon } from "@/components/ReIcon/src/hooks";
import { ref, toRaw, PropType, nextTick, computed, CSSProperties } from "vue";
const { layout, isCollapse } = useNav();

View File

@@ -1,15 +1,15 @@
<script setup lang="ts">
import Logo from "./logo.vue";
import { useRoute } from "vue-router";
import { emitter } from "/@/utils/mitt";
import { emitter } from "@/utils/mitt";
import SidebarItem from "./sidebarItem.vue";
import leftCollapse from "./leftCollapse.vue";
import type { StorageConfigs } from "/#/index";
import { useNav } from "/@/layout/hooks/useNav";
import { useNav } from "@/layout/hooks/useNav";
import { storageLocal } from "@pureadmin/utils";
import { ref, computed, watch, onBeforeMount } from "vue";
import { findRouteByPath, getParentPaths } from "/@/router/utils";
import { usePermissionStoreHook } from "/@/store/modules/permission";
import { findRouteByPath, getParentPaths } from "@/router/utils";
import { usePermissionStoreHook } from "@/store/modules/permission";
const route = useRoute();
const showLogo = ref(

View File

@@ -1,14 +1,14 @@
<script setup lang="ts">
import { $t } from "/@/plugins/i18n";
import { emitter } from "/@/utils/mitt";
import { $t } from "@/plugins/i18n";
import { emitter } from "@/utils/mitt";
import { RouteConfigs } from "../../types";
import { useTags } from "../../hooks/useTag";
import { routerArrays } from "/@/layout/types";
import { routerArrays } from "@/layout/types";
import { isEqual, isEmpty } from "lodash-unified";
import { useSettingStoreHook } from "/@/store/modules/settings";
import { useSettingStoreHook } from "@/store/modules/settings";
import { ref, watch, unref, nextTick, onBeforeMount } from "vue";
import { handleAliveRoute, delAliveRoutes } from "/@/router/utils";
import { useMultiTagsStoreHook } from "/@/store/modules/multiTags";
import { handleAliveRoute, delAliveRoutes } from "@/router/utils";
import { useMultiTagsStoreHook } from "@/store/modules/multiTags";
import { useResizeObserver, useDebounceFn, useFullscreen } from "@vueuse/core";
const {
@@ -499,7 +499,7 @@ onMounted(() => {
<IconifyIconOffline icon="arrow-left-s-line" @click="handleScroll(200)" />
</span>
<div ref="scrollbarDom" class="scroll-container">
<div class="tab" ref="tabDom" :style="getTabStyle">
<div class="tab select-none" ref="tabDom" :style="getTabStyle">
<div
:ref="'dynamic' + index"
v-for="(item, index) in multiTags"

View File

@@ -1,11 +1,11 @@
import { ref } from "vue";
import { getConfig } from "/@/config";
import { getConfig } from "@/config";
import { find } from "lodash-unified";
import { useLayout } from "./useLayout";
import { themeColorsType } from "../types";
import { TinyColor } from "@ctrl/tinycolor";
import { useGlobal } from "@pureadmin/utils";
import { useEpThemeStoreHook } from "/@/store/modules/epTheme";
import { useEpThemeStoreHook } from "@/store/modules/epTheme";
import {
darken,
lighten,

View File

@@ -2,7 +2,7 @@ import { computed } from "vue";
import { useI18n } from "vue-i18n";
import { routerArrays } from "../types";
import { useGlobal } from "@pureadmin/utils";
import { useMultiTagsStore } from "/@/store/modules/multiTags";
import { useMultiTagsStore } from "@/store/modules/multiTags";
export function useLayout() {
const { $storage, $config } = useGlobal<GlobalPropertiesApi>();

View File

@@ -1,15 +1,15 @@
import { computed } from "vue";
import { getConfig } from "/@/config";
import { getConfig } from "@/config";
import { useRouter } from "vue-router";
import { emitter } from "/@/utils/mitt";
import { emitter } from "@/utils/mitt";
import { routeMetaType } from "../types";
import { useGlobal } from "@pureadmin/utils";
import { transformI18n } from "/@/plugins/i18n";
import { router, remainingPaths } from "/@/router";
import { useAppStoreHook } from "/@/store/modules/app";
import { transformI18n } from "@/plugins/i18n";
import { router, remainingPaths } from "@/router";
import { useAppStoreHook } from "@/store/modules/app";
import { i18nChangeLanguage } from "@wangeditor/editor";
import { useUserStoreHook } from "/@/store/modules/user";
import { useEpThemeStoreHook } from "/@/store/modules/epTheme";
import { useUserStoreHook } from "@/store/modules/user";
import { useEpThemeStoreHook } from "@/store/modules/epTheme";
const errorInfo = "当前路由配置不正确,请检查配置";

View File

@@ -13,9 +13,9 @@ import { isEqual } from "lodash-unified";
import type { StorageConfigs } from "/#/index";
import { useEventListener } from "@vueuse/core";
import { useRoute, useRouter } from "vue-router";
import { transformI18n, $t } from "/@/plugins/i18n";
import { useSettingStoreHook } from "/@/store/modules/settings";
import { useMultiTagsStoreHook } from "/@/store/modules/multiTags";
import { transformI18n, $t } from "@/plugins/i18n";
import { useSettingStoreHook } from "@/store/modules/settings";
import { useMultiTagsStoreHook } from "@/store/modules/multiTags";
import { storageLocal, toggleClass, hasClass } from "@pureadmin/utils";
export function useTags() {

View File

@@ -1,9 +1,9 @@
<script setup lang="ts">
import { setType } from "./types";
import { emitter } from "/@/utils/mitt";
import { emitter } from "@/utils/mitt";
import { useLayout } from "./hooks/useLayout";
import { useAppStoreHook } from "/@/store/modules/app";
import { useSettingStoreHook } from "/@/store/modules/settings";
import { useAppStoreHook } from "@/store/modules/app";
import { useSettingStoreHook } from "@/store/modules/settings";
import { deviceDetection, useDark, useGlobal } from "@pureadmin/utils";
import { h, reactive, computed, onMounted, defineComponent } from "vue";
@@ -13,7 +13,7 @@ import appMain from "./components/appMain.vue";
import setting from "./components/setting/index.vue";
import Vertical from "./components/sidebar/vertical.vue";
import Horizontal from "./components/sidebar/horizontal.vue";
import backTop from "/@/assets/svg/back_top.svg?component";
import backTop from "@/assets/svg/back_top.svg?component";
const { isDark } = useDark();
const { layout } = useLayout();

View File

@@ -1,15 +1,15 @@
import App from "./App.vue";
import router from "./router";
import { setupStore } from "/@/store";
import { setupStore } from "@/store";
import ElementPlus from "element-plus";
import { useI18n } from "@/plugins/i18n";
import { getServerConfig } from "./config";
import { createApp, Directive } from "vue";
import { useI18n } from "../src/plugins/i18n";
import { MotionPlugin } from "@vueuse/motion";
import { useEcharts } from "/@/plugins/echarts";
import { useEcharts } from "@/plugins/echarts";
import { useTable } from "@/plugins/vxe-table";
import VirtualScroller from "vue-virtual-scroller";
import { useTable } from "../src/plugins/vxe-table";
import { injectResponsiveStorage } from "/@/utils/responsive";
import { injectResponsiveStorage } from "@/utils/responsive";
import Table from "@pureadmin/table";
import PureDescriptions from "@pureadmin/descriptions";
@@ -32,7 +32,7 @@ import "vue-virtual-scroller/dist/vue-virtual-scroller.css";
const app = createApp(App);
// 自定义指令
import * as directives from "/@/directives";
import * as directives from "@/directives";
Object.keys(directives).forEach(key => {
app.directive(key, (directives as { [key: string]: Directive })[key]);
});
@@ -48,7 +48,7 @@ app.component("IconifyIconOnline", IconifyIconOnline);
app.component("FontIcon", FontIcon);
// 全局注册按钮级别权限组件
import { Auth } from "/@/components/ReAuth";
import { Auth } from "@/components/ReAuth";
app.component("Auth", Auth);
getServerConfig(app).then(async config => {

View File

@@ -2,7 +2,7 @@ import "xe-utils";
import "./index.scss";
import XEUtils from "xe-utils";
import { App, unref } from "vue";
import { i18n } from "/@/plugins/i18n";
import { i18n } from "@/plugins/i18n";
import "font-awesome/css/font-awesome.min.css";
import zh from "vxe-table/lib/locale/lang/zh-CN";
import en from "vxe-table/lib/locale/lang/en-US";

View File

@@ -1,11 +1,11 @@
import { getConfig } from "/@/config";
import { getConfig } from "@/config";
import { toRouteType } from "./types";
import NProgress from "/@/utils/progress";
import NProgress from "@/utils/progress";
import { findIndex } from "lodash-unified";
import { transformI18n } from "/@/plugins/i18n";
import { sessionKey, type DataInfo } from "/@/utils/auth";
import { useMultiTagsStoreHook } from "/@/store/modules/multiTags";
import { usePermissionStoreHook } from "/@/store/modules/permission";
import { transformI18n } from "@/plugins/i18n";
import { sessionKey, type DataInfo } from "@/utils/auth";
import { useMultiTagsStoreHook } from "@/store/modules/multiTags";
import { usePermissionStoreHook } from "@/store/modules/permission";
import {
Router,
createRouter,

View File

@@ -1,4 +1,4 @@
import { $t } from "/@/plugins/i18n";
import { $t } from "@/plugins/i18n";
import type { RouteConfigsTable } from "/#/index";
const ableRouter: RouteConfigsTable = {
@@ -13,7 +13,7 @@ const ableRouter: RouteConfigsTable = {
{
path: "/able/watermark",
name: "WaterMark",
component: () => import("/@/views/able/watermark.vue"),
component: () => import("@/views/able/watermark.vue"),
meta: {
title: $t("menus.hsWatermark")
}
@@ -21,7 +21,7 @@ const ableRouter: RouteConfigsTable = {
{
path: "/able/print",
name: "Print",
component: () => import("/@/views/able/print.vue"),
component: () => import("@/views/able/print.vue"),
meta: {
title: $t("menus.hsPrint")
}
@@ -29,7 +29,7 @@ const ableRouter: RouteConfigsTable = {
{
path: "/able/download",
name: "Download",
component: () => import("/@/views/able/download.vue"),
component: () => import("@/views/able/download.vue"),
meta: {
title: $t("menus.hsDownload")
}
@@ -37,7 +37,7 @@ const ableRouter: RouteConfigsTable = {
{
path: "/able/iconSelect",
name: "IconSelect",
component: () => import("/@/views/able/icon-select.vue"),
component: () => import("@/views/able/icon-select.vue"),
meta: {
title: $t("menus.hsIconSelect")
}
@@ -45,7 +45,7 @@ const ableRouter: RouteConfigsTable = {
{
path: "/able/timeline",
name: "TimeLine",
component: () => import("/@/views/able/timeline.vue"),
component: () => import("@/views/able/timeline.vue"),
meta: {
title: $t("menus.hsTimeline")
}
@@ -53,7 +53,7 @@ const ableRouter: RouteConfigsTable = {
{
path: "/able/menuTree",
name: "MenuTree",
component: () => import("/@/views/able/menu-tree.vue"),
component: () => import("@/views/able/menu-tree.vue"),
meta: {
title: $t("menus.hsMenuTree")
}
@@ -61,7 +61,7 @@ const ableRouter: RouteConfigsTable = {
{
path: "/able/lineTree",
name: "LineTree",
component: () => import("/@/views/able/line-tree.vue"),
component: () => import("@/views/able/line-tree.vue"),
meta: {
title: $t("menus.hsLineTree")
}
@@ -69,7 +69,7 @@ const ableRouter: RouteConfigsTable = {
{
path: "/able/antTabs",
name: "AntTabs",
component: () => import("/@/views/able/ant-tabs.vue"),
component: () => import("@/views/able/ant-tabs.vue"),
meta: {
title: $t("menus.hsAntTabs")
}
@@ -77,7 +77,7 @@ const ableRouter: RouteConfigsTable = {
{
path: "/able/antAnchor",
name: "AntAnchor",
component: () => import("/@/views/able/ant-anchor.vue"),
component: () => import("@/views/able/ant-anchor.vue"),
meta: {
title: $t("menus.hsAntAnchor")
}
@@ -85,7 +85,7 @@ const ableRouter: RouteConfigsTable = {
{
path: "/able/antTreeSelect",
name: "AntTreeSelect",
component: () => import("/@/views/able/ant-treeSelect.vue"),
component: () => import("@/views/able/ant-treeSelect.vue"),
meta: {
title: $t("menus.hsAntTreeSelect")
}
@@ -93,7 +93,7 @@ const ableRouter: RouteConfigsTable = {
{
path: "/able/debounce",
name: "Debounce",
component: () => import("/@/views/able/debounce.vue"),
component: () => import("@/views/able/debounce.vue"),
meta: {
title: $t("menus.hsDebounce")
}
@@ -101,7 +101,7 @@ const ableRouter: RouteConfigsTable = {
{
path: "/able/barcode",
name: "BarCode",
component: () => import("/@/views/able/barcode.vue"),
component: () => import("@/views/able/barcode.vue"),
meta: {
title: $t("menus.hsBarcode")
}
@@ -109,7 +109,7 @@ const ableRouter: RouteConfigsTable = {
{
path: "/able/qrcode",
name: "QrCode",
component: () => import("/@/views/able/qrcode.vue"),
component: () => import("@/views/able/qrcode.vue"),
meta: {
title: $t("menus.hsQrcode")
}
@@ -117,7 +117,7 @@ const ableRouter: RouteConfigsTable = {
{
path: "/able/cascader",
name: "Cascader",
component: () => import("/@/views/able/cascader.vue"),
component: () => import("@/views/able/cascader.vue"),
meta: {
title: $t("menus.hsCascader")
}
@@ -125,7 +125,7 @@ const ableRouter: RouteConfigsTable = {
{
path: "/able/swiper",
name: "Swiper",
component: () => import("/@/views/able/swiper.vue"),
component: () => import("@/views/able/swiper.vue"),
meta: {
title: $t("menus.hsSwiper")
}
@@ -133,7 +133,7 @@ const ableRouter: RouteConfigsTable = {
{
path: "/able/virtualList",
name: "VirtualList",
component: () => import("/@/views/able/virtual-list/index.vue"),
component: () => import("@/views/able/virtual-list/index.vue"),
meta: {
title: $t("menus.hsVirtualList")
}
@@ -141,7 +141,7 @@ const ableRouter: RouteConfigsTable = {
{
path: "/able/pdf",
name: "Pdf",
component: () => import("/@/views/able/pdf.vue"),
component: () => import("@/views/able/pdf.vue"),
meta: {
title: $t("menus.hsPdf")
}
@@ -149,7 +149,7 @@ const ableRouter: RouteConfigsTable = {
{
path: "/able/execl",
name: "Execl",
component: () => import("/@/views/able/execl.vue"),
component: () => import("@/views/able/execl.vue"),
meta: {
title: $t("menus.hsExecl")
}
@@ -157,7 +157,7 @@ const ableRouter: RouteConfigsTable = {
{
path: "/able/infiniteScroll",
name: "InfiniteScroll",
component: () => import("/@/views/able/infinite-scroll.vue"),
component: () => import("@/views/able/infinite-scroll.vue"),
meta: {
title: $t("menus.hsInfiniteScroll")
}

View File

@@ -1,4 +1,4 @@
import { $t } from "/@/plugins/i18n";
import { $t } from "@/plugins/i18n";
import type { RouteConfigsTable } from "/#/index";
const aboutRouter: RouteConfigsTable = {
@@ -13,7 +13,7 @@ const aboutRouter: RouteConfigsTable = {
{
path: "/about/index",
name: "About",
component: () => import("/@/views/about/index.vue"),
component: () => import("@/views/about/index.vue"),
meta: {
title: $t("menus.hsAbout")
}

View File

@@ -1,4 +1,4 @@
import { $t } from "/@/plugins/i18n";
import { $t } from "@/plugins/i18n";
import type { RouteConfigsTable } from "/#/index";
const componentsRouter: RouteConfigsTable = {
@@ -13,7 +13,7 @@ const componentsRouter: RouteConfigsTable = {
{
path: "/components/video",
name: "Video",
component: () => import("/@/views/components/video/index.vue"),
component: () => import("@/views/components/video/index.vue"),
meta: {
title: $t("menus.hsvideo")
}
@@ -21,7 +21,7 @@ const componentsRouter: RouteConfigsTable = {
{
path: "/components/map",
name: "Map",
component: () => import("/@/views/components/map/index.vue"),
component: () => import("@/views/components/map/index.vue"),
meta: {
title: $t("menus.hsmap"),
keepAlive: true,
@@ -33,7 +33,7 @@ const componentsRouter: RouteConfigsTable = {
{
path: "/components/draggable",
name: "Draggable",
component: () => import("/@/views/components/draggable/index.vue"),
component: () => import("@/views/components/draggable/index.vue"),
meta: {
title: $t("menus.hsdraggable"),
transition: {
@@ -45,7 +45,7 @@ const componentsRouter: RouteConfigsTable = {
{
path: "/components/splitPane",
name: "SplitPane",
component: () => import("/@/views/components/split-pane/index.vue"),
component: () => import("@/views/components/split-pane/index.vue"),
meta: {
title: $t("menus.hssplitPane"),
extraIcon: {
@@ -57,7 +57,7 @@ const componentsRouter: RouteConfigsTable = {
{
path: "/components/button",
name: "Button",
component: () => import("/@/views/components/button/index.vue"),
component: () => import("@/views/components/button/index.vue"),
meta: {
title: $t("menus.hsbutton")
}
@@ -65,7 +65,7 @@ const componentsRouter: RouteConfigsTable = {
{
path: "/components/cropping",
name: "Cropping",
component: () => import("/@/views/components/cropping/index.vue"),
component: () => import("@/views/components/cropping/index.vue"),
meta: {
title: $t("menus.hscropping")
}
@@ -73,7 +73,7 @@ const componentsRouter: RouteConfigsTable = {
{
path: "/components/countTo",
name: "CountTo",
component: () => import("/@/views/components/count-to/index.vue"),
component: () => import("@/views/components/count-to/index.vue"),
meta: {
title: $t("menus.hscountTo")
}
@@ -81,7 +81,7 @@ const componentsRouter: RouteConfigsTable = {
{
path: "/components/selector",
name: "Selector",
component: () => import("/@/views/components/selector/index.vue"),
component: () => import("@/views/components/selector/index.vue"),
meta: {
title: $t("menus.hsselector")
}
@@ -89,7 +89,7 @@ const componentsRouter: RouteConfigsTable = {
{
path: "/components/seamlessScroll",
name: "SeamlessScroll",
component: () => import("/@/views/components/seamless-scroll/index.vue"),
component: () => import("@/views/components/seamless-scroll/index.vue"),
meta: {
title: $t("menus.hsseamless")
}
@@ -97,7 +97,7 @@ const componentsRouter: RouteConfigsTable = {
{
path: "/components/contextmenu",
name: "ContextMenu",
component: () => import("/@/views/components/contextmenu/index.vue"),
component: () => import("@/views/components/contextmenu/index.vue"),
meta: {
title: $t("menus.hscontextmenu")
}
@@ -105,7 +105,7 @@ const componentsRouter: RouteConfigsTable = {
{
path: "/components/typeit",
name: "Typeit",
component: () => import("/@/views/components/typeit/index.vue"),
component: () => import("@/views/components/typeit/index.vue"),
meta: {
title: $t("menus.hstypeit")
}
@@ -113,10 +113,18 @@ const componentsRouter: RouteConfigsTable = {
{
path: "/components/json-editor",
name: "JsonEditor",
component: () => import("/@/views/components/json-editor/index.vue"),
component: () => import("@/views/components/json-editor/index.vue"),
meta: {
title: $t("menus.hsjsoneditor")
}
},
{
path: "/components/danmaku",
name: "Danmaku",
component: () => import("@/views/components/danmaku/index.vue"),
meta: {
title: $t("menus.hsdanmaku")
}
}
]
};

View File

@@ -1,4 +1,4 @@
import { $t } from "/@/plugins/i18n";
import { $t } from "@/plugins/i18n";
import type { RouteConfigsTable } from "/#/index";
const editorRouter: RouteConfigsTable = {
@@ -13,7 +13,7 @@ const editorRouter: RouteConfigsTable = {
{
path: "/editor/index",
name: "Editor",
component: () => import("/@/views/editor/index.vue"),
component: () => import("@/views/editor/index.vue"),
meta: {
title: $t("menus.hseditor"),
keepAlive: true

View File

@@ -1,4 +1,4 @@
import { $t } from "/@/plugins/i18n";
import { $t } from "@/plugins/i18n";
import type { RouteConfigsTable } from "/#/index";
const errorRouter: RouteConfigsTable = {
@@ -13,7 +13,7 @@ const errorRouter: RouteConfigsTable = {
{
path: "/error/403",
name: "403",
component: () => import("/@/views/error/403.vue"),
component: () => import("@/views/error/403.vue"),
meta: {
title: $t("menus.hsfourZeroOne")
}
@@ -21,7 +21,7 @@ const errorRouter: RouteConfigsTable = {
{
path: "/error/404",
name: "404",
component: () => import("/@/views/error/404.vue"),
component: () => import("@/views/error/404.vue"),
meta: {
title: $t("menus.hsfourZeroFour")
}
@@ -29,7 +29,7 @@ const errorRouter: RouteConfigsTable = {
{
path: "/error/500",
name: "500",
component: () => import("/@/views/error/500.vue"),
component: () => import("@/views/error/500.vue"),
meta: {
title: $t("menus.hsFive")
}

View File

@@ -1,4 +1,4 @@
import { $t } from "/@/plugins/i18n";
import { $t } from "@/plugins/i18n";
import type { RouteConfigsTable } from "/#/index";
const flowChartRouter: RouteConfigsTable = {
@@ -13,7 +13,7 @@ const flowChartRouter: RouteConfigsTable = {
{
path: "/flowChart/index",
name: "FlowChart",
component: () => import("/@/views/flow-chart/index.vue"),
component: () => import("@/views/flow-chart/index.vue"),
meta: {
title: $t("menus.hsflowChart")
}

View File

@@ -1,4 +1,4 @@
import { $t } from "/@/plugins/i18n";
import { $t } from "@/plugins/i18n";
import type { RouteConfigsTable } from "/#/index";
const formDesignRouter: RouteConfigsTable = {
@@ -13,7 +13,7 @@ const formDesignRouter: RouteConfigsTable = {
{
path: "/formDesign/index",
name: "FormDesign",
component: () => import("/@/views/form-design/index.vue"),
component: () => import("@/views/form-design/index.vue"),
meta: {
title: $t("menus.hsFormDesign")
}

View File

@@ -1,4 +1,4 @@
import { $t } from "/@/plugins/i18n";
import { $t } from "@/plugins/i18n";
import type { RouteConfigsTable } from "/#/index";
const guideRouter: RouteConfigsTable = {
@@ -13,7 +13,7 @@ const guideRouter: RouteConfigsTable = {
{
path: "/guide/index",
name: "Guide",
component: () => import("/@/views/guide/index.vue"),
component: () => import("@/views/guide/index.vue"),
meta: {
title: $t("menus.hsguide")
}

View File

@@ -1,6 +1,6 @@
import { $t } from "/@/plugins/i18n";
import { $t } from "@/plugins/i18n";
import type { RouteConfigsTable } from "/#/index";
const Layout = () => import("/@/layout/index.vue");
const Layout = () => import("@/layout/index.vue");
const homeRouter: RouteConfigsTable = {
path: "/",
@@ -16,7 +16,7 @@ const homeRouter: RouteConfigsTable = {
{
path: "/welcome",
name: "Welcome",
component: () => import("/@/views/welcome/index.vue"),
component: () => import("@/views/welcome/index.vue"),
meta: {
title: $t("menus.hshome")
}

View File

@@ -1,4 +1,4 @@
import { $t } from "/@/plugins/i18n";
import { $t } from "@/plugins/i18n";
import type { RouteConfigsTable } from "/#/index";
const ableRouter: RouteConfigsTable = {
@@ -13,7 +13,7 @@ const ableRouter: RouteConfigsTable = {
{
path: "/list/card",
name: "ListCard",
component: () => import("/@/views/list/card/index.vue"),
component: () => import("@/views/list/card/index.vue"),
meta: {
icon: "card",
title: $t("menus.hsListCard"),

View File

@@ -1,4 +1,4 @@
import { $t } from "/@/plugins/i18n";
import { $t } from "@/plugins/i18n";
import type { RouteConfigsTable } from "/#/index";
const nestedRouter: RouteConfigsTable = {
@@ -20,7 +20,7 @@ const nestedRouter: RouteConfigsTable = {
children: [
{
path: "/nested/menu1/menu1-1",
component: () => import("/@/views/nested/menu1/menu1-1/index.vue"),
component: () => import("@/views/nested/menu1/menu1-1/index.vue"),
name: "Menu1-1",
meta: {
title: $t("menus.hsmenu1-1"),
@@ -38,7 +38,7 @@ const nestedRouter: RouteConfigsTable = {
{
path: "/nested/menu1/menu1-2/menu1-2-1",
component: () =>
import("/@/views/nested/menu1/menu1-2/menu1-2-1/index.vue"),
import("@/views/nested/menu1/menu1-2/menu1-2-1/index.vue"),
name: "Menu1-2-1",
meta: {
title: $t("menus.hsmenu1-2-1"),
@@ -48,7 +48,7 @@ const nestedRouter: RouteConfigsTable = {
{
path: "/nested/menu1/menu1-2/menu1-2-2",
component: () =>
import("/@/views/nested/menu1/menu1-2/menu1-2-2/index.vue"),
import("@/views/nested/menu1/menu1-2/menu1-2-2/index.vue"),
name: "Menu1-2-2",
meta: {
title: $t("menus.hsmenu1-2-2"),
@@ -63,7 +63,7 @@ const nestedRouter: RouteConfigsTable = {
},
{
path: "/nested/menu1/menu1-3",
component: () => import("/@/views/nested/menu1/menu1-3/index.vue"),
component: () => import("@/views/nested/menu1/menu1-3/index.vue"),
name: "Menu1-3",
meta: {
title: $t("menus.hsmenu1-3"),
@@ -75,7 +75,7 @@ const nestedRouter: RouteConfigsTable = {
{
path: "/nested/menu2",
name: "Menu2",
component: () => import("/@/views/nested/menu2/index.vue"),
component: () => import("@/views/nested/menu2/index.vue"),
meta: {
title: $t("menus.hsmenu2"),
keepAlive: true

View File

@@ -1,5 +1,5 @@
import type { RouteConfigsTable } from "/#/index";
const IFrame = () => import("/@/layout/frameView.vue");
const IFrame = () => import("@/layout/frameView.vue");
const pptRouter: RouteConfigsTable = {
path: "/ppt",

View File

@@ -1,12 +1,12 @@
import { $t } from "/@/plugins/i18n";
import { $t } from "@/plugins/i18n";
import type { RouteConfigsTable } from "/#/index";
const Layout = () => import("/@/layout/index.vue");
const Layout = () => import("@/layout/index.vue");
const remainingRouter: Array<RouteConfigsTable> = [
{
path: "/login",
name: "Login",
component: () => import("/@/views/login/index.vue"),
component: () => import("@/views/login/index.vue"),
meta: {
title: $t("menus.hslogin"),
showLink: false,
@@ -26,7 +26,7 @@ const remainingRouter: Array<RouteConfigsTable> = [
{
path: "/redirect/:path(.*)",
name: "Redirect",
component: () => import("/@/layout/redirect.vue")
component: () => import("@/layout/redirect.vue")
}
]
},
@@ -34,7 +34,7 @@ const remainingRouter: Array<RouteConfigsTable> = [
{
path: "/empty",
name: "Empty",
component: () => import("/@/views/empty/index.vue"),
component: () => import("@/views/empty/index.vue"),
meta: {
title: $t("menus.hsempty"),
showLink: false,

View File

@@ -1,4 +1,4 @@
import { $t } from "/@/plugins/i18n";
import { $t } from "@/plugins/i18n";
import type { RouteConfigsTable } from "/#/index";
const resultRouter: RouteConfigsTable = {
@@ -13,7 +13,7 @@ const resultRouter: RouteConfigsTable = {
{
path: "/result/success",
name: "Success",
component: () => import("/@/views/result/success.vue"),
component: () => import("@/views/result/success.vue"),
meta: {
title: $t("menus.hsSuccess")
}
@@ -21,7 +21,7 @@ const resultRouter: RouteConfigsTable = {
{
path: "/result/fail",
name: "Fail",
component: () => import("/@/views/result/fail.vue"),
component: () => import("@/views/result/fail.vue"),
meta: {
title: $t("menus.hsFail")
}

View File

@@ -10,7 +10,7 @@ import { router } from "./index";
import { isProxy, toRaw } from "vue";
import { loadEnv } from "../../build";
import { useTimeoutFn } from "@vueuse/core";
import { RouteConfigs } from "/@/layout/types";
import { RouteConfigs } from "@/layout/types";
import {
isString,
storageSession,
@@ -18,14 +18,14 @@ import {
isIncludeAllChildren
} from "@pureadmin/utils";
import { cloneDeep, intersection } from "lodash-unified";
import { sessionKey, type DataInfo } from "/@/utils/auth";
import { usePermissionStoreHook } from "/@/store/modules/permission";
const IFrame = () => import("/@/layout/frameView.vue");
import { sessionKey, type DataInfo } from "@/utils/auth";
import { usePermissionStoreHook } from "@/store/modules/permission";
const IFrame = () => import("@/layout/frameView.vue");
// https://cn.vitejs.dev/guide/features.html#glob-import
const modulesRoutes = import.meta.glob("/src/views/**/*.{vue,tsx}");
// 动态路由
import { getAsyncRoutes } from "/@/api/routes";
import { getAsyncRoutes } from "@/api/routes";
/** 按照路由中meta下的rank等级升序来排序路由 */
function ascending(arr: any[]) {
@@ -157,6 +157,7 @@ function initRouter() {
getAsyncRoutes().then(({ data }) => {
if (data.length === 0) {
usePermissionStoreHook().handleWholeMenus(data);
resolve(router);
} else {
formatFlatteningRoutes(addAsyncRoutes(data)).map(
(v: RouteRecordRaw) => {
@@ -269,9 +270,9 @@ function addAsyncRoutes(arrRoutes: Array<RouteRecordRaw>) {
// 父级的redirect属性取值如果子级存在且父级的redirect属性不存在默认取第一个子级的path如果子级存在且父级的redirect属性存在取存在的redirect属性会覆盖默认值
if (v?.children && v.children.length && !v.redirect)
v.redirect = v.children[0].path;
// 父级的name属性取值如果子级存在且父级的name属性不存在默认取第一个子级的name如果子级存在且父级的name属性存在取存在的name属性会覆盖默认值
// 父级的name属性取值如果子级存在且父级的name属性不存在默认取第一个子级的name如果子级存在且父级的name属性存在取存在的name属性会覆盖默认值注意测试中发现父级的name不能和子级name重复如果重复会造成重定向无效跳转404所以这里给父级的name起名的时候后面会自动加上`Parent`,避免重复)
if (v?.children && v.children.length && !v.name)
v.name = v.children[0].name;
v.name = (v.children[0].name as string) + "Parent";
if (v.meta?.frameSrc) {
v.component = IFrame;
} else {

View File

@@ -1,7 +1,7 @@
import { store } from "/@/store";
import { store } from "@/store";
import { appType } from "./types";
import { defineStore } from "pinia";
import { getConfig } from "/@/config";
import { getConfig } from "@/config";
import type { StorageConfigs } from "/#/index";
import { deviceDetection, storageLocal } from "@pureadmin/utils";

View File

@@ -1,6 +1,6 @@
import { store } from "/@/store";
import { store } from "@/store";
import { defineStore } from "pinia";
import { getConfig } from "/@/config";
import { getConfig } from "@/config";
import type { StorageConfigs } from "/#/index";
import { storageLocal } from "@pureadmin/utils";

View File

@@ -1,8 +1,8 @@
import { defineStore } from "pinia";
import { store } from "/@/store";
import { store } from "@/store";
import { isEqual } from "lodash-unified";
import type { StorageConfigs } from "/#/index";
import { routerArrays } from "/@/layout/types";
import { routerArrays } from "@/layout/types";
import { multiType, positionType } from "./types";
import { isUrl, storageLocal } from "@pureadmin/utils";

View File

@@ -1,8 +1,8 @@
import { defineStore } from "pinia";
import { store } from "/@/store";
import { store } from "@/store";
import { cacheType } from "./types";
import { constantMenus } from "/@/router";
import { ascending, filterTree, filterNoPermissionTree } from "/@/router/utils";
import { constantMenus } from "@/router";
import { ascending, filterTree, filterNoPermissionTree } from "@/router/utils";
export const usePermissionStore = defineStore({
id: "pure-permission",

View File

@@ -1,7 +1,7 @@
import { defineStore } from "pinia";
import { store } from "/@/store";
import { store } from "@/store";
import { setType } from "./types";
import { getConfig } from "/@/config";
import { getConfig } from "@/config";
export const useSettingStore = defineStore({
id: "pure-setting",

View File

@@ -1,22 +1,18 @@
import { defineStore } from "pinia";
import { store } from "/@/store";
import { store } from "@/store";
import { userType } from "./types";
import { routerArrays } from "/@/layout/types";
import { router, resetRouter } from "/@/router";
import { routerArrays } from "@/layout/types";
import { router, resetRouter } from "@/router";
import { storageSession } from "@pureadmin/utils";
import { getLogin, refreshTokenApi } from "/@/api/user";
import { UserResult, RefreshTokenResult } from "/@/api/user";
import { useMultiTagsStoreHook } from "/@/store/modules/multiTags";
import {
type DataInfo,
setToken,
removeToken,
sessionKey
} from "/@/utils/auth";
import { getLogin, refreshTokenApi } from "@/api/user";
import { UserResult, RefreshTokenResult } from "@/api/user";
import { useMultiTagsStoreHook } from "@/store/modules/multiTags";
import { type DataInfo, setToken, removeToken, sessionKey } from "@/utils/auth";
export const useUserStore = defineStore({
id: "pure-user",
state: (): userType => ({
// 用户名
username:
storageSession.getItem<DataInfo<number>>(sessionKey)?.username ?? "",
// 页面级别权限

View File

@@ -1,5 +1,5 @@
### 注意
- [文档](https://pure-admin-utils.vercel.app)
- `vue-pure-admin``3.3.0` 版本之后(不包括 `3.3.0` 版本),大部分工具和 `hooks` 都集成到了[@pureadmin/utils](https://xiaoxian521.github.io/pure-admin-utils-docs/)
- [npm](https://www.npmjs.com/package/@pureadmin/utils)
- vue-pure-admin 从 3.3.0 版本之后(不包括 3.3.0 版本),大部分工具和 hooks 都集成到了[@pureadmin/utils](https://pure-admin-utils.vercel.app)
- [文档代码地址](https://github.com/xiaoxian521/pure-admin-utils-docs)

View File

@@ -1,6 +1,6 @@
import Cookies from "js-cookie";
import { storageSession } from "@pureadmin/utils";
import { useUserStoreHook } from "/@/store/modules/user";
import { useUserStoreHook } from "@/store/modules/user";
export interface DataInfo<T> {
/** token */
@@ -70,3 +70,8 @@ export function removeToken() {
Cookies.remove(TokenKey);
sessionStorage.removeItem(sessionKey);
}
/** 格式化tokenjwt格式 */
export const formatToken = (token: string): string => {
return "Bearer " + token;
};

View File

@@ -3,7 +3,7 @@
### Get 请求
```
import { http } from "/@/utils/http";
import { http } from "@/utils/http";
// params传参
http.request('get', '/xxx', { params: param });
@@ -15,7 +15,7 @@ http.request('get', '/xxx?message=' + msg);
### Post 请求
```
import { http } from "/@/utils/http";
import { http } from "@/utils/http";
// params传参
http.request('post', '/xxx', { params: param });

View File

@@ -1,15 +1,19 @@
import Axios, { AxiosInstance, AxiosRequestConfig } from "axios";
import Axios, {
AxiosInstance,
AxiosRequestConfig,
CustomParamsSerializer
} from "axios";
import {
PureHttpError,
RequestMethods,
PureHttpResponse,
PureHttpRequestConfig
} from "./types.d";
import qs from "qs";
import { stringify } from "qs";
import NProgress from "../progress";
// import { loadEnv } from "@build/index";
import { getToken } from "/@/utils/auth";
import { useUserStoreHook } from "/@/store/modules/user";
import { getToken, formatToken } from "@/utils/auth";
import { useUserStoreHook } from "@/store/modules/user";
// 加载环境变量 VITE_PROXY_DOMAIN开发环境 VITE_PROXY_DOMAIN_REAL打包后的线上环境
// const { VITE_PROXY_DOMAIN, VITE_PROXY_DOMAIN_REAL } = loadEnv();
@@ -20,7 +24,7 @@ const defaultConfig: AxiosRequestConfig = {
// process.env.NODE_ENV === "production"
// ? VITE_PROXY_DOMAIN_REAL
// : VITE_PROXY_DOMAIN,
// 当前使用mock模拟请求将baseURL制空如果你的环境用到了http请求请删除下面的baseURL启用上面的baseURL并将第10行、15行代码注释取消
// 当前使用mock模拟请求将baseURL制空如果你的环境用到了http请求请删除下面的baseURL启用上面的baseURL并将第14行、19行代码注释取消
baseURL: "",
timeout: 10000,
headers: {
@@ -28,8 +32,10 @@ const defaultConfig: AxiosRequestConfig = {
"Content-Type": "application/json",
"X-Requested-With": "XMLHttpRequest"
},
// 数组格式参数序列化
paramsSerializer: params => qs.stringify(params, { indices: false })
// 数组格式参数序列化https://github.com/axios/axios/issues/5142
paramsSerializer: {
serialize: stringify as unknown as CustomParamsSerializer
}
};
class PureHttp {
@@ -37,29 +43,45 @@ class PureHttp {
this.httpInterceptorsRequest();
this.httpInterceptorsResponse();
}
/** token过期后暂存待执行的请求 */
private static requests = [];
/** 防止重复刷新token */
private static isRefreshing = false;
/** 初始化配置对象 */
private static initConfig: PureHttpRequestConfig = {};
/** 保存当前Axios实例对象 */
private static axiosInstance: AxiosInstance = Axios.create(defaultConfig);
/** 重连原始请求 */
private static retryOriginalRequest(config: PureHttpRequestConfig) {
return new Promise(resolve => {
PureHttp.requests.push((token: string) => {
config.headers["Authorization"] = formatToken(token);
resolve(config);
});
});
}
/** 请求拦截 */
private httpInterceptorsRequest(): void {
PureHttp.axiosInstance.interceptors.request.use(
async (config: PureHttpRequestConfig) => {
const $config = config;
// 开启进度条动画
NProgress.start();
// 优先判断post/get等方法是否传入回掉否则执行初始化设置等回掉
if (typeof config.beforeRequestCallback === "function") {
config.beforeRequestCallback($config);
return $config;
config.beforeRequestCallback(config);
return config;
}
if (PureHttp.initConfig.beforeRequestCallback) {
PureHttp.initConfig.beforeRequestCallback($config);
return $config;
PureHttp.initConfig.beforeRequestCallback(config);
return config;
}
/** 请求白名单通过设置请求白名单防止token过期后再请求造成的死循环问题 */
/** 请求白名单放置一些不需要token的接口通过设置请求白名单防止token过期后再请求造成的死循环问题 */
const whiteList = ["/refreshToken", "/login"];
return whiteList.some(v => config.url.indexOf(v) > -1)
? config
@@ -69,21 +91,30 @@ class PureHttp {
const now = new Date().getTime();
const expired = parseInt(data.expires) - now <= 0;
if (expired) {
// token过期刷新
useUserStoreHook()
.handRefreshToken({ refreshToken: data.refreshToken })
.then(res => {
config.headers["Authorization"] =
"Bearer " + res.data.accessToken;
resolve($config);
});
if (!PureHttp.isRefreshing) {
PureHttp.isRefreshing = true;
// token过期刷新
useUserStoreHook()
.handRefreshToken({ refreshToken: data.refreshToken })
.then(res => {
const token = res.data.accessToken;
config.headers["Authorization"] = formatToken(token);
PureHttp.requests.forEach(cb => cb(token));
PureHttp.requests = [];
})
.finally(() => {
PureHttp.isRefreshing = false;
});
}
resolve(PureHttp.retryOriginalRequest(config));
} else {
config.headers["Authorization"] =
"Bearer " + data.accessToken;
resolve($config);
config.headers["Authorization"] = formatToken(
data.accessToken
);
resolve(config);
}
} else {
resolve($config);
resolve(config);
}
});
},

View File

@@ -1,7 +1,7 @@
// 响应式storage
import { App } from "vue";
import Storage from "responsive-storage";
import { routerArrays } from "/@/layout/types";
import { routerArrays } from "@/layout/types";
const nameSpace = "responsive-";

View File

@@ -1,5 +1,5 @@
<script setup lang="ts">
import ReBarcode from "/@/components/ReBarcode";
import ReBarcode from "@/components/ReBarcode";
defineOptions({
name: "BarCode"

View File

@@ -6,7 +6,7 @@ import {
regionDataPlus,
regionData,
CodeToText
} from "/@/utils/chinaArea";
} from "@/utils/chinaArea";
import { ref } from "vue";
defineOptions({

View File

@@ -1,6 +1,6 @@
<script setup lang="ts">
import { ref } from "vue";
import { IconSelect } from "/@/components/ReIcon";
import { IconSelect } from "@/components/ReIcon";
defineOptions({
name: "IconSelect"

View File

@@ -1,10 +1,10 @@
<script setup lang="ts">
import { computed } from "vue";
import { cloneDeep } from "lodash-unified";
import { transformI18n } from "/@/plugins/i18n";
import ElTreeLine from "/@/components/ReTreeLine";
import { transformI18n } from "@/plugins/i18n";
import ElTreeLine from "@/components/ReTreeLine";
import { extractPathList, deleteChildren } from "@pureadmin/utils";
import { usePermissionStoreHook } from "/@/store/modules/permission";
import { usePermissionStoreHook } from "@/store/modules/permission";
defineOptions({
name: "LineTree"

View File

@@ -2,10 +2,10 @@
import { ref, computed } from "vue";
import { cloneDeep } from "lodash-unified";
import type { ElTreeV2 } from "element-plus";
import { transformI18n } from "/@/plugins/i18n";
import { useRenderIcon } from "/@/components/ReIcon/src/hooks";
import { transformI18n } from "@/plugins/i18n";
import { useRenderIcon } from "@/components/ReIcon/src/hooks";
import { extractPathList, deleteChildren } from "@pureadmin/utils";
import { usePermissionStoreHook } from "/@/store/modules/permission";
import { usePermissionStoreHook } from "@/store/modules/permission";
import type { TreeNode } from "element-plus/es/components/tree-v2/src/types";
defineOptions({

View File

@@ -1,5 +1,5 @@
<script setup lang="ts">
import Print from "/@/utils/print";
import Print from "@/utils/print";
import { reactive, ref } from "vue";
import { VxeTablePropTypes } from "vxe-table";
import Line from "../welcome/components/Line.vue";
@@ -165,9 +165,9 @@ const tableData: User[] = [
:value="item.value"
/>
</el-select>
<el-button size="small" type="primary" @click="onPrint"
>打印</el-button
>
<el-button size="small" type="primary" @click="onPrint">
打印
</el-button>
</div>
</div>
</template>
@@ -300,7 +300,7 @@ const tableData: User[] = [
>
<p class="font-medium pt-1">Image</p>
<img
src="../../assets/avatars.jpg"
src="https://avatars.githubusercontent.com/u/44761321?v=4"
alt="avatars"
class="img"
style="width: 200px; height: 200px; margin: 50px auto"

View File

@@ -1,8 +1,7 @@
<script setup lang="ts">
import { ref, unref } from "vue";
import { ElMessage } from "element-plus";
import avatars from "/@/assets/avatars.jpg";
import ReQrcode from "/@/components/ReQrcode";
import ReQrcode from "@/components/ReQrcode";
defineOptions({
name: "QrCode"
@@ -90,7 +89,10 @@ const disabledClick = () => {
<el-col :xl="6" :lg="6" :md="12" :sm="24" :xs="24">
<el-card shadow="hover" class="mb-[10px] text-center">
<div class="font-bold">logo配置</div>
<ReQrcode :text="qrcodeText" :logo="avatars" />
<ReQrcode
:text="qrcodeText"
logo="https://avatars.githubusercontent.com/u/44761321?v=4"
/>
</el-card>
</el-col>
<el-col :xl="6" :lg="6" :md="12" :sm="24" :xs="24">
@@ -99,7 +101,7 @@ const disabledClick = () => {
<ReQrcode
:text="qrcodeText"
:logo="{
src: avatars,
src: 'https://avatars.githubusercontent.com/u/44761321?v=4',
logoSize: 0.2,
borderSize: 0.05,
borderRadius: 50,

View File

@@ -1,6 +1,6 @@
<script setup lang="ts">
import { useRenderIcon } from "/@/components/ReIcon/src/hooks";
import { useRenderFlicker } from "/@/components/ReFlicker";
import { useRenderIcon } from "@/components/ReIcon/src/hooks";
import { useRenderFlicker } from "@/components/ReFlicker";
defineOptions({
name: "TimeLine"

View File

@@ -1,5 +1,5 @@
<script setup lang="ts">
import { ReNormalCountTo, ReboundCountTo } from "/@/components/ReCountTo";
import { ReNormalCountTo, ReboundCountTo } from "@/components/ReCountTo";
defineOptions({
name: "CountTo"

View File

@@ -1,6 +1,6 @@
<script setup lang="ts">
import { ref, nextTick } from "vue";
import Cropper from "/@/components/ReCropper";
import Cropper from "@/components/ReCropper";
import img from "./picture.jpeg";
defineOptions({

View File

@@ -0,0 +1,460 @@
const customDanmus = [
{
avatar:
"data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wCEAAoKCgoKCgsMDAsPEA4QDxYUExMUFiIYGhgaGCIzICUgICUgMy03LCksNy1RQDg4QFFeT0pPXnFlZXGPiI+7u/sBCgoKCgoKCwwMCw8QDhAPFhQTExQWIhgaGBoYIjMgJSAgJSAzLTcsKSw3LVFAODhAUV5PSk9ecWVlcY+Ij7u7+//CABEIADIAMgMBIgACEQEDEQH/xAAbAAEAAgMBAQAAAAAAAAAAAAAFBAYBAgMAB//aAAgBAQAAAAD7HU4ObhMC3AnlYvY8ISwA+6WDOd4/RA96FVeF66BOVWB3TsAOgZC27wv/xAAYAQEBAQEBAAAAAAAAAAAAAAACAwQAAf/aAAgBAhAAAAC3sw8uyRDQPV//xAAYAQADAQEAAAAAAAAAAAAAAAAAAgMBBP/aAAgBAxAAAACQ7LfmoUTNvFf/xAA0EAACAQMBBAcHAwUAAAAAAAABAgMABBESBRMxQRAhIjJRYbEUIzRCUnOBM3KSU2KRoeH/2gAIAQEAAT8AmmSCJpHOAoq6vZp8lmITkgonSQCMZxikkdGDxsVbxFbK2l7TGUkwHQfy6Ln4if7jetbcdglvH9TFv40hD71CGzlQpAyACRkt4VcxojxOdIj06GzwA5VKkilGUdjUcNxD9XlwI5g1Bfm0u4nC5UHDeYNWu0LS4B3D6mHHIwaufiJ/uN61tm6Et6GPCIbv8mtqi4gtrFkzjeuxIGRq+TP4orI1jpK+8MHAfVprYcM8kVysmoIGiwG8UfVgVcwh1ecDGiYcvlNWk7W9zDKucqwyPEVOczzfvb1q/wBkXWqR4Sja8nDHGCajAEagHIAx/jourmK0haaV9KrWyrFZLRZJ07MqNhc8Q3M/irfZFlaOGQF2HzOc1cACeYD+o3r0XptYEJKAyMx06TgsxOaupr+MhkIQk6TlfPlkVNCIxBc3A9onLjRG/WtWV1BPFlRp09TpzBHLoufiJ/uN69G05JLxt8C2ksQpTiAMHIq0mQz6HnMnZwurBwBRhKTLLK5Y6Oz/AGf9qwla3u4TykBRh/sdFx8RN9xvWpri43Unv5O6fmNSSSCHGtsb0DGfKrFm3zdZ7o9RUskhMnbbu+NLJJrh7bfqJz869onxjfSY/callk3knvG7x51//8QAIxEAAgEEAQMFAAAAAAAAAAAAAQIRAAMSMRAEIXETMjNBUf/aAAgBAgEBPwBMUTNv3tSdQrgZDYpwMmx0N8PdFv0iBMAyKS4QroF99JcxDhhMntwxgUCoJIER90jZCeG2PBpvjNWtHzx//8QAIBEAAgICAgIDAAAAAAAAAAAAAQIAERASAyEyM0GBkf/aAAgBAwEBPwBtmbURuErdRb1W/nCIW3vqMgJVr8YyWVIyvYG/5CKwJze36jY//9k=",
name: "美绪",
text: "马什么梅?"
},
{
avatar:
"data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wCEAAoKCgoKCgsMDAsPEA4QDxYUExMUFiIYGhgaGCIzICUgICUgMy03LCksNy1RQDg4QFFeT0pPXnFlZXGPiI+7u/sBCgoKCgoKCwwMCw8QDhAPFhQTExQWIhgaGBoYIjMgJSAgJSAzLTcsKSw3LVFAODhAUV5PSk9ecWVlcY+Ij7u7+//CABEIADIAMgMBIgACEQEDEQH/xAAbAAACAwEBAQAAAAAAAAAAAAAABQIDBAEGB//aAAgBAQAAAAD65hzG3WLcATfCbHYQ9IY0uiEfRkU1IOr+RoUG1ornWj7Y6//EABgBAQADAQAAAAAAAAAAAAAAAAQAAgUD/9oACAECEAAAACEf3IJba51tGDNq/wD/xAAYAQEAAwEAAAAAAAAAAAAAAAAEAQMFAv/aAAgBAxAAAABSg0MWQdj+c6VozP/EAC0QAAIBAwMBBgUFAAAAAAAAAAECEQADBBASMUEiUVJhcZEFExQhgSAyQoKx/9oACAEBAAE/AKu5oEi2A3meKOXf8cfgV9Xe2kEgyOeCKsZSXAqs0XP91z7+wC3MSCzeg/RbuG06uO8T6a5kNkOOu0CpUXWQMdo4kQRPQihPd9tH+4jXIw0yDukq0RNHFu2/iOVku0pfx7foHt91MttbMyN7njqQDo3BPkdWEqRJEjkV8QOV2LVq2xBBlkoq+y181CrgHn1nXHffZQ+UH8aEwCaEoJP9qzbe+ySOUO7XCuxca2f5CR6jS477H7bftPWt7+NvekdzbWXYyo60rvtXtHgda3v4j71Yd/qLPaPJ6+Vb38be9f/EACYRAAECBAQHAQAAAAAAAAAAAAECAwAEEBIREzFSITNBQlFhgXL/2gAIAQIBAT8AffKDYjXqYznd5hhwuI46ijjOOaSfaYUm232Ik9F/KKQFRMN2LHgiJVdrmG6s32fYa5iP0Kf/xAAmEQABAgQFBAMAAAAAAAAAAAABAgMAEBESBBNCUoEhMTNhUXFy/9oACAEDAQE/AGGAoXK4EZLWwQ+2G19Oxk28RlhI9GEqur9xi9HMm3C2qtAfRhhy9J+axiUXIrtnhdfEOeNf5Mv/2Q==",
name: "博士",
text: "马东什么?"
},
{
avatar:
"data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wCEAAoKCgoKCgsMDAsPEA4QDxYUExMUFiIYGhgaGCIzICUgICUgMy03LCksNy1RQDg4QFFeT0pPXnFlZXGPiI+7u/sBCgoKCgoKCwwMCw8QDhAPFhQTExQWIhgaGBoYIjMgJSAgJSAzLTcsKSw3LVFAODhAUV5PSk9ecWVlcY+Ij7u7+//CABEIADIAMgMBIgACEQEDEQH/xAAxAAACAgMBAAAAAAAAAAAAAAAABgQFAQIHAwEBAAMBAAAAAAAAAAAAAAAAAwABAgT/2gAMAwEAAhADEAAAAI7CsPnN1VeZ0okpTbSWASKzwmMPRy3PuuWhpv4KvQ7pcJYTUb+hdLQYWJoaVU+RU3jcXiaoegAhWOAPeeaBd1wGtf/EAC4QAAIBAwIEBAUFAQAAAAAAAAECAwAEEQUhBhASMRMiQWEUI3KBoSAzQlFSkv/aAAgBAQABPwDTxidHHbdTyZGjdkcYYelBGKM4HlUgH7/osXInRfQsK0q18abxGHkj/JrV0KXrEfzUGtLiE0F1G48r4GfcVJDJFI0TbMp52W91D9VXt42mWQCu0QUqHZQC7SyDIRA22QO5NXkFyLeFpnWRggYsMZw/+ioAPsRVlOtrpsshx+6d2OFGw3J/oVK897YR6nbfORCTkp0OVQ7lRk5Aq5gMZSVR8qVepfbPpy0jDSRyEZxIg/6JrjKJytlEEJ63uJD7ttXB6Tn41bhW8Mwxxjqzt3OBWrx+Bw9fQsRvIgBzjYutcP3F8upWVmZZltvjFPQW22BqeAJpHh+kWyeyhsL+KXS9RcB1WLpYZGSc4NcKwxTrcRy+qrj2IJIqe3S5AEsSOAcgMobB+9Lb9KhVAAHYCntRIjI6hkYYZWGQRUGm2ltMssVsiSKCAVGMZqWFZ4fDY4XYn7ULaEgF182N/Me9cIuI3kY9gFodLAEHINFgKDKdqwK1LVotOMSsnWz5JAPYUeJZyTiKMVwv2n+la08npcZOBjke3LVWZtRuizE4kI5f/8QAIBEBAAIBAgcAAAAAAAAAAAAAAQARAwIQEiAhMTJBcf/aAAgBAgEBPwDL5HzkadfX0RDjmTSUJtks1MqWpVypk7uxt//EACARAQABAwMFAAAAAAAAAAAAAAEAAhEhAxATEiIxYXH/2gAIAQMBAT8A0m1L9l+2++Sg9sF45p1N7M6iUJYwM5GYW4ZmZT4Njb//2Q==",
name: "柚子",
text: "什么冬梅?"
}
];
// 弹幕来自b站首页
const danmus = [
"草",
"高技术力",
"汤姆逊波纹疾走…啊哒哒哒哒哒哒……",
"此曲一出,非死即伤",
"这播放量不应该啊",
"牛皮!",
"全 文 背 诵",
"ohhhhhhh",
"NICE",
"草这死亡姿势",
"日常迫害团长",
"溜了溜了",
"火钳刘明",
"真实",
"汤姆逊波纹疾走",
"不 要 停 下 来 啊",
"泥 给 路 打 油",
"停下来了",
"草",
"完全一致",
"你怎么还没有被禁赛",
"6P41波纹疾走!!!",
"牛逼",
"草",
"草",
"cccccccc",
"人才不火系列",
"双厨狂喜",
"双厨曝炸",
"火钳留名",
"火钳留名",
"牛逼啊",
"草",
"草",
"要素过多",
"火钳刘明",
"高技术力suki",
"bo良ki影觉得很赞",
"你们的下一句话是名场面",
"Niiice",
"太草了",
"哈哈哈哈",
"火钳刘明",
"6p41疾走",
"袭击妈妈",
"占戈哥欠走己",
"又看jojo又玩r6的人恐怕太少了吧",
"好活当赏",
"要素过多",
"动作也太流畅了吧",
"世界名画",
"好活,当赏",
"全程高能",
"新人都是怪物.jpg",
"我的人质啊",
"袭击妈妈锁孔看她",
"完全不会画画(大嘘)",
"好活",
"爆头 2333333",
"把队友杀了的屑",
"动作指导:奥尔加",
"草",
"要素过多",
"噗",
"让你玩手机",
"6啊",
"我负责救人质",
"三厨狂喜",
"三厨狂喜",
"万能日语",
"耶———————格——————————",
"6P41波纹疾走",
"“哦”踩点还行",
"火钳刘明。",
"哎地唉洗",
"这枪不是m249啊等等叫什么来的",
"火钳刘明",
"光棍节, 。去过",
"炸死队友哈哈哈",
"火钳刘明",
"火钳刘明",
"cao",
"火钳刘明",
"提前Niiiiiiiice",
"火钳刘明",
"神仙UP",
"又被爆头了",
"6p41疾走",
"好活",
"人质好好笑啊",
"不要停下来啊",
"好活啊!!",
"6P41波纹疾走 换成AK是不是更爽",
"恭喜你发现宝藏",
"恭喜你发现宝藏",
"恭喜你发现宝藏",
"前方高能",
"封禁30分钟",
"火钳刘明",
"该赏",
"我靠,就冲着高帧数,投币了",
"不 要 停 下 来 啊(指你给路)",
"卧槽 无情",
"草",
"ADS草",
"世界线收束",
"火钳刘明",
"人质:给我把抢我跟他拼了",
"小车灵魂",
"卧槽这帧数",
"jojoの奇妙转场",
"niiiiiiice",
"好活",
"要素过多",
"6p41",
"TK*3移除对战",
"这场景布置有弹丸那味儿了",
"草",
"草",
"不要让战斗停下来",
"火钳留名",
"炸死俩盾哈哈",
"太草了,",
"万能日语",
"伪渲染(确信)",
"要素过多",
"火钳刘明",
"卧槽",
"炸死队友",
"危",
"这才是真正的高技术力",
"高技术力suki",
"火钳刘明",
"欺负我不懂日语系列",
"我打我自己",
"帧数爆炸",
"危",
"危",
"要素过多",
"巨真实这小车",
"牛逼",
"帧数高的吓人",
"5v5→3v3",
"我都是俄式救援",
"niiiiiiiiiiiice",
"别啊!",
"尼给路嗒呦",
"目测会火",
"双厨狂喜",
"人质已解救(脱)",
"哈哈哈哈哈",
"要素过多",
"nb",
"杀了两个队友不就被踢出去了吗",
"这是新人?",
"没毛病",
"一甲fuze",
"要素过多",
"大————头————",
"人————质————",
"这是组长吗?",
"不是M249是PKP",
"卡其脱离太",
"等等JOJO是你",
"我就是又看JOJO又玩r6",
"二乔??????",
"这也太流畅了吧",
"这tm能出番了这帧数和技术",
"kpm波纹疾走",
"大制作",
"太草了",
"耶——格——",
"高技术力",
"精神小车",
"左轮庸医",
"袭击人质,锁孔看他",
"奈~~斯 屑队友被杀✓",
"惨 盾兵 惨",
"打敌人误伤不算",
"不要停下来啊! (指解救人质)",
"嘴巴被贴胶还能说话的人质是鉴",
"哈哈哈哈哈哈哈哈哈",
"一局11杀",
"二乔同款姿势 哈哈",
"耶格!",
"看",
"鉴作无误",
"双出狂喜",
"为什么不是中文",
"经典咚咚咚………三声雷,带你飞",
"要素过多",
"jojo",
"三厨狂喜",
"我也是又看又玩",
"我都听到lisalisa了doge",
"你给路打油",
"确实质量很高啊",
"NICE",
"银魂?",
"火钳刘明",
"我就是又看jojo又玩R61631小时你有什么事吗",
"哟西哟西",
"要素过多",
"我也是看JOJO玩r6",
"nokk",
"800小时r6加二刷jojo在此",
"好活",
"jojo",
"fuze the hostage",
"不要停下来!!!!!",
"pkppkp波纹疾走",
"新人都是怪物吗?",
"23333333",
"我先来,首页通知书",
"咚咚咚放这里。。。",
"火钳刘明",
"火钳刘明",
"火钳刘明",
"队友都炸",
"nice",
"哈哈哈哈",
"人质:危!",
"危",
"火钳刘明",
"人质 卒",
"你币有了",
"打投组",
"恭喜首頁通知書!",
"要素溢出",
"HOSTAGE KIA",
"233",
"是无托版的PKP",
"666",
"hostage KIA",
"tk哈哈哈",
"要素过多",
"这个肌肉我可以惹",
"6的飞起",
"jo风",
"混入了奇怪的东西",
"草",
"袭击妈妈,锁孔看她",
"哈哈哈哈哈哈",
"",
"草",
"牛逼",
"高技术力啊",
"opp",
"X",
"组长!",
"草(中日双语)",
"哈哈哈哈哈哈",
"-500",
".",
"看封面识内容系列",
"草",
"首页通知书",
"要素过多",
"但是不会画画",
"草",
"不要停下来啊!",
"梅开三度",
"四回啊四回",
"高帧好评",
"人质已解脱",
"草",
"强",
"好活!",
"好流畅",
"草",
"666",
"好活儿当赏",
"新人都是怪物系列",
"高技术力",
"niiiiiiiiiiiiiiice",
"人质危",
"哈哈哈哈",
"带制作,三连了",
"鉴作",
"咚咚咚",
"咚咚咚咚棒棒棒棒",
"要素过多",
"不应该是打中耳机吗",
"高技术力",
"完了",
"彩虹六号牛批",
"口罩都有荒木线,佛了",
"哈哈哈",
"要素爆炸",
"高技术力",
"cao caocaocaocao",
"哈哈哈哈哈哈哈",
"等等2乔这里说的是30分钟",
"首页通知书",
"海 岸 线",
"pkp波纹疾走",
"耶————————格————————",
"人 质 凶 手 -500",
"队友WDNMD",
"jojo",
"点进来之前我以为是fuze饮料。。",
"要素过多",
"绝了",
"要素过多",
"灭 霸",
"新人都是魔鬼",
"帧数爆炸",
"Cluster Charge activated",
"要素过多",
"Hostage KIAMission failed",
"人质已解脱。。。",
"开 幕 雷 击",
"哈哈哈哈",
"ADS草死了",
"+0",
"牛批牛批",
"拜见大神",
"阿虚",
"这帧数,感觉在看动漫",
"卡其脱离太",
"双厨狂喜",
"问问",
"不要停下来啊!!!!!",
"h",
"不要停下来啊",
"要真30分钟都不用结束回合了都开始第二局游戏了",
"这也太强了",
"。。。。。。。。。。。。",
"hoho",
"要素过多",
"哈哈哈哈哈哈哈哈哈哈哈哈哈哈",
"哈哈哈哈哈哈哈哈哈哈",
".00",
"哈哈",
"万能的日语",
"首页通知书",
"我卡了?",
"hhhhh",
"大盾闪盾好惨",
"哈哈哈哈哈哈哈哈哈",
"草",
"要素太多受不了哈哈哈哈哈哈哈",
"火钳刘明",
"首页通知书",
"lisalisa",
"这是什么蛇皮操作,看不懂",
"敌 我 不 分",
"草",
"666",
"哈哈哈哈啊哈哈哈",
"完全一致",
"要素过多",
"你又双叒叕发现了新的宝藏",
"火钳刘明",
"2333",
"高 技 术 力",
"三梗合一",
"四梗合一",
"火钳刘明",
"杀2个队友不是直接飞了吗",
"首页通知书",
"海岸线",
"是延迟",
"好活当赏",
"这个我遇到过fuze就是我人质敌人队友都被我杀掉了被老外骂并被踢了",
"草素过多",
"人质—— 再不能起",
"必须三联",
"开始吟唱",
"不要停下来啊",
"草",
"",
"tab+shift",
"帧数高的和动画一样",
"wwwwwwwwwwww",
"好强",
"23333333",
"好活当赏",
"此曲一出",
"要素过载",
"火钳刘明",
"要素过载",
"好活!!!!",
"开始吟唱",
"我听得懂咋办,在线等,很急",
"哇哇哇好高清",
".",
"医 学 奇 迹",
"jo里jo气的",
"jojo画风",
"哈哈哈哈哈哈",
"俄式反恐",
"别拦我老子把3个ADS都丢他脸上",
"-500",
"万 能 日 语",
"666",
"人质杀手",
"做的真的棒。",
"我NM笑疯",
"双厨狂喜",
"玛撒卡!这是袭击妈妈配音?",
"nice",
"jojo!",
"JO小鬼来力",
"真实",
"我又玩R6又看JOJO",
"完 全 不 会 画 画",
"秀儿",
"是系统自动踢人的,老外来不及踢你",
"6p41波纹疾走",
"火钳刘明",
"lisalisa",
"盾——兵——(悲)",
"就是没有汤姆逊,汤姆逊波纹疾走!!",
"要素过多",
"。。。。??",
"组长你怎么了组长",
"UP:我 完 全 不 会 画 画",
"再来亿遍",
"泥给路带呦~",
"哈哈哈哈哈哈哈哈哈",
"哈哈哈哈哈哈哈哈哈",
"火钳刘明"
];
const getDanmuData = () => {
return danmus.map((text, index) => {
const _index = index % 3;
return {
avatar: customDanmus[_index].avatar,
name: customDanmus[_index].name,
text
};
});
};
export { customDanmus, danmus, getDanmuData };

View File

@@ -0,0 +1,215 @@
<script setup lang="ts">
import { danmus as danmusData, getDanmuData } from "./danmu.js";
import { onMounted, onUnmounted, reactive, ref } from "vue";
import VueDanmaku from "vue3-danmaku";
defineOptions({
name: "Danmaku"
});
const danmaku = ref<any>(null);
const danmus = ref<any[]>(getDanmuData());
const danmuMsg = ref<string>("");
let timer = 0;
const config = reactive({
channels: 5, // 轨道数量为0则弹幕轨道数会撑满容器
useSlot: true, // 是否开启slot
loop: true, // 是否开启弹幕循环
speeds: 200, // 弹幕速度,实际为弹幕滚动完一整屏的秒数,值越小速度越快
fontSize: 20, // 文本模式下的字号
top: 10, // 弹幕轨道间的垂直间距
right: 0, // 同一轨道弹幕的水平间距
debounce: 100, // 弹幕刷新频率多少毫秒插入一条弹幕建议不小于50
randomChannel: true // 随机弹幕轨道
});
onMounted(() => {
window.onresize = () => resizeHandler();
});
onUnmounted(() => {
window.onresize = null;
});
function play(type: string) {
switch (type) {
case "play":
danmaku.value.play();
break;
case "pause":
danmaku.value.pause();
break;
case "stop":
danmaku.value.stop();
break;
case "show":
danmaku.value.show();
break;
case "hide":
danmaku.value.hide();
break;
case "reset":
danmaku.value.reset();
break;
default:
break;
}
}
function switchSlot(slot: boolean) {
config.useSlot = slot;
danmus.value = slot ? getDanmuData() : danmusData;
setTimeout(() => {
danmaku.value.stop();
danmaku.value.play();
});
}
function speedsChange(val: number) {
if (config.speeds <= 10 && val === -10) {
return;
}
config.speeds += val;
danmaku.value.reset();
}
function fontChange(val: number) {
config.fontSize += val;
danmaku.value.reset();
}
function channelChange(val: number) {
if (!config.channels && val === -1) {
return;
}
config.channels += val;
}
function resizeHandler() {
if (timer) clearTimeout(timer);
timer = window.setTimeout(() => {
danmaku.value.resize();
}, 500);
}
function addDanmu() {
if (!danmuMsg.value) return;
const _danmuMsg = config.useSlot
? {
avatar: "https://i.loli.net/2021/01/17/xpwbm3jKytfaNOD.jpg",
name: "你",
text: danmuMsg.value
}
: danmuMsg.value;
danmaku.value.add(_danmuMsg);
danmuMsg.value = "";
}
</script>
<template>
<el-card>
<template #header>
<div class="card-header">
<span class="font-medium">
弹幕组件采用开源的
<el-link
href="https://github.com/hellodigua/vue-danmaku/tree/vue3"
target="_blank"
style="font-size: 16px; margin: 0 4px 5px"
>
vue-danmaku
</el-link>
</span>
</div>
</template>
<div class="flex gap-5">
<vue-danmaku
ref="danmaku"
class="demo"
v-model:danmus="danmus"
isSuspend
v-bind="config"
>
<!-- 弹幕slot -->
<template v-slot:dm="{ danmu, index }">
<div class="danmu-item">
<img class="img" :src="danmu.avatar" />
<span>{{ index }}{{ danmu.name }}</span>
<span>{{ danmu.text }}</span>
</div>
</template>
</vue-danmaku>
<div class="main">
<p>
播放
<el-button @click="play('play')">播放</el-button>
<el-button @click="play('pause')">暂停</el-button>
<el-button @click="play('stop')">停止</el-button>
</p>
<p>
模式
<el-button @click="switchSlot(true)">弹幕 slot</el-button>
<el-button @click="switchSlot(false)">普通文本</el-button>
</p>
<p>
显示
<el-button @click="play('show')">显示</el-button>
<el-button @click="play('hide')">隐藏</el-button>
</p>
<p>
速度
<el-button @click="speedsChange(-10)">减速</el-button>
<el-button @click="speedsChange(10)">增速</el-button>
<span class="ml-5">当前速度{{ config.speeds }}像素/s</span>
</p>
<p>
字号
<el-button :disabled="config.useSlot" @click="fontChange(-1)">
缩小
</el-button>
<el-button :disabled="config.useSlot" @click="fontChange(1)">
放大
</el-button>
<span class="ml-5">当前字号{{ config.fontSize }}px</span>
</p>
<p>
轨道
<el-button @click="channelChange(-1)">-1</el-button>
<el-button @click="channelChange(1)">+1</el-button>
<el-button @click="channelChange(-config.channels)"> 填满 </el-button>
<span class="ml-5">当前轨道{{ config.channels }}</span>
</p>
<p class="flex">
<el-input
type="text"
placeholder="输入评论后,回车发送弹幕"
v-model="danmuMsg"
@keyup.enter="addDanmu"
/>
</p>
</div>
</div>
</el-card>
</template>
<style lang="scss">
.demo {
flex: 1;
height: 600px;
background: linear-gradient(45deg, #5ac381, #20568b);
.danmu-item {
display: flex;
align-items: center;
.img {
height: 25px;
width: 25px;
border-radius: 50%;
margin-right: 5px;
}
}
}
.main {
flex: 1;
p {
margin-top: 10px;
}
}
</style>

View File

@@ -2,7 +2,7 @@
import Sortable from "sortablejs";
import { ref, onMounted } from "vue";
import draggable from "vuedraggable/src/vuedraggable";
import { useRenderIcon } from "/@/components/ReIcon/src/hooks";
import { useRenderIcon } from "@/components/ReIcon/src/hooks";
defineOptions({
name: "Draggable"
@@ -54,7 +54,7 @@ onMounted(() => {
<el-card>
<template #header>
<div class="card-header">
<span>
<span class="font-medium">
拖拽组件采用开源的
<el-link
href="https://sortablejs.github.io/vue.draggable.next/#/simple"

View File

@@ -1,5 +1,5 @@
<script setup lang="ts">
import { Amap } from "/@/components/ReMap";
import { Amap } from "@/components/ReMap";
defineOptions({
name: "Map"

View File

@@ -1,7 +1,7 @@
<script setup lang="ts">
import { ref, reactive, unref } from "vue";
import { templateRef } from "@vueuse/core";
import SeamlessScroll from "/@/components/ReSeamlessScroll";
import SeamlessScroll from "@/components/ReSeamlessScroll";
defineOptions({
name: "SeamlessScroll"

View File

@@ -1,6 +1,6 @@
<script setup lang="ts">
import { ref } from "vue";
import Selector from "/@/components/ReSelector";
import Selector from "@/components/ReSelector";
defineOptions({
name: "Selector"

View File

@@ -1,5 +1,5 @@
<script setup lang="ts">
import splitpane, { ContextProps } from "/@/components/ReSplitPane";
import splitpane, { ContextProps } from "@/components/ReSplitPane";
import { reactive } from "vue";
defineOptions({

View File

@@ -1,5 +1,5 @@
<script setup lang="ts">
import TypeIt from "/@/components/ReTypeit";
import TypeIt from "@/components/ReTypeit";
defineOptions({
name: "Typeit"

View File

@@ -5,7 +5,7 @@ import volume from "xgplayer/es/controls/volume";
import { deviceDetection } from "@pureadmin/utils";
import screenShot from "xgplayer/es/controls/screenShot";
import playbackRate from "xgplayer/es/controls/playbackRate";
import { useRenderIcon } from "/@/components/ReIcon/src/hooks";
import { useRenderIcon } from "@/components/ReIcon/src/hooks";
defineOptions({
name: "Video"

View File

@@ -1,7 +1,7 @@
<script setup lang="ts">
import "@wangeditor/editor/dist/css/style.css"; // 引入 css
import { Editor, Toolbar } from "@wangeditor/editor-for-vue";
import { useRenderIcon } from "/@/components/ReIcon/src/hooks";
import { useRenderIcon } from "@/components/ReIcon/src/hooks";
import { onBeforeUnmount, ref, shallowRef, onMounted } from "vue";
defineOptions({

View File

@@ -1,5 +1,5 @@
<script setup lang="ts">
import back from "/@/assets/svg/back.svg?component";
import back from "@/assets/svg/back.svg?component";
defineOptions({
name: "Empty"

Some files were not shown because too many files have changed in this diff Show More