layui.use(['table', 'form', 'layer'], function(){ var table = layui.table; var form = layui.form; var layer = layui.layer; var $ = layui.$; // 加载设备型号列表 fetch('/api/devices/models', { credentials: 'include' }) .then(response => response.json()) .then(result => { if(result.data) { var options = ''; result.data.forEach(function(model) { options += ''; }); $('select[name=device_model]').html(options); form.render('select'); } }); // 初始化表格 table.render({ elem: '#device-table', url: '/api/devices/registered', // 已注册设备列表接口 headers: undefined, toolbar: '#tableToolbar', defaultToolbar: ['filter', 'exports', 'print'], cols: [[ {type: 'checkbox'}, {field: 'uid', title: '设备UID', width: 180}, {field: 'device_model', title: '设备型号', width: 120}, {field: 'license_code', title: '授权码', width: 180}, {field: 'license_type', title: '授权类型', width: 100, templet: function(d){ var types = { 'time': '时间授权', 'count': '次数授权', 'permanent': '永久授权' }; return types[d.license_type] || '-'; }}, {field: 'expire_time', title: '过期时间', width: 160, templet: function(d){ return d.expire_time ? new Date(d.expire_time).toLocaleString() : '-'; }}, {field: 'start_count', title: '启动次数', width: 100}, {field: 'status', title: '状态', width: 100, templet: function(d){ if(d.status === 'active') return '正常'; if(d.status === 'expired') return '已过期'; return '未激活'; }}, {field: 'last_active_at', title: '最后活跃', width: 160, templet: function(d){ return d.last_active_at ? new Date(d.last_active_at).toLocaleString() : '-'; }}, {fixed: 'right', title: '操作', toolbar: '#tableRowBar', width: 250} ]], page: true, parseData: function(res) { if (res.code === 401) { window.location.href = '/login'; return; } return res; } }); // 表格工具栏事件 table.on('toolbar(device-table)', function(obj){ switch(obj.event){ case 'refresh': table.reload('device-table'); break; } }); // 行工具栏事件 table.on('tool(device-table)', function(obj){ var data = obj.data; switch(obj.event){ case 'view': layer.open({ type: 1, title: '设备详情', area: ['600px', '500px'], content: laytpl($('#deviceDetailTpl').html()).render(data) }); break; case 'bind': layer.prompt({ formType: 0, value: '', title: '请输入授权码', area: ['300px', '150px'] }, function(value, index, elem){ // 绑定授权码 fetch('/api/devices/' + data.uid + '/license', { method: 'POST', headers: { 'Content-Type': 'application/json' }, credentials: 'include', body: JSON.stringify({ license_code: value }) }) .then(response => response.json()) .then(result => { if(result.error) { layer.msg(result.error); return; } layer.msg('绑定成功'); table.reload('device-table'); layer.close(index); }) .catch(error => { layer.msg('绑定失败:' + error.message); }); }); break; case 'logs': layer.open({ type: 2, title: '设备日志', area: ['800px', '600px'], content: '/admin/device-logs?uid=' + data.uid }); break; case 'revoke': layer.confirm('确定要撤销该设备的授权吗?', function(index){ fetch('/api/devices/' + data.uid + '/license', { method: 'DELETE', credentials: 'include' }) .then(response => response.json()) .then(result => { if(result.error) { layer.msg(result.error); return; } layer.msg('撤销成功'); table.reload('device-table'); }) .catch(error => { layer.msg('撤销失败:' + error.message); }); layer.close(index); }); break; } }); // 搜索表单提交 form.on('submit(search)', function(data){ table.reload('device-table', { where: data.field, page: { curr: 1 } }); return false; }); // 导出设备列表 $('#export-devices').on('click', function(){ var checkStatus = table.checkStatus('device-table'); var data = checkStatus.data; if(data.length === 0){ layer.msg('请选择要导出的设备'); return; } // 创建CSV内容 var csv = '设备UID,设备型号,授权码,授权类型,过期时间,启动次数,状态,最后活跃\n'; data.forEach(function(item){ csv += [ item.uid, item.device_model, item.license_code || '', item.license_type || '', item.expire_time ? new Date(item.expire_time).toLocaleString() : '', item.start_count, item.status, item.last_active_at ? new Date(item.last_active_at).toLocaleString() : '' ].join(',') + '\n'; }); // 下载文件 var blob = new Blob([csv], { type: 'text/csv;charset=utf-8;' }); var link = document.createElement("a"); if (link.download !== undefined) { var url = URL.createObjectURL(blob); link.setAttribute("href", url); link.setAttribute("download", "devices.csv"); link.style.visibility = 'hidden'; document.body.appendChild(link); link.click(); document.body.removeChild(link); } }); });