基于vue2.0的一个豆瓣电影App

1、搭建项目框架

使用vue-cli 没安装的需要先安装

npm intall -g vue-cli

使用vue-cli生成项目框架

vue init webpack-simple vue-movie
然后一路回车

接着 进入项目目录

cd vue-movie

然后安装项目依赖包

cnpm install
没安装cnpm的先执行这个命令
npm install -g cnpm --registry=https://registry.npm.taobao.org
接着 npm run dev
看到这个界面 说明前面没啥问题了

2、安装需要的依赖包

该项目需要用到vue-router bootstrap

 
所以先安装这两个包
cnpm install vue-router bootstrap -D
然后在 index.html 页面引用下boostrap.css和另一个需要用到的css文件
 
 <link rel="stylesheet" href="/node_modules/bootstrap/dist/css/bootstrap.css">
  <link rel="stylesheet" href="http://v3.bootcss.com/examples/dashboard/dashboard.css">

3、编写代码

 App.vue

 来到src目录下的App.vue中添加下列代码
<template>
  <div id="app">
    <nav class="navbar navbar-inverse navbar-fixed-top">
      <div class="container-fluid">
        <div class="navbar-header">
          <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#navbar" aria-expanded="false"
            aria-controls="navbar">
            <span class="sr-only">Toggle navigation</span>
            <span class="icon-bar"></span>
            <span class="icon-bar"></span>
            <span class="icon-bar"></span>
          </button>
          <a class="navbar-brand" href="#">基于Vue2.0的一个豆瓣电影App</a>
        </div>
        <div id="navbar" class="navbar-collapse collapse">
          <form class="navbar-form navbar-right">
            <input type="text" class="form-control" placeholder="Search...">
          </form>
        </div>
      </div>
    </nav>
    <div class="container-fluid">
      <div class="row">
        <div class="col-sm-3 col-md-2 sidebar">
          <ul class="nav nav-sidebar">
             <li class="active" v-focus="{server:currentRoute}">
              <router-link to="/in_theaters/0">正在热映</router-link>
            </li>
            <li v-focus="{server:currentRoute}">
              <router-link to="/coming_soon/0">即将上映</router-link>
            </li>
            <li v-focus="{server:currentRoute}">
              <router-link to="/top250/0">Top</router-link>
            </li>
          </ul>
        </div>
        <div class="col-sm-9 col-sm-offset-3 col-md-10 col-md-offset-2 main">
          <router-view></router-view>
        </div>
      </div>
    </div>
  </div>
  </div>
</template>
<script>
  import jsonp from './js/jsonp.js'
  import config from './js/config.js'
  export default {
    name: 'app',
    data() {
      return {
        currentRoute: '',
        search: ''
      }
    },
    created() {
      this.request();
    },
    methods: {
      request() {
        var server = this.$route.params.server;
         this.currentRoute = server;
      },
      data: {
        jsondata: {}
      },
      Search() {
        this.$router.push({ path: '/search/0?t=' + this.search, params: { t: this.search } });
      }
    },
    watch: {
      '$route': 'request'
    }
  }
</script>
 
    

然后在src目录下新建一个components文件夹

在该文件夹下创建一个movielist.vue
添加以下代码
<template>
    <div>
        <h1 class="page-header">{{jsondata.title}}</h1>
        <ul class="list-group">
            <li class="list-group-item" v-for="(item,index) in jsondata.subjects">
                <span class="badge">{{item.rating.average}}</span>
                <div class="media-left">
                    <router-link :to="{path:'/detail/'+item.id}">
                        <img class="media-object" :src="item.images.small" alt="">
                    </router-link>
                </div>
                <div class="media-body">
                    <h3 class="media-heading">{{item.title}}</h3>
                    <p>
                        <span>类型:</span><span>{{item.genres.join('、')}}</span>
                    </p>
                    <p>
                        <span>导演:</span> <span v-for="(val,index) in item.casts">{{val.name + (index==item.casts.length-1?'':'、')}}</span>
                    </p>
                </div>
            </li>
        </ul>
        <div id="layear" v-show="!show">
            <p>当前第{{parseInt(currentPage) +1}}页、共 {{countPage}}页</p>
            <nav>
                <ul class="pager">
                    <li :class="{disabled:currentPage<=0}">
                        <router-link :to="{path:'/'+server+'/'+ (currentPage<=0?0:(parseInt(currentPage)-1))}">上一页</router-link>
                    </li>
                    <li :class="{disabled:currentPage>=countPage}">
                        <router-link :to="{path:'/'+server+'/'+(parseInt(currentPage) + parseInt(1))}">下一页</router-link>
                    </li>
                </ul>
            </nav>
        </div>
        <div class="spinner" v-show="show">
            <div class="double-bounce1"></div>
            <div class="double-bounce2"></div>
        </div>

    </div>
</template>
<script>
    import Vue from 'vue'
    import jsonp from '../js/jsonp.js'
    import config from '../js/config.js'
    export default {
        created() {
            this.request();         
        },
        data() {
            return {
                currentPage: 0,
                jsondata: {},
                countPage: 0,
                server: '',
                show: 'true'
            }
        },
        methods: {
            request() {
                this.show = true;
                var server = this.$route.params.server;
                this.server = server;
                this.currentPage = this.$route.params.page;
                var count = 10;
                jsonp(config.apiServer + server, { count: count, start: this.currentPage * count, q: this.$route.query.t }, function (data) {
                    this.jsondata = data;
                    this.countPage = Math.ceil(this.jsondata.total / this.jsondata.count);
                    this.show = false;
                }.bind(this))
            }
        },
        watch: {
            '$route.path': 'request',
            '$route.params':'request'
        }
    }

</script>
<style scoped>
    .spinner {
        width: 60px;
        height: 60px;
        margin: 100px auto;
        position: fixed;
        left: 0;
        right: 0;
        top: 0;
        bottom: 0;
    }

    .double-bounce1,
    .double-bounce2 {
        width: 100%;
        height: 100%;
        border-radius: 50%;
        background-color: #67CF22;
        opacity: 0.6;
        position: absolute;
        top: 0;
        left: 0;

        -webkit-animation: bounce 2.0s infinite ease-in-out;
        animation: bounce 2.0s infinite ease-in-out;
    }

    .double-bounce2 {
        -webkit-animation-delay: -1.0s;
        animation-delay: -1.0s;
    }

    @-webkit-keyframes bounce {
        0%,
        100% {
            -webkit-transform: scale(0.0)
        }
        50% {
            -webkit-transform: scale(1.0)
        }
    }

    @keyframes bounce {
        0%,
        100% {
            transform: scale(0.0);
            -webkit-transform: scale(0.0);
        }
        50% {
            transform: scale(1.0);
            -webkit-transform: scale(1.0);
        }
    }
</style>

接着在src目录下创建js文件夹 存放js文件

新建一个jsonp.js
var jsonp = function (url, data, callback) {
    var cbFuncName = 'jsonp_fun' + Math.random().toString().replace('.', '');
    window[cbFuncName] = callback;
    var queryString = url.indexOf('?') == -1 ? '?' : '&';
    for (var key in data) {
        queryString += key + '=' + data[key] + '&';
    }
    queryString += 'callback=' + cbFuncName;
    var script = document.createElement('script');
    script.src = url + queryString;
    document.body.appendChild(script);
}
export default jsonp

 

在新建一个config.js 用来存放一些配置信息

const apiServer = 'https://api.douban.com/v2/movie/';
export default { apiServer }

接着在新建一个focus.js 用来左边导航栏获取焦点

添加以下代码
import Vue from 'vue'
var focus = {};
focus.install = function () {
    Vue.directive('focus', function (el, binding) {
        var server = binding.value.server;
        var aLink = el.children[0].href;        
        var link = /^((http)?:\/\/)[\w]+:+[\d]+\/\W+([\w]+)?\/\w/;
        var val = (aLink.match(link))[3];
        el.className = '';
        if (val == server) {
            el.className = 'active';
        }
    })
}
export default focus;

然后来到main.js中 引用vue-router 和引用刚才的focus.js和配置vue-router

 
import Vue from 'vue'
import App from './App.vue'
import VueRouter from 'vue-router'
import movielist from './components/movielist.vue'
import focus from './js/focus'

Vue.use(VueRouter)
Vue.use(focus)
var routes = [{
  path: '/:server/:page', component: movielist
},
{ path: '*', redirect:'/in_theaters/0' }]
var router = new VueRouter({
  routes
})
new Vue({
  el: '#app',
  router,
  render: h => h(App)
})

到这边页面基本成型了

回到命令行 继续执行该命令
npm run dev
 

 

 
项目源码已经分享到github上
https://github.com/lentoo/vue-movie
欢迎Star
 

公众号

欢迎关注我的公众号“码上开发”,每天分享最新技术资讯。关注获取最新资源

 

转载于:https://www.cnblogs.com/lentoo/p/7152188.html

1. 创建项目文件夹,使用npm init初始化项目,生成package.json文件。 2. 安装Vue.js和Vue CLI(命令行界面)。 npm install vue npm install -g vue-cli 3. 使用Vue CLI创建项目。 vue init webpack my-project 4. 进入项目文件夹,安装依赖。 cd my-project npm install 5. 启动项目,查看是否成功。 npm run dev 6. 添加路由管理器vue-router。 npm install vue-router 7. 在src文件夹中创建views文件夹,存放所有页面组件。 8. 在src文件夹中创建components文件夹,存放所有公共组件。 9. 在src文件夹中创建assets文件夹,存放所有图片、样式和字体文件。 10. 在src文件夹中创建utils文件夹,存放所有工具函数。 11. 在src文件夹中创建config文件夹,存放所有配置文件。 12. 在src文件夹中创建store文件夹,存放所有状态管理文件。 13. 在src文件夹中创建App.vue文件,作为根组件,包含所有其他组件。 14. 在src文件夹中创建main.js文件,作为项目入口文件,配置路由、状态管理、插件等。 15. 在src文件夹中创建router文件夹,存放所有路由配置文件。 16. 在src文件夹中创建store文件夹,存放所有状态管理文件。 17. 在src文件夹中创建plugins文件夹,存放所有插件文件。 18. 在src文件夹中创建filters文件夹,存放所有过滤器文件。 19. 在src文件夹中创建mixins文件夹,存放所有混入文件。 20. 在src文件夹中创建directives文件夹,存放所有指令文件。 21. 在src文件夹中创建services文件夹,存放所有服务文件。 22. 在src文件夹中创建mock文件夹,存放所有mock数据文件。 23. 在根目录下创建vue.config.js文件,配置webpack,例如添加别名、打包选项等。 24. 在根目录下创建.babelrc文件,配置babel转码规则,例如添加ES6转ES5的插件。 25. 在根目录下创建.postcssrc.js文件,配置postcss转码规则,例如添加autoprefixer插件。 26. 在根目录下创建.editorconfig文件,配置编辑器格式化规则。 27. 在根目录下创建.eslint.js文件,配置eslint规则。 28. 在根目录下创建.prettierrc文件,配置prettier规则。 29. 在根目录下创建README.md文件,编写项目介绍、使用方法等文档。 30. 在根目录下创建LICENSE文件,添加开源协议。 这样,一个基于vue2.0的前端框架就搭建好了。在实际开发过程中,可以根据项目需求进行修改和完善。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值