12-Vue技术栈之Vuex的使用

目录

  • 1、理解 vuex
    • 1.1 vuex 是什么
    • 1.2 什么时候使用 Vue
    • 1.3 图解两种方式实现数据共享
  • 2、搭建vuex环境
    • 2.1 下载vuex
    • 2.2 配置文件
  • 3、基本使用
    • 3.1 求和案例纯vue写法
    • 3.2 求和案例vuex写法
  • 4、getters的使用
  • 5、四个map方法的使用
    • 5.1 求和案例
  • 6、 模块化+命名空间
    • 6.1求和案例改造

1、理解 vuex

1.1 vuex 是什么

  1. 概念:专门在 Vue 中实现集中式状态(数据)管理的一个 Vue 插件,对 vue 应用中多个组件的共享状态进行集中式的管理(读/写),也是一种组件间通信的方式,且适用于任意组件间通信
  2. Github 地址: https://github.com/vuejs/vuex

1.2 什么时候使用 Vue

  1. 多个组件依赖于同一状态
  2. 来自不同组件的行为需要变更同一状态

简单来说就是多个组件需要共享数据时

1.3 图解两种方式实现数据共享

  • 使用全局事件总线实现多组件共享数据较为麻烦。

请添加图片描述

  • 使用Vuex实现多组件共享数据简便。

请添加图片描述

2、搭建vuex环境

2.1 下载vuex

npm i vuex

在这里插入图片描述

注:
如果执行npm i vuex默认安装的是vuex4版本,而vuex4版本只能在vue3里面使用,所以如果你用的是vue2需要指定安装vuex3的版本。

vue2里正确安装:

npm i vuex@3

2.2 配置文件

  1. 创建文件:src/store/index.js
//引入Vue核心库
import Vue from 'vue'
//引入Vuex
import Vuex from 'vuex'
//应用Vuex插件
Vue.use(Vuex)

//准备actions对象——响应组件中用户的动作
const actions = {}
//准备mutations对象——修改state中的数据
const mutations = {}
//准备state对象——保存具体的数据
const state = {}

//创建并暴露store
export default new Vuex.Store({
	actions,
	mutations,
	state
})
  1. main.js中创建vm时传入store配置项
......
//引入Vue
import Vue from 'vue'
//引入App
import App from './App.vue'
//引入store
import store from './store/index.js'
......

//创建vm
new Vue({
	el:'#app',
	render: h => h(App),
	store
})

3、基本使用

  • vuex工作原理图:

在这里插入图片描述

  1. 初始化数据、配置actions、配置mutations,操作文件store.js
//引入Vue核心库
import Vue from 'vue'
//引入Vuex
import Vuex from 'vuex'
//引用Vuex
Vue.use(Vuex)

const actions = {
    //响应组件中加的动作
	jia(context,value){
		// console.log('actions中的jia被调用了',miniStore,value)
		context.commit('JIA',value)
	},
}

const mutations = {
    //执行加
	JIA(state,value){
		// console.log('mutations中的JIA被调用了',state,value)
		state.sum += value
	}
}

//初始化数据
const state = {
   sum:0
}

//创建并暴露store
export default new Vuex.Store({
	actions,
	mutations,
	state,
})
  1. 组件中读取vuex中的数据:$store.state.sum

  2. 组件中修改vuex中的数据:$store.dispatch('action中的方法名',数据)$store.commit('mutations中的方法名',数据)

    备注:若没有网络请求或其他业务逻辑,组件中也可以越过actions,即不写dispatch,直接编写commit

3.1 求和案例纯vue写法

  • 我们来用纯Vue写一个案例,在用vuex重新书写一遍,形成一个对比。

实现效果:

请添加图片描述
结构目录:
在这里插入图片描述

代码示例:
main 文件

import Vue from 'vue'
import App from './App.vue'
Vue.config.productionTip = false
 new Vue({
  render: h => h(App),
}).$mount('#app')

App组件

<template>
  <Count/>
</template>

<script>
import Count from './components/Count'
export default {
  name:'App',
  components:{Count}
}
</script>

<style>

</style>

Count组件

<template>
  <div>
    <h1>当前求和为:{{ sum }}</h1>
    <select v-model.number="n">
      <option value="1">1</option>
      <option value="2">2</option>
      <option value="3">3</option>
    </select>
    <button @click="add">+</button>
    <button @click="subtract">-</button>
    <button @click="addOdd">当前和为奇数再加</button>
    <button @click="addWait">等一等再加</button>
  </div>
</template>

<script>
export default {
  name: "Count",
  data() {
    return {
      n: 1, //选择数
      sum: 0, //求和数
    };
  },
  methods: {
    add() {
      this.sum += this.n;
    },
    subtract() {
      this.sum -= this.n;
    },
    addOdd() {
      if (this.sum % 2) {
        this.sum += this.n;
      }
    },
    addWait() {
      setTimeout(() => {
        this.sum += this.n;
      }, 500);
    },
  },
};
</script>

<style>
h1 {
  color: pink;
}
select {
  width: 50px;
  background: pink;
}
button {
  margin: 5px;
  padding: 5px 10px;
  background: pink;
  border: none;
  cursor: pointer;
}
</style>

3.2 求和案例vuex写法

实现效果:

请添加图片描述
结构目录:

在这里插入图片描述
main文件

import Vue from 'vue'
import App from './App.vue'
//引入store里面的index.js文件,vue里默认引入的就是index文件
import store from './store'
Vue.config.productionTip = false
const vm = new Vue({
  render: h => h(App),
  store //安装store
}).$mount('#app')
console.log(vm);

App组件

<template>
  <Count/>
</template>

<script>
import Count from './components/Count'
export default {
  name:'App',
  components:{Count}
}
</script>
<style>

</style>

Count组件

<template>
  <div>
    <h1>当前求和为:{{ $store.state.sum }}</h1>
    <select v-model.number="n">
      <option value="1">1</option>
      <option value="2">2</option>
      <option value="3">3</option>
    </select>
    <button @click="add">+</button>
    <button @click="subtract">-</button>
    <button @click="addOdd">当前和为奇数再加</button>
    <button @click="addWait">等一等再加</button>
  </div>
</template>

<script>
export default {
  name: "Count",
  data() {
    return {
      n: 1, //选择数
    };
  },
  methods: {
    add() {
      this.$store.commit("ADD", this.n);
    },
    subtract() {
      this.$store.commit("SUBTRACT", this.n);
    },
    addOdd() {
      this.$store.dispatch("addOdd", this.n);
    },
    addWait() {
      this.$store.dispatch("addWait", this.n);
    },
  },
};
</script>

<style>
h1 {
  color: pink;
}
select {
  width: 50px;
  background: pink;
}
button {
  margin: 5px;
  padding: 5px 10px;
  background: pink;
  border: none;
  cursor: pointer;
}
</style>

store里面的index.js 文件

//引入Vue核心库
import Vue from 'vue'
//引入Vuex
import Vuex from 'vuex'
//应用Vuex插件
Vue.use(Vuex)

//准备actions对象——响应组件中用户的动作
const actions = {
	addOdd(context, value) {
		if (context.state.sum % 2) {
			context.commit('ADD', value)
		};
	},
	addWait(context, value) {
		setTimeout(() => {
			context.commit('ADD', value)
		}, 500);
	}
}
//准备mutations对象——修改state中的数据
const mutations = {
	ADD(context, value) {
		context.sum += value
	},
	SUBTRACT(context, value) {
		context.sum -= value
	},

}
//准备state对象——保存具体的数据
const state = {
	sum: 0, //求和数
}

//创建并暴露store
export default new Vuex.Store({
	actions,
	mutations,
	state
})

4、getters的使用

  1. 概念:当state中的数据需要经过加工后再使用时,可以使用getters加工。

  2. store.js中追加getters配置

    ......
    
    const getters = {
    	bigSum(state){
    		return state.sum * 10
    		//靠返回值
    	}
    }
    
    //创建并暴露store
    export default new Vuex.Store({
    	......
    	getters
    })
    
  3. 组件中读取数据:$store.getters.bigSum

5、四个map方法的使用

  1. mapState方法:用于帮助我们映射state中的数据为计算属性
computed: {
    //借助mapState生成计算属性:sum、school、subject(对象写法)
     ...mapState({sum:'sum',school:'school',subject:'subject'}),
         
    //借助mapState生成计算属性:sum、school、subject(数组写法)
    ...mapState(['sum','school','subject']),
},
  1. mapGetters方法:用于帮助我们映射getters中的数据为计算属性
computed: {
    //借助mapGetters生成计算属性:bigSum(对象写法)
    ...mapGetters({bigSum:'bigSum'}),

    //借助mapGetters生成计算属性:bigSum(数组写法)
    ...mapGetters(['bigSum'])
},
  1. mapActions方法:用于帮助我们生成与actions对话的方法,即:包含$store.dispatch(xxx)的函数
methods:{
    //靠mapActions生成:incrementOdd、incrementWait(对象形式)
    ...mapActions({incrementOdd:'jiaOdd',incrementWait:'jiaWait'})

    //靠mapActions生成:incrementOdd、incrementWait(数组形式)
    ...mapActions(['jiaOdd','jiaWait'])
}
  1. mapMutations方法:用于帮助我们生成与mutations对话的方法,即:包含$store.commit(xxx)的函数
methods:{
    //靠mapActions生成:increment、decrement(对象形式)
    ...mapMutations({increment:'JIA',decrement:'JIAN'}),
    
    //靠mapMutations生成:JIA、JIAN(对象形式)
    ...mapMutations(['JIA','JIAN']),
}

备注:在四个方法使用时,若需要传递参数需要:在模板中绑定事件时传递好参数,否则参数是事件对象。

5.1 求和案例

  • 我们将上面的求和案例利用这些方法进行改进一下:
  • 其他文件照常,只改变store里面的index.jsCount组件
    index.js文件
//引入Vue核心库
import Vue from 'vue'
//引入Vuex
import Vuex from 'vuex'
//应用Vuex插件
Vue.use(Vuex)

//准备actions对象——响应组件中用户的动作
const actions = {
	/* add(context, value) {
		context.commit('ADD', value)
	},
	subtract(context, value) {
		context.commit('SUBTRACT', value)
	}, */
	addOdd(context, value) {
		if (context.state.sum % 2) {
			context.commit('ADD', value)
		};
	},
	addWait(context, value) {
		setTimeout(() => {
			context.commit('ADD', value)
		}, 500);
	}
}
//准备mutations对象——修改state中的数据
const mutations = {
	ADD(context, value) {
		context.sum += value
	},
	SUBTRACT(context, value) {
		context.sum -= value
	},

}
//准备state对象——保存具体的数据
const state = {
	sum: 0, //求和数
	school:'哔站',
	subject:'前端'
}
// 对state对象里的数据进行加工
const getters = {
	bigSum(state) {
		return state.sum * 10
	}
}

//创建并暴露store
export default new Vuex.Store({
	actions,
	mutations,
	state,
	getters
})

Count组件

<template>
  <div>
    <h1>当前求和为:{{ sum }}</h1>
    <h3>放大十倍后的和为:{{ bigSum }}</h3>
    <h3>我在{{ school }}学{{ subject }}</h3>

    <select v-model.number="n">
      <option value="1">1</option>
      <option value="2">2</option>
      <option value="3">3</option>
    </select>
    <button @click="add(n)">+</button>
    <button @click="subtract(n)">-</button>
    <button @click="addOdd(n)">当前和为奇数再加</button>
    <button @click="addWait(n)">等一等再加</button>
  </div>
</template>

<script>
// 导入4个map方法
import { mapState, mapGetters, mapMutations, mapActions } from "vuex";
export default {
  name: "Count",
  data() {
    return {
      n: 1, //选择数
    };
  },
  computed: {
    //靠程序员自己亲自去写计算属性
    /* sum(){
				return this.$store.state.sum
			},
			school(){
				return this.$store.state.school
			},
			subject(){
				return this.$store.state.subject
			}, */

    //借助mapState生成计算属性,从state中读取数据。(对象写法)
    // ...mapState({ sum: "sum", school: "school", subject: "subject" }),
    //借助mapState生成计算属性,从state中读取数据。(数组写法)
    // 数组写法必须数据名和计算方法名一致
    ...mapState(["sum", "school", "subject"]),
    // ...............................
    //靠程序员自己亲自去写计算属性
    /* bigSum(){
				return this.$store.getters.bigSum
			}, */
    //借助mapGetters生成计算属性,从getters中读取数据。(对象写法)
    // ...mapGetters({bigSum:'bigSum'})
    //借助mapGetters生成计算属性,从getters中读取数据。(数组写法)
    ...mapGetters(["bigSum"]),
  },
  methods: {
    //程序员亲自写方法
    /*   add() {
      this.$store.commit("ADD", this.n);
    },
    subtract() {
      this.$store.commit("SUBTRACT", this.n);
    },
    addOdd() {
      this.$store.dispatch("addOdd", this.n);
    },
    addWait() {
      this.$store.dispatch("addWait", this.n);
    }, */

    //借助mapMutations生成对应的方法,方法中会调用commit去联系mutations(对象写法)
    ...mapMutations({ add: "ADD", subtract: "SUBTRACT" }), //必须在插值语法中传入实参,不然默认是event事件对象
    //借助mapMutations生成对应的方法,方法中会调用commit去联系mutations(数组写法)数组写法必须数据名和方法名一致,这里改了,上面调用的时候也要改。
    // ...mapMutations({ADD:'ADD',SUBTRACT:'SUBTRACT'})

    //借助mapActions生成对应的方法,方法中会调用dispatch去联系actions(对象写法)
    // ...mapActions({addOdd:'addOdd',addWait:'addWait'})
    //借助mapActions生成对应的方法,方法中会调用dispatch去联系actions(数组写法)
    ...mapActions(["addOdd", "addWait"]),
  },
};
</script>

<style>
h1,
h3 {
  color: pink;
}
select {
  width: 50px;
  background: pink;
}
button {
  margin: 5px;
  padding: 5px 10px;
  background: pink;
  border: none;
  cursor: pointer;
}
</style>

6、 模块化+命名空间

  • 目的:让代码更好维护,让多种数据分类更加明确。

  • 修改store.js

    const countAbout = {
      namespaced:true,//开启命名空间
      state:{x:1},
      mutations: { ... },
      actions: { ... },
      getters: {
        bigSum(state){
           return state.sum * 10
        }
      }
    }
    
    const personAbout = {
      namespaced:true,//开启命名空间
      state:{ ... },
      mutations: { ... },
      actions: { ... }
    }
    
    const store = new Vuex.Store({
      modules: {
        countAbout,
        personAbout
      }
    })
    
  • 开启命名空间后,组件中读取state数据:

    //方式一:自己直接读取
    this.$store.state.personAbout.list
    //方式二:借助mapState读取:
    ...mapState('countAbout',['sum','school','subject']),
    
  • 开启命名空间后,组件中读取getters数据:

    //方式一:自己直接读取
    this.$store.getters['personAbout/firstPersonName']
    //方式二:借助mapGetters读取:
    ...mapGetters('countAbout',['bigSum'])
    
  • 开启命名空间后,组件中调用dispatch

    //方式一:自己直接dispatch
    this.$store.dispatch('personAbout/addPersonWang',person)
    //方式二:借助mapActions:
    ...mapActions('countAbout',{incrementOdd:'jiaOdd',incrementWait:'jiaWait'})
    
  • 开启命名空间后,组件中调用commit

    //方式一:自己直接commit
    this.$store.commit('personAbout/ADD_PERSON',person)
    //方式二:借助mapMutations:
    ...mapMutations('countAbout',{increment:'JIA',decrement:'JIAN'}),
    

6.1求和案例改造

  • 实现效果:

请添加图片描述

  • 结构目录:

在这里插入图片描述
main文件

import Vue from 'vue'
import App from './App.vue'
import store from './store'

Vue.config.productionTip = false

 new Vue({
  render: h => h(App),
  store
}).$mount('#app')

App组件

<template>
  <div>
    <Count />
    <Person />
  </div>
</template>

<script>
import Count from "./components/Count";
import Person from "./components/Person";
export default {
  name: "App",
  components: { Count, Person },
};
</script>
<style>
</style>

Count组件使用4种map方法

<template>
  <div>
    <h1>当前求和为:{{ sum }}</h1>
    <h3>放大十倍后的和为:{{ bigSum }}</h3>
    <h3>我在{{ school }}学{{ subject }}</h3>
    <h3 style="color: red">Person组件的总人数是:{{ persons.length }}</h3>
    <select v-model.number="n">
      <option value="1">1</option>
      <option value="2">2</option>
      <option value="3">3</option>
    </select>
    <button @click="add(n)">+</button>
    <button @click="subtract(n)">-</button>
    <button @click="addOdd(n)">当前和为奇数再加</button>
    <button @click="addWait(n)">等一等再加</button>
  </div>
</template>

<script>
// 导入4个map方法
import { mapState, mapGetters, mapMutations, mapActions } from "vuex";
export default {
  name: "Count",
  data() {
    return {
      n: 1,
    };
  },
  computed: {
    //借助mapState生成计算属性,从state中读取数据。(数组写法)
    ...mapState('CountOptions',["sum", "school", "subject"]),
    ...mapState('PersonOptions',["persons"]),
    //借助mapGetters生成计算属性,从getters中读取数据。(数组写法)
    ...mapGetters('CountOptions',["bigSum"]),
  },
  methods: {
    //借助mapMutations生成对应的方法,方法中会调用commit去联系mutations(对象写法)
    ...mapMutations('CountOptions',{ add: "ADD", subtract: "SUBTRACT" }),
    //借助mapActions生成对应的方法,方法中会调用dispatch去联系actions(对象写法)
    ...mapActions('CountOptions',["addOdd", "addWait"]),
  },
};
</script>

<style>
h1,
h3,
li {
  color: pink;
}
select {
  width: 50px;
  background: pink;
}
button {
  margin: 5px;
  padding: 5px 10px;
  background: pink;
  border: none;
  cursor: pointer;
}
</style>

Person组件不使用map方法,和上面的写法进行一个对比

<template>
  <div>
    <h1>人员列表</h1>
    <h3 style="color: red">Count组件求和为:{{ sum }}</h3>
    <h3>列表中第一个人的名字是:{{ firstPersonName }}</h3>
    <input type="text" placeholder="请输入名字" v-model="name" />
    <button @click="add">添加</button>
    <button @click="addZhang">添加一个姓张的人</button>
    <button @click="addPersonServer">随机添加一条语录</button>

    <ul>
      <li v-for="p in persons" :key="p.id">{{ p.name }}</li>
    </ul>
  </div>
</template>

<script>
import { nanoid } from "nanoid";
export default {
  name: "Person",
  data() {
    return {
      name: "",
    };
  },
  computed: {
    persons() {
      //   return this.$store.state.persons
      return this.$store.state.PersonOptions.persons;
    },
    sum() {
      return this.$store.state.CountOptions.sum;
    },
    firstPersonName() {
      return this.$store.getters["PersonOptions/firstPersonName"];
    },
  },
  methods: {
    add() {
      const personObj = { id: nanoid(), name: this.name };
      this.$store.commit("PersonOptions/PersonAdd", personObj);
    },
    addZhang() {
      const personObj = { id: nanoid(), name: this.name };
      this.$store.dispatch("PersonOptions/addZhang", personObj);
    },
    addPersonServer() {
        this.$store.dispatch('PersonOptions/addPersonServer')
    }
  },
  mounted() {
    console.log(this.$store);
  },
};
</script>

<style>
input::placeholder {
  color: pink;
}
input {
  border: 1px solid pink;
  padding: 5px;
}
</style>

store/index.js文件

//引入Vue核心库
import Vue from 'vue'
//引入Vuex
import Vuex from 'vuex'
import axios from 'axios'
import { nanoid } from 'nanoid'
//应用Vuex插件
Vue.use(Vuex)

const CountOptions = {
	namespaced: true,
	actions: {
		addOdd(context, value) {
			if (context.state.sum % 2) {
				context.commit('ADD', value)
			};
		},
		addWait(context, value) {
			setTimeout(() => {
				context.commit('ADD', value)
			}, 500);
		}
	},
	mutations: {
		ADD(state, value) {

			state.sum += value
		},
		SUBTRACT(state, value) {
			state.sum -= value
		},
	},
	state: {
		sum: 0, //求和数
		school: '哔站',
		subject: '前端',
	},
	getters: {
		bigSum(state) {
			return state.sum * 10
		}
	}
}
const PersonOptions = {
	namespaced: true,
	actions: {
		addZhang(context, value) {
			if (value.name.indexOf('张') === 0) {
				context.commit('PersonAdd', value)
			} else { alert('请输入姓张的人') }
		},
		addPersonServer(context) {
			axios({
				methods: 'get',
				url: 'https://api.uixsj.cn/hitokoto/get?type=social'
			}).then(response => {
				context.commit('PersonAdd', { id: nanoid(), name: response.data })
			}, error => { 
				alert(error.message)
			})
		}
	},
	mutations: {
		PersonAdd(state, value) {
			state.persons.unshift(value)
		}
	},
	state: {
		persons: [{ id: "001", name: '张三' }]
	},
	getters: {
		firstPersonName(state) {
			return state.persons[0].name
		}
	}
}

//创建并暴露store
export default new Vuex.Store({
	modules: {
		CountOptions,
		PersonOptions
	}
})

store/index.js文件进行拆分

  • 目录结构
    在这里插入图片描述
    index.js
//引入Vue核心库
import Vue from 'vue'
//引入Vuex
import Vuex from 'vuex'


import CountOptions from './CountOptions'
import PersonOptions from './PersonOptions'
//应用Vuex插件
Vue.use(Vuex)

//创建并暴露store
export default new Vuex.Store({
	modules: {
		CountOptions,
		PersonOptions
	}
})

CountOptions.js

export default {
	namespaced: true,
	actions: {
		addOdd(context, value) {
			if (context.state.sum % 2) {
				context.commit('ADD', value)
			};
		},
		addWait(context, value) {
			setTimeout(() => {
				context.commit('ADD', value)
			}, 500);
		}
	},
	mutations: {
		ADD(state, value) {

			state.sum += value
		},
		SUBTRACT(state, value) {
			state.sum -= value
		},
	},
	state: {
		sum: 0, //求和数
		school: '哔站',
		subject: '前端',
	},
	getters: {
		bigSum(state) {
			return state.sum * 10
		}
	}
}

PersonOptions.js

import axios from 'axios'
import { nanoid } from 'nanoid'
export default {
    namespaced: true,
    actions: {
        addZhang(context, value) {
            if (value.name.indexOf('张') === 0) {
                context.commit('PersonAdd', value)
            } else { alert('请输入姓张的人') }
        },
        addPersonServer(context) {
            axios({
                methods: 'get',
                url: 'https://api.uixsj.cn/hitokoto/get?type=social'
            }).then(response => {
                context.commit('PersonAdd', { id: nanoid(), name: response.data })
            }, error => {
                alert(error.message)
            })
        }
    },
    mutations: {
        PersonAdd(state, value) {
            state.persons.unshift(value)
        }
    },
    state: {
        persons: [{ id: "001", name: '张三' }]
    },
    getters: {
        firstPersonName(state) {
            return state.persons[0].name
        }
    }
}

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

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

相关文章

linux网络设置

文章目录 一、查看网络配置1.查看网络接口信息——ifconfig1.1查看所有本机的网络的网络设备1.2设置网络接口参数1.3对指定的设备开启或关闭 2.查看主机名称——hostname2.1查看或临时设置当前主机名2.2永久设置主机名 3.查看路由表条目——route3.1查看当前主机路由表3.2添加路…

Redis入门到实战笔记-数据类型

这里写目录标题 SQL与NoSQL关系型数据库&#xff1a;查询方式&#xff1a; 非关联数据库&#xff1a;查询方式&#xff1a; 总结 认识RedisRedis安装远程连接防火墙设置关闭防火墙开启防火墙检查防火墙状态开放指定端口 Redis数据类型和常见命令keysdelEXISTexpired&#xff0c…

C++——多态与虚表

目录 1.多态的实现 2.虚表 2.1虚函数重写是怎么实现的 2.2多态的原理 2.3静态绑定与动态绑定 3.单继承体系中的虚函数表 ​编辑4.多继承体系中的虚函数表 5.菱形继承的虚函数表 6.菱形虚拟继承的虚函数表 1.多态的实现 在C中&#xff0c;要想实现多态&#xff0c;必…

Metasploit超详细安装及使用教程(图文版)

通过本篇文章&#xff0c;我们将会学习以下内容&#xff1a; 1、在Windows上安装Metasploit 2、在Linux和MacOS上安装Metasploit 3、在Kali Linux中使用 Metasploit 4、升级Kali Linux 5、使用虚拟化软件构建渗透测试实验环境 6、配置SSH连接 7、使用SSH连接Kali 8、配…

Ansible基础6——文件模块、jinja2模板

文章目录 一、常用文件模块1.1 blockinfile模块1.2 file模块1.2.1 创建文件并赋予权限1.2.2 创建目录并赋予权限1.2.3 创建软连接1.2.4 删除文件或目录 1.3 fetch模块1.4 lineinfile模块1.5 stat模块1.6 synchronize模块 二、jinja2模板2.1 构建jinja2模板2.2 管理jinja2模板2.…

MAYLAND HOME官网上线 | LTD家居家装行业案例分享

​一、公司介绍 在MAYLAND HOME&#xff0c;我们为我们对质量和服务的承诺感到自豪。我们相信我们的成功与客户的满意度直接相关&#xff0c;这就是为什么我们努力超越您的期望&#xff0c;我们承担的每一个项目。无论您是想升级您的家庭还是企业&#xff0c;我们都会在这里帮助…

冈萨雷斯DIP第5章知识点

图像增强&#xff1a;主要是一种 主观处理&#xff0c;而图像复原很大程度上是一种 客观处理。 5.1 图像退化/复原处理的一个模型 如图5.1 本章把图像退化建模为一个算子 H \mathcal{H} H 该算子 与一个加性噪声项 η ( x , y ) η(x,y) η(x,y) 共同对输入图像 f ( x , y…

MKS SERVO4257D 闭环步进电机_系列2 菜单说明

第1部分 产品介绍 MKS SERVO 28D/35D/42D/57D 系列闭环步进电机是创客基地为满足市场需求而自主研发的一款产品。具备脉冲接口和RS485/CAN串行接口&#xff0c;支持MODBUS-RTU通讯协议&#xff0c;内置高效FOC矢量算法&#xff0c;采用高精度编码器&#xff0c;通过位置反馈&am…

开源情报搜集系统的核心技术

随着科技快速发展&#xff0c;科研方向的开源情报搜集系统的应用越来越广泛。为了满足科研工作者的需求&#xff0c;开发人员大力研发了许多功能强大的科研开源情报系统。这些系统不仅可以帮助科研人员更加高效地获取、管理和利用科研信息资源&#xff0c;还能为他们提供全方位…

原来CSS的登录界面可以变得这么好看

个人名片&#xff1a; &#x1f60a;作者简介&#xff1a;一名大一在校生&#xff0c;web前端开发专业 &#x1f921; 个人主页&#xff1a;几何小超 &#x1f43c;座右铭&#xff1a;懒惰受到的惩罚不仅仅是自己的失败&#xff0c;还有别人的成功。 &#x1f385;**学习目…

Sequelize:Node.js 中的强大 ORM 框架

❤️砥砺前行&#xff0c;不负余光&#xff0c;永远在路上❤️ 目录 前言优势&#xff1a;提高效率&#xff0c;不用SQL即可完成数据库操作。 那什么是 Sequelize&#xff1f;主要特性&#xff1a;1、模型定义和映射&#xff1a;2、关联和联接&#xff1a;3、事务管理&#xff…

【网络协议详解】——DNS系统协议(学习笔记)

目录 &#x1f552; 1. DNS的作用&#x1f552; 2. 域名结构&#x1f552; 3. 域名分类&#x1f552; 4. 域名空间&#x1f552; 5. 域名服务器类型&#x1f558; 5.1 根域名服务器&#x1f558; 5.2 顶级域名服务器&#x1f558; 5.3 权限域名服务器&#x1f558; 5.4 本地域名…

英睿达内存条正品鉴别教程(镁光颗粒)

我们打算买一款二手镁光颗粒的英睿达内存条,需要从正面内存标签上的条形码、字串,从背面颗粒上的两行字符一一分析、检查、鉴别,最终确认是否正品,以及内存条等级如何。通过本片文章,您能学会如何进行镁光颗粒的英睿达内存条正品鉴别。 一、标签检查 首先,用百度条形码…

[数据集][目标检测]目标检测数据集大白菜数据集VOC格式1557张

数据集格式&#xff1a;Pascal VOC格式(不包含分割路径的txt文件和yolo格式的txt文件&#xff0c;仅仅包含jpg图片和对应的xml) 图片数量(jpg文件个数)&#xff1a;1557 标注数量(xml文件个数)&#xff1a;1557 标注类别数&#xff1a;1 标注类别名称:["cabbage"] 每…

mysql查询语句执行过程及运行原理命令

Mysql查询语句执行原理 数据库查询语句如何执行&#xff1f; DML语句首先进行语法分析&#xff0c;对使用sql表示的查询进行语法分析&#xff0c;生成查询语法分析树。语义检查&#xff1a;检查sql中所涉及的对象以及是否在数据库中存在&#xff0c;用户是否具有操作权限等视…

Spring Boot 数据库操作Druid和HikariDataSource

目录 Spring Boot 数据库操作 应用实例-需求 创建测试数据库和表 进行数据库开发&#xff0c; 在pom.xml 引入data-jdbc starter 参考官方文档 需要在pom.xml 指定导入数据库驱动 在application.yml 配置操作数据源的信息 创建bean\Furn.java 测试结果 整合Druid 到…

编码,Part 1:ASCII、汉字及 Unicode 标准

个人博客 编码的历史由来就懒得介绍了&#xff0c;只需要知道人类处理文本信息是以字符为基本单位&#xff0c;而计算机在最底层只认识 0/1&#xff0c;所以当计算机要为人类存储/呈现字符时&#xff0c;就需要有一个规则&#xff0c;在字符和 0/1 序列之间建立映射关系&#…

Java经典笔试题—day14

Java经典笔试题—day14 &#x1f50e;选择题&#x1f50e;编程题&#x1f36d;计算日期到天数转换&#x1f36d;幸运的袋子 &#x1f50e;结尾 &#x1f50e;选择题 (1)定义学生、教师和课程的关系模式 S (S#,Sn,Sd,Dc,SA &#xff09;&#xff08;其属性分别为学号、姓名、所…

网络通信IO模型上

计算机组成 计算机由软件和硬件组成&#xff0c;软件包括CPU、内存等&#xff0c;硬件包括主板&#xff0c;磁盘&#xff0c;IO设备&#xff08;网卡、鼠标、键盘等&#xff09;、电源按钮。 内核程序加载过程 当接通电源的时候1、BIOS就会把它的一段代码放入了内存当中&#…

压缩感知重构算法之正交匹配追踪算法(OMP)

算法的重构是压缩感知中重要的一步&#xff0c;是压缩感知的关键之处。因为重构算法关系着信号能否精确重建&#xff0c;国内外的研究学者致力于压缩感知的信号重建&#xff0c;并且取得了很大的进展&#xff0c;提出了很多的重构算法&#xff0c;每种算法都各有自己的优缺点&a…