完成商品SPU管理页面

文章目录

    • 1.引入前端界面
        • 1.将前端界面放到commodity下
        • 2.创建菜单
        • 3.进入前端项目,使用npm添加依赖
          • 1.根目录下输入
          • 2.报错 chromedriver@2.27.2的问题
          • 3.点击链接下载压缩包,然后使用下面的命令安装
          • 4.再次安装 pubsub-js 成功
          • 5.在main.js中引入这个组件
        • 4.修改两个vue文件的路径为环境变量 + 资源路径的形式
          • 1.spu.vue
          • 2.spuinfo.vue
        • 5.启动vue项目
          • 1.报错,依赖有问题
          • 2.执行 npm i 即可,如果还有问题,有针对的解决
          • 3.此时可以访问SPU管理页面
        • 6.遇到依赖问题,进行彻底清理的做法(根目录下执行命令)
          • 1.**清除 npm 缓存**
          • 2.**删除 `node_modules` 文件夹**
          • 3.**删除 `package-lock.json` 文件**
          • 4.**运行 `npm install`**
    • 2.SPU信息分页查询
        • 1.前端 spuinfo.vue
          • 1.修改一下分页信息,然后查看页面,发现基本分页已经完成
          • 2.点击分类发现品牌没有显示出来
          • 3.查看请求,发现是404,中间少了一个/,加上就好了
          • 2.分析前端请求
            • 1.点击查询,调用searchSpuInfo方法
            • 2.这个方法会向后端发送dataForm的数据
            • 3.全局搜索一下dataForm,可以看到有四个信息
            • 4.打印一下会传递什么信息
            • 5.分析得出传入后端的搜索条件
        • 2.后端 sunliving-commodity模块
          • 1.SpuInfoService.java 新增方法根据条件查询分页列表
          • 2.SpuInfoServiceImpl.java 实现方法
          • 3.SpuInfoController.java 调用方法
        • 3.前后端联调
          • 1.查询性价比手机的分类
          • 2.查询二手手机分类
          • 3.性价比手机的小米品牌
          • 4.新建状态
          • 5.id为2或者名称为2的模糊查询
    • 3.SPU上架和下架
        • 1.前端 spuinfo.vue
          • 1.使用插槽机制获取当前行的publishStatus,根据这个值来决定上架还是下架
          • 2.上架函数 productUp
          • 3.下架函数 productDown
        • 2.后端 sunliving-commodity模块
          • 1. SpuInfoService.java 新增上架和下架的方法
          • 2.SpuInfoServiceImpl.java 实现方法
          • 3.SpuInfoController.java 编写接口
        • 3.前后端联调
          • 1.上架
          • 2.下架

1.引入前端界面

1.将前端界面放到commodity下

image-20240425102701357

2.创建菜单

image-20240425102456260

3.进入前端项目,使用npm添加依赖
1.根目录下输入
npm install --save pubsub-js
2.报错 chromedriver@2.27.2的问题

image-20240425111335785

3.点击链接下载压缩包,然后使用下面的命令安装
npm install chromedriver --chromedriver_filepath=压缩包路径\chromedriver_win32.zip
4.再次安装 pubsub-js 成功

image-20240425112344526

5.在main.js中引入这个组件

image-20240425112724067

4.修改两个vue文件的路径为环境变量 + 资源路径的形式
1.spu.vue

image-20240425112520767

image-20240425112510036

2.spuinfo.vue

image-20240425113111081

image-20240425113122509

image-20240425113130283

5.启动vue项目
1.报错,依赖有问题

image-20240425113354374

2.执行 npm i 即可,如果还有问题,有针对的解决
3.此时可以访问SPU管理页面

image-20240425114306367

6.遇到依赖问题,进行彻底清理的做法(根目录下执行命令)
1.清除 npm 缓存
npm cache clean --force
2.删除 node_modules 文件夹
rm -rf node_modules
3.删除 package-lock.json 文件
rm package-lock.json
4.运行 npm install
npm install

2.SPU信息分页查询

1.前端 spuinfo.vue
1.修改一下分页信息,然后查看页面,发现基本分页已经完成

image-20240425114824634

image-20240425114838475

image-20240425114906967

2.点击分类发现品牌没有显示出来

image-20240425115244934

3.查看请求,发现是404,中间少了一个/,加上就好了

image-20240425115503685

image-20240425115540002

image-20240425115600822

2.分析前端请求
1.点击查询,调用searchSpuInfo方法

image-20240425132739528

2.这个方法会向后端发送dataForm的数据

image-20240425132858783

3.全局搜索一下dataForm,可以看到有四个信息

image-20240425133532792

4.打印一下会传递什么信息

image-20240425133629153

image-20240425133645058

5.分析得出传入后端的搜索条件
  • 品牌id
  • 分类id
  • 检索的key:要求检索时根据id精准查询或者根据名称模糊查询
  • 上架状态:0:新建,1:上架,2:下架
2.后端 sunliving-commodity模块
1.SpuInfoService.java 新增方法根据条件查询分页列表
    /*** 根据条件查询分页列表* @param params* @return*/PageUtils queryPageByCondition(Map<String, Object> params);
2.SpuInfoServiceImpl.java 实现方法
    @Overridepublic PageUtils queryPageByCondition(Map<String, Object> params) {QueryWrapper<SpuInfoEntity> wrapper = new QueryWrapper<>();// 按检索条件-spu 名字String key = (String) params.get("key");if (!StringUtils.isEmpty(key)) {wrapper.and((w) -> { // 注意这里的 and 会把后面两个条件括起来w.eq("id", key).or().like("spu_name", key);});}// 加入状态String status = (String) params.get("status");if (!StringUtils.isEmpty(status)) {wrapper.eq("publish_status", status);}// 加入品牌 idString brandId = (String) params.get("brandId");if (!StringUtils.isEmpty(brandId) && !"0".equalsIgnoreCase(brandId)) {wrapper.eq("brand_id", brandId);}// 加入分类 idString catelogId = (String) params.get("catelogId");if (!StringUtils.isEmpty(catelogId) && !"0".equalsIgnoreCase(catelogId)) {wrapper.eq("catalog_id", catelogId);}// 分页查询IPage<SpuInfoEntity> page = this.page(new Query<SpuInfoEntity>().getPage(params), wrapper);return new PageUtils(page);}
3.SpuInfoController.java 调用方法
    /*** 列表*/@RequestMapping("/list")// @RequiresPermissions("commodity:spuinfo:list")public R list(@RequestParam Map<String, Object> params) {PageUtils page = spuInfoService.queryPageByCondition(params);return R.ok().put("page", page);}
3.前后端联调
1.查询性价比手机的分类

image-20240425153526797

image-20240425153547126

2.查询二手手机分类

image-20240425153607755

3.性价比手机的小米品牌

image-20240425153701729

4.新建状态

image-20240425153730085

5.id为2或者名称为2的模糊查询

image-20240425153835599

3.SPU上架和下架

1.前端 spuinfo.vue
1.使用插槽机制获取当前行的publishStatus,根据这个值来决定上架还是下架

image-20240425154306200

2.上架函数 productUp

image-20240425154516240

3.下架函数 productDown

image-20240425154607860

2.后端 sunliving-commodity模块
1. SpuInfoService.java 新增上架和下架的方法
    /*** 商品上架* @param spuId*/void productUp(Long spuId);/*** 商品下架* @param spuId*/void productDown(Long spuId);
2.SpuInfoServiceImpl.java 实现方法
    @Overridepublic void productUp(Long spuId) {// 根据id修改publish_status为1SpuInfoEntity spuInfoEntity = new SpuInfoEntity();spuInfoEntity.setId(spuId);spuInfoEntity.setPublishStatus(1);// ,更新update_timespuInfoEntity.setUpdateTime(new Date());this.updateById(spuInfoEntity);}@Overridepublic void productDown(Long spuId) {// 根据id修改publish_status为2SpuInfoEntity spuInfoEntity = new SpuInfoEntity();spuInfoEntity.setId(spuId);spuInfoEntity.setPublishStatus(2);spuInfoEntity.setUpdateTime(new Date());this.updateById(spuInfoEntity);}
3.SpuInfoController.java 编写接口
    /*** 商品上架* @param spuId* @return*/@RequestMapping("{id}/up")public R productUp(@PathVariable("id") Long spuId) {spuInfoService.productUp(spuId);return R.ok();}/*** 商品下架* @param spuId* @return*/@RequestMapping("{id}/down")public R productDown(@PathVariable("id") Long spuId) {spuInfoService.productDown(spuId);return R.ok();}
3.前后端联调
1.上架

image-20240425160653493

2.下架

image-20240425160710564

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

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

相关文章

【超详细】固态硬盘新盘验货检测教程

观前声明&#xff1a; 本文使用的固态硬盘为作者自费购买&#xff0c;同时也带有作者一定的主观意见&#xff0c;无任何软件和硬件的推广。 作者本人也正处于学习阶段&#xff0c;本文若有错误或有待改进的地方&#xff0c;欢迎评论区友善讨论~ 一、产品外包装信息检查 PS&…

Golang | Leetcode Golang题解之第109题有序链表转换二叉搜索树

题目&#xff1a; 题解&#xff1a; var globalHead *ListNodefunc sortedListToBST(head *ListNode) *TreeNode {globalHead headlength : getLength(head)return buildTree(0, length - 1) }func getLength(head *ListNode) int {ret : 0for ; head ! nil; head head.Next…

Java_多线程

有了多线程&#xff0c;我们就可以让程序同时做多件事情 作用&#xff1a; 提高效率 应用场景&#xff1a; 只要想让多个事情同时运行就需要用到多线程 比如&#xff1a;软件中的耗时操作、所有的聊天软件、所有的服务器... 并发和并行 并发&#xff1a;在同一时刻&#xff0…

AI是否可统计人类理性和感性的非线性?

一、背景 从控制理论的角度来看&#xff0c;“人类理性和感性的非线性”可以类比为动态系统中非线性元件的行为特性。在控制理论中&#xff0c;非线性意味着系统的输出不再严格与其输入成比例&#xff0c;也就是说&#xff0c;同样的输入条件下可能会导致不同的结果&#xff0…

为什么defineComponent组件名字和文件名字不能一样

今天在开发新组件时&#xff0c;在使用defineComponent定义组件时&#xff0c;把name写成了文件名的首字母大写法导致项目一直报错。找了很久才知道是名字的问题。 defineComponent组件名字和文件名字不能一样 在某些情况下&#xff0c;将组件的名称与文件名相同可能会导致一些…

当面试官问出“Unsafe”类时,我就知道这场面试废了,祖坟都能给你问出来!

一、写在开头 依稀记得多年以前的一场面试中&#xff0c;面试官从Java并发编程问到了锁&#xff0c;从锁问到了原子性&#xff0c;从原子性问到了Atomic类库&#xff08;对着JUC包进行了刨根问底&#xff09;&#xff0c;从Atomic问到了CAS算法&#xff0c;紧接着又有追问到了…

【c语言】函数递归

在C语言中&#xff0c;函数递归是一种函数调用自身的技术。递归函数通常用于解决可以分解为更小、类似子问题的问题。递归函数有两个基本部分&#xff1a; 基本情况&#xff08;Base Case&#xff09;&#xff1a;这是递归的终止条件&#xff0c;即函数停止递归并返回值的条件…

Mysql with 用法

什么是 with 语句 WITH 子句是 MySQL 中的一种 SQL 结构&#xff0c;又称为 Common Table Expression (CTE)。它在不影响原有 SQL 语句的情况下&#xff0c;允许开发人员临时创建一个内存中的结果集&#xff0c;然后对其进行操作。 with 语句用法 语法格式 WITH cte_name (…

JVM-调优之-高cpu线程问题排查

这里主要是对jstack命令的使用&#xff1b; 程序在运行过程中卡主&#xff0c;前端无法访问&#xff0c;一看服务器CPU占用达到200到300%多。 排查思路 1&#xff09;找出占用高的进程 2&#xff09;找出占用高的线程 3&#xff09;找出具体的代码 分析步骤&#xff1a; …

C++里的vector详细讲解

在C的标准模板库&#xff08;STL&#xff09;中&#xff0c;vector是一个非常有用的动态数组容器。它允许我们存储可变大小的同类型元素序列&#xff0c;并且能够动态地增长和缩小。由于其灵活性和易用性&#xff0c;vector在C编程中得到了广泛的应用。 一、vector的基本操作 …

Java异常处理:最佳实践与常见模式

在Java编程中&#xff0c;异常处理是保证程序健壁性和稳定性的重要方面。良好的异常处理不仅可以帮助程序在面对错误情况时恢复到正常状态&#xff0c;还可以提供错误诊断的信息&#xff0c;辅助开发者快速定位问题。本文将探讨Java中的异常处理机制&#xff0c;包括异常的分类…

esp32 Micropython 长按按键动作一次代码

1. 长按按键&#xff0c;松手后动作 from machine import Pin import timeEnter_key Pin(15, Pin.IN, Pin.PULL_UP) Enter_key_flag 0 Enter_key_flag_temp 0while True:if Enter_key.value() 0:time.sleep_ms(10)while Enter_key.value() 0:Enter_key_flag_temp not En…

System.Collections.Generic 中的接口和类型区分

System.Collections.Generic 命名空间包含了许多与泛型集合相关的接口和类。这些接口定义了一组通用的集合行为&#xff0c;而具体的实现&#xff08;如 List、Dictionary<TKey, TValue> 等&#xff09;则遵循这些接口&#xff0c;从而提供具体的集合功能。以下是 System…

前后端开发入门全攻略:零基础学起

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、前后端开发概览 二、后端开发基础&#xff1a;Flask框架入门 代码案例&#xff1a;Hel…

vue3之使用图片实现类似于 el-radio 的单选框功能,并且可实现选中和取消选中

背景 我们在工作中常用的一般都是使用类似于 element-plus 中的 el-radio 或者是 el-checkbox 来实现单选或者多选 若有一天我们遇到了一个新的业务需求,需要使用 图片 来实现类似于 el-radio 的功能,并且要求实现第一次点击时处于选中状态,当我们再次点击时处于非选中状态…

谈恋爱没经验?那就来刷谈恋爱经验宝宝吧

❤️作者主页&#xff1a;小虚竹 ❤️作者简介&#xff1a;大家好,我是小虚竹。2022年度博客之星评选TOP 10&#x1f3c6;&#xff0c;Java领域优质创作者&#x1f3c6;&#xff0c;CSDN博客专家&#x1f3c6;&#xff0c;华为云享专家&#x1f3c6;&#xff0c;掘金年度人气作…

自动驾驶---Tesla的自动驾驶技术进化史(PerceptionPlanning)

1 前言 笔者在专栏《自动驾驶Planning模块》中已经详细讲解了传统自动驾驶Planning模块的内容&#xff1a;包括行车的Behavior Planning和Motion Planning&#xff0c;以及低速记忆泊车的Planning&#xff08;最开始有15篇&#xff0c;目前逐渐更新到17篇&#xff09;。读者对整…

【Spring】SSM介绍_SSM整合

1、SSM介绍 1.1简介 SSM&#xff08;Spring SpringMVC MyBatis&#xff09;整合是一种流行的Java Web应用程序框架组合&#xff0c;它将Spring框架的核心特性、SpringMVC作为Web层框架和MyBatis作为数据访问层框架结合在一起。这种整合方式提供了从数据访问到业务逻辑处理再…

5.18 TCP机械臂模拟

#include <netinet/tcp.h>//包含TCP选项的头文件 #include <arpa/inet.h> #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <linux/input.h>//读取输入事件 #include <sys/types.h> #include <sys/stat.h&…

对于mybatis和mybatisplus的选择

对于mybatis和mybatisplus的选择 1. 问题2. MP单表操作2.1 单表普通查询2.2 单表分页查询 3. mybatis多表操作3.1 多表普通查询3.2 多表分页查询 1. 问题 mybatis 和 mybatisplus作为当下主流的持久层框架&#xff0c;各有优劣势。依据个人经验&#xff1a;mybatis可以定制化输…