mirror of
https://github.com/pure-admin/vue-pure-admin.git
synced 2025-11-03 13:44:47 +08:00
perf: 优化演示页面
This commit is contained in:
@@ -25,10 +25,10 @@ watch(icon, () => {
|
||||
>
|
||||
animate.css
|
||||
</el-link>
|
||||
选择器组件
|
||||
选择器
|
||||
</span>
|
||||
</div>
|
||||
</template>
|
||||
<ReAnimateSelector v-model="icon" />
|
||||
<ReAnimateSelector v-model="icon" class="!w-[200px]" />
|
||||
</el-card>
|
||||
</template>
|
||||
@@ -14,7 +14,7 @@ const url = ref(`${VITE_PUBLIC_PATH}html/button.html`);
|
||||
<el-card shadow="never">
|
||||
<template #header>
|
||||
<div class="card-header">
|
||||
<span class="font-medium">通过iframe引入按钮页面</span>
|
||||
<span class="font-medium">通过 iframe 引入按钮页面</span>
|
||||
</div>
|
||||
</template>
|
||||
<iframe :src="url" frameborder="0" class="iframe w-full h-[60vh]" />
|
||||
@@ -26,10 +26,10 @@ const handleChange = value => {
|
||||
<template>
|
||||
<el-card shadow="never">
|
||||
<template #header> <p class="font-medium">区域级联选择器</p> </template>
|
||||
<el-row :gutter="20">
|
||||
<el-row :gutter="24">
|
||||
<el-col :xl="12" :lg="12" :md="24" :sm="24" :xs="24">
|
||||
<div class="flex flex-col items-center justify-center">
|
||||
<span class="imp">
|
||||
<span class="text-[var(--el-color-primary)]">
|
||||
1. 二级联动(不带“全部”选项)
|
||||
<el-cascader
|
||||
v-model="selectedOptions1"
|
||||
@@ -58,7 +58,7 @@ const handleChange = value => {
|
||||
</el-col>
|
||||
<el-col :xl="12" :lg="12" :md="24" :sm="24" :xs="24">
|
||||
<div class="flex flex-col items-center justify-center mt-3">
|
||||
<span class="imp">
|
||||
<span class="text-[var(--el-color-primary)]">
|
||||
2. 二级联动(带有“全部”选项)
|
||||
<el-cascader
|
||||
v-model="selectedOptions3"
|
||||
@@ -87,7 +87,7 @@ const handleChange = value => {
|
||||
</el-col>
|
||||
<el-col :xl="12" :lg="12" :md="24" :sm="24" :xs="24">
|
||||
<div class="flex flex-col items-center justify-center mt-3">
|
||||
<span class="imp">
|
||||
<span class="text-[var(--el-color-primary)]">
|
||||
3. 三级联动(不带“全部”选项)
|
||||
<el-cascader
|
||||
v-model="selectedOptions2"
|
||||
@@ -118,7 +118,7 @@ const handleChange = value => {
|
||||
</el-col>
|
||||
<el-col :xl="12" :lg="12" :md="24" :sm="24" :xs="24">
|
||||
<div class="flex flex-col items-center justify-center mt-3">
|
||||
<span class="imp">
|
||||
<span class="text-[var(--el-color-primary)]">
|
||||
4. 三级联动(带"全部选项")
|
||||
<el-cascader
|
||||
v-model="selectedOptions4"
|
||||
@@ -150,9 +150,3 @@ const handleChange = value => {
|
||||
</el-row>
|
||||
</el-card>
|
||||
</template>
|
||||
|
||||
<style scoped lang="scss">
|
||||
.imp {
|
||||
color: var(--el-color-primary);
|
||||
}
|
||||
</style>
|
||||
@@ -1,6 +1,6 @@
|
||||
<template>
|
||||
<div>
|
||||
<p class="mb-2">基本使用</p>
|
||||
<p class="mb-2">基础用法</p>
|
||||
<div v-contextmenu:contextmenu class="wrapper">
|
||||
<code>右键点击此区域</code>
|
||||
</div>
|
||||
|
||||
@@ -13,12 +13,12 @@ defineOptions({
|
||||
<el-card shadow="never">
|
||||
<template #header>
|
||||
<div class="card-header">
|
||||
<span class="font-medium">右键菜单组件</span>
|
||||
<span class="font-medium">右键菜单</span>
|
||||
</div>
|
||||
</template>
|
||||
<el-row :gutter="24">
|
||||
<el-col :xs="24" :sm="10" :md="10" :lg="8" :xl="10">
|
||||
<!-- 基本使用 -->
|
||||
<!-- 基础用法 -->
|
||||
<basic />
|
||||
</el-col>
|
||||
<el-col :xs="24" :sm="10" :md="10" :lg="8" :xl="10">
|
||||
|
||||
35
src/views/components/count-to.vue
Normal file
35
src/views/components/count-to.vue
Normal file
@@ -0,0 +1,35 @@
|
||||
<script setup lang="ts">
|
||||
import { ReNormalCountTo, ReboundCountTo } from "@/components/ReCountTo";
|
||||
|
||||
defineOptions({
|
||||
name: "CountTo"
|
||||
});
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<el-card shadow="never">
|
||||
<template #header>
|
||||
<div class="card-header">
|
||||
<span class="font-medium">数字动画</span>
|
||||
</div>
|
||||
</template>
|
||||
<ReNormalCountTo
|
||||
prefix="$"
|
||||
:duration="1000"
|
||||
:color="'#409EFF'"
|
||||
:fontSize="'2em'"
|
||||
:startVal="1"
|
||||
:endVal="1000"
|
||||
/>
|
||||
<br />
|
||||
<ul class="flex">
|
||||
<ReboundCountTo
|
||||
v-for="(num, inx) of [1, 6, 6, 6]"
|
||||
:key="inx"
|
||||
:i="num"
|
||||
:blur="inx"
|
||||
:delay="inx + 1"
|
||||
/>
|
||||
</ul>
|
||||
</el-card>
|
||||
</template>
|
||||
@@ -1,36 +0,0 @@
|
||||
<script setup lang="ts">
|
||||
import { ReNormalCountTo, ReboundCountTo } from "@/components/ReCountTo";
|
||||
|
||||
defineOptions({
|
||||
name: "CountTo"
|
||||
});
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<el-card shadow="never">
|
||||
<template #header>
|
||||
<div class="card-header">
|
||||
<span class="font-medium">数字动画组件</span>
|
||||
</div>
|
||||
</template>
|
||||
<div class="flex items-center">
|
||||
<ReNormalCountTo
|
||||
prefix="$"
|
||||
:duration="1000"
|
||||
:color="'#409EFF'"
|
||||
:fontSize="'2em'"
|
||||
:startVal="1"
|
||||
:endVal="1000"
|
||||
/>
|
||||
<ul class="flex ml-8">
|
||||
<ReboundCountTo
|
||||
v-for="(num, inx) of [1, 6, 6, 6]"
|
||||
:key="inx"
|
||||
:i="num"
|
||||
:blur="inx"
|
||||
:delay="inx + 1"
|
||||
/>
|
||||
</ul>
|
||||
</div>
|
||||
</el-card>
|
||||
</template>
|
||||
@@ -1,6 +1,6 @@
|
||||
<script setup lang="tsx">
|
||||
import { ref } from "vue";
|
||||
import avatar from "./avatar.png";
|
||||
import { ref, onBeforeUnmount } from "vue";
|
||||
import ReCropper from "@/components/ReCropper";
|
||||
import { formatBytes } from "@pureadmin/utils";
|
||||
|
||||
@@ -9,6 +9,7 @@ defineOptions({
|
||||
});
|
||||
|
||||
const infos = ref();
|
||||
const popoverRef = ref();
|
||||
const refCropper = ref();
|
||||
const showPopover = ref(false);
|
||||
const cropperImg = ref<string>("");
|
||||
@@ -18,6 +19,10 @@ function onCropper({ base64, blob, info }) {
|
||||
infos.value = info;
|
||||
cropperImg.value = base64;
|
||||
}
|
||||
|
||||
onBeforeUnmount(() => {
|
||||
popoverRef.value.hide();
|
||||
});
|
||||
</script>
|
||||
|
||||
<template>
|
||||
@@ -25,7 +30,7 @@ function onCropper({ base64, blob, info }) {
|
||||
<template #header>
|
||||
<div class="card-header">
|
||||
<span class="font-medium">
|
||||
图片裁剪组件,基于开源的
|
||||
图片裁剪,基于开源的
|
||||
<el-link
|
||||
href="https://fengyuanchen.github.io/cropperjs/"
|
||||
target="_blank"
|
||||
@@ -37,39 +42,41 @@ function onCropper({ base64, blob, info }) {
|
||||
</span>
|
||||
</div>
|
||||
</template>
|
||||
<el-popover
|
||||
:visible="showPopover"
|
||||
placement="right"
|
||||
width="300px"
|
||||
:teleported="false"
|
||||
>
|
||||
<template #reference>
|
||||
<ReCropper
|
||||
ref="refCropper"
|
||||
class="w-[30vw]"
|
||||
:src="avatar"
|
||||
circled
|
||||
@cropper="onCropper"
|
||||
@readied="showPopover = true"
|
||||
/>
|
||||
</template>
|
||||
<div class="flex flex-wrap justify-center items-center text-center">
|
||||
<el-image
|
||||
v-if="cropperImg"
|
||||
:src="cropperImg"
|
||||
:preview-src-list="Array.of(cropperImg)"
|
||||
fit="cover"
|
||||
/>
|
||||
<div v-if="infos" class="mt-1">
|
||||
<p>
|
||||
图像大小:{{ parseInt(infos.width) }} ×
|
||||
{{ parseInt(infos.height) }}像素
|
||||
</p>
|
||||
<p>
|
||||
文件大小:{{ formatBytes(infos.size) }}({{ infos.size }} 字节)
|
||||
</p>
|
||||
<div v-loading="!showPopover" element-loading-background="transparent">
|
||||
<el-popover
|
||||
ref="popoverRef"
|
||||
:visible="showPopover"
|
||||
placement="right"
|
||||
width="300px"
|
||||
>
|
||||
<template #reference>
|
||||
<ReCropper
|
||||
ref="refCropper"
|
||||
class="w-[30vw]"
|
||||
:src="avatar"
|
||||
circled
|
||||
@cropper="onCropper"
|
||||
@readied="showPopover = true"
|
||||
/>
|
||||
</template>
|
||||
<div class="flex flex-wrap justify-center items-center text-center">
|
||||
<el-image
|
||||
v-if="cropperImg"
|
||||
:src="cropperImg"
|
||||
:preview-src-list="Array.of(cropperImg)"
|
||||
fit="cover"
|
||||
/>
|
||||
<div v-if="infos" class="mt-1">
|
||||
<p>
|
||||
图像大小:{{ parseInt(infos.width) }} ×
|
||||
{{ parseInt(infos.height) }}像素
|
||||
</p>
|
||||
<p>
|
||||
文件大小:{{ formatBytes(infos.size) }}({{ infos.size }} 字节)
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</el-popover>
|
||||
</el-popover>
|
||||
</div>
|
||||
</el-card>
|
||||
</template>
|
||||
|
||||
@@ -20,8 +20,8 @@ const router = useRouter();
|
||||
|
||||
function onBaseClick() {
|
||||
addDialog({
|
||||
title: "基本使用",
|
||||
contentRenderer: () => <p>弹框内容-基本使用</p> // jsx 语法 (注意在.vue文件启用jsx语法,需要在script开启lang="tsx")
|
||||
title: "基础用法",
|
||||
contentRenderer: () => <p>弹框内容-基础用法</p> // jsx 语法 (注意在.vue文件启用jsx语法,需要在script开启lang="tsx")
|
||||
});
|
||||
}
|
||||
|
||||
@@ -422,7 +422,7 @@ function onBeforeSureClick() {
|
||||
title: "点击底部确定按钮的回调",
|
||||
contentRenderer: () => (
|
||||
<p>
|
||||
弹框内容-点击底部确定按钮的回调(会暂停弹框的关闭,经常用于新增、编辑弹框内容后调用接口)
|
||||
弹框内容-点击底部确定按钮的回调(会暂停弹框的关闭,经常用于新增、修改弹框内容后调用接口)
|
||||
</p>
|
||||
),
|
||||
beforeSure: (done, { options, index }) => {
|
||||
@@ -454,15 +454,16 @@ function onBeforeSureClick() {
|
||||
,采用函数式调用弹框组件(更多操作实例请参考
|
||||
<span
|
||||
class="cursor-pointer text-primary"
|
||||
@click="router.push({ name: 'Dept' })"
|
||||
>系统管理页面</span
|
||||
@click="router.push({ name: 'SystemDept' })"
|
||||
>
|
||||
系统管理页面
|
||||
</span>
|
||||
)
|
||||
</span>
|
||||
</div>
|
||||
</template>
|
||||
<el-space wrap>
|
||||
<el-button @click="onBaseClick"> 基本使用 </el-button>
|
||||
<el-button @click="onBaseClick"> 基础用法 </el-button>
|
||||
<el-button @click="onDraggableClick"> 可拖拽 </el-button>
|
||||
<el-button @click="onFullscreenClick"> 全屏 </el-button>
|
||||
<el-button @click="onFullscreenIconClick"> 全屏按钮 </el-button>
|
||||
@@ -510,7 +511,7 @@ function onBeforeSureClick() {
|
||||
点击底部取消按钮的回调(会暂停弹框的关闭)
|
||||
</el-button>
|
||||
<el-button @click="onBeforeSureClick">
|
||||
点击底部确定按钮的回调(会暂停弹框的关闭,经常用于新增、编辑弹框内容后调用接口)
|
||||
点击底部确定按钮的回调(会暂停弹框的关闭,经常用于新增、修改弹框内容后调用接口)
|
||||
</el-button>
|
||||
</el-space>
|
||||
</el-card>
|
||||
|
||||
@@ -16,6 +16,6 @@ const icon = ref("ep:add-location");
|
||||
<span class="font-medium">图标选择器</span>
|
||||
</div>
|
||||
</template>
|
||||
<IconSelect v-model="icon" />
|
||||
<IconSelect v-model="icon" class="w-[200px]" />
|
||||
</el-card>
|
||||
</template>
|
||||
@@ -76,7 +76,7 @@ watch(
|
||||
<template #header>
|
||||
<div class="card-header">
|
||||
<span class="font-medium">
|
||||
JSON编辑器组件,采用开源的
|
||||
JSON编辑器,采用开源的
|
||||
<el-link
|
||||
href="https://github.com/leezng/vue-json-pretty"
|
||||
target="_blank"
|
||||
@@ -87,7 +87,7 @@ watch(
|
||||
(支持大数据量)。
|
||||
</span>
|
||||
<span class="font-medium">
|
||||
当然我们还有一款代码编辑器组件推荐(这里就不做演示了),采用开源的
|
||||
当然还有一款代码编辑器推荐(这里就不做演示了),采用开源的
|
||||
<el-link
|
||||
href="https://github.com/surmon-china/vue-codemirror"
|
||||
target="_blank"
|
||||
@@ -14,7 +14,7 @@ defineOptions({
|
||||
<el-card shadow="never">
|
||||
<template #header>
|
||||
<div class="card-header">
|
||||
<span class="font-medium"> Message提示 </span>
|
||||
<span class="font-medium"> 消息提示 </span>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
@@ -53,7 +53,7 @@ function changeDirection(val) {
|
||||
<el-card class="box-card" shadow="never">
|
||||
<template #header>
|
||||
<div class="card-header">
|
||||
<span class="font-medium">无缝滚动示例</span>
|
||||
<span class="font-medium">无缝滚动</span>
|
||||
<el-button
|
||||
class="button"
|
||||
link
|
||||
@@ -30,6 +30,30 @@ const optionsBasis: Array<OptionsType> = [
|
||||
}
|
||||
];
|
||||
|
||||
/** tooltip 提示 */
|
||||
const optionsTooltip: Array<OptionsType> = [
|
||||
{
|
||||
label: "周一",
|
||||
tip: "周一启航,新的篇章"
|
||||
},
|
||||
{
|
||||
label: "周二",
|
||||
tip: "周二律动,携手共进"
|
||||
},
|
||||
{
|
||||
label: "周三",
|
||||
tip: "周三昂扬,激情不减"
|
||||
},
|
||||
{
|
||||
label: "周四",
|
||||
tip: "周四精进,事半功倍"
|
||||
},
|
||||
{
|
||||
label: "周五",
|
||||
tip: "周五喜悦,收尾归档"
|
||||
}
|
||||
];
|
||||
|
||||
/** 禁用 */
|
||||
const optionsDisabled: Array<OptionsType> = [
|
||||
{
|
||||
@@ -51,7 +75,7 @@ const optionsDisabled: Array<OptionsType> = [
|
||||
}
|
||||
];
|
||||
|
||||
/** 设置图标 */
|
||||
/** 可设置图标 */
|
||||
const optionsIcon: Array<OptionsType> = [
|
||||
{
|
||||
label: "周一",
|
||||
@@ -65,8 +89,7 @@ const optionsIcon: Array<OptionsType> = [
|
||||
icon: "terminalWindowLine"
|
||||
},
|
||||
{
|
||||
label: "周四",
|
||||
icon: "streamline-emojis:airplane"
|
||||
label: "周四"
|
||||
},
|
||||
{
|
||||
label: "周五",
|
||||
@@ -99,7 +122,7 @@ const optionsLabel: Array<OptionsType> = [
|
||||
label: () => (
|
||||
<div>
|
||||
{h(useRenderIcon(HomeFilled), {
|
||||
class: "m-auto w-[20px] h-[20px]"
|
||||
class: "m-auto mt-1 w-[18px] h-[18px]"
|
||||
})}
|
||||
<p>周一</p>
|
||||
</div>
|
||||
@@ -109,7 +132,7 @@ const optionsLabel: Array<OptionsType> = [
|
||||
label: () => (
|
||||
<div>
|
||||
{h(useRenderIcon("terminalWindowLine"), {
|
||||
class: "m-auto w-[20px] h-[20px]"
|
||||
class: "m-auto mt-1 w-[18px] h-[18px]"
|
||||
})}
|
||||
<p>周二</p>
|
||||
</div>
|
||||
@@ -119,7 +142,7 @@ const optionsLabel: Array<OptionsType> = [
|
||||
label: () => (
|
||||
<div>
|
||||
{h(useRenderIcon("streamline-emojis:cow-face"), {
|
||||
class: "m-auto w-[20px] h-[20px]"
|
||||
class: "m-auto mt-1 w-[18px] h-[18px]"
|
||||
})}
|
||||
<p>周三</p>
|
||||
</div>
|
||||
@@ -142,7 +165,7 @@ const optionsChange: Array<OptionsType> = [
|
||||
}
|
||||
];
|
||||
|
||||
/** change事件 */
|
||||
/** change 事件 */
|
||||
function onChange({ index, option }) {
|
||||
const { label, value } = option;
|
||||
message(`当前选中项索引为:${index},名字为${label},值为${value}`, {
|
||||
@@ -158,26 +181,37 @@ function onChange({ index, option }) {
|
||||
<span class="font-medium">分段控制器</span>
|
||||
</div>
|
||||
</template>
|
||||
<p class="mb-2">
|
||||
基础用法(v-model)<span class="text-primary">
|
||||
{{ optionsBasis[value].label }}
|
||||
</span>
|
||||
</p>
|
||||
<Segmented v-model="value" :options="optionsBasis" />
|
||||
<el-divider />
|
||||
<p class="mb-2">禁用</p>
|
||||
<Segmented :options="optionsDisabled" />
|
||||
<el-divider />
|
||||
<p class="mb-2">设置图标</p>
|
||||
<Segmented :options="optionsIcon" />
|
||||
<el-divider />
|
||||
<p class="mb-2">只设置图标</p>
|
||||
<Segmented :options="optionsOnlyIcon" />
|
||||
<el-divider />
|
||||
<p class="mb-2">自定义渲染</p>
|
||||
<Segmented :options="optionsLabel" />
|
||||
<el-divider />
|
||||
<p class="mb-2">change事件</p>
|
||||
<Segmented :options="optionsChange" @change="onChange" />
|
||||
<el-scrollbar>
|
||||
<p class="mb-2">
|
||||
基础用法(v-model)<span class="text-primary">
|
||||
{{ optionsBasis[value].label }}
|
||||
</span>
|
||||
</p>
|
||||
<Segmented v-model="value" :options="optionsBasis" />
|
||||
<el-divider />
|
||||
<p class="mb-2">tooltip 提示</p>
|
||||
<Segmented :options="optionsTooltip" />
|
||||
<el-divider />
|
||||
<p class="mb-2">change 事件</p>
|
||||
<Segmented :options="optionsChange" @change="onChange" />
|
||||
<el-divider />
|
||||
<p class="mb-2">禁用</p>
|
||||
<Segmented :options="optionsDisabled" />
|
||||
<el-divider />
|
||||
<p class="mb-2">可设置图标</p>
|
||||
<Segmented :options="optionsIcon" />
|
||||
<el-divider />
|
||||
<p class="mb-2">只设置图标</p>
|
||||
<Segmented :options="optionsOnlyIcon" />
|
||||
<el-divider />
|
||||
<p class="mb-2">自定义渲染</p>
|
||||
<Segmented :options="optionsLabel" />
|
||||
</el-scrollbar>
|
||||
</el-card>
|
||||
</template>
|
||||
|
||||
<style scoped>
|
||||
:deep(.el-divider--horizontal) {
|
||||
margin: 17px 0;
|
||||
}
|
||||
</style>
|
||||
@@ -9,7 +9,7 @@ defineOptions({
|
||||
const selectRange = ref<string>("");
|
||||
const dataLists = ref([
|
||||
{
|
||||
title: "基本使用",
|
||||
title: "基础用法",
|
||||
echo: [],
|
||||
disabled: false
|
||||
},
|
||||
@@ -23,7 +23,7 @@ const settingTB: ContextProps = reactive({
|
||||
<el-card shadow="never">
|
||||
<template #header>
|
||||
<div class="card-header">
|
||||
<span class="font-medium">切割面板组件</span>
|
||||
<span class="font-medium">切割面板</span>
|
||||
</div>
|
||||
</template>
|
||||
<div class="split-pane">
|
||||
@@ -31,17 +31,21 @@ const settingTB: ContextProps = reactive({
|
||||
<!-- #paneL 表示指定该组件为左侧面板 -->
|
||||
<template #paneL>
|
||||
<!-- 自定义左侧面板的内容 -->
|
||||
<div class="dv-a">A</div>
|
||||
<el-scrollbar>
|
||||
<div class="dv-a">A</div>
|
||||
</el-scrollbar>
|
||||
</template>
|
||||
<!-- #paneR 表示指定该组件为右侧面板 -->
|
||||
<template #paneR>
|
||||
<!-- 再次将右侧面板进行拆分 -->
|
||||
<splitpane :splitSet="settingTB">
|
||||
<template #paneL>
|
||||
<div class="dv-b">B</div>
|
||||
<el-scrollbar><div class="dv-b">B</div></el-scrollbar>
|
||||
</template>
|
||||
<template #paneR>
|
||||
<div class="dv-c">C</div>
|
||||
<el-scrollbar>
|
||||
<div class="dv-c">C</div>
|
||||
</el-scrollbar>
|
||||
</template>
|
||||
</splitpane>
|
||||
</template>
|
||||
@@ -51,36 +55,25 @@ const settingTB: ContextProps = reactive({
|
||||
</template>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
$W: 100%;
|
||||
$H: 70vh;
|
||||
|
||||
.split-pane {
|
||||
width: 70vw;
|
||||
height: $H;
|
||||
width: 100%;
|
||||
height: calc(100vh - 260px);
|
||||
font-size: 50px;
|
||||
color: #fff;
|
||||
text-align: center;
|
||||
border: 1px solid #e5e6eb;
|
||||
|
||||
.dv-a,
|
||||
.dv-b,
|
||||
.dv-c {
|
||||
width: $W;
|
||||
height: $W;
|
||||
line-height: $H;
|
||||
.dv-a {
|
||||
padding-top: 30vh;
|
||||
color: rgba($color: dodgerblue, $alpha: 80%);
|
||||
}
|
||||
|
||||
.dv-b,
|
||||
.dv-c {
|
||||
line-height: 250px;
|
||||
}
|
||||
|
||||
.dv-b {
|
||||
padding-top: 10vh;
|
||||
color: rgba($color: #000, $alpha: 80%);
|
||||
}
|
||||
|
||||
.dv-c {
|
||||
padding-top: 18vh;
|
||||
color: rgba($color: #ce272d, $alpha: 80%);
|
||||
}
|
||||
}
|
||||
@@ -1,5 +1,6 @@
|
||||
<script setup lang="ts">
|
||||
import { markRaw } from "vue";
|
||||
import { randomGradient } from "@pureadmin/utils";
|
||||
import { useRenderFlicker } from "@/components/ReFlicker";
|
||||
import { useRenderIcon } from "@/components/ReIcon/src/hooks";
|
||||
import Iphone from "@iconify-icons/ep/iphone";
|
||||
@@ -11,15 +12,26 @@ defineOptions({
|
||||
const { lastBuildTime } = __APP_INFO__;
|
||||
const activities = [
|
||||
{
|
||||
content: "支持圆点闪动",
|
||||
content: "支持圆点发光",
|
||||
timestamp: lastBuildTime,
|
||||
icon: markRaw(useRenderFlicker())
|
||||
},
|
||||
{
|
||||
content: "支持方形闪动",
|
||||
content: "支持方形发光",
|
||||
timestamp: lastBuildTime,
|
||||
icon: markRaw(useRenderFlicker({ borderRadius: 0, background: "#67C23A" }))
|
||||
},
|
||||
{
|
||||
content: "支持渐变发光",
|
||||
timestamp: lastBuildTime,
|
||||
icon: markRaw(
|
||||
useRenderFlicker({
|
||||
background: randomGradient({
|
||||
randomizeHue: true
|
||||
})
|
||||
})
|
||||
)
|
||||
},
|
||||
{
|
||||
content: "支持默认颜色",
|
||||
timestamp: lastBuildTime
|
||||
@@ -70,7 +82,7 @@ const activities = [
|
||||
placement="bottom"
|
||||
>
|
||||
<div class="message">
|
||||
vue-pure-admin是基于Vue3.0+TypeScript+Vite+Element-Plus编写的一套后台管理系统
|
||||
vue-pure-admin 是一款开源免费且开箱即用的中后台管理系统模版
|
||||
</div>
|
||||
</el-timeline-item>
|
||||
</el-timeline>
|
||||
@@ -56,7 +56,7 @@ export function useColumns() {
|
||||
];
|
||||
|
||||
const handleEdit = (index: number, row) => {
|
||||
message(`您编辑了第 ${index} 行,数据为:${JSON.stringify(row)}`, {
|
||||
message(`您修改了第 ${index} 行,数据为:${JSON.stringify(row)}`, {
|
||||
type: "success"
|
||||
});
|
||||
};
|
||||
|
||||
@@ -15,7 +15,7 @@ export function useColumns() {
|
||||
);
|
||||
|
||||
const handleEdit = (index: number, row) => {
|
||||
message(`您编辑了第 ${index} 行,数据为:${JSON.stringify(row)}`, {
|
||||
message(`您修改了第 ${index} 行,数据为:${JSON.stringify(row)}`, {
|
||||
type: "success"
|
||||
});
|
||||
};
|
||||
|
||||
@@ -30,11 +30,11 @@ export function useColumns() {
|
||||
disabled: true
|
||||
},
|
||||
{
|
||||
label: "编辑",
|
||||
label: "修改",
|
||||
tips: "Edit",
|
||||
fn: row =>
|
||||
message(
|
||||
`您编辑了第 ${
|
||||
`您修改了第 ${
|
||||
dataList.value.findIndex(v => v.id === row.id) + 1
|
||||
} 行,数据为:${JSON.stringify(row)}`,
|
||||
{
|
||||
|
||||
@@ -5,11 +5,11 @@ import { clone, delay } from "@pureadmin/utils";
|
||||
import EditPen from "@iconify-icons/ep/edit-pen";
|
||||
import Check from "@iconify-icons/ep/check";
|
||||
|
||||
// 温馨提示:编辑整行方法雷同,将cellRenderer后面渲染的组件抽出来做对应处理即可
|
||||
// 温馨提示:修改整行方法雷同,将cellRenderer后面渲染的组件抽出来做对应处理即可
|
||||
export function useColumns() {
|
||||
// 编辑值(可多个)
|
||||
// 修改值(可多个)
|
||||
const inputValMap = ref({});
|
||||
// 是否正处于编辑状态(可多个)
|
||||
// 是否正处于修改状态(可多个)
|
||||
const editStatus = ref({});
|
||||
// 当前激活的单元格(唯一)
|
||||
const activeIndex = ref(-1);
|
||||
@@ -43,7 +43,7 @@ export function useColumns() {
|
||||
|
||||
const columns: TableColumnList = [
|
||||
{
|
||||
label: "ID(可编辑)",
|
||||
label: "ID(可修改)",
|
||||
prop: "id",
|
||||
// class="flex-bc" flex-bc 代表 flex justify-between items-center 具体看 src/style/tailwind.css 文件
|
||||
cellRenderer: ({ row, index }) => (
|
||||
@@ -93,7 +93,7 @@ export function useColumns() {
|
||||
inputValMap.value[index] = Object.assign({}, inputValMap.value[index], {
|
||||
value: id
|
||||
});
|
||||
// 处于编辑状态
|
||||
// 处于修改状态
|
||||
editStatus.value[index] = Object.assign({}, editStatus.value[index], {
|
||||
editing: true
|
||||
});
|
||||
@@ -112,14 +112,14 @@ export function useColumns() {
|
||||
function onSure(index) {
|
||||
dataList.value[index].id = inputValMap.value[index].value;
|
||||
message(
|
||||
`您编辑了第 ${index + 1} 行,编辑后数据为:${JSON.stringify(
|
||||
`您修改了第 ${index + 1} 行,修改后数据为:${JSON.stringify(
|
||||
dataList.value[index]
|
||||
)}`,
|
||||
{
|
||||
type: "success"
|
||||
}
|
||||
);
|
||||
// 编辑状态关闭
|
||||
// 修改状态关闭
|
||||
editStatus.value[index] = Object.assign({}, editStatus.value[index], {
|
||||
editing: false
|
||||
});
|
||||
|
||||
@@ -53,7 +53,7 @@ export const list = [
|
||||
{
|
||||
key: "edit",
|
||||
content: rendContent("edit"),
|
||||
title: "单元格编辑",
|
||||
title: "单元格修改",
|
||||
component: Edit
|
||||
},
|
||||
{
|
||||
|
||||
@@ -10,7 +10,7 @@ import Refresh from "@iconify-icons/ep/refresh";
|
||||
import AddFill from "@iconify-icons/ri/add-circle-line";
|
||||
|
||||
defineOptions({
|
||||
name: "Dept"
|
||||
name: "SystemDept"
|
||||
});
|
||||
|
||||
const formRef = ref();
|
||||
@@ -71,7 +71,7 @@ const {
|
||||
</el-form>
|
||||
|
||||
<PureTableBar
|
||||
title="部门列表(仅演示,操作后不生效)"
|
||||
title="部门管理(仅演示,操作后不生效)"
|
||||
:columns="columns"
|
||||
:tableRef="tableRef?.getTableRef()"
|
||||
@refresh="onSearch"
|
||||
@@ -111,10 +111,20 @@ const {
|
||||
link
|
||||
type="primary"
|
||||
:size="size"
|
||||
:icon="useRenderIcon(EditPen)"
|
||||
@click="openDialog('编辑', row)"
|
||||
:icon="useRenderIcon(AddFill)"
|
||||
@click="openDialog('新增', { parentId: row.id } as any)"
|
||||
>
|
||||
编辑
|
||||
新增
|
||||
</el-button>
|
||||
<el-button
|
||||
class="reset-margin"
|
||||
link
|
||||
type="primary"
|
||||
:size="size"
|
||||
:icon="useRenderIcon(EditPen)"
|
||||
@click="openDialog('修改', row)"
|
||||
>
|
||||
修改
|
||||
</el-button>
|
||||
<el-popconfirm
|
||||
:title="`是否确认删除部门名称为${row.name}的这条数据`"
|
||||
|
||||
@@ -57,7 +57,7 @@ export function useDept() {
|
||||
{
|
||||
label: "操作",
|
||||
fixed: "right",
|
||||
width: 160,
|
||||
width: 210,
|
||||
slot: "operation"
|
||||
}
|
||||
];
|
||||
@@ -141,7 +141,7 @@ export function useDept() {
|
||||
// 实际开发先调用新增接口,再进行下面操作
|
||||
chores();
|
||||
} else {
|
||||
// 实际开发先调用编辑接口,再进行下面操作
|
||||
// 实际开发先调用修改接口,再进行下面操作
|
||||
chores();
|
||||
}
|
||||
}
|
||||
@@ -168,7 +168,7 @@ export function useDept() {
|
||||
onSearch,
|
||||
/** 重置 */
|
||||
resetForm,
|
||||
/** 新增、编辑部门 */
|
||||
/** 新增、修改部门 */
|
||||
openDialog,
|
||||
/** 删除部门 */
|
||||
handleDelete,
|
||||
|
||||
@@ -13,7 +13,7 @@ import Menu from "@iconify-icons/ep/menu";
|
||||
import AddFill from "@iconify-icons/ri/add-circle-line";
|
||||
|
||||
defineOptions({
|
||||
name: "Role"
|
||||
name: "SystemRole"
|
||||
});
|
||||
|
||||
const formRef = ref();
|
||||
@@ -87,7 +87,7 @@ const {
|
||||
</el-form>
|
||||
|
||||
<PureTableBar
|
||||
title="角色列表(仅演示,操作后不生效)"
|
||||
title="角色管理(仅演示,操作后不生效)"
|
||||
:columns="columns"
|
||||
@refresh="onSearch"
|
||||
>
|
||||
@@ -127,7 +127,7 @@ const {
|
||||
type="primary"
|
||||
:size="size"
|
||||
:icon="useRenderIcon(EditPen)"
|
||||
@click="openDialog('编辑', row)"
|
||||
@click="openDialog('修改', row)"
|
||||
>
|
||||
修改
|
||||
</el-button>
|
||||
|
||||
@@ -200,7 +200,7 @@ export function useRole() {
|
||||
// 实际开发先调用新增接口,再进行下面操作
|
||||
chores();
|
||||
} else {
|
||||
// 实际开发先调用编辑接口,再进行下面操作
|
||||
// 实际开发先调用修改接口,再进行下面操作
|
||||
chores();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -15,7 +15,7 @@ import Refresh from "@iconify-icons/ep/refresh";
|
||||
import AddFill from "@iconify-icons/ri/add-circle-line";
|
||||
|
||||
defineOptions({
|
||||
name: "User"
|
||||
name: "SystemUser"
|
||||
});
|
||||
|
||||
const treeRef = ref();
|
||||
@@ -173,7 +173,7 @@ const {
|
||||
type="primary"
|
||||
:size="size"
|
||||
:icon="useRenderIcon(EditPen)"
|
||||
@click="openDialog('编辑', row)"
|
||||
@click="openDialog('修改', row)"
|
||||
>
|
||||
修改
|
||||
</el-button>
|
||||
|
||||
@@ -342,7 +342,7 @@ export function useUser(tableRef: Ref, treeRef: Ref) {
|
||||
// 实际开发先调用新增接口,再进行下面操作
|
||||
chores();
|
||||
} else {
|
||||
// 实际开发先调用编辑接口,再进行下面操作
|
||||
// 实际开发先调用修改接口,再进行下面操作
|
||||
chores();
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user