浏览代码

第一次提交

mark 5 年之前
当前提交
3e71b3420f
共有 22 个文件被更改,包括 4622 次插入0 次删除
  1. 1 0
      .gitignore
  2. 74 0
      app.js
  3. 90 0
      bin/www
  4. 11 0
      config/defaultConfig.js
  5. 32 0
      config/mysqlConfig.js
  6. 62 0
      dao/ArticleDao.js
  7. 30 0
      dao/CommentDao.js
  8. 24 0
      dao/LikeDao.js
  9. 37 0
      dao/UserDao.js
  10. 16 0
      entity/ArticleEntity.js
  11. 12 0
      entity/CommentEntity.js
  12. 11 0
      entity/LikeEntity.js
  13. 12 0
      entity/UserEntity.js
  14. 3959 0
      package-lock.json
  15. 35 0
      package.json
  16. 8 0
      public/stylesheets/style.css
  17. 54 0
      routes/article.js
  18. 35 0
      routes/index.js
  19. 101 0
      routes/users.js
  20. 6 0
      views/error.pug
  21. 5 0
      views/index.pug
  22. 7 0
      views/layout.pug

+ 1 - 0
.gitignore

@@ -0,0 +1 @@
+node_modules

+ 74 - 0
app.js

@@ -0,0 +1,74 @@
+const Koa = require('koa')
+const app = new Koa()
+const views = require('koa-views')
+const json = require('koa-json')
+const onerror = require('koa-onerror')
+const bodyparser = require('koa-bodyparser')
+const logger = require('koa-logger')
+const cors = require('koa2-cors')
+// const koajwt = require('koa-jwt')
+
+const index = require('./routes/index')
+const users = require('./routes/users')
+const article = require('./routes/article')
+
+// error handler
+onerror(app)
+
+// middlewares
+app.use(bodyparser({
+  enableTypes:['json', 'form', 'text']
+}))
+app.use(json())
+app.use(logger())
+app.use(require('koa-static')(__dirname + '/public'))
+// app.use((ctx, next) => {
+//   return next().catch((err) => {
+//     if (401 == err.status) {
+//       ctx.status = 401;
+//       ctx.body = 'Protected resource, use Authorization header to get access\n';
+//     } else {
+//       throw err;
+//     }
+//   });
+// });
+// app.use(koajwt({
+//   secret: 'token'
+// }).unless({
+//   path: [/^\/users\/login/, /^\/users\/register/, /^\/article/]
+// }))
+
+app.use(views(__dirname + '/views', {
+  extension: 'pug'
+}))
+
+app.use(cors({
+  origin: (ctx) => {
+    return '*'
+  },
+  maxAge: 5,
+  credentials: true,
+  allowMethods: ['GET', 'POST', 'PUT', 'DELETE', 'OPTIONS'],
+  allowHeaders: ['Content-Type', 'Authorization', 'Accept'],
+  exposeHeaders: ['WWW-Authenticate', 'Server-Authenticate']
+}))
+
+// logger
+app.use(async (ctx, next) => {
+  const start = new Date()
+  await next()
+  const ms = new Date() - start
+  console.log(`${ctx.method} ${ctx.url} - ${ms}ms`)
+})
+
+// routes
+app.use(index.routes(), index.allowedMethods())
+app.use(users.routes(), users.allowedMethods())
+app.use(article.routes(), article.allowedMethods())
+
+// error-handling
+app.on('error', (err, ctx) => {
+  console.error('server error', err, ctx)
+});
+
+module.exports = app

+ 90 - 0
bin/www

@@ -0,0 +1,90 @@
+#!/usr/bin/env node
+
+/**
+ * Module dependencies.
+ */
+
+var app = require('../app');
+var debug = require('debug')('demo:server');
+var http = require('http');
+
+/**
+ * Get port from environment and store in Express.
+ */
+
+var port = normalizePort(process.env.PORT || '3000');
+// app.set('port', port);
+
+/**
+ * Create HTTP server.
+ */
+
+var server = http.createServer(app.callback());
+
+/**
+ * Listen on provided port, on all network interfaces.
+ */
+
+server.listen(port);
+server.on('error', onError);
+server.on('listening', onListening);
+
+/**
+ * Normalize a port into a number, string, or false.
+ */
+
+function normalizePort(val) {
+  var port = parseInt(val, 10);
+
+  if (isNaN(port)) {
+    // named pipe
+    return val;
+  }
+
+  if (port >= 0) {
+    // port number
+    return port;
+  }
+
+  return false;
+}
+
+/**
+ * Event listener for HTTP server "error" event.
+ */
+
+function onError(error) {
+  if (error.syscall !== 'listen') {
+    throw error;
+  }
+
+  var bind = typeof port === 'string'
+    ? 'Pipe ' + port
+    : 'Port ' + port;
+
+  // handle specific listen errors with friendly messages
+  switch (error.code) {
+    case 'EACCES':
+      console.error(bind + ' requires elevated privileges');
+      process.exit(1);
+      break;
+    case 'EADDRINUSE':
+      console.error(bind + ' is already in use');
+      process.exit(1);
+      break;
+    default:
+      throw error;
+  }
+}
+
+/**
+ * Event listener for HTTP server "listening" event.
+ */
+
+function onListening() {
+  var addr = server.address();
+  var bind = typeof addr === 'string'
+    ? 'pipe ' + addr
+    : 'port ' + addr.port;
+  debug('Listening on ' + bind);
+}

+ 11 - 0
config/defaultConfig.js

@@ -0,0 +1,11 @@
+const config = {
+    database: {
+        DATABASE: 'nodejs',
+        USERNAME: 'root',
+        PASSWORD: '123456',
+        PORT: '3306',
+        HOST: '192.168.2.210'
+    }
+}
+
+module.exports = config

+ 32 - 0
config/mysqlConfig.js

@@ -0,0 +1,32 @@
+const mysql = require('mysql')
+const config = require('./defaultConfig')
+
+let pool = mysql.createPool({
+    host: config.database.HOST,
+    user: config.database.USERNAME,
+    password: config.database.PASSWORD,
+    database: config.database.DATABASE
+})
+
+let allServers = {
+    query: function (sql, values) {
+        return new Promise((resolve, reject) => {
+            pool.getConnection(function (err, connection) {
+                if (err) {
+                    reject(err)
+                } else {
+                    connection.query(sql, values, (err, rows) => {
+                        if (err) {
+                            reject(err)
+                        } else {
+                            resolve(rows)
+                        }
+                        connection.release()
+                    })
+                }
+            })
+        })
+    },
+}
+
+module.exports = allServers

+ 62 - 0
dao/ArticleDao.js

@@ -0,0 +1,62 @@
+const db = require('../config/mysqlConfig')
+const moment = require('moment')
+
+let ArticleDao = {
+    // 查找所有文章
+    selectAll: (start, num) => {
+        let sql = `select * from article limit ${start}, ${num}`
+        return db.query(sql)
+    },
+    // 查找
+    selectLatest: (start, num) => {
+        let sql = `select * from article order by update_time desc limit ${start}, ${num}`
+        return db.query(sql)
+    },
+    selectByID: ID => {
+        let sql = `SELECT * FROM article WHERE article_id = ${ID}`
+        return db.query(sql)
+    },
+    selectByTitle: Title => {
+        let sql = `SELECT * FROM article WHERE article_title = ${Title}`
+        return db.query(sql)
+    },
+    selectByUserID: UserID => {
+        let sql = `SELECT * FROM article WHERE author_id = ${UserID}`
+        return db.query(sql)
+    },
+    update: Article => {
+        let updateAt = moment(Date.now()).format('YYYY-MM-DD HH:mm:ss')
+        let sql = `UPDATE article SET update_time = '${updateAt}'`
+        if(Article.content !== undefined && Article.content !== ''){
+            sql += `, content = '${Article.content}'`
+        }
+        if(Article.description !== undefined && Article.description !== ''){
+            sql += `, content = '${Article.description}'`
+        }
+        if(Article.title !== undefined && Article.title !== ''){
+            sql += `, article_title = '${Article.title}'`
+        }
+        sql += ` where article_id = ${Article.articleID}`
+        db.query(sql)
+    },
+    insert: Article => {
+        let createdAt = moment(Date.now()).format('YYYY-MM-DD HH:mm:ss')
+        let sql = `insert into article(article_title, author_id, create_time, update_time, description, content) values('${Article.title}', '${Article.authorID}', '${createdAt}', '${createdAt}', '${Article.description}', '${Article.content}')`
+        return db.query(sql)
+    },
+    like: (num, articleID) => {
+        let sql = `update article set like_count = like_count + ${num} where article_id = ${articleID}`
+        db.query(sql)
+    },
+    dislike: (num, articleID) => {
+        let sql = `update article set dislike_count = dislike_count + ${num} where article_id = ${articleID}`
+        db.query(sql)
+    },
+    comment: articleID => {
+        let sql = `update article set comment_count = comment_count + 1  where article_id = ${articleID}`
+        db.query(sql)
+    }
+
+}
+
+module.exports = ArticleDao

+ 30 - 0
dao/CommentDao.js

@@ -0,0 +1,30 @@
+const db = require('../config/mysqlConfig')
+const moment = require('moment')
+
+let CommentDao = {
+    selectByID: ID => {
+        let sql = `SELECT * FROM comment WHERE comment_id = '${ID}'`
+        return db.query(sql)
+    },
+    selectByUserID: UserID => {
+        let sql = `SELECT * FROM comment WHERE user_id = '${UserID}'`
+        return db.query(sql)
+    },
+    selectByArticleID: ArticleID => {
+        let sql = `SELECT * FROM comment WHERE article_id = '${ArticleID}'`
+        return db.query(sql)
+    },
+    update: Comment => {
+        let createdAt = moment(Date.now()).format('YYYY-MM-DD HH:mm:ss')
+        let sql = `UPDATE comment SET content = '${Comment.Content}' , update_time = '${createdAt}' `;
+        sql += `WHERE comment_id = '${Comment.CommentID}'` 
+        return db.query(sql)
+    },
+    insert: Comment => {
+        let createdAt = moment(Date.now()).format('YYYY-MM-DD HH:mm:ss')
+        let sql = `INSERT INTO comment(article_id, user_id, content, create_time, update_time) values('${Comment.ArticleID}', '${Comment.UserID}', '${Comment.Content}', '${createdAt}', '${createdAt}')`
+        db.query(sql)
+    }
+}
+
+module.exports = CommentDao

+ 24 - 0
dao/LikeDao.js

@@ -0,0 +1,24 @@
+const db = require('../config/mysqlConfig')
+const moment = require('moment')
+
+let LikeDao = {
+    selectByID: ID => {
+        let sql = `SELECT * FROM like_or_dislike WHERE like_id = '${ID}'`
+        return db.query(sql)
+    },
+    selectByUserID: UserID => {
+        let sql = `SELECT * FROM like_or_dislike WHERE user_id = '${UserID}'`
+        return db.query(sql)
+    },
+    selectByArticleID: ArticleID => {
+        let sql = `SELECT * FROM like_or_dislike WHERE article_id = '${ArticleID}'`
+        return db.query(sql)
+    },
+    insert: Like => {
+        let createdAt = moment(Date.now()).format('YYYY-MM-DD HH:mm:ss')
+        sql = `insert into like_or_dislisk(create_time, user_id, article_id, like_type) values('${Like.CreatedAt}', '${UserID}', '${ArticleID}', '${createdAt}')`
+        return db.query(sql)
+    }
+}
+
+module.exports = LikeDao

+ 37 - 0
dao/UserDao.js

@@ -0,0 +1,37 @@
+const db = require('../config/mysqlConfig')
+const crypto = require('crypto')
+const moment = require('moment')
+const UserEntity = require('../entity/UserEntity')
+
+let UserDao = {
+    selectById: UserID => {
+        let sql = `SELECT * from user where user_id = '` + UserID + `'`
+        return db.query(sql)
+    },
+    selectByName: UserName => {
+        let sql = `SELECT * from user where user_name = '` + UserName + `'`
+        return db.query(sql)
+    },
+    update: User => {
+        let sql = `UPDATE user SET `;
+        if (User.Password !== undefined && User.Password !== ''){
+            sql += `password = '` + User.Password + `'`
+        }
+        if (User.avatarUrl !== undefined && User.avatarUrl !== ''){
+            sql += `avatar = '` + User.avatarUrl + `'`
+        }
+        if (User.description !== undefined && User.description !== ''){
+            sql += `description = '` + user.description + `'`
+        }
+        sql += ` WHERE user_id = '` + User.userID + `'`
+        return db.query(sql)
+    },
+    insert: User => {
+        let password = crypto.createHash('md5').update(User.password).digest('hex')
+        let createdAt = moment(Date.now()).format('YYYY-MM-DD HH:mm:ss')
+        let sql = `insert into user(user_name, password, avatar, description, create_time) values('${User.userName}', '${password}', '${User.avatarUrl}', '${User.description}', '${createdAt}')`
+        db.query(sql)
+    }
+}
+
+module.exports = UserDao

+ 16 - 0
entity/ArticleEntity.js

@@ -0,0 +1,16 @@
+class ArticleEntity {
+    constructor() {
+        this.articleID = ''
+        this.title = ''
+        this.authorID = ''
+        this.createdAt = null
+        this.updatedAt = null
+        this.description = ''
+        this.content = ''
+        this.likeCount = 0
+        this.disliskCount = 0
+        this.commentCount = 0
+    }
+}
+
+module.exports = ArticleEntity

+ 12 - 0
entity/CommentEntity.js

@@ -0,0 +1,12 @@
+class CommentEntity {
+    constructor() {
+        this.CommentID = ''
+        this.ArticleID = ''
+        this.Content = ''
+        this.UserID = ''
+        this.createdAt = ''
+        this.updateAt = ''
+    }
+}
+
+module.exports = CommentEntity

+ 11 - 0
entity/LikeEntity.js

@@ -0,0 +1,11 @@
+class LikeEntity{
+    constructor() {
+        this.LikeID = ''
+        this.UserID = ''
+        this.ArticleID = ''
+        this.CreatedAt = ''
+        this.Type = 0
+    }
+}
+
+module.exports = LikeEntity

+ 12 - 0
entity/UserEntity.js

@@ -0,0 +1,12 @@
+class UserEntity {
+    constructor(){
+        this.userId = ''
+        this.userName = ''
+        this.password = ''
+        this.avatarUrl = ''
+        this.description = ''
+        this.createdAt = ''
+    }
+}
+
+module.exports = UserEntity

文件差异内容过多而无法显示
+ 3959 - 0
package-lock.json


+ 35 - 0
package.json

@@ -0,0 +1,35 @@
+{
+  "name": "demo01",
+  "version": "0.1.0",
+  "private": true,
+  "scripts": {
+    "start": "node bin/www",
+    "dev": "./node_modules/.bin/nodemon bin/www",
+    "prd": "pm2 start bin/www",
+    "test": "echo \"Error: no test specified\" && exit 1"
+  },
+  "dependencies": {
+    "crypto": "^1.0.1",
+    "debug": "^4.1.1",
+    "jsonwebtoken": "^8.5.1",
+    "koa": "^2.7.0",
+    "koa-bodyparser": "^4.2.1",
+    "koa-convert": "^1.2.0",
+    "koa-cors": "0.0.16",
+    "koa-json": "^2.0.2",
+    "koa-jwt": "^4.0.0",
+    "koa-logger": "^3.2.0",
+    "koa-onerror": "^4.1.0",
+    "koa-router": "^7.4.0",
+    "koa-static": "^5.0.0",
+    "koa-views": "^6.2.0",
+    "koa2-cors": "^2.0.6",
+    "moment": "^2.29.1",
+    "mysql": "^2.18.1",
+    "pug": "^2.0.3",
+    "typeorm": "^0.2.31"
+  },
+  "devDependencies": {
+    "nodemon": "^1.19.1"
+  }
+}

+ 8 - 0
public/stylesheets/style.css

@@ -0,0 +1,8 @@
+body {
+  padding: 50px;
+  font: 14px "Lucida Grande", Helvetica, Arial, sans-serif;
+}
+
+a {
+  color: #00B7FF;
+}

+ 54 - 0
routes/article.js

@@ -0,0 +1,54 @@
+const router = require('koa-router')()
+const ArticleDao = require('../dao/ArticleDao')
+const ArticleEntity = require('../entity/ArticleEntity')
+const UserDao = require('../dao/UserDao')
+
+router.prefix('/articles')
+
+router.get('/:id', async (ctx) => {
+    let id = ctx.params.id
+    let result = await ArticleDao.selectByID(id)
+    ctx.body = result
+})
+
+router.post('/', async (ctx) => {
+    // console.log(ctx.request.body)
+    // ctx.body = ctx.request.body
+    console.log(ctx.request.body);
+    article = ctx.request.body
+    article['authorID'] = 1
+    article['description'] = '当然也是一个测试'
+    result = await ArticleDao.insert(article)
+    console.log(result);
+    ctx.body = result
+})
+
+router.get('/', async (ctx) => {
+    let result = await ArticleDao.selectLatest(0, 20)
+    result = JSON.parse(JSON.stringify(result))
+    let articles = []
+    let pros = [] // 存放Promise对象
+
+    result.map(item => {
+        let authorID = item.author_id
+        pros.push(UserDao.selectById(authorID))
+    })
+
+    let result2 = await Promise.all(pros) // Promise.all() 完成所有promise后返回结果集
+    let count = 0
+    result.map(item => {
+        user = JSON.parse(JSON.stringify(result2[count]))[0]
+        let stuff = {
+            ...item,
+            author: {
+                name: user.user_name,
+                avatar: user.avatar
+            }
+        }
+        articles.push(stuff)
+        count += 1
+    })
+    ctx.body = articles
+})
+
+module.exports = router

+ 35 - 0
routes/index.js

@@ -0,0 +1,35 @@
+const router = require('koa-router')()
+const UserDao = require('../dao/UserDao')
+const crypto = require('crypto')
+
+
+router.get('/', async (ctx, next) => {
+  await ctx.render('index', {
+    title: 'Hello Koa 2!'
+  })
+  ctx.body = {
+    code: 0,
+    msg: 'Hello'
+  }
+})
+
+router.get('/string', async (ctx, next) => {
+  ctx.body = 'koa2 string'
+})
+
+router.get('/json', async (ctx, next) => {
+  ctx.body = {
+    title: 'koa2 json'
+  }
+})
+
+router.get('/test', async (ctx, next) => {
+  // let user = await UserDao.selectById(1)
+  // let dataString = JSON.stringify(user)
+  // let data = JSON.parse(dataString)
+  // console.log(data[0].user_name)
+
+  ctx.body = crypto.createHash('md5').update('123').digest('hex') // 对密码进行md5 数据库中保存的是md5后的密码
+})
+
+module.exports = router

+ 101 - 0
routes/users.js

@@ -0,0 +1,101 @@
+const router = require('koa-router')()
+const UserDao = require('../dao/UserDao')
+const crypto = require('crypto')
+const jwt = require('jsonwebtoken')
+const UserEntity = require('../entity/UserEntity')
+
+
+router.prefix('/users')
+
+/**
+ * 用户登录方法
+ */
+router.post('/login', async (ctx) => {
+  const data = ctx.request.body
+  if (!data.name || !data.password) {
+    return ctx.body = {
+      code: '602',
+      data: null,
+      msg: '参数不合法'
+    }
+  }
+  let password = crypto.createHash('md5').update(data.password).digest('hex') // 对密码进行md5 数据库中保存的是md5后的密码
+  const result = await UserDao.selectByName(data.name)
+  if(result !== null){
+    let resultString = JSON.stringify(result)
+    let user = JSON.parse(resultString)[0]
+    if(password === user.password) {
+      let token = jwt.sign({
+        name: user.user_name,
+        id: user.user_id
+      }, 'token', {expiresIn: '0.5h'})
+      return ctx.body = {
+        code: '0',
+        data: token,
+        msg: '登录成功'
+      }
+    } else {
+      return ctx.body = {
+        code: '602',
+        data: null,
+        msg: '密码错误'
+      }
+    }
+  } else {
+    return ctx.body = {
+      code: '602',
+      data: null,
+      msg: '用户不存在'
+    }
+  }
+
+})
+
+/**
+ * 用户注册方法
+ */
+router.post('/register', async (ctx) => {
+  const data = ctx.request.body
+  if (!data.username || !data.password) {
+    return ctx.body = {
+      code: '602',
+      data: null,
+      msg: '参数不合法'
+    }
+  }
+  let result = await UserDao.selectByName(data.username)
+  let resultString = JSON.stringify(result)
+  let user = JSON.parse(resultString)[0]
+  console.log(user)
+  if(user !== undefined) {
+    return ctx.body = {
+      code: '602',
+      data: null,
+      msg: '用户已存在'
+    }
+  }
+
+  let userEntity = new UserEntity()
+  userEntity.userName = data.username
+  userEntity.password = data.password
+  userEntity.avatarUrl = data.avatarUrl
+  userEntity.description = data.description
+
+  UserDao.insert(userEntity)
+  return ctx.body = {
+    code: '0',
+    data: null,
+    msg: '注册成功'
+  }
+})
+
+/**
+ * 返回用户信息
+ */
+router.get('/info/:id', async (ctx) => {
+  let id = ctx.params.id
+  let result = await UserDao.selectById(id)
+  ctx.body = result
+})
+
+module.exports = router

+ 6 - 0
views/error.pug

@@ -0,0 +1,6 @@
+extends layout
+
+block content
+  h1= message
+  h2= error.status
+  pre #{error.stack}

+ 5 - 0
views/index.pug

@@ -0,0 +1,5 @@
+extends layout
+
+block content
+  h1= title
+  p Welcome to #{title}

+ 7 - 0
views/layout.pug

@@ -0,0 +1,7 @@
+doctype html
+html
+  head
+    title= title
+    link(rel='stylesheet', href='/stylesheets/style.css')
+  body
+    block content