学生管理系统实训.

本文档详细记录了使用nodejs、vue-element-admin构建校园管理系统的实训过程,包括安装nodejs和git,下载vue-element-admin,创建并配置koa2项目,设置mongodb数据库,以及逐步实现学校、学院、班级、学生和老师管理模块的前后端功能。实训总结中提及,系统实现了学校、专业、班级、学生和老师的增删改查功能,采用nodejs(koa2、mongoose)、element-ui和admin-element作为核心技术栈。
摘要由CSDN通过智能技术生成

nodejs vue-element-admin (实训1)

1、安装nodejs

1.nodejs 官网下载 https://nodejs.org/zh-cn/

2.windows端选择合适路径,新建文件夹
在这里插入图片描述

  1. 运行管理员命令以安装vue脚手架
    在这里插入图片描述

  2. 安装vue脚手架

npm install -g vue-cli 

注意:在mac执行该命令会报错,改用管理员权限执行以下命令即可.
在这里插入图片描述

  1. 初始化项目
vue init webpack my-project

在这里插入图片描述
6.项目试运行

cd my-project
npm run dev

7.完成了利用脚手架创建并启动一个vue的项目,可访问http://localhost:8080 看到下图界面说明项目启动成功
在这里插入图片描述

2、安装git

在这里插入图片描述

3、下载 vue-element-admin

1.基础模板: [vue-admin-template]
(https://github.com/PanJiaChen/vue-admin-template)**

集成方案: vue-element-admin
桌面终端: electron-vue-admin Typescript 版:
vue-typescript-admin-template (鸣谢: @Armour)
Others: awesome-project

在这里插入图片描述
在这里插入图片描述
2.安装依赖,启动服务

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

# enter the project directory
cd vue-admin-template

# install dependency
npm install

# develop
npm run dev

在这里插入图片描述
启动成功
在这里插入图片描述
3.删除多余界面 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

4.安装ES6语法插件

npm install --save es6-promise

在这里插入图片描述
5.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;') {
   //默认发application/json请求,如果application/x-www-form-urlencoded;需要使用transformRequest对参数进行处理
    /*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;

6.配置axios代理:
在这里插入图片描述
vue.config.js ↓

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

7.main.js中加入http

import http from './utils/http'
Vue.use(http)

调用接口:
在这里插入图片描述
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>

4、全局安装koa-generator,执行下面命令,构建koa2项目代码如下

1.新建文件夹,启动cmd

npm install -g koa-generator
koa2 projectName

2.构建成功信息:

D:\project>koa2 projectName

   create : projectName
   create : projectName/package.json
   create : projectName/app.js
   create : projectName/public
   create : projectName/public/images
   create : projectName/routes
   create : projectName/routes/index.js
   create : projectName/routes/users.js
   create : projectName/views
   create : projectName/views/index.pug
   create : projectName/views/layout.pug
   create : projectName/views/error.pug
   create : projectName/public/stylesheets
   create : projectName/public/stylesheets/style.css
   create : projectName/bin
   create : projectName/bin/www

3.初始化后台项目插件,命令属下:

cd projectName

4.初始化项目,如果没有安装git会报错.

npm install

5.项目试运行

npm run dev

出现如下界面代表成功了

D:\project\projectName>npm run dev

> projectName@0.1.0 dev D:\project\projectName
> nodemon bin/www

[nodemon] 1.19.4
[nodemon] to restart at any time, enter `rs`
[nodemon] watching dir(s): *.*
[nodemon] watching extensions: js,mjs,json
[nodemon] starting `node bin/www`

6.在浏览器打开地址:
http://localhost:3000/
出现koa2的欢迎界面就代表成功了
在这里插入图片描述

5、安装本地mongodb或者在mongodb官网新建免费的云端服务器。

创建mongodb免费云端数据库:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

6、安装本地mongodb或者在mongodb官网新建免费的云端服务器。

1.安装mongoose

npm install mongoose --save

2.在第7步建好的nodejs项目中根目录创建db目录
编写config.js、user.js
在这里插入图片描述

mongodb+srv://<username>:<password>@cluster0.tsnhv.mongodb.net/<dbname>?retryWrites=true&w=majority

下面代码中连接密码需要修改成自己的
config.js ↓

module.exports = {
   
    // dbs: 'mongodb://139.159.253.110:27017/test1'
    dbs: 'mongodb+srv://<username>:<password>@cluster0.tsnhv.mongodb.net/<dbname>?retryWrites=true&w=majority'
}

user.js ↓

const mongoose = require('mongoose')
const feld={
   
    name: String,
    age: Number,
    //人物标签
    labels:Number
}
//自动添加更新时间创建时间:
let personSchema = new mongoose.Schema(feld, {
   timestamps: {
   createdAt: 'created', updatedAt: 'updated'}})
module.exports= mongoose.model('User',personSchema)

修改根目录app.js
在这里插入图片描述
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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值