【电商项目实战】购物车完善

🎉🎉欢迎来到我的CSDN主页!🎉🎉

🏅我是Java方文山,一个在CSDN分享笔记的博主。📚📚

🌟推荐给大家我的专栏《电商项目实战》。🎯🎯

👉点击这里,就可以查看我的主页啦!👇👇

Java方文山的个人主页

🎁如果感觉还不错的话请给我点赞吧!🎁🎁

💖期待你的加入,一起学习,一起进步!💖💖

请添加图片描述

前言 

我们已经完成了将数据加入购物车,这篇文章主要完善购物车页面的功能,比如:修改购物车的数量、全选、全不选、总价计算、小计计算等,话不多说上代码。

cart.html(页面代码)

<!DOCTYPE html>
<html>
<head lang="en">
	<#include "common/head.html">
	<link rel="stylesheet" type="text/css" href="css/public.css"/>
	<link rel="stylesheet" type="text/css" href="css/proList.css" />
</head>
<body onload="jisuan()">
<!--------------------------------------cart--------------------->
<div class="head ding">
	<div class="wrapper clearfix">
		<div class="clearfix" id="top">
			<h1 class="fl"><a href="${ctx}/"><img src="img/logo.png"/></a></h1>
			<div class="fr clearfix" id="top1">
				<form action="#" method="get" class="fl">
					<input type="text" placeholder="搜索" />
					<input type="button" />
				</form>
			</div>
		</div>
	</div>
</div>
<div class="cart mt">
	<!-----------------logo------------------->
	<!--<div class="logo">
				<h1 class="wrapper clearfix">
					<a href="${ctx}/"><img class="fl" src="img/temp/logo.png"></a>
					<img class="top" src="img/temp/cartTop01.png">
				</h1>
			</div>-->
	<!-----------------site------------------->
	<div class="site">
		<p class=" wrapper clearfix">
			<span class="fl">购物车</span>
			<img class="top" src="img/temp/cartTop01.png">
			<a href="${ctx}/" class="fr">继续购物&gt;</a>
		</p>
	</div>
	<!-----------------table------------------->
	<div class="table wrapper">
        <div class="tr">
            <div>商品</div>
            <div>单价</div>
            <div>数量</div>
            <div>小计</div>
            <div>操作</div>
        </div>
        <#--有数据就显示-->
        <#if item??>
		<#list item as g>
        <div class="th">
            <div class="pro clearfix">
                <label class="fl">
                    <input type="checkbox" data-gid="${g.gid}"/>
                    <span></span>
                </label>
                <a class="fl" href="#">
                    <dl class="clearfix">
                        <dt class="fl"><img src="${(g.goodsImg)!}" style="width: 100px;height: 100px"></dt>
                        <dd class="fl">
                            <p>${(g.goodsName)!}</p>
                            <p>颜色分类:</p>
                            <p>${(g.goodsType)!}</p>
                        </dd>
                    </dl>
                </a>
            </div>
            <div class="price myprice">¥${(g.goodsPrice)!}</div>
            <div class="number">
                <p class="num clearfix">
                    <img class="fl sub" src="img/temp/sub.jpg">
                    <span class="fl mycount" data-gid="${(g.gid)!}">${(g.num)!}</span>
                    <img class="fl add" src="img/temp/add.jpg">
                </p>
            </div>
            <div class="price sAll">¥${(g.goodsPrice*g.num)!}</div>
            <div class="price"><a class="del" data-gid="${g.gid}">删除</a></div>
        </div>
		</#list>

        <#else>
        <div class="goOn">空空如也~<a href="${ctx}/">去逛逛</a></div>
        </#if>

        <div class="tr clearfix">
            <label class="fl">
                <input class="checkAll" type="checkbox"/>
                <span></span>
            </label>
            <p class="fl">
                <a href="javascript:void(0);">全选</a>
                <a href="javascript:void(0);" class="del">删除</a>
            </p>
            <p class="fr">
                <span>共<small id="sl">0</small>件商品</span>
                <span>合计:&nbsp;<small id="all">¥0.00</small></span>
                <a class="count">结算</a>
            </p>
        </div>
    </div>
</div>
<div class="mask"></div>
<div class="tipDel">
	<p>确定要删除该商品吗?</p>
	<p class="clearfix">
		<a class="fl cer" href="javascript:void(0);">确定</a>
		<a class="fr cancel" href="javascript:void(0);">取消</a>
	</p>
</div>
<!--返回顶部-->
<#include "common/footer.html">
<!----------------mask------------------->
<div class="mask"></div>
<!-------------------mask内容------------------->
<div class="proDets">
	<img class="off" src="img/temp/off.jpg" />
	<div class="proCon clearfix">
		<div class="proImg fr">
			<img class="list" src="img/temp/proDet.jpg"  />
			<div class="smallImg clearfix">
				<img src="img/temp/proDet01.jpg" data-src="img/temp/proDet01_big.jpg">
				<img src="img/temp/proDet02.jpg" data-src="img/temp/proDet02_big.jpg">
				<img src="img/temp/proDet03.jpg" data-src="img/temp/proDet03_big.jpg">
				<img src="img/temp/proDet04.jpg" data-src="img/temp/proDet04_big.jpg">
			</div>
		</div>
		<div class="fl">
			<div class="proIntro change">
				<p>颜色分类</p>
				<div class="smallImg clearfix">
					<p class="fl on"><img src="img/temp/prosmall01.jpg" alt="白瓷花瓶+20支快乐花" data-src="img/temp/proBig01.jpg"></p>
					<p class="fl"><img src="img/temp/prosmall02.jpg" alt="白瓷花瓶+20支兔尾巴草" data-src="img/temp/proBig02.jpg"></p>
					<p class="fl"><img src="img/temp/prosmall03.jpg" alt="20支快乐花" data-src="img/temp/proBig03.jpg"></p>
					<p class="fl"><img src="img/temp/prosmall04.jpg" alt="20支兔尾巴草" data-src="img/temp/proBig04.jpg"></p>
				</div>
			</div>
			<div class="changeBtn clearfix">
				<a href="#2" class="fl"><p class="buy">确认</p></a>
				<a href="#2" class="fr"><p class="cart">取消</p></a>
			</div>
		</div>
	</div>
</div>
<div class="pleaseC">
	<p>请选择宝贝</p>
	<img class="off" src="img/temp/off.jpg" />
</div>
<script src="js/public.js" type="text/javascript" charset="utf-8"></script>
<script src="js/pro.js" type="text/javascript" charset="utf-8"></script>
<script src="js/cart.js" type="text/javascript" charset="utf-8"></script>
</body>
</html>

一、购物车功能完善(前端)

前面说到,我们cart.html的js代码都是移到cart.js里面的显示代码与功能代码区分开来,我们就直接在js里面写方法即可。

1.计算选中商品

  • 首先定义了变量zsl用来保存选中的复选框对应的数量,初始化为0。
  • 然后通过选择器找到所有被选中的复选框的父元素.th,再在父元素中找到.num span元素,即数量显示的元素。
  • 如果找到的数量为0,则将显示数量的元素#sl的文本设置为0。
  • 否则,遍历每个数量显示的元素,将其文本转换为整数并累加到zsl上,并将最终的结果设置为#sl的文本。
  • 最后判断#sl的文本是否大于0,如果是,则将.count元素的背景颜色设为红色#c10000,否则设为灰色#8e8e8e
function zg(){
		var zsl = 0;
		var index = $(".th input[type='checkbox']:checked").parents(".th").find(".num span");
		var len =index.length;
		if(len==0){
			$("#sl").text(0);
		}else{
			index.each(function(){
				zsl+=parseInt($(this).text());
				$("#sl").text(zsl);
			})
		}
		if($("#sl").text()>0){
			$(".count").css("background","#c10000");
		}else{
			$(".count").css("background","#8e8e8e");
		}
	}

效果演示:

2.计算总价和小计 

  • 首先定义了变量all用来保存选中的复选框对应的小计金额的累加值,初始化为0。
  • 然后通过选择器获取所有被选中的复选框的数量。
  • 如果选中的复选框数量为0,则将显示总金额的元素#all的文本设置为¥0.00。
  • 否则,遍历每个被选中的复选框,对应的执行以下操作:
    • 获取该复选框所在父元素.pro的同级元素.sAll的文本内容,即小计金额(去除¥符号)。
    • 将小计金额转换为浮点数并累加到all上。
    • 更新显示总金额的元素#all的文本为¥加上累加的金额,并保留两位小数。
function jisuan(){
		//计算总价
		var all=0;
		var len =$(".th input[type='checkbox']:checked").length;
		if(len==0){
			 $("#all").text('¥'+parseFloat(0).toFixed(2));
		}else{
			 $(".th input[type='checkbox']:checked").each(function(){
			 	//获取小计里的数值
	        	var sAll = $(this).parents(".pro").siblings('.sAll').text().substring(1);
	        	//累加
	        	all+=parseFloat(sAll);
	        	//赋值
	        	$("#all").text('¥'+all.toFixed(2));
	        })
		}
		//计算小计
		$(".th").each((i,el)=>{
			//获得th中的价格
			let price=$(el).find('.myprice').text().replace("¥","")*1
			//获得th中的数量
			let count=$(el).find('.mycount').text()*1
			//放入小计
			$(el).find('.sAll').text(price*count)
		})
		
	}

效果演示:

3.商品全选 

  • 当单击一个复选框时,判断该复选框是否被选中以及是否具有checkAll类名。
  • 如果当前复选框被选中且具有checkAll类名,则将所有复选框都设置为选中状态,并调用zg()jisuan()函数。
  • 如果当前复选框被选中但没有checkAll类名,则将当前复选框设置为选中状态,如果所有复选框都被选中,则将所有复选框都设置为选中状态,并调用zg()jisuan()函数。
  • 如果当前复选框未选中且具有checkAll类名,则将所有复选框都设置为未选中状态,并调用zg()jisuan()函数。
  • 如果当前复选框未选中且没有checkAll类名,则将当前复选框设置为未选中状态,如果当前选中的复选框数量小于所有复选框数量,则将全选复选框设置为未选中状态,并调用zg()jisuan()函数。
$("input[type='checkbox']").on('click',function(){
		var sf = $(this).is(":checked");
		var sc= $(this).hasClass("checkAll");
		if(sf){
			if(sc){
				 $("input[type='checkbox']").each(function(){  
	                this.checked=true;  
	           }); 
				zg();
	           	jisuan();
			}else{
				$(this).checked=true; 
	            var len = $("input[type='checkbox']:checked").length;
	            var len1 = $("input").length-1;
				if(len==len1){
					 $("input[type='checkbox']").each(function(){  
		                this.checked=true;  
		            }); 
				}
				zg();
				jisuan();
			}
		}else{
			if(sc){
				 $("input[type='checkbox']").each(function(){  
	                this.checked=false;  
	           }); 
				zg();
				jisuan();
			}else{
				$(this).checked=false;
				var len = $(".th input[type='checkbox']:checked").length;
	            var len1 = $("input").length-1;
				if(len<len1){
					$('.checkAll').attr("checked",false);
				}
				zg();
				jisuan();
			}
		}
		
	});

效果演示: 

4.数量加减

  • 首先,parseInt($(this).siblings("span").text())用于获取当前点击按钮所在元素的兄弟元素中的文本内容,并将其转换为整数类型,得到商品的数量。
  • 接着,通过判断数量是否小于等于1来决定是否禁用减号按钮。
  • 如果数量大于1,将数量减1,并更新显示数量的元素的文本内容为新的数量。
  • 然后,通过一系列DOM操作找到当前商品所在的行元素,并获取该行元素上的单价文本内容(去除货币符号)。
  • 将单价和数量相乘,并使用.toFixed(2)方法保留两位小数,更新显示小计金额的元素的文本内容。
  • 最后,调用jisuan()zg()函数,这两个函数可能是其他计算或处理代码。
$(".num .sub").click(function(){
		var num = parseInt($(this).siblings("span").text());
		if(num<=1){
			$(this).attr("disabled","disabled");
		}else{
			num--;
			$(this).siblings("span").text(num);
			//获取除了货币符号以外的数字
			var price = $(this).parents(".number").prev().text().substring(1);
			//单价和数量相乘并保留两位小数
			$(this).parents(".th").find(".sAll").text('¥'+(num*price).toFixed(2));
			jisuan();
			zg();
		}
	});
	$(".num .add").click(function(){
		var num = parseInt($(this).siblings("span").text());
		if(num>=5){
			confirm("限购5件");
		}else{
			num++;
			$(this).siblings("span").text(num);
			var price = $(this).parents(".number").prev().text().substring(1);
			$(this).parents(".th").find(".sAll").text('¥'+(num*price).toFixed(2));
			jisuan();
			zg();
		}
	});

效果演示:

5.删除商品

  1. 如果点击的是单个删除按钮,即父级元素的父级元素包含.th类,那么会弹出一个确认框,询问用户是否要删除该项。如果用户点击确认按钮(.cer类),则执行以下操作:

    • 隐藏蒙层(.mask类)和确认框(.tipDel类)。
    • 删除对应的.th元素。
    • 解绑.cer类的点击事件处理函数。
    • 检查剩下的.th元素数量,如果没有了,则显示提示信息(.goOn类)。
  2. 如果点击的是多个一起删除按钮,即选中了多个复选框(.th input[type='checkbox']:checked),那么也会弹出一个确认框,询问用户是否要删除选中的项。如果用户点击确认按钮(.cer类),则执行以下操作:

    • 遍历每一个被选中的复选框元素,获取它们对应的父级的父级元素索引(.th元素的索引)。
    • 根据索引删除相应的.th元素。
    • 检查剩下的.th元素数量,如果没有了,则显示提示信息(.goOn类)。
    • 隐藏蒙层(.mask类)和确认框(.tipDel类)。
    • 更新一些相关信息,可能是执行zg()jisuan()方法。
$('.del').click(function(){
		//单个删除
		if($(this).parent().parent().hasClass("th")){
			$(".mask").show();
			$(".tipDel").show();
			index = $(this).parents(".th").index()-1;
			$('.cer').click(function(){
				$(".mask").hide();
				$(".tipDel").hide();
				$(".th").eq(index).remove();
				$('.cer').off('click');
				if($(".th").length==0){
					$(".table .goOn").show();
				}
			})
		}else{
			//选中多个一起删除
			if($(".th input[type='checkbox']:checked").length==0){
				$(".mask").show();
				$(".pleaseC").show();
			}
			else{
				$(".mask").show();
				$(".tipDel").show();
				$('.cer').click(function(){
					$(".th input[type='checkbox']:checked").each(function(j){
						index = $(this).parents('.th').index()-1;
						$(".th").eq(index).remove();
						if($(".th").length==0){
							$(".table .goOn").show();
						}
					})
					$(".mask").hide();
					$(".tipDel").hide();
					zg();
					jisuan();
				})
			}
		}
	})

二、购物车功能完善(后端)

 我们功能肯定不能只有前端发生变化,后端也需要做相应的操作,否则下次进来还是和之前一样

1.修改商品数量

为了明确我们拿到的是我们所选的商品,先在每个商品数量的span标签上加一个属性

 <span class="fl mycount" data-gid="${(g.gid)!}">${(g.num)!}</span>

 随后编写我们的修改商品数量的函数

function update (el,count){
		//获取该元素
		let dom=$(".mycount")
		//拿到商品id
		let gid=dom.attr("data-gid")
		let num=count
		//将数量发送到后端
		$.post('/cart/update',{num,gid},resp=>{
			if(resp.code==200){
				alert("修改数量成功")
			}
		},"json")

	}

这里我们只需要在加减函数中调用该方法即可,该函数中的修改数量弹窗可以删除方便用户体验,我这里先写上,方便展示我这段代码确实过了数据库。

效果演示:

2.删除商品

我们首先需要在复选框上和删除上加上“data-gid”的属性

随后在我们商品的js中添加几行代码即可

$('.del').click(function(){
		//不论删除单个还是多个都要保存到该集合
		let ids=[];
		//获取单条数据上面的gid属性
		let gid=$(this).attr('data-gid');
		ids.push(gid)
		//单个删除
		if($(this).parent().parent().hasClass("th")){
			$(".mask").show();
			$(".tipDel").show();
			index = $(this).parents(".th").index()-1;
			$('.cer').click(function(){
				$(".mask").hide();
				$(".tipDel").hide();
				$(".th").eq(index).remove();
				$('.cer').off('click');
				if($(".th").length==0){
					$(".table .goOn").show();
				}

				// 判断ids有无值
				if(ids.length>0){
					//将数量发送到后端
					$.post('/cart/del',{ids},resp=>{
						if(resp.code==200){
							alert("删除成功")
							location.href="http://localhost:8080/cart/getCart"
						}
					},"json")
				}
			})
		}else{
			//选中多个一起删除
			if($(".th input[type='checkbox']:checked").length==0){
				$(".mask").show();
				$(".pleaseC").show();
			}
			else{
				$(".mask").show();
				$(".tipDel").show();
				$('.cer').click(function(){
					$(".th input[type='checkbox']:checked").each(function(j){
						//获取单条数据上面的gid属性
						let gid=$(this).attr('data-gid');
						ids.push(gid)
						index = $(this).parents('.th').index()-1;
						$(".th").eq(index).remove();
						if($(".th").length==0){
							$(".table .goOn").show();
						}
					})
					$(".mask").hide();
					$(".tipDel").hide();
					zg();
					jisuan();
					//判断ids有无值
					if(ids.length>0){
						//将数量发送到后端
						$.post('/cart/del',{ids},resp=>{
							if(resp.code==200){
								alert("删除成功")
								location.href="http://localhost:8080/cart/getCart"
							}
						},"json")
					}

				})
			}
		}

	})

 后端controller代码

@RequestMapping("/del")
    @ResponseBody
    public JsonResponseBody<?> delete(@RequestParam("ids[]") List<String> ids, User user) {
        //存储用户购物车信息
        redisService.deleteCart(user, ids);
        return JsonResponseBody.success();
    }

service和impl代码

 void deleteCart(User user, List<String> ids);
@Override
    public void deleteCart(User user, List<String> ids) {
        HashOperations<String,String,GoodsVo> operations=redisTemplate.opsForHash();
        String bigKey=Constants.REDIS_CART_PREFIX + user.getId();
        for (String id : ids) {
            operations.delete(bigKey,id);
        }
    }

 效果演示:

请添加图片描述

到这里我的分享就结束了,欢迎到评论区探讨交流!!

💖如果觉得有用的话还请点个赞吧 💖

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

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

相关文章

ElasticSearch的DSL查询语法解析

Elasticsearch提供了基于ISON的DSL (Domain Specific Lanquage)来定义查询。 目录 一、常见查询类型 二、DSLQuery基本语法 三、全文检索查询 3.1 match查询&#xff1a;会对用户输入内容分词&#xff0c;常用于搜索框搜索 &#xff0c;语法&#xff1a; 3.2 multi match…

基于矩阵乘的CUDA编程优化过程

背景&#xff1a;网上很多关于矩阵乘的编程优化思路&#xff0c;本着看理论分析万遍&#xff0c;不如实际代码写一遍的想法&#xff0c;大概过一下优化思路。 矩阵乘的定义如下&#xff0c;约定矩阵的形状及存储方式为: A[M, K], B[K, N], C[M, N]。 CPU篇 朴素实现方法 按照…

canvas绘制网格线示例

查看专栏目录 canvas示例教程100专栏&#xff0c;提供canvas的基础知识&#xff0c;高级动画&#xff0c;相关应用扩展等信息。canvas作为html的一部分&#xff0c;是图像图标地图可视化的一个重要的基础&#xff0c;学好了canvas&#xff0c;在其他的一些应用上将会起到非常重…

自动化测试:等待方式

在自动化测试中&#xff0c;等待是一个重要的技术&#xff0c;用于处理页面加载、元素定位、元素状态改变等延迟问题。 等待能够确保在条件满足后再进行后续操作&#xff0c;提高自动化测试的稳定性以及可靠性。 等待方式&#xff1a;显示等待、隐式等待、线程睡眠 1. 显式等…

【学习笔记】环论

子环环同态理想单位元&#xff08;乘法单位元&#xff09;环与子环的单位元无必然关系,即子环不一定有单位元&#xff0c;有也不一定和环的单位元相同 比如 Z 6 Z_6 Z6​有单位元1&#xff0c;其子环 ( 2 ) (2) (2)单位元为4;Z有单位元1&#xff0c;其子环2Z没有单位元若R有单位…

B站不赚钱、“芒果”赚钱难,视频“后浪”火拼跨年夜

又是一年跨年时。 各大视频平台跨年晚会展开火拼&#xff0c;今年谁是赢家&#xff1f; 作为视频“后浪”&#xff0c;芒果超媒&#xff08;300413.SZ&#xff09;、哔哩哔哩&#xff08;09626.HK&#xff0c;下称“B站”&#xff09;此前相继公布了2023年三季报&#xff0c;…

什么是缓存、为什么要用缓存、缓存分类、缓存测试、缓存更新、缓存设计考虑点、缓存测试点

一、缓存 缓存是一种将数据存储在高速缓存中的技术&#xff0c;它可以提高应用程序的性能和响应速度。 二、 为什么要用缓存 1. 高性能(主要目的) 查询耗时&#xff0c;但变化少&#xff0c;又有很多读请求情况下&#xff0c;可以将查询结果放到缓存中。减少对数据库的压力&…

2024/1/2作业

成果 代码 main .c #include "sqi.h" #include "si7006.h" unsigned int num[10] {0xFC, 0x60, 0xDA,0xF2,0x66,0xB6,0xBE,0XE0,0xFE,0xF6}; //unsigned int wei[5]{0x10,0x20,0x40,0x80,0xF0}; unsigned short hum; short tem; extern void printf(…

C++day5作业

全局变量&#xff0c;int monster 10000;定义英雄类hero&#xff0c;受保护的属性string name&#xff0c;int hp,int attck&#xff1b;公有的无参构造&#xff0c;有参构造&#xff0c;虚成员函数 void Atk(){blood-0;}&#xff0c;法师类继承自英雄类&#xff0c;私有属性 …

HarmonyOS 组件通用属性之通用事件 文档参数讲解(按键事件)

最后 我们来看按键事件 按键事件是指 键盘 遥控器等按键设备交互的时候触发的事件 这边 我们还是以按钮为例 给大家演示一下 我们 event 参数的类型 变成了 KeyEvent 我们还是先看看 里面都有些什么东西 还是打开编辑器文档 组件通用信息 通用事件 下面的 按键事件 首先 这…

RocketMQ(Linux版本5.1.4)

1、停止之前的运行服务 [roottssvr1-c1 rocketmq-all-4.7.0-bin-release]# sh bin/mqshutdown namesrv No mqnamesrv running. [roottssvr1-c1 rocketmq-all-4.7.0-bin-release]# [roottssvr1-c1 rocketmq-all-4.7.0-bin-release]# [roottssvr1-c1 rocketmq-all-4.7.0-bin-r…

探索Java的魅力

从本篇文章开始&#xff0c;小编准备写一个关于java基础学习的系列文章&#xff0c;文章涉及到java语言中的基础组件、实现原理、使用场景、代码案例。看完下面一系列文章&#xff0c;希望能加深你对java的理解。 本篇文章作为本系列的第一篇文章&#xff0c;主要介绍一些java…

【实用工具】FFmpeg常用的命令

前言 FFmpeg是一个强大的多媒体处理工具&#xff0c;可以用于处理音频、视频和图像。 命令格式 ffmpeg {1} {2} -i {3} {4} {5} 上面命令中&#xff0c;五个部分的参数依次如下。 1.全局参数 2.输入文件参数 3.输入文件 4.输出文件参数 5.输出文件 常见命令行参数 -c&…

Power Apps 学习笔记 - IOrganizationService Interface

文章目录 1. IOrganization Interface1.1 基本介绍1.2 方法分析 2. Entity对象2.1 Constructor2.2 Properties2.3 Methods 3. 相关方法3.1 单行查询 Retrive3.2 多行查询 RetriveMultiple3.3 增加 Create3.4 删除 Delete3.5 修改 Update 4. 数据查询的不同实现方式4.1 QueryExp…

vite+Vue3学习笔记(3)——界面设计

1 Element-plus 这是一个基于Vue3的组件库&#xff0c;能够快速构建界面样式。 官网链接&#xff1a; https://element-plus.gitee.io/zh-CN/guide/design.html 1.1 基础组件 1.1.1 安装 项目中的终端输入&#xff1a; npm install --save element-plus 1.1.2 引用 1.1.2.1…

RAG LLM App开发实战

大型语言模型&#xff08;LLM&#xff09;无疑改变了我们与信息交互的方式。 然而&#xff0c;对于我们可以向他们提出的要求&#xff0c;它们也有相当多的限制。 LLM&#xff08;例如 Llama-2-70b、gpt-4 等&#xff09;仅了解他们接受过训练的信息&#xff0c;当我们要求他们…

Python爬虫---selenium基本使用(支持无界面浏览器PhantomJS和Chrome handless)

为什么使用selenium&#xff1f; 使用urllib.request.urlopen()模拟浏览器有时候获取不到数据,所以使用selenium (1) selenium是一个用于web应用程序测试的工具 (2) selenium 测试直接运行在浏览器中&#xff0c;就像真正的用户在操作一样 (3) 支持通过各种driver (FirfoxDri…

手机摄影学习

手机摄影学习 手机摄影前期知识1&#xff0c;成像基本原理2&#xff0c;什么是焦距3&#xff0c;快门&#xff08;简称s&#xff09;4&#xff0c;上面功能之间的相互影响5&#xff0c;焦点6&#xff0c;过爆、欠曝7&#xff0c;cmos&#xff08;感光芯片&#xff09;、测光、聚…

【web】vue 播放后端(flask)发送的 mp3 文件

文章目录 演示后端&#xff08;flask&#xff09;前端&#xff08;vue3&#xff09;重要说明 演示 后端&#xff08;flask&#xff09; 后端返回的是 mp3 文件的 url&#xff0c;是可以直接在浏览器上打开后播放的处理跨域请求pip install flask-cors后端代码from flask impor…

骑砍战团MOD开发(30)-游戏大地图map.txt

骑砍1战团mod开发-大地图制作方法_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1rz4y1c7wH/ 一.骑砍游戏大地图 骑砍RTS视角游戏大地图 大地图静态模型(map.txt) 军团/城镇图标(module_parties.py). 骑砍大地图的战争迷雾和天气通过API进行管理和控制: # Weather-h…