外观
先看这里:写给前端开发者
字数
1132 字
预计阅读
5 分钟
如果你一直写 Vue,没怎么写过后端,这一栏就是为你准备的。
好消息是:你已经会的东西比你想象的多。 这个项目的后端也是 TypeScript,写法和你熟悉的 Vue 项目有很多相似的地方。真正需要新学的,主要是几个后端特有的概念,而不是一门新语言。
后端到底在做什么
前端负责"展示和交互",后端负责"守规矩和存数据"。
举个例子,用户在页面上点了"删除岗位":
| 前端做的事 | 后端做的事 |
|---|---|
| 弹出确认框 | 检查:你登录了吗? |
发请求 DELETE /api/iam/positions/3 | 检查:你有 iam.position.remove 权限吗? |
| 等待返回,显示"删除成功" | 检查:这条岗位在你能管的数据范围里吗? |
| 刷新列表 | 检查:还有用户在用这个岗位吗?在用就不能删 |
| 真正删除(写数据库),记一条操作日志 |
最重要的一点:前端的所有检查都可以被绕过。 任何人都可以打开浏览器开发者工具,或者用 curl 直接调用接口。所以前端隐藏按钮只是为了界面友好,真正的安全必须由后端保证。写后端时要一直记住这句话:不要相信任何从前端传来的东西。
用前端的概念来理解后端
| 后端概念 | 相当于前端的…… | 在本项目里 |
|---|---|---|
| 控制器 Controller | 路由表:哪个地址由哪个函数处理 | position.controller.ts |
| 服务 Service | 组合式函数 / Pinia store:真正的业务逻辑 | position.service.ts |
| 模块 Module | app.use(plugin):把一组功能注册进应用 | position.module.ts |
| 依赖注入 DI | provide / inject | 构造函数参数 |
装饰器 @Get() | 类似 defineProps 这种编译时声明 | 到处都有 |
| 守卫 Guard | 路由守卫 router.beforeEach | 登录检查、权限检查 |
| 拦截器 Interceptor | axios 拦截器 | 包装返回格式、记操作日志 |
| 管道 Pipe | 表单校验 | 用 zod 校验请求参数 |
| 实体 Entity | TypeScript 类型,但它对应一张数据库表 | position.entity.ts |
| 迁移 Migration | 数据库结构的"git 提交记录" | db/migrations/ |
| Redis | 服务端的 localStorage,但更快、可以设过期时间 | 登录令牌、缓存 |
学习路线
建议按这个顺序阅读:
- 一个请求的一生:跟着一次"查询岗位列表"的请求,从浏览器一路走到数据库再回来。先有整体印象,再学细节。
- NestJS 基础:控制器、服务、模块、依赖注入、装饰器。
- 数据库基础:表、SQL、索引、事务、迁移。这是前端最陌生、也最重要的部分。
- Redis 是做什么的
- 登录是怎么回事:令牌、cookie、为什么令牌不能放在
localStorage里。 - 手把手:加一个自定义操作:从后端到前端,完整做一个功能。
- 写测试 和 排查问题
好消息:大部分代码不需要你写
标准的增删改查,代码生成器会帮你生成前后端的全部代码,包括权限、校验、操作日志和测试。你要写的通常只是:
- 特殊的业务规则(比如"已停用的客户不能升级");
- 自定义操作(比如"审核"、"发货");
- 复杂的查询(比如关联几张表做统计)。
这几种情况在后面的教程里都有例子。
几条最重要的规矩
先记住这几条,后面的章节会解释为什么:
- 不相信前端:权限、数据范围、参数格式,后端都要重新检查一遍。
- 改表结构只能通过迁移,不能手动在数据库里改。
- 写 SQL 只能用参数,不能把用户输入拼接进 SQL 字符串。
- 修改多张表时要放在一个事务里:要么全部成功,要么全部失败。
- 不在代码里写中文,所有文字都通过翻译键输出。