电商网站欣赏,简述电子商务网站的建设步骤,开网站需要什么流程,网富公司收费大概多少钱写了鉴权工具#xff0c;你在项目中申请了那些权限#xff1f;#xff08;常用权限#xff09; 位置权限 #xff1a; ohos.permission.LOCATION_IN_BACKGROUND#xff1a;允许应用在后台访问位置信息。
ohos.permission.LOCATION#xff1a;允许应用访问精确的位置信息…写了鉴权工具你在项目中申请了那些权限常用权限 位置权限  ohos.permission.LOCATION_IN_BACKGROUND允许应用在后台访问位置信息。
ohos.permission.LOCATION允许应用访问精确的位置信息。
ohos.permission.APPROXIMATELY_LOCATION允许应用访问大致的位置信息。  相机权限  ohos.permission.CAMERA允许应用访问相机设备。  麦克风权限  ohos.permission.MICROPHONE允许应用访问麦克风设备。  通讯录权限  ohos.permission.READ_CONTACTS允许应用读取通讯录。
ohos.permission.WRITE_CONTACTS允许应用写入通讯录。  日历权限  ohos.permission.READ_CALENDAR允许应用读取日历数据。
ohos.permission.WRITE_CALENDAR允许应用写入日历数据。  运动数据权限  ohos.permission.ACTIVITY_MOTION允许应用访问运动数据。此权限不支持在2in1设备上申请。  身体传感器权限  ohos.permission.READ_HEALTH_DATA允许应用读取健康数据。此权限仅穿戴设备可申请。  图片和视频权限  ohos.permission.WRITE_IMAGEVIDEO允许应用写入图片和视频。
ohos.permission.READ_IMAGEVIDEO允许应用读取图片和视频。  音乐和音频权限  ohos.permission.WRITE_AUDIO允许应用写入音频文件。
ohos.permission.READ_AUDIO允许应用读取音频文件。  跨应用关联权限  ohos.permission.APP_TRACKING_CONSENT允许应用进行跨应用跟踪。  多设备协同权限  ohos.permission.DISTRIBUTED_DATASYNC允许应用在多设备之间同步数据。  蓝牙权限  ohos.permission.ACCESS_BLUETOOTH允许应用访问蓝牙设备。  剪切板权限  ohos.permission.READ_PASTEBOARD允许应用读取剪切板数据。  文件夹权限  ohos.permission.READ_WRITE_DOWNLOAD_DIRECTORY允许应用读写下载目录。
ohos.permission.READ_WRITE_DOCUMENTS_DIRECTORY允许应用读写文档目录。此权限仅2in1设备可申请。  使用安全控件的话可以免申请权限为啥不考虑使用安全控件 
使用安全控件确实可以在某些情况下免除你在鸿蒙系统中申请权限的需要。安全控件是一种系统提供的ArkUI组件它们允许应用在用户点击后自动授权无需额外的弹窗授权。这种方式不仅简化了开发者和用户的操作还能够基于场景化授权匹配用户的真实意图从而减少弹窗打扰提升用户体验。 
安全控件的主要优点包括 
用户掌握授权时机 用户可以在需要时才进行授权授权范围也最小化。简化操作 开发者不必向应用市场申请权限1。隐私合规 安全控件坚持仅采集实现业务功能所必须的个人数据1。 
目前系统提供了三类安全控件 
粘贴控件PasteButton 对应剪贴板读取特权适用于需要读取剪贴板的场景1。保存控件SaveButton 对应媒体库写入特权适用于需要保存文件到媒体库的场景1。位置控件LocationButton 对应精准定位特权适用于需要在前台短暂使用位置信息的场景。 
例如在聊天界面发送实时定位信息的场景中你可以直接使用位置控件来获得临时的精准定位授权这样就可以避免长时间使用位置信息或后台使用位置信息的情况从而满足权限最小化和提升隐私体验的要求2。 
鉴于这些优势使用安全控件成为了一种优选的解决方案尤其是在应用不需要持续或后台访问敏感信息的情况下。这样不仅可以提高应用的隐私保护水平还可以增强用户的信任和使用体验。 
约束与限制 
安全控件因其自动授权的特性为了保障用户的隐私不被恶意应用获取针对安全控件作了很多的限制。应用开发者需保证安全控件在应用界面上清晰可见、用户能明确识别防止因覆盖、混淆等因素导致授权失败。 
当因控件样式不合法导致授权失败的情况发生时请开发者检查设备错误日志过滤关键字SecurityComponentCheckFail可以获取具体原因。 
可能会导致授权失败的问题包括但不限于 字体、图标尺寸过小。  安全控件整体尺寸过大。  字体、图标、背景按钮的颜色透明度过高。  字体或图标与背景按钮颜色过于相似。  安全控件超出屏幕、超出窗口等导致显示不全。  安全控件被其他组件或窗口遮挡。  安全控件的父组件有类似变形模糊等可能导致安全控件显示不完整的属性。  扫描二维码需要相机权限吗拍照需要相机权限吗 
需要 
在鸿蒙HarmonyOS开发中使用相机进行扫码和拍照确实需要申请相机权限。这是因为相机操作涉及到用户的隐私和安全因此应用在使用相机前必须获得用户的明确授权。 
具体来说对于相机权限的申请您需要在应用的module.json5文件中配置相机权限如下所示 
permissions: [ ohos.permission.CAMERA ] 
这行配置表示您的应用请求使用相机的权限。在应用运行时您还需要通过代码请求用户授权可以使用以下代码片段 
import { requestPermissionsFromUser } from ohos.ability;const permissions  [ohos.permission.CAMERA];
const result  await requestPermissionsFromUser(permissions);
if (result[ohos.permission.CAMERA]  authorized) {console.log(Camera permission authorized);
} else {console.log(Camera permission denied);
}这段代码会弹出一个授权对话框让用户决定是否授予应用相机权限。只有当用户同意后应用才能使用相机进行扫码或拍照。 
因此无论是进行二维码扫描还是拍照您的应用都需要先确保已经获得了相机权限。这是保障用户隐私和应用功能正常运行的重要步骤。 
不需要 
系统通过提供系统Picker和安全控件两种方式使得应用能够便捷地访问系统资源。这两种方法均依赖于系统的独立进程来实现当应用拉起系统Picker或展示安全控件时必须依赖用户的主动操作来获取资源或结果。这一流程避免了应用额外申请权限同时由于用户的积极参与进一步增强了用户隐私和安全的保护。 
系统Picker 
系统Picker是拉起系统资源的一种方式由于系统Picker已经获取了对应权限的预授权开发者使用系统Picker时无需再次申请权限也可临时受限访问对应的资源。 
使用系统Picker组件拉起系统应用的场景主要有联系人PickerContacts Picker地图Picker相机PickerCamera Picker扫码Picker卡证识别Picker文档扫描Picker文件Picker音频Picker和照片PickerPhotoViewPicker等详细可参考拉起系统应用。 
安全控件 
安全控件是系统提供的一组系统实现的ArkUI组件应用集成这类组件就可以实现在用户点击后自动授权而无需弹窗授权。它们可以作为一种“特殊的按钮”融入应用页面实现用户点击即许可的设计思路。 
目前系统提供三类安全控件粘贴控件PasteButton、保存控件SaveButton、位置控件LocationButton。 
使用场景示例 
以下列举了三个优先使用系统Picker或者安全控件的场景 
读写媒体库图片或视频 推荐方案无需申请权限使用PhotoViewPicker读取媒体库的图片与视频使用安全控件中的保存控件保存媒体库的图片与视频。申请权限方案申请受限权限ohos.permission.READ_IMAGEVIDEO或ohos.permission.WRITE_IMAGEVIDEO读取媒体库的图片与视频。拉取系统相机拍照录制 推荐方案无需申请权限仅是需要拉起系统相机拍摄一张照片、录制一段视频可直接使用CameraPicker无需申请相机权限。申请权限方案开发一个相机应用或是在应用内开发相机模块时需按相机开发指导在开发前做好申请权限的准备。访问当前位置 推荐方案无需申请权限应用仅需要在部分前台场景短暂地访问位置信息例如定位城市、打卡、分享位置等不需要长时间使用。此时可以直接使用安全控件中的位置控件免去权限申请和权限请求等环节获得临时授权满足权限最小化提升用户的隐私体验。申请权限方案如果需要长时间使用或是在后台使用位置信息建议申请位置权限。 华为一键登入认证需要怎么做 
华为一键登录认证主要涉及以下几个步骤 集成登录组件  在您的应用中集成华为账号登录组件。这可以通过添加LoginWithHuaweiIDButton按钮来实现该按钮支持一键登录功能。 配置权限  在应用后台配置中您需要申请quickLoginMobilePhone华为账号一键登录的scope权限。这是实现一键登录的前提条件。 用户交互设计  按照华为的设计规范设计一键登录的用户体验UX。这包括按钮的样式设计和页面布局确保符合华为账号一键登录的视觉和体验标准。 处理登录逻辑  当用户点击一键登录按钮后应用会检查华为账号的登录状态。如果已经登录应用将解析出用户的UnionID、OpenID和手机号码。如果用户在90天内没有验证记录系统将触发短信验证流程以确保手机号的有效性。 协议处理  用户在使用一键登录前必须同意《华为账号用户认证协议》1。您可以引导用户查看协议内容并在用户同意后继续登录流程。 服务器配置  应用服务器在获取华为账号绑定的手机号码时必须确保服务器部署在中国大陆境内因为该项服务当前仅限中国大陆用户使用。 
通过以上步骤您的应用就可以实现华为账号的一键登录功能提供给用户快速、便捷的登录体验。 华为一键登入前端能获取到手机号码吗 
在华为账号一键登录功能中前端确实能够获取到用户的手机号码。这一功能是通过华为的Account Kit实现的它允许开发者在用户点击一键登录按钮后获取用户绑定到华为账号的手机号码。 
具体的实现方式如下 
用户点击一键登录按钮后系统会检查用户在最近90天内是否有短信验证通过的记录。如果有則直接返回手机号码如果没有系统将触发默认的短信验证流程。这一过程中开发者可以通过设置相应的回调函数来处理验证结果例如在用户同意协议并完成登录后可以使用continueLogin(callback)方法来处理登录结果。 注意这里虽然获取到了手机号码但是是匿名手机号码 例如 183******58  flutter怎么适配安卓和IOS 
Flutter 能够高效适配安卓Android与 iOS 平台主要得益于以下几个关键要素 
跨平台框架设计 统一的编程语言Flutter 使用 Dart 语言进行开发它无需针对不同平台学习 Objective-C、SwiftiOS 或 Java、KotlinAndroid。开发者用一套代码就能在两大主流移动平台构建应用节省大量人力与学习成本。例如开发一款简单的待办事项应用从创建任务列表、添加删除任务的逻辑到界面布局与交互代码只需编写一次。自绘引擎Flutter 自带了一套高性能的自绘引擎不依赖于原生系统控件。无论是在安卓的 Material Design 风格还是 iOS 的扁平简约风格下它能直接在画布上绘制出符合对应平台设计规范的 UI 元素摆脱原生控件适配难题像绘制一个自定义的渐变按钮Flutter 可以精准呈现不受原生系统限制。平台适配插件 官方插件Flutter 官方提供海量的插件库覆盖常见的功能如摄像头调用、地理位置获取、蓝牙连接等。针对安卓与 iOS 平台的特性差异这些插件内部已做了适配处理。以地图插件为例它能无缝对接谷歌地图Android和苹果地图iOS开发者使用时只需按统一接口操作不必操心底层适配。社区插件活跃的 Flutter 社区持续贡献丰富插件补充官方遗漏的小众或新需求场景。当新的 iOS 系统特性发布社区开发者会迅速反应更新插件适配新功能其他开发者拿来就能用加快项目适配新平台特性的速度。遵循设计规范 安卓 Material Design对于安卓平台Flutter 提供了遵循 Material Design 规范的组件库开发者可以轻松组合出具有安卓风格的页面像带水波纹特效的按钮、多层卡片式布局让应用融入安卓生态。iOS Human Interface Guidelines对应 iOSFlutter 同样能塑造贴合 iOS 设计理念的界面如简洁大气的导航栏样式、细腻的动画过渡确保应用在 iOS 设备上的用户体验符合苹果官方标准。编译打包流程 差异化配置Flutter 项目的构建脚本支持为安卓与 iOS 分别设置特定参数比如安卓的不同应用市场渠道包配置、iOS 的 App Store 上架证书配置等。开发者可以在编译时精细调整确保生成的应用包符合对应平台的上架、分发要求。多平台测试Flutter CLI 工具方便开发者在安卓模拟器、真机以及 iOS 模拟器、真机上快速测试通过多轮反复测试排查因平台差异隐藏的兼容性问题从布局错乱到功能异常尽早发现并修复。 安卓的四大组件 安卓的四大组件分别是 Activity活动、Service服务、Broadcast Receiver广播接收器以及 Content Provider内容提供者它们各自发挥着关键作用协同构建起功能丰富的安卓应用 
Activity活动 用户交互核心作为安卓应用中直接与用户交互的可视化界面单元每一个 Activity 通常对应一屏显示内容像登录界面、主菜单、商品详情页等。它接收并响应用户的各类操作例如触摸屏幕、按键点击借此驱动页面跳转、数据更新、输入处理等交互流程。用户打开购物 APP首先映入眼帘的首页 Activity浏览商品时点击图片进入对应的商品详情 Activity这一系列交互都发生在 Activity 层面。生命周期管理有着严谨的生命周期包括创建onCreate、启动onStart、恢复onResume 、暂停onPause、停止onStop、销毁onDestroy等阶段。开发者依据这些阶段精准把控资源分配与回收比如在 onCreate 阶段初始化界面布局与数据onDestroy 阶段释放不再使用的资源防止内存泄漏。Service服务 后台持续运行专注于在后台长时间执行特定任务无需可视化界面。典型场景如音乐持续播放、文件后台下载、实时数据同步等。即使用户切换到其他 APP对应的服务依然可以稳定运行维持业务的连贯性用户开启音乐播放服务后即便切出去浏览新闻资讯音乐也不停歇。跨组件协作它能够与其他组件配合通过 Intent 启动也可以与 Activity、Broadcast Receiver 互动。例如Activity 可以启动一个 Service 来执行耗时任务之后通过广播接收器接收 Service 完成任务的反馈实现不同组件间的接力协作。Broadcast Receiver广播接收器 消息监听响应负责监听系统或应用发出的广播消息安卓系统在众多关键事件节点如开机、网络连接变化、电量不足等都会发送广播应用自身也能按需自定义广播。广播接收器捕捉到广播后即刻执行预设的响应动作手机电量低时系统广播发出电量预警类 APP 中的广播接收器收到信号便及时提醒用户充电。系统集成与拓展借助广播接收器应用得以深度融入安卓系统生态拓展功能边界。例如安装新应用时系统广播触发某些文件管理类 APP 借此广播可自动扫描新安装应用相关文件实现智能管理。Content Provider内容提供者 数据共享桥梁充当不同安卓应用间数据共享的媒介把自身应用的数据以安全、可控的方式提供给其他授权应用访问。常见的通讯录应用通过 Content Provider 将联系人数据开放第三方短信、社交 APP 获取授权后就能读取联系人实现诸如短信群发、好友推荐等功能。数据封装与访问控制它将数据封装成统一格式配套设置访问权限规则既保障数据拥有者的权益也让有需求的应用合规获取数据促进安卓应用间的数据流通与协同。 。 有了解Handler吗Handler是什么 在安卓开发中Handler是一个极为关键的类用于实现线程间通信尤其是在处理主线程UI 线程与子线程交互时必不可少主要体现在以下几方面 
基本原理 Handler 关联着 MessageQueue消息队列与 Looper循环器。MessageQueue 是一个存放 Message消息的队列按先进先出原则排列用于暂存那些等待被处理的消息Looper 则持续不断地从这个队列里取出消息并把消息分发给对应的 Handler 去处理。每个线程默认只有一个 Looper主线程的Looper在安卓应用启动时就自动创建好了而子线程若要使用Handler往往得手动创建Looper 。作用 助力 UI 更新安卓规定耗时操作不能在主线程执行否则会阻塞 UI造成界面卡顿甚至 ANRApplication Not Responding应用无响应。当子线程完成耗时任务如网络下载、数据库查询后可将结果封装进 Message借助 Handler 发送到主线程的 MessageQueue。主线程的Looper会从队列中取出该消息再由对应的Handler处理从而安全地更新 UI 。例如子线程下载好一张图片后把图片数据通过Handler传递给主线程主线程更新 ImageView 来展示图片。线程间协调不仅是子线程向主线程汇报Handler也用于多线程间的信息传递与任务调度。不同子线程之间可以通过共享的 Handler 发送和接收消息让它们的工作协同起来有条不紊地完成复杂项目像是在一个多线程处理多媒体文件的项目里音频处理线程与视频处理线程靠Handler沟通进度、同步状态。使用方式 创建与发送消息首先得创建 Handler 对象通常是在主线程创建并重写 handleMessage 方法用于定义收到消息后的处理逻辑。接着在子线程生成 Message 通过 Handler 的sendMessage 或 post方法把消息发送出去 。例如 Handler handler  new Handler() {Overridepublic void handleMessage(Message msg) {// 处理消息msg里携带了数据super.handleMessage(msg);}
};new Thread(new Runnable() {Overridepublic void run() {Message message  Message.obtain();// 设置消息内容handler.sendMessage(message);}
}).start(); 在上述代码中先定义Handler子线程获取Message后发送给主线程的Handler处理。  Handler、MessageLooper与MessageQueue 之间的关系 Handler、Message、Looper 与 MessageQueue 在安卓开发的线程间通信机制里紧密协作各自承担独特功能共同构成一个高效的信息流转体系 Message 数据载体它是整个通信流程的 “包裹”用来承载各式各样的数据。无论是简单的整数、字符串还是复杂的自定义对象都能封装进Message。例如子线程完成网络数据下载任务后把下载的数据封装到Message里以便传递给其他线程处理。Message自身带有一些属性字段像是what开发者可以为其赋值以此区分不同类型的消息方便接收方针对性处理。MessageQueue 消息队列充当 “信息仓库”是一个按先进先出FIFO原则组织的队列。所有待处理的Message都会被依次排入这个队列无论消息来自哪个线程。这就好比银行营业厅的排队叫号系统众多客户消息按先来后到顺序等待被服务处理。它负责暂存众多Message保证消息处理的有序性。Looper 消息循环器关联着MessageQueue是驱动整个消息处理流程的 “引擎”。Looper会不断地从MessageQueue里取出Message然后将其分发给对应的Handler去处理。每个线程默认情况下只会有一个Looper主线程的Looper在安卓应用启动时便自动创建完成而子线程如果要启用Handler多数时候得手动搭建Looper体系否则无法正常收发消息。Looper持续运转不停地从队列中捞出消息维持信息处理的动态循环。Handler 消息处理器一方面Handler是消息的 “投递员”负责把Message发送到对应的MessageQueue。比如子线程中有重要数据要传递给主线程更新 UI就通过子线程创建的Handler把封装好数据的Message排入主线程的MessageQueue。另一方面Handler也是消息的 “接收站”它定义了handleMessage方法当Looper把从MessageQueue中取出的Message转交给Handler时就会触发该方法进而处理消息内容完成从消息发送、排队、提取到最终处理的完整闭环。 
总结来说Message承载具体数据进入MessageQueue排队等待Looper驱动循环从队列中提取Message再由Handler完成收发与处理它们协同运作保障安卓应用多线程间有条不紊地通信。 鸿蒙状态管理的装饰器 State 功能在使用鸿蒙的声明式开发范式时State 是极为重要的标识。当一个变量被标注为 State意味着这个变量用于保存组件的本地状态它的任何改变都会触发组件的重新渲染。例如在一个简单的计数器组件里把记录当前计数值的变量标记成 State每次点击增加或减少按钮改变这个值时组件会迅速响应更新界面显示的数字精准呈现最新状态。原理鸿蒙的 ArkUI 框架依赖这种机制追踪状态变化。被 State 修饰的变量发生变更框架能够感知随即启动重新构建受影响的 UI 部分流程避免了不必要的全页面刷新优化性能的同时也让 UI 与数据状态紧密同步。Prop 功能用于父子组件之间的数据传递与状态关联。如果父组件有某个数据需要传递给子组件将该数据通过 Prop 修饰后传递下去子组件接收后就能基于这份数据展示内容或者执行逻辑。并且子组件对这个数据的修改也能反向通知父组件维持父子组件间状态的协同更新。打个比方父组件是一个商品列表把选中商品的索引用 Prop 传给子组件商品详情展示框 子组件里切换商品详情时父组件也能同步知晓更新列表选中状态。优势通过 Prop 构建起清晰高效的父子组件交互通道简化跨组件状态同步的复杂程度提升代码可读性与可维护性降低因状态不同步引发的 bug 出现概率。Link 功能建立父子组件间的双向数据绑定通道。无论是父组件数据变动影响子组件显示还是子组件对数据的修改都能实时反馈给父组件让二者的数据状态时刻保持同步双向互通。协同和普通单向传递数据的机制相互补充在父子组件交互场景下要是数据需频繁来回变动Link 简化操作无需手动编写过多更新逻辑两边数据自动协同提升开发效率与交互响应速度。Provide 与 Consume 功能Provide 负责将某个状态变量公开使其成为全局或局部范围内可共享的 “资源池”Consume 则像一个 “取水口”组件添加该装饰器就能获取、使用被提供的状态让状态能跨多层级、多组件流通。协同二者配合打破组件层级束缚不同深度嵌套的组件依靠它们能基于共享状态协同运作一处状态变更各处相关消费该状态的组件自动更新维持应用整体状态一致性。ObjectLink 功能聚焦于对象属性层面的变化追踪与同步。只要被观察对象的属性值出现变动与之绑定、添加此装饰器的 UI 组件立刻知晓随即更新展示内容精准呈现对象最新状态。协同搭配常规的对象操作逻辑当业务频繁更新对象属性时它保障 UI 与对象状态无缝衔接无需额外干预就能让相关 UI 与对象状态协同变化优化用户界面实时响应效果。Observerd 功能自动监测被修饰变量或对象的属性改变一旦发生变化迅速触发相关 UI 的更新流程让 UI 始终贴合数据最新情况实现数据驱动 UI 更新。协同融入整体数据处理与 UI 构建流程和其他改变数据的操作协同例如用户输入、后台数据推送确保数据更新瞬间UI 也能及时跟进维持数据与展示的连贯性。 StorageLink 功能它主要用于将组件内的状态与持久化存储相关联。当被标记的变量发生变化时不仅会更新 UI还会同步更新对应的存储数据保障数据的持久保存。例如在一个笔记应用里用户编辑笔记内容被 StorageLink 修饰的笔记文本变量每一次改动都会实时存入本地存储无惧意外关闭应用导致数据丢失。协同与本地存储模块紧密协作像是和鸿蒙系统的文件系统 API 配合一方面接收存储数据初始化组件状态另一方面持续推送状态更新让存储系统与应用内状态互为表里协同维护数据的完整性与即时性。 StorageProp 功能和 Prop 有相似之处不过它额外承担了存储功能。父组件传递给子组件的数据通过 StorageProp 修饰后子组件对该数据的修改除了反馈给父组件更新状态还会自动存储下来。这在配置类信息传递场景很实用比如一个主题切换设置从父组件传到子组件子组件调整后存好下次启动应用依然生效。协同整合父子组件交互流程与存储流程让跨组件的数据流通环节和持久化环节无缝对接降低开发者额外编写存储逻辑的负担促使组件交互与数据留存高效协同。 Watcher功能 当一个变量或者对象属性被标注为 Watcher它就进入了被 “监控” 状态。只要该变量或属性的值有所变动与之绑定的 UI 组件会立刻感知到这些变化从而触发对应的 UI 更新流程。这一机制让开发者能够轻松构建响应式的用户界面把数据的动态更新与 UI 的实时刷新紧密关联起来。例如在一个实时显示股票价格的鸿蒙应用中代表股价的变量添加上 Watcher股价数据从后台推送过来发生改变时对应的股价展示 UI 组件像是文本标签、走势图会马上更新显示最新价格。协同 和数据获取逻辑协同常与网络请求、本地数据读取等数据获取手段配合。后端源源不断推送新数据或是本地数据库数据更新被 Watcher 标记的数据接收新值随即驱动 UI 协同更新保障展示内容与最新数据同步。与组件生命周期协同在组件的生命周期各个阶段Watcher 持续发挥作用。从组件创建之初初始化数据到后续运行中数据的多次更迭无论组件处于活跃、暂停状态只要数据改变就能精准更新 UI维持组件状态与 UI 展示在全生命周期内的一致性。跟其他状态管理机制协同与 State、Prop 等装饰器共存时进一步细化状态管控。State 侧重于本地组件状态Prop 管理父子组件间数据传递Watcher 则专注于数据变化触发 UI 更新这一关键环节它们相互交织为复杂应用的精准状态管理筑牢根基。 Observed装饰器和ObjectLink装饰器使用场景 
Observed 和 ObjectLink 是 HarmonyOS 开发中用于处理嵌套对象或数组的数据同步装饰器。它们主要用于确保数据模型中的属性变化能够反映到视图上特别是在 dealing with nested objects or arrays。 
Observed 装饰器 Observed 用于修饰类它允许观察类的属性变化。这使得开发者可以在类的属性被修改时得到通知从而执行相应的操作如更新UI。以下是使用 Observed 的一个示例 
Observed
class Person {name: string;age: number;constructor(name: string, age: number) {this.name  name;this.age  age;}
}在这个例子中Person 类的 name 和 age 属性将被观察。当这些属性发生变化时由于 Person 类被 Observed 装饰所以这些变化会被自动同步到使用 Person 实例的组件中。 
ObjectLink 装饰器 ObjectLink 用于在父组件和子组件之间建立双向数据绑定。它通常与 Observed 联合使用以便将 Observed 装饰的类的实例传递给子组件并确保任何对类实例的修改都能反映到父组件和子组件的UI中。以下是使用 ObjectLink 的一个示例 
Component
struct MyPerson {ObjectLink person: Personbuild() {Column() {Text(姓名: $${this.person.name}).fontSize(20).fontWeight(FontWeight.Bold)Text(年龄: $${this.person.age}).fontSize(15).fontWeight(FontWeight.Regular)}}
}在这个例子中MyPerson 组件通过 ObjectLink 接收一个 Person 实例。这样任何对 Person 实例属性的修改都会导致UI的更新。 
通过这种方式Observed 和 ObjectLink 帮助开发者管理和同步复杂的数据结构简化代码 鸿蒙关系型数据库是哪个使用场景是什么 
鸿蒙操作系统中的关系型数据库是指基于SQLite组件实现的数据库管理系统。这种数据库管理系统提供了一套完整的本地数据库管理机制支持传统的增、删、改、查等操作并且能够执行用户自定义的SQL语句以应对更复杂的场景需求。 
主要功能和参数 
RdbStore 这是操作关系型数据库的核心接口通过这个接口可以执行各种数据库操作1。它需要三个参数context应用上下文、config数据库配置和callback回调函数。ResultSet 这是数据库查询结果的集合允许用户遍历和访问查询结果。RdbPredicates 用于定义数据库操作的条件1。 
使用场景 
复杂关系数据存储 适用于需要存储具有复杂关系的数据场景如学校的学生成绩或公司的员工信息2。这些数据不仅包括基本的信息如姓名、编号还可能涉及多种多样的关联信息如课程成绩、部门职位等。数据持久化 关系型数据库提供了强大的数据持久化能力能够确保数据的完整性和一致性特别适合需要高频更新和复杂查询的应用。 
注意事项 
在使用过程中建议单条数据不要超过2MB以确保数据的正确读取。大数据量查询时应尽量避免一次性查询过多数据建议不超过5000条并在TaskPool中执行此类操作以减少对应用性能的影响。 数据库增删改查的API 
鸿蒙操作系统为SQLite数据库的增删改查操作提供了以下API RdbStore接口  获取RdbStore getRdbStore(context: Context, config: StoreConfig, version: number, callback: AsyncCallbackRdbStore): void12 参数  context应用的上下文。config与此RDB存储相关的数据库配置12。version数据库版本。callback指定callback回调函数返回RdbStore对象12。说明 通过这个接口开发者可以获得一个RdbStore对象进而执行数据库的操作。这个接口从API版本7开始支持但已从API版本9起不再维护推荐使用新的relationalStore模块1。 relationalStore模块  获取RdbStore getRdbStore(context: Context, config: StoreConfig, callback: AsyncCallbackRdbStore): void2 参数  context应用的上下文。config与此RDB存储相关的数据库配置。callback指定callback回调函数返回RdbStore对象。说明 这是推荐使用的 newer API从API版本9开始支持。它允许开发者配置数据库操作的参数并通过回调获取操作结果。 relationalStore 的增删改查属性  insertSync insertSync(table: string, values: ValuesBucket, conflict?: ConflictResolution):number向目标表中插入一行数据。由于共享内存大小限制为2Mb因此单条数据的大小需小于2Mb否则会查询失败。 batchInsertSync batchInsertSync(table: string, values: ArrayValuesBucket):number向目标表中插入一组数据。 updateSync updateSync(values: ValuesBucket, predicates: RdbPredicates, conflict?: ConflictResolution):number根据RdbPredicates的指定实例对象更新数据库中的数据。由于共享内存大小限制为2Mb因此单条数据的大小需小于2Mb否则会查询失败。 deleteSync deleteSync(predicates: RdbPredicates):number根据RdbPredicates的指定实例对象从数据库中删除数据。 querySync querySync(predicates: RdbPredicates, columns?: Arraystring):ResultSet根据指定条件查询数据库中的数据。对query同步接口获得的resultSet进行操作时若逻辑复杂且循环次数过多可能造成freeze问题建议将此步骤放到taskpool线程中执行。 鸿蒙数据库支持事务吗?事务是用来解决什么问题的 
鸿蒙的数据库支持事务。 
事务主要用于解决数据库操作中的一系列复杂问题确保数据的完整性、可靠性与一致性具体如下 
原子性问题 场景设想一个在线购票系统当用户购买一张演出票时数据库需要执行多个操作比如减少对应场次的余票数量、将购票记录插入订单表、更新用户消费积分等。要是没有事务机制在执行部分操作后系统突然崩溃例如插入订单表成功了但余票数量没更新就会造成数据状态混乱。解决事务具备原子性将这一系列购票相关操作囊括其中它们被当作一个不可拆分的单元。要么所有操作都顺利完成要么只要其中一个环节出错整个事务就会回滚数据库状态恢复到事务开启前避免出现 “半吊子” 数据。一致性问题 场景在银行转账业务里从账户 A 转出一笔钱必须等额转入账户 B两边的账户余额总和要始终保持不变。若转账中途遭遇网络故障只扣了 A 账户的钱没能成功汇入 B 账户就打破了账户余额的一致性。解决事务把转账涉及的扣钱、转账操作绑定在一起成功执行完所有步骤才能提交事务让数据库状态更新要是过程中出现意外事务回滚维持账户数据的一致性。隔离性问题 场景多用户并发访问数据库的电商库存管理场景下多个管理员同时处理商品入库、出库事宜。如果没有隔离机制两个管理员同时读取某热门商品的库存数又各自基于读取到的数据去更新库存就容易导致库存数据错误后续订单分配也会混乱。解决事务设定不同的隔离级别通过隔离并发事务让每个事务执行时不受其他事务干扰。在高隔离级别下当一个事务正在操作库存数据时其他事务必须等待它完成避免并发冲突保证每个操作都基于准确的库存数据。持久性问题 场景对于关键业务数据录入如医院病历系统医生录入患者新的诊断信息这些数据必须永久保存。要是录入后不久发生系统崩溃数据丢失后续治疗就失去依据。解决事务一旦成功提交其对数据库所做的修改就具有持久性即使后续遭遇系统故障、重启数据也不会丢失因为数据库系统会运用日志、备份等机制保障已提交事务的数据安全落地。 navigation和router用过吗哪个用的多一点 
Navigation和Router都是HarmonyOS中用于实现页面路由的机制但它们在使用方式和提供的功能上有明显的差异。 
Navigation作为一种新的路由解决方案旨在提供更强大和灵活的功能。它允许开发者通过组件来构建页面支持共享元素的转场且没有路由数量限制。Navigation还支持嵌套在模态对话框中提供更高的自定义性如动效和属性设置。此外Navigation在性能上也优于Router因为它通过引用传递参数支持动态加载组件。 
Router则是一个较早的页面路由解决方案虽然仍然使用广泛但它的功能较为有限。Router支持通过URL地址进行页面跳转但每个应用的页面栈容量限制为32个页面。Router也不支持一些高级功能如共享元素动画和模态框中的路由嵌套。 
根据这些信息可以看出Navigation因为在功能性和性能上的优势可能会被更多地用于新的HarmonyOS应用开发中。然而Router由于其简洁性和与现有应用的兼容性可能仍会在一些旧的应用或特定场景下使用。 
总之选择哪个工具取决于具体的应用需求和开发者的偏好。建议在新的项目中优先考虑使用Navigation以利用其更多的功能和更好的性能。 navigation常用的生命周期 
其生命周期大致可分为三类自定义组件生命周期、通用组件生命周期和自有生命周期。其中aboutToAppear和aboutToDisappear是自定义组件的生命周期(NavDestination外层包含的自定义组件)OnAppear和OnDisappear是组件的通用生命周期。剩下的六个生命周期为NavDestination独有。 
aboutToAppear在创建自定义组件后执行其build()函数之前执行NavDestination创建之前允许在该方法中改变状态变量更改将在后续执行build()函数中生效。onAppear通用生命周期事件NavDestination组件挂载到组件树时执行。onWillAppearNavDestination创建后挂载到组件树之前执行在该方法中更改状态变量会在当前帧显示生效。onWillShowNavDestination组件布局显示之前执行此时页面不可见应用切换到前台不会触发。onShownNavDestination组件布局显示之后执行此时页面已完成布局。onWillHideNavDestination组件触发隐藏之前执行应用切换到后台不会触发。onHiddenNavDestination组件触发隐藏后执行非栈顶页面push进栈栈顶页面pop出栈或应用切换到后台。onWillDisappearNavDestination组件即将销毁之前执行如果有转场动画会在动画前触发栈顶页面pop出栈。onDisappear通用生命周期事件NavDestination组件从组件树上卸载销毁时执行。aboutToDisappear自定义组件析构销毁之前执行不允许在该方法中改变状态变量。 想获取navigation那个页面的栈需要在哪个生命周期获取用于页面跳转的哪个对象 
在HarmonyOS开发中获取页面栈是通过NavPathStack对象实现的这个对象是管理页面栈的核心。您可以通过以下方式获取页面栈的大小 
let size: number  this.pathStack.size();这里的pathStack是一个NavPathStack的实例它包含了所有页面的路径信息。您可以在需要进行页面跳转或在页面加载时获取这个信息以便于管理页面的状态和跳转。 
此外您可以通过NavPathStack对象进行页面的push、pop和其他操作这些操作都会影响到页面栈的状态。因此建议在页面的aboutToAppear或build方法中获取页面栈的信息这两个方法分别在页面即将显示和页面构建时被调用是获取页面栈的理想时机。 navigation怎么带参数跳转跳转页怎接收参数 
在鸿蒙HarmonyOS开发中通过Navigation组件传递参数通常涉及到两个方面设置跳转参数和在目标页面中接收这些参数。以下是具体的实现步骤 设置跳转参数  在跳转到另一个页面时你可以通过NavPathStack来传递参数。例如如果你从一个名为LoginPage的页面跳转到UserProfilePage可以在pushPath方法中设置参数如下所示 function pushPath(name, param, animated, onPop) {has.navPathStack.pushPath({name: name,param: param,animated: animated,onPop: onPop,callback: (err, res)  commonCallback(pushPath, err, res)});
}在这个例子中name是要跳转到的页面名称param是要传递的参数。  在目标页面中接收参数  当你在目标页面中需要使用这些参数时可以通过适当的方法来接收它们。这通常在目标页面的加载或初始化过程中完成例如在UserProfilePage中你可能会这样使用参数 function handleParams(params) {// 处理接收到的参数console.log(接收到的参数, params);
}通过上述步骤你可以在Navigation组件中有效地传递和接收参数从而实现更复杂的功能和页面交互。 
获取参数的方法 通过索引获取参数 你可以使用 getParamByIndex(index) 方法来获取指定索引的 NavDestination 页面的参数信息。例如如果你想要获取索引为1的页面参数可以使用以下代码 let param  this.pathStack.getParamByIndex(1);通过页面名获取参数 如果你知道页面的名字可以使用 getParamByName(name) 方法来获取所有名为 name 的 NavDestination 页面的参数信息1。例如如果页面名为 PageOne你可以这样获取它的参数 let params  this.pathStack.getParamByName(PageOne);  
这些方法允许你在导航过程中灵活地获取和管理页面参数从而实现复杂的功能组合和页面间的数据交互。 
通过这些方法你可以轻松地在页面之间传递和接收参数这对于维护页面的状态和实现复杂的导航逻辑非常有用。 git场景题假如我在一个分支上功能写了一半现在我需要去另一个分支写其他功能请问用哪个git命令可以解决这个问题 
暂存当前工作进度 执行 git stash 该命令会把当前工作区包括未提交的修改、暂存区新增内容等 的所有改动收集起来保存到一个类似栈的结构中让工作目录立刻变得干净仿佛从未做过这些修改一样。示例 
git stash切换分支 完成暂存后就可以安心使用 git checkout 命令切换到目标分支着手开发新功能。假设要切换到名为 new-branch 的分支命令如下 
git checkout new-branch恢复暂存的工作 当在新分支的工作告一段落想要回到之前未完成的功能分支接着开发时先切回原来的分支 
git checkout original-branch接着使用 git stash apply 把之前暂存的工作内容重新应用到当前工作区让之前未完成的工作状态得以恢复继续接着之前的进度开发 
git stash apply需要注意的是git stash apply 执行后暂存的内容并不会从栈里删除。要是想删除这个已经应用的暂存项可以额外执行 git stash drop要是想一步到位在应用的同时删除暂存内容就用 git stash pop 命令。 http和https的区别https为啥是安全的 
HTTP超文本传输协议和 HTTPS超文本传输安全协议主要有以下几方面区别 数据传输安全性 HTTP使用明文传输数据数据在网络传输过程中是以原始的文本格式呈现这就导致像用户名、密码、银行卡号这类敏感信息非常容易被网络中的第三方截获毫无保密性可言。HTTPS在传输层与应用层之间加入了 SSL/TLS 加密层所有传输的数据都会先进行加密处理变成密文接收方再用对应的密钥解密还原就算数据中途被截取第三方没有密钥也无法解读内容。端口使用 HTTP默认工作在 80 端口当我们在浏览器地址栏输入网址不特别指定端口号时浏览器就默认通过 80 端口去连接目标服务器发起 HTTP 请求。HTTPS常用的工作端口是 443同理访问 HTTPS 网站若不额外输入端口号浏览器自动从 443 端口尝试建立连接。性能开销 HTTP因为无需加密、解密操作传输过程相对简洁快速对服务器的计算资源占用较少数据传输效率更高。HTTPS加密和解密过程会消耗大量的服务器 CPU、内存资源尤其是在高并发场景下额外的运算负担会让响应时间有所延长性能开销明显更大。证书要求 HTTP不强制要求使用数字证书网站搭建部署更为简便直接小型个人站点常采用 HTTP 协议。HTTPS必须申请权威 CA 机构颁发的 SSL/TLS 数字证书以此证明服务器身份合法性证书申请、更新等流程增加了网站运维成本与复杂度。 
HTTPS 之所以安全核心在于它的加密机制与身份认证体系 
加密机制 混合加密结合了对称加密与非对称加密的优势。通信开始时客户端与服务器利用非对称加密公钥、私钥体系 来安全交换对称加密所需的密钥 后续大量的数据传输就采用运算速度更快的对称加密。例如客户端向服务器发起请求服务器把公钥发给客户端客户端利用公钥加密自己生成的对称密钥再传回给服务器之后双方就用这个对称密钥加密传输实际数据兼顾了安全性与传输效率。身份认证 数字证书服务器部署 SSL/TLS 数字证书证书里包含服务器的公钥以及服务器的身份信息诸如域名、组织等。客户端访问服务器时会验证证书真伪只有通过 CA 机构严格审核验证的合法证书客户端才会信任该服务器与之通信杜绝中间人伪装成合法服务器窃取数据的隐患防止遭遇钓鱼网站。 https是怎么加密的 
非对称加密与证书验证 
服务器发送证书客户端向服务器发起 HTTPS 连接请求后服务器会将包含自身公钥、域名、证书颁发机构、证书有效期等信息的数字证书发送给客户端。客户端验证证书客户端接收到证书后会验证证书的合法性包括检查证书是否由可信的证书机构颁发、证书是否在有效期内、证书中的域名与服务器的实际域名是否一致等。如果证书验证不通过客户端会中断连接如果验证通过则进入下一步。 
对称加密密钥协商 
客户端生成对称密钥客户端在本地生成一个随机数用作对称加密的密钥。客户端加密并发送密钥客户端取出证书中的公钥用该公钥对随机数进行加密将加密后的结果发送到服务端。服务端解密获取密钥服务端收到客户端发来的加密后的密钥先用自己的私钥解密得到对称密钥。 
数据加密传输 
使用对称密钥加密数据客户端和服务器使用协商好的对称密钥对传输的数据进行加密和解密。在数据传输过程中发送方将数据用对称密钥加密成密文后发送接收方收到密文后用相同的对称密钥进行解密还原出原始数据。 信息仅供参考如有更优方案欢迎评论谢谢