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

华为HarmonyOS灵活高效的消息推送服务(Push Kit) - 5 发送通知消息

场景介绍

通知消息通过Push Kit通道直接下发,可在终端设备的通知中心、锁屏、横幅等展示,用户点击后拉起应用。您可以通过设置通知消息样式来吸引用户。

开通权益

Push Kit根据消息内容,将通知消息分类为服务与通讯资讯营销两大类别,开放通知消息自分类权益。

两种类型的通知消息在提醒方式、消息展示位置、推送数量上皆存在差异。更多说明与权益申请详情参见申请通知消息自分类权益。

说明

  • 若您仅需发送资讯营销类(category取值为MARKETING)消息,则无需申请通知消息自分类权益。
  • 资讯营销类消息每天可发送消息数量根据应用类型分为2条5条,若您发送通知消息被频控,请参考下方频控规则,尝试发送测试消息或申请自分类权益。

频控规则

调测阶段,每个项目每日全网最多可推送1000条测试消息。发送测试消息需设置testMessage为true。

正式发布阶段,单设备单应用下每日推送消息总条数受设备消息频控限制,所有场景化消息发送条数不超过3000条。

服务通讯类消息与资讯营销类消息存在不同的频控策略,详情请参见通知消息推送数量管理规则。

开发步骤

  1. 获取Push Token。
  2. 为确保应用可正常收到消息,建议应用发送通知前调用requestEnableNotification()方法弹出提醒,告知用户需要允许接收通知消息。详情请参见Notification Kit-请求通知授权。
  3. 应用服务端调用Push Kit服务端的REST API推送通知消息,请求示例如下:
    ​
    // Request URL
    POST https://push-api.cloud.huawei.com/v3/[projectId]/messages:send
    // Request Header
    Content-Type: application/json
    Authorization: Bearer eyJr*****OiIx---****.eyJh*****iJodHR--***.QRod*****4Gp---****
    push-type: 0
    // Request Body
    {
    "payload": {
    "notification": {
    "category": "MARKETING",
    "title": "普通通知标题",
    "body": "普通通知内容",
    "clickAction": {
    "actionType": 0
    },
    "notifyId": 12345
    }
    },
    "target": {
    "token": ["IQAAAA**********4Tw"]
    },
    "pushOptions": {
    "testMessage": true
    }
    }
    ​
  • [projectId]:项目ID,登录AppGallery Connect网站,选择“我的项目”,在项目列表中选择对应的项目,左侧导航栏选择“项目设置”,在该页面获取。
  • Authorization:JWT格式字符串,可参见Authorization获取。
  • push-type:0表示Alert消息,此处为通知消息场景。
  • category:表示通知消息自分类的类别,MARKETING为资讯营销类消息,更多类别可参见category获取。
  • actionType:0表示点击消息打开应用首页。
  • token:Push Token,可参见获取Push Token获取。
  • testMessage:测试消息标识,true表示测试消息。每个项目每天限制发送1000条测试消息,单次推送可发送Token数不超过10个。详情请参见testMessage。
  • notifyId:(选填)自定义消息标识字段,仅支持数字,范围 [0, 2147483647],若要用于消息撤回则必填。详情请参见notifyId

4. 发送成功后,可检查设备是否收到通知消息。

点击消息动作

点击消息进入应用首页并传递数据

  1. 发送消息时clickAction中携带data字段并设置actionType字段为0:
    ​
    // Request URL
    POST https://push-api.cloud.huawei.com/v3/[projectId]/messages:send
    // Request Header
    Content-Type: application/json
    Authorization: Bearer eyJr*****OiIx---****.eyJh*****iJodHR--***.QRod*****4Gp---****
    push-type: 0
    // Request Body
    {
    "payload": {
    "notification": {
    "category": "MARKETING",
    "title": "普通通知标题",
    "body": "普通通知内容",
    "clickAction": {
    "actionType": 0,
    "data": {"testKey": "testValue"}
    }
    }
    },
    "target": {
    "token": ["IQAAAA**********4Tw"]
    },
    "pushOptions": {
    "testMessage": true
    }
    }
    ​

    • actionType:点击消息的动作,0表示点击消息后进入首页。
    • data:点击消息时携带的JSON格式的数据。
  2. 在应用首页中(通常为项目模块级别下的src/main/module.json5mainElement的值)的onCreate()方法中覆写如下代码:
    import { UIAbility, Want } from '@kit.AbilityKit';
    import { hilog } from '@kit.PerformanceAnalysisKit';
    export default class MainAbility extends UIAbility {
    onCreate(want: Want): void {
    // 获取消息中传递的data数据
    const data = want.parameters;
    hilog.info(0x0000, 'testTag', 'Succeeded in getting message data');
    // 根据实际业务场景对data进行处理
    }
    }

    onNewWant()方法中覆写如下代码:

    1. import { UIAbility, Want } from '@kit.AbilityKit';
      import { hilog } from '@kit.PerformanceAnalysisKit';
      export default class MainAbility extends UIAbility {
      onNewWant(want: Want): void {
      // 获取消息中传递的data数据
      const data = want.parameters;
      hilog.info(0x0000, 'testTag', 'Succeeded in getting message data');
      // 根据实际业务场景对data进行处理
      }
      }

    注意

    onNewWant()方法仅在单例(singleton)模式下可用。

  3. 当点击消息首次进入应用首页时,会在onCreate()方法中获取消息data数据,当前应用进程存在时,点击新消息进入首页会在onNewWant()方法中获取消息数据。

点击消息进入应用内页并传递数据

  1. 在您的项目模块级别下的src/main/module.json5 中设置待跳转Ability的skills标签中的actions或uris值。

    设置actions参数完成点击消息进入应用内页示例(若skills中添加了uris参数,则uris内容需为空):

    {
    "name": "TestAbility",
    "srcEntry": "./ets/abilities/TestAbility.ets",
    "exported": false,
    "startWindowIcon": "$media:icon",
    "startWindowBackground": "$color:start_window_background",
    "skills": [
    {
    "actions": [
    "com.test.action"
    ]
    }
    ]
    }

    设置uris参数完成点击消息进入应用内页示例(skills中必须同时设置actions参数,actions参数为空),uris对象内部结构说明请参见skills标签。

    {
    "name": "TestAbility",
    "srcEntry": "./ets/abilities/TestAbility.ets",
    "exported": false,
    "skills": [
    {
    "actions": [""],
    "uris": [
    {
    "scheme": "https",
    "host": "www.test.com",
    "port": "8080",
    "path": "push/test"
    }
    ]
    }
    ]
    }

    注意

    module.json5文件中的skills标签下可以同时存在多个skill对象,每个对象对应一种能力。

    若您需要同时设置推送消息跳转能力和其他跳转能力(如NFC跳转、浏览器跳转等),需要在skills数组中创建不同的skill对象,分别映射对应的能力。

  2. 发送消息时clickAction中携带data字段并设置actionType字段为1:
    ​
    // Request URL
    POST https://push-api.cloud.huawei.com/v3/[projectId]/messages:send
    // Request Header
    Content-Type: application/json
    Authorization: Bearer eyJr*****OiIx---****.eyJh*****iJodHR--***.QRod*****4Gp---****
    push-type: 0
    // Request Body
    {
    "payload": {
    "notification": {
    "category": "MARKETING",
    "title": "普通通知标题",
    "body": "普通通知内容",
    "clickAction": {
    "actionType": 1,
    "action": "com.test.action",
    "uri": "https://www.test.com:8080/push/test",
    "data": {"testKey": "testValue"}
    }
    }
    },
    "target": {
    "token": ["IQAAAA**********4Tw"]
    },
    "pushOptions": {
    "testMessage": true
    }
    }
    ​
    • actionType:点击消息动作,1表示点击消息后进入应用内页。当本字段设置为1时,uri和action至少填写一个,若都填写优先寻找与action匹配的应用页面。
    • action:表示能够接收Want的action值的集合,取值可以自定义。
    • uri:表示与Want中uris相匹配的集合,uris规则请参见skills标签。
    • data:点击消息时携带的JSON格式的数据。
  3. 在待跳转页面(下以TestAbility为例)中的onCreate()方法中覆写如下代码:
    import { UIAbility, Want } from '@kit.AbilityKit';
    import { hilog } from '@kit.PerformanceAnalysisKit';
    export default class TestAbility extends UIAbility {
    onCreate(want: Want): void {
    // 获取消息中传递的data数据
    const data = want.parameters;
    hilog.info(0x0000, 'testTag', 'Succeeded in getting message data');
    // 根据实际业务场景对data进行处理
    }
    }

    onNewWant()方法中覆写如下代码:

    import { UIAbility, Want } from '@kit.AbilityKit';
    import { hilog } from '@kit.PerformanceAnalysisKit';
    export default class TestAbility extends UIAbility {
    onNewWant(want: Want): void {
    // 获取消息中传递的data数据
    const data = want.parameters;
    hilog.info(0x0000, 'testTag', 'Succeeded in getting message data');
    // 根据实际业务场景对data进行处理
    }
    }

    注意

    onNewWant()方法仅在单例(singleton)模式下可用。

  4. 当点击消息首次进入应用内页面时,会在onCreate()方法中获取消息data数据;当前应用进程存在时,点击消息会在onNewWant()方法中获取消息数据。

设置通知消息样式

Push Kit提供了多种通知消息样式,您可以自定义其中内容来吸引用户,从而提高应用的日活跃用户数量。

普通通知

您在发送通知消息时notification参数中必须携带titlebody字段,来设置应用收到通知消息后展示在通知中心的标题与内容。文本内容最多显示3行,超出3行以“...”折断。

cke_8707.jpeg

消息体示例:

{
"payload": {
"notification": {
"category": "MARKETING",
"title": "推送服务",
"body": "推送服务(Push Kit)是华为提供的消息推送平台,建立了从云端到终端的消息推送通道。您通过集成推送服务SDK,可以向客户端应用实时推送消息,构筑良好的客户关系,提升用户的感知度和活跃度。",
"clickAction": {
"actionType": 0
}
}
},
"target": {
"token": ["IQAAAACy0tE*************MXzvN7iIKSBYontV2cWj-HFTY_8lSh04w"]
},
"pushOptions": {
"testMessage": true
}
}

通知角标

您可以发送通知消息时携带badge字段来设置应用收到通知消息后以数字的形式展示角标,提醒用户查看消息。

cke_36250.png

消息体示例:

{
"payload": {
"notification": {
"category": "MARKETING",
"title": "通知标题",
"body": "通知内容",
"badge":{
"addNum": 1,
"setNum": 99
},
"clickAction": {
"actionType": 0
}
}
},
"target": {
"token": ["IQAAAACy0tE*************MXzvN7iIKSBYontV2cWj-HFTY_8lSh04w"]
},
"pushOptions": {
"testMessage": true
}
}

说明

  • addNum设置后为应用角标累加数字,非应用角标实际显示数字。
  • setNum设置后为应用角标实际显示数字。setNum优先级高于addNum。
  • 打开应用或者点击、清理通知消息并不会清理角标数字,开发者可通过setBadgeNumber()方法清理角标,使用前需先导入模块。
  • 当setBadgeNumber()方法中的badgeNumber设置为0时,可以实现清理效果。

通知大图标

您可以发送通知消息时携带image字段设置消息大图标内容,提醒用户查看消息。

cke_58214.png

消息体示例:

​
{
"payload": {
"notification": {
"category": "MARKETING",
"title": "主文本 标题",
"body": "副文本 内容详情内容详情内容详情",
"image": "https://example.com/image.png",
"clickAction": {
"actionType": 0
}
}
},
"target": {
"token": ["IQAAAACy0tE*************MXzvN7iIKSBYontV2cWj-HFTY_8lSh04w"]
},
"pushOptions": {
"testMessage": true
}
}
​

说明

支持图片格式为png、jpg、jpeg、bmp,图片长*宽建议小于128*128像素,若超过49152像素,则图片不展示。

多行文本样式

您可以发送通知消息时在notification中携带inboxContentstyle字段设置通知消息为多行文本样式。

cke_71795.png

消息体示例:

{
"payload": {
"notification": {
"category": "MARKETING",
"title": "通知标题",
"body": "通知内容",
"style": 3,
"inboxContent": [
"1.Push Kit(推送服务)是华为提供的消息推送平台",
"2.建立了从云端到终端的消息推送通道",
"3.所有HarmonyOS应用可通过集成Push Kit,实现向应用实时推送消息"
],
"clickAction": {
"actionType": 0
}
}
},
"target": {
"token": ["IQAAAACy0tE*************MXzvN7iIKSBYontV2cWj-HFTY_8lSh04w"]
},
"pushOptions": {
"testMessage": true
}
}

说明

  • 多行文本样式需要设置style字段为3。
  • 当您发送多条通知消息导致用户通知消息折叠时,多行文本样式在展开前显示的标题与内容取自title与body字段。
  • 当用户展开多行文本消息,或仅存在一条多行文本消息时,通知中显示的标题与内容取自title与inboxContent字段。

开发通知消息账号校验

Push Kit提供了账号校验功能,该功能支持您根据终端设备上不同账户属性来推送消息,将通知发送给对应设备上的对应账号。

举例:华为手机上某个应用存在账号A和账号B,若当前登录的账号A切换至账号B后,发送给账号A的通知消息在到达设备后不会进行展示,以避免账号B看到账号A的消息。

注意

  • 当Push Token变更后,账号与应用的绑定关系自动解除。
  • 绑定的应用内账号数量最大为10。

Push Kit支持华为账号和应用账号两种账号类型:

  • 华为账号

    该profileId为应用通过华为账号映射的唯一匿名标识。

    调用bindAppProfileId()绑定接口时机:

    • 在应用内通过华为账号授权登录后。
    • 在应用内从其他账号切换到当前华为账号后。

    调用unbindAppProfileId()解绑接口时机:

    • 在应用内登出华为账号后。

    举例: 用户选择华为账号作为应用登录账号并登录账号A成功后,调用Push Kit绑定接口bindAppProfileId()将账号A的profileId绑定到当前设备的应用token上。应用服务器发送通知消息时若携带该账号A的profileId,则只有当前登录的华为账号为账号A时,才会展示通知消息;若不携带profileId,则无论当前登录的华为账号是否为账号A,都正常展示通知消息。

  • 应用账号

    该profileId为应用通过自己的账号映射的唯一匿名标识。

    调用bindAppProfileId()绑定接口时机:

    • 在应用内登录应用账号后。
    • 在应用内从其他应用账号切换到当前应用账号后。

    调用unbindAppProfileId()解绑接口时机:

    • 在应用内登出应用账号后。

    举例: 用户成功登录应用的账号A后,调用Push Kit绑定接口bindAppProfileId()将账号A的profileId绑定到当前设备的应用token上。应用服务器发送通知消息时若携带账号A的profileId,则只有当前登录的应用账号为账号A时,才会展示通知消息;若不携带profileId,则无论当前登录的应用账号是否为账号A,都正常展示通知消息。

注意

若在账号登出时未做unbindAppProfileId()解绑,或者在账号切换时未做bindAppProfileId()重新绑定,则会导致应用依然能接收到原账号的通知消息。

  1. 获取Push Token。
  2. 为确保应用可正常收到通知消息,建议应用发送通知前调用requestEnableNotification()方法弹出提醒,告知用户需要允许接收通知消息。详情请参见Notification Kit-请求通知授权。
  3. 为待绑定的账号生成一个非空唯一的profileId(不建议使用真实的账号id,推荐使用账号id自行生成对应的匿名标识,能与该账号id建立唯一映射关系即可,生成算法无限制),调用bindAppProfileId()方法,添加当前设备上该用户与应用的关系,代码示例:
    import { hilog } from '@kit.PerformanceAnalysisKit';
    import { pushCommon, pushService } from '@kit.PushKit';
    import { BusinessError } from '@kit.BasicServicesKit';
    // 定义需要绑定的profileId
    const profileId = '1****9';
    // 绑定应用账号
    pushService.bindAppProfileId(pushCommon.AppProfileType.PROFILE_TYPE_APPLICATION_ACCOUNT, profileId).then(() => {
    hilog.info(0x0000, 'testTag', 'Succeeded in binding app profile id');
    }).catch((err: BusinessError) => {
    hilog.error(0x0000, 'testTag', 'Failed to bind app profile id: %{public}d %{public}s', err.code, err.message);
    });
     
  4. 建议您将Push Token和生成的profileId上报到应用服务端,便于应用服务端向终端推送消息。
  5. 应用服务端调用REST API推送通知消息,通知消息示例如下:
    ​
    // Request URL
    POST https://push-api.cloud.huawei.com/v3/[projectId]/messages:send
    // Request Header
    Content-Type: application/json
    Authorization: Bearer eyJr*****OiIx---****.eyJh*****iJodHR--***.QRod*****4Gp---****
    push-type: 0
    // Request Body
    {
    "payload": {
    "notification": {
    "category": "MARKETING",
    "title": "普通通知标题",
    "body": "普通通知内容",
    "profileId": "111***222",
    "clickAction": {
    "actionType": 0
    }
    }
    },
    "target": {
    "token": ["IQAAAA**********4Tw"]
    }
    }
    ​
    • [projectId]:项目ID,登录AppGallery Connect网站,选择“我的项目”,在项目列表中选择对应的项目,左侧导航栏选择“项目设置”,在该页面获取。
    • Authorization:JWT格式字符串,可参见Authorization获取。
    • push-type:0表示通知消息场景。
    • actionType:0表示点击消息打开应用首页。
    • token:Push Token,可参见获取Push Token获取。
    • profileId:应用内账号id匿名标识。详情请参见profileId。

  6. 消息发送成功后,Push Kit会先校验绑定账号时的AppProfileType(华为账号或应用账号):

    • 若绑定华为账号则先校验下发消息中携带的profileId和之前应用绑定的profileId是否一致,再校验当前登录的华为账号和绑定时登录的分布式账号是否一致,若全部满足则展示消息,否则不展示消息。
    • 若绑定应用账号则校验下发消息中携带的profileId和之前应用绑定的profileId是否一致,若满足则展示消息,否则不展示消息。

相关文章:

华为HarmonyOS灵活高效的消息推送服务(Push Kit) - 5 发送通知消息

场景介绍 通知消息通过Push Kit通道直接下发,可在终端设备的通知中心、锁屏、横幅等展示,用户点击后拉起应用。您可以通过设置通知消息样式来吸引用户。 开通权益 Push Kit根据消息内容,将通知消息分类为服务与通讯、资讯营销两大类别&…...

[Meachines] [Medium] Querier XLSM宏+MSSQL NTLM哈希窃取(xp_dirtree)+GPP凭据泄露

信息收集 IP AddressOpening Ports10.10.10.125TCP:135, 139, 445, 1433, 5985, 47001, 49664, 49665, 49666, 49667, 49668, 49669, 49670, 49671 $ nmap -p- 10.10.10.125 --min-rate 1000 -sC -sV -Pn PORT STATE SERVICE VERSION 135/tcp open msrp…...

新版ssh客户端无法连接旧版服务器sshd的方法

新安装完的windows 版本,连Linux服务器直接报错 C:\Users\wang>ssh root192.168.110.50 Unable to negotiate with 192.168.110.50 port 22: no matching key exchange method found. Their offer: diffie-hellman-group14-sha1,diffie-hellman-group1-sha1,kex…...

MyBatis操作数据库-XML实现

目录 1.MyBatis的简单介绍 2.MyBatis操作数据库的步骤 2.1 添加依赖 2.2 配置文件 2.3 写持久层代码 2.4 方法测试 3.MyBatis操作数据库(增删查改) 3.1 CRUD标签 3.2 参数传递 3.3 Insert-新增 3.4 Delete-删除 3.5 Update-修改 3.6 Select-查询(映射问题) 1.MyB…...

华为HarmonyOS地图服务 5 - 利用UI控件和手势进行地图交互

场景介绍 本章节将向您介绍如何使用地图的手势。 Map Kit提供了多种手势供用户与地图之间进行交互,如缩放、滚动、旋转和倾斜。这些手势默认开启,如果想要关闭某些手势,可以通过MapComponentController类提供的接口来控制手势的开关。 接口…...

解决DockerDesktop启动redis后采用PowerShell终端操作

如图: 在启动redis容器后,会计入以下界面 : 在进入执行界面后如图: 是否会觉得界面过于单调,于是想到使用PowerShell来操作。 步骤如下: 这样就能使用PowerShell愉快地敲命令了(颜值是第一生…...

react + antDesign封装图片预览组件(支持多张图片)

需求场景:最近在开发后台系统时经常遇到图片预览问题,如果一个一个的引用antDesign的图片预览组件就有点繁琐了,于是在antDesign图片预览组件的基础上二次封装了一下,避免重复无用代码的出现 效果 公共预览组件代码 import React…...

逻辑回归 和 支持向量机(SVM)比较

为了更好地理解为什么在二分类问题中使用 SVM,逻辑回归的区别,我们需要深入了解这两种算法的区别、优势、劣势,以及它们适用于不同场景的原因。 逻辑回归和 SVM 的比较 1. 模型的核心思想 • 逻辑回归: • 基于概率的模型&…...

GS-SLAM论文阅读笔记--TAMBRIDGE

前言 本文提出了一个自己的分类方法,传统的视觉SLAM通常使用以帧为中心的跟踪方法,但是3DGS作为一种高效的地图表达方法好像更侧重于地图的创建。这两种方法都有各自的优缺点,但是如果能取长补短,互相结合,那么就会是…...

[Redis面试高频] - zset的底层数据结构

文章目录 [Redis面试高频] - zset的底层数据结构一、引言二、zset 的底层数据结构1、zset 的编码方式1.1、ziplist 编码1.2、skiplist 编码 1.3、ziplist 编码适用条件1.4、skiplist 编码适用条件2、zset 的操作命令 三、zset 的性能考量1、内存效率2、搜索效率 四、总结 [Redi…...

搜维尔科技:OptiTrack将捕捉到的人类动作数据映射到人形机器人的各个关节上进行遥操作

OptiTrack将捕捉到的人类动作数据映射到人形机器人的各个关节上进行遥操作 搜维尔科技:OptiTrack将捕捉到的人类动作数据映射到人形机器人的各个关节上进行遥操作...

CentOS Linux教程(6)--CentOS目录

文章目录 1. 根目录2. cd目录切换命令3. CentOS目录介绍4. pwd命令介绍5. ls命令介绍5.1 ls5.2 ls -a5.3 ls -l 1. 根目录 Windows电脑的根目录是计算机(我的电脑),然后C盘、D盘。 Linux系统的根目录是/,我们可以使用cd /进入根目录,然后使…...

观察者模式全攻略:从设计原理到 SpringBoot 实践案例

观察者模式 观察者模式(Observer Pattern)是一种行为型设计模式,它定义了一种一对多的依赖关系,使得当一个对象的状态发生改变时,所有依赖于它的对象都能得到通知并自动更新。 核心思想: 观察者模式将**观…...

【MyBatis】Java 数据持久层框架:认识 MyBatis

Java 数据持久层框架:认识 MyBatis 1.CRUD 注解2.映射注解3.高级注解3.1 高级注解3.2 MyBatis 3 注解的用法举例 MyBatis 和 JPA 一样,也是一款优秀的 持久层框架,它支持定制化 SQL、存储过程,以及高级映射。它可以使用简单的 XML…...

【Delphi】通过 LiveBindings Designer 链接控件示例

本教程展示了如何使用 LiveBindings Designer 可视化地创建控件之间的 LiveBindings,以便创建只需很少或无需源代码的应用程序。 在本教程中,您将创建一个高清多设备应用程序,该应用程序使用 LiveBindings 绑定多个对象,以更改圆…...

深度学习——基础知识

深度学习的重点在于优化,其中很重要的步骤在于如何调参,会涉及到一些微积分等数学知识。不同于以往接触到的数值运算,深度(机器)学习都是关于张量Tensor(向量)的计算,Python中最常用…...

QT实现升级进度条页面

一.功能说明 在Qt中实现固件升级的进度条显示窗口,你可以通过创建一个自定义的对话框(Dialog)来完成。这个对话框可以包含一个进度条(QProgressBar)、一些文本标签(QLabel)用于显示状态信息&am…...

JavaWeb--纯小白笔记04:Tomcat整合IDEA

IDEA整合Tomcat 1.点击Idea的导航栏里的Run,选择Edit Configurations 2.点击左上角的"",向下翻找到Tomcat Server 选择里面的Local 3.创建一个web工程,点击IDEA的File-->new-->project 然后选择Java Enterprise,…...

【jvm】动态链接为什么需要常量池

目录 1. 常量池的作用2. 动态链接与常量池的关系3. 动态链接的必要性 1. 常量池的作用 1.常量池是JVM(Java虚拟机)中用于存储字面量(如字符串常量、整数常量等)和符号引用(如类和接口的完全限定名、字段的名称和描述符…...

HTTPS详解

文章目录 HTTPS加密 常见加密方式对称加密非对称加密非对称对称数据指纹 证书CA认证数字签名非对称证书对称 中间人 HTTPS 这也是一个应用层协议,是在HTTP协议的基础上引入了一个加密层 为什么要加密呢,这主要是因为如果不对传输主体加密,当…...

redis作为mybaits(mybatisplus)的缓存

引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId> </dependency>配置application.yml文件 spring:data:redis:# 地址host: 127.0.0.1# 端口port: 6379# 数据…...

【环境配置】AST: Asymmetric Student-Teacher Networks for Industrial Anomaly Detection

文章目录 一、环境的配置二、预处理三、训练四、问题 一、环境的配置 # zheP04_cmp_AST $ conda create -n P04_cmp_AST python3.9 $ conda activate P04_cmp_AST $ conda install -y anaconda::scikit-learn $ conda install -y conda-forge::scipy $ conda install -y conda…...

TinkerTool System for Mac实用软件系统维护工具

TinkerTool System 是一款功能全面且强大的 Mac 实用软件&#xff0c;具有以下特点和功能&#xff1a; 软件下载地址 维护功能&#xff1a; 磁盘清理&#xff1a;能够快速扫描并清理系统中的垃圾文件、临时文件以及其他无用文件&#xff0c;释放宝贵的磁盘空间&#xff0c;保…...

物理学基础精解【9】

文章目录 直线与二元一次方程两直线夹角直线方程斜率两点式方程截距式方程将不同形式的直线方程转换为截距方程直线的一般方程直线一般方程的系数有一个或两个为零的直线 参考文献 直线与二元一次方程 两直线夹角 两直线 y 1 k 1 x b 1 , y 2 k 2 x b 2 形成夹角 a 1 和 a…...

Flask-JWT-Extended登录验证

1. 介绍 """安装:pip install Flask-JWT-Extended创建对象 初始化与app绑定jwt JWTManager(app) # 初始化JWTManager设置 Cookie 的选项:除了设置 cookie 的名称和值之外&#xff0c;你还可以指定其他的选项&#xff0c;例如&#xff1a;过期时间 (max_age)&…...

Altium Designer(AD)百度云下载与安装(附安装步骤)

在我们日常使用当中&#xff0c;Altium designer常常也被简称为AD&#xff0c;是一款一体化的电子产品开发系统软件&#xff0c;主要运行在Windows操作系统上。 我们通过Altium designer把原理图设计、电路仿真、PCB绘制编辑、拓扑逻辑自动布线、信号完整性分析和设计输出等技…...

无人机视角下的车辆数据集

车辆数据集 无人机视角下的车辆数据集。数据集为无人机俯拍的真实场景下的车辆机动车数据集。数据集已经标注好&#xff0c;yolo格式&#xff0c;txt标签。数据集已经划分好训练集&#xff08;20970张图片&#xff09;验证集&#xff08;5242张图片&#xff09;测试集&#xff…...

【MYSQL】聚合查询、分组查询、联合查询

目录 聚合查询聚合函数count()sum()avg()max()和min()总结 分组查询group by 子句having 子句 联合查询笛卡尔积内连接外连接自连接子查询单行子查询多行子查询from子句使用子查询 合并查询 聚合查询 聚合查询就是针对表中行与行之间的查询。 聚合函数 count() count(列名)&a…...

使用IDA Pro动态调试Android APP

版权归作者所有&#xff0c;如有转发&#xff0c;请注明文章出处&#xff1a;https://cyrus-studio.github.io/blog/ 关于 android_server android_server 是 IDA Pro 在 Android 设备上运行的一个调试服务器。 通过在 Android 设备上运行android_server&#xff0c;IDA Pro …...

JS中的for...in和for...of有什么区别?

你好&#xff0c;我是沐爸&#xff0c;欢迎点赞、收藏、评论和关注。 在 JavaScript 中&#xff0c;for...in 和 for...of 是两种用于遍历数组&#xff08;或其他可迭代对象&#xff09;的循环语句&#xff0c;但它们之间存在显著的差异。 一、遍历数组 for…in const arr …...