亚洲欧洲久久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亚洲精品_开心色91 | 国产a∨国片精品青草视频_在线观看成人无码AV_欧美三级日本三级_日本激情视频一区_老司机精品线观看视频_久久精选_国产在线日韩欧美_又色又爽视频 | 曰韩观看免费_yellow高清免费观看日本_欧美伦理一区二区三区_无码AV无码一区二区桃花岛_亚洲一区二区制服在线_性8sex8亚洲网友自拍_69综合精品国产二区无码_在线免费观看v片 | 色伊人色_中国一级毛片免费观看_国产无套精品一区二区_绝顶高潮videos_在线视频免费观看www_在厨房拨开内裤进入毛片_日穴视频在线观看_被公连续侵犯中文字幕 | caoporm-超频在线视频_欧美欧美欧美欧美首页_国产精品18久久久久久首页狼_91丨porny丨_高潮av在线_一级空姐毛片_女教师の爆乳bd在线观看_丁香婷婷综合激情五月色 | caoporn超碰cao12_亚洲欧美另类一区_97人伦影院A级毛片_亚洲色成人一区二区三区小说_日韩精品一区二区三区高清免费_美女久久视频_一区二区三区国产视频_黑人上司粗大拔不出来 | 女人久久久_亚洲视频在线网_和大佬在一起的三百六十五天免费观看_久久99精品久久久久久秒播九色_免费无码又爽又刺激动态图_曰韩一二三区_亚洲日本成人在线观看_日韩美女在线观看 | 国内精品女同女同一区二区三区_日韩处女网站_好男人在线社区www在线影院_国产福利资源_曰的好深好爽好紧的视频_午夜狠狠干_亚洲欧美最新_日本视频免费看 | 高级毛片_521av永久免费网_日韩国产欧美亚洲v片_欧美xxxav_麻豆精品A片免费观看_一级毛片免费毛片一级毛片免费_女人18毛片水最多_青草久久精品 | 成人网中文字幕_国产精品无码在线_CHINESE熟妇与小伙子MATURE_亚洲一区二区久久久_丰满少妇免费做爰大片人_亚色九九九全国免费视频_亚洲国产精品999久久久婷婷_欧美日韩一区二区三区在线视频 | 久久天堂av综合色无码专区_夜夜爽影院_色呦呦免费看_四虎在线看_成人人人人人欧美片做爰_欧美高清欧美aⅴ片_久久久久久久99精品欧美产片_青青青伊人色综合久久 | 麻豆精品视频在线播放_在线看免费av_亚洲精品无码国产片_1024最新合集_国产破外女出血视频_操操操操网_国产JIZZ中国JIZZ免费看_无码日韩人妻AV一区 46集连续剧免费观看_又摸又揉又黄又爽的视频_国产50部艳色禁片无码_中文字幕在线轮第一页_国产无遮挡裸体免费视频A片_欧美一区二区二区_在线免费观看毛片视频_av高清在线观看 | 久久午夜夜伦鲁鲁一区二区_国产成人精品不卡_九色精品视频在线观看_无码一区二区三区不卡AV_久久久久高清视频_狠狠色噜噜狠狠狠狠888奇米_无码人中文字幕_红桃TV.欧美国产 | 夜鲁夜鲁很鲁在线视频视频_深夜福利免费看_天天骑天天干_亚洲精品无码一区二区四区_天天爽夜夜爽成人爽_欧美视频色_996热re视频精品视频这里_天天摸夜夜添夜夜无码 | 国产精品原创巨作av_馬与人黃色毛片一部_91成人品_国产一极内射視颍一_一级国产_日日日日干干干干_啪视频网站_裸体久久女人亚洲精品 | 欧美成年视频_青青草免费在线观看视频_亚洲精品久久草草起碰_日韩中文字幕成人免费视频_肥大BBWBBW高潮喷水_久久AV无码专区亚洲AV桃花岛_国语一级片_日本一区二区不卡高清更新 | 中文无遮挡h肉视频在线观看_亚裔av_亚洲人成网站999久久久综合_亚洲一区二区三区四区五区不卡_99精品人妻少妇一区二区_国产又爽又黄又不遮挡视频_999久久国精品免费观看网站_国内精品人妻无码久久久影院蜜桃 | 日本天天躁狠狠躁噜噜噜_av无码免费岛国动作片片段_丁香五月激情综合激情综合激情_久草视频看看_小小拗女一区二区三区_亚洲免费av第一区第二区_久章草在线精品视频免费观看_老师好湿好紧我要进去了在线观看 | 性欧美8处一14处破_a级毛片在线看日本_91视频免费视频_亚洲AV永久无码天堂网毛片_欧美熟妇色ⅹxxx欧美妇_成人在色线视频在线观看免费大全_精品一区在线_免费看一及片 | 亚洲AV成人无码人在线观看堂_疾速追杀4免费高清完整在线观看_亚洲国产初高中生女AV_末成年女AV片一区二区丫_日韩欧美一级二级_成全免费高清观看_午夜免费视频福利_欧美久久一级特黄毛片 | 亚洲中文字幕伊人久久无码_亚洲欧洲专线一区_国产午夜精品一区_日日日操_国产成人无码精品久久灭火器_人成午夜免费视频在线观看_成人性生交无码免费看_尤物丰满少妇大尺度喷血写真 | 飘雪影院手机免费观看免费动漫_国产五十路毛片_a级毛片_欧产日产国产精品乱噜噜_亚洲日本国产精品_久久超乳爆乳中文字幕_囯产精品一品二区三区_国产精品精品自在线拍 | 91狠狠狠狠狠狠狠狠_国产不卡一区在线_国产自国产一二三区高清在线_免费亚洲视频在线观看_久久精品欧美一区二区三区不卡_99久久精品国产交换_欧美日韩人妻精品一区二区在线_国产免费看av | 把女的下面扒开添视频_国产精品亚洲二区在线播放_无码AV岛国片在线观看免_精品久久久网站_国产一区免费播放_亚洲小视频网站_91久久久亚洲精品_欧美一级片久久 | 少妇88久久中文字幕_久久a级毛片免费观看_国产成人精品日本亚洲网站_在线观看av一区二区_色悠久久久久久久综合网_国产免费踩踏调教视频_xxxx另类黑人_涩涩婷婷 | 亚洲精品国产a_国产麻豆乱子伦午夜视频观看_a级大片_久久精品国产91精品亚洲高清_日韩免费视频中文字幕_亚洲AV成人一区二区三区_芒果视频91_高潮一区二区 | 人妻少妇精品无码专区二区_优酷在线观看_午夜影剧_国产无遮挡18禁无码网站免费_av黄色小说_日本免费不卡一区二区_日韩中字在线观看_国产精品外围在线观看 69ww免费视频播放_午夜影院伦理片_久久无码人妻一区二区三区_国产成人亚洲精品无码Av大片_国产在线欧美_重生男人_精品福利一区二区三区_www.久草 | 九色91视频_无码人妻aⅴ一区二区三区_国产高清成人久久_久久国产精品成人免费网站_97天天干_无码少妇一区二区三区免费_免费费很色视频大片_久荜中文字幕 | 成人无码午夜在线观看_福利视频三区_91超碰caoporm国产香蕉_亚洲精品综合久久中文字幕_国产农村妇女一区二区三区_91福利在线观看_美女被按在床上_亚州一区 | 久热国产精品视频_波萝蜜A毛黄AAA片_老师掀起裙子让我把j放进去视频_亚洲精品乱码久久久久膏_亚洲欧美一区二区三区_天天躁日日躁狠狠躁aab吃奶_美女又黄又免费视频_日韩无码系列综合区 | 太久ta19_免费看色网站_免费观看裸体美女网站_青春草91_国产欧美日韩在线视频_99热这里只有精品久久_国产精品自在拍在线播放_亚洲AV永久精品爱情岛论坛 | 日韩在线观看中文字幕_99青娱乐_日韩黄色_a级毛片黄免费a级毛片_欧美激情插插插_色情无码初拍人妻_91狠狠综合_亚洲四区在线 | 成年女人午夜毛片免费视频_日韩在线观看视频一区二区三区_一级免费播放_日本草逼视频_亚洲欧美日韩国产成人一区_麻豆最新网址_国产精品久久久久久久白丝_免费人成自慰网站 | 亚洲国产一区二区在线观看_欧美日韩在线第一页_美国一级毛片aa_精品一区二区三区的国产在线观看_无遮挡边摸边吃奶边做的视频刺激_亚洲国产成人精品福利在线观看_99精品99久久久久久宅男_黄色在线观看视频网站 | 国产精品综合不卡_亚洲最大成人在线视频_97caopor国产在线视频_91在线国产观看视频_最猛黑人熟妇性HDXXXX_大陆一级毛片免费看_99久久综合精品免费_欧美三级久久三级久久三级 亚洲av禁18成人毛片一级_三及片大全网日本_免费观看视频一区_欧美特黄视频在线观看_久久er热在这里只有精品66_在线观看高清不卡无码视频_国产九九热_一及毛片 | 国产日韩亚洲欧美主播精品_国产精品久久99精品毛片三a_日本黄色大片免费_91高清免费视频_亚洲AV片不卡无码久久wy193_天堂网在线最新版www_2021年国产精品每日更新_在线观看免费人成视频色9 | 国产区一区二区三_24小时免费看片_精品在线视频一区二区三区_精品久久国产精品_一个人看视频高清www俩个_久久精品1区_熟女泄火一区二区三区在线_日色视频 | 日本淫片免费啪啪3_成人片在线看_办公室扒开奶罩揉吮奶头视频_日韩福利二区_日本一级毛片免费看_www四虎影院_日日噜噜夜夜狠狠视频无码_91色影视 | 亚洲午夜久久久久_久久深夜福利_无人高清视频免费观看在线_免费a在线观看_日本老熟妇乱_日本视频一区二区在线观看_亚洲人成自拍网站在线观看_亚洲国产精品尤物yw在线 | 亚洲黄色小说图片_国产精品久久久久久久综合_色一乱一伦一图一区二区精品_免费gogo少妇大尺寸视频_欧美成免费A级毛片_伊人色吧_性猛交xxxx免费看蜜桃_亚洲第一伊人 | 麻豆911传媒_视色视频_91成品人网页进入入口_国产精品亚洲一区二区三区天天看_无码人妻aⅴ一区二区三区鲁大师_男人放进女人阳道动态图_久久久网站_99热99热99 |