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官网中又找到了这样一条信息:

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

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

时间: 2024-12-20 02:19:10

thinkjs——一个字段一种数字代表两种状态的相关文章

php在数字前面补0得到固定长度数字的两种方法

比较基础,其实两个内置函数都能实现. 1  sprintf 语法: string sprintf(string format, mixed [args]...); 返回值: 字符串 函数种类: 资料处理 本函数用来将字符串格式化.参数 format 是转换的格式,以百分比符号 % 开始到转换字符为止.而在转换的格式间依序包括了 填空字符.0 的话表示空格填 0:空格是默认值,表示空格就放着. 对齐方式.默认值为向右对齐,负号表向左对齐. 字段宽度.为最小宽度. 精确度.指在小数点后的浮点数位数.

Oracle sql判断一个字段是否全数字 或含有中文

[sql] view plain copy update (select length(t.name), t.* -- name,length(name) from g_enterprise_info t where nvl2(translate(name, '\1234567890 ', '\'), 'is characters ', 'is number ') = 'is number ' and asciistr(gszcdjh) like '%\%') set name = gszcdj

20Mybatis_订单商品数据模型_一对一查询——resultType和resultMap两种方式以及两种方式的总结

上一篇文章分析了数据模型,这篇文章就给出一个需求,这个需求是一对一查询,并完成这个需求. -------------------------------------------------------------------------------------------------------------------------------------------- 需求: 查询订单信息,关联查询创建订单的用户信息. 记住:用Mybatis开发的顺序就是 1.写sql语句 2.创建pojo类来

Json转list,两种包,两种方式

1.使用fastjson 对于json串大小写没什么要求,测试的时候,我把javaBean属性设置成和json串一样的大小写,代码如下: package com.myTest.json.test1; import java.util.ArrayList; import java.util.List; import com.alibaba.fastjson.JSON; public class app1 { public static void main(String[] args) { Stri

检测一个字符串是否为回文? 两种方法

/** *    检测一个字符串是否为回文?三种方法? *    方法1:用str.charAt(index) !=  str.charAt(len-i-1) *    方法2:用StringBuilder . reverse反转 *    方法3:用开关控制 */ public class reversChar { public static void main(String[] args) { String str = "123321"; //中文也可以 System.out.pr

javade多任务处理之Executors框架(线程池)实现的内置几种方式与两种基本自定义方式

一 Executors框架(线程池) 主要是解决开发人员进行线程的有效控制,原理可以看jdk源码,主要是由java.uitl.concurrent.ThreadPoolExecutor类实现的,这里只列出简单用法 根据Executors可以创建不同功能的线程池,主要有四种: 1 newFixedThreadPool : 返回一个固定数量的线程池,并且池中数量一致保持不变,有任务时如果有空闲线程则立即执行,没有就暂时存放到队列等待空闲线程 //创建一个有10个线程的线程池,任务多于10个会一直等待

thinkphp的钩子的两种配置和两种调用方法

thinkphp的钩子行为类是一个比较难以理解的问题,网上有很多写thinkphp钩子类的文章,我也是根据网上的文章来设置thinkphp的钩子行为的,但根据这些网上的文章,我在设置的过程中,尝试了十几次都没有成功,不过,我还是没有放弃,最后还是在一边调节细节,一边试验的过程中实现了钩子行为的设置.下面是我个人的设置经验,在这里跟大家分享一下. 个人做了两种设置,都试验成功了,一个简单点,在thinkphp的核心文件中模仿核心行为类添加了另一个行为类,下面是截图: 我的虚拟主机配置文件夹是D:/

Qt打开外部程序的三种方法(两种阻塞,一种不阻塞)

Qt打开外部程序 [cpp] view plaincopy //1.通过调用系统函数 system("opt/myApp"); //这是linux下的,windows下可以用WinExec等函数 //2.通过QProcess,阻塞调用 QProcess::execute("/opt/myApp"); //绝对路径和相对路径都可以,windows下要带exe后缀,系统应用如记事本notepad可直接输入打开 //3.通过QProcess,非阻塞调用 QProcess 

三种加密算法和两种密钥交换机制讲解

一.基础知识:       1.互联网上中间人攻击通常用的三种方式:1)窃听 2)数据篡改 3)会话劫持 2.数据加密的常用的三种方式有:对称加密.非对称加密.单向加密. 3.ssl:secure socket layer,安全的套接字层. 4.TLS:Transport Layer Security,功能类似于ssl. 5.随机数生成器:/dev/random 和 /dev/urandom .   -salt:依赖于随机数生成器. 6.随机数的来源:熵池和伪随机数生成器.熵池中的随机数来自块设