在实际业务开发中,会遇到这样一种需求,使用VUE的页面须要支持SEO,同时对首屏有指标性要求,目前市面上广泛使用的是Nuxt.js解决方案,在引入的同时还须要考虑与现有的全栈工程结合,本系列文章探讨的是此类全栈工程的解决方案,同时使用的是TypeScript应用于先后端编程,文章中介绍的工程与技术要点源码已上传至Github,有须要的朋友可自行下载:
Nuxt.js和Nest.js同构工程html
复制代码
文章意在抛砖引玉,先后端使用同一种语言TypeScript编写,示例已包含基本接口请求,数据库链接应用,公用模块封装等实际开发中使用到的内容。前端
TypeScript全栈工程实战-(Nuxt. js & Nest. js) - 2、《框架融合》git
TypeScript全栈工程实战-(Nuxt. js & Nest. js) - 3、《配置服务》github
TypeScript全栈工程实战-(Nuxt. js & Nest. js) - 4、《UI系统》mongodb
TypeScript全栈工程实战-(Nuxt. js & Nest. js) - 5、《API服务设计》数据库
TypeScript全栈工程实战-(Nuxt. js & Nest. js) - 6、《SEO功能实现》编程
TypeScript全栈工程实战-(Nuxt. js & Nest. js) - 7、《Vuex使用》后端
TypeScript全栈工程实战-(Nuxt. js & Nest. js) - 8、《接入Mongo DB服务》缓存
TypeScript全栈工程实战-(Nuxt. js & Nest. js) - 9、《TypeScript》安全
TypeScript全栈工程实战-(Nuxt. js & Nest. js) - 10、《工程化部署》
创建本地MongoDB服务
参考官网安装配置 Install MongoDB ,注意设置的帐号和密码,最终在 Robo 3T 可视化管理工具 中显示效果以下:
在本示例中,分别建立了 购物车、产品、用户等文结构。
独立配置
前文提到,本示例使用了先后端一体化配置,但特例状况是,对于数据库等敏感配置内容,不适合先后端共用,因此在本示例中,须要将其单独抽离。
创建链接
Nest.js使用MongoDB,默认集成Mongoose, 在使用时经过import的方式引入。 以示例中的本地模块为例:
1.创建LocalModule,LocalModule再导入DataBaseModule
交互:
在首页中,绑定数据库中用户拥有的购物车产品数量,当点击【个人购物车】时,跳转至【购物车】页面,用户点击+或者-进行购物车物品数量增减操做,同时借助Vuex系统,进行多页面状态共享,最后更新至数据库中的【isomorphism.carts】文档中的num字段中进行数据持久化。
文档设计
本示例中,从上图效果图来看用户首页显示当前购物车数量,点击进入可修改购物车数量。抽象成数据库表现为:
须要有一个文档,用于存放用户信息。
须要有一个文档,用于存放用户购物车信息,购物车信息由用户,用户存放的物品ID,每一个物品在购物车中的数量构成。
须要有一个文档,用于存放商品原始SKU信息。
交互形式为:
用户界面中操做购物车数量,依据用户ID和产品ID将更新结果存放于存放用户购物车数量信息的文档中。
控制器实现
这里以更新购物车为例,截取部份代码片段,基础思路是使用POST接口,接收前端传入参数,再传入SERVICE服务层,同时接口层对传入和返回处理做统一的封装。
1.定义接口:
使用@Post('xxx')定义访问接口,Post为RESTful关键方法之一。@Body()获取传入参数。
AddCartsDto
,那么框架层面将会对参数进行完整性校验,即按类型定义的内容,传少参数将会有接口错误信息抛出。
code
, message
, success
用于标识接口状态码,成功或失败字符串描述,接口成功与否状态。
Controller
子类继承自父类,这样子便拥用返回结构的两种方法,进行代码复用。
4.服务实现
在服务层,一样遵循与Controller
相同的机制,这里基础的增删改查,若是不是因特殊需求,是能够概括封装在父类实现的。
遵循Mongoose调用,在构造体中加入注册用到的文档Model结构:
Model结构须要在Provider中创建联接。
Schema结构。
这里的collection
创建与实体文档isomorphism.cats
的链接。
5.自定义功能实现
以依据ID获取已添加入购物车的列表数据项
为例,model负责实际的MongoDB语句操做,整个过程都是异步的,因此须要使用async
服务端完成相关功能后,客户端则须要创建相关的单独服务类调用来承接该功能,例如本示例中的LocalService
:
登陆功能
以上实现的是业务当中功能实现,在现实中,每每须要加上权限验证功能。这里做了一下简单示例实现。即
1.用户登陆,存取TOKEN
2.每次请求时头部带上TOKEN信息
3.服务端进行合法性校验。
固然,与JAVA服务端等交互时可能会引入JWT等框架机制实现,在此不另做讨论
客户端登陆
避免密码明文传输
。
统一拦截器
登陆完成以后,须要拦截器中统一处理登陆合法性校验,避免在各个业务逻辑中重复使用相同代码。在这里统一放至middleware
中进行处理。
1.服务端拦截
在业务中依据头部传入内容,检测用户合法性,不合法状况下返回错误信息。