All Projects → littlewin-wang → Littlewin.server

littlewin-wang / Littlewin.server

Licence: mit
A blog backend server based on koa + mongoose.

Programming Languages

javascript
184084 projects - #8 most used programming language

Projects that are alternatives of or similar to Littlewin.server

Koa Restful Boilerplate
Koa 2 RESTful API boilerplate
Stars: ✭ 146 (+356.25%)
Mutual labels:  restful, mongoose, koa2
reversevoice
倒放挑战 - ReverseVoice Ts Node Taro
Stars: ✭ 24 (-25%)
Mutual labels:  mongoose, koa2
koa-restful-boilerplate
A boilerplate for koa2 RESTful API development
Stars: ✭ 31 (-3.12%)
Mutual labels:  restful, koa2
login push
vue+koa2+jwt实现单点登录 + todolist增删改查
Stars: ✭ 20 (-37.5%)
Mutual labels:  mongoose, koa2
koa-mongoDB
😊😊Koa and mongoose build services
Stars: ✭ 24 (-25%)
Mutual labels:  mongoose, koa2
express-rest-api
🍺 RESTful API sample in Express, Mongoose and ES6.
Stars: ✭ 28 (-12.5%)
Mutual labels:  mongoose, restful
NodeRestApi
Node.js, Express.js and MongoDB REST API App
Stars: ✭ 38 (+18.75%)
Mutual labels:  mongoose, restful
Node Typescript Mongodb
node js typescript mongodb express generator yo
Stars: ✭ 96 (+200%)
Mutual labels:  restful, mongoose
task-manager
Open-source task manager based on Kanban. Made with vue.js, koa2, mongodb\mongoose.
Stars: ✭ 23 (-28.12%)
Mutual labels:  mongoose, koa2
Nuxt Blog
基于Nuxt.js服务器渲染(SSR)搭建的个人博客系统
Stars: ✭ 277 (+765.63%)
Mutual labels:  mongoose, koa2
Koa Rest Api Boilerplate
💯 Boilerplate for Node.js Koa RESTful API application with Docker, Swagger, Jest, CodeCov and CircleCI
Stars: ✭ 420 (+1212.5%)
Mutual labels:  restful, koa2
Koa2 Api Scaffold
一个基于Koa2的轻量级RESTful API Server脚手架。
Stars: ✭ 694 (+2068.75%)
Mutual labels:  restful, koa2
Node Express Mongoose Passport Jwt Rest Api Auth
Node, express, mongoose, passport and JWT REST API authentication example
Stars: ✭ 146 (+356.25%)
Mutual labels:  restful, mongoose
koa-better-router
❤️ Stable and lovely router for `koa`, using `path-match`. Foundation for building powerful, flexible and RESTful APIs easily.
Stars: ✭ 88 (+175%)
Mutual labels:  restful, koa2
Watsonwebserver
Watson is the fastest, easiest way to build scalable RESTful web servers and services in C#.
Stars: ✭ 125 (+290.63%)
Mutual labels:  restful, server
node-server
(@nestjs refactoring)⚡️My personal website's api server, a RESTful application that powered by @eggjs
Stars: ✭ 17 (-46.87%)
Mutual labels:  mongoose, koa2
Es6 Express Mongoose Passport Rest Api
Lightweight boilerplate for Node RESTful API, ES6, Express, Mongoose and Passport 🎁
Stars: ✭ 36 (+12.5%)
Mutual labels:  restful, mongoose
Resty
The minimalist framework of RESTful(server and client) - Resty
Stars: ✭ 1,268 (+3862.5%)
Mutual labels:  restful, server
koa-rest-router
Most powerful, flexible and composable router for building enterprise RESTful APIs easily!
Stars: ✭ 67 (+109.38%)
Mutual labels:  restful, koa2
Vue Blog
A single-user blog built with vue2, koa2 and mongodb which supports Server-Side Rendering
Stars: ✭ 586 (+1731.25%)
Mutual labels:  mongoose, koa2

littlewin.server

A restful blog backend server based on koa + mongoose.

调试开发

  1. 开启Mongdb数据库
  2. 新建一个存放密码信息的文件至'~/key/littlewin-server' - 参考密码信息数据结构
# install dependencies
$ npm install # Or yarn install

# serve with hot reload at localhost:8090 (需全局安装nodemon)
$ npm run dev

# product mode
$ npm start
$ pm2 start ecosystem.config.js

数据模型设计

文章模型

{
  title: { type: String, required: true, validate: /\S+/ },    // 文章标题
  keywords: [{ type: String }],    // 文章关键词
  description: String,     // 描述
  content: { type: String, required: true, validate: /\S+/ },    // 文章内容
  thumb: String,    // 缩略图
  state: { type: Number, default: 1 },    // 文章发布状态 => -1回收站,0草稿,1已发布
  pub: { type: Number, default: 1 },    // 文章公开状态 = // -1私密,0需要密码,1公开
  password: { type: String, default: '' },    // 文章密码 => 加密状态生效
  tag: [{ type: mongoose.Schema.Types.ObjectId, ref: 'Tag' }],    // 文章标签
  category: { type: mongoose.Schema.Types.ObjectId, ref: 'Category', required: true },    // 文章分类
  meta: {
    views: { type: Number, default: 0 },
    likes: { type: Number, default: 0 },
    comments: { type: Number, default: 0 }
  },    // 其他元信息
  createAt: { type: Date, default: Date.now },    // 创建时间
  updateAt: { type: Date },    // 修改时间
  extends: [{
    name: { type: String, validate: /\S+/ },
    value: { type: String, validate: /\S+/ }
  }]    // 扩展属性
})

分类模型 

{
  name: { type: String, required: true, validate: /\S+/ },    // 分类名称 
  description: String,    // 描述
  super: { type: Schema.Types.ObjectId, ref: 'Category' },    // 父分类
  createAt: { type: Date, default: Date.now },    // 创建时间
  updateAt: { type: Date },    // 修改时间
  extends: [{
    name: { type: String, validate: /\S+/ },
    value: { type: String, validate: /\S+/ }
  }]     // 扩展属性
}

标签模型

{
  name: { type: String, required: true, validate: /\S+/ },    // 标签名称
  description: String,    // 描述
  createAt: { type: Date, default: Date.now },    // 创建时间
  updateAt: { type: Date },    // 修改时间
  extends: [{
    name: { type: String, validate: /\S+/ },
    value: { type: String, validate: /\S+/ }
  }]    // 扩展属性
}

评论模型

{
  thirdID: { type: Number },    // 第三方评论id
  postID: { type: Number, required: true },    // 评论所在文章id, 0代表系统留言板
  pid: { type: Number, default: 0 },    // pid, 0代表默认留言
  content: { type: String, required: true, validate: /\S+/ },    // content
  isTop: { type: Boolean, default: false },    // 是否置顶
  likes: { type: Number, default: 0 },    // 点赞数
  author: {
    name: { type: String, required: true, validate: /\S+/ },
    email: { type: String, required: true, validate: /\w[-\w.+]*@([A-Za-z0-9][-A-Za-z0-9]+\.)+[A-Za-z]{2,14}/ },
    site: { type: String, validate: /^((https|http):\/\/)+[A-Za-z0-9]+\.[A-Za-z0-9]+[\/=\?%\-&_~`@[\]\':+!]*([^<>\"\"])*$/ }
  },    // 评论产生者
  ip: { type: String },    // IP地址
  ip_location: { type: Object },    // ip物理地址
  agent: { type: String, validate: /\S+/ },    // 用户ua
  state: { type: Number, default: 1 },    // 状态 0待审核/1通过正常/-1已删除/-2垃圾评论
  createAt: { type: Date, default: Date.now },    // 创建时间
  updateAt: { type: Date },    // 修改时间
  extends: [{
    name: { type: String, validate: /\S+/ },
    value: { type: String, validate: /\S+/ }
  }]    // 扩展属性
}

用户模型

{
  username: { type: String, default: '' },    // 用户名
  password: {
    type: String,
    default: md5(config.AUTH.default.password)
  },    // 密码
  slogan: { type: String, default: '' },    // 签名
  gravatar: { type: String, default: '' },    // 头像
  extends: [{
    name: { type: String, validate: /\S+/ },
    value: { type: String, validate: /\S+/ }
  }]    // 扩展属性
}

站点信息模型

{
  title: { type: String, required: true },    // 网站标题
  sub_title: { type: String, required: true },    // 网站副标题
  keywords: [{ type: String }],    // 关键字
  description: String,    // 网站描述
  site_url: { type: String, required: true },    // 站点地址
  site_email: String,    // 网站官邮
  site_icp: String,    // 备案号
  links: [{ title: String, site: String, description: String }],    // 友链
  blacklist: {
    ips: [{ type: String, validate: /\S+/ }],
    mails: [{ type: String, validate: /\S+/ }],
    keywords: [{ type: String, validate: /\S+/ }]
  },    // 黑名单
  meta: {
    // 被喜欢次数
    likes: { type: Number, default: 0 }
  }    // 其他元信息
}

接口设计

接口数据结构

  • HTTP状态码

    • 401 权限不足或其他数据错误
    • 404 项目中不存在
    • 500 服务器挂了
    • 200 正常
  • 数据特征码

    • success:
      • true
      • false
    • message: 具体信息
    • data: 具体数据

接口列表

.get('/', (ctx) => {
    ctx.body = {
      title: "littlewin.server API",
      version: "v1",
      author: "[email protected]",
      site: "littlewin.wang",
      guide: "https://github.com/littlewin-wang/littlewin.server/blob/master/README.md"
    }
  })    // 获取API接口信息

  .get('/sitemap.xml', SiteMap.get)    // 获取sitemap信息

  .post('/user', User.login)    // 用户登录
  .get('/user', User.get)    // 获取用户信息
  .put('/user', middleware.verifyToken, User.modify)    // 更新用户信息

  .post('/category', middleware.verifyToken, Category.create)    // 新建分类
  .get('/category', Category.list)    // 获取分类列表
  .get('/category/:id', Category.get)    // 获取单个分类信息
  .put('/category/:id', middleware.verifyToken, Category.modify)    // 更新单个分类信息
  .delete('/category/:id', middleware.verifyToken, Category.delete)    // 删除单个分类

  .post('/tag', middleware.verifyToken, Tag.create)    // 新建标签
  .get('/tag', Tag.list)    // 获取标签列表
  .delete('/tag', middleware.verifyToken, Tag.deleteList)    // 批量删除标签
  .get('/tag/:id', Tag.get)    // 获取单个标签信息
  .put('/tag/:id', middleware.verifyToken, Tag.modify)    // 更新单个标签信息
  .delete('/tag/:id', middleware.verifyToken, Tag.delete)    // 删除单个标签
  
  .post('/article', middleware.verifyToken, Article.create)    // 新建文章
  .get('/article', Article.list)    // 获取文章列表
  .patch('/article', middleware.verifyToken, Article.patch)    // 批量更新文章
  .delete('/article', middleware.verifyToken, Article.deleteList)    // 批量删除文章
  .get('/article/:id', Article.get)    // 获取单个文章信息
  .put('/article/:id', middleware.verifyToken, Article.modify)    // 更新单个文章信息
  .delete('/article/:id', middleware.verifyToken, Article.delete)    // 删除单个文章
  
  .post('/comment', Comment.create)    // 新建评论
  .get('/comment', Comment.list)    // 获取评论列表
  .patch('/comment', middleware.verifyToken, Comment.patch)    // 批量更新评论状态
  .delete('/comment', middleware.verifyToken, Comment.deleteList)    // 批量删除评论
  .get('/comment/:id', Comment.get)    // 获取单个评论信息
  .put('/comment/:id', middleware.verifyToken, Comment.modify)    // 更新单个评论信息
  .delete('/comment/:id', middleware.verifyToken, Comment.delete)    // 删除单个评论
  
  .post('/like', Like.like)    // 点赞

  .get('/site', Site.get)    // 获取站点信息
  .put('/site', middleware.verifyToken, Site.modify)    // 更新站点信息

Feature list

  • [x] 文章/分类/标签/评论等 数据模型设计
  • [x] 文章/分类/标签/评论等 接口设计
  • [x] 增加extends属性
  • [x] 非GET请求验证token
  • [x] 增加评论过滤机制
  • [x] 增加评论邮件提醒功能
  • [x] 根据IP解析地址
  • [x] 生成SITEMAP
  • [x] 自动push新链到百度
  • [x] 启用redis
  • [x] 启用SSL
  • [x] 增加事件系统
  • [x] 增加公告系统

Contact

Email: [email protected]

Note that the project description data, including the texts, logos, images, and/or trademarks, for each open source project belongs to its rightful owner. If you wish to add or remove any projects, please contact us at [email protected].