学习项目-前端-第九课:NUXT

一、preparation

1、prerequisites:node - at least v8.9.0(latest version is recommended)

2、download starter-template-master

3、command line-->cnpm install

4、change "{{ name }}"(package.json) to your project name

5、command line-->npm run dev

6、change title(nuxt.config.js-->head-->title)

二、layout/default.vue

1 <template>
2   <div>
3   <header>tensquare Social Plateform
        <router-link to="/">Home Page</router-link>
        <router-link to="/recruit">Recruit</router-link>
        <router-link to="/gathering">Activity</router-link>
      </header>
4     <nuxt/><!-- /pages/index.vue -->
5     <footer>Predator Copyright</footer>
6   </div>
7 </template>
8 </script>

三、page route(automatic search by directory architecture)

 四、render

1、install axios-->command line:cnpm install axios --save

2、pages/gathering/index.vue(single)

 1 <template>
 2   <div>
 3     Activity List
 4     <div v-for="(item,index) in items" :key="index">{{item.name}}</div>
<!--
<li v-for="(label,index) in enterprise_item.labels.split(',')" :key="index">{{label}}</li> 
  -->   <!--  按","拆分进行循环  -->
5 </div> 6 </template> 7 <script> 8 import axios from 'axios' 9 export default { 10 asyncData(){ 11 return axios.get('http://192.168.1.66:7300/mock/5f01a8f3b2b4ff07dd0ca4fc/api/gathering').then( 12 res=>{ 13 console.log(res.data.data) 14 return {items: res.data.data} 15 }); 16 } 17 } 18 </script>

 3、pages/recruit/index.vue(multiple)

 1 <script>
 2 import '~/assets/css/page-sj-recruit-index.css'
 3 import recruitApi from '@/api/recruit'
 4 import enterpriseApi from '@/api/enterprise'
 5 import axios from 'axios'
 6 export default {    
 7   asyncData(){
 8     return axios.all([recruitApi.recommend(), recruitApi.newlist(),enterpriseApi.hotlist() ]).then(
 9       axios.spread( function( recommendList,newList ,hostList ){
10         return {
11           recommendList: recommendList.data.data,
12           newList: newList.data.data,
13           hostList: hostList.data.data
14         }
15       })
16     )
17   }
18 }
19 </script>

4、pages/recruit/_id.vue(embedded called)

<script>
import '~/assets/css/page-sj-recruit-detail.css'
import recruitApi from '@/api/recruit'
import enterpriseApi from '@/api/enterprise'
export default {
    asyncData({params}){
      return recruitApi.findById(params.id ).then( res =>{        
        return enterpriseApi.findById( res.data.data.eid ).then( 
          res2=>{
            return {
              enterprise_item: res2.data.data,
              item:res.data.data
            }
          }
        )
      })
    }
}
</script>

五、dynamic route

 六、link static resource("~")

 七、<router-link/>

1 <ul class="sui-nav"> 
2     <router-link tag="li" to="/" active-class="active" exact><a>首页</a></router-link>
3     <router-link tag="li" to="/qa" active-class="active"><a>问答</a></router-link>
4     <router-link tag="li" to="/gathering" active-class="active"><a>活动</a></router-link>
5     <router-link tag="li" to="/friend" active-class="active"><a>交友</a></router-link>
6     <router-link tag="li" to="/spit" active-class="active"><a>吐槽</a></router-link>
7     <router-link tag="li" to="/recruit" active-class="active"><a>招聘</a></router-link>
8 </ul>

1、tag="li"--><li></li>

2、active-class="active"

 

3、exact-->precise to the link

 八、waterfall flow component(vue-infinite-scroll)

1、install-->command line:cnpm install vue-infinite-scroll --save

2、configured in plugins/vue-infinite-scroll.js

1 import Vue from 'vue'
2 import infiniteScroll from 'vue-infinite-scroll'
3 Vue.use(infiniteScroll)

3、configured in nuxt.config.js

 1 head: {
 2     title: 'predator',
 3     meta: [
 4       { charset: 'utf-8' },
 5       { name: 'viewport', content: 'width=device-width, initial-scale=1' },
 6       { hid: 'description', name: 'description', content: '{{escape description }}' }
 7     ],
 8     link: [
 9       { rel: 'icon', type: 'image/x-icon', href: '/favicon.ico' }
10     ]
11   },
  plugins: [
    { src:'~plugins/vue-infinite-scroll.js' ,ssr: false},
    { src:'~plugins/element-ui.js' ,ssr: false}
  ],
  css: [
    'element-ui/lib/theme-chalk/index.css'
  ],

 CSS:("starter-template-master/node_modules/element-ui/lib/theme-chalk/index.css")

4、use(pages/gathering/index.vue)

<div class="activity-list" v-infinite-scroll="loadMore"> 
 1 <template>
 2 <div class="wrapper activities"> 
 3    <div class="activity-card-list"> 
 4     <div class="top-title"> 
 5      <h4 class="latest">最新活动</h4>      
 6      <div class="clearfix"></div> 
 7     </div> 
 8     <div class="activity-list" v-infinite-scroll="loadMore"> 
 9      <ul class="activity"> 
10       <li class="activity-item" v-for="(item,index) in items" :key="index"> 
11        <div class="activity-inner"> 
12         <a href="http://"></a> 
13         <div class="img">
14          <a :href="'/gathering/item/'+item.id" target="_blank"><img :src="item.image" alt="" /></a>
15         </div> 
16         <div class="text"> 
17          <p class="title">{{item.name}}</p> 
18          <div class="fl goin"> 
19           <p>时间:{{item.starttime}}</p> 
20           <p>城市:{{item.city}}</p> 
21          </div> 
22          <div class="fr btn"> 
23           <span class="sui-btn btn-bao">立即报名</span> 
24          </div> 
25          <div class="clearfix"></div> 
26         </div> 
27        </div> </li> 
28 
29      </ul> 
30     </div> 
31    </div> 
32   </div> 
33 </template>
34 <script>
35 import '~/assets/css/page-sj-activity-index.css'
36 import gatheringApi from '~/api/gathering'
37 
38 export default {
39   data(){
40     return {
41       pageNo: 1
42     }
43   },
44   asyncData(){
45     return gatheringApi.search(1,12,{state: '1'}).then(res => {
46       return {items: res.data.data.rows}
47     })
48   },
49   methods: {
50     loadMore(){
51       this.pageNo++
52       gatheringApi.search(this.pageNo,12,{state: '1'}).then(res => {
53         this.items = this.items.concat(res.data.data.rows);
54       });
55     }
56   }
57 }
58 </script>

 九、Share.js

1、use javascript and css

 1 export default {
 2     asyncData( {params} ){
 3         return gatheringApi.findById(params.id).then(res=>{
 4             return {item: res.data.data}
 5         })
 6     },
 7     head: {
 8         script: [
 9             {src: 'https://cdn.bootcss.com/social-share.js/1.0.16/js/social-share.min.js'}
10         ],
11         link: [
12             {rel: 'stylesheet',href: 'https://cdn.bootcss.com/social-share.js/1.0.16/css/share.min.css'}
13         ]
14     }
15 }

 2、usage

<div class="social-share" data-sites="weibo,wechat" :data-title="item.name" data-url="https://www.cnblogs.com/DotSDot/"></div>

3、options

 十、js-cookie(save user information at front end)

1、install-->command line:cnpm install js-cookie --save

2、create utils/auth.js

 1 import Cookies from 'js-cookie'
 2 
 3 const TokenKey = 'User-Token'
 4 const NameKey = 'User-Name'
 5 const AvatarKey = 'User-Avatar'
 6 
 7 export default {
 8     setUser(token,name,avatar){
 9         Cookies.set(TokenKey,token),
10         Cookies.set(NameKey,name),
11         Cookies,set(AvatarKey,avatar)
12     }
13 }

3、use(login.vue)

 1 <script>
 2 import '~/assets/css/page-sj-person-loginsign.css'
 3 import userApi from '@/api/user'
 4 import Auth from '@/utils/auth'
 5 export default {
 6   data(){
 7     return {
 8       pojo: {},
 9       code: '',
10       mobile: '',
11       password: ''
12     }
13   },
14   methods: {
15     sendsms(){
16       userApi.sendsms(this.pojo.mobile).then(res=>{
17         this.$message({
18           message: res.data.message,
19           type: (res.data.flag?'success':'error')
20         })
21       })
22     },
23     register(){
24       userApi.register(this.pojo,this.code).then(res=>{
25         this.$message({
26           message: res.data.message,
27           type: (res.data.flag?'success':'error')
28         })
29       })
30     },
31     login(){
32       userApi.login(this.mobile,this.password).then(res=>{
33         if(res.data.flag){
34           Auth.setUser(res.data.data.token,res.data.data.name,res.data.data.avatar);
35           location.href = '/manager'
36         } else {
37           this.$message({
38           message: res.data.message,
39           type:'error'
40         })
41         this.mobile = '',
42         this.password = ''
43         }
44       })
45     }
46   }
47 }
48 </script>

 

 

 

 

 

 

posted @ 2020-07-19 10:16  遥~  阅读(233)  评论(0编辑  收藏  举报