鸿蒙开发实战-手写文心一言AI对话APP

运行环境

(后面附有API9版本,可修改后在HarmonyOS4设备上运行)

DAYU200:4.0.10.16

SDK:4.0.10.15

IDE:4.0.600

在DAYU200:4.0.10.16上运行

一、创建应用

1.点击File->new File->Create Progect

#星计划#OpenHarmony+文心一言对话APP WenXinTalk_HarmonyOS

2.选择模版

【OpenHarmony】Empty Ability

#星计划#OpenHarmony+文心一言对话APP WenXinTalk_文心一言_02

3.填写项目名,WenXinTalk,应用包名com.WenXinTalk,应用存储位置XXX(不要有中文,特殊字符,空格)

Compile SDK10,Model :Stage

Device Type 默认就可以。

node,建议16.20.1

完成以上配置以后点击Finish

#星计划#OpenHarmony+文心一言对话APP WenXinTalk_文心一言_03

4.选择在新窗口打开,等待依赖加载完毕。如图所示。

#星计划#OpenHarmony+文心一言对话APP WenXinTalk_OpenHarmony_04

如果大家加载依赖报错的话,检查自己的网络。

二、运行HelloWord

1.给开发板供电,并连接开发板到电脑,如图所示

#星计划#OpenHarmony+文心一言对话APP WenXinTalk_文心一言_05

2.签名

签名的步骤:

点击File->Project struct

#星计划#OpenHarmony+文心一言对话APP WenXinTalk_文心一言_06

点击Apply或者ok就可以,。

现在点击按钮运行项目。

#星计划#OpenHarmony+文心一言对话APP WenXinTalk_大语言模型_07

控制台打印信息

01/12 16:13:40: Launching com.myapplication
$ hdc uninstall com.myapplication
$ hdc shell mkdir data/local/tmp/39ca9a16978647c98d8ac8bdf4a45279
$ hdc file send "E:\study\HarmonyOS\project\WenXinTalk\entry\build\default\outputs\default\entry-default-signed.hap" "data/local/tmp/39ca9a16978647c98d8ac8bdf4a45279"
$ hdc shell bm install -p data/local/tmp/39ca9a16978647c98d8ac8bdf4a45279 
$ hdc shell rm -rf data/local/tmp/39ca9a16978647c98d8ac8bdf4a45279
$ hdc shell aa start -a EntryAbility -b com.myapplication

证明项目已经成功运行在开发板上。

如果报错

01/09 14:38:39: Install Failed: error: failed to install bundle.
code:9568320
error: no signature file.
Open signing configs
Error while Deploy Hap

则需要去签名

#星计划#OpenHarmony+文心一言对话APP WenXinTalk_文心一言_08

三、修改图标和名称

修改应用图标和名称:

目录在AppScope/app.json5

{"app": {"bundleName": "com.myapplication","vendor": "example","versionCode": 1000000,"versionName": "1.0.1","icon": "$media:iconAi","label": "$string:app_name"}
}

修改完毕之后如图所示

#星计划#OpenHarmony+文心一言对话APP WenXinTalk_文心一言_09

修改成功之后,如图所示

打开方式,在设置-应用管理一栏。

#星计划#OpenHarmony+文心一言对话APP WenXinTalk_文心一言_10

修改桌面图标和名称

修改src/main/module.json5中如图所示的label和icon。

我们修改label的时候,修改中文目录下的就可以

{"module": {"requestPermissions": [{"name": "ohos.permission.INTERNET"}],"name": "entry","type": "entry","description": "$string:module_desc","mainElement": "EntryAbility","deviceTypes": ["default","tablet"],"deliveryWithInstall": true,"installationFree": false,"pages": "$profile:main_pages","abilities": [{"name": "EntryAbility","srcEntry": "./ets/entryability/EntryAbility.ets","description": "$string:EntryAbility_desc","icon": "$media:iconAi","label": "$string:EntryAbility_label","startWindowIcon": "$media:startIcon","startWindowBackground": "$color:start_window_background","exported": true,"skills": [{"entities": ["entity.system.home"],"actions": ["action.system.home"]}]}]}
}

#星计划#OpenHarmony+文心一言对话APP WenXinTalk_OpenHarmony_11

修改中文目录的即可

#星计划#OpenHarmony+文心一言对话APP WenXinTalk_OpenHarmony_12

修改结果如下

#星计划#OpenHarmony+文心一言对话APP WenXinTalk_大语言模型_13

四、添加相关权限

因为需要用到网络数据,所以添加initent权限。

在src/main/module.json5中modele中添加配置,然后按sync就可以。

   "requestPermissions": [{"name": "ohos.permission.INTERNET"}],

#星计划#OpenHarmony+文心一言对话APP WenXinTalk_HarmonyOS_14

五、定义数据模型

1.在ets目录下新建model文件夹

#星计划#OpenHarmony+文心一言对话APP WenXinTalk_文心一言_15

2.新建TS File

#星计划#OpenHarmony+文心一言对话APP WenXinTalk_文心一言_16

export class WenXinReturn {id: string = ""object: string = ""created: string = ""result: string = ""is_truncated: Boolean = falseneed_clear_history: Boolean = falsefinish_reason: string = ""usage: Usage = new Usage()
}export class Usage {prompt_tokens: number = 0completion_tokens: number = 0total_tokens: number = 0
}export class MsgOutput {content: string = ""
}export class MsgInput {id: string = ""role: string = ""content: string = ""
}

六、加载网络数据

接口说明

准备好数据,

接口地址: https://aip.baidubce.com/rpc/2.0/ai_custom/v1/wenxinworkshop/chat/completions_pro

请求方法:POST

请求参数:

Header参数
名称
Content-Typeapplication/json
Query参数
名称类型必填描述
access_tokenstring通过API Key和Secret Key获取的access_token,参考 Access Token获取
Body参数
名称类型必填描述
messagesList(message)聊天上下文信息。说明: (1)messages成员不能为空,1个成员表示单轮对话,多个成员表示多轮对话 (2)最后一个message为当前请求的信息,前面的message为历史对话信息 (3)必须为奇数个成员,成员中message的role必须依次为user(or function)、assistant (4)最后一个message的content长度(即此轮对话的问题)不能超过2400 token;如果messages中content总长度大于2400 token,系统会依次遗忘最早的历史会话,直到content的总长度不超过2400 token
temperaturefloat说明: (1)较高的数值会使输出更加随机,而较低的数值会使其更加集中和确定 (2)默认0.95,范围 (0, 1.0],不能为0 (3)建议该参数和top_p只设置1个 (4)建议top_p和temperature不要同时更改
top_pfloat说明: (1)影响输出文本的多样性,取值越大,生成文本的多样性越强 (2)默认0.8,取值范围 [0, 1.0] (3)建议该参数和temperature只设置1个 (4)建议top_p和temperature不要同时更改
penalty_scorefloat通过对已生成的token增加惩罚,减少重复生成的现象。说明: (1)值越大表示惩罚越大 (2)默认1.0,取值范围:[1.0, 2.0]
streambool是否以流式接口的形式返回数据,默认false
systemstring模型人设,主要用于人设设定,例如,你是xxx公司制作的AI助手,说明: (1)长度限制1024个字符 (2)如果使用functions参数,不支持设定人设system
user_idstring表示最终用户的唯一标识符,可以监视和检测滥用行为,防止接口恶意调用

在这个WenXinTalk App中我们主要使用参数messages

测试接口

测试如图所示

#星计划#OpenHarmony+文心一言对话APP WenXinTalk_HarmonyOS_17

返回数据

{"id": "as-7gxj35bftb","object": "chat.completion","created": 1705068746,"result": "您好,我是文心一言,英文名是ERNIE Bot。我能够与人对话互动,回答问题,协助创作,高效便捷地帮助人们获取信息、知识和灵感。","is_truncated": false,"need_clear_history": false,"finish_reason": "normal","usage": {"prompt_tokens": 3,"completion_tokens": 33,"total_tokens": 36}
}

创建HTTP请求

1.导入http模块

import http from '@ohos.net.http';
import { BusinessError } from '@ohos.base';

2.创建createHttp

let httpRequest = http.createHttp();

3.填写HTTP地址

   httpRequest.request(`https://aip.baidubce.com/rpc/2.0/ai_custom/v1/wenxinworkshop/chat/completions_pro?access_token=${access_token}`,{method: http.RequestMethod.POST,header: [{'Content-Type': 'application/json'}],extraData: {"messages": MsgArray}}

4.对网络数据的处理

    if (!err) {let MsgReturn: WenXinReturn = JSON.parse(data.result.toString())this.MsgResult.content = MsgReturn.resultlet MsgIn: MsgInput = new MsgInput()MsgIn.role = "assistant" //文心一言返回的结果中令role为"assistant"MsgIn.content = this.MsgResult.contentMsgIn.id = this.MsgArray.length.toString() //id作为MsgArray中的标识,用以后续循环渲染this.MsgArray.push(MsgIn) //将文心一言返回的结果同样作为参数加入到MsgArray的末尾httpRequest.destroy();} else {this.message = JSON.stringify(err)console.error('error:' + JSON.stringify(err));httpRequest.off('headersReceive');// 当该请求使用完毕时,调用destroy方法主动销毁httpRequest.destroy();}

完成以上配置以后

5.在应用程序里测试网络请求

  build() {Column() {Button("测试网络请求").onClick(() => {this.httpData()})}.width("100%").height("100%").justifyContent(FlexAlign.Center)}
}

如图所示

#星计划#OpenHarmony+文心一言对话APP WenXinTalk_HarmonyOS_18

测试成功

如果2300006错误码,请检查网络

如果201错误码,请检查module.json中网络权限是否配置!

七、UI

数据获取到之后,我们就剩在页面上显示了。

首页

U I布局如图所示。

 build() {Column() {Column() {Scroll() {Column() {ForEach(this.MsgArray, (item: MsgInput, index: number) => {if (item.role == "user") {Row() {Text(item.content).width("50%").padding(15.5).backgroundColor("#95EC69").borderRadius(4)Image($r("app.media.user")).backgroundColor(Color.White).objectFit(ImageFit.Fill).width(50).height(50).borderRadius(4).margin({ left: 8, right: 8 })}.margin({ top: index === 0 ? 0 : 12 }).width("100%").alignItems(VerticalAlign.Top).justifyContent(FlexAlign.End)} else if (item.role == "assistant") {Row() {Image($r("app.media.iconAi")).backgroundColor(Color.White).objectFit(ImageFit.Fill).width(50).height(50).borderRadius(4).margin({ left: 8, right: 8 })Text(item.content).width("50%").padding(15.5).backgroundColor(Color.White).borderRadius(4).margin({ right: 0 })}.margin({ top: index === 0 ? 0 : 12 }).width("100%").alignItems(VerticalAlign.Top).justifyContent(FlexAlign.Start)}}, (item: MsgInput) => item.id) //循环渲染时,键值匹配规则使用item.id}.padding({ top: 12, bottom: 12 })}.width("100%")}.backgroundColor("#EDEDED").layoutWeight(1)Row() {TextInput({placeholder: "来和文心一言聊天吧", text: this.message}).backgroundColor(Color.White).layoutWeight(8).height(60).onChange((msg: string) => {this.message = msg}).margin({ top: 10, bottom: 10, left: 4, right: 4 })Button("提交").margin(4).layoutWeight(2).onClick(() => {let MsgIn: MsgInput = new MsgInput()MsgIn.id = this.MsgArray.length.toString()MsgIn.role = "user"MsgIn.content = this.messagethis.MsgArray.push(MsgIn)this.httpData(this.MsgArray)this.message = ""})}.backgroundColor("#F7F7F7")}.width("100%").height("100%").justifyContent(FlexAlign.SpaceBetween)}
}

#星计划#OpenHarmony+文心一言对话APP WenXinTalk_文心一言_19

八、完整源码

import { MsgInput, MsgOutput, WenXinReturn } from '../model/WexXinClass';
import http from '@ohos.net.http';
import { BusinessError } from '@ohos.base';@Entry
@Component
struct Index {@State message: string = 'Hello World';@State WXReturn: WenXinReturn = new WenXinReturn()@State MsgResult: MsgOutput = new MsgOutput()@State MsgInputSample: MsgInput = new MsgInput()@State MsgArray: Array<MsgInput> = []aboutToAppear() {this.message = "请介绍一下你自己"}httpData(MsgArray: Array<MsgInput>) {let httpRequest = http.createHttp();httpRequest.request("https://aip.baidubce.com/rpc/2.0/ai_custom/v1/wenxinworkshop/chat/completions_pro?access_token=24.c8909e4016b8a223464e02f463f1d1ac.2592000.1707464478.282335-46746495",{method: http.RequestMethod.POST,header: [{'Content-Type': 'application/json'}],extraData: {"messages": MsgArray}}, (err: BusinessError, data: http.HttpResponse) => {if (!err) {let MsgReturn: WenXinReturn = JSON.parse(data.result.toString())this.MsgResult.content = MsgReturn.resultlet MsgIn: MsgInput = new MsgInput()MsgIn.role = "assistant"MsgIn.content = this.MsgResult.contentMsgIn.id = this.MsgArray.length.toString()this.MsgArray.push(MsgIn)httpRequest.destroy();} else {this.message = JSON.stringify(err)console.error('error:' + JSON.stringify(err));httpRequest.off('headersReceive');// 当该请求使用完毕时,调用destroy方法主动销毁httpRequest.destroy();}})}build() {Column() {Column() {Scroll() {Column() {ForEach(this.MsgArray, (item: MsgInput, index: number) => {if (item.role == "user") {Row() {Text(item.content).width("50%").padding(15.5).backgroundColor("#95EC69").borderRadius(4)Image($r("app.media.user")).backgroundColor(Color.White).objectFit(ImageFit.Fill).width(50).height(50).borderRadius(4).margin({ left: 8, right: 8 })}.margin({ top: index === 0 ? 0 : 12 }).width("100%").alignItems(VerticalAlign.Top).justifyContent(FlexAlign.End)} else if (item.role == "assistant") {Row() {Image($r("app.media.iconAi")).backgroundColor(Color.White).objectFit(ImageFit.Fill).width(50).height(50).borderRadius(4).margin({ left: 8, right: 8 })Text(item.content).width("50%").padding(15.5).backgroundColor(Color.White).borderRadius(4).margin({ right: 0 })}.margin({ top: index === 0 ? 0 : 12 }).width("100%").alignItems(VerticalAlign.Top).justifyContent(FlexAlign.Start)}}, (item: MsgInput) => item.id)}.padding({ top: 12, bottom: 12 })}.width("100%")}.backgroundColor("#EDEDED").layoutWeight(1)Row() {TextInput({placeholder: "来和文心一言聊天吧", text: this.message}).backgroundColor(Color.White).layoutWeight(8).height(60).onChange((msg: string) => {this.message = msg}).margin({ top: 10, bottom: 10, left: 4, right: 4 })Button("提交").margin(4).layoutWeight(2).onClick(() => {let MsgIn: MsgInput = new MsgInput()MsgIn.id = this.MsgArray.length.toString()MsgIn.role = "user"MsgIn.content = this.messagethis.MsgArray.push(MsgIn)this.httpData(this.MsgArray)this.message = ""})}.backgroundColor("#F7F7F7")}.width("100%").height("100%").justifyContent(FlexAlign.SpaceBetween)}
}

在HarmonyOS 4.0设备上运行

(主要介绍与在OpenHarmony中开发时的不同,相同点不在赘述)

运行环境

HUAWEI Mate 40 : HarmonyOS 4.0.0

SDK:3.1.0(API 9)

IDE:4.0.600

一、在创建应用时选择第一个

如图

#星计划#OpenHarmony+文心一言对话APP WenXinTalk_文心一言_20

#星计划#OpenHarmony+文心一言对话APP WenXinTalk_HarmonyOS_21

二、签名

签名时选择support HarmonyOS

#星计划#OpenHarmony+文心一言对话APP WenXinTalk_大语言模型_22

需要登录华为账号后继续签名

#星计划#OpenHarmony+文心一言对话APP WenXinTalk_大语言模型_23

三、注释掉源码中不支持API 9的部分

#星计划#OpenHarmony+文心一言对话APP WenXinTalk_大语言模型_24

网络声明时直接使用即可

#星计划#OpenHarmony+文心一言对话APP WenXinTalk_大语言模型_25

其余部分与在开发板上运行都相同,直接运行即可

#星计划#OpenHarmony+文心一言对话APP WenXinTalk_OpenHarmony_26

九、总结

本文我们学习使用了基本组件的使用,网络请求以及状态管理,使用了ForEach循环渲染来构建对话界面。并且在HarmonyOS设备上成功运行,更多的鸿蒙开发实战学习,可以前往我的主页学习更多,下面分享鸿蒙的开发知识体系曲线图

鸿蒙OpenHarmony技术进阶包看主页

十、FAQ

2300006 域名解析失败

错误信息

Couldn’t resolve host name.

错误描述

服务器的域名无法解析。

可能原因

1.传入的服务器的URL不正确。

2.网络不通畅。

处理步骤

1.请检查输入的服务器的URL是否合理。

2.请检查网络连接情况

201错误码

检查moudle.json5的网络权限是否添加

"requestPermissions": [{"name": "ohos.permission.INTERNET"}
],

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/648728.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

分享7种SQL的进阶用法

分享7种SQL的进阶用法 前言 还只会使用SQL进行简单的insert、update、detele吗&#xff1f;本文给大家带来7种SQL的进阶用法&#xff0c;让大家在平常工作中使用SQL简化复杂的代码逻辑。 1.自定义排序&#xff08;ORDER BY FIELD&#xff09; 在MySQL中ORDER BY排序除了可以…

temu跨境电商怎么样?做temu蓝海项目有哪些优势?

在全球电商市场激烈的竞争中&#xff0c;Temu跨境电商平台以其独特的优势和策略&#xff0c;逐渐崭露头角。对于许多想要拓展海外市场的商家来说&#xff0c;Temu的蓝海项目提供了一个充满机遇的新平台。本文将深入探讨Temu跨境电商的优势以及在蓝海市场中的发展前景。 全球化市…

编程笔记 html5cssjs 056 CSS不透明度

编程笔记 html5&css&js 056 CSS不透明度 一、CSS 不透明度 / 透明度二、使用 RGBA 的透明度三、透明盒中的文本小结 不透明度/透明度。利用透明度可以提高页面的层次效果。 一、CSS 不透明度 / 透明度 opacity 属性指定元素的不透明度/透明度。 opacity 属性通常与 :h…

仅使用 Python 创建的 Web 应用程序(前端版本)第08章_商品详细

在本章中,我们将实现一个产品详细信息页面。 完成后的图像如下。 Model、MockDB、Service都是在产品列表页实现的,所以创建步骤如下。 No分类内容1Page定义PageId并创建继承自BasePage的页面类2Application将页面 ID 和页面类对添加到 MultiPageApp 的页面中Page:定义PageI…

VsCode提高生产力的插件推荐-持续更新中

别名路径跳转 自定义配置// 文件名别名跳转 "alias-skip.mappings": { "~/": "/src", "views": "/src/views", "assets": "/src/assets", "network": "/src/network", "comm…

Android App开发基础(2)—— App的工程结构

本专栏文章 上一篇 Android开发修炼之路——&#xff08;一&#xff09;Android App开发基础-1 2 App的工程结构 本节介绍App工程的基本结构及其常用配置&#xff0c;首先描述项目和模块的区别&#xff0c;以及工程内部各目录与配置文件的用途说明&#xff1b;其次阐述两种级别…

THM学习笔记——OSI模型和TCP/IP模型

全是文字 比较枯燥 建议视频 OSI模型由七个层次组成&#xff1a; 第7层 -- 应用层&#xff1a; OSI模型的应用层主要为在计算机上运行的程序提供网络选项。它几乎专门与应用程序一起工作&#xff0c;为它们提供一个界面以用于传输数据。当数据传递到应用层时&#xff0c;它…

【医学图像隐私保护】联邦学习:密码学 + 机器学习 + 分布式 实现隐私计算,破解医学界数据孤岛的长期难题

联邦学习&#xff1a;密码学 机器学习 分布式 提出背景&#xff1a;数据不出本地&#xff0c;又能合力干大事联邦学习的问题 分布式机器学习&#xff1a;解决大数据量处理的问题横向联邦学习&#xff1a;解决跨多个数据源学习的问题纵向联邦学习&#xff1a;解决数据分散在多…

【grafana】使用教程

【grafana】使用教程 一、简介二、下载及安装及配置三、基本概念3.1 数据源&#xff08;Data Source&#xff09;3.2 仪表盘&#xff08;Dashboard&#xff09;3.3 Panel&#xff08;面板&#xff09;3.4 ROW&#xff08;行&#xff09;3.5 共享及自定义 四、常用可视化示例4.1…

湿法蚀刻酸洗槽—— 应用半导体新能源光伏光电行业

PFA清洗槽又被称为防腐蚀槽、酸洗槽、溢流槽、纯水槽、浸泡槽、水箱、滴流槽&#xff0c;是四氟清洗桶后的升级款&#xff0c;是为半导体光伏光电等行业设计&#xff0c;一体成型&#xff0c;无需担心漏液。主要用于浸泡、清洗带芯片硅片电池片的花篮。 由于PFA的特点它能耐受…

【linux-虚拟化】 SR-IOV技术

文章目录 参考1. 什么是 SR-IOV?1.2. 将 SR-IOV 网络设备附加到虚拟机1.3. SR-IOV 分配支持的设备 参考 管理 SR-IOV 设备 1. 什么是 SR-IOV? 单根 I/O 虚拟化(SR-IOV)是一种规范&#xff0c;它允许单个 PCI Express(PCIe)设备向主机系统呈现多个独立的 PCI 设备&#xff…

QT获取本机网络信息

QT获取本机网络信息 widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget>QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACEclass Widget : public QWidget {Q_OBJECTpublic:Widget(QWidget *parent nullptr);~Widget();void getinform…

视频智能分析:冶炼/冶金工厂视频智能监管方案的设计和应用

一、背景与需求 随着工业4.0的推进&#xff0c;冶金行业正面临着转型升级的压力。为了提高生产效率、降低能耗、保障安全&#xff0c;冶金智能工厂视频监管方案应运而生。该方案通过高清摄像头、智能分析技术、大数据处理等手段&#xff0c;对工厂进行全方位、实时监控&#x…

k8s的安全机制

k8s的安全机制。分布式集群管理工具&#xff0c;就是容器编排 安全机制的核心&#xff1a;APIserver作为整个内部通信的中介&#xff0c;也是外部控制的入口&#xff0c;所有的安全机制都是围绕API server来进行设计 请求API资源&#xff1a; 1、认证 2、鉴权 3、准入机制 …

如何使用WinSCP公网远程访问本地CentOS服务器编辑上传文件

文章目录 1. 简介2. 软件下载安装&#xff1a;3. SSH链接服务器4. WinSCP使用公网TCP地址链接本地服务器5. WinSCP使用固定公网TCP地址访问服务器 1. 简介 ​ Winscp是一个支持SSH(Secure SHell)的可视化SCP(Secure Copy)文件传输软件&#xff0c;它的主要功能是在本地与远程计…

大创项目推荐 题目:基于FP-Growth的新闻挖掘算法系统的设计与实现

文章目录 0 前言1 项目背景2 算法架构3 FP-Growth算法原理3.1 FP树3.2 算法过程3.3 算法实现3.3.1 构建FP树 3.4 从FP树中挖掘频繁项集 4 系统设计展示5 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 基于FP-Growth的新闻挖掘算法系统的设计与实现…

Mediasoup Demo-v3笔记(五)——Mediasoup 的启动

Mediasoup是由两部分组成的&#xff0c;一部分是js的控制模块&#xff0c;一部分是c的传输模块&#xff0c;在这里我们用mediasoup demo的代码开始&#xff0c;分析整个进程的启动过程 1、在mediasoup-demo-3的server.js中&#xff0c;调用启动方法 mediasoup-demo-3是一个dem…

Zoomit 安装与使用

Zoomit 安装与使用 1&#xff09;工具介绍 ZoomIt 是一款非常实用的投影演示辅助软件 ZoomIt 是一种在所有 Windows 设备上运行的工作的注释和缩放工具 2&#xff09;下载地址 地址&#xff1a;https://zoomit.en.softonic.com/ 3&#xff09;安装教程 第一步 第二步 …

国外服务器全攻略,国外服务器的特点和优势是什么?

随着互联网的快速发展&#xff0c;越来越多的企业和个人选择将网站、应用程序等部署在国外服务器上。那么&#xff0c;国外服务器有哪些特点和优势呢&#xff1f;本文将对这一问题进行详细探讨。 一、国外服务器的特点 1.全球化的网络连接&#xff1a;国外服务器通常拥有全球化…

ThreeJS官方示例

1 月球绕地球旋转 材质贴图的颜色显示可能和原图看起来不一致&#xff0c;需要设置色彩空间&#xff1a; 线性色彩空间&#xff08;LinearSRGBColorSpace&#xff09;&#xff1a;根据光照强度均匀分布sRGB色彩空间&#xff08;SRGBColorSpace&#xff09;&#xff1a;根据人…