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

47.HarmonyOS NEXT 登录模块开发教程(二):一键登录页面实现

温馨提示:本篇博客的详细代码已发布到 git : https://gitcode.com/nutpi/HarmonyosNext 可以下载运行哦!

HarmonyOS NEXT 登录模块开发教程(二):一键登录页面实现

文章目录

  • HarmonyOS NEXT 登录模块开发教程(二):一键登录页面实现
    • 效果预览
    • 1. 引言
    • 2. DefaultLogin 组件概述
      • 2.1 组件功能
      • 2.2 组件结构
    • 3. DefaultLogin 组件实现
      • 3.1 完整代码
      • 3.2 状态变量解析
        • 3.2.1 @Link 装饰器
        • 3.2.2 @State 装饰器
        • 3.2.3 TransitionEffect
    • 4. UI 布局详解
      • 4.1 整体布局
      • 4.2 用户信息区域
    • 总结

效果预览

1. 引言

在上一篇教程中,我们介绍了 HarmonyOS NEXT 登录模块的整体架构和模态窗口的实现原理。本篇教程将深入讲解 DefaultLogin 组件的实现,这是登录模块中最核心的组件之一,负责提供默认的一键登录页面。

一键登录是现代移动应用中常见的登录方式,它能够简化用户的登录流程,提高用户体验。在 HarmonyOS NEXT 中,我们可以通过 ArkTS 语言和声明式 UI 框架,轻松实现一个功能完善的一键登录页面。

2. DefaultLogin 组件概述

2.1 组件功能

DefaultLogin 组件主要提供以下功能:

  1. 显示用户头像和欢迎信息
  2. 展示用户手机号(预设或从系统获取)
  3. 提供服务协议阅读和同意选项
  4. 实现一键登录按钮及其交互逻辑
  5. 提供其他登录方式的入口
  6. 支持返回按钮,控制模态窗口的显示/隐藏

2.2 组件结构

部分描述
状态变量控制组件内部状态和 UI 展示
DefaultLoginPage构建一键登录页面 UI 的 Builder 函数
build 方法组件的主要构建方法,处理页面切换逻辑

3. DefaultLogin 组件实现

3.1 完整代码

import promptAction from '@ohos.promptAction';
import { OtherWaysToLogin, ReadAgreement } from './OtherWaysToLogin';const EFFECT_DURATION = 800;
const EFFECT_OPACITY = 0.4;
const SPACE_TEN = 10;@Component
export struct DefaultLogin {/*** isPresentInLoginView控制登录页面是否显示* 子组件中被@Link装饰的变量与其父组件中@State装饰的对应数据源建立双向数据绑定,详见:* https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/arkts-link-0000001820999565*/@Link isPresentInLoginView: boolean;// 是否是默认一键登录方式@State isDefaultLogin: boolean = true;// 用户名userName: string = '18888888888';// 判断是否同意协议isConfirmed: boolean = false;private effect: TransitionEffect = TransitionEffect.OPACITY.animation({ duration: EFFECT_DURATION }).combine(TransitionEffect.opacity(EFFECT_OPACITY))// 默认一键登录方式@BuilderDefaultLoginPage() {Column({ space: SPACE_TEN }) {Row({ space: SPACE_TEN }) {Image($r('app.media.batman')).width($r('app.integer.modalwindow_user_image_height')).height($r('app.integer.modalwindow_user_image_height'))Column({ space: SPACE_TEN }) {Text($r('app.string.modalwindow_welcome_back')).fontWeight(FontWeight.Bold).fontSize($r('app.integer.modalwindow_font_size_mid')).fontColor(Color.Black)Text($r('app.string.modalwindow_more_wonderful_after_login')).fontColor($r('app.color.modalwindow_grey_3'))}.alignItems(HorizontalAlign.Start)}.alignItems(VerticalAlign.Center).width($r('app.string.modalwindow_size_full'))Text(this.userName).fontColor($r('app.color.modalwindow_grey_3')).fontWeight(FontWeight.Bold).padding({ left: $r('app.integer.modalwindow_padding_default') }).height($r('app.integer.modalwindow_user_image_height')).width($r('app.string.modalwindow_size_full')).borderRadius($r('app.integer.modalwindow_border_radius')).backgroundColor($r('app.color.modalwindow_grey_e'))Text($r('app.string.modalwindow_verify_server_tip')).fontColor($r('app.color.modalwindow_grey_6')).width($r('app.string.modalwindow_size_full')).textAlign(TextAlign.Start)Row() {Checkbox({ name: 'checkbox1' }).id('default_agreement').select(this.isConfirmed).onChange((value: boolean) => {this.isConfirmed = value})ReadAgreement()}.width($r('app.string.modalwindow_size_full')).alignItems(VerticalAlign.Center)Button($r('app.string.modalwindow_phone_start_login')).fontColor(Color.White).borderRadius($r('app.integer.modalwindow_border_radius')).type(ButtonType.Normal).backgroundColor($r('app.color.modalwindow_grey_2')).onClick(() => {if (this.isConfirmed) {// 调用Toast显示登录成功提示promptAction.showToast({ message: $r('app.string.modalwindow_login_success') });} else {// 调用Toast显示请先阅读并同意协议提示promptAction.showToast({ message: $r('app.string.modalwindow_please_read_and_agree') });}}).width($r('app.string.modalwindow_size_full')).height($r('app.integer.modalwindow_height_fifty'))Row() {Text($r('app.string.modalwindow_other_way_login')).fontColor($r('app.color.modalwindow_grey_7')).backgroundColor($r('app.color.modalwindow_transparent_7')).onClick(() => {this.isDefaultLogin = false;})Blank() // 在容器主轴方向上自动填充容器空余部分Text($r('app.string.modalwindow_login_problems')).fontColor($r('app.color.modalwindow_grey_7')).backgroundColor($r('app.color.modalwindow_transparent_7')).onClick(() => {// 调用Toast显示遇到问题提示promptAction.showToast({ message: $r('app.string.modalwindow_login_problems') });})}.width($r('app.string.modalwindow_size_full'))}.width($r('app.string.modalwindow_size_full')).height($r('app.string.modalwindow_size_full')).backgroundColor(Color.White).justifyContent(FlexAlign.Center)}build() {Stack({ alignContent: Alignment.TopStart }) {// 登录方式有两种(默认一键登录方式和其他方式登录),需要在一个模态窗口中切换,使用if进行条件渲染if (this.isDefaultLogin) {this.DefaultLoginPage() // 默认一键登录方式} else {OtherWaysToLogin()// 其他登录方式.transition(this.effect) // 此处涉及到组件的显示和消失,所以使用transition属性设置出现/消失转场}Image($r('app.media.arrow_back'))// 通过Stack组件,两个页面只实现一个back.id('login_back').width($r('app.integer.modalwindow_height_twenty_five')).height($r('app.integer.modalwindow_height_twenty_five')).margin({ top: $r('app.integer.modalwindow_margin_mid') }).onClick(() => {if (this.isDefaultLogin) {this.isPresentInLoginView = false;} else {this.isDefaultLogin = true}})}.expandSafeArea([SafeAreaType.SYSTEM], [SafeAreaEdge.BOTTOM]).size({ width: $r('app.string.modalwindow_size_full'), height: $r('app.string.modalwindow_size_full') }).padding({top: $r('app.integer.modalwindow_padding_default'),left: $r('app.integer.modalwindow_padding_default'),right: $r('app.integer.modalwindow_padding_default')}).backgroundColor(Color.White) // 将模态页面背景设置为白色,以避免模态页面内组件发生显隐变化时露出下层页面}
}

3.2 状态变量解析

在 DefaultLogin 组件中,我们定义了以下状态变量:

@Link isPresentInLoginView: boolean;
@State isDefaultLogin: boolean = true;
userName: string = '18888888888';
isConfirmed: boolean = false;
private effect: TransitionEffect = TransitionEffect.OPACITY.animation({ duration: EFFECT_DURATION }).combine(TransitionEffect.opacity(EFFECT_OPACITY))
变量名装饰器类型作用
isPresentInLoginView@Linkboolean与父组件建立双向数据绑定,控制模态窗口的显示/隐藏
isDefaultLogin@Stateboolean控制当前显示的是默认登录页面还是其他登录方式页面
userNamestring存储用户手机号,此处为预设值
isConfirmedboolean记录用户是否同意服务协议
effectprivateTransitionEffect定义页面切换时的转场效果
3.2.1 @Link 装饰器

@Link装饰器用于在父子组件之间建立双向数据绑定。在我们的例子中,DefaultLogin 组件通过@Link 装饰的 isPresentInLoginView 变量与 ModalWindowComponent 中的 isPresent 变量建立了双向绑定。

当 DefaultLogin 组件中修改 isPresentInLoginView 的值时,ModalWindowComponent 中的 isPresent 也会同步更新,反之亦然。这种机制使得子组件可以控制父组件中的状态,实现更灵活的组件通信。

3.2.2 @State 装饰器

@State装饰器用于声明组件的内部状态。当@State 装饰的变量值发生变化时,框架会自动重新渲染组件。在 DefaultLogin 组件中,isDefaultLogin 变量控制显示默认登录页面还是其他登录方式页面。

3.2.3 TransitionEffect

TransitionEffect 用于定义组件的转场效果。在 DefaultLogin 组件中,我们定义了一个组合转场效果,包括透明度变化和动画持续时间:

private effect: TransitionEffect = TransitionEffect.OPACITY.animation({ duration: EFFECT_DURATION }).combine(TransitionEffect.opacity(EFFECT_OPACITY))

这个转场效果会在默认登录页面和其他登录方式页面之间切换时应用,提供平滑的视觉过渡。

4. UI 布局详解

4.1 整体布局

DefaultLogin 组件的 UI 布局采用嵌套的容器组件实现,主要包括:

  1. 最外层使用 Stack 组件,实现页面切换和返回按钮的叠加布局
  2. 内部使用 Column 组件作为主要容器,垂直排列各个 UI 元素
  3. 使用 Row 组件实现水平排列的元素,如用户头像和欢迎信息

4.2 用户信息区域

让我详细讲解这段用户信息区域的代码:

Row({ space: SPACE_TEN }) {  // 创建水平布局,设置子元素间距为10// 1. 用户头像Image($r('app.media.batman'))  // 加载本地图片资源.width($r('app.integer.modalwindow_user_image_height'))  // 设置图片宽度.height($r('app.integer.modalwindow_user_image_height')) // 设置图片高度// 2. 欢迎信息区域Column({ space: SPACE_TEN }) {  // 创建垂直布局,子元素间距为10// 2.1 欢迎回来文本Text($r('app.string.modalwindow_welcome_back')).fontWeight(FontWeight.Bold)    // 设置字体粗细为粗体.fontSize($r('app.integer.modalwindow_font_size_mid'))  // 设置字体大小.fontColor(Color.Black)         // 设置字体颜色为黑色// 2.2 登录后更精彩提示文本Text($r('app.string.modalwindow_more_wonderful_after_login')).fontColor($r('app.color.modalwindow_grey_3'))  // 设置字体颜色为灰色}.alignItems(HorizontalAlign.Start)  // 将Column内的文本左对齐
}
.alignItems(VerticalAlign.Center)  // Row内的元素垂直居中对齐
.width($r('app.string.modalwindow_size_full'))  // 设置整个Row的宽度为100%

代码结构分析:

  1. 外层容器

    • 使用 Row 组件创建水平布局
    • space: SPACE_TEN 设置子元素间距为 10 像素
    • .alignItems(VerticalAlign.Center) 使子元素垂直居中
    • .width($r('app.string.modalwindow_size_full')) 使容器宽度占满父容器
  2. 头像部分

    • 使用 Image 组件显示用户头像
    • 通过 $r('app.media.batman') 引用本地图片资源
    • 使用资源引用设置宽高,保证在不同设备上的一致性
  3. 文字信息部分

    • 使用 Column 组件创建垂直布局
    • 包含两个 Text 组件:
      • 欢迎语:粗体显示,黑色
      • 提示语:使用灰色显示
    • .alignItems(HorizontalAlign.Start) 确保文本左对齐

布局效果:

  • 左侧显示圆形头像
  • 右侧垂直排列两行文本
  • 整体垂直居中对齐
  • 文本左对齐排列
  • 组件间保持统一的间距

总结

本文详细介绍了 HarmonyOS NEXT 登录模块中 DefaultLogin 组件的实现,主要包括以下几个方面:

  1. 组件架构设计

    • 采用 ArkTS 声明式开发范式
    • 使用装饰器(@Link、@State)管理组件状态
    • 实现页面间平滑切换的转场效果
  2. UI 布局实现

    • 使用 Stack、Column、Row 等布局组件构建界面
    • 运用资源引用($r)确保界面在不同设备上的一致性
    • 实现了用户信息展示、协议确认、登录按钮等核心功能
  3. 交互功能

    • 实现一键登录和其他登录方式的切换
    • 添加服务协议确认机制
    • 集成返回按钮和页面导航功能
  4. 最佳实践

    • 组件状态管理的规范使用
    • UI 布局的模块化设计
    • 代码复用和维护性的考虑

通过本教程,开发者可以了解如何在 HarmonyOS NEXT 中实现一个功能完整、交互友好的登录页面,同时掌握 ArkTS 组件开发的核心概念和最佳实践。这些知识和技能可以应用到其他类似的组件开发中,帮助开发者构建更好的 HarmonyOS 应用。

相关文章:

47.HarmonyOS NEXT 登录模块开发教程(二):一键登录页面实现

温馨提示:本篇博客的详细代码已发布到 git : https://gitcode.com/nutpi/HarmonyosNext 可以下载运行哦! HarmonyOS NEXT 登录模块开发教程(二):一键登录页面实现 文章目录 HarmonyOS NEXT 登录模块开发教程&#xff0…...

RAGFlow版本升级-Win10系统Docker

下载源码压缩包 https://github.com/infiniflow/ragflow.git 删除旧版本代码文件夹,把下载的代码解压到原先目录 更新一下env文件:ragflow/docker/.env 把值改为最新版本即可 RAGFLOW_IMAGEinfiniflow/ragflow:v0.17.1 更新一下docker docker compose -…...

dns劫持是什么?常见的劫持类型有哪些?如何预防?

DNS劫持的定义 DNS劫持(Domain Name System Hijacking)是一种网络攻击手段,攻击者通过篡改域名解析的过程,将用户对某个域名的访问请求重定向到错误或恶意的IP地址。这种攻击可能导致用户访问到钓鱼网站、恶意广告页面&#xff0…...

Python精进系列: isinstance 函数

Python isinstance函数:类型检查的得力助手 目录 Python isinstance函数:类型检查的得力助手引言一、isinstance函数基础语法结构简单示例 二、isinstance函数的应用场景函数参数类型检查数据处理与类型转换面向对象编程中的类型判断 三、isinstance函数…...

【基础知识】回头看Maven基础

版本日期修订人描述V1.02025/3/7nick huang创建文档 背景 项目过程中,对于Maven的pom.xml文件,很多时候,我通过各种参考、仿写,最终做出想要的效果。 但实际心里有些迷糊,不清楚具体哪个基础的配置所实现的效果。 今…...

练习题:81

目录 Python题目 题目 题目分析 需求理解 关键知识点 实现思路分析 代码实现 代码解释 运行思路 结束语 Python题目 题目 使用字典推导式创建一个字典,键为 1 到 10 的整数,值为键的平方。 题目分析 需求理解 本题要求使用 Python 的字典…...

三角函数:从宇宙法则到AI革命的数学密钥

——跨越三千年的数学语言与现代科技全景透视 一、数学本质:宇宙的波动密码 1.1 拓扑学视角下的三角函数 三角函数本质是单位圆上点的坐标参数化,其数学表达可抽象为: { x cos ⁡ θ ℜ ( e i θ ) y sin ⁡ θ ℑ ( e i θ ) \begin…...

【论文笔记】Best Practices and Lessons Learned on Synthetic Data for Language Models

论文信息 论文标题:Best Practices and Lessons Learned on Synthetic Data for Language Models 作者信息: Ruibo Liu, Jerry Wei, Fangyu Liu, Chenglei Si, Yanzhe Zhang, Jinmeng Rao, Steven Zheng, Daiyi Peng, Diyi Yang, Denny Zhou1 and Andre…...

Java高频面试之集合-10

hello啊,各位观众姥爷们!!!本baby今天来报道了!哈哈哈哈哈嗝🐶 面试官:详解红黑树?HashMap为什么不用二叉树/平衡树呢? 一、红黑树(Red-Black Tree&#xff…...

Keil 5 环境下STM32F4 HAL库版本MDK工程创建详细步骤(适合小白,附工程源码)

一、前期准备 1.安装好keil Keil(MDK) 5 软件安装教程-CSDN博客https://blog.csdn.net/qq_42748213/article/details/90485750 2.安装好STM32F4的芯片包 Keil5中STM32F4xx芯片包下载安装_stm32f4芯片包-CSDN博客https://blog.csdn.net/weixin_45783141/article/details/131…...

【微服务】Nacos 配置动态刷新(简易版)(附配置)

文章目录 1、实现方法2、配置依赖 yaml3、验证效果 1、实现方法 环境&#xff1a;Nacos、Java、SpringBoot等 主要是在boostrap.yaml中的data-id属性下配置refresh:true来实现动态更新 2、配置依赖 yaml 具体的版本参考官方的说明&#xff1a;官方版本说明 <!--读取boo…...

LabVIEW cRIO中CSV文件的读取

在LabVIEW cRIO中读取CSV文件&#xff0c;需通过文件传输、路径配置、数据解析等步骤实现。本文详细说明如何通过代码读取本地存储的CSV文件&#xff0c;并探讨直接通过对话框选择文件的可行性及替代方案。 一、CSV文件传输至cRIO本地存储 1. 使用NI MAX文件管理 步骤&#xf…...

双周报Vol.67: 模式匹配支持守卫、LLVM 后端发布、支持 Attribute 语法...多项核心技术更新!

2025-03-10 语言更新 模式匹配支持守卫&#xff08;Pattern Guard&#xff09; 模式守卫可以通过在模式后追加 if ... 的语法结构来指定。有模式守卫的分支只有在被模式匹配的值满足对应模式&#xff0c;并且模式守卫为真的情况下才会执行。如果模式守卫为假&#xff0c;则会…...

从青铜到王者:六大排序算法实战解析

前言 在编程的世界里,排序算法如同一颗璀璨的明珠,闪耀着智慧的光芒。它不仅是计算机科学的基础知识点,更是每一位程序员必备的技能。今天,就让我们一同走进排序算法的世界,深入探究冒泡排序、选择排序、插入排序、快速排序、归并排序、堆排序这六大经典算法的精髓所在,…...

011-base64

base64 编码 以下是C实现的Base64字符串加密算法及其原理说明&#xff0c;综合了多个技术文档的核心要点&#xff1a; 一、Base64编码原理 Base64是一种将二进制数据转换为ASCII字符的编码方式&#xff0c;核心原理基于 3字节转4字符 的转换规则&#xff1a; 分组规则&…...

汽车NVH诊断案例 | 纯电车急加速过大弯底盘异响

引言 失去发动机的掩蔽效应后&#xff0c;新能源电车的NVH问题&#xff0c;成为了困扰维修技师新难点。风噪、胎噪、电机高频啸叫等问题更容易车主识别&#xff0c;根源却难以被有效分辨。如何更精准且高效地识别电车NVH问题根源&#xff1f;今天分享的这个案例&#xff0c;内…...

springcloud gateway通过数据库获取路由信息

在 Spring Cloud Gateway 中结合 MyBatis 动态从数据库加载路由配置&#xff0c;可以实现灵活的路由管理。以下是详细实现步骤&#xff1a; 1. 数据库表设计 创建路由配置表 gateway_route&#xff1a; CREATE TABLE gateway_route (id varchar(50) NOT NULL COMMENT 路由唯一…...

QtDataVisualization使用

Qt Data Visualization 是一个开源的第三方库&#xff0c;它为Qt框架提供了高级的数据可视化功能。这个库允许开发者创建复杂的3D和2D图表&#xff0c;包括但不限于散点图、曲面图、条形图等。它基于Qt 3D模块&#xff0c;因此可以充分利用Qt 3D引擎的强大功能来呈现三维数据。…...

【Go每日一练】实现简单的控制台计算器

&#x1f47b;创作者&#xff1a;丶重明 &#x1f47b;创作时间&#xff1a;2025年3月7日 &#x1f47b;擅长领域&#xff1a;运维 目录 1.&#x1f636;‍&#x1f32b;️题目&#xff1a;简单的控制台计算器2.&#x1f636;‍&#x1f32b;️代码输出3.&#x1f636;‍&#…...

TDengine 数据对接 EXCEL

简介 通过配置使用 ODBC 连接器&#xff0c;Excel 可以快速访问 TDengine 的数据。用户可以将标签数据、原始时序数据或按时间聚合后的时序数据从 TDengine 导入到 Excel&#xff0c;用以制作报表整个过程不需要任何代码编写过程。 前置条件 准备以下环境&#xff1a; TDen…...

1.8 双指针专题:四数之和

1.题目链接 18. 四数之和 - 力扣&#xff08;LeetCode&#xff09;18. 四数之和 - 给你一个由 n 个整数组成的数组 nums &#xff0c;和一个目标值 target 。请你找出并返回满足下述全部条件且不重复的四元组 [nums[a], nums[b], nums[c], nums[d]] &#xff08;若两个四元组元…...

基于用户标签和协同过滤混合算法的商城推荐系统设计与实现

一、研究背景 随着电子商务的快速发展&#xff0c;用户面对海量商品时往往面临“信息过载”问题。传统的推荐算法&#xff08;如协同过滤&#xff09;在用户行为数据稀疏或新用户场景下存在冷启动、推荐多样性不足等缺陷。 现状与挑战&#xff1a; 协同过滤&#xff1a;依赖用…...

软件版本号设计

软件版本号的设计是软件开发中的重要环节&#xff0c;它不仅帮助开发团队管理代码&#xff0c;还能让用户清楚地了解软件的更新状态。以下是常见的版本号设计方法和最佳实践&#xff0c;供你参考&#xff1a; 1. 常见的版本号设计规范 语义化版本控制&#xff08;Semantic Ver…...

ESMFold对决AlphaFold:蛋白质-肽相互作用预测的新进展

今天向大家介绍的这篇文章题目为&#xff1a;“Protein−Peptide Docking with ESMFold Language Model”&#xff0c;近期发表在JCTC上。 本文主要研究 ESMFold 语言模型在蛋白质-肽对接中的应用。通过探索多种对接策略&#xff0c;评估其在预测蛋白质-肽相互作用方面的性能&a…...

【项目】负载均衡式在线OJ

负载均衡式在线OJ 目录 负载均衡式在线OJ 1.项目介绍&#xff1a; 2.comm 2.1 log.hpp 日志等级 开放式日志 时间戳工具 2.2 util.hpp TimeUtil类 PathUtil类 FileUtil类 StringUtil类 3.Compile_server 3.1compile_run.hpp RemoveTempFile CodeToDesc Start 3.…...

Android启动速度优化

Android启动速度优化 一、应用启动基础知识 1.1 启动类型 Android应用的启动类型主要分为三种: 冷启动(Cold Start):应用进程不存在,系统需要创建新的进程,加载并启动应用。这是最耗时的启动方式。 温启动(Warm Start):应用进程存在,但Activity可能被销毁,需要重新创…...

python爬虫碰到IP被封的情况,如何解决?

在数据抓取和爬虫开发的实践中&#xff0c;Python作为一种功能强大且易于上手的编程语言&#xff0c;被广泛应用于网络数据的采集。然而&#xff0c;随着网络环境的日益复杂&#xff0c;爬虫活动也面临着越来越多的挑战&#xff0c;其中IP被封便是常见且棘手的问题。IP被封不仅…...

Web网页制作(静态网页):千年之恋

一、是用的PyCharm来写的代码 二、代码中所用到的知识点&#xff08;无 js&#xff09; 这段HTML代码展示了一个简单的注册页面&#xff0c;包含了多个HTML元素和CSS样式的应用。 这段HTML代码展示了一个典型的注册页面&#xff0c;包含了常见的HTML元素和表单控件。通过CSS样…...

mac安装mysql之后报错zsh: command not found: mysql !

在Mac上安装MySQL后&#xff0c;如果终端中找不到mysql命令&#xff0c;通常是 因为MySQL的命令行工具&#xff08;如mysql客户端&#xff09;没有被正确地添加到你的环境变量中。 检查 MySQL 是否已安装 ps -ef|grep mysql查看到路径在 /usr/local/mysql/bin 查看 .bash_pro…...

Spring Boot 启动失败:Failed to start bean ‘documentationPluginsBootstrapper’ 解决方案

文章目录 1. 问题描述 &#x1f3af;2. 可能原因分析 &#x1f50d;原因 1&#xff1a;SpringFox 版本与 Spring Boot 版本不兼容 ❌✅ 解决方案&#xff1a;添加兼容性配置&#xff08;首选&#xff01;&#xff01;&#xff01;&#xff01;&#xff09; 原因 2&#xff1a;S…...

Python Cookbook-3.16 查看汇率

任务 想周期性地(用 crontab 或者 Windows计划任务来运行某 Python 脚本)从 Web 获取数据&#xff0c;监视某两种货币之间的兑换比例&#xff0c;并在两者之间的汇率达到某个值时发送提醒邮件。 解决方案 这个任务和一系列的从 Web 获取数据的监控任务很类似&#xff0c;它们…...

Manus(一种AI代理或自动化工具)与DeepSeek(一种强大的语言模型或AI能力)结合使用任务自动化和智能决策

一、Manus与DeepSeek差异 十分好奇DeepSeek和Manus究竟谁更厉害些&#xff0c;DeepSeek是知识型大脑&#xff0c;Manus则是全能型执行者。即DeepSeek专注于语言处理、知识整合与专业文本生成。其核心优势在于海量参数支持的深度学习和知识推理能力&#xff0c;例如撰写论文、润…...

Redis存数据就像存钱:RDB定期存款 vs AOF实时记账

Redis持久化 ◆ 核心概念1. ◆ 持久化全景图2. ◆ 生产环境黄金法则 ◆ RDB深度优化1. ◆ 生产配置精要2. ◆ 高级触发场景3. ◆ 故障应急方案 ◆ AOF深度解析1. ◆ 7.0版本革命性改进2. ◆ 同步策略深度测试3. ◆ 重写过程优化 ◆ 混合持久化实战1. ◆ 配置示例2. ◆ 数据恢复…...

【从零开始学习计算机科学】编译原理(一)编译过程概述

【从零开始学习计算机科学】编译原理(一)编译过程概述 绪论编译过程概述词法分析语法分析代码优化代码生成其他功能编译器的前端和后端绪论 什么叫编译程序?为什么我们需要编译程序?编译程序就是一个程序,将便于人编写、阅读、维护的高级计算机语言所写作的源代码程序,翻…...

第十八:go 并发 goroutine

channel 可以让多个goroutine 之间实现通信 Add方法调用时机&#xff1a;必须在goroutine 启动之前调用Add方法来增加计数器的值。 如果在goroutine已经启动之后再调用Add&#xff0c;可能会导致Wait方法提前返回&#xff0c;因为计数器没有正确反映正在运行的goroutine的数量…...

基于QGIS的二次开发(四):矢量编辑与属性表操作

一、实验目的 本次实验续接上一次的实验内容&#xff0c;旨在通过设计与开发地理信息系统的过程&#xff0c;加深学生对地理信息系统的理解&#xff0c;并掌握相关的设计与开发技能&#xff0c;包括熟悉地理信息系统的设计与开发流程&#xff0c;加强对 MVC 软件设计模式的理解…...

AI日报 - 2025年3月13日

&#x1f31f; 今日概览&#xff08;60秒速览&#xff09; ▎&#x1f916; AGI突破 | Reka开源21B参数推理模型Flash 3&#xff0c;推出企业智能平台Nexus &#x1f52c; 模型采用RLOO方法结合模型与规则基础奖励&#xff0c;实现高效推理 ▎&#x1f4bc; 商业动向 | Waymo在…...

lua C语言api学习1 编译第一个程序

本文开始进行lua C语言api的学习 1 简介 lua语言与C语言使用还是很紧密,以前我只是学习lua语言比较多,C语言api部分了解比较少,最近在学习tcc编译器的使用进一步学习一下lua C语言api的使用。 2 配置编译环境 首先需配置好tcc编译器环境[参考],再配置好lua源码路径[参考],新…...

【物联网-WIFI】

物联网-WIFI ■ ESP32-C3-模块简介■ ESP32-C3-■ ESP32-C3-■ WIFI-模组■ WIFI-■ WIFI- ■ ESP32-C3-模块简介 ■ ESP32-C3- ■ ESP32-C3- ■ WIFI-模组 ■ WIFI- ■ WIFI-...

在MATLAB中实现PID控制仿真

在MATLAB中实现PID控制仿真可以通过代码编程或Simulink图形化建模两种方式完成。以下是两种方法的详细操作步骤和示例&#xff1a; 方法1&#xff1a;使用MATLAB脚本编程&#xff08;基于控制系统工具箱&#xff09; 步骤1&#xff1a;定义被控对象的数学模型 假设被控对象是…...

C#实现本地Deepseek模型及其他模型的对话v1.4

前言 系 统&#xff1a;Window11 开发工具&#xff1a;Visual Studio 2022 相关技术&#xff1a;C# 、WPF .Net 8.0 1、C#实现本地AI聊天功能 WPFOllamaSharpe实现本地聊天功能,可以选择使用Deepseek 及其他模型。 新增根据聊天记录回复的功能。 优化了部分ViewModel&#xff…...

用sphinx-doc整理文档#2

上一篇博客&#xff1a;用sphinx-doc整理文档 回头看&#xff0c;上一篇博客已经是18年的事情了。最近我又开始维护起18年的项目了。最近策划同事提了一些需求。我又改进了一波&#xff0c;所以有本文。 sphinx支持导出pdf sphinx本身是支持导出pdf的&#xff0c;命令如下&am…...

DBeaver部分操作指南(数据库连接,构造ERD图,格式化SQL)

详细步骤指导如何使用DBeaver来连接到数据库&#xff1a; 步骤 1: 下载并安装 DBeaver 如果还没有安装DBeaver&#xff0c;请访问DBeaver官网下载适合操作系统的版本&#xff0c;并按照指示完成安装。 步骤 2: 启动 DBeaver 安装完成后&#xff0c;启动DBeaver应用程序。 …...

十种处理权重矩阵的方法及数学公式

1. 权重归一化&#xff08;Weight Normalization&#xff09; 目的&#xff1a;通过分离权重向量的范数和方向来加速训练。公式&#xff1a;对于权重向量 w \mathbf{w} w&#xff0c;归一化后的权重 w ′ \mathbf{w} w′ 为&#xff1a; w ′ w ∥ w ∥ \mathbf{w} \frac{…...

姚安娜新剧瘦了一圈,《仁心俱乐部》急诊医生顾诗宜在线上岗

《仁心俱乐部》在芒果 TV 播出&#xff0c;湖南卫视金鹰独播剧场也随之播出&#xff0c;这一剧集受到了不少观众的关注。姚安娜在剧中饰演的急诊科医生顾诗宜&#xff0c;她为患者检查身体时动作娴熟&#xff0c;与患者沟通时展现出的耐心和专注&#xff0c;都展现出很高的专业…...

postgresql源码安装

步骤 1: 安装依赖 在开始之前&#xff0c;请确保您的系统上安装了编译 PostgreSQL 所需的依赖包。使用以下命令安装必要的软件包&#xff1a; 对于 Debian/Ubuntu 系统&#xff1a; sudo apt update sudo apt install build-essential libreadline-dev zlib1g-dev flex biso…...

【51单片机】程序实验15.DS18B20温度传感器

主要参考学习资料&#xff1a;B站【普中官方】51单片机手把手教学视频 开发资料下载链接&#xff1a;http://www.prechin.cn/gongsixinwen/208.html 单片机套装&#xff1a;普中STC51单片机开发板A4标准版套餐7 目录 DS18B20介绍主要特性内部结构控制时序初始化时序写时序读时序…...

Java 集合框架:数据管理的强大工具

Java集合框架&#xff1a;数据管理的强大工具 目录 Java集合框架&#xff1a;数据管理的强大工具引言一、Set集合1. 定义与特点2. 常用实现类 - HashSet创建方式常用方法遍历方式 二、Map集合1. 定义与特点2. 常用实现类 - HashMap创建方式常用方法遍历方式 三、List集合1. 定义…...

AIM-T500绝缘监测仪:实时监测,确保IT系统绝缘安全-安科瑞 蒋静

在现代工业生产中&#xff0c;电力系统的稳定性和安全性至关重要。电力系统的绝缘状况直接关系到设备的正常运行和人员的安全。为了确保IT配电系统&#xff08;不接地系统&#xff09;的绝缘状况始终处于好的状态&#xff0c;安科瑞电气股份有限公司推出了AIM-T500绝缘监测仪&a…...

css3-学习

css 特性 选择器 基础选择器 标签选择器 ID 选择器 类选择器 CSS 的优先级是什么&#xff1f; !important > 内联样式(style“”) > ID 选择器 > 类选择器 属性选择器 伪类 > 标签选择器 伪元素选择器。 层级选择器 foo bar 后代选择器&#xff0c;元素的…...