oops-framework框架 之 本地存储(五)
引擎: CocosCreator 3.8.0
环境: Mac
Gitee: oops-game-kit
注: 作者
dgflash
的oops-framework框架QQ群: 628575875
简介
在CocosCreator中,本地存储主要使用sys.localStorage
接口,通过 key-value的格式进行存储。
主要接口有:
接口 | 描述 |
---|---|
setItem(key, value) | 保存指定索引的数据 |
getItem(key) | 获取指定索引的数据 |
removeItem(key) | 移除指定索引的数据 |
clear() | 清空所有数据 |
存储的最后数据是以sqlite数据库格式存储的。
dgflash
作者分享的 oops-framework 框架是在此基础上进行的二次封装,有着如下的特点:
- 设置用户ID,将key和用户ID组合,避免存储数据被覆盖
- 增加了MD5、AES的第三方库加密,key使用MD5加密, value使用AES加密,增加的数据的安全性
- 在模拟器或浏览器的调试下,不会触发数据加密,方便明文调试
针对于本地存储的使用,主要有两个类:
- StorageManager 本地存储的管理类
- EncryptUtil NPM第三方加密库的封装类
针对于后者,需要NPM的支持安装第三方库crypto-es
,在opps-framework的框架中已经配置。
这里做下简单了解:
NPM crypto-es
终端安装命令:
npm install -g yarn
yarn add crypto-es
主要接口
作者使用dgflash
封装的StorageManager
主要接口如下:
接口 | 返回类型 | 说明 |
---|---|---|
init(key: string, iv: string) | void | 初始化密钥 |
setUser(id: string) | void | 初始化用户ID,默认为空 |
set(key: string, value: any) | void | 存储数据 |
get(key: string, defaultValue: any = “”) | string | 获取数据 |
getNumber(key: string, defaultValue: number = 0) | number | 获取number类型数据 |
getBoolean(key: string) | boolean | 获取boolean类型数据 |
getJson(key: string, defaultValue?: any) | any | 获取Json类型数据 |
remove(key: string) | void | 移除指定字段的数据 |
clear() | void | 清空所有数据 |
注: 密钥的初始化在resources/config.json下localDataKey 和 localDataIv 进行设置
我们看下关于set
方法的设定:
set(key: string, value: any) {var keywords = `${key}_${this._id}`;// 检测key字段的合法性if (null == key) {console.error("存储的key不能为空");return;}// 检测是否为非调试模式,及非浏览器或模拟器if (!PREVIEW) {keywords = EncryptUtil.md5(keywords);}// 检测value字段的合法性if (null == value) {console.warn("存储的值为空,则直接移除该存储");this.remove(key);return;}if (typeof value === 'function') {console.error("储存的值不能为方法");return;}// 对value字段数据进行转换if (typeof value === 'object') {try {value = JSON.stringify(value);}catch (e) {console.error(`解析失败,str = ${value}`);return;}}else if (typeof value === 'number') {value = value + "";}// 设置value字段加密if (!PREVIEW && null != this._key && null != this._iv) {value = EncryptUtil.aesEncrypt(`${value}`, this._key, this._iv);}// 存储数据sys.localStorage.setItem(keywords, value);
}
注意: CocosCreator引擎提供的接口:
setItem(key: string, value: string)
value一定要为string类型,否则会报错。
这里汇总下oops-framework提供的加密库封装主要接口:
接口 | 说明 |
---|---|
initCrypto(key, iv) | 初始化加密库的key和iv |
md5() | 获取md5加密字段 |
aesEncrypt() | AES加密 |
aesDecrypt() | 获取AES解密数据 |
注: AES加密和解密的key和iv 使用的是
initCrypto
初始化中的字段
示例
本地存储的使用,在Oops.ts
中提供的入口主要是:
// ../oops-plugin-framework/assets/core/Oop.ts
export class oops {/** 本地存储 */static storage: StorageManager = new StorageManager();
}
建议在项目启动后的某个关键点增加用户ID和加密字段的处理
// 设置用户ID
let userId = "10001";
oops.storage.setUser(uid);
// 设置加密key和vi
// 通过oops.config.game获取resources/config.json中的配置字段
let config = oops.config.game;
let key = config.localDataKey || "key";
let vi = config.localDataIv || "vi";
oops.storage.init("key", "vi");
代码中的使用示例就相对简单了, 以音效为例:
const LOCAL_STORE_KEY = "game_audio";// 保存字段
save() {// 声音音量this.local_data.volume_music = this._volume_music;// 音效音量this.local_data.volume_effect = this._volume_effect;// 声音开关this.local_data.switch_music = this._switch_music;// 音效开关this.local_data.switch_effect = this._switch_effect;let data = JSON.stringify(this.local_data);oops.storage.set(LOCAL_STORE_KEY, data);
}// 获取字段
load() {let data = oops.storage.get(LOCAL_STORE_KEY);if (data) {try {this.local_data = JSON.parse(data);this._volume_music = this.local_data.volume_music;this._volume_effect = this.local_data.volume_effect;this._switch_music = this.local_data.switch_music;this._switch_effect = this.local_data.switch_effect;}catch (e) {this.local_data = {};this._volume_music = 1;this._volume_effect = 1;this._switch_music = true;this._switch_effect = true;}}
}
感谢作者dgflash
的分享,作者CSDN博客: dgflash CSDN
最后,祝大家学习和生活愉快!
相关文章:
oops-framework框架 之 本地存储(五)
引擎: CocosCreator 3.8.0 环境: Mac Gitee: oops-game-kit 注: 作者dgflash的oops-framework框架QQ群: 628575875 简介 在CocosCreator中,本地存储主要使用sys.localStorage 接口,通过 key-value的格式进…...
编程常见的问题
在现代社会中,编程已经成为一项非常重要的技能。随着科技的不断发展和普及,计算机已经渗透到我们生活的方方面面,从个人电脑、手机到智能家居、自动驾驶等。编程作为计算机科学的基础,为我们提供了解决问题和创造新事物的工具和方…...
针对Arrays.asList的坑,可以有哪些处理措施
上文讲述:Error querying database. Cause: java.lang.reflect.InaccessibleObjectException: 那么如果真的只习惯用Arrays.asList,那也是有对应的解决办法的。 一、解决办法大方向 不管做什么事情,都是先判定一个大方向,不管是…...

SE考研真题总结(一)
本帖开始分享考研真题中设计【软件工程】的部分,预计会出5期左右,敬请期待~ 一.单选题 1.程序编写不是软件质量保障过程~ 静态代码扫描是今年来多数被人提及的软件应用安全解决方案之一,指程序员在编写好代码后无需进行编译,直接…...
Xshell远程登录AWS EC2 Linux实例
文章目录 小结问题解决参考 小结 Xshell远程登录AWS EC2 Linux实例碰到些问题,进行解决并记录。 问题 在AWS中创建 EC2 Linux实例,生成的非对称密钥对,使用Xshell远程登录碰到一些问题。 解决 首先在Putty中可以使用的ppk密钥文件在Xshe…...

Elasticsearch:对时间序列数据流进行降采样(downsampling)
降采样提供了一种通过以降低的粒度存储时间序列数据来减少时间序列数据占用的方法。 指标(metrics)解决方案收集大量随时间增长的时间序列数据。 随着数据老化,它与系统当前状态的相关性越来越小。 降采样过程将固定时间间隔内的文档汇总为单…...

python自动化测试框架:unittest测试用例编写及执行
本文将介绍 unittest 自动化测试用例编写及执行的相关内容,包括测试用例编写、测试用例执行、测试报告等内容。 官方文档: https://docs.python.org/zh-cn/3/library/unittest.mock.html 1. 测试用例编写 在 unittest 中,一个测试用例通常…...

ctfhub技能树_web_web前置技能_HTTP
目录 一、HTTP协议 1.1、请求方式 1.2、302跳转 1.3、Cookie 1.4、基础认证 1.5、响应包源代码 一、HTTP协议 1.1、请求方式 注:HTTP协议中定义了八种请求方法。这八种都有:1、OPTIONS :返回服务器针对特定资源所支持的HTTP请求方法…...

mysql8报sql_mode=only_full_group_by(存储过程一直报)
1:修改数据库配置(重启失效) select global.sql_mode;会打印如下信息 ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION里面包含 ONLY_FULL_GROUP_BY,那么就重新设置,在数据库中输入以下代码,去掉ONLY_FULL_GROU…...

Vue2中v-html引发的安全问题
前言:v-html指令 1.作用:向指定节点中渲染包含html结构的内容。 2.与插值语法的区别: (1).v-html会替换掉节点中所有的内容,{{xx}}则不会。 (2).v-html可以识别html结构。 3.严重注意:v-html有安全性问题࿰…...
java内部类详解
文章目录 一、介绍二、为什么要使用内部类三、非静态内部类四、静态内部类五、局部内部类六、匿名内部类七、lambda表达式内部类八、成员重名九、序列化十、如何选择内部类 一、介绍 在java中,我们被允许在编写一个类(外部类OuterClass)时,在其内部再嵌…...

Python 潮流周刊#29:Rust 会比 Python 慢?!
△请给“Python猫”加星标 ,以免错过文章推送 你好,我是猫哥。这里每周分享优质的 Python、AI 及通用技术内容,大部分为英文。本周刊开源,欢迎投稿[1]。另有电报频道[2]作为副刊,补充发布更加丰富的资讯。 ὃ…...

吴恩达《机器学习》11-1-11-2:首先要做什么、误差分析
一、首先要做什么 选择特征向量的关键决策 以垃圾邮件分类器算法为例,首先需要决定如何选择和表达特征向量 𝑥。视频提到的一个示例是构建一个由 100 个最常出现在垃圾邮件中的词构成的列表,根据这些词是否在邮件中出现来创建特征向量&…...
Pandas在Excel同一个sheet里插入多个Dataframe和行
Pandas默认的to_excel是直接把完成的Datafrme写入一个sheet里,这并不能满足我们在一个sheet里插入多个Dataframe或多行的需求。为了实现插入多行或多Dataframe的目的,我们需要新建一个ExcelWriter对象,然后依次插入数据。 这里我们以插入2个Dataframe和三行单元格为例。 新…...

查看mysql 或SQL server 的连接数,mysql超时、最大连接数配置
1、mysql 的连接数 1.1、最大可连接数 show variables like max_connections; 1.2、运行中连接数 show status like Threads_connected; 1.3、配置最大连接数, mysql版本不同可配置的最大连接数不同,mysql8.0的版本默认151个连接数,…...

C++学习之路(七)C++ 实现简单的Qt界面(消息弹框、按钮点击事件监听)- 示例代码拆分讲解
这个示例创建了一个主窗口,其中包含两个按钮。第一个按钮点击时会显示一个简单的消息框,第二个按钮点击时会执行一个特定的操作(在这个例子中,仅打印一条调试信息)。 功能描述: 创建窗口和布局:…...
python实现一个计算器
实现一个计算器首先熟悉一下这个阅读器的属性import subprocess subprocess.run(["espeak", "-v", "enf3", "This is a Calculator"])class Calculator:def speaker(self,word):subprocess.run(["espeak", "-v", …...
C++ 共享内存ShellCode跨进程传输
在计算机安全领域,ShellCode是一段用于利用系统漏洞或执行特定任务的机器码。为了增加攻击的难度,研究人员经常探索新的传递ShellCode的方式。本文介绍了一种使用共享内存的方法,通过该方法,两个本地进程可以相互传递ShellCode&am…...
如何快速移植(从STM32F103到STM32F407)
最近用到F4的地方比较多,网上代码还是F1多一些,便需要移植代码,如何快速移植代码呢? 看下面这篇文章 外设 首先就是STM32的外设了。 STM32F407ZGT6的基本外设 STM32F407ZGT6 作为 MCU,该芯片是 STM32F407 里面配置…...

python高级练习题库实验1(B)部分
文章目录 题目1代码实验结果题目2代码实验结果题目3代码实验结果题目4代码实验结果题目5代码实验结果题目总结题目1 打包糖果小游戏,用户输入糖果品牌与个数,还有一个盒子里面可以装多少个糖果,输出一些打印信息,如下图所示: 代码 print("Packaging lollies into…...
k8s从入门到放弃之Ingress七层负载
k8s从入门到放弃之Ingress七层负载 在Kubernetes(简称K8s)中,Ingress是一个API对象,它允许你定义如何从集群外部访问集群内部的服务。Ingress可以提供负载均衡、SSL终结和基于名称的虚拟主机等功能。通过Ingress,你可…...

Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例
使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件,常用于在两个集合之间进行数据转移,如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model:绑定右侧列表的值&…...

如何在看板中体现优先级变化
在看板中有效体现优先级变化的关键措施包括:采用颜色或标签标识优先级、设置任务排序规则、使用独立的优先级列或泳道、结合自动化规则同步优先级变化、建立定期的优先级审查流程。其中,设置任务排序规则尤其重要,因为它让看板视觉上直观地体…...

【快手拥抱开源】通过快手团队开源的 KwaiCoder-AutoThink-preview 解锁大语言模型的潜力
引言: 在人工智能快速发展的浪潮中,快手Kwaipilot团队推出的 KwaiCoder-AutoThink-preview 具有里程碑意义——这是首个公开的AutoThink大语言模型(LLM)。该模型代表着该领域的重大突破,通过独特方式融合思考与非思考…...
OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别
OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别 直接训练提示词嵌入向量的核心区别 您提到的代码: prompt_embedding = initial_embedding.clone().requires_grad_(True) optimizer = torch.optim.Adam([prompt_embedding...

听写流程自动化实践,轻量级教育辅助
随着智能教育工具的发展,越来越多的传统学习方式正在被数字化、自动化所优化。听写作为语文、英语等学科中重要的基础训练形式,也迎来了更高效的解决方案。 这是一款轻量但功能强大的听写辅助工具。它是基于本地词库与可选在线语音引擎构建,…...
Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析
Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析 一、第一轮提问(基础概念问题) 1. 请解释Spring框架的核心容器是什么?它在Spring中起到什么作用? Spring框架的核心容器是IoC容器&#…...
C++.OpenGL (14/64)多光源(Multiple Lights)
多光源(Multiple Lights) 多光源渲染技术概览 #mermaid-svg-3L5e5gGn76TNh7Lq {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-3L5e5gGn76TNh7Lq .error-icon{fill:#552222;}#mermaid-svg-3L5e5gGn76TNh7Lq .erro…...
掌握 HTTP 请求:理解 cURL GET 语法
cURL 是一个强大的命令行工具,用于发送 HTTP 请求和与 Web 服务器交互。在 Web 开发和测试中,cURL 经常用于发送 GET 请求来获取服务器资源。本文将详细介绍 cURL GET 请求的语法和使用方法。 一、cURL 基本概念 cURL 是 "Client URL" 的缩写…...

认识CMake并使用CMake构建自己的第一个项目
1.CMake的作用和优势 跨平台支持:CMake支持多种操作系统和编译器,使用同一份构建配置可以在不同的环境中使用 简化配置:通过CMakeLists.txt文件,用户可以定义项目结构、依赖项、编译选项等,无需手动编写复杂的构建脚本…...