thinkjs——一个字段一种数字代表两种状态

问题来源:

现有一张company数据表,其中有一个字段state(-2:待审核;-1:禁用;0:正常;1:会员过期;),一般而言,在前期设计数据表的时候,会将每种状态下都用一种特定的数字代表,但是这里起初并没有将-2代表的待审核和拒绝状态分开,即-2代表着两种状态:待审核以及拒绝。现要求在字段state不增加值的情况下,根据company中的另外一个字段refuse是否为空来区分是待审核或者是拒绝。

分析:

拿到需求,先分析一下:在原来-2的基础之上,在查询条件中增加refuse条件即可。

解决过程:

'use strict';
/**
 * author: xxx
 * create: xxx
 * update: xxx
 * desc: 公司管理model
 */
export default class extends think.model.base {
    getList(obj){
        let whereObj={};
        if(obj.id){
            whereObj['id']=obj.id
        }
        if(obj.state && obj.state!=2){  //2为全部
            if(obj.state == -51){// 假定待审核状态为-51
                let sql = " ' ' or refuse is null ";
                whereObj.refuse = sql;
                whereObj.state = -2;
            }
            else if(obj.state == -50){//假定拒绝状态为-50
                let sql =“!=‘’”;
                whereObj.refuse = sql;
                whereObj.state = -2;
            }else{
                whereObj.state = obj.state;
            }
        }
        console.log(whereObj);
        if(obj.type && obj.type!=-100){
            whereObj.type=obj.type
        }
        if(obj.name){
            whereObj['name']=["like", "%"+obj.name+"%"]
        }
        if(obj.people){
            whereObj['people']=["like", "%"+obj.people+"%"]
        }
        if(obj.stime&&!isNaN(obj.stime)&&obj.etime&&!isNaN(obj.etime)){
            {whereObj['regtime']={'>':obj.stime,'<':Number.parseInt(obj.etime)+24*60*60}}
        }else if(!isNaN(obj.stime)&&obj.stime){
            whereObj['regtime']={'>':obj.stime};
        }else if(!isNaN(obj.etime)&&obj.etime){
            whereObj['regtime']={'<':Number.parseInt(obj.etime)+24*60*60};
        }
        return this.page(obj.page, obj.rows).order('id DESC').where(whereObj).countSelect();
    }
}

原以为这样子处理就万事大吉了,只是在程序执行的过程中,出现了异常:thinkjs在自己特有的运行机制中,将这句sql语句转为了:

//执行结果
[2017-02-22 16:12:09] [SQL] SELECT COUNT(company.id) AS think_count FROM `company` WHERE ( `refuse` = ' \' \' or refuse is null ' ) AND ( `state` = -2 ) ORDER BY id DESC LIMIT 1 3ms

这样也就导致最终查询出来的数据出了问题。究其原因,是因为将where条件中的语句进行了转义,而我们并不需要转义过来的sql语句,那怎么能使这句sql在执行过程中不进行转义呢?在thinkjs官网中又找到了这样一条信息:

//thinkjs 官网
EXP 条件

ThinkJS 默认会对字段和值进行转义,防止安全漏洞。有时候一些特殊的情况不希望被转义,可以使用 EXP 的方式,如:

export default class extends think.model.base {
  where1(){
    //SELECT * FROM `think_user` WHERE ( (`name` ='name') )
    return this.where({name: ['EXP', "=\"name\""]}).select();
  }
}

原来超强的thinkjs中竟然有防止转义的方法,那一刻真的有点小兴奋:这就是问题马上解决出来的快感(嘿嘿……)

于是乎,之前的代码就成功转型为:

if(obj.state && obj.state!=2){
            if(obj.state == -51){//待审核
                let sql = ['EXP', "= \' \' or refuse is null "];
                whereObj.refuse = sql;
                whereObj.state = -2;
            }
            else if(obj.state == -50){//拒绝
                let sql = ['EXP', "!='' "];
                whereObj.refuse = sql;
                whereObj.state = -2;
            }else{
                whereObj.state = obj.state;
            }
        }

执行后的sql语句为:

//执行结果
[2017-02-22 17:30:58] [SQL] SELECT COUNT(company.id) AS think_count FROM `company` WHERE ( (`refuse` !='' ) ) AND ( `state` = -2 ) ORDER BY id DESC LIMIT 1 2ms

这样便完美的解决了这个问题。

posted @ 2017-02-23 16:57  郑叶叶  阅读(344)  评论(0编辑  收藏  举报