我的JAVA-Web基础(1)
1.HTML
2.css
CSS(层叠样式表)提供了多种选择器来定位HTML文档中的元素,以便可以应用样式。以下是三种常用的选择器简述:
-
ID 选择器:
- ID选择器使用HTML元素的
id
属性来定位单个元素。每个页面中id
应该是唯一的,因此一个ID选择器只会匹配一个元素。 - 语法:在CSS中,ID选择器以
#
符号开头,后跟ID名称,不包含任何空格。 - 示例:如果有一个
<div>
元素的id="header"
,那么对应的CSS规则将写作#header { /* 样式规则 */ }
。
- ID选择器使用HTML元素的
-
类选择器:
- 类选择器用于选择所有具有特定
class
属性值的元素。与ID不同,类可以在同一个页面中多次使用,并且一个元素也可以拥有多个类。 - 语法:类选择器以
.
符号开头,后跟类名,同样不包含空格。 - 示例:如果有一些元素的
class="highlight"
,则可以通过.highlight { /* 样式规则 */ }
来为它们应用样式。
- 类选择器用于选择所有具有特定
-
标签选择器(也称为类型选择器):
- 标签选择器是基于HTML标签名称来选择元素的。它会匹配文档中所有的该类型的元素。
- 语法:直接使用HTML标签名称作为选择器,不需要前缀符号。
- 示例:要为所有的
<p>
段落元素定义样式,可以直接写p { /* 样式规则 */ }
。
3.Javascript
JavaScript 是一种广泛使用的编程语言,尤其在网页和网络应用程序中。以下是关于 JavaScript 的基本语法的简述,包括变量定义、数据类型和流程控制。
变量定义
JavaScript 支持三种声明变量的方式:
-
var
:这是最早的声明变量的方式,在 ES6 之前是唯一的声明方式。var
声明的变量具有函数作用域或全局作用域,并且存在变量提升(hoisting)现象。var x = 10;
-
let
:引入于 ES6,let
声明的变量具有块级作用域(即在{}
内),并且不会被提升到其所在的代码块顶部。let y = 20;
-
const
:同样引入于 ES6,用于声明常量,即一旦赋值后不能更改绑定的值。const
也具有块级作用域。需要注意的是,如果const
绑定的是一个对象或数组,那么虽然不能改变该引用,但可以修改对象内部的属性或数组中的元素。const z = 30;
数据类型
JavaScript 是一种动态类型语言,支持多种数据类型:
-
原始类型(Primitive Types):
Number
:表示整数和浮点数,例如42
或3.14
。String
:表示文本,用单引号或双引号括起来,例如'Hello'
或"World"
。Boolean
:表示逻辑值,只有两个值true
和false
。Null
:表示空值或不存在的对象,只有一个值null
。Undefined
:表示未定义的值,当变量被声明但未赋值时,它的默认值是undefined
。Symbol
(ES6 引入):表示独一无二的标识符。BigInt
(ES2020 引入):表示任意精度的整数。
-
复合类型(Complex Types):
Object
:用于存储键值对的数据集合,可以是普通的对象、数组、日期等。Array
:特殊的对象,用于存储有序的数据列表。Function
:也是对象,表示一段可执行的代码。
流程控制
JavaScript 提供了多种流程控制结构来控制程序的执行顺序:
-
条件语句:
if...else
:根据条件的真假执行不同的代码块。if (condition) {// 当 condition 为 true 时执行的代码 } else {// 当 condition 为 false 时执行的代码 }
-
循环语句:
for
:基于初始值、条件和增量/减量重复执行代码块。for (let i = 0; i < 5; i++) {// 执行的代码 }
while
:当指定条件为真时,重复执行代码块。while (condition) {// 执行的代码 }
-
跳转语句:
break
:立即退出最内层的循环或switch
语句。continue
:跳过当前循环的剩余部分,并开始下一次循环迭代。return
:从函数中返回一个值,并结束函数的执行。
JavaScript 中的 Array(数组)
定义和创建数组:
-
直接量语法:使用方括号
[]
来定义一个数组,元素之间用逗号分隔。let fruits = ['apple', 'banana', 'cherry'];
-
构造函数:使用
Array
构造函数来创建一个新的数组。可以传入一个参数作为数组的长度,或者传入多个参数作为数组的元素。// 创建一个空数组 let emptyArray = new Array();// 创建一个包含3个元素的数组 let numbers = new Array(1, 2, 3);// 创建一个长度为5的空数组 let lengthArray = new Array(5);
数组的方法和属性:
-
访问元素:通过索引访问数组中的元素,索引从0开始。
console.log(fruits[0]); // 输出: "apple"
-
修改元素:同样使用索引来修改数组中的元素。
fruits[1] = 'blueberry';
-
添加/移除元素:
push()
:在数组末尾添加一个或多个元素,并返回新的长度。pop()
:移除数组最后一个元素,并返回该元素。shift()
:移除数组第一个元素,并返回该元素。unshift()
:在数组开头添加一个或多个元素,并返回新的长度。splice()
:可以用来添加或移除元素,非常灵活。
-
遍历数组:
forEach()
:对数组的每个元素执行一次提供的函数。for...of
:遍历数组的值。map()
:创建一个新数组,其结果是该数组中的每个元素都调用一个提供的函数后的返回值。filter()
:创建一个新数组,其中包含所有通过测试的元素。reduce()
:对数组中的每个元素执行一个由您提供的reducer函数(升序执行),将其结果汇总为单个返回值。
-
查找元素:
indexOf()
:返回给定元素在数组中第一次出现的位置,如果不存在则返回-1。find()
:返回数组中满足提供的测试函数的第一个元素的值。findIndex()
:返回数组中满足提供的测试函数的第一个元素的索引。
-
其他方法:
slice()
:返回一个浅拷贝的新数组对象,这个数组是从开始到结束(不包括结束)选择的原数组的一个部分。concat()
:用于合并两个或多个数组。此方法不会更改现有数组,而是返回一个新数组。join()
:将数组的所有元素连接成一个字符串并返回。
JavaScript 中的 String(字符串)
定义和创建字符串:
-
直接量语法:使用单引号
'
、双引号"
或反引号(模板字符串)`
来定义字符串。let greeting = 'Hello, world!'; let message = "Welcome to JavaScript."; let multiline = `This is a string that spans multiple lines.`;
-
构造函数:使用
String
构造函数来创建一个新的字符串对象。let stringObject = new String('Another string');
字符串的方法和属性:
-
访问字符:可以通过索引访问字符串中的字符,或者使用
charAt()
方法。console.log(greeting[0]); // 输出: "H" console.log(greeting.charAt(0)); // 输出: "H"
-
获取长度:使用
length
属性来获取字符串的长度。console.log(greeting.length); // 输出: 13
-
查找子串:
indexOf()
和lastIndexOf()
:分别返回指定值首次和最后一次出现的索引,如果找不到则返回 -1。includes()
:检查字符串是否包含指定的子字符串,返回布尔值。startsWith()
和endsWith()
:分别检查字符串是否以指定的子字符串开头或结尾,返回布尔值。
-
提取子串:
slice()
:提取字符串的一部分,并返回新的字符串。substring()
和substr()
:也用于提取字符串,但substring()
使用起始和结束索引,而substr()
使用起始索引和要提取的字符数。
-
替换内容:
replace()
:用一些文本替换与指定的正则表达式匹配的子串。
-
转换大小写:
toLowerCase()
:将整个字符串转换为小写。toUpperCase()
:将整个字符串转换为大写。
-
修剪空白:
trim()
:去除字符串两端的空白字符。
-
拼接字符串:
concat()
:用于连接两个或更多的字符串,并返回结果字符串。
-
分割字符串:
split()
:根据指定的分隔符将字符串分割成数组。
-
模板字符串:允许嵌入表达式,使用
${expression}
语法。let name = 'Alice'; let age = 30; let info = `My name is ${name} and I am ${age} years old.`;
这些是 JavaScript 中处理数组和字符串的一些基本方式。随着 ES6+ 的引入,JavaScript 的字符串和数组功能变得更加丰富和强大。
4.JQuery
jQuery 是一个快速、小巧且功能丰富的库,它简化了 HTML 文档遍历、事件处理、动画和 Ajax 交互等操作。以下是 jQuery 的简单使用指南,包括 DOM 对象的选取和事件的回调。
引入 jQuery
在使用 jQuery 之前,你需要确保已经在网页中引入了 jQuery 库。可以通过下载 jQuery 文件并本地引用,或者通过 CDN 引用:
<!-- 使用CDN引入 -->
<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
DOM 对象的选取
jQuery 提供了一种类似 CSS 选择器的方式来选取 DOM 元素。以下是一些常见的选择器示例:
-
按 ID 选择元素:
$('#myElement') // 选取 id 为 "myElement" 的元素
-
按类选择元素:
$('.myClass') // 选取所有 class 为 "myClass" 的元素
-
按标签选择元素:
$('p') // 选取所有的 <p> 段落元素
-
组合选择器:
$('#container .item') // 选取 id 为 "container" 下所有 class 为 "item" 的元素
-
层级选择器:
- 子元素选择器:
$('ul > li')
选取<ul>
直接子元素中的所有<li>
。 - 后代选择器:
$('ul li')
选取<ul>
内部的所有<li>
,不论层次关系。 - 相邻兄弟选择器:
$('.class + p')
选取紧跟在.class
元素之后的第一个<p>
元素。 - 通用兄弟选择器:
$('.class ~ p')
选取.class
元素之后的所有<p>
元素。
- 子元素选择器:
-
属性选择器:
$('input[name="username"]')
选取所有name
属性等于"username"
的<input>
元素。
-
伪类选择器:
$('a:first')
选取第一个<a>
链接。$('li:odd')
选取索引为奇数的<li>
元素(从0开始计数)。
事件的回调
jQuery 简化了事件处理,提供了多种方法来绑定事件监听器到 DOM 元素上。下面是一些常用的事件处理方法:
-
click()
:为指定的元素绑定点击事件。$('#myButton').click(function() {alert('Button was clicked!'); });
-
on()
:用于绑定多个事件类型,或者为动态添加的元素绑定事件。// 绑定 click 事件 $('#myButton').on('click', function() {alert('Button was clicked!'); });// 绑定多个事件 $('#myElement').on({mouseenter: function() {$(this).css('background-color', 'yellow');},mouseleave: function() {$(this).css('background-color', '');} });// 为将来添加的元素绑定事件(委托事件) $(document).on('click', '.dynamicElement', function() {alert('Dynamic element was clicked!'); });
-
hover()
:为指定的元素绑定鼠标进入和离开事件。$('#myElement').hover(function() {$(this).css('background-color', 'yellow'); // 鼠标进入时},function() {$(this).css('background-color', ''); // 鼠标离开时} );
-
submit()
:为表单元素绑定提交事件。$('form').submit(function(event) {event.preventDefault(); // 阻止表单默认提交行为alert('Form submitted!'); });
-
ready()
:确保代码在 DOM 完全加载后执行。$(document).ready(function() {// 这里的代码会在DOM完全加载后执行console.log('DOM is ready'); });// 或者更简洁的方式 $(function() {console.log('DOM is ready'); });
问题一:DOM原生对象与jQuery对象如何相互转换?
-
从 DOM 原生对象到 jQuery 对象:
- 使用
$(element)
,其中element
是一个 DOM 元素。
var domElement = document.getElementById('myElement'); var $jqElement = $(domElement);
- 使用
-
从 jQuery 对象到 DOM 原生对象:
- 使用
.get()
方法或直接使用[index]
访问。
var $jqElement = $('#myElement'); var domElement = $jqElement.get(0); // 或者 $jqElement[0]
- 使用
问题二:jQuery如何获取页面中id为myDiv的div元素的最近一个兄弟元素?
- 使用
.next()
方法来获取紧邻的下一个兄弟元素。
var nextSibling = $('#myDiv').next();
问题三:jQuery中设置DOM节点属性的方法有哪些?
-
.data()
:用于存储和检索自定义数据。$('#myElement').data('user-id', 123); // 存储数据 var userId = $('#myElement').data('user-id'); // 获取数据
问题四:jQuery遍历元素的方式有哪些?
-
.each()
:遍历每个匹配的元素,并执行一个函数。$('li').each(function(index, element) {console.log(index, element); });
5.HTTP
6.Servlet
Servlet的基本介绍
Servlet的创建
Servlet的路径配置
注解
通过配置注解为相应的java类设置不同的形态

Servlet的生命周期
多线程单实例
HttpServletRequest,HttpServletResponse
获取请求参数
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;@WebServlet("/example")
public class ExampleServlet extends HttpServlet {private static final long serialVersionUID = 1L;@Overrideprotected void doGet(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {// 设置响应内容类型response.setContentType("text/plain");response.setCharacterEncoding("UTF-8");// 获取参数String username = request.getParameter("username");String password = request.getParameter("password");// 写入响应内容response.getWriter().println("GET Request - Username: " + (username != null ? username : "Not provided"));response.getWriter().println("GET Request - Password: " + (password != null ? "Provided" : "Not provided"));}@Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {// 设置响应内容类型response.setContentType("text/plain");response.setCharacterEncoding("UTF-8");// 获取参数String username = request.getParameter("username");String password = request.getParameter("password");// 写入响应内容response.getWriter().println("POST Request - Username: " + (username != null ? username : "Not provided"));response.getWriter().println("POST Request - Password: " + (password != null ? "Provided" : "Not provided"));// 简单的登录验证if ("admin".equals(username) && "password".equals(password)) {response.getWriter().println("Login successful!");} else {response.getWriter().println("Invalid username or password.");}}
}
转发与重定向
ServletConfig,ServletContent
ServletConfig
在init()的时候传给Servlet,该Servlet在之后可以通过ServletConfig对象获取对应的Config
ServletContext
JDBC
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;public class SimpleJDBCExample {public static void main(String[] args) {// 加载驱动程序(对于现代JDBC驱动通常不需要显式加载)Class.forName("com.mysql.cj.jdbc.Driver");// 连接数据库Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydatabase", "username", "password");// 创建Statement对象Statement statement = connection.createStatement();// 执行查询ResultSet resultSet = statement.executeQuery("SELECT * FROM mytable");// 处理结果集while (resultSet.next()) {int id = resultSet.getInt("id");String name = resultSet.getString("name");System.out.println("ID: " + id + ", Name: " + name);}// 关闭资源resultSet.close();statement.close();connection.close();}
}
相关文章:

我的JAVA-Web基础(1)
1.HTML 2.css CSS(层叠样式表)提供了多种选择器来定位HTML文档中的元素,以便可以应用样式。以下是三种常用的选择器简述: ID 选择器: ID选择器使用HTML元素的id属性来定位单个元素。每个页面中id应该是唯一的…...
【Leetcode 热题 100】207. 课程表
问题背景 你这个学期必须选修 n u m C o u r s e s numCourses numCourses 门课程,记为 0 0 0 到 n u m C o u r s e s − 1 numCourses - 1 numCourses−1。 在选修某些课程之前需要一些先修课程。 先修课程按数组 p r e r e q u i s i t e s prerequisites p…...
从CreateDialogIndirectParam起---我与大模型对话
前言: 对当前的大模型来说,一切皆程序,皆标准。只能按照推定的线路行走,就像机器人走进死胡同,不停的踏步也不回头。除非人为去干预它。其实我提出的这个问题前是因为我不清楚了解一部分WinAPI有着严格的检查机制和自毁…...

重温设计模式--建造者模式
文章目录 建造者模式(Builder Pattern)概述建造者模式UML图作用:建造者模式的结构产品(Product):抽象建造者(Builder):具体建造者(Concrete Builderÿ…...
CSS(五):定位
目录 相对定位 绝对定位 固定定位 在 CSS 中,position 属性用于控制元素的定位方式,使我们可以精确地控制元素在页面上的位置。定位分为相对定位、绝对定位、和固定定位 相对定位 相对定位:position: relative; 相对定位意味着元素的位置…...
JSON 系列之2:JSON简单查询
本文为Oracle数据库JSON学习系列的第2篇,讲述如何对存储在数据库中的JSON文档进行简单的查询。 创建测试表,插入2条数据: DROP TABLE colortab PURGE;CREATE TABLE colortab (id NUMBER,color VARCHAR2(4000),CONSTRAINT ensure_json CH…...

SQL 简单查询
目录 一、投影查询 1、指定特定列查询 2、修改返回列名查询 3、计算值查询 二、选择查询 1、使用关系表达式 2、使用逻辑表达式 3、使用 BETWEEN关键字 4、使用 IN关键字 5、使用 LIKE关键字 6、使用 IS NULL/ NOT NULL关键字 7、符合条件查询 三、聚合函数查询 一…...
YOLOv9-0.1部分代码阅读笔记-metrics.py
metrics.py utils\metrics.py 目录 metrics.py 1.所需的库和模块 2.def fitness(x): 3.def smooth(y, f0.05): 4.def ap_per_class(tp, conf, pred_cls, target_cls, plotFalse, save_dir., names(), eps1e-16, prefix""): 5.def compute_ap(recall, prec…...
KaiOS 4.0 | DataCall and setupData implemention
相关文档 1、KaiOS 3.1 系统介绍 KaiOS 系统框架和应用结构(APP界面逻辑)文章浏览阅读842次,点赞17次,收藏5次。对于Java开发者而言,理解JS的逻辑调用是有点困难的。而KaiOS webapp开发又不同于现代的web开发,更像chrome浏览器内嵌模式。在这里梳理一下kaios平台web应用…...

nginx-rtmp服务器搭建
音视频服务器搭建 本文采用 nginx/1.18.0和nginx-rtmp-module模块源代码搭建RTMP流媒体服务器 流程 查看当前服务器的nginx版本下载nginx和nginx-rtmp-module源代码重新编译nginx,并进行相关配置(nginx.conf、防火墙等)客户端测试连接测试搭…...

[c++进阶(三)]单例模式及特殊类的设计
1.前言 在实际场景中,总会遇见一些特殊情况,比如设计一个类,只能在堆上开辟空间, 或者是设计一个类只能实例化一个对象。那么我们应该如何编写代码呢?本篇将会详细的介绍 本章重点: 本篇文章着重讲解如何设计一些特殊 的类,包括不能被拷贝,只能在栈/堆上…...

企业内训|高智能数据构建和多模态数据处理、Agent研发及AI测评技术内训-吉林省某汽车厂商
吉林省某汽车厂商为提升员工在AI大模型技术方面的知识和实践能力,举办本次为期8天的综合培训课程。本课程涵盖“高智能数据构建与智驾云多模态数据处理”、“AI Agent的研发”和“大模型测评”三大模块。通过系统梳理从非结构化数据的高效标注与融合,到L…...

009 Qt_显示类控件_QLCDNumber、ProgressBar、Calendar
文章目录 前言LCD NumberProgressBarCalendar Widget 小结 前言 本文将会向你介绍显示类控件中QLCDNumber显示数字、ProgressBar进度条、Calendar日历 LCD Number QLCDNumer 是⼀个专门用来显示数字的控件. 类似于 “老式计算器” 的效果. 属性说明intValueQLCDNumber 显示…...

--spring.profiles.active=prod
rootproduct-qualification:~# ps -ef | grep java root 5110 1 3 16:57 ? 00:00:54 java -jar productQualification.jar --spring.profiles.activeprod root 6476 5797 0 17:26 pts/0 00:00:00 grep --colorauto java好的,你使用 ps …...
深入解析JVM中对象的创建过程
1. 引言 对象是面向对象编程的核心概念之一,它们封装了数据和行为,构成了应用程序的基本构建块。然而,在Java语言中,每当使用new关键字或其他方式创建一个新对象时,背后发生了什么?这个问题的答案隐藏在JV…...

使用开源在线聊天工具Fiora轻松搭建个性化聊天平台在线交流
前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家:人工智能教程 文章目录 前言1.关于Fiora2.安装Docker3.本地部署Fiora4.使用Fiora5.cpolar内网穿透工具安装6.创建远程连接公网地址7.固定Uptime …...

ffmpeg之显示一个yuv照片
显示YUV图片的步骤 1.初始化SDL库 目的:确保SDL库正确初始化,以便可以使用其窗口、渲染和事件处理功能。操作:调用 SDL_Init(SDL_INIT_VIDEO) 来初始化SDL的视频子系统。 2.创建窗口用于显示YUV图像: 目的:创建一个…...

MySQL中Performance Schema库的详解(下)
昨天说了关于SQL语句相关的,今天来说说性能相关的,如果没有看过上篇请点传送门https://blog.csdn.net/2301_80479959/article/details/144693574?fromshareblogdetail&sharetypeblogdetail&sharerId144693574&sharereferPC&sharesource…...
【Rust自学】7.1. Package、Crate和定义Module
喜欢的话别忘了点赞、收藏加关注哦,对接下来的教程有兴趣的可以关注专栏。谢谢喵!(・ω・) 7.1.1. Rust的代码组织 代码组织主要包括: 那些细节可以对外暴露,而哪些细节是私有的在作用域内哪些名称有效… …...
【Git】-- 版本说明
Alpha:是内部测试版,一般不向外部发布,会有很多 Bug .一般只有测试人员使用。Beta:也是测试版,这个阶段的版本会一直加入新的功能。在 Alpha 版之后推出。RC:(Release Candidate) 顾名思义么 ! 用在软件上就是候选版本。系统平台…...
React 第五十五节 Router 中 useAsyncError的使用详解
前言 useAsyncError 是 React Router v6.4 引入的一个钩子,用于处理异步操作(如数据加载)中的错误。下面我将详细解释其用途并提供代码示例。 一、useAsyncError 用途 处理异步错误:捕获在 loader 或 action 中发生的异步错误替…...

Zustand 状态管理库:极简而强大的解决方案
Zustand 是一个轻量级、快速和可扩展的状态管理库,特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...

python/java环境配置
环境变量放一起 python: 1.首先下载Python Python下载地址:Download Python | Python.org downloads ---windows -- 64 2.安装Python 下面两个,然后自定义,全选 可以把前4个选上 3.环境配置 1)搜高级系统设置 2…...
JVM垃圾回收机制全解析
Java虚拟机(JVM)中的垃圾收集器(Garbage Collector,简称GC)是用于自动管理内存的机制。它负责识别和清除不再被程序使用的对象,从而释放内存空间,避免内存泄漏和内存溢出等问题。垃圾收集器在Ja…...

[10-3]软件I2C读写MPU6050 江协科技学习笔记(16个知识点)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16...

智能分布式爬虫的数据处理流水线优化:基于深度强化学习的数据质量控制
在数字化浪潮席卷全球的今天,数据已成为企业和研究机构的核心资产。智能分布式爬虫作为高效的数据采集工具,在大规模数据获取中发挥着关键作用。然而,传统的数据处理流水线在面对复杂多变的网络环境和海量异构数据时,常出现数据质…...

HashMap中的put方法执行流程(流程图)
1 put操作整体流程 HashMap 的 put 操作是其最核心的功能之一。在 JDK 1.8 及以后版本中,其主要逻辑封装在 putVal 这个内部方法中。整个过程大致如下: 初始判断与哈希计算: 首先,putVal 方法会检查当前的 table(也就…...

WPF八大法则:告别模态窗口卡顿
⚙️ 核心问题:阻塞式模态窗口的缺陷 原始代码中ShowDialog()会阻塞UI线程,导致后续逻辑无法执行: var result modalWindow.ShowDialog(); // 线程阻塞 ProcessResult(result); // 必须等待窗口关闭根本问题:…...
Java求职者面试指南:Spring、Spring Boot、Spring MVC与MyBatis技术解析
Java求职者面试指南:Spring、Spring Boot、Spring MVC与MyBatis技术解析 一、第一轮基础概念问题 1. Spring框架的核心容器是什么?它的作用是什么? Spring框架的核心容器是IoC(控制反转)容器。它的主要作用是管理对…...

macOS 终端智能代理检测
🧠 终端智能代理检测:自动判断是否需要设置代理访问 GitHub 在开发中,使用 GitHub 是非常常见的需求。但有时候我们会发现某些命令失败、插件无法更新,例如: fatal: unable to access https://github.com/ohmyzsh/oh…...