Vue基础25之路由第四节

news/2024/4/29 4:42:38/文章来源:https://blog.csdn.net/qq_34306228/article/details/129593961

Vue基础25

  • 路由
    • 编程式路由导航
      • Home.vue(去掉两个router-line的replace)
      • HomeMessage.vue
      • Banner.vue
      • 总结
    • 缓存路由组件
      • Home.vue
      • HomeNews.vue
      • HomeMessage.vue
      • 总结
    • 两个新的生命周期钩子
      • HomeNews.vue
      • HomeMessage.vue
      • Home.vue
      • 总结
    • 全局路由守卫
      • 路由前置守卫
        • src/router/index.js
      • 路由后置守卫及用户鉴权问题
        • src/router/index.js
      • 总结
    • 独享路由守卫
      • src/router/index.js
      • 总结
    • 组件内路由守卫
      • src/router/index.js(改了about的用户鉴权)
      • About.vue
      • 总结

路由

编程式路由导航

Home.vue(去掉两个router-line的replace)

<template><div><h1>我是Home的内容</h1><br><div class="btn-group" role="group" aria-label="..."><router-link  type="button" class="btn btn-default"  active-class="active" to="/home/news">News</router-link><router-link  type="button" class="btn btn-default"  active-class="active" to="/home/message">Message</router-link></div><br><br><router-view></router-view></div>
</template><script>export default {name: "Home",/*mounted(){console.log("Home组件被挂载了")window.homeRoute=this.$routewindow.homeRouter=this.$router},beforeDestroy() {console.log("Home组件被销毁了")}*/}
</script><style scoped lang="less">
</style>

HomeMessage.vue

<template><div><button @click="goTest(2)">go查看测试(前进2步)</button><ul>
<!--      跳转路由并携带params参数,to的字符串的写法--><li v-for="m in messageList" :key="m.id">
<!--        <router-link  :to="`/home/message/detail/${m.id}/${m.title}`">{{m.title}}</router-link>--><!--      跳转路由并携带params参数,只能使用名字跳转,to的对象的写法--><router-link  :to="{name:'xiangqing',query:{id:m.id,title:m.title}}">{{m.title}}</router-link><button @click="pushShow(m)">push查看</button><button @click="replaceShow(m)">replace查看</button><button @click="goTest(-3)">go查看测试(后退3步)</button><br></li></ul><hr><router-view></router-view></div>
</template><script>export default {name: "HomeMessage",data(){return{messageList:[{id:"001",title:"消息001"},{id:"002",title:"消息002"},{id:"003",title:"消息003"},]}},methods:{pushShow(m){console.log(this.$router)this.$router.push({name:'xiangqing',query:{id:m.id,title:m.title}})},replaceShow(m){this.$router.replace({name:'xiangqing',query:{id:m.id,title:m.title}})},goTest(value){this.$router.go(value)}}}
</script><style scoped>
.active{color: black;
}
</style>

Banner.vue

<template>
<div><h1>Vue Router Demo</h1><button @click="back()">后退</button><button @click="forward()">前进</button><br><br>
</div>
</template><script>export default {name: "Banner",methods:{back(){this.$router.back()},forward(){this.$router.forward()}}}
</script><style scoped>
h1{border-bottom: 1px solid #ccc;
}
</style>

请添加图片描述

总结

  1. 作用:不借助<router-link>实现路由跳转,让路由跳转更加灵活
  2. 具体编码:
//$router的两个API
this.$router.push({name:'xiangqing',query:{id:m.id,title:m.title}})this.$router.replace({name:'xiangqing',query:{id:m.id,title:m.title}})this.$router.back()  //后退
this.$router.forward() //前进
this.$router.go(3)  //可前进也可后退
  1. 补充一个$router的api:go
    go函数的参数表示浏览器历史记录前进/后退几步(正数为前进,负数为后退)

缓存路由组件

Home.vue

<template><div><h1>我是Home的内容</h1><br><div class="btn-group" role="group" aria-label="..."><router-link  type="button" class="btn btn-default"  active-class="active" to="/home/news">News</router-link><router-link  type="button" class="btn btn-default"  active-class="active" to="/home/message">Message</router-link></div><br><br>
<!--    include后面跟的是组件名--><keep-alive include="HomeNews"><router-view></router-view></keep-alive></div>
</template><script>export default {name: "Home",/*mounted(){console.log("Home组件被挂载了")window.homeRoute=this.$routewindow.homeRouter=this.$router},beforeDestroy() {console.log("Home组件被销毁了")}*/}
</script><style scoped lang="less">
</style>

HomeNews.vue

<template>
<div><ul><li>新闻001 <input type="text"></li><li>新闻002 <input type="text"></li><li>新闻003 <input type="text"></li></ul>
</div>
</template><script>export default {name: "HomeNews",beforeDestroy() {console.log("HomeNews组件即将被销毁")}}
</script><style scoped></style>

HomeMessage.vue

<template><div><ul>
<!--      跳转路由并携带params参数,to的字符串的写法--><li v-for="m in messageList" :key="m.id">
<!--        <router-link  :to="`/home/message/detail/${m.id}/${m.title}`">{{m.title}}</router-link>--><!--      跳转路由并携带params参数,只能使用名字跳转,to的对象的写法--><router-link  :to="{name:'xiangqing',query:{id:m.id,title:m.title}}">{{m.title}}</router-link><button @click="pushShow(m)">push查看</button><button @click="replaceShow(m)">replace查看</button><br></li></ul><hr><router-view></router-view></div>
</template><script>export default {name: "HomeMessage",data(){return{messageList:[{id:"001",title:"消息001"},{id:"002",title:"消息002"},{id:"003",title:"消息003"},]}},methods:{pushShow(m){console.log(this.$router)this.$router.push({name:'xiangqing',query:{id:m.id,title:m.title}})},replaceShow(m){this.$router.replace({name:'xiangqing',query:{id:m.id,title:m.title}})},},beforeDestroy() {console.log("HomeMessage组件即将被销毁")}}
</script><style scoped>
.active{color: black;
}
</style>

请添加图片描述

总结

  1. 作用:让不展示的路由组件保持挂载,不被销毁
  2. 具体编码:
<keep-alive include="HomeNews"><router-view></router-view>
</keep-alive>

两个新的生命周期钩子

保留缓存组件功能后新增的需求

HomeNews.vue

<template>
<div><div :style="{opacity}">欢迎学习Vue</div><ul><li>新闻001 <input type="text"></li><li>新闻002 <input type="text"></li><li>新闻003 <input type="text"></li></ul>
</div>
</template><script>export default {name: "HomeNews",data(){return{opacity: 1}},activated() {console.log("News组件被激活了")this.timer=setInterval(()=>{console.log("@")this.opacity-=0.01if(this.opacity<0) this.opacity=1},16)},deactivated() {console.log("News组件失活了")clearInterval(this.timer)}}
</script><style scoped></style>

HomeMessage.vue

<template><div><ul>
<!--      跳转路由并携带params参数,to的字符串的写法--><li v-for="m in messageList" :key="m.id">
<!--        <router-link  :to="`/home/message/detail/${m.id}/${m.title}`">{{m.title}}</router-link>--><!--      跳转路由并携带params参数,只能使用名字跳转,to的对象的写法--><router-link  :to="{name:'xiangqing',query:{id:m.id,title:m.title}}">{{m.title}}</router-link><button @click="pushShow(m)">push查看</button><button @click="replaceShow(m)">replace查看</button><br></li></ul><hr><router-view></router-view></div>
</template><script>export default {name: "HomeMessage",data(){return{messageList:[{id:"001",title:"消息001"},{id:"002",title:"消息002"},{id:"003",title:"消息003"},]}},methods:{pushShow(m){console.log(this.$router)this.$router.push({name:'xiangqing',query:{id:m.id,title:m.title}})},replaceShow(m){this.$router.replace({name:'xiangqing',query:{id:m.id,title:m.title}})},},}
</script><style scoped>
.active{color: black;
}
</style>

Home.vue

<template><div><h1>我是Home的内容</h1><br><div class="btn-group" role="group" aria-label="..."><router-link  type="button" class="btn btn-default"  active-class="active" to="/home/news">News</router-link><router-link  type="button" class="btn btn-default"  active-class="active" to="/home/message">Message</router-link></div><br><br>
<!--    include后面跟的是组件名--><keep-alive include="HomeNews"><router-view></router-view></keep-alive></div>
</template><script>export default {name: "Home",/*mounted(){console.log("Home组件被挂载了")window.homeRoute=this.$routewindow.homeRouter=this.$router},beforeDestroy() {console.log("Home组件被销毁了")}*/}
</script><style scoped lang="less">
</style>

请添加图片描述

总结

  1. 作用:路由组件所独有的两个钩子,用于捕获路由组件的激活状态。
  2. 具体名字
    (1)activated路由组件被激活时触发
    (2)deactivated路由组件失活时触发

全局路由守卫

路由前置守卫

src/router/index.js

//该文件专门用于创建整个应用的路由器
import VueRouter from "vue-router";
//引入组件
import About from "@/pages/About";
import Home from "@/pages/Home";
import HomeNews from "@/pages/HomeNews";
import HomeMessage from "@/pages/HomeMessage";
import Detail from "@/pages/Detail";//创建并暴露一个路由器
const router=new VueRouter({routes:[{name:'guanyu',path:'/about',component:About},{name:"zhuye",path:'/home',component:Home,children:[{name:'xinwen',path:'news',component:HomeNews},{name:'xiaoxi',path:'message',component:HomeMessage,children:[{name:'xiangqing',// path:'detail/:id/:title',  //nodejs的占位符,后面会填充内容path:'detail',  //query的写法component:Detail,//props的第一种写法,值为对象,该对象中的所有key-value都会以props的形式传给Detail组件// props:{a:1,b:'你好啊'},//props的第二种写法,值为布尔值,若布尔值为真,就会把该路由组件收到的所有params参数,以props的形式传给Detail组件// props:true,//props的第三种写法:函数式(最普通的写法)/*props($route){return {id:$route.query.id,title:$route.query.title}}*///第三种:函数式(解构赋值的写法)/*props({query}){return{id:query.id,title:query.title}}*///第三种:函数式(解构赋值之后再解构赋值)props({query:{id,title}}){return {id,title}}}]}]}]
})//全局前置路由守卫——初始化的时候被调用、每次路由切换之前被调用
router.beforeEach((to,from,next)=>{console.log("to",to)console.log("from",from)if(to.name=="xinwen"||to.path=="/home/message"){console.log(localStorage.getItem("school"))if(localStorage.getItem("school")==="lucky"){next()}else{alert("学校名字不对,无权限查看")}}else{next()}
})export default  router

请添加图片描述

路由后置守卫及用户鉴权问题

src/router/index.js

//该文件专门用于创建整个应用的路由器
import VueRouter from "vue-router";
//引入组件
import About from "@/pages/About";
import Home from "@/pages/Home";
import HomeNews from "@/pages/HomeNews";
import HomeMessage from "@/pages/HomeMessage";
import Detail from "@/pages/Detail";//创建并暴露一个路由器
const router=new VueRouter({routes:[{name:'guanyu',path:'/about',component:About,meta:{title:"关于"}},{name:"zhuye",path:'/home',component:Home,meta:{title:"主页"},children:[{name:'xinwen',path:'news',component:HomeNews,meta:{isAuth:true,title:"新闻"},  //增加权限控制},{name:'xiaoxi',path:'message',component:HomeMessage,meta:{isAuth: true,title:"消息"},children:[{name:'xiangqing',// path:'detail/:id/:title',  //nodejs的占位符,后面会填充内容path:'detail',  //query的写法component:Detail,meta:{isAuth: true,title:"详情"},//props的第一种写法,值为对象,该对象中的所有key-value都会以props的形式传给Detail组件// props:{a:1,b:'你好啊'},//props的第二种写法,值为布尔值,若布尔值为真,就会把该路由组件收到的所有params参数,以props的形式传给Detail组件// props:true,//props的第三种写法:函数式(最普通的写法)/*props($route){return {id:$route.query.id,title:$route.query.title}}*///第三种:函数式(解构赋值的写法)/*props({query}){return{id:query.id,title:query.title}}*///第三种:函数式(解构赋值之后再解构赋值)props({query:{id,title}}){return {id,title}}}]}]}]
})//全局前置路由守卫——初始化的时候被调用、每次路由切换之前被调用
router.beforeEach((to,from,next)=>{console.log("前置守卫",to,from)// if(to.name=="xinwen"||to.path=="/home/message"){if(to.meta.isAuth){  //判断是否需要鉴权if(localStorage.getItem("school")==="lucky"){next()}else{alert("学校名字不对,无权限查看")}}else{next()}
})//全局后置路由守卫——初始化的时候被调用、每次路由切换之后被调用
router.afterEach((to,from)=>{console.log("后置路由守卫",to,from)document.title=to.meta.title||"xx系统"
})
export default  router

请添加图片描述

总结

  1. 作用:对路由进行权限控制
  2. 分类:全局守卫、独享守卫、组件内守卫
  3. 全局守卫
//全局前置路由守卫——初始化的时候被调用、每次路由切换之前被调用
router.beforeEach((to,from,next)=>{console.log("前置守卫",to,from)if(to.meta.isAuth){  //判断是否需要鉴权(判断当前路由是否需要进行权限控制)if(localStorage.getItem("school")==="lucky"){//权限控制的具体规则next()  //放行}else{alert("学校名字不对,无权限查看") //暂无权限}}else{next()  //放行}
})//全局后置路由守卫——初始化的时候被调用、每次路由切换之后被调用
router.afterEach((to,from)=>{console.log("后置路由守卫",to,from)if(to.meta.title){document.title=to.meta.title||"xx系统"  //修改网页的title}else{document.title="vue_test"  //修改网页的title}
})
export default  router

独享路由守卫

src/router/index.js

//该文件专门用于创建整个应用的路由器
import VueRouter from "vue-router";
//引入组件
import About from "@/pages/About";
import Home from "@/pages/Home";
import HomeNews from "@/pages/HomeNews";
import HomeMessage from "@/pages/HomeMessage";
import Detail from "@/pages/Detail";//创建并暴露一个路由器
const router=new VueRouter({routes:[{name:'guanyu',path:'/about',component:About,meta:{title:"关于"}},{name:"zhuye",path:'/home',component:Home,meta:{title:"主页"},children:[{name:'xinwen',path:'news',component:HomeNews,meta:{isAuth:true,title:"新闻"},  //增加权限控制//独享前置路由守卫(只有前置)beforeEnter:(to, from, next)=>{if(to.meta.isAuth){  //判断是否需要鉴权if(localStorage.getItem('school')==='lucky'){next()}else{alert("学校名不对,无权限查看!")}}else{next()}}},{name:'xiaoxi',path:'message',component:HomeMessage,meta:{isAuth: true,title:"消息"},children:[{name:'xiangqing',// path:'detail/:id/:title',  //nodejs的占位符,后面会填充内容path:'detail',  //query的写法component:Detail,meta:{isAuth: true,title:"详情"},//props的第一种写法,值为对象,该对象中的所有key-value都会以props的形式传给Detail组件// props:{a:1,b:'你好啊'},//props的第二种写法,值为布尔值,若布尔值为真,就会把该路由组件收到的所有params参数,以props的形式传给Detail组件// props:true,//props的第三种写法:函数式(最普通的写法)/*props($route){return {id:$route.query.id,title:$route.query.title}}*///第三种:函数式(解构赋值的写法)/*props({query}){return{id:query.id,title:query.title}}*///第三种:函数式(解构赋值之后再解构赋值)props({query:{id,title}}){return {id,title}}}]}]}]
})//全局后置路由守卫——初始化的时候被调用、每次路由切换之后被调用
router.afterEach((to,from)=>{console.log("后置路由守卫",to,from)document.title=to.meta.title||"xx系统"
})
export default  router

请添加图片描述

总结

  1. 独享守卫
//独享前置路由守卫(只有前置)beforeEnter(to, from, next){if(to.meta.isAuth){  //判断当前路由是否需要权限控制if(localStorage.getItem('school')==='lucky'){next()}else{alert("学校名不对,无权限查看!")}}else{next()}}

组件内路由守卫

在这里插入图片描述

src/router/index.js(改了about的用户鉴权)

//该文件专门用于创建整个应用的路由器
import VueRouter from "vue-router";
//引入组件
import About from "@/pages/About";
import Home from "@/pages/Home";
import HomeNews from "@/pages/HomeNews";
import HomeMessage from "@/pages/HomeMessage";
import Detail from "@/pages/Detail";//创建并暴露一个路由器
const router=new VueRouter({routes:[{name:'guanyu',path:'/about',component:About,meta:{isAuth:true,title:"关于"},//设置权限},{name:"zhuye",path:'/home',component:Home,meta:{title:"主页"},children:[{name:'xinwen',path:'news',component:HomeNews,meta:{isAuth:true,title:"新闻"},  //增加权限控制//独享前置路由守卫(只有前置)beforeEnter:(to, from, next)=>{if(to.meta.isAuth){  //判断是否需要鉴权if(localStorage.getItem('school')==='lucky'){next()}else{alert("学校名不对,无权限查看!")}}else{next()}}},{name:'xiaoxi',path:'message',component:HomeMessage,meta:{isAuth: true,title:"消息"},children:[{name:'xiangqing',// path:'detail/:id/:title',  //nodejs的占位符,后面会填充内容path:'detail',  //query的写法component:Detail,meta:{isAuth: true,title:"详情"},//props的第一种写法,值为对象,该对象中的所有key-value都会以props的形式传给Detail组件// props:{a:1,b:'你好啊'},//props的第二种写法,值为布尔值,若布尔值为真,就会把该路由组件收到的所有params参数,以props的形式传给Detail组件// props:true,//props的第三种写法:函数式(最普通的写法)/*props($route){return {id:$route.query.id,title:$route.query.title}}*///第三种:函数式(解构赋值的写法)/*props({query}){return{id:query.id,title:query.title}}*///第三种:函数式(解构赋值之后再解构赋值)props({query:{id,title}}){return {id,title}}}]}]}]
})//全局前置路由守卫——初始化的时候被调用、每次路由切换之前被调用
/*router.beforeEach((to,from,next)=>{console.log("前置守卫",to,from)// if(to.name=="xinwen"||to.path=="/home/message"){if(to.meta.isAuth){  //判断是否需要鉴权if(localStorage.getItem("school")==="lucky"){next()}else{alert("学校名字不对,无权限查看")}}else{next()}
})*///全局后置路由守卫——初始化的时候被调用、每次路由切换之后被调用
router.afterEach((to,from)=>{// console.log("后置路由守卫",to,from)document.title=to.meta.title||"xx系统"
})
export default  router

About.vue

<template><h1>我是About的内容</h1>
</template><script>
export default {name: "About",/*mounted(){console.log("About组件被挂载了",this)window.aboutRoute=this.$routewindow.aboutRouter=this.$router},beforeDestroy() {console.log("About组件被销毁了")}*///通过路由规则,进入该组件时被调用beforeRouteEnter(to,from,next){console.log("About-beforeRouteEnter",to,from)if(to.meta.isAuth){if(localStorage.getItem("school")=="lucky"){next()}else{alert("学校名不对,无权限查看")}}else{next()}},//通过路由规则,离开该组件时被调用beforeRouteLeave(to,from,next){console.log("About--beforeRouteLeave",to,from)next()}
}
</script><style scoped></style>

请添加图片描述

总结

组件内守卫:

//进入守卫,通过路由规则,进入该组件时被调用
beforeRouteEnter(to,from,next){},
//离开守卫,通过路由规则,离开该组件时被调用
beforeRouteLeave(to,from,next){
}

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

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

相关文章

Qt QShortCut快捷键原理、实现和应用

应用 QShortCut方式的快捷键有好几种使用方式&#xff1a; 1.通过绑定QAction或QMenu的方式。QAction和QMenu都提供了setShortcut()接口&#xff1b; 2.实例化一个对象&#xff1a;然后绑定信号槽activated()信号&#xff1a; auto shortcut new QShortcut(QKeySequence(tr(…

Postgresql源码(102)子事务控制语句分析

1 子事务控制语句分析 1.1 执行savepoint 执行函数&#xff1a; 【立即执行】→DefineSavepoint→PushTransaction&#xff08;从utility框架进入&#xff09;【延迟执行】→StartSubTransaction&#xff08;从顶层事务框架CommitTransactionCommand进入&#xff09; 准入条…

差分毫伏输出传感器信号隔离转换模块放大器0-10mV/0-20mV/0-±10mV/0-±20mV

概述&#xff1a;DIN11 IPO 压力应变桥信号处理系列隔离放大器是一种将差分输入信号隔离放大、转换成按比例输出的直流信号导轨安装变送模块。产品广泛应用在电力、远程监控、仪器仪表、医疗设备、工业自控等行业。此系列模块内部嵌入了一个高效微功率的电源&#xff0c;向输入…

代码随想录-57-106. 从中序与后序遍历序列构造二叉树

目录前言题目1.递归&#xff08;区间&#xff0c;左闭右开&#xff09;变量2. 本题思路分析&#xff1a;3. 算法实现4. 算法复杂度5. 算法坑点前言 在本科毕设结束后&#xff0c;我开始刷卡哥的“代码随想录”&#xff0c;每天一节。自己的总结笔记均会放在“算法刷题-代码随想…

Java注解怎么用

什么是注解 Java的注解&#xff08;Annotation&#xff09;是一种元数据&#xff0c;它可以提供程序的额外信息&#xff0c;帮助程序员更好地管理程序。注解通常被用作代码的标记或者指定某些行为的方式。在Java中&#xff0c;注解以符号开头&#xff0c;放在代码的各个位置&a…

【数据结构】千字深入浅出讲解队列(附原码 | 超详解)

&#x1f680;write in front&#x1f680; &#x1f4dd;个人主页&#xff1a;认真写博客的夏目浅石. &#x1f381;欢迎各位→点赞&#x1f44d; 收藏⭐️ 留言&#x1f4dd; &#x1f4e3;系列专栏&#xff1a;C语言实现数据结构 &#x1f4ac;总结&#xff1a;希望你看完…

linux驱动学习加强版-2(文件驱动的书写)

文章目录一、驱动的外设二、驱动操作文件原理三、编写一个驱动程序3.1 编写驱动程序的步骤3.1.2 确定主设备号以及注册驱动3.1.3 实现对应的函数四、一些错误现象一、驱动的外设 我们的设备硬件都需要驱动才能工作&#xff0c;没有驱动的硬件可以称之为废铁&#xff0c;没有硬…

spacesniffer文件大小查看工具安装和使用

软件描述 spacesniffer是一块可以快速查看电脑中所有文件大小的工具&#xff0c;当电脑空间不够时&#xff0c;可以迅速找出不需要的大提及文件。 一、软件下载 1、从网盘下载 spacesniffer文件大小查看工具 2、从官网下载 http://www.uderzo.it/main_products/space_sni…

供水管网微观水力模型

国外在管网建模方面起步于20世纪60年代。20世纪80年代&#xff0c;随着计算机及相应技术的发展&#xff0c;遥测远传设备的应用进入了实用化阶段&#xff0c;国内已有很多供水企业实现了供水管网建模。给水管网系统建模&#xff0c;就是为仿真模拟管网系统动态实时运行情况建立…

【论文阅读总结】用于目标检测的特征金字塔网络(FPN)

Feature Pyramid Networks for Object Detection1.摘要2.引言2.1 低级特征对于检测小物体很重要2.2 算法目标3. 文献综述3.1 Hand-engineered features and early neural networks3.2 Deep ConvNet object detectors3.3 Methods using multiple layers4.Feature Pyramid Networ…

LangChain:Prompt Templates介绍及应用

❤️觉得内容不错的话&#xff0c;欢迎点赞收藏加关注&#x1f60a;&#x1f60a;&#x1f60a;&#xff0c;后续会继续输入更多优质内容❤️&#x1f449;有问题欢迎大家加关注私戳或者评论&#xff08;包括但不限于NLP算法相关&#xff0c;linux学习相关&#xff0c;读研读博…

WPF+WebView2+react/vue/angular

创建WPF项目 安装WbeView2 Nuget包 在窗体中添加命名空间 xmlns:wv2"clr-namespace:Microsoft.Web.WebView2.Wpf;assemblyMicrosoft.Web.WebView2.Wpf"使用控件 <wv2:WebView2 x:Name"webview"/>在MainWindow中初始化 public MainWindow(){Initia…

什么是语法糖?Java中有哪些语法糖?

本文从 Java 编译原理角度&#xff0c;深入字节码及 class 文件&#xff0c;抽丝剥茧&#xff0c;了解 Java 中的语法糖原理及用法&#xff0c;帮助大家在学会如何使用 Java 语法糖的同时&#xff0c;了解这些语法糖背后的原理1 语法糖语法糖&#xff08;Syntactic Sugar&#…

Linux syslog 日志服务

文章目录Syslog 概述syslog 协议标准syslog APIsyslog 日志文件日志文件介绍日志配置产生本地日志参考文章Syslog 概述 syslog 常被称为系统日志或系统记录&#xff0c;系统日志通过 syslog 进程记录系统的有关事件&#xff0c;也可以记录应用程序运作事件。通过适当配置&…

Python批量删除或移动指定图像

Python批量删除或移动指定图像前言一、批量删除指定名称的图像二、批量移动指定名称的图像前言 笔者的研究方向为计算机视觉&#xff0c;因此经常和大量图像打交道&#xff0c;有时需要批量删除一些图像&#xff0c;有时需要批量移动一些图像&#xff0c;因此编写了下述代码。下…

flink 读取文件数据写入ElasticSearch

前言 es是大数据存储的必备中间件之一,通过flink可以读取来自日志文件,kafka等外部数据源的数据,然后写入到es中,本篇将通过实例演示下完整的操作过程; 一、前置准备 1、提前搭建并开启es服务(本文使用docker搭建的es7.6的服务); 2、提前搭建并开启kibana服务(便于操…

【Java 】Java NIO 底层原理

文章目录1、 Java IO读写原理1.1 内核缓冲与进程缓冲区1.2 java IO读写的底层流程2、 四种主要的IO模型3、 同步阻塞IO&#xff08;Blocking IO&#xff09;4、 同步非阻塞NIO&#xff08;None Blocking IO&#xff09;5、 IO多路复用模型(I/O multiplexing&#xff09;6、 异步…

Cursor编程初体验,搭载GPT-4大模型,你的AI助手,自然语言编程来了

背景 这两天体验了下最新生产力工具Cursor&#xff0c;基于最新的 GPT-4 大模型&#xff0c;目前免费&#xff0c;国内可访问&#xff0c;不限次数&#xff0c;跨平台&#xff0c;你确定不来体验一把&#xff1f;官方的 Slogan &#xff1a; Build Software. Fast. Write, edi…

差速巡线机器人设计-良好(80+)的报告-2023

如何提分&#xff1f;将一篇报告提升20分以上呢&#xff1f;差速巡线机器人设计-及格&#xff08;60&#xff09;的报告-2023_zhangrelay的博客-CSDN博客姓名&#xff1a; 学号&#xff1a; 实践项目1名称&#xff1a;差速巡线机器人设计 60分&#xff1a;缺乏思考、没有对比、…

攻防世界-first

题目下载&#xff1a;下载 IDA载入 __int64 __fastcall main(int a1, char **a2, char **a3) {__useconds_t *v3; // rbpunsigned int v4; // eaxint *v5; // rcxint v6; // edxunsigned int v7; // eaxsigned __int64 v8; // rcx__int64 v9; // raxchar v10; // blchar v11;…