尚硅谷-硅谷甄选项目记录

一、Vue3

1 基础配置
1.1 @ 路径别名

vite.config.ts

import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'// 引入path,node提供的模块,可以获取文件或文件夹的路径
import path from 'path'export default defineConfig({plugins: [vue()],resolve: {alias: {'@': path.resolve('./src')}}
})

tsconfig.json

{"compilerOptions": {// 配置路径别名"baseUrl": "./","paths": {"@/*": ["src/*"]}}
}
1.2 SCSS 全局变量

vite.config.ts

export default defineConfig({// scss全局变量一个配置css: {preprocessorOptions: {scss: {javascriptEnabled: true,additionalData: '@import "./src/styles/variable.scss";',},},},
})
1.3 SVG 使用方式

vite.config.ts

// 配置svg:引入插件
import { createSvgIconsPlugin } from 'vite-plugin-svg-icons'export default defineConfig({plugins: [createSvgIconsPlugin({// 配置svg:指定svg资源目录iconDirs: [path.resolve(process.cwd(), 'src/asstes/icons')],// 配置svg:指定svg资源namesymbolId: 'icon-[dir]-[name]'})]
}

main.ts

// svg插件需要配置代码
import 'virtual:svg-icons-register'

使用

<svg style="width:30px; height:30px"><use xlink:href="#icon-xxx" fill="red"></use>
</svg>
1.4 SVG 全局组件
<svg-icon name="home" color="pihk"></svg-icon>
<!-- @/components/SvgIcon/index.vue --><template><svg :style="{width, height}"><use :xlink:href="prefix + name"></use></svg>
</template><script setup>
import { ref } from 'vue';
const prefix = ref('#icon-')
defineProps({// 名字name: String,// 颜色color:{type: String,defaule: ''},// 宽高width: {type: String,default: '20px'},height: {type: String,default: '20px'}
})
</script>
  • 1、单独引入注册

    main.ts

    import SvgIcon from '@/components/SvgIcon/index.vue'
    app.components('SvgIcon', SvgIcon)
    
  • 2、插件注册,引入components下组件遍历注册

    @/components/index.ts

    import SvgIcon from './SvgIcon/index.vue'const allGloablComponent = { SvgIcon }
    export default{install(app){Object.keys(allGloablComponent).forEach(key => {app.component(key, allGloablComponent[key])})}
    }
    

    main.ts

    //引入自定义插件对象:注册整个项目全局组件
    import gloalComponent from '@/components'
    //安装自定义插件
    app.use(gloalComponent)
    
1.5 EL 全局图标

@/components/index.ts

// 引入全部elmentPlus的图标
import * as ElementPlusIconsVue from '@element-plus/icons-vue'const allGloablComponent = { SvgIcon }
export default{install(app){// 将element-plus的图标全部注册for (const [key, component] of Object.entries(ElementPlusIconsVue)) {app.component(key, component)}}
}

main.ts

// 引入自定义插件对象:注册整个项目全局组件
import gloalComponent from '@/components'
// 安装自定义插件
app.use(gloalComponent)

使用方式

<el-icon> </Edit> </el-icon><el-icon> <component is="Edit"> </el-icon>
2 vue-router路由
2.1 路由跳转
  • 编程式导航

    <script setup lang="ts">import { useRouter } from 'vue-router';const $router = useRouter()const toRoutes = (path) => {$router.push(path)}
    </script>
    
2.2 路由过度
<template><router-view v-slot="{ Component }"><transition name="fade"><component :is="Component" /></transition></router-view>
</template><script setup lang="ts"> </script><style lang="scss" scoped>
// 此为vue3写法,与vue2类名略有不同,根据需求自定义过渡动画
.fade-enter-from {opacity: 0;transform: scale(0);
}.fade-enter-active {transition: all .3s;
}.fade-enter-to {opacity: 1;transform: scale(1);
}
</style>
2.3 路由鉴权

项目当中的各个路由在什么条件下可以访问,什么条件下不可以访问

2.3 element-plus 组件
2.3.1 Menu 菜单折叠图标

问题:在使用 el-menu 菜单的折叠功能时,因为自定义路由和Menu组件,导致图标没有正常显示

解决:将图标组件移出 template 外边

<el-menu-item ><template #title><el-icon> <component :is="meta.icon"></component> </el-icon><span>{{item.children[0].meta.title}}</span></template>
</el-menu-item>
<el-menu-item ><el-icon> <component :is="item.meta.icon"></component> </el-icon><template #title><span>{{item.meta.title}}</span></template>
</el-menu-item>
2.3.2 Menu刷新默认菜单

问题:使用 el-menu 菜单在页面刷新时,已展开的菜单会关闭,

解决:配置 el-menudefault-active 属性,通过 router 将页面路径赋值给他

备注: route 获取页面路径, router 页面跳转,现 $route 以改为宏函数,可以直接在 template 使用,无需引入,若想在 script 中使用,还是得引入

<el-menu :default-active="$route.path"></el-menu>import { useRoute } from 'vue-router'
$route = useRoute()
3 父子组件交互
3.1 defineEmits

vue3 内置 defineEmitsdefinProps 可无需引入直接使用

// son.vue
let $emit = defineEmits(['fn1', 'fn2', ...])const updata = () => {$emit('fn1', { name: '张三', age: '23' })
}// father.vue
<son @fn1="fn1"></son>const fn1 = (name='', age='') => { ... }
3.2 definProps
// father.vue
<son :name="name" :data="data"></son>// son.vue
let props = defineProps({name: {type: String,default: ''},data:{type:Object,default:() => ({ ... })}
})// 或defineProps({name:{type:String,default:''},data:{type:Object,default:() => ({ ... })}
})
3.3 ref
// father.vue
<son ref="son"/>let son = ref(null)
const fn = () => {son.value.fnSon
}// son.vue
const fnSon = () => {// ...
}
defineExpose({ fnSon })

二、TypeScript

1 类型定义
  • @/api/user/index.js

    import request from '@/utils/request'import type {loginFormData,loginResponseData,userInfoReponseData,
    } from './type'enum API {// 登录LOGIN_URL = '/admin/acl/index/login',// 用户信息USERINFO_URL = '/admin/acl/index/info',// 退出登录LOGOUT_URL = '/admin/acl/index/logout',
    }// 登录接口
    export const reqLogin = (data: loginFormData) => request.post<any, loginResponseData>(API.LOGIN_URL, data)// 获取用户信息
    export const reqUserInfo = () =>request.get<any, userInfoReponseData>(API.USERINFO_URL)// 退出登录
    export const reqLogout = () => request.post<any, any>(API.LOGOUT_URL)
    
  • @/api/user/type.ts

    // 请求携带参数类型
    export interface loginFormData {username: string,password: string
    }// 基础接口返回数据类型
    export interface Response {code: number|string,message?: string,ok?: boolean
    }// 登录接口 返回数据类型
    export interface loginResponseData extends Response {data: string
    }// 用户信息接口 返回数据类型
    export interface userInfoReponseData extends Response {data: {routes: string[]buttons: string[]roles: string[]name: stringavatar: string}
    }
    

三、JavaScrpt

1 对象数组过滤对象
let objectsArray = [  { a: 1, b: 'one' },  { a: 2, b: 'two' },  { a: 3, b: 'three' },  { a: 2, b: 'anotherTwo' }
];  let valueToRemove = 2; // 这是你想从对象中过滤掉的属性 a 的值  objectsArray = objectsArray.filter(obj => obj.a !== valueToRemove);  console.log(objectsArray);  
// 输出: [ { a: 1, b: 'one' }, { a: 3, b: 'three' } ]
2 对象数组的对象的属性名修改
imgList = res.data.map(item => {return{name: item.imgName,url: item.imgUrl}
})
3 Object.assign

Object.assign() 将所有可枚举的属性的值从一个或多个源对象复制到目标对象(第一个参数),具有相同属性的话,会按顺序进行覆盖,并返回目标对象

let a = reactive({ x: 1, y: 2 })let b = { y: 3, z: 4 }let c = { z: 3 }let newA = Object.assign(a, b, c)   console.log(a, a===newA) 	// { x: 1, y: 3, z: 3 }  true// 在vue3中,如使用解构赋值的方法,会产生新的对象,会导致失去数据代理
a = {...a, ...b, ...c}
4 request.ts

@/utils/request.ts

import axios from 'axios'
import { ElMessage } from 'element-plus'
//引入用户相关的仓库
import useUserStore from '@/store/modules/user'const request = axios.create({//基础路径(在项目根目录下设置)baseURL: import.meta.env.VITE_APP_BASE_API,//超时的时间的设置timeout: 5000,
})// 请求拦截器
request.interceptors.request.use((config) => {if(useUserStore().token){config.headers.token = useUserStore().token}return config
})// 响应拦截器
request.interceptors.response.use((response) => {// 成功回调,简化数据return response.data},(error) => {// 失败回调:处理http网络错误let message = ''// http状态码const status = error.response.statusswitch (status) {case 401:message = 'TOKEN过期'breakcase 403:message = '无权访问'breakcase 404:message = '请求地址错误'breakcase 500:message = '服务器出现问题'breakdefault:message = '网络出现问题'break}//提示错误信息ElMessage({type: 'error',message,})return Promise.reject(error)},
)export default request

四、业务实现

  • 左侧菜单缩放通过仓库变量(true/false)进行管理

  • 刷新:通过v-ifnextTick仓库 实现刷新(销毁重建)

  • 全屏状态:通过document.fullscreenElement设置全屏状态

  • 自动刷新:window.location.reload(),用户修改自身账号或密码之后,调用方法自动刷新

  • 展示角色权限:例,后端返回全部权限,其中该角色拥有的权限的select:true,修改时需要把新的权限对象给后端(父级的id和权限值 + 子级的id和权限值 + …), <el-tree> 提供获取选中的节点的数组,修改完调用刷新方法

    一级二级三级四级
    1、全部数据
    1.1、权限管理
    1.1.1、用户管理
    1.1.1.1、添加用户
    1.1.1.2、删除用户
    1.1.1.3、修改用户
    1.1.2、菜单管理
    1.2、商品管理
    {"id": 1,"name": "全部数据","level": 1,"children": [{"id": 7,"name": "权限管理","level": 2,"children": [{"id": 8,"name": "用户管理","level": 3,"children": [{"id": 11,"name": "添加用户","level": 4,"children": [],"select": false},{"id": 12,"name": "删除用户","level": 4,"children": [],"select": false}],"select": false},{"id": 10,"name": "菜单管理","level": 3,"children": [],"select": false}],"select": false}],"select": true
    }
    
    const setPermisstion = async (id) => {let result = await reqAllMenuList(id);if (result.code == 200) {// 全部权限menuArr.value = result.data;// 拥有的权限selectArr.value = filterSelectArr(menuArr.value, []);}
    }const filterSelectArr = (allData, initArr) => {allData.forEach((item) => {// 如最后一级的权限的是第四级(遍历完其最低级的权限,即可通过<el-tree>自动判断)if (item.select && item.level == 4) {initArr.push(item.id);}if (item.children && item.children.length > 0) {filterSelectArr(item.children, initArr);}})return initArr;
    }
    

五、备注

  • 在平时写代码的时候,为实现某个功能,感觉自己写的代码很冗余,可以试试将代码交于 ai ,让其优化一下,说不定 JS官方 已经提供了便捷语法糖(如:ES6+新增的语法糖),或者 AI 有更加便捷的实现思路

  • 背景图片

    .contaiter{background: url('@/xxx/xxx.jpg') no-repeat;backgorund-size: cover;
    }
    

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

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

相关文章

ThinkPHP5 case when的使用

主表的类型不同&#xff0c;需要连接查询不同的表时&#xff0c;可以使用case when 在主表(上面的表中)的模型里面&#xff0c;写如下代码来获取列表&#xff1a; $res $this->alias("p")->field([p.*,"CASE WHEN p.pd_ticket_type 1 THEN (select s.s…

Android 10.0 SharedPreferences in credential encrypted storage are not avai

1.前言 在10.0的系统rom定制化开发中,在开机的过程中,由于某些应用在开机解锁阶段就开始访问查询短信和联系人等功能,所以 会出现抛异常的情况出现,接下来分析下相关的情况,然后来解决这些问题 2.SharedPreferences in credential encrypted storage are not available …

LeetCode[102]二叉树的层序遍历

思路&#xff1a; 题目描述从左到右一层一层的进行遍历&#xff0c;就遍历二叉树的这种题我更喜欢用递归来做&#xff0c; 我使用java来做的&#xff0c;结果集是两个List集合&#xff0c;那么我们是不是应该每到新的一层就给这个结果集添加一个内部的List&#xff0c;那么怎么…

二种MVCC对比分析

文章目录 前言MVCCInnodb的MVCC版本链回滚与提交可见性判断 Oracle的MVCC版本链 PostgreSQL的MVCCMVCC实现可见性判断特点 前言 ​ MVCC&#xff08;多版本并发控制&#xff0c;Multi-Version Concurrency Control&#xff09;是一种数据库管理系统&#xff08;DBMS&#x…

FAST-LIO笔记

1.FAST-LIO FAST-LIO 是一个计算效率高、鲁棒性强的激光-惯性里程计系统。该系统通过紧耦合的迭代扩展卡尔曼滤波器&#xff08;IEKF&#xff09;将激光雷达特征点与IMU数据进行融合&#xff0c;使其在快速运动、噪声较大或环境复杂、存在退化的情况下仍能实现稳定的导航。 1…

C++并发编程完全指南:从基础到实践

在当今多核处理器普及的时代&#xff0c;充分利用硬件并发能力已成为高性能编程的关键。C11引入的现代并发编程支持使得开发者能够以标准化、可移植的方式编写多线程程序。本文将全面介绍C并发编程的各个方面&#xff0c;从基础概念到实际应用&#xff0c;帮助您掌握这一重要技…

如何使用docker配置ros-noetic环境并使用rviz,gazebo

参考链接&#xff1a;【Ubuntu】Docker中配置ROS并可视化Rviz及Gazebo_docker ros-CSDN博客 前言&#xff1a; 其实这个东西是相当必要的&#xff0c;因为我们有时候需要在一台电脑上跑好几个项目&#xff0c;每个项目都有不同的依赖&#xff0c;这些依赖冲突搞得人头皮发麻&…

使用 Java 11 的 HttpClient 处理 RESTful Web 服务

在现代 Web 开发中,与 RESTful Web 服务交互是一项核心任务。Java 作为一种广泛使用的编程语言,提供了多种处理 HTTP 请求的方法。在 Java 11 之前,开发者通常使用 HttpURLConnection 或第三方库(如 Apache HttpClient)。然而,这些方法要么过于底层,要么需要额外依赖。J…

JVM——垃圾回收

垃圾回收 在Java虚拟机&#xff08;JVM&#xff09;的自动内存管理中&#xff0c;垃圾回收&#xff08;Garbage Collection, GC&#xff09;是其核心组件之一。它负责回收堆内存中不再使用的对象所占用的内存空间&#xff0c;以供新对象的分配使用。下面我们将深入探讨JVM中的…

经典密码学算法实现

# AES-128 加密算法的规范实现&#xff08;不使用外部库&#xff09; # ECB模式S_BOX [0x63, 0x7C, 0x77, 0x7B, 0xF2, 0x6B, 0x6F, 0xC5, 0x30, 0x01, 0x67, 0x2B,0xFE, 0xD7, 0xAB, 0x76, 0xCA, 0x82, 0xC9, 0x7D, 0xFA, 0x59, 0x47, 0xF0,0xAD, 0xD4, 0xA2, 0xAF, 0x9C, 0x…

追踪大型语言模型的思想(下)(来自针对Claude的分析)

多步推理 正如我们上面所讨论的&#xff0c;语言模型回答复杂问题的一种方式就是简单地记住答案。例如&#xff0c;如果问“达拉斯所在州的首府是哪里&#xff1f;”&#xff0c;一个“机械”的模型可以直接学会输出“奥斯汀”&#xff0c;而无需知道德克萨斯州&#xff0c;达拉…

【Hive入门】Hive增量数据导入:基于Sqoop的关系型数据库同步方案深度解析

目录 引言 1 增量数据导入概述 1.1 增量同步与全量同步对比 1.2 增量同步技术选型矩阵 2 Sqoop增量导入原理剖析 2.1 Sqoop架构设计 2.2 增量同步核心机制 3 Sqoop增量模式详解 3.1 append模式&#xff08;基于自增ID&#xff09; 3.2 lastmodified模式&#xff08;基…

[Windows] 蓝山看图王 1.0.3.21021

[Windows] 蓝山看图王 链接&#xff1a;https://pan.xunlei.com/s/VOPejo0dRLFd38dbpR7XA6djA1?pwddq9v# 由蓝山软件出品的一款免费高清看图软件&#xff0c;支持快速查看高清大图&#xff0c;支持大部分市面图片格式。 软件特点 1、体积小巧&#xff0c;图像显示效果清晰…

通配符 DNS 记录:应用场景与相关风险

随着组织的互联网基础设施不断扩展&#xff0c;其对配置、设置和决策的需求也随之增加——从选择一个可靠的名称服务器&#xff0c;到确定合适的 DNS 记录类型以及设置合适的 TTL&#xff08;生存时间&#xff09;值。其中一项关键决策就是是否要创建通配符 DNS 记录&#xff0…

快速上手知识图谱开源库pykeen教程指南(一)

文章目录 1 前情提要1.1 AmpliGraph 和 PyKEEN 对比介绍1.2 TransE、ConvE、RotatE几款模型的差异 2 直接上案例2.1 数据载入&#xff1a;TriplesFactory2.2 模型训练2.2.1 训练信息2.2.2 TransE模型可以降维实体、关系的关系 2.3 模型保存与加载、评估2.3.1 保存与模型加载2.3…

飞搭系列 | 获取弹窗数据,轻松实现回填

前言 飞搭低代码平台&#xff08;FeiDa&#xff0c;以下简称“飞搭”&#xff09;&#xff0c;为企业提供在线化、灵活的业务应用构建工具&#xff0c;支持高低代码融合&#xff0c;助力企业低门槛、高效率和低成本地快速应对市场变化&#xff0c;加速复杂业务场景落地。 概要…

Linux如何安装AppImage程序

Linux如何安装AppImage程序 文章目录 Linux如何安装AppImage程序 在 Linux 中&#xff0c;.AppImage 是一种便携式的应用程序格式&#xff0c;无需安装即可运行。 1.赋予该文件可执行权限 可以使用下列命令&#xff0c;赋予可执行权限 # 举个例子 chmod x /path/to/MyApp.App…

云硬盘的原理

云硬盘是云计算环境中的一种存储服务&#xff0c;其原理主要涉及数据存储、数据冗余与容错、性能优化以及数据安全等方面&#xff0c;以下是具体介绍&#xff1a; 数据存储 逻辑卷管理&#xff1a;云硬盘通常会将物理存储设备划分为多个逻辑卷&#xff0c;每个逻辑卷可以独立地…

使用 pgrep 杀掉所有指定进程

使用 pgrep 杀掉所有指定进程 pgrep 是一个查找进程 ID 的工具&#xff0c;结合 pkill 或 kill 命令可以方便地终止指定进程。以下是几种方法&#xff1a; 方法1&#xff1a;使用 pkill&#xff08;最简单&#xff09; pkill 进程名例如杀掉所有名为 “firefox” 的进程&…

堆排序(算法题)

#include <bits/stdc.h> using namespace std;const int N 100010; // 堆数组的最大容量 int h[N], s; // h[]存储堆元素&#xff0c;s表示当前堆的大小// 下沉操作&#xff1a;调整以i为根的子树&#xff0c;维护小顶堆性质 void down(int i) {int t i; /…