尚品汇第四章: 商品spu保存

文章目录

  • 尚品汇第四章: 商品spu保存
  • 一、spu相关业务介绍
    • 1.1 销售属性
    • 1.2 spu数据结构图
    • 2.2 创建接口ManageService
    • 2.3 创建实现类 ManageServiceImpl
    • 2.4 创建控制器SpuManageController
  • 三、品牌管理
    • 3.1 品牌列表
      • 3.1.1 创建mapper
      • 3.1.2 创建接口BaseTrademarkService
      • 3.1.3 创建实现类BaseTrademarkServiceImpl
      • 3.1.4 创建控制器 BaseTrademarkController
    • 3.2 分类品牌列表
      • 3.2.1 创建mapper
      • 3.2.2 创建接口
      • 3.2.3 创建实现类
      • 3.2.4 创建控制器
  • 四、spu的保存功能中的图片上传
    • 4.1 MinIo介绍
    • 4.2 应用场景
      • 4.2.1单主机单硬盘模式
      • 4.2.2单主机多硬盘模式
      • 4.2.3多主机多硬盘分布式
    • 4.3 特点
    • 4.4 存储机制
    • 4.5 docker安装Minio
    • 4.6 利用Java客户端调用Minio
      • 4.6.1 引入依赖
      • 4.6.2 添加配置文件
      • 4.6.3 创建FileUploadController控制器
  • 五、spu保存
    • 5.1 加载销售属性
      • 5.1.1 创建mapper
      • 5.1.2 在MangeService添加接口
      • 5.1.3 添加控制器SpuManageController
    • 5.2 加载品牌数据
    • 5.3 保存后台代码
      • 5.3.1 创建mapper
      • 5.3.2 添加数据接口
      • 5.3.3 添加控制器

一、spu相关业务介绍

1.1 销售属性

销售属性,就是商品详情页右边,可以通过销售属性来定位一组spu下的哪款sku。可以让当前的商品详情页,跳转到自己的“兄弟”商品。

一般每种商品的销售属性不会太多,大约1-4种。整个电商的销售属性种类也不会太多,大概10种以内。比如:颜色、尺寸、版本、套装等等。不同销售属性的组合也就构成了一个spu下多个sku的结构。

因此,在制作spu之前要先确定当前商品有哪些销售属性!

1.2 spu数据结构图


``

spu_info:spu信息表
spu_image: 图片表
spu_poster:海报表
spu_sale_attr :销售属性表
spu_sale_attr_value: 销售属性值表
base_category_trademark:分类品牌中间表
base_sale_attr:基本销售属性值
base_trademark:品牌中间表

spu_info:spu信息表


# 二、列表查询功能开发## 2.1 创建mapper```java
@Mapper
public interface SpuInfoMapper extends BaseMapper<SpuInfo> {}

2.2 创建接口ManageService

/*** spu分页查询* @param pageParam* @param spuInfo* @return*/
IPage<SpuInfo> getSpuInfoPage(Page<SpuInfo> pageParam, SpuInfo spuInfo);

2.3 创建实现类 ManageServiceImpl

@Autowired
private SpuInfoMapper spuInfoMapper;@Override
public IPage<SpuInfo> getSpuInfoPage(Page<SpuInfo> pageParam, SpuInfo spuInfo) {QueryWrapper<SpuInfo> queryWrapper = new QueryWrapper<>();queryWrapper.eq("category3_id", spuInfo.getCategory3Id());queryWrapper.orderByDesc("id");return spuInfoMapper.selectPage(pageParam, queryWrapper);
}

2.4 创建控制器SpuManageController

@RestController // @ResponseBody + @Controller
@RequestMapping("admin/product")
public class SpuManageController {@Autowiredprivate ManageService manageService;// 根据查询条件封装控制器// springMVC 的时候,有个叫对象属性传值 如果页面提交过来的参数与实体类的参数一致,// 则可以使用实体类来接收数据// http://api.gmall.com/admin/product/1/10?category3Id=61// @RequestBody 作用 将前台传递过来的json{"category3Id":"61"}  字符串变为java 对象。@GetMapping("{page}/{size}")public Result getSpuInfoPage(@PathVariable Long page,@PathVariable Long size,SpuInfo spuInfo){// 创建一个Page 对象Page<SpuInfo> spuInfoPage = new Page<>(page,size);// 获取数据IPage<SpuInfo> spuInfoPageList = manageService.getSpuInfoPage(spuInfoPage, spuInfo);// 将获取到的数据返回即可!return Result.ok(spuInfoPageList);}
}

三、品牌管理

3.1 品牌列表

3.1.1 创建mapper

@Mapper
public interface BaseTrademarkMapper extends BaseMapper<BaseTrademark> {}

3.1.2 创建接口BaseTrademarkService

public interface BaseTrademarkService  extends IService<BaseTrademark> {/*** Banner分页列表* @param pageParam* @return*/IPage<BaseTrademark> getPage(Page<BaseTrademark> pageParam);}

3.1.3 创建实现类BaseTrademarkServiceImpl

@Service
public class BaseTrademarkServiceImpl extends ServiceImpl<BaseTrademarkMapper, BaseTrademark> implements BaseTrademarkService {@Autowiredprivate BaseTrademarkMapper baseTrademarkMapper;@Overridepublic IPage<BaseTrademark> getPage(Page<BaseTrademark> pageParam) {QueryWrapper<BaseTrademark> queryWrapper = new QueryWrapper<>();queryWrapper.orderByAsc("id");IPage<BaseTrademark> page = baseTrademarkMapper.selectPage(pageParam, queryWrapper);return page;}
}

3.1.4 创建控制器 BaseTrademarkController

@RestController
@RequestMapping("/admin/product/baseTrademark")
public class BaseTrademarkController {@Autowiredprivate BaseTrademarkService baseTrademarkService;@ApiOperation(value = "分页列表")@GetMapping("{page}/{limit}")public Result index(@PathVariable Long page,@PathVariable Long limit) {Page<BaseTrademark> pageParam = new Page<>(page, limit);IPage<BaseTrademark> pageModel = baseTrademarkService.getPage(pageParam);return Result.ok(pageModel);}@ApiOperation(value = "获取BaseTrademark")@GetMapping("get/{id}")public Result get(@PathVariable String id) {BaseTrademark baseTrademark = baseTrademarkService.getById(id);return Result.ok(baseTrademark);}@ApiOperation(value = "新增BaseTrademark")@PostMapping("save")public Result save(@RequestBody BaseTrademark banner) {baseTrademarkService.save(banner);return Result.ok();}@ApiOperation(value = "修改BaseTrademark")@PutMapping("update")public Result updateById(@RequestBody BaseTrademark banner) {baseTrademarkService.updateById(banner);return Result.ok();}@ApiOperation(value = "删除BaseTrademark")@DeleteMapping("remove/{id}")public Result remove(@PathVariable Long id) {baseTrademarkService.removeById(id);return Result.ok();}}

3.2 分类品牌列表

3.2.1 创建mapper

@Mapper
public interface BaseCategoryTrademarkMapper extends BaseMapper<BaseCategoryTrademark> {}

3.2.2 创建接口

package com.atguigu.gmall.product.service;public interface BaseCategoryTrademarkService extends IService<BaseCategoryTrademark> {/*** 根据三级分类获取品牌* @param category3Id* @return*/List<BaseTrademark> findTrademarkList(Long category3Id);/*** 保存分类与品牌关联* @param categoryTrademarkVo*/void save(CategoryTrademarkVo categoryTrademarkVo);/*** 获取当前未被三级分类关联的所有品牌* @param category3Id* @return*/List<BaseTrademark> findCurrentTrademarkList(Long category3Id);/*** 删除关联* @param category3Id* @param trademarkId*/void remove(Long category3Id, Long trademarkId);
}

3.2.3 创建实现类

package com.atguigu.gmall.product.service.impl;@Service
public class BaseCategoryTrademarkServiceImpl extends ServiceImpl<BaseCategoryTrademarkMapper,BaseCategoryTrademark> implements BaseCategoryTrademarkService {//  调用mapper 层!@Autowiredprivate BaseTrademarkMapper baseTrademarkMapper;@Autowiredprivate BaseCategoryTrademarkMapper baseCategoryTrademarkMapper;@Overridepublic List<BaseTrademark> findTrademarkList(Long category3Id) {//  根据分类Id 获取到品牌Id 集合数据//  select * from base_category_trademark where category3_id = ?;QueryWrapper<BaseCategoryTrademark> baseCategoryTrademarkQueryWrapper = new QueryWrapper<>();baseCategoryTrademarkQueryWrapper.eq("category3_id",category3Id);List<BaseCategoryTrademark> baseCategoryTrademarkList = baseCategoryTrademarkMapper.selectList(baseCategoryTrademarkQueryWrapper);//  判断baseCategoryTrademarkList 这个集合if(!CollectionUtils.isEmpty(baseCategoryTrademarkList)){//  需要获取到这个集合中的品牌Id 集合数据List<Long> tradeMarkIdList = baseCategoryTrademarkList.stream().map(baseCategoryTrademark -> {return baseCategoryTrademark.getTrademarkId();}).collect(Collectors.toList());//  正常查询数据的话... 需要根据品牌Id 来获取集合数据!return baseTrademarkMapper.selectBatchIds(tradeMarkIdList);}//  如果集合为空,则默认返回空return null;}@Overridepublic void removeBaseCategoryTrademarkById(Long category3Id, Long trademarkId) {//  逻辑删除: 本质更新操作 is_deleted//  更新: update base_category_trademark set is_deleted = 1 where category3_id=? and trademark_id=?;QueryWrapper<BaseCategoryTrademark> baseCategoryTrademarkQueryWrapper = new QueryWrapper<>();baseCategoryTrademarkQueryWrapper.eq("category3_id",category3Id);baseCategoryTrademarkQueryWrapper.eq("trademark_id",trademarkId);baseCategoryTrademarkMapper.delete(baseCategoryTrademarkQueryWrapper);}@Overridepublic List<BaseTrademark> findCurrentTrademarkList(Long category3Id) {//  哪些是关联的品牌IdQueryWrapper<BaseCategoryTrademark> baseCategoryTrademarkQueryWrapper = new QueryWrapper<>();baseCategoryTrademarkQueryWrapper.eq("category3_id",category3Id);List<BaseCategoryTrademark> baseCategoryTrademarkList = baseCategoryTrademarkMapper.selectList(baseCategoryTrademarkQueryWrapper);//  判断if (!CollectionUtils.isEmpty(baseCategoryTrademarkList)){//  找到关联的品牌Id 集合数据 {1,3}List<Long> tradeMarkIdList = baseCategoryTrademarkList.stream().map(baseCategoryTrademark -> {return baseCategoryTrademark.getTrademarkId();}).collect(Collectors.toList());//  在所有的品牌Id 中将这些有关联的品牌Id 给过滤掉就可以!//  select * from base_trademark; 外面 baseTrademarkMapper.selectList(null) {1,2,3,5}List<BaseTrademark> baseTrademarkList = baseTrademarkMapper.selectList(null).stream().filter(baseTrademark -> {return !tradeMarkIdList.contains(baseTrademark.getId());}).collect(Collectors.toList());//  返回数据return baseTrademarkList;}//  如果说这个三级分类Id 下 没有任何品牌! 则获取到所有的品牌数据!return baseTrademarkMapper.selectList(null);}@Overridepublic void save(CategoryTrademarkVo categoryTrademarkVo) {/*private Long category3Id;private List<Long> trademarkIdList;category3Id 61 tmId 2;category3Id 61 tmId 5;*///  获取到品牌Id 集合数据List<Long> trademarkIdList = categoryTrademarkVo.getTrademarkIdList();//  判断if (!CollectionUtils.isEmpty(trademarkIdList)){//  做映射关系List<BaseCategoryTrademark> baseCategoryTrademarkList = trademarkIdList.stream().map((trademarkId) -> {//  创建一个分类Id 与品牌的关联的对象BaseCategoryTrademark baseCategoryTrademark = new BaseCategoryTrademark();baseCategoryTrademark.setCategory3Id(categoryTrademarkVo.getCategory3Id());baseCategoryTrademark.setTrademarkId(trademarkId);//  返回数据return baseCategoryTrademark;}).collect(Collectors.toList());//  集中保存到数据库    baseCategoryTrademarkListthis.saveBatch(baseCategoryTrademarkList);}}
}

3.2.4 创建控制器

package com.atguigu.gmall.product.controller;@RestController
@RequestMapping("admin/product/baseCategoryTrademark")
public class BaseCategoryTrademarkController {@Autowiredprivate BaseCategoryTrademarkService baseCategoryTrademarkService;@PostMapping("save")public Result save(@RequestBody CategoryTrademarkVo categoryTrademarkVo){//  保存方法baseCategoryTrademarkService.save(categoryTrademarkVo);return Result.ok();}@DeleteMapping("remove/{category3Id}/{trademarkId}")public Result remove(@PathVariable Long category3Id, @PathVariable Long trademarkId){//  调用服务层方法baseCategoryTrademarkService.remove(category3Id, trademarkId);return Result.ok();}@GetMapping("findTrademarkList/{category3Id}")public Result findTrademarkList(@PathVariable Long category3Id){//  select * from base_trademarkList<BaseTrademark> list = baseCategoryTrademarkService.findTrademarkList(category3Id);//  返回return Result.ok(list);}@GetMapping("findCurrentTrademarkList/{category3Id}")public Result findCurrentTrademarkList(@PathVariable Long category3Id){List<BaseTrademark> list = baseCategoryTrademarkService.findCurrentTrademarkList(category3Id);//  返回return Result.ok(list);}
}

四、spu的保存功能中的图片上传

4.1 MinIo介绍

MinIO 是一个基于Apache License v2.0开源协议的对象存储服务。它兼容亚马逊S3云存储服务接口,非常适合于存储大容量非结构化的数据,例如图片、视频、日志文件、备份数据和容器/虚拟机镜像等,而一个对象文件可以是任意大小,从几kb到最大5T不等。

MinIO是一个非常轻量的服务,可以很简单的和其他应用的结合,类似 NodeJS, Redis 或者 MySQL。

官方文档:http://docs.minio.org.cn/docs 旧一点

https://docs.min.io/ 新

4.2 应用场景

4.2.1单主机单硬盘模式

4.2.2单主机多硬盘模式

4.2.3多主机多硬盘分布式

4.3 特点

· 高性能:作为高性能对象存储,在标准硬件条件下它能达到55GB/s的读、35GB/s的写速率

· 可扩容:不同MinIO集群可以组成联邦,并形成一个全局的命名空间,并跨越多个数据中心

· 云原生:容器化、基于K8S的编排、多租户支持

· Amazon S3兼容:Minio使用Amazon S3 v2 / v4 API。可以使用Minio SDK,Minio Client,AWS SDK和AWS CLI访问Minio服务器。

· 可对接后端存储: 除了Minio自己的文件系统,还支持DAS、 JBODs、NAS、Google云存储和Azure Blob存储。

· SDK支持: 基于Minio轻量的特点,它得到类似Java、Python或Go等语言的sdk支持

· Lambda计算: Minio服务器通过其兼容AWS SNS / SQS的事件通知服务触发Lambda功能。支持的目标是消息队列,如Kafka,NATS,AMQP,MQTT,Webhooks以及Elasticsearch,Redis,Postgres和MySQL等数据库。

· 有操作页面

· 功能简单: 这一设计原则让MinIO不容易出错、更快启动

· 支持纠删码:MinIO使用纠删码、Checksum来防止硬件错误和静默数据污染。在最高冗余度配置下,即使丢失1/2的磁盘也能恢复数据!

4.4 存储机制

Minio使用纠删码erasure code和校验和checksum。 即便丢失一半数量(N/2)的硬盘,仍然可以恢复数据。

纠删码是一种恢复丢失和损坏数据的数学算法。

4.5 docker安装Minio

docker pull minio/minio
新版本:
docker run \-p 9000:9000 \-p 9001:9001 \--name minio \-d --restart=always \-e "MINIO_ROOT_USER=admin" \-e "MINIO_ROOT_PASSWORD=admin123456" \-v /home/data:/data \-v /home/config:/root/.minio \minio/minio server /data --console-address ":9001"

浏览器访问:http://IP:9000/minio/login,如图:

说明:安装是指定了登录账号

4.6 利用Java客户端调用Minio

参考文档:https://docs.min.io/docs/java-client-api-reference.html

4.6.1 引入依赖

在service-product模块中添加依赖

<dependency><groupId>io.minio</groupId><artifactId>minio</artifactId><version>8.2.0</version>
</dependency>

4.6.2 添加配置文件

在na配置好了!cos中

minio:endpointUrl: http://IP:9000accessKey: adminsecreKey: admin123456bucketName: gmall

4.6.3 创建FileUploadController控制器

package com.atguigu.gmall.product.controller;@RestController
@RequestMapping("admin/product")
public class FileUploadController {//  获取文件上传对应的地址@Value("${minio.endpointUrl}")public String endpointUrl;@Value("${minio.accessKey}")public String accessKey;@Value("${minio.secreKey}")public String secreKey;@Value("${minio.bucketName}")public String bucketName;//  文件上传控制器@PostMapping("fileUpload")public Result fileUpload(MultipartFile file) throws Exception{//  准备获取到上传的文件路径!String url = "";// 使用MinIO服务的URL,端口,Access key和Secret key创建一个MinioClient对象// MinioClient minioClient = new MinioClient("https://play.min.io", "Q3AM3UQ867SPQQA43P2F", "zuf+tfteSlswRu7BJ86wekitnifILbZam1KYY3TG");MinioClient minioClient =MinioClient.builder().endpoint(endpointUrl).credentials(accessKey, secreKey).build();// 检查存储桶是否已经存在boolean isExist = minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build());if(isExist) {System.out.println("Bucket already exists.");} else {// 创建一个名为asiatrip的存储桶,用于存储照片的zip文件。minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucketName).build());}//  定义一个文件的名称 : 文件上传的时候,名称不能重复!String fileName = System.currentTimeMillis()+ UUID.randomUUID().toString();// 使用putObject上传一个文件到存储桶中。//  minioClient.putObject("asiatrip","asiaphotos.zip", "/home/user/Photos/asiaphotos.zip");minioClient.putObject(PutObjectArgs.builder().bucket(bucketName).object(fileName).stream(file.getInputStream(), file.getSize(), -1).contentType(file.getContentType()).build());//  System.out.println("/home/user/Photos/asiaphotos.zip is successfully uploaded as asiaphotos.zip to `asiatrip` bucket.");//  文件上传之后的路径: http://39.99.159.121:9000/gmall/xxxxxxurl = endpointUrl+"/"+bucketName+"/"+fileName;System.out.println("url:\t"+url);//  将文件上传之后的路径返回给页面!return Result.ok(url);}
}
注意:文件上传时,需要调整一下linux 服务器的时间与windows 时间一致!
第一步:安装ntp服务
yum -y install ntp第二步:开启开机启动服务
systemctl enable ntpd第三步:启动服务
systemctl start ntpd第四步:更改时区
timedatectl set-timezone Asia/Shanghai第五步:启用ntp同步
timedatectl set-ntp yes第六步:同步时间
ntpq -p

五、spu保存

5.1 加载销售属性

5.1.1 创建mapper

@Mapper
public interface BaseSaleAttrMapper extends BaseMapper<BaseSaleAttr> {}

5.1.2 在MangeService添加接口

接口
/*** 查询所有的销售属性数据* @return*/
List<BaseSaleAttr> getBaseSaleAttrList();
实现类
@Autowired
private BaseSaleAttrMapper baseSaleAttrMapper;@Override
public List<BaseSaleAttr> getBaseSaleAttrList() {return baseSaleAttrMapper.selectList(null);
}

5.1.3 添加控制器SpuManageController

@RestController
@RequestMapping("admin/product")
public class SpuManageController {// 引入服务层@Autowiredprivate ManageService manageService;// 销售属性http://api.gmall.com/admin/product/baseSaleAttrList@GetMapping("baseSaleAttrList")public Result baseSaleAttrList(){// 查询所有的销售属性集合List<BaseSaleAttr>  baseSaleAttrList = manageService.getBaseSaleAttrList();return Result.ok(baseSaleAttrList);}
}

5.2 加载品牌数据

BaseCategoryTrademarkController
/*** 查询全部品牌* @return*/
@GetMapping("findTrademarkList/{category3Id}")
public Result findTrademarkList(@PathVariable Long category3Id){//  调用服务层方法List<BaseTrademark> baseCategoryTrademarkList = baseCategoryTrademarkService.findTrademarkList(category3Id);//  返回数据return Result.ok(baseCategoryTrademarkList);
}

5.3 保存后台代码

5.3.1 创建mapper

建立对应的mapper 文件

@Mapper
public interface SpuImageMapper extends BaseMapper<SpuImage> {}
@Mapper
public interface SpuSaleAttrMapper extends BaseMapper<SpuSaleAttr> {}
@Mapper
public interface SpuSaleAttrValueMapper extends BaseMapper<SpuSaleAttrValue> {}
@Mapper
public interface SpuPosterMapper extends BaseMapper<SpuPoster> {}

5.3.2 添加数据接口

/*** 保存商品数据* @param spuInfo*/
void saveSpuInfo(SpuInfo spuInfo);
@Override
@Transactional(rollbackFor = Exception.class)
public void saveSpuInfo(SpuInfo spuInfo) {/*spuInfo;spuImage;spuSaleAttr;spuSaleAttrValue;spuPoster*/spuInfoMapper.insert(spuInfo);
//  获取到spuImage 集合数据List<SpuImage> spuImageList = spuInfo.getSpuImageList();//  判断不为空if (!CollectionUtils.isEmpty(spuImageList)){//  循环遍历for (SpuImage spuImage : spuImageList) {//  需要将spuId 赋值spuImage.setSpuId(spuInfo.getId());//  保存spuImgespuImageMapper.insert(spuImage);}}//  获取销售属性集合List<SpuSaleAttr> spuSaleAttrList = spuInfo.getSpuSaleAttrList();//  判断if (!CollectionUtils.isEmpty(spuSaleAttrList)){//  循环遍历for (SpuSaleAttr spuSaleAttr : spuSaleAttrList) {//  需要将spuId 赋值spuSaleAttr.setSpuId(spuInfo.getId());spuSaleAttrMapper.insert(spuSaleAttr);//  再此获取销售属性值集合List<SpuSaleAttrValue> spuSaleAttrValueList = spuSaleAttr.getSpuSaleAttrValueList();//  判断if (!CollectionUtils.isEmpty(spuSaleAttrValueList)){//  循环遍历for (SpuSaleAttrValue spuSaleAttrValue : spuSaleAttrValueList) {//   需要将spuId, sale_attr_name 赋值spuSaleAttrValue.setSpuId(spuInfo.getId());spuSaleAttrValue.setSaleAttrName(spuSaleAttr.getSaleAttrName());spuSaleAttrValueMapper.insert(spuSaleAttrValue);}}}}//  获取到posterList 集合数据List<SpuPoster> spuPosterList = spuInfo.getSpuPosterList();//  判断不为空if (!CollectionUtils.isEmpty(spuPosterList)){for (SpuPoster spuPoster : spuPosterList) {//  需要将spuId 赋值spuPoster.setSpuId(spuInfo.getId());//  保存spuPosterspuPosterMapper.insert(spuPoster);}}
}

5.3.3 添加控制器

/*** 保存spu* @param spuInfo* @return*/
@PostMapping("saveSpuInfo")
public Result saveSpuInfo(@RequestBody SpuInfo spuInfo){// 调用服务层的保存方法manageService.saveSpuInfo(spuInfo);return Result.ok();
}
    spuSaleAttrValueMapper.insert(spuSaleAttrValue);}}}
}//  获取到posterList 集合数据
List<SpuPoster> spuPosterList = spuInfo.getSpuPosterList();
//  判断不为空
if (!CollectionUtils.isEmpty(spuPosterList)){for (SpuPoster spuPoster : spuPosterList) {//  需要将spuId 赋值spuPoster.setSpuId(spuInfo.getId());//  保存spuPosterspuPosterMapper.insert(spuPoster);}
}

}


### 5.3.3 添加控制器 ```java
/*** 保存spu* @param spuInfo* @return*/
@PostMapping("saveSpuInfo")
public Result saveSpuInfo(@RequestBody SpuInfo spuInfo){// 调用服务层的保存方法manageService.saveSpuInfo(spuInfo);return Result.ok();
}

尚品汇_第4章_ 商品spu保存相关推荐

  1. 尚品汇_第3章_平台属性管理

    尚品汇_第3章__平台属性管理 文章目录 尚品汇_第3章__平台属性管理 一.商品的基本知识 1.1 基本信息-分类 1.2 基本信息-平台属性 1.3 基本信息-销售属性与销售属性值 1.4 基本信 ...

  2. 尚硅谷尚品汇_后台管理项目

    vueProject_尚品汇后台管理 项目源码 文章目录 vueProject_尚品汇后台管理 login/out模块 product模块 login/out模块 .env.development . ...

  3. 尚医通_第12章_用户平台首页数据

    尚医通_第12章_用户平台首页数据 文章目录 尚医通_第12章_用户平台首页数据 第一节.首页静态数据整合 一.首页静态数据整合 1.添加静态资源 2.修改页面布局 第二节.首页数据显示功能 一.首页 ...

  4. vue实战项目-电商商城前台-(学习尚硅谷的)尚品汇

    文章目录 最好使用视频上的账号密码,13700000000 密:111111 最新服务端接口地址:http://gmall-h5-api.atguigu.cn 脚手架使用 1.创建项目 2.脚手架默认 ...

  5. 电商项目尚品汇学习笔记

    本文参考其他文章自己整理补充的,要阅读原文请查看:尚品汇项目笔记_爱哭的毛毛虫的博客-CSDN博客_尚品汇项目 1.vue文件目录 public文件夹:静态资源,webpack进行打包的时候会原封不动 ...

  6. 尚品汇项目笔记(持续更新中)

    项目网络教学视频链接:尚硅谷VUE项目实战,前端项目-尚品汇(大型\重磅)_哔哩哔哩_bilibili 目录 一. 使用vue-cli脚手架去初始化项目 二.项目的其他配置 三.项目路由分析 四.创建 ...

  7. 尚硅谷VUE项目实战,前端项目-尚品汇

    001-尚硅谷-尚品汇-教程简介_哔哩哔哩_bilibili 需要的知识点   搭建vue-router pages文件夹放置路由页面 router文件夹配置路由 回到入口文件注册(main.js) ...

  8. 探花交友_第2章_环境搭建(新版)

    探花交友_第2章_环境搭建(新版) 文章目录 探花交友_第2章_环境搭建(新版) 课程介绍 <探花交友> 1.项目介绍 1.1.项目背景 1.2.市场分析 1.3.目标用户群体 1.4.使 ...

  9. vue尚品汇商城项目-day07【vue插件-49.(了解)自定义插件】

    文章目录 49.(了解)自定义插件 本人其他相关文章链接 49.(了解)自定义插件 自定义插件好处: 功能:用于增强Vue 本质:包含install方法的一个对象,install的第一个参数是Vue, ...

最新文章

  1. MFC连接MySQL C API方法
  2. C# 中的 null 包容运算符 “!” —— 概念、由来、用法和注意事项
  3. javaone_JavaOne 2012:观察与印象
  4. C语言入坑指南-数组之谜
  5. Workbench has not been created yet
  6. Unity Application Block 3月12 发布的版本
  7. 平衡二叉树【学习笔记】
  8. python中的模块调用_Python中模块互相调用的例子
  9. java中的装饰模式讲解,java 中设计模式(装饰设计模式)的实例详解
  10. Ros简单程序编写及使用类Hello World
  11. STM-1和SDH的关系
  12. springboot修改默认端口号,启动端口号
  13. matlab线性数据毛刺剔除,matlab滤波技术及区域处理---线性滤波
  14. Thinkpad连续响4遍4个短嘀故障记录
  15. html文件打开自动跳转至空白
  16. Flutter系列之Navigator组件使用
  17. 微软媒体服务器,Azure 媒体服务概述
  18. 微信小程序 - “本地资源图片无法通过WXSS 获取,可以使用网络图片,或者 base64,或者使用标签” 解决
  19. OSChina 周一乱弹 ——这个公主都没一旁的汪可爱
  20. HourGlass源码阅读

热门文章

  1. centos7双机搭建_CentOS 7 配置 Keepalived 实现双机热备
  2. 活动运营策划主要包含哪些工作内容以及如何科学完成一场活动?
  3. 【软件推荐】压缩软件——7-Zip
  4. 啃下这三块最难啃的硬骨头,你将在嵌入式C语言中大放异彩
  5. monkey稳定性测试
  6. 苏州大学linux课程实验报告,苏州大学实验报告-定时溢出中断实验报告
  7. SpringCloud服务治理Eureka(理论)
  8. Unity URP渲染管线下体积光的实现
  9. 【转】抽象语法树简介(AST)
  10. PHP模块一览及简要说明