当前位置: 首页 > news >正文

2024最新版鸿蒙纯血原生应用开发教程文档丨学习ArkTS语言-基本语法


ArkTS是HarmonyOS的主要应用开发语言,在TypeScript基础上进行了扩展,保留了其基本风格,并通过增强静态检查和分析来提高程序的稳定性和性能。本教程将帮助开发者掌握ArkTS的核心功能、语法及最佳实践,以便高效地构建高性能移动应用。

1. 基本语法

1.1. 字面量

字面量(Literal)是一种直接表示在源代码中的固定值,不同类型的字面量格式有所不同,下面是ArkTS中各类型字面量的表示方式。

  • 数值型字面量
    • 整数:数学中的整数(例如:8, 15, 123)
    • 浮点数:带有小数点的数字(例如:8.15, 1.234)
  • 字符串型字面量:用单引号或双引号括起来的文本(例如:'abc', "你好世界")
  • 布尔型字面量:表示真假(例如:true, false)
//1.整数型字面量
console.log('整数:',60);       //60//2.浮点型字面量
console.log('浮点数:',3.14)  //3.14
console.log('浮点数:',.14)   //0.14
console.log('浮点数:',1e2)   //100//3.布尔型字面量
console.log('布尔型:',true)   //true
console.log('布尔型:',false)   //false//4.字符串型字面量
console.log('字符串:','Hello ArkTS')		  //Hello ArkTS
console.log('字符串:',"Hello HarmonyOS") 	//Hello HarmonyOS

1.2. 变量

在计算机语言中,变量可以理解为存储数据的容器。在ArkTS中定义变量的格式如下

let 变量名: 类型 = 值int a = 10; 	//Java
let a:number = 10	//ArkTS

例:比如在华为商城中有很多商品,我们现在想定义一个变量,用来存储商品的标题

定义各种类型的变量

let title: string = 'HUAWEI Mate 60 Pro'
console.log(title)

1.3. 类型

ArkTS是一种静态类型的语言,定义变量时必须明确数据类型。 ArkTS支持的数据类型有以下几种

number 类型

number 用于表示数字,包括整数和浮点数。

let num: number = 10; 
let floatNum: number = 3.14;

string 类型

string 用于表示文本数据,可以包含字母、数字、符号和空格等。可以使用单引号(')、双引号(")或反引号(`)来声明字符串。反引号内可以嵌入表达式,形成模板字符串。

let name: string = 'ArkTS!'; 
let desc: string = "ArkTS是HarmonyOS的主要应用开发语言"
let templateStr: string = `Hello,${name}. ${desc}` 

boolean 类型

boolean 用于表示逻辑上的真值和假值。只有两个值:truefalse

  let isDone: boolean = false;

array 类型

array即数组,它是一个存储数据的容器,数组的长度由数组中元素的个数来确定。数组中第一个元素的索引为0。

let names: string[] = ['Alice', 'Bob', 'Carol'];
names[0] = "爱丽丝"
console.log(names[0])

enum类型

enum类型,又称枚举类型,是预先定义的一组命名值的值类型,其中命名值又称为枚举常量。

使用枚举常量时必须以枚举类型名称为前缀。

enum ColorSet { Red, Green, Blue 
}
let c: ColorSet = ColorSet.Red;

常量表达式可以用于显式设置枚举常量的值。

enum ColorSet { White = 0xFF, Grey = 0x7F, Black = 0x00 
}
let c: ColorSet = ColorSet.Black;

union类型

union类型,即联合类型,是由多个类型组合成的引用类型。联合类型可以包含了变量可能的所有类型

type Type = string | number | ColorSet | string[] | ColorSet[]let a1: Type = "red" //正确
let a2: Type = 0xff00 //正确
let a3: Type = ColorSet.Red //正确
let a4: Type = ["red", "balck"] //正确
let a5: Type = [ColorSet.Red] //正确
let a6: Type = true //错误

Aliases类型

Aliases类型为别名类型,可以为已有类型提供替代名称,或者为匿名类型(数组、函数、对象字面量或联合类型)提供名称。

// 为number类型取一个别名为int
type int = number
let a: number = 10
let b: int = 10

1.4. 常量

常量是不会发生改变的数据,它只能被赋值一次。定义格式如下

const 变量名: 类型 = 值

例:在数学中有一个非常重要的常量,就是圆周率π

const PI: number = 3.1415926
PI = 31.4 //这是错误的,变量的值只能被赋值一次。

1.5. 类型推断

由于ArkTS是一种静态类型语言,所有数据的类型都必须在编译时确定。但是,如果一个变量或常量的声明包含了初始值,那么开发者就不需要显式指定其类型。

//以下两种定义变量的方式都可以
let a1: number = 10
let a2 = 10

1.6. 命名规范

不管定义变量还是定义常量,取名也是不是乱取的,是有一些命名规则的,必须遵守这些规则,否则代码编译不通过。

1. 只能包含数字、字母、下划线、$,不能以数字开头
2. 不能使用内置关键字或者保留字
3. 严格区分大小写

1.7. undefined 空值

先说结论,undefined表示一个变量它的值为“空值”,意思就是这个变量没有值,其它就是undefined。

有下面几种情况,变量的值是undefined.

情况一:变量没有显示的赋值,其值默认就是undefined

变量没有显示的赋值,但是直接使用这个变量是不推荐的,所以编译器会报错。为了验证上面的结论,我们可以使用强制断言符号“!”,强制编译通过。

let a: string
console.info(`${a}`)	//编译报错
console.info(`${a!}`)	//编译通过,输出undefinedlet b: number 
console.info(`${b!}`)	//编译通过,输出undefined

情况二:变量没有显示赋值,但是明确声明类型可以是undefined,其值默认也是undefined

let a: string | undefined
console.info(`${a}`)	//编译通过,输出undefinedlet b: number | undefined
console.info(`${b}`)	//编译通过,输出undefined

情况三:变量显示赋值为undefined,其类型必须声明为undefined类型

let a: string  = undefined	//编译错误
let b: string | undefined = undefined
console.info(`${a}`)	//编译通过,输出undefined

注意:不管是前面那种情况,在后续代码中都可以给值为undefined的变量赋值。

let a: string
let b: number | undefined
let c: boolean | undefined = undefined
console.info(`${a!}`)	//输出undefined
console.info(`${b}`)	//输出undefined
console.info(`${c}`)	//输出undefined
a = 'hello'
b = 20
c = true
console.info(`${a}`)	//输出hello
console.info(`${b}`)	//输出20
console.info(`${c}`)	//输出true

1.8. 数组

数组是能够存储0个或者多个数据的容器。下面两种格式都可以定义数组

let 数组名: Array<类型> = [值1, 值2, 值3];
let 数组名: 类型[] = [值1,值2,值3]

例:定义一个数组,用来存储班级中学生的姓名

let names1: Array<string> = ['小明','小黄','阿珍','阿强']
let names2: string[] = ['小明','小黄','阿珍','阿强']

例:定义数组也可以使用类型推断,省略数据类型

let names3 = ['小明','小黄','阿珍','阿强']

数组中存储的数据统称为元素,每一个元素都会有一个唯一的索引编号,通过数组名[索引]就可以找到任意一个元素。

console.log(‘names2[0]’,names2[0]) 	//小明
names2[1] = ‘大黄’	
console.log(‘names2[1]’,names2[1])	//大黄
console.log(‘names2[2]’,names2[2])	//阿珍
console.log(‘names2[3]’,names2[3])	//阿强

1.9. 运算符

运算符(Operator)是一种告诉编译器执行特定数学或逻辑操作的符号。任何一门计算机语言运算操作基本上是一样的。

1.9.1. 算术运算符

所有算术运算符如下表所示

运算符

含义

+

加法运算、字符串拼接

-

减法运算

*

乘法运算

/

除法运算,整数相除只能得到整数

%

取模(余数)

++

自增运算(在原来数据的基础上+1)

--

自减运算(在原来数据的基础上-1)

以上运算符都比较简单,下面重点讲解一下++或者--运算符的运算规则。

  • 单独使用:不断++或者--放在操作数的前面还是后面,都表示对操作数自增1或者自减1
    let x = 3
    let y = ++x	//a先+1,再把a的结果赋值给b
    console.log(`x的值为${x}`) //x的值为4
    console.log(`y的值为${y}`) //y的值为4
  • 混合使用:++和--可以放在变量前面或者后面,运算顺序有所不同
    let i = 3
    let j = i++	//先把i的值赋值给j,i再+1
    console.log(`i的值为${i}`) //x的值为4
    console.log(`j的值为${j}`) //y的值为3
  • let i = 3
    let j = i++	//先把i的值赋值给j,i再+1
    console.log(`i的值为${i}`) //x的值为4
    console.log(`j的值为${j}`) //y的值为3

  • 1.9.2. 赋值运算符

    赋值运算就是把具体数据值赋值给变量,有下面的几个运算

    运算符

    含义

    =

    把右边的值赋值给左边

    +=

    左右两边相加的结果赋值给左边

    -=

    左右两边相减的结果赋值给左边

    *=

    左右两边相乘的结果赋值给左边

    /=

    左右两边相除的结果赋值给左边

    %=

    左右两边取余数的结果赋值给左边

1.9.3. 比较运算符

用来对两个数据做比较运算,最终结果只能是true或者false。需要注意的是==和=千万不要搞混淆了

  • = 用于赋值
  • == 用于判断两个数据是否相等

运算符

含义

>

大于

>=

大于等于

<

小于

<=

小于等于

==

先转换类,再判断相等

!=

判断不相等

let a2 = 10
let b2 = 10
let c2 = a2==b2
console.log(`c2的值为${c2}`) //c2的值为true
1.9.4. 逻辑运算符

逻辑运算可以对多个条件进行连接,最终结果也是true或者false

运算符

含义

&&

两个条件都满足结果才是true

||

有一个条件满足结果就是true

!

对结果取反

let a3=3;
let b3=4;
let c3=5;
//&&(双与): 左右两边都是true,结果才是true。
console.log('逻辑运算',a3>b3 && b3<c3)	//false
console.log('逻辑运算',a3<b3 && b3<c3)	//true//||(双或): 左右两边有一个是true,结果就是true。
console.log('逻辑运算',a3>b3 || b3>c3)	//false
console.log('逻辑运算',a3<b3 || b3<c3)	//true//!(非): 对值取反
console.log('逻辑运算',!(a3<b3))	//false

1.10. 流程语句

1.10.1. if语句

if语句用于需要根据逻辑条件执行不同语句的场景。当逻辑条件为真时,执行对应的一组语句,否则执行另一组语句(如果有的话)。else部分也可能包含if语句。

if语句如下所示:

if (condition1) {// 语句1
} else if (condition2) {// 语句2
} else {// else语句
}

条件表达式可以是任何类型。但是对于boolean以外的类型,会进行隐式类型转换:

let s1 = 'Hello';
if (s1) {console.log(s1); // 打印“Hello”
}let s2 = 'World';
if (s2.length != 0) {console.log(s2); // 打印“World”
}
1.10.2. switch语句

使用switch语句来执行与switch表达式值匹配的代码块。switch语句如下所示:

switch (expression) {case label1: // 如果label1匹配,则执行// ...// 语句1// ...break; // 可省略case label2:case label3: // 如果label2或label3匹配,则执行// ...// 语句23// ...break; // 可省略default:// 默认语句
}

如果switch表达式的值等于某个label的值,则执行相应的语句。

如果没有任何一个label值与表达式值相匹配,并且switch具有default子句,那么程序会执行default子句对应的代码块。

break语句(可选的)允许跳出switch语句并继续执行switch语句之后的语句。

如果没有break语句,则执行switch中的下一个label对应的代码块。

1.10.3. 条件表达式

条件表达式由第一个表达式的布尔值来决定返回其它两个表达式中的哪一个。

数据类型 变量名 = 条件表达式 ? 值1 : 值2;
  • 执行流程:
    1. 判断关系表达式的结果是true还是false
    2. 如果关系表达式是true,三元运算的结果就是表达式1
    3. 如果关系表达式是false,三元运算的结果就是表达式2
       
      //例1:求两个变量的最大值
      let n = 20;
      let m = 30;
      //三元运算的结果 被max接收
      let max = n > m ? n : m
      console.log('三元运算', max) //30//例2:判断成绩是否及格
      let score = 90
      console.log('三元运算', score>=60?'及格':'不及格') //及格
      1.10.4. for语句

      for语句会被重复执行,直到循环退出语句值为false。for语句如下所示:
       

      for ([init]; [condition]; [update]) {statements
      }

      for语句的执行流程如下:

      1、 执行init表达式(如有)。此表达式通常初始化一个或多个循环计数器。

      2、 计算condition。如果它为真值(转换后为true的值),则执行循环主体的语句。如果它为假值(转换后为false的值),则for循环终止。

      3、 执行循环主体的语句。

      4、 如果有update表达式,则执行该表达式。

      5、 回到步骤2。

      示例:

      let sum = 0;
      for (let i = 0; i < 10; i += 2) {sum += i;
      }
      1.10.5. for-of语句

      使用for-of语句可遍历数组或字符串。示例如下:

      for (forVar of expression) {statements
      }

      示例:
       

      let array = ['你好', '鸿蒙', 'HarmonyOS'];
      for (let s of array) {console.log(s); 	//'你好', '鸿蒙', 'HarmonyOS'
      }
      1.10.6. while语句

      只要condition为真值(转换后为true的值),while语句就会执行statements语句。示例如下:
       

      while (condition) {statements
      }

      示例:
       

      let n = 0;
      let x = 0;
      while (n < 3) {n++;x += n;
      }
      1.10.7. do-while语句

      如果condition的值为真值(转换后为true的值),那么statements语句会重复执行。示例如下:
       

      do {statements
      } while (condition)

      示例:

      let i = 0;
      do {i += 1;
      } while (i < 10)
      1.10.8. break语句

      使用break语句可以终止循环语句或switch。

      示例:
       

      let x = 0;
      while (true) {x++;if (x > 5) {break;}
      }

      如果break语句后带有标识符,则将控制流转移到该标识符所包含的语句块之外。

      示例:

      let x = 1
      label: while (true) {switch (x) {case 1:// statementsbreak label; // 中断while语句}
      }
      1.10.9. continue语句

      continue语句会停止当前循环迭代的执行,并继续执行下一次循环。

      示例:

      let sum = 0;
      for (let x = 0; x < 100; x++) {if (x % 2 == 0) {continue}sum += x;
      }

      1.11. 函数

      1.11.1. 函数概述

      函数是可以被重复使用的代码块,它可以接受输入参数,执行一系列操作,然后返回输出结果。

      为了方便大家理解,我想到一个非常形象的生活案例帮助大家理解;如下图所示,有一个包饺子神器,当我们需要包饺子时,准备好饺子皮和饺子馅,放在包饺子神器上一夹,一个完整的饺子就做出来了。

      在这个案例中,包饺子神器就是一个可以重复利用的函数,饺子皮和陷就是函数接受的参数,而“夹”这个动作就是函数执行的操作,做出来的饺子就是函数的返回结果。

      函数必须先声明才能使用,函数声明包含其名称、参数列表、返回类型和函数体。下面是函数声明的格式

      function 函数名(形参1: 类型1,形参2: 类型2): 返回值类型{....return 结果; 
      }

      例:声明一个函数,能够接受两个整数,执行求和的操作,并返回两个数的和。

      function add(x:number, y: number): number{let z = x+y;return z;
      }
      1.11.2. 函数调用

      注意函数声明好了,必须调用才能执行。下面演示函数的调用
       

      let s = add(3,4)	//调用add函数,求3与4的和,并把和值赋值给变量s
      console.log(”两个数的和为:",s)let s1 = add(4,6)	//重复调用add函数
      console.log(”两个数的和为:",s1)
      1.11.3. 无返回值函数

      函数可以没有返回值,此时方法体内不需要写return语句,返回值类型用void代替

      例:声明一个函数,能够接受两个整数,执行求最和操作,直接和在函数内打印输出。

      //声明函数
      function max(x:number, y: number): void{let z = x+y;console.log(”两个数的最大:",z)
      }
      //调用函数
      max(3,4)
      max(4,6)
      1.11.4. 无参数函数

      函数可以不接受输入数据,此时()中什么都不写,调用函数时也不用传递参数。

      例:声明一个函数,打印10个“Hello HarmonyOS”

      //声明函数
      function print(){for (let i=0; i<10;i++){console.log('Hello HarmonyOS')}
      }//调用函数
      print()
      1.11.5. 返回类型推断

      如果可以从函数体内推断出函数返回类型,则可在函数声明中省略标注返回类型。

      // 显式指定返回类型
      function foo(): string {return 'foo';
      }// 推断返回类型为string
      function goo() {return 'goo'; 
      }
      1.11.6. 箭头函数

      箭头函数(又名Lambda函数),它是一种比普通函数更加简洁的函数写法。
      箭头函数的格式

      let 函数名 = (参数列表):返回值类型=>{函数的执行代码return 结果
      }

      例:使用箭头函数,矩形的面积

      //声明箭头函数
      let rectArea = (width: number, height: number): number => { return width * height }//调用箭头函数
      let s1: number = rectArea(100,50)

      箭头函数的返回值类型可以省略,省略时,返回值通过类型推断;
       

      //声明箭头函数
      let rectArea = (width: number, height: number) => { return width * height }//调用箭头函数
      let s1 = rectArea(100,50)

      如果箭头函数的函数体语句只有一条,{}、return也可以省略

      //声明箭头函数
      let rectArea = (width: number, height: number) => width * height //调用箭头函数
      let s2 = rectArea(100,50)
      1.11.7. 可选参数

      在参数名称后面加上?表示参数是可选的,意思就是调用时可以传递参数,也可以不传递参数。
       

      function buildName(firstName: string, lastName?: string) {if (lastName)return firstName + " " + lastName;elsereturn firstName;
      }let result1 = buildName("李");  // 正确
      let result2 = buildName("李", "世明");  // 正确
      1.11.8. 可变参数

      可变参数指的是可以让函数接受任意数量的参数。可变参数其本质是一个数组。

      // 需求:定义函数,求任意几个数据的和
      function sum(...numbers: number[]): number {let sum = 0;for (let num of numbers) {sum += num;}return sum;
      }// 调用函数,传入任意数量的参数  
      let res1 = sum(1, 2, 3)
      let res2 = sum(1, 2, 3, 4, 5, 6)

相关文章:

2024最新版鸿蒙纯血原生应用开发教程文档丨学习ArkTS语言-基本语法

ArkTS是HarmonyOS的主要应用开发语言&#xff0c;在TypeScript基础上进行了扩展&#xff0c;保留了其基本风格&#xff0c;并通过增强静态检查和分析来提高程序的稳定性和性能。本教程将帮助开发者掌握ArkTS的核心功能、语法及最佳实践&#xff0c;以便高效地构建高性能移动应用…...

微信小程序-二维码绘制

wxml <view bindlongtap"saveQrcode"><!-- 二维码 --><view style"position: absolute;background-color: #FFFAEC;width: 100%;height: 100vh;"><canvas canvas-id"myQrcode" style"width: 200px; height: 200px;ba…...

轻量化网络设计|ShuffleNet:深度学习中的轻量化革命

一、引言 在深度学习中&#xff0c;卷积神经网络&#xff08;Convolutional Neural Networks&#xff0c;CNN&#xff09;无疑是大家最耳熟能详的算法之一。自诞生以来&#xff0c;CNN 在图像分类、目标检测、语义分割等众多计算机视觉任务中取得了令人瞩目的成就&#xff0c;…...

一天记20个忘10个之五:land

一天记20个忘10个之五&#xff1a;land land n.陆地&#xff0c;土地 v.着陆&#xff0c;降落 // la-拉、宽广 nd后缀 字面义&#xff1a;宽广的土地 陆地 landing n.着陆&#xff0c;降落lander n.登陆车&#xff0c;着陆者 派生&#xff1a; island岛,岛屿 //isle(n.用于…...

Python 类(创建和使用类)

面向对象编程 是最有效的软件编写方法之一。在面向对象编程中&#xff0c;你编写表示现实世界中的事物和情景的类&#xff0c;并基于这些类来创建对象。编写类时&#xff0c;你定义一大类对 象都有的通用行为。基于类创建对象 时&#xff0c;每个对象都自动具备这种通用行为&am…...

LeetCode 解题思路 3(Hot 100)

解题思路&#xff1a; 初始化指针&#xff1a; 左指针指向数组起始位置&#xff0c;右指针指向数组末尾。计算当前面积&#xff1a; 左右指针相遇前所围成的矩形面积。​更新最大面积&#xff1a; 比较当前面积与已知最大面积。​移动指针&#xff1a; 移动较高指针无法获得更…...

算法-二叉树篇11-左叶子之和

左叶子之和 力扣题目链接 题目描述 给定二叉树的根节点 root &#xff0c;返回所有左叶子之和。 解题思路 层次遍历的时候&#xff0c;保留每层第一个节点并相加即可。 题解 class Solution { public:int sumOfLeftLeaves(TreeNode* root) {if(root NULL){return 0;}re…...

MaxKB上架至阿里云轻量应用服务器镜像市场

近日&#xff0c;MaxKB开源知识库问答系统已上架至阿里云轻量应用服务器镜像市场&#xff0c;目前是阿里云此类镜像市场中唯一推荐的AI应用镜像。 ▲图1 MaxKB已经上架至阿里云轻量应用服务器镜像市场 MaxKB是飞致云旗下开源项目&#xff0c;是一款基于大语言模型和RAG&…...

用户态和内核态是什么?

用户态&#xff08;User Mode&#xff09;和内核态&#xff08;Kernel Mode&#xff09;。这两个概念是理解操作系统工作原理的基础。 1. 什么是用户态和内核态&#xff1f; 1.1 用户态&#xff08;User Mode&#xff09; 用户态是操作系统为普通应用程序提供的运行模式。在这…...

2025年SCI一区智能优化算法:混沌进化优化算法(Chaotic Evolution Optimization, CEO),提供MATLAB代码

一、混沌进化优化算法 https://github.com/ITyuanshou/MATLABCode 1. 算法简介 混沌进化优化算法&#xff08;Chaotic Evolution Optimization, CEO&#xff09;是2025年提出的一种受混沌动力学启发的新型元启发式算法。该算法的主要灵感来源于二维离散忆阻映射的混沌进化过…...

普中单片机-51TFT-LCD显示屏(1.8寸 STM32)

普中官方论坛&#xff1a; http://www.prechin.cn/gongsixinwen/208.html 普中科技-各型号开发板资料链接&#xff1a;https://www.bilibili.com/read/cv23681775/?spm_id_from333.999.0.0 27-TFTLCD显示实验_哔哩哔哩_bilibili 2.程序烧录 2.1设置彩屏驱动 3.实验效果...

SGMII(Serial Gigabit Media Independent Interface)详解

一、SGMII的定义与作用 SGMII&#xff08;串行千兆介质无关接口&#xff09;是一种用于千兆以太网&#xff08;1Gbps&#xff09;的串行接口标准&#xff0c;旨在通过减少引脚数量和简化设计&#xff0c;实现MAC层与PHY芯片之间的高速通信。其核心作用包括&#xff1a; 引脚精…...

DeepSeek:我的AI助手之旅

★【前言】: 初次使用AI助手帮我写作,就像摸石头过河一样,一点点的前行。我在慢慢的摸索,慢慢的体会中,感悟出的一点个人心得体会现分享给大家。这也说明一个问题,网站上各种使用方法和技巧是对于已经使用过的人来说的方便和快捷,但对于刚刚接触的使用者来说,网上的各…...

图片批量去重---(均值哈希、插值哈希、感知哈希、三/单通道直方图)

一、整体步骤 本脚本中&#xff0c;关键步骤包括以下步骤&#xff1a; 1、图片加载&#xff1a; 脚本会遍历指定的图片目录&#xff0c;将所有图片加载到内存中。 2、图像预处理&#xff1a; 比较之前&#xff0c;通常需要对图片进行预处理&#xff0c;如调整大小、灰度化或直方…...

Linux:(3)

一&#xff1a;Linux和Linux互传&#xff08;压缩包&#xff09; scp:Linux scp 命令用于 Linux 之间复制文件和目录。 scp 是 secure copy 的缩写, scp 是 linux 系统下基于 ssh 登陆进行安全的远程文件拷贝命令。 scp 是加密的&#xff0c;rcp 是不加密的&#xff0c;scp 是…...

vscode设置自动换行

vscode设置自动换行 方法 方法 点击文件->首选项->设置。搜索word wrap -> 选择 on 。 搜索Word Wrap&#xff0c;并把选项改为on。...

Instagram 隐私设置全面解析:如何保护你的个人数据?

Instagram 隐私设置全面解析&#xff1a;如何保护你的个人数据&#xff1f; 在这个数字化时代&#xff0c;社交媒体平台如 Instagram 已成为我们日常生活的一部分。然而&#xff0c;随着个人信息泄露和隐私侵犯事件的频发&#xff0c;保护个人数据变得尤为重要。本文将全面解析…...

Activiti 5 + Spring Boot全流程开发指南

目录 一、环境搭建&#xff08;Spring Boot 2.x&#xff09; 1.1 依赖配置 1.2 配置文件 二、流程定义与部署 2.1 创建BPMN文件&#xff08;leave.bpmn&#xff09; 2.2 流程部署服务 三、流程操作核心实现 3.1 启动流程实例 3.2 查询待办任务 四、审批流程处理 4.1 …...

spring结合mybatis多租户实现单库分表

实现单库分表 思路&#xff1a;student表数据量大&#xff0c;所以将其进行分表处理。一共有三个分表&#xff0c;分别是student0&#xff0c;student1&#xff0c;student2&#xff0c;在新增数据的时候&#xff0c;根据请求头中的meta-tenant参数决定数据存在哪张表表。 数…...

面向对象编程(OOP)基础:Java入门指南

引言 随着计算机技术的发展&#xff0c;软件的应用越来越复杂&#xff0c;单个程序的功能也逐渐增多。为了提高代码的复用性和可维护性&#xff0c;Java语言引入了**面向对象编程&#xff08;Object-Oriented Programming, OOP&#xff09;**这一设计理念。 OOP是一种设计程序…...

利用ngx_stream_return_module构建简易 TCP/UDP 响应网关

一、模块概述 ngx_stream_return_module 提供了一个极简的指令&#xff1a; return <value>;在收到客户端连接后&#xff0c;立即将 <value> 写回并关闭连接。<value> 支持内嵌文本和内置变量&#xff08;如 $time_iso8601、$remote_addr 等&#xff09;&a…...

Vue2 第一节_Vue2上手_插值表达式{{}}_访问数据和修改数据_Vue开发者工具

文章目录 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染2. 插值表达式{{}}3. 访问数据和修改数据4. vue响应式5. Vue开发者工具--方便调试 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染 准备容器引包创建Vue实例 new Vue()指定配置项 ->渲染数据 准备一个容器,例如: …...

【SQL学习笔记1】增删改查+多表连接全解析(内附SQL免费在线练习工具)

可以使用Sqliteviz这个网站免费编写sql语句&#xff0c;它能够让用户直接在浏览器内练习SQL的语法&#xff0c;不需要安装任何软件。 链接如下&#xff1a; sqliteviz 注意&#xff1a; 在转写SQL语法时&#xff0c;关键字之间有一个特定的顺序&#xff0c;这个顺序会影响到…...

python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)

更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...

【单片机期末】单片机系统设计

主要内容&#xff1a;系统状态机&#xff0c;系统时基&#xff0c;系统需求分析&#xff0c;系统构建&#xff0c;系统状态流图 一、题目要求 二、绘制系统状态流图 题目&#xff1a;根据上述描述绘制系统状态流图&#xff0c;注明状态转移条件及方向。 三、利用定时器产生时…...

涂鸦T5AI手搓语音、emoji、otto机器人从入门到实战

“&#x1f916;手搓TuyaAI语音指令 &#x1f60d;秒变表情包大师&#xff0c;让萌系Otto机器人&#x1f525;玩出智能新花样&#xff01;开整&#xff01;” &#x1f916; Otto机器人 → 直接点明主体 手搓TuyaAI语音 → 强调 自主编程/自定义 语音控制&#xff08;TuyaAI…...

深入解析C++中的extern关键字:跨文件共享变量与函数的终极指南

&#x1f680; C extern 关键字深度解析&#xff1a;跨文件编程的终极指南 &#x1f4c5; 更新时间&#xff1a;2025年6月5日 &#x1f3f7;️ 标签&#xff1a;C | extern关键字 | 多文件编程 | 链接与声明 | 现代C 文章目录 前言&#x1f525;一、extern 是什么&#xff1f;&…...

laravel8+vue3.0+element-plus搭建方法

创建 laravel8 项目 composer create-project --prefer-dist laravel/laravel laravel8 8.* 安装 laravel/ui composer require laravel/ui 修改 package.json 文件 "devDependencies": {"vue/compiler-sfc": "^3.0.7","axios": …...

Xen Server服务器释放磁盘空间

disk.sh #!/bin/bashcd /run/sr-mount/e54f0646-ae11-0457-b64f-eba4673b824c # 全部虚拟机物理磁盘文件存储 a$(ls -l | awk {print $NF} | cut -d. -f1) # 使用中的虚拟机物理磁盘文件 b$(xe vm-disk-list --multiple | grep uuid | awk {print $NF})printf "%s\n"…...

基于Java Swing的电子通讯录设计与实现:附系统托盘功能代码详解

JAVASQL电子通讯录带系统托盘 一、系统概述 本电子通讯录系统采用Java Swing开发桌面应用&#xff0c;结合SQLite数据库实现联系人管理功能&#xff0c;并集成系统托盘功能提升用户体验。系统支持联系人的增删改查、分组管理、搜索过滤等功能&#xff0c;同时可以最小化到系统…...