【微信小程序实战教程】之微信小程序 WXS 语法详解
WXS语法
WXS是微信小程序的一套脚本语言,其特性包括:模块、变量、注释、运算符、语句、数据类型、基础类库等。在本章我们主要介绍WXS语言的特性与基本用法,以及 WXS 与 JavaScript 之间的不同之处。
1 WXS介绍
在微信小程序中,除了逻辑层使用的 JavaScript 脚本语言之外,微信小程序还有一套自己的脚本语言WXS(全称 WeiXin Script)。在实际项目开发中,WXS通常被用来做页面数据的过滤或者是使用WXS进行数据的计算处理,然后结合WXML组件,可以构建小程序的页面结构。
在小程序页面中,WXS 的用法有点类似于HTML中的 <script>
标签,但是WXS与JavaScript又是两种不同的脚本语言。WXS 有自己的语法,但在某些语法方面又和 JavaScript 及其相似,所以很容易让开发者误以为 WXS 就是微信小程序中的 JavaScript 脚本。
2 基础语法
2.1 WXS 模块
WXS 模块可以通过 WXML 文件中的 <wxs>
标签进行声明,或者是在WXML文件内引入 .wxs
后缀名的文件。每一个 .wxs
后缀名的文件和 <wxs>
标签都是一个单独的模块,而且每个模块都有自己独立的作用域,开发者在模块中声明的变量和函数都是私有的,其他模块对该模块内的变量和函数是不可见的。如果要想把一个模块中的私有变量和私有函数对外暴露,需要使用 module.exports
语句实现。
WXML文件提供的 <wxs>
标签上有两个属性,分别是module和src。其中,module属性的值是字符串类型的,用来表示当前 <wxs>
标签的模块名,该属性是一个必填字段,在其他模块中也是通过模块名称来引入该模块中的私有属性与函数的。在单独是 WXML 文件中,<wxs>
的module属性值都是唯一的,如果有重复模块名称,则按照定义的先后顺序进行引用,即后者会覆盖前者。在不同文件之间的WXS模块名不会相互覆盖,互不影响。
<wxs>
标签的module属性值的命名必须遵守以下两个规范:
- 模块名称只能由大小写字母、数字、下划线组成;
- 模块名的首字符必须为大小写字母或下划线,不能为数字。
module属性值就是当前模块的模块名称,其命名规范和常见的编程语言中标识符命名规则相似。在WXML文件中直接使用 <wxs>
标签定义module模块的代码如例1所示。
【例1】定义wxs模块
<!-- index.wxml -->
<wxs module="data">var str = "hello world";module.exports = {msg: str}
</wxs>
<view>data模块的值:{{ data.msg }}</view>
上面代码运行后的效果如图1所示。
图1 wxs模块输出效果
在例1中声明了一个名字为data的模块,将模块中str字符串变量复制给data模块中的msg属性,并向外暴露,在当前页面可以使用data.msg
获取模块中定义的值。
<wxs>
标签上还有另外一个src属性,值也是字符串类型,用于表示引入的.wxs
文件的相对路径,只有在当前的<wxs>
标签为单闭合标签或者标签的内容为空时有效。使用src属性引入其他.wxs
文件时,需要注意以下几点:
- 只用引入
.wxs
文件模块,且必须使用相对路径; - WXS模块均为单例,当WXS模块在第一次被引用时,会自动初始化为单例对象;如果在多个页面或多个地方被多次引用时,使用的都是同一个WXS模块对象;
- 如果一个WXS模块在定义后一直没有被引用,则该模块不会被解析执行。
在微信开发者工具中的index页面文件夹上点击鼠标右键,选择“新建文件”,效果如图2所示。
图2 选择新建文件
将新建文件命名为tool.wxs
,该文件就是一个独立的WXS模块文件,在文件中可以直接编写WXS脚本,其代码如例2所示。
【例2】WXS脚本文件代码
// tool.wxs
var str = "hello world from tool.wxs";
var sum = function(a,b) {return a+b
}
module.exports = {msg: str,sum: sum
}
上面例子中的.wxs
文件可以被其他的WXML文件或.wxs
文件引用,如果在WXML文件中引用,其代码如例3所示。
【例3】WXML中引入.wxs
文件
<!-- index.wxs -->
<wxs src="./tool.wxs" module="data" />
<view>data模块的值:{{ data.msg }}</view>
<view>求和:1 + 2 = {{ data.sum(1,2) }}</view>
上面代码运行后的效果如图3所示。
图3 WXML中引入.wxs
文件运行效果
.wxs
文件还可以被其他的.wxs
文件引用,引用时需要使用require函数。在引用.wxs
文件时,需要注意以下几点:
- 只能引用
.wxs
文件模块,且必须使用相对路径; - wxs 模块均为单例,wxs 模块在第一次被引用时,会自动初始化为单例对象;多个页面,多个地方,多次引用,使用的都是同一个 wxs 模块对象;
- 如果一个 wxs 模块在定义之后,一直没有被引用,则该模块不会被解析与运行。
.wxs
文件引入其他WXS模块代码如例4所示。
【例4】
// tools.wxs
var foo = "'hello world' from tools.wxs";
var bar = function (d) {return d;
}
module.exports = {FOO: foo,bar: bar,
};
module.exports.msg = "some msg";// logic.wxs
var tools = require("./tools.wxs");
console.log(tools.FOO);
console.log(tools.bar("logic.wxs"));
console.log(tools.msg);
<!-- /page/index/index.wxml -->
<wxs src="./../logic.wxs" module="logic" />
上面代码运行后,控制台输出效果如下:
'hello world' from tools.wxs
logic.wxs
some msg
在使用WXS模块时需要注意以下几点:
<wxs>
模块只能在定义模块的 WXML 文件中被访问到。使用<include>
或<import>
时,<wxs>
模块不会被引入到对应的 WXML 文件中;<template>
标签中,只能使用定义该<template>
的 WXML 文件中定义的<wxs>
模块。
2.2 变量
WXS脚本的语法与JavaScript语法非常相似,但是二者又有着自己独特的语法规则,例如在WXS脚本中声明变量,必须使用 var 语句,不能使用const、let这些语句,这点和JavaScript是不同的。WXS中的变量均为值的引用,没有声明的变量直接赋值使用,会被定义为全局变量。如果只声明变量而不赋值的话,该变量会被默认赋值为undefined。WXS脚本声明变量的示例代码如例5所示。
【例5】WXS脚本声明变量
var foo = 1;
var bar = "hello world";
var i; // i === undefined
上面代码,分别声明了 foo、 bar、 i 三个变量。然后,foo 赋值为数值 1 ,bar 赋值为字符串 “hello world”。
在WXS脚本中的变量名可以称为是标识符,变量命名时需要遵循以下规则:
- 变量名只能由大小写英文字母、数字、下划线组成;
- 首字符必须是大小写英文字母或下划线,不能为数字;
- 变量名不能使用WXS脚本保留的关键字。
WXS脚本保留的关键字为:delete、void、typeof、null、undefined、NaN、Infinity、var、if、else、true、false、require、this、function、arguments、return、for、while、do、break、continue、switch、case、default等25个标识符。
2.3 注释
WXS脚本中的注释与JavaScript中的注释一样,有两种常见的注释方法,分别是单行注释和多行注释。注释代码如例6所示。
【例6】WXS脚本注释
<wxs module="sample">
// 方法一:单行注释/*
方法二:多行注释
*/
</wxs>
WXS脚本中还有一种独特的注释方法,即结尾注释。直接在要注释的代码前面使用 /* 的方式将代码注释,从 /* 开始往后所有的WXS代码都会被注释,其代码如例7所示。
【例7】结尾注释
<wxs module="sample">/*
方法三:结尾注释。即从 /* 开始往后的所有 WXS 代码均被注释
var a = 1;
var b = 2;
var c = "fake";</wxs>
在上面的例子中,所有的WXS代码均被注释掉了。
2.4 运算符
运算符用于执行程序代码运算,会针对一个以上操作数项目来进行运算。WXS脚本中的运算符可以分为基本运算符、一元运算符、位运算符、比较运算符、等值运算符、赋值运算符、二元逻辑运算符等7种。
基本运算符主要用于四则运算,代码如例8所示。
【8】基本运算符
var a = 10, b = 20;// 加法运算
console.log(30 === a + b);
// 减法运算
console.log(-10 === a - b);
// 乘法运算
console.log(200 === a * b);
// 除法运算
console.log(0.5 === a / b);
// 取余运算
console.log(10 === a % b);
一元运算符主要用于变量的自增、自减等简单运算,代码如例9所示。
【例9】一元运算符
var a = 10, b = 20;// 自增运算
console.log(10 === a++);
console.log(12 === ++a);
// 自减运算
console.log(12 === a--);
console.log(10 === --a);
// 正值运算
console.log(10 === +a);
// 负值运算
console.log(0-10 === -a);
// 否运算
console.log(-11 === ~a);
// 取反运算
console.log(false === !a);
// delete 运算
console.log(true === delete a.fake);
// void 运算
console.log(undefined === void a);
// typeof 运算
console.log("number" === typeof a);
WXS脚本中也可以使用二进制的位运算,代码如例10所示。
【例10】位运算符
var a = 10, b = 20;// 左移运算
console.log(80 === (a << 3));
// 带符号右移运算
console.log(2 === (a >> 2));
// 无符号右移运算
console.log(2 === (a >>> 2));
// 与运算
console.log(2 === (a & 3));
// 异或运算
console.log(9 === (a ^ 3));
// 或运算
console.log(11 === (a | 3));
比较运算也是常见的逻辑运算中的一种,代码如例11所示。
【例11】比较运算符
var a = 10, b = 20;// 小于
console.log(true === (a < b));
// 大于
console.log(false === (a > b));
// 小于等于
console.log(true === (a <= b));
// 大于等于
console.log(false === (a >= b));
等值运算符主要是判断两个变量的值是否相等,代码如例12所示。
【例12】等值运算符
var a = 10, b = 20;// 等号
console.log(false === (a == b));
// 非等号
console.log(true === (a != b));
// 全等号
console.log(false === (a === b));
// 非全等号
console.log(true === (a !== b));
赋值运算符也是最常见的一种运算符,用于为变量赋值,代码如例13所示。
【例13】赋值运算符
var a = 10;a = 10; a *= 10;
console.log(100 === a);
a = 10; a /= 5;
console.log(2 === a);
a = 10; a %= 7;
console.log(3 === a);
a = 10; a += 5;
console.log(15 === a);
a = 10; a -= 11;
console.log(-1 === a);
a = 10; a <<= 10;
console.log(10240 === a);
a = 10; a >>= 2;
console.log(2 === a);
a = 10; a >>>= 2;
console.log(2 === a);
a = 10; a &= 3;
console.log(2 === a);
a = 10; a ^= 3;
console.log(9 === a);
二元逻辑运算符就是用于逻辑与、逻辑或的运算符,代码如例14所示。
【例14】二元逻辑运算符
var a = 10, b = 20;// 逻辑与
console.log(20 === (a && b));
// 逻辑或
console.log(10 === (a || b));
在WXS脚本中的运算符之间存在优先级关系,运算符的优先级决定了表达式中运算执行的先后顺序。优先级从上到下依次递减,最上面具有最高的优先级,逗号操作符具有最低的优先级。表达式的结合次序取决于表达式中各种运算符的优先级。优先级高的运算符先结合,优先级低的运算符后结合,同一行中的运算符的优先级相同。在WXS脚本中,括号“()”的优先级最高,逗号“,”的优先级最低。
2.5 语句
WXS脚本中主要包含了两类语句,一类是分支语句,包括if语句、switch语句;另一类是循环语句,包括for语句、while语句。
在WXS脚本中if的用法如例15所示。
【例15】if语句
if (表达式) {// 代码块
} else if (表达式) {// 代码块
} else {// 代码块
}
当大括号中的代码只有一行时,大括号“{}”可以省略,效果如例16所示。
【例16】if语句的简写方式
if (表达式) 语句;
else 语句;// 或者是if (表达式)语句;
else语句;
switch语句需要用到case关键字进行分支,case关键字后面只能使用变量、数字、字符串,最后都不满足的条件使用default关键字分支。switch语句的语法如例17所示。
【例17】switch语法
switch (表达式) {case 变量:语句;case 数字:语句;break;case 字符串:语句;default:语句;
}
switch语句的用法与if不同,但是都可以用于分支,其最终执行的结果是类似的。if语句的条件是表达式,而switch语句的条件是满足表达式的值。switch语句的示例代码如例18所示。
【例18】switch示例
var week = 1;switch (week) {
case 1:console.log("周一");break;
case 2:console.log("周二");break;
case 3:console.log("周三");break;
case 4:console.log("周四");break;
case 5:console.log("周五");break;
case 6:console.log("周六");break;
case 7:console.log("周日");break;
default:console.log("请输入正确的周数");
}
上面示例代码运行后,在控制台输出结果如下:
周一
如果有过JavaScript语言或其他编程语言的学习经历的话,肯定对循环并不陌生,特别是for循环。WXS脚本的for循环语法与JavaScript语言的for循环语法是一样的,具体代码如例19所示。
【例19】for循环语法
for (语句; 语句; 语句)语句;// 或者是for (语句; 语句; 语句) {代码块;
}
for循环的示例代码如例20所示。
【例20】for循环示例
for (var i = 0; i < 3; ++i) {console.log(i);if( i >= 1) break;
}
上面示例代码运行后,在控制台输出的结果如下:
0
1
while也是用于循环的语句,当表达式的值为true时,循环执行语句或代码块,在代码块中也支持break、continue关键词来跳过循环,其语法代码如例21所示。
【例21】while语句语法
while (表达式)语句;// 或者是while (表达式){代码块;
}
我们还可以使用do-while
语句来执行循环,其语法如例22所示。
do {代码块;
} while (表达式)
在使用while
或do-while
语句执行循环的代码时,一定要注意在合适的时机设置表达式的值为false,或者是合理设置跳出循环,否则将会出现死循环的情况。如果实际开发需求中需要使用到无限循环,可以不做跳出循环的操作。
3 数据类型
WXS脚本语言中的变量可以保存多种数据类型,包括数值、字符串、布尔值、对象、函数、数组等。WXS脚本语言中的数据类型分为基本数据类型和引用数据类型,基本数据类型是指简单的数据段,引用数据类型是指有多个值构成的对象。当我们把一个值赋值给一个变量时,解析器首先要确认这个值是基本数据类型还是引用数据类型,以此来判断该值存储的内存位置与大小。
3.1 基本数据类型
在WXS脚本语言中,基本数据类型包括number(数值)、string(字符串)、boolean(布尔值)等。
number包括两种数值,分别是整数和小数,示例如下:
var a = 10;
var PI = 3.141592653589793;
number也可以作为对象类型,其方法可以参考ECMAScript5标准,常见的方法有:
- toString()
- toLocaleString()
- valueOf()
- toFixed()
- toExponential()
- toPrecision()
WXS的其他几种基本数据类型的属性与方法都可以参考ES5标准。其中,string字符串的值可以使用单引号和双引号两种写法,boolean类型只有两个特定的值,分别是true和false。
3.2 引用数据类型
WXS脚本语言中的引用数据类型包括object(对象)、array(数组)、function(函数)、date(日期)等,这些引用数据类型与基本数据类型不同的是,基本数据类型是简单的数据段,被保存在栈内存中,而引用数据类型是有多个值构成的对象,被保存在堆内存中。
WXS脚本语言与其他语言不同的是,开发者不可以直接访问堆内存空间中的位置,也不能直接操作堆内存空间,只能操作对象在栈内存中的引用地址。所以,引用类型的数据在栈内存中保存的是对象在堆内存中的引用地址,通过这个引用地址可以快速查找到保存在堆内存中的对象。
(1)object对象
在WXS脚本中,object对象是一种无序的键值对,如果想要定义一个object对象,可以使用以下方法:
// 生成一个新的空对象
var o = {}
//生成一个新的非空对象
o = {str: '',i: 1,fn: function() {}
};
调用对象中的属性时,可以使用“对象.属性”的语法获取对应属性的值,示例代码如下:
// 读取对象属性
console.log(o.str)
(2)function函数
WXS脚本语言中有三种函数的用法,分别是普通函数、匿名函数和闭包函数。普通函数可以直接使用function关键字声明,也可以将一个匿名函数赋值给某个变量,示例代码如下:
// 普通函数
function fn () {}
// 或者是
var fn = function () {}
闭包就是能够读取其他函数内部变量的函数,WXS脚本语言中也可以像JavaScript语言那样使用闭包,示例代码如例22所示。
【例22】闭包
var a = function (x) {return function () { return x;}
}
var b = a(100);
console.log( 100 === b() ); // true
(3)array数组
array支持两种定义数组的方式,一种是生成一个新的空数组,语法如下:
var a = [];
另一种是生成一个新的非空数组,数组中的元素可以是任意类型,语法如下:
var a = [1,"a",{},function(){}];
array对象上也定义了一系列操作数组的方法,例如数组转字符串的toString()
、追加元素的push()
、用于排序的sort()
等方法,关于array对象的具体方法可以参考ES5标准。
(4)date日期
在WXS脚本中,想要生成一个date日期类型的对象,需要借助getDate()
方法,该方法用于返回当前的日期对象。开发者也可以使用getDate()
方法提供的多种重载方法,生成不同格式的日期对象,语法如下所示:
getDate()
getDate(milliseconds)
getDate(datestring)
getDate(year, month[, date[, hours[, minutes[, seconds[, milliseconds]]]]])
在上面getDate()
重载方法的参数中,milliseconds是指从1970年1月1日零点开始计算到指定日期时间之间的毫秒数;datestring是指日期字符串,格式为:month day, year hours:minutes:seconds
。
3.3 正则表达式
正则表达式(英文全称 Regular Expression,简写 regex、regexp或RE)是使用单个字符串来描述、匹配一系列符合某个句法规则的字符串搜索模式,可以用于文本搜索和文本替换等操作中。正则表达式不属于某个编程语言,而是一种由一个字符序列形成的搜索模式。正则表达式可以是一个简单的字符,或者是一个更复杂的模式,当开发者在文本中搜索数据时,可以用搜索模式来描述要查询的内容。
在WXS脚本中,生成正则表达式对象需要使用getRegExp()
方法,语法如下:
getRegExp(pattern[, flags])
getRegExp()
方法的参数pattern表示正则表达式的内容;参数flags表示修饰符,该字段只能包含以下字符:
- g:表示global,执行全局匹配(查找所有匹配而非在找到第一个匹配后停止)。
- i:表示ignoreCase,执行对大小写不敏感的匹配。
- m:表示multiline,执行多行匹配。
正则表达式的示例代码如例23所示。
【例23】
var a = getRegExp("x", "img");
console.log("x" === a.source); // true
console.log(true === a.global); // true
console.log(true === a.ignoreCase); // true
console.log(true === a.multiline); // true
3.4 数据类型判断
在WXS脚本中,可以借助每个对象的constructor属性来判断数据类型,示例代码如例24所示。
【例24】constructor属性判断数据类型
var number = 10;
console.log( "Number" === number.constructor ); // truevar string = "str";
console.log( "String" === string.constructor ); // truevar boolean = true;
console.log( "Boolean" === boolean.constructor ); // truevar object = {};
console.log( "Object" === object.constructor ); // truevar func = function(){};
console.log( "Function" === func.constructor ); // truevar array = [];
console.log( "Array" === array.constructor ); // truevar date = getDate();
console.log( "Date" === date.constructor ); // truevar regexp = getRegExp();
console.log( "RegExp" === regexp.constructor ); // true
也可以使用typeof来区分部分数据类型,示例代码如例25所示。
【例25】typeof区分数据类型
var number = 10;
var boolean = true;
var object = {};
var func = function(){};
var array = [];
var date = getDate();
var regexp = getRegExp();console.log( 'number' === typeof number ); // true
console.log( 'boolean' === typeof boolean ); // true
console.log( 'object' === typeof object ); // true
console.log( 'function' === typeof func ); // true
console.log( 'object' === typeof array ); // true
console.log( 'object' === typeof date ); // true
console.log( 'object' === typeof regexp ); // true
console.log( 'undefined' === typeof undefined ); // true
console.log( 'object' === typeof null ); // true
4 基础类库
WXS的数据类型一共有八种,这与JavaScript的六中数据类型不太一致。在WXS脚本语言中,基本数据类型包括number、string、boolean、object、array、function、date、regexp等八种。在WXS脚本中的八种数据类型与JavaScript的数据类型有所不同,例如生成date对象时需要使用getDate()
函数,生成 regexp 对象需要使用 getRegExp函数,这些对象都不能使用new关键字直接生成。WXS脚本基于这八种数据类型,派生出六种基础类库,分别是console、Math、JSON、Number、Date和Global。
WXS脚本语言的基础类库与JavaScript语言的ES5标准是基本是一样的,区别在于WXS中的console基础类库只提供了console.log()
函数。其他的基础类库中对象的数据和函数,可以参考ES5标准文档。
5 本章小结
本章我们学习了WXS的一些语法特性,其实WXS语法和JavaScript的语法基本上是一致的,只是对JavaScript脚本语言的上层做了一些封装和限制。二者相同的地方非常多,例如if-else、switch、for等用于分支和循环的常用语法,还包括一些基础的类库。但是二者也有一些区别,例如在WXS模块中不支持try-catch语句。WXS脚本可以方便开发者在WXML中快速定义私有变量和函数,在使用WXS语言时可以参考ES5标准,但是还要注意WXS语法与JavaScript语法的区别。
相关文章:

【微信小程序实战教程】之微信小程序 WXS 语法详解
WXS语法 WXS是微信小程序的一套脚本语言,其特性包括:模块、变量、注释、运算符、语句、数据类型、基础类库等。在本章我们主要介绍WXS语言的特性与基本用法,以及 WXS 与 JavaScript 之间的不同之处。 1 WXS介绍 在微信小程序中,…...

Android中Service学习记录
目录 一 概述二 生命周期2.1 启动服务startService()2.2 绑定服务bindService()2.3 先启动后绑定2.4 先绑定后启动 三 使用3.1 本地服务(启动式)3.2 可通信的服务(绑定式)3.3 前台服务3.4 IntentService 总结参考 一 概述 Servic…...

Elasticsearch:Java ECS 日志记录 - log4j2
ECS 记录器是你最喜欢的日志库的格式化程序/编码器插件。它们可让你轻松将日志格式化为与 ECS 兼容的 JSON。ECS 兼容的 JSON 日志记录可以帮我们简化很多分析,可视化及解析的工作。在今天的文章里,我来详述如何在 Java 应用里生成 ECS 相兼容的日志。 …...

MongoDB自学笔记(四)
一、前文回顾 上一篇文章中我们学习了MongoDB中的更新方法,也学了一部分操作符。今天我们将学习最后一个操作“删除”。 二、删除 原始数据如下: 1、deleteOne 语法:db.collection.deleteOne(< query >,< options >) 具体参…...

时序分解 | Matlab基于CEEMDAN-CPO-VMD的CEEMDAN结合冠豪猪优化算法(CPO)优化VMD二次分解
时序分解 | Matlab基于CEEMDAN-CPO-VMD的CEEMDAN结合冠豪猪优化算法(CPO)优化VMD二次分解 目录 时序分解 | Matlab基于CEEMDAN-CPO-VMD的CEEMDAN结合冠豪猪优化算法(CPO)优化VMD二次分解效果一览基本介绍程序设计参考资料 效果一览…...

新版海螺影视主题模板M3.1全解密版本多功能苹果CMSv10后台自适应主题
苹果CMS2022新版海螺影视主题M3.1版本,这个主题我挺喜欢的,之前也有朋友给我提供过原版主题,一直想要破解但是后来找了几个SG11解密的大哥都表示解密需要大几百大洋,所以一直被搁置了。这个版本是完全解密的,无需SG11加…...

汽车免拆诊断案例 | 2014 款上汽名爵 GT 车发动机无法起动
故障现象 一辆2014款上汽名爵GT车,搭载15S4G发动机,累计行驶里程约为18.4万km。该车因左前部发生碰撞事故进厂维修,更换损坏的部件后起动发动机,起动机运转有力,但无着机迹象。用故障检测仪检测,发现无法与…...

vue3前端开发-小兔鲜项目-登录功能的业务接口调用
vue3前端开发-小兔鲜项目-登录功能的业务接口调用!这次,正式调用远程服务器的登录接口了。大家要必须使用测试账号密码,才能验证我们的代码。 测试账号密码是:账号(xiaotuxian001);密码是(1234…...

【Linux】vim编辑器使用详解
目录 一、vim编辑器简介二、 vim编辑器使用指南1.基本操作1.进入与退出2.模式切换 2.命令模式1.移动光标2.选择文本(可视模式)3.删除文字4.复制粘贴5.替换6.撤销7.注释8.多文件窗口切换 3.底行模式1.列出每行的行号2.跳转到某行3.查找字符4.保存文件5.在…...

手机怎么设置不同的ip地址
在数字化日益深入的今天,智能手机已成为我们生活、工作和学习中不可或缺的设备。然而,随着网络应用的广泛和深入,我们有时需要为手机设置不同的IP地址来满足特定需求。比如,避免网络限制、提高网络安全、或者进行网络测试等。本文…...
SpringBoot读取配置的6种方式
在SpringBoot应用开发中,配置文件是不可或缺的一部分。它们帮助我们管理应用的运行时参数,使得应用的部署和维护变得更加灵活。SpringBoot提供了多种方式来读取配置文件,每种方式都有其适用场景和优缺点。本文将介绍六种常用的SpringBoot读取…...
1.1 openCv -- 介绍
OpenCV(开放源代码计算机视觉库:http://opencv.org)是一个开源库,包含了数百种计算机视觉算法。本文件描述了所谓的OpenCV 2.x API,这是一个本质上基于C++的API,与基于C的OpenCV 1.x API(C API已被弃用,并且自从OpenCV 2.4版本起不再使用“C”编译器进行测试)相对。 …...
探索PostgreSQL的GUI工具:提升数据库管理效率
在当今快速发展的技术世界中,数据库管理是任何软件开发项目的核心部分。PostgreSQL,作为一款功能强大的开源关系型数据库管理系统,因其稳定性、可靠性和高度的可扩展性而广受开发者和数据库管理员的青睐。然而,尽管PostgreSQL自带…...

【从零开始实现stm32无刷电机FOC】【实践】【5/7 stm32 adc外设的高级用法】
目录 采样时刻触发采样同步采样 点击查看本文开源的完整FOC工程 本节介绍的adc外设高级用法用于电机电流控制。 从前面几节可知,电机力矩来自于转子的q轴受磁力,而磁场强度与电流成正比,也就是说电机力矩与q轴电流成正相关,控制了…...

springcloud接入seata管理分布式事务
下载安装包 链接: seata 配置seata-server 文件上传Linux解压 压缩包我放在/usr/local/seata中 tar -zxvf seata-server-2.0.0.tar.gz修改配置文件 设置nacos为注册和配置中心 进入文件夹 cd /usr/local/seata/seata/conf修改application.yml文件 ...... ...... cons…...

Android APP 音视频(02)MediaProjection录屏与MediaCodec编码
说明: 此MediaProjection 录屏和编码实操主要针对Android12.0系统。通过MediaProjection获取屏幕数据,将数据通过mediacodec编码输出H264码流(使用ffmpeg播放),存储到sd卡上。 1 MediaProjection录屏与编码简介 这里…...
java中log4j.properties配置文件浅析
Log4J的配置文件(Configuration File)就是用来设置记录器的级别、存放器和布局的,它可按keyvalue格式的设置或xml格式的设置信息。通过配置,可以创建出Log4J的运行环境。 1、配置文件 Log4J配置文件的基本格式如下: #配置根Logger log4j.roo…...

RV1126 Linux 系统,接外设,时好时坏(二)排查问题的常用命令
在 RV1126 Linux 系统中,排查外设连接问题时,可以使用多种命令来诊断和调试。以下是一些常用的命令和工具: 1. 查看系统日志 dmesg: 显示内核环形缓冲区的消息,通常包含设备初始化、驱动加载和错误等信息。 dmesg | grep <设备名或相关关键字>journalctl: 查看系统…...

鸿蒙北向开发 DevEco Studio 4.1 下载安装傻瓜式教程
开篇 由于鸿蒙处于快速发展中,鸿蒙的api快速迭代更新,老版本的DevEco studio无法支持更新版本的api,因此华为官网放弃了老版本的维护.直接从华为开发者官网无法下载老版本,当前华为开发者官网已经推出next版本了 DevEco studio3.1安装教程 上述教程提供的华为开发者官网地址已经…...
pglogical扩展的基本用法介绍
瀚高数据库 目录 环境 文档用途 详细信息 环境 系统平台:Linux x86-64 Red Hat Enterprise Linux 7 版本:14 文档用途 本文翻译了pglogical扩展的官方文档,介绍了pglogical扩展的各类管理函数及使用限制,详情请看下文. 一、节点管理 节点可以使用以下…...

【人工智能】神经网络的优化器optimizer(二):Adagrad自适应学习率优化器
一.自适应梯度算法Adagrad概述 Adagrad(Adaptive Gradient Algorithm)是一种自适应学习率的优化算法,由Duchi等人在2011年提出。其核心思想是针对不同参数自动调整学习率,适合处理稀疏数据和不同参数梯度差异较大的场景。Adagrad通…...

渗透实战PortSwigger靶场-XSS Lab 14:大多数标签和属性被阻止
<script>标签被拦截 我们需要把全部可用的 tag 和 event 进行暴力破解 XSS cheat sheet: https://portswigger.net/web-security/cross-site-scripting/cheat-sheet 通过爆破发现body可以用 再把全部 events 放进去爆破 这些 event 全部可用 <body onres…...
Nginx server_name 配置说明
Nginx 是一个高性能的反向代理和负载均衡服务器,其核心配置之一是 server 块中的 server_name 指令。server_name 决定了 Nginx 如何根据客户端请求的 Host 头匹配对应的虚拟主机(Virtual Host)。 1. 简介 Nginx 使用 server_name 指令来确定…...

从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)
设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile,新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...

让AI看见世界:MCP协议与服务器的工作原理
让AI看见世界:MCP协议与服务器的工作原理 MCP(Model Context Protocol)是一种创新的通信协议,旨在让大型语言模型能够安全、高效地与外部资源进行交互。在AI技术快速发展的今天,MCP正成为连接AI与现实世界的重要桥梁。…...
CSS | transition 和 transform的用处和区别
省流总结: transform用于变换/变形,transition是动画控制器 transform 用来对元素进行变形,常见的操作如下,它是立即生效的样式变形属性。 旋转 rotate(角度deg)、平移 translateX(像素px)、缩放 scale(倍数)、倾斜 skewX(角度…...

Unity中的transform.up
2025年6月8日,周日下午 在Unity中,transform.up是Transform组件的一个属性,表示游戏对象在世界空间中的“上”方向(Y轴正方向),且会随对象旋转动态变化。以下是关键点解析: 基本定义 transfor…...

java高级——高阶函数、如何定义一个函数式接口类似stream流的filter
java高级——高阶函数、stream流 前情提要文章介绍一、函数伊始1.1 合格的函数1.2 有形的函数2. 函数对象2.1 函数对象——行为参数化2.2 函数对象——延迟执行 二、 函数编程语法1. 函数对象表现形式1.1 Lambda表达式1.2 方法引用(Math::max) 2 函数接口…...
boost::filesystem::path文件路径使用详解和示例
boost::filesystem::path 是 Boost 库中用于跨平台操作文件路径的类,封装了路径的拼接、分割、提取、判断等常用功能。下面是对它的使用详解,包括常用接口与完整示例。 1. 引入头文件与命名空间 #include <boost/filesystem.hpp> namespace fs b…...

云原生安全实战:API网关Envoy的鉴权与限流详解
🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、基础概念 1. API网关 作为微服务架构的统一入口,负责路由转发、安全控制、流量管理等核心功能。 2. Envoy 由Lyft开源的高性能云原生…...