分类 日常 下的文章

好久没更新mongo运维这块知识了,这次介绍 db.currentOp与db.killOp命令

数据库优化方法有很多,但所有数据库优化都离不开慢查询优化。mysql、mongodb都可以开启慢查询,来对数据库查询进行分析。开启慢查询日志,对性能会有一定的影响。mongoDB 有时我们只想临时看下慢查询日志,应该如何处理。

这时,我们可以用到mongdb的db.currentOp命令 ,他可以列出当前真正跑的op相关信息。

1.查看目前正在执行的所有查询语句

db.currentOp();

2.查询所有操作xxx集合并且执行时间已超过3s的请求

db.currentOp(
   {
     "active" : true,
     "secs_running" : { "$gt" : 3 },
     "ns" : /^xxx\./
   }
)

3. 当然,如果我当前db集群有非常多的集合,我也可以不限制xxx集合

db.currentOp(
   {
     "active" : true,
     "secs_running" : { "$gt" : 3 }
   }
)

currentOp的过滤条件包括

  1. 请求操作类型,insert、update、delete…
  2. 请求对应的connectionId,threadId
  3. 请求是否正在等待锁
  4. 请求执行时间
  5. 请求操作的DB或collection
  6. 请求query的内容
  7. …等等

返回结果如下

{
            "desc" : "conn44266",
            "threadId" : "140419266524928",
            "connectionId" : 44266,
            "client" : "10.10.68.209",
            "active" : true,
            "opid" : 4495651,
            "secs_running" : 25,
            "microsecs_running" : NumberLong(25459008),
            "op" : "command",
            "ns" : "xxxxx",
            "query" : {
                "count" : "c74dc2de71",
                "query" : {
                    "video" : {
                        "$exists" : true
                    },
                    "_isdel" : 0,
                    "deleted" : {
                        "$ne" : true
                    },
                    "verify" : {
                        "$ne" : false
                    }
                }
            },
            "planSummary" : "IXSCAN { video: 1 }",
            "numYields" : 189,
            "locks" : {
                "Global" : "r",
                "Database" : "r",
                "Collection" : "r"
            },
            "waitingForLock" : false,
            "lockStats" : {
                "Global" : {
                    "acquireCount" : {
                        "r" : NumberLong(380)
                    }
                },
                "Database" : {
                    "acquireCount" : {
                        "r" : NumberLong(190)
                    }
                },
                "Collection" : {
                    "acquireCount" : {
                        "r" : NumberLong(190)
                    }
                }
            }
        }

结果

当我们知道某条语句是锁库的罪魁祸首的时候,我们就可以通过另一条语句,干掉对应的请求。

killOp 停止正在执行的查询

用法:

db.killOp(opid)

目前Mongodb手册,还未有一次清掉当前所有查询,文档地址:https://docs.mongodb.com/manual/reference/method/db.killOp/

执行后返回

{ "info" : "attempting to kill op", "ok" : 1 }

image.png

db.killOp(opid)的实现原理如下

每个连接对应的服务线程存储了一个killPending的字段,当发送killOp时,会将该字段置1;请求在执行过程中,可以通过不断的调用OperationContext::checkForInterrupt()来检查killPending是否被设置,如果被设置,则线程退出。

一个请求要支持killOp,必须在请求的处理逻辑里加上checkForInterrupt()检查点才行,否则即使发送了killOp,也只能等待请求完全处理完毕线程才会退出。

比如createIndex的处理逻辑里包含了类似如下的代码,在createIndex的循环过程中,一旦killPending被置1了,createIndex的执行可以在当前循环结束时退出。

while (!createIndexFinished) {
    createIndexForOneElement();
    checkForInterupt();
}

所以发送killOp后,请求要执行到下一个『检查点』线程才会退出,MongoDB在很多可能耗时长的请求中,都加入了checkForInterrupt()检查点,如创建索引,repair database,mapreduce、aggregation等。

批量一次清楚当前慢查询

上面说还未有一次清掉当前所有查询, 不过我们可以通过手动写脚本实现。此脚本由diggzhang大神贡献。文章链接:http://yangcongchufang.com/kill-mongo-ops.html

实现功能:传入自己的IP地址,强制关停自己的异常查询。

打开家目录下的.mongorc.js拷贝下面的killMyRunningOps函数进去,重新打开mongoshell即可加载这个函数(mongoshell启动时会预读这个文件)。

➜  ~ cat ~/.mongorc.js
killMyRunningOps = function (clientIp) {
    var currOp = db.currentOp();
    for (op in currOp.inprog) {
        if (clientIp == currOp.inprog[op].client.split(":")[0]) {
            db.killOp(currentOp.inprog[op].opid)
        }
    }
}

用法很简单,知道自己IP后,调用这个函数:

> killMyRunningOps("12.23.32.21")

(1) 安装Shadowsocks和Chrome



brew install shadowsocks-libev
brew cask install google-chrome 

(2) 安装Chrome插件Proxy SwitchySharp



https://chrome.google.com/webstore/detail/proxy-switchysharp/dpplabbmogkhghncfbfdeeokoefdjegm 

(3) 配置



emacs /usr/local/etc/shadowsocks-libev.json

修改下面的配置
 { "server":"", "server_port":, "local_port":, "password":"", "timeout":600, "method":"aes-256-cfb" }

服务器请到https://get发邮件获取,配置完成后是如下:
 { "server":"hongxchen.github.io", "server_port":1080, "local_port":8104, "password":"abc", "timeout":600, "method":"aes-256-cfb" }
 注意:method字段一定要小写 

(4) 配置Proxy SwitchySharp



1. 添加新的的配置New Profile 2. Profile Name:Shadowsocks 3. 选择Manual Configuration 4. 在SOCKS Host中填入127.0.0.1和shadowsocks-libev.json中设置的local_port,如8104。HTTP Proxy,HTTPS Proxy,FTP Proxy空着不填。 5. 选择SOCKS v5 6. 切换到 Switch Rules 7. 勾选Enable Switch Rules 8. 勾选Online Rule List,在Rule List URL中填入**list.googlecode.com/svn/trunk/**list.txt,Proxy Profile选择Shadowsocks 9. 勾选AutoProxy Compatible List 

(5) 测试



终端执行
/usr/local/opt/shadowsocks-libev/bin/ss-local -c /usr/local/etc/shadowsocks-libev.json

打开Chrome,Proxy SwitchySharp选择Auto Switch Mode
打开www.youtube.com等被墙网站,如果不能打开则https://get发邮件获取其他服务的的配置 

(6) 开机启动



Ctrl+C关闭在终端中打开执行的ss-local

制作/usr/local/opt/shadowsocks-libev/homebrew.mxcl.shadowsocks-libev.plist文件的软连接到~/Library/LaunchAgents
% ln -s /usr/local/opt/shadowsocks-libev/homebrew.mxcl.shadowsocks-libev.plist ~/Library/LaunchAgents/homebrew.mxcl.shadowsocks-libev.plist 

(7) 加载配置文件



launchctl load ~/Library/LaunchAgents/homebrew.mxcl.shadowsocks-libev.plist ** 卸载为launchctl unload ~/Library/LaunchAgents/homebrew.mxcl.shadowsocks-libev.plist 

(8) 完成



到此配置完成,以后开机打开Chrome就能够翻出墙外,.shadowsocks.net/get提供的服务器在一段时间后可能不能连接,只需关闭服务在shadowsocks-libev.json文件中写入新的配置项,重新启动服务就行了。

launchctl unload ~/Library/LaunchAgents/homebrew.mxcl.shadowsocks-libev.plist emacs /usr/local/etc/shadowsocks-libev.json launchctl load ~/Library/LaunchAgents/homebrew.mxcl.shadowsocks-libev.plist 

转:

好久没更新自己博客了,今天正好给同事们写一篇sublime 如何配置php code sniffer,发现国内还没有一个比较完善的教程,所以把它放到网上。

一、windows PHPSTORM 配置php code sniffer插件。

二、MAC OS PHPSTORM 配置php code sniffer插件。

三、MAC OS Sublime 3 配置php code sniffer插件。

一、windows PHPSTORM 配置php code sniffer插件。


1. 点击菜单:File->Settings 或 按快捷键 Ctrl+Alt+S

2. 选择Project Settings下的:PHP->Code Sniffer

3. 设置PHP Code Sniffer(phpcs) path为:E:\wamp\bin\pear\phpcs.bat
(根据自己电脑情况设置)

4. 点击Validate按钮,可以看到如下提示,说明设置OK

为知笔记图片

5. 选择Project Settings下的Inspections,展开PHP,勾选PHP Code Sniffer validation

为知笔记图片

6. 第一次打开的时候,需要点击一下刷新的按钮可以获取已安装的代码规范,如果无法获取到代码规范的话,先执行 phpcs -i
命令查看PHP_CodeSniffer中已经安装的编码风格,确定有之后,尝试重启一下PhpStorm在刷新看看

7. 选择一个你习惯的编码风格,然后Apply配置

为知笔记图片

8. 打开一个PHP文件,就可以看到不符合规则的提示

为知笔记图片

二、MAC OS PHPSTORM 配置php code sniffer插件。


  1. 设置PHP Code Sniffer(phpcs) path为:/usr/local/bin/phpcs

2. 点击Validate按钮,可以看到如下提示,说明设置OK

为知笔记图片

3.启用代码风格


为知笔记图片

4.演示效果


为知笔记图片

三、MAC OS Sublime 3 配置php code sniffer插件。


1.系统安装PHP_CodeSniffer、phpmd、php-cs-fixer




pear install PHP_CodeSniffer


brew install phpmd


sudo curl  -o /usr/local/bin/php-cs-fixer
sudo chmod a+x /usr/local/bin/php-cs-fixer


2.sublime 2 安装 phpcs插件(安装方法(Ctrl+Shift+P->pi(package
install)->phpcs,安装成功后右键即可看到PHP Code Sniffer选项))


为知笔记图片

3.刚刚安装好的插件,sniff this file 显示的是灰色的,修改下配置文件(这是 Sublime 2的配置) Sublime3
的配置有所区别,请自行检查。






    
    
  1. 
        
        


            {
        



    


    
  2. 
        
        


                // *nix based systems, Mac OS X and Linux
        



    


    
  3. 
        
        


                // - All commands on and using PATHS
        



    


    
  4. 
        
        


            
        



    


    
  5. 
        
        


                // We want debugging on
        



    


    
  6. 
        
        


                "show_debug": true,
        



    


    
  7. 
        
        


            
        



    


    
  8. 
        
        


                // Only execute for .php files
        



    


    
  9. 
        
        


                "extensions_to_execute": ["php"],
        



    


    
  10. 
        
        


            
        



    


    
  11. 
        
        


                // Do not execute for twig files
        



    


    
  12. 
        
        


                "extensions_to_blacklist": ["twig.php"],
        



    


    
  13. 
        
        


            
        



    


    
  14. 
        
        


                // Execute the sniffer on file save
        



    


    
  15. 
        
        


                "phpcs_execute_on_save": false,
        



    


    
  16. 
        
        


            
        



    


    
  17. 
        
        


                // Show the error list after save.
        



    


    
  18. 
        
        


                "phpcs_show_errors_on_save": true,
        



    


    
  19. 
        
        


            
        



    


    
  20. 
        
        


                // Show the errors in the gutter
        



    


    
  21. 
        
        


                "phpcs_show_gutter_marks": true,
        



    


    
  22. 
        
        


            
        



    


    
  23. 
        
        


                // Show outline for errors
        



    


    
  24. 
        
        


                "phpcs_outline_for_errors": true,
        



    


    
  25. 
        
        


            
        



    


    
  26. 
        
        


                // Show the errors in the status bar
        



    


    
  27. 
        
        


                "phpcs_show_errors_in_status": true,
        



    


    
  28. 
        
        


            
        



    


    
  29. 
        
        


                // Show the errors in the quick panel so you can then goto line
        



    


    
  30. 
        
        


                "phpcs_show_quick_panel": true,
        



    


    
  31. 
        
        


            
        



    


    
  32. 
        
        


            
        



    


    
  33. 
        
        


                // PHP_CodeSniffer settings
        



    


    
  34. 
        
        


                // Run the PHP_CodeSniffer
        



    


    
  35. 
        
        


                "phpcs_sniffer_run": true,
        



    


    
  36. 
        
        


            
        



    


    
  37. 
        
        


                // Execute PHP_CodeSniffer on save
        



    


    
  38. 
        
        


                "phpcs_command_on_save": true,
        



    


    
  39. 
        
        


            
        



    


    
  40. 
        
        


                // Path to phpcs
        



    


    
  41. 
        
        


                "phpcs_executable_path": "/usr/local/bin/phpcs",
        



    


    
  42. 
        
        


            
        



    


    
  43. 
        
        


                // Run the PEAR standard without warnings
        



    


    
  44. 
        
        


                "phpcs_additional_args": {
        



    


    
  45. 
        
        


                    "--standard": "PEAR",
        



    


    
  46. 
        
        


                    "-n": ""
        



    


    
  47. 
        
        


                },
        



    


    
  48. 
        
        


            
        



    


    
  49. 
        
        


            
        



    


    
  50. 
        
        


                // PHP-CS-Fixer settings
        



    


    
  51. 
        
        


                // Do not automatically fix the errors
        



    


    
  52. 
        
        


                "php_cs_fixer_on_save": false,
        



    


    
  53. 
        
        


            
        



    


    
  54. 
        
        


                // Show the fixes in the quick panel
        



    


    
  55. 
        
        


                "php_cs_fixer_show_quick_panel": true,
        



    


    
  56. 
        
        


            
        



    


    
  57. 
        
        


                // Path to where php-cs-fixer.phar is
        



    


    
  58. 
        
        


                "php_cs_fixer_executable_path": "/usr/local/bin/php-cs-fixer",
        



    


    
  59. 
        
        


            
        



    


    
  60. 
        
        


                // Run all levels of fixing
        



    


    
  61. 
        
        


                "php_cs_fixer_additional_args": {
        



    


    
  62. 
        
        


                },
        



    


    
  63. 
        
        


            
        



    


    
  64. 
        
        


            
        



    


    
  65. 
        
        


                // PHP Linter settings
        



    


    
  66. 
        
        


                // Lint each file
        



    


    
  67. 
        
        


                "phpcs_linter_run": true,
        



    


    
  68. 
        
        


            
        



    


    
  69. 
        
        


                // Execute the linter on save
        



    


    
  70. 
        
        


                "phpcs_linter_command_on_save": true,
        



    


    
  71. 
        
        


            
        



    


    
  72. 
        
        


                // Use the $PATH version of php
        



    


    
  73. 
        
        


                "phpcs_php_path": "/usr/local/bin/phpcs",
        



    


    
  74. 
        
        


            
        



    


    
  75. 
        
        


                // Regex for the errors the linter produces
        



    


    
  76. 
        
        


                "phpcs_linter_regex": "(?P.*) on line (?P\d+)",
        



    


    
  77. 
        
        


            
        



    


    
  78. 
        
        


            
        



    


    
  79. 
        
        


                // PHP Mess Detector settings
        



    


    
  80. 
        
        


                // Execute phpmd
        



    


    
  81. 
        
        


                "phpmd_run": true,
        



    


    
  82. 
        
        


            
        



    


    
  83. 
        
        


                // Execute the phpmd on file save
        



    


    
  84. 
        
        


                "phpmd_command_on_save": true,
        



    


    
  85. 
        
        


            
        



    


    
  86. 
        
        


                // Path to where the phpmd application is
        



    


    
  87. 
        
        


                "phpmd_executable_path": "/usr/local/bin/phpmd",
        



    


    
  88. 
        
        


            
        



    


    
  89. 
        
        


                // What args I want to pass to phpmd
        



    


    
  90. 
        
        


                "phpmd_additional_args": {
        



    


    
  91. 
        
        


                    "codesize,unusedcode,naming": ""
        



    


    
  92. 
        
        


                },
        



    


    
  93. 
        
        


            
        



    


    
  94. 
        
        


                // PHP Scheck settings
        



    


    
  95. 
        
        


                // Execute scheck
        



    


    
  96. 
        
        


                "scheck_run": false,
        



    


    
  97. 
        
        


            
        



    


    
  98. 
        
        


                // Execute the scheck on file save
        



    


    
  99. 
        
        


                "scheck_command_on_save": false,
        



    


    
  100. 
        
        


            
        



    


    
  101. 
        
        


                // It seems python/sublime cannot always find the scheck application
        



    


    
  102. 
        
        


                // If empty, then use PATH version of scheck, else use the set value
        



    


    
  103. 
        
        


                "scheck_executable_path": "",
        



    


    
  104. 
        
        


            
        



    


    
  105. 
        
        


                // Additional arguments you can specify into the application
        



    


    
  106. 
        
        


                "scheck_additional_args": {
        



    


    
  107. 
        
        


                    "-strict" : ""
        



    


    
  108. 
        
        


                }
        



    


    
  109. 
        
        


            }
        



    







4.完成


为知笔记图片

PS:如submit 出现报错,可显示调试信息调试具体问题 Ctrl+~;如再有问题,可联系我。
为知笔记图片

本教程演示如何使用向量检索服务(DashVector),结合上的[Embedding
API](https://help.aliyun.com/zh/dashscope/developer-reference/api-
details-15),来从0到1构建基于文本索引的构建+向量检索基础上的语义搜索能力。具体来说,我们将基于QQ 浏览器搜索标题语料库(:QQ
Browser Query Title Corpus)进行实时的文本语义搜索,查询{BANNED}{BANNED}最佳佳相似的相关标题。

什么是 Embedding

简单来说,Embedding是一个多维向量的表示数组,通常由一系列数字组成。Embedding可以用来表示任何数据,例如文本、音频、图片、视频等等,通过Embedding我们可以编码各种类型的非结构化数据,转化为具有语义信息的多维向量,并在这些向量上进行各种操作,例如相似度计算、聚类、分类和推荐等。

整体流程概述

70038568_1716522503fm4s.png

  • Embedding:通过DashScope提供的通用文本向量模型,对语料库中所有标题生成对应的embedding向量。
  • 构建索引服务和查询:

    • 通过DashVector向量检索服务对生成embedding向量构建索引。
    • 将查询文本embedding向量作为输入,通过DashVector搜索相似的标题。

具体操作流程

前提条件

1、环境安装

说明

需要提前安装 Python3.7 及以上版本,请确保相应的 python 版本。



pip3 install dashvector dashscope





2、数据准备

(QBQTC, QQ Browser Query Title Corpus),是QQ浏览器搜索引擎目前针对大搜场景构建的一个融合了相关性、权威性、内容质量、
时效性等维度标注的学习排序(LTR)数据集,广泛应用在搜索引擎业务场景中。作为CLUE-beanchmark的一部分,QBQTC
数据集可以直接从github上下载(训练集路径为dataset/train.json)。



git clone https://github.com/CLUEbenchmark/QBQTC.git
wc-l QBQTC/dataset/train.json




数据集中的训练集(train.json)其格式为 json:



{
"id":0,
"query":"小孩咳嗽感冒",
"title":"小孩感冒过后久咳嗽该吃什么药育儿问答宝宝树",
"label":"1"
}

我们将从这个数据集中提取title,方便后续进行embedding并构建检索服务。



import json

def prepare_data(path,size):
with open(path,'r',encoding='utf-8')as f:
batch_docs=[]
forlineinf:
batch_docs.append(json.loads(line.strip()))
iflen(batch_docs)==size:
yield batch_docs[:]
batch_docs.clear()

ifbatch_docs:
yield batch_docs




3、通过 DashScope 生成 Embedding 向量

DashScope灵积模型服务通过标准的API提供了多种模型服务。其中支持文本Embedding的模型中文名为通用文本向量,英文名为text-
embedding-v1。我们可以方便的通过DashScope API调用来获得一段输入文本的embedding向量。

说明

需要使用您的api-key替换示例中的 your-dashscope-api-key ,代码才能正常运行。



import dashscope
from dashscope import TextEmbedding

dashscope.api_key='{your-dashscope-api-key}'


def generate_embeddings(text):
rsp=TextEmbedding.call(model=TextEmbedding.Models.text_embedding_v1,
input=text)

embeddings=[record['embedding']forrecordinrsp.output['embeddings']]
return embeddingsifisinstance(text,list)elseembeddings[0]


# 查看下embedding向量的维数,后面使用 DashVector 检索服务时会用到,目前是1536
print(len(generate_embeddings('hello')))


4、通过 DashVector 构建检索:向量入库

DashVector
向量检索服务上的数据以集合(Collection)为单位存储,写入向量之前,我们首先需要先创建一个集合来管理数据集。创建集合的时候,需要指定向量维度,这里的每一个输入文本经过DashScope上的text_embedding_v1模型产生的向量,维度统一均为1536。

DashVector 除了提供向量检索服务外,还提供倒排过滤功能 和 scheme free
功能。所以我们为了演示方便,可以写入数据时,可以将title内容写入 DashVector 以便召回。写入数据还需要指定 id,我们可以直接使用 QBQTC
中id。

说明

需要使用您的api-key替换示例中的 your-dashvector-api-key ,以及您的Cluster Endpoint替换示例中的
your-dashvector-cluster-endpoint ,代码才能正常运行。



from dashvector import Client,Doc


# 初始化 DashVector client
client=Client(
api_key='{your-dashvector-api-key}',
endpoint='{your-dashvector-cluster-endpoint}'
)

# 指定集合名称和向量维度
rsp=client.create('sample',1536)
assert rsp

collection=client.get('sample')
assert collection

batch_size=10
fordocsinlist(prepare_data('QBQTC/dataset/train.json',batch_size)):
# 批量 embedding
embeddings=generate_embeddings([doc['title']fordocindocs])

# 批量写入数据
rsp=collection.insert(
[
Doc(id=str(doc['id']),vector=embedding,fields={"title":doc['title']})
fordoc,embeddinginzip(docs,embeddings)
]
)
assert rsp


5、语义检索:向量查询

在把QBQTC训练数据集里的title内容都写到DashVector服务上的集合里后,就可以进行快速的向量检索,实现“语义搜索”的能力。继续上面代码的例子,假如我们要搜索有多少和'应届生
招聘'相关的title内容,可以通过在DashVector上去查询'应届生 招聘',即可迅速获取与该查询语义相近的内容,以及对应内容与输入之间的相似指数。



# 基于向量检索的语义搜索
rsp=collection.query(generate_embeddings('应届生 招聘'),output_fields=['title'])

fordocinrsp.output:
print(f"id: {doc.id}, title: {doc.fields['title']}, score: {doc.score}")





id:0,title:实习生招聘-应届生求职网,score:2523.1582
id:6848,title:应届生求职网校园招聘yingjieshengcom中国领先的大学生求职网站,score:3053.7095
id:8935,title:北京招聘求职-前程无忧,score:5100.5684
id:5575,title:百度招聘实习生北京实习招聘,score:5451.4155
id:6500,title:中公教育招聘信息网-招聘岗位-近期职位信息-中公教育网,score:5656.128
id:7491,title:张家口招聘求职-前程无忧,score:5834.459
id:7520,title:前程无忧网北京前程无忧网招聘,score:5874.412
id:3214,title:乡镇卫生院招聘招聘乡镇卫生院招聘信息+-58同城,score:6005.207
id:6507,title:赶集网招聘实习生北京实习招聘,score:6424.9927
id:5431,title:实习内容安排百度文库,score:6505.735

后台统计,有个表,有60个字段要显示。这时如果页面一次性全部展示出来,大部分屏幕可能不够宽度。

这时就需要固定表格列,但如果只是固定列,太多列了还是比较难查看自己需要的列,这时比较优的方案是,每个账号可以选择显示哪些列显示隐藏。

http://www.layui.com/demo/table/fixed.html

固定表格列

前端实现固定表格列,有很多插件框架实现,这里主要讲下,配合后端实现整个交互逻辑。

相关技术点

  1. 固定表格列
  2. 字段选择穿梭框
  3. 数据库保存隐藏字段

固定表格列,这里用插件layui

http://www.layui.com/demo/table/fixed.html

字段选择穿梭框,使用 bootstrap的双边栏选择框

http://www.jq22.com/jquery-info15984
image.png

数据库保存隐藏字段,这个搭建用任何后端语言都可以实现,这里用PHP。

代码,穿梭框与后端实现交互

function getData(){
       return new Promise(function(resolve, reject){
    $.getJSON('/admin/ad/getField', {}, function (res) {
        field = res.tableFile
        console.log(res);
        resolve(res);
        //reject(
    })
    });
}



getData().then(function(res){
field = res.tableFile
$(document).ready(function () {
var demo2 = $('.demo').doublebox({
nonSelectedListLabel: '显示列',
selectedListLabel: '隐藏列',
preserveSelectionOnMove: 'moved',
moveOnSelect: false,
nonSelectedList: res.show,
selectedList: res.hide,
optionValue: "field",
optionText: "fieldName",
doubleMove: true,
});

layui.use('table', function () {
var table = layui.table;
var w = document.body.scrollWidth - 50;
var h = document.body.scrollHeight - 390;
table.render({
    elem: '#test',
    limit: 10
    , url: '/admin/ad/getData?Ad[type]='+<?php echo isset($_GET['Ad']['type'])?intval($_GET['Ad']['type']):1 ?>
    , width: w
    , height: h
    , cols: [field]
    , page: true
});
});

})

});     

后台API返回对应的显示列,即可,格式如下


{
    "show":[
        {
            "field":"date",
            "fieldName":"时间"
        },
        {
            "field":"clientName",
            "fieldName":"广告主名称"
        },
        {
            "field":"adId",
            "fieldName":"广告id"
        },
        {
            "field":"adName",
            "fieldName":"广告名称"
        },
        {
            "field":"order_roi",
            "fieldName":"下单ROI"
        },
        {
            "field":"quest_reservation_pv",
            "fieldName":"销售线索量"
        }
    ],
    "hide":[
        {
            "field":"contract_flag",
            "fieldName":"购买类型"
        },
        {
            "field":"pos_type",
            "fieldName":"广告位"
        },
        {
            "field":"convclk_pv",
            "fieldName":"可转化点击次数"
        },
        {
            "field":"convclk_cpc",
            "fieldName":"可转化点击成本"
        },
        {
            "field":"clk_pv",
            "fieldName":"点击人数"
        },
        {
            "field":"exp_pv_avg",
            "fieldName":"人均曝光次数"
        },
        {
            "field":"img_uv",
            "fieldName":"图片点击人数"
        },
        {
            "field":"play_pv",
            "fieldName":"视频点击次数"
        },
        {
            "field":"play_uv",
            "fieldName":"视频点击人数"
        },
        {
            "field":"detail_pv",
            "fieldName":"文字链点击次数"
        },
        {
            "field":"ios_act_pv",
            "fieldName":"IOS激活次数"
        },
        {
            "field":"download_complete_pv",
            "fieldName":"APP下载完成次数"
        },
        {
            "field":"install_complete_pv",
            "fieldName":"APP安装完成次数"
        },
        {
            "field":"app_act_pv",
            "fieldName":"APP激活次数"
        },
        {
            "field":"app_reg_pv",
            "fieldName":"APP注册次数"
        },
        {
            "field":"app_addtocart_pv",
            "fieldName":"APP加入购物车次数"
        },
        {
            "field":"app_purchase_pv",
            "fieldName":"APP付费次数"
        },
        {
            "field":"card_use_pv",
            "fieldName":"卡券使用次数"
        },
        {
            "field":"share_page_pv",
            "fieldName":"广告分享次数"
        },
        {
            "field":"share_page_uv",
            "fieldName":"广告分享人数"
        },
        {
            "field":"nointerest_pv",
            "fieldName":"不感兴趣点击次数"
        }
    ],
    "tableFile":[
        {
            "field":"date",
            "width":140,
            "title":"时间",
            "fixed":"left"
        },
        {
            "field":"clientName",
            "width":140,
            "title":"广告主名称",
            "fixed":"left"
        },
        {
            "field":"adId",
            "width":100,
            "title":"广告id",
            "fixed":"left"
        },
        {
            "field":"adName",
            "width":140,
            "title":"广告名称",
            "fixed":"left"
        },
        {
            "field":"balance",
            "width":140,
            "title":"余额",
            "fixed":"left"
        },
        {
            "field":"quest_reservation_pv",
            "width":100,
            "title":"销售线索量"
        }
    ]
}

最终演示效果
QQ20180626-170547.gif