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

怎么在 React Native 应用中处理深度链接?

深度链接是一种技术,其中给定的 URL 或资源用于在移动设备上打开特定页面或屏幕。因此,深度链接可以引导用户到应用程序内的特定屏幕,而不仅仅是启动移动设备上的应用程序,从而提供更好的用户体验。这个特定的屏幕可能位于一系列层次结构页面下,因此称之为"深度"链接。

它对于营销活动,应用用户保留等非常有用。作为一个应用用户,你可能在打开链接时体验过深度链接,例如,从网页浏览器打开电子商务商店中的产品链接。如果你已经安装了该商店的应用,它可能会使用深度链接来打开应用,并直接导航你到该产品的屏幕。

在本教程中,让我们通过创建一个示例应用来学习如何在 React Native 应用中处理深度链接。我们将创建一个简单的应用来处理深度链接,并通过使用 React Navigation 库来配置深度链接。可以在此 GitHub 仓库中找到本教程的完整代码。

开始之前,介绍一下​最近很火的开源技术,低代码。让使用者可以通过可视化的方式,以更少的编码,更快速地构建和交付应用软件,极大程度地降低了软件的开发、配置、部署和培训成本。

应用地址: https://www.jnpfsoft.com
开发语言:Java/.net

这是一个基于 Java Boot/.Net Core 构建的简单、跨平台快速开发框架。前后端封装了上千个常用类,方便扩展;采用微服务、前后端分离架构,集成了代码生成器,支持前后端业务代码生成,满足快速开发;框架集成了表单、报表、图表、大屏等各种常用的 Demo 方便直接使用;后端框架支持 Vue2、Vue3,平台即可私有化部署,也支持 K8S 部署。话不多说,开始吧!

深度链接配置 React Native 应用中的导航

我们从创建一个新的 React Native 应用程序开始。首先,打开终端并运行以下命令:

npx react-native init rnDeepLinking# after the project is generated by the above command
# navigate to the rnDeepLinking directory
cd rnDeepLinking

在本教程中,您将构建的示例应用将包含两个屏幕。第一个屏幕将是带有物品列表的主屏幕。第二个屏幕将是显示物品详细信息的详细信息屏幕。

我们配置 React Navigation 版本 6 并安装所需的依赖项。这将允许通过导航配置深度链接,并在两个屏幕之间进行导航。

yarn add @react-navigation/native @react-navigation/native-stack react-native-screens react-native-safe-area-context

下一步是链接您刚刚安装的所有库。此示例应用程序使用的是 0.67.x 版本的 React Native。

在 iOS 设备上,必须运行以下一组命令。

npx pod-install ios

对于 Android,打开文件 android/app/src/main/java/<您的 React Native 项目名称>/MainActivity.java 并添加以下代码片段:

package com.rndeeplinking;import android.os.Bundle;
import com.facebook.react.ReactActivity;public class MainActivity extends ReactActivity {/*** Returns the name of the main component registered from JavaScript. This is used to schedule* rendering of the component.*/@Overrideprotected String getMainComponentName() {return "rnDeepLinking";}@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(null);}
}

这就是在一个裸露的 React Native 应用中配置 React Navigation 库所需的全部内容。

注意:在裸露的 React Native 项目中配置 React Navigation 库的过程可能会改变。建议按照官方文档的指示进行操作。

创建主页和详情屏幕

创建一个名为 src/screens 的新目录。这将包含应用程序的所有屏幕组件。在其中,创建两个新文件:HomeScreen.js 和 DetailsScreen.js

HomeScreen.js 文件从 Json 占位符 API 的模拟数据数组中显示一份人员名单。该列表使用 React Native 的 FlatList 组件进行渲染。

每个列表中的人都被 Pressable 组件包裹,这样当应用用户按下列表中的用户名称时,他们将导航到详情屏幕。

// src/screens/HomeScreen.jsimport React, { useState, useEffect } from 'react';
import {ActivityIndicator,View,Text,FlatList,Pressable
} from 'react-native';import Separator from '../components/Separator';const HomeScreen = ({ navigation }) => {const [data, setData] = useState([]);const [isLoading, setIsLoading] = useState(true);useEffect(() => {fetch('https://jsonplaceholder.typicode.com/users').then(res => res.json()).then(res => {setData(res);setIsLoading(false);}).catch(error => {console.log(error);});}, []);const renderList = ({ item }) => {return (<PressableonPress={() => alert('Navigate to Details screen')}style={{ paddingHorizontal: 10 }}><Text style={{ fontSize: 24, color: '#000' }}>{item.name}</Text></Pressable>);};return (<View style={{ flex: 1 }}>{isLoading ? (<ActivityIndicator color="blue" size="large" />) : (<><FlatListdata={data}contentContainerStyle={{paddingVertical: 20}}keyExtractor={item => item.id}ItemSeparatorComponent={Separator}renderItem={renderList}/></>)}</View>);
};export default HomeScreen;

我们也在 src/components 目录中创建一个新文件,命名为 Separator.js。这个文件包含一个<Separator />组件,用于在 HomeScreen 中划分列表项。 <Separator />组件是一个带有一些附加样式的简单视图。

它被用作 FlatList 组件中 prop ItemSeparatorComponent 的值。 ItemSeparatorComponent prop 定义了一个自定义分隔符,并在列表中的每个项目之间渲染。

/ src/components/Separator.jsimport React from 'react';
import { View } from 'react-native';const Separator = () => (<Viewstyle={{borderBottomColor: '#d3d3d3',borderBottomWidth: 1,marginTop: 10,marginBottom: 10}}/>
);export default Separator;

对于详细信息屏幕,现在,让我们只在屏幕组件文件 DetailsScreen.js 中显示一个文本字符串:

import React from 'react';
import { View, Text } from 'react-native';const DetailsScreen = ({ navigation }) => {return (<View style={{ flex: 1, justifyContent: 'center', alignItems: 'center' }}><Text>Details Screen</Text></View>);
};export default DetailsScreen;
设置堆栈导航器

要在应用中设置堆栈导航器,请创建一个名为 src/navigation/RootNavigator.js 的新文件,并添加以下代码片段:

/ src/navigation/RootNavigator.jsimport * as React from 'react';
import { NavigationContainer } from '@react-navigation/native';
import { createNativeStackNavigator } from '@react-navigation/native-stack';import HomeScreen from '../screens/HomeScreen';
import DetailsScreen from '../screens/DetailsScreen';const RootStack = createNativeStackNavigator();const RootNavigator = () => {return (<NavigationContainer><RootStack.Navigator><RootStack.Screen name="Home" component={HomeScreen} /><RootStack.Screen name="Details" component={DetailsScreen} /></RootStack.Navigator></NavigationContainer>);
};export default RootNavigator;

然后,在 App.js 文件中导入 RootNavigator

// App.jsimport React from 'react';import RootNavigator from './src/navigation/RootNavigator';const App = () => {return <RootNavigator />;
};export default App;

要构建并运行该应用,打开两个终端窗口实例。在第一个实例中,运行 npx react-native start。这将启动 React Native 打包器。

要为 iOS 或 Android 构建应用程序,请在终端窗口的第二个实例中运行适当的命令。这将为你指定的平台构建应用程序。

# for iOS
npx react-native run-ios# for android
npx react-native run-android

一旦应用程序构建完成,上述命令将会在指定平台上安装它。以下是该应用程序在 iOS 模拟器和真实 Android 设备上运行的示例:

image.png

在 React Navigation 中配置深度链接

在 React Native 应用程序中处理深度链接有两种方法:

  • 无需导航:通过 JavaScript 调用 React Native 的核心库并直接调用 Linking。您可以在 React Native 的官方文档中了解更多关于此的信息。
  • 通过配置 React Navigation 库进行导航

大多数生产级应用程序都有多个屏幕和嵌套的导航器。所以,让我们看看如何在我们的示例应用中使用 React Navigation 来实现它。

要允许 React Navigation 库通过其路由逻辑处理深度链接,需要定义一个配置对象。在此对象中,定义一个包含 URI 方案的前缀属性。应用程序是基于此 URI 方案打开的。

然后,将此配置对象传递给 NavigationContainer 上名为 linking 的 prop。另外,在容器上添加一个 fallback prop。它将渲染并显示加载指示器,直到深层链接被解析。

// src/navigation/RootNavigator.js// rest of the import statement remains same
import { ActivityIndicator } from 'react-native';const linking = {prefixes: ['peoplesapp://']
};const RootNavigator = () => {return (<NavigationContainerlinking={linking}fallback={<ActivityIndicator color="blue" size="large" />}><RootStack.Navigator><RootStack.Screen name="Home" component={HomeScreen} /><RootStack.Screen name="Details" component={DetailsScreen} /></RootStack.Navigator></NavigationContainer>);
};

使用 URI-scheme 包来配置 URI 方案

而不是手动设置 iOS 和 Android 的 URI 方案,可以使用 uri-scheme npm 包。它允许在 iOS 和 Android 设备上配置和测试本地 URI 方案。

注意:如果您想深入研究并手动为 iOS 和 Android 设置 URI 方案,请查看接下来的两个部分。

要设置该方案,请为适当的平台运行以下命令:

# for iOS
npx uri-scheme add peoplesapp --ios# for Android
npx uri-scheme add peoplesapp --android

完成此步骤后,请确保使用 npx react-native run-ios 或 npx react-native run-android 再次为特定平台构建应用程序。

iOS 配置方案

要手动为 iOS 设备设置方案,请打开 ios/your-project-name/AppDelegate.m 文件并添加以下代码片段:

/ Add the header at the top of the file:
#import <React/RCTLinkingManager.h>// Add this above `@end`:
- (BOOL)application:(UIApplication *)applicationopenURL:(NSURL *)urloptions:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options
{return [RCTLinkingManager application:application openURL:url options:options];
}

现在,让我们将 URI 方案添加到 iOS 项目配置中。打开 Xcode 中的 Your-app-name/ios/app-name.xcworkspace

然后,在左侧边栏中选择项目名称,然后导航到信息选项卡:

image.png

接下来,转到 URL Types,点击+(加号)按钮,在标识符和 URL 方案下,添加 peoplesapp

image.png

URL Types 与 web URL 中的 http 表示的类似。这是 iOS 用来打开应用程序的内容。

在此配置步骤之后,使用 npx react-native run-ios 重新构建您的 iOS 应用程序。

为 Android 配置方案

要为 Android 设备手动设置方案,您需要配置该方案。打开/android/app/src/main/AndroidManifest.xml 并将 launchMode 的值设置为 singleTask。要添加方案,请按照下面的示例添加一个新的 intent-filter 标签:

<!-- Set the launchMode to singleTask in <activity> -->
<activityandroid:name=".MainActivity"android:label="@string/app_name"android:configChanges="keyboard|keyboardHidden|orientation|screenSize|uiMode"android:launchMode="singleTask"android:windowSoftInputMode="adjustResize"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="android.intent.category.LAUNCHER" /></intent-filter><!-- Add this new intent-filter tag --><!-- Make sure to set the value of android:scheme to your own scheme --><intent-filter><action android:name="android.intent.action.VIEW" /><category android:name="android.intent.category.DEFAULT" /><category android:name="android.intent.category.BROWSABLE" /><data android:scheme="peoplesapp" /></intent-filter>
</activity
>

在此配置步骤之后,使用 npx react-native run-android 重新构建您的 Android 应用。

测试 iOS 应用程序

然后,在终端窗口中,运行以下命令:

# replace peoplesapp:// with your own URL
xcrun simctl openurl booted peoplesapp://# OR use uri-scheme package to test
npx uri-scheme open peoplesapp:// --ios

这将打开示例应用程序:

也可以通过在模拟器设备上打开网络浏览器并运行 URL peoplesapp://来测试它。它将询问您是否打开外部 URI,如下所示:

测试安卓应用程序

为了测试到目前为止的配置设置,我正在使用一个真实的 Android 设备。您也可以使用 Android 模拟器。在测试之前,请确保如果示例应用程序已经在运行,要关闭它。

从终端窗口,运行以下命令:

# replace peoplesapp:// with your own URL
adb shell am start -W -a android.intent.action.VIEW -d "peoplesapp://"# OR use uri-scheme package to test
npx uri-scheme open peoplesapp:// --android

运行上述命令后的输出如下:

嵌套屏幕配置

要在访问具有 URL 方案的详细信息屏幕时显示每个人的信息,必须配置详细信息屏幕的路径,并添加一个代表列表中人员 id 的动态参数。

const linking = {prefixes: ['peoplesapp://'],config: {initialRouteName: 'Home',screens: {Home: {path: 'home'},Details: {path: 'details/:personId'}}}
}

personId 现在可以作为路由参数在详情屏幕上使用。路由参数可以通过 React Navigation 库的 route.params 在屏幕上访问。

根据 personId 的值,详情屏幕将从 API 获取数据并显示该人的信息。

我们也处理一种情况,即应用程序用户从主屏幕导航到详情屏幕,也就是说,不使用链接。在这种情况下,打开 HomeScreen.js 并替换 Pressable 组件上的 onPress 属性值,如下所示:

<PressableonPress={() => navigation.navigate('Details', { personDetailsId: item.id })}style={{ paddingHorizontal: 10 }}
><Text style={{ fontSize: 24, color: '#000' }}>{item.name}</Text>
</Pressable>

请注意,personDetailsId 是传递给上述片段中的 Details 屏幕的路由参数。只有当用户从主屏幕导航到 Details 屏幕时,才会获取某人的详细信息。

在详细信息屏幕中,我们从 route.params 对象中获取 personDetailsId(来自主屏幕的 id)和 personId(从 URL 方案中使用的 id)。

然后使用 useEffect 钩子,从 Json Placeholder API 获取数据并渲染详细信息:

import React, { useState, useEffect } from 'react';
import { View, Text, ActivityIndicator } from 'react-native';const DetailsScreen = ({ route }) => {const params = route.params || {};const { personDetailsId, personId } = params;const [data, setData] = useState([]);const [isLoading, setIsLoading] = useState(true);useEffect(() => {if (personId) {fetch(`https://jsonplaceholder.typicode.com/users/${personId}`).then(res => res.json()).then(res => {const fetchedDetails = [];Object.keys(res).forEach(key => {fetchedDetails.push({ key, value: `${res[key]}` });});setData(fetchedDetails);setIsLoading(false);}).catch(error => {console.log(error);});} else {fetch(`https://jsonplaceholder.typicode.com/users/${personDetailsId}`).then(res => res.json()).then(res => {const fetchedDetails = [];Object.keys(res).forEach(key => {fetchedDetails.push({ key, value: `${res[key]}` });});setData(fetchedDetails);setIsLoading(false);}).catch(error => {console.log(error);});}}, []);return (<View style={{ flex: 1 }}>{isLoading ? (<ActivityIndicator color="blue" size="large" />) : (<View style={{ paddingTop: 10, paddingHorizontal: 10 }}>{data.map(person => (<Textstyle={{ fontSize: 24, paddingBottom: 2 }}key={person.key}>{`${person.key}: ${person.value}`}</Text>))}</View>)}</View>);
};export default DetailsScreen;

通过从列表中按下某人的名字从主页导航到详细信息屏幕时,这是输出:

使用 URL 方案时的输出如下:

总结

现在已经完成了一个使用 React Navigation 库处理深度链接的 React Native 应用程序的演示

深度链接可以显著改善您的移动应用的用户体验,并使搜索引擎提供上下文敏感的搜索和结果。希望这个指南能帮助你在你的应用中取得优秀的成果。

相关文章:

怎么在 React Native 应用中处理深度链接?

深度链接是一种技术&#xff0c;其中给定的 URL 或资源用于在移动设备上打开特定页面或屏幕。因此&#xff0c;深度链接可以引导用户到应用程序内的特定屏幕&#xff0c;而不仅仅是启动移动设备上的应用程序&#xff0c;从而提供更好的用户体验。这个特定的屏幕可能位于一系列层…...

el-table自动滚动到最底部

我的需求是这样的&#xff0c;因为我的表格是动态的&#xff0c;可以手动新增行&#xff0c;固定表头&#xff0c;而且需要一屏显示&#xff0c;为了方便用户就需要再新增的时候表格自动向上滚动。 差了官方文档后发现有一个属性可以支持 这个属性正是自己需要的&#xff0c;所…...

小白零基础学数学建模系列-引言与课程目录

目录 引言一、我们的专辑包含哪些内容&#xff1f;第一周&#xff1a;数学建模基础与工具第二周&#xff1a;高级数学建模技巧与应用第三周&#xff1a;机器学习基础与数据处理第四周&#xff1a;监督学习与无监督学习算法第五周&#xff1a;神经网络 二、学完本专辑能收获到什…...

Integer类型比较是 == 还是equals()

在Java编程中&#xff0c;判断两个Integer对象是否相等时&#xff0c;我们经常遇到使用和equals()方法的选择问题。这两个操作符和方法在判断对象相等性时有所不同&#xff0c;理解它们的区别对于编写健壮的代码至关重要。 使用判断Integer相等性 在Java中&#xff0c;操作符…...

七夕情人节送什么礼物?看完这篇你就知道了

在这个充满爱意的时刻&#xff0c;送上一份精心挑选的礼物&#xff0c;不仅能表达你的爱意&#xff0c;更能加深彼此之间的情感联系。然而&#xff0c;选择一份合适的情人节礼物并非易事&#xff0c;因为每个人都有其独特的需求和喜好。如果你还在为情人节送什么礼物而纠结&…...

让B站直接变成一个纯粹的音乐平台的简单小方法

可能在大多数人眼里&#xff0c;B站就是一个内容丰富的高质量视频平台 但实际上B站还是一个“音乐平台”&#xff0c;只不过大多数时候都是以视频的形式呈现&#xff0c;所以你们可能对此没啥感觉。 那么今天给大家分享一款神级插件&#xff0c;让B站变成一个纯粹的音乐平台&a…...

【MySQL 01】在 Ubuntu 22.04 环境下安装 MySQL

文章目录 &#x1f308; 1. 说明&#x1f308; 2. 卸载不必要的环境&#x1f308; 3. 安装 MySQL&#x1f308; 4. 启动和关闭 MySQL 服务&#x1f308; 5. 临时登录 MySQL&#x1f308; 6. 设置 MySQL 密码&#x1f308; 7. 配置 MySQL &#x1f308; 1. 说明 在安装与卸载中…...

linux命令 根据某一字段去掉txt中重复的数据

前提&#xff1a; 文档为格式化好的数据。比如一行是一个json。 判断总共有多少行数据&#xff1a; grep No f.txt | wc -l 查询重复数据有多少行&#xff1a; grep No f.txt | sort -u | wc -l 找到重复的那行数据&#xff1a;(如果每行的json数据大&#xff0c;可忽略此操…...

LVS(Linux virual server)

一&#xff1a;环境准备&#xff1a; rhel9 软件&#xff1a;httpd&#xff0c; ipvsadm 四台纯净的rhel9机子&#xff1a;一台LVS调度设备&#xff08;双网卡&#xff09;&#xff0c;两台webserver&#xff08;单网卡仅主机&#xff09;&#xff0c;一台客户机 DR模式多…...

End-to-End Object Detection with Transformers(Detection Transformer)翻译

摘要 我们提出了一种新方法&#xff0c;将目标检测视为直接的集合预测问题。我们的方法简化了检测流程&#xff0c;有效消除了对许多手工设计组件的需求&#xff0c;如非极大值抑制过程或锚框生成&#xff0c;这些组件显式编码了我们对任务的先验知识。新框架称为检测变换器&a…...

uniapp打开地图直接获取位置

uniapp官网文档 https://en.uniapp.dcloud.io/api/location/open-location.html <view class"map-content" click.stop"kilometer(item)"><view class"km">{{item.distance||0}}km</view></view>import map from ../../…...

Qt的事件处理机制、信号和槽以及两者之间的区别

Qt的事件处理机制 Qt 的事件处理机制是其框架的核心部分之一&#xff0c;用于处理用户操作、系统事件以及其他各种事件。以下是 Qt 事件处理机制的关键组成部分和流程&#xff1a; 事件对象 (QEvent)&#xff1a; 所有事件在 Qt 中都是通过事件对象来表示的。QEvent 是所有事…...

LSTM实战之预测股票

&#x1f4c8; 用PyTorch搭建LSTM模型&#xff0c;轻松预测股票价格&#xff01;&#x1f680; Hey小伙伴们&#xff0c;今天给大家带来一个超级实用的项目教程——如何用PyTorch和LSTM模型来预测股票价格&#xff01;&#x1f31f; &#x1f50d; 项目背景 我们都知道股市是…...

30-50K|抖音大模型|社招3轮面经

情况介绍&#xff1a;我主要做nlp&#xff0c;也涉及到多模态和强化学习。现在大环境比较差&#xff0c;能投的公司不是很多&#xff0c;比如腾讯&#xff0c;主要还是高级别的&#xff0c;所以腾讯我就没投 抖音一面 1、聊项目。 2、AUC的两种公式是&#xff1f;你能证明这…...

ChatGPT首次被植入人类大脑:帮助残障人士开启对话

马斯克在脑机接口中最强大的竞争对手Synchron有了新的技术进展&#xff0c;他们首次将ChatGPT整合到其脑机系统中&#xff0c;以使瘫痪患者更容易控制他们的数字设备。Synchron凭借其独特的脑机接口&#xff08;BCI&#xff09;技术脱颖而出&#xff0c;该技术巧妙地运用了成熟…...

数据结构-常见排序的七大排序

1.排序的概念及其运用 1.1排序的概念 排序&#xff1a;所谓排序&#xff0c;就是使一串记录&#xff0c;按照其中的某个或某些关键字的大小&#xff0c;递增或递减的排列起来的操作。 稳定性&#xff1a;假定在待排序的记录序列中&#xff0c;存在多个具有相同的关键字的记录…...

程序员学CFA——财务报告与分析(四)

财务报告与分析&#xff08;四&#xff09; 资产负债表资产负债表的构成和格式资产负债表的要素资产负债所有者权益 资产负债表的格式分层的资产负债表基于流动性的资产负债表 资产的计量属性资产负债表科目金融资产持有至到期投资交易性金融资产可供出售金融资产 商誉少数股东…...

【消息队列】kafka如何保证消息不丢失?

&#x1f44f;大家好&#xff01;我是和风coding&#xff0c;希望我的文章能给你带来帮助&#xff01; &#x1f525;如果感觉博主的文章还不错的话&#xff0c;请&#x1f44d;三连支持&#x1f44d;一下博主哦 &#x1f4dd;点击 我的主页 还可以看到和风的其他内容噢&#x…...

不同随机数生成的含义

torch.manual_seed(all_args.seed) torch.cuda.manual_seed(all_args.seed) torch.cuda.manual_seed_all(all_args.seed) np.random.seed(all_args.seed) random.seed(all_args.seed) 这几种随机种子设置的含义如下&#xff1a; torch.manual_seed(all_args.seed): 设置PyTor…...

Jar工具完全指南:从入门到精通

Jar工具完全指南&#xff1a;从入门到精通的详尽教程 前言 欢迎来到Jar工具的完全指南&#xff01;无论你是Java编程的初学者&#xff0c;还是经验丰富的开发者&#xff0c;掌握Jar工具都是必不可少的。Jar&#xff08;Java Archive&#xff09;是Java生态系统中的一个核心组…...

云计算——弹性云计算器(ECS)

弹性云服务器&#xff1a;ECS 概述 云计算重构了ICT系统&#xff0c;云计算平台厂商推出使得厂家能够主要关注应用管理而非平台管理的云平台&#xff0c;包含如下主要概念。 ECS&#xff08;Elastic Cloud Server&#xff09;&#xff1a;即弹性云服务器&#xff0c;是云计算…...

3.3.1_1 检错编码(奇偶校验码)

从这节课开始&#xff0c;我们会探讨数据链路层的差错控制功能&#xff0c;差错控制功能的主要目标是要发现并且解决一个帧内部的位错误&#xff0c;我们需要使用特殊的编码技术去发现帧内部的位错误&#xff0c;当我们发现位错误之后&#xff0c;通常来说有两种解决方案。第一…...

循环冗余码校验CRC码 算法步骤+详细实例计算

通信过程&#xff1a;&#xff08;白话解释&#xff09; 我们将原始待发送的消息称为 M M M&#xff0c;依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)&#xff08;意思就是 G &#xff08; x ) G&#xff08;x) G&#xff08;x) 是已知的&#xff09;&#xff0…...

【SpringBoot】100、SpringBoot中使用自定义注解+AOP实现参数自动解密

在实际项目中,用户注册、登录、修改密码等操作,都涉及到参数传输安全问题。所以我们需要在前端对账户、密码等敏感信息加密传输,在后端接收到数据后能自动解密。 1、引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId...

为什么需要建设工程项目管理?工程项目管理有哪些亮点功能?

在建筑行业&#xff0c;项目管理的重要性不言而喻。随着工程规模的扩大、技术复杂度的提升&#xff0c;传统的管理模式已经难以满足现代工程的需求。过去&#xff0c;许多企业依赖手工记录、口头沟通和分散的信息管理&#xff0c;导致效率低下、成本失控、风险频发。例如&#…...

[ICLR 2022]How Much Can CLIP Benefit Vision-and-Language Tasks?

论文网址&#xff1a;pdf 英文是纯手打的&#xff01;论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误&#xff0c;若有发现欢迎评论指正&#xff01;文章偏向于笔记&#xff0c;谨慎食用 目录 1. 心得 2. 论文逐段精读 2.1. Abstract 2…...

Mac软件卸载指南,简单易懂!

刚和Adobe分手&#xff0c;它却总在Library里给你写"回忆录"&#xff1f;卸载的Final Cut Pro像电子幽灵般阴魂不散&#xff1f;总是会有残留文件&#xff0c;别慌&#xff01;这份Mac软件卸载指南&#xff0c;将用最硬核的方式教你"数字分手术"&#xff0…...

DBAPI如何优雅的获取单条数据

API如何优雅的获取单条数据 案例一 对于查询类API&#xff0c;查询的是单条数据&#xff0c;比如根据主键ID查询用户信息&#xff0c;sql如下&#xff1a; select id, name, age from user where id #{id}API默认返回的数据格式是多条的&#xff0c;如下&#xff1a; {&qu…...

LLMs 系列实操科普(1)

写在前面&#xff1a; 本期内容我们继续 Andrej Karpathy 的《How I use LLMs》讲座内容&#xff0c;原视频时长 ~130 分钟&#xff0c;以实操演示主流的一些 LLMs 的使用&#xff0c;由于涉及到实操&#xff0c;实际上并不适合以文字整理&#xff0c;但还是决定尽量整理一份笔…...

【Linux系统】Linux环境变量:系统配置的隐形指挥官

。# Linux系列 文章目录 前言一、环境变量的概念二、常见的环境变量三、环境变量特点及其相关指令3.1 环境变量的全局性3.2、环境变量的生命周期 四、环境变量的组织方式五、C语言对环境变量的操作5.1 设置环境变量&#xff1a;setenv5.2 删除环境变量:unsetenv5.3 遍历所有环境…...