0.0.1 • Published 2 years ago

open-store-sdk v0.0.1

Weekly downloads
-
License
MIT
Repository
-
Last release
2 years ago

为什么引入SDK概念

  1. 规范入参出参的数据格式,目前服务端提供的数据格式问题
  2. 规范前端基础业务逻辑
  3. 规范异常情况的处理(目前很多页面逻辑未处理异常场景的)
  4. 多端支持,目前我们的api模块仅支持项目本身,脱离项目无法复用,耦合性过高,跟页面强依赖
  5. 满足函数式编程

SDK工程

  • 数据转换映射
此部分待完善,以及必要性评估
  • 业务基础数据类型定义,类似money、distance
针对sdk输出的数据类型做严格控制,该返回null,不返回类似''或{}等
  • fetch项目内需要可配置化
暂定fetch内置,仅提供必要异步回调
  • 接口的内聚
sevices为单一职责服务, logic为逻辑组合

servces为正常code
logic中的code会存在为自定义情况
  • SDK边界划分
SDK只处理数据,绝不处理与UI相关、页面业务相关的交互
  • 异常、数据的捕获上报

小程序工程

SDK功能

export default {
    config: {
        env: 0,
        host: '',
        constCode: [],
        accessToken: '',
        partnerId: '1864'
    },
    commonParams: {
        storeId: '',
        sessionId: ''
    },
    header: {},
    adapter: {
        beforeRequest(config){
            
        },
        afterRequest(response){
            return Promise.resolve();
        }
    },
    state: {},
    utils: {
        _: lodash
    },
    service: {
        store,
        product,
        config,
        member,
        address,
        cart,
        activity,
        ...
    },
    logic: {
        // 基于service的二次封装,固定的流程页面,提供方便快速搭建跑通流程
        home: {},
        pickup: {},
        take: {},
        mine: {},
        orderSubmit: {},
        userInfo: {}
    }
}

如何使用SDK

import sdk from 'fm-sdk';
import { beforeRequest, afterRequest } from './fetch.js';

export default {
    onLaunch() {
        let ext = getExt();
        // 初始化配置
        let fm = sdk.init({
            config: {
                appId: 'wxef754bdcc220db4e',
                partnerId: '2399',
                baseURL: 'https://open-store.sandload.cn',
            },
            adapter: {
                // 可将adapter部分抽离到独立的模块
                beforeRequest(config) {
                    
                },
                afterRequest(response, options) {
                    // 1.在这里做一系列额外处理,例如弹框提示,但是注意这里无法更
                    // 2.改后续进入service的值,sdk提供足够的拓展,
                    // 3.但提供拓展的目的旨在让控制交互的权利释放,不代表有能力干扰sdk,例如这里的afterRequest无法干扰sdk正常运行
                    // options提供
                    if (response.success) {
                        // 成功可以无视
                    } else {
                        uni.showToast();
                        uni.FM.reportLog();
                    }
                }
            }
        });
        uni.FM = fm;
    },
    onError(error){
        // sdk错误上报
        uni.FM.reportLog(1, {
            <!--需要上报的数据-->
            error,
            ...params
        });
    }
}

页面使用

export default class pickup {
    construct(){
        this.a = a;
        
        this.callback = function(){}
        
        this.init();
    }
    init(){
        let params = {};
        uni.FM.logic.member.getApiData(params).then(res=>{
            this.callback();
        });
    }
    hasStore(){
        
    }
    hasMenuAndCategary(){
        
    }
    
}

Page

调用1
onLoad(){
    let params = { orderType: 1 };
    uni.fm.service.cart.getData(params).then(res=>{
    
    }).catch(err=>{
    
    })
}

调用2

onLoad(){
    let params = { orderType: 1 };
    let instance = uni.fm.logic.pickup(params);
    instance.on('init', function() {
        
    });
}