結合Vue.js從無到有架設一個網站
這是用laravel5.4(Back-end)以及Vue2.0(Front-end)做成的專案,為什麼選這兩個配搭?網路上有很多人寫的評論可以自行去google
需求:
PHP 7.2.9(cli)
Composer 1.7.2
Server 10.1.35-MariaDB
Laravel 5.4
Vue 2.0
Create新laravel專案
找到想安裝專案的資料夾,Ctrl+Shift+右鍵 -> 在此處開起命令視窗 ( 就是開起命令提示字元CMD ),輸入以下字串:
composer create-project --prefer-dist laravel/laravel 專案名稱 "5.4.0"
安裝專案會用到的Plugin(laravel方面的)
1. PHP-JWT
我們會需要帳號密碼登入,所以會用到jwt來增加重要資料的保密性
composer require firebase/php-jwt
清除默認安裝配置(laravel方面的)
移除app/Http/Controllers/Auth
整個資料夾,我們會用jwt來做用戶認證功能
移除resources/views/welcome.blade.php
文件,這個是默認的歡迎頁面,我們不需要它
新增我們需要用到的資料夾(laravel方面的)
後端部分
我為了讓MVC架構更明確,我會把Model獨立初一個資料夾,Controllers底下分API跟Web資料夾,Controller不會直接去跟Model溝通,會透過Repositories,然後主要的功能我都會放在Services資料夾
新增app/Http/Controllers/Web
資料夾,放置這個專案會用到的控制器
新增app/Http/Controllers/API
資料夾,放置外部專案可以call的控制器
新增app/Models
資料夾,放置跟資料庫各個table溝通的檔案
新增app/Repositories
資料夾,每個model基本上都會有一個專屬的repository,提供給controller呼叫用
新增app/Services
資料夾,主要功能會放置在這邊,也會放一個檔案裏面的function為共用的
前端部分
View方面我會習慣把相關功能放在同一個資料夾裡,但是因為前端要用Vue基本上都用透過Vue去換頁,所以這邊會縮編一些頁面,然後還會將整個專案做出一個template框架,基本上一個專案每個頁面應該只會有內容不一樣,head的內容以及footer的內容或是所要套用的js、css基本上都大同小異
新增resources/views/login
資料夾,放登入相關的頁面
新增resources/views/layouts
資料夾,放template、JS、CSS、Metatag的集中匯入檔案
新增resources/views/pages
資料夾,放所有頁面
新增resources/views/errors
資料夾,錯誤頁面
新增我們需要用到的檔案(laravel方面的)
後端部分
新增app/Http/Controllers/Web/LoginController.php
,掌管登入頁傳值,判斷帳密,是否可以登入,以及登出功能、將登入的會員資料加密存到session
新增app/Http/Middleware/AuthUserData.php
,每個頁面在切換的時候,都會去判斷token有沒有過期,沒有的話會更新一次token,有的話會直接將會員登出並導向登入頁清掉所有的session,判斷JWT、判斷token是否有誤都是在這邊
新增app/Services/AuthService.php
,將會員資料存到Session,存在這邊當然取也是在這邊,清除也是在這邊
新增app/Services/CommonTools.php
,所有後端會用到的判斷function或是紀錄function或是通用小功能都會放在這
新增app/Services/JWTController.php
,JWT功能在這邊
新增config/global.php
,全域變數會放在這邊
前端部分
新增resources/views/layouts/css_list.blade.php
,個別把css匯入抓出一個檔案放置
新增resources/views/layouts/js_list.blade.php
,個別把js匯入抓出一個檔案放置
新增resources/views/layouts/metatag_list.blade.php
,把所有的metatag以及有關seo的東西都放置在此
新增resources/views/layouts/template.blade.php
,主要框架
新增或修改文字到指定的檔案(laravel方面的)
app/Http/Kernel.php
裡的$routeMiddleware
新增'userdata' => \App\Http\Middleware\AuthUserData::class,
這樣才有辦法每次跳頁的時候要去抓這個值判斷裡面的東西,有點算是一種宣告
config/app.php裡的name可以改成你現在專案的名稱、timezone改成Asia/Taipei
config/global.php裡新增,這三個是JWT會用到的變數
// 密鑰
'secret' => env('JWT_SECRET', 'XXXXXXXXX'),
// 加密演算法
'algo' => 'XXXX',
// 專案名稱
'servername' => 'XXXX',
串接資料庫
config/database.php裡設定要連接的資料庫,然後將資料庫裡面每個資料表都新增一個model到app/Models
底下,每個model再新增一個repository到app/Repositories
底下
安裝Vue到專案裡
因為npm 跟composer有一樣的特性,你可以直接在composer.json檔案裡面直接新增或刪除某個元件,然後執行composer update就可以直接幫妳新增或移除整個元件了,npm一樣,直接修改package.json檔案裡面,然後再執行npm install就可以囉。
以下是我package.json裡面的設定
{
"private": true,
"scripts": {
"dev": "node node_modules/cross-env/dist/bin/cross-env.js NODE_ENV=development node_modules/webpack/bin/webpack.js --progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js",
"watch": "node node_modules/cross-env/dist/bin/cross-env.js NODE_ENV=development node_modules/webpack/bin/webpack.js --watch --progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js",
"hot": "node node_modules/cross-env/dist/bin/cross-env.js NODE_ENV=development node_modules/webpack-dev-server/bin/webpack-dev-server.js --inline --hot --config=node_modules/laravel-mix/setup/webpack.config.js",
"production": "node node_modules/cross-env/dist/bin/cross-env.js NODE_ENV=production node_modules/webpack/bin/webpack.js --progress --hide-modules --config=node_modules/laravel-mix/setup/webpack.config.js"
},
"devDependencies": {
"axios": "^0.15.2",
"bootstrap-sass": "^3.3.7",
"jquery": "^3.1.0",
"eslint": "^5.3.0",
"foundation-sites": "^6.5.0-rc.3",
"laravel-mix": "^0.10.0",
"lodash": "^4.16.2",
"vue": "^2.0.1",
"vue-infinite-scroll": "^2.0.2",
"vue-router": "^3.0.1",
"vuex": "^3.0.1"
},
"dependencies": {
"popper.js": "^1.14.4",
"v-tooltip": "^2.0.0-rc.33",
"vue-clipboard2": "^0.2.1"
}
}
//以下是安裝的外掛的官網
//popper.js => https://github.com/FezVrasta/popper.js#installation
//v-tooltip => https://github.com/Akryum/v-tooltip
//vue-clipboard2 => https://github.com/Inndy/vue-clipboard2
//Vue CLI => https://cli.vuejs.org/
//vue-router => https://router.vuejs.org/zh/
//vuex => https://vuex.vuejs.org/zh/
//vue-infinite-scroll => https://github.com/ElemeFE/vue-infinite-scroll
//foundation-sites => https://github.com/zurb/foundation-sites
清除默認安裝配置(vue方面的)
基本上我會把resources/assets/js底下除了app.js留著其他都刪掉
基本上我會把resources/assets/sass底下除了app.scss留著其他都刪掉
移除本身自帶的bootstrap
npm remove bootstrap --save-dev
npm remove bootstrap-sass --save-dev
新增我們需要用到的資料夾(vue方面的)
我習慣分門別類放置檔案,js部分我會新增api、components、mixins、modules、pages資料夾,sass我會新增abstracts、base、components、layouts、pages、themes、vendors資料夾,每個資料夾用途跟laravel雷同這邊不贅述,其實看名稱也大概知道這資料夾該放些什麼了吧
新增我們需要用到的檔案(vue方面的)
一剛開始沒有太多的檔案要放,最主要每個頁面都會有個js檔放置在resources/assets/js底下然後這個js檔會有一個.vue檔放在resources/assets/js/pages底下,js檔主要是用來import那個.vue檔
新增或修改文字到指定的檔案(vue方面的)
修改resources/assets/js/app.js成以下這樣
window._ = require('lodash');
try {
window.$ = window.jQuery = require('jquery');
require('foundation-sites');
} catch (e) {}
/**
* We'll load the axios HTTP library which allows us to easily issue requests
* to our Laravel back-end. This library automatically handles sending the
* CSRF token as a header based on the value of the "XSRF" token cookie.
*/
window.axios = require('axios');
window.axios.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest';
/**
* Next we will register the CSRF Token as a common header with Axios so that
* all outgoing HTTP requests automatically have it attached. This is just
* a simple convenience so we don't have to attach every token manually.
*/
let token = document.head.querySelector('meta[name="csrf-token"]');
if (token) {
window.axios.defaults.headers.common['X-CSRF-TOKEN'] = token.content;
} else {
console.error('CSRF token not found: https://laravel.com/docs/csrf#csrf-x-csrf-token');
}
import Vue from 'vue';
import router from './routes.js';
import VTooltip from 'v-tooltip';
import VueClipboard from 'vue-clipboard2'
var infiniteScroll = require('vue-infinite-scroll');
Vue.use(VTooltip);
Vue.use(VueClipboard);
Vue.use(infiniteScroll);
new Vue({
router
}).$mount('#app');
修改resources/assets/sass/app.scss成以下這樣
@import "node_modules/foundation-sites/assets/foundation.scss";
--------------------------------------------才到第五步---------------------------------------------------
Last updated
Was this helpful?