第13天-仓储服务(仓库管理,采购管理 ,SPU规格维护)

news/2024/4/25 23:00:38/文章来源:https://blog.csdn.net/zenggeweiss/article/details/129234531

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.采购流程

  1. 创建采购需求
  2. 创建采购单
  3. 为采购单分配采购人员
  4. 领取采购单
  5. 完成采购单
  6. 商品入库

采购流程图如下:
在这里插入图片描述



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);
}

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

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

相关文章

TOSCA自动化测试工具

TOSCA由德国公司Tricentis研发&#xff0c;提供英文和德语两种版本。 目前他们的网上培训课程大约是2000一套&#xff0c;从初级到高级&#xff0c;从工程师到BA&#xff0c;有技术&#xff0c;也有测试管理。 TOSCA的思想是&#xff0c;不用会编程的测试人员可以直接上手自动…

GitHub 下载超过 28W 次的 Java 面试题库来袭,面面俱到太全了

“金三银四”、“金九银十” 一直被称为是跳槽的旺季&#xff0c;最近也有不少小伙伴找我咨询一些面试相关的问题。刚好小编最近获得一份收费 Java 面试题库&#xff01; 这些面试题都是互联网大厂真实流出的面试内容&#xff0c;每个问题都附带完整详细的答案&#xff0c;不像…

值得关注!可控生成!近期diffusion图像生成进展!

猜您喜欢&#xff1a;深入浅出stable diffusion&#xff1a;AI作画技术背后的潜在扩散模型论文解读戳我&#xff0c;查看GAN的系列专辑~&#xff01;一顿午饭外卖&#xff0c;成为CV视觉的前沿弄潮儿&#xff01;最新最全100篇汇总&#xff01;生成扩散模型Diffusion ModelsECC…

2023 Java 分布式 面试 大纲

前段时间 &#xff0c;公司部门的HR找到我&#xff0c;说来了几份简历 &#xff0c;都是三年所有的开发 让我面一下&#xff0c; HR那边 一面核对了基本的信息 二面技术&#xff0c;是由我来接手&#xff0c;然后问了 一些分布式的问题 &#xff0c;大部分都是在围绕着SpringCl…

linux基本功系列之free命令实战

文章目录前言一. free命令介绍二. 语法格式及常用选项三. 参考案例3.1 查看free相关的信息3.2 以MB的形式显示内存的使用情况3.3 以总和的形式显示内存的使用情况3.4 周期性的查询内存的使用情况3.5 以更人性化的形式来查看内存的结果输出总结前言 大家好&#xff0c;又见面了…

【双U网络:传感器间自监督:全色锐化】

W-NetPan: Double-U network for inter-sensor self-supervised pan-sharpening &#xff08;W-NetPan&#xff1a;用于传感器间自监督全色锐化的双U网络&#xff09; 由于遥感数据的提供日益增多&#xff0c;可以通过全色锐化方法来处理空间-光谱限制。然而&#xff0c;融合…

【java基础】反射详解

文章目录基本介绍Class类Filed类Method类Constructor类获取Annotation信息Modify工具类实例运用(修改字符串值)总结基本介绍 反射库&#xff08;reflection library)提供了一个丰富且精巧的工具集&#xff0c;可以用来编写能够动态操纵Java代码的程序。使用反射&#xff0c;Ja…

linux-中断下半部

引用preempt宋宝华&#xff1a; 是谁关闭了Linux抢占&#xff0c;而抢占又关闭了谁&#xff1f;Linux用户抢占和内核抢占详解(概念, 实现和触发时机)--Linux进程的管理与调度(二十&#xff09;内核抢占实现(preempt)Linux中的preempt_count - 知乎 (zhihu.com)linux 中断子系统…

测试行业干了5年,从只会点点点到了现在的测试开发,总算是证明了自己

测试不止是点点点 我感觉我是一个比较有发言权的人吧&#xff0c;我在测试行业摸爬滚打5年&#xff0c;以前经常听到开发对我说&#xff0c;天天的点点点有意思没&#xff1f; 和IT圈外的同学、朋友聊起自己的工作&#xff0c;往往一说自己是测试&#xff0c;无形中也会被大家…

再度盈利,搜狐稳了?

2016年在宣布要用3年时间回归互联网舞台中心之后&#xff0c;很长一段时间内张朝阳积极活跃在各种社交媒体上&#xff0c;完全是一派“积极出山”的姿态。而后畅游从美股退市&#xff0c;搜狗“卖身”腾讯&#xff0c;一系列的收缩动作又似乎是在逐渐远离喧嚣。而在最近三年&am…

华为OD机试模拟题 用 C++ 实现 - 自动曝光(2023.Q1)

最近更新的博客 【华为OD机试模拟题】用 C++ 实现 - 最多获得的短信条数(2023.Q1)) 文章目录 最近更新的博客使用说明自动曝光题目输入输出描述示例一输入输出说明示例二输入输出说明Code使用说明 参加华为od机试,一定要注意不要完全背诵代码,需要理解之后模仿写出࿰

SRC挖掘之Access验证校验的漏洞挖掘

漏洞已修复&#xff0c;感觉某大佬的知识分享 任意用户密码重置->可获取全校师生个人min感信息 开局就是信息收集 对于挖掘edu的信息收集 1.可尝试谷歌搜索语法&#xff0c;获取学号信息 1. 旁站的渗透获取 2. 学校的贴吧获取(大部分都是本校学生) 当然我就是闲着蛋疼,进了…

让马斯克反悔的毫米波雷达,被国产雷达头部厂商木牛科技迭代到了5D时代

近日&#xff0c;特斯拉或将在其HW4.0硬件系统配置一枚高精度4D毫米波雷达的消息在外网刷屏。据分析&#xff0c;“纯视觉”信仰者马斯克之所以做出这样的决定&#xff0c;一方面是减配了雷达的特斯拉自动驾驶&#xff0c;表现不尽如人意&#xff1b;另一方面也跟毫米波雷达的技…

有趣的HTML实例(十四) 窗边风景动画(css+js)

不要憎恨你的敌人&#xff0c;那会影响你的判断力。 ——《教父》 目录 一、前言 二、往期作品回顾 三、作品介绍 四、本期代码介绍 五、效果显示 六、编码实现 index.html style.css script.js 七、获取源码 公众号获取源码 获取源码&#xff1f;私信&#xff1…

Javascript的API基本内容(四)

一、日期对象 获取时间戳的方法&#xff0c;分别为 getTime 和 Date.now 和 new Date() // 1. 实例化const date new Date()// 2. 获取时间戳console.log(date.getTime()) // 还有一种获取时间戳的方法console.log(new Date())// 还有一种获取时间戳的方法console.log(Date.n…

【微信小程序-原生开发+TDesign】通用功能页封装——地点搜索(含腾讯地图开发key 的申请方法)

效果预览 核心技能点 调用腾讯地图官方的关键字地点搜索功能&#xff0c;详见官方文档 https://lbs.qq.com/miniProgram/jsSdk/jsSdkGuide/methodGetsuggestion 完整代码实现 地点输入框 <t-input value"{{placeInfo.title}}" bindtap"searchPlace" dis…

硬件工程师——门控开关的设计

假设自己是一个工程师&#xff0c;那么我们怎么介绍自己呢&#xff1f; 我们首先需要可以自己独立设计项目&#xff0c;需要每一个工程师在开始阶段可以独立做项目&#xff0c;从而提高薪水 那么我们怎么提高做项目的能力呢&#xff1f; 通过项目来积累经验&#xff0c;在短…

推荐几个实用的在线教程(建议收藏)

hello&#xff0c;大家好&#xff0c;我是木荣君。作为一名技术人员&#xff0c;工作中熟练使用各种管理及设计工具是一项必备的技能。今天给大家分享一下我工作中经常查看和学习的几个在线教程地址。供大家参考学习&#xff0c;建议收藏&#xff0c;真的很实用&#xff01; Gi…

InnoDB数据页结构__盛放记录的大盒子

一、不同类型的页简介 前边我们简单提了一下页的概念&#xff0c;它是InnoDB管理存储空间的基本单位&#xff0c;一个页的大小一般是16KB。InnoDB为了不同的目的而设计了许多种不同类型的页&#xff0c;比如存放空间头部信息的页&#xff0c;存放Insert Buffer信息的页&#xf…

MySQL 横表和竖表相互转换

一 竖表转横表 1. 首先创建竖表 create table student ( id varchar(32) primary key, name varchar (50) not null, subject varchar(50) not null, result int); 2. 插入数据 insert into student (id, name, subject, result) values (0001, 小明, 语文, 83); insert into…