laravel5.3 vue 实现收藏夹功能实例详解


Posted in Javascript onJanuary 21, 2018

下面通过本文给大家介绍laravel5.3 vue 实现收藏夹功能,具体代码如下所述:

{
 "private": true,
 "scripts": {
 "prod": "gulp --production",
 "dev": "gulp watch"
 },
 "devDependencies": {
 "bootstrap-sass": "^3.3.7",
 "gulp": "^3.9.1",
 "jquery": "^3.1.0",
 "laravel-elixir": "^6.0.0-14",
 "laravel-elixir-vue-2": "^0.2.0",
 "laravel-elixir-webpack-official": "^1.0.2",
 "lodash": "^4.16.2",
 "vue": "^2.0.1",
 "vue-resource": "^1.0.3"
 }
}

​1.0.2 修改 gulpfile.js

将原来的 require('laravel-elixir-vue'); 修改为 require('laravel-elixir-vue-2'); ​

const elixir = require('laravel-elixir');​
require('laravel-elixir-vue-2');​
/*
 |--------------------------------------------------------------------------
 | Elixir Asset Management
 |--------------------------------------------------------------------------
 |
 | Elixir provides a clean, fluent API for defining some basic Gulp tasks
 | for your Laravel application. By default, we are compiling the Sass
 | file for our application, as well as publishing vendor resources.
 |
 */​
elixir(mix => {
 mix.sass('app.scss')
 .webpack('app.js');
});

1.0.3 修改 resource/assets/js/app.js

将原来的 el: 'body' 改为 el: '#app' ​

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

1.1 安装npm 模块

(如果之前没有执行此操作) ​

npm  install

laravel5.3 vue 实现收藏夹功能实例详解 

1.2 创建模型及迁移

我们需要一个User模型(laravel附带),一个Post模型和一个Favorite模型以及它们各自的迁移文件。 因为我们之前创建过了 Post 的模型,所以我们只需要创建一个 Favorite 模型即可。 ​

php artisan make:model App\Models\Favorite -m

laravel5.3 vue 实现收藏夹功能实例详解 

​​ 这会创建一个 Favorite

模型以及迁移文件。 ​

1.3 修改 posts 迁移表及 favorites 的 up 方法

给 posts 表在 id 字段后面新增一个 user_id 字段 ​

php artisan make:migration add_userId_to_posts_table --table=posts

修改 database/migrations/2018_01_18_145843_add_userId_to_posts_table.php

public function up()
 {
 Schema::table('posts', function (Blueprint $table) {
  $table->integer('user_id')->unsigned()->after('id');
 });
 }
database/migrations/2018_01_18_142146_create_favorites_table.php ​ 
public function up()
 {
 Schema::create('favorites', function (Blueprint $table) {
  $table->increments('id');
  $table->integer('user_id')->unsigned();
  $table->integer('post_id')->unsigned();
  $table->timestamps();
 });
 }

​ 该 favorites 表包含两列: ​

user_id 被收藏文章的用户ID。

post_id 被收藏的帖子的ID。

​ 然后进行表迁移

php artisan migrate

1.4 用户认证

因为我们之前就已经创建过了,所以这里就不需要重复创建了。

如果你没有创建过用户认证模块,则需要执行 php artisan make:auth ​

2. 完成搜藏夹功能

修改 routes/web.php

2.1 创建路由器

Auth::routes();
Route::post('favorite/{post}', 'ArticleController@favoritePost');
Route::post('unfavorite/{post}', 'ArticleController@unFavoritePost');
Route::get('my_favorites', 'UsersController@myFavorites')->middleware('auth');

2.2 文章和用户之间多对多关系

由于用户可以将许多文章标记为收藏夹,并且一片文章可以被许多用户标记为收藏夹,所以用户与最收藏的文章之间的关系将是多对多的关系。要定义这种关系,请打开 User 模型并添加一个 favorites() ​ app/User.php

注意 post 模型的命名空间是 App\Models\Post 所以注意要头部引入 use App\Models\Post; ​

public function favorites()
 {
 return $this->belongsToMany(Post::class, 'favorites', 'user_id', 'post_id')->withTimeStamps();
 }

​ 第二个参数是数据透视表(收藏夹)的名称。第三个参数是要定义关系(User)的模型的外键名称(user_id),而第四个参数是要加入的模型(Post)的外键名称(post_id)。 ​ 注意到我们链接withTimeStamps()到belongsToMany()。这将允许插入或更新行时,数据透视表上的时间戳(create_at和updated_at)列将受到影响。 ​ ​

2.3 创建文章控制器

因为我们之前创建过了,这里也不需要创建了。

如果你没有创建过,请执行 php artisan make:controller ArticleController ​

2.4 在文章控制器添加 favoritePost 和 unFavoritePost 两个方法

注意要头部要引入 use Illuminate\Support\Facades\Auth; ​

<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Models\Post;
use Illuminate\Support\Facades\Auth;
class ArticleController extends Controller
{
 public function index()
 {
 $data = Post::paginate(5);
 return view('home.article.index', compact('data'));
 }
 public function show($id)
 {
 $data = Post::find($id);
 return view('home.article.list', compact('data'));
 }
 public function favoritePost(Post $post)
 {
 Auth::user()->favorites()->attach($post->id);
 return back();
 }
 public function unFavoritePost(Post $post)
 {
 Auth::user()->favorites()->detach($post->id);
 return back();
 }
}

​2.5 集成 axios 模块

•安装axios ​

npm install axios --save

​•引入axios模块 resource/assets/js/bootstrap.js 在最后加入 ​

import axios from 'axios';
window.axios = axios;

2.6 创建收藏夹组件

// resources/assets/js/components/Favorite.vue
<template>
 <span>
 <a href="#" rel="external nofollow" rel="external nofollow" v-if="isFavorited" @click.prevent="unFavorite(post)">
  <i class="fa fa-heart"></i>
 </a>
 <a href="#" rel="external nofollow" rel="external nofollow" v-else @click.prevent="favorite(post)">
  <i class="fa fa-heart-o"></i>
 </a>
 </span>
</template>
<script>
 export default {
 props: ['post', 'favorited'],
​
 data: function() {
  return {
  isFavorited: '',
  }
 },
 mounted() {
  this.isFavorited = this.isFavorite ? true : false;
 },
 computed: {
  isFavorite() {
  return this.favorited;
  },
 },
 methods: {
  favorite(post) {
  axios.post('/favorite/'+post)
   .then(response => this.isFavorited = true)
   .catch(response => console.log(response.data));
  },
  unFavorite(post) {
  axios.post('/unfavorite/'+post)
   .then(response => this.isFavorited = false)
   .catch(response => console.log(response.data));
  }
 }
 }
</script>

2.7 视图中引入组件

在视图组件使用之前,我们先引入字体文件 resource/views/layouts/app.blade.php 头部引入字体文件 ​

<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css" />

​ 并在 app.blade.php 添加 我的收藏夹 链接 ​

// 加在logout-form之后
<form id="logout-form" action="{{ url('/logout') }}" method="POST" style="display: none;">
 {{ csrf_field() }}
</form>​
<a href="{{ url('my_favorites') }}" rel="external nofollow" >我的收藏夹</a>

​ 使用组件 ​

// resources/views/home/article/index.blade.php​
if (Auth::check())
 <div class="panel-footer">
 <favorite
  :post={{ $list->id }}
  :favorited={{ $list->favorited() ? 'true' : 'false' }}
 ></favorite>
 </div>

endif

​ 然后我们要创建 favorited() 打开 app/Models/Post.php 增加 favorited() 方法

注意要在头部引用命名空间 use App\Models\Favorite; use Illuminate\Support\Facades\Auth; ​

public function favorited()
 {
 return (bool) Favorite::where('user_id', Auth::id())
    ->where('post_id', $this->id)
    ->first();
 }​

2.8 使用组件

引入 Favorite.vue 组件 resources/assets/js/app.js ​

Vue.component('favorite', require('./components/Favorite.vue'));

编译

npm run dev

laravel5.3 vue 实现收藏夹功能实例详解

效果图 ​

laravel5.3 vue 实现收藏夹功能实例详解 

3. 完成 我的收藏夹

3.1 创建用户控制器​

php artisan make:controller UsersController

​ 修改

app/Http/Controllers/UsersController.php ​ 
<?php​
namespace App\Http\Controllers;​
use Illuminate\Http\Request;​
use Illuminate\Support\Facades\Auth;​
class UsersController extends Controller
{
 public function myFavorites()
 {
 $myFavorites = Auth::user()->favorites;
 return view('users.my_favorites', compact('myFavorites'));
 }
}

​ 添加视图文件

// resources/views/users/my_favorites.blade.php
​
extends('layouts.app')
​
@section('content')
<div class="container">
 <div class="row">
 <div class="col-md-8 col-md-offset-2">
  <div class="page-header">
  <h3>My Favorites</h3>
  </div>
  @forelse ($myFavorites as $myFavorite)
  <div class="panel panel-default">
   <div class="panel-heading">
   <a href="/article/{{ $myFavorite->id }}" rel="external nofollow" >
    {{ $myFavorite->title }}
   </a>
   </div>
​
   <div class="panel-body" style="max-height:300px;overflow:hidden;">
   <img src="/uploads/{!! ($myFavorite->cover)[0] !!}" style="max-width:100%;overflow:hidden;" alt="">
   </div>
   @if (Auth::check())
   <div class="panel-footer">
    <favorite
    :post={{ $myFavorite->id }}
    :favorited={{ $myFavorite->favorited() ? 'true' : 'false' }}
    ></favorite>
   </div>
   @endif
  </div>
  @empty
  <p>You have no favorite posts.</p>
  @endforelse
  </div>
 </div>
</div>
@endsection

​ 然后重新向一下根目录 routes/web.php 添加一条路由 ​

Route::get('/', 'ArticleController@index');

laravel5.3 vue 实现收藏夹功能实例详解

最后效果图

总结

以上所述是小编给大家介绍的laravel5.3 vue 实现收藏夹功能,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时回复大家的!

Javascript 相关文章推荐
javascript内置对象arguments详解
Mar 16 Javascript
js和jquery如何获取图片真实的宽度和高度
Sep 28 Javascript
jquery判断输入密码两次是否相等
Apr 22 Javascript
vue.js实现仿原生ios时间选择组件实例代码
Dec 21 Javascript
基于Bootstrap的网页设计实例
Mar 01 Javascript
swiper移动端轮播插件(触碰图片之后停止轮播)
Dec 28 Javascript
解决vue+element 键盘回车事件导致页面刷新的问题
Aug 25 Javascript
Vue.js中的组件系统
May 30 Javascript
解决Vue中 父子传值 数据丢失问题
Aug 27 Javascript
JS实现提示框跟随鼠标移动
Aug 27 Javascript
在vue中使用Echarts画曲线图的示例
Oct 03 Javascript
解决vue elementUI 使用el-select 时 change事件的触发问题
Nov 17 Vue.js
详解node.js中的npm和webpack配置方法
Jan 21 #Javascript
jQuery获取所有父级元素及同级元素及子元素的方法(推荐)
Jan 21 #jQuery
js将当前时间格式化为 年-月-日 时:分:秒的实现代码
Jan 20 #Javascript
Vue cli 引入第三方JS和CSS的常用方法分享
Jan 20 #Javascript
浅谈vue引入css,less遇到的坑和解决方法
Jan 20 #Javascript
vue 引入公共css文件的简单方法(推荐)
Jan 20 #Javascript
基于Vue的ajax公共方法(详解)
Jan 20 #Javascript
You might like
discuz论坛 用户登录 后台程序代码
2008/11/27 PHP
PHP If Else(elsefi) 语句
2013/04/07 PHP
php防止SQL注入详解及防范
2013/11/12 PHP
Gambit vs ForZe BO3 第一场 2.13
2021/03/10 DOTA
浅析document.ready和window.onload的区别讲解
2013/12/18 Javascript
jQuery实现购物车多物品数量的加减+总价计算
2014/06/06 Javascript
Node.js利用Net模块实现多人命令行聊天室的方法
2016/12/23 Javascript
BootStrap table删除指定行的注意事项(笔记整理)
2017/02/05 Javascript
基于JavaScript实现新增内容滚动播放效果附完整代码
2017/08/24 Javascript
jQuery实现碰到边缘反弹的动画效果
2018/02/24 jQuery
ES6关于Promise的用法详解
2018/05/07 Javascript
VUE-Table上绑定Input通过render实现双向绑定数据的示例
2018/08/27 Javascript
微信小程序自定义组件的实现方法及自定义组件与页面间的数据传递问题
2018/10/09 Javascript
layui table表格数据的新增,修改,删除,查询,双击获取行数据方式
2019/11/14 Javascript
vue学习笔记之slot插槽用法实例分析
2020/02/29 Javascript
微信小程序学习总结(二)样式、属性、模板操作分析
2020/06/04 Javascript
[02:07]2017国际邀请赛中国区预选赛直邀战队前瞻
2017/06/23 DOTA
Python中的yield浅析
2014/06/16 Python
Python实现堆排序的方法详解
2016/05/03 Python
python实现多线程抓取知乎用户
2016/12/12 Python
Python的条件表达式和lambda表达式实例
2019/01/31 Python
我用Python抓取了7000 多本电子书案例详解
2019/03/25 Python
Python实现K折交叉验证法的方法步骤
2019/07/11 Python
Python中一个for循环循环多个变量的示例
2019/07/16 Python
在PyCharm中安装PaddlePaddle的方法
2021/02/05 Python
CSS3解决移动页面上点击链接触发色块的问题
2016/06/03 HTML / CSS
孕妇内衣和胸罩:Cake Maternity
2018/07/16 全球购物
eBay美国官网:eBay.com
2020/10/24 全球购物
加拿大品牌鞋包连锁店:Little Burgundy
2021/02/28 全球购物
Prototype如何实现页面局部定时刷新
2013/08/06 面试题
电子商务应届生求职信
2013/11/16 职场文书
精彩的推荐信范文
2013/11/26 职场文书
社区网格化管理实施方案
2014/03/21 职场文书
《美丽的南沙群岛》教学反思
2014/04/27 职场文书
青涩记忆观后感
2015/06/18 职场文书
HTML5+CSS+JavaScript实现捉虫小游戏设计和实现
2021/10/16 HTML / CSS