校園管理實(shí)訓(xùn)1

1.安裝 nodejs

2.安裝 git

3.下載?vue-element-admin

建議本項(xiàng)目的定位是后臺(tái)集成方案,不太適合當(dāng)基礎(chǔ)模板來進(jìn)行二次開發(fā)。因?yàn)楸卷?xiàng)目集成了很多你可能用不到的功能,會(huì)造成不少的代碼冗余。如果你的項(xiàng)目不關(guān)注這方面的問題,也可以直接基于它進(jìn)行二次開發(fā)。

集成方案:?vue-element-admin

基礎(chǔ)模板:?vue-admin-template

桌面終端:?electron-vue-admin

Typescript 版:?vue-typescript-admin-template?(鳴謝:?@Armour)

Others:?awesome-project


# 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

啟動(dòng)成功

啟動(dòng)成功后刪除多余界面 router/index.vue

刪除后的界面如下

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 (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-357941465export function resetRouter() {

? const newRouter = createRouter()

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

export default router

安裝ES6語(yǔ)法插件

npm install --save es6-promise

本人使用了自己寫的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){//用戶登錄時(shí)每次請(qǐng)求將token放入請(qǐng)求頭中

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

? // }


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

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

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

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

????? var str = [];

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

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

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

??? };

? }

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


? return config;}, function (error) {

? // Do something with request error

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

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


Axios.interceptors.response.use(

? response => {

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

??? return response.data;

? },

? error => {

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

??? if (error.response) {

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

??????? case 404:

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

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

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

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

????????? })

????????? break;

??????? default:

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

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

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

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

????????? })

????? }

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

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

??? } else {

????? Message({

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

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

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

????? })

??? }


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

? });

export default Vue.prototype.$http = Axios;


配置axios代理:

vue.config.js ↓

'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 = 9528const 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

??????? returnoptions

????? })

????? .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)

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>

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

npm install -g koa-generator

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

koa2 projectName

構(gòu)建成功信息:

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


?? install dependencies:

???? > cd projectName &&npm install


?? run the app:

???? > SET DEBUG=koa* &npm start projectName


?? create: projectName/public/javascripts

D:\project>

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

cd projectName

初始化項(xiàng)目,如果沒有安裝git會(huì)報(bào)錯(cuò).

npm install

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

npm run dev

這里koa2模板提示信息做的并不好,沒有輸出測(cè)試地址,成功后出現(xiàn)如下界面代表成功了。

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`

在瀏覽器打開地址:http://localhost:3000/出現(xiàn)koa2的歡迎界面就代表成功了。

8.安裝本地mongodb或者在mongodb官網(wǎng)新建免費(fèi)的云端服務(wù)器。

本人在這里用的mongodb免費(fèi)云端數(shù)據(jù)庫(kù)。抱歉密碼不能公開,請(qǐng)自行換成自己的密碼鏈接如下:

本人數(shù)據(jù)庫(kù)名為vikiki

dbs:?'mongodb+srv://vikiki:<需要修改>@vikiki.or9iy.mongodb.net/vikiki?retryWrites=true&w=majority'

安裝mongoose

npm install mongoose --save

在第7步建好的nodejs項(xiàng)目中根目錄創(chuàng)建db目錄作者用的webstorm,可以根據(jù)自己需要下載編輯器

代碼中連接密碼需要修改成自己的

創(chuàng)建config.js 輸入代碼:

module.exports = {

??? // dbs: 'mongodb://139.159.253.110:27017/test1'

??? dbs:?'mongodb+srv://vikiki:<需要修改>@vikiki.or9iy.mongodb.net/vikiki?retryWrites=true&w=majority'}

創(chuàng)建user.js 輸入代碼:

const mongoose = require('mongoose')const feld={

??? name: String,

??? age: Number,

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

??? labels:Number}//自動(dòng)添加更新時(shí)間創(chuàng)建時(shí)間:let personSchema = new mongoose.Schema(feld, {timestamps: {createdAt: 'created', updatedAt: 'updated'}})

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

修改根目錄app.js

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 handleronerror(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

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

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

npm run dev

運(yùn)行成功

到這里前后端就連接通了,可以開始操作數(shù)據(jù)庫(kù)。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容