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

班級(jí)管理篇

(可將學(xué)校、學(xué)院與班級(jí)關(guān)聯(lián)起來)

一、從后端(projectName)添加班級(jí)模塊

1、在models目錄下添加classs.js:

projectName/db/models/classs.js:

const mongoose=require('mongoose')

const Schema=mongoose.Schema

const feld={

????name:String,

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

????major:String,

????renshu:Number,

????school:{type:Schema.Types.ObjectId,ref:'School'},

????academy:{type:Schema.Types.ObjectId,ref:'Academy'}

}

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

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

module.exports=mongoose.model('Classs',personSchema)

2、在routes目錄下添加classs.js:

projectName/routes/classs.js:

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

let Model=require("../db/models/classs");

router.prefix('/classs')

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

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

})

router.post('/add',asyncfunction(ctx,next){

????console.log(ctx.request.body)

????let model=newModel(ctx.request.body);

????model=awaitmodel.save();

????console.log('user',model)

????ctx.body=model

})

router.post('/find',async function(ctx,next){

let models=awaitModel.find({}).populate('academy').populate('school')ctx.body=models})

router.post('/get',asyncfunction(ctx,next){// let users = await User.// find({})console.log(ctx.request.body)letmodel=awaitModel.find(ctx.request.body)console.log(model)ctx.body=model})

router.post('/update',asyncfunction(ctx,next){console.log(ctx.request.body)letpbj=awaitModel.update({_id:ctx.request.body._id},ctx.request.body);ctx.body=pbj})

router.post('/delete',asyncfunction(ctx,next){console.log(ctx.request.body)awaitModel.remove({_id:ctx.request.body._id});ctx.body='shibai '})

module.exports=router

3、在app.js中加上classs模塊的路由:

添加部分為:

classs模塊的路由


projectName/app.js:

const Koa=require('koa')

const app=newKoa()constviews=require('koa-views')

const json=require('koa-json')

const onerror=require('koa-onerror')

const bodyparser=require('koa-bodyparser')

const logger=require('koa-logger')

const mongoose=require('mongoose')

const dbconfig=require('./db/config')

mongoose.connect(dbconfig.dbs,{useNewUrlParser:true,useUnifiedTopology:true})

constdb=mongoose.connection

db.on('error',console.error.bind(console,'connection error:'));

db.once('open',function(){console.log('mongoose 連接成功')});

// error handler

onerror(app)

// middlewares

app.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'}))

// logger

app.use(async(ctx,next)=>{

????conststart=newDate()awaitnext()constms=newDate()-startconsole.log(`${ctx.method} ${ctx.url} - ${ms}ms`)})

// routes

const index=require('./routes/index')

app.use(index.routes(),index.allowedMethods())

const users=require('./routes/users')

app.use(users.routes(),users.allowedMethods())

const school=require('./routes/school')

app.use(school.routes(),school.allowedMethods())

const academy=require('./routes/academy')

app.use(academy.routes(),academy.allowedMethods())

const classs=require('./routes/classs')

app.use(classs.routes(),classs.allowedMethods())

// error-handling

app.on('error',(err,ctx)=>{console.error('server error',err,ctx)});

module.exports=app

二、從前端(vue-admin-template)添加班級(jí)模塊

1、在src/views目錄下添加classs目錄(模塊),如圖所示:

前端布局的classs模塊


①在classs目錄下添加editor.vue:

vue-admin-template/src/views/classs/editor.vue:

<template>

????<divclass="dashboard-container">

????????<el-formref="form":model="form"label-width="80px">

????????????<el-form-itemlabel="所屬學(xué)校">

????????????????<el-selectv-model="form.school"placeholder="請(qǐng)選擇"@change="schoolChange">

????????????????????<el-option

????????????????????????????v-for="item in schools":key="item._id":label="item.name":value="item._id">

????????????????????</el-option>

????????????????</el-select>

????????????</el-form-item>

????????????<!--? ? ? 編輯框:學(xué)院選擇列表-->

????????????<el-form-itemlabel="所屬學(xué)院">

????????????????<el-selectv-model="form.academy"placeholder="請(qǐng)選擇">

????????????????????<el-option

????????????????????????v-for="item in academys":key="item._id":label="item.name":value="item._id">

????????????????????</el-option>

????????????????</el-select>

????????????????</el-form-item>

????????????????<el-form-itemlabel="班級(jí)名稱">

????????????????????<el-inputv-model="form.name">

????????????????</el-input>

????????????</el-form-item>

????????????<el-form-itemlabel="專業(yè)">

????????????????<el-inputv-model="form.level">

? ? ? ? ? ? ?</el-input>

????????</el-form-item>

????????<el-form-itemlabel="人數(shù)">

????????????<el-inputv-model="form.renshu">

????????</el-input>

? ? ? ?</el-form-item>

????????<el-form-item>

????????????<el-buttontype="primary"@click="onSubmit">立即創(chuàng)建</el-button>

? ? ? ? ? ? ? <el-button>取消</el-button>

????????????</el-form-item>

????????</el-form>

????</div>

</template>

<script>

????import { mapGetters } from 'vuex'? export default {? ? name: 'classs',? ? computed: {? ? ? ...mapGetters([? ? ? ? 'name'? ? ? ])? ? },? ? data(){? ? ? return{? ? ? ? schools:[],? ? ? ? academys:[],? ? ? ? //列表內(nèi)容? ? ? ? options: [? ? ? ? ],? ? ? ? apiModel:'classs',? ? ? ? form:{}? ? ? }? ? },? ? methods:{? ? ? onSubmit(){? ? ? ? if(this.form._id){? ? ? ? ? this.$http.post(`/api/${this.apiModel}/update`,this.form).then(res => {? ? ? ? ? ? console.log('bar:', res)? ? ? ? ? ? this.$router.push({path:this.apiModel})? ? ? ? ? ? this.form={}? ? ? ? ? })? ? ? ? }else? ? ? ? {? ? ? ? ? this.$http.post('/api/'+this.apiModel+'/add',this.form).then(res => {? ? ? ? ? ? console.log('bar:', res)? ? ? ? ? ? this.$router.push({path:this.apiModel})? ? ? ? ? ? this.form={}? ? ? ? ? })? ? ? ? }? ? ? },? ? ? schoolChange(val1){? ? ? ? //顯示學(xué)院選擇欄目? ? ? ? this.$http.post('/api/academy/get',{school:val1}).then(res => {? ? ? ? ? if(res&&res.length>0){? ? ? ? ? ? this.academys = res? ? ? ? ? ? console.log('res:', res)? ? ? ? ? }? ? ? ? })? ? ? }? ? },? ? mounted() {? ? ? if(this.$route.query._id){? ? ? ? this.$http.post('/api/'+this.apiModel+'/get',{_id:this.$route.query._id}).then(res => {? ? ? ? ? if(res&&res.length>0){? ? ? ? ? ? this.form = res[0]? ? ? ? ? ? this.schoolChange(this.form.school)? ? ? ? ? }? ? ? ? })? ? ? }? ? ? //顯示學(xué)校選擇欄目? ? ? this.$http.post('/api/school/find').then(res => {? ? ? ? if(res&&res.length>0){? ? ? ? ? this.schools = res? ? ? ? ? console.log('res:', res)? ? ? ? }? ? ? })? ? }? }

</script>

<stylelang="scss"scoped>

????.dashboard {? ? &-container {? ? ? margin: 30px;? ? }? ? &-text {? ? ? font-size: 30px;? ? ? line-height: 46px;? ? }? }

</style>

? ??????

效果圖:

editor.vue的效果圖

②在classs目錄下添加index.vue:

vue-admin-template/src/views/classs/index.vue:

<template>

????<divclass="dashboard-container">

????????<el-table:data="users"style="width: 100%":row-class-name="tableRowClassName">

????????????<el-table-columnprop="name"label="班級(jí)名稱"width="180">

????????????</el-table-column>

????????????<el-table-columnprop="level"label="專業(yè)"width="180"></el-table-column>

????????????<el-table-columnprop="renshu"label="人數(shù)"></el-table-column>

????????????<!--? ? ? 列表添加項(xiàng)目

? ? ? -->

????????????<el-table-columnprop="school"label="學(xué)校名稱"width="180">

????????????????<templateslot-scope="scope">

????????????????????<spanclass=""v-if="scope.row.school">

????????????????????????<el-tag:type="scope.row.school.name === '深圳信息職業(yè)技術(shù)學(xué)院' ? 'primary' : 'success'"disable-transitions>{{scope.row.school.name}}</el-tag></span></template></el-table-column>

????????????????<el-table-columnprop="academy"label="學(xué)院名稱"width="180">

????????????????????<templateslot-scope="scope">

????????????????????????<spanclass=""v-if="scope.row.academy">

????????????????????????????<el-tag:type="scope.row.academy.name === '軟件學(xué)院' ? 'primary' : 'success'"disable-transitions>{{scope.row.academy.name}}</el-tag></span></template></el-table-column>

? ? ? ? ? ? ? <el-table-columnlabel="操作">

????????????????????<templateslot-scope="scope"><el-buttonsize="mini"@click="handleEdit(scope.$index, scope.row)">編輯</el-button>

????????????????????<el-buttonsize="mini"type="danger"@click="handleDelete(scope.$index, scope.row)">刪除</el-button>

????????????????????????</template></el-table-column></el-table></div></template>

<script>

????import { mapGetters } from 'vuex'? export default {? ? name: 'classs',? ? computed: {? ? ? ...mapGetters([? ? ? ? 'name'? ? ? ])? ? },? ? data() {? ? ? return {? ? ? ? apiModel:'classs',? ? ? ? users: {}? ? ? }? ? },? ? methods: {? ? ? onSubmit() {? ? ? ? console.log(123434)? ? ? },? ? ? handleEdit(index, item) {? ? ? ? this.$router.push({ path: '/'+this.apiModel+'/editor', query: {_id:item._id} })? ? ? },? ? ? handleDelete(index, item) {? ? ? ? this.$http.post('/api/'+this.apiModel+'/delete', item).then(res => {? ? ? ? ? console.log('res:', res)? ? ? ? ? this.findUser()? ? ? ? })? ? ? },? ? ? findUser(){? ? ? ? this.$http.post('/api/'+this.apiModel+'/find', this.user).then(res => {? ? ? ? ? console.log('res:', res)? ? ? ? ? this.users = res? ? ? ? })? ? ? }? ? },? ? mounted() {? ? ? this.findUser()? ? }? }

</script>

<stylelang="scss"scoped>

????.dashboard {? ? &-container {? ? ? margin: 30px;? ? }? ? &-text {? ? ? font-size: 30px;? ? ? line-height: 46px;? ? }? }

</style>

效果圖:

index.vue的效果圖


2、在router下的index.js中添加classs模塊的路由:

添加部分:

classs模塊的路由


vue-admin-template/src/router/index.js:

importVuefrom'vue'importRouterfrom'vue-router'Vue.use(Router)/* Layout */importLayoutfrom'@/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'? ? ? ? ? ? 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

*/exportconstconstantRoutes=[{path:'/login',component:()=>import('@/views/login/index'),hidden:true},{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:'/404',component:()=>import('@/views/404'),hidden:true},{path:'/',component:Layout,redirect:'/dashboard',children:[{path:'dashboard',name:'Dashboard',component:()=>import('@/views/dashboard/index'),meta:{title:'Dashboard',icon:'dashboard'}}]},// 404 page must be placed at the end !!!{path:'*',redirect:'/404',hidden:true}]constcreateRouter=()=>newRouter({// mode: 'history', // require service supportscrollBehavior:()=>({y:0}),routes:constantRoutes})constrouter=createRouter()// Detail see: https://github.com/vuejs/vue-router/issues/1234#issuecomment-357941465exportfunctionresetRouter(){constnewRouter=createRouter()router.matcher=newRouter.matcher// reset router}exportdefaultrouter

這樣班級(jí)管理模塊就構(gòu)建好了,最終的效果圖:

班級(jí)管理模塊
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,936評(píng)論 6 535
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,744評(píng)論 3 421
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,879評(píng)論 0 381
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,181評(píng)論 1 315
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,935評(píng)論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,325評(píng)論 1 324
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,384評(píng)論 3 443
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,534評(píng)論 0 289
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,084評(píng)論 1 335
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,892評(píng)論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,067評(píng)論 1 371
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,623評(píng)論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,322評(píng)論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,735評(píng)論 0 27
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,990評(píng)論 1 289
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,800評(píng)論 3 395
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 48,084評(píng)論 2 375

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