当前位置: 首页 > news >正文

【基于SprintBoot+Mybatis+Mysql】电脑商城项目之显示勾选的购物车数据和创建订单

🧸安清h:个人主页 

   🎥个人专栏:【Spring篇】【计算机网络】【Mybatis篇】

🚦作者简介:一个有趣爱睡觉的intp,期待和更多人分享自己所学知识的真诚大学生。


目录

🚀1.显示勾选的购物车数据-持久层

✨1.1规划SQL语句

✨1.2设计接口和抽象方法

✨1.3配置SQL映射

🚀2.显示勾选的购物车数据-业务层

✨2.2设计接口和抽象方法

✨2.3完成抽象方法的设计 

🚀3.显示勾选的购物车数据-控制层

✨3.1设计请求

✨3.2处理请求

🚀4.1显示勾选的购物车数据-前端页面

🚀4.2购物车页面显示收货地址列表-前端页面

🎯1.创建订单-数据表

🎯2.创建订单-实体类

🎯3.创建订单-持久层

✨3.1规划SQL语句

✨3.2设计接口和抽象方法

✨3.3配置SQL映射

🎯4.创建订单-业务层

🎯5.创建订单-控制层

✨5.1设计请求

✨5.2处理请求

🎯6.创建订单-前端页面


🚀1.显示勾选的购物车数据-持久层

✨1.1规划SQL语句

1.用户在购物车列表中通过随即勾选相关的商品,在点击“结算”按钮后跳转到结算页面,在这个页面中需要展示用户在上个页面所勾选的购物车对应的数据。列表的展示,展示的内容还是来自于购物车表。两个页面需要将用户勾选的cid传递给下一个页面。

当前只要cid的值能够达到in里面的任意一个值,都属于满足整体的where条件。用户在前端所传递过来的这个?的值,在后台可以用一个集合来接收到,然后层层传递给mapper,mapper用一个集合来代替就行了,只要cid属于集合中任意一个数就符合条件了。

selectcid,uid,pid,t_cart.price,t_cart.num,title,t_product.price as realPrice,image
from t_cart
left join t_product on t_cart.pid = t_product.id
where cid in (?,?,?)
order by t_cart.created_time desc

✨1.2设计接口和抽象方法

List<CartVO> findVOByCid(Integer[] cids);

✨1.3配置SQL映射

    <select id="findVOByCid" resultType="com.cy.store.Vo.CartVO">selectcid,uid,pid,t_cart.price,t_cart.num,title,t_product.price as realPrice,imagefrom t_cartleft join t_product on t_cart.pid = t_product.idwhere cid in (<foreach collection="array" item="cid" separator=",">   --把每个cid拿到,中间用,分隔#{cid}</foreach>)order by t_cart.created_time desc</select>

进行单元测试

    @Testpublic void findVOByCids() {Integer[] cids = {1,2,3,9};System.out.println(cartMapper.findVOByCid(cids));}

🚀2.显示勾选的购物车数据-业务层

2.1查询语句,无异常规划。

✨2.2设计接口和抽象方法

List<CartVO> getVOByCid(Integer uid, Integer[] cids);

✨2.3完成抽象方法的设计 

@Overridepublic List<CartVO> getVOByCid(Integer uid,Integer[] cids) {List<CartVO> list = cartMapper.findVOByCid(cids);Iterator<CartVO> it = list.iterator();while (it.hasNext()) {CartVO cartVO = it.next();if (!cartVO.getUid().equals(uid)) { //表示当前的数据不属于当前的用户//从集合中移除这个元素list.remove(cartVO);}}return list;}

🚀3.显示勾选的购物车数据-控制层

✨3.1设计请求

请求路径:/carts/list

请求方式:POST

请求数据:Integer[] cids ,HttpSession session

响应结果:JsonResult<List<CartVO>>

✨3.2处理请求

    @RequestMapping("list")public JsonResult<List<CartVO>> getVOByCid(Integer[] cids, HttpSession session) {List<CartVO> data = cartService.getVOByCid(getuidFromSession(session), cids);return new JsonResult<>(OK, data);}

🚀4.1显示勾选的购物车数据-前端页面

1.把type属性改成submit,让其自动提交。

<input type="submit" value="  结  算  " class="btn btn-primary btn-lg link-account" />

2.orderConfirm.html页面中添加自动加载从上个页面中传递过来的cids数据,再去请求ajax,再在ajax中进行填充到当前的某个区域。

3.注释掉以下代码:

<script src="../js/orderConfirm.js" type="text/javascript" charset="utf-8"></script>
<script type="text/javascript">$(document).ready(function() {showCartList();});function showCartList() {$("#cart-list").empty();$.ajax({url: "/carts/list",type: "GET",data: location.search.substr(1),  //截问号后的第一个参数dataType: "JSON",success: function(json) {if (json.state == 200) {let list = json.data;let allCount = 0;let allPrice = 0;for (let i = 0; i < list.length; i++) {let tr = '<tr>\n' +'<td><img src="..#{image}collect.png" class="img-responsive" /></td>\n' +'<td>#{title}</td>\n' +'<td>¥<span>#{price}</span></td>\n' +'<td>#{num}</td>\n' +'<td><span>#{totalPrice}</span></td>\n' +'</tr>';tr = tr.replace("#{image}",list[i].image);tr = tr.replace("#{title}",list[i].title);tr = tr.replace("#{price}",list[i].realPrice);tr = tr.replace("#{num}",list[i].num);tr = tr.replace("#{totalPrice}",list[i].realPrice*list[i].num);$("#cart-list").append(tr);allCount += list[i].num;allPrice += list[i].realPrice*list[i].num;}$("#all-count").html(allCount);$("#all-price").html(allPrice);}},error: function (xhr) {alert("结算时发生未知的异常"+xhr.status);}});}
</script>

🚀4.2购物车页面显示收货地址列表-前端页面

1.收货地址存放在一个select下拉列表中,将查询到的当前登录用户的收货地址动态的加载到这个下拉列表中.从数据库的角度是一个select查询语句。已经编写了根据用户的uid来查询当前用户的收货地址数据。

2.orderConfirm.html页面中,收货地址数据的展示需要自动进行加载,需要将方法的逻辑放在ready函数中。

	$(document).ready(function() {showCartList();showAddressList();});
function showCartList() {$("#address-list").empty();$.ajax({url: "/addresses/",type: "GET",dataType: "JSON",success: function(json) {if (json.state == 200) {let list = json.data;for (let i = 0; i < list.length; i++) {var opt = '<option value="#{aid}">#{name}&nbsp;&nbsp;&nbsp;#{tag}&nbsp;&nbsp;&nbsp;#{provinceName}#{cityName}#{areaName}#{address}&nbsp;&nbsp;&nbsp;#{tel}</option>';opt = opt.replace("#{aid}",list[i].aid);opt = opt.replace("#{name}",list[i].name);opt = opt.replace("#{tag}",list[i].tag);opt = opt.replace("#{provinceName}",list[i].provinceName);opt = opt.replace("#{cityName}",list[i].cityName);opt = opt.replace("#{areaName}",list[i].areaName);opt = opt.replace("#{address}",list[i].address);opt = opt.replace("#{tel}",list[i].tel);$("#address-list").append(opt);}}},error: function (xhr) {alert("结算时发生未知的异常"+xhr.status);}});}

🎯1.创建订单-数据表

在数据库store中创建数据表t_order和t_order_item。

CREATE TABLE t_order (oid INT AUTO_INCREMENT COMMENT '订单id',uid INT NOT NULL COMMENT '用户id',recv_name VARCHAR(20) NOT NULL COMMENT '收货人姓名',recv_phone VARCHAR(20) COMMENT '收货人电话',recv_province VARCHAR(15) COMMENT '收货人所在省',recv_city VARCHAR(15) COMMENT '收货人所在市',recv_area VARCHAR(15) COMMENT '收货人所在区',recv_address VARCHAR(50) COMMENT '收货详细地址',total_price BIGINT COMMENT '总价',status INT COMMENT '状态:0-未支付,1-已支付,2-已取消,3-已关闭,4-已完成',order_time DATETIME COMMENT '下单时间',pay_time DATETIME COMMENT '支付时间',created_user VARCHAR(20) COMMENT '创建人',created_time DATETIME COMMENT '创建时间',modified_user VARCHAR(20) COMMENT '修改人',modified_time DATETIME COMMENT '修改时间',PRIMARY KEY (oid)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;CREATE TABLE t_order_item (id INT AUTO_INCREMENT COMMENT '订单中的商品记录的id',oid INT NOT NULL COMMENT '所归属的订单的id',pid INT NOT NULL COMMENT '商品的id',title VARCHAR(100) NOT NULL COMMENT '商品标题',image VARCHAR(500) COMMENT '商品图片',price BIGINT COMMENT '商品价格',num INT COMMENT '购买数量',created_user VARCHAR(20) COMMENT '创建人',created_time DATETIME COMMENT '创建时间',modified_user VARCHAR(20) COMMENT '修改人',modified_time DATETIME COMMENT '修改时间',PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

🎯2.创建订单-实体类

在com.cy.store.entity包下创建Order类并使其继承基类。

public class Order extends BaseEntity {private Integer oid;private Integer uid;private String recvName;private String recvPhone;private String recvProvince;private String recvCity;private String recvArea;private String recvAddress;private Long totalPrice;private Integer status;private Date orderTime;private Date payTime;
。。。。。。
}    

在com.cy.store.entity包下创建OrderItem类并使其继承基类。 

public class OrderItem extends BaseEntity {private Integer id;private Integer oid;private Integer pid;private String title;private String image;private Long price;private Integer num;
......
} 

🎯3.创建订单-持久层

✨3.1规划SQL语句

1.将数据插入到订单表中。

insert into t_order (oid除外所有的字段) values (字段值)

2.将数据插入订单项表中。

insert into t_order_item (id除外所有的字段) values (字段值)

✨3.2设计接口和抽象方法

创建一个OrderMapper接口,接口中添加以上两个SQL对象的抽象方法。

public interface OrderMapper {/*** 插入订单数据* @param order 订单数据* @return 受影响的行数*/Integer insertOrder(Order order);/*** 插入订单项的数据* @param orderItem 订单项数据* @return 受影响的行数*/Integer insertOrderItem(OrderItem orderItem);
}

✨3.3配置SQL映射

1.创建OrderMapper.xml文件。 

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.cy.store.mapper.OrderMapper"><insert id="insertOrder" useGeneratedKeys="true" keyProperty="oid">insert into t_order (uid, recv_name, recv_phone, recv_province, recv_city, recv_area, recv_address,total_price,status, order_time, pay_time, created_user, created_time, modified_user,modified_time) values (#{uid}, #{recvName}, #{recvPhone}, #{recvProvince}, #{recvCity}, #{recvArea},#{recvAddress}, #{totalPrice}, #{status}, #{orderTime}, #{payTime}, #{createdUser},#{createdTime}, #{modifiedUser}, #{modifiedTime})</insert><insert id="insertOrderItem" useGeneratedKeys="true" keyProperty="id">insert into t_order_item (oid, pid, title, image, price, num, created_user,created_time, modified_user, modified_time) values (#{oid}, #{pid}, #{title}, #{image}, #{price}, #{num}, #{createdUser},#{createdTime}, #{modifiedUser}, #{modifiedTime})</insert>
</mapper>

2.单元测试。

   @Testpublic void insertOrder(){Order order = new Order();order.setUid(6);order.setRecvName("子敬");order.setRecvPhone("384570219");orderMapper.insertOrder(order);}@Testpublic void insertOrderItem(){OrderItem orderItem = new OrderItem();orderItem.setOid(1);orderItem.setPid(10000002);orderItem.setTitle("广博(GuangBo)皮面日程本子 计划记事本效率手册米色FB60322");orderMapper.insertOrderItem(orderItem);}

🎯4.创建订单-业务层

1.在IAddressService接口中定义根据收货地址的id获取收货地址的数据。

Address getByAid(Integer aid);

 2.实现方法。

@Overridepublic Address getByAid(Integer aid,Integer uid) {Address address  =addressMapper.findByAid(aid);if(address == null){throw new AddressNotFoundException("收货地址数据不存在");}if(address.getUid().equals(uid)){throw new AccessDeniedException("非法数据访问");}address.setProvinceCode(null);address.setCityCode(null);address.setAreaCode(null);address.setCreatedUser(null);address.setCreatedTime(null);address.setModifiedUser(null);address.setModifiedTime(null);return address;}

3.在service包下创建IOrderService接口添加抽象方法用于创建订单。

public interface IOrderService {Address create(Integer aid,Integer uid,String username,Integer[] cids);
}

4.创建实现类OrderServiceImpl。

    @Autowiredprivate OrderMapper orderMapper;@Autowiredprivate IAddressService addressService;@Autowiredprivate ICartService cartService;@Overridepublic Order create(Integer aid, Integer uid, String username, Integer[] cids) {//即将要下单的列表List<CartVO> list = cartService.getVOByCid(uid,cids);//计算商品的总价Long totaolPrice = 0L;Address address = addressService.getByAid(aid, uid);Order order = new Order();order.setUid(uid);//收货地址数据order.setRecvName(address.getName());order.setRecvPhone(address.getPhone());order.setRecvProvince(address.getProvinceName());order.setRecvCity(address.getCityName());order.setRecvArea(address.getAreaName());order.setRecvAddress(address.getAddress());//支付,总价,时间order.setStatus(0);order.setTotalPrice(totaolPrice);order.setOrderTime(new Date());//日志order.setCreatedUser(username);order.setCreatedTime(new Date());order.setModifiedUser(username);order.setModifiedTime(new Date());Integer rows = orderMapper.insertOrder(order);if(rows != 1){throw new InsertException("插入时异常");}//创建订单详细项的数据for(CartVO c : list){//创建一个订单项数据对象OrderItem orderItem = new OrderItem();orderItem.setOid(order.getOid());orderItem.setPid(c.getPid());orderItem.setTitle(c.getTitle());orderItem.setImage(c.getImage());orderItem.setPrice(c.getPrice());orderItem.setNum(c.getNum());//日志字段orderItem.setCreatedUser(username);orderItem.setCreatedTime(new Date());orderItem.setModifiedUser(username);orderItem.setModifiedTime(new Date());//插入数据操作rows = orderMapper.insertOrderItem(orderItem);if(rows != 1){throw new InsertException("插入时异常");}orderMapper.insertOrderItem(orderItem);}return order;}

5.创建测试方法并完成测试。

@SpringBootTest
public class OrderServiceTests {@Autowiredprivate IOrderService orderService;@Testpublic void create(){Integer[] cids = {3,4};Order order = orderService.create(12,6,"小明",cids);System.out.println(order);}}

🎯5.创建订单-控制层

✨5.1设计请求

 请求路径:/orders/create/

请求参数:Integer aid,Integer[] cids,HttpSession session

请求类型:POST

响应结果:JsonResult<Order>

✨5.2处理请求

创建一个OrderController类,并编写处理请求方法。

@RequestMapping("/orders/")
@RestController
public class OrderController extends BaseController{@Autowiredprivate IOrderService orderService;@RequestMapping("create")public JsonResult<Order> create(Integer aid, Integer[] cids, HttpSession session){Order data = orderService.create(aid,getuidFromSession(session),getUsernameFromSession(session),cids);return new JsonResult<>(OK,data);}
}

🎯6.创建订单-前端页面

在订单确定页面中添加发送请求的处理方法。

	$("#btn-create-order").click(function() {let aid = $("#address-list").val();let cids = location.search.substr(1);$.ajax({url: "/orders/create",type: "GET",data: "aid="+aid + "&" + cids,dataType: "JSON",success: function(json) {if (json.state == 200) {location.href = "payment.html";alert("订单创建成功");console.log(json.data) //调试} else {alert("创建订单失败" + json.message);}},error: function(xhr) {alert("创建订单数据时产生未知的异常" + xhr.status);}});});

感谢各位的陪伴,最后一篇也更完啦🎉🎉🎉

相关文章:

【基于SprintBoot+Mybatis+Mysql】电脑商城项目之显示勾选的购物车数据和创建订单

&#x1f9f8;安清h&#xff1a;个人主页 &#x1f3a5;个人专栏&#xff1a;【Spring篇】【计算机网络】【Mybatis篇】 &#x1f6a6;作者简介&#xff1a;一个有趣爱睡觉的intp&#xff0c;期待和更多人分享自己所学知识的真诚大学生。 目录 &#x1f680;1.显示勾选的购物…...

AWS Lambda 架构深入探究

AWS Lambda 是现代云架构中最受欢迎的服务之一&#xff0c;因其能够在完全托管的无服务器环境中运行代码而广受认可。然而&#xff0c;尽管 Lambda 广受欢迎&#xff0c;许多开发者和架构师对它的底层运作机制却知之甚少&#xff0c;常常将其视为“编写能够在云端神奇运行的代码…...

信奥赛CSP-J复赛集训(DP专题)(19):P3399 丝绸之路

信奥赛CSP-J复赛集训&#xff08;DP专题&#xff09;&#xff08;19&#xff09;&#xff1a;P3399 丝绸之路 题目背景 张骞于公元前 138 年曾历尽艰险出使过西域。加强了汉朝与西域各国的友好往来。从那以后&#xff0c;一队队骆驼商队在这漫长的商贸大道上行进&#xff0c;他…...

网络NAT类型测试

免费收录PCDN、GPU算力网站_算力收录站需要专业的PCDN、GPU算力网站收录服务吗&#xff1f;算力收录站为您提供高效、可信赖的收录服务&#xff0c;提升您的网站能见度。https://www.cdngpu.com/ 什么是 NAT&#xff1a;NAT代表网络地址转换&#xff0c;允许多个内网设备共享一…...

Postman下载安装与使用汉化版教程

简介&#xff1a; Postman 是一款常用的 API 测试工具&#xff0c;可以方便地进行接口测试、调试和文档编写。本文将详细介绍如何下载安装 Postman 并汉化&#xff0c;包括每个步骤的详细说明。 Postman 是一款常用的 API 测试工具&#xff0c;可以方便地进行接口测试、调试和…...

使用Python+OpenCV对视频抽帧保存为JPG图像

使用PythonOpenCV对视频抽帧保存为JPG图像 import os import cv2 import time#视频文件夹路径&#xff0c;可修改 videoPath D:\\video\\ #保存的图片文件夹路径&#xff0c;可修改 savePath D:\\images\\ videolist os.listdir(videoPath) if not os.path.exists(savePath…...

Java的反射机制(曼波超易懂图文版)

(✪▽✪)曼波~~~~&#xff01;好的呀~让曼波用最可爱的姿势为你讲解Java反射机制吧&#xff01; &#x1f31f;反射机制核心概念 曼波觉得反射就像编程世界的"魔法镜"(◕ᴗ◕✿) 可以让我们在运行时动态获取类的信息并操作类对象&#xff01; // 举个栗子&#…...

【DeepSeek 学习推理】Llumnix: Dynamic Scheduling for Large Language Model Serving实验部分

6.1 实验设置 测试平台。我们使用阿里云上的16-GPU集群&#xff08;包含4个GPU虚拟机&#xff0c;类型为ecs.gn7i-c32g1.32xlarge&#xff09;。每台虚拟机配备4个NVIDIA A10&#xff08;24 GB&#xff09;GPU&#xff08;通过PCI-e 4.0连接&#xff09;、128个vCPU、752 GB内…...

运行neo4j.bat console 报错无法识别为脚本,PowerShell 教程:查看语言模式并通过注册表修改受限模式

无法将“D:\neo4j-community-4.4.38-windows\bin\Neo4j-Management\Get-Args.ps1”项识别为cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写&#xff0c;如果包括路径&#xff0c;请确保路径正确&#xff0c;然后再试一次。 前提配置好环境变量之后依然报上面的错…...

AI写代码之GO+Python写个爬虫系统

下面我们我们来利用AI&#xff0c;来用GOPython写个爬虫系统。 帮我写一个Python语言爬取数据写入Mysql的案例&#xff0c;信息如下&#xff1a; 1、Mysql数据库地址是&#xff1a;192.168.1.20 &#xff0c;mysql用户名是&#xff1a;root&#xff0c; Mysql密码是&#xff1…...

【FAQ】如何配置PCoIP零客户端AWI能访问

应用场景 在安全性要求较高的环境中&#xff0c;禁用 AWI 并使用 PCoIP 管理控制台配置端点&#xff0c;建议隐藏 OSD 以提高安全性。 通过OSD和AWI: 阻止 PCoIP 管理工具管理 PCoIP 零客户端。禁用对 Tera2 PCoIP Zero Client 的 AWI 的管理访问。下次访问 AWI 或 OSD 时强…...

RAGFlow:构建高效检索增强生成流程的技术解析

引言 在当今信息爆炸的时代&#xff0c;如何从海量数据中快速准确地获取所需信息并生成高质量内容已成为人工智能领域的重要挑战。检索增强生成&#xff08;Retrieval-Augmented Generation, RAG&#xff09;技术应运而生&#xff0c;它将信息检索与大型语言模型&#xff08;L…...

go语言中defer使用指南

目录 1.使用场景 2.执行顺序 3.for循环中的defer及defer中的闭包陷阱 4.defer与返回值的关系 5.总结 1.使用场景 在编程的时候&#xff0c;经常需要打开一些资源&#xff0c;比如数据库连接、文件、锁等&#xff0c;这些资源需要在用完之后释放掉&#xff0c;否则会造成内…...

成熟软件项目解决方案:360°全景影像显控软件系统

​若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/147425300 长沙红胖子Qt&#xff08;长沙创微智科&#xff09;博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、Open…...

域名解析体系中 IPv4/IPv6 地址切换的关键技术剖析

前言&#xff1a; 对接的一家学校业务&#xff0c;学校老师要求域名解析既能解析到ipv4地址又能解析到ipv6地址。听学校老师叙述&#xff08;还是会考察v6开通率的&#xff09;&#xff0c;所以通过这个方法来实现的&#xff0c;域名解析到ipv6和ipv4都可以。 准备一台机器 机…...

PHP 爬虫如何获取 1688 商品详情(代码示例)

在电商领域&#xff0c;获取 1688 商品的详细信息对于市场分析、选品上架、库存管理和价格策略制定等方面至关重要。1688 作为国内领先的 B2B 电商平台&#xff0c;提供了丰富的商品数据。通过 PHP 爬虫技术&#xff0c;我们可以高效地获取 1688 商品的详细信息&#xff0c;包括…...

Mysql的redolog

保证事务持久性&#xff0c;用于崩溃恢复&#xff0c;崩溃恢复时&#xff0c;把redo上记载的页读到内存&#xff0c;对其修改&#xff0c;变为脏页&#xff0c;刷盘运用于WAL技术&#xff0c;将随机写改为顺序写 redo log有三种状态&#xff1a; 存在 redo log buffer 中&…...

C++ 哈希表

1. 哈希表的概念 在vector、list的顺序结构中&#xff0c;查找效率为 O ( N ) O(N) O(N)&#xff0c;在set、map的树型结构中&#xff0c;查找效率为 O ( l o g 2 N ) O(log_2{N}) O(log2​N)&#xff0c;有没有更优的结构 —— 哈希表 如果让数据按照某种规则映射到某个值&a…...

【pytorch学习】土堆pytorch笔记1

学习参考 仓库 https://github.com/xiaotudui/pytorch-tutorialhttps://github.com/xiaotudui/pytorch-tutorial https://github.com/AccumulateMore/CV 参考博客 https://blog.csdn.net/weixin_44216612/article/details/124203730? https://www.morinha.cc/posts/cours…...

使用Python+OpenCV将多级嵌套文件夹下的视频文件抽帧

使用PythonOpenCV将多级嵌套文件夹下的视频文件抽帧 import os import cv2 import time# 存放视频文件的多层嵌套文件夹路径 videoPath D:\\videos\\ # 保存抽帧的图片的文件夹路径 savePath D:\\images\\if not os.path.exists(savePath):os.mkdir(savePath) video_num 0f…...

ASP.Net Web Api如何更改URL

1.找到appsettings.json 修改如下&#xff1a; 主要为urls的修改填本机私有地址即可 {"Logging": {"LogLevel": {"Default": "Information","Microsoft.AspNetCore": "Warning"}},"AllowedHosts": &q…...

毕业论文设计基本内容和要求:

毕业设计基本内容和要求&#xff1a; 研究内容 调查了解LAMP架构和PHP开发&#xff1b; 学习百度旅游调用的其他产品线服务并熟悉请求接口&#xff1b; 学习社区业务层规范&#xff1b; 设计并实现旅游主要模块&#xff1b; 技术指标 熟悉企业中流程运转的方式&#xff0c;…...

XML内容解析成实体类

XML解析成实体类 解析方法实体类测试 说明&#xff1a;直接上干货&#xff0c;不废话 解析方法 public static List<PlatJuMinBaoXian> parse(String xmlString) {List<PlatJuMinBaoXian> result new ArrayList<>();try {// 创建 DocumentBuilderDocumentB…...

推公式——耍杂技的牛

由图可知&#xff0c;只要存在一个逆序&#xff0c;把他们交换一下&#xff0c;最大风险值就会降低&#xff0c;答案更优&#xff0c;因此最优解是按照wisi从小到大升序排列&#xff0c;顺次计算每头牛的危险系数&#xff0c;最大值即是答案。 #include <iostream> #inc…...

Vue指令详解:从入门到精通

前言 Vue.js作为当下最流行的前端框架之一&#xff0c;其指令系统是Vue最核心的特性之一。指令是Vue模板中带有v-前缀的特殊属性&#xff0c;它们为HTML元素添加了特殊的响应式行为。本文将全面介绍Vue的各种指令及其用法。 一、Vue指令概述 Vue指令是带有v-前缀的特殊属性&…...

准确--CentOS 7 配置 Chrony 同步阿里云 NTP 时间服务器及手动同步指南

本文档介绍如何在 CentOS 7 系统上配置 chrony 服务&#xff0c;使其与阿里云 NTP 时间服务器保持时间同步&#xff0c;并说明如何在需要时手动触发一次立即同步。 前提条件: 拥有一台 CentOS 7 服务器。拥有 root 权限或可以使用 sudo 命令。服务器可以访问互联网 (使用公共…...

CLIP | 训练过程中图像特征和文本特征的在嵌入空间中的对齐(两个投影矩阵的学习)

在多模态学习&#xff08;Multimodal Learning&#xff09;中&#xff0c;投影矩阵 W i W_i Wi​ 和 W t W_t Wt​ 是通过训练过程学习得到的。它们的作用是将图像特征 I f I_f If​ 和文本特征 T f T_f Tf​ 映射到一个共享的嵌入空间&#xff08;embedding space&#xf…...

Spring中配置 Bean 的两种方式:XML 配置 和 Java 配置类

在 Spring 框架中,配置 Bean 的方式主要有两种:XML 配置 和 Java 配置类。这两种方式都可以实现将对象注册到 Spring 容器中,并通过依赖注入进行管理。本文将详细介绍这两种配置方式的步骤,并提供相应的代码示例。 1. 使用 XML 配置的方式 步骤 创建 Spring 配置文件 创建…...

STM32 外部中断

引言&#xff1a;嵌入式系统中的中断革命 在嵌入式系统开发领域&#xff0c;中断机制堪称现代微控制器的"神经系统"。它通过高效的异步事件处理机制&#xff0c;彻底改变了传统轮询式系统资源利用率低下的局面。STM32作为业界领先的ARM Cortex-M系列微控制器&#x…...

4.22学习总结

开始写有关图的算法 图的一些基本概念&#xff0c;图的存储主要以 邻接矩阵&#xff0c;邻接表&#xff08;数组链表的实现方式&#xff09;的方式存储 邻接矩阵的优点&#xff1a; 表达方式简单&#xff0c;易于理解检查任意两个顶点间是否存在边的操作非常快适合稠密图&a…...

list底层原理

一.结构体的构建 这个用结构体更好&#xff0c;因为我们需要不断的访问节点&#xff0c;类中的成员函数一般都是私有的&#xff0c;需要还用友元函数什么的。 这个是我们来实现的类&#xff0c;我们实现的是双向带头循环链表&#xff0c;这个是实用性最高的一个链表的形式。 这…...

python+selenium+pytest自动化测试chrome driver版本下载

chrome浏览器chromedriver版本下载地址 https://googlechromelabs.github.io/chrome-for-testing/#stable...

发布一个npm包,更新包,删除包

发布一个npm包&#xff0c;更新包&#xff0c;删除包 如何将自己的项目 发布为一个 npm 包&#xff0c;并掌握 更新 和 删除 的操作流程。 &#x1f680; 一、发布一个 npm 包的完整流程 ✅ 1. 注册并登录 npm 账号 如果还没有账号&#xff0c;先注册&#xff1a; 官网注册&…...

代码随想录训练营38天 || 322. 零钱兑换 279. 完全平方数 139. 单词拆分

322. 零钱兑换 思路&#xff1a; 动规5部曲&#xff1a; 1.确定dp数组以及下标的含义&#xff1a; dp数组表示能凑出零钱的最少硬币数&#xff0c;下标表示要兑换的零钱 2.确定递推公式&#xff1a; j为背包容量&#xff0c;i为物品的下标 dp[ j ] min(dp[ j -coins[ i…...

(最新)华为 2026 届校招实习-硬件技术工程师-硬件通用/单板开发—机试题—(共14套)(每套四十题)

&#xff08;最新&#xff09;华为 2026 届校招实习-硬件技术工程师-硬件通用/单板开发—机试题—&#xff08;共14套&#xff09;&#xff08;每套四十题&#xff09; 本套题目为硬件通用题目&#xff0c;适合多个岗位方向&#xff0c;如下 **岗位——硬件技术工程师 岗位意向…...

IOT项目——DIY Weather Station With ESP32

开源项目&#xff1a;ESP32 气象站 作者&#xff1a;GiovanniAggiustatutto 原文链接&#xff1a; ESP32 气象站 温度设备塔风向标风速计雨量计框架电子元件和压力传感器家庭助理配置及应用 气象站测量温度、湿度、气压、风速和风向以及降雨量。所有数据均由 ESP32收集&#xf…...

表格识别版面还原分析-GO语言集成-表格文字识别接口

数据驱动的时代&#xff0c;高效处理和分析各类文档中的信息变得尤为重要。无论是金融服务中的报表分析&#xff0c;制造与物流行业的库存管理&#xff0c;还是医疗卫生领域的病历记录&#xff0c;快速准确地将纸质或电子表格中的数据转换为可编辑、保存的电子数据成为提升工作…...

文件上传漏洞3

1. 例题:文件上传限制 1&#xff09;上传漏洞靶场介绍 项目名称: upload-labs开发语言: 使用PHP语言编写功能定位: 专门收集渗透测试和CTF中遇到的各种上传漏洞的靶场关卡数量: 目前共21关&#xff0c;每关包含不同上传方式注意事项: 每关没有固定通关方法&#xff0c;不要自限…...

一洽智能硬件行业解决方案探索与实践

一、智能硬件行业发展现状剖析 在数字化浪潮推动下&#xff0c;智能硬件行业呈现蓬勃发展态势。软硬件一体化的深度融合&#xff0c;构建起智能化服务的核心架构&#xff0c;而移动应用作为连接用户与设备的重要桥梁&#xff0c;其作用愈发关键。深入研究该行业&#xff0c;可…...

什么是snmp协议?在优雅草星云智控AI物联网监控系统中如何添加设备进行监控【星云智控手册01】-优雅草卓伊凡

什么是snmp协议&#xff1f;在优雅草星云智控AI物联网监控系统中如何添加设备进行监控【星云智控手册01】-优雅草卓伊凡 优雅草星云智控物联网设备 本产品即将在5月15日在优雅草科技的承办下召开产品发布会&#xff0c;本产品需要报名参加可以通过活动行搜索星云智控进行报名…...

神经网络权重优化秘籍:梯度下降法全解析(五)

引言 在神经网络的训练过程中&#xff0c;权重更新是提升模型性能的关键环节&#xff0c;而梯度下降法及其优化算法则是实现这一关键环节的核心工具。理解并掌握这些方法&#xff0c;对于打造高效的神经网络模型至关重要。本文将深入剖析梯度下降法在神经网络权重更新中的应用…...

输入框仅支持英文、特殊符号、全角自动转半角 vue3

需求&#xff1a;封装一个输入框组件 1.只能输入英文。 2.输入的小写英文自动转大写。 3.输入的全角特殊符号自动转半角特殊字符 效果图 代码 <script setup> import { defineEmits, defineModel, defineProps } from "vue"; import { debounce } from "…...

Python简介与入门

目录 Python初始 Python的优势 Python 的特性 Linux下安装Python windows 系统安装python Python的语法基础 标识符 注释 语句与缩进 Python 常用的数据类型 数字 字符串 列表 列表的定义 列表的取值 重复列表 元组 元组的操作 字典 字典的创建 字典的取值操作 字典的添加、…...

C++学习笔记(三十六)——STL之排序算法

一、STL 算法 C的STL&#xff08;Standard Template Library&#xff09; 提供了一组高效、通用的算法&#xff0c;这些算法适用于各种容器&#xff08;如 vector、list、set、map&#xff09;。 这些算法主要位于 <algorithm> 和 <numeric> 头文件中。 通用性&a…...

G1 人形机器人软件系统架构与 Python SDK

如果说人形机器人的硬件是它的“身体”&#xff0c;那么软件系统就是它的“大脑”和“神经系统”&#xff0c;负责接收信息、进行决策并控制身体行动。理解 G1 机器人的软件架构&#xff0c;特别是如何通过编程接口与其交互&#xff0c;是进行机器人开发的核心。本节将剖析 G1 …...

Redis在SpringBoot中的使用

在SpringBoot项目中使用redis存储数据作为字典 本项目使用jdk1.8 一、添加依赖 <!-- spring boot redis缓存引入 --> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId>…...

SuperMap GIS基础产品FAQ集锦(20250421)

一、SuperMap iDesktopX 问题1&#xff1a;iDesktopX怎么根据对数据集中的每条记录进行批量布局出图? 11.3.0 【解决办法】打开地图系列设置功能&#xff0c;勾选启用并设置索引地图&#xff0c;索引图层和索引字段等参数&#xff0c;打印地图册&#xff0c;设置输出路径&am…...

Linux学习笔记2

1.man man指令相当于一个在线手册 使用q可以退出指令运行 例如&#xff0c;使用 man ls 指令可以得到以下运行结果&#xff1a; 在查找的时候还可以使用数字&#xff0c;使用 man man 指令&#xff0c;对应每个数字所表示的内容&#xff1a; 在Linux下&#xff0c;一切皆是文件…...

电脑安装adb并且连接华为手机mate60pro后查看设备

1.下载adb工具 下载地址&#xff1a; https://developer.android.google.cn/tools/releases/platform-tools?hlzh-cn#downloads 根据需要下载自己系统需要的安装包 下载后解压 2.配置adb工具环境变量 添加ADB_HOME D:\softwares\platform-tools-latest-windows\platform-…...

EAL4+与等保2.0:解读中国网络安全双标准

EAL4与等保2.0&#xff1a;解读中国网络安全双标准 在当今数字化时代&#xff0c;网络安全已成为各个行业不可忽视的重要议题。特别是在金融、政府、医疗等领域&#xff0c;保护信息的安全性和隐私性显得尤为关键。在中国&#xff0c;EAL4和等级保护2.0&#xff08;简称“等保…...