上篇文章就說過,要搞個網站玩玩,結果4個月過去了,現在才動手,哎呀。。。。。。覺得自己身為程式設計師三四年了,是時候搞一個屬於自己獨立開發的專案出來,暫定小說型別網站。促使我做這件事主要有以下幾方面的原因:
1:同步更新文章可以鍛鍊自己的文字輸出能力。 2:寫文章的同時,可以加深自己對知識點的理解。 3:自己寫的專案,想怎麼搞就怎麼搞,可以把最新瞭解到的技術毫無顧忌的用到專案實踐當中。
說幹就幹,然後也就有了本系列文章,這將記錄我從零開始建站的全過程,包括前端搭建、後臺搭建、資料庫設計。技術選型分為:前端選擇VUE
,後臺還沒考慮好,JAVA
或者GO
(在我沒有確定之前,各位看到這篇文章的小夥伴可以提提意見喲),資料庫MySQL
。
一、使用vue cli
腳手架初始化專案。
首先安裝vue cli
,推薦使用vue cli3+
,開啟CMD
輸入如下命令:
npm install -g @vue/cli
複製程式碼
然後使用cli
建立一個專案
vue create hxkj-novel //hxkj-novel 為專案名
複製程式碼
建立完成後,用開發工具開啟,開發工具我這邊使用的是webStorm
,個人感覺用起來比較順手。開啟之後嘞,就會發現專案的目錄結構如下:
│ node_modules
│ package-lock.json
│ package.json //專案配置檔案
├─public
│ favicon.ico //網站圖示
│ index.html //入口HTML檔案
└─src
│ App.vue
│ main.js //入口JS檔案,一般全域性定義都在這裡面
├─assets //靜態資源放置目錄
│ logo.png
└─components //元件放置目錄
HelloWorld.vue
複製程式碼
二、接下來就是做一些基本的配置了。
1、配置代理
因為這個專案我打算做前後端分離模式,所以,在開發過程中必然會遇到跨域的問題,然後呢,就得解決這個問題啦,那就是配置反向代理嘍。
在專案的根目錄下新建 vue.config.js
檔案,自 Vue CLI 3
開始,專案中所有的配置資訊都寫在這個檔案中。
配置資訊如下:
//vue.config.js
module.exports = {
devServer: {
proxy: {// 設定代理
'/tsy': {
target: 'http://www.hxkj.vip',//設定呼叫的介面域名和埠號
changeOrigin: true,//開啟跨域訪問:在本地會建立一個虛擬服務端,然後傳送請求的資料,並同時接收請求的資料,這樣服務端和服務端進行資料的互動就不會有跨域問題
ws: true,// 是否啟用websockets
pathRewrite: {
'^/tsy': ''
}
}
}
}
}
複製程式碼
2、配置路由攔截器
我們可以通過路由攔截做什麼?我認為最主要的便是對許可權的控制,比如有的頁面需要登入了才能進入,有些頁面不同身份渲染不同.這個專案我引入了 mint ui
框架,所以我是結合 mint ui
中 messageBox
元件來處理的。由於路由攔截器跟路由路徑配置我是分開來寫的,一共用到兩個檔案。下面簡單的配置一下登入攔截:
//router.js檔案配置示例
import Vue from 'vue'
import VueRouter from 'vue-router'
import {routes} from "./routes"
import {MessageBox} from 'mint-ui'
Vue.use(VueRouter)
const router = new VueRouter({
routes
})
router.beforeEach((to, from, next) => {
if (to.matched.some(r => r.meta.requireAuth)) { //判斷該頁面是否需要登入後才能進入
// 判斷是否登入
if (store.getters.isLogin) { //已登入狀態 不攔截
next();
} else {//未登入狀態 攔截並重定向到登入頁
MessageBox.confirm('請登入您的賬號!', '溫馨提示').then(action => {
if (action == 'confirm') {
next({
path: '/login',
query: {redirect: to.fullPath}
})
}
}).catch(e => {
console.log(e)
});
}
} else {
next();
}
})
export default router;
複製程式碼
//routes.js檔案配置示例
import Home from '../components/home/Home'
import HomePage from '../components/home/HomePage'
import HomeMine from '../components/home/HomeMine'
export const routes = [
{
path: '/', name: 'home', component: Home, redirect: '/home/index', children: [
{path: '/home/index', name: 'homePage', component: HomePage, meta: {title: '雜湊小說網'}},
// 需要登入才能進入的頁面可以增加一個meta屬性--requireAuth: true
{path: '/home/mine', name: 'homeMine', component: HomeMine, meta: {title: '我的', requireAuth: true}}
]
}
]
複製程式碼
3、配置http攔截器
如果需要統一處理所有http
請求和響應,那麼就得用上 axios
的攔截器。通過配置http response inteceptor
,當後端介面返回401 Unauthorized
(未授權),就讓使用者重新登入。具體配置資訊如下:
//http.js檔案配置示例
import store from './store/store'
import axios from 'axios'
import router from './router/router'
// http request 攔截器
axios.interceptors.request.use(
config => {
if (store.state.token) { // 判斷是否存在token,如果存在的話,則每個http header都加上token
config.headers.Authorization = `token ${store.state.token}`;
}
return config;
},
err => {
return Promise.reject(err);
});
// http response 攔截器
axios.interceptors.response.use(
response => {
return response;
},
error => {
if (error.response) {
switch (error.response.status) {
case 401:
// 返回 401 清除token資訊並跳轉到登入頁面
store.commit(types.LOGOUT);
router.replace({
path: 'login',
query: {redirect: router.currentRoute.fullPath}
})
}
}
return Promise.reject(error.response.data) // 返回介面返回的錯誤資訊
});
複製程式碼
4、配置路由按需載入 按需載入,顧名思義-即在需要的時候進行載入,隨用隨載。在以往開發單頁應用的經驗中,發現,如果沒有應用按需載入,運用webpack打包後的檔案將會非常的大,簡直恐怖如斯,這樣就造成進入首頁時,需要載入的內容過多,延時過長,不利於使用者體驗,首頁卡個10幾秒,闊怕呀。而運用懶載入則可以將頁面進行劃分,需要的時候載入頁面,可以有效的分擔首頁所承擔的載入壓力,減少首頁載入用時。慣例,出示配置程式碼:
//routes.js檔案配置示例
const Home = resolve => require(['../components/home/Home'], resolve)
const HomePage = resolve => require(['../components/home/HomePage'], resolve)
const HomeMine = resolve => require(['../components/home/HomeMine'], resolve)
export const routes = [
{
path: '/', name: 'home', component: Home, redirect: '/home/index', children: [
{path: '/home/index', name: 'homePage', component: HomePage, meta: {title: '雜湊小說網'}},
{path: '/home/mine', name: 'homeMine', component: HomeMine, meta: {title: '我的'}}
]
}
]
複製程式碼
假如又遇到一個問題,不想要每個路由都單獨載入,需要按模組載入,那當然也是沒有問題的,配置資訊如下:
//routes.js檔案配置示例
//這裡以首頁模組為例
const Home = r => require.ensure([], () => r(require('../components/home/Home')), 'home')//home 就是改模組的名字,相同模組使用同一個名字就好
const HomePage = r => require.ensure([], () => r(require('../components/home/HomePage')), 'home')
const HomeMine = r => require.ensure([], () => r(require('../components/home/HomeMine')), 'home')
export const routes = [
{
path: '/', name: 'home', component: Home, redirect: '/home/index', children: [
{path: '/home/index', name: 'homePage', component: HomePage, meta: {title: '雜湊小說網'}},
{path: '/home/mine', name: 'homeMine', component: HomeMine, meta: {title: '我的'}}
]
}
]
複製程式碼
現在呢,基本的框架就搭建好了,剩下的就是編碼了。真的希望自己這次能夠堅持下來吧!!!
轉載請註明出處:www.jianshu.com/p/504fd2d78… 作者:TSY
喜歡的話,可以關注下我的微信公眾號