教務(wù)系統(tǒng)實(shí)訓(xùn)一

實(shí)訓(xùn)(一)

1.安裝 nodejs

2.安裝 git

3.下載?vue-element-admin

git clone https://github.com/PanJiaChen/vue-admin-template.git

cd vue-admin-template

npm install

npm run dev


啟動(dòng)成功


啟動(dòng)成功

進(jìn)入router/index.js横蜒,刪除多余界面爱谁,刪除后結(jié)果如下:

import?Vue?from?'vue'

import?Router?from?'vue-router'

Vue.use(Router)

/*?Layout?*/

import?Layout?from?'@/layout'

/**

?*?Note:?sub-menu?only?appear?when?route?children.length?>=?1

?*?Detail?see:?https://panjiachen.github.io/vue-element-admin-site/guide/essentials/router-and-nav.html

?*

?*?hidden:?true???????????????????if?set?true,?item?will?not?show?in?the?sidebar(default?is?false)

?*?alwaysShow:?true???????????????if?set?true,?will?always?show?the?root?menu

?*????????????????????????????????if?not?set?alwaysShow,?when?item?has?more?than?one?children?route,

?*????????????????????????????????it?will?becomes?nested?mode,?otherwise?not?show?the?root?menu

?*?redirect:?noRedirect???????????if?set?noRedirect?will?no?redirect?in?the?breadcrumb

?*?name:'router-name'?????????????the?name?is?used?by?<keep-alive>?(must?set!!!)

?*?meta?:?{

????roles:?['admin','editor']????control?the?page?roles?(you?can?set?multiple?roles)

????title:?'title'???????????????the?name?show?in?sidebar?and?breadcrumb?(recommend?set)

????icon:?'svg-name'/'el-icon-x'?the?icon?show?in?the?sidebar

????breadcrumb:?false????????????if?set?false,?the?item?will?hidden?in?breadcrumb(default?is?true)

????activeMenu:?'/example/list'??if?set?path,?the?sidebar?will?highlight?the?path?you?set

??}

?*/

/**

?*?constantRoutes

?*?a?base?page?that?does?not?have?permission?requirements

?*?all?roles?can?be?accessed

?*/

export?const?constantRoutes?=?[

??{

????path:?'/login',

????component:?()?=>?import('@/views/login/index'),

????hidden:?true

??},

??{

????path:?'/404',

????component:?()?=>?import('@/views/404'),

????hidden:?true

??},

??{

????path:?'/',

????component:?Layout,

????redirect:?'/dashboard',

????children:?[{

??????path:?'dashboard',

??????name:?'Dashboard',

??????component:?()?=>?import('@/views/dashboard/index'),

??????meta:?{?title:?'首頁(yè)',?icon:?'dashboard'?}

????}]

??},

????{

??????path:?'/school',

??????component:?Layout,

??????meta:?{?title:?'學(xué)校管理',?icon:?'example'?},

??????redirect:?'school',

??????children:?[{

????????path:?'school',

????????name:?'school',

????????component:?()?=>?import('@/views/school'),

????????meta:?{?title:?'學(xué)校管理',?icon:?'school'?}

??????},

????????{

??????????path:?'editor',

??????????name:?'editor',

??????????component:?()?=>?import('@/views/school/editor'),

??????????meta:?{?title:?'添加學(xué)校',?icon:?'school'?}

????????}]

????},


????{

??????path:?'/academy',

??????component:?Layout,

??????meta:?{?title:?'學(xué)院管理',?icon:?'example'?},

??????redirect:?'academy',

??????children:?[{

????????path:?'academy',

????????name:?'academy',

????????component:?()?=>?import('@/views/academy'),

????????meta:?{?title:?'學(xué)院管理',?icon:?'academy'?}

??????},

????????{

??????????path:?'editor',

??????????name:?'editor',

??????????component:?()?=>?import('@/views/academy/editor'),

??????????meta:?{?title:?'添加學(xué)院',?icon:?'academy'?}

????????}]

????},


????{

??????path:?'/classs',

??????component:?Layout,

??????meta:?{?title:?'班級(jí)管理',?icon:?'example'?},

??????redirect:?'/classs',

??????children:?[{

????????path:?'classs',

????????name:?'classs',

????????component:?()?=>?import('@/views/classs'),

????????meta:?{?title:?'班級(jí)管理',?icon:?'classs'?}

??????},

????????{

??????????path:?'editor',

??????????name:?'editor',

??????????component:?()?=>?import('@/views/classs/editor'),

??????????meta:?{?title:?'添加班級(jí)',?icon:?'classs'?}

????????}]

????},


????{

??????path:?'/student',

??????component:?Layout,

??????meta:?{?title:?'學(xué)生管理',?icon:?'example'?},

??????redirect:?'/student',

??????children:?[{

????????path:?'student',

????????name:?'student',

????????component:?()?=>?import('@/views/student/index'),

????????meta:?{?title:?'學(xué)生管理',?icon:?'user'?}

??????},

????????{

??????????path:?'editor',

??????????name:?'editor',

??????????component:?()?=>?import('@/views/student/editor'),

??????????meta:?{?title:?'添加學(xué)生',?icon:?'user'?}

????????}]

????},


????{

????????path:?'/teacher',

????????component:?Layout,

????????meta:?{?title:?'老師管理',?icon:?'example'?},

????????redirect:?'/teacher',

????????children:?[{

??????????path:?'teacher',

??????????name:?'teacher',

??????????component:?()?=>?import('@/views/teacher'),

??????????meta:?{?title:?'老師管理',?icon:?'user'?}

????????},

??????????{

????????????path:?'editor',

????????????name:?'editor',

????????????component:?()?=>?import('@/views/teacher/editor'),

????????????meta:?{?title:?'添加老師',?icon:?'user'?}

??????????}]

??????},


??????//?404?page?must?be?placed?at?the?end?!!!

??????{?path:?'*',?redirect:?'/404',?hidden:?true?}

????]


????const?createRouter?=?()?=>?new?Router({

??????//?mode:?'history',?//?require?service?support

??????scrollBehavior:?()?=>?({?y:?0?}),

??????routes:?constantRoutes

????})


????const?router?=?createRouter()


????//?Detail?see:?https://github.com/vuejs/vue-router/issues/1234#issuecomment-357941465

????export?function?resetRouter()?{

??????const?newRouter?=?createRouter()

??????router.matcher?=?newRouter.matcher?//?reset?router

????}


????export?default?router

安裝ES6語(yǔ)法插件

npm install --save es6-promise

打開utils/http.js,編寫代碼调煎,結(jié)果如下:

import?Vue?from?'vue';

import?Axios?from?'axios';

import?{Promise}?from?'es6-promise';

import?{MessageBox,?Message}?from?'element-ui'

Axios.defaults.timeout?=?30000;?//?1分鐘

Axios.defaults.baseURL?=?'';

Axios.interceptors.request.use(function?(config)?{

??//?Do?something?before?request?is?sent

??//change?method?for?get

??/*if(process.env.NODE_ENV?==?'development'){

??????config['method']?=?'GET';

??????console.log(config)

??}*/

??if?(config['MSG'])?{

????//?Vue.prototype.$showLoading(config['MSG']);

??}?else?{

????//?Vue.prototype.$showLoading();

??}

??//?if(user.state.token){//用戶登錄時(shí)每次請(qǐng)求將token放入請(qǐng)求頭中

??//???config.headers["token"]?=?user.state.token;

??//?}

??if?(config['Content-Type']?===?'application/x-www-form-urlencoded;')?{//默認(rèn)發(fā)application/json請(qǐng)求培己,如果application/x-www-form-urlencoded;需要使用transformRequest對(duì)參數(shù)進(jìn)行處理

????/*config['Content-Type']?=?'application/x-www-form-urlencoded;charset=UTF-8';*/

????config.headers['Content-Type']?=?'application/x-www-form-urlencoded;charset=UTF-8';

????config['transformRequest']?=?function?(obj)?{

??????var?str?=?[];

??????for?(var?p?in?obj)

????????str.push(encodeURIComponent(p)?+?"="?+?encodeURIComponent(obj[p]));

??????return?str.join("&")

????};

??}

??//config.header['Content-Type']?=?'application/x-www-form-urlencoded;?charset=UTF-8';

??return?config;

},?function?(error)?{

??//?Do?something?with?request?error

??//?Vue.$vux.loading.hide()

??return?Promise.reject(error);

});

Axios.interceptors.response.use(

??response?=>?{

????//?Vue.$vux.loading.hide();

????return?response.data;

??},

??error?=>?{

????//?Vue.$vux.loading.hide();

????if?(error.response)?{

??????switch?(error.response.status)?{

????????case?404:

??????????Message({

????????????message:?''?||?'Error',

????????????type:?'error',

????????????duration:?5?*?1000

??????????})

??????????break;

????????default:

??????????Message({

????????????message:?''?||?'Error',

????????????type:?'error',

????????????duration:?5?*?1000

??????????})

??????}

????}?else?if?(error?instanceof?Error)?{

??????console.error(error);

????}?else?{

??????Message({

????????message:?''?||?'Error',

????????type:?'error',

????????duration:?5?*?1000

??????})

????}

????return?Promise.reject(error.response);

??});

export?default?Vue.prototype.$http?=?Axios;

配置axios代理巡揍,修改vue.config.js文件蘑斧,結(jié)果如下:

'use?strict'

const?path?=?require('path')

const?defaultSettings?=?require('./src/settings.js')

function?resolve(dir)?{

??return?path.join(__dirname,?dir)

}

const?name?=?defaultSettings.title?||?'vue?Admin?Template'?//?page?title

//?If?your?port?is?set?to?80,

//?use?administrator?privileges?to?execute?the?command?line.

//?For?example,?Mac:?sudo?npm?run

//?You?can?change?the?port?by?the?following?methods:

//?port?=?9528?npm?run?dev?OR?npm?run?dev?--port?=?9528

const?port?=?process.env.port?||?process.env.npm_config_port?||?9528?//?dev?port

//?All?configuration?item?explanations?can?be?find?in?https://cli.vuejs.org/config/

module.exports?=?{

??/**

???*?You?will?need?to?set?publicPath?if?you?plan?to?deploy?your?site?under?a?sub?path,

???*?for?example?GitHub?Pages.?If?you?plan?to?deploy?your?site?to?https://foo.github.io/bar/,

???*?then?publicPath?should?be?set?to?"/bar/".

???*?In?most?cases?please?use?'/'?!!!

???*?Detail:?https://cli.vuejs.org/config/#publicpath

???*/

??publicPath:?'/',

??outputDir:?'dist',

??assetsDir:?'static',

??lintOnSave:?process.env.NODE_ENV?===?'development',

??productionSourceMap:?false,

??devServer:?{

????port:?port,

????open:?true,

????overlay:?{

??????warnings:?false,

??????errors:?true

????},

????proxy:?{

??????//?change?xxx-api/login?=>?mock/login

??????//?detail:?https://cli.vuejs.org/config/#devserver-proxy

??????[process.env.VUE_APP_BASE_API]:?{

????????target:?`http://127.0.0.1:${port}/mock`,

????????changeOrigin:?true,

????????pathRewrite:?{

??????????['^'?+?process.env.VUE_APP_BASE_API]:?''

????????}

??????},

??????['/api']:?{

????????target:?`http://127.0.0.1:3000`,

????????changeOrigin:?true,

????????pathRewrite:?{

??????????['^'?+?'/api']:?''

????????}

??????}

????},

????after:?require('./mock/mock-server.js')

??},

??configureWebpack:?{

????//?provide?the?app's?title?in?webpack's?name?field,?so?that

????//?it?can?be?accessed?in?index.html?to?inject?the?correct?title.

????name:?name,

????resolve:?{

??????alias:?{

????????'@':?resolve('src')

??????}

????}

??},

??chainWebpack(config)?{

????config.plugins.delete('preload')?//?TODO:?need?test

????config.plugins.delete('prefetch')?//?TODO:?need?test

????//?set?svg-sprite-loader

????config.module

??????.rule('svg')

??????.exclude.add(resolve('src/icons'))

??????.end()

????config.module

??????.rule('icons')

??????.test(/\.svg$/)

??????.include.add(resolve('src/icons'))

??????.end()

??????.use('svg-sprite-loader')

??????.loader('svg-sprite-loader')

??????.options({

????????symbolId:?'icon-[name]'

??????})

??????.end()

????//?set?preserveWhitespace

????config.module

??????.rule('vue')

??????.use('vue-loader')

??????.loader('vue-loader')

??????.tap(options?=>?{

????????options.compilerOptions.preserveWhitespace?=?true

????????return?options

??????})

??????.end()

????config

????//?https://webpack.js.org/configuration/devtool/#development

??????.when(process.env.NODE_ENV?===?'development',

????????config?=>?config.devtool('cheap-source-map')

??????)

????config

??????.when(process.env.NODE_ENV?!==?'development',

????????config?=>?{

??????????config

????????????.plugin('ScriptExtHtmlWebpackPlugin')

????????????.after('html')

????????????.use('script-ext-html-webpack-plugin',?[{

????????????//?`runtime`?must?same?as?runtimeChunk?name.?default?is?`runtime`

??????????????inline:?/runtime\..*\.js$/

????????????}])

????????????.end()

??????????config

????????????.optimization.splitChunks({

??????????????chunks:?'all',

??????????????cacheGroups:?{

????????????????libs:?{

??????????????????name:?'chunk-libs',

??????????????????test:?/[\\/]node_modules[\\/]/,

??????????????????priority:?10,

??????????????????chunks:?'initial'?//?only?package?third?parties?that?are?initially?dependent

????????????????},

????????????????elementUI:?{

??????????????????name:?'chunk-elementUI',?//?split?elementUI?into?a?single?package

??????????????????priority:?20,?//?the?weight?needs?to?be?larger?than?libs?and?app?or?it?will?be?packaged?into?libs?or?app

??????????????????test:?/[\\/]node_modules[\\/]_?element-ui(.*)/?//?in?order?to?adapt?to?cnpm

????????????????},

????????????????commons:?{

??????????????????name:?'chunk-commons',

??????????????????test:?resolve('src/components'),?//?can?customize?your?rules

??????????????????minChunks:?3,?//??minimum?common?number

??????????????????priority:?5,

??????????????????reuseExistingChunk:?true

????????????????}

??????????????}

????????????})

??????????config.optimization.runtimeChunk('single')

????????}

??????)

??}

}


在src/main.js 最后插入http,結(jié)果如下:

import?http?from?'./utils/http'

Vue.use(http)

打開views/dashboard/index.vue文件边翼,結(jié)果如下:

<template>

??<div?class="dashboard-container">

????歡迎

??</div>

</template>

<script>

??import?{?mapGetters?}?from?'vuex'

??export?default?{

????name:?'Dashboard',

????computed:?{

??????...mapGetters([

????????'name'

??????])

????},

????mounted(){

??????this.$http.get('/api/users/add').then(res?=>?{

????????console.log('this.panels',?res)

??????})

????}

??}

</script>

<style?lang="scss"?scoped>

??.dashboard?{

????&-container?{

??????margin:?30px;

????}

????&-text?{

??????font-size:?30px;

??????line-height:?46px;

????}

??}

</style>

全局安裝koa-generator,執(zhí)行下面命令

npm install -g koa-generator

構(gòu)建koa2項(xiàng)目代碼如下

koa2 projectName


構(gòu)建成功

初始化后臺(tái)項(xiàng)目插件鱼响,命令屬下:

cd projectName

npm install

項(xiàng)目試運(yùn)行

npm run dev

在瀏覽器打開地址:

http://localhost:3000/

出現(xiàn)koa2的歡迎界面則代表成功


啟動(dòng)成功

安裝mongoose

npm install mongoose --save

打開projectName項(xiàng)目,創(chuàng)建db文件夾和config.js

更換自己的密碼

module.exports={// dbs: 'mongodb://139.159.253.110:27017/test1'dbs:'mongodb+srv://xxwozixin:<需要修改>@cluster0-7d5kk.mongodb.net/test?retryWrites=true&w=majority'}

打開db/models/user.js组底,編寫以下內(nèi)容:

const?mongoose?=?require('mongoose')

const?feld={

????name:?String,

????age:?Number,

????//人物標(biāo)簽

????labels:Number

}

//自動(dòng)添加更新時(shí)間創(chuàng)建時(shí)間:

let?personSchema?=?new?mongoose.Schema(feld,?{timestamps:?{createdAt:?'created',?updatedAt:?'updated'}})

module.exports=?mongoose.model('User',personSchema)

修改根目錄app.js

constKoa=require('koa')constapp=newKoa()constviews=require('koa-views')constjson=require('koa-json')constonerror=require('koa-onerror')constbodyparser=require('koa-bodyparser')constlogger=require('koa-logger')constindex=require('./routes/index')constusers=require('./routes/users')constmongoose=require('mongoose')constdbconfig=require('./db/config')mongoose.connect(dbconfig.dbs,{useNewUrlParser:true,useUnifiedTopology:true})constdb=mongoose.connectiondb.on('error',console.error.bind(console,'connection error:'));db.once('open',function(){console.log('mongoose 連接成功')});// error handleronerror(app)// middlewaresapp.use(bodyparser({enableTypes:['json','form','text']}))app.use(json())app.use(logger())app.use(require('koa-static')(__dirname+'/public'))app.use(views(__dirname+'/views',{extension:'pug'}))// loggerapp.use(async(ctx,next)=>{conststart=newDate()awaitnext()constms=newDate()-startconsole.log(`${ctx.method} ${ctx.url} - ${ms}ms`)})// routesapp.use(index.routes(),index.allowedMethods())app.use(users.routes(),users.allowedMethods())// error-handlingapp.on('error',(err,ctx)=>{console.error('server error',err,ctx)});module.exports=app// error handleronerror(app)// middlewaresapp.use(bodyparser({enableTypes:['json','form','text']}))app.use(json())app.use(logger())app.use(require('koa-static')(__dirname+'/public'))app.use(views(__dirname+'/views',{extension:'pug'}))// loggerapp.use(async(ctx,next)=>{conststart=newDate()awaitnext()constms=newDate()-startconsole.log(`${ctx.method} ${ctx.url} - ${ms}ms`)})// routesapp.use(index.routes(),index.allowedMethods())app.use(users.routes(),users.allowedMethods())// error-handlingapp.on('error',(err,ctx)=>{console.error('server error',err,ctx)});module.exports=app

打開routes/users.js丈积,結(jié)果如下:

const?router?=?require('koa-router')()

const?User?=?require('../db/models/user')

router.prefix('/users')

router.get('/add',?function?(ctx,?next)?{

??ctx.body?=?'this?is?a?users?response!'

})

router.get('/',?function?(ctx,?next)?{

??ctx.body?=?'this?is?a?users?response'

})

router.get('/bar',?function?(ctx,?next)?{

??ctx.body?=?'this?is?a?users/bar?response'

})

module.exports?=?router

啟動(dòng)的服務(wù)在運(yùn)行

npm run dev


?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市债鸡,隨后出現(xiàn)的幾起案子江滨,更是在濱河造成了極大的恐慌,老刑警劉巖厌均,帶你破解...
    沈念sama閱讀 207,113評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件唬滑,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)晶密,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門擒悬,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人稻艰,你說(shuō)我怎么就攤上這事懂牧。” “怎么了尊勿?”我有些...
    開封第一講書人閱讀 153,340評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵归苍,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我运怖,道長(zhǎng),這世上最難降的妖魔是什么夏伊? 我笑而不...
    開封第一講書人閱讀 55,449評(píng)論 1 279
  • 正文 為了忘掉前任摇展,我火速辦了婚禮,結(jié)果婚禮上溺忧,老公的妹妹穿的比我還像新娘咏连。我一直安慰自己,他們只是感情好鲁森,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評(píng)論 5 374
  • 文/花漫 我一把揭開白布祟滴。 她就那樣靜靜地躺著,像睡著了一般歌溉。 火紅的嫁衣襯著肌膚如雪垄懂。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,166評(píng)論 1 284
  • 那天痛垛,我揣著相機(jī)與錄音草慧,去河邊找鬼。 笑死匙头,一個(gè)胖子當(dāng)著我的面吹牛漫谷,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播蹂析,決...
    沈念sama閱讀 38,442評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼舔示,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了电抚?” 一聲冷哼從身側(cè)響起惕稻,我...
    開封第一講書人閱讀 37,105評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎蝙叛,沒(méi)想到半個(gè)月后缩宜,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,601評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評(píng)論 2 325
  • 正文 我和宋清朗相戀三年锻煌,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了妓布。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,161評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡宋梧,死狀恐怖匣沼,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情捂龄,我是刑警寧澤释涛,帶...
    沈念sama閱讀 33,792評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站倦沧,受9級(jí)特大地震影響唇撬,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜展融,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評(píng)論 3 307
  • 文/蒙蒙 一窖认、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧告希,春花似錦扑浸、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至指么,卻和暖如春酝惧,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背伯诬。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工系奉, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人姑廉。 一個(gè)月前我還...
    沈念sama閱讀 45,618評(píng)論 2 355
  • 正文 我出身青樓缺亮,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親桥言。 傳聞我的和親對(duì)象是個(gè)殘疾皇子萌踱,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評(píng)論 2 344

推薦閱讀更多精彩內(nèi)容