Merge branch 'main' into gitee

This commit is contained in:
xiaoxian521 2023-02-11 16:17:53 +08:00
commit 3fb9c6895e
53 changed files with 432 additions and 345 deletions

View File

@ -5,7 +5,7 @@ import TypeIt from "typeit";
export default defineComponent({ export default defineComponent({
name: "TypeIt", name: "TypeIt",
props: { props: {
/** 打字速度,以每一步之间的毫秒数为单位 */ /** 打字速度,以每一步之间的毫秒数为单位,默认`200` */
speed: { speed: {
type: Number, type: Number,
default: 200 default: 200

View File

@ -0,0 +1,20 @@
<script setup lang="ts">
import { toRaw } from "vue";
import { useRenderIcon } from "@/components/ReIcon/src/hooks";
const props = defineProps({
extraIcon: {
type: String,
default: ""
}
});
</script>
<template>
<div v-if="props.extraIcon" class="flex justify-center items-center">
<component
:is="useRenderIcon(toRaw(props.extraIcon))"
class="w-[30px] h-[30px]"
/>
</div>
</template>

View File

@ -1,4 +1,5 @@
<script setup lang="ts"> <script setup lang="ts">
import extraIcon from "./extraIcon.vue";
import Search from "../search/index.vue"; import Search from "../search/index.vue";
import Notice from "../notice/index.vue"; import Notice from "../notice/index.vue";
import { useNav } from "@/layout/hooks/useNav"; import { useNav } from "@/layout/hooks/useNav";
@ -26,6 +27,7 @@ const {
menuSelect, menuSelect,
resolvePath, resolvePath,
username, username,
getDivStyle,
avatarsStyle, avatarsStyle,
getDropdownItemStyle, getDropdownItemStyle,
getDropdownItemClass getDropdownItemClass
@ -85,15 +87,12 @@ watch(
:is="useRenderIcon(route.meta && toRaw(route.meta.icon))" :is="useRenderIcon(route.meta && toRaw(route.meta.icon))"
/> />
</div> </div>
<span class="select-none">{{ transformI18n(route.meta.title) }}</span> <div :style="getDivStyle">
<FontIcon <span class="select-none">
v-if="route.meta.extraIcon" {{ transformI18n(route.meta.title) }}
width="30px" </span>
height="30px" <extraIcon :extraIcon="route.meta.extraIcon" />
style="position: absolute; right: 10px" </div>
:icon="route.meta.extraIcon.name"
:svg="route.meta.extraIcon.svg ? true : false"
/>
</template> </template>
</el-menu-item> </el-menu-item>
</el-menu> </el-menu>

View File

@ -1,18 +1,19 @@
<script setup lang="ts"> <script setup lang="ts">
import path from "path"; import path from "path";
import { getConfig } from "@/config"; import { getConfig } from "@/config";
import extraIcon from "./extraIcon.vue";
import { childrenType } from "../../types"; import { childrenType } from "../../types";
import { useNav } from "@/layout/hooks/useNav"; import { useNav } from "@/layout/hooks/useNav";
import { transformI18n } from "@/plugins/i18n"; import { transformI18n } from "@/plugins/i18n";
import { useRenderIcon } from "@/components/ReIcon/src/hooks"; import { useRenderIcon } from "@/components/ReIcon/src/hooks";
import { ref, toRaw, PropType, nextTick, computed, CSSProperties } from "vue"; import { ref, toRaw, PropType, nextTick, computed, CSSProperties } from "vue";
import ArrowUp from "@iconify-icons/ep/arrow-up"; import ArrowUp from "@iconify-icons/ep/arrow-up-bold";
import EpArrowDown from "@iconify-icons/ep/arrow-down"; import EpArrowDown from "@iconify-icons/ep/arrow-down-bold";
import ArrowLeft from "@iconify-icons/ep/arrow-left"; import ArrowLeft from "@iconify-icons/ep/arrow-left-bold";
import ArrowRight from "@iconify-icons/ep/arrow-right"; import ArrowRight from "@iconify-icons/ep/arrow-right-bold";
const { layout, isCollapse, tooltipEffect } = useNav(); const { layout, isCollapse, tooltipEffect, getDivStyle } = useNav();
const props = defineProps({ const props = defineProps({
item: { item: {
@ -50,16 +51,6 @@ const getMenuTextStyle = computed(() => {
}; };
}); });
const getDivStyle = computed((): CSSProperties => {
return {
width: "100%",
display: "flex",
alignItems: "center",
justifyContent: "space-between",
overflow: "hidden"
};
});
const getsubMenuIconStyle = computed((): CSSProperties => { const getsubMenuIconStyle = computed((): CSSProperties => {
return { return {
display: "flex", display: "flex",
@ -89,6 +80,28 @@ const getSubTextStyle = computed((): CSSProperties => {
} }
}); });
const getSubMenuDivStyle = computed((): any => {
return item => {
return !isCollapse.value
? {
width: "100%",
display: "flex",
alignItems: "center",
justifyContent: "space-between",
overflow: "hidden"
}
: {
width: "100%",
textAlign:
item?.parentId === null
? "center"
: layout.value === "mix" && item?.pathList?.length === 2
? "center"
: ""
};
};
});
const expandCloseIcon = computed(() => { const expandCloseIcon = computed(() => {
if (!getConfig()?.MenuArrowIconNoTransition) return ""; if (!getConfig()?.MenuArrowIconNoTransition) return "";
return { return {
@ -240,13 +253,7 @@ function resolvePath(routePath) {
{{ transformI18n(onlyOneChild.meta.title) }} {{ transformI18n(onlyOneChild.meta.title) }}
</span> </span>
</el-tooltip> </el-tooltip>
<FontIcon <extraIcon :extraIcon="onlyOneChild.meta.extraIcon" />
v-if="onlyOneChild.meta.extraIcon"
width="30px"
height="30px"
:icon="onlyOneChild.meta.extraIcon.name"
:svg="onlyOneChild.meta.extraIcon.svg ? true : false"
/>
</div> </div>
</template> </template>
</el-menu-item> </el-menu-item>
@ -267,41 +274,41 @@ function resolvePath(routePath) {
:is="useRenderIcon(props.item.meta && toRaw(props.item.meta.icon))" :is="useRenderIcon(props.item.meta && toRaw(props.item.meta.icon))"
/> />
</div> </div>
<span v-if="layout === 'horizontal'"> <div
{{ transformI18n(props.item.meta.title) }} :style="getSubMenuDivStyle(props.item)"
</span>
<el-tooltip
v-if=" v-if="
layout !== 'horizontal' &&
!( !(
isCollapse && isCollapse &&
toRaw(props.item.meta.icon) && toRaw(props.item.meta.icon) &&
props.item.parentId === null props.item.parentId === null
) )
" "
placement="top"
:effect="tooltipEffect"
:offset="-10"
:disabled="!props.item.showTooltip"
> >
<template #content> <span v-if="layout === 'horizontal'">
{{ transformI18n(props.item.meta.title) }} {{ transformI18n(props.item.meta.title) }}
</template>
<span
ref="menuTextRef"
:style="getSubTextStyle"
@mouseover="hoverMenu(props.item)"
>
{{ overflowSlice(transformI18n(props.item.meta.title), props.item) }}
</span> </span>
</el-tooltip> <el-tooltip
<FontIcon v-if="layout !== 'horizontal'"
v-if="props.item.meta.extraIcon" placement="top"
width="30px" :effect="tooltipEffect"
height="30px" :offset="-10"
:icon="props.item.meta.extraIcon.name" :disabled="!props.item.showTooltip"
:svg="props.item.meta.extraIcon.svg ? true : false" >
/> <template #content>
{{ transformI18n(props.item.meta.title) }}
</template>
<span
ref="menuTextRef"
:style="getSubTextStyle"
@mouseover="hoverMenu(props.item)"
>
{{
overflowSlice(transformI18n(props.item.meta.title), props.item)
}}
</span>
</el-tooltip>
<extraIcon v-if="!isCollapse" :extraIcon="props.item.meta.extraIcon" />
</div>
</template> </template>
<sidebar-item <sidebar-item
v-for="child in props.item.children" v-for="child in props.item.children"

View File

@ -1,4 +1,3 @@
import { computed } from "vue";
import { storeToRefs } from "pinia"; import { storeToRefs } from "pinia";
import { getConfig } from "@/config"; import { getConfig } from "@/config";
import { useRouter } from "vue-router"; import { useRouter } from "vue-router";
@ -7,6 +6,7 @@ import { routeMetaType } from "../types";
import { useGlobal } from "@pureadmin/utils"; import { useGlobal } from "@pureadmin/utils";
import { transformI18n } from "@/plugins/i18n"; import { transformI18n } from "@/plugins/i18n";
import { router, remainingPaths } from "@/router"; import { router, remainingPaths } from "@/router";
import { computed, type CSSProperties } from "vue";
import { useAppStoreHook } from "@/store/modules/app"; import { useAppStoreHook } from "@/store/modules/app";
import { useUserStoreHook } from "@/store/modules/user"; import { useUserStoreHook } from "@/store/modules/user";
import { useEpThemeStoreHook } from "@/store/modules/epTheme"; import { useEpThemeStoreHook } from "@/store/modules/epTheme";
@ -21,6 +21,16 @@ export function useNav() {
/** 平台`layout`中所有`el-tooltip`的`effect`配置,默认`light` */ /** 平台`layout`中所有`el-tooltip`的`effect`配置,默认`light` */
const tooltipEffect = getConfig()?.TooltipEffect ?? "light"; const tooltipEffect = getConfig()?.TooltipEffect ?? "light";
const getDivStyle = computed((): CSSProperties => {
return {
width: "100%",
display: "flex",
alignItems: "center",
justifyContent: "space-between",
overflow: "hidden"
};
});
/** 用户名 */ /** 用户名 */
const username = computed(() => { const username = computed(() => {
return useUserStoreHook()?.username; return useUserStoreHook()?.username;
@ -146,6 +156,7 @@ export function useNav() {
$storage, $storage,
backHome, backHome,
onPanel, onPanel,
getDivStyle,
changeTitle, changeTitle,
toggleSideBar, toggleSideBar,
menuSelect, menuSelect,

View File

@ -67,10 +67,7 @@ export type childrenType = {
icon?: string; icon?: string;
title?: string; title?: string;
showParent?: boolean; showParent?: boolean;
extraIcon?: { extraIcon?: string;
svg?: boolean;
name?: string;
};
}; };
showTooltip?: boolean; showTooltip?: boolean;
parentId?: number; parentId?: number;

View File

@ -16,10 +16,7 @@ export default {
component: () => import("@/views/components/message/index.vue"), component: () => import("@/views/components/message/index.vue"),
meta: { meta: {
title: $t("menus.hsmessage"), title: $t("menus.hsmessage"),
extraIcon: { extraIcon: "IF-pure-iconfont-new svg",
svg: true,
name: "pure-iconfont-new"
},
transition: { transition: {
enterTransition: "animate__fadeInLeft", enterTransition: "animate__fadeInLeft",
leaveTransition: "animate__fadeOutRight" leaveTransition: "animate__fadeOutRight"

View File

@ -53,10 +53,7 @@ export default {
meta: { meta: {
title: $t("menus.hsmenu1-2-2"), title: $t("menus.hsmenu1-2-2"),
keepAlive: true, keepAlive: true,
extraIcon: { extraIcon: "IF-pure-iconfont-new svg"
svg: true,
name: "pure-iconfont-new"
}
} }
} }
] ]

View File

@ -31,7 +31,7 @@ const barcodes = [
<template> <template>
<div> <div>
<el-card> <el-card shadow="never">
<template #header> <template #header>
<div class="font-medium"> <div class="font-medium">
条形码基于 条形码基于

View File

@ -24,7 +24,7 @@ const handleChange = value => {
</script> </script>
<template> <template>
<el-card> <el-card shadow="never">
<template #header> 区域级联选择器 </template> <template #header> 区域级联选择器 </template>
<el-row :gutter="20"> <el-row :gutter="20">
<el-col :xl="12" :lg="12" :md="24" :sm="24" :xs="24"> <el-col :xl="12" :lg="12" :md="24" :sm="24" :xs="24">

View File

@ -17,7 +17,7 @@ const throttleClick = throttle(handle);
<template> <template>
<div> <div>
<el-card class="mb-5"> <el-card class="mb-5" shadow="never">
<template #header> <template #header>
<div>防抖debounce</div> <div>防抖debounce</div>
</template> </template>
@ -32,7 +32,7 @@ const throttleClick = throttle(handle);
连续点击我只会执行最后一次点击事件延后执行 连续点击我只会执行最后一次点击事件延后执行
</el-button> </el-button>
</el-card> </el-card>
<el-card> <el-card shadow="never">
<template #header> <template #header>
<div>节流throttle</div> <div>节流throttle</div>
</template> </template>

View File

@ -26,7 +26,7 @@ function down() {
</script> </script>
<template> <template>
<el-card> <el-card shadow="never">
<template #header> <template #header>
<span class="font-medium">文件下载功能</span> <span class="font-medium">文件下载功能</span>
</template> </template>

View File

@ -69,7 +69,7 @@ const exportExcel = () => {
</script> </script>
<template> <template>
<el-card> <el-card shadow="never">
<template #header> <template #header>
<div class="font-medium"> <div class="font-medium">
导出Execl 导出Execl

View File

@ -10,7 +10,7 @@ const icon = ref("ep:add-location");
</script> </script>
<template> <template>
<el-card> <el-card shadow="never">
<template #header> <template #header>
<div class="card-header"> <div class="card-header">
<span class="font-medium">图标选择器</span> <span class="font-medium">图标选择器</span>

View File

@ -32,7 +32,7 @@ const load = () => {
</script> </script>
<template> <template>
<el-card> <el-card shadow="never">
<template #header> <template #header>
<div class="font-medium"> <div class="font-medium">
表格无限滚动 表格无限滚动

View File

@ -22,7 +22,7 @@ const dataProps = {
</script> </script>
<template> <template>
<el-card> <el-card shadow="never">
<template #header> <template #header>
<div class="card-header"> <div class="card-header">
<span class="font-medium"> <span class="font-medium">
@ -33,7 +33,7 @@ const dataProps = {
<el-row :gutter="24"> <el-row :gutter="24">
<el-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12" class="mb-[20px]"> <el-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12" class="mb-[20px]">
<el-card> <el-card shadow="never">
<template #header> <template #header>
<div class="card-header"> <div class="card-header">
<span class="font-medium"> 普通树结构 </span> <span class="font-medium"> 普通树结构 </span>
@ -62,7 +62,7 @@ const dataProps = {
</el-col> </el-col>
<el-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12"> <el-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12">
<el-card> <el-card shadow="never">
<template #header> <template #header>
<div class="card-header"> <div class="card-header">
<span class="font-medium"> 虚拟树结构 </span> <span class="font-medium"> 虚拟树结构 </span>

View File

@ -43,7 +43,7 @@ const filterMethod = (query: string, node: treeNode) => {
</script> </script>
<template> <template>
<el-card> <el-card shadow="never">
<template #header> <template #header>
<div class="card-header"> <div class="card-header">
<span class="font-medium"> <span class="font-medium">

View File

@ -34,7 +34,7 @@ const onPrint = () => {
</script> </script>
<template> <template>
<el-card> <el-card shadow="never">
<template #header> <template #header>
<div class="font-medium"> <div class="font-medium">
PDF预览 PDF预览

View File

@ -77,7 +77,7 @@ const tableData: User[] = [
</script> </script>
<template> <template>
<el-card> <el-card shadow="never">
<template #header> <template #header>
<div class="card-header"> <div class="card-header">
<span class="font-medium">打印功能报表图表图片</span> <span class="font-medium">打印功能报表图表图片</span>

View File

@ -23,7 +23,7 @@ const disabledClick = () => {
<template> <template>
<div> <div>
<el-card> <el-card shadow="never">
<template #header> <template #header>
<div class="font-medium"> <div class="font-medium">
二维码基于 二维码基于

View File

@ -84,7 +84,7 @@ const swiperExample: any[] = [
</script> </script>
<template> <template>
<el-card> <el-card shadow="never">
<template #header> <template #header>
<div class="font-medium"> <div class="font-medium">
Swiper插件 Swiper插件

View File

@ -41,7 +41,7 @@ const activities = [
</script> </script>
<template> <template>
<el-card> <el-card shadow="never">
<template #header> <template #header>
<div class="card-header"> <div class="card-header">
<span class="font-medium">时间线</span> <span class="font-medium">时间线</span>

View File

@ -9,7 +9,7 @@ defineOptions({
</script> </script>
<template> <template>
<el-card> <el-card shadow="never">
<template #header> <template #header>
<div class="font-medium"> <div class="font-medium">
虚拟列表组件 虚拟列表组件

View File

@ -32,7 +32,7 @@ onBeforeUnmount(() => {
</script> </script>
<template> <template>
<el-card> <el-card shadow="never">
<template #header> <template #header>
<div class="card-header"> <div class="card-header">
<span class="font-medium"> <span class="font-medium">

View File

@ -40,7 +40,7 @@ Object.keys(devDependencies).forEach(key => {
</span> </span>
</el-card> </el-card>
<el-card class="box-card m-4" shadow="hover"> <el-card class="box-card m-4" shadow="never">
<template #header> <template #header>
<div class="card-header"> <div class="card-header">
<span class="font-medium">项目信息</span> <span class="font-medium">项目信息</span>
@ -49,7 +49,7 @@ Object.keys(devDependencies).forEach(key => {
<PureDescriptions :columns="columns" border :column="3" align="left" /> <PureDescriptions :columns="columns" border :column="3" align="left" />
</el-card> </el-card>
<el-card class="box-card m-4" shadow="hover"> <el-card class="box-card m-4" shadow="never">
<template #header> <template #header>
<div class="card-header"> <div class="card-header">
<span class="font-medium">生产环境依赖</span> <span class="font-medium">生产环境依赖</span>
@ -73,7 +73,7 @@ Object.keys(devDependencies).forEach(key => {
</el-descriptions> </el-descriptions>
</el-card> </el-card>
<el-card class="box-card m-4" shadow="hover"> <el-card class="box-card m-4" shadow="never">
<template #header> <template #header>
<div class="card-header"> <div class="card-header">
<span class="font-medium">开发环境依赖</span> <span class="font-medium">开发环境依赖</span>

View File

@ -11,7 +11,7 @@ const url = ref(`${VITE_PUBLIC_PATH}html/button.html`);
</script> </script>
<template> <template>
<el-card> <el-card shadow="never">
<template #header> <template #header>
<div class="card-header"> <div class="card-header">
<span class="font-medium">通过iframe引入按钮页面</span> <span class="font-medium">通过iframe引入按钮页面</span>

View File

@ -10,7 +10,7 @@ defineOptions({
</script> </script>
<template> <template>
<el-card> <el-card shadow="never">
<template #header> <template #header>
<div class="card-header"> <div class="card-header">
<span class="font-medium">右键菜单组件</span> <span class="font-medium">右键菜单组件</span>

View File

@ -7,7 +7,7 @@ defineOptions({
</script> </script>
<template> <template>
<el-card> <el-card shadow="never">
<template #header> <template #header>
<div class="card-header"> <div class="card-header">
<span class="font-medium">数字动画组件</span> <span class="font-medium">数字动画组件</span>

View File

@ -26,7 +26,7 @@ const onCropper = (): void => {
</script> </script>
<template> <template>
<el-card> <el-card shadow="never">
<template #header> <template #header>
<div class="card-header"> <div class="card-header">
<span class="font-medium">图片裁剪组件</span> <span class="font-medium">图片裁剪组件</span>

View File

@ -102,7 +102,7 @@ function addDanmu() {
} }
</script> </script>
<template> <template>
<el-card> <el-card shadow="never">
<template #header> <template #header>
<div class="card-header"> <div class="card-header">
<span class="font-medium"> <span class="font-medium">

View File

@ -56,7 +56,7 @@ onMounted(() => {
</script> </script>
<template> <template>
<el-card> <el-card shadow="never">
<template #header> <template #header>
<div class="card-header"> <div class="card-header">
<span class="font-medium"> <span class="font-medium">
@ -76,7 +76,7 @@ onMounted(() => {
<!-- grid列表拖拽 --> <!-- grid列表拖拽 -->
<el-row :gutter="25"> <el-row :gutter="25">
<el-col :xs="25" :sm="8" :md="8" :lg="8"> <el-col :xs="25" :sm="8" :md="8" :lg="8">
<el-card> <el-card shadow="never">
<template #header> <template #header>
<div class="card-header"> <div class="card-header">
<span>grid列表拖拽</span> <span>grid列表拖拽</span>
@ -100,7 +100,7 @@ onMounted(() => {
</el-col> </el-col>
<el-col :xs="25" :sm="8" :md="8" :lg="8"> <el-col :xs="25" :sm="8" :md="8" :lg="8">
<el-card> <el-card shadow="never">
<template #header> <template #header>
<div class="card-header"> <div class="card-header">
<span>单列拖拽</span> <span>单列拖拽</span>
@ -123,7 +123,7 @@ onMounted(() => {
</el-col> </el-col>
<el-col :xs="25" :sm="8" :md="8" :lg="8"> <el-col :xs="25" :sm="8" :md="8" :lg="8">
<el-card> <el-card shadow="never">
<template #header> <template #header>
<div class="card-header"> <div class="card-header">
<span>拖拽实现元素位置交换</span> <span>拖拽实现元素位置交换</span>

View File

@ -72,7 +72,7 @@ watch(
</script> </script>
<template> <template>
<el-card> <el-card shadow="never">
<template #header> <template #header>
<div class="card-header"> <div class="card-header">
<span class="font-medium"> <span class="font-medium">

View File

@ -11,7 +11,7 @@ defineOptions({
</script> </script>
<template> <template>
<el-card> <el-card shadow="never">
<template #header> <template #header>
<div class="card-header"> <div class="card-header">
<span class="font-medium"> Message提示 </span> <span class="font-medium"> Message提示 </span>

View File

@ -50,7 +50,7 @@ function changeDirection(val) {
<template> <template>
<el-space wrap> <el-space wrap>
<el-card class="box-card"> <el-card class="box-card" shadow="never">
<template #header> <template #header>
<div class="card-header"> <div class="card-header">
<span>无缝滚动示例</span> <span>无缝滚动示例</span>

View File

@ -27,7 +27,12 @@ const selectedVal = ({ left, right }): void => {
<template> <template>
<div> <div>
<el-card class="box-card" v-for="(item, key) in dataLists" :key="key"> <el-card
class="box-card"
v-for="(item, key) in dataLists"
:key="key"
shadow="never"
>
<template #header> <template #header>
<div class="card-header"> <div class="card-header">
<span>{{ item.title }}</span> <span>{{ item.title }}</span>

View File

@ -20,7 +20,7 @@ const settingTB: ContextProps = reactive({
</script> </script>
<template> <template>
<el-card> <el-card shadow="never">
<template #header> <template #header>
<div class="card-header"> <div class="card-header">
<span class="font-medium">切割面板组件</span> <span class="font-medium">切割面板组件</span>

View File

@ -7,7 +7,7 @@ defineOptions({
</script> </script>
<template> <template>
<el-card> <el-card shadow="never">
<template #header> <template #header>
<div class="card-header"> <div class="card-header">
<span class="font-medium"> 打字机组件 </span> <span class="font-medium"> 打字机组件 </span>

View File

@ -31,7 +31,7 @@ onMounted(() => {
</script> </script>
<template> <template>
<el-card> <el-card shadow="never">
<template #header> <template #header>
<div class="card-header"> <div class="card-header">
<span class="font-medium"> <span class="font-medium">

View File

@ -39,7 +39,7 @@ const handleCreated = editor => {
</script> </script>
<template> <template>
<el-card> <el-card shadow="never">
<template #header> <template #header>
<div class="card-header"> <div class="card-header">
<span class="font-medium"> <span class="font-medium">

View File

@ -65,7 +65,7 @@ onMounted(() => {
</script> </script>
<template> <template>
<el-card> <el-card shadow="never">
<template #header> <template #header>
<div class="card-header"> <div class="card-header">
<span class="font-medium"> <span class="font-medium">

View File

@ -41,7 +41,7 @@ const guide = () => {
</script> </script>
<template> <template>
<el-card> <el-card shadow="never">
<template #header> <template #header>
<div class="card-header"> <div class="card-header">
<span class="font-medium"> <span class="font-medium">

View File

@ -14,7 +14,7 @@ function tabClick({ index }) {
</script> </script>
<template> <template>
<el-card> <el-card shadow="never">
<template #header> <template #header>
<div class="card-header"> <div class="card-header">
<span class="font-medium"> <span class="font-medium">

View File

@ -14,7 +14,7 @@ function tabClick({ index }) {
</script> </script>
<template> <template>
<el-card> <el-card shadow="never">
<template #header> <template #header>
<div class="card-header"> <div class="card-header">
<span class="font-medium"> <span class="font-medium">

View File

@ -8,7 +8,7 @@ const { columns } = useColumns();
</script> </script>
<template> <template>
<el-card> <el-card shadow="never">
<template #header> <template #header>
<div class="card-header"> <div class="card-header">
<span class="font-medium">失败页</span> <span class="font-medium">失败页</span>

View File

@ -22,7 +22,7 @@ const columns = [
</script> </script>
<template> <template>
<el-card> <el-card shadow="never">
<template #header> <template #header>
<div class="card-header"> <div class="card-header">
<span class="font-medium">成功页</span> <span class="font-medium">成功页</span>

View File

@ -46,7 +46,7 @@ function onCloseTags() {
</script> </script>
<template> <template>
<el-card> <el-card shadow="never">
<template #header> <template #header>
<div>标签页复用超出限制自动关闭</div> <div>标签页复用超出限制自动关闭</div>
</template> </template>

View File

@ -7,6 +7,7 @@ import {
useECharts, useECharts,
type EchartOptions type EchartOptions
} from "@pureadmin/utils"; } from "@pureadmin/utils";
import * as echarts from "echarts/core";
const { isDark } = useDark(); const { isDark } = useDark();
@ -28,11 +29,13 @@ setOptions(
} }
}, },
grid: { grid: {
containLabel: true, bottom: "20px",
top: "10px", right: "10px"
bottom: "0", },
left: "0", legend: {
right: "0" //@ts-expect-error
right: true,
data: ["watchers", "fork", "star"]
}, },
xAxis: [ xAxis: [
{ {
@ -45,7 +48,7 @@ setOptions(
// width: "70", // width: "70",
// overflow: "truncate" // overflow: "truncate"
}, },
data: ["open_issues", "forks", "watchers", "star"], data: ["2021", "2022", "2023"],
triggerEvent: true triggerEvent: true
} }
], ],
@ -57,9 +60,58 @@ setOptions(
], ],
series: [ series: [
{ {
name: "GitHub信息", name: "watchers",
type: "bar", type: "bar",
data: [1000, 10000, 20000, 66666] barWidth: "15%",
itemStyle: {
color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
{
offset: 0,
color: "#e6a23c"
},
{
offset: 1,
color: "#eebe77"
}
])
},
data: [200, 320, 800]
},
{
name: "fork",
type: "bar",
barWidth: "15%",
itemStyle: {
color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
{
offset: 0,
color: "#f56c6c"
},
{
offset: 1,
color: "#f89898"
}
])
},
data: [1600, 2460, 4500]
},
{
name: "star",
type: "bar",
barWidth: "15%",
itemStyle: {
color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
{
offset: 0,
color: "#409EFF"
},
{
offset: 1,
color: "#53a7ff"
}
])
},
data: [1450, 3620, 7500]
} }
], ],
addTooltip: true addTooltip: true

View File

@ -24,7 +24,6 @@ const list = [
:key="index" :key="index"
:columns="item.columns" :columns="item.columns"
:column="item.column" :column="item.column"
class="margin-top"
direction="vertical" direction="vertical"
border border
/> />

View File

@ -1,4 +1,5 @@
<script setup lang="ts"> <script setup lang="ts">
import { useIntervalFn } from "@vueuse/core";
import { ref, computed, watch, type Ref } from "vue"; import { ref, computed, watch, type Ref } from "vue";
import { useAppStoreHook } from "@/store/modules/app"; import { useAppStoreHook } from "@/store/modules/app";
import { import {
@ -11,43 +12,129 @@ import {
const { isDark } = useDark(); const { isDark } = useDark();
const theme: EchartOptions["theme"] = computed(() => { const theme: EchartOptions["theme"] = computed(() => {
return isDark.value ? "dark" : "light"; return isDark.value ? "dark" : "default";
}); });
const lineChartRef = ref<HTMLDivElement | null>(null); const lineChartRef = ref<HTMLDivElement | null>(null);
const { setOptions, resize } = useECharts(lineChartRef as Ref<HTMLDivElement>, { const { setOptions, getInstance, resize } = useECharts(
theme lineChartRef as Ref<HTMLDivElement>,
}); { theme }
);
const xData = (() => {
const data: any[] = [];
for (let i = 1; i < 31; i++) {
data.push(`${i}`);
}
return data;
})();
setOptions( setOptions(
{ {
tooltip: { tooltip: {
trigger: "item" trigger: "axis",
axisPointer: {
type: "shadow"
}
}, },
grid: { grid: {
containLabel: true, bottom: "20px",
top: "10px", right: "10px"
bottom: "0",
left: "0",
right: "0"
}, },
xAxis: { legend: {
type: "category", //@ts-expect-error
axisLabel: { right: true,
interval: 0 data: ["fork", "star"]
},
data: ["open_issues", "forks", "watchers", "star"],
triggerEvent: true
},
yAxis: {
type: "value",
triggerEvent: true
}, },
calculable: true,
xAxis: [
{
triggerEvent: true,
type: "category",
splitLine: {
show: false
},
axisTick: {
show: false
},
data: xData
}
],
yAxis: [
{
triggerEvent: true,
type: "value",
splitLine: {
show: false
},
axisLine: {
show: true
}
}
],
dataZoom: [
{
type: "slider",
show: false,
realtime: true,
startValue: 0,
endValue: 24
}
],
series: [ series: [
{ {
data: [1000, 10000, 20000, 66666], name: "fork",
type: "line", type: "line",
areaStyle: {} symbolSize: 10,
symbol: "circle",
color: "#f56c6c",
markPoint: {
label: {
color: "#fff"
},
data: [
{
type: "max",
name: "最大值"
},
{
type: "min",
name: "最小值"
}
]
},
data: [
509, 917, 2455, 2610, 2719, 3033, 3044, 3085, 2708, 2809, 2117, 2000,
1455, 1210, 719, 733, 944, 2285, 2208, 3372, 3936, 3693, 2962, 2810,
3519, 2455, 2610, 2719, 2484, 2078
]
},
{
name: "star",
type: "line",
symbolSize: 10,
symbol: "circle",
color: "#53a7ff",
markPoint: {
label: {
color: "#fff"
},
data: [
{
type: "max",
name: "最大值"
},
{
type: "min",
name: "最小值"
}
]
},
data: [
2136, 3693, 2962, 3810, 3519, 3484, 3915, 3823, 3455, 4310, 4019,
3433, 3544, 3885, 4208, 3372, 3484, 3915, 3748, 3675, 4009, 4433,
3544, 3285, 4208, 3372, 3484, 3915, 3823, 4265, 4298
]
} }
], ],
addTooltip: true addTooltip: true
@ -57,9 +144,36 @@ setOptions(
callback: params => { callback: params => {
console.log("click", params); console.log("click", params);
} }
},
{
name: "contextmenu",
callback: params => {
console.log("contextmenu", params);
}
},
//
{
type: "zrender",
name: "click",
callback: params => {
console.log("点击空白处", params);
}
} }
); );
let a = 1;
useIntervalFn(() => {
if (a == xData.length - 24) {
a = 0;
}
getInstance()!.dispatchAction({
type: "dataZoom",
startValue: a,
endValue: a + 24
});
a++;
}, 2000);
watch( watch(
() => useAppStoreHook().getSidebarStatus, () => useAppStoreHook().getSidebarStatus,
() => { () => {

View File

@ -25,8 +25,8 @@ setOptions(
trigger: "item" trigger: "item"
}, },
legend: { legend: {
orient: "vertical", icon: "circle",
// @ts-expect-error //@ts-expect-error
right: true right: true
}, },
series: [ series: [
@ -36,19 +36,19 @@ setOptions(
top: "20%", top: "20%",
radius: "80%", radius: "80%",
center: ["40%", "50%"], center: ["40%", "50%"],
color: ["#e6a23c", "#f56c6c", "#53a7ff"],
data: [ data: [
{ value: 20000, name: "watchers" }, { value: 400, name: "watchers" },
{ value: 66666, name: "star" }, { value: 1600, name: "forks" },
{ value: 10000, name: "forks" }, { value: 7200, name: "star" }
{ value: 1000, name: "open_issues" } ]
], // emphasis: {
emphasis: { // itemStyle: {
itemStyle: { // shadowBlur: 10,
shadowBlur: 10, // shadowOffsetX: 0,
shadowOffsetX: 0, // shadowColor: "rgba(0, 0, 0, 0.5)"
shadowColor: "rgba(0, 0, 0, 0.5)" // }
} // }
}
} }
] ]
}, },

View File

@ -25,7 +25,7 @@ export function useColumns() {
</div> </div>
), ),
value: "xiaoxian" value: "乐于分享的程序员小铭"
}, },
{ {
labelRenderer: () => ( labelRenderer: () => (
@ -47,7 +47,7 @@ export function useColumns() {
</div> </div>
), ),
value: "杭州" value: "中国"
} }
]; ];
@ -80,7 +80,7 @@ export function useColumns() {
</div> </div>
), ),
value: "杭州市西湖区" value: "中华人民共和国"
} }
]; ];
@ -91,15 +91,15 @@ export function useColumns() {
<el-icon> <el-icon>
<iconify-icon-offline icon={Notebook} /> <iconify-icon-offline icon={Notebook} />
</el-icon> </el-icon>
</div> </div>
), ),
cellRenderer: () => ( cellRenderer: () => (
<TypeIt <TypeIt
className={"github"} className={"github"}
values={["Coding as art. Keep open source. Enjoy open source."]} values={["办法总比困难多"]}
cursor={false} cursor={false}
speed={40} speed={100}
/> />
) )
} }

View File

@ -2,41 +2,20 @@
import dayjs from "dayjs"; import dayjs from "dayjs";
import axios from "axios"; import axios from "axios";
import MdEditor from "md-editor-v3"; import MdEditor from "md-editor-v3";
import VueDanmaku from "vue3-danmaku";
import Bar from "./components/Bar.vue"; import Bar from "./components/Bar.vue";
import Pie from "./components/Pie.vue"; import Pie from "./components/Pie.vue";
import Line from "./components/Line.vue"; import Line from "./components/Line.vue";
import TypeIt from "@/components/ReTypeit"; import TypeIt from "@/components/ReTypeit";
import { ref, computed, markRaw } from "vue";
import Github from "./components/Github.vue"; import Github from "./components/Github.vue";
import { openLink, randomColor } from "@pureadmin/utils"; import { randomColor } from "@pureadmin/utils";
import { useRenderFlicker } from "@/components/ReFlicker"; import { useRenderFlicker } from "@/components/ReFlicker";
import { ref, computed, markRaw, onMounted, onUnmounted } from "vue";
defineOptions({ defineOptions({
name: "Welcome" name: "Welcome"
}); });
const danmus = [
"太好用了吧",
"so easy",
"效率大大提高呀",
"还有精简版还分国际化和非国际化Perfect 😘",
"好多组件呀,爱啦爱啦 ❤️",
"精简版开发体验也太赞了吧 🙀",
"pure-admin-table 真方便呀",
"哇塞pure-admin-utils 好多常用、易用的工具呀",
"我要 star 这个项目,爱啦爱啦",
"免费、开源做到这个程度,真不错 👍",
"文档简单易懂,上手真快",
"呀!还有免费的教学视频呢,我要去学习一下咯",
"稳定、可靠,未来可期呀,加油!",
"太卷了,太卷了,慢点让我跟上 😄"
];
let timer = 0;
const list = ref(); const list = ref();
const danmaku = ref();
const date: Date = new Date();
const loading = ref<boolean>(true); const loading = ref<boolean>(true);
const titleClass = computed(() => { const titleClass = computed(() => {
return ["text-base", "font-medium"]; return ["text-base", "font-medium"];
@ -46,23 +25,6 @@ setTimeout(() => {
loading.value = !loading.value; loading.value = !loading.value;
}, 800); }, 800);
const greetings = computed(() => {
if (date.getHours() >= 0 && date.getHours() < 12) {
return "上午阳光明媚,祝你薪水翻倍🌞!";
} else if (date.getHours() >= 12 && date.getHours() < 18) {
return "下午小风娇好,愿你青春不老😃!";
} else {
return "折一根天使羽毛,愿拂去您的疲惫烦恼忧伤🌛!";
}
});
function resizeHandler() {
if (timer) clearTimeout(timer);
timer = window.setTimeout(() => {
danmaku.value.resize();
}, 500);
}
axios axios
.get("https://api.github.com/repos/pure-admin/vue-pure-admin/releases") .get("https://api.github.com/repos/pure-admin/vue-pure-admin/releases")
.then(res => { .then(res => {
@ -78,42 +40,18 @@ axios
}; };
}); });
}); });
onMounted(() => {
window.onresize = () => resizeHandler();
});
onUnmounted(() => {
window.onresize = null;
});
</script> </script>
<template> <template>
<div class="welcome"> <div>
<el-card class="top-content dark:border-none"> <el-row :gutter="24">
<div class="left-mark select-none">
<img
src="https://avatars.githubusercontent.com/u/44761321?v=4"
title="直达仓库地址"
@click="openLink('https://github.com/pure-admin/vue-pure-admin')"
/>
<TypeIt
:className="'type-it0'"
:values="[greetings]"
:cursor="false"
:speed="60"
/>
</div>
</el-card>
<el-row :gutter="24" style="margin: 20px">
<el-col <el-col
:xs="24" :xs="24"
:sm="24" :sm="24"
:md="12" :md="12"
:lg="12" :lg="12"
:xl="12" :xl="12"
style="margin-bottom: 20px" class="mb-[18px]"
v-motion v-motion
:initial="{ :initial="{
opacity: 0, opacity: 0,
@ -127,66 +65,7 @@ onUnmounted(() => {
} }
}" }"
> >
<el-card style="height: 410px"> <el-card shadow="never" style="height: 347px">
<template #header>
<a
:class="titleClass"
href="https://github.com/xiaoxian521"
target="_black"
>
<TypeIt
:className="'type-it1'"
:values="['GitHub信息']"
:cursor="false"
:speed="120"
/>
</a>
</template>
<el-skeleton animated :rows="7" :loading="loading">
<template #default>
<Github />
<vue-danmaku
ref="danmaku"
loop
useSlot
isSuspend
randomChannel
:debounce="1200"
:danmus="danmus"
style="width: 100%; height: 80px"
>
<template v-slot:dm="{ danmu }">
<p :style="{ color: randomColor({ type: 'hex' }) as string }">
{{ danmu }}
</p>
</template>
</vue-danmaku>
</template>
</el-skeleton>
</el-card>
</el-col>
<el-col
:xs="24"
:sm="24"
:md="12"
:lg="12"
:xl="12"
style="margin-bottom: 20px"
v-motion
:initial="{
opacity: 0,
y: 100
}"
:enter="{
opacity: 1,
y: 0,
transition: {
delay: 200
}
}"
>
<el-card style="height: 410px">
<template #header> <template #header>
<a <a
:class="titleClass" :class="titleClass"
@ -225,9 +104,9 @@ onUnmounted(() => {
:xs="24" :xs="24"
:sm="24" :sm="24"
:md="12" :md="12"
:lg="8" :lg="12"
:xl="8" :xl="12"
style="margin-bottom: 20px" class="mb-[18px]"
v-motion v-motion
:initial="{ :initial="{
opacity: 0, opacity: 0,
@ -237,20 +116,20 @@ onUnmounted(() => {
opacity: 1, opacity: 1,
y: 0, y: 0,
transition: { transition: {
delay: 400 delay: 200
} }
}" }"
> >
<el-card> <el-card shadow="never" style="height: 347px">
<template #header> <template #header>
<a <a
:class="titleClass" :class="titleClass"
href="https://github.com/pure-admin/vue-pure-admin" href="https://github.com/xiaoxian521"
target="_black" target="_black"
> >
<TypeIt <TypeIt
:className="'type-it3'" :className="'type-it1'"
:values="['GitHub饼图信息']" :values="['GitHub信息']"
:cursor="false" :cursor="false"
:speed="120" :speed="120"
/> />
@ -258,7 +137,7 @@ onUnmounted(() => {
</template> </template>
<el-skeleton animated :rows="7" :loading="loading"> <el-skeleton animated :rows="7" :loading="loading">
<template #default> <template #default>
<Pie /> <Github />
</template> </template>
</el-skeleton> </el-skeleton>
</el-card> </el-card>
@ -270,7 +149,7 @@ onUnmounted(() => {
:md="12" :md="12"
:lg="8" :lg="8"
:xl="8" :xl="8"
style="margin-bottom: 20px" class="mb-[18px]"
v-motion v-motion
:initial="{ :initial="{
opacity: 0, opacity: 0,
@ -284,7 +163,7 @@ onUnmounted(() => {
} }
}" }"
> >
<el-card> <el-card shadow="never">
<template #header> <template #header>
<a <a
:class="titleClass" :class="titleClass"
@ -310,10 +189,10 @@ onUnmounted(() => {
<el-col <el-col
:xs="24" :xs="24"
:sm="24" :sm="24"
:md="24" :md="12"
:lg="8" :lg="8"
:xl="8" :xl="8"
style="margin-bottom: 20px" class="mb-[18px]"
v-motion v-motion
:initial="{ :initial="{
opacity: 0, opacity: 0,
@ -327,7 +206,50 @@ onUnmounted(() => {
} }
}" }"
> >
<el-card> <el-card shadow="never">
<template #header>
<a
:class="titleClass"
href="https://github.com/pure-admin/vue-pure-admin"
target="_black"
>
<TypeIt
:className="'type-it3'"
:values="['GitHub饼图信息']"
:cursor="false"
:speed="120"
/>
</a>
</template>
<el-skeleton animated :rows="7" :loading="loading">
<template #default>
<Pie />
</template>
</el-skeleton>
</el-card>
</el-col>
<el-col
:xs="24"
:sm="24"
:md="24"
:lg="8"
:xl="8"
class="mb-[18px]"
v-motion
:initial="{
opacity: 0,
y: 100
}"
:enter="{
opacity: 1,
y: 0,
transition: {
delay: 400
}
}"
>
<el-card shadow="never">
<template #header> <template #header>
<a <a
:class="titleClass" :class="titleClass"
@ -359,36 +281,6 @@ onUnmounted(() => {
} }
.main-content { .main-content {
margin: 0 !important; margin: 20px 20px 0 20px !important;
}
.welcome {
height: 100%;
.top-content {
display: flex;
justify-content: space-between;
align-items: center;
height: 60px;
background: var(--el-bg-color);
.left-mark {
display: flex;
align-items: center;
img {
display: block;
width: 50px;
height: 50px;
border-radius: 50%;
margin-right: 10px;
cursor: pointer;
}
span {
font-size: 14px;
}
}
}
} }
</style> </style>

7
types/global.d.ts vendored
View File

@ -192,11 +192,8 @@ declare global {
title: string; title: string;
/** 菜单图标 `可选` */ /** 菜单图标 `可选` */
icon?: string | FunctionalComponent | IconifyIcon; icon?: string | FunctionalComponent | IconifyIcon;
/** 菜单名称右侧的额外图标,支持`fontawesome`、`iconfont`、`element-plus-icon` `可选` */ /** 菜单名称右侧的额外图标 */
extraIcon?: { extraIcon?: string | FunctionalComponent | IconifyIcon;
svg?: boolean;
name?: string;
};
/** 是否在菜单中显示(默认`true``可选` */ /** 是否在菜单中显示(默认`true``可选` */
showLink?: boolean; showLink?: boolean;
/** 是否显示父级菜单 `可选` */ /** 是否显示父级菜单 `可选` */