移动端商品详情页设计

效果图

代码如下

页面设计

 <div class="container"><!--商品详情 start--><van-image class="goods-item-image" :src="goods.goodsHeadImg"></van-image><div class="goods-price">¥<span>{{ goods.goodsPrice }}</span>.00起</div><div class="goods-name"><el-button round size="small">{{ goods.goodsBrand.goodsBrandName }}</el-button><span>{{ goods.goodsName }}</span><span>{{ goods.goodsCaption }}</span></div><div class="goods-sp"><div class="goods-sp-item" v-for="(specification,specificationIndex) in goods.specifications":key="specificationIndex"><div><span>{{ specification.goodsSpecificationName }}: </span><spanv-for="(goodsSpecificationOption,goodsSpecificationOptionIndex) in specification.goodsSpecificationOptions":key="goodsSpecificationOptionIndex">{{ goodsSpecificationOption.goodsSpecificationOptionName }} </span></div></div></div><div class="goods-introduction"><span>{{ goods.goodsIntroduction }}</span></div><div class="goods-images" v-for="(img,imgIndex) in goods.images" :key="imgIndex"><van-image class="goods-item-image" :src="img.goodsImageUrl"></van-image></div><!--商品详情 end--><!--底部导航 start--><van-action-bar style="margin-bottom: 50px "><van-action-bar-icon icon="chat-o" text="客服" badge="12"/><van-action-bar-icon icon="cart-o" text="购物车" dot/><van-action-bar-icon icon="shop-o" text="店铺" badge="5"/><van-action-bar-button type="warning" text="加入购物车" @click="onAddCartShow"/><van-action-bar-button type="danger" text="立即购买"/></van-action-bar><!--底部导航 end--><!--加入购物车弹出框 end--><van-popup v-model:show="showCart" position="bottom" closeable><div class="add-cart-show"><!--顶部 start--><div class="add-header"><van-image class="add-goods-img" radius="10" :src="goods.goodsHeadImg"></van-image><div class="add-goods-price">¥<span>{{ goods.goodsPrice }}</span></div></div><!--顶部 end--><!--地址 start--><AddressList class="add-address"/><!--地址 end--><!--规格 start--><div class="add-goods-specification"><span>颜色分类</span></div><!--规格 end--><!--底部 start--><el-button class="button" size="large" color="#ff9003" round @click="onAddCart">加入购物车</el-button><!--底部 end--></div></van-popup><!--加入购物车弹出框 end--></div>

逻辑编写

<script setup>
import {onMounted, reactive, ref} from "vue";
import axios from "@/utils/request"
import {useRoute} from "vue-router"
import {useDataStore} from "../../stores/dataStore"
import {ElMessage} from "element-plus";
import AddressList from "../../components/AddressList/Index.vue"const dataStore = useDataStore()const route = useRoute()
//加入购物车弹出框控制器
const showCart = ref(false)
//商品id
const goodsId = route.params.name
//商品数据
const goods = reactive({goodsId: "",goodsHeadImg: "",goodsName: "",goodsCaption: "",goodsPrice: "",goodsIntroduction: "",goodsUse: "",goodsBrand: "",goodsType1: "",goodsType2: "",goodsType3: "",images: "",specifications: ""
})
onMounted(() => {ElMessage.success("成功")axios.get("front/goods/findDesc", {params: {goodsId: goodsId}}).then(res => {if (res.data.code == 200) {goods.goodsId = res.data.data.goodsIdgoods.goodsHeadImg = res.data.data.goodsHeadImggoods.goodsName = res.data.data.goodsNamegoods.goodsCaption = res.data.data.goodsCaptiongoods.goodsPrice = res.data.data.goodsPricegoods.goodsIntroduction = res.data.data.goodsIntroductiongoods.goodsUse = res.data.data.goodsUsegoods.goodsBrand = res.data.data.goodsBrandgoods.goodsType1 = res.data.data.goodsType1goods.goodsType2 = res.data.data.goodsType2goods.goodsType3 = res.data.data.goodsType3goods.images = res.data.data.imagesgoods.specifications = res.data.data.specifications}})
})
/*** 加入购物车弹出框*/
const onAddCartShow = () => {showCart.value = true
}
/*** 加入购物车*/
const onAddCart = () => {axios.post("front/cart/addGoodsCart", {userId: dataStore.userId,goodsId: goodsId,goodsHeadImg: goods.goodsHeadImg,goodsName: goods.goodsName,goodsPrice: goods.goodsPrice,num: 1,}).then(res => {if (res.data.code == 200) {showCart.value = false}})
}</script>

css设计

<style scoped>
.container {background-color: #ffffff;
}/**
商品数据样式*/
.goods-price {margin-top: 10px;color: #ff4142;
}.goods-price span {font-style: normal;font-family: JDZH-Regular, sans-serif;display: inline-block;font-size: 22px;font-weight: 500;line-height: normal;color: #f44d0b;
}.goods-name {font-size: 21px;color: #181818;font-family: JDZH-Regular, sans-serif;
}.goods-name button {margin: 4px;display: inline;color: #fdfdff;font-weight: 400;background-color: #fe012d;
}.goods-sp {background-color: #f7f7f7;border-radius: 2%;margin-top: 10px;margin-bottom: 10px;
}.goods-sp-item {padding: 8px;
}.goods-sp-item span {font-size: 12px;font-weight: bold;
}.goods-introduction {background-color: #f7f7f7;font-size: 12px;margin-top: 10px;margin-bottom: 10px;
}.goods-introduction span {padding: 10px;
}.goods-name span {margin-left: 5px;font-size: 16px;font-weight: bold;
}/*加入购物车弹出框样式*/
.add-cart-show {height: 500px;
}.add-cart-show button {position: fixed;bottom: 10px;left: 10px;width: 350px;color: #faf7e7;font-weight: 700;
}.add-header {display: flex;position: fixed;left: 10px;top: 70px;z-index: 100;background-color: #ffffff;}.add-goods-img {margin: 10px;width: 80px;
}.add-goods-price {margin-left: 20px;margin-top: 35px;color: #ff4142;font-size: 15px;
}.add-goods-price span {font-style: normal;font-family: JDZH-Regular, sans-serif;display: inline-block;font-size: 32px;font-weight: 500;line-height: normal;color: #f44d0b;
}.add-address {margin-top: 110px;
}.add-goods-specification {margin-top: 20px;
}
</style>

全部代码

<template><div class="container"><!--商品详情 start--><van-image class="goods-item-image" :src="goods.goodsHeadImg"></van-image><div class="goods-price">¥<span>{{ goods.goodsPrice }}</span>.00起</div><div class="goods-name"><el-button round size="small">{{ goods.goodsBrand.goodsBrandName }}</el-button><span>{{ goods.goodsName }}</span><span>{{ goods.goodsCaption }}</span></div><div class="goods-sp"><div class="goods-sp-item" v-for="(specification,specificationIndex) in goods.specifications":key="specificationIndex"><div><span>{{ specification.goodsSpecificationName }}: </span><spanv-for="(goodsSpecificationOption,goodsSpecificationOptionIndex) in specification.goodsSpecificationOptions":key="goodsSpecificationOptionIndex">{{ goodsSpecificationOption.goodsSpecificationOptionName }} </span></div></div></div><div class="goods-introduction"><span>{{ goods.goodsIntroduction }}</span></div><div class="goods-images" v-for="(img,imgIndex) in goods.images" :key="imgIndex"><van-image class="goods-item-image" :src="img.goodsImageUrl"></van-image></div><!--商品详情 end--><!--底部导航 start--><van-action-bar style="margin-bottom: 50px "><van-action-bar-icon icon="chat-o" text="客服" badge="12"/><van-action-bar-icon icon="cart-o" text="购物车" dot/><van-action-bar-icon icon="shop-o" text="店铺" badge="5"/><van-action-bar-button type="warning" text="加入购物车" @click="onAddCartShow"/><van-action-bar-button type="danger" text="立即购买"/></van-action-bar><!--底部导航 end--><!--加入购物车弹出框 end--><van-popup v-model:show="showCart" position="bottom" closeable><div class="add-cart-show"><!--顶部 start--><div class="add-header"><van-image class="add-goods-img" radius="10" :src="goods.goodsHeadImg"></van-image><div class="add-goods-price">¥<span>{{ goods.goodsPrice }}</span></div></div><!--顶部 end--><!--地址 start--><AddressList class="add-address"/><!--地址 end--><!--规格 start--><div class="add-goods-specification"><span>颜色分类</span></div><!--规格 end--><!--底部 start--><el-button class="button" size="large" color="#ff9003" round @click="onAddCart">加入购物车</el-button><!--底部 end--></div></van-popup><!--加入购物车弹出框 end--></div>
</template><script setup>
import {onMounted, reactive, ref} from "vue";
import axios from "@/utils/request"
import {useRoute} from "vue-router"
import {useDataStore} from "../../stores/dataStore"
import {ElMessage} from "element-plus";
import AddressList from "../../components/AddressList/Index.vue"const dataStore = useDataStore()const route = useRoute()
//加入购物车弹出框控制器
const showCart = ref(false)
//商品id
const goodsId = route.params.name
//商品数据
const goods = reactive({goodsId: "",goodsHeadImg: "",goodsName: "",goodsCaption: "",goodsPrice: "",goodsIntroduction: "",goodsUse: "",goodsBrand: "",goodsType1: "",goodsType2: "",goodsType3: "",images: "",specifications: ""
})
onMounted(() => {ElMessage.success("成功")axios.get("front/goods/findDesc", {params: {goodsId: goodsId}}).then(res => {if (res.data.code == 200) {goods.goodsId = res.data.data.goodsIdgoods.goodsHeadImg = res.data.data.goodsHeadImggoods.goodsName = res.data.data.goodsNamegoods.goodsCaption = res.data.data.goodsCaptiongoods.goodsPrice = res.data.data.goodsPricegoods.goodsIntroduction = res.data.data.goodsIntroductiongoods.goodsUse = res.data.data.goodsUsegoods.goodsBrand = res.data.data.goodsBrandgoods.goodsType1 = res.data.data.goodsType1goods.goodsType2 = res.data.data.goodsType2goods.goodsType3 = res.data.data.goodsType3goods.images = res.data.data.imagesgoods.specifications = res.data.data.specifications}})
})
/*** 加入购物车弹出框*/
const onAddCartShow = () => {showCart.value = true
}
/*** 加入购物车*/
const onAddCart = () => {axios.post("front/cart/addGoodsCart", {userId: dataStore.userId,goodsId: goodsId,goodsHeadImg: goods.goodsHeadImg,goodsName: goods.goodsName,goodsPrice: goods.goodsPrice,num: 1,}).then(res => {if (res.data.code == 200) {showCart.value = false}})
}</script><style scoped>
.container {background-color: #ffffff;
}/**
商品数据样式*/
.goods-price {margin-top: 10px;color: #ff4142;
}.goods-price span {font-style: normal;font-family: JDZH-Regular, sans-serif;display: inline-block;font-size: 22px;font-weight: 500;line-height: normal;color: #f44d0b;
}.goods-name {font-size: 21px;color: #181818;font-family: JDZH-Regular, sans-serif;
}.goods-name button {margin: 4px;display: inline;color: #fdfdff;font-weight: 400;background-color: #fe012d;
}.goods-sp {background-color: #f7f7f7;border-radius: 2%;margin-top: 10px;margin-bottom: 10px;
}.goods-sp-item {padding: 8px;
}.goods-sp-item span {font-size: 12px;font-weight: bold;
}.goods-introduction {background-color: #f7f7f7;font-size: 12px;margin-top: 10px;margin-bottom: 10px;
}.goods-introduction span {padding: 10px;
}.goods-name span {margin-left: 5px;font-size: 16px;font-weight: bold;
}/*加入购物车弹出框样式*/
.add-cart-show {height: 500px;
}.add-cart-show button {position: fixed;bottom: 10px;left: 10px;width: 350px;color: #faf7e7;font-weight: 700;
}.add-header {display: flex;position: fixed;left: 10px;top: 70px;z-index: 100;background-color: #ffffff;}.add-goods-img {margin: 10px;width: 80px;
}.add-goods-price {margin-left: 20px;margin-top: 35px;color: #ff4142;font-size: 15px;
}.add-goods-price span {font-style: normal;font-family: JDZH-Regular, sans-serif;display: inline-block;font-size: 32px;font-weight: 500;line-height: normal;color: #f44d0b;
}.add-address {margin-top: 110px;
}.add-goods-specification {margin-top: 20px;
}
</style>

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

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

相关文章

Docker consul容器服务更新与发现

Docker consul容器服务更新与发现 一、什么事服务注册与发现二、什么是consul三、consul部署1、consul服务器2、registrator服务器3、consul-template 一、什么事服务注册与发现 服务注册与发现是微服务架构中不可或缺的重要组件。起初服务都是单节点的&#xff0c;不保障高可…

ROS-Moveit机械臂追踪二维码(四)

ROS-Moveit机械臂追踪二维码(四) 在仿真环境增加相机 <gazebo reference"camera_depth_frame"><sensor name"camera1" type"depth"><always_on>true</always_on><update_rate>20.0</update_rate><came…

KnowStreaming系列教程第二篇——项目整体架构分析

一、KS项目代码结构&#xff1a; ks项目代码结构如上&#xff1a; (1)km-console 是前端部分&#xff0c;基于React开发 (2)km-rest 是后端部分&#xff0c;主要是接受前端请求&#xff0c;对应controller相关代码所在模块 (3)km-biz:业务逻辑处理 (4)km-core:核心逻辑 (5…

(学习笔记-IP)IP协议相关技术

DNS 我们在上网的时候&#xff0c;通常使用的方式是域名&#xff0c;而不是IP地址&#xff0c;因为域名方便人类记忆。 那么实现这一技术的就是DNS域名解析器&#xff0c;DNS可以将域名网址自动转换为具体的IP地址。 域名的层级关系 DNS中的域名都是用句点来分隔的&#xff0…

Java_23_并发包

并发包 并发包的来历&#xff1a; 在实际开发中如果不需要考虑线程安全问题&#xff0c;大家不需要做线程安全&#xff0c;因为如果做了反而性能不好&#xff01; 但是开发中有很多业务是需要考虑线程安全问题的&#xff0c;此时就必须考虑了。否则业务出现问题。 Java为很多业…

RNN架构解析——传统RNN模型

目录 传统RNN的内部结构图使用RNN优点和缺点 传统RNN的内部结构图 使用RNN rnnnn.RNN(5,6,1) #第一个参数是输入张量x的维度&#xff0c;第二个是隐藏层维度&#xff0c;第三层是隐藏层的层数 input1torch.randn(1,3,5) #第一个是输入序列的长度&#xff0c;第二个是批次的样本…

Golang指针详解

要搞明白Go语言中的指针需要先知道3个概念&#xff1a;指针地址、指针类型和指针取值。 指针介绍 我们知道变量是用来存储数据的&#xff0c;变量的本质是给存储数据的内存地址起了一个好记的别名。比如我们定义了一个变量 a : 10 ,这个时候可以直接通过 a 这个变量来读取内存…

在centos 7系统docker上构建mysql 5.7

一、VM上已经安装centos 7.9&#xff0c;且已完成docker的构建 二、安装mysql5.7 安装镜像&#xff1a;[rootlocalhost lll]# docker pull mysql:5.7 查看镜像[rootlocalhost lll]# docker images 根据镜像id构建mysql容器&#xff0c;且分配端口号[rootlocalhost lll]# dock…

JVM(Java Virtual Machine)

哥几个来学 JVM 啦~~ 目录 &#x1f332;一、JVM 执行流程&#xff08; JVM 是如何运行的&#xff1f;&#xff09; &#x1f333;二、JVM 运行时数据区 &#x1f366;1. 堆&#xff08;线程共享&#xff09; &#x1f367;2. Java 虚拟机栈&#xff08;线程私有&#xff0…

关于我组件家庭服务器,挑选硬件设备的经历

目录 起因 升级——玩客云 原因 折腾日记 又升级——d2550工控主机 原因 折腾日记 又双升级——itx主机 原因 折腾日记 又双叒升级&#xff08;目前再用的机器&#xff09;——i9级x99平台e5v3主机 原因 折腾日记 心得 起因 起因大概在今年三月底四月初的时候&…

DuckDB全面挑战SQLite

概要 当我们想要在具有嵌入式数据库的本地环境中工作时&#xff0c;我们倾向于默认使用 SQLite。虽然大多数情况下这都很好&#xff0c;但这就像骑自行车去 100 公里之外&#xff1a;可能不是最好的选择。 这篇文章中将讨论以下要点&#xff1a; • DuckDB 简介&#xff1a;它…

uniapp WIFI上下班打卡

大纲 &#x1f959; uniapp官网&#xff1a;uni-app官网 &#x1f959; WIFI功能模块&#xff1a; 1、下载 wifi 插件 uni-WiFi 2、在 manifest.json 中 App权限配置中 配置权限 1. ACCESS_WIFI_STATE &#xff08;访问权限状态&#xff09; 2. CHANGE_WIFI_STATE&#xff…

SpringBoot整合ActiveMQ

ActiveMQ简单使用 JMS ActiveMQ 下载安装 https://activemq.apache.org/components/classic/download/解压缩文件。进入win64目录&#xff0c;双击运行activemq.bat文件&#xff0c;运行服务 将下面的网址输入到浏览器&#xff0c;用户名和密码都是admin SpringBoot整合Act…

外贸行业企业邮箱选择:安全好用的邮箱服务

随着全球化的发展&#xff0c;外贸行业在全球经济中越来越重要。作为一家从事对外贸易的企业&#xff0c;可靠、安全、易用的邮箱系统对于成功的国际交易至关重要。为您的企业选择正确的邮箱解决方案可能是一个挑战。为了使选择过程更加简化&#xff0c;我们在这里提供了一些提…

异构线程池的c++实现方案

概要 通常线程池是同质的&#xff0c;每个线程都可以执行任意的task&#xff08;每个线程中的task顺序执行&#xff09;&#xff0c;如下图所示&#xff1a; 但本文所介绍的线程和task之间有绑定关系&#xff0c;如A task只能跑在A thread上&#xff08;因此称为异构线程池&am…

2023云曦期中复现

目录 SIGNIN 新猫和老鼠 baby_sql SIGNIN 签到抓包 新猫和老鼠 看到反序列化 来分析一下 <?php //flag is in flag.php highlight_file(__FILE__); error_reporting(0);class mouse { public $v;public function __toString(){echo "Good. You caught the mouse:&…

Apache pulsar 技术系列-- 消息重推的几种方式

导语 Apache Pulsar 是一个多租户、高性能的服务间消息传输解决方案&#xff0c;支持多租户、低延时、读写分离、跨地域复制&#xff08;GEO replication&#xff09;、快速扩容、灵活容错等特性。在很多场景下&#xff0c;用户需要通过 MQ 实现消息的重新推送能力&#xff0c…

Python+Playwright自动化测试--标签页操作(tab)

1.简介 标签操作其实也是基于浏览器上下文&#xff08;BrowserContext&#xff09;进行操作的&#xff0c;而且宏哥在之前的BrowserContext也有提到过&#xff0c;但是有的童鞋或者小伙伴还是不清楚怎么操作&#xff0c;或者思路有点模糊&#xff0c;因此今天单独来对其进行讲…

nvidia-smi输出的结果代表什么

nvidia-smi(NVIDIA System Management Interface) 是基于nvml的gpu的系统管理接口,主要用于显卡的管理和状态监控。 nvidia-smi简称NVSMI&#xff0c;提供监控GPU使用情况和更改GPU状态的功能&#xff0c;是一个跨平台工具&#xff0c;支持所有标准的NVIDIA驱动程序支持的Linu…

【RS】基于规则的面向对象分类

ENVI使用最多的工具就是分类&#xff0c;这也是很多卫星影像的用途。在ENVI中有很多分类工具&#xff0c;如最基础的监督分类&#xff08;最大似然法、最小距离、支持向量机、随机森林&#xff09;、非监督分类&#xff08;K-means、IsoData&#xff09;&#xff0c;还有面向对…