当前位置:   article > 正文

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

后台管理系统 主题切换

目录

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定义数据的接口相关信息:

  1. import request from '@/utils/request'
  2. import type { PermisstionResponseData, MenuParams } from './type'
  3. //枚举地址
  4. enum API {
  5. //获取全部菜单与按钮的标识数据
  6. ALLPERMISSTION_URL = '/admin/acl/permission',
  7. //给某一级菜单新增一个子菜单
  8. ADDMENU_URL = '/admin/acl/permission/save',
  9. //更新某一个已有的菜单
  10. UPDATE_URL = '/admin/acl/permission/update',
  11. //删除已有的菜单
  12. DELETEMENU_URL = '/admin/acl/permission/remove/',
  13. }
  14. //获取菜单数据
  15. export const reqAllPermisstion = () =>
  16. request.get<any, PermisstionResponseData>(API.ALLPERMISSTION_URL)
  17. //添加与更新菜单的方法
  18. export const reqAddOrUpdateMenu = (data: MenuParams) => {
  19. if (data.id) {
  20. return request.put<any, any>(API.UPDATE_URL, data)
  21. } else {
  22. return request.post<any, any>(API.ADDMENU_URL, data)
  23. }
  24. }
  25. //删除某一个已有的菜单
  26. export const reqRemoveMenu = (id: number) =>
  27. request.delete<any, any>(API.DELETEMENU_URL + id)

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

  1. //数据类型定义
  2. export interface ResponseData {
  3. code: number
  4. message: string
  5. ok: boolean
  6. }
  7. //菜单数据与按钮数据的ts类型
  8. export interface Permisstion {
  9. id?: number
  10. createTime: string
  11. updateTime: string
  12. pid: number
  13. name: string
  14. code: null
  15. toCode: null
  16. type: number
  17. status: null
  18. level: number
  19. children?: PermisstionList
  20. select: boolean
  21. }
  22. export type PermisstionList = Permisstion[]
  23. //菜单接口返回的数据类型
  24. export interface PermisstionResponseData extends ResponseData {
  25. data: PermisstionList
  26. }
  27. //添加与修改菜单携带的参数的ts类型
  28. export interface MenuParams {
  29. id?: number //ID
  30. code: string //权限数值
  31. level: number //几级菜单
  32. name: string //菜单的名字
  33. pid: number //菜单的ID
  34. }

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

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

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

  1. import { ref, onMounted, reactive } from "vue";
  2. //引入获取菜单请求API
  3. import { reqAllPermisstion, reqAddOrUpdateMenu, reqRemoveMenu } from '@/api/acl/menu';
  4. //引入ts类型
  5. import type { MenuParams, PermisstionResponseData, PermisstionList, Permisstion } from '@/api/acl/menu/type';
  6. import { ElMessage } from "element-plus";
  7. //存储菜单的数据
  8. let PermisstionArr = ref<PermisstionList>([]);
  9. //组件挂载完毕
  10. onMounted(() => {
  11. getHasPermisstion();
  12. });
  13. //获取菜单数据的方法
  14. const getHasPermisstion = async () => {
  15. let result: PermisstionResponseData = await reqAllPermisstion();
  16. if (result.code == 200) {
  17. PermisstionArr.value = result.data;
  18. }
  19. }

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

2-新增编辑菜单

2.1-原型需求分析

       

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

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

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

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

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

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

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

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

2.3-提交或者取消

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

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

3-删除菜单

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

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

4-首页开发

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

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

  1. <template>
  2. <el-card>
  3. <div class="box">
  4. <img :src="userStore.avatar" alt="" class="avatar">
  5. <div class="bottom">
  6. <h3 class="title">{{ getTime() }}好呀{{ userStore.username }}</h3>
  7. <p class="subtitle">羊叔运营平台</p>
  8. </div>
  9. </div>
  10. </el-card>
  11. <div class="bottoms">
  12. <svg-icon name="welcome" width="600px" height="300px"></svg-icon>
  13. </div>
  14. </template>

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

  1. <script setup lang="ts">
  2. import { getTime } from '@/utils/time';
  3. //引入用户相关的仓库,获取当前用户的头像、昵称
  4. import useUserStore from '@/store/modules/user';
  5. //获取存储用户信息的仓库对象
  6. let userStore = useUserStore();
  7. </script>
  1. <style scoped lang="scss">
  2. .box {
  3. display: flex;
  4. .avatar {
  5. width: 100px;
  6. height: 100px;
  7. border-radius: 50%;
  8. }
  9. .bottom {
  10. margin-left: 20px;
  11. .title {
  12. font-size: 30px;
  13. font-weight: 900;
  14. margin-bottom: 30px;
  15. }
  16. .subtitle {
  17. font-style: italic;
  18. color: skyblue;
  19. }
  20. }
  21. }
  22. .bottoms{
  23. margin-top: 10px;
  24. display: flex;
  25. justify-content: center;
  26. }
  27. </style>

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

5.1-暗黑模式

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

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

  1. //收集开关的数据
  2. let dark = ref<boolean>(false);
  3. //switch开关的chang事件进行暗黑模式的切换
  4. const changeDark = () => {
  5. //获取HTML根节点
  6. let html = document.documentElement;
  7. //判断HTML标签是否有类名dark
  8. dark.value ? html.className = 'dark' : html.className = '';
  9. }

5.2-主题颜色切换

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

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

  1. //颜色组件组件的数据
  2. const color = ref('rgba(255, 69, 0, 0.68)')
  3. const predefineColors = ref([
  4. '#ff4500',
  5. '#ff8c00',
  6. '#ffd700',
  7. '#90ee90',
  8. '#00ced1',
  9. '#1e90ff',
  10. '#c71585',
  11. 'rgba(255, 69, 0, 0.68)',
  12. 'rgb(255, 120, 0)',
  13. 'hsv(51, 100, 98)',
  14. 'hsva(120, 40, 94, 0.5)',
  15. 'hsl(181, 100%, 37%)',
  16. 'hsla(209, 100%, 56%, 0.73)',
  17. '#c7158577',
  18. ])
  19. //主题颜色的设置
  20. const setColor = ()=>{
  21. //通知js修改根节点的样式对象的属性与属性值
  22. const html = document.documentElement;
  23. html.style.setProperty('--el-color-primary',color.value);
  24. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小舞很执着/article/detail/775249
推荐阅读
相关标签
  

闽ICP备14008679号