laravel5.5+vue2做一个简单的任务管理系统,包含增删改查

先看一下效果,大概就是这样。

其实是照着视频做的,地址是www.youtube.com/watch?v=F-B…

第一步:安装laravel,建一个任务表,写接口。

新建task模型以及migration迁移文件php artisan make:model Task -m

//tasks表迁移文件
Schema::create('tasks', function (Blueprint $table) {
    $table->increments('id');
    $table->string('name');
    $table->boolean('completed')->default(false);
    $table->timestamps();
});
复制代码

新建资源控制器php artisan make:controller TaskController --resource,接着在route/api.php中编写api路由。

Route::resource('/tasks', 'TaskController', ['except'=>[
    'create', 'show', 'edit'    //排除不需要的几个路由
]]);
复制代码

然后在TaskController里编写具体的方法。

public function index()
{
    return Task::all();
}

public function store(Request $request)
{
    $task = new Task();
    $task->name = $request->input('name');
    $task->save();

    return $task;
}

public function update(Request $request, $id)
{
    $task = Task::findOrFail($id);
    $task->completed = $request->input('completed');
    $task->save();

    return $task;
}

public function destroy($id)
{
    $task = Task::findOrFail($id);
    $task->delete();

    return 204;
}
复制代码

以上完成后可以用postman测试接口,路由为/api/tasks,如果正常的话就可以进行下一步了。

第二步:在laravel中写好vue任务组件,测试。

首先安装一下npm依赖,在根目录cnpm i,然后npm run watch可以开始工作了。 在laravel中,路由/进入欢迎界面,编辑welcome.blade.php为:

<html lang="{{ app()->getLocale() }}">
    <head>
        <meta charset="utf-8">
        <meta name="csrf-token" content="{{ csrf_token() }}">
        <title>Laravel to do app</title>
        <link rel="stylesheet" href="{{ asset('css/app.css') }}">
    </head>
    <body>
        <div class="container" id="app">
            wait...
        </div>
        <script src="{{ asset('js/app.js') }}"></script>
    </body>
</html>
复制代码

进入resource/assets/js/app.js中引入一个新task组件Vue.component('tasks',require('./components/Tasks.vue')),附上Task.vue全部代码。

<template>
    <div class="container">
        <div class="row">
            <div class="col-md-8 col-md-offset-2">
                <div class="panel panel-default">
                    <div class="panel-heading">My Tasks</div>

                    <div class="panel-body">
                        <div class="input-group">
                            <input type="text" class="form-control" v-model="task.name" @keydown.enter="create">
                            <span class="input-group-btn">
                                <button class="btn btn-success" @click="create">Add</button>
                            </span>
                        </div>

                        <div class="tasks-list">
                            <div class="alert alert-danger" v-if="!tasks.length">
                                You have no task!
                            </div>
                            <ul class="list-unstyled">
                                <li class="checkbox" v-for="task in tasks" @click="done(task)"
                                    :class="{ done: task.completed}">
                                    <div class="check-box">
                                        <label>
                                            <input type="checkbox" v-model="task.completed"/> {{ task.name }}
                                        </label>
                                        <div class="pull-right">
                                            <a href="#" @click.prevent="remove(task)"> X </a>
                                        </div>
                                    </div>
                                </li>
                            </ul>
                        </div>
                    </div>

                    <div class="panel-footer" v-if="tasks.length">
                        <span class="label label-default">You have {{ tasks.length }} tasks</span>
                        <span class="label label-success">{{ remainingTasks() }} tasks completed</span>
                        <span class="label label-warning">{{ completedTasks() }} tasks left</span>
                    </div>
                </div>
            </div>
        </div>
    </div>
</template>

<script>
    export default {
        mounted() {
            this.fetchData()
        },
        data() {
            return {
                tasks: [],
                task: {
                    name: ''
                }
            }
        },
        methods: {
            fetchData() {
                axios.get('/api/tasks').then(res => {
                    this.tasks = res.data
                }).catch(err => {
                    console.log(err)
                })
            },

            create() {
                if (this.task.name == '') {
                    alert('请先输入任务名')
                    return false
                }
                axios.post('/api/tasks', this.task).then(res => {
                    this.tasks.unshift(res.data)
                    this.task.name = ''
                }).catch(err => {
                    console.log(err)
                })
            },

            done(task) {
                axios.put('/api/tasks/' + task.id, {
                    completed: !task.completed
                }).then(res => {
                    console.log('updated')
                }).catch(err => {
                    console.log(err)
                })
            },

            remove(task) {
                axios.delete('/api/tasks/' + task.id).then(res => {
                    const taskIndex = this.tasks.indexOf(task)
                    this.tasks.splice(taskIndex, 1)
                }).catch(err => {
                    console.log(err)
                })
            },

            remainingTasks() {
                return this.tasks.filter(task => {
                    return !task.completed
                }).length
            },

            completedTasks() {
                return this.tasks.filter(task => {
                    return task.completed
                }).length
            }
        }
    }
</script>

<style>
    body, .tasks-list {
        padding-top: 20px;
    }

    .done label {
        text-decoration: line-through;
    }
</style>

复制代码

然后就可以在welcome模板中的wait...那里替换成<tasks></tasks>,刷新再看看浏览器的变化。

完成。

原文链接:www.phpbest.cn/posts/10.ht…

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值