亚洲欧洲久久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

回到頂部

主站蜘蛛池模板: 國產精品倫一區二區三級視頻_唐人街探案1免费播放_国产精品人妻99一区二区_在线精品国产一区二区三区_国产精品乱人伦_爽到憋不住潮喷大喷水视频在线_人妻激情偷乱视频一区二区三区_国产51人人成人人人人爽色哟哟 | 3344成人免费高清免费视频_国产乱码精品一区二区三区忘忧草_91精品国产色综合久久不卡蜜臀_黄色免费观看视频网站_无尺码精品日本欧美_日韩AV一中美AV一中文字慕_国产日本亚洲_人妻系列无码专区久久五月天 | 韩国中文字幕在线观看_国产在线看片网站_久久精品国产2019国产精品_成人免费8888在线视频_国产人无码a在线西瓜影音_91国语_全免费a级毛片免费看_神马视频在线观看 | 欧美熟妇性XXXXX_潜行者40集连续剧免费_一区二区免费在线视频_成人国产一区二区三区精品不卡_午夜影院免费观看_亚洲第一AV导航AV尤物_日韩精品亚洲精品第一页_国产精品欧美一区乱破 | 国产亚洲久_成人1区2区3区_99精品视频一区二区_四虎av永久免费观看_黄色毛片a级_色哟av_欧美日韩国产人妻无码_日韩不卡在线观看日韩不卡视频 | 久久精片_国产真人性做爰久久网站_久久精品亚洲成在人线av麻豆_成年人黄色一级片_国产亚洲第一页_2018日韩中文字幕_亚洲一区精品在线观看_久久2017 | 亚欧日韩在线_无码人妻丰满熟妇区毛片_开妇小嫩苞调教HHH嗯啊MTV_A级毛片在线视频免费观看_www.色99_日韩一区精品视频_丝袜美腿精品国产一区_国产91精品看黄网站 | 天天综合网7799精品视频_国产乱人伦偷精品视频_一精品久久久_辽宁人妻Chinese_99精品在线看_日本久久精品一区_国产素人在线观看_京香一区二区三区 | 日产中文字幕在线观看_男人肌肌捅女人肌肌视频_99精品在线_四虎国产精品成人_在线一级成人_国产一区二区怡红院_欧美另类久久久精品_欧美顶级METART裸体全部自慰 | 成人毛片视频在线观看_国产精品自在在线免费_快播看片毛网站_亚洲成a人片777777久久_人与人一级毛片_日本波多野结衣在线_超碰人人擦_日韩欧美久久久久久久999按摩 | 国内精品女同女同一区二区三区_日韩处女网站_好男人在线社区www在线影院_国产福利资源_曰的好深好爽好紧的视频_午夜狠狠干_亚洲欧美最新_日本视频免费看 | 亚洲AV成人午夜福利在线观看_成人国产在线视频_久久在现_黄色一级毛片儿_色中色登陆器_99久久无色码中文字幕人妻蜜柚_91日韩精品一区二区三区_久久精品欧美视频 | YY111111少妇无码理论片_视频免费观看的网站_精品熟女碰碰人人A久久_宅男66LU国产在线观看_性色av蜜臀av高清久久苏然_jizz香蕉视频_天天操天天睡_aaaa大片 | 亚洲国产精品久久人人爱_污导航在线观看_中文字幕高清在线播放_一区二区三区精_免费观看欧美日韩亚洲_可以免费看av_黄网十三区_精品人妻无码区在线视频 | 性色a∨人人爽网站_涩涩av_男女在一起拔萝卜免费视频大全_老司机亚洲精品影院无码_超碰人人香蕉_亚洲国产黄色片_911精品美国片911久久久_热久久久久香蕉无品码 | 亚洲黄色小说图片_国产精品久久久久久久综合_色一乱一伦一图一区二区精品_免费gogo少妇大尺寸视频_欧美成免费A级毛片_伊人色吧_性猛交xxxx免费看蜜桃_亚洲第一伊人 | 在线视频青青草_久久精品天天中文字幕人妻_7777色鬼XXXX欧美色妇_国产98色在线_国产乱人伦偷精品视频免_中文字幕乱码亚洲精品一区_精品久久久久久中文字幕一区二区_国产一卡三卡四卡无卡精品 | 欧美一级另类_亚洲欧美中文日韩av一区_中文字幕第6页_日本特级大片_a级小视频_欧美xxx在线_色.com_乱人伦中文视频在线观看 | 青青草激情视频_在线观看麻豆_综合自拍_成年国产_丝袜美女被出水一区_公车上玩弄白嫩少妇_亚洲成人日韩在线_午夜久久视频 | 美女午夜视频_91com视频_我要看黄色a级片_日本中文字幕日韩精品免费_国产aⅴ无码专区亚洲av麻豆_日日夜夜爽爽_国产精品与欧美交牲久久久久_亚洲hd | 久久综合九色综合国产_精品一区二区日韩_youjazz性欧美_中文字幕一区二区三A片_日韩大片在线永久观看视频网站免费_亚洲成人bt_成人性色生活片_在线观看一级 | 免费观看在线A毛片_亚洲中文字幕无码久久2017_老司机伊人网_一本色道久久综合狠狠躁的推荐_99久热在线精品国产观看_成人公开视频在线观看_欧美younv交_无限看片的视频高清在线 | 91在线精品视频观看_亚洲AV永久无码AV激情A片_日韩在线观看视频一区二区_888久久久_中文字幕精品亚洲无线码二区_久草不卡视频_91丨porny丨九色_av日韩中文 | 亚洲在线免费观看视频_野花社区观看在线www官网_热久久国产_亚洲国产精品无码观看久久_两个人的WWW免费视频_超乳爆乳上司在线观看_亚洲天堂一区在线观看_久久天天躁狠狠躁夜夜96流白浆 | 色网站在线视频_国产九色网站_成人免费视频国产_禁果av一区在线在观看_欧美暴力analvideos_在线观看中文字幕dvd播放_日韩精品资源二区在线_无码H肉3D动漫在线观看 | 国产精品国产精品偷麻豆_一级特黄视频_久久综合九色综合97婷婷_亚洲色图在线免费观看_极品少妇XXXX_久久国语_亚洲成人经典_久久99婷婷国产精品免费| 澳门久久精品_av免费播放网站_超碰99久久_亚洲高清成人_成人午夜网站_一级免费大片_成人看片在线观看_亚洲AV日韩AV在线观看 | www亚洲最大aⅴ成人天堂_国产精品视频1区2区3区_caoporn国产_91.久久_日韩av一区二区三区_日韩欧美亚洲综合久久_性xxxxfreexxxxx欧美牲交v_www.成色av久久成人 | 在线黑人抽搐潮喷_欧美日韩国产精品_亚洲欧美日韩成人综合一区_free性欧美人与dog_亚洲免费精品视频_4tube在线观看_久久精品日_69精品久久久久9999不卡片 | 亚洲人成a在线网站_久章草影院_亚洲av日韩av无码大全_影音先锋男人在线资源资源网_嫩草成人在线_欧美日本DVD一幕无码_成人影院www在线观看_FREE性欧美人与DOOG | 免费日韩在线视频_99久久精品免费精品国产_日韩亚洲一区在线_偷拍东北熟女BBWW_国内外免费激情视频_久久久伦理片_亚洲欧美日本国产不卡_欧美一区二区一级片 | 亚洲一区二区三区尿失禁_综合色婷婷一区二区亚洲欧美国产_91色精品秘19A片下_日韩欧美在线播放_亚洲一区二区国产_夜夜爽夜夜叫夜夜高潮_欧美一区二区三区片_爆乳2把你榨干哦无码 | 免费在线日本_毛片TV网站无套内射TV网站_不卡一本_国产日韩免费观看_久久久噜噜噜_久久久久久国产精品亚洲78_A一级片中文字幕_日韩中文字幕一区二区三区 | 国产一级片不卡_欧美操人_国产AV无码国产AV毛片_福利社一区_成人免费a级片_免费日本黄色片_亚洲一区二区视频在线观看_女人天堂在线a在线 | 一本一道久久a久久精品逆3p_内射精品无码中文字幕_午夜久久国产_免费av毛片不卡无码_天天躁夜夜躁狠狠综合2020_国产香蕉精品视频老妇_欧美一区二区三区蜜桃_色999在线 | 玖玖在线精品免费视_简单av自拍_毛片在线看网站_999精品网站_蜜桃在线播放_女生毛片_tube中国91xxxxx国产_欧美成人手机视频 | 人妻少妇精品专区性色av_中文字幕.av.在线_久久精品国产亚洲7777_av鲁丝一区鲁丝二区鲁丝三区_欧美大片18禁AAA免费视频_欧美第一页_99国产精品久久久久99打野战_国产精品无码无卡在线观看久 | 九九国产精品无码免费视频_亚洲国产日韩在线一区模特_传媒大片免费在线观看网站_免费一级毛片观看_亚洲免费av网站_欧美国产综合在线_日韩在线播放网址_2020年最新国产精品正在播放 久久久久久久波多野结衣高潮_殴美在线一区二区不卡_不戴奶罩的教师水卜樱在线观看_撕开奶罩揉吮奶头高潮av_亚洲精品aⅴ_久天啪天天久久99久久_成人午夜激情视频_免费的av在线 | 天天操天天干天天爽_hdsex麻豆_亚洲video_亚洲最大天堂无码精品区_黄色av影视_免费视频一区_久久综合在线_精品一区二区三区久久久 | 337P大胆日本欧美人体艺术噜噜噜_国产精品无码翘臀在线看_国产农村妇女毛片精品久久久_西西人体大胆午夜啪啪_91麻豆精品在线_亚洲一区网站_www.gogo38西西人体_日韩第六页 | 欧美人与ZOZOXXXX视频_欧美高清成人_成人国内毛片免费大战_久草视频精品_japan23xxxxhd乱_插插插操操操_午夜久久成人_日韩欧美五区 |