Vue后臺(tái)管理界面

Vue后臺(tái)管理項(xiàng)目

一、自我總結(jié)后臺(tái)管理界面項(xiàng)目里的知識(shí)點(diǎn)

單頁應(yīng)用
1. webapck 把很多的js,img,hmtl,css .... 打包成一個(gè)html文件以及相應(yīng)的css和js
2. node可以操作本地文件
3. npm下載安裝nodejs模塊(插件)
4. 路由,單頁應(yīng)用通過改變路由來改變頁面顯示的內(nèi)容
模板(使用下面技術(shù))
1. vue 
2. elm-ui
3. webapck
4. 文檔地址:  https://panjiachen.github.io/vue-element-admin-site/zh/guide/
5. 使用
* 下載項(xiàng)目源文件
* npm i 安裝依賴的模塊或者插件
* npm run dev 啟動(dòng)服務(wù)
接口:http://132.232.87.95:3000/ 
  • 單頁應(yīng)用 APS
單頁應(yīng)用
1. webapck 把很多的js,img,hmtl,css .... 打包成一個(gè)html文件以及相應(yīng)的css和js
2. node可以操作本地文件
3. npm下載安裝nodejs模塊(插件)
4. 路由,單頁應(yīng)用通過改變路由來改變頁面顯示的內(nèi)容

模板(使用下面技術(shù))
1. vue 
2. elm-ui
3. webapck
4. 文檔地址:  https://panjiachen.github.io/vue-element-admin-site/zh/guide/
5. 使用
* 下載項(xiàng)目源文件
* npm i 安裝依賴的模塊或者插件
* npm run dev 啟動(dòng)服務(wù)
這里的dev是根據(jù)package.json里scripts對(duì)象里的start來決定的

在文件夾shift+右擊亚斋,調(diào)出對(duì)應(yīng)文件夾的命令窗口
  • vue文件格式
<template>
  <div>
    // 只能有一個(gè)標(biāo)簽作媚,html里的內(nèi)容放在這里面
  </div>
</template>
<script>
import  from './'
// 到入 從某某文件里導(dǎo)出某某 ./用來選定當(dāng)前文件夾 不能直接填否者會(huì)報(bào)錯(cuò)
export default {
    // 導(dǎo)出,vue js的代碼放這里
    生命周期函數(shù) 了解可以看vue基礎(chǔ)篇
};
</script>
<style scoped lang="less">
    // css代碼放這里 scoped表示該樣式只用于這個(gè)文件 lang="less"需安裝less插件才可用 關(guān)于less請(qǐng)看我主頁的文章
</style>
  • 組件使用流程
    組件->全局組件->局部組件->組件注冊(cè)->組件使用->路由設(shè)置->路徑相關(guān)->vue文件格式->組件導(dǎo)入帅刊、導(dǎo)出->eleme-ui引用->樣式更改
全局組件:定義在Vue對(duì)象(main.js里)外,必須注冊(cè)才能使用 注冊(cè)之后 Vue對(duì)象都可以訪問使用 
Vue.componet('組件名',{
    data:function(){
        // data必須是函數(shù)
        return:{
            // 返回想要的函數(shù)對(duì)象等
        }
    }
    template:`里面可以是標(biāo)簽也可以是其他的`
})

組件注冊(cè):script里加 component('組件名', {
  // ... 選項(xiàng) ...
})

局部組件:定義在vue組件里面纸泡,只有在這個(gè)vue組件里才能使用
  • 配置路由
路由設(shè)置:router文件夾是路由設(shè)置的文件夾,對(duì)應(yīng)里面的router.js 是配置路徑的地方
import Vue from 'vue'
import Router from 'vue-router'
Vue.use(Router)
export const constantRouterMap=[
  {
    path: './文件對(duì)應(yīng)的文件夾',
    component: () => import('@/views/對(duì)應(yīng)的文件夾)
    children: [  // 上面文件夾下的文件夾赖瞒,簡稱子文件
      {
        path: 'index 文件名一般固定為index',
        name: '和父文件里path對(duì)應(yīng)',
        component: () => import('@/views/index對(duì)應(yīng)的文件夾/index'), // 如果有幾個(gè)子文件時(shí)默認(rèn)顯示的文件
        meta: { title: '隨意命名', icon: '圖標(biāo)名' }
      }
    ]
  }
]
export default new Router({
  routes: constantRouterMap
})

然后在main.js函數(shù)里面導(dǎo)入
import Vue from 'vue'
import router from './router'
new Vue({
  el: '#app',
  router,
  render: h => h(App)
})
  • 父子組件通信
    假設(shè)a為父組件女揭,b為子組件
    a引用b時(shí)需要引入,import b from 'b'
    a使用b時(shí)需要在a里面注冊(cè)b,
    components:{
        b
    }
    a使用b組件:<b></b>  后續(xù)一切動(dòng)作的源頭(如果沒有引用二者之間毫無關(guān)系)
    a使用b相當(dāng)于使用標(biāo)簽,但是標(biāo)簽一般都有屬性
    b可以自定義屬性 b里面使用 props 數(shù)組定義數(shù)組 注意是數(shù)組后接 :[ ] 屬性填在里面
    父組件傳數(shù)據(jù)給子組件:
    a使用b里聲明好的屬性栏饮,然后給屬性賦值吧兔,也就是所謂的父組件傳數(shù)據(jù)給子組件
    給屬性賦值可以是字符串也可以是變量,但是變量之前要加:
    子組件傳數(shù)據(jù)給父組件:
    a在b里聲明了自定義的事件袍嬉,以及函數(shù)
    在b里面觸發(fā)a的自定義事件來傳數(shù)據(jù) this.$emit("自定義事件名",數(shù)據(jù)data)
  • 簡單的數(shù)據(jù)結(jié)構(gòu)
棧:存放基本數(shù)據(jù)類型(數(shù)字境蔼,字符串灶平,布爾,undef,null)
堆:存放對(duì)象
棧像一個(gè)杯子箍土,內(nèi)部的東西都是從外放進(jìn)來的逢享,而且是先進(jìn)后出
堆像一個(gè)倉庫,內(nèi)部存放對(duì)象吴藻,對(duì)象里包含很多信息拼苍,一個(gè)變量對(duì)應(yīng)一個(gè)對(duì)象,當(dāng)兩個(gè)變量對(duì)應(yīng)的對(duì)象是相同的話
  只要有一方更改调缨,對(duì)象里面的數(shù)據(jù)都會(huì)發(fā)生更改疮鲫,類似于通過一個(gè)變量綁定相同的對(duì)象然后實(shí)現(xiàn)雙向綁定
棧堆:先進(jìn)后出 數(shù)組的兩個(gè)方法可以解釋 push pop  
數(shù)列:先進(jìn)先出 數(shù)組的兩個(gè)方法可以解釋 push shift
  • 組件的使用和引用
步驟:1.引入elme組件,形成靜態(tài)頁面
    需要注意標(biāo)簽內(nèi)綁定的事件函數(shù)弦叶、屬性和變量俊犯,更改或者對(duì)應(yīng)的在下面創(chuàng)建好不然不會(huì)顯示
    2.把相同部分做成一個(gè)小組件
    創(chuàng)建小組件,然后把相同部分的代碼放在組件里面伤哺,注意里面的變量屬性和函數(shù)要對(duì)應(yīng)存在否者不顯示
    3.引用剛才創(chuàng)建的小組件
    首先得導(dǎo)入燕侠,import  from '' 路徑要填對(duì) 同一個(gè)文件夾的話只需要./后接組件名
    然后在導(dǎo)出export default下面 注冊(cè)組件 components:{ 組件名 }
    4.使用組件,放在之前對(duì)應(yīng)的地方立莉,使用直接是<標(biāo)簽名/>
    5.在組件里面定義屬性然后傳需要的數(shù)據(jù)過去
    在組件的導(dǎo)出下面使用props:[屬性名] 定義屬性名 然后在引用的組件標(biāo)簽
    里面添加屬性并傳入需要的屬性绢彤,是變量的時(shí)候前面需要加:
    6.然后組件實(shí)現(xiàn)的功能都是在組件里面編輯的,到引用的上面直接就是有功能的了
  • 三目運(yùn)算符
三目運(yùn)算符
三元表達(dá)式
if()else() => *?*:*
意思相近蜓耻,?為if,如果前面的true則打印?后面的茫舶,如果為false則打印:后面的

sc 快速生成vue組件的框架

二刹淌、實(shí)際應(yīng)用

一饶氏、 vue里頁面之間傳參通過router-link

獲取頁面?zhèn)鬟^來的參數(shù)
this.$route.params.參數(shù)名;
第一步: <router-link :to="`/cinema/edit/${scope.row.cinemaId}`">編輯</router-link>
通過router-link跳轉(zhuǎn)到對(duì)呀路由(/cinema/edit)下,后面接/然后就是參數(shù)有勾。模板字符串``里用${參數(shù)}來傳
第二步:{
        path: 'edit/:id',
        component: () => import('@/views/cinema/edit'),
        meta: {
          title: '編輯影院',
          icon: 'form'
        }
      }
router里面在路徑對(duì)應(yīng)的后面加/:id,用id來接受參數(shù),當(dāng)然參數(shù)是自定義的
第三步: 在跳轉(zhuǎn)后的頁面獲取參數(shù)this.$route.params.id   id對(duì)應(yīng)我們?cè)诼酚衫锒x的儲(chǔ)存參數(shù)的變量上

二疹启、vue里獲取接口數(shù)據(jù)

 created() {
        let id = this.$route.params.id;
        this.findList(id);
    },
    methods: {
        findList(id){
            const url = process.env.BASE_API + '/cinema/findById'
          //  封裝后的使用
            axios.get(url,{
                params:{
              // 參數(shù)
                    cinemaId:id
                }
            }).then( res => {
                this.list=res.data.data.cinema;
            }).catch( error => {
                console.log(error)
            })
        }
    },

和js原生對(duì)比不然發(fā)現(xiàn)有不同的地方,這里是對(duì)接口進(jìn)行了一些封裝


image.png

image.png

image.png

image.png
  • 由圖片可以看出,這個(gè)是經(jīng)過了一些列封裝然后使得用的時(shí)候方便
    創(chuàng)建文件夾utils用來放封裝函數(shù)->request.js對(duì)獲取后臺(tái)數(shù)據(jù)的axios進(jìn)行封裝->然后使用的時(shí)候在config文件夾下的dev-env.js里更改BASE_API為我們接口的各個(gè)部分即可

三蔼卡、 結(jié)合數(shù)組函數(shù)map實(shí)現(xiàn)二級(jí)聯(lián)動(dòng)

<template>
    <!-- 聯(lián)動(dòng)選擇組件 -->
    <div>
        <el-select @change="changeCity" v-model="film.cityId" filterable placeholder="請(qǐng)選擇城市">
      <el-option  v-for="item in options" :key="item.value" :label="item.label" :value="item.value"></el-option>
    </el-select>
    <el-select v-model="film.districtId" style="margin-left: 20px;" placeholder="請(qǐng)選擇區(qū)域">
      <el-option v-for="item in district" :key="item.value" :label="item.label" :value="item.value"></el-option>
    </el-select>
    </div>
</template>

<script>
import axios from 'axios'
export default {
    props:[
        'film'
    ],
    data() {
        return {
            options:[],
            district:[]
        }
    },
    created() {
        this.getlist();
    },
    methods: {
        getlist(){
            const url = process.env.BASE_API +'/city/getList';
            axios.get(url,{
                params:{}
            }).then(res=>{
                const cities = res.data.cities;
                const arr = cities.map(item=>{
                    return{
                        value:item.cityId,
                        label:item.name
                    }
                })
                this.options = arr;
            }).catch(error=>{
                console.log(error)
            })
        },
        changeCity(cityId){ 
            this.getDistrId(cityId)
            this.film.districtId=''
        },
        getDistrId(cityId){
            const url = process.env.BASE_API +'/district/findByCityId';
            axios.get(url,{
                params:{
                    cityId
                }
            }).then(res=>{
                const distr = res.data.districts;
                const arr = distr.map(item=>{
                    return{
                        value:item.objectId,
                        label:item.name
                    }
                })
                this.district = arr;
            }).catch(error=>{
                console.log(error)
            })
        }
    },
}
</script>
<style>
</style>
  • @ v-on的縮寫 : v-bind縮寫 @綁定事件 :變?yōu)樽兞?/li>

四喊崖、 結(jié)合數(shù)組函數(shù)push、indexOf雇逞、splice增刪輸入框

<template>
<!-- 增刪輸入框組件 -->
  <div class="sb">
    <el-form-item class="input" label="劇照">
      <el-input placeholder="請(qǐng)輸入內(nèi)容" v-model="film.pics">
      </el-input>
      <el-button @click="addDomain" class="button" type="info">新增</el-button>
    </el-form-item>
    <el-form-item class="input" label='劇照' v-for="(domain) in photos.domains" :key="domain.key">
     <div>
        <el-input placeholder="請(qǐng)輸入內(nèi)容" v-model="film.pics">
      </el-input>
      <el-button @click.prevent="removeDomain(domain)" class="button" type="info">刪除</el-button>
     </div>
    </el-form-item>
  </div>
</template>

<script>
export default {
    props:[
        "film"
    ],
  data() {
    return {
      photos: {
        domains: []
      }
    };
  },
  created() {
  },
  methods: {
    addDomain() {
        this.photos.domains.push({
        value: "",
      });
    },
    removeDomain(item) {
      var index = this.photos.domains.indexOf(item);
      if (index !== -1) {
        this.photos.domains.splice(index, 1);
      }
    }
  }
};
</script>
<style>
.input {
  position: relative;
  right: 80px;
}
.button {
  position: relative;
  float: right;
  top: -40px;
  left: 75px;
}
.ab {
  clear: both;
}
</style>
  • 可見input類型標(biāo)簽使用v-model和數(shù)據(jù)雙向綁定更改值
    以及遍歷使用v-for((item,index) in list) :key="index"
  • v-for key 實(shí)現(xiàn)輸入框的增加荤懂、刪除
<template>
  <div>
    <h3>v-for key 實(shí)現(xiàn)輸入框的增加、刪除</h3>
    <div
      :v-model="lists[index].value"
      :class="'input'+index"
      v-for="(list,index) in lists"
      :key="list.id"
    >
      <input type="text" placeholder="請(qǐng)輸入">
      <button v-if="panduan(index)" @click="add">+</button>
      <button v-else @click="del(index)">-</button>
    </div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      lists: [{}]
    };
  },
  created() {},
  methods: {
    add() {
      this.lists.push({
        value: ""
      });
    },
    del() {
      this.lists.pop();
    },
    panduan(index) {
      return this.lists.length - 1 === index;
    }
  }
};
</script>
<style>
button {
  width: 25px;
  height: 25px;
}
</style>
// key 指定一個(gè)屬性為區(qū)別兩個(gè)數(shù)據(jù)喝峦,一般是id势誊,類似于數(shù)據(jù)庫里的主鍵

五、渲染列表

<template>
<!-- 父子通信組件 -->
<div>    
    <el-form-item label="電影名稱">
    <el-input v-model="film.name"></el-input>
  </el-form-item>
  <el-form-item label="海報(bào)地址">
    <el-input v-model="film.poster"></el-input>
  </el-form-item>
  <el-form-item label="演員">
    <el-input v-model="film.actors"></el-input>
  </el-form-item>
  <el-form-item label="導(dǎo)演">
    <el-input v-model="film.director"></el-input>
  </el-form-item>
  <el-form-item label="產(chǎn)地">
    <el-input v-model="film.nation"></el-input>
  </el-form-item>
</div>
</template>

<script>
import Xuan from './Xuan'
export default {
    props:[
        'film'
    ],
    data() {
        return {
        }
    },
    components:{
      Xuan
    }
}
</script>
<style>
</style>

列表里大部分用的都是input標(biāo)簽,然后渲染方式就是綁定v-model雙向綁定更改數(shù)據(jù)
六谣蠢、父子通信

// 父組件
<template>
    <div>
        <Form></Form>
        <Form title="添加電影"></Form>
        <!-- 通過字符串添加 -->
        <Form :title="title"></Form>
        <!-- 通過變量以及組件里的屬性添加 -->

        <!-- 通過自定義事件把子組件的數(shù)據(jù)傳到父組件 -->
        <Form id="app" @aaa="test">自定義事件</Form>

        <!-- 二級(jí)聯(lián)動(dòng) -->
        <demo class="demo"></demo>

        <!-- 增刪輸入框 -->
        <xinzeng></xinzeng>
    </div>
</template>
<script>
// 加載Form 組件
import xinzeng from './components/xinzeng';
import demo from './components/demo';
import Form from './components/Form'
export default {
    data() {
        return {
            title:'這是通過組件的屬性添加的'
        }
    },
    created() {
        // emit 觸發(fā)自定義事件
        // this.$emit('aaa');
    },
    mounted() {
    },
    methods: {
        test(data){
            alert(data);
        }
    },
    // 注冊(cè)組件
    components:{
        Form,
        demo,
        xinzeng
    }
}
</script>
<style>
.demo{
    margin-top: 20px;
    margin-left: 20px;
}
</style>
// 子組件
<template>
    <div>
        <h3>{{title}}</h3>
        <span>用戶名:</span>
        <input v-model="user" type="text">
        <button @click="submit">傳數(shù)據(jù)</button>
        
    </div>
</template>

<script>
export default {
    props    //  屬性   如果把組件當(dāng)成標(biāo)簽
    :[
        "title",
    ],
    data() {
        return {
            user:''
        }
    },
    // 避免修改從父組件傳下來的屬性粟耻,修改會(huì)給后期維護(hù)帶來不利
    created() {
        console.log(this.title);
        // 可以通過this訪問title
    },
    methods: {
        submit(){
            // 觸發(fā)父組件的自定義aaa事件
            this.$emit("aaa",this.user)
        }
    },
}
</script>
<style>
    button{
        width: 100px;
    }
</style>
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末查近,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子挤忙,更是在濱河造成了極大的恐慌霜威,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,372評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件册烈,死亡現(xiàn)場離奇詭異戈泼,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)赏僧,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門大猛,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人淀零,你說我怎么就攤上這事挽绩。” “怎么了驾中?”我有些...
    開封第一講書人閱讀 162,415評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵唉堪,是天一觀的道長。 經(jīng)常有香客問我肩民,道長唠亚,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,157評(píng)論 1 292
  • 正文 為了忘掉前任持痰,我火速辦了婚禮灶搜,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘共啃。我一直安慰自己占调,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評(píng)論 6 388
  • 文/花漫 我一把揭開白布移剪。 她就那樣靜靜地躺著,像睡著了一般薪者。 火紅的嫁衣襯著肌膚如雪纵苛。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,125評(píng)論 1 297
  • 那天言津,我揣著相機(jī)與錄音攻人,去河邊找鬼。 笑死悬槽,一個(gè)胖子當(dāng)著我的面吹牛怀吻,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播初婆,決...
    沈念sama閱讀 40,028評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼蓬坡,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼猿棉!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起屑咳,我...
    開封第一講書人閱讀 38,887評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤萨赁,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后兆龙,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體杖爽,經(jīng)...
    沈念sama閱讀 45,310評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評(píng)論 2 332
  • 正文 我和宋清朗相戀三年紫皇,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了慰安。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,690評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡聪铺,死狀恐怖泻帮,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情计寇,我是刑警寧澤锣杂,帶...
    沈念sama閱讀 35,411評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站番宁,受9級(jí)特大地震影響元莫,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜蝶押,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評(píng)論 3 325
  • 文/蒙蒙 一踱蠢、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧棋电,春花似錦茎截、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至于未,卻和暖如春撕攒,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背烘浦。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評(píng)論 1 268
  • 我被黑心中介騙來泰國打工抖坪, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人闷叉。 一個(gè)月前我還...
    沈念sama閱讀 47,693評(píng)論 2 368
  • 正文 我出身青樓擦俐,卻偏偏與公主長得像,于是被迫代替她去往敵國和親握侧。 傳聞我的和親對(duì)象是個(gè)殘疾皇子蚯瞧,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容

  • 這篇筆記主要包含 Vue 2 不同于 Vue 1 或者特有的內(nèi)容嘿期,還有我對(duì)于 Vue 1.0 印象不深的內(nèi)容。關(guān)于...
    云之外閱讀 5,048評(píng)論 0 29
  • 前言 您將在本文當(dāng)中了解到,往網(wǎng)頁中添加數(shù)據(jù),從傳統(tǒng)的dom操作過渡到數(shù)據(jù)層操作,實(shí)現(xiàn)同一個(gè)目標(biāo),兩種不同的方式....
    itclanCoder閱讀 25,794評(píng)論 1 12
  • ## 框架和庫的區(qū)別?> 框架(framework):一套完整的軟件設(shè)計(jì)架構(gòu)和**解決方案**状知。> > 庫(lib...
    Rui_bdad閱讀 2,906評(píng)論 1 4
  • 一:什么是閉包秽五?閉包的用處? (1)閉包就是能夠讀取其他函數(shù)內(nèi)部變量的函數(shù)饥悴。在本質(zhì)上坦喘,閉包就 是將函數(shù)內(nèi)部和函數(shù)外...
    xuguibin閱讀 9,593評(píng)論 1 52
  • 每個(gè)人心里都有一個(gè)地方瓣铣,住著一個(gè)人,那里春風(fēng)秋月贷揽、冬暖夏涼棠笑。 你微微笑著,不問我說什么話禽绪, 而我覺得蓖救,為了這個(gè),我...
    喜歡詩詞的女孩閱讀 601評(píng)論 0 0