Vue學(xué)習(xí)筆記(1).md

2017.4.11 - 4.13

前言:

上周大致瀏覽了Vue文檔,簡單使用了Vue.js文件嘗試基本Vue特性晚伙。在這一周颖低,學(xué)習(xí)Vue入門教程,完成了一個登錄界面的Vue組件陌宿,并且通過與nodeJs的連接實現(xiàn)了登錄驗證锡足。
在下一周中,學(xué)習(xí)Vue組件的套用壳坪,使用less完善css舶得,使用Vuex管理項目狀態(tài)。

筆記導(dǎo)航

  • Vue框架搭建
  • Vue前端組件搭建
  • Vue服務(wù)器端通信

項目要求

最新作業(yè) 具體要求

使用VUE實現(xiàn)求職系統(tǒng)爽蝴,系統(tǒng)主要功能包括 注冊沐批,登錄,職位查詢蝎亚,職位保存九孩,求職跟蹤,報表系統(tǒng)发框,具體要求如下:
新用戶可以注冊賬號躺彬,注冊需要通過email,系統(tǒng)將驗證碼發(fā)送到郵箱梅惯,用戶需要填寫驗證碼完成注冊宪拥;
用戶可以根據(jù)用戶名和密碼登錄系統(tǒng);
在職位查詢中铣减,用戶可以根據(jù)公司名稱她君,薪水,職位類型查詢求職信息葫哗;
用戶可以將查詢中的某些記錄加入到自己的關(guān)注信息缔刹;
用戶可以將某些公司加入到求職跟蹤,系統(tǒng)從招聘網(wǎng)站(比如智聯(lián)招聘)抓取數(shù)據(jù)劣针,并自動統(tǒng)計該公司每周的求職信息桨螺,發(fā)送給用戶;
報表系統(tǒng)提供多種信息分析圖表酿秸,比如各職位的數(shù)量餅狀圖灭翔,某職位的薪資變化圖等等;
項目周期:3年級學(xué)生6周
知識要點:
1 . 掌握模板語法 v-html v-bind v-on v-show v-if v-for
2 . 理解vue-router路由模板以及路由事件的處理
3 . 掌握使用vue-resource訪問網(wǎng)絡(luò)服務(wù)
4 . 理解vuex狀態(tài)管理模式
5 . 掌握使用webpack來模塊化管理和打包

具體筆記

1. Vue項目的搭建

官方介紹文檔
根據(jù)官方示例搭建環(huán)境,并且使用webpack依賴創(chuàng)建一個Vue項目

# 全局安裝 vue-cli
$ npm install --global vue-cli
# 創(chuàng)建一個基于 webpack 模板的新項目
$ vue init webpack my-project
# 出現(xiàn)多行參數(shù)配置提示肝箱,一路回車就好
# 安裝依賴哄褒,走你
$ cd my-project
$ npm install
# npm install因命令安裝內(nèi)容較多,需要時間比較久
$ npm run dev
# 執(zhí)行run命令煌张,即可運行程序自動打開瀏覽器并顯示vue界面
# 此處使用的服務(wù)器端口號是8080呐赡,注意自己的電腦上是否有其他應(yīng)用占用此端口,有則改之

項目創(chuàng)建完成之后骏融,目錄結(jié)構(gòu)及其目錄內(nèi)文件功能說明如下圖:

.
├── build/                      # webpack config files
│   └── ...
├── config/
│   ├── index.js                # main project config
│   └── ...
├── src/
│   ├── main.js                 # app entry file
│   ├── App.vue                 # main app component
│   ├── components/             # ui components
│   │   └── ...
│   └── assets/                 # module assets (processed by webpack)
│       └── ...
├── static/                     # pure static assets (directly copied)
├── test/
│   └── unit/                   # unit tests
│   │   ├── specs/              # test spec files
│   │   ├── index.js            # test build entry file
│   │   └── karma.conf.js       # test runner config file
│   └── e2e/                    # e2e tests
│   │   ├── specs/              # test spec files
│   │   ├── custom-assertions/  # custom assertions for e2e tests
│   │   ├── runner.js           # test runner script
│   │   └── nightwatch.conf.js  # test runner config file
├── .babelrc                    # babel config
├── .postcssrc.js               # postcss config
├── .eslintrc.js                # eslint config
├── .editorconfig               # editor config
├── index.html                  # index.html template
└── package.json                # build scripts and dependencies

./src/components/Hello.vue就是服務(wù)器啟動后在瀏覽器中打開的vue組件链嘀,在編輯器中打開這個文件進行修改后保存,即可在瀏覽器中看到代碼的同步更新档玻。
如果出現(xiàn)語法錯誤或格式錯誤怀泊,瀏覽器也會直接提示error信息,十分簡單粗暴便利误趴。

2. Vue組件界面搭建

簡明的入門視頻教程Vue.js 2.0入門
Vue-resource 一個類似于ajax的工具
登錄組件搭建:

<template>
    <div class="login">
        <form @submit.prevent='submit'>
            <label>username:&nbsp</label>
            <input type="text" v-model='user.username'>
            <br>
            <label>password:&nbsp</label>
            <input type="password" v-model='user.password'>
            <br>
            <input type="submit" value="submit">
        </form>
    </div>
</template>

<script>
export default {
  name: 'login',
  data () {
    return {
      user: {
        username: '',
        password: ''
      }
    }
  },
  methods: {
    submit: function () {
      // 向后臺發(fā)送ajax請求
    }
  }
}
</script>

<style scoped>
.login {
  text-align: center;
}
</style>


3.后臺處理登錄請求

使用命令行創(chuàng)建express框架的新項目

express --view=hbs [project_name] 
npm install

實現(xiàn)Vue項目與node后臺的連接
(跨域訪問后臺的教程)[http://www.imooc.com/article/8093]
關(guān)鍵在于設(shè)置訪問來源地址

//在app.js中完成如下設(shè)置霹琼,即可實現(xiàn)兩個端口進程之間的通信
app.all("*", function (req, res, next) {
  // 修改Access-Control-Allow-Origin的參數(shù)值,設(shè)成'*'會有收到不明攻擊的危險凉当,因此最好改成指定地址
  res.header('Access-Control-Allow-Origin', 'http://localhost:[node端口號]');
  res.header("Access-Control-Allow-Headers", "Content-Type,Content-Length, Authorization, Accept,X-Requested-With");
  res.header("Access-Control-Allow-Methods","PUT,POST,GET,DELETE,OPTIONS");
  if (req.method == 'OPTIONS') {
    res.send(200);
  } else {
    next();
  }
});

前端Vue界面

<template>
    <div class="login">
    // 此處觸發(fā)submit函數(shù)枣申,通過.prevent禁止頁面的刷新跳轉(zhuǎn)
        <form @submit.prevent='submit'>   
            <label>username:&nbsp</label>
            <input type="text" v-model='user.username'>
      <br>
            <label>password:&nbsp</label>
            <input type="password" v-model='user.password'>
            <br>
            <input type="submit" value="login">
      <p v-if='user.validated'>{{user.errmsg}}</p>
        </form>
    </div>
</template>

<script>
export default {
  name: 'login',
  data () {
    return {
      user: {
        username: '',
        password: '',
        validated: false,
        errmsg: ''
      }
    }
  },
  methods: {
    submit: function () {
      this.$http.post('http://localhost:8888/login', {
        username: this.user.username,
        password: this.user.password
      }).then(function (res) {
        // res即為服務(wù)器端發(fā)送過來的信息,通過res.body獲取json數(shù)據(jù)
        console.log(res)
        this.user.errmsg = ''
        this.user.errmsg = res.body.errmsg
        this.user.validated = res.body.validated
        if (!res.body.validated) {
          alert('Welcome back, ' + this.user.username + ' !')
        }
      })
    }
  }
}
</script>

<style scoped>
.login {
  text-align: center;
}
</style>

后臺服務(wù)器數(shù)據(jù)請求與處理

//app.js
var express = require('express');
var app = express();
var bodyParser = require('body-parser');
var morgan = require('morgan');

var MongoClient = require('mongodb').MongoClient;
var mongoUrl = 'mongodb://localhost:27017/zhaopin';
var _db;

app.use(morgan('dev'));
app.use(bodyParser.json());
app.use(express.static('dist'));


app.all("*", function (req, res, next) {
  res.header('Access-Control-Allow-Origin', 'http://localhost:8080');
  res.header("Access-Control-Allow-Headers", "Content-Type,Content-Length, Authorization, Accept,X-Requested-With");
  res.header("Access-Control-Allow-Methods","PUT,POST,GET,DELETE,OPTIONS");
  if (req.method == 'OPTIONS') {
    res.send(200);
  } else {
    next();
  }
});

// 連接mongodb數(shù)據(jù)庫
MongoClient.connect(mongoUrl, function (err, db) {
  if(err) {
    console.error(err);
    return;
  }

  console.log('connected to mongo');
  _db = db;
  app.listen(8888, function () {
    console.log('server is running...');
  });
});

// ************ nodejs中的路由部分 ************
app.post('/login', function(req, res, next){
  var user  = req.body;
  console.log(user)
  var collection = _db.collection('user');
  if(!user.username || !user.password){
    res.send({validated: true, errmsg:"Please enter the entire info"});
    return;
  }
  collection.find({username: user.username}, function(err, ret){
    ret.toArray(function(err, doc){
      if (err) {
        console.log(err);
      }else if(doc.length == 1){
          if (doc[0].password == user.password) {
            res.send({validated: false, errmsg:''});
          } else {
            res.send({validated: true, errmsg:'Please enter the correct pwd...'})
            return;
          }
      }else{
        res.send({validated: true, errmsg: 'This account doesn\'t exist...'})
        return;
      }
    })
  })
})

app.post('/register', function(req, res, next){
  var user = req.body;
  var collection = _db.collection('user');
  if(!user.username || !user.password){
    res.send({validated: true, errmsg:"Please enter the entire info"});
    return;
  }
  collection.find({username: user.username}, function(err, ret){
    ret.toArray(function(err, doc){
      if (err) {
        console.log(err);
      }else if(doc.length == 1){
          res.send({validated: true, errmsg:"Sorry, this username has been registered!"});
          return;
      }else{
        collection.insert({username: user.username, password: user.password}, function(err, ret){
          if(err){
            console.error(err);
          }else {
            res.send({validated: false, errmsg: ''});
          }
        })
      }
    })
  });
})
// ************ nodejs中的路由部分 ************

完成效果圖

用戶注冊界面
用戶登錄界面
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末看杭,一起剝皮案震驚了整個濱河市忠藤,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌楼雹,老刑警劉巖模孩,帶你破解...
    沈念sama閱讀 218,607評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異烘豹,居然都是意外死亡瓜贾,警方通過查閱死者的電腦和手機诺祸,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,239評論 3 395
  • 文/潘曉璐 我一進店門携悯,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人筷笨,你說我怎么就攤上這事憔鬼。” “怎么了胃夏?”我有些...
    開封第一講書人閱讀 164,960評論 0 355
  • 文/不壞的土叔 我叫張陵轴或,是天一觀的道長。 經(jīng)常有香客問我仰禀,道長照雁,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,750評論 1 294
  • 正文 為了忘掉前任答恶,我火速辦了婚禮饺蚊,結(jié)果婚禮上萍诱,老公的妹妹穿的比我還像新娘。我一直安慰自己污呼,他們只是感情好裕坊,可當(dāng)我...
    茶點故事閱讀 67,764評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著燕酷,像睡著了一般籍凝。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上苗缩,一...
    開封第一講書人閱讀 51,604評論 1 305
  • 那天饵蒂,我揣著相機與錄音,去河邊找鬼挤渐。 笑死苹享,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的浴麻。 我是一名探鬼主播得问,決...
    沈念sama閱讀 40,347評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼软免!你這毒婦竟也來了宫纬?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,253評論 0 276
  • 序言:老撾萬榮一對情侶失蹤膏萧,失蹤者是張志新(化名)和其女友劉穎漓骚,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體榛泛,經(jīng)...
    沈念sama閱讀 45,702評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡蝌蹂,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,893評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了曹锨。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片孤个。...
    茶點故事閱讀 40,015評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖沛简,靈堂內(nèi)的尸體忽然破棺而出齐鲤,到底是詐尸還是另有隱情,我是刑警寧澤椒楣,帶...
    沈念sama閱讀 35,734評論 5 346
  • 正文 年R本政府宣布给郊,位于F島的核電站,受9級特大地震影響捧灰,放射性物質(zhì)發(fā)生泄漏淆九。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,352評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望炭庙。 院中可真熱鬧跪另,春花似錦、人聲如沸煤搜。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,934評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽擦盾。三九已至嘲驾,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間迹卢,已是汗流浹背辽故。 一陣腳步聲響...
    開封第一講書人閱讀 33,052評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留腐碱,地道東北人誊垢。 一個月前我還...
    沈念sama閱讀 48,216評論 3 371
  • 正文 我出身青樓,卻偏偏與公主長得像症见,于是被迫代替她去往敵國和親喂走。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,969評論 2 355

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

  • 轉(zhuǎn)載 :OpenDiggawesome-github-vue 是由OpenDigg整理并維護的Vue相關(guān)開源項目庫...
    果汁密碼閱讀 23,128評論 8 124
  • 夏天的熱是聒噪、黏稠的遵蚜,讓大人心情煩躁帖池,讓嬰兒哭鬧不止。白天還有得選擇吭净,大人們習(xí)慣拿著一把蒲扇睡汹、一個大水杯...
    王木昜閱讀 382評論 -2 5
  • 因為最近每天晚上在聽課,從八點到十點半寂殉,畫畫的時間就被擠掉了囚巴,只能堅持畫幾筆線條。 我們經(jīng)常不能堅持做一件事情很久...
    七七小七閱讀 333評論 0 0
  • tfboys和exo是這兩年風(fēng)頭正盛的兩個偶像團體不撑,一個來自中國文兢,一個來自韓國晤斩,那么在大陸誰更受歡迎呢焕檬? tfbo...
    行之書院閱讀 688評論 1 1
  • 莎希妮亞閱讀 146評論 0 0