当前位置: 首页 > news >正文

arkTS:使用ArkUI实现用户信息的持久化管理与自动填充(PersistentStorage)

arkUI:使用ArkUI实现用户信息的持久化管理与自动填充(PersistentStorage)

  • 1 主要内容说明
  • 2 例子
    • 2.1 登录页
      • 2.1.1登陆页的相关说明
        • 2.1.1.1 持久化存储的初始化
        • 2.1.1.2 输入框
        • 2.1.1.3 记住密码选项
        • 2.1.1.4 登录按钮的逻辑
        • 2.1.1.5 注册跳转
      • 2.1.2 源码1 (登录页--文件:`Page_PersistentStorage_Case_Login.etsf`)
    • 2.2 注册页
      • 2.2.1 注册页的相关说明
        • 2.2.1.1 功能
        • 2.2.1.2 持久化存储
        • 2.2.1.3 关键交互
      • 2.2.2 源码2(注册页--文件:`Page_PersistentStorage_Case_Register`)
    • 2.3 登陆成功的页面
      • 2.3.1 登陆成功页面的相关说明
        • 2.3.1.1 功能
        • 2.3.1.2 持久化存储
        • 2.3.1.3 关键交互
      • 2.3.2 源码3(登陆成功的页面--文件:`Page_PersistentStorage_Case_Main`)
    • 2.4 源码1,2,3组成的项目的运行效果
      • 2.4.1 效果视频
      • 2.4.2 效果截图
        • 2.4.2.1 使用模拟器打开 登陆页,默认情况
        • 2.4.2.2 点击 注册账号
        • 2.4.2.3 进入账号注册页
        • 2.4.2.4 注册内容
        • 2.4.2.5 点击 返回 回到 登陆页
        • 2.4.2.6 账号和密码无误后登陆成功
        • 2.4.2.7 文件路径关系截图
  • 3.结语
  • 4.定位日期

1 主要内容说明

PersistentStorage 是 ArkUI 提供的一种持久化存储解决方案,用于在应用程序中保存数据,并支持跨会话的数据管理和状态保持。通过 PersistentStorage,开发者可以轻松实现数据的本地存储,以满足诸如用户设置、登录信息、会话状态等需要长期保存数据的场景。

持久化存储 通过 PersistentStorage API 实现,将用户的账号、密码以及其他设置数据(如是否记住密码)保存到本地存储中,以便在应用重新启动或用户退出后,能够自动加载和恢复之前的状态。这样,用户无需每次登录时重新输入账号密码,特别是在“记住密码”功能启用时,系统会自动填充账号和密码,提供更流畅的用户体验。

在注册页面中,持久化存储用于保存用户输入的账号和密码信息,将它们存储在一个数组中。登录页面则通过从持久化存储读取这些信息,验证用户输入的账号密码是否匹配,并根据验证结果进行相应的操作。当用户勾选了“记住密码”选项时,账号和密码会被持续保存,以便下次直接登录。此外,登录页面还会根据用户的选择决定是否修改已存储的密码信息。

2 例子

这个项目通过三部分代码展示了一个简单的用户管理流程:注册、登录以及登录成功后的展示。核心技术围绕 ArkUI 和 持久化存储(PersistentStorage)展开,实现了用户信息的持久化保存与加载。

  • 注册页面 --------- 实现了用户信息的输入、存储与显示,并将用户的账号和密码保存到本地持久化存储中,保证用户数据的长期保存。

  • 登录页面 --------- 则提供了账号密码输入和验证功能,并支持“记住密码”功能,通过持久化存储保存用户的登录状态。

  • 登录成功页面 --------- 通过展示简单的欢迎信息,确认用户的登录成功,体现了项目的流畅用户体验。

这个项目是一个基础的示例,适合用于学习 ArkUI 的持久化存储操作、组件化开发以及用户交互设计的基础应用。

2.1 登录页

2.1.1登陆页的相关说明

登录页面 (Page_PersistentStorage_Case_Login)

2.1.1.1 持久化存储的初始化

使用 PersistentStorage.persistProp 方法初始化持久化存储数据,包括默认的账号、密码、记住密码设置等。

2.1.1.2 输入框

账号和密码的输入框中,分别处理了默认填充已保存账号和密码的逻辑,只有在选中“记住密码”且允许修改时,才会显示保存的数据。

2.1.1.3 记住密码选项

用户可以选择是否记住密码。选中时,将状态保存到持久化存储,并且根据是否记住密码决定是否允许修改密码。

2.1.1.4 登录按钮的逻辑

点击登录按钮时,首先会从存储中获取已注册的用户信息,验证账号密码是否匹配。如果匹配,则跳转到主页面,并保存账号和密码;否则提示错误信息。

2.1.1.5 注册跳转

如果用户没有账号,可以点击“注册账号”跳转到注册页面进行注册。

2.1.2 源码1 (登录页–文件:Page_PersistentStorage_Case_Login.etsf

/*** 登录页面*/
import { User_Message } from './Page_PersistentStorage_Case_Register'
import { promptAction } from '@kit.ArkUI'// 初始化持久化存储数据
// 初始化用户信息数组,包含一个默认账号和密码
PersistentStorage.persistProp("userMessageArr", [{ userAccount: "测试账号", userPassword: "测试密码" } as User_Message]);// 初始化保存的登录账号和密码,用于记住功能
PersistentStorage.persistProp("userAccountRemember", "临时保存账号"); // 默认保存的账号
PersistentStorage.persistProp("userPasswordRemember", "passwordRemember"); // 默认保存的密码// 初始化是否记住密码的状态
PersistentStorage.persistProp("isRememberPassword", false); // 默认不记住密码// 初始化是否允许修改记住密码状态的标志
PersistentStorage.persistProp("isChangeRemember", false); // 默认不可改变记住密码的状态@Entry
@Component
struct Page_PersistentStorage_Case_Login {// 用户输入的账号@State userAccount: string = "";// 用户输入的密码@State userPassword: string = "";// 持久化存储:成功登录后保存的账号@StorageLink("userAccountRemember")userAccountRemember: string = "userAccount--测试账号";// 持久化存储:成功登录后保存的密码@StorageLink("userPasswordRemember")userPasswordRemember: string = "password";// 持久化存储:是否记住密码@StorageLink("isRememberPassword")isRememberPassword: boolean = false;// 持久化存储:是否允许修改记住密码状态@StorageLink("isChangeRemember")isChangeRemember: boolean = false;build() {Column({ space: 10 }) {// 显示登录页面的标题Text("登录").fontSize(30).fontWeight(800);// 账号输入框Row() {Text("账号:");// 仅当允许修改记住密码状态且选中记住密码时,使用存储的账号,否则使用用户输入的账号TextInput({ placeholder: "请输入账号", text: (this.isChangeRemember && this.isRememberPassword) ? this.userAccountRemember : this.userAccount }).layoutWeight(1).onChange((value) => {this.userAccount = value; // 更新用户输入的账号});}// 密码输入框Row() {Text("密码:");// 仅当允许修改记住密码状态且选中记住密码时,使用存储的密码,否则使用用户输入的密码TextInput({ placeholder: "请输入密码", text: (this.isChangeRemember && this.isRememberPassword) ? this.userPasswordRemember : this.userPassword }).layoutWeight(1).type(InputType.Password) // 设置密码类型.onChange((value) => {this.userPassword = value; // 更新用户输入的密码console.log("输入的密码:" + this.userPasswordRemember);});}// 功能选项行,包含注册和记住密码的选项Row() {Blank();// 点击跳转到注册页面Text("注册账号").onClick(() => {this.getUIContext().getRouter().pushUrl({ url: "pages/Page_PersistentStorage/Case/Page_PersistentStorage_Case_Register" });});Blank();// 显示记住密码的选项Text("记住密码");Checkbox().shape(CheckBoxShape.ROUNDED_SQUARE) // 设置为方形复选框.select(this.isRememberPassword) // 当前是否选中.onChange((value: boolean) => {this.isRememberPassword = value; // 更新是否记住密码的选中状态AppStorage.setOrCreate("isRememberPassword", this.isRememberPassword); // 更新到持久化存储console.log("密码是否选中:" + this.isRememberPassword);// 如果取消选择记住密码,禁止修改记住密码状态this.isChangeRemember = false;AppStorage.setOrCreate("isChangeRemember", this.isChangeRemember);console.log("可改变状态--复选框:" + this.isChangeRemember);});Blank();}.width("100%");// 登录按钮Button("登录").width("50%").onClick(() => {// 从持久化存储中获取用户信息数组let userMessageArr: User_Message[] = AppStorage.get("userMessageArr") as [];console.log("登录页数组信息:" + JSON.stringify(userMessageArr));// 初始化过滤后的用户信息数组let personageAccount: User_Message[] = [{ userAccount: "测试账号", userPassword: "测试密码" }];// 过滤用户信息数组,查找匹配的账号personageAccount = userMessageArr.filter((item, vale) => {if (item.userAccount == this.userAccount) {return item; // 返回匹配的账号信息} else {return;}});console.log("筛选过后的内容:" + JSON.stringify(personageAccount));// 根据过滤结果判断登录是否成功if (personageAccount.length > 0) {// 如果密码正确,登录成功if (personageAccount[0].userPassword == this.userPassword) {// 跳转到主页面this.getUIContext().getRouter().pushUrl({ url: "pages/Page_PersistentStorage/Case/Page_PersistentStorage_Case_Main" });// 登录成功后将账号和密码保存到持久化存储AppStorage.setOrCreate("userAccountRemember", this.userAccount);AppStorage.setOrCreate("userPasswordRemember", this.userPassword);console.log("保存的账号:" + this.userAccount);console.log("保存的密码:" + this.userPassword);// 允许修改记住密码状态this.isChangeRemember = true;AppStorage.setOrCreate("isChangeRemember", this.isChangeRemember);console.log("可改变状态--登录:" + this.isChangeRemember);} else {// 密码错误时,弹出提示promptAction.showToast({ message: "输入的密码错误!" });}} else {// 如果账号未注册,弹出提示promptAction.showToast({ message: "账号未注册,可点击注册注册账号!" });}});}.height('100%').width('100%').padding({ left: 10, right: 10 });}
}

2.2 注册页

2.2.1 注册页的相关说明

注册页面 (Page_PersistentStorage_Case_Register)

2.2.1.1 功能

用户通过该页面进行注册,输入账号和密码后,用户信息会被保存到持久化存储中(userMessageArr)。注册成功后,用户的信息(账号和密码)会在页面上显示,并提示注册成功。

2.2.1.2 持久化存储

使用 PersistentStorage.persistProp() 初始化并保存用户信息数组 userMessageArr,存储用户注册时填写的账号和密码。

2.2.1.3 关键交互

用户输入账号和密码,点击“注册”按钮后,信息被保存到存储中,并展示成功信息。

2.2.2 源码2(注册页–文件:Page_PersistentStorage_Case_Register

/*** 注册页面*/
// 定义用户信息类 User_Message,包含账号和密码属性
export interface User_Message {userAccount: string; // 用户账号userPassword: string; // 用户密码
}// 初始化持久化存储,创建一个空的用户信息数组
PersistentStorage.persistProp("userMessageArr", []);@Entry
@Component
struct Page_PersistentStorage_Case_Register {@State isRegister: boolean = false; // 是否完成注册状态@State userAccount: string = ""; // 输入的账号@State userPassword: string = ""; // 输入的密码build() {Column() {// 页面顶部的标题Column({ space: 10 }) {Text("注册").fontSize(30).fontWeight(800);// 账号输入框Row() {Text("账号:");TextInput({ placeholder: "请输入账号", text: $$this.userAccount }).layoutWeight(1); // 设置输入框占据行的剩余空间}// 密码输入框Row() {Text("密码:");TextInput({ placeholder: "请输入密码", text: $$this.userPassword }).layoutWeight(1) // 设置输入框占据行的剩余空间.type(InputType.Password); // 设置输入框类型为密码}// 操作按钮Row() {// 注册按钮Button("注册").width("40%").onClick(() => {this.isRegister = true; // 标记注册成功// 从存储中获取当前用户信息数组let userMessageArr: User_Message[] = AppStorage.get("userMessageArr") as [];// 创建一个新用户对象,包含输入的账号和密码let newUserMessagePersonage = {userAccount: this.userAccount,userPassword: this.userPassword,} as User_Message;// 将新用户信息添加到用户信息数组中userMessageArr.push(newUserMessagePersonage);// 将更新后的用户信息数组保存到持久化存储AppStorage.setOrCreate("userMessageArr", userMessageArr);console.log(JSON.stringify("人员信息数组内容:" + JSON.stringify(userMessageArr)));});// 返回按钮Button("返回").width("40%").onClick(() => {// 返回到上一个页面this.getUIContext().getRouter().back();this.isRegister = false; // 重置注册状态});}.width("100%").justifyContent(FlexAlign.SpaceEvenly); // 按钮水平均匀分布// 注册完成后显示注册信息if (this.isRegister) {Column({ space: 10 }) {Text("注册完成,信息如下:").fontSize(20).fontWeight(800);// 显示注册成功的账号和密码Text("账号:" + this.userAccount);Text("密码:" + this.userPassword);}.width("100%").alignItems(HorizontalAlign.Start) // 左对齐.margin({ top: 50 }); // 设置顶部间距}}.height("100%").width("100%");}.height("100%").width("100%").padding({ left: 10, right: 10 }); // 设置页面左右内边距}
}

2.3 登陆成功的页面

2.3.1 登陆成功页面的相关说明

登录成功页面 (Page_PersistentStorage_Case_Main)

2.3.1.1 功能

展示用户登录成功的欢迎信息,简单地提示“登陆成功,欢迎使用!”。

2.3.1.2 持久化存储

该页面主要是显示登录成功后的提示信息,不涉及持久化存储的操作。

2.3.1.3 关键交互

没有复杂的交互,主要通过状态显示登录成功的信息

2.3.2 源码3(登陆成功的页面–文件:Page_PersistentStorage_Case_Main

/*** 用于显示登陆成功的页面* 展示简单的欢迎信息,提示用户登陆成功。*/@Entry
@Component
struct Page_PersistentStorage_Case_Main {// 欢迎信息@State message: string = '登陆成功,欢迎使用!';build() {// 使用 RelativeContainer 布局,使欢迎信息居中显示RelativeContainer() {// 显示欢迎信息的文本Text(this.message).id('Page_PersistentStorage_Case_MainHelloWorld') // 为组件指定唯一 ID,方便调试或样式绑定.fontSize(50) // 设置字体大小.fontWeight(FontWeight.Bold) // 设置字体加粗.alignRules({center: { anchor: '__container__', align: VerticalAlign.Center }, // 垂直居中middle: { anchor: '__container__', align: HorizontalAlign.Center }, // 水平居中});}.height('100%') // 设置容器高度为全屏.width('100%'); // 设置容器宽度为全屏}
}

2.4 源码1,2,3组成的项目的运行效果

2.4.1 效果视频

使用ArkUI实现用户信息的持久化管理与自动填充

2.4.2 效果截图

2.4.2.1 使用模拟器打开 登陆页,默认情况
  • 默认情况
    在这里插入图片描述
2.4.2.2 点击 注册账号
  • 点击 注册账号
    在这里插入图片描述
2.4.2.3 进入账号注册页
  • 进入账号注册页
    在这里插入图片描述
2.4.2.4 注册内容
  • 注册内容,完毕后点击返回可回到登陆页
    在这里插入图片描述
2.4.2.5 点击 返回 回到 登陆页
  • 点击 返回 回到 登陆页
    在这里插入图片描述
2.4.2.6 账号和密码无误后登陆成功
  • 账号和密码无误后登陆成功
    在这里插入图片描述
2.4.2.7 文件路径关系截图

在这里插入图片描述

3.结语

本文只是根据persistentStorage的内容,举一个例子,以巩固所学。实际开发中,本文对账号和密码的保存方式并不适用,且账号密码容易泄露,不满足密码本身的保密需求。

persistentStorage仅为轻量级储存方式,主要用于保存程序操作过后的进度状态,对于大量的数据内容,还是推荐使用数据库进行储存。

持久化PersistentStorage的相关的内容,华为官方的指南地址:PersistentStorage:持久化存储UI状态

由于笔者的能力有限,创作的内容有所不足在所难免,也敬请读者包涵和指出,万分感谢!

4.定位日期

文字内容基本添加完成,待效果显示视频和截图;
2024-12-1;
1:44;

时间过得好快,没想到弄到凌晨了,调整了登录页的一些内容;
代码调试完成,待视频审核通过;
2024-12-1;
3:58;

2024-12-1;
10:18;

相关文章:

arkTS:使用ArkUI实现用户信息的持久化管理与自动填充(PersistentStorage)

arkUI:使用ArkUI实现用户信息的持久化管理与自动填充(PersistentStorage) 1 主要内容说明2 例子2.1 登录页2.1.1登陆页的相关说明2.1.1.1 持久化存储的初始化2.1.1.2 输入框2.1.1.3 记住密码选项2.1.1.4 登录按钮的逻辑2.1.1.5 注册跳转 2.1.…...

01-Zabbix监控快速入门

01-Zabbix监控快速入门 1、监控知识基本概述1.1 什么是监控1.2 为何需要监控1.3 如何进行监控 2、单机时代如何监控2.1 监控CPU2.2 监控内存2.3 监控磁盘2.4 监控⽹络2.5 监控TCP2.6 监控脚本示例 3、常⻅的监控⽅案3.1 Cacti3.2 Nagios3.3 Zabbix3.4 Prometheus3.5 商业监控⽅…...

docker 怎么启动nginx

在Docker中启动Nginx容器是一个简单的过程。以下是启动Nginx容器的步骤: 拉取Nginx镜像: 首先,你需要从Docker Hub拉取Nginx的官方镜像。使用以下命令: docker pull nginx运行Nginx容器: 使用docker run命令来启动一个…...

1-1 Gerrit实用指南

注:学习gerrit需要拥有git相关知识,如果没有学习过git请先回顾git相关知识点 黑马程序员git教程 一小时学会git git参考博客 git 实操博客 1.0 定义 Gerrit 是一个基于 Web 的代码审查系统,它使用 Git 作为底层版本控制系统。Gerrit 的主要功…...

数据库深入(学习笔记)

多表查询 概述: 多表查询:指从多张表中查询数据笛卡尔积:笛卡尔积是指在数学中,两个集合(A集合,B集合)的所有组合情况。 分类: 连接查询 内连接:相当于查询A、B交集部分数据 隐式内连接:sele…...

PostgreSQL17.x创建数据库及数据库信息查看命令

PostgreSQL17.x创建数据库及数据库信息查看命令 文章目录 PostgreSQL17.x创建数据库及数据库信息查看命令1.创建数据库1. 使用 SQL 命令创建数据库2. 创建数据库并指定字符集3. 验证数据库是否创建成功3. 远程连接1. 修改 PostgreSQL 配置文件2. 修改客户端认证配置4. 指定某个…...

Canal mysql数据库同步到es

Canal与Elasticsearch集成指南 [可视化工具](https://knife.blog.csdn.net/article/details/126348055)下载Canal 1.1.5版本 (alpha-2) 请从GitHub Releases下载Canal 1.1.5版本中间版本alpha-2。仅需下载canal.deployer和canal.adapter组件。 安装Elasticsearch 确保已安装…...

React 前端框架1

一、React 简介 (一)什么是 React React 是一个用于构建用户界面的 JavaScript 库,由 Facebook 开源并维护。它采用了组件化的开发思想,允许开发者将复杂的 UI 拆分成一个个独立、可复用的小组件,就如同搭积木一般&am…...

什么是Batch Normalization?

一、概念 Batch Normalization是在2015年提出的数据归一化方法,主要用在深度神经网络中激活层之前。它的主要作用是加快模型训练时的收敛速度,使模型训练过程更加稳定,避免梯度爆炸或消失,并起到一定的正则化作用,有时…...

rtc-pcf8563 0-0051: low voltage detected, date/time is not reliable

解决方法: 1、先测量pcf8563电源电压,是否满足要求。 2、pcf8563首次操作。第一次读取pcf8563的时间,未初始化,非法,芯片门槛电压检测配置不合理。使用hwclock命令写入一次,即可解决。 hwclock -f /dev/…...

tauri下的两个常用rust web框架:Leptos和Trunk

tauri下有两个常用rust web框架,就是Leptos和Trunk Leptos Leptos 是一个基于 Rust 的 Web 框架。您可以在他们的官方网站上了解更多关于 Leptos 的信息。本指南适用于 Leptos 的 0.6 版本。 Leptos Leptos 是一个用 Rust 编写的现代、高效且安全的 Web 框架。它…...

vscode + conda + qt联合开发

安装vscode 安装conda 清华大学开源软件镜像(Anaconda下载)_清华大学镜像-CSDN博客 conda create新建一个环境,激活这个环境,然后安装pyside6 pip install pyside6 -i https://pypi.tuna.tsinghua.edu.cn/simple 安装成功后输入 pip list查看是否安装…...

mac终端自定义命令打开vscode

1.打开终端配置文件 open -e ~/.bash_profile终端安装了zsh,那么配置文件是.zshrc(打开zsh配置,这里举🌰使用zsh) sudo open -e ~/.zshrc 2.在zshrc配置文件中添加新的脚本(这里的code就是快捷命令可以进…...

关于单片机的原理与应用!

成长路上不孤单😊😊😊😊😊😊 【14后😊///计算机爱好者😊///目前正在学习C😊///持续分享所学😊///如有需要欢迎收藏转发///😊】 今日分享关于单片…...

【手术显微镜】市场高度集中,由于高端手术显微镜的制造技术主要掌握于欧美企业

摘要 HengCe (恒策咨询)是全球知名的大型咨询机构,长期专注于各行业细分市场的调研。行业层面,重点关注可能存在“卡脖子”的高科技细分领域。企业层面,重点关注在国际和国内市场在规模和技术等层面具有代表性的企业,…...

速盾高防cdn支持移动端独立缓存

随着移动互联网的快速发展,移动端网页访问量也越来越大。然而,移动端的网络环境相对不稳定,用户体验可能会受到影响。因此,使用高防CDN来加速移动端网页访问,成为越来越多网站运营者的首选。 速盾高防CDN是一种分布式…...

java中的运算符

大家好,今天来看看java中运算符的一些知识点,理解好运算符是我们在写代码的一大重点,那么我们就来看看吧。 运算符:对操作数进行操作时的符号.,不同运算筹操作的含义不同. 一、算术算片. 1、基本四则运算符:加减乘除模(一*/%) 注意:都是二元…...

视频流媒体服务解决方案之Liveweb视频汇聚平台

一,Liveweb视频汇聚平台简介: LiveWeb是深圳市好游科技有限公司开发的一套综合视频汇聚管理平台,可提供多协议(RTSP/RTMP/GB28181/海康Ehome/大华,海康SDK等)的视频设备接入,支持GB/T28181上下级联&#xf…...

什么是六边形图?

什么是六边形图?) 为什么用六边形图?六边形图的构造原理如何绘制六边形图?(代码示例)结果解读总结 六边形图是一种特殊的二维数据可视化方法,用来展示两个变量之间的关系。它用许多小的六边形&a…...

淘宝天猫API接口探索:店铺商品全览与拍立淘图片搜索实战

在当今的电商时代,淘宝和天猫作为两大巨头,为开发者提供了丰富的API接口,以实现与平台的数据交互。本文将带您探索如何使用淘宝天猫的API接口来获取店铺所有商品列表,以及如何通过拍立淘(图片搜索)功能找到…...

.net6.0 mvc 传递 model 实体参数(无法对 null 引用执行运行时绑定)

说一下情况: 代码没问题,能成功从数据库里查到数据,能将数据丢给ViewBag.XXXX, 在View页面也能获取到 ViewBag.XXXX的值,但是发布到线上后报这个错: Microsoft.CSharp.RuntimeBinder.RuntimeBinderException: 无法对 …...

电子电气架构 --- 面向服务的汽车诊断架构

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 所有人的看法和评价都是暂时的,只有自己的经历是伴随一生的,几乎所有的担忧和畏惧,都是来源于自己的想象,只有你真的去做了,才会发现有多快乐。…...

困扰解决:mfc140u.dll丢失的解决方法,多种有效解决方法全解析

当电脑提示“mfc140u.dll丢失”时,这可能会导致某些程序无法正常运行,给用户带来不便。不过,有多种方法可以尝试解决这个问题。这篇文章将以“mfc140u.dll丢失的解决方法”为主题,教大家有效解决mfc140u.dll丢失。 判断是否是“mf…...

OpenCV_Code_LOG

孔洞填充 void fillHole(const Mat srcBw, Mat &dstBw) {Size m_Size srcBw.size();Mat TempMat::zeros(m_Size.height2,m_Size.width2,srcBw.type());//延展图像srcBw.copyTo(Temp(Range(1, m_Size.height 1), Range(1, m_Size.width 1)));cv::floodFill(Temp, Point(…...

【python】OpenCV—Tracking(10.5)—dlib

文章目录 1、功能描述2、代码实现3、效果展示4、完整代码5、涉及到的库函数dlib.correlation_tracker() 6、参考 1、功能描述 基于 dlib 库,实现指定类别的目标检测和单目标跟踪 2、代码实现 caffe 模型 https://github.com/MediosZ/MobileNet-SSD/tree/master/…...

音视频入门基础:MPEG2-TS专题(9)——FFmpeg源码中,解码TS Header的实现

一、引言 FFmpeg源码对MPEG2-TS传输流/TS文件解复用时,在通过read_packet函数读取出一个transport packet后,会调用handle_packet函数来处理该transport packet: static int handle_packets(MpegTSContext *ts, int64_t nb_packets) { //..…...

React 自定义钩子:useOnlineStatus

我们今天的重点是 “useOnlineStatus” 钩子,这是 React 自定义钩子集合中众多精心制作的钩子之一。 Github 的:https://github.com/sergeyleschev/react-custom-hooks import { useState } from "react" import useEventListener from &quo…...

【C++】vector

vector 是一种容器,广泛存在于多种编程语言中,如 C、Rust、Java 等。它是一种动态数组,可以存储任意类型的元素,并且可以根据需要自动调整大小。下面我将详细介绍 vector 的概念和使用方法,主要以 C 中的 std::vector …...

海外centos服务器如何更换yum镜像源

今天遇到一个海外服务器,需要更新yum源,发现使用国内的(阿里云,腾讯云,华为云等),都无法实现,正常更新,主要问题还是服务器的网络无法访问国内的,所以,本章教程,记录一下,我验证过的方法。 1、备份或删除 源已经停止维护了,也可以将其直接删除,也不会有影响。如…...

go和python的遍历对比

Go 和 Python 都有强大的循环控制结构,但它们在实现和行为上有所不同,特别是关于索引变量的管理、迭代器的使用以及如何在循环中修改循环变量。以下是 Go 和 Python 循环的详细差异分析: 1. 循环类型: Go: Go 使用 …...

ML 系列:第 37 节 — 统计中的估计

文章目录 一、说明二、统计学中估计的目的三、统计学中的估计类型四、什么是点估计量?4.1 基本概念4.2 点估计量的性质4.3 点估计与区间估计4.4 寻找点估计的常用方法 五、区间估计5.1 什么是区间估计?5.1.1 置信区间5.1.2 预测区间5.1.3 容差区间Tolera…...

四、初识C语言(4)

一、作业&#xff1a;static修饰局部变量 #define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> #include <string.h> //作业&#xff1a;static修饰局部变量 int sum (int a) {int c 0;static int b 3;c 1;b 2;return (abc); } int main() {int i 0;int a …...

不同云计算网络安全等级

导读云计算的本质是服务&#xff0c;如果不能将计算资源规模化/大范围的进行共享&#xff0c;如果不能真正以服务的形式提供&#xff0c;就根本算不上云计算。 等级保护定级流程 定级是开展网络安全等级保护工作的 “基本出发点”&#xff0c;虚拟化技术使得传统的网络边界变…...

基于深度学习的甲状腺结节影像自动化诊断系统(PyQt5界面+数据集+训练代码)

随着医学影像技术的发展&#xff0c;计算机辅助诊断在甲状腺结节的早期筛查中发挥着重要作用。甲状腺结节的良恶性鉴别对临床治疗具有重要意义&#xff0c;但传统的诊断方法依赖于医生的经验和影像学特征&#xff0c;存在一定的主观性和局限性。为了解决这一问题&#xff0c;本…...

Codigger Desktop:多样 Look 设计,全新 Game Look 带来趣味体验

Codigger Desktop提供了多种不同的Look设计&#xff0c;以满足用户的不同需求和偏好。包括Keyboard Look、Value Look、Game Look、Location Look、Size Look、Stage Look和Tile Look。 Keyboard Look&#xff1a;提供类似键盘布局的界面设计&#xff0c;方便用户快速访问常用功…...

redis下载、基础数据类型、操作讲解说明,持久化、springboot整合等

1 Redis是什么 官网&#xff1a;https://redis.io 开发者&#xff1a;Antirez Redis诞生于2009年全称是Remote Dictionary Server 远程词典服务器&#xff0c;是一个基于内存的键值型NoSQL数据库。 Redis是一个开源的、高性能的键值对存储系统&#xff0c;它支持多种数据结构&…...

原生js上传图片

无样式上传图片 创建一个 FormData 对象&#xff1a;这个对象可以用于存储数据。 将文件添加到 FormData 对象&#xff1a;通过 append() 方法&#xff0c;将用户选择的文件添加到 formData 对象中。 使用 fetch 发送请求&#xff1a;使用 fetch API 或者其他方法将 FormDat…...

【SpringBoot+Vue】x-admin管理系统跟做

技术栈 前端技术说明Vue前端框架Vuex全局状态管理框架ElementUI前端UI框架Axios前端HTTP框架vue-element-admin项目脚手架 后端技术说明SpringBoot容器MVC框架MyBatisORM框架MyBatis-plusMyBatis增强工具Redis非关系型数据库 数据库准备 SET NAMES utf8mb4; SET FOREIGN_KE…...

计算机网络 —— HTTP 协议(详解)

前一篇文章&#xff1a;网页版五子棋—— WebSocket 协议_网页可以实现websocket吗-CSDN博客 目录 前言 一、HTTP 协议简介 二、HTTP 协议格式 1.抓包工具的使用 2.抓包工具的原理 3.抓包结果 4.HTTP协议格式总结 三、HTTP 请求 1. URL &#xff08;1&#xff09;UR…...

MacOS 配置github密钥

MacOS 配置github密钥 1. 生成GitHub的SSH密钥对 ssh-keygen -t ed25519 -C "xxxxxxx.com" -f ~/.ssh/id_ed25519_github 其中 xxxxxxxxxxx.com 是注册github、gitee和gitlab的绑定账号的邮箱 -t ed25519:生成密钥的算法为ed25519&#xff08;ed25519比rsa速度快&…...

我的第一个创作纪念日 —— 梦开始的地方

前言 时光荏苒&#xff0c;转眼间&#xff0c;我已经在CSDN这片技术沃土上耕耘了365天 今天&#xff0c;我迎来了自己在CSDN的第1个创作纪念日&#xff0c;这个特殊的日子不仅是对我过去努力的肯定&#xff0c;更是对未来持续创作的激励 机缘 回想起初次接触CSDN&#xff0c;那…...

float globalMapVIsualizationLeafSize; 的中文意思是什么

1.在visual studio 中新建文件 没有包含#include <string>头文件&#xff0c;也可以使用 str2.append(", C");吗&#xff1f; 在 Visual Studio 或任何其他 C 开发环境中&#xff0c;即使新建的文件中没有显式包含 #include <string> 头文件&#xff0c…...

合规性要求对漏洞管理策略的影响

讨论漏洞管理中持续面临的挑战&#xff0c;包括确定漏洞的优先级和解决修补延迟问题。 介绍合规性要求以及自动化如何简化漏洞管理流程。 您认为为什么尽管技术不断进步&#xff0c;但优先考虑漏洞和修补延迟等挑战仍然存在&#xff1f; 企业基础设施日益复杂&#xff0c;攻…...

【Delphi】modbus-TCP 协议库

在日常开发中&#xff0c;也会遇到使用modbus的部件&#xff0c;比如温度控制器、读卡器等等&#xff0c;那么使用Delphi开发&#xff0c;也就必须遵守modbus-TCP协议&#xff0c;如果自己使用TCP控件写也没有问题&#xff0c;不过如果有开源的三方库&#xff0c;别人已经调试过…...

乐橙云小程序插件接入HbuilderX

乐橙插件使用&#xff1a; 1.配置app.json文件&#xff0c;uniapp中在mainfest.json中配置 https://uniapp.dcloud.net.cn/collocation/manifest.html#mp-weixin ** 2、集成插件页面.json文件 ** uniapp在 pages.json 对应页面的 style -> usingComponents 引入组件&…...

Python世界:复制粘贴?没那么简单!浅谈深拷贝与浅拷贝

Python世界&#xff1a;复制粘贴&#xff1f;没那么简单&#xff01;浅谈深拷贝与浅拷贝 问题引入切片拷贝是深还是浅&#xff1f;深拷贝和浅拷贝到底有啥区别&#xff1f;本文小结 问题引入 Python实现中&#xff0c;最近遇到个小问题&#xff0c;对其中的拷贝理解更深了些&a…...

vue3实现el-table的拖拽

我这里使用的是 sortablejs 插件; 安装命令: npm install sortablejs --save 注意点: 你的表格数据中要有id作为key去使用; <div class"draggable"><el-table row-key"id" :data"form.tableData" style"width: 100%" max-…...

Apache SSI 远程命令执行漏洞

目录 1、漏洞描述 2、访问页面 3、dirsearch工具爆破出上传目录 ​编辑 4、登录后台 5、上传shell.shtml一句话木马文件 6、拿到flag 1、漏洞描述 在测试任意文件上传漏洞的时候&#xff0c;目标服务端可能不允许上传php后缀的文件。如果目标服务器开启了SSI与CGI支持&a…...

高效集成:将聚水潭数据导入MySQL的实战案例

聚水潭数据集成到MySQL&#xff1a;店铺信息查询案例分享 在数据驱动的业务环境中&#xff0c;如何高效、准确地实现跨平台的数据集成是每个企业面临的重要挑战。本文将聚焦于一个具体的系统对接集成案例——将聚水潭的店铺信息查询结果集成到MySQL数据库中&#xff0c;以供BI…...

Elasticsearch面试内容整理-面试注意事项

在准备 Elasticsearch 面试时,除了掌握技术知识外,还需要注意如何有效展示你的技能和经验。以下是一些 Elasticsearch 面试的注意事项和建议: 掌握基础概念 在面试中,面试官通常会首先评估你对 Elasticsearch 基础概念的理解,包括集群架构、分片、副本、节点类型等。这些是…...