一、网站基础概念 — 先把这些搞明白
建网站之前,先理解"网站是怎么工作的"。这一章我用最通俗的类比讲清楚每个概念。
1.1 🌐 域名 — 网站的"门牌号"
生活中的类比: 你想去朋友家做客,得知道他家地址(比如"北京市海淀区xx路xx号")。网站也一样——用户要访问你的网站,得输入一个"地址",这个地址就是域名。
像 baidu.com、taobao.com 这些都是域名。域名不是永久的,需要每年续费,就像租房子一样。
常见域名后缀
| 后缀 | 价格(年) | 说明 |
|---|---|---|
| .com | ≈ 80-120元 | 国际通用,最主流,建议首选 |
| .cn | ≈ 30-50元 | 中国专属,需实名认证(身份证) |
| .top / .xyz / .site | ≈ 10-20元 | 便宜,适合练手和实验 |
| .net / .org | ≈ 60-100元 | .net 给网络公司,.org 给非营利组织 |
| .com.cn | ≈ 30-50元 | 中国.com,比.com便宜 |
怎么取一个好域名?
- 短! — 越短越好记,最好不超过 8 个字母
- 品牌相关 — 包含你的品牌名或业务关键词
- 避免连字符 — my-website.com 容易说成 mywebsite.com
- 检查商标 — 别用有商标的词,会被投诉
- 查一下历史 — 别买被搜索引擎拉黑过的域名
国内: 阿里云(万网)、腾讯云(DNSPod)— 便宜,实名方便
国外: Namecheap、GoDaddy、Cloudflare — 不用实名,.com稍贵
我的推荐: 如果是国内站,用阿里云或腾讯云;如果是面向海外,用 Namecheap。
1.2 📡 DNS — 域名怎么找到服务器?
类比: 你写"北京市海淀区中关村大街1号",邮递员得把这个"文字地址"翻译成精确的"经纬度坐标"才知道具体在哪。DNS 做的就是这件事——把域名(文字)翻译成 IP 地址(数字,如 120.55.185.106)。
访问一个网站时,背后发生的事:
你在浏览器输入 example.com,回车
浏览器问 DNS 服务器:"example.com 的 IP 地址是多少?"
DNS 服务器查了一遍,回复:"它在 120.55.185.106"
浏览器拿着这个 IP 去那台服务器要文件
服务器把 HTML/CSS/JS 文件发回浏览器,你看到了页面
常见的 DNS 记录类型
| 类型 | 作用 | 例子 |
|---|---|---|
| A 记录 | 域名 → IPv4 地址 | @ → 120.55.185.106 |
| AAAA 记录 | 域名 → IPv6 地址 | @ → 2400:... 地址 |
| CNAME 记录 | 域名 → 另一个域名(别名) | www → example.github.io |
| MX 记录 | 邮件服务器地址 | @ → mail.example.com |
| TXT 记录 | 存放文本信息(验证域名所有权等) | @ → v=spf1 ... |
给 GitHub Pages 绑定域名:
1. 在域名管理后台添加 CNAME 记录,将 www 指向 你的用户名.github.io
2. 在 GitHub 仓库 Settings → Pages 里填上你的域名
3. 等 5-30 分钟生效(DNS 需要传播时间)
1.3 🖥️ 服务器 — 网站的"房子"
类比: 你写好了一个网站,有 HTML 文件、图片、数据库,它们得放在一台 24 小时不关机的电脑上,这台电脑就叫服务器。用户任何时候访问,都能从这台电脑拿到数据。
服务器的选择
| 方案 | 价格 | 特点 | 适合 |
|---|---|---|---|
| GitHub Pages | 免费 | 只能放静态文件,不能跑后端代码 | 个人博客、简历、文档站 |
| Vercel / Netlify | 免费起 | 支持静态 + Serverless 函数,绑定域名方便 | 前端项目、个人全栈项目 |
| 虚拟主机 | ≈50-200元/年 | 别人装好了环境,你传文件就行 | PHP 网站、WordPress |
| 云服务器 (VPS) | ≈50-500元/月 | 一台完整的远程电脑,想装什么装什么 | 任何类型的网站 |
| 云函数 (Serverless) | 按调用量计费 | 不需要管服务器,只管写代码 | 小程序、API 接口 |
云服务器常见的配置选择
个人博客 / 轻量级网站: 1核CPU + 2G内存 + 40G硬盘(≈ 50-80元/月)
中型网站 / 电商: 2核CPU + 4G内存 + 80G硬盘(≈ 150-300元/月)
高访问量网站: 4核+ / 8G+ 内存,可能需要负载均衡(多台服务器)
买了一台很贵的服务器,结果只跑了个静态页面。 — 静态页面 GitHub Pages 完全免费,不需要买服务器!先搞清楚需求再购买。
1.4 ⚡ CDN — 给网站"加速"
类比: 你的服务器在北京,一个广州用户访问挺快的,但一个纽约用户访问就慢得像蜗牛。CDN 相当于在全球各地提前"复制"你的网站文件。用户访问时,CDN 从离他最近的城市(比如纽约的 CDN 节点)把文件给他,速度快 3-10 倍。
CDN 的好处:
- 速度快 — 用户从最近的节点加载
- 省钱 — 大部分请求被 CDN 节点处理了,你的服务器带宽消耗少了
- 防攻击 — DDoS 攻击时,CDN 先帮你挡住
- SSL 免费 — Cloudflare 免费提供 HTTPS 证书
绑定 Cloudflare CDN 的步骤:
1. 注册 Cloudflare 免费账号
2. 添加你的域名
3. Cloudflare 会扫描你现有的 DNS 记录
4. 去你的域名注册商把 DNS 服务器改成 Cloudflare 给的(如 john.ns.cloudflare.com)
5. 等生效(10分钟到24小时)
6. 开启"SSL/TLS"为 Full,自动有 HTTPS
1.5 📄 静态网站 vs 动态网站
简单理解:
- 静态网站 = 一本印刷好的书。每个读者看到的都一样,内容不会变。
- 动态网站 = 一个能跟你对话的店员。你说"我要红色的",他就给你红色的。
| 对比项 | 静态网站 | 动态网站 |
|---|---|---|
| 文件组成 | 纯 HTML + CSS + JS | 后端程序 + 数据库 |
| 每次访问内容是否相同 | 是(除非手动改代码) | 否(不同用户看到不同内容) |
| 能不能有用户登录 | 不能(可以用第三方服务) | 可以 |
| 能不能存数据 | 不能 | 能 |
| 部署难度 | 极低 | 较高 |
| 速度 | 极快 | 取决于服务器性能 |
先做静态网站练手(完全免费),等熟练了再学后端做动态网站。大多数人都是从静态站开始的。
二、前端技术 — HTML(超详细版)
前端是做网站的第一步。你写的每一行代码,用户都能在浏览器里看到。
2.1 📄 HTML 入门 — 网站的骨架
HTML = 超文本标记语言。听起来很高大上,其实它就是一套"标签",用来告诉浏览器:"这是一个标题"、"这是一个段落"、"这是一张图片"。
类比: HTML 就像搭积木。你用不同的积木块(标签)拼出不同的形状(网页)。
第一个 HTML 页面
打开记事本,复制下面这段代码,保存为 index.html,双击打开——你就建好了人生第一个网页!
HTML<!DOCTYPE html> <!-- 告诉浏览器:这是 HTML5 文档 -->
<html lang="zh-CN"> <!-- 根标签,lang 表示网页语言是中文 -->
<head> <!-- 头部:放配置信息,不显示在页面上 -->
<meta charset="UTF-8"> <!-- 指定编码,这样中文不会乱码 -->
<title>我的第一个网站</title> <!-- 浏览器标签页上显示的标题 -->
</head>
<body> <!-- 身体:所有显示在页面上的内容都写在这 -->
<h1>你好,世界!</h1> <!-- h1:一级标题(最大的标题) -->
<p>这是我的第一个段落。</p> <!-- p:段落 -->
<a href="https://example.com">点我访问示例网站</a> <!-- a:链接 -->
<br> <!-- br:换行 -->
<img src="图片.jpg" alt="描述"> <!-- img:图片 -->
</body>
</html>
📦 最常用标签详解
| 标签 | 含义 | 例子 | 注意 |
|---|---|---|---|
| <h1>~<h6> | 标题 | <h1>网站标题</h1> | h1 每页只能用一次(SEO) |
| <p> | 段落 | <p>这是一个段落</p> | 会自动上下间距 |
| <a> | 链接 | <a href="https://...">文字</a> | href 属性放目标网址 |
| <img> | 图片 | <img src="cat.jpg" alt="小猫"> | 自闭合标签,alt 是替代文字 |
| <div> | 容器块 | <div>...</div> | 最常用的布局元素 |
| <span> | 行内容器 | <span style="color:red">红字</span> | 不换行,只包裹部分 |
| <ul>/<ol> | 无序/有序列表 | <ul><li>项目1</li></ul> | ul圆点,ol数字 |
| <input> | 输入框 | <input type="text"> | type 可以是 text/password/email |
| <button> | 按钮 | <button>点击我</button> | 常配合 JavaScript 使用 |
| <form> | 表单 | <form action="...">...</form> | 包裹输入框和提交按钮 |
| <table> | 表格 | <table><tr><td>数据</td></tr></table> | tr=行,td=单元格 |
| <video> | 视频 | <video src="v.mp4" controls></video> | controls 显示播放控件 |
🧩 HTML 属性
标签里可以加属性来设置额外信息。格式是 属性名="属性值":
HTML<!-- 一个完整的 HTML 标签可能长这样 -->
<a href="https://google.com" target="_blank" title="点击访问谷歌" class="link-style">
访问谷歌
</a>
<!-- 属性解释 -->
href → 链接目标地址
target="_blank" → 在新标签页打开
title → 鼠标悬停时显示的文字
class → CSS 样式类名(后面会讲)
🧱 语义化标签
早期开发都用 <div> 来分区。但 <div> 本身没含义,程序员看不懂、搜索引擎也看不懂。HTML5 提供了语义化标签:
HTML<!-- ❌ 不好的做法:全用 div -->
<div id="header">...</div>
<div id="nav">...</div>
<div id="main">...</div>
<div id="footer">...</div>
<!-- ✅ 好的做法:用语义化标签 -->
<header>...</header> <!-- 页眉/导航栏 -->
<nav>...</nav> <!-- 导航菜单 -->
<main>...</main> <!-- 主要内容区 -->
<article>...</article> <!-- 一篇文章/独立内容块 -->
<section>...</section> <!-- 一个章节 -->
<aside>...</aside> <!-- 侧边栏/附属信息 -->
<footer>...</footer> <!-- 页脚 -->
1. 代码可读性更高 → 一看就知道每个区域是干嘛的
2. 搜索引擎更喜欢 → SEO 加分
3. 辅助工具(屏幕阅读器)能更好理解 → 无障碍访问
📝 动手练习:做一个完整的个人主页
把下面的代码复制到记事本,保存为 index.html,双击用浏览器打开:
HTML<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>张三的个人主页</title>
<style>
/* CSS 写在 <style> 标签里 */
body {
font-family: 'Microsoft YaHei', sans-serif;
max-width: 800px;
margin: 0 auto;
padding: 40px 20px;
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
color: white;
}
.card {
background: rgba(255,255,255,0.15);
backdrop-filter: blur(10px);
border-radius: 16px;
padding: 30px;
margin: 20px 0;
}
h1 { font-size: 2.5rem; margin-bottom: 8px; }
.avatar {
width: 120px; height: 120px;
border-radius: 50%;
border: 4px solid white;
}
.btn {
display: inline-block;
background: white; color: #667eea;
padding: 12px 24px;
border-radius: 30px;
text-decoration: none;
font-weight: bold;
transition: transform 0.3s;
}
.btn:hover { transform: scale(1.05); }
</style>
</head>
<body>
<div class="card" style="text-align:center">
<img src="https://api.dicebear.com/7.x/avataaars/svg?seed=zhangsan"
alt="头像" class="avatar">
<h1>👋 你好,我是张三</h1>
<p>前端开发者 / 热爱编程 & 设计</p>
<a href="https://github.com" class="btn">查看我的作品 →</a>
</div>
<div class="card">
<h2>🛠️ 我的技能</h2>
<ul>
<li>HTML & CSS ⭐⭐⭐⭐⭐</li>
<li>JavaScript ⭐⭐⭐⭐</li>
<li>Python ⭐⭐⭐</li>
<li>React ⭐⭐⭐</li>
</ul>
</div>
<div class="card">
<h2>📮 联系我</h2>
<form>
<input type="text" placeholder="你的名字"
style="width:100%;padding:10px;margin:8px 0;border-radius:8px;border:none">
<input type="email" placeholder="你的邮箱"
style="width:100%;padding:10px;margin:8px 0;border-radius:8px;border:none">
<button type="submit"
style="width:100%;padding:12px;background:#764ba2;color:white;
border:none;border-radius:8px;font-size:16px;cursor:pointer">
发送消息
</button>
</form>
</div>
<script>
// JavaScript:表单提交时弹出提示
document.querySelector('form').addEventListener('submit', function(e) {
e.preventDefault();
alert('🎉 消息已发送!(虽然这只是演示)');
});
</script>
</body>
</html>
复制这段代码保存为 .html 文件,双击打开。然后在你的浏览器按 F12 → 选择不同设备尺寸(手机/平板/电脑)看看布局变化。试着改改颜色、文字、头像链接!
2.5 📋 HTML 表单 — 最常用的交互元素
表单(form)是网站收集用户信息的方式——注册、登录、搜索、留言。
HTML<form action="/api/register" method="POST">
<!-- 文本输入 -->
<label>用户名:</label>
<input type="text" name="username" placeholder="请输入用户名" required>
<!-- 邮箱输入 -->
<label>邮箱:</label>
<input type="email" name="email" placeholder="your@email.com" required>
<!-- 密码输入(显示的字符是 •) -->
<label>密码:</label>
<input type="password" name="password" placeholder="至少8位" minlength="8" required>
<!-- 单选按钮 -->
<label>性别:</label>
<input type="radio" name="gender" value="male"> 男
<input type="radio" name="gender" value="female"> 女
<!-- 下拉选择 -->
<label>城市:</label>
<select name="city">
<option value="beijing">北京</option>
<option value="shanghai">上海</option>
<option value="shenzhen">深圳</option>
</select>
<!-- 多行文本 -->
<label>自我介绍:</label>
<textarea name="bio" rows="4" placeholder="说点什么……"></textarea>
<!-- 勾选框 -->
<input type="checkbox" name="agree" required> 我已阅读并同意用户协议
<!-- 提交按钮 -->
<button type="submit">注册</button>
</form>
type="email" 会在手机上弹出带 @ 的键盘;type="number" 弹出数字键盘;type="password" 隐藏输入内容。移动端适配时用好 type 就能大幅改善用户体验。
2.6 🎬 CSS 动画入门
CSS 动画让页面"活"起来。两个核心概念:transition(过渡)和 animation(动画)。
Transition — 状态变化时平滑过渡
CSS.button {
background: blue;
color: white;
padding: 12px 24px;
border-radius: 8px;
transition: all 0.3s ease; /* 所有属性变化都在0.3秒内平滑过渡 */
}
.button:hover {
background: darkblue;
transform: scale(1.1); /* 放大1.1倍 */
box-shadow: 0 8px 24px rgba(0,0,0,0.2);
}
Animation — 自动运行的复杂动画
CSS/* 定义动画 */
@keyframes fadeInUp {
from {
opacity: 0;
transform: translateY(30px);
}
to {
opacity: 1;
transform: translateY(0);
}
}
/* 使用动画 */
.card {
animation: fadeInUp 0.6s ease forwards;
/* 名称 持续时间 缓动函数 最后停在结束位置 */
}
/* 各卡片依次出现 */
.card:nth-child(1) { animation-delay: 0.1s; }
.card:nth-child(2) { animation-delay: 0.2s; }
.card:nth-child(3) { animation-delay: 0.3s; }
2.7 🎯 常见 CSS 布局模式
水平导航栏
.nav {
display: flex;
justify-content: space-between;
align-items: center;
padding: 16px 32px;
}
.nav-links {
display: flex;
gap: 24px;
list-style: none;
}
卡片网格
.grid {
display: grid;
grid-template-columns:
repeat(auto-fill, minmax(300px, 1fr));
gap: 24px;
}
.card {
background: white;
border-radius: 12px;
padding: 24px;
box-shadow: 0 2px 8px rgba(0,0,0,0.1);
}
圣杯布局(经典三栏)
.layout {
display: grid;
grid-template-areas:
"header header header"
"nav main aside"
"footer footer footer";
grid-template-columns: 200px 1fr 200px;
min-height: 100vh;
}
居中(最常见的需求)
/* 水平垂直居中 */
.center {
display: flex;
justify-content: center;
align-items: center;
min-height: 100vh;
}
/* 或 */
.center {
position: absolute;
top: 50%; left: 50%;
transform: translate(-50%, -50%);
}
2.8 🔄 JavaScript 异步编程 — 理解 async/await
问题: JavaScript 是单线程的,但网络请求、文件读取等操作需要时间。如果不处理"等待",页面就会卡死。
类比: 你去餐厅点菜——你告诉服务员你要什么(发起请求),然后继续玩手机(做其他事),菜来了(响应返回)再吃(处理数据)。这就是"异步"。
没有 async/await 的写法(回调地狱)
❌ 老式写法——又臭又长
getUser(1, function(user) {
getPosts(user.id, function(posts) {
getComments(posts[0].id, function(comments) {
console.log(comments); // 到这一层还勉强,再深就疯了
});
});
});
用 async/await 的写法(优雅)
JavaScript✅ 现代写法——清晰明了
async function loadUserData() {
try {
const user = await getUser(1);
const posts = await getPosts(user.id);
const comments = await getComments(posts[0].id);
console.log(comments);
} catch (error) {
console.error('加载失败了:', error);
}
}
async 声明函数里有异步操作,await 等待一个 Promise 完成。
在 await 等待的时候,浏览器可以处理其他事情(比如用户点击、滚动),不会卡死。
一定要用 try/catch 包着 await,否则出错了你可能不知道。
2.9 🛠️ 用纯 JavaScript 做一个待办清单
实践是最好的学习。 下面是一个完整的待办清单应用——只用了 HTML + CSS + JS,没有框架:
HTML<!DOCTYPE html>
<html>
<head>
<title>我的待办清单</title>
<style>
* { box-sizing: border-box; margin: 0; padding: 0; }
body { font-family: sans-serif; max-width: 500px; margin: 40px auto; padding: 0 20px; }
.todo-input { display: flex; gap: 8px; margin-bottom: 20px; }
.todo-input input { flex: 1; padding: 12px; border: 2px solid #ddd; border-radius: 8px; font-size: 16px; }
.todo-input button { padding: 12px 20px; background: #4f8cff; color: white; border: none; border-radius: 8px; cursor: pointer; }
.todo-item { display: flex; align-items: center; gap: 12px; padding: 12px; border-bottom: 1px solid #eee; }
.todo-item.done span { text-decoration: line-through; color: #999; }
.delete-btn { margin-left: auto; color: red; cursor: pointer; background: none; border: none; }
</style>
</head>
<body>
<h1 style="margin-bottom:20px">📋 我的待办清单</h1>
<div class="todo-input">
<input type="text" id="newTodo" placeholder="输入新的待办事项...">
<button onclick="addTodo()">添加</button>
</div>
<div id="todoList"></div>
<script>
const todos = []; // 存储所有待办事项
function addTodo() {
const input = document.getElementById('newTodo');
const text = input.value.trim();
if (!text) return alert('请输入内容');
todos.push({ id: Date.now(), text, done: false });
input.value = '';
render();
}
function toggleTodo(id) {
const todo = todos.find(t => t.id === id);
if (todo) {
todo.done = !todo.done;
render();
}
}
function deleteTodo(id) {
const index = todos.findIndex(t => t.id === id);
if (index !== -1) {
todos.splice(index, 1);
render();
}
}
function render() {
const list = document.getElementById('todoList');
list.innerHTML = todos.map(todo => `
<div class="todo-item ${todo.done ? 'done' : ''}">
<input type="checkbox" ${todo.done ? 'checked' : ''}
onchange="toggleTodo(${todo.id})">
<span>${todo.text}</span>
<button class="delete-btn" onclick="deleteTodo(${todo.id})">✕</button>
</div>
`).join('');
// 显示统计
document.getElementById('stats').textContent =
`共 ${todos.length} 项,已完成 ${todos.filter(t => t.done).length} 项`;
}
// 支持回车键
document.getElementById('newTodo').addEventListener('keypress', function(e) {
if (e.key === 'Enter') addTodo();
});
</script>
<p id="stats" style="margin-top:16px;color:#999;font-size:14px"></p>
</body>
</html>
把这个代码保存为 .html 双击打开。你可以添加、勾选完成、删除待办事项。理解 render() 函数是怎么把数据(todos 数组)变成界面(HTML)的——这就是所有前端框架的核心思想:数据驱动视图。
2.2 🎨 CSS — 给网站"化妆"
类比: HTML 就像毛坯房——有墙壁、门、窗户(结构)。CSS 就是装修——刷什么颜色、铺什么地板、灯怎么摆、沙发放哪。
没有 CSS 的页面就是黑白的、左对齐的、没有任何样式的文字堆。加上 CSS 才能变成你看到的漂亮网站。
CSS 语法
CSS选择器 {
属性名: 属性值;
属性名: 属性值;
/* 注释:这是解释性文字 */
}
/* 例子:把所有 h1 变成蓝色并居中 */
h1 {
color: blue; /* 文字颜色 */
text-align: center; /* 水平居中 */
font-size: 32px; /* 字号 */
margin-top: 20px; /* 上方外边距 */
}
三种引入 CSS 的方式
<p style="color: red; font-weight: bold;">
这段文字是红色粗体
</p>
直接写在标签的 style 属性里。虽然方便,但代码重复多、难以维护。
<head>
<style>
p { color: blue; }
</style>
</head>
写在 HTML 的 <head> 里的 <style> 标签中。适合单个页面。
单独写一个 .css 文件,然后在 HTML 里引用:
<!-- HTML 文件里 -->
<head>
<link rel="stylesheet" href="style.css">
</head>
/* style.css 文件里 */
body {
font-family: 'Microsoft YaHei', sans-serif;
background-color: #f5f5f5;
margin: 0;
padding: 0;
}
✅ 好处:多个页面共享同一个 CSS 文件,改一处全部变。
🎯 CSS 选择器
选择器决定了"我要修改页面上的哪些元素":
CSS/* 1. 标签选择器:选择所有同种标签 */
p { color: gray; } /* 所有 <p> 段落变灰色 */
/* 2. 类选择器(最常用):选择 class="xxx" 的元素 */
.card { background: white; } /* class 包含 "card" 的 */
.highlight { color: orange; } /* 一个元素可以有多个 class */
/* 3. ID 选择器:选择 id="xxx" 的元素(id 在整个页面唯一) */
#header { height: 60px; } /* id="header" 的元素 */
/* 4. 后代选择器:选择某个元素内部的元素 */
.card p { font-size: 14px; } /* 所有 .card 里面的 <p> */
/* 5. 组合选择器:同时选中多个 */
h1, h2, h3 { font-weight: bold; } /* 所有 h1-h3 */
/* 6. 伪类:表示特殊状态 */
a:hover { color: red; } /* 鼠标悬停在链接上时 */
button:active { opacity: 0.8; } /* 按钮被点击的瞬间 */
📐 布局:Flexbox(一维布局)
Flexbox 是 CSS 中最常用的布局方式。一句话概括:告诉容器里的元素怎么排成一排或一列。
类比: 你有一排积木(子元素),你想让它们水平居中、均匀分布、垂直对齐——Flexbox 就是做这个的。
CSS.container {
display: flex; /* 开启 Flex 模式 */
flex-direction: row; /* 排列方向:row=横向(默认),column=纵向 */
justify-content: center; /* 水平对齐方式 */
align-items: center; /* 垂直对齐方式 */
gap: 16px; /* 子元素之间的间距 */
flex-wrap: wrap; /* 放不下时自动换行 */
}
/* justify-content 常用值 */
justify-content: flex-start; /* 左对齐(默认) */
justify-content: center; /* 居中 */
justify-content: space-between; /* 均匀分布,两端对齐 */
justify-content: space-around; /* 均匀分布,两端留空 */
/* align-items 常用值 */
align-items: stretch; /* 拉伸(默认) */
align-items: center; /* 垂直居中 */
align-items: flex-start; /* 顶部对齐 */
📐 布局:CSS Grid(二维布局)
Grid 适合做"网格"布局——像 Excel 表格一样的多行多列布局。
CSS.grid {
display: grid;
grid-template-columns: 1fr 1fr 1fr; /* 3列等宽 */
grid-template-columns: 200px 1fr 2fr; /* 固定200px + 剩余1份 + 剩余2份 */
grid-template-columns: repeat(3, 1fr); /* 简写:3列等宽 */
gap: 20px; /* 行列间距 */
}
/* 实例:一个商品展示网格 */
.products {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(250px, 1fr));
/* 自动填充,每列最小250px,尽量填满 */
gap: 16px;
}
📱 响应式设计
问题: 你在电脑上排版很好的网站,在手机上可能挤成一团或字太小。响应式设计就是让网站在手机、平板、电脑上都好看。
核心方法:用 @media 媒体查询
CSS/* 默认样式(手机优先) */
.grid {
display: grid;
grid-template-columns: 1fr; /* 手机上:1列 */
}
/* 当屏幕宽度 ≥ 768px(平板) */
@media (min-width: 768px) {
.grid {
grid-template-columns: 1fr 1fr; /* 平板:2列 */
}
}
/* 当屏幕宽度 ≥ 1024px(电脑) */
@media (min-width: 1024px) {
.grid {
grid-template-columns: 1fr 1fr 1fr; /* 电脑:3列 */
}
}
/* 其他响应式技巧 */
img { max-width: 100%; } /* 图片不超过容器宽度,自动缩小 */
body { font-size: 16px; } /* 不要小于这个字号,否则手机上字太小 */
1. 忘记加单位: width: 100(错)→ width: 100px(对)
2. 忘了 reset: 不同浏览器有默认样式差异。加 * { margin: 0; padding: 0; box-sizing: border-box; }
3. 优先级搞不清: !important > 行内 > id > class > 标签。尽量少用 !important。
4. float 布局过时了: 现在都用 Flexbox 和 Grid,别用 float 做布局。
2.3 ⚡ JavaScript — 让网站"活"起来
类比: HTML 是一栋楼的骨架,CSS 是装修,JavaScript 就是大楼里的电梯、感应门、智能灯光——让东西动起来、跟人交互。
JS 可以做的事情:
- 用户点击按钮 → 弹出一个对话框
- 用户滚动页面 → 导航栏变透明
- 用户填写表单 → 检查邮箱格式对不对
- 页面加载 → 从服务器获取最新数据
- 做动画、游戏、网页应用……
JS 基础语法
// let 和 const 是声明变量
let name = "张三"; // 字符串(文字)
const age = 25; // 数字(age 是常量,不能改)
let isStudent = true; // 布尔值(true/false)
let hobbies = ["读书", "编程", "跑步"]; // 数组(列表)
let person = { // 对象(键值对)
name: "张三",
age: 25
};
// 模板字符串(方便拼接文字)
console.log(`我叫${name},今年${age}岁`);
// 输出:我叫张三,今年25岁
// 函数:封装一段重复用的代码
function greet(name) {
return `你好,${name}!`;
}
// 箭头函数(更现代写法)
const greet = (name) => `你好,${name}!`;
console.log(greet("张三")); // 输出:你好,张三!
// 条件判断
let score = 85;
if (score >= 90) {
console.log("优秀");
} else if (score >= 60) {
console.log("及格");
} else {
console.log("不及格");
}
🖱️ DOM 操作 — 控制网页元素
DOM(文档对象模型)就是浏览器把 HTML 变成一棵"元素树",JS 可以通过这棵树找到、修改、删除、添加页面上的任何元素。
JavaScript// 1. 找到元素(查)
const title = document.querySelector('h1'); // 找到第一个 h1
const button = document.getElementById('myBtn');
const cards = document.querySelectorAll('.card'); // 找到所有 .card
// 2. 修改内容(改)
title.textContent = '新的标题'; // 改文字
title.innerHTML = '<span>带样式的标题</span>'; // 改HTML
// 3. 修改样式
title.style.color = '#4f8cff';
title.style.fontSize = '2rem';
title.classList.add('highlight'); // 添加 CSS 类
title.classList.remove('old'); // 移除 CSS 类
title.classList.toggle('active'); // 切换(有就删,没就加)
// 4. 创建和删除元素
const newDiv = document.createElement('div');
newDiv.textContent = '我是新来的';
document.body.appendChild(newDiv); // 添加到页面
newDiv.remove(); // 删除
// 5. 事件监听——灵魂!
button.addEventListener('click', () => {
alert('按钮被点击了!');
document.body.style.backgroundColor = '#f0f0f0';
});
🌐 fetch — 跟后端要数据
前端经常需要从后端获取数据(比如用户列表、文章内容)。fetch 是最新的方式:
JavaScript// 获取用户列表
async function loadUsers() {
try {
const response = await fetch('https://api.example.com/users');
if (!response.ok) throw new Error('网络错误');
const users = await response.json();
// 把数据显示在页面上
const list = document.getElementById('userList');
users.forEach(user => {
const item = document.createElement('li');
item.textContent = `${user.name} (${user.email})`;
list.appendChild(item);
});
} catch (error) {
console.error('加载失败:', error);
alert('数据加载失败了,请稍后重试');
}
}
loadUsers();
网络请求不是瞬间完成的(可能需要几百毫秒到几秒)。await 的意思是"等这个请求完成再往下走",async 是声明这个函数里有等待操作。
✨ 实用小例子
全选/取消全选 功能
<!-- HTML -->
<input type="checkbox" id="selectAll"> 全选
<div id="items">
<input type="checkbox" class="item"> 项目1
<input type="checkbox" class="item"> 项目2
<input type="checkbox" class="item"> 项目3
</div>
<script>
const selectAll = document.getElementById('selectAll');
const items = document.querySelectorAll('.item');
selectAll.addEventListener('change', () => {
items.forEach(item => {
item.checked = selectAll.checked;
});
});
</script>
2.4 🧩 前端框架 — 让开发更快
什么时候需要用框架? 当你的页面有大量交互、数据频繁变化、多个页面共享组件的时候,纯手写 JS 会变得非常杂乱。框架帮你把这些整理好。
类比: 建别墅可以用砖头一块块垒(纯 HTML/CSS/JS),也可以用预制板(框架)——更规范、更快、不容易塌。
| 框架 | 特点 | 学习曲线 | 生态 | 谁在用 |
|---|---|---|---|---|
| React | 组件化、虚拟 DOM、大厂首选 | ⭐⭐⭐ | 超庞大 | Facebook、Airbnb、Netflix |
| Vue | 上手简单、中文文档好、渐进式 | ⭐⭐ | 丰富 | 阿里、字节跳动 |
| Svelte | 编译型、体积小、速度快 | ⭐⭐ | 较小 | 新兴项目 |
先学好 HTML + CSS + JS 基础(至少能写一个完整的静态页面),再学 Vue(对新手最友好)或 React(就业前景最好)。不要基础没打好就冲框架。
三、后端技术 — 服务器的"大脑"
后端是你看不到的、默默处理所有逻辑的代码。用户注册、登录、发帖、下单……全靠后端支撑。
3.1 🔧 后端语言怎么选?
| 语言 | 框架 | 难度 | 适合做什么 | 推荐理由 |
|---|---|---|---|---|
| Python | Flask / FastAPI / Django | ⭐⭐ 简单 | SaaS、博客、AI、API | 语法极简,上手快,生态全 |
| Node.js | Express / Nest.js | ⭐⭐⭐ | 高并发、前后端统一 | 前端转后端无缝衔接 |
| PHP | Laravel / ThinkPHP | ⭐⭐ 简单 | 企业站、CMS | 老牌语言,WordPress 就是PHP |
| Go | Gin / Echo | ⭐⭐⭐⭐ | 高性能 API、微服务 | 性能好,编译快,部署简单 |
| Java | Spring Boot | ⭐⭐⭐⭐⭐ | 大型企业项目 | 稳定,但重 |
从 Python + Flask 开始。学 3 天就能写一个带数据库的 API。等熟练了再换成 FastAPI(性能更好,自动生成 API 文档)或 Django(功能最全,但重)。
3.2 🐍 Flask 实战教程(从零开始)
安装 Flask 并写第一个后端程序:
终端# 1. 安装 Flask
pip install flask
# 2. 新建文件 app.py,粘贴下面的代码
Pythonfrom flask import Flask, jsonify, request
# 创建 Flask 应用
app = Flask(__name__)
# 模拟数据库——用一个列表存数据
items = [
{"id": 1, "title": "学习 Flask", "done": False},
{"id": 2, "title": "搭建第一个 API", "done": False}
]
# ----- 路由(Route):URL 对应的处理函数 -----
@app.route('/')
def home():
"""首页:返回一段 HTML"""
return '<h1>🚀 我的第一个 API 服务器</h1>'
@app.route('/api/items')
def get_items():
"""GET 请求:获取所有待办事项"""
return jsonify(items)
@app.route('/api/items', methods=['POST'])
def create_item():
"""POST 请求:创建新的待办事项"""
data = request.get_json() # 获取前端发来的 JSON 数据
if not data or 'title' not in data:
return jsonify({"error": "缺少 title 字段"}), 400
new_item = {
"id": len(items) + 1,
"title": data['title'],
"done": False
}
items.append(new_item)
return jsonify(new_item), 201 # 201 = "创建成功"
# 启动服务器
if __name__ == '__main__':
app.run(debug=True, port=5000)
运行 python app.py,然后在浏览器打开 http://localhost:5000 看看效果!
HTTP 方法速查
| 方法 | 含义 | 类似 | 路由例子 |
|---|---|---|---|
| GET | 获取数据 | 问"有哪些商品?" | /api/items |
| POST | 创建数据 | 说"我要注册" | /api/items (body里传数据) |
| PUT | 更新全部数据 | 说"改头像" | /api/items/1 |
| PATCH | 更新部分数据 | 说"改个名字" | /api/items/1 |
| DELETE | 删除数据 | 说"删了这条" | /api/items/1 |
RESTful API 设计规范
前后端通信的标准方式——REST API。核心思想:把数据看作"资源",用 URL 表示资源,用 HTTP 方法表示操作。
规范✅ 好的 API 设计:
GET /api/users → 获取用户列表
GET /api/users/1 → 获取 id=1 的用户详情
POST /api/users → 创建新用户
PUT /api/users/1 → 更新 id=1 的用户
DELETE /api/users/1 → 删除 id=1 的用户
GET /api/users/1/posts → 获取 id=1 用户发的文章
❌ 坏的 API 设计:
GET /get_user_list → 动词不应该在 URL 里
POST /delete_user → 用 DELETE 方法不是 POST
GET /api/getUser?id=1 → 用路径参数不是查询参数
🔐 用户认证(JWT 入门)
用户登录后,后端怎么知道"这个请求是谁发的"?JWT(JSON Web Token)是目前最常用的方式。
流程:
用户输入用户名密码 → 前端发 POST 到 /api/login
后端验证密码正确 → 生成一个 JWT Token(一串加密字符)→ 返回给前端
前端把 Token 存起来(localStorage 或 cookie)
后续每次请求,前端都在 Header 里带上 Token
后端验证 Token 有效 → 放行请求
Python# 用 Flask 实现简单的 JWT 登录
# 安装:pip install pyjwt
import jwt
import datetime
from functools import wraps
SECRET_KEY = "这是一个密钥,应该放在环境变量里"
# 生成 Token
def create_token(user_id):
payload = {
'user_id': user_id,
'exp': datetime.datetime.utcnow() + datetime.timedelta(days=7) # 7天过期
}
return jwt.encode(payload, SECRET_KEY, algorithm='HS256')
# 验证 Token 的装饰器
def login_required(f):
@wraps(f)
def decorated(*args, **kwargs):
token = request.headers.get('Authorization')
if not token:
return jsonify({"error": "未登录"}), 401
try:
payload = jwt.decode(token, SECRET_KEY, algorithms=['HS256'])
request.user_id = payload['user_id']
except:
return jsonify({"error": "Token无效或已过期"}), 401
return f(*args, **kwargs)
return decorated
@app.route('/api/login', methods=['POST'])
def login():
"""登录接口"""
data = request.get_json()
# 验证用户名密码(实际应该查数据库)
if data['username'] == 'admin' and data['password'] == '123456':
token = create_token(1)
return jsonify({"token": token})
return jsonify({"error": "用户名或密码错误"}), 401
@app.route('/api/profile')
@login_required
def profile():
"""需要登录才能访问的接口"""
return jsonify({"user_id": request.user_id, "message": "这是你的个人资料"})
四、数据库 — 网站的"储物仓库"
数据库存所有数据——用户信息、文章、订单、评论……没有数据库,网站就没法"记住"东西。
4.1 🗃️ 关系型数据库(SQL)
类比: 关系型数据库就像 Excel 表格,一张表有行有列。一个网站可能有多个表:users(用户)、posts(文章)、comments(评论),表之间可以关联。
三大关系型数据库对比:
| SQLite | MySQL | PostgreSQL | |
|---|---|---|---|
| 安装 | 零配置,文件型 | 需安装服务 | 需安装服务 |
| 适合 | 练习/小应用/移动端 | 主流网站 | 复杂查询/大数据 |
| 性能 | 一般 | 好 | 最好 |
| 功能 | 基础 SQL | 丰富 | 最丰富(支持 JSON 等) |
| 推荐度 | ⭐⭐(练手) | ⭐⭐⭐⭐(主流) | ⭐⭐⭐⭐⭐(首选) |
学 SQL 用 SQLite(无需安装,Python 自带)。做实际项目用 PostgreSQL(功能最强)或 MySQL(国内最流行)。
📊 SQL 核心操作(增删改查)
SQL-- 1. 建表(CREATE)
CREATE TABLE users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
username TEXT NOT NULL UNIQUE, -- NOT NULL:不能为空,UNIQUE:唯一
email TEXT NOT NULL,
password_hash TEXT NOT NULL,
age INTEGER DEFAULT 0, -- 默认值
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP -- 自动填创建时间
);
-- 2. 插入数据(CREATE / INSERT)
INSERT INTO users (username, email, password_hash)
VALUES ('张三', 'zhang@email.com', 'hashed_pwd_123');
-- 3. 查询数据(READ / SELECT)⭐⭐⭐ 最常用
SELECT * FROM users; -- 查所有列所有行
SELECT username, email FROM users; -- 只查特定列
SELECT * FROM users WHERE age > 18; -- 条件筛选
SELECT * FROM users ORDER BY created_at DESC; -- 按时间降序
SELECT * FROM users LIMIT 10; -- 只查前10条
SELECT COUNT(*) FROM users; -- 统计总数
-- 4. 更新数据(UPDATE)
UPDATE users SET age = 26 WHERE id = 1; -- 改 id=1 的用户年龄
-- 5. 删除数据(DELETE)
DELETE FROM users WHERE id = 1; -- 删 id=1 的用户
-- 6. 高级:关联查询(JOIN)
SELECT posts.title, users.username
FROM posts
JOIN users ON posts.user_id = users.id; -- 把文章和作者关联起来
🐍 Python 操作 SQLite 完整示例
Pythonimport sqlite3
from datetime import datetime
# 连接数据库(文件不存在会自动创建)
conn = sqlite3.connect('blog.db')
cursor = conn.cursor()
# 建表
cursor.execute('''
CREATE TABLE IF NOT EXISTS posts (
id INTEGER PRIMARY KEY AUTOINCREMENT,
title TEXT NOT NULL,
content TEXT,
author TEXT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
)
''')
# 插入一篇新文章
cursor.execute(
'INSERT INTO posts (title, content, author) VALUES (?, ?, ?)',
('如何搭建网站', '这是一篇超详细的教程……', '张三')
)
conn.commit() # 重要:一定要 commit 才能保存
# 查询所有文章
cursor.execute('SELECT * FROM posts ORDER BY created_at DESC')
posts = cursor.fetchall()
for post in posts:
print(f'#{post[0]} {post[1]} — {post[3]} ({post[4]})')
# 查特定文章
cursor.execute('SELECT * FROM posts WHERE id = ?', (1,))
post = cursor.fetchone()
print(post)
# 更新
cursor.execute('UPDATE posts SET author = ? WHERE id = ?', ('李四', 1))
conn.commit()
# 删除
cursor.execute('DELETE FROM posts WHERE id = ?', (1,))
conn.commit()
conn.close() # 用完关闭连接
'; DROP TABLE posts; -- 会把你的表删了。用 ? 传参,SQLite 会自动转义特殊字符,非常安全。📐 数据库设计核心概念
表关系: 实际项目中,表不是孤立的。它们之间有"关系"。
一对一: 一个用户有一个详细资料。user → user_profile
一对多(最常见): 一个用户可以写多篇文章。user → posts
实现方式:posts 表里加一个 user_id 字段指向 users 表的 id。
多对多: 一篇文章可以有很多标签,一个标签可以属于多篇文章。posts ↔ tags
实现方式:建一个中间表 post_tags(post_id, tag_id)
SQL-- 一对多关系示例:用户和文章
CREATE TABLE users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
username TEXT NOT NULL,
email TEXT NOT NULL
);
CREATE TABLE posts (
id INTEGER PRIMARY KEY AUTOINCREMENT,
title TEXT NOT NULL,
content TEXT,
user_id INTEGER, -- 外键:指向 users.id
FOREIGN KEY (user_id) REFERENCES users(id)
);
-- 用 JOIN 查某用户的所有文章
SELECT posts.title, posts.created_at
FROM posts
JOIN users ON posts.user_id = users.id
WHERE users.username = '张三'
ORDER BY posts.created_at DESC;
🔑 索引 — 为什么你的查询越来越慢?
当数据量只有几十条时,查询是瞬间的。但当数据量到几万、几十万条时,如果没有索引,每次查询都要"全表扫描"(逐条查),会非常慢。
类比: 你在一本书里找"数据库"这个词——没有目录(索引)就得翻遍整本书。
SQL-- 创建索引(通常在经常查询的字段上建)
CREATE INDEX idx_posts_user_id ON posts(user_id);
CREATE INDEX idx_posts_created_at ON posts(created_at);
-- 加了索引后,WHERE user_id = 5 的查询从全表扫描变成直接定位
-- 性能提升 10-100 倍
-- 注意:索引不是越多越好
-- 索引占空间,写入数据时会变慢(因为要同时更新索引)
-- 通常在 WHERE、JOIN、ORDER BY 用的字段上建索引
🔄 数据库迁移 — 当你需要改表结构时
网站上线后,你可能需要给表加字段。但直接改表在代码里不专业——你需要迁移。
Python# 简单的迁移脚本示例
import sqlite3
conn = sqlite3.connect('blog.db')
cursor = conn.cursor()
# 检查字段是否存在
cursor.execute("PRAGMA table_info(posts)")
columns = [col[1] for col in cursor.fetchall()]
if 'views' not in columns:
print("添加 views 字段...")
cursor.execute('ALTER TABLE posts ADD COLUMN views INTEGER DEFAULT 0')
if 'published' not in columns:
print("添加 published 字段...")
cursor.execute('ALTER TABLE posts ADD COLUMN published BOOLEAN DEFAULT 0')
conn.commit()
conn.close()
print("迁移完成!")
真正项目推荐用 Alembic(Python)或 Knex.js(Node.js)这类专业迁移工具,它们能自动生成迁移脚本、记录每次变更、支持回滚。
4.2 📦 NoSQL 数据库
Redis(缓存数据库)
数据存在内存里,读写的速度是 SQL 数据库的 10-100 倍。适合存:
- 登录状态(Session)
- 热点数据(排行榜、文章阅读数)
- 消息队列
MongoDB(文档数据库)
数据像 JSON 对象一样存,结构灵活,适合:
- 日志数据
- 内容管理系统
- 物联网数据
- 结构经常变化的场景
90% 的场景用 SQL(PostgreSQL 或 MySQL)。只有 Redis 缓存和 MongoDB 特殊场景才用 NoSQL。不要为了"新"而选择 NoSQL。
五、服务器与部署 — 让全世界访问你的网站
代码写好了,怎么让别人也能访问?这一章讲怎么把你的网站"发到互联网上"。
5.1 🚀 GitHub Pages(免费部署静态站)
适合: 纯 HTML/CSS/JS 的静态网站。完全免费!
注册 GitHub.com 账号(免费)
点右上角 "+" → New repository(新仓库)
仓库名填:你的用户名.github.io(例如:zhangsan.github.io)
把你的 HTML 文件上传到仓库(点 Add file → Upload files)
访问 https://你的用户名.github.io — 你的网站已经在全球上线了!
这是最简单的上线方式。以后你每 push 一次代码,GitHub 自动更新网站。
5.2 ☁️ 云服务器部署(完整指南)
适合: 动态网站(有后端 + 数据库)。以阿里云/腾讯云的 Ubuntu 服务器为例:
第一步:买服务器
阿里云或腾讯云搜索"轻量应用服务器"或"云服务器 ECS"。新手选最低配置(2核2G ≈ 50-100元/月)完全够用。
第二步:连接服务器
终端# Windows 用 Xshell 或 PowerShell
# Mac 用终端
ssh root@你的服务器IP地址
# 输入密码后就连上了
第三步:安装环境
终端# 更新软件包列表
apt update && apt upgrade -y
# 安装 Nginx(Web 服务器)
apt install nginx -y
# 安装 Python3 + pip
apt install python3 python3-pip python3-venv -y
# 配置防火墙(只开放必要端口)
ufw allow 80 # HTTP
ufw allow 443 # HTTPS
ufw allow 22 # SSH(一定要开,否则连不上)
ufw enable # 开启防火墙
第四步:部署你的应用
终端# 创建项目目录
mkdir -p /var/www/myapp
cd /var/www/myapp
# 从 GitHub 拉取代码(先把代码 push 到 GitHub)
git clone https://github.com/你的用户名/项目名.git .
# 创建虚拟环境
python3 -m venv venv
source venv/bin/activate
# 安装依赖
pip install -r requirements.txt
# 启动应用(测试用)
python app.py
第五步:配置 Nginx 反向代理
Nginx# 创建配置文件
nano /etc/nginx/sites-available/myapp
# 写入以下内容
server {
listen 80;
server_name example.com www.example.com;
# 静态文件直接由 Nginx 提供(更快)
location /static/ {
alias /var/www/myapp/static/;
expires 30d; # 缓存30天
}
# 其他请求转发到后端应用
location / {
proxy_pass http://127.0.0.1:5000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
# 启用配置
ln -s /etc/nginx/sites-available/myapp /etc/nginx/sites-enabled/
nginx -t # 测试配置有没有错误
systemctl restart nginx
第六步:用 Supervisor 保持应用运行
终端# 安装 Supervisor
apt install supervisor -y
# 创建配置文件
nano /etc/supervisor/conf.d/myapp.conf
# 写入
[program:myapp]
command=/var/www/myapp/venv/bin/python app.py
directory=/var/www/myapp
user=root
autostart=true
autorestart=true
stderr_logfile=/var/log/myapp.err.log
stdout_logfile=/var/log/myapp.out.log
# 重载配置
supervisorctl reread
supervisorctl update
supervisorctl start myapp
# 常用命令
supervisorctl status # 查看所有进程状态
supervisorctl restart myapp # 重启应用
supervisorctl stop myapp # 停止应用
第七步:配置 SSL(免费 HTTPS)
终端# 安装 Certbot
apt install certbot python3-certbot-nginx
# 申请并自动配置 SSL 证书
certbot --nginx -d example.com -d www.example.com
# 证书会自动续期(无需手动操作)
certbot renew --dry-run # 测试续期是否正常
浏览器访问 https://example.com,你的网站就应该正常工作了!以后更新代码只需:
1. 本地修改代码 → git push
2. SSH 到服务器 → cd /var/www/myapp && git pull
3. supervisorctl restart myapp
5.3 🐳 Docker 快速入门
问题: 你在本地开发好好的,部署到服务器上就报错——可能是 Python 版本不同、系统库不一样……Docker 解决了这个问题。
Docker 怎么做: 把你的应用 + 环境打包成一个"镜像"。服务器拿到镜像直接运行,确保和本地一模一样。
Dockerfile# Dockerfile — 告诉 Docker 怎么打包你的应用
FROM python:3.11-slim # 基础镜像:官方 Python 3.11
WORKDIR /app # 容器里的工作目录
COPY requirements.txt . # 先把依赖文件复制进去
RUN pip install -r requirements.txt # 安装依赖
COPY . . # 把当前目录所有文件复制到容器
CMD ["python", "app.py"] # 启动命令
EXPOSE 5000 # 暴露端口
终端# 构建镜像
docker build -t myapp .
# 运行容器
docker run -d -p 5000:5000 --name myapp myapp
# 常用命令
docker ps # 查看运行的容器
docker logs myapp # 查看日志
docker stop myapp # 停止
docker restart myapp # 重启
5.4 🔄 CI/CD — 自动部署
不再手动 SSH 部署,让代码自动上线的流程:
- 你本地修改代码 →
git push - GitHub 收到 push 后,自动运行测试
- 测试通过后,自动把代码部署到服务器
- 你什么额外操作都不用做
用 GitHub Actions 实现自动部署:
YAML# .github/workflows/deploy.yml
name: Deploy to Server
on:
push:
branches: [main] # 当 main 分支有 push 时触发
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- name: 连接服务器并部署
uses: appleboy/ssh-action@master
with:
host: ${{ secrets.SERVER_HOST }}
username: ${{ secrets.SERVER_USER }}
key: ${{ secrets.SSH_PRIVATE_KEY }}
script: |
cd /var/www/myapp
git pull
source venv/bin/activate
pip install -r requirements.txt
supervisorctl restart myapp
六、开发工具 — 效率翻倍的武器库
工欲善其事,必先利其器。用好这些工具,开发效率能提升 3 倍以上。
6.1 📝 代码编辑器
VS Code — 目前全世界最流行的代码编辑器,免费、插件丰富、轻量快速。
下载: code.visualstudio.com → Download for Windows → 一路下一步安装
VS Code 必装插件(大幅提升效率):
| 插件名 | 作用 |
|---|---|
| Chinese (Simplified) | 中文界面 |
| Live Server | 一键启动本地服务器,保存后页面自动刷新 |
| Prettier | 保存代码时自动格式化(统一风格) |
| ES7+ React/Redux | React 代码片段快捷输入 |
| Python | Python 语法高亮、智能提示、调试 |
| GitLens | 每一行代码是谁写的、什么时候写的 |
| Material Icon Theme | 文件图标变漂亮,一眼分辨文件类型 |
| Bracket Pair Colorizer | 括号颜色配对,一眼看出哪对括号 |
VS Code 快捷键(必记):
| 快捷键 | 作用 |
|---|---|
| Ctrl + P | 快速打开文件(输入文件名搜索) |
| Ctrl + Shift + P | 打开命令面板 |
| Ctrl + ` | 打开/关闭终端 |
| Ctrl + D | 选中下一个相同的词(批量修改) |
| Alt + ↑/↓ | 上移/下移当前行 |
| Ctrl + / | 注释/取消注释 |
| Ctrl + Shift + L | 选中所有相同的词(全局批量改) |
6.2 🔀 Git + GitHub — 代码的"时间机器"
Git 是干什么的? 想象你在写论文: - 初稿.doc - 初稿_修改1.doc - 初稿_修改2.doc - 初稿_最终版.doc - 初稿_最终版_再也不改了.doc Git 就是帮你自动管理所有版本的工具!你可以随时回到任意历史版本,也能和多人同时协作开发。
GitHub 是什么? 代码的"云盘"。把你的代码上传到 GitHub,别人可以看、可以下载、可以协作。也是全世界最大的程序员社区。
Git 入门操作
终端# 第一次使用 Git 需要配置(只需一次)
git config --global user.name "你的名字"
git config --global user.email "你的邮箱@example.com"
# 最常用的命令(每天都要用)
git init # 把当前文件夹变成 Git 仓库(初始化)
git add . # 把当前所有更改加入"暂存区"
git commit -m "完成了登录功能" # 提交一次版本(打一个快照)
git log # 查看提交历史
git status # 查看当前哪些文件被改过
和 GitHub 配合使用的流程
终端# 1. 在 GitHub 上创建仓库(点 + → New Repository)
# 2. 克隆到本地
git clone https://github.com/你的用户名/仓库名.git
# 3. 日常开发流程(循环)
git pull # 先拉取最新的代码(如果多人协作)
# ... 修改代码 ...
git add . # 把所有更改加入暂存
git commit -m "XX功能完成" # 提交
git push # 推送到 GitHub
# 4. 分支操作(开发新功能时)
git branch feature-login # 创建新分支
git checkout feature-login # 切换到新分支
# ... 在新分支上修改 ...
git checkout main # 切回主分支
git merge feature-login # 把新功能合并到主分支
1. 忘了先 pull 就 push: 如果远程有别人更新的代码,你的 push 会被拒绝。先 git pull 再 push。
2. commit 信息写太模糊: "修改"、"更新"这种 commit 信息将来你看不懂。写清楚:"修复了用户头像上传时尺寸错误的bug"
3. 把密码提交到 GitHub: 永远不要把密码、API Key、数据库连接字符串写在代码里。用 .env 文件 + .gitignore 排除。
6.3 🎯 其他必备工具
帮你安装、更新、删除第三方代码库。
- npm — JavaScript/Node.js 的包管理器
- pip — Python 的包管理器
- yarn — npm 的替代,更快更稳定
# npm 常用命令
npm init -y # 初始化项目
npm install axios # 安装 axios(HTTP 库)
npm install react # 安装 React
npm run dev # 运行开发服务器
# pip 常用命令
pip install flask # 安装 Flask
pip install -r requirements.txt # 批量安装依赖
pip freeze # 查看已安装的所有包
- Chrome DevTools — 按 F12 打开。查看元素、调试 JS、看网络请求、分析性能
- Postman — API 调试工具,可以发 GET/POST 请求看后端返回什么
- SSH 客户端 — Xshell(Win 免费)或 Windows Terminal
- FileZilla — 免费 FTP 客户端,传文件到服务器
- nslookup / ping — 命令行查域名解析是否正确
七、安全基础 — 别让黑客盯上你
网站做好之后,安全问题就是头等大事。一个小漏洞可能让你损失所有用户数据。
类比: 建好一栋楼,不能没有门锁和监控。网站也一样,上线前必须做好基本的安全防护。
7.1 🔓 最常见的安全漏洞
| 漏洞 | 一句话理解 | 危害 | 怎么防 |
|---|---|---|---|
| XSS 跨站脚本 |
黑客在评论区贴了一段 <script>偷cookie</script>,其他用户浏览时被执行 |
盗取用户登录态、跳转到钓鱼网站 | 输出时把 < 转义成 <,设置 CSP 头 |
| SQL 注入 | 用户登录时在用户名输入 ' OR 1=1 --,SQL 变成 WHERE password='' OR 1=1 → 永远为真,直接登录成功 |
数据库被拖库、数据被删 | 永远用参数化查询(?),别拼字符串 |
| CSRF 跨站请求伪造 |
你在银行网站登录了,黑客让你点击一个恶意链接,自动发起转账请求 | 在用户不知情的情况下执行操作 | 加 CSRF Token(框架一般自动处理) |
| 文件上传漏洞 | 用户上传头像时,上传了一个 .php 文件,然后直接访问这个文件执行恶意代码 | 服务器被种木马 | 限制上传文件类型、检查文件内容头、不信任用户文件名 |
7.2 🛡️ 安全清单
✅ 必须做的事
- HTTPS 永远开启 — Let's Encrypt 免费证书
- 密码用 bcrypt 哈希存储,永远不存明文
- 数据库连接字符串写在 .env 文件,不写在代码里
- 用户输入必须验证和转义
- 定期更新依赖(npm update / pip upgrade)
- 配置 CORS,只允许自己的前端访问 API
- 添加请求频率限制(防止暴力破解密码)
- 每天自动备份数据库到另一台机器
❌ 绝对不要做的事
- 不要用 eval() 执行字符串代码
- 不要硬编码密码/密钥/Token 在代码里
- 不要让 .git 文件夹被公网访问
- 不要把敏感信息打印到日志里
- 不要用 root 账号跑应用(建一个低权限用户)
- 不要开放不必要的端口(仅开 80/443/22)
- 不要信任用户上传的文件名
7.3 🔐 密码存储全程示例
Python# 安装:pip install bcrypt
import bcrypt
def register_user(username, password):
"""注册:安全的密码处理"""
# 1. 把密码转成 bytes(bcrypt 需要)
password_bytes = password.encode('utf-8')
# 2. 生成盐值并哈希密码
# gensalt() 自动生成随机盐值,rounds=12 表示计算强度
hashed = bcrypt.hashpw(password_bytes, bcrypt.gensalt(rounds=12))
# 3. 存储哈希结果(不是原始密码!)
# 即使数据库被盗,黑客也还原不出密码
save_to_db(username, hashed.decode('utf-8'))
def login_user(username, password):
"""登录:验证密码"""
stored_hash = get_from_db(username) # 从数据库取出哈希
# bcrypt.checkpw 会从哈希中提取出盐值,再用盐值计算输入的密码
# 比较计算结果和存储的哈希是否一致
if bcrypt.checkpw(password.encode('utf-8'), stored_hash.encode('utf-8')):
return "登录成功"
else:
return "密码错误"
7.4 📦 .env 文件管理
.env# .env 文件 — 存放所有敏感配置(永远不要提交到 Git)
SECRET_KEY=your-super-secret-key-change-this
DATABASE_URL=postgresql://user:password@localhost:5432/mydb
EMAIL_PASSWORD=your-email-password
ALIYUN_ACCESS_KEY=your-access-key
REDIS_URL=redis://localhost:6379
# 在 Python 中读取
from dotenv import load_dotenv
import os
load_dotenv() # 加载 .env 文件
secret = os.getenv('SECRET_KEY')
db_url = os.getenv('DATABASE_URL')
终端# .gitignore 文件 — 告诉 Git 不要跟踪哪些文件
# 写在 .gitignore 里,.env 就不会被提交到 GitHub 了
.env
__pycache__/
venv/
node_modules/
*.log
八、运营与变现 — 把网站变成你的"赚钱机器"
技术只是基础。一个不会运营的网站就像一个没人逛的店。这一章讲怎么做流量、怎么赚钱。
📝 8.1 个人博客 / 内容网站
🎯 定位:选择一个你擅长且有人看的领域
成功的个人博客 = 垂直领域 × 持续输出 × 个人 IP
选领域的原则:
| ❌ 太宽泛 | ✅ 够垂直 | |
|---|---|---|
| 技术 | "编程教程" | "Python 量化交易从零到实盘" |
| 生活 | "美食博客" | "用空气炸锅做减脂餐" |
| 理财 | "理财知识" | "月薪5000的基金定投实操" |
| 学习 | "英语学习" | "程序员用Anki背单词的365天" |
1. 你有什么兴趣/特长?
2. 这个领域有人愿意付费吗?
3. 你愿意持续写 1 年以上吗?
三个答案都是"是",这个领域就对了。
🔍 SEO 关键词研究(完整教程)
关键词研究是 SEO 的第一步,也是最关键的一步。 选对了关键词,你写一篇文章可能带来 1 万流量;选错了写了一年也没人看。
步骤 1:头脑风暴
先列出你的领域里用户可能会搜的所有词。比如你做"Python 教程":
- "Python 入门"、"Python 爬虫"、"Python 数据分析"
- "Python 安装"、"Python 教程 2025"、"Python 小白"
- "Python 和 Java 哪个好"、"Python 能做什么"
步骤 2:用工具验证搜索量
| 工具 | 价格 | 说明 |
|---|---|---|
| 百度关键词规划师 | 免费 | 百度官方工具,需要百度推广账号 |
| 5118.com | 免费版有限 | 国内 SEO 工具,有长尾词挖掘 |
| 站长工具 | 免费 | 查关键词排名、百度收录情况 |
| Google Keyword Planner | 免费 | Google 官方,需要 Google Ads 账号 |
| Ahrefs / Semrush | 付费 $99/月起 | 专业工具,数据最全,新手可以先不买 |
步骤 3:分析搜索意图
同样搜"Python"的人可能想要的东西完全不同:
- 搜"Python 安装教程" → 信息型意图 → 写详细安装指南
- 搜"Python 下载" → 导航型意图 → 给下载链接
- 搜"Python 培训班" → 商业型意图 → 推荐课程(可以赚佣金)
- 搜"Python 爬取淘宝数据" → 交易型意图 → 可能愿意付费购买代码
写文章之前想清楚用户想要什么。信息型文章和商业型文章的写法完全不同。
步骤 4:评估竞争难度
在搜索引擎里搜你的目标关键词,看搜索结果:
- 首页全是大型网站(知乎/百度百科/CSDN) → 竞争激烈,不太建议硬碰
- 首页有个人博客 → 可以竞争
- 首页内容质量一般 → 你的机会来了!写一篇更好的就能排上去
步骤 5:长尾关键词策略
核心规律: 搜索量越大的词竞争越激烈。
"Python 教程" 月搜索量 10万+,竞争极为激烈
"Python 爬取京东商品价格" 月搜索量 200,竞争很小
但 100 个长尾词的总流量加起来可能超过 1 个大词!
策略: 先做 50-100 个长尾词,每个都写一篇高质量文章。当你的网站有 100 篇优质文章后,搜索引擎会认为你的网站"在这个领域有权威",大词的排名也会慢慢上来。
先做长尾词,再做核心词。 比如你是美食博客——先写 50 篇"空气炸锅做XX"(长尾),等网站权重上来了再写"空气炸锅食谱"(核心词)。
📧 邮件列表 — 你最有价值的资产
社交媒体平台可以封你的号,搜索引擎可以降你的权。但邮件列表(Email List)是你的私域资产,谁也拿不走。
一个订阅者的终身价值可能高达几百甚至几千元。
怎么做邮件营销?
选工具: Mailchimp(免费版有 2000 订阅者)、SendGrid、国内的"邮件群发"服务。最简单的是用 Revue(Twitter 出品)或 Substack。
做诱饵(Lead Magnet): 如果只是"订阅我的博客",没多少人会填邮箱。你需要一个诱饵——比如"免费 Python 爬虫教程 PDF"、"30 天减脂食谱"。
放订阅表单: 在你的博客侧边栏、文章末尾、首页都放上订阅框。工具帮你生成嵌入代码。
写邮件: 每周发 1-2 次。不要只发广告!70% 干货内容 + 30% 推广。让订阅者期待你的邮件。
1. 邮件里推你的付费产品(课程/电子书/工具)
2. 邮件里放联盟营销链接
3. 邮件赞助——订阅者多了,品牌付费在你的邮件里推广
4. 推你的付费 Newsletter——有的 Newsletter 年费 $50-100
📊 数据分析 — 用数据做决策
网站上线后立即安装统计代码! 没有数据,你就是在盲打。
推荐的工具
| 工具 | 价格 | 特点 |
|---|---|---|
| 百度统计 | 免费 | 国内最常用,实时访客、来源、搜索词、热力图 |
| Google Analytics | 免费 | 全球最强大,但国内可能访问慢 |
| Plausible | 付费(约 $10/月) | 轻量、隐私友好、不装 cookie 横幅 |
| Umami | 自建免费 | 开源自部署,数据在自己服务器 |
每天应该看什么数据?
| 指标 | 怎么看 | 好坏判断 |
|---|---|---|
| 访客数 (UV) | 后台直接看 | 持续增长 = 健康 |
| 流量来源 | 直接/搜索/社交/外链 | SEO 来源占比 > 50% = 健康 |
| 跳出率 | 进来就走的人占比 | < 40% 优秀,40-60% 正常,> 70% 有问题 |
| 平均停留时长 | 用户在网站上待多久 | > 2 分钟 = 内容吸引人 |
| 热门页面 | 哪些页面浏览量最高 | 找到受欢迎的,写更多类似内容 |
| 落地页 | 用户第一眼看到的页面 | 如果跳出率高,说明页面没留住人 |
1. 页面加载太慢 → 压缩图片 + CDN + 缓存
2. 内容不匹配用户预期 → 标题不要标题党,内容要跟标题一致
3. 移动端体验不好 → 检查手机端显示是否正常
4. 没有引导 → 页面末尾加"相关文章"、"推荐阅读"、"立即订阅"
5. 广告太多 → 减少广告数量,提高相关性
📱 内容分发矩阵
不要只等搜索引擎。把你的内容铺到所有用户可能看到的地方:
🇨🇳 国内平台
- 知乎 — 长文专业内容,适合深入讲解
- CSDN / 掘金 — 技术文章一定要发
- 公众号 — 积累私域粉丝(最值钱)
- 小红书 — 图文教程引流
- B站 — 把文字教程做成视频
- 抖音 / 视频号 — 短视频引流
🌍 国外平台
- Medium — 英文技术文章
- Dev.to — 开发者社区
- Hacker News — 发布优质文章可达几十万流量
- YouTube — 视频教程
- Twitter/X — 日常分享
- LinkedIn — 专业内容长文
🔄 自动化策略
一次创作,多平台分发:
- 先在自己的博客发原文(SEO 权重最高)
- 复制到知乎/CSDN/掘金(标注原文链接)
- 用 Hashnode 或 Dev.to API 自动同步
- AI 帮你把文章转成短视频脚本
- 把精华内容做成 Twitter 线程
💰 博客变现路径
🏢 8.2 企业官网运营
企业官网的目标不是"展示",而是"获客"。一个好的官网就是一个 24 小时在线的销售员。
企业官网必备页面(逐页解析):
| 页面 | 核心内容 | 转化目标 |
|---|---|---|
| 首页 | 5秒内说清:你是谁 + 做什么 + 凭什么选你 + 下一步做什么 | 让用户点击"立即咨询" |
| 产品/服务 | 详细功能、价格、与竞品的区别 | 让用户觉得"就是它了" |
| 案例/作品 | 真实客户案例 + 数据(帮客户提升了XX%的业绩) | 建立信任 |
| 关于我们 | 公司故事 + 团队照片 + 资质证书 + 媒体报道 | 让用户感觉"这家公司靠谱" |
| 博客/资讯 | 行业知识、解决方案、客户故事 | SEO 获取搜索流量 |
| 联系我们 | 电话 + 微信二维码 + 表单 + 地址 + 地图 | 产生销售线索 |
| FAQ | 整理客户最常问的 10-20 个问题 | 打消疑虑,促进转化 |
1. 在 Google/Baidu 投竞价广告(SEM)— 按点击付费,立即见效
2. SEO 优化行业关键词 — 免费但慢,长期积累
3. 微信生态 — 公众号推文 + 朋友圈广告 + 企业微信
4. 行业论坛/社区 — 专业回答 + 签名档链接
5. 客户转介绍 — 给老客户返佣
6. 内容营销 — 输出行业报告、白皮书换取客户联系信息
🛒 8.3 电商运营
搭建电商的三种方式
| 方式 | 月费 | 优点 | 缺点 |
|---|---|---|---|
| 第三方平台 淘宝/京东/拼多多 | 保证金 + 佣金 | 自带海量流量、信用体系完善、用户信任度高 | 抽成高(5-20%)、数据受限、竞争激烈 |
| SaaS 建站 Shopify/有赞 | ≈ 29-299 美元/月 | 快速搭建、模板漂亮、管理后台完善 | 有月费、定制受限、需要自己引流 |
| 自建电商 WooCommerce/ECShop | 服务器费用 | 完全控制、无抽成、数据属于自己 | 需要技术、安全自己负责 |
电商核心指标(每天要看)
| 指标 | 含义 | 怎么算 | 健康值 |
|---|---|---|---|
| UV | 每日独立访客 | 直接看后台 | 持续增长 |
| 转化率 | 100个访客里几个人下单 | 订单数 ÷ 访客数 × 100% | 2-5%(好店 > 10%) |
| 客单价 | 每个订单平均多少钱 | 销售额 ÷ 订单数 | 越高越好 |
| 复购率 | 买过的用户里多少人再买 | 老客订单 ÷ 总订单 | > 20% 优秀 |
| 毛利率 | 卖100块钱赚多少 | (售价-成本) ÷ 售价 | > 30% |
电商推广渠道
付费推广(见效快)
- 淘宝直通车 / 京东快车
- 抖音千川 / 小红书聚光
- Google Shopping Ads
- Facebook / Instagram 广告
免费推广(积累期)
- SEO 优化商品标题和详情页
- 小红书种草笔记
- 抖音短视频 + 直播
- 微信群 + 朋友圈私域
- 拼团 / 砍价 / 分享有礼
第一步: 先在淘宝或拼多多开店(零成本试水)
第二步: 找 1-2 款有竞争力的产品(1688 货源或自己做的虚拟产品)
第三步: 优化主图和标题,先出 10-30 单积累基础评价
第四步: 分析数据,找到最赚钱的那款产品放大投入
第五步: 有稳定利润后再做独立站(Shopify 或自建)
☁️ 8.4 SaaS 工具运营
SaaS(Software as a Service)就是你写一个 Web 工具,别人按月付费使用。这是互联网上最赚钱的商业模式之一。Notion、Slack、Canva、Figma 都是 SaaS。
做一个 SaaS 的完整步骤
发现痛点: 你或你身边的人在做什么重复劳动?手动处理 Excel?管理客户信息很混乱?这就是你的机会。最好的 SaaS 都解决创始人亲身体验过的痛点。
验证需求: 先别写代码!去目标用户群问。建一个简单的落地页,写上你的产品描述和一个"立即预约"按钮。如果有人点击,说明有需求。或者直接去目标用户群里问:"如果有一个工具能帮你做 XX,你愿意每月付 50 元吗?" 至少 10 个人说愿意再动手。
做 MVP(最小可行产品): 只做核心功能,能解决 80% 的问题就行。别追求完美。用 Flask/Next.js 2-4 周就能做出 MVP。
定价策略: 常见的有三种:免费版(基本功能,引流)→ 专业版(核心功能,$9-29/月)→ 企业版(高级功能 + 专属服务,$99-299/月)。
记住: 价格定低了很难涨。定一个你觉得"有点贵"的价格,然后再加一个更贵的选项。
获取第一批用户: 手动私聊 50 个潜在用户 → Product Hunt 发布 → 社交媒体分享 → 写使用教程 → 发到相关社区(Reddit / 知乎 / 掘金)。第一批用户不在乎产品是否完美,他们在乎你是否在解决他们的问题。
收集反馈迭代: 用户说什么功能最需要?什么 UI 看不懂?什么 bug 最烦?每周和 3-5 个用户聊。最好的产品是用户和你一起打磨出来的。
规模化: 付费用户 > 100 后,开始投广告 + 内容营销 + 分佣计划。考虑招人(客服 / 销售 / 工程师)。
SaaS 技术栈推荐
技术栈前端: React + Next.js + Tailwind CSS
后端: Python/FastAPI 或 Node.js/Express
数据库: PostgreSQL(首选)或 MySQL
缓存: Redis
部署: Vercel(前端)+ Railway / Render(后端)
支付: Stripe / LemonSqueezy
邮件: Resend / SendGrid
监控: Sentry(错误追踪)+ Plausible(分析)
认证: Clerk / NextAuth / Supabase Auth
SaaS 运营的一天
九、网站赚钱的 10 种模式(每一种都讲透)
一个网站可以有多种收入来源。组合拳远远好过单一模式。
核心原则: 流量 × 转化率 × 客单价 = 收入。三要素任何一个提升 20%,总收入提升 73%。优化任何一个都有效。
如何做: 加入 Google AdSense 或百度联盟,在你的网站放广告位,按展示或点击计费。
收入水平: 日 IP 1000 → 月 ≈ 100-500 元;日 IP 10000 → 月 ≈ 2000-10000 元
关键: 需要有流量。广告收入与内容质量成正比。
如何做: 在文章中推荐相关产品(如"我用的这个麦克风很好"),附上你的专属链接。读者点击购买,你获得 5-30% 佣金。
平台: 淘宝客 / 京东联盟 / Amazon Affiliate / ShareASale
关键: 推荐的产品必须真实好用,不要为了佣金推荐垃圾货,会消耗读者的信任。
定价模式:
- 免费版(基本功能)→ 引流
- 专业版 ¥29-99/月(高级功能 / 去广告 / 更多配额)
- 年度版(买 10 送 2 → 鼓励年付)
关键: 免费版要给足够价值让人愿意一直来,付费版要有足够的"忍不了"的功能。
实物: 从 1688 进货 → 加价卖出(利润 20-50%)
虚拟产品: 卖课程 / 电子书 / 模板 / 设计素材 / 软件(利润 90%+)
服务: 建站服务 / 设计服务 / 咨询服务
关键: 虚拟产品利润率最高,没有库存物流压力,一次制作可卖无限次。
形式: 在线录播课(¥99-499)→ 直播训练营(¥1999-4999)→ 一对一咨询(¥500-2000/小时)
关键: 你不需要成为世界级专家。你只需要比你的目标用户多懂 20%。教的就是最好的学。
收入天花板最高的模式。 一个用户每月付 $10-50,如果有 1000 个用户,月收入就是 $10000-50000。
关键: 找到一个小而痛的点,做得比大厂好 10 倍。不用跟 Notion 正面竞争,但可以做一个"专门给小红书博主用的数据分析工具"。
条件: 你的博客/YouTube/Newsletter 有一定粉丝量和影响力后,品牌会主动找你付费推广。
收入: 一篇赞助文 ¥1000-50000 元(取决于你的领域和影响力)
关键: 只接你认可的产品的赞助。粉丝的信任值很多钱。
形式: 行业数据报告(你的网站积累的匿名数据)→ API 接口收费调用 → 数据分析服务
例子: 一个"跨境电商价格监测"网站可以卖 API 给卖家;一个"行业招聘数据"站可以卖年度报告给 HR 部门。
收入阶梯:
简单企业站(1 页静态)→ ¥1000-3000
动态官网 + 后台管理 → ¥5000-15000
定制系统(API+多角色+支付)→ ¥20000-50000+
获客渠道: 熟人介绍 / 朋友圈 / 淘宝服务 / 猪八戒网 / 自己的博客引流
做法: 把网站做到有一定流量和收入 → 在 Flippa / 微天使 / 电鸭等平台出售
估值: 一般按月收入的 24-36 倍。月收入 ¥5000 的网站可以卖 ¥12-18 万。
关键: 就像"种一棵树然后卖树",需要耐心和运营能力。
📊 收入模式对新手友好度排行
| 排名 | 模式 | 启动难度 | 收入潜力 | 持续性 | 适合新手? |
|---|---|---|---|---|---|
| 🥇 | 联盟营销 | ⭐ | ⭐⭐⭐ | ⭐⭐⭐ | ✅ 强烈推荐 |
| 🥇 | 建站服务 | ⭐⭐ | ⭐⭐⭐ | ⭐⭐ | ✅ 来钱快 |
| 🥉 | 知识付费 | ⭐⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐⭐ | ✅ 有专业度即可 |
| 4 | SaaS | ⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ⚠️ 需要技术+运营 |
| 5 | 广告 | ⭐⭐ | ⭐⭐⭐ | ⭐⭐⭐⭐ | ⚠️ 需要流量 |
第一阶段(0-6 月): 建个人博客(学习+积累内容) + 联盟营销(赚第一笔钱) + 偶尔接建站单(练习+赚钱)
第二阶段(6-18 月): 博客有流量 → 加广告 + 推付费课程/电子书
第三阶段(18 月+): 做自己的 SaaS 工具 → 订阅制被动收入
十、完整学习路线 — 照着学就对了
从零基础到独立赚钱,按这个路线一步步走,不绕路。
📚 推荐学习资源
🇨🇳 中文资源
- MDN 中文文档 — 最权威的 Web 技术参考
- 菜鸟教程 (runoob.com) — 快速上手语法
- 阮一峰的网络日志 — 深入浅出的技术博客
- B站 up主 — 黑马程序员 / 尚硅谷 / 技术胖
- 掘金 (juejin.cn) — 技术社区,文章质量高
- Oschina (开源中国) — 国内开源技术资讯
🌐 英文资源(质量更高)
- freeCodeCamp — 免费互动式编程课程,完成有证书
- The Odin Project — 全栈学习路径,项目驱动
- roadmap.sh — 可视化学习路线图(强烈推荐)
- YouTube 频道 — Fireship / Traversy Media / Web Dev Simplified
- MDN Web Docs — 官方 Web 标准文档(比中文版更新更快)
🎯 给新手的 10 条黄金建议
- 🚀 先做,别等学完。 学了 3 天 HTML 就写第一个页面。边做边查,效率比看完书再动手高 10 倍。
- 🔨 项目驱动学习。 想学什么?定一个目标——"做个个人博客"或"记账工具"。然后学做这个东西需要的技术。目标是灯塔,技术是工具。
- 🐛 报错不可怕,怕的是不动。 每个程序员 90% 的时间在 Debug。看到报错第一反应不是慌,是把错误信息复制到搜索引擎或 AI,仔细读。
- 📝 教是最好的学。 学到一个新知识就写一篇文章或笔记。你能教给别人,说明你是真的懂了。
- 🤖 善用 AI 辅助。 让 AI 帮你:查语法、解释报错、写代码框架、优化性能。但一定要自己理解每一行代码——AI 会犯错,你要能发现。
- 🧩 不要跟别人比。 编程天赋差异不大,差别在于坚持。每天 1 小时,一年后你会超过 90% 的人。
- 🌱 从模仿开始。 找个你喜欢的网站,照着做一遍。不是抄袭,是理解"别人为什么这么设计"。
- 📊 关注数据。 网站上线后装统计代码(百度统计 / Google Analytics),看用户从哪来、看什么、在哪离开。数据告诉你应该做什么。
- 💬 加入社区。 不要自学。加入技术社群(GitHub / 掘金 / Discord / 微信),有人交流进步快很多。
- 💰 赚钱不是目的,是结果。 专注于解决真实问题、创造价值。钱会自然跟着来。帮别人解决了一个问题就收一份钱,解决了 100 个人的问题就收 100 份钱。
打开记事本,创建一个 index.html,写进以下代码:
<!DOCTYPE html>
<html>
<head><title>我的网站</title></head>
<body>
<h1>我的第一个网站!</h1>
<p>我开始了这段旅程。</p>
</body>
</html>
双击用浏览器打开 ✨
你已经在路上了。恭喜你迈出了第一步!