vue3-实战-12-管理后台-权限管理之菜单管理模块-首页-主题颜色-暗黑模式

news2024/11/14 6:25:16

目录

1-列表页面功能开发

1.1-需求原型分析

1.2-接口和数据类型定义

1.3-获取服务端数据渲染页面

2-新增编辑菜单

2.1-原型需求分析

2.2-表单数据收集和页面结构开发

2.3-提交或者取消

3-删除菜单

4-首页开发

5-暗黑模式的切换和主题颜色

5.1-暗黑模式

5.2-主题颜色切换


1-列表页面功能开发

1.1-需求原型分析

      我们看到整体页面结构是个table结构,需要使用到el-table组件,树形数据与懒加载这种table。支持树类型的数据的显示。 当 row 中包含 children 字段时,被视为树形数据。 渲染嵌套数据需要 prop 的 row-key。 此外,子行数据可以异步加载。 设置 Table 的lazy属性为 true 与加载函数 load 。 通过指定 row 中的hasChildren字段来指定哪些行是包含子节点。 children 与hasChildren都可以通过 tree-props 配置。

1.2-接口和数据类型定义

此模块用到的接口和数据类型再次一并定义;
文件src\api\acl\menu\index.ts定义数据的接口相关信息:

import request from '@/utils/request'
import type { PermisstionResponseData, MenuParams } from './type'
//枚举地址
enum API {
  //获取全部菜单与按钮的标识数据
  ALLPERMISSTION_URL = '/admin/acl/permission',
  //给某一级菜单新增一个子菜单
  ADDMENU_URL = '/admin/acl/permission/save',
  //更新某一个已有的菜单
  UPDATE_URL = '/admin/acl/permission/update',
  //删除已有的菜单
  DELETEMENU_URL = '/admin/acl/permission/remove/',
}
//获取菜单数据
export const reqAllPermisstion = () =>
  request.get<any, PermisstionResponseData>(API.ALLPERMISSTION_URL)
//添加与更新菜单的方法
export const reqAddOrUpdateMenu = (data: MenuParams) => {
  if (data.id) {
    return request.put<any, any>(API.UPDATE_URL, data)
  } else {
    return request.post<any, any>(API.ADDMENU_URL, data)
  }
}

//删除某一个已有的菜单
export const reqRemoveMenu = (id: number) =>
  request.delete<any, any>(API.DELETEMENU_URL + id)

文件src\api\acl\menu\type.ts定义数据类型:

//数据类型定义
export interface ResponseData {
  code: number
  message: string
  ok: boolean
}
//菜单数据与按钮数据的ts类型
export interface Permisstion {
  id?: number
  createTime: string
  updateTime: string
  pid: number
  name: string
  code: null
  toCode: null
  type: number
  status: null
  level: number
  children?: PermisstionList
  select: boolean
}
export type PermisstionList = Permisstion[]
//菜单接口返回的数据类型
export interface PermisstionResponseData extends ResponseData {
  data: PermisstionList
}

//添加与修改菜单携带的参数的ts类型
export interface MenuParams {
  id?: number //ID
  code: string //权限数值
  level: number //几级菜单
  name: string //菜单的名字
  pid: number //菜单的ID
}

1.3-获取服务端数据渲染页面

       当组件页面加载的后,我们就需要向服务端发起请求获取服务端相关信息。我们需要在组件中接受服务端返回的数据。

文件src\views\acl\permission\index.vue定义接受的数据和导入需要的API
 

import { ref, onMounted, reactive } from "vue";
//引入获取菜单请求API
import { reqAllPermisstion, reqAddOrUpdateMenu, reqRemoveMenu } from '@/api/acl/menu';
//引入ts类型
import type { MenuParams, PermisstionResponseData, PermisstionList, Permisstion } from '@/api/acl/menu/type';
import { ElMessage } from "element-plus";
//存储菜单的数据
let PermisstionArr = ref<PermisstionList>([]);

//组件挂载完毕
onMounted(() => {
    getHasPermisstion();
});
//获取菜单数据的方法
const getHasPermisstion = async () => {
    let result: PermisstionResponseData = await reqAllPermisstion();
    if (result.code == 200) {
        PermisstionArr.value = result.data;
    }
}

获取到服务端返回的数据,我们需要在组件页面动态渲染数据:

2-新增编辑菜单

2.1-原型需求分析

       

       我们留意细节,按钮名称分为添加菜单和添加功能,还有置灰状态。当你是一级,二级的时候,按钮名称是添加菜单,三级的时候,按钮名称是添加功能,四级的时候,按钮处于置灰状态。而且那个一级菜单 全部数据是不可编辑的。点击添加/编辑按钮,弹出对话框,我们需要使用到el-dialog组件。对话框里面是个表单组件,我们需要定义接受表单的数据对象。然后收集数据提交给服务端。

2.2-表单数据收集和页面结构开发

//控制对话框的显示与隐藏
let dialogVisible = ref<boolean>(false);
//携带的参数
let menuData = reactive<MenuParams>({
    "code": "",
    "level": 0,
    "name": "",
    "pid": 0,
})

点击新增按钮时,需要清空之前的数据,然后给将当前选中的菜单id赋值给子菜单的父id

//添加菜单按钮的回调
const addPermisstion = (row: Permisstion) => {
    //清空数据
    Object.assign(menuData, {id: 0,code: "",level: 0,name: "",pid: 0})
    //对话框显示出来
    dialogVisible.value = true;
    //收集新增的菜单的level数值
    menuData.level = row.level + 1;
    //给谁新增子菜单
    menuData.pid = (row.id as number);
}

点击编辑按钮,需要带当前菜单按钮的信息,进行回显。

//编辑已有的菜单
const updatePermisstion = (row: Permisstion) => {
    dialogVisible.value = true;
    //点击修改按钮:收集已有的菜单的数据进行更新
    Object.assign(menuData, row);
}

组件页面对话框的结构代码:

2.3-提交或者取消

收集到表单的数据后,我们点击确定按钮,需要提交数据给服务器。隐藏对话框,弹框提示成功还是失败,获取菜单数据信息。点击取消,直接隐藏对话框就行。

//确定按钮的回调
const save = async () => {
    //发请求:新增子菜单|更新某一个已有的菜单的数据
    let result: any = await reqAddOrUpdateMenu(menuData);
    if (result.code == 200) {
        //对话框隐藏
        dialogVisible.value = false;
        //提示信息
        ElMessage({ type: 'success', message: menuData.id ? '更新成功' : '添加成功' })
        //再次获取全部最新的菜单的数据
        getHasPermisstion();
    }
}

3-删除菜单

       当我们点击删除按钮的时候,我们需要弹框提示用户,是否需要删除菜单,用户点击确定就删除菜单。需要注意我们一级菜单-全部数据是不能删除的。删除完菜单后,提示用户信息,然后重新获取菜单信息。

//删除按钮回调
const removeMenu = async (id: number) => {
    let result = await reqRemoveMenu(id);
    if (result.code == 200) {
        ElMessage({ type: 'success', message: '删除成功' });
        getHasPermisstion();
    }
}

4-首页开发

       首页上部分是一个card组件,使用el-card来实现,有图像和用户名还要动态展示上午,下午好的提示语。我们的图像和用户名已经在仓库中了,所以我们直接获取就行。下面是一个矢量图,矢量图我们已经注册威全局组件,直接使用即可。

页面src\views\home\index.vue结构如下:

<template>
  <el-card>
    <div class="box">
      <img :src="userStore.avatar" alt="" class="avatar">
      <div class="bottom">
        <h3 class="title">{{ getTime() }}好呀{{ userStore.username }}</h3>
        <p class="subtitle">羊叔运营平台</p>
      </div>
    </div>
  </el-card>
  <div class="bottoms">
    <svg-icon name="welcome" width="600px" height="300px"></svg-icon>
  </div>
</template>

 相关样式和简单的ts如下:

<script setup lang="ts">
import { getTime } from '@/utils/time';
//引入用户相关的仓库,获取当前用户的头像、昵称
import useUserStore from '@/store/modules/user';
//获取存储用户信息的仓库对象
let userStore = useUserStore();

</script>
<style scoped lang="scss">
.box {
  display: flex;

  .avatar {
    width: 100px;
    height: 100px;
    border-radius: 50%;
  }

  .bottom {
    margin-left: 20px;

    .title {
      font-size: 30px;
      font-weight: 900;
      margin-bottom: 30px;
    }

    .subtitle {
      font-style: italic;
      color: skyblue;
    }
  }
}
.bottoms{
  margin-top: 10px;
  display: flex;
  justify-content: center;
}
</style>

5-暗黑模式的切换和主题颜色

5.1-暗黑模式

Element Plus 终于支持了暗黑模式!暗黑模式 | Element Plus;按照官方文档的步骤操作
需要给el-switch开关绑定一个事件。我们首先需要在入口文件main.ts中引入相关的样式:
import 'element-plus/theme-chalk/dark/css-vars.css'

 定义一个变量,控制开关;然后开关发生变化的时候,如果您只需要暗色模式,只需在 html 上添加一个名为 dark 的类 。

//收集开关的数据
let dark = ref<boolean>(false);

//switch开关的chang事件进行暗黑模式的切换
const changeDark = () => {
    //获取HTML根节点
    let html = document.documentElement;
    //判断HTML标签是否有类名dark
    dark.value ? html.className = 'dark' : html.className = '';
}

5.2-主题颜色切换

主题颜色的切换,我们需要使用到取色器组件el-color-picker来操作。

 定义变量和取色器候选颜色,点击后我们需要修改根节点的样式对象的属性与属性值:

//颜色组件组件的数据
const color = ref('rgba(255, 69, 0, 0.68)')
const predefineColors = ref([
    '#ff4500',
    '#ff8c00',
    '#ffd700',
    '#90ee90',
    '#00ced1',
    '#1e90ff',
    '#c71585',
    'rgba(255, 69, 0, 0.68)',
    'rgb(255, 120, 0)',
    'hsv(51, 100, 98)',
    'hsva(120, 40, 94, 0.5)',
    'hsl(181, 100%, 37%)',
    'hsla(209, 100%, 56%, 0.73)',
    '#c7158577',
])

//主题颜色的设置
const setColor = ()=>{
   //通知js修改根节点的样式对象的属性与属性值
   const html = document.documentElement;
   html.style.setProperty('--el-color-primary',color.value);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/672484.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

three.js几何体的_UV_、法向属性以及BufferGeometry类介绍

一、几何体的_UV_以及法向属性 UV属性是一组二维坐标&#xff0c;每个顶点都有一个对应的UV坐标。在三维模型上贴上二维的纹理贴图时&#xff0c;需要将所有顶点映射到纹理上的对应位置。UV属性的取值范围一般是[0,1]&#xff0c;表示纹理上的相对位置。通过修改UV属性&#xf…

Shell - 02_shell变量

一、shell的自定义变量 1.定义变量&#xff1a;变量名变量值 如&#xff1a;num10 2.引用变量&#xff1a;$变量名 如&#xff1a;i$num 把变量 num 的值付给变量 i 3.显示变量&#xff1a;使用 echo 命令可以显示单个变量取值 如&#xff1a;echo $num 4.清除变量&…

如何写好接口自动化测试脚本

谈到接口测试&#xff0c;大家关注更多的是哪个工具更优秀&#xff0c;更好用。但是很少人关注到接口测试用例的设计问题&#xff0c;也很少人会去写接口用例&#xff0c;都代码化了嘛&#xff0c;还写什么用例&#xff0c;是吧&#xff1f; 这样真的对么&#xff1f;我们是不…

Web3通过 MetaMask简单演示对ganache虚拟环境账号进行管理操作

上文 Web3通过ganache运行起一个本地虚拟区块链 我们通过ganache在本地运行起了一个虚拟的区块链环境 那么 接下来 我们就要用 MetaMask 来管理这个东西了 如果您还没有安装 可以访问文章Web3 将 MetaMask添加入谷歌浏览器 扩展程序中和Web3开发准备工作 手把手带你创建自己的 …

行业报告 | 人工智能时代的营销新趋势

原创 | 文 BFT机器人 01 科技推动时代发展进步 随着电子计算机的发明和使用&#xff0c;打开了人类知识的全方位信息时空&#xff0c;人类由此从工业文明走进信息文明&#xff0c;渐渐地网络成为了人们进行社会活动的基本平台。 智能手机的出现将人们剩余的碎片化时间也连接到了…

从尾到头打印链表

输入一个链表的头节点&#xff0c;按链表从尾到头的顺序返回每个节点的值&#xff08;用数组返回&#xff09;。 如输入{1,2,3}的链表如下图: ​ 返回一个数组为[3,2,1] 0 < 链表长度 < 10000 示例1 输入&#xff1a; {1,2,3} 返回值&#xff1a; [3,2,1]示例2 输入…

springboot集成J-IM+vue实现简单的聊天功能

前言&#xff1a;看了demo自己摸索着集成了一下&#xff0c;特此记录 一、引入依赖 <!-- jim-server --> <dependency><groupId>org.j-im</groupId><artifactId>jim-server</artifactId><version>3.0.0.v20200501-RELEASE&l…

【系统开发】尚硅谷 - 谷粒商城项目笔记(六):异步线程池

文章目录 异步线程池讲解简单线程池常见的四种线程池进阶线程池为什么使用线程池异步编排基本用法其他API线程串行化两任务组合都完成时一个完成时 多任务组合 异步线程池讲解 简单线程池 public class Test01 {public static void main(String[] args) {// 声明一个有10个线…

Java——集合

文章目录 1、集合概述2、集合类体系结构Collection集合体系 3、Collection集合常用API3、Collection集合的遍历方式方式一&#xff1a;迭代器方式二&#xff1a;foreach/增强for循环方式三&#xff1a;lambda表达式 4、List系列集合List集合特点和特有APILinkedList集合 5、集合…

物流园仓库智能综合监控系统

现代经济的不断发展&#xff0c;仓储物流业也在快速地发展&#xff0c;物流仓库作为物质资源的存储和转运&#xff0c;在经济生产中发挥着重大的作用&#xff0c;但是在此期间&#xff0c;随之而来的是物品丢失、被盗、损坏等一系列安全隐患事件。 物流仓库里面存储物品的多数都…

nginx: client intended to send too large body

最近上传大于1M文件的时候&#xff0c;报错nginx。 413 Request Entity Too Large 经过排查修改nginx配置 这是最简单的一个做法&#xff0c;着报错原因是nginx不允许上传配置过大的文件&#xff0c;那么件把nginx的上传大小配置调高就好。 1、打开nginx主配置文件nginx.co…

【性能测试】loadrunner12.55教程(一)--知识准备

目录 1.0. 前言 1.1 性能测试术语介绍 1.1.1 响应时间&#xff08;Response time&#xff09; 1.1.2 并发用户数 1.1.3 吞吐量&#xff08;Throughput&#xff09; 1.1.4 吞吐率&#xff08;Throughout&#xff09; 1.1.5 TPS&#xff08;Transaction Per Second&#x…

深度复盘:那些曾在618一鸣惊人的新品牌,今天过得怎么样?

分析师&#xff1a;yolo 编辑&#xff1a;yolo 出品&#xff1a;增长黑盒研究组 *本报告为增长黑盒独立研究系列&#xff0c; 与第三方不存在任何利益关系 从各平台的活动力度上来看&#xff0c;这届618堪称“史上最卷”&#xff1a;不装了&#xff0c;直接摊牌降价促销。 然而…

《VisualGLM-6B的原理与微调》资料学习分享

清华大学在发布chatGLM-6B后很快速的时间内就又发布了VisualGLM-6B模型&#xff0c;不可谓不强大&#xff0c;VisualGLM-6B官方项目地址在这里&#xff0c;如下所示&#xff1a; VisualGLM-6B 是一个开源的&#xff0c;支持图像、中文和英文的多模态对话语言模型&#xff0c;语…

2022前端趋势报告(上)

前端博主&#xff0c;热衷各种前端向的骚操作&#xff0c;经常想到哪就写到哪&#xff0c;如果有感兴趣的技术和前端效果可以留言&#xff5e;博主看到后会去代替大家踩坑的&#xff5e; 主页: oliver尹的主页 格言: 跌倒了爬起来就好&#xff5e; 一、前言 本文内容来自于《St…

N卡几千块的“智商税”,这下终于要没了

关于 CPU 显卡搭配&#xff0c;有句话大家肯定听过&#xff1a;「 i卡配iU、A卡配AU、N卡配 Fxxk U」 。 小白不要误会&#xff0c;这句话只是大家在喷N卡的定价问题。 拿刚刚过去的剁手节对比&#xff0c;AMD 这边旗舰显卡 RX 7900XT、XTX 价格直接跌到了 5/6000 出头。 而 …

Jenkins集成SonarQube代码质量检测

上一篇文章> Jenkins发布Kubernetes(K8s)集群(基于containerd) 一、SonarQube简介 1、简介 SonarQube是管理代码质量一个开放平台&#xff0c;可以快速的定位代码中潜在的或者明显的错误 2、下载 https://www.sonarsource.com/products/sonarqube/downloads/ 二、实验环境…

Spring Boot请求处理-常用参数注解

PathVariable 路径变量RequestParam 获取请求参数RequestHeader 获取请求头RequestBody 获取请求体【Post】CookieValue 获取Cookie值RequestAttribute 获取request域属性ModelAttribute 1. PathVariable 该注解主要用于rest风格的搭配使用&#xff0c;请求路径中不再以k:v的…

软考高级系统架构设计师(四) 计算机网络2磁盘阵列

目录 磁盘阵列RAID RAID级别 ​IPV6 网络接入技术 综合布线 磁盘阵列RAID 磁盘阵列&#xff08;Redundant Arrays of Independent Disks&#xff0c;RAID&#xff09;&#xff0c;有"数块独立磁盘构成具有冗余能力的阵列”之意。 磁盘阵列是由很多块独立的磁盘&#…

全新形态骨传导,久戴不疼,南卡OE骨传导耳机

随着生活品质的提高&#xff0c;科技的发展&#xff0c;人们对于日常用的耳机可以说是要求越来越高&#xff0c;越来越挑剔了。从耳机的外在设计&#xff0c;内在音质&#xff0c;佩戴的舒适及安全性上都有更高的追求。当然&#xff0c;耳机的设计者们也不遗余力的发挥着他们的…