鸿蒙OS开发实例:【窥探网络请求】

 HarmonyOS 平台中使用网络请求,需要引入 "@ohos.net.http", 并且需要在 module.json5 文件中申请网络权限, 即 “ohos.permission.INTERNET”

本篇文章将尝试使用 @ohos.net.http 来实现网络请求

场景设定

  1. WeiBo UniDemo HuaWei : 请求顺序
  2. WeiBo1 UniDemo2 HuaWei3 : 异步/同步请求时,序号表示请求回来的顺序
  3. “开始网络请求-异步” : 开始异步请求
  4. “开始网络请求-同步” : 开始同步请求
  5. “开始网络请求-自定义方法装饰器” : 采用自定义方法装饰器进行传参,进而完成网络请求

官方网络请求案例

注意:

每次请求都必须新创建一个HTTP请求实例,即只要发起请求,必须调用createHttp方法

更多鸿蒙开发应用知识已更新qr23.cn/AKFP8k参考前往。

搜狗高速浏览器截图20240326151547.png

关于 @ohos.net.http 有三个request方法

  1. request(url: string, callback: AsyncCallback): void;

    1.1 如下“官方指南代码缩减版”使用到了这个方法

  2. request(url: string, options: HttpRequestOptions, callback: AsyncCallback): void;

    2.1 如下“官方指南代码” 使用了这个方法

  3. request(url: string, options?: HttpRequestOptions): Promise;

    3.1 将在后续实践代码中使用到

// 引入包名
import http from '@ohos.net.http';// 每一个httpRequest对应一个HTTP请求任务,不可复用
let httpRequest = http.createHttp();
// 用于订阅HTTP响应头,此接口会比request请求先返回。可以根据业务需要订阅此消息
// 从API 8开始,使用on('headersReceive', Callback)替代on('headerReceive', AsyncCallback)。 8+
httpRequest.on('headersReceive', (header) => {console.info('header: ' + JSON.stringify(header));
});
httpRequest.request(// 填写HTTP请求的URL地址,可以带参数也可以不带参数。URL地址需要开发者自定义。请求的参数可以在extraData中指定"EXAMPLE_URL",{method: http.RequestMethod.POST, // 可选,默认为http.RequestMethod.GET// 开发者根据自身业务需要添加header字段header: {'Content-Type': 'application/json'},// 当使用POST请求时此字段用于传递内容extraData: {"data": "data to send",},expectDataType: http.HttpDataType.STRING, // 可选,指定返回数据的类型usingCache: true, // 可选,默认为truepriority: 1, // 可选,默认为1connectTimeout: 60000, // 可选,默认为60000msreadTimeout: 60000, // 可选,默认为60000msusingProtocol: http.HttpProtocol.HTTP1_1, // 可选,协议类型默认值由系统自动指定}, (err, data) => {if (!err) {// data.result为HTTP响应内容,可根据业务需要进行解析console.info('Result:' + JSON.stringify(data.result));console.info('code:' + JSON.stringify(data.responseCode));// data.header为HTTP响应头,可根据业务需要进行解析console.info('header:' + JSON.stringify(data.header));console.info('cookies:' + JSON.stringify(data.cookies)); // 8+} else {console.info('error:' + JSON.stringify(err));// 取消订阅HTTP响应头事件httpRequest.off('headersReceive');// 当该请求使用完毕时,调用destroy方法主动销毁httpRequest.destroy();}}
);
// 引入包名
import http from '@ohos.net.http';// 每一个httpRequest对应一个HTTP请求任务,不可复用
let httpRequest = http.createHttp();httpRequest.request(// 填写HTTP请求的URL地址,可以带参数也可以不带参数。URL地址需要开发者自定义。请求的参数可以在extraData中指定"EXAMPLE_URL",(err, data) => {if (!err) {// data.result为HTTP响应内容,可根据业务需要进行解析console.info('Result:' + JSON.stringify(data.result));console.info('code:' + JSON.stringify(data.responseCode));// data.header为HTTP响应头,可根据业务需要进行解析console.info('header:' + JSON.stringify(data.header));console.info('cookies:' + JSON.stringify(data.cookies)); // 8+} else {console.info('error:' + JSON.stringify(err));// 取消订阅HTTP响应头事件httpRequest.off('headersReceive');// 当该请求使用完毕时,调用destroy方法主动销毁httpRequest.destroy();}}
);

场景布局

基础页面组件代码

考虑到实际的场景会用到网络请求加载,因此这里将发挥 [@BuilderParam] 装饰器作用,先定义基础页面

组件中定义了 @Prop netLoad:boolean 变量来控制是否展示加载动画

@Component
export struct BasePage {@Prop netLoad: boolean//指向一个组件  @BuilderParam aB0: () => {}build(){Stack(){//为组件占位this.aB0()if (this.netLoad) {LoadingProgress().width(px2vp(150)).height(px2vp(150)).color(Color.Blue)}}.hitTestBehavior(HitTestMode.None)}}

主页面布局代码

import { BasePage } from './BasePage'@Entry
@Component
struct NetIndex {@State netLoad: number = 0@State msg: string = ''build() {Stack(){BasePage({netLoad: this.netLoad != 0}) {Column( {space: 20} ){Row({space: 20}){Text('WeiBo').fontColor(Color.Black)Text('UniDemo').fontColor(Color.Black)Text('HuaWei').fontColor(Color.Black)}Row({space: 20}){Text('WeiBo' + this.weiboIndex)Text('UniDemo' + this.uniIndex)Text('HuaWei' + this.huaweiIndex)}Button('开始网络请求 - 异步').fontSize(20).onClick( () => {...})Button('开始网络请求 - 同步').fontSize(20).onClick( () => {...})Button('开始网络请求-自定义方法装饰器').fontSize(20).onClick( () => {...})Scroll() {Text(this.msg).width('100%')}.scrollable(ScrollDirection.Vertical)}.width('100%').height('100%').padding({top: px2vp(120)})}}}}

简单装封装网络请求

函数传参,直接调用封装方法

WeiBo为数据结构体,暂时不用关心,后续会贴出完整代码,这里仅仅是演示网络请求用法

//引用封装好的HNet网络工具类
import HNet from './util/HNet'@State msg: string = ''getWeiBoData(){HNet.get<WeiBo>({url: 'https://m.weibo.cn/api/feed/trendtop?containerid=102803_ctg1_4188_-_ctg1_4188',
}).then( (r) => {this.msg = ''if(r.code == 0 && r.result){r.result.data.statuses.forEach((value: WeiBoItem) => {this.msg = this.msg.concat(value.created_at + ' ' + value.id + '\n')})} else {this.msg = r.code + ' ' + r.msg}console.log('顺序-weibo-' + (new Date().getTime() - starTime))this.netLoad--})    }

自定义方法装饰器,完成传参调用

网络请求样例

NetController.getWeiBo<WeiBo>().then( r => {......
})   

按照业务定义传参

import { Get, NetResponse } from './util/HNet'export default class BizNetController {@Get('https://m.weibo.cn/api/feed/trendtop?containerid=102803_ctg1_4188_-_ctg1_4188')static getWeiBo<WeiBo>(): Promise<NetResponse<WeiBo>>{ return }}

封装的网络请求代码

import http from '@ohos.net.http';//自定义网络请求参数对象    
class NetParams{url: stringextraData?: JSON
}//自定义数据公共结构体    
export class NetResponse<T> {result: Tcode: numbermsg: string
}//网络封装工具类    
class HNet {//POST 请求方法  static post<T>(options: NetParams): Promise<NetResponse<T>>{return this.request(options, http.RequestMethod.POST)}//GET 请求方法  static get<T>(options: NetParams): Promise<NetResponse<T>>{return this.request(options, http.RequestMethod.GET)}private static request<T>(options: NetParams, method: http.RequestMethod): Promise<NetResponse<T>>{let r = http.createHttp()return r.request(options.url, {method: method,extraData: options.extraData != null ? JSON.stringify(options.extraData) : null}).then( (response: http.HttpResponse) => {let netResponse = new NetResponse<T>()let dataType = typeof response.resultif(dataType === 'string'){console.log('结果为字符串类型')}if(response.responseCode == 200){netResponse.code = 0netResponse.msg = 'success'netResponse.result = JSON.parse(response.result as string)} else {//出错netResponse.code = -1netResponse.msg = 'error'}return netResponse}).catch( reject => {console.log('结果发生错误')let netResponse = new NetResponse<T>()netResponse.code = reject.codenetResponse.msg  = reject.messagereturn netResponse}).finally( () => {//网络请求完成后,需要进行销毁r.destroy()})}}export default HNet //用于装饰器传参
export function Get(targetUrl: string) : MethodDecorator {return (target: Object, propertyKey: string | symbol, descriptor: PropertyDescriptor) => {//替换方法descriptor.value = () => {let options = new NetParams()options.url = targetUrlreturn HNet.get(options)}}}

完整代码

代码结构

net/BasePage.ets

net/NetRequest.ets

net/util/HNet.ts

net/viewmodel/WeiBoModel.ts

net/BizNetController.ets

详细代码

@Component
export struct BasePage {@Prop netLoad: boolean@BuilderParam aB0: () => {}build(){Stack(){this.aB0()if (this.netLoad) {LoadingProgress().width(px2vp(150)).height(px2vp(150)).color(Color.Blue)}}.hitTestBehavior(HitTestMode.None)}}   
import HNet from './util/HNet'
import NetController from './BizNetController'
import { WeiBo, WeiBoItem } from './viewmodel/WeiBoModel'
import { BasePage } from './BasePage'@Entry
@Component
struct NetIndex {@State netLoad: number = 0@State msg: string = ''@State weiboColor: Color = Color.Black@State uniColor: Color = Color.Black@State huaweiColor: Color = Color.Black@State weiboIndex: number = 1@State uniIndex: number = 2@State huaweiIndex: number = 3private  TEST_Target_URL: string[] = ['https://m.weibo.cn/api/feed/trendtop?containerid=102803_ctg1_4188_-_ctg1_4188','https://unidemo.dcloud.net.cn/api/news','https://developer.huawei.com/config/cn/head.json',]build() {Stack(){BasePage({netLoad: this.netLoad != 0}) {Column( {space: 20} ){Row({space: 20}){Text('WeiBo').fontColor(Color.Black)Text('UniDemo').fontColor(Color.Black)Text('HuaWei').fontColor(Color.Black)}Row({space: 20}){Text('WeiBo' + this.weiboIndex).fontColor(this.weiboColor)Text('UniDemo' + this.uniIndex).fontColor(this.uniColor)Text('HuaWei' + this.huaweiIndex).fontColor(this.huaweiColor)}Button('开始网络请求 - 异步').fontSize(20).onClick( () => {this.weiboColor = Color.Blackthis.uniColor = Color.Blackthis.huaweiColor = Color.Blackthis.weiboIndex = 1this.uniIndex = 2this.huaweiIndex = 3this.asyncGetData()})Button('开始网络请求 - 同步').fontSize(20).onClick( () => {this.weiboColor = Color.Blackthis.uniColor = Color.Blackthis.huaweiColor = Color.Blackthis.weiboIndex = 1this.uniIndex = 2this.huaweiIndex = 3this.syncGetData()})Button('开始网络请求-自定义方法装饰器').fontSize(20).onClick( () => {this.getWeiBoListByController()})Scroll() {Text(this.msg).width('100%')}.scrollable(ScrollDirection.Vertical)}.width('100%').height('100%').padding({top: px2vp(120)})}}}asyncGetData(){this.netLoad = 3;this.TEST_Target_URL.forEach( (value) => {HNet.get({url: value,}).then( (r) => {this.msg = JSON.stringify(r)if(value.indexOf('weibo') != -1){this.weiboColor = Color.Greenthis.weiboIndex = 3 - this.netLoad + 1} else if(value.indexOf('unidemo') != -1){this.uniColor = Color.Greenthis.uniIndex = 3 - this.netLoad + 1} else if(value.indexOf('huawei') != -1){this.huaweiColor = Color.Greenthis.huaweiIndex = 3 - this.netLoad + 1}this.netLoad--})})}async syncGetData() {let starTimelet urlthis.netLoad = 3;starTime = new Date().getTime()url = this.TEST_Target_URL[0]starTime = new Date().getTime()if(url.indexOf('weibo') != -1){console.log('顺序-请求-weibo')} else if(url.indexOf('unidemo') != -1){console.log('顺序-请求-unidemo')} else if(url.indexOf('huawei') != -1){console.log('顺序-请求-huawei')}await HNet.get<WeiBo>({url: url,}).then( (r) => {this.msg = ''if(r.code == 0 && r.result){r.result.data.statuses.forEach((value: WeiBoItem) => {this.msg = this.msg.concat(value.created_at + ' ' + value.id + '\n')})} else {this.msg = r.code + ' ' + r.msg}if(url.indexOf('weibo') != -1){this.weiboColor = Color.Greenthis.weiboIndex = 3 - this.netLoad + 1console.log('顺序-返回-weibo-' + (new Date().getTime() - starTime))} else if(url.indexOf('unidemo') != -1){this.uniColor = Color.Greenthis.uniIndex = 3 - this.netLoad + 1console.log('顺序-返回-unidemo-' + (new Date().getTime() - starTime))} else if(url.indexOf('huawei') != -1){this.huaweiColor = Color.Greenthis.huaweiIndex = 3 - this.netLoad + 1console.log('顺序-返回-huawei-' + (new Date().getTime() - starTime))}this.netLoad--})starTime = new Date().getTime()url = this.TEST_Target_URL[1]starTime = new Date().getTime()if(url.indexOf('weibo') != -1){console.log('顺序-请求-weibo')} else if(url.indexOf('unidemo') != -1){console.log('顺序-请求-unidemo')} else if(url.indexOf('huawei') != -1){console.log('顺序-请求-huawei')}await HNet.get({url: url,}).then( (r) => {this.msg = JSON.stringify(r)if(url.indexOf('weibo') != -1){this.weiboColor = Color.Greenthis.weiboIndex = 3 - this.netLoad + 1console.log('顺序-返回-weibo-' + (new Date().getTime() - starTime))} else if(url.indexOf('unidemo') != -1){this.uniColor = Color.Greenthis.uniIndex = 3 - this.netLoad + 1console.log('顺序-返回-unidemo-' + (new Date().getTime() - starTime))} else if(url.indexOf('huawei') != -1){this.huaweiColor = Color.Greenthis.huaweiIndex = 3 - this.netLoad + 1console.log('顺序-返回-huawei-' + (new Date().getTime() - starTime))}this.netLoad--})starTime = new Date().getTime()url = this.TEST_Target_URL[2]starTime = new Date().getTime()if(url.indexOf('weibo') != -1){console.log('顺序-请求-weibo')} else if(url.indexOf('unidemo') != -1){console.log('顺序-请求-unidemo')} else if(url.indexOf('huawei') != -1){console.log('顺序-请求-huawei')}await HNet.get({url: url,}).then( (r) => {this.msg = JSON.stringify(r)if(url.indexOf('weibo') != -1){this.weiboColor = Color.Greenthis.weiboIndex = 3 - this.netLoad + 1console.log('顺序-返回-weibo-' + (new Date().getTime() - starTime))} else if(url.indexOf('unidemo') != -1){this.uniColor = Color.Greenthis.uniIndex = 3 - this.netLoad + 1console.log('顺序-返回-unidemo-' + (new Date().getTime() - starTime))} else if(url.indexOf('huawei') != -1){this.huaweiColor = Color.Greenthis.huaweiIndex = 3 - this.netLoad + 1console.log('顺序-返回-huawei-' + (new Date().getTime() - starTime))}this.netLoad--})}getHuaWeiSomeDataByNet(){this.netLoad = 1let starTime = new Date().getTime()console.log('顺序-huawei-请求' + starTime)HNet.get({url: 'https://developer.huawei.com/config/cn/head.json',}).then( (r) => {this.msg = JSON.stringify(r, null, '\t')this.netLoad--console.log('顺序-huawei-' + (new Date().getTime() - starTime))})}getWeiBoListByHNet(){this.netLoad = 1let starTime = new Date().getTime()console.log('顺序-weibo-请求' + starTime)HNet.get<WeiBo>({url: 'https://m.weibo.cn/api/feed/trendtop?containerid=102803_ctg1_4188_-_ctg1_4188',}).then( (r) => {this.msg = ''if(r.code == 0 && r.result){r.result.data.statuses.forEach((value: WeiBoItem) => {this.msg = this.msg.concat(value.created_at + ' ' + value.id + '\n')})} else {this.msg = r.code + ' ' + r.msg}console.log('顺序-weibo-' + (new Date().getTime() - starTime))this.netLoad--})}getWeiBoListByController(){this.netLoad = 1NetController.getWeiBo<WeiBo>().then( r => {this.msg = ''if(r.code == 0 && r.result){r.result.data.statuses.forEach((value: WeiBoItem) => {this.msg = this.msg.concat(value.created_at + ' ' + value.id + '\n' + value.source + '\n')})} else {this.msg = r.code + ' ' + r.msg}this.netLoad--})}}    import { Get, NetResponse } from './util/HNet'export default class BizNetController {@Get('https://m.weibo.cn/api/feed/trendtop?containerid=102803_ctg1_4188_-_ctg1_4188')static getWeiBo<WeiBo>(): Promise<NetResponse<WeiBo>>{ return }}    import http from '@ohos.net.http';class NetParams{url: stringextraData?: JSON
}export class NetResponse<T> {result: Tcode: numbermsg: string
}class HNet {static post<T>(options: NetParams): Promise<NetResponse<T>>{return this.request(options, http.RequestMethod.POST)}static get<T>(options: NetParams): Promise<NetResponse<T>>{return this.request(options, http.RequestMethod.GET)}private static request<T>(options: NetParams, method: http.RequestMethod): Promise<NetResponse<T>>{let r = http.createHttp()return r.request(options.url, {method: method,extraData: options.extraData != null ? JSON.stringify(options.extraData) : null}).then( (response: http.HttpResponse) => {let netResponse = new NetResponse<T>()let dataType = typeof response.resultif(dataType === 'string'){console.log('结果为字符串类型')}if(response.responseCode == 200){netResponse.code = 0netResponse.msg = 'success'netResponse.result = JSON.parse(response.result as string)} else {//出错netResponse.code = -1netResponse.msg = 'error'}return netResponse}).catch( reject => {console.log('结果发生错误')let netResponse = new NetResponse<T>()netResponse.code = reject.codenetResponse.msg  = reject.messagereturn netResponse}).finally( () => {r.destroy()})}}export default HNetexport function Get(targetUrl: string) : MethodDecorator {return (target: Object, propertyKey: string | symbol, descriptor: PropertyDescriptor) => {//替换方法descriptor.value = () => {let options = new NetParams()options.url = targetUrlreturn HNet.get(options)}}}export class WeiBo{ok: numberhttp_code: numberdata: WeiBoDataObj
}export class WeiBoDataObj{total_number: numberinterval: numberremind_text: stringpage: numberstatuses: Array<WeiBoItem>
}export class WeiBoItem{created_at: stringid: stringsource: stringtextLength: number
}

最后呢,很多开发朋友不知道需要学习那些鸿蒙技术?鸿蒙开发岗位需要掌握那些核心技术点?为此鸿蒙的开发学习必须要系统性的进行。

而网上有关鸿蒙的开发资料非常的少,假如你想学好鸿蒙的应用开发与系统底层开发。你可以参考这份资料,少走很多弯路,节省没必要的麻烦。由两位前阿里高级研发工程师联合打造《鸿蒙NEXT星河版OpenHarmony开发文档》里面内容包含了(ArkTS、ArkUI开发组件、Stage模型、多端部署、分布式应用开发、音频、视频、WebGL、OpenHarmony多媒体技术、Napi组件、OpenHarmony内核、Harmony南向开发、鸿蒙项目实战等等)鸿蒙(Harmony NEXT)技术知识点

如果你是一名Android、Java、前端等等开发人员,想要转入鸿蒙方向发展。可以直接领取这份资料辅助你的学习。下面是鸿蒙开发的学习路线图。

高清完整版请点击→《鸿蒙NEXT星河版开发学习文档》

针对鸿蒙成长路线打造的鸿蒙学习文档。话不多说,我们直接看详细资料鸿蒙(OpenHarmony )学习手册(共计1236页)与鸿蒙(OpenHarmony )开发入门教学视频,帮助大家在技术的道路上更进一步。

《鸿蒙 (OpenHarmony)开发学习视频》

图片

《鸿蒙生态应用开发V2.0白皮书》

图片

《鸿蒙 (OpenHarmony)开发基础到实战手册》

获取这份鸿蒙星河版学习资料,请点击→《鸿蒙NEXT星河版开发学习文档》

OpenHarmony北向、南向开发环境搭建

图片

《鸿蒙开发基础》

  1. ArkTS语言

  2. 安装DevEco Studio

  3. 运用你的第一个ArkTS应用

  4. ArkUI声明式UI开发

  5. .……

图片

《鸿蒙开发进阶》

  1. Stage模型入门

  2. 网络管理

  3. 数据管理

  4. 电话服务

  5. 分布式应用开发

  6. 通知与窗口管理

  7. 多媒体技术

  8. 安全技能

  9. 任务管理

  10. WebGL

  11. 国际化开发

  12. 应用测试

  13. DFX面向未来设计

  14. 鸿蒙系统移植和裁剪定制

  15. ……

图片

《鸿蒙开发实战》

  1. ArkTS实践

  2. UIAbility应用

  3. 网络案例

  4. ……

图片

 获取这份鸿蒙星河版学习资料,请点击→《鸿蒙NEXT星河版开发学习文档》

总结

鸿蒙—作为国家主力推送的国产操作系统。部分的高校已经取消了安卓课程,从而开设鸿蒙课程;企业纷纷跟进启动了鸿蒙研发

并且鸿蒙是完全具备无与伦比的机遇和潜力的;预计到年底将有 5,000 款的应用完成原生鸿蒙开发,未来将会支持 50 万款的应用那么这么多的应用需要开发,也就意味着需要有更多的鸿蒙人才鸿蒙开发工程师也将会迎来爆发式的增长,学习鸿蒙势在必行!

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

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

相关文章

Python之Opencv教程(3):人脸识别

1、人脸识别代码 直接上代码&#xff1a; import cv2# 加载训练数据集文件 recogizer cv2.face.LBPHFaceRecognizer_create()recogizer.read(trainer/trainer.yml)# 准备识别的图片 img cv2.imread(images/lisa.jpg) gray cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)face_dete…

Stata 15 for Mac:数据统计分析新标杆,让研究更高效!

Stata 是一种统计分析软件&#xff0c;适用于数据管理、数据分析和绘图。Stata 15 for Mac 具有以下功能&#xff1a; 数据管理&#xff1a;Stata 提供强大的数据管理功能&#xff0c;用户可以轻松导入、清洗、整理和管理数据集。 统计分析&#xff1a;Stata 提供了广泛的统计…

sqli第24关二次注入

注入点 # Validating the user input........$username $_SESSION["username"];$curr_pass mysql_real_escape_string($_POST[current_password]);$pass mysql_real_escape_string($_POST[password]);$re_pass mysql_real_escape_string($_POST[re_password]);if($p…

算法学习——LeetCode力扣动态规划篇5

算法学习——LeetCode力扣动态规划篇5 198. 打家劫舍 198. 打家劫舍 - 力扣&#xff08;LeetCode&#xff09; 描述 你是一个专业的小偷&#xff0c;计划偷窃沿街的房屋。每间房内都藏有一定的现金&#xff0c;影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统…

Android MediaPlayer

MediaPlayer 类是媒体框架最重要的组成部分之一。此类的对象能够获取、解码以及播放音频和视频&#xff0c;而且只需极少量设置。它支持多种不同的媒体源&#xff0c;例如&#xff1a; • 本地资源 • 内部 URI&#xff0c;例如您可能从内容解析器那获取的 URI • 外部网址…

光明源@智慧厕所公厕软件系统有哪些核心功能?

在现代城市的建设中&#xff0c;智慧公厕的建设成为了提升城市品质和居民生活质量的重要举措。而智慧公厕的核心&#xff0c;不仅仅在于其硬件设备的智能化&#xff0c;同样重要的是其背后支持的智慧厕所公厕软件系统。让我们一起探讨&#xff0c;智慧厕所公厕软件系统有哪些核…

C语言-编译和链接

目录 1.前言2.编译2.1预处理&#xff08;预编译&#xff09;2.1.1 #define 定义常量2.1.2 #define 定义宏2.1.3带有副作用的宏参数2.1.4宏替换规则2.1.5 #和##2.1.5.1 #运算符2.1.5.2 ## 运算符 2.1.6 命名约定2.1.7 #undef2.1.8 条件编译2.1.9 头文件的包含2.1.9.1 本地文件包…

ubuntu+clangd+vscode 实现项目代码快速跳转(如: Linux 内核源码)

1. 准备工作 虚拟机 ubuntu 环境&#xff0c;笔者用的是 ubuntu20.04。windows 安装好 vscode 软件。 2. 配置过程 2.1 vscode远程连接 ubuntu ubuntu 虚拟机开启 ssh 服务 sudo apt install openssh-server sudo service ssh startvscode 安装 remote-ssh 插件 vscode 远…

awesome-cheatsheets:超级速查表 - 编程语言、框架和开发工具的速查表

awesome-cheatsheets&#xff1a;超级速查表 - 编程语言、框架和开发工具的速查表&#xff0c;单个文件包含一切你需要知道的东西 官网&#xff1a;GitHub - skywind3000/awesome-cheatsheets: 超级速查表 - 编程语言、框架和开发工具的速查表&#xff0c;单个文件包含一切你需…

java Web 疫苗预约管理系统用eclipse定制开发mysql数据库BS模式java编程jdbc

一、源码特点 JSP 疫苗预约管理系统是一套完善的web设计系统&#xff0c;对理解JSP java 编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为TOMCAT7.0,eclipse开发&#xff0c;数据库为Mysql5.0&#xff0c;使…

小狐狸ChatGPT付费AI创作系统V2.8.0独立版 + H5端 + 小程序前端

狐狸GPT付费体验系统的开发基于国外很火的ChatGPT&#xff0c;这是一种基于人工智能技术的问答系统&#xff0c;可以实现智能回答用户提出的问题。相比传统的问答系统&#xff0c;ChatGPT可以更加准确地理解用户的意图&#xff0c;提供更加精准的答案。同时&#xff0c;小狐狸G…

【jenkins+cmake+svn管理c++项目】jenkins回传文件到svn(windows)

书接上文&#xff1a;创建一个项目 在经过cmakemsbuild顺利生成动态库之后&#xff0c;考虑到我一个项目可能会生成多个动态库&#xff0c;它们分散在build内的不同文件夹&#xff0c;我希望能将它们收拢到一个文件夹下&#xff0c;并将其回传到svn。 一、动态库移位—cmake实…

H5抓包——Android 使用电脑浏览器 DevTools调试WebView

H5抓包——Android 使用电脑浏览器 DevTools调试WebView 一、使用步骤 1、电脑通过数据线连接手机&#xff0c;开启USB调试&#xff08;打开手机开发者选项&#xff09; 2、打开待调试的H5 App&#xff0c;进入H5界面 3、打开电脑浏览器&#xff0c;调试界面入口 如果用ed…

linux命令之tput

1.tput介绍 linux命令tput是可以在终端中进行文本和颜色的控制和格式化&#xff0c;其是一个非常有用的命令 2.tput用法 命令&#xff1a; man tput 3.样例 3.1.清除屏幕 命令&#xff1a; tput clear [rootelasticsearch ~]# tput clear [rootelasticsearch ~]# 3.2.…

C#/BS手麻系统源码 手术麻醉管理系统源码 商业项目源码

C#/BS手麻系统源码 手术麻醉管理系统源码 商业项目源码 手麻系统从麻醉医生实际工作环境和流程需求方面设计&#xff0c;与HIS&#xff0c;LIS&#xff0c;PACS&#xff0c;EMR无缝连接&#xff0c;方便查看患者的信息;实现术前、术中、术后手术麻醉信息全记录;减少麻醉医师在…

AI时代-普通人的AI绘画工具对比(Midjouney与Stable Diffusion)

AI时代-普通人的AI绘画工具对比&#xff08;Midjouney与Stable Diffusion&#xff09; 前言1、基础对比Stable Diffusion&#xff08;SD&#xff09;SD界面安装与使用SD Midjouney&#xff08;MJ&#xff09; 2、硬件与运行要求对比Stable Diffusion硬件要求内存硬盘显卡 Midjo…

MySQL开窗函数

测试环境&#xff1a;mysql8.0.18 官方文档&#xff1a;https://dev.mysql.com/doc/refman/8.0/en/window-functions.html 一、窗口函数介绍二、语法结构三、自定义窗口1.rows&#xff08;重点&#xff09;2.range3.默认窗口 四、常用窗口函数示例1.row_number & rank &…

开源推荐榜【Taichi 专为高性能计算机图形学设计的编程语言】

Taichi是一个高性能的并行编程语言&#xff0c;它被嵌入在Python中&#xff0c;使得开发者能够轻松编写可移植的、高性能的并行程序。这个库的核心优势在于它能够将计算密集型的Python代码在运行时通过即时编译器(Just-In-Time, JIT)转换成快速的机器代码&#xff0c;从而加速P…

吴恩达2022机器学习专项课程(一) 4.1 梯度下降

问题预览 梯度下降算法的作用是&#xff1f;梯度下降的过程&#xff1f;梯度下降和最小化成本函数的联系&#xff1f;所有的成本函数都是一个形状吗&#xff1f;在非凸形状中&#xff0c;梯度下降的更新过程是&#xff1f;在非凸形状中&#xff0c;不同的初值对最小化成本函数…

使用itext-core生成PDF

1、添加引用依赖包 <dependency><groupId>com.itextpdf</groupId><artifactId>itext-core</artifactId><version>8.0.3</version><type>pom</type></dependency> 2、上代码 package com.student.demo.pdf;impor…