veaba / express-nuxt

【开发中……,需要配置mongodb才能使用本项目】Vue.js + express +nuxt.js +node.js + mongodb +websocket,web服务研究站。额外增加了小说爬虫功能(个人喜好)、vue官方样式markdown渲染。(github.io是静态页面,无法使用login等后台服务,后续再换成websocket或者jsonp与后台交互,然而看了GitHub.io 22s才加载完资源,凉凉)
https://veaba.github.io/express-nuxt/
MIT License
15 stars 2 forks source link
mongodb nodejs nuxt socket-io vue websockets

基于 express 的 nuxt 服务端渲染网站

安装

{
    "nuxt-dev": "nuxt",//官方 Start ExpressJS serverNew in development with Nuxt.js in dev mode (hot reloading). Listen on http://localhost:3000.
    "nuxt-build": "nuxt build",//官方 Build the nuxt.js web application for production.
    "nuxt-start": "nuxt build && nuxt start",//官方 Start ExpressJS serverNew in production.
    "backpack-dev": "backpack debug dev",//开发模式下,使用此命令,让实现热重载
    "backpack-build": "nuxt build && backpack build",
    "backpack-start": "cross-env NODE_ENV=production node build/main.js"
}

HTTP2

郁闷!HTTP2自带了HTTPS了,所以很简单。

访问http2Error

const express = require('express')
const http2 =require('http2')
const spdy = require('spdy')
const fs = require('fs')
const path = require('path')
const app = express()
const http2Options = {
  key: fs.readFileSync(path.join(__dirname, './ssl/key.pem')),
  cert: fs.readFileSync(path.join(__dirname, './ssl/cert.pem')),
  spdy:{
      'x-forwarded-for': true,
  }
}

const http2Server = spdy.createServer(http2Options,app)
http2Server.listen(8080)

app.get('/',function (req,res,next) {
    res.send('<h1>hello world HTTP2</h1>')
})

HTTPS/SSL/TSL

by@veaba ——2018年9月10日03:08:43

- 技巧1 在尾部这样写,就可以向外面暴露了
```js
module.exports = app//之前是在nuxt.config.js里面的中间器件的
export default {_io}

控制台 [次要考虑]

mongodb config 表,作为全局控制台

需求分析

功能性

性能

体验性

登录注册用户,支持第三方用户登录授权。
额外的小工具
支持文件下载
教程
视频
移动端适应
需要将请求的次数叠加到数据中,统计api请求的数据量 [针对路由]
国际化
分级权限
评论
GitHub
自动seo
发表文章
标题
内容
图片
视频链接
单独的单页
目录分级
菜单栏
下载组件
工具
教程引导文档
底部指引
后台登录
输入框,文章字数,动态字数

用户基础信息

个人主页

主角视角:昵称、个人简介、设置个人信息、文章数、回帖数、
游客视角:昵称、个人简介、文章数、回帖数、动态

基础信息(新规定,可能后续需要增加身份证,法规要求发帖需要实名)

用户名
密码
昵称
手机
email
头像

色系设计

serverNew 目录结构

/serverNew
----/functions
    ----functions.js
----/model
    ----modle.js mongodb 操作模型
----/router
    ----index.js api请求入口
----config.js 一些数据库配置参数
----server-new.back.js 服务端

mongodb 语法

mongoose 语法

函数

github markdown 渲染方案

数据库设计

[Collections] router 路由器,放置合法的路由表 {user、###路由保留、}

[Collections] user

user_login 登录名 string
user_pass 密码 string
user_nickname 昵称 string
user_email 邮箱 string
urse_url 个人网站 string
user_registered 注册时间  2018-2-10 11:49:21
user_status 用户状态
display_name  显示的名称

API 封装规范设计

(“*” 可选)

API response 响应结果 包装

{
    errorCode:errror  //状态码,必须会返回
    data:[]           //返回结果,可选,默认数组
    msg:'error'       //返回消息,可选,默认success:操作成功||erorr:操作失败
}

服务端通信 API 返回 http 状态代码设计

2000 是通信基础代码,错误逻辑等同于 2000+http 状态错误码,加上业务代码

后端

翻页接口函数

mongodb 语法

// 100章所消时间 - 132.5s
// 50章所消时间 - 114s
// 30章所消时间 - 144s
// 20章所消时间-95.942s
// 10章所消时间-94.01s
// 5章所消时间-226.184s

db
  .getCollection("articles")
  .find({})
  .limit(10)
  .skip(10); // 假如有20条,则从第10开始,截取10条结果返回
db
  .getCollection("articles")
  .find({})
  .limit(10); // 从1 到10条截取
db.getCollection("articles").aggregate([
  {
    $match: {
      length: {
        $gt: 5000
      }
    }
  },
  {
    $sort: {
      uuid: 1
    }
  },
  {
    $limit: 50
  }
]); // 查询长度大于5000的,数字长度的集合

db.getCollection("novels").aggregate([
  {
    $project: {
      content: {
        $substr: ["$content", 0, 10]
      }
    }
  }
]);
//查到某一列,并生成新列名,并字符串分割,如果使用 substr 会报一个解析的错误
db.getCollection("novels").distinct("name"); //查询 name 字段多少个值,通过这个,可以查询数据库存储多少本小说

文章,带导航式的,翻译教程类网站,vuejs.org、mongoose.com等

文章 普通文章,带节点类似GitHub的 readme

- 文章预览(标题、时间、)
-
- 文章统计接口

系统设计

小说下载模块

迫于 npm 安装组件失败,开发暂停

翻译组件

express
express-session
socket.io
socket.io-client
bodyParser
axios
mongoose
tracer
node

系统组件设计

账号-加入微博登录
右侧添加微博账号互动参与
googel账号引入
GitHub账号引入
facebook账号引入
twitter账号引入
微信账号引入

路由设计 (mongodb: router)

{
    name: 'about',
    status: 1,
    type: 'official'
}
路由表:
status:0    原来属于(1、2)类的词汇——被解禁的词汇
status:1    已注册的路由词汇——站方路由,用户
stauts:2    保留的路由词汇——品牌词汇、特殊、国家、组织 **

type: official   官方词汇
type: brand     品牌词汇
type: user      已注册的词汇
type: org(organizations)    组织/团队/小队/工作室等
name desc
about 关于
home 主页
route 路由
router 路由
user 用户
users 用户
manage 管理
us 我们
organizations 组织
my 我的
your 你的
Community 社区
book
app 应用
store 商店
mall 购物中心
shop 商店
marker 标记
serverNew 服务器
service 服务
active 积极
activation 激活
login 登录
ssl ssl 证书
register 注册
logout 注销
api api,接口
article 文章
articles 文章
account 账号

保留的路由词汇

brand desc
baidu 百度
microsoft 微软
netease 网易
adobe 奥多比
…… ……
country desc
china 中国
…… ……
term desc
js javaScript
class

系统架构

serverNew

node

web 容器

express

数据库

mongodb

数据库拓展

mongoose

渲染方案

nuxt.js 服务端渲染

前端技术栈框架

Vue.js

加密算法

node 自带的crypto对账号进行加密

前端 UI 框架

iView

前端自适应

vue-boostrap 在考虑中...

WebSocket

socket.io

编辑器

mavon-editor

    > 我是引文导读我是引文导读我是引文导读我是引文导读
  >> 我是引文导读我是引文导读我是引文导读我是引文导读

package.json

包依赖解释

*marked mk 格式文件渲染组件 发现无法渲染 ++文字++ 、sub 、sup 、==标记== 的操作

markdown-it ### 但 又不能自定义输出 h 标签,而且需要安装很多

date-fns

时间格式化工具,放弃 moment.js ,原因是,moment.js 太大了

兼容特性

SSL/https
APM
PWA 渐进式
http2.0

添加以下 支持 sass

"node-sass": "^4.5.3",
"pug": "^2.0.0-beta6",
"pug-loader": "^2.3.0",
"sass-loader": "^6.0.6"

添加 以下 支持 less(可能用于更改 iView 主题定制)

less  
less-loader

 开发笔记

如何处理未知的章节页面具体的小说内容所在的 id?