Vue實現先後端分離項目的初體驗javascript
通過以前學習的Vue的知識:css
其實咱們已經能夠開始實戰運用到實際的Web項目中了,因爲本人是Java後端開發的,因此後端是基於SpringMVC的。html
如下咱們將演示如何使用Vue組件實現一個用戶登陸系統。前端
<!--more-->vue
後端基於spring、springMVC、mybatis框架java
對後端SSM框架搭建不熟悉的能夠參考個人博文: SSM項目整合node
前端使用了wepack打包工具,利用了vue.cli
腳手架快速搭建的項目。因爲本人對一些技術也不是很熟悉,因此給你們提供些官方文檔, 想要深刻學習仍是要仔細分析官方文檔。傳送門以下(也是本項目要用到的):webpack
以上技術都是比較經常使用的,webpack
相似一個打包工具,它會將你項目中的Vue組件打包爲一個龐大的js
文件(固然咱們是看不懂的),而咱們的前端項目是部署在node.js
提供的web容器中的。git
即先後端分離的實際效果是這樣的: github
有沒有感受很神奇,哈哈,反正我第一次見到的時候就是以爲很神奇,由於html
中徹底看不到任何js、css代碼,可是卻能渲染出來這麼好看的頁面。下面咱們就講一下,怎麼實現這個過程吧!!
<br/>
上面咱們提到的技術,在本案例中都會遇到,後端的SSM框架請參考個人博客文檔,介紹一下前端環境的搭建:
一、安裝node.js
具體安裝流程仍是要去看node.js
官網。若是安裝完成,請在終端輸入npm -v
查看是否安裝成功。通常會出現相似以下版本號:
v8.11.3
二、安裝VueCLI
腳手架
VueCLI
可以幫助咱們快速搭建一個webpack的項目。
在已經安裝好node.js
的前提上,在終端輸入:npm install vue-cli -g
開始安裝VueCLI。若是安裝完成,請在終端輸入:vue -V
,會出現以下版本信息:
2.9.6
具體安裝流程能夠參看:博文
因爲VueCLI腳手架已經幫咱們安裝好了webpack
、以及相關的node依賴包,因此咱們不須要再手動安裝了。
若是安裝完成,咱們能夠看到出現以下目錄結構:
在終端項目路徑下輸入npm run dev
命令;正常狀況下,會出現以下信息:
在瀏覽器中輸入指定的URL,會出現以下頁面:
咱們繼續觀察,打開項目中的index.html
咱們看到,這個HTML中沒有任何代碼,甚至沒有引入js、css,可是頁面中的視圖是怎樣渲染出來的呢?
仔細看項目結構,咱們能看到在src/components/
下有一個HelloWorld.vue
程序,咱們頁面中的程序就是經過這些.vue
組件來渲染出來的。
若是咱們想將項目部署到服務器上,你放一堆.vue
程序,瀏覽器是沒法解析出來的,因此咱們須要瞭解一下webpack
的打包命令:
npm run build
正常狀況下,會顯示上圖中的信息,表示打包成功了,會在項目根目錄中生成一個叫dist
的文件夾,裏面是生成的靜態項目:
咱們雙擊dist/index.html
,會看到和以前同樣的頁面,可是其中引入了一個XX.js
文件
通過上面的步驟咱們應該瞭解到了所謂前端分離的簡易概念,其實在以前的博文: Vue組件 咱們已經瞭解到了Vue的模塊化開發流程。配合.vue
組件,其實思路仍是相同的。
開始以前,咱們首先要安裝vue-resource
(element-ui
),執行:
npm install vue-resource npm install element-ui
main.js
文件是webpack
的核心入口,咱們須要在其中引入Vue-resource
以及router
import VueResource from 'vue-resource' import router from './router/index.js'
在Vue實例中註冊router
new Vue({ router, });
完整代碼:
這是有關Vue路由的配置,前面咱們也已經講過了vue的路由,這裏再也不多說,代碼以下:
如上就配置了,若是你訪問localhost:8081/
,那麼就會自動路由跳轉到login.vue
組件中,提示咱們登陸;其中的/home
表示,若是登陸成功,就跳轉到home.vue
組件中,至關於登陸成功後跳轉到後臺頁面。
在src/components/
下建立login.vue
組件。
login組件中表單樣式就再也不講了,咱們主要看一下怎樣利用v-model
綁定表單數據,並請求後端
表單原型
<!-- 登陸表單 --> <el-form :model="login" status-icon :rules="rule" ref="login"> <el-form-item prop="username"> <el-input prefix-icon="el-icon-ump-yonghu" v-model="login.username" auto-complete="off"/> </el-form-item> <el-form-item prop="password"> <el-input prefix-icon="el-icon-ump-mima" type="password" v-model="login.password" auto-complete="off"/> </el-form-item> <el-form-item> <el-checkbox class="check" v-model="checked">記住我</el-checkbox> </el-form-item> <el-form-item> <el-button class="btn" type="primary" @click="submitForm('login')">登陸</el-button> </el-form-item> </el-form> <div> <p><a href="#" class="tips">尚未帳號?點我去註冊</a></p> </div>
在上面的表單中,咱們只須要關注三個點:
爲何不關注其餘的? 注意,這個案例因爲我使用了element-ui
,從標籤中就能看出來,其中涉及到了一些element-ui提供的js校驗,咱們只須要關注Vue的邏輯便可。
提交表單
關於上面提到的element-ui的校驗部分
表單提交方法部分
methods: { submitForm(login) { this.$refs[login].validate((valid) => { if (valid) { //提交表單 this.$http.post('http://127.0.0.1:8080/login.do', { username: this.login.username, password: this.login.password }).then(result => { console.log(result); if (result.bodyText === 'index') { this.$router.push({ path: 'home' }); //跳轉到home組件中 } else { console.log("登陸失敗"); return false; } }); } else { console.log('error submit!!'); return false; } }); }, }
上面就是咱們要講到的核心部分:請求後端的接口
解釋:
首先須要注意的this.$refs[login].validate((valid)){}
是element-ui提供的表單驗證的邏輯,可是是結合vue.js的。由於咱們若在不驗證表單直接提交的時候,會在表單提交按鈕中直接傳@click="submitForm(login)"
,由於此時的login
是一個data
中已經聲明的對象,其中包含兩個參數:username
,password
。而element-ui提供的方式則會根據.validate()
獲取到login
所包含的參數從而實現校驗。
通過上面的校驗,若是校驗成功,那麼將調用this.$http.post()
進行提交post表單,這是vue-resource
提供的方式,博文 中咱們也講過。其中包含了兩個參數,username,password。
請求成功,調用.then()
回獲取到成功的請求結果。判斷請求的結果:我這裏是從後端返回的參數(return "index"
)中判斷是否登陸成功,若是能錄成功,就應該跳轉到home
組件中。
調用vue-router
中提供的$router.push
方法,咱們能夠理解爲向Router
對象中添加了一條路由地址,其URL是:path: 'home'
,那麼就代表了會跳轉帶名字叫/home
的路徑下,整好對應的是咱們配置好的home.vue
組件。
注意:
最重要的就是跨域請求問題,本例中node.js
提供的web服務器地址是:127.0.0.1:8081
,可是咱們後端Tomcat服務器的地址是:127.0.0.1:8080
,而默認是不能在一個域中訪問另外一個域中的資源的,因此也就出現了跨域請求的概念。
其次重要的就是$http.post()
的第一個參數:URL地址,不要寫locahost:
,不要寫.... 具體緣由不是很清楚,否則請求還會報錯爲跨域請求。
解決跨域請求的方式也有不少,這裏我提供一個比較簡單的方式,只須要在後端的web.xml
中提供一個容許跨域訪問的過濾器就好了,後面會介紹。
還有就是以前咱們就說過Vue中默認提交的post請求時不包含表單格式的,因此須要配置,我已經在main.js
中寫了Vue.http.options.emulateJSON = true;
設置全局表單提交格式,因此在post()
方法中就沒有設置。
在src/components/
下建立home.vue
組件
<br/> <br/>
通過上面介紹了前端搭建步驟後,搭建後端咱們就相對熟悉了,咱們的目標就是在controller中提供一個接口login.do
讓前端訪問。
以前已經說了跨域請求很重要,否則咱們寫的全部請求都沒法順利訪問後端接口。解決的方式以下:
配置
咱們只須要在項目中的web.xml
中配置以下代碼便可。由於這個過濾器是tomcat提供的,因此咱們並不須要導入任何jar包。
<!--配置容許跨域訪問--> <filter> <filter-name>CorsFilter</filter-name> <filter-class>org.apache.catalina.filters.CorsFilter</filter-class> </filter> <filter-mapping> <filter-name>CorsFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
講了那麼多,終於到了Controller層,這裏就比較簡單了,就是根據獲取到的參數判斷數據庫中有沒有對應的用戶,有就登陸成功,否者虧登陸失敗。
因爲我這裏使用了shiro,須要將密碼加密處理,因此沒有直接傳入到service層,固然思路是相同的。
注意:
login.do
接口返回的是JSON字符串,前面使用了@RestController
註解,不要誤認爲是返回的頁面,那麼就會404的。@RequestParam
註解標記,否則會接受不到前端傳遞的數據請求成功
跳轉到home組件中:
<br/>
若是你們有興趣,歡迎你們加入個人Java交流羣:671017003 ,一塊兒交流學習Java技術。博主目前一直在自學JAVA中,技術有限,若是能夠,會盡力給你們提供一些幫助,或是一些學習方法,固然羣裏的大佬都會積極給新手答疑的。因此,別猶豫,快來加入咱們吧!
<br/>
If you have some questions after you see this article, you can contact me or you can find some info by clicking these links.