WanAndroid(鸿蒙版)开发的第六篇

news2024/11/28 8:40:17

前言

DevEco Studio版本:4.0.0.600

WanAndroid的API链接:玩Android 开放API-玩Android - wanandroid.com

其他篇文章参考:

1、WanAndroid(鸿蒙版)开发的第一篇

2、WanAndroid(鸿蒙版)开发的第二篇

3、WanAndroid(鸿蒙版)开发的第三篇

4、WanAndroid(鸿蒙版)开发的第四篇

5、WanAndroid(鸿蒙版)开发的第五篇

6、WanAndroid(鸿蒙版)开发的第六篇

效果

​ 

我的页面实现

从UI效果上可以看出是头部的背景+头像 和下面的业务item,因此整体可以使用RelativeContainer布局,业务item可以用column实现。

1、UI界面实现

build() {
   RelativeContainer() {
      Image($r('app.media.ic_background_mine'))
         .width('100%')
         .height(240)
         .id('imageBg')
         .alignRules({
            top: { anchor: '__container__', align: VerticalAlign.Top },
            middle: { anchor: '__container__', align: HorizontalAlign.Center }
         })

      CircleImageView({
         src: $r("app.media.ic_icon"), //本地图片资源
         radius: 60,
         border_Width: 1,
         border_Color: Color.Pink,
      }).id('imageIcon')
         .margin({ top: 50 })
         .alignRules({
            top: { anchor: '__container__', align: VerticalAlign.Top },
            middle: { anchor: '__container__', align: HorizontalAlign.Center }
         })

      Text(decodeURIComponent(this.userName))
         .fontSize(20)
         .fontColor(Color.Black)
         .fontWeight(FontWeight.Bold)
         .id('textUsername')
         .margin({ top: 20 })
         .alignRules({
            top: { anchor: 'imageIcon', align: VerticalAlign.Bottom },
            middle: { anchor: '__container__', align: HorizontalAlign.Center }
         })

      Column() {
         Row() {
            Text('我的收藏')
               .fontColor(Color.Black)
               .margin({ left: 15 })

            Image($r("app.media.ic_mine_next"))
               .width(25)
               .height(22)
               .margin({ right: 15 })
         }
         .justifyContent(FlexAlign.SpaceBetween)
         .width('100%')
         .height(50)
         .margin({ top: 10 })
         .borderRadius(10)
         .backgroundColor('#66CCCCCC')
         .onClick(() => {
            if (this.isLogin) {
               router.pushUrl({ url: 'pages/mine/MineCollectPage' })
            } else {
               router.pushUrl({
                  url: 'pages/LoginPage',
                  params: {
                     hideJump: true
                  }
               })
            }
         })

         Row() {
            Text('个人积分')
               .fontColor(Color.Black)
               .margin({ left: 15 })

            Image($r("app.media.ic_mine_next"))
               .width(25)
               .height(22)
               .margin({ right: 15 })
         }
         .justifyContent(FlexAlign.SpaceBetween)
         .width('100%')
         .height(50)
         .margin({ top: 20 })
         .borderRadius(10)
         .backgroundColor('#66CCCCCC')
         .onClick(() => {
            if (this.isLogin) {
               router.pushUrl({ url: 'pages/mine/MineIntegralPage' })
            } else {
               router.pushUrl({
                  url: 'pages/LoginPage',
                  params: {
                     hideJump: true
                  }
               })
            }
         })

         Row() {
            Text('关于我们')
               .fontColor(Color.Black)
               .margin({ left: 15 })

            Image($r("app.media.ic_mine_next"))
               .width(25)
               .height(22)
               .margin({ right: 15 })
         }
         .justifyContent(FlexAlign.SpaceBetween)
         .width('100%')
         .height(50)
         .margin({ top: 20 })
         .borderRadius(10)
         .backgroundColor('#66CCCCCC')
         .onClick(() => {
            router.pushUrl({ url: 'pages/mine/MineAboutPage' })
         })

         Row() {
            Text('退出登录')
               .fontColor(Color.Black)
               .margin({ left: 15 })

            Image($r("app.media.ic_mine_next"))
               .width(25)
               .height(22)
               .margin({ right: 15 })
         }
         .justifyContent(FlexAlign.SpaceBetween)
         .width('100%')
         .height(50)
         .margin({ top: 20 })
         .borderRadius(10)
         .backgroundColor('#66CCCCCC')
         .visibility(this.isLogin ? Visibility.Visible : Visibility.None)
         .onClick(() => {
            this.dialogController.open()
         })

      }.id('columnSetting')
      .padding({ left: 10, right: 10 })
      .alignRules({
         top: { anchor: 'imageBg', align: VerticalAlign.Bottom },
         middle: { anchor: '__container__', align: HorizontalAlign.Center }
      }).width('100%')
   }
   .backgroundColor(Color.White)
   .width('100%')
   .height('100%')
}

2、退出登录弹窗

private dialogController = new CustomDialogController({
   builder: LoginOutDialog({ onLoginOut: () => {
      this.onLoginOut()
   } }),
   customStyle: true,
   alignment: DialogAlignment.Center,
})

3、执行退出登录请求

private onLoginOut() {
   HttpManager.getInstance()
      .request<LoginOutBean>({
         method: RequestMethod.GET,
         url: 'https://www.wanandroid.com/user/logout/json' //wanAndroid的API:Banner
      })
      .then((result: LoginOutBean) => {
         LogUtils.info(TAG, "result: " + JSON.stringify(result))
         if (result.errorCode == 0) {
            this.clearUserData()
            //跳转到登录界面
            router.replaceUrl({ url: 'pages/LoginPage' })
         }
      })
      .catch((error) => {
         LogUtils.info(TAG, "error: " + JSON.stringify(error))
      })
}

4、清除用户数据

private clearUserData() {
   AppStorage.Set(Constants.APPSTORAGE_USERNAME, '')
   AppStorage.Set(Constants.APPSTORAGE_PASSWORD, '')
   AppStorage.Set(Constants.APPSTORAGE_ISLOGIN, false)
}

我的收藏

1、获取收藏数据

private getCollectData() {
   HttpManager.getInstance()
      .request<CollectBean>({
         method: RequestMethod.GET,
         header: { "Cookie": `loginUserName=${this.userName}; token_pass=${this.token_pass}` },
         url: `https://www.wanandroid.com/lg/collect/list/${this.pageNum}/json` //wanAndroid的API:积分排行
      })
      .then((result: CollectBean) => {
         LogUtils.info(TAG, "getCollectData  result: " + JSON.stringify(result))
         if (this.isRefresh) {
            this.controller.finishRefresh()
         } else {
            this.controller.finishLoadMore()
         }
         if (result.errorCode == 0) {
            if (this.isRefresh) {
               this.collectListData = result.data.datas
            } else {
               if (result.data.datas.length > 0) {
                  this.collectListData = this.collectListData.concat(result.data.datas)
               } else {
                  promptAction.showToast({ message: '没有更多数据啦!' })
               }
            }
         }
         this.dialogController.close()
      })
      .catch((error) => {
         LogUtils.info(TAG, "error: " + JSON.stringify(error))
         if (this.isRefresh) {
            this.controller.finishRefresh()
         } else {
            this.controller.finishLoadMore()
         }
         this.dialogController.close()
      })
}

2、UI界面实现

build() {
      Column() {
         AppTitleBar({ title: "我的收藏" })

         RefreshListView({
            list: this.collectListData,
            controller: this.controller,
            isEnableLog: true,
            paddingRefresh: { left: 10, right: 10, top: 5, bottom: 5 },
            refreshLayout: (item: CollectItemBean, index: number): void => this.itemLayout(item, index),
            onItemClick: (item: CollectItemBean, index: number) => {
               LogUtils.info(TAG, "点击了:index: " + index + " item: " + item)
               router.pushUrl({
                  url: 'pages/WebPage',
                  params: {
                     title: item.title,
                     uriLink: this.isValidUrl(item.link) ? item.link : 'https://www.wanandroid.com/' + item.link  //规避部分情况下偶现link链接不完整
                  }
               }, router.RouterMode.Single)
            },
            onRefresh: () => {
               //下拉刷新
               this.isRefresh = true
               this.pageNum = 0
               this.getCollectData()
            },
            onLoadMore: () => {
               //上拉加载
               this.isRefresh = false
               this.pageNum++
               this.getCollectData()
            }
         }).flexShrink(1)
      }
      .width('100%')
      .height('100%')
      .backgroundColor('#F1F3F5')
   }

   @Builder
   itemLayout(item: CollectItemBean, index: number) {
      RelativeContainer() {
         //标题
         Text(HtmlUtils.formatStr(item.title))
            .fontColor('#333333')
            .fontWeight(FontWeight.Bold)
            .maxLines(2)
            .textOverflow({
               overflow: TextOverflow.Ellipsis
            })
            .fontSize(20)
            .id("textTitle")
            .alignRules({
               top: { anchor: 'textAuthor', align: VerticalAlign.Bottom },
               left: { anchor: '__container__', align: HorizontalAlign.Start }
            })

         //更新时间
         Text("作者:" + item.author /*+ "\t分类:" + item.chapterName*/ + "\t\t收藏时间:" + item.niceDate)
            .fontColor('#666666')
            .fontSize(14)
            .id("textNiceDate")
            .alignRules({
               bottom: { anchor: '__container__', align: VerticalAlign.Bottom },
               left: { anchor: '__container__', align: HorizontalAlign.Start }
            })
      }
      .width('100%')
      .height(90)
      .padding(10)
      .borderRadius(10)
      .backgroundColor(Color.White)
   }

个人积分

1、获取积分数据

private getIntegralData() {
   HttpManager.getInstance()
      .request<IntegralBean>({
         method: RequestMethod.GET,
         header: { "Cookie": `loginUserName=${this.userName}; token_pass=${this.token_pass}` },
         url: `https://www.wanandroid.com/lg/coin/userinfo/json` //wanAndroid的API:积分排行
      })
      .then((result: IntegralBean) => {
         this.IntegralDataState = true
         LogUtils.info(TAG, "getIntegralData  result: " + JSON.stringify(result))
         if (result.errorCode == 0) {
            this.userIntegralData = result.data
         }
         LogUtils.info(TAG, "IntegralDataState: " + this.IntegralDataState + "  LeaderboardDataState: " + this.LeaderboardDataState)
         if (this.IntegralDataState && this.LeaderboardDataState) {
            this.dialogController.close()
         }
      })
      .catch((error) => {
         this.IntegralDataState = true
         LogUtils.info(TAG, "error: " + JSON.stringify(error))
         LogUtils.info(TAG, "IntegralDataState: " + this.IntegralDataState + "  LeaderboardDataState: " + this.LeaderboardDataState)
         if (this.IntegralDataState && this.LeaderboardDataState) {
            this.dialogController.close()
         }
      })
}

//积分排行
private getLeaderboardData() {
   HttpManager.getInstance()
      .request<LeaderboardBean>({
         method: RequestMethod.GET,
         header: {
            "Content-Type": "application/json"
         },
         url: `https://www.wanandroid.com/coin/rank/1/json` //wanAndroid的API:积分排行
      })
      .then((result: LeaderboardBean) => {
         this.LeaderboardDataState = true
         LogUtils.info(TAG, "getLeaderboardData  result: " + JSON.stringify(result))
         if (result.errorCode == 0) {
            this.leaderboardListData = result.data.datas
         }
         LogUtils.info(TAG, "IntegralDataState: " + this.IntegralDataState + "  LeaderboardDataState: " + this.LeaderboardDataState)
         if (this.IntegralDataState && this.LeaderboardDataState) {
            this.dialogController.close()
         }
      })
      .catch((error) => {
         this.LeaderboardDataState = true
         LogUtils.info(TAG, "error: " + JSON.stringify(error))
         LogUtils.info(TAG, "IntegralDataState: " + this.IntegralDataState + "  LeaderboardDataState: " + this.LeaderboardDataState)
         if (this.IntegralDataState && this.LeaderboardDataState) {
            this.dialogController.close()
         }
      })
}

2、UI界面实现

build() {
   Column() {
      AppTitleBar({ title: '个人积分' })

      Row() {
         Text('个人积分信息')
            .fontSize(20)
            .fontWeight(FontWeight.Bold)

         Text('积分获取列表 >>')
            .fontSize(14)
            .fontColor('#66666666')
            .fontWeight(FontWeight.Bold)
            .onClick(() => {
               router.pushUrl({ url: 'pages/mine/PointAcquisitionPage' })
            })
      }
      .width('100%')
      .justifyContent(FlexAlign.SpaceBetween)
      .height(50)
      .padding({ left: 15, right: 15 })
      .backgroundColor('#66CCCCCC')

      Stack() {
         Column() {
            Text(decodeURIComponent(this.userName))
               .fontColor(Color.Black)
               .fontSize(28)
               .margin({ top: 5, bottom: 5 })
               .fontWeight(FontWeight.Bold)

            Text('积分:' + this.userIntegralData.coinCount)
               .fontColor(Color.Red)
               .margin({ top: 10, bottom: 10 })
               .fontSize(20)

            Text('等级:' + this.userIntegralData.level)
               .fontColor(Color.Green)
               .margin({ top: 10, bottom: 10 })
               .fontSize(20)

            Text('排名:' + this.userIntegralData.rank)
               .fontColor('#1296db')
               .margin({ top: 10, bottom: 10 })
               .fontSize(20)
         }
         .alignItems(HorizontalAlign.Start)
         .padding(10)
         .borderRadius(10)
         .backgroundColor('#F1F3F5')
         .width('100%')
      }.width('100%')
      .padding({ left: 10, right: 10, top: 15, bottom: 15 })

      //积分排行榜
      Row() {
         Text('积分排行榜')
            .fontSize(20)
            .fontWeight(FontWeight.Bold)

         Text('更多信息 >>')
            .fontSize(14)
            .fontColor('#66666666')
            .fontWeight(FontWeight.Bold)
            .onClick(() => {
               router.pushUrl({ url: 'pages/mine/LeaderboardPage' })
            })
      }
      .width('100%')
      .justifyContent(FlexAlign.SpaceBetween)
      .height(50)
      .padding({ left: 15, right: 15 })
      .backgroundColor('#66CCCCCC')

      if (this.leaderboardListData.length > 3) {
         LeaderboardItemLayout({ item: this.leaderboardListData[0] }).padding(10)
         LeaderboardItemLayout({ item: this.leaderboardListData[1] }).padding(10)
         LeaderboardItemLayout({ item: this.leaderboardListData[2] }).padding(10)
      }

   }
   .width('100%')
   .height('100%')
}

3、效果

关于我们界面实现

1、效果

2、原理分析

要实现‘关于我们’文字和背景图片随着手指滑动而变化的效果。监听最外层布局的滑动事件,然后动态设置绝对偏移量(通过position方法实现)。

图片设置绝对偏移量

Image($r('app.media.ic_background_mine'))
   .width('100%')
   .height(this.imageHeight)
   .position({ x: 0, y: this.offsetY - this.pullMaxHeight })

‘关于我们’文字根据滑动距离动态设置大小

Text('关于我们')
   .fontColor(Color.White)
   .fontSize(this.fontSize)
   .position({ x: this.textInitialX, y: this.textInitialY + this.textPositionY })

底部内容设置绝对偏移量

Column() {
           //......
         }
         .padding(10)
         .position({ y: this.imageHeight + this.offsetY - this.pullMaxHeight })

3、详细代码

import LogUtils from '@app/BaseLibrary/src/main/ets/utils/LogUtils'
import router from '@ohos.router';

const TAG = 'MineAboutPage--- ';

/**
 * 关于我们
 */
@Entry
@Component
struct MineAboutPage {
   // 列表y坐标偏移量
   @State offsetY: number = 0
   // 按下的y坐标
   private downY = 0
   // 上一次手指抬起后的背景偏移量
   private lastUpOffsetY = 0
   //上一次手指抬起后的文字偏移量
   private lastUpTextPositionY = 0
   // 下拉的最大高度
   private pullMaxHeight: number = 100
   //收缩后title的高度
   private pushMaxHeight: number = 56
   //图片高度
   private imageHeight: number = 300
   //文字初始偏移量,x
   private textInitialX: number = 60
   //文字初始偏移量,y
   private textInitialY: number = 60
   //文字初始大小
   private textFontSize: number = 40
   @State fontSize: number = this.textFontSize
   @State textPositionY: number = 0
   @State pushStatus: boolean = false

   build() {
      Column() {
         Stack() {
            Image($r('app.media.ic_background_mine'))
               .width('100%')
               .height(this.imageHeight)
               .position({ x: 0, y: this.offsetY - this.pullMaxHeight })

            Image($r('app.media.ic_back_white'))
               .width(26)
               .height(26)
               .margin({ left: 20, right: 20, top: 15 })
               .onClick(() => {
                  router.back()
               })

            Text('关于我们')
               .fontColor(Color.White)
               .fontSize(this.fontSize)
               .position({ x: this.textInitialX, y: this.textInitialY + this.textPositionY })
         }
         .alignContent(Alignment.TopStart)
         .width('100%')
         .height(this.imageHeight - this.pullMaxHeight)
         .id('stackHeader')
         .alignRules({
            left: { anchor: '__container__', align: HorizontalAlign.Start },
            top: { anchor: '__container__', align: VerticalAlign.Top }
         })

         Column() {
            Text("APP介绍:")
               .fontColor(Color.Black)
               .fontSize(25)
               .fontWeight(FontWeight.Bold)
               .alignSelf(ItemAlign.Start)
            Text("\t这是一款鸿蒙应用,基于鸿洋大佬WanAndroid的API进行开发,目前主要功能包括:登录、注册,搜索,首页,导航,项目,个人信息等模块。")
               .lineHeight(25)
               .fontSize(20)
               .fontColor(Color.Black)
               .margin({ top: 10 })
            Text() {
               Span('\t可以在').fontSize(20)
               Span('WanAndroid(鸿蒙)')
                  .decoration({ type: TextDecorationType.Underline, color: Color.Blue }).fontSize(18)
                  .onClick(() => {
                     router.pushUrl({
                        url: 'pages/WebPage',
                        params: {
                           title: 'WanAndroid(鸿蒙)',
                           uriLink: 'https://blog.csdn.net/abner_crazy/category_12565384.html',
                           isShowCollect: false,
                        }
                     }, router.RouterMode.Single)
                  })
                  .fontColor(Color.Blue)
               Span('专栏中关注项目相关介绍,后续会在该专栏中更新项目开发相关知识点,欢迎大家在专栏下方留言进行沟通交流。')
                  .fontSize(20)
            }
            .lineHeight(25)
            .margin({ top: 20 })

         }
         .padding(10)
         .position({ y: this.imageHeight + this.offsetY - this.pullMaxHeight })
      }
      .onTouch((event) => this.touchEvent(event))
      .width('100%')
      .height('100%')

   }

   touchEvent(event: TouchEvent) {
      switch (event.type) {
         case TouchType.Down: // 手指按下
         // 记录按下的y坐标
            this.downY = event.touches[0].y
            break
         case TouchType.Move: // 手指移动
            this.touchMovePull(event.touches[0].y)
            break
         case TouchType.Up: // 手指抬起
         case TouchType.Cancel: // 触摸意外中断
            if (this.offsetY > 0) {
               this.pushStatus = false
               this.setOriginalStatus()
            } else { //手指抬起后在初始态上面,即上划
               this.pushStatus = true
               this.lastUpOffsetY = this.offsetY
               this.lastUpTextPositionY = this.textPositionY
            }
            break
      }
   }

   // 手指移动,处理下拉
   touchMovePull(touchesY: number) {
      //最大差值
      let maxHeight = this.imageHeight - this.pullMaxHeight - this.pushMaxHeight
      // 滑动的偏移量
      let offset = touchesY - this.downY

      // 偏移量的值缓慢增加
      let height = offset * 0.50
      if (this.pushStatus) {
         this.offsetY = height + this.lastUpOffsetY > this.pullMaxHeight ? this.pullMaxHeight : height + this.lastUpOffsetY
      } else {
         this.offsetY = height > this.pullMaxHeight ? this.pullMaxHeight : height
      }
      LogUtils.info(TAG, " offsetY: " + this.offsetY + " height: " + height + "  lastUpOffsetY: " + this.lastUpOffsetY)

      //滑到title高度停止
      if (this.offsetY < -maxHeight) {
         this.offsetY = -maxHeight
      }

      //文字Y轴偏移量
      if (this.pushStatus) {
         this.textPositionY = this.lastUpTextPositionY + offset * 0.16 /*> 104 ? 104 : this.lastUpTextPositionY + offset * 0.16*/
      } else {
         this.textPositionY = offset * 0.16
      }

 
      if (this.textPositionY < -42) {
         this.textPositionY = -42
      }

     
      if (this.textFontSize + this.textPositionY * 0.4762 <= this.textFontSize) {
         this.fontSize = this.textFontSize + this.textPositionY * 0.4762
      } else {
         this.fontSize = this.textFontSize
      }

      LogUtils.info(TAG, "touchMovePull   offsetY: " + this.offsetY + " textPositionY: "
         + this.textPositionY + "  pushStatus: " + this.pushStatus + "    fontSize: " + this.fontSize)
   }

   setOriginalStatus() {
      animateTo({
         duration: 300,
      }, () => {
         this.offsetY = 0
         this.textPositionY = 0
      })
   }
}

总结:

到这篇文章为止整个WanAndroid(鸿蒙)版本的功能开发基本完成了,后续会继续更新一些优化点,大家可以关注后面更新内容~~

源代码地址:WanHarmony: WanAndroid的鸿蒙版本

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

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

相关文章

自然语言处理学习总结

目录 1、词表示 2、语言模型&#xff08;LM&#xff09; 3、常用学习网址 自然语言处理 1、词表示 词表示&#xff1a;自然语言中最基本的语言单位表示成机器理解的方式 方式一&#xff1a;词与词之间的相似度 方式二&#xff1a;词与词之间的关系 词义的表示方法&…

Linux 服务升级:MySQL 主从(半同步复制) 平滑升级

目录 一、实验 1.环境 2.Mysql-shell 检查工具兼容性 3.逻辑备份MySQL数据 4.备份MySQL 数据目录、安装目录、配置文件 5.MySQL 升级 6.master节点 使用systemd管理mysql8 7. slave1 节点升级 8. slave2 节点升级 9.半同步设置 二、问题 1.mysqldump备份报错 2.Inn…

FPGA控制AD7606_AD7606解读

目录 一、AD7606解读二、引脚说明三、时序图 一、AD7606解读 AD7606特点&#xff1a; 8通道同步采样模拟通道数为8分辨率&#xff1a;16bit&#xff0c;即最小采样的电压为5V/(2^16) 0,00007V&#xff0c;即数字量的1就代表模拟量的0,00007V&#xff0c;2代表0,00014V有效位数…

Android14 - AMS之Activity启动过程(3)

Android14 - AMS之Activity启动过程&#xff08;1&#xff09;-CSDN博客 Android14 - AMS之Activity启动过程&#xff08;2&#xff09;-CSDN博客 上篇中我们梳理完ActivityStarter的startActivityInner&#xff0c;本篇从这里开始&#xff1a; platform/frameworks/base/servi…

Linux实践 - 命令行解释器 简易版

~~~~ 前言解决的问题为什么shell要以子进程的方式执行我们的命令&#xff1f;为什么直接使用程序名ls&#xff0c;而不是路径/usr/bin/ls&#xff1f; 头文件包含命令行提示符接受用户命令行输入解析用户的输入内建命令&&特殊处理ls 时目录等文件不带高亮颜色cd时目录不…

[OpenCV学习笔记]获取鼠标处图像的坐标和像素值

目录 1、介绍2、效果展示3、代码实现4、源码展示 1、介绍 实现获取鼠标点击处的图像的坐标和像素值&#xff0c;灰度图显示其灰度值&#xff0c;RGB图显示rgb的值。 OpenCV获取灰度值及彩色像素值的方法&#xff1a; //灰度图像&#xff1a; image.at<uchar>(j, i) //j…

学习笔记Day12:初探LInux 2

Linux初探 同一个目录中不允许出现文件及文件夹重名 查看文件 cat &#xff08;Concatenate&#xff09;查看文本文件内容&#xff0c;输出到屏幕&#xff08;标准输出流&#xff09; 常用参数 -A打印所有字符&#xff0c;包括特殊字符&#xff08;换行符、制表符等&#xff…

前端项目,个人笔记(三)【Vue-cli - api封装-axios使用举例】

目录 前言 1、axios配置与测试 1.1、配置 1.2、测试 2、使用axios案例-渲染header 3、Pinia优化重复请求 3.1、为什么&#xff1f; 3.2、使用Pinia优化代码步骤 步骤一&#xff1a;在main.js中创建 Pinia 实例&#xff0c;并将其作为插件添加到 Vue 应用中 步骤二&am…

redis和rabbitmq实现延时队列

redis和rabbitmq实现延时队列 延迟队列使用场景Redis中zset实现延时队列Rabbitmq实现延迟队列 延迟队列使用场景 1. 订单超时处理 延迟队列可以用于处理订单超时问题。当用户下单后&#xff0c;将订单信息放入延迟队列&#xff0c;并设置一定的超时时间。如果在超时时间内用户…

【LabVIEW FPGA入门】使用FPGA实现串行同步接口(SSI)

SSI&#xff08;串行同步接口&#xff09;是连接绝对位置传感器和控制器的广泛应用的串行接口。SSI利用控制器发出一个时钟脉冲序列&#xff0c;初始化传感器的门限输出。 传感器不断更新位置数据&#xff0c;并传送到移位寄存器中。在每一个时钟脉冲序列之间&#xff…

了解常见字符函数

乐观学习&#xff0c;乐观生活&#xff0c;才能不断前进啊&#xff01;&#xff01;&#xff01; 我的主页&#xff1a;optimistic_chen 我的专栏&#xff1a;c语言 点击主页&#xff1a;optimistic_chen和专栏&#xff1a;c语言&#xff0c; 创作不易&#xff0c;大佬们点赞鼓…

.NET 异步编程(异步方法、异步委托、CancellationToken、WhenAll、yield)

文章目录 异步方法异步委托async方法缺点CancellationTokenWhenAllyield 异步方法 “异步方法”&#xff1a;用async关键字修饰的方法 异步方法的返回值一般是Task<T>&#xff0c;T是真正的返回值类型&#xff0c;Task<int>。惯例&#xff1a;异步方法名字以 Asy…

浅析ArcGis中的软件——ArcMap、ArcScene、 ArcGlobe、ArcCatalog

为什么要写这么一篇介绍ArcGis的文章呢&#xff1f;因为大部分人也包括ArcGisdada&#xff0c;在使用ArcMap应用程序创建工程时总以为我们就是使用了ArcGis这个软件的所有。其实不然&#xff0c;在后期的接触和使用中慢慢发现原来ArcMap只是ArcGis这个综合平台的一部分&#xf…

HarmonyOS NEXT应用开发之动态路由

介绍 本示例将介绍如何使用动态路由跳转到模块中的页面&#xff0c;以及如何使用动态import的方式加载模块 使用说明 通过动态import的方式&#xff0c;在需要进入页面时加载对应的模块。配置动态路由&#xff0c;通过WrapBuilder接口&#xff0c;动态创建页面并跳转。动态i…

2024.3.19

思维导图 模拟面试 1.友元的作用 答&#xff1a;通过关键字friend&#xff0c;可以让一些函数或者类&#xff0c;可以访问一个类中的私有数据成员。 2.匿名对象的作用 答&#xff1a;匿名对象就是没有名字的对象&#xff0c;是用来给有名对象进行初始化工作的。 3.常成员函…

【S5PV210】 | GPIO编程

【S5PV210】 | GPIO编程 时间:2024年3月17日22:02:32 目录 文章目录 【`S5PV210`】 | `GPIO`编程目录1.参考2.`DataSheet`2.1.概述2.1.1.特色2.1.2 输入/输出配置2.1.3 `S5PV210` 输入/输出类型2.1.4 IO驱动强度**2.1.4.1 类型A IO驱动强度****2.1.4.2 类型A IO驱动强度****2…

安泰电子:前置微小信号放大器是什么东西

前置微小信号放大器是一种用于放大微弱信号的设备&#xff0c;在电子和通信领域中有广泛的应用。它的主要功能是将输入的微小信号放大到足够的水平&#xff0c;以便后续电路能够准确地测量、处理和分析这些信号。本文将详细介绍前置微小信号放大器的原理、组成部分和应用领域。…

目标检测——PP-PicoDet算法解读

PP-YOLO系列&#xff0c;均是基于百度自研PaddlePaddle深度学习框架发布的算法&#xff0c;2020年基于YOLOv3改进发布PP-YOLO&#xff0c;2021年发布PP-YOLOv2和移动端检测算法PP-PicoDet&#xff0c;2022年发布PP-YOLOE和PP-YOLOE-R。由于均是一个系列&#xff0c;所以放一起解…

AutoSAR配置与实践(深入篇)10.3 CANTP 传输流程和通信示例

AutoSAR配置与实践(深入篇)10.3 CANTP 通信示例 CANTP 通信示例一、诊断传输流程1.1上位机请求流程1.2 ECU反馈流程二、CANTP 通信示例2.1 通信交互详解CANTP 通信示例 ->返回总目录<- 一、诊断传输流程 1.1上位机请求流程 Step 1. Tester(诊断上位机)通过物理总线…

线程,你真的懂了吗?

大家都知道的是线程其实分为的是内核级线程和用户级线程&#xff0c;这几天在看线程的时候&#xff0c;突然有一种感觉不太明白的地方&#xff0c;那就是linux中pthread.h这个库中的线程到底是用户级还是内核级&#xff0c;后来在网上也搜了很多的例子。我自我认为是看不懂的&a…