电商平台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.mzph.cn/news/633309.shtml

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

相关文章

HCIA-H12-811题目解析(12)

1、如图所示&#xff0c; 关于OSPF的拓扑和配置&#xff0c;下列说法中正确的是&#xff1f; 2、如图所示&#xff0c;私有网络中有一台web服务器需要向公网用户提供HTTP服务&#xff0c;因此网络管理员需要在网关路由器RTA上配置NAT以实现需求&#xff0c;则下面配置中能满足…

区间预测 | Matlab实现LSSVM-ABKDE的最小二乘支持向量机结合自适应带宽核密度估计多变量回归区间预测

区间预测 | Matlab实现LSSVM-ABKDE的最小二乘支持向量机结合自适应带宽核密度估计多变量回归区间预测 目录 区间预测 | Matlab实现LSSVM-ABKDE的最小二乘支持向量机结合自适应带宽核密度估计多变量回归区间预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab实现…

爬虫接口获取外汇数据(汇率,外汇储备,贸易顺差,美国CPI,M2,国债利率)

akshare是一个很好用的财经数据api接口&#xff0c;完全免费&#xff01;&#xff01;和Tushare不一样。 除了我标题显示的数据外&#xff0c;他还提供各种股票数据&#xff0c;债券数据&#xff0c;外汇&#xff0c;期货&#xff0c;宏观经济&#xff0c;基金&#xff0c;银行…

深度学习和机器学习中针对非时间序列的回归任务,有哪些改进角度?

深度学习和机器学习中针对非时间序列的回归任务&#xff0c;有哪些改进角度&#xff1f; 目录 深度学习和机器学习中针对非时间序列的回归任务&#xff0c;有哪些改进角度&#xff1f;引言1 数据预处理2 数据集增强3 特征选择4 模型选择5 模型正则化与泛化6 优化器7 学习率8 超…

年龄性别预测2:Pytorch实现年龄性别预测和识别(含训练代码和数据)

年龄性别预测2&#xff1a;Pytorch实现年龄性别预测和识别(含训练代码和数据) 目录 年龄性别预测2&#xff1a;Pytorch实现年龄性别预测和识别(含训练代码和数据) 1.年龄性别预测和识别方法 2.年龄性别预测和识别数据集 3.人脸检测模型 4.年龄性别预测和识别模型训练 &a…

窗口辅助管理工具--Magnet 中文

Magnet是一款窗口管理工具软件&#xff0c;可以帮助用户更高效地组织和管理打开的窗口。它通过简单的拖放操作将窗口捕捉到特定的位置和大小&#xff0c;支持快速将窗口分割成不同的区域&#xff0c;并在屏幕上创建自定义的布局。用户可以选择预设的布局选项&#xff0c;也可以…

密码学学习笔记(二十四):TCP/IP协议栈

TCP/IP协议栈的基础结构包括应用层、传输层、网络层、数据链路层和物理层。 应用层 应用层位于TCP/IP协议栈的最顶层&#xff0c;是用户与网络通信的接口。这一层包括了各种高级应用协议&#xff0c;如HTTP&#xff08;用于网页浏览&#xff09;、FTP&#xff08;用于文件传输…

适用于电脑的 10 款最佳文件恢复软件

由于在线可用选项数量众多&#xff0c;寻找适用于 Windows 11 的最佳文件恢复软件可能会很棘手&#xff0c;但本指南将为您提供有关此主题所需的所有信息。 文件或数据丢失是指意外或无意丢失电子设备上存储的重要数字文件的事件。这可能是由于外部或内部问题造成的&#xff0…

element-ui的el-upload组件实现上传拖拽排序图片顺序(sortablejs)

<template><!-- 省略其他配置 --><el-upload ref"upload" :file-list.sync"fileList"></el-upload></template><script>import Sortable from sortablejs;export default {data() {return {fileList: []};},mounted()…

【数据结构与算法】排序算法:冒泡排序,冒泡排序优化,选择排序、选择排序优化

目录 一、冒泡排序 1、冒泡排序思想 2、冒泡排序算法的性能分析 代码实现&#xff1a; 二、选择排序 1、选择排序思想 2、选择排序算法的性能分析 代码实现&#xff1a; 一、冒泡排序 1、冒泡排序思想 冒泡排序的基本思想是通过相邻元素之间的比较和交换来逐步将最大…

基于springboot+vue的房产销售系统(前后端分离)

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容&#xff1a;毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目背景…

UI自动化Selenium 无头模式运行

1、导入浏览器参数设置 from selenium.webdriver.chrome.options import Options 2、创建参数&#xff0c;并使用无厘头模式创建driver对象 opt Options() # 新建参数对象 opt.add_argument("--headless") # 无头 self.driver webdriver.Chrome(optionsopt) …

List详解,线性表

什么是List 在集合框架中&#xff0c;list是一个接口&#xff0c;继承自collection&#xff0c;collection也是接口&#xff0c;继承自Iterable&#xff1b; Iterable是一个接口&#xff0c;表示实现该接口的类是可以逐个元素进行遍历的&#xff0c;如下&#xff1a; 第一个是…

游卡:OceanBase在游戏核心业务的规模化降本实践

从 2023 年 9 月测试 OceanBase&#xff0c;到如今 3 个核心业务应用 OceanBase&#xff0c;国内最早卡牌游戏研发者之一的游卡仅用了两个月。是什么原因让游卡放弃游戏行业通用的 MySQL方案&#xff0c;选择升级至 OceanBase&#xff1f;杭州游卡网络技术有限公司&#xff08;…

密码产品推介 | 沃通安全电子签章系统(ES-1)

产品介绍 沃通安全电子签章系统&#xff08;ES-1&#xff09;是一款基于密码技术、完全自主研发的商用密码产品&#xff0c;严格遵循国家密码管理局制定的相关标准&#xff0c;可为企业和个人提供安全、合规的电子签章功能服务。产品的主要用途是为各类文书、合同、表单等电子…

半波整流电路原理详解+参数与计算公式

什么是半波整流电路&#xff1f; 半波整流电路的基本操作非常简单&#xff0c;输入信号通过二极管&#xff0c;由于只能通过一个方向的电流&#xff0c;二极管的整流作用&#xff0c;单个二极管只允许通过一半的波形。 下图说明了半波整流电路的基本原理。 半波整流电路工作图…

自动驾驶概述

自动驾驶技术主要解决的问题 无人驾驶分级 L1:巡航定速(ACC),巡航装置可以纵向控制车辆,可以加速减速 L2:车道保持辅助,系统可以纵向控制也可以横向控制汽车,但车是辅助,人才是主导。 L2.5:可以提供简单路况下的变道能力,比如特斯拉。 L3:L2的基础上提供变道能力,…

PGSQL主键序列

PostgreSQL和 MySQL数据库还是有一定的区别。 下面了解一下 PGSQL的主键序列。 一、主键 1、系统自带主键序列 在 PostgreSQL 中&#xff0c;GENERATED BY DEFAULT 和 GENERATED ALWAYS 是用于定义自动生成的列&#xff08;Generated Column&#xff09;的选项。一般可作用…

C#根据 App.config 文件中的配置信息去查找并加载指定目录下的 DLL

C#根据 App.config 文件中的配置信息去查找并加载指定目录下的 DLL System.IO.FileNotFoundException:“未能加载文件或程序集“AliNPOIExcel, Version1.0.0.0, Cultureneutral, PublicKeyTokennull”或它的某一个依赖项。系统找不到指定的文件。” 如何让程序识别不同目录下…

Scrcpy:掌握你的Android设备

Scrcpy&#xff1a;掌握你的Android设备 本文将介绍Scrcpy工具&#xff0c;它是一种强大的安卓设备控制工具&#xff0c;可以实现屏幕镜像、操作控制等功能。我们将探讨Scrcpy的基本原理和工作方式&#xff0c;并介绍如何使用Scrcpy连接和控制安卓设备。此外&#xff0c;我们还…