學了vue和node一段時間了,折騰了一些零零散散的小東西。立刻大四了要出去找工做了,因此早就想搭一個我的站做爲一次較爲全面的總結。由於沒有設計功底,界面設計使我這種強迫症患者苦不堪言。幸而到最後花了一個星期,慢慢磨仍是作出來能看的。本文章也只是記錄一下小白的學習記錄,而後期待大佬進行指教。好了,開始正題吧。javascript
一:先放在線預覽地址吧(http://www.guoaihua.com)html
github:https://github.com/guoaihua/main_project/tree/master/zming前端
預覽圖:vue
二:技術棧:java
vue vue-routernode
axios mysql
expresswebpack
mongooseios
三.項目結構:git
前端項目結構: static中存放靜態資源 apis後端項目結構
四:環境搭建
.首先用安裝vue-cli ,安裝項目模版,進入項目安裝依賴
npm install -g vue-cli
vue init webpack project-name
cd project
npm install
npm run dev
當你看到vue頁面自動打開並顯示他的圖標時,頁面算是搭建成功了
五:開始編寫前端項目
1.在App.vue裏建好頁面結構,在頭部創建好路由標籤,這個在vue文檔中有很詳細的介紹,並將組件渲染到中間content中
<div id="app"> <div class="container"> <div class="header"> <h1 class="logoname">ZIming</h1> <ul> <li><router-link to='/contact'>聯繫我</router-link></li> <li><router-link to='/article'>我的介紹</router-link></li> <li><router-link to='/project'>項目展現</router-link></li> <li><router-link to='/person'>圖片欣賞</router-link></li> <li><router-link to='/home'>主頁</router-link></li> </ul> </div> <div class="content clear"> <router-view></router-view> </div> <div class="footer"></div> <span class="music-fly" @click="stop"> <img src="/static/imgs/music-fly.png" alt="" class="img-responsive"> <audio :src="src" autoplay="autoplay" id="audio"></audio> </span> </div> </div>
2.配置路由:這個項目模版已經建立好了(若是你在建立項目的時候點了vue-router yes的話),因此咱們只須要配置
src下的router下的index.js
import Vue from 'vue' import Router from 'vue-router' import home from '../components/home' import project from '../components/project' import article from '../components/article' import person from '../components/person' import contact from '../components/contact' Vue.use(Router) export default new Router({ routes: [ { path: '/home', name: 'home', component: home }, { path: '/person', name: 'person', component: person }, { path: '/article', name: 'article', component: article }, { path: '/project', name: 'project', component: project }, { path: '/contact', name: 'contact', component: contact }, { path:'/*', redirect:'/home' } ] })
最後一個重定向網頁到home,方便打開時顯示
3.編寫5個組件
這裏的也沒什麼特別的,可能有一個組件之間的通訊問題,我本身的作的比較簡單沒在用到vuex。可是以前碰到過坑,因此了記錄一下。
1.父子組件通訊
子組件動態獲取父組件數據
<input v-model="sendmessage">
<child :receive="sendmessage"></child>
{
props:['receive']
}
2.非父子組件通訊
爲了利用vue的 $emit() 和 $on() 事件,得先建立一個Vue實例
var bus = new Vue() //一般狀況下
此項目中因爲建立的實例沒有名稱,咱們從新建立一個Bus實例,並將他注入到根組件App下,便於其它組件都能訪問到
main.js
new Vue({
el: '#app',
store,
router,
template: '<App/>',
components: { App },
data:{
Bus:new Vue()
}
})
而後發送 經過this.$root.Bus訪問到根組件的實例,將它做爲載體傳送數據
//發送 數據
this.$root.Bus.$emit('showing',this.b);
//接受
this.$root.Bus.$on('showing', (data)=>{ this.pic=data.pic; this.name=data.name; this.author=data.author; this.src=data.src; }
至此大部分組件通訊能搞定了,涉及到複雜的話,那就要使用vuex了,這裏就再也不談了。
4.axios 發送異步請求,獲取數據
1.先安裝
cnpm i axios -D
在main.js中 import axios,而後悲催的發如今其它組件中沒法使用,而它也不支持Vue.use().gg..。一頓瘋狂百度以後發現了簡單的解決方案:改寫原型鏈,爲Vue實例的原型添加axios屬性
Vue.prototype.$axios = axios
其餘組件調用
this.$axios({});
2.好了,愉快的搞定了使用問題。而後在App.vue中發起了第一個ajax請求,這是請求本身寫好的後臺的一個api。
this.$axios.post('http://www.guoaihua.com:3000/users/saveInfo',{ ip:returnCitySN.cip, adress:returnCitySN.cname, time:new Date() }).then(function (res) { console.log(res); })
很不幸返回了一串英文,禁止跨域訪問。
想到CROS,就跑到服務器上給服務端的express中加了一個頭部
app.all('*',function (req,res,next) { res.header("Access-Control-Allow-Origin","*"); res.header("Access-Control-Allow-Headers","Content-Type"); next(); });
然而,事情每每並非那麼簡單的就結束了。當我調用一個搜狐查詢api時,一樣返回了禁止跨域訪問。我去。。開玩笑吧,我總不能去改它服務器吧。那。。那我就用webpack的proxy吧。在config下的index.js中找到了proxyTable
'/cityjson': { target: 'http://pv.sohu.com',
pathRewrite: {'^/cityjson' : '/cityjson'},
changeOrigin: true }
好,賊溜。故事的最後是上線的時候發現打包後部署到不行,它只適用與開發環境。崩潰了。。。。
冷靜一大下,想起來了跨域還有一個「」神奇的東西」 script標籤 ,我去這個好,很是愉快的在html.index加上了。
<script src="http://pv.sohu.com/cityjson"></script>
5.這些東西搞完以後,頁面也就差很少了,至於樣式佈局啥的就不寫了。
六.開始擼後端代碼了
1. 首先慣例,建立項目模版
npm install express-generator -g // 這要管理員權限
express project // 建立項目
npm i
npm start //ok
2.這個模版路由啥的已經寫好了,進去配置就ok
以前有一個音樂獲取的api :http://www.guoaihua.com:3000/users/001
這個001是能夠變化的,對應不一樣的歌曲,因此這裏使用了路由參數,這個:id及對應001,獲取參數須要中間件bodyParser解析
router.use(bodyParser.urlencoded({extended: false})); router.use(bodyParser.json());
而後在路由中,用req.param.id獲取。這樣就避免了寫無數個。由於這個是要返回music的,因此用了sendFile();並經過path將當前目錄映射到了musics
router.get('/:id', function(req, res, next) { res.sendFile(path.join(__dirname,'../musics',req.params.id+'.mp3')); });
3.mongodb ,在express框架中用mongoose模塊來控制mongodb
Schema
: 一種以文件形式存儲的數據庫模型骨架,不具有數據庫的操做能力
Model
: 由
Schema
發佈生成的模型,具備抽象屬性和行爲的數據庫操做對
Entity
: 由
Model
建立的實體,他的操做也會影響數據庫
mongodb的安裝就不說了。安裝mongoose
cnpm i mongoose -D
編寫配置文件 mongoose.js
var mongoose=require('mongoose'); var db=mongoose.connect('mongodb://localhost/test'); var DataSchema=new mongoose.Schema({ ip:{type:String}, adress:{type:String}, time:{type:Date,default:Date.now} }); var MesSchema=new mongoose.Schema({ name:{type:String}, qq:{type:Number}, email:{type:String}, phone:{type:Number}, message:{type:String}, time:{type:Date,default:Date.now} }); mongoose.model('usersInfo',DataSchema); mongoose.model('mesInfo',MesSchema);
首先建立Schema collections 至關於mysql中的表
而後用mongoose將Schema發佈爲model
調用,先經過mongoose.model獲取到發佈的model,再利用這個model建立一個實例,最後save。
var usersModel=mongoose.model('usersInfo'); var data=new usersModel({ ip:req.body.ip, adress:req.body.adress, time:req.body.time }); data.save(function(err){ console.log(err); });
七.將項目部署到服務端
首先打包前端項目
npm run build
而後將dist拷貝到了服務端新建的一個express項目中,並在它上面加上了,並npm start 開啓
app.use(express.static(path.join(__dirname,
'dist')));
後端代碼就無論了,不想改不少api接口,因此直接扔到服務端上。在開啓這個以前要先打開服務端的mongodb,而後node ./bin/www
好,至此一個完整的從前端界面設計到後端的數據庫項目都搞定了,頁面也很是越快的跑起來了。哈哈哈,然而,還有不少事情去作,性能優化,安全啥的.....
八.結語
哈哈,寫的有點亂七八糟的,以往都是看大神們的文章學習,今天激動了,小白本身動了一回手。沒啥技術可言,就是將本身踩的一些坑記錄了下來,方便之後回顧,若是能給其它小夥伴哪怕一點點幫助,我就很開心了0.0.最後項目在github上有發佈,求順手star一下(立刻大四了,要找工做了想着能有點用)