iT邦幫忙

第 11 屆 iT 邦幫忙鐵人賽

DAY 9
1
Modern Web

三十天路邊賭場上線了!系列 第 9

DAY09 遊戲平台、站台API、會員系統

前言

本來打算將遊戲伺服器以及會員伺服器分開,模擬串接多遊戲的概念,但評估時間不多,暫時就以非常不得已的架構寫,
架構大概會是這篇文章所說的樣子,這一篇文章將會大概完成會員系統,不採用自動化CI/CD,以有溫度的手工搬檔案,預計會放在Heroku,為何放在這?因為我這最熟哈哈,其他平台還要摸索一陣子,先求有再求好囉!
https://ithelp.ithome.com.tw/upload/images/20190910/20109783lQDFWOylgJ.png

架構

單執行緒的狀況下去跑,因為我不知道lowdb再多執行緒會有甚麼狀況,而我也不預期之後會有太多人使用,畢竟連遊戲都還沒完成,是相當的擔心呢!但我相信價購這一步出來之後,未來的日子除了榮華富貴,只剩枯燥。
大致上分為兩個資料夾,socket以及http都監聽在同一Port,而一個是遊戲伺服器(gameServer)走的是socket,網頁伺服器(webServer)則是走一般http。

│  .env
│  .gitignore
│  app.js // 初始位置 會產出gameServer、webServer
│  LICENSE
│  package-lock.json
│  package.json
│  README.md
│  
├─bin
│     www // 啟動位置
├─db //資料庫
│      lobby.json
│      users.json
│      
├─errors
├─gameServer 遊戲伺服器
│      server.js
│      
│          
└─webServer 網頁伺服器
   │  server.js // 網頁API的部分
   │  
   ├─public // 前端部分 已經bundle所以看不出來是vue樣
   │  │  favicon.ico
   │  │  index.html
   │          
   └─src // 各種API對應的操作
           errorController.js
           mailController.js
           userController.js
           utils.js

API

// 註冊
app.post('/register', (req, res) => { })
// 登陸
app.post('/login', (req, res) => { })
// 取得使用者資訊
app.post('/userInfo', verifyToken, (req, res) => { })
// 大廳資訊
app.get('/lobby', verifyToken, (req, res) => { })

verifyToken是需要認證的中間件採用jwt認證

  function verifyToken (req, res, next) {
    const bearerHeader = req.headers['authorization']
    if (typeof bearerHeader !== 'undefined') {
      const bearer = bearerHeader.split(' ')
      const bearerToken = bearer[1]
      req.token = bearerToken
      jwt.verify(req.token, process.env.SECRET_KEY, (err, decoded) => {
        if (err) {
          res.sendStatus(401)
        } else {
          req.userInfo = decoded.userInfo
          next()
        }
      })
    } else {
      res.sendStatus(401)
    }
  }

MAIL

當然密碼要用信箱寄送,這是大概寄信的部分。

mailController.js

function _SEND_EMAIL(_opt) {
  return new Promise((resolve, reject) => {
    transporter.sendMail(_opt, function(error, info) {
      if (error) {
        errorController.ERROR(error)
        reject(error)
      } else {
        resolve(info.response)
      }
    })
  })
}

lowdb

隨便取了一個function來看,這是lowdb包裝後的增加使用者function。

function ADD_USER (email) {
  return IS_UNI_BYEMAIL(email).then(
    () =>
      _valid(
        _CREATE({
          email: email,
          password: _generatePassword(),
          balance: 0
        }),
        '帳號創建失敗!'
      ),
    () => {
      throw 'E-MAIL已經存在,請另尋信箱。'
    }
  )
}

環境變數

要自己補環境變數哦!信箱要拿自己申請的,且安全性調低。

.env

EMAIL_USER=xxxx@gmail.com
EMAIL_PASS=xxxx
SECRET_KEY=xxxx

後記

這個架構大致上就是這樣,遊戲部分還沒有放上去,前端頁面也有些功能還沒有加上去,但看上去擴充並不困難。
今天就大概這樣囉!原碼就在連結!

連結

GITHUB


上一篇
DAY08 遊戲平台、串接頁面(Vue)
下一篇
DAY10 百家樂遊戲核心、牌局生成
系列文
三十天路邊賭場上線了!30

尚未有邦友留言

立即登入留言