2022年6月

微信小程序的开发步骤

如何获取微信OpenID

背景
  在B端场景下,有的时候我们的客户并不具备自己开发软件的能力,那么SaaS平台应运而生,客户只需要在我们的平台上开通服务,就可以为客户生成出相应的产品。
  在网页端很容易,例如淘宝店铺,用户只需要在淘宝网页注册卖家,简单装修一番,也可以做一些简单的二次开发就完成开店,而不需要自己去从0开发,去买服务器,建数据库等等。那么如果想要做一款微信小程序的SaaS平台呢,那么本篇文章主要介绍如何构建微信小程序的SaaS平台,希望对做这块业务的人有所帮助。
微信小程序
  微信小程序我理解是一个运行在微信app上的一个webview,一个小程序页面由4个文件组成,分别是:js(页面逻辑)、wxml(页面结构)、json(页面配置)、wxss(页面样式)。和网页的组成一模一样,wxml->html,wxss->css。
构建SaaS平台
  微信开放平台提供了第三方平台的功能,可以让企业去构建自己的SaaS功能,第三方平台是什么,他提供了我们代用户实现小程序的能力,这也为我们开发SaaS平台打下了基础。接下来介绍比较重要的步骤。

一、开发通用模板

   既然是SaaS平台,我们就要开发一个通用的模板代码(默认的),可以是多套供用户选择,并且在一定程度上可以让用户定制化页面,比如调整位置、修改图片等等。开发完成后可上传至微信小程序模板库

二、引导用户授权

   获取预授权码,并在web页面设置入口,引导用户进入授权界面,将小程序的开发、发布等权限授权给我们,以便我们来代用户实现小程序功能。

三、获取用户小程序的令牌

  由于微信接口都是需要令牌的,所以我们需要保存用户授权后的信息,比如小程序id,后续调用接口需要用到。这里不同于个人小程序,第三方平台获取令牌的时候不需要scret,需要第三方平台自己的id、第三方平台的令牌、授权方小程序的id。就可获取令牌调用接口

四、代用户实现小程序

  其他的功能就不赘述,这里只说比较重要的功能。
  第一、类目管理 这个是小程序能不能过审的关键信息,类目需要和小程序提供的内容匹配。不然过不了审核。
  第二、代码管理 主要分为代码上传、提交审核、接收小程序审核结果推送、发布小程序、线上可见等功能。(1)代码上传,第三方平台从模板库中选择模板上传代码 (2)提交审核,第三方平台替客户提交小程序至微信审核 (3)接收小程序审核结果推送,成功则可以继续下边的流程,如果失败,则需要根据失败原因做相应调整,再提交审核,(4)对审核通过的小程序进行发布 (5)发布成功后修改线上可见。至此整个代码提交发布的流程就结束了。其他功能:如灰度发布、版本回退、审核撤回等功能请参展第三方平台文档。
整体流程图如下:
1.png

佳沃超市要开业了,在选好地址之后,小麦准备要开始去进货了。小麦想着自己的超市既然是个综合性的超市,那么酒水饮料,

生活用户,水果蔬菜,服装鞋帽,调味品这些肯定是要准备进货的。

后来想了想,唉,小的品类实在是不知道有什么啊,那就进货的时候再来进行分类的创建吧。1.首先把主要的大类创建好。

基础资料-产品分类管理

小麦开始创建 水果蔬菜,酒水饮料,生活用品分类。。。。经过小麦的操作,分类就算是创建完成了。

产品的管理

2.1 进入产品列表  点击新增产品按钮

2.2 输入产品名称  产品规格  产品品牌 等基本信息。

2.3 初期库存

3:选择商品进行销售

3.1 产地
  
3.2 类型

3.3 读取自定义的一些参数? 这个前期也可以硬编码 

4.

例如 :

List<obj1> obj1List ,List<obj2> obj2List,需要按照obj1.id=obj2.id进行整合
select * from obj1List left join obj2List on obj1.id=obj2.id

第一步:将obj1List转换成map

将list转成id为key,obj1为value的map对象

  public static <K, V> Map<K, V> listToMap(List<V> list, String keyMethodName, Class<V> c) {
      Map<K, V> map = new HashMap<K, V>();
      if (list != null) {
          try {
              Method methodGetKey = c.getMethod(keyMethodName);
              for (int i = 0; i < list.size(); i++) {
                  V value = list.get(i);
                  @SuppressWarnings("unchecked")
                  K key = (K) methodGetKey.invoke(list.get(i));
                  map.put(key, value);
              }
          } catch (Exception e) {
              throw new IllegalArgumentException("field can't match the key!");
          }
      }

      return map;
  }

第二步:根据key值将obj2List进行copy

for (Obj2 obj: obj2List) {

      try {
          System.out.println(obj);
          BeanUtils.copyProperties(mapFromList1.get(obj.getId()), obj);
      } catch (Exception e) {
          e.printStackTrace();
      }
  }

另一个例子:
java代码

public class TEST {
    public static void main(String[] args) {
       
        List<Model1> list1 = new ArrayList();
        List<Model1> list2 = new ArrayList();
        List<Model2> list3= new ArrayList();
        for (int i=0;i<list1.size();i++){
            for (int j=0;j< list2.size();j++){
//判断两个集合no是否相等
               if (list1.get(i).getNo()==list2.get(i).getNo()){
//给第三个集合赋值并计算different
                   Model2 model2=new Model2();
                   model2.setName(list1.get(i).getName());
                   model2.setNo(list1.get(i).getNo());
                   model2.setDifferent(list1.get(i).getName()-list2.get(i).getName());
               list3.add(model2);
               }
            }
        }
        System.out.println(list3);
    }
    
    private static class Model2 {
        Integer no;
        Integer name;
        Integer different;
    
        public Integer getNo() {
            return no;
        }
    
        public void setNo(Integer no) {
            this.no = no;
        }
    
        public Integer getName() {
            return name;
        }
    
        public void setName(Integer name) {
            this.name = name;
        }
    
        public Integer getDifferent() {
            return different;
        }
    
        public void setDifferent(Integer different) {
            this.different = different;
        }
    }
    private static class Model1 {
        Integer no;
        Integer name;
    
        public Integer getNo() {
            return no;
        }
    
        public void setNo(Integer no) {
            this.no = no;
        }
    
        public Integer getName() {
            return name;
        }
    
        public void setName(Integer name) {
            this.name = name;
        }
    }
}

参考文章:https://ask.csdn.net/questions/7715948

书接上回说,小麦辛辛苦苦的把超市的卫生打扫了一下,第二天就要开始进货了,正好小王负责采购。小麦就对小王说,你看明天需

要采购什么,你提前准备一下。等会我按照你的采购单给你准备钱。

小王一想 这也可以,省的明天去也不知道要购买什么。

屏幕截图 2022-11-08 201339.png

采购、退货离不开供应商,首先设置或添加供应商资料

供应商管理

采购订单

采购退货(整单退货和零散退货)

于是 小王把采购单打出来之后,让小麦看了一下,小麦很高兴的说:"批准了"。

批准审批通过后 库存数量增加+

一、采购入库操作流程

  应付模块中有一个采购订单界面,采购部在签订采购合同后,在正式采购前须在系统的采购订单界面录入订单内容,包括合同号、供应商、材料编码、材料名称规格、价格、数量、到货日期、运输及付款条款等,然后将合同正本交财务部。财务部收到合同正本后对采购订单进行复核,并将合同存档。复核后的采购订单不能修改。系统中的采购订单是用于向供应商订货的单据,其格式和内容是可以编辑的。在材料到达前采购员在系统中根据采购订单自动生成入库单,并打印出来。一个采购订单可以分数次入库,即可以多次生成入库单,但当数量超过订单限制时,系统将会报警,并将报警信息打印在入库单上。采购员在入库单上签字后将入库单交仓库验收。

仓库验收入库后在入库单上签字,将财务联和采购联交采购员,并在系统中确认过帐,这时入库材料就进入了材料子系统了,公司就可以查询到这笔材料的入库及库存情况。发票到达后,采购员将发票单据、入库单、申购单等单据整理并粘贴好交财务部入帐。财务部将这些单据核对准确无误后,在系统中生成入库凭证。

采购入库的流程介绍,手把手教你怎么入库

采购订单和采购入库单

采购订单相当于一个采购意向单,不涉及金额和库存?

当采购订单审核通过之后,生成采购入库单,然后改单审核之后进入库存。

采购订单不涉及到付款金额,可以将审核完毕的采购订单转成为采购入库单。

采购订单是下达给供应商的,表达的是采购的意愿;采购入库单是内部单据,表达的是供应商的履约信息

https://www.oyonyou.com/thread-20792-1-1.html
https://zhuanlan.zhihu.com/p/447209432
https://www.kingdee.com/column/201811161827.html