From 6c7ab04f8249a9908919a0fe08c2a96c051b6f73 Mon Sep 17 00:00:00 2001 From: wangyaqi Date: Tue, 17 Mar 2020 20:02:31 +0800 Subject: [PATCH] =?UTF-8?q?update:=20=E4=BC=98=E5=8C=96storage=E5=BC=82?= =?UTF-8?q?=E6=AD=A5=E6=8E=A5=E5=8F=A3=E6=80=A7=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build/rollup.config.app.js | 1 - src/platforms/app-plus/service/api/index.js | 2 + .../app-plus/service/api/storage/storage.js | 195 +++++++++++ .../h5}/service/api/storage/storage.js | 304 +++++++++--------- 4 files changed, 349 insertions(+), 153 deletions(-) create mode 100644 src/platforms/app-plus/service/api/storage/storage.js rename src/{core => platforms/h5}/service/api/storage/storage.js (95%) diff --git a/build/rollup.config.app.js b/build/rollup.config.app.js index 92477c75b..9896a8f26 100644 --- a/build/rollup.config.app.js +++ b/build/rollup.config.app.js @@ -35,7 +35,6 @@ if (process.env.UNI_SERVICE === 'legacy') { output.name = 'serviceContext' output.banner = `export function createServiceContext(Vue, weex, plus, UniServiceJSBridge,instanceContext){ -var localStorage = plus.storage var setTimeout = instanceContext.setTimeout var clearTimeout = instanceContext.clearTimeout var setInterval = instanceContext.setInterval diff --git a/src/platforms/app-plus/service/api/index.js b/src/platforms/app-plus/service/api/index.js index ecf60cb59..dd8da0e3e 100644 --- a/src/platforms/app-plus/service/api/index.js +++ b/src/platforms/app-plus/service/api/index.js @@ -57,6 +57,8 @@ export * from './route/re-launch' export * from './route/redirect-to' export * from './route/switch-tab' +export * from './storage/storage' + export * from './ui/keyboard' export * from './ui/navigation-bar' export * from './ui/popup' diff --git a/src/platforms/app-plus/service/api/storage/storage.js b/src/platforms/app-plus/service/api/storage/storage.js new file mode 100644 index 000000000..5e1ec5910 --- /dev/null +++ b/src/platforms/app-plus/service/api/storage/storage.js @@ -0,0 +1,195 @@ +import { + invoke +} from '../../bridge' + +const STORAGE_DATA_TYPE = '__TYPE' +const STORAGE_KEYS = 'uni-storage-keys' + +function parseValue (value) { + const types = ['object', 'string', 'number', 'boolean', 'undefined'] + try { + const object = typeof value === 'string' ? JSON.parse(value) : value + const type = object.type + if (types.indexOf(type) >= 0) { + const keys = Object.keys(object) + // eslint-disable-next-line valid-typeof + if (keys.length === 2 && 'data' in object && typeof object.data === type) { + return object.data + } else if (keys.length === 1) { + return '' + } + } + } catch (error) {} +} + +export function setStorage ({ + key, + data, + isSync +} = {}, callbackId) { + const type = typeof data + const value = type === 'string' ? data : JSON.stringify({ + type, + data: data + }) + try { + if (type === 'string' && parseValue(value) !== undefined) { + plus.storage.setItemAsync(key + STORAGE_DATA_TYPE, type) + } else { + plus.storage.removeItemAsync(key + STORAGE_DATA_TYPE) + } + plus.storage.setItemAsync(key, value, function () { + invoke(callbackId, { + errMsg: 'setStorage:ok' + }) + }, function (err) { + invoke(callbackId, { + errMsg: `setStorage:fail ${err.message}` + }) + }) + } catch (error) { + invoke(callbackId, { + errMsg: `setStorage:fail ${error}` + }) + } +} + +export function setStorageSync (key, data) { + const type = typeof data + const value = type === 'string' ? data : JSON.stringify({ + type, + data: data + }) + try { + if (type === 'string' && parseValue(value) !== undefined) { + plus.storage.setItem(key + STORAGE_DATA_TYPE, type) + } else { + plus.storage.removeItem(key + STORAGE_DATA_TYPE) + } + plus.storage.setItem(key, value) + } catch (error) { + + } +} + +function parseGetStorage (type, value) { + let data = value + if (type !== 'string' || (type === 'string' && value === '{"type":"undefined"}')) { + try { + // 兼容H5和V3初期历史格式 + let object = JSON.parse(value) + const result = parseValue(object) + if (result !== undefined) { + data = result + } else if (type) { + // 兼容App端历史格式 + data = object + if (typeof object === 'string') { + object = JSON.parse(object) + // eslint-disable-next-line valid-typeof + data = typeof object === (type === 'null' ? 'object' : type) ? object : data + } + } + } catch (error) {} + } + return data +} + +export function getStorage ({ + key +} = {}, callbackId) { + plus.storage.getItemAsync(key, function (res) { + plus.storage.getItemAsync(key + STORAGE_DATA_TYPE, function (typeRes) { + const typeOrigin = typeRes.data || '' + const type = typeOrigin.toLowerCase() + invoke(callbackId, { + data: parseGetStorage(type, res.data), + errMsg: 'getStorage:ok' + }) + }, function () { + const type = '' + invoke(callbackId, { + data: parseGetStorage(type, res.data), + errMsg: 'getStorage:ok' + }) + }) + }, function (err) { + invoke(callbackId, { + data: '', + errMsg: `getStorage:fail ${err.message}` + }) + }) +} + +export function getStorageSync (key) { + const value = plus.storage.getItem(key) + const typeOrigin = plus.storage.getItem(key + STORAGE_DATA_TYPE) || '' + const type = typeOrigin.toLowerCase() + if (typeof value !== 'string') { + return '' + } + return parseGetStorage(type, value) +} + +export function removeStorage ({ + key +} = {}, callbackId) { + // 兼容App端历史格式 + plus.storage.removeItemAsync(key + STORAGE_DATA_TYPE) + plus.storage.removeItemAsync(key, function (res) { + invoke(callbackId, { + errMsg: 'removeStorage:ok' + }) + }, function (err) { + invoke(callbackId, { + errMsg: `removeStorage:fail ${err.message}` + }) + }) +} + +export function removeStorageSync (key) { + plus.storage.removeItem(key + STORAGE_DATA_TYPE) + plus.storage.removeItem(key) +} + +export function clearStorage (args, callbackId) { + plus.storage.clearAsync(function (res) { + invoke(callbackId, { + errMsg: 'clearStorage:ok' + }) + }, function (err) { + invoke(callbackId, { + errMsg: `clearStorage:fail ${err.message}` + }) + }) +} + +export function clearStorageSync () { + plus.storage.clear() +} + +export function getStorageInfo () { + const length = (plus.storage.length || plus.storage.getLength()) || 0 + const keys = [] + let currentSize = 0 + for (let index = 0; index < length; index++) { + const key = plus.storage.key(index) + if (key !== STORAGE_KEYS && key.indexOf(STORAGE_DATA_TYPE) + STORAGE_DATA_TYPE.length !== key.length) { + const value = plus.storage.getItem(key) + currentSize += key.length + value.length + keys.push(key) + } + } + return { + keys, + currentSize: Math.ceil(currentSize * 2 / 1024), + limitSize: Number.MAX_VALUE, + errMsg: 'getStorageInfo:ok' + } +} + +export function getStorageInfoSync () { + const res = getStorageInfo() + delete res.errMsg + return res +} diff --git a/src/core/service/api/storage/storage.js b/src/platforms/h5/service/api/storage/storage.js similarity index 95% rename from src/core/service/api/storage/storage.js rename to src/platforms/h5/service/api/storage/storage.js index dd92f954d..f2b066c9a 100644 --- a/src/core/service/api/storage/storage.js +++ b/src/platforms/h5/service/api/storage/storage.js @@ -1,152 +1,152 @@ -const STORAGE_DATA_TYPE = '__TYPE' -const STORAGE_KEYS = 'uni-storage-keys' - -function parseValue (value) { - const types = ['object', 'string', 'number', 'boolean', 'undefined'] - try { - const object = typeof value === 'string' ? JSON.parse(value) : value - const type = object.type - if (types.indexOf(type) >= 0) { - const keys = Object.keys(object) - // eslint-disable-next-line valid-typeof - if (keys.length === 2 && 'data' in object && typeof object.data === type) { - return object.data - } else if (keys.length === 1) { - return '' - } - } - } catch (error) { } -} - -export function setStorage ({ - key, - data -} = {}) { - const type = typeof data - const value = type === 'string' ? data : JSON.stringify({ - type, - data: data - }) - try { - if (type === 'string' && parseValue(value) !== undefined) { - localStorage.setItem(key + STORAGE_DATA_TYPE, type) - } else { - localStorage.removeItem(key + STORAGE_DATA_TYPE) - } - localStorage.setItem(key, value) - } catch (error) { - return { - errMsg: `setStorage:fail ${error}` - } - } - return { - errMsg: 'setStorage:ok' - } -} - -export function setStorageSync (key, data) { - setStorage({ - key, - data - }) -} - -export function getStorage ({ - key -} = {}) { - const value = localStorage && localStorage.getItem(key) - if (typeof value !== 'string') { - return { - data: '', - errMsg: 'getStorage:fail' - } - } - let data = value - const typeOrigin = localStorage.getItem(key + STORAGE_DATA_TYPE) || '' - const type = typeOrigin.toLowerCase() - if (type !== 'string' || (typeOrigin === 'String' && value === '{"type":"undefined"}')) { - try { - // 兼容H5和V3初期历史格式 - let object = JSON.parse(value) - const result = parseValue(object) - if (result !== undefined) { - data = result - } else if (type) { - // 兼容App端历史格式 - data = object - if (typeof object === 'string') { - object = JSON.parse(object) - // eslint-disable-next-line valid-typeof - data = typeof object === (type === 'null' ? 'object' : type) ? object : data - } - } - } catch (error) { } - } - return { - data, - errMsg: 'getStorage:ok' - } -} - -export function getStorageSync (key) { - const res = getStorage({ - key - }) - return res.data -} - -export function removeStorage ({ - key -} = {}) { - if (localStorage) { - // 兼容App端历史格式 - localStorage.removeItem(key + STORAGE_DATA_TYPE) - localStorage.removeItem(key) - } - return { - errMsg: 'removeStorage:ok' - } -} - -export function removeStorageSync (key) { - removeStorage({ - key - }) -} - -export function clearStorage () { - localStorage && localStorage.clear() - return { - errMsg: 'clearStorage:ok' - } -} - -export function clearStorageSync () { - clearStorage() -} - -export function getStorageInfo () { - const length = (localStorage && (localStorage.length || localStorage.getLength())) || 0 - const keys = [] - let currentSize = 0 - for (let index = 0; index < length; index++) { - const key = localStorage.key(index) - if (key !== STORAGE_KEYS && key.indexOf(STORAGE_DATA_TYPE) + STORAGE_DATA_TYPE.length !== key.length) { - const value = localStorage.getItem(key) - currentSize += key.length + value.length - keys.push(key) - } - } - return { - keys, - currentSize: Math.ceil(currentSize * 2 / 1024), - limitSize: Number.MAX_VALUE, - errMsg: 'getStorageInfo:ok' - } -} - -export function getStorageInfoSync () { - const res = getStorageInfo() - delete res.errMsg - return res -} +const STORAGE_DATA_TYPE = '__TYPE' +const STORAGE_KEYS = 'uni-storage-keys' + +function parseValue (value) { + const types = ['object', 'string', 'number', 'boolean', 'undefined'] + try { + const object = typeof value === 'string' ? JSON.parse(value) : value + const type = object.type + if (types.indexOf(type) >= 0) { + const keys = Object.keys(object) + // eslint-disable-next-line valid-typeof + if (keys.length === 2 && 'data' in object && typeof object.data === type) { + return object.data + } else if (keys.length === 1) { + return '' + } + } + } catch (error) { } +} + +export function setStorage ({ + key, + data +} = {}) { + const type = typeof data + const value = type === 'string' ? data : JSON.stringify({ + type, + data: data + }) + try { + if (type === 'string' && parseValue(value) !== undefined) { + localStorage.setItem(key + STORAGE_DATA_TYPE, type) + } else { + localStorage.removeItem(key + STORAGE_DATA_TYPE) + } + localStorage.setItem(key, value) + } catch (error) { + return { + errMsg: `setStorage:fail ${error}` + } + } + return { + errMsg: 'setStorage:ok' + } +} + +export function setStorageSync (key, data) { + setStorage({ + key, + data + }) +} + +export function getStorage ({ + key +} = {}) { + const value = localStorage && localStorage.getItem(key) + if (typeof value !== 'string') { + return { + data: '', + errMsg: 'getStorage:fail' + } + } + let data = value + const typeOrigin = localStorage.getItem(key + STORAGE_DATA_TYPE) || '' + const type = typeOrigin.toLowerCase() + if (type !== 'string' || (typeOrigin === 'String' && value === '{"type":"undefined"}')) { + try { + // 兼容H5和V3初期历史格式 + let object = JSON.parse(value) + const result = parseValue(object) + if (result !== undefined) { + data = result + } else if (type) { + // 兼容App端历史格式 + data = object + if (typeof object === 'string') { + object = JSON.parse(object) + // eslint-disable-next-line valid-typeof + data = typeof object === (type === 'null' ? 'object' : type) ? object : data + } + } + } catch (error) { } + } + return { + data, + errMsg: 'getStorage:ok' + } +} + +export function getStorageSync (key) { + const res = getStorage({ + key + }) + return res.data +} + +export function removeStorage ({ + key +} = {}) { + if (localStorage) { + // 兼容App端历史格式 + localStorage.removeItem(key + STORAGE_DATA_TYPE) + localStorage.removeItem(key) + } + return { + errMsg: 'removeStorage:ok' + } +} + +export function removeStorageSync (key) { + removeStorage({ + key + }) +} + +export function clearStorage () { + localStorage && localStorage.clear() + return { + errMsg: 'clearStorage:ok' + } +} + +export function clearStorageSync () { + clearStorage() +} + +export function getStorageInfo () { + const length = (localStorage && (localStorage.length || localStorage.getLength())) || 0 + const keys = [] + let currentSize = 0 + for (let index = 0; index < length; index++) { + const key = localStorage.key(index) + if (key !== STORAGE_KEYS && key.indexOf(STORAGE_DATA_TYPE) + STORAGE_DATA_TYPE.length !== key.length) { + const value = localStorage.getItem(key) + currentSize += key.length + value.length + keys.push(key) + } + } + return { + keys, + currentSize: Math.ceil(currentSize * 2 / 1024), + limitSize: Number.MAX_VALUE, + errMsg: 'getStorageInfo:ok' + } +} + +export function getStorageInfoSync () { + const res = getStorageInfo() + delete res.errMsg + return res +} -- GitLab