Author: 卢珑文
Email: lulongwen@live.com
Wechat: 18915972355
Website: www.lulongwen.com
Github: www.github.com/lulongwen
KOA-CMS 前后端分离的 Content Management System
独立完成一个项目,自己完整的开发一个前后端项目
- nodejs + npm + Koa + ES9 + Babel + Typescript + JWT
- mysql + navicat + RestFul API
- 微信开发者工具 + PostMan + nodemon + pm2
- nodemon 检测文件变化,自动重启 node服务
- cross-env 设置环境变量,兼容 mac,linux,win10
- 系统设计,分层思路,接口设计思路
- 渐进式开发,在已有功能上开发新功能,不是一步到位
- 设计,抽离,分层
- 如何设计 server 端架构,API 和路由,数据模型设计
- 模板路由和 API设计
- 服务器部署
npm i axios lodash npm-check require-directory validator sequelize
npm i basic-auth jsonwebtoken mysql2 bcryptjs
npm i koa-router koa-static koa-bodyparser
环境变量
process.env.NODE_ENV
-
validator 参数校验
- 每个请求都有一个唯一的 validator
- Validator中间件来构建验证层
-
全局异常处理中间件
- http错误状态码
-
路由自动注册
require-directory
- 路由按照主题拆分;主题划分是渐进式,先找出核心主题
app.js入口
导入子模块;子模块不应该调用入口文件;分层次,上层调用下层
-
Sequelize & Mysql
- 服务端开发你是绕不过 mysql的
-
Web分层结构
- model service logic
-
RestFul
- web开发不考虑状态
- 权限中间件
- 身份验证 httpbasicAuth
- bcryptjs 密码加密
- XSS
- 真正的权限控制还是服务端,前端只是辅助展示
- 全局异常捕获
- express内置异常处理
- 自定义异常处理
- 专门的 404异常处理 NotFound
throw new Error('自定义异常')
app.use(notFound)
app.use(errorGlobal)
- GET
- POST
https://code.aliyun.com/groups/longwen-blog
查看本地公钥
cd ~/.ssh
ls
# 如果已经存在 id_rsa.pub 就直接打开该文件,获取到公钥
subl id_rsa.pub
# 创建公钥
ssh-keygen -t rsa -C "你的邮箱"
- 开闭原则:对修改关闭,对扩展开放
- 循环引用 bug,死循环;分层次,上层调用下层
app CMS系统代码
src 业务代码
- CMS规范
- 配置 权限管理
- 行为日志
- 校验器
- 令牌
- 单元测试
中间件,就是可插拔的功能函数
中间件是个函数,完整的结构有:err, req, res, next -> function
- 异常
- 处理一下业务功能,然后转交控制权 next
- 响应请求,结束响应,当做路由的处理函数,例如参数的验证
- app 级别中间件,注册时,一定在最顶级使用
- router级别中间件
- 全局异常处理
- koa-router
- koa-views,渲染 ejs模板
- koa-static,静态文件服务
- koa-json,解析请求中的 json对象
- koa-bodyparser,解析 post请求的数据
- koa-logger,格式化日志
- koa-redis,连接 redis
- koa-generic-session,生成session
- koa-convert
- 思考各个插件的实现原理?
- login-check,检测 api请求的登录状态
- login-redirect,检测请求中的登录状态
- validator,post请求数据的 json schema验证
- 目录结构
- 全局错误处理
- 代码风格
- 质量保证
- 安全
- 线上环境
- 渐进式,在已有功能上开发新功能,不要一步到位
- 先设计,再开发,开发过程中,反复回顾设计,优化设计方案
- 系统设计,分层思路,接口设计思路,数据建模思路
-
CMS是前后端一体化的解决方案;是一个系统不可或缺的组成部分
- 开发大多数都是操作和管理数据,然后展示界面,拒绝重复劳动,框架解决
- 技术的积累和进阶,拒绝搬砖
-
移动端主要浏览和展示数据,web端录入和管理数据,生产数据
- 移动端数据录入的难度很大,需要放到 web端来做
- web生产数据,多端展示数据
-
PHP CMS
基于模板渲染的架构,不能适应前后端分离- 服务端模板语言生成,增加开发的复杂度和学习成本
- 技术的边界和范围
-
SPA适合做中后台管理系统开发,不需要 SEO
- SEO需要 SSR服务端渲染
- SPA开发 CMS 用户体验好
-
如何做好一个产品
- 商业性的项目才能驱动进步;做出有人用的产品,做出高质量的成品项目
- 选择小而美的公司,技术的提升,必须有复杂的业务驱动
- 以解决问题为目标,懂得取舍,卖东西都说自己的好
- 服务稳定性
- 单个客户端可以意外挂掉,但服务端不能
- 不可用时长
- pm2 进程守候,服务挂掉,自动重启
- 考虑内存和 CPU,优化和扩展
- server端要承载很多请求,CPU和内存都是稀缺资源
- stream写日志,redis存 session,优化CPU
- 日志记录
- 记录日志,存储日志,分析日志
- 安全
- server端可能遭受各种恶意攻击和误操作
- 集群和服务拆分
- 扩展机器和服务拆分来承载大流量
- 编程语言从来不是问题,重要的是开发思维
- 开发人员,总是受限于工作职位和思维
- 接受即成的事实
- 我并不认为我的能力和编程水平,学习能力比大厂的人差在哪里
- 我还能做很多事情,未来有很大的进步空间
- 能力不断提升,更多的职责,与人沟通做管理,亲自动手和实践
- 综合素质:交流,管理,认知,学习,任务规划
- 培养一个兴趣:摄影,写作,画画
- 前后端分离缺点:削弱了技能的进阶,扼杀了成长,必须要进阶服务端
- 掌握服务端,统领全局
- 拒绝原地打转,玩溜一个技术栈,比如 vue
- 好的代码利于维护,提高编程效率
- 自我解决问题,寻找答案的思考过程
- 你需要用尽可能简练的文字来描述项目的背景
- 你在项目中承担的角色、参与项目的时长
- 你用到的技术,以及你在项目中亮点等信息
- 善于归纳,一针见血地发现问题或把一个问题说清楚