From 1b23b4621ab82c2978a6a8968060d3d4b4c928fc Mon Sep 17 00:00:00 2001 From: kuaifan Date: Fri, 9 Dec 2022 22:54:15 +0800 Subject: [PATCH] =?UTF-8?q?perf:=20=E4=BC=98=E5=8C=96=E6=9C=AC=E5=9C=B0?= =?UTF-8?q?=E6=95=B0=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- electron/drawio.js | 14 +- package.json | 1 + resources/assets/js/App.vue | 33 ++-- resources/assets/js/app.js | 29 +-- .../assets/js/components/Mobile/Back.vue | 6 +- resources/assets/js/components/OnlyOffice.vue | 30 +-- .../assets/js/components/RightBottom.vue | 44 ++--- resources/assets/js/functions/common.js | 109 +++++------ resources/assets/js/language/index.js | 13 +- resources/assets/js/pages/login.vue | 34 ++-- resources/assets/js/pages/manage.vue | 25 ++- .../manage/components/ChatInput/index.vue | 6 +- .../js/pages/manage/components/TaskAdd.vue | 14 +- resources/assets/js/pages/manage/file.vue | 64 ++++--- .../assets/js/pages/manage/messenger.vue | 6 +- .../assets/js/pages/manage/setting/index.vue | 4 +- .../js/pages/manage/setting/keyboard.vue | 4 +- resources/assets/js/store/actions.js | 174 +++++++++++------- resources/assets/js/store/state.js | 55 ++---- resources/views/setting.blade.php | 4 +- 20 files changed, 346 insertions(+), 323 deletions(-) diff --git a/electron/drawio.js b/electron/drawio.js index 788a6f720..b9e191dbb 100644 --- a/electron/drawio.js +++ b/electron/drawio.js @@ -1,9 +1,11 @@ -window.utilsStorage={getStorageString(key,def=''){let value=this.operationStorage(key);return typeof value==="string"||typeof value==="number"?value:def},operationStorage(key,value){if(!key){return}let keyName='__state__';if(key.substring(0,5)==='cache'){keyName='__state:'+key+'__'}if(typeof value==='undefined'){return this.loadFromlLocal(key,'',keyName)}else{this.savaToLocal(key,value,keyName)}},savaToLocal(key,value,keyName){try{if(typeof keyName==='undefined')keyName='__seller__';let seller=window.localStorage[keyName];if(!seller){seller={}}else{seller=JSON.parse(seller)}seller[key]=value;window.localStorage[keyName]=JSON.stringify(seller)}catch(e){}},loadFromlLocal(key,def,keyName){try{if(typeof keyName==='undefined')keyName='__seller__';let seller=window.localStorage[keyName];if(!seller){return def}seller=JSON.parse(seller);if(!seller||typeof seller[key]==='undefined'){return def}return seller[key]}catch(e){return def}},} - -window.cacheServerUrl = window.utilsStorage.getStorageString("cacheServerUrl") -if (window.cacheServerUrl) { - window.systemInfo.apiUrl = window.cacheServerUrl -} +!function(a){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=a();else if("function"==typeof define&&define.amd)define([],a);else{var b;b="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this,b.localforage=a()}}(function(){return function a(b, c, d){function e(g, h){if(!c[g]){if(!b[g]){var i="function"==typeof require&&require;if(!h&&i)return i(g,!0);if(f)return f(g,!0);var j=new Error("Cannot find module '"+g+"'");throw j.code="MODULE_NOT_FOUND",j}var k=c[g]={exports:{}};b[g][0].call(k.exports,function(a){var c=b[g][1][a];return e(c||a)},k,k.exports,a,b,c,d)}return c[g].exports}for(var f="function"==typeof require&&require,g=0; g=43)}}).catch(function(){return!1})}function n(a){return"boolean"==typeof xa?va.resolve(xa):m(a).then(function(a){return xa=a})}function o(a){var b=ya[a.name],c={};c.promise=new va(function(a, b){c.resolve=a,c.reject=b}),b.deferredOperations.push(c),b.dbReady?b.dbReady=b.dbReady.then(function(){return c.promise}):b.dbReady=c.promise}function p(a){var b=ya[a.name],c=b.deferredOperations.pop();if(c)return c.resolve(),c.promise}function q(a, b){var c=ya[a.name],d=c.deferredOperations.pop();if(d)return d.reject(b),d.promise}function r(a, b){return new va(function(c, d){if(ya[a.name]=ya[a.name]||B(),a.db){if(!b)return c(a.db);o(a),a.db.close()}var e=[a.name];b&&e.push(a.version);var f=ua.open.apply(ua,e);b&&(f.onupgradeneeded=function(b){var c=f.result;try{c.createObjectStore(a.storeName),b.oldVersion<=1&&c.createObjectStore(wa)}catch(c){if("ConstraintError"!==c.name)throw c;console.warn('The database "'+a.name+'" has been upgraded from version '+b.oldVersion+" to version "+b.newVersion+', but the storage "'+a.storeName+'" already exists.')}}),f.onerror=function(a){a.preventDefault(),d(f.error)},f.onsuccess=function(){var b=f.result;b.onversionchange=function(a){a.target.close()},c(b),p(a)}})}function s(a){return r(a,!1)}function t(a){return r(a,!0)}function u(a, b){if(!a.db)return!0;var c=!a.db.objectStoreNames.contains(a.storeName),d=a.versiona.db.version;if(d&&(a.version!==b&&console.warn('The database "'+a.name+"\" can't be downgraded from version "+a.db.version+" to version "+a.version+"."),a.version=a.db.version),e||c){if(c){var f=a.db.version+1;f>a.version&&(a.version=f)}return!0}return!1}function v(a){return new va(function(b, c){var d=new FileReader;d.onerror=c,d.onloadend=function(c){var d=btoa(c.target.result||"");b({__local_forage_encoded_blob:!0,data:d,type:a.type})},d.readAsBinaryString(a)})}function w(a){return g([l(atob(a.data))],{type:a.type})}function x(a){return a&&a.__local_forage_encoded_blob}function y(a){var b=this,c=b._initReady().then(function(){var a=ya[b._dbInfo.name];if(a&&a.dbReady)return a.dbReady});return i(c,a,a),c}function z(a){o(a);for(var b=ya[a.name],c=b.forages,d=0; d0&&(!a.db||"InvalidStateError"===e.name||"NotFoundError"===e.name))return va.resolve().then(function(){if(!a.db||"NotFoundError"===e.name&&!a.db.objectStoreNames.contains(a.storeName)&&a.version<=a.db.version)return a.db&&(a.version=a.db.version+1),t(a)}).then(function(){return z(a).then(function(){A(a,b,c,d-1)})}).catch(c);c(e)}}function B(){return{forages:[],db:null,dbReady:null,deferredOperations:[]}}function C(a){function b(){return va.resolve()}var c=this,d={db:null};if(a)for(var e in a)d[e]=a[e];var f=ya[d.name];f||(f=B(),ya[d.name]=f),f.forages.push(c),c._initReady||(c._initReady=c.ready,c.ready=y);for(var g=[],h=0; h>4,k[i++]=(15&d)<<4|e>>2,k[i++]=(3&e)<<6|63&f;return j}function O(a){var b,c=new Uint8Array(a),d="";for(b=0; b>2],d+=Da[(3&c[b])<<4|c[b+1]>>4],d+=Da[(15&c[b+1])<<2|c[b+2]>>6],d+=Da[63&c[b+2]];return c.length%3==2?d=d.substring(0,d.length-1)+"=":c.length%3==1&&(d=d.substring(0,d.length-2)+"=="),d}function P(a, b){var c="";if(a&&(c=Ua.call(a)),a&&("[object ArrayBuffer]"===c||a.buffer&&"[object ArrayBuffer]"===Ua.call(a.buffer))){var d,e=Ga;a instanceof ArrayBuffer?(d=a,e+=Ia):(d=a.buffer,"[object Int8Array]"===c?e+=Ka:"[object Uint8Array]"===c?e+=La:"[object Uint8ClampedArray]"===c?e+=Ma:"[object Int16Array]"===c?e+=Na:"[object Uint16Array]"===c?e+=Pa:"[object Int32Array]"===c?e+=Oa:"[object Uint32Array]"===c?e+=Qa:"[object Float32Array]"===c?e+=Ra:"[object Float64Array]"===c?e+=Sa:b(new Error("Failed to get type for BinaryArray"))),b(e+O(d))}else if("[object Blob]"===c){var f=new FileReader;f.onload=function(){var c=Ea+a.type+"~"+O(this.result);b(Ga+Ja+c)},f.readAsArrayBuffer(a)}else try{b(JSON.stringify(a))}catch(c){console.error("Couldn't convert value into a JSON string: ",a),b(null,c)}}function Q(a){if(a.substring(0,Ha)!==Ga)return JSON.parse(a);var b,c=a.substring(Ta),d=a.substring(Ha,Ta);if(d===Ja&&Fa.test(c)){var e=c.match(Fa);b=e[1],c=c.substring(e[0].length)}var f=N(c);switch(d){case Ia:return f;case Ja:return g([f],{type:b});case Ka:return new Int8Array(f);case La:return new Uint8Array(f);case Ma:return new Uint8ClampedArray(f);case Na:return new Int16Array(f);case Pa:return new Uint16Array(f);case Oa:return new Int32Array(f);case Qa:return new Uint32Array(f);case Ra:return new Float32Array(f);case Sa:return new Float64Array(f);default:throw new Error("Unkown type: "+d)}}function R(a, b, c, d){a.executeSql("CREATE TABLE IF NOT EXISTS "+b.storeName+" (id INTEGER PRIMARY KEY, key unique, value)",[],c,d)}function S(a){var b=this,c={db:null};if(a)for(var d in a)c[d]="string"!=typeof a[d]?a[d].toString():a[d];var e=new va(function(a, d){try{c.db=openDatabase(c.name,String(c.version),c.description,c.size)}catch(a){return d(a)}c.db.transaction(function(e){R(e,c,function(){b._dbInfo=c,a()},function(a, b){d(b)})},d)});return c.serializer=Va,e}function T(a, b, c, d, e, f){a.executeSql(c,d,e,function(a, g){g.code===g.SYNTAX_ERR?a.executeSql("SELECT name FROM sqlite_master WHERE type='table' AND name = ?",[b.storeName],function(a, h){h.rows.length?f(a,g):R(a,b,function(){a.executeSql(c,d,e,f)},f)},f):f(a,g)},f)}function U(a, b){var c=this;a=j(a);var d=new va(function(b, d){c.ready().then(function(){var e=c._dbInfo;e.db.transaction(function(c){T(c,e,"SELECT * FROM "+e.storeName+" WHERE key = ? LIMIT 1",[a],function(a, c){var d=c.rows.length?c.rows.item(0).value:null;d&&(d=e.serializer.deserialize(d)),b(d)},function(a, b){d(b)})})}).catch(d)});return h(d,b),d}function V(a, b){var c=this,d=new va(function(b, d){c.ready().then(function(){var e=c._dbInfo;e.db.transaction(function(c){T(c,e,"SELECT * FROM "+e.storeName,[],function(c, d){for(var f=d.rows,g=f.length,h=0; h0)return void f(W.apply(e,[a,h,c,d-1]));g(b)}})})}).catch(g)});return h(f,c),f}function X(a, b, c){return W.apply(this,[a,b,c,1])}function Y(a, b){var c=this;a=j(a);var d=new va(function(b, d){c.ready().then(function(){var e=c._dbInfo;e.db.transaction(function(c){T(c,e,"DELETE FROM "+e.storeName+" WHERE key = ?",[a],function(){b()},function(a, b){d(b)})})}).catch(d)});return h(d,b),d}function Z(a){var b=this,c=new va(function(a, c){b.ready().then(function(){var d=b._dbInfo;d.db.transaction(function(b){T(b,d,"DELETE FROM "+d.storeName,[],function(){a()},function(a, b){c(b)})})}).catch(c)});return h(c,a),c}function $(a){var b=this,c=new va(function(a, c){b.ready().then(function(){var d=b._dbInfo;d.db.transaction(function(b){T(b,d,"SELECT COUNT(key) as c FROM "+d.storeName,[],function(b, c){var d=c.rows.item(0).c;a(d)},function(a, b){c(b)})})}).catch(c)});return h(c,a),c}function _(a, b){var c=this,d=new va(function(b, d){c.ready().then(function(){var e=c._dbInfo;e.db.transaction(function(c){T(c,e,"SELECT key FROM "+e.storeName+" WHERE id = ? LIMIT 1",[a+1],function(a, c){var d=c.rows.length?c.rows.item(0).key:null;b(d)},function(a, b){d(b)})})}).catch(d)});return h(d,b),d}function aa(a){var b=this,c=new va(function(a, c){b.ready().then(function(){var d=b._dbInfo;d.db.transaction(function(b){T(b,d,"SELECT key FROM "+d.storeName,[],function(b, c){for(var d=[],e=0; e '__WebKitDatabaseInfoTable__'",[],function(c, d){for(var e=[],f=0; f0}function ha(a){var b=this,c={};if(a)for(var d in a)c[d]=a[d];return c.keyPrefix=ea(a,b._defaultConfig),ga()?(b._dbInfo=c,c.serializer=Va,va.resolve()):va.reject()}function ia(a){var b=this,c=b.ready().then(function(){for(var a=b._dbInfo.keyPrefix,c=localStorage.length-1; c>=0; c--){var d=localStorage.key(c);0===d.indexOf(a)&&localStorage.removeItem(d)}});return h(c,a),c}function ja(a, b){var c=this;a=j(a);var d=c.ready().then(function(){var b=c._dbInfo,d=localStorage.getItem(b.keyPrefix+a);return d&&(d=b.serializer.deserialize(d)),d});return h(d,b),d}function ka(a, b){var c=this,d=c.ready().then(function(){for(var b=c._dbInfo,d=b.keyPrefix,e=d.length,f=localStorage.length,g=1,h=0; h=0; b--){var c=localStorage.key(b);0===c.indexOf(a)&&localStorage.removeItem(c)}}):va.reject("Invalid arguments"),h(d,b),d}function ra(a, b){a[b]=function(){var c=arguments;return a.ready().then(function(){return a[b].apply(a,c)})}}function sa(){for(var a=1; a { + window.cacheServerUrl = url || "" + if (window.cacheServerUrl) { + window.systemInfo.apiUrl = window.cacheServerUrl + } +}) window.SERVER_HOME_URL = window.systemInfo.apiUrl + "../"; while (window.SERVER_HOME_URL.indexOf("/../") !== -1) {window.SERVER_HOME_URL = window.SERVER_HOME_URL.replace(/\/(((?!\/).)*)\/\.\.\//, "/")} diff --git a/package.json b/package.json index a5a991529..d9a93d82e 100644 --- a/package.json +++ b/package.json @@ -31,6 +31,7 @@ "le5le-store": "^1.0.7", "less": "^4.1.2", "less-loader": "^10.2.0", + "localforage": "^1.10.0", "lodash": "^4.17.21", "moment": "^2.29.1", "node-sass": "^6.0.1", diff --git a/resources/assets/js/App.vue b/resources/assets/js/App.vue index 7f60b8ac0..93f477397 100755 --- a/resources/assets/js/App.vue +++ b/resources/assets/js/App.vue @@ -118,22 +118,25 @@ export default { }, 6000) } // - if ($A.openLog) { - $A.loadScript('js/vconsole.min.js', (e) => { - if (e !== null || typeof window.VConsole !== 'function') { - $A.modalError("vConsole 组件加载失败!"); - return; - } - window.vConsole = new window.VConsole({ - onReady: () => { - console.log('vConsole: onReady'); - }, - onClearLog: () => { - console.log('vConsole: onClearLog'); + $A.IDBString("logOpen").then(r => { + $A.openLog = r === "open" + if ($A.openLog) { + $A.loadScript('js/vconsole.min.js', (e) => { + if (e !== null || typeof window.VConsole !== 'function') { + $A.modalError("vConsole 组件加载失败!"); + return; } + window.vConsole = new window.VConsole({ + onReady: () => { + console.log('vConsole: onReady'); + }, + onClearLog: () => { + console.log('vConsole: onClearLog'); + } + }); }); - }); - } + } + }) } }, immediate: true @@ -237,7 +240,7 @@ export default { key: 'manifest', url: $A.apiUrl("../manifest") }) - $A.bindScreenshotKey($A.jsonParse(window.localStorage['__keyboard:data__'] || {})); + $A.bindScreenshotKey($A.jsonParse(window.localStorage.getItem("__keyboard:data__") || {})); }, eeuiEvents() { diff --git a/resources/assets/js/app.js b/resources/assets/js/app.js index 440e3ded7..9007f0936 100644 --- a/resources/assets/js/app.js +++ b/resources/assets/js/app.js @@ -141,7 +141,7 @@ $A.Platform = "web"; $A.isMainElectron = false; $A.isSubElectron = false; $A.isEEUiApp = isEEUiApp; -$A.openLog = $A.getStorageString("log::open") === "open"; +$A.openLog = false; if (isElectron) { $A.Electron = electron; $A.Platform = /macintosh|mac os x/i.test(navigator.userAgent) ? "mac" : "win"; @@ -193,16 +193,19 @@ Vue.prototype.$isEEUiApp = $A.isEEUiApp; Vue.config.productionTip = false; Vue.mixin(mixin) -const app = new Vue({ - el: '#app', - router, - store, - template: '', - components: { App } -}); +let app; +store.dispatch("init").then(_ => { + app = new Vue({ + el: '#app', + router, + store, + template: '', + components: { App } + }); -$A.goForward = app.goForward; -$A.goBack = app.goBack; -$A.Message = app.$Message; -$A.Notice = app.$Notice; -$A.Modal = app.$Modal; + $A.goForward = app.goForward; + $A.goBack = app.goBack; + $A.Message = app.$Message; + $A.Notice = app.$Notice; + $A.Modal = app.$Modal; +}) diff --git a/resources/assets/js/components/Mobile/Back.vue b/resources/assets/js/components/Mobile/Back.vue index 229e60709..f4034db0c 100644 --- a/resources/assets/js/components/Mobile/Back.vue +++ b/resources/assets/js/components/Mobile/Back.vue @@ -44,7 +44,7 @@ export default { }, computed: { - ...mapState(['files']), + ...mapState(['fileLists']), style() { const offset = 135; @@ -127,9 +127,9 @@ export default { return; } if (this.fileFolderId > 0) { - const file = this.files.find(({id, permission}) => id == this.fileFolderId && permission > -1) + const file = this.fileLists.find(({id, permission}) => id == this.fileFolderId && permission > -1) if (file) { - const prevFile = this.files.find(({id, permission}) => id == file.pid && permission > -1) + const prevFile = this.fileLists.find(({id, permission}) => id == file.pid && permission > -1) if (prevFile) { this.goForward({name: 'manage-file', params: {folderId: prevFile.id, fileId: null}}); return; diff --git a/resources/assets/js/components/OnlyOffice.vue b/resources/assets/js/components/OnlyOffice.vue index 47b039d04..be04afd42 100644 --- a/resources/assets/js/components/OnlyOffice.vue +++ b/resources/assets/js/components/OnlyOffice.vue @@ -255,22 +255,24 @@ export default { if (/\/hideenOfficeTitle\//.test(window.navigator.userAgent)) { config.document.title = " "; } - if (this.readOnly || this.historyId > 0) { - config.editorConfig.mode = "view"; - config.editorConfig.callbackUrl = null; - if (!config.editorConfig.user.id) { - let viewer = $A.getStorageInt("viewer") - if (!viewer) { - viewer = $A.randNum(1000, 99999); - $A.setStorage("viewer", viewer) + (async _ => { + if (this.readOnly || this.historyId > 0) { + config.editorConfig.mode = "view"; + config.editorConfig.callbackUrl = null; + if (!config.editorConfig.user.id) { + let officeViewer = await $A.IDBInt("officeViewer") + if (!officeViewer) { + officeViewer = $A.randNum(1000, 99999); + await $A.IDBSet("officeViewer", officeViewer) + } + config.editorConfig.user.id = "viewer_" + officeViewer; + config.editorConfig.user.name = "Viewer_" + officeViewer } - config.editorConfig.user.id = "viewer_" + viewer; - config.editorConfig.user.name = "Viewer_" + viewer } - } - this.$nextTick(() => { - this.docEditor = new DocsAPI.DocEditor(this.id, config); - }) + this.$nextTick(() => { + this.docEditor = new DocsAPI.DocEditor(this.id, config); + }) + })() }, onDocumentReady() { diff --git a/resources/assets/js/components/RightBottom.vue b/resources/assets/js/components/RightBottom.vue index d7719a300..d6bb30df1 100644 --- a/resources/assets/js/components/RightBottom.vue +++ b/resources/assets/js/components/RightBottom.vue @@ -169,29 +169,31 @@ export default { break; case 'github': - let key = "cacheAppdown::" + this.apiVersion - let cache = $A.getStorageJson(key); - let timeout = 600; - if (cache.time && cache.time + timeout > Math.round(new Date().getTime() / 1000)) { - this.downloadUrl = cache.data.html_url; - return; - } - // - if (this.loadIng > 0) { - return; - } - this.loadIng++; - axios.get(`https://api.github.com/repos/${publish.owner}/${publish.repo}/releases`).then(({status, data}) => { - this.loadIng--; - if (status === 200 && $A.isArray(data)) { - cache.time = Math.round(new Date().getTime() / 1000) - cache.data = data.find(({tag_name}) => this.compareVersion(this.tagVersion(tag_name), this.apiVersion) === 0) || {} - $A.setStorage(key, cache); + (async _ => { + let key = "cacheAppdown::" + this.apiVersion + let cache = await $A.IDBJson(key); + let timeout = 600; + if (cache.time && cache.time + timeout > Math.round(new Date().getTime() / 1000)) { this.downloadUrl = cache.data.html_url; + return; } - }).catch(() => { - this.loadIng--; - }); + // + if (this.loadIng > 0) { + return; + } + this.loadIng++; + axios.get(`https://api.github.com/repos/${publish.owner}/${publish.repo}/releases`).then(({status, data}) => { + this.loadIng--; + if (status === 200 && $A.isArray(data)) { + cache.time = Math.round(new Date().getTime() / 1000) + cache.data = data.find(({tag_name}) => this.compareVersion(this.tagVersion(tag_name), this.apiVersion) === 0) || {} + $A.IDBSave(key, cache); + this.downloadUrl = cache.data.html_url; + } + }).catch(() => { + this.loadIng--; + }); + })() break; } }, diff --git a/resources/assets/js/functions/common.js b/resources/assets/js/functions/common.js index 4ab72b283..e12341790 100755 --- a/resources/assets/js/functions/common.js +++ b/resources/assets/js/functions/common.js @@ -1,9 +1,12 @@ +const localforage = require("localforage"); + /** * 基础函数 */ (function (window, $, undefined) { window.systemInfo = window.systemInfo || {}; window.modalTransferIndex = 1000; + localforage.config({name: 'DooTask', storeName: 'common'}); /** * ============================================================================= @@ -1213,90 +1216,68 @@ /** * ============================================================================= - * ***************************** localStorage ****************************** + * ***************************** localForage ****************************** * ============================================================================= */ $.extend({ - setStorage(key, value) { - return this.operationStorage(key, value); + __IDBTimer: {}, + + IDBSave(key, value, delay = 0) { + if (typeof this.__IDBTimer[key] !== "undefined") { + clearTimeout(this.__IDBTimer[key]) + delete this.__IDBTimer[key] + } + if (delay > 0) { + this.__IDBTimer[key] = setTimeout(_ => this.IDBSave(key, value, 0), delay) + } else { + localforage.setItem(key, value).then(_ => {}) + } }, - getStorage(key, def = null) { - let value = this.operationStorage(key); - return value || def; + IDBDel(key) { + localforage.removeItem(key).then(_ => {}) }, - getStorageString(key, def = '') { - let value = this.operationStorage(key); + IDBSet(key, value) { + return localforage.setItem(key, value).then(_ => {}) + }, + + IDBRemove(key) { + return localforage.removeItem(key) + }, + + IDBClear() { + return localforage.clear() + }, + + IDBValue(key) { + return localforage.getItem(key) + }, + + async IDBString(key, def = "") { + const value = await this.IDBValue(key) return typeof value === "string" || typeof value === "number" ? value : def; }, - getStorageInt(key, def = 0) { - let value = this.operationStorage(key); + async IDBInt(key, def = 0) { + const value = await this.IDBValue(key) return typeof value === "number" ? value : def; }, - getStorageBoolean(key, def = false) { - let value = this.operationStorage(key); + async IDBBoolean(key, def = false) { + const value = await this.IDBValue(key) return typeof value === "boolean" ? value : def; }, - getStorageArray(key, def = []) { - let value = this.operationStorage(key); + async IDBArray(key, def = []) { + const value = await this.IDBValue(key) return this.isArray(value) ? value : def; }, - getStorageJson(key, def = {}) { - let value = this.operationStorage(key); + async IDBJson(key, def = {}) { + const value = await this.IDBValue(key) return this.isJson(value) ? value : def; - }, - - operationStorage(key, value) { - if (!key) { - return; - } - let keyName = '__state__'; - if (key.substring(0, 5) === 'cache') { - keyName = '__state:' + key + '__'; - } - if (typeof value === 'undefined') { - return this.loadFromlLocal(key, '', keyName); - } else { - this.savaToLocal(key, value, keyName); - } - }, - - savaToLocal(key, value, keyName) { - try { - if (typeof keyName === 'undefined') keyName = '__seller__'; - let seller = window.localStorage[keyName]; - if (!seller) { - seller = {}; - } else { - seller = JSON.parse(seller); - } - seller[key] = value; - window.localStorage[keyName] = JSON.stringify(seller); - } catch (e) { - } - }, - - loadFromlLocal(key, def, keyName) { - try { - if (typeof keyName === 'undefined') keyName = '__seller__'; - let seller = window.localStorage[keyName]; - if (!seller) { - return def; - } - seller = JSON.parse(seller); - if (!seller || typeof seller[key] === 'undefined') { - return def; - } - return seller[key]; - } catch (e) { - return def; - } - }, + } }); /** diff --git a/resources/assets/js/language/index.js b/resources/assets/js/language/index.js index 78e9cb61b..24bf54e10 100644 --- a/resources/assets/js/language/index.js +++ b/resources/assets/js/language/index.js @@ -70,8 +70,8 @@ let languageUtils = { * @returns {string} */ getLanguage() { - if (typeof window.localStorage['__language:type__'] === "string") { - return window.localStorage['__language:type__']; + if (typeof window.localStorage.getItem("__language:type__") === "string") { + return window.localStorage.getItem("__language:type__"); } let lang = 'EN'; let navLang = ((window.navigator.language || navigator.userLanguage) + "").toUpperCase(); @@ -92,7 +92,8 @@ let languageUtils = { lang = 'TC' break; } - return window.localStorage['__language:type__'] = lang; + window.localStorage.setItem("__language:type__", lang) + return lang } }; let languageInit = false; @@ -133,7 +134,7 @@ function setLanguage(language) { cancelText: '取消', okText: '确定', onOk: () => { - window.localStorage['__language:type__'] = language; + window.localStorage.setItem("__language:type__", language) $A.reloadUrl() } }); @@ -201,7 +202,7 @@ function switchLanguage(text) { setTimeout(_ => { try { let key = '__language:Undefined__'; - let languageTmp = JSON.parse(window.localStorage[key] || '[]'); + let languageTmp = JSON.parse(window.localStorage.getItem(key) || '[]'); if (!languageUtils.isArray(languageTmp)) { languageTmp = []; } @@ -212,7 +213,7 @@ function switchLanguage(text) { }); if (!tmpData) { languageTmp.push(text); - window.localStorage[key] = JSON.stringify(languageTmp); + window.localStorage.setItem(key, JSON.stringify(languageTmp)); } } catch (e) { } }, 10) diff --git a/resources/assets/js/pages/login.vue b/resources/assets/js/pages/login.vue index 2a7bef128..03d512876 100644 --- a/resources/assets/js/pages/login.vue +++ b/resources/assets/js/pages/login.vue @@ -17,7 +17,7 @@ size="large" readonly clearable - @on-clear="clearServerUrl"/> + @on-clear="setServerUrl('')"/> {}); } else { - this.clearServerUrl(); + this.setServerUrl('').catch(_ => {}); } // this.subscribe = Store.subscribe('useSSOLogin', () => { @@ -347,8 +351,8 @@ export default { this.$store.dispatch("call", { url: `${url}system/setting`, checkNetwork: false, - }).then(() => { - this.setServerUrl(url) + }).then(async () => { + await this.setServerUrl(url) resolve() }).catch(({ret, msg}) => { if (ret === -1001) { @@ -366,10 +370,8 @@ export default { chackServerUrl(tip) { return new Promise((resolve, reject) => { if (this.isNotServer()) { - if (tip === true) { - $A.messageWarning("请设置服务器") - } this.inputServerUrl() + tip === true && this.$nextTick(_ => $A.messageWarning("请设置服务器")) reject() } else { resolve() @@ -377,19 +379,15 @@ export default { }) }, - setServerUrl(value) { - $A.setStorage("cachePrivacyShow", value ? "no" : "yes") + async setServerUrl(value) { + await $A.IDBSet("cachePrivacyShow", value ? "no" : "yes") // if (value != this.cacheServerUrl) { - $A.setStorage("cacheServerUrl", value) + await $A.IDBSet("cacheServerUrl", value) $A.reloadUrl(); } }, - clearServerUrl() { - this.setServerUrl("") - }, - isNotServer() { let apiHome = $A.getDomain(window.systemInfo.apiUrl) return this.isSoftware && (apiHome == "" || apiHome == "public") @@ -461,8 +459,8 @@ export default { invite: this.invite, }, }).then(({data}) => { + $A.IDBSave("cacheLoginEmail", this.email) this.codeNeed = false; - $A.setStorage("cacheLoginEmail", this.email) this.$store.dispatch("handleClearCache", data).then(() => { this.goNext(); }).catch(_ => { diff --git a/resources/assets/js/pages/manage.vue b/resources/assets/js/pages/manage.vue index 88a2d9410..5c1b3e20d 100644 --- a/resources/assets/js/pages/manage.vue +++ b/resources/assets/js/pages/manage.vue @@ -408,11 +408,7 @@ export default { }, mounted() { - if ($A.getStorageString("clearCache")) { - $A.setStorage("clearCache", "") - $A.messageSuccess("清除成功"); - } - // + this.chackClear(); this.notificationInit(); // this.addTaskSubscribe = Store.subscribe('addTask', this.onAddTask); @@ -700,17 +696,26 @@ export default { }, methods: { + async chackClear() { + const val = await $A.IDBString("clearCache") + if (val) { + await $A.IDBRemove("clearCache") + $A.messageSuccess("清除成功"); + } + }, + chackPass() { if (this.userInfo.changepass === 1) { this.goForward({name: 'manage-setting-password'}); } }, - toggleRoute(path, params) { + async toggleRoute(path, params) { this.show768Menu = false; let location = {name: 'manage-' + path, params: params || {}}; - if (path === 'file' && $A.getStorageInt("file::folderId") > 0) { - location.params.folderId = $A.getStorageInt("file::folderId") + let fileFolderId = await $A.IDBInt("fileFolderId"); + if (path === 'file' && fileFolderId > 0) { + location.params.folderId = fileFolderId } this.goForward(location); }, @@ -743,8 +748,8 @@ export default { Store.set('updateNotification', null); return; case 'clearCache': - this.$store.dispatch("handleClearCache", null).then(() => { - $A.setStorage("clearCache", $A.randomString(6)) + this.$store.dispatch("handleClearCache", null).then(async () => { + await $A.IDBSet("clearCache", $A.randomString(6)) $A.reloadUrl() }).catch(() => { $A.reloadUrl() diff --git a/resources/assets/js/pages/manage/components/ChatInput/index.vue b/resources/assets/js/pages/manage/components/ChatInput/index.vue index 4e6ef2765..51ff0dbdf 100755 --- a/resources/assets/js/pages/manage/components/ChatInput/index.vue +++ b/resources/assets/js/pages/manage/components/ChatInput/index.vue @@ -791,10 +791,8 @@ export default { } else { this.$store.state.dialogInputCache.push(data) } - this.__setInputCache && clearTimeout(this.__setInputCache); - this.__setInputCache = setTimeout(_ => { - $A.setStorage("cacheDialogInput", this.$store.state.dialogInputCache); - }, 600) + // + $A.IDBSave("dialogInputCache", this.$store.state.dialogInputCache, 600); }, onClickEditor() { diff --git a/resources/assets/js/pages/manage/components/TaskAdd.vue b/resources/assets/js/pages/manage/components/TaskAdd.vue index 35c9b517f..a8f5953f5 100644 --- a/resources/assets/js/pages/manage/components/TaskAdd.vue +++ b/resources/assets/js/pages/manage/components/TaskAdd.vue @@ -229,9 +229,9 @@ export default { } }, - mounted() { + async mounted() { this.initCascaderData(); - this.initProjectData(); + await this.initProjectData(); this.$nextTick(() => this.$refs.input.focus()) }, @@ -265,12 +265,12 @@ export default { watch: { 'addData.project_id'(projectId) { if (projectId > 0) { - $A.setStorage("cacheAddTaskProjectId", projectId); + $A.IDBSave("cacheAddTaskProjectId", projectId); } }, 'addData.column_id'(columnId) { if (columnId > 0) { - $A.setStorage("cacheAddTaskColumnId", columnId); + $A.IDBSave("cacheAddTaskColumnId", columnId); } const {project_id} = this.addData; if (project_id && columnId) { @@ -314,14 +314,14 @@ export default { /** * 初始化项目、列表、优先级 */ - initProjectData() { + async initProjectData() { // 项目、列表 - let cacheAddTaskProjectId = $A.getStorageInt("cacheAddTaskProjectId"); + let cacheAddTaskProjectId = await $A.IDBInt("cacheAddTaskProjectId"); let project = this.cacheProjects.find(({id}) => id == this.projectId) || this.cacheProjects.find(({id}) => id == cacheAddTaskProjectId) || this.cacheProjects.find(({id}) => id > 0); if (project) { - let cacheAddTaskColumnId = $A.getStorageInt("cacheAddTaskColumnId"); + let cacheAddTaskColumnId = await $A.IDBInt("cacheAddTaskColumnId"); let column = this.cacheColumns.find(({project_id, id}) => project_id == project.id && id == cacheAddTaskColumnId) || this.cacheColumns.find(({project_id}) => project_id == project.id); if (column) { diff --git a/resources/assets/js/pages/manage/file.vue b/resources/assets/js/pages/manage/file.vue index 3c6810f6c..3e19f8e67 100644 --- a/resources/assets/js/pages/manage/file.vue +++ b/resources/assets/js/pages/manage/file.vue @@ -398,6 +398,7 @@ import DialogSelect from "./components/DialogSelect"; const FilePreview = () => import('./components/FilePreview'); const FileContent = () => import('./components/FileContent'); +const FileObject = {sort: null, mode: null}; export default { components: {DialogSelect, PreviewImage, FilePreview, DrawerOverlay, UserInput, FileContent}, @@ -459,7 +460,7 @@ export default { } ], - tableMode: $A.getStorageString("fileTableMode"), + tableMode: "", columns: [], shareShow: false, @@ -510,8 +511,15 @@ export default { } }, + async beforeRouteEnter(to, from, next) { + FileObject.sort = await $A.IDBJson("cacheFileSort") + FileObject.mode = await $A.IDBString("fileTableMode") + next() + }, + + created() { - const sort = $A.getStorageJson("cacheFileSort") + this.tableMode = FileObject.mode this.columns = [ { type: 'selection', @@ -543,14 +551,14 @@ export default { row.newname = event.target.value; }, 'on-blur': () => { - const file = this.files.find(({id}) => id == row.id); + const file = this.fileLists.find(({id}) => id == row.id); if (file) { file.newname = row.newname; this.onBlur(file) } }, 'on-enter': () => { - const file = this.files.find(({id}) => id == row.id); + const file = this.fileLists.find(({id}) => id == row.id); if (file) { file.newname = row.newname; this.onEnter(file) @@ -575,7 +583,7 @@ export default { }, on: { 'on-edit-change': (b) => { - const file = this.files.find(({id}) => id == row.id); + const file = this.fileLists.find(({id}) => id == row.id); if (file) { setTimeout(() => { this.setEdit(file.id, b) @@ -583,7 +591,7 @@ export default { } }, 'on-update': (val, cb) => { - const file = this.files.find(({id}) => id == row.id); + const file = this.fileLists.find(({id}) => id == row.id); if (file) { file.newname = val this.onEnter(file); @@ -695,8 +703,8 @@ export default { sortable: true, }, ].map(item => { - if (item.key === sort.key) { - item.sortType = sort.order + if (item.key === FileObject.sort.key) { + item.sortType = FileObject.sort.order } return item; }); @@ -716,7 +724,7 @@ export default { }, computed: { - ...mapState(['userIsAdmin', 'userInfo', 'files', 'wsOpenNum']), + ...mapState(['userIsAdmin', 'userInfo', 'fileLists', 'wsOpenNum']), pid() { const {folderId} = this.$route.params; @@ -748,8 +756,8 @@ export default { }, fileList() { - const {files, searchKey, pid, selectIds} = this; - const list = $A.cloneJSON(sortBy(files.filter((file) => { + const {fileLists, searchKey, pid, selectIds} = this; + const list = $A.cloneJSON(sortBy(fileLists.filter((file) => { if (searchKey) { return file.name.indexOf(searchKey) !== -1; } @@ -764,18 +772,18 @@ export default { }, shearFirst() { - const {files, shearIds} = this; + const {fileLists, shearIds} = this; if (shearIds.length === 0) { return null; } - return files.find(item => item.id == shearIds[0]) + return fileLists.find(item => item.id == shearIds[0]) }, navigator() { - let {pid, files} = this; + let {pid, fileLists} = this; let array = []; while (pid > 0) { - let file = files.find(({id, permission}) => id == pid && permission > -1); + let file = fileLists.find(({id, permission}) => id == pid && permission > -1); if (file) { array.unshift(file); pid = file.pid; @@ -835,7 +843,7 @@ export default { }, tableMode(val) { - $A.setStorage("fileTableMode", val) + $A.IDBSave("fileTableMode", val) }, fileShow(val) { @@ -897,10 +905,10 @@ export default { return; } this.loadIng++; - this.$store.dispatch("getFiles", this.pid).then(() => { + this.$store.dispatch("getFiles", this.pid).then(async () => { this.loadIng--; this.openFileJudge() - $A.setStorage("file::folderId", this.pid) + await $A.IDBSet("fileFolderId", this.pid) }).catch(({msg}) => { this.loadIng--; $A.modalError({ @@ -925,7 +933,7 @@ export default { return; } let id = $A.randomString(8); - this.files.push({ + this.fileLists.push({ _edit: true, pid: this.pid, id: id, @@ -1077,7 +1085,7 @@ export default { }, handleContextMenu(row, event) { - this.handleRightClick(event, this.files.find(({id}) => id === row.id) || {}); + this.handleRightClick(event, this.fileLists.find(({id}) => id === row.id) || {}); }, handleContextClick(command) { @@ -1093,7 +1101,7 @@ export default { }, handleVisibleChangeMenu(visible) { - let file = this.files.find(({_highlight}) => !!_highlight) + let file = this.fileLists.find(({_highlight}) => !!_highlight) if (file) { this.$set(file, '_highlight', false); } @@ -1300,7 +1308,7 @@ export default { return; } if (this.isParentShare) { - const tmpFile = this.files.find(({id, share}) => share && this.shearIds.includes(id)); + const tmpFile = this.fileLists.find(({id, share}) => share && this.shearIds.includes(id)); if (tmpFile) { $A.modalError(`${tmpFile.name} 当前正在共享,无法移动到另一个共享文件夹内`) return; @@ -1325,9 +1333,9 @@ export default { if (ids.length === 0) { return } - const firstFile = this.files.find(item => item.id == ids[0]) || {}; + const firstFile = this.fileLists.find(item => item.id == ids[0]) || {}; const allFolder = !ids.find(id => { - return this.files.find(item => item.type != 'folder' && item.id == id) + return this.fileLists.find(item => item.type != 'folder' && item.id == id) }); let typeName = allFolder ? "文件夹" : "文件" let fileName = `【${firstFile.name}】等${ids.length}个${typeName}` @@ -1373,7 +1381,7 @@ export default { }, onBlur(item) { - if (this.files.find(({id, _edit}) => id == item.id && !_edit)) { + if (this.fileLists.find(({id, _edit}) => id == item.id && !_edit)) { return; } this.onEnter(item); @@ -1439,7 +1447,7 @@ export default { }, setEdit(fileId, is) { - let item = this.$store.state.files.find(({id}) => id == fileId) + const item = this.$store.state.fileLists.find(({id}) => id == fileId) if (item) { this.$set(item, '_edit', is); if (is) { @@ -1449,7 +1457,7 @@ export default { }, setLoad(fileId, is) { - let item = this.$store.state.files.find(({id}) => id == fileId) + const item = this.$store.state.fileLists.find(({id}) => id == fileId) if (item) { this.$set(item, '_load', is); } @@ -1580,7 +1588,7 @@ export default { }, handleTableSort({key, order}) { - $A.setStorage("cacheFileSort", ['asc', 'desc'].includes(order) ? {key, order} : {}); + $A.IDBSave("cacheFileSort", ['asc', 'desc'].includes(order) ? {key, order} : {}); }, handleTableSelect(selection) { diff --git a/resources/assets/js/pages/manage/messenger.vue b/resources/assets/js/pages/manage/messenger.vue index 952cf2c20..8cb8f9a8c 100644 --- a/resources/assets/js/pages/manage/messenger.vue +++ b/resources/assets/js/pages/manage/messenger.vue @@ -397,14 +397,12 @@ export default { case 'log.open': case 'log:open': case 'eruda:open': - $A.setStorage("log::open", "open"); - $A.reloadUrl(); + $A.IDBSet("logOpen", "open").then(_ => $A.reloadUrl()); break; case 'log.close': case 'log:close': case 'eruda:close': - $A.setStorage("log::open", "close"); - $A.reloadUrl(); + $A.IDBSet("logOpen", "close").then(_ => $A.reloadUrl()); break; } // diff --git a/resources/assets/js/pages/manage/setting/index.vue b/resources/assets/js/pages/manage/setting/index.vue index 1ca13468a..c7a642dcc 100644 --- a/resources/assets/js/pages/manage/setting/index.vue +++ b/resources/assets/js/pages/manage/setting/index.vue @@ -137,8 +137,8 @@ export default { toggleRoute(path) { switch (path) { case 'clearCache': - this.$store.dispatch("handleClearCache", null).then(() => { - $A.setStorage("clearCache", $A.randomString(6)) + this.$store.dispatch("handleClearCache", null).then(async () => { + await $A.IDBSet("clearCache", $A.randomString(6)) $A.reloadUrl() }).catch(() => { $A.reloadUrl() diff --git a/resources/assets/js/pages/manage/setting/keyboard.vue b/resources/assets/js/pages/manage/setting/keyboard.vue index 68e96c642..3b285d775 100644 --- a/resources/assets/js/pages/manage/setting/keyboard.vue +++ b/resources/assets/js/pages/manage/setting/keyboard.vue @@ -67,7 +67,7 @@ export default { screenshot_mate: true, screenshot_shift: true, screenshot_key: '', - }, $A.jsonParse(window.localStorage['__keyboard:data__'] || {})); + }, $A.jsonParse(window.localStorage.getItem("__keyboard:data__") || {})); // this.formData_bak = $A.cloneJSON(this.formData); }, @@ -84,7 +84,7 @@ export default { submitForm() { this.$refs.formData.validate((valid) => { if (valid) { - window.localStorage['__keyboard:data__'] = $A.jsonStringify(this.formData); + window.localStorage.setItem("__keyboard:data__", $A.jsonStringify(this.formData)); $A.bindScreenshotKey(this.formData); $A.messageSuccess('保存成功'); } diff --git a/resources/assets/js/store/actions.js b/resources/assets/js/store/actions.js index 6ae2cd057..40ce9b29e 100644 --- a/resources/assets/js/store/actions.js +++ b/resources/assets/js/store/actions.js @@ -2,6 +2,60 @@ import {Store} from 'le5le-store'; import {languageType} from "../language"; export default { + /** + * 初始化 + * @param state + * @param dispatch + * @returns {Promise} + */ + init({state, dispatch}) { + return new Promise(async resolve => { + // 读取缓存 + state.cacheServerUrl = await $A.IDBString("cacheServerUrl") + state.cacheUserBasic = await $A.IDBArray("cacheUserBasic") + state.cacheDialogs = (await $A.IDBArray("cacheDialogs")).map(item => Object.assign(item, {loading: false})) + state.cacheProjects = await $A.IDBArray("cacheProjects") + state.cacheColumns = await $A.IDBArray("cacheColumns") + state.cacheTasks = await $A.IDBArray("cacheTasks") + state.cacheProjectParameter = await $A.IDBArray("cacheProjectParameter") + state.cacheTaskBrowse = await $A.IDBArray("cacheTaskBrowse") + state.dialogMsgs = await $A.IDBArray("dialogMsgs") + state.dialogInputCache = await $A.IDBArray("dialogInputCache") + state.fileLists = await $A.IDBArray("fileLists") + state.userInfo = await $A.IDBJson("userInfo") + + // 会员信息 + if (state.userInfo.userid) { + state.userId = state.userInfo.userid = $A.runNum(state.userInfo.userid) + state.userToken = state.userInfo.token + state.userIsAdmin = $A.inArray("admin", state.userInfo.identity) + } + + // ServerUrl + if (state.cacheServerUrl) { + window.systemInfo.apiUrl = state.cacheServerUrl + } + + // 主题皮肤 + switch (state.themeMode) { + case 'dark': + $A.dark.enableDarkMode() + break; + case 'light': + $A.dark.disableDarkMode() + break; + default: + state.themeMode = "auto" + $A.dark.autoDarkMode() + break; + } + state.themeIsDark = $A.dark.isDarkEnabled() + + // + resolve() + }) + }, + /** * 访问接口 * @param state @@ -227,9 +281,8 @@ export default { key = {[key]: value || !cache[key]}; } state.cacheProjectParameter.splice(index, 1, Object.assign(cache, key)) - setTimeout(() => { - $A.setStorage("cacheProjectParameter", state.cacheProjectParameter); - }); + // + $A.IDBSave("cacheProjectParameter", state.cacheProjectParameter); } }, @@ -267,7 +320,7 @@ export default { } state.themeMode = mode; state.themeIsDark = $A.dark.isDarkEnabled(); - window.localStorage['__theme:mode__'] = mode; + window.localStorage.setItem("__theme:mode__", mode); resolve(true) }); }, @@ -328,7 +381,7 @@ export default { * @returns {Promise} */ saveUserInfo({state, dispatch}, info) { - return new Promise(function (resolve) { + return new Promise(async resolve => { const userInfo = $A.cloneJSON(info); userInfo.userid = $A.runNum(userInfo.userid); userInfo.token = userInfo.userid > 0 ? (userInfo.token || state.userToken) : ''; @@ -336,7 +389,8 @@ export default { state.userId = userInfo.userid; state.userToken = userInfo.token; state.userIsAdmin = $A.inArray('admin', userInfo.identity); - $A.setStorage("userInfo", state.userInfo); + await $A.IDBSet("userInfo", state.userInfo); + // dispatch("getBasicData", null); if (state.userId > 0) { dispatch("saveUserBasic", state.userInfo); @@ -436,9 +490,8 @@ export default { } state.cacheUserActive = Object.assign(data, {__:Math.random()}); Store.set('cacheUserActive', data); - setTimeout(() => { - $A.setStorage("cacheUserBasic", state.cacheUserBasic); - }) + // + $A.IDBSave("cacheUserBasic", state.cacheUserBasic) }, /** @@ -515,30 +568,31 @@ export default { * @returns {Promise} */ handleClearCache({state, dispatch}, userInfo) { - return new Promise(function (resolve) { + return new Promise(async resolve => { try { - const cacheLoginEmail = $A.getStorageString("cacheLoginEmail"); - const cacheFileSort = $A.getStorageJson("cacheFileSort"); - const languageType = window.localStorage['__language:type__']; - const keyboardData = window.localStorage['__keyboard:data__']; - const themeMode = window.localStorage['__theme:mode__']; - // - window.localStorage.clear(); - // state.cacheUserBasic = []; state.cacheDialogs = []; state.cacheProjects = []; state.cacheColumns = []; state.cacheTasks = []; // - window.localStorage['__language:type__'] = languageType; - window.localStorage['__keyboard:data__'] = keyboardData; - window.localStorage['__theme:mode__'] = themeMode; - $A.setStorage("cacheProjectParameter", state.cacheProjectParameter); - $A.setStorage("cacheServerUrl", state.cacheServerUrl); - $A.setStorage("cacheLoginEmail", cacheLoginEmail); - $A.setStorage("cacheFileSort", cacheFileSort); - $A.setStorage("cacheTaskBrowse", state.cacheTaskBrowse); + const cacheLoginEmail = await $A.IDBString("cacheLoginEmail"); + const cacheFileSort = await $A.IDBJson("cacheFileSort"); + const languageType = window.localStorage.getItem("__language:type__"); + const keyboardData = window.localStorage.getItem("__keyboard:data__"); + const themeMode = window.localStorage.getItem("__theme:mode__"); + // + window.localStorage.clear(); + await $A.IDBClear(); + // + window.localStorage.setItem("__language:type__", languageType) + window.localStorage.setItem("__keyboard:data__", keyboardData) + window.localStorage.setItem("__theme:mode__", themeMode) + await $A.IDBSet("cacheServerUrl", state.cacheServerUrl); + await $A.IDBSet("cacheProjectParameter", state.cacheProjectParameter); + await $A.IDBSet("cacheLoginEmail", cacheLoginEmail); + await $A.IDBSet("cacheFileSort", cacheFileSort); + await $A.IDBSet("cacheTaskBrowse", state.cacheTaskBrowse); dispatch("saveUserInfo", $A.isJson(userInfo) ? userInfo : state.userInfo); // resolve() @@ -567,12 +621,13 @@ export default { }); } else if ($A.isJson(data)) { let base = {_load: false, _edit: false}; - const index = state.files.findIndex(({id}) => id == data.id); + const index = state.fileLists.findIndex(({id}) => id == data.id); if (index > -1) { - state.files.splice(index, 1, Object.assign(base, state.files[index], data)); + state.fileLists.splice(index, 1, Object.assign(base, state.fileLists[index], data)); } else { - state.files.push(Object.assign(base, data)) + state.fileLists.push(Object.assign(base, data)) } + $A.IDBSave("fileLists", state.fileLists, 600) } }, @@ -587,12 +642,13 @@ export default { // let ids = $A.isArray(file_id) ? file_id : [file_id]; ids.some(id => { - state.files = state.files.filter(file => file.id != id); - state.files.some(file => { + state.fileLists = state.fileLists.filter(file => file.id != id); + state.fileLists.some(file => { if (file.pid == id) { dispatch("forgetFile", file.id); } }); + $A.IDBSave("fileLists", state.fileLists, 600) }) }, @@ -612,7 +668,8 @@ export default { }, }).then((result) => { const ids = result.data.map(({id}) => id) - state.files = state.files.filter((item) => item.pid != pid || ids.includes(item.id)); + state.fileLists = state.fileLists.filter((item) => item.pid != pid || ids.includes(item.id)); + $A.IDBSave("fileLists", state.fileLists, 600) // dispatch("saveFile", result.data); resolve(result) @@ -692,9 +749,7 @@ export default { } }) // - setTimeout(() => { - $A.setStorage("cacheProjects", state.cacheProjects); - }) + $A.IDBSave("cacheProjects", state.cacheProjects); } }, @@ -727,9 +782,8 @@ export default { $A.goForward({name: 'manage-dashboard'}); } } - setTimeout(() => { - $A.setStorage("cacheProjects", state.cacheProjects); - }) + // + $A.IDBSave("cacheProjects", state.cacheProjects); }, /** @@ -910,9 +964,8 @@ export default { } else { state.cacheColumns.push(data); } - setTimeout(() => { - $A.setStorage("cacheColumns", state.cacheColumns); - }) + // + $A.IDBSave("cacheColumns", state.cacheColumns); } }, @@ -937,9 +990,7 @@ export default { }) Array.from(new Set(project_ids)).some(id => dispatch("getProjectOne", id).catch(() => {})) // - setTimeout(() => { - $A.setStorage("cacheColumns", state.cacheColumns); - }) + $A.IDBSave("cacheColumns", state.cacheColumns); }, /** @@ -1088,9 +1139,7 @@ export default { } }) // - setTimeout(() => { - $A.setStorage("cacheTasks", state.cacheTasks); - }) + $A.IDBSave("cacheTasks", state.cacheTasks); } }, @@ -1129,9 +1178,8 @@ export default { if (ids.includes(state.taskId)) { state.taskId = 0; } - setTimeout(() => { - $A.setStorage("cacheTasks", state.cacheTasks); - }) + // + $A.IDBSave("cacheTasks", state.cacheTasks); }, /** @@ -1926,9 +1974,8 @@ export default { if (state.cacheTaskBrowse.length > 200) { state.cacheTaskBrowse.splice(200); } - setTimeout(() => { - $A.setStorage("cacheTaskBrowse", state.cacheTaskBrowse); - }) + // + $A.IDBSave("cacheTaskBrowse", state.cacheTaskBrowse); }, /** *****************************************************************************************/ @@ -1961,9 +2008,8 @@ export default { } else { state.cacheDialogs.push(data); } - setTimeout(() => { - $A.setStorage("cacheDialogs", state.cacheDialogs); - }) + // + $A.IDBSave("cacheDialogs", state.cacheDialogs); } }, @@ -2167,9 +2213,7 @@ export default { state.dialogId = 0 } // - setTimeout(() => { - $A.setStorage("cacheDialogs", state.cacheDialogs); - }) + $A.IDBSave("cacheDialogs", state.cacheDialogs); }, /** @@ -2187,9 +2231,9 @@ export default { } else { state.dialogIns.push(data); } - // 会话消息总数量大于1000时只保留最近打开的20个会话 - const msg_max = 1000 - const retain_num = 20 + // 会话消息总数量大于1500时只保留最近打开的30个会话 + const msg_max = 1500 + const retain_num = 30 state.dialogHistory = state.dialogHistory.filter(id => id != data.dialog_id) state.dialogHistory.push(data.dialog_id) if (state.dialogMsgs.length > msg_max && state.dialogHistory.length > retain_num) { @@ -2205,6 +2249,7 @@ export default { }) if (delIds.length > 0) { state.dialogMsgs = state.dialogMsgs.filter(item => !delIds.includes(item.dialog_id)); + $A.IDBSave("dialogMsgs", state.dialogMsgs, 600) } state.dialogHistory = newIds } @@ -2245,6 +2290,7 @@ export default { return b.id - a.id }).splice(retain).map(item => item.id) state.dialogMsgs = state.dialogMsgs.filter(item => !delIds.includes(item.id)) + $A.IDBSave("dialogMsgs", state.dialogMsgs, 600) } }, @@ -2311,6 +2357,7 @@ export default { } else { state.dialogMsgs.push(data); } + $A.IDBSave("dialogMsgs", state.dialogMsgs, 600) // const dialog = state.cacheDialogs.find(({id, last_msg}) => id == data.dialog_id && last_msg && last_msg.id === data.id); if (dialog) { @@ -2338,6 +2385,7 @@ export default { dispatch("decrementMsgReplyNum", state.dialogMsgs[index]); Store.set('audioSubscribe', id); state.dialogMsgs.splice(index, 1); + $A.IDBSave("dialogMsgs", state.dialogMsgs, 600) } }) dispatch("forgetDialogTodoForMsgId", msg_id) @@ -2378,6 +2426,7 @@ export default { // if (clearBefore) { state.dialogMsgs = state.dialogMsgs.filter(({dialog_id}) => dialog_id !== data.dialog_id) + $A.IDBSave("dialogMsgs", state.dialogMsgs, 600) } // const callTime = $A.Time(); @@ -2394,6 +2443,7 @@ export default { // const ids = resData.list.map(({id}) => id) state.dialogMsgs = state.dialogMsgs.filter(item => item.dialog_id != data.dialog_id || ids.includes(item.id) || $A.Time(item.created_at) >= callTime); + $A.IDBSave("dialogMsgs", state.dialogMsgs, 600) } if ($A.isArray(resData.todo)) { state.dialogTodos = state.dialogTodos.filter(item => item.dialog_id != data.dialog_id) diff --git a/resources/assets/js/store/state.js b/resources/assets/js/store/state.js index de436aacb..61b800500 100644 --- a/resources/assets/js/store/state.js +++ b/resources/assets/js/store/state.js @@ -1,4 +1,4 @@ -const stateData = { +export default { // 浏览器尺寸信息 windowWidth: $A(window).width(), windowHeight: $A(window).height(), @@ -34,20 +34,20 @@ const stateData = { // User cacheUserActive: {}, cacheUserWait: [], - cacheUserBasic: $A.getStorageArray("cacheUserBasic"), + cacheUserBasic: [], // Dialog - cacheDialogs: $A.getStorageArray("cacheDialogs").map(item => Object.assign(item, {loading: false})), + cacheDialogs: [], // Project - cacheProjects: $A.getStorageArray("cacheProjects"), - cacheColumns: $A.getStorageArray("cacheColumns"), - cacheTasks: $A.getStorageArray("cacheTasks"), - cacheProjectParameter: $A.getStorageArray("cacheProjectParameter"), - cacheTaskBrowse: $A.getStorageArray("cacheTaskBrowse"), + cacheProjects: [], + cacheColumns: [], + cacheTasks: [], + cacheProjectParameter: [], + cacheTaskBrowse: [], // ServerUrl - cacheServerUrl: $A.getStorageString("cacheServerUrl"), + cacheServerUrl: "", // Ajax ajaxWsReady: false, @@ -66,7 +66,7 @@ const stateData = { wsReadWaitList: [], // 会员信息 - userInfo: $A.getStorageJson("userInfo"), + userInfo: {}, userId: 0, userToken: '', userIsAdmin: false, @@ -80,11 +80,11 @@ const stateData = { dialogMsgs: [], dialogTodos: [], dialogHistory: [], - dialogInputCache: $A.getStorageArray("cacheDialogInput"), + dialogInputCache: [], dialogMsgTransfer: {time: 0}, // 文件 - files: [], + fileLists: [], // 项目任务 projectId: 0, @@ -136,7 +136,7 @@ const stateData = { ], // 主题皮肤 - themeMode: window.localStorage['__theme:mode__'], + themeMode: window.localStorage.getItem("__theme:mode__"), themeList: [ {name: '跟随系统', value: 'auto'}, {name: '明亮', value: 'light'}, @@ -151,32 +151,3 @@ const stateData = { previewImageIndex: 0, previewImageList: [], }; - -// 会员信息 -if (stateData.userInfo.userid) { - stateData.userId = stateData.userInfo.userid = $A.runNum(stateData.userInfo.userid); - stateData.userToken = stateData.userInfo.token; - stateData.userIsAdmin = $A.inArray("admin", stateData.userInfo.identity); -} - -// ServerUrl -if (stateData.cacheServerUrl) { - window.systemInfo.apiUrl = stateData.cacheServerUrl; -} - -// 主题皮肤 -switch (stateData.themeMode) { - case 'dark': - $A.dark.enableDarkMode() - break; - case 'light': - $A.dark.disableDarkMode() - break; - default: - stateData.themeMode = "auto" - $A.dark.autoDarkMode() - break; -} -stateData.themeIsDark = $A.dark.isDarkEnabled(); - -export default stateData diff --git a/resources/views/setting.blade.php b/resources/views/setting.blade.php index 18533748e..bc61b3a2f 100755 --- a/resources/views/setting.blade.php +++ b/resources/views/setting.blade.php @@ -1,8 +1,8 @@