Vue 實現前后端分離項目

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。

Vue實現前后端分離項目的初體驗

經過之前學習的Vue的知識:

  • vue基本指令
  • vue組件
  • vue-resource
  • vue路由

其實我們已經可以開始實戰運用到實際的Web項目中了,由于本人是Java后端開發的,所以后端是基于SpringMVC的。

以下我們將演示如何使用Vue組件實現一個用戶登錄系統。

<!--more-->

介紹

后端

后端基于spring、springMVC、mybatis框架

對后端SSM框架搭建不熟悉的可以參考我的博文:?SSM項目整合

前端

前端使用了wepack打包工具,利用了vue.cli腳手架快速搭建的項目。由于本人對一些技術也不是很熟悉,所以給大家提供些官方文檔, 想要深入學習還是要仔細分析官方文檔。傳送門如下(也是本項目要用到的):

  • node.js
  • vue.js
  • vue-cli
  • vue-resource
  • vue-router
  • webpack
  • element-ui

以上技術都是比較常用的,webpack類似一個打包工具,它會將你項目中的Vue組件打包為一個龐大的js文件(當然我們是看不懂的),而我們的前端項目是部署在node.js提供的web容器中的。

即前后端分離的實際效果是這樣的:?

有沒有感覺很神奇,哈哈,反正我第一次見到的時候就是覺得很神奇,因為html中完全看不到任何js、css代碼,但是卻能渲染出來這么好看的頁面。下面我們就講一下,怎么實現這個過程吧!!

<br/>

環境

上面我們提到的技術,在本案例中都會遇到,后端的SSM框架請參考我的博客文檔,介紹一下前端環境的搭建:

1、安裝node.js

具體安裝流程還是要去看node.js官網。如果安裝完成,請在終端輸入npm -v查看是否安裝成功。一般會出現類似如下版本號:

v8.11.3

2、安裝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-resourceelement-ui),執行:

npm install vue-resource npm install element-ui

第一步:修改main.js

main.js文件是webpack的核心入口,我們需要在其中引入Vue-resource以及router

import VueResource from 'vue-resource'import router from './router/index.js'

在Vue實例中注冊router

new Vue({router,
});

完整代碼:

第二步:修改router/index.js

這是有關Vue路由的配置,前面我們也已經講過了vue的路由,這里不再多說,代碼如下:

如上就配置了,如果你訪問localhost:8081/,那么就會自動路由跳轉到login.vue組件中,提示我們登錄;其中的/home表示,如果登錄成功,就跳轉到home.vue組件中,相當于登錄成功后跳轉到后臺頁面。

第三步:創建login.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>

在上面的表單中,我們只需要關注三個點:

  • v-model="login.username"
  • v-model="login.password"
  • @click="submitForm('login')"

為什么不關注其他的? 注意,這個案例由于我使用了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()方法中就沒有設置。

第四部:創建home.vue

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

講了那么多,終于到了Controller層,這里就比較簡單了,就是根據獲取到的參數判斷數據庫中有沒有對應的用戶,有就登錄成功,否者虧登錄失敗。

由于我這里使用了shiro,需要將密碼加密處理,所以沒有直接傳入到service層,當然思路是相同的。

注意:

  • 我這個login.do接口返回的是JSON字符串,前面使用了@RestController注解,不要誤認為是返回的頁面,那么就會404的。
  • 接受的參數要用@RequestParam注解標記,不然會接受不到前端傳遞的數據

請求成功

跳轉到home組件中:

轉自:https://my.oschina.net/u/3955926/blog/1940500

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/448434.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/448434.shtml
英文地址,請注明出處:http://en.pswp.cn/news/448434.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C++對C的一些加強和變化

實用性加強&#xff1a; int main() {// C語言中的變量都必須在作用域開始的位置定義&#xff01;&#xff01;// C中更強調語言的“實用性”&#xff0c;所有的變量都可以在需要使用時再定義。for (int i 0; i < 10; i){std::cout << i << std::endl;}return…

優秀Unix管理員的七個習慣

摘要&#xff1a;Unix系統管理員可能會很懶或喜歡優雅的解決方法&#xff0c;這就是他們的存在之美。一位優秀的Unix系統管理員有著自己的習慣&#xff1a;不會等到問題來找你、精通所使用的工具和系統、確定事情優先次序和喜歡優雅的解決方案但不迷失等。 優秀的Unix系統管理員…

Vue.js 極簡小例:讀值、樣式調用、if判斷、a 標簽、點擊事件、管道

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 1. 寫法&#xff1a; <template><div id"app"><!-- 三目運算符使用 ‘ok’ 的值定義在 data 中-->{{ ok …

【快寫】基本思路及模板

快讀也可以了解一下 先從C自帶的輸出開始吧 cout<<n<<endl;這是最基本的輸出&#xff0c;適合初學者 &#xff08;雖然我到現在都還在用&#xff09; 然后稍微快一點的輸出 printf("%d",n);這個就比較快速了&#xff0c;但是對于那種毒瘤題目 故意卡你的…

C++與C中const的比較以及const和define的比較

C與C中const的比較&#xff1a; C語言中 const修飾的變量是一個 常變量&#xff0c;本質還是變量&#xff0c;有自己的地址空間C編譯器對const常量的處理 當碰見常量聲明時&#xff0c;在符號表中放入常量 > 問題&#xff1a;那又如何解釋取地址編譯過程中若發現對const使…

中國古典十大悲劇

一.《竇娥冤》  《竇娥冤》——元關漢卿 山陰書生竇天章因無力償還蔡婆的高利貸&#xff0c;把七歲的女兒竇娥送給蔡婆當童養媳來抵債。竇娥長大后與蔡婆兒子成婚&#xff0c;婚后兩年蔡子病死。后來蔡婆向賽盧醫索債&#xff0c;被賽盧醫騙至郊外謀害&#xff0c;為流氓張驢…

解決: Elements in iteration expect to have ‘v-bind:key‘ directives

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 報錯&#xff1a; Elements in iteration expect to have v-bind:key directives 原本寫法&#xff1a; <li v-for"site in s…

回來太多事需要處理

出差回來&#xff0c;發現太多事需要處理現在每個項目都在Delay。且沒有一個人是主動匯報項目的。這是非常不正常的現象。感覺有點累轉載于:https://www.cnblogs.com/boriscao/archive/2005/09/03/229368.html

不該失去的,一塊錢也不放棄

很多人都覺得&#xff0c;有錢人既然財力雄厚&#xff0c;花錢時必定毫不手軟。然而&#xff0c;觀察成功的CEO&#xff0c;你會發現&#xff0c;他們多數人花錢也花得小心&#xff0c;對于什么該花、值得花&#xff0c;算得十分精細。 華人首富、香港長江實業與和記黃埔董事局…

C++之引用

普通引用和常引用 1. 變量名的回顧 變量名實質上是一段連續存儲空間的別名&#xff0c;是一個標號(門牌號) 程序中通過變量來申請并命名內存空間 通過變量的名字可以使用存儲空間 問題&#xff1a;一段連續的內存空間是否只能有一個別名嗎&#xff1f; 2. C引用的概念 引…

Vue.js 極簡小例:數值計算、千米換算為米、九九乘法表、循環

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 代碼&#xff1a; <template><div id"app"><!-- 千米和米換算 --><div id "computed_props&quo…

shiro框架的學習

權限控制是shiro最核心的東西 Shiro權限聲明通常是使用以冒號分隔的表達式。一個權限表達式可以清晰的指定資源類型&#xff0c;允許的操作&#xff0c;可訪問的數據。同時&#xff0c;Shiro權限表達式支持簡單的通配符&#xff0c;可以更加靈活的進行權限設置。 下面以實例來說…

C++之內聯函數

內聯函數是一種特殊的函數&#xff0c;具有普通函數的特征&#xff08;參數檢查&#xff0c;返回類型等&#xff09; 內聯函數是對編譯器的一種請求&#xff0c;因此編譯器可能拒絕這種請求 內聯函數由 編譯器處理&#xff0c;直接將編譯后的函數體插入調用的地方 宏代碼片段…

媽媽培養天才的13絕招

作父母的&#xff0c;都希望自己的寶寶可以變得聰明、懂事&#xff0c;所以想盡辦法去讓寶寶上早教班、做早期智力開發……當然&#xff0c;這些做法對于開發寶寶智力能夠起到一定的幫助。但是&#xff0c;千萬別忽視您所能給予寶寶的家庭教育。    近日&#xff0c;日本一位…

Vue.js 極簡小例: 4 種方式樣式綁定、style 的多種方式實現

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 代碼&#xff1a; <template><div id"app"><!-- JSON方式使用樣式 --><div v-bind:style"{ colo…

C++之默認參數

一、什么是默認參數 C中可以在函數聲明時為參數提供一個默認值&#xff0c; 當函數調用時沒有指定這個參數的值&#xff0c;編譯器會自動用默認值代替 二、默認參數規則 只有參數列表后面部分的參數才可以提供默認參數值 一旦在一個函數調用中開始使用默認參數值&#xff…

50 Python - 裝飾器 類定義裝飾器

04 類定義裝飾器 上節通過函數定義裝飾器&#xff0c;本節通過類定義裝飾器 001 定義類裝飾器 定義一個類&#xff0c;類里面兩個函數&#xff0c;一個構造函數init()&#xff0c;一個調用函數call() 構造函數init時候&#xff0c;傳遞一個函數func()進來 調用函數call()&#…

C++之過載函數

過載函數的定義&#xff1a; 用同一個函數名定義不同的函數 當函數名和不同的參數搭配時函數的含義不同 過載函數的判斷標準&#xff1a; 函數重載至少滿足下面的一個條件&#xff1a; 參數個數不同 參數類型不同 參數順序不同 函數返回值不是函數重載的判斷標準 調用…

人民幣貶值會讓八類人損失慘重!有你嗎?

截至20日&#xff0c;人民幣本周對美元累計貶值1.24%&#xff0c;年初以來不到三個月時間累計貶值2.79%。分析人士表示&#xff0c;人民幣短期內仍有較強下跌壓力。本輪人民幣急貶預計將對幾類人群收入造成嚴重沖擊。 本周以來&#xff0c;人民幣對美元即期匯價持續單邊下跌。數…

Vue.js 極簡小例: 點擊事件

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 代碼&#xff1a; <template><div> <!-- jy_mothed 是在 js 中自定義的方法 --><button v-on:click"jy_mot…