前端——JS基础
定义变量:let / var
字符串
字符串拼接:+
字符串和数字拼:'您....' + 25 ; 这个25会转成字符串再拼接
字符串和数组拼:'10以内的质数有:' + [2,3,5,7] => 10以内的质数有:2,3,5,7
字符串长度:length
str.length / '刘总你好'.length
函数
定义函数关键字:function
console.log(); //打印到界面上
指定缺省值:
function func (p1,p2 = '白月黑羽'){console.log('第1参是' + p1)console.log('第2参是' + p2)
}func(1)
变量的有效范围:
{} 代码块
const、let :只在代码块里有效
var:有效范围是代码块所在的区域
function run(){/*ccc整个函数内部有效*/{var ccc = 'hhhh'}console.log(ccc)
}
run()
/*函数外定义,全局有效*/
{var ccc = 'hhhh'}function run(){console.log(ccc)
}
run()
判断语句
对象
数组
字符串、数字对象
循环
类和继承
类的定义和实例化
// 定义类
class Car { type = '汽车' //知道的属性hasTire = trueconstructor(price, owner) {//构造函数;不知道的属性,需要参数传进来this.price = pricethis.owner = owner}showInfo(){//类的方法;类里面定义的函数(包括constructor)可以叫类的方法,都不需要function关键字声明console.log(`车型 :${this.type} - 车主 : ${this.owner} - 售价 : ${this.price} `)}
} // 创建实例对象
var myCar1 = new Car(300000, '白月黑羽')
var myCar2 = new Car(350000, '白月黑羽')console.log(myCar1.type, myCar1.hasTire,myCar1.price,myCar1.owner)
console.log(myCar2.type, myCar2.hasTire,myCar2.price,myCar2.owner)myCar1.showInfo()
myCar2.showInfo()
instanceof关键字
用于判断前面的对象是否为后面对象的一个具体实例
extend关键字
类的继承,🔺js中子类会自动拥有父类的一切属性和方法
super关键字
当子类的 初始化代码 有一部分和父类相同,这时就可以用super(注意是初始化代码)直接调用父类的constructor代码
class Car { type = '汽车'hasTire = trueconstructor(price, owner) {this.price = pricethis.owner = owner}showInfo(){console.log(`车型 :${this.type} - 车主 : ${this.owner} - 售价 : ${this.price} `)}
}class ElectricCar extends Car {static type = '电动车'static hasBattery = truestatic hasEngine = falseconstructor(price, owner, batteryCap) {// 调用父类的构造函数super(price, owner)this.batteryCap = batteryCap}}
当然super不仅可以调用父类的构造函数方法,也可以调用父类的其他方法
class Car { type = '汽车'hasTire = trueconstructor(price, owner) {this.price = pricethis.owner = owner}showInfo(){console.log(`车型 :${this.type} - 车主 : ${this.owner} - 售价 : ${this.price} `)}
}class ElectricCar extends Car {type = '电动车'hasBattery = truehasEngine = falseconstructor(price, owner, batteryCap) {// 调用父类的构造函数super(price, owner)this.batteryCap = batteryCap}showInfo(){super.showInfo()console.log(`电池容量 :${this.batteryCap}`)}}var myCar1 = new ElectricCar(300000, '白月黑羽', 200)
myCar1.showInfo()
错误捕获
抛出错误 —— 关键字throw
关键字throw后需要跟一个错误对象
var miles,fmiles,km
miles = prompt('请输入英里数:')
fmiles = parseFloat(miles)
if(isNaN(fmiles))//这里是直接使用Error构造函数创建了一个新对象;Error构造函数的参数会作为error对象的message属性,用来描述此处具体的错误信息,比如原因。执行完throw抛出异常的代码后,后续的代码不会再执行throw new Error('输入的必须是数字')
km = fmiles * 1.6
console.log(`${miles} 英里等于 ${km}公里`)
throw 抛出的不一定非得是Error类型的对象,也可以是TypeError,Error类型的子对象 ,也可以是自定义的对象
if (isNaN(fmiles))throw {code : 401,info : '输入的必须是数字'}
捕获错误 —— try ... catch ...
在编码时,预料到了某些代码在运行时可能会出现某些错误,如果这些错误不至于必须结束程序,就可以使用try ... catch ...
正常情况下:
var stockTable = {sh : {华远地产 : '600743',中天科技 : '600522',},sz : {深南股份 : '002417',中兴通讯 : '000063',},
}
while(true){ let input = prompt('请输入股市代码-股票进行查询:')let [stock, corp] = input.split('-')let code = stockTable[stock][corp]console.log(`${stock} ${corp} 股票代码是 ${code}`)
}
捕获错误:
while (true){ let input = prompt('请输入股市代码-股票进行查询:')try{if(input==='exit') breaklet [stock, corp] = input.split('-')let code = stockTable[stock][corp]console.log(`${stock} ${corp} 股票代码是 ${code}`)} catch (e){//一旦try里的代码执行错误,就会捕获这个错误,并执行catch里的代码;catch引导的代码段就是对错误 的一种处理;这里的e是错误对象console.log(e.name,e.message) console.error('请输入有效的股市代码') }
}
Case1.当预估某个代码段中可能出现好几种类型的错误,可以使用 instanceof 判定错误类型,并进行相应的处理。
myCar1 instanceof Car
=> true
判断前面对象是否为后面对象的一个具体实例
while (true){ let input = prompt('请输入股市代码-股票进行查询:')try{if(input==='exit') breaklet [stock, corp] = input.split('-')let code = stockTable[stock][corp]console.log(`${stock} ${corp} 股票代码是 ${code}`)} catch (e){if (e instanceof TypeError) {console.error('请输入有效的股市代码')} else if (e instanceof RangeError) {console.error(e)}// 未知类型错误,继续抛出else {console.log('未知类型错误')throw e //在catch代码块中,如果发现当前代码没法处理这个异常,可以使用throw继续往上抛出}}
}
Case2.嵌套捕获
当内层代码抛出异常,优先会被内层的catch 捕获, 不会执行到外层的 catch 代码块中;当内层catch代码发现不适合处理,又 throw 抛出, 才会被外层的 catch 捕获进行处理。
try{var inNum = 401try {if (inNum === 401)throw {code : 401,info : '输入的是401!'}else throw {code : 500,info : '输入的是其它!'}} catch (e) {if (e.code === 401) console.log('401 错误处理')else {console.log('未知类型错误')throw e}}
}
catch (e) {console.log('处理内层代码不适合处理的错误')
}
Case3.在函数调用里面产生错误
优先使用当前函数里面捕获处理错误的 try catch ;如果没有捕获到(比如没有 try catch),就会把错误对象抛到 调用该函数的外层代码 处, 查看是否有相应的 try catch
function throwError(inNum) {if (inNum === 401)throw {code : 401,info : '输入的是401!'}else throw {code : 500,info : '输入的是其它!'}
}try {//这行代码是被try catch保护处理的,异常会被捕获,所以函数里面抛出的异常,在函数外面的catch被捕获处理了throwError(401); // 500
}
catch (e) {if (e.code === 401) {console.log('401 错误处理')} else {console.log('未知类型错误')throw e}
}
console.log('后续代码执行')
捕获错误 —— try ... catch ... finally
不管try里面有无错误抛出,都要执行finally代码块里的代码
特别是在没有catch的时候有用:
try {throw {code : 401,info : '输入的必须是数字'}
}
finally {console.log('不管有无错误,都要做的处理')
}
console.log('后续代码')
3个点操作符
剩余参数:前有3个点的参数,称之为剩余参数
场景:实现一个printAge,它的参数是一些学生的姓名;这个函数需要打印这些输入的学生的年龄
常规做法:定义一个数组
var studentInfo = {'张飞' : 18,'赵云' : 17,'许褚' : 16,'典韦' : 18,'关羽' : 19,
}function printAge(students){for (let student of students) {console.log(`学生:${student} , 年龄 ${studentInfo[student]}`);}
}printAge(['张飞', '典韦', '关羽'])
printAge(['赵云'])
使用可变参数:
var studentInfo = {'张飞' : 18,'赵云' : 17,'许褚' : 16,'典韦' : 18,'关羽' : 19,
}function printAge(...students){for (let student of students) {console.log(`学生:${student} , 年龄 ${studentInfo[student]}`);}
}printAge('张飞', '典韦', '关羽')//执行函数时,js解释器创建一个数组赋值给这个students,里面存放了 '张飞', '典韦', '关羽' 三个字符串对象作为元素
printAge('赵云')
var studentInfo = {'张飞' : 18,'赵云' : 17,'许褚' : 16,'典韦' : 18,'关羽' : 19, }function printAge(...students){console.log(students)for (let student of students) {console.log(`学生:${student} , 年龄 ${studentInfo[student]}`);} }printAge('张飞', '典韦', '关羽')运行结果
[ '张飞', '典韦', '关羽' ] 学生:张飞 , 年龄 18 学生:典韦 , 年龄 18 学生:关羽 , 年龄 19
注意:剩余参数往往不单独出现在函数参数中,通常和其他参数一起出现
var studentInfo = {'张飞' : 18,'赵云' : 17,'许褚' : 16,'典韦' : 18,'关羽' : 19,
}function printAge(prefix, ...students){console.log(students)for (let student of students) {console.log(`${prefix} 学生:${student} , 年龄 ${studentInfo[student]}`);}
}printAge('-->', '张飞', '典韦', '关羽')//prefix固定参数,优先匹配,剩下的都是剩余参数的
printAge('==>', '张飞', '典韦', '关羽')
应用:
调用函数时
var onebatch = ['张飞', '典韦', '关羽']
printAge(...onebatch)//等价于printAge (onebatch[0], onebatch[1], onebatch[2])
构建新数组时
var batch1 = ['张飞', '典韦', '关羽']
var batch2 = [...batch1, '赵云', '马超']
console.log(batch2)
构建新对象
var studentInfo1 = {'张飞' : 18,'赵云' : 17,'许褚' : 16,'典韦' : 18,'关羽' : 19,
}var studentInfo2 = {...studentInfo1,'黄忠' : 78,'张辽' : 39,
}
注意一点:
1.在使用多次数据展开时,就比如在实现多个Object 的合并时,其中重复的数据会被后面的Object里面的值替换
var studentInfoAll = {...studentInfo1,...studentInfo2
}
2.赋值1:studentInfoAll_clone1 只是对象的新变量名, 和 studentInfo 对应的是同一个数据对象;赋值2:studentInfoAll_clone2 对应的则是一个新的对象,里面是studentInfo里面的内容。
var studentInfo = {'黄忠' : 78,'张辽' : 39
}// 赋值1
var studentInfoAll_clone1 = studentInfo// 赋值2
var studentInfoAll_clone2 = { ...studentInfo}
回调函数
同步&异步
同步:一起走,等完成后再继续
import time
print('这里是等待2s前的代码')
time.sleep(2)//等待2s;一直在这儿等着
print('这里是等待2s后的代码')
异步:不搁这儿等着,继续往后执行,到2s后立即执行 taskAfter2Second
function taskAfter2Second(){console.log("这里是等待2s的后续代码");
}
setTimeout( taskAfter2Second , //要执行要回调函数的函数名2000 //2000毫秒,2s
)console.log("这里是等待2s的后续代码");
何为回调函数
先定义,等事情完成,回头再调用
回调函数中的this指代问题
首先前面说过:通过哪个对象调用了这个函数,函数里的this对应的就是这个对象
情景1:这里的this对应的就是car1
class Car { constructor(price, owner) {this.price = pricethis.owner = owner}showInfo(){console.log(`车辆信息如下:`)console.log(`车主 : ${this.owner} - 售价 : ${this.price} `)}}car1 = new Car(230000,'白月黑羽')
car1.showInfo()
情景2:这里的this对应的就是obj1
这里相当于给car1.showInfo又起了个anotherShowInfo
class Car { constructor(price, owner) {this.price = pricethis.owner = owner}showInfo(){console.log(`车辆信息如下:`)console.log(`车主 : ${this.owner} - 售价 : ${this.price} `)}}car1 = new Car(230000,'白月黑羽')let obj1 = {price: '3333',owner: '张三',anotherShowInfo : car1.showInfo
}obj1.anotherShowInfo()
情景3:这里的this对应的就是obj2;但输出的是undefinded,undefinded,因为obj2没有price、owner这俩属性
class Car { constructor(price, owner) {this.price = pricethis.owner = owner}showInfo(){console.log(`车辆信息如下:`)console.log(`车主 : ${this.owner} - 售价 : ${this.price} `)}}car1 = new Car(230000,'白月黑羽')let obj2 = {anotherShowInfo : car1.showInfo
}obj2.anotherShowInfo()
🔺情景4:这里的this对应的就是window;输出undefinded,undefinded
setTimeout这个函数是由js引擎实现的,由于它内部的回调函数function,调用时没有xxx.这样的前缀,js中调用函数没有前缀就等于是通过全局对象window调用。
而window没有price、owner这两个属性,所以都是undefinded。
class Car { constructor(price, owner) {//构造函数this.price = pricethis.owner = owner}showInfo_Delay1Sec(){//this.owner 要是在这里this对应的就是car1//1s后通过回调函数打印this.owner和this.pricesetTimeout(function(){//console.log(this === window)console.log(`车辆信息如下:`)console.log(`车主 : ${this.owner} - 售价 : ${this.price} `)},1000)}}car1 = new Car(230000,'白月黑羽')car1.showInfo_Delay1Sec()
如何解决回调函数中this对应的window而不是car1这样的问题呢
法一:设一个中间变量,保存this到其他变量比如self中
class Car { constructor(price, owner) {//构造函数this.price = pricethis.owner = owner}showInfo_Delay1Sec(){let self = thissetTimeout(function(){console.log(`车辆信息如下:`)console.log(`车主 : ${self.owner} - 售价 : ${self.price} `)},1000)}}car1 = new Car(230000,'白月黑羽')
car1.showInfo_Delay1Sec()
法二:使用箭头函数
箭头函数中的this具有特殊性:即它对应的是 包含该箭头函数的函数 的执行环境
简单来说就是看 :=> 这个箭头函数出现在哪个函数定义里面
注意这里不是setTimeout,而是showInfo_Delay1Sec;它只是作为setTimeout这个函数的参数。
this关键字在方法中,那它对应的就是那个方法所属的对象
class Car { constructor(price, owner) {//构造函数this.price = pricethis.owner = owner}showInfo_Delay1Sec(){setTimeout(()=>{console.log(`车辆信息如下:`)console.log(`车主 : ${this.owner} - 售价 : ${this.price} `)},1000)}}car1 = new Car(230000,'白月黑羽')
car1.showInfo_Delay1Sec()
若箭头函数没有包含函数,那么里面的this对应的就是全局对象,在浏览器中就是window
var price = 1000
var owner = '白月黑羽'setTimeout(()=>{ console.log(`车主 : ${this.owner} - 售价 : ${this.price} `)},1000
)
匿名函数
由于前面taskAfter2Second只被用1次,起名较为麻烦,所以引入匿名函数
上面代码可改为:
setTimeout( //直接定义函数,不用起名function(){console.log("这里是等待2s的后续代码");}2000 //2000毫秒,2s
)console.log("这里是等待2s的后续代码");
let add100 = function(a) { return a+100 ;}
箭头函数
eg. (a) => {return a+100 ;}
相当于把function换成了=>
注意两点:1.当箭头函数只有一个参数时,()也可省 a => {return a+100 ;}
2.当箭头函数体内只有一行代码且返回一个值时, {}、return均可省 a => a+100
通过结合前面的匿名函数和箭头函数对下面的代码进行简化
const array1 = [1,4,9,16];
function square(x) {return x**2}
const map1 = array1.map(square);
console.log(map1);
const array1 = [1,4,9,16];
console.log(array1.map(x => x**2));
本文参考自:Javascript 简介 - 白月黑羽 (byhy.net)
相关文章:
前端——JS基础
定义变量:let / var 字符串 字符串拼接: 字符串和数字拼:您.... 25 ; 这个25会转成字符串再拼接 字符串和数组拼:10以内的质数有: [2,3,5,7] > 10以内的质数有:2,3,5,7 字符串长度:leng…...
MATLAB入门教程
MATLAB安装教程可参考链接:matlab怎么安装 matlab安装教程-电脑软件-PHP中文网 1.MATLAB的工作环境 (1)命令窗(command window) 是对MATLAB进行操作的主要载体。默认情况下,启动MATLAB时就打开命令窗。MATLAB的所有所数…...
muduo - 概要简述
作者:陈硕 编程语言:C 架构模式:Reactor 代码链接:GitHub - chenshuo/muduo: Event-driven network library for multi-threaded Linux server in C11 设计自述:https://www.cnblogs.com/Solstice/archive/2010/08…...
Selenium点击元素的方法
前言 点击方法在web自动化测试中经常用到,下面就来介绍一下selenium常用和不常用的点击方法; 1、常用方法 1.1、使用 click() 方法: 这是最简单和最常用的方法。通过选中要点击的元素,然后使用 click() 方法来触发点击事件。 示例代码: element = self.driver.find_e…...
kali里面搭建docker容器
注意事项:kali版本,镜像源 (1)权限为管理员: sudo su (2) 更新软件包列表并升级已安装的软件包 apt-get update apt-get upgrade 出错了,应该是更新源出问题了。 (3)更换镜像源&am…...
WebGL系列教程八(GLSL着色器基础语法)
目录 1 前言2 基本原则3 基本数据类型4 顶点着色器和片元着色器4.1 声明4.2 初始化项目4.3 赋值 5 结构体5.1 声明5.2 赋值 6 函数6.1 基本结构6.2 自定义函数6.3 常用内置函数 7 精度8 其他9 总结 1 前言 通过前七讲,我们已经见过了WebGL中的部分基础语法ÿ…...
go多线程
1、简单使用(这个执行完成,如果进程执行比较久,这里不会等待它们结束) package mainimport "time"func main() {go func() {println("Hello, World!")}()time.Sleep(1 * time.Second) }2、wg.Add(数量)使用&…...
【话题】如何看待IBM中国研发部裁员?
(一)背景 在全球化的大趋势下,跨国公司的业务布局一直处于动态调整之中。IBM 作为全球知名的 IT 企业,在中国市场已经运营多年,其在中国的研发中心曾经为公司的全球业务发展做出了重要贡献。近年来,全球经…...
【C/C++】涉及string类的经典OJ编程题
【C/C】涉及string类的经典OJ编程题 一. 把字符串转化成整数(atoi)解法一:(不用long)完整代码:解法二:(用long) 二.字符串相加代码实现(含注释)&a…...
淘系等电商平台API接口系列:商品详情数据解析,json数据返回参考
——在成长的路上,我们都是同行者。这篇关于商品详情API接口的文章,希望能帮助到您。期待与您继续分享更多API接口的知识,请记得关注Anzexi58哦! 在淘系(如淘宝、天猫)等电商平台中,商品详情数据…...
vue组件之间的数据共享
一、组件之间的关系 1.父子关系 2.兄弟关系 3.后代关系 二、父子组件之间的数据共享 1.父-->子共享数据 父组件通过v-bind属性绑定向子组件共享数据,子组件需要使用props接受数据。 <template><p>父组件</p><Son :msg"msg"…...
LangChain:构建强大的LLM应用的全方位框架
LangChain:构建强大的LLM应用的全方位框架 引言 在人工智能和大语言模型(LLMs)快速发展的今天,开发者们迫切需要一个强大而灵活的框架来简化LLM应用的开发过程。LangChain应运而生,它不仅提供了丰富的工具和组件&…...
自有平台自有品牌如何利用电商API接口做定价参考(多平台商品详情数据接口)
如今,多数自有商城自有品牌在为产品做定价时都会参考淘宝|天猫|京东等主流电商平台的商品价格以做参考,这一行为的好处主要有以下几点: 通过参考主流平台价格,用户更能了解目标市场中消费者对产品的接受度,从而制定出符…...
三万字长文Java面试题——基础篇(注:该篇博客将会一直维护 最新维护时间:2024年9月18日)
🧸本篇博客重在讲解Java基础的面试题,将会实时更新,欢迎大家添加作者文末联系方式交流 📜JAVA面试题专栏:JAVA崭新面试题——2024版_dream_ready的博客-CSDN博客 📜作者首页: dream_ready-CSDN博…...
数学建模——熵权+TOPSIS+肘部法则+系统聚类
文章目录 一、起因二、代码展示 一、起因 我本科的数学建模队长找上我,让我帮她写下matlab代码,当然用的模型还是曾经打比赛的模型,所以虽然代码量多,但是写的很快,也是正逢中秋,有点时间。 当然我也没想到…...
Java | Leetcode Java题解之第403题青蛙过河
题目: 题解: class Solution {public boolean canCross(int[] stones) {int n stones.length;boolean[][] dp new boolean[n][n];dp[0][0] true;for (int i 1; i < n; i) {if (stones[i] - stones[i - 1] > i) {return false;}}for (int i 1…...
828华为云征文|华为Flexus云服务器搭建OnlyOffice私有化在线办公套件
一、引言 在当今数字化办公的时代,在线办公套件的需求日益增长。华为Flexus云服务器凭借其强大的性能和稳定性,为搭建OnlyOffice私有化在线办公套件提供了理想的平台。在2024年9月14日这个充满探索精神的日子里,我们开启利用华为Flexus云服务…...
[Java]maven从入门到进阶
介绍 apache旗下的开源项目,用于管理和构建java项目的工具 官网: Welcome to The Apache Software Foundation! 1.依赖管理 通过简单的配置, 就可以方便的管理项目依赖的资源(jar包), 避免版本冲突问题 优势: 基于项目对象模型(POM),通过一小段描述信息来管理项目的构建 2…...
Leetcode面试经典150题-130.被围绕的区域
给你一个 m x n 的矩阵 board ,由若干字符 X 和 O 组成,捕获 所有 被围绕的区域: 连接:一个单元格与水平或垂直方向上相邻的单元格连接。区域:连接所有 O 的单元格来形成一个区域。围绕:如果您可以用 X 单…...
Ruffle 继续在开源软件中支持 Adobe Flash Player
大多数人已经无需考虑对早已寿终正寝的 Adobe Flash 的支持,但对于那些仍有一些 Adobe Flash/SWF 格式的旧资产,或想重温一些基于 Flash 的旧游戏/娱乐项目的人来说,开源 Ruffle 项目仍是 2024 年及以后处理 Flash 的主要竞争者之一。 Ruffl…...
零门槛NAS搭建:WinNAS如何让普通电脑秒变私有云?
一、核心优势:专为Windows用户设计的极简NAS WinNAS由深圳耘想存储科技开发,是一款收费低廉但功能全面的Windows NAS工具,主打“无学习成本部署” 。与其他NAS软件相比,其优势在于: 无需硬件改造:将任意W…...
【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器
——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的一体化测试平台,覆盖应用全生命周期测试需求,主要提供五大核心能力: 测试类型检测目标关键指标功能体验基…...
iPhone密码忘记了办?iPhoneUnlocker,iPhone解锁工具Aiseesoft iPhone Unlocker 高级注册版分享
平时用 iPhone 的时候,难免会碰到解锁的麻烦事。比如密码忘了、人脸识别 / 指纹识别突然不灵,或者买了二手 iPhone 却被原来的 iCloud 账号锁住,这时候就需要靠谱的解锁工具来帮忙了。Aiseesoft iPhone Unlocker 就是专门解决这些问题的软件&…...
解锁数据库简洁之道:FastAPI与SQLModel实战指南
在构建现代Web应用程序时,与数据库的交互无疑是核心环节。虽然传统的数据库操作方式(如直接编写SQL语句与psycopg2交互)赋予了我们精细的控制权,但在面对日益复杂的业务逻辑和快速迭代的需求时,这种方式的开发效率和可…...
生成 Git SSH 证书
🔑 1. 生成 SSH 密钥对 在终端(Windows 使用 Git Bash,Mac/Linux 使用 Terminal)执行命令: ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" 参数说明: -t rsa&#x…...
ServerTrust 并非唯一
NSURLAuthenticationMethodServerTrust 只是 authenticationMethod 的冰山一角 要理解 NSURLAuthenticationMethodServerTrust, 首先要明白它只是 authenticationMethod 的选项之一, 并非唯一 1 先厘清概念 点说明authenticationMethodURLAuthenticationChallenge.protectionS…...
WEB3全栈开发——面试专业技能点P2智能合约开发(Solidity)
一、Solidity合约开发 下面是 Solidity 合约开发 的概念、代码示例及讲解,适合用作学习或写简历项目背景说明。 🧠 一、概念简介:Solidity 合约开发 Solidity 是一种专门为 以太坊(Ethereum)平台编写智能合约的高级编…...
在鸿蒙HarmonyOS 5中使用DevEco Studio实现录音机应用
1. 项目配置与权限设置 1.1 配置module.json5 {"module": {"requestPermissions": [{"name": "ohos.permission.MICROPHONE","reason": "录音需要麦克风权限"},{"name": "ohos.permission.WRITE…...
MySQL用户和授权
开放MySQL白名单 可以通过iptables-save命令确认对应客户端ip是否可以访问MySQL服务: test: # iptables-save | grep 3306 -A mp_srv_whitelist -s 172.16.14.102/32 -p tcp -m tcp --dport 3306 -j ACCEPT -A mp_srv_whitelist -s 172.16.4.16/32 -p tcp -m tcp -…...
Java线上CPU飙高问题排查全指南
一、引言 在Java应用的线上运行环境中,CPU飙高是一个常见且棘手的性能问题。当系统出现CPU飙高时,通常会导致应用响应缓慢,甚至服务不可用,严重影响用户体验和业务运行。因此,掌握一套科学有效的CPU飙高问题排查方法&…...
