nodeJS開發(fā)一套完整的項目(5泼掠、開發(fā)用戶模塊)

到此怔软,我們才真正進入具體的模塊開發(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)容
后臺日志

如果看到以上內(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)驗浑劳,謝謝大家。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末夭拌,一起剝皮案震驚了整個濱河市魔熏,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌鸽扁,老刑警劉巖蒜绽,帶你破解...
    沈念sama閱讀 212,686評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異桶现,居然都是意外死亡躲雅,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,668評論 3 385
  • 文/潘曉璐 我一進店門骡和,熙熙樓的掌柜王于貴愁眉苦臉地迎上來相赁,“玉大人,你說我怎么就攤上這事慰于∨タ疲” “怎么了?”我有些...
    開封第一講書人閱讀 158,160評論 0 348
  • 文/不壞的土叔 我叫張陵婆赠,是天一觀的道長绵脯。 經(jīng)常有香客問我,道長休里,這世上最難降的妖魔是什么蛆挫? 我笑而不...
    開封第一講書人閱讀 56,736評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮妙黍,結(jié)果婚禮上璃吧,老公的妹妹穿的比我還像新娘。我一直安慰自己废境,他們只是感情好畜挨,可當我...
    茶點故事閱讀 65,847評論 6 386
  • 文/花漫 我一把揭開白布筒繁。 她就那樣靜靜地躺著,像睡著了一般巴元。 火紅的嫁衣襯著肌膚如雪毡咏。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,043評論 1 291
  • 那天逮刨,我揣著相機與錄音呕缭,去河邊找鬼。 笑死修己,一個胖子當著我的面吹牛恢总,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播睬愤,決...
    沈念sama閱讀 39,129評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了光督?” 一聲冷哼從身側(cè)響起阳距,我...
    開封第一講書人閱讀 37,872評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎结借,沒想到半個月后筐摘,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,318評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡船老,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,645評論 2 327
  • 正文 我和宋清朗相戀三年蓄拣,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片努隙。...
    茶點故事閱讀 38,777評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡荸镊,死狀恐怖咽斧,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情躬存,我是刑警寧澤张惹,帶...
    沈念sama閱讀 34,470評論 4 333
  • 正文 年R本政府宣布,位于F島的核電站盾剩,受9級特大地震影響雷激,放射性物質(zhì)發(fā)生泄漏替蔬。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 40,126評論 3 317
  • 文/蒙蒙 一屎暇、第九天 我趴在偏房一處隱蔽的房頂上張望承桥。 院中可真熱鬧,春花似錦根悼、人聲如沸凶异。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,861評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽剩彬。三九已至,卻和暖如春矿卑,著一層夾襖步出監(jiān)牢的瞬間喉恋,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,095評論 1 267
  • 我被黑心中介騙來泰國打工粪摘, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人绍坝。 一個月前我還...
    沈念sama閱讀 46,589評論 2 362
  • 正文 我出身青樓徘意,卻偏偏與公主長得像,于是被迫代替她去往敵國和親轩褐。 傳聞我的和親對象是個殘疾皇子椎咧,可洞房花燭夜當晚...
    茶點故事閱讀 43,687評論 2 351

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