Linux tar包解压锁

Linux tar 包解压缩

文件后缀 解压命令 打包命令
.tar tar -xvf file.tar tar -cvf file.tar dir_or_files
.tar.gz/.tgz tar -xzvf file.tar.gz tar -czvf file.tar.gz dir_or_files
.tar.bz2 tar -xjvf file.tar.bz2 tar -cjvf file.tar.bz2 dir_or_files
.zip unzip file.zip zip -r file.zip dir_or_files
1

参数解释

tar -xzvf

  • x:extract(解包)
  • z:gzip(解压缩)
  • v:verbose(显示过程)
  • f:file(指定文件名)
1
tar -xzvf file.tar.gz
1
2
3
4
5
6
7
tar -czvf archive.tar.gz 要打包的目录或文件

# 打包当前目录下的 myfolder 为 myfolder.tar.gz
tar -czvf myfolder.tar.gz myfolder

# 打包多个文件为 one.tar.gz
tar -czvf one.tar.gz file1.txt file2.sh dir3

总结解压命令尝试顺序

1
2
3
4
5
6
7
8
9
file filename.tar       # 先判断类型

# 根据类型决定:
tar -xvf filename.tar # 纯 tar
tar -xzvf filename.tar # tar.gz
tar -xjvf filename.tar # tar.bz2
tar -xJvf filename.tar # tar.xz
unzip filename.tar # 可能是 zip
7z x filename.tar # 万能工具

Python 爬虫闲鱼等网页数据

Python 爬虫闲鱼等网页数据

通过 F12 进行分析

进入一个类型的网页,F12 进行网络抓包,通过搜索找到自己想要的数据

比如这里搜索: 班服毕业初中生学生
闲鱼网页

获取参数

参数

其他的一些参数比如: url 和 cookie 还有 headers 都在表头里找

地址和参数

如果写入data数据了,就可以只写被框柱的url

通过json模块处理数据

数据处理
我们需要的是data数据,所以需要处理一下

1

翻页收集

Python 取出两个数值

字典中取出 key 和 value

1
2
3
4
5
6
7
config = {
"DIFFNET": "192.168.1.1",
"ROUTER": "192.168.1.254"
}

for key, value in config.items():
print(f"{key} = {value}")

从列表中取出两个字段组成的元组

1
2
3
4
config_list = [("DIFFNET", "192.168.1.1"), ("ROUTER", "192.168.1.254")]

for name, ip in config_list:
print(f"{name} has IP {ip}")

从带有结构的配置文本中解析两个值

1
2
DIFFNET=192.168.1.1
ROUTER=192.168.1.254
1
2
3
4
5
with open("data.txt", "r") as f:
for line in f:
if "=" in line:
key, value = line.strip().split("=")
print(f"Key: {key}, Value: {value}")

zip() 函数 两个列表组合成一个字典

1
2
3
4
5
names = ["DIFFNET", "ROUTER"]
ips = ["192.168.1.1", "192.168.1.254"]

for name, ip in zip(names, ips):
print(f"{name}: {ip}")
1
2
3
4
5
6
names = ["DIFFNET", "ROUTER"]
ips = ["192.168.1.1", "192.168.1.254"]
data = {}
for name, ip in zip(names, ips):
data[name] = ip
print(data)

API 模块

网站想开放 API 接口供别人使用

创建一个 Web 接口服务,例如使用 Python 的 Flask 框架。

开放一个返回当前时间的 API 接口

1
2
3
4
5
6
7
8
9
10
11
12
from flask import Flask, jsonify
from datetime import datetime

app = Flask(__name__)

@app.route('/api/time', methods=['GET'])
def get_time():
now = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
return jsonify({"time": now})

if __name__ == '__main__':
app.run(host='0.0.0.0', port=5000)

使用 fastapi

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
from fastapi import FastAPI
import random


app = FastAPI()

@app.get("/")
async def root():
return {'message': "Hello World", 'data': 0}


@app.get("/random/{limit}")
async def get_random(limit: int):
rn:int = random.randint(0, limit) # 这个范围是0-limit,并且包含0和limit
return {'number': rn, 'limit': limit}

@app.get("/random/")
async def get_random():
rn:int = random.randint(0, 100) # 这个范围是0-limit,并且包含0和limit
return {'number': rn, 'limit': 100}

启动命令

1
uvicorn main:app --reload
  • uvicorn:命令启动 uvicorn 服务器
  • main:main.py 文件
  • app:app 变量
  • –reload:自动重启 热更新

datetime 模块

基础用法

1
2
3
4
5
6
7
8
9
10
11
12
13
from datetime import datetime, timedelta

# 获取当前时间
now = datetime.now()
print("当前时间:", now)

# 创建指定时间
dt = datetime(2025, 6, 9, 15, 30)
print("指定时间:", dt)

# 格式化时间
now = now.strftime("%Y-%m-%d %H:%M:%S")
print("格式化时间:", now)

datetime 增加一天、一小时、一分钟(使用 timedelta)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
from datetime import datetime, timedelta

now = datetime.now()

# 增加1天
print(now + timedelta(days=1))

# 增加1小时
print(now + timedelta(hours=1))

# 增加1分钟
print(now + timedelta(minutes=1))
# 减少1分钟
print(now - timedelta(minutes=1))

增加一年,一月,使用第三方库 dateutil

1
pip3 install python-dateutil
1
2
3
4
5
6
7
8
9
10
11
12
13
from datetime import datetime
from dateutil.relativedelta import relativedelta

now = datetime.now()

# 增加1个月
print(now + relativedelta(months=1))

# 增加1年
print(now + relativedelta(years=1))

# 减少1年
print(now - relativedelta(years=1))

logging 模块

logging 模块

基本用法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
level=logging.INFO
设置记录级别为INFO,意味着会记录INFO、WARNING、ERROR和CRITICAL级别的日志,DEBUG级别的会被忽略

format参数
定义日志输出格式:

%(asctime)s:记录时间(如:2023-08-01 12:00:00,000)
%(levelname)s:日志级别(如:INFO、ERROR)
%(message)s:日志内容
handlers数组
包含两个输出渠道:
FileHandler:将日志写入当前目录的crawler.log文件(使用UTF-8编码)
StreamHandler:将日志实时输出到控制台
实际效果:
程序运行时既会在控制台实时显示日志,又会将日志永久保存到crawler.log文件中,格式示例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# logg.py
import logging
from logging.handlers import RotatingFileHandler

# 日志配置函数
def setup_logger(log_file='app.log'):
logger = logging.getLogger() # logging,getLogger() 获取一个 logger 实例作用是获取一个日志记录器 如果logging,getLogger()不赋值logger,则默认返回root logger
logger.setLevel(logging.INFO) # 下面自己设置了日志级别这里可以不用设置吗?:可以不用设置,因为logger.addHandler() 返回的是logger对象本身,所以可以打印日志

# 控制台输出
console_handler = logging.StreamHandler() # 创建一个控制台输出处理器
console_handler.setLevel(logging.INFO) # 上面已经设置了日志级别为什么这里还要设置:因为logger.addHandler() 返回的是logger对象本身,所以可以打印日志
console_format = logging.Formatter('[%(levelname)s] %(message)s') # 设置日志格式
console_handler.setFormatter(console_format)

# 文件输出(带轮转)
file_handler = RotatingFileHandler(log_file, maxBytes=1024*1024, backupCount=3) # 创建一个文件输出处理器,最大1MB,最多保留3个旧文件
file_handler.setLevel(logging.INFO)
file_format = logging.Formatter('%(asctime)s - %(name)s - [%(levelname)s] - %(message)s') # 设置日志格式
file_handler.setFormatter(file_format)

# 添加处理器,作用是日志输出到控制台和文件
logger.addHandler(console_handler) # 为什么return logger 就可以打印日志:因为logger.addHandler() 返回的是logger对象本身,所以可以打印日志
logger.addHandler(file_handler)

return logger
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# main.py
from logg import setup_logger

# 初始化 logger
logger = setup_logger()

def main():
logger.info("程序开始运行")
logger.warning("这是一个警告")
logger.error("出现了一个错误")
logger.critical("严重错误!")

if __name__ == "__main__":
main()

定义日志格式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
import logging

# 创建日志格式
formatter = logging.Formatter('[%(asctime)s] %(levelname)s - %(message)s')

# 创建 info 日志处理器
info_handler = logging.FileHandler('info.log', encoding='utf-8')
info_handler.setLevel(logging.INFO)
info_handler.setFormatter(formatter)

# 创建 warning 日志处理器
warning_handler = logging.FileHandler('warning.log', encoding='utf-8')
warning_handler.setLevel(logging.WARNING)
warning_handler.setFormatter(formatter)

# 创建 error 日志处理器
error_handler = logging.FileHandler('error.log', encoding='utf-8')
error_handler.setLevel(logging.ERROR)
error_handler.setFormatter(formatter)

# 创建控制台输出处理器
# console_handler = logging.StreamHandler()
# console_handler.setLevel(logging.INFO)
# console_handler.setFormatter(formatter)

# 配置 root logger(主日志器)
logging.basicConfig(
level=logging.INFO,
handlers=[info_handler, warning_handler, error_handler]
# handlers=[info_handler, warning_handler, error_handler, console_handler]
)

# === 模拟日志输出 ===
logging.info("程序启动,初始化成功。")
logging.warning("警告:配置文件中某些值未设置,将使用默认值。")
logging.error("错误:无法连接到数据库,请检查配置。")

ansible 问题解决

强制客户端使用 IPv6

既然不可连接的机器只监听 IPv6,可以尝试强制 scp 使用 IPv6:
确认服务器的 IPv6 地址:

1
2
ip -6 addr show
scp -6 -i ~/.ssh/BDKJ-1025.rsa /apps/data/workspace/ansible/scripts/default.sh root@[IPv6_ADDRESS]:/tmp/a.sh

主机清单(inventory)中使用 IPv6 地址

1
2
3
[webservers]
web1 ansible_host=[2001:db8::1] ansible_user=root
web2 ansible_host=[2001:db8::2] ansible_user=root

IPv6 连接可能需要你额外指定 ansible_ssh_common_args 来确保 ssh 使用正确的方式连接。

1
2
3
[webservers]
web1 ansible_host=[2001:db8::1] ansible_user=root ansible_ssh_common_args='-6'
web2 ansible_host=[2001:db8::2] ansible_user=root ansible_ssh_common_args='-6'

如果你使用 YAML 格式的 Inventory 文件(主机清单)

1
2
3
4
5
6
7
8
9
10
all:
hosts:
web1:
ansible_host: "[2001:db8::1]"
ansible_user: root
ansible_ssh_common_args: "-6"
web2:
ansible_host: "[2001:db8::2]"
ansible_user: root
ansible_ssh_common_args: "-6"

启用 IPv4 监听

不可连接的机器只监听 IPv6,需修改配置让 sshd 同时监听 IPv4:

1
cat /etc/ssh/sshd_config

确保没有限制为 IPv6 的配置:

1
2
AddressFamily inet6  # 如果存在,改为 AddressFamily any 或注释掉
ListenAddress :: # 如果存在,添加 ListenAddress 0.0.0.0

推荐配置

1
2
3
AddressFamily any
ListenAddress 0.0.0.0
ListenAddress ::

检查 ssh.socket 配置:

1
cat /usr/lib/systemd/system/ssh.socket

确保监听 IPv4 和 IPv6:

1
2
3
4
[Socket]
ListenStream=0.0.0.0:22
ListenStream=[::]:22
Accept=yes

如果缺少 IPv4 监听,添加 ListenStream=0.0.0.0:22。

1
2
systemctl daemon-reload
systemctl restart ssh.socket

修复 SFTP 子系统

1
2
3
4
5
6
7
grep Subsystem /etc/ssh/sshd_config
# Subsystem sftp /usr/lib/openssh/sftp-server
ls -l /usr/lib/openssh/sftp-server
# 验证是否存在
apt update && apt install openssh-sftp-server
# 如果不存在
systemctl restart ssh.socket

ansible 配置

ansible 配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[defaults]
forks = 10
ansible_ssh_common_args = -o PreferredAuthentications=publickey,password -o PubkeyAuthentication=yes
remote_port = 22
inventory = /apps/data/workspace/ansible/hosts.ini
host_key_checking = False
stdout_callback = minimal
timeout = 10
remote_user = root
log_path = /apps/data/workspace/ansible/ansible.log.log
private_key_file = ~/.ssh/id_rsa

[ssh_connection]
pipelining = True
scp_if_ssh = True
Section Option Value Description
[defaults] forks 10 设置并行执行任务的最大进程数,允许同时处理 10 台主机以提高效率
[defaults] ansible_ssh_common_args -o PreferredAuthentications=publickey,password -o PubkeyAuthentication=yes 指定 SSH 认证优先顺序为公钥认证,失败后尝试密码认证,并启用公钥认证。
[defaults] remote_port 22 指定默认 SSH 端口为 22,可通过 inventory 文件覆盖。
[defaults] inventory /apps/data/workspace/ansible/hosts.ini 指定默认 inventory 文件路径,定义 Ansible 管理的主机列表。
[defaults] host_key_checking False 禁用 SSH 主机密钥检查,简化初次连接(降低安全性,建议受控环境使用)。
[defaults] stdout_callback minimal 设置输出格式为简洁模式,仅显示关键信息,适合脚本化或减少日志冗余。
[defaults] timeout 10 设置 SSH 连接超时时间为 10 秒,适合网络稳定的环境。
[defaults] remote_user root 设置默认登录用户为 root,需确保远程主机允许 root 登录。
[defaults] log_path /apps/data/workspace/ansible/ansible.log.log 指定日志文件路径,记录 Ansible 运行日志,便于调试。
[defaults] private_key_file ~/.ssh/id_rsa 指定默认 SSH 私钥路径,确保文件存在且权限正确。
[ssh_connection] pipelining True 启用 SSH pipelining,通过单一连接发送多条命令,显著提高执行速度。需禁用远程主机的 requiretty。
[ssh_connection] scp_if_ssh True 启用 SCP 协议进行文件传输,通常比 SFTP 更快。

ansible 主机清单配置

1
2
3
4
5
6
7
8
9
10
11
12
13
[temp1]
11.16.11.3 ansible_ssh_private_key_file=~/.ssh/BDKJ-1025.rsa ansible_ssh_user=root ansible_ssh_user="登录用户"
11.16.12.3 ansible_ssh_private_key_file=~/.ssh/BDKJ-1025.rsa ansible_ssh_user=root ansible_ssh_user="登录用户"
11.16.13.3 ansible_ssh_private_key_file=~/.ssh/BDKJ-1025.rsa ansible_ssh_user=root ansible_ssh_user="登录用户"
11.16.14.3 ansible_ssh_private_key_file=~/.ssh/BDKJ-1025.rsa ansible_ssh_user=root ansible_ssh_user="登录用户"
11.16.15.3 ansible_ssh_private_key_file=~/.ssh/BDKJ-1025.rsa ansible_ssh_user=root ansible_ssh_user="登录用户"
11.16.16.3 ansible_ssh_private_key_file=~/.ssh/BDKJ-1025.rsa ansible_ssh_user=root ansible_ssh_user="登录用户"
11.16.17.3 ansible_ssh_private_key_file=~/.ssh/BDKJ-1025.rsa ansible_ssh_user=root ansible_ssh_user="登录用户"
11.16.18.3 ansible_ssh_private_key_file=~/.ssh/BDKJ-1025.rsa ansible_ssh_user=root ansible_ssh_user="登录用户"
11.16.20.3 ansible_ssh_private_key_file=~/.ssh/BDKJ-1025.rsa ansible_ssh_user=root ansible_ssh_user="登录用户"

[temp2]
11.16.19.3 ansible_ssh_private_key_file=~/.ssh/BDKJ-1025.rsa ansible_ssh_user=root ansible_ssh_user="登录用户"

主机清单常用连接控制变量(汇总表)

变量名 作用说明 示例
ansible_host 要连接的目标主机 IP 或域名 ansible_host=192.168.1.10 或 ansible_host=[2001:db8::1]
ansible_user 连接时使用的用户名 ansible_user=root
ansible_port SSH 端口(默认 22) ansible_port=2222
ansible_password 连接密码(不推荐明文) ansible_password=yourpassword
ansible_private_key_file SSH 私钥路径 ansible_private_key_file=~/.ssh/id_rsa
ansible_connection 连接方式(默认 ssh) ansible_connection=ssh、local、docker、winrm
ansible_ssh_common_args 传递给 ssh 的额外参数(推荐用于 IPv6、跳板机等) ansible_ssh_common_args=’-6 -o StrictHostKeyChecking=no’
ansible_shell_type shell 类型(sh / csh / powershell) ansible_shell_type=sh
ansible_python_interpreter 指定远程主机 Python 解释器路径 ansible_python_interpreter=/usr/bin/python3
ansible_become 是否提权(sudo) ansible_become=true
ansible_become_user sudo 切换的目标用户 ansible_become_user=root
ansible_become_method 使用 sudo、su、pbrun 等方法提权 ansible_become_method=sudo
ansible_become_password sudo 密码(如需) ansible_become_password=xxx(不推荐明文)
如果配置文件写过后,也可以不用添加

使用方法

直接使用 -i 指定主机清单,使用 –config 指定配置文件路径

注意注意注意!!!
如果你的 ansible 不支持–config 参数,那么你直接设置环境变量: export ANSIBLE_CONFIG=/apps/data/workspace/ansible/ansible.cfg

然后命令里面的–config 去掉,再执行就可以了

1

nft 使用

nft 使用

1. 安装 nft 工具

1
2
apt-get install nftables
yum install nftables

2. 配置 nft 规则

1
2
3

# 3. 保存 nft 规则
nft list ruleset
1
2
3
4
meta skuid 1000 counter 的组合表示:

匹配条件:只处理与 UID 为 1000 的用户关联的套接字的数据包。
动作:对匹配的数据包进行统计,记录数据包数量和字节数。

git 常用命令

git 常用命令

从命令行创建一个新的仓库

1
2
3
4
5
6
7
echo "# song.github.io" >> README.md
git init
git add README.md
git commit -m "first commit"
git branch -M main
git remote add origin git@github.com:sixonepawnacct/song.github.io.git
git push -u origin main

一、初始化仓库

1
git init

📥 二、克隆远程仓库

1
2
3
git clone <仓库地址>
# 示例:
git clone https://github.com/user/project.git

作用:下载一个远程仓库到本地。

📂 三、查看当前状态

1
git status

作用:显示工作目录和暂存区的状态。

📁 四、添加到暂存区

1
2
git add <文件名>     # 添加单个文件
git add . # 添加所有修改的文件

作用:将文件添加到暂存区,准备提交。

💾 五、提交代码

1
git commit -m "提交信息"

作用:将暂存区的文件提交到本地仓库。

📝 六、查看提交历史

1
2
git log
git log --oneline # 简洁模式

作用:显示提交历史记录。

🔁 七、修改最后一次提交说明

1
git commit --amend -m "新的提交信息"

作用:修改最后一次提交的说明。

🔄 八、推送到远程仓库

1
2
3
git push <远程仓库名> <分支名>
# 示例:
git push origin main

作用:将本地分支推送到远程仓库。

⬇️ 九、拉取远程仓库最新内容

1
2
3
git pull <远程仓库名> <分支名>
# 示例:
git pull origin main

作用:从远程仓库拉取最新内容到本地。

🌿 十、分支管理

1
2
3
4
5
git branch        # 查看所有分支
git branch <分支名> # 创建新分支
git checkout <分支名> # 切换到指定分支
git merge <分支名> # 合并指定分支到当前分支
git branch -d <分支名> # 删除分支

作用:管理分支,包括创建、切换、合并和删除。

🔀 十一、合并分支

1
git merge <分支名>

❌ 十二、撤销与回退

1
2
3
4
5
6
# 撤销未暂存的修改
git checkout -- <文件名>
# 撤销已 add 的文件
git reset HEAD <文件名>
# 回退到上一个版本
git reset --hard HEAD^

🔐 十三、配置用户信息(首次使用需要)

1
2
3
4
git config --global user.name "Your Name"
```bash
git config --global user.name "Your Name"
git config --global user.email "EMAILgit config --global user.email "your_email@example.com"

作用:配置本地 Git 环境的用户名和邮箱。

临时推送,如果这个是误报或者你清楚不会泄露信息,你也可以在 GitHub 上手动放行本次提交:

https://github.com/sixonepawnacct/songyi.github.io/security/secret-scanning/unblock-secret/2xexyuRKp70BsD85VvNzQNaZLH6

HTML元素和常用属性

html 标签和元素

🧱 一、结构标签(布局相关)

标签 含义与作用 常用用法示例
<html> HTML 文档根元素 <html lang=”zh-CN”>…</html>
<head> 页面头部信息(非可视) 包含 <title>, <meta>, <link> 等
<body> 页面主体内容(可视) 所有显示的内容都写在里面
<header> 页眉,常用于 logo、导航等 <header><h1>我的网站</h1></header>
<footer> 页脚,版权等信息 <footer>© 2025 我的站点</footer>
<main> 页面主要内容区域 页面主体内容结构化的标记
<section> 区块,语义上分段 <section><h2>新闻</h2>…</section>
<article> 独立的文章内容 <article><h2>博客</h2>内容…</article>
<nav> 导航栏 <nav><ul><li>首页</li></ul></nav>
<aside> 边栏内容(如推荐、广告) <aside>相关文章</aside>
<div> 通用容器,无语义 <div class=”box”>…</div>

📄 二、文本内容标签

标签 作用 示例
<h1>~<h6> 标题(h1 最大,h6 最小) <h1>主标题</h1>
<p> 段落 <p>这是一个段落。</p>
<br> 换行(单标签) 第一行<br>第二行
<hr> 水平分割线 <hr>
<span> 内联容器(无语义) <span class=”red”>红字</span>
<strong> 加粗(强调) <strong>重要</strong>
<em> 斜体(强调) <em>强调</em>
<b> 加粗(不强调) <b>加粗</b>
<i> 斜体(不强调) <i>斜体</i>
<mark> 高亮 <mark>高亮文字</mark>
<small> 小号文字 <small>小字</small>
<del> 删除线 <del>删除内容</del>
<ins> 插入线(下划线) <ins>新增内容</ins>
<pre> 保留格式的文本 <pre> 保留空格和换行</pre>
<code> 行内代码显示 <code>console.log()</code>

📎 三、链接与图片

标签 说明 示例
<a> 超链接 <a href=”https://example.com">点击跳转</a>
<img> 图片 <img src=”logo.png” alt=”Logo”>

📋 四、列表

标签 说明 示例
<ul> 无序列表 <ul><li>苹果</li><li>香蕉</li></ul>
<ol> 有序列表 <ol><li>第一</li><li>第二</li></ol>
<li> 列表项 同上
<dl> 定义列表 <dl><dt>术语</dt><dd>定义内容</dd></dl>

📦 五、表格

标签 说明 示例
<table> 表格容器 <table><tr><td>数据</td></tr></table>
<tr> 表格行 表格的一行
<td> 表格数据单元格 表格的普通格子
<th> 表头单元格 加粗居中的格子
<thead> 表头区域
<tbody> 表体区域
<tfoot> 表脚区域
colspan 跨列 <td colspan=”2”>合并</td>
rowspan 跨行 <td rowspan=”2”>合并</td>

🎛️ 六、表单标签

标签 用途 示例
<form> 表单容器 <form action=”/submit”></form>
<input> 输入框 <input type=”text” name=”user”>
<textarea> 多行文本框 <textarea name=”msg”></textarea>
<button> 按钮 <button type=”submit”>提交</button>
<select> 下拉菜单 <select><option>选项</option></select>
<option> 下拉项 同上
<label> 输入说明文本 <label for=”name”>姓名</label>

🧪 七、媒体标签

标签 用途 示例
<audio> 音频播放 <audio controls src=”song.mp3”></audio>
<video> 视频播放 <video controls src=”video.mp4”></video>
<source> 媒体资源 用于 <audio> 或 <video> 中多种格式支持
<iframe> 嵌套网页 <iframe src=”https://example.com"></iframe>

📜 八、元信息和脚本

标签 用途 示例
<title> 页面标题(浏览器标签) <title>我的网站</title>
<meta> 元信息(编码、描述等) <meta charset=”UTF-8”>
<link> 外部资源链接(如 CSS) <link rel=”stylesheet” href=”style.css”>
<style> 页面内嵌 CSS 样式 <style>p { color: red; }</style>
<script> 引入或编写 JS 脚本 <script src=”main.js”></script>

HTML基本用法

HTML 元素和常用属性

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
<!-- 标题元素:h1 ~ h6,数字越小标题越大 -->
<h1>一级标题</h1>
<h2>二级标题</h2>

<!-- 段落元素:p -->
<p>这是一个段落。</p>

<!-- 链接元素:a,href为目标地址 -->
<a href="https://example.com" target="_blank">访问示例网站</a>

<!-- 图片元素:img,src为图片路径,alt为替代文字 -->
<img src="example.jpg" alt="示例图片" width="200" />

<!-- 无序列表:ul 和 li -->
<ul>
<li>苹果</li>
<li>香蕉</li>
</ul>

<!-- 有序列表:ol 和 li -->
<ol>
<li>第一步</li>
<li>第二步</li>
</ol>

<!-- 换行:br -->
<p>第一行<br />第二行</p>

<!-- 强调文本:strong 为加粗,em 为斜体 -->
<p><strong>加粗文本</strong><em>斜体文本</em></p>

<!-- 区块容器:div(块级) 和 span(行内) -->
<div style="background: #eee; padding: 10px;">这是一个区块容器</div>
<p>这是一个 <span style="color: red;">红色词语</span> 的例子。</p>

<!-- 输入框:input,type 可设为 text, password, checkbox 等 -->
<input type="text" placeholder="请输入用户名" />

<!-- 按钮:button -->
<button onclick="alert('你点击了按钮')">点我</button>

<!-- 表单:form -->
<form action="/submit" method="post">
<label>用户名:<input type="text" name="username" /></label><br />
<label>密码:<input type="password" name="password" /></label><br />
<input type="submit" value="提交" />
</form>

<!-- 表格:table、thead、tbody、tr、th、td -->
<table border="1">
<thead>
<tr>
<th>姓名</th>
<th>年龄</th>
</tr>
</thead>
<tbody>
<tr>
<td>小明</td>
<td>18</td>
</tr>
</tbody>
</table>

<!-- 使用常见属性:id, class, style, title, disabled, checked -->
<div id="main" class="container" title="鼠标悬停提示" style="color: blue;">
使用了一些常用属性的div
</div>

<input type="checkbox" checked /> 我已阅读协议<br />
<button disabled>禁用按钮</button>

<!-- 注释写法 -->
<!-- 这是一个HTML注释,网页中不会显示 -->

表格的基本用法和修饰属性

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
<!-- 表格基础结构和修饰属性示例 -->
<table border="1" width="500" cellpadding="10" cellspacing="0">
<!-- border:边框宽度;width:表格总宽度 -->
<!-- cellpadding:单元格内边距;cellspacing:单元格之间的间距 -->

<!-- 表头 -->
<thead>
<tr>
<th>序号</th>
<th>姓名</th>
<th>年龄</th>
</tr>
</thead>

<!-- 表体 -->
<tbody>
<tr>
<td>1</td>
<td>张三</td>
<td>20</td>
</tr>
<tr>
<td>2</td>
<td>李四</td>
<td>22</td>
</tr>
</tbody>

<!-- 表尾 -->
<tfoot>
<tr>
<td colspan="3">共 2 人</td>
</tr>
</tfoot>
</table>

表单 form 的各种用法及 input 中 type 的不同功能

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
<!-- 表单常用结构及 input 类型举例 -->
<form action="/submit" method="post">
<!-- action:提交地址;method:提交方式(get/post) -->

<!-- 文本输入框 -->
用户名:<input type="text" name="username" placeholder="请输入用户名" /><br />

<!-- 密码输入框 -->
密码:<input type="password" name="password" placeholder="请输入密码" /><br />

<!-- 单选框(同组 name 只可选一项) -->
性别:
<input type="radio" name="gender" value="male" checked />
<input type="radio" name="gender" value="female" /><br />

<!-- 多选框(同组 name 可选多项) -->
爱好:
<input type="checkbox" name="hobby" value="reading" /> 阅读
<input type="checkbox" name="hobby" value="sports" /> 运动
<input type="checkbox" name="hobby" value="music" checked /> 音乐<br />

<!-- 邮箱输入框 -->
邮箱:<input type="email" name="email" /><br />

<!-- 数字输入框 -->
年龄:<input type="number" name="age" min="0" max="100" /><br />

<!-- 日期选择 -->
生日:<input type="date" name="birthdate" /><br />

<!-- 文件上传 -->
上传头像:<input type="file" name="avatar" /><br />

<!-- 隐藏字段(用户不可见) -->
<input type="hidden" name="token" value="abc123" /><br />

<!-- 下拉框 -->
城市:
<select name="city">
<option value="bj">北京</option>
<option value="sh">上海</option>
<option value="gz">广州</option></select
><br />

<!-- 多行文本框 -->
备注:<br />
<textarea name="comments" rows="4" cols="40">请输入备注内容</textarea><br />

<!-- 按钮 -->
<input type="submit" value="提交" />
<input type="reset" value="重置" />
<button type="button" onclick="alert('自定义按钮')">点击我</button>
</form>