【Vue】路由2——编程式路由导航、 两个新的生命周期钩子 以及 路由守卫、路由器的两种工作模式
目录
一、路由的push 与 replace切换
二、编程式路由导航
三、缓存路由组件
四、新增的两个生命周期钩子
五、路由守卫
5.1 前置路由守卫
5.2 后置路由守卫
5.3 独立路由守卫
5.4 组件内 路由守卫
六、路由器的两种工作模式
6.1 hash模式
6.2 history模式
6.3 Vue组件打包
6.4 创建一个微型服务器
6.5 解决history路径请求问题
总结:
1.的replace属性
2.编程式路由导航
3.缓存路由组件
4.两个新的生命周期钩子
5.路由守卫
6.路由器的两种工作模式
总结不易!本章节对我有很大的收获,希望对你也是!!!
本章节的素材已上传至Gitee:yihaohhh/我爱Vue - Gitee.comhttps://gitee.com/liu-yihao-hhh/i-love---vue/tree/master/37_src_%E7%BC%96%E7%A8%8B%E5%BC%8F%E8%B7%AF%E7%94%B1%E5%AF%BC%E8%88%AA
一、路由的push 与 replace切换
无痕模式 从push替换成replace模式
<router-link replace class="list-group-item" active-class="active" :to="{name:'guanyu'}">About</router-link><router-link replace class="list-group-item" active-class="active" to="/home">Home</router-link>
点击后 不能后退也不能前进,如果触发一次replace事件就会替换上一次的历史记录!导致上一条的历史记录消失
本章节的素材已上传至Gitee:yihaohhh/我爱Vue - Gitee.comhttps://gitee.com/liu-yihao-hhh/i-love---vue/tree/master/37_src_%E7%BC%96%E7%A8%8B%E5%BC%8F%E8%B7%AF%E7%94%B1%E5%AF%BC%E8%88%AA
二、编程式路由导航
在Message组件种添加push按钮和replace按钮
<template><div><ul><li v-for="e in messgeList" :key="e.id"><!-- 跳转路由并携带params参数 to的字符串写法 --><!-- <router-link :to="`/home/message/detail/${e.id}/${e.title}`">{{ e.title }}</router-link> --><!-- 跳转路由并携带params参数 to的对象写法 --><router-link :to="{// path:'/home/message/detail',// 如果使用params参数 那么就不允许使用path 必须使用name name:'xiaoxi',query: {id: e.id,title: e.title}}">{{ e.title }}</router-link> <button @click="pushShow(e)">push查看</button><button @click="replaceShow(e)">replace查看</button></li></ul><router-view></router-view></div>
</template><script>export default {name: 'Message',data() {return {messgeList: [{id:'001', title:'消息001'},{id:'002', title:'消息002'},{id:'003', title:'消息003'},]}},methods: {pushShow(e) {this.$router.push({name:'xiaoxi',query: {id: e.id,title: e.title}})},replaceShow(e) {this.$router.replace({name:'xiaoxi',query: {id: e.id,title: e.title}})}}}
</script>
在Banner组件种添加 前进和后退 以及 go按钮
go也就是给出参数来前进和后退多少步
<template><div><div class="col-xs-offset-2 col-xs-8"><div class="page-header"><h2>Vue Router Demo</h2></div><button @click="back">后退</button><button @click="forward">前进</button><button @click="test">测试一下go</button></div></div>
</template><script>export default {name:'Banner',methods: {back() {this.$router.back()},forward() {this.$router.forward()},test() {// 数字是几 就前进几步 -2 就后退两步this.$router.go(-2)}}}
</script>
本章节的素材已上传至Gitee:yihaohhh/我爱Vue - Gitee.comhttps://gitee.com/liu-yihao-hhh/i-love---vue/tree/master/38_src_%E7%BC%93%E5%AD%98%E8%B7%AF%E7%94%B1%E7%BB%84%E4%BB%B6
三、缓存路由组件
当我们在输入框内进行写入信息后,再次切换组件,会发现信息没有,原因就是每次切换组件的时候,组件都是重新进行销毁然后再次创建的,所以不会保留信息
不管news还是message组件都是在Home的展示区中, 所以最终都是Home的内容
我们只需要多一个标签进行包含即可!这里最好还是要写include来指定组件,不然所以组件都会被保存缓存,没有意义!指定组件名嗷!!!
<keep-alive include="News"><router-view></router-view></keep-alive>
同时缓存多个组件,不被销毁
<keep-alive :include="['News', 'Message']">
本章节的素材已上传至Gitee:yihaohhh/我爱Vue - Gitee.comhttps://gitee.com/liu-yihao-hhh/i-love---vue/tree/master/39_src_%E4%B8%A4%E4%B8%AA%E6%96%B0%E7%9A%84%E7%94%9F%E5%91%BD%E5%91%A8%E6%9C%9F%E9%92%A9%E5%AD%90
四、新增的两个生命周期钩子
当我们在News组件新增内容的时候
可以看到在组件切换的过程中,虽然数据被保存了,但是我们想要的效果是定时器能够停下来,并且数据还能够被保存,不让这样消耗太大
<template><div><ul><li :style="{opacity}">欢迎学习Vue</li><li>news001 <input type="text"></li><li>news002 <input type="text"></li><li>news003 <input type="text"></li></ul></div>
</template><script>export default {name: 'News',data() {return {opacity:1}},beforeUnmount() {console.log('New组件即将被销毁')clearInterval(this.timer)},mounted() {this.timer = setInterval(() => {console.log('@')this.opacity -= 0.01if(this.opacity <= 0) this.opacity = 1}, 16)}}
</script>
所以这里就有两个个新增的生命周期钩子,激活(用你就激活)和失活(切走就失活)
activated激活生命周期钩子 使用时就被激活
deactivated 失活生命周期钩子 二者就跟用mounted和beforeUnmount一样使用即可
<template><div><ul><li :style="{opacity}">欢迎学习Vue</li><li>news001 <input type="text"></li><li>news002 <input type="text"></li><li>news003 <input type="text"></li></ul></div>
</template><script>export default {name: 'News',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>
本章节的素材已上传至Gitee:
五、路由守卫
要求只有当学校满足'wshha'规则的时候才能进行访问News组件 和 Message组件
暴露就需要再路由守卫判断后 才能进行暴露了
5.1 前置路由守卫
// 全局前置路由守卫
// 在每一次路由切换之前 就进行调用
// to 去哪
// from 从哪去
// next 放行!!!
router.beforeEach((to, from, next) => {})
用前置路由守卫来书写判断条件是否当前的路由路径允许放行!!!
// 全局前置路由守卫
// 在每一次路由切换之前 就进行调用
// to 去哪
// from 从哪去
// next 放行!!!
router.beforeEach((to, from, next) => {console.log(to, from)if (to.path === '/home/news' || to.path === '/home/message') {// 进行判断是否放行!if (localStorage.getItem('school') === 'wshha') next()else alert('学校名字不对, 无权限查看!')}else next()})export default router // 暴露就需要再路由守卫判断后 才能进行暴露了
但是这还是有点不好,假如我们要对12个路由路径进行判断,那就要手写12个判断,有点过于麻烦!那么我们就需要在路由配置规则上配置自己的判断信息来观察是否可以添加该路由!
routes: [// 一级路由{name: 'guanyu',path: '/about',component: About,peiqi: false},
]
能够看出来并没有我们配置的peiqi属性,也就是说router路由配置的选项都是别人给我们提供好的,但是这个meta这个对象里面就是专门给我提供自定义属性用的一个容器!!!
routes: [// 一级路由{name: 'guanyu',path: '/about',component: About,meta: { isAuth: false }},]
确实出现了我们自定义的属性 isAuth:false
然后配置到我们需要进行判断的News 路由 和 Message路由中,可以直接判断需要判断的路径是否要进行权限鉴定即可!这样就不需要再手写每一个路由路劲,就十分方便
children: [{name: 'xinwen',path: 'news',component: News,meta: { isAuth: false }},{name: 'xinxi',path: 'message',component: Message,meta: { isAuth: false },children: [{name: 'xiaoxi',path: 'detail',component: Detail,// 解构赋值的连续写法props({ query: { id, title } }) {return { id: id, title: title }}}]},]router.beforeEach((to, from, next) => {console.log(to, from)// 判断是否需要鉴定权限if (to.meta.isAuth) {// 进行判断是否放行!if (localStorage.getItem('school') === 'wshha') next()else alert('学校名字不对, 无权限查看!')}else next()})
5.2 后置路由守卫
// 后置路由守卫
router.afterEach((to, from, next) => {console.log('后置路由守卫', to, from, next)
})
这里next显示时undefined 证明后置路由守卫是不存在next的
虽然后置路由守卫用的不多,但是在项目中确实也有一席之地,再点击后进行页签的标题切换!给每个路由都配置好自己的标题后:
const router = new VueRouter({routes: [// 一级路由{name: 'guanyu',path: '/about',component: About,meta: { title: '关于' }},{name: 'jia',path: '/home',component: Home,meta: { title: '首页' },// 二级路由 不用加 /children: [{name: 'xinwen',path: 'news',component: News,meta: { isAuth: false, title: '新闻' }},{name: 'xinxi',path: 'message',component: Message,meta: { isAuth: false, title: '信息' },children: [{name: 'xiaoxi',path: 'detail',component: Detail,meta: { title: '消息' },// 解构赋值的连续写法props({ query: { id, title } }) {return { id: id, title: title }}}]},]},]
})
如果是放在前置路由守卫中,就会存在一个bug!当我点击后其实新闻界面并没有弹出来,但是标题已经被前置守卫给渲染好了, 所以这里要采用后置路由守卫才是最好的!
// 后置路由守卫
router.afterEach((to, from, next) => {console.log('后置路由守卫', to, from, next)document.title = to.meta.title
})
这里的标题就没有改变!
5.3 独立路由守卫
只单独再News路由中设置独立路由守卫,进行判断,其他路由组件都是正常点击!
children: [{name: 'xinwen',path: 'news',component: News,meta: { isAuth: true, title: '新闻' },// 独立路由守卫beforeEnter: (to, from, next) => {console.log('前置路由守卫', to, from)// 判断是否需要鉴定权限if (to.meta.isAuth) {// 进行判断是否放行!if (localStorage.getItem('school') === 'wshha') next()else alert('学校名字不对, 无权限查看!')}else next()}},]
独享路由守卫没有独享后置路由守卫!!!
5.4 组件内 路由守卫
// 通过路由规则进行该组件时被调用beforeRouteEnter(to, from, next) {console.log('通过路由进入,已经进入了,放行后展示')next()},// 通过路由规则进行该组件时被调用beforeRouteLeave(to, from, next) {console.log('通过路由进入,离开时展示,放行后才让离开当前组件')next()}
那么我们就可以通过这种办法,再组件内进行路由判断!
// 通过路由规则进行该组件时被调用beforeRouteEnter(to, from, next) {console.log('通过路由进入,已经进入了,放行后展示')// 判断是否需要鉴定权限if (to.meta.isAuth) {// 进行判断是否放行!if (localStorage.getItem('school') === 'wshha') next()else alert('学校名字不对, 无权限查看!')}else next()},// 通过路由规则进行该组件时被调用beforeRouteLeave(to, from, next) {console.log('通过路由进入,离开时展示,放行后才让离开当前组件')next()}
}
本章节的素材已上传至Gitee:yihaohhh/我爱Vue - Gitee.comhttps://gitee.com/liu-yihao-hhh/i-love---vue/tree/master/43_src_%E8%B7%AF%E7%94%B1%E5%99%A8%E7%9A%84%E4%B8%A4%E7%A7%8D%E5%B7%A5%E4%BD%9C%E6%A8%A1%E5%BC%8F
六、路由器的两种工作模式
6.1 hash模式
hash是默认的路由工作状态,后面的路劲就全部都是hash值
6.2 history模式
当路由器使用history工作模式就没有# 会变的非常干净!
const router = new VueRouter({mode: 'history',routes: []
})
这里就是考虑到hash模式下兼容性比较好,history模式下兼容性只是略差,那么我们项目写完了要上线!就要进行文件打包,因为浏览器只认识.html .css .js
6.3 Vue组件打包
在package.json文件中可以看到我们之前一直都是用serve,那是用内置的创建一个8080的服务器,我们可以用build来进行打包生成最纯粹的.html .css .js
使用npm run build进行打包
会得到一个dist文件
但是该文件的html还不能直接打开,因为打包后的文件要部署,交给一个服务器
6.4 创建一个微型服务器
那么我们现在就手动搭建一个服务器:
- 创建一个demo文件夹后再vscode打开
- 终端输入:npm init 初始化 Node 项目
- 设置名字:hha_text-server
- 一直回车即可!
- 安装 Express: npm i express
- 然后创建server.js文件:
const express = require('express')const app = express()
app.use(express.static(__dirname + '/static'))app.get('/person', (req, res) => {res.send({name: 'tom',age: 18})
})app.listen(5005, (err) => {if (!err) console.log('服务器启动成功!')
})
创建一个static静态资源文件夹,放入刚刚打包好的文件
node server 进行启动服务器
再浏览器输入localhost:5005即可跳转到我们服务器请求的页面!
当前时history模式下,由于再点击的时候一直没有网络请求,但是一旦我们刷新,整个路径都会被当作请求交给服务器,就会报错!就是因为没有#来进行分割!
所以现在就是要重新调成hash模式再继续进行:
const router = new VueRouter({mode: 'hash',routes: []
})
然后重新打包后交给static静态资源的文件夹,重新启动服务器,再次访问5005就会发现路由器编程了hash模式多了一个#, 就会发现刷新后不会再出现任何问题!!!
就是因为#后面的这部分都不会被算做资源去找服务器要,不会被带过去请求服务器!
6.5 解决history路径请求问题
当然,由于history的路径好看,所以总有解决办法!
connect-history-api-fallback - npmProvides a fallback for non-existing directories so that the HTML 5 history API can be used.. Latest version: 2.0.0, last published: 3 years ago. Start using connect-history-api-fallback in your project by running `npm i connect-history-api-fallback`. There are 1724 other projects in the npm registry using connect-history-api-fallback.https://www.npmjs.com/package/connect-history-api-fallback这个时服务器里面的中间件,已经设置好了,直接安装就好
npm i connect-history-api-fallback
再server.js文件内进行引入
const express = require('express')
const history = require('connect-history-api-fallback');const app = express()
app.use(history())
app.use(express.static(__dirname + '/static'))app.get('/person', (req, res) => {res.send({name: 'tom',age: 18})
})app.listen(5005, (err) => {if (!err) console.log('服务器启动成功!')
})
能够发现此时的页面不论怎么刷新都不会出现报错的问题了!!!
总结:
1.<router-link>
的replace属性
-
作用:控制路由跳转时操作浏览器历史记录的模式
-
浏览器的历史记录有两种写入方式:分别为
push
和replace
,push
是追加历史记录,replace
是替换当前记录。路由跳转时候默认为push
-
如何开启
replace
模式:<router-link replace .......>News</router-link>
2.编程式路由导航
-
作用:不借助
<router-link>
实现路由跳转,让路由跳转更加灵活 -
具体编码:
//$router的两个APIthis.$router.push({name:'xiangqing',params:{id:xxx,title:xxx}})this.$router.replace({name:'xiangqing',params:{id:xxx,title:xxx}})this.$router.forward() //前进this.$router.back() //后退this.$router.go() //可前进也可后退
3.缓存路由组件
-
作用:让不展示的路由组件保持挂载,不被销毁。
-
具体编码:
<keep-alive include="News"> <router-view></router-view></keep-alive>
4.两个新的生命周期钩子
-
作用:路由组件所独有的两个钩子,用于捕获路由组件的激活状态。
-
具体名字:
-
activated
路由组件被激活时触发。 -
deactivated
路由组件失活时触发。
-
5.路由守卫
-
作用:对路由进行权限控制
-
分类:全局守卫、独享守卫、组件内守卫
-
全局守卫:
//全局前置守卫:初始化时执行、每次路由切换前执行router.beforeEach((to,from,next)=>{console.log('beforeEach',to,from)if(to.meta.isAuth){ //判断当前路由是否需要进行权限控制if(localStorage.getItem('school') === 'atguigu'){ //权限控制的具体规则next() //放行}else{alert('暂无权限查看')// next({name:'guanyu'})}}else{next() //放行}})//全局后置守卫:初始化时执行、每次路由切换后执行router.afterEach((to,from)=>{console.log('afterEach',to,from)if(to.meta.title){ document.title = to.meta.title //修改网页的title}else{document.title = 'vue_test'}})
-
独享守卫:
beforeEnter(to,from,next){console.log('beforeEnter',to,from)if(to.meta.isAuth){ //判断当前路由是否需要进行权限控制if(localStorage.getItem('school') === 'atguigu'){next()}else{alert('暂无权限查看')// next({name:'guanyu'})}}else{next()}}
-
组件内守卫:
//进入守卫:通过路由规则,进入该组件时被调用beforeRouteEnter (to, from, next) {},//离开守卫:通过路由规则,离开该组件时被调用beforeRouteLeave (to, from, next) {}
6.路由器的两种工作模式
-
对于一个url来说,什么是hash值?—— #及其后面的内容就是hash值。
-
hash值不会包含在 HTTP 请求中,即:hash值不会带给服务器。
-
hash模式:
-
地址中永远带着#号,不美观 。
-
若以后将地址通过第三方手机app分享,若app校验严格,则地址会被标记为不合法。
-
兼容性较好。
-
-
history模式:
-
地址干净,美观 。
-
兼容性和hash模式相比略差。
-
应用部署上线时需要后端人员支持,解决刷新页面服务端404的问题。
-
总结不易!本章节对我有很大的收获,希望对你也是!!!
相关文章:
【Vue】路由2——编程式路由导航、 两个新的生命周期钩子 以及 路由守卫、路由器的两种工作模式
目录 一、路由的push 与 replace切换 二、编程式路由导航 三、缓存路由组件 四、新增的两个生命周期钩子 五、路由守卫 5.1 前置路由守卫 5.2 后置路由守卫 5.3 独立路由守卫 5.4 组件内 路由守卫 六、路由器的两种工作模式 6.1 hash模式 6.2 history模式 6.3 V…...
VDC、SMC、MCU怎么协同工作的?
华为视频会议系统中,VDC(终端控制)、SMC(会话管理)、MCU(媒体处理) 通过分层协作实现端到端会议管理,其协同工作机制可总结为以下清晰架构: 1. 角色分工 组件核心职责类…...
ETL数据集成产品选型需要关注哪些方面?
ETL(Extract,Transform,Load)工具作为数据仓库和数据分析流程中的关键环节,其选型对于企业的数据战略实施有着深远的影响。谷云科技在 ETL 领域耕耘多年,通过自身产品的实践应用,对 ETL 产品选型…...
DriveGenVLM:基于视觉-语言模型的自动驾驶真实世界视频生成
《DriveGenVLM: Real-world Video Generation for Vision Language Model based Autonomous Driving》2024年8月发表,来自哥伦比亚大学的论文。 自动驾驶技术的进步需要越来越复杂的方法来理解和预测现实世界的场景。视觉语言模型(VLM)正在成…...
【达梦数据库】过程、函数、包头和包体详解零基础
目录 背景参考链接解释包头包体 背景 最近遇到关于包头和包体的问题,学习并记录 参考链接 参考链接: oracle的过程、函数、包头和包体详解零基础 解释 包头主要用于定义接口,包体主要用以实现包体中声明的存储过程、函数等。 包头 包体...
HarmonyOS开发样式布局
个人简介 👨💻个人主页: 魔术师 📖学习方向: 主攻前端方向,正逐渐往全栈发展 🚴个人状态: 研发工程师,现效力于政务服务网事业 🇨🇳人生格言&…...
SpringCloud——EureKa
目录 1.前言 1.微服务拆分及远程调用 3.EureKa注册中心 远程调用的问题 eureka原理 搭建EureKaServer 服务注册 服务发现 1.前言 分布式架构:根据业务功能对系统进行拆分,每个业务模块作为独立项目开发,称为服务。 优点: 降…...
【力扣刷题】LeetCode763-划分字母区间
文章目录 1. LeetCode763_划分字母区间 1. LeetCode763_划分字母区间 题目链接🔗 🐧解题思路: 区间合并 题目中这句话很关键“我们要把这个字符串划分为尽可能多的片段,同一字母最多出现在一个片段中。” 你这句话你可以理解为 把…...
使用for循环和字典功能,统计字符出现在一个英文句子中的次数(python)
本题目要求写出一段代码实现输入一个英文句子后,统计句子中各个字符(不区分大小写,包含空格和标点符号)出现的次数。 输入格式: 请例如:输入 Life is short,we need Python. 。 输出格式: 对每一个字符输出对应的出现次数&…...
带你搞懂@Valid和@Validated的区别
前言 有参数传递的地方都少不了参数校验。在实际开发过程中,参数校验是保证程序健壮性的重要环节,前端的参数校验是为了用户体验,后端的参数校验是为了安全。试想一下,如果在 Controller 层中没有经过任何校验的参数通过 Service层…...
大数据hadoop小文件处理方案
Hadoop处理小文件问题的解决方案可分为存储优化、处理优化和架构优化三个维度,以下是综合技术方案及实施要点: 一、存储层优化方案 1.文件合并技术 离线合并:使用hadoop fs -getmerge命令将多个小文件合并为大文件并重新上传; MapReduce合并:开发专用MR…...
安装NASM
安装NASM 注意:这篇文章在librdkafka安装系列,不需要参考,仅为了记录而写,请不要参考,后续编译openssl的时候,可以使用参数no-asm,不影响整个的编译步骤。这里主要作为记录帖子。 本篇是Windows系统编译Qt使用的kafka(librdkafka)系列可以不参考的一篇,编译librdkaf…...
RabbitMQ-高级
RabbitMQ-高级 文章目录 RabbitMQ-高级前言:消息可靠性问题1.生产者可靠性1.生产者重连2.生产者确认机制3.生产者代码实现原理 2.MQ的可靠性1.数据持久化2.LazyQueue 3.消费者可靠性1.消费者确认机制1.确认机制2.确认功能 2.失败重试机制1.开启失败重试机制2.多次失…...
深入解析Spring Boot与Kafka集成:构建高效消息驱动微服务
深入解析Spring Boot与Kafka集成:构建高效消息驱动微服务 引言 在现代微服务架构中,消息队列扮演着至关重要的角色,而Apache Kafka凭借其高吞吐量、低延迟和可扩展性,成为了许多企业的首选。本文将详细介绍如何在Spring Boot应用…...
Unreal Engine: Windows 下打包 AirSim项目 为 Linux 平台项目
环境: Windows: win10, UE4.27, Visual Studio 2022 Community.Linux: 22.04 windows环境安装教程: 链接遇到的问题(问题:解决方案) 点击Linux打包按钮,跳转至网页而不是执行打包流程:用VS打开项…...
【图像大模型】FLUX.1-dev:深度解析与实战指南
FLUX.1-dev:深度解析与实战指南 一、引言二、模型架构与技术原理(一)模型架构(二)Rectified Flow 技术(三)指导蒸馏(Guidance Distillation) 三、项目运行方式与执行步骤…...
mariadb 升级 (通过yum)
* 注意下 服务名, 有的服务器上是mysql,有的叫mariadb,mysqld的 #停止 systemctl stop mysql #修改源 vi /etc/yum.repos.d/MariaDB.repo baseurl http://yum.mariadb.org/11.4/centos7-amd64 #卸载 yum remove mysql #安装 yum install MariaDB-server galera-4 MariaDB-…...
Flink 非确定有限自动机NFA
Flink 是一个用于状态化计算的分布式流处理框架,而非确定有限自动机(NFA, Non-deterministic Finite Automaton)是一种在计算机科学中广泛使用的抽象计算模型,常用于正则表达式匹配、模式识别等领域。 Apache Flink 提供了对 NFA…...
Profinet转Ethernet IP主站网关:点燃氢醌生产线的智慧之光!
案例分享:转角指示器和Profinet转EthernetIP网关的应用 在现代工业自动化中,设备和系统之间的高效通信至关重要。最近,我们在某大型化工企业的生产线上实施了一个项目,旨在通过先进的设备和通信技术提高生产效率和安全性。该项目…...
动态IP技术在跨境电商中的创新应用与战略价值解析
在全球化4.0时代,跨境电商正经历从"流量红利"向"技术红利"的深度转型。动态IP技术作为网络基础设施的关键组件,正在重塑跨境贸易的运营逻辑。本文将从技术架构、应用场景、创新实践三个维度,揭示动态IP如何成为跨境电商突…...
WEB安全--SQL注入--Oracle注入
一、Oracle知识点了解 1.1、系统变量与表 版本号:SELECT * FROM V$VERSION 用户名:USER、SYS_CONTEXT(USERENV,SESSION_USER) 库名:ALL_USERS、USER_USERS、DBA_USERS 表名:ALL_TABLES、DBA_TABLES、USER_TABLES 字段名&…...
Unity预制体变体(Prefab Variants)、接口(Interface)、抽象类(Abstract Class)、枚举(Enumeration)
一、预制体变体(Prefab Variants) 预制体变体是什么? 预制体变体是指从同一个基础预制体派生出来的不同版本的预制体。这些变体可以包含不同的组件配置、属性值、子对象或者行为,但它们共享一些共同的基础结构和特性。通过创建预…...
pymol包安装和使用
PyMOL 是一款分子可视化软件,而pymol则是其对应的 Python 包,借助它能够实现对 PyMOL 的编程控制。 主要功能 分子结构可视化:支持展示蛋白质、核酸、小分子等多种分子的 3D 结构。自定义渲染:可对分子的表示方式、颜色以及光照…...
【学习笔记】机器学习(Machine Learning) | 第七章|神经网络(2)
机器学习(Machine Learning) 简要声明 基于吴恩达教授(Andrew Ng)课程视频 BiliBili课程资源 文章目录 机器学习(Machine Learning)简要声明 神经网络在图像识别及手写数字识别中的应用一、神经网络在图像识别中的应用࿰…...
【神经网络与深度学习】model.eval() 模式
引言 在深度学习模型的训练和推理过程中,不同的模式设置对模型的行为和性能有着重要影响。model.eval() 是 PyTorch 等深度学习框架中的关键操作,它用于将模型切换到评估模式(evaluation mode),确保模型在测试和推理阶…...
ASIC和FPGA,到底应该选择哪个?
ASIC和FPGA各有优缺点。 ASIC针对特定需求,具有高性能、低功耗和低成本(在大规模量产时);但设计周期长、成本高、风险大。FPGA则适合快速原型验证和中小批量应用,开发周期短,灵活性高,适合初创企…...
JavaScript 性能优化实战指南
JavaScript 性能优化实战指南 前言 随着前端应用复杂度提升,JavaScript 性能瓶颈日益突出。高效的性能优化不仅能提升用户体验,还能增强系统稳定性和可维护性。本文系统梳理了 JavaScript 性能优化的核心思路、常见场景和实战案例,结合代码…...
Unity3D HUD UI性能优化方案
前言 在Unity3D中实现高性能的HUD UI需要综合考虑渲染效率、CPU开销和内存管理。以下是分步的优化方案: 对惹,这里有一个游戏开发交流小组,大家可以点击进来一起交流一下开发经验呀! 1. 降低Draw Call:合批与图集 …...
晶圆Map图芯片选择显示示例
效果 列表中有四个Mark点,需求是选择某一个点时在Map图中区别显示出来。 实现思路: 根据DataGrid 的行选择 SelectionChanged事件,先循环所有Mark点清除Rectangle的边框大小,再获取选择的芯片,设置Rectangle的边框大小和颜色。 示例代码 1.UI代码 <DataGrid Grid.…...
HarmonyOS实战:自定义时间选择器
前言 最近在日常鸿蒙开发过程中,经常会使用一些时间选择器,鸿蒙官方提供的时间选择器满足不了需求,所以自己动手自定义一些经常会使用到的时间选择器,希望能帮到你,建议点赞收藏! 实现效果 需求分析 默认…...
汽车零部件的EMI抗扰性测试
写在前面 本系列文章主要讲解汽车零部件的EMI抗扰性测试的相关知识,希望能帮助更多的同学认识和了解汽车零部件的EMI抗扰性测试。 若有相关问题,欢迎评论沟通,共同进步。(*^▽^*) 1. 背景介绍 多年以来,电磁干扰(EMI)效应一直是现代电子控制系统中备受关注的一个问题。…...
新能源汽车充电桩管理平台如何利用智慧技术优化资源配置问题?
在“双碳”目标的推动下,我国新能源汽车市场迅猛发展,但充电基础设施的供需失衡问题日益突出。部分区域充电桩利用率低下,而核心城区、高速服务区等场景却面临“一桩难求”的困境。智慧技术的引入为解决这一难题提供了新思路。通过物联网&…...
【zookeeper】--部署3.6.3
文章目录 下载解压创建data和logs配置文件1)创建目录并且编辑 zoo.cfg2)接下来将 node01 的 ZooKeeper 所有文件拷贝至 node02 和 node03。推荐从 node02 和 node03 拷贝4)最后 vim /etc/profile 配置环境变量,环境搭建结束。配完环境变量后 source /etc…...
[低代码] 明道云调用本地部署 Dify 的进阶方法
在低代码开发平台明道云中,集成外部智能服务(如 Dify)可以极大地提升自动化和智能化能力。之前我们介绍了使用“发送自定义 API”节点直接调用本地部署的 Dify 服务的方法,虽然简单直观,但该方式存在一些限制,比如无法设置 Timeout、逻辑复用性差等问题。 为了构建更稳定…...
ICU库交叉编译
交叉编译步骤 Step 1: 先进行本机编译 ./runConfigureICU Linux/gccmake Step 2: 执行交叉编译 source /opt/fsl-imx-fb/4.14-sumo/environment-setup-cortexa9hf-neon-poky-linux-gnueabimkdir cross_install./configure --disable-samples --disable-tests --prefix/medi…...
永磁同步电机高性能控制算法(22)——基于神经网络的转矩脉动抑制算法为什么低速时的转速波动大?
0. 前言 在之前的知乎上发过一些转矩脉动抑制/谐波电流抑制的算法。例如: https://zhuanlan.zhihu.com/p/24723996895https://zhuanlan.zhihu.com/p/24723996895 这些算法基本上都需要先知道谐波的频率。 重复控制这个算法虽然可以抑制掉某个频率及其所有整数倍的…...
Java大厂面试实战:Spring Boot与微服务场景中的技术点解析
Java大厂面试实战:Spring Boot与微服务场景中的技术点解析 第一轮:基础技术了解 面试官:谢飞机,你好。从简历上看,你熟悉Spring Boot,那我们来聊聊它的核心功能吧。Spring Boot有哪些主要的特性ÿ…...
Pycharm 选择Python Interpreter
你的系统可能有多个 Python 环境,比如: macOS 自带的 /usr/bin/python3 你用 brew install python 安装的 /opt/homebrew/bin/python3 你可能还用了虚拟环境(venv 或 conda) PyCharm 默认配置可能用的是一个虚拟环境ÿ…...
文件夹如何打包成jar包
应用场景 主要是:比如 maven 引入一个依赖(其实就是下载了一个 jar 包),然后需要修改 jar 包里面的某个文件,然后再重新打包成 jar 包,如下图: 使用方法 使用压缩工具打开这个 jar 包…...
sqli-labs第九关—‘时间盲注
一:判断闭合类型 先按照之前的判断方式判断,发现无论输入什么都显示You are in.......... 可以考虑使用时间盲注: 二:时间盲注Time-based Blind: 1.解释: 通过时间延迟判断结果 2.核心原理:…...
10.15 LangChain v0.3重磅升级:Tool Calling技术颠覆大模型工具调用,效率飙升300%!
LangChain v0.3 技术生态与未来发展:支持 Tool Calling 的大模型 关键词:LangChain Tool Calling, 大模型工具调用, @tool 装饰器, ToolMessage 管理, Few-shot Prompting 1. Tool Calling 的技术革新 LangChain v0.3 的工具调用(Tool Calling)功能标志着大模型应用开发进…...
【C++】哈希的概念与实现
1.哈希概念 通过某种函数使元素的存储位置与它的关键码之间能够建立一一映射的关系,可以不经过任何比较,一次直接从表中得到要搜索的元素。 当向该结构中: 插入元素: 根据待插入元素的关键码,以此函数计算出该元素的…...
Spring 代理与 Redis 分布式锁冲突:一次锁释放异常的分析与解决
Spring 代理与 Redis 分布式锁冲突:一次锁释放异常的分析与解决 Spring 代理与 Redis 分布式锁冲突:一次锁释放异常的分析与解决1. 问题现象与初步分析2 . 原因探究:代理机制对分布式锁生命周期的干扰3. 问题复现伪代码4. 解决方案࿱…...
vue Element-ui对图片上传和选用时的比例控制
vue Element-ui对图片上传和选用时的比例控制 在后台上传图片和选用已经上传的图片时,往往会因为图片的比例控制不到位导致在客户端渲染时效果差强人意,虽然可以在操作时选择合适的比例上传,但必要的控制还是能完成渲染时良好的体验…...
UE5在C++项目中判断不同平台
在Unreal Engine 5的C代码中,可以通过以下方法判断当前运行的平台(如Android、Windows、iOS),并根据平台执行不同的逻辑: 方法1:使用预处理器宏(编译时判断) Unreal Engine提供了一…...
用 CodeBuddy 实现「IdeaSpark 每日灵感卡」:一场 UI 与灵感的极简之旅
项目起点:一次随手的灵感 有时候,灵感稍纵即逝,尤其是面对屏幕发呆的时候。那天我忽然想到——要是能有一个每天弹出一句创意提示、灵感金句的应用就好了,最好配上简洁但有氛围感的 UI,像抽一张卡片一样,轻…...
std::ranges::views::as_const 和 std::ranges::as_const_view
std::ranges::views::as_const 和 std::ranges::as_const_view 是 C23 引入的视图适配器,用于生成一个不可变的视图,确保通过该视图访问元素时,元素被视为常量。以下是详细说明和示例: 基本概念 功能: 将输入范围的元素…...
3D 数据交换格式(.3DXML)简介
3DXML 是一种基于 XML 的 3D 数据交换格式,由达索系统(Dassault Systmes)开发,主要用于其 CATIA、SOLIDWORKS 和 3DEXPERIENCE 等产品中。 基本概述 全称:3D XML开发者:达索系统主要用途:3D…...
深度解析3D模型生成器:基于StyleGAN3与PyTorch3D的多风格生成工具开发实战
引言:跨模态生成的革命性突破 在元宇宙与数字孪生技术蓬勃发展的今天,3D内容生成已成为制约产业发展的关键瓶颈。传统建模方式依赖专业软件和人工操作,而基于深度学习的生成模型正颠覆这一范式。本文将深入解析如何构建支持多风格生成的3D模…...
DTAS 3D多约束装配助力悬架公差分析尺寸链计算:麦弗逊/双叉臂/多连杆/H臂一网打尽
摘要:汽车四轮定位参数与悬架密切相关。汽车悬架对于车辆的行驶性能、安全性和舒适性至关重要。DTAS 3D提供了各类型悬架的公差仿真分析方法。 关键字:DTAS 3D、前后悬架、公差仿真分析、 运动耦合 一、悬架公差分析综述 悬架是车身(或车架…...