到此怔软,我們才真正進入具體的模塊開發(fā)階段。本章節(jié)择镇,我們先從用戶入手挡逼,談?wù)勅绾伍_發(fā)用戶模塊。
創(chuàng)建用戶模型
我們在web->models->admin文件夾下創(chuàng)建admin.js腻豌,這是用戶表信息家坎,具體如下:
'use strict';
import mongoose from 'mongoose';
const Schema = mongoose.Schema;
const adminSchema = new Schema({
user_name: String,
password: String,
id: Number,
create_time: String,
admin: {type:String,default:'管理員'},
status: Number, //1、普通管理員 2吝梅、超級管理員
avatar: {type: String, default: 'default.jpg'},
city: String,
});
adminSchema.index({id: 1}); //索引
const Admin = mongoose.model('Admin',adminSchema);
export default Admin;
用戶權(quán)限判斷
這個主要在用戶登錄的時候做判斷乘盖,我們在web->middlewares文件夾下,創(chuàng)建check.js文件憔涉,具體如下:
/**
* Created by admin on 2017/9/28 0014.
*/
'use strict';
import AdminModel from '../models/admin/admin';
class Check {
constructor() {}
async checkAdmin(req, res, next) {
const admin_id = req.session.admin_id;
if(!admin_id || !Number(admin_id)) {
res.send({
status: 0,
type: 'ERROR_SESSION',
message: '親订框,您還沒有登錄'
});
return
} else {
const admin = await AdminModel.findOne({id: admin_id});
if(!admin) {
res.send({
status: 0,
type: 'HAS_NO_ACCESS',
message: '權(quán)限不足,請聯(lián)系管理員提升權(quán)限'
});
return
}
}
next()
};
async checkSuperAdmin(req, res, next) {
const admin_id = req.session.admin_id;
if(!admin_id || !Number(admin_id)) {
res.send({
status: 0,
type: 'ERROR_SESSION',
message: '親兜叨,您還沒有登錄',
});
return
} else {
const admin = await AdminModel.findOne({id: admin_id});
if(!admin || admin.status != 2) {
res.send({
status: 0,
type:'HAS_NO_ACCESS',
message: '權(quán)限不足'
});
return
}
}
next();
};
}
export default new Check();
編寫用戶控制器
我們在web->controller->admin文件夾下穿扳,創(chuàng)建admin.js文件,具體如下:
/**
* Created by admin on 2017/9/14 0014.
*/
'use strict';
import AdminModel from '../../models/admin/admin';
import AddressComponent from '../../prototype/addressComponent';
import cryoto from 'crypto';
import formidable from 'formidable';
import dtime from 'time-formater';
class Admin extends AddressComponent {
//構(gòu)造函數(shù)
constructor() {
super();
};
//登錄
async login(req, res, next) {
const form = new formidable.IncomingForm(); //創(chuàng)建表單對象
//form.parse方法會轉(zhuǎn)換請求中所包含的表單數(shù)據(jù)国旷,callback會包含所有字段域和文件信息
form.parse(req, async(err, fields, files) => {
if(err) {
res.send({
status: 0,
type: 'FORM_DATA_ERROR',
message: '表單信息錯誤'
});
return;
}
const {user_name, password, status = 1} = fields;
try{
if(!user_name) {
res.send({
status: 0,
type: 'GET_ERROR_USERNAME',
message: '用戶名參數(shù)錯誤'
});
} else if(!password) {
res.send({
status: 0,
type: 'GET_ERROR_PASSWORD',
message: '密碼參數(shù)錯誤'
});
}
} catch(err) {
console.log(err.message,err);
res.send({
status: 0,
type: 'GET_ERROR_PARAM',
message: err.message
});
return;
}
const newpassword = this.encryption(password);
try{
const admin = await AdminModel.findOne({user_name});
if(!admin) {
const adminTip = status == 1 ? '管理員' : '超級管理員';
const admin_id = await this.getId('admin_id');
const cityInfo = await this.guessPosition(req);
const newAdmin = {user_name,password: newpassword,id: admin_id,create_time:dtime().format('YYYY-MM-DD HH:mm'),admin: adminTip,status,city:cityInfo.city
};
await AdminModel.create(newAdmin);
req.session.admin_id = admin_id;
res.send({
status: 1,
success: '注冊管理員成功'
})
} else if (newpassword.toString() != admin.password.toString()) {
console.log('管理員登錄密碼錯誤');
res.send({
status: 0,
type: 'ERROR_PASSWORD',
message: '該用戶已存在矛物,密碼輸入錯誤'
})
} else {
req.session.admin_id = admin.id;
res.send({
status: 1,
success: '登錄成功'
})
}
} catch(err) {
console.log('登錄管理員失敗',err);
res.send({
status: 0,
type: 'LOGIN_ADMIN_FAILLED',
message: '登錄管理員失敗'
})
}
});
}
//注冊
async register(req, res, next) {
const form = new formidable.IncomingForm();
form.parse(req, async(err,fields,files) => {
if(err) {
res.send({
status: 0,
type: 'FORM_DATA_ERROR',
message: '表單信息錯誤'
});
return;
}
const {user_name, password, status = 1} = fields;
try{
if(!user_name) {
res.send({
status: 0,
type: 'GET_ERROR_USER_NAME',
message: '用戶名錯誤'
})
} else if(!password) {
res.send({
status: 0,
type: 'GET_ERROR_PASSWORD',
message: '密碼錯誤'
});
}
} catch(err) {
console.log(err.message,err);
res.send({
status: 0,
type: 'GET_ERROR_PARAM',
message: err.message
});
return;
}
try{
const admin = await AdminModel.findOne({user_name});
if(admin) {
console.log('該用戶已經(jīng)存在');
res.send({
status: 0,
type: 'USER_HAS_EXIST',
message: '該用戶已經(jīng)存在'
})
} else {
const adminTip = status == 1 ? '管理員' : '超級管理員';
const admin_id = await this.getId('admin_id');
const newpassword = this.encryption(password);
const newAdmin = {
user_name,
password: newpassword,
id: admin_id,
create_time: dtime().format('YYYY-MM-DD'),
admin: adminTip,
status,
};
await AdminModel.create(newAdmin);
req.session.admin_id = admin_id;
res.send({
status: 1,
message: '注冊管理員成功'
})
}
} catch(err) {
console.log('注冊管理員失敗',err);
res.send({
status: 0,
type: 'REGISTER_ADMIN_FAILED',
message: '注冊管理員失敗'
})
}
})
};
//密碼加密
encryption(password){
const newpassword = this.Md5(this.Md5(password).substr(2,7) + this.Md5(password));
return newpassword;
}
//md5加密
Md5(password) {
const md5 = cryoto.createHash('md5');
return md5.update(password).digest('base64');
}
//退出
async singout(req, res, next) {
try{
delete req.session.admin_id;
res.send({
status: 1,
success: '退出成功'
})
} catch(err) {
console.log('退出失敗',err);
res.send({
status: 0,
message: '退出失敗'
})
}
}
//獲取用戶列表
async getAllAdmin(req, res, next) {
const {limit = 20, offset = 0} = req.query;
try{
const allAdmin = await AdminModel.find({},'-_id -password').sort({id:-1}).skip(Number(offset)).limit(Number(limit));
res.send({
status: 1,
data: allAdmin,
})
} catch(err) {
console.log('獲取超級管理列表失敗',err);
res.send({
status: 0,
type: 'ERROR_GET_ADMIN_LIST',
message: '獲取超級管理列表失敗'
})
}
}
//獲取用戶總數(shù)
async getAdminCount(req, res, next) {
try{
const count = await AdminModel.count();
res.send({
status: 1,
count,
})
} catch(err) {
console.log('獲取管理員數(shù)量失敗', err);
res.send({
status: 0,
type: 'ERROR_GET_ADMIN_COUNT',
message: '獲取管理員數(shù)量失敗'
})
}
}
//獲取用戶基本信息
async getAdminInfo(req, res, next) {
const admin_id = req.session.admin_id;
if(!admin_id || !Number(admin_id)) {
console.log('獲取管理員信息的SESSION失效');
res.send({
status: 0,
type:'ERROR_SESSION',
message: '獲取管理員信息失敗'
});
return;
}
try{
const info = await AdminModel.findOne({id:admin_id},'-_id -password');
if(!info) {
res.send({
status: 0,
type: 'GET_ERROR_ADMIN',
message: '未找到當前管理員'
});
} else {
res.send({
status: 1,
data: info
})
}
} catch(err) {
console.log('獲取管理員信息失敗');
res.send({
status: 0,
type: 'GET_ADMIN_INFO_FAILED',
message: '獲取管理員信息失敗'
})
}
}
//圖片上傳
async updateAvatar(req, res, next) {
const admin_id = req.params.admin_id;
if(!admin_id || !Number(admin_id))
{
console.log('admin_id參數(shù)錯誤:',admin_id);
res.send({
status: 0,
type: 'ERROR_ADMINID',
message: 'admin_id參數(shù)錯誤'
});
return;
}
try{
const image_path = await this.qiniu(req);
await AdminModel.findOneAndUpdate({id:admin_id},{$set:{avatar: image_path}});
} catch(err) {
console.log('上傳圖片失敗',err);
res.send({
status: 0,
type: 'ERROR_UPLOAD_IMG',
message: '上傳圖片失敗'
})
}
};
}
export default new Admin();
配置路由信息
我們在routes文件夾下創(chuàng)建admin.js文件,這里存放的是用戶的路由信息跪但,具體如下:
'use strict';
import express from 'express';
import Admin from '../web/controller/admin/admin';
const router = express.Router();
router.post('/login',Admin.login); //用戶登錄
router.get('/singout',Admin.singout); //用戶退出
router.get('/all',Admin.getAllAdmin); //所有用戶
router.get('/count',Admin.getAdminCount); //用戶總數(shù)
router.get('/info',Admin.getAdminInfo); //用戶基本信息
router.post('/update/avatar/:admin_id',Admin.updateAvatar); //修改用戶信息
export default router;
然后我們在routes文件夾下創(chuàng)建主路由文件index.js,我們可以把分路由全部集中到主路由下履羞,代碼如下:
'use strict';
import admin from './admin';
export default app => {
app.use('/admin',admin);
};
以上配置完成后,我們就可以測試接口啦屡久,我們先測試“用戶基本信息”這個接口忆首。先啟動項目,然后在地址欄輸入:http://127.0.0.1:3000/admin/info被环,就能看到效果糙及。
如果看到以上內(nèi)容,說明接口調(diào)用成功筛欢,否則就查看代碼浸锨,看看哪里出現(xiàn)問題了唇聘。好啦,今天的任務(wù)就到這里吧柱搜,有問題我們可以相互交流迟郎。
相關(guān)章節(jié)
nodeJS開發(fā)一套完整的項目(1、基礎(chǔ)配置)
nodeJS開發(fā)一套完整的項目(2聪蘸、相關(guān)模塊介紹)
nodeJS開發(fā)一套完整的項目(3谎亩、數(shù)據(jù)庫鏈接和項目啟動)
nodeJS開發(fā)一套完整的項目(4、編寫底層功能模塊)
為了更好的服務(wù)大家宇姚,請加入我們的技術(shù)交流群:(511387930),同時您也可以掃描下方的二維碼關(guān)注我們的公眾號夫凸,每天我們都會分享經(jīng)驗浑劳,謝謝大家。