frames paging and filter by label
This commit is contained in:
parent
d1f38e868b
commit
2e814fa331
@ -1809,6 +1809,7 @@ class FramesView(BaseView):
|
|||||||
def get(self, request):
|
def get(self, request):
|
||||||
start = request.GET.get('start', 0)
|
start = request.GET.get('start', 0)
|
||||||
end = request.GET.get('end', 100)
|
end = request.GET.get('end', 100)
|
||||||
|
filter_label = request.GET.get('label', None)
|
||||||
ret = oss_list(bucket=settings.FRAMES_BUCKET)
|
ret = oss_list(bucket=settings.FRAMES_BUCKET)
|
||||||
start = int(start)
|
start = int(start)
|
||||||
end = int(end)
|
end = int(end)
|
||||||
@ -1816,11 +1817,13 @@ class FramesView(BaseView):
|
|||||||
for frame in ret[start:end]:
|
for frame in ret[start:end]:
|
||||||
fo = FrameLabel.objects.filter(oss_path=frame).first()
|
fo = FrameLabel.objects.filter(oss_path=frame).first()
|
||||||
if fo:
|
if fo:
|
||||||
|
if filter_label and filter_label not in fo.labels.split(','):
|
||||||
|
continue
|
||||||
frames.append({
|
frames.append({
|
||||||
'path': frame,
|
'path': frame,
|
||||||
'labels': fo.labels.split(','),
|
'labels': fo.labels.split(','),
|
||||||
})
|
})
|
||||||
else:
|
elif not filter_label:
|
||||||
frames.append({
|
frames.append({
|
||||||
'path': frame,
|
'path': frame,
|
||||||
'labels': [],
|
'labels': [],
|
||||||
@ -1838,7 +1841,6 @@ class FrameView(BaseView):
|
|||||||
path = request.GET.get('path')
|
path = request.GET.get('path')
|
||||||
return HttpResponse(oss_get(path, bucket=settings.FRAMES_BUCKET),
|
return HttpResponse(oss_get(path, bucket=settings.FRAMES_BUCKET),
|
||||||
content_type='image/jpeg')
|
content_type='image/jpeg')
|
||||||
|
|
||||||
class DeleteFrameView(BaseView):
|
class DeleteFrameView(BaseView):
|
||||||
name = 'delete-frame'
|
name = 'delete-frame'
|
||||||
auth_check = 'admin'
|
auth_check = 'admin'
|
||||||
|
|||||||
@ -1,6 +1,13 @@
|
|||||||
<template>
|
<template>
|
||||||
<div>
|
<div>
|
||||||
<h2>帧检查</h2>
|
<h2>帧检查</h2>
|
||||||
|
<div>
|
||||||
|
<button class="btn btn-primary" @click="reload">刷新</button>
|
||||||
|
<button class="btn btn-primary" @click="prev_page">上一页</button>
|
||||||
|
<button class="btn btn-primary" @click="next_page">下一页</button>
|
||||||
|
<button v-for="label in labels" :key="label" class="btn btn-info"
|
||||||
|
@click="filter_by_label(label)">Only {{ label }}</button>
|
||||||
|
</div>
|
||||||
<table class="table">
|
<table class="table">
|
||||||
<thead>
|
<thead>
|
||||||
<tr>
|
<tr>
|
||||||
@ -14,7 +21,8 @@
|
|||||||
<td>
|
<td>
|
||||||
<div class="image-container" @mouseover="showPopup(frame)" @mouseleave="hidePopup">
|
<div class="image-container" @mouseover="showPopup(frame)" @mouseleave="hidePopup">
|
||||||
<a :href="'/api/v1/frame/?path='+frame.path" target="_blank">
|
<a :href="'/api/v1/frame/?path='+frame.path" target="_blank">
|
||||||
<img class="frame-preview" :src="'/api/v1/frame/?path='+frame.path" />
|
<img class="frame-preview d-block" :src="'/api/v1/frame/?path='+frame.path" />
|
||||||
|
{{ frame.path }}
|
||||||
</a>
|
</a>
|
||||||
<div v-if="hoveredFrame === frame" class="image-popup">
|
<div v-if="hoveredFrame === frame" class="image-popup">
|
||||||
<img :src="'/api/v1/frame/?path='+frame.path" />
|
<img :src="'/api/v1/frame/?path='+frame.path" />
|
||||||
@ -23,9 +31,8 @@
|
|||||||
</td>
|
</td>
|
||||||
<td>{{ show_labels(frame.labels) }}</td>
|
<td>{{ show_labels(frame.labels) }}</td>
|
||||||
<td>
|
<td>
|
||||||
<button class="btn btn-danger" @click="label_frame(frame, 'noqr')">无二维码</button>
|
<button v-for="label in labels" :key="label" class="btn btn-info"
|
||||||
<button class="btn btn-warning" @click="label_frame(frame, 'blurry')">模糊</button>
|
@click="label_frame(frame, label)">{{ label }}</button>
|
||||||
<button class="btn btn-success" @click="label_frame(frame, 'clear')">清晰</button>
|
|
||||||
<button class="btn btn-danger" @click="delete_frame(frame)">删除</button>
|
<button class="btn btn-danger" @click="delete_frame(frame)">删除</button>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
@ -39,18 +46,42 @@ export default {
|
|||||||
name: 'FramesView',
|
name: 'FramesView',
|
||||||
data() {
|
data() {
|
||||||
return {
|
return {
|
||||||
|
labels: ['blurry', 'clear', 'noqr'],
|
||||||
|
filter_label: null,
|
||||||
frames: [],
|
frames: [],
|
||||||
hoveredFrame: null
|
hoveredFrame: null,
|
||||||
|
page_size: 10,
|
||||||
|
page_num: 0,
|
||||||
|
max_page: 0,
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
|
filter_by_label(label) {
|
||||||
|
this.filter_label = label
|
||||||
|
this.reload()
|
||||||
|
},
|
||||||
|
prev_page() {
|
||||||
|
this.page_num = Math.max(0, this.page_num - 1)
|
||||||
|
this.reload()
|
||||||
|
},
|
||||||
|
next_page() {
|
||||||
|
this.page_num = Math.min(this.max_page - 1, this.page_num + 1)
|
||||||
|
this.reload()
|
||||||
|
},
|
||||||
show_labels(labels) {
|
show_labels(labels) {
|
||||||
return labels.join(', ')
|
return labels.join(', ')
|
||||||
},
|
},
|
||||||
async reload() {
|
async reload() {
|
||||||
try {
|
try {
|
||||||
const response = await this.$root.api_get('/api/v1/frames/')
|
var start = this.page_size * this.page_num
|
||||||
|
var end = start + this.page_size
|
||||||
|
var url = `/api/v1/frames/?start=${start}&end=${end}`
|
||||||
|
if (this.filter_label) {
|
||||||
|
url += `&label=${this.filter_label}`
|
||||||
|
}
|
||||||
|
const response = await this.$root.api_get(url)
|
||||||
this.frames = response.data.frames
|
this.frames = response.data.frames
|
||||||
|
this.max_page = Math.ceil(response.data.total / this.page_size)
|
||||||
console.log(this.frames)
|
console.log(this.frames)
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
console.error('Failed to load frames:', error)
|
console.error('Failed to load frames:', error)
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user