【微信小程序】商品管理-微信小程序项目开发入门

news2024/12/24 2:17:01

有个人家开店,店里商品堆积越来越多,多了就不好管理了,那有没有想过需要类似于商品管理的一套小程序呢,这里给大家提供一个容易上手的商品管理微信小程序解决方案,非常适合新手学习入门。

先说明一下这里讲得是一个微信小程序项目,非常适合熟悉使用微信开发工具开发的同学阅读。

一. 流程图

这是在微信的扫码功能基础上开发的,主要功能类似于仓库管理,有清单结算,先看如下流程图,之后的拓展应用可以根据自己的需求改动项目源码添加。

Created with Raphaël 2.3.0 开始 扫条形码 扫到? 商品信息加入清单 结算? 更新剩余数量,结算记录到账单 退出? 保存账单和商品数据 结束 清空清单 录入到商品 yes no yes no yes no

二. 展示数据

想好了小程序页面需要展示的哪些数据,然后细分,分别为清单页,账单页,商品页,展示数据模型,如下图所示

清单
名称
数量
单价
条形码
账单
商品列表
总数
总价
商品
名称
数量
单价
条形码
货位号
入库时间

三. 页面设计

理解清楚了,那么接下来,打开微信开发者工具,新建一个项目,选择小程序,逻辑代码就选Javascript,项目创建好后,只需要做四个页面就好,在小程序项目的app.json文件里,参考如下代码中的pages展开的四个页面路径,

在做页面之前,需要在中添加一段代码,代码如下,展开的tabBar就是添加页面底部展示的分页选项卡,

{
  "pages": [
    "pages/index/index",
    "pages/bill/bill",
    "pages/goods/goods",
    "pages/edit/edit",
    //...
  ],
  "window": {
    "navigationBarTitleText": "商品管理",
    //...
  },
  //...
  "tabBar": {
    "list": [
      {
        "text": "清单",
        "pagePath": "pages/index/index",
        "iconPath": "static/icon/dingdan.png",
        "selectedIconPath": "static/icon/dingdan2.png"
      },
      {
        "text": "账单",
        "pagePath": "pages/bill/bill",
        "iconPath": "static/icon/qupiao.png",
        "selectedIconPath": "static/icon/qupiao2.png"
      },
      {
        "text": "商品",
        "pagePath": "pages/goods/goods",
        "iconPath": "static/icon/yinhangka.png",
        "selectedIconPath": "static/icon/yinhangka2.png"
      }
    ]
  }
}

1. 清单页

清单页index.wxml是扫码添加商品的列表页面,类似于购物车,也是用扫码枪记录的待结算商品清单,它的布局大致如下图所示,有两个按钮,一个扫码,另一个结算。
在这里插入图片描述

2. 修改页

商品修改页edit.wxml,就是添加或修改商品信息的页面,用表单组件布局就可以,如下图所示,如果是添加商品,底下按钮是会变成添加按钮的
在这里插入图片描述

3. 账单页

账单页bill.wxml,是记录结算产生的账单的列表展示页面,方便自己核实账单,它的布局大致如下图所示
在这里插入图片描述

4. 商品页

商品页goods.wxml,是展示商品列表的,也是仓库的展示页面,它的布局大致如下图所示,如果商品太多,就点列表头部的搜索,方便找到
请添加图片描述

四. 页面逻辑

页面的逻辑其实很简单,如果按照之前做的流程图一路写下来,就会发现写得逻辑代码越来越多,就需要及时处理分离开,减少相互影响,把所有页面需要用到的公共变量放一个全局变量中,就在项目app.js文件里的globalData去添加,参考代码如下

// app.js
App({
  onLaunch() {
    //如果是开发环境,就假设一些数据用于测试
    const { platform } = wx.getSystemInfoSync();
    if (platform=='devtools') {
      //...
    } else {      
      // 展示本地存储能力
      const { goods, logs } = uni.getStorageSync(...);
    }
  },
  //不用前保存数据缓存
  onHide(){
  	//...
    wx.setStorage({...})
  },
  globalData: {
    goods:[],//商品
    bills:[],//账单
  },
})

1. 清单页

清单的页面逻辑index.js,就是管理列表的增删改简单逻辑了,还有扫码和结算的逻辑需要写,代码如下,

// index.js
// 获取应用实例
const App = getApp()

Page({
  data: {
    list:[],
    count:0,
    sum:0.00,
  },
  //打开小程序会首先加载第一个页面,这里写初始化
  onLoad() {
	//将全局变量中的goods复制一份给list,用于显示清单列表
	//注意这里仅限测试用,在正式场景这里list是个空数组,无需关心
    let list = App.globalData.goods.map(g=>{...});
    this.reloadList(list);
  },
  //按钮点击事件
  onclick(e){
    const { com } = e.currentTarget.dataset;
    switch(com){
      case 'calc'://结算按钮被点击
        {
          const { count, sum, list } = this.data;
          //...省略了处理结算的逻辑
          wx.showToast({
            title:'结算完成',
            icon:'success',
            success:()=>{    
              this.setData({
                list:[],
                count:0,
                sum:0.00
              });
            }
          });
          break;
        }
      case 'scan'://扫码按钮被点击
        {
          wx.scanCode({
            onlyFromCamera: true,
            scanType:['barCode'],
            success:(res)=>{
              const { result } = res;
              let goods = {
                name:'',
                code:result,
                price:1.00,
                count:1,
                unit:0,
                no:''
              };
              const { goods:gGoods } = App.globalData;
              let index=gGoods.findIndex(g=>g.code==goods.code);
              if(index<0){
                wx.showModal({
                  title:'系统提示',
                  content:'商品不存在,是否先录入库?',
                  success: (res) => {
                    if(!res.confirm) return;
                    this.addAndEditGoods(goods,index,(res)=>{
                      //...省略添加逻辑
                      wx.showToast({
                        title:'已入库',
                        icon:'success',
                        success() {}
                      });
                    });
                  }
                });
                return;
              }
              const { list } = this.data;
              let count=goods.count;
              //...省略处理数量的逻辑
              if(gGoods[index].count<count){
                wx.showModal({
                  title:'系统提示',
                  content:'此商品剩余数量不足,请及时补充',
                  showCancel:false,
                  success: (res) => {}
                })
              }
              //...省略处理添加或者更新的逻辑
              this.reloadList(list);
            },
            fail:(err)=>{...}
          })
          break;
        }
    }
  },
  //清单列表项点击事件
  onclickitem(e){
    const { index } = e.currentTarget.dataset;
    wx.showActionSheet({
      itemList: ['1.删除','2.修改'],
      success:(res)=>{
        const { list } = this.data;
        switch(res.tapIndex){
          case 0://删除后重新加载列表
            list.splice(index,1);
            this.reloadList(list);
            break;
          case 1://修改后重新加载列表
            this.addAndEditGoods(list[index],index,(res)=>{
              //...省略更新的逻辑
              this.reloadList(list);
            });
            break;
        }
      }
    })
  },
  //重新加载列表
  reloadList(list){
    this.setData({
      list,
      count:list.reduce((pre,cur)=>pre+=cur.count,0),
      sum:list.reduce((pre,cur)=>pre+=cur.count*cur.price,0)
    });
  },
  //添加或者修改商品信息的
  addAndEditGoods(goods,index=-1,success){
  	//打开修改商品信息的页面,参数index默认-1表示为添加商品模式
    wx.navigateTo({
      url: '/pages/edit/edit',
      events:{
        success:(res)=>{
          if(!res.goods) return;
          success(res);//添加或者修改后就调用回调success方法处理最后的任务
        }
      },
      success:(res)=>res.eventChannel.emit('msg',{index,goods}),//打开页面后传参数
    })
  }
})

代码是有点多,尽量省略了,在方法reloadList()里,结算时用到了数组的函数reduce(),写够一行就能算出总数,或者总金额,只要正确理解它就发现很好用,不用再写好几行代码,学到了吗

2. 修改页面

修改商品页面edit.js,逻辑很简单把,就处理表单和初始化和提交修改就可以

// pages/edit/edit.js
Page({

  /**
   * 页面的初始数据
   */
  data: {
    index:-1,
    //...
    result:null,
  },

  /**
   * 生命周期函数--监听页面加载
   */
  onLoad(options) {
    this.getOpenerEventChannel().once('msg',res=>{
      const { index, goods:g } = res;
      this.index=index;
      //得到传递过来的参数,初始化表单数据
      this.setData({...});
    })
  },

  /**
   * 生命周期函数--监听页面卸载
   */
  onUnload() {
  	//当页面关闭了,就返回结果
    this.getOpenerEventChannel().emit('success',{
      index:this.data.index,
      goods:this.data.result
    });
  },

  onsubmit(e){
    const { value } = e.detail;
    //...这里省略处理表单提交的信息
    this.data.result = value;
    wx.navigateBack()
  }
})

3. 账单页面

账单页面的逻辑bill.js,只处理显示列表就可以,如果需要,可以添加一个点击删除事件处理

// pages/bill/bill.js
const App = getApp();
Page({

  /**
   * 页面的初始数据
   */
  data: {
    list:[],
  },

  /**
   * 页面相关事件处理函数--监听用户点击底部选项卡动作
   */
  onTabItemTap(e){
    let list = App.globalData.bills;
    this.setData({
      list
    });
  },

  onclickitem(e){
    const { index } = e.currentTarget.dataset;
    wx.showActionSheet({
      itemList: ['1.删除'],
      success:(res)=>{
        switch(res.tapIndex){
          case 0:
            this.data.list.splice(index,1);
            this.onTabItemTap();
            break;
        }
      }
    })
  }
})

4. 商品页面

商品页面的逻辑goods.js,是一个操作列表的相关逻辑,比之前的要复杂一点,多了一个查询的逻辑,来看看怎么写得

// pages/goods/goods.js
const App = getApp();
Page({

  /**
   * 页面的初始数据
   */
  data: {
    count:0,
	sum:0.00,
    fList:App.globalData.goods,
  },

  /**
   * 监听页面的搜索按钮点击
   */
  onsubmit(e){
    const { kw } = e.detail.value;
    this.reloadList(kw);
  },

  /**
   * 页面相关事件处理函数--监听用户点击底部选项卡动作
   */
  onTabItemTap(e){
    this.reloadList();
  },

  reloadList(kw=''){
    //...省略搜索过滤处理的逻辑
    this.setData({...})
  },

  onclickitem(e){
    const { index } = e.currentTarget.dataset;
    wx.showActionSheet({
      itemList: ['1.删除','2.修改'],
      success:(res)=>{
        const { fList:goods } = this.data;
        switch(res.tapIndex){
          case 0:
            goods.splice(index,1);
            this.reloadList();
            break;
          case 1:
            wx.navigateTo({
              url: '/pages/edit/edit',
              events:{
                success:(res)=>{
                  if(!res.goods) return;
                  //...省略更新处理的逻辑
                  this.reloadList();
                }
              },
              success:(res)=>res.eventChannel.emit('msg',{index,goods:goods[index]})
            });
            break;
        }
      }
    })
  }
})

就讲到这里,最后给看一下项目的整个目录截图,如下图所示,

  • 小程序项目
    • components …自定义组件文件夹
      • num-money …处理金额两位小数显示的
      • time-tostring …处理时间格式显示的
    • pages …页面文件夹
      • bill … 账单页面文件夹
      • edit …修改页面文件夹
      • goods …商品页面文件夹
      • index …清单页面文件夹
    • static …图标资源文件夹
      • icon …存放一些图标文件的
    • utils …公用函数文件夹
      • common.wxs …这是页面模板公用的处理方法文件,例如数量单位转换
    • app.js …小程序入口的逻辑文件
    • app.json …小程序主要配置文件
    • app.wxss …小程序主要样式文件
    • …其它一些文件由微信开发者工具创建项目时生成,一般不用管

整个项目写得文件不是很多的,能看懂吧,应该适合新手研究学习,上面只是展示了重要代码部分,方便理解,还有相关的页面布局wxml文件和样式wxss文件怎样弄,还有用到的自定义组件怎么写,都写在项目源码里的,在这里就不贴上去了,文章不能写得过长哈,

如有需要完整项目源码的就去本作者的资源一栏查找相关的项目源码(下载点这里)下载即可,如遇到什么问题请留言,得到答复可能会慢很多,谢谢理解!

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

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

相关文章

《python 数据可视化基础》第三章 散点图 scatter

第三章 散点图 scatter 参考自官方文档&#xff1a;https://matplotlib.org/stable/api/_as_gen/matplotlib.axes.Axes.scatter.html#matplotlib.axes.Axes.scatter matplotblib 绘制散点图常用参数&#xff1a; x, y&#xff1a;一个或者多个点的位置&#xff1b;s&#xff1…

Halcon快速入门

前言一&#xff0c;HALCON 概述1.1&#xff0c;HALCON 安装二&#xff0c;HALCON 架构 2.1&#xff0c;算子 2.1.1&#xff0c;参数和数据结构 2.2&#xff0c;拓展包2.3&#xff0c;接口 2.3.1&#xff0c;HALCON-Python 接口2.3.2&#xff0c;HALCON-C 接口2.3.3&#xff0c;…

[附源码]Python计算机毕业设计SSM家政服务预约小程序(程序+LW)

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

开源版商城源码V2.0【小程序 + H5+ 公众号 + APP】

内容目录一、详细介绍二、效果展示1.部分代码2.效果图展示三、学习资料下载一、详细介绍 这是一款轻量级、高性能、前后端分离的电商系统&#xff0c;&#xff0c;支持微信小程序 H5 公众号 APP&#xff0c;前后端源码完全开源&#xff0c;看见及所得&#xff0c;完美支持二…

[附源码]Python计算机毕业设计SSM家政服务管理系统(程序+LW)

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

vue中的h函数与JSX语法

vue不仅像react一样实现了jsx&#xff0c;而且还借助jsx发挥了javascript动态画的优势&#xff0c;了解学习jsx可以让你更灵活的开发需求。 一、 h函数 在聊vue中的JSX之前&#xff0c;需要简单介绍一下 h 函数&#xff0c;理解了 h 函数&#xff0c;会更好的理解JSX。 1.h函…

[附源码]计算机毕业设计基于Springboot作业管理系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

WebLogic JVM Core dumps文件的生成控制

一&#xff0c;背景 当我们运行的WebLogic JVM发生Fatal Error时&#xff0c;会造成JVM crash掉&#xff0c;进而造成进程终止。一般来说crash的时间我们是无法估计在什么时候的&#xff0c;它具有很大的偶然性&#xff0c;因此理论上有时我们希望自动产生Core dump文件来提供…

figma有哪些快速入门的好用技巧

使用Figma在创建设计系统或处理大型设计项目时&#xff0c;总会涉及批量修改.快速定位.自动布局问题&#xff0c;MarcAndrew这篇文章分享了技巧&#xff0c;可以大大提高设计效率&#xff0c;希望对大家有所帮助: 在这篇文章中&#xff0c;我列出了一些快速简单的方法来帮助你…

YoLo V3 SPP u模型的讲解与总结

一。mosaic图像增强 其实就是将多张图片给汇总到一起&#xff0c;在源码当中就是默认使用4张图片进行拼接&#xff0c;进行预测。 优点&#xff1a; 增加数据的多样性增加目标个数BN能一次性统计多张图片的参数&#xff08;变相的增加了&#xff0c;输入一张图片其实就已经包…

Java agent 使用详解

一、前言 于一个即将上线的应用来说&#xff0c;系统监控是必不可少的&#xff0c;为什么需要监控呢&#xff1f;应用是跑在服务器上的&#xff0c;应用在运行过程中会发生各自意想不到的问题&#xff0c;像大家熟知的OOM&#xff0c;mysql故障&#xff0c;服务器宕机&#xff…

Mac docker-desktop 安装单机版k8s

文章目录01 引言02 下载安装docker desktop03 安装k8s04 安装k8s控制台&#xff08;k8s dashboard&#xff09;05 更方遍的方式安装dashboard01 引言 本文主要讲解在Mac下使用docker-desktop来安装k8s。 02 下载安装docker desktop 下载地址&#xff1a;https://www.docker.…

实例方法定义语法(四)

那么什么是方法呢&#xff1f; Java方法是语句的集合&#xff0c;它们在一起执行一个功能。 方法是解决一类问题的步骤的有序组合 方法包含于类或对象中 方法在程序中被创建&#xff0c;在其他地方被引用 1.方法的定义 类的方法定义类的某种行为或者功能。 方法定义的语法…

Allegro如何设置丝印位号优先显示操作指导

Allegro如何设置丝印位号优先显示操作指导 Allegro支持让丝印位号优先显示,可以让视图更加的清晰明了,按照需要的方式显示,具体操作如下 以下图为例 丝印位号被器件的外形盖住了,需要显示的效果为,优先显示丝印位号,器件外形次优先 选择display-layer Priority 出现Di…

MySQL日志系统

MySQL相关文章 慢sql搜集分析工具搭建 前言 日志系统可谓是MySQL中的重中之重&#xff0c;一些MySQL的特性也通过依赖于日志实现的。 本篇文章过一遍日志相关的东西&#xff0c;方便日后复习。 binlog 概念 二进制日志文件&#xff0c;记录了所有的DDL&#xff08;数据库…

tensorflow.keras常用模块介绍

目录前言一、基础层1-0、Input层1-1、Dense层1-2、Activation层&#xff08;激活层&#xff09;、Dropout层1-3、Lambda层1-4、Flatten层二、嵌入层2-1、Embedding层三、池化层3-1、MaxPooling1D层3-2、MaxPooling2D层3-3、AveragePooling1D层3-4、AveragePooling2D层3-5、Glob…

Android 组件化架构设计从原理到实战

为什么需要组件化 小项目是不需要组件化的。当一个项目有数十个人开发&#xff0c;编译项目要花费10分钟&#xff0c;修改一个bug就可能会影响到其他业务&#xff0c;小小的改动就需要进行回归测试&#xff0c;如果是这种项目&#xff0c;那么我们需要进行组件化了 组件化和模…

有效的渗透测试才能确保Web应用安全

应用程序的安全性和快速交付之间存在矛盾&#xff0c;但由于应用程序代码缺陷和安全漏洞&#xff0c;我们正在目睹或经历越来越多的攻击。据调查&#xff0c;软件安全漏洞占了大约47%的安全事故。 与任何软件一样&#xff0c;Web应用程序也包含缺陷和错误。这种安全风险的一个…

[附源码]Python计算机毕业设计Django物品捎带系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

SAP PS 第9节 合并采购申请、组合WBS之详解

SAP PS 第9节 合并采购申请、组合WBS之影响1 合并采购申请1.1 合并采购申请后台配置1.2 合并采购申请效果如下2 组合WBS2.1 后台配置2.1.1 激活需要分组的MRP组2.1.2 项目必须为有库存模式&#xff0c;无论估价或者未估价都可以2.1.3 物料必须允许项目库存&#xff08;允许独立…