第13天-仓储服务(仓库管理,采购管理 ,SPU规格维护)
1.仓储服务开发配置
1.1.加入到Nacos注册中心
spring:application:name: gmall-warecloud:nacos:discovery:server-addr: 192.168.139.10:8848namespace: 36854647-e68c-409b-9233-708a2d41702c
1.2.配置网关路由
spring:cloud:gateway:routes:- id: ware_routeuri: lb://gmall-warepredicates:- Path=/api/ware/**filters:- RewritePath=/api/(?<segment>.*), /$\{segment}
1.3.主启动类开启相关功能
package com.atguigu.gmall.ware;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;@EnableDiscoveryClient
@SpringBootApplication
public class GmallWareApplication {public static void main(String[] args) {SpringApplication.run(GmallWareApplication.class, args);}}
1.4.MyBatisPlus分页插件配置
package com.atguigu.gmall.ware.config;import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
import com.baomidou.mybatisplus.extension.plugins.pagination.optimize.JsqlParserCountOptimize;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.transaction.annotation.EnableTransactionManagement;/*** MyBatisPlus 配置类 {@link MybatisPlusConfig}* @author zhangwen* @email: 1466787185@qq.com*/
@Configuration
//开启事务
@EnableTransactionManagement
@MapperScan("com.atguigu.gmall.ware.dao")
public class MybatisPlusConfig {/*** 引入分页插件* @return 分页插件拦截器实例*/@Beanpublic PaginationInterceptor paginationInterceptor() {PaginationInterceptor paginationInterceptor = new PaginationInterceptor();// 设置请求的页面大于最大页后操作, true调回到首页,false 继续请求,默认falsepaginationInterceptor.setOverflow(true);// 设置最大单页限制数量,默认 500 条,-1 不受限制paginationInterceptor.setLimit(100);// 开启 count 的 join 优化,只针对部分 left joinpaginationInterceptor.setCountSqlParser(new JsqlParserCountOptimize(true));return paginationInterceptor;}
}
2.仓库维护CRUD
- 逆向工程已经实现了CRUD,只需要对查询进行修改
- 添加仓库信息
3.采购单维护
3.1.采购流程
- 创建采购需求
- 创建采购单
- 为采购单分配采购人员
- 领取采购单
- 完成采购单
- 商品入库
采购流程图如下:
3.2.采购需求
采购需求生成方式:
- 人工创建采购需求(人工)
- 库存预警自动创建采购需求(自动化)
3.2.1.采购需求-人工新增
3.2.2.采购需求-查询
GET /ware/purchasedetail/list//请求参数
{page: 1, // 当前页码limit: 10, // 每页记录数sidx: 'id', // 排序字段order: 'asc/desc', // 排序方式key: '华为', // 检索关键字status: 0, // 状态wareId: 1, // 仓库id
}//响应数据
{"msg": "success","code": 0,"page": {"totalCount": 0,"pageSize": 10,"totalPage": 0,"currPage": 1,"list": [{"id": 2,"purchaseId": 1,"skuId": 1,"skuNum": 2,"skuPrice": 22.0000,"wareId": 1,"status": 1}]}
}
PurchaseDetailController
/*** 采购需求列表*/
@RequestMapping("/list")
public R list(@RequestParam Map<String, Object> params){PageUtils page = purchaseDetailService.queryPage(params);return R.ok().put("page", page);
}
PurchaseDetailServiceImpl
/*** 采购需求列表查询* @param params* @return*/
@Override
public PageUtils queryPage(Map<String, Object> params) {QueryWrapper<PurchaseDetailEntity> queryWrapper = new QueryWrapper<>();String key = (String) params.get("key");if (!StringUtils.isEmpty(key)) {queryWrapper.and(wrapper -> {wrapper.eq("purchase_id", key).or().eq("sku_id", key);});}String status = (String) params.get("status");if (!StringUtils.isEmpty(status)) {queryWrapper.eq("status", status);}String wareId = (String) params.get("wareId");if (!StringUtils.isEmpty(wareId)) {queryWrapper.eq("ware_id", wareId);}IPage<PurchaseDetailEntity> page = this.page(new Query<PurchaseDetailEntity>().getPage(params),queryWrapper);return new PageUtils(page);
}
3.2.3.合并采购单
合并采购单有两种方式
- 选择一个采购单
- 若没有选择一个采购单,系统自动创建一个新的采购单进行合并
3.2.4.查询未领取的采购单
采购单状态:
- CREATED(0, “新建”)
- ASSIGNED(1, “已分配”)
- RECEIVED(2, “已领取”)
- FINISHED(3, “已完成”)
- ERROR(4, “有异常”)
未领取的采购单:新建和已分配
GET /ware/purchase/unreceive/list
PurchaseController
/*** 查询未领取的采购单*/@RequestMapping("/unreceive/list")public R listUnReceive(@RequestParam Map<String, Object> params){PageUtils page = purchaseService.queryPageUnReceivePurchase(params);return R.ok().put("page", page);}
PurchaseServiceImpl
/*** 查询未领取的采购单* @param params* @return*/@Overridepublic PageUtils queryPageUnReceivePurchase(Map<String, Object> params) {IPage<PurchaseEntity> page = this.page(new Query<PurchaseEntity>().getPage(params),new QueryWrapper<PurchaseEntity>().eq("status",WareConstant.PurchaseStatusEnum.CREATED.getCode()).or().eq("status",WareConstant.PurchaseStatusEnum.ASSIGNED.getCode()));return new PageUtils(page);}
3.2.5.合并采购需求
POST /ware/purchase/merge//请求参数
{purchaseId: 1, // 整单iditems: [1,2,3] // 合并项集合
}
PurchaseController
/*** 合并采购需求-采购单* @return*/@PostMapping("/merge")public R merge(@RequestBody MergeVO mergeVO) {purchaseService.mergePurchase(mergeVO);return R.ok();}
purchaseServiceImpl
/*** 合并采购需求-采购单* @param mergeVO*/
@Transactional(rollbackFor = Exception.class)
@Override
public void mergePurchase(MergeVO mergeVO) {Long purchaseId = mergeVO.getPurchaseId();if (StringUtils.isEmpty(purchaseId)) {// 新增PurchaseEntity purchaseEntity = new PurchaseEntity();purchaseEntity.setStatus(WareConstant.PurchaseStatusEnum.CREATED.getCode());purchaseEntity.setCreateTime(new Date());purchaseEntity.setUpdateTime(new Date());this.save(purchaseEntity);purchaseId = purchaseEntity.getId();}List<Long> items = mergeVO.getItems();Long finalPurchaseId = purchaseId;List<PurchaseDetailEntity> detailEntities = items.stream().map(item -> {PurchaseDetailEntity purchaseDetailEntity = new PurchaseDetailEntity();purchaseDetailEntity.setId(item);purchaseDetailEntity.setPurchaseId(finalPurchaseId);purchaseDetailEntity.setStatus(WareConstant.PurchaseDetailEnum.ASSIGNED.getCode());return purchaseDetailEntity;}).collect(Collectors.toList());detailService.updateBatchById(detailEntities);// 采购单更新时间PurchaseEntity purchaseEntity = new PurchaseEntity();purchaseEntity.setId(purchaseId);purchaseEntity.setUpdateTime(new Date());this.updateById(purchaseEntity);
}
4.采购单
菜单路径:库存系统 -> 采购单维护 -> 采购单
4.1.新建采购单-人工新增
4.2.查询采购单
4.3.分配采购人员
为采购单分配采购人员,采购人员从系统用户表中查询
4.4.领取采购单
4.4.1.API
POST /ware/purchase/received//请求参数
[1,2,3,4] //采购单id
4.4.2.后台接口实现
PurchaseController
/*** 领取采购单* @param ids 采购单id集合* @return*/@PostMapping("/received")public R receive(@RequestBody List<Long> ids) {purchaseService.receivePurchase(ids);return R.ok();}
PurchaseServiceImpl
/*** 领取采购单* @param ids 采购单id集合*/
@Transactional(rollbackFor = Exception.class)
@Override
public void receivePurchase(List<Long> ids) {// 1.确认当前采购单是新建或已分配状态List<PurchaseEntity> purchaseEntities = ids.stream().map(id -> {PurchaseEntity purchaseEntity = this.getById(id);return purchaseEntity;}).filter(purchaseEntity -> {if (purchaseEntity.getStatus() ==WareConstant.PurchaseStatusEnum.CREATED.getCode() ||purchaseEntity.getStatus() ==WareConstant.PurchaseStatusEnum.ASSIGNED.getCode()) {return true;}return false;}).map(purchaseEntity -> {// 设置采购单的状态为已领取purchaseEntity.setStatus(WareConstant.PurchaseStatusEnum.RECEIVED.getCode());purchaseEntity.setUpdateTime(new Date());return purchaseEntity;}).collect(Collectors.toList());// 2.批量修改采购单的状态this.updateBatchById(purchaseEntities);// 3.修改采购项的状态purchaseEntities.forEach(purchaseEntity -> {// 根据采购单id获取采购项List<PurchaseDetailEntity> detailEntities =detailService.listDetailByPurchaseId(purchaseEntity.getId());List<PurchaseDetailEntity> collect =detailEntities.stream().map(detailEntity ->{PurchaseDetailEntity entity = new PurchaseDetailEntity();entity.setId(detailEntity.getId());entity.setStatus(WareConstant.PurchaseDetailEnum.BUYING.getCode());return entity;}).collect(Collectors.toList());// 批量修改采购项状态detailService.updateBatchById(collect);});
}
4.4.3.Postman模拟领取采购单
使用Postman发送领取采购单请求
POST /ware/purchase/received//请求参数
[1,2,3,4] //采购单id
领取成功后,采购单状态更新为 已领取
采购需求状态更新为 正在采购
4.5.完成采购单
4.5.1.API
POST /ware/purchase/done// 请求参数
{"id":1, // 采购单id// itemId 采购项id,status 采购状态,reason 采购情况说明"items":[{"itemId":1,"status":3,"reason":"完成"},{"itemId":2,"status":3,"reason":"完成"},{"itemId":3,"status":3,"reason":"完成"}]
}
4.5.2.后台接口实现
PurchaseController
/*** 完成采购单* @param purchaseDoneVO* @return*/@PostMapping("/done")public R finished(@RequestBody PurchaseDoneVO purchaseDoneVO) {purchaseService.done(purchaseDoneVO);return R.ok();}
PurchaseServiceImpl
/*** 完成采购单* @param purchaseDoneVO*/
@Transactional(rollbackFor = Exception.class)
@Override
public void done(PurchaseDoneVO purchaseDoneVO) {// 1.修改采购项状态List<PurchaseDetailEntity> updateList = new ArrayList<>();boolean flag = true;for (PurchaseItemDoneVO itemDoneVO : purchaseDoneVO.getItems()) {PurchaseDetailEntity purchaseDetailEntity = new PurchaseDetailEntity();if (itemDoneVO.getStatus() ==WareConstant.PurchaseDetailEnum.FAILED.getCode()) {flag = false;purchaseDetailEntity.setStatus(itemDoneVO.getStatus());} else {purchaseDetailEntity.setStatus(WareConstant.PurchaseDetailEnum.FINISHED.getCode());// 2.将成功采购的商品入库PurchaseDetailEntity detailEntity =detailService.getById(itemDoneVO.getItemId());wareSkuService.addStock(detailEntity.getSkuId(),detailEntity.getWareId(), detailEntity.getSkuNum());}purchaseDetailEntity.setId(itemDoneVO.getItemId());updateList.add(purchaseDetailEntity);}detailService.updateBatchById(updateList);// 3.修改采购单状态PurchaseEntity purchaseEntity = new PurchaseEntity();purchaseEntity.setId(purchaseDoneVO.getId());purchaseEntity.setStatus(flag ?WareConstant.PurchaseStatusEnum.FINISHED.getCode(): WareConstant.PurchaseStatusEnum.ERROR.getCode());purchaseEntity.setUpdateTime(new Date());this.updateById(purchaseEntity);
}
4.5.3.Postman模拟完成采购单
使用Postman发送完成采购单请求
POST /ware/purchase/done// 请求参数
{"id":1, // 采购单id"items": [// itemId 采购项id,status 采购状态, reason 采购说明{"itemId":1,"status":3,"reason":"完成"},{"itemId":2,"status":3,"reason":"完成"}]
}
完成采购单后
采购单状态更新为 已完成
采购商品状态更新为 已完成
商品库存更新
5.商品库存
5.1.入库方式
-
手动新增库存(不能直接新增,只能作为补偿手段)
-
采购入库(常规)
1、发起商品采购需求
2、创建采购单
3、采购人员领取采购单,进行商品采购(对接采购系统)
4、完成采购
5、商品入库
5.2.库存查询
5.2.1.API
GET /ware/waresku/list// 请求参数
{page: 1, // 当前页码limit: 10, // 每页记录数sidx: 'id', // 排序字段order: 'asc/desc', // 排序方式wareId: 123, // 仓库idskuId: 123 // 商品id
}//响应数据
{"msg": "success","code": 0,"page": {"totalCount": 0,"pageSize": 10,"totalPage": 0,"currPage": 1,"list": [{"id": 1,"skuId": 1,"wareId": 1,"stock": 1,"skuName": "dd","stockLocked": 1}]}
}
5.2.2.后台接口实现
WareSkuController
/*** 商品库存查询*/
@RequestMapping("/list")
public R list(@RequestParam Map<String, Object> params){PageUtils page = wareSkuService.queryPage(params);return R.ok().put("page", page);
}
WareSkuServiceImpl
/*** 查询商品库存* @param params* @return*/
@Override
public PageUtils queryPage(Map<String, Object> params) {QueryWrapper<WareSkuEntity> queryWrapper = new QueryWrapper<>();String skuId = (String) params.get("skuId");if (!StringUtils.isEmpty(skuId)) {queryWrapper.eq("sku_id", skuId);}String wareId = (String) params.get("wareId");if (!StringUtils.isEmpty(skuId)) {queryWrapper.eq("ware_id", wareId);}IPage<WareSkuEntity> page = this.page(new Query<WareSkuEntity>().getPage(params),queryWrapper);return new PageUtils(page);
}
6.SPU规格维护
6.1.获取SPU规格
6.1.1.API
GET /product/attr/base/listforspu/{spuId}//响应数据
{"msg": "success","code": 0,"data": [{"id": 43,"spuId": 11,"attrId": 7,"attrName": "入网型号","attrValue": "LIO-AL00","attrSort": null,"quickShow": 1}]
}
6.1.2.后台接口实现
AttrController
/*** 获取SPU规格属性* @param spuId* @return*/@GetMapping("/base/listforspu/{spuId}")public R listBaseAttrForSpu(@PathVariable("spuId") Long spuId) {List<ProductAttrValueEntity> entities = productAttrValueService.listBaseAttrForSpu(spuId);return R.ok().put("data", entities);}
ProductAttrValueServiceImpl
/*** 获取SPU规格属性* @param spuId* @return*/
@Override
public List<ProductAttrValueEntity> listBaseAttrForSpu(Long spuId) {List<ProductAttrValueEntity> attrValueEntities = this.list(new QueryWrapper<ProductAttrValueEntity>().eq("spu_id", spuId));return attrValueEntities;
}
6.2.修改SPU规格
6.2.1.API
POST /product/attr/update/{spuId}// 请求参数
[{"attrId": 7,"attrName": "入网型号","attrValue": "LIO-AL00","quickShow": 1
}, {"attrId": 14,"attrName": "机身材质工艺","attrValue": "玻璃","quickShow": 0
}, {"attrId": 16,"attrName": "CPU型号","attrValue": "HUAWEI Kirin 980","quickShow": 1
}]
6.2.2.后台接口实现
AttrController
/*** 修改SPU规格属性* @param spuId* @param entities* @return*/@PostMapping("/update/{spuId}")public R updateSpuAttr(@PathVariable("spuId") Long spuId, @RequestBody List<ProductAttrValueEntity> entities){productAttrValueService.updateSpuAttr(spuId, entities);return R.ok();}
ProductAttrValueServiceImpl
/*** 修改SPU规格属性* @param spuId* @param entities*/
@Transactional(rollbackFor = Exception.class)
@Override
public void updateSpuAttr(Long spuId, List<ProductAttrValueEntity> entities) {// 删除spu之前对应的所有规格属性this.remove(new QueryWrapper<ProductAttrValueEntity>().eq("spu_id",spuId));//插入spu新的规格属性List<ProductAttrValueEntity> ProductAttrValueEntities = entities.stream().map(entity -> {entity.setSpuId(spuId);return entity;}).collect(Collectors.toList());this.saveBatch(ProductAttrValueEntities);
}
相关文章:
第13天-仓储服务(仓库管理,采购管理 ,SPU规格维护)
1.仓储服务开发配置 1.1.加入到Nacos注册中心 spring:application:name: gmall-warecloud:nacos:discovery:server-addr: 192.168.139.10:8848namespace: 36854647-e68c-409b-9233-708a2d41702c1.2.配置网关路由 spring:cloud:gateway:routes:- id: ware_routeuri: lb://gmal…...
Maven 命令行及例子
基本 mvn -v - show-version -version 显示版本信息mvn -h - help 显示帮助信息mvn -e -errors控制 maven 的日志级别,产生执行错误相关消息mvn -q - quiet 控制 maven 的日志级别,仅仅显示错误mvn -o - offline 运行 offline 模式,不联网更…...
JavaScript手写题
一、防抖 function debounce(fn, delay200) {let timeout null; // 定时器控制return function(...args) {if (timeout) { // 定时器存在,表示某个动作之前触发过了clearTimeout(timeout); // 清除定时器timeout null;} else {// 对第一次输入立即执行fn.apply…...
为什么图标的宽度总是8的倍数?
对于 Windows 上的所有图标而言,它的宽度总是8的倍数,这可不是因为人们喜欢2的幂,虽然在计算机世界,你会看到很多这样的数字,例如,1024,4096等。 在 Windows 的早期阶段,大多数显卡…...
常用的xpath
一、xpath 语法 简单看一下菜鸟教程即可 1、基本语法 XPath 使用路径表达式在 XML 文档中选取节点。节点是通过沿着路径或者 step 来选取的。 下面列出了最有用的路径表达式: 表达式描述nodename选取此节点的所有子节点。/从根节点选取(取子节点&#…...
【035】基于java的进销库存管理系统(Vue+Springboot+Mysql)前后端分离项目,附万字课设论文
1.3 系统实现的功能 本次设计任务是要设计一个超市进销存系统,通过这个系统能够满足超市进销存系统的管理及员工的超市进销存管理功能。系统的主要功能包括:首页、个人中心、员工管理、客户管理、供应商管理、承运商管理、仓库信息管理、商品类别管理、 …...
【Spark分布式内存计算框架——Spark Streaming】7. Kafka集成方式
集成方式 Spark Streaming与Kafka集成,有两套API,原因在于Kafka Consumer API有两套, 文档:http://spark.apache.org/docs/2.4.5/streaming-kafka-integration.html。 方式一:Kafka 0.8.x版本 老的Old Kafka Consum…...
如何引入elementUI
elementUI的引入完整引入按需引入完整引入 在 main.js 中写入以下内容: import Vue from ‘vue’; import ElementUI from ‘element-ui’; import ‘element-ui/lib/theme-chalk/index.css’; import App from ‘./App.vue’; Vue.use(ElementUI); new Vue({ el: ‘…...
vue3+rust个人博客建站日记4-Vditor搞定MarkDown
即然是个人博客,那么绝对不能丢给自己一个大大的输入框敷衍了事。如果真是这样,现在就可以宣布项目到此结束了。如今没人享受用输入框写博客。作为一个有追求的程序员,作品就要紧跟潮流。 后来,Markdown 的崛起逐步改变了大家的排…...
KDZD-JC软化击穿试验仪
一、概 述 KDZD-JC智能软化击穿试验仪是根据GB/T4074.6-2008和idtIEC60851-6:2004标准而设计的一种新型漆包圆线检测仪器。主要适用于固体绝缘材料(如:塑料、橡胶、层压材料、薄膜、树脂、云母、陶瓷、玻璃、绝缘漆等绝缘材料及绝缘件)在工…...
【数据结构】单链表的C语言实现--万字详解介绍
📝个人主页:Sherry的成长之路 🏠学习社区:Sherry的成长之路(个人社区) 📖专栏链接:数据结构 🎯长路漫漫浩浩,万事皆有期待 文章目录1.链表1.1 链表的概念…...
电子科技大学软件工程期末复习笔记(七):测试策略
目录 前言 重点一览 V模型 回归测试 单元测试 集成测试 重要概念 自顶向下的集成方法 自底向上的集成方法 SMOKE方法 系统测试 验收测试 α测试 β测试 本章小结 前言 本复习笔记基于王玉林老师的课堂PPT与复习大纲,供自己期末复习与学弟学妹参考用…...
逆向-还原代码之除法 (Interl 64)
除法和32位差不多,毕竟背后的数学公式是一样的。区别只是32位的乘法需要两个寄存器来存放大数相乘的结果,而64位的不需要,一个寄存器就能存下。所以在64位的环境下,多了右移32位这条指令,其他指令一样。 //code #incl…...
Python WebDriver自动化测试
Webdriver Selenium 是 ThroughtWorks 一个强大的基于浏览器的开源自动化测试工具,它通常用来编写 Web 应用的自动化测试。 Selenium 2,又名 WebDriver,它的主要新功能是集成了 Selenium 1.0 以及 WebDriver(WebDriver 曾经是…...
2023年微信小程序获取手机号授权登录注册详细教程,包含服务端教程
前言 小程序中有很多地方都会用到用户的手机号,比如登陆注册,填写收货地址等等。有了这个组件可以快速获取微信绑定手机号码,无须用户填写。网上大多数教程还是往年的,而微信官方的api已做了修改。本篇文章将使用最新的方法获取手…...
YOLOv8模型学习笔记
在前面的章节中博主学习了YOLOv5的相关知识,从YOLOv5的数据增强处理到模型设计,从正负样本匹配策略到LOSS设计,今天博主学习的是YOLOv8,同为ultralytics公司的产品,两者无论是思想层面还是具体的设计方面都有着异曲同工…...
Java SE知识点1
一、continue、break、和return的区别是什么? 在循环结构中,当循环条件不满足或者循环次数达到要求时,循环会正常结束。但是,有时候可能需要 在循环的过程中,当发生了某种条件之后 ,提前终止循环,这就需要用到下面几个关键词: 1. continue :指跳出当前的这一次循环,…...
华为OD机试模拟题 用 C++ 实现 - 端口合并(2023.Q1)
最近更新的博客 【华为OD机试模拟题】用 C++ 实现 - 最多获得的短信条数(2023.Q1)) 文章目录 最近更新的博客使用说明端口合并题目输入输出示例一输入输出说明示例二输入输出说明示例三输入输出说明...
C++ Primer Plus 第6版 读书笔记(3) 第3章 处理数据
目录 3.1 简单变量 3.1.1 变量名 *位与字节 3.1.4 无符号类型 3.1.7 C如何确定常量的类型 C是在 C 语言基础上开发的一种集面向对象编程、泛型编程和过程化编程于一体的编程语言,是C语言的超集。本书是根据2003年的ISO/ANSI C标准编写的,通过大量短…...
ArrayList源码解读
参数 //默认初始容量private static final int DEFAULT_CAPACITY 10;//空数组(用于空实例)private static final Object[] EMPTY_ELEMENTDATA {};//用于默认大小空实例的共享空数组private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA {};//保存数据的数组tra…...
python实战应用讲解-【语法高级篇】时间与日期(附python示例代码)
目录 保持时间、计划任务和启动程序 time 模块 time.time() 函数 time.sleep() 函数 Python3 日期和时间...
D. Moscow Gorillas(双指针 + 区间分析)
Problem - D - Codeforces 在冬天,莫斯科动物园的居民非常无聊,尤其是大猩猩。你决定娱乐他们,带了一个长度为n的排列p到动物园。长度为n的排列是由n个从1到n的不同整数以任意顺序组成的数组。例如,[2,3,1,5,4]是一个排列…...
华为OD机试题,用 Java 解【相同数字的积木游戏 1】问题
最近更新的博客 华为OD机试题,用 Java 解【停车场车辆统计】问题华为OD机试题,用 Java 解【字符串变换最小字符串】问题华为OD机试题,用 Java 解【计算最大乘积】问题华为OD机试题,用 Java 解【DNA 序列】问题华为OD机试 - 组成最大数(Java) | 机试题算法思路 【2023】使…...
Python实现GWO智能灰狼优化算法优化BP神经网络分类模型(BP神经网络分类算法)项目实战
说明:这是一个机器学习实战项目(附带数据代码文档视频讲解),如需数据代码文档视频讲解可以直接到文章最后获取。1.项目背景灰狼优化算法(GWO),由澳大利亚格里菲斯大学学者 Mirjalili 等人于2014年提出来的一种群智能优…...
无线蓝牙耳机哪个牌子好?2023质量好的无线蓝牙耳机推荐
近几年,随着蓝牙技术的不断进步,使用蓝牙耳机的人也越来越多。蓝牙耳机的出现,不仅能让我们摆脱线带来的约束,还能提升我们学习和工作的效率。最近看到很多人问,无线蓝牙耳机哪个牌子好?下面,我…...
Qt之QTableView自定义排序/过滤(QSortFilterProxyModel实现,含源码+注释)
一、效果示例图 1.1 自定义表格排序示例图 本文过滤条件为行索引取余2等于0时返回true,且从下图中可以看到,奇偶行是各自挨在一起的。 1.2 自定义表格过滤示例图 下图添加两列条件(当前数据大于当前列条件才返回true,且多个列…...
电商(强一致性系统)的场景设计
领域拆分:如何合理地拆分系统? 一般来说,强一致性的系统都会牵扯到“锁争抢”等技术点,有较大的性能瓶颈,而电商时常做秒杀活动,这对系统的要求更高。业内在对电商系统做改造时,通常会从三个方面…...
算法与数据结构(一)
一、时间复杂度 一个操作如果和样本的数据量没有关系,每次都是固定时间内完成的操作,叫做常数操作。 时间复杂度为一个算法流程中,常数操作数量的一个指标。常用O(读作big O)来表示。具体来说,这个算法流程中,发生了多…...
【Python】元组如何创建?
嗨害大家好鸭!我是小熊猫~ Python 元组 Python 的元组与列表类似, 不同之处在于元组的元素不能修改。 元组使用小括号,列表使用方括号。 元组创建很简单,只需要在括号中添加元素, 并使用逗号隔开即可。 如下实例…...
qt操作文件以及字符串转换
//从文件加载英文属性与中文属性对照表QFile file(":/propertyname.txt");if (file.open(QFile::ReadOnly)) {//QTextStream方法读取速度至少快百分之30#if 0while(!file.atEnd()) {QString line file.readLine();appendName(line);}#elseQTextStream in(&file)…...
wordpress5.2.2下载/中国宣布取消新冠免费治疗
Java语言实现 Base64 加密 & 解密Base64是网络上最常见的用于传输8Bit字节码的编码方式之一,Base64就是一种基于64个可打印字符来表示二进制数据的方法。Base64编码是从二进制到字符的过程,可用于在HTTP环境下传递较长的标识信息。采用Base64编码具有…...
通州个人做网站/网站设计培训
收集表单数据 在上网注册各种应用的时候,都离不开账号的注册,账号注册的信息也就是填写表单的数据都会被收集整理起来。例如用户的账号名称、账号密码、姓名、年龄等。这就涉及到了如何收集表单数据的问题。 在表单中常出现的有如下几种标签 1.<inpu…...
建立个人博客网站/seo查询 站长工具
成为伟大,影响伟大 领袖不会培养追随者,领袖培养下一代领袖。 作为第三代互联网创业者,今天的领导者们肩负着这样的时代使命。 1.激励员工全力以赴 杰克韦尔奇说,管理是控制,领导是激励。 作为伟大的领导者&#…...
做电商不不得不知道的网站/合肥网站优化公司
ArrayList、List特点:查询快、增删慢 链表特点:查询慢,增删快 案例 package day29_collection集合体系;import java.util.ArrayList; import java.util.List;/** List:* 有序的(存储和读取的顺序是一致的)* 有整数…...
网站建设见站分析和准备论文/网络营销有什么特点
RemoteViews中的setxxx方法 比如setCharSequence(int viewId, String methodName, CharSequence value); views.setString(R.id.textview01, "setText", battery "%"); 其中views是RomoteViews的实例, 第一个参数就是ID了, 第二个参数,是一个方法名字,比如…...
深圳华企立方/英文网站seo
DOM概述 什么是DOM?DOM和JavaScriptDOM的数据类型DOM常用核心接口 什么是DOM? 1.文档对象模型 (DOM) 是HTML和XML文档的编程接口 。它提供了对文档的结构化的表述,并定义了一种方式可以使从程序中对该结构进行访问,从而改变文档…...