亚洲欧洲久久av_极品美女国产精品免费一区_老司机网站免费_免费视频入口_人妻网站成熟人妻VA网站_福利视频网站

Laravel + Vue 使用示例系列:構建一個類似 Twitter 的 Web 應用
  • 更新時間:2025-04-17 10:22:17
  • 分享
  • 發布時間:7年前
  • 9143

在這一篇示例教程中,我們將會構建一個類似 Twitter 的 Web 應用。我們將使用到 Laravel 5.6 和 Vue.js,并且在 Vue.js 中定義一些組件,此外,還會使用 Axios 來發送網絡請求。當然,篇幅有限,我們不可能開發一個完整的 Twitter 應用,而是實現一個簡化版:用戶可以發送 Tweet 并在自己的時間線中看到,可以關注或取消關注其他用戶,如果關注了其他用戶,那么也可以看到關注用戶發布的 Tweet。麻雀雖小,五臟俱全,希望大家可以通過這個簡單的應用學會 Laravel 和 Vue.js 的基礎用法。

注:這是一篇翻譯文章,你可以將 Twitter 對標國內新浪微博,一條 Tweet 就是一條微博信息。

安裝配置 Laravel

首先,我們需要安裝一個新的 Laravel 應用(也可以通過 Composer 安裝,看個人喜好):

laravel?new?laratwitter

進入該項目根目錄,安裝前端依賴:

npm?install

接下來,修改?.env?中數據庫相關配置符合本地環境,然后通過如下命令生成用戶認證腳手架代碼:

php?artisan?make:auth

運行如下命令生成相關數據表:

php?artisan?migrate

接下來配置下 Web 服務器(使用 Valet 的話略過),我這里配置的域名是?laratwitter.test,配置完成后重啟下 Web 服務器,然后通過?http://laratwitter.test/register?注冊一個新用戶:

用戶注冊

接下來編輯?resoureces >> views >> home.blade.php?文件:

@extends('layouts.app')

@section('content')
<div?class="container">
????<div?class="row?justify-content-center">
????????<div?class="col-md-4">
????????????Tweet?表單
????????</div>
????????<div?class="col-md-8">
???????????時間線
????????</div>
????</div>
</div>
@endsection

新注冊用戶登錄后就能在新的 Home 頁看到變更后的效果了。

創建一個 Tweet 表單

我們使用 Vue.js 來完成表單創建,首先到?resources >> assets >> js >> components?目錄下新增一個?FormComponent.vue?文件:

//?FormComponent.vue

<template>
????<div?class="col-md-4">
????????<form>
????????????<div?class="form-group">
????????????????<textarea?
????????????????????class="form-control"?
????????????????????rows="8"?cols="8"?
????????????????????maxlength="130"?
????????????????????required>
????????????????</textarea>
????????????</div>
????????????<div?class="form-group">
????????????????<button?class="btn?btn-primary">
????????????????????發送
????????????????</button>
????????????</div>
????????</form>????????
????</div>
</template>
<script>
export?default?{

}
</script>

然后在?resources >> assets >> js >> app.js?中導入這個組件:

//?app.js

require('./bootstrap');

window.Vue?=?require('vue');

Vue.component('form-component',?require('./components/FormComponent.vue'));

const?app?=?new?Vue({
????el:?'#app'
});

最后在?home.blade.php?中使用這個組件:

@extends('layouts.app')

@section('content')
<div?class="container">
????<div?class="row?justify-content-center">
???????<form-component></form-component>
????????<div?class="col-md-8">
????????????TimeLines
????????</div>
????</div>
</div>
@endsection

為了監聽前端資源變動,可以在項目根目錄下運行如下命令監聽前端資源變動并實時編譯:

npm?run?watch

這樣,刷新?http://laratwitter.test/home?頁面就可以看到變更后的效果了:

用戶主頁

創建 Post 模型類及對應數據庫遷移文件

下面我們來實現表單提交保存操作,首先創建一個模型類及對應數據庫遷移文件:

php?artisan?make:model?Post?-m

編寫剛生成的數據庫遷移文件?create_posts_table.php

//?create_posts_table

public?function?up()
{
???Schema::create('posts',?function?(Blueprint?$table)?{
???????$table->increments('id');
???????$table->integer('user_id')->unsigned();
???????$table->string('body',?140);
???????$table->timestamps();

???????$table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
????});
}

運行數據庫遷移命令:

php?artisan?migrate

現在可以在數據庫中看到剛創建的?posts?數據表了。

接下來創建控制器?PostController

php?artisan?make:controller?PostController

定義關聯關系

在?User?模型類中,我們需要定義一個關聯方法建立?Post?模型和?User?模型之間的關聯關系(一對多):

public?function?posts()
{
???return?$this->hasMany(Post::class);
}

相應地,在?Post?模型類中,也要定義與?User?模型的關聯關系:

public?function?user()
{
???return?$this->belongsTo(User::class);
}

在數據庫中保存 Tweet

前面提到我們將通過?axios?庫來發送 POST 請求到 Laravel 后端服務器,這個庫在我們運行?npm install?命令的時候已經安裝好了,在開始處理請求發送與處理之前,我們先來定義請求路由,在?routes >> web.php?文件中新增一個路由定義如下:

Route::post('tweet/save',?'PostController@store');

此外,還需要定義?Post?模型類的?$fillable?屬性來避免批量賦值異常:

protected?$fillable?=?['user_id',?'body'];

最后要做的準備工作就是到?PostController.php?中定義?store?方法:

public?function?store(Request?$request,?Post?$post)
{
????$newPost?=?$request->user()->posts()->create([
????????'body'?=>?$request->get('body')
????]);

????return?response()->json($post->with('user')->find($newPost->id));
}

我們使用了關聯關系來保存 Post 數據,它會自動將當前登錄用戶的?id?作為保存 Post 的?user_id?字段。

后端邏輯實現之后,接下來需要使用?axios?庫類發送 POST 請求,我們將相應邏輯寫到?FormComponent.vue?組件中:

//?FormComponent.vue

<template>
????<div?class="col-md-4">
????????<form?@submit.prevent="saveTweet">
????????????<div?class="form-group">
????????????????<textarea?
????????????????????class="form-control"?
????????????????????rows="8"?cols="8"?
????????????????????maxlength="130"
????????????????????v-model="body"
????????????????????required>
????????????????</textarea>
????????????</div>
????????????<div?class="form-group">
????????????????<button?class="btn?btn-primary">
????????????????????Tweet
????????????????</button>
????????????</div>
????????</form>????????
????</div>
</template>
<script>
export?default?{
????data()?{
????????return?{
????????????body:?''
????????}
????},
????methods:?{
????????saveTweet()?{
????????????axios.post('/tweet/save',?{body:?this.body}).then(res?=>?{
????????????????console.log(res.data);
????????????}).catch(e?=>?{
????????????????console.log(e);
????????????});

????????}
????}
}
</script>

CSRF_TOKEN?會默認包含到每個 POST 請求,所以不必手動添加。現在,如果一切正常工作的話,你就可以成功保存 Post 數據并在響應中獲取到 Post 對象及其關聯用戶:

發送Tweet

創建一個 Vue 事件

要想在前端顯示所有 Tweet,首先需要將它們顯示到時間線中,為此,我們需要創建一個事件。注意,這里不是要通過刷新頁面來獲取所有 Tweet,而是當我們添加一條新的 Tweet 時,在不刷新頁面的情況下在用戶時間線中顯示這條 Tweet。

為了實現這個功能,需要創建一個事件并觸發這個事件,我們通過時間線組件來監聽事件觸發并基于該事件更新 UI。可以通過?Vuex?來實現該功能,但是現在,我們不想要深入存儲和動作,只想將事情保持簡單。

在?resources >> assets >> js?目錄下創建一個名為?event.js?的文件,并編寫代碼如下:

//?event.js

import?Vue?from?'vue';
export?default?new?Vue();

然后將該文件導入?FormComponent.vue

//?FormComponent.vue

<template>
????<div?class="col-md-4">
????????<form?@submit.prevent="saveTweet">
????????????<div?class="form-group">
????????????????<textarea?
????????????????????class="form-control"?
????????????????????rows="8"?cols="8"?
????????????????????maxlength="130"
????????????????????v-model="body"
????????????????????required>
????????????????</textarea>
????????????</div>
????????????<div?class="form-group">
????????????????<button?class="btn?btn-primary">
????????????????????Tweet
????????????????</button>
????????????</div>
????????</form>????????
????</div>
</template>
<script>
import?Event?from?'../event.js';
export?default?{
????data()?{
????????return?{
????????????body:?'',
????????????postData:?{}
????????}
????},
????methods:?{
????????saveTweet()?{
????????????axios.post('/tweet/save',?{body:?this.body}).then(res?=>?{
????????????????this.postData?=?res.data;
????????????????Event.$emit('added_tweet',?this.postData);
????????????}).catch(e?=>?{
????????????????console.log(e);
????????????});
????????????this.body?=?'';
????????}
????}
}
</script>

這樣,當新提交數據被保存后,就可以觸發包含保存的 Tweet 和用戶信息的事件,監聽該事件的監聽器就可以捕獲數據并更新 UI。

創建時間線組件

接下來,我們來定義監聽 Tweet 發送成功事件的監聽器。

在?resources >> assets >> js >> components?目錄下新增一個?TimelineComponent.vue?組件,編寫該組件代碼如下:

//?TimelineComponent.vue

<template>
????<div?class="col-md-8?posts">
????????<p?v-if="!posts.length">No?posts</p>
????????<div?class="media"?v-for="post?in?posts"?:key="post.id">
????????????<img?class="mr-3"?/>
????????????<div?class="media-body">
????????????????<div?class="mt-3">
????????????????????<a?href="#">{{?post.user.name?}}</a>
????????????????</div>
????????????????<p>{{?post.body?}}</p>
????????????</div>
????????</div>
????</div>
</template>
<script>
import?Event?from?'../event.js';

export?default?{
????data()?{
????????return?{
????????????posts:?[],
????????????post:?{}
????????}
????},
????mounted()?{
????????Event.$on('added_tweet',?(post)?=>?{
????????????this.posts.unshift(post);
????????});
????}
}
</script>

這里我們定義了一個監聽?added_tweet?事件的監聽器,當該事件被觸發后,就可以執行相應的方法將數據渲染到時間線組件中。

和?FormComponent.vue?組件一樣,在?app.js?中注冊這個組件:

Vue.component('timeline-component',?require('./components/TimelineComponent.vue'));

我們專注高端建站,小程序開發、軟件系統定制開發、BUG修復、物聯網開發、各類API接口對接開發等。十余年開發經驗,每一個項目承諾做到滿意為止,多一次對比,一定讓您多一份收獲!

本文章出于推來客官網,轉載請表明原文地址:https://www.tlkjt.com/marketing/77.html
推薦文章

在線客服

掃碼聯系客服

3985758

回到頂部

主站蜘蛛池模板: 国产成人片视频一区二区_91精彩视频_一二三区视频在线_亚洲区综合区小说区激情区_健身房啪啪的av片_国产色视频_亚洲高清国产精品_日韩精品欧美一区 | 亚洲欧美日本国产_日本aaaa大片免费观看入口_久久97超碰_中文字幕无码久久精品青草_国产成人AV综合亚洲色欲_一区二三区日韩精品_久操精品在线_久久专区 | 国产又大又硬又粗_黄色一级片免费看_成年女人免费视频播放人_日日噜噜噜夜夜爽爽狠狠视频97_国产精品第100页_在线免费观看h视频_秀人顶级模特尤妮丝的最新视频_中文字幕在线观看亚洲日韩 | 国产精品96久久久久久久_在线免费观看av网站_黄色真人毛片_国产免费永久在线观看_AB无码精品一区二区三区人妖_国产精品人人做人人爽人_日韩成人极品在线内射3p蜜臀_无码专区男人本色 | 成人激情自拍_国产传媒原创_99在线视频网站_一本色道久久HEZYO无码_日本精品一区二区三区四区_中国凸偷窥XXXX自由视频妇科_蜜桃精品成人影片_欧洲a视频 | 成人网在线播放_亚洲熟妇国产熟妇肥婆_成人无码区免费视频_久久国产大片_好爽好大久久久级淫片毛片小说_忘忧草日本在线WWW日本_中国白嫩精品bbwbbw_亚洲熟妇av午夜无码不卡 | 91jq激情_国产在线91精品入口首页_国产一区二区三区乱码在线观看_91国在线高清视频_日本一区二区免费在线观看_色综合天天综合网国产成人综合天_天天操中文字幕_国产视频色 | 私人影院在线观看视频_国产色视频网站免费_八戒八戒神马影院在线4_国产高清视频色拍_免费日本一区二区_天天做天天爱天天综合网2021_毛片av免费观看_99在线精品视频观看免费 | jj男色网_正在播放长泽梓免费观看_7777888色淫网站免费视频_亚洲午夜精品视频_国产日韩在线_午夜A片免费_亚洲字幕AV一区二区三区四区_不卡av中文字幕手机看 | 免费观看国产精品视频_欧洲美女粗暴牲交视频免费_香蕉影院在线_国产区精品福利在线社区_一区二区三区影视_亚州激情_69影院少妇在线观看_国产三级精品三级男人的天堂 | 久久亚洲色WWW成人_无码国内精品久久人_国产精品亚洲片在线观看不卡_亚洲狠狠婷婷久久久四季av_国产原厂视频在线观看_成人国产精品免费观看视频_国产精品一区二区在线蜜芽TV_131mm亚洲国产精品久久 | 亚洲免费天堂_欧美一级淫片免费午夜视频_国产精品色在线_日日夜夜香蕉_九九福利视频_2022精品久久久久久中文字幕_欧美在线爱_国产精品视频麻豆 | 国产成人女人在线观看_超碰在线a_欧美一区二区在线看_欧美精品第十页_日韩av黄色网址_日本新janpanese乱熟_国内毛片免费看_色综合久久网 | 日本真人做人爱一区二区三区_在线成人免费网站_精品美女一二三区_久久国产精品亚洲一区二区_特a毛片_欧美日本中文字幕_欧美多人乱大交xxxxx_亚洲国产婷婷影院 | 日韩国产欧美在线观看_蜜桃免费在线视频_亚洲国产系列_日韩av激情在线观看_日本e片色视频_一区二区三区资源_国产成人av大片在se_久久999精品 | 精品一二三区视频_天天激情综合_国产高潮呻吟久久_国内精品在线一区_91精品国产色综合久久久蜜臀_综合在线视频_国产成人精品午夜福利_国产av无码专区亚洲av软件 | 2018av天堂在线视频精品观看_特级毛片aaaa级毛片免费_免费观看久久久_免费视频一区二区_大地资源在线视频在线观看_欧洲少妇性喷潮_精品亚洲va在线va天堂资源站_国产免费一区二区三区播放 久久综合久久精品_人人妻人人澡人人爽人人精品AV_97久久夜色精品国产九色_老司机深夜福利视频_无码人妻精品1国产婷婷_china直男gay国产_色妹子综合网_最近最新中文第一页 | 日本爆乳片手机在线播放_凹凸世界第三季免费_久久人人槡人妻人人玩夜色AV_国产白嫩受无套呻吟_国产最新精品_精品久久久久久一区二区里番_国产又黄又大又粗视频_在线观看视频网站www色 | 小姨在线_亚洲V国产V天堂A无码二区_囯产精品久久久久久久久久妞妞_国产三级欧美三级_日韩一区二区国产_一级黄色免费观看_免费做人爱高潮1000视频_国产情侣无套精品视频 | 51ⅴ精品国产91久久久久久_亂倫近親相姦中文字幕视频_怡红院成永久免费人视频视色_国产无套露脸视频在线观看_av之家免费黄片_美女天天干_国产在线观看a视频_国产区二 | 日日摸夜夜添夜夜躁好吊_千金不装了短剧免费观看_国产亚洲精品美女久久久久久久久久_亚洲国产一区av_亚洲三及片_亚洲国产午夜精品_国产精选免费视频_人人揉人人捏人人爽五月天 | 99色免费视频_亚洲精品乱码久久久久久久_99ee6热久久免费精品6_av片在线免费_www.日本不卡_无码爆乳超乳中文字幕在线_色综合.com_亚洲色婷婷久久精品AV蜜桃小说 | 91麻豆久久_美女视频黄又黄又免费高清_国产91精品高清一区二区三区_小娇孩性freesexhd_国产一区影院_欧美日在线播放_久久成人免费精品网站_国产自偷亚洲精品页65页 | 成人三级做爰视频在线看_无毒不卡在线观看_91在现看_欧美日韩一区二区三区精品_区区区区区区7777_极品少妇被猛得白浆直流草莓视频_91精品在线播放视频_视频一区视频二区视频 免费a在线看_黑人30厘米少妇高潮全部进入_久久国产午夜精品理论片_国产精品视频1区_夜夜爱爱_麻豆免费进入_亚洲色大成网站WWW永久_亚洲第一区精品 | 国产又黄又爽胸又大免费视频_日日干夜夜爽_女人和男人视频网站_97中文字幕第二十二页_亚洲第一网站男人都懂_女人夜夜春高潮爽A∨片传媒_精品一卡2卡三卡4卡免费网站_亚洲精品久久AV无码蜜桃第1集 | 亚洲一区二区三区AV在线观看_黄色一级视屏_日韩欧美精品二区_精品国产区一区二_亚洲午夜激情影院_www九色_久久精品国产视频_aV性色在线乱叫 | 美国一级在线观看_欧美在线观看19_中文无码vr最新无码av专区_国产明星xxxx精品hd_在线偷拍自拍_91天天_区二区欧美性插b在线视频网站_人妻系列AV无码专区 | 色综合视频一区二区三区44_欧美狠狠操_国产美女久久_国产三级精品三级在_手机看片日韩欧美_看亚洲毛片_欧美日韩一区二区在线播放_亚洲区精品3d国漫同人 | 五月天国产成人av免费观看_日本黄色片一区二区_成人三级黄色免费网站_亚洲热影院_十四以下岁毛片带血a级_992tv国产精品福利在线_melody在线观看_色七七久久影院 | 日本最新一区二区三区视频观看_蜜桃视频麻豆_亚洲国产日韩A在线播放_亚洲女av_免费日本在线观看_91精品视频在线免费观看_久久久久久蜜桃一区二区_成人在线国产 | 欧美日韩激情一级_自拍在线观看_九色国产在线观看_欧美一区二区三区久久久精品_一区二区午夜_国产精品视频一区在线观看_久久精品人妻无码专区_国产专区免费av无码 | 亚洲成本人无码薄码区_中日字幕大片在线播放_一级毛片免费播放_无码人妻H动漫中文字幕_亚洲黄色a_国产自在自线午夜精品视频_成人国产免费软件_日韩av一区二区三区四区 | 色伊人色_中国一级毛片免费观看_国产无套精品一区二区_绝顶高潮videos_在线视频免费观看www_在厨房拨开内裤进入毛片_日穴视频在线观看_被公连续侵犯中文字幕 | 激情在线视频网站_日韩午夜在线观看_97精品伊人久久久大香线蕉_久久夜色精品亚洲噜噜国产mv_蜜桃嫩草_日本黄色天堂_国产69精品久久久久9999APGF_成人黄色视频免费观看 | 成人毛片视频在线观看_国产精品自在在线免费_快播看片毛网站_亚洲成a人片777777久久_人与人一级毛片_日本波多野结衣在线_超碰人人擦_日韩欧美久久久久久久999按摩 | 私人影院在线观看视频_国产色视频网站免费_八戒八戒神马影院在线4_国产高清视频色拍_免费日本一区二区_天天做天天爱天天综合网2021_毛片av免费观看_99在线精品视频观看免费 | 欧美日韩国产影院_日日爱影院_国产成人精品av_97澡人人澡人澡人人澡天天_国内成人综合_日本不卡一区二区三区_国产精品亚洲综合一区在线_久草伦理 | 精品一区精品二区制服_av视在线_久久久综合久久_少妇的bbw性大片_免费理论_日操操夜操操_免费99精品国产自在在线_亚洲色图综合区 | 91福利一区二区_78色淫网站女女免费_一级黄色视频久久网_青草精品视频_伊人75在线_麻豆私人影院_亚洲欧洲日产国码综合在线_三级免费网址 | 九色免费视频_国产精品一区二区亚洲_www.久久综合_亚洲九九影院_日本国产免费_狠狠色噜噜狠狠狠狠色综合久AV_亚洲精品美女久久777777_中文一区二 | 欧洲一区在线观看_妞干网免费_一区二区国产日产_超碰aⅴ人人做人人爽欧美_国产又黄又硬又湿又黄的_欧美午夜无码大片免费看_久热精品视频在线播放_亚洲无亚洲人成网站77777 |