2019-08-11 Django+Vue.js實(shí)現(xiàn)前后端分離的單頁(yè)面博客系統(tǒng)(4)數(shù)據(jù)庫(kù)的設(shè)置與登錄、登出丁频、權(quán)限控制功能的實(shí)現(xiàn)

數(shù)據(jù)庫(kù)的配置

現(xiàn)在終于可以進(jìn)入后端的開發(fā)了杉允。不過(guò)在開發(fā)其他功能之前,首先還是要配置好數(shù)據(jù)庫(kù)席里。

數(shù)據(jù)庫(kù)方面叔磷,我使用的是自帶的SQLite數(shù)據(jù)庫(kù),因?yàn)槭褂闷饋?lái)比較方便奖磁,而且也有與之對(duì)應(yīng)的自帶的數(shù)據(jù)庫(kù)管理系統(tǒng)改基。

因?yàn)橹挥袃蓮埍恚?code>models.py中只有兩個(gè)類:

models.py(未完成咖为?)

from django.db import models
import time

# Create your models here.

# 用戶寥裂,其實(shí)只有博主一個(gè)人
class User(models.Model):
    username = models.CharField(max_length=150)
    password = models.CharField(max_length=150)

# 文章嵌洼,有標(biāo)題、內(nèi)容和發(fā)表時(shí)間三個(gè)屬性
class Article(models.Model):
    title = models.CharField(max_length=100)
    content = models.CharField(max_length=5000)
    date = models.DateTimeField('date', default=time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(time.time())))

編寫完成后創(chuàng)建管理員用戶:

python manage.py createsuperuser

然后執(zhí)行遷移命令封恰,初始化數(shù)據(jù)庫(kù):

python manage.py makemigrations backend
python manage.py sqlmigrate backend 0001
python manage.py migrate

因?yàn)橛脩糁挥胁┲饕粋€(gè)麻养,所以使用命令行來(lái)創(chuàng)建博主用戶。

>>> from backend.models import User
>>> u = User(username="admin", password="admin123456")
>>> u.save()

將User類和Article類都加入admin.py中诺舔,這樣才能在管理頁(yè)面中看到這兩項(xiàng):

from django.contrib import admin
from .models import User, Article

# Register your models here.

admin.site.register(User)
admin.site.register(Article)

執(zhí)行python manage.py runserver之后進(jìn)入127.0.0.1:8000/admin鳖昌,就可以看到后臺(tái)管理頁(yè)面了。

登錄功能的實(shí)現(xiàn)

接下來(lái)首先要實(shí)現(xiàn)登錄功能低飒,才能繼續(xù)開發(fā)其他功能许昨,畢竟很多功能的實(shí)現(xiàn)都需要基于權(quán)限控制。

與PHP留言板項(xiàng)目不同褥赊,這次使用Cookie來(lái)做會(huì)話控制糕档。

登錄的流程是這樣的:前端發(fā)起Ajax請(qǐng)求,將用戶名和密碼發(fā)給后端拌喉,后端經(jīng)過(guò)校驗(yàn)之后返回一個(gè)“狀態(tài)碼”和與之對(duì)應(yīng)的消息給前端,并且設(shè)置Cookie尿背,前端根據(jù)接收到的狀態(tài)碼做相應(yīng)處理端仰。

Django在查找數(shù)據(jù)庫(kù)這方面還是非常簡(jiǎn)單的,有對(duì)應(yīng)的API田藐,并不需要編寫SQL語(yǔ)句荔烧。

后端

views.py(未完成)

from django.shortcuts import render
from django.views.generic import View
from django.http import HttpResponseRedirect, JsonResponse, HttpResponse
from .models import User


# Create your views here.


class Login(View):
    def get(self, request):
        return HttpResponseRedirect('/login')

    def post(self, request):
        print(request)
        name = request.POST.get('name', None)
        pwd = request.POST.get('password', None)
        try:
            user = User.objects.get(username=name)

            if user.password == pwd:
                r = {
                    'status': 0,
                    'msg': '登錄成功!'
                }
                response = JsonResponse(r)
                response.set_cookie('username', name, expires=60 * 15)
                return response
            else:
                r = {
                    'status': 1,
                    'msg': '密碼錯(cuò)誤臀稚!'
                }
                response = JsonResponse(r)
                return response

        except Exception as e:
            r = {
                'status': 2,
                'msg': '你不是管理員!'
            }

        print('username:' + name)
        print('password:' + pwd)
        print(r)
        return JsonResponse(r)

有部分代碼只是測(cè)試用的,完成之后會(huì)刪掉蜓肆。

前端

Login.vue(未完成?)

<!--
  登錄組件
  TODO:開發(fā)登錄功能
-->
<template>
  <div class="container">
    <h1 class="display-3">Login</h1>
    <hr class="my-1">
    <form id="login-form">
      <div class="form-group">
        <label for="name" class="text-left">Username:</label>
        <input type="text" class="form-control" id="name" placeholder="Username" v-model="name">
      </div>
      <div class="form-group">
        <label for="password">Password:</label>
        <input type="password" class="form-control" id="password" placeholder="Password" v-model="password">
      </div>
      <input type="button" @click="post" class="btn btn-secondary" value="Submit">
    </form>
  </div>
</template>

<script>
  export default {
    name: 'Login',
    data () {
      return {
        name: '',
        password: ''
      }
    },
    mounted () {
      let allCookies = document.cookie
      if (allCookies.indexOf('username') !== -1) {
        this.$router.push('/manage')
      }
    },
    methods: {
      post () {
        let data = new URLSearchParams()
        data.append('name', this.name)
        data.append('password', this.password)
        this.axios
          .post('/login/check/', data)
          .then(function (response) {
            console.log(response)
            alert(response.data.msg)
            if (response.data.status === 0) {
              location.href = '/manage'
            }
          })
          .catch(function (error) {
            console.log(error)
          })
      }
    }
  }
</script>

<style scoped>
  .container {
    padding-top: 100px;
  }

  h1 {
    padding-bottom: 20px;
  }

  form {
    margin-top: 30px;
  }
</style>

這里在mounted()函數(shù)中做了一個(gè)判斷:如果已經(jīng)有cookie了,那就不需要登錄彼城,直接進(jìn)入管理頁(yè)面诅蝶。其他組件中也會(huì)用到這種判斷。

這里用location.href來(lái)跳轉(zhuǎn)也是無(wú)奈之舉募壕,因?yàn)槭褂胿ue-router總是出各種各樣的問題调炬,無(wú)奈之下只好換這個(gè)了。

登出功能的實(shí)現(xiàn)

這次的登出功能非常簡(jiǎn)單舱馅,因?yàn)橹皇卿N毀Cookie缰泡,所以都不用麻煩后端,直接使用JavaScript來(lái)銷毀就可以代嗤。銷毀的原理是使Cookie超出有效期棘钞。

借鑒了百度經(jīng)驗(yàn)上的一些代碼,侵刪资溃。

Logout.vue(未完成武翎?)

<!--
  登出組件
  TODO: 開發(fā)登出功能
-->
<template>
    
</template>

<script>
  export default {
    name: 'Logout',
    methods: {
    },
    mounted () {
      let oDate=new Date()
      oDate.setDate(oDate.getDate() + -1);
      document.cookie = 'username' + '=' + 'admin'+';expires='+oDate;
      alert('登出成功')
      this.$router.push('/')
    }
  }
</script>

<style scoped>

</style>

權(quán)限控制的實(shí)現(xiàn)

因?yàn)槭鞘褂肅ookie進(jìn)行會(huì)話控制,所以權(quán)限控制也是根據(jù)判斷有無(wú)Cookie來(lái)完成溶锭。只要用一點(diǎn)JavaScript就可以宝恶,并不是很難。

核心代碼如下:

mounted () {
      let allCookies = document.cookie
      if (allCookies.indexOf('username') === -1) {
        this.$router.push('/login')
      }

也就是在組件裝載的時(shí)候使用JavaScript判斷Cookie是否存在趴捅,如果不存在垫毙,就使用vue-router進(jìn)行強(qiáng)制跳轉(zhuǎn)。在需要權(quán)限控制的組件里加上這段代碼拱绑,然后稍微改一改變量和跳轉(zhuǎn)的目標(biāo)URL就可以了综芥。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市猎拨,隨后出現(xiàn)的幾起案子膀藐,更是在濱河造成了極大的恐慌,老刑警劉巖红省,帶你破解...
    沈念sama閱讀 219,539評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件额各,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡吧恃,警方通過(guò)查閱死者的電腦和手機(jī)虾啦,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評(píng)論 3 396
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人傲醉,你說(shuō)我怎么就攤上這事蝇闭。” “怎么了硬毕?”我有些...
    開封第一講書人閱讀 165,871評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵呻引,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我昭殉,道長(zhǎng)苞七,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,963評(píng)論 1 295
  • 正文 為了忘掉前任挪丢,我火速辦了婚禮蹂风,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘乾蓬。我一直安慰自己惠啄,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,984評(píng)論 6 393
  • 文/花漫 我一把揭開白布任内。 她就那樣靜靜地躺著撵渡,像睡著了一般。 火紅的嫁衣襯著肌膚如雪死嗦。 梳的紋絲不亂的頭發(fā)上趋距,一...
    開封第一講書人閱讀 51,763評(píng)論 1 307
  • 那天,我揣著相機(jī)與錄音越除,去河邊找鬼节腐。 笑死,一個(gè)胖子當(dāng)著我的面吹牛摘盆,可吹牛的內(nèi)容都是我干的翼雀。 我是一名探鬼主播,決...
    沈念sama閱讀 40,468評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼孩擂,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼狼渊!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起类垦,我...
    開封第一講書人閱讀 39,357評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤狈邑,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后蚤认,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體米苹,經(jīng)...
    沈念sama閱讀 45,850評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,002評(píng)論 3 338
  • 正文 我和宋清朗相戀三年烙懦,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了驱入。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,144評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡氯析,死狀恐怖亏较,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情掩缓,我是刑警寧澤雪情,帶...
    沈念sama閱讀 35,823評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站你辣,受9級(jí)特大地震影響巡通,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜舍哄,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,483評(píng)論 3 331
  • 文/蒙蒙 一宴凉、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧表悬,春花似錦弥锄、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,026評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至饭庞,卻和暖如春戒悠,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背舟山。 一陣腳步聲響...
    開封第一講書人閱讀 33,150評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工绸狐, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人捏顺。 一個(gè)月前我還...
    沈念sama閱讀 48,415評(píng)論 3 373
  • 正文 我出身青樓六孵,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親幅骄。 傳聞我的和親對(duì)象是個(gè)殘疾皇子劫窒,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,092評(píng)論 2 355

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