第 3 章:使用 Vue 脚手架

news2024/11/9 9:31:03

目录

 具体步骤

模板项目的结构(脚手架文件结构)

Vue脚手架报错

修改方案:

 关于不同版本的Vue

vue.config.js配置文件

ref属性

props配置项

mixin(混入)

插件

小结:

scoped样式 

小结:

Todo-list 案例

  小结

浏览器本地存储

webStorage

小结

Vue 中的自定义事件

绑定事件监听

触发事件

解绑

小结

全局事件总线(GlobalEventBus)

理解

 指定事件总线对象

绑定事件

分发事件 

解绑事件 

小结(步骤)

TodoList案例:

 消息订阅与发布(pubsub)

理解

使用 PubSubJS 

 TodoList案例:

 $nextTick

 过度与动画

动画效果 

过渡效果和多个元素过渡(用transition-group)

集成第三方动画

小结


说明 

1. Vue 脚手架是 Vue 官方提供的标准化开发工具(开发平台)。
2. 最新的版本是 4.x。
3. 文档: https://cli.vuejs.org/zh/

 具体步骤

第一步(仅第一次执行):全局安装@vue/cli。
npm install -g @vue/cli
第二步: 切换到你要创建项目的目录 ,然后使用命令创建项目
vue create xxxx

  

成功:

第三步:启动项目
npm run serve
备注:
1. 如出现下载缓慢请配置 npm 淘宝镜像:
npm config set registry https://registry.npm.taobao.org
2. Vue 脚手架隐藏了所有 webpack 相关的配置,若想查看具体的 webpakc 配置,
请执行:
vue inspect > output.js

模板项目的结构(脚手架文件结构

├── node_modules
├── public
│ ├── favicon.ico: 页签图标
│ └── index.html: 主页面
├── src
│ ├── assets: 存放静态资源
│ │ └── logo.png
│ │── component: 存放组件
│ │ └── HelloWorld.vue
│ │── App.vue: 汇总所有组件
│ │── main.js: 入口文件
├── .gitignore: git 版本管制忽略的配置
├── babel.config.js: babel 的配置文件
├── package.json: 应用包配置文件
├── README.md: 应用描述文件
├── package-lock.json:包版本控制文件

Vue脚手架报错

Component name “Student“ should always be multi-word vue/multi-word-component-names

 报错分析:
根据提示信息可知是组件名出了问题,报错信息翻译过来大概就是组件名"Student"应该总是使用 多个单词拼接横线组成的。

但是组件名也是可以使用单个单词的,只是官方文档上面的风格建议我们使用大驼峰或使用“-”衔接的方式而已。

通过后续学习了解到,这其实是语法检查的时候把不规范的代码(即命名不规范)当成了错误。

修改方案:

  • 修改组件名,使其符合命名规范。例如:StudentName或者student-name。
  • 修改配置项,关闭语法检查:

(1)在项目的根目录找到(没有就自行创建)vue.config.js文件

(2)在文件中添加如下内容

const { defineConfig } = require('@vue/cli-service')
module.exports = defineConfig({
  transpileDependencies: true,
  lintOnSave:false /*关闭语法检查*/
  
})

 (3)随后保存文件重新编译即可

 关于不同版本的Vue

1. vue.js与vue.runtime.xxx.js的区别:

  1.      vue.js是完整版的Vue,包含:核心功能 + 模板解析器。
  2.     vue.runtime.xxx.js是运行版的Vue,只包含:核心功能;没有模板解析器。

2. 因为vue.runtime.xxx.js没有模板解析器,所以不能使用template这个配置项,需要使用render函数接收到的createElement函数去指定具体内容。

vue.config.js配置文件

1. 使用vue inspect > output.js可以查看到Vue脚手架的默认配置。

2. 使用vue.config.js可以对脚手架进行个性化定制,详情见:https://cli.vuejs.org/zh

ref属性

1. 作用: 用于给节点打标识
2. 读取方式: this.$refs.xxxxxx

1. 被用来给元素或子组件注册引用信息(id的替代者)

2. 应用在html标签上获取的是真实DOM元素,应用在组件标签上是组件实例对象(vc)

3. 使用方式:

    1. 打标识:```<h1 ref="xxx">.....</h1>``` 或 ```<School ref="xxx"></School>```

    2. 获取:```this.$refs.xxx```

App.vue文件

<template>
	<div>
    <img src="./assets/logo.png"/>
    <h1 v-text="msg" ref="title"></h1>
    <button ref="btn" @click="showDOM">点我输出上方的DOM元素</button>
		<School ref="sch"></School>
		
	</div>
</template>

<script>
	//引入组件
	import School from './components/School.vue'
	

	export default {
		name:'App',
    components:{
			School,
			
		},
    data(){
        return{
            msg:'欢迎学习Vue!'

        }
    },
	
    methods: {
      showDOM(){
        console.log(this.$refs.title) //真实DOM元素
				console.log(this.$refs.btn) //真实DOM元素
				console.log(this.$refs.sch) //School组件的实例对象(vc)
      }
    },
	}
</script>

props配置项

1. 作用: 用于父组件给子组件传递数据

1. 功能:让组件接收外部传过来的数据

2. 传递数据:<Demo name="xxx"/>

3. 接收数据:

    1. 第一种方式(只接收):props:['name'] 

    2. 第二种方式(限制类型):props:{name:String}

    3. 第三种方式(限制类型、限制必要性、指定默认值):

        props:{

         name:{

         type:String, //类型

         required:true, //必要性

         default:'老王' //默认值

         }

        }

  > 备注:props是只读的,Vue底层会监测你对props的修改,如果进行了修改,就会发出警告,若业务需求确实需要修改,那么请复制props的内容到data中一份,然后去修改data中的数据。

<template>
	<div>
		<h1>{{msg}}</h1>
		<h2>学生姓名:{{name}}</h2>
		<h2>学生性别:{{sex}}</h2>
		<h2>学生年龄:{{myAge+1}}</h2>
		<button @click="updateAge">尝试修改收到的年龄</button>
	</div>
</template>

<script>
	export default {
		name:'Student',
		data() {
			console.log(this)
			return {
				msg:'我是一个尚硅谷的学生',
				myAge:this.age
			}
		},
		methods: {
			updateAge(){
				this.myAge++
			}
		},
		//简单声明接收
		// props:['name','age','sex'] 

		//接收的同时对数据进行类型限制
		/* props:{
			name:String,
			age:Number,
			sex:String
		} */

		//接收的同时对数据:进行类型限制+默认值的指定+必要性的限制
		props:{
			name:{
				type:String, //name的类型是字符串
				required:true, //name是必要的
			},
			age:{
				type:Number,
				default:99 //默认值
			},
			sex:{
				type:String,
				required:true
			}
		}
	}
</script>

mixin(混入)

1. 功能:可以把多个组件共用的配置提取成一个混入对象

2. 使用方式:

   第一步定义混合:

    {

        data(){....},

        methods:{....}

        ....

    }

    第二步使用混入:

    ​ 全局混入:```Vue.mixin(xxx)```

    ​ 局部混入:```mixins:['xxx']  ```

mixin.js

export  const mixin={
     methods: {
    showName(){
        alert(this.name)
    }
}
}
export  const mixin2={
    methods: {
   showName(){
       alert(this.name)
   }
}
}

局部配置:school.vue

<template>
	<div>
	
		<h2 @click="showName">学生姓名:{{name}}</h2>
		<h2>学生性别:{{sex}}</h2>
	</div>
</template>

<script>

//引入一个mixin 局部配置
import {mixin} from '../mixin'

	export default {
		name:'Student',
		data() {
			console.log(this)
			return {
				name:'张三',
				sex:'男'
			}
		},
		mixins:[mixin],
	}
	
</script>

 全局配置:main.js

// 该文件是整个项目的入口文件
//引入Vue
import Vue from 'vue'
//引入App组件,他是所有组件的父组件
import App from './App.vue'
import {mixin,mixin2} from './mixin' //全局配置


//关闭Vue生产提示
Vue.config.productionTip = false
Vue.mixin(mixin)
Vue.mixin(mixin2)

//创建Vue实例对象---vm
new Vue({
  el:'#app',
  render: h => h(App),
})

插件

plugins.js(相当于全局引用) 

export default {
	install(Vue,x,y,z){
		console.log(x,y,z)
		//全局过滤器
		Vue.filter('mySlice',function(value){
			return value.slice(0,4)
		})

		//定义全局指令
		Vue.directive('fbind',{
			//指令与元素成功绑定时(一上来)
			bind(element,binding){
				element.value = binding.value
			},
			//指令所在元素被插入页面时
			inserted(element,binding){
				element.focus()
			},
			//指令所在的模板被重新解析时
			update(element,binding){
				element.value = binding.value
			}
		})

		//定义混入
		Vue.mixin({
			data() {
				return {
					x:100,
					y:200
				}
			},
		})

		//给Vue原型上添加一个方法(vm和vc就都能用了)
		Vue.prototype.hello = ()=>{alert('你好啊')}
	}
}

main.js:

school.vue: 

 student.vue:

小结:

1. 功能:用于增强Vue

2. 本质:包含install方法的一个对象,install的第一个参数是Vue,第二个以后的参数是插件使用者传递的数据。

3. 定义插件:

    ```js

    对象.install = function (Vue, options) {

        // 1. 添加全局过滤器

        Vue.filter(....)

        // 2. 添加全局指令

        Vue.directive(....)

        // 3. 配置全局混入(合)

        Vue.mixin(....)

        // 4. 添加实例方法

        Vue.prototype.$myMethod = function () {...}

        Vue.prototype.$myProperty = xxxx

    }

    ```

4. 使用插件:```Vue.use()```

scoped样式 

 school.vue:

<template>
	<div class="demo">
		<h2>学校名称:{{name}}</h2>
		<h2>学校地址:{{address}}</h2>
		
	</div>
</template>

<script>
	export default {
		name:'School',
		data() {
			return {
				name:'尚硅谷atguigu',
				address:'北京',
			}
		},
	}
</script>

<style scoped>
	.demo{
		background-color: antiquewhite;
	}
</style>

student.vue:

<template>
	<div class="demo">
		<h2>学生姓名:{{name}}</h2>
		<h2>学生性别:{{sex}}</h2>
		
	</div>
</template>

<script>
	export default {
		name:'Student',
		data() {
			return {
				name:'张三',
				sex:'男'
			}
		},
	}
</script>
<style scoped>
	.demo{
		background-color: aquamarine;
	}
</style>

小结:

1. 作用:让样式在局部生效,防止冲突。

2. 写法:

<style scoped>

    .demo{

        background-color: antiquewhite;

    }

</style>

=========================================================================

Todo-list 案例

拆分组件

组件化编码流程(通用)
1.实现静态组件:抽取组件,使用组件实现静态页面效果
2.展示动态数据:
        2.1. 数据的类型、名称是什么?
        2.2. 数据保存在哪个组件?
3.交互——从绑定事件监听开始

  小结

1. 组件化编码流程:

    ​ (1).拆分静态组件:组件要按照功能点拆分,命名不要与html元素冲突。

    ​ (2).实现动态组件:考虑好数据的存放位置,数据是一个组件在用,还是一些组件在用:

    ​       1).一个组件在用:放在组件自身即可。

    ​       2). 一些组件在用:放在他们共同的父组件上(<span style="color:red">状态提升</span>)。

    ​ (3).实现交互:从绑定事件开始。

2. props适用于:

    ​ (1).父组件 ==> 子组件 通信

    ​ (2).子组件 ==> 父组件 通信(要求父先给子一个函数)

3. 使用v-model时要切记:v-model绑定的值不能是props传过来的值,因为props是不可以修改的!

4. props传过来的若是对象类型的值,修改对象中的属性时Vue不会报错,但不推荐这样做。

浏览器本地存储

webStorage

localStorage

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8" />
		<title>localStorage</title>
	</head>
	<body>
		<h2>localStorage</h2>
		<button onclick="saveData()">点我保存一个数据</button>
		<button onclick="readData()">点我读取一个数据</button>
		<button onclick="deleteData()">点我删除一个数据</button>
		<button onclick="deleteAllData()">点我清空一个数据</button>

		<script type="text/javascript" >
			let p = {name:'张三',age:18}

			function saveData(){
				localStorage.setItem('msg','hello!!!')
				localStorage.setItem('msg2',666)
				localStorage.setItem('person',JSON.stringify(p))
			}
			function readData(){
				console.log(localStorage.getItem('msg'))
				console.log(localStorage.getItem('msg2'))

				const result = localStorage.getItem('person')
				console.log(JSON.parse(result))

				// console.log(localStorage.getItem('msg3'))
			}
			function deleteData(){
				localStorage.removeItem('msg2')
			}
			function deleteAllData(){
				localStorage.clear()
			}
		</script>
	</body>
</html>

sessionStorage

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8" />
		<title>sessionStorage</title>
	</head>
	<body>
		<h2>sessionStorage</h2>
		<button onclick="saveData()">点我保存一个数据</button>
		<button onclick="readData()">点我读取一个数据</button>
		<button onclick="deleteData()">点我删除一个数据</button>
		<button onclick="deleteAllData()">点我清空一个数据</button>

		<script type="text/javascript" >
			let p = {name:'张三',age:18}

			function saveData(){
				sessionStorage.setItem('msg','hello!!!')
				sessionStorage.setItem('msg2',666)
				sessionStorage.setItem('person',JSON.stringify(p))
			}
			function readData(){
				console.log(sessionStorage.getItem('msg'))
				console.log(sessionStorage.getItem('msg2'))

				const result = sessionStorage.getItem('person')
				console.log(JSON.parse(result))

				// console.log(sessionStorage.getItem('msg3'))
			}
			function deleteData(){
				sessionStorage.removeItem('msg2')
			}
			function deleteAllData(){
				sessionStorage.clear()
			}
		</script>
	</body>
</html>

小结

1. 存储内容大小一般支持5MB左右(不同浏览器可能还不一样)

2. 浏览器端通过 Window.sessionStorage 和 Window.localStorage 属性来实现本地存储机制。

3. 相关API:

    1. ```xxxxxStorage.setItem('key', 'value');```

                  该方法接受一个键和值作为参数,会把键值对添加到存储中,如果键名存在,则更新其对应的值。

    2. ```xxxxxStorage.getItem('person');```

        ​      该方法接受一个键名作为参数,返回键名对应的值。

    3. ```xxxxxStorage.removeItem('key');```

        ​      该方法接受一个键名作为参数,并把该键名从存储中删除。

    4. ``` xxxxxStorage.clear()```

        ​      该方法会清空存储中的所有数据。

4. 备注:

    1. SessionStorage存储的内容会随着浏览器窗口关闭而消失。(关闭浏览器就消失)

    2. LocalStorage存储的内容,需要手动清除才会消失。

    3. ```xxxxxStorage.getItem(xxx)```如果xxx对应的value获取不到,那么getItem的返回值是null。

    4. ```JSON.parse(null)```的结果依然是null。

Vue 中的自定义事件

绑定事件监听

<Header @addTodo="addTodo"/>
或者
<Header ref="header"/>
this.$refs.header.$on('addTodo', this.addTodo)
<!-- 通过父组件给子组件绑定一个自定义事件实现:子给父传递数据(第一种写法,使用@或v-on) -->
	<Student @atguigu="getStudentName" />

<!-- 通过父组件给子组件绑定一个自定义事件实现:子给父传递数据(第二种写法,使用ref) -->
	<Student ref="student"/>

触发事件

this.$emit('addTodo', todo)

解绑

小结

1. 一种组件间通信的方式,适用于:子组件 ===> 父组件

2. 使用场景:A是父组件,B是子组件,B想给A传数据,那么就要在A中给B绑定自定义事件(事件的回调在A中)。

3. 绑定自定义事件:

    1. 第一种方式,在父组件中:```<Demo @atguigu="test"/>```  或 ```<Demo v-on:atguigu="test"/>```

    2. 第二种方式,在父组件中:

        ```js

        <Demo ref="demo"/>

        ......

        mounted(){

           this.$refs.xxx.$on('atguigu',this.test)

        }

        ```

3. 若想让自定义事件只能触发一次,可以使用```once```修饰符,或```$once```方法。

4. 触发自定义事件:```this.$emit('atguigu',数据)```    

5. 解绑自定义事件```this.$off('atguigu')```

6. 组件上也可以绑定原生DOM事件,需要使用```native```修饰符。

7. 注意:通过```this.$refs.xxx.$on('atguigu',回调)```绑定自定义事件时,回调要么配置在methods中,要么用箭头函数,否则this指向会出问题!

全局事件总线(GlobalEventBus)

理解

1. Vue 原型对象上包含事件处理的方法
  •         1) $on(eventName, listener): 绑定自定义事件监听
  •         2) $emit(eventName, data): 分发自定义事件
  •         3) $off(eventName): 解绑自定义事件监听
  •         4) $once(eventName, listener): 绑定事件监听, 但只能处理一次
2. 所有组件实例对象的原型对象的原型对象就是 Vue 的原型对象
  • 1) 所有组件对象都能看到 Vue 原型对象上的属性和方法
  • 2) Vue.prototype.$bus = new Vue(), 所有的组件对象都能看到$bus 这个属性对象
3. 全局事件总线
  • 1) 包含事件处理相关方法的对象(只有一个)
  • 2) 所有的组件都可以得到

 指定事件总线对象

new Vue({
    beforeCreate () { // 尽量早的执行挂载全局事件总线对象的操作
    Vue.prototype.$globalEventBus = this
    },
}).$mount('#root')

绑定事件

this.$globalEventBus.$on('deleteTodo', this.deleteTodo)

分发事件 

this.$globalEventBus.$emit('deleteTodo', this.index)

解绑事件 

this.$globalEventBus.$off('deleteTodo')

x要具备以下特点:

1、所有组件都能看得见

2、要可以调用:$on、$off、$emit 


小结(步骤)

  1. 一种组件间通信的方式,适用于任意组件间通信。

  2. 安装全局事件总线:

    new Vue({
    	......
    	beforeCreate() {
    		Vue.prototype.$bus = this //安装全局事件总线,$bus就是当前应用的vm
    	},
        ......
    }) 

3、使用事件总线:

        1、接收数据:A组件想接收数据,则在A组件中给$bus绑定自定义事件,事件的回调留在A组件自身。 

methods(){
  demo(data){......}
}
......
mounted() {
  this.$bus.$on('xxxx',this.demo)
}

        2、提供数据:this.$bus.$emit('xxxx',数据)

4、最好在beforeDestroy钩子中,用$off去解绑当前组件所用到的事件。

========================================================================

TodoList案例:

App.vue给Item.vue传数据:

main.js

 

App.vue 

Item.vue

 消息订阅与发布(pubsub)

需要数据的地方:订阅消息

提供数据的地方:发布消息

理解

1. 这种方式的思想与全局事件总线很相似
2. 它包含以下操作:
  • (1) 订阅消息 --对应绑定事件监听
  • (2) 发布消息 --分发事件
  • (3) 取消消息订阅 --解绑事件监听

3. 需要引入一个消息订阅与发布的第三方实现库: PubSubJS 

使用 PubSubJS 

1. 在线文档: https://github.com/mroderick/PubSubJS
2. 下载: npm install -S pubsub-js
3. 相关语法
  • (1) import PubSub from 'pubsub-js' // 引入
  • (2) PubSub.subscribe(‘msgName’, functon(msgName, data){ })
  • (3) PubSub.publish(‘msgName’, data): 发布消息, 触发订阅的回调函数调用
  • (4) PubSub.unsubscribe(token): 取消消息的订阅
  1. 一种组件间通信的方式,适用于任意组件间通信。

  2. 使用步骤:

  •  安装pubsub:npm i pubsub-js
  • 引入: import pubsub from 'pubsub-js'
  • 接收数据:A组件想接收数据,则在A组件中订阅消息,订阅的回调留在A组件自身。
methods(){
  demo(data){......}
}
......
mounted() {
  this.pid = pubsub.subscribe('xxx',this.demo) //订阅消息
}

4、提供数据:pubsub.publish('xxx',数据)

5、最好在beforeDestroy钩子中,用PubSub.unsubscribe(pid)取消订阅

 TodoList案例:

App.vue需要数据(订阅消息)

Item.vue提供数据(发布消息)

 

 $nextTick

1. 语法:this.$nextTick(回调函数)

2. 作用:在下一次 DOM 更新结束后执行其指定的回调。

3. 什么时候用:当改变数据后,要基于更新后的新DOM进行某些操作时,要在nextTick所指定的回调函数中执行。

Item.vue:

 

 过度与动画

动画效果 

效果:

 

Test.vue

<template>
  <div>
    <button @click="isShow=!isShow">显示 / 隐藏</button>
    <!-- 有name属性就写hello-enter-active,没有就写v-enter-active -->
    <transition name="hello" appear>  
        <h1 v-show="isShow" >你好啊!</h1>
    </transition>
    
  </div>
</template>

<script>
export default {
    name:'Test',
    data(){
        return{
            isShow:true
        }
    }

}
</script>

<style scoped>
    h1{
        background-color: orange;
    }

    .hello-enter-active{
        animation: atguigu 1s;

    }

    .hello-leave-active{
        animation: atguigu 1s reverse;
    }

    @keyframes atguigu{
        from{
            transform: translateX(-100%);
        }

        to{
            transform: translateX(0px);
        }
    }
</style>

过渡效果和多个元素过渡(用transition-group)

<template>
	<div>
		<button @click="isShow = !isShow">显示/隐藏</button>
		<transition-group name="hello" appear>
			<h1 v-show="!isShow" key="1">你好啊!</h1>
			<h1 v-show="isShow" key="2">尚硅谷!</h1>
		</transition-group>
	</div>
</template>

<script>
	export default {
		name:'Test',
		data() {
			return {
				isShow:true
			}
		},
	}
</script>

<style scoped>
	h1{
		background-color: orange;
	}
	/* 进入的起点、离开的终点 */
	.hello-enter,.hello-leave-to{
		transform: translateX(-100%);
	}
	.hello-enter-active,.hello-leave-active{
		transition: 0.5s linear;
	}
	/* 进入的终点、离开的起点 */
	.hello-enter-to,.hello-leave{
		transform: translateX(0);
	}

</style>

集成第三方动画

官网:Animate.css | A cross-browser library of CSS animations.

安装:

npm install animate.css

引入

import 'animate.css';

配置:例

<h1 class="animate__animated animate__bounce">An animated element</h1>

 Test3.vue

<template>
	<div>
		<button @click="isShow = !isShow">显示/隐藏</button>
		<transition-group 
        name="animate__animated animate__bounce" 
        enter-active-class="animate__jello"
        leave-active-class="animate__backOutDown"
        appear>
			<h1 v-show="!isShow" key="1">你好啊!</h1>
			<h1 v-show="isShow" key="2">尚硅谷!</h1>
		</transition-group>
	</div>
</template>

<script>
    import 'animate.css'
	export default {
		name:'Test',
		data() {
			return {
				isShow:true
			}
		},
	}
</script>

<style scoped>
	h1{
		background-color: orange;
	}


</style>

小结

Vue封装的过度与动画

作用:在插入、更新或移除 DOM元素时,在合适的时候给元素添加样式类名

 

写法:

  1. 准备好样式:

    • 元素进入的样式:
      1. v-enter:进入的起点
      2. v-enter-active:进入过程中
      3. v-enter-to:进入的终点
    • 元素离开的样式:
      1. v-leave:离开的起点
      2. v-leave-active:离开过程中
      3. v-leave-to:离开的终点

 2、使用<transition>包裹要过度的元素,并配置name属性:

<transition name="hello">
	<h1 v-show="isShow">你好啊!</h1>
</transition>

3、备注:若有多个元素需要过度,则需要使用:<transition-group>,且每个元素都要指定key值。

vue 动画的理解

1. 操作 css 的 trasition 或 animation
2. vue 会给目标元素添加/移除特定的 class
3. 过渡的相关类名:
  • 1. xxx-enter-active: 指定显示的 transition
  • 2. xxx-leave-active: 指定隐藏的 transition
  • 3. xxx-enter/xxx-leave-to: 指定隐藏时的样式

基本过渡动画的编码

1. 在目标元素外包裹<transition name="xxx">
2. 定义 class 样式
  • a) 指定过渡样式: transition
  • b) 指定隐藏时的样式: opacity/其它 

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

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

相关文章

kafka重点问题解答-----kafka 的设计架构

1. kafka 都有哪些特点&#xff1f; 高吞吐量&#xff0c;低延迟 可以热扩展 并发度高 具有容错性(挂的只剩1台也能正常跑) 可靠性高 2. 请简述你在哪些场景下会选择 kafka&#xff1f; kafka的一些应用 日志收集&#xff1a;一个公司可以用kafka可以收集各种服务的log&…

自学黑客(网络安全/web渗透),一般人我还是劝你算了吧

由于我之前写了不少网络安全技术相关的文章&#xff0c;不少读者朋友知道我是从事网络安全相关的工作&#xff0c;于是经常有人私信问我&#xff1a; 我刚入门网络安全&#xff0c;该怎么学&#xff1f; 要学哪些东西&#xff1f; 有哪些方向&#xff1f; 怎么选&a…

chatgpt赋能python:Python分解三位数:打造高效的数学学习工具

Python分解三位数&#xff1a;打造高效的数学学习工具 介绍 Python是一种动态、解释型、高级编程语言&#xff0c;广泛应用于数据分析、人工智能、机器学习等领域。在数学教育中&#xff0c;Python也是一个非常好的工具&#xff0c;可以帮助学生更好地理解数学知识和提高解题…

Linux内核模块开发 第 6 章

The Linux Kernel Module Programming Guide Peter Jay Salzman, Michael Burian, Ori Pomerantz, Bob Mottram, Jim Huang译 断水客&#xff08;WaterCutter&#xff09; 6 字符设备驱动 include/linux/fs.h 中定义了结构体 file_operations &#xff0c;这个结构体包含指…

深度学习论文分享(三)Look More but Care Less in Video Recognition(NIPS2022)

深度学习论文分享&#xff08;三&#xff09;Look More but Care Less in Video Recognition&#xff08;NIPS2022&#xff09; 前言Abstract1. Introduction2 Related Work2.1 Video Recognition2.2 Redundancy in Data&#xff08;数据冗余&#xff09; 3 Methodology3.1 Arc…

Apache 虚拟主机企业应用

企业真实环境中&#xff0c; 一台服务器发布单个网站非常浪费资源&#xff0c;所以一台 web 服务器上会发布多个网站少则2~3个多则 30多个网站 在一台服务器上发布多网站&#xff0c;也称之为部署多个虚拟主机&#xff0c; Web 虚拟主机配置方法有以下 种&#xff1a; 1、基于单…

基于机器学习的内容推荐算法及其心理学、社会学影响闲谈

基于机器学习的内容推荐算法目前在各类内容类APP中使用的非常普遍。在购物、时尚、新闻咨询、学习等领域&#xff0c;根据用户的喜好&#xff0c;进行较为精准的用户画像与内容推荐。此类算法不但可以较为准确的分析用户的特征&#xff0c;如年龄、性别等&#xff0c;还能通过长…

QT项目实战(视频播放器)

文章目录 前言一、QMediaPlayer二、QVideoWidget三、QAudioOutput四、播放器代码实现五、最终效果总结 前言 本篇文章将使用QT6.4来实现一个简单视频播放器&#xff0c;在QT中使用一个视频播放器还是非常简单的。那么下面就让我们一起来实现这个视频播放器吧。 一、QMediaPla…

深度学习应用篇-计算机视觉-图像增广[1]:数据增广、图像混叠、图像剪裁类变化类等详解

【深度学习入门到进阶】必看系列&#xff0c;含激活函数、优化策略、损失函数、模型调优、归一化算法、卷积模型、序列模型、预训练模型、对抗神经网络等 专栏详细介绍&#xff1a;【深度学习入门到进阶】必看系列&#xff0c;含激活函数、优化策略、损失函数、模型调优、归一化…

基于VGG16实现宝石图像分类任务(acc 84%)--paddle paddle

作业&#xff1a;补充网络定义部分&#xff0c;使用卷积神经网络实现宝石分类 要求&#xff1a;1.补充完成CNN的网络结构定义方法实现宝石识别 2.可尝试不同网络结构、参数等力求达到更好的效果 卷积神经网络 卷积神经网络是提取图像特征的经典网络&#xff0c;其结构一般包…

【hello C++】类和对象(下)

目录 1. 再谈构造函数 1.1 构造函数体赋值 1.2 初始化列表 1.3 explicit关键字 2. static成员 2.1 概念 2.2 特性 3. 友元 3.1 友元函数 3.2 友元类 4. 内部类 5.匿名对象 6.拷贝对象时的一些编译器优化 7. 再次理解类和对象 1. 再谈构造函数 1.1 构造函数体赋值 在创建对象…

Spring Boot项目使用 jasypt 加密组件进行加密(例如:数据库、服务的Key、等等进行加密)

&#x1f353; 简介&#xff1a;java系列技术分享(&#x1f449;持续更新中…&#x1f525;) &#x1f353; 初衷:一起学习、一起进步、坚持不懈 &#x1f353; 如果文章内容有误与您的想法不一致,欢迎大家在评论区指正&#x1f64f; &#x1f353; 希望这篇文章对你有所帮助,欢…

【018】C++的指针数组和数组指针

C 指针数组和数组指针 引言一、指针数组1.1、数值的指针数组1.2、字符的指针数组1.3、二维字符数组 二、指针的指针三、数组指针3.1、数组首元素地址和数组首地址3.2、数组指针的使用示例3.3、二维数组和数组指针的关系 四、多维数组的物理存储总结 引言 &#x1f4a1; 作者简介…

从0实现基于Alpha zero的中国象棋AI(会分为多个博客,此处讲解蒙特卡洛树搜索)

从0实现基于Alpha zero的中国象棋AI 0.0、前言 ​ 题主对于阿尔法狗的实现原理好奇&#xff0c;加上毕业在即&#xff0c;因此选择中国象棋版的阿尔法zero&#xff0c;阿尔法zero是阿尔法狗的升级版。在完成代码编写的历程中&#xff0c;深刻感受到深度学习环境的恶劣&#x…

零门槛快速创业:GPT和AI工具的秘密武器

在不到一周的时间里&#xff0c;David创建了一个按需印刷的Etsy商店&#xff0c;该商店具有引人注目的标识和大量独特的文字和艺术。 我最近花了大约一周的时间来建立Etsy店面。在本文中&#xff0c;我将向你展示我如何&#xff08;可能更有趣的是&#xff0c;在哪里&#xff…

YOLOv5:TensorRT加速YOLOv5模型推理

YOLOv5&#xff1a;TensorRT加速YOLOv5模型推理 前言前提条件相关介绍TensorRT加速YOLOv5模型推理YOLOv5项目官方源地址将训练好的YOLOv5模型权重转换成TensorRT引擎YOLOv5 best.pt推理测试TensorRT Engine推理测试小结 参考 前言 由于本人水平有限&#xff0c;难免出现错漏&am…

笔试强训8

作者&#xff1a;爱塔居 专栏&#xff1a;笔试强训 作者简介&#xff1a;大三学生&#xff0c;希望和大家一起进步 day13 一. 单选 1.下列关于视图的说法错误的是&#xff1a; A 视图是从一个或多个基本表导出的表&#xff0c;它是虚表B 视图一经定义就可以和基本表一样被查询…

Python遍历网格中每个点

遍历网格中每个点 1. 问题描述2. Python实现2.1 网格参数初始化2.2 遍历赋值2.3 矩阵赋值1. 问题描述 最近需要实现一个对矩阵赋值并对矩阵表示的网格参数进行测试的任务,写了一段代码提供参考。 假设网格的长宽均为 2. Python实现 2.1 网格参数初始化 首先定义好需要划分…

【小呆的力学笔记】非线性有限元的初步认识【三】

文章目录 1.2.2 基于最小势能原理的线性有限元一般格式1.2.2.1 离散化1.2.2.2 位移插值1.2.2.3 单元应变1.2.2.4 单元应力1.2.2.5 单元刚度矩阵1.2.2.6 整体刚度矩阵1.2.2.7 处理约束1.2.2.8 求解节点载荷列阵1.2.2.9 求解位移列阵1.2.2.10 计算应力矩阵等 1.2.2 基于最小势能原…

基于深度学习的高精度推土机检测识别系统(PyTorch+Pyside6+YOLOv5模型)

摘要&#xff1a;基于深度学习的高精度推土机检测识别系统可用于日常生活中检测与定位推土机目标&#xff0c;利用深度学习算法可实现图片、视频、摄像头等方式的推土机目标检测识别&#xff0c;另外支持结果可视化与图片或视频检测结果的导出。本系统采用YOLOv5目标检测模型训…