点击主图,触发的是查看产品详情的逻辑

文章目录

  • 1、点击主图,触发的是查看产品详情的逻辑
  • 2、点击主图,发送的请求是 productDetail 这个方法
  • 3、与主图相关的代码片段

1、点击主图,触发的是查看产品详情的逻辑

点击主图的确不会触发那些物流参数输入框的自动查询。 那些输入框需要用户手动输入数据。

点击主图,触发的是查看产品详情的逻辑,包括了根据产品 ID 查询产品详情数据(其中就包含了物流参数),然后将这些数据显示在对应的只读区域,而非那些输入框中。

让我再更正一下:

  1. 物流参数的来源: 物流参数(如净重、毛重、尺寸、箱规等)是产品的基本属性,需要在产品信息创建或编辑时由用户手动输入保存到数据库。

  2. 输入框的作用: <el-input> 组件在 operateType === 'edit' 模式下,是用来给用户输入或修改这些物流参数的。它们并不会根据你点击主图或其他操作自动去查询并填充数据。

  3. 点击主图的逻辑: 点击主图,触发的是 handleView(row) 方法,该方法执行的是路由跳转到产品详情页:

    public handleView(row: any) {this.$router.push({ path: `productDetail/${row.id}/view` })
    }
    
  4. 详情页的数据加载:productDetail 组件 (即 src/views/product/detail.vue) 中,mounted 钩子函数会根据路由参数中的 idoperateType 来决定是查看详情还是编辑。当 operateType === 'view' 时,会调用 getproductDetail() 方法:

    async mounted() {// ...this.id = parseInt(this.$route.params.id);this.operateType = this.$route.params.operateType;// ...if (this.id > 0) {await this.getproductDetail()// ...}}public async getproductDetail() {const res: any = await productDetail({ id: this.id })if (res.code === 0) {const form = res.data// ...this.form = { ...form }this.formSource = { ...form }console.log(this.form)}}
    

    getproductDetail() 方法会调用 productDetail API (在 src/api/product.ts 中定义) 向后端发送请求,获取产品详情数据。

  5. 数据的显示:productDetail 组件的 template 中,可以看到当 operateType !== 'edit' (即查看模式) 时,物流参数是通过 {{ form.netWeight }}{{ form.grossWeight }} 这种形式直接显示数据的:

     <el-col :span="6"><el-form-item label="产品净重(g)" prop="netWeight" label-width="130px"><span v-if="operateType !== 'edit'">{{ form.netWeight }}</span><el-input v-else v-model="form.netWeight" placeholder="产品净重(g)" /></el-form-item></el-col><el-col :span="6"><el-form-item label="产品毛重(g)" prop="grossWeight" label-width="130px"><span v-if="operateType !== 'edit'">{{ form.grossWeight }}</span><el-input v-else v-model="form.grossWeight" placeholder="产品毛重(g)" /></el-form-item></el-col>
    

    也就是说,查看模式下,并不是通过输入框来显示数据,而是直接将数据显示在 <span> 标签中。只有在编辑模式下,才会将数据显示在el-input中,因为这个时候需要双向绑定。

总结:

  • 点击主图不会自动查询并填充物流参数到那些输入框中。
  • 输入框是用来给用户手动输入或修改物流参数的。
  • 点击主图会跳转到产品详情页,详情页会根据产品 ID 查询产品详情数据(包括物流参数),并将数据显示在只读区域,而不是输入框。
  • 物流参数是产品的基本属性,需要在创建或编辑产品信息时,由用户手动输入并保存到数据库。

2、点击主图,发送的请求是 productDetail 这个方法

点击主图,发送的请求是 productDetail 这个方法。

以下是完整的逻辑链条:

  1. 点击事件: 当用户在产品列表页面点击主图时,会触发 handleView(row) 方法。

    <el-imagestyle="width: 105px; height: 105px; cursor: pointer;":src="row.image ? oss + row.image + '!commodity_big_350' : require('@/assets/images/main-image-empty.png')"fit="contain"@click="handleView(row)" 
    ><div slot="error" class="image-slot"><el-image :src="require('@/assets/images/main-image-empty.png')" /></div>
    </el-image>
    
  2. 路由跳转: handleView(row) 方法内部使用 this.$router.push 进行路由跳转,跳转到产品详情页:

    public handleView(row: any) {this.$router.push({ path: `productDetail/${row.id}/view` })
    }
    
  3. 组件挂载: 跳转到 productDetail 组件后,该组件会被挂载,执行其 mounted 钩子函数:

    async mounted() {this.getStageImageList()this.id = parseInt(this.$route.params.id)this.operateType = this.$route.params.operateTypeif (this.operateType !== 'view') this.initAllEditor()this.getBrands()if (this.operateType === 'add') {await this.getValidFields()}this.getQualifyTypes()if (this.id > 0) {await this.getproductDetail()if (this.operateType === 'edit' || this.operateType === 'view') {this.getValidFields()}}}
    
  4. 获取详情:mounted 钩子函数中,通过判断 this.id 是否大于 0(即是否为有效的产品ID)以及 this.operateType 是否为 view(即查看模式),决定是否调用 getproductDetail 方法获取产品详情。由于 handleView 传递了 row.idview,所以这两个条件都满足,getproductDetail 方法会被调用。

  5. 发送请求: getproductDetail 方法内部调用了 productDetail API:

    public async getproductDetail() {const res: any = await productDetail({ id: this.id })if (res.code === 0) {const form = res.dataconst res2 = await fieldsById({ categoryId: form.categoryId })const ss = res2.data.contentif (form.fieldList.length > 0) {form.fieldList = form.fieldList.map(o => ({ ...ss.find(p => o.id === p.id), ...o, key: Math.random() + '' }))}if (this.operateType !== 'view') {this.editor.txt.html(form.detail || '')// this.editor1.txt.html(form.detail1 || '')// this.editor2.txt.html(form.detail2 || '')// this.editor3.txt.html(form.detail3 || '')// this.editor4.txt.html(form.detail4 || '')// this.editor5.txt.html(form.detail5 || '')// this.editor6.txt.html(form.detail6 || '')// this.editor7.txt.html(form.detail7 || '')// this.editor8.txt.html(form.detail8 || '')// this.editor9.txt.html(form.detail9 || '')}Object.assign(form, { stageImageIdListx: form.stageImageIdList[0] })this.form = { ...form }this.formSource = { ...form }console.log(this.form)}}
    
  6. productDetail API 定义:src/api/product.ts 文件中,productDetail 函数负责发送请求:

    export const productDetail = (params: any) =>request({url: 'product/admin/detail',method: 'get',params})
    

    这个函数发送了一个 GET 请求到 product/admin/detail 接口,并传递了一个 params 参数,其中包含了产品 id

总结:

点击主图触发的请求是 productDetail 方法,它发送一个 GET 请求到 /product/admin/detail 接口,并携带产品 id 作为参数,用于获取指定产品的详细信息。

3、与主图相关的代码片段

以下是与主图相关的代码片段,并附有解释:

1. 列表页 (src/views/product/index.vue)

<template><div class="page-wrap"><div class="table"><el-table v-loading="loading" :height="tableHeight" :data="list" @selection-change="handleSelectionChange"><el-table-column label="主图" align="center"><div v-if="row.image + '!commodity_big_350'" slot-scope="{row}" class="el-table-column-image-wrap"><el-imagestyle="width: 105px; height: 105px; cursor: pointer;":src="row.image ? oss + row.image + '!commodity_big_350' : require('@/assets/images/main-image-empty.png')"fit="contain"@click="handleView(row)"><div slot="error" class="image-slot"><el-image :src="require('@/assets/images/main-image-empty.png')" /></div></el-image></div></el-table-column><template #empty><div style="display: grid; place-items: center center;"><function-guide-main :type="2" /></div></template></el-table></div></div>
</template><script lang="ts">
import { Component, Vue } from 'vue-property-decorator'
import { AppModule } from '@/store/modules/app'
import { products } from '@/api/product'
// ... 其他引入@Component({name: 'product-list',components: { /* ... */ }
})export default class extends Vue {// ...public oss: string = AppModule.oss// ...public handleView(row: any) {this.$router.push({ path: `productDetail/${row.id}/view` })}// ...public async getList() {this.loading = trueconst { page, size, field, value } = this.listQueryconst searchData = { page, size, field, value }const res: any = await products(searchData)if (res.code === 0) {this.list = this.packList(res.data.content)// this.list = []this.listQuery = { ...this.listQuery, total: res.data.totalElements }this.loading = false}}// ...created() {// ...this.getList()}// ...mounted() {// ...this.getList()// ...}
}
</script>

代码解释:

  • el-table-column (label=“主图”): 这一列用于显示产品主图。
  • v-if="row.image + '!commodity_big_350'": 判断 row.image 是否存在且加上 !commodity_big_350 后不为空。这里是为了防止 row.imagenull 或空字符串时,oss + row.image 拼接出错。
  • slot-scope="{row}": 作用域插槽,可以获取到当前行的数据 row
  • el-image: 显示图片的组件。
    • style="width: 105px; height: 105px; cursor: pointer;": 设置图片样式,并且鼠标悬停时显示为手型。
    • :src="row.image ? oss + row.image + '!commodity_big_350' : require('@/assets/images/main-image-empty.png')": 设置图片的 src 属性。
      • row.image ? oss + row.image + '!commodity_big_350':如果 row.image 存在,则拼接 oss (图片服务器地址前缀)、row.image (图片文件名或路径) 和 !commodity_big_350 (图片处理参数,例如指定图片尺寸) 作为图片的 URL。
      • require('@/assets/images/main-image-empty.png'):如果 row.image 不存在,则显示默认的空图片。
    • fit="contain": 设置图片适应容器的方式为 contain,保持图片的宽高比。
    • @click="handleView(row)": 绑定点击事件,点击图片时调用 handleView 方法,并传入当前行的数据 row
  • div slot="error": 当图片加载失败时,显示 slot="error" 的内容,这里是一个默认的空图片。
  • handleView(row): 点击主图时触发的方法,跳转到产品详情页。
  • oss: string = AppModule.oss: 从 Vuex 的 AppModule 中获取 oss 变量,通常是图片服务器的地址前缀。
  • getList(): 获取产品列表数据,其中包含了 row.image,即主图的相对路径或文件名。

2. 详情页 (src/views/product/detail.vue)

<template><div class="product-detail"><el-form ref="form" :model="form"><el-row :gutter="20"><el-col :span="18"><el-form-item label="主图" label-width="130px"><div slot="label"><span>主图<el-tooltip class="item" effect="dark" content="上传大小不超过3M,支持jpg、jpeg、png格式,建议尺寸:640*640 像素,1:1亦可"placement="bottom-start"><i class="el-icon-warning-outline" /></el-tooltip></span></div><el-image v-if="form.image && operateType !== 'edit'" style="width: 80px; height: 80px":src="oss + form.image" :preview-src-list="[`${oss}${form.image}`]" /><upload-image v-else ref="uploadImage" :image-path="form.image" folder-name="product-image"@upload-success="(e) => handleUploadSucc('image', e)" @handle-remove="handleUploadSucc('image')" /></el-form-item></el-col></el-row></el-form></div>
</template><script lang="ts">
import { Component, Vue } from 'vue-property-decorator'
import { AppModule } from '@/store/modules/app'
import { productDetail } from '@/api/product'
// ... 其他引入@Component({name: 'detail',components: { /* ... */ },mixins: [ /* ... */ ]
})
export default class extends Vue {public oss: string = AppModule.oss// ...public form: any = { shelfLifeUnit: 3, region: 9 } // 注意这里初始化了 form,但主图 image 属性是在 getproductDetail 中赋值的// ...public async getproductDetail() {const res: any = await productDetail({ id: this.id })if (res.code === 0) {const form = res.data// ...this.form = { ...form }// ...}}// ...async mounted() {// ...this.id = parseInt(this.$route.params.id)this.operateType = this.$route.params.operateType// ...if (this.id > 0) {await this.getproductDetail()// ...}}// ...
}
</script>

代码解释:

  • el-form-item (label="主图"): 表单项,用于显示或编辑主图。
  • v-if="form.image && operateType !== 'edit'": 判断 form.image 是否存在且当前操作类型不是编辑模式,满足条件则显示已有的主图。
  • el-image: 显示图片的组件。
    • style="width: 80px; height: 80px": 设置图片样式。
    • :src="oss + form.image": 设置图片的 src 属性为 oss + form.image,即图片服务器地址前缀加上图片文件名或路径。
    • :preview-src-list="[ o s s {oss} oss{form.image}]": 设置图片预览的 src 列表,这里只有一个图片。
  • v-else: 如果不满足 v-if 的条件(即 form.image 不存在或当前是编辑模式),则显示 upload-image 组件,用于上传图片。
  • upload-image: 自定义的上传图片组件。
    • :image-path="form.image": 传递当前的图片路径给上传组件。
    • folder-name="product-image": 指定上传图片的文件夹名称。
    • @upload-success="(e) => handleUploadSucc('image', e)": 上传成功的回调函数。
    • @handle-remove="handleUploadSucc('image')": 删除图片的回调函数。
  • getproductDetail(): 获取产品详情数据,其中包含了 form.image,即主图的相对路径或文件名。
  • handleUploadSucc(key, res: string = ''): 上传图片成功或删除图片的回调函数,更新form表单中图片的值

总结:

列表页和详情页都涉及到了主图的显示:

  • 列表页: 点击主图会跳转到详情页,并通过 row.image 属性获取主图的相对路径或文件名,然后拼接成完整的 URL 显示图片。
  • 详情页: 通过 form.image 属性获取主图的相对路径或文件名,然后拼接成完整的 URL 显示图片或传递给上传组件。

这两处获取到的 row.imageform.image 都是通过后端 API 获取到的,具体的值取决于后端如何存储和返回图片信息。通常情况下,row.imageform.image 保存的是图片的相对路径或文件名,需要拼接上前缀(如 oss)才能在浏览器中显示。

在这里插入图片描述

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

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

相关文章

图数据库 | 17、高可用分布式设计(上)

我们在前面的文章中&#xff0c;探索了多种可能的系统扩展方式&#xff0c;以及每种扩展方式的优劣。 本篇文章将通过具体的架构设计方案来对每一种方案的设计、投入产出比、各项指标与功能&#xff0c;以及孰优孰劣等进行评价。 在设计高性能、高可用图数据库的时候&#xf…

【FlutterDart】 listView.builder例子二(14 /100)

上效果图 上代码&#xff1a; import package:flutter/material.dart;class ListRoles extends StatelessWidget {ListRoles({super.key});final List<String> entries <String>[, -, *, /];final List<int> colorCodes <int>[600, 500, 100, 50];o…

深入了解 ES6 Map:用法与实践

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

DeepSeek重新定义“Open“AI

“面对颠覆性技术&#xff0c;闭源所创造的护城河是暂时的。即使是OpenAI的闭源方法也无法阻止他人赶超。” ——梁文锋&#xff0c;DeepSeek CEO DeepSeek V3 是一个拥有6710亿参数的开源AI模型&#xff0c;正在提升AI效率的新标准。它在相对有限的预算下进行训练&#xff0c…

5. CSS引入方式

5.1 CSS的三种样式 按照 CSS 样式书写的位置(或者引入的方式)&#xff0c;CSS样式表可以分为三大类&#xff1a; 1.行内样式表&#xff08;行内式&#xff09; 2.内部样式表&#xff08;嵌入式&#xff09; 3. 外部样式表&#xff08;链接式&#xff09; 5.2 内部样式表 …

开源平台Kubernetes的优势是什么?

Kubernetes 是一个可移植、可扩展的开源平台&#xff0c;用于管理容器化的工作负载和服务&#xff0c;方便进行声明式配置和自动化。Kubernetes 拥有一个庞大且快速增长的生态系统&#xff0c;其服务、支持和工具的使用范围广泛。 Kubernetes 这个名字源于希腊语&#xff0c;意…

web系统漏洞攻击靶场

摘 要 互联网极速发展的同时&#xff0c;也会带来一些安全性的风险&#xff0c;一些不为人知的安全问题也逐渐暴露出来。近年来&#xff0c;媒体不断披露了许多网络安全事故&#xff0c;许多网络应用程序被黑客攻击&#xff0c;导致内部数据外泄&#xff0c;人们开始认识到网络…

QPainter,QPen,QBrush详解

QPainter:画家 QPen:画笔&#xff0c;控制图形的边框轮廓 QBrush:画刷&#xff0c;控制图形的填充颜色样式 下面是用用QGraphicsItem来重写paint事件举例 #include <QGraphicsItem> #include <QPainter> #include <QGraphicsScene> #include <QGraphicsV…

C语言 扫雷程序设计

目录 1.main函数 2.菜单打印menu函数 3.游戏game函数 4.宏定义 5.界面初始化 6.打印界面 7.设置雷 8.统计排查坐标周围雷的个数 9.排查雷 10.总代码 test.c代码 game.h代码 game.c代码 结语&#xff1a; 一个简单的扫雷游戏&#xff0c;通过宏定义可以修改行列的…

第30天:Web开发-PHP应用组件框架前端模版渲染三方插件富文本编辑器CVE审计

#知识点 1、安全开发-原生PHP-开发组件集合 2、安全开发-原生PHP-模版引擎渲染 3、安全开发-原生PHP-第三方编辑器 组件/框架 说明 [Web框架] Laravel 现代化、功能全面的框架&#xff0c;适合大多数Web应用。 Symfony 高度模块化、功能强大的框架&#xff0c;适合复杂…

解决ESP32 wifi scan:1. 获取WIFI扫描列表个数为0 的问题 2.扫描WIFI列表时导致程序崩溃问题。

1. 获取WIFI扫描列表个数为0 的问题 参考ESP32的wifi scan例子&#xff0c;出问题的程序源码&#xff1a; 分析原因&#xff1a; 查看esp_wifi.c的源码&#xff0c;我们会发现&#xff1a; 上面意思就是但调用esp_wifi_scan_get_ap_records获取AP列表后&#xff0c;将会…

【动态重建】时间高斯分层的长体积视频

标题&#xff1a;Representing Long Volumetric Video with Temporal Gaussian Hierarchy 来源&#xff1a;浙江大学 链接&#xff1a;https://zju3dv.github.io/longvolcap/ 文章目录 摘要一、前言二、主要方法2.1 时间高斯分层2.2 高效渲染2.3 层次结构更新2.4 紧凑的外观模型…

mongodb==安装prisma连接

官网下载mongodb,解压安装 Download MongoDB Community Server | MongoDB 修改bin/mongod.cfg # mongod.conf# for documentation of all options, see: # http://docs.mongodb.org/manual/reference/configuration-options/# Where and how to store data. storage:dbPat…

conda安装及demo:SadTalker实现图片+音频生成高质量视频

1.安装conda 下载各个版本地址&#xff1a;https://repo.anaconda.com/archive/ win10版本&#xff1a; Anaconda3-2023.03-1-Windows-x86_64 linux版本&#xff1a; Anaconda3-2023.03-1-Linux-x86_64 Windows安装 环境变量 conda -V2.配置conda镜像源 安装pip conda…

TDengine + MQTT :车联网时序数据库如何高效接入

现代新能源汽车&#xff0c;作为一种内部系统极为复杂的交通工具&#xff0c;配备了大量传感器、导航设备、应用软件&#xff0c;这些传感器产生的数据都需要上报到车联网平台当中。对于这些车辆的状态数据&#xff08;如车速、发动机转速等&#xff09;、位置数据&#xff08;…

LabVIEW瞬变电磁接收系统

利用LabVIEW软件与USB4432采集卡开发瞬变电磁接收系统。系统通过改进硬件配置与软件编程&#xff0c;解决了传统仪器在信噪比低和抗干扰能力差的问题&#xff0c;实现了高精度的数据采集和处理&#xff0c;特别适用于地质勘探等领域。 ​ 项目背景&#xff1a; 瞬变电磁法是探…

【读书与思考】历史是一个好东西

【AI论文解读】【AI知识点】【AI小项目】【AI战略思考】【AI日记】【读书与思考】 导言 以后《AI日记》专栏我想专注于 AI 相关的学习、成长和工作等。而与 AI 无关的一些读书、思考和闲聊&#xff0c;我打算写到这里&#xff0c;我会尽量控制自己少想和少写。 下图的一些感想…

网络层协议之IP数据包层分片随笔

1.全篇内容均在图中&#xff0c;如何分片以及分片举例细节拆解&#xff0c;见下图: 1.1分片公式&#xff1a; 上述公式中有关/8 再*8目的是为了使用8字节对齐&#xff0c;从而使的分片数据包均为8字节整数倍&#xff01; 1.2.ip层数据包分片计算&图解

Python爬虫基础——认识网页结构(各种标签的使用)

1、添加<div>标签的代码定义了两个区块的宽度和高度均为100px&#xff0c;边框的格式也相同&#xff0c;只是区块中显示的内容不同&#xff1b; 2、添加<ul>和<ol>标签分别用于定义无序列表和有序列表。<il>标签位于<ul>标签或<ol>标签之…

牛客网刷题 ——C语言初阶(6指针)——字符逆序

1. 题目描述&#xff1a;字符逆序 牛客网题目链接 将一个字符串str的内容颠倒过来&#xff0c;并输出。 输入描述: 输入一个字符串&#xff0c;可以有空格 输出描述: 输出逆序的字符串 示例1 输入 I am a student 输出 tneduts a ma I 2. 思路 首先字符串逆序&#xff0c;之…