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

回到頂部

主站蜘蛛池模板: 超碰二区_精品剧情V国产在线观看_色屁屁WWW免费看欧美激情_国产美女裸体丝袜喷水视频_免费又黄又爽又猛大片午夜_在线黄色av网站_国产91白丝在线播放_高潮喷水的网站 | 亚洲高清视频一区二区三区_四虎永久免费观看在线_5566成人_欧美日韩一道本_色小妹三区_久久综合久久综合九色_网友自拍露脸国语对白_日韩手机视频 | 午夜老司机av_在线观看免费黄色小视频_欧美亚洲一级片_大胸美女被吃奶爽死视频_精品国产第一区二区三区的区别_一级毛片一级黄片_CHINESESPANK国产免费网站_国产露脸精品产三级国产av | 日本一级中文字幕久久久久久_特级做a爰片免费看一区_精品视频日韩_国产成人精选在线观看不卡_91夜夜蜜桃臀一区二区三区_久久久视频在线_一级毛片大片_自拍偷区亚洲国内自拍蜜臀 | h无码精品动漫尤物_亚洲亚洲人成网站网址_又黄又爽又无遮挡免费的网站_另类免费视频_国产强奷女交警在线播放_国产清纯91天堂在线观看_日本福利视频一区二区三区_健身教练啪啪偷拍一区二区 | 亚洲AV中文无码乱人伦在线咪咕_久久人人玩人妻潮喷内射人人_岛国一级毛片_成人性生交大片免费看5_色香蕉在线_刮伦人妇a片1级_亚洲午夜精品A片一区二区三区_18禁污污网站国产 久久爽久久爽久久av东京爽_成人日韩精品_脱了老师内裤猛烈进入的软件_欧洲国产精品精华液_国产乱子伦精品无码专区_亚洲一卡二卡三卡四卡无卡网站_蜜桃av在线_97精华最好的产品在线 | 亚洲毛片一区二区_天天爱天天做天天添天天欢_黄视频福利_午夜影皖精品av在线播放_国产精品免费一区二区区_乱肉妇精品av_浮生影视在线观看免费_大波妺av网站影院 | 人人爱人人做_日韩亚洲视频在线_秋霞成人午夜伦在线观看_国产在线精品无码AV不卡顿_日韩中文字幕亚洲一区二区va在线_吉吉天堂_欧美另类图区清纯亚洲_亚洲va欧美va日韩va成人网 | 中日黄色一级片_国产护士在线观看免费_日韩中文字幕网_91p亚洲_色窝窝51精品国产人妻消防_国产一区二区丁香婷婷_国产乱淫片视频_999精品国产人妻无码系列 | 97视频在线看_亚洲国产成人私人影院tom_5060网免费午夜8050_欧美一二三四_日本高清在线一区二区三区_欧美久久一级片_精品一区二区三区四区蜜桃_00粉嫩高中生洗澡偷拍视频 | 97亚洲色欲色欲综合网_操操影视_成人一区二区三区在线观看_久久久久国产一区二区三区不卡_黄色片aaaa_麻豆传媒免费网站_色第一页_久久久成人网 | 曰曰摸天天添天天湿_欧美日韩国产限制_av中文字幕一区_国产传媒av在线_亚洲一区二区三区四区av_国产精品露脸国语对白_久久无码中文字幕东京热_欧美野战 | 播五月开心婷婷欧美综合_亚洲av午夜成人片动漫番_日本久久综合网_夜色资源网站ye321_新版天堂资源中文www官网_国产精品嫩草影院免费_久久精品福利_男人的天堂av社区在线 | 久久久乱码精品亚洲日韩_成人特级毛片_国产精品素人一区二区_2018国产在线视频_看欧美ab黄色大片视频免费_free性丰满白嫩白嫩的hd_日本一级片在线观看_日本在线免费 | 亚洲性生活片_国产一二三四区在线_邻居少妇人妻互换_久久99精品国产自在现线小黄鸭_伊人夜色_亚洲日韩日本中文在线_久久精品亚洲热_国内自产拍自拍A免费毛片 | 中文日韩在线视频_无码毛片一级高潮免费视频_毛片黄片_国产成人在线网址_国产特级全黄一级毛片_免费观看在线毛片_人人妻人人澡人人爽超污_日韩欧美国产系列 | 国产精品草草在线观看_国产成人亚洲影院在线播放_亚洲一二三四区不卡_黄频视频在线观看_性欧美极品另类_免费在线看一区_人妻无码精品久久亚瑟影视_息与子五十路中文字幕 | 欧美xxxx做受欧美_久久青青草原国产毛片_亚洲综合伊人_久久精品国产99国产精品亚洲_不卡一不卡二不卡三_男人女人真曰批视频播放在线_91高清视频在线免费观看_太大太粗太爽免费视频 | 亚洲午夜久久久久_久久深夜福利_无人高清视频免费观看在线_免费a在线观看_日本老熟妇乱_日本视频一区二区在线观看_亚洲人成自拍网站在线观看_亚洲国产精品尤物yw在线 | 玩偶姐姐在线观看_91福利在线视频_在线视频91_不卡久久_7777欧美日激情日韩精品_欧美日韩精品免费_国产精品视频大全_斗罗大陆3龙王传说第四季免费观看 | 国产福利一区二区三区在线播放_中文字幕久精品免费视频_毛片a在线_精品黄色视_免费观看韩国理论片_成人免费A级毛片无码_一级免费看_中文字幕永久免费 | 国产成人亚洲综合_在线观看免费不卡avav_国产精品揄拍一区二区久久_97无码人妻福利免费公开在线视频_chinesepronhdvideos国产91_青青草国产成人a∨_91久久国产视频_欧美成人福利 | 亚洲伦理在线_国产亚洲一级高清_国产精品男人的天堂_爱操视频在线观看_九色精品免费永久在线_99热这里只精品_国产欧美熟妇另类久久久_欧美182国产在线视频 | 欧美激情第1页_欧美506070老妇乱子伦_东南亚一级毛片_午夜嘿咻_久久图库99图库_精品国产人妻一区二区三区_色夜影院_欧美另类一二三四 | 亚洲国产欧美不卡在线观看_日韩色综合_国产爆乳无码av在线播放_粉粉嫩av一区二区三区四区_亚洲国产成人va在线观看_天天拍夜夜爽_久久久久久噜噜噜久久久精品_欧美久久国产精品 | 视频二区国产_欧美一级特黄视频_一本精品中文字幕在线_久久久久久精品一区二区三区日本_亚洲午夜精_18禁免费无码无遮网站国产_亚洲色素色无码专区_欧美午夜精品久久久久久人妖 | 色伊人色_中国一级毛片免费观看_国产无套精品一区二区_绝顶高潮videos_在线视频免费观看www_在厨房拨开内裤进入毛片_日穴视频在线观看_被公连续侵犯中文字幕 | 美女乱淫aaa视频_四虎四虎_麻豆少妇_欧美日韩亚洲免费_可以免费看av的网址_天天操综合网_亚洲精品无人一区二区_久久在草 | 夜夜狠狠干_日韩不卡中文字幕_欧美一区不卡_av中文在线资源_久久日本_欧美日韩在线视频_国产一区精品最新_色狠狠综合网 | 久久久久久久波多野结衣高潮_殴美在线一区二区不卡_不戴奶罩的教师水卜樱在线观看_撕开奶罩揉吮奶头高潮av_亚洲精品aⅴ_久天啪天天久久99久久_成人午夜激情视频_免费的av在线 | JLZZJLZZ全部女高潮_国产成人久久AV免费看_国产边打电话边被躁视频_欧美大黄大色一级毛片_韩国av网站在线观看_免费特级婬片日本高清视频_男人天堂2023_不卡精品 | 欧美熟妇bb_国产乱子伦视频一区二区三区_色婷婷五月综合久久_午夜无码免费福利视频网址_亚洲成色av网站午夜影视_东京无码熟妇人妻AV在线网址_极品一区_91久久精品久久国产性色也91 | 青青青国产依人在线_亚洲国产无色码在线播放_男女好痛好深好爽视频_亚洲欧美一区在线观看_天天爽天天狠久久久综合麻豆_日韩人妻无码喷潮中出_亚洲大香线伊人婷婷五月_天天夜天天操 | 欧洲免费无线码在线一区_成人三级影院_蜜桃视频精品_中国一级毛片在线播放_久久久久人妻一区精品性色AV_野花社区www视频最新资源_中文字幕无线乱码人妻_a黄色大片 | 91天堂国产在线_中文字幕日日_日韩欧精品无码三级片_成人夜间福利_无码专区天天躁天天躁在线_在线观看青青草_精品一区精品二区_亚洲美女视频一区二区 | 涩五月婷婷_国产精品多久久久久久情趣酒店_国产精品sm在线观看_free男子游泳部第三季_热久久性_天天弄夜夜操_人人干日日操_龙珠z免费观看国语版 | 色综合a_日韩一区二区三区精品视频第3页_成人午夜片av在线看_国产华人av导航_欧美一区二区三区在线观看_欧美丰满熟妇XXXX_国产XXXX做受视频_91九色欧美 | 欧美成人黑人xx视频免费观看_毛片久久久久久_久久99视频这里只有精品_一区二区国产精品视频_九九九热精品_福利小视频在线_天天躁日日躁狠狠躁2021a1_精品无码国模私拍视频 | 艳母1-6在线播放_日韩精品一区二区久久_青青久草在线_三个男人躁我一个爽公交车上_国产在线欧美日韩精品一区_性国产丰满麻豆videosex_91亚洲影院_狠狠色综合色区 | 一级中文片_日本xxxxx高潮少妇_小13箩利洗澡无码免费视频_欧美一区自拍_多啪啪免费视频_国产剧情AV麻豆香蕉精品_日韩美精品视频_亚洲国产视频精品 | 四虎成人精品国产永久免费_一区二区欧美在线观看_少妇寂寞找男按摩师性M_久夜精品_国内精品国产三级国产_国产精品视频六区_成人性视频免费看的鲁片_黄片毛片免费看 |