微信小程序中缓存数据全方位解惑
微信小程序中缓存数据全方位解惑
微信小程序中的数据缓存是提升用户体验和优化性能的重要手段,跟电脑浏览器中的Local Storage的性质一样。以下是关于微信小程序数据缓存的相关知识点和示例的详细介绍:
1. 数据缓存的类型
微信小程序提供了两种数据缓存方式:
- 本地存储(Local Storage):数据存储在本地,即使小程序关闭后数据依然保留,直到手动清除。
- 内存存储(Memory Storage):数据存储在小程序的运行内存中,小程序关闭后数据丢失。
2. 数据缓存的API
微信小程序提供了以下API用于数据缓存操作:
2.1 设置缓存
前情:缓存方法后面跟上Sync的就是同步方法,反之就是异步方法
-
异步设置缓存:
wx.setStorage
wx.setStorage({// 设置缓存的名字 key: 'userInfo',// 设置缓存的值 data: { name: '张三', age: 28 },// 设置缓存成功时候调用的方法success: function(res) {console.log('设置成功:', res);},// 设置缓存失败时候调用的方法fail: function(err) {console.error('设置失败:', err);} });
-
同步设置缓存:
wx.setStorageSync
// 由于是同步的方法,所以用try{}catch(){}格式 try {// 注意:同步设置缓存与上面的异步方法的参数有所不同// 参数1:存储数据的键名// 参数2:存储的数据wx.setStorageSync('userInfo', { name: '张三', age: 28 }); // 尝试同步设置本地缓存console.log('设置成功'); // 如果设置成功,打印“设置成功”到控制台 } catch (err) {console.error('设置失败:', err); // 如果设置失败,捕获错误并打印“设置失败:”以及错误信息 }
2.2 获取缓存
-
异步获取缓存:
wx.getStorage
wx.getStorage({key: 'userInfo', // 指定要获取的缓存键(key),这里是 'userInfo'success(res) { // 成功回调函数,当获取缓存成功时执行console.log('获取成功:', res.data); // 打印获取到的缓存数据,res.data 是缓存的值},fail(err) { // 失败回调函数,当获取缓存失败时执行console.error('获取失败:', err); // 打印错误信息,err 是错误对象} });
-
同步获取缓存:
wx.getStorageSync
try {const userInfo = wx.getStorageSync('userInfo'); // 同步获取本地缓存中键为 'userInfo' 的数据console.log('获取成功:', userInfo); // 如果获取成功,将获取到的数据打印到控制台 } catch (err) {console.error('获取失败:', err); // 如果获取失败,捕获错误并打印错误信息 }
2.3 清除缓存
-
清除单个缓存:
wx.removeStorage
wx.removeStorage({key: 'userInfo', // 指定要删除的缓存键(key),这里是 'userInfo'success(res) { // 成功回调函数,当删除操作成功时执行console.log('清除成功:', res); // 打印成功信息,res 是返回的结果对象},fail(err) { // 失败回调函数,当删除操作失败时执行console.error('清除失败:', err); // 打印错误信息,err 是错误对象} });
-
同步清除单个缓存:
wx.removeStorageSync
try {wx.removeStorageSync('userInfo'); // 同步删除本地缓存中键为 'userInfo' 的数据console.log('清除成功'); // 如果删除成功,打印成功信息 } catch (err) {console.error('清除失败:', err); // 如果删除失败,捕获错误并打印错误信息 }
-
清除所有缓存:
wx.clearStorage
wx.clearStorage({success(res) { // 成功回调函数,当所有缓存数据被成功清除时执行console.log('所有缓存清除成功:', res); // 打印成功信息,res 是返回的结果对象},fail(err) { // 失败回调函数,当清除操作失败时执行console.error('清除失败:', err); // 打印错误信息,err 是错误对象} });
3. 缓存策略
3.1 高频更新数据的缓存策略
对于高频更新的数据(如新闻列表),可以采用以下策略:
- 初始加载时从服务器获取最新数据并缓存到本地。
- 设置缓存过期时间(如1小时),在过期内直接从本地读取。
- 缓存过期后自动发起网络请求更新缓存。
示例代码:
// 缓存新闻列表并设置过期时间
wx.setStorageSync('news_list', newsList, 3600 * 1000); // 缓存1小时
3.2 大文件缓存策略
对于大文件(如图片或视频),可以缓存文件的URL而不是文件本身:
- 首次加载时,将文件URL保存到本地存储。
- 需要显示文件时,检查本地存储是否有URL,若有则直接加载,否则从服务器下载并保存URL。
示例代码:
// 缓存大文件URL
let fileUrl = 'http://example.com/largefile.jpg';
wx.setStorageSync('largefile_url', fileUrl);
4. 注意事项
- 存储空间限制:微信小程序的本地存储空间有限(单个key最大1MB),需合理规划。
- 数据安全性:敏感数据需加密存储。
- 缓存清理:定期清理无用缓存,避免占用过多存储空间。
5. 如何选择
在微信小程序开发中,选择使用同步缓存还是异步缓存取决于具体的应用场景和需求。同步方法(如 wx.setStorageSync
和 wx.getStorageSync
)和异步方法(如 wx.setStorage
和 wx.getStorage
)各有优缺点,适用于不同的场景。以下是详细的分析和建议:
5.1 同步缓存方法
特点:
- 阻塞当前线程:同步方法会阻塞当前线程,直到操作完成。
- 直接返回结果:操作完成后直接返回结果,不需要回调函数。
- 代码简洁:适合简单的操作,代码更直观。
适用场景:
- 数据量小且操作简单:
- 如果需要存储或读取的数据量较小(例如单个对象或字符串),同步方法可以快速完成操作,不会对用户体验产生明显影响。
- 示例:存储用户的基本信息(如用户名、头像URL)。
- 初始化操作:
- 在页面加载时(如
onLoad
或onShow
生命周期方法中)加载或设置必要的数据。 - 示例:加载用户配置或初始化任务列表。
- 在页面加载时(如
- 对性能要求不高:
- 如果操作不会频繁触发,且对性能要求不高,同步方法可以简化代码逻辑。
- 示例:保存用户设置(如主题颜色、字体大小)。
示例代码:
// 同步保存数据
try {wx.setStorageSync('userInfo', { name: '张三', age: 28 });
} catch (err) {console.error('保存失败:', err);
}// 同步读取数据
try {const userInfo = wx.getStorageSync('userInfo');console.log('读取成功:', userInfo);
} catch (err) {console.error('读取失败:', err);
}
5.2 异步缓存方法
特点:
- 非阻塞:异步方法不会阻塞当前线程,操作完成后通过回调函数返回结果。
- 适合复杂操作:适合数据量较大或操作频繁的场景。
- 用户体验更好:避免因同步操作导致的页面卡顿或白屏。
适用场景:
- 数据量大:
- 如果需要存储或读取的数据量较大(例如长列表、大文件路径等),异步方法可以避免阻塞主线程。
- 示例:保存或加载任务列表、文章内容等。
- 操作频繁:
- 如果数据存储或读取操作频繁(例如实时更新数据、频繁读取配置),异步方法可以避免主线程卡顿。
- 示例:实时更新用户消息列表、频繁读取用户偏好设置。
- 需要反馈用户操作:
- 如果需要在操作完成后给用户明确的反馈(如提示框、加载动画),异步方法可以通过回调函数实现。
- 示例:保存任务后提示用户“保存成功”或“保存失败”。
- 与其他异步操作结合:
- 如果需要与其他异步操作(如网络请求、文件操作)结合,异步方法可以更好地管理操作流程。
- 示例:从服务器获取数据后保存到本地缓存。
示例代码:
// 异步保存数据
wx.setStorage({key: 'userInfo',data: { name: '张三', age: 28 },success() {console.log('保存成功');},fail(err) {console.error('保存失败:', err);}
});// 异步读取数据
wx.getStorage({key: 'userInfo',success(res) {console.log('读取成功:', res.data);},fail(err) {console.error('读取失败:', err);}
});
5.3 总结
使用同步缓存的场景:
- 数据量小且操作简单。
- 初始化操作(如页面加载时加载数据)。
- 对性能要求不高,且代码逻辑需要简洁。
使用异步缓存的场景:
- 数据量大或操作复杂。
- 操作频繁,需要避免主线程卡顿。
- 需要在操作完成后给用户反馈。
- 需要与其他异步操作结合。
5.4 最佳实践
- 小数据量优先使用同步方法:如果数据量小且操作简单,同步方法可以简化代码逻辑。
- 大数据量或频繁操作使用异步方法:如果数据量大或操作频繁,异步方法可以提升用户体验。
- 结合实际需求:根据具体需求选择合适的方法,必要时可以混合使用同步和异步方法。
希望这些分析和建议能帮助你更好地选择合适的缓存方法!
6. 实战示例
以下是一个完整的示例,展示如何在两个页面之间通过缓存传递数据:
完整示例1(存入数据)
<view><!-- 每当用户输入内容时,getInput 方法会被触发。 --><input placeholder="输入信息" bind:input="getInput" /><button bind:tap="saveInput">存入</button>
</view>
Page({data: {storage: '' // 定义页面数据,初始值为空字符串,用于存储用户输入的内容},getInput(e) { // 获取输入框的值,e就是表单中输入的值this.setData({ storage: e.detail.value }); // 使用 setData 更新页面数据,将输入框的值赋给 storage},saveInput() { // 保存输入的内容到本地缓存wx.setStorageSync('storage', this.data.storage); // 同步将页面数据 storage 保存到本地缓存,键为 'storage'}
});
完整示例2(读取数据)
<view>从存储中得到的数据:{{storage}}</view>
Page({data: {storage: '' // 定义页面数据,初始值为空字符串,用于存储从本地缓存获取的内容},onLoad() { // 页面加载时触发的生命周期方法wx.getStorage({ // 调用异步方法获取本地缓存中的数据key: 'storage', // 指定要获取的缓存键success: (res) => { // 成功回调函数this.setData({ storage: res.data }); // 使用 setData 更新页面数据,将获取到的缓存数据赋值给 storage}});}
});
通过以上内容,您可以更好地理解和应用微信小程序中的数据缓存功能,从而提升小程序的性能和用户体验。
7. 实战案例-任务列表
7.1 功能需求
- 添加任务:用户可以输入任务内容并添加到任务列表。
- 查看任务列表:用户可以查看所有未完成的任务。
- 完成任务:用户可以标记任务为已完成。
- 删除任务:用户可以删除不再需要的任务。
7.2 页面结构和逻辑
我们将使用两个文件:
index.wxml
:页面的结构文件。index.js
:页面的逻辑文件。
1. 页面结构文件(index.wxml
)
<view class="container"><!-- 页面的最外层容器 --><view class="header"><!-- 页面头部,包含输入框和添加按钮 --><input type="text" placeholder="请输入任务" bind:input="getInput" /><!-- 输入框,用户可以在这里输入任务内容 --><!-- bind:input="getInput":绑定输入事件,当用户输入时触发页面的 getInput 方法 --><button bind:tap="addTask">添加任务</button><!-- 添加按钮,用户点击后触发页面的 addTask 方法,将输入的任务添加到任务列表 --></view><view class="task-list"><!-- 任务列表的容器 --><block wx:for="{{tasks}}" wx:key="id"><!-- 使用 wx:for 循环渲染任务列表 --><!-- tasks:页面数据中的任务数组 --><!-- wx:key="id":指定循环的唯一键值,提升渲染性能 --><view class="task-item" bind:tap="toggleTask" data-id="{{item.id}}"><!-- 每个任务项 --><!-- bind:tap="toggleTask":点击任务项时触发页面的 toggleTask 方法 --><!-- data-id="{{item.id}}":为任务项绑定一个自定义属性,存储任务的唯一 ID --><text class="{{item.completed ? 'completed' : ''}}">{{item.content}}</text><!-- 显示任务内容 --><!-- class="{{item.completed ? 'completed' : ''}}":根据任务的完成状态动态添加样式 --><!-- 如果任务已完成(item.completed 为 true),添加 'completed' 样式 --><button bind:tap="deleteTask" data-id="{{item.id}}">删除</button><!-- 删除按钮,点击后触发页面的 deleteTask 方法 --><!-- data-id="{{item.id}}":为删除按钮绑定任务的唯一 ID --></view></block></view>
</view>
2. 页面逻辑文件(index.js
)
Page({data: {tasks: [], // 任务列表newTask: '' // 当前输入的任务内容},// 在页面加载时调用 loadTasks 方法,从本地缓存加载任务列表onLoad() {this.loadTasks(); // 页面加载时加载任务},// 当用户输入时触发的方法,再用this.setData把输入框中的值,赋值到data区中的newTaskgetInput(e) {this.setData({ newTask: e.detail.value }); // 获取输入框的内容},// 添加任务的方法addTask() {// 解构赋值,等同于 const newTask = this.data.newTaskconst { newTask } = this.data;// trim() 方法会移除字符串两端的空格(包括空格、制表符、换行符等)if (newTask.trim() === '') {// 调用微信小程序的 wx.showToast 方法,显示一个提示框。// icon: 'none':指定提示框的图标类型为无图标(none)wx.showToast({ title: '任务不能为空', icon: 'none' });// return终止当前函数的执行return;}// 将一个新的任务对象添加到任务列表中// Array.prototype.concat() 方法是用来合并数组的,它会返回一个新的数组,而不会修改原始数组const newTasks = this.data.tasks.concat({id: Date.now(), // 使用时间戳生成唯一 IDcontent: newTask,completed: false // 默认未完成});this.setData({ tasks: newTasks, newTask: '' }); // 更新任务列表并清空输入框// 下面定义的方法,用于将任务列表保存到本地缓存,参数为更新(添加过的)过的任务数组this.saveTasks(newTasks); // 保存任务到本地缓存},// 当用户点击任务项时,会触发 toggleTask 方法// 该方法会找到对应的任务并切换其完成状态,然后更新页面数据并保存到本地缓存toggleTask(e) {// 参数e为设置的自定义属性 data-id="{{item.id}}"const taskId = e.currentTarget.dataset.id; // a.获取任务的唯一 ID// b.map方法遍历任务列表const tasks = this.data.tasks.map(task => {// c.通过id找到被点击的任务if (task.id === taskId) { task.completed = !task.completed; // d.切换任务的完成状态}return task; // 返回任务对象});this.setData({ tasks }); // e.更新页面数据// 下面定义的方法,用于将任务列表保存到本地缓存,参数为更新过(切换状态)的任务数组this.saveTasks(tasks); // f.保存任务到本地缓存},// 删除任务的方法deleteTask(e) {// 参数e为设置的自定义属性 data-id="{{item.id}}"const taskId = e.currentTarget.dataset.id; // a.获取任务的唯一 ID// 用filter方法,通过传过来的id将点击删除的任务项过滤掉,生成一个新的数组tasksconst tasks = this.data.tasks.filter(task => task.id !== taskId); // b.过滤掉被删除的任务this.setData({ tasks }); // c.更新页面数据// 下面定义的方法,用于将任务列表保存到本地缓存,参数为更新过(删除过的)的任务数组this.saveTasks(tasks); // d.保存任务到本地缓存},// 方法 saveTasks,用于将任务列表保存到本地缓存// 在上面的几个更改任务列表(tasks)的几个方法中调用saveTasks(tasks) {try {wx.setStorageSync('tasks', tasks); // 将任务保存到本地缓存} catch (err) {console.error('保存任务失败:', err);}},// loadTasks作用:从微信小程序的本地缓存中加载任务列表,并将其设置为页面数据loadTasks() {try {const tasks = wx.getStorageSync('tasks') || []; // 从本地缓存加载任务列表this.setData({ tasks }); // 更新页面数据} catch (err) {console.error('加载任务失败:', err); // 捕获并打印错误信息}}
});
7.3 功能说明
- 添加任务:
- 用户在输入框中输入任务内容,点击“添加任务”按钮。
- 新任务会被添加到任务列表中,并保存到本地缓存。
- 查看任务列表:
- 任务列表通过
wx:for
循环渲染,显示所有未完成的任务。 - 如果任务已完成,任务内容会显示为划线样式(通过
class="completed"
实现)。
- 任务列表通过
- 完成任务:
- 点击任务项时,任务的完成状态会切换(未完成变为已完成,已完成变为未完成)。
- 更新后的任务列表会保存到本地缓存。
- 删除任务:
- 点击任务项中的“删除”按钮,任务会被从列表中移除。
- 更新后的任务列表会保存到本地缓存。
7.4 本地缓存的使用
- 保存任务:使用
wx.setStorageSync
将任务列表保存到本地缓存。 - 加载任务:页面加载时,通过
wx.getStorageSync
从本地缓存中加载任务列表。
7.5 样式文件(可选)
你可以在 index.wxss
文件中添加样式,使页面更美观:
.container {padding: 20px;
}
.header {display: flex;margin-bottom: 20px;
}
.header input {flex: 1;margin-right: 10px;
}
.task-item {display: flex;justify-content: space-between;padding: 10px 0;border-bottom: 1px solid #ccc;
}
.task-item text {flex: 1;
}
.completed {text-decoration: line-through;color: #ccc;
}
7.6 总结
这个案例展示了如何使用微信小程序的本地缓存功能来实现一个简单的代办任务应用。通过 wx.setStorageSync
和 wx.getStorageSync
方法,任务数据可以持久化存储,并在页面加载时恢复。
相关文章:
微信小程序中缓存数据全方位解惑
微信小程序中缓存数据全方位解惑 微信小程序中的数据缓存是提升用户体验和优化性能的重要手段,跟电脑浏览器中的Local Storage的性质一样。以下是关于微信小程序数据缓存的相关知识点和示例的详细介绍: 1. 数据缓存的类型 微信小程序提供了两种数据缓…...
LeetCode 每日一题 2025/2/10-2025/2/16
记录了初步解题思路 以及本地实现代码;并不一定为最优 也希望大家能一起探讨 一起进步 目录 2/10 913. 猫和老鼠2/11 1728. 猫和老鼠 II2/12 1760. 袋子里最少数目的球2/13 1742. 盒子中小球的最大数量2/14 1552. 两球之间的磁力2/15 1706. 球会落何处2/16 1299. 将…...
使用 Shiro 和 JPA 结合 MySQL 实现一个简易权限管理系统
1. 项目设置 首先,确保你的项目已经配置好 Maven 或 Gradle 依赖管理工具,并添加以下依赖: Maven 依赖 <dependencies><!-- Shiro 核心库 --><dependency><groupId>org.apache.shiro</groupId><artifactI…...

DeepSeek与医院电子病历的深度融合路径:本地化和上云差异化分析
一、引言 1.1 研究背景与意义 在医疗信息化快速发展的当下,电子病历系统已成为医院信息管理的核心构成。电子病历(EMR)系统,是指医务人员在医疗活动过程中,使用医疗机构信息系统生成的文字、符号、图标、图形、数据、影像等数字化信息,并能实现存储、管理、传输和重现的…...
设计模式:代理模式
代理模式是很常见的设计模式,即使没有专门学习过这种设计模式,在工作中也一定用过这种设计模式。在实际生活中,代理模式也是常见的,比如内阁首辅相对于皇帝,前者是后者的代理,内阁首辅收到奏折时࿰…...

141,【1】buuctf web [SUCTF 2019]EasyWeb
进入靶场 代码审计 <?php // 定义函数get_the_flag,功能是处理文件上传相关操作 function get_the_flag() {// 注释说明:webadmin会每隔20分钟删除用户上传的文件$userdir "upload/tmp_" . md5($_SERVER[REMOTE_ADDR]);// 检查用户目录…...
破解微服务疑难杂症:2025年全解决方案
微服务架构已经成为现代软件开发的主流选择,其优势在于能够将复杂的系统拆分为独立的服务模块,方便开发和维护。然而,在微服务的实施过程中,开发者往往会面临许多挑战,如服务间通信、数据一致性、性能优化和故障处理等…...
Node.js 中的 Event 模块详解
Node.js 中的 Event 模块是实现事件驱动编程的核心模块。它基于观察者模式,允许对象(称为“事件发射器”)发布事件,而其他对象(称为“事件监听器”)可以订阅并响应这些事件。这种模式非常适合处理异步操作和…...

EasyRTC嵌入式WebRTC视频通话SDK支持Web浏览器、Linux、ARM、Android、iOS
随着互联网技术的飞速发展,实时通信(RTC)已经成为现代应用中不可或缺的一部分。无论是视频会议、在线教育、远程医疗,还是社交娱乐,实时通信技术都在其中扮演着重要角色。 然而,WebRTC技术在PC和移动端的支…...

pycharm社区版有个window和arm64版本,到底下载哪一个?还有pycharm官网
首先pycharm官网是这一个。我是在2025年2月16日9:57进入的网站。如果网站还没有更新的话,那么就往下滑一下找到 community Edition,这个就是社区版了免费的。PyCharm:适用于数据科学和 Web 开发的 Python IDE 适用于数据科学和 Web 开发的 Python IDE&am…...

【玩转全栈】----Django模板语法、请求与响应
目录 一、引言 二、模板语法 三、传参 1、视图函数到模板文件 2、模板文件到视图函数 四、引入静态文件 五、请求与响应 ?1、请求 2、响应 六、综合小案例 1、源码展示 2、注意事项以及部分解释 3、展示 一、引言 像之前那个页面,太过简陋,而且一个完整…...

网络安全:挑战、技术与未来发展
📝个人主页🌹:一ge科研小菜鸡-CSDN博客 🌹🌹期待您的关注 🌹🌹 1. 引言 在数字化时代,网络安全(Cybersecurity)已成为全球关注的焦点。随着云计算、大数据、…...

DeepSeek 服务器繁忙的全面解决方案
目录 引文 正文 一、 服务器繁忙的原因分析 二、 解决方案 2.1切换网络 2.2使用网络加速工具 2.3错峰使用DeepSeek 2.4本地部署 2.5调用API 三、官方动态 一、技术研发与产品升级 二、市场合作与商业化进展 三、区域化布局与产业赋能 四、未来规划与社会责任 结语…...

将OpenWrt部署在x86服务器上
正文共:1234 字 40 图,预估阅读时间:2 分钟 如果你问ChatGPT有哪些开源的SD-WAN方案,他会这样答复你: 我们看到,OpenWrt也属于比较知名的开源SD-WAN解决方案。当然,在很久之前,我就发…...

计算机视觉:卷积神经网络(CNN)基本概念(一)
第一章:计算机视觉中图像的基础认知 第二章:计算机视觉:卷积神经网络(CNN)基本概念(一) 第三章:计算机视觉:卷积神经网络(CNN)基本概念(二) 第四章:搭建一个经典的LeNet5神经网络 一、引言 卷积神经网络&…...
企业文件共享中的权限管理与安全风险防范
在企业的日常运营中,文件共享是必不可少的一项工作。然而,文件共享过程中如果权限管理不当,极易引发安全风险,导致企业敏感信息泄露。因此,加强文件共享中的权限管理与安全风险防范,对于保障企业信息安全至…...
使用DeepSeek建立一个智能聊天机器人0.12
为了确保这段代码能够在Windows和Linux系统上都能正常运行,我考虑以下几个方面: 路径分隔符:在Windows和Linux中,文件路径的分隔符不同。Windows使用反斜杠(\),而Linux使用正斜杠(/)。我们可以使用 os.path.join 来处理路径,以确保跨平台兼容性。 消息框:tkinter.…...

国家队出手!DeepSeek上线国家超算互联网平台!
目前,国家超算互联网平台已推出 DeepSeek – R1 模型的 1.5B、7B、8B、14B 版本,后续还会在近期更新 32B、70B 等版本。 DeepSeek太火爆了!在这个春节档,直接成了全民热议的话题。 DeepSeek也毫无悬念地干到了全球增速最快的AI应用。这几天,国内的云计算厂家都在支持Dee…...

Deep seek学习日记1
Deepseek最强大的就是它的深度思考,并且展现了它的思考过程。 五种可使用Deep seek的方式(应该不限于这五种,后续嵌入deepseek的应该更多,多了解一点因为官网容易崩~~): 1.deep seek官网 2.硅基流动silicon…...
乐理笔记(持续更新)
单音与音程 单音:由一个音组成。 音程:由两个音组成,表示两个音之间的音高距离。 如何数音程: 单音程:9 - X,性质相反。例如,9度音程减去某个数,性质会相反。 复音程:…...

手游刚开服就被攻击怎么办?如何防御DDoS?
开服初期是手游最脆弱的阶段,极易成为DDoS攻击的目标。一旦遭遇攻击,可能导致服务器瘫痪、玩家流失,甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案,帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...
树莓派超全系列教程文档--(62)使用rpicam-app通过网络流式传输视频
使用rpicam-app通过网络流式传输视频 使用 rpicam-app 通过网络流式传输视频UDPTCPRTSPlibavGStreamerRTPlibcamerasrc GStreamer 元素 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 使用 rpicam-app 通过网络流式传输视频 本节介绍来自 rpica…...

黑马Mybatis
Mybatis 表现层:页面展示 业务层:逻辑处理 持久层:持久数据化保存 在这里插入图片描述 Mybatis快速入门 
MMaDA: Multimodal Large Diffusion Language Models
CODE : https://github.com/Gen-Verse/MMaDA Abstract 我们介绍了一种新型的多模态扩散基础模型MMaDA,它被设计用于在文本推理、多模态理解和文本到图像生成等不同领域实现卓越的性能。该方法的特点是三个关键创新:(i) MMaDA采用统一的扩散架构…...
Java 加密常用的各种算法及其选择
在数字化时代,数据安全至关重要,Java 作为广泛应用的编程语言,提供了丰富的加密算法来保障数据的保密性、完整性和真实性。了解这些常用加密算法及其适用场景,有助于开发者在不同的业务需求中做出正确的选择。 一、对称加密算法…...

如何在最短时间内提升打ctf(web)的水平?
刚刚刷完2遍 bugku 的 web 题,前来答题。 每个人对刷题理解是不同,有的人是看了writeup就等于刷了,有的人是收藏了writeup就等于刷了,有的人是跟着writeup做了一遍就等于刷了,还有的人是独立思考做了一遍就等于刷了。…...
.Net Framework 4/C# 关键字(非常用,持续更新...)
一、is 关键字 is 关键字用于检查对象是否于给定类型兼容,如果兼容将返回 true,如果不兼容则返回 false,在进行类型转换前,可以先使用 is 关键字判断对象是否与指定类型兼容,如果兼容才进行转换,这样的转换是安全的。 例如有:首先创建一个字符串对象,然后将字符串对象隐…...
Web 架构之 CDN 加速原理与落地实践
文章目录 一、思维导图二、正文内容(一)CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 …...
《C++ 模板》
目录 函数模板 类模板 非类型模板参数 模板特化 函数模板特化 类模板的特化 模板,就像一个模具,里面可以将不同类型的材料做成一个形状,其分为函数模板和类模板。 函数模板 函数模板可以简化函数重载的代码。格式:templa…...
CSS | transition 和 transform的用处和区别
省流总结: transform用于变换/变形,transition是动画控制器 transform 用来对元素进行变形,常见的操作如下,它是立即生效的样式变形属性。 旋转 rotate(角度deg)、平移 translateX(像素px)、缩放 scale(倍数)、倾斜 skewX(角度…...