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

Angular基础学习(入门 --> 入坑)

目录

一、Angular 环境搭建

二、创建Angular新项目

三、数据绑定

四、ngFor循环、ngIf、ngSwitch、[ngClass]、[ngStyle]、管道、事件、双向数据绑定--MVVM

五、DOM 操作 (ViewChild)

六、组件通讯

七、生命周期

八、Rxjs 异步数据流

九、Http 请求

十、使用axios 请求数据

十一、路由

十二、动态路由 & get 传值

十三、动态路由的 js 跳转路由

十四、父子路由(嵌套路由)

十五、vdemo项目


一、Angular 环境搭建

1、安装nodejs,通过node -v查看node版本安装是否成功(自行百度安装)

2、安装npm / yarn / cnpm /pnpm,npm -v查看npm版本是否成功(自行百度安装)

3、npm install -g @angular/cli@7.0.6(学习的版本稳定)

4、ng v 验证安装是否成功

二、创建Angular新项目

1、使用命令创建

ng new vdemo

2、配置选项(1、是否使用路由 【暂时不用N】,2、会哪个选那个,上下选择,回车就会创建好项目,并且下载好依赖)

npm new vdemo --skip-install -- 创建项目不下载依赖 -- 后面 自行执行 npm i

也可以自行到目录下执行npm i 下载依赖

3、项目启动

ng serve --open

4、angular6 中使用socket.io报global is not defined 错误如何解决

angular6 中使用socket.io报global is not defined 错误如何解决

5、目录介绍

6、自定义组件命令

https://angular.dev/cli

ng g 查看模块

ng g component components/news 创建组件

在根组件引入news组件

效果:

三、数据绑定

<----! html ------->

<h1>angular模板里面绑定数据</h1>
<p>{{ title }}
</p><p>{{ msg }}</p><p>{{ username }}</p>
<p>{{ student }}</p>
<p>{{ userInfo.username }}、{{ userInfo.age }}</p>
<p>{{ message }}</p><hr />
<!-- ----------------------------------------------------------------- --><h1>angular模板里面绑定属性</h1>
<div title="我是一个属性">宇哥很帅</div><br /><div [title]="student">宇哥很帅-lalal</div><hr /><!-- ----------------------------------------------------------------- -->
<h1>angular模板里面绑定html</h1><div>{{ content }}</div>
<!-- 解析html -->
<div [innerHTML]="content" class="red"></div>
<hr>
<!-- ----------------------------------------------------------------- --><h1>angular模板里面允许做简单的运算</h1>
1+2={{ 1 + 2 }}
<hr>
<!-- ----------------------------------------------------------------- -->
<h1>angular模板里面数据循环</h1>
<br /><ul><li *ngFor="let item of arr">{{ item }}</li>
</ul><br /><ul><li *ngFor="let item2 of list">{{ item2 }}</li>
</ul>
<br /><ul><li *ngFor="let item3 of items">{{ item3 }}</li>
</ul><br />
<ul><li *ngFor="let item4 of listList">{{ item4.name }}、{{ item4.age }}</li>
</ul><br />
<ul><li *ngFor="let item5 of cars"><h2>{{ item5.name }}</h2><ol><li *ngFor="let its of item5.list">{{ its.name }} --- {{ its.price }}</li></ol></li>
</ul>

<----! ts ------->

import { Component, OnInit } from "@angular/core";@Component({selector: "app-news",templateUrl: "./news.component.html",styleUrls: ["./news.component.css"],
})
export class NewsComponent implements OnInit {// 声明属性的几种方法// public  共有(默认) 可以在这个类里面使用、也可以在类外面使用// protected  保护类型  它只有在当前类和它的子类里面访问// private   私有   当前类才可以访问这个属性只有在public title = "我是新闻组件";msg = "我是新闻组件中的msg";private username = "张三";// 推荐public student: any = "我是一个学生";public userInfo: object = {username: "张三",age: "20",};public message: any;public content="<h2>我是新闻组件中的content</h2>";// 定义数组public arr=['111','222','333']// 推荐public list:any[] = ['我是第一个',222222,'443425']public items:Array<string>=['第一个新闻','第二个新闻']// 复杂数组public listList:any[]=[{id:1,name:'张三',age:20},{id:2,name:'李四',age:22},{id:3,name:'王五',age:23}]public cars:any[]=[{name:'宝马',list:[{name:'宝马X1',price:'30W'},{name:'宝马X2',price:'20W'}]},{name:'奥迪',list:[{name:'奥迪Q1',price:'130W'},{name:'奥迪Q2',price:'1120W'}]}]constructor() {this.message = "这是给属性赋值--(改变属性的值)";this.msg = "我是新闻组件中的msg==(我是改变后的值)";}ngOnInit() {}
}

效果:

四、ngFor循环、ngIf、ngSwitch、[ngClass]、[ngStyle]、管道、事件、双向数据绑定--MVVM

<----! html ------->

<h1>引入图片</h1><img style="width: 300px; height: 300px" src="assets/images/1.jpg" alt="" />
<hr /><img style="width: 300px; height: 300px" [src]="picUrl" alt="" />
<hr /><h1>循环数据 显示数据的索引(key)</h1>
<ul><li *ngFor="let item of list; let key = index">{{ key }}--{{ item.title }}</li>
</ul><hr /><h1>条件判断语句 *ngIf</h1>
<div *ngIf="flag"><img style="width: 300px; height: 300px" src="assets/images/1.jpg" alt="" />
</div>
<div *ngIf="!flag"><img style="width: 300px; height: 300px" [src]="picUrl" alt="" />
</div><hr>
<ul><li *ngFor="let item of list; let key = index"><span *ngIf="key == 1" class="reds">{{ key }}--{{ item.title }}</span><span *ngIf="key != 1">{{ key }}--{{ item.title }}</span></li>
</ul>
<hr><h1>条件判断语句 *ngSwitch</h1>
<ul [ngSwitch]="orderStatus"><li *ngSwitchCase="1">下单</li><li *ngSwitchCase="2">支付</li><li *ngSwitchCase="3">已支付</li><li *ngSwitchCase="4">已购买</li>
</ul>
<hr><h1>属性 [ngClass]、[ngStyle]</h1>
<div class="reds">ngClass1111
</div>
<hr>
<div [ngClass]="{'reds': 'true', 'blue': 'false'}">ngClass1111
</div>
<hr>
<div [ngClass]="{'orange': 'flag', 'blue': '!flag'}">ngClass1111
</div>
<hr><h1>循环数组、改变数组某一项的样式</h1>
<ul><li *ngFor="let item of list; let key = index" [ngClass]="{'reds': key == 1, 'blue':key == 2,'orange':key == 3}">{{ key }}--{{ item.title }}</li>
</ul>
<hr><p style="color: aqua;">我是一个p标签</p>
<br>
<p [ngStyle]="{'color':'pink'}">我是一个p标签</p>
<br>
<p [ngStyle]="{'color':attr}">我是一个p标签</p>
<hr><h1>管道</h1>
<p> {{ today | date:'yyyy-MM-dd HH:mm ss' }}</p>
<hr><h1>事件</h1>
<p>{{title}}</p>
<br>
<button (click)="run()">点击我</button>
<br>
<button (click)="getData()">点击我获取title</button>
<br>
<button (click)="changeData()">点击我改变title</button>
<br>
<button (click)="runEvent($event)">点击我改变颜色</button>
<hr><h1>表单事件、事件对象</h1>
keyDown:
<input type="text" (keydown)="keyDown($event)" />
<br>
keyUp:
<input type="text" (keydown)="keyUp($event)" />
<hr><h1>双向数据绑定--MVVM</h1>
<input type="text" [(ngModel)]="keywords" />
<p>{{keywords}}</p>
<br>
<button (click)="changeKeywords()">改变keyWords值</button>
<br>
<button (click)="getKeywords()">获取keyWords值</button>

<----! ts ------->

import { Component, OnInit } from '@angular/core';@Component({selector: 'app-home',templateUrl: './home.component.html',styleUrls: ['./home.component.css']
})
export class HomeComponent implements OnInit {public title = '我是标题'public keywords = '我是默认值'public picUrl = 'https://www.baidu.com/img/PCtm_d9c8750bed0b3c7d089fa7d55720d6cf.png'public list:any[] = [{title: 'title1',},{title: 'title2',},{title: 'title3',},{title: 'title4',}]public flag:boolean = false;public orderStatus:number=1public attr:string = 'orange'public today:Date = new Date()constructor() { }ngOnInit() {}run(){alert('点击了我-哈哈')}getData(){alert(this.title)}changeData(){this.title = '我是改变后的title'}runEvent(e){let dom:any = e.targetdom.style.color = 'red'}// 表单事件keyDown(e){if(e.keyCode == 13){alert('按下回车')}else{console.log(e.target.value)}}keyUp(e){if(e.keyCode == 13){console.log(e.target.value)alert('keyUp按下回车')}}// 双向数据绑定changeKeywords(){this.keywords = '我是改变后的值'}getKeywords(){alert(this.keywords)}}

效果:

五、DOM 操作 (ViewChild)

<----! html ------->

<app-header #header></app-header><hr><div #myBox>xinwen
</div>
<button (click)="getChild()">获取header子组件值</button>

<----! ts ------->

import { Component, OnInit,ViewChild } from '@angular/core';@Component({selector: 'app-news',templateUrl: './news.component.html',styleUrls: ['./news.component.css']
})
export class NewsComponent implements OnInit {@ViewChild('myBox') myBox:any@ViewChild('header') header:anyconstructor() { }ngOnInit() {}ngAfterViewInit(){this.myBox.nativeElement.style.color = 'blue'}getChild(){this.header.run()}}
import { Component, OnInit } from '@angular/core';@Component({selector: 'app-header',templateUrl: './header.component.html',styleUrls: ['./header.component.css']
})
export class HeaderComponent implements OnInit {constructor() { }ngOnInit() {}run(){alert('我是header子组件!!!')}}

原生 js 获取DOM

<----! html ------->

<h1>DOM 操作</h1><div id="box">this is box
</div><div id="box1" *ngIf="flag">this is box1111111
</div>

<----! ts ------->

import { Component, OnInit } from '@angular/core';@Component({selector: 'app-home',templateUrl: './home.component.html',styleUrls: ['./home.component.css']
})
export class HomeComponent implements OnInit {public flag:boolean = trueconstructor() { }ngOnInit() {let box = document.getElementById("box")box.style.color = 'red'/*使用ngif 获取不到DOM 节点let box1 = document.getElementById("box1")box1.style.color = 'yellow'*/ };// 视图加载完成,获取DOM 节点ngAfterViewInit(){let box1 = document.getElementById("box1")box1.style.color = 'pink'}}

父传子 / 获取一个组件的实例 (ViewChild)

效果图:

六、组件通讯

1、父传子 @input

获取父组件的方法

把整个父组件传给子组件 使用 this

父组件通过@ViewChild主动获取子组件的数据和方法

2、子传父 @Output 、EventEmiter

3、非父子组件的通信(eg:兄弟) todolist里有

3.1、lacalstorage

3.2、service 服务

3.3、Angular文档:https://www.angular.cn/guide/lifecycle-hooks

七、生命周期

<----! lifecycle.component.html ------->

<h1>{{msg}}</h1>
<hr>
<br>
<button (click)="changeMsg()">改变Msg</button>
<br>
<br>
<input type="text" [(ngModel)]="userinfo">

<----! lifecycle.component.ts ------->

import { Component, OnInit ,Input} from "@angular/core";@Component({selector: "app-lifecycle",templateUrl: "./lifecycle.component.html",styleUrls: ["./lifecycle.component.css"],
})
export class LifecycleComponent implements OnInit {@Input('title2') title2:string;public msg: string = "我是一个生命周期演示哦";public userinfo: string = "";public oldUserinfo: string = "";constructor() {console.log("00构造函数执行了---除了使用简单的值对局部变量进行初始化之外,什么都不应该做");}ngOnChanges() {console.log("01ngOnChanges执行了---当绑定的输入属性的值发生变化时调用 (父子组件传值会触发)");}ngOnInit() {console.log("02ngonInit执行了--- 请求数据一般放在这个里面");}ngDoCheck() {// 写一写自定义操作console.log("03ngDocheck执行了---捡测,并在发生 Angular 无法或不愿意自己检测的变化时作出反应");if (this.userinfo !== this.oldUserinfo) {console.log(`你从${this.oldUserinfo}改成${this.userinfo}`);this.oldUserinfo = this.userinfo;} else {console.log("数据没有变化");}}ngAfterContentInit() {console.log("04ngAftercontentInit执行了---当把内容投影进组件之后调用");}ngAfterContentChecked() {console.log("05ngAftercontentchecked执行了---每次完成被投影组件内容的变更检测之后调用");}ngAfterViewInit() {console.log("06 ngAfterViewInit执行了----初始化完组件视图及其子视图之后调用(dom操作放在这个里面");}ngAfterViewChecked() {console.log("07ngAfterViewchecked执行了----每次做完组件视图和子视图的变更检测之后调用");}ngOnDestroy() {console.log("08ngonDestroy执行了...");}changeMsg() {this.msg = "我是一个生命周期演示哦-- 我变了";}
}

效果图:

改变值触发哪些函数:如下

<button (click)="changeMsg()">改变Msg</button>

销毁组件

八、Rxjs 异步数据流

中文手册:​​​​​https://cn.rx.js.org/

1、创建服务:ng  g service services/request

2、引入服务

异步编程:

<----! request.service.ts ------->

import { Injectable } from "@angular/core";import { Observable } from "rxjs";@Injectable({providedIn: "root",
})
export class RequestService {constructor() {}// 同步getData() {return "this is service data";}// 异步getCallbackData(cb) {setTimeout(() => {var username = "zhangsan";// return usernamecb(username);}, 1000);}// promise异步getPromiseData() {return new Promise((resolve, reject) => {setTimeout(() => {var username = "zhangsan---promise";resolve(username);}, 2000);});}// Rsjx异步getRsjxData() {return new Observable((observer) => {setTimeout(() => {var username = "zhangsan---Rsjx异步";observer.next(username)// observer.error('错误数据')}, 2000);});}// 多次执行getPromisSeintervaleData() {return new Promise((resolve, reject) => {setTimeout(() => {var username = "zhangsan---promise多次执行";resolve(username);}, 1000);});}getRxjsSeintervaleData() {let count = 0return new Observable<any>((observer) => {setInterval(() => {count++;var username = "zhangsan---Rsjx多次执行";observer.next(username)// observer.error('错误数据')}, 1000);});}getRxjsintervaleNum() {let count = 0return new Observable<any>((observer) => {setInterval(() => {count++;observer.next(count)// observer.error('错误数据')}, 1000);});}
}

<----! home.component.ts ------->

import { Component, OnInit } from "@angular/core";
import { RequestService } from "../../services/request.service";import { filter, map } from "rxjs/operators";@Component({selector: "app-home",templateUrl: "./home.component.html",styleUrls: ["./home.component.css"],
})
export class HomeComponent implements OnInit {constructor(public request: RequestService) {}ngOnInit() {// 1、同步方法let data = this.request.getData();console.log(data);// 2、获取异步方法&数据this.request.getCallbackData((data) => {console.log(data);});// 3、promise异步var promiseData = this.request.getPromiseData();promiseData.then((data) => {console.log(data);});// 4、rxjs获取异步方法数据// var rxjsData = this.request.getRsjxData();// rxjsData.subscribe((data) => {//   console.log(data);// });// 5、rxjs unsubscribe取消订阅var streem = this.request.getRsjxData();var d = streem.subscribe((data) => {console.log(data);});setTimeout(() => {d.unsubscribe(); /* 取消订阅 */}, 1000);// 6、promise 执行多次(没有这个能力)var intervalData = this.request.getPromisSeintervaleData();intervalData.then((data) => {console.log(data);});// 7、Rxjs执行多次// var streemInterval = this.request.getRxjsSeintervaleData();// streemInterval.subscribe((data) => {//   console.log(data);// });// 8、用工具方法对返回数据进行处理/*//  filtervar streemNum = this.request.getRxjsintervaleNum();streemNum.pipe(filter((value) => {if(value%2==0){return true}}),).subscribe((data) => {console.log(data);});*//*// mapvar streemNum = this.request.getRxjsintervaleNum();streemNum.pipe(map((value) => {return value*value}),).subscribe((data) => {console.log(data);});*/// fliter & map 的结合使用var streemNum = this.request.getRxjsintervaleNum();streemNum.pipe(filter((value) => {if(value%2==0){return true}}),map((value) => {return value*value}),).subscribe((data) => {console.log(data);});}
}

九、Http 请求

1、get 请求数据

2、post提交数据

3、jsonp 请求数据

十、使用axios 请求数据

asiox : https://github.com/axios/axios

1、创建服务

ng g service services/httpservice

2、安装:asiox

npm i axios --save

3、在服务中引入axios

4、组件中引入使用

十一、路由

1、创建组件

ng g component components/homeng g component components/newsng g component components/product

2、引入组件

3、配置路由

接下来就是输入路径就可以切换页面了

4、routerLink跳转页面 默认路由

选中当前页面高亮

十二、动态路由 & get 传值

1、get 传值

1.1、跳转、引入路由

1.2、接收

2、动态路由传值

2.1、跳转

2.2、接收

效果:

十三、动态路由的 js 跳转路由

1、路由引入十二点一样

2、get 传值

十四、父子路由(嵌套路由)

1、效果图

2、创建组件&路由

ng g component components/home
ng g component components/product
...
ng g component components/home/welcome

3、根组件路由跳转

4、左边路由跳转

5、右边显示内容使用<router-outlet></router-outlet>占位

6、需要选中高亮每个父组件都要加上

routerLinkActive="active"

十五、vdemo项目

地址:https://gitee.com/xu-feiyu/angular-basice

仓库地址:https://gitee.com/xu-feiyu/angular-basice.git

相关文章:

Angular基础学习(入门 --> 入坑)

目录 一、Angular 环境搭建 二、创建Angular新项目 三、数据绑定 四、ngFor循环、ngIf、ngSwitch、[ngClass]、[ngStyle]、管道、事件、双向数据绑定--MVVM 五、DOM 操作 &#xff08;ViewChild&#xff09; 六、组件通讯 七、生命周期 八、Rxjs 异步数据流 九、Http …...

吊打ChatGPT4o!大学生如何用上原版O1辅助论文写作(附论文教程)

目录 1、用ChatGPT生成论文选题2、用ChatGPT生成论文框架3、用ChatGPT进行文献整理4、用ChatGPT进行论文润色5、用ChatGPT进行问题求解6、用ChatGPT进行思路创新7、用ChatGPT进行论文翻译8、如何直接使用ChatGPT4o、o1、OpenAI Canvas 9、OpenAI Canvas增强了啥&#xff1f;10、…...

Linux防火墙-常用命令

作者介绍&#xff1a;简历上没有一个精通的运维工程师。希望大家多多关注作者&#xff0c;下面的思维导图也是预计更新的内容和当前进度(不定时更新)。 我们经过上小章节讲了Linux的部分进阶命令&#xff0c;我们接下来一章节来讲讲Linux防火墙。由于目前以云服务器为主&#x…...

C++:STL常用算法随笔

主要的头文件#include <algorithm> < functional> <numeric> 遍历算法&#xff1a; for_each、transform(搬运容器到另一个容器中 ) void print1(int val) {cout << val <<" "; } for_each (v.begin(),v.end() , print1) 或者用仿…...

Python NumPy学习指南:从入门到精通

Python NumPy学习指南&#xff1a;从入门到精通 第一部分&#xff1a;NumPy简介与安装 1. 什么是NumPy&#xff1f; NumPy&#xff0c;即Numerical Python&#xff0c;是Python中最为常用的科学计算库之一。它提供了强大的多维数组对象ndarray&#xff0c;并支持大量的数学函…...

Flutter笔记--通知

这一节回顾一下Flutter中的Notification,Notification(通知)是Flutter中一个重要的机制&#xff0c;在widget树中&#xff0c;每一个节点都可以分发通知&#xff0c;通知会沿着当前节点向上传递&#xff0c;所有父节点都可以通过NotificationListener来监听通知,通过它可以实现…...

Aegisub字幕自动化及函数篇(图文教程附有gif动图展示)(二)

目录 template行 template pre-line template line template syl template syl noblank template char template notext template pre-line notext template syl noblank notext template keeptags ​编辑 template loop number 内联变量 ​编辑 remeber函数 re…...

系统分析师16:系统测试与维护

1 内容概要 2 软件测试类型 2.1 测试类型 动态测试【计算机运行】 白盒测试法&#xff1a;关注内部结构与逻辑灰盒测试法&#xff1a;介于两者之间黑盒测试法&#xff1a;关注输入输出及功能 静态测试【人工监测和计算机辅助分析】 桌前检查代码审查代码走查以上三个都是做的…...

详解Java中的堆内存

详解Java中的堆内存 堆是JVM运行数据区中的一块内存空间&#xff0c;它是线程共享的一块区域&#xff08;注意了&#xff01;&#xff01;&#xff01;&#xff09;&#xff0c;主要用来保存数组和对象实例等&#xff08;其实对象有时候是不在堆中进行分配的&#xff0c;想要了…...

C++类和对象下详细指南

C类和对象下详细指南 1. 初始化列表与构造函数 1.1 初始化列表概述 初始化列表在C中用于初始化对象的成员变量&#xff0c;特别是当你需要在对象构造时就明确成员变量的值时。通过初始化列表&#xff0c;成员变量的初始化可以在进入构造函数体之前完成。这不仅可以提升性能&…...

【瑞昱RTL8763E】音频

1 音乐播放控制 1.1 播放列表更新 文件系统在sd卡中保存header.bin及name.bin两份文件用于歌曲名称的存储。为方便应用层进行歌曲显示及列表管理&#xff0c;可将这两个bin文件信息读取并保存到nor flash中。需要播放指定名称的歌曲时&#xff0c;将对于歌曲名称传递给文件系…...

videojs 播放监控

<head><!-- 1. 引入videojs的CSS。 --><link href"https://vjs.zencdn.net/7.20.3/video-js.css" rel"stylesheet" /><!-- If youd like to support IE8 (for Video.js versions prior to v7) --><!-- <script src"htt…...

电源管理芯片PMIC

一、简介 电源管理芯片&#xff08;Power Management Integrated Circuits&#xff0c;简称PMIC&#xff09;是一种集成电路&#xff0c;它的主要功能是在电子设备系统中对电能进行管理和控制&#xff0c;包括但不限于以下几点&#xff1a; 电压转换&#xff1a;将电源电压转换…...

C++ 线性表、内存操作、 迭代器,数据与算法分离。

线性表&#xff1a; 线性表是最基本、最简单、也是最常用的一种数据结构。线性表&#xff08;linear list&#xff09;是数据结构的 一种&#xff0c;一个线性表是n个具有相同特性的数据元素的有限序列。 线性表中数据元素之间的关系是一对一的关系&#xff0c;即除了第一个和…...

PHP如何解析配置文件

在PHP中解析配置文件有多种方法&#xff0c;具体取决于配置文件的格式。常见的配置文件格式包括INI文件、YAML文件、JSON文件以及PHP数组文件&#xff08;即PHP文件本身包含配置数组&#xff09;。下面是一些常用的方法来解析这些配置文件。 1. 解析INI文件 INI文件是最常见的…...

【Java】六大设计原则和23种设计模式

目录 一、JAVA六大设计原则 二、JAVA23种设计模式 1. 创建型模式 2. 结构型模式 3. 行为型模式 三、设计原则与设计模式 1. 设计原则 2. 设计模式 四、单例模式 1. 饿汉式 2. 懒汉式 四、代理模式 1. 什么是代理模式 2. 为什么要用代理模式 3. 有哪几种代理模式 …...

Java IO流全面教程

此笔记来自于B站黑马程序员 File 创建对象 public class FileTest1 {public static void main(String[] args) {// 1.创建一个 File 对象&#xff0c;指代某个具体的文件// 路径分隔符// File f1 new File("D:/resource/ab.txt");// File f1 new FIle("D:\\…...

PCIe6.0 AIC金手指和板端CEM连接器信号完整性设计规范

先附上我之前写的关于PCIe5.0金手指的设计解读&#xff1a; PCIe5.0的Add-in-Card(AIC)金手指layout建议&#xff08;一&#xff09;_pcie cem-CSDN博客 PCIe5.0的Add-in-Card(AIC)金手指layout建议&#xff08;二&#xff09;_gnd bar-CSDN博客 首先&#xff0c;相较于PCI…...

二、创建drf纯净项目

1)创建项目 django-admin startproject api2&#xff09;创建app django-admin startproject api_app3)修改settings.py注释掉一些没用的配置 INSTALLED_APPS [# django.contrib.admin,# django.contrib.auth,# django.contrib.contenttypes,# django.contrib.sessions,# d…...

算法1:双指针思想的运用(2)--C++

1.盛水最多的容器 题目链接&#xff1a;11. 盛最多水的容器 - 力扣&#xff08;LeetCode&#xff09; 题目解析&#xff1a; 在解析题目时&#xff0c;我们可以把最直接的方法先列举出来&#xff0c;然后再根据相应的算法原理&#xff0c;来进行优化 思路一&#xff1a;暴力…...

【算法训练营Day07】字符串part1

文章目录 反转字符串反转字符串II替换数字 反转字符串 题目链接&#xff1a;344. 反转字符串 双指针法&#xff0c;两个指针的元素直接调转即可 class Solution {public void reverseString(char[] s) {int head 0;int end s.length - 1;while(head < end) {char temp …...

【Java学习笔记】BigInteger 和 BigDecimal 类

BigInteger 和 BigDecimal 类 二者共有的常见方法 方法功能add加subtract减multiply乘divide除 注意点&#xff1a;传参类型必须是类对象 一、BigInteger 1. 作用&#xff1a;适合保存比较大的整型数 2. 使用说明 创建BigInteger对象 传入字符串 3. 代码示例 import j…...

《C++ 模板》

目录 函数模板 类模板 非类型模板参数 模板特化 函数模板特化 类模板的特化 模板&#xff0c;就像一个模具&#xff0c;里面可以将不同类型的材料做成一个形状&#xff0c;其分为函数模板和类模板。 函数模板 函数模板可以简化函数重载的代码。格式&#xff1a;templa…...

DingDing机器人群消息推送

文章目录 1 新建机器人2 API文档说明3 代码编写 1 新建机器人 点击群设置 下滑到群管理的机器人&#xff0c;点击进入 添加机器人 选择自定义Webhook服务 点击添加 设置安全设置&#xff0c;详见说明文档 成功后&#xff0c;记录Webhook 2 API文档说明 点击设置说明 查看自…...

MySQL JOIN 表过多的优化思路

当 MySQL 查询涉及大量表 JOIN 时&#xff0c;性能会显著下降。以下是优化思路和简易实现方法&#xff1a; 一、核心优化思路 减少 JOIN 数量 数据冗余&#xff1a;添加必要的冗余字段&#xff08;如订单表直接存储用户名&#xff09;合并表&#xff1a;将频繁关联的小表合并成…...

Unity UGUI Button事件流程

场景结构 测试代码 public class TestBtn : MonoBehaviour {void Start(){var btn GetComponent<Button>();btn.onClick.AddListener(OnClick);}private void OnClick(){Debug.Log("666");}}当添加事件时 // 实例化一个ButtonClickedEvent的事件 [Formerl…...

解析两阶段提交与三阶段提交的核心差异及MySQL实现方案

引言 在分布式系统的事务处理中&#xff0c;如何保障跨节点数据操作的一致性始终是核心挑战。经典的两阶段提交协议&#xff08;2PC&#xff09;通过准备阶段与提交阶段的协调机制&#xff0c;以同步决策模式确保事务原子性。其改进版本三阶段提交协议&#xff08;3PC&#xf…...

Spring Boot + MyBatis 集成支付宝支付流程

Spring Boot MyBatis 集成支付宝支付流程 核心流程 商户系统生成订单调用支付宝创建预支付订单用户跳转支付宝完成支付支付宝异步通知支付结果商户处理支付结果更新订单状态支付宝同步跳转回商户页面 代码实现示例&#xff08;电脑网站支付&#xff09; 1. 添加依赖 <!…...

倒装芯片凸点成型工艺

UBM&#xff08;Under Bump Metallization&#xff09;与Bump&#xff08;焊球&#xff09;形成工艺流程。我们可以将整张流程图分为三大阶段来理解&#xff1a; &#x1f527; 一、UBM&#xff08;Under Bump Metallization&#xff09;工艺流程&#xff08;黄色区域&#xff…...

Spring AOP代理对象生成原理

代理对象生成的关键类是【AnnotationAwareAspectJAutoProxyCreator】&#xff0c;这个类继承了【BeanPostProcessor】是一个后置处理器 在bean对象生命周期中初始化时执行【org.springframework.beans.factory.config.BeanPostProcessor#postProcessAfterInitialization】方法时…...