电商平台spu和sku的完整设计

一、关于数据库表的设计

  • 1、商品属性表

    比如一个衣服有颜色、尺码、款式这个叫属性表

    -- ------------------------
    -- 商品属性表
    -- ------------------------
    DROP TABLE IF EXISTS `attribute`;
    CREATE TABLE `attribute` (`id` int(11) NOT NULL PRIMARY KEY AUTO_INCREMENT  COMMENT '主键id',`name` varchar(50) not null  COMMENT '属性名',`status` tinyint(4) DEFAULT 0 COMMENT '状态,0表示正常,1表示禁用',`remark` varchar(100) default  null comment '备注',`created_at` timestamp(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) COMMENT '创建时间',`updated_at` timestamp(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6) COMMENT '更新时间',`deleted_at` timestamp(6) NULL DEFAULT NULL COMMENT '软删除时间',UNIQUE KEY `UK_name_deleted_at` (`name`,`deleted_at`)
    ) ENGINE=InnoDB  DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT = "商品属性表";
    
  • 2、商品属性值表

    上面说的颜色,可能是红色、黄色、绿色,尺码可能是S、M、L

    -- ------------------------
    -- 商品属性值表
    -- ------------------------
    DROP TABLE IF EXISTS `attribute_value`;
    CREATE TABLE `attribute_value` (`id` int(11) NOT NULL PRIMARY KEY AUTO_INCREMENT  COMMENT '主键id',`attribute_id` int(11) not null comment '关联到attribute表主键id',`name` varchar(50) not null  COMMENT '属性值',`status` tinyint(4) DEFAULT 0 COMMENT '状态,0表示正常,1表示禁用',`remark` varchar(100) default  null comment '备注',`created_at` timestamp(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) COMMENT '创建时间',`updated_at` timestamp(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6) COMMENT '更新时间',`deleted_at` timestamp(6) NULL DEFAULT NULL COMMENT '软删除时间',UNIQUE KEY `UK_attribute_id_name_deleted_at` (`attribute_id`,`name`,`deleted_at`)
    ) ENGINE=InnoDB  DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT = "商品属性值表";
    
  • 3、spu表,或者直接叫商品表也可以的

    spu表比如我们说的苹果手机、华为手机、戴尔笔记本这样的叫spu

    -- ------------------------
    -- 商品spu表
    -- ------------------------
    DROP TABLE IF EXISTS `spu`;
    CREATE TABLE `spu` (`id` int(11) NOT NULL PRIMARY KEY AUTO_INCREMENT  COMMENT '主键id',`name` varchar(50) not null  COMMENT '商品名称',`keyword` varchar(50) not null  COMMENT '关键词',`introduction` varchar(100) not null  COMMENT '简介',`category_id` int(11) not null  COMMENT '关联到category表主键id',`brand_id` int(11) default null comment  '关联到brand表主键id',`pic_url` varchar(200) default  null comment  '封面图',`video_url` varchar(200) default  null comment  '视频地址',`slider_pic_urls` varchar(500) default null COMMENT '商品轮播图地址',`unit` int(11) default  null comment  '单位,关联到dict表主键id',`spec_type` tinyint(4) default 0 comment '单双规格,0表示单规格,1表示多规格(sku)',`price` decimal(10,2) default '0.00' comment '商品单价',`market_price` decimal(10,2) default '0.00' comment '商品市场价',`discount_price` decimal(10,2) default '0.00' comment '商品折扣价',`vip_price` decimal(10,2) default '0.00' comment '商品vip价',`cost_price` decimal(10,2) default '0.00' comment '商品成本价',`stock` int(11) default 0 comment '库存(如果是多规格求和)',`sort` int(11) DEFAULT 1 COMMENT '排序',`status` tinyint(4) DEFAULT 0 COMMENT '状态,0表示正常,1表示禁用',`is_hot` tinyint(4) DEFAULT 0 COMMENT '是否热销,0表示不是,1表示是',`is_benefit` tinyint(4) DEFAULT 0 COMMENT '是否优惠推荐,0表示不是,1表示是',`is_best` tinyint(4) DEFAULT 0 COMMENT '是否精品,0表示不是,1表示是',`is_new` tinyint(4) DEFAULT 0 COMMENT '是否新品,0表示不是,1表示是',`is_good` tinyint(4) DEFAULT 0 COMMENT '是否优品推荐,0表示不是,1表示是',`give_integral` int(11) DEFAULT 0 COMMENT '赠送积分',`sales_count` int(11) DEFAULT 0 COMMENT '销量',`browse_count` int(11) DEFAULT 0 COMMENT '浏览数',`content` text NOT NULL COMMENT '商品详情',`attribute` varchar(1000) default null COMMENT '销售属性数组,JSON 格式',`remark` varchar(100) default  null comment '备注',`created_at` timestamp(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) COMMENT '创建时间',`updated_at` timestamp(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6) COMMENT '更新时间',`deleted_at` timestamp(6) NULL DEFAULT NULL COMMENT '软删除时间',UNIQUE KEY `UK_name_deleted_at` (`name`,`deleted_at`)
    ) ENGINE=InnoDB  DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT = "商品spu表";
    
  • 4、sku

    上面说的苹果手机,可能是【黄色-128GB-大陆版】,【白色-256GB-港版】这样的叫sku

    -- ------------------------
    -- 商品sku表
    -- ------------------------
    DROP TABLE IF EXISTS `sku`;
    CREATE TABLE `sku` (`id` int(11) NOT NULL PRIMARY KEY AUTO_INCREMENT  COMMENT '主键id',`spu_id` int(11) NOT NULL comment '关联到spu主键id',`attribute_value` varchar(200) default null comment '销售属性值:用英文,拼接',`price` decimal(10,2) default '0.00' comment '商品单价',`market_price` decimal(10,2) default '0.00' comment '商品市场价',`discount_price` decimal(10,2) default '0.00' comment '商品折扣价',`vip_price` decimal(10,2) default '0.00' comment '商品vip价',`cost_price` decimal(10,2) default '0.00' comment '商品成本价',`bar_code` varchar(64)  DEFAULT NULL COMMENT 'SKU 的条形码',`pic_url` varchar(200)  NOT NULL COMMENT '图片地址',`stock` int DEFAULT NULL COMMENT '库存',`weight` double DEFAULT NULL COMMENT '商品重量,单位:kg 千克',`volume` double DEFAULT NULL COMMENT '商品体积,单位:m^3 平米',`sales_count` int DEFAULT NULL COMMENT '商品销量',`created_at` timestamp(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) COMMENT '创建时间',`updated_at` timestamp(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6) COMMENT '更新时间',`deleted_at` timestamp(6) NULL DEFAULT NULL COMMENT '软删除时间'
    ) ENGINE=InnoDB  DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT = "商品sku表";
    

二、前端选择销售属性

  • 1、最后效果图

    在这里插入图片描述

  • 2、上面的数据提前手动插入到数据库中的

在这里插入图片描述


在这里插入图片描述

  • 3、后端提供一个接口先查询全部的商品属性,在根据商品属性的id去查询商品属性值,这块可以自己见代码

三、选择商品属性生成SKU

  • 1、效果展示

在这里插入图片描述

  • 2、由销售属性来生成下面的表格的方法

    const checkPropertyList = ref([]);/*** 生成sku数据* @param {*} skuAttribute 选中的商品属性*/const generateSku = (skuAttribute) => {console.log(JSON.stringify(skuAttribute));const attrValue = [];// 获取选中的属性const checkList = [];for (const item of skuAttribute) {attrValue.push(item.attributeItem.filter((it) => item.checkList.includes(it.id)));checkList.push(item.id); // 选中的主键id}checkPropertyList.value = checkList;console.log(attrValue, '???');if (attrValue.length == 0) {tableData.value = [];return;}// 处理添加一个属性的时候表格置空if (!attrValue[attrValue.length - 1].length) {return;}// 循环组成sku数据const skuList = attrValue.reduce((pre, cur) => {let res = [];for (const item of pre) {for (const it of cur) {let t = item.name + ',' + it.name;res.push({name: t,url: item.url || it.url || '',});}}return res;}).map((it) => {const oldData = afterSku.value.find((item) => item.name == it.name);return {...it,id: oldData ? oldData.id : '',price: oldData ? oldData.price : '', // 单价stock: oldData ? oldData.stock : '', // 库存};});tableData.value = skuList;};
    
  • 3、在什么时候调用上面这个方法呢?,直接监听销售属性的变化就可以

    watch(() => skuAttributes.value,(newValue) => {generateSku(cloneDeep(newValue));},{deep: true,}
    );
    // 监听sku表格的变化,并将当前sku进行备份
    const afterSku = ref([]);
    watch(() => tableData.value,(value) => {afterSku.value = cloneDeep(value);},{ deep: true }
    );
    
  • 4、点击按钮提交数据给后端

    const submitHandler = async () => {ElMessage.success('请查看浏览器控制台');console.log('销售属性:', JSON.stringify(skuAttributes.value));console.log('表格数据:', JSON.stringify(tableData.value));const postData = {name: '苹果13',keyword: '苹果手机',introduction: 'laboris sint in',categoryId: 10,brandId: 50,picUrl: 'http://dummyimage.com/400x400',videoUrl: 'http://voanozyj.vg/suuadzgv',sliderPicUrls: 'http://dummyimage.com/400x400',unit: 25,specType: 79,price: 90,marketPrice: 11,discountPrice: 82,vipPrice: 32,costPrice: 87,stock: 19,sort: 33,isHot: 0,isBenefit: 0,isBest: 0,isNew: 0,isGood: 0,giveIntegral: 43,content: '手机详情',remark: 'magna eu laboris',// 过滤掉没有选择的sku属性attribute: JSON.stringify(skuAttributes.value),skuList: tableData.value.map((item) => {return {...item,attributeValue: item.name,barCode: item.name,discountPrice: item.price,costPrice: item.price,picUrl: 'http://dummyimage.com/400x400',vipPrice: item.price,volume: 85,marketPrice: 26,weight: 50,};}),};console.log(JSON.stringify(postData), '提交数据');const data = await SkuService.createSpuApi(postData);console.log(data);};
    
  • 5、完整代码如下

    <template><div class="sku"><el-card shadow="never"><el-form><el-form-item label="销售属性"><el-cardshadow="never"v-for="(item, index) of skuAttributes":key="index":gutter="20"class="sku-row"><el-button type="danger" class="delete-row-btn" @click="deleteRowHandler(index)">删除</el-button><el-row :gutter="10"><el-col :span="2">属性名称:</el-col><el-col :span="8"><el-selectv-model="item.id"placeholder="请选择属性"@change="changeAttributeHandler"><el-optionv-for="item in attributeItem":key="item.id":label="item.name":value="item.id":disabled="checkPropertyList.includes(item.id)"/></el-select></el-col></el-row><el-row :gutter="10"><el-col :span="2"> 属性值: </el-col><el-col :span="22"><el-checkbox-group v-model="item.checkList"><el-checkbox:label="value.id"v-for="(value, i) of item.attributeItem":key="i">{{ value.name }}</el-checkbox></el-checkbox-group></el-col></el-row></el-card><div><el-button type="primary" @click="addSkuAttrHandler">增加销售属性</el-button></div></el-form-item></el-form></el-card><!-- 下面表格 --><el-card shadow="never" style="margin-top: 20px"><el-table :data="tableData" style="width: 100%" border><el-table-column prop="name" label="销售规格" width="180" /><el-table-column prop="price" label="单价"><template #default="scope"><el-input v-model="scope.row.price" placeholder="单价"></el-input></template></el-table-column><el-table-column prop="stock" label="库存"><template #default="scope"><el-input v-model="scope.row.stock" placeholder="库存"></el-input></template></el-table-column></el-table><el-button type="primary" style="margin-top: 20px" @click="submitHandler">提交数据</el-button></el-card></div>
    </template><script setup>import { SkuService } from '@/services';import { ref, onMounted, watch } from 'vue';import { cloneDeep } from 'lodash';import { ElMessage } from 'element-plus';const skuAttributes = ref([]);// 添加属性const addSkuAttrHandler = () => {skuAttributes.value.push({id: null,attributeItem: [],checkList: [],});};// 删除const deleteRowHandler = (index) => {skuAttributes.value.splice(index, 1);};// 1.获取全部的销售属性const attributeItem = ref([]);const getAllAttrApi = async () => {const data = await SkuService.getAttributeListApi();attributeItem.value = data.result;};// 切换的时候const changeAttributeHandler = async (item) => {let currentItem = skuAttributes.value.find((it) => it.id == item);const currentIndex = skuAttributes.value.findIndex((it) => it.id == item);const data = await SkuService.getAttributeValueByAttributeIdApi(item);currentItem.attributeItem = data.result;currentItem.name = attributeItem.value.find((it) => it.id == item)?.name;// 替换之前的skuAttributes.value.splice(currentIndex, 1, currentItem);};// 表格数据const tableData = ref([]);const submitHandler = async () => {ElMessage.success('请查看浏览器控制台');console.log('销售属性:', JSON.stringify(skuAttributes.value));console.log('表格数据:', JSON.stringify(tableData.value));const postData = {name: '苹果13',keyword: '苹果手机',introduction: 'laboris sint in',categoryId: 10,brandId: 50,picUrl: 'http://dummyimage.com/400x400',videoUrl: 'http://voanozyj.vg/suuadzgv',sliderPicUrls: 'http://dummyimage.com/400x400',unit: 25,specType: 79,price: 90,marketPrice: 11,discountPrice: 82,vipPrice: 32,costPrice: 87,stock: 19,sort: 33,isHot: 0,isBenefit: 0,isBest: 0,isNew: 0,isGood: 0,giveIntegral: 43,content: '手机详情',remark: 'magna eu laboris',// 过滤掉没有选择的sku属性attribute: JSON.stringify(skuAttributes.value),skuList: tableData.value.map((item) => {return {...item,attributeValue: item.name,barCode: item.name,discountPrice: item.price,costPrice: item.price,picUrl: 'http://dummyimage.com/400x400',vipPrice: item.price,volume: 85,marketPrice: 26,weight: 50,};}),};console.log(JSON.stringify(postData), '提交数据');const data = await SkuService.createSpuApi(postData);console.log(data);};watch(() => skuAttributes.value,(newValue) => {generateSku(cloneDeep(newValue));},{deep: true,});// 监听sku表格的变化,并将当前sku进行备份const afterSku = ref([]);watch(() => tableData.value,(value) => {afterSku.value = cloneDeep(value);},{ deep: true });const checkPropertyList = ref([]);/*** 生成sku数据* @param {*} skuAttribute 选中的商品属性*/const generateSku = (skuAttribute) => {console.log(JSON.stringify(skuAttribute));const attrValue = [];// 获取选中的属性const checkList = [];for (const item of skuAttribute) {attrValue.push(item.attributeItem.filter((it) => item.checkList.includes(it.id)));checkList.push(item.id); // 选中的主键id}checkPropertyList.value = checkList;console.log(attrValue, '???');if (attrValue.length == 0) {tableData.value = [];return;}// 处理添加一个属性的时候表格置空if (!attrValue[attrValue.length - 1].length) {return;}// 循环组成sku数据const skuList = attrValue.reduce((pre, cur) => {let res = [];for (const item of pre) {for (const it of cur) {let t = item.name + ',' + it.name;res.push({name: t,url: item.url || it.url || '',});}}return res;}).map((it) => {const oldData = afterSku.value.find((item) => item.name == it.name);return {...it,id: oldData ? oldData.id : '',price: oldData ? oldData.price : '', // 单价stock: oldData ? oldData.stock : '', // 库存};});tableData.value = skuList;};onMounted(() => {getAllAttrApi();});
    </script><style lang="scss" scoped>.sku-row {width: 100%;margin-bottom: 10px;position: relative;.delete-row-btn {position: absolute;right: 10px;top: 10px;cursor: pointer;z-index: 30;}.sku-value-item {margin-bottom: 10px;position: relative;.close-icon {position: absolute;right: 0;top: 0;z-index: 10;cursor: pointer;opacity: 0;}&:hover {.close-icon {opacity: 1;}}}}
    </style>
    

四、前端实现sku选择

  • 1、效果图如下

    在这里插入图片描述

  • 2、实现代码见如下

    <template><div class="sku"><h3>iphone 13</h3><div v-for="(item, index) of processAttribute" :key="index"><div class="title" style="margin-bottom: 10px; margin-top: 10px">{{ item.title }}</div><template v-for="(item1, index1) of item.attributeItem" :key="index1"><el-tagtype="success":class="[{active: item1.activity,disabled: item1.disabled,},]"style="margin-right: 10px; cursor: pointer"@click="skuClickHandler(index, index1)">{{ item1.name }}</el-tag></template></div><div>当前选中的库存:{{ stock }}</div><div>价格范围:<span v-if="minPrice == maxPrice">{{ maxPrice }}</span><span v-else>{{ minPrice }}-{{ maxPrice }}</span></div></div>
    </template><script setup>import { onMounted } from 'vue';import { SkuService } from '@/services';import { useRoute } from 'vue-router';const route = useRoute();const skuAttribute = ref([]);const skuList = ref([]);const processAttribute = ref([]);const processSkuMap = ref({});const initData = () => {for (const item of skuAttribute.value) {let temp = {id: item.id,title: item.title,};temp.attributeItem = item.attributeItem.filter((it) => item.checkList.includes(it.id)) // 过滤有的属性.map((it) => {return {...it,activity: false,disabled: itemquantity(it.name) <= 0, // 判断当前是否小于0的库存stock: itemquantity(it.name),};});processAttribute.value.push(temp);}// 对 skuList 数据进行加工,并存入 processSkuMap 中for (const item of skuList.value) {let combArr = arrayCombine(item.attributeValue.split(','));for (let j = 0; j < combArr.length; j++) {var key = combArr[j].join(',');if (processSkuMap.value[key]) {// 库存累加,价格添加进数组processSkuMap.value[key].stock += +item.stock;processSkuMap.value[key].prices.push(item.price);} else {processSkuMap.value[key] = {stock: +item.stock,prices: [item.price],};}}}// 计算下// skuCheck();};// 计算当前sku的库存const itemquantity = (item) => {let quantity = 0;skuList.value.forEach((element) => {var skuArr = element.attributeValue.split(',');if (skuArr.indexOf(item) != -1) {quantity += +element.stock;}});return quantity;};const arrayCombine = (targetArr) => {let resultArr = [];for (var n = 0; n <= targetArr.length; n++) {var flagArrs = getFlagArrs(targetArr.length, n);while (flagArrs.length) {var flagArr = flagArrs.shift();var combArr = Array(targetArr.length);for (var i = 0; i < targetArr.length; i++) {if (flagArr[i]) {combArr[i] = targetArr[i];}}resultArr.push(combArr);}}return resultArr;};const getFlagArrs = (m, n) => {let flagArrs = [];let flagArr = [];let isEnd = false;for (let i = 0; i < m; i++) {flagArr[i] = i < n ? 1 : 0;}flagArrs.push(flagArr.concat());// 当n不等于0并且m大于n的时候进入if (n && m > n) {while (!isEnd) {var leftCnt = 0;for (var i = 0; i < m - 1; i++) {if (flagArr[i] == 1 && flagArr[i + 1] == 0) {for (var j = 0; j < i; j++) {flagArr[j] = j < leftCnt ? 1 : 0;}flagArr[i] = 0;flagArr[i + 1] = 1;var aTmp = flagArr.concat();flagArrs.push(aTmp);if (aTmp.slice(-n).join('').indexOf('0') == -1) {isEnd = true;}break;}flagArr[i] == 1 && leftCnt++;}}}return flagArrs;};// 点击skuconst skuClickHandler = (key1, key2) => {console.log(key1, key2, '点击了', processAttribute.value[key1]);// 如果不是被禁用的时候才执行if (!processAttribute.value[key1].attributeItem[key2].disabled) {// 选择和取消选中processAttribute.value[key1].attributeItem.map((item, index) => {item.activity = index == key2 ? !item.activity : false;});// 检查当前的sku是否有库存skuCheck();// 每次点击的时候判断禁用getStockPrice();}};// 当前选中的sku的库存机最小单价最大单价const stock = ref(0);const minPrice = ref(null);const maxPrice = ref(null);const skuCheck = () => {let sku = [];processAttribute.value.map((attr) => {let name = '';attr.attributeItem.map((item) => {console.log(item, '111');if (item.activity) {name = item.name;}});sku.push(name);});console.log(sku, '选中的的值', sku.join(','));stock.value = processSkuMap.value[sku.join(',')].stock;minPrice.value = Math.min.apply(Math, processSkuMap.value[sku.join(',')].prices);maxPrice.value = Math.max.apply(Math, processSkuMap.value[sku.join(',')].prices);};// 点击的时候判断库存禁用const getStockPrice = () => {processAttribute.value.map((attr) => {attr.attributeItem.map((item) => {item.disabled = itemquantity(item.name) <= 0;});});let count = 0;let i = 0;processAttribute.value.map((attr, index) => {let flag = false;attr.attributeItem.map((item) => {if (item.activity) {flag = true;}});if (!flag) {count += 1;i = index;}});// 当只有一组规格没选时if (count == 1) {processAttribute.value[i].attributeItem.map((item) => {let sku = [];let text = item.name;processAttribute.value.map((attr, index) => {if (index != i) {attr.attributeItem.map((item2) => {if (item2.activity) {sku.push(item2.name);}});} else {sku.push(text);}});if (processSkuMap.value[sku.join(',')].stock == 0) {item.disabled = true;}});}// 当所有规格都有选时if (count == 0) {processAttribute.value.map((attr, index) => {let i = index;processAttribute.value[index].attributeItem.map((item) => {if (!item.activity) {let sku = [];let text = item.name;processAttribute.value.map((list, index) => {if (index != i) {list.attributeItem.map((item2) => {if (item2.activity) {sku.push(item2.name);}});} else {sku.push(text);}});if (processSkuMap.value[sku.join(',')].stock == 0) {item.disabled = true;}}});});}};const initSkuData = async () => {const { result } = await SkuService.getSkuByIdApi(route.query.id);// console.log(data);console.log(result.skuAttribute, '111');skuAttribute.value = result.skuAttribute;skuList.value = result.skuList;};onMounted(async () => {await initSkuData();initData();});
    </script><style lang="scss" scoped>.sku {.active {background: skyblue;color: #fff;border: none;}.disabled {background: #ddd;}}
    </style>

五、具体代码见

  • 1、[后端代码](shuiping.kuang/sku_demo (gitee.com))
  • 2、[前端代码](shuiping.kuang/vue3-sku (gitee.com))

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LabVIEW振动数据采集与分析系统

在这个项目中&#xff0c; LabVIEW软件配合精确的硬件组件&#xff0c;以实现高效的振动数据采集和复杂信号分析。硬件方面&#xff0c;系统采用了PCB振动加速度传感器的高灵敏度传感器&#xff0c;以及NI9234型号的数据采集卡&#xff0c;确保了数据采集的高精度和可靠性。软件…

yarn包管理器在添加、更新、删除模块时,在项目中是如何体现的

技术很久不用&#xff0c;就变得生疏起来。对npm深受其害&#xff0c;决定对yarn再整理一遍。 yarn包管理器 介绍安装yarn帮助信息最常用命令 介绍 yarn官网&#xff1a;https://yarn.bootcss.com&#xff0c;学任何技术的最新知识&#xff0c;都可以通过其对应的网站了解。无…

(C语言)编译和链接

前言͟͟͞͞&#x1f48c;&#xff1a;对于现在的各种编译器而言许多都是好多个功能的集成&#xff0c;那么我们的代码到底是如何去实现的呢&#xff1f;难道我们的计算机可以直接读懂我们所写的代码&#xff0c;并运行吗&#xff1f;对于很多细心的小伙伴们可能会想这样的问题…

基于docker创建nginx容器

docker一键安装可以参考我这个博客&#xff1a;一键安装docker 1.创建基础容器 docker run -p280:280 --name nginx -d nginx创建挂载到容器的宿主机文件夹 mkdir -p /home/000nginx-ebrms-ftp/html mkdir -p /home/000nginx-ebrms-ftp/logs mkdir -p /home/000nginx-ebrms-f…

Win10 打开文件突然鼠标变成一个蓝色大圈卡住点不了也打不开文件,重启电脑也是这样

环境: Win10 专业版 加密客户端环境 问题描述: Win10 打开桌面word文件突然鼠标变成一个蓝色大圈卡住点不了也打不开文件,重启电脑也是这样,只有蓝色圈变大没有鼠标指针出现圈卡着不会动,和那些有鼠标箭头加小蓝色圈不一样 解决方案: 某网上查看的,还是要自己排查…

Java 内存模型深度解析

优质博文&#xff1a;IT-BLOG-CN 一、并发编程模型的两个关键问题 【1】并发中常见的两个问题&#xff1a;线程之间如何通信及线程之间如何同步。通信是指线程之间以何种机制来交换信息。在命令式编程中&#xff0c;线程之间的通信机制有两种&#xff1a;内存共享和消息传递&…

FPGA开发设计

一、概述 FPGA是可编程逻辑器件的一种&#xff0c;本质上是一种高密度可编程逻辑器件。 FPGA的灵活性高、开发周期短、并行性高、具备可重构特性&#xff0c;是一种广泛应用的半定制电路。 FPGA的原理 采用基于SRAM工艺的查位表结构&#xff08;LUT&#xff09;&#xff0c;…

智慧校园源码,云平台电子班牌系统,智能交互识别终端和移动化教育管理系统

智慧校园云平台电子班牌系统&#xff0c;利用先进的云计算技术&#xff0c;将教育信息化资源和教学管理系统进行有效整合&#xff0c;实现基础数据共享、应用统一管理。借助全新的智能交互识别终端和移动化教育管理系统&#xff0c;以考勤、课表、通知、家校互通等功能为切入点…

Linux 内核被冬季风暴 “封印“

Linus Torvalds在内核邮件列表上宣布&#xff0c;由于他所在的美国俄勒冈州波特兰地区受到严重冬季风暴的影响&#xff0c;导致网络和电力中断。波特兰及其周边地区气温急降至零下 -10C&#xff0c;因此他不得不临时中断对Linux 6.8内核的合并窗口操作。 Linus于1月7日发布了Li…

Odrive 学习系列四:如何使用脚本自动初始化odrive配置

一、背景: 在学习markbase的教程后,发现odrive的初始化配置命令确实有点多。尽管odrive有自动补全: 且可以通过 ctrl + → 来快速补全: 但是对初学者而言,仍旧有比较大的工作量。 而针对于此,我们可以通过powershell脚本的方式来解决这个问题。 二、设计初始化…

Electron Apple SignIn 登录

本人写博客&#xff0c;向来主张&#xff1a;代码要完整&#xff0c;代码可运行&#xff0c;文中不留下任何疑惑。 最讨厌写博客&#xff0c;代码只留下片段&#xff0c;文中关键的东西没写清楚。之前看了那么多文章&#xff0c;就是不告诉我clientId从哪来的。 官方资料地址&…

HCIA-HarmonyOS设备开发认证-序

序 最近涉及到HarmonyOS鸿蒙系统设备开发&#xff0c;在网络上已经有很多相关资料&#xff0c;视频教程&#xff0c;我也移植了公司的一个stm32G474板卡&#xff0c;运行LiteOS-m L0系统。 一面看资料一面移植&#xff0c;遇到不少坑&#xff0c;当看到运行的LOGO时&#xff0…

Halcon基于描述符的模板匹配

Halcon基于描述符的模板匹配 与基于透视形变的模板匹配类似&#xff0c;基于描述符的模板匹配能够在物体处于透视形变的状态下进行匹配&#xff0c;并且已标定和未标定的相机图像都适用。与透视形变不同的是&#xff0c;它的模板不是根据边缘轮廊创建的&#xff0c;而是根据特…

Elasticsearch 入门向使用

文章目录 ElasticSearch简介倒排索引安装(单节点)分词器kibana与Mysql概念上的对比索引库CRUD文档CRUDDSL查询相关性算分Function Score Query自定义算分Boolean Query 搜索结果处理排序分页高亮 数据聚合 aggregations自动补全数据同步集群 ElasticSearch 简介 Elasticsearc…

【人工智能课程】计算机科学博士作业一

【人工智能课程】计算机科学博士作业一 1 任务要求 模型拟合&#xff1a;用深度神经网络拟合一个回归模型。从各种角度对其改进&#xff0c;评价指标为MSE。掌握技巧&#xff1a; 熟悉并掌握深度学习模型训练的基本技巧。提高PyTorch的使用熟练度。掌握改进深度学习的方法。 …

Python爬虫IP池

目录 一、介绍 1.1 为什么需要IP池&#xff1f; 1.2 IP池与代理池的区别 二、构建一个简单的IP池 三、注意事项 一、介绍 在网络爬虫的世界中&#xff0c;IP池是一个关键的概念。它允许爬虫程序在请求网页时使用多个IP地址&#xff0c;从而降低被封禁的风险&#xff0c;提高…

springcloud OpenFeign服务接口调用

文章目录 代码下载地址OpenFeign简介OpenFeign使用步骤测试 OpenFeign超时控制超时设置&#xff0c;故意设置超时演示出错情况服务提供方8001故意写暂停程序服务消费方80添加超时方法PaymentFeignService服务消费方80添加超时方法OrderFeignController测试YML文件里需要开启Ope…

五、模 板

1 泛型编程 以往我们想实现一个通用的交换函数&#xff0c;可能是通过下面的方式来实现的&#xff1a; void Swap(int& left, int& right) {int temp left;left right;right temp; } void Swap(double& left, double& right) {double temp left;left ri…

算法练习-A+B/财务管理/实现四舍五入/牛牛的菱形字符(题目链接+题解打卡)

难度参考 难度&#xff1a;简单 分类&#xff1a;熟悉OJ与IDE的操作 难度与分类由我所参与的培训课程提供&#xff0c;但需要注意的是&#xff0c;难度与分类仅供参考。以下内容均为个人笔记&#xff0c;旨在督促自己认真学习。 题目 A B1. A B - AcWing题库财务管理1004:财…

【迅搜19】扩展(二)TNTSearch和JiebaPHP方案

扩展&#xff08;二&#xff09;TNTSearch和JiebaPHP方案 搜索引擎系列的最后一篇了。既然是最后一篇&#xff0c;那么我们也轻松一点&#xff0c;直接来看一套非常有意思的纯 PHP 实现的搜索引擎及分词方案吧。这一套方案由两个组件组成&#xff0c;一个叫 TNTSearch &#xf…