【鸿蒙】HarmonyOS NEXT应用开发快速入门教程之布局篇(上)
系列文章目录
【鸿蒙】HarmonyOS NEXT开发快速入门教程之ArkTS语法装饰器(上)
【鸿蒙】HarmonyOS NEXT开发快速入门教程之ArkTS语法装饰器(下)
【鸿蒙】HarmonyOS NEXT应用开发快速入门教程之布局篇(上)
文章目录
- 系列文章目录
- 前言
- 一、ArkTs布局代码位置和写法规则
- 二、ArkTS 常见布局介绍
- 三、ArkTS 组件通用信息
- (1)通用事件:
- (2)通用属性
- (3)手势处理
- 四、常见布局详细使用
- (1)线性布局(Row、Column)
- 1.1、Row\Column 入参:
- 1.2、Row\Column自带属性
- 示例1:
- 示例2:
- 示例3:
- 示例4:
- 示例5:
- (2)层叠布局(Stack)
- 1、 通过如下示例理解层叠布局效果:
- 2、Stack 入参
- 3、改变示例里面显示位置看看所有枚举值渲染情况
- (1)TopStart
- (2)Top
- (3)TopEnd
- (4)Start
- (5)Center
- (6)End
- (7)BottomStart
- (8)Bottom
- (9)BottomEnd
- 4、搭配通用属性position和translate实现css绝对布局效果
- 示例1:
- 示例2:
- (3)弹性布局(Flex)
- 入参:
- 示例1:
- 示例2:
- 示例3:
- 总结
- Flex布局和线性布局(Row、Column)区别和优劣选择:
- 四、总结
- 五、未完待更
前言
HarmonyOS NEXT(鸿蒙应用)开发快速入门教程之布局篇,基于HarmonyOS NEXT Beta1版本(api 12)讲解。
本文将从前端开发者角度来学习鸿蒙的布局语法,通过类比鸿蒙布局和web css布局相似之处,帮助大家快速掌握鸿蒙布局开发。鸿蒙的布局方式跟css非常相似,主要还是以flex布局为基调,搭配相对、绝对、层叠布局实现大部分场景。鸿蒙自带的系统组件更为丰富,扩展的属性很多,功能更强大,像衍生出的布局类组件有Swiper(轮播)、Tabs(选项卡)、List(列表)、Grid(网格)有着丰富的配置来满足各种定制化需求。
一、ArkTs布局代码位置和写法规则
从HarmonyOS NEXT开发快速入门教程之ArkTS语法装饰器(上)这篇博文知道布局主要在build函数里面写入,父子组件标签嵌套的方式写布局,跟html一样。组件的属性和事件跟jq一样通过链式调用。build函数内只能有一个根组件,跟vue2 template一样。
二、ArkTS 常见布局介绍
声明式UI提供了以下9种常见布局:
1、线性布局(Row、Column):
线性布局就是子元素按照水平或者垂直2种方向按顺序排列,其中Row为水平方向容器,Column为垂直方向容器,最常用布局方式,没有之一。
2、层叠布局(Stack)
层叠布局类似css绝对布局或Fixed布局,在Stack容器内子元素依次入栈,后一个子元素覆盖前一个子元素上面,子元素可以叠加,也可以设置相对父容器位置。不会占用或影响同容器内其子组件的布局空间。
3、弹性布局(Flex)
相当于css flex布局,用法几乎一样,也和线性布局类似,区别在于弹性布局默认能够使子组件压缩或拉伸。在子组件需要计算拉伸或压缩比例时优先使用此布局,可使得多个容器内子组件能有更好的视觉上的填充容器效果。
4、相对布局(RelativeContainer)
跟安卓相对布局类似,设置兄弟组件或父组件为锚点,基于锚点做相对位置布局。相对布局面对复杂的界面可以减少多层次组件嵌套,有效的提升性能,减少时间开销。
5、栅格布局(GridRow、GridCol)
跟elementUI el-row el-col相似,将空间分割为有规律的栅格。栅格不同于网格布局固定的空间划分,它可以实现不同设备下不同的布局
6、媒体查询(@ohos.mediaquery)
跟css媒体查询类似,可根据不同设备类型或同设备不同状态修改应用的样式。
7、列表(List)
官方归为布局之一,实际上就是一个 列表组件
8、网格(Grid)
网格组件,类似css网格布局
9、轮播(Swiper)
官方归为布局之一,实际上就是一个轮播组件
三、ArkTS 组件通用信息
组件通用信息指的是所有组件(或大部分组件)都共有的一些信息特性,包括通用事件、通用属性、手势处理三种类型。
(1)通用事件:
比如点击事件、触摸事件,所有组件都能触发,都可以绑定监听事件
例如:
build() {Column() {}.onClick((event: ClickEvent) => {console.log('点击事件')}).onTouch((event: TouchEvent) => {console.log('触摸事件')})}
所有通用事件如下:
详细介绍可查阅官方文档:通用事件
(2)通用属性
组件通用属性跟组件布局关系比较大,通用属性大部分类似css属性,可以对组件布局进行控制,例如组件宽高、边框、背景等设置。
例如:
build() {Column() {}.width(500) //宽.height(200) //高.backgroundColor(Color.Black) //背景色.border({ width: 1, color: Color.Red }) //边框.borderRadius(10) //圆角.opacity(0.5) //透明度.visibility(Visibility.Visible) //是否可见}
所有通用属性:
详细介绍可查阅官方文档:通用属性
(3)手势处理
一些手势操作监听处理,比如长按、双击、拖拽、捏合等,具体可看:手势处理官方文档
四、常见布局详细使用
(1)线性布局(Row、Column)
线性布局是日常开发最常用的一种布局方式。可以看成简化版flex布局,支持设置子组件在主轴方向上的对齐方式. justifyContent()和垂直轴方向上的对齐方式.alignItems(),且性能优于flex布局,所以也是最优先选择的布局方式。
Row:主轴为水平方向,子元素从左到右或从右向左依次排列的容器,相当于html 中设置了 display: flex; flex-direction: row 的div
Column :主轴为垂直方向,子元素从上到下或从下向上依次排列的容器,相当于html 中设置了 display: flex; flex-direction: column的div
1.1、Row\Column 入参:
Row\Column(value?:{space?: number | string }):设置主轴方向上子元素之间的间距
例如:
build() {Column({ space: 10 }) {Button('按钮1')Button('按钮2')Button('按钮3')}}
注意:
justifyContent设置为FlexAlign.SpaceBetween、FlexAlign.SpaceAround、FlexAlign.SpaceEvenly时不生效,默认值:0,单位vp
1.2、Row\Column自带属性
-
alignItems(value: VerticalAlign) 设置子组件在相对主轴垂直方向上的对齐方式。
-
value值支持如下枚举值:
默认值VerticalAlign.Center -
justifyContent(value: FlexAlign) 设置子组件在主轴方向上的对齐方式。
-
value值支持如下枚举值:
默认值FlexAlign.Start -
reverse(isReversed: Optional) 设置子组件在主轴上的排列是否反转.(相当于css flex-direction: row-reverse(column-reverse);)
配合上通用属性——flexBasis、flexGrow、flexShrink、alignSelf就是个简化版的flex
通过上面表格可以看出justifyContent可选值跟css flex justifyContent一样而alignItems可选值就有区别只有3个而且名称由start变成top end变成bottom。
示例1:
justifyContent(FlexAlign.SpaceBetween)
@Entry
@Component
struct Demo {build() {Column() {Row() {Image($r('app.media.arrow_left')).width(28)Text('商品详情')Image($r('app.media.icon_share3')).width(28)}.width('100%').height(50).justifyContent(FlexAlign.SpaceBetween).padding({top:0,bottom:0,left:15,right:15})}}
}
运行效果:
说明:上述示例三段式常见的布局方式
示例2:
.alignItems(HorizontalAlign.Center) 、 .justifyContent(FlexAlign.Center)、.alignSelf(ItemAlign.Start) 、.alignSelf(ItemAlign.End)
/*** 自定义Row通用样式*/
@Extend(Row)
function customRow() {.width(300).height(100).justifyContent(FlexAlign.Center).backgroundColor(Color.Orange).borderRadius(20)
}@Entry
@Component
struct Demo {build() {Column({ space: 20 }) {Row({space:30}) {Text('A')Text('B')}.customRow()Row({space:30}) {Text('A')Text('B')}.customRow()Row({space:30}) {Text('A')Text('B')}.customRow().alignSelf(ItemAlign.Start)Row({space:30}) {Text('A')Text('B')}.customRow().alignSelf(ItemAlign.End)}.width('100%').alignItems(HorizontalAlign.Center).padding(20)}
}
运行效果:
说明:上图示例中父组件设置了 .alignItems(HorizontalAlign.Center),子组件默认在水平方向上居中对齐,通过设置alignSelf(),可以单独设置某个子组件对齐方式,如示例所示第三、第四个Item就分别单独设置了居左(ItemAlign.Start)和居右(ItemAlign.End)显示。
示例3:
.flexGrow(1)、justifyContent(FlexAlign.SpaceBetween)
@Entry
@Component
struct Demo {build() {Column() {Row({space:10}) {Text('地址:').fontSize(14).fontWeight(600)Text('福建省厦门市思明区').height('100%').fontSize(14).fontColor('#666').flexGrow(1).textAlign(TextAlign.End).backgroundColor('#F0F0F0')Image($r('app.media.arrow_right')).width(22)}.width('100%').height(50).justifyContent(FlexAlign.SpaceBetween).border({width: {bottom: 1}, color: '#dedede'})}.padding({top:10,left:18,right:18})}
}
运行效果:
说明:上述示例中省市区文字的组件Text通过设置flexGrow(1)拉伸占满父容器剩余水平方向上所有空间。
示例4:
.justifyContent(FlexAlign.SpaceEvenly)、.justifyContent(FlexAlign.SpaceAround)、.justifyContent(FlexAlign.SpaceBetween)
@Entry
@Component
struct Demo {
//自定义item@Builder customItem(icon:Resource,label:string){Column({space:5}){Image(icon).width(40)Text(label)}}build() {Column({space:30}) {Row(){this.customItem($r('app.media.tabbar11'),'首页')this.customItem($r('app.media.tabbar11'),'首页')this.customItem($r('app.media.tabbar11'),'首页')this.customItem($r('app.media.tabbar11'),'首页')}.width('100%').justifyContent(FlexAlign.SpaceEvenly)Row(){this.customItem($r('app.media.tabbar11'),'首页')this.customItem($r('app.media.tabbar11'),'首页')this.customItem($r('app.media.tabbar11'),'首页')this.customItem($r('app.media.tabbar11'),'首页')}.width('100%').justifyContent(FlexAlign.SpaceAround)Row(){this.customItem($r('app.media.tabbar11'),'首页')this.customItem($r('app.media.tabbar11'),'首页')this.customItem($r('app.media.tabbar11'),'首页')this.customItem($r('app.media.tabbar11'),'首页')}.width('100%').justifyContent(FlexAlign.SpaceBetween)}.padding({top:20})}
}
运行效果:
说明:.justifyContent(FlexAlign.SpaceEvenly)、.justifyContent(FlexAlign.SpaceAround)、.justifyContent(FlexAlign.SpaceBetween)每种值呈现的效果对比,item之间的间距依次变大。
三者区别:
FlexAlign.SpaceEvenly:item之间的间距相等,且第一个item与最后一个item与父容器间距等于item之间的间距
FlexAlign.SpaceAround:item之间的间距相等,且第一个item与最后一个item与父容器间距等于item之间的间距的一半
FlexAlign.SpaceBetween:item之间的间距相等,且第一个item与最后一个item与父容器间距为0
示例5:
css和ArkTS写法对照
css:
.div{display: flex;flex-direction: column;justify-content: center;align-items: center;align-self: center;flex-grow: 1;flex-shrink: 0;flex-basis: 100px;}
等价于
ArkTs:
Column() {}.justifyContent(FlexAlign.Center).alignItems(HorizontalAlign.Center).alignSelf(ItemAlign.Center).flexGrow(1).flexShrink(0).flexBasis('100px')}
说明:从上述示例可以看出ArkTs的线性布局跟css中flex设计机制、属性作用几乎一样,甚至连命名都一样,只不过换了种调用形式。
ps:友情提示属性入参都是系统定义好的枚举值例如FlexAlign.Center,这些枚举值无须去记忆,只要把鼠标放置属性上有语法提示
线性布局更多示例说明可以查阅官方文档
(2)层叠布局(Stack)
Stack容器内的子元素会脱离文档流,默认只相对于父容器(上下左右中)某个方向对齐显示而无关兄弟元素影响。后置元素层级越高,就叠在最上面所以也称层叠布局,配合通用属性position、translate使用跟css绝对布局或Fixed布局有异曲同工之妙。
1、 通过如下示例理解层叠布局效果:
示例1:
@Entry
@Component
struct Demo {build() {Stack(){Column(){}.width(200).height(200).backgroundColor(Color.Red)Column(){}.width(100).height(100).backgroundColor(Color.Orange)Column(){}.width(50).height(50).backgroundColor(Color.Blue)}.width(300).height(400).border({width:1,color:Color.Black}).margin({top:30,left:30})}
}
运行效果:
说明:默认居中显示
示例2:
@Entry
@Component
struct Demo {build() {Stack({alignContent:Alignment.TopStart}){Column(){}.width(200).height(200).backgroundColor(Color.Red)Column(){}.width(100).height(100).backgroundColor(Color.Orange)Column(){}.width(50).height(50).backgroundColor(Color.Blue)}.width(300).height(400).border({width:1,color:Color.Black}).margin({top:30,left:30})}
}
运行效果:
说明:可通过入参alignContent设置显示位置
示例3:
通过zIndex属性调整层叠顺序
@Entry
@Component
struct Demo {build() {Stack(){Column(){}.width(200).height(200).backgroundColor(Color.Red)Column(){}.width(100).height(100).backgroundColor(Color.Orange).zIndex(9)Column(){}.width(50).height(50).backgroundColor(Color.Blue)}.width(300).height(400).border({width:1,color:Color.Black}).margin({top:30,left:30})}
}
说明:可通过zIndex控制层叠显示顺序,数值越大越上面(离眼睛越近),不设置默认为0
2、Stack 入参
Stack(value?: { alignContent?: Alignment })
可设置有如下9种位置枚举值,不传默认横向纵向居中
3、改变示例里面显示位置看看所有枚举值渲染情况
(1)TopStart
(2)Top
(3)TopEnd
(4)Start
(5)Center
(6)End
(7)BottomStart
(8)Bottom
(9)BottomEnd
4、搭配通用属性position和translate实现css绝对布局效果
通用属性position和translate跟css position和translate使用类似,具体使用可查阅官方文档,这里不过多介绍
示例1:
html\css写法:
<template><div class="parent"><div class="child-left">child-left</div><div class="child-right">child-righ</div></div>
</template><style >.parent{height: 300px;width: 300px;position: relative;border: 1px solid #000; }.child-left{height: 100px;width: 100px;background-color: red;position: absolute;left:0;top:50%;transform: translateY(-50%);}.child-right{height: 100px;width: 100px;background-color: red;position: absolute;right:0;top:50%;transform: translateY(-50%);}
</style>
等价于ArkTs写法:
@Entry
@Component
struct Demo {build() {Stack({alignContent:Alignment.Start}){Column(){Text('child-left')}.width(100).height(100).backgroundColor(Color.Red)Column(){Text('child-right')}.width(100).height(100).backgroundColor(Color.Red).position({right:0,top:'50%'}).translate({x:0,y:'-50%'})}.width(300).height(400).border({width:1,color:Color.Black}).margin({top:10,left:10})}
}
运行效果:
说明:由于Stace入参只能设置一个方向,默认所有子组件对齐方式是固定的,而在css绝对布局中我们可以灵活设置子元素任意位置,想实现css这种效果,需要配合position属性单独设置某个子组件对齐方向和距离并通过translate平移到居中位置。
示例2:
实现一个悬浮按钮场景:
@Entry
@Component
struct Demo {@State list:number[]=[]aboutToAppear(): void {this.list=new Array(20).fill('')}build() {Stack({ alignContent: Alignment.BottomEnd }) {//页面内容Column() {List(){ForEach(this.list,(item:string,index:number)=>{ListItem(){Text(`${index}`)}.width('100%').height(60).border({width:1,color:'#eee'})},(index:number)=>index.toString())}}//悬浮按钮Column() {Image($r('app.media.top')).width(20)}.width(50).height(50).borderRadius(25).backgroundColor('#eee').justifyContent(FlexAlign.Center).position({right: 20,bottom: 50})}.width('100%').height('100%')}
}
运行效果:
更多的Stack示例和介绍请查看官方文档
(3)弹性布局(Flex)
弹性布局(Flex)跟css flex使用和命名上几乎完全一样,最大不同于线性布局在于写法上,Flex的设置全部是入参形式,而Row/Column通过属性。
入参:
Flex(value?: { direction?: FlexDirection, wrap?: FlexWrap, justifyContent?: FlexAlign, alignItems?: ItemAlign, alignContent?: FlexAlign })
示例1:
@Entry
@Component
struct Demo {build() {Flex({alignItems: ItemAlign.Center}) {//头像Image($r('app.media.app_icon')).width(50).borderRadius(25)//昵称+手机号Flex({direction: FlexDirection.Column,justifyContent: FlexAlign.Center}) {Text('昵称')Text('1555555555555').margin({ top: 4 })}.margin({ left: 10 }).flexGrow(1)//箭头图标Image($r('app.media.arrow_right')).width(25)}.width('100%').height(100).padding(20).backgroundColor('#f2f2f2')}
}
运行效果:
示例2:
通过wrap: FlexWrap.Wrap实现网格布局效果
@Entry
@Component
struct Demo {@State list: number[] = []aboutToAppear(): void {this.list = new Array(7).fill(0)}//自定义item@BuildercustomItem(index: number) {Flex({direction: FlexDirection.Column,alignItems: ItemAlign.Center,justifyContent: FlexAlign.Center}) {Image($r('app.media.sport')).width(40)Text(`标签${index}`).fontSize(13).margin({ top: 4 })}.height(75).constraintSize({minWidth: '25%'})}build() {Column() {Flex({direction: FlexDirection.Row,wrap: FlexWrap.Wrap,justifyContent: FlexAlign.Start}) {ForEach(this.list, (item: number, index: number) => {//itemthis.customItem(index)}, (index: number) => index.toString())}.padding(10).backgroundColor('#ffffff').borderRadius(10)}.height('100%').width('100%').backgroundColor('#f2f2f2').padding(20)}
}
运行效果:
ps:当Flex容器主轴为垂直方向时需要设置具体高度值,不然Flex会继承父元素100%高度无法自动高度
示例3:
css有个缩写属性
flex:1
它是
flex-grow: 1;
flex-shrink: 1;
flex-basis: 0%;
或
flex-grow: 1;
flex-shrink: 1;
flex-basis: 0;
的缩写,作用是使得所有子元素平均分配父元素空间
css效果:
换成ArkTs写法试试效果:
ArkTs没有flex:1缩写形式只能3个分开写
@Entry
@Component
struct Demo {build() {Column({ space: 50 }) {Flex() {Text('2344343454').flexGrow(1).flexBasis(0).flexShrink(1).backgroundColor(Color.Orange)Text('23').flexGrow(1).flexBasis(0).flexShrink(1).backgroundColor(Color.Green)Text('234434').flexGrow(1).flexBasis(0).flexShrink(1).backgroundColor(Color.Red)}.width('100%')}}
}
运行效果:
通过运行效果看,没有达到预期效果,子元素没有平均分配父元素空间,而是平均分配剩余空间。
猜想可能是flexBasis(0)没有生效,flexBasis是设置元素基准宽度, 只有所有子元素基准宽度相同通过扩大或缩小相同比例所有子元素才能均等分。
与css 不一样的是flexBasis不支持百分比
我们改成flexBasis(1)试试
@Entry
@Component
struct Demo {build() {Column({ space: 50 }) {Flex() {Text('2344343454').flexGrow(1).flexBasis(0).flexShrink(1).backgroundColor(Color.Orange)Text('23').flexGrow(1).flexBasis(0).flexShrink(1).backgroundColor(Color.Green)Text('234434').flexGrow(1).flexBasis(0).flexShrink(1).backgroundColor(Color.Red)}.width('100%')}}
}
运行效果:
是我们想要的效果,结果也验证了flexBasis(0)无效。
总结
Flex布局或者线性布局(Row\Column)想要让子元素均等分父元素空间可以使用如下写法:
子组件().flexGrow(1).flexShrink(1).flexBasis(1)
Flex布局和线性布局(Row、Column)区别和优劣选择:
1、写法上一个入参形式、一个属性形式,从代码美观和可读性看线性布局写法比较优雅。
2、Flex配置更丰富,alignItems支持Baseline、Stretch等6种类型值,并且包含direction、wrap、alignContent等入参设置更加靠近css 的flex使用习惯,能实现更多复杂的布局需求。
3、Flex组件主轴默认不设置时撑满父容器,Column、Row组件主轴不设置时默认是跟随子节点大小,这点Flex使用比较麻烦必须时刻注意设置主轴方向的宽或高。
4、Flex组件在渲染时存在二次布局过程,因此在对性能有严格要求的场景下建议使用Column、Row代替
更多Flex布局示例说明请看官方文档
四、总结
从上述讲解中我们能发现ArkTS布局几乎是借鉴css,相似度很高,该有的东西基本都有只是写法不一样罢了,这对于前端开发人员来说几乎没难度可以快速衔接上手,当然ArkTS有着更丰富的系统组件,属性、入参和事件也非常多,对于系统组件需要多花点时间学习。
五、未完待更
相关文章:
【鸿蒙】HarmonyOS NEXT应用开发快速入门教程之布局篇(上)
系列文章目录 【鸿蒙】HarmonyOS NEXT开发快速入门教程之ArkTS语法装饰器(上) 【鸿蒙】HarmonyOS NEXT开发快速入门教程之ArkTS语法装饰器(下) 【鸿蒙】HarmonyOS NEXT应用开发快速入门教程之布局篇(上) 文…...
使用 Nginx 和 Gunicorn 部署 Flask 项目详细教程
使用 Nginx 和 Gunicorn 部署 Flask 项目详细教程 在这篇文章中,我们将介绍如何使用 Nginx 和 Gunicorn 来部署一个 Flask 项目。这种部署方式非常适合在生产环境中使用,因为它能够提供更好的性能和更高的稳定性。 目录 Flask 项目简介环境准备Gunico…...
linux中bashrc和profile环境变量在Shell编程变量的传递作用
在 Linux 系统中,.bashrc文件和.profile文件都是用于配置用户环境的重要文件,它们之间有以下关联: 一、作用相似性 环境设置:两者都用于设置用户的环境变量和启动应用程序的配置。例如,它们可以定义路径变量…...
数据结构-4.2.串的定义和基本操作
一.串的定义: 1.单/双引号不是字符串里的内容,他只是一个边界符,用来表示字符串的头和尾; 2.空串也是字符串的子串,空串长度为0; 3.字符的编号是从1开始,不是0; 4.空格也是字符&a…...
fastzdp_redis第一次开发, 2024年9月26日, Python操作Redis零基础快速入门
提供完整录播课 安装 pip install fastzdp_redisPython连接Redis import redis# 建立链接 r redis.Redis(hostlocalhost, port6379, db0)# 设置key r.set(foo, bar)# 获取key的值 print(r.get(foo))RESP3 支持 简单的理解: 支持更丰富的数据类型 参考文档: https://blog.c…...
文件名:\\?\C:\Windows\system32\inetsrv\config\applicationHost.config错误:无法写入配置文件
文件名: \\?\C:\Windows\system32\inetsrv\config\applicationHost.config 错误:无法写入配置文件 解决办法: 到C:\inetpub\history中找到最近一次的【CFGHISTORY_00000000XX】文件,点击进去找到applicationHost.config文件,用其覆盖C:\Win…...
Optiver股票大赛Top2开源!
Optiver股票大赛Top2开源! ↑↑↑关注后"星标"kaggle竞赛宝典 作者:杰少 Optiver第二名方案解读 简介 Optiver竞赛已经于今天结束了,竞赛也出现了极端情况,中间断崖式的情况,在Kaggle过往的竞赛中&#…...
Maven 实现依赖统一管理
Maven 实现依赖统一管理主要是通过两个关键机制:pom.xml 文件中的 <dependencies> 节点用于声明项目依赖,以及通过继承(Inheritance)和聚合(Aggregation)功能来统一管理和组织这些依赖。此外…...
【最新】微信小程序连接onenet——stm32+esp8266+onenet实现查看温湿度,控制单片机
微信小程序——stm32esp8266onenet实现查看温湿度,控制单片机 (最新已验证)stm32 新版 onenet dht11esp8266/01s mqtt物联网上报温湿度和控制单片机(保姆级教程) :↓↓👇 👇 👇 👇…...
差分(续前缀和)(含一维二维)
题目引入 开发商小 Q 买下了一条街,他想在这条街的一边盖房子。 街道可以抽象为一条数轴,而小 Q 只会在坐标在 1~n 的范围内盖房子。 首先,小 Q 将街上坐标在 1∼ 𝑛1∼ n 范围内的物体全部铲平。也就是说,在正式动工盖…...
【STM32-HAL库】自发电型风速传感器(使用STM32F407ZGT6)(附带工程下载链接)
一、自发电型风速传感器介绍 自发电型风速传感器,也称为风力发电型风速传感器或无源风速传感器,是一种不需要外部电源即可工作的风速测量设备。这种传感器通常利用风力来驱动内部的发电机构,从而产生电能来供电测量风速的传感器部分。以下是自…...
【计算机毕业设计】springboot就业信息管理系统
就业信息管理系统 摘 要 随着信息化时代的到来,管理系统都趋向于智能化、系统化,就业信息管理系统也不例外,但目前国内仍都使用人工管理,市场规模越来越大,同时信息量也越来越庞大,人工管理显然已无法应对时…...
实用工具推荐---- PDF 转换
直接上链接:爱PDF |面向 PDF 爱好者的在线 PDF 工具 (ilovepdf.com) 主要功能如下: 全免费!!!!...
安宝特案例 | 某知名日系汽车制造厂,借助AR实现智慧化转型
案例介绍 在全球制造业加速数字化的背景下,工厂的生产管理与设备维护效率愈发重要。 某知名日系汽车制造厂当前面临着设备的实时监控、故障维护,以及跨地域的管理协作等挑战,由于场地分散和突发状况的不可预知性,传统方式已无法…...
RabbitMQ基本原理
一、基本结构 所有中间件技术都是基于 TCP/IP 协议基础之上进行构建新的协议规范,RabbitMQ遵循的是AMQP协议(Advanced Message Queuing Protocol - 高级消息队列协议)。 生产者发送消息流程: 1、生产者和Broker建立TCP连接&#…...
【NodeJS】npm、yarn、pnpm当前项目设置国内镜像源
全局设置镜像源,可以参考下这篇文章,还挺详细:《npm、yarn、pnpm 最新国内镜像源设置和常见问题解决》 临时设置镜像源:《npm永久或临时切换源》 有时候可能要同时多个开发项目,又不想修改全局的镜像源(具体场景…自行…...
25考研咨询周开启,西安电子科技大学是否改考408??
学长这几天帮大家问了西安电子科技大学是否会从833、834、953改考为408? 西电老师回复:根据上级文件要求,招生简章以及专业目录会在网上报名开始前公布,专业课不会又大变动! 因为大家安心复习即可,保证今…...
git(1) -- 环境配置
1. 配置文件 编辑~/.gitconfig文件,内容如下。 [user]email xflming163.comname xflm [core]editor vim [color]diff autostatus autobranch autoui true [commit]template /home/xflm/configuser/git-commit.template [diff]tool bc4 [difftool]prompt …...
Windows安装Vim,并在PowerShell中直接使用vim
大家好啊,我是豆小匠。 这期介绍下怎么在windows的PowerShell上使用vim,方便在命令行里修改配置文件等。 先上效果图: 1、下载Vim GitHub传送门:https://github.com/vim/vim-win32-installer/releases 选择win-64的版本下载即可&…...
力扣(leetcode)每日一题 983 最低票价 |动态规划
983. 最低票价 题干 在一个火车旅行很受欢迎的国度,你提前一年计划了一些火车旅行。在接下来的一年里,你要旅行的日子将以一个名为 days 的数组给出。每一项是一个从 1 到 365 的整数。 火车票有 三种不同的销售方式 : 一张 为期一天 的通…...
【漏洞复现】VEXUS多语言货币交易所存在未授权访问漏洞
漏洞描述 java后端,非常完整的一套交易所,UI前端做的也很漂亮,新增了交易跟单功能,前端pc+wap都是uniapp纯源码,前端源码node_modules环境已经安装好了,拿去直接编译就可以. 后端 前端 免责声明 技术文章仅供参考,任何个人和组织使用网络应当遵守宪法法律,遵守公共…...
基于SpringBoot+Vue+MySQL的个性化电影推荐
系统展示 用户前台界面 管理员后台界面 系统背景 随着在线影视平台的迅猛发展,用户对个性化电影推荐的需求日益增长。传统的电影推荐系统往往基于简单的热门排行或分类筛选,难以满足用户的个性化需求。因此,开发一个基于SpringBootVueMySQL的…...
ASP.NET MVC-异步发送post请求+文件下载
环境: win10, .NET 6.0 前端向后台传递string型变量 前端: function PasteSubmit() {// 获取某个input的值var inName document.getElementById("xx").value;// 获取某个元素的属性值var inSeq document.getElementById("xxx").g…...
Unity 2D RPG Kit 学习笔记
学习资料: B站教学视频:https://www.bilibili.com/video/BV1dC4y1o7A5?p1&vd_source707ec8983cc32e6e065d5496a7f79ee6 2D RPG Kit Documentation.pdf文档 1、2D RPG Kit Documentation文档 1.1、Scenes/TitleScreen 开始菜单工程 1.2、https://it…...
联想天逸100使用笔记
文章目录 配置整理过程锁定功能键怎么弄? 翻出好多年不用的老电脑,饱受折磨,做个笔记。 之前不是我在使用,本身配置就不高,还被装了各种流氓软件,卡的几乎动不了。 配置 老电脑配置不行: i3 5005U 4G内存…...
【AI知识点】嵌入向量(Embedding Vector)
嵌入向量(Embedding Vector)是通过嵌入函数(Embedding Function)将复杂、高维或稀疏数据(如文本、图像、分类特征等)映射到低维、稠密空间中表示的向量。这种向量表示保留了原始数据的语义或结构信息&#…...
github命令行管理工具推荐
GitHub 管理工具推荐 背景 在使用 GitHub 管理仓库时,需要在 Web 端创建远程仓库,在本地创建本地仓库,然后再用 git remote add origin url 进行关联。这个过程相对繁琐,而且还有优化的空间。如果频繁创建仓库,就更能…...
【React】react项目中的redux使用
1. store目录结构设计 2. react组件中使用store中的数据——useSelector 3. react组件中修改store中的数据——useDispatch 4. 示例 react-basic\src\store\moduels\counterStore.js import { createSlice } from reduxjs/toolkitconst counterStore createSlice({name: cou…...
AJAX JSON 实例
AJAX JSON 实例 引言 AJAX(Asynchronous JavaScript and XML)和JSON(JavaScript Object Notation)是现代Web开发中常用的技术。AJAX允许在不重新加载整个页面的情况下,与服务器交换数据和更新部分网页内容。JSON是一种轻量级的数据交换格式,易于人阅读和编写,同时也易…...
java8:hutool:httputil.post读取配置项中的url
如果HttpUtil.post是静态方法,无法直接访问非静态的Value注入的属性。有以下几种解决办法: 构造函数注入 1. 首先将配置项的值通过Value注入到类的成员变量,然后在构造函数中将这个值传递给一个静态变量。 import org.springframework.bean…...
那个网站是响应式的/企业营销策划
博主说:在本篇文章中,马化腾先生亲口讲述了自己的创业史,回顾了早期创业之艰辛、公司生存之法则,从“创业维艰、自我颠覆、产品思维和最大担忧”四个方面分别进行了阐述,值得每一个互联网人为之深思。 正文 创业维艰 我…...
图片压缩wordpress/有哪些搜索引擎网站
x365 安装 Windows 2003 Enterprise Server 中文版(使用IBM ServeRAID控制器) 适用机型:所有xSeries 365文档内容:测试机型: x Series 365 (8862-3RX)磁盘接口: IBM ServeRAID 4Lx RAID 控制器(BIOS Ver:6.11.07)系统BIOS: Version: 1.00, …...
做兼职网站赚钱吗/百度一下百度搜索官网
从接触thinkphp到今天,填完此坑,必有其他的坑有会冒出来。哎!这个填坑之路我想是没有尽头的了。 最近,需要使用ajax完成一些操作,一开始想Ajax简单啊,不过是一种提交数据的方式,不过是害苦了我。…...
如何自己做个简单网站/浙江网络推广
原因:遇到三个swiper互相嵌套,大swiper包含一个水平一个垂直方向的小swiper 两个swiper互相影响,水平swiper向下滚动变成垂直swiper中间出现很大空白页的 1.第一是想设定水平swiper高度,但我大swiper没设置自动高度,也…...
珠海响应式网站建设费用/北京百度总部电话
二分查找 1. 适用场景 适用于对排好序的序列的指定值进行查找 2. 复杂度 O(logN) 3. 代码 /*cpp*/ int binarySearch(int[] a, int key){int a_len sizeof(a)/sizeof(a[0]);int lo 0, hi a_len - 1;while (lo < hi){int mid lo (hi - lo) / 2;if (key < a[mid]) h…...
制作app的教程/seo还有用吗
1、说明系统:centos7.2cuda版本:9.0报错信息:在执行.run文件后报错# sh cuda_9.0.176_384.81_linux.run The driver installation is unable to locate the kernel source. Please make sure that the kernel source packages are installed …...