vue-manage-system 近期进行了一次版本升级,主要是支持了更多功能、升级依赖版本和优化样式,并且上线了官方文档网站,大部分功能都有文档或者使用示例,更加适合新手上手开发,只需要根据实际业务简单修改,就可以完成产品需求。

视觉优化

比较长时间没对视觉做什么改动,多少会有点审美疲劳,所以这次也做了一些改动,至少我觉得比之前好看点了(请轻点喷,哭笑不得)

标签页

之前标签页的样式是自己实现,最多只能支持8个标签页,再多会覆盖之前的页面。现在直接用 el-tabs 组件实现,代码量更少,而且不限制标签数量,超出宽度可以滚动查看。

<el-tabs v-model="activePath" class="tabs" type="card" closable @tab-click="clickTabs" @tab-remove="closeTabs">
<el-tab-pane v-for="item in tabs.list" :key="item.path" :label="item.title" :name="item.path" @click="setTags(item)"></el-tab-pane>
</el-tabs>
const activePath = ref(route.fullPath);
watch(() => route.fullPath, (newVal, oldVal) => {
activePath.value = newVal;
})

activePath 用当前路由的路径来选中对应的标签页,当路由变化时,通过监听器 watch 来给 activePath 赋值新路由,以确保选中的标签一直是当前页面路由。

const tabs = useTabsStore();
const closeTabs = (name: string) => {
const index = tabs.list.findIndex((item) => item.path === name);
tabs.delTabsItem(index);
const item = tabs.list[index] || tabs.list[index - 1];
router.push(item?item.path:'/')
}

关闭标签时会触发 tab-remove 事件,把该标签从 tabs.list 列表中移除。先通过 findIndex 找到该标签的索引,传到 pinia 中的 delTabsItem 方法进行移除标签,移除后路由跳转到下一个标签或者上一个标签,如果标签已清空,则跳到首页。

设置主题

Element plus的默认主题色是#409EFF,CSS变量是--el-color-primary,要改变主题色时,给这个变量赋值即可。

document.documentElement.style.setProperty('--el-color-primary', '#ff0000');

同时要修改它的附属颜色,比如:hover、:active等用到的颜色变量

--el-color-primary-light-3: #79bbff;
--el-color-primary-light-5: #a0cfff;
--el-color-primary-light-7: #c6e2ff;
--el-color-primary-light-8: #d9ecff;
--el-color-primary-light-9: #ecf5ff;
--el-color-primary-dark-2: #337ecc;

修改附属颜色变量

const mix = (color1, color2, weight) => {
let color = '#';
for (let i = 0; i <= 2; i++) {
const c1 = parseInt(color1.substring(1 + i * 2, 3 + i * 2), 16);
const c2 = parseInt(color2.substring(1 + i * 2, 3 + i * 2), 16);
const c = Math.round(c1 * weight + c2 * (1 - weight));
color += c.toString(16).padStart(2, '0');
}
return color;
};
const setThemeLight (type) => {
[3, 5, 7, 8, 9].forEach((v) => {
setProperty(`--el-color-${type}-light-${v}`, mix('#ffffff', this[type], v / 10));
});
setProperty(`--el-color-${type}-dark-2`, mix('#000000', this[type], 0.2));
}

封装表格

表格是后台管理系统中最常见的功能了,会在多个页面中重复使用,所以这里对 element 表格组件做了二次封装,包括了查询、分页、查看详情、添加/编辑/删除等常用功能,在使用表格的时候代码量可以更少,比较方便维护。

  • /src/components/table-custom.vue: 表格组件
  • /src/components/table-edit.vue: 添加/编辑表单
  • /src/components/table-detail.vue: 查看详情组件
  • /src/components/table-search.vue: 查询组件

使用方式如下:

<template>
<div>
<!-- 查询组件 -->
<TableSearch :query="query" :options="searchOpt" :search="handleSearch" />
<!-- 表格组件 -->
<TableCustom :columns="columns" :tableData="tableData" :total="page.total" :viewFunc="handleView" :delFunc="handleDelete" :editFunc="handleEdit" :refresh="getData" :currentPage="page.index" :changePage="changePage">
<!-- 自定义内容 -->
<template #toolbarBtn>
<el-button type="warning" :icon="CirclePlusFilled" @click="visible = true">新增</el-button>
</template>
<template #money="{ rows }">¥{{ rows.money }}</template>
<template #thumb="{ rows }">
<el-image class="table-td-thumb" :src="rows.thumb" :z-index="10" :preview-src-list="[rows.thumb]" preview-teleported></el-image>
</template>
<template #state="{ rows }">
<el-tag :type="rows.state ? 'success' : 'danger'">
{{ rows.state ? '正常' : '异常' }}
</el-tag>
</template>
</TableCustom>
<!-- 新增/编辑 -->
<el-dialog :title="isEdit ? '编辑' : '新增'" v-model="visible" width="700px" destroy-on-close :close-on-click-modal="false" @close="closeDialog">
<TableEdit :form-data="rowData" :options="options" :edit="isEdit" :update="updateData">
<template #thumb="{ rows }">
<img class="table-td-thumb" :src="rows.thumb" />
</template>
</TableEdit>
</el-dialog>
<!-- 表格详情 -->
<el-dialog title="查看详情" v-model="visible1" width="700px" destroy-on-close>
<TableDetail :data="viewData">
<template #thumb="{ rows }">
<el-image :src="rows.thumb" />
</template>
</TableDetail>
</el-dialog>
</div>
</template>

具体组件的传参可以参考文档:vuems-doc

词云图

echarts 没有词云图,需要引入第三方库 echarts-wordcloud

<template>
<v-chart class="schart" :option="wordOptions" />
</template>
<script setup>
import VChart from 'vue-echarts';
import 'echarts-wordcloud';
const wordOptions = {
series: [
{
type: 'wordCloud',
rotationRange: [0, 0],
autoSize: { enable: true, minSize: 14,},
textStyle: {
fontFamily: '微软雅黑,sans-serif',
color: () => (
'rgb(' +
[
Math.round(Math.random() * 160),
Math.round(Math.random() * 160),
Math.round(Math.random() * 160),
].join(',') +
')'
)
},
data: [
{name: 'Vue',value: 10000},
{name: 'React',value: 9000},
{name: '图表',value: 4000},
{name: 'vue-manage-system',value: 2000},
],
},
],
};
</script>

数字滚动

数字展示时带有滚动动画,能给视觉上带来一点冲击。Element Plus 的统计组件也可以实现这个效果,但是需要结合 vueuse 实现,比较麻烦。所以引入了第三方库 countup.js,封装成小组件,使用方便。

// countup.vue
<template>
<span ref="countRef"></span>
</template> <script setup lang="ts">
import { onMounted, ref, watch } from 'vue';
import { CountUp } from 'countup.js'; const props = defineProps({
end: { type: Number, required: true, },
options: { type: Object, default: () => ({}), required: false, },
});
const countRef = ref<any>(null);
let countUp: any;
onMounted(() => {
countUp = new CountUp(countRef.value, props.end, props.options);
if (countUp.error) return;
countUp.start();
}); watch(() => props.end, (newVal) => {
countUp && countUp.update(newVal);
});
</script>

vue-manage-system 版本更新,让开发更加简单的更多相关文章

  1. 从无到有实现搭建vue+ElementUI+less+ES6的开发环境并进行简单的开发的项目

    项目简介:该项目是基于日常计算宿舍水电煤气费的需求写的,旨在从无到有实现搭建vue+ElementUI+less+ES6的开发环境并进行简单的开发,使用webpack进行代码的编译.压缩和打包,并疏通 ...

  2. vue.js路由vue-router(一)——简单路由基础

    前言 vue.js除了拥有组件开发体系之外,还有自己的路由vue-router.在没有使用路由之前,我们页面的跳转要么是后台进行管控,要么是用a标签写链接.使用vue-router后,我们可以自己定义 ...

  3. 做一个gulp+webpack+vue的单页应用开发架子

    1.目标 最近项目上的事情不多,根据我自己的开发习惯,决定开发一些简单的开发架子,方便以后事情多的时候直接套用.本文讲的一个gulp+webpack+vue的单页应用架子,想要达到的目的: 可以通过命 ...

  4. 重新想象 Windows 8 Store Apps (64) - 后台任务: 开发一个简单的后台任务

    [源码下载] 重新想象 Windows 8 Store Apps (64) - 后台任务: 开发一个简单的后台任务 作者:webabcd 介绍重新想象 Windows 8 Store Apps 之 后 ...

  5. 【Vue 入门】使用 Vue2 开发一个展示项目列表的应用

    前言 一直没有找到一个合适的展示个人项目的模板,所以自己动手使用 Vue 写了一个.该模板基于 Markdown 文件进行配置,只需要按一定规则编写 Markdown 文件,然后使用一个 在线工具 转 ...

  6. [.NET] 使用 Senparc.Weixin 接入微信公众号开发:简单实现自动回复

    使用 Senparc.Weixin 接入微信公众号开发:简单实现自动回复 目录 一.前提 二.基本配置信息简析 三.配置服务器地址(URL) 四.请求处理 一.前提 先申请微信公众号的授权,找到或配置 ...

  7. Vue 入门之组件化开发

    Vue 入门之组件化开发 组件其实就是一个拥有样式.动画.js 逻辑.HTML 结构的综合块.前端组件化确实让大的前端团队更高效的开发前端项目.而作为前端比较流行的框架之一,Vue 的组件和也做的非常 ...

  8. 一个基于 .NET Core 2.0 开发的简单易用的快速开发框架 - LinFx

    LinFx 一个基于 .NET Core 2.0 开发的简单易用的快速开发框架,遵循领域驱动设计(DDD)规范约束,提供实现事件驱动.事件回溯.响应式等特性的基础设施.让开发者享受到正真意义的面向对象 ...

  9. 3.NetDh框架之缓存操作类和二次开发模式简单设计(附源码和示例代码)

    前言 NetDh框架适用于C/S.B/S的服务端框架,可用于项目开发和学习.目前包含以下四个模块 1.数据库操作层封装Dapper,支持多种数据库类型.多库实例,简单强大: 此部分具体说明可参考博客: ...

  10. vue.js原生组件化开发(一)——组件开发基础

    前言 vue作为一个轻量级前端框架,其核心就是组件化开发.我们一般常用的是用脚手架vue-cli来进行开发和管理,一个个组件即为一个个vue页面,这种叫单文件组件.我们在引用组件之时只需将组件页面引入 ...

随机推荐

  1. 金蝶中间件 前后台连不上 报跨域 前台解决方案: --user-data-dir="c:\ChromeDebug" --test-type --disable-web-security

    chrome 浏览器的快捷方式后面加参数 --user-data-dir="c:\ChromeDebug" --test-type --disable-web-security

  2. KTL 最新版

    K,K线,Candle蜡烛图. T,技术分析,工具平台 L,公式Language语言使用c++14,Lite小巧简易. 项目仓库:https://github.com/bbqz007/KTL Core ...

  3. java的内存模型认识

    参考,欢迎点击原文:https://www.bilibili.com/video/BV1CW411U726(B站) https://www.bilibili.com/video/BV12t411u72 ...

  4. JavaScript知识总结 终结篇--面向对象,垃圾回收与内存泄漏

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 一.面向对象 一般使用字面量的形式直接创建对象,但是这种创建方式对于创建大量相似对象的时候,会产生大量的重复代码.但 js和一般的面向对象 ...

  5. 记录-JavaScript常规加密技术

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 当今Web开发中,数据安全是一个至关重要的问题,为了确保数据的安全性,我们需要使用加密技术.JavaScript作为一种客户端编程语言,可 ...

  6. CYarp:力压frp的C#高性能http内网反代中间件

    我以前开发过HttpMouse的http内网反代中间件,但由于当时的知识点与设计水平受限,所以把它下马了.随着自身又遇到http内网反代的需求,在frp不能满足我需求情况下,我又启动了一个叫CYarp ...

  7. KingbaseES中查询对象大小的SQL及函数区别

    --查看所有数据库大小 select sys_database.datname, sys_size_pretty(sys_database_size(sys_database.datname)) AS ...

  8. JS实现决策报表缓存最后一次查询条件

    问题描述 决策报表在打开时希望参数控件的值可以默认是上一次页面关闭前最后一次查询所选择的值. 解决方案 每次点击查询后将参数值保存到浏览器缓存中(适用于控件在参数栏内),或每次控件值发生改变后将参数值 ...

  9. Java学习路线之redis

    1.redis 大数据时代三V:海量Volume.多样Variety.实时Velocity 大数据时代三高:高并发.高可用(无限套娃+彼此监控).高性能 - Redis(Remote Dictiona ...

  10. 安卓AlertDialog对话面板的使用---Android开发

    1 AlertDialog.Builder builder=new AlertDialog.Builder(this); 2 builder.setTitle("历史记录").se ...