当前位置: 首页 > news >正文

Vite Vue3+Element Plus框架布局

App根组件:框架布局

<template><el-container class="layout-container-demo" style="height: 98vh"><!-- 菜单栏 --><el-aside width="200px"><el-scrollbar><!-- router:是否启用 vue-router 模式。 启用该模式会在激活导航时以 index 作为 path 进行路由跳转 使用 default-active 来设置加载时的激活项。 --><!-- default-active:页面加载时默认激活菜单的 index 也就是你当前选中的菜单页进行高亮显示 --><el-menu :router="true" :default-active="route.fullPath"><!-- 这个index是一个唯一标识:一般我们将它设置为路由的地址即可 --><el-menu-item index="/home"><el-icon><HomeFilled /></el-icon><span>首页</span></el-menu-item><el-sub-menu index="/news"><template #title><el-icon><icon-menu /></el-icon>新闻管理</template><el-menu-item index="/news/add">新增新闻</el-menu-item><el-menu-item index="/news/list">新闻列表</el-menu-item></el-sub-menu></el-menu></el-scrollbar></el-aside><!-- 内容栏 --><el-container><el-header style="text-align: right; font-size: 12px"><div>新闻管理系统</div><div>欢迎Lily回来</div></el-header><el-main><el-scrollbar><!-- 这里就是我们的路由容器:我们的数据加载到这里 --><RouterView></RouterView></el-scrollbar></el-main></el-container></el-container>
</template><script setup>
import { ref } from 'vue'
// 注册icon  :icon需要单独注册
import { Menu as IconMenu, Message, Setting, HomeFilled } from '@element-plus/icons-vue'
import { useRouter, useRoute } from 'vue-router'
const router = useRouter();
const route = useRoute();
</script><style>
* {margin: 0;padding: 0;
}.el-header {background: #f5f7fa;height: 80px;width: 100%;line-height: 80px;display: flex;justify-content: space-between;align-items: center;/*字体垂直方向居中*/
}.el-header div {font-size: 16px;
}
</style>

AddNews.vue 新增新闻


<template><el-form :model="news" label-width="120px"><el-form-item label="标题"><el-input v-model="news.title" /></el-form-item><el-form-item label="类型"><el-select v-model="news.type" placeholder="类型"><el-option label="军事" value="军事" /><el-option label="娱乐" value="娱乐" /><el-option label="财经" value="财经" /></el-select></el-form-item><el-form-item label="内容"><el-input v-model="news.desc" type="textarea" /></el-form-item><el-form-item><el-button type="primary" @click="onAddNews">创建</el-button><el-button>取消</el-button></el-form-item></el-form>
</template><script lang="ts" setup>
import {ref, reactive } from 'vue'
import newsStore from '../stores/newsStore'
const store=newsStore();const news=ref({title:"",type:"",desc:"",
})const onAddNews = () => {store.addNews(news.value); //新增新闻
}
</script>

NewsList.vue 新闻列表

<template><el-table :data="store.newsList" style="width: 100%"><el-table-column fixed prop="title" label="标题" /><el-table-column prop="type" label="分类" /><el-table-column prop="desc" label="内容" /><el-table-column><template #default="scope"><el-button link type="primary" size="small" @click="handleClick(scope.row)">删除</el-button><el-button link type="primary" size="small">编辑</el-button></template></el-table-column></el-table>
</template><script  setup>
import newsStore from '../stores/newsStore'
const store = newsStore();
console.log(store.newsList)
const handleClick = (row) => {store.deleteNews(row.title)}
</script>

/router/index 路由

import { createRouter, createWebHistory } from "vue-router"; //导入vue-router路由模块,createWebHashHistor函数const routes = [{path: "/",  //路径: redirect: "/Home"  //涉及到多级页面跳转需要用路径的跳转,不能用name的跳转; 浏览器进入http://localhost:5173/ 首先要跳转的路径是/Films,即:要跳转到http://localhost:5173/Films,而进入http://localhost:5173/Films后又发现/Films要重定向到/Films/NowPlaying,这样就实现了打开http://localhost:5173/就加载出来了http://localhost:5173/Films/NowPlaying内容// redirect: {//     name: "Films" //重定向到路由名称为Tabbar的路由中,这样当浏览器输入的是:http://localhost:5173/ 则会重定向跳转到 http://localhost:5173/Films// }},{path: "/home",  //路径:导航栏name: "Home",//当路由被触发时,该组件才会被异步加载,举列:打开页面就不会加载所有的组件,而是根据当前页面需要的组件进行异步加载//这样可以减少初始加载时间,提升用户体验,同时也节省了不必要的资源消耗。component: () => import("../views/Home.vue")},{path: "/news/add",  //路径:底部选项卡name: "AddNews",  //路由名称,如果不指定name 默认的name为default//当路由被触发时,该组件才会被异步加载,举列:打开页面就不会加载所有的组件,而是根据当前页面需要的组件进行异步加载//这样可以减少初始加载时间,提升用户体验,同时也节省了不必要的资源消耗。component: () => import("../views/AddNews.vue"),},{path: "/news/list",  //路径:底部选项卡name: "NewsList",  //路由名称,如果不指定name 默认的name为default//当路由被触发时,该组件才会被异步加载,举列:打开页面就不会加载所有的组件,而是根据当前页面需要的组件进行异步加载//这样可以减少初始加载时间,提升用户体验,同时也节省了不必要的资源消耗。component: () => import("../views/NewsList.vue"),},{path: "/:pathMatch(.*)",  //404错误name: "NotFound",  //路由名称,如果不指定name 默认的name为defaultcomponent: () => import("../views/NotFound.vue")}]//创建路由对象
const router = createRouter({history: createWebHistory(),     //这种方式基于浏览器 history API 的路由模式,url的样式是:http://localhost:5173/listroutes: routes,
})//路由全局拦截:在进入页面之前就进行拦截。可以用于做用户登陆验证
//参数to:  表示即将进入的目标路由对象
//参数from:表示当前导航正要离开的路由
//参数next:调用该方法后才能进入下一个钩子。next() 直接进入下一个钩子,next(false) 中断当前的导航。next('/') 或者 next({ path: '/' }) 则会进入一个不同的地址。
router.beforeEach(async (to, from, next) => {const isAuthenticated = await localStorage.getItem('token');console.log(to.fullPath); //全路径console.log(to.path);     //路径console.log(to.name);     //路由名称console.log(to.params);   //路由参数:http://localhost:5173/FilmsDetail/123console.log(to.query);    //路由参数:http://localhost:5173/FilmsDetail?myid=123console.log(to.meta);     //路由自定义参数//meta.requireAuth表示当前请求的页面需要验证, 并且未登录if (to.meta.requireAuth && !isAuthenticated) {next(`/login?redirect=${to.path}`) //to.fullPath}else next() //如果不是请求的登陆界面,或者已经登陆过了,则直接跳转到用户请求的界面
})//路由全局拦截:在进入页面之后才进行触发拦截。
router.afterEach(async (to, form) => {//用的比较少,一般用于收集一些日志信息,做用户行为分析:例如:收集页面浏览量:PV
})export default router //导出router路由对象//导出router路由对象

/stores/newsStore.js  状态管理器

import { defineStore } from 'pinia'
import axios from 'axios'
import { computed, ref } from 'vue'const newsStore = defineStore("newsStoreId", () => {const newsList = ref([]);//新增新闻const addNews = (news) => {newsList.value.push({...news}) //{...news} 展开news 将news作为一个新的对象添加到newsList中,否则只是将原先news对象的一个引用给加进去了,现在修改了原先的也将修改}const deleteNews = (title) => {newsList.value = newsList.value.filter(news => news.title !== title);}return {newsList,addNews,deleteNews}})export default newsStore;

vite.config.js 配置文件

import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'import AutoImport from 'unplugin-auto-import/vite'
import Components from 'unplugin-vue-components/vite'
import { ElementPlusResolver } from 'unplugin-vue-components/resolvers'// 自动导入Icon图标
import IconResolver from "unplugin-icons/resolver";
import Icons from "unplugin-icons/vite";// import 'element-plus/es/components/button/style/css'// https://vitejs.dev/config/
export default defineConfig({plugins: [vue(),// 按需引入Element-plus //引入iconAutoImport({resolvers: [ElementPlusResolver({ importStyle: false }), // 组件自动导入IconResolver({ prefix: "icon" }),],}),Components({resolvers: [ElementPlusResolver(),// 组件自动导入IconResolver({//prefix: 'icon',          // 修改Icon组件前缀,不设置则默认为i,禁用则设置为falseenabledCollections: ["ep"] // 指定collection,即指定为elementplus图标集ep}),],}),Icons({ scale: 1, defaultClass: "inline-block", autoInstall: true }),],
})

main.js 注册器

import { createApp } from 'vue'
import './style.css'
import App from './App.vue'import router from "../src/router/index.js" //导入路由js import { createPinia} from 'pinia' //导入状态管理器js const pinia = createPinia();
const app = createApp(App);
app.use(pinia);
app.use(router);app.mount('#app')

相关文章:

Vite Vue3+Element Plus框架布局

App根组件&#xff1a;框架布局 <template><el-container class"layout-container-demo" style"height: 98vh"><!-- 菜单栏 --><el-aside width"200px"><el-scrollbar><!-- router:是否启用 vue-router 模式。…...

【原创】为MybatisPlus增加一个逻辑删除插件,让XML中的SQL也能自动增加逻辑删除功能

前言 看到这个标题有人就要说了&#xff0c;D哥啊&#xff0c;MybatisPlus不是本来就有逻辑删除的配置吗&#xff0c;比如TableLogic注解&#xff0c;配置文件里也能添加如下配置设置逻辑删除。 mybatis-plus:mapper-locations: classpath*:mapper/*.xmlconfiguration:mapUnd…...

ABAP 长文本操作

关联表 1.STXH&#xff1a;长文本抬头表 2.STXL&#xff1a;长文本行表 3.TTXID&#xff1a;Text ID 表 4.TTXOB&#xff1a;Textobject表 5.订单中众多的文本描述&#xff0c;我们怎么知道其对应的【对象】&【ID】呢&#xff1f; 可SE38-通过查找程式&#xff1a;RST…...

C++:哈希表的模拟实现

文章目录 哈希哈希冲突哈希函数 解决哈希冲突闭散列&#xff1a;开散列 哈希 在顺序结构和平衡树中&#xff0c;元素的Key和存储位置之间没有必然的联系&#xff0c;在进行查找的时候&#xff0c;要不断的进行比较&#xff0c;时间复杂度是O(N)或O(logN) 而有没有这样一种方案…...

echarts实现如下图功能代码

这里写自定义目录标题 const option {tooltip: {trigger: axis},legend: {left: "-1px",top:15px,type: "scroll",icon:rect,data: [{name:1, textStyle:{color: theme?"#E5EAF3":#303133,fontSize:14}}, {name: 2, textStyle:{color: theme…...

Java 开源重试类 guava-retrying 使用案例

使用背景 需要重复尝试执行某些动作&#xff0c;guava-retrying 提供了成型的重试框架 依赖 <dependency><groupId>com.github.rholder</groupId><artifactId>guava-retrying</artifactId><version>${retrying.version}</version>…...

服务器 jupyter 文件名乱码问题

对于本台电脑&#xff0c;autodl服务器&#xff0c;上传中文文件时&#xff0c;从压缩包名到压缩包里的文件名先后会出现中文乱码的问题。 Xftp 首先是通过Xftp传输压缩包到Autodl服务器&#xff1a; 1、打开Xftp&#xff0c;进入软件主界面&#xff0c;点击右上角【文件】菜…...

Ubuntu设设置默认外放和麦克风设备

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、pulseaudio 是什么&#xff1f;二、配置外放1.查看所有的外放设备2.设定默认的外放设备3.设定外放设备的声音强度4.设定外放设备静音 三、配置麦克风1.查看…...

【教程】Sqlite迁移到mysql(django)

1、先将sqlite db文件导出sql sqlite3 db.sqlite3 .dump>output.sql db.sqlite3 是 sqlite 数据库文件 output.sql是导出sql文件的名称 2、sql文件转换、处理 sed s/AUTOINCREMENT/AUTO_INCREMENT/g output.sql | sed s/datetime/timestamp/g | sed s/INTEGER/int/g &g…...

【漏洞复现】DPTech VPN存在任意文件读取漏洞

漏洞描述 DPtech是在网络、安全及应用交付领域集研发、生产、销售于一体的高科技企业。DPtech VPN智能安全网关是迪普科技面向广域互联应用场景推出的专业安全网关产品&#xff0c;集成了IPSec、SSL、L2TP、GRE等多种VPN技术&#xff0c;支持国密算法&#xff0c;实现分支机构…...

CentOS 8搭建WordPress

步骤 1: 更新系统 确保你的系统是最新的&#xff0c;使用以下命令更新&#xff1a; bashCopy code sudo dnf update 步骤 2: 安装Apache bashCopy code sudo dnf install httpd 启动Apache&#xff0c;并设置开机自启动&#xff1a; bashCopy code sudo systemctl star…...

服务器安全防护导致使用多款行业顶尖软件搭配使用,还是单独一款解决呢?

如今&#xff0c;在全球各地&#xff0c;数以千计的公司、组织和个人都依赖于服务器来存储和访问重要数据&#xff0c;托管应用程序&#xff0c;以及提供服务。但是&#xff0c;这些服务器不断面临着来自网络黑客的威胁&#xff0c;因此服务器的安全成为了当务之急。 在这种情…...

【Spring篇】Spring注解式开发

本文根据哔哩哔哩课程内容结合自己自学所得&#xff0c;用于自己复习&#xff0c;如有错误欢迎指正&#xff1b; 我在想用一句话激励我自己努力学习&#xff0c;却想不出来什么惊为天人、精妙绝伦的句子&#xff0c;脑子里全是上课老师想说却没想起的四个字 “ 唯手熟尔 ”&am…...

14.(vue3.x+vite)组件间通信方式之pinia

前端技术社区总目录(订阅之前请先查看该博客) 示例效果 Pinia简介 Pinia 是 Vue 的存储库,它允许您跨组件/页面共享状态。 Pinia与Vuex比较 (1)Vue2和Vue3都支持,这让我们同时使用Vue2和Vue3的小伙伴都能很快上手。 (2)pinia中只有state、getter、action,抛弃了Vu…...

DolphinDB 浙商银行 | 第二期现场培训圆满结束

自 DolphinDB 高级工程师计划开展以来&#xff0c;客户们纷纷响应&#xff0c;除了定期收看我们每周三开设的线上公开课外&#xff0c;也有部分客户报名参加了 “总部工程师培训计划” 。 上周&#xff0c;我们迎来了总部培训的第二期学员&#xff1a;来自浙商银行的4位策略研…...

DBS note4:Buffer Management

目录 1、介绍 2、缓冲池 3、处理页面请求 4、LRU替换和时钟策略 1&#xff09;顺序扫描性能 - LRU 5、最近最常使用替换策略&#xff08;MRU Replacement&#xff09; 1&#xff09;Sequential Scanning Performance - MRU 6、练习题 1&#xff09;判断真假 2&#xf…...

Linux 中 .tar 和 tar.gz 的区别

1、前言 有时候你会发现&#xff0c;即便是有些拥有 3 年左右工作经验的运维或开发工程师对 .tar 和 .tar.gz 的区别并不是很清楚。.tar 和 .tar.gz 是在 Linux 系统中用于打包和压缩文件的两种常见格式。它们之间的主要区别在于压缩算法和文件扩展名。 2、区别 .tar .tar 是…...

区域人员超限AI算法的介绍及TSINGSEE视频智能分析技术的行业应用

视频AI智能分析已经渗透到人类生活及社会发展的各个方面。从生活中的人脸识别、停车场的车牌识别、工厂园区的翻越围栏识别、入侵识别、工地的安全帽识别、车间流水线产品的品质缺陷AI检测等&#xff0c;AI智能分析技术无处不在。在某些场景中&#xff0c;重点区域的人数统计与…...

asp.net mvc点餐系统餐厅管理系统

1. 主要功能 ① 管理员、收银员、厨师的登录 ② 管理员查看、添加、删除菜品类型 ③ 管理员查看、添加、删除菜品&#xff0c;对菜品信息进行简介和封面的修改 ④ 收银员浏览、搜索菜品&#xff0c;加入购物车后进行结算&#xff0c;生成订单 ⑤ 厨师查看待完成菜品信息…...

SpringBoot 使用多SqlSessionFactory下的事务问题

如下配置了两个数据源&#xff1a; spring:datasource:ds1:jdbc-url: jdbc:mysql://localhost:3307/spring-boot-demos?serverTimezoneUTC&useUnicodetrue&characterEncodingutf8&useSSLfalse&allowPublicKeyRetrievaltrueusername: rootpassword: passwordd…...

蓝桥杯单片机备赛:手把手教你用DS1302实现一个带暂停/调整功能的电子时钟(附完整代码)

蓝桥杯单片机备赛&#xff1a;手把手教你用DS1302实现一个带暂停/调整功能的电子时钟&#xff08;附完整代码&#xff09; 在蓝桥杯单片机竞赛中&#xff0c;实时时钟模块是常见的基础功能之一。DS1302作为一款经典的时钟芯片&#xff0c;以其简单可靠的特性成为比赛中的热门选…...

AI编程助手插件集:从通用聊天到专业副驾的进化指南

1. 项目概述&#xff1a;一个为AI编程工具量身定制的“插件超市”如果你和我一样&#xff0c;每天都在和Claude Code、Cursor、Codex CLI这些AI编程工具打交道&#xff0c;那你肯定也遇到过类似的烦恼&#xff1a;AI助手写代码时&#xff0c;总喜欢自作主张地过度设计&#xff…...

Taotoken 模型广场如何帮助开发者为新项目选型

Taotoken 模型广场如何帮助开发者为新项目选型 启动一个新项目时&#xff0c;选择合适的模型是技术决策的关键一步。面对市场上众多的模型提供商和复杂的定价体系&#xff0c;开发者往往需要花费大量时间调研。Taotoken 的模型广场功能&#xff0c;正是为了简化这一过程而设计…...

如何用文言编程创建互动游戏体验:wenyan-lang游戏开发完整指南

如何用文言编程创建互动游戏体验&#xff1a;wenyan-lang游戏开发完整指南 【免费下载链接】wenyan 文言文編程語言 A programming language for the ancient Chinese. 项目地址: https://gitcode.com/gh_mirrors/we/wenyan wenyan-lang&#xff08;文言文编程语言&…...

3个关键步骤掌握Blender VRM插件:从零开始创建专业虚拟角色

3个关键步骤掌握Blender VRM插件&#xff1a;从零开始创建专业虚拟角色 【免费下载链接】VRM-Addon-for-Blender VRM Importer, Exporter and Utilities for Blender 2.93 to 5.1 项目地址: https://gitcode.com/gh_mirrors/vr/VRM-Addon-for-Blender 想要在Blender中轻…...

5步攻克ComfyUI-Manager部署难题:AI工作流管理的智能革命

5步攻克ComfyUI-Manager部署难题&#xff1a;AI工作流管理的智能革命 【免费下载链接】ComfyUI-Manager ComfyUI-Manager is an extension designed to enhance the usability of ComfyUI. It offers management functions to install, remove, disable, and enable various cu…...

抖音内容自由:3步解锁批量下载,让创意不再被技术束缚

抖音内容自由&#xff1a;3步解锁批量下载&#xff0c;让创意不再被技术束缚 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fall…...

【个人成长笔记】U盘制作 Ubuntu 20.04 启动盘并为电脑安装 Ubuntu 系统

【个人成长笔记】U盘制作 Ubuntu 20.04 启动盘并为电脑安装 Ubuntu 系统 这篇文章记录一次从 Windows 环境制作 Ubuntu 20.04 启动 U 盘,并通过 U 盘给电脑安装 Ubuntu 系统的完整过程。内容覆盖镜像下载、启动盘制作、从 U 盘启动、系统安装、安装后的基础配置以及常见问题处…...

【MATLAB绘图】三维曲面与二维映射组合图绘制,进阶教程与代码示例

文章目录基础示例&#xff1a;surfsurfsurf 三向等高线投影进阶示例&#xff1a;剖面切割 自定义配色高级示例&#xff1a;22 多子图组合常见问题与技巧基础示例&#xff1a;surfsurfsurf 三向等高线投影 %% 示例1&#xff1a;三维曲面 XY/XZ/YZ 三方向投影 clc; clear; c…...

校招C++20并发系列11-榨干单核算力:SIMD向量化入门与自动优化实战

&#x1f4fa; 配套视频&#xff1a;校招C20并发系列11-榨干单核算力&#xff1a;SIMD向量化入门与自动优化实战 榨干单核算力&#xff1a;SIMD 向量化入门与自动优化实战 在高性能 C 开发中&#xff0c;提升程序性能的手段通常分为两大类&#xff1a;多线程并行和单线程内的指…...