Files

560 lines
17 KiB
JavaScript
Raw Permalink Normal View History

class FaceLibManager {
constructor() {
this.page = 1;
this.size = 10;
this.group_id = '';
this.groupData = [];
this.data = [];
this.isEditing = false;
this.currentEditId = null;
this.table = null;
this.init();
}
async init() {
this.initLayui();
this.bindEvents();
await this.getGroupData();
this.getTableData();
}
// 初始化Layui
initLayui() {
layui.use(['table', 'layer', 'form'], () => {
const table = layui.table;
const layer = layui.layer;
const form = layui.form;
// 初始化表格
this.table = table.render({
elem: '#dataTable',
data: this.data,
cols: [[
// { field: 'id', title: 'ID', width: 80, sort: true },
{ field: 'external_id', title: '外部ID', width: 150 },
{ field: 'name', title: '姓名', width: 150 },
{ field: 'image', title: '人脸图片', width: 150, templet: '#image' },
{ field: 'age', width: 100, title: '年龄', },
{ field: 'desc', title: '简介' },
{ field: 'update_time', width: 100, title: '更新时间', },
{ title: '操作', width: 200, toolbar: '#operationBar', fixed: 'right' }
]],
page: true,
limit: 10,
limits: [10, 20, 50],
height: 'full-220',
text: {
none: '暂无数据'
}
});
// 监听工具条事件
table.on('tool(dataTable)', (obj) => {
const data = obj.data;
if (obj.event === 'edit') {
this.editFaceModal(data, 'edit');
} else if (obj.event === 'del') {
this.deleteData(data.id);
}
});
});
}
getGroupData() {
return new Promise((resolve, reject) => {
faceLibApis.getGrpup().then(res => {
this.groupData = res.data.map(item => {
item.ext = JSON.parse(item.ext);
item.quality = item.ext.quality;
return item
});
if (this.groupData.length > 0) {
this.group_id = this.groupData[0].id;
resolve()
}
let el = document.querySelector("#group-container");
let innerHTML = ''
for (let i = 0; i < this.groupData.length; i++) {
if (i == 0) {
innerHTML += `<li class="group active" id="${this.groupData[i].id}">
${this.groupData[i].name}
<i class="layui-icon layui-icon-edit" editId="${this.groupData[i].id}"></i>
<i class="layui-icon layui-icon-delete" delId="${this.groupData[i].id}"></i>
</li>`;
} else {
innerHTML += `<li class="group" id="${this.groupData[i].id}">
${this.groupData[i].name}
<i class="layui-icon layui-icon-edit" editId="${this.groupData[i].id}"></i>
<i class="layui-icon layui-icon-delete" delId="${this.groupData[i].id}"></i>
</li>`;
}
}
el.innerHTML = innerHTML;
let editBtns = document.querySelectorAll("#group-container .layui-icon-edit");
editBtns.forEach(editBtn => {
editBtn.addEventListener('click', (e) => {
let group_id = e.target.getAttribute("editId");
this.editGroupModal(this.groupData.find(item => item.id == group_id), "edit")
})
})
let delBtns = document.querySelectorAll("#group-container .layui-icon-delete");
delBtns.forEach(delBtn => {
delBtn.addEventListener('click', (e) => {
let group_id = e.target.getAttribute("delId");
faceLibApis.delGroup({ ids: [group_id] }).then(res => {
this.getGroupData();
this.showNotification('数据更新成功!');
})
})
})
})
})
}
getTableData() {
faceLibApis.getFaceList({
page: this.page,
size: this.size,
group_id: this.group_id
}).then(res => {
this.data = res.data.data.map(item => {
// item.image = ZQLGLOBAL.serverIp + ':9092/staticdata' + item.image;
item.image = `http://${ZQLGLOBAL.serverIp}:9092/staticdata${item.image}`
return item
});
if (this.table) {
layui.use('table', () => {
layui.table.reload('dataTable', {
data: this.data
});
});
}
})
}
// 绑定事件
bindEvents() {
// 添加按钮事件
document.getElementById('addGroup').addEventListener('click', () => {
this.editGroupModal({
name: '',
quality: 0.35,
}, 'add');
});
document.getElementById('addBtn').addEventListener('click', () => {
this.editFaceModal({
name: '',
age: '',
sex: '',
desc: '',
external_id: '',
feature: '',
}, 'add');
});
// 搜索功能
document.getElementById('searchBtn').addEventListener('click', () => {
this.getTableData();
});
}
// 编辑分组
editGroupModal(data, type) {
layui.use(['layer', 'form'], () => {
const layer = layui.layer;
const form = layui.form;
layer.open({
type: 1,
title: type == 'add' ? '添加分组' : '编辑分组',
area: ['40vw', '40vh'],
content: `
<form class="layui-form" lay-filter="dataForm" style="padding: 20px;">
<input type="hidden" name="id" value="${data.id}">
<div class="layui-form-item">
<label class="layui-form-label">分组名称</label>
<div class="layui-input-block">
<input type="text" name="name" value="${data.name}" required lay-verify="required" placeholder="请输入描述" autocomplete="off" class="layui-input">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">人脸质量</label>
<div class="layui-input-block">
<input type="text" name="quality" value="${data.quality}" required lay-verify="required" placeholder="请输入描述" autocomplete="off" class="layui-input">
</div>
</div>
<div class="layui-form-item">
<div class="layui-input-block">
<button class="layui-btn" lay-submit lay-filter="saveData">保存</button>
</div>
</div>
</form>
`,
success: () => {
form.render();
// 监听表单提交
form.on('submit(saveData)', (formData) => {
if (type == 'add') {
faceLibApis.addGroup({
alg: 'face',
ext: { quality: formData.field.quality },
name: formData.field.name
}).then(res => {
this.getGroupData();
// 关闭模态框
layui.use('layer', () => {
layui.layer.closeAll();
});
this.showNotification('数据更新成功!');
})
} else {
faceLibApis.editGroup({
id: data.id,
alg: 'face',
ext: { quality: formData.field.quality },
name: formData.field.name
}).then(res => {
this.getGroupData();
// 关闭模态框
layui.use('layer', () => {
layui.layer.closeAll();
});
this.showNotification('数据更新成功!');
})
}
return false;
});
}
});
});
}
// 打开模态框
editFaceModal(data, type) {
layui.use(['layer', 'form'], () => {
const layer = layui.layer;
const form = layui.form;
layer.open({
type: 1,
title: type == 'add' ? '添加数据' : '编辑数据',
area: ['80vw', '80vh'],
content: `
<form class="layui-form" lay-filter="dataForm" style="padding: 20px;">
<input type="hidden" name="id" value="${data.id}">
<div class="layui-form-item">
<label class="layui-form-label">图片</label>
<div class="layui-input-block">
<input type="file" id="faceImage" placeholder="选择人脸" style="cursor: pointer;">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">姓名</label>
<div class="layui-input-block">
<input type="text" name="name" value="${data.name}" required lay-verify="required" placeholder="请输入姓名" autocomplete="off" class="layui-input">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">外部ID</label>
<div class="layui-input-block">
<input type="text" name="external_id" value="${data.external_id}" autocomplete="off" class="layui-input">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">性别</label>
<div class="layui-input-block">
<input type="text" name="sex" value="${data.sex}" placeholder="请输入性别" autocomplete="off" class="layui-input">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">年龄</label>
<div class="layui-input-block">
<input type="number" name="age" value="${data.age}" placeholder="请输入年龄" autocomplete="off" class="layui-input">
</div>
</div>
<div class="layui-form-item">
<label class="layui-form-label">简介</label>
<div class="layui-input-block">
<input type="text" name="desc" value="${data.desc}" placeholder="请输入简介" autocomplete="off" class="layui-input">
</div>
</div>
<div class="layui-form-item">
<div class="layui-input-block">
<button class="layui-btn" lay-submit lay-filter="saveData">保存</button>
</div>
</div>
</form>
`,
success: () => {
form.render();
document.getElementById('faceImage').addEventListener('change', (event) => {
const files = event.target.files;
data.file = files[0]
});
// 监听表单提交
form.on('submit(saveData)', (formData) => {
console.log(formData)
this.handleFormSubmit(formData.field, data);
return false;
});
}
});
});
}
// 提交:添加/编辑
handleFormSubmit(formData, data) {
// 验证数据
if (!this.validateData(formData)) {
return;
}
let params = {
group_id: this.group_id,
name: formData.name,
age: formData.age,
sex: formData.sex,
desc: formData.desc,
external_id: formData.external_id
}
if (!data.id) {
faceLibApis.addFace(params).then(res => {
if (data.file) {
let formdata = new FormData();
formdata.append('id', res.data);
formdata.append('image', data.file)
faceLibApis.addImage(formdata).then(res => {
this.facecb('add')
})
} else {
this.facecb('add')
}
})
} else {
params.id = data.id;
faceLibApis.editFace(params).then(res => {
if (data.file) {
let formdata = new FormData();
formdata.append('id', params.id);
formdata.append('image', data.file)
faceLibApis.addImage(formdata).then(res => {
this.facecb('edit')
})
} else {
this.facecb('edit')
}
})
}
}
facecb(type) {
// 关闭模态框
layui.use('layer', () => {
layui.layer.closeAll();
});
this.showNotification(type == 'add' ? '数据添加成功!' : '数据更新成功!');
setTimeout(() => {
this.getTableData();
}, 1500)
}
// 验证数据
validateData(data) {
if (!data.name) {
this.showNotification('请输入姓名', 'error');
return false;
}
return true;
}
// 删除数据
deleteData(id) {
layui.use('layer', () => {
layui.layer.confirm('确定要删除这条数据吗?', {
icon: 3,
title: '提示'
}, (index) => {
faceLibApis.delSource({ id: id }).then(res => {
this.getTableData();
this.showNotification('数据删除成功!');
layui.layer.close(index);
})
});
});
}
// 显示通知
showNotification(message, type = 'success') {
layui.use('layer', () => {
layui.layer.msg(message, {
icon: type === 'success' ? 1 : 2,
time: 2000
});
});
}
}
// 等待Layui加载完成后初始化
layui.use(['table', 'layer', 'form'], () => {
// 初始化人脸列表
window.faceLibManager = new FaceLibManager();
});
const faceLibApis = {
getFaceList: (params) => {
return new Promise((resolve, reject) => {
$.ajax({
type: "GET",
dataType: "json",
url: `http://${ZQLGLOBAL.serverIp}${ZQLGLOBAL.face}?page=${params.page}&size=${params.size}&group_id=${params.group_id}`,
success: function (res) {
resolve(res)
},
error: function (err) {
reject(err)
}
});
})
},
addFace: (data) => {
return new Promise((resolve, reject) => {
$.ajax({
type: "POST",
contentType: "application/json",
url: `http://${ZQLGLOBAL.serverIp}${ZQLGLOBAL.face}`,
data: JSON.stringify(data),
success: function (res) {
resolve(res)
},
error: function (err) {
reject(err)
}
});
})
},
editFace: (data) => {
return new Promise((resolve, reject) => {
$.ajax({
type: "PUT",
contentType: "application/json",
url: `http://${ZQLGLOBAL.serverIp}${ZQLGLOBAL.face}`,
data: JSON.stringify(data),
success: function (res) {
resolve(res)
},
error: function (err) {
reject(err)
}
});
})
},
delFace: (data) => {
return new Promise((resolve, reject) => {
$.ajax({
type: "DELETE",
contentType: "application/json",
url: `http://${ZQLGLOBAL.serverIp}${ZQLGLOBAL.face}`,
data: JSON.stringify(data),
success: function (res) {
resolve(res)
},
error: function (err) {
reject(err)
}
});
})
},
addImage: (formdata) => {
return new Promise((resolve, reject) => {
$.ajax({
type: "PUT",
url: `http://${ZQLGLOBAL.serverIp}${ZQLGLOBAL.image}`,
data: formdata, // 使用FormData对象
processData: false, // 告诉jQuery不要处理发送的数据
contentType: false,
success: function (res) {
resolve(res)
},
error: function (err) {
reject(err)
}
});
})
},
getGrpup: () => {
let type = 'face';
// 获取人脸分组
return new Promise((resolve, reject) => {
$.ajax({
type: "GET",
dataType: "json",
url: `http://${ZQLGLOBAL.serverIp}${ZQLGLOBAL.group}?alg=${type}`,
success: function (res) {
resolve(res)
},
error: function (err) {
reject(err)
}
});
})
},
addGroup: (data) => {
return new Promise((resolve, reject) => {
$.ajax({
type: "POST",
contentType: "application/json",
url: `http://${ZQLGLOBAL.serverIp}${ZQLGLOBAL.group}`,
data: JSON.stringify(data),
success: function (res) {
resolve(res)
},
error: function (err) {
reject(err)
}
});
})
},
editGroup: (data) => {
return new Promise((resolve, reject) => {
$.ajax({
type: "PUT",
contentType: "application/json",
url: `http://${ZQLGLOBAL.serverIp}${ZQLGLOBAL.group}`,
data: JSON.stringify(data),
success: function (res) {
resolve(res)
},
error: function (err) {
reject(err)
}
});
})
},
delGroup: (data) => {
return new Promise((resolve, reject) => {
$.ajax({
type: "DELETE",
contentType: "application/json",
url: `http://${ZQLGLOBAL.serverIp}${ZQLGLOBAL.group}`,
data: JSON.stringify(data),
success: function (res) {
resolve(res)
},
error: function (err) {
reject(err)
}
});
})
},
}