Vue入门三(表单控制|购物车案例|v-model进阶|与后端交互|计算属性|监听属性|Vue生命周期)

news2024/11/17 1:45:30

文章目录

  • 一、表单控制
  • 二、购物车案例
  • 三、v-model进阶
  • 四、与后端交互
    • 跨域问题解决,三种交互方法
    • 跨域问题详解
      • 1-CORS:后端代码控制,上面案例采用的方式
        • 1) 方式一:后端添加请求头
        • 2) 方式二:编写中间件
        • 3) 方式三:第三方模块django-cors-headers
      • 2-Nginx反向代理 (常用)
      • 3-JSONP:很老不会用了,它只能发get请求
      • 4-搭建Node代理服务器
  • 五、计算属性
    • 1) 重写过滤案例
  • 六、监听属性
  • 七、Vue生命周期
    • 八个生命周期钩子函数
    • 实操案例

一、表单控制

	<!DOCTYPE html>
	<html lang="en">
	<head>
	    <meta charset="UTF-8">
	    <title>Document</title>
	    <script src="../js/vue.js"></script>
	</head>
	
	<body>
	
	    <div id="div">
	        <h1>表单控制</h1>
	        <hr>
	        <p>用户名:<input type="text" v-model="username"></p>
	        <p>密码:<input type="password" v-model="password"></p>
	        <p>
	            性别:<br>
	            男:<input type="radio" v-model="gender" value="1">&nbsp;&nbsp;
	            女:<input type="radio" v-model="gender" value="2">
	        </p>
	        <p>记住密码:<input type="checkbox" v-model="set_pwd"></p>
	        <p>
	            爱好:<br>
	            运动:<input type="checkbox" v-model="hobby" value="运动">&nbsp;&nbsp;
	            健身:<input type="checkbox" v-model="hobby" value="健身">&nbsp;&nbsp;
	            旅游:<input type="checkbox" v-model="hobby" value="旅游">
	        </p>
	       <button @click="handleSubmit">提交</button>
	    </div>    
	
	    <script>
	        var vm = new Vue({
	            el:'#div',
	            data:{
	                username:'',
	                password:'',
	                gender:'',// radio单选,多个radio绑定同一个变量,选中某个,就对应value值
	                set_pwd:false,// checkbox 单选是true或false
	                hobby:[],// checkbox 多选是数组类型,必须一开始定义就是数组,多个checkbox绑定一个变量
	            },
	            methods:{
	                handleSubmit(){
	                    console.log(this.username,this.password,this.gender,this.set_pwd,this.hobby)
	                }
	            }
	
	        })
	
	    </script>
	</body>
	
	</html>

在这里插入图片描述


二、购物车案例

	<!DOCTYPE html>
	<html lang="en">
	<head>
	    <meta charset="UTF-8">
	    <title>Document</title>
	    <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.7.1/jquery.js"></script>
	    <script src="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.3.7/js/bootstrap.min.js"></script>
	    <link href="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet">
	    <script src="../js/vue.js"></script>
	    <style>
	        #table{
	            margin-top:50px;
	            margin-bottom:30px;
	        }
	        input[type='checkbox']{
	            cursor:pointer;
	        }
	        .btn{
	            border:1px solid rgb(138, 138, 138);
	        }
	    </style>
	</head>
	<body>
	    <div id="div" class="container">
	        <div class="row">
	            <div class="col-md-10 col-md-offset-1">
	                <h1 class="text-center" id="table">购物车商品结算清单</h1>
	                <table class="table table-hover table-bordered">
	                    <thead>
	                        <tr>
	                            <th class="text-center">商品id</th>
	                            <th class="text-center">商品名</th>
	                            <th class="text-center">商品价格</th>
	                            <th class="text-center">商品数量</th>
	                            <th class="text-center">
	                                全选or全不选&nbsp;&nbsp;<input type="checkbox" v-model="xuan" @change="CheckAll">
	                            </th>
	                            <th class="text-center">删除加购</th>
	                        </tr>
	                    </thead>
	                    <tbody>
	                        <tr v-for="data in shoplist">
	                            <td class="text-center">{{data.id}}</td>
	                            <td class="text-center">{{data.name}}</td>
	                            <td class="text-center">{{data.price}}</td>
	                            <td class="text-center">
	                                <span @click="CheckRemove(data)" class="btn">-</span>
	                                <span v-if="nm_count==true" @click="qieh">{{data.count}}</span>
                                	<input v-else type="number" class="form-control-static" @change="number(data)" v-model="data.count" @blur="qieh">
	                                <span @click="CheckAdd(data)" class="btn">+</span>
	                            </td>
	                            <td class="text-center">
	                                <input type="checkbox" @change="Checkxuan"  v-model="Bymore" :value="data">
	                            </td>
	                            <td class="text-center"><button class="btn btn-danger" @click="CheckDel(data)">删除</button></td>
	                        </tr>
	                    </tbody>
	                </table>
	
	                <h5>当前选中商品:{{Bymore}}</h5>
	
	                <h3>购物车结算金额为:¥{{CountPrice()}}</h3>
	            </div>
	            
	        </div>
	    </div>
	
	
	    <script>
	        var vm = new Vue({
	            el:'#div',
	            data:{
	                xuan:false,
	                shoplist:[
	                    {id:1,name:'巧克力',price:66,count:5},
	                    {id:2,name:'奶糖',price:3,count:8},
	                    {id:3,name:'辣条',price:6,count:4},
	                    {id:4,name:'果汁',price:9,count:55},
	                    {id:5,name:'薯片',price:12,count:33},
	                ],
	                Bymore:[],
	                nm_count:true,
	            },
	            methods:{
	                CountPrice(){ //对勾选物品进行实时总价格计算
	                    var total = 0
	                    for(var item of this.Bymore){
	                        total += item.price*item.count
	                    }
	                    return total
	                },
	                CheckAll(){ //全选或全不选状态监控
	                    if(this.xuan==true){
	                        this.Bymore=this.shoplist
	                    }else{
	                        this.Bymore=[]
	                    }
	                },
	                number(data){  //对coun数量设置最少不能小于1
	                    if(data.count<1){
	                        data.count=1
	                    }
	                },
	                Checkxuan(){ //对单选进行监控,商品全勾选自动给全选勾上,否则不勾
	                    if(this.Bymore.length==this.shoplist.length){
	                        this.xuan=true
	                    }else{this.xuan=false}
	                },
	                CheckAdd(data){ //点击事件,添加商品数量
	                   data.count++
	                },
	                CheckRemove(data){ //点击事件,减去商品数量,限制大于1
	                    if (data.count>1){
	                        data.count--
	                    }
	                },
	                CheckDel(data){ //点击对商品列表进行删除
	                    if(this.shoplist.indexOf(data)>0){
                            console.log(this.shoplist.splice(this.shoplist.indexOf(data),1))
                        }
	                },
	                qieh(){ //对商品数量进行自选添加数量
	                    this.nm_count=!this.nm_count
	                    //console.log(this.nm_count)
                	}
	
	            }
	        })
	    </script>
	</body>
	</html>

在这里插入图片描述


三、v-model进阶

v-model双向数据绑定,还可以对输入框数据进行一定的限定。

v-modle释义
lazy等待input框的数据绑定时区焦点之后再变化
number以数字开头并只保留后面的数字,不保留字母;字母开头都保留
trim去除首位的空格
	<!DOCTYPE html>
	<html lang="en">
	<head>
	    <meta charset="UTF-8">
	    <title>Document</title>
	    <script src="../js/vue.js"></script>
	</head>
	<body>
	    <div id="div">
	        <h1>v-model进阶用法</h1><p/>
	        默认v-model----><input type="text" v-model="name">------->{{name}}<p/>
	        lazy----><input type="text" v-model.lazy="name1">------->{{name1}}<p/>
	        number----><input type="text" v-model.number="name2">------->{{name2}}<p/>
	        trim----><input type="text" v-model.trim="name3">------->{{name3}}
	    </div>

	    <script>
	        var vm = new Vue({
	            el:'#div',
	            data:{
	                name:'',
	                name1:'',
	                name2:'',
	                name3:'',
	            },
	            methods:{
	
	            }
	        })
	    </script>
	</body>
	</html>

在这里插入图片描述


四、与后端交互

跨域问题解决,三种交互方法

与后端交互统一使用json编码格式

与后端交互涉及到跨域问题后,该如何解决跨域问题?

  • 当前端发送请求,后端响应了,但是前端还是报错,这是因为:跨域问题的存在,浏览器检测到前端与后端不是来自同一个,所以认为这是不安全的,最终也就拦截了该资源的传递
  • 想要解决这个问题,就要实现:CORS,也就是跨域资源共享
    • 浏览器的原因,只要不是向地址栏中的【域:地址和端口】发送请求,拿到的数据,浏览器就会拦截
      • 拦截例子:跨域问题
    • 解决:在后端响应头中添加headers={'Access-Control-Allow-Origin':'*'}
	<!DOCTYPE html>
	<html lang="en">
	<head>
	    <meta charset="UTF-8">
	    <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.7.1/jquery.js"></script>
	    <script src="../js/vue.js"></script>
	    <script src="https://unpkg.com/axios/dist/axios.min.js"></script>
	    <title>Document</title>
	</head>
	<body>
	    <div id="div">
	        <h1>jquery的ajax与后端交互</h1><p/> 
	        <!--一般不会在vue中使用jQuery的ajax发送请求,很多功能用不到-->
	        <h4>username: {{username}}</h4>
	        <h4>age:{{age}}</h4>
	        <button @click="clicksubmit1">点击获取数据</button>
	
	        <p/>
	        <hr>
	        <h1>JS的fetch与后端交互</h1>
	        <!--提供了一个 JavaScript 接口,用于访问和操纵 HTTP 管道的一些具体部分-->
	        <h4>username: {{username}}</h4>
	        <h4>age:{{age}}</h4>
	        <button @click="clicksubmit2">点击获取数据</button>
	
	        <p/>
	        <hr>
	        <h1>axios与后端交互</h1>
	        <!--第三方ajax,只有ajax没有别的功能,很小,底层基于XMLHttprequest-->
	        <h4>username: {{username}}</h4>
	        <h4>age:{{age}}</h4>
	        <button @click="clicksubmit3">点击获取数据</button>
	    </div>
	
	    <script>
	        var vm = new Vue({
	            el:'#div',
	            data:{
	                username:'',
	                age:'',
	            },
	            methods:{
	                //方式1:jQuery的ajax方式
	                clicksubmit1(){
	                    //向后端发送请求,拿到数据,赋值给username、age
	                    
	                    $.ajax({
	                        url:'http://127.0.0.1:8000/submit/',
	                        method:'get',
	                        success:data=>{
	                            console.log(typeof data)
	                            this.username=data.username
	                            this.age=data.age
	                        }
	                    })
	                },
	
	                //方式2:原生js(fetch)发送请求
	                clicksubmit2(){
	                    //向后端发送请求,拿到数据,赋值给username、age
	                    // fetch('http://127.0.0.1:8000/submit/')
	                    //     .then(function(response){
	                    //         return response.json();
	                    //     })
	                    //     .then(function(data){
	                    //         console.log(data);
	                    //     });
	
	                    //箭头函数
	                    fetch('http://127.0.0.1:8000/submit/')
	                        .then(response=>{
	                            return response.json();
	                        })
	                        .then(data=>{
	                            this.username=data.username
	                            this.age=data.age
	                        });
	                },
	
	                
	                //方式3:axios
	                clicksubmit3(){
	                    //向后端发送请求,拿到数据,赋值给username、age
	                    axios.get('http://127.0.0.1:8000/submit/')
	                        .then(result => {
	                            console.log(result.data);
	                            this.username=result.data.username
	                            this.age=result.data.age
	                        }).catch(error => {
	                            console.log(error);
	                        });
	                }
	
	            }
	
	        })
	    </script>
	</body>
	</html>

在这里插入图片描述


跨域问题详解

前端发送ajax请求,后端会有跨域的拦截,原因是:同源策略。同源策略(Same origin policy)是一种约定,它是浏览器最核心也最基本的安全功能,如果缺少了同源策略,则浏览器的正常功能可能都会受到影响。可以说Web是构建在同源策略基础之上的,浏览器只是针对同源策略的一种实现。

	-请求的url地址,必须与浏览器上的url地址处于同域上,也就是域名,端口,协议相同.
	-发送ajax请求的地址,必须跟浏览器上的url地址处于同域上 域[域名,地址,端口,协议]
	-请求成功,数据库返回,但是浏览器拦截
	
	
	# 补充:浏览器中输入域名,没有加端口
	-www.baidu.com---->dns--->解析成地址  192.168.2.3----》没有加端口,默认是80
    -dns解析,先找本地的host文件
    	-可以修改本地的host做映射

如何解决跨域问题?

1-CORS:后端代码控制,上面案例采用的方式

	# cors:    #xss,csrf---跨站请求伪造
	跨域资源共享:后端技术,就是在响应头中加入 固定的头,就会运行前端访问了
    
	'CORS基本流程'
	1.浏览器发出CORS简单请求
		只需要在头信息之中增加一个Origin字段。
		
	2.浏览器发出CORS非简单请求
		会在正式通信之前,增加一次HTTP查询请求,称为”预检”请求(preflight)。
		浏览器先询问服务器,当前网页所在的域名是否在服务器的许可名单之中,
		以及可以使用哪些HTTP动词和头信息字段。
		只有得到肯定答复,浏览器才会发出正式的XMLHttpRequest请求,否则就报错。


	'什么是简单请求,什么是非简单请求'
		# 符合如下条件,就是简单请求1) 请求方法是以下三种方法之一:
	        HEAD
	        GET
	        POST
	    (2)HTTP的头信息不超出以下几种字段:
	        Accept
	        Accept-Language
	        Content-Language
	        Last-Event-ID
	        Content-Type:只限于三个值application/x-www-form-urlencoded、
	        			multipart/form-data、text/plain
	        
	'演示简单和非简单请求'
		-如果是简单,直接发送真正的请求
	    -如果是非简单,先发送options,如果运行,再发真正的
1) 方式一:后端添加请求头
	# 前端发送axios不添加请求头---简单请求
	  created() {
	    this.$axios.get(this.$settings.BASE_URL+ '/home/banner/').then(res=>{
	      console.log(res)
	    })
	  },
    
	 # 允许的前端地址
	 return APIResponse(data=res.data, headers={
	 "Access-Control-Allow-Origin": "http://192.168.1.47:8080"})  # {code:100,msg:成功,data=[{},{}]}
	# 允许所有前端地址
	return APIResponse(data=res.data,headers={'Access-Control-Allow-Origin':'*'})  # {code:100,msg:成功,data=[{},{}]}
2) 方式二:编写中间件

解决跨域问题和请求头携带数据

	# 1.重写process_response方法
	from django.utils.deprecation import MiddlewareMixin
	class CorsMiddleWare(MiddlewareMixin):
	    def process_response(self, request, response):
	        if request.method == 'OPTIONS':  # 解决非简单请求的请求头
	            response["Access-Control-Allow-Headers"] = "*"
	        # 允许前端的地址,所有请求头允许
	        response["Access-Control-Allow-Origin"] = "*"
	        return response
	    
	# 2. 注册中间件
	MIDDLEWARE = [
	    'utils.common_middle.CorsMiddleWare'
	]
3) 方式三:第三方模块django-cors-headers
	# 第一步:安装
	pip install django-cors-headers
	# 第二步:配置app
	    INSTALLED_APPS = [
	        'corsheaders'
	    ]
	
	# 第三步:配置中间件
	    MIDDLEWARE = [
	        'corsheaders.middleware.CorsMiddleware',
	    ]
	# 第四步:在配置文件配置
	# 允许所有域
	CORS_ORIGIN_ALLOW_ALL = True
	# 允许的请求方式
	CORS_ALLOW_METHODS = (
		'DELETE',
		'GET',
		'OPTIONS',
		'PATCH',
		'POST',
		'PUT',
		'VIEW',
	)
	# 允许请求头中加的东西
	CORS_ALLOW_HEADERS = (
		'XMLHttpRequest',
		'X_FILENAME',
		'accept-encoding',
		'authorization',
		'content-type',
		'dnt',
		'origin',
		'user-agent',
		'x-csrftoken',
		'x-requested-with',
		'Pragma',
		'token',
	)

2-Nginx反向代理 (常用)

3-JSONP:很老不会用了,它只能发get请求

4-搭建Node代理服务器


五、计算属性

	<!DOCTYPE html>
	<html lang="en">
	<head>
	    <meta charset="UTF-8">
	    <title>Document</title>
	    <script src="https://unpkg.com/axios/dist/axios.min.js"></script>
	    <script src="../js/vue.js"></script>
	</head>
	<body>
	    <div id="div">
	        <h1>计算属性普通函数方式------>函数会重写计算</h1>
	        姓名:<input type="text" v-model="name">------>{{getName()}} <p/><br>
	        <hr>
	        <p>
	        <h1>计算属性Computed</h1>
		    年龄:<input type="text" v-model="age">------> {{NewAge}}<p/><br>
	    </div>
	
	    <script>
	        var vm = new Vue({
	            el:'#div',
	            data:{
	                name:'',
	                age:'',
	            },
	            methods:{
	            	//只要页面刷新(加载页面),函数就会执行,无论跟函数是否有关系
	                getName(){
	                    console.log('名字首字母大写了!')
	                    return this.name.substring(0,1).toUpperCase()+this.name.substring(1)
	                }
	            },
	            computed:{
	            	 //方法当属性来用,不加括号,只要computed里面的方法才能不加括号,一定要有返回值
	                NewAge(){
	                    console.log('计算属性----执行了')
	                    return Number(this.age)+20
	                }
	            }
	        })
	    </script>
	</body>
	</html>

在这里插入图片描述


1) 重写过滤案例

	<!DOCTYPE html>
	<html lang="en">
	<head>
	    <meta charset="UTF-8">
	    <title>Document</title>
	    <script src="../js/vue.js"></script>
	</head>
	
	<body>
	
	    <div id="div">
	        <h1>过滤案例重写使用computed</h1>
	        <input type="text" v-model="search" >
	        <ul>
	            <li v-for="item in NewDatelist">{{item}}</li>
	        </ul>
	    </div>    
	
	    <script>
	        var vm = new Vue({
	            el:'#div',
	            data:{
	                search:'',
	                datelist:['a', 'at', 'atom', 'be', 'beyond', 'bee', 'c', 'cs', 'csrf'],
	            },
	            computed:{
	                NewDatelist(){
	                    return this.datelist.filter(item => item.indexOf(this.search) >= 0)
	                }
	            }
	        })
	
	    </script>
	</body>
	
	</html>

在这里插入图片描述


六、监听属性

监听一个属性的变化 只要它发生变化 就执行一个函数

	<!DOCTYPE html>
	<html lang="en">
	<head>
	    <meta charset="UTF-8">
	    <title>Document</title>
	    <script src="../js/vue.js"></script>
	</head>
	
	<body>
	
	    <div id="div">
	        <h1>监听属性</h1>
	        <button @click="type='Python'">Python</button>&nbsp;&nbsp;|
	        <button @click="type='Java'">Java</button>
	        <br>
	        <hr>
	        {{type}}
	    </div>    
	
	    <script>
	        var vm = new Vue({
	            el:'#div',
	            data:{
	                type:'',
	            },
	            watch:{
	                type(){
	                    console.log('向后端发送请求')
	                    console.log(this.type)
	                }
	            }
	        })
	
	    </script>
	</body>
	
	</html>

在这里插入图片描述


七、Vue生命周期

对官网的生命周期进行理解注解的
在这里插入图片描述

八个生命周期钩子函数

函数释义
beforeCreate创建Vue实例之前调用
created创建Vue实例成功后调用(可以在此处发送异步请求后端数据)
beforeMount渲染DOM之前调用
mounted渲染DOM之后调用
beforeUpdate重新渲染之前调用(数据更新等操作时,控制DOM重新渲染)
updated重新渲染完成之后调用
beforeDestroy销毁之前调用
destroyed销毁之后调用

从vue实例创建开始直到实例被销毁,总共经历了8个生命周期钩子【只要写了就会执行】函数

	钩子:反序列化验证---》钩子函数
	学名[专门名字]---》面向切面编程(AOP)
	OOP:面向对象编程
	
	'用途'
	1 页面加载完成,向后端发请求拿数据
		写在created中  发送ajax请求
			有的人放在mounted中加载(也可以放,不过页面数据已经有了,
			请求来数据更新,就执行了Update,效率上不如在created中)
			
	2 组件中有定时任务,组件销毁,要销毁定时任务
		beforeDestroy
	    -组件一创建,created中启动一个定时器    
	    -组件被销毁,beforeDestroy销毁定时器

	'补充延时器和定时器'
   	-定时器
   	setInterval(()=>{
       console.log('每隔3s执行')
    },3000)
    -延时器
    setTimeout( ()=>{
        console.log('延时器,3s后执行')
    },3000)   	

实操案例

	<!DOCTYPE html>
	<html lang="en">
	<head>
	    <meta charset="UTF-8">
	    <title>Document</title>
	    <script src="../js/vue.js"></script>
	</head>
	
	<body>
	
	    <div id="div">
	        <h1>vue生命周期</h1>
	        <button @click="doubleShow">点击显示组件或消失</button>
	        <hr>
	        <!--全局组件,自定义-->
	        <child v-if="show==true"></child>
	    </div>    
	
	    <script>
	    	//全局组件
	        Vue.component('child',{
	            // 里面写html内容,必须包在一个标签中
	            template:` 
	                <div>
	                    <button @click="onClick">点击更新</button>
	                    <br>
	                    {{title}}
	                </div>
	            `,
	            data(){ // data必须是方法,返回对象
	                return {
	                    title:'vue生命周期',
	                    t:null,
	                }
	            },
	            methods:{
	                onClick(){
	                    this.title='新的vue生命周期'
	                }
	            },
	            beforeCreate(){ //组件创建前执行,html,js都是空的
	                console.group('当前状态:beforeCreate')
	                console.log('当前el状态:',this.$el)
	                console.log('当前data状态:',this.$data)
	            },
	            Created(){ // 组件创建完毕执行,js有值了,但是html还是空的
	                console.group('当前状态:Created')
	                console.log('当前el状态:',this.$el)
	                console.log('当前data状态:',this.$data)
	                 //创建定时器,每隔3秒打印hello world
	                this.t=setInterval(()=>{
	                    console.log('hello world')
	                },3000)
	            },
	            beforeMount(){ //挂载模版之前执行,js有值了,但是html还是空的
	                console.group('当前状态:beforeMount')
	                 console.log('当前el状态:',this.$el)
	                console.log('当前data状态:',this.$data)
	            },
	            mounted(){ //挂载模版完毕执行,js有值,html也有了
	                console.group('当前状态:mounted')
	                 console.log('当前el状态:',this.$el)
	                console.log('当前data状态:',this.$data)
	            },
	            beforeUpdate(){ //重新渲染之前执行,只要页面发生变化或js变化就会执行
	                console.group('当前状态:beforeUpdate')
	                console.log('当前el状态:',this.$el)
	                console.log('当前data状态:',this.$data)
	            },
	            updated(){ //重新渲染完毕执行,
	                console.group('当前状态:updated')
	                console.log('当前el状态:',this.$el)
	                console.log('当前data状态:',this.$data)
	            },
	            beforeDestroy(){ //销毁之前执行,资源清理工作
	                console.group('当前状态:beforeDestory')
	                 console.log('当前el状态:',this.$el)
	                console.log('当前data状态:',this.$data)
	            },
	            destroyed(){ //销毁之后执行,
	                console.group('当前状态:destroyed')
	                 console.log('当前el状态:',this.$el)
	                console.log('当前data状态:',this.$data)
	                //销毁定时器
	                clearInterval(this.t)
	                this.t=null
	            }
	        })
			
			//根组件
	        var vm = new Vue({
	            el:'#div',
	            data:{
	               show:false,
	            },
	            methods:{
	                doubleShow(){
	                    this.show=!this.show
	                }
	            }

	        })
	
	    </script>
	</body>
	
	</html>

在这里插入图片描述

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

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

相关文章

什么是线程?

线程 1. 线程概述 线程是计算机科学中的基本概念&#xff0c;指的是在一个进程中执行的独立指令流。通常&#xff0c;一个进程可以包含多个线程&#xff0c;它们共享进程的资源&#xff0c;如内存空间、文件句柄等&#xff0c;但每个线程有自己的独立执行流。线程是操作系统进…

Python图片格式转换与文字识别:技术与实践

目录 一、引言 二、Python图片格式转换 PIL库介绍 代码示例 质量优化 三、文字识别技术 四、Python实现文字识别 1、安装与配置OCR工具 2. 读取图片并提取文字 3. 优化与提高识别准确率 五、实践与应用案例 六、结论 一、引言 随着数字化时代的到来&#xff0c;图…

SOLIDWORKS 2024新功能之SOLIDWORKS PDM篇

SOLIDWORKS 2024 新功能 PDM篇目录概述 • 装配体直观 • 在 Web2 中下载文件的特定版本 • 文件类型图标 • “更改状态”命令中的签出选项 • 复制树对话框 • 查看检出事件详细信息 • 系统变量 • 查看许可证使用 • 数据安全增强功能 • SOLIDWORKS PDM 性能改进…

软件架构之事件驱动架构

一、定义 事件驱动的架构是围绕事件的发布、捕获、处理和存储&#xff08;或持久化&#xff09;而构建的集成模型。 某个应用或服务执行一项操作或经历另一个应用或服务可能想知道的更改时&#xff0c;就会发布一个事件&#xff08;也就是对该操作或更改的记录&#xff09;&am…

msckf_vio在ubuntu20.04中的编译

1.新建catkin workspace文件夹&#xff0c;并在其中新建src文件夹&#xff0c;并将源码clone至src内。 源码地址&#xff1a;https://github.com/KumarRobotics/msckf_vio 目录层级示意如下&#xff0c;build和devel不必新建&#xff0c;后续指令会自动新建。 2. 在编译之前…

虹科技术丨PCAN网关设备:打通通信壁垒,LED指示灯编程示例

来源&#xff1a;虹科汽车智能互联 虹科技术丨PCAN网关设备&#xff1a;打通通信壁垒&#xff0c;LED指示灯编程示例 原文链接&#xff1a;https://mp.weixin.qq.com/s/hpxssnDeD-43x3tyHJbAtA 欢迎关注虹科&#xff0c;为您提供最新资讯&#xff01; 导读 在工业自动化、汽…

python 文本内容随机生成器

这段代码是一个用于生成指定长度的随机文本的函数。主要包括两个函数&#xff1a;generate_text()和generate_other_content()。 generate_text(original_text, length)函数接受两个参数&#xff1a;原始文本和生成文本的长度。该函数的作用是根据原始文本生成指定长度的文本。…

竞赛保研 基于深度学习的人脸识别系统

前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 基于深度学习的人脸识别系统 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0c;学长非常推荐&#xff01; &#x1f9ff; 更多资料, 项目分享&#xff1a; https://gitee.com/dancheng-senior/…

【SpringCloud】之网关应用(进阶使用)

&#x1f389;&#x1f389;欢迎来到我的CSDN主页&#xff01;&#x1f389;&#x1f389; &#x1f3c5;我是君易--鑨&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;推荐给大家我的博客专栏《SpringCloud开发之网关应用》。&#x1f3af;&a…

基于ChatGPT4+Python近红外光谱数据分析及机器学习与深度学习建模

022年11月30日&#xff0c;可能将成为一个改变人类历史的日子——美国人工智能开发机构OpenAI推出了聊天机器人ChatGPT3.5&#xff0c;将人工智能的发展推向了一个新的高度。2023年4月&#xff0c;更强版本的ChatGPT4.0上线&#xff0c;文本、语音、图像等多模态交互方式使其在…

python——数字精度控制

num1 11 num2 11.345 print("数字11宽度限制为5&#xff0c;结果%5d" % num1) print("数字11宽度限制为1&#xff0c;结果%1d" % num1) print("数字11.345宽度限制为7&#xff0c;小数精度为2结果%7.2f" % num2) print("数字11.345不限制…

课堂纪律差如何整治

在教育的世界里&#xff0c;有时候课堂纪律会成为一种挑战。那些在教室里大声喧哗、无视规则的学生&#xff0c;常常让老师们头疼不已。那么&#xff0c;面对课堂纪律差的问题&#xff0c;我们应该如何有效整治呢&#xff1f;下面就让我来为你揭晓这个问题的答案。 一、建立明确…

比特币惊现“天地针”!ETF终局将至,美证监会账号被盗!谁该对市场波动负责?

就在投资者神经紧绷时刻&#xff0c;万众期待的ETF批准事件再次闹出“假新闻”大乌龙&#xff0c;而这次的主角竟是美证监会。 美国东部时间周二下午4:11&#xff0c;美国证券交易委员会&#xff08;SEC&#xff09;官方X账户发布帖子称&#xff1a;“今天&#xff0c;美国证券…

数据结构之单调栈、单调队列

今天学习了单调栈还有单调队列的概念和使用&#xff0c;接下来我将对其定义并配合几道习题进行讲解&#xff1a; 首先先来复习一下栈与队列&#xff1a; 然后我们来看一下单调栈的定义&#xff1a; 单调栈中的元素从栈底到栈顶的元素的大小是按照单调递增或者单调递减的关系进…

九州金榜|厌学原因孩子情绪不稳定

孩子厌学是每个家长都不愿因看到&#xff0c;因为厌学会对孩子学习造成极大的影响&#xff0c;对于学习成绩下降这是必然的结果&#xff0c;所以&#xff0c;当孩子出现厌学情绪的时候&#xff0c;家长就会非常焦虑&#xff0c;但是对于孩子为什么会厌学&#xff0c;家长并不知…

烟火检测/区域人流统计/AI智能分析网关V4如何配置通道?

TSINGSEE青犀智能分析网关&#xff08;V4版&#xff09;是一款高性能、低功耗的软硬一体AI边缘计算硬件设备&#xff0c;硬件内部署了近40种AI算法模型&#xff0c;支持对接入的视频图像进行人、车、物、行为等实时检测分析&#xff0c;并上报识别结果&#xff0c;并能进行语音…

java SSM问卷调查系统myeclipse开发mysql数据库springMVC模式java编程计算机网页设计

一、源码特点 java SSM问卷调查管理系统是一套完善的web设计系统&#xff08;系统采用SSM框架进行设计开发&#xff0c;springspringMVCmybatis&#xff09;&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代 码和数据库&#xff0c;系统主要采…

【Vue】文件管理页面制作

<template><div><div style"margin: 10px 0"><el-input style"width: 200px" placeholder"请输入名称" suffix-icon"el-icon-search" v-model"name"></el-input><el-button class"ml…

Logo设计神器:适合新手的简易操作软件,快速入门!

标志设计软件在品牌营销和企业识别中发挥着重要作用。本文将对10款知名标志设计软件进行横向评价&#xff0c;从不同维度评价其功能、易用性、创意和适用性&#xff0c;帮助您选择最适合您需求的标志设计软件。 1.即时设计 推荐指数&#xff1a;★★★★★ 即时设计是一款功…

【LeetCode】winter vacation training

欢迎来到Cefler的博客&#x1f601; &#x1f54c;博客主页&#xff1a;那个传说中的man的主页 &#x1f3e0;个人专栏&#xff1a;题目解析 &#x1f30e;推荐文章&#xff1a;【LeetCode】winter vacation training 目录 &#x1f449;&#x1f3fb; 有效的字母异位词&#x…