[每日分享]分享一个本人以前纯手写的小程序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实现图片分割的多种方法总结

《Python实现图片分割的多种方法总结》图片分割是图像处理中的一个重要任务,它的目标是将图像划分为多个区域或者对象,本文为大家整理了一些常用的分割方法,大家可以根据需求自行选择... 目录1. 基于传统图像处理的分割方法(1) 使用固定阈值分割图片(2) 自适应阈值分割(3) 使用图像边缘检测分割(4)

Android实现在线预览office文档的示例详解

《Android实现在线预览office文档的示例详解》在移动端展示在线Office文档(如Word、Excel、PPT)是一项常见需求,这篇文章为大家重点介绍了两种方案的实现方法,希望对大家有一定的... 目录一、项目概述二、相关技术知识三、实现思路3.1 方案一:WebView + Office Onl

Maven如何手动安装依赖到本地仓库

《Maven如何手动安装依赖到本地仓库》:本文主要介绍Maven如何手动安装依赖到本地仓库问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、下载依赖二、安装 JAR 文件到本地仓库三、验证安装四、在项目中使用该依赖1、注意事项2、额外提示总结一、下载依赖登

C# foreach 循环中获取索引的实现方式

《C#foreach循环中获取索引的实现方式》:本文主要介绍C#foreach循环中获取索引的实现方式,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录一、手动维护索引变量二、LINQ Select + 元组解构三、扩展方法封装索引四、使用 for 循环替代

Spring Security+JWT如何实现前后端分离权限控制

《SpringSecurity+JWT如何实现前后端分离权限控制》本篇将手把手教你用SpringSecurity+JWT搭建一套完整的登录认证与权限控制体系,具有很好的参考价值,希望对大家... 目录Spring Security+JWT实现前后端分离权限控制实战一、为什么要用 JWT?二、JWT 基本结构

Java实现优雅日期处理的方案详解

《Java实现优雅日期处理的方案详解》在我们的日常工作中,需要经常处理各种格式,各种类似的的日期或者时间,下面我们就来看看如何使用java处理这样的日期问题吧,感兴趣的小伙伴可以跟随小编一起学习一下... 目录前言一、日期的坑1.1 日期格式化陷阱1.2 时区转换二、优雅方案的进阶之路2.1 线程安全重构2

Android实现两台手机屏幕共享和远程控制功能

《Android实现两台手机屏幕共享和远程控制功能》在远程协助、在线教学、技术支持等多种场景下,实时获得另一部移动设备的屏幕画面,并对其进行操作,具有极高的应用价值,本项目旨在实现两台Android手... 目录一、项目概述二、相关知识2.1 MediaProjection API2.2 Socket 网络

使用Python实现图像LBP特征提取的操作方法

《使用Python实现图像LBP特征提取的操作方法》LBP特征叫做局部二值模式,常用于纹理特征提取,并在纹理分类中具有较强的区分能力,本文给大家介绍了如何使用Python实现图像LBP特征提取的操作方... 目录一、LBP特征介绍二、LBP特征描述三、一些改进版本的LBP1.圆形LBP算子2.旋转不变的LB

Redis消息队列实现异步秒杀功能

《Redis消息队列实现异步秒杀功能》在高并发场景下,为了提高秒杀业务的性能,可将部分工作交给Redis处理,并通过异步方式执行,Redis提供了多种数据结构来实现消息队列,总结三种,本文详细介绍Re... 目录1 Redis消息队列1.1 List 结构1.2 Pub/Sub 模式1.3 Stream 结

C# Where 泛型约束的实现

《C#Where泛型约束的实现》本文主要介绍了C#Where泛型约束的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录使用的对象约束分类where T : structwhere T : classwhere T : ne