Vue3 后台管理系统项目 前端部分

news/2024/9/18 12:46:33/ 标签: 前端

这里写目录标题

  • 1 创建Vue3项目
    • 1.1 相关链接
    • 1.2 Vue Router
    • 1.3 Element
    • 1.4 scss
    • 1.5 mitt
    • 1.6 axios
    • 1.7 echarts
    • 1.8 配置vite.config.js
  • 2 CSS部分
    • 2.1 样式穿透
    • 2.2 `:style` :在样式中使用插值语法
  • 3. ElementUI
    • 3.1 rules: 数据验证
    • 3.2 修改element.style中的样式
      • 3.2.1 组件中的一个样式对应到浏览器中发生很大变化
    • 3.3 分页器
    • 3.4 `<el-image>`使用本地图片
  • 4. 使用svg图标
  • 5. 富文本编辑器
    • dialog的Html部分
    • js代码部分
    • 父组件中部分
  • 6.js部分
    • 6.1 解构数组,成为一个新数组
    • 6.2 Promise
      • 与async 、await配合使用
    • 6.2 every()和some()
      • 6.2.1 every()
      • 6.2.2 some()
      • 6.2.3 与filter()组合使用
  • 7 Vue 部分
    • 7.1 `<component :is=''>`
    • 7.2 给class动态添加属性
    • 7.3 页面全屏
    • 7.4 进度条

1 创建Vue3项目

1.1 相关链接

视频链接

视频配套文章

gitee代码

1.2 Vue Router

vue官网关于router的部分

// @/router/index.jsimport { createRouter , createWebHashHistory } from "vue-router";
const routes = [
]
const router = createRouter({history: createWebHashHistory(),routes: routes,
})
export default router
// @/main.js
import { createApp } from 'vue'
import App from './App.vue'
import router from '@/router/index'const app = createApp(App)
app.use(router)//  注册路由
app.mount('#app')

1.3 Element

官网
组件

npm install element-plus -D -S

图标库

npm install @element-plus/icons-vue -D -S
import { createApp } from 'vue'
import App from './App.vue'
// 导入自定义的路由
import router from '@/router/index'
// 导入element组件
import ElementPlus from 'element-plus'
import 'element-plus/dist/index.css'
// 导入element图标
import * as ElementPlusIconsVue from '@element-plus/icons-vue'
// element组件的国际化
import zhCn from 'element-plus/dist/locale/zh-cn.mjs'const app = createApp(App)for (const [key, component] of Object.entries(ElementPlusIconsVue)) {app.component(key, component)
}
app.use(router)
app.use(ElementPlus, {locale: zhCn,
})
app.use(ElementPlus)app.mount('#app')

1.4 scss

Vue3安装scss教程

npm install sass-loader -S
npm install style-loader -S
npm install sass -S
// 文件在工程项目的根路径下 vite.config.js
export default defineConfig({plugins: [vue()],// 这个是配置scsspluginOptions: {'style-resources-loader': {preProcessor: 'scss',patterns: []}},
})

1.5 mitt

Vue3:mitt快速上手

npm install mitt -S -D
// @/utils/mitt.js
import mitt from 'mitt'
export const emitter = mitt()

1.6 axios

npm install axios -S -D
// @/http/index.js
import axios from "axios";const instance = axios.create({baseURL: 'http://localhost:5173/',timeout: 1000,headers: {'Content-Type': 'application/x-www-form-urlencoded'}
});// 添加请求拦截器
instance.interceptors.request.use(function (config) {// 在发送请求之前做些什么return config;
}, function (error) {// 对请求错误做些什么return Promise.reject(error);
});// 添加响应拦截器
instance.interceptors.response.use(function (response) {// 2xx 范围内的状态码都会触发该函数。// 对响应数据做点什么return response;
}, function (error) {// 超出 2xx 范围的状态码都会触发该函数。// 对响应错误做点什么return Promise.reject(error);
});export default instance// 发送请求
const data = {key1 : value1,key2 : value2}
instance.post('/api/register', data)
// 将data发送到http://localhost:5173/api/register
// 服务器端就会接收到post请求,携带data数据

1.7 echarts

官网

npm install echarts -S -D

1.8 配置vite.config.js

// 在项目目录的根路径下,vite.config.js 
// 在plugins下增加一下配置server:{port: 8080, // 端口号open: true, // 自动打开浏览器cors: true, // 允许跨域}

2 CSS部分

2.1 样式穿透

使用了element-plus中的Tabs 标签页
在这里插入图片描述

在style中添加scoped

  1. 代码中class=’demo-tabs‘在编译后在样式的选择器后面添加属性选择器,实现了组件样式的私有化,里面的元素在编译后很明显没有data-v-2b2fc29这个属性
    .el-tabs__item{color: #333;font-size:18px}
  1. 使用上面的代码给.el-tabs__item修改属性,发现它没有data属性,需要使用样式穿透
    在这里插入图片描述
    使用了:deep样式穿透后,就能修改该元素的属性了
    :deep(.el-tabs__item){color: #333;font-size:18px}

2.2 :style :在样式中使用插值语法

<div :style="{backgroundColor:$a.todo?'red':'blue'}"></div>

3. ElementUI

3.1 rules: 数据验证

model和prop的值是由数据的变量决定的
在这里插入图片描述
在这里插入图片描述

3.2 修改element.style中的样式

通过修改elementUi组件的样式发现,在官网组件的下面,如果提供了样式的属性则通过该属性修改,如果没有提供,通过style修改,如果通过style无法修改,最好就不要动了,组件会有默认的样式,自己在<style>中修改可能只修改了表面,有些会冲突,比较麻烦
在这里插入图片描述
加上!importantdeep没有用

.el-menu{--el-menu-hover-bg-color:#2d333b !important;
}

3.2.1 组件中的一个样式对应到浏览器中发生很大变化

这是一个导航的组件,在el-menu中没有添加颜色等样式时,对应的浏览器中也什么都没有
在这里插入图片描述
当在el-menu中添加了3个样式后,浏览器中增加了5项样式
在这里插入图片描述
而在<style>中添加的样式,在组件中的某一部分样式不会起作用,达不到在标签中添加样式的效果,所以如果能在组件中添加的样式就不要在

3.3 分页器

  • 分页器的html部分
<template><el-paginationstyle="margin-top: 10px"v-model:current-page="currentPage"v-model:page-size="pageSize":page-sizes="[10, 20, 30, 40]"layout=" prev, pager, next, jumper,->,total, sizes":total="totalPage"@size-change="handleSizeChange"@current-change="handleCurrentChange"/>
</template>
	 style="margin-top: 10px" // 设置与上面表格部分的间隔v-model:current-page="currentPage" // 当前页页码,发生改变时触发@current-change的回调函数v-model:page-size="pageSize"	// 每页显示条目个数:page-sizes="[10, 20, 30, 40]"	// 每页显示个数选择器的选项设置,发生改变时page-size发生变化,触发@size-change的回调函数layout=" prev, pager, next, jumper,->,total, sizes" // 设置分页器的布局:total="totalPage"	// 总条目数@size-change="handleSizeChange" // 每页显示的条目数有变化时触发该方法@current-change="handleCurrentChange" // 当前页有变化时触发
  • 分页器代码部分
<script setup lang="ts">
import { ref } from 'vue'
/**分页器相关 */
const currentPage = ref(1) // 当前页
const pageSize = ref(10) // 每页显示条目个数
const totalPage = ref(0) // 总条数
/*** @function  页码发生改变时调用该方法,默认跳转到第一页* @param {number} current 传入跳转到第几页,默认第一页。如要保持页面不变,传入currentPage.value*/
async function requestPage(current: number = 1) {// 参数的页码数大于总页数时,跳转到最后一页if (current > Math.ceil(totalPage.value / pageSize.value)) {currentPage.value = Math.ceil(totalPage.value / pageSize.value)} else {currentPage.value = current}// 根据当前页和每页显示多少条,请求数据const result = await request()//发送请求if (result.code === 200) {pageSize.value = result.data.sizetotalPage.value = result.data.total}
}
// 加载该组件时,运行该方法
requestPage()
/*** @callback sizeChange 每页显示条目个数发生改变时调用该方法*/
function handleSizeChange() {requestPage(currentPage.value)
}
/*** @callback currentChange 页码发生改变时调用该方法*/
function handleCurrentChange() {requestPage(currentPage.value)
}
</script>

3.4 <el-image>使用本地图片

Vue3+TypeScript+Vite如何使用require动态引入类似于图片等静态资源

<el-image :src="url"/>const url = new URL('../images/dataScreen-header-btn-bg-r.png', // 本地图片的路径import.meta.url,
).href

4. 使用svg图标

vue3使用svg图标 多种方式

  1. 以阿里巴巴的图标举例

  2. 复制图标的svg代码
    在这里插入图片描述

  3. 新建个存放svg图标的目录,新建.vue文件
    在这里插入图片描述

  4. <template>标签内粘贴svg的代码

<template><svg t="1700026328900" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="4071" width="200" height="200"><path d="M512 128a288.64 288.64 0 0 1 288 288c0 132.48-203.52 384-288 465.28-84.48-78.72-288-332.8-288-465.28A288.64 288.64 0 0 1 512 128m0-64a352 352 0 0 0-352 352c0 192 320 544 352 544s352-349.44 352-544A352 352 0 0 0 512 64z" fill="#2C2C2C" p-id="4072"></path><path d="M512 576a160 160 0 1 1 160-160A160 160 0 0 1 512 576z m0-256a96 96 0 1 0 96 96A96 96 0 0 0 512 320z" fill="#2C2C2C" p-id="4073"></path><path d="M256 896m32 0l448 0q32 0 32 32l0 0q0 32-32 32l-448 0q-32 0-32-32l0 0q0-32 32-32Z" fill="#2C2C2C" p-id="4074"></path></svg>
</template>
  1. 在代码中也可以调整颜色和大小
    在这里插入图片描述

  2. 使用

<template><-- 假装这里有代码--><navigation-icon class="icon"></navigation-icon><-- 假装这里也有代码-->
</template><--设置样式,调整大小等,这里无法调整颜色-->.icon {width: 24px;height: 24px;margin-right: 8px;}
  1. svg做的图标要独占一行,使用布局将它安排到合适的地方

5. 富文本编辑器

wangEditor官网
可以设置的内容太多,详细看官网

  1. 安装
npm install @wangeditor/editor --save
npm install @wangeditor/editor-for-vue@next --save
  1. 配合dialog成为弹窗式的编辑器

dialog的Html部分

<template><el-dialogv-model="dialogVisible":title="dialogTips"width="50%":before-close="handleClose">
<!--        editor 部分--><div style="border: 1px solid #ccc"><Toolbarstyle="border-bottom: 1px solid #ccc":editor="editorRef":defaultConfig="toolbarConfig":mode="mode"/><Editorstyle="height: 500px; overflow-y: hidden;"v-model="valueHtml":defaultConfig="editorConfig":mode="mode"@onCreated="handleCreated"/></div>
<!--        editor 部分结束--><template #footer><span class="dialog-footer"><el-button @click="dialogVisible = false">取消编辑</el-button><el-button type="primary" @click="uploadEditor">提交</el-button></span></template></el-dialog>
</template>

js代码部分

  1. 重点:valueHtml这个数据,它就是编辑区的内容
  2. 一般来说在显示editor时,要显示上一次的内容,在编辑完成后,将内容传到某个地方保存
  3. 虽然代码比较多,关键的地方是dialog的显示和关闭valueHtml的读取和保存,这四个地方需要编写,其他都是样式的设置等等不重要的东西
<script setup lang="ts">import '@wangeditor/editor/dist/css/style.css' // 引入 cssimport { Editor, Toolbar } from '@wangeditor/editor-for-vue'import {onBeforeUnmount, onMounted, ref, shallowRef} from "vue";// 从这里开始是dialog的代码import {ElMessage, ElMessageBox} from "element-plus";// dialog可见/不可见const dialogVisible = ref(false)// dialog的titleconst dialogTips = ref('我是dialog的标题')// dialog右上角的'X'const handleClose = (done: () => void) => {ElMessageBox.confirm('你确定要关闭编辑器吗?').then(() => {done()}).catch(() => {// catch error})}// 传递给父组件的stateconst dilogData = ref()// 传递给父组件的方法function dialogVisibleFun() {dialogVisible.value = true // 显示dialog}// 向父组件传递一个方法,这个方法用于父组件调用dialog,也就是dialog显示defineExpose({dialogVisibleFun,dilogData // 这个数据在示例里作用:编辑区显示上次的编辑内容})// dialog代码到这里结束// editor实例,必须用 shallowRefconst editorRef = shallowRef()// 编辑区的内容,属于editor的部分const valueHtml = ref()// 编辑器默认的模式,或'simple'const mode = ref('default')// 编辑区可能要显示上一次的编辑内容,这里给个示例onMounted(() => {setTimeout(() => {// 我这里假装内容dilogData是从父组件传来的,在这里内容也可以从数据库查询valueHtml.value = dilogData}, 1500)})// 工具栏配置,excludeKeys排除某些配置const toolbarConfig = {excludeKeys: []}// 工具栏显示的菜单,写菜单组 key 的值即可,写在下面的就是不再工具栏显示的toolbarConfig.excludeKeys = ['blockquote','bgColor','color','group-more-style','fontFamily','bulletedList','numberedList','lineHeight','todo','emotion','insertLink','group-video','insertTable','codeBlock','divider','fullScreen',// 'group-image',]// 工具栏中的菜单点击后产生什么效果,都可以在这里编辑,这里演示的是上传图片功能const editorConfig = { placeholder: '请输入内容...' ,MENU_CONF : {// 配置上传图片'uploadImage':{server: 'http://127.0.0.1:3007/editor/uploadEditor',maxFileSize: 1 * 1024 * 1024,methods: 'post',fieldName: 'file', //上传文件名metaWithUrl: true, // 参数拼接到 url 上customInsert(res, insertFn) {//insertFn方法一执行,就会给编辑区添加该参数中的内容insertFn(res.data.url)},}}}// 点击确定按钮,向数据库或别的地方提交编辑区的内容,这里也是示例const uploadEditor = ()=> {(async ()=>{if('条件判定,比如服务器返回成功'){// 提交成功则关闭dialogdialogVisible.value = falseElMessage({message: '提交成功',type: 'success',})}else{ElMessage({message: '提交失败,请另存编辑区的内容,以免丢失',type: 'error',})}})()}// 组件销毁时,也及时销毁编辑器onBeforeUnmount(() => {const editor = editorRef.valueif (editor == null) returneditor.destroy()})const handleCreated = (editor) => {editorRef.value = editor // 记录 editor 实例,重要!}</script>

父组件中部分

  1. 在html部分添加组件,设置ref属性,有按钮点击显示dialog
<wangEditor ref="wangEditorVue"></wangEditor><el-button class="corporate-name-button" type="primary" plain @click="dialogVisable">编辑</el-button>
  1. script部分
const wangEditorVue = ref()
const dialogVisable = ()=>{wangEditorVue.value.dialogVisibleFun()wangEditorVue.value.dilogData = '编辑区显示上一次的内容'
}

6.js部分

6.1 解构数组,成为一个新数组

<script setup>
const a = [{"id": 1,"set_name": "swiper1",
},
{"id": 2,"set_name": "swiper2",
},
{"id": 3,"set_name": "swiper3",
}]
const [first,...intro] = a
console.log(first)
console.log(intro)
</script>

结果:
在这里插入图片描述

6.2 Promise

Promise用于表示一个异步操作的最终完成(或失败)及其结果值。

  • resolve和reject是两个回调函数,resolve()执行会触发then,reject()执行会触发catch,从而改变Promise到稳定状态,并且两个函数只能执行一个
<script>
new Promise((resolve, reject) =>{setTimeout(() =>{//成功的时候调用resolveresolve('成功data')//失败的时候调用reject//reject('error message')}, 1000)
}).then((data) =>{//处理成功后的逻辑console.log(data);//这个data 是接收的resolve参数--
}).catch((err) =>{console.log(err);
})
</script>  
// 结果:成功data
<script>
new Promise((resolve, reject) =>{setTimeout(() =>{//成功的时候调用resolve//resolve('成功data')//失败的时候调用rejectreject('error message')}, 1000)
}).then((data) =>{//处理成功后的逻辑console.log(data);//这个data 是接收的resolve参数--
}).catch((err) =>{console.log(err);
})
</script>  
// 结果:error message
  • 在一个promise链中,只要任何一个promise被reject,promise链就被破坏了,reject之后的promise都不会再执行,而是直接调用.catch方法。

与async 、await配合使用

  • 使用await调用Promise,假如Promise中有then方法,则会执行then方法,返回值为undefined
<script setup lang="ts">
function doubleAfter2seconds(num: number): Promise<number | void> {return new Promise((resolve, reject) => {setTimeout(() => {resolve(2 * num)}, 0)}).then((result) => {// resolve会执行then方法,result就是resolve传过来的参数(2 * num)console.log('doubleAfter2seconds方法中:' + result)})
}async function testResult() {// 不使用await修饰,得到的函数返回值就是Promise对象let result = doubleAfter2seconds(30)console.log('testResult方法中不使用await修饰:')console.log(result)//使用await修饰,并且Promise中使用then方法,则函数返回值是undefinedlet result1 = await doubleAfter2seconds(30)console.log('使用await修饰后:' + result1)
}
testResult()
</script>

代码执行结果:
在这里插入图片描述

  • 在Promise中不使用then方法,会返回resolve方法中的参数
<script setup lang="ts">
function doubleAfter2seconds(num: number): Promise<number | void> {return new Promise((resolve, reject) => {setTimeout(() => {resolve(2 * num)}, 0)})
}async function testResult() {// 不使用await修饰,得到的函数返回值就是Promise对象let result = doubleAfter2seconds(30)console.log('testResult方法中不使用await修饰:')console.log(result)//使用await修饰,并且Promise中不使用then方法,则函数返回值就是Promise的resolve中的参数let result1 = await doubleAfter2seconds(30)console.log('使用await修饰后:' + result1)
}
testResult()
</script>

在这里插入图片描述

6.2 every()和some()

6.2.1 every()

一个数组中的所有元素 是否都满足给定的条件,只要有一个不满足返回false

const smallList = [0, 1, 2]
const result = smallList.every((item) => {return item == 0
})
console.log('result', result)
const smallList = [0, 1, 2]
const result = smallList.every((item) => {return item != 0
})
console.log('result', result)

以上两端代码result的结果都是false

6.2.2 some()

数组中只要有一个元素满足条件,返回true

const smallList = [0, 1, 2]
const result = smallList.some((item) => {return item != 0
})
console.log('result', result)
const smallList = [0, 1, 2]
const result = smallList.some((item) => {return item == 0
})
console.log('result', result)

上面两段代码中result的结果都是true

6.2.3 与filter()组合使用

给定两个数组

  1. 筛选出bigList中有,且smallList中没有的元素
  2. 筛选出bigList中有,且smallList中也有的元素,交集
const bigList = [0, 1, 2, 3, 4, 5]
const smallList = [0, 1, 2]
  • 使用every()
// 筛选出`bigList`中有,且`smallList`中没有的元素
const list = bigList.filter((item) => {let a = smallList.every((item1) => {return  item1 != item      })return a
})
console.log(list)
// [3, 4, 5]
// 筛选出`bigList`中有,且`smallList`中也有的元素,交集
const list = bigList.filter((item) => {let a = smallList.every((item1) => {return item1 != item})return !a
})
console.log(list)
// [0, 1, 2]
  • 使用some()时,此处的判断条件不能使用!=
// 筛选出`bigList`中有,且`smallList`中也有的元素,交集
const list = bigList.filter((item) => {let a = smallList.some((item1) => {return item1 === item})return a
})
console.log(list)
// [0, 1, 2]
// 筛选出`bigList`中有,且`smallList`中没有的元素
const list = bigList.filter((item) => {let a = smallList.some((item1) => {return item1 === item})return !a
})
console.log(list)
// [3, 4, 5]

7 Vue 部分

7.1 <component :is=''>

  • 效果:点击图标,交替更换图标
// html部分
<el-icon  @click='changeIcon'><component :is="isFold ? 'Fold' : 'Expand'"></component>
</el-icon>
// js部分import { ref } from 'vue'
const isFold = ref(false)
const changeIcon = () => {isFold = !isFold
}

7.2 给class动态添加属性

<divclass="layout_slider":class="{ Fold: isFold }"
></div>
// 当isFold 位ture时,class中多了Fold属性
<div class="layout_slider Fold"></div>
// 当isFold 位false时,class中没有Fold属性
<div class="layout_slider"></div>

7.3 页面全屏

  • 使用dom操作
const fullScreen = () => {// 全屏则返回ture,不是全屏则返回noneconst full = document.fullscreenElementif (full) {document.exitFullscreen()} else {document.documentElement.requestFullscreen()}
}

7.4 进度条

  1. 安装进度条插件
pnpm i nprogress
  1. 在路由守卫中使用
// 路由鉴权:项目中的路由在什么条件可以访问,什么条件不能访问
import router from '@/router/index.ts'
// 进度条插件,爆红,要在vite-env.d.ts中声明
import nprogress from 'nprogress'
// 进度条样式,在文件node_modules/nprogress/nprogress.css中修改样式
import 'nprogress/nprogress.css'
// 全局守卫:项目当中任意路由切换都会触发的钩子
// 全局前置守卫
router.beforeEach((to, from, next) => {nprogress.start()next()
})
// 全局后置守卫
router.afterEach((to, from) => {nprogress.done()
})
  1. 作为全局的进度条,该文件需在main中引入
import './permisstion'

http://www.ppmy.cn/news/1516463.html

相关文章

信号分解|基于北方苍鹰优化变分模态分解的时序信号分解Matlab程序NGO-VMD

信号分解|基于北方苍鹰优化变分模态分解的时序信号分解Matlab程序NGO-VMD 文章目录 一、基本原理二、实验结果三、核心代码四、代码获取五、总结 信号分解|基于北方苍鹰优化变分模态分解的时序信号分解Matlab程序NGO-VMD 一、基本原理 NGO-VMD结合了北方苍鹰优化算法&#xff…

移动端爬虫学习记录

免责声明 本文旨在探讨移动端爬虫技术的应用和挑战&#xff0c;仅供教育和研究用途。请确保在合法合规的框架内使用爬虫技术&#xff0c;遵循相关法律法规和网站的使用条款。作者不对因使用本文内容而产生的任何法律或安全问题承担责任。 1、初识移动端爬虫 学习移动端爬虫的原…

7. Java 中 HashMap 的扩容机制是怎样的?

​​​​​​HashMap 是基于哈希表的数据结构&#xff0c;其容量是动态调整的。当存储的元素数量增加时&#xff0c;为了保持较好的性能&#xff0c;HashMap 需要进行扩容。HashMap 的扩容机制是为了减少哈希碰撞&#xff0c;提高查询效率。 1. 初始容量和负载因子 初始容量&a…

Android 退出app方式(回忆录)

一、点击返回键或者设备back键调用finish private void back(){finish(); }或Overridepublic void onBackPressed() {super.onBackPressed();}二、结束进程 android.os.Process.killProcess(android.os.Process.myPid()); 三、方法二exit结束java虚拟机 System.exit(0); 四…

uniapp中路由的基本使用方法、参数传递方式以及路由拦截与权限控制

一、概述 在uniapp开发中&#xff0c;路由是非常重要的一个方面&#xff0c;它可以实现页面之间的跳转和传递参数。本文将介绍uniapp中路由的使用技巧&#xff0c;并给出具体的代码示例。 二、uniapp路由的基本使用 在uniapp中&#xff0c;路由的基本使用可以通过uni.navigate…

ai变声:视频怎么变音?分享6个语音变声器,视频变声不再难!

想过如何让自己的直播内容更吸引人吗&#xff1f;你是否希望通过变声器来打造独特的声音效果&#xff1f;或者&#xff0c;如何用创意声音提升观众的互动体验呢&#xff1f;随着直播行业的不断发展&#xff0c;每位主播都在努力寻找吸引观众的独特方式&#xff0c;而变声器正是…

【Test 001】Qt 开发基础体系 QMap 类和 QHash 类以及 QVector 类

文章目录 1.QMap 详解1.1 QMap 的介绍1.2 QMap 的具体用法如下1.3 QmultiMap类 2.QHash 详解3. QMap 和 QHash 的对比4. QVector 详解 1.QMap 详解 1.1 QMap 的介绍 &#x1f427;① QMap<key,T>提供一个从类型为Key的键到类型为T的值的映射。通常&#xff0c;QMap存储的…

新手小白Ubuntu18.04超详细安装教程

1、Ubuntu18.04系统下载地址 Ubuntu18.04下载地址 直接下载桌面版 2、Ubuntu18.04安装 &#xff08;1&#xff09;打开VMware虚拟机 文件—>新建虚拟机—>选择典型 &#xff08;2&#xff09;选择稍后安装系统 &#xff08;3&#xff09;选择linux系统&#xff0c;…

学习记录:js算法(十五):三数之和

文章目录 三数之和我的思路网上思路 总结 三数之和 给你一个整数数组 nums &#xff0c;判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k &#xff0c;同时还满足 nums[i] nums[j] nums[k] 0 。请你返回所有和为 0 且不重复的三元组。 注意&…

win/mac视频剪辑软件Premiere Pro 2024下载安装

目录 一、简介 &#xff08;一&#xff09;高级调色功能 &#xff08;二&#xff09;字幕制作 &#xff08;三&#xff09;与其他 Adobe 软件的协同工作 下载 二、安装 &#xff08;一&#xff09;安装前的准备工作 &#xff08;二&#xff09;安装过程中的常见问题及解…

前端面试宝典【CSS篇】【8】

在前端开发的世界里,每一次面试都是一次机遇,也是一次挑战。 你是否曾因技术深度不够而错失良机? 或是面对最新的技术趋势感到迷茫? 我们的【前端面试宝典】正是为此而来。 由拥有多年一线实战经验的资深工程师亲自授课,结合最新的行业动态与实战案例,旨在全面提升你的技…

【算法进阶2-动态规划】斐波那契数列(递归调用、动态规划)、钢条切割问题(自定而下实现、自底向上、切割方案)

1 斐波那契数 2 钢条切割问题 2.1 最优解情况 2.2 钢条切割问题之自定而下实现 2.3 钢条切割问题之自底向上实现 2.4 钢条切割问题-重构解-切割方案 1 斐波那契数 # 1 子问题的重复计算 def fibonacci(n: int) -> int:"""使用递归方式计算第 n 个斐波那契数…

美国高防服务器测评

美国高防服务器通常具有出色的硬件配置和网络性能&#xff0c;以及强大的DDoS防御能力。rak小编为您整理发布美国高防服务器测评。 美国高防服务器因其地理位置和网络基础设施的优势&#xff0c;通常被认为在防御分布式拒绝服务(DDoS)攻击方面具有较高的能力。面对日益增长的网…

基于R语言遥感随机森林建模与空间预测

随机森林作为一种集成学习方法&#xff0c;在处理复杂数据分析任务中特别是遥感数据分析中表现出色。通过构建大量的决策树并引入随机性&#xff0c;随机森林在降低模型方差和过拟合风险方面具有显著优势。在训练过程中&#xff0c;使用Bootstrap抽样生成不同的训练集&#xff…

力扣: 两两交换链表中的节点

文章目录 需求代码代码解释结尾 需求 给你一个链表&#xff0c;两两交换其中相邻的节点&#xff0c;并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题&#xff08;即&#xff0c;只能进行节点交换&#xff09;。 示例 1&#xff1a; 输入&#xff1a;…

工厂模式与策略模式:理解与应用

工厂模式与策略模式&#xff1a;理解与应用 1. 引言2. 工厂模式简介2.1 定义2.2 特点2.3 应用场景2.4 工厂模式例子&#xff1a;咖啡制作 3. 策略模式简介3.1 定义3.2 特点3.3 应用场景3.4 策略模式例子&#xff1a;咖啡定价 4. 区别4.1 目的不同4.2 应用场景不同4.3 解决问题不…

浅谈Java Maven

一、基本介绍 Maven是Java项目的构建工具&#xff0c;通过项目对象模型&#xff08;POM&#xff09;管理项目配置信息&#xff0c;自动化构建、测试和部署过程。开发人员可定义项目结构、依赖和构建流程&#xff0c;提高开发效率和质量。本文介绍基本概念和用法&#xff0c;帮助…

【YOLOv8改进[Conv]】 感受野注意力卷积RFAConv(2024.3)| 使用RFAConv改进目标检测效果 + 含全部代码和详细修改方式

本文将进行在YOLOv8中使用 感受野注意力卷积RFAConv改进v8 的实践,助力YOLOv8目标检测效果,文中含全部代码、详细修改方式。助您轻松理解改进的方法。

时尚图像编辑

时尚图像编辑是一种应用计算机视觉和机器学习技术来改变或增强时尚摄影图像的领域。这种编辑可以包括更改服装颜色、形状或整体风格&#xff0c;以及调整模特在图像中的姿态或场景背景。 在您提到的背景中&#xff0c;现有的时尚图像编辑方法依赖于如分割器和关键点提取器这样…

FreeRTOS学习笔记>中断管理

1. 异常的定义与分类 异常&#xff1a;是指任何导致处理器脱离正常执行路径、并转向执行特定代码的事件。异常如果不及时处理&#xff0c;可能导致系统错误甚至瘫痪&#xff0c;因此异常处理对于系统的稳定性和鲁棒性非常重要&#xff0c;特别是在实时系统中。异常分类&#x…