Compare commits

...

11 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
125 changed files with 1153 additions and 351 deletions

View File

@@ -1,3 +1,21 @@
# 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

View File

@@ -1,3 +1,21 @@
# 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

View File

@@ -1,3 +1,21 @@
# 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

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 版

View File

@@ -11,8 +11,8 @@ 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: string,

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.1",
"version": "3.6.3",
"private": true,
"scripts": {
"dev": "NODE_OPTIONS=--max-old-space-size=4096 vite",
@@ -77,6 +77,7 @@
"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",

13
pnpm-lock.yaml generated
View File

@@ -120,6 +120,7 @@ specifiers:
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
@@ -176,6 +177,7 @@ dependencies:
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
@@ -9027,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:
{

View File

@@ -1,5 +1,5 @@
{
"Version": "3.6.1",
"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"
@@ -65,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[]) {

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

@@ -12,8 +12,8 @@ import {
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();
@@ -43,27 +43,43 @@ 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过期后再请求造成的死循环问题 */
const whiteList = ["/refreshToken", "/login"];
@@ -75,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"

View File

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

View File

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

View File

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

View File

@@ -5,11 +5,11 @@ import "@logicflow/extension/lib/style/index.css";
import LogicFlow from "@logicflow/core";
import { ref, unref, onMounted } from "vue";
import { useRenderIcon } from "/@/components/ReIcon/src/hooks";
import { BpmnNode } from "/@/components/ReFlowChart/src/config";
import { useRenderIcon } from "@/components/ReIcon/src/hooks";
import { BpmnNode } from "@/components/ReFlowChart/src/config";
import { Snapshot, BpmnElement, Menu } from "@logicflow/extension";
import { Control, NodePanel, DataDialog } from "/@/components/ReFlowChart";
import { toLogicflowData } from "/@/components/ReFlowChart/src/adpterForTurbo";
import { Control, NodePanel, DataDialog } from "@/components/ReFlowChart";
import { toLogicflowData } from "@/components/ReFlowChart/src/adpterForTurbo";
defineOptions({
name: "FlowChart"

View File

@@ -1,10 +1,10 @@
<script setup lang="ts">
import { computed, PropType } from "vue";
import shopIcon from "/@/assets/svg/shop.svg?component";
import laptopIcon from "/@/assets/svg/laptop.svg?component";
import serviceIcon from "/@/assets/svg/service.svg?component";
import calendarIcon from "/@/assets/svg/calendar.svg?component";
import userAvatarIcon from "/@/assets/svg/user_avatar.svg?component";
import shopIcon from "@/assets/svg/shop.svg?component";
import laptopIcon from "@/assets/svg/laptop.svg?component";
import serviceIcon from "@/assets/svg/service.svg?component";
import calendarIcon from "@/assets/svg/calendar.svg?component";
import userAvatarIcon from "@/assets/svg/user_avatar.svg?component";
defineOptions({
name: "ReCard"

View File

@@ -1,10 +1,10 @@
<script setup lang="ts">
import Card from "./components/Card.vue";
import { getCardList } from "/@/api/list";
import { getCardList } from "@/api/list";
import { ref, onMounted, nextTick } from "vue";
import dialogForm from "./components/DialogForm.vue";
import { ElMessage, ElMessageBox } from "element-plus";
import { useRenderIcon } from "/@/components/ReIcon/src/hooks";
import { useRenderIcon } from "@/components/ReIcon/src/hooks";
defineOptions({
name: "ListCard"

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