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

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

51单片机的光照强度检测【proteus仿真+程序+报告+原理图+演示视频】

1、主要功能 该系统由AT89C51/STC89C52单片机LCD1602显示模块光照传感器按键蜂鸣器LED等模块构成。适用于光照强度检测、光照强度测量报警等相似项目。 可实现功能: 1、LCD1602实时显示光照强度信息 2、光照强度传感器&#xff08;电位器模拟&#xff09;采集光照信息 3、可…

X86架构(九)——保护模式的进入

全局描述符表 全局描述符表(Global Descriptor Table,GDT)是保护模式下非常重要的一个数据结构。 在保护模式下&#xff0c;对内存的访问仍然使用段地址和偏移地址&#xff0c;在每个段能够访问之前&#xff0c;必须先行设置好 GDT 的地址&#xff0c;并加载全局描述符表寄存…

emp.dll丢失怎么解决,快来试试这个几个解决方法

在日常使用电脑玩游戏的过程中&#xff0c;我们可能会遇到一些错误提示&#xff0c;其中最常见的就是“emp.dll丢失”。那么&#xff0c;emp.dll到底是什么&#xff1f;它为什么会丢失&#xff1f;丢失后会对我们的电脑产生什么影响&#xff1f;本文将为您详细解析emp.dll的概念…

[BUUCTF从零单排] Web方向 03.Web入门篇之sql注入-1(手工注入详解)

这是作者新开的一个专栏《BUUCTF从零单排》&#xff0c;旨在从零学习CTF知识&#xff0c;方便更多初学者了解各种类型的安全题目&#xff0c;后续分享一定程度会对不同类型的题目进行总结&#xff0c;并结合CTF书籍和真实案例实践&#xff0c;希望对您有所帮助。当然&#xff0…

打造高业绩朋友圈:策略与实践

在数字化时代&#xff0c;朋友圈不仅是个人生活的展示窗口&#xff0c;更是商业变现的有力平台。许多人通过精心经营朋友圈&#xff0c;实现了财富的增长&#xff0c;甚至达到了年入百万的惊人业绩。朋友圈已成为普通人实现逆袭的重要战场。 要打造一个业绩过万的朋友圈&#…

关于武汉芯景科技有限公司的IIC电平转换芯片XJ9509开发指南(兼容PCa9509)

一、芯片引脚介绍 1.芯片引脚 2.引脚描述 二、系统结构图 三、功能描述 1.VCCA1.35V,VCCB5V,A1输入&#xff0c;B1输出 2.VCCA1.35V,VCCB5V,B1输入&#xff0c;A1输出 3.VCCA1.35V,VCCB5V,A2输入&#xff0c;B2输出 4.VCCA1.35V,VCCB5V,B2输入&#xff0c;A2输出

升级 Windows 后如何恢复丢失的文件

升级到 Windows 11 后可以恢复丢失的文件&#xff01;阅读帖子直到最后&#xff0c;了解如何做到这一点。 为了获得安全更新并使用最新的操作系统&#xff0c;人们会升级到最新版本的 Windows。然而&#xff0c;在这样做的过程中&#xff0c;许多人丢失了他们的重要文件&#…

基于SpringBoot+Vue+MySQL的体育商城系统

系统展示 用户前台界面 管理员后台界面 系统背景 随着互联网的飞速发展&#xff0c;电子商务已成为人们日常生活中不可或缺的一部分。体育用品市场作为其中的一个重要分支&#xff0c;也逐渐向线上转移。基于SpringBootVueMySQL的体育商城系统应运而生&#xff0c;旨在通过构建…

优秀的拆分C++

题目&#xff1a; 样例解释&#xff1a; 样例1解释 6422221 是一个优秀的拆分。注意&#xff0c;6222 不是一个优秀的拆分&#xff0c;因为拆分成的 3 个数不满足每个数互不相同。 思路&#xff1a; 题目大致意思是说给定一个正整数NN&#xff0c;让你用二进制表示&#xff08;…

PDCA优化任务流程

这里写目录标题 一、背景二、PDCA重要性与必要性概念PDCA循环的重要性 三、PDCA分析这次任务的执行任务描述分析原因&#xff1a;结合PDCA分析&#xff1a;提高办法&#xff1a; 四、总结 一、背景 汇报任务完成情况&#xff0c;未提交实际成果。 本次总结旨在通过PDCA循环的视…

鸿蒙开发(NEXT/API 12)【硬件(振动开发1)】振动

通过最大化开放马达器件能力&#xff0c;振动器模块服务拓展了原生马达服务&#xff0c;实现了振动与交互融合设计&#xff0c;从而打造出细腻精致的一体化振动体验和差异化体验&#xff0c;提升用户交互效率、易用性以及用户体验&#xff0c;并增强品牌竞争力。 运作机制 Vi…

学习docker第二弹------基本命令[帮助启动类命令、镜像命令、容器命令]

docker目录 前言基本命令帮助启动类命令停止docker服务查看docker状态启动docker重启docker开机启动docker查看概要信息查看总体帮助文档查看命令帮助文档 镜像命令查看所有的镜像 -a查看镜像ID -q在仓库里面查找redis拉取镜像查看容器/镜像/数据卷所占内存删除一个镜像删除多个…

机器学习:opencv--背景建模

目录 一、背景建模是什么&#xff1f; 二、背景建模的目的 三、背景建模的方法及原理 四、代码实现 1.创建卷积核 2.创建混合高斯模型 3.处理图像 4.绘制人形轮廓 5.条件退出 一、背景建模是什么&#xff1f; 指在计算机视觉中&#xff0c;从视频序列中提取出静态背景…

Anaconda虚拟环境默认路径在C盘怎么更改

笔者已经新建好了虚拟环境并且安装了对应库&#xff0c;输入conda env list查询发现虚拟环境竟然安装到了C盘(&#xff61;•́︿•̀&#xff61;)&#xff0c;为避免下一次创建虚拟环境出错&#xff0c;笔者现在修改默认路径置D盘&#xff08;软件安装盘&#xff09; 参考两…

ROS学习笔记(四):使用 `ros2 run usb_cam usb_cam_node_exe` 启动 USB 摄像头

文章目录 前言1 安装 usb_cam 包2 启动 USB 摄像头3 订阅相机发布的节点信息并进行可视化3.1 使用 rqt_image_view3.2 使用 image_view3.3 使用 rviz 4 常见问题与解决方案4.1 摄像头未被识别4.2 相机显示异常4.3 如何指定不同的相机4.4 摄像头参数调整 5. 调试信息 5. 结论 前…

pyboard405意外故障,micropython OLED例程无法运行,折腾了大半天。

thonny报告&#xff1a; Traceback (most recent call last): File "<stdin>", line 3, in <module> RuntimeError: name too mode # main.py -- put your code here! from machine import I2C,Pin #从machine模块导入I2C、Pin子模块 from ss…

SpringBoot项目请求不中断动态更新代码

在开发中&#xff0c;有时候不停机动态更新代码热部署是一项至关重要的功能&#xff0c;它可以在请求不中断的情况下下更新代码。这种方式不仅提高了开发效率&#xff0c;还能加速测试和调试过程。本文将详细介绍如何在 Spring Boot 项目在Linux系统中实现热部署&#xff0c;特…

MySQL - 运维篇

一、日志 1. 错误日志 2. 二进制日志 3. 查询日志 记录了所有的增删改查语句以及DDL语句 4. 慢查询日志 二、主从复制 1. 概述 2. 原理 3. 搭建 三、分库分表 1. 介绍 2. Mycat概述 3. Mycat入门 4. Mycat配置 5. Mycat分片 6. Mycat管理及监控 四、读写分离 1. 介绍 2. 一…

PostgreSQL的安装与使用指南

PostgreSQL,简称Postgres,是一个功能强大的开源对象-关系数据库系统。它以其稳定性、可靠性、数据完整性以及对SQL标准的严格遵循而著称,广泛应用于各种规模的企业级应用、Web应用和数据仓库中。本文将详细介绍PostgreSQL在不同操作系统上的安装、配置及基本使用方法。 一、…

html+css+js实现Tabs标签页

实现效果 HTML部分 <div class"tab"><ul class"tab-nav"><li><a href"#" class"active" >用户管理</a></li><li><a href"#" >配置管理</a></li><li>&l…