cache.js 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359
  1. const app = getApp();
  2. const appConfig = require("../config");
  3. const valid = require("../js/valid");
  4. const utils = require("../utils/util");
  5. var checkExist = function(val, data, filed) {
  6. filed = filed || "id";
  7. for (var i in data) {
  8. if (val == data[i][filed]) {
  9. return i;
  10. }
  11. }
  12. return false;
  13. }
  14. var isSame = function(val, val2) {
  15. if (val.length != val2.length) return false;
  16. for (var i in val) {
  17. if (val[i] != val2[i]) {
  18. return false;
  19. }
  20. }
  21. return true;
  22. }
  23. var addItem = function(item) {
  24. //检查是否存在
  25. var data = wx.getStorageSync(appConfig.storeKeys.password) || [];
  26. var isExists = checkExist(item['name'], data, 'name');
  27. if (isExists) {
  28. app.warning("已经存在相关记录~");
  29. return;
  30. }
  31. data.unshift(item);
  32. wx.setStorageSync(appConfig.storeKeys.password, data);
  33. //保存到新增item中
  34. var newItem = wx.getStorageSync(appConfig.storeKeys.newItem) || [];
  35. newItem.unshift(item);
  36. wx.setStorageSync(appConfig.storeKeys.newItem, data);
  37. }
  38. var removeItemByName = function(id, name) {
  39. //检查是否存在
  40. var data = wx.getStorageSync(appConfig.storeKeys.password) || [];
  41. var isExists = checkExist(name, data, 'name');
  42. if (!isExists) {
  43. app.warning("未找到相关记录");
  44. return;
  45. }
  46. data.splice(isExists, 1);
  47. wx.setStorageSync(appConfig.storeKeys.password, data);
  48. if (id) {
  49. //将删除的内容放到临时存储
  50. var removedItem = wx.getStorageSync(appConfig.storeKeys.removedItem) || [];
  51. removedItem.unshift(id);
  52. wx.setStorageSync(appConfig.storeKeys.removedItem, removedItem);
  53. }
  54. }
  55. var editLocal = function(item) {
  56. var newItem = wx.getStorageSync(appConfig.storeKeys.newItem) || [];
  57. var isFind = false;
  58. for (var i in newItem) {
  59. if (newItem[i]['name'] == item.name) {
  60. newItem[i] = item;
  61. isFind = true;
  62. }
  63. }
  64. if (!isFind) {
  65. newItem.unshift(item);
  66. }
  67. wx.setStorageSync(appConfig.storeKeys.newItem, newItem);
  68. }
  69. var editSingle = function(item) {
  70. //检查是否存在
  71. var data = wx.getStorageSync(appConfig.storeKeys.password) || [];
  72. var isExists = checkExist(item['id'], data);
  73. if (isExists) {
  74. data[isExists] = item;
  75. } else {
  76. data.unshift(item);
  77. }
  78. wx.setStorageSync(appConfig.storeKeys.password, data);
  79. //如果是本地编辑就将他放到
  80. if (!item.id || !item.id == '') {
  81. editLocal(item);
  82. }
  83. }
  84. var info = function(id) {
  85. var data = wx.getStorageSync(appConfig.storeKeys.password) || [];
  86. for (var i in data) {
  87. if (data[i]['id'] == id) {
  88. return data[i];
  89. }
  90. }
  91. return false;
  92. }
  93. var sync = function(data) {
  94. if (!data) {
  95. wx.showToast({
  96. title: '参数不正确,请检查后重试!~',
  97. duration: appConfig.duration
  98. });
  99. return;
  100. }
  101. if (!valid.minlength(data.name, 2)) {
  102. app.warning("名称不能少于2个字符");
  103. return;
  104. }
  105. if (!valid.minlength(data.account, 2)) {
  106. app.warning("账户名称不能少于3个字符");
  107. return;
  108. }
  109. if (!valid.minlength(data.password, 6)) {
  110. app.warning("密码不能少于6个字符");
  111. return;
  112. }
  113. if (!valid.isHttp(data.link)) {
  114. app.warning("链接地址不正确");
  115. return;
  116. }
  117. var header = {
  118. 'content-type': 'application/x-www-form-urlencoded',
  119. 'cookie': wx.getStorageSync(appConfig.storeKeys.sessionId)
  120. };
  121. wx.request({
  122. url: utils.getUrl("sync"),
  123. data: data,
  124. header: header,
  125. method: "POST",
  126. dataType: "json",
  127. success: function(res) {
  128. if (typeof res.data == 'string') {
  129. app.warning("同步数据失败~");
  130. return;
  131. }
  132. app.syncSuccess(res.data);
  133. },
  134. fail: function(res) {
  135. wx.showToast({
  136. title: '保存失败,请重试',
  137. duration: appConfig.duration
  138. });
  139. app.syncSuccess(appConfig.networkError);
  140. }
  141. });
  142. }
  143. var download = function(page, pageSize) {
  144. wx.showLoading({
  145. title: '正在同步',
  146. });
  147. var _this = this;
  148. var header = {
  149. 'content-type': 'application/x-www-form-urlencoded',
  150. 'cookie': wx.getStorageSync(appConfig.storeKeys.sessionId)
  151. };
  152. //先检查本地是否有删除的数据
  153. var removedItem = wx.getStorageSync(appConfig.storeKeys.removedItem) || [];
  154. if (removedItem.length > 0) {
  155. //批量删除
  156. var id = removedItem.join(",");
  157. wx.request({
  158. url: utils.getUrl("remove"),
  159. header: header,
  160. data: {
  161. ids: id
  162. },
  163. method: "POST",
  164. dataType: "json",
  165. success: function(req) {
  166. wx.removeStorageSync(appConfig.storeKeys.removedItem);
  167. download(page, pageSize);
  168. },
  169. fail: function(req) {
  170. wx.hideLoading();
  171. app.warning(appConfig.networkError.msg);
  172. }
  173. });
  174. return;
  175. }
  176. //再检查本地是否有新增的数据
  177. var newItem = wx.getStorageSync(appConfig.storeKeys.newItem) || [];
  178. if (newItem.length > 0) {
  179. wx.request({
  180. url: utils.getUrl('batchUpdate'),
  181. header: header,
  182. data: {
  183. data: JSON.stringify(newItem)
  184. },
  185. dataType: 'json',
  186. method: 'post',
  187. success: function(res) {
  188. if (res.data) {
  189. if (res.data.data) {
  190. for (var i in res.data.data) {
  191. var code = res.data.data[i]['code'];
  192. var operate = res.data.data[i]['operate'] || "";
  193. var data = res.data.data[i]['data'];
  194. if (code == 0) {
  195. //更新本地数据,并删除已经保存过的数据
  196. if (operate == 'edit') {
  197. editSingle(data);
  198. } else if (operate == 'add') {
  199. removeItemByName("", data.name);
  200. }
  201. }
  202. }
  203. wx.removeStorageSync(appConfig.storeKeys.newItem);
  204. download(page, pageSize);
  205. }
  206. }
  207. },
  208. fail: function(res) {
  209. wx.hideLoading();
  210. app.warning(appConfig.networkError.msg);
  211. if (app.syncRes) {
  212. app.syncRes(appConfig.networkError);
  213. }
  214. }
  215. })
  216. return;
  217. };
  218. wx.request({
  219. url: utils.getUrl("download", {
  220. page: page,
  221. pageSize: pageSize
  222. }),
  223. header: header,
  224. dataType: 'json',
  225. success: function(res) {
  226. wx.hideLoading();
  227. app.storeToLocal(res);
  228. if (typeof res.data == 'string') {
  229. app.warning("拉取数据失败~");
  230. return;
  231. }
  232. var data = wx.getStorageSync(appConfig.storeKeys.password) || [];
  233. if (data.length == 0) {
  234. try {
  235. wx.setStorageSync(appConfig.storeKeys.password, res.data.lists);
  236. } catch (e) {}
  237. if (app.syncRes) {
  238. app.syncRes({
  239. code: 0,
  240. msg: "同步成功"
  241. });
  242. }
  243. return;
  244. }
  245. var showFinish = true;
  246. for (var i in res.data.lists) {
  247. var isExist = checkExist(res.data.lists[i]['id'], data);
  248. var _currentVal = res.data.lists[i];
  249. if (isExist !== false) {
  250. //如果存在的话, 数据不一致就提示用户是否更新
  251. if (!isSame(data[isExist], res.data.lists[i])) {
  252. showFinish = false;
  253. wx.showModal({
  254. title: '温馨提示',
  255. content: '您本地保存账户' + data[isExist]['account'] + '信息与服务器上保存的不一致',
  256. cancelText: "覆盖线上",
  257. confirmText: "覆盖本地",
  258. success: function(item) {
  259. if (item.confirm) {
  260. //覆盖本地
  261. data[isExist] = _currentVal;
  262. try {
  263. wx.setStorageSync(appConfig.storeKeys.password, data);
  264. if (appConfig.switchToLocal) {
  265. _this.getFromLocal(1, appConfig.pageSize);
  266. }
  267. } catch (e) {}
  268. download(page, pageSize);
  269. } else {
  270. //同步线上
  271. sync(data[isExist]);
  272. }
  273. }
  274. });
  275. return;
  276. }
  277. } else {
  278. data.unshift(res.data.lists[i]);
  279. }
  280. }
  281. try {
  282. wx.setStorageSync(appConfig.storeKeys.password, data);
  283. if (showFinish) {
  284. if (appConfig.switchToLocal) {
  285. _this.getFromLocal(1, appConfig.pageSize);
  286. }
  287. if (app.syncRes) {
  288. app.syncRes({
  289. code: 0,
  290. msg: "同步成功"
  291. });
  292. }
  293. }
  294. } catch (e) {}
  295. },
  296. fail: function(res) {
  297. wx.hideLoading();
  298. app.warning(appConfig.networkError.msg);
  299. if (app.syncRes) {
  300. app.syncRes(appConfig.networkError);
  301. }
  302. }
  303. });
  304. }
  305. var getFromLocal = function(page, pageSize, keyword) {
  306. var pages = {
  307. total: 0,
  308. currentPage: 1,
  309. totalPage: 0,
  310. pageSize: parseInt(pageSize)
  311. };
  312. var start = (parseInt(page) - 1) * pageSize;
  313. var end = pageSize;
  314. var data = wx.getStorageSync(appConfig.storeKeys.password) || [];
  315. //排序
  316. data.sort(function(x, y) {
  317. return parseInt(y['id']) - parseInt(x['id']);
  318. });
  319. //如果传了搜索关键字,就过滤一下数据再输出
  320. if(keyword != "") {
  321. var tmpArr = new Array();
  322. for(var i in data) {
  323. var val = data[i];
  324. if(val['name'].indexOf(keyword) != -1 ||
  325. val['account'].indexOf(keyword) != -1||
  326. val['note'].indexOf(keyword) != -1
  327. ) {
  328. tmpArr.push(data[i])
  329. }
  330. }
  331. data = tmpArr;
  332. }
  333. pages.total = parseInt(data.length);
  334. pages.totalPage = Math.ceil(pages.total / pages.pageSize);
  335. pages.currentPage = Math.min(parseInt(page), pages.totalPage);
  336. var lists = data.slice(start, end);
  337. var res = {
  338. pages: pages,
  339. lists: lists
  340. };
  341. return res;
  342. }
  343. module.exports = {
  344. info: info,
  345. editSingle: editSingle,
  346. download: download,
  347. sync: download,
  348. getFromLocal: getFromLocal,
  349. addItem: addItem,
  350. removeItemByName: removeItemByName,
  351. }