个人博客系统, SPA + RESTful 风格
博客: http://smcay.xyz
目前线上的环境
- Node
v9.10.0
- pm2
v2.10.1
- MongoDB
v3.6.3
- Redis
v4.0.9
- Nginx
v1.12.2
server基础配置
基础配置文件:
/blog/server/conf/base.js
{
// node 服务配置
serverPort: 3000 // 监听端口
origin: [String], // Access-Control-Allow-Origin白名单数组
// MongoDB 配置
mongoName: "", // 权限用户名
mongoPwd: "", // 权限用户密码
mongoHost: "127.0.0.1", // 链接地址
mongoPort: 27017, // 链接端口号
mongoDatabase: "blog", // 数据库名
// Redis 配置
redisHost: "127.0.0.1", // 链接地址
redisPort: 6379, // 链接端口号
redisPassword: "", // 权限密码
// Token 配置
tokenSecret: "", // 生成时撒的盐
tokenExpiresIn: 60 * 60, // 过期设置(秒)
// admin 管理员用户信息
adminName: "", // 用户名
adminPassword: "", // 用户密码
adminDisplayName: "", // 用户称呼
adminEmail: "", // 用户邮箱
// 静态资源存储目录
staticDirName: "./static", // 总目录,以server为根目录
uploadImgDirName: "images", // 图片的存储目录,以`staticDirName`为根目录
// 日志
logDirPath: "./var/log", // 存储目录
logFileName: "foo.log", // 文件名
// RESTful
prefix: "/api" // 接口根路由
}
nginx配置
nginx 配置文件:
/etc/nginx.conf
注意: nginx配置的参数对应server的配置
#压缩
gzip on;
gzip_min_length 1k;
gzip_comp_level 2;
gzip_types text/plain text/css text/javascript image/jpeg image/gif image/png image/jpg;
gzip_vary on;
gzip_disable "MSIE [1-6]\.";
server { #amdin入口
listen 80;
server_name admin.smcat.com;
location / {
root /mnt/www/blog/admin/dist; #admin打包后存储目录
index index.html index.htm;
try_files $uri $uri/ /index.html;
}
}
server { #front(博客)入口
listen 80;
server_name smcat.xyz;
client_max_body_size 20M; #上传文件大小限制
location ~ ^/(images)/ { #图片静态目录入口
root /mnt/www/blog/server/static/;
autoindex on;
expires 30d;
}
location /api/ {
proxy_pass http://localhost:3000; #RESTful请求监听
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header X-Forwarded-Proto $scheme;
}
location / {
proxy_pass http://localhost:8080; #front监听
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
pm2配置
pm2 配置文件:
/blog/pm2.json
pm2 全局安装, 启动命令(blog 目录下):pm2 startOrRestart pm2.json
{
"apps": [
{
"name": "blog",
"script": "front/production.js",
"cwd": "",
"exec_mode": "cluster",
"instances": 0,
"max_memory_restart": "256M",
"autorestart": true,
"node_args": [],
"args": [],
"env": {}
},
{
"name": "server",
"script": "server/app.js",
"cwd": "",
"watch": false,
"max_memory_restart": "256M",
"exec_mode": "cluster",
"autorestart": true
}
]
}
安装依赖:
npm i
启动由 pm2 完成
注意: 静态文件目录和nginx同步
安装依赖:
npm i
打包程序:npm run build
启动由 pm2 完成
注意: favicon.ico存储在front根目录
安装依赖:
npm i
打包程序:npm run build
程序由 ngxin 托管
注意: 打包后的dist目录的位置
服务器配置默认 3000 端口
请求接口默认博客路由/api
接口示例:
http://smcat.xyz/api/xxx
验证数据提交方式: 头信息 header 中的
authorization
设置为服务器下发的 Token
获取 Token 的方式:http://smcat.xyz/api/admin/login
提交用户名,密码
目前RESTful
接口需要通过验证的:
- 登录
- user 表请求
- 所有非 get 请求
get
post
put
delete
// 请求的参数列表:
{
limit: 1, // 返回值条数
skip: 0, // 过滤掉几条数据
select: { // 需要的字段(_id默认返回,不需要则添加 _id:0 )
"title":1,
"pathName":1
},
conditions: { // 查询条件(公开的post)
"isPublic":<
6A7D
span class="pl-c1">true
},
sort: { // 排序(按新建时间倒序)
"createdAt":-1
}
}
// 响应值列表:
{
"total": 1, // 总条数
"result": [
{
"_id":"5ace23d9151c1c8570574702",
"title":"起始,记录整站构思和体验",
"pathName":"start"
}
]
}
需要验证 Token, body 中存储需要新增的文档(JSON格式)
modelName 可支持的数值, 查看/server/model/
目录下的模型 key
需要验证 Token, body 中存储需要更新的文档(JSON格式)
modelName 可支持的数值, 查看/server/model/
目录下的模型 key
id 为被更新的文档 _id
同更新