| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361 | /** * 后台管理员数据模型 * * @author CaiAoLin * @date 2017/6/1 * @version */import mongoose from "mongoose";import BaseModel from "../../common/base/base_model";import crypto from "crypto";import Request from "request";class ManagerModel extends BaseModel {    /**     * 超级用户用户名     *     * @var {String}     */    adminUsername = 'admin';    /**     * 用户权限     *     * @var     */    permission = {        'user': '用户管理',        'notify': '通知管理',        'stdBillsmain': '清单规则编辑器',        'rationRepository': '定额编辑器',        'report': '报表模板',    };    /**     * 构造函数     *     * @return {void}     */    constructor() {        let parent = super();        parent.model = mongoose.model('manager');        parent.init();    }    /**     * 设置场景     *     * @param {string} scene     * @return {void}     */    setScene(scene = '') {        switch (scene) {            // 更改密码验证规则            case 'changePassword':                this.model.schema.path('password').required(true);                break;            // CLD新增            case 'cldInsert':                this.model.schema.path('username').required(true);                this.model.schema.path('create_time').required(true);                this.model.schema.path('office').required(true);                break;        }    }    /**     * 获取过滤条件     *     * @return {Object}     */    getFilterCondition(request) {        let condition = {};        let office = request.query.office;        if (office !== '' && office !== undefined) {            condition.office = parseInt(office);        }        let permission = request.query.permission;        if (permission !== undefined) {            // 0 :权限为空的情况            condition.permission = permission === '0' ? '' : permission;        }        return condition;    }    /**     * 获取按创建时间倒序列表     *     * @param {object} condition     * @param {number} page     * @return {Promise}     */    getList(condition = null, page = 1) {        page = parseInt(page);        page = page <= 1 ? 1 : page;        let option = {page: page, sort: {create_time:-1}};        return this.db.find(condition, null, option);    }    /**     * 用户密码加密     *     * @param {string} token     * @param {string} password     * @return {string}     */    encryptPassword(token, password) {        let encryptPassword = crypto.createHmac('sha1', token).update(password)            .digest().toString('base64');        return encryptPassword;    }    /**     * 更改密码     *     * @param {string} username     * @param {string} password     * @param {string} newPassword     * @throws {string}     * @return {Promise}     */    async changePassword(username, password, newPassword) {        // 查找对应用户        let managerData = await this.findDataByCondition({username: username});        if (managerData.length <= 0) {            return false;        }        // 验证旧密码        let encryptPassword = this.encryptPassword(managerData.token, password);        if (encryptPassword !== managerData.password) {            throw '用户名或密码错误';        }        // 加密新密码        let encryptNewPassword = this.encryptPassword(managerData.token, newPassword);        let result = await this.db.update({username: username}, {password: encryptNewPassword});        return result.ok === 1;    }    /**     * 财审平台需要临时登录,只能看某个清单精灵库     */    temporaryLogin(username, password) {        const users = [            { name: '财审一', pwd: '123456'  },            { name: '财审二', pwd: '123456' , lockOperate:true},            { name: '财审三', pwd: '123456' , lockOperate:true},            { name: '财审四', pwd: '123456' , lockOperate:true},            { name: '财审五', pwd: '123456' , lockOperate:true},            { name: '财审六', pwd: '123456' , lockOperate:true},        ];        const user = users.find(item => item.name === username && item.pwd === password);        if (!user) {            return null;        }              return {            can_login: 1,            create_time: Date.now(),            id: `tempUser${user.name}`,            isNew: false,            last_login: Date.now(),            login_info: '',            login_ip: '',            username: user.name,            isTemporary: true,            lockOperate:user.lockOperate || false,        }    }    /**     * 登录信息校验     *     * @param {String} username     * @param {String} password     * @return {Promise}     */    async validLogin(username, password) {        const tempUser = this.temporaryLogin(username, password);        if (tempUser) {            return tempUser;        }        let managerData = await this.findDataByCondition({username: username});        // 没有找到对应数据        /*if (managerData === null || managerData._id === undefined) {            throw {code: 44001, err: '用户名或密码错误'};        }*/        // 是否禁止登录        if (managerData && managerData.can_login !== 1) {            throw {code: 44002, err: '账号被停用'};        }        // 如果不是超级管理员登录则走CLD接口登录流程        if (managerData === null || managerData._id === undefined || username !== this.adminUsername) {            let CLDLoginInfo = await this.CLDLogin(username, password, managerData);            if (CLDLoginInfo.can_login !== 1) {                throw {code: 44002, err: '账号被停用'};            }            managerData = CLDLoginInfo;        } else {            // 加密密码            let encryptPassword = this.encryptPassword(managerData.token, password);            if (encryptPassword !== managerData.password) {                throw {code: 44001, err: '用户名或密码错误'};            }        }        return managerData;    }    /**     * CLD登录     *     * @param {String} username     * @param {String} password     * @param {Object} managerData     * @return {Promise}     */    async CLDLogin(username, password, managerData) {        let result = managerData;        if (username === '' || password === '') {            throw {code: 44001, err: '用户名或密码错误'};        }        let CLDUrl = 'http://cld.smartcost.com.cn/api/auth';        // 生成加密token        let [encryptToken, postTime] = this.generateCLDToken();        let postData = {            username: username,            password: password,            time: postTime,            token: encryptToken,            app: 'scConstruct'        };        let postOption = {            url: CLDUrl,            form: postData,            encoding: 'utf8'        };        let responseData = await this.CLDRequest(postOption);        // 登录成功后,存在此用户则直接返回        if (managerData) {            let updateData = {                username: responseData.username,                office: responseData.office,                position: responseData.position,            };            await this.db.update({_id: managerData._id }, updateData);            managerData.username = responseData.username;            managerData.office = responseData.office;            managerData.position = responseData.position;            return result;        }        // 不存在则新增        this.setScene('cldInsert');        let current = new Date().getTime();        //cld账号登录的统一设置可以看到用户管理和允许登录        let insertData = {            username: username,            password: '',            token: '',            create_time: current,            last_login: current,            office: responseData.office,            position: responseData.position,            permission: '',            can_login: 0        };        result = this.db.create(insertData);        return result;    }    /**     * CLD请求     *     * @param {Object} postOption     * @return {Promise}     */    CLDRequest(postOption) {        return new Promise(function(resolve, reject) {            // 发起请求            Request.post(postOption, function(error, response, body) {                console.log(`body`);                console.log(body);                if (error || response.statusCode !== 200) {                    console.log(response.statusCode + ':' + error);                    reject({code: 44002, err: '接口请求出错'});                    return;                }                body = JSON.parse(body);                // 如果接口返回错误                if (body.err !== 0) {                    reject({code: body.err, err: '接口返回错误'});                    return;                }                resolve(body.data);            });        });    }    /**     * 生成CLD Token     *     * @return {Array}     */    generateCLDToken() {        // 加密内容        let token = 'sc@ConS!tru@ct*88';        let currentTime = new Date().getTime();        currentTime = parseFloat(currentTime / 1000).toFixed(0);        let encryptToken = this.encryptPassword(token, (token + currentTime));        return [encryptToken, currentTime];    }    /**     * 新增管理员     *     * @param {Object} data     * @return {Promise}     */    async createManager(data) {        if (Object.keys(data).length <= 0) {            throw '数据格式错误';        }        let result = await this.db.create(data);        return result;    }    /**     * 删除后台用户权限     * @param permission     * @return {Promise.<void>}     */    async updateByPermission(permission) {        let result = await this.db.update({permission: permission}, {permission: ''});        return result.ok === 1;    }}export default ManagerModel;
 |