微信小程序:完善购物车功能,购物车主页面展示,详细页面展示效果

news/2025/2/25 23:02:53

一、效果图 

1、主页面

根据物品信息进行菜单分类,点击单项购物车图标添加至购物车,记录总购物车数量

2、购物车详情页

根据主页面选择的项,根据后台查询展示到页面,可进行多选,数量加减等

二、代码

1、主页面

页面展示顶部导航栏,侧边导航栏,以及导航栏执行下的内容,购物车的点击事件,内容单项的点击数量汇总到顶部总购物车总数量

wxml代码

<view class="main">
  <view class="topinfo">
    <view class="topinfo_view flex center">
      <view class="topinfo_model1 flex center">
        <view class="topinfo_model1_search">
          <image src="{{search}}"></image>
          <input type="text" placeholder="请输入" placeholder-style="color:#CCCCCC" bindconfirm="search_info" />
        </view>
      </view>
      <view class="topinfo_model2 flex center" >
        <view class="topinfo_model2_circle flex center" bind:tap="shoppingClick">
          <image src="{{ShoppingCarGreen}}" />
          <view class="red_single1 flex center" wx:if="{{shoppingAllCount > 0}}">{{shoppingAllCount}}</view>
        </view>
      </view>
    </view>
  </view>
  <view class="menu">
    <view class="top-menu flex between">
      <block wx:for="{{Menus}}" wx:key="index">
        <view class="topmenu-item flex center {{currentTopMenu === item.topname ? 'topactive' :''}}" data-menu="{{item.topname}}" bind:tap="onTopMenuClick">{{item.topname}}</view>
      </block>
    </view>
    <view class="top-content flex center" wx:if="{{!linenone}}">
      <view class="left-menu">
        <block wx:for="{{LeftMenus}}" wx:key="index">
          <view class="left-menu-item flex center {{currentLeftMenu === item.name ? 'leftactive' : ''}}" bindtap="onLeftMenuClick" data-menu="{{item.name}}">
            <view class="left {{currentLeftMenu === item.name ? 'leftactivegreen' : ''}}"></view>
            <text>{{item.name}}</text>
          </view>
        </block>
      </view>
      <view class="right-content">
        <block wx:for="{{RightInfo}}" wx:key="index">
          <view class="right-content-view flex">
            <view class="content-img flex center">
              <image src="{{item.img}}" mode="aspectFill"/>
            </view>
            <view class="content-info">
              <view class="cinfo-line flex between">
                <text>标题1:{{item.info1}}</text>
                <text>标题2:{{item.info2}}</text>
              </view>
              <view class="cinfo-line flex between">
                <text>标题3:{{item.info3}}</text>
                <text>标题4:{{item.info4}}</text>
              </view>
              <view class="cinfo-line flex between">标题5:{{item.info5}}</view>
              <view class="cinfo-line flex flex-end">
                <view class="green-btn flex center" data-id="{{item.id}}" bind:tap="singleSel">
                  <image src="{{ShoppingCarWhite}}" mode=""/>
                  <view class="red_single flex center" wx:if="{{item.isshopping}}">{{item.shoppingCount}}</view>
                </view>
              </view>
            </view>
          </view>
        </block>
      </view>
    </view>
    <view wx:else class="none">暂无数据</view>
  </view>
</view>

wxss代码

主要采用flex布局进行布局

page {
  background-color: #f5f5f5;
  font-size:95%;
}

.flex {
  display: flex;
}

.center {
  justify-content: center;
  align-items: center;
}
.left{
  position: absolute;
  left:0;
}
.flex-end{
  justify-content: flex-end;
}
.between {
  justify-content: space-between;
}

.none {
  text-align: center;
  margin-top: 50rpx;
  color: #969292;
}
/* 顶行搜索栏+购物车 */
/* 搜索框 */
.topinfo_view {
  padding: 4% 0 4% 0;
}

.topinfo_model1 {
  height: 60rpx;
  width: 85%;
}

.topinfo_model1_search {
  display: flex;
  align-items: center;
  height: 100%;
  width: 90%;
  border-radius: 10px;
  padding: 0 20rpx;
  background-color: #fff;
}

.topinfo_model1 image {
  height: 40rpx;
  width: 45rpx;
  margin-right: 10px;
}

.topinfo_view input {
  width: 100%;
}

/* 购物车 */
.topinfo_model2 {
  width: 12%;
  height: 60rpx;
}

.topinfo_model2_circle {
  width: 60rpx;
  height: 60rpx;
  background-color: #fff;
  border-radius: 50%;
  position:relative;
}

.topinfo_model2_circle image {
  width: 40rpx;
  height: 40rpx;
}

/* 顶部菜单栏 */
.menu {
  width: 100%;
}

.topmenu-item {
  width: 100%;
  padding-bottom: 5px;
  border-bottom: 3px solid #f5f5f5;
}

.topactive {
  border-bottom: 3px solid #4cc46b;
}

/* 主体内容 */
.top-content {
  height:83vh;
  padding:10px 0;
}

/* 左侧菜单栏 */
.left-menu {
  width: 25%;
  height:100%;
}
.leftactivegreen{
  width:5px;
  height:80%;
  background-color: #4cc46b;
}
.leftactive {
  background-color:#fff;
  color:#4cc46b;
}
.left-menu-item{
  height:50px;
  position:relative
}
.right-content {
  height:100%;
  width: 75%;
  font-size: 90%;
  background-color: #fff; 
  overflow-y: auto;
}
.right-content-view{
  border-bottom:3px solid #f6f6f6;
  width:100%;
  padding:2% 0;
}
.content-img {
  width: 30%;
  margin-right: 2px;
  /* border:1px solid black; */
}
.content-img image {
  width: 95%;
  height: 95%;
}
.content-info{
  width:65%;
}
.cinfo-line{
  width:100%;
  padding:2% 0;
}
.green-btn{
  background-color:#4cc46b ;
  width:50rpx;
  height:50rpx;
  border-radius: 5px;
  margin-top:-4%;
  position:relative;
}
.green-btn image{
  width:35rpx;
  height:35rpx;
}
.red_single{
  border:1px solid #fff;
  color:#fff;
  position:absolute;
  width:25rpx;
  height:25rpx;
  top:-15rpx; 
  right:-15rpx;
  border-radius: 50%;
  background-color: red;
  font-size: 10px;
} 
.red_single1{
  border:1px solid #fff;
  color:#fff;
  position:absolute;
  width:25rpx;
  height:25rpx;
  top:-12rpx; 
  right:-12rpx;
  border-radius: 50%;
  background-color: red;
  font-size: 10px;
} 

js代码

这里主要展示核心数据部分,详细可参考资源

Menus: [{
    topname: '顶部菜单1',
    leftMenus: [{
        name: '侧边菜单1',
        items: [{
            id: 1,
            info1: '11',
            info2: '22',
            info3: '33',
            info4: '44',
            info5: '55',
            img: '../img/process_2.png'
          },
          {
            id: 2,
            info1: '22',
            info2: '22',
            info3: '22',
            info4: '22',
            info5: '22',
            img: '../img/process_1.png'
          },
        ],
      },
      {
        name: '侧边菜单2',
        items: [{
          id: 3,
          info1: '33',
          info2: '33',
          info3: '33',
          info4: '33',
          info5: '33',
          img: '../img/process_3.png'
        }],
      },
    ]
  },
  {
    topname: '顶部菜单2',
    leftMenus: []
  },
  {
    topname: '顶部菜单3',
    leftMenus: [{
      name: '侧边菜单3',
      items: [{
        id: 4,
        info1: '44',
        info2: '44',
        info3: '44',
        info4: '44',
        info5: '44',
        img: '../img/process_2.png'
      }],
    }],
  },
  {
    topname: '顶部菜单4',
    leftMenus: [{
      name: '侧边菜单4',
      items: [{
        id: 5,
        info1: '55',
        info2: '55',
        info3: '55',
        info4: '55',
        info5: '55',
        img: '../img/process_1.png'
      }],
    }],
  },
],

2、购物车界面

主要完成页面的选中项的展示,根据主页页面传递的id参数可进行数据库的查询,这里没连接后端,所以直接展示的实例数据,循环出数据项后,可对数据项进行多选,数据加减等功能

wxml代码

实现页面

<view class="main">
  <view class="itemallinfo">
    <view class="item_info flex center" wx:for="{{allinfo}}" wx:key="index" data-id="{{item.id}}">
      <view class="item flex center">
        <view class="sel_checkbox flex center">
          <checkbox value="{{item.id}}" checked="{{item.checked}}" bindtap="handleSelectItem" data-id="{{item.id}}" />
        </view>
        <view class="info_image flex center">
          <image src="{{item.img}}" mode="aspectFill" />
        </view>
        <view class="info_content">
          <view class="info_line1">配件名称:{{item.name}}</view>
          <view class="info_line1">库存数量:{{item.stockQty}}{{item.uom}}</view>
          <view class="info_line1 flex flex-end numbtn">
            <view class="btn_minus flex center" bindtap="handleMinus" data-id="{{item.id}}">-</view>
            <input class="input_count" type="number" value="{{item.count}}" bindinput="handleInputChange" data-id="{{item.id}}" />
            <view class="btn_plus flex center" bindtap="handlePlus" data-id="{{item.id}}">+</view>
          </view>
        </view>
      </view>
    </view>
  </view>
  <view class="footer flex between">
    <view class="select_all flex center">
      <checkbox bindtap="handleSelectAll" checked="{{isAllSelected}}" /> 全选
    </view>
    <view class="bottom2 flex center">
      <view class="delete_btn surebtn flex center" bindtap="handleDelete">删除</view>
    </view>
    <view class="bottom3 flex center">
      <view class="submit_btn surebtn flex center" bindtap="handleSubmit">提交</view>
    </view>
  </view>
</view>

wxss代码

page {
  background-color: #f6f6f6;
  font-size: 90%;
}

.flex {
  display: flex;
}

checkbox {
  transform: scale(0.8);
}

.center {
  justify-content: center;
  align-items: center;
}

.flex-end {
  justify-content: flex-end;
  align-items: center;
}
.between{
  justify-content: space-between;
}

/* 列表内容 */
.item_info {
  width: 100%;
  padding: 5px 0;
}
.itemallinfo{
  padding:15px 0 100px 0;
}
.item {
  width: 95%;
  background-color: #fff;
  padding: 2% 0;
  border-radius: 5px;
  box-shadow: 3px 3px 3px rgb(0, 0, 0, 0.1);
}

.sel_radio {
  width: 12%;
}

radio {
  transform: scale(0.8);
}

.info_image {
  width: 20%;
}

.info_image image {
  width: 60px;
  height: 60px;
}

.info_content {
  width: 68%;
}

.info_line1 {
  margin: 2% 0;
}

.numbtn {
  height: 25px;
  align-items: stretch;
  padding-right:2%;
}

.btn_minus,
.btn_plus {
  border: 1px solid #c0c0c0;
  width: 30px;
  /* 设置按钮宽度 */
  height: 100%;
  cursor: pointer;
  /* 可选:设置鼠标指针样式 */
}

.input_count {
  border: 1px solid #c0c0c0;
  width: 50px;
  /* 设置输入框宽度 */
  text-align: center;
  margin: 0 -1px;
  height: 100%;
  border-right:0;
  border-left:0;
}

.footer {
  align-items: center;
  background-color: #fff;
  border-top: 1px solid #eee;
  position:fixed;
  width:100%;
  bottom:0;
  height:70px;
}
.select_all{
  height:100%;
  width:30%;
}
.bottom3,.bottom2{
  height:100%;
  width:35%;
}
.delete_btn {
  background-color: #bebebe;
  color: #fff;
}
.submit_btn {
  background-color: #f3454e;
  color: #fff;
}
.surebtn{
  border-radius: 5px;
  width:80%;
  height:30px;
}

js代码

这里主要展示核心数据部分,详细可参考资源

var allinfo = [{
    id: 1,
    info1: '11',
    info2: '22',
    info3: '33',
    info4: '44',
    info5: '55',
    img: '../img/process_2.png',
    count: 1,
    checked: false, // 默认未选中
  },
  {
    id: 3,
    info1: '33',
    info2: '33',
    info3: '33',
    info4: '33',
    info5: '33',
    img: '../img/process_3.png',
    count: 2,
    checked: false, // 默认未选中
  },
  {
    id: 5,
    info1: '55',
    info2: '55',
    info3: '55',
    info4: '55',
    info5: '55',
    img: '../img/process_1.png',
    count: 1,
    checked: false, // 默认未选中
  },
];


http://www.niftyadmin.cn/n/5866946.html

相关文章

Thinkphp6 安装Kafka扩展

安装PHP Kafka扩展 1、查询本机PHP版本信息 phpinfo() 查询信息&#xff0c;本机为PHP7.4.3,NTS 2、下载rdkafka扩展包 去rdkafka官网下载对应的扩展包&#xff0c;下载地址&#xff1a; https://pecl.php.net/package/rdkafka 下载对应的扩展包 3、配置服务 解压后&…

详细解析d3dx9_27.dll丢失怎么办?如何快速修复d3dx9_27.dll

运行程序时提示“d3dx9_27.dll文件缺失”&#xff0c;通常由DirectX组件损坏或文件丢失引起。此问题可通过系统化修复方法解决&#xff0c;无需重装系统或软件。下文将详细说明具体步骤及注意事项。 一.d3dx9_27.dll缺失问题的本质解析 当系统提示“d3dx9_27.dll丢失”时&…

Web to App:从 0 到 1,打造高效的 App 增长闭环

各位开发者朋友们&#xff0c;大家好&#xff01;我们专注于移动端的增长。今天跟大家分享一个非常实用的技术方案&#xff1a;Web to App。 Web to App&#xff0c;顾名思义&#xff0c;就是将 Web 端的流量引导至 App 端&#xff0c;从而实现用户增长。 这种方案在很多场景下…

Pytorch实现基于GAN的无监督图像纹理特征传输训练自己的数据集

简介 简介:利用Unet架构来构建生成器模型输出纹理特征图像,并设计了VGG19模型架构来构建纹理损失。利用多个低级VGG19的特征层计算均值和方差,并得到生成的纹理与真实纹理的差异性。并结合L1损失、对抗损失等共同训练。 论文题目:Unsupersived Image Texture Transfer Ba…

大模型WebUI:Gradio全解12——LangChain原理及其agent构建Gradio(1)

大模型WebUI:Gradio全解12——LangChain原理及其agent构建Gradio(1) 前言本篇摘要12. LangChain原理及其agent构建Gradio12.1 LangChain概念及优势分析12.1.1 概念12.1.2 标准化组件接口1. 示例:聊天模型2. 示例:检索器12.1.3 编排组件12.1.4 便于部署12.1.5 可观测性和评…

Http模块及练习

### 作业 1. 静态文件服务器 js const http await import(http) const fs await import(fs) const proc ((req,res)>{ let file ./public${req.url} let FilePath file.replace(favicon.ico,"") // 检查文件是否存在 if (!fs.existsSync(FilePa…

STM32基础篇(三)------滴答定时器

滴答定时器简介 SysTick定时器&#xff08;STK&#xff09; 处理器有一个24位系统定时器SysTick&#xff0c;它从重新加载值倒计时到零&#xff0c;在下一个时钟沿重新加载&#xff08;换行&#xff09;LOAD寄存器中的值&#xff0c;然后对后续时钟倒计时。当处理器暂停调试时&…

白帽黑客系列教程之Windows驱动开发(64位环境)入门教程(七)

为什么要写这篇文章呢&#xff1f; 作为一名白帽黑客&#xff0c;如果想要学习ROOTKIT攻防技术&#xff0c;就必须要有能力进行驱动开发&#xff01; 本文章仅提供学习&#xff0c;切勿将其用于不法手段&#xff01; 在Windows操作系统的64位环境中&#xff0c;进行ROOTKIT攻…