萌新的全棧之旅 | 登錄

前篇

萌新的全棧之旅

前言

首先要記錄的是登錄模塊


這里使用的是mysql+JsonWebToken

koa2環(huán)境搭建

圖省事可以直接使用koa-generator直接生成koa腳手架

首先使用vue-cli搭建vue腳手架
cli根目錄下新建server目錄,用來放置服務(wù)端的代碼
并在cli根目錄下新建app.js文件,用來啟動(dòng)koa
server文件夾內(nèi)新建以下文件夾及文件

// 使用`tree /f`命令行生成文檔樹
// `tree /f > tree.txt`保存文檔樹
├─config  // 各類配置的文件夾
│      db.js
│      
├─controllers  // 控制器
│      user.js
│      
├─models  // 模型
│      user.js
│      
├─routes  // 路由
│      user.js
│      
├─schema  // 數(shù)據(jù)庫表結(jié)構(gòu)
│      user.js
│      
└─sql
       user.sql

koa組件

  "koa": "^2.3.0",
  "koa-bodyparser": "^4.2.0",  // 將post數(shù)據(jù)存入ctx.request.body
  "koa-json": "^2.0.2",  // 美觀的輸出JSON response
  "koa-logger": "^3.0.1",  // 打印http請(qǐng)求
  "koa-router": "^7.2.1",  // 路由
  "koa-static": "^4.0.1",  // 靜態(tài)文件服務(wù)
  "koa2-history-api-fallback": "^0.0.5"  // 解決vue前端路由與后端路由的沖突

mysql建表

(具體建庫建表代碼見
先在自己的mysql數(shù)據(jù)庫website創(chuàng)建一個(gè)數(shù)據(jù)庫和表user
user內(nèi)包含字段accountpasswd
并且insert自己的賬戶密碼(mysql基礎(chǔ)不解釋)

Sequelize

后臺(tái)為了更方便得和數(shù)據(jù)庫進(jìn)行聯(lián)系述暂,這里使用Sequelize模塊進(jìn)行增刪改查操作斥难,
sequelize也支持promise
sequelize-auto模塊可以將我們的數(shù)據(jù)庫的表結(jié)構(gòu)導(dǎo)出來

// 安裝模塊
npm i sequelize-auto && npm i sequelize mysql

進(jìn)入server的目錄,執(zhí)行如下語句sequelize-auto -o "./schema" -d website -h 127.0.0.1 -u root -p 3306 -x XXXXX -e mysql,(其中 -o 參數(shù)后面的是輸出的文件夾目錄, -d 參數(shù)后面的是數(shù)據(jù)庫名, -h 參數(shù)后面是數(shù)據(jù)庫地址胁孙, -u 參數(shù)后面是數(shù)據(jù)庫用戶名唠倦, -p 參數(shù)后面是端口號(hào), -x 參數(shù)后面是數(shù)據(jù)庫密碼涮较,這個(gè)要根據(jù)自己的數(shù)據(jù)庫密碼來稠鼻! -e 參數(shù)后面指定數(shù)據(jù)庫為mysql)

執(zhí)行完就會(huì)在schema文件夾中生成user.js文件(user數(shù)據(jù)表結(jié)構(gòu))

sequelize-auto報(bào)錯(cuò)?

沒有報(bào)錯(cuò)者請(qǐng)無視這條
若在window環(huán)境下使用sequelize-auto報(bào)錯(cuò)
就直接在sequelize-auto模塊的\bin目錄下執(zhí)行
node sequelize-auto -o "./schema" -d website -h 127.0.0.1 -u root -p 3306 -x XXXXX -e mysql
再將生成的user.js復(fù)制到schema文件夾內(nèi)

初始化數(shù)據(jù)庫配置

server目錄下的config目錄下我們新建一個(gè)db.js狂票,用于初始化Sequelize和數(shù)據(jù)庫的連接候齿。

// db.js
const Sequelize = require('sequelize'); // 引入sequelize
// 使用url連接的形式進(jìn)行連接,注意將root: 后面的XXXX改成自己數(shù)據(jù)庫的密碼
const Website = new Sequelize('mysql://root:XXXX@localhost/website',{
  define: {
    timestamps: false // 取消Sequelzie自動(dòng)給數(shù)據(jù)表加入時(shí)間戳(createdAt以及updatedAt)
  }
}) 
module.exports = {
  Website // 將Todolist暴露出接口方便Model調(diào)用
}

建立model模型

// models/user.js
const db = require('../config/db.js')
const userModel = '../schema/user.js'
const WebsiteDb = db.Website // 引入數(shù)據(jù)庫
const User = WebsiteDb.import(userModel)  // 導(dǎo)入數(shù)據(jù)模型

// 返回匹配到的user信息
const getUserByAccount = async (account) => {
  const userInfo = await User.findOne({
    where: {
      account: account
    }
  })

  return userInfo
}

module.exports = {
  getUserByAccount
}

controller控制器

// controllers/user.js
const jwt = require('jsonwebtoken')
const user = require ('../models/user.js')

// 執(zhí)行model方法返回user表匹配信息闺属,并對(duì)信息進(jìn)行jwt操作并返回
const postSingin = async (ctx) => {
  const data = ctx.request.body
  const userInfo = await user.getUserByAccount(data.account)

  if(userInfo !== null) {
    if(data.passwd !== userInfo.passwd) {
      ctx.body = {
        success: false,
        info: '密碼錯(cuò)誤'
      }
    } else {
      const userToken = {
        name: userInfo.account,
        id: userInfo.id
      }
      const secret = 'cheesekun-website'
      const token = jwt.sign(userToken, secret)

      ctx.body = {
        success: true,
        token: token
      }
    }
  }else {
    ctx.body = {
      success: false,
      info: '用戶不存在'
    }
  }
}

module.exports = {
  postSingin
}

定義路由

// routes/user.js
const user = require('../controllers/user.js')
const router = require('koa-router')()

router.post('/user', user.postSingin)

module.exports = router

app.js入口配置

const Koa = require('koa')
const Router = require('koa-router')()
const json = require('koa-json')
const logger = require('koa-logger')
const bodyParser = require('koa-bodyparser')
const static = require('koa-static')
const historyApiFallback = require('koa2-history-api-fallback')
const path = require('path')
const app = new Koa()

const user = require('./server/routes/user.js')

app.use(bodyParser())
app.use(json())  // 美化返回的 json
app.use(logger())

app.on('error', async(err, ctx) => {
  console.log('server error', err)
})

Router.use('/api', user.routes())
app.use(Router.routes())

app.listen(8889, () => {
  console.log('koa2 server in 8889')
})

vue登陸模塊

樣式?jīng)]什么好說的慌盯,使用了ElementUI
請(qǐng)求方面使用了axios

// src/main.js
import axios from 'axios'
// ... 省略
Vue.config.productionTip = false

// 將axios給vue實(shí)例
// 之后在vue中就可以直接使用`this.$http`來代替引入axios
Vue.prototype.$http = axios

/* eslint-disable no-new */
new Vue({
  el: '#app',
  router,
  template: '<App/>',
  components: { App }
})

this.$messageElementUI的一個(gè)組件用法,具體可看ElementUI

// src/components/signin/signin.vue
signin() {
        const signinObj = {
          account: this.account,
          passwd: this.passwd
        }
        this.$http.post('/api/user', signinObj)
        .then((res) => {
          if(res.data.success) {
            sessionStorage.setItem('token', res.data.token)  // 將jwt存入sessionStorage
            this.$message({
              type: 'success',
              message: '登錄成功'
            })

            this.$router.push({path: '/music'})

          }else {
            this.$message.error(res.data.info)
            sessionStorage.setItem('token', null)
          }
        })
        .catch((err) => {
          this.$message.error('請(qǐng)求錯(cuò)誤掂器!')
          sessionStorage.setItem('token', null)
        })
      }

結(jié)語

登陸模塊僅僅將jwt存儲(chǔ)在sessionStorage
以此來判斷該用戶有無登陸過該網(wǎng)站
并沒有密碼加密和使用其他類似于會(huì)話之類
這個(gè)只能之后了解到相關(guān)的用法再進(jìn)行升級(jí)了

結(jié)語2

這是一篇要配合github代碼才能看得明白的文章
有種像是寫個(gè)自己看的感覺orz

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末亚皂,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子国瓮,更是在濱河造成了極大的恐慌灭必,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,204評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件乃摹,死亡現(xiàn)場(chǎng)離奇詭異禁漓,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)孵睬,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門播歼,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人掰读,你說我怎么就攤上這事秘狞。” “怎么了磷支?”我有些...
    開封第一講書人閱讀 164,548評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵谒撼,是天一觀的道長食寡。 經(jīng)常有香客問我雾狈,道長,這世上最難降的妖魔是什么抵皱? 我笑而不...
    開封第一講書人閱讀 58,657評(píng)論 1 293
  • 正文 為了忘掉前任善榛,我火速辦了婚禮,結(jié)果婚禮上呻畸,老公的妹妹穿的比我還像新娘移盆。我一直安慰自己,他們只是感情好伤为,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,689評(píng)論 6 392
  • 文/花漫 我一把揭開白布咒循。 她就那樣靜靜地躺著据途,像睡著了一般。 火紅的嫁衣襯著肌膚如雪叙甸。 梳的紋絲不亂的頭發(fā)上颖医,一...
    開封第一講書人閱讀 51,554評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音裆蒸,去河邊找鬼熔萧。 笑死,一個(gè)胖子當(dāng)著我的面吹牛僚祷,可吹牛的內(nèi)容都是我干的佛致。 我是一名探鬼主播,決...
    沈念sama閱讀 40,302評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼辙谜,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼俺榆!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起装哆,我...
    開封第一講書人閱讀 39,216評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤肋演,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后烂琴,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體爹殊,經(jīng)...
    沈念sama閱讀 45,661評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,851評(píng)論 3 336
  • 正文 我和宋清朗相戀三年奸绷,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了梗夸。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,977評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡号醉,死狀恐怖反症,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情畔派,我是刑警寧澤铅碍,帶...
    沈念sama閱讀 35,697評(píng)論 5 347
  • 正文 年R本政府宣布,位于F島的核電站线椰,受9級(jí)特大地震影響胞谈,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜憨愉,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,306評(píng)論 3 330
  • 文/蒙蒙 一烦绳、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧配紫,春花似錦径密、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽底桂。三九已至,卻和暖如春惧眠,著一層夾襖步出監(jiān)牢的瞬間戚啥,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評(píng)論 1 270
  • 我被黑心中介騙來泰國打工锉试, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留猫十,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,138評(píng)論 3 370
  • 正文 我出身青樓呆盖,卻偏偏與公主長得像拖云,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子应又,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,927評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 【MySQL】Linux下MySQL 5.5、5.6和5.7的RPM洞就、二進(jìn)制和源碼安裝 1.1BLOG文檔結(jié)構(gòu)圖 ...
    小麥苗DB寶閱讀 10,546評(píng)論 0 31
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理盆繁,服務(wù)發(fā)現(xiàn),斷路器旬蟋,智...
    卡卡羅2017閱讀 134,657評(píng)論 18 139
  • 一. Java基礎(chǔ)部分.................................................
    wy_sure閱讀 3,811評(píng)論 0 11
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,811評(píng)論 6 342
  • 愛情是什么油昂,每個(gè)人或許都會(huì)有不用的答案。 有的人說倾贰,愛情是早晨起來冕碟,他在身邊。 有的人說匆浙,愛情是你想要的安寺,他能給你...
    嘟姐閱讀 300評(píng)論 0 0