diff --git a/api/products/migrations/0103_datalabel.py b/api/products/migrations/0103_datalabel.py new file mode 100644 index 0000000..aedd6b7 --- /dev/null +++ b/api/products/migrations/0103_datalabel.py @@ -0,0 +1,23 @@ +# Generated by Django 3.2.25 on 2025-04-25 07:43 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('products', '0102_remove_codebatch_detection_service'), + ] + + operations = [ + migrations.CreateModel( + name='DataLabel', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=128, verbose_name='名称')), + ('create_time', models.DateTimeField(auto_now_add=True, verbose_name='创建日期')), + ('update_time', models.DateTimeField(auto_now=True, verbose_name='更新日期')), + ('description', models.TextField(verbose_name='描述')), + ], + ), + ] diff --git a/api/products/migrations/0104_alter_datalabel_name.py b/api/products/migrations/0104_alter_datalabel_name.py new file mode 100644 index 0000000..9a72e8d --- /dev/null +++ b/api/products/migrations/0104_alter_datalabel_name.py @@ -0,0 +1,18 @@ +# Generated by Django 3.2.25 on 2025-04-25 21:05 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('products', '0103_datalabel'), + ] + + operations = [ + migrations.AlterField( + model_name='datalabel', + name='name', + field=models.CharField(db_index=True, max_length=128, unique=True, verbose_name='名称'), + ), + ] diff --git a/api/products/models.py b/api/products/models.py index 98e0855..9c3c363 100644 --- a/api/products/models.py +++ b/api/products/models.py @@ -433,3 +433,12 @@ class ABTestSample(models.Model): def __str__(self): return f"{self.pk} {self.abtest.name} {self.create_time}" + +class DataLabel(models.Model): + name = models.CharField(max_length=128, verbose_name="名称", db_index=True, unique=True) + create_time = models.DateTimeField(auto_now_add=True, verbose_name="创建日期") + update_time = models.DateTimeField(auto_now=True, verbose_name="更新日期") + description = models.TextField(verbose_name="描述") + + def __str__(self): + return f"{self.name}: created {self.create_time} updated {self.update_time}" \ No newline at end of file diff --git a/api/products/views.py b/api/products/views.py index 711f4cd..948b134 100644 --- a/api/products/views.py +++ b/api/products/views.py @@ -419,6 +419,18 @@ class ScanDataResource(BaseResource): return schema + def get_object_list(self, request): + qs = super().get_object_list(request) + if 'include_labels' in request.GET: + labels = request.GET.get('include_labels').split(',') + for l in labels: + qs = qs.filter(labels__contains=l) + if 'exclude_labels' in request.GET: + labels = request.GET.get('exclude_labels').split(',') + for l in labels: + qs = qs.exclude(labels__contains=l) + return qs + class MessageResource(BaseResource): class Meta: queryset = UserMessage.objects.all().order_by('-pk'); @@ -485,6 +497,15 @@ class ABTestSampleResource(BaseResource): auth_role = 'admin' +class DataLabelResource(BaseResource): + class Meta: + queryset = DataLabel.objects.all().order_by('-pk') + resource_name = 'datalabel' + authorization = BaseAuthorization() + serializer = BaseSerializer() + + auth_role = 'admin' + for cls in BaseResource.__subclasses__(): v1_api.register(cls()) @@ -1122,8 +1143,8 @@ class OssImageView(BaseView): name = request.GET.get('name') if not name: return http404() - url = oss_sign_url(name) - return redirect(url) + img_bytes = oss_get(name) + return HttpResponse(img_bytes, content_type='image/jpeg') class BackupView(BaseView): name = 'backup' diff --git a/web/src/_nav.js b/web/src/_nav.js index b7505b5..4cec3e0 100644 --- a/web/src/_nav.js +++ b/web/src/_nav.js @@ -57,6 +57,18 @@ export default [ to: '/scan-data', icon: 'basket-shopping', }, + { + component: 'CNavItem', + name: '数据标注', + to: '/labeling', + icon: 'tag', + }, + { + component: 'CNavItem', + name: '标签管理', + to: '/label-mgmt', + icon: 'tags', + }, { component: 'CNavItem', name: '系统日志', diff --git a/web/src/components/generic-manager.vue b/web/src/components/generic-manager.vue index 2ff2701..8e48693 100644 --- a/web/src/components/generic-manager.vue +++ b/web/src/components/generic-manager.vue @@ -90,6 +90,9 @@