HarmonyOS 速记

目录

  • 装饰器
    • @Entry(入口)
    • @Component(组件)
    • @Builder(构建)
    • @State(状态)
    • @Prop(属性)
    • @Preview(预览)
      • Previewer
      • Inspector
  • 结构体
    • struct
    • build
    • 自定义组件
      • 自定义 Custom 组件
    • export(导出) & import(导入)
  • Page(页面)
    • 生命周期
    • aboutToAppear
  • 数据
    • Array(数组/集合)
    • Map(映射)
  • 容器(字典顺序)
    • Grid(网格容器)
    • List(列表)
    • margin(外边距) & padding(内边距)
      • 外边距
      • 内边距
    • Row(行) & Column(列)
    • RelativeContainer(相对布局容器)
    • Scroll(滑动布局)
    • Swiper(轮播图)
  • 组件(字典顺序)
    • Blank()
    • Image(图片)
      • 图片的填充模式
    • Text(文本)
      • 组件:左上角对齐
      • 文字:左对齐
    • WebView
  • 架构
    • MVVM
    • 三层架构设计
  • Project 工程结构
    • .hvigor/
    • .idea/
    • AppScope/
      • resources/
      • app.json5
    • entry/
      • .preview/
      • src/
        • main/
          • ets/
          • resources/
            • base/
            • en_US/
            • zh_CN/
            • rawfile/
          • module.json5
        • ohosTest/
        • test/
      • .gitignore(module目录)
      • build-profile.json5(module目录)
      • hvigorfile.ts(module目录)
      • obfuscation-rules.txt(module目录)
      • oh-package.json5(module目录)
    • hvigor/
    • oh_modules/
    • .gitignore
    • build_profile.json5(根目录)
    • code-linter.json5
    • hvigorfile.ts
    • local.properties
    • oh-package.json5
    • oh-package-lock.json5
  • 参考

装饰器

@Entry(入口)

@Entry 装饰的 @Component 将作为 UI 页面的入口
在单个 UI 页面中,最多可以使用@Entry 装饰一个自定义组件



struct Index {

}

@Component(组件)

自定义组件,@Component 功能更加多样,有自己的生命周期,还能支持预览效果

  • @Component 装饰了 struct 关键字声明的类 Index
  • Index 被 @Component 装饰后具备组件化的能力,通过实现 build 方法描述 UI
  • @Component 装饰的 struct 类必须添加 @Component 装饰器,开发工具有提示

struct Index {
	
	build() {
	
	}
}

@Builder(构建)

自定义构建函数,@Builder 更加轻量,能满足基础的组件封装,性能更好,但是不支持预览。

  • 注意:如需更好的性能,建议采用 @Builder 方式进行组件定义封装
	
	CustomBuilderXXX(paramxx: string) {
	  Row() {
	    Image($r(paramxx))
	      .width(20)
	      .height(20)
	  }
	  .width('100%')
	  .height(64)
	  .alignItems(VerticalAlign.Center)
	}

@State(状态)

文本信息由 @State 装饰器装饰的状态变量 message 驱动

 message: string = 'HarmonyOS 速记';

@Prop(属性)

@Prop 装饰器,用于从父组件接收数据

  • 注意:加入 @Prop 后,Previewer 会失效

@Preview(预览)

Previewer

  • Previewer 可以直接预览 @Entry 装饰的整个页面
    也可以预览由 @Preview 装饰的单独组件
  • 预览 @Entry 装饰的整个页面时,需要选中 @Entry 所在的文件,Previewer 才能顺利打开
  • 将 Previewer 调整至 ComponentMode,便可以单独预览组件视图
  • 如果修改的是文本内容,则需要手动保存(即 ctrl+s)后,Previewer 才会更新
    如果修改的是相关属性,则不需要手动保存,Previewer 也会实时更新
  • 注意:此时的 Inspector 是不可用状态

Inspector

开启 Previewer 工具栏的 Inspector 工具,可以观察到当前组件树,并与 Previewer 交互

结构体

struct

定义组件结构体

  • @Component 装饰的 struct 类必须添加 @Component 装饰器,开发工具有提示
  • @Component 装饰的 struct 类必须重写 build 函数,开发工具有提示
struct Index {

}

build

组件通过 build 函数用于描述 UI

  • @Component 装饰的 struct 类必须重写 build 函数,开发工具有提示
 build() {
 	
 }

自定义组件


struct Custom {
  build() {
    
  }
}

自定义 Custom 组件

 // 用于组件预览
 // 定义组件
struct Custom { // 组件名

  build() {
    Image($r('app.media.banner_pic1')) // 图片
      .width('100%') // 宽度
      .padding({ // 内边距
        left: 16,
        top: 10,
        right: 16,
        bottom: 10
      })
      .borderRadius(16) // 圆角
      .objectFit(ImageFit.Contain) // 缩放模式
  }
}

使用 Previewer 查看效果
自定义 Custom 组件

export(导出) & import(导入)

独立定义的 Model/View,需要提供给外部使用,则需要 export 关键字修饰
在需要使用到文件,通过 import { XXX } from ‘…/model/XXX’; 导入后使用

// export 导出
export class BannerClass {
  id: string = '';
  imageSrc: ResourceStr = '';
  url: string = '';
 
  constructor(id: string, imageSrc: ResourceStr,url: string) {
    this.id = id;
    this.imageSrc = imageSrc;
    this.url = url;
  }
}

import {BannerClass} from '../model/BannerClass';
@Component
struct Banner {
	@State banner: BannerClass;
  // ...
}

Page(页面)

生命周期

页面的生命周期

aboutToAppear

aboutToAppear 函数在创建自定义组件的新实例后,且在执行其 build 函数之前执行

数据

Array(数组/集合)

// 方式一:
list: Array<XXXClass> = [
	new XXXClass('01', 'zhangsan'),
	new XXXClass('02', 'lisi')
];

// 方式二:(推荐)
list: XXXClass[] = [
	{
		id: '01', 
		name: 'zhangsan'
	},
	{
		id: '02', 
		name: 'lisi'
	}
];

export class XXXClass {
	id: string = '';
	name: string = '';
	constructor(id: string, name: string) {
    	this.id = id;
    	this.name = name;
	}
}

Map(映射)

定义映射关系,即<key, value>,可以使用 Record 类型来进行映射,也可以使用 Map 进行映射,通过 TypeMapIcon[key] 的方式来获取 value

// Record 类型
const TypeMapIcon: Record<string, string> = {
  '指南': 'app.media.ic_guide',
  '准备': 'app.media.ic_prepare',
  '学习与获取证书': 'app.media.ic_medals',
  '视频教程': 'app.media.ic_video',
}

容器(字典顺序)

Grid(网格容器)

网格容器,由“行”和“列”分割的单元格所组成,其中容器内各条目对应一个 GridItem 组件
如果仅设置行、列数量与占比中的一个,则网格单元将按照设置的方向排列
设置单行显示,则可以横向滑动
网格布局具有较强的页面均分能力,子组件占比控制能力,是一种重要自适应布局

Grid 是与 GridItem 搭配使用的

  • 通过 ForEach 创建 GridItem,
  • 在 GridItem 中加入自定义的 item 布局
  • 自定义 item 布局中通过 @Prop 装饰器来接收外部传入的数据源

List(列表)

List 是与 ListItem 搭配使用的

  • 通过 ForEach 创建 ListItem,
  • 在 ListItem 中加入自定义的 item 布局
  • 自定义 item 布局中通过 @Prop 装饰器来接收外部传入的数据源
	  // List 列表布局
      List({ space: 12 }) { // item 列间隔
        ForEach(
          this.tutorialList,
          (item: ArticleClass, index: number) => {
            ListItem(){
              TutorialItem({
                tutorialItem: item
              })
            }
          },
          (item: ArticleClass, index: number) => item.id
        )
      }
      .padding({
        left: 16,
        right: 16
      })
      .scrollBar(BarState.Off)
      .divider({ // item 分割线样式
        strokeWidth: 2,
        startMargin: 38,
        endMargin: 0,
        color: Color.Orange
      })

margin(外边距) & padding(内边距)

外边距

      Text(this.message)
      	// .margin(12)
        .margin({
          left: 20,
          top: 20,
          right: 20,
          bottom: 20
        })

内边距

      Text(this.message)
      	// .padding(12)
        .padding({
          left: 20,
          top: 20,
          right: 20,
          bottom: 20
        })

Row(行) & Column(列)

    Row() {
      Column() {
        Text(this.message)
          .fontSize(20)
          .fontWeight(FontWeight.Bold)
      }
      .width('100%')
    }
    .height('100%')

RelativeContainer(相对布局容器)

alignRules 在 RelativeContainer 中设置对齐规则(位置:上中下、左中右)

  • top、center、bottom 上中下
  • left、middle、right 左中右

注:alignRules 属性在 Row & Column 容器中无效

	// 水平、竖直居中
    RelativeContainer() {
        Text(this.message)
          .fontSize(20)
          .fontWeight(FontWeight.Bold)
          .alignRules({ // 对齐规则
            center: {
              anchor: '__container__',
              align: VerticalAlign.Center
            },
            middle: {
              anchor: '__container__',
              align: HorizontalAlign.Center
            }
          })
    }
    .width('100%')
    .height('100%')

正常效果:Start -> Top/Center/Bottom

异常效果:Start -> Top/Center/Bottom

正常效果:Top -> Start/Middle/End

异常效果:Top -> Start/Middle/End

函数 alignRules 声明

alignRules(value: AlignRuleOption): T;

参数 AlignRuleOption 源码

declare interface AlignRuleOption {
    top?: { // 上
        anchor: string;
        align: VerticalAlign;
    };
    center?: { // 中
        anchor: string;
        align: VerticalAlign;
    };
    bottom?: { // 下
        anchor: string;
        align: VerticalAlign;
    };
    
    left?: { // 左
        anchor: string;
        align: HorizontalAlign;
    };
    middle?: { // 中
        anchor: string;
        align: HorizontalAlign;
    };
    right?: { // 右
        anchor: string;
        align: HorizontalAlign;
    };

    bias?: Bias;
}

结论

top、center、bottom、left、middle、right

  • 对应着 设置子控件的基线,即以子控件的哪个位置作为对齐的基准点

VerticalAlign#Top、Center、Bottom & HorizontalAlign#Start、Center、End

  • 这些属性才是对应着 设置子控件相对于父布局的对齐规则,但需要配合上面的基准来使用才会得到想要的正确效果

Scroll(滑动布局)

Scroll 组件需要注意下面两种情况:

  • 列表的数据数量过多时,将导致内容会超过界面
  • 列表的数据数量不足时,将导致Scroll组件滚动时出现空白区域
  • 解决方法:所以此处要在最外层包裹一个Scroll组件
  1. constraintSize 属性,用于设置约束大小
  • 设置 minHeight 为 100%,可以解决当内容条数不足时,Scroll组件滚动时会出现空白区域的错误效果
  1. edgeEffect 属性,用于设置边缘滑动效果
  • EdgeEffect.None 表示设置为没有效果
  • EdgeEffect.Fade 表示设置为淡入淡出效果
  • EdgeEffect.Spring 表示设置为弹性物理动效。该效果滑动到边缘后可以根据初始速度或通过触摸事件继续滑动一段距离,松手后回弹
  1. scrollable 属性,用于设置滚动方向
  • ScrollDirection.Vertical 表示允许纵向滚动
  • ScrollDirectionHorizontal 表示允许横向滚动
  1. scrollBar 属性,用于设置以何种方式显示滚动条
  • BarState.On 一直显示
  • BarState.Off 不显示
  • BarState.Auto 滑动时显示
	Scroll() {
      Column() {
        ...
      }
      ...
    }
    .backgroundColor('#F1F3F5')
    .align(Alignment.TopStart)
    .constraintSize({ // 解决内容不足时,会出现空白区域的现象
    	minHeight: '100%' 
    })
    .edgeEffect(EdgeEffect.Spring) // EdgeEffect.Spring 弹性效果

Swiper(轮播图)

使用Swiper构建轮播图



struct Index {
   message: string = 'HarmonyOS 速记';

  build() {

    Column() {
      // Title
      Text(this.message)
        .padding({
          left: 16,
          top: 10,
          right: 16,
          bottom: 10
        })
        .width('100%')
        .textAlign(TextAlign.Start)
        .fontWeight(FontWeight.Bold)

      // Banner
      Banner()
        .margin({
          left: 16,
          right: 16
        })
    }
    .height('100%')
    .width('100%')
    .backgroundColor('#F1F3F5')
  }
}



struct Banner {
  // Banner 数据源
   banners: Array<BannerBean> = [
    new BannerBean('pic0', $r('app.media.banner_pic0'),
      'https://developer.huawei.com/consumer/cn/training/course/video/C101718352529709527'),
    new BannerBean('pic1', $r('app.media.banner_pic1'),
      'https://developer.huawei.com/consumer/cn/'),
    new BannerBean('pic2', $r('app.media.banner_pic2'),
      'https://developer.huawei.com/consumer/cn/deveco-studio/'),
    new BannerBean('pic3', $r('app.media.banner_pic3'),
      'https://developer.huawei.com/consumer/cn/arkts/'),
    new BannerBean('pic4', $r('app.media.banner_pic4'),
      'https://developer.huawei.com/consumer/cn/arkui/'),
    new BannerBean('pic5', $r('app.media.banner_pic5'),
      'https://developer.huawei.com/consumer/cn/sdk')
  ];

  build() {
    Swiper() { // 轮播图
      ForEach(
        this.banners, // 数据源
        (item: BannerBean, index: number) => { // 用于生成 item 组件
          Image(item.imageSrc)
            .width('100%')
            .borderRadius( 10 ) // 设置图片的圆角,不是 Banner 的圆角,所以感觉有点怪异
            .objectFit(ImageFit.Contain)
        },
        (item: BannerBean, index: number) => item.id // 用于 item 增量更新,所以需要 id
      )
    }
    .autoPlay(true) // 开启自动播放
    .loop(true) // 开启轮训
    // .interval(1000) // 时间间隔
    // .indicator(true) // 使用默认的指示器
    .indicator( // 配置指示器
      new DotIndicator()
        .color('#1a000000')
        .selectedColor('#0A59F7')
    )
  }
}

/**
 * Banner 结构体
 */
class BannerBean {
  id: string = '';
  imageSrc: ResourceStr = '';
  url: string = '';

  constructor(id: string, imageSrc: ResourceStr, url: string) {
    this.id = id;
    this.imageSrc = imageSrc;
    this.url = url;
  }
}

Swiper 轮播图

组件(字典顺序)

Blank()

该组件可以自动填充主轴方向的空余空间

    Row() {
      Text(this.navBarItem.order)
        ...
      Text(this.navBarItem.title)
        ...
      Blank() // 通过 Blank 组件,来自动填充主轴方向的剩余空间
      Image($r('app.media.ic_arrow'))
        .width(12)
        .height(24)
    }

Image(图片)

用于显示图片

    Image($r('app.media.banner_pic1')) // 设置图片资源
      .width('100%') // 宽度
      .padding({ // 内边距
        left: 16,
        top: 10,
        right: 16,
        bottom: 10
      })
      .borderRadius(16) // 圆角
      .objectFit(ImageFit.Contain) // 缩放模式

方法一

通过 $r(‘app.media. 文件名字’) 将 media 文件夹下的本地图片读取到 Image 组件

Image($r('app.media.image_path'))

方法二

定义 ResourceStr 变量,值为 media 文件夹下的本地图片路径,通过 $r(上面定义的 ResourceStr 变量) 将 media 文件夹下的本地图片读取到 Image 组件

private path: ResourceStr = 'app.media.image_path';
Image($r(path))

方法三

  • 通过 rawfile 目录中配置的 JSON 文件来配置本地图片的路径,这种情况时图片的路径为 string 类型、非 ResourceStr 类型,所以需要定义 string 类型、非 ResourceStr 类型 的变量来接收 JSON 中定义的图片路径,然后直接通过 Image 组件加载图片即可。(具体解析代码详见当前页面内容 Project 工程结构#rawfile)
  • 由于 json 文件解析限制,当前不支持 Previewer 预览器模式,应选择模拟器或真机进行调试。

图片的填充模式

.objectFit(ImageFit.Contain)

设置图片的填充模式

  • Contain 模式,即保持宽高比进行缩小或者放大,使得图片完全显示在显示边界内
  • Cover 模式,即保持宽高比进行缩小或者放大,使得图片两边都大于或等于显示边界。

Text(文本)

组件:左上角对齐

      Text(this.message) // 默认宽度 wrap_content
        .id('HelloWorld')
        .fontSize(20)
        .fontWeight(FontWeight.Bold)
        .fontStyle(FontStyle.Italic)
        .lineHeight(55)
        .alignRules({ // 对齐规则:左上角(top、left) 为 对其基准点
          top: { // 上边缘 为 对其基准点
            anchor: '__container__',
            align: VerticalAlign.Top // 上对齐
          },
          left: { // 左边缘 为 对其基准点
            anchor: '__container__',
            align: HorizontalAlign.Start // 左对齐
          }
        })

文字:左对齐

      Text(this.message)
        .width('100%') // 设置宽度 match_parent
        .textAlign(TextAlign.Start) // 设置文字朝向 居左

WebView

加载网络资源

  • 创建ArkTS侧代码。在 ets/pages/ 中创建 CourseLearning.ets 文件,新增基础的代码框架
  • 添加网络权限 ohos.permission.INTERNET
  • 创建 webviewController,开发者后续可以通过该Controller控制Web组件加载的界面

加载本地资源

  • 将本地 Web 资源包 course_learning 目录放入 resources/rawfile/ 目录下
  • 创建ArkTS侧代码。在 ets/pages/ 中创建 CourseLearning.ets 文件,新增基础的代码框架
  • 创建 webviewController,开发者后续可以通过该Controller控制Web组件加载的界面
  • 加载本地界面,修改 Web 组件的 src 属性,使用 $rawfile 加载刚刚放入 rawfile 目录下的 course_learning 资源。
  • 注意:需要在真机或者模拟器上运行代码,Previewer 预览器暂不支持 Web 组件的预览效果
import { webview } from '@kit.ArkWeb'


struct CourseLearning {
  private webviewController: webview.WebviewController = new webview.WebviewController();

  build() {
    Column() {
      // 加载网络 Web 资源
      Web({ src: 'http://www.huawei.com', controller: this.webviewController })
        .domStorageAccess(true)

      // 加载本地 Web 资源
      // Web({ src: $rawfile('course_learning/index.html'), controller: this.webviewController })
      //   .domStorageAccess(true)
    }
  }
}

架构

MVVM

ArkUI 采取 MVVM = Model + View + ViewModel 模式,其中 状态管理模块 起到的就是ViewModel 的作用,将数据(Model)与视图(View)绑定在一起,数据更新 会直接 更新视图。

  • Model 为我们定义的数据结构和数据来源,通过 @State 等装饰器来装饰对应的数据,就提供了响应式能力,Model 数据的变化就能够触发 UI 的更新。
  • MVVM 的目录组织方式,一般适用于单个模块内文件组织

MVVM架构图

三层架构设计

为了更好地适配复杂应用的开发,建议采用三层架构的方式对整个应用的功能进行模块化,实现高内聚、低耦合开发。

三级架构图

三层工程结构如下:

  • commons(公共能力层):用于存放公共基础能力集合(如工具库、公共配置等)。commons层可编译成一个或多个HAR包或HSP包,只可以被products和features依赖,不可以反向依赖。
  • features(基础特性层):用于存放基础特性集合(如应用中相对独立的各个功能的UI及业务逻辑实现等)。各个feature高内聚、低耦合、可定制,供产品灵活部署。不需要单独部署的feature通常编译为HAR包或HSP包,供products或其它feature使用。需要单独部署的feature通常编译为Feature类型的HAP包,和products下Entry类型的HAP包进行组合部署。features层可以横向调用及依赖common层,同时可以被products层不同设备形态的HAP所依赖,但是不能反向依赖products层。
  • products(产品定制层):用于针对不同设备形态进行功能和特性集成。products层各个子目录各自编译为一个Entry类型的HAP包,作为应用主入口。products层不可以横向调用。

三层架构工程目录迁移

Project 工程结构

.hvigor/

生成文件

.idea/

生成文件

AppScope/

resources/

base/element/

  • 放置 base 资源文件
  • string.json

base/media/

  • 放置 base 图片资源
  • app_icon.png

app.json5

app 基础信息配置文件

// app.json5
{
  "app": {
    "bundleName": "com.villen.hm", // 包名
    "vendor": "example", // 提供商
    "versionCode": 1000000, // version code
    "versionName": "1.0.0", // 版本号
    "icon": "$media:app_icon", // 应用图标
    "label": "$string:app_name" // 应用名称
  }
}

entry/

.preview/

  • 生成文件,类似 android 中的 build 目录

src/

entry/src/

main/

entry/src/main/

ets/

entry/src/main/ets/
源代码

resources/

entry/src/main/resources/
资源

base/

entry/src/main/resources/base/
base 资源

  • element/ -> 资源文件

    • color.json
    • string.json
  • media/ -> 资源图片

  • profile/ -> 资源图片

    • backup_config.json -> 描述 备份相关配置
    • main_pages.json -> 描述 路由信息 或定义 窗口相关配置
en_US/

entry/src/main/resources/en_US/
英文资源

  • element/ -> 资源文件
    • string.json
zh_CN/

entry/src/main/resources/zh_CN/
中文资源

  • element/ -> 资源文件
    • string.json
rawfile/

entry/src/main/resources/rawfile/
该目录用于存放 json 数据资源、Web 资源等本地资源文件。

  • 该目录中的资源文件会被直接打包进应用,不经过编译,也不会被赋予资源文件ID。通过指定文件路径和文件名引用。
  • 由于 json 文件解析限制,当前不支持 Previewer 预览器模式,应选择模拟器或真机进行调试。
  • 读取 json 文件内容,需要使用到 ResourceManager 的 getRawfileContent 方法,从 rawfile 目录中读取对应的 JSON 文件
  • 转换内容需要两个步骤:
    • 将获取的buffer内容转换为字符串
      • 由于 ResourceManager 获取到的是 ArrayBufferLike 类型的内容,所以需要将对应的内容转换为字符串,并将字符串解析为对应的数据结构。
      • 考虑到其他的文件也会使用这个公共方法,可以新建一个 util 文件夹,并创建一个 BufferUtil 文件,实现这个字符串转换方法。
    • 将字符串转换为页面数据结构
  • 该功能可以用于临时 mock 数据
// BufferUtil.ets
import { util } from '@kit.ArkTS';

/**
 * buffer 转 string
 * 用于从 rawfile 中读取 JSON 数据
 *
 * @param buffer
 * @returns
 */
export function bufferToString(buffer: ArrayBufferLike): string {
  let textDecoder = util.TextDecoder.create('utf-8', {
    ignoreBOM: true
  });

  let resultPut = textDecoder.decodeWithStream(new Uint8Array(buffer), {
    stream: true
  });

  return resultPut;
}
module.json5

entry/src/main/module.json5
清单文件,类似 android 中的 AndroidManifest.xml

  • 配置页面
  • 权限申请
	// 权限申请,位于 module 节点下
    "requestPermissions": [
      {
        "name": "ohos.permission.INTERNET",
        "reason": "$string:apply_for_network"
      }
    ]
ohosTest/

测试

test/

测试

.gitignore(module目录)

忽略文件

build-profile.json5(module目录)

hvigorfile.ts(module目录)

obfuscation-rules.txt(module目录)

oh-package.json5(module目录)

配置依赖项,配置完后,会提示需要安装依赖,可以通过 Run “ohpm install” 执行安装过程。

"dependencies": {
    "@ohos/learning": "file:../../features/learning",
    "@ohos/map": "file:../../features/map",
    "@ohos/quickstart": "file:../../features/quickstart"
  }

hvigor/

hvigor-config.json5

oh_modules/

生成文件

.gitignore

忽略文件

build_profile.json5(根目录)

code-linter.json5

hvigorfile.ts

local.properties

oh-package.json5

oh-package-lock.json5

生成文件

参考

HarmonyOS应用开发快速入门

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Wireshark学习使用记录

wireshark 是一个非常好用的抓包工具&#xff0c;使用 wireshark 工具抓包分析&#xff0c;是学习网络编程必不可少的一项技能。 原理 Wireshark使用的环境大致分为两种:一种是电脑直连互联网的单机环境&#xff0c;另外一种就是应用比较多的互联网环境&#xff0c;也就是连接…

nginx模块篇(四)

文章目录 四、Nginx的扩展模块4.1. Lua4.1.1 概念4.1.2 特性4.1.3 应用场景4.1.4 Lua的安装4.1.5 Lua的语法4.1.5.1 第一个Lua程序4.1.5.2 Lua的注释4.1.5.3 标识符4.1.5.4 关键字4.1.5.5 运算符4.1.5.6 全局变量&局部变量4.1.5.7 Lua数据类型nilbooleannumberstringtablef…

Windows本地连接远程服务器并创建新用户详细记录

前提可知&#xff1a; &#xff08;1&#xff09;服务器IP地址&#xff1a;x.x.x.x &#xff08;2&#xff09;服务器名称&#xff1a;root&#xff08;一般默认为root&#xff0c;当然也有别的名称&#xff09; &#xff08;3&#xff09;服务器登陆密码&#xff1a;**** 一、…

都市女生热衷找搭子的原因?只因对生活的热爱和追求

在繁华的都市中&#xff0c;有一个叫小悠的女生。她独自在这个忙碌的世界里闯荡&#xff0c;常常感到孤独。 有一天&#xff0c;小悠想去看一场期待已久的演唱会&#xff0c;可是身边的朋友要么没时间&#xff0c;要么对这场演唱会不感兴趣。就在她感到失落的时候&#xff0c;她…

使用llama.cpp 在推理MiniCPM-1.2B模型

llama.cpp 是一个开源项目&#xff0c;它允许用户在C中实现与LLaMA&#xff08;Large Language Model Meta AI&#xff09;模型的交互。LLaMA模型是由Meta Platforms开发的一种大型语言模型&#xff0c;虽然llama.cpp本身并不包含LLaMA模型的训练代码或模型权重&#xff0c;但它…

html 几行的空间分成3个区域

1.代码 <!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <meta name"viewport" content"widthdevice-width, initial-scale1.0"> <title>三个区域示例</title> …

【工具】Windows|两款开源桌面窗口管理小工具Deskpins和WindowTop

总结 Deskpins 功能单一&#xff0c;拖到窗口上窗口就可以置顶并且标记钉子标签&#xff0c;大小 104 KB&#xff0c;开源位置&#xff1a;https://github.com/thewhitegrizzli/DeskPins/releases WindowTop 功能完善全面强大&#xff0c;包括透明度、置顶、选区置顶等一系列功…

【我的 PWN 学习手札】tcache extend

目录 前言 一、利用手法 二、流程演示 &#xff08;1&#xff09;三块物理相邻的堆块 &#xff08;2&#xff09;溢出修改 size &#xff08;3&#xff09;释放该 chunk &#xff08;4&#xff09;重新申请该 chunk &#xff08;5&#xff09;释放第三块 chunk&#x…

Leetcode - 139双周赛

目录 一&#xff0c;3285. 找到稳定山的下标 二&#xff0c;3286. 穿越网格图的安全路径 三&#xff0c;3287. 求出数组中最大序列值 四&#xff0c;3288. 最长上升路径的长度 一&#xff0c;3285. 找到稳定山的下标 本题就是找[0&#xff0c; n-2]中&#xff0c;height[i]…

升级你的HarmonyOS体验:一窥功能引导与拖拽交换的独家技巧

文章目录 前言项目目录结构开发流程主要步骤讲解关键配置Index.ets 页面讲解高光组件相关HeaderApp 总结 前言 在当今的移动应用开发领域&#xff0c;为了提供更加友好和直观的用户体验&#xff0c;开发者们通常会集成多种交互功能来增强应用的互动性和易用性。在这些功能中&a…

故障诊断│GWO-DBN灰狼算法优化深度置信网络故障诊断

1.引言 随着人工智能技术的快速发展&#xff0c;深度学习已经成为解决复杂问题的热门方法之一。深度置信网络&#xff08;DBN&#xff09;作为深度学习中应用比较广泛的一种算法&#xff0c;被广泛应用于分类和回归预测等问题中。然而&#xff0c;DBN的训练过程通常需要大量的…

go 读取excel数据存储到mysql

一、安装依赖 go get github.com/go-sql-driver/mysql go get github.com/jmoiron/sqlx 二、main.go package mainimport ("fmt""github.com/jmoiron/sqlx""log" ) import "github.com/tealeg/xlsx" import _ "github.com/go-s…

【LeetCode热题100】位运算

这篇博客先介绍了常见位运算操作&#xff0c;然后记录了关于位运算的几道题&#xff0c;包括判定字符是否唯一、丢失的数字、两整数之和、只出现一次的数字2、消失的两个数字。 在这一部分&#xff0c;我们不妨先来总结一下常见位运算操作&#xff1a; 1.基础位运算 >>…

C++——模拟实现string

1.再谈string string为什么要被设计成模板&#xff1f;日常使用string好像都是char*&#xff0c;char*不够使用吗&#xff0c;为什么要设计成模板呢&#xff1f; 1.1 关于编码 //计算机的存储如何区分呢&#xff1f;int main() {//比如在C语言中&#xff0c;有整型//如果是有…

craco-less使用问题

craco-less使用问题 问题背景 前端是用React搭建&#xff0c;使用craco配置&#xff0c;相关库或插件版本如下 "craco/craco": "^7.1.0","react-scripts": "^5.0.1","craco-less": "^3.0.1"在生产环境&#xff…

P9235 [蓝桥杯 2023 省 A] 网络稳定性

*原题链接* 最小瓶颈生成树题&#xff0c;和货车运输完全一样。 先简化题意&#xff0c; 次询问&#xff0c;每次给出 &#xff0c;问 到 的所有路径集合中&#xff0c;最小边权的最大值。 对于这种题可以用kruskal生成树来做&#xff0c;也可以用倍增来写&#xff0c;但不…

国内可以使用的ChatGPT服务【9月持续更新】

首先基础知识还是要介绍得~ 一、模型知识&#xff1a; GPT-4o&#xff1a;最新的版本模型&#xff0c;支持视觉等多模态&#xff0c;OpenAI 文档中已经更新了 GPT-4o 的介绍&#xff1a;128k 上下文&#xff0c;训练截止 2023 年 10 月&#xff08;作为对比&#xff0c;GPT-4…

SSM+vue音乐播放器管理系统

音乐播放器管理系统 随着社会的发展&#xff0c;计算机的优势和普及使得音乐播放器管理系统的开发成为必需。音乐播放器管理系统主要是借助计算机&#xff0c;通过对首页、音乐推荐、付费音乐、论坛信息、个人中心、后台管理等信息进行管理。减少管理员的工作&#xff0c;同时…

2024短剧系统开发,付费短剧小程序app源码教程,分销功能讲解搭建上线

短剧系统技术栈 前端&#xff1a;vue3uniapp 后端&#xff1a; php 数据库&#xff1a;mysql 服务器环境&#xff1a; centos7.6 宝塔 php7.4 MySQL5.7 一、短剧系统功能 短剧用户端&#xff1a; 小程序、抖音小程序、快手小程序、APP、 z付宝小程序 系统用户端详细功能&…

有关shell指令练习2

写一个shell脚本&#xff0c;将以下内容放到脚本中 在家目录下创建目录文件&#xff0c;dir dir下创建dir1和dir2 把当前目录下的所有文件拷贝到dir1中&#xff0c; 把当前目录下的所有脚本文件拷贝到dir2中 把dir2打包并压缩为dir2.tar.xz 再把dir2.tar.xz移动到dir1中 …