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

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

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

一. 流程图

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

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文件怎样弄,还有用到的自定义组件怎么写,都写在项目源码里的,在这里就不贴上去了,文章不能写得过长哈,

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

  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
技术选型1,前端微信小程序原生框架cssJavaScript2,管理后台云开发Cms内容管理系统web网页3,数据后台小程序开发云函数云数据库云存储 1,小程序端1-1,首页首页有以下几个功能点点餐菜单浏览排号等位拨打电话顶部轮播图搜索菜品这里点餐分两种1,可以设置直接点餐直接点餐:适合小型饭店,或者奶茶类的快餐店。直接就可以下单,不用识别桌号2,也可设置扫码点餐扫码点餐适合中大型饭店,可以区分桌号,方便管理我后面会教大家如何生成桌号二维码,只需要把对应桌号的二维码贴在餐桌上,用户点击 扫码点餐 识别二维码,即可获取到桌号信息。1-2,菜品浏览页菜品浏览分两种1,不带分类适合菜品少的时候2,带分类菜品多的时候,带分类更方便客户选择不带分类 带分类 1-3,搜索功能我们这里搜索有两个触发方式1,直接点击搜索图标2,点击键盘上的搜索键1-4,搜索结果,支持模糊查询如我这里只搜‘鱼’,那么菜品中所有包含鱼的都可以搜索到 1-5,购物车首先菜品列表页可以直接添加商品到购物车购物车弹起后可以做如下操作1,增删单个菜品2,清空购物车3,删除菜品这些操作都和菜品列表是联动的,也就是菜品列表和购物车里增删个数,都是可以同步的。我会在项目预览章节的视频里做具体演示。1-6,下单页下单页就是确认订单后进行下单支付的。有以下功能1,点餐明细2,价格计算3,桌号地址4,就餐人数5,添加备注6,点击下单1-7,支付页支付页分两种方式1,模拟支付适合前期学习,毕业设计等演示类的场景。2,真实微信支付适合商用,但是使用微信支付必须要有营业执照,所以前期如果只是学习的话,建议使用模拟支付。 1-8,我的订单页我的订单页分以下几个状态1,新下单待上餐2,已上餐待评价3,订单完成4,订单取消1-9,提交评论页我们可以对店家进行评论。 1-10,评价列表页可以查看所有评价和自己的评价 1-11,排号等位可以看出,我们可以选择就餐人数,排大桌或者小桌。我这里已排小桌为例通过上图可以看出1,当前排号情况2,我的排号3,可以重新排号4,到号时会有到号提示后面我会把订阅消息功能加进来,这样到号后会有订阅消息提示。 1-12,个人中心个人中心分登录和未登录两种状态未登录已登录 1-13,微信授权登录小程序 2,后厨端和排号管理端2-1,后厨端主要供后厨的厨师使用1,可以查看当前新下单2,完成后可以操作菜品完成3,可以监听用户新下单4,有新订单时会有语音提示5,厨师登录页语音提示我会在视频课里具体演示厨师登录页 厨师管理页可以查看待制作订单用户新下单后,会有语音提示 2-2,排号管理页同样也有登录页,和上面厨师登录一样,这里重点看下排号管理管理员可以查看当前排号情况,可以叫号。3,cms管理后台我们这里的可视化网页后台使用的时云开发自带的cms(内容管理)3-1,登录页 3-2,管理后台我们可以在这里 1,添加轮播图,删除轮播图,修改轮播图2,添加菜品,删除菜品,修改菜品,上架下架菜品3,管理订单4,查看评价5,管理后厨和排号管理员6,查看排号数据  比如我查询某个用户的所有订单 查询所有新下单还未上菜的订单 还有更多的功能,我会在视频课里给大家用视频来演示,这样更直观。 4,数据库数据库我们这里用云开发自带的云数据库餐厅管理员查看趋势图

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

TA远方

谢谢!收到你的爱╮(╯▽╰)╭

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值