賴銘浩校園管理系統(tǒng)實訓(xùn)1
1.安裝 nodejs
2.安裝 git
3.下載 vue-element-admin
建議
本項目的定位是后臺集成方案浑此,不太適合當(dāng)基礎(chǔ)模板來進行二次開發(fā)。因為本項目集成了很多你可能用不到的功能队丝,會造成不少的代碼冗余账千。如果你的項目不關(guān)注這方面的問題遣妥,也可以直接基于它進行二次開發(fā)慌核。
- 集成方案: vue-element-admin
- 基礎(chǔ)模板: vue-admin-template
- 桌面終端: electron-vue-admin
- Typescript 版: vue-typescript-admin-template (鳴謝: @Armour)
- Others: awesome-project
# enter the project directory
cd vue-admin-template
# install dependency
npm install
# develop
npm run dev
刪除多余界面 router/index
刪除后的界面如下
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' 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: 'Dashboard', icon: 'dashboard' }
}]
},
// 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語法插件
安裝老師Axios 插件
http.js
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){//用戶登錄時每次請求將token放入請求頭中
// config.headers["token"] = user.state.token;
// }
if (config['Content-Type'] === 'application/x-www-form-urlencoded;') {//默認發(fā)application/json請求,如果application/x-www-form-urlencoded;需要使用transformRequest對參數(shù)進行處理
/*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代理
'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']: ''
}
}
},
before: 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) {
// it can improve the speed of the first screen, it is recommended to turn on preload
config.plugin('preload').tap(() => [
{
rel: 'preload',
// to ignore runtime.js
// https://github.com/vuejs/vue-cli/blob/dev/packages/@vue/cli-service/lib/config/app.js#L171
fileBlacklist: [/\.map$/, /hot-update\.js$/, /runtime\..*\.js$/],
include: 'initial'
}
])
// when there are many pages, it will cause too many meaningless requests
config.plugins.delete('prefetch')
// 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()
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
}
}
})
// https:// webpack.js.org/configuration/optimization/#optimizationruntimechunk
config.optimization.runtimeChunk('single')
}
)
}
}
main.js中加入http
import http from './utils/http'
Vue.use(http)
main.js
import Vue from 'vue'
import 'normalize.css/normalize.css' // A modern alternative to CSS resets
import ElementUI from 'element-ui'
import 'element-ui/lib/theme-chalk/index.css'
import locale from 'element-ui/lib/locale/lang/en' // lang i18n
import '@/styles/index.scss' // global css
import App from './App'
import store from './store'
import router from './router'
import '@/icons' // icon
import '@/permission' // permission control
import http from './utils/http'
Vue.use(http)
/**
* If you don't want to use mock-server
* you want to use MockJs for mock api
* you can execute: mockXHR()
*
* Currently MockJs will be used in the production environment,
* please remove it before going online ! ! !
*/
if (process.env.NODE_ENV === 'production') {
const { mockXHR } = require('../mock')
mockXHR()
}
// set ElementUI lang to EN
Vue.use(ElementUI, { locale })
// 如果想要中文版 element-ui习寸,按如下方式聲明
// Vue.use(ElementUI)
Vue.config.productionTip = false
new Vue({
el: '#app',
router,
store,
render: h => h(App)
})
調(diào)用接口:
index.vue
<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í)行下面命令構(gòu)建koa2項目代碼如下
初始化后臺項目插件,命令屬下項
目試運行
在瀏覽器打開地址:
http://localhost:3000/
出現(xiàn)koa2的歡迎界面就代表成功了
注冊mongoose
創(chuàng)建組織
創(chuàng)建項目
創(chuàng)建集群
創(chuàng)建共享集群
選擇新加坡
添加數(shù)據(jù)庫用戶
添加網(wǎng)絡(luò)訪問
加載樣本
在集群中的創(chuàng)建test數(shù)據(jù)庫
user.js ↓
const mongoose = require('mongoose')
const feld={
name: String,
age: Number,
//人物標(biāo)簽
labels:Number
}
//自動添加更新時間創(chuàng)建時間:
let personSchema = new mongoose.Schema(feld, {timestamps: {createdAt: 'created', updatedAt: 'updated'}})
module.exports= mongoose.model('User',personSchema)
修改app.js
const Koa = require('koa')
const app = new Koa()
const views = require('koa-views')
const json = require('koa-json')
const onerror = require('koa-onerror')
const bodyparser = require('koa-bodyparser')
const logger = require('koa-logger')
const index = require('./routes/index')
const users = require('./routes/users')
const mongoose = require('mongoose')
const dbconfig = require('./db/config')
mongoose.connect(dbconfig.dbs, {useNewUrlParser: true,useUnifiedTopology: true})
const db = 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) => {
const start = new Date()
await next()
const ms = new Date() - start
console.log(`${ctx.method} ${ctx.url} - ${ms}ms`)
})
// routes
app.use(index.routes(), index.allowedMethods())
app.use(users.routes(), users.allowedMethods())
// error-handling
app.on('error', (err, ctx) => {
console.error('server error', err, ctx)
});
module.exports = app
// 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) => {
const start = new Date()
await next()
const ms = new Date() - start
console.log(`${ctx.method} ${ctx.url} - ${ms}ms`)
})
// routes
app.use(index.routes(), index.allowedMethods())
app.use(users.routes(), users.allowedMethods())
// error-handling
app.on('error', (err, ctx) => {
console.error('server error', err, ctx)
});
module.exports = app
配置router下的users.js
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/bar 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
重啟項目
關(guān)掉前面我們啟動的服務(wù)在運行
npm run dev
如下結(jié)果代表成功連接數(shù)據(jù)庫
賴銘浩校園管理系統(tǒng)實訓(xùn)2
添加學(xué)校信息
一傻工、后臺三步驟:
1霞溪、打開projectName文件,在models目錄下創(chuàng)建school.js文件中捆,接著文件操作:
school.js
const mongoose = require('mongoose')
const feld={
name: String,
//人物標(biāo)簽
where:String,
leixing: String
}
//自動添加更新時間創(chuàng)建時間:
let personSchema = new mongoose.Schema(feld, {timestamps: {createdAt: 'created', updatedAt: 'updated'}})
module.exports= mongoose.model('School',personSchema)
2鸯匹、找到projectName下的routes目錄的school.js更改:
const router = require('koa-router')()
//建立模塊,require(“../db/models/文件名”)
let Model = require("../db/models/school");
router.prefix('/school')
router.get('/', function (ctx, next) {
ctx.body = 'this is a users response!'
})
//數(shù)據(jù)庫增刪改查
router.post('/add', async function (ctx, next) {
console.log(ctx.request.body)
let model = new Model(ctx.request.body);
model = await model.save();
console.log('user',model)
ctx.body = model
})
router.post('/find', async function (ctx, next) {
let models = await Model.
find({})
ctx.body = models
})
router.post('/get', async function (ctx, next) {
// let users = await User.
// find({})
console.log(ctx.request.body)
let model = await Model.find(ctx.request.body)
console.log(model)
ctx.body = model
})
router.post('/update', async function (ctx, next) {
console.log(ctx.request.body)
let pbj = await Model.update({ _id: ctx.request.body._id }, ctx.request.body);
ctx.body = pbj
})
router.post('/delete', async function (ctx, next) {
console.log(ctx.request.body)
await Model.remove({ _id: ctx.request.body._id });
ctx.body = 'shibai '
})
module.exports = router
3.在app.js中掛載路由:
const school = require('./routes/school')
app.use(school.routes(), school.allowedMethods())
二、前臺三步驟:
打開vue-admin-template-master文件,在src/views目錄下創(chuàng)建一個school模塊:
添加editor.vue 和index.vue
1.editor.vue為編輯文件庙曙,用于創(chuàng)建學(xué)校記錄;
editor.vue
<template>
<div class="dashboard-container">
<el-form ref="form" :model="form" label-width="80px">
<el-form-item label="學(xué)校名稱">
<el-input v-model="form.name"></el-input>
</el-form-item>
<el-form-item label="位置">
<el-input v-model="form.where"></el-input>
</el-form-item>
<el-form-item label="類型">
<el-input v-model="form.leixing"></el-input>
</el-form-item>
<el-form-item>
<el-button type="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: 'school',
computed: {
...mapGetters([
'name'
])
},
data(){
return{
apiModel:'school',
form:{}
}
},
methods:{
onSubmit(){
console.log('222:', 222)
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={}
})
}
}
},
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]
}
})
}
}
}
</script>
<style lang="scss" scoped>
.dashboard {
&-container {
margin: 30px;
}
&-text {
font-size: 30px;
line-height: 46px;
}
}
</style>
2.index.vue為目錄文件染厅,用于顯示結(jié)果;
index.vue
<template>
<div class="dashboard-container">
<el-table
:data="users"
style="width: 100%"
:row-class-name="tableRowClassName">
<!-- <el-table-column-->
<!-- prop="_id"-->
<!-- label="學(xué)校_id"-->
<!-- width="180">-->
<!-- </el-table-column>-->
<el-table-column
prop="name"
label="學(xué)校名稱"
width="180">
</el-table-column>
<el-table-column
prop="where"
label="位置"
width="180">
</el-table-column>
<el-table-column
prop="leixing"
label="類型">
</el-table-column>
<el-table-column label="操作">
<template slot-scope="scope">
<el-button
size="mini"
@click="handleEdit(scope.$index, scope.row)">編輯
</el-button>
<el-button
size="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: 'school',
computed: {
...mapGetters([
'name'
])
},
data() {
return {
apiModel:'school',
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>
<style lang="scss" scoped>
.dashboard {
&-container {
margin: 30px;
}
&-text {
font-size: 30px;
line-height: 46px;
}
}
</style>
3.在index.js中添加路由:
router目錄下的index.js
{
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' }
}]
},
賴銘浩校園管理系統(tǒng)實訓(xùn)3
目標(biāo):創(chuàng)建學(xué)院管理模塊(學(xué)院和學(xué)校關(guān)聯(lián)起來)
一脓杉、后臺三步驟:
1糟秘、打開projectName文件简逮,在models目錄下創(chuàng)建academy.js文件球散,接著文件操作:
在models目錄下創(chuàng)建academy.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' }
}
//自動添加更新時間創(chuàng)建時間:
let schema = new Schema(feld, {timestamps: {createdAt: 'created', updatedAt: 'updated'}})
module.exports= mongoose.model('Academy',schema)
2、找到projectName下的routes目錄散庶,創(chuàng)建academy.js文件:
在routes目錄下創(chuàng)建academy.js文件
const router = require('koa-router')()
let Model = require("../db/models/academy");
router.prefix('/academy')
router.get('/', function (ctx, next) {
ctx.body = 'this is a users response!'
})
router.post('/add', async function (ctx, next) {
console.log(ctx.request.body)
let model = new Model(ctx.request.body);
model = await model.save();
console.log('user',model)
ctx.body = model
})
router.post('/find', async function (ctx, next) {
let models = await Model.
find({}).populate('school')
ctx.body = models
})
router.post('/get', async function (ctx, next) {
// let users = await User.
// find({})
console.log(ctx.request.body)
let model = await Model.find(ctx.request.body)
console.log(model)
ctx.body = model
})
router.post('/update', async function (ctx, next) {
console.log(ctx.request.body)
let pbj = await Model.update({ _id: ctx.request.body._id }, ctx.request.body);
ctx.body = pbj
})
router.post('/delete', async function (ctx, next) {
console.log(ctx.request.body)
await Model.remove({ _id: ctx.request.body._id });
ctx.body = 'shibai '
})
module.exports = router
3.在app.js中掛載路由:
在app.js中添加
const academy = require('./routes/academy')
app.use(academy.routes(), academy.allowedMethods())
二蕉堰、前臺三步驟:
打開vue-admin-template-master文件,在src/views目錄下創(chuàng)建一個academy模塊:
并在academy目錄下創(chuàng)建editor.vue和index.vue文件悲龟。
1.editor.vue為編輯文件屋讶,用于創(chuàng)建學(xué)院記錄;
editor.vue
<template>
<div class="dashboard-container">
<el-form ref="form" :model="form" label-width="80px">
<el-form-item label="學(xué)院名稱">
<el-input v-model="form.name"></el-input>
</el-form-item>
<el-form-item label="專業(yè)">
<el-input v-model="form.major"></el-input>
</el-form-item>
<el-form-item label="人數(shù)">
<el-input v-model="form.renshu"></el-input>
</el-form-item>
<el-form-item label="所屬學(xué)校">
<el-select v-model="form.school" placeholder="請選擇">
<el-option
v-for="item in options"
:key="item._id"
:label="item.name"
:value="item._id">
</el-option>
</el-select>
</el-form-item>
<el-form-item>
<el-button type="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: 'academy',
computed: {
...mapGetters([
'name'
])
},
data(){
return{
options: [
],
apiModel:'academy',
form:{}
}
},
methods:{
onSubmit(){
console.log('222:', 222)
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={}
})
}
}
},
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.$http.post('/api/school/find').then(res => {
if(res&&res.length>0){
this.options = res
console.log('res:', res)
}
})
}
}
</script>
<style lang="scss" scoped>
.dashboard {
&-container {
margin: 30px;
}
&-text {
font-size: 30px;
line-height: 46px;
}
}
</style>
2.index.vue為目錄文件须教,用于顯示結(jié)果皿渗;
index.vue
<template>
<div class="dashboard-container">
<el-table
:data="users"
style="width: 100%"
:row-class-name="tableRowClassName">
<el-table-column
prop="_id"
label="學(xué)院_id"
width="180">
</el-table-column>
<el-table-column
prop="name"
label="學(xué)院名稱"
width="180">
</el-table-column>
<el-table-column
prop="major"
label="專業(yè)"
width="180">
</el-table-column>
<el-table-column
prop="renshu"
label="人數(shù)">
</el-table-column>
<el-table-column
prop="school"
label="學(xué)校名稱"
width="180">
<template slot-scope="scope" >
<span class="" v-if="scope.row.school">
<el-tag
:type="scope.row.school.name === '深信' ? 'primary' : 'success'"
disable-transitions>{{scope.row.school.name}}</el-tag>
</span>
</template>
</el-table-column>
<el-table-column label="操作">
<template slot-scope="scope">
<el-button
size="mini"
@click="handleEdit(scope.$index, scope.row)">編輯
</el-button>
<el-button
size="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: 'academy',
computed: {
...mapGetters([
'name'
])
},
data() {
return {
apiModel:'academy',
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>
<style lang="scss" scoped>
.dashboard {
&-container {
margin: 30px;
}
&-text {
font-size: 30px;
line-height: 46px;
}
}
</style>
3.在index.js中添加路由:
index.js
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' 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: 'Dashboard', icon: 'dashboard' }
}]
},{
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: '/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' }
}]
},
// 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
賴銘浩校園管理系統(tǒng)實訓(xùn)4
目標(biāo):創(chuàng)建班級管理模塊(班級和學(xué)院斩芭、學(xué)校關(guān)聯(lián)起來)
一、后臺三步驟:
1乐疆、打開projectName文件划乖,在models目錄下創(chuàng)建classs.js文件,接著文件操作:
models目錄下創(chuàng)建classs.js文件
const mongoose = require('mongoose')
const Schema= mongoose.Schema
const feld={
name: String,
//人物標(biāo)簽
level:String,
renshu: Number,
school : { type: Schema.Types.ObjectId, ref: 'School' },
academy : { type: Schema.Types.ObjectId, ref: 'Academy' }
}
//自動添加更新時間創(chuàng)建時間:
let personSchema = new mongoose.Schema(feld, {timestamps: {createdAt: 'created', updatedAt: 'updated'}})
module.exports= mongoose.model('Classs',personSchema)
2挤土、找到projectName下的routes目錄琴庵,創(chuàng)建classs.js文件:
router目錄下創(chuàng)建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', async function (ctx, next) {
console.log(ctx.request.body)
let model = new Model(ctx.request.body);
model = await model.save();
console.log('user',model)
ctx.body = model
})
router.post('/find', async function (ctx, next) {
let models = await Model.
find({}).populate('academy').populate('school')
ctx.body = models
})
router.post('/get', async function (ctx, next) {
// let users = await User.
// find({})
console.log(ctx.request.body)
let model = await Model.find(ctx.request.body)
console.log(model)
ctx.body = model
})
router.post('/update', async function (ctx, next) {
console.log(ctx.request.body)
let pbj = await Model.update({ _id: ctx.request.body._id }, ctx.request.body);
ctx.body = pbj
})
router.post('/delete', async function (ctx, next) {
console.log(ctx.request.body)
await Model.remove({ _id: ctx.request.body._id });
ctx.body = 'shibai '
})
module.exports = router
二、前臺三步驟:
打開vue-admin-template-master文件仰美,在src/views目錄下創(chuàng)建一個classs模塊迷殿,并在classs目錄下創(chuàng)建vue文件。
1.editor.vue為編輯文件咖杂,用于創(chuàng)建班級記錄庆寺;
editor.vue
<template>
<div class="dashboard-container">
<el-form ref="form" :model="form" label-width="80px">
<el-form-item label="所屬學(xué)校">
<el-select v-model="form.school" placeholder="請選擇" @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-item label="所屬學(xué)院">
<el-select v-model="form.academy" placeholder="請選擇">
<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-item label="班級名稱">
<el-input v-model="form.name"></el-input>
</el-form-item>
<el-form-item label="專業(yè)">
<el-input v-model="form.level"></el-input>
</el-form-item>
<el-form-item label="人數(shù)">
<el-input v-model="form.renshu"></el-input>
</el-form-item>
<el-form-item>
<el-button type="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>
<style lang="scss" scoped>
.dashboard {
&-container {
margin: 30px;
}
&-text {
font-size: 30px;
line-height: 46px;
}
}
</style>
2.index.vue為目錄文件,用于顯示結(jié)果诉字;
index.vue
<template>
<div class="dashboard-container">
<el-table
:data="users"
style="width: 100%"
:row-class-name="tableRowClassName">
<el-table-column
prop="name"
label="班級名稱"
width="180">
</el-table-column>
<el-table-column
prop="level"
label="專業(yè)"
width="180">
</el-table-column>
<el-table-column
prop="renshu"
label="人數(shù)">
</el-table-column>
<!-- 列表添加項目
-->
<el-table-column
prop="school"
label="學(xué)校名稱"
width="180">
<template slot-scope="scope" >
<span class="" 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-column
prop="academy"
label="學(xué)院名稱"
width="180">
<template slot-scope="scope" >
<span class="" 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-column label="操作">
<template slot-scope="scope">
<el-button
size="mini"
@click="handleEdit(scope.$index, scope.row)">編輯
</el-button>
<el-button
size="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>
<style lang="scss" scoped>
.dashboard {
&-container {
margin: 30px;
}
&-text {
font-size: 30px;
line-height: 46px;
}
}
</style>
3.在index.js中添加路由:
{
path: '/classs',
component: Layout,
meta: { title: '班級管理', icon: 'example' },
redirect: '/classs',
children: [{
path: 'classs',
name: 'classs',
component: () => import('@/views/classs'),
meta: { title: '班級管理', icon: 'classs' }
},
{
path: 'editor',
name: 'editor',
component: () => import('@/views/classs/editor'),
meta: { title: '添加班級', icon: 'classs' }
}]
},
賴銘浩校園管理系統(tǒng)實訓(xùn)5
目標(biāo):創(chuàng)建班級管理模塊(學(xué)生和班級止邮、學(xué)院、學(xué)校關(guān)聯(lián)起來)
一奏窑、后臺三步驟:
1导披、打開projectName文件,在models目錄下創(chuàng)建student.js文件埃唯,接著文件操作:
const mongoose = require('mongoose')
const Schema = mongoose.Schema
const feld={
name: String,
age: Number,
student_number:Number,
gender:String,
school : { type: Schema.Types.ObjectId, ref: 'School' },
academy : { type: Schema.Types.ObjectId, ref: 'Academy' },
classs : { type: Schema.Types.ObjectId, ref: 'Classs' }
}
//自動添加更新時間創(chuàng)建時間:
let personSchema = new mongoose.Schema(feld, {timestamps: {createdAt: 'created', updatedAt: 'updated'}})
module.exports= mongoose.model('Student',personSchema)
2撩匕、找到projectName下的routes目錄,創(chuàng)建student.js文件:
const router = require('koa-router')()
let Model = require("../db/models/student");
router.prefix('/student')
router.get('/', function (ctx, next) {
ctx.body = 'this is a users response!'
})
router.post('/add', async function (ctx, next) {
console.log(ctx.request.body)
let model = new Model(ctx.request.body);
model = await model.save();
console.log('user',model)
ctx.body = model
})
router.post('/find', async function (ctx, next) {
let models = await Model.
find({}).populate('classs').populate('academy').populate('school')
ctx.body = models
})
router.post('/get', async function (ctx, next) {
// let users = await User.
// find({})
console.log(ctx.request.body)
let model = await Model.find(ctx.request.body)
console.log(model)
ctx.body = model
})
router.post('/update', async function (ctx, next) {
console.log(ctx.request.body)
let pbj = await Model.update({ _id: ctx.request.body._id }, ctx.request.body);
ctx.body = pbj
})
router.post('/delete', async function (ctx, next) {
console.log(ctx.request.body)
await Model.remove({ _id: ctx.request.body._id });
ctx.body = 'shibai '
})
module.exports = router
二墨叛、前臺三步驟:
打開vue-admin-template-master文件止毕,在src/views目錄下創(chuàng)建一個student模塊,并在student目錄下創(chuàng)建vue文件漠趁。
1.editor.vue為編輯文件扁凛,用于創(chuàng)建班級記錄;
editor.vue
<template>
<div class="dashboard-container">
<el-form ref="form" :model="form" label-width="80px">
<el-form-item label="所屬學(xué)校">
<el-select v-model="form.school" placeholder="請選擇" @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-item label="所屬學(xué)院">
<el-select v-model="form.academy" placeholder="請選擇">
<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-item label="所屬班級">
<el-select v-model="form.classs" placeholder="請選擇">
<el-option
v-for="item in classs"
:key="item._id"
:label="item.name"
:value="item._id">
</el-option>
</el-select>
</el-form-item>
<el-form-item label="用戶名">
<el-input v-model="form.name"></el-input>
</el-form-item>
<el-form-item label="年齡">
<el-input v-model="form.age"></el-input>
</el-form-item>
<el-form-item label="學(xué)號">
<el-input v-model="form.student_number"></el-input>
</el-form-item>
<el-form-item label="性別">
<el-input v-model="form.gender"></el-input>
</el-form-item>
<el-form-item>
<el-button type="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: 'student',
computed: {
...mapGetters([
'name'
])
},
data(){
return{
schools:[],
academys:[],
classs:[],
options: [
],
apiModel:'student',
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)
}
})
//顯示班級欄目
this.$http.post('/api/classs/find').then(res => {
if(res&&res.length>0){
this.classs = res
console.log('res:', res)
}
})
}
}
</script>
<style lang="scss" scoped>
.dashboard {
&-container {
margin: 30px;
}
&-text {
font-size: 30px;
line-height: 46px;
}
}
</style>
2.index.vue為目錄文件闯传,用于顯示結(jié)果
index.vue
<template>
<div class="dashboard-container">
<el-table
:data="users"
style="width: 100%"
:row-class-name="tableRowClassName">
<el-table-column
prop="name"
label="名字"
width="180">
</el-table-column>
<el-table-column
prop="age"
label="年齡"
width="180">
</el-table-column>
<el-table-column
prop="student_number"
label="學(xué)號">
</el-table-column>
<el-table-column
prop="gender"
label="性別">
</el-table-column>
<!-- 列表添加項目
-->
<el-table-column
prop="school"
label="學(xué)校名稱"
width="180">
<template slot-scope="scope" >
<span class="" 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-column
prop="academy"
label="學(xué)院名稱"
width="180">
<template slot-scope="scope" >
<span class="" 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-column
prop="classs"
label="班級名稱"
width="180">
<template slot-scope="scope" >
<span class="" v-if="scope.row.classs">
<el-tag
:type="scope.row.classs.name === '18軟工4-3' ? 'primary' : 'success'"
disable-transitions>{{scope.row.classs.name}}</el-tag>
</span>
</template>
</el-table-column>
<el-table-column label="操作">
<template slot-scope="scope">
<el-button
size="mini"
@click="handleEdit(scope.$index, scope.row)">編輯
</el-button>
<el-button
size="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: 'student',
computed: {
...mapGetters([
'name'
])
},
data() {
return {
apiModel:'student',
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>
<style lang="scss" scoped>
.dashboard {
&-container {
margin: 30px;
}
&-text {
font-size: 30px;
line-height: 46px;
}
}
</style>
3.在index.js中添加路由:
{
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' }
}]
},
賴銘浩校園管理實訓(xùn)6
目標(biāo):創(chuàng)建班級管理模塊(老師和學(xué)院谨朝、學(xué)校關(guān)聯(lián)起來)
一、后臺三步驟:
1甥绿、打開projectName文件字币,在models目錄下創(chuàng)建teacher.js文件,接著文件操作:
在models目錄下創(chuàng)建teacher.js
const mongoose = require('mongoose')
const Schema= mongoose.Schema
const feld={
name: String,
age: String,
//人物標(biāo)簽
level:String,
gender:String,
school : { type: Schema.Types.ObjectId, ref: 'School' },
academy : { type: Schema.Types.ObjectId, ref: 'Academy' }
}
//自動添加更新時間創(chuàng)建時間:
let personSchema = new mongoose.Schema(feld, {timestamps: {createdAt: 'created', updatedAt: 'updated'}})
module.exports= mongoose.model('Teacher',personSchema)
2共缕、找到projectName下的routes目錄洗出,創(chuàng)建teacher.js文件:
routes目錄下創(chuàng)建teacher.js
const router = require('koa-router')()
let Model = require("../db/models/teacher");
router.prefix('/teacher')
router.get('/', function (ctx, next) {
ctx.body = 'this is a users response!'
})
router.post('/add', async function (ctx, next) {
console.log(ctx.request.body)
let model = new Model(ctx.request.body);
model = await model.save();
console.log('user',model)
ctx.body = model
})
router.post('/find', async function (ctx, next) {
let models = await Model.
find({}).populate('academy').populate('school')
ctx.body = models
})
router.post('/get', async function (ctx, next) {
// let users = await User.
// find({})
console.log(ctx.request.body)
let model = await Model.find(ctx.request.body)
console.log(model)
ctx.body = model
})
router.post('/update', async function (ctx, next) {
console.log(ctx.request.body)
let pbj = await Model.update({ _id: ctx.request.body._id }, ctx.request.body);
ctx.body = pbj
})
router.post('/delete', async function (ctx, next) {
console.log(ctx.request.body)
await Model.remove({ _id: ctx.request.body._id });
ctx.body = 'shibai '
})
module.exports = router
3.在app.js中掛載路由:
const teacher= require('./routes/teacher')
app.use(teacher.routes(), teacher.allowedMethods())
二、前臺三步驟:
打開vue-admin-template-master文件图谷,在src/views目錄下創(chuàng)建一個teacher模塊翩活,并在teacher目錄下創(chuàng)建vue文件阱洪。
1.editor.vue為編輯文件,用于創(chuàng)建班級記錄菠镇;
editor.vue
<template>
<div class="dashboard-container">
<el-form ref="form" :model="form" label-width="80px">
<el-form-item label="所屬學(xué)校">
<el-select v-model="form.school" placeholder="請選擇" @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-item label="所屬學(xué)院">
<el-select v-model="form.academy" placeholder="請選擇">
<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-item label="用戶名">
<el-input v-model="form.name"></el-input>
</el-form-item>
<el-form-item label="年齡">
<el-input v-model="form.age"></el-input>
</el-form-item>
<el-form-item label="性別">
<el-input v-model="form.gender"></el-input>
</el-form-item>
<el-form-item label="級別">
<el-input v-model="form.level"></el-input>
</el-form-item>
<el-form-item>
<el-button type="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: 'teacher-editor',
computed: {
...mapGetters([
'name'
])
},
data(){
return{
schools:[],
academys:[],
options: [
],
apiModel:'teacher',
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>
<style lang="scss" scoped>
.dashboard {
&-container {
margin: 30px;
}
&-text {
font-size: 30px;
line-height: 46px;
}
}
</style>
2.index.vue為目錄文件澄峰,用于顯示結(jié)果;
<template>
<div class="dashboard-container">
<el-table
:data="users"
style="width: 100%"
:row-class-name="tableRowClassName">
<el-table-column
prop="name"
label="名字"
width="180">
</el-table-column>
<el-table-column
prop="age"
label="年齡"
width="180">
</el-table-column>
<el-table-column
prop="level"
label="等級">
</el-table-column>
<el-table-column
prop="gender"
label="性別">
</el-table-column>
<!-- 列表添加項目
-->
<el-table-column
prop="school"
label="學(xué)校名稱"
width="180">
<template slot-scope="scope" >
<span class="" 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-column
prop="academy"
label="學(xué)院名稱"
width="180">
<template slot-scope="scope" >
<span class="" 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-column label="操作">
<template slot-scope="scope">
<el-button
size="mini"
@click="handleEdit(scope.$index, scope.row)">編輯
</el-button>
<el-button
size="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: 'teacher',
computed: {
...mapGetters([
'name'
])
},
data() {
return {
apiModel:'teacher',
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>
<style lang="scss" scoped>
.dashboard {
&-container {
margin: 30px;
}
&-text {
font-size: 30px;
line-height: 46px;
}
}
</style>
3.在index.js中添加路由:
{
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' }
}]
},