Vue自定义商品发布组件

news2024/11/16 10:21:50

文章目录

  • 一、代码展示
  • 二、代码解读
  • 三、结果展示

一、代码展示

<template>
  <div>
    <a-popover trigger="hover" :getPopupContainer="triggerNode => {return triggerNode.parentNode || document.body;}">
      <template #content>
        <div style="display: flex; justify-content: space-between;">
          <router-link to="/write">
            <a-card
                class="select"
                :hoverable="true"
                style="width: 100px; height: 100px; margin-right: 10px;justify-content: center;display: flex"
            >
              <div style="display: flex;justify-content: center;flex-direction: column">
                <svg-icon icon-name="icon-icon_wenzhang" size="40px" ></svg-icon>
                <span style="margin-top: 2px">写文章</span>
              </div>
            </a-card>
          </router-link>

          <a-card
              class="select"
              :hoverable="true"
              style="width: 100px; height: 100px; margin-left: 10px;justify-content: center;display: flex"
              @click="openProductDialog"
          >
            <div style="display: flex;justify-content: center;flex-direction: column">
              <svg-icon icon-name="icon-shangpinfabu" size="40px" ></svg-icon>
              <span style="margin-top: 2px">卖商品</span>
            </div>
          </a-card>



          <a-modal :visible="visible"  title="发布商品" @ok="submitForm" @cancel="handleCancel">
            <a-form  >
              <!-- 商品名称 -->
              <a-form-item label="商品名称">
                <a-input v-model:value="formData.name" />
              </a-form-item>

              <!-- 商品详细描述 -->
              <a-form-item label="商品描述">
                <a-textarea v-model:value="formData.detail" :auto-size="{ minRows: 3, maxRows: 6 }" />
              </a-form-item>

              <!-- 商品价格 -->
              <a-form-item label="商品价格">
                <a-input-number v-model:value="formData.price" :min="0" :precision="2" />
              </a-form-item>

              <!-- 商品库存 -->
              <a-form-item label="商品库存">
                <a-input-number v-model:value="formData.stock" :min="0" />
              </a-form-item>

              <!-- 商品类型选择 -->
              <a-form-item label="商品类型">
                <a-select  v-model:value="formData.cateId">
                  <a-select-option v-for="option in productTypeOptions" :key="option.id" :value="option.id">
                    {{ option.name }}
                  </a-select-option>
                </a-select>
              </a-form-item>
              <!-- 快递或自提 -->
              <a-form-item label="配送方式">
                <a-select v-model:value="formData.remark" >
                  <a-select-option value="快递">快递</a-select-option>
                  <a-select-option value="自提">自提</a-select-option>
                </a-select>
              </a-form-item>

              <!-- 上传图片 -->
              <a-form-item label="上传图片">
                <a-upload
                    :showUploadList="{ showPreviewIcon: true, showRemoveIcon: true }"
                    :list-type="'picture-card'"
                    :beforeUpload="beforeUpload"
                    :customRequest="customRequest"
                    @preview="handlePreview"
                    @remove="handleRemove"
                >
                  <div v-if="uploadedImageCount < 2">
                    <a-icon type="plus" />
                    <div class="ant-upload-text">上传图片</div>
                  </div>
                </a-upload>
              </a-form-item>

              <a-form-item>
                <a-modal :visible="previewVisible" :title="previewTitle" @cancel="handlePreviewCancel" :footer="null">
                  <img :src="previewImage" alt="Uploaded Image" style="width: 100%" />
                </a-modal>
              </a-form-item>

            </a-form>
          </a-modal>


















        </div>
      </template>
      <a-button type="primary" shape="round" size="large" style="margin-top: 15px;background-color: #3fdbf0">
        <template #icon>
          <PlusCircleOutlined/>
        </template>
        发布
      </a-button>
    </a-popover>
  </div>
</template>

<script setup></script>

<style scoped lang="less">
.select:hover {
  background-color: #f5f5f5;
}
</style>

二、代码解读

  1. <template> 标签:Vue.js 组件的模板部分开始。

  2. <div> 标签:一个包裹整个组件内容的 <div> 元素。

  3. <a-popover> 标签:Ant Design Vue 库提供的弹出框组件,用于显示一个气泡框。

    • trigger="hover":设置触发弹出框的方式为鼠标悬停。
    • :getPopupContainer:动态地指定弹出框的挂载容器,使其可以随父元素的位置改变而改变。
    • :getPopupContainer 属性的值是一个函数,它接受一个参数 triggerNode,返回弹出框的挂载容器,这里返回的是触发节点的父节点或者文档的 body 元素。
  4. <template #content>:模板的一个命名插槽,用于定义弹出框的内容。

  5. <div> 标签:弹出框内容的容器。

  6. <router-link to="/write">:Vue Router 提供的路由链接组件,点击后跳转到 /write 路径。

  7. <a-card> 标签:Ant Design Vue 提供的卡片组件,用于包裹每个选项。

    • class="select":自定义类名,用于设置选项卡的样式。
    • :hoverable="true":设置鼠标悬停时显示阴影效果。
    • style:行内样式设置卡片的宽度、高度和外边距等样式。
  8. <svg-icon> 标签:自定义的 SVG 图标组件,用于显示一个 SVG 图标。

    • icon-name="icon-icon_wenzhang":指定 SVG 图标的名称。
    • size="40px":设置 SVG 图标的大小。
  9. <span> 标签:用于显示文字内容。

  10. <a-card> 标签:另一个卡片组件,代表卖商品选项。

    • class="select":同样是自定义类名,用于设置样式。
    • :hoverable="true":设置鼠标悬停时显示阴影效果。
    • @click="openProductDialog":点击时触发 openProductDialog 方法。
  11. <a-modal> 标签:Ant Design Vue 提供的模态框组件,用于显示发布商品的表单。

    • :visible="visible":控制模态框的显示与隐藏。
    • title="发布商品":设置模态框的标题。
    • @ok="submitForm":点击确定按钮时触发 submitForm 方法。
    • @cancel="handleCancel":点击取消按钮时触发 handleCancel 方法。
  12. <a-form> 标签:Ant Design Vue 提供的表单组件,用于包裹表单项。

  13. <a-form-item> 标签:表单项组件,用于包裹每个表单项,并设置标签和表单控件的布局。

    • label="商品名称":设置表单项的标签文字。
  14. <a-input><a-textarea><a-input-number><a-select><a-upload> 等标签:Ant Design Vue 提供的不同类型的表单控件,用于用户填写商品信息。

  15. <a-modal> 标签:另一个模态框组件,用于显示上传的图片的预览。

    • :visible="previewVisible":控制预览模态框的显示与隐藏。
    • :title="previewTitle":设置预览模态框的标题。
  16. <img> 标签:用于显示上传的图片的预览。

    • :src="previewImage":指定预览图片的路径。
  17. </template> 标签:模板部分结束。

三、结果展示

在这里插入图片描述
在这里插入图片描述

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

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

相关文章

matlab:涉及复杂函数图像的交点求解

matlab&#xff1a;涉及复杂函数图像的交点求解 在MATLAB中求解两个图像的交点是一个常见的需求。本文将通过一个示例&#xff0c;展示如何求解两个图像的交点&#xff0c;并提供相应的MATLAB代码。 画出图像 首先&#xff0c;我们需要绘制两个图像&#xff0c;以便直观地看…

自动驾驶技术详解

&#x1f3ac;个人简介&#xff1a;一个全栈工程师的升级之路&#xff01; &#x1f4cb;个人专栏&#xff1a;自动驾驶技术 &#x1f380;CSDN主页 发狂的小花 &#x1f304;人生秘诀&#xff1a;学习的本质就是极致重复! 目录 一 自动驾驶视觉感知算法 1目标检测 1.1 两阶…

vue-electron 项目创建记录及注意事项

vue-electron 项目创建记录及注意事项 1、使用vue ui或者命令行创建vue项目 2、添加electron插件 3、安装element-plus: npm install --save element-plus 4、修改配置文件如下图: vue.config.js增加配置&#xff1a; pluginOptions:{ electronOutput: { contextIsolation…

JVM(4)

垃圾回收问题 垃圾回收算法 通过之前的学习我们可以将死亡对象标记出来了,标记出来后我们就可以进行垃圾回收操作了,在正式学习垃圾处理器之前,我们先来看一下垃圾回收器使用的几种算法. 标记-清除算法 "标记-清除"算法是基础的收集算法.算法分为"标记"…

nextjs13如何进行服务端渲染?

目录 一、创建一个新项目 二、动态获取后端数据进行服务端渲染出现的问题 三、nextjs13如何进行服务端渲染 nextjs13是nextjs的一个重大升级&#xff0c;一些原本在next12当中使用的API在nextjs13上使用十分不便。本文将着重介绍在nextjs13及以上版本当中进行服务端渲染的方…

Java进阶(锁)——锁分类总结,Java中常用的锁的介绍

目录 引出锁分类总结1、乐观锁2、悲观锁3、自旋锁4、可重入锁5、读写锁6、公平锁7、非公平锁8、共享锁9、独占锁10、重量级锁11、轻量级锁12、偏向锁13、分段锁14、互斥锁15、同步锁16、死锁17、锁粗化18、锁消除 Java中常用的锁synchronizedLock和synchronized的区别Reentrant…

web组态(BY组态)接入流程

技术文档 官网网站&#xff1a;www.hcy-soft.com 体验地址&#xff1a; www.byzt.net:60/sm 一、数据流向图及嵌入原理 数据流向 嵌入原理 二、编辑器调用业务流程图 三、集成前需要了解的 1、后台Websocket端往前台监控画面端传输数据规则 后台websocket向客户端监控画面…

视频记录仪_基于联发科MT6762的智能4G记录仪方案

智能记录仪采用联发科强劲八核处理器&#xff0c;12nm制程工艺的记录仪具便是满足这些需求的理想选择。搭载4GB32GB内存&#xff0c;并运行Android 11.0操作系统&#xff0c;这款记录仪具展现出强劲的性能表现。 首先&#xff0c;这款记录仪具具备优秀的视频录制功能。它能完整…

mysql python学习笔记

mysql 基础概念 1.一个表格一般包含一个主建 2.可有多个主见,叫组合主见 3.可以有foreign key 用于链接外部表格的主建 外键目的&#xff1a; 这个约束的目的是确保当前表中的外键列&#xff08;JNO列&#xff09;的值必须存在于另一个表&#xff08;J’表&#xff09;的主键…

kibana7.17.7 将数据导出csv文件

配置kibana文件 首先先配置kibana.yaml内容如下&#xff0c;这里假设我的服务器ip地址为192.168.130.128&#xff0c;elasticsearch的ip地址为&#xff1a;192.168.130.129:9200&#xff0c;192.168.130.130:9200&#xff1a; server.host: "192.168.130.128" serv…

【踩坑专栏】追根溯源,从Linux磁盘爆满排查故障:mycat2与navicat不兼容导致日志暴增

昨天遇到了一个比较奇怪的问题&#xff0c;就是在挂起虚拟机的时候&#xff0c;虚拟机提示我XX脚本正在运行&#xff0c;很奇怪&#xff0c;我没有运行脚本&#xff0c;为什么会提示我这个呢。今天恢复虚拟机&#xff0c;也提示了一下脚本的问题&#xff0c;而且发现Linux明显异…

尚硅谷Java数据结构--希尔排序

插入排序的问题&#x1f388;&#xff1a; arr{2,3,4,5,6,0,9,7,8}; 当0作为插入元素的时候&#xff0c;其待插入下标与原下标相差很远&#xff0c;需要进行多次比较和移动。 希尔排序则是先将下标相差一定距离gap的元素分为一组&#xff0c;进行插入排序&#xff1b;再逐渐将距…

利用 Python 抓取数据探索汽车市场趋势

一、引言 随着全球对环境保护意识的增强和技术的进步&#xff0c;新能源汽车作为一种环保、高效的交通工具&#xff0c;正逐渐受到人们的关注和青睐。在这个背景下&#xff0c;对汽车市场的数据进行分析和研究显得尤为重要。 本文将介绍如何利用 Python 编程语言&#xff0c;结…

TypeScript08:在TS中使用模块化

前言&#xff1a;tsconfig.json中的配置 一、前端领域中的模块化标准 前端领域中的模块化标准有&#xff1a; ES6、commonjs、amd、umd、system、esnext 二、 TS中如何书写模块化语句 TS 中&#xff0c;导入和导出模块&#xff0c;统一使用 ES6 的模块化标准。 myModule.ts &a…

喜迎乔迁,开启新章 ▏易我科技新办公区乔迁庆典隆重举行

2024年1月18日&#xff0c;易我科技新办公区乔迁庆典在热烈而喜庆的氛围中隆重举行。新办公区的投入使用&#xff0c;标志着易我科技将以崭新姿态迈向新的发展阶段。 ▲ 易我科技新办公区 随着公司业务的不断发展和壮大&#xff0c;为了更好地适应公司发展的需要&#xff0c;…

AI智能分析网关V4:抽烟/打电话/玩手机行为AI算法及场景应用

抽烟、打电话、玩手机是人们在日常生活中常见的行为&#xff0c;但这些行为在某些场合下可能会带来安全风险。因此&#xff0c;对于这些行为的检测技术及应用就变得尤为重要。今天来给大家介绍一下TSINGSEE青犀AI智能分析网关V4抽烟/打电话/玩手机检测算法及其应用场景。 将监控…

StarRocks实战——贝壳找房数仓实践

目录 前言 一、StarRocks在贝壳的应用现状 1.1 历史的数据分析架构 1.2 OLAP选型 1.2.1 离线场景 1.2.2 实时场景 1.2.3 StarRocks 的引入 二、StarRocks 在贝壳的分析实践 2.1 指标分析 2.2 实时业务 2.3 可视化分析 三、未来规划 3.1 StarRocks集群的稳定性 3…

免费音频剪辑

在数字时代&#xff0c;音频剪辑已成为许多职业和爱好者不可或缺的技能。无论是制作播客、教育视频、还是进行广告宣传&#xff0c;高质量的音频剪辑都能为作品增色不少。今天&#xff0c;我要为大家强烈安利一款免费且功能强大的音频剪辑工具&#xff0c;它绝对是你办公桌上不…

虚拟机上为AzureDevOps Server 创建用户

为DevOpsServer创建登录用户 背景虚拟机的本地用户和组去DevOps Server上添加本地用户 背景 我们有一台虚拟机&#xff0c;然后在上面安装了一台Azure DevOps Server&#xff0c;然后我们创建几个登录用户。 虚拟机的本地用户和组 首先我们登陆到虚拟机&#xff0c;然后我们…

HTML5:七天学会基础动画网页4

backgorund-size 值与说明 length(单位像素):设置背景图片高度和宽度&#xff0c;第一个值设置宽度&#xff0c;第二个值设置高度&#xff0c;如果只给出一个值&#xff0c;第二个是设置为auto。 percentage(百分比):以父元素的百分比来设置背景图像的宽度和高度&#xff0c…