Vue3.0项目实战(三)——大事件管理系统首页 layout 架子与文章分类的实现

目录

1. 首页 layout 架子 [element-plus 菜单]

1.1 基本架子拆解

2. 登录访问拦截

2.1 需求

2.2 vue3 和 vue2 中的 Vue-Router 区别

3. 用户基本信息获取&渲染

4. 退出功能 [element-plus 确认框]

5. 文章分类页面 - [element-plus 表格]

5.1 基本架子 - PageContainer

6. 文章分类渲染

6.1 封装API - 请求获取表格数据

6.2 el-table 表格动态渲染

6.3 el-table 表格 loading 效果

7. 文章分类添加编辑 [element-plus 弹层]

7.1 点击显示弹层

7.2 封装弹层组件 ChannelEdit

7.3 准备弹层表单

7.4 确认提交

7.5 文章分类删除


1. 首页 layout 架子 [element-plus 菜单]

1.1 基本架子拆解

架子组件列表

el-container

  • el-aside 左侧

    • el-menu 左侧边栏菜单

  • el-container 右侧

    • el-header 右侧头部

      • el-dropdown

    • el-main 右侧主体

      • router-view

<template><!-- el-menu 整个菜单组件:default-active="$route.path" 配置默认高亮的菜单项router 路由选项开启,el-menu-item 的 index 就是点击跳转的路径 --><el-container class="layout-container"><!-- 侧边栏 --><el-aside width="200px"><div class="el-aside__logo"></div><el-menuactive-text-color="#ffd04b"background-color="#232323":default-active="$route.path"text-color="#fff"router><el-menu-item index="/article/channel"><el-icon><Management /></el-icon><span>文章分类</span></el-menu-item><el-menu-item index="/article/manage"><el-icon><Promotion /></el-icon><span>文章管理</span></el-menu-item><el-sub-menu index="/user"><!-- 多级菜单的标题-具名插槽 title --><template #title><el-icon><UserFilled /></el-icon><span>个人中心</span></template><!-- 展开的内容-默认插槽 --><el-menu-item index="/user/profile"><el-icon><User /></el-icon><span>基本资料</span></el-menu-item><el-menu-item index="/user/avatar"><el-icon><Crop /></el-icon><span>更换头像</span></el-menu-item><el-menu-item index="/user/password"><el-icon><EditPen /></el-icon><span>重置密码</span></el-menu-item></el-sub-menu></el-menu></el-aside><!-- 侧边栏 --><el-container><el-header><div>黑马程序员:<strong>{{userStore.userInfo.nickname || userStore.userInfo.username}}</strong></div><el-dropdown placement="bottom-end" @command="handleCommand"><span class="el-dropdown__box"><el-avatar :src="userStore.userInfo.user_pic || avatar" /><el-icon><CaretBottom /></el-icon></span><template #dropdown><el-dropdown-menu><el-dropdown-item command="profile" :icon="User">基本资料</el-dropdown-item><el-dropdown-item command="avatar" :icon="Crop">更换头像</el-dropdown-item><el-dropdown-item command="password" :icon="EditPen">重置密码</el-dropdown-item><el-dropdown-item command="logout" :icon="SwitchButton">退出登录</el-dropdown-item></el-dropdown-menu></template></el-dropdown></el-header><el-main><router-view></router-view></el-main></el-container></el-container>
</template>

2. 登录访问拦截

2.1 需求

  • 只有登录页,可以未授权的时候访问,其他所有页面,都需要先登录再访问

2.2 vue3 和 vue2 中的 Vue-Router 区别

① router 和 route 在组件内的使用

  • vue 2.0
    • this.$router ——全局路由对象
    • this.route ——当前正在跳转的路由对象
  • vue 3.0
    • import { useRouter, useRoute } from 'vue-router'

    • const router = useRouter()

    • const route = useRoute()

② 路由前置守卫

  • vue 2.0 
const router = new VueRouter({ ... })router.beforeEach((to, from, next) => {// ...
})

每个守卫方法接收三个参数:

  • to: Route: 即将要进入的目标 路由对象
  • from: Route: 当前导航正要离开的路由
  • next: Function: 一定要调用该方法来 resolve 这个钩子。执行效果依赖 next 方法的调用参数。
    • next(): 放行路由跳转

    • next(false):拦截路由跳转

  • vue 3.0
const router = createRouter({ ... })router.beforeEach((to, from) => {// ...// 返回 false 以取消导航return false
})

每个守卫方法接收两个参数:

  • to: 即将要进入的目标 用一种标准化的方式
  • from: 当前导航正要离开的路由 用一种标准化的方式
  • 返回值如下:
    • false 拦截回 from 的地址页面
    • undefined / true 直接放行

    • 具体路径 或 路径对象 拦截到对应的地址  '/login' { name: 'login' }

③ 文档

  • vue2.0:导航守卫 | Vue Router导航守卫 | Vue Router
  • vue3.0:导航守卫 | Vue Router导航守卫 | Vue Router

3. 用户基本信息获取&渲染

① api/user/user.js 封装接口

② stores/modules/user.js 定义数据

③ layout/LayoutContainer 页面中调用

④ 动态渲染

4. 退出功能 [element-plus 确认框]

① 注册点击事件

② 添加退出功能

③ pinia user.js 模块 提供 setUserInfo 方法

5. 文章分类页面 - [element-plus 表格]

5.1 基本架子 - PageContainer

① 基本结构样式,用到了 el-card 组件

② 考虑到多个页面复用,封装成组件

  • props 定制标题

  • 默认插槽 default 定制内容主体

  • 具名插槽 extra 定制头部右侧额外的按钮

③ 页面中直接使用测试 

  • 文章分类测试
  • 文章管理测试

6. 文章分类渲染

6.1 封装API - 请求获取表格数据

① 新建 api/article/article.js 封装获取频道列表的接口

② 页面中调用接口,获取数据存储

6.2 el-table 表格动态渲染

 <el-table :data="tableData" stripe style="width: 100%" v-loading="loading"><el-table-column type="index" label="序号" width="180" align="center" /><el-table-column prop="cate_name" label="分类名称" align="center" /><el-table-column prop="cate_alias" label="分类别名" align="center" /><el-table-column label="操作" width="180" align="center"><template #default="scope"><divstyle="display: flex; align-items: center; justify-content: center"><el-buttontype="primary"circleplainsize="small":icon="Edit"@click="handleEdit(scope.row)"></el-button><el-buttonsize="small"type="danger"circleplain:icon="Delete"@click="handleDelete(scope.row)"></el-button></div></template></el-table-column>

6.3 el-table 表格 loading 效果

① 定义变量,v-loading绑定

② 发送请求前开启,请求结束关闭

7. 文章分类添加编辑 [element-plus 弹层]

7.1 点击显示弹层

① 准备弹层

const dialogVisible = ref(false)<el-dialog v-model="dialogVisible" title="添加弹层" width="30%"><div>我是内容部分</div><template #footer><span class="dialog-footer"><el-button @click="dialogVisible = false">取消</el-button><el-button type="primary"> 确认 </el-button></span></template>
</el-dialog>

② 点击事件

<template #extra><el-button type="primary" @click="onAddChannel">添加分类</el-button>
</template>const onAddChannel = () => {dialogVisible.value = true
}

7.2 封装弹层组件 ChannelEdit

添加 和 编辑,可以共用一个弹层,所以可以将弹层封装成一个组件

组件对外暴露一个方法 open, 基于 open 的参数,初始化表单数据,并判断区分是添加 还是 编辑

  •  open({}) 如果传递进来的是一个空对象,那么就是添加操作
  • opne({id, cate_name, ...}) 如果传递进来的不是一个空对象,那么就是编辑操作,并且需要渲染表单

  • open 调用后可以打开弹窗

具体实现:

① 封装组件 article/components/ChannelEdit.vue

② 通过 ref 绑定

③ 点击调用方法显示弹窗

7.3 准备弹层表单

① 准备数据 和 校验规则

② 准备表单

③ 编辑需要回显,表单数据需要初始化

④ 基于传过来的表单数据,进行标题控制,有 id 的是编辑

7.4 确认提交

① api/article/article.js 封装请求 API

② 页面中校验,判断,提交请求

④ 父组件监听 success 事件,进行调用回显

7.5 文章分类删除

① api/article.js 封装接口 api

② 页面中添加确认框,调用接口进行提示

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

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

相关文章

专业版PyCharm使用plt.show()显示图像时,如何不显示在右侧工具栏中,而是直接弹出来

解决方案 File -> Settings -> Python Plots -> 取消勾选 Show plots in tool window 示例 默认勾选 Show plots in tool window 的显示效果&#xff1a; 取消勾选 Show plots in tool window 的显示效果&#xff1a;

伙房食堂电气安全新挑战:油烟潮湿环境下,如何筑起电气火灾“防火墙”?

近几年&#xff0c;随着我国经济的飞速发展&#xff0c;食堂餐饮也经历了一场变革&#xff0c;越来越多的电器走进了伙房食堂中&#xff0c;实现了电气化&#xff0c;为人们提供了高效便利的饮食服务&#xff0c;但同时也增加了火灾负荷。目前我国非常严重的电气火灾危害&#…

使用 Parallel 类进行多线程编码(下)

2.Parallel.ForEach() 的使用 从 ForEach() 这个名字可以看出该方法是用来遍历泛型集合的&#xff0c;新建一个 ASP.NET Core Web应用的项目&#xff0c;如下&#xff1a; 在 Index.cshtml.cs 文件中增加一个 UserInfo.cs 的类&#xff0c;代码如下&#xff1a; public class U…

组合逻辑电路的分析

目录 组合逻辑电路的分析 分析思路 基本步骤 例题1 例题2 组合逻辑电路的分析 分析思路 基本步骤 例题1 将每个门的输出命名。 写出逻辑函数式。 列真值表。 ABC全一致输出为1。 例题2 观察发现这三个结构是一样的。 逐级写出逻辑函数式&#xff1a; 发现这其实就是异或…

基于云端的跨平台个人信息管理系统

博主介绍&#xff1a;专注于Java .net php phython 小程序 等诸多技术领域和毕业项目实战、企业信息化系统建设&#xff0c;从业十五余年开发设计教学工作 ☆☆☆ 精彩专栏推荐订阅☆☆☆☆☆不然下次找不到哟 我的博客空间发布了1000毕设题目 方便大家学习使用 感兴趣的可以…

无线麦克风哪款好用,手机领夹麦克风哪个牌子好,麦克风推荐

随着短视频与直播行业的蓬勃发展&#xff0c;无线领夹麦克风市场迎来了前所未有的繁荣。品牌如罗德、大疆、西圣等麦克风品牌凭借卓越的技术实力与品牌影响力占据了市场的主导地位&#xff0c;其中西圣更是凭借其高性价比和用户口碑&#xff0c;稳居行业口碑品牌前列。但在这光…

Chainlit集成Langchain并使用通义千问实现文生图网页应用

前言 本文教程如何使用通义千问的大模型服务平台的接口&#xff0c;实现图片生成的网页应用&#xff0c;主要用到的技术服务有&#xff0c;chainlit 、 langchain、 flux。合利用了大模型的工具选择调用能力。实现聊天对话生成图片的网页应用。 阿里云 大模型服务平台百炼 API…

最新融合多模态的理解和生成的大一统transform架构,show-o模型部署

Show-o是由字节跳动和新加坡国立大学Show Lab共同研发的一个多模态大模型&#xff0c;统一了多模态理解和生成。 Show-o的创新之处在于它将自回归和离散扩散建模相结合&#xff0c;以适应不同和混合模态的输入和输出。 Show-o模型的架构基于预训练的大型语言模型&#xff08;…

web基础之SSRF

1、内网访问 题目提示&#xff1a;访问位于127.0.0.1的flag.php&#xff1b;直接利用ssrf漏洞访问?url127.0.0.1/flag.php 2、伪协议读取文件 &#xff08;1&#xff09;题目提示&#xff1a;尝试去读取一下Web目录下的flag.php吧 &#xff08;2&#xff09;什么是伪协议&a…

【鸿蒙】HarmonyOS NEXT星河入门到实战6-组件化开发-样式结构重用常见组件

目录 1、Swiper轮播组件 1.1 Swiper基本用法 1.2 Swiper的常见属性 1.3 Swiper的样式自定义 1.3.1 基本语法 1.3.2 案例小米有品 2、样式&结构重用 2.1 Extend:扩展组件(样式、事件) 2.2 Styles:抽取通用属性、事件 2.3 Builder:自定义构建函数(结构、样式、事…

无人机视角-道路目标检测数据集 航拍 8600张 voc yolo

数据集名称&#xff1a; 无人机视角-道路目标检测数据集 数据集规模&#xff1a; 图像数量&#xff1a;8600张拍摄方式&#xff1a;航拍&#xff08;使用无人机拍摄&#xff09;标注格式&#xff1a;支持VOC和YOLO格式 数据集内容&#xff1a; 该数据集由无人机从空中拍摄的…

Android10源码刷入Pixel2以及整合GMS

一、ASOP源码下载 具体可以参考我之前发布的文章 二、下载相关驱动包 这一步很关键,关系到编译后的镜像能否刷入后运行 下载链接:Nexus 和 Pixel 设备的驱动程序二进制文件 如下图所示,将两个驱动程序上传到Ubuntu服务器,并进行解压,得到两个脚本: 下载解压后会有两…

5.qml 如何管理好控制台打印输出

c 在工程文件里面加入&#xff0c;这个只是禁用了c端的打印 DEFINES QT_NO_WARNING_OUTPUT DEFINES QT_NO_DEBUG_OUTPUT qml 在pro里面添加 #CONFIG - declarative_debug #CONFIG - qml_debug DEFINES QT_QML_DEBUG_NO_WARNING禁用qml打印,在main.cpp中引入 qputenv…

git为不同的项目设置不同的提交作者

方法1&#xff1a;找到项目的.git文件夹打开 打开config在下面添加自己作者信息 [user]name 作者名email 邮箱方法2&#xff1a;直接在.git文件夹设置作者名&#xff08;不使用–global参数&#xff09; git config user.name "xxxxx"如果想要修改之前提交的…

【idea-安装】

JetBrains官⽹ : https://www.jetbrains.com/ 1.下载idea安装包&#xff0c;下载旧一些的版本&#xff0c;避免新版本的不稳定。 下载下来的安装包是exe格式的&#xff0c;直接点击运行。 点击Next 2.选择要下载的位置&#xff0c;点击下一步。 3.选择⽣成快捷⽅式和建⽴⽂件…

uniapp数据缓存和发起网络请求

数据缓存 uni.onStorageSync同步的方式将数据存储到本地缓存 <template><button click"onStorageSync()">存储数据</button> </template><script setup>const onStorageSync () > {// 存储数据uni.setStorageSync(username, 张三)…

刷题活动(旋转和翻转)

前两天打了CCPC网络赛&#xff08;让打老实了&#xff09;&#xff0c;现在认识到了刷题的重要性&#xff0c;于是我开创了这么个栏目&#xff0c;我们一起刷一下题。 还是在ACwing网站上刷题 旋转和翻转 首先&#xff0c;申一下题目&#xff0c;输入一个数字 n &#xff0c;来…

【堆的应用--C语言版】

前面一节我们都已将堆的结构&#xff08;顺序存储&#xff09;已经实现&#xff0c;对树的相关概念以及知识做了一定的了解。其中我们在实现删除操作和插入操作的时候&#xff0c;我们还同时实现了建大堆&#xff08;小堆&#xff09;的向上&#xff08;下&#xff09;调整算法…

JVM 调优篇2 jvm的内存结构以及堆栈参数设置与查看

一 jvm的内存模型 2.1 jvm内存模型概览 2.2 pc计数器 它是一块很小的内存空间&#xff0c;集合可以忽略不记&#xff0c;也是运行速度最快的存储区域。不会随着程序的运行需要更大的空间。 在jvm规范中&#xff0c;每个线程都有它自己的程序计数器&#xff0c;是线程私有的&…

DIC技术助力新能源汽车主机厂力学测试研发与整车性能提升

在新能源汽车研发过程中&#xff0c;非接触式全视场应变DIC测量方案&#xff0c;越来越受到汽车主机厂的信赖与认可。传统接触式传感器&#xff0c;在精度、灵活性和数据处理能力上存在局限。DIC技术可提供精确、高效、全视场、便捷的非接触式测量解决方案。 在汽车研发阶段&a…