[每日分享]分享一个本人以前纯手写的小程序json本地工具类实现收藏、观看历史功能

功能

可实现自动更新最新的在最上面
支持增加,查询。
支持多表构建,比如同时需要收藏,和观看历史
复制到你的工程里面去。比如改名为maputil.js

用法

const mMaputil = require("../../utils/maputil.js");
  mEngine = mMaputil.HistoryEngine();//每次创建/ 在城阳
 mEngine.edit(function () {
 

    }, function () {
      //应该是没有进行初始化
            console.debug("edit模式进入失败");
    }, function () {
      util.hideLoading();
    });
    var currentItems = mEngine.query();

更多用法我最下面有一个历史记录的js源码

/**
 * /持久化工具类 排序 永久 保存 取出
  /**
     * 返回array 查询失败返回[]
     */


/**
判断是否定义 是否有传递参数
@data 需要进行判断的变量 或者方法
**/
function isUndefined(data) {
    return data == false || (typeof data) == "undefined";
}
 /**
  * @param jsonKey 唯一key
  */
function MapUtil(pKey, jsonKey, pTag) {
 var jsonKey=jsonKey;
    var tag = "[default_Map]";

    var map = {};//如果初始化是数组第一次读取是失败的的,那么第一次存入map[xx]显然会出问题,估计之后的不能存放 数字类型自动变成数组然后 如i数字为为 10 1 -9如果没有数据自动填充为null估计都是因为这个初始值导致的的。
    var error = "请先对数据进行初始化操作,如先查询(架构设计问题,当时为了快速添加多个模型而做了缓存处理,所以需要调用edit()进行初始化)";
    var init = false;

    function edit(succ, fail, complete) {

     return    queryFromStorage(succ, fail, complete);
    }

    //此操作成功后回个map对象赋值
    // queryFromStorage(succ, fail, complete);//初始化查询

    if ((typeof jsonKey) == "undefined") {
        console.warn(tag + "key没有传递");
        jsonKey = "video";//or id
    }
    function toString() {
        // var array = queryData();
        // console.debug("history", array);
    }


    /**
     * 不对外暴露  同步请求2017年9月22日 10:11:53 改良
     */
    function queryFromStorage(succ, fail, complete) {
     try { 
           map= wx.getStorageSync(pKey);
          console.debug(tag + "数据存储查询成功", map, "查询的键" + pKey);
          if (isUndefined(map)) {
            map = {};
          }
          if (!isUndefined(succ)) {
           console.debug(tag + "数据存储查询成功,进行回调通知", map);
           succ(map);
          }
     }catch(e){
            console.warn(e, tag + "无法读取Key:" + pKey+",",e);
            if (!isUndefined(fail)) {
             fail(e);
            }
     }
    init = true;
     if (!isUndefined(complete)) {
      complete();
     }
     return map;
    }
    /**
     * 不对外暴露  同步存储
     */
    function saveDataToStorage(map, succ, fail, complete) {
        if (!init) {
            console.warn(tag+" 没有使用edit()方法进行初始化,saveDataToStorage fail");
            if (!isUndefined(fail)) {
                var res = { errMsg: "请先调用本对象的edit(succCall,failCall,completeCall);" };
                fail(res);
            }
            if (!isUndefined(complete)) {
                complete();
            }

            return;
        }
       try{

              wx.setStorageSync(pKey,map);
               console.debug(tag + "存储数据到持久化成功", "table", pKey, map);
               if (!isUndefined(succ)) {
                succ();
               }
       }catch(e){


          console.warn(tag + "无法存储数据", e, "需要存储的数据为为:", map);
          if (!isUndefined(fail)) {
             fail(e);
          }

       }
      if(!isUndefined(complete)){
       complete();
      }
   return map;
    }


    function putData(model) {
        var id = model[jsonKey];

        if (isUndefined(id)) {
            console.debug(tag, model, "传递的json对象没有包含键名: " + jsonKey);
        } else {
            var data = map[id];
            if (isUndefined(data)) {
                console.debug(tag + "new insert Data : model[", model, "]id is ", id);
            } else {
                console.debug(tag + "replace Data : model[", data, "]->To->", map[id], "id is" + id);
            }

        }
        map[id] = model;
        return true;
    }
    function dataExist(model) {
        var id = model[jsonKey];

        var result = !isUndefined(map[id]);
        console.debug(tag + "model." + jsonKey + "=", id, "dataExist:" + result + "," + map[id]);
        return result;
    }
    /**
     * 成功返回模型 失败返回null
     */
    function queryByKey(key) {
        if (isUndefined(key)) {
            console.error(tag + "queryByKey(key) key is undefined");
            return;
        }
        // var id = model[jsonKey];//也可以理解为为 址model.jsonkey  这里唯一字段为视频id 然后再从从 map缓存中取
        var temp = map[key];
        console.debug(tag + "queryByKey->查询key==Undefined->" + isUndefined(key) + ",key=" + isUndefined(key) == false ? key : " error", "查询结果:", temp);
        return temp;
    }
    /**
     * @fail 失败的回调 不会保存
     */
    function deleteData(model, fail) {
    //检查当前模型是否有此key, 需要这个key来获取
        var id = model[jsonKey];//从模型中取出键名ID
        if (isUndefined(id)) {
            if (!isUndefined(fail)) {
                var err = { errMsg: "deleteData fail: not container key " + jsonKey + "" };
                fail(err);
            }
            console.error(tag + "deleteData fail: not container key " + jsonKey + "", model[jsonKey], id);

            return false;
        }
        //通过模型的id值 检查整个map中是否有此模型 
        if (isUndefined(map[id])) {
            if (!isUndefined(fail)) {
                var err = { errMsg: "deleteData fail: not exist:[" + jsonKey + "]", };
                fail(err);
            }
            console.warn(tag + "deleteData fail: not exist:[" + jsonKey + "]");
            return false;
        }
        // map[id] = null;
        var result = delete map[id];
        console.debug(tag + "删除结果" + result);
        return result;


    }
    /**
     * 不对外暴露
     */
    function queryToArray() {
 var map = queryFromStorage();
   console.debug("queryToArray",map);
        var array = [];
        for (var key in map) {
            array.push(map[key]);
            console.debug(tag + "mapToArray: ", map[key]);

        }
        return array;
    }
    /**
     * 返回出 时间排序的json对象 在执行完毕后才能进行操作 非耗时操作,但是本功能必须在在 初始化对象完成后调用
     */
    function queryData() {
        return queryToArray();
    }
    function submit(succ, fail, complete) {
        saveDataToStorage(map, succ, fail, complete);
    }

    function isInit() {
        return init;
    }
    function setTag(pTag) {
        tag = "[" + pTag + "]";
    }
    function getTag() {
        return tag;
    }

    // this.saveDataToStorage = saveDataToStorage;
    this.submit = submit; //添加修改后都需要保存才行
    this.putData = putData;
    this.deleteData = deleteData;
    this.dataExist = dataExist;
    this.queryData = queryData;
    this.edit = edit;
    this.isInit = isInit;
    this.queryByKey = queryByKey;
    this.setTag = setTag;
    this.getTag = getTag;
    if (!isUndefined(pTag)) {
        setTag(pTag);
    }
    console.debug(getTag() + "创建了一个map对象", this);
    return this;

}
/**
 * 虽然比较奇葩的写法,但是没有办法 比较这耗时操作啊啊,查询会导致按钮。
 */
function LikeEngine() {
    console.debug("创建了一个LikeEngine对象");
    var maputil = new MapUtil("collect_table", field, "喜欢表");

    function removeMulti(array, succ, fail, complete) {
        removeMultiData(maputil, array, succ, fail, complete);
    }
    function add(model, succ, fail, complete) {
        addData(maputil, model, succ, fail, complete);
    }

    function remove(model, succ, fail, complete) {
        removeData(maputil, model, succ, fail, complete);
    }
    function update(model, succ, fail, complete) {
        updateData(maputil, model, succ, fail, complete);

    }
    function query(succ, fail, complete) {
        return maputil.queryData(succ, fail, complete);
    }
    function queryByKey(keyValue) {
        return maputil.queryByKey(keyValue);
    }

    //enter edit mode
    function edit(succ, fail, complete) {
        return maputil.edit(succ, fail, complete);
    }

    function isLike(model) {

        return maputil.dataExist(model);
    }
    function isInit() {
        return maputil.isInit();
    }

    this.edit = edit;
    this.isLike = isLike;
    this.query = query;
    this.add = add;
    this.remove = remove;
    this.removeMulti = removeMulti;
    this.isInit = isInit;
    this.queryByKey = queryByKey;
    return this;
}
function HistoryEngine(uniqueKey) {
 var field = isUndefined(uniqueKey)? "id":uniqueKey;
    console.debug("创建了一个HistoryEngine对象");

    var maputil = new MapUtil("brower_history_table", field, "历史记录表");
    function isInit() {
        return maputil.isInit();
    }
    function removeMulti(array, succ, fail, complete) {
        removeMultiData(maputil, array, succ, fail, complete);
    }
    function add(model, succ, fail, complete) {
        addData(maputil, model, succ, fail, complete);
    }

    function remove(model, succ, fail, complete) {
        removeData(maputil, model, succ, fail, complete);
    }
    function update(model, succ, fail, complete) {
        updateData(maputil, model, succ, fail, complete);

    }
    function query(succ, fail, complete) {
        return maputil.queryData(succ, fail, complete);
    }

    //enter edit mode
    function edit(succ, fail, complete) {
        return maputil.edit(succ, fail, complete);
    }
    /**
     * 视频地址 当前封装的是视频地址的值
     */
    function queryByKey(keyValue) {
        return maputil.queryByKey(keyValue);
    }


    function isInit() {
        return maputil.isInit();
    }
    this.isInit = isInit;
    this.edit = edit;
    this.query = query;
    this.add = add;
    this.remove = remove;
    this.update = update;
    this.removeMulti = removeMulti;
    this.queryByKey = queryByKey;
    return this;

}
/**
 * 下面方法 做了complete操作 马上生效
 */
function removeMultiData(engine, array, succ, fail, complete) {

    // var failCount = 0;失败就是不!
    for (var index = 0; index < array.length; index++) {
        var model = array[index];
        var result = engine.deleteData(model);//失败了会回调
    }
    engine.submit(function () {
        if (!isUndefined(succ)) {
            succ();
        }
    }, fail, complete);

}

function removeData(engine, model, succ, fail, complete) {
    var result = engine.deleteData(model, fail);
    if (result) {
        engine.submit(succ, fail, complete);
    } else {
        if (!isUndefined(complete)) {
            complete();
        }
    }

}

function addData(engine, model, succ, fail, complete) {
    var result = engine.putData(model);
    if (result) {
        engine.submit(succ, fail, complete);
    } else {
        if (!isUndefined(fail)) {
            var res = {};
            res.errMsg = "找不到model对应的唯一key,";
            res.model = model;
            fail(res);
        }
        if (!isUndefined(complete)) {
            complete();
        }

    }

}
/**
 * updatetime进行排序
 */
function updateData(engine, model, succ, fail, complete) {
    var result = false;
    if (engine.dataExist(model)) {
        console.warn(engine.getTag() + "updateData check msg:update  exist :", model);
    }
    model.updatetime = new Date().getTime();

    result = engine.putData(model);
    if (result) {//基本上不可能失败 key  
        engine.submit(succ, fail, complete);
    } else {
        console.error(engine.getTag() + " 提交更新失败");
    }
    return result;
}
module.exports.MapUtil = MapUtil;
module.exports.LikeEngine = LikeEngine;
module.exports.HistoryEngine = HistoryEngine;

播放历史的实现代码

Page({
  data: {
    edit: false,
    items: [],
    checkCount: 0
  },
  onLoad: function (options) {
    // 页面初始化 options为页面跳转所带来的参数
    mEngine = mMaputil.HistoryEngine();//每次创建/ 在城阳
    this.queryData();

  },
  queryData: function () {
    var that = this;
    util.showLoading();
    mEngine.edit(function () {
 

    }, function () {
      //应该是没有进行初始化
            console.debug("edit模式进入失败");
    }, function () {
      util.hideLoading();
    });


    var currentItems = mEngine.query();
    for(var i=0;i<currentItems.length;i++){
     currentItems[i].updatetimeStr = util.getAboutTime(new Date(currentItems[i].updatetime));
    }
    currentItems.sort(function (model1, model2) {
     return model2.updatetime - model1.updatetime
    });
    console.debug("items:", currentItems);
    that.setData({ items: currentItems });
    

  },
  onReady: function () {
    // 页面渲染完成
  },
  onShow: function () {
    // 页面显示
  },
  onHide: function () {
    // 页面隐藏
  },
  onUnload: function () {
    // 页面关闭
  }, onPullDownRefresh: function () {
    this.queryData();
  }, onCancelClick: function () {
    this.check(false);
    this.setData({ edit: false });
  }, onCheckAllClick: function () {
    // this.checkItems=this.items.concat();

    this.check(true);

  },
  check: function (check) {
    var items = this.data.items;
    if (items == null || typeof (items) == "undefined") {
      util.showDialog("没有数据!");
      return;
    }
    for (var i = 0, len = items.length; i < len; i++) {
      items[i].checked = check;
    }
    this.setData({ items: items, checkCount: check == false ? 0 : items.length });
  }
  , onDelClick: function () {
    var that=this;
    if (this.data.checkCount == 0) {
      util.showToast("别闹!请先选择一个数据");
      return;
    }
    util.showLoading();
    var items = this.data.items;
    var deleteArr = [];
    for (var index = 0; index < items.length; index++) {
      var model = items[index];
      if (model.checked) {
        deleteArr.push(model);//add 
      } else {
        console.debug("没有选中", model);
      }
    }
    console.debug("删除总数:", deleteArr);
    mEngine.removeMulti(deleteArr, function (succCount) {
      var arr = mEngine.query();
      var json = {};
      json.items = arr;
      json.checkCount=0;
      that.setData(json);
      util.showDialog("删除成功 ");
    }, function (e) {
      util.showDialog("删除失败" + e.errMsg);
    }, function () {
      util.hideLoading();
    });


  }, onEditClick: function (e) {
    this.setData({ edit: true });
    console.log(this.data.edit)
    console.log(e)
  }
  // , checkboxChange: function (e) {
  //   console.debug("check", e);
  //   //checkCount
  // }
  , onItemClick: function (e) {
    if (this.data.edit) {
      return;
    }
    console.debug("res", e);
    var param = '/pages/story/play/play?id=' + e.currentTarget.dataset.id + "&classid=" + e.currentTarget.dataset.classid;
    wx.navigateTo({
      url: param,
      success: function (res) {
        // success
      },
      fail: function (e) {
        // fail
        console.debug("无法跳转", e);
      },
      complete: function () {
        // complete
      }
    })
  }, checkboxClick: function (e) {

    var index = parseInt(e.currentTarget.dataset.index);
    var model = this.data.items[index];
    model.checked = model.checked == undefined || model.checked == false ? true : false;
    var result = {};
    result.checkCount = model.checked ? this.data.checkCount + 1 : this.data.checkCount - 1;
    result.items = this.data.items;
    this.setData(result);
    console.debug("e", e);
  }


  //    <text class="edit_cancel"  bindtap="onCancelClick">取消</text>
  //   <text class="edit_check_all"  bindtap="onCheckAllClick">全选</text>
  //   <text class="edit_del"  bindtap="onDelClick">删除</text>
  // </block>
  // <block wx:else>
  //   <text class="edit_text" bindtap="onEditClick">编辑</text>
})
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,753评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,668评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,090评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,010评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,054评论 6 395
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,806评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,484评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,380评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,873评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,021评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,158评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,838评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,499评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,044评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,159评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,449评论 3 374
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,136评论 2 356

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 172,199评论 25 707
  • 陈奕迅一首《十年》不知道唱哭过多少人,而书和音乐在某些情绪上应该是相通的。你明媚的记忆片段里,一个笑容的明亮与黯淡...
    南邮青年阅读 607评论 0 3
  • 因为风骚而喜欢秃子,因为沉稳而敬仰邓肯,因为坚忍而佩服小跑,因低调而欣赏小卡,因为老酒鬼的咆哮而追随马刺多年。其实...
    lylinxiao阅读 241评论 0 0
  • 你看不到黑暗,只因为有人替你撑起了光明;你所谓的岁月静好现世安稳,不过是有人替你负重前行。而那人,多半是你父母。
    青二妹阅读 214评论 0 1
  • 文‖叶子 不知道谁说最美的年华会遇见你 可我等了那么久 你还是没有来 是我出现得太早 还是你迷失了方向 身边的人总...
    叶子的世界阅读 455评论 0 0