最近在擼一個小專案,原來做過幾個系統,主要用的是Extjs和SpringMVC。Vue瞭解過一點,看了一下官方文件感覺蠻好的(相比Extjs,“蠻好”兩字其實無法表達...)。原來的SpringMVC的架構因為是別人搭建好的,只是照葫蘆畫瓢的開發,也沒有足夠的精力去深入學習瞭解。然後我決定了這個專案的方案,Vue加Springboot,幾乎零基礎邊做邊學,雖然因為時間要求的比較緊把自己搞得壓力山大,不過最後還是如期開發完成~
架構方案
前端:Vux 做移動網頁版(朋友推薦,也確實比較溜。文件還算比較齊全的,不過我到現在還是沒搞出來 InlineCalendar的marks是怎麼用的)
後端:Springboot 參考 @Mr_初晨 的專欄,一步步搭的框架。感謝!
資料庫:MySQL
路由校驗
1.定義路由:通過設定meta來判斷是否需要進行校驗,我是全部都寫了
const routes = [
{
path: '/', component: Login},
{
path: '/home',
meta:{auth:true}, // 設定當前路由需要校驗 不需要校驗的路由就不用寫了
component: Home
},{
path: '/Reserve',
meta:{auth:true},
component: Reserve
},{
path: '/Cancel',
meta:{auth:true},
component: Cancel
},{
path: '/WorkInfo',
meta:{auth:true},
component: WorkInfo
},{
path: '/Detail/:type/:date',
meta:{auth:true},
component: Detail
}]
const router = new VueRouter({ routes})複製程式碼
2.通過路由鉤子對每次請求進行攔截,判斷是否已經登入。
這裡有個小坑,我本來是把使用者資訊存到Vuex裡面的,然後去驗證,興致勃勃的刷了個新,就GG了。後來查了下資料,Vuex的裡的資料重新整理就會清空的,採用了sessionStorage來儲存使用者資訊進行校驗。當瀏覽器關閉時才會清除。(區別localStorage,算是基礎知識了,不過我是第一次用~)
//路由攔截router.beforeEach((to,from,next) => {
if(to.matched.some( m => m.meta.auth)){
var userInfo = JSON.parse(sessionStorage.getItem('userInfo')); // 對路由進行驗證
if(userInfo) { // 已經登陸
next() // 正常跳轉到你設定好的頁面
}
else{ // 未登入則跳轉到登陸介面,query:{ Rurl: to.fullPath}表示把當前路由資訊傳遞過去方便登入後跳轉回來;
next({path:'/',query:{ Rurl: to.fullPath} })
}
}
else{
next()
} })複製程式碼
跨域請求
前後端分離就會碰到跨域的問題,我的解決方案很粗暴。
1.Springboot Controller增加跨域資源的註解
@CrossOrigin(origins = "*", maxAge = 3600)
複製程式碼
不要問我為什麼,我不知道,反正就這樣成功了,允許所有的跨域請求。阮神有篇文章有詳細介紹 跨域資源共享 CORS 詳解,我沒有仔細看。
2.統一BaseUrl
vux用的是axios,瞭解過,沒有認真瞭解。不知道BaseUrl怎麼配置,於是用了一個笨方法:全域性變數。我知道Webpack可以區分量產和測試環境分別配Url,但是沒有時間和精力研究了,專案結束後再認真學習吧~
前端config裡建立 global.js 檔案(其實隨便啦~)
const BASE_URL ="localhost:8080/"export default{ BASE_URL}複製程式碼
在main.js中import進來,新增到Vue全域性變數裡:
import global_ from "./../config/global"複製程式碼
Vue.prototype.GLOBAL = global_;複製程式碼
然後在元件中就可以這樣引用:
this.$http
.post(this.GLOBAL.BASE_URL+"user/login?id="+this.id+"&password="+this.password)
.then(function(response) {
console.log(response.data);
})
.catch(function(error) {
console.log('error'+error);
});複製程式碼
But,這樣搞在build的時候會報錯,報錯內容我忘記了,搜了一下好像是說global的這種寫法是ES6的沒有正確解析,需要用babel解析。解決方案是修改Webpack.base.conf.js檔案
原配置:
module: {
rules: [
{
test: /\.vue$/,
loader: 'vue-loader',
options: vueLoaderConfig
},
{
test: /\.js$/,
loader: 'babel-loader',
include: [resolve('src'), resolve('test')]
},
。。。複製程式碼
增加 resolve('config/global.js')
module: {
rules: [
{
test: /\.vue$/,
loader: 'vue-loader',
options: vueLoaderConfig
},
{
test: /\.js$/,
loader: 'babel-loader',
include: [resolve('src'), resolve('test'),resolve('config/global.js')]
},
。。。複製程式碼
打包部署
後端我是打成了jar包,Springboot本來就自帶Tomcat伺服器,感覺沒有必要打成war包再放到容器裡。
1.首先,我嘗試了把前端build的出來的dist資料夾下面的檔案(static目錄,index.html檔案)塞到springboot的resources/static下面:
根據Spring Boot 對靜態資源對映提供的預設配置,按道理 /index.html 是能夠找到這個目錄下面的index.html檔案的。但是顯示未定義介面,被攔截掉了。查了一下資料,應該是WebConfigurer裡用了SpringMvc的攔截方法。於是新增了
registry.addResourceHandler("/static/**").addResourceLocations( "classpath:/static/");複製程式碼
奢望能夠通過 /staitic/index.html來訪問,這樣index是可以訪問了,但是js檔案被攔截了~也沒有查到解決方案,遂放棄~應該是寫法不對,望大神們指教。後來需要一個apk的釋出網址,我就把index修改成apk下載網頁了~哦,apk下載也被攔截了,更改配置解決:
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("swagger-ui.html")
.addResourceLocations("classpath:/META-INF/resources/");
registry.addResourceHandler("doc.html")
.addResourceLocations("classpath:/META-INF/resources/");
registry.addResourceHandler("/static/**").addResourceLocations( "classpath:/static/");
registry.addResourceHandler("/app-release.apk").addResourceLocations( "classpath:/static/");
registry.addResourceHandler("/webjars/**")
.addResourceLocations("classpath:/META-INF/resources/webjars/");
super.addResourceHandlers(registry);
}複製程式碼
2.採用Nginx部署
前端的ajax請求不要用localhost,直接用IP地址,下載Nginx,修改配置檔案:
server {
listen 8079; 、、埠號
...
root /front/dist; //dist資料夾路徑
index index.html index.htm;
add_header Access-Control-Allow-Origin "*";
...
}複製程式碼
注意不要直接雙擊nginx.exe,這樣會導致修改配置後重啟、停止nginx無效,需要手動關閉工作管理員內的所有nginx程式
在nginx.exe目錄,開啟命令列工具,用命令 啟動/關閉/重啟nginx
start nginx : 啟動nginx
nginx -s reload :修改配置後重新載入生效
nginx -s reopen :重新開啟日誌檔案
nginx -t -c /path/to/nginx.conf 測試nginx配置檔案是否正確
關閉nginx:
nginx -s stop :快速停止nginx
nginx -s quit :完整有序的停止nginx
結語
至此,Vue和Springboot前後端分離的實踐算是基本完成,當然還有很多問題和知識點需要自己再去學習和了解。因為本職工作無論內容還是技術其實和這些不相干,投入的精力有限,也只能靠抽點時間自學。架構的問題點,不足之處也請多多指教。看了蠻久的掘金,第一次寫文章,發現技術領域的文章我完全沒有文筆,哈哈