mirror of
https://gitee.com/ulthon/ulthon_admin.git
synced 2026-09-05 07:15:31 +08:00
feat(admin): XHProf 采样列表页
- curd -t ul_xhprof_run 生成三件套(控制器 xhprof.run 子目录形态,model docblock 随生成刷新) - 只读化:toolbar 清空 + 行内仅详情按钮(open 弹层 xhprof.run/detail?id=N,auth=detail), add/edit/delete 等 action 保留靠权限节点不分配拦截(T8 对齐) - 列渲染:wall_time/cpu_time μs→ms(>1000ms 红色)、memory_peak 字节→MB、 url 截断 title 全显、method 标签化、request_time 浮点秒→日期时间 - 四组搜索:url like / request_time range / wall_time 下限(前端 ms,后端换算 μs, withGet 全量合并写回)/ node_id 下拉(DISTINCT + data_brage 通道) - 生成前 scheme:sync 修复 request_time 的 null/comment 漂移(T3 手工 ALTER 遗留)
This commit is contained in:
92
app/admin/view/xhprof/run/index.js
Normal file
92
app/admin/view/xhprof/run/index.js
Normal file
@@ -0,0 +1,92 @@
|
||||
$(function () {
|
||||
// request_time 为浮点秒(decimal(13,3)),渲染为日期时间
|
||||
var formatRequestTime = function (d) {
|
||||
var t = parseFloat(d.request_time);
|
||||
if (!t || isNaN(t)) {
|
||||
return '-';
|
||||
}
|
||||
var dt = new Date(t * 1000);
|
||||
var p = function (n) {
|
||||
return n < 10 ? '0' + n : '' + n;
|
||||
};
|
||||
return dt.getFullYear() + '-' + p(dt.getMonth() + 1) + '-' + p(dt.getDate())
|
||||
+ ' ' + p(dt.getHours()) + ':' + p(dt.getMinutes()) + ':' + p(dt.getSeconds());
|
||||
};
|
||||
|
||||
ua.table.render({
|
||||
init: init,
|
||||
toolbar: [],
|
||||
defaultToolbar: ['filter'],
|
||||
cols: [[
|
||||
{field: 'request_time', title: '请求时间', width: 170, sort: true, search: 'range', templet: formatRequestTime},
|
||||
{
|
||||
field: 'method', title: '方法', width: 90, search: 'select', selectList: {
|
||||
GET: 'GET', POST: 'POST', PUT: 'PUT', DELETE: 'DELETE', HEAD: 'HEAD', OPTIONS: 'OPTIONS', PATCH: 'PATCH'
|
||||
}, templet: function (d) {
|
||||
var cls = {
|
||||
GET: 'layui-bg-blue',
|
||||
POST: 'layui-bg-green',
|
||||
PUT: 'layui-bg-orange',
|
||||
DELETE: 'layui-bg-red',
|
||||
HEAD: 'layui-bg-gray',
|
||||
OPTIONS: 'layui-bg-gray',
|
||||
PATCH: 'layui-bg-cyan'
|
||||
}[d.method];
|
||||
if (d.method && cls) {
|
||||
return '<span class="layui-badge ' + cls + '">' + d.method + '</span>';
|
||||
}
|
||||
return d.method || '-';
|
||||
}
|
||||
},
|
||||
{
|
||||
field: 'url', title: 'URL', minWidth: 220, searchOp: '%*%', templet: function (d) {
|
||||
var u = d.url || '';
|
||||
var short = u.length > 50 ? u.substring(0, 50) + '…' : u;
|
||||
return '<span title="' + u.replace(/"/g, '"') + '">' + (short === '' ? '/' : short) + '</span>';
|
||||
}
|
||||
},
|
||||
{field: 'node_id', title: '节点', width: 160, search: 'select', searchOp: '=', selectList: ua.getDataBrage('select_list_node_id') || {}},
|
||||
{
|
||||
field: 'wall_time', title: '总耗时', width: 110, sort: true, searchOp: 'min', searchTip: '总耗时下限(ms)', templet: function (d) {
|
||||
var ms = parseInt(d.wall_time, 10) / 1000;
|
||||
var txt = ms.toFixed(1) + 'ms';
|
||||
if (ms > 1000) {
|
||||
return '<span class="layui-badge layui-bg-red">' + txt + '</span>';
|
||||
}
|
||||
return txt;
|
||||
}
|
||||
},
|
||||
{
|
||||
field: 'cpu_time', title: 'CPU耗时', width: 110, search: false, templet: function (d) {
|
||||
var ms = parseInt(d.cpu_time, 10) / 1000;
|
||||
var txt = ms.toFixed(1) + 'ms';
|
||||
if (ms > 1000) {
|
||||
return '<span class="layui-badge layui-bg-red">' + txt + '</span>';
|
||||
}
|
||||
return txt;
|
||||
}
|
||||
},
|
||||
{
|
||||
field: 'memory_peak', title: '内存峰值', width: 110, sort: true, search: false, templet: function (d) {
|
||||
return (parseInt(d.memory_peak, 10) / 1048576).toFixed(2) + 'MB';
|
||||
}
|
||||
},
|
||||
{
|
||||
width: 100, title: '操作', fixed: 'right', templet: ua.table.tool, operat: [
|
||||
[{
|
||||
class: 'layui-btn layui-btn-primary layui-btn-xs',
|
||||
method: 'open',
|
||||
field: 'id',
|
||||
text: '详情',
|
||||
title: '采样详情(函数级分析)',
|
||||
auth: 'detail',
|
||||
url: init.detailUrl,
|
||||
extend: 'data-full="true"'
|
||||
}]
|
||||
]
|
||||
}
|
||||
]]
|
||||
});
|
||||
|
||||
ua.listen();
|
||||
});
|
||||
Reference in New Issue
Block a user