当前位置: 首页 > news >正文

完成商品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

相关文章:

完成商品SPU管理页面

文章目录 1.引入前端界面1.将前端界面放到commodity下2.创建菜单3.进入前端项目&#xff0c;使用npm添加依赖1.根目录下输入2.报错 chromedriver2.27.2的问题3.点击链接下载压缩包&#xff0c;然后使用下面的命令安装4.再次安装 pubsub-js 成功5.在main.js中引入这个组件 4.修改…...

Ansible实战YAML语言完成apache的部署,配置,启动全过程

&#x1f3e1;作者主页&#xff1a;点击&#xff01; &#x1f3dd;️Ansible专栏&#xff1a;点击&#xff01; ⏰️创作时间&#xff1a;2024年5月24日15点59分 目录 &#x1f4af;趣站推荐&#x1f4af; &#x1f38a;前言 ✨️YAML语言回顾 &#x1f386;1.编写YAML文…...

深入探索微软Edge:新一代浏览器的演进与创新

在数字时代的浪潮中&#xff0c;浏览器已不再只是简单的网页访问工具&#xff0c;而是成为了连接信息、服务与用户之间的重要桥梁。微软Edge作为微软公司推出的一款全新的浏览器&#xff0c;不仅承载着微软在互联网领域的最新愿景&#xff0c;还融合了多项前沿技术&#xff0c;…...

k8s使用Volcano调度gpu

k8s部署 https://www.yangxingzhen.com/9817.html cri-dockerd安装 https://zhuanlan.zhihu.com/p/632861515 安装nvidia-container-runtime https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/latest/install-guide.html 安装k8s-device-plugin https://…...

x的平方根-力扣

本题想到使用二分法不断逼近一个区间&#xff0c;直到最后趋近于x&#xff0c;从而求得解。注意的点&#xff0c;一开始使用 if(mid * mid < x) 进行判断时&#xff0c;会出现越界&#xff0c;原因是输入一个很大的数是&#xff0c;超过int表示的范围&#xff0c;继而修改为…...

hot100 -- 回溯(上)

目录 &#x1f35e;科普 &#x1f33c;全排列 AC DFS &#x1f6a9;子集 AC DFS &#x1f382;电话号码的字母组合 AC DFS &#x1f33c;组合总和 AC DFS &#x1f35e;科普 忘记 dfs 的&#xff0c;先看看这个&#x1f447; DFS&#xff08;深度优先搜索&#xf…...

5.24数据库作业

考虑如下关系模式R(A,B.C.D,E,F)上的函数依赖集F: {A→BCD&#xff0c;BC→DE&#xff0c;B→D&#xff0c;D→A} 1、计算B的闭包。 2、(使用Armstrong公理)证明AF是超码。 3、计算上述函数依赖集F的正则覆盖&#xff1b;给出你的推导的步骤并解释。 4、基于正则覆盖&#xff0…...

go-zero 实战(5)

引入Prometheus 用 Prometheus 监控应用 1. 用 docker 启动 Prometheus 编辑配置位置&#xff0c;我将 prometheus.yaml 和 targets.json 文件放在了 /opt/prometheus/conf目录下 prometheus.yaml global:scrape_interval: 15s # 抓取间隔evaluation_interval: 15s # 评估…...

Python异常处理:打造你的代码防弹衣!

Hi&#xff0c;我是阿佑&#xff0c;上文咱们讲到——揭秘Python的魔法&#xff1a;装饰器的超能力大揭秘 ‍♂️✨&#xff0c;阿佑将带领大家通过精准捕获异常、使用with语句和上下文管理器、以及异常链等高级技巧来增强代码的健壮性。就像为代码穿上防弹衣&#xff0c;保护它…...

Linux——进程与线程

进程与线程 前言一、Linux线程概念线程的优点线程的缺点线程异常线程用途 二、Linux进程VS线程进程和线程 三、Linux线程控制创建线程线程ID及进程地址空间布局线程终止线程等待分离线程 四、习题巩固请简述什么是LWP请简述LWP与pthread_create创建的线程之间的关系简述轻量级进…...

ping 探测网段哪些地址被用

#!/bin/bash# 遍历192.168.3.1到192.168.3.254 for i in {1..254} doip"192.168.3.$i"# 对每个IP地址进行三次ping操作if ping -c 3 -W 1 $ip > /dev/null 2>&1thenecho "$ip: yes"fi done$ sh test.sh 192.168.3.1: yes 192.168.3.95: yes 192.…...

OSPF问题

.ospf 选路 域内 --- 1类&#xff0c;2类LSA 域间 --- 3类LSA 域外 --- 5类&#xff0c;7类LSA --- 根据开销值的计算规则不同&#xff0c;还分为类型1和类型2 ospf 防环机制 区域内防环&#xff1a;在同一OSPF区域内&#xff0c;所有路由器通过交换链路状态通告&#xff…...

asgasgas

asdgasdgsa...

Go语言实现人脸检测(Go的OpenCV绑定库)

文章目录 OpenCVGithub官网安装环境变量 Go的OpenCV绑定库Github文档安装搜索视频设备ID显示视频检测人脸 OpenCV Github https://github.com/opencv/opencv/ 官网 https://opencv.org/ 安装 brew install opencv brew upgrade opencv安装目录 cd /usr/local/opt/opencv…...

springboot中线程池的使用

一、概念 线程池就是将多个线程对象放入一个池子里面&#xff0c;例如一个池塘&#xff0c;线程池就是这个池塘&#xff0c;池塘里面的鱼就是线程池中的多个线程对象。1. 每一个线程&#xff0c;在一段时间内只能执行一个任务。2. 线程池中的各个线程是可以重复使用的。 二、创…...

ubuntu20.04 开机自动挂载外加硬盘

文章目录 一、问题描述二、操作1. 查找新添盘符2. 格式化硬盘文件系统3. 挂载硬盘4. 开机自动挂载5. 取消挂载6. 查看挂载的硬盘信息 一、问题描述 因电脑使用一段时间后自身硬盘不足&#xff0c;需外加硬盘使得电脑自动识别加载。 二、操作 1. 查找新添盘符 sudo blkid自己…...

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&…...

linux---线程控制

线程和进程 以前我们要同时跑多个程序&#xff0c;可以通过fork()多个子进程&#xff0c;然后通过系统函数进行程序的替换&#xff0c;但是创建进程代价大&#xff0c;不仅要拷贝一份父进程的地址空间&#xff0c;页表&#xff0c;文件表述符表等。但是线程不需要因为是进程的…...

低代码开发:拖拽式可视化构建工业物联网系统

什么是低代码&#xff1f; 低代码(Low Code)是一种可视化的软件开发方法&#xff0c;通过最少的手动编码可以更快地交付应用程序。低代码平台的图形用户界面和拖放功能可自动执行开发过程的各个方面&#xff0c;从而消除对传统计算机编程方法的依赖。 什么是低代码平台&#…...

【撸源码】【ThreadPoolExecutor】线程池的工作原理深度解析——上篇

1. 前言 线程池这块&#xff0c;作为高频面试题&#xff0c;并且实际使用场景巨多&#xff0c;所以出了这篇文章&#xff0c;一块来研究一下线程池的实现原理&#xff0c;运行机制&#xff0c;从底层深挖&#xff0c;不再局限于面试题。 2. 线程池概览 2.1. 构造器 线程池总…...

利用kimi与快马平台,十分钟搭建个人博客web应用原型

最近想快速验证一个个人博客的创意&#xff0c;但自己从头写代码太费时间。尝试用InsCode(快马)平台的Kimi模型生成原型&#xff0c;没想到十分钟就搞定了可运行的Web应用&#xff0c;分享下这个高效流程&#xff1a; 明确需求梳理结构 先花2分钟在纸上画了博客的基本框架&…...

5分钟上手Godot 4.0地形系统:用AutoTile实现像素风草地自动拼接(含Layer新功能演示)

5分钟掌握Godot 4.0地形系统&#xff1a;用AutoTile实现像素风无缝拼接 在像素风格游戏开发中&#xff0c;地形拼接一直是让开发者头疼的问题——如何让草地、石块、沙土等元素自然过渡&#xff1f;传统方案往往需要手动放置大量图块或编写复杂逻辑。Godot 4.0的TileMap系统带来…...

别再只会用‘Let‘s think step by step’了:DeepSeek-R1原生CoT机制详解与实战调优

解锁DeepSeek-R1推理潜能&#xff1a;原生思维链技术深度解析与高阶应用指南 当我们在数学考试中遇到复杂题目时&#xff0c;老师总会强调"把解题过程写清楚"。这种分步思考的方式&#xff0c;正是人类解决复杂问题的核心方法。如今&#xff0c;大语言模型也掌握了这…...

DataQA数问增长:金融小贷行业的“智能风控大脑“实战揭秘

数问"Web渠道转化率仅0.2&#xff0c;欺诈风险高、客户资质差——你的渠道投放预算&#xff0c;有多少正在打水漂&#xff1f;" &#x1f4a1; 真实场景还原&#xff1a;某头部消费金融公司的渠道危机 时间&#xff1a;2026年3月&#xff0c;周一上午9:00 角色&…...

如何将笔记从 iCloud 传输到 iPhone:分步指南

iPhone 上的“备忘录”应用是一款便捷的工具&#xff0c;可以用来记录待办事项、日记、想法等等。它能帮助我们追踪需要完成的事情。借助 iCloud 的自动同步功能&#xff0c;你的备忘录可以安全地存储在云端&#xff0c;并可通过任何 Apple 设备甚至电脑访问。将笔记从 iPhone …...

手把手教你将自定义视频问答JSON转成EasyR1可用的Parquet数据集

手把手教你将自定义视频问答JSON转成EasyR1可用的Parquet数据集 当你在构建视频问答模型时&#xff0c;可能已经收集了大量结构化的JSON格式数据&#xff0c;但如何将这些数据适配到EasyR1框架中却成了一个技术难题。本文将为你提供一个从零开始的完整解决方案&#xff0c;解决…...

数据库课程设计好帮手:Phi-4-mini-reasoning辅助ER图设计与SQL优化

数据库课程设计好帮手&#xff1a;Phi-4-mini-reasoning辅助ER图设计与SQL优化 1. 课程设计的痛点与解决方案 每到学期末&#xff0c;计算机专业的学生们都会面临一个共同的挑战——数据库课程设计。这个需要完成ER图设计、SQL编写和文档撰写的综合项目&#xff0c;常常让初学…...

基于GADF-CNN-GOSO-LSSVM的齿轮箱故障诊断方法探索

基于GADF-CNN-GOSO-LSSVM的齿轮箱故障诊断 首先&#xff0c;利用格拉姆角场差(GADF)时频分辨率高、可以深度反映时间序列内在结构和关系的特点&#xff0c;对采集到的一维故障数据信号转为二维图像&#xff0c;得到图像后并将图像进行降维处理&#xff1b;然后&#xff0c;将第…...

通过信道优化数据传输的通信链路的实现附Matlab代码

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;擅长数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。&#x1f34e; 往期回顾关注个人主页&#xff1a;Matlab科研工作室&#x1f34a;个人信条&#xff1a;格物致知,完整Matlab代码及仿真咨询…...

基于AkShare构建A股基础数据自动化采集方案

1. 为什么需要自动化采集A股基础数据 做量化研究的朋友都知道&#xff0c;获取准确、完整的股票基础数据是策略开发的基石。我刚开始做量化时&#xff0c;最头疼的就是每次跑策略前都要手动更新股票列表&#xff0c;经常因为数据不全导致回测结果失真。后来发现AkShare这个宝藏…...