SPF’校園管理項目實訓(xùn)-1

1.安裝 nodejs

進入官網(wǎng)下載Nodejs并安裝

image

2.安裝 git

進入Git官網(wǎng)下載并安裝

image

3.下載 vue-element-admin

進入Github下載并解壓

image

# clone the project

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

# enter the project directory

cd vue-admin-template
image

# install dependency

npm install
image

# develop

npm run dev
image
image
image

** # 刪除多余界面 router/index**

將router/inedx.js修改如下:


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

修改后的界面:

image

安裝ES6語法插件

npm install --save es6-promise
image

進入..\src\utils配置Axios文件

image.png

編寫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;') {//默認(rèn)發(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代理:

vue.config.js ↓

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

main.js中加入http

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

調(diào)用接口

···
<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
image.png

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

koa2 projectName
image.png

初始化后臺項目插件辜限,命令如下:

cd projectName

初始化項目刹悴,如果沒有安裝git會報錯.

npm install

項目試運行

npm run dev

成功運行


image.png

成功登錄

image.png

本人數(shù)據(jù)庫名為test
mongo "mongodb+srv://cluster0.rsqsm.mongodb.net/Project"?retryWrites=true&w=majority

安裝mongoose

npm install mongoose --save

在第7步建好的nodejs項目中根目錄創(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'
}

user.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

修改根目錄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

重啟項目
關(guān)掉前面我們啟動的服務(wù)在運行


image.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市埠通,隨后出現(xiàn)的幾起案子儡毕,更是在濱河造成了極大的恐慌簇捍,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,525評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件杜漠,死亡現(xiàn)場離奇詭異极景,居然都是意外死亡,警方通過查閱死者的電腦和手機驾茴,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,203評論 3 395
  • 文/潘曉璐 我一進店門盼樟,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人锈至,你說我怎么就攤上這事晨缴。” “怎么了峡捡?”我有些...
    開封第一講書人閱讀 164,862評論 0 354
  • 文/不壞的土叔 我叫張陵击碗,是天一觀的道長。 經(jīng)常有香客問我们拙,道長稍途,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,728評論 1 294
  • 正文 為了忘掉前任砚婆,我火速辦了婚禮械拍,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己坷虑,他們只是感情好甲馋,可當(dāng)我...
    茶點故事閱讀 67,743評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著迄损,像睡著了一般定躏。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上芹敌,一...
    開封第一講書人閱讀 51,590評論 1 305
  • 那天痊远,我揣著相機與錄音,去河邊找鬼党窜。 笑死,一個胖子當(dāng)著我的面吹牛借宵,可吹牛的內(nèi)容都是我干的幌衣。 我是一名探鬼主播,決...
    沈念sama閱讀 40,330評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼壤玫,長吁一口氣:“原來是場噩夢啊……” “哼豁护!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起欲间,我...
    開封第一講書人閱讀 39,244評論 0 276
  • 序言:老撾萬榮一對情侶失蹤楚里,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后猎贴,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體班缎,經(jīng)...
    沈念sama閱讀 45,693評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,885評論 3 336
  • 正文 我和宋清朗相戀三年她渴,在試婚紗的時候發(fā)現(xiàn)自己被綠了达址。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,001評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡趁耗,死狀恐怖沉唠,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情苛败,我是刑警寧澤满葛,帶...
    沈念sama閱讀 35,723評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站罢屈,受9級特大地震影響嘀韧,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜缠捌,卻給世界環(huán)境...
    茶點故事閱讀 41,343評論 3 330
  • 文/蒙蒙 一乳蛾、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦肃叶、人聲如沸蹂随。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,919評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽岳锁。三九已至,卻和暖如春蹦魔,著一層夾襖步出監(jiān)牢的瞬間激率,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,042評論 1 270
  • 我被黑心中介騙來泰國打工勿决, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留乒躺,地道東北人。 一個月前我還...
    沈念sama閱讀 48,191評論 3 370
  • 正文 我出身青樓低缩,卻偏偏與公主長得像嘉冒,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子咆繁,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,955評論 2 355

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