商品领域十二张基础表设计思路与实现

news2024/11/28 1:55:23

欢迎大家关注公众号「JAVA前线」查看更多精彩分享文章,主要包括源码分析、实际应用、架构思维、职场分享、产品思考等等,同时欢迎大家加我微信「java_front」一起交流学习


1 文章概述

商品在电商领域中是一个非常重要的领域,交易行为前提是有商品信息存在。本文我们分析商品表基本设计,其它复杂场景可以在此基础上进行扩展。需要说明第一本文所用数据是测试数据,可能与真实数据有偏差,仅供演示。第二本文展示商品核心字段,一些通用字段不展示。


2 商品类目

2.1 基本信息

类目表示商品分类并且具有层级关系:

  • 一级类目:图书
    • 二级类目:文学
      • 三级类目:小说

  • 一级类目:电脑
    • 二级类目:电脑配件
      • 三级类目:显卡

  • 一级类目:生鲜
    • 二级类目:水果
      • 三级类目:苹果

2.2 三种类目

2.2.1 后台类目

后台类目有两个特点:标准和稳定。标准表示后台类目是业界通用的,并且层级不宜过多,通常不超过三级。稳定表示后台类目一旦确定不能轻易修改,否则设计上下游大量数据变更,工作量非常大,所以变更权限必须收敛到平台运营。


2.2.2 前台类目

计算机领域有一句话:任何问题都可以通过加一层解决。为了解决后台类目不能灵活调整这个问题,业界在后台类目上设计了前台类目。

运营人员通常会对后台类目进行简化和整理,更加符合用户检索习惯,前台类目可以自由关联后台类目,可以一对多、多对一或者多对多。很多电商网站PC首页展示的类目一般是前台类目。


2.2.3 店铺类目

店铺类目灵活度更好可以交由商家管理,商家可以根据自身经营策略调整店铺类目,提升交易率,一般只支持两层。综上所述我们看一个实例:


(1) 后台类目

  • 一级类目:生鲜
    • 二级类目:水果
      • 三级类目:西瓜

(2) 前台类目

  • 一级类目:食品/生鲜/特产
    • 二级类目:新鲜水果
      • 三级类目:西瓜

(3) 店铺类目

  • 一级类目:夏日清凉
    • 二级类目:甜甜大西瓜

2.2.4 后台类目表

CREATE TABLE `category_1_background` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键',
  `category_id` varchar(64) NOT NULL COMMENT '类目ID',
  `category_name` varchar(128) NOT NULL COMMENT '类目名称',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uq_category_id` (`category_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='一级后台类目表';

CREATE TABLE `category_2_background` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键',
  `category_id` varchar(64) NOT NULL COMMENT '类目ID',
  `category_name` varchar(128) NOT NULL COMMENT '类目名称',
  `category_1_id` varchar(64) NOT NULL COMMENT '一级分类ID',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uq_category_id` (`category_id`),
  KEY `idx_category_1_id` (`category_1_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='二级后台类目表';

CREATE TABLE `category_3_background` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键',
  `category_id` varchar(64) NOT NULL COMMENT '类目ID',
  `category_name` varchar(128) NOT NULL COMMENT '类目名称',
  `category_2_id` varchar(64) NOT NULL COMMENT '二级分类ID',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uq_category_id` (`category_id`),
  KEY `idx_category_2_id` (`category_2_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='三级后台类目表';

insert  into `category_1_background`(`category_id`,`category_name`) values ('700','电子设备');
insert  into `category_2_background`(`category_id`,`category_name`,`category_1_id`) values ('800','通讯设备','700');
insert  into `category_3_background`(`category_id`,`category_name`,`category_2_id`) values ('900','手机','800');

3 商品属性

3.1 属性分类

3.1.1 关键属性

关键属性是商品本质属性,关键属性中最核心两个属性是品牌和型号,一旦确定这两个属性等价于确定SPU(Standard Product Unit)标准化管理单元,例如品牌是小米,型号是10。在实践中这两个属性不放在属性表:

  • 型号是一种特殊属性
    • 作为SPU表一个字段
  • 品牌是一种特殊属性
    • 品牌基础信息一张独立表
    • SPU表记录对应品牌ID

其它关键属性例如屏幕尺寸,CPU型号,CPU核数还是通过属性表承载。


3.1.2 销售属性

销售属性又称为规格属性,如果关键属性确定,一旦销售属性再确定,那么就可以确定SKU(Stock Keeping Unit)库存计量单位,可以理解为仓库中实物商品,每一个SKU都有一个库存数量与一个价格与之对应。电商常见销售属性有颜色、容量、版本、套餐等等。

例如关键属性品牌是小米,型号是10,销售属性颜色是黑色和蓝色,容量是128G和256G,那么共有四个SKU:

  • 小米 10 黑色 128G
  • 小米 10 黑色 256G
  • 小米 10 蓝色 128G
  • 小米 10 蓝色 256G

3.1.3 描述属性

除了关键属性与销售属性,其它属性称为描述信息。


3.2 属性与属性值

属性和属性值由平台运营人员设置。属性有两种类型:选择与自定义。对于选择类型,运营人员需要为属性设置属性值。对于自定义类型,无需设置属性值。例如平台运营人员新增以下两个属性:

  • 颜色:选择类型,属性值包括黑色、蓝色、红色
  • 重量:自定义类型,无需平台运营设置属性值,商家自行填写

3.3 类目与属性

每个类目对应的属性是不同的,所以平台运营人员初始化属性和属性值之后,还要建立类目与属性关联关系。因为同一个属性对于不同类目重要性不同,所以在设置类目和属性关系时需要设置以下信息:

  • 属性类型:属性对于类目是关键属性、销售属性、描述属性
  • 是否必填:属性对于类目是否必填
  • 商品维度:属性对于类目是SPU维度还是SKU维度

属性还有继承关系,平台运营人员不仅可以为三级类目设置属性,还可以为一级和二级类目设置属性。例如运营人员为二级类目设置A、B两种属性,那么这个二级类目下三级类目同时也具有A、B两种属性,类目与属性关系如下图:


类目与属性关系.jpg


3.4 属性数据表

3.4.1 属性表

CREATE TABLE `attribute` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
  `attribute_id` varchar(64) NOT NULL COMMENT '属性ID',
  `biz_type` tinyint(1) NOT NULL COMMENT '1选择 2自定义',
  `attribute_name` varchar(128) NOT NULL COMMENT '属性名称',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uq_attribute_id` (`attribute_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='属性表';

insert into `attribute` (`attribute_id`, `biz_type`, `attribute_name`) values('100','1','颜色');
insert into `attribute` (`attribute_id`, `biz_type`, `attribute_name`) values('200','1','存储容量');
insert into `attribute` (`attribute_id`, `biz_type`, `attribute_name`) values('300','2','重量');
insert into `attribute` (`attribute_id`, `biz_type`, `attribute_name`) values('400','2','屏幕尺寸');

3.4.2 属性值表

CREATE TABLE `attribute_value` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
  `attribute_value_id` varchar(64) NOT NULL COMMENT '属性值ID',
  `attribute_value` varchar(128) NOT NULL COMMENT '属性值名称',
  `attribute_id` varchar(64) NOT NULL COMMENT '属性ID',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uq_attribute_value_id` (`attribute_value_id`),
  KEY `idx_attribute_id` (`attribute_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='属性值表';

--颜色属性值
insert  into `attribute_value`(`attribute_value_id`,`attribute_value`,`attribute_id`) values ('1001','蓝色','100');
insert  into `attribute_value`(`attribute_value_id`,`attribute_value`,`attribute_id`) values ('1002','黑色','100');
insert  into `attribute_value`(`attribute_value_id`,`attribute_value`,`attribute_id`) values ('1003','红色','100');

--容量属性值
insert  into `attribute_value`(`attribute_value_id`,`attribute_value`,`attribute_id`) values ('2001','64G','200');
insert  into `attribute_value`(`attribute_value_id`,`attribute_value`,`attribute_id`) values ('2002','128G','200');
insert  into `attribute_value`(`attribute_value_id`,`attribute_value`,`attribute_id`) values ('2003','256G','200');

3.4.3 属性与类目关系表

CREATE TABLE `relation_category_attribute` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
  `relation_id` varchar(64) NOT NULL COMMENT '关系ID',
  `attribute_id` varchar(64) NOT NULL COMMENT '属性ID',
  `category_id` varchar(64) NOT NULL COMMENT '类目ID',
  `category_level` tinyint(1) NOT NULL COMMENT '类目层级',
  `attribute_type` tinyint(1) NOT NULL COMMENT '属性类型 1关键属性 2销售属性 3描述属性',
  `must_fill` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否必填',
  `product_scope` tinyint(1) NOT NULL COMMENT '商品维度 1spu 2sku',  
  PRIMARY KEY (`id`),
  UNIQUE KEY `uq_relation_id` (`relation_id`),
  KEY `idx_category_id_attribute_id` (`category_id`,`attribute_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='属性与类目关系表';

insert  into `relation_category_attribute`(`relation_id`,`attribute_id`,`category_id`,`category_level`,`attribute_type`,`must_fill`,`product_scope`) values ('10000000','100','900',3,2,1,2);
insert  into `relation_category_attribute`(`relation_id`,`attribute_id`,`category_id`,`category_level`,`attribute_type`,`must_fill`,`product_scope`) values ('10000001','200','900',3,2,1,2);
insert  into `relation_category_attribute`(`relation_id`,`attribute_id`,`category_id`,`category_level`,`attribute_type`,`must_fill`,`product_scope`) values ('10000002','300','900',3,3,1,2);
insert  into `relation_category_attribute`(`relation_id`,`attribute_id`,`category_id`,`category_level`,`attribute_type`,`must_fill`,`product_scope`) values ('10000003','400','900',3,1,1,1);

3.4.4 品牌表

CREATE TABLE `product_brand` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `brand_id` varchar(128) NOT NULL COMMENT '品牌ID',
  `brand_cn_name` varchar(128) NOT NULL COMMENT '品牌中文名',
  `brand_en_name` varchar(128) NOT NULL COMMENT '品牌英文名',
  `logo_url` text COMMENT '品牌Logo',
  `brand_story` text COMMENT '品牌故事',
  PRIMARY KEY (`id`),
  KEY `idx_brand_id` (`brand_id`)  
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='品牌表';

insert  into `product_brand`(`brand_id`,`brand_cn_name`,`brand_en_name`) values ('1000','小米','MI');

4 商品表

4.1 基本概念

第三章节属性相关信息由平台运营人员设置,为商家维护商品信息定制一个规范,这时商家可以根据设置自己的商品信息。

  • SPU:标准化管理单元,商品属性最小聚合
  • SKU:库存计量单位,在仓库中实物商品,每一个SKU对应一个库存数量与一个价格
  • SN:序列号,在仓库中每一个实体商品

我们还是看一个手机示例:

  • SPU:小米 10
  • SKU:小米 10 黑色 128G
    • 库存3个
    • 单价2000元
  • SN:对应三个序列号
    • SN1
    • SN2
    • SN3

4.2 表设计思路

  • SPU
    • 主表:SPU基础信息
      • 图片、品牌、型号、类目
    • 关联表:SPU、属性、属性值关联表
  • SKU
    • 主表:SKU基础信息
      • 图片、spuId、价格、库存
    • 关联表:SKU、属性、属性值关联表
  • SN
    • 主表:SN基础信息以及与SKU关系
      • 序列号、skuId

4.3 商品表

4.3.1 SPU主表

CREATE TABLE `product` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
  `product_id` varchar(64) NOT NULL COMMENT '商品id',
  `shop_id` varchar(64) NOT NULL COMMENT '店铺id',  
  `brand_id` bigint(20) NOT NULL COMMENT '品牌id',
  `product_model` varchar(256) NOT NULL COMMENT '商品型号',
  `product_name` varchar(256) NOT NULL COMMENT '商品名称',
  `sale_status` tinyint(1) NOT NULL COMMENT '销售状态 1上架 2下架',  
  `category_3_id` varchar(64) NOT NULL COMMENT '三级分类id',
  `img_url` text COMMENT '图片路径',
  `description` text COMMENT '商品描述',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uq_product_id` (`product_id`),
  KEY `idx_brand_id` (`brand_id`),
  KEY `idx_category_3_id` (`category_3_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='SPU';

insert into product(`product_id`, `shop_id`, `brand_id`, `product_model`, `product_name`, `category_3_id`, `sale_status`) values ('100', 'shop_1','100', '10', '小米10手机', '900', 1);

4.3.2 SPU与属性关系表

CREATE TABLE `relation_product_attribute` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
  `relation_id` varchar(64) NOT NULL COMMENT '关系ID',
  `product_id` varchar(64) DEFAULT NULL COMMENT '商品ID',
  `attribute_id` varchar(64) NOT NULL COMMENT '属性ID',
  `attribute_value_id` varchar(64) DEFAULT NULL COMMENT '属性值ID',
  `custom_attribute_value` varchar(256) DEFAULT NULL COMMENT '自定义属性值',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uq_relation_id` (`relation_id`),
  KEY `idx_product_id` (`product_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='SPU与属性关系表';

insert into relation_product_attribute(`relation_id`, `product_id`, `attribute_id`, `attribute_value_id`, `custom_attribute_value`) values ('20000000', '100', '400', NULL, '6.67英寸');

4.3.3 SKU主表

CREATE TABLE `product_sku` (
  `id` BIGINT(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
  `sku_id` VARCHAR(64) NOT NULL COMMENT 'skuId',
  `sku_name` VARCHAR(128) NOT NULL COMMENT 'sku名称', 
  `product_id` VARCHAR(64) NOT NULL COMMENT '商品id',
  `sale_status` tinyint(1) NOT NULL COMMENT '销售状态 1上架 2下架',    
  `orgin_price` DOUBLE NOT NULL COMMENT '原价',  
  `discount_price` DOUBLE NOT NULL COMMENT '优惠价格', 
  `stock_count` INT(11) NOT NULL COMMENT '剩余库存',  
  `lock_stock_count` INT(11) NOT NULL COMMENT '锁定库存',
  `sale_stock_count` INT(11) NOT NULL COMMENT '销售量',  
  `sku_img_url` TEXT COMMENT '图片路径',
  `sku_description` TEXT COMMENT '商品描述',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uq_sku_id` (`sku_id`),
  KEY `idx_product_id` (`product_id`)
) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='SKU';

insert  into `product_sku`(`sku_id`,`sku_name`,`product_id`,`orgin_price`,`discount_price`,`stock_count`,`lock_stock_count`,`sale_stock_count`,`sku_img_url`,`sku_description`, `sale_status`) values ('200','小米 10 蓝色 128G', '100',3000,3000,3,1,1000,NULL,NULL, 1);

4.3.4 SKU与属性关系表

CREATE TABLE `relation_product_sku_attribute` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
  `relation_id` varchar(64) NOT NULL COMMENT '关系ID',
  `sku_id` varchar(64) DEFAULT NULL COMMENT 'skuId',
  `attribute_id` varchar(64) NOT NULL COMMENT '属性ID',
  `attribute_value_id` varchar(64) DEFAULT NULL COMMENT '属性值ID',
  `custom_attribute_value` varchar(256) DEFAULT NULL COMMENT '自定义属性值',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uq_relation_id` (`relation_id`),
  KEY `idx_sku_id` (`sku_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='SKU与属性关系表';


insert into relation_product_sku_attribute(`relation_id`, `sku_id`, `attribute_id`, `attribute_value_id`, `custom_attribute_value`) values ('30000000', '200', '100', '1001', NULL);
insert into relation_product_sku_attribute(`relation_id`, `sku_id`, `attribute_id`, `attribute_value_id`, `custom_attribute_value`) values ('30000001', '200', '200', '2002', NULL);
insert into relation_product_sku_attribute(`relation_id`, `sku_id`, `attribute_id`, `attribute_value_id`, `custom_attribute_value`) values ('30000002', '200', '300', NULL, '173克');

4.3.5 SN表

CREATE TABLE `product_sku_sn` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键',
  `sn_id` varchar(64) NOT NULL COMMENT '序列号ID',
  `sku_id` varchar(64) DEFAULT NULL COMMENT 'skuId',
  `sn` varchar(64) DEFAULT NULL COMMENT '序列号',
  `status` tinyint(1) NOT NULL COMMENT '状态 1未售 2已售',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uq_sn_id` (`sn_id`),
  UNIQUE KEY `uq_sn_sku` (`sku_id`,`sn`),
  KEY `idx_sku_id` (`sku_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='SN';

insert into product_sku_sn(`sn_id`, `sku_id`, `sn`, `status`) values ('40000000', '200', 'SN-1', 1);
insert into product_sku_sn(`sn_id`, `sku_id`, `sn`, `status`) values ('40000001', '200', 'SN-2', 1);
insert into product_sku_sn(`sn_id`, `sku_id`, `sn`, `status`) values ('40000002', '200', 'SN-3', 1);

5 延伸知识

5.1 涉及角色

商品操作总体上分为平台运营商家两个角色,平台运营主要维护类目、属性、类目与属性关系信息,相当于为商家维护商品设置规范。商家主要维护spu、sku、spu具体属性值是什么、sku具体属性值是什么、上下架状态。


5.2 自增主键不赋予业务含义

以商品表为例,我们不应该以id作为商品Id,应该设置product_id作为商品Id,要求product_id全局唯一,这样便于当数据量过大时进行分库分表。


5.3 允许适度冗余

商品表是一个高读写比典型,可能看10次才会产生1次购买行为,所以如果可以一次查询就查出所需信息对性能会更友好。

本文表设计并没有进行冗余,例如如果要冗余可以在relation_product_sku_attribute表中新增attribute_value字段记录属性值。冗余问题就是数据一致性,例如当属性值发生变化时,上述字段也要同步进行修改。


5.4 合理使用ES

正如上述章节所述,商品表是一个高读写比的典型,我们希望一次查询可以将所需信息查询出来,而不是跨多张表去查询,但是我们又不想在业务表冗余数据。

我们可以将商品信息平铺到ES中一个索引,这个索引具有商品全部字段信息,例如在查询商品列表或者商详时可以直接访问这个索引。


5.5 库存单独成表

product_sku有库存字段,对于库存字段修改相对而言比较多,其它信息变更比较少,因为如果出现下单、购买、退款行为,库存信息就会发生变化。所以可以将sku主表库存字段单独成表,从而减轻主表压力。


6 文章总结

本文通过介绍类目、属性、品牌、SPU、SKU、SN引出商品十二张基础表:

一级类目表:category_1_background
二级类目表:category_2_background
三级类目表:category_3_background
属性表:attribute
属性值表:attribute_value
类目与属性关系表:relation_category_attribute
品牌表:product_brand
SPU表:product
SKU表:product_sku
SN表:product_sku_sn
SPU与属性关系表:relation_product_attribute
SKU与属性关系表:relation_product_sku_attribute

这些十二张基础表从不同侧面描述了商品信息,其它复杂场景可以在这些基础表上进行扩展。同时在第五章节我们讨论了五个延伸知识,希望本文对大家有所帮助。


欢迎大家关注公众号「JAVA前线」查看更多精彩分享文章,主要包括源码分析、实际应用、架构思维、职场分享、产品思考等等,同时欢迎大家加我微信「java_front」一起交流学习

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

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

相关文章

Selenium + Java 的环境搭建

Selenium Java 的环境搭建 🔎Chrome 浏览器下载 Chrome 浏览器检查对应版本下载 Chrome 浏览器驱动 🔎配置环境变量🔎验证环境是否搭建成功🔎关于 pom.xml 出现错误的解决方案 🔎Chrome 浏览器 下载 Chrome 浏览器 下…

使用命令启动默认程序(例如启动系统默认浏览器打开指定网址)

文章目录 目的基础说明代码示例(Golang)总结 目的 通过命令调用系统默认应用程序打开对应格式的文件是比较常用的功能。这篇文章将介绍下相关内容。 基础说明 Windows windows下可以使用 start 指令来启动默认程序打开对应格式文件; 比如 …

iptables中SNAT、DNAT及iptables服务启动时会自动还原规则

目录 SNAT原理与应用​编辑 SNAT转换前提条件 临时打开: 永久打开: 示例​编辑 DNAT原理与应用​编辑 DNAT转换前提条件 示例​编辑 防火墙规则的备份和还原 导出(备份)所有表的规则 清空规则​编辑 导入(还…

【VMware】Ubunt 20.04时间设置

文章目录 设置本地时间 UTC8设置24小时制同步网络时间参考 Talk is cheap, show me the code. 设置本地时间 UTC8 查看当前时区状态 rootnode1:~/k8s# timedatectlLocal time: Sun 2023-05-21 15:24:02 CSTUniversal time: Sun 2023-05-21 07:24:02 UTCRTC time: Sun 2023-05-2…

计算机网络知识汇总(十万字超详细)

文章目录 1 计算机网络概述1.1 概念、组成、功能和分类1.2 标准化工作及相关组织1.3 速率相关的性能指标1.4 时延、时延带宽积、往返时间RTT、利用率1.5 分层结构、接口、协议、服务1.6 OSI参考模型1.7 TCP/IP与五层参考模型1.8 第一章知识大纲 2.物理层2.1 物理层基本概念2.2 …

GaussDB(for MySQL)云原生数据库技术演进和挑战

摘要:GaussDB(for MySQL)是华为自研云原生数据库,具有高性能,高扩展,高可靠的特点,完全兼容MySQL协议,自研架构和友好的生态兼容性,可以同时满足数据库管理员、应用开发者、CTO的运维、使用和业…

QT5.14.2下载安装与环境配置

1.QT5.14.2的下载 QT5.14.2的官方下载地址为 https://download.qt.io/archive/qt/5.14/5.14.2/ ![在这里插入图片描述](https://img-blog.csdnimg.cn/9ef2a92414cb48a482d3cde4dd19a9ac.png 由于exe文件名称只有x86,只能选择这个下载,但是在安装时可以选…

ChatGPT也能助力建筑设计,这么智能?

ChatGPT也称为 Generative Pre-trained Transformer,是一种强大的语言生成工具,具有生成类人文本的能力。这项技术有可能通过为建筑师提供与客户、承包商和其他利益相关者沟通和协作的新方式来彻底改变建筑行业。在这篇文章中,我们将探讨架构…

css学习-内容加载占位动画(渐变动画)

文章目录 学习链接纯CSS渐变动画结合vue指令简单使用 学习链接 Git Hub前端50天50个项目 | 第24 内容文本 纯CSS渐变动画 <style lang"scss" scoped> .card-wrapper {width: 100%;height: 100%;display: flex;align-items: center;justify-content: center; …

tinymce富文本编辑器使用到二开

tinymce tinymce 一款现代化的富文本编辑器&#xff0c;有专门团队维护&#xff0c;是目前主流的富文本编辑器选择。 安装注意事项&#xff1a; 有两种方案分别是安装对应的vue/react组件&#xff0c;然后直接用组件&#xff0c;或者直接使用tinymce去按原生操作会报找不到文…

HTML- 标签学习之- 列表、表格

无序列表/有序列表&#xff1a; 标签组成( 无序ul 有序 ol ) -> li 父子级标签&#xff0c; ul只能包含li标签&#xff0c; li标签可以包含任意内容。 自定义列表 dl :自定义列表的整体&#xff0c;用于包裹dt/dd 标签dt:自定义列表主题dd:自定义列表的针对主题的…

【VMware】VM安装虚拟机

文章目录 VMware教程创建新的虚拟机自定义安装选择稍后安装操作系统这里选择Linux操作系统&#xff0c;版本为Centos7 64位选择名称和安装位置选择处理器、内核数量&#xff08;可根据电脑硬件以及需求进行调整&#xff09;选择2G内存&#xff08;可根据电脑硬件以及需求进行调…

计算机视觉 day94 DDH - YOLOv5:基于双IoU感知解耦头改进的YOLOv5,用于对象检测

DDH - YOLOv5:基于双IoU感知解耦头改进的YOLOv5&#xff0c;用于对象检测 I. IntroductionII. Related workPrediction head 预测头 III. Methodology3.1 Decoupled Head3.2 Double IoU‑aware3.3 Training3.4 Inference IV. Experiments4.1 与YOLOv5等检测头对PASCAL VOC2007测…

Netty实战(五)

ByteBuf—Netty的数据容器 一、什么是ByteBuf二、 ByteBuf 的 API三、ByteBuf 类——Netty 的数据容器3.1 ByteBuf如何工作&#xff1f;3.2 ByteBuf 的使用模式3.2.1 堆缓冲区3.2.2 直接缓冲区3.2.3 复合缓冲区 四、字节级操作4.1 随机访问索引4.2 顺序访问索引4.3 可丢弃字节4…

使用Docker部署Jenkins

Jenkins是一款开源的持续集成&#xff08;DI&#xff09;工具&#xff0c;广泛用于项目开发&#xff0c;能提供自动构建&#xff0c;测试&#xff0c;部署等功能。 文章目录 1、安装2、配置镜像加速3、登录初始化Jenkins4、配置Jenkins 1、安装 接下来使用Docker部署Jenkins&a…

【腾讯云 Finops Crane集训营】关于Crane的认识和体验总结

一、Crane 是什么 Crane 是一个基于 FinOps 的云资源分析与成本优化平台。它的愿景是在保证客户应用运行质量的前提下实现极致的降本。Crane 是 FinOps 基金会认证的云优化方案。 Crane基于Docker和Kubernetes技术&#xff0c;支持常见的容器化应用场景&#xff0c;如部署多个…

分布式项目 09.服务器之间的通信和三个工具类

项目的结构&#xff1a;1.通过Nginx首先把访问首页的请求发送到前端web服务器&#xff0c;2.web服务器会根据请求的url中的一些细节&#xff0c;来把相关的请求发送到相关的服务器中&#xff0c;3.相关的服务器会处理业务&#xff0c;并且返回结果到web服务器中&#xff0c;最后…

Godot引擎 4.0 文档 - 循序渐进教程 - 节点和场景

本文为Google Translate英译中结果&#xff0c;DrGraph在此基础上加了一些校正。英文原版页面&#xff1a; Nodes and Scenes — Godot Engine (stable) documentation in English 节点和场景 在Godot 关键概念概述中&#xff0c;我们看到 Godot 游戏是一棵场景树&#xff0…

算法训练-二分查找

这里写目录标题 34. 在排序数组中查找元素的第一个和最后一个位置162. 寻找峰值153. 寻找旋转排序数组中的最小值33. 搜索旋转排序数组 34. 在排序数组中查找元素的第一个和最后一个位置 题目链接 vector<int> searchRange(vector<int>& nums, int target) {i…

集合 集合

目录 ArraryList 引用基本类型 案例1&#xff1a;定义一个集合添加学生姓名年龄 案例2&#xff1a;查看是否存在这个id 案例3&#xff1a;手机 案例4&#xff1a;学生管理系统&#xff08;不完整&#xff09; Collection collection遍历方式 迭代遍历&#xff08;不依赖…