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

本文主要是介绍[每日分享]分享一个本人以前纯手写的小程序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];//从模型中取出键名IDif (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 modefunction 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 modefunction 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) {// failconsole.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>
})

这篇关于[每日分享]分享一个本人以前纯手写的小程序json本地工具类实现收藏、观看历史功能...的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/959177

相关文章

使用Python实现在Word中添加或删除超链接

《使用Python实现在Word中添加或删除超链接》在Word文档中,超链接是一种将文本或图像连接到其他文档、网页或同一文档中不同部分的功能,本文将为大家介绍一下Python如何实现在Word中添加或... 在Word文档中,超链接是一种将文本或图像连接到其他文档、网页或同一文档中不同部分的功能。通过添加超

windos server2022里的DFS配置的实现

《windosserver2022里的DFS配置的实现》DFS是WindowsServer操作系统提供的一种功能,用于在多台服务器上集中管理共享文件夹和文件的分布式存储解决方案,本文就来介绍一下wi... 目录什么是DFS?优势:应用场景:DFS配置步骤什么是DFS?DFS指的是分布式文件系统(Distr

Golang操作DuckDB实战案例分享

《Golang操作DuckDB实战案例分享》DuckDB是一个嵌入式SQL数据库引擎,它与众所周知的SQLite非常相似,但它是为olap风格的工作负载设计的,DuckDB支持各种数据类型和SQL特性... 目录DuckDB的主要优点环境准备初始化表和数据查询单行或多行错误处理和事务完整代码最后总结Duck

NFS实现多服务器文件的共享的方法步骤

《NFS实现多服务器文件的共享的方法步骤》NFS允许网络中的计算机之间共享资源,客户端可以透明地读写远端NFS服务器上的文件,本文就来介绍一下NFS实现多服务器文件的共享的方法步骤,感兴趣的可以了解一... 目录一、简介二、部署1、准备1、服务端和客户端:安装nfs-utils2、服务端:创建共享目录3、服

基于Python开发电脑定时关机工具

《基于Python开发电脑定时关机工具》这篇文章主要为大家详细介绍了如何基于Python开发一个电脑定时关机工具,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. 简介2. 运行效果3. 相关源码1. 简介这个程序就像一个“忠实的管家”,帮你按时关掉电脑,而且全程不需要你多做

C#使用yield关键字实现提升迭代性能与效率

《C#使用yield关键字实现提升迭代性能与效率》yield关键字在C#中简化了数据迭代的方式,实现了按需生成数据,自动维护迭代状态,本文主要来聊聊如何使用yield关键字实现提升迭代性能与效率,感兴... 目录前言传统迭代和yield迭代方式对比yield延迟加载按需获取数据yield break显式示迭

Python实现高效地读写大型文件

《Python实现高效地读写大型文件》Python如何读写的是大型文件,有没有什么方法来提高效率呢,这篇文章就来和大家聊聊如何在Python中高效地读写大型文件,需要的可以了解下... 目录一、逐行读取大型文件二、分块读取大型文件三、使用 mmap 模块进行内存映射文件操作(适用于大文件)四、使用 pand

python实现pdf转word和excel的示例代码

《python实现pdf转word和excel的示例代码》本文主要介绍了python实现pdf转word和excel的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价... 目录一、引言二、python编程1,PDF转Word2,PDF转Excel三、前端页面效果展示总结一

IDEA如何将String类型转json格式

《IDEA如何将String类型转json格式》在Java中,字符串字面量中的转义字符会被自动转换,但通过网络获取的字符串可能不会自动转换,为了解决IDEA无法识别JSON字符串的问题,可以在本地对字... 目录问题描述问题原因解决方案总结问题描述最近做项目需要使用Ai生成json,可生成String类型

Python xmltodict实现简化XML数据处理

《Pythonxmltodict实现简化XML数据处理》Python社区为提供了xmltodict库,它专为简化XML与Python数据结构的转换而设计,本文主要来为大家介绍一下如何使用xmltod... 目录一、引言二、XMLtodict介绍设计理念适用场景三、功能参数与属性1、parse函数2、unpa