diff --git a/.gitignore b/.gitignore index 95d65ce2b9a71f4bb29af2f1f9c13231bc69e3b2..a7c0a2ff38b32997b3084ca8c853770e863849b8 100644 --- a/.gitignore +++ b/.gitignore @@ -4,4 +4,5 @@ .history/ .vscode/ -web/package-lock.json \ No newline at end of file +web/package-lock.json +/media/ \ No newline at end of file diff --git a/backend/.gitignore b/backend/.gitignore index 6c50cc968f99592116ca575d38654a3694d906e5..d5da32591519dd113445b3e5266e7d6a0a84cb7b 100644 --- a/backend/.gitignore +++ b/backend/.gitignore @@ -1,3 +1,11 @@ +# wskaudh +4aff9e812bbff8e42b2f094789bae4a3_venv +31343b8ee171d315115050f7010977c7_venv +logs/* +gunicorn_conf.py +uwsgi.pid + + # Byte-compiled / optimized / DLL files *.py[cod] *$py.class @@ -91,8 +99,12 @@ ENV/ **/migrations/*.py !**/migrations/__init__.py *.pyc +<<<<<<< HEAD + +======= conf/* !conf/env.example.py +>>>>>>> 084d1c0c3e8c3482ac5d57f5629b5d7b1a116d77 db.sqlite3 media/ __pypackages__/ diff --git a/backend/PublicResource/__init__.py b/backend/PublicResource/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/backend/PublicResource/admin.py b/backend/PublicResource/admin.py new file mode 100644 index 0000000000000000000000000000000000000000..8c38f3f3dad51e4585f3984282c2a4bec5349c1e --- /dev/null +++ b/backend/PublicResource/admin.py @@ -0,0 +1,3 @@ +from django.contrib import admin + +# Register your models here. diff --git a/backend/PublicResource/apps.py b/backend/PublicResource/apps.py new file mode 100644 index 0000000000000000000000000000000000000000..28d9717ef200014961e828ef5200848bee5df527 --- /dev/null +++ b/backend/PublicResource/apps.py @@ -0,0 +1,6 @@ +from django.apps import AppConfig + + +class PublicresourceConfig(AppConfig): + default_auto_field = 'django.db.models.BigAutoField' + name = 'PublicResource' diff --git a/backend/PublicResource/migrations/__init__.py b/backend/PublicResource/migrations/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/backend/PublicResource/tables/OrganizationTables/models.py b/backend/PublicResource/tables/OrganizationTables/models.py new file mode 100644 index 0000000000000000000000000000000000000000..5cbb07ddf657880ce0f18635ff774f8dcf92f91a --- /dev/null +++ b/backend/PublicResource/tables/OrganizationTables/models.py @@ -0,0 +1,73 @@ +from django.db import models + +from dvadmin.utils.models import CoreModel + +# Create your models here. + + +# 注释编号:django-vue-admin__models505916:代码开始行 +# 功能说明: + +class AreaModel(CoreModel): + title = models.CharField(verbose_name="区域", unique=True, max_length=64, blank=False) + AreaNum = models.CharField(verbose_name="区号", max_length=64, blank=False, default=None) + + def __str__(self): + return self.title + + class Meta: + verbose_name = "区域" + verbose_name_plural = verbose_name + ordering = ("-create_datetime",) + + +class CompanyModel(CoreModel): + title = models.CharField(verbose_name="公司名称", unique=True, max_length=64, blank=False) + + def __str__(self): + return self.title + + class Meta: + verbose_name = "公司名称" + verbose_name_plural = verbose_name + ordering = ("-create_datetime",) + + +class DepartmentModel(CoreModel): + title = models.CharField(verbose_name="部门名称", unique=True, max_length=64, blank=False) + + def __str__(self): + return self.title + + class Meta: + verbose_name = "部门" + verbose_name_plural = verbose_name + ordering = ("-create_datetime",) + +#注释编号: django-vue3-admin-models142316:导入全局字典表 +from PublicResource.tables.globalDictTables.models import globalDictModel + +class OrganizationModel(CoreModel): + company = models.ForeignKey(to=CompanyModel, verbose_name="公司", on_delete=models.PROTECT) + area = models.ForeignKey(to=AreaModel, verbose_name="区域", on_delete=models.PROTECT) + department = models.ForeignKey(to=DepartmentModel, verbose_name="部门", on_delete=models.PROTECT) + use = models.CharField(verbose_name="员工", max_length=64, default="", null=True) + + #注释编号: django-vue3-admin-models322316:将原来的字典修改为全局字典模式 + + # or_use_status = models.CharField(verbose_name="员工状态", max_length=64, blank=False, default=None) + or_use_status = models.ForeignKey('globalDictModel', verbose_name="员工状态", on_delete=models.PROTECT, default=None) + date = models.DateField(verbose_name="入职时间", default=None) + + + def __str__(self): + return self.use + + class Meta: + verbose_name = "it资源组织" + verbose_name_plural = verbose_name + ordering = ("-update_datetime",) + + + +# 注释编号:django-vue-admin__models505916:代码结束行 \ No newline at end of file diff --git a/backend/PublicResource/tables/OrganizationTables/serializers.py b/backend/PublicResource/tables/OrganizationTables/serializers.py new file mode 100644 index 0000000000000000000000000000000000000000..6d015fc13572b3c98f692da5a3f5fb84a1f009f5 --- /dev/null +++ b/backend/PublicResource/tables/OrganizationTables/serializers.py @@ -0,0 +1,90 @@ +from dvadmin.utils.serializers import CustomModelSerializer +from rest_framework import serializers + + +""" 注释编号:django-vue-admin__serializers18271817:代码开始行""" +""" 功能说明:这里是对组织构架4个model的序列化""" + +from PublicResource.tables.OrganizationTables.models import AreaModel, CompanyModel, DepartmentModel, OrganizationModel + +class AreaModelSerializer(CustomModelSerializer): + """ + 序列化器 + """ + + class Meta: + model = AreaModel + fields = "__all__" + + +class AreaModelCreateUpdateSerializer(CustomModelSerializer): + """ + 创建/更新时的列化器 + """ + + class Meta: + model = AreaModel + fields = '__all__' + + +class CompanyModelSerializer(CustomModelSerializer): + """ + 序列化器 + """ + + class Meta: + model = CompanyModel + fields = "__all__" + + +class CompanyModelCreateUpdateSerializer(CustomModelSerializer): + """ + 创建/更新时的列化器 + """ + + class Meta: + model = CompanyModel + fields = '__all__' + + +class DepartmentModelSerializer(CustomModelSerializer): + """ + 序列化器 + """ + + class Meta: + model = DepartmentModel + fields = "__all__" + + +class DepartmentModelCreateUpdateSerializer(CustomModelSerializer): + """ + 创建/更新时的列化器 + """ + + class Meta: + model = DepartmentModel + fields = '__all__' + + +class OrganizationModelSerializer(CustomModelSerializer): + """ + 序列化器 + """ + + class Meta: + model = OrganizationModel + fields = "__all__" + + +class OrganizationModelCreateUpdateSerializer(CustomModelSerializer): + """ + 创建/更新时的列化器 + """ + + class Meta: + model = OrganizationModel + fields = '__all__' + + +""" 注释编号:django-vue-admin__serializers271817:代码结束行""" \ No newline at end of file diff --git a/backend/PublicResource/tables/OrganizationTables/urls.py b/backend/PublicResource/tables/OrganizationTables/urls.py new file mode 100644 index 0000000000000000000000000000000000000000..567f9ccd6dc64efc9bbf41dd8ee84fb7e9964208 --- /dev/null +++ b/backend/PublicResource/tables/OrganizationTables/urls.py @@ -0,0 +1,26 @@ +from rest_framework.routers import SimpleRouter +router = SimpleRouter() + +from rest_framework.routers import SimpleRouter +router = SimpleRouter() + + +"""注释编号:django-vue-admin__urls533717:代码开始行""" +""" 功能说明:""" + +from PublicResource.tables.OrganizationTables.views import AreaModelViewSet, CompanyModelViewSet, DepartmentModelViewSet, OrganizationModelViewSet + + +# 这里进行注册路径,并把视图关联上 +router.register("api/it_area", AreaModelViewSet) +router.register("api/company", CompanyModelViewSet) +router.register("api/department", DepartmentModelViewSet) +router.register("api/organization", OrganizationModelViewSet) +"""注释编号:django-vue-admin__urls533717:代码结束行""" + + +# from django.urls import path +urlpatterns = [ + +] +urlpatterns += router.urls \ No newline at end of file diff --git a/backend/PublicResource/tables/OrganizationTables/views.py b/backend/PublicResource/tables/OrganizationTables/views.py new file mode 100644 index 0000000000000000000000000000000000000000..ae86d1a3c96c85ac6c98574153329cadcabad9e7 --- /dev/null +++ b/backend/PublicResource/tables/OrganizationTables/views.py @@ -0,0 +1,88 @@ +from dvadmin.utils.viewset import CustomModelViewSet + + + +""" 注释编号:django-vue-admin__views013217:代码开始行""" +""" 功能说明:这里是对组织构架4个model的""" + +from PublicResource.tables.OrganizationTables.models import AreaModel, CompanyModel, DepartmentModel, OrganizationModel + +from PublicResource.tables.OrganizationTables.serializers import AreaModelSerializer, AreaModelCreateUpdateSerializer +from PublicResource.tables.OrganizationTables.serializers import CompanyModelSerializer, CompanyModelCreateUpdateSerializer +from PublicResource.tables.OrganizationTables.serializers import DepartmentModelSerializer, DepartmentModelCreateUpdateSerializer +from PublicResource.tables.OrganizationTables.serializers import OrganizationModelSerializer, OrganizationModelCreateUpdateSerializer + +#注释编号: django-vue3-admin-views215716:导入字段权限控制类FieldPermissionMixin,接下来就在AreaModelViewSet进行继承使用 +from dvadmin.utils.field_permission import FieldPermissionMixin + +class AreaModelViewSet(CustomModelViewSet, FieldPermissionMixin): + """ + list:查询 + create:新增 + update:修改 + retrieve:单例 + destroy:删除 + """ + + + import_field_dict = { + "title": "区域", + } + import_serializer_class = AreaModelSerializer + + + + queryset = AreaModel.objects.all() + serializer_class = AreaModelSerializer + create_serializer_class = AreaModelCreateUpdateSerializer + update_serializer_class = AreaModelCreateUpdateSerializer + + + +class CompanyModelViewSet(CustomModelViewSet): + """ + list:查询 + create:新增 + update:修改 + retrieve:单例 + destroy:删除 + """ + queryset = CompanyModel.objects.all() + serializer_class = CompanyModelSerializer + create_serializer_class = CompanyModelCreateUpdateSerializer + update_serializer_class = CompanyModelCreateUpdateSerializer + + + +class DepartmentModelViewSet(CustomModelViewSet): + """ + list:查询 + create:新增 + update:修改 + retrieve:单例 + destroy:删除 + """ + queryset = DepartmentModel.objects.all() + serializer_class = DepartmentModelSerializer + create_serializer_class = DepartmentModelCreateUpdateSerializer + update_serializer_class = DepartmentModelCreateUpdateSerializer + +class OrganizationModelViewSet(CustomModelViewSet): + """ + list:查询 + create:新增 + update:修改 + retrieve:单例 + destroy:删除 + """ + + queryset = OrganizationModel.objects.all() + serializer_class = OrganizationModelSerializer + create_serializer_class = OrganizationModelCreateUpdateSerializer + update_serializer_class = OrganizationModelCreateUpdateSerializer + + + + + +""" 注释编号:django-vue-admin__views013217:代码结束行""" diff --git a/backend/PublicResource/tables/globalDictTables/models.py b/backend/PublicResource/tables/globalDictTables/models.py new file mode 100644 index 0000000000000000000000000000000000000000..b89cff9f42dafbab560701398e89698baad45f7c --- /dev/null +++ b/backend/PublicResource/tables/globalDictTables/models.py @@ -0,0 +1,18 @@ +from django.db import models + +from dvadmin.utils.models import CoreModel + +# Create your models here. + + +class globalDictModel(CoreModel): + belongSystem = models.ForeignKey('self', verbose_name="归属系统", related_name="dict_belongSystem", blank=True, null=True, on_delete=models.PROTECT, help_text="自己关联自己来使用字典") + belogTable = models.ForeignKey('self', verbose_name="归属表格", related_name="dict_belogTable", blank=True, null=True, on_delete=models.PROTECT, help_text="自己关联自己来使用字典") + dictMark = models.ForeignKey('self', verbose_name="字典标记", related_name="dict_dictMark", blank=True, null=True, on_delete=models.PROTECT, help_text="自己关联自己来使用字典") + dictName = models.CharField(verbose_name="字典名称", max_length=64, blank=False, default=None) + dictNum = models.IntegerField(verbose_name="字典序号", default=0, null=True, blank=True) + + + class Meta: + verbose_name = "全局字典" + verbose_name_plural = verbose_name \ No newline at end of file diff --git a/backend/PublicResource/tables/globalDictTables/serializers.py b/backend/PublicResource/tables/globalDictTables/serializers.py new file mode 100644 index 0000000000000000000000000000000000000000..5a9d6b942914bb4404681285b059c1fa307fddd7 --- /dev/null +++ b/backend/PublicResource/tables/globalDictTables/serializers.py @@ -0,0 +1,72 @@ +from dvadmin.utils.serializers import CustomModelSerializer +from rest_framework import serializers + + + +from .models import globalDictModel + + +class globalDictModelSerializer(CustomModelSerializer): + """ + 序列化器 + """ + + class Meta: + model = globalDictModel + fields = "__all__" + + +class globalDictModelCreateUpdateSerializer(CustomModelSerializer): + """ + 创建/更新时的列化器 + """ + + class Meta: + model = globalDictModel + fields = '__all__' + + + + def validate(self, attrs): + + dictMark = attrs.get('dictMark') + dictName = attrs.get('dictName') + + + if dictMark and dictName : + obj_queryset = globalDictModel.objects.filter(dictMark=dictMark, dictName=dictName) + + + # 注释编号:django-vue3-admin-serializers344917 + # 功能说明:限制修改字典标记为dictMark的对象 + + if self.request.data.get('id'): #如果有ID说明是进来编辑修改对象的情况下 + old_obj_queryset = globalDictModel.objects.filter(id=self.request.data.get('id')) #去查询原来数据里面对就ID的对象出来 + + if old_obj_queryset.get().dictMark.dictName == 'dictMark': + if dictMark != old_obj_queryset.get().dictMark or dictName != old_obj_queryset.get().dictName: + + raise serializers.ValidationError("为防止错误出现,对于标记为dictMark的对象禁用修改字典标记与字典名称") + + # 注释编号:django-vue3-admin-serializers344917 + + + # 注释编号:django-vue3-admin-serializers435117 + # 功能说明:配置dictMark与dictName的联合唯一 + + if obj_queryset.exists(): + + if self.request.data.get('id'): #如果有ID说明是进来编辑修改对象的情况下 + if self.request.data.get('id') == obj_queryset.get().id: + # 如果传过来的id等于数据查到相同对象的id,那么说明就是当前的旧对象做修改,而且与自己起了冲突 + pass + else: + #如果两个id不相等,说明是直正的两条对象冲突了 + raise serializers.ValidationError("当前字典标记及字典名称组合已经存在,请检查或修改为其它") + else: + #新建对象时,就是没有id的,也要进行检验 + raise serializers.ValidationError("当前字典标记及字典名称组合已经存在,请检查或修改为其它") + + # 注释编号:django-vue3-admin-serializers435117 + + return attrs \ No newline at end of file diff --git a/backend/PublicResource/tables/globalDictTables/urls.py b/backend/PublicResource/tables/globalDictTables/urls.py new file mode 100644 index 0000000000000000000000000000000000000000..428080318d1935f873778595828e22afe81c74d5 --- /dev/null +++ b/backend/PublicResource/tables/globalDictTables/urls.py @@ -0,0 +1,22 @@ +from rest_framework.routers import SimpleRouter +router = SimpleRouter() + +from rest_framework.routers import SimpleRouter +router = SimpleRouter() + + + + +from .views import globalDictModelViewSet + +# # 这里进行注册路径,并把视图关联上 +router.register("api/globalDictModelViewSet", globalDictModelViewSet) + + + + +# from django.urls import path +urlpatterns = [ + +] +urlpatterns += router.urls \ No newline at end of file diff --git a/backend/PublicResource/tables/globalDictTables/views.py b/backend/PublicResource/tables/globalDictTables/views.py new file mode 100644 index 0000000000000000000000000000000000000000..1654bc644134cd770e65cdf87622a85c63ff3178 --- /dev/null +++ b/backend/PublicResource/tables/globalDictTables/views.py @@ -0,0 +1,35 @@ +from dvadmin.utils.viewset import CustomModelViewSet + + + + +from .models import globalDictModel +from .serializers import globalDictModelSerializer, globalDictModelCreateUpdateSerializer + +class globalDictModelViewSet(CustomModelViewSet): + """ + list:查询 + create:新增 + update:修改 + retrieve:单例 + destroy:删除 + """ + + queryset = globalDictModel.objects.all() + serializer_class = globalDictModelSerializer + create_serializer_class = globalDictModelCreateUpdateSerializer + update_serializer_class = globalDictModelCreateUpdateSerializer + + def get_queryset(self): + queryset = super().get_queryset() + + #这里拿到request传过来的参数,我们主要是判断是否有ordering的key在里面嘛,有的话直接使用ordering排序,没有的话就给个None,接下来就是使用默认排序 + ordering = self.request.query_params.get('ordering', None) + if ordering: + queryset = queryset.order_by(ordering) + else: + queryset = queryset.order_by('-create_datetime') + return queryset + + + diff --git a/backend/PublicResource/tests.py b/backend/PublicResource/tests.py new file mode 100644 index 0000000000000000000000000000000000000000..7ce503c2dd97ba78597f6ff6e4393132753573f6 --- /dev/null +++ b/backend/PublicResource/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/backend/PublicResource/urls.py b/backend/PublicResource/urls.py new file mode 100644 index 0000000000000000000000000000000000000000..588f09fa7cc264bb6d7d5f27f9c78953802a98a4 --- /dev/null +++ b/backend/PublicResource/urls.py @@ -0,0 +1,16 @@ +from rest_framework.routers import SimpleRouter +router = SimpleRouter() + + + + +from django.urls import path, include + +urlpatterns = [ + + path('',include('PublicResource.tables.OrganizationTables.urls')), + path('',include('PublicResource.tables.globalDictTables.urls')), + +] +urlpatterns += router.urls + diff --git a/backend/application/settings.py b/backend/application/settings.py index 8b2c8c2d79689f2671f77db328dd5648a41f4360..0f64b11727a0c979fa886655e720ec612e289bd0 100644 --- a/backend/application/settings.py +++ b/backend/application/settings.py @@ -18,6 +18,7 @@ from datetime import timedelta # Build paths inside the project like this: BASE_DIR / 'subdir'. BASE_DIR = Path(__file__).resolve().parent.parent +from conf.env import * #这一行必须放在BASE_DIR后面进行导入,要不会出现循环导入的情况 # ================================================= # # ******************** 动态配置 ******************** # # ================================================= # @@ -62,6 +63,15 @@ INSTALLED_APPS = [ "dvadmin.system", ] +My_Apps = [ + 'crud_demo', + 'PublicResource', # 20230803创建的公共资源应用 + 'it_mis', #20230707创建的it信息资源管理系统应用 +] +#更喜欢把自己的app单独拿出来,然后再拼接一下,这样会更清晰。 +INSTALLED_APPS += My_Apps + + MIDDLEWARE = [ "dvadmin.utils.middleware.HealthCheckMiddleware", "django.middleware.security.SecurityMiddleware", diff --git a/backend/application/urls.py b/backend/application/urls.py index 6648052afca4a094f9dd78c5001317b456ca2b8b..a5ec4fbb8d69cd823ed7934a6ffcacd6017ffd8a 100644 --- a/backend/application/urls.py +++ b/backend/application/urls.py @@ -90,3 +90,19 @@ urlpatterns = ( + static(settings.STATIC_URL, document_root=settings.STATIC_URL) + [re_path(ele.get('re_path'), include(ele.get('include'))) for ele in settings.PLUGINS_URL_PATTERNS] ) + +My_Urls = ( + [ + # 注释编号:workspace.json__urls464817:PublicResource是公共资源模块 + path('',include('PublicResource.urls')), + #这里的crud_demo是指django创建的应用名称crud_demo + path('',include('crud_demo.urls')), + # 注释编号:django-vue-admin__urls054617: + path('',include('it_mis.urls')), + + ] + +) + +# 这里把自己的路径单独出来,后面再追加在一起 +urlpatterns += My_Urls diff --git a/backend/conf/env.py b/backend/conf/env.py new file mode 100644 index 0000000000000000000000000000000000000000..c9e57922b96335abb15dd4d06130537721fe69d0 --- /dev/null +++ b/backend/conf/env.py @@ -0,0 +1,85 @@ +import os + +from application.settings import BASE_DIR + +# ================================================= # +# *************** mysql数据库 配置 *************** # +# ================================================= # +# 数据库 ENGINE ,默认演示使用 sqlite3 数据库,正式环境建议使用 mysql 数据库 +# sqlite3 设置 +# DATABASE_ENGINE = "django.db.backends.sqlite3" +# DATABASE_NAME = os.path.join(BASE_DIR, "db.sqlite3") + + + +# 注释编号:django-vue3-admin-env465810 +# 功能说明:此处为开发环境的数据库配置 + +DATABASE_ENGINE = "django.db.backends.mysql" +DATABASE_NAME = 'dvadmin3dev' # mysql 时使用 + +# 数据库地址 改为自己数据库地址 +DATABASE_HOST = "192.168.202.17" +# # 数据库端口 +DATABASE_PORT = 3306 +# # 数据库用户名 +DATABASE_USER = "dvadmin3dev" +# # 数据库密码 +DATABASE_PASSWORD = "sLRen2rPN87Js3FR" + +# 表前缀 +TABLE_PREFIX = "dvadmin_" + +# 注释编号:django-vue3-admin-env465810 + + + + + +# 注释编号:django-vue3-admin-env465910 +# 功能说明:此处为开发环境与生产环境的过渡数据中间数据库配置,主要有用迁移数据使用的 + +# DATABASE_ENGINE = "django.db.backends.mysql" +# DATABASE_NAME = 'dvadmin3mid' # mysql 时使用 + +# # 数据库地址 改为自己数据库地址 +# DATABASE_HOST = "192.168.202.17" +# # # 数据库端口 +# DATABASE_PORT = 3306 +# # # 数据库用户名 +# DATABASE_USER = "dvadmin3mid" +# # # 数据库密码 +# DATABASE_PASSWORD = "SRXSbpMnJCjP5L5W" + +# # 表前缀 +# TABLE_PREFIX = "dvadmin_" + +# 注释编号:django-vue3-admin-env465910 + + +# ================================================= # +# ******** redis配置,无redis 可不进行配置 ******** # +# ================================================= # +# REDIS_PASSWORD = '' +# REDIS_HOST = '127.0.0.1' +# REDIS_URL = f'redis://:{REDIS_PASSWORD or ""}@{REDIS_HOST}:6380' +# ================================================= # +# ****************** 功能 启停 ******************* # +# ================================================= # +DEBUG = True +# 启动登录详细概略获取(通过调用api获取ip详细地址。如果是内网,关闭即可) +ENABLE_LOGIN_ANALYSIS_LOG = True +# 登录接口 /api/token/ 是否需要验证码认证,用于测试,正式环境建议取消 +LOGIN_NO_CAPTCHA_AUTH = True +# ================================================= # +# ****************** 其他 配置 ******************* # +# ================================================= # + +ALLOWED_HOSTS = ["*"] + +# daphne启动命令 +#daphne application.asgi:application -b 0.0.0.0 -p 8000 + +CUSTOM_APPS = [ + "dvadmin.system", +] diff --git a/backend/crud_demo/__init__.py b/backend/crud_demo/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/backend/crud_demo/admin.py b/backend/crud_demo/admin.py new file mode 100644 index 0000000000000000000000000000000000000000..8c38f3f3dad51e4585f3984282c2a4bec5349c1e --- /dev/null +++ b/backend/crud_demo/admin.py @@ -0,0 +1,3 @@ +from django.contrib import admin + +# Register your models here. diff --git a/backend/crud_demo/apps.py b/backend/crud_demo/apps.py new file mode 100644 index 0000000000000000000000000000000000000000..dea1356353a018feb270538d8532a0e0848e6e13 --- /dev/null +++ b/backend/crud_demo/apps.py @@ -0,0 +1,6 @@ +from django.apps import AppConfig + + +class CrudDemoConfig(AppConfig): + default_auto_field = 'django.db.models.BigAutoField' + name = 'crud_demo' diff --git a/backend/crud_demo/migrations/__init__.py b/backend/crud_demo/migrations/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/backend/crud_demo/modelFilter.py b/backend/crud_demo/modelFilter.py new file mode 100644 index 0000000000000000000000000000000000000000..4d6acfac6263f98ec7340067093979e71ca0d5e9 --- /dev/null +++ b/backend/crud_demo/modelFilter.py @@ -0,0 +1,40 @@ +import django_filters +from django.db.models import Q + +from .models import CrudDemoModel + + + +class goodsFilter(django_filters.rest_framework.FilterSet): + + #注释编号: django-vue3-admin_modelFilter034014:这里要配置多对多的查询及对应的方法,注意一定要传入queryset参数 + goodstypes = django_filters.ModelMultipleChoiceFilter(method='Mul_filter_custom', queryset = CrudDemoModel.objects.all()) + goodsport = django_filters.ModelMultipleChoiceFilter(method='Mul_filter_custom', queryset = CrudDemoModel.objects.all()) + + goods = django_filters.CharFilter(field_name='goods', lookup_expr='icontains') + + + + #注释编号: django-vue3-admin_modelFilter543116:自定义多对多字段的过滤方法 + def Mul_filter_custom(self, queryset, name, value): + + data = dict(self.data) #这里也可以拿self.request.query_params + + nameValueList = [] + for k, v in data.items(): + if name in k and len(v) > 0: + v[0] = int(v[0]) # 将字符串如'1'转为数字1 + nameValueList.append(v[0]) + #来到这里拿到goodstypes对应的值列表[3, 2, 1] + + if nameValueList: #这里一定要判断是否 + queryset = queryset.filter(**{name + '__in': nameValueList}) + + + return queryset + + + class Meta: + model = CrudDemoModel + exclude = ('subTable',) + #注释编号: django-vue3-admin_modelFilter373814:这里不要配置fields = "__all__" ,因为字表字段查询不了,会引发错误,所以直接排除掉 diff --git a/backend/crud_demo/models.py b/backend/crud_demo/models.py new file mode 100644 index 0000000000000000000000000000000000000000..b71014aa1c9f5981ed9dc0d0bae17a1e5e427f3d --- /dev/null +++ b/backend/crud_demo/models.py @@ -0,0 +1,87 @@ +from django.db import models +#注释编号: django-vue3-admin_models433516:单独导入JSONField +from django.db.models import JSONField + +# Create your models here. +from dvadmin.utils.models import CoreModel + + +class goodstype(CoreModel): + title = models.CharField(max_length=255, verbose_name="商品类型") + + + class Meta: + verbose_name = '商品类型' + verbose_name_plural = verbose_name + ordering = ('-create_datetime',) + + +class goodstypeportModel(CoreModel): + title = models.CharField(max_length=255, verbose_name="商品端口") + + + class Meta: + verbose_name = '商品端口' + verbose_name_plural = verbose_name + ordering = ('-create_datetime',) + + +class CrudDemoModel(CoreModel): + goods = models.CharField(max_length=255, verbose_name="商品") + inventory = models.IntegerField(verbose_name="库存量") + goods_price = models.FloatField(verbose_name="商品定价") + purchase_goods_date = models.DateField(verbose_name="进货时间", blank=True, null=True) + + #注释编号: django-vue3-admin_models421416:添加多对多字段,让前端把subTable数据整理之后存到这里来 + goodstypes = models.ManyToManyField('goodstype', verbose_name="商品类型", default=None, blank=True) + goodsport = models.ManyToManyField('goodstypeportModel', verbose_name="商品端口", default=None, blank=True) + + #注释编号: django-vue3-admin_models543516:将字段配置为JSONField类型 + subTable = JSONField(blank=True, null=True, verbose_name="子表格数据") + + class Meta: + verbose_name = '商品表' + verbose_name_plural = verbose_name + ordering = ('-create_datetime',) + + + +# 注释编号:django-vue3-admin_models220217 +# 功能说明:对CrudDemoModel专门创建两个中间模型,以方便做这两个字段的联合唯一功能 +#CrudDemoModel中的goodstypes与goodsport多对多字段 +class GoodstypesCrud(models.Model): + cruddemomodel = models.ForeignKey( + 'CrudDemoModel', + on_delete=models.CASCADE, + ) + goodstype = models.ForeignKey( + 'goodstype', + on_delete=models.CASCADE, + ) + + class Meta: + verbose_name = "商品类型关系一" + verbose_name_plural = verbose_name + db_table = 'crud_demo_cruddemomodel_goodstypes' + managed = False #本表不被包括在makemigrations和migrate命令中 + + + + +class GoodsportsCrud(models.Model): + cruddemomodel = models.ForeignKey( + 'CrudDemoModel', + on_delete=models.CASCADE, + ) + goodstypeportmodel = models.ForeignKey( + 'goodstypeportModel', + on_delete=models.CASCADE, + ) + + class Meta: + verbose_name = "商品端口关系二" + verbose_name_plural = verbose_name + db_table = 'crud_demo_cruddemomodel_goodsport' + managed = False #本表不被包括在makemigrations和migrate命令中 + +# 注释编号:django-vue3-admin_models220217 diff --git a/backend/crud_demo/serializers.py b/backend/crud_demo/serializers.py new file mode 100644 index 0000000000000000000000000000000000000000..0310e33332356434f960f252d390074707636a15 --- /dev/null +++ b/backend/crud_demo/serializers.py @@ -0,0 +1,151 @@ +from crud_demo.models import CrudDemoModel +from dvadmin.utils.serializers import CustomModelSerializer +from rest_framework import serializers + +class CrudDemoModelSerializer(CustomModelSerializer): + """ + 序列化器 + """ + +#这里是进行了序列化模型及所有的字段 + class Meta: + model = CrudDemoModel + fields = "__all__" + + +# 注释编号:django-vue3-admin_serializers490917 +# 功能说明:这里就是配置两个多对多字段的联合唯一校验处理 + +from .models import GoodstypesCrud, GoodsportsCrud +import pandas as pd +#这里是创建/更新时的列化器#自定义联合唯一的过滤器 +# def unique_together_fileds(self, validated_data): + +# #这里相当于有id的话就把值拿出来,没有的话就直接给个None +# cruId = self.request.data.get('id', None) + +# goodstypes_data = validated_data['goodstypes'] +# goodsport_data = validated_data['goodsport'] +# if validated_data['goodstypes']: + +# #注释编号: django-vue3-admin_serializers110110:这goodstypes_data_list是存储子表单里面的数据条目数对应的类型ID,比如子表有7条数据,那这里就会拿到7个ID组到list里面 +# #子表里面有多少条数据就会有多少条数据在list里面 +# goodstypes_data_list = [] +# for item in goodstypes_data: +# goodstypes_data_list.append(item.id) +# #这里与上面的goodstypes_data_list是一一对应的,子表里面有多少条数据就会有多少条数据在list里面 +# goodsport_data_list = [] +# for item in goodsport_data: +# goodsport_data_list.append(item.id) + +# #index是下标,value是里面的值,对子表中第一个多对多字段对应的数据条目进行循环出来 +# for index, value in enumerate(goodstypes_data_list): + +# #这里拿到当前这一条数据对应在多对多字段的中间数据模型里面一共有多少条数据,都查出来,结果比如为A +# cru_obj_queryset= GoodstypesCrud.objects.filter(goodstype=value) +# # 这里对结果A的查询集进行循环每到里面的每个对像 +# for cru_obj in cru_obj_queryset: +# #拿到当前循环到的对象的对应cruddemomodel_id的值,注意这里肯定不是指前端提交过来的对象ID +# cru_obj_id = cru_obj.cruddemomodel_id +# #查询到当前cru_obj_id对应的所有对象查询集 +# goodsport_obj_queryset = GoodsportsCrud.objects.filter(cruddemomodel=cru_obj_id) +# #把对象查询集的值都转为pandas对应的DataFrame格式 +# df = pd.DataFrame(goodsport_obj_queryset.values()) + +# #再把df转为list,这时flist 能可结果是[1, 2, 3, 5, 6] +# dflist = df['goodstypeportmodel_id'].tolist() + +# #来到这里就直接判断子表中第二个多对多字段是否在dflist便可,如果存在就证明第一个多对多对象及第二个多对多对象的组合是有重叠存在的。 +# if goodsport_data_list[index] in dflist: + +# #如果查到重复的对象id与提交过来的对象ID不同,才是真正的重复,这里要过滤掉自己本身的数据 +# if cru_obj_id != cruId: +# #这里应该返回错误的提示,比如是什么值与什么值对应出错 +# detail = {'statu':False, 'msg': f"序号{index+1}的数据搭配已存在,请重新检查数据的可行性。" } +# return detail + + +# #这里如果完成没有错误必须要返回正常的信息回去给调用才行 +# return {'statu':True, 'msg': None } + +# 注释编号:django-vue3-admin_serializers490917 + + + + +class CrudDemoModelCreateUpdateSerializer(CustomModelSerializer): + """ + 创建/更新时的列化器 + """ + + + class Meta: + model = CrudDemoModel + fields = '__all__' + + + + + # 注释编号:django-vue3-admin_serializers391017 + # 功能说明:这里专门引入了两个多对多字段的联合唯一校验函数,这里也是属于序列化器校验的一种处理方法 + # def validate(self, validated_data): + # if self.request.data: + # ret = unique_together_fileds(self, validated_data) + # if ret['statu'] == False: + # raise serializers.ValidationError(detail=ret['msg']) + # return validated_data + +# 注释编号:django-vue3-admin_serializers391017 + + + + + +from .models import goodstype + +class goodsTypeSerializer(CustomModelSerializer): + """ + 序列化器 + """ + +#这里是进行了序列化模型及所有的字段 + class Meta: + model = goodstype + fields = "__all__" + +#这里是创建/更新时的列化器 +class goodsTypeCreateUpdateSerializer(CustomModelSerializer): + """ + 创建/更新时的列化器 + """ + + + class Meta: + model = goodstype + fields = '__all__' + + + + +from .models import goodstypeportModel + +class goodstypeportModelSerializer(CustomModelSerializer): + """ + 序列化器 + """ + +#这里是进行了序列化模型及所有的字段 + class Meta: + model = goodstypeportModel + fields = "__all__" + +#这里是创建/更新时的列化器 +class goodstypeportModelCreateUpdateSerializer(CustomModelSerializer): + """ + 创建/更新时的列化器 + """ + + + class Meta: + model = goodstypeportModel + fields = '__all__' \ No newline at end of file diff --git a/backend/crud_demo/tables/sub_crud_goods/models.py b/backend/crud_demo/tables/sub_crud_goods/models.py new file mode 100644 index 0000000000000000000000000000000000000000..0b7d744cc456710a1b7620efddcd4012ecc0c448 --- /dev/null +++ b/backend/crud_demo/tables/sub_crud_goods/models.py @@ -0,0 +1,59 @@ +from django.db import models +from dvadmin.utils.models import CoreModel + + + +class goodstypeModel1(CoreModel): + title = models.CharField(max_length=255, verbose_name="商品类型") + + def __str__(self): + return self.title + + class Meta: + verbose_name = '商品类型' + verbose_name_plural = verbose_name + ordering = ('-create_datetime',) + + +class goodsportModel1(CoreModel): + title = models.CharField(max_length=255, verbose_name="商品端口") + + + def __str__(self): + return self.title + + class Meta: + verbose_name = '商品端口' + verbose_name_plural = verbose_name + ordering = ('-create_datetime',) + + + +class goodsModel1(CoreModel): + goods = models.CharField(max_length=255, verbose_name="商品") + inventory = models.IntegerField(verbose_name="库存量") + goods_price = models.FloatField(verbose_name="商品定价") + purchase_goods_date = models.DateField(verbose_name="进货时间", blank=True, null=True) + + + # def __str__(self): + # return self.goods + + class Meta: + verbose_name = '商品表' + verbose_name_plural = verbose_name + ordering = ('-create_datetime',) + + +class goodsToOtherModel1(CoreModel): + goodsName= models.ForeignKey('goodsModel1', verbose_name="产品名称", on_delete=models.CASCADE) + goodstype= models.ForeignKey('goodstypeModel1', verbose_name="商品类型", on_delete=models.CASCADE) + goodsport= models.ForeignKey('goodsportModel1', verbose_name="商品端口", on_delete=models.CASCADE) + + # def __str__(self): + # return self.goodsName + + class Meta: + verbose_name = '商品详细信息表' + verbose_name_plural = verbose_name + ordering = ('-create_datetime',) \ No newline at end of file diff --git a/backend/crud_demo/tables/sub_crud_goods/serializers.py b/backend/crud_demo/tables/sub_crud_goods/serializers.py new file mode 100644 index 0000000000000000000000000000000000000000..c6bdc71d7f996b65ef667ec083513ca517cf8c12 --- /dev/null +++ b/backend/crud_demo/tables/sub_crud_goods/serializers.py @@ -0,0 +1,105 @@ +from dvadmin.utils.serializers import CustomModelSerializer +from rest_framework import serializers + + +from .models import goodsModel1, goodsToOtherModel1, goodsportModel1, goodstypeModel1 + +class goodsModel1Serializer(CustomModelSerializer): + """ + 序列化器 + """ + +#这里是进行了序列化模型及所有的字段 + class Meta: + model = goodsModel1 + fields = "__all__" + +#这里是创建/更新时的列化器 +class goodsModel1CreateUpdateSerializer(CustomModelSerializer): + """ + 创建/更新时的列化器 + """ + + + class Meta: + model = goodsModel1 + fields = '__all__' + + + +class goodsToOtherModel1Serializer(CustomModelSerializer): + """ + 序列化器 + """ + +#这里是进行了序列化模型及所有的字段 + class Meta: + model = goodsToOtherModel1 + fields = "__all__" + +#这里是创建/更新时的列化器 +class goodsToOtherModel1CreateUpdateSerializer(CustomModelSerializer): + """ + 创建/更新时的列化器 + """ + + + class Meta: + model = goodsToOtherModel1 + fields = '__all__' + + #注释编号: django-vue3-admin_serializers542711:这里做一个联合唯一的配置 + validators = [ + serializers.UniqueTogetherValidator( + queryset=goodsToOtherModel1.objects.all(), + fields=('goodstype', 'goodsport'), + message="商品类型及端口出现组合相同的情况,请修改成其它组合" + ) + ] + + + + +class goodsportModel1Serializer(CustomModelSerializer): + """ + 序列化器 + """ + +#这里是进行了序列化模型及所有的字段 + class Meta: + model = goodsportModel1 + fields = "__all__" + +#这里是创建/更新时的列化器 +class goodsportModel1CreateUpdateSerializer(CustomModelSerializer): + """ + 创建/更新时的列化器 + """ + + + class Meta: + model = goodsportModel1 + fields = '__all__' + + + +class goodstypeModel1Serializer(CustomModelSerializer): + """ + 序列化器 + """ + +#这里是进行了序列化模型及所有的字段 + class Meta: + model = goodstypeModel1 + fields = "__all__" + +#这里是创建/更新时的列化器 +class goodstypeModel1CreateUpdateSerializer(CustomModelSerializer): + """ + 创建/更新时的列化器 + """ + + + class Meta: + model = goodstypeModel1 + fields = '__all__' \ No newline at end of file diff --git a/backend/crud_demo/tables/sub_crud_goods/urls.py b/backend/crud_demo/tables/sub_crud_goods/urls.py new file mode 100644 index 0000000000000000000000000000000000000000..476f625b0acbde0e460be5a2f0b0287b0b7abdd4 --- /dev/null +++ b/backend/crud_demo/tables/sub_crud_goods/urls.py @@ -0,0 +1,19 @@ +from rest_framework.routers import SimpleRouter + +from .views import goodsModel1ViewSet, goodsToOtherModel1ViewSet, goodsportModel1ViewSet, goodstypeModel1ViewSet + + +router = SimpleRouter() +# 这里进行注册路径,并把视图关联上 +router.register("api/goodsModel1ViewSet", goodsModel1ViewSet) +router.register("api/goodsportModel1ViewSet", goodsportModel1ViewSet) +router.register("api/goodsToOtherModel1ViewSet", goodsToOtherModel1ViewSet) +router.register("api/goodstypeModel1ViewSet", goodstypeModel1ViewSet) + + + + +urlpatterns = [ + +] +urlpatterns += router.urls \ No newline at end of file diff --git a/backend/crud_demo/tables/sub_crud_goods/views.py b/backend/crud_demo/tables/sub_crud_goods/views.py new file mode 100644 index 0000000000000000000000000000000000000000..49ac43bdeeb56d0e0b55fcd0ed4a93fae1269183 --- /dev/null +++ b/backend/crud_demo/tables/sub_crud_goods/views.py @@ -0,0 +1,69 @@ +from dvadmin.utils.viewset import CustomModelViewSet + + +from .models import goodstypeModel1, goodsModel1, goodsportModel1, goodsToOtherModel1 + +from .serializers import goodstypeModel1Serializer, goodstypeModel1CreateUpdateSerializer +from .serializers import goodsModel1Serializer, goodsModel1CreateUpdateSerializer +from .serializers import goodsportModel1Serializer, goodsportModel1CreateUpdateSerializer +from .serializers import goodsToOtherModel1Serializer, goodsToOtherModel1CreateUpdateSerializer + + +class goodstypeModel1ViewSet(CustomModelViewSet): + """ + list:查询 + create:新增 + update:修改 + retrieve:单例 + destroy:删除 + """ + + queryset = goodstypeModel1.objects.all() + serializer_class = goodstypeModel1Serializer + create_serializer_class = goodstypeModel1CreateUpdateSerializer + update_serializer_class = goodstypeModel1CreateUpdateSerializer + + +class goodsModel1ViewSet(CustomModelViewSet): + """ + list:查询 + create:新增 + update:修改 + retrieve:单例 + destroy:删除 + """ + + queryset = goodsModel1.objects.all() + serializer_class = goodsModel1Serializer + create_serializer_class = goodsModel1CreateUpdateSerializer + update_serializer_class = goodsModel1CreateUpdateSerializer + + +class goodsportModel1ViewSet(CustomModelViewSet): + """ + list:查询 + create:新增 + update:修改 + retrieve:单例 + destroy:删除 + """ + + queryset = goodsportModel1.objects.all() + serializer_class = goodsportModel1Serializer + create_serializer_class = goodsportModel1CreateUpdateSerializer + update_serializer_class = goodsportModel1CreateUpdateSerializer + + +class goodsToOtherModel1ViewSet(CustomModelViewSet): + """ + list:查询 + create:新增 + update:修改 + retrieve:单例 + destroy:删除 + """ + + queryset = goodsToOtherModel1.objects.all() + serializer_class = goodsToOtherModel1Serializer + create_serializer_class = goodsToOtherModel1CreateUpdateSerializer + update_serializer_class = goodsToOtherModel1CreateUpdateSerializer \ No newline at end of file diff --git a/backend/crud_demo/tests.py b/backend/crud_demo/tests.py new file mode 100644 index 0000000000000000000000000000000000000000..7ce503c2dd97ba78597f6ff6e4393132753573f6 --- /dev/null +++ b/backend/crud_demo/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/backend/crud_demo/urls.py b/backend/crud_demo/urls.py new file mode 100644 index 0000000000000000000000000000000000000000..beeb4612bf63014fed5806a2f5039ead08e204da --- /dev/null +++ b/backend/crud_demo/urls.py @@ -0,0 +1,19 @@ +from rest_framework.routers import SimpleRouter + +from .views import CrudDemoModelViewSet, goodsTypeViewSet, goodstypeportModelViewSet + +router = SimpleRouter() +# 这里进行注册路径,并把视图关联上 +router.register("api/CrudDemoModelViewSet", CrudDemoModelViewSet) +router.register("api/goodstype", goodsTypeViewSet) +router.register("api/goodstypeportModel", goodstypeportModelViewSet) + + + +from django.urls import path, include +urlpatterns = [ + + path('',include('crud_demo.tables.sub_crud_goods.urls')), + +] +urlpatterns += router.urls \ No newline at end of file diff --git a/backend/crud_demo/views.py b/backend/crud_demo/views.py new file mode 100644 index 0000000000000000000000000000000000000000..6d3a89d9cacd2b3536e6f5701d855bb6239abd14 --- /dev/null +++ b/backend/crud_demo/views.py @@ -0,0 +1,89 @@ +# Create your views here. +from crud_demo.models import CrudDemoModel +from crud_demo.serializers import CrudDemoModelSerializer, CrudDemoModelCreateUpdateSerializer +from dvadmin.utils.viewset import CustomModelViewSet + +from .modelFilter import goodsFilter + + +class CrudDemoModelViewSet(CustomModelViewSet): + """ + list:查询 + create:新增 + update:修改 + retrieve:单例 + destroy:删除 + """ + + #注释编号:django-vue3-admin__views181311:码开始行 + # export_field_label = { + # "goods": "商品", + # "inventory": "库存量", + # "goods_price":"商品定价", + # "purchase_goods_date": "进货时间", + # } + + # export_serializer_class = CrudDemoModelSerializer + #注释编号:django-vue3-admin__views181311:代码结束行 + + #注释编号:django-vue3-admin__views402916:代码开始行 + #功能说明: + # import_field_dict = { + # "goods": "商品", + # "inventory": "库存量", + # "goods_price":"商品定价", + # "purchase_goods_date": "进货时间", + # } + + # import_serializer_class = CrudDemoModelSerializer + + queryset = CrudDemoModel.objects.all() + serializer_class = CrudDemoModelSerializer + create_serializer_class = CrudDemoModelCreateUpdateSerializer + update_serializer_class = CrudDemoModelCreateUpdateSerializer + + #注释编号: django-vue3-admin_views112816:配置自定义过滤器filter_class = goodsFilter + filter_class = goodsFilter + + + + + + +from .models import goodstype +from .serializers import goodsTypeSerializer,goodsTypeSerializer +class goodsTypeViewSet(CustomModelViewSet): + """ + list:查询 + create:新增 + update:修改 + retrieve:单例 + destroy:删除 + """ + + queryset = goodstype.objects.all() + serializer_class = goodsTypeSerializer + create_serializer_class = goodsTypeSerializer + update_serializer_class = goodsTypeSerializer + search_fields = ['title'] + + + + +from .models import goodstypeportModel +from .serializers import goodstypeportModelSerializer,goodstypeportModelSerializer +class goodstypeportModelViewSet(CustomModelViewSet): + """ + list:查询 + create:新增 + update:修改 + retrieve:单例 + destroy:删除 + """ + + queryset = goodstypeportModel.objects.all() + serializer_class = goodstypeportModelSerializer + create_serializer_class = goodstypeportModelSerializer + update_serializer_class = goodstypeportModelSerializer + search_fields = ['title'] + \ No newline at end of file diff --git a/backend/del_migrations.py b/backend/del_migrations.py index d649e051d6f6294f61630d7ef54c06e83519969d..55beb6e7685d83afacbf8e565bff9a1f12dae654 100644 --- a/backend/del_migrations.py +++ b/backend/del_migrations.py @@ -2,7 +2,7 @@ import os -exclude = ["venv"] # 需要排除的文件目录 +exclude = ["31343b8ee171d315115050f7010977c7_venv"] # 需要排除的文件目录 for root, dirs, files in os.walk('.'): dirs[:] = list(set(dirs) - set(exclude)) if 'migrations' in dirs: diff --git a/backend/dvadmin/utils/import_export.py b/backend/dvadmin/utils/import_export.py index 2bd6e1e8a5490cab9225d3daa5656cbd44b7fd0b..c497da09851d9856b2fcbd95c402ec794b8e76cc 100644 --- a/backend/dvadmin/utils/import_export.py +++ b/backend/dvadmin/utils/import_export.py @@ -9,7 +9,7 @@ from django.conf import settings from dvadmin.utils.validator import CustomValidationError -def import_to_data(file_url, field_data, m2m_fields=None): +def import_to_data(file_url, field_data, serializer_fields, m2m_fields=None): """ 读取导入的excel文件 :param file_url: @@ -17,8 +17,16 @@ def import_to_data(file_url, field_data, m2m_fields=None): :param m2m_fields: 多对多字段 :return: """ + # 注释编号:django-vue3-admin__import_export480718:代码开始行 + # 功能说明: + #当前BASE_DIR是在后端的目录内,我们应该再返回上一层,至整个前后端根目录然后再拼接上传文件路径为file_path_dir + #当然这里是有问题的,应该前端上传文件时,直接提交至后端接收,并存放在后端目录才是,要不就做不到前后端分离了 + base_url = settings.BASE_DIR.parent + file_path_dir = os.path.join(base_url, file_url) + #注释编号:django-vue3-admin__import_export480718:代码结束行 + + # 读取excel 文件 - file_path_dir = os.path.join(settings.BASE_DIR, file_url) workbook = openpyxl.load_workbook(file_path_dir) table = workbook[workbook.sheetnames[0]] theader = tuple(table.values)[0] #Excel的表头 @@ -50,20 +58,30 @@ def import_to_data(file_url, field_data, m2m_fields=None): for index, item in enumerate(field_data.items()): items = list(item) key = items[0] - values = items[1] - value_type = 'str' - if isinstance(values, dict): - value_type = values.get('type','str') + + + #这里注释部分是为作者所写 + # values = items[1] + # value_type = 'str' + # if isinstance(values, dict): + # value_type = values.get('type','str') + + # 注释编号:django-vue3-admin__import_export083211 + # 功能说明:这里对字段类型进行提取 + value_type = 'str' #默认为str字符串 + value_type = type(serializer_fields[key]).__name__ + # 注释编号:django-vue3-admin__import_export083211 + cell_value = table.cell(row=row + 1, column=index + 2).value + if cell_value is None or cell_value=='': continue - elif value_type == 'date': - print(61, datetime.strptime(str(cell_value), '%Y-%m-%d %H:%M:%S').date()) + elif value_type == 'DateField': # 注释编号:django-vue3-admin__import_export143411:如果只是时间字段就进行特殊处理 try: cell_value = datetime.strptime(str(cell_value), '%Y-%m-%d %H:%M:%S').date() except: raise CustomValidationError('日期格式不正确') - elif value_type == 'datetime': + elif value_type == 'DateTimeField': # 注释编号:django-vue3-admin__import_export253511:如果是日期时间字段进行特殊处理 cell_value = datetime.strptime(str(cell_value), '%Y-%m-%d %H:%M:%S') else: # 由于excel导入数字类型后,会出现数字加 .0 的,进行处理 diff --git a/backend/dvadmin/utils/import_export_mixin.py b/backend/dvadmin/utils/import_export_mixin.py index 44f51cc5841ea7a56cbe9c3de75d7cc812c7abfe..0d95560c395472bd87a213c807b1302ff28ce7e2 100644 --- a/backend/dvadmin/utils/import_export_mixin.py +++ b/backend/dvadmin/utils/import_export_mixin.py @@ -14,6 +14,16 @@ from dvadmin.utils.import_export import import_to_data from dvadmin.utils.json_response import DetailResponse from dvadmin.utils.request_util import get_verbose_name +#注释编号: django-vue3-admin_import_export_mixin490812: 导出需求,主要是针对归属部门进行特殊处理 +from dvadmin.system.models import Dept + + +import pandas as pd +import codecs +import numpy as np + + + class ImportSerializerMixin: """ @@ -144,7 +154,13 @@ class ImportSerializerMixin: if hasattr(ele, "many_to_many") and ele.many_to_many == True ] import_field_dict = {'id':'更新主键(勿改)',**self.import_field_dict} - data = import_to_data(request.data.get("url"), import_field_dict, m2m_fields) + + # 注释编号:django-vue3-admin__import_export_mixin550918:代码开始行 + # 功能说明:这里增加了一个serializer_fields字段传进函数,主要是为了后面再验证字段类型使用的 + serializer_fields = self.get_serializer().get_fields() + data = import_to_data(request.data.get("url"), import_field_dict, serializer_fields, m2m_fields) + # 注释编号:django-vue3-admin__import_export_mixin550918:代码结束行 + for ele in data: filter_dic = {'id':ele.get('id')} instance = filter_dic and queryset.filter(**filter_dic).first() @@ -288,6 +304,10 @@ class ExportSerializerMixin: length += 2.1 if ord(char) > 256 else 1 return round(length, 1) if length <= self.export_column_width else self.export_column_width + + # 注释编号:django-vue3-admin_import_export_mixin564615 + # 功能说明:这一块是使用pandas进行配置导出的功能 + @action(methods=['get'],detail=False) def export_data(self, request: Request, *args, **kwargs): """ @@ -296,50 +316,129 @@ class ExportSerializerMixin: :param args: :param kwargs: :return: - """ + """ queryset = self.filter_queryset(self.get_queryset()) - assert self.export_field_label, "'%s' 请配置对应的导出模板字段。" % self.__class__.__name__ - assert self.export_serializer_class, "'%s' 请配置对应的导出序列化器。" % self.__class__.__name__ - data = self.export_serializer_class(queryset, many=True, request=request).data - # 导出excel 表 + # assert self.export_field_label, "'%s' 请配置对应的导出模板字段。" % self.__class__.__name__ + + # 配置导出csv,不要导出excel表,因为excel表导出太慢了,容易超时 response = HttpResponse(content_type="application/msexcel") response["Access-Control-Expose-Headers"] = f"Content-Disposition" - response["content-disposition"] = f'attachment;filename={quote(str(f"导出{get_verbose_name(queryset)}.xlsx"))}' - wb = Workbook() - ws = wb.active - header_data = ["序号", *self.export_field_label.values()] - hidden_header = ["#", *self.export_field_label.keys()] - df_len_max = [self.get_string_len(ele) for ele in header_data] - row = get_column_letter(len(self.export_field_label) + 1) - column = 1 - ws.append(header_data) - for index, results in enumerate(data): - results_list = [] - for h_index, h_item in enumerate(hidden_header): - for key,val in results.items(): - if key == h_item: - if val is None or val=="": - results_list.append("") - else: - results_list.append(val) - # 计算最大列宽度 - result_column_width = self.get_string_len(val) - if h_index !=0 and result_column_width > df_len_max[h_index]: - df_len_max[h_index] = result_column_width - ws.append([index + 1, *results_list]) - column += 1 - #  更新列宽 - for index, width in enumerate(df_len_max): - ws.column_dimensions[get_column_letter(index + 1)].width = width - tab = Table(displayName="Table", ref=f"A1:{row}{column}") # 名称管理器 - style = TableStyleInfo( - name="TableStyleLight11", - showFirstColumn=True, - showLastColumn=True, - showRowStripes=True, - showColumnStripes=True, - ) - tab.tableStyleInfo = style - ws.add_table(tab) - wb.save(response) + + + cur_model = queryset.model # 拿到当前queryset对应的model + + + + # 注释编号:django-vue3-admin_import_export_mixin254314 + # 功能说明:在这里判断是否在传进来export_field_label,如果有,就按export_field_label的需求导出,如果没有,就自己拼接,导出所有数据 + #这里主要就是对于导出来列名进行处理,有外键的折拼接上_id后缀,而没有的,直接放在export_field_label里面,并且把对应的中文名称verbose_name也加上字段内 + + if self.export_field_label: + key_list = list(self.export_field_label.keys()) + else: + #这里就要自己拼接出来一个字典,字典格式如下 + # export_field_label = {"title": "区域",} + export_field_label = {} + for field in cur_model._meta.fields: + field_name = None + if field.many_to_one: + field_name = field.name + '_id' #这里还要组装一下_id的后缀 + export_field_label[field_name] = field.verbose_name + else: + field_name = field.name #这里就不需要再拼接_id + export_field_label[field_name] = field.verbose_name + + key_list = list(export_field_label.keys()) + # 注释编号:django-vue3-admin_import_export_mixin254314 + + + + try: + #将queryset数据转为pandas对应的DataFrame数据,而且只取相应的列数据出来columns=key_list + #这个df数据就是已经序列好的数据 + df = pd.DataFrame(queryset.values(), columns=key_list) + except: + pass + + + # 注释编号:django-vue3-admin_import_export_mixin285910 + # 功能说明:这里是对于导出来列内容的处理,主要是处理那些外健导出来是要转为对应的外健的值,而不是直接导出来外健的ID + + + for key in key_list: + #这里是判断export_field_label中的key是否传有带_id的字段过来,如果有,就说明想导出相应的外健对应的值 + # 如果两个值不等,那说明要是导出外健对应的值的 + newKey = key.replace('_id', '') + + if newKey != key: + try: + #这里是拿到当前cur_model对应的newKey的外健对象的所有值并转为这字典 + + if key == "dept_belong_id": # 这里专门对归属部门一项进行特殊处理 + Dept_queryset = Dept.objects.all() + choices_dict = pd.DataFrame(Dept_queryset.values(), columns=["id", "name"]) #只拿其中的id与name字段便可,其它的不需要了。 + choices_dict = dict(choices_dict.values.tolist()) #要先拿到df的values先转为tolist,再全部转为dict便可 + df[f'{key}'] = pd.to_numeric(df[f'{key}'], errors='coerce') # 将字符串转为数字num + else: + #注释编号: django-vue3-admin-import_export_mixin031018:这里如果相应的newkey对应的外键返回不是str类型,那就无法正常导出,解决方法就是在model里面配置__str__方法return一个string类型的值 + choices_dict = dict(getattr(cur_model, newKey).field.get_choices()) + df[f'{key}'] = df[f'{key}'].replace(choices_dict) + except Exception as e : + # 注释编号:django-vue3-admin-import_export_mixin111316 + # 功能说明:这里status=599要与前端自定义的error_code=599对应上,不然前端无法识别到错误 + # 功能说明:这里要判断一下是出现什么错误,如果是出现'__str__ returned non-string (type int)'错误,就返回一个status=599的HttpResponse + if (str(e) == "__str__ returned non-string (type int)"): + return HttpResponse(status=599) + # 注释编号:django-vue3-admin-import_export_mixin111316 + else: + #即是出现其它错误如'NoneType' object has no attribute 'model'不用理会 + pass + + elif key == 'modifier': #这里专门对修改人的一项进行特殊处理 + choices_dict = dict(getattr(cur_model, 'creator').field.get_choices()) + df[f'{key}'] = pd.to_numeric(df[f'{key}'], errors='coerce') # 将字符串转为数字num + df[f'{key}'] = df[f'{key}'].replace(choices_dict) + + + # 注释编号:django-vue3-admin_import_export_mixin285910 + + + #列名根据当前export_field_label传过来的字典进行匹配更换,要判断一下是使用传进来的需求,还是自己拼接所有字段 + if self.export_field_label: + df = df.rename(columns=dict(self.export_field_label)) + else: + df = df.rename(columns=dict(export_field_label)) + + + # 注释编号:django-vue3-admin_import_export_mixin382615 + # 功能说明:处理可能存在的一些=号被视为公式的问题,如果有=开头数据,直接替换为,但是这样只要=开头的数据就会直接整个数据被替换掉了,这样不合理的 + # def clear_formula(cell): + # if isinstance(cell, str) and cell.startswith("="): + # return np.nan # 将公式置为NaN,这样在导出时就不会被当作公式了 + # return cell + # df = df.applymap(clear_formula) + # 注释编号:django-vue3-admin_import_export_mixin382615 + + + # 注释编号:django-vue3-admin_import_export_mixin532815 + # 功能说明:如果在导出csv文档就启用这里 + response["content-disposition"] = f'attachment;filename={quote(str(f"导出{get_verbose_name(queryset)}.csv"))}' + response.write(codecs.BOM_UTF8) # 这里是为了防止写入csv文件时出现乱码 + df.to_csv(response, index=False) # 这个是最终处理好的数据传给response对象,最终返回给前端下载,index=False是说明不添加 + # 注释编号:django-vue3-admin_import_export_mixin532815 + + + # 注释编号:django-vue3-admin_import_export_mixin372915 + # 功能说明:如果是导xlsx文档就启用这里 + # response["content-disposition"] = f'attachment;filename={quote(str(f"导出{get_verbose_name(queryset)}.xlsx"))}' + # df.to_excel(response, index=False) + # 注释编号:django-vue3-admin_import_export_mixin372915 + + + return response + # 把处理好的response返回去给前端 + # ---------------这个函数是制作导出csv功能的 + + # 注释编号:django-vue3-admin_import_export_mixin564615 + diff --git a/backend/dvadmin/utils/models.py b/backend/dvadmin/utils/models.py index fb0c2ba70a5035c540634a773fe25815246e50d6..99f65307c0cd25e1cb8f30fda1dd7c7dd15f4c53 100644 --- a/backend/dvadmin/utils/models.py +++ b/backend/dvadmin/utils/models.py @@ -64,13 +64,15 @@ class SoftDeleteModel(models.Model): self.save(using=using) + class CoreModel(models.Model): """ 核心标准抽象模型模型,可直接继承使用 增加审计字段, 覆盖字段时, 字段名称请勿修改, 必须统一审计字段名称 """ id = models.BigAutoField(primary_key=True, help_text="Id", verbose_name="Id") - description = models.CharField(max_length=255, verbose_name="描述", null=True, blank=True, help_text="描述") + # 这里我进行了修改,原代码是description = models.CharField(max_length=255, verbose_name="描述", null=True, blank=True, help_text="描述") + description = models.TextField(verbose_name="描述", null=True, blank=True, default=None, help_text="描述") creator = models.ForeignKey(to=settings.AUTH_USER_MODEL, related_query_name='creator_query', null=True, verbose_name='创建人', help_text="创建人", on_delete=models.SET_NULL, db_constraint=False) @@ -114,30 +116,70 @@ def get_all_models_objects(model_name=None): return settings.ALL_MODELS_OBJECTS or {} +from django.apps import apps +import importlib +import pkgutil +import inspect + +def find_modules(app_module): + """ + 递归查找给定模块及其子模块 + """ + modules = None + for _, submodule_name, is_pkg in pkgutil.iter_modules(app_module.__path__): + full_module_name = f"{app_module.__name__}.{submodule_name}" + submodule = importlib.import_module(full_module_name) + modules.append(submodule) + if is_pkg: + modules.extend(find_modules(submodule)) + return modules + + +# 注释编号:django-vue3-admin-models331110 +# 功能说明:修改拿到model class的方法,以便那怕model.py文件不在对应的app根目录,也能拿到models def get_model_from_app(app_name): """获取模型里的字段""" - model_module = import_module(app_name + '.models') - filter_model = [ - getattr(model_module, item) for item in dir(model_module) - if item != 'CoreModel' and issubclass(getattr(model_module, item).__class__, models.base.ModelBase) - ] + model_list = [] - for model in filter_model: - if model.__name__ == 'AbstractUser': - continue - fields = [ - {'title': field.verbose_name, 'name': field.name, 'object': field} - for field in model._meta.fields + + try: + # 注释编号:django-vue3-admin-models111112 + # 功能说明:因为model.py文件不在对应的app根目录,所以必须要使用如下方法拿到models + app_config = apps.get_app_config(app_name) + model_module_dict = app_config.models + filter_model = [] + if bool(model_module_dict): # 判断是否为空 + for model_name, model_class in model_module_dict.items(): + filter_model.append(model_class) + # 注释编号:django-vue3-admin-models111112 + except Exception as e: + #注释编号: django-vue3-admin-models280912:如果上面的代码出现错误,那只能使用如下方法进行导入model了,这种方法是当前的model.py文件在对应的apps.py根目录下才行的 + model_module = import_module(app_name + '.models') + filter_model = [ + getattr(model_module, item) for item in dir(model_module) + if item != 'CoreModel' and issubclass(getattr(model_module, item).__class__, models.base.ModelBase) ] - model_list.append({ - 'app': app_name, - 'verbose': model._meta.verbose_name, - 'model': model.__name__, - 'object': model, - 'fields': fields - }) + + + if bool(filter_model): # 判断是否为空 + for model in filter_model: + if model.__name__ == 'AbstractUser': + continue + fields = [ + {'title': field.verbose_name, 'name': field.name, 'object': field} + for field in model._meta.fields + ] + model_list.append({ + 'app': app_name, + 'verbose': model._meta.verbose_name, + 'model': model.__name__, + 'object': model, + 'fields': fields + }) return model_list +# 注释编号:django-vue3-admin-models331110 + def get_custom_app_models(app_name=None): """ diff --git a/backend/dvadmin/utils/serializers.py b/backend/dvadmin/utils/serializers.py index 5dd9527514a111245408c111ec73782c3e3694c8..bb629063df5cf51074167e51bcbe7714d1293f29 100644 --- a/backend/dvadmin/utils/serializers.py +++ b/backend/dvadmin/utils/serializers.py @@ -52,7 +52,7 @@ class CustomModelSerializer(DynamicFieldsMixin, ModelSerializer): format="%Y-%m-%d %H:%M:%S", required=False, read_only=True ) update_datetime = serializers.DateTimeField( - format="%Y-%m-%d %H:%M:%S", required=False + format="%Y-%m-%d %H:%M:%S", required=False, read_only=True ) def __init__(self, instance=None, data=empty, request=None, **kwargs): diff --git a/backend/dvadmin/utils/viewset.py b/backend/dvadmin/utils/viewset.py index b85007a0a03c36a68571f37a1c964f4f03a77e2d..65d7d64919175cc4760a88b8b91fed784a13ba73 100644 --- a/backend/dvadmin/utils/viewset.py +++ b/backend/dvadmin/utils/viewset.py @@ -22,7 +22,7 @@ from dvadmin.utils.models import get_custom_app_models, CoreModel from dvadmin.system.models import FieldPermission, MenuField from django_restql.mixins import QueryArgumentsMixin - +# 继承了通用序列化视图ModelViewSet,自定义的导入类ImportSerializerMixin,自定义的导出类ExportSerializerMixin及django自带的对查询参数处理的类QueryArgumentsMixin class CustomModelViewSet(ModelViewSet, ImportSerializerMixin, ExportSerializerMixin, QueryArgumentsMixin): """ 自定义的ModelViewSet: @@ -147,3 +147,23 @@ class CustomModelViewSet(ModelViewSet, ImportSerializerMixin, ExportSerializerMi return SuccessResponse(data=[], msg="删除成功") else: return ErrorResponse(msg="未获取到keys字段") + + + + # 注释编号:django-vue3-admin_viewset005916 + # 功能说明:统一为所有views注册一条后缀为getbyIds的路由,匹配所有懒加载的标准代码 + + @action(methods=['post'], detail=False) + def getbyIds(self, request, *args, **kwargs): + try: + idList = request.data['values'] #获取前端传过来 + except: + return DetailResponse(data=queryset, msg="没有传values到后端, 即是id列表") + + cur_model = self.get_queryset().model #查到当前的model + + queryset = cur_model.objects.filter(id__in=idList) #过滤出来前端传过来的list列表里面的对象 + queryset = list(queryset.values()) + + return DetailResponse(data=queryset, msg="获取成功") + # 注释编号:django-vue3-admin_viewset005916 diff --git a/backend/gunicorn_conf.py b/backend/gunicorn_conf.py deleted file mode 100644 index ca2fb3235626f17cb81395d4f82794f044bc8d16..0000000000000000000000000000000000000000 --- a/backend/gunicorn_conf.py +++ /dev/null @@ -1,48 +0,0 @@ -# gunicorn.conf -# coding:utf-8 -# 启动命令:gunicorn -c gunicorn.py application.asgi:application -import multiprocessing -# 并行工作进程数, int,cpu数量*2+1 推荐进程数 -workers = multiprocessing.cpu_count() * 2 + 1 -# 指定每个进程开启的线程数 -threads = 3 -# 绑定的ip与端口 -bind = '0.0.0.0:8000' -# 设置守护进程,将进程交给第三方管理 -daemon = 'false' -# 工作模式协程,默认的是sync模式,推荐使用 gevent,此处使用与uvicorn配合使用 uvicorn.workers.UvicornWorker -worker_class = 'uvicorn.workers.UvicornWorker' -# 设置最大并发量(每个worker处理请求的工作线程数,正整数,默认为1) -worker_connections = 10000 -# 最大客户端并发数量,默认情况下这个值为1000。此设置将影响gevent和eventlet工作模式 -# 每个工作进程将在处理max_requests请求后自动重新启动该进程 -max_requests = 10000 -max_requests_jitter = 200 -# 设置进程文件目录 -pidfile = './gunicorn.pid' -# 日志级别,这个日志级别指的是错误日志的级别,而访问日志的级别无法设置 -loglevel = 'info' -# 设置gunicorn访问日志格式,错误日志无法设置 -access_log_format = '' # worker_class 为 uvicorn.workers.UvicornWorker 时,日志格式为Django的loggers -# 监听队列 -backlog = 512 -#进程名 -proc_name = 'gunicorn_process' -# 设置超时时间120s,默认为30s。按自己的需求进行设置timeout = 120 -timeout = 120 -# 超时重启 -graceful_timeout = 300 -# 在keep-alive连接上等待请求的秒数,默认情况下值为2。一般设定在1~5秒之间。 -keepalive = 3 -# HTTP请求行的最大大小,此参数用于限制HTTP请求行的允许大小,默认情况下,这个值为4094。 -# 值是0~8190的数字。此参数可以防止任何DDOS攻击 -limit_request_line = 5120 -# 限制HTTP请求中请求头字段的数量。 -# 此字段用于限制请求头字段的数量以防止DDOS攻击,与limit-request-field-size一起使用可以提高安全性。 -# 默认情况下,这个值为100,这个值不能超过32768 -limit_request_fields = 101 -# 限制HTTP请求中请求头的大小,默认情况下这个值为8190。 -# 值是一个整数或者0,当该值为0时,表示将对请求头大小不做限制 -limit_request_field_size = 0 -# 记录到标准输出 -accesslog = '-' diff --git a/backend/it_mis/__init__.py b/backend/it_mis/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/backend/it_mis/admin.py b/backend/it_mis/admin.py new file mode 100644 index 0000000000000000000000000000000000000000..8c38f3f3dad51e4585f3984282c2a4bec5349c1e --- /dev/null +++ b/backend/it_mis/admin.py @@ -0,0 +1,3 @@ +from django.contrib import admin + +# Register your models here. diff --git a/backend/it_mis/apps.py b/backend/it_mis/apps.py new file mode 100644 index 0000000000000000000000000000000000000000..c1c11534e412b6f77e741d2d882c59c2212bba84 --- /dev/null +++ b/backend/it_mis/apps.py @@ -0,0 +1,8 @@ +from django.apps import AppConfig + + +class ItMisConfig(AppConfig): + default_auto_field = 'django.db.models.BigAutoField' + name = 'it_mis' + def ready(self): + import it_mis.signals \ No newline at end of file diff --git a/backend/it_mis/migrations/__init__.py b/backend/it_mis/migrations/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/backend/it_mis/signals.py b/backend/it_mis/signals.py new file mode 100644 index 0000000000000000000000000000000000000000..3b8a0655eb882ff4b9f936e3399a7093f644b25e --- /dev/null +++ b/backend/it_mis/signals.py @@ -0,0 +1,7 @@ +# 注释编号:django-vue3-admin_signals272714 +# 功能说明:调用ItResourceTables的信号器 + +from .tables.ItResourceTables.signals import ItResource_created_post_save + +# 注释编号:django-vue3-admin_signals272714 + diff --git a/backend/it_mis/tables/ItNetInfoTables/modelFilter.py b/backend/it_mis/tables/ItNetInfoTables/modelFilter.py new file mode 100644 index 0000000000000000000000000000000000000000..2d7d59eb3f1bbe11b148f733c94c632e614664bc --- /dev/null +++ b/backend/it_mis/tables/ItNetInfoTables/modelFilter.py @@ -0,0 +1,29 @@ + +import django_filters +from django.db.models import Q + + +from it_mis.tables.ItNetInfoTables.models import ItNetInfo + + +class ItNetInfoFilter(django_filters.rest_framework.FilterSet): + + title = django_filters.CharFilter(method='filter_custom') + + + + # 在这个自定义方法中构建您的查询条件 + def filter_custom(self, queryset, name, value): + q1 = Q(title__icontains=value) + q2 = Q(user__icontains=value) + q3 = Q(ipv4__icontains=value) + + # 使用 | 运算符将它们组合为一个 "或" 查询条件 + combined_q = q1 | q2 | q3 + + return queryset.filter(combined_q) + + + class Meta: + model = ItNetInfo + fields = "__all__" #这里配置所有字段可查 diff --git a/backend/it_mis/tables/ItNetInfoTables/models.py b/backend/it_mis/tables/ItNetInfoTables/models.py new file mode 100644 index 0000000000000000000000000000000000000000..950c887fc0ad43283b0efd7b5523762a334afad6 --- /dev/null +++ b/backend/it_mis/tables/ItNetInfoTables/models.py @@ -0,0 +1,90 @@ + +from django.db import models +from dvadmin.utils.models import CoreModel + +from PublicResource.tables.OrganizationTables.models import AreaModel, CompanyModel, DepartmentModel + + +class ItNetType(CoreModel): + title = models.CharField(verbose_name="网络资源类型", unique=True, max_length=64, blank=False) + + + class Meta: + verbose_name = "网络资源类型" + verbose_name_plural = verbose_name + ordering = ("-create_datetime",) + + +class NetSpeed(CoreModel): + title = models.CharField(verbose_name="网络速率", max_length=64, blank=False) + other_info = models.CharField(verbose_name="其它信息", max_length=64, blank=False, help_text="如拨号、城域专线上下行对等及其它信息描述") + + class Meta: + verbose_name = "网络速率" + verbose_name_plural = verbose_name + ordering = ("-create_datetime",) + + +class ItNetInfo(CoreModel): + area = models.ForeignKey(to=AreaModel, verbose_name="区域", related_name="ItNetInfo_area", null=True, default=None, on_delete=models.PROTECT) + company = models.ForeignKey(to=CompanyModel, verbose_name="公司", related_name="ItNetInfo_company", null=True, default=None, on_delete=models.PROTECT) + department = models.ForeignKey(to=DepartmentModel, verbose_name="部门", related_name="ItNetInfo_department",null=True, default=None, on_delete=models.PROTECT) + title = models.CharField(verbose_name="资源名称", max_length=64, blank=False) + suppliers = models.ForeignKey("Suppliers", verbose_name="供应商", blank=False, null=True, default=None, on_delete=models.PROTECT) + type = models.ForeignKey("ItNetType", verbose_name="资源类型", blank=True, null=True, on_delete=models.PROTECT) + netspeed = models.ForeignKey('NetSpeed', verbose_name="网络速率", blank=True, null=True, default=None, on_delete=models.PROTECT) + code = models.CharField(verbose_name="编码/编号", max_length=64, blank=True, null=True) + user = models.CharField(verbose_name="使用帐号", max_length=64, blank=True, null=True) + password = models.CharField(verbose_name="使用密码", max_length=64, blank=True, null=True) + ipv4 = models.CharField(verbose_name="ipv4地址", max_length=64, blank=True, null=True, help_text="这里由前端限制IP地址格式传至后端") + submask = models.CharField(verbose_name="子网掩码", max_length=64, blank=True, null=True, help_text="这里由前端限制IP地址格式传至后端") + gateway = models.CharField(verbose_name="网关", max_length=64, blank=True, null=True, help_text="这里由前端限制IP地址格式传至后端") + DNS1 = models.CharField(verbose_name="主DNS", max_length=64, blank=True, null=True, help_text="这里由前端限制IP地址格式传至后端") + DNS2 = models.CharField(verbose_name="备DNS", max_length=64, blank=True, null=True, help_text="这里由前端限制IP地址格式传至后端") + # contract = models.ForeignKey("ItInfoContract", verbose_name="合同", blank=True, null=True) + + #use_status在全局字典当中1表示在用,2表示未用,默认使用2表示未使用状态,该字典由CharField修改为IntegerField,这样前端配置dict-select时,才不会有问题 + use_status = models.IntegerField(verbose_name="使用状态", blank=False, default="2", help_text="此状态不可手动修改") + + used_by = models.ForeignKey("ItResource", verbose_name="被使用者", blank=True, null=True, \ + default=None , help_text="被谁引用或使用,系统自动生成不用填过", on_delete=models.PROTECT) + + used_by_port = models.ForeignKey('DevicePortModel', verbose_name="设备端口", blank=False, null=True, default=None, on_delete=models.PROTECT) + other_description = models.CharField(verbose_name="其它信息", max_length=255, blank=True, null=True, help_text="这里的信息主要是由ItNetInfoSubModel子表description传过来的") + + + class Meta: + verbose_name = "网络资源" + verbose_name_plural = verbose_name + ordering = ("-create_datetime",) + + +class DevicePortModel(CoreModel): + title = models.CharField(verbose_name="设备端口", unique=True, max_length=64, blank=False) + + class Meta: + verbose_name = "设备端口" + verbose_name_plural = verbose_name + # ordering = ("title",) + + + +# 注释编号:django-vue3-admin_models545115 +# 功能说明:这里便是第三张,隐藏表,子表的设计了. + +class ItNetInfoSubModel(CoreModel): + #注释编号: django-vue3-admin_models315211:这里要配置成一对一的字段,因为一条光纤网络只能接入一个端口 + itnetinfo = models.OneToOneField('ItNetInfo', verbose_name="网络资源信息", blank=True, null=True, default=None, on_delete=models.PROTECT) + device_port = models.ForeignKey('DevicePortModel', verbose_name="设备端口", blank=True, null=True, default=None, on_delete=models.PROTECT) + + #这个字段前端不可手动修改,这里即就是parentId + parentId = models.ForeignKey("ItResource", verbose_name="被使用者", blank=True, null=True, \ + default=None , on_delete=models.PROTECT) + #这个字段前端不可手动修改 + use_status = models.CharField(verbose_name="使用状态", max_length=64, blank=False, default="已用", help_text="此状态不可手动修改") + + class Meta: + verbose_name = "网络资源子表" + verbose_name_plural = verbose_name + +# 注释编号:django-vue3-admin_models545115 \ No newline at end of file diff --git a/backend/it_mis/tables/ItNetInfoTables/serializers.py b/backend/it_mis/tables/ItNetInfoTables/serializers.py new file mode 100644 index 0000000000000000000000000000000000000000..c1390fcdc5b2ef4886f202df2b6deb7934c3f409 --- /dev/null +++ b/backend/it_mis/tables/ItNetInfoTables/serializers.py @@ -0,0 +1,159 @@ + +from dvadmin.utils.serializers import CustomModelSerializer +from rest_framework import serializers + + + +from .models import ItNetType +class ItNetTypeSerializer(CustomModelSerializer): + """ + 序列化器 + """ + + class Meta: + model = ItNetType + fields = "__all__" + +class ItNetTypeCreateUpdateSerializer(CustomModelSerializer): + """ + 创建/更新时的列化器 + """ + + class Meta: + model = ItNetType + fields = '__all__' + + +from .models import NetSpeed +class NetSpeedSerializer(CustomModelSerializer): + """ + 序列化器 + """ + + class Meta: + model = NetSpeed + fields = "__all__" + +class NetSpeedCreateUpdateSerializer(CustomModelSerializer): + """ + 创建/更新时的列化器 + """ + + class Meta: + model = NetSpeed + fields = '__all__' + +from .models import ItNetInfo +class ItNetInfoSerializer(CustomModelSerializer): + """ + 序列化器 + """ + + class Meta: + model = ItNetInfo + fields = "__all__" + +class ItNetInfoCreateUpdateSerializer(CustomModelSerializer): + """ + 创建/更新时的列化器 + """ + + class Meta: + model = ItNetInfo + fields = '__all__' + + + +from .models import DevicePortModel +class DevicePortModelSerializer(CustomModelSerializer): + """ + 序列化器 + """ + + class Meta: + model = DevicePortModel + fields = "__all__" + +class DevicePortModelCreateUpdateSerializer(CustomModelSerializer): + """ + 创建/更新时的列化器 + """ + + class Meta: + model = DevicePortModel + fields = '__all__' + + +from .models import ItNetInfoSubModel +class ItNetInfoSubModelSerializer(CustomModelSerializer): + """ + 序列化器 + """ + + class Meta: + model = ItNetInfoSubModel + fields = "__all__" + + + +class ItNetInfoSubModelCreateUpdateSerializer(CustomModelSerializer): + """ + 创建/更新时的列化器 + """ + + class Meta: + model = ItNetInfoSubModel + fields = '__all__' + + + #注释编号: django-vue3-admin_serializers405714:这里就直接使用validators进行配置了两个字段的联合唯一了 + def validate(self, attrs): + itnetinfo = attrs.get('itnetinfo') + device_port = attrs.get('device_port') + + # 检查是否已经有相同的组合存在 + + if itnetinfo and device_port : + obj_queryset = ItNetInfoSubModel.objects.filter(itnetinfo=itnetinfo, device_port=device_port) + if obj_queryset.exists(): #注释编号: django-vue3-admin-serializers255716:判断对象是否存在,存在如下代码的操作才有意义 + + if self.request.data.get('id'): #注释编号: django-vue3-admin-serializers525616:判断是否传进来ID,即是判断是新增对象还是编辑对象 + + if self.request.data['id'] == obj_queryset.get().id: + # 如果传过来的id等于数据查到相同对象的id,那么说明就是当前的旧对象做修改,而且与自己起了冲突 + pass + else: + #如果两个id不相等,说明是直正的两条对象冲突了 + raise serializers.ValidationError("商品类型及端口出现组合相同的情况,请修改成其它组合") + else: + #新建对象时,就是没有id的,也要进行检验 + raise serializers.ValidationError("商品类型及端口出现组合相同的情况,请修改成其它组合") + + return attrs + + + + def create(self, validated_data): + if self.request: + #注释编号: django-vue3-admin_serializers340717:新增对象对于光纤网络的特殊处理 + + if 'itnetinfo' in validated_data: + itnetinfo_id = validated_data['itnetinfo'].id + obj = ItNetInfo.objects.get(id=itnetinfo_id) + obj.use_status = "在用" + if 'device_port' in validated_data: + obj.used_by_port = validated_data['device_port'] + + obj.used_by = validated_data['used_by'] + + #因为description不是必填的,所以这里要做个判断 + if 'description' in validated_data: + obj.other_description = validated_data['description'] + else: + obj.other_description = None + + obj.save() + + return super().create(validated_data) + + diff --git a/backend/it_mis/tables/ItNetInfoTables/urls.py b/backend/it_mis/tables/ItNetInfoTables/urls.py new file mode 100644 index 0000000000000000000000000000000000000000..cebd2c63cd360f71d7eade15f8aa3cec2f43c8f5 --- /dev/null +++ b/backend/it_mis/tables/ItNetInfoTables/urls.py @@ -0,0 +1,26 @@ +from rest_framework.routers import SimpleRouter +router = SimpleRouter() + + + +from .views import ItNetTypeViewSet, NetSpeedViewSet, ItNetInfoViewSet, ItNetInfoViewSetStatus, DevicePortModelViewSet, ItNetInfoSubModelViewSet +router.register("api/ItNetTypeViewSet", ItNetTypeViewSet) +router.register("api/NetSpeedViewSet", NetSpeedViewSet) +router.register("api/ItNetInfoViewSet", ItNetInfoViewSet) +router.register("api/DevicePortModelViewSet", DevicePortModelViewSet) +router.register("api/ItNetInfoSubModelViewSet", ItNetInfoSubModelViewSet) + + +from .views import ItNetInfoSubModelStatuViewSet +from django.urls import path +urlpatterns = [ + + # 单独做一条相应状态过滤的路由,给前端页面单独请求,这里是匹配到get请求,把做成字典值为list传到后端处理 + path('api/ItNetInfoViewSetStatus/status//', ItNetInfoViewSetStatus.as_view({'get': 'list'})), + + #注释编号: django-vue3-admin_urls265416:对子表一对一字段进行特殊请求处理 + path('api/ItNetInfoSubModelStatuViewSet/status//', ItNetInfoSubModelStatuViewSet.as_view({'get': 'list'})), + +] +urlpatterns += router.urls + diff --git a/backend/it_mis/tables/ItNetInfoTables/views.py b/backend/it_mis/tables/ItNetInfoTables/views.py new file mode 100644 index 0000000000000000000000000000000000000000..8392a5b7d5f3fd8eb6731660144cfa7008a1aedb --- /dev/null +++ b/backend/it_mis/tables/ItNetInfoTables/views.py @@ -0,0 +1,251 @@ + +from dvadmin.utils.viewset import CustomModelViewSet + +from .models import ItNetType +from .serializers import ItNetInfoSerializer, ItNetTypeCreateUpdateSerializer + +class ItNetTypeViewSet(CustomModelViewSet): + """ + list:查询 + create:新增 + update:修改 + retrieve:单例 + destroy:删除 + """ + + queryset = ItNetType.objects.all() + serializer_class = ItNetInfoSerializer + create_serializer_class = ItNetTypeCreateUpdateSerializer + update_serializer_class = ItNetTypeCreateUpdateSerializer + + + +from .models import NetSpeed +from .serializers import NetSpeedSerializer, NetSpeedCreateUpdateSerializer + +class NetSpeedViewSet(CustomModelViewSet): + """ + list:查询 + create:新增 + update:修改 + retrieve:单例 + destroy:删除 + """ + + queryset = NetSpeed.objects.all() + serializer_class = NetSpeedSerializer + create_serializer_class = NetSpeedCreateUpdateSerializer + update_serializer_class = NetSpeedCreateUpdateSerializer + + +from .models import ItNetInfo +from .serializers import ItNetInfoSerializer, ItNetInfoCreateUpdateSerializer +from .modelFilter import ItNetInfoFilter + +class ItNetInfoViewSet(CustomModelViewSet): + """ + list:查询 + create:新增 + update:修改 + retrieve:单例 + destroy:删除 + """ + + queryset = ItNetInfo.objects.all() + serializer_class = ItNetInfoSerializer + create_serializer_class = ItNetInfoCreateUpdateSerializer + update_serializer_class = ItNetInfoCreateUpdateSerializer + filter_class = ItNetInfoFilter + + + + +class ItNetInfoViewSetStatus(CustomModelViewSet): + + """ + list:查询时只返加状态为未使用的对象及加上自己当前的对象 + + """ + queryset = ItNetInfo.objects.all() + + + def get_queryset(self, **kwargs): + # 拿到前端传回后端的PK值,即是ID + pk = self.kwargs['pk'] + # 将当前ID的class查出来 + additional_object = ItNetInfo.objects.filter(id=pk) + # 将所有未使用状态的对象查出来,这里use_status的值1代表"在用",2代表"未用" + filtered_queryset = ItNetInfo.objects.filter(use_status=2) + # 拼接两个对象内容,然后返回给前端 + self.queryset = filtered_queryset.union(additional_object) + + return super().get_queryset() + + serializer_class = ItNetInfoSerializer + + + + +from .models import DevicePortModel +from .serializers import DevicePortModelSerializer, DevicePortModelCreateUpdateSerializer + +class DevicePortModelViewSet(CustomModelViewSet): + """ + list:查询 + create:新增 + update:修改 + retrieve:单例 + destroy:删除 + """ + + queryset = DevicePortModel.objects.all() + serializer_class = DevicePortModelSerializer + create_serializer_class = DevicePortModelCreateUpdateSerializer + update_serializer_class = DevicePortModelCreateUpdateSerializer + + + #注释编号: django-vue3-admin_views091411:自定义排序处理,不建议把排序写在model里面 + def get_queryset(self): + queryset = super().get_queryset() + #这里拿到request传过来的参数,我们主要是判断是否有ordering的key在里面嘛,有的话直接使用ordering排序,没有的话就给个None,接下来就是使用默认排序 + ordering = self.request.query_params.get('ordering', None) + if ordering: + queryset = queryset.order_by(ordering) + else: + queryset = queryset.order_by('title', '-create_datetime') + return queryset + + + + + +from .models import ItNetInfoSubModel +from .serializers import ItNetInfoSubModelSerializer, ItNetInfoSubModelCreateUpdateSerializer + +from it_mis.tables.ItResourceTables.models import ItResource + + +class ItNetInfoSubModelViewSet(CustomModelViewSet): + """ + list:查询 + create:新增 + update:修改 + retrieve:单例 + destroy:删除 + """ + + queryset = ItNetInfoSubModel.objects.all() + serializer_class = ItNetInfoSubModelSerializer + create_serializer_class = ItNetInfoSubModelCreateUpdateSerializer + update_serializer_class = ItNetInfoSubModelCreateUpdateSerializer + + def get_queryset(self): + + # 注释编号:django-vue3-admin_views454814 + # 功能说明:这里是进行了排序的处理 + queryset = super().get_queryset() + ordering = self.request.query_params.get('ordering', None) + if ordering: + queryset = queryset.order_by(ordering) + else: + queryset = queryset.order_by('create_datetime') + + # 注释编号:django-vue3-admin_views454814 + + + if self.action == "update": #注释编号: django-vue3-admin_views320417:这是匹配到更新数据时,要进行使用状态,端口,使用者同步至光纤网络那边表 + + if self.request.data.get("itnetinfo"): + ItResource_obj = ItResource.objects.all().get(id=self.request.data.get("used_by")) + if self.request.data.get("device_port"): + DevicePortModel_obj = DevicePortModel.objects.all().get(id=self.request.data.get("device_port")) + else: + DevicePortModel_obj = None + + if self.request.data.get("description"): + new_description = self.request.data.get("description") + else: + new_description = None + + oldObject = ItNetInfoSubModel.objects.all().get(id=self.request.data.get("id")) + oldNum = getattr(oldObject, "itnetinfo_id") + newNum = self.request.data.get("itnetinfo") + opObj = ItNetInfo + if oldNum != newNum: + #这里要先判断两个值不相等,接下来的代码才有意义 + #有值的情况处理,即要把原来的旧的序列号同步设置为未使用状态 + obj = opObj.objects.get(id=oldNum) + obj.use_status = "未用" + obj.used_by_port = None + obj.used_by = None + obj.other_description = None + # 把旧序列号的使用状态设置为未使用状态 + obj.save() + + #接下来配置新序列号的使用状态为使用 + obj = opObj.objects.get(id=newNum) + obj.use_status = "在用" + obj.used_by = ItResource_obj + obj.used_by_port = DevicePortModel_obj + obj.other_description = new_description #这里等于当前传进来的description值 + obj.save() + + else: + #那怕是相同的对象,也有可能是修改了其它的值,比如注释,或者商口之类的,反正不理了,全部值给重新赋值给那个对象肯定就是对的。 + obj = opObj.objects.get(id=newNum) + obj.use_status = "在用" + obj.used_by = ItResource_obj + obj.used_by_port = DevicePortModel_obj + obj.other_description = new_description + obj.save() + + + elif self.action == "destroy": #注释编号: django-vue3-admin_views280517:这是匹配到删除时操作时,同步至光纤网络那边表对使用状态,端口,使用者进行清理 + opObj = ItNetInfo + oldObject = ItNetInfoSubModel.objects.all().get(id=self.request.data.get("id")) + + if oldObject.itnetinfo: # 因为itnetinfo不是必须字段,所以这里要做个判断一下。 + oldNum = getattr(oldObject, "itnetinfo_id") + obj = opObj.objects.get(id=oldNum) + obj.use_status = "未用" + obj.used_by_port = None + obj.used_by = None + obj.other_description = None + obj.save() + + return super().get_queryset() + + +# 注释编号:django-vue3-admin_views375016 +# 功能说明:单独引入一个views对一对一字段的处理 +class ItNetInfoSubModelStatuViewSet(CustomModelViewSet): + """ + 针对网络子表中一对一字段进行过滤拼接 + """ + queryset = ItNetInfo.objects.all() + + def get_queryset(self, **kwargs): + # 拿到前端传回后端的PK值,即是ID + pk = self.kwargs['pk'] + # 将当前ID的class查出来 + additional_object = ItNetInfo.objects.filter(used_by=pk) + + # 将所有未使用状态的对象查出来,#这里use_status的值1代表"在用",2代表"未用" + filtered_queryset = ItNetInfo.objects.filter(use_status=2) + + # 拼接两个对象内容,然后返回给前端 + self.queryset = filtered_queryset.union(additional_object) + + return super().get_queryset() + + serializer_class = ItNetInfoSerializer + + + + + + + + + +# 注释编号:django-vue3-admin_views375016 \ No newline at end of file diff --git a/backend/it_mis/tables/ItResourceTables/custom_class.py b/backend/it_mis/tables/ItResourceTables/custom_class.py new file mode 100644 index 0000000000000000000000000000000000000000..79b015e4e7be24cc3e6f02e80aa73bbd9e9b1c65 --- /dev/null +++ b/backend/it_mis/tables/ItResourceTables/custom_class.py @@ -0,0 +1,99 @@ + +class use_status_and_used_by_action(): + def updata(opObj, curObj, self, field_id, field): + """ + 1、要操作的obj类opObj + 2、当前视图对应的obj类curObj + 3、当前对象的实例self + 4、含有ID的字段名称field_id + 5、字段名field + """ + if self.request.data.get("id"): + oldObject = curObj.objects.all().get(id=self.request.data.get("id")) + oldNum = getattr(oldObject, field_id) + newNum = self.request.data.get(field) + if oldNum != newNum: + #这里要先判断两个值不相等,接下来的代码才有意义 + if oldNum or newNum: + if oldNum: + # 这里newNum就会出现有值跟没有值的情况,要作判断 + if newNum: + #有值的情况处理,即要把原来的旧的序列号同步设置为未使用状态 + obj = opObj.objects.get(id=oldNum) + + #这里use_status的值1代表"在用",2代表"未用" + obj.use_status = 2 + + obj.used_by = None + # 把旧序列号的使用状态设置为未使用状态 + obj.save() + + #接下来配置新序列号的使用状态为使用 + obj = opObj.objects.get(id=newNum) + + #这里use_status的值1代表"在用",2代表"未用" + obj.use_status = 1 + + obj.used_by = oldObject + obj.save() + + else: + # newNum无值的情况,即是取消了序列号的引用 + # 把旧序列号的使用状态设置为未使用状态便可 + obj = opObj.objects.get(id=oldNum) + + #这里use_status的值1代表"在用",2代表"未用" + obj.use_status = 2 + + # 清空使用者的引用 + obj.used_by = None + obj.save() + else: + #oldNum没有值的情况下,那么newNum肯定是有值的才能进到这个循环的,直接对newNum有值的情况进行处理便可。 + #直接配置新序列号的使用状态为使用 + obj = opObj.objects.get(id=newNum) + + #这里use_status的值1代表"在用",2代表"未用" + obj.use_status = 1 + + # 把当前当前编辑的对象传给外键便好 + obj.used_by = oldObject + obj.save() + + def destroy(opObj, curObj, self, field_id): + """ + "未用"、要操作的obj类opObj + 2、当前视图对应的obj类curObj + 3、当前对象的实例self + 4、含有ID的字段名称field_id + """ + try: + oldNum = getattr(curObj.objects.all().get(id=self.request.data.get("id")), field_id) + obj = opObj.objects.get(id=oldNum) + + #这里use_status的值1代表"在用",2代表"未用" + obj.use_status = 2 + + obj.used_by = None + obj.save() + except: + pass + + + + def add(instance, opObj, field_id): + """ + "未用"、当前instance + 2、要操作对应的model对象opObj + 3、含有ID的字段名称field_id + """ + id = getattr(instance, field_id) + newobj = opObj.objects.get(id=id) + + #这里use_status的值1代表"在用",2代表"未用" + newobj.use_status = 1 + + # license_obj.save() 这里放在后面跟别的操作一起保存,不单独进行保存 + # 功能说明: 这里同步有序列号时,对序列那边也要添加一个使用者的信息操作 + newobj.used_by = instance #把外健对象直接给到外键便可 + newobj.save() #保存对象 \ No newline at end of file diff --git a/backend/it_mis/tables/ItResourceTables/modelFilter.py b/backend/it_mis/tables/ItResourceTables/modelFilter.py new file mode 100644 index 0000000000000000000000000000000000000000..3806fe99f0bb36cf346ec6720a05d84037501149 --- /dev/null +++ b/backend/it_mis/tables/ItResourceTables/modelFilter.py @@ -0,0 +1,41 @@ +import django_filters +from django.db.models import Q + + +from it_mis.tables.ItResourceTables.mysql_view_models import MysqlViewItResource + + + + +# 注释编号:django-vue3-admin_modelFilter475817 +# 功能说明:这里写一个FilterSet进行针对it_use传回来的数据进行Q或查询 +class ItResourceFilter(django_filters.rest_framework.FilterSet): + + #这里是通过it_use字段传过来,我们进行了匹配Q查询,返回多个字段的匹配结果 + it_use = django_filters.CharFilter(method='filter_custom') + + + #如下是对单独字段进行模糊查询的配置 + remote_addr = django_filters.CharFilter(field_name='remote_addr', lookup_expr='icontains') + tag_num = django_filters.CharFilter(field_name='tag_num', lookup_expr='icontains') + mac_addr = django_filters.CharFilter(field_name='mac_addr', lookup_expr='icontains') + service_tag = django_filters.CharFilter(field_name='service_tag', lookup_expr='icontains') + express_service_code = django_filters.CharFilter(field_name='express_service_code', lookup_expr='icontains') + + + # 在这个自定义方法中构建您的查询条件 + def filter_custom(self, queryset, name, value): + q1 = Q(it_use__use__icontains=value) + q2 = Q(use_account__icontains=value) + q3 = Q(it_device_resource_num__icontains=value) + + # 使用 | 运算符将它们组合为一个 "或" 查询条件 + combined_q = q1 | q2 | q3 + + return queryset.filter(combined_q) + + + class Meta: + model = MysqlViewItResource + fields = "__all__" #这里配置所有字段可查 +# 注释编号:django-vue3-admin_modelFilter475817 \ No newline at end of file diff --git a/backend/it_mis/tables/ItResourceTables/models.py b/backend/it_mis/tables/ItResourceTables/models.py new file mode 100644 index 0000000000000000000000000000000000000000..5146753a498f4d32525ecbcf29af0b1c2273aca4 --- /dev/null +++ b/backend/it_mis/tables/ItResourceTables/models.py @@ -0,0 +1,153 @@ +from django.db import models +from dvadmin.utils.models import CoreModel + + +from PublicResource.tables.OrganizationTables.models import AreaModel, CompanyModel, DepartmentModel +from PublicResource.tables.OrganizationTables.models import OrganizationModel + +from it_mis.tables.SuppliersTables.models import Suppliers + +from it_mis.tables.LicenceTables.models import Licence + + +# 注释编号:django-vue3-admin__models445717:代码开始行 +# 功能说明:IT资产与应用表的设计 + + +class DeviceModel(CoreModel): + title = models.CharField(verbose_name="设备型号", unique=True, max_length=64, blank=False) + + def __str__(self): + return self.title + + class Meta: + verbose_name = "设备型号字典" + verbose_name_plural = verbose_name + +class DeviceBrand(CoreModel): + title = models.CharField(verbose_name="设备品牌", unique=True, max_length=64, blank=False) + + def __str__(self): + return self.title + + class Meta: + verbose_name = "设备品牌字典" + verbose_name_plural = verbose_name + +class DeviceType(CoreModel): + title = models.CharField(verbose_name="设备类型", unique=True, max_length=64, blank=False) + + def __str__(self): + return self.title + + class Meta: + verbose_name = "设备类型字典" + verbose_name_plural = verbose_name + +class Memory(CoreModel): + title = models.CharField(verbose_name="内存大小", unique=True, max_length=64, blank=False) + + def __str__(self): + return self.title + + class Meta: + verbose_name = "内存字典" + verbose_name_plural = verbose_name + +class Disk(CoreModel): + title = models.CharField(verbose_name="硬盘大小", unique=True, max_length=64, blank=False) + + def __str__(self): + return self.title + + class Meta: + verbose_name = "硬盘字典" + verbose_name_plural = verbose_name + +class SoftType(CoreModel): + title = models.CharField(verbose_name="软件类型", unique=True, max_length=64, blank=False) + + def __str__(self): + return self.title + + class Meta: + verbose_name = "软件类型字典" + verbose_name_plural = verbose_name + + +class Cpu(CoreModel): + title = models.CharField(verbose_name="cpu型号", unique=True, max_length=64, blank=False) + + def __str__(self): + return self.title + + class Meta: + verbose_name = "cpu字典" + verbose_name_plural = verbose_name + ordering = ("-create_datetime",) + + + +class ItResourceShareCommonInfo(models.Model): + + #注释编号: django-vue3-admin-models285310:公共字段定义在这里,方便当前的公共字段同步可以视图类复用 + + it_use = models.ForeignKey(to=OrganizationModel, verbose_name="信息归属", on_delete=models.PROTECT) + device_type = models.ForeignKey(to=DeviceType, verbose_name="硬件设备类型", blank=True, null=True, on_delete=models.PROTECT) + device_brand = models.ForeignKey(to=DeviceBrand, verbose_name="硬件品牌", blank=True, null=True, on_delete=models.PROTECT) + device_model = models.ForeignKey(to=DeviceModel, verbose_name="硬件设备型号", blank=True, null=True, on_delete=models.PROTECT) + service_tag = models.CharField(verbose_name="硬件服务编码", max_length=64, blank=True, null=True) + express_service_code = models.CharField(verbose_name="硬件快速服务代码", max_length=64, blank=True, null=True) + mac_addr = models.CharField(verbose_name="mac地址", max_length=64, blank=True, null=True, ) + device_cpu = models.ForeignKey(to=Cpu, verbose_name="硬件cpu", blank=True, null=True, on_delete=models.PROTECT) + device_memory = models.ForeignKey(to=Memory, verbose_name="硬件内存", blank=True, null=True, on_delete=models.PROTECT) + device_disk = models.ForeignKey(to=Disk, verbose_name="硬件硬盘", blank=True, null=True, on_delete=models.PROTECT) + is_resource = models.BooleanField(default=False, verbose_name="资产", help_text='''是否为固定资产''') + is_device_resource = models.BooleanField(default=False, verbose_name="标签", help_text='''是否需要标签''') + it_device_resource_num = models.PositiveIntegerField(verbose_name="资产编码", blank=True, null=True, unique=True, help_text="此处第一次录入始发值,后期建议使用自动生成") + # 以下软件信息相关的字段 + soft_type = models.ForeignKey(to=SoftType, verbose_name="软件版本与类型", blank=True, null=True, help_text="版本与类型都要分清,方便归类分析", on_delete=models.PROTECT) + soft_licence = models.OneToOneField('Licence', verbose_name="序列号", blank=True, null=True, help_text="被引用的序列号会标记为使用状态", on_delete=models.PROTECT) + + #注释编号: django-vue3-admin_models345109:这个tag_num字段要在视图中进行特殊处理,检验非空的字段必须值唯一(但是记得不能直接在字段中配置unique=True,这会引会更新数据时出错的问题) + tag_num = models.CharField(verbose_name="标记码", max_length=64, blank=True, null=True, help_text="这里可录入电脑名称或电话号码等") + + + ip_addr = models.CharField(verbose_name="ip地址", max_length=64, blank=True, null=True, help_text="这里由前端限制IP地址格式传至后端") + + use_account = models.CharField(verbose_name="使用帐号", max_length=64, blank=True, null=True,) + use_password = models.CharField(verbose_name="帐号密码", max_length=64, blank=True, null=True,) + remote_addr = models.CharField(verbose_name="远程地址", max_length=64, blank=True, null=True,) + use_port = models.IntegerField(verbose_name="使用端口", blank=True, null=True,) + # use_to_tel = models.ForeignKey("DidNumInfo", verbose_name="关联电话号码", blank=True, null=True, default="") + # use_to_other = models.ForeignKey("self", verbose_name="其它关联信息", blank=True, null=True, default="", help_text="关联自身表的其它信息,如邮箱、帐号等") + + purchase_start_data = models.DateField(verbose_name="采购日期", blank=True, null=True) + warranty = models.CharField(verbose_name="保修时长", max_length=64, blank=True, null=True) + + + + class Meta: + abstract = True # 抽象基类,不会为它创建数据库表,但它可以被复用 + + + + + + +class ItResource(CoreModel, ItResourceShareCommonInfo): + + #注释编号: django-vue3-admin-models035310:这里所有的字段都写ItResourceShareCommonInfo基类里面,目的是为了基类可以被复用 + + def __str__(self): + #这里要配置被引用访问时返回的相关字符,这里写成self.it_use.use是返回当前外键字段的外键,正常返回当前字段便可,如self.title + return self.it_use.use + + class Meta: + verbose_name = "资产与配置信息" + verbose_name_plural = verbose_name + ordering = ("-create_datetime",) + + + +# 注释编号:django-vue3-admin__models445717:代码结束行 \ No newline at end of file diff --git a/backend/it_mis/tables/ItResourceTables/mysql_view_models.py b/backend/it_mis/tables/ItResourceTables/mysql_view_models.py new file mode 100644 index 0000000000000000000000000000000000000000..be0fe5573915d1e68e8f574ca352c511573c3375 --- /dev/null +++ b/backend/it_mis/tables/ItResourceTables/mysql_view_models.py @@ -0,0 +1,24 @@ +from django.db import models + +from dvadmin.utils.models import CoreModel + + +from PublicResource.tables.OrganizationTables.models import CompanyModel, AreaModel, DepartmentModel +from it_mis.tables.ItResourceTables.models import ItResourceShareCommonInfo + + +class MysqlViewItResource(CoreModel, ItResourceShareCommonInfo): #注释编号: django-vue3-admin-mysql_view_models542511:这里直接引入公共字段基类ItResourceShareCommonInfo + + company = models.ForeignKey(to=CompanyModel, verbose_name="公司", related_name="MysqlViewItResource_company", blank=True, null=True, on_delete=models.PROTECT) + area = models.ForeignKey(to=AreaModel, verbose_name="区域", related_name="MysqlViewItResource_area", blank=True, null=True, on_delete=models.PROTECT) + department = models.ForeignKey(to=DepartmentModel, verbose_name="部门", related_name="MysqlViewItResource_department", blank=True, null=True, on_delete=models.PROTECT) + + + + class Meta: + verbose_name = "资产与配置信息" + verbose_name_plural = verbose_name + db_table = 'MysqlViewItResource' + managed = False #本表不被包括在makemigrations和migrate命令中 + ordering = ("-id",) + # ordering = ("-create_datetime",) \ No newline at end of file diff --git a/backend/it_mis/tables/ItResourceTables/serializers.py b/backend/it_mis/tables/ItResourceTables/serializers.py new file mode 100644 index 0000000000000000000000000000000000000000..238e32f9fe06d863aed845a58e6a6d3f3b96d358 --- /dev/null +++ b/backend/it_mis/tables/ItResourceTables/serializers.py @@ -0,0 +1,276 @@ + +from dvadmin.utils.serializers import CustomModelSerializer +from rest_framework import serializers + + + +""" 注释编号:django-vue3-admin__serializers134815:码开始行 """ +""" 功能说明:IT资产与应用相关表的序列化""" +from it_mis.tables.ItResourceTables.models import DeviceModel, DeviceBrand, DeviceType, Memory, Disk, SoftType, Cpu, ItResource + +from it_mis.tables.ItResourceTables.mysql_view_models import MysqlViewItResource + +class DeviceModelSerializer(CustomModelSerializer): + """ + 序列化器 + """ + + class Meta: + model = DeviceModel + fields = "__all__" + +class DeviceModelCreateUpdateSerializer(CustomModelSerializer): + """ + 创建/更新时的列化器 + """ + + class Meta: + model = DeviceModel + fields = '__all__' + +class DeviceBrandSerializer(CustomModelSerializer): + """ + 序列化器 + """ + + class Meta: + model = DeviceBrand + fields = "__all__" + +class DeviceBrandCreateUpdateSerializer(CustomModelSerializer): + """ + 创建/更新时的列化器 + """ + + class Meta: + model = DeviceBrand + fields = '__all__' + +class DeviceTypeSerializer(CustomModelSerializer): + """ + 序列化器 + """ + + class Meta: + model = DeviceType + fields = "__all__" + +class DeviceTypeCreateUpdateSerializer(CustomModelSerializer): + """ + 创建/更新时的列化器 + """ + + class Meta: + model = DeviceType + fields = '__all__' + + +class MemorySerializer(CustomModelSerializer): + """ + 序列化器 + """ + + class Meta: + model = Memory + fields = "__all__" + +class MemoryCreateUpdateSerializer(CustomModelSerializer): + """ + 创建/更新时的列化器 + """ + + class Meta: + model = Memory + fields = '__all__' + +class DiskSerializer(CustomModelSerializer): + """ + 序列化器 + """ + + class Meta: + model = Disk + fields = "__all__" + +class DiskCreateUpdateSerializer(CustomModelSerializer): + """ + 创建/更新时的列化器 + """ + + class Meta: + model = Disk + fields = '__all__' + +class SoftTypeSerializer(CustomModelSerializer): + """ + 序列化器 + """ + + class Meta: + model = SoftType + fields = "__all__" + +class SoftTypeCreateUpdateSerializer(CustomModelSerializer): + """ + 创建/更新时的列化器 + """ + + class Meta: + model = SoftType + fields = '__all__' + +class CpuSerializer(CustomModelSerializer): + """ + 序列化器 + """ + + class Meta: + model = Cpu + fields = "__all__" + +class CpuCreateUpdateSerializer(CustomModelSerializer): + """ + 创建/更新时的列化器 + """ + + class Meta: + model = Cpu + fields = '__all__' + +class ItResourceSerializer(CustomModelSerializer): + """ + 序列化器 + """ + # it_use = serializers.PrimaryKeyRelatedField(source='it_use.use',queryset = ItResource.objects.all()) # 建议在这里配置序列化字段,会导致外部编辑页面更新出错 + + class Meta: + model = ItResource + fields = "__all__" + +class ItResourceNumSerializer(CustomModelSerializer): + """ + 这里的序列化是匹配路由api/LicenceViewSet/it_device_resource_num/ + 主要是实现请求的字段it_device_resource_num而配置的 + """ + + class Meta: + model = ItResource + fields = '__all__' + + +class ItResourceUpdateSerializer(CustomModelSerializer): + """ + 创建/更新时的列化器 + """ + + + + + class Meta: + model = ItResource + fields = '__all__' + +# 注释编号:django-vue3-admin_serializers361316 +# 功能说明:更新对象时对tag_num字段进行校验,可为null但是必须有值的情况下是唯一的 +#参考链接http://drf.jiuyou.info/#/drf/serializers?id=%e5%ad%97%e6%ae%b5%e7%ba%a7%e9%aa%8c%e8%af%81 + + def validate_tag_num(self, value): + # alidate_your_field(self, value)是一个验证方法,your_field是你想要验证的字段的名字,value是该字段的值 + # 拿到当前ID + curid = self.request.data.get("id") + #拿到当前提交过来的tag_num + cur_tag_num = self.request.data.get("tag_num") + #查数据库原来对应ID的tag_num + oldNum = ItResource.objects.get(id=curid).tag_num + if cur_tag_num != oldNum and cur_tag_num: + existing_records = ItResource.objects.filter(tag_num=cur_tag_num) + if existing_records.exists(): + raise serializers.ValidationError("该值已存在,请选择其他值。") + return value +# 注释编号:django-vue3-admin_serializers361316 + + + + +class ItResourceCreateSerializer(CustomModelSerializer): + """ + 创建/更新时的列化器 + """ + + class Meta: + model = ItResource + fields = '__all__' + +# 注释编号:django-vue3-admin_serializers201216 +# 功能说明:创建对象时对tag_num字段进行校验,可为null但是必须有值的情况下是唯一的 + + + def validate_tag_num(self, value): + + # alidate_your_field(self, value)是一个验证方法,your_field是你想要验证的字段的名字,value是该字段的值 + + if value: + # 检查数据库中是否已存在具有相同值的记录 + existing_records = ItResource.objects.filter(tag_num=value) + # 如果存在其他记录具有相同值,则引发ValidationError + if existing_records.exists(): + raise serializers.ValidationError("该值已存在,请选择其他值。") + + return value +# 注释编号:django-vue3-admin_serializers201216 + + + + + + +"""注释编号:workspace.json__serializers565316:代码开始行""" +"""功能说明:针对外健的导出,最好是针对性的建一个序列化器才行""" +"""这里要写一下source='company.title'是说当前company字段对应的模型当名称字段title(这个要看对应表的命名的,而不是随意思想出来的),注意company是字段名称而不是模型名称""" + +class ExportItResourceSerializer(CustomModelSerializer): + """ + 导出 + """ + + #注释编号: django-vue3-admin_serializers304114:这里写外键对应的值,如下字段必须是视图中配置过并包含在export_foreignKey__value_column字段内的才行,要不查询起来起好慢 + #export_foreignKey__value_column = ('company', 'area', 'department', 'it_use', 'device_type', 'device_brand','device_cpu', 'device_memory', 'device_disk', 'soft_type') + # company = serializers.CharField(source='company.title', default=None, read_only=True, help_text='部门') + # area = serializers.CharField(source='area.title', default=None, read_only=True, help_text='区域') + # department = serializers.CharField(source='department.title', default=None, read_only=True, help_text='部门') + # it_use = serializers.CharField(source='it_use.use', default=None, read_only=True, help_text='信息归属') + # device_type = serializers.CharField(source='device_type.title', default=None, read_only=True, help_text='硬件设备类型') + # device_brand = serializers.CharField(source='device_brand.title', default=None, read_only=True, help_text='硬件品牌') + # device_model = serializers.CharField(source='device_model.title', default=None, read_only=True, help_text='硬件设备型号') + # device_cpu = serializers.CharField(source='device_cpu.title', default=None, read_only=True, help_text='硬件cpu') + # device_memory = serializers.CharField(source='device_memory.title', default=None, read_only=True, help_text='硬件内存') + # device_disk = serializers.CharField(source='device_disk.title', default=None, read_only=True, help_text='硬件硬盘') + # soft_type = serializers.CharField(source='soft_type.title', default=None, read_only=True, help_text='软件版本与类型') + + + class Meta: + model = MysqlViewItResource + fields = "__all__" + + + +""" 注释编号:workspace.json__serializers565316:代码结束行""" + + + + +class MysqlViewItResourceSerializer(CustomModelSerializer): + """ + 序列化器 + """ + + class Meta: + model = MysqlViewItResource + fields = "__all__" + + + + + + +""" 注释编号:django-vue3-admin__serializers134815:代码结束行""" \ No newline at end of file diff --git a/backend/it_mis/tables/ItResourceTables/signals.py b/backend/it_mis/tables/ItResourceTables/signals.py new file mode 100644 index 0000000000000000000000000000000000000000..747b75b66486114f7c27e35caa741be6b408f8c6 --- /dev/null +++ b/backend/it_mis/tables/ItResourceTables/signals.py @@ -0,0 +1,27 @@ +# 导入信号库 +from django.db.models.signals import post_save +from django.dispatch import receiver +from it_mis.tables.ItResourceTables.models import ItResource + +from it_mis.tables.LicenceTables.models import Licence +from it_mis.tables.ItNetInfoTables.models import ItNetInfo + + +# 注释编号:django-vue3-admin__signals093014:代码开始行 +# 功能说明:对ItResource之created创建对象之后做了动作的处理 +#需要导入from it_mis.models import ItResource, Licence + +#导入自定义的处理函数 +from .custom_class import use_status_and_used_by_action + +@receiver(post_save, sender=ItResource, dispatch_uid="ItResource_created_post_save") +def ItResource_created_post_save(sender, instance, created, **kwargs): + if created: #这时创建完对象之后进行信号操作 + # 注释编号:django-vue3-admin__serializers351515:代码开始行 + # 功能说明:如果新增过来的值有soft_licence,那么就要进行相应更新处理 + if instance.soft_licence_id: + use_status_and_used_by_action.add(instance, Licence, field_id="soft_licence_id") + # 注释编号:django-vue3-admin__serializers531815:代码结束行 + + +# 注释编号:django-vue3-admin__signals093014:代码结束行 \ No newline at end of file diff --git a/backend/it_mis/tables/ItResourceTables/urls.py b/backend/it_mis/tables/ItResourceTables/urls.py new file mode 100644 index 0000000000000000000000000000000000000000..e36a20f896dfe6a782afb732e3eca97b6a271503 --- /dev/null +++ b/backend/it_mis/tables/ItResourceTables/urls.py @@ -0,0 +1,33 @@ +from rest_framework.routers import SimpleRouter +router = SimpleRouter() + + +""" 注释编号:django-vue3-admin__urls59525915:代码开始行""" +""" 功能说明:""" +from it_mis.tables.ItResourceTables.views import DeviceModelViewSet, DeviceBrandViewSet, DeviceTypeViewSet, MemoryViewSet, DiskViewSet, SoftTypeViewSet, CpuViewSet, ItResourceViewSet + +router.register("api/DeviceModelViewSet", DeviceModelViewSet) +router.register("api/DeviceBrandViewSet", DeviceBrandViewSet) +router.register("api/DeviceTypeViewSet", DeviceTypeViewSet) +router.register("api/MemoryViewSet", MemoryViewSet) +router.register("api/DiskViewSet", DiskViewSet) +router.register("api/SoftTypeViewSet", SoftTypeViewSet) +router.register("api/CpuViewSet", CpuViewSet) +router.register("api/ItResourceViewSet", ItResourceViewSet) + + + +""" 注释编号:django-vue3-admin__urls525915:代码结束行""" + + + +from django.urls import path + +from it_mis.tables.ItResourceTables.views import ItResourceNumViewSet + +urlpatterns = [ + + # 这条路由主要是针对请求返回最大的资产编码对象的 + path('api/LicenceViewSet/it_device_resource_num/', ItResourceNumViewSet.as_view({'get': 'list'})), +] +urlpatterns += router.urls \ No newline at end of file diff --git a/backend/it_mis/tables/ItResourceTables/views.py b/backend/it_mis/tables/ItResourceTables/views.py new file mode 100644 index 0000000000000000000000000000000000000000..6cba084bed970fa19c0e60b0b627cbe80b367bea --- /dev/null +++ b/backend/it_mis/tables/ItResourceTables/views.py @@ -0,0 +1,266 @@ +# Create your views here. + +from dvadmin.utils.viewset import CustomModelViewSet +from .custom_class import use_status_and_used_by_action +from django.db.models import F + +from dvadmin.utils.json_response import SuccessResponse, DetailResponse +from rest_framework.decorators import action +import pandas as pd + +""" 注释编号:django-vue3-admin__views580016:代码开始行""" +""" 功能说明:IT资产与应用的视图""" +from it_mis.tables.ItResourceTables.models import DeviceModel +from it_mis.tables.ItResourceTables.serializers import DeviceModelSerializer, DeviceModelCreateUpdateSerializer + +class DeviceModelViewSet(CustomModelViewSet): + """ + list:查询 + create:新增 + update:修改 + retrieve:单例 + destroy:删除 + """ + queryset = DeviceModel.objects.all() + serializer_class = DeviceModelSerializer + create_serializer_class = DeviceModelCreateUpdateSerializer + update_serializer_class = DeviceModelCreateUpdateSerializer + + +from it_mis.tables.ItResourceTables.models import DeviceBrand +from it_mis.tables.ItResourceTables.serializers import DeviceBrandSerializer, DeviceBrandCreateUpdateSerializer + +class DeviceBrandViewSet(CustomModelViewSet): + """ + list:查询 + create:新增 + update:修改 + retrieve:单例 + destroy:删除 + """ + queryset = DeviceBrand.objects.all() + serializer_class = DeviceBrandSerializer + create_serializer_class = DeviceBrandCreateUpdateSerializer + update_serializer_class = DeviceBrandCreateUpdateSerializer + + +from it_mis.tables.ItResourceTables.models import DeviceType +from it_mis.tables.ItResourceTables.serializers import DeviceTypeSerializer, DeviceTypeCreateUpdateSerializer + +class DeviceTypeViewSet(CustomModelViewSet): + """ + list:查询 + create:新增 + update:修改 + retrieve:单例 + destroy:删除 + """ + queryset = DeviceType.objects.all() + serializer_class = DeviceTypeSerializer + create_serializer_class = DeviceTypeCreateUpdateSerializer + update_serializer_class = DeviceTypeCreateUpdateSerializer + +from it_mis.tables.ItResourceTables.models import Memory +from it_mis.tables.ItResourceTables.serializers import MemorySerializer, MemoryCreateUpdateSerializer + +class MemoryViewSet(CustomModelViewSet): + """ + list:查询 + create:新增 + update:修改 + retrieve:单例 + destroy:删除 + """ + queryset = Memory.objects.all() + serializer_class = MemorySerializer + create_serializer_class = MemoryCreateUpdateSerializer + update_serializer_class = MemoryCreateUpdateSerializer + + +from it_mis.tables.ItResourceTables.models import Disk +from it_mis.tables.ItResourceTables.serializers import DiskSerializer, DiskCreateUpdateSerializer + +class DiskViewSet(CustomModelViewSet): + """ + list:查询 + create:新增 + update:修改 + retrieve:单例 + destroy:删除 + """ + queryset = Disk.objects.all() + serializer_class = DiskSerializer + create_serializer_class = DiskCreateUpdateSerializer + update_serializer_class = DiskCreateUpdateSerializer + + +from it_mis.tables.ItResourceTables.models import SoftType +from it_mis.tables.ItResourceTables.serializers import SoftTypeSerializer, SoftTypeCreateUpdateSerializer + +class SoftTypeViewSet(CustomModelViewSet): + """ + list:查询 + create:新增 + update:修改 + retrieve:单例 + destroy:删除 + """ + queryset = SoftType.objects.all() + serializer_class = SoftTypeSerializer + create_serializer_class = SoftTypeCreateUpdateSerializer + update_serializer_class = SoftTypeCreateUpdateSerializer + +from it_mis.tables.ItResourceTables.models import Cpu +from it_mis.tables.ItResourceTables.serializers import CpuSerializer, CpuCreateUpdateSerializer + +class CpuViewSet(CustomModelViewSet): + """ + list:查询 + create:新增 + update:修改 + retrieve:单例 + destroy:删除 + """ + queryset = Cpu.objects.all() + serializer_class = CpuSerializer + create_serializer_class = CpuCreateUpdateSerializer + update_serializer_class = CpuCreateUpdateSerializer + + +from it_mis.tables.ItResourceTables.models import ItResource +from it_mis.tables.ItNetInfoTables.models import ItNetInfo +from it_mis.tables.ItResourceTables.mysql_view_models import MysqlViewItResource +from it_mis.tables.ItResourceTables.serializers import ItResourceSerializer, ItResourceUpdateSerializer,ItResourceCreateSerializer, MysqlViewItResourceSerializer, ExportItResourceSerializer + +from dvadmin.utils.json_response import SuccessResponse +from it_mis.tables.ItResourceTables.modelFilter import ItResourceFilter + +from it_mis.tables.LicenceTables.models import Licence + +class ItResourceViewSet(CustomModelViewSet): + """ + list:查询 + create:新增 + update:修改 + retrieve:单例 + destroy:删除 + """ + queryset = ItResource.objects.all() + serializer_class = ItResourceSerializer + + def get_queryset(self): + if self.action == "list": + """ 注释编号:workspace.json__views280817:这里是针对list即时get请求做了优化,主要是让他匹配之后走mysql相应的视图""" + self.queryset = MysqlViewItResource.objects.all() + self.serializer_class = MysqlViewItResourceSerializer + self.filter_class = ItResourceFilter #注释编号: django-vue3-admin_views262617:这里在更新信息时,专门使用过滤器进行过滤进行模糊查询 + elif self.action == "export_data": #这是匹配到导出的 + """注释编号:workspace.json__views465916:这个elif去匹配export_data针对导出来做的""" + self.queryset = MysqlViewItResource.objects.all() + elif self.action == "update": #这是匹配到更新数据的 + """注释编号:workspace.json__views49244914:代码开始行""" + """ 功能说明:这里是针对序列化一对一字段的功能进行判断及处理""" + use_status_and_used_by_action.updata(Licence, ItResource, self, field_id = "soft_licence_id", field = "soft_licence") # 配置Licence中use_status及used_by的标记 + """ 注释编号:workspace.json__views244914:代码结束行""" + elif self.action == "destroy": #这是匹配到删除时操作时 + use_status_and_used_by_action.destroy(Licence, ItResource, self, field_id = "soft_licence_id") #删除Licence中use_status及used_by的标记 + + return super().get_queryset() + + """注释编号:workspace.json__views280017:代码开始行""" + """功能说明:对于外键必须在字段后面添加_id,要不无法导出来数据""" + # export_field_label = { + # "company_id": "公司", + # "area_id": "区域", + # "department_id": "部门", + # "it_use_id": "信息归属", + # "device_type_id": "硬件设备类型", + # "device_brand_id": "硬件品牌", + # "device_model_id": "硬件设备型号", + # "service_tag": "硬件服务编码", + # "express_service_code": "硬件快速服务代码", + # "mac_addr": "mac地址", + # "device_cpu_id": "硬件cpu", + # "device_memory_id": "硬件内存", + # "device_disk_id": "硬件硬盘", + # "is_device_resource": "是否为固定资产", + # "it_device_resource_num": "资产编码", + # "soft_type_id": "软件版本与类型", + # "tag_num": "标记码", + # } + + + """ 注释编号:workspace.json__views280017:代码结束行""" + + #注释编号: django-vue3-admin_views481816:这里单独把创建及更新对象给到不同的序列化器,主要是方便制作各自的验证器 + create_serializer_class = ItResourceCreateSerializer + update_serializer_class = ItResourceUpdateSerializer + + filter_class = None #注释编号: django-vue3-adminviews563216:这里最好写上=None,因为更新及删除都必须定义为None才行 + + + # 注释编号:django-vue3-admin_views211216 + # 功能说明:被访问的model他要拿到外健的外键的值而进行重写懒加载请求,专门返回该字段外健的外键的值 + + @action(methods=['post'], detail=False) + def getbyIds(self, request, *args, **kwargs): + try: + idList = request.data['values'] #获取前端传过来 + except: + return DetailResponse(data=queryset, msg="没有传values到后端, 即是id列表") + + cur_model = self.get_queryset().model #查到当前的model + + queryset_id = cur_model.objects.filter(id__in=idList) #过滤出来前端传过来的list列表里面的对象 + queryset = list(queryset_id.values()) + + try: + fieldList = request.data['fieldList'] + + df = pd.DataFrame(queryset, columns=fieldList) #转换为pandas DataFrame格式,并且只拿其中列表内规定的字段 + + newField = fieldList[1].replace('_id', '') #把拿到的列表如['id', 'it_use_id']中的第二个元素fieldList[1]=it_use_id拿出来进行去除__id后缀 + + try: + #这里是拿到当前cur_model对应的newKey的外健对象的所有值并转为这字典 + choices_dict = dict(getattr(cur_model, newField).field.get_choices()) + #然后把对应的外健的值给组装回去df内 + df[f'{fieldList[1]}'] = df[f'{fieldList[1]}'].replace(choices_dict) + except AttributeError: + #即是出现AttributeError: 'NoneType' object has no attribute 'model'错误时,不用理会 + pass + queryset = df.to_dict(orient='records') #pandas DataFrame转换成包含字典的列表格式 + + except: + pass + + return DetailResponse(data=queryset, msg="获取成功") + # 注释编号:django-vue3-admin_views211216 + + + +from it_mis.tables.ItResourceTables.serializers import ItResourceNumSerializer +class ItResourceNumViewSet(CustomModelViewSet): + """ + list:查询返回IT资产编号的最大值前端,然后在前端再回+1的操作 + """ + + queryset = ItResource.objects.all() + serializer_class = ItResourceNumSerializer + + # 这里重写了list方法,让他只返回it_device_resource_num的数字+1 + def list(self, request, *args, **kwargs): + # 获取单个对象 + instance = self.queryset.order_by('-it_device_resource_num').first() + serializer = ItResourceNumSerializer(instance) + # 拿到资产序列号 + num = serializer.data["it_device_resource_num"] + # 对资产序列号自动加1操作 + newNum = num + 1 + return SuccessResponse(newNum) + + + + + +""" 注释编号:django-vue3-admin__views580016:代码结束行""" \ No newline at end of file diff --git a/backend/it_mis/tables/LicenceTables/models.py b/backend/it_mis/tables/LicenceTables/models.py new file mode 100644 index 0000000000000000000000000000000000000000..1bc18be1f18b5351502d310ab54d37dcf1b30744 --- /dev/null +++ b/backend/it_mis/tables/LicenceTables/models.py @@ -0,0 +1,31 @@ +from django.db import models +from dvadmin.utils.models import CoreModel + +from PublicResource.tables.OrganizationTables.models import AreaModel +from it_mis.tables.SuppliersTables.models import Suppliers + +# from it_mis.models import SoftType 不通这样写,会导致循环导入 + + +class Licence(CoreModel): + resource_area = models.ForeignKey(to=AreaModel, verbose_name="区域", null=True, default=None, on_delete=models.PROTECT) + title = models.CharField(verbose_name="许可证名称", max_length=64, blank=False, null=True) + # 这里外键写成'it_mis.SoftType'是为了解决循环导入的问题 + licence_type = models.ForeignKey('it_mis.SoftType', verbose_name="类型",blank=True, null=True, on_delete=models.PROTECT) + licence_num = models.CharField(verbose_name="序列号", max_length=64, unique=True) + supplier = models.ForeignKey(to=Suppliers, verbose_name="供应商", blank=False, null=True, on_delete=models.PROTECT) + version = models.CharField(verbose_name="版本号", max_length=64, blank=True, null=True) + start_date = models.DateField(verbose_name="购买日期", blank=True, null=True) + end_date = models.DateField(verbose_name="到期日期", blank=True, null=True) + price = models.CharField(verbose_name="费用", max_length=64, blank=True, null=True) + + #use_status在全局字典当中1表示在用,2表示未用,默认使用2表示未使用状态,该字典由CharField修改为IntegerField,这样前端配置dict-select时,才不会有问题 + use_status = models.IntegerField(verbose_name="使用状态", blank=False, default="2", help_text="此状态不可手动修改") + + used_by = models.ForeignKey("ItResource", verbose_name="被使用者", blank=True, null=True, \ + default=None , help_text="被谁引用或使用,系统自动生成不用填过", on_delete=models.PROTECT) + + class Meta: + verbose_name = "许可证" + verbose_name_plural = verbose_name + ordering = ("-create_datetime",) \ No newline at end of file diff --git a/backend/it_mis/tables/LicenceTables/serializers.py b/backend/it_mis/tables/LicenceTables/serializers.py new file mode 100644 index 0000000000000000000000000000000000000000..68e06134133526addc5eb857acb7d2d3beebd635 --- /dev/null +++ b/backend/it_mis/tables/LicenceTables/serializers.py @@ -0,0 +1,23 @@ + +from dvadmin.utils.serializers import CustomModelSerializer +from rest_framework import serializers + +from .models import Licence + +class LicenceSerializer(CustomModelSerializer): + """ + 序列化器 + """ + + class Meta: + model = Licence + fields = "__all__" + +class LicenceCreateUpdateSerializer(CustomModelSerializer): + """ + 创建/更新时的列化器 + """ + + class Meta: + model = Licence + fields = '__all__' \ No newline at end of file diff --git a/backend/it_mis/tables/LicenceTables/urls.py b/backend/it_mis/tables/LicenceTables/urls.py new file mode 100644 index 0000000000000000000000000000000000000000..dbb25893e7c73bfb39ef18f223cbe194b85a4c84 --- /dev/null +++ b/backend/it_mis/tables/LicenceTables/urls.py @@ -0,0 +1,17 @@ +from rest_framework.routers import SimpleRouter +router = SimpleRouter() + + + +from .views import LicenceViewSet, LicenceViewSetStatus +router.register("api/LicenceViewSet", LicenceViewSet) + + +from django.urls import path + +urlpatterns = [ + + path('api/LicenceViewSet/status//', LicenceViewSetStatus.as_view({'get': 'list'})), +] +urlpatterns += router.urls + diff --git a/backend/it_mis/tables/LicenceTables/views.py b/backend/it_mis/tables/LicenceTables/views.py new file mode 100644 index 0000000000000000000000000000000000000000..4128a397b796f1526101d4cba34ba8c000a8493c --- /dev/null +++ b/backend/it_mis/tables/LicenceTables/views.py @@ -0,0 +1,49 @@ +from dvadmin.utils.viewset import CustomModelViewSet + + +from .models import Licence +from .serializers import LicenceSerializer, LicenceCreateUpdateSerializer + +class LicenceViewSet(CustomModelViewSet): + """ + list:查询 + create:新增 + update:修改 + retrieve:单例 + destroy:删除 + """ + + + + queryset = Licence.objects.all() + serializer_class = LicenceSerializer + create_serializer_class = LicenceCreateUpdateSerializer + update_serializer_class = LicenceCreateUpdateSerializer + + + +class LicenceViewSetStatus(CustomModelViewSet): + + """ + list:查询时只返加状态为未使用的对象及加上自己当前的对象 + + """ + queryset = Licence.objects.all() + + + def get_queryset(self, **kwargs): + # 拿到前端传回后端的PK值,即是ID + if self.kwargs['pk']: + pk = self.kwargs['pk'] + # 将当前ID的class查出来 + additional_object = Licence.objects.filter(id=pk) + + #注释编号: django-vue3-admin-views490616:将所有未使用状态的对象查出来,#这里use_status的值1代表"在用",2代表"未用" + filtered_queryset = Licence.objects.filter(use_status=2) + + # 拼接两个对象内容,然后返回给前端 + self.queryset = filtered_queryset.union(additional_object) + + return super().get_queryset() + + serializer_class = LicenceSerializer \ No newline at end of file diff --git a/backend/it_mis/tables/LineTagTables/models.py b/backend/it_mis/tables/LineTagTables/models.py new file mode 100644 index 0000000000000000000000000000000000000000..42640506353d1c1c213226a941bbef7f947b378c --- /dev/null +++ b/backend/it_mis/tables/LineTagTables/models.py @@ -0,0 +1,121 @@ +from django.db import models +from dvadmin.utils.models import CoreModel + + +from it_mis.tables.ItNetInfoTables.models import DevicePortModel +from PublicResource.tables.globalDictTables.models import globalDictModel + + + +class NetworkFrameModel(CoreModel): + title = models.CharField(verbose_name="网络配线架", unique=True, max_length=64, blank=False) + + def __str__(self): + return self.title + + class Meta: + verbose_name = "网络配线架" + verbose_name_plural = verbose_name + ordering = ("-create_datetime",) + + + +class LineAreaModel(CoreModel): + title = models.CharField(verbose_name="线路区域", unique=True, max_length=64, blank=False) + + def __str__(self): + return self.title + + class Meta: + verbose_name = "线路区域" + verbose_name_plural = verbose_name + ordering = ("-create_datetime",) + + + + +class LineTagtypeModel(CoreModel): + title = models.CharField(verbose_name="线路类型", unique=True, max_length=64, blank=False) + + def __str__(self): + return self.title + + class Meta: + verbose_name = "线路类型" + verbose_name_plural = verbose_name + ordering = ("-create_datetime",) + + +class LineTagModel(CoreModel): + line_num = models.IntegerField(verbose_name="线编号", unique=True, help_text="该线在图纸上的编号") + seat_num = models.IntegerField(verbose_name="卡位编号", help_text="该线在图纸上所属卡位编号") + linetagtype = models.ForeignKey('LineTagtypeModel', verbose_name="线路类型", help_text="指明当前线路的类型", on_delete=models.PROTECT) + + + def __str__(self): + #注释编号: django-vue3-admin-models160018:这里要把返回的对象非str的情况下,都要转为str,这样对于导到时,才能拿到相应的数据 + return str(self.line_num) + + + + class Meta: + verbose_name = "线路标签" + verbose_name_plural = verbose_name + ordering = ("-create_datetime",) + + +class lineAccessTypeModel(CoreModel): + title = models.CharField(verbose_name="线路接入类型", unique=True, max_length=255, blank=False) + url = models.CharField(verbose_name="线路类型请求的URL", max_length=255, blank=True, null=True, help_text="线路类型请求的URL,可以通过api接口查看,或者找后端要") + label = models.CharField(verbose_name="标签", max_length=255, blank=True, null=True) + + def __str__(self): + return self.title + + class Meta: + verbose_name = "子表线路接入类型" + verbose_name_plural = verbose_name + ordering = ("-create_datetime",) + + + + + +class SubLineTagModel(CoreModel): + sortIndex = models.IntegerField(verbose_name="子表排序索引", blank=False, default=None) + + #注释编号: django-vue3-admin-models043114:这里的线路编码即是拿到的父类的ID,尽量不要更改为其它,保持默认字段名称为parentId + parentId = models.ForeignKey('LineTagModel', verbose_name="线路编码", on_delete=models.PROTECT) + lineaccesstype = models.ForeignKey('lineAccessTypeModel', verbose_name="线路接入类型", on_delete=models.PROTECT) + + #注释编号: django-vue3-admin_models443110:这个设备归属它可能会存设备\机柜\配线架之类的ID,所以必须这里设置为IntegerField,而且前端把它做成了dict-select字典类型,如果不 + #设置为IntegerField类型的话,前端重新加载页面的时候,拿到的类型就不是IntegerField数字,而是字符串了,这会导致加载出错。 + device_ownership = models.IntegerField(verbose_name="设备归属", blank=False) + + #注释编号: django-vue3-admin-models301617:device_ownership_title字段主要是匹配device_ownership字段给前端进行搜索过滤使用的 + device_ownership_title = models.CharField(verbose_name="设备归属的显示名称", max_length=255, blank=True, null=True) + + + #这里要把对应url请求存在这里,这个值由lineaccesstype的值发生变化之后,填充过来.(前端操作) + device_ownership_url = models.CharField(verbose_name="设备归属之URL", max_length=255, blank=True, null=True) + + #这里要把对应设备归属对应要显示的label给存起来,方便后期进行使用 + device_ownership_label = models.CharField(verbose_name="设备归属对应的label", max_length=255, blank=True, null=True) + + #这个标签是指URL请求回来之后,要显示的哪个字段的名称,这是给前端使用的 + + + #注释编号: django-vue3-admin-models484117:这里存储一个字符串,1代表前面、2代表后面,他的值可以去全局字典里进行渲染 + port_direction = models.IntegerField(verbose_name="端口方向", blank=True, null=True, default=None) + + + device_port = models.ForeignKey('DevicePortModel', verbose_name="端口", blank=True, null=True, on_delete=models.PROTECT) + + + def __str__(self): + return self.line_num + + + class Meta: + verbose_name = "子表线路标签" + verbose_name_plural = verbose_name diff --git a/backend/it_mis/tables/LineTagTables/serializers.py b/backend/it_mis/tables/LineTagTables/serializers.py new file mode 100644 index 0000000000000000000000000000000000000000..a6dae5fc29e1195bab76ca77c8f12d226ca3d98f --- /dev/null +++ b/backend/it_mis/tables/LineTagTables/serializers.py @@ -0,0 +1,183 @@ +from dvadmin.utils.serializers import CustomModelSerializer +from rest_framework import serializers + + +from .models import LineTagtypeModel, LineTagModel, lineAccessTypeModel, SubLineTagModel + +class LineTagtypeModelSerializer(CustomModelSerializer): + """ + 序列化器 + """ + + class Meta: + model = LineTagtypeModel + fields = "__all__" + +class LineTagtypeModelCreateUpdateSerializer(CustomModelSerializer): + """ + 创建/更新时的列化器 + """ + + class Meta: + model = LineTagtypeModel + fields = '__all__' + + +class LineTagModelSerializer(CustomModelSerializer): + """ + 序列化器 + """ + + class Meta: + model = LineTagModel + fields = "__all__" + +class LineTagModelCreateUpdateSerializer(CustomModelSerializer): + """ + 创建/更新时的列化器 + """ + + class Meta: + model = LineTagModel + fields = '__all__' + + + +class lineAccessTypeModelSerializer(CustomModelSerializer): + """ + 序列化器 + """ + + class Meta: + model = lineAccessTypeModel + fields = "__all__" + +class lineAccessTypeModelCreateUpdateSerializer(CustomModelSerializer): + """ + 创建/更新时的列化器 + """ + + class Meta: + model = lineAccessTypeModel + fields = '__all__' + + + +class SubLineTagModelSerializer(CustomModelSerializer): + """ + 序列化器 + """ + + class Meta: + model = SubLineTagModel + fields = "__all__" + +class SubLineTagModelCreateUpdateSerializer(CustomModelSerializer): + """ + 创建/更新时的列化器 + """ + + class Meta: + model = SubLineTagModel + fields = '__all__' + + + def validate(self, attrs): + lineaccesstype = attrs.get('lineaccesstype') + device_ownership = attrs.get('device_ownership') + device_ownership_url = attrs.get('device_ownership_url') + port_direction = attrs.get('port_direction') + device_port = attrs.get('device_port') + + + # 检查是否已经有相同的组合存在 + #注释编号: django-vue3-admin-serializers593615:对子表设备类型、设备归属、URL、端口方向及端口组合做联合校验 + if lineaccesstype and device_ownership and device_ownership_url and port_direction and device_port: + + #这里拿到查询结果,这里肯定只能拿到一个对象 + obj_queryset = SubLineTagModel.objects.filter(lineaccesstype=lineaccesstype, device_ownership=device_ownership, device_ownership_url=device_ownership_url, port_direction=port_direction, device_port=device_port) + if obj_queryset.exists(): + if self.request.data.get('id'): + + if self.request.data['id'] == obj_queryset.get().id: + # 如果传过来的id等于数据查到相同对象的id,那么说明就是当前的旧对象做修改,而且与自己起了冲突 + pass + else: + #如果两个id不相等,说明是直正的两条对象冲突了 + raise serializers.ValidationError("相应的接入类型对应的接口方向及端口的组合出现重复,请修改成其它组合") + else: + #新建对象时,就是没有id的,也要进行检验 + raise serializers.ValidationError("相应的接入类型对应的接口方向及端口的组合出现重复,请修改成其它组合") + + return attrs + + + + + +from it_mis.tables.ItResourceTables.models import ItResource + +class ItResourceViewSetSubSerializer(CustomModelSerializer): + """ + 序列化器 + """ + # it_use = serializers.PrimaryKeyRelatedField(source='it_use.use',queryset = ItResource.objects.all()) # 不建议在这里配置序列化字段,会导致外部编辑页面更新出错 + + class Meta: + model = ItResource + fields = "__all__" + + + +class ItResourceViewSetSubUpdateSerializer(CustomModelSerializer): + """ + 创建/更新时的列化器 + """ + + class Meta: + model = ItResource + fields = '__all__' + + + +from .models import LineAreaModel + +class LineAreaModelSerializer(CustomModelSerializer): + """ + 序列化器 + """ + + class Meta: + model = LineAreaModel + fields = "__all__" + +class LineAreaModelCreateUpdateSerializer(CustomModelSerializer): + """ + 创建/更新时的列化器 + """ + + class Meta: + model = LineAreaModel + fields = '__all__' + + + +from .models import NetworkFrameModel + +class NetworkFrameModelSerializer(CustomModelSerializer): + """ + 序列化器 + """ + + class Meta: + model = NetworkFrameModel + fields = "__all__" + +class NetworkFrameModelCreateUpdateSerializer(CustomModelSerializer): + """ + 创建/更新时的列化器 + """ + + class Meta: + model = NetworkFrameModel + fields = '__all__' \ No newline at end of file diff --git a/backend/it_mis/tables/LineTagTables/urls.py b/backend/it_mis/tables/LineTagTables/urls.py new file mode 100644 index 0000000000000000000000000000000000000000..c363d88d0607e723a1dbcef4c2dbaa2ca6f793b2 --- /dev/null +++ b/backend/it_mis/tables/LineTagTables/urls.py @@ -0,0 +1,38 @@ +from rest_framework.routers import SimpleRouter +router = SimpleRouter() + + +from .views import LineTagtypeModelViewSet +router.register("api/LineTagtypeModelViewSet", LineTagtypeModelViewSet) + +from .views import LineTagModelViewSet +router.register("api/LineTagModelViewSet", LineTagModelViewSet) + +from .views import lineAccessTypeModelViewSet +router.register("api/lineAccessTypeModelViewSet", lineAccessTypeModelViewSet) + +from .views import SubLineTagModelViewSet +router.register("api/SubLineTagModelViewSet", SubLineTagModelViewSet) + + +from .views import ItResourceViewSetSub +router.register("api/ItResourceViewSetSub", ItResourceViewSetSub) + + +from .views import LineAreaModelViewSet + +router.register("api/LineAreaModelViewSet", LineAreaModelViewSet) + + +from .views import NetworkFrameModelViewSet + +router.register("api/NetworkFrameModelViewSet", NetworkFrameModelViewSet) + + + + +urlpatterns = [ + + +] +urlpatterns += router.urls \ No newline at end of file diff --git a/backend/it_mis/tables/LineTagTables/views.py b/backend/it_mis/tables/LineTagTables/views.py new file mode 100644 index 0000000000000000000000000000000000000000..0c1704ce12d73fee49c8a65e33e547de69213382 --- /dev/null +++ b/backend/it_mis/tables/LineTagTables/views.py @@ -0,0 +1,200 @@ +from dvadmin.utils.viewset import CustomModelViewSet +from dvadmin.utils.json_response import SuccessResponse, DetailResponse +from rest_framework.decorators import action + +from django.db.models import Q + + + +from .models import LineTagtypeModel +from .serializers import LineTagtypeModelSerializer, LineTagtypeModelCreateUpdateSerializer + +class LineTagtypeModelViewSet(CustomModelViewSet): + """ + list:查询 + create:新增 + update:修改 + retrieve:单例 + destroy:删除 + """ + + + queryset = LineTagtypeModel.objects.all() + serializer_class = LineTagtypeModelSerializer + create_serializer_class = LineTagtypeModelCreateUpdateSerializer + update_serializer_class = LineTagtypeModelCreateUpdateSerializer + + + + +from .models import LineTagModel +from .serializers import LineTagModelSerializer, LineTagModelCreateUpdateSerializer + +class LineTagModelViewSet(CustomModelViewSet): + """ + list:查询 + create:新增 + update:修改 + retrieve:单例 + destroy:删除 + """ + + + queryset = LineTagModel.objects.all() + serializer_class = LineTagModelSerializer + create_serializer_class = LineTagModelCreateUpdateSerializer + update_serializer_class = LineTagModelCreateUpdateSerializer + + + + +from .models import lineAccessTypeModel +from .serializers import lineAccessTypeModelSerializer, lineAccessTypeModelCreateUpdateSerializer + +class lineAccessTypeModelViewSet(CustomModelViewSet): + """ + list:查询 + create:新增 + update:修改 + retrieve:单例 + destroy:删除 + """ + + + queryset = lineAccessTypeModel.objects.all() + serializer_class = lineAccessTypeModelSerializer + create_serializer_class = lineAccessTypeModelCreateUpdateSerializer + update_serializer_class = lineAccessTypeModelCreateUpdateSerializer + + + def get_queryset(self): + queryset = super().get_queryset() + + # 注释编号:django-vue3-admin-views123317 + # 功能说明:如果有传过来filterUrlAndLabel的值,就说明要对url及label字段进行过滤,只返回url及label为非空的对象 + filterUrlAndLabel = self.request.query_params.get('filterUrlAndLabel', None) + if filterUrlAndLabel: + #这里前面要导入from django.db.models import Q + queryset = queryset.filter( Q(url__isnull=False) & Q(label__isnull=False)) + # 注释编号:django-vue3-admin-views123317 + return queryset + + + + +from .models import SubLineTagModel +from .serializers import SubLineTagModelSerializer, SubLineTagModelCreateUpdateSerializer + +class SubLineTagModelViewSet(CustomModelViewSet): + """ + list:查询 + create:新增 + update:修改 + retrieve:单例 + destroy:删除 + """ + + + queryset = SubLineTagModel.objects.all() + serializer_class = SubLineTagModelSerializer + create_serializer_class = SubLineTagModelCreateUpdateSerializer + update_serializer_class = SubLineTagModelCreateUpdateSerializer + + + # 注释编号:django-vue3-admin-views255815 + # 功能说明:这里做查询的以sortIndex进行正向排序 + + def get_queryset(self): + queryset = super().get_queryset() + ordering = self.request.query_params.get('ordering', None) + if ordering: + queryset = queryset.order_by(ordering) + else: + queryset = queryset.order_by('sortIndex') + return queryset + # 注释编号:django-vue3-admin-views255815 + + + + + +from it_mis.tables.ItResourceTables.models import ItResource + +from .serializers import ItResourceViewSetSubSerializer, ItResourceViewSetSubUpdateSerializer + +class ItResourceViewSetSub(CustomModelViewSet): + """ + list:查询 + create:新增 + update:修改 + retrieve:单例 + destroy:删除 + """ + + + + queryset = ItResource.objects.all() + serializer_class = ItResourceViewSetSubSerializer + create_serializer_class = ItResourceViewSetSubUpdateSerializer + update_serializer_class = ItResourceViewSetSubUpdateSerializer + + # 注释编号:django-vue3-admin-views314415 + # 功能说明:在这个线路标签当中突然引用了ItResource之IT资源表,就是为了单独做这个过滤is_device_resource=True + def get_queryset(self): + self.queryset = ItResource.objects.filter(is_device_resource=True) + # 注释编号:django-vue3-admin-views314415 + + + return super().get_queryset() + + + + +from .models import LineAreaModel +from .serializers import LineAreaModelSerializer, LineAreaModelCreateUpdateSerializer + +class LineAreaModelViewSet(CustomModelViewSet): + """ + list:查询 + create:新增 + update:修改 + retrieve:单例 + destroy:删除 + """ + + + queryset = LineAreaModel.objects.all() + serializer_class = LineAreaModelSerializer + create_serializer_class = LineAreaModelCreateUpdateSerializer + update_serializer_class = LineAreaModelCreateUpdateSerializer + + + def get_queryset(self): + queryset = super().get_queryset() + #这里拿到request传过来的参数,我们主要是判断是否有ordering的key在里面嘛,有的话直接使用ordering排序,没有的话就给个None,接下来就是使用默认排序 + ordering = self.request.query_params.get('ordering', None) + if ordering: + queryset = queryset.order_by(ordering) + else: + queryset = queryset.order_by('-create_datetime') + return queryset + + + +from .models import NetworkFrameModel +from .serializers import NetworkFrameModelSerializer, NetworkFrameModelCreateUpdateSerializer + +class NetworkFrameModelViewSet(CustomModelViewSet): + """ + list:查询 + create:新增 + update:修改 + retrieve:单例 + destroy:删除 + """ + + + queryset = NetworkFrameModel.objects.all() + serializer_class = NetworkFrameModelSerializer + create_serializer_class = NetworkFrameModelCreateUpdateSerializer + update_serializer_class = NetworkFrameModelCreateUpdateSerializer \ No newline at end of file diff --git a/backend/it_mis/tables/SuppliersTables/modelFilter.py b/backend/it_mis/tables/SuppliersTables/modelFilter.py new file mode 100644 index 0000000000000000000000000000000000000000..b732c10b9a6e02b77c21587fd59189d1b00abc67 --- /dev/null +++ b/backend/it_mis/tables/SuppliersTables/modelFilter.py @@ -0,0 +1,14 @@ + +import django_filters +from .models import Suppliers + + +class SuppliersFilter(django_filters.rest_framework.FilterSet): + title = django_filters.CharFilter(field_name='title', lookup_expr='icontains') + name = django_filters.CharFilter(field_name='name', lookup_expr='icontains') + fixed_phone = django_filters.CharFilter(field_name='fixed_phone', lookup_expr='icontains') + mobile_phone = django_filters.CharFilter(field_name='mobile_phone', lookup_expr='icontains') + + class Meta: + model = Suppliers + fields = "__all__" #这里配置所有字段可查 \ No newline at end of file diff --git a/backend/it_mis/tables/SuppliersTables/models.py b/backend/it_mis/tables/SuppliersTables/models.py new file mode 100644 index 0000000000000000000000000000000000000000..fe59dd64aaa0a6db25216c57963f1c392039f4ce --- /dev/null +++ b/backend/it_mis/tables/SuppliersTables/models.py @@ -0,0 +1,52 @@ + +from django.db import models +from dvadmin.utils.models import CoreModel + +from PublicResource.tables.OrganizationTables.models import AreaModel + + +class SuppliersType(CoreModel): + title = models.CharField(verbose_name="供应商类型", max_length=64, blank=False) + + def __str__(self): + return self.title + + class Meta: + verbose_name = "供应商类型" + verbose_name_plural = verbose_name + ordering = ("-create_datetime",) + + +# class SuppliersBelongToType(CoreModel): +# title = models.CharField(verbose_name="供应商归属类型", max_length=64, blank=False) + +# def __str__(self): +# return self.title + +# class Meta: +# verbose_name = "供应商归属类型" +# verbose_name_plural = verbose_name +# ordering = ("-create_datetime",) + +#这里引用了IT网络资源类型表进来复用 +from it_mis.tables.ItNetInfoTables.models import ItNetType + +class Suppliers(CoreModel): + resource_area = models.ForeignKey(to=AreaModel, verbose_name="区域", null=True, default=None, on_delete=models.PROTECT) + suppliers_type = models.ForeignKey(to=SuppliersType, verbose_name="供应商类型", null=True, default=None, on_delete=models.PROTECT) + SuppliersBelongToType = models.ForeignKey(to=ItNetType, verbose_name="供应商归属类型", null=True, default=None, on_delete=models.PROTECT, help_text="这里引用了IT网络资源类型表进来复用") + title = models.CharField(verbose_name="供应商描述", max_length=64, blank=False, help_text='''填方便查找的供应商名称或提供服务之类的关健字''') + name = models.CharField(verbose_name="联系人", unique=True, max_length=64, blank=False, default="") + fixed_phone = models.BigIntegerField(verbose_name="固定电话", help_text="全部数字,不能记录的号码请直接使用备注", blank=True, null=True) + mobile_phone = models.BigIntegerField(verbose_name="移动电话", help_text="全部数字,不能记录的号码请直接使用备注", blank=True, null=True) + email = models.EmailField(verbose_name="邮箱地址", unique=True, default="", blank=True, null=True) + addr = models.CharField(verbose_name="供应商地址", max_length=128, blank=True, null=True) + status = models.BooleanField(verbose_name="服务状态", default=True) + + def __str__(self): + return self.title + + class Meta: + verbose_name = "供应商" + verbose_name_plural = verbose_name + ordering = ("-create_datetime",) \ No newline at end of file diff --git a/backend/it_mis/tables/SuppliersTables/serializers.py b/backend/it_mis/tables/SuppliersTables/serializers.py new file mode 100644 index 0000000000000000000000000000000000000000..efd52b3f782a384dd7f9dd50a0792c0321856ee2 --- /dev/null +++ b/backend/it_mis/tables/SuppliersTables/serializers.py @@ -0,0 +1,46 @@ +from dvadmin.utils.serializers import CustomModelSerializer +from rest_framework import serializers + + +from .models import SuppliersType + +class SuppliersTypeSerializer(CustomModelSerializer): + """ + 序列化器 + """ + + class Meta: + model = SuppliersType + fields = "__all__" + +class SuppliersTypeCreateUpdateSerializer(CustomModelSerializer): + """ + 创建/更新时的列化器 + """ + + class Meta: + model = SuppliersType + fields = '__all__' + + + + +from .models import Suppliers + +class SuppliersSerializer(CustomModelSerializer): + """ + 序列化器 + """ + + class Meta: + model = Suppliers + fields = "__all__" + +class SuppliersCreateUpdateSerializer(CustomModelSerializer): + """ + 创建/更新时的列化器 + """ + + class Meta: + model = Suppliers + fields = '__all__' diff --git a/backend/it_mis/tables/SuppliersTables/urls.py b/backend/it_mis/tables/SuppliersTables/urls.py new file mode 100644 index 0000000000000000000000000000000000000000..7a332070f894dde4301cfb7479eeabb8b3669e9c --- /dev/null +++ b/backend/it_mis/tables/SuppliersTables/urls.py @@ -0,0 +1,20 @@ +from rest_framework.routers import SimpleRouter +router = SimpleRouter() + + + +from .views import SuppliersViewSet, SuppliersTypeViewSet +router.register("api/SuppliersViewSet", SuppliersViewSet) +router.register("api/SuppliersTypeViewSet", SuppliersTypeViewSet) + + + + +# from django.urls import path, include + +urlpatterns = [ + + +] +urlpatterns += router.urls + diff --git a/backend/it_mis/tables/SuppliersTables/views.py b/backend/it_mis/tables/SuppliersTables/views.py new file mode 100644 index 0000000000000000000000000000000000000000..3e3ab86649859ee5c02b6f1b9add1b666967d9b7 --- /dev/null +++ b/backend/it_mis/tables/SuppliersTables/views.py @@ -0,0 +1,40 @@ +from dvadmin.utils.viewset import CustomModelViewSet + +from .models import SuppliersType +from .serializers import SuppliersTypeSerializer, SuppliersTypeCreateUpdateSerializer + +class SuppliersTypeViewSet(CustomModelViewSet): + """ + list:查询 + create:新增 + update:修改 + retrieve:单例 + destroy:删除 + """ + + queryset = SuppliersType.objects.all() + serializer_class = SuppliersTypeSerializer + create_serializer_class = SuppliersTypeCreateUpdateSerializer + update_serializer_class = SuppliersTypeCreateUpdateSerializer + + +from it_mis.tables.SuppliersTables.models import Suppliers +from it_mis.tables.SuppliersTables.serializers import SuppliersSerializer, SuppliersCreateUpdateSerializer + +from .modelFilter import SuppliersFilter + +class SuppliersViewSet(CustomModelViewSet): + """ + list:查询 + create:新增 + update:修改 + retrieve:单例 + destroy:删除 + """ + + queryset = Suppliers.objects.all() + serializer_class = SuppliersSerializer + create_serializer_class = SuppliersCreateUpdateSerializer + update_serializer_class = SuppliersCreateUpdateSerializer + # 注释编号:django-vue3-admin__views321210: 这个filter_class是自定义配置的过滤,模糊查询也可以在里面进行配置 + filter_class = SuppliersFilter \ No newline at end of file diff --git a/backend/it_mis/tables/TelephoneTables/models.py b/backend/it_mis/tables/TelephoneTables/models.py new file mode 100644 index 0000000000000000000000000000000000000000..1cb6dd645533660a985cac9b229cd6bd25c655ff --- /dev/null +++ b/backend/it_mis/tables/TelephoneTables/models.py @@ -0,0 +1,143 @@ +from django.db import models +from dvadmin.utils.models import CoreModel + +from PublicResource.tables.OrganizationTables.models import AreaModel, CompanyModel, DepartmentModel +from PublicResource.tables.OrganizationTables.models import OrganizationModel + +from it_mis.tables.SuppliersTables.models import Suppliers + + +class TelephoneTypeModel(CoreModel): + title = models.CharField(verbose_name="电话类型", unique=True, max_length=64, blank=False) + + def __str__(self): + return self.title + + class Meta: + verbose_name = "电话类型" + verbose_name_plural = verbose_name + ordering = ("-create_datetime",) + + +class lineAccessModel(CoreModel): + title = models.CharField(verbose_name="线路接入信息", unique=True, max_length=64, blank=False) + + def __str__(self): + return self.title + + class Meta: + verbose_name = "线路接入信息" + verbose_name_plural = verbose_name + ordering = ("-create_datetime",) + + + +#这里引用了IT网络资源类型表进来复用 +from it_mis.tables.ItNetInfoTables.models import ItNetType +from PublicResource.tables.globalDictTables.models import globalDictModel + +class TelephoneModel(CoreModel): + + # 注释编号:django-vue3-admin-models570211 + # 功能说明:号码归属信息 + + company = models.ForeignKey(to=CompanyModel, verbose_name="号码归属公司", related_name="Telcompany", on_delete=models.PROTECT) + area = models.ForeignKey(to=AreaModel, verbose_name="号码归属区域", related_name="Telarea", on_delete=models.PROTECT) + department = models.ForeignKey(to=DepartmentModel, verbose_name="号码归属部门", related_name="Teldepartment", on_delete=models.PROTECT) + TelUser = models.ForeignKey(to=OrganizationModel, verbose_name="号码使用人", related_name="TelUser", on_delete=models.PROTECT, blank=True, null=True, default=None) + TelRealPerson = models.ForeignKey(to=OrganizationModel, verbose_name="号码实名认证人", related_name="TelRealPerson", on_delete=models.PROTECT) + realDepartment = models.ForeignKey(to=DepartmentModel, verbose_name="号码管理部门", on_delete=models.PROTECT) + + # 注释编号:django-vue3-admin-models570211 + + + TelAreaNum = models.CharField(verbose_name="号码区号", max_length=64, blank=False, default=None) + TelNumber = models.CharField(verbose_name="号码Num", unique=True, max_length=64, blank=False) + Telstatus = models.ForeignKey(to=globalDictModel, verbose_name="号码状态", on_delete=models.PROTECT, default=None, help_text="这里引用了全局字典表进来复用") + + TelephoneType = models.ForeignKey(to=TelephoneTypeModel, verbose_name="电话类型", on_delete=models.PROTECT) + SuppliersItNetType = models.ForeignKey(to=ItNetType, verbose_name="供应商类型", null=True, default=None, on_delete=models.PROTECT, help_text="这里引用了IT网络资源类型表进来复用") + Suppliers = models.ForeignKey(to=Suppliers, verbose_name="供应商", on_delete=models.PROTECT) + # data = models.DateField(verbose_name="日期", blank=True, null=True) + + + #如下是转接配置需求,比如远程地址、远程账号、远程密码,转接描述等 + transfer_address = models.CharField(verbose_name="转接需求地址", max_length=255, blank=True, null=True) + transfer_dial_num = models.CharField(verbose_name="转接拨打号码", max_length=255, blank=True, null=True) + transfer_account = models.CharField(verbose_name="转接需求账号", max_length=255, blank=True, null=True) + transfer_password = models.CharField(verbose_name="转接需求密码", max_length=255, blank=True, null=True) + transfer_description = models.CharField(verbose_name="转接需求描述", max_length=255, blank=True, null=True) + + + def __str__(self): + return self.TelNumber + + class Meta: + verbose_name = "电话表" + verbose_name_plural = verbose_name + ordering = ("-create_datetime",) + + + +class TelAccessTypeModel(CoreModel): + """ + 电话接入类型,是主要给电话转接飞线表里面的联动选择使用的 + """ + title = models.CharField(verbose_name="电话接入类型", unique=True, max_length=255, blank=False) + Tel_access_url = models.CharField(verbose_name="电话类型请求的URL", unique=True, max_length=255, blank=False, help_text="电话类型请求的URL,可以通过api接口查看,或者找后端要") + label = models.CharField(verbose_name="标签", max_length=255, blank=True, null=True) + + def __str__(self): + return self.title + + class Meta: + verbose_name = "电话子表线路接入类型" + verbose_name_plural = verbose_name + ordering = ("-create_datetime",) + + +from it_mis.tables.LineTagTables.models import lineAccessTypeModel + + + + +class SubTelephoneModelShareCommonInfo(models.Model): + # 公共字段定义在这里 + + #所有子表对应父表的ID,都默认使用parentId,这样对于前端的api配置就可以统一 + parentId = models.ForeignKey('TelephoneModel', verbose_name="关联电话号码", on_delete=models.PROTECT, help_text="这里拿到的实际是关联电话号码的ID,而不是电话号码的值") + + sortIndex = models.IntegerField(verbose_name="子表排序索引", blank=False, default=None) + + #注释编号: django-vue3-admin-models394110:接入类型及对应的需求title、URL、label + accesstype = models.ForeignKey('lineAccessTypeModel', verbose_name="接入类型", blank=True, null=True, default=None, on_delete=models.PROTECT) + accessInfo = models.CharField(verbose_name="接入信息", max_length=255, blank=True, null=True, default=None) + + url = models.CharField(verbose_name="接入类型之URL", max_length=255, blank=True, null=True) + label = models.CharField(verbose_name="接入类型对应的label", max_length=255, blank=True, null=True) + + #这里存储一个字符串,1代表前面、2代表后面,他的值可以去全局字典里进行渲染 + port_direction = models.IntegerField(verbose_name="端口方向", blank=True, null=True, default=None) + device_port = models.ForeignKey('DevicePortModel', verbose_name="端口", blank=True, null=True, on_delete=models.PROTECT) + # 你可以添加更多的公共字段... + + class Meta: + abstract = True # 抽象基类,不会为它创建数据库表 + + + + +class SubTelephoneModel(CoreModel, SubTelephoneModelShareCommonInfo): + """ + 电话转接飞线表是针对TelephoneModel电话表做成的子表,这样前端可以套在TelephoneModel电话表中,录入多条电话号码转接情况数据 + """ + + + def __str__(self): + return self.title + + class Meta: + verbose_name = "电话子表之转接飞线表" + verbose_name_plural = verbose_name + ordering = ("-create_datetime",) + diff --git a/backend/it_mis/tables/TelephoneTables/mysql_view_models.py b/backend/it_mis/tables/TelephoneTables/mysql_view_models.py new file mode 100644 index 0000000000000000000000000000000000000000..80a9b6cb20924b6f808936de68ec09614e9a976c --- /dev/null +++ b/backend/it_mis/tables/TelephoneTables/mysql_view_models.py @@ -0,0 +1,57 @@ +from django.db import models + +from dvadmin.utils.models import CoreModel + + +from it_mis.tables.TelephoneTables.models import SubTelephoneModelShareCommonInfo +from PublicResource.tables.OrganizationTables.models import CompanyModel, AreaModel, DepartmentModel, OrganizationModel + +class MysqlViewSubTelephoneModel(CoreModel, SubTelephoneModelShareCommonInfo): + """ + mysql视图子表之转接飞线表 + 就在这里面添加额外的属性,其它的不需要写出来,因为我们已经继承了CoreModel, SubTelephoneModelShareCommonInfo + """ + company = models.ForeignKey(to=CompanyModel, verbose_name="号码归属公司", related_name="MysqlVViewSubTelephoneModel_Telcompany", on_delete=models.PROTECT) + area = models.ForeignKey(to=AreaModel, verbose_name="号码归属区域", related_name="MysqlVViewSubTelephoneModel_Telarea", on_delete=models.PROTECT) + department = models.ForeignKey(to=DepartmentModel, verbose_name="号码归属部门", related_name="MysqlVViewSubTelephoneModel_Teldepartment", on_delete=models.PROTECT) + TelUser = models.ForeignKey(to=OrganizationModel, verbose_name="号码使用人", related_name="MysqlVViewSubTelephoneModel_TelUser", on_delete=models.PROTECT, blank=True, null=True, default=None) + TelRealPerson = models.ForeignKey(to=OrganizationModel, verbose_name="号码实名认证人", related_name="MysqlVViewSubTelephoneModel_TelRealPerson", on_delete=models.PROTECT) + realDepartment = models.ForeignKey(to=DepartmentModel, verbose_name="号码管理部门", related_name="MysqlVViewSubTelephoneModel_realDepartment", on_delete=models.PROTECT) + + + + class Meta: + verbose_name = "电话子表筛选专用表" + verbose_name_plural = verbose_name + db_table = 'MysqlViewSubTelephoneModel' + managed = False #本表不被包括在makemigrations和migrate命令中 + ordering = ("-id",) + # ordering = ("-create_datetime",) + + + + + +from dvadmin.utils.serializers import CustomModelSerializer + +class MysqlViewSubTelephoneModelSerializer(CustomModelSerializer): + """ + 序列化器 + """ + + class Meta: + model = MysqlViewSubTelephoneModel + fields = "__all__" + + + +from dvadmin.utils.viewset import CustomModelViewSet + +class MysqlViewSubTelephoneModelViewSet(CustomModelViewSet): + """ + list:查询 + """ + queryset = MysqlViewSubTelephoneModel.objects.all() + serializer_class = MysqlViewSubTelephoneModelSerializer + # create_serializer_class = MysqlVViewSubTelephoneModelCreateUpdateSerializer + # update_serializer_class = MysqlVViewSubTelephoneModelCreateUpdateSerializer \ No newline at end of file diff --git a/backend/it_mis/tables/TelephoneTables/serializers.py b/backend/it_mis/tables/TelephoneTables/serializers.py new file mode 100644 index 0000000000000000000000000000000000000000..f25630e45670b99818748782fd7295f9eb3a74a6 --- /dev/null +++ b/backend/it_mis/tables/TelephoneTables/serializers.py @@ -0,0 +1,140 @@ +from dvadmin.utils.serializers import CustomModelSerializer +from rest_framework import serializers + + +from .models import TelephoneTypeModel + +class TelephoneTypeModelSerializer(CustomModelSerializer): + """ + 序列化器 + """ + + class Meta: + model = TelephoneTypeModel + fields = "__all__" + +class TelephoneTypeModelCreateUpdateSerializer(CustomModelSerializer): + """ + 创建/更新时的列化器 + """ + + class Meta: + model = TelephoneTypeModel + fields = '__all__' + + + +from .models import lineAccessModel + +class lineAccessModelSerializer(CustomModelSerializer): + """ + 序列化器 + """ + + class Meta: + model = lineAccessModel + fields = "__all__" + +class lineAccessModelCreateUpdateSerializer(CustomModelSerializer): + """ + 创建/更新时的列化器 + """ + + class Meta: + model = lineAccessModel + fields = '__all__' + + + +from .models import TelephoneModel +class TelephoneModelSerializer(CustomModelSerializer): + """ + 序列化器 + """ + + class Meta: + model = TelephoneModel + fields = "__all__" + +class TelephoneModelCreateUpdateSerializer(CustomModelSerializer): + """ + 创建/更新时的列化器 + """ + + class Meta: + model = TelephoneModel + fields = '__all__' + + + +from .models import TelAccessTypeModel +class TelAccessTypeModelSerializer(CustomModelSerializer): + """ + 序列化器 + """ + + class Meta: + model = TelAccessTypeModel + fields = "__all__" + +class TelAccessTypeModelCreateUpdateSerializer(CustomModelSerializer): + """ + 创建/更新时的列化器 + """ + + class Meta: + model = TelAccessTypeModel + fields = '__all__' + + + + +from .models import SubTelephoneModel +class SubTelephoneModelSerializer(CustomModelSerializer): + """ + 序列化器 + """ + + class Meta: + model = SubTelephoneModel + fields = "__all__" + +class SubTelephoneModelCreateUpdateSerializer(CustomModelSerializer): + """ + 创建/更新时的列化器 + """ + + class Meta: + model = SubTelephoneModel + fields = '__all__' + + + + def validate(self, attrs): + accesstype = attrs.get('accesstype') + accessInfo = attrs.get('accessInfo') + url = attrs.get('url') + port_direction = attrs.get('port_direction') + device_port = attrs.get('device_port') + + + # 检查是否已经有相同的组合存在 + #对子表accesstype、accessInfo、url、port_direction、device_port组合做联合校验 + if accesstype and accessInfo and url and port_direction and device_port: + + #这里拿到查询结果,这里肯定只能拿到一个对象 + obj_queryset = SubTelephoneModel.objects.filter(accesstype=accesstype, accessInfo=accessInfo, url=url, port_direction=port_direction, device_port=device_port) + if obj_queryset.exists(): + if self.request.data.get('id'): + + if self.request.data['id'] == obj_queryset.get().id: + # 如果传过来的id等于数据查到相同对象的id,那么说明就是当前的旧对象做修改,而且与自己起了冲突 + pass + else: + #如果两个id不相等,说明是直正的两条对象冲突了 + raise serializers.ValidationError("相应的接入类型对应的接口方向及端口的组合出现重复,请修改成其它组合") + else: + #新建对象时,就是没有id的,也要进行检验 + raise serializers.ValidationError("相应的接入类型对应的接口方向及端口的组合出现重复,请修改成其它组合") + + return attrs \ No newline at end of file diff --git a/backend/it_mis/tables/TelephoneTables/urls.py b/backend/it_mis/tables/TelephoneTables/urls.py new file mode 100644 index 0000000000000000000000000000000000000000..6c3e50cae71f3abf32623958e66662760fdd265d --- /dev/null +++ b/backend/it_mis/tables/TelephoneTables/urls.py @@ -0,0 +1,21 @@ +from rest_framework.routers import SimpleRouter +router = SimpleRouter() + + +from .views import TelephoneTypeModelViewSet, TelephoneModelViewSet, TelAccessTypeModelViewSet, SubTelephoneModelViewSet, lineAccessModelViewSet +router.register("api/TelephoneTypeModelViewSet", TelephoneTypeModelViewSet) +router.register("api/TelephoneModelViewSet", TelephoneModelViewSet) +router.register("api/TelAccessTypeModelViewSet", TelAccessTypeModelViewSet) +router.register("api/SubTelephoneModelViewSet", SubTelephoneModelViewSet) +router.register("api/lineAccessModelViewSet", lineAccessModelViewSet) + + +from .mysql_view_models import MysqlViewSubTelephoneModelViewSet +router.register("api/MysqlViewSubTelephoneModelViewSet", MysqlViewSubTelephoneModelViewSet) + + +urlpatterns = [ + + +] +urlpatterns += router.urls \ No newline at end of file diff --git a/backend/it_mis/tables/TelephoneTables/views.py b/backend/it_mis/tables/TelephoneTables/views.py new file mode 100644 index 0000000000000000000000000000000000000000..cd4f112ae2d49c8bf9449f6f3d14866fdf53978a --- /dev/null +++ b/backend/it_mis/tables/TelephoneTables/views.py @@ -0,0 +1,114 @@ +from dvadmin.utils.viewset import CustomModelViewSet +from dvadmin.utils.json_response import SuccessResponse, DetailResponse +from rest_framework.decorators import action + + + +from .models import TelephoneTypeModel +from .serializers import TelephoneTypeModelSerializer, TelephoneTypeModelCreateUpdateSerializer + +class TelephoneTypeModelViewSet(CustomModelViewSet): + """ + list:查询 + create:新增 + update:修改 + retrieve:单例 + destroy:删除 + """ + + + queryset = TelephoneTypeModel.objects.all() + serializer_class = TelephoneTypeModelSerializer + create_serializer_class = TelephoneTypeModelCreateUpdateSerializer + update_serializer_class = TelephoneTypeModelCreateUpdateSerializer + + + + +from .models import TelephoneModel +from .serializers import TelephoneModelSerializer, TelephoneModelCreateUpdateSerializer + +class TelephoneModelViewSet(CustomModelViewSet): + """ + list:查询 + create:新增 + update:修改 + retrieve:单例 + destroy:删除 + """ + + + queryset = TelephoneModel.objects.all() + serializer_class = TelephoneModelSerializer + create_serializer_class = TelephoneModelCreateUpdateSerializer + update_serializer_class = TelephoneModelCreateUpdateSerializer + + + +from .models import TelAccessTypeModel +from .serializers import TelAccessTypeModelSerializer, TelAccessTypeModelCreateUpdateSerializer + +class TelAccessTypeModelViewSet(CustomModelViewSet): + """ + list:查询 + create:新增 + update:修改 + retrieve:单例 + destroy:删除 + """ + + + queryset = TelAccessTypeModel.objects.all() + serializer_class = TelAccessTypeModelSerializer + create_serializer_class = TelAccessTypeModelCreateUpdateSerializer + update_serializer_class = TelAccessTypeModelCreateUpdateSerializer + + + +from .models import lineAccessModel +from .serializers import lineAccessModelSerializer, lineAccessModelCreateUpdateSerializer + +class lineAccessModelViewSet(CustomModelViewSet): + """ + list:查询 + create:新增 + update:修改 + retrieve:单例 + destroy:删除 + """ + + + queryset = lineAccessModel.objects.all() + serializer_class = lineAccessModelSerializer + create_serializer_class = lineAccessModelCreateUpdateSerializer + update_serializer_class = lineAccessModelCreateUpdateSerializer + + + +from .models import SubTelephoneModel +from .serializers import SubTelephoneModelSerializer, SubTelephoneModelCreateUpdateSerializer + +class SubTelephoneModelViewSet(CustomModelViewSet): + """ + list:查询 + create:新增 + update:修改 + retrieve:单例 + destroy:删除 + """ + + + queryset = SubTelephoneModel.objects.all() + serializer_class = SubTelephoneModelSerializer + create_serializer_class = SubTelephoneModelCreateUpdateSerializer + update_serializer_class = SubTelephoneModelCreateUpdateSerializer + + + def get_queryset(self): + queryset = super().get_queryset() + ordering = self.request.query_params.get('ordering', None) + if ordering: + queryset = queryset.order_by(ordering) + else: + queryset = queryset.order_by('sortIndex') + return queryset \ No newline at end of file diff --git a/backend/it_mis/tests.py b/backend/it_mis/tests.py new file mode 100644 index 0000000000000000000000000000000000000000..7ce503c2dd97ba78597f6ff6e4393132753573f6 --- /dev/null +++ b/backend/it_mis/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/backend/it_mis/urls.py b/backend/it_mis/urls.py new file mode 100644 index 0000000000000000000000000000000000000000..65b6e5fd851117083607b518c619adb3a40637b1 --- /dev/null +++ b/backend/it_mis/urls.py @@ -0,0 +1,16 @@ +from rest_framework.routers import SimpleRouter +router = SimpleRouter() + + + +from django.urls import path, include +urlpatterns = [ + + path('',include('it_mis.tables.ItResourceTables.urls')), + path('',include('it_mis.tables.SuppliersTables.urls')), + path('',include('it_mis.tables.LicenceTables.urls')), + path('',include('it_mis.tables.ItNetInfoTables.urls')), + path('',include('it_mis.tables.LineTagTables.urls')), + path('',include('it_mis.tables.TelephoneTables.urls')), #注释编号: django-vue3-admin-urls193916:导入电话表TelephoneTables的urls +] +urlpatterns += router.urls \ No newline at end of file diff --git "a/backend/it_mis/\347\233\256\345\275\225\350\257\264\346\230\216\345\277\205\347\234\213.md" "b/backend/it_mis/\347\233\256\345\275\225\350\257\264\346\230\216\345\277\205\347\234\213.md" new file mode 100644 index 0000000000000000000000000000000000000000..e5cfb6f118d33b23396c13c98e53534ee39fe1c1 --- /dev/null +++ "b/backend/it_mis/\347\233\256\345\275\225\350\257\264\346\230\216\345\277\205\347\234\213.md" @@ -0,0 +1,6 @@ +1、在app应用的根目录下,创建一个文件夹tables(其它的APP都是参考这个目录构架方法) +2、根据某一张较大逻辑表建立一个tables目录,比如线路表,跟线路有关的表都应该放在LineTagTables目录内 +3、而LineTagTables目录内要包含models.py、serializers.py、modelFiter.py、views.py等跟当前表有关所有配置 +4、而针对当前app的路由就全部配置在当前根目录内进行配置,并且也配置加载每个目录的路由 +5、信号器也是做个分级目录,总目录下的signals.py只是做一个入口的作用,其它文件夹需要使用信号器必须在当前app的根目录进行引用 +6、URL路由也是做了分级的处理 \ No newline at end of file diff --git a/backend/requirements.txt b/backend/requirements.txt index 4824df60b03a57f605f1d6233be03e6675945a17..834702399f865eb42c1d611e2e2efff199a66c1f 100644 --- a/backend/requirements.txt +++ b/backend/requirements.txt @@ -1,26 +1,51 @@ +asgiref==3.7.2 +async-timeout==4.0.3 +certifi==2023.7.22 +channels==4.0.0 +channels-redis==4.0.0 +charset-normalizer==3.3.2 +click==8.1.7 +coreapi==2.3.3 +coreschema==0.0.4 Django==4.2.7 django-comment-migrate==0.1.7 -django-cors-headers==4.3.0 -django-filter==23.3 +django-cors-headers==3.13.0 +django-filter==21.1 django-ranged-response==0.2.0 -djangorestframework==3.14.0 django-restql==0.15.3 -django-simple-captcha==0.5.20 -django-timezone-field==6.0.1 -djangorestframework-simplejwt==5.3.0 -drf-yasg==1.21.7 -mysqlclient==2.2.0 -pypinyin==0.49.0 -ua-parser==0.18.0 -pyparsing==3.1.1 -openpyxl==3.1.2 -requests==2.31.0 -typing-extensions==4.8.0 -tzlocal==5.1 -channels==3.0.5 -channels-redis==4.1.0 -websockets==11.0.3 -user-agents==2.2.0 +django-simple-captcha==0.5.17 +django-timezone-field==5.0 +djangorestframework==3.14.0 +djangorestframework-simplejwt==5.2.2 +drf-yasg==1.21.4 +et-xmlfile==1.1.0 +gevent==22.10.2 +greenlet==3.0.1 +gunicorn==20.1.0 +h11==0.14.0 +idna==3.4 +inflection==0.5.1 +itypes==1.2.0 +Jinja2==3.1.2 +MarkupSafe==2.1.3 +msgpack==1.0.7 +mysqlclient==2.1.1 +numpy==1.26.1 +openpyxl==3.0.10 +packaging==23.2 +pandas==2.1.2 +Pillow==8.3.2 +PyJWT==2.8.0 +pyparsing==3.0.9 +pyPEG2==2.15.2 +pypinyin==0.48.0 +python-dateutil==2.8.2 +pytz==2023.3.post1 +pytz-deprecation-shim==0.1.0.post0 +redis==5.0.1 +requests==2.28.2 +ruamel.yaml==0.18.5 +ruamel.yaml.clib==0.2.8 six==1.16.0 whitenoise==6.6.0 psycopg2==2.9.9 diff --git a/package.json b/package.json new file mode 100644 index 0000000000000000000000000000000000000000..889ae9c41ca96cb542a11bba4e8a43c676e366eb --- /dev/null +++ b/package.json @@ -0,0 +1,11 @@ +{ + "name": "django-vue3-admin", + "version": "1.0.0", + "description": "[![img](https://img.shields.io/badge/license-MIT-blue.svg)](https://gitee.com/liqianglog/django-vue-admin/blob/master/LICENSE) [![img](https://img.shields.io/badge/python-%3E=3.7.x-green.svg)](https://python.org/) [![PyPI - Django Version badge](https://img.shields.io/badge/django%20versions-3.2-blue)](https://docs.djangoproject.com/zh-hans/3.2/) [![img](https://img.shields.io/badge/node-%3E%3D%2012.0.0-brightgreen)](https://nodejs.org/zh-cn/) [![img](https://gitee.com/liqianglog/django-vue-admin/badge/star.svg?theme=dark)](https://gitee.com/liqianglog/django-vue-admin)", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "author": "", + "license": "ISC" +} diff --git a/web/.env.development b/web/.env.development index 1c3ca5db362e1f7935aded834e08f0a46ed640a6..d13d05c132d060e09ebd2f47b6f7276103083ace 100644 --- a/web/.env.development +++ b/web/.env.development @@ -2,7 +2,7 @@ ENV = 'development' # 本地环境接口地址 -VITE_API_URL = 'http://127.0.0.1:8000' +VITE_API_URL = 'http://192.168.202.17:8000/' # 是否启用按钮权限 -VITE_PM_ENABLED = true +VITE_PM_ENABLED = true \ No newline at end of file diff --git a/web/.env.production b/web/.env.production index 998aa5e15fe3f7cd5a3765c4c1b82dd2a629b2f0..1172ede5f32e2e2a5cdcd20815e7284cfb5b02da 100644 --- a/web/.env.production +++ b/web/.env.production @@ -2,7 +2,10 @@ ENV = 'production' # 线上环境接口地址 -VITE_API_URL = '/api' # docker-compose部署不需要修改,nginx容器自动代理了这个地址 +# VITE_API_URL = '/api' # docker-compose部署不需要修改,nginx容器自动代理了这个地址 + +VITE_API_URL = 'http://192.168.202.17:8001/' + # 是否启用按钮权限 -VITE_PM_ENABLED = true +VITE_PM_ENABLED = true \ No newline at end of file diff --git a/web/package-lock.json b/web/package-lock.json new file mode 100644 index 0000000000000000000000000000000000000000..81ce44faeae16d7b80064e3e35d3911f13ee695c --- /dev/null +++ b/web/package-lock.json @@ -0,0 +1,8866 @@ +{ + "name": "django-vue3-admin", + "version": "3.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "django-vue3-admin", + "version": "3.0.0", + "license": "MIT", + "dependencies": { + "@element-plus/icons-vue": "^2.0.10", + "@fast-crud/fast-crud": "1.20.2", + "@fast-crud/fast-extends": "1.20.2", + "@fast-crud/ui-element": "1.20.2", + "@fast-crud/ui-interface": "1.20.2", + "@iconify/vue": "^4.1.1", + "@types/lodash": "^4.14.202", + "@vitejs/plugin-vue-jsx": "^3.0.0", + "@wangeditor/editor": "^5.1.23", + "@wangeditor/editor-for-vue": "^5.1.12", + "autoprefixer": "^10.4.14", + "axios": "^1.2.1", + "countup.js": "^2.3.2", + "cropperjs": "^1.5.13", + "e-icon-picker": "^2.1.1", + "echarts": "^5.4.1", + "echarts-gl": "^2.0.9", + "echarts-wordcloud": "^2.1.0", + "element-plus": "^2.5.5", + "element-tree-line": "^0.2.1", + "font-awesome": "^4.7.0", + "js-cookie": "^3.0.1", + "js-table2excel": "^1.0.3", + "jsplumb": "^2.15.6", + "mitt": "^3.0.0", + "nprogress": "^0.2.0", + "pinia": "^2.0.28", + "pinia-plugin-persist": "^1.0.0", + "postcss": "^8.4.21", + "print-js": "^1.6.0", + "qrcodejs2-fixes": "^0.0.2", + "qs": "^6.11.0", + "screenfull": "^6.0.2", + "sortablejs": "^1.15.0", + "splitpanes": "^3.1.5", + "tailwindcss": "^3.2.7", + "ts-md5": "^1.3.1", + "upgrade": "^1.1.0", + "vue": "^3.2.45", + "vue-clipboard3": "^2.0.0", + "vue-cropper": "^1.0.8", + "vue-grid-layout": "^3.0.0-beta1", + "vue-i18n": "^9.2.2", + "vue-router": "^4.1.6", + "vxe-table": "^4.4.1", + "xe-utils": "^3.5.7" + }, + "devDependencies": { + "@types/node": "^18.11.13", + "@types/nprogress": "^0.2.0", + "@types/sortablejs": "^1.15.0", + "@typescript-eslint/eslint-plugin": "^5.46.0", + "@typescript-eslint/parser": "^5.46.0", + "@vitejs/plugin-vue": "^4.0.0", + "@vue/compiler-sfc": "^3.2.45", + "eslint": "^8.54.0", + "eslint-plugin-vue": "^9.8.0", + "less": "^4.2.0", + "less-loader": "^11.1.3", + "prettier": "^2.8.1", + "sass": "^1.56.2", + "typescript": "^4.9.4", + "vite": "^4.0.0", + "vite-plugin-vue-setup-extend": "^0.4.0", + "vue-eslint-parser": "^9.1.0" + }, + "engines": { + "node": ">=16.0.0", + "npm": ">= 7.0.0" + } + }, + "node_modules/@aashutoshrathi/word-wrap": { + "version": "1.2.6", + "resolved": "https://registry.npmmirror.com/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", + "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.2.1", + "resolved": "https://registry.npmmirror.com/@ampproject/remapping/-/remapping-2.2.1.tgz", + "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@aws-crypto/crc32": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/@aws-crypto/crc32/-/crc32-3.0.0.tgz", + "integrity": "sha512-IzSgsrxUcsrejQbPVilIKy16kAT52EwB6zSaI+M3xxIhKh5+aldEyvI+z6erM7TCLB2BJsFrtHjp6/4/sr+3dA==", + "dependencies": { + "@aws-crypto/util": "^3.0.0", + "@aws-sdk/types": "^3.222.0", + "tslib": "^1.11.1" + } + }, + "node_modules/@aws-crypto/crc32/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmmirror.com/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/@aws-crypto/crc32c": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/@aws-crypto/crc32c/-/crc32c-3.0.0.tgz", + "integrity": "sha512-ENNPPManmnVJ4BTXlOjAgD7URidbAznURqD0KvfREyc4o20DPYdEldU1f5cQ7Jbj0CJJSPaMIk/9ZshdB3210w==", + "dependencies": { + "@aws-crypto/util": "^3.0.0", + "@aws-sdk/types": "^3.222.0", + "tslib": "^1.11.1" + } + }, + "node_modules/@aws-crypto/crc32c/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmmirror.com/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/@aws-crypto/ie11-detection": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/@aws-crypto/ie11-detection/-/ie11-detection-3.0.0.tgz", + "integrity": "sha512-341lBBkiY1DfDNKai/wXM3aujNBkXR7tq1URPQDL9wi3AUbI80NR74uF1TXHMm7po1AcnFk8iu2S2IeU/+/A+Q==", + "dependencies": { + "tslib": "^1.11.1" + } + }, + "node_modules/@aws-crypto/ie11-detection/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmmirror.com/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/@aws-crypto/sha1-browser": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/@aws-crypto/sha1-browser/-/sha1-browser-3.0.0.tgz", + "integrity": "sha512-NJth5c997GLHs6nOYTzFKTbYdMNA6/1XlKVgnZoaZcQ7z7UJlOgj2JdbHE8tiYLS3fzXNCguct77SPGat2raSw==", + "dependencies": { + "@aws-crypto/ie11-detection": "^3.0.0", + "@aws-crypto/supports-web-crypto": "^3.0.0", + "@aws-crypto/util": "^3.0.0", + "@aws-sdk/types": "^3.222.0", + "@aws-sdk/util-locate-window": "^3.0.0", + "@aws-sdk/util-utf8-browser": "^3.0.0", + "tslib": "^1.11.1" + } + }, + "node_modules/@aws-crypto/sha1-browser/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmmirror.com/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/@aws-crypto/sha256-browser": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/@aws-crypto/sha256-browser/-/sha256-browser-3.0.0.tgz", + "integrity": "sha512-8VLmW2B+gjFbU5uMeqtQM6Nj0/F1bro80xQXCW6CQBWgosFWXTx77aeOF5CAIAmbOK64SdMBJdNr6J41yP5mvQ==", + "dependencies": { + "@aws-crypto/ie11-detection": "^3.0.0", + "@aws-crypto/sha256-js": "^3.0.0", + "@aws-crypto/supports-web-crypto": "^3.0.0", + "@aws-crypto/util": "^3.0.0", + "@aws-sdk/types": "^3.222.0", + "@aws-sdk/util-locate-window": "^3.0.0", + "@aws-sdk/util-utf8-browser": "^3.0.0", + "tslib": "^1.11.1" + } + }, + "node_modules/@aws-crypto/sha256-browser/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmmirror.com/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/@aws-crypto/sha256-js": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/@aws-crypto/sha256-js/-/sha256-js-3.0.0.tgz", + "integrity": "sha512-PnNN7os0+yd1XvXAy23CFOmTbMaDxgxXtTKHybrJ39Y8kGzBATgBFibWJKH6BhytLI/Zyszs87xCOBNyBig6vQ==", + "dependencies": { + "@aws-crypto/util": "^3.0.0", + "@aws-sdk/types": "^3.222.0", + "tslib": "^1.11.1" + } + }, + "node_modules/@aws-crypto/sha256-js/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmmirror.com/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/@aws-crypto/supports-web-crypto": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/@aws-crypto/supports-web-crypto/-/supports-web-crypto-3.0.0.tgz", + "integrity": "sha512-06hBdMwUAb2WFTuGG73LSC0wfPu93xWwo5vL2et9eymgmu3Id5vFAHBbajVWiGhPO37qcsdCap/FqXvJGJWPIg==", + "dependencies": { + "tslib": "^1.11.1" + } + }, + "node_modules/@aws-crypto/supports-web-crypto/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmmirror.com/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/@aws-crypto/util": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/@aws-crypto/util/-/util-3.0.0.tgz", + "integrity": "sha512-2OJlpeJpCR48CC8r+uKVChzs9Iungj9wkZrl8Z041DWEWvyIHILYKCPNzJghKsivj+S3mLo6BVc7mBNzdxA46w==", + "dependencies": { + "@aws-sdk/types": "^3.222.0", + "@aws-sdk/util-utf8-browser": "^3.0.0", + "tslib": "^1.11.1" + } + }, + "node_modules/@aws-crypto/util/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmmirror.com/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "node_modules/@aws-sdk/client-s3": { + "version": "3.430.0", + "resolved": "https://registry.npmmirror.com/@aws-sdk/client-s3/-/client-s3-3.430.0.tgz", + "integrity": "sha512-KpK6mZsLyxfHTPfXA3Bnuu5li15QhhWCzhSPx6moH6XGPH0hVNHFy05DM9T/1exf6tEAQhi5FJrek9dM/sOdeA==", + "dependencies": { + "@aws-crypto/sha1-browser": "3.0.0", + "@aws-crypto/sha256-browser": "3.0.0", + "@aws-crypto/sha256-js": "3.0.0", + "@aws-sdk/client-sts": "3.430.0", + "@aws-sdk/credential-provider-node": "3.430.0", + "@aws-sdk/middleware-bucket-endpoint": "3.430.0", + "@aws-sdk/middleware-expect-continue": "3.428.0", + "@aws-sdk/middleware-flexible-checksums": "3.428.0", + "@aws-sdk/middleware-host-header": "3.429.0", + "@aws-sdk/middleware-location-constraint": "3.428.0", + "@aws-sdk/middleware-logger": "3.428.0", + "@aws-sdk/middleware-recursion-detection": "3.428.0", + "@aws-sdk/middleware-sdk-s3": "3.429.0", + "@aws-sdk/middleware-signing": "3.428.0", + "@aws-sdk/middleware-ssec": "3.428.0", + "@aws-sdk/middleware-user-agent": "3.428.0", + "@aws-sdk/region-config-resolver": "3.430.0", + "@aws-sdk/signature-v4-multi-region": "3.428.0", + "@aws-sdk/types": "3.428.0", + "@aws-sdk/util-endpoints": "3.428.0", + "@aws-sdk/util-user-agent-browser": "3.428.0", + "@aws-sdk/util-user-agent-node": "3.430.0", + "@aws-sdk/xml-builder": "3.310.0", + "@smithy/config-resolver": "^2.0.15", + "@smithy/eventstream-serde-browser": "^2.0.11", + "@smithy/eventstream-serde-config-resolver": "^2.0.11", + "@smithy/eventstream-serde-node": "^2.0.11", + "@smithy/fetch-http-handler": "^2.2.3", + "@smithy/hash-blob-browser": "^2.0.11", + "@smithy/hash-node": "^2.0.11", + "@smithy/hash-stream-node": "^2.0.11", + "@smithy/invalid-dependency": "^2.0.11", + "@smithy/md5-js": "^2.0.11", + "@smithy/middleware-content-length": "^2.0.13", + "@smithy/middleware-endpoint": "^2.1.2", + "@smithy/middleware-retry": "^2.0.17", + "@smithy/middleware-serde": "^2.0.11", + "@smithy/middleware-stack": "^2.0.5", + "@smithy/node-config-provider": "^2.1.2", + "@smithy/node-http-handler": "^2.1.7", + "@smithy/protocol-http": "^3.0.7", + "@smithy/smithy-client": "^2.1.11", + "@smithy/types": "^2.3.5", + "@smithy/url-parser": "^2.0.11", + "@smithy/util-base64": "^2.0.0", + "@smithy/util-body-length-browser": "^2.0.0", + "@smithy/util-body-length-node": "^2.1.0", + "@smithy/util-defaults-mode-browser": "^2.0.15", + "@smithy/util-defaults-mode-node": "^2.0.20", + "@smithy/util-retry": "^2.0.4", + "@smithy/util-stream": "^2.0.16", + "@smithy/util-utf8": "^2.0.0", + "@smithy/util-waiter": "^2.0.11", + "fast-xml-parser": "4.2.5", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-sso": { + "version": "3.430.0", + "resolved": "https://registry.npmmirror.com/@aws-sdk/client-sso/-/client-sso-3.430.0.tgz", + "integrity": "sha512-NxQJkTZCgl6LpdY12MCwsqGned6Ax19WsTCGLEiA/tsNE4vNrYLHHBR317G0sGWbIUQuhwsoM7wIrqJO7CacuQ==", + "dependencies": { + "@aws-crypto/sha256-browser": "3.0.0", + "@aws-crypto/sha256-js": "3.0.0", + "@aws-sdk/middleware-host-header": "3.429.0", + "@aws-sdk/middleware-logger": "3.428.0", + "@aws-sdk/middleware-recursion-detection": "3.428.0", + "@aws-sdk/middleware-user-agent": "3.428.0", + "@aws-sdk/region-config-resolver": "3.430.0", + "@aws-sdk/types": "3.428.0", + "@aws-sdk/util-endpoints": "3.428.0", + "@aws-sdk/util-user-agent-browser": "3.428.0", + "@aws-sdk/util-user-agent-node": "3.430.0", + "@smithy/config-resolver": "^2.0.15", + "@smithy/fetch-http-handler": "^2.2.3", + "@smithy/hash-node": "^2.0.11", + "@smithy/invalid-dependency": "^2.0.11", + "@smithy/middleware-content-length": "^2.0.13", + "@smithy/middleware-endpoint": "^2.1.2", + "@smithy/middleware-retry": "^2.0.17", + "@smithy/middleware-serde": "^2.0.11", + "@smithy/middleware-stack": "^2.0.5", + "@smithy/node-config-provider": "^2.1.2", + "@smithy/node-http-handler": "^2.1.7", + "@smithy/protocol-http": "^3.0.7", + "@smithy/smithy-client": "^2.1.11", + "@smithy/types": "^2.3.5", + "@smithy/url-parser": "^2.0.11", + "@smithy/util-base64": "^2.0.0", + "@smithy/util-body-length-browser": "^2.0.0", + "@smithy/util-body-length-node": "^2.1.0", + "@smithy/util-defaults-mode-browser": "^2.0.15", + "@smithy/util-defaults-mode-node": "^2.0.20", + "@smithy/util-retry": "^2.0.4", + "@smithy/util-utf8": "^2.0.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/client-sts": { + "version": "3.430.0", + "resolved": "https://registry.npmmirror.com/@aws-sdk/client-sts/-/client-sts-3.430.0.tgz", + "integrity": "sha512-njUY3QeZH0CG+tG/6jhoG+Zr7rI1aGoVkZi3l6woKTz57hIlkwu2jQlLbJujm7PKrLhPaN5+4AqBQuHFVgMobw==", + "dependencies": { + "@aws-crypto/sha256-browser": "3.0.0", + "@aws-crypto/sha256-js": "3.0.0", + "@aws-sdk/credential-provider-node": "3.430.0", + "@aws-sdk/middleware-host-header": "3.429.0", + "@aws-sdk/middleware-logger": "3.428.0", + "@aws-sdk/middleware-recursion-detection": "3.428.0", + "@aws-sdk/middleware-sdk-sts": "3.428.0", + "@aws-sdk/middleware-signing": "3.428.0", + "@aws-sdk/middleware-user-agent": "3.428.0", + "@aws-sdk/region-config-resolver": "3.430.0", + "@aws-sdk/types": "3.428.0", + "@aws-sdk/util-endpoints": "3.428.0", + "@aws-sdk/util-user-agent-browser": "3.428.0", + "@aws-sdk/util-user-agent-node": "3.430.0", + "@smithy/config-resolver": "^2.0.15", + "@smithy/fetch-http-handler": "^2.2.3", + "@smithy/hash-node": "^2.0.11", + "@smithy/invalid-dependency": "^2.0.11", + "@smithy/middleware-content-length": "^2.0.13", + "@smithy/middleware-endpoint": "^2.1.2", + "@smithy/middleware-retry": "^2.0.17", + "@smithy/middleware-serde": "^2.0.11", + "@smithy/middleware-stack": "^2.0.5", + "@smithy/node-config-provider": "^2.1.2", + "@smithy/node-http-handler": "^2.1.7", + "@smithy/protocol-http": "^3.0.7", + "@smithy/smithy-client": "^2.1.11", + "@smithy/types": "^2.3.5", + "@smithy/url-parser": "^2.0.11", + "@smithy/util-base64": "^2.0.0", + "@smithy/util-body-length-browser": "^2.0.0", + "@smithy/util-body-length-node": "^2.1.0", + "@smithy/util-defaults-mode-browser": "^2.0.15", + "@smithy/util-defaults-mode-node": "^2.0.20", + "@smithy/util-retry": "^2.0.4", + "@smithy/util-utf8": "^2.0.0", + "fast-xml-parser": "4.2.5", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-env": { + "version": "3.428.0", + "resolved": "https://registry.npmmirror.com/@aws-sdk/credential-provider-env/-/credential-provider-env-3.428.0.tgz", + "integrity": "sha512-e6fbY174Idzw0r5ZMT1qkDh+dpOp1DX3ickhr7J6ipo3cUGLI45Y5lnR9nYXWfB5o/wiNv4zXgN+Y3ORJJHzyA==", + "dependencies": { + "@aws-sdk/types": "3.428.0", + "@smithy/property-provider": "^2.0.0", + "@smithy/types": "^2.3.5", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-ini": { + "version": "3.430.0", + "resolved": "https://registry.npmmirror.com/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.430.0.tgz", + "integrity": "sha512-m3NcmDyVYr/w8RV9kMArrA/0982aXMsvoSXi4wFVbgg/T5hO+6i5CY7fB/0xpKIuEJ+rw63rYNnBzLwwW48kWg==", + "dependencies": { + "@aws-sdk/credential-provider-env": "3.428.0", + "@aws-sdk/credential-provider-process": "3.428.0", + "@aws-sdk/credential-provider-sso": "3.430.0", + "@aws-sdk/credential-provider-web-identity": "3.428.0", + "@aws-sdk/types": "3.428.0", + "@smithy/credential-provider-imds": "^2.0.0", + "@smithy/property-provider": "^2.0.0", + "@smithy/shared-ini-file-loader": "^2.0.6", + "@smithy/types": "^2.3.5", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-node": { + "version": "3.430.0", + "resolved": "https://registry.npmmirror.com/@aws-sdk/credential-provider-node/-/credential-provider-node-3.430.0.tgz", + "integrity": "sha512-ItOHJcqOhpI0QM+aho5uMrk2ZP34hsdisMHxd8/6FT41U8TOe9kQKaZ2l2AsVf4QuM6RJe2LangcVGGstCf8Sw==", + "dependencies": { + "@aws-sdk/credential-provider-env": "3.428.0", + "@aws-sdk/credential-provider-ini": "3.430.0", + "@aws-sdk/credential-provider-process": "3.428.0", + "@aws-sdk/credential-provider-sso": "3.430.0", + "@aws-sdk/credential-provider-web-identity": "3.428.0", + "@aws-sdk/types": "3.428.0", + "@smithy/credential-provider-imds": "^2.0.0", + "@smithy/property-provider": "^2.0.0", + "@smithy/shared-ini-file-loader": "^2.0.6", + "@smithy/types": "^2.3.5", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-process": { + "version": "3.428.0", + "resolved": "https://registry.npmmirror.com/@aws-sdk/credential-provider-process/-/credential-provider-process-3.428.0.tgz", + "integrity": "sha512-UG2S2/4Wrskbkbgt9fBlnzwQ2hfTXvLJwUgGOluSOf6+mGCcoDku4zzc9EQdk1MwN5Us+ziyMrIMNY5sbdLg6g==", + "dependencies": { + "@aws-sdk/types": "3.428.0", + "@smithy/property-provider": "^2.0.0", + "@smithy/shared-ini-file-loader": "^2.0.6", + "@smithy/types": "^2.3.5", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-sso": { + "version": "3.430.0", + "resolved": "https://registry.npmmirror.com/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.430.0.tgz", + "integrity": "sha512-6de/aH9OFI+Ah7hL4alrZFqiNw5D6F+R92tLbIpFRQg7DxO/TuQTTtK94mLkft/AP/mGzVVBENjsyS1nJt166w==", + "dependencies": { + "@aws-sdk/client-sso": "3.430.0", + "@aws-sdk/token-providers": "3.430.0", + "@aws-sdk/types": "3.428.0", + "@smithy/property-provider": "^2.0.0", + "@smithy/shared-ini-file-loader": "^2.0.6", + "@smithy/types": "^2.3.5", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/credential-provider-web-identity": { + "version": "3.428.0", + "resolved": "https://registry.npmmirror.com/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.428.0.tgz", + "integrity": "sha512-ueuUPPlrJFvtDUVTGnClUGt1wxCbEiKArknah/w9cfcc/c1HtFd/M7x/z2Sm0gSItR45sVcK54qjzmhm29DMzg==", + "dependencies": { + "@aws-sdk/types": "3.428.0", + "@smithy/property-provider": "^2.0.0", + "@smithy/types": "^2.3.5", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-bucket-endpoint": { + "version": "3.430.0", + "resolved": "https://registry.npmmirror.com/@aws-sdk/middleware-bucket-endpoint/-/middleware-bucket-endpoint-3.430.0.tgz", + "integrity": "sha512-oK0WTNpMQFewSIYcL3LPm+S46uUWFILlPYK0fEeYdMXn03380JqS9oIKOFFX7w6DhYY1ePHZI721ee1HiCtDvw==", + "dependencies": { + "@aws-sdk/types": "3.428.0", + "@aws-sdk/util-arn-parser": "3.310.0", + "@smithy/node-config-provider": "^2.1.2", + "@smithy/protocol-http": "^3.0.7", + "@smithy/types": "^2.3.5", + "@smithy/util-config-provider": "^2.0.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-expect-continue": { + "version": "3.428.0", + "resolved": "https://registry.npmmirror.com/@aws-sdk/middleware-expect-continue/-/middleware-expect-continue-3.428.0.tgz", + "integrity": "sha512-d/vWUs9RD4fuO1oi7gJby6aEPb6XTf2+jCbrs/hUEYFMxQu7wwQx2c6BWAjfQca8zVadh7FY0cDNtL2Ep2d8zA==", + "dependencies": { + "@aws-sdk/types": "3.428.0", + "@smithy/protocol-http": "^3.0.7", + "@smithy/types": "^2.3.5", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-flexible-checksums": { + "version": "3.428.0", + "resolved": "https://registry.npmmirror.com/@aws-sdk/middleware-flexible-checksums/-/middleware-flexible-checksums-3.428.0.tgz", + "integrity": "sha512-O54XmBSvi9A6ZBRVSYrEvoGH1BjtR1TT8042gOdJgouI0OVWtjqHT2ZPVTbQ/rKW5QeLXszVloXFW6eqOwrVTg==", + "dependencies": { + "@aws-crypto/crc32": "3.0.0", + "@aws-crypto/crc32c": "3.0.0", + "@aws-sdk/types": "3.428.0", + "@smithy/is-array-buffer": "^2.0.0", + "@smithy/protocol-http": "^3.0.7", + "@smithy/types": "^2.3.5", + "@smithy/util-utf8": "^2.0.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-host-header": { + "version": "3.429.0", + "resolved": "https://registry.npmmirror.com/@aws-sdk/middleware-host-header/-/middleware-host-header-3.429.0.tgz", + "integrity": "sha512-3v9WoDCmbfH28znQ43cQLvLlm8fhJFIDJLW19moFI8QbXMv85yojGEphBMlT2XZUw79+tyh7GWLFaNugYZ1o9A==", + "dependencies": { + "@aws-sdk/types": "3.428.0", + "@smithy/protocol-http": "^3.0.7", + "@smithy/types": "^2.3.5", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-location-constraint": { + "version": "3.428.0", + "resolved": "https://registry.npmmirror.com/@aws-sdk/middleware-location-constraint/-/middleware-location-constraint-3.428.0.tgz", + "integrity": "sha512-2YvAhkdzMITTc2fVIH7FS5Hqa7AuoHBg92W0CzPOiKBkC0D6m5hw8o5Z5RnH/M9ki2eB4dn+7uB6p7Lgs+VFdw==", + "dependencies": { + "@aws-sdk/types": "3.428.0", + "@smithy/types": "^2.3.5", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-logger": { + "version": "3.428.0", + "resolved": "https://registry.npmmirror.com/@aws-sdk/middleware-logger/-/middleware-logger-3.428.0.tgz", + "integrity": "sha512-1P0V0quL9u2amdNOn6yYT7/ToQUmkLJqCKHPxsRyDB829vBThWndvvH5MkoItj/VgE1zWqMtrzN3xtzD7zx6Qg==", + "dependencies": { + "@aws-sdk/types": "3.428.0", + "@smithy/types": "^2.3.5", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-recursion-detection": { + "version": "3.428.0", + "resolved": "https://registry.npmmirror.com/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.428.0.tgz", + "integrity": "sha512-xC0OMduCByyRdiQz324RXy4kunnCG4LUJCfvdoegM33Elp9ex0D3fcfO1mUgV8qiLwSennIsSRVXHuhNxE2HZA==", + "dependencies": { + "@aws-sdk/types": "3.428.0", + "@smithy/protocol-http": "^3.0.7", + "@smithy/types": "^2.3.5", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-sdk-s3": { + "version": "3.429.0", + "resolved": "https://registry.npmmirror.com/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.429.0.tgz", + "integrity": "sha512-wCT5GoExncHUzUbW8b9q/PN3uPsbxit4PUAHw/hkrIHDKOxd9H/ClM37ZeJHNEOml5hnJOPy+rOaF9jRqo8dGg==", + "dependencies": { + "@aws-sdk/types": "3.428.0", + "@aws-sdk/util-arn-parser": "3.310.0", + "@smithy/protocol-http": "^3.0.7", + "@smithy/smithy-client": "^2.1.11", + "@smithy/types": "^2.3.5", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-sdk-sts": { + "version": "3.428.0", + "resolved": "https://registry.npmmirror.com/@aws-sdk/middleware-sdk-sts/-/middleware-sdk-sts-3.428.0.tgz", + "integrity": "sha512-Uutl2niYXTnNP8v84v6umWDHD5no7d5/OqkZE1DsmeKR/dje90J5unJWf7MOsqvYm0JGDEWF4lk9xGVyqsw+Aw==", + "dependencies": { + "@aws-sdk/middleware-signing": "3.428.0", + "@aws-sdk/types": "3.428.0", + "@smithy/types": "^2.3.5", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-signing": { + "version": "3.428.0", + "resolved": "https://registry.npmmirror.com/@aws-sdk/middleware-signing/-/middleware-signing-3.428.0.tgz", + "integrity": "sha512-oMSerTPwtsQAR7fIU/G0b0BA30wF+MC4gZSrJjbypF8MK8nPC2yMfKLR8+QavGOGEW7rUMQ0uklThMTTwQEXNQ==", + "dependencies": { + "@aws-sdk/types": "3.428.0", + "@smithy/property-provider": "^2.0.0", + "@smithy/protocol-http": "^3.0.7", + "@smithy/signature-v4": "^2.0.0", + "@smithy/types": "^2.3.5", + "@smithy/util-middleware": "^2.0.4", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-ssec": { + "version": "3.428.0", + "resolved": "https://registry.npmmirror.com/@aws-sdk/middleware-ssec/-/middleware-ssec-3.428.0.tgz", + "integrity": "sha512-QPKisAErRHFoopmdFhgOmjZPcUM6rvWCtnoEY4Sw9F0aIyK6yCTn+nB5j+3FAPvUvblE22srM6aow8TcGx1gjA==", + "dependencies": { + "@aws-sdk/types": "3.428.0", + "@smithy/types": "^2.3.5", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/middleware-user-agent": { + "version": "3.428.0", + "resolved": "https://registry.npmmirror.com/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.428.0.tgz", + "integrity": "sha512-+GAhObeHRick2D5jr3YkPckjcggt5v6uUVtEUQW2AdD65cE5PjIvmksv6FuM/mME/9nNA+wufQnHbLI8teLeaw==", + "dependencies": { + "@aws-sdk/types": "3.428.0", + "@aws-sdk/util-endpoints": "3.428.0", + "@smithy/protocol-http": "^3.0.7", + "@smithy/types": "^2.3.5", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/region-config-resolver": { + "version": "3.430.0", + "resolved": "https://registry.npmmirror.com/@aws-sdk/region-config-resolver/-/region-config-resolver-3.430.0.tgz", + "integrity": "sha512-9lqgtkcd4dqsQ2yN6V/i06blyDh4yLmS+fAS7LwEZih/NZZ2cBIR+5kb9c236auvTcuMcL1zFxVRloWwesYZjA==", + "dependencies": { + "@smithy/node-config-provider": "^2.1.2", + "@smithy/types": "^2.3.5", + "@smithy/util-config-provider": "^2.0.0", + "@smithy/util-middleware": "^2.0.4", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/s3-request-presigner": { + "version": "3.430.0", + "resolved": "https://registry.npmmirror.com/@aws-sdk/s3-request-presigner/-/s3-request-presigner-3.430.0.tgz", + "integrity": "sha512-8+vatOoqEQTwhNXOG6QoTJ6Fszaagc+bQpgfKbRIotCLGh7g4/qgQXo73LVyFVLkS4Tg2bn/KHN8aG3qTPd1KQ==", + "dependencies": { + "@aws-sdk/signature-v4-multi-region": "3.428.0", + "@aws-sdk/types": "3.428.0", + "@aws-sdk/util-format-url": "3.428.0", + "@smithy/middleware-endpoint": "^2.1.2", + "@smithy/protocol-http": "^3.0.7", + "@smithy/smithy-client": "^2.1.11", + "@smithy/types": "^2.3.5", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/signature-v4-crt": { + "version": "3.428.0", + "resolved": "https://registry.npmmirror.com/@aws-sdk/signature-v4-crt/-/signature-v4-crt-3.428.0.tgz", + "integrity": "sha512-TP6hSSfUH/3RXwJUKcYj2e96/arCzAEYfbk1sBod5JwqqHxfTsssNFoWw6E+a1RtJrwiFjrYiArUuFGcdMZAWg==", + "dependencies": { + "@aws-sdk/signature-v4-multi-region": "3.428.0", + "@smithy/querystring-parser": "^2.0.0", + "@smithy/signature-v4": "^2.0.0", + "@smithy/types": "^2.3.5", + "@smithy/util-middleware": "^2.0.4", + "aws-crt": "^1.15.9", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/signature-v4-multi-region": { + "version": "3.428.0", + "resolved": "https://registry.npmmirror.com/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.428.0.tgz", + "integrity": "sha512-ImuontXK1vEHtxK+qiPVfLTk/+bKSwYqrVkE2/o5rnsqD78/wySzTn5RnkA73Nb+UL4qSd0dkOcuubEee2aUpQ==", + "dependencies": { + "@aws-sdk/types": "3.428.0", + "@smithy/protocol-http": "^3.0.7", + "@smithy/signature-v4": "^2.0.0", + "@smithy/types": "^2.3.5", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/token-providers": { + "version": "3.430.0", + "resolved": "https://registry.npmmirror.com/@aws-sdk/token-providers/-/token-providers-3.430.0.tgz", + "integrity": "sha512-vE+QnqG0A4MWhMEFXXPg8gPXjw03b4Q3XZbHyrANoZ+tVrzh8JhpHIcbkesGh6WrjirNqId0UghzI9VanKxsLw==", + "dependencies": { + "@aws-crypto/sha256-browser": "3.0.0", + "@aws-crypto/sha256-js": "3.0.0", + "@aws-sdk/middleware-host-header": "3.429.0", + "@aws-sdk/middleware-logger": "3.428.0", + "@aws-sdk/middleware-recursion-detection": "3.428.0", + "@aws-sdk/middleware-user-agent": "3.428.0", + "@aws-sdk/types": "3.428.0", + "@aws-sdk/util-endpoints": "3.428.0", + "@aws-sdk/util-user-agent-browser": "3.428.0", + "@aws-sdk/util-user-agent-node": "3.430.0", + "@smithy/config-resolver": "^2.0.15", + "@smithy/fetch-http-handler": "^2.2.3", + "@smithy/hash-node": "^2.0.11", + "@smithy/invalid-dependency": "^2.0.11", + "@smithy/middleware-content-length": "^2.0.13", + "@smithy/middleware-endpoint": "^2.1.2", + "@smithy/middleware-retry": "^2.0.17", + "@smithy/middleware-serde": "^2.0.11", + "@smithy/middleware-stack": "^2.0.5", + "@smithy/node-config-provider": "^2.1.2", + "@smithy/node-http-handler": "^2.1.7", + "@smithy/property-provider": "^2.0.0", + "@smithy/protocol-http": "^3.0.7", + "@smithy/shared-ini-file-loader": "^2.0.6", + "@smithy/smithy-client": "^2.1.11", + "@smithy/types": "^2.3.5", + "@smithy/url-parser": "^2.0.11", + "@smithy/util-base64": "^2.0.0", + "@smithy/util-body-length-browser": "^2.0.0", + "@smithy/util-body-length-node": "^2.1.0", + "@smithy/util-defaults-mode-browser": "^2.0.15", + "@smithy/util-defaults-mode-node": "^2.0.20", + "@smithy/util-retry": "^2.0.4", + "@smithy/util-utf8": "^2.0.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/types": { + "version": "3.428.0", + "resolved": "https://registry.npmmirror.com/@aws-sdk/types/-/types-3.428.0.tgz", + "integrity": "sha512-4T0Ps2spjg3qbWE6ZK13Vd3FnzpfliaiotqjxUK5YhjDrKXeT36HJp46JhDupElQuHtTkpdiJOSYk2lvY2H4IA==", + "dependencies": { + "@smithy/types": "^2.3.5", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/util-arn-parser": { + "version": "3.310.0", + "resolved": "https://registry.npmmirror.com/@aws-sdk/util-arn-parser/-/util-arn-parser-3.310.0.tgz", + "integrity": "sha512-jL8509owp/xB9+Or0pvn3Fe+b94qfklc2yPowZZIFAkFcCSIdkIglz18cPDWnYAcy9JGewpMS1COXKIUhZkJsA==", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/util-endpoints": { + "version": "3.428.0", + "resolved": "https://registry.npmmirror.com/@aws-sdk/util-endpoints/-/util-endpoints-3.428.0.tgz", + "integrity": "sha512-ToKMhYlUWJ0YrbggpJLZeyZZNDXtQ4NITxqo/oeGltTT9KG4o/LqVY59EveV0f8P32ObDyj9Vh1mnjxeo3DxGw==", + "dependencies": { + "@aws-sdk/types": "3.428.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/util-format-url": { + "version": "3.428.0", + "resolved": "https://registry.npmmirror.com/@aws-sdk/util-format-url/-/util-format-url-3.428.0.tgz", + "integrity": "sha512-Jx3VwsGXaIGtFNRVg9IqGWMm7wTDsdTRLn29Tn2a6N38TaqrRMpC3T0YK3YrWKjNYhClo5tUIJLi5QGk2d2vBg==", + "dependencies": { + "@aws-sdk/types": "3.428.0", + "@smithy/querystring-builder": "^2.0.11", + "@smithy/types": "^2.3.5", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/util-locate-window": { + "version": "3.310.0", + "resolved": "https://registry.npmmirror.com/@aws-sdk/util-locate-window/-/util-locate-window-3.310.0.tgz", + "integrity": "sha512-qo2t/vBTnoXpjKxlsC2e1gBrRm80M3bId27r0BRB2VniSSe7bL1mmzM+/HFtujm0iAxtPM+aLEflLJlJeDPg0w==", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@aws-sdk/util-user-agent-browser": { + "version": "3.428.0", + "resolved": "https://registry.npmmirror.com/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.428.0.tgz", + "integrity": "sha512-qlc2UoGsmCpuh1ErY3VayZuAGl74TWWcLmhhQMkeByFSb6KooBlwOmDpDzJRtgwJoe0KXnyHBO6lzl9iczcozg==", + "dependencies": { + "@aws-sdk/types": "3.428.0", + "@smithy/types": "^2.3.5", + "bowser": "^2.11.0", + "tslib": "^2.5.0" + } + }, + "node_modules/@aws-sdk/util-user-agent-node": { + "version": "3.430.0", + "resolved": "https://registry.npmmirror.com/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.430.0.tgz", + "integrity": "sha512-DPpFPL3mFMPtipFxjY7TKQBjnhmsPzYCr4Y+qna0oR6ij8jZOz2ILQDK33GxTRNh3+bV9YYbx+ZGDOnxoK5Mhw==", + "dependencies": { + "@aws-sdk/types": "3.428.0", + "@smithy/node-config-provider": "^2.1.2", + "@smithy/types": "^2.3.5", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "aws-crt": ">=1.0.0" + }, + "peerDependenciesMeta": { + "aws-crt": { + "optional": true + } + } + }, + "node_modules/@aws-sdk/util-utf8-browser": { + "version": "3.259.0", + "resolved": "https://registry.npmmirror.com/@aws-sdk/util-utf8-browser/-/util-utf8-browser-3.259.0.tgz", + "integrity": "sha512-UvFa/vR+e19XookZF8RzFZBrw2EUkQWxiBW0yYQAhvk3C+QVGl0H3ouca8LDBlBfQKXwmW3huo/59H8rwb1wJw==", + "dependencies": { + "tslib": "^2.3.1" + } + }, + "node_modules/@aws-sdk/xml-builder": { + "version": "3.310.0", + "resolved": "https://registry.npmmirror.com/@aws-sdk/xml-builder/-/xml-builder-3.310.0.tgz", + "integrity": "sha512-TqELu4mOuSIKQCqj63fGVs86Yh+vBx5nHRpWKNUNhB2nPTpfbziTs5c1X358be3peVWA4wPxW7Nt53KIg1tnNw==", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.22.13", + "resolved": "https://registry.npmmirror.com/@babel/code-frame/-/code-frame-7.22.13.tgz", + "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", + "dependencies": { + "@babel/highlight": "^7.22.13", + "chalk": "^2.4.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.23.2", + "resolved": "https://registry.npmmirror.com/@babel/compat-data/-/compat-data-7.23.2.tgz", + "integrity": "sha512-0S9TQMmDHlqAZ2ITT95irXKfxN9bncq8ZCoJhun3nHL/lLUxd2NKBJYoNGWH7S0hz6fRQwWlAWn/ILM0C70KZQ==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.23.2", + "resolved": "https://registry.npmmirror.com/@babel/core/-/core-7.23.2.tgz", + "integrity": "sha512-n7s51eWdaWZ3vGT2tD4T7J6eJs3QoBXydv7vkUM06Bf1cbVD2Kc2UrkzhiQwobfV7NwOnQXYL7UBJ5VPU+RGoQ==", + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.22.13", + "@babel/generator": "^7.23.0", + "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-module-transforms": "^7.23.0", + "@babel/helpers": "^7.23.2", + "@babel/parser": "^7.23.0", + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.23.2", + "@babel/types": "^7.23.0", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmmirror.com/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.23.0", + "resolved": "https://registry.npmmirror.com/@babel/generator/-/generator-7.23.0.tgz", + "integrity": "sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==", + "dependencies": { + "@babel/types": "^7.23.0", + "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.22.5", + "resolved": "https://registry.npmmirror.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", + "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.22.15", + "resolved": "https://registry.npmmirror.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.15.tgz", + "integrity": "sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==", + "dependencies": { + "@babel/compat-data": "^7.22.9", + "@babel/helper-validator-option": "^7.22.15", + "browserslist": "^4.21.9", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmmirror.com/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmmirror.com/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.22.15", + "resolved": "https://registry.npmmirror.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.15.tgz", + "integrity": "sha512-jKkwA59IXcvSaiK2UN45kKwSC9o+KuoXsBDvHvU/7BecYIp8GQ2UwrVvFgJASUT+hBnwJx6MhvMCuMzwZZ7jlg==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.5", + "@babel/helper-function-name": "^7.22.5", + "@babel/helper-member-expression-to-functions": "^7.22.15", + "@babel/helper-optimise-call-expression": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.9", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmmirror.com/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-environment-visitor": { + "version": "7.22.20", + "resolved": "https://registry.npmmirror.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", + "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.23.0", + "resolved": "https://registry.npmmirror.com/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", + "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", + "dependencies": { + "@babel/template": "^7.22.15", + "@babel/types": "^7.23.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-hoist-variables": { + "version": "7.22.5", + "resolved": "https://registry.npmmirror.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", + "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.23.0", + "resolved": "https://registry.npmmirror.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.23.0.tgz", + "integrity": "sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA==", + "dependencies": { + "@babel/types": "^7.23.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.22.15", + "resolved": "https://registry.npmmirror.com/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", + "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", + "dependencies": { + "@babel/types": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.23.0", + "resolved": "https://registry.npmmirror.com/@babel/helper-module-transforms/-/helper-module-transforms-7.23.0.tgz", + "integrity": "sha512-WhDWw1tdrlT0gMgUJSlX0IQvoO1eN279zrAUbVB+KpV2c3Tylz8+GnKOLllCS6Z/iZQEyVYxhZVUdPTqs2YYPw==", + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-module-imports": "^7.22.15", + "@babel/helper-simple-access": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/helper-validator-identifier": "^7.22.20" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.22.5", + "resolved": "https://registry.npmmirror.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz", + "integrity": "sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.22.5", + "resolved": "https://registry.npmmirror.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", + "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.22.20", + "resolved": "https://registry.npmmirror.com/@babel/helper-replace-supers/-/helper-replace-supers-7.22.20.tgz", + "integrity": "sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw==", + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-member-expression-to-functions": "^7.22.15", + "@babel/helper-optimise-call-expression": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.22.5", + "resolved": "https://registry.npmmirror.com/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", + "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.22.5", + "resolved": "https://registry.npmmirror.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz", + "integrity": "sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.22.6", + "resolved": "https://registry.npmmirror.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", + "dependencies": { + "@babel/types": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.22.5", + "resolved": "https://registry.npmmirror.com/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", + "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.22.20", + "resolved": "https://registry.npmmirror.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.22.15", + "resolved": "https://registry.npmmirror.com/@babel/helper-validator-option/-/helper-validator-option-7.22.15.tgz", + "integrity": "sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.23.2", + "resolved": "https://registry.npmmirror.com/@babel/helpers/-/helpers-7.23.2.tgz", + "integrity": "sha512-lzchcp8SjTSVe/fPmLwtWVBFC7+Tbn8LGHDVfDp9JGxpAY5opSaEFgt8UQvrnECWOTdji2mOWMz1rOhkHscmGQ==", + "dependencies": { + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.23.2", + "@babel/types": "^7.23.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.22.20", + "resolved": "https://registry.npmmirror.com/@babel/highlight/-/highlight-7.22.20.tgz", + "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==", + "dependencies": { + "@babel/helper-validator-identifier": "^7.22.20", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.23.0", + "resolved": "https://registry.npmmirror.com/@babel/parser/-/parser-7.23.0.tgz", + "integrity": "sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==", + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.22.5", + "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.22.5.tgz", + "integrity": "sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.22.5", + "resolved": "https://registry.npmmirror.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.22.5.tgz", + "integrity": "sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ==", + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typescript": { + "version": "7.22.15", + "resolved": "https://registry.npmmirror.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.22.15.tgz", + "integrity": "sha512-1uirS0TnijxvQLnlv5wQBwOX3E1wCFX7ITv+9pBV2wKEk4K+M5tqDaoNXnTH8tjEIYHLO98MwiTWO04Ggz4XuA==", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-create-class-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-typescript": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.23.2", + "resolved": "https://registry.npmmirror.com/@babel/runtime/-/runtime-7.23.2.tgz", + "integrity": "sha512-mM8eg4yl5D6i3lu2QKPuPH4FArvJ8KhTofbE7jwMUv9KX5mBvwPAqnV3MlyBNqdp9RyRKP6Yck8TrfYrPvX3bg==", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/runtime-corejs2": { + "version": "7.23.2", + "resolved": "https://registry.npmmirror.com/@babel/runtime-corejs2/-/runtime-corejs2-7.23.2.tgz", + "integrity": "sha512-lTwRWGcAUBANnxD0A4c5/wKQ0eLhgdAy9kdY2rzTmmliumBQ8u8awykMnaQAnZR3PC47jLRjGoj+hozZqy9Bww==", + "dependencies": { + "core-js": "^2.6.12", + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.22.15", + "resolved": "https://registry.npmmirror.com/@babel/template/-/template-7.22.15.tgz", + "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", + "dependencies": { + "@babel/code-frame": "^7.22.13", + "@babel/parser": "^7.22.15", + "@babel/types": "^7.22.15" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.23.2", + "resolved": "https://registry.npmmirror.com/@babel/traverse/-/traverse-7.23.2.tgz", + "integrity": "sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==", + "dependencies": { + "@babel/code-frame": "^7.22.13", + "@babel/generator": "^7.23.0", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.23.0", + "@babel/types": "^7.23.0", + "debug": "^4.1.0", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.23.0", + "resolved": "https://registry.npmmirror.com/@babel/types/-/types-7.23.0.tgz", + "integrity": "sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==", + "dependencies": { + "@babel/helper-string-parser": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.20", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@ctrl/tinycolor": { + "version": "3.6.1", + "resolved": "https://registry.npmmirror.com/@ctrl/tinycolor/-/tinycolor-3.6.1.tgz", + "integrity": "sha512-SITSV6aIXsuVNV3f3O0f2n/cgyEDWoSqtZMYiAmcsYHydcKrOz3gUxB/iXd/Qf08+IZX4KpgNbvUdMBmWz+kcA==", + "engines": { + "node": ">=10" + } + }, + "node_modules/@element-plus/icons-vue": { + "version": "2.3.1", + "resolved": "https://registry.npmmirror.com/@element-plus/icons-vue/-/icons-vue-2.3.1.tgz", + "integrity": "sha512-XxVUZv48RZAd87ucGS48jPf6pKu0yV5UCg9f4FFwtrYxXOwWuVJo6wOvSLKEoMQKjv8GsX/mhP6UsC1lRwbUWg==", + "peerDependencies": { + "vue": "^3.2.0" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.16.17", + "resolved": "https://registry.npmmirror.com/@esbuild/android-arm/-/android-arm-0.16.17.tgz", + "integrity": "sha512-N9x1CMXVhtWEAMS7pNNONyA14f71VPQN9Cnavj1XQh6T7bskqiLLrSca4O0Vr8Wdcga943eThxnVp3JLnBMYtw==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.16.17", + "resolved": "https://registry.npmmirror.com/@esbuild/android-arm64/-/android-arm64-0.16.17.tgz", + "integrity": "sha512-MIGl6p5sc3RDTLLkYL1MyL8BMRN4tLMRCn+yRJJmEDvYZ2M7tmAf80hx1kbNEUX2KJ50RRtxZ4JHLvCfuB6kBg==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.16.17", + "resolved": "https://registry.npmmirror.com/@esbuild/android-x64/-/android-x64-0.16.17.tgz", + "integrity": "sha512-a3kTv3m0Ghh4z1DaFEuEDfz3OLONKuFvI4Xqczqx4BqLyuFaFkuaG4j2MtA6fuWEFeC5x9IvqnX7drmRq/fyAQ==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.16.17", + "resolved": "https://registry.npmmirror.com/@esbuild/darwin-arm64/-/darwin-arm64-0.16.17.tgz", + "integrity": "sha512-/2agbUEfmxWHi9ARTX6OQ/KgXnOWfsNlTeLcoV7HSuSTv63E4DqtAc+2XqGw1KHxKMHGZgbVCZge7HXWX9Vn+w==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.16.17", + "resolved": "https://registry.npmmirror.com/@esbuild/darwin-x64/-/darwin-x64-0.16.17.tgz", + "integrity": "sha512-2By45OBHulkd9Svy5IOCZt376Aa2oOkiE9QWUK9fe6Tb+WDr8hXL3dpqi+DeLiMed8tVXspzsTAvd0jUl96wmg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.16.17", + "resolved": "https://registry.npmmirror.com/@esbuild/freebsd-arm64/-/freebsd-arm64-0.16.17.tgz", + "integrity": "sha512-mt+cxZe1tVx489VTb4mBAOo2aKSnJ33L9fr25JXpqQqzbUIw/yzIzi+NHwAXK2qYV1lEFp4OoVeThGjUbmWmdw==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.16.17", + "resolved": "https://registry.npmmirror.com/@esbuild/freebsd-x64/-/freebsd-x64-0.16.17.tgz", + "integrity": "sha512-8ScTdNJl5idAKjH8zGAsN7RuWcyHG3BAvMNpKOBaqqR7EbUhhVHOqXRdL7oZvz8WNHL2pr5+eIT5c65kA6NHug==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.16.17", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-arm/-/linux-arm-0.16.17.tgz", + "integrity": "sha512-iihzrWbD4gIT7j3caMzKb/RsFFHCwqqbrbH9SqUSRrdXkXaygSZCZg1FybsZz57Ju7N/SHEgPyaR0LZ8Zbe9gQ==", + "cpu": [ + "arm" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.16.17", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-arm64/-/linux-arm64-0.16.17.tgz", + "integrity": "sha512-7S8gJnSlqKGVJunnMCrXHU9Q8Q/tQIxk/xL8BqAP64wchPCTzuM6W3Ra8cIa1HIflAvDnNOt2jaL17vaW+1V0g==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.16.17", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-ia32/-/linux-ia32-0.16.17.tgz", + "integrity": "sha512-kiX69+wcPAdgl3Lonh1VI7MBr16nktEvOfViszBSxygRQqSpzv7BffMKRPMFwzeJGPxcio0pdD3kYQGpqQ2SSg==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.16.17", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-loong64/-/linux-loong64-0.16.17.tgz", + "integrity": "sha512-dTzNnQwembNDhd654cA4QhbS9uDdXC3TKqMJjgOWsC0yNCbpzfWoXdZvp0mY7HU6nzk5E0zpRGGx3qoQg8T2DQ==", + "cpu": [ + "loong64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.16.17", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-mips64el/-/linux-mips64el-0.16.17.tgz", + "integrity": "sha512-ezbDkp2nDl0PfIUn0CsQ30kxfcLTlcx4Foz2kYv8qdC6ia2oX5Q3E/8m6lq84Dj/6b0FrkgD582fJMIfHhJfSw==", + "cpu": [ + "mips64el" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.16.17", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-ppc64/-/linux-ppc64-0.16.17.tgz", + "integrity": "sha512-dzS678gYD1lJsW73zrFhDApLVdM3cUF2MvAa1D8K8KtcSKdLBPP4zZSLy6LFZ0jYqQdQ29bjAHJDgz0rVbLB3g==", + "cpu": [ + "ppc64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.16.17", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-riscv64/-/linux-riscv64-0.16.17.tgz", + "integrity": "sha512-ylNlVsxuFjZK8DQtNUwiMskh6nT0vI7kYl/4fZgV1llP5d6+HIeL/vmmm3jpuoo8+NuXjQVZxmKuhDApK0/cKw==", + "cpu": [ + "riscv64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.16.17", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-s390x/-/linux-s390x-0.16.17.tgz", + "integrity": "sha512-gzy7nUTO4UA4oZ2wAMXPNBGTzZFP7mss3aKR2hH+/4UUkCOyqmjXiKpzGrY2TlEUhbbejzXVKKGazYcQTZWA/w==", + "cpu": [ + "s390x" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.16.17", + "resolved": "https://registry.npmmirror.com/@esbuild/linux-x64/-/linux-x64-0.16.17.tgz", + "integrity": "sha512-mdPjPxfnmoqhgpiEArqi4egmBAMYvaObgn4poorpUaqmvzzbvqbowRllQ+ZgzGVMGKaPkqUmPDOOFQRUFDmeUw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.16.17", + "resolved": "https://registry.npmmirror.com/@esbuild/netbsd-x64/-/netbsd-x64-0.16.17.tgz", + "integrity": "sha512-/PzmzD/zyAeTUsduZa32bn0ORug+Jd1EGGAUJvqfeixoEISYpGnAezN6lnJoskauoai0Jrs+XSyvDhppCPoKOA==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.16.17", + "resolved": "https://registry.npmmirror.com/@esbuild/openbsd-x64/-/openbsd-x64-0.16.17.tgz", + "integrity": "sha512-2yaWJhvxGEz2RiftSk0UObqJa/b+rIAjnODJgv2GbGGpRwAfpgzyrg1WLK8rqA24mfZa9GvpjLcBBg8JHkoodg==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.16.17", + "resolved": "https://registry.npmmirror.com/@esbuild/sunos-x64/-/sunos-x64-0.16.17.tgz", + "integrity": "sha512-xtVUiev38tN0R3g8VhRfN7Zl42YCJvyBhRKw1RJjwE1d2emWTVToPLNEQj/5Qxc6lVFATDiy6LjVHYhIPrLxzw==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.16.17", + "resolved": "https://registry.npmmirror.com/@esbuild/win32-arm64/-/win32-arm64-0.16.17.tgz", + "integrity": "sha512-ga8+JqBDHY4b6fQAmOgtJJue36scANy4l/rL97W+0wYmijhxKetzZdKOJI7olaBaMhWt8Pac2McJdZLxXWUEQw==", + "cpu": [ + "arm64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.16.17", + "resolved": "https://registry.npmmirror.com/@esbuild/win32-ia32/-/win32-ia32-0.16.17.tgz", + "integrity": "sha512-WnsKaf46uSSF/sZhwnqE4L/F89AYNMiD4YtEcYekBt9Q7nj0DiId2XH2Ng2PHM54qi5oPrQ8luuzGszqi/veig==", + "cpu": [ + "ia32" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.16.17", + "resolved": "https://registry.npmmirror.com/@esbuild/win32-x64/-/win32-x64-0.16.17.tgz", + "integrity": "sha512-y+EHuSchhL7FjHgvQL/0fnnFmO4T1bhvWANX6gcnqTjtnKWbTvUMCpGnv2+t+31d7RzyEAYAd4u2fnIhHL6N/Q==", + "cpu": [ + "x64" + ], + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmmirror.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.10.0", + "resolved": "https://registry.npmmirror.com/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", + "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", + "dev": true, + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.1.4", + "resolved": "https://registry.npmmirror.com/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "dev": true, + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "13.23.0", + "resolved": "https://registry.npmmirror.com/globals/-/globals-13.23.0.tgz", + "integrity": "sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@eslint/js": { + "version": "8.55.0", + "resolved": "https://registry.npmmirror.com/@eslint/js/-/js-8.55.0.tgz", + "integrity": "sha512-qQfo2mxH5yVom1kacMtZZJFVdW+E70mqHMJvVg6WTLo+VBuQJ4TojZlfWBjK0ve5BdEeNAVxOsl/nvNMpJOaJA==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@fast-crud/fast-crud": { + "version": "1.20.2", + "resolved": "https://registry.npmmirror.com/@fast-crud/fast-crud/-/fast-crud-1.20.2.tgz", + "integrity": "sha512-v+FNkY71jeHlpbnAkq0onSOlBIuvQg2AoUvzdVf2y4cJaAoggxNS6iCb4uTufuuF9CEeBDluk75YZ6e/viM/1A==", + "dependencies": { + "file-saver": "^2.0.5", + "lru-cache": "^10.0.0", + "vuedraggable-es": "^4.1.1", + "xlsx": "^0.18.5" + } + }, + "node_modules/@fast-crud/fast-extends": { + "version": "1.20.2", + "resolved": "https://registry.npmmirror.com/@fast-crud/fast-extends/-/fast-extends-1.20.2.tgz", + "integrity": "sha512-4jZ8ej5V3Zc+/rqrVpKEAZwld+EiCWgoON7/sT4/cF2SGFvpfY7eQXC41djO87QUtXI0nC5MuoB8sCwDVBCCsg==", + "dependencies": { + "@aws-sdk/client-s3": "^3.383.0", + "@aws-sdk/s3-request-presigner": "^3.383.0", + "@aws-sdk/signature-v4-crt": "^3.378.0", + "@soerenmartius/vue3-clipboard": "^0.1.2", + "@wangeditor/editor": "^5.1.23", + "@wangeditor/editor-for-vue": "^5.1.12", + "ali-oss": "^6.18.0", + "cos-js-sdk-v5": "^1.4.19", + "cropperjs": "^1.5.13", + "dayjs": "^1.11.9", + "glob": "^10.3.3", + "humanize-duration": "^3.29.0", + "jsoneditor": "^9.10.2", + "lodash-es": "^4.17.21", + "object-assign": "^4.1.1", + "qiniu-js": "3.4.1", + "quill": "^1.3.7", + "vue-cropperjs": "^5.0.0" + } + }, + "node_modules/@fast-crud/ui-element": { + "version": "1.20.2", + "resolved": "https://registry.npmmirror.com/@fast-crud/ui-element/-/ui-element-1.20.2.tgz", + "integrity": "sha512-L85Hd8RKBJcf4zsY8wJT+s8y2U3ceX45cefuRtjAYuh/8CjIGTj5n/4zNQTGyH8iKgelyg8QiID7umZzA+Y6lg==" + }, + "node_modules/@fast-crud/ui-interface": { + "version": "1.20.2", + "resolved": "https://registry.npmmirror.com/@fast-crud/ui-interface/-/ui-interface-1.20.2.tgz", + "integrity": "sha512-ukUcDgFG4HFXDK+WbESBpzMQTbknrgOI8OhuftTk8Fx2hG2iuVnw6pNizyOILwt/h//k7t3iP67pVZ0sUC+PCg==", + "dependencies": { + "lodash-es": "^4.17.21" + } + }, + "node_modules/@floating-ui/core": { + "version": "1.5.0", + "resolved": "https://registry.npmmirror.com/@floating-ui/core/-/core-1.5.0.tgz", + "integrity": "sha512-kK1h4m36DQ0UHGj5Ah4db7R0rHemTqqO0QLvUqi1/mUUp3LuAWbWxdxSIf/XsnH9VS6rRVPLJCncjRzUvyCLXg==", + "dependencies": { + "@floating-ui/utils": "^0.1.3" + } + }, + "node_modules/@floating-ui/dom": { + "version": "1.5.3", + "resolved": "https://registry.npmmirror.com/@floating-ui/dom/-/dom-1.5.3.tgz", + "integrity": "sha512-ClAbQnEqJAKCJOEbbLo5IUlZHkNszqhuxS4fHAVxRPXPya6Ysf2G8KypnYcOTpx6I8xcgF9bbHb6g/2KpbV8qA==", + "dependencies": { + "@floating-ui/core": "^1.4.2", + "@floating-ui/utils": "^0.1.3" + } + }, + "node_modules/@floating-ui/utils": { + "version": "0.1.6", + "resolved": "https://registry.npmmirror.com/@floating-ui/utils/-/utils-0.1.6.tgz", + "integrity": "sha512-OfX7E2oUDYxtBvsuS4e/jSn4Q9Qb6DzgeYtsAdkPZ47znpoNsMgZw0+tVijiv3uGNR6dgNlty6r9rzIzHjtd/A==" + }, + "node_modules/@httptoolkit/websocket-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmmirror.com/@httptoolkit/websocket-stream/-/websocket-stream-6.0.1.tgz", + "integrity": "sha512-A0NOZI+Glp3Xgcz6Na7i7o09+/+xm2m0UCU8gdtM2nIv6/cjLmhMZMqehSpTlgbx9omtLmV8LVqOskPEyWnmZQ==", + "dependencies": { + "@types/ws": "*", + "duplexify": "^3.5.1", + "inherits": "^2.0.1", + "isomorphic-ws": "^4.0.1", + "readable-stream": "^2.3.3", + "safe-buffer": "^5.1.2", + "ws": "*", + "xtend": "^4.0.0" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.11.13", + "resolved": "https://registry.npmmirror.com/@humanwhocodes/config-array/-/config-array-0.11.13.tgz", + "integrity": "sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==", + "dev": true, + "dependencies": { + "@humanwhocodes/object-schema": "^2.0.1", + "debug": "^4.1.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "engines": { + "node": ">=12.22" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/@humanwhocodes/object-schema/-/object-schema-2.0.1.tgz", + "integrity": "sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==", + "dev": true + }, + "node_modules/@iconify/types": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/@iconify/types/-/types-2.0.0.tgz", + "integrity": "sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==" + }, + "node_modules/@iconify/vue": { + "version": "4.1.1", + "resolved": "https://registry.npmmirror.com/@iconify/vue/-/vue-4.1.1.tgz", + "integrity": "sha512-RL85Bm/DAe8y6rT6pux7D2FJSiUEM/TPfyK7GrbAOfTSwrhvwJW+S5yijdGcmtXouA8MtuH9C7l4hiSE4mLMjg==", + "dependencies": { + "@iconify/types": "^2.0.0" + }, + "peerDependencies": { + "vue": ">=3" + } + }, + "node_modules/@interactjs/actions": { + "version": "1.10.19", + "resolved": "https://registry.npmmirror.com/@interactjs/actions/-/actions-1.10.19.tgz", + "integrity": "sha512-mZyx1MZx5/IoLj9zg/5IZ8LmO98XGUQ3IJoDfSM7sY5yTo/WgHY0v4fdLCy8ssx5X2n1VEPV889J7u8+42kavw==", + "optionalDependencies": { + "@interactjs/interact": "1.10.19" + }, + "peerDependencies": { + "@interactjs/core": "1.10.19", + "@interactjs/utils": "1.10.19" + } + }, + "node_modules/@interactjs/auto-scroll": { + "version": "1.10.19", + "resolved": "https://registry.npmmirror.com/@interactjs/auto-scroll/-/auto-scroll-1.10.19.tgz", + "integrity": "sha512-zbU8fzhKgVlbNcU9CYCciFVeyCcxd+5Ny9lexsOh6Q2Ra7hXf/bW6LXitylLE22PPlY76kVK3+4yQD2d7Fb7rA==", + "optionalDependencies": { + "@interactjs/interact": "1.10.19" + }, + "peerDependencies": { + "@interactjs/utils": "1.10.19" + } + }, + "node_modules/@interactjs/auto-start": { + "version": "1.10.19", + "resolved": "https://registry.npmmirror.com/@interactjs/auto-start/-/auto-start-1.10.19.tgz", + "integrity": "sha512-WifIomXIV9MWWHEz3zrMN6n+wl+9IshMVIUsbvx13AM4oiL4832A0JUNrCkL5m6BUTn7iw5CpIdwtnBh+OCYSQ==", + "optionalDependencies": { + "@interactjs/interact": "1.10.19" + }, + "peerDependencies": { + "@interactjs/core": "1.10.19", + "@interactjs/utils": "1.10.19" + } + }, + "node_modules/@interactjs/core": { + "version": "1.10.19", + "resolved": "https://registry.npmmirror.com/@interactjs/core/-/core-1.10.19.tgz", + "integrity": "sha512-4Mq7+pXFq7aCJXh0RRdS9j+PJPi5yHbZsOLpryWFQMQ6GeKPaiu3d97rY4gjhW7SVa+l82QGCMEI0T7ib4DqsA==", + "peerDependencies": { + "@interactjs/utils": "1.10.19" + } + }, + "node_modules/@interactjs/dev-tools": { + "version": "1.10.19", + "resolved": "https://registry.npmmirror.com/@interactjs/dev-tools/-/dev-tools-1.10.19.tgz", + "integrity": "sha512-FfsOp8nQ/Gduhz25axLzezOnrMl1V+1gkKBCIXaEwlBzFOycJ+YOjgolajPVgC/26UjHMSKy4vIXfD6hLTJpfw==", + "optionalDependencies": { + "@interactjs/interact": "1.10.19" + }, + "peerDependencies": { + "@interactjs/modifiers": "1.10.19", + "@interactjs/utils": "1.10.19" + } + }, + "node_modules/@interactjs/inertia": { + "version": "1.10.19", + "resolved": "https://registry.npmmirror.com/@interactjs/inertia/-/inertia-1.10.19.tgz", + "integrity": "sha512-A01Ddqb/6vqWcYaFcW1rwB8e+W1YGY9mR6D6ECt2w3ndmQbMBGWLYvf/smM8kAkL0daqzeCT2uI/n6EHS+sQXQ==", + "dependencies": { + "@interactjs/offset": "1.10.19" + }, + "optionalDependencies": { + "@interactjs/interact": "1.10.19" + }, + "peerDependencies": { + "@interactjs/core": "1.10.19", + "@interactjs/modifiers": "1.10.19", + "@interactjs/utils": "1.10.19" + } + }, + "node_modules/@interactjs/interact": { + "version": "1.10.19", + "resolved": "https://registry.npmmirror.com/@interactjs/interact/-/interact-1.10.19.tgz", + "integrity": "sha512-PS89zWBgv8nfMKAxP41SPC/M4Uk6aXfzXTHDStu0j/Og2+hM8U0PAUcQ5VVyZoIczssM0iPi8SP59kuTp0IVrg==", + "dependencies": { + "@interactjs/core": "1.10.19", + "@interactjs/utils": "1.10.19" + } + }, + "node_modules/@interactjs/interactjs": { + "version": "1.10.19", + "resolved": "https://registry.npmmirror.com/@interactjs/interactjs/-/interactjs-1.10.19.tgz", + "integrity": "sha512-3Vgwj/i2wyKBEs7ms1SB+GImNqbavoE5+5xFq0Ui+JU9QAqblaRLcslWbuOROho6ejx5/lQjxQ0iEr2oI7gwJA==", + "dependencies": { + "@interactjs/actions": "1.10.19", + "@interactjs/auto-scroll": "1.10.19", + "@interactjs/auto-start": "1.10.19", + "@interactjs/core": "1.10.19", + "@interactjs/dev-tools": "1.10.19", + "@interactjs/inertia": "1.10.19", + "@interactjs/interact": "1.10.19", + "@interactjs/modifiers": "1.10.19", + "@interactjs/offset": "1.10.19", + "@interactjs/pointer-events": "1.10.19", + "@interactjs/reflow": "1.10.19", + "@interactjs/utils": "1.10.19" + } + }, + "node_modules/@interactjs/modifiers": { + "version": "1.10.19", + "resolved": "https://registry.npmmirror.com/@interactjs/modifiers/-/modifiers-1.10.19.tgz", + "integrity": "sha512-qkUHwgTxlC4W4rLFaz64WyBOo/laVz+s0uUJsHDCzdzAz5ZGguMM6Cvnt8EJ04eZWqrZ2zGAF1dzHFe07XB6Qg==", + "dependencies": { + "@interactjs/snappers": "1.10.19" + }, + "optionalDependencies": { + "@interactjs/interact": "1.10.19" + }, + "peerDependencies": { + "@interactjs/core": "1.10.19", + "@interactjs/utils": "1.10.19" + } + }, + "node_modules/@interactjs/offset": { + "version": "1.10.19", + "resolved": "https://registry.npmmirror.com/@interactjs/offset/-/offset-1.10.19.tgz", + "integrity": "sha512-3fa0/BbAyGqkjghTTIs4HTlhGDL5Nh6GtCUk9QQE+BVnTl6b7iaVumvvOij6ih6IMqBRf5ignRIbt6ndZe75/g==", + "optionalDependencies": { + "@interactjs/interact": "1.10.19" + }, + "peerDependencies": { + "@interactjs/core": "1.10.19", + "@interactjs/utils": "1.10.19" + } + }, + "node_modules/@interactjs/pointer-events": { + "version": "1.10.19", + "resolved": "https://registry.npmmirror.com/@interactjs/pointer-events/-/pointer-events-1.10.19.tgz", + "integrity": "sha512-Pp8sFW9V5krHUcNs9321RG+F6ylgHAjsefEBpAV15zqxEkcyutiOguTCDuXlZ2lewrfT4G2skRKv5p5lMJ6taw==", + "optionalDependencies": { + "@interactjs/interact": "1.10.19" + }, + "peerDependencies": { + "@interactjs/core": "1.10.19", + "@interactjs/utils": "1.10.19" + } + }, + "node_modules/@interactjs/reflow": { + "version": "1.10.19", + "resolved": "https://registry.npmmirror.com/@interactjs/reflow/-/reflow-1.10.19.tgz", + "integrity": "sha512-0MAZTs/3Gss2SECdDY2fzCU+mzXBmuOIBDrMsEg1c18DDq+fkeS6Ny9wQ5YR8iyTgv+xZEy+PG8Q9tv6BQhatg==", + "optionalDependencies": { + "@interactjs/interact": "1.10.19" + }, + "peerDependencies": { + "@interactjs/core": "1.10.19", + "@interactjs/utils": "1.10.19" + } + }, + "node_modules/@interactjs/snappers": { + "version": "1.10.19", + "resolved": "https://registry.npmmirror.com/@interactjs/snappers/-/snappers-1.10.19.tgz", + "integrity": "sha512-JZUSecoiSx96Z1x8BYg8ZPPicgFt6KKHAQ578x4oEuqMQqpHz9SbWk2PdW9b0JcrkdxPx42Ot01eTDFyGmPq3g==", + "optionalDependencies": { + "@interactjs/interact": "1.10.19" + }, + "peerDependencies": { + "@interactjs/utils": "1.10.19" + } + }, + "node_modules/@interactjs/utils": { + "version": "1.10.19", + "resolved": "https://registry.npmmirror.com/@interactjs/utils/-/utils-1.10.19.tgz", + "integrity": "sha512-jfMCmSkVgzb6g2L1kyUNJWqRRajMQgmv0yLJwVNHjeQAe9Hxe5b+iAQUYUan4XtrtWuruXz8VAF9P3RH9qOGpQ==" + }, + "node_modules/@intlify/core-base": { + "version": "9.2.2", + "resolved": "https://registry.npmmirror.com/@intlify/core-base/-/core-base-9.2.2.tgz", + "integrity": "sha512-JjUpQtNfn+joMbrXvpR4hTF8iJQ2sEFzzK3KIESOx+f+uwIjgw20igOyaIdhfsVVBCds8ZM64MoeNSx+PHQMkA==", + "dependencies": { + "@intlify/devtools-if": "9.2.2", + "@intlify/message-compiler": "9.2.2", + "@intlify/shared": "9.2.2", + "@intlify/vue-devtools": "9.2.2" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/@intlify/devtools-if": { + "version": "9.2.2", + "resolved": "https://registry.npmmirror.com/@intlify/devtools-if/-/devtools-if-9.2.2.tgz", + "integrity": "sha512-4ttr/FNO29w+kBbU7HZ/U0Lzuh2cRDhP8UlWOtV9ERcjHzuyXVZmjyleESK6eVP60tGC9QtQW9yZE+JeRhDHkg==", + "dependencies": { + "@intlify/shared": "9.2.2" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/@intlify/message-compiler": { + "version": "9.2.2", + "resolved": "https://registry.npmmirror.com/@intlify/message-compiler/-/message-compiler-9.2.2.tgz", + "integrity": "sha512-IUrQW7byAKN2fMBe8z6sK6riG1pue95e5jfokn8hA5Q3Bqy4MBJ5lJAofUsawQJYHeoPJ7svMDyBaVJ4d0GTtA==", + "dependencies": { + "@intlify/shared": "9.2.2", + "source-map": "0.6.1" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/@intlify/shared": { + "version": "9.2.2", + "resolved": "https://registry.npmmirror.com/@intlify/shared/-/shared-9.2.2.tgz", + "integrity": "sha512-wRwTpsslgZS5HNyM7uDQYZtxnbI12aGiBZURX3BTR9RFIKKRWpllTsgzHWvj3HKm3Y2Sh5LPC1r0PDCKEhVn9Q==", + "engines": { + "node": ">= 14" + } + }, + "node_modules/@intlify/vue-devtools": { + "version": "9.2.2", + "resolved": "https://registry.npmmirror.com/@intlify/vue-devtools/-/vue-devtools-9.2.2.tgz", + "integrity": "sha512-+dUyqyCHWHb/UcvY1MlIpO87munedm3Gn6E9WWYdWrMuYLcoIoOEVDWSS8xSwtlPU+kA+MEQTP6Q1iI/ocusJg==", + "dependencies": { + "@intlify/core-base": "9.2.2", + "@intlify/shared": "9.2.2" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmmirror.com/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.3", + "resolved": "https://registry.npmmirror.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "dependencies": { + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.1", + "resolved": "https://registry.npmmirror.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", + "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.5", + "resolved": "https://registry.npmmirror.com/@jridgewell/source-map/-/source-map-0.3.5.tgz", + "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==", + "devOptional": true, + "peer": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmmirror.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.20", + "resolved": "https://registry.npmmirror.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz", + "integrity": "sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmmirror.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmmirror.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmmirror.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmmirror.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@popperjs/core": { + "version": "2.11.8", + "resolved": "https://registry.npmmirror.com/@popperjs/core/-/core-2.11.8.tgz", + "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==" + }, + "node_modules/@smithy/abort-controller": { + "version": "2.0.11", + "resolved": "https://registry.npmmirror.com/@smithy/abort-controller/-/abort-controller-2.0.11.tgz", + "integrity": "sha512-MSzE1qR2JNyb7ot3blIOT3O3H0Jn06iNDEgHRaqZUwBgx5EG+VIx24Y21tlKofzYryIOcWpIohLrIIyocD6LMA==", + "dependencies": { + "@smithy/types": "^2.3.5", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/chunked-blob-reader": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/@smithy/chunked-blob-reader/-/chunked-blob-reader-2.0.0.tgz", + "integrity": "sha512-k+J4GHJsMSAIQPChGBrjEmGS+WbPonCXesoqP9fynIqjn7rdOThdH8FAeCmokP9mxTYKQAKoHCLPzNlm6gh7Wg==", + "dependencies": { + "tslib": "^2.5.0" + } + }, + "node_modules/@smithy/chunked-blob-reader-native": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/@smithy/chunked-blob-reader-native/-/chunked-blob-reader-native-2.0.0.tgz", + "integrity": "sha512-HM8V2Rp1y8+1343tkZUKZllFhEQPNmpNdgFAncbTsxkZ18/gqjk23XXv3qGyXWp412f3o43ZZ1UZHVcHrpRnCQ==", + "dependencies": { + "@smithy/util-base64": "^2.0.0", + "tslib": "^2.5.0" + } + }, + "node_modules/@smithy/config-resolver": { + "version": "2.0.15", + "resolved": "https://registry.npmmirror.com/@smithy/config-resolver/-/config-resolver-2.0.15.tgz", + "integrity": "sha512-a2Pfocla5nSrG2RyB8i20jcWgMyR71TUeFKm8pmrnZotr/X22tlg4y/EhSvBK2oTE8MKHlKh4YdpDO2AryJbGQ==", + "dependencies": { + "@smithy/node-config-provider": "^2.1.2", + "@smithy/types": "^2.3.5", + "@smithy/util-config-provider": "^2.0.0", + "@smithy/util-middleware": "^2.0.4", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/credential-provider-imds": { + "version": "2.0.17", + "resolved": "https://registry.npmmirror.com/@smithy/credential-provider-imds/-/credential-provider-imds-2.0.17.tgz", + "integrity": "sha512-2XcD414yrwbxxuYueTo7tzLC2/w3jj9FZqfenpv3MQkocdOEmuOVS0v9WHsY/nW6V+2EcR340rj/z5HnvsHncQ==", + "dependencies": { + "@smithy/node-config-provider": "^2.1.2", + "@smithy/property-provider": "^2.0.12", + "@smithy/types": "^2.3.5", + "@smithy/url-parser": "^2.0.11", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/eventstream-codec": { + "version": "2.0.11", + "resolved": "https://registry.npmmirror.com/@smithy/eventstream-codec/-/eventstream-codec-2.0.11.tgz", + "integrity": "sha512-BQCTjxhCYRZIfXapa2LmZSaH8QUBGwMZw7XRN83hrdixbLjIcj+o549zjkedFS07Ve2TlvWUI6BTzP+nv7snBA==", + "dependencies": { + "@aws-crypto/crc32": "3.0.0", + "@smithy/types": "^2.3.5", + "@smithy/util-hex-encoding": "^2.0.0", + "tslib": "^2.5.0" + } + }, + "node_modules/@smithy/eventstream-serde-browser": { + "version": "2.0.11", + "resolved": "https://registry.npmmirror.com/@smithy/eventstream-serde-browser/-/eventstream-serde-browser-2.0.11.tgz", + "integrity": "sha512-p9IK4uvwT6B3pT1VGlODvcVBfPVikjBFHAcKpvvNF+7lAEI+YiC6d0SROPkpjnvCgVBYyGXa3ciqrWnFze6mwQ==", + "dependencies": { + "@smithy/eventstream-serde-universal": "^2.0.11", + "@smithy/types": "^2.3.5", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/eventstream-serde-config-resolver": { + "version": "2.0.11", + "resolved": "https://registry.npmmirror.com/@smithy/eventstream-serde-config-resolver/-/eventstream-serde-config-resolver-2.0.11.tgz", + "integrity": "sha512-vN32E8yExo0Z8L7kXhlU9KRURrhqOpPdLxQMp3MwfMThrjiqbr1Sk5srUXc1ed2Ygl/l0TEN9vwNG0bQHg6AjQ==", + "dependencies": { + "@smithy/types": "^2.3.5", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/eventstream-serde-node": { + "version": "2.0.11", + "resolved": "https://registry.npmmirror.com/@smithy/eventstream-serde-node/-/eventstream-serde-node-2.0.11.tgz", + "integrity": "sha512-Gjqbpg7UmD+YzkpgNShNcDNZcUpBWIkvX2XCGptz5PoxJU/UQbuF9eSc93ZlIb7j4aGjtFfqk23HUMW8Hopg2Q==", + "dependencies": { + "@smithy/eventstream-serde-universal": "^2.0.11", + "@smithy/types": "^2.3.5", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/eventstream-serde-universal": { + "version": "2.0.11", + "resolved": "https://registry.npmmirror.com/@smithy/eventstream-serde-universal/-/eventstream-serde-universal-2.0.11.tgz", + "integrity": "sha512-F8FsxLTbFN4+Esgpo+nNKcEajrgRZJ+pG9c8+MhLM4Odp5ejLHw2GMCXd81cGsgmfcbnzdDEXazPPVzOwj89MQ==", + "dependencies": { + "@smithy/eventstream-codec": "^2.0.11", + "@smithy/types": "^2.3.5", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/fetch-http-handler": { + "version": "2.2.3", + "resolved": "https://registry.npmmirror.com/@smithy/fetch-http-handler/-/fetch-http-handler-2.2.3.tgz", + "integrity": "sha512-0G9sePU+0R+8d7cie+OXzNbbkjnD4RfBlVCs46ZEuQAMcxK8OniemYXSSkOc80CCk8Il4DnlYZcUSvsIs2OB2w==", + "dependencies": { + "@smithy/protocol-http": "^3.0.7", + "@smithy/querystring-builder": "^2.0.11", + "@smithy/types": "^2.3.5", + "@smithy/util-base64": "^2.0.0", + "tslib": "^2.5.0" + } + }, + "node_modules/@smithy/hash-blob-browser": { + "version": "2.0.11", + "resolved": "https://registry.npmmirror.com/@smithy/hash-blob-browser/-/hash-blob-browser-2.0.11.tgz", + "integrity": "sha512-/6vq/NiH2EN3mWdwcLdjVohP+VCng+ZA1GnlUdx959egsfgIlLWQvCyjnB2ze9Hr6VHV5XEFLLpLQH2dHA6Sgw==", + "dependencies": { + "@smithy/chunked-blob-reader": "^2.0.0", + "@smithy/chunked-blob-reader-native": "^2.0.0", + "@smithy/types": "^2.3.5", + "tslib": "^2.5.0" + } + }, + "node_modules/@smithy/hash-node": { + "version": "2.0.11", + "resolved": "https://registry.npmmirror.com/@smithy/hash-node/-/hash-node-2.0.11.tgz", + "integrity": "sha512-PbleVugN2tbhl1ZoNWVrZ1oTFFas/Hq+s6zGO8B9bv4w/StTriTKA9W+xZJACOj9X7zwfoTLbscM+avCB1KqOQ==", + "dependencies": { + "@smithy/types": "^2.3.5", + "@smithy/util-buffer-from": "^2.0.0", + "@smithy/util-utf8": "^2.0.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/hash-stream-node": { + "version": "2.0.11", + "resolved": "https://registry.npmmirror.com/@smithy/hash-stream-node/-/hash-stream-node-2.0.11.tgz", + "integrity": "sha512-Jn2yl+Dn0kvwKvSavvR1/BFVYa2wIkaJKWeTH48kno89gqHAJxMh1hrtBN6SJ7F8VhodNZTiNOlQVqCSfLheNQ==", + "dependencies": { + "@smithy/types": "^2.3.5", + "@smithy/util-utf8": "^2.0.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/invalid-dependency": { + "version": "2.0.11", + "resolved": "https://registry.npmmirror.com/@smithy/invalid-dependency/-/invalid-dependency-2.0.11.tgz", + "integrity": "sha512-zazq99ujxYv/NOf9zh7xXbNgzoVLsqE0wle8P/1zU/XdhPi/0zohTPKWUzIxjGdqb5hkkwfBkNkl5H+LE0mvgw==", + "dependencies": { + "@smithy/types": "^2.3.5", + "tslib": "^2.5.0" + } + }, + "node_modules/@smithy/is-array-buffer": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/@smithy/is-array-buffer/-/is-array-buffer-2.0.0.tgz", + "integrity": "sha512-z3PjFjMyZNI98JFRJi/U0nGoLWMSJlDjAW4QUX2WNZLas5C0CmVV6LJ01JI0k90l7FvpmixjWxPFmENSClQ7ug==", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/md5-js": { + "version": "2.0.11", + "resolved": "https://registry.npmmirror.com/@smithy/md5-js/-/md5-js-2.0.11.tgz", + "integrity": "sha512-YBIv+e95qeGvQA05ucwstmTeQ/bUzWgU+nO2Ffmif5awu6IzSR0Jfk3XLYh4mdy7f8DCgsn8qA63u7N9Lu0+5A==", + "dependencies": { + "@smithy/types": "^2.3.5", + "@smithy/util-utf8": "^2.0.0", + "tslib": "^2.5.0" + } + }, + "node_modules/@smithy/middleware-content-length": { + "version": "2.0.13", + "resolved": "https://registry.npmmirror.com/@smithy/middleware-content-length/-/middleware-content-length-2.0.13.tgz", + "integrity": "sha512-Md2kxWpaec3bXp1oERFPQPBhOXCkGSAF7uc1E+4rkwjgw3/tqAXRtbjbggu67HJdwaif76As8AV6XxbD1HzqTQ==", + "dependencies": { + "@smithy/protocol-http": "^3.0.7", + "@smithy/types": "^2.3.5", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/middleware-endpoint": { + "version": "2.1.2", + "resolved": "https://registry.npmmirror.com/@smithy/middleware-endpoint/-/middleware-endpoint-2.1.2.tgz", + "integrity": "sha512-dua4r2EbSTRzNefz72snz+KDuXN73RCe1K+rGeemzUyYemxuh1jujFbLQbTU6DVlTgHkhtrbH0+kdOFY/SV4Qg==", + "dependencies": { + "@smithy/middleware-serde": "^2.0.11", + "@smithy/node-config-provider": "^2.1.2", + "@smithy/shared-ini-file-loader": "^2.2.1", + "@smithy/types": "^2.3.5", + "@smithy/url-parser": "^2.0.11", + "@smithy/util-middleware": "^2.0.4", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/middleware-retry": { + "version": "2.0.17", + "resolved": "https://registry.npmmirror.com/@smithy/middleware-retry/-/middleware-retry-2.0.17.tgz", + "integrity": "sha512-ZYVU1MmshCTbEKTNc5h7/Pps1vhH5C7hRclQWnAbVYKkIT+PEGu9dSVqprzEo/nlMA8Zv4Dj5Y+fv3pRnUwElw==", + "dependencies": { + "@smithy/node-config-provider": "^2.1.2", + "@smithy/protocol-http": "^3.0.7", + "@smithy/service-error-classification": "^2.0.4", + "@smithy/types": "^2.3.5", + "@smithy/util-middleware": "^2.0.4", + "@smithy/util-retry": "^2.0.4", + "tslib": "^2.5.0", + "uuid": "^8.3.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/middleware-serde": { + "version": "2.0.11", + "resolved": "https://registry.npmmirror.com/@smithy/middleware-serde/-/middleware-serde-2.0.11.tgz", + "integrity": "sha512-NuxnjMyf4zQqhwwdh0OTj5RqpnuT6HcH5Xg5GrPijPcKzc2REXVEVK4Yyk8ckj8ez1XSj/bCmJ+oNjmqB02GWA==", + "dependencies": { + "@smithy/types": "^2.3.5", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/middleware-stack": { + "version": "2.0.5", + "resolved": "https://registry.npmmirror.com/@smithy/middleware-stack/-/middleware-stack-2.0.5.tgz", + "integrity": "sha512-bVQU/rZzBY7CbSxIrDTGZYnBWKtIw+PL/cRc9B7etZk1IKSOe0NvKMJyWllfhfhrTeMF6eleCzOihIQympAvPw==", + "dependencies": { + "@smithy/types": "^2.3.5", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/node-config-provider": { + "version": "2.1.2", + "resolved": "https://registry.npmmirror.com/@smithy/node-config-provider/-/node-config-provider-2.1.2.tgz", + "integrity": "sha512-tbYh/JK/ddxKWYTtjLgap0juyivJ0wCvywMqINb54zyOVHoKYM6iYl7DosQA0owFaNp6GAx1lXFjqGz7L2fAqA==", + "dependencies": { + "@smithy/property-provider": "^2.0.12", + "@smithy/shared-ini-file-loader": "^2.2.1", + "@smithy/types": "^2.3.5", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/node-http-handler": { + "version": "2.1.7", + "resolved": "https://registry.npmmirror.com/@smithy/node-http-handler/-/node-http-handler-2.1.7.tgz", + "integrity": "sha512-PQIKZXlp3awCDn/xNlCSTFE7aYG/5Tx33M05NfQmWYeB5yV1GZZOSz4dXpwiNJYTXb9jPqjl+ueXXkwtEluFFA==", + "dependencies": { + "@smithy/abort-controller": "^2.0.11", + "@smithy/protocol-http": "^3.0.7", + "@smithy/querystring-builder": "^2.0.11", + "@smithy/types": "^2.3.5", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/property-provider": { + "version": "2.0.12", + "resolved": "https://registry.npmmirror.com/@smithy/property-provider/-/property-provider-2.0.12.tgz", + "integrity": "sha512-Un/OvvuQ1Kg8WYtoMCicfsFFuHb/TKL3pCA6ZIo/WvNTJTR94RtoRnL7mY4XkkUAoFMyf6KjcQJ76y1FX7S5rw==", + "dependencies": { + "@smithy/types": "^2.3.5", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/protocol-http": { + "version": "3.0.7", + "resolved": "https://registry.npmmirror.com/@smithy/protocol-http/-/protocol-http-3.0.7.tgz", + "integrity": "sha512-HnZW8y+r66ntYueCDbLqKwWcMNWW8o3eVpSrHNluwtBJ/EUWfQHRKSiu6vZZtc6PGfPQWgVfucoCE/C3QufMAA==", + "dependencies": { + "@smithy/types": "^2.3.5", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/querystring-builder": { + "version": "2.0.11", + "resolved": "https://registry.npmmirror.com/@smithy/querystring-builder/-/querystring-builder-2.0.11.tgz", + "integrity": "sha512-b4kEbVMxpmfv2VWUITn2otckTi7GlMteZQxi+jlwedoATOGEyrCJPfRcYQJjbCi3fZ2QTfh3PcORvB27+j38Yg==", + "dependencies": { + "@smithy/types": "^2.3.5", + "@smithy/util-uri-escape": "^2.0.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/querystring-parser": { + "version": "2.0.11", + "resolved": "https://registry.npmmirror.com/@smithy/querystring-parser/-/querystring-parser-2.0.11.tgz", + "integrity": "sha512-YXe7jhi7s3dQ0Fu9dLoY/gLu6NCyy8tBWJL/v2c9i7/RLpHgKT+uT96/OqZkHizCJ4kr0ZD46tzMjql/o60KLg==", + "dependencies": { + "@smithy/types": "^2.3.5", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/service-error-classification": { + "version": "2.0.4", + "resolved": "https://registry.npmmirror.com/@smithy/service-error-classification/-/service-error-classification-2.0.4.tgz", + "integrity": "sha512-77506l12I5gxTZqBkx3Wb0RqMG81bMYLaVQ+EqIWFwQDJRs5UFeXogKxSKojCmz1wLUziHZQXm03MBzPQiumQw==", + "dependencies": { + "@smithy/types": "^2.3.5" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/shared-ini-file-loader": { + "version": "2.2.1", + "resolved": "https://registry.npmmirror.com/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-2.2.1.tgz", + "integrity": "sha512-eAYajwo2eTTVU5KPX90+V6ccfrWphrzcUwOt7n9pLOMBO0fOKlRVshbvCBqfRCxEn7OYDGH6TsL3yrx+hAjddA==", + "dependencies": { + "@smithy/types": "^2.3.5", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/signature-v4": { + "version": "2.0.11", + "resolved": "https://registry.npmmirror.com/@smithy/signature-v4/-/signature-v4-2.0.11.tgz", + "integrity": "sha512-EFVU1dT+2s8xi227l1A9O27edT/GNKvyAK6lZnIZ0zhIHq/jSLznvkk15aonGAM1kmhmZBVGpI7Tt0odueZK9A==", + "dependencies": { + "@smithy/eventstream-codec": "^2.0.11", + "@smithy/is-array-buffer": "^2.0.0", + "@smithy/types": "^2.3.5", + "@smithy/util-hex-encoding": "^2.0.0", + "@smithy/util-middleware": "^2.0.4", + "@smithy/util-uri-escape": "^2.0.0", + "@smithy/util-utf8": "^2.0.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/smithy-client": { + "version": "2.1.11", + "resolved": "https://registry.npmmirror.com/@smithy/smithy-client/-/smithy-client-2.1.11.tgz", + "integrity": "sha512-okjMbuBBCTiieK665OFN/ap6u9+Z9z55PMphS5FYCsS6Zfp137Q3qlnt0OgBAnUVnH/mNGyoJV0LBX9gkTWptg==", + "dependencies": { + "@smithy/middleware-stack": "^2.0.5", + "@smithy/types": "^2.3.5", + "@smithy/util-stream": "^2.0.16", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/types": { + "version": "2.3.5", + "resolved": "https://registry.npmmirror.com/@smithy/types/-/types-2.3.5.tgz", + "integrity": "sha512-ehyDt8M9hehyxrLQGoA1BGPou8Js1Ocoh5M0ngDhJMqbFmNK5N6Xhr9/ZExWkyIW8XcGkiMPq3ZUEE0ScrhbuQ==", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/url-parser": { + "version": "2.0.11", + "resolved": "https://registry.npmmirror.com/@smithy/url-parser/-/url-parser-2.0.11.tgz", + "integrity": "sha512-h89yXMCCF+S5k9XIoKltMIWTYj+FcEkU/IIFZ6RtE222fskOTL4Iak6ZRG+ehSvZDt8yKEcxqheTDq7JvvtK3g==", + "dependencies": { + "@smithy/querystring-parser": "^2.0.11", + "@smithy/types": "^2.3.5", + "tslib": "^2.5.0" + } + }, + "node_modules/@smithy/util-base64": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/@smithy/util-base64/-/util-base64-2.0.0.tgz", + "integrity": "sha512-Zb1E4xx+m5Lud8bbeYi5FkcMJMnn+1WUnJF3qD7rAdXpaL7UjkFQLdmW5fHadoKbdHpwH9vSR8EyTJFHJs++tA==", + "dependencies": { + "@smithy/util-buffer-from": "^2.0.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/util-body-length-browser": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/@smithy/util-body-length-browser/-/util-body-length-browser-2.0.0.tgz", + "integrity": "sha512-JdDuS4ircJt+FDnaQj88TzZY3+njZ6O+D3uakS32f2VNnDo3vyEuNdBOh/oFd8Df1zSZOuH1HEChk2AOYDezZg==", + "dependencies": { + "tslib": "^2.5.0" + } + }, + "node_modules/@smithy/util-body-length-node": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/@smithy/util-body-length-node/-/util-body-length-node-2.1.0.tgz", + "integrity": "sha512-/li0/kj/y3fQ3vyzn36NTLGmUwAICb7Jbe/CsWCktW363gh1MOcpEcSO3mJ344Gv2dqz8YJCLQpb6hju/0qOWw==", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/util-buffer-from": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/@smithy/util-buffer-from/-/util-buffer-from-2.0.0.tgz", + "integrity": "sha512-/YNnLoHsR+4W4Vf2wL5lGv0ksg8Bmk3GEGxn2vEQt52AQaPSCuaO5PM5VM7lP1K9qHRKHwrPGktqVoAHKWHxzw==", + "dependencies": { + "@smithy/is-array-buffer": "^2.0.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/util-config-provider": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/@smithy/util-config-provider/-/util-config-provider-2.0.0.tgz", + "integrity": "sha512-xCQ6UapcIWKxXHEU4Mcs2s7LcFQRiU3XEluM2WcCjjBtQkUN71Tb+ydGmJFPxMUrW/GWMgQEEGipLym4XG0jZg==", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/util-defaults-mode-browser": { + "version": "2.0.15", + "resolved": "https://registry.npmmirror.com/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-2.0.15.tgz", + "integrity": "sha512-2raMZOYKSuke7QlDg/HDcxQdrp0zteJ8z+S0B9Rn23J55ZFNK1+IjG4HkN6vo/0u3Xy/JOdJ93ibiBSB8F7kOw==", + "dependencies": { + "@smithy/property-provider": "^2.0.12", + "@smithy/smithy-client": "^2.1.11", + "@smithy/types": "^2.3.5", + "bowser": "^2.11.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@smithy/util-defaults-mode-node": { + "version": "2.0.20", + "resolved": "https://registry.npmmirror.com/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-2.0.20.tgz", + "integrity": "sha512-kJjcZ/Lzvs3sPDKBwlhZsFFcgPNIpB3CMb6/saCakawRzo0E+JkyS3ZZRjVR3ce29yHtwoP/0YLKC1PeH0Dffg==", + "dependencies": { + "@smithy/config-resolver": "^2.0.15", + "@smithy/credential-provider-imds": "^2.0.17", + "@smithy/node-config-provider": "^2.1.2", + "@smithy/property-provider": "^2.0.12", + "@smithy/smithy-client": "^2.1.11", + "@smithy/types": "^2.3.5", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/@smithy/util-hex-encoding": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/@smithy/util-hex-encoding/-/util-hex-encoding-2.0.0.tgz", + "integrity": "sha512-c5xY+NUnFqG6d7HFh1IFfrm3mGl29lC+vF+geHv4ToiuJCBmIfzx6IeHLg+OgRdPFKDXIw6pvi+p3CsscaMcMA==", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/util-middleware": { + "version": "2.0.4", + "resolved": "https://registry.npmmirror.com/@smithy/util-middleware/-/util-middleware-2.0.4.tgz", + "integrity": "sha512-Pbu6P4MBwRcjrLgdTR1O4Y3c0sTZn2JdOiJNcgL7EcIStcQodj+6ZTXtbyU/WTEU3MV2NMA10LxFc3AWHZ3+4A==", + "dependencies": { + "@smithy/types": "^2.3.5", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/util-retry": { + "version": "2.0.4", + "resolved": "https://registry.npmmirror.com/@smithy/util-retry/-/util-retry-2.0.4.tgz", + "integrity": "sha512-b+n1jBBKc77C1E/zfBe1Zo7S9OXGBiGn55N0apfhZHxPUP/fMH5AhFUUcWaJh7NAnah284M5lGkBKuhnr3yK5w==", + "dependencies": { + "@smithy/service-error-classification": "^2.0.4", + "@smithy/types": "^2.3.5", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">= 14.0.0" + } + }, + "node_modules/@smithy/util-stream": { + "version": "2.0.16", + "resolved": "https://registry.npmmirror.com/@smithy/util-stream/-/util-stream-2.0.16.tgz", + "integrity": "sha512-b5ZSRh1KzUzC7LoJcpfk7+iXGoRr3WylEfmPd4FnBLm90OwxSB9VgK1fDZwicfYxSEvWHdYXgvvjPtenEYBBhw==", + "dependencies": { + "@smithy/fetch-http-handler": "^2.2.3", + "@smithy/node-http-handler": "^2.1.7", + "@smithy/types": "^2.3.5", + "@smithy/util-base64": "^2.0.0", + "@smithy/util-buffer-from": "^2.0.0", + "@smithy/util-hex-encoding": "^2.0.0", + "@smithy/util-utf8": "^2.0.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/util-uri-escape": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/@smithy/util-uri-escape/-/util-uri-escape-2.0.0.tgz", + "integrity": "sha512-ebkxsqinSdEooQduuk9CbKcI+wheijxEb3utGXkCoYQkJnwTnLbH1JXGimJtUkQwNQbsbuYwG2+aFVyZf5TLaw==", + "dependencies": { + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/util-utf8": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/@smithy/util-utf8/-/util-utf8-2.0.0.tgz", + "integrity": "sha512-rctU1VkziY84n5OXe3bPNpKR001ZCME2JCaBBFgtiM2hfKbHFudc/BkMuPab8hRbLd0j3vbnBTTZ1igBf0wgiQ==", + "dependencies": { + "@smithy/util-buffer-from": "^2.0.0", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@smithy/util-waiter": { + "version": "2.0.11", + "resolved": "https://registry.npmmirror.com/@smithy/util-waiter/-/util-waiter-2.0.11.tgz", + "integrity": "sha512-8SJWUl9O1YhjC77EccgltI3q4XZQp3vp9DGEW6o0OdkUcwqm/H4qOLnMkA2n+NDojuM5Iia2jWoCdbluIiG7TA==", + "dependencies": { + "@smithy/abort-controller": "^2.0.11", + "@smithy/types": "^2.3.5", + "tslib": "^2.5.0" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/@soerenmartius/vue3-clipboard": { + "version": "0.1.2", + "resolved": "https://registry.npmmirror.com/@soerenmartius/vue3-clipboard/-/vue3-clipboard-0.1.2.tgz", + "integrity": "sha512-a5er6cFGcFIQ/3qg6kWvU0yFqIz9iWoQGEVs9azjevyRyMAKvj1w3JuLH9y6+u0WhMNby3kn7nuR8nktSnDesg==", + "dependencies": { + "clipboard": "^2.0.0" + } + }, + "node_modules/@sphinxxxx/color-conversion": { + "version": "2.2.2", + "resolved": "https://registry.npmmirror.com/@sphinxxxx/color-conversion/-/color-conversion-2.2.2.tgz", + "integrity": "sha512-XExJS3cLqgrmNBIP3bBw6+1oQ1ksGjFh0+oClDKFYpCCqx/hlqwWO5KO/S63fzUo67SxI9dMrF0y5T/Ey7h8Zw==" + }, + "node_modules/@transloadit/prettier-bytes": { + "version": "0.0.7", + "resolved": "https://registry.npmmirror.com/@transloadit/prettier-bytes/-/prettier-bytes-0.0.7.tgz", + "integrity": "sha512-VeJbUb0wEKbcwaSlj5n+LscBl9IPgLPkHVGBkh00cztv6X4L/TJXK58LzFuBKX7/GAfiGhIwH67YTLTlzvIzBA==" + }, + "node_modules/@types/eslint": { + "version": "8.44.5", + "resolved": "https://registry.npmmirror.com/@types/eslint/-/eslint-8.44.5.tgz", + "integrity": "sha512-Ol2eio8LtD/tGM4Ga7Jb83NuFwEv3NqvssSlifXL9xuFpSyQZw0ecmm2Kux6iU0KxQmp95hlPmGCzGJ0TCFeRA==", + "dev": true, + "peer": true, + "dependencies": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "node_modules/@types/eslint-scope": { + "version": "3.7.6", + "resolved": "https://registry.npmmirror.com/@types/eslint-scope/-/eslint-scope-3.7.6.tgz", + "integrity": "sha512-zfM4ipmxVKWdxtDaJ3MP3pBurDXOCoyjvlpE3u6Qzrmw4BPbfm4/ambIeTk/r/J0iq/+2/xp0Fmt+gFvXJY2PQ==", + "dev": true, + "peer": true, + "dependencies": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/@types/estree/-/estree-1.0.3.tgz", + "integrity": "sha512-CS2rOaoQ/eAgAfcTfq6amKG7bsN+EMcgGY4FAFQdvSj2y1ixvOZTUA9mOtCai7E1SYu283XNw7urKK30nP3wkQ==", + "dev": true, + "peer": true + }, + "node_modules/@types/event-emitter": { + "version": "0.3.3", + "resolved": "https://registry.npmmirror.com/@types/event-emitter/-/event-emitter-0.3.3.tgz", + "integrity": "sha512-UfnOK1pIxO7P+EgPRZXD9jMpimd8QEFcEZ5R67R1UhGbv4zghU5+NE7U8M8G9H5Jc8FI51rqDWQs6FtUfq2e/Q==" + }, + "node_modules/@types/json-schema": { + "version": "7.0.14", + "resolved": "https://registry.npmmirror.com/@types/json-schema/-/json-schema-7.0.14.tgz", + "integrity": "sha512-U3PUjAudAdJBeC2pgN8uTIKgxrb4nlDF3SF0++EldXQvQBGkpFZMSnwQiIoDU77tv45VgNkl/L4ouD+rEomujw==", + "dev": true + }, + "node_modules/@types/lodash": { + "version": "4.17.0", + "resolved": "https://registry.npmmirror.com/@types/lodash/-/lodash-4.17.0.tgz", + "integrity": "sha512-t7dhREVv6dbNj0q17X12j7yDG4bD/DHYX7o5/DbDxobP0HnGPgpRz2Ej77aL7TZT3DSw13fqUTj8J4mMnqa7WA==" + }, + "node_modules/@types/lodash-es": { + "version": "4.17.10", + "resolved": "https://registry.npmmirror.com/@types/lodash-es/-/lodash-es-4.17.10.tgz", + "integrity": "sha512-YJP+w/2khSBwbUSFdGsSqmDvmnN3cCKoPOL7Zjle6s30ZtemkkqhjVfFqGwPN7ASil5VyjE2GtyU/yqYY6mC0A==", + "dependencies": { + "@types/lodash": "*" + } + }, + "node_modules/@types/node": { + "version": "18.11.13", + "resolved": "https://registry.npmmirror.com/@types/node/-/node-18.11.13.tgz", + "integrity": "sha512-IASpMGVcWpUsx5xBOrxMj7Bl8lqfuTY7FKAnPmu5cHkfQVWF8GulWS1jbRqA934qZL35xh5xN/+Xe/i26Bod4w==" + }, + "node_modules/@types/nprogress": { + "version": "0.2.0", + "resolved": "https://registry.npmmirror.com/@types/nprogress/-/nprogress-0.2.0.tgz", + "integrity": "sha512-1cYJrqq9GezNFPsWTZpFut/d4CjpZqA0vhqDUPFWYKF1oIyBz5qnoYMzR+0C/T96t3ebLAC1SSnwrVOm5/j74A==", + "dev": true + }, + "node_modules/@types/semver": { + "version": "7.5.3", + "resolved": "https://registry.npmmirror.com/@types/semver/-/semver-7.5.3.tgz", + "integrity": "sha512-OxepLK9EuNEIPxWNME+C6WwbRAOOI2o2BaQEGzz5Lu2e4Z5eDnEo+/aVEDMIXywoJitJ7xWd641wrGLZdtwRyw==", + "dev": true + }, + "node_modules/@types/sortablejs": { + "version": "1.15.0", + "resolved": "https://registry.npmmirror.com/@types/sortablejs/-/sortablejs-1.15.0.tgz", + "integrity": "sha512-qrhtM7M41EhH4tZQTNw2/RJkxllBx3reiJpTbgWCM2Dx0U1sZ6LwKp9lfNln9uqE26ZMKUaPEYaD4rzvOWYtZw==", + "dev": true + }, + "node_modules/@types/web-bluetooth": { + "version": "0.0.16", + "resolved": "https://registry.npmmirror.com/@types/web-bluetooth/-/web-bluetooth-0.0.16.tgz", + "integrity": "sha512-oh8q2Zc32S6gd/j50GowEjKLoOVOwHP/bWVjKJInBwQqdOYMdPrf1oVlelTlyfFK3CKxL1uahMDAr+vy8T7yMQ==" + }, + "node_modules/@types/ws": { + "version": "8.5.7", + "resolved": "https://registry.npmmirror.com/@types/ws/-/ws-8.5.7.tgz", + "integrity": "sha512-6UrLjiDUvn40CMrAubXuIVtj2PEfKDffJS7ychvnPU44j+KVeXmdHHTgqcM/dxLUTHxlXHiFM8Skmb8ozGdTnQ==", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "5.46.0", + "resolved": "https://registry.npmmirror.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.46.0.tgz", + "integrity": "sha512-QrZqaIOzJAjv0sfjY4EjbXUi3ZOFpKfzntx22gPGr9pmFcTjcFw/1sS1LJhEubfAGwuLjNrPV0rH+D1/XZFy7Q==", + "dev": true, + "dependencies": { + "@typescript-eslint/scope-manager": "5.46.0", + "@typescript-eslint/type-utils": "5.46.0", + "@typescript-eslint/utils": "5.46.0", + "debug": "^4.3.4", + "ignore": "^5.2.0", + "natural-compare-lite": "^1.4.0", + "regexpp": "^3.2.0", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^5.0.0", + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "5.46.0", + "resolved": "https://registry.npmmirror.com/@typescript-eslint/parser/-/parser-5.46.0.tgz", + "integrity": "sha512-joNO6zMGUZg+C73vwrKXCd8usnsmOYmgW/w5ZW0pG0RGvqeznjtGDk61EqqTpNrFLUYBW2RSBFrxdAZMqA4OZA==", + "dev": true, + "dependencies": { + "@typescript-eslint/scope-manager": "5.46.0", + "@typescript-eslint/types": "5.46.0", + "@typescript-eslint/typescript-estree": "5.46.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "5.46.0", + "resolved": "https://registry.npmmirror.com/@typescript-eslint/scope-manager/-/scope-manager-5.46.0.tgz", + "integrity": "sha512-7wWBq9d/GbPiIM6SqPK9tfynNxVbfpihoY5cSFMer19OYUA3l4powA2uv0AV2eAZV6KoAh6lkzxv4PoxOLh1oA==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.46.0", + "@typescript-eslint/visitor-keys": "5.46.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "5.46.0", + "resolved": "https://registry.npmmirror.com/@typescript-eslint/type-utils/-/type-utils-5.46.0.tgz", + "integrity": "sha512-dwv4nimVIAsVS2dTA0MekkWaRnoYNXY26dKz8AN5W3cBFYwYGFQEqm/cG+TOoooKlncJS4RTbFKgcFY/pOiBCg==", + "dev": true, + "dependencies": { + "@typescript-eslint/typescript-estree": "5.46.0", + "@typescript-eslint/utils": "5.46.0", + "debug": "^4.3.4", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/types": { + "version": "5.46.0", + "resolved": "https://registry.npmmirror.com/@typescript-eslint/types/-/types-5.46.0.tgz", + "integrity": "sha512-wHWgQHFB+qh6bu0IAPAJCdeCdI0wwzZnnWThlmHNY01XJ9Z97oKqKOzWYpR2I83QmshhQJl6LDM9TqMiMwJBTw==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "5.46.0", + "resolved": "https://registry.npmmirror.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.46.0.tgz", + "integrity": "sha512-kDLNn/tQP+Yp8Ro2dUpyyVV0Ksn2rmpPpB0/3MO874RNmXtypMwSeazjEN/Q6CTp8D7ExXAAekPEcCEB/vtJkw==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.46.0", + "@typescript-eslint/visitor-keys": "5.46.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "semver": "^7.3.7", + "tsutils": "^3.21.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "5.46.0", + "resolved": "https://registry.npmmirror.com/@typescript-eslint/utils/-/utils-5.46.0.tgz", + "integrity": "sha512-4O+Ps1CRDw+D+R40JYh5GlKLQERXRKW5yIQoNDpmXPJ+C7kaPF9R7GWl+PxGgXjB3PQCqsaaZUpZ9dG4U6DO7g==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.9", + "@types/semver": "^7.3.12", + "@typescript-eslint/scope-manager": "5.46.0", + "@typescript-eslint/types": "5.46.0", + "@typescript-eslint/typescript-estree": "5.46.0", + "eslint-scope": "^5.1.1", + "eslint-utils": "^3.0.0", + "semver": "^7.3.7" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "5.46.0", + "resolved": "https://registry.npmmirror.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.46.0.tgz", + "integrity": "sha512-E13gBoIXmaNhwjipuvQg1ByqSAu/GbEpP/qzFihugJ+MomtoJtFAJG/+2DRPByf57B863m0/q7Zt16V9ohhANw==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "5.46.0", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@ungap/structured-clone": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", + "dev": true + }, + "node_modules/@uppy/companion-client": { + "version": "2.2.2", + "resolved": "https://registry.npmmirror.com/@uppy/companion-client/-/companion-client-2.2.2.tgz", + "integrity": "sha512-5mTp2iq97/mYSisMaBtFRry6PTgZA6SIL7LePteOV5x0/DxKfrZW3DEiQERJmYpHzy7k8johpm2gHnEKto56Og==", + "dependencies": { + "@uppy/utils": "^4.1.2", + "namespace-emitter": "^2.0.1" + } + }, + "node_modules/@uppy/core": { + "version": "2.3.4", + "resolved": "https://registry.npmmirror.com/@uppy/core/-/core-2.3.4.tgz", + "integrity": "sha512-iWAqppC8FD8mMVqewavCz+TNaet6HPXitmGXpGGREGrakZ4FeuWytVdrelydzTdXx6vVKkOmI2FLztGg73sENQ==", + "dependencies": { + "@transloadit/prettier-bytes": "0.0.7", + "@uppy/store-default": "^2.1.1", + "@uppy/utils": "^4.1.3", + "lodash.throttle": "^4.1.1", + "mime-match": "^1.0.2", + "namespace-emitter": "^2.0.1", + "nanoid": "^3.1.25", + "preact": "^10.5.13" + } + }, + "node_modules/@uppy/store-default": { + "version": "2.1.1", + "resolved": "https://registry.npmmirror.com/@uppy/store-default/-/store-default-2.1.1.tgz", + "integrity": "sha512-xnpTxvot2SeAwGwbvmJ899ASk5tYXhmZzD/aCFsXePh/v8rNvR2pKlcQUH7cF/y4baUGq3FHO/daKCok/mpKqQ==" + }, + "node_modules/@uppy/utils": { + "version": "4.1.3", + "resolved": "https://registry.npmmirror.com/@uppy/utils/-/utils-4.1.3.tgz", + "integrity": "sha512-nTuMvwWYobnJcytDO3t+D6IkVq/Qs4Xv3vyoEZ+Iaf8gegZP+rEyoaFT2CK5XLRMienPyqRqNbIfRuFaOWSIFw==", + "dependencies": { + "lodash.throttle": "^4.1.1" + } + }, + "node_modules/@uppy/xhr-upload": { + "version": "2.1.3", + "resolved": "https://registry.npmmirror.com/@uppy/xhr-upload/-/xhr-upload-2.1.3.tgz", + "integrity": "sha512-YWOQ6myBVPs+mhNjfdWsQyMRWUlrDLMoaG7nvf/G6Y3GKZf8AyjFDjvvJ49XWQ+DaZOftGkHmF1uh/DBeGivJQ==", + "dependencies": { + "@uppy/companion-client": "^2.2.2", + "@uppy/utils": "^4.1.2", + "nanoid": "^3.1.25" + }, + "peerDependencies": { + "@uppy/core": "^2.3.3" + } + }, + "node_modules/@vitejs/plugin-vue": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/@vitejs/plugin-vue/-/plugin-vue-4.0.0.tgz", + "integrity": "sha512-e0X4jErIxAB5oLtDqbHvHpJe/uWNkdpYV83AOG2xo2tEVSzCzewgJMtREZM30wXnM5ls90hxiOtAuVU6H5JgbA==", + "dev": true, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "vite": "^4.0.0", + "vue": "^3.2.25" + } + }, + "node_modules/@vitejs/plugin-vue-jsx": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/@vitejs/plugin-vue-jsx/-/plugin-vue-jsx-3.0.0.tgz", + "integrity": "sha512-vurkuzgac5SYuxd2HUZqAFAWGTF10diKBwJNbCvnWijNZfXd+7jMtqjPFbGt7idOJUn584fP1Ar9j/GN2jQ3Ew==", + "dependencies": { + "@babel/core": "^7.20.5", + "@babel/plugin-transform-typescript": "^7.20.2", + "@vue/babel-plugin-jsx": "^1.1.1" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "peerDependencies": { + "vite": "^4.0.0", + "vue": "^3.0.0" + } + }, + "node_modules/@vue/babel-helper-vue-transform-on": { + "version": "1.1.5", + "resolved": "https://registry.npmmirror.com/@vue/babel-helper-vue-transform-on/-/babel-helper-vue-transform-on-1.1.5.tgz", + "integrity": "sha512-SgUymFpMoAyWeYWLAY+MkCK3QEROsiUnfaw5zxOVD/M64KQs8D/4oK6Q5omVA2hnvEOE0SCkH2TZxs/jnnUj7w==" + }, + "node_modules/@vue/babel-plugin-jsx": { + "version": "1.1.5", + "resolved": "https://registry.npmmirror.com/@vue/babel-plugin-jsx/-/babel-plugin-jsx-1.1.5.tgz", + "integrity": "sha512-nKs1/Bg9U1n3qSWnsHhCVQtAzI6aQXqua8j/bZrau8ywT1ilXQbK4FwEJGmU8fV7tcpuFvWmmN7TMmV1OBma1g==", + "dependencies": { + "@babel/helper-module-imports": "^7.22.5", + "@babel/plugin-syntax-jsx": "^7.22.5", + "@babel/template": "^7.22.5", + "@babel/traverse": "^7.22.5", + "@babel/types": "^7.22.5", + "@vue/babel-helper-vue-transform-on": "^1.1.5", + "camelcase": "^6.3.0", + "html-tags": "^3.3.1", + "svg-tags": "^1.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@vue/compiler-core": { + "version": "3.2.45", + "resolved": "https://registry.npmmirror.com/@vue/compiler-core/-/compiler-core-3.2.45.tgz", + "integrity": "sha512-rcMj7H+PYe5wBV3iYeUgbCglC+pbpN8hBLTJvRiK2eKQiWqu+fG9F+8sW99JdL4LQi7Re178UOxn09puSXvn4A==", + "dependencies": { + "@babel/parser": "^7.16.4", + "@vue/shared": "3.2.45", + "estree-walker": "^2.0.2", + "source-map": "^0.6.1" + } + }, + "node_modules/@vue/compiler-dom": { + "version": "3.2.45", + "resolved": "https://registry.npmmirror.com/@vue/compiler-dom/-/compiler-dom-3.2.45.tgz", + "integrity": "sha512-tyYeUEuKqqZO137WrZkpwfPCdiiIeXYCcJ8L4gWz9vqaxzIQRccTSwSWZ/Axx5YR2z+LvpUbmPNXxuBU45lyRw==", + "dependencies": { + "@vue/compiler-core": "3.2.45", + "@vue/shared": "3.2.45" + } + }, + "node_modules/@vue/compiler-sfc": { + "version": "3.2.45", + "resolved": "https://registry.npmmirror.com/@vue/compiler-sfc/-/compiler-sfc-3.2.45.tgz", + "integrity": "sha512-1jXDuWah1ggsnSAOGsec8cFjT/K6TMZ0sPL3o3d84Ft2AYZi2jWJgRMjw4iaK0rBfA89L5gw427H4n1RZQBu6Q==", + "dependencies": { + "@babel/parser": "^7.16.4", + "@vue/compiler-core": "3.2.45", + "@vue/compiler-dom": "3.2.45", + "@vue/compiler-ssr": "3.2.45", + "@vue/reactivity-transform": "3.2.45", + "@vue/shared": "3.2.45", + "estree-walker": "^2.0.2", + "magic-string": "^0.25.7", + "postcss": "^8.1.10", + "source-map": "^0.6.1" + } + }, + "node_modules/@vue/compiler-ssr": { + "version": "3.2.45", + "resolved": "https://registry.npmmirror.com/@vue/compiler-ssr/-/compiler-ssr-3.2.45.tgz", + "integrity": "sha512-6BRaggEGqhWht3lt24CrIbQSRD5O07MTmd+LjAn5fJj568+R9eUD2F7wMQJjX859seSlrYog7sUtrZSd7feqrQ==", + "dependencies": { + "@vue/compiler-dom": "3.2.45", + "@vue/shared": "3.2.45" + } + }, + "node_modules/@vue/devtools-api": { + "version": "6.5.1", + "resolved": "https://registry.npmmirror.com/@vue/devtools-api/-/devtools-api-6.5.1.tgz", + "integrity": "sha512-+KpckaAQyfbvshdDW5xQylLni1asvNSGme1JFs8I1+/H5pHEhqUKMEQD/qn3Nx5+/nycBq11qAEi8lk+LXI2dA==" + }, + "node_modules/@vue/reactivity": { + "version": "3.2.45", + "resolved": "https://registry.npmmirror.com/@vue/reactivity/-/reactivity-3.2.45.tgz", + "integrity": "sha512-PRvhCcQcyEVohW0P8iQ7HDcIOXRjZfAsOds3N99X/Dzewy8TVhTCT4uXpAHfoKjVTJRA0O0K+6QNkDIZAxNi3A==", + "dependencies": { + "@vue/shared": "3.2.45" + } + }, + "node_modules/@vue/reactivity-transform": { + "version": "3.2.45", + "resolved": "https://registry.npmmirror.com/@vue/reactivity-transform/-/reactivity-transform-3.2.45.tgz", + "integrity": "sha512-BHVmzYAvM7vcU5WmuYqXpwaBHjsS8T63jlKGWVtHxAHIoMIlmaMyurUSEs1Zcg46M4AYT5MtB1U274/2aNzjJQ==", + "dependencies": { + "@babel/parser": "^7.16.4", + "@vue/compiler-core": "3.2.45", + "@vue/shared": "3.2.45", + "estree-walker": "^2.0.2", + "magic-string": "^0.25.7" + } + }, + "node_modules/@vue/runtime-core": { + "version": "3.2.45", + "resolved": "https://registry.npmmirror.com/@vue/runtime-core/-/runtime-core-3.2.45.tgz", + "integrity": "sha512-gzJiTA3f74cgARptqzYswmoQx0fIA+gGYBfokYVhF8YSXjWTUA2SngRzZRku2HbGbjzB6LBYSbKGIaK8IW+s0A==", + "dependencies": { + "@vue/reactivity": "3.2.45", + "@vue/shared": "3.2.45" + } + }, + "node_modules/@vue/runtime-dom": { + "version": "3.2.45", + "resolved": "https://registry.npmmirror.com/@vue/runtime-dom/-/runtime-dom-3.2.45.tgz", + "integrity": "sha512-cy88YpfP5Ue2bDBbj75Cb4bIEZUMM/mAkDMfqDTpUYVgTf/kuQ2VQ8LebuZ8k6EudgH8pYhsGWHlY0lcxlvTwA==", + "dependencies": { + "@vue/runtime-core": "3.2.45", + "@vue/shared": "3.2.45", + "csstype": "^2.6.8" + } + }, + "node_modules/@vue/server-renderer": { + "version": "3.2.45", + "resolved": "https://registry.npmmirror.com/@vue/server-renderer/-/server-renderer-3.2.45.tgz", + "integrity": "sha512-ebiMq7q24WBU1D6uhPK//2OTR1iRIyxjF5iVq/1a5I1SDMDyDu4Ts6fJaMnjrvD3MqnaiFkKQj+LKAgz5WIK3g==", + "dependencies": { + "@vue/compiler-ssr": "3.2.45", + "@vue/shared": "3.2.45" + }, + "peerDependencies": { + "vue": "3.2.45" + } + }, + "node_modules/@vue/shared": { + "version": "3.2.45", + "resolved": "https://registry.npmmirror.com/@vue/shared/-/shared-3.2.45.tgz", + "integrity": "sha512-Ewzq5Yhimg7pSztDV+RH1UDKBzmtqieXQlpTVm2AwraoRL/Rks96mvd8Vgi7Lj+h+TH8dv7mXD3FRZR3TUvbSg==" + }, + "node_modules/@vueuse/core": { + "version": "9.13.0", + "resolved": "https://registry.npmmirror.com/@vueuse/core/-/core-9.13.0.tgz", + "integrity": "sha512-pujnclbeHWxxPRqXWmdkKV5OX4Wk4YeK7wusHqRwU0Q7EFusHoqNA/aPhB6KCh9hEqJkLAJo7bb0Lh9b+OIVzw==", + "dependencies": { + "@types/web-bluetooth": "^0.0.16", + "@vueuse/metadata": "9.13.0", + "@vueuse/shared": "9.13.0", + "vue-demi": "*" + } + }, + "node_modules/@vueuse/core/node_modules/vue-demi": { + "version": "0.14.6", + "resolved": "https://registry.npmmirror.com/vue-demi/-/vue-demi-0.14.6.tgz", + "integrity": "sha512-8QA7wrYSHKaYgUxDA5ZC24w+eHm3sYCbp0EzcDwKqN3p6HqtTCGR/GVsPyZW92unff4UlcSh++lmqDWN3ZIq4w==", + "hasInstallScript": true, + "bin": { + "vue-demi-fix": "bin/vue-demi-fix.js", + "vue-demi-switch": "bin/vue-demi-switch.js" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "@vue/composition-api": "^1.0.0-rc.1", + "vue": "^3.0.0-0 || ^2.6.0" + }, + "peerDependenciesMeta": { + "@vue/composition-api": { + "optional": true + } + } + }, + "node_modules/@vueuse/metadata": { + "version": "9.13.0", + "resolved": "https://registry.npmmirror.com/@vueuse/metadata/-/metadata-9.13.0.tgz", + "integrity": "sha512-gdU7TKNAUVlXXLbaF+ZCfte8BjRJQWPCa2J55+7/h+yDtzw3vOoGQDRXzI6pyKyo6bXFT5/QoPE4hAknExjRLQ==" + }, + "node_modules/@vueuse/shared": { + "version": "9.13.0", + "resolved": "https://registry.npmmirror.com/@vueuse/shared/-/shared-9.13.0.tgz", + "integrity": "sha512-UrnhU+Cnufu4S6JLCPZnkWh0WwZGUp72ktOF2DFptMlOs3TOdVv8xJN53zhHGARmVOsz5KqOls09+J1NR6sBKw==", + "dependencies": { + "vue-demi": "*" + } + }, + "node_modules/@vueuse/shared/node_modules/vue-demi": { + "version": "0.14.6", + "resolved": "https://registry.npmmirror.com/vue-demi/-/vue-demi-0.14.6.tgz", + "integrity": "sha512-8QA7wrYSHKaYgUxDA5ZC24w+eHm3sYCbp0EzcDwKqN3p6HqtTCGR/GVsPyZW92unff4UlcSh++lmqDWN3ZIq4w==", + "hasInstallScript": true, + "bin": { + "vue-demi-fix": "bin/vue-demi-fix.js", + "vue-demi-switch": "bin/vue-demi-switch.js" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "@vue/composition-api": "^1.0.0-rc.1", + "vue": "^3.0.0-0 || ^2.6.0" + }, + "peerDependenciesMeta": { + "@vue/composition-api": { + "optional": true + } + } + }, + "node_modules/@wangeditor/basic-modules": { + "version": "1.1.7", + "resolved": "https://registry.npmmirror.com/@wangeditor/basic-modules/-/basic-modules-1.1.7.tgz", + "integrity": "sha512-cY9CPkLJaqF05STqfpZKWG4LpxTMeGSIIF1fHvfm/mz+JXatCagjdkbxdikOuKYlxDdeqvOeBmsUBItufDLXZg==", + "dependencies": { + "is-url": "^1.2.4" + }, + "peerDependencies": { + "@wangeditor/core": "1.x", + "dom7": "^3.0.0", + "lodash.throttle": "^4.1.1", + "nanoid": "^3.2.0", + "slate": "^0.72.0", + "snabbdom": "^3.1.0" + } + }, + "node_modules/@wangeditor/code-highlight": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/@wangeditor/code-highlight/-/code-highlight-1.0.3.tgz", + "integrity": "sha512-iazHwO14XpCuIWJNTQTikqUhGKyqj+dUNWJ9288Oym9M2xMVHvnsOmDU2sgUDWVy+pOLojReMPgXCsvvNlOOhw==", + "dependencies": { + "prismjs": "^1.23.0" + }, + "peerDependencies": { + "@wangeditor/core": "1.x", + "dom7": "^3.0.0", + "slate": "^0.72.0", + "snabbdom": "^3.1.0" + } + }, + "node_modules/@wangeditor/core": { + "version": "1.1.19", + "resolved": "https://registry.npmmirror.com/@wangeditor/core/-/core-1.1.19.tgz", + "integrity": "sha512-KevkB47+7GhVszyYF2pKGKtCSj/YzmClsD03C3zTt+9SR2XWT5T0e3yQqg8baZpcMvkjs1D8Dv4fk8ok/UaS2Q==", + "dependencies": { + "@types/event-emitter": "^0.3.3", + "event-emitter": "^0.3.5", + "html-void-elements": "^2.0.0", + "i18next": "^20.4.0", + "scroll-into-view-if-needed": "^2.2.28", + "slate-history": "^0.66.0" + }, + "peerDependencies": { + "@uppy/core": "^2.1.1", + "@uppy/xhr-upload": "^2.0.3", + "dom7": "^3.0.0", + "is-hotkey": "^0.2.0", + "lodash.camelcase": "^4.3.0", + "lodash.clonedeep": "^4.5.0", + "lodash.debounce": "^4.0.8", + "lodash.foreach": "^4.5.0", + "lodash.isequal": "^4.5.0", + "lodash.throttle": "^4.1.1", + "lodash.toarray": "^4.4.0", + "nanoid": "^3.2.0", + "slate": "^0.72.0", + "snabbdom": "^3.1.0" + } + }, + "node_modules/@wangeditor/editor": { + "version": "5.1.23", + "resolved": "https://registry.npmmirror.com/@wangeditor/editor/-/editor-5.1.23.tgz", + "integrity": "sha512-0RxfeVTuK1tktUaPROnCoFfaHVJpRAIE2zdS0mpP+vq1axVQpLjM8+fCvKzqYIkH0Pg+C+44hJpe3VVroSkEuQ==", + "dependencies": { + "@uppy/core": "^2.1.1", + "@uppy/xhr-upload": "^2.0.3", + "@wangeditor/basic-modules": "^1.1.7", + "@wangeditor/code-highlight": "^1.0.3", + "@wangeditor/core": "^1.1.19", + "@wangeditor/list-module": "^1.0.5", + "@wangeditor/table-module": "^1.1.4", + "@wangeditor/upload-image-module": "^1.0.2", + "@wangeditor/video-module": "^1.1.4", + "dom7": "^3.0.0", + "is-hotkey": "^0.2.0", + "lodash.camelcase": "^4.3.0", + "lodash.clonedeep": "^4.5.0", + "lodash.debounce": "^4.0.8", + "lodash.foreach": "^4.5.0", + "lodash.isequal": "^4.5.0", + "lodash.throttle": "^4.1.1", + "lodash.toarray": "^4.4.0", + "nanoid": "^3.2.0", + "slate": "^0.72.0", + "snabbdom": "^3.1.0" + } + }, + "node_modules/@wangeditor/editor-for-vue": { + "version": "5.1.12", + "resolved": "https://registry.npmmirror.com/@wangeditor/editor-for-vue/-/editor-for-vue-5.1.12.tgz", + "integrity": "sha512-0Ds3D8I+xnpNWezAeO7HmPRgTfUxHLMd9JKcIw+QzvSmhC5xUHbpCcLU+KLmeBKTR/zffnS5GQo6qi3GhTMJWQ==", + "peerDependencies": { + "@wangeditor/editor": ">=5.1.0", + "vue": "^3.0.5" + } + }, + "node_modules/@wangeditor/list-module": { + "version": "1.0.5", + "resolved": "https://registry.npmmirror.com/@wangeditor/list-module/-/list-module-1.0.5.tgz", + "integrity": "sha512-uDuYTP6DVhcYf7mF1pTlmNn5jOb4QtcVhYwSSAkyg09zqxI1qBqsfUnveeDeDqIuptSJhkh81cyxi+MF8sEPOQ==", + "peerDependencies": { + "@wangeditor/core": "1.x", + "dom7": "^3.0.0", + "slate": "^0.72.0", + "snabbdom": "^3.1.0" + } + }, + "node_modules/@wangeditor/table-module": { + "version": "1.1.4", + "resolved": "https://registry.npmmirror.com/@wangeditor/table-module/-/table-module-1.1.4.tgz", + "integrity": "sha512-5saanU9xuEocxaemGdNi9t8MCDSucnykEC6jtuiT72kt+/Hhh4nERYx1J20OPsTCCdVr7hIyQenFD1iSRkIQ6w==", + "peerDependencies": { + "@wangeditor/core": "1.x", + "dom7": "^3.0.0", + "lodash.isequal": "^4.5.0", + "lodash.throttle": "^4.1.1", + "nanoid": "^3.2.0", + "slate": "^0.72.0", + "snabbdom": "^3.1.0" + } + }, + "node_modules/@wangeditor/upload-image-module": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/@wangeditor/upload-image-module/-/upload-image-module-1.0.2.tgz", + "integrity": "sha512-z81lk/v71OwPDYeQDxj6cVr81aDP90aFuywb8nPD6eQeECtOymrqRODjpO6VGvCVxVck8nUxBHtbxKtjgcwyiA==", + "peerDependencies": { + "@uppy/core": "^2.0.3", + "@uppy/xhr-upload": "^2.0.3", + "@wangeditor/basic-modules": "1.x", + "@wangeditor/core": "1.x", + "dom7": "^3.0.0", + "lodash.foreach": "^4.5.0", + "slate": "^0.72.0", + "snabbdom": "^3.1.0" + } + }, + "node_modules/@wangeditor/video-module": { + "version": "1.1.4", + "resolved": "https://registry.npmmirror.com/@wangeditor/video-module/-/video-module-1.1.4.tgz", + "integrity": "sha512-ZdodDPqKQrgx3IwWu4ZiQmXI8EXZ3hm2/fM6E3t5dB8tCaIGWQZhmqd6P5knfkRAd3z2+YRSRbxOGfoRSp/rLg==", + "peerDependencies": { + "@uppy/core": "^2.1.4", + "@uppy/xhr-upload": "^2.0.7", + "@wangeditor/core": "1.x", + "dom7": "^3.0.0", + "nanoid": "^3.2.0", + "slate": "^0.72.0", + "snabbdom": "^3.1.0" + } + }, + "node_modules/@webassemblyjs/ast": { + "version": "1.11.6", + "resolved": "https://registry.npmmirror.com/@webassemblyjs/ast/-/ast-1.11.6.tgz", + "integrity": "sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==", + "dev": true, + "peer": true, + "dependencies": { + "@webassemblyjs/helper-numbers": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6" + } + }, + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.11.6", + "resolved": "https://registry.npmmirror.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", + "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==", + "dev": true, + "peer": true + }, + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.11.6", + "resolved": "https://registry.npmmirror.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", + "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==", + "dev": true, + "peer": true + }, + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.11.6", + "resolved": "https://registry.npmmirror.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz", + "integrity": "sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==", + "dev": true, + "peer": true + }, + "node_modules/@webassemblyjs/helper-numbers": { + "version": "1.11.6", + "resolved": "https://registry.npmmirror.com/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", + "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", + "dev": true, + "peer": true, + "dependencies": { + "@webassemblyjs/floating-point-hex-parser": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.11.6", + "resolved": "https://registry.npmmirror.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", + "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", + "dev": true, + "peer": true + }, + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.11.6", + "resolved": "https://registry.npmmirror.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz", + "integrity": "sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==", + "dev": true, + "peer": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6" + } + }, + "node_modules/@webassemblyjs/ieee754": { + "version": "1.11.6", + "resolved": "https://registry.npmmirror.com/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", + "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", + "dev": true, + "peer": true, + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "node_modules/@webassemblyjs/leb128": { + "version": "1.11.6", + "resolved": "https://registry.npmmirror.com/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", + "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", + "dev": true, + "peer": true, + "dependencies": { + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/utf8": { + "version": "1.11.6", + "resolved": "https://registry.npmmirror.com/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", + "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==", + "dev": true, + "peer": true + }, + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.11.6", + "resolved": "https://registry.npmmirror.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz", + "integrity": "sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==", + "dev": true, + "peer": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/helper-wasm-section": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6", + "@webassemblyjs/wasm-opt": "1.11.6", + "@webassemblyjs/wasm-parser": "1.11.6", + "@webassemblyjs/wast-printer": "1.11.6" + } + }, + "node_modules/@webassemblyjs/wasm-gen": { + "version": "1.11.6", + "resolved": "https://registry.npmmirror.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz", + "integrity": "sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==", + "dev": true, + "peer": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" + } + }, + "node_modules/@webassemblyjs/wasm-opt": { + "version": "1.11.6", + "resolved": "https://registry.npmmirror.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz", + "integrity": "sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==", + "dev": true, + "peer": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6", + "@webassemblyjs/wasm-parser": "1.11.6" + } + }, + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.11.6", + "resolved": "https://registry.npmmirror.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz", + "integrity": "sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==", + "dev": true, + "peer": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" + } + }, + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.11.6", + "resolved": "https://registry.npmmirror.com/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz", + "integrity": "sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==", + "dev": true, + "peer": true, + "dependencies": { + "@webassemblyjs/ast": "1.11.6", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@xmldom/xmldom": { + "version": "0.8.10", + "resolved": "https://registry.npmmirror.com/@xmldom/xmldom/-/xmldom-0.8.10.tgz", + "integrity": "sha512-2WALfTl4xo2SkGCYRt6rDTFfk9R1czmBvUQy12gK2KuRKIpWEhcbbzy8EZXtz/jkRqHX8bFEc6FC1HjX4TUWYw==", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/@xtuc/ieee754": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz", + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "dev": true, + "peer": true + }, + "node_modules/@xtuc/long": { + "version": "4.2.2", + "resolved": "https://registry.npmmirror.com/@xtuc/long/-/long-4.2.2.tgz", + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "dev": true, + "peer": true + }, + "node_modules/ace-builds": { + "version": "1.30.0", + "resolved": "https://registry.npmmirror.com/ace-builds/-/ace-builds-1.30.0.tgz", + "integrity": "sha512-ZC+G1ozrrVCVL/KPkeU9R7TEwYeNJUYRrjnEvNhF8r2+WR2tkcCjmduL8M6D3abIdf/16ccEXHtpoRBhAnTyCw==" + }, + "node_modules/acorn": { + "version": "8.10.0", + "resolved": "https://registry.npmmirror.com/acorn/-/acorn-8.10.0.tgz", + "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", + "devOptional": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-import-assertions": { + "version": "1.9.0", + "resolved": "https://registry.npmmirror.com/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", + "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", + "dev": true, + "peer": true, + "peerDependencies": { + "acorn": "^8" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmmirror.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/acorn-node": { + "version": "1.8.2", + "resolved": "https://registry.npmmirror.com/acorn-node/-/acorn-node-1.8.2.tgz", + "integrity": "sha512-8mt+fslDufLYntIoPAaIMUe/lrbrehIiwmR3t2k9LljIzoigEPF27eLk2hy8zSGzmR/ogr7zbRKINMo1u0yh5A==", + "dependencies": { + "acorn": "^7.0.0", + "acorn-walk": "^7.0.0", + "xtend": "^4.0.2" + } + }, + "node_modules/acorn-node/node_modules/acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmmirror.com/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-walk": { + "version": "7.2.0", + "resolved": "https://registry.npmmirror.com/acorn-walk/-/acorn-walk-7.2.0.tgz", + "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/address": { + "version": "1.2.2", + "resolved": "https://registry.npmmirror.com/address/-/address-1.2.2.tgz", + "integrity": "sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/adler-32": { + "version": "1.3.1", + "resolved": "https://registry.npmmirror.com/adler-32/-/adler-32-1.3.1.tgz", + "integrity": "sha512-ynZ4w/nUUv5rrsR8UUGoe1VC9hZj6V5hU9Qw1HlMDJGEJw5S7TfTErWTjMys6M7vr0YWcPqs3qAr4ss0nDfP+A==", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/agentkeepalive": { + "version": "3.5.2", + "resolved": "https://registry.npmmirror.com/agentkeepalive/-/agentkeepalive-3.5.2.tgz", + "integrity": "sha512-e0L/HNe6qkQ7H19kTlRRqUibEAwDK5AFk6y3PtMsuut2VAH6+Q4xZml1tNDJD7kSAyqmbG/K08K5WEJYtUrSlQ==", + "dependencies": { + "humanize-ms": "^1.2.1" + }, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmmirror.com/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "node_modules/ajv-keywords": { + "version": "3.5.2", + "resolved": "https://registry.npmmirror.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true, + "peer": true, + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/ali-oss": { + "version": "6.18.1", + "resolved": "https://registry.npmmirror.com/ali-oss/-/ali-oss-6.18.1.tgz", + "integrity": "sha512-VsptD0jX3JNc3AjiLs5a9oTP0ArfT9IYhBuY6G/SpuY6LMuiwfqywrAosY65BlHKODAdYy8VWL6kmt0mO7BUGA==", + "dependencies": { + "address": "^1.2.2", + "agentkeepalive": "^3.4.1", + "bowser": "^1.6.0", + "copy-to": "^2.0.1", + "dateformat": "^2.0.0", + "debug": "^4.3.4", + "destroy": "^1.0.4", + "end-or-error": "^1.0.1", + "get-ready": "^1.0.0", + "humanize-ms": "^1.2.0", + "is-type-of": "^1.4.0", + "js-base64": "^2.5.2", + "jstoxml": "^2.0.0", + "merge-descriptors": "^1.0.1", + "mime": "^2.4.5", + "platform": "^1.3.1", + "pump": "^3.0.0", + "sdk-base": "^2.0.1", + "stream-http": "2.8.2", + "stream-wormhole": "^1.0.4", + "urllib": "2.41.0", + "utility": "^1.18.0", + "xml2js": "^0.6.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ali-oss/node_modules/bowser": { + "version": "1.9.4", + "resolved": "https://registry.npmmirror.com/bowser/-/bowser-1.9.4.tgz", + "integrity": "sha512-9IdMmj2KjigRq6oWhmwv1W36pDuA4STQZ8q6YO9um+x07xgYNCD3Oou+WP/3L1HNz7iqythGet3/p4wvc8AAwQ==" + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmmirror.com/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==" + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmmirror.com/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/arg": { + "version": "5.0.2", + "resolved": "https://registry.npmmirror.com/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==" + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/async-validator": { + "version": "4.2.5", + "resolved": "https://registry.npmmirror.com/async-validator/-/async-validator-4.2.5.tgz", + "integrity": "sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg==" + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmmirror.com/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "node_modules/autoprefixer": { + "version": "10.4.14", + "resolved": "https://registry.npmmirror.com/autoprefixer/-/autoprefixer-10.4.14.tgz", + "integrity": "sha512-FQzyfOsTlwVzjHxKEqRIAdJx9niO6VCBCoEwax/VLSoQF29ggECcPuBqUMZ+u8jCZOPSy8b8/8KnuFbp0SaFZQ==", + "dependencies": { + "browserslist": "^4.21.5", + "caniuse-lite": "^1.0.30001464", + "fraction.js": "^4.2.0", + "normalize-range": "^0.1.2", + "picocolors": "^1.0.0", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/aws-crt": { + "version": "1.18.1", + "resolved": "https://registry.npmmirror.com/aws-crt/-/aws-crt-1.18.1.tgz", + "integrity": "sha512-VUUmO4wi5EUb86kNNvu7GLHvCRwQzD5uV/pYuLuQvIhdN75/IjI5ManejKZjhxmFKkuJAfk5BmxR4oFIFlKDxg==", + "hasInstallScript": true, + "dependencies": { + "@aws-sdk/util-utf8-browser": "^3.109.0", + "@httptoolkit/websocket-stream": "^6.0.0", + "axios": "^0.24.0", + "buffer": "^6.0.3", + "crypto-js": "^4.0.0", + "mqtt": "^4.3.7", + "process": "^0.11.10" + } + }, + "node_modules/aws-crt/node_modules/axios": { + "version": "0.24.0", + "resolved": "https://registry.npmmirror.com/axios/-/axios-0.24.0.tgz", + "integrity": "sha512-Q6cWsys88HoPgAaFAVUb0WpPk0O8iTeisR9IMqy9G8AbO4NlpVknrnQS03zzF9PGAWgO3cgletO3VjV/P7VztA==", + "dependencies": { + "follow-redirects": "^1.14.4" + } + }, + "node_modules/axios": { + "version": "1.2.1", + "resolved": "https://registry.npmmirror.com/axios/-/axios-1.2.1.tgz", + "integrity": "sha512-I88cFiGu9ryt/tfVEi4kX2SITsvDddTajXTOFmt2uK1ZVA8LytjtdeyefdQWEf5PU8w+4SSJDoYnggflB5tW4A==", + "dependencies": { + "follow-redirects": "^1.15.0", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmmirror.com/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" + }, + "node_modules/batch-processor": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/batch-processor/-/batch-processor-1.0.0.tgz", + "integrity": "sha512-xoLQD8gmmR32MeuBHgH0Tzd5PuSZx71ZsbhVxOCRbgktZEPe4SQy7s9Z50uPp0F/f7iw2XmkHN2xkgbMfckMDA==" + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmmirror.com/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmmirror.com/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/bl/node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmmirror.com/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/bl/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmmirror.com/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "dev": true + }, + "node_modules/bowser": { + "version": "2.11.0", + "resolved": "https://registry.npmmirror.com/bowser/-/bowser-2.11.0.tgz", + "integrity": "sha512-AlcaJBi/pqqJBIQ8U9Mcpc9i8Aqxn88Skv5d+xBX006BY5u8N3mGLHa5Lgppa7L/HfwgwLgZ6NYs+Ag6uUmJRA==" + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmmirror.com/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.22.1", + "resolved": "https://registry.npmmirror.com/browserslist/-/browserslist-4.22.1.tgz", + "integrity": "sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ==", + "dependencies": { + "caniuse-lite": "^1.0.30001541", + "electron-to-chromium": "^1.4.535", + "node-releases": "^2.0.13", + "update-browserslist-db": "^1.0.13" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/buffer": { + "version": "6.0.3", + "resolved": "https://registry.npmmirror.com/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.2.1" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/buffer-from/-/buffer-from-1.1.2.tgz", + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + }, + "node_modules/builtin-status-codes": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", + "integrity": "sha512-HpGFw18DgFWlncDfjTa2rcQ4W88O1mC8e8yZ2AvQY5KDaktSTwo+KRf6nHK6FRI5FyRyb/5T6+TSxfP7QyGsmQ==" + }, + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmmirror.com/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "engines": { + "node": ">=10" + } + }, + "node_modules/camelcase-css": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/camelcase-css/-/camelcase-css-2.0.1.tgz", + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001550", + "resolved": "https://registry.npmmirror.com/caniuse-lite/-/caniuse-lite-1.0.30001550.tgz", + "integrity": "sha512-p82WjBYIypO0ukTsd/FG3Xxs+4tFeaY9pfT4amQL8KWtYH7H9nYwReGAbMTJ0hsmRO8IfDtsS6p3ZWj8+1c2RQ==" + }, + "node_modules/cfb": { + "version": "1.2.2", + "resolved": "https://registry.npmmirror.com/cfb/-/cfb-1.2.2.tgz", + "integrity": "sha512-KfdUZsSOw19/ObEWasvBP/Ac4reZvAGauZhs6S/gqNhXhI7cKwvlH7ulj+dOEYnca4bm4SGo8C1bTAQvnTjgQA==", + "dependencies": { + "adler-32": "~1.3.0", + "crc-32": "~1.2.0" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmmirror.com/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmmirror.com/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chokidar/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmmirror.com/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/chrome-trace-event": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", + "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", + "dev": true, + "peer": true, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/claygl": { + "version": "1.3.0", + "resolved": "https://registry.npmmirror.com/claygl/-/claygl-1.3.0.tgz", + "integrity": "sha512-+gGtJjT6SSHD2l2yC3MCubW/sCV40tZuSs5opdtn79vFSGUgp/lH139RNEQ6Jy078/L0aV8odCw8RSrUcMfLaQ==" + }, + "node_modules/clipboard": { + "version": "2.0.11", + "resolved": "https://registry.npmmirror.com/clipboard/-/clipboard-2.0.11.tgz", + "integrity": "sha512-C+0bbOqkezLIsmWSvlsXS0Q0bmkugu7jcfMIACB+RDEntIzQIkdr148we28AfSloQLRdZlYL/QYyrq05j/3Faw==", + "dependencies": { + "good-listener": "^1.2.2", + "select": "^1.1.2", + "tiny-emitter": "^2.0.0" + } + }, + "node_modules/clone": { + "version": "2.1.2", + "resolved": "https://registry.npmmirror.com/clone/-/clone-2.1.2.tgz", + "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/codepage": { + "version": "1.15.0", + "resolved": "https://registry.npmmirror.com/codepage/-/codepage-1.15.0.tgz", + "integrity": "sha512-3g6NUTPd/YtuuGrhMnOMRjFc+LJw/bnMp3+0r/Wcz3IXUuCosKRJvMphm5+Q+bvTVGcJJuRvVLuYba+WojaFaA==", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmmirror.com/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmmirror.com/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "devOptional": true, + "peer": true + }, + "node_modules/commist": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/commist/-/commist-1.1.0.tgz", + "integrity": "sha512-rraC8NXWOEjhADbZe9QBNzLAN5Q3fsTPQtBV+fEVj6xKIgDgNiEVE6ZNfHpZOqfQ21YUzfVNUXLOEZquYvQPPg==", + "dependencies": { + "leven": "^2.1.0", + "minimist": "^1.1.0" + } + }, + "node_modules/compute-scroll-into-view": { + "version": "1.0.20", + "resolved": "https://registry.npmmirror.com/compute-scroll-into-view/-/compute-scroll-into-view-1.0.20.tgz", + "integrity": "sha512-UCB0ioiyj8CRjtrvaceBLqqhZCVP+1B8+NWQhmdsm0VXOJtobBCf1dBQmebCCo34qZmUwZfIH2MZLqNHazrfjg==" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmmirror.com/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "node_modules/concat-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/concat-stream/-/concat-stream-2.0.0.tgz", + "integrity": "sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==", + "engines": [ + "node >= 6.0" + ], + "dependencies": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.0.2", + "typedarray": "^0.0.6" + } + }, + "node_modules/concat-stream/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmmirror.com/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "resolved": "https://registry.npmmirror.com/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==" + }, + "node_modules/copy-anything": { + "version": "2.0.6", + "resolved": "https://registry.npmmirror.com/copy-anything/-/copy-anything-2.0.6.tgz", + "integrity": "sha512-1j20GZTsvKNkc4BY3NpMOM8tt///wY3FpIzozTOFO2ffuZcV61nojHXVKIy3WM+7ADCy5FVhdZYHYDdgTU0yJw==", + "devOptional": true, + "dependencies": { + "is-what": "^3.14.1" + } + }, + "node_modules/copy-to": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/copy-to/-/copy-to-2.0.1.tgz", + "integrity": "sha512-3DdaFaU/Zf1AnpLiFDeNCD4TOWe3Zl2RZaTzUvWiIk5ERzcCodOE20Vqq4fzCbNoHURFHT4/us/Lfq+S2zyY4w==" + }, + "node_modules/core-js": { + "version": "2.6.12", + "resolved": "https://registry.npmmirror.com/core-js/-/core-js-2.6.12.tgz", + "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==", + "deprecated": "core-js@<3.23.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Some versions have web compatibility issues. Please, upgrade your dependencies to the actual version of core-js.", + "hasInstallScript": true + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + }, + "node_modules/cos-js-sdk-v5": { + "version": "1.4.21", + "resolved": "https://registry.npmmirror.com/cos-js-sdk-v5/-/cos-js-sdk-v5-1.4.21.tgz", + "integrity": "sha512-6cR53IZF2o17uaPr8XJSMa+Q73P9pgDFD5IYGcIfJn06JJaK6hGX43nv5DJ17uQYmwQBIqNeZOF97I7ClrsNdA==", + "dependencies": { + "@xmldom/xmldom": "^0.8.6" + } + }, + "node_modules/countup.js": { + "version": "2.3.2", + "resolved": "https://registry.npmmirror.com/countup.js/-/countup.js-2.3.2.tgz", + "integrity": "sha512-dQ7F/CmKGjaO6cDfhtEXwsKVlXIpJ89dFs8PvkaZH9jBVJ2Z8GU4iwG/qP7MgY8qwr+1skbwR6qecWWQLUzB8Q==" + }, + "node_modules/crc-32": { + "version": "1.2.2", + "resolved": "https://registry.npmmirror.com/crc-32/-/crc-32-1.2.2.tgz", + "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", + "bin": { + "crc32": "bin/crc32.njs" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/cropperjs": { + "version": "1.5.13", + "resolved": "https://registry.npmmirror.com/cropperjs/-/cropperjs-1.5.13.tgz", + "integrity": "sha512-by7jKAo73y5/Do0K6sxdTKHgndY0NMjG2bEdgeJxycbcmHuCiMXqw8sxy5C5Y5WTOTcDGmbT7Sr5CgKOXR06OA==" + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmmirror.com/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/crypto-js": { + "version": "4.1.1", + "resolved": "https://registry.npmmirror.com/crypto-js/-/crypto-js-4.1.1.tgz", + "integrity": "sha512-o2JlM7ydqd3Qk9CA0L4NL6mTzU2sdx96a+oOfPu8Mkl/PK51vSyoi8/rQ8NknZtk44vq15lmhAj9CIAGwgeWKw==" + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/csstype": { + "version": "2.6.21", + "resolved": "https://registry.npmmirror.com/csstype/-/csstype-2.6.21.tgz", + "integrity": "sha512-Z1PhmomIfypOpoMjRQB70jfvy/wxT50qW08YXO5lMIJkrdq4yOTR+AW7FqutScmB9NkLwxo+jU+kZLbofZZq/w==" + }, + "node_modules/d": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/d/-/d-1.0.1.tgz", + "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", + "dependencies": { + "es5-ext": "^0.10.50", + "type": "^1.0.1" + } + }, + "node_modules/dateformat": { + "version": "2.2.0", + "resolved": "https://registry.npmmirror.com/dateformat/-/dateformat-2.2.0.tgz", + "integrity": "sha512-GODcnWq3YGoTnygPfi02ygEiRxqUxpJwuRHjdhJYuxpcZmDq4rjBiXYmbCCzStxo176ixfLT6i4NPwQooRySnw==", + "engines": { + "node": "*" + } + }, + "node_modules/dayjs": { + "version": "1.11.10", + "resolved": "https://registry.npmmirror.com/dayjs/-/dayjs-1.11.10.tgz", + "integrity": "sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ==" + }, + "node_modules/debounce": { + "version": "1.2.1", + "resolved": "https://registry.npmmirror.com/debounce/-/debounce-1.2.1.tgz", + "integrity": "sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==" + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmmirror.com/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deep-equal": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/deep-equal/-/deep-equal-1.1.1.tgz", + "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==", + "dependencies": { + "is-arguments": "^1.0.4", + "is-date-object": "^1.0.1", + "is-regex": "^1.0.4", + "object-is": "^1.0.1", + "object-keys": "^1.1.1", + "regexp.prototype.flags": "^1.2.0" + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmmirror.com/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, + "node_modules/default-user-agent": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/default-user-agent/-/default-user-agent-1.0.0.tgz", + "integrity": "sha512-bDF7bg6OSNcSwFWPu4zYKpVkJZQYVrAANMYB8bc9Szem1D0yKdm4sa/rOCs2aC9+2GMqQ7KnwtZRvDhmLF0dXw==", + "dependencies": { + "os-name": "~1.0.3" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/define-data-property": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/define-data-property/-/define-data-property-1.1.1.tgz", + "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==", + "dependencies": { + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "resolved": "https://registry.npmmirror.com/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/defined": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/defined/-/defined-1.0.1.tgz", + "integrity": "sha512-hsBd2qSVCRE+5PmNdHt1uzyrFu5d3RwmFDKzyNZMFq/EwDNJF7Ee5+D5oEKF0hU6LhtoUF1macFvOe4AskQC1Q==" + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/delegate": { + "version": "3.2.0", + "resolved": "https://registry.npmmirror.com/delegate/-/delegate-3.2.0.tgz", + "integrity": "sha512-IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw==" + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/detective": { + "version": "5.2.1", + "resolved": "https://registry.npmmirror.com/detective/-/detective-5.2.1.tgz", + "integrity": "sha512-v9XE1zRnz1wRtgurGu0Bs8uHKFSTdteYZNbIPFVhUZ39L/S79ppMpdmVOZAnoz1jfEFodc48n6MX483Xo3t1yw==", + "dependencies": { + "acorn-node": "^1.8.2", + "defined": "^1.0.0", + "minimist": "^1.2.6" + }, + "bin": { + "detective": "bin/detective.js" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/didyoumean": { + "version": "1.2.2", + "resolved": "https://registry.npmmirror.com/didyoumean/-/didyoumean-1.2.2.tgz", + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==" + }, + "node_modules/digest-header": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/digest-header/-/digest-header-1.1.0.tgz", + "integrity": "sha512-glXVh42vz40yZb9Cq2oMOt70FIoWiv+vxNvdKdU8CwjLad25qHM3trLxhl9bVjdr6WaslIXhWpn0NO8T/67Qjg==", + "engines": { + "node": ">= 8.0.0" + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmmirror.com/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==" + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/dom7": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/dom7/-/dom7-3.0.0.tgz", + "integrity": "sha512-oNlcUdHsC4zb7Msx7JN3K0Nro1dzJ48knvBOnDPKJ2GV9wl1i5vydJZUSyOfrkKFDZEud/jBsTk92S/VGSAe/g==", + "dependencies": { + "ssr-window": "^3.0.0-alpha.1" + } + }, + "node_modules/duplexify": { + "version": "3.7.1", + "resolved": "https://registry.npmmirror.com/duplexify/-/duplexify-3.7.1.tgz", + "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", + "dependencies": { + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" + } + }, + "node_modules/e-icon-picker": { + "version": "2.1.1", + "resolved": "https://registry.npmmirror.com/e-icon-picker/-/e-icon-picker-2.1.1.tgz", + "integrity": "sha512-oj+gDuqDEQErbZctBX+DW8IcB0AYvHUJYo7/TcMPpiToITwOPcDRZYbVILb+M+j446YqG71Kkon4y1Y4BkGDww==", + "dependencies": { + "@popperjs/core": "^2.11.6", + "@vue/shared": "^3.2.45", + "@vueuse/core": "^9.9.0", + "debounce": "^1.2.1", + "vue": "^3.2.45" + }, + "peerDependencies": { + "vue": "^3.2.0" + } + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmmirror.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" + }, + "node_modules/echarts": { + "version": "5.4.1", + "resolved": "https://registry.npmmirror.com/echarts/-/echarts-5.4.1.tgz", + "integrity": "sha512-9ltS3M2JB0w2EhcYjCdmtrJ+6haZcW6acBolMGIuf01Hql1yrIV01L1aRj7jsaaIULJslEP9Z3vKlEmnJaWJVQ==", + "dependencies": { + "tslib": "2.3.0", + "zrender": "5.4.1" + } + }, + "node_modules/echarts-gl": { + "version": "2.0.9", + "resolved": "https://registry.npmmirror.com/echarts-gl/-/echarts-gl-2.0.9.tgz", + "integrity": "sha512-oKeMdkkkpJGWOzjgZUsF41DOh6cMsyrGGXimbjK2l6Xeq/dBQu4ShG2w2Dzrs/1bD27b2pLTGSaUzouY191gzA==", + "dependencies": { + "claygl": "^1.2.1", + "zrender": "^5.1.1" + }, + "peerDependencies": { + "echarts": "^5.1.2" + } + }, + "node_modules/echarts-wordcloud": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/echarts-wordcloud/-/echarts-wordcloud-2.1.0.tgz", + "integrity": "sha512-Kt1JmbcROgb+3IMI48KZECK2AP5lG6bSsOEs+AsuwaWJxQom31RTNd6NFYI01E/YaI1PFZeueaupjlmzSQasjQ==", + "peerDependencies": { + "echarts": "^5.0.1" + } + }, + "node_modules/echarts/node_modules/tslib": { + "version": "2.3.0", + "resolved": "https://registry.npmmirror.com/tslib/-/tslib-2.3.0.tgz", + "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==" + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" + }, + "node_modules/electron-to-chromium": { + "version": "1.4.557", + "resolved": "https://registry.npmmirror.com/electron-to-chromium/-/electron-to-chromium-1.4.557.tgz", + "integrity": "sha512-6x0zsxyMXpnMJnHrondrD3SuAeKcwij9S+83j2qHAQPXbGTDDfgImzzwgGlzrIcXbHQ42tkG4qA6U860cImNhw==" + }, + "node_modules/element-plus": { + "version": "2.6.1", + "resolved": "https://registry.npmmirror.com/element-plus/-/element-plus-2.6.1.tgz", + "integrity": "sha512-6VRpLjwtIVdtUuITJPPKtpOH1NM6nuAkRE3q5O4Lrx0N1bYMhTkiqb2Jy7zfQuDPbOIkkF2OABTzegpNnzgsnQ==", + "dependencies": { + "@ctrl/tinycolor": "^3.4.1", + "@element-plus/icons-vue": "^2.3.1", + "@floating-ui/dom": "^1.0.1", + "@popperjs/core": "npm:@sxzz/popperjs-es@^2.11.7", + "@types/lodash": "^4.14.182", + "@types/lodash-es": "^4.17.6", + "@vueuse/core": "^9.1.0", + "async-validator": "^4.2.5", + "dayjs": "^1.11.3", + "escape-html": "^1.0.3", + "lodash": "^4.17.21", + "lodash-es": "^4.17.21", + "lodash-unified": "^1.0.2", + "memoize-one": "^6.0.0", + "normalize-wheel-es": "^1.2.0" + }, + "peerDependencies": { + "vue": "^3.2.0" + } + }, + "node_modules/element-resize-detector": { + "version": "1.2.4", + "resolved": "https://registry.npmmirror.com/element-resize-detector/-/element-resize-detector-1.2.4.tgz", + "integrity": "sha512-Fl5Ftk6WwXE0wqCgNoseKWndjzZlDCwuPTcoVZfCP9R3EHQF8qUtr3YUPNETegRBOKqQKPW3n4kiIWngGi8tKg==", + "dependencies": { + "batch-processor": "1.0.0" + } + }, + "node_modules/element-tree-line": { + "version": "0.2.1", + "resolved": "https://registry.npmmirror.com/element-tree-line/-/element-tree-line-0.2.1.tgz", + "integrity": "sha512-YWHftDSOFiBuw49drxJV7Yi7pCqPpwBBBeQmySjchcxU3uUOAu72FDLK5RyTGJ5qt4Ci+yoUg7zJqsFP5u7N5A==", + "peerDependencies": { + "vue": "^2.6.11 || ^3.2.0" + } + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmmirror.com/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" + }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmmirror.com/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/end-or-error": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/end-or-error/-/end-or-error-1.0.1.tgz", + "integrity": "sha512-OclLMSug+k2A0JKuf494im25ANRBVW8qsjmwbgX7lQ8P82H21PQ1PWkoYwb9y5yMBS69BPlwtzdIFClo3+7kOQ==", + "engines": { + "node": ">= 0.11.14" + } + }, + "node_modules/enhanced-resolve": { + "version": "5.15.0", + "resolved": "https://registry.npmmirror.com/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz", + "integrity": "sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==", + "dev": true, + "peer": true, + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/errno": { + "version": "0.1.8", + "resolved": "https://registry.npmmirror.com/errno/-/errno-0.1.8.tgz", + "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", + "optional": true, + "dependencies": { + "prr": "~1.0.1" + }, + "bin": { + "errno": "cli.js" + } + }, + "node_modules/es-module-lexer": { + "version": "1.3.1", + "resolved": "https://registry.npmmirror.com/es-module-lexer/-/es-module-lexer-1.3.1.tgz", + "integrity": "sha512-JUFAyicQV9mXc3YRxPnDlrfBKpqt6hUYzz9/boprUJHs4e4KVr3XwOF70doO6gwXUor6EWZJAyWAfKki84t20Q==", + "dev": true, + "peer": true + }, + "node_modules/es5-ext": { + "version": "0.10.62", + "resolved": "https://registry.npmmirror.com/es5-ext/-/es5-ext-0.10.62.tgz", + "integrity": "sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA==", + "hasInstallScript": true, + "dependencies": { + "es6-iterator": "^2.0.3", + "es6-symbol": "^3.1.3", + "next-tick": "^1.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmmirror.com/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==", + "dependencies": { + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" + } + }, + "node_modules/es6-symbol": { + "version": "3.1.3", + "resolved": "https://registry.npmmirror.com/es6-symbol/-/es6-symbol-3.1.3.tgz", + "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", + "dependencies": { + "d": "^1.0.1", + "ext": "^1.1.2" + } + }, + "node_modules/esbuild": { + "version": "0.16.17", + "resolved": "https://registry.npmmirror.com/esbuild/-/esbuild-0.16.17.tgz", + "integrity": "sha512-G8LEkV0XzDMNwXKgM0Jwu3nY3lSTwSGY6XbxM9cr9+s0T/qSV1q1JVPBGzm3dcjhCic9+emZDmMffkwgPeOeLg==", + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.16.17", + "@esbuild/android-arm64": "0.16.17", + "@esbuild/android-x64": "0.16.17", + "@esbuild/darwin-arm64": "0.16.17", + "@esbuild/darwin-x64": "0.16.17", + "@esbuild/freebsd-arm64": "0.16.17", + "@esbuild/freebsd-x64": "0.16.17", + "@esbuild/linux-arm": "0.16.17", + "@esbuild/linux-arm64": "0.16.17", + "@esbuild/linux-ia32": "0.16.17", + "@esbuild/linux-loong64": "0.16.17", + "@esbuild/linux-mips64el": "0.16.17", + "@esbuild/linux-ppc64": "0.16.17", + "@esbuild/linux-riscv64": "0.16.17", + "@esbuild/linux-s390x": "0.16.17", + "@esbuild/linux-x64": "0.16.17", + "@esbuild/netbsd-x64": "0.16.17", + "@esbuild/openbsd-x64": "0.16.17", + "@esbuild/sunos-x64": "0.16.17", + "@esbuild/win32-arm64": "0.16.17", + "@esbuild/win32-ia32": "0.16.17", + "@esbuild/win32-x64": "0.16.17" + } + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmmirror.com/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/eslint": { + "version": "8.55.0", + "resolved": "https://registry.npmmirror.com/eslint/-/eslint-8.55.0.tgz", + "integrity": "sha512-iyUUAM0PCKj5QpwGfmCAG9XXbZCWsqP/eWAWrG/W0umvjuLRBECwSFdt+rCntju0xEH7teIABPwXpahftIaTdA==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.55.0", + "@humanwhocodes/config-array": "^0.11.13", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/eslint-plugin-vue": { + "version": "9.8.0", + "resolved": "https://registry.npmmirror.com/eslint-plugin-vue/-/eslint-plugin-vue-9.8.0.tgz", + "integrity": "sha512-E/AXwcTzunyzM83C2QqDHxepMzvI2y6x+mmeYHbVDQlKFqmKYvRrhaVixEeeG27uI44p9oKDFiyCRw4XxgtfHA==", + "dev": true, + "dependencies": { + "eslint-utils": "^3.0.0", + "natural-compare": "^1.4.0", + "nth-check": "^2.0.1", + "postcss-selector-parser": "^6.0.9", + "semver": "^7.3.5", + "vue-eslint-parser": "^9.0.1", + "xml-name-validator": "^4.0.0" + }, + "engines": { + "node": "^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.2.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/eslint-scope": { + "version": "5.1.1", + "resolved": "https://registry.npmmirror.com/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/eslint-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/eslint-utils/-/eslint-utils-3.0.0.tgz", + "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^2.0.0" + }, + "engines": { + "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" + }, + "peerDependencies": { + "eslint": ">=5" + } + }, + "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmmirror.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/eslint/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/eslint/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/eslint/node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint/node_modules/eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmmirror.com/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/eslint/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmmirror.com/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/eslint/node_modules/globals": { + "version": "13.23.0", + "resolved": "https://registry.npmmirror.com/globals/-/globals-13.23.0.tgz", + "integrity": "sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmmirror.com/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "dev": true, + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/esquery": { + "version": "1.5.0", + "resolved": "https://registry.npmmirror.com/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "dev": true, + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esquery/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmmirror.com/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmmirror.com/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmmirror.com/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmmirror.com/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==" + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmmirror.com/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/event-emitter": { + "version": "0.3.5", + "resolved": "https://registry.npmmirror.com/event-emitter/-/event-emitter-0.3.5.tgz", + "integrity": "sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==", + "dependencies": { + "d": "1", + "es5-ext": "~0.10.14" + } + }, + "node_modules/eventemitter3": { + "version": "2.0.3", + "resolved": "https://registry.npmmirror.com/eventemitter3/-/eventemitter3-2.0.3.tgz", + "integrity": "sha512-jLN68Dx5kyFHaePoXWPsCGW5qdyZQtLYHkxkg02/Mz6g0kYpDx4FyP6XfArhQdlOC4b8Mv+EMxPo/8La7Tzghg==" + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmmirror.com/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "dev": true, + "peer": true, + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/ext": { + "version": "1.7.0", + "resolved": "https://registry.npmmirror.com/ext/-/ext-1.7.0.tgz", + "integrity": "sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==", + "dependencies": { + "type": "^2.7.2" + } + }, + "node_modules/ext/node_modules/type": { + "version": "2.7.2", + "resolved": "https://registry.npmmirror.com/type/-/type-2.7.2.tgz", + "integrity": "sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==" + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmmirror.com/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, + "node_modules/extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmmirror.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + }, + "node_modules/fast-diff": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/fast-diff/-/fast-diff-1.1.2.tgz", + "integrity": "sha512-KaJUt+M9t1qaIteSvjc6P3RbMdXsNhK61GRftR6SNxqmhthcd9MGIi4T+o0jD8LUSpSnSKXE20nLtJ3fOHxQig==" + }, + "node_modules/fast-glob": { + "version": "3.3.1", + "resolved": "https://registry.npmmirror.com/fast-glob/-/fast-glob-3.3.1.tgz", + "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmmirror.com/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmmirror.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true + }, + "node_modules/fast-xml-parser": { + "version": "4.2.5", + "resolved": "https://registry.npmmirror.com/fast-xml-parser/-/fast-xml-parser-4.2.5.tgz", + "integrity": "sha512-B9/wizE4WngqQftFPmdaMYlXoJlJOYxGQOanC77fq9k8+Z0v5dDSVh+3glErdIROP//s/jgb7ZuxKfB8nVyo0g==", + "dependencies": { + "strnum": "^1.0.5" + }, + "bin": { + "fxparser": "src/cli/cli.js" + } + }, + "node_modules/fastq": { + "version": "1.15.0", + "resolved": "https://registry.npmmirror.com/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmmirror.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/file-saver": { + "version": "2.0.5", + "resolved": "https://registry.npmmirror.com/file-saver/-/file-saver-2.0.5.tgz", + "integrity": "sha512-P9bmyZ3h/PRG+Nzga+rbdI4OEpNDzAVyy74uVO9ATgzLK6VtAsYybF/+TOCvrc0MO793d6+42lLyZTw7/ArVzA==" + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmmirror.com/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmmirror.com/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/flat-cache": { + "version": "3.1.1", + "resolved": "https://registry.npmmirror.com/flat-cache/-/flat-cache-3.1.1.tgz", + "integrity": "sha512-/qM2b3LUIaIgviBQovTLvijfyOQXPtSRnRK26ksj2J7rzPIecePUIpJsZ4T02Qg+xiAEKIs5K8dsHEd+VaKa/Q==", + "dev": true, + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.2.9", + "resolved": "https://registry.npmmirror.com/flatted/-/flatted-3.2.9.tgz", + "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==", + "dev": true + }, + "node_modules/follow-redirects": { + "version": "1.15.3", + "resolved": "https://registry.npmmirror.com/follow-redirects/-/follow-redirects-1.15.3.tgz", + "integrity": "sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q==", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/font-awesome": { + "version": "4.7.0", + "resolved": "https://registry.npmmirror.com/font-awesome/-/font-awesome-4.7.0.tgz", + "integrity": "sha512-U6kGnykA/6bFmg1M/oT9EkFeIYv7JlX3bozwQJWiiLz6L0w3F5vBVPxHlwyX/vtNq1ckcpRKOB9f2Qal/VtFpg==", + "engines": { + "node": ">=0.10.3" + } + }, + "node_modules/foreground-child": { + "version": "3.1.1", + "resolved": "https://registry.npmmirror.com/foreground-child/-/foreground-child-3.1.1.tgz", + "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/formstream": { + "version": "1.3.1", + "resolved": "https://registry.npmmirror.com/formstream/-/formstream-1.3.1.tgz", + "integrity": "sha512-FkW++ub+VbE5dpwukJVDizNWhSgp8FhmhI65pF7BZSVStBqe6Wgxe2Z9/Vhsn7l7nXCPwP+G1cyYlX8VwWOf0g==", + "dependencies": { + "destroy": "^1.0.4", + "mime": "^2.5.2", + "pause-stream": "~0.0.11" + } + }, + "node_modules/frac": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/frac/-/frac-1.1.2.tgz", + "integrity": "sha512-w/XBfkibaTl3YDqASwfDUqkna4Z2p9cFSr1aHDt0WoMTECnRfBOv2WArlZILlqgWlmdIlALXGpM2AOhEk5W3IA==", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/fraction.js": { + "version": "4.3.7", + "resolved": "https://registry.npmmirror.com/fraction.js/-/fraction.js-4.3.7.tgz", + "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", + "engines": { + "node": "*" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmmirror.com/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==" + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmmirror.com/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==" + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmmirror.com/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.1", + "resolved": "https://registry.npmmirror.com/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3" + } + }, + "node_modules/get-ready": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/get-ready/-/get-ready-1.0.0.tgz", + "integrity": "sha512-mFXCZPJIlcYcth+N8267+mghfYN9h3EhsDa6JSnbA3Wrhh/XFpuowviFcsDeYZtKspQyWyJqfs4O6P8CHeTwzw==" + }, + "node_modules/glob": { + "version": "10.3.10", + "resolved": "https://registry.npmmirror.com/glob/-/glob-10.3.10.tgz", + "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^2.3.5", + "minimatch": "^9.0.1", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", + "path-scurry": "^1.10.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmmirror.com/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/glob-to-regexp": { + "version": "0.4.1", + "resolved": "https://registry.npmmirror.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "dev": true, + "peer": true + }, + "node_modules/glob/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/glob/node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmmirror.com/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "engines": { + "node": ">=4" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmmirror.com/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/good-listener": { + "version": "1.2.2", + "resolved": "https://registry.npmmirror.com/good-listener/-/good-listener-1.2.2.tgz", + "integrity": "sha512-goW1b+d9q/HIwbVYZzZ6SsTr4IgE+WA44A0GmPIQstuOrgsFcT7VEJ48nmr9GaRtNu0XTKacFLGnBPAM6Afouw==", + "dependencies": { + "delegate": "^3.1.2" + } + }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dependencies": { + "get-intrinsic": "^1.1.3" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmmirror.com/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "devOptional": true + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmmirror.com/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true + }, + "node_modules/has": { + "version": "1.0.4", + "resolved": "https://registry.npmmirror.com/has/-/has-1.0.4.tgz", + "integrity": "sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ==", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", + "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "dependencies": { + "get-intrinsic": "^1.1.1" + } + }, + "node_modules/has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/help-me": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/help-me/-/help-me-3.0.0.tgz", + "integrity": "sha512-hx73jClhyk910sidBB7ERlnhMlFsJJIBqSVMFDwPN8o2v9nmp5KgLq1Xz1Bf1fCMMZ6mPrX159iG0VLy/fPMtQ==", + "dependencies": { + "glob": "^7.1.6", + "readable-stream": "^3.6.0" + } + }, + "node_modules/help-me/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmmirror.com/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + } + }, + "node_modules/help-me/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmmirror.com/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/html-tags": { + "version": "3.3.1", + "resolved": "https://registry.npmmirror.com/html-tags/-/html-tags-3.3.1.tgz", + "integrity": "sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/html-void-elements": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/html-void-elements/-/html-void-elements-2.0.1.tgz", + "integrity": "sha512-0quDb7s97CfemeJAnW9wC0hw78MtW7NU3hqtCD75g2vFlDLt36llsYD7uB7SUzojLMP24N5IatXf7ylGXiGG9A==" + }, + "node_modules/humanize-duration": { + "version": "3.30.0", + "resolved": "https://registry.npmmirror.com/humanize-duration/-/humanize-duration-3.30.0.tgz", + "integrity": "sha512-NxpT0fhQTFuMTLnuu1Xp+ozNpYirQnbV3NlOjEKBYlE3uvMRu3LDuq8EPc3gVXxVYnchQfqVM4/+T9iwHPLLeA==" + }, + "node_modules/humanize-ms": { + "version": "1.2.1", + "resolved": "https://registry.npmmirror.com/humanize-ms/-/humanize-ms-1.2.1.tgz", + "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", + "dependencies": { + "ms": "^2.0.0" + } + }, + "node_modules/i18next": { + "version": "20.6.1", + "resolved": "https://registry.npmmirror.com/i18next/-/i18next-20.6.1.tgz", + "integrity": "sha512-yCMYTMEJ9ihCwEQQ3phLo7I/Pwycf8uAx+sRHwwk5U9Aui/IZYgQRyMqXafQOw5QQ7DM1Z+WyEXWIqSuJHhG2A==", + "dependencies": { + "@babel/runtime": "^7.12.0" + } + }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmmirror.com/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "optional": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmmirror.com/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" + }, + "node_modules/ignore": { + "version": "5.2.4", + "resolved": "https://registry.npmmirror.com/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/image-size": { + "version": "0.5.5", + "resolved": "https://registry.npmmirror.com/image-size/-/image-size-0.5.5.tgz", + "integrity": "sha512-6TDAlDPZxUFCv+fuOkIoXT/V/f3Qbq8e37p+YOiYrUv3v9cc3/6x78VdfPgFVaB9dZYeLUfKgHRebpkm/oP2VQ==", + "optional": true, + "bin": { + "image-size": "bin/image-size.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/immer": { + "version": "9.0.21", + "resolved": "https://registry.npmmirror.com/immer/-/immer-9.0.21.tgz", + "integrity": "sha512-bc4NBHqOqSfRW7POMkHd51LvClaeMXpm8dx0e8oE2GORbq5aRK7Bxl4FyzVLdGtLmvLKL7BTDBG5ACQm4HWjTA==" + }, + "node_modules/immutable": { + "version": "4.3.4", + "resolved": "https://registry.npmmirror.com/immutable/-/immutable-4.3.4.tgz", + "integrity": "sha512-fsXeu4J4i6WNWSikpI88v/PcVflZz+6kMhUfIwc5SY+poQRPnaf5V7qds6SUyUN3cVxEzuCab7QIoLOQ+DQ1wA==", + "devOptional": true + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmmirror.com/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmmirror.com/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmmirror.com/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmmirror.com/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/ip": { + "version": "1.1.8", + "resolved": "https://registry.npmmirror.com/ip/-/ip-1.1.8.tgz", + "integrity": "sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg==" + }, + "node_modules/is-arguments": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-class-hotfix": { + "version": "0.0.6", + "resolved": "https://registry.npmmirror.com/is-class-hotfix/-/is-class-hotfix-0.0.6.tgz", + "integrity": "sha512-0n+pzCC6ICtVr/WXnN2f03TK/3BfXY7me4cjCAqT8TYXEl0+JBRoqBo94JJHXcyDSLUeWbNX8Fvy5g5RJdAstQ==" + }, + "node_modules/is-core-module": { + "version": "2.13.0", + "resolved": "https://registry.npmmirror.com/is-core-module/-/is-core-module-2.13.0.tgz", + "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==", + "dependencies": { + "has": "^1.0.3" + } + }, + "node_modules/is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmmirror.com/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmmirror.com/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmmirror.com/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmmirror.com/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-hotkey": { + "version": "0.2.0", + "resolved": "https://registry.npmmirror.com/is-hotkey/-/is-hotkey-0.2.0.tgz", + "integrity": "sha512-UknnZK4RakDmTgz4PI1wIph5yxSs/mvChWs9ifnlXsKuXgWmOkY/hAE0H/k2MIqH0RlRye0i1oC07MCRSD28Mw==" + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmmirror.com/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmmirror.com/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-plain-object": { + "version": "5.0.0", + "resolved": "https://registry.npmmirror.com/is-plain-object/-/is-plain-object-5.0.0.tgz", + "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmmirror.com/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-type-of": { + "version": "1.4.0", + "resolved": "https://registry.npmmirror.com/is-type-of/-/is-type-of-1.4.0.tgz", + "integrity": "sha512-EddYllaovi5ysMLMEN7yzHEKh8A850cZ7pykrY1aNRQGn/CDjRDE9qEWbIdt7xGEVJmjBXzU/fNnC4ABTm8tEQ==", + "dependencies": { + "core-util-is": "^1.0.2", + "is-class-hotfix": "~0.0.6", + "isstream": "~0.1.2" + } + }, + "node_modules/is-url": { + "version": "1.2.4", + "resolved": "https://registry.npmmirror.com/is-url/-/is-url-1.2.4.tgz", + "integrity": "sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==" + }, + "node_modules/is-what": { + "version": "3.14.1", + "resolved": "https://registry.npmmirror.com/is-what/-/is-what-3.14.1.tgz", + "integrity": "sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==", + "devOptional": true + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" + }, + "node_modules/isomorphic-ws": { + "version": "4.0.1", + "resolved": "https://registry.npmmirror.com/isomorphic-ws/-/isomorphic-ws-4.0.1.tgz", + "integrity": "sha512-BhBvN2MBpWTaSHdWRb/bwdZJ1WaehQ2L1KngkCkfLUGF0mAWAT1sQUQacEmQ0jXkFw/czDXPNQSL5u2/Krsz1w==", + "peerDependencies": { + "ws": "*" + } + }, + "node_modules/isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmmirror.com/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==" + }, + "node_modules/jackspeak": { + "version": "2.3.6", + "resolved": "https://registry.npmmirror.com/jackspeak/-/jackspeak-2.3.6.tgz", + "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "engines": { + "node": ">=14" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/javascript-natural-sort": { + "version": "0.7.1", + "resolved": "https://registry.npmmirror.com/javascript-natural-sort/-/javascript-natural-sort-0.7.1.tgz", + "integrity": "sha512-nO6jcEfZWQXDhOiBtG2KvKyEptz7RVbpGP4vTD2hLBdmNQSsCiicO2Ioinv6UI4y9ukqnBpy+XZ9H6uLNgJTlw==" + }, + "node_modules/jest-worker": { + "version": "27.5.1", + "resolved": "https://registry.npmmirror.com/jest-worker/-/jest-worker-27.5.1.tgz", + "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", + "dev": true, + "peer": true, + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/jest-worker/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "peer": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "peer": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jmespath": { + "version": "0.16.0", + "resolved": "https://registry.npmmirror.com/jmespath/-/jmespath-0.16.0.tgz", + "integrity": "sha512-9FzQjJ7MATs1tSpnco1K6ayiYE3figslrXA72G2HQ/n76RzvYlofyi5QM+iX4YRs/pu3yzxlVQSST23+dMDknw==", + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/js-base64": { + "version": "2.6.4", + "resolved": "https://registry.npmmirror.com/js-base64/-/js-base64-2.6.4.tgz", + "integrity": "sha512-pZe//GGmwJndub7ZghVHz7vjb2LgC1m8B07Au3eYqeqv9emhESByMXxaEgkUkEqJe87oBbSniGYoQNIBklc7IQ==" + }, + "node_modules/js-cookie": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/js-cookie/-/js-cookie-3.0.1.tgz", + "integrity": "sha512-+0rgsUXZu4ncpPxRL+lNEptWMOWl9etvPHc/koSRp6MPwpRYAhmk0dUG00J4bxVV3r9uUzfo24wW0knS07SKSw==", + "engines": { + "node": ">=12" + } + }, + "node_modules/js-table2excel": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/js-table2excel/-/js-table2excel-1.0.3.tgz", + "integrity": "sha512-ivzOdgYqOD3zqzJZfW0Nm35P9BWffxD0Unwr+2QBeEawV7hhRY9RHBVNcvO6A9PhGkMyqPVL/u4/NeufaTTTXw==" + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmmirror.com/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmmirror.com/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmmirror.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true, + "peer": true + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmmirror.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" + }, + "node_modules/json-source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmmirror.com/json-source-map/-/json-source-map-0.6.1.tgz", + "integrity": "sha512-1QoztHPsMQqhDq0hlXY5ZqcEdUzxQEIxgFkKl4WUp2pgShObl+9ovi4kRh2TfvAfxAoHOJ9vIMEqk3k4iex7tg==" + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true + }, + "node_modules/json5": { + "version": "2.2.3", + "resolved": "https://registry.npmmirror.com/json5/-/json5-2.2.3.tgz", + "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsoneditor": { + "version": "9.10.3", + "resolved": "https://registry.npmmirror.com/jsoneditor/-/jsoneditor-9.10.3.tgz", + "integrity": "sha512-9vSMTPKBZzz56WY0SjbV7VQqa1+wUPKmwqtitmVXmTT5ohAMOYlOLgOdRwj0bl81nHP5HsKsYEVLCPiArHNSFw==", + "dependencies": { + "ace-builds": "^1.27.0", + "ajv": "^6.12.6", + "javascript-natural-sort": "^0.7.1", + "jmespath": "^0.16.0", + "json-source-map": "^0.6.1", + "jsonrepair": "^3.2.1", + "mobius1-selectr": "^2.4.13", + "picomodal": "^3.0.0", + "vanilla-picker": "^2.12.2" + } + }, + "node_modules/jsonrepair": { + "version": "3.2.4", + "resolved": "https://registry.npmmirror.com/jsonrepair/-/jsonrepair-3.2.4.tgz", + "integrity": "sha512-NvCthT+ciKTU62IF8z34WMl6/TEyDcBjFWWVG038Nzd08+v+VfeEI2gElgpgrbYB5tWsiRiwrAo0TTBDoiDpEA==", + "bin": { + "jsonrepair": "bin/cli.js" + } + }, + "node_modules/jsplumb": { + "version": "2.15.6", + "resolved": "https://registry.npmmirror.com/jsplumb/-/jsplumb-2.15.6.tgz", + "integrity": "sha512-sIpbpz5eMVM+vV+MQzFCidlaa1RsknrQs6LOTKYDjYUDdTAi2AN2bFi94TxB33TifcIsRNV1jebcaxg0tCoPzg==" + }, + "node_modules/jstoxml": { + "version": "2.2.9", + "resolved": "https://registry.npmmirror.com/jstoxml/-/jstoxml-2.2.9.tgz", + "integrity": "sha512-OYWlK0j+roh+eyaMROlNbS5cd5R25Y+IUpdl7cNdB8HNrkgwQzIS7L9MegxOiWNBj9dQhA/yAxiMwCC5mwNoBw==" + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmmirror.com/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/less": { + "version": "4.2.0", + "resolved": "https://registry.npmmirror.com/less/-/less-4.2.0.tgz", + "integrity": "sha512-P3b3HJDBtSzsXUl0im2L7gTO5Ubg8mEN6G8qoTS77iXxXX4Hvu4Qj540PZDvQ8V6DmX6iXo98k7Md0Cm1PrLaA==", + "devOptional": true, + "dependencies": { + "copy-anything": "^2.0.1", + "parse-node-version": "^1.0.1", + "tslib": "^2.3.0" + }, + "bin": { + "lessc": "bin/lessc" + }, + "engines": { + "node": ">=6" + }, + "optionalDependencies": { + "errno": "^0.1.1", + "graceful-fs": "^4.1.2", + "image-size": "~0.5.0", + "make-dir": "^2.1.0", + "mime": "^1.4.1", + "needle": "^3.1.0", + "source-map": "~0.6.0" + } + }, + "node_modules/less-loader": { + "version": "11.1.3", + "resolved": "https://registry.npmmirror.com/less-loader/-/less-loader-11.1.3.tgz", + "integrity": "sha512-A5b7O8dH9xpxvkosNrP0dFp2i/dISOJa9WwGF3WJflfqIERE2ybxh1BFDj5CovC2+jCE4M354mk90hN6ziXlVw==", + "dev": true, + "engines": { + "node": ">= 14.15.0" + }, + "peerDependencies": { + "less": "^3.5.0 || ^4.0.0", + "webpack": "^5.0.0" + } + }, + "node_modules/less/node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmmirror.com/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "optional": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/leven": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/leven/-/leven-2.1.0.tgz", + "integrity": "sha512-nvVPLpIHUxCUoRLrFqTgSxXJ614d8AgQoWl7zPe/2VadE8+1dpU3LBhowRuBAcuwruWtOdD8oYC9jDNJjXDPyA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmmirror.com/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lilconfig": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/lilconfig/-/lilconfig-2.1.0.tgz", + "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", + "engines": { + "node": ">=10" + } + }, + "node_modules/loader-runner": { + "version": "4.3.0", + "resolved": "https://registry.npmmirror.com/loader-runner/-/loader-runner-4.3.0.tgz", + "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", + "dev": true, + "peer": true, + "engines": { + "node": ">=6.11.5" + } + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmmirror.com/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmmirror.com/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "node_modules/lodash-es": { + "version": "4.17.21", + "resolved": "https://registry.npmmirror.com/lodash-es/-/lodash-es-4.17.21.tgz", + "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==" + }, + "node_modules/lodash-unified": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/lodash-unified/-/lodash-unified-1.0.3.tgz", + "integrity": "sha512-WK9qSozxXOD7ZJQlpSqOT+om2ZfcT4yO+03FuzAHD0wF6S0l0090LRPDx3vhTTLZ8cFKpBn+IOcVXK6qOcIlfQ==", + "peerDependencies": { + "@types/lodash-es": "*", + "lodash": "*", + "lodash-es": "*" + } + }, + "node_modules/lodash.camelcase": { + "version": "4.3.0", + "resolved": "https://registry.npmmirror.com/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", + "integrity": "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==" + }, + "node_modules/lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmmirror.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==" + }, + "node_modules/lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmmirror.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==" + }, + "node_modules/lodash.foreach": { + "version": "4.5.0", + "resolved": "https://registry.npmmirror.com/lodash.foreach/-/lodash.foreach-4.5.0.tgz", + "integrity": "sha512-aEXTF4d+m05rVOAUG3z4vZZ4xVexLKZGF0lIxuHZ1Hplpk/3B6Z1+/ICICYRLm7c41Z2xiejbkCkJoTlypoXhQ==" + }, + "node_modules/lodash.isequal": { + "version": "4.5.0", + "resolved": "https://registry.npmmirror.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz", + "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==" + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmmirror.com/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "node_modules/lodash.throttle": { + "version": "4.1.1", + "resolved": "https://registry.npmmirror.com/lodash.throttle/-/lodash.throttle-4.1.1.tgz", + "integrity": "sha512-wIkUCfVKpVsWo3JSZlc+8MB5it+2AN5W8J7YVMST30UrvcQNZ1Okbj+rbVniijTWE6FGYy4XJq/rHkas8qJMLQ==" + }, + "node_modules/lodash.toarray": { + "version": "4.4.0", + "resolved": "https://registry.npmmirror.com/lodash.toarray/-/lodash.toarray-4.4.0.tgz", + "integrity": "sha512-QyffEA3i5dma5q2490+SgCvDN0pXLmRGSyAANuVi0HQ01Pkfr9fuoKQW8wm1wGBnJITs/mS7wQvS6VshUEBFCw==" + }, + "node_modules/lru-cache": { + "version": "10.0.1", + "resolved": "https://registry.npmmirror.com/lru-cache/-/lru-cache-10.0.1.tgz", + "integrity": "sha512-IJ4uwUTi2qCccrioU6g9g/5rvvVl13bsdczUUcqbciD9iLr095yj8DQKdObriEvuNSx325N1rV1O0sJFszx75g==", + "engines": { + "node": "14 || >=16.14" + } + }, + "node_modules/magic-string": { + "version": "0.25.9", + "resolved": "https://registry.npmmirror.com/magic-string/-/magic-string-0.25.9.tgz", + "integrity": "sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==", + "dependencies": { + "sourcemap-codec": "^1.4.8" + } + }, + "node_modules/make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "optional": true, + "dependencies": { + "pify": "^4.0.1", + "semver": "^5.6.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmmirror.com/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "optional": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/memoize-one": { + "version": "6.0.0", + "resolved": "https://registry.npmmirror.com/memoize-one/-/memoize-one-6.0.0.tgz", + "integrity": "sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==" + }, + "node_modules/merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "dev": true, + "peer": true + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmmirror.com/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmmirror.com/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime": { + "version": "2.6.0", + "resolved": "https://registry.npmmirror.com/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmmirror.com/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-match": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/mime-match/-/mime-match-1.0.2.tgz", + "integrity": "sha512-VXp/ugGDVh3eCLOBCiHZMYWQaTNUHv2IJrut+yXA6+JbLPXHglHwfS/5A5L0ll+jkCY7fIzRJcH6OIunF+c6Cg==", + "dependencies": { + "wildcard": "^1.1.0" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmmirror.com/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmmirror.com/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==" + }, + "node_modules/minipass": { + "version": "7.0.4", + "resolved": "https://registry.npmmirror.com/minipass/-/minipass-7.0.4.tgz", + "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/mitt": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/mitt/-/mitt-3.0.0.tgz", + "integrity": "sha512-7dX2/10ITVyqh4aOSVI9gdape+t9l2/8QxHrFmUXu4EEUpdlxl6RudZUPZoc+zuY2hk1j7XxVroIVIan/pD/SQ==" + }, + "node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmmirror.com/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/mobius1-selectr": { + "version": "2.4.13", + "resolved": "https://registry.npmmirror.com/mobius1-selectr/-/mobius1-selectr-2.4.13.tgz", + "integrity": "sha512-Mk9qDrvU44UUL0EBhbAA1phfQZ7aMZPjwtL7wkpiBzGh8dETGqfsh50mWoX9EkjDlkONlErWXArHCKfoxVg0Bw==" + }, + "node_modules/mqtt": { + "version": "4.3.7", + "resolved": "https://registry.npmmirror.com/mqtt/-/mqtt-4.3.7.tgz", + "integrity": "sha512-ew3qwG/TJRorTz47eW46vZ5oBw5MEYbQZVaEji44j5lAUSQSqIEoul7Kua/BatBW0H0kKQcC9kwUHa1qzaWHSw==", + "dependencies": { + "commist": "^1.0.0", + "concat-stream": "^2.0.0", + "debug": "^4.1.1", + "duplexify": "^4.1.1", + "help-me": "^3.0.0", + "inherits": "^2.0.3", + "lru-cache": "^6.0.0", + "minimist": "^1.2.5", + "mqtt-packet": "^6.8.0", + "number-allocator": "^1.0.9", + "pump": "^3.0.0", + "readable-stream": "^3.6.0", + "reinterval": "^1.1.0", + "rfdc": "^1.3.0", + "split2": "^3.1.0", + "ws": "^7.5.5", + "xtend": "^4.0.2" + }, + "bin": { + "mqtt": "bin/mqtt.js", + "mqtt_pub": "bin/pub.js", + "mqtt_sub": "bin/sub.js" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/mqtt-packet": { + "version": "6.10.0", + "resolved": "https://registry.npmmirror.com/mqtt-packet/-/mqtt-packet-6.10.0.tgz", + "integrity": "sha512-ja8+mFKIHdB1Tpl6vac+sktqy3gA8t9Mduom1BA75cI+R9AHnZOiaBQwpGiWnaVJLDGRdNhQmFaAqd7tkKSMGA==", + "dependencies": { + "bl": "^4.0.2", + "debug": "^4.1.1", + "process-nextick-args": "^2.0.1" + } + }, + "node_modules/mqtt/node_modules/duplexify": { + "version": "4.1.2", + "resolved": "https://registry.npmmirror.com/duplexify/-/duplexify-4.1.2.tgz", + "integrity": "sha512-fz3OjcNCHmRP12MJoZMPglx8m4rrFP8rovnk4vT8Fs+aonZoCwGg10dSsQsfP/E62eZcPTMSMP6686fu9Qlqtw==", + "dependencies": { + "end-of-stream": "^1.4.1", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1", + "stream-shift": "^1.0.0" + } + }, + "node_modules/mqtt/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmmirror.com/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/mqtt/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmmirror.com/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/mqtt/node_modules/ws": { + "version": "7.5.9", + "resolved": "https://registry.npmmirror.com/ws/-/ws-7.5.9.tgz", + "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/mqtt/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/mz": { + "version": "2.7.0", + "resolved": "https://registry.npmmirror.com/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "dependencies": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "node_modules/namespace-emitter": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/namespace-emitter/-/namespace-emitter-2.0.1.tgz", + "integrity": "sha512-N/sMKHniSDJBjfrkbS/tpkPj4RAbvW3mr8UAzvlMHyun93XEm83IAvhWtJVHo+RHn/oO8Job5YN4b+wRjSVp5g==" + }, + "node_modules/nanoid": { + "version": "3.3.6", + "resolved": "https://registry.npmmirror.com/nanoid/-/nanoid-3.3.6.tgz", + "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmmirror.com/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, + "node_modules/natural-compare-lite": { + "version": "1.4.0", + "resolved": "https://registry.npmmirror.com/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", + "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", + "dev": true + }, + "node_modules/needle": { + "version": "3.2.0", + "resolved": "https://registry.npmmirror.com/needle/-/needle-3.2.0.tgz", + "integrity": "sha512-oUvzXnyLiVyVGoianLijF9O/RecZUf7TkBfimjGrLM4eQhXyeJwM6GeAWccwfQ9aa4gMCZKqhAOuLaMIcQxajQ==", + "optional": true, + "dependencies": { + "debug": "^3.2.6", + "iconv-lite": "^0.6.3", + "sax": "^1.2.4" + }, + "bin": { + "needle": "bin/needle" + }, + "engines": { + "node": ">= 4.4.x" + } + }, + "node_modules/needle/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmmirror.com/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "optional": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/neo-async": { + "version": "2.6.2", + "resolved": "https://registry.npmmirror.com/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", + "dev": true, + "peer": true + }, + "node_modules/next-tick": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/next-tick/-/next-tick-1.1.0.tgz", + "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==" + }, + "node_modules/node-releases": { + "version": "2.0.13", + "resolved": "https://registry.npmmirror.com/node-releases/-/node-releases-2.0.13.tgz", + "integrity": "sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==" + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmmirror.com/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-wheel-es": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/normalize-wheel-es/-/normalize-wheel-es-1.2.0.tgz", + "integrity": "sha512-Wj7+EJQ8mSuXr2iWfnujrimU35R2W4FAErEyTmJoJ7ucwTn2hOUSsRehMb5RSYkxXGTM7Y9QpvPmp++w5ftoJw==" + }, + "node_modules/nprogress": { + "version": "0.2.0", + "resolved": "https://registry.npmmirror.com/nprogress/-/nprogress-0.2.0.tgz", + "integrity": "sha512-I19aIingLgR1fmhftnbWWO3dXc0hSxqHQHQb3H8m+K3TnEn/iSeTZZOyvKXWqQESMwuUVnatlCnZdLBZZt2VSA==" + }, + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmmirror.com/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "dev": true, + "dependencies": { + "boolbase": "^1.0.0" + } + }, + "node_modules/number-allocator": { + "version": "1.0.14", + "resolved": "https://registry.npmmirror.com/number-allocator/-/number-allocator-1.0.14.tgz", + "integrity": "sha512-OrL44UTVAvkKdOdRQZIJpLkAdjXGTRda052sN4sO77bKEzYYqWKMBjQvrJFzqygI99gL6Z4u2xctPW1tB8ErvA==", + "dependencies": { + "debug": "^4.3.1", + "js-sdsl": "4.3.0" + } + }, + "node_modules/number-allocator/node_modules/js-sdsl": { + "version": "4.3.0", + "resolved": "https://registry.npmmirror.com/js-sdsl/-/js-sdsl-4.3.0.tgz", + "integrity": "sha512-mifzlm2+5nZ+lEcLJMoBK0/IH/bDg8XnJfd/Wq6IP+xoCjLZsTOnV2QpxlVbX9bMnkl5PdEjNtBJ9Cj1NjifhQ==" + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmmirror.com/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/object-inspect": { + "version": "1.13.0", + "resolved": "https://registry.npmmirror.com/object-inspect/-/object-inspect-1.13.0.tgz", + "integrity": "sha512-HQ4J+ic8hKrgIt3mqk6cVOVrW2ozL4KdvHlqpBv9vDYWx9ysAgENAdvy4FoGF+KFdhR7nQTNm5J0ctAeOwn+3g==" + }, + "node_modules/object-is": { + "version": "1.1.5", + "resolved": "https://registry.npmmirror.com/object-is/-/object-is-1.1.5.tgz", + "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmmirror.com/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/optionator": { + "version": "0.9.3", + "resolved": "https://registry.npmmirror.com/optionator/-/optionator-0.9.3.tgz", + "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", + "dev": true, + "dependencies": { + "@aashutoshrathi/word-wrap": "^1.2.3", + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/os-name": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/os-name/-/os-name-1.0.3.tgz", + "integrity": "sha512-f5estLO2KN8vgtTRaILIgEGBoBrMnZ3JQ7W9TMZCnOIGwHe8TRGSpcagnWDo+Dfhd/z08k9Xe75hvciJJ8Qaew==", + "dependencies": { + "osx-release": "^1.0.0", + "win-release": "^1.0.0" + }, + "bin": { + "os-name": "cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/osx-release": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/osx-release/-/osx-release-1.1.0.tgz", + "integrity": "sha512-ixCMMwnVxyHFQLQnINhmIpWqXIfS2YOXchwQrk+OFzmo6nDjQ0E4KXAyyUh0T0MZgV4bUhkRrAbVqlE4yLVq4A==", + "dependencies": { + "minimist": "^1.1.0" + }, + "bin": { + "osx-release": "cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmmirror.com/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/parchment": { + "version": "1.1.4", + "resolved": "https://registry.npmmirror.com/parchment/-/parchment-1.1.4.tgz", + "integrity": "sha512-J5FBQt/pM2inLzg4hEWmzQx/8h8D0CiDxaG3vyp9rKrQRSDgBlhjdP5jQGgosEajXPSQouXGHOmVdgo7QmJuOg==" + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-node-version": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/parse-node-version/-/parse-node-version-1.0.1.tgz", + "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==", + "devOptional": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmmirror.com/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmmirror.com/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "node_modules/path-scurry": { + "version": "1.10.1", + "resolved": "https://registry.npmmirror.com/path-scurry/-/path-scurry-1.10.1.tgz", + "integrity": "sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==", + "dependencies": { + "lru-cache": "^9.1.1 || ^10.0.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/pause-stream": { + "version": "0.0.11", + "resolved": "https://registry.npmmirror.com/pause-stream/-/pause-stream-0.0.11.tgz", + "integrity": "sha512-e3FBlXLmN/D1S+zHzanP4E/4Z60oFAa3O051qt1pxa7DEJWKAyil6upYVXCWadEnuoqa4Pkc9oUx9zsxYeRv8A==", + "dependencies": { + "through": "~2.3" + } + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "engines": { + "node": ">=8.6" + } + }, + "node_modules/picomodal": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/picomodal/-/picomodal-3.0.0.tgz", + "integrity": "sha512-FoR3TDfuLlqUvcEeK5ifpKSVVns6B4BQvc8SDF6THVMuadya6LLtji0QgUDSStw0ZR2J7I6UGi5V2V23rnPWTw==" + }, + "node_modules/pify": { + "version": "4.0.1", + "resolved": "https://registry.npmmirror.com/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "optional": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/pinia": { + "version": "2.0.28", + "resolved": "https://registry.npmmirror.com/pinia/-/pinia-2.0.28.tgz", + "integrity": "sha512-YClq9DkqCblq9rlyUual7ezMu/iICWdBtfJrDt4oWU9Zxpijyz7xB2xTwx57DaBQ96UGvvTMORzALr+iO5PVMw==", + "dependencies": { + "@vue/devtools-api": "^6.4.5", + "vue-demi": "*" + }, + "peerDependencies": { + "@vue/composition-api": "^1.4.0", + "typescript": ">=4.4.4", + "vue": "^2.6.14 || ^3.2.0" + }, + "peerDependenciesMeta": { + "@vue/composition-api": { + "optional": true + }, + "typescript": { + "optional": true + } + } + }, + "node_modules/pinia-plugin-persist": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/pinia-plugin-persist/-/pinia-plugin-persist-1.0.0.tgz", + "integrity": "sha512-M4hBBd8fz/GgNmUPaaUsC29y1M09lqbXrMAHcusVoU8xlQi1TqgkWnnhvMikZwr7Le/hVyMx8KUcumGGrR6GVw==", + "dependencies": { + "vue-demi": "^0.12.1" + }, + "peerDependencies": { + "@vue/composition-api": "^1.0.0", + "pinia": "^2.0.0", + "vue": "^2.0.0 || >=3.0.0" + }, + "peerDependenciesMeta": { + "@vue/composition-api": { + "optional": true + } + } + }, + "node_modules/pinia-plugin-persist/node_modules/vue-demi": { + "version": "0.12.5", + "resolved": "https://registry.npmmirror.com/vue-demi/-/vue-demi-0.12.5.tgz", + "integrity": "sha512-BREuTgTYlUr0zw0EZn3hnhC3I6gPWv+Kwh4MCih6QcAeaTlaIX0DwOVN0wHej7hSvDPecz4jygy/idsgKfW58Q==", + "hasInstallScript": true, + "bin": { + "vue-demi-fix": "bin/vue-demi-fix.js", + "vue-demi-switch": "bin/vue-demi-switch.js" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "@vue/composition-api": "^1.0.0-rc.1", + "vue": "^3.0.0-0 || ^2.6.0" + }, + "peerDependenciesMeta": { + "@vue/composition-api": { + "optional": true + } + } + }, + "node_modules/pinia/node_modules/vue-demi": { + "version": "0.14.6", + "resolved": "https://registry.npmmirror.com/vue-demi/-/vue-demi-0.14.6.tgz", + "integrity": "sha512-8QA7wrYSHKaYgUxDA5ZC24w+eHm3sYCbp0EzcDwKqN3p6HqtTCGR/GVsPyZW92unff4UlcSh++lmqDWN3ZIq4w==", + "hasInstallScript": true, + "bin": { + "vue-demi-fix": "bin/vue-demi-fix.js", + "vue-demi-switch": "bin/vue-demi-switch.js" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "@vue/composition-api": "^1.0.0-rc.1", + "vue": "^3.0.0-0 || ^2.6.0" + }, + "peerDependenciesMeta": { + "@vue/composition-api": { + "optional": true + } + } + }, + "node_modules/platform": { + "version": "1.3.6", + "resolved": "https://registry.npmmirror.com/platform/-/platform-1.3.6.tgz", + "integrity": "sha512-fnWVljUchTro6RiCFvCXBbNhJc2NijN7oIQxbwsyL0buWJPG85v81ehlHI9fXrJsMNgTofEoWIQeClKpgxFLrg==" + }, + "node_modules/postcss": { + "version": "8.4.21", + "resolved": "https://registry.npmmirror.com/postcss/-/postcss-8.4.21.tgz", + "integrity": "sha512-tP7u/Sn/dVxK2NnruI4H9BG+x+Wxz6oeZ1cJ8P6G/PZY0IKk4k/63TDsQf2kQq3+qoJeLm2kIBUNlZe3zgb4Zg==", + "dependencies": { + "nanoid": "^3.3.4", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-import": { + "version": "14.1.0", + "resolved": "https://registry.npmmirror.com/postcss-import/-/postcss-import-14.1.0.tgz", + "integrity": "sha512-flwI+Vgm4SElObFVPpTIT7SU7R3qk2L7PyduMcokiaVKuWv9d/U+Gm/QAd8NDLuykTWTkcrjOeD2Pp1rMeBTGw==", + "dependencies": { + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + }, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "node_modules/postcss-js": { + "version": "4.0.1", + "resolved": "https://registry.npmmirror.com/postcss-js/-/postcss-js-4.0.1.tgz", + "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", + "dependencies": { + "camelcase-css": "^2.0.1" + }, + "engines": { + "node": "^12 || ^14 || >= 16" + }, + "peerDependencies": { + "postcss": "^8.4.21" + } + }, + "node_modules/postcss-load-config": { + "version": "3.1.4", + "resolved": "https://registry.npmmirror.com/postcss-load-config/-/postcss-load-config-3.1.4.tgz", + "integrity": "sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==", + "dependencies": { + "lilconfig": "^2.0.5", + "yaml": "^1.10.2" + }, + "engines": { + "node": ">= 10" + }, + "peerDependencies": { + "postcss": ">=8.0.9", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "postcss": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/postcss-nested": { + "version": "6.0.0", + "resolved": "https://registry.npmmirror.com/postcss-nested/-/postcss-nested-6.0.0.tgz", + "integrity": "sha512-0DkamqrPcmkBDsLn+vQDIrtkSbNkv5AD/M322ySo9kqFkCIYklym2xEmWkwo+Y3/qZo34tzEPNUw4y7yMCdv5w==", + "dependencies": { + "postcss-selector-parser": "^6.0.10" + }, + "engines": { + "node": ">=12.0" + }, + "peerDependencies": { + "postcss": "^8.2.14" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.0.13", + "resolved": "https://registry.npmmirror.com/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz", + "integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmmirror.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" + }, + "node_modules/preact": { + "version": "10.18.1", + "resolved": "https://registry.npmmirror.com/preact/-/preact-10.18.1.tgz", + "integrity": "sha512-mKUD7RRkQQM6s7Rkmi7IFkoEHjuFqRQUaXamO61E6Nn7vqF/bo7EZCmSyrUnp2UWHw0O7XjZ2eeXis+m7tf4lg==" + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmmirror.com/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prettier": { + "version": "2.8.1", + "resolved": "https://registry.npmmirror.com/prettier/-/prettier-2.8.1.tgz", + "integrity": "sha512-lqGoSJBQNJidqCHE80vqZJHWHRFoNYsSpP9AjFhlhi9ODCJA541svILes/+/1GM3VaL/abZi7cpFzOpdR9UPKg==", + "dev": true, + "bin": { + "prettier": "bin-prettier.js" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/print-js": { + "version": "1.6.0", + "resolved": "https://registry.npmmirror.com/print-js/-/print-js-1.6.0.tgz", + "integrity": "sha512-BfnOIzSKbqGRtO4o0rnj/K3681BSd2QUrsIZy/+WdCIugjIswjmx3lDEZpXB2ruGf9d4b3YNINri81+J0FsBWg==" + }, + "node_modules/prismjs": { + "version": "1.29.0", + "resolved": "https://registry.npmmirror.com/prismjs/-/prismjs-1.29.0.tgz", + "integrity": "sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==", + "engines": { + "node": ">=6" + } + }, + "node_modules/process": { + "version": "0.11.10", + "resolved": "https://registry.npmmirror.com/process/-/process-0.11.10.tgz", + "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==", + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" + }, + "node_modules/prr": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/prr/-/prr-1.0.1.tgz", + "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==", + "optional": true + }, + "node_modules/pump": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/punycode": { + "version": "2.3.0", + "resolved": "https://registry.npmmirror.com/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/qiniu-js": { + "version": "3.4.1", + "resolved": "https://registry.npmmirror.com/qiniu-js/-/qiniu-js-3.4.1.tgz", + "integrity": "sha512-8vxrLqDPlJUk3fUAaTozh3TAT3ww9B5KqGogmGuTiFHnewXDoMxTCSY5z8Ab5UNdrCo6ZxDM07G/o++CICRUFw==", + "dependencies": { + "@babel/runtime-corejs2": "^7.10.2", + "querystring": "^0.2.1", + "spark-md5": "^3.0.0" + } + }, + "node_modules/qrcodejs2-fixes": { + "version": "0.0.2", + "resolved": "https://registry.npmmirror.com/qrcodejs2-fixes/-/qrcodejs2-fixes-0.0.2.tgz", + "integrity": "sha512-wMUXYMOixAEJlLnjk5MbLiFaz0gQObWYm/TIFWB5+j7sTY5gPyr09Cx1EpcLYbsgfFdN3wHjrKAhZofTuCBGhg==" + }, + "node_modules/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmmirror.com/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/querystring": { + "version": "0.2.1", + "resolved": "https://registry.npmmirror.com/querystring/-/querystring-0.2.1.tgz", + "integrity": "sha512-wkvS7mL/JMugcup3/rMitHmd9ecIGd2lhFhK9N3UUQ450h66d1r3Y9nvXzQAW1Lq+wyx61k/1pfKS5KuKiyEbg==", + "deprecated": "The querystring API is considered Legacy. new code should use the URLSearchParams API instead.", + "engines": { + "node": ">=0.4.x" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmmirror.com/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==" + }, + "node_modules/quick-lru": { + "version": "5.1.1", + "resolved": "https://registry.npmmirror.com/quick-lru/-/quick-lru-5.1.1.tgz", + "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==", + "engines": { + "node": ">=10" + } + }, + "node_modules/quill": { + "version": "1.3.7", + "resolved": "https://registry.npmmirror.com/quill/-/quill-1.3.7.tgz", + "integrity": "sha512-hG/DVzh/TiknWtE6QmWAF/pxoZKYxfe3J/d/+ShUWkDvvkZQVTPeVmUJVu1uE6DDooC4fWTiCLh84ul89oNz5g==", + "dependencies": { + "clone": "^2.1.1", + "deep-equal": "^1.0.1", + "eventemitter3": "^2.0.3", + "extend": "^3.0.2", + "parchment": "^1.1.4", + "quill-delta": "^3.6.2" + } + }, + "node_modules/quill-delta": { + "version": "3.6.3", + "resolved": "https://registry.npmmirror.com/quill-delta/-/quill-delta-3.6.3.tgz", + "integrity": "sha512-wdIGBlcX13tCHOXGMVnnTVFtGRLoP0imqxM696fIPwIf5ODIYUHIvHbZcyvGlZFiFhK5XzDC2lpjbxRhnM05Tg==", + "dependencies": { + "deep-equal": "^1.0.1", + "extend": "^3.0.2", + "fast-diff": "1.1.2" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dev": true, + "peer": true, + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", + "dependencies": { + "pify": "^2.3.0" + } + }, + "node_modules/read-cache/node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmmirror.com/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readable-stream": { + "version": "2.3.8", + "resolved": "https://registry.npmmirror.com/readable-stream/-/readable-stream-2.3.8.tgz", + "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/readable-stream/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmmirror.com/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.14.0", + "resolved": "https://registry.npmmirror.com/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz", + "integrity": "sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==" + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.1", + "resolved": "https://registry.npmmirror.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz", + "integrity": "sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==", + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "set-function-name": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/regexpp": { + "version": "3.2.0", + "resolved": "https://registry.npmmirror.com/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/reinterval": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/reinterval/-/reinterval-1.1.0.tgz", + "integrity": "sha512-QIRet3SYrGp0HUHO88jVskiG6seqUGC5iAG7AwI/BV4ypGcuqk9Du6YQBUOUqm9c8pw1eyLoIaONifRua1lsEQ==" + }, + "node_modules/resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmmirror.com/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmmirror.com/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rfdc": { + "version": "1.3.0", + "resolved": "https://registry.npmmirror.com/rfdc/-/rfdc-1.3.0.tgz", + "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==" + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmmirror.com/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/rimraf/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmmirror.com/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + } + }, + "node_modules/rollup": { + "version": "3.29.4", + "resolved": "https://registry.npmmirror.com/rollup/-/rollup-3.29.4.tgz", + "integrity": "sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw==", + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=14.18.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmmirror.com/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "node_modules/sass": { + "version": "1.56.2", + "resolved": "https://registry.npmmirror.com/sass/-/sass-1.56.2.tgz", + "integrity": "sha512-ciEJhnyCRwzlBCB+h5cCPM6ie/6f8HrhZMQOf5vlU60Y1bI1rx5Zb0vlDZvaycHsg/MqFfF1Eq2eokAa32iw8w==", + "devOptional": true, + "dependencies": { + "chokidar": ">=3.0.0 <4.0.0", + "immutable": "^4.0.0", + "source-map-js": ">=0.6.2 <2.0.0" + }, + "bin": { + "sass": "sass.js" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/sax": { + "version": "1.3.0", + "resolved": "https://registry.npmmirror.com/sax/-/sax-1.3.0.tgz", + "integrity": "sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA==" + }, + "node_modules/schema-utils": { + "version": "3.3.0", + "resolved": "https://registry.npmmirror.com/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", + "dev": true, + "peer": true, + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/screenfull": { + "version": "6.0.2", + "resolved": "https://registry.npmmirror.com/screenfull/-/screenfull-6.0.2.tgz", + "integrity": "sha512-AQdy8s4WhNvUZ6P8F6PB21tSPIYKniic+Ogx0AacBMjKP1GUHN2E9URxQHtCusiwxudnCKkdy4GrHXPPJSkCCw==", + "engines": { + "node": "^14.13.1 || >=16.0.0" + } + }, + "node_modules/scroll-into-view-if-needed": { + "version": "2.2.31", + "resolved": "https://registry.npmmirror.com/scroll-into-view-if-needed/-/scroll-into-view-if-needed-2.2.31.tgz", + "integrity": "sha512-dGCXy99wZQivjmjIqihaBQNjryrz5rueJY7eHfTdyWEiR4ttYpsajb14rn9s5d4DY4EcY6+4+U/maARBXJedkA==", + "dependencies": { + "compute-scroll-into-view": "^1.0.20" + } + }, + "node_modules/sdk-base": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/sdk-base/-/sdk-base-2.0.1.tgz", + "integrity": "sha512-eeG26wRwhtwYuKGCDM3LixCaxY27Pa/5lK4rLKhQa7HBjJ3U3Y+f81MMZQRsDw/8SC2Dao/83yJTXJ8aULuN8Q==", + "dependencies": { + "get-ready": "~1.0.0" + } + }, + "node_modules/select": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/select/-/select-1.1.2.tgz", + "integrity": "sha512-OwpTSOfy6xSs1+pwcNrv0RBMOzI39Lp3qQKUTPVVPRjCdNa5JH/oPRiqsesIskK8TVgmRiHwO4KXlV2Li9dANA==" + }, + "node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmmirror.com/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmmirror.com/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/serialize-javascript": { + "version": "6.0.1", + "resolved": "https://registry.npmmirror.com/serialize-javascript/-/serialize-javascript-6.0.1.tgz", + "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==", + "dev": true, + "peer": true, + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/set-function-name": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/set-function-name/-/set-function-name-2.0.1.tgz", + "integrity": "sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==", + "dependencies": { + "define-data-property": "^1.0.1", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "engines": { + "node": ">=8" + } + }, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmmirror.com/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmmirror.com/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "engines": { + "node": ">=14" + } + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/slate": { + "version": "0.72.8", + "resolved": "https://registry.npmmirror.com/slate/-/slate-0.72.8.tgz", + "integrity": "sha512-/nJwTswQgnRurpK+bGJFH1oM7naD5qDmHd89JyiKNT2oOKD8marW0QSBtuFnwEbL5aGCS8AmrhXQgNOsn4osAw==", + "dependencies": { + "immer": "^9.0.6", + "is-plain-object": "^5.0.0", + "tiny-warning": "^1.0.3" + } + }, + "node_modules/slate-history": { + "version": "0.66.0", + "resolved": "https://registry.npmmirror.com/slate-history/-/slate-history-0.66.0.tgz", + "integrity": "sha512-6MWpxGQZiMvSINlCbMW43E2YBSVMCMCIwQfBzGssjWw4kb0qfvj0pIdblWNRQZD0hR6WHP+dHHgGSeVdMWzfng==", + "dependencies": { + "is-plain-object": "^5.0.0" + }, + "peerDependencies": { + "slate": ">=0.65.3" + } + }, + "node_modules/snabbdom": { + "version": "3.5.1", + "resolved": "https://registry.npmmirror.com/snabbdom/-/snabbdom-3.5.1.tgz", + "integrity": "sha512-wHMNIOjkm/YNE5EM3RCbr/+DVgPg6AqQAX1eOxO46zYNvCXjKP5Y865tqQj3EXnaMBjkxmQA5jFuDpDK/dbfiA==", + "engines": { + "node": ">=8.3.0" + } + }, + "node_modules/sortablejs": { + "version": "1.15.0", + "resolved": "https://registry.npmmirror.com/sortablejs/-/sortablejs-1.15.0.tgz", + "integrity": "sha512-bv9qgVMjUMf89wAvM6AxVvS/4MX3sPeN0+agqShejLU5z5GX4C75ow1O2e5k4L6XItUyAK3gH6AxSbXrOM5e8w==" + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmmirror.com/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "devOptional": true, + "peer": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/sourcemap-codec": { + "version": "1.4.8", + "resolved": "https://registry.npmmirror.com/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", + "deprecated": "Please use @jridgewell/sourcemap-codec instead" + }, + "node_modules/spark-md5": { + "version": "3.0.2", + "resolved": "https://registry.npmmirror.com/spark-md5/-/spark-md5-3.0.2.tgz", + "integrity": "sha512-wcFzz9cDfbuqe0FZzfi2or1sgyIrsDwmPwfZC4hiNidPdPINjeUwNfv5kldczoEAcjl9Y1L3SM7Uz2PUEQzxQw==" + }, + "node_modules/split2": { + "version": "3.2.2", + "resolved": "https://registry.npmmirror.com/split2/-/split2-3.2.2.tgz", + "integrity": "sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==", + "dependencies": { + "readable-stream": "^3.0.0" + } + }, + "node_modules/split2/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmmirror.com/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/splitpanes": { + "version": "3.1.5", + "resolved": "https://registry.npmmirror.com/splitpanes/-/splitpanes-3.1.5.tgz", + "integrity": "sha512-r3Mq2ITFQ5a2VXLOy4/Sb2Ptp7OfEO8YIbhVJqJXoFc9hc5nTXXkCvtVDjIGbvC0vdE7tse+xTM9BMjsszP6bw==" + }, + "node_modules/ssf": { + "version": "0.11.2", + "resolved": "https://registry.npmmirror.com/ssf/-/ssf-0.11.2.tgz", + "integrity": "sha512-+idbmIXoYET47hH+d7dfm2epdOMUDjqcB4648sTZ+t2JwoyBFL/insLfB/racrDmsKB3diwsDA696pZMieAC5g==", + "dependencies": { + "frac": "~1.1.2" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/ssr-window": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/ssr-window/-/ssr-window-3.0.0.tgz", + "integrity": "sha512-q+8UfWDg9Itrg0yWK7oe5p/XRCJpJF9OBtXfOPgSJl+u3Xd5KI328RUEvUqSMVM9CiQUEf1QdBzJMkYGErj9QA==" + }, + "node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmmirror.com/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/stream-http": { + "version": "2.8.2", + "resolved": "https://registry.npmmirror.com/stream-http/-/stream-http-2.8.2.tgz", + "integrity": "sha512-QllfrBhqF1DPcz46WxKTs6Mz1Bpc+8Qm6vbqOpVav5odAXwbyzwnEczoWqtxrsmlO+cJqtPrp/8gWKWjaKLLlA==", + "dependencies": { + "builtin-status-codes": "^3.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.3.6", + "to-arraybuffer": "^1.0.0", + "xtend": "^4.0.0" + } + }, + "node_modules/stream-shift": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/stream-shift/-/stream-shift-1.0.1.tgz", + "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==" + }, + "node_modules/stream-wormhole": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/stream-wormhole/-/stream-wormhole-1.1.0.tgz", + "integrity": "sha512-gHFfL3px0Kctd6Po0M8TzEvt3De/xu6cnRrjlfYNhwbhLPLwigI2t1nc6jrzNuaYg5C4YF78PPFuQPzRiqn9ew==", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/string_decoder/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmmirror.com/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmmirror.com/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmmirror.com/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/string-width/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "engines": { + "node": ">=12" + } + }, + "node_modules/string-width/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmmirror.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/strnum": { + "version": "1.0.5", + "resolved": "https://registry.npmmirror.com/strnum/-/strnum-1.0.5.tgz", + "integrity": "sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==" + }, + "node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/svg-tags": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/svg-tags/-/svg-tags-1.0.0.tgz", + "integrity": "sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA==" + }, + "node_modules/tailwindcss": { + "version": "3.2.7", + "resolved": "https://registry.npmmirror.com/tailwindcss/-/tailwindcss-3.2.7.tgz", + "integrity": "sha512-B6DLqJzc21x7wntlH/GsZwEXTBttVSl1FtCzC8WP4oBc/NKef7kaax5jeihkkCEWc831/5NDJ9gRNDK6NEioQQ==", + "dependencies": { + "arg": "^5.0.2", + "chokidar": "^3.5.3", + "color-name": "^1.1.4", + "detective": "^5.2.1", + "didyoumean": "^1.2.2", + "dlv": "^1.1.3", + "fast-glob": "^3.2.12", + "glob-parent": "^6.0.2", + "is-glob": "^4.0.3", + "lilconfig": "^2.0.6", + "micromatch": "^4.0.5", + "normalize-path": "^3.0.0", + "object-hash": "^3.0.0", + "picocolors": "^1.0.0", + "postcss": "^8.0.9", + "postcss-import": "^14.1.0", + "postcss-js": "^4.0.0", + "postcss-load-config": "^3.1.4", + "postcss-nested": "6.0.0", + "postcss-selector-parser": "^6.0.11", + "postcss-value-parser": "^4.2.0", + "quick-lru": "^5.1.1", + "resolve": "^1.22.1" + }, + "bin": { + "tailwind": "lib/cli.js", + "tailwindcss": "lib/cli.js" + }, + "engines": { + "node": ">=12.13.0" + }, + "peerDependencies": { + "postcss": "^8.0.9" + } + }, + "node_modules/tailwindcss/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/tapable": { + "version": "2.2.1", + "resolved": "https://registry.npmmirror.com/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "dev": true, + "peer": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/terser": { + "version": "5.22.0", + "resolved": "https://registry.npmmirror.com/terser/-/terser-5.22.0.tgz", + "integrity": "sha512-hHZVLgRA2z4NWcN6aS5rQDc+7Dcy58HOf2zbYwmFcQ+ua3h6eEFf5lIDKTzbWwlazPyOZsFQO8V80/IjVNExEw==", + "devOptional": true, + "peer": true, + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser-webpack-plugin": { + "version": "5.3.9", + "resolved": "https://registry.npmmirror.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.9.tgz", + "integrity": "sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==", + "dev": true, + "peer": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.17", + "jest-worker": "^27.4.5", + "schema-utils": "^3.1.1", + "serialize-javascript": "^6.0.1", + "terser": "^5.16.8" + }, + "engines": { + "node": ">= 10.13.0" + }, + "peerDependencies": { + "webpack": "^5.1.0" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "uglify-js": { + "optional": true + } + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmmirror.com/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true + }, + "node_modules/thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmmirror.com/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "dependencies": { + "any-promise": "^1.0.0" + } + }, + "node_modules/thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmmirror.com/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "dependencies": { + "thenify": ">= 3.1.0 < 4" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/through": { + "version": "2.3.8", + "resolved": "https://registry.npmmirror.com/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==" + }, + "node_modules/tiny-emitter": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/tiny-emitter/-/tiny-emitter-2.1.0.tgz", + "integrity": "sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q==" + }, + "node_modules/tiny-warning": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/tiny-warning/-/tiny-warning-1.0.3.tgz", + "integrity": "sha512-lBN9zLN/oAf68o3zNXYrdCt1kP8WsiGW8Oo2ka41b2IM5JL/S1CTyX1rW0mb/zSuJun0ZUrDxx4sqvYS2FWzPA==" + }, + "node_modules/to-arraybuffer": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", + "integrity": "sha512-okFlQcoGTi4LQBG/PgSYblw9VOyptsz2KJZqc6qtgGdes8VktzUQkj4BI2blit072iS8VODNcMA+tvnS9dnuMA==" + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "engines": { + "node": ">=4" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmmirror.com/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/ts-md5": { + "version": "1.3.1", + "resolved": "https://registry.npmmirror.com/ts-md5/-/ts-md5-1.3.1.tgz", + "integrity": "sha512-DiwiXfwvcTeZ5wCE0z+2A9EseZsztaiZtGrtSaY5JOD7ekPnR/GoIVD5gXZAlK9Na9Kvpo9Waz5rW64WKAWApg==", + "engines": { + "node": ">=12" + } + }, + "node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmmirror.com/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + }, + "node_modules/tsutils": { + "version": "3.21.0", + "resolved": "https://registry.npmmirror.com/tsutils/-/tsutils-3.21.0.tgz", + "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", + "dev": true, + "dependencies": { + "tslib": "^1.8.1" + }, + "engines": { + "node": ">= 6" + }, + "peerDependencies": { + "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" + } + }, + "node_modules/tsutils/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmmirror.com/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "node_modules/type": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/type/-/type-1.2.0.tgz", + "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==" + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmmirror.com/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmmirror.com/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmmirror.com/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==" + }, + "node_modules/typescript": { + "version": "4.9.4", + "resolved": "https://registry.npmmirror.com/typescript/-/typescript-4.9.4.tgz", + "integrity": "sha512-Uz+dTXYzxXXbsFpM86Wh3dKCxrQqUcVMxwU54orwlJjOpO3ao8L7j5lH+dWfTwgCwIuM9GQ2kvVotzYJMXTBZg==", + "devOptional": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "node_modules/unescape": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/unescape/-/unescape-1.0.1.tgz", + "integrity": "sha512-O0+af1Gs50lyH1nUu3ZyYS1cRh01Q/kUKatTOkSs7jukXE6/NebucDVxyiDsA9AQ4JC1V1jUH9EO8JX2nMDgGQ==", + "dependencies": { + "extend-shallow": "^2.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.0.13", + "resolved": "https://registry.npmmirror.com/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", + "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/upgrade": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/upgrade/-/upgrade-1.1.0.tgz", + "integrity": "sha512-NtkVvqVCqsJo5U3mYRum2Tw6uCltOxfIJ/AfTZeTmw6U39IB5X23xF+kRZ9aiPaORqeiQQ7Q209/ibhOvxzwHA==" + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmmirror.com/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/urllib": { + "version": "2.41.0", + "resolved": "https://registry.npmmirror.com/urllib/-/urllib-2.41.0.tgz", + "integrity": "sha512-pNXdxEv52L67jahLT+/7QE+Fup1y2Gc6EdmrAhQ6OpQIC2rl14oWwv9hvk1GXOZqEnJNwRXHABuwgPOs1CtL7g==", + "dependencies": { + "any-promise": "^1.3.0", + "content-type": "^1.0.2", + "debug": "^2.6.9", + "default-user-agent": "^1.0.0", + "digest-header": "^1.0.0", + "ee-first": "~1.1.1", + "formstream": "^1.1.0", + "humanize-ms": "^1.2.0", + "iconv-lite": "^0.4.15", + "ip": "^1.1.5", + "pump": "^3.0.0", + "qs": "^6.4.0", + "statuses": "^1.3.1", + "utility": "^1.16.1" + }, + "engines": { + "node": ">= 0.10.0" + }, + "peerDependencies": { + "proxy-agent": "^5.0.0" + }, + "peerDependenciesMeta": { + "proxy-agent": { + "optional": true + } + } + }, + "node_modules/urllib/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmmirror.com/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/urllib/node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmmirror.com/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/urllib/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "node_modules/utility": { + "version": "1.18.0", + "resolved": "https://registry.npmmirror.com/utility/-/utility-1.18.0.tgz", + "integrity": "sha512-PYxZDA+6QtvRvm//++aGdmKG/cI07jNwbROz0Ql+VzFV1+Z0Dy55NI4zZ7RHc9KKpBePNFwoErqIuqQv/cjiTA==", + "dependencies": { + "copy-to": "^2.0.1", + "escape-html": "^1.0.3", + "mkdirp": "^0.5.1", + "mz": "^2.7.0", + "unescape": "^1.0.1" + }, + "engines": { + "node": ">= 0.12.0" + } + }, + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmmirror.com/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/vanilla-picker": { + "version": "2.12.2", + "resolved": "https://registry.npmmirror.com/vanilla-picker/-/vanilla-picker-2.12.2.tgz", + "integrity": "sha512-dk0gNeNL9fQFGd1VEhNDQfFlbCqAiksRh1H2tVPlavkH88n/a/y30rXi9PPKrYPTK5kEfPO4xcldt4ts/1wIAg==", + "dependencies": { + "@sphinxxxx/color-conversion": "^2.2.2" + } + }, + "node_modules/vite": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/vite/-/vite-4.0.0.tgz", + "integrity": "sha512-ynad+4kYs8Jcnn8J7SacS9vAbk7eMy0xWg6E7bAhS1s79TK+D7tVFGXVZ55S7RNLRROU1rxoKlvZ/qjaB41DGA==", + "dependencies": { + "esbuild": "^0.16.3", + "postcss": "^8.4.19", + "resolve": "^1.22.1", + "rollup": "^3.7.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + }, + "peerDependencies": { + "@types/node": ">= 14", + "less": "*", + "sass": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "sass": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/vite-plugin-vue-setup-extend": { + "version": "0.4.0", + "resolved": "https://registry.npmmirror.com/vite-plugin-vue-setup-extend/-/vite-plugin-vue-setup-extend-0.4.0.tgz", + "integrity": "sha512-WMbjPCui75fboFoUTHhdbXzu4Y/bJMv5N9QT9a7do3wNMNHHqrk+Tn2jrSJU0LS5fGl/EG+FEDBYVUeWIkDqXQ==", + "dev": true, + "dependencies": { + "@vue/compiler-sfc": "^3.2.29", + "magic-string": "^0.25.7" + }, + "peerDependencies": { + "vite": ">=2.0.0" + } + }, + "node_modules/vue": { + "version": "3.2.45", + "resolved": "https://registry.npmmirror.com/vue/-/vue-3.2.45.tgz", + "integrity": "sha512-9Nx/Mg2b2xWlXykmCwiTUCWHbWIj53bnkizBxKai1g61f2Xit700A1ljowpTIM11e3uipOeiPcSqnmBg6gyiaA==", + "dependencies": { + "@vue/compiler-dom": "3.2.45", + "@vue/compiler-sfc": "3.2.45", + "@vue/runtime-dom": "3.2.45", + "@vue/server-renderer": "3.2.45", + "@vue/shared": "3.2.45" + } + }, + "node_modules/vue-clipboard3": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/vue-clipboard3/-/vue-clipboard3-2.0.0.tgz", + "integrity": "sha512-Q9S7dzWGax7LN5iiSPcu/K1GGm2gcBBlYwmMsUc5/16N6w90cbKow3FnPmPs95sungns4yvd9/+JhbAznECS2A==", + "dependencies": { + "clipboard": "^2.0.6" + } + }, + "node_modules/vue-cropper": { + "version": "1.0.8", + "resolved": "https://registry.npmmirror.com/vue-cropper/-/vue-cropper-1.0.8.tgz", + "integrity": "sha512-EX9XoT5a/PQ62J6KDZz8hhaFi9ME1k2yBZlRfYCm8iySzTcjw0nDBq8Y65HtyHaH2jJwUKgYfD6mdFCE0GhUzA==" + }, + "node_modules/vue-cropperjs": { + "version": "5.0.0", + "resolved": "https://registry.npmmirror.com/vue-cropperjs/-/vue-cropperjs-5.0.0.tgz", + "integrity": "sha512-RhnC8O33uRZNkn74aiHZwNHnBJOXWlS4P6gsRI0lw4cZlWjKSCywZI9oSI9POlIPI6OYv30jvnHMXGch85tw7w==", + "dependencies": { + "cropperjs": "^1.5.6" + }, + "peerDependencies": { + "vue": ">=3.0.0" + } + }, + "node_modules/vue-eslint-parser": { + "version": "9.1.0", + "resolved": "https://registry.npmmirror.com/vue-eslint-parser/-/vue-eslint-parser-9.1.0.tgz", + "integrity": "sha512-NGn/iQy8/Wb7RrRa4aRkokyCZfOUWk19OP5HP6JEozQFX5AoS/t+Z0ZN7FY4LlmWc4FNI922V7cvX28zctN8dQ==", + "dev": true, + "dependencies": { + "debug": "^4.3.4", + "eslint-scope": "^7.1.1", + "eslint-visitor-keys": "^3.3.0", + "espree": "^9.3.1", + "esquery": "^1.4.0", + "lodash": "^4.17.21", + "semver": "^7.3.6" + }, + "engines": { + "node": "^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": ">=6.0.0" + } + }, + "node_modules/vue-eslint-parser/node_modules/eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmmirror.com/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/vue-eslint-parser/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmmirror.com/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/vue-grid-layout": { + "version": "3.0.0-beta1", + "resolved": "https://registry.npmmirror.com/vue-grid-layout/-/vue-grid-layout-3.0.0-beta1.tgz", + "integrity": "sha512-MsW0yfYNtnAO/uDhfZvkP6effxSJxvhAFbIL37x6Rn3vW9xf0WHVefKaSbQMLpSq3mXnR6ut0pg2Cd5lqIIZzg==", + "dependencies": { + "@interactjs/actions": "^1.10.2", + "@interactjs/auto-start": "^1.10.2", + "@interactjs/dev-tools": "^1.10.2", + "@interactjs/interactjs": "^1.10.2", + "@interactjs/modifiers": "^1.10.2", + "element-resize-detector": "^1.2.1", + "mitt": "^2.1.0" + } + }, + "node_modules/vue-grid-layout/node_modules/mitt": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/mitt/-/mitt-2.1.0.tgz", + "integrity": "sha512-ILj2TpLiysu2wkBbWjAmww7TkZb65aiQO+DkVdUTBpBXq+MHYiETENkKFMtsJZX1Lf4pe4QOrTSjIfUwN5lRdg==" + }, + "node_modules/vue-i18n": { + "version": "9.2.2", + "resolved": "https://registry.npmmirror.com/vue-i18n/-/vue-i18n-9.2.2.tgz", + "integrity": "sha512-yswpwtj89rTBhegUAv9Mu37LNznyu3NpyLQmozF3i1hYOhwpG8RjcjIFIIfnu+2MDZJGSZPXaKWvnQA71Yv9TQ==", + "dependencies": { + "@intlify/core-base": "9.2.2", + "@intlify/shared": "9.2.2", + "@intlify/vue-devtools": "9.2.2", + "@vue/devtools-api": "^6.2.1" + }, + "engines": { + "node": ">= 14" + }, + "peerDependencies": { + "vue": "^3.0.0" + } + }, + "node_modules/vue-router": { + "version": "4.1.6", + "resolved": "https://registry.npmmirror.com/vue-router/-/vue-router-4.1.6.tgz", + "integrity": "sha512-DYWYwsG6xNPmLq/FmZn8Ip+qrhFEzA14EI12MsMgVxvHFDYvlr4NXpVF5hrRH1wVcDP8fGi5F4rxuJSl8/r+EQ==", + "dependencies": { + "@vue/devtools-api": "^6.4.5" + }, + "peerDependencies": { + "vue": "^3.2.0" + } + }, + "node_modules/vuedraggable-es": { + "version": "4.1.1", + "resolved": "https://registry.npmmirror.com/vuedraggable-es/-/vuedraggable-es-4.1.1.tgz", + "integrity": "sha512-F35pjSwC8HS/lnaOd+B59nYR4FZmwuhWAzccK9xftRuWds8SU1TZh5myKVM86j5dFOI7S26O64Kwe7LUHnXjlA==", + "dependencies": { + "sortablejs": "1.14.0" + }, + "peerDependencies": { + "vue": "^3.2.31" + } + }, + "node_modules/vuedraggable-es/node_modules/sortablejs": { + "version": "1.14.0", + "resolved": "https://registry.npmmirror.com/sortablejs/-/sortablejs-1.14.0.tgz", + "integrity": "sha512-pBXvQCs5/33fdN1/39pPL0NZF20LeRbLQ5jtnheIPN9JQAaufGjKdWduZn4U7wCtVuzKhmRkI0DFYHYRbB2H1w==" + }, + "node_modules/vxe-table": { + "version": "4.4.1", + "resolved": "https://registry.npmmirror.com/vxe-table/-/vxe-table-4.4.1.tgz", + "integrity": "sha512-yq19+sds2Av625YiS3vpYjdXUN2BFTAyboOT+v5yhi6sroR7WwOnH7jkJ7/Q4U6ZhCDT59u0UOGAPVT27/4OWQ==", + "peerDependencies": { + "vue": "^3.2.28", + "xe-utils": "^3.5.0" + } + }, + "node_modules/watchpack": { + "version": "2.4.0", + "resolved": "https://registry.npmmirror.com/watchpack/-/watchpack-2.4.0.tgz", + "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", + "dev": true, + "peer": true, + "dependencies": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/webpack": { + "version": "5.89.0", + "resolved": "https://registry.npmmirror.com/webpack/-/webpack-5.89.0.tgz", + "integrity": "sha512-qyfIC10pOr70V+jkmud8tMfajraGCZMBWJtrmuBymQKCrLTRejBI8STDp1MCyZu/QTdZSeacCQYpYNQVOzX5kw==", + "dev": true, + "peer": true, + "dependencies": { + "@types/eslint-scope": "^3.7.3", + "@types/estree": "^1.0.0", + "@webassemblyjs/ast": "^1.11.5", + "@webassemblyjs/wasm-edit": "^1.11.5", + "@webassemblyjs/wasm-parser": "^1.11.5", + "acorn": "^8.7.1", + "acorn-import-assertions": "^1.9.0", + "browserslist": "^4.14.5", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.15.0", + "es-module-lexer": "^1.2.1", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.9", + "json-parse-even-better-errors": "^2.3.1", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^3.2.0", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.3.7", + "watchpack": "^2.4.0", + "webpack-sources": "^3.2.3" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-sources": { + "version": "3.2.3", + "resolved": "https://registry.npmmirror.com/webpack-sources/-/webpack-sources-3.2.3.tgz", + "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", + "dev": true, + "peer": true, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/wildcard": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/wildcard/-/wildcard-1.1.2.tgz", + "integrity": "sha512-DXukZJxpHA8LuotRwL0pP1+rS6CS7FF2qStDDE1C7DDg2rLud2PXRMuEDYIPhgEezwnlHNL4c+N6MfMTjCGTng==" + }, + "node_modules/win-release": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/win-release/-/win-release-1.1.1.tgz", + "integrity": "sha512-iCRnKVvGxOQdsKhcQId2PXV1vV3J/sDPXKA4Oe9+Eti2nb2ESEsYHRYls/UjoUW3bIc5ZDO8dTH50A/5iVN+bw==", + "dependencies": { + "semver": "^5.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/win-release/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmmirror.com/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/wmf": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/wmf/-/wmf-1.0.2.tgz", + "integrity": "sha512-/p9K7bEh0Dj6WbXg4JG0xvLQmIadrner1bi45VMJTfnbVHsc7yIajZyoSoK60/dtVBs12Fm6WkUI5/3WAVsNMw==", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/word": { + "version": "0.3.0", + "resolved": "https://registry.npmmirror.com/word/-/word-0.3.0.tgz", + "integrity": "sha512-OELeY0Q61OXpdUfTp+oweA/vtLVg5VDOXh+3he3PNzLGG/y0oylSOC1xRVj0+l4vQ3tj/bB1HVHv1ocXkQceFA==", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmmirror.com/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/wrap-ansi-cjs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmmirror.com/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "engines": { + "node": ">=12" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "engines": { + "node": ">=12" + } + }, + "node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + }, + "node_modules/ws": { + "version": "8.14.2", + "resolved": "https://registry.npmmirror.com/ws/-/ws-8.14.2.tgz", + "integrity": "sha512-wEBG1ftX4jcglPxgFCMJmZ2PLtSbJ2Peg6TmpJFTbe9GZYOQCDPdMYu/Tm0/bGZkw8paZnJY45J4K2PZrLYq8g==", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/xe-utils": { + "version": "3.5.7", + "resolved": "https://registry.npmmirror.com/xe-utils/-/xe-utils-3.5.7.tgz", + "integrity": "sha512-3H+fDBKBR2wLJgyA7k9C/w1Xljx6Maml5ukV0WDY06HjYyGs2FEz6XhcwRCLIDXX4pBP3Gu0nX9DbCeuuRA2Ew==" + }, + "node_modules/xlsx": { + "version": "0.18.5", + "resolved": "https://registry.npmmirror.com/xlsx/-/xlsx-0.18.5.tgz", + "integrity": "sha512-dmg3LCjBPHZnQp5/F/+nnTa+miPJxUXB6vtk42YjBBKayDNagxGEeIdWApkYPOf3Z3pm3k62Knjzp7lMeTEtFQ==", + "dependencies": { + "adler-32": "~1.3.0", + "cfb": "~1.2.1", + "codepage": "~1.15.0", + "crc-32": "~1.2.1", + "ssf": "~0.11.2", + "wmf": "~1.0.1", + "word": "~0.3.0" + }, + "bin": { + "xlsx": "bin/xlsx.njs" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/xml-name-validator": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/xml-name-validator/-/xml-name-validator-4.0.0.tgz", + "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/xml2js": { + "version": "0.6.2", + "resolved": "https://registry.npmmirror.com/xml2js/-/xml2js-0.6.2.tgz", + "integrity": "sha512-T4rieHaC1EXcES0Kxxj4JWgaUQHDk+qwHcYOCFHfiwKz7tOVPLq7Hjq9dM1WCMhylqMEfP7hMcOIChvotiZegA==", + "dependencies": { + "sax": ">=0.6.0", + "xmlbuilder": "~11.0.0" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/xmlbuilder": { + "version": "11.0.1", + "resolved": "https://registry.npmmirror.com/xmlbuilder/-/xmlbuilder-11.0.1.tgz", + "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmmirror.com/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "engines": { + "node": ">=0.4" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmmirror.com/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" + }, + "node_modules/yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmmirror.com/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmmirror.com/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/zrender": { + "version": "5.4.1", + "resolved": "https://registry.npmmirror.com/zrender/-/zrender-5.4.1.tgz", + "integrity": "sha512-M4Z05BHWtajY2241EmMPHglDQAJ1UyHQcYsxDNzD9XLSkPDqMq4bB28v9Pb4mvHnVQ0GxyTklZ/69xCFP6RXBA==", + "dependencies": { + "tslib": "2.3.0" + } + }, + "node_modules/zrender/node_modules/tslib": { + "version": "2.3.0", + "resolved": "https://registry.npmmirror.com/tslib/-/tslib-2.3.0.tgz", + "integrity": "sha512-N82ooyxVNm6h1riLCoyS9e3fuJ3AMG2zIZs2Gd1ATcSFjSA23Q0fzjjZeh0jbJvWVDZ0cJT8yaNNaaXHzueNjg==" + } + } +} diff --git a/web/package.json b/web/package.json index 0a2d57645e688ce4178b7fde9f0a3a21a2cb862e..82aac245a1589c1005f013cbcbd6988e83bd4c28 100644 --- a/web/package.json +++ b/web/package.json @@ -10,10 +10,10 @@ }, "dependencies": { "@element-plus/icons-vue": "^2.0.10", - "@fast-crud/fast-crud": "^1.20.1", - "@fast-crud/fast-extends": "^1.20.1", - "@fast-crud/ui-element": "^1.20.1", - "@fast-crud/ui-interface": "^1.20.1", + "@fast-crud/fast-crud": "1.20.2", + "@fast-crud/fast-extends": "1.20.2", + "@fast-crud/ui-element": "1.20.2", + "@fast-crud/ui-interface": "1.20.2", "@iconify/vue": "^4.1.1", "@types/lodash": "^4.14.202", "@vitejs/plugin-vue-jsx": "^3.0.0", @@ -67,6 +67,8 @@ "@vue/compiler-sfc": "^3.2.45", "eslint": "^8.54.0", "eslint-plugin-vue": "^9.8.0", + "less": "^4.2.0", + "less-loader": "^11.1.3", "prettier": "^2.8.1", "sass": "^1.56.2", "typescript": "^4.9.4", diff --git a/web/src/App.vue b/web/src/App.vue index 0de8738e1bf695ab3a948501a6b22327389b1cb4..95e190fd340717742e986891ca22135a6b9aa67a 100644 --- a/web/src/App.vue +++ b/web/src/App.vue @@ -5,7 +5,8 @@ - + + @@ -25,7 +26,8 @@ import setIntroduction from '/@/utils/setIconfont'; const LockScreen = defineAsyncComponent(() => import('/@/layout/lockScreen/index.vue')); const Setings = defineAsyncComponent(() => import('/@/layout/navBars/breadcrumb/setings.vue')); const CloseFull = defineAsyncComponent(() => import('/@/layout/navBars/breadcrumb/closeFull.vue')); -const Upgrade = defineAsyncComponent(() => import('/@/layout/upgrade/index.vue')); +// 注释编号: django-vue3-admin_App153915:取消更新 +// const Upgrade = defineAsyncComponent(() => import('/@/layout/upgrade/index.vue')); // 定义变量内容 const { messages, locale } = useI18n(); diff --git a/web/src/custom/customColumns.ts b/web/src/custom/customColumns.ts new file mode 100644 index 0000000000000000000000000000000000000000..22f8436f2d9f8cf0c14a98e8ba90abd58edff015 --- /dev/null +++ b/web/src/custom/customColumns.ts @@ -0,0 +1,23 @@ +// 参考http://fast-crud.docmirror.cn/guide/advance/column-type.html#字段merge插件 +import { useColumns, ColumnCompositionProps} from '@fast-crud/fast-crud' +import _ from 'lodash'; + +export const columnRegisterMergeColumnPlugin = () =>{ +const { registerMergeColumnPlugin } = useColumns(); +registerMergeColumnPlugin({ + name: 'column-plugin', + order: 1, + handle: (columnProps: ColumnCompositionProps={},crudOptions:any={}) => { + + // 合并column配置,这里单独配置了column的全局统一配置 + _.merge(columnProps, { + column: { + showOverflowTooltip: true, //这里el-table的属性,在列中浮窗显示超出的内容 + align: 'center', + }, + }); + + return columnProps; + } +}); +} \ No newline at end of file diff --git a/web/src/custom/customDate.ts b/web/src/custom/customDate.ts new file mode 100644 index 0000000000000000000000000000000000000000..6bb723ab20ffd51d611fc7824a6734aa99b58d74 --- /dev/null +++ b/web/src/custom/customDate.ts @@ -0,0 +1,65 @@ +import { useTypes, useColumns, ColumnCompositionProps} from '@fast-crud/fast-crud' +import _ from 'lodash'; + + +//配置一个导出来的名称,等一下别的地方可以导入使用import { readonlyRegisterMergeColumnPlugin } from './custom/customMethod'; +export const customDateRegisterMergeColumnPlugin = () =>{ + + // 注释编号:django-vue3-admin__customDate260113:代码开始行 + // 功能说明:这时对date字段类型的属性进行定制处理 + const { getType } = useTypes() + const selectType = getType('date') //这里直接匹配到date类型 + // 如下对于column及form的字段属性的进行了处理 + selectType.column.component.color='auto' + selectType.column.component.format='YYYY-MM-DD' + selectType.column.component.valueFormat='YYYY-MM-DD' + selectType.form.component.format='YYYY-MM-DD' + selectType.form.component.valueFormat='YYYY-MM-DD' + // 注释编号:django-vue3-admin__customDate260113:代码结束行 + + + + // 注释编号:django-vue3-admin__customDate160013:代码开始行 + // 功能说明:这里是对date类型字段中valueResolve方法的定制处理 + const { registerMergeColumnPlugin } = useColumns(); + registerMergeColumnPlugin({ + name: 'customDate-Plugin', + order: 1, + handle: (columnProps: ColumnCompositionProps={}) => { + // 你可以在此处做你自己的处理 + // 比如你可以定义一个readonly的公共属性,处理该字段只读,不能编辑 + if(columnProps.type == "date"){ + _.merge(columnProps, { + form: { + valueBuilder(context: any){//加载前处理转化 + //如果配置在form下,则表示将行数据的值转化为表单组件所需要的值 + //在点击编辑按钮之后,弹出表单对话框之前执行转化。 + // 也就是说在被始化form的时候,就把日期格式给转化为正确的格式了. + let value = context.form[columnProps.key] + if (value !== null && typeof(value) !== 'string' && typeof(value) === 'object') { + context.form[columnProps.key] = value.format('YYYY-MM-DD'); + } + + }, + valueResolve(context: any){//提交前再处理转化 + //与builder相反,提交表单时,需要将value值转换为后台所需要的格式提交给后台 + let value = context.form[columnProps.key] + //这里要判断value是非空,是object对象及不是字符串(新增的时候传进来就是字符串而非对象) + if (value !== null && typeof(value) !== 'string' && typeof(value) === 'object') { + context.form[columnProps.key] = value.format('YYYY-MM-DD'); + } + }, + + }, + + }); + } + + return columnProps; + } + }); + // 注释编号:django-vue3-admin__customDate160013:代码结束行 + + + + } diff --git a/web/src/custom/ipInputFieldType.ts b/web/src/custom/ipInputFieldType.ts new file mode 100644 index 0000000000000000000000000000000000000000..7d85321932356b8dc26edeaebd9c0d62f812e39a --- /dev/null +++ b/web/src/custom/ipInputFieldType.ts @@ -0,0 +1,15 @@ + +import { useTypes } from '@fast-crud/fast-crud' + +export const ipInputFieldTyps = () =>{ +const { addTypes } = useTypes() +addTypes({ + 'ip_input':{ //如果与官方字段类型同名,将会覆盖官方的字段类型 + form: { + helper:'只能输入格式为xxx.xxx.xxx.xxx的IP地址', + rules: [{ pattern:/^(25[0-5]|2[0-4]\d|[0-1]?\d?\d)(\.(25[0-5]|2[0-4]\d|[0-1]?\d?\d)){3}$/, message: '格式如192.168.1.1或255.255.255.0'}], + component: { name: 'el-input' } + }, + } +}) +} \ No newline at end of file diff --git a/web/src/custom/readOnyMethod.ts b/web/src/custom/readOnyMethod.ts new file mode 100644 index 0000000000000000000000000000000000000000..caa05027f3c9d5e4b479c464e4feb87582abf095 --- /dev/null +++ b/web/src/custom/readOnyMethod.ts @@ -0,0 +1,24 @@ +// 创建一个readonly的方法,参考官方http://fast-crud.docmirror.cn/guide/advance/column-type.html#%E5%AD%97%E6%AE%B5merge%E6%8F%92%E4%BB%B6 +import { useColumns, ColumnCompositionProps } from '@fast-crud/fast-crud' +import _ from 'lodash'; + +//配置一个导出来的名称,等一下别的地方可以导入使用import { readonlyRegisterMergeColumnPlugin } from './custom/customMethod'; +export const readonlyRegisterMergeColumnPlugin = () =>{ +const { registerMergeColumnPlugin } = useColumns(); +registerMergeColumnPlugin({ + name: 'readonly-plugin', + order: 1, + handle: (columnProps: ColumnCompositionProps={},crudOptions:any={}) => { + // 你可以在此处做你自己的处理 + // 比如你可以定义一个readonly的公共属性,处理该字段只读,不能编辑 + if (columnProps.readonly) { + // 合并column配置 + _.merge(columnProps, { + form: {show: false}, + viewForm: {show: true}, + }); + } + return columnProps; + } +}); +} \ No newline at end of file diff --git a/web/src/layout/footer/index.vue b/web/src/layout/footer/index.vue index 67e6e5c07b00a4a9be9f1c42449528f7a3892a22..4de62ad0e9f25b50926ea9c9b7f8f8ec2a8a6293 100644 --- a/web/src/layout/footer/index.vue +++ b/web/src/layout/footer/index.vue @@ -1,11 +1,17 @@ + + + + diff --git a/web/src/layout/logo/index.vue b/web/src/layout/logo/index.vue index 1a656bbf4eb1e9cd3837f48e058462699e4b478a..49d4c4c034f85e023ee4f8865dc93b58a0ca926f 100644 --- a/web/src/layout/logo/index.vue +++ b/web/src/layout/logo/index.vue @@ -1,18 +1,25 @@ + + diff --git a/web/src/views/system/demo/api.ts b/web/src/views/PublicResource/company/api.ts similarity index 58% rename from web/src/views/system/demo/api.ts rename to web/src/views/PublicResource/company/api.ts index defefc49441777cb5a1c1768fdd3fd7d7a6718f8..d59cceb2189770b873c683f6ddc07ceb697e4f01 100644 --- a/web/src/views/system/demo/api.ts +++ b/web/src/views/PublicResource/company/api.ts @@ -1,8 +1,11 @@ -import { request } from '/@/utils/service'; -import { UserPageQuery, AddReq, DelReq, EditReq, InfoReq } from '@fast-crud/fast-crud'; +import { request,downloadFile } from '/@/utils/service'; +import { PageQuery, AddReq, DelReq, EditReq, InfoReq } from '@fast-crud/fast-crud'; -export const apiPrefix = '/api/system/login_log/'; -export function GetList(query: UserPageQuery) { + +export const apiPrefix = '/api/company/'; + + +export function GetList(query: PageQuery) { return request({ url: apiPrefix, method: 'get', @@ -39,3 +42,11 @@ export function DelObj(id: DelReq) { data: { id }, }); } + +export function exportData(params:any){ + return downloadFile({ + url: apiPrefix + 'export_data/', + params: params, + method: 'get' + }) +} diff --git a/web/src/views/PublicResource/company/crud.tsx b/web/src/views/PublicResource/company/crud.tsx new file mode 100644 index 0000000000000000000000000000000000000000..f328c6e5e6e0ad9d6fb97ed04bbaf4babbba19eb --- /dev/null +++ b/web/src/views/PublicResource/company/crud.tsx @@ -0,0 +1,87 @@ +import { CrudOptions, AddReq, DelReq, EditReq, dict, CrudExpose, compute, UserPageQuery, CreateCrudOptionsRet } from '@fast-crud/fast-crud'; +import _ from 'lodash-es'; +import * as api from './api'; +import { dictionary } from '/@/utils/dictionary'; +import {inject} from "vue"; + +import {auth} from '/@/utils/authFunction' + + +//此处为crudOptions配置 +export default function ({ crudExpose}: { crudExpose: CrudExpose}): CreateCrudOptionsRet { + const pageRequest = async (query: any) => { + return await api.GetList(query); + }; + const editRequest = async ({ form, row }: EditReq) => { + if (row.id) { + form.id = row.id; + } + return await api.UpdateObj(form); + }; + const delRequest = async ({ row }: DelReq) => { + return await api.DelObj(row.id); + }; + const addRequest = async ({ form }: AddReq) => { + return await api.AddObj(form); + }; + + const exportRequest = async (query: UserPageQuery) => { + return await api.exportData(query) + }; + + + + + + + return { + crudOptions: { + request: { + pageRequest, + addRequest, + editRequest, + delRequest, + }, + actionbar: { + buttons: { + export:{ + click(){ + return exportRequest(crudExpose.getSearchFormData()) + } + } + } + }, + form: { + col: { span: 24 }, + labelWidth: '100px', + wrapper: { + is: 'el-dialog', + width: '600px', + }, + }, + columns: { + + + title: { + title: '公司', + type: 'input', + search: { show: true}, + column: { + minWidth: 120, + sortable: 'custom', + }, + form: { + rules: [{ required: true, message: '公司名称必填' }], + component: { + placeholder: '请输入公司名称', + }, + }, + }, + + + + + }, + }, + }; +}; diff --git a/web/src/views/PublicResource/company/index.vue b/web/src/views/PublicResource/company/index.vue new file mode 100644 index 0000000000000000000000000000000000000000..40ad4eb4cc89dac192c83ece6133a97298edbeeb --- /dev/null +++ b/web/src/views/PublicResource/company/index.vue @@ -0,0 +1,58 @@ + + + + + diff --git a/web/src/views/PublicResource/department/api.ts b/web/src/views/PublicResource/department/api.ts new file mode 100644 index 0000000000000000000000000000000000000000..28d3058c733fdf6f222e31e0ffdd6b36011da90a --- /dev/null +++ b/web/src/views/PublicResource/department/api.ts @@ -0,0 +1,50 @@ +import { request,downloadFile } from '/@/utils/service'; +import { PageQuery, AddReq, DelReq, EditReq, InfoReq } from '@fast-crud/fast-crud'; + +export const apiPrefix = '/api/department/'; + +export function GetList(query: PageQuery) { + return request({ + url: apiPrefix, + method: 'get', + params: query, + }); +} +export function GetObj(id: InfoReq) { + return request({ + url: apiPrefix + id, + method: 'get', + }); +} + +export function AddObj(obj: AddReq) { + return request({ + url: apiPrefix, + method: 'post', + data: obj, + }); +} + +export function UpdateObj(obj: EditReq) { + return request({ + url: apiPrefix + obj.id + '/', + method: 'put', + data: obj, + }); +} + +export function DelObj(id: DelReq) { + return request({ + url: apiPrefix + id + '/', + method: 'delete', + data: { id }, + }); +} + +export function exportData(params:any){ + return downloadFile({ + url: apiPrefix + 'export_data/', + params: params, + method: 'get' + }) +} diff --git a/web/src/views/PublicResource/department/crud.tsx b/web/src/views/PublicResource/department/crud.tsx new file mode 100644 index 0000000000000000000000000000000000000000..735b43200f0fd44796bff6daffa03f1f0889ee0e --- /dev/null +++ b/web/src/views/PublicResource/department/crud.tsx @@ -0,0 +1,87 @@ +import { CrudOptions, AddReq, DelReq, EditReq, dict, CrudExpose, compute, UserPageQuery, CreateCrudOptionsRet} from '@fast-crud/fast-crud'; +import _ from 'lodash-es'; +import * as api from './api'; +import { dictionary } from '/@/utils/dictionary'; +import {inject} from "vue"; + +import {auth} from '/@/utils/authFunction' + + +//此处为crudOptions配置 +export default function ({ crudExpose}: { crudExpose: CrudExpose}): CreateCrudOptionsRet { + const pageRequest = async (query: any) => { + return await api.GetList(query); + }; + const editRequest = async ({ form, row }: EditReq) => { + if (row.id) { + form.id = row.id; + } + return await api.UpdateObj(form); + }; + const delRequest = async ({ row }: DelReq) => { + return await api.DelObj(row.id); + }; + const addRequest = async ({ form }: AddReq) => { + return await api.AddObj(form); + }; + + const exportRequest = async (query: UserPageQuery) => { + return await api.exportData(query) + }; + + + + + + + return { + crudOptions: { + request: { + pageRequest, + addRequest, + editRequest, + delRequest, + }, + actionbar: { + buttons: { + export:{ + click(){ + return exportRequest(crudExpose.getSearchFormData()) + } + } + } + }, + form: { + col: { span: 24 }, + labelWidth: '100px', + wrapper: { + is: 'el-dialog', + width: '600px', + }, + }, + columns: { + + + title: { + title: '公司', + type: 'input', + search: { show: true}, + column: { + minWidth: 120, + sortable: 'custom', + }, + form: { + rules: [{ required: true, message: '公司名称必填' }], + component: { + placeholder: '请输入公司名称', + }, + }, + }, + + + + + }, + }, + }; +}; diff --git a/web/src/views/PublicResource/department/index.vue b/web/src/views/PublicResource/department/index.vue new file mode 100644 index 0000000000000000000000000000000000000000..00627d8588116e4c64fcea2876838767a430876f --- /dev/null +++ b/web/src/views/PublicResource/department/index.vue @@ -0,0 +1,59 @@ + + + + + diff --git a/web/src/views/PublicResource/globalDictModelViewSet/api.ts b/web/src/views/PublicResource/globalDictModelViewSet/api.ts new file mode 100644 index 0000000000000000000000000000000000000000..00c18eac410613f9e78cc4d1c1b8c9d13fc38f7b --- /dev/null +++ b/web/src/views/PublicResource/globalDictModelViewSet/api.ts @@ -0,0 +1,50 @@ +import { request,downloadFile } from '/@/utils/service'; +import { PageQuery, AddReq, DelReq, EditReq, InfoReq } from '@fast-crud/fast-crud'; + +export const apiPrefix = '/api/globalDictModelViewSet/'; + +export function GetList(query: PageQuery) { + return request({ + url: apiPrefix, + method: 'get', + params: query, + }); +} +export function GetObj(id: InfoReq) { + return request({ + url: apiPrefix + id, + method: 'get', + }); +} + +export function AddObj(obj: AddReq) { + return request({ + url: apiPrefix, + method: 'post', + data: obj, + }); +} + +export function UpdateObj(obj: EditReq) { + return request({ + url: apiPrefix + obj.id + '/', + method: 'put', + data: obj, + }); +} + +export function DelObj(id: DelReq) { + return request({ + url: apiPrefix + id + '/', + method: 'delete', + data: { id }, + }); +} + +export function exportData(params:any){ + return downloadFile({ + url: apiPrefix + 'export_data/', + params: params, + method: 'get' + }) +} diff --git a/web/src/views/PublicResource/globalDictModelViewSet/crud.tsx b/web/src/views/PublicResource/globalDictModelViewSet/crud.tsx new file mode 100644 index 0000000000000000000000000000000000000000..130bda7063bf0655850ac1226baf672c2504a2b2 --- /dev/null +++ b/web/src/views/PublicResource/globalDictModelViewSet/crud.tsx @@ -0,0 +1,224 @@ +import { CrudOptions, AddReq, DelReq, EditReq, dict, CrudExpose, UserPageQuery, CreateCrudOptionsRet, CreateCrudOptionsProps} from '@fast-crud/fast-crud'; +import _ from 'lodash-es'; +import * as api from './api'; +import { request } from '/@/utils/service'; +import { dictionary } from '/@/utils/dictionary'; +import { useRouter } from "vue-router"; +import { successNotification } from '/@/utils/message'; + + + + + + + +//此处为crudOptions配置 +// export default function ({ crudExpose}: { crudExpose: CrudExpose}): CreateCrudOptionsRet { + +export default function ({ crudExpose }: CreateCrudOptionsProps): CreateCrudOptionsRet { + +const {crudBinding} = crudExpose + + const pageRequest = async (query: any) => { + return await api.GetList(query); + }; + const editRequest = async ({ form, row }: EditReq) => { + if (row.id) { + form.id = row.id; + } + return await api.UpdateObj(form); + }; + const delRequest = async ({ row }: DelReq) => { + return await api.DelObj(row.id); + }; + const addRequest = async ({ form }: AddReq) => { + return await api.AddObj(form); + }; + + const exportRequest = async (query: UserPageQuery) => { + return await api.exportData(query) + }; + + + + const router = useRouter(); + + return { + crudOptions: { + request: { + pageRequest, + addRequest, + editRequest, + delRequest, + }, + form: { + col: { span: 12 }, //配置成一行两个元素 + labelPosition: "left", + labelWidth: "auto", //配置成lable的宽为自动 + requireAsteriskPosition:"right", //星号的位置 + row: { gutter: 40 } , + async afterSubmit(ctx: any) { //这里是配置点击保存之后做的操作 + // 增加crud提示 + if (ctx.res.code == 2000) { + successNotification(ctx.res.msg); + //刷新页面,重新请求数据回来,如下三个字典都要刷新一下请求 + await ctx.getComponentRef('dictMark').reloadDict() + await ctx.getComponentRef('belongSystem').reloadDict() + await ctx.getComponentRef('belogTable').reloadDict() + } + else if (ctx.res.code == 4000){ + return false //作者已经修复了这个问题 注释编号:django-vue3-admin__settings065210:这里未来fastcrud作者可能会改为直接返回false便可,期待https://github.com/fast-crud/fast-crud/issues/270 + + } + }, + + + + }, + actionbar: { + buttons: { + export:{ + click(){ + return exportRequest(crudExpose.getSearchFormData()) + } + } + } + }, + + columns: { + belongSystem: { + title: '归属系统', + search: { + show: true, + }, + type: 'dict-select', + dict: dict({ + + value: 'id', + label: 'dictName', + getData: async ({ url }: { url: string }) => { + //这里查询到dictName=sysName的id返回来,再给到下面的request进行拼接请求 + const curId = await request({ + url: '/api/globalDictModelViewSet/?dictName=sysName', + }).then((ret: any) => { + return ret.data[0].id; + }); + + return request({ + url: `/api/globalDictModelViewSet/?limit=999&dictMark=${curId}`, + }).then((ret: any) => { + return ret.data; + }); + }, + }), + column: { + minWidth: 100, //最小列宽 + }, + }, + + belogTable: { + title: '归属使用的表格', + search: { + show: true, + }, + type: 'dict-select', + dict: dict({ + value: 'id', + label: 'dictName', + getData: async ({ url }: { url: string }) => { + + const curId = await request({ + url: '/api/globalDictModelViewSet/?dictName=tableName', + }).then((ret: any) => { + return ret.data[0].id; + }); + + return request({ + url: `/api/globalDictModelViewSet/?limit=999&dictMark=${curId}`, + }).then((ret: any) => { + return ret.data; + }); + }, + }), + column: { + minWidth: 100, //最小列宽 + }, + }, + dictMark: { + title: '字典标记', + search: { + show: true, + }, + type: 'dict-select', + dict: dict({ + value: 'id', + label: 'dictName', + getData: async ({ url }: { url: string }) => { + const curId = await request({ + url: '/api/globalDictModelViewSet/?dictName=dictMark', + }).then((ret: any) => { + return ret.data[0].id; + }); + + return request({ + url: `/api/globalDictModelViewSet/?limit=999&dictMark=${curId}`, + }).then((ret: any) => { + return ret.data; + }); + }, + }), + column: { + minWidth: 100, //最小列宽 + }, + form:{ + bottomRender({ value }) { + return 字典标记只能是纯字母(不分大小写); + }, + }, + }, + dictNum: { + title: '字典序列', + type: 'number', + search: { show: false }, + column: { + minWidth: 120, + sortable: 'custom', + }, + form: { + rules: [{ type: 'number', required: true, message: '字典序列必填' }], + value:0, //配置该字段为的默认值为0,这与后台要搭配使用也是可以的,后端字段配置default=0 + component: { + placeholder: '请输入字典序列', + }, + }, + }, + dictName: { + title: '字典名称', + type: 'input', + search: { show: true}, + column: { + minWidth: 120, + sortable: 'custom', + }, + form: { + rules: [{ required: true, message: '字典名称必填' }], + component: { + placeholder: '请输入字典名称', + }, + bottomRender({ value }) { + return 如录入是为字典标记必须是纯字母; + }, + }, + }, + + + + + }, + + + + + }, + }; +}; diff --git a/web/src/views/PublicResource/globalDictModelViewSet/index.vue b/web/src/views/PublicResource/globalDictModelViewSet/index.vue new file mode 100644 index 0000000000000000000000000000000000000000..94716f500e5239c0c93a5412b53f06f807b0412a --- /dev/null +++ b/web/src/views/PublicResource/globalDictModelViewSet/index.vue @@ -0,0 +1,55 @@ + + + + + diff --git a/web/src/views/PublicResource/organization/api.ts b/web/src/views/PublicResource/organization/api.ts new file mode 100644 index 0000000000000000000000000000000000000000..47cb2f3dfc9d377ceb0f6787b3686f5b46eaa2f0 --- /dev/null +++ b/web/src/views/PublicResource/organization/api.ts @@ -0,0 +1,50 @@ +import { request,downloadFile } from '/@/utils/service'; +import { PageQuery, AddReq, DelReq, EditReq, InfoReq } from '@fast-crud/fast-crud'; + +export const apiPrefix = '/api/organization/'; + +export function GetList(query: PageQuery) { + return request({ + url: apiPrefix, + method: 'get', + params: query, + }); +} +export function GetObj(id: InfoReq) { + return request({ + url: apiPrefix + id, + method: 'get', + }); +} + +export function AddObj(obj: AddReq) { + return request({ + url: apiPrefix, + method: 'post', + data: obj, + }); +} + +export function UpdateObj(obj: EditReq) { + return request({ + url: apiPrefix + obj.id + '/', + method: 'put', + data: obj, + }); +} + +export function DelObj(id: DelReq) { + return request({ + url: apiPrefix + id + '/', + method: 'delete', + data: { id }, + }); +} + +export function exportData(params:any){ + return downloadFile({ + url: apiPrefix + 'export_data/', + params: params, + method: 'get' + }) +} diff --git a/web/src/views/PublicResource/organization/crud.tsx b/web/src/views/PublicResource/organization/crud.tsx new file mode 100644 index 0000000000000000000000000000000000000000..4a64857f87c9df8db88800f052021fca91b573d0 --- /dev/null +++ b/web/src/views/PublicResource/organization/crud.tsx @@ -0,0 +1,312 @@ +import { CrudOptions, AddReq, DelReq, EditReq, dict, CrudExpose, UserPageQuery, CreateCrudOptionsRet} from '@fast-crud/fast-crud'; +import _ from 'lodash-es'; +import * as api from './api'; +import { request } from '/@/utils/service'; +import { dictionary } from '/@/utils/dictionary'; +import { useRouter } from "vue-router"; +import {inject} from "vue"; + + +// 注释编号:django-vue3-admin-crud372214:导入权限验证函数 +import {auth} from '/@/utils/authFunction' + + + + +// 注释编号:django-vue3-admin__crud400415:代码开始行 +// 功能说明:导入懒加载外键对应的crud进行复用 +import it_area from "../../PublicResource/area/crud"; +import company from "../../PublicResource/company/crud"; +import department from "../../PublicResource/department/crud"; + +// 注释编号:django-vue3-admin__crud400415:代码结束行 + + +//此处为crudOptions配置 +export default function ({ crudExpose}: { crudExpose: CrudExpose}): CreateCrudOptionsRet { + const pageRequest = async (query: any) => { + return await api.GetList(query); + }; + const editRequest = async ({ form, row }: EditReq) => { + if (row.id) { + form.id = row.id; + } + return await api.UpdateObj(form); + }; + const delRequest = async ({ row }: DelReq) => { + return await api.DelObj(row.id); + }; + const addRequest = async ({ form }: AddReq) => { + return await api.AddObj(form); + }; + + const exportRequest = async (query: UserPageQuery) => { + return await api.exportData(query) + }; + + + + + + + + const router = useRouter(); + + return { + crudOptions: { + request: { + pageRequest, + addRequest, + editRequest, + delRequest, + }, + form: { + col: { span: 12 }, //配置成一行两个元素 + labelPosition: "left", + labelWidth: "auto", //配置成lable的宽为自动 + requireAsteriskPosition:"right", //星号的位置 + row: { gutter: 40 } , + }, + actionbar: { + buttons: { + export:{ + click(){ + return exportRequest(crudExpose.getSearchFormData()) + } + } + } + }, + columns: { + area: { + title: '区域', + search: { + // disabled: true, + show: true, + }, + type: 'table-select', + dict: dict({ + isTree: true, + value: 'id', + label: 'title', + getNodesByValues: async (values: any[]) => { + if (!values.includes("")) { + return request({ + url: '/api/it_area/' + "getbyIds/", + method: "post", + data: { values } + }).then((ret: any) => { + return ret.data; + }); + } + }, + }), + column: { + minWidth: 150, //最小列宽 + }, + form: { + helper: { + render() { + return
区域是必需要填写的
; + } + }, + rules: [ + // 表单校验规则 + { + required: true, + message: '必填项', + }, + ], + component: { + rowKey: "id", //element-plus 必传 + createCrudOptions: it_area, + filterable: true, + placeholder: '请选择', + props: { + props: { + value: 'id', + label: 'title', + }, + }, + }, + suffixRender() { + function gotoAddArea() { + // 这里是跳转至相应的路由 + router.push({ path: "/area/" }); + } + return ( + // 这里配置一个跳转的按钮及引用函数 + + 跳转 + + ); + }, + }, + }, + company: { + title: '公司', + search: { + // disabled: true, + show: true, + }, + type: 'table-select', + dict: dict({ + isTree: true, + value: 'id', + label: 'title', + getNodesByValues: async (values: any[]) => { + if (!values.includes("")) { + return request({ + url: '/api/company/' + "getbyIds/", + method: "post", + data: { values } + }).then((ret: any) => { + return ret.data; + }); + } + }, + }), + column: { + minWidth: 150, //最小列宽 + }, + form: { + rules: [ + // 表单校验规则 + { + required: true, + message: '必填项', + }, + ], + component: { + rowKey: "id", //element-plus 必传 + createCrudOptions: company, + filterable: true, + placeholder: '请选择', + props: { + props: { + value: 'id', + label: 'title', + }, + }, + }, + }, + }, + + department: { + title: '部门', + search: { + // disabled: true, + show: true + }, + type: 'table-select', + dict: dict({ + isTree: true, + value: 'id', + label: 'title', + getNodesByValues: async (values: any[]) => { + if (!values.includes("")) { + return request({ + url: '/api/department/' + "getbyIds/", + method: "post", + data: { values } + }).then((ret: any) => { + return ret.data; + }); + } + }, + }), + column: { + minWidth: 150, //最小列宽 + }, + form: { + rules: [ + // 表单校验规则 + { + required: true, + message: '必填项', + }, + ], + component: { + rowKey: "id", //element-plus 必传 + createCrudOptions: department, + filterable: true, + placeholder: '请选择', + props: { + props: { + value: 'id', + label: 'title', + }, + }, + }, + }, + }, + + use: { + title: '资源名称', + type: 'input', + search: { show: true}, + column: { + minWidth: 120, + sortable: 'custom', + }, + form: { + rules: [{ required: true, message: '资源名称必填' }], + component: { + placeholder: '请输入资源名称', + }, + }, + }, + or_use_status: { + title: '员工状态', + type: 'dict-select', + dict: dict({ + value: 'id', + label: 'dictName', // 注释编号:django-vue3-admin__crud050016:这里要添加为字典名称的字段 + getData: async ({ url }: { url: string }) => { + const curId = await request({ + // 注释编号:django-vue3-admin__crud400016:请求回来字典名称为PersonnelStatus对象ID + url: '/api/globalDictModelViewSet/?dictName=PersonnelStatus', + }).then((ret: any) => { + return ret.data[0].id; + }); + // 注释编号:django-vue3-admin__crud200116:通过上面请求回来的PersonnelStatus对象ID来拼接直正要拿到的字典名称需求 + return request({ + url: `/api/globalDictModelViewSet/?limit=999&dictMark=${curId}`, + }).then((ret: any) => { + return ret.data; + }); + }, + }), + form: { + component: { + span: 12, + }, + }, + component: { props: { color: 'auto' } }, // 自动染色 + }, + date: { + title: '入职时间', + type: 'date', + search: { show: false }, + form: { + rules: [{ required: true, message: '入职时间必填' }], + component: { + placeholder: '请输入入职时间', + } + }, + column: { + align: "center", + width: 120, + } + }, + + + + + }, + + + + + }, + }; +}; diff --git a/web/src/views/PublicResource/organization/index.vue b/web/src/views/PublicResource/organization/index.vue new file mode 100644 index 0000000000000000000000000000000000000000..5c4c14f49278ec5dfd039fdc6e4a5a3b75755224 --- /dev/null +++ b/web/src/views/PublicResource/organization/index.vue @@ -0,0 +1,54 @@ + + + + + diff --git a/web/src/views/PublicResource/organization/viewAddEdit.vue b/web/src/views/PublicResource/organization/viewAddEdit.vue new file mode 100644 index 0000000000000000000000000000000000000000..7b408afa75ac4f01c87b40f46e94efe1df92f32f --- /dev/null +++ b/web/src/views/PublicResource/organization/viewAddEdit.vue @@ -0,0 +1,227 @@ + + + \ No newline at end of file diff --git a/web/src/views/component/FormInnerCreateWindows.tsx b/web/src/views/component/FormInnerCreateWindows.tsx new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/web/src/views/crud_demo/CrudDemoModelViewSet/api.ts b/web/src/views/crud_demo/CrudDemoModelViewSet/api.ts new file mode 100644 index 0000000000000000000000000000000000000000..b6d93bfabcf876ea61e5075cb2b2a124bc168a8a --- /dev/null +++ b/web/src/views/crud_demo/CrudDemoModelViewSet/api.ts @@ -0,0 +1,50 @@ +import { request,downloadFile } from '/@/utils/service'; +import { PageQuery, AddReq, DelReq, EditReq, InfoReq } from '@fast-crud/fast-crud'; + +export const apiPrefix = '/api/CrudDemoModelViewSet/'; + +export function GetList(query: PageQuery) { + return request({ + url: apiPrefix, + method: 'get', + params: query, + }); +} +export function GetObj(id: InfoReq) { + return request({ + url: apiPrefix + id, + method: 'get', + }); +} + +export function AddObj(obj: AddReq) { + return request({ + url: apiPrefix, + method: 'post', + data: obj, + }); +} + +export function UpdateObj(obj: EditReq) { + return request({ + url: apiPrefix + obj.id + '/', + method: 'put', + data: obj, + }); +} + +export function DelObj(id: DelReq) { + return request({ + url: apiPrefix + id + '/', + method: 'delete', + data: { id }, + }); +} + +export function exportData(params:any){ + return downloadFile({ + url: apiPrefix + 'export_data/', + params: params, + method: 'get' + }) +} diff --git a/web/src/views/crud_demo/CrudDemoModelViewSet/crud.tsx b/web/src/views/crud_demo/CrudDemoModelViewSet/crud.tsx new file mode 100644 index 0000000000000000000000000000000000000000..375bd678a952b2bffeac4ac24c51f11947f98fcb --- /dev/null +++ b/web/src/views/crud_demo/CrudDemoModelViewSet/crud.tsx @@ -0,0 +1,188 @@ +import { AddReq, DelReq, EditReq, dict, CrudExpose, UserPageQuery, CreateCrudOptionsRet} from '@fast-crud/fast-crud'; +import * as api from './api'; +import { request } from '/@/utils/service'; + + +//此处为crudOptions配置 +export default function ({ crudExpose}: { crudExpose: CrudExpose}): CreateCrudOptionsRet { + const pageRequest = async (query: any) => { + return await api.GetList(query); + }; + const editRequest = async ({ form, row }: EditReq) => { + if (row.id) { + form.id = row.id; + } + return await api.UpdateObj(form); + }; + const delRequest = async ({ row }: DelReq) => { + return await api.DelObj(row.id); + }; + const addRequest = async ({ form }: AddReq) => { + return await api.AddObj(form); + }; + + const exportRequest = async (query: UserPageQuery) => { + return await api.exportData(query) + }; + + return { + crudOptions: { + request: { + pageRequest, + addRequest, + editRequest, + delRequest, + }, + actionbar: { + buttons: { + export:{ + click(){ + return exportRequest(crudExpose.getSearchFormData()) + } + } + } + }, + columns: { + goods: { + title: '商品', + type: 'input', + search: { show: true}, + column: { + minWidth: 120, + sortable: 'custom', + }, + form: { + helper: { + render() { + return
商品是必需要填写的
; + } + }, + rules: [{ required: true, message: '商品名称必填' }], + component: { + placeholder: '请输入商品名称', + }, + }, + }, + inventory: { + title: '库存量', + type: 'number', + search: { show: false }, + column: { + minWidth: 120, + sortable: 'custom', + }, + form: { + rules: [{ required: true, message: '库存量必填' }], + component: { + placeholder: '请输入库存量', + }, + }, + }, + + goods_price: { + title: '商品定价', + type: 'text', + search: { show: false }, + column: { + minWidth: 120, + sortable: 'custom', + }, + form: { + rules: [{ required: true, message: '商品定价必填' }], + component: { + placeholder: '请输入商品定价', + }, + }, + }, + purchase_goods_date: { + title: '进货时间', + type: 'date', + search: { show: false }, + form: { + // rules: [{ required: true, message: '进货时间必填' }], + component: { + //显示格式化 + format: "YYYY-MM-DD", + //输入值格式 + valueFormat: "YYYY-MM-DD", + placeholder: '请输入进货时间', + } + }, + column: { + align: "center", + width: 120, + component: { name: "fs-date-format", format: "YYYY-MM-DD" } + } + }, + + // 注释编号:django-vue3-admin__crud432216:代码开始行 + // 功能说明:这里添加多对多字段的属性,注意,主要是配置了form里面的多行选择及隐藏显示 + // goodstypes: { + // title: '商品类型', + // search: { + // // disabled: true, + // show: true, + // }, + // type: 'dict-select', + // dict: dict({ + // // isTree: true, + // url: '/api/goodstype/?limit=999', + // value: 'id', + // label: 'title', + // getData: async ({ url }: { url: string }) => { + // return request({ + // url: url, + // }).then((ret: any) => { + // return ret.data; + // }); + // }, + // }), + // column: { + // minWidth: 100, //最小列宽 + // }, + // form:{ + // component:{ multiple:true }, + // show: false, + // }, //用户自定义配置 + // }, + + // goodsport: { + // title: '端口', + // search: { + // // disabled: true, + // show: true, + // }, + // type: 'dict-select', + // dict: dict({ + // // isTree: true, + // url: '/api/goodstypeportModel/?limit=999', + // value: 'id', + // label: 'title', + // getData: async ({ url }: { url: string }) => { + // return request({ + // url: url, + // }).then((ret: any) => { + // return ret.data; + // }); + // }, + // }), + // column: { + // minWidth: 100, //最小列宽 + // }, + // //用户自定义配置 + // form:{ + // component:{ multiple:true}, + // show: false, + + // }, + // }, + + // 注释编号:django-vue3-admin__crud432216:代码结束行 + + + + }, + }, + }; +}; + diff --git a/web/src/views/crud_demo/CrudDemoModelViewSet/index.vue b/web/src/views/crud_demo/CrudDemoModelViewSet/index.vue new file mode 100644 index 0000000000000000000000000000000000000000..31630aa1e35a57794a15f294f78f8c9b7b7119d8 --- /dev/null +++ b/web/src/views/crud_demo/CrudDemoModelViewSet/index.vue @@ -0,0 +1,43 @@ + + + \ No newline at end of file diff --git a/web/src/views/crud_demo/CrudDemoModelViewSet/viewAddEdit.vue b/web/src/views/crud_demo/CrudDemoModelViewSet/viewAddEdit.vue new file mode 100644 index 0000000000000000000000000000000000000000..4d54a49a5fc04b7cf9b92f48df5d17b26a51f719 --- /dev/null +++ b/web/src/views/crud_demo/CrudDemoModelViewSet/viewAddEdit.vue @@ -0,0 +1,91 @@ + + + + \ No newline at end of file diff --git a/web/src/views/crud_demo/goodstype/api.ts b/web/src/views/crud_demo/goodstype/api.ts new file mode 100644 index 0000000000000000000000000000000000000000..d063ae406b65e293bd834b6e048b62f2b23fc024 --- /dev/null +++ b/web/src/views/crud_demo/goodstype/api.ts @@ -0,0 +1,50 @@ +import { request,downloadFile } from '/@/utils/service'; +import { PageQuery, AddReq, DelReq, EditReq, InfoReq } from '@fast-crud/fast-crud'; + +export const apiPrefix = '/api/goodstype/'; + +export function GetList(query: PageQuery) { + return request({ + url: apiPrefix, + method: 'get', + params: query, + }); +} +export function GetObj(id: InfoReq) { + return request({ + url: apiPrefix + id, + method: 'get', + }); +} + +export function AddObj(obj: AddReq) { + return request({ + url: apiPrefix, + method: 'post', + data: obj, + }); +} + +export function UpdateObj(obj: EditReq) { + return request({ + url: apiPrefix + obj.id + '/', + method: 'put', + data: obj, + }); +} + +export function DelObj(id: DelReq) { + return request({ + url: apiPrefix + id + '/', + method: 'delete', + data: { id }, + }); +} + +export function exportData(params:any){ + return downloadFile({ + url: apiPrefix + 'export_data/', + params: params, + method: 'get' + }) +} diff --git a/web/src/views/crud_demo/goodstype/crud.tsx b/web/src/views/crud_demo/goodstype/crud.tsx new file mode 100644 index 0000000000000000000000000000000000000000..0682fa5209028f8d7fada7d21aee56ab214bf709 --- /dev/null +++ b/web/src/views/crud_demo/goodstype/crud.tsx @@ -0,0 +1,138 @@ +import { CrudOptions, AddReq, DelReq, EditReq, dict, CrudExpose, compute, UserPageQuery } from '@fast-crud/fast-crud'; +import _ from 'lodash-es'; +import * as api from './api'; +import { dictionary } from '/@/utils/dictionary'; +import {inject} from "vue"; +import { useRouter } from "vue-router"; +interface CreateCrudOptionsTypes { + crudOptions: CrudOptions; +} + + +//此处为crudOptions配置 +export const createCrudOptions = function ({ crudExpose, rolePermission }: { crudExpose: CrudExpose; rolePermission: any }): CreateCrudOptionsTypes { + + const pageRequest = async (query: any) => { + return await api.GetList(query); + }; + const editRequest = async ({ form, row }: EditReq) => { + if (row.id) { + form.id = row.id; + } + return await api.UpdateObj(form); + }; + const delRequest = async ({ row }: DelReq) => { + return await api.DelObj(row.id); + }; + const addRequest = async ({ form }: AddReq) => { + return await api.AddObj(form); + }; + + const exportRequest = async (query: UserPageQuery) => { + return await api.exportData(query) + }; + + + //实例路由 + const router = useRouter(); + + return { + crudOptions: { + request: { + pageRequest, + addRequest, + editRequest, + delRequest, + }, + actionbar: { + buttons: { + add: { + show: hasPermissions('LicenceViewSet:Create') + // show:true + }, + export:{ + text:"导出",//按钮文字 + title:"导出",//鼠标停留显示的信息 + click(){ + return exportRequest(crudExpose.getSearchFormData()) + } + } + } + }, + + rowHandle: { + //固定右侧 + fixed: 'right', + width: 200, + buttons: { + view: { + type: 'text', + show: true, + style:{color: "#67C23A"}, + order: 1, + }, + edit: { + type: 'text', + style:{color: "#E6A23C"}, + order: 2, + show:hasPermissions('LicenceViewSet:Update') + }, + copy: { + text: '复制', //按钮显示名称 + type: 'text', //按钮类型 + order: 3, //排序,这个看自己喜欢排在什么位置了 + style:{color: "#606266"}, + title: '复制', + show:hasPermissions('LicenceViewSet:Copy'), + }, + remove: { + type: 'text', + style:{color: "#F56C6C"}, + order: 4, + show:hasPermissions('LicenceViewSet:Delete') + }, + custom: { + text: '权限', + title: '权限', + type: 'text', + order: 5, + style:{color: "#409EFF"}, + show:hasPermissions('LicenceViewSet:Update'), + click: (context: any): void => { + const { row } = context; + // eslint-disable-next-line no-mixed-spaces-and-tabs + rolePermission.value.drawer = true; + rolePermission.value.editedRoleInfo = row; + rolePermission.value.initGet(); + }, + }, + }, + }, + form: { + col: { span: 12 }, //配置成一行两个元素 + labelPosition: "left", + labelWidth: "auto", //配置成lable的宽为自动 + requireAsteriskPosition:"right", //星号的位置 + row:{ gutter: 20}, //配置同一行内,两个元素之间空隙20px + + }, + + columns: { + title: { + title: '商品类型', + type: 'input', + search: { show: true}, + column: { + minWidth: 120, + sortable: 'custom', + }, + form: { + component: { + placeholder: '请输入商品名称', + }, + }, + }, + }, + }, + }; +}; diff --git a/web/src/views/crud_demo/goodstype/goodstypeSub/crud.tsx b/web/src/views/crud_demo/goodstype/goodstypeSub/crud.tsx new file mode 100644 index 0000000000000000000000000000000000000000..d9fd14f0a16c170cbb167e90edf626e9a7bcfab7 --- /dev/null +++ b/web/src/views/crud_demo/goodstype/goodstypeSub/crud.tsx @@ -0,0 +1,63 @@ +import { + CreateCrudOptionsProps, + CreateCrudOptionsRet, + } from "@fast-crud/fast-crud"; +export default function ({ crudExpose }: CreateCrudOptionsProps): CreateCrudOptionsRet { + const { crudBinding } = crudExpose; + + return { + crudOptions: { + actionbar: { + buttons: { + add: { + show: false + }, + addRow: { + show: true + } + } + }, + search: { + show: false + }, + toolbar: { + show: false, + buttons: { + refresh: { + show: false + }, + search: { + show: false + } + } + }, + mode: { + name: "local", + isMergeWhenUpdate: true, + isAppendWhenAdd: true + }, + table: { + editable: { + enabled: true, //启动编辑功能 + mode: "free" //自由编辑模式 + } + }, + pagination: { show: false, pageSize: 9999999 }, + columns: { + title: { + title: '商品类型', + type: 'input', + column: { + minWidth: 120, + sortable: 'custom', + }, + form: { + component: { + placeholder: '请输入商品名称', + }, + }, + }, + } + } + }; +} \ No newline at end of file diff --git a/web/src/views/crud_demo/goodstype/goodstypeSub/index.vue b/web/src/views/crud_demo/goodstype/goodstypeSub/index.vue new file mode 100644 index 0000000000000000000000000000000000000000..30d623bf9443ea83f7d52663391cea7e2d56cf23 --- /dev/null +++ b/web/src/views/crud_demo/goodstype/goodstypeSub/index.vue @@ -0,0 +1,91 @@ + + + + + + + + \ No newline at end of file diff --git a/web/src/views/crud_demo/goodstype/index.vue b/web/src/views/crud_demo/goodstype/index.vue new file mode 100644 index 0000000000000000000000000000000000000000..2d4751e075e1f453ef7f3f29f696d123a6470d3b --- /dev/null +++ b/web/src/views/crud_demo/goodstype/index.vue @@ -0,0 +1,58 @@ + + + + + \ No newline at end of file diff --git a/web/src/views/crud_demo/newpage/api.ts b/web/src/views/crud_demo/newpage/api.ts new file mode 100644 index 0000000000000000000000000000000000000000..952d91fb062008f1a0450183d19f7632a2f7edaa --- /dev/null +++ b/web/src/views/crud_demo/newpage/api.ts @@ -0,0 +1,50 @@ +import { request,downloadFile } from '/@/utils/service'; +import { PageQuery, AddReq, DelReq, EditReq, InfoReq } from '@fast-crud/fast-crud'; + +export const apiPrefix = '/api/crud_demo/'; + +export function GetList(query: PageQuery) { + return request({ + url: apiPrefix, + method: 'get', + params: query, + }); +} +export function GetObj(id: InfoReq) { + return request({ + url: apiPrefix + id, + method: 'get', + }); +} + +export function AddObj(obj: AddReq) { + return request({ + url: apiPrefix, + method: 'post', + data: obj, + }); +} + +export function UpdateObj(obj: EditReq) { + return request({ + url: apiPrefix + obj.id + '/', + method: 'put', + data: obj, + }); +} + +export function DelObj(id: DelReq) { + return request({ + url: apiPrefix + id + '/', + method: 'delete', + data: { id }, + }); +} + +export function exportData(params:any){ + return downloadFile({ + url: apiPrefix + 'export_data/', + params: params, + method: 'get' + }) +} diff --git a/web/src/views/crud_demo/newpage/crud.tsx b/web/src/views/crud_demo/newpage/crud.tsx new file mode 100644 index 0000000000000000000000000000000000000000..3304b397488dfe7934a91dc38efdcdbd8b73c5e5 --- /dev/null +++ b/web/src/views/crud_demo/newpage/crud.tsx @@ -0,0 +1,154 @@ +import { CrudOptions, AddReq, DelReq, EditReq, dict, CrudExpose, compute, UserPageQuery, asyncCompute } from '@fast-crud/fast-crud'; +import _ from 'lodash-es'; +import * as api from './api'; +import { request } from '/@/utils/service'; +import { dictionary } from '/@/utils/dictionary'; +// import { successMessage } from '../../../utils/message'; +import {inject} from "vue"; +// import context from '@fast-crud/ui-interface/dist/d/context'; +import { url } from 'inspector'; +import { useRouter } from "vue-router"; +import { successMessage } from '/@/utils/message'; + +interface CreateCrudOptionsTypes { + crudOptions: CrudOptions; +} + +// export default function ({ crudExpose }: CreateCrudOptionsProps): CreateCrudOptionsRet { + +// export const createCrudOptions = function({ crudExpose }: CreateCrudOptionsProps): CreateCrudOptionsRet { + export const createCrudOptions = function ({ crudExpose, rolePermission, context}: { crudExpose: CrudExpose; rolePermission: any; context: any}): CreateCrudOptionsTypes { + + const router = useRouter(); + + const { getFormRef, getFormData } = crudExpose; + + const pageRequest = async (query: any) => { + return await api.GetList(query); +}; +const editRequest = async ({ form, row }: EditReq) => { + if (row.id) { + form.id = row.id; + } + return await api.UpdateObj(form); +}; +const delRequest = async ({ row }: DelReq) => { + return await api.DelObj(row.id); +}; +const addRequest = async ({ form }: AddReq) => { + return await api.AddObj(form); +}; + +const exportRequest = async (query: UserPageQuery) => { + return await api.exportData(query) +}; + + + + + return { + crudOptions: { + request: { + pageRequest, + addRequest, + editRequest, + delRequest + }, + actionbar: { + buttons: { + add: { + click() { + // 配置0时为新增需求状态 + router.push({name:'FormNewPageEdit',params:{id:0}}) + } + } + } + }, + rowHandle: { + buttons: { + edit: { + click(context) { + // 拿到当前行的ID传至后端 + const rowId = context.row.id + router.push({name:'FormNewPageEdit',params:{id:rowId}}) + } + } + } + }, + columns: { + + + goods: { + title: '商品', + type: 'input', + search: { show: true}, + column: { + minWidth: 120, + sortable: 'custom', + }, + form: { + rules: [{ required: true, message: '商品名称必填' }], + component: { + placeholder: '请输入商品名称', + }, + }, + }, + inventory: { + title: '库存量', + type: 'number', + search: { show: false }, + column: { + minWidth: 120, + sortable: 'custom', + }, + form: { + rules: [{ required: true, message: '库存量必填' }], + component: { + placeholder: '请输入库存量', + }, + }, + }, + + goods_price: { + title: '商品定价', + type: 'text', + search: { show: false }, + column: { + minWidth: 120, + sortable: 'custom', + }, + form: { + rules: [{ required: true, message: '商品定价必填' }], + component: { + placeholder: '请输入商品定价', + }, + }, + }, + purchase_goods_date: { + title: '进货时间', + type: 'date', + search: { show: false }, + form: { + rules: [{ required: true, message: '进货时间必填' }], + component: { + //显示格式化 + format: "YYYY-MM-DD", + //输入值格式 + valueFormat: "YYYY-MM-DD", + placeholder: '请输入进货时间', + } + }, + column: { + align: "center", + width: 120, + component: { name: "fs-date-format", format: "YYYY-MM-DD" } + } + }, + + + + + }, + } + }; +} diff --git a/web/src/views/crud_demo/newpage/index.vue b/web/src/views/crud_demo/newpage/index.vue new file mode 100644 index 0000000000000000000000000000000000000000..ff9eda97a086fe154e35238db7d4f894ecb97328 --- /dev/null +++ b/web/src/views/crud_demo/newpage/index.vue @@ -0,0 +1,48 @@ + + + + + \ No newline at end of file diff --git a/web/src/views/crud_demo/newpage/viewAddEdit.vue b/web/src/views/crud_demo/newpage/viewAddEdit.vue new file mode 100644 index 0000000000000000000000000000000000000000..a1bc752d3830f9beee3141e827260f36fec3b35e --- /dev/null +++ b/web/src/views/crud_demo/newpage/viewAddEdit.vue @@ -0,0 +1,242 @@ + + + \ No newline at end of file diff --git a/web/src/views/crud_demo/sub_crud_goods/goodsModel1ViewSet/api.ts b/web/src/views/crud_demo/sub_crud_goods/goodsModel1ViewSet/api.ts new file mode 100644 index 0000000000000000000000000000000000000000..e5792a2c2cf6a7ae028473df0b195595815625c3 --- /dev/null +++ b/web/src/views/crud_demo/sub_crud_goods/goodsModel1ViewSet/api.ts @@ -0,0 +1,50 @@ +import { request,downloadFile } from '/@/utils/service'; +import { PageQuery, AddReq, DelReq, EditReq, InfoReq } from '@fast-crud/fast-crud'; + +export const apiPrefix = '/api/goodsModel1ViewSet/'; + +export function GetList(query: PageQuery) { + return request({ + url: apiPrefix, + method: 'get', + params: query, + }); +} +export function GetObj(id: InfoReq) { + return request({ + url: apiPrefix + id, + method: 'get', + }); +} + +export function AddObj(obj: AddReq) { + return request({ + url: apiPrefix, + method: 'post', + data: obj, + }); +} + +export function UpdateObj(obj: EditReq) { + return request({ + url: apiPrefix + obj.id + '/', + method: 'put', + data: obj, + }); +} + +export function DelObj(id: DelReq) { + return request({ + url: apiPrefix + id + '/', + method: 'delete', + data: { id }, + }); +} + +export function exportData(params:any){ + return downloadFile({ + url: apiPrefix + 'export_data/', + params: params, + method: 'get' + }) +} diff --git a/web/src/views/crud_demo/sub_crud_goods/goodsModel1ViewSet/bak-crud.tsx b/web/src/views/crud_demo/sub_crud_goods/goodsModel1ViewSet/bak-crud.tsx new file mode 100644 index 0000000000000000000000000000000000000000..e26cd1ab5e3adfe74d32f5a51def801ce0c7e45f --- /dev/null +++ b/web/src/views/crud_demo/sub_crud_goods/goodsModel1ViewSet/bak-crud.tsx @@ -0,0 +1,195 @@ +import { CrudOptions, AddReq, DelReq, EditReq, dict, CrudExpose, compute, UserPageQuery } from '@fast-crud/fast-crud'; +import _ from 'lodash-es'; +import * as api from './api'; +import { dictionary } from '/@/utils/dictionary'; +import {inject} from "vue"; +import { useRouter } from "vue-router"; +import { request } from '/@/utils/service'; + +interface CreateCrudOptionsTypes { + crudOptions: CrudOptions; +} + + +//此处为crudOptions配置 +export const createCrudOptions = function ({ crudExpose, rolePermission }: { crudExpose: CrudExpose; rolePermission: any }): CreateCrudOptionsTypes { + + const pageRequest = async (query: any) => { + return await api.GetList(query); + }; + const editRequest = async ({ form, row }: EditReq) => { + if (row.id) { + form.id = row.id; + } + return await api.UpdateObj(form); + }; + const delRequest = async ({ row }: DelReq) => { + return await api.DelObj(row.id); + }; + const addRequest = async ({ form }: AddReq) => { + return await api.AddObj(form); + }; + + const exportRequest = async (query: UserPageQuery) => { + return await api.exportData(query) + }; + + + //实例路由 + const router = useRouter(); + + return { + crudOptions: { + request: { + pageRequest, + addRequest, + editRequest, + delRequest, + }, + actionbar: { + buttons: { + add: { + show: hasPermissions('LicenceViewSet:Create') + // show:true + }, + export:{ + text:"导出",//按钮文字 + title:"导出",//鼠标停留显示的信息 + click(){ + return exportRequest(crudExpose.getSearchFormData()) + } + } + } + }, + + rowHandle: { + //固定右侧 + fixed: 'right', + width: 200, + buttons: { + view: { + type: 'text', + show: true, + style:{color: "#67C23A"}, + order: 1, + }, + edit: { + type: 'text', + style:{color: "#E6A23C"}, + order: 2, + show:hasPermissions('LicenceViewSet:Update') + }, + copy: { + text: '复制', //按钮显示名称 + type: 'text', //按钮类型 + order: 3, //排序,这个看自己喜欢排在什么位置了 + style:{color: "#606266"}, + title: '复制', + show:hasPermissions('LicenceViewSet:Copy'), + }, + remove: { + type: 'text', + style:{color: "#F56C6C"}, + order: 4, + show:hasPermissions('LicenceViewSet:Delete') + }, + custom: { + text: '权限', + title: '权限', + type: 'text', + order: 5, + style:{color: "#409EFF"}, + show:hasPermissions('LicenceViewSet:Update'), + click: (context: any): void => { + const { row } = context; + // eslint-disable-next-line no-mixed-spaces-and-tabs + rolePermission.value.drawer = true; + rolePermission.value.editedRoleInfo = row; + rolePermission.value.initGet(); + }, + }, + }, + }, + form: { + col: { span: 12 }, //配置成一行两个元素 + labelPosition: "left", + labelWidth: "auto", //配置成lable的宽为自动 + requireAsteriskPosition:"right", //星号的位置 + row:{ gutter: 20}, //配置同一行内,两个元素之间空隙20px + + }, + + columns: { + goods: { + title: '商品', + type: 'input', + search: { show: true}, + column: { + minWidth: 120, + sortable: 'custom', + }, + form: { + helper: { + render() { + return
商品是必需要填写的
; + } + }, + rules: [{ required: true, message: '商品名称必填' }], + component: { + placeholder: '请输入商品名称', + }, + }, + }, + inventory: { + title: '库存量', + type: 'number', + search: { show: false }, + column: { + minWidth: 120, + sortable: 'custom', + }, + form: { + rules: [{ required: true, message: '库存量必填' }], + component: { + placeholder: '请输入库存量', + }, + }, + }, + goods_price: { + title: '商品定价', + type: 'text', + search: { show: false }, + column: { + minWidth: 120, + sortable: 'custom', + }, + form: { + rules: [{ required: true, message: '商品定价必填' }], + component: { + placeholder: '请输入商品定价', + }, + }, + }, + purchase_goods_date: { + title: '进货时间', + type: 'date', + search: { show: false }, + form: { + component: { + //显示格式化 + format: "YYYY-MM-DD", + //输入值格式 + valueFormat: "YYYY-MM-DD", + placeholder: '请输入进货时间', + } + }, + column: { + align: "center", + width: 120, + component: { name: "fs-date-format", format: "YYYY-MM-DD" } + } + }, + }, + }, + }; +}; diff --git a/web/src/views/crud_demo/sub_crud_goods/goodsModel1ViewSet/bak-index.vue b/web/src/views/crud_demo/sub_crud_goods/goodsModel1ViewSet/bak-index.vue new file mode 100644 index 0000000000000000000000000000000000000000..872ba3e15fd060a65600719281feee6103271b17 --- /dev/null +++ b/web/src/views/crud_demo/sub_crud_goods/goodsModel1ViewSet/bak-index.vue @@ -0,0 +1,50 @@ + + + + + \ No newline at end of file diff --git a/web/src/views/crud_demo/sub_crud_goods/goodsModel1ViewSet/crud.tsx b/web/src/views/crud_demo/sub_crud_goods/goodsModel1ViewSet/crud.tsx new file mode 100644 index 0000000000000000000000000000000000000000..86ba2b6fc1f9aa994aaa20424c325ce51b765782 --- /dev/null +++ b/web/src/views/crud_demo/sub_crud_goods/goodsModel1ViewSet/crud.tsx @@ -0,0 +1,155 @@ +import * as api from "./api"; +import { dict, compute, CreateCrudOptionsProps, CreateCrudOptionsRet, UserPageQuery, UserPageRes, EditReq, DelReq, AddReq} from "@fast-crud/fast-crud"; + +import EditableRowSub from "../goodsToOtherModel1ViewSet/goodsToOtherModel1ViewSetSub/index.vue"; +export default function (props: CreateCrudOptionsProps): CreateCrudOptionsRet { + const { crudBinding,crudRef } = props.crudExpose; + const { crudExpose } = props; + + const pageRequest = async (query: UserPageQuery): Promise => { + return await api.GetList(query); + }; + const editRequest = async ({ form, row }: EditReq) => { + if (form.id == null) { + form.id = row.id; + } + return await api.UpdateObj(form); + }; + const delRequest = async ({ row }: DelReq) => { + return await api.DelObj(row.id); + }; + + const addRequest = async ({ form }: AddReq) => { + return await api.AddObj(form); + }; + + return { + crudOptions: { + request: { + pageRequest, + addRequest, + editRequest, + delRequest + }, + form: { + wrapper: { + width: "80%" + }, + }, + columns: { + // id: { + // title: "ID", + // type: "number", + // form: { + // show: false + // }, + // column: { width: 80, align: "center" } + // }, + goods: { + title: '商品', + type: 'input', + search: { show: true}, + column: { + minWidth: 120, + sortable: 'custom', + }, + form: { + helper: { + render() { + return
商品是必需要填写的
; + } + }, + rules: [{ required: true, message: '商品名称必填' }], + component: { + placeholder: '请输入商品名称', + }, + }, + }, + inventory: { + title: '库存量', + type: 'number', + search: { show: false }, + column: { + minWidth: 120, + sortable: 'custom', + }, + form: { + rules: [{ required: true, message: '库存量必填' }], + component: { + placeholder: '请输入库存量', + }, + }, + }, + goods_price: { + title: '商品定价', + type: 'text', + search: { show: false }, + column: { + minWidth: 120, + sortable: 'custom', + }, + form: { + rules: [{ required: true, message: '商品定价必填' }], + component: { + placeholder: '请输入商品定价', + }, + }, + }, + purchase_goods_date: { + title: '进货时间', + type: 'date', + search: { show: false }, + form: { + component: { + //显示格式化 + format: "YYYY-MM-DD", + //输入值格式 + valueFormat: "YYYY-MM-DD", + placeholder: '请输入进货时间', + } + }, + column: { + align: "center", + width: 120, + component: { name: "fs-date-format", format: "YYYY-MM-DD" } + } + }, + subTable: { + title: "子表格", + type: "text", + form: { + component: { + name: EditableRowSub, + id:compute(({form})=>{ + return form.id + // return form.id ? form.id : true; //传个true进去,可以让页面显示出来 + }), + on:{ + //可以传进form进去async saveMain({form}) + async saveMain(){ + //保存主表 + const formRef = crudExpose.getFormRef() + const ret = await formRef.submit() + //将form改为编辑模式 + let formWrapperRef = crudExpose.getFormWrapperRef(); + // 这个地方要改为拿到ret.res.data,示例中拿到的是ret.res + formWrapperRef.setFormData(ret.res.data) + crudRef.value.formWrapperRef.formOptions.mode = "edit" + crudRef.value.formWrapperRef.title="编辑" + } + } + }, + col: { + span: 24 + }, + }, + column: { + formatter: ({ row }) => { + return "查看或编辑状态查看内容"; + } + } + } + } + } + }; +} diff --git a/web/src/views/crud_demo/sub_crud_goods/goodsModel1ViewSet/index.vue b/web/src/views/crud_demo/sub_crud_goods/goodsModel1ViewSet/index.vue new file mode 100644 index 0000000000000000000000000000000000000000..7086e5d5c3d95722ae219012d04d04a71501e5a1 --- /dev/null +++ b/web/src/views/crud_demo/sub_crud_goods/goodsModel1ViewSet/index.vue @@ -0,0 +1,44 @@ + + + + \ No newline at end of file diff --git a/web/src/views/crud_demo/sub_crud_goods/goodsToOtherModel1ViewSet/api.ts b/web/src/views/crud_demo/sub_crud_goods/goodsToOtherModel1ViewSet/api.ts new file mode 100644 index 0000000000000000000000000000000000000000..ff2189d2901693b8ef55b525183db55e706c6b12 --- /dev/null +++ b/web/src/views/crud_demo/sub_crud_goods/goodsToOtherModel1ViewSet/api.ts @@ -0,0 +1,50 @@ +import { request,downloadFile } from '/@/utils/service'; +import { PageQuery, AddReq, DelReq, EditReq, InfoReq } from '@fast-crud/fast-crud'; + +export const apiPrefix = '/api/goodsToOtherModel1ViewSet/'; + +export function GetList(query: PageQuery) { + return request({ + url: apiPrefix, + method: 'get', + params: query, + }); +} +export function GetObj(id: InfoReq) { + return request({ + url: apiPrefix + id, + method: 'get', + }); +} + +export function AddObj(obj: AddReq) { + return request({ + url: apiPrefix, + method: 'post', + data: obj, + }); +} + +export function UpdateObj(obj: EditReq) { + return request({ + url: apiPrefix + obj.id + '/', + method: 'put', + data: obj, + }); +} + +export function DelObj(id: DelReq) { + return request({ + url: apiPrefix + id + '/', + method: 'delete', + data: { id }, + }); +} + +export function exportData(params:any){ + return downloadFile({ + url: apiPrefix + 'export_data/', + params: params, + method: 'get' + }) +} diff --git a/web/src/views/crud_demo/sub_crud_goods/goodsToOtherModel1ViewSet/crud.tsx b/web/src/views/crud_demo/sub_crud_goods/goodsToOtherModel1ViewSet/crud.tsx new file mode 100644 index 0000000000000000000000000000000000000000..064a456ae900bb95957491da8cf5b5ffdfe79d48 --- /dev/null +++ b/web/src/views/crud_demo/sub_crud_goods/goodsToOtherModel1ViewSet/crud.tsx @@ -0,0 +1,180 @@ +import { AddReq, DelReq, EditReq, dict, CrudExpose, UserPageQuery, CreateCrudOptionsRet} from '@fast-crud/fast-crud'; +import _ from 'lodash-es'; +import * as api from './api'; +import {inject} from "vue"; +import { useRouter } from "vue-router"; +import { request } from '/@/utils/service'; + +export default function ({ crudExpose, rolePermission}: { crudExpose: CrudExpose; rolePermission: any }): CreateCrudOptionsRet { + + const pageRequest = async (query: any) => { + return await api.GetList(query); + }; + const editRequest = async ({ form, row }: EditReq) => { + if (row.id) { + form.id = row.id; + } + return await api.UpdateObj(form); + }; + const delRequest = async ({ row }: DelReq) => { + return await api.DelObj(row.id); + }; + const addRequest = async ({ form }: AddReq) => { + return await api.AddObj(form); + }; + + const exportRequest = async (query: UserPageQuery) => { + return await api.exportData(query) + }; + + + //实例路由 + const router = useRouter(); + + return { + crudOptions: { + request: { + pageRequest, + addRequest, + editRequest, + delRequest, + }, + actionbar: { + buttons: { + add: { + show: hasPermissions('LicenceViewSet:Create') + // show:true + }, + export:{ + text:"导出",//按钮文字 + title:"导出",//鼠标停留显示的信息 + click(){ + return exportRequest(crudExpose.getSearchFormData()) + } + } + } + }, + + rowHandle: { + //固定右侧 + fixed: 'right', + width: 200, + buttons: { + view: { + type: 'text', + show: true, + style:{color: "#67C23A"}, + order: 1, + }, + edit: { + type: 'text', + style:{color: "#E6A23C"}, + order: 2, + show:hasPermissions('LicenceViewSet:Update') + }, + copy: { + text: '复制', //按钮显示名称 + type: 'text', //按钮类型 + order: 3, //排序,这个看自己喜欢排在什么位置了 + style:{color: "#606266"}, + title: '复制', + show:hasPermissions('LicenceViewSet:Copy'), + }, + remove: { + type: 'text', + style:{color: "#F56C6C"}, + order: 4, + show:hasPermissions('LicenceViewSet:Delete') + }, + custom: { + text: '权限', + title: '权限', + type: 'text', + order: 5, + style:{color: "#409EFF"}, + show:hasPermissions('LicenceViewSet:Update'), + click: (context: any): void => { + const { row } = context; + // eslint-disable-next-line no-mixed-spaces-and-tabs + rolePermission.value.drawer = true; + rolePermission.value.editedRoleInfo = row; + rolePermission.value.initGet(); + }, + }, + }, + }, + form: { + col: { span: 12 }, //配置成一行两个元素 + labelPosition: "left", + labelWidth: "auto", //配置成lable的宽为自动 + requireAsteriskPosition:"right", //星号的位置 + row:{ gutter: 20}, //配置同一行内,两个元素之间空隙20px + + }, + + columns: { + goodsName: { + title: '商品名称', + type: 'dict-select', + dict: dict({ + url: '/api/goodsModel1ViewSet/?limit=999', + value: 'id', + label: 'goods', + getData: async ({ url }: { url: string }) => { + return request({ + url: url, + }).then((ret: any) => { + return ret.data; + }); + }, + }), + column: { + minWidth: 100, //最小列宽 + }, + }, + goodstype: { + title: '商品类型', + type: 'dict-select', + dict: dict({ + url: '/api/goodstypeModel1ViewSet/?limit=999', + value: 'id', + label: 'title', + getData: async ({ url }: { url: string }) => { + return request({ + url: url, + }).then((ret: any) => { + return ret.data; + }); + }, + }), + column: { + minWidth: 100, //最小列宽 + }, + }, + goodsport: { + title: '端口', + type: 'dict-select', + dict: dict({ + url: '/api/goodsportModel1ViewSet/?limit=999', + value: 'id', + label: 'title', + getData: async ({ url }: { url: string }) => { + return request({ + url: url, + }).then((ret: any) => { + return ret.data; + }); + }, + }), + column: { + minWidth: 100, //最小列宽 + }, + }, + description: { + title: "备注", + type: "input", + }, + }, + }, + }; +}; diff --git a/web/src/views/crud_demo/sub_crud_goods/goodsToOtherModel1ViewSet/goodsToOtherModel1ViewSetSub/api.ts b/web/src/views/crud_demo/sub_crud_goods/goodsToOtherModel1ViewSet/goodsToOtherModel1ViewSetSub/api.ts new file mode 100644 index 0000000000000000000000000000000000000000..fb21ea418bcb72f739f6f09e90a3cfa97ffcff88 --- /dev/null +++ b/web/src/views/crud_demo/sub_crud_goods/goodsToOtherModel1ViewSet/goodsToOtherModel1ViewSetSub/api.ts @@ -0,0 +1,53 @@ +import { id } from 'element-plus/es/locale'; +import { request,downloadFile } from '/@/utils/service'; +import { PageQuery, AddReq, DelReq, EditReq, InfoReq } from '@fast-crud/fast-crud'; + +export const apiPrefix = '/api/goodsToOtherModel1ViewSet/'; + + +export function GetList(query: PageQuery, id: InfoReq) { + return request({ + url: apiPrefix, + method: 'get', + params: {query, goodsName: id}, + }) +} + +export function GetObj(id: InfoReq) { + return request({ + url: apiPrefix + id, + method: 'get', + }); +} + +export function AddObj(obj: AddReq) { + return request({ + url: apiPrefix, + method: 'post', + data: obj, + }); +} + +export function UpdateObj(obj: EditReq) { + return request({ + url: apiPrefix + obj.id + '/', + method: 'put', + data: obj, + }); +} + +export function DelObj(id: DelReq) { + return request({ + url: apiPrefix + id + '/', + method: 'delete', + data: { id }, + }); +} + +export function exportData(params:any){ + return downloadFile({ + url: apiPrefix + 'export_data/', + params: params, + method: 'get' + }) +} diff --git a/web/src/views/crud_demo/sub_crud_goods/goodsToOtherModel1ViewSet/goodsToOtherModel1ViewSetSub/crud.tsx b/web/src/views/crud_demo/sub_crud_goods/goodsToOtherModel1ViewSet/goodsToOtherModel1ViewSetSub/crud.tsx new file mode 100644 index 0000000000000000000000000000000000000000..ba911ad72c25e632b3adc7cbcc33cd56da15cbcc --- /dev/null +++ b/web/src/views/crud_demo/sub_crud_goods/goodsToOtherModel1ViewSet/goodsToOtherModel1ViewSetSub/crud.tsx @@ -0,0 +1,144 @@ +import { + AddReq, + CreateCrudOptionsProps, + CreateCrudOptionsRet, + DelReq, + dict, + EditReq, + UserPageQuery, + UserPageRes + } from "@fast-crud/fast-crud"; + import * as api from "./api"; + import { request } from '/@/utils/service'; + export default function ({ crudExpose, context }: CreateCrudOptionsProps): CreateCrudOptionsRet { + const { crudBinding } = crudExpose; + const { parentIdRef } = context; + const pageRequest = async (query: UserPageQuery): Promise => { + return await api.GetList(query, parentIdRef.value); //这里要把parentIdRef.value做ID传进去 + }; + const editRequest = async ({ form, row }: EditReq) => { + if (form.id == null) { + form.id = row.id; + } + return await api.UpdateObj(form); + }; + const delRequest = async ({ row }: DelReq) => { + return await api.DelObj(row.id); + }; + + const addRequest = async ({ form }: AddReq) => { + + //这里要进行修改,需要返回ID对行,不行第二次点击新增时,会引发两条数据同时进行编辑 + const result = await api.AddObj(form); + return { id: result.data.id }; + }; + + return { + crudOptions: { + request: { + pageRequest, + addRequest, + editRequest, + delRequest + }, + actionbar: { + buttons: { + add: { + show: false + }, + addRow: { + show: true + } + } + }, + search: { + show: false, + initialForm: { + parentId: parentIdRef + } + }, + toolbar: { + buttons: { + refresh: { + show: false, + } + } + }, + table: { + editable: { + enabled: true, + mode: "row", + activeDefault: false, + addRow: (data: any[], row: any)=>{ + // (data: any[], row: any) => void + //在最后一行插入数据 + data.push(row) + }, + } + }, + + // pagination: { show: false, pageSize: 9999999 }, + columns: { + goodstype: { + title: '商品类型', + type: 'dict-select', + dict: dict({ + url: '/api/goodstypeModel1ViewSet/?limit=999', + value: 'id', + label: 'title', + getData: async ({ url }: { url: string }) => { + return request({ + url: url, + }).then((ret: any) => { + return ret.data; + }); + }, + }), + column: { + minWidth: 100, //最小列宽 + }, + }, + goodsport: { + title: '端口', + type: 'dict-select', + dict: dict({ + url: '/api/goodsportModel1ViewSet/?limit=999', + value: 'id', + label: 'title', + getData: async ({ url }: { url: string }) => { + return request({ + url: url, + }).then((ret: any) => { + return ret.data; + }); + }, + }), + column: { + minWidth: 100, //最小列宽 + }, + }, + //这里改为后端model中对应的外健 + description: { + title: "备注", + type: "input", + }, + + goodsName: { + title: "父Id", + type: "number", + form: { + value: parentIdRef, + component: { + disabled: true, + } + }, + //在页面隐藏起来,不让用户看到父Id字段 + column: { + show: false, + } + }, + } + } + }; + } + \ No newline at end of file diff --git a/web/src/views/crud_demo/sub_crud_goods/goodsToOtherModel1ViewSet/goodsToOtherModel1ViewSetSub/index.vue b/web/src/views/crud_demo/sub_crud_goods/goodsToOtherModel1ViewSet/goodsToOtherModel1ViewSetSub/index.vue new file mode 100644 index 0000000000000000000000000000000000000000..ec500eb570b5cf1c7306b15239fc0ef4323766e4 --- /dev/null +++ b/web/src/views/crud_demo/sub_crud_goods/goodsToOtherModel1ViewSet/goodsToOtherModel1ViewSetSub/index.vue @@ -0,0 +1,105 @@ + + + + \ No newline at end of file diff --git a/web/src/views/crud_demo/sub_crud_goods/goodsToOtherModel1ViewSet/index.vue b/web/src/views/crud_demo/sub_crud_goods/goodsToOtherModel1ViewSet/index.vue new file mode 100644 index 0000000000000000000000000000000000000000..5a57fb584526c5753f2e2d5f8bb1ece2f96bb2fa --- /dev/null +++ b/web/src/views/crud_demo/sub_crud_goods/goodsToOtherModel1ViewSet/index.vue @@ -0,0 +1,48 @@ + + + + + \ No newline at end of file diff --git a/web/src/views/crud_demo/sub_crud_goods/goodsportModel1ViewSet/api.ts b/web/src/views/crud_demo/sub_crud_goods/goodsportModel1ViewSet/api.ts new file mode 100644 index 0000000000000000000000000000000000000000..a786df472eabdb3c3e64ff92fd1c1fb1a8491a33 --- /dev/null +++ b/web/src/views/crud_demo/sub_crud_goods/goodsportModel1ViewSet/api.ts @@ -0,0 +1,50 @@ +import { request,downloadFile } from '/@/utils/service'; +import { PageQuery, AddReq, DelReq, EditReq, InfoReq } from '@fast-crud/fast-crud'; + +export const apiPrefix = '/api/goodsportModel1ViewSet/'; + +export function GetList(query: PageQuery) { + return request({ + url: apiPrefix, + method: 'get', + params: query, + }); +} +export function GetObj(id: InfoReq) { + return request({ + url: apiPrefix + id, + method: 'get', + }); +} + +export function AddObj(obj: AddReq) { + return request({ + url: apiPrefix, + method: 'post', + data: obj, + }); +} + +export function UpdateObj(obj: EditReq) { + return request({ + url: apiPrefix + obj.id + '/', + method: 'put', + data: obj, + }); +} + +export function DelObj(id: DelReq) { + return request({ + url: apiPrefix + id + '/', + method: 'delete', + data: { id }, + }); +} + +export function exportData(params:any){ + return downloadFile({ + url: apiPrefix + 'export_data/', + params: params, + method: 'get' + }) +} diff --git a/web/src/views/crud_demo/sub_crud_goods/goodsportModel1ViewSet/crud.tsx b/web/src/views/crud_demo/sub_crud_goods/goodsportModel1ViewSet/crud.tsx new file mode 100644 index 0000000000000000000000000000000000000000..173b9acc12dfc4594f9274c3098ea12cfea16f31 --- /dev/null +++ b/web/src/views/crud_demo/sub_crud_goods/goodsportModel1ViewSet/crud.tsx @@ -0,0 +1,138 @@ +import { CrudOptions, AddReq, DelReq, EditReq, dict, CrudExpose, compute, UserPageQuery } from '@fast-crud/fast-crud'; +import _ from 'lodash-es'; +import * as api from './api'; +import { dictionary } from '/@/utils/dictionary'; +import {inject} from "vue"; +import { useRouter } from "vue-router"; +interface CreateCrudOptionsTypes { + crudOptions: CrudOptions; +} + + +//此处为crudOptions配置 +export const createCrudOptions = function ({ crudExpose, rolePermission }: { crudExpose: CrudExpose; rolePermission: any }): CreateCrudOptionsTypes { + + const pageRequest = async (query: any) => { + return await api.GetList(query); + }; + const editRequest = async ({ form, row }: EditReq) => { + if (row.id) { + form.id = row.id; + } + return await api.UpdateObj(form); + }; + const delRequest = async ({ row }: DelReq) => { + return await api.DelObj(row.id); + }; + const addRequest = async ({ form }: AddReq) => { + return await api.AddObj(form); + }; + + const exportRequest = async (query: UserPageQuery) => { + return await api.exportData(query) + }; + + + //实例路由 + const router = useRouter(); + + return { + crudOptions: { + request: { + pageRequest, + addRequest, + editRequest, + delRequest, + }, + actionbar: { + buttons: { + add: { + show: hasPermissions('LicenceViewSet:Create') + // show:true + }, + export:{ + text:"导出",//按钮文字 + title:"导出",//鼠标停留显示的信息 + click(){ + return exportRequest(crudExpose.getSearchFormData()) + } + } + } + }, + + rowHandle: { + //固定右侧 + fixed: 'right', + width: 200, + buttons: { + view: { + type: 'text', + show: true, + style:{color: "#67C23A"}, + order: 1, + }, + edit: { + type: 'text', + style:{color: "#E6A23C"}, + order: 2, + show:hasPermissions('LicenceViewSet:Update') + }, + copy: { + text: '复制', //按钮显示名称 + type: 'text', //按钮类型 + order: 3, //排序,这个看自己喜欢排在什么位置了 + style:{color: "#606266"}, + title: '复制', + show:hasPermissions('LicenceViewSet:Copy'), + }, + remove: { + type: 'text', + style:{color: "#F56C6C"}, + order: 4, + show:hasPermissions('LicenceViewSet:Delete') + }, + custom: { + text: '权限', + title: '权限', + type: 'text', + order: 5, + style:{color: "#409EFF"}, + show:hasPermissions('LicenceViewSet:Update'), + click: (context: any): void => { + const { row } = context; + // eslint-disable-next-line no-mixed-spaces-and-tabs + rolePermission.value.drawer = true; + rolePermission.value.editedRoleInfo = row; + rolePermission.value.initGet(); + }, + }, + }, + }, + form: { + col: { span: 12 }, //配置成一行两个元素 + labelPosition: "left", + labelWidth: "auto", //配置成lable的宽为自动 + requireAsteriskPosition:"right", //星号的位置 + row:{ gutter: 20}, //配置同一行内,两个元素之间空隙20px + + }, + + columns: { + title: { + title: '商品端口', + type: 'input', + search: { show: true}, + column: { + minWidth: 120, + sortable: 'custom', + }, + form: { + component: { + placeholder: '请输入商品端口', + }, + }, + }, + }, + }, + }; +}; diff --git a/web/src/views/crud_demo/sub_crud_goods/goodsportModel1ViewSet/index.vue b/web/src/views/crud_demo/sub_crud_goods/goodsportModel1ViewSet/index.vue new file mode 100644 index 0000000000000000000000000000000000000000..35784a0d87c4c0cb3c2c4caf306fc089e0116cd4 --- /dev/null +++ b/web/src/views/crud_demo/sub_crud_goods/goodsportModel1ViewSet/index.vue @@ -0,0 +1,50 @@ + + + + + \ No newline at end of file diff --git a/web/src/views/crud_demo/sub_crud_goods/goodstypeModel1ViewSet/api.ts b/web/src/views/crud_demo/sub_crud_goods/goodstypeModel1ViewSet/api.ts new file mode 100644 index 0000000000000000000000000000000000000000..c11e40219f0c786523d9d01619052e71627a63f9 --- /dev/null +++ b/web/src/views/crud_demo/sub_crud_goods/goodstypeModel1ViewSet/api.ts @@ -0,0 +1,50 @@ +import { request,downloadFile } from '/@/utils/service'; +import { PageQuery, AddReq, DelReq, EditReq, InfoReq } from '@fast-crud/fast-crud'; + +export const apiPrefix = '/api/goodstypeModel1ViewSet/'; + +export function GetList(query: PageQuery) { + return request({ + url: apiPrefix, + method: 'get', + params: query, + }); +} +export function GetObj(id: InfoReq) { + return request({ + url: apiPrefix + id, + method: 'get', + }); +} + +export function AddObj(obj: AddReq) { + return request({ + url: apiPrefix, + method: 'post', + data: obj, + }); +} + +export function UpdateObj(obj: EditReq) { + return request({ + url: apiPrefix + obj.id + '/', + method: 'put', + data: obj, + }); +} + +export function DelObj(id: DelReq) { + return request({ + url: apiPrefix + id + '/', + method: 'delete', + data: { id }, + }); +} + +export function exportData(params:any){ + return downloadFile({ + url: apiPrefix + 'export_data/', + params: params, + method: 'get' + }) +} diff --git a/web/src/views/crud_demo/sub_crud_goods/goodstypeModel1ViewSet/crud.tsx b/web/src/views/crud_demo/sub_crud_goods/goodstypeModel1ViewSet/crud.tsx new file mode 100644 index 0000000000000000000000000000000000000000..0682fa5209028f8d7fada7d21aee56ab214bf709 --- /dev/null +++ b/web/src/views/crud_demo/sub_crud_goods/goodstypeModel1ViewSet/crud.tsx @@ -0,0 +1,138 @@ +import { CrudOptions, AddReq, DelReq, EditReq, dict, CrudExpose, compute, UserPageQuery } from '@fast-crud/fast-crud'; +import _ from 'lodash-es'; +import * as api from './api'; +import { dictionary } from '/@/utils/dictionary'; +import {inject} from "vue"; +import { useRouter } from "vue-router"; +interface CreateCrudOptionsTypes { + crudOptions: CrudOptions; +} + + +//此处为crudOptions配置 +export const createCrudOptions = function ({ crudExpose, rolePermission }: { crudExpose: CrudExpose; rolePermission: any }): CreateCrudOptionsTypes { + + const pageRequest = async (query: any) => { + return await api.GetList(query); + }; + const editRequest = async ({ form, row }: EditReq) => { + if (row.id) { + form.id = row.id; + } + return await api.UpdateObj(form); + }; + const delRequest = async ({ row }: DelReq) => { + return await api.DelObj(row.id); + }; + const addRequest = async ({ form }: AddReq) => { + return await api.AddObj(form); + }; + + const exportRequest = async (query: UserPageQuery) => { + return await api.exportData(query) + }; + + + //实例路由 + const router = useRouter(); + + return { + crudOptions: { + request: { + pageRequest, + addRequest, + editRequest, + delRequest, + }, + actionbar: { + buttons: { + add: { + show: hasPermissions('LicenceViewSet:Create') + // show:true + }, + export:{ + text:"导出",//按钮文字 + title:"导出",//鼠标停留显示的信息 + click(){ + return exportRequest(crudExpose.getSearchFormData()) + } + } + } + }, + + rowHandle: { + //固定右侧 + fixed: 'right', + width: 200, + buttons: { + view: { + type: 'text', + show: true, + style:{color: "#67C23A"}, + order: 1, + }, + edit: { + type: 'text', + style:{color: "#E6A23C"}, + order: 2, + show:hasPermissions('LicenceViewSet:Update') + }, + copy: { + text: '复制', //按钮显示名称 + type: 'text', //按钮类型 + order: 3, //排序,这个看自己喜欢排在什么位置了 + style:{color: "#606266"}, + title: '复制', + show:hasPermissions('LicenceViewSet:Copy'), + }, + remove: { + type: 'text', + style:{color: "#F56C6C"}, + order: 4, + show:hasPermissions('LicenceViewSet:Delete') + }, + custom: { + text: '权限', + title: '权限', + type: 'text', + order: 5, + style:{color: "#409EFF"}, + show:hasPermissions('LicenceViewSet:Update'), + click: (context: any): void => { + const { row } = context; + // eslint-disable-next-line no-mixed-spaces-and-tabs + rolePermission.value.drawer = true; + rolePermission.value.editedRoleInfo = row; + rolePermission.value.initGet(); + }, + }, + }, + }, + form: { + col: { span: 12 }, //配置成一行两个元素 + labelPosition: "left", + labelWidth: "auto", //配置成lable的宽为自动 + requireAsteriskPosition:"right", //星号的位置 + row:{ gutter: 20}, //配置同一行内,两个元素之间空隙20px + + }, + + columns: { + title: { + title: '商品类型', + type: 'input', + search: { show: true}, + column: { + minWidth: 120, + sortable: 'custom', + }, + form: { + component: { + placeholder: '请输入商品名称', + }, + }, + }, + }, + }, + }; +}; diff --git a/web/src/views/crud_demo/sub_crud_goods/goodstypeModel1ViewSet/index.vue b/web/src/views/crud_demo/sub_crud_goods/goodstypeModel1ViewSet/index.vue new file mode 100644 index 0000000000000000000000000000000000000000..a9f8aad107fee432b417da282cf8af310f3c7bf8 --- /dev/null +++ b/web/src/views/crud_demo/sub_crud_goods/goodstypeModel1ViewSet/index.vue @@ -0,0 +1,50 @@ + + + + + \ No newline at end of file diff --git a/web/src/views/crud_demo/v-model/crud.tsx b/web/src/views/crud_demo/v-model/crud.tsx new file mode 100644 index 0000000000000000000000000000000000000000..eebac170f281a2cd99c8b3270a770a26b11b18f1 --- /dev/null +++ b/web/src/views/crud_demo/v-model/crud.tsx @@ -0,0 +1,39 @@ +import { CreateCrudOptionsProps, CreateCrudOptionsRet } from "@fast-crud/fast-crud"; + +export default function ({ expose }: CreateCrudOptionsProps): CreateCrudOptionsRet { + return { + crudOptions: { + //这里是配置本地模式,应该在这里改为远程模式 + mode: { + name: "local", + isMergeWhenUpdate: true, + isAppendWhenAdd: true + }, + search: { + show: false + }, + toolbar: { + show: false + }, + pagination: { + show: false + }, + + // 这里是配置字段 + columns: { + name: { + type: "text", + title: "联系人姓名" + }, + mobile: { + type: "text", + title: "联系人手机号码" + }, + // mobile1: { + // type: "text", + // title: "11联系人手机号码" + // } + } + } + }; +} \ No newline at end of file diff --git a/web/src/views/crud_demo/v-model/index.vue b/web/src/views/crud_demo/v-model/index.vue new file mode 100644 index 0000000000000000000000000000000000000000..715d29a5a2f71812fd7d7ffacf7f0e712289e22a --- /dev/null +++ b/web/src/views/crud_demo/v-model/index.vue @@ -0,0 +1,50 @@ + + + \ No newline at end of file diff --git a/web/src/views/crud_demo/v-model/local.vue b/web/src/views/crud_demo/v-model/local.vue new file mode 100644 index 0000000000000000000000000000000000000000..967a74f1f3062b01025271492878c1a73113cd57 --- /dev/null +++ b/web/src/views/crud_demo/v-model/local.vue @@ -0,0 +1,69 @@ + + + + \ No newline at end of file diff --git a/web/src/views/it_mis/Cpu/api.ts b/web/src/views/it_mis/Cpu/api.ts new file mode 100644 index 0000000000000000000000000000000000000000..ac76f85060ea7c6497166063bd465a08ed934f59 --- /dev/null +++ b/web/src/views/it_mis/Cpu/api.ts @@ -0,0 +1,50 @@ +import { request,downloadFile } from '/@/utils/service'; +import { PageQuery, AddReq, DelReq, EditReq, InfoReq } from '@fast-crud/fast-crud'; + +export const apiPrefix = '/api/CpuViewSet/'; + +export function GetList(query: PageQuery) { + return request({ + url: apiPrefix, + method: 'get', + params: query, + }); +} +export function GetObj(id: InfoReq) { + return request({ + url: apiPrefix + id, + method: 'get', + }); +} + +export function AddObj(obj: AddReq) { + return request({ + url: apiPrefix, + method: 'post', + data: obj, + }); +} + +export function UpdateObj(obj: EditReq) { + return request({ + url: apiPrefix + obj.id + '/', + method: 'put', + data: obj, + }); +} + +export function DelObj(id: DelReq) { + return request({ + url: apiPrefix + id + '/', + method: 'delete', + data: { id }, + }); +} + +export function exportData(params:any){ + return downloadFile({ + url: apiPrefix + 'export_data/', + params: params, + method: 'get' + }) +} diff --git a/web/src/views/it_mis/Cpu/crud.tsx b/web/src/views/it_mis/Cpu/crud.tsx new file mode 100644 index 0000000000000000000000000000000000000000..c244a1818d28b720f2e4832f420e871d6b90b198 --- /dev/null +++ b/web/src/views/it_mis/Cpu/crud.tsx @@ -0,0 +1,99 @@ +import { CrudOptions, AddReq, DelReq, EditReq, dict, CrudExpose, compute, UserPageQuery, CreateCrudOptionsRet} from '@fast-crud/fast-crud'; +import _ from 'lodash-es'; +import * as api from './api'; +import { request } from '/@/utils/service'; +import { dictionary } from '/@/utils/dictionary'; +import {inject} from "vue"; + + +//此处为crudOptions配置 +export default function ({ crudExpose}: { crudExpose: CrudExpose}): CreateCrudOptionsRet { + const pageRequest = async (query: any) => { + return await api.GetList(query); + }; + const editRequest = async ({ form, row }: EditReq) => { + if (row.id) { + form.id = row.id; + } + return await api.UpdateObj(form); + }; + const delRequest = async ({ row }: DelReq) => { + return await api.DelObj(row.id); + }; + const addRequest = async ({ form }: AddReq) => { + return await api.AddObj(form); + }; + + const exportRequest = async (query: UserPageQuery) => { + return await api.exportData(query) + }; + + + + + + + + return { + crudOptions: { + request: { + pageRequest, + addRequest, + editRequest, + delRequest, + }, + actionbar: { + buttons: { + export:{ + click(){ + return exportRequest(crudExpose.getSearchFormData()) + } + } + } + }, + // form: { + // col: { span: 24 }, + // labelWidth: '100px', + // wrapper: { + // is: 'el-dialog', + // width: '600px', + // }, + + // }, + columns: { + + + + title: { + title: 'cpu型号', + type: 'input', + search: { show: true}, + column: { + // minWidth: 120, + sortable: 'custom', + }, + form: { + rules: [{ required: true, message: 'cpu型号名称必填' }], + component: { + placeholder: '请输入cpu型号', + }, + }, + }, + + + // description: { + // title: '备注', + // type: 'textarea', + // search: {show: false}, + // form: { + // component: { + // maxlength: 200, + // placeholder: '输入备注', + // }, + // }, + // }, + }, + + }, + }; +}; diff --git a/web/src/views/it_mis/Cpu/index.vue b/web/src/views/it_mis/Cpu/index.vue new file mode 100644 index 0000000000000000000000000000000000000000..8ba0b438647afe2c40faebaffb5ece24abac2ac8 --- /dev/null +++ b/web/src/views/it_mis/Cpu/index.vue @@ -0,0 +1,55 @@ + + + + + diff --git a/web/src/views/it_mis/DeviceBrandViewSet/api.ts b/web/src/views/it_mis/DeviceBrandViewSet/api.ts new file mode 100644 index 0000000000000000000000000000000000000000..305fd9aa98d2942ffad4d8dee01fd698cb3e61eb --- /dev/null +++ b/web/src/views/it_mis/DeviceBrandViewSet/api.ts @@ -0,0 +1,50 @@ +import { request,downloadFile } from '/@/utils/service'; +import { PageQuery, AddReq, DelReq, EditReq, InfoReq } from '@fast-crud/fast-crud'; + +export const apiPrefix = '/api/DeviceBrandViewSet/'; + +export function GetList(query: PageQuery) { + return request({ + url: apiPrefix, + method: 'get', + params: query, + }); +} +export function GetObj(id: InfoReq) { + return request({ + url: apiPrefix + id, + method: 'get', + }); +} + +export function AddObj(obj: AddReq) { + return request({ + url: apiPrefix, + method: 'post', + data: obj, + }); +} + +export function UpdateObj(obj: EditReq) { + return request({ + url: apiPrefix + obj.id + '/', + method: 'put', + data: obj, + }); +} + +export function DelObj(id: DelReq) { + return request({ + url: apiPrefix + id + '/', + method: 'delete', + data: { id }, + }); +} + +export function exportData(params:any){ + return downloadFile({ + url: apiPrefix + 'export_data/', + params: params, + method: 'get' + }) +} diff --git a/web/src/views/it_mis/DeviceBrandViewSet/crud.tsx b/web/src/views/it_mis/DeviceBrandViewSet/crud.tsx new file mode 100644 index 0000000000000000000000000000000000000000..7c5d062da9cfdca8c9bfc3cc40e8e7fb43b27824 --- /dev/null +++ b/web/src/views/it_mis/DeviceBrandViewSet/crud.tsx @@ -0,0 +1,89 @@ +import { CrudOptions, AddReq, DelReq, EditReq, dict, CrudExpose, compute, UserPageQuery, CreateCrudOptionsRet } from '@fast-crud/fast-crud'; +import _ from 'lodash-es'; +import * as api from './api'; +import { request } from '/@/utils/service'; +import { dictionary } from '/@/utils/dictionary'; +import {inject} from "vue"; + + + +//此处为crudOptions配置 +export default function ({ crudExpose}: { crudExpose: CrudExpose}): CreateCrudOptionsRet { + const pageRequest = async (query: any) => { + return await api.GetList(query); + }; + const editRequest = async ({ form, row }: EditReq) => { + if (row.id) { + form.id = row.id; + } + return await api.UpdateObj(form); + }; + const delRequest = async ({ row }: DelReq) => { + return await api.DelObj(row.id); + }; + const addRequest = async ({ form }: AddReq) => { + return await api.AddObj(form); + }; + + const exportRequest = async (query: UserPageQuery) => { + return await api.exportData(query) + }; + + + + + + + + return { + crudOptions: { + request: { + pageRequest, + addRequest, + editRequest, + delRequest, + }, + actionbar: { + buttons: { + export:{ + click(){ + return exportRequest(crudExpose.getSearchFormData()) + } + } + } + }, + form: { + col: { span: 24 }, + labelWidth: '100px', + wrapper: { + is: 'el-dialog', + width: '600px', + }, + + }, + columns: { + title: { + title: '设备品牌', + type: 'input', + search: { show: true}, + column: { + minWidth: 120, + sortable: 'custom', + }, + form: { + rules: [{ required: true, message: '设备品牌名称必填' }], + component: { + placeholder: '请输入设备品牌', + }, + }, + }, + + + + + + }, + + }, + }; +}; diff --git a/web/src/views/it_mis/DeviceBrandViewSet/index.vue b/web/src/views/it_mis/DeviceBrandViewSet/index.vue new file mode 100644 index 0000000000000000000000000000000000000000..2925af2754eb77d7b3c2c57199f7a89050eda3d8 --- /dev/null +++ b/web/src/views/it_mis/DeviceBrandViewSet/index.vue @@ -0,0 +1,53 @@ + + + + + diff --git a/web/src/views/it_mis/DeviceModelViewSet/api.ts b/web/src/views/it_mis/DeviceModelViewSet/api.ts new file mode 100644 index 0000000000000000000000000000000000000000..03f7ac1b6dcf2831c5b34110ac6bb8eeef7503cd --- /dev/null +++ b/web/src/views/it_mis/DeviceModelViewSet/api.ts @@ -0,0 +1,50 @@ +import { request,downloadFile } from '/@/utils/service'; +import { PageQuery, AddReq, DelReq, EditReq, InfoReq } from '@fast-crud/fast-crud'; + +export const apiPrefix = '/api/DeviceModelViewSet/'; + +export function GetList(query: PageQuery) { + return request({ + url: apiPrefix, + method: 'get', + params: query, + }); +} +export function GetObj(id: InfoReq) { + return request({ + url: apiPrefix + id, + method: 'get', + }); +} + +export function AddObj(obj: AddReq) { + return request({ + url: apiPrefix, + method: 'post', + data: obj, + }); +} + +export function UpdateObj(obj: EditReq) { + return request({ + url: apiPrefix + obj.id + '/', + method: 'put', + data: obj, + }); +} + +export function DelObj(id: DelReq) { + return request({ + url: apiPrefix + id + '/', + method: 'delete', + data: { id }, + }); +} + +export function exportData(params:any){ + return downloadFile({ + url: apiPrefix + 'export_data/', + params: params, + method: 'get' + }) +} diff --git a/web/src/views/it_mis/DeviceModelViewSet/crud.tsx b/web/src/views/it_mis/DeviceModelViewSet/crud.tsx new file mode 100644 index 0000000000000000000000000000000000000000..ced99633ade98fb0409ac9d932e2f6ddfa6ba195 --- /dev/null +++ b/web/src/views/it_mis/DeviceModelViewSet/crud.tsx @@ -0,0 +1,91 @@ +import { AddReq, DelReq, EditReq, dict, CrudExpose, compute, UserPageQuery, CreateCrudOptionsRet} from '@fast-crud/fast-crud'; +import _ from 'lodash-es'; +import * as api from './api'; +import { request } from '/@/utils/service'; +import { dictionary } from '/@/utils/dictionary'; +import {inject} from "vue"; + + + +//此处为crudOptions配置 + export default function ({ crudExpose}: { crudExpose: CrudExpose}): CreateCrudOptionsRet { + const pageRequest = async (query: any) => { + return await api.GetList(query); + }; + const editRequest = async ({ form, row }: EditReq) => { + if (row.id) { + form.id = row.id; + } + return await api.UpdateObj(form); + }; + const delRequest = async ({ row }: DelReq) => { + return await api.DelObj(row.id); + }; + const addRequest = async ({ form }: AddReq) => { + return await api.AddObj(form); + }; + + const exportRequest = async (query: UserPageQuery) => { + return await api.exportData(query) + }; + + + + + + + return { + crudOptions: { + request: { + pageRequest, + addRequest, + editRequest, + delRequest, + }, + actionbar: { + buttons: { + export:{ + click(){ + return exportRequest(crudExpose.getSearchFormData()) + } + } + } + }, + form: { + col: { span: 24 }, + labelWidth: '100px', + wrapper: { + is: 'el-dialog', + width: '600px', + }, + + }, + columns: { + + + + title: { + title: '设备型号', + type: 'input', + search: { show: true}, + column: { + minWidth: 120, + sortable: 'custom', + }, + form: { + rules: [{ required: true, message: '设备型号名称必填' }], + component: { + placeholder: '请输入设备型号', + }, + }, + }, + + + + + + }, + + }, + }; +}; diff --git a/web/src/views/it_mis/DeviceModelViewSet/index.vue b/web/src/views/it_mis/DeviceModelViewSet/index.vue new file mode 100644 index 0000000000000000000000000000000000000000..ffe669a17ca79bf08397020271b438b818586e93 --- /dev/null +++ b/web/src/views/it_mis/DeviceModelViewSet/index.vue @@ -0,0 +1,53 @@ + + + + + diff --git a/web/src/views/it_mis/DeviceType/api.ts b/web/src/views/it_mis/DeviceType/api.ts new file mode 100644 index 0000000000000000000000000000000000000000..08497df0e8eae9f45f400a634bc067986c5e27b2 --- /dev/null +++ b/web/src/views/it_mis/DeviceType/api.ts @@ -0,0 +1,50 @@ +import { request,downloadFile } from '/@/utils/service'; +import { PageQuery, AddReq, DelReq, EditReq, InfoReq } from '@fast-crud/fast-crud'; + +export const apiPrefix = '/api/DeviceTypeViewSet/'; + +export function GetList(query: PageQuery) { + return request({ + url: apiPrefix, + method: 'get', + params: query, + }); +} +export function GetObj(id: InfoReq) { + return request({ + url: apiPrefix + id, + method: 'get', + }); +} + +export function AddObj(obj: AddReq) { + return request({ + url: apiPrefix, + method: 'post', + data: obj, + }); +} + +export function UpdateObj(obj: EditReq) { + return request({ + url: apiPrefix + obj.id + '/', + method: 'put', + data: obj, + }); +} + +export function DelObj(id: DelReq) { + return request({ + url: apiPrefix + id + '/', + method: 'delete', + data: { id }, + }); +} + +export function exportData(params:any){ + return downloadFile({ + url: apiPrefix + 'export_data/', + params: params, + method: 'get' + }) +} diff --git a/web/src/views/it_mis/DeviceType/crud.tsx b/web/src/views/it_mis/DeviceType/crud.tsx new file mode 100644 index 0000000000000000000000000000000000000000..38682f03d9ad7bfbb4dc1556abb06731b3cea107 --- /dev/null +++ b/web/src/views/it_mis/DeviceType/crud.tsx @@ -0,0 +1,92 @@ +import { AddReq, DelReq, EditReq, dict, CrudExpose, compute, UserPageQuery, CreateCrudOptionsRet} from '@fast-crud/fast-crud'; +import _ from 'lodash-es'; +import * as api from './api'; +import { request } from '/@/utils/service'; +import { dictionary } from '/@/utils/dictionary'; + +import {inject} from "vue"; + + + +//此处为crudOptions配置 + export default function ({ crudExpose}: { crudExpose: CrudExpose}): CreateCrudOptionsRet { + const pageRequest = async (query: any) => { + return await api.GetList(query); + }; + const editRequest = async ({ form, row }: EditReq) => { + if (row.id) { + form.id = row.id; + } + return await api.UpdateObj(form); + }; + const delRequest = async ({ row }: DelReq) => { + return await api.DelObj(row.id); + }; + const addRequest = async ({ form }: AddReq) => { + return await api.AddObj(form); + }; + + const exportRequest = async (query: UserPageQuery) => { + return await api.exportData(query) + }; + + + + + + + return { + crudOptions: { + request: { + pageRequest, + addRequest, + editRequest, + delRequest, + }, + actionbar: { + buttons: { + export:{ + click(){ + return exportRequest(crudExpose.getSearchFormData()) + } + } + } + }, + form: { + col: { span: 24 }, + labelWidth: '100px', + wrapper: { + is: 'el-dialog', + width: '600px', + }, + + }, + columns: { + + + + title: { + title: '设备类型', + type: 'input', + search: { show: true}, + column: { + minWidth: 120, + sortable: 'custom', + }, + form: { + rules: [{ required: true, message: '设备类型名称必填' }], + component: { + placeholder: '请输入设备类型', + }, + }, + }, + + + + + + }, + + }, + }; +}; diff --git a/web/src/views/it_mis/DeviceType/index.vue b/web/src/views/it_mis/DeviceType/index.vue new file mode 100644 index 0000000000000000000000000000000000000000..e1bd7d14187c29a9cf6b6107b64bdb581baabcbb --- /dev/null +++ b/web/src/views/it_mis/DeviceType/index.vue @@ -0,0 +1,56 @@ + + + + + diff --git a/web/src/views/it_mis/Disk/api.ts b/web/src/views/it_mis/Disk/api.ts new file mode 100644 index 0000000000000000000000000000000000000000..2ab80382bd09b9206ef3984e3996f4285558caf1 --- /dev/null +++ b/web/src/views/it_mis/Disk/api.ts @@ -0,0 +1,50 @@ +import { request,downloadFile } from '/@/utils/service'; +import { PageQuery, AddReq, DelReq, EditReq, InfoReq } from '@fast-crud/fast-crud'; + +export const apiPrefix = '/api/DiskViewSet/'; + +export function GetList(query: PageQuery) { + return request({ + url: apiPrefix, + method: 'get', + params: query, + }); +} +export function GetObj(id: InfoReq) { + return request({ + url: apiPrefix + id, + method: 'get', + }); +} + +export function AddObj(obj: AddReq) { + return request({ + url: apiPrefix, + method: 'post', + data: obj, + }); +} + +export function UpdateObj(obj: EditReq) { + return request({ + url: apiPrefix + obj.id + '/', + method: 'put', + data: obj, + }); +} + +export function DelObj(id: DelReq) { + return request({ + url: apiPrefix + id + '/', + method: 'delete', + data: { id }, + }); +} + +export function exportData(params:any){ + return downloadFile({ + url: apiPrefix + 'export_data/', + params: params, + method: 'get' + }) +} diff --git a/web/src/views/it_mis/Disk/crud.tsx b/web/src/views/it_mis/Disk/crud.tsx new file mode 100644 index 0000000000000000000000000000000000000000..ee62c727cbb1c1bfbaa78e1bf4b8aa2ca118b504 --- /dev/null +++ b/web/src/views/it_mis/Disk/crud.tsx @@ -0,0 +1,90 @@ +import { AddReq, DelReq, EditReq, dict, CrudExpose, compute, UserPageQuery, CreateCrudOptionsRet} from '@fast-crud/fast-crud'; +import _ from 'lodash-es'; +import * as api from './api'; +import { request } from '/@/utils/service'; +import { dictionary } from '/@/utils/dictionary'; + +import {inject} from "vue"; + + + +//此处为crudOptions配置 + export default function ({ crudExpose}: { crudExpose: CrudExpose}): CreateCrudOptionsRet { + const pageRequest = async (query: any) => { + return await api.GetList(query); + }; + const editRequest = async ({ form, row }: EditReq) => { + if (row.id) { + form.id = row.id; + } + return await api.UpdateObj(form); + }; + const delRequest = async ({ row }: DelReq) => { + return await api.DelObj(row.id); + }; + const addRequest = async ({ form }: AddReq) => { + return await api.AddObj(form); + }; + + const exportRequest = async (query: UserPageQuery) => { + return await api.exportData(query) + }; + + + + + + + return { + crudOptions: { + request: { + pageRequest, + addRequest, + editRequest, + delRequest, + }, + actionbar: { + buttons: { + export:{ + click(){ + return exportRequest(crudExpose.getSearchFormData()) + } + } + } + }, + form: { + col: { span: 24 }, + labelWidth: '100px', + wrapper: { + is: 'el-dialog', + width: '600px', + }, + + }, + columns: { + + title: { + title: '硬盘大小', + type: 'input', + search: { show: true}, + column: { + minWidth: 120, + sortable: 'custom', + }, + form: { + rules: [{ required: true, message: '硬盘大小名称必填' }], + component: { + placeholder: '请输入硬盘大小', + }, + }, + }, + + + + + + }, + + }, + }; +}; diff --git a/web/src/views/it_mis/Disk/index.vue b/web/src/views/it_mis/Disk/index.vue new file mode 100644 index 0000000000000000000000000000000000000000..6037ccde45de6a5060880ddb8ed67a2330f47941 --- /dev/null +++ b/web/src/views/it_mis/Disk/index.vue @@ -0,0 +1,55 @@ + + + + + diff --git a/web/src/views/it_mis/ItNetInfoTables/DevicePortModelViewSet/api.ts b/web/src/views/it_mis/ItNetInfoTables/DevicePortModelViewSet/api.ts new file mode 100644 index 0000000000000000000000000000000000000000..ed9f43eae4f6a44b74380dce24203951f22be9ea --- /dev/null +++ b/web/src/views/it_mis/ItNetInfoTables/DevicePortModelViewSet/api.ts @@ -0,0 +1,50 @@ +import { request,downloadFile } from '/@/utils/service'; +import { PageQuery, AddReq, DelReq, EditReq, InfoReq } from '@fast-crud/fast-crud'; + +export const apiPrefix = '/api/DevicePortModelViewSet/'; + +export function GetList(query: PageQuery) { + return request({ + url: apiPrefix, + method: 'get', + params: query, + }); +} +export function GetObj(id: InfoReq) { + return request({ + url: apiPrefix + id, + method: 'get', + }); +} + +export function AddObj(obj: AddReq) { + return request({ + url: apiPrefix, + method: 'post', + data: obj, + }); +} + +export function UpdateObj(obj: EditReq) { + return request({ + url: apiPrefix + obj.id + '/', + method: 'put', + data: obj, + }); +} + +export function DelObj(id: DelReq) { + return request({ + url: apiPrefix + id + '/', + method: 'delete', + data: { id }, + }); +} + +export function exportData(params:any){ + return downloadFile({ + url: apiPrefix + 'export_data/', + params: params, + method: 'get' + }) +} diff --git a/web/src/views/it_mis/ItNetInfoTables/DevicePortModelViewSet/crud.tsx b/web/src/views/it_mis/ItNetInfoTables/DevicePortModelViewSet/crud.tsx new file mode 100644 index 0000000000000000000000000000000000000000..a4024bdcb8eca4c3e48e2c8d81afd3e5e8bba58c --- /dev/null +++ b/web/src/views/it_mis/ItNetInfoTables/DevicePortModelViewSet/crud.tsx @@ -0,0 +1,93 @@ +import { AddReq, DelReq, EditReq, dict, CrudExpose, compute, UserPageQuery, CreateCrudOptionsRet} from '@fast-crud/fast-crud'; +import _ from 'lodash-es'; +import * as api from './api'; +import { request } from '/@/utils/service'; +import { dictionary } from '/@/utils/dictionary'; +import {inject} from "vue"; + + + +//此处为crudOptions配置 + export default function ({ crudExpose}: { crudExpose: CrudExpose}): CreateCrudOptionsRet { + const pageRequest = async (query: any) => { + return await api.GetList(query); + }; + const editRequest = async ({ form, row }: EditReq) => { + if (row.id) { + form.id = row.id; + } + return await api.UpdateObj(form); + }; + const delRequest = async ({ row }: DelReq) => { + return await api.DelObj(row.id); + }; + const addRequest = async ({ form }: AddReq) => { + return await api.AddObj(form); + }; + + const exportRequest = async (query: UserPageQuery) => { + return await api.exportData(query) + }; + + + + + + + return { + crudOptions: { + request: { + pageRequest, + addRequest, + editRequest, + delRequest, + }, + actionbar: { + buttons: { + export:{ + click(){ + return exportRequest(crudExpose.getSearchFormData()) + } + } + } + }, + form: { + col: { span: 24 }, + labelWidth: '100px', + wrapper: { + is: 'el-dialog', + width: '600px', + }, + + }, + columns: { + title: { + title: '设备端口', + type: 'input', + search: { show: true}, + column: { + minWidth: 120, + sortable: 'custom', + }, + form: { + rules: [{ required: true, message: '设备端口必填' }], + component: { + placeholder: '请输入设备端口', + }, + }, + }, + + description: { + title: '备注说明', + type: 'input', + column: { + minWidth: 120, + sortable: 'custom', + }, + }, + + }, + + }, + }; +}; diff --git a/web/src/views/it_mis/ItNetInfoTables/DevicePortModelViewSet/index.vue b/web/src/views/it_mis/ItNetInfoTables/DevicePortModelViewSet/index.vue new file mode 100644 index 0000000000000000000000000000000000000000..64c5f374d7bdd66e12e720ec55e9f7b067be78b6 --- /dev/null +++ b/web/src/views/it_mis/ItNetInfoTables/DevicePortModelViewSet/index.vue @@ -0,0 +1,55 @@ + + + + + diff --git a/web/src/views/it_mis/ItNetInfoTables/ItNetInfoSubModelViewSet/ItNetInfoSubModelViewSetSub/api.ts b/web/src/views/it_mis/ItNetInfoTables/ItNetInfoSubModelViewSet/ItNetInfoSubModelViewSetSub/api.ts new file mode 100644 index 0000000000000000000000000000000000000000..7fa11da1d0526d33040a5a83a212656760894e63 --- /dev/null +++ b/web/src/views/it_mis/ItNetInfoTables/ItNetInfoSubModelViewSet/ItNetInfoSubModelViewSetSub/api.ts @@ -0,0 +1,56 @@ +import { id } from 'element-plus/es/locale'; +import { request,downloadFile } from '/@/utils/service'; +import { PageQuery, AddReq, DelReq, EditReq, InfoReq } from '@fast-crud/fast-crud'; + +export const apiPrefix = '/api/ItNetInfoSubModelViewSet/'; + + +export function GetList(query: PageQuery) { + return request({ + url: apiPrefix, + method: 'get', + params: query, // 注释编号:django-vue3-admin__api351018:取消传入父ID做参数的功能,fastcrud官方已经直接把父ID放在query里面了 + }) +} + + + + +export function GetObj(id: InfoReq) { + return request({ + url: apiPrefix + id, + method: 'get', + }); +} + +export function AddObj(obj: AddReq) { + return request({ + url: apiPrefix, + method: 'post', + data: obj, + }); +} + +export function UpdateObj(obj: EditReq) { + return request({ + url: apiPrefix + obj.id + '/', + method: 'put', + data: obj, + }); +} + +export function DelObj(id: DelReq) { + return request({ + url: apiPrefix + id + '/', + method: 'delete', + data: { id }, + }); +} + +export function exportData(params:any){ + return downloadFile({ + url: apiPrefix + 'export_data/', + params: params, + method: 'get' + }) +} diff --git a/web/src/views/it_mis/ItNetInfoTables/ItNetInfoSubModelViewSet/ItNetInfoSubModelViewSetSub/crud.tsx b/web/src/views/it_mis/ItNetInfoTables/ItNetInfoSubModelViewSet/ItNetInfoSubModelViewSetSub/crud.tsx new file mode 100644 index 0000000000000000000000000000000000000000..0b84ed7cc8891a9ded31ea05ce7ac3eb5d0d1224 --- /dev/null +++ b/web/src/views/it_mis/ItNetInfoTables/ItNetInfoSubModelViewSet/ItNetInfoSubModelViewSetSub/crud.tsx @@ -0,0 +1,220 @@ +import { + AddReq, + CreateCrudOptionsProps, + CreateCrudOptionsRet, + DelReq, + dict, + EditReq, + UserPageQuery, + UserPageRes + } from "@fast-crud/fast-crud"; + import * as api from "./api"; + import { request } from '/@/utils/service'; + import { dictionary } from '/@/utils/dictionary'; + + export default function ({ crudExpose, context }: CreateCrudOptionsProps): CreateCrudOptionsRet { + const { crudBinding } = crudExpose; + const { parentIdRef } = context; + const pageRequest = async (query: any) => { + return await api.GetList(query); // 注释编号:django-vue3-admin__crud312516:取消传入父ID做参数的功能,fastcrud官方已经直接把父ID放在query里面了 + }; + const editRequest = async ({ form, row }: EditReq) => { + if (form.id == null) { + form.id = row.id; + } + return await api.UpdateObj(form); + }; + const delRequest = async ({ row }: DelReq) => { + return await api.DelObj(row.id); + }; + + const addRequest = async ({ form }: AddReq) => { + + // 注释编号:django-vue3-admin__crud512516:这里要进行修改,需要返回ID对行,不然第二次点击新增时,会引发两条数据同时进行编辑 + const result = await api.AddObj(form); + return { id: result.data.id }; + }; + + return { + crudOptions: { + request: { + pageRequest, + addRequest, + editRequest, + delRequest + }, + actionbar: { + buttons: { + add: { + show: false + }, + addRow: { + show: true + } + } + }, + search: { + show: false, + initialForm: { + parentId: parentIdRef + } + }, + toolbar: { + show: false, + buttons: { + refresh: { + show: false, + } + } + }, + table: { + editable: { + enabled: true, + mode: "row", + activeDefault: false, + exclusive: true, + exclusiveEffect: "save", // "cancel" | "save"; + addRow: (data: any[], row: any)=>{ + // (data: any[], row: any) => void + //在最后一行插入数据 + data.push(row) + }, + } + }, + + pagination: { show: false, pageSize: 9999999 }, + columns: { + itnetinfo: { + title: '网络资源信息', + type: 'dict-select', + dict: dict({ + // prototype: true, //这里不建议开启prototype,因为在prototype模式下,每一条数据都会进行单独的请求一次,如果有100条数据就得单独的请求100次. + isTree: true, + url: '/api/ItNetInfoSubModelStatuViewSet/status/', + value: 'id', + label: 'title', + getData: async ({ url}: { url: string}) => { + // 这里专门传了当前的form进来,是为了拿到他的值form.soft_licence然后再进行拼接路由,这样后端就可以拿到当前form的某个值进行筛选了。 + // 注意这里要想拿到form.soft_licence字段是根据自己的model表解决了,要根本使用情况而修改 + let pkid = 0 //这时初始设置为0,配置拿不到值的情况 + + if (parentIdRef.value){ + pkid = parentIdRef.value //这是配置拿到值的情况 + } + return request({ + url: url + pkid + "/?limit=999", //这是做了一个拼接路由URL地址 + }).then((ret: any) => { + return ret.data; + }); + }, + + }), + column: { + minWidth: 140, //最小列宽 + }, + form:{ + // rules: [ + // // 表单校验规则 + // { + // required: true, + // message: '必填项', + // }, + // ], + component:{ + filterable: true, + }, + }, + }, + device_port: { + title: '端口', + type: 'dict-select', + dict: dict({ + url: '/api/DevicePortModelViewSet/?limit=999', + value: 'id', + label: 'title', + getData: async ({ url }: { url: string }) => { + return request({ + url: url, + }).then((ret: any) => { + return ret.data; + }); + }, + }), + column: { + minWidth: 80, //最小列宽 + }, + form:{ + // rules: [ + // // 表单校验规则 + // { + // required: true, + // message: '必填项', + // }, + // ], + component:{ + filterable: true, + }, + }, + }, + use_status: { + title: '使用状态', + type: 'dict-select', + dict: dict({ + value: 'dictNum', + label: 'dictName', + getData: async ({ url }: { url: string }) => { + const curId = await request({ + url: '/api/globalDictModelViewSet/?dictName=ItNetInfo_use_status_choices', + }).then((ret: any) => { + return ret.data[0].id; + }); + return request({ + url: `/api/globalDictModelViewSet/?limit=999&dictMark=${curId}`, + }).then((ret: any) => { + return ret.data; + }); + }, + }), + // readonly:true, // 只读的开关 + form: { + value:2, + clearable: false, + helper:'这个字段默认未用状态,如果被IT资源所引用就会自动修改为在用状态', + component: { + span: 12, + }, + }, + component: { props: { color: 'auto' } }, // 自动染色 + }, + + + + description: { + title: "备注说明", + type: "input", + }, + + // 注释编号:django-vue3-admin__crud192716:代码开始行 + // 功能说明:这里要注意配置父ID的外键对应的字段,并且设置他的值value: parentIdRef,注意,这里的parentIdRef是由子表对应的index计算拿到之后传过来的. + + // 注释编号:django-vue3-admin__crud192716:代码结束行 + //这里改为后端model中对应的外健 + parentId: { + title: "父Id", + type: "number", + form: { + value: parentIdRef, + component: { + disabled: true, + } + }, + //在页面隐藏起来,不让用户看到父Id字段 + column: { + show: false, + } + }, + } + } + }; + } + \ No newline at end of file diff --git a/web/src/views/it_mis/ItNetInfoTables/ItNetInfoSubModelViewSet/ItNetInfoSubModelViewSetSub/index.vue b/web/src/views/it_mis/ItNetInfoTables/ItNetInfoSubModelViewSet/ItNetInfoSubModelViewSetSub/index.vue new file mode 100644 index 0000000000000000000000000000000000000000..c7d6e1f5973265980cbe8179ca5bc82b7feaa831 --- /dev/null +++ b/web/src/views/it_mis/ItNetInfoTables/ItNetInfoSubModelViewSet/ItNetInfoSubModelViewSetSub/index.vue @@ -0,0 +1,115 @@ + + + + \ No newline at end of file diff --git a/web/src/views/it_mis/ItNetInfoTables/ItNetInfoSubModelViewSet/api.ts b/web/src/views/it_mis/ItNetInfoTables/ItNetInfoSubModelViewSet/api.ts new file mode 100644 index 0000000000000000000000000000000000000000..cc40226b1a581648fbd35c49c059bd8dbd577e23 --- /dev/null +++ b/web/src/views/it_mis/ItNetInfoTables/ItNetInfoSubModelViewSet/api.ts @@ -0,0 +1,50 @@ +import { request,downloadFile } from '/@/utils/service'; +import { PageQuery, AddReq, DelReq, EditReq, InfoReq } from '@fast-crud/fast-crud'; + +export const apiPrefix = '/api/ItNetInfoSubModelViewSet/'; + +export function GetList(query: PageQuery) { + return request({ + url: apiPrefix, + method: 'get', + params: query, + }); +} +export function GetObj(id: InfoReq) { + return request({ + url: apiPrefix + id, + method: 'get', + }); +} + +export function AddObj(obj: AddReq) { + return request({ + url: apiPrefix, + method: 'post', + data: obj, + }); +} + +export function UpdateObj(obj: EditReq) { + return request({ + url: apiPrefix + obj.id + '/', + method: 'put', + data: obj, + }); +} + +export function DelObj(id: DelReq) { + return request({ + url: apiPrefix + id + '/', + method: 'delete', + data: { id }, + }); +} + +export function exportData(params:any){ + return downloadFile({ + url: apiPrefix + 'export_data/', + params: params, + method: 'get' + }) +} diff --git a/web/src/views/it_mis/ItNetInfoTables/ItNetInfoSubModelViewSet/crud.tsx b/web/src/views/it_mis/ItNetInfoTables/ItNetInfoSubModelViewSet/crud.tsx new file mode 100644 index 0000000000000000000000000000000000000000..708613de89728bb5f0e5efe983730c9f626874e9 --- /dev/null +++ b/web/src/views/it_mis/ItNetInfoTables/ItNetInfoSubModelViewSet/crud.tsx @@ -0,0 +1,211 @@ +import { AddReq, DelReq, EditReq, dict, CrudExpose, compute, UserPageQuery, CreateCrudOptionsRet} from '@fast-crud/fast-crud'; +import _ from 'lodash-es'; +import * as api from './api'; +import { request } from '/@/utils/service'; +import { dictionary } from '/@/utils/dictionary'; +import {inject} from "vue"; + + +import ItResourceViewSet from "/@/views/it_mis/ItResource/crud"; +import { useRouter } from "vue-router"; + + +//此处为crudOptions配置 + export default function ({ crudExpose}: { crudExpose: CrudExpose}): CreateCrudOptionsRet { + const pageRequest = async (query: any) => { + return await api.GetList(query); + }; + const editRequest = async ({ form, row }: EditReq) => { + if (row.id) { + form.id = row.id; + } + return await api.UpdateObj(form); + }; + const delRequest = async ({ row }: DelReq) => { + return await api.DelObj(row.id); + }; + const addRequest = async ({ form }: AddReq) => { + return await api.AddObj(form); + }; + + const exportRequest = async (query: UserPageQuery) => { + return await api.exportData(query) + }; + + + + + + + const router = useRouter(); + + return { + crudOptions: { + request: { + pageRequest, + addRequest, + editRequest, + delRequest, + }, + actionbar: { + buttons: { + export:{ + click(){ + return exportRequest(crudExpose.getSearchFormData()) + } + } + } + }, + form: { + col: { span: 24 }, + labelWidth: '100px', + wrapper: { + is: 'el-dialog', + width: '600px', + }, + + }, + columns: { + itnetinfo: { + title: '网络资源信息', + type: 'dict-select', + dict: dict({ + url: '/api/ItNetInfoViewSet/?limit=999', + value: 'id', + label: 'title', + getData: async ({ url }: { url: string }) => { + return request({ + url: url, + }).then((ret: any) => { + return ret.data; + }); + }, + }), + column: { + minWidth: 100, //最小列宽 + }, + }, + device_port: { + title: '端口', + type: 'dict-select', + dict: dict({ + url: '/api/DevicePortModelViewSet/?limit=999', + value: 'id', + label: 'title', + getData: async ({ url }: { url: string }) => { + return request({ + url: url, + }).then((ret: any) => { + return ret.data; + }); + }, + }), + column: { + minWidth: 100, //最小列宽 + }, + }, + used_by: { + title: '使用者', + search: { + // disabled: true, + show: true, + }, + type: 'table-select', + readonly:true, + dict: dict({ + isTree: true, + value: 'id', + label: 'it_use_id', //这个it_use字段是后端懒加载把他转为对应的值转过来的。 + getNodesByValues: async (values: any[]) => { + if (!values.includes("")) { + const fieldList = ["id", "it_use_id"] + return request({ + url: '/api/ItResourceViewSet/' + "getbyIds/", + method: "post", + data: { values, fieldList }, + }).then((ret: any) => { + return ret.data; + }); + } + }, + }), + column: { + minWidth: 150, //最小列宽 + }, + form: { + suffixRender({value}) { + //这里把当前的value传进去 + function goto({value}: {value: any}) { + if (!value){ + // 这里判断当选项没有值是,用户又点了跳转按钮,那说明是需要新增对象 + value =0 + } + // 这里是跳转至相应的路由,把value给到id + //这里整个配置主要name:'ItResourceSetNewPageEdit'便可 + router.push({name:'ItResourceSetNewPageEdit',params:{id:value}}) + } + return ( + // 这里配置一个跳转的按钮及引用函数 + + goto({value})} >跳转 + + ); + }, + component: { + rowKey: "id", //element-plus 必传 + createCrudOptions: ItResourceViewSet, + filterable: true, + placeholder: '请选择', + props: { + props: { + value: 'id', + label: 'it_use_id', //这个it_use_name字段是后端单独序列化出来使用的,原来表没有的 + }, + }, + }, + }, + }, + use_status: { + title: '使用状态', + type: 'dict-select', + dict: dict({ + value: 'dictNum', + label: 'dictName', + getData: async ({ url }: { url: string }) => { + const curId = await request({ + url: '/api/globalDictModelViewSet/?dictName=ItNetInfo_use_status_choices', + }).then((ret: any) => { + return ret.data[0].id; + }); + return request({ + url: `/api/globalDictModelViewSet/?limit=999&dictMark=${curId}`, + }).then((ret: any) => { + return ret.data; + }); + }, + }), + // readonly:true, // 开关只读模式 + form: { + value:2, + clearable: false, + helper:'这个字段默认未用状态,如果被IT资源所引用就会自动修改为在用状态', + component: { + span: 12, + }, + }, + component: { props: { color: 'auto' } }, // 自动染色 + }, + description: { + title: '备注说明', + type: 'input', + column: { + minWidth: 120, + sortable: 'custom', + }, + }, + + }, + + }, + }; +}; diff --git a/web/src/views/it_mis/ItNetInfoTables/ItNetInfoSubModelViewSet/index.vue b/web/src/views/it_mis/ItNetInfoTables/ItNetInfoSubModelViewSet/index.vue new file mode 100644 index 0000000000000000000000000000000000000000..ba12f0487e181a0911bc208240ae14a379309a9d --- /dev/null +++ b/web/src/views/it_mis/ItNetInfoTables/ItNetInfoSubModelViewSet/index.vue @@ -0,0 +1,54 @@ + + + + + diff --git a/web/src/views/it_mis/ItNetInfoTables/ItNetInfoViewSet/api.ts b/web/src/views/it_mis/ItNetInfoTables/ItNetInfoViewSet/api.ts new file mode 100644 index 0000000000000000000000000000000000000000..52f37904b96644e4b4db71eac18f6ddcb34c906d --- /dev/null +++ b/web/src/views/it_mis/ItNetInfoTables/ItNetInfoViewSet/api.ts @@ -0,0 +1,50 @@ +import { request,downloadFile } from '/@/utils/service'; +import { PageQuery, AddReq, DelReq, EditReq, InfoReq } from '@fast-crud/fast-crud'; + +export const apiPrefix = '/api/ItNetInfoViewSet/'; + +export function GetList(query: PageQuery) { + return request({ + url: apiPrefix, + method: 'get', + params: query, + }); +} +export function GetObj(id: InfoReq) { + return request({ + url: apiPrefix + id, + method: 'get', + }); +} + +export function AddObj(obj: AddReq) { + return request({ + url: apiPrefix, + method: 'post', + data: obj, + }); +} + +export function UpdateObj(obj: EditReq) { + return request({ + url: apiPrefix + obj.id + '/', + method: 'put', + data: obj, + }); +} + +export function DelObj(id: DelReq) { + return request({ + url: apiPrefix + id + '/', + method: 'delete', + data: { id }, + }); +} + +export function exportData(params:any){ + return downloadFile({ + url: apiPrefix + 'export_data/', + params: params, + method: 'get' + }) +} diff --git a/web/src/views/it_mis/ItNetInfoTables/ItNetInfoViewSet/crud.tsx b/web/src/views/it_mis/ItNetInfoTables/ItNetInfoViewSet/crud.tsx new file mode 100644 index 0000000000000000000000000000000000000000..f7ab51d8684686a9889534a9a88127fe438957f6 --- /dev/null +++ b/web/src/views/it_mis/ItNetInfoTables/ItNetInfoViewSet/crud.tsx @@ -0,0 +1,643 @@ +import { AddReq, DelReq, EditReq, dict, CrudExpose, compute, UserPageQuery, CreateCrudOptionsRet} from '@fast-crud/fast-crud'; +import _ from 'lodash-es'; +import * as api from './api'; +import { request } from '/@/utils/service'; +import { dictionary } from '/@/utils/dictionary'; +import {inject} from "vue"; +import { useRouter } from "vue-router"; + + +// 注释编号:django-vue3-admin__crud083114:代码开始行 +// 功能说明:导入懒加载复用模块 + +import SuppliersViewSet from "/@/views/it_mis/SuppliersTables/SuppliersViewSet/crud"; +import ItNetTypeViewSet from "/@/views/it_mis/ItNetInfoTables/ItNetTypeViewSet/crud"; +import NetSpeedViewSet from "/@/views/it_mis/ItNetInfoTables/NetSpeedViewSet/crud"; +import ItResourceViewSet from "/@/views/it_mis/ItResource/crud"; +import it_area from "/@/views/PublicResource/area/crud"; +import company from "/@/views/PublicResource/company/crud"; +import department from "/@/views/PublicResource/department/crud"; + + +// 注释编号:django-vue3-admin__crud083114:代码结束行 + + +//此处为crudOptions配置 + export default function ({ crudExpose}: { crudExpose: CrudExpose}): CreateCrudOptionsRet { + const pageRequest = async (query: any) => { + return await api.GetList(query); + }; + const editRequest = async ({ form, row }: EditReq) => { + if (row.id) { + form.id = row.id; + } + return await api.UpdateObj(form); + }; + const delRequest = async ({ row }: DelReq) => { + return await api.DelObj(row.id); + }; + const addRequest = async ({ form }: AddReq) => { + return await api.AddObj(form); + }; + + const exportRequest = async (query: UserPageQuery) => { + return await api.exportData(query) + }; + + + + const router = useRouter(); + + return { + crudOptions: { + request: { + pageRequest, + addRequest, + editRequest, + delRequest, + }, + actionbar: { + buttons: { + export:{ + click(){ + return exportRequest(crudExpose.getSearchFormData()) + } + } + } + }, + search: { + container: { + layout: "multi-line" + }, + col: { + span: 4 + }, + options: { + labelWidth: "100px" + } + }, + form: { + col: { span: 12 }, //配置成一行两个元素 + labelPosition: "left", + labelWidth: "auto", //配置成lable的宽为自动 + requireAsteriskPosition:"right", //星号的位置 + row:{ gutter: 20}, //配置同一行内,两个元素之间空隙20px + }, + columns: { + area: { + title: '区域', + search: { + // disabled: true, + show: true, + }, + type: 'table-select', + dict: dict({ + isTree: true, + value: 'id', + label: 'title', + getNodesByValues: async (values: any[]) => { + if (!values.includes("")) { + return request({ + url: '/api/it_area/' + "getbyIds/", + method: "post", + data: { values } + }).then((ret: any) => { + return ret.data; + }); + } + } + }), + column: { + minWidth: 150, //最小列宽 + }, + form: { + // helper: { + // render() { + // return
区域是必需要填写的
; + // } + // }, + rules: [ + // 表单校验规则 + { + required: true, + message: '必填项', + }, + ], + component: { + rowKey: "id", //element-plus 必传 + createCrudOptions: it_area, + filterable: true, + placeholder: '请选择', + props: { + props: { + value: 'id', + label: 'title', + }, + }, + }, + }, + }, + company: { + title: '公司', + search: { + // disabled: true, + show: true, + }, + type: 'table-select', + dict: dict({ + isTree: true, + value: 'id', + label: 'title', + getNodesByValues: async (values: any[]) => { + if (!values.includes("")) { + return request({ + url: '/api/company/' + "getbyIds/", + method: "post", + data: { values } + }).then((ret: any) => { + return ret.data; + }); + } + }, + }), + column: { + minWidth: 150, //最小列宽 + }, + form: { + rules: [ + // 表单校验规则 + { + required: true, + message: '必填项', + }, + ], + component: { + rowKey: "id", //element-plus 必传 + createCrudOptions: company, + filterable: true, + placeholder: '请选择', + props: { + props: { + value: 'id', + label: 'title', + }, + }, + }, + }, + }, + + department: { + title: '部门', + search: { + // disabled: true, + show: true + }, + type: 'table-select', + dict: dict({ + isTree: true, + value: 'id', + label: 'title', + getNodesByValues: async (values: any[]) => { + if (!values.includes("")) { + return request({ + url: '/api/department/' + "getbyIds/", + method: "post", + data: { values } + }).then((ret: any) => { + return ret.data; + }); + } + }, + }), + column: { + minWidth: 150, //最小列宽 + }, + form: { + rules: [ + // 表单校验规则 + { + required: true, + message: '必填项', + }, + ], + component: { + rowKey: "id", //element-plus 必传 + createCrudOptions: department, + filterable: true, + placeholder: '请选择', + props: { + props: { + value: 'id', + label: 'title', + }, + }, + }, + }, + }, + title: { + title: '资源名称', + type: 'input', + search: { + show: true, + order: 0, + col:{span:8}, + component: { + placeholder: '可搜索资源名称,用户名及IPV4地址', + clearable: true, + }, + + }, + column: { + minWidth: 250, + sortable: 'custom', + }, + form: { + rules: [{ required: true, message: '资源名称必填' }], + component: { + placeholder: '请输入资源名称', + + }, + }, + }, + + suppliers: { + title: '供应商', + search: { + // disabled: true, + show: true, + }, + type: 'table-select', + dict: dict({ + isTree: true, + value: 'id', + label: 'title', + getNodesByValues: async (values: any[]) => { + if (!values.includes("")) { + return request({ + url: '/api/SuppliersViewSet/' + "getbyIds/", + method: "post", + data: { values } + }).then((ret: any) => { + return ret.data; + }); + } + }, + }), + column: { + minWidth: 250, //最小列宽 + }, + form: { + rules: [ + // 表单校验规则 + { + required: true, + message: '必填项', + }, + ], + component: { + rowKey: "id", //element-plus 必传 + createCrudOptions: SuppliersViewSet, + filterable: true, + placeholder: '请选择', + props: { + props: { + value: 'id', + label: 'title', + }, + }, + }, + }, + }, + type: { + title: '资源类型', + search: { + // disabled: true, + show: true, + }, + type: 'table-select', + dict: dict({ + isTree: true, + + value: 'id', + label: 'title', + getNodesByValues: async (values: any[]) => { + if (!values.includes("")) { + return request({ + url: '/api/ItNetTypeViewSet/' + "getbyIds/", + method: "post", + data: { values } + }).then((ret: any) => { + return ret.data; + }); + } + }, + }), + column: { + minWidth: 150, //最小列宽 + }, + form: { + rules: [ + // 表单校验规则 + { + required: true, + message: '必填项', + }, + ], + component: { + rowKey: "id", //element-plus 必传 + createCrudOptions: ItNetTypeViewSet, + filterable: true, + placeholder: '请选择', + props: { + props: { + value: 'id', + label: 'title', + }, + }, + }, + }, + }, + netspeed: { + title: '网络速率', + search: { + // disabled: true, + show: true, + }, + type: 'table-select', + dict: dict({ + isTree: true, + value: 'id', + label: 'title', + getNodesByValues: async (values: any[]) => { + if (!values.includes("")) { + return request({ + url: '/api/NetSpeedViewSet/' + "getbyIds/", + method: "post", + data: { values } + }).then((ret: any) => { + return ret.data; + }); + } + }, + }), + column: { + minWidth: 150, //最小列宽 + }, + form: { + rules: [ + // 表单校验规则 + { + required: true, + message: '必填项', + }, + ], + component: { + rowKey: "id", //element-plus 必传 + createCrudOptions: NetSpeedViewSet, + filterable: true, + placeholder: '请选择', + props: { + props: { + value: 'id', + label: 'title', + }, + }, + }, + }, + }, + code: { + title: '编码/编号', + type: 'input', + search: { show: true}, + column: { + minWidth: 160, + sortable: 'custom', + }, + form: { + component: { + placeholder: '请输入编码/编号', + }, + }, + }, + user: { + title: '使用帐号', + type: 'input', + search: { show: true}, + column: { + minWidth: 160, + sortable: 'custom', + }, + form: { + component: { + placeholder: '请输入使用帐号', + }, + }, + }, + password: { + title: '使用密码', + type: 'input', + search: { show: true}, + column: { + minWidth: 160, + sortable: 'custom', + }, + form: { + component: { + placeholder: '请输入使用帐号', + }, + }, + }, + ipv4:{ + title: "ipv4地址", + type: 'ip_input', + column: { + minWidth: 160, + sortable: 'custom', + }, + + }, + submask:{ + title: "子网掩码", + type: 'ip_input', + column: { + minWidth: 160, + sortable: 'custom', + }, + + }, + gateway:{ + title: "网关地址", + type: 'ip_input', + column: { + minWidth: 160, + sortable: 'custom', + }, + + }, + DNS1:{ + title: "DNS1地址", + type: 'ip_input', + column: { + minWidth: 160, + sortable: 'custom', + }, + + }, + DNS2:{ + title: "DNS2地址", + type: 'ip_input', + column: { + minWidth: 160, + sortable: 'custom', + }, + + }, + use_status: { + title: '使用状态', + type: 'dict-select', + dict: dict({ + value: 'dictNum', + label: 'dictName', + getData: async ({ url }: { url: string }) => { + const curId = await request({ + url: '/api/globalDictModelViewSet/?dictName=ItNetInfo_use_status_choices', + }).then((ret: any) => { + return ret.data[0].id; + }); + return request({ + url: `/api/globalDictModelViewSet/?limit=999&dictMark=${curId}`, + }).then((ret: any) => { + return ret.data; + }); + }, + }), + readonly:true, // 开启只读模式 + form: { + value:2, + clearable: false, + helper:'这个字段默认未用状态,如果被IT资源所引用就会自动修改为在用状态', + component: { + span: 12, + }, + }, + component: { props: { color: 'auto' } }, // 自动染色 + }, + used_by: { + title: '使用者', + search: { + // disabled: true, + show: true, + }, + type: 'table-select', + readonly:true, + dict: dict({ + isTree: true, + value: 'id', + label: 'it_use_id', //这个it_use_id字段是后端单独序列化出来使用的,原来表没有的 + getNodesByValues: async (values: any[]) => { + if (!values.includes("")) { + const fieldList = ["id", "it_use_id"] + return request({ + url: '/api/ItResourceViewSet/' + "getbyIds/", + method: "post", + data: { values, fieldList }, + }).then((ret: any) => { + return ret.data; + }); + } + }, + }), + column: { + minWidth: 150, //最小列宽 + }, + form: { + suffixRender({value}) { + //这里把当前的value传进去 + function goto({value}: {value: any}) { + if (!value){ + // 这里判断当选项没有值是,用户又点了跳转按钮,那说明是需要新增对象 + value =0 + } + // 这里是跳转至相应的路由,把value给到id + //这里整个配置主要name:'ItResourceSetNewPageEdit'便可 + router.push({name:'ItResourceSetNewPageEdit',params:{id:value}}) + } + return ( + // 这里配置一个跳转的按钮及引用函数 + + goto({value})} >跳转 + + ); + }, + component: { + rowKey: "id", //element-plus 必传 + createCrudOptions: ItResourceViewSet, + filterable: true, + placeholder: '请选择', + props: { + props: { + value: 'id', + label: 'it_use_id',//这个it_use_id字段是后端单独序列化出来使用的,原来表没有的 + }, + }, + // disabled: true, //禁用状态 + }, + }, + }, + used_by_port: { + title: '使用设备的端口', + type: 'dict-select', + dict: dict({ + url: '/api/DevicePortModelViewSet/?limit=999', + value: 'id', + label: 'title', + getData: async ({ url }: { url: string }) => { + return request({ + url: url, + }).then((ret: any) => { + return ret.data; + }); + }, + }), + column: { + minWidth: 140, //最小列宽 + }, + form:{ + component:{disabled: true} //禁用状态 + } + }, + other_description: { + title: '其它', + type: "input", + search: {show: false}, + form: { + component:{disabled: true} //禁用状态 + }, + column: { + minWidth: 120, + sortable: 'custom', + }, + }, + + description: { + title: '备注', + type: ["textarea","colspan"], + search: {show: false}, + form: { + component: { + rows:8, //配置一共默认占用8行的高度 + maxlength: 500, + placeholder: '输入备注', + }, + }, + column: { + minWidth: 120, + sortable: 'custom', + }, + }, + + }, + + }, + }; +}; diff --git a/web/src/views/it_mis/ItNetInfoTables/ItNetInfoViewSet/index.vue b/web/src/views/it_mis/ItNetInfoTables/ItNetInfoViewSet/index.vue new file mode 100644 index 0000000000000000000000000000000000000000..373420fa4906585781ee7900828c605a6bb99db0 --- /dev/null +++ b/web/src/views/it_mis/ItNetInfoTables/ItNetInfoViewSet/index.vue @@ -0,0 +1,55 @@ + + + + + \ No newline at end of file diff --git a/web/src/views/it_mis/ItNetInfoTables/ItNetInfoViewSet/viewAddEdit.vue b/web/src/views/it_mis/ItNetInfoTables/ItNetInfoViewSet/viewAddEdit.vue new file mode 100644 index 0000000000000000000000000000000000000000..2566b1082ffde5554d7e0cd4bc5b169cd1b4c65f --- /dev/null +++ b/web/src/views/it_mis/ItNetInfoTables/ItNetInfoViewSet/viewAddEdit.vue @@ -0,0 +1,252 @@ + + + \ No newline at end of file diff --git a/web/src/views/it_mis/ItNetInfoTables/ItNetTypeViewSet/api.ts b/web/src/views/it_mis/ItNetInfoTables/ItNetTypeViewSet/api.ts new file mode 100644 index 0000000000000000000000000000000000000000..21fc9c65cf0977881be66b69bbc3cf0cd0ecd099 --- /dev/null +++ b/web/src/views/it_mis/ItNetInfoTables/ItNetTypeViewSet/api.ts @@ -0,0 +1,50 @@ +import { request,downloadFile } from '/@/utils/service'; +import { PageQuery, AddReq, DelReq, EditReq, InfoReq } from '@fast-crud/fast-crud'; + +export const apiPrefix = '/api/ItNetTypeViewSet/'; + +export function GetList(query: PageQuery) { + return request({ + url: apiPrefix, + method: 'get', + params: query, + }); +} +export function GetObj(id: InfoReq) { + return request({ + url: apiPrefix + id, + method: 'get', + }); +} + +export function AddObj(obj: AddReq) { + return request({ + url: apiPrefix, + method: 'post', + data: obj, + }); +} + +export function UpdateObj(obj: EditReq) { + return request({ + url: apiPrefix + obj.id + '/', + method: 'put', + data: obj, + }); +} + +export function DelObj(id: DelReq) { + return request({ + url: apiPrefix + id + '/', + method: 'delete', + data: { id }, + }); +} + +export function exportData(params:any){ + return downloadFile({ + url: apiPrefix + 'export_data/', + params: params, + method: 'get' + }) +} diff --git a/web/src/views/it_mis/ItNetInfoTables/ItNetTypeViewSet/crud.tsx b/web/src/views/it_mis/ItNetInfoTables/ItNetTypeViewSet/crud.tsx new file mode 100644 index 0000000000000000000000000000000000000000..f915f598673523401fc69c08cc112b8761deae14 --- /dev/null +++ b/web/src/views/it_mis/ItNetInfoTables/ItNetTypeViewSet/crud.tsx @@ -0,0 +1,91 @@ +import { AddReq, DelReq, EditReq, dict, CrudExpose, compute, UserPageQuery, CreateCrudOptionsRet} from '@fast-crud/fast-crud'; +import _ from 'lodash-es'; +import * as api from './api'; +import { request } from '/@/utils/service'; +import { dictionary } from '/@/utils/dictionary'; +import {inject} from "vue"; + + + +//此处为crudOptions配置 + export default function ({ crudExpose}: { crudExpose: CrudExpose}): CreateCrudOptionsRet { + const pageRequest = async (query: any) => { + return await api.GetList(query); + }; + const editRequest = async ({ form, row }: EditReq) => { + if (row.id) { + form.id = row.id; + } + return await api.UpdateObj(form); + }; + const delRequest = async ({ row }: DelReq) => { + return await api.DelObj(row.id); + }; + const addRequest = async ({ form }: AddReq) => { + return await api.AddObj(form); + }; + + const exportRequest = async (query: UserPageQuery) => { + return await api.exportData(query) + }; + + + + + + + return { + crudOptions: { + request: { + pageRequest, + addRequest, + editRequest, + delRequest, + }, + actionbar: { + buttons: { + export:{ + click(){ + return exportRequest(crudExpose.getSearchFormData()) + } + } + } + }, + form: { + col: { span: 24 }, + labelWidth: '100px', + wrapper: { + is: 'el-dialog', + width: '600px', + }, + + }, + columns: { + + + + title: { + title: '网络资源类型', + type: 'input', + search: { show: true}, + column: { + minWidth: 120, + sortable: 'custom', + }, + form: { + rules: [{ required: true, message: '网络资源类型名称必填' }], + component: { + placeholder: '请输入网络资源类型', + }, + }, + }, + + + + + + }, + + }, + }; +}; diff --git a/web/src/views/it_mis/ItNetInfoTables/ItNetTypeViewSet/index.vue b/web/src/views/it_mis/ItNetInfoTables/ItNetTypeViewSet/index.vue new file mode 100644 index 0000000000000000000000000000000000000000..ba3f265abe7ef89457fe4256210ea6fb70b587f5 --- /dev/null +++ b/web/src/views/it_mis/ItNetInfoTables/ItNetTypeViewSet/index.vue @@ -0,0 +1,56 @@ + + + + + diff --git a/web/src/views/it_mis/ItNetInfoTables/NetSpeedViewSet/api.ts b/web/src/views/it_mis/ItNetInfoTables/NetSpeedViewSet/api.ts new file mode 100644 index 0000000000000000000000000000000000000000..6b4ecc27d5714e2883f26bdc7ea20048d163bb69 --- /dev/null +++ b/web/src/views/it_mis/ItNetInfoTables/NetSpeedViewSet/api.ts @@ -0,0 +1,50 @@ +import { request,downloadFile } from '/@/utils/service'; +import { PageQuery, AddReq, DelReq, EditReq, InfoReq } from '@fast-crud/fast-crud'; + +export const apiPrefix = '/api/NetSpeedViewSet/'; + +export function GetList(query: PageQuery) { + return request({ + url: apiPrefix, + method: 'get', + params: query, + }); +} +export function GetObj(id: InfoReq) { + return request({ + url: apiPrefix + id, + method: 'get', + }); +} + +export function AddObj(obj: AddReq) { + return request({ + url: apiPrefix, + method: 'post', + data: obj, + }); +} + +export function UpdateObj(obj: EditReq) { + return request({ + url: apiPrefix + obj.id + '/', + method: 'put', + data: obj, + }); +} + +export function DelObj(id: DelReq) { + return request({ + url: apiPrefix + id + '/', + method: 'delete', + data: { id }, + }); +} + +export function exportData(params:any){ + return downloadFile({ + url: apiPrefix + 'export_data/', + params: params, + method: 'get' + }) +} diff --git a/web/src/views/it_mis/ItNetInfoTables/NetSpeedViewSet/crud.tsx b/web/src/views/it_mis/ItNetInfoTables/NetSpeedViewSet/crud.tsx new file mode 100644 index 0000000000000000000000000000000000000000..d906a770ffad3375326b97e610ec3fbb51657845 --- /dev/null +++ b/web/src/views/it_mis/ItNetInfoTables/NetSpeedViewSet/crud.tsx @@ -0,0 +1,104 @@ +import { AddReq, DelReq, EditReq, dict, CrudExpose, compute, UserPageQuery, CreateCrudOptionsRet} from '@fast-crud/fast-crud'; +import _ from 'lodash-es'; +import * as api from './api'; +import { request } from '/@/utils/service'; +import { dictionary } from '/@/utils/dictionary'; +// import {inject} from "vue"; + + + +//此处为crudOptions配置 + export default function ({ crudExpose}: { crudExpose: CrudExpose}): CreateCrudOptionsRet { + const pageRequest = async (query: any) => { + return await api.GetList(query); + }; + const editRequest = async ({ form, row }: EditReq) => { + if (row.id) { + form.id = row.id; + } + return await api.UpdateObj(form); + }; + const delRequest = async ({ row }: DelReq) => { + return await api.DelObj(row.id); + }; + const addRequest = async ({ form }: AddReq) => { + return await api.AddObj(form); + }; + + const exportRequest = async (query: UserPageQuery) => { + return await api.exportData(query) + }; + + + + + + + return { + crudOptions: { + request: { + pageRequest, + addRequest, + editRequest, + delRequest, + }, + actionbar: { + buttons: { + export:{ + click(){ + return exportRequest(crudExpose.getSearchFormData()) + } + } + } + }, + form: { + col: { span: 24 }, + labelWidth: '100px', + wrapper: { + is: 'el-dialog', + width: '600px', + }, + + }, + columns: { + + + + title: { + title: '网络速率', + type: 'input', + search: { show: true}, + column: { + minWidth: 120, + sortable: 'custom', + }, + form: { + rules: [{ required: true, message: '网络速率名称必填' }], + component: { + placeholder: '请输入网络速率', + }, + }, + }, + other_info: { + title: '其它信息', + type: 'input', + search: { show: true}, + column: { + minWidth: 120, + sortable: 'custom', + }, + form: { + // rules: [{ required: true, message: '其它信息名称必填' }], + component: { + placeholder: '请输入其它信息', + }, + }, + }, + + + + }, + + }, + }; +}; diff --git a/web/src/views/it_mis/ItNetInfoTables/NetSpeedViewSet/index.vue b/web/src/views/it_mis/ItNetInfoTables/NetSpeedViewSet/index.vue new file mode 100644 index 0000000000000000000000000000000000000000..97cf2dc4cd4d4c9865e4179ee5451b9a0e37a416 --- /dev/null +++ b/web/src/views/it_mis/ItNetInfoTables/NetSpeedViewSet/index.vue @@ -0,0 +1,54 @@ + + + + + diff --git a/web/src/views/it_mis/ItResource/api.ts b/web/src/views/it_mis/ItResource/api.ts new file mode 100644 index 0000000000000000000000000000000000000000..0f6cb9bf69fee42078436272c10b0503131cebe3 --- /dev/null +++ b/web/src/views/it_mis/ItResource/api.ts @@ -0,0 +1,50 @@ +import { request,downloadFile } from '/@/utils/service'; +import { PageQuery, AddReq, DelReq, EditReq, InfoReq } from '@fast-crud/fast-crud'; + +export const apiPrefix = '/api/ItResourceViewSet/'; + +export function GetList(query: PageQuery) { + return request({ + url: apiPrefix, + method: 'get', + params: query, + }); +} +export function GetObj(id: InfoReq) { + return request({ + url: apiPrefix + id, + method: 'get', + }); +} + +export function AddObj(obj: AddReq) { + return request({ + url: apiPrefix, + method: 'post', + data: obj, + }); +} + +export function UpdateObj(obj: EditReq) { + return request({ + url: apiPrefix + obj.id + '/', + method: 'put', + data: obj, + }); +} + +export function DelObj(id: DelReq) { + return request({ + url: apiPrefix + id + '/', + method: 'delete', + data: { id }, + }); +} + +export function exportData(params:any){ + return downloadFile({ + url: apiPrefix + 'export_data/', + params: params, + method: 'get' + }) +} diff --git a/web/src/views/it_mis/ItResource/crud.tsx b/web/src/views/it_mis/ItResource/crud.tsx new file mode 100644 index 0000000000000000000000000000000000000000..3693d1ae43e965283cbf3b023b371301ede132aa --- /dev/null +++ b/web/src/views/it_mis/ItResource/crud.tsx @@ -0,0 +1,1114 @@ +import { CrudOptions, AddReq, DelReq, EditReq, dict, compute, UserPageQuery, CreateCrudOptionsProps, CreateCrudOptionsRet} from '@fast-crud/fast-crud'; +import _ from 'lodash-es'; +import * as api from './api'; +import { request } from '/@/utils/service'; +import { dictionary } from '/@/utils/dictionary'; +import { useRouter } from "vue-router"; + + +// 注释编号:django-vue3-admin__crud450112:代码开始行 +// 功能说明:导入懒加载外键对应的crud进行复用 +import it_area from "/@/views/PublicResource/area/crud"; +import department from "/@/views/PublicResource/department/crud"; +import organization from "/@/views/PublicResource/organization/crud"; +import DeviceTypeViewSet from "/@/views/it_mis/DeviceType/crud"; +import DeviceBrandViewSet from "/@/views/it_mis/DeviceBrandViewSet/crud"; +import DeviceModelViewSet from "/@/views/it_mis/DeviceModelViewSet/crud"; +import CpuViewSet from "/@/views/it_mis/Cpu/crud"; +import MemoryViewSet from "/@/views/it_mis/Memory/crud"; +import DiskViewSet from "/@/views/it_mis/Disk/crud"; +import SoftTypeViewSet from "/@/views/it_mis/SoftType/crud"; +import LicenceViewSet from "/@/views/it_mis/LicenceViewSet/crud"; +// 注释编号:django-vue3-admin__crud450112:代码结束行 + + +// 注释编号:django-vue3-admin__crud400716:这里引入光纤网络的子表进来 +import subTableComponent from "/@/views/it_mis/ItNetInfoTables/ItNetInfoSubModelViewSet/ItNetInfoSubModelViewSetSub/index.vue"; + + +// 注释编号:django-vue3-admin__crud564816:column.order:-950最好是根据第一个排序字段跳-10这样来,这样如果中间要追加排序的话也方便 + + +//此处为crudOptions配置 +// 注释编号:django-vue3-admin__crud443414:这里注意要把上下文context传进来,因为他带了index.vue中传过来的属性 +export default function (object: CreateCrudOptionsProps): CreateCrudOptionsRet { + + + const { crudBinding, crudRef } = object.crudExpose; + const { crudExpose } = object; + + const pageRequest = async (query: any) => { + return await api.GetList(query); + }; + const editRequest = async ({ form, row }: EditReq) => { + if (row.id) { //这里一定要判断row.id是否存在,存在才能form.id = row.id,要不会出现问题的 + form.id = row.id; + } + return await api.UpdateObj(form); + }; + const delRequest = async ({ row }: DelReq) => { + return await api.DelObj(row.id); + }; + const addRequest = async ({ form }: AddReq) => { + return await api.AddObj(form); + }; + + const exportRequest = async (query: UserPageQuery) => { + return await api.exportData(query) + }; + + //路由初始化 + const router = useRouter(); + + + + + + + + + return { + crudOptions: { + request: { + pageRequest, + addRequest, + editRequest, + delRequest, + }, + //这个search是配置多行搜索配置的 + search: { + container: { + layout: "multi-line" + }, + col: { + span: 4 + }, + options: { + labelWidth: "100px" + } + }, + actionbar: { + buttons: { + export:{ + click(){ + return exportRequest(crudExpose.getSearchFormData()) + } + } + } + }, + form: { + group: { + groups: { + base: { //分组key,可随意命名,不重复便可 + // 注释编号:django-vue3-admin__crud532710:这里把label写在slots里面,以scope.hasError来判断是否有引发错误,比如必填项没有写 + slots: { + label: (scope) => { + return ( + + 基本信息 + + ); + } + }, + + //对应隐藏在tabs里面的字段 + columns: [ "it_use", + "soft_type", + "soft_licence", + "tag_num", + "ip_addr", + "use_account", + "use_password", + "remote_addr", + "use_port", + "purchase_start_data", + "warranty" + ] + }, + base1: { + slots: { + label: (scope) => { + return ( + + 硬件信息 + + ); + } + }, + columns: [ "device_type", + "device_brand", + "device_model", + "service_tag", + "express_service_code", + "mac_addr", + "device_cpu", + "device_memory", + "device_disk", + ] + }, + base2: { + slots: { + label: (scope) => { + return ( + + 资产配置 + + ); + } + }, + columns: [ "is_resource", + "is_device_resource", + "it_device_resource_num", + ] + }, + // 注释编号:django-vue3-admin__crud220816:代码开始行 + // 功能说明:将子表配置进单独的tags标签里面,这里视自己的项目页面情况而定的,非必须配置事项 + base3: { + label: "光纤网络", + columns: [ "subTable", + ] + }, + // 注释编号:django-vue3-admin__crud220816:代码结束行 + base99: { + label: "备注说明", + columns: [ "description", + ] + }, + + + }, + }, + + + }, + + columns: { + _index: { + title: '序号', + form: { show: false }, + column: { + type: 'index', + align: 'center', + width: '70px', + columnSetDisabled: true, //禁止在列设置中选择 + fixed:true, + }, + }, + id: { + title: 'ID', + type: 'number', + column: { show: false }, + search: { show: false }, + form: { show: false }, + }, + company: { + title: '公司', + search: { + // disabled: true, + show: true, + }, + type: 'dict-select', + dict: dict({ + // + url: '/api/company/?limit=999', + value: 'id', + label: 'title', + getData: async ({ url }: { url: string }) => { + return request({ + url: url, + }).then((ret: any) => { + return ret.data; + }); + }, + }), + column: { + minWidth: 100, //最小列宽 + fixed:true, + }, + form: { + // 注释编号:workspace.json__crud291217:在form中不显示出来 + show: false, + }, + }, + area: { + title: '区域', + search: { + // disabled: true, + show: true, + }, + type: 'table-select', + dict: dict({ + // prototype: true, //这里配置每一次都要进行请求,这样可以解决mysql视图中关系显示的外键字段问题,但是配置这个之后,他同步也无法显示出来title + value: 'id', + label: 'title', + getNodesByValues: async (values: any[]) => { + if (!values.includes("")) { //element plus的一个bug,这里必须要对values的值进行判断非"" + return request({ + url: '/api/it_area/' + "getbyIds/", + method: "post", + data: { values } + }).then((ret: any) => { + return ret.data; + }); + } + }, + }), + column: { + minWidth: 100, //最小列宽 + fixed:true, + }, + form: { + // 注释编号:workspace.json__crud291217:在form中不显示出来 + show: false, + component: { + rowKey: "id", //element-plus 必传 + createCrudOptions: it_area, + }, + }, + }, + department: { + title: '部门', + search: { + // disabled: true, + show: true, + }, + type: 'table-select', + dict: dict({ + // prototype: true, //这里配置每一次都要进行请求,这样可以解决mysql视图中关系显示的外键字段问题,但是配置这个之后,他同步也无法显示出来title + // + value: 'id', + label: 'title', + getNodesByValues: async (values: any[]) => { + if (!values.includes("")) { //element plus的一个bug,这里必须要对values的值进行判断非"" + return request({ + url: '/api/department/' + "getbyIds/", + method: "post", + data: { values } + }).then((ret: any) => { + return ret.data; + }); + } + + } + }), + column: { + minWidth: 100, //最小列宽 + fixed:true, + }, + form: { + // 注释编号:workspace.json__crud291217:在form中不显示出来 + show: false, + component: { + rowKey: "id", //element-plus 必传 + createCrudOptions: department, + }, + }, + }, + it_use: { + title: '信息归属', + // 注释编号:django-vue3-admin__crud305417:代码开始行 + // 功能说明:这里专门对type: 'dict-select'改造为name: "el-input" + search: { + component: { + name: "el-input",// 注释编号:django-vue3-admincrud564710:把搜索框从dict-select类型变成el-input类型,注意这里的name对应的是Ui的组件名称 + placeholder: '信息归属、用户名、资产编码查询', + clearable: true, + }, + order:0, //默认是1,所以0是排在最前面的 + show: true, + col:{span:8}, + + }, + // 注释编号:django-vue3-admin__crud305417:代码结束行 + type: 'table-select', + dict: dict({ + + value: 'id', + label: 'use', + getNodesByValues: async (values: any[]) => { + if (!values.includes("")) { //element plus的一个bug,这里必须要对values的值进行判断非"" + return request({ + url: '/api/organization/' + "getbyIds/", + method: "post", + data: { values } + }).then((ret: any) => { + return ret.data; + }); + } + } + }), + column: { + minWidth: 150, //最小列宽 + fixed:true, + }, + form: { + suffixRender({value}) { + //这里把当前的value传进去 + function goto({value}: {value: any}) { + if (!value){ + // 这里判断当选项没有值是,用户又点了跳转按钮,那说明是需要新增对象 + value =0 + } + // 这里是跳转至相应的路由,把value给到id + //这里整个配置主要name:'organizationNewPageEdit'便可 + router.push({name:'organizationNewPageEdit',params:{id:value}}) + } + return ( + // 这里配置一个跳转的按钮及引用函数 + + goto({value})} >跳转 + + ); + }, + rules: [ + // 表单校验规则 + { + required: true, + message: '必填项', + }, + ], + component: { + rowKey: "id", //element-plus 必传 + createCrudOptions: organization, + filterable: true, + placeholder: '请选择', + props: { + props: { + value: 'id', + label: 'use', + }, + }, + }, + }, + }, + + device_type: { + title: '硬件类型', + search: { + // disabled: true, + show: true, + + }, + type: 'table-select', + dict: dict({ + value: 'id', + label: 'title', + getNodesByValues: async (values: any[]) => { + if (!values.includes("")) { //element plus的一个bug,这里必须要对values的值进行判断非"" + return request({ + url: '/api/DeviceTypeViewSet/' + "getbyIds/", + method: "post", + data: { values } + }).then((ret: any) => { + return ret.data; + }); + } + } + }), + column: { + minWidth: 110, //最小列宽 + sortable: 'custom', + order:-1000, + }, + form: { + component: { + rowKey: "id", //element-plus 必传 + createCrudOptions: DeviceTypeViewSet, + filterable: true, + placeholder: '请选择', + props: { + props: { + value: 'id', + label: 'title', + }, + }, + }, + }, + }, + device_brand: { + title: '硬件品牌', + search: { + // disabled: true, + show: true, + }, + type: 'table-select', + dict: dict({ + + + value: 'id', + label: 'title', + getNodesByValues: async (values: any[]) => { + if (!values.includes("")) { //element plus的一个bug,这里必须要对values的值进行判断非"" + return request({ + url: '/api/DeviceBrandViewSet/' + "getbyIds/", + method: "post", + data: { values } + }).then((ret: any) => { + return ret.data; + }); + } + } + }), + column: { + minWidth: 150, //最小列宽 + }, + form: { + component: { + rowKey: "id", //element-plus 必传 + createCrudOptions: DeviceBrandViewSet, + filterable: true, + placeholder: '请选择', + props: { + props: { + value: 'id', + label: 'title', + }, + }, + }, + }, + }, + + device_model: { + title: '硬件型号', + search: { + // disabled: true, + show: true, + }, + type: 'table-select', + dict: dict({ + + + value: 'id', + label: 'title', + getNodesByValues: async (values: any[]) => { + if (!values.includes("")) { //element plus的一个bug,这里必须要对values的值进行判断非"" + return request({ + url: '/api/DeviceModelViewSet/' + "getbyIds/", + method: "post", + data: { values } + }).then((ret: any) => { + return ret.data; + }); + } + } + }), + column: { + minWidth: 150, //最小列宽 + }, + form: { + component: { + rowKey: "id", //element-plus 必传 + createCrudOptions: DeviceModelViewSet, + filterable: true, + placeholder: '请选择', + props: { + props: { + value: 'id', + label: 'title', + }, + }, + }, + }, + }, + service_tag: { + title: '硬件服务编码', + type: 'input', + search: { + show: true, + component: { + placeholder: '请输入硬件服务编码', + clearable: true, + }, + + }, + column: { + minWidth: 120, + sortable: 'custom', + }, + form: { + rules: [{ message: '硬件服务编码必填' }], + component: { + placeholder: '请输入硬件服务编码', + }, + }, + }, + express_service_code: { + title: '硬件快速代码', + type: 'input', + search: { + show: true, + component: { + placeholder: '请输入硬件快速代码', + clearable: true, + }, + }, + column: { + minWidth: 120, + sortable: 'custom', + }, + form: { + rules: [{ message: '硬件快速服务代码必填' }], + component: { + placeholder: '请输入硬件快速服务代码', + }, + }, + }, + mac_addr: { + title: 'mac地址', + type: 'input', + search: { + show: true, + component: { + placeholder: '请输入mac地址', + clearable: true, + }, + }, + column: { + minWidth: 120, + sortable: 'custom', + }, + form: { + rules: [{ message: 'mac地址' }], + component: { + placeholder: '请输入mac地址', + }, + }, + }, + device_cpu: { + title: '硬件cpu', + search: { + // disabled: true, + show: true, + }, + type: 'table-select', + dict: dict({ + + + value: 'id', + label: 'title', + getNodesByValues: async (values: any[]) => { + if (!values.includes("")) { //element plus的一个bug,这里必须要对values的值进行判断非"" + return request({ + url: '/api/CpuViewSet/' + "getbyIds/", + method: "post", + data: { values } + }).then((ret: any) => { + return ret.data; + }); + } + } + }), + column: { + minWidth: 150, //最小列宽 + }, + form: { + component: { + rowKey: "id", //element-plus 必传 + createCrudOptions: CpuViewSet, + filterable: true, + placeholder: '请选择', + props: { + props: { + value: 'id', + label: 'title', + }, + }, + }, + }, + }, + device_memory: { + title: '硬件内存', + search: { + // disabled: true, + show: true, + }, + type: 'table-select', + dict: dict({ + + + value: 'id', + label: 'title', + getNodesByValues: async (values: any[]) => { + if (!values.includes("")) { //element plus的一个bug,这里必须要对values的值进行判断非"" + return request({ + url: '/api/MemoryViewSet/' + "getbyIds/", + method: "post", + data: { values } + }).then((ret: any) => { + return ret.data; + }); + } + } + }), + column: { + minWidth: 150, //最小列宽 + }, + form: { + component: { + rowKey: "id", //element-plus 必传 + createCrudOptions: MemoryViewSet, + filterable: true, + placeholder: '请选择', + props: { + props: { + value: 'id', + label: 'title', + }, + }, + }, + }, + }, + device_disk: { + title: '硬件硬盘', + search: { + // disabled: true, + show: true, + }, + type: 'table-select', + dict: dict({ + + + value: 'id', + label: 'title', + getNodesByValues: async (values: any[]) => { + if (!values.includes("")) { //element plus的一个bug,这里必须要对values的值进行判断非"" + return request({ + url: '/api/DiskViewSet/' + "getbyIds/", + method: "post", + data: { values } + }).then((ret: any) => { + return ret.data; + }); + } + } + }), + column: { + minWidth: 150, //最小列宽 + }, + form: { + component: { + rowKey: "id", //element-plus 必传 + createCrudOptions: DiskViewSet, + filterable: true, + placeholder: '请选择', + props: { + props: { + value: 'id', + label: 'title', + }, + }, + }, + }, + }, + is_resource: { + title: '是否固定资产', + search: { show: true }, + type: 'dict-radio', + dict: dict({ + data: [ + { value: true, label: "是" }, + { value: false, label: "否" } + ] + }), + column: { + width: 130, + sortable: 'custom', + }, + form: { + value: false, //这里配置了默认值为false + }, + }, + is_device_resource: { + title: '是否需要标签', + search: { show: false }, + type: 'dict-radio', + dict: dict({ + data: [ + { value: true, label: "是" }, + { value: false, label: "否" } + ] + }), + column: { + width: 130, + sortable: 'custom', + }, + form: { + value: false, //这里配置了默认值为false + + // 值变动异步触发操作 + async valueChange({ value, form }) { + // 假设您需要根据 value 发起异步请求来更新 form 中的数据 + if(value){ + // Radio点"是"进来这里 + // 配置一个特殊的URL请求地址 + + // 必须先判断资产编码是否为空 + if(!form.it_device_resource_num){ + const url = '/api/LicenceViewSet/it_device_resource_num/'; + const getData = async ({ url }: { url: string }) => { + // 异步等待拿到数据 + return await request({url: url}).then((ret: any) => { + return ret.data; + }); + + }; + // 调用方法拿到数据赋值给data + const data = await getData({url}); + // 把URL请求到的值赋给资产编码 + form.it_device_resource_num = data + + } + + } else { + // Radio点"否"进来这里 + // 资产编码设置为NUll + + // 必须先判断资产编码是否为空 + if(!form.it_device_resource_num){ + form.it_device_resource_num = null + } + } + }, + + }, + }, + it_device_resource_num: { + title: '资产编码', + type: 'number', + // search: { show: true }, + column: { + minWidth: 120, + sortable: 'custom', + order:-960, + }, + form: { + component: { + placeholder: '请输入资产编码', + + }, + }, + }, + soft_type: { + title: '软件类型', + search: { + // disabled: true, + show: true, + }, + type: 'table-select', + dict: dict({ + + value: 'id', + label: 'title', + getNodesByValues: async (values: any[]) => { + if (!values.includes("")) { //element plus的一个bug,这里必须要对values的值进行判断非"" + return request({ + url: '/api/SoftTypeViewSet/' + "getbyIds/", + method: "post", + data: { values } + }).then((ret: any) => { + return ret.data; + }); + } + } + }), + column: { + minWidth: 150, //最小列宽 + order:-990, + }, + form: { + component: { + rowKey: "id", //element-plus 必传 + createCrudOptions: SoftTypeViewSet, + filterable: true, + placeholder: '请选择', + props: { + props: { + value: 'id', + label: 'title', + }, + }, + }, + }, + }, + soft_licence: { + title: '序列号', + search: { + // disabled: true, + // show: true, + }, + type: 'table-select', + column: { + minWidth: 150, //最小列宽 + component:{ + dict: dict({ + + value: 'id', + label: 'licence_num', + getNodesByValues: async (values: any[]) => { + if (!values.includes("")) { //element plus的一个bug,这里必须要对values的值进行判断非"" + return request({ + url: '/api/LicenceViewSet/' + "getbyIds/", + method: "post", + data: { values } + }).then((ret: any) => { + return ret.data; + }); + } + } + }), + } + }, + form: { + /* 注释编号:workspace.json__crud52315217:代码开始行*/ + /* 功能说明:这里添加了一个按钮做跳转至相应的对象,以便随时方便预览、新增、编辑、对象*/ + suffixRender({value}) { + //这里把当前的value传进去 + function goto({value}: {value: any}) { + if (!value){ + // 这里判断当选项没有值是,用户又点了跳转按钮,那说明是需要新增对象 + value =0 + } + // 这里是跳转至相应的路由,把value给到id + //这里整个配置主要name:'LicenceViewSetNewPageEdit'便可 + router.push({name:'LicenceViewSetNewPageEdit',params:{id:value}}) + } + return ( + // 这里配置一个跳转的按钮及引用函数 + + goto({value})} >跳转 + + ); + }, + /* 注释编号:workspace.json__crud315217:代码结束行*/ + component: { + rowKey: "id", //element-plus 必传 + createCrudOptions: LicenceViewSet, + filterable: true, + placeholder: '请选择', + props: { + props: { + value: 'id', + label: 'licence_num', + }, + }, + dict: dict({ + prototype: true, + + url: '/api/LicenceViewSet/status/', + value: 'id', + label: 'licence_num', + getData: async ({ url, form}: { url: string; form: any }) => { + // 这里专门传了当前的form进来,是为了拿到他的值form.soft_licence然后再进行拼接路由,这样后端就可以拿到当前form的某个值进行筛选了。 + // 注意这里要想拿到form.soft_licence字段是根据自己的model表解决了,要根本使用情况而修改 + let pkid = 0 //这时初始设置为0,配置拿不到值的情况 + if (form.soft_licence){ + pkid = form.soft_licence //这是配置拿到值的情况 + } + return request({ + url: url + pkid + "/", //这是做了一个拼接路由URL地址 + }).then((ret: any) => { + return ret.data; + }); + }, + + }), + + }, + }, + }, + tag_num: { + title: '标记码', + type: 'input', + search: { + show: true, + component: { + placeholder: '请输入标记码', + clearable: true, + }, + }, + column: { + minWidth: 120, + sortable: 'custom', + order:-950, + }, + form: { + component: { + placeholder: '请输入标记码', + }, + }, + }, + ip_addr:{ + title: "IP地址", + type: 'ip_input', + column: { + minWidth: 120, + sortable: 'custom', + }, + + }, + + use_account: { + title: '使用帐号', + type: 'input', + // search: { show: true }, + column: { + minWidth: 120, + sortable: 'custom', + order:-980, + }, + form: { + rules: [{ message: '使用帐号' }], + component: { + placeholder: '请输入使用帐号', + }, + }, + }, + use_password: { + title: '密码口令', + type: 'input', + // search: { show: true }, + column: { + minWidth: 120, + sortable: 'custom', + order:-970, + }, + form: { + rules: [{ message: '帐号密码' }], + component: { + placeholder: '请输入帐号密码', + }, + }, + }, + + remote_addr: { + title: '远程地址', + type: 'input', + search: { show: true, + component: { + placeholder: '请输入远程地址', + clearable: true, + }, + }, + column: { + minWidth: 120, + sortable: 'custom', + + }, + form: { + // rules: [{ message: '远程地址' }], + component: { + placeholder: '请输入远程地址', + }, + }, + }, + use_port: { + title: '使用端口', + type: 'number', + controls: false, + search: { show: false }, + column: { + minWidth: 120, + sortable: 'custom', + }, + form: { + rules: [{ type: 'number', message: '使用端口' }], + component: { + placeholder: '请输入使用端口', + }, + }, + }, + purchase_start_data: { + title: '采购日期', + type: 'date', + search: { show: true }, + form: { + rules: [{ message: '采购日期' }], + component: { + placeholder: '请输入采购日期', + } + }, + column: { + align: "center", + width: 120, + } + }, + warranty: { + title: '保修时长', + type: 'input', + // search: { show: true }, + column: { + minWidth: 120, + sortable: 'custom', + }, + form: { + rules: [{ message: '保修时长' }], + component: { + placeholder: '请输入保修时长', + }, + }, + }, + + // 注释编号:django-vue3-admin__crud575316:代码开始行 + // 功能说明:对注释进行跨列配置,解决看起来太小的问题,重点参数colspan + description: { + title: '备注说明', + type: ["textarea","colspan"], + search: {show: false}, + form: { + component: { + rows:8, //配置一共默认占用8行的高度的 + maxlength: 500, + placeholder: '输入备注', + }, + }, + }, + + // 注释编号:django-vue3-admin__crud575316:代码结束行 + + + // 注释编号:django-vue3-admin__crud580516:代码开始行 + // 功能说明:引用入了一张子表,并且配置了相应的保存及保存之后页面的处理 + subTable: { + title: "引用光纤网络", + type: "text", + form: { + title: "", //配置在form内没有title内容 + labelWidth:"0", //配置子表的宽度占满介面 + component: { + name: subTableComponent, + id:compute(({form})=>{ + return form.id + }), + on:{ + //可以传进form进去async saveMain({form}) + async saveMain(){ + //保存主表 + const formRef = crudExpose.getFormRef() + const ret = await formRef.submit() + //将form改为编辑模式 + let formWrapperRef = crudExpose.getFormWrapperRef(); + // 这个地方要改为拿到ret.res.data,示例中拿到的是ret.res + formWrapperRef.setFormData(ret.res.data) + crudRef.value.formWrapperRef.formOptions.mode = "edit" + crudRef.value.formWrapperRef.title="编辑" + } + } + }, + col: { + span: 24 + }, + }, + column: { + formatter: ({ row }) => { + return "查看或编辑状态查看内容"; + } + } + }, + // 注释编号:django-vue3-admin__crud580516:代码结束行 + + + }, + + }, + }; +}; diff --git a/web/src/views/it_mis/ItResource/index.vue b/web/src/views/it_mis/ItResource/index.vue new file mode 100644 index 0000000000000000000000000000000000000000..20014f6aa44250bed0ce52184854c0d72b64201d --- /dev/null +++ b/web/src/views/it_mis/ItResource/index.vue @@ -0,0 +1,52 @@ + + + + + diff --git a/web/src/views/it_mis/ItResource/viewAddEdit.vue b/web/src/views/it_mis/ItResource/viewAddEdit.vue new file mode 100644 index 0000000000000000000000000000000000000000..83cf389b0ac73688e9192fb98d00e1aba0f60c9f --- /dev/null +++ b/web/src/views/it_mis/ItResource/viewAddEdit.vue @@ -0,0 +1,248 @@ + + + \ No newline at end of file diff --git a/web/src/views/it_mis/LicenceViewSet/api.ts b/web/src/views/it_mis/LicenceViewSet/api.ts new file mode 100644 index 0000000000000000000000000000000000000000..967c0e8f097527aecb1a190cf794141d4f6dcbf9 --- /dev/null +++ b/web/src/views/it_mis/LicenceViewSet/api.ts @@ -0,0 +1,50 @@ +import { request,downloadFile } from '/@/utils/service'; +import { PageQuery, AddReq, DelReq, EditReq, InfoReq } from '@fast-crud/fast-crud'; + +export const apiPrefix = '/api/LicenceViewSet/'; + +export function GetList(query: PageQuery) { + return request({ + url: apiPrefix, + method: 'get', + params: query, + }); +} +export function GetObj(id: InfoReq) { + return request({ + url: apiPrefix + id, + method: 'get', + }); +} + +export function AddObj(obj: AddReq) { + return request({ + url: apiPrefix, + method: 'post', + data: obj, + }); +} + +export function UpdateObj(obj: EditReq) { + return request({ + url: apiPrefix + obj.id + '/', + method: 'put', + data: obj, + }); +} + +export function DelObj(id: DelReq) { + return request({ + url: apiPrefix + id + '/', + method: 'delete', + data: { id }, + }); +} + +export function exportData(params:any){ + return downloadFile({ + url: apiPrefix + 'export_data/', + params: params, + method: 'get' + }) +} diff --git a/web/src/views/it_mis/LicenceViewSet/crud.tsx b/web/src/views/it_mis/LicenceViewSet/crud.tsx new file mode 100644 index 0000000000000000000000000000000000000000..1c290788d6665269429362965d88cc93f862f9d1 --- /dev/null +++ b/web/src/views/it_mis/LicenceViewSet/crud.tsx @@ -0,0 +1,426 @@ +import { AddReq, DelReq, EditReq, dict, CrudExpose, compute, UserPageQuery, CreateCrudOptionsRet} from '@fast-crud/fast-crud'; +import _ from 'lodash-es'; +import * as api from './api'; +import { request } from '/@/utils/service'; +import { dictionary } from '/@/utils/dictionary'; +import {inject} from "vue"; +import { useRouter } from "vue-router"; + +// 注释编号:django-vue3-admin__crud245314:代码开始行 +// 功能说明:导入懒加载的复用模块 +import ItResourceViewSet from "/@/views/it_mis/ItResource/crud"; +import SoftTypeViewSet from "/@/views/it_mis/SoftType/crud"; +import SuppliersViewSet from "/@/views/it_mis/SuppliersTables/SuppliersViewSet/crud"; +import it_area from "/@/views/PublicResource/area/crud"; +// 注释编号:django-vue3-admin__crud245314:代码结束行 + + +//此处为crudOptions配置 + export default function ({ crudExpose}: { crudExpose: CrudExpose}): CreateCrudOptionsRet { + const pageRequest = async (query: any) => { + return await api.GetList(query); + }; + const editRequest = async ({ form, row }: EditReq) => { + if (row.id) { //这里一定要判断row.id是否存在,存在才能form.id = row.id,要不会出现问题的 + form.id = row.id; + } + return await api.UpdateObj(form); + }; + const delRequest = async ({ row }: DelReq) => { + return await api.DelObj(row.id); + }; + const addRequest = async ({ form }: AddReq) => { + return await api.AddObj(form); + }; + + const exportRequest = async (query: UserPageQuery) => { + return await api.exportData(query) + }; + + + + + + const router = useRouter(); + + return { + crudOptions: { + request: { + pageRequest, + addRequest, + editRequest, + delRequest, + }, + search: { + container: { + layout: "multi-line" + }, + col: { + span: 4 + }, + options: { + labelWidth: "100px" + } + }, + actionbar: { + buttons: { + export:{ + click(){ + return exportRequest(crudExpose.getSearchFormData()) + } + } + } + }, + // form: { + // col: { span: 24 }, + // labelWidth: '100px', + // wrapper: { + // is: 'el-dialog', + // width: '600px', + // }, + + // }, + columns: { + + + resource_area: { + title: '区域', + search: { + // disabled: true, + show: true, + }, + type: 'table-select', + dict: dict({ + isTree: true, + value: 'id', + label: 'title', + getNodesByValues: async (values: any[]) => { + if (!values.includes("")) { + return request({ + url: '/api/it_area/' + "getbyIds/", + method: "post", + data: { values } + }).then((ret: any) => { + return ret.data; + }); + } + }, + }), + column: { + minWidth: 150, //最小列宽 + }, + form: { + helper: { + render() { + return
区域是必需要填写的
; + } + }, + rules: [ + // 表单校验规则 + { + required: true, + message: '必填项', + }, + ], + component: { + rowKey: "id", //element-plus 必传 + createCrudOptions: it_area, + filterable: true, + placeholder: '请选择', + props: { + props: { + value: 'id', + label: 'title', + }, + }, + }, + }, + }, + title: { + title: '许可证名称', + type: 'input', + search: { show: true }, + column: { + minWidth: 120, + sortable: 'custom', + }, + form: { + rules: [{ message: '许可证名称' }], + component: { + placeholder: '请输入许可证名称', + }, + }, + }, + licence_type: { + title: '类型', + search: { + // disabled: true, + show: true, + }, + type: 'table-select', + dict: dict({ + isTree: true, + value: 'id', + label: 'title', + getNodesByValues: async (values: any[]) => { + if (!values.includes("")) { + return request({ + url: '/api/SoftTypeViewSet/' + "getbyIds/", + method: "post", + data: { values } + }).then((ret: any) => { + return ret.data; + }); + } + }, + }), + column: { + minWidth: 150, //最小列宽 + }, + form: { + rules: [ + // 表单校验规则 + { + required: true, + message: '必填项', + }, + ], + component: { + rowKey: "id", //element-plus 必传 + createCrudOptions: SoftTypeViewSet, + filterable: true, + placeholder: '请选择', + props: { + props: { + value: 'id', + label: 'title', + }, + }, + }, + }, + }, + licence_num: { + title: '序列号', + type: 'input', + search: { show: true }, + column: { + minWidth: 120, + sortable: 'custom', + }, + form: { + rules: [{ message: '序列号' }], + component: { + placeholder: '请输入序列号', + }, + }, + }, + supplier: { + title: '供应商', + search: { + // disabled: true, + show: true, + }, + type: 'table-select', + dict: dict({ + isTree: true, + value: 'id', + label: 'title', + getNodesByValues: async (values: any[]) => { + if (!values.includes("")) { + return request({ + url: '/api/SuppliersViewSet/' + "getbyIds/", + method: "post", + data: { values } + }).then((ret: any) => { + return ret.data; + }); + } + }, + }), + column: { + minWidth: 150, //最小列宽 + }, + form: { + rules: [ + // 表单校验规则 + { + required: true, + message: '必填项', + }, + ], + component: { + rowKey: "id", //element-plus 必传 + createCrudOptions: SuppliersViewSet, + filterable: true, + placeholder: '请选择', + props: { + props: { + value: 'id', + label: 'title', + }, + }, + }, + }, + }, + version: { + title: '版本号', + type: 'input', + search: { show: true }, + column: { + minWidth: 120, + sortable: 'custom', + }, + form: { + rules: [{ message: '版本号' }], + component: { + placeholder: '请输入版本号', + }, + }, + }, + start_date: { + title: '购买日期', + type: 'date', + search: { show: true }, + form: { + rules: [{ required: false, message: '购买日期' }], + component: { + placeholder: '请输入购买日期', + } + }, + column: { + align: "center", + width: 120, + } + }, + end_date: { + title: '到期日期', + type: 'date', + search: { show: true }, + form: { + rules: [{ required: false, message: '到期日期' }], + component: { + placeholder: '请输入到期日期', + } + }, + column: { + align: "center", + width: 120, + } + }, + price: { + title: '费用', + type: 'input', + search: { show: true }, + column: { + minWidth: 120, + sortable: 'custom', + }, + form: { + rules: [{ message: '费用' }], + component: { + placeholder: '请输入费用', + }, + }, + }, + use_status: { + title: '使用状态', + type: 'dict-select', + dict: dict({ + value: 'dictNum', // 注释编号:django-vue3-admin-crud473714:这里把提交给到后面的字段配置成dictNum,而不要使用默认的id + label: 'dictName', + getData: async ({ url }: { url: string }) => { + const curId = await request({ + // 注释编号:django-vue3-admin-crud183714:dictName=LicenceViewSet_use_status_choices是由全局字典里面录入使用的 + url: '/api/globalDictModelViewSet/?dictName=LicenceViewSet_use_status_choices', + }).then((ret: any) => { + return ret.data[0].id; + }); + // 注释编号:django-vue3-admin-crud513814:根据dictName=LicenceViewSet_use_status_choices对应的id来查他们里面的字典 + return request({ + url: `/api/globalDictModelViewSet/?limit=999&dictMark=${curId}`, + }).then((ret: any) => { + return ret.data; + }); + }, + }), + readonly:true, // 注释编号:django-vue3-admin-crud373614:如果有需要可开启只读模式 + form: { + value:2, + clearable: false, + helper:'这个字段默认未用状态,如果被IT资源所引用就会自动修改为在用状态', + component: { + span: 12, + }, + }, + component: { props: { color: 'auto' } }, // 自动染色 + }, + used_by: { + title: '使用者', + search: { + // disabled: true, + show: true, + }, + type: 'table-select', + readonly:true, + dict: dict({ + isTree: true, + value: 'id', + label: 'it_use_id', //这个it_use字段是后端懒加载把他转为对应的值转过来的。 + getNodesByValues: async (values: any[]) => { + if (!values.includes("")) { + const fieldList = ["id", "it_use_id"] + return request({ + url: '/api/ItResourceViewSet/' + "getbyIds/", + method: "post", + data: { values, fieldList }, + }).then((ret: any) => { + return ret.data; + }); + } + }, + }), + column: { + minWidth: 150, //最小列宽 + }, + form: { + suffixRender({value}) { + //这里把当前的value传进去 + function goto({value}: {value: any}) { + if (!value){ + // 这里判断当选项没有值是,用户又点了跳转按钮,那说明是需要新增对象 + value =0 + } + // 这里是跳转至相应的路由,把value给到id + //这里整个配置主要name:'ItResourceSetNewPageEdit'便可 + router.push({name:'ItResourceSetNewPageEdit',params:{id:value}}) + } + return ( + // 这里配置一个跳转的按钮及引用函数 + + goto({value})} >跳转 + + ); + }, + component: { + rowKey: "id", //element-plus 必传 + createCrudOptions: ItResourceViewSet, + filterable: true, + placeholder: '请选择', + props: { + props: { + value: 'id', + label: 'it_use_id', //这个it_use_name字段是后端单独序列化出来使用的,原来表没有的 + }, + }, + }, + }, + }, + + + + + }, + + }, + }; +}; diff --git a/web/src/views/it_mis/LicenceViewSet/index.vue b/web/src/views/it_mis/LicenceViewSet/index.vue new file mode 100644 index 0000000000000000000000000000000000000000..de3ffbe827a290538e34ed8bb7a1352a2f3cf914 --- /dev/null +++ b/web/src/views/it_mis/LicenceViewSet/index.vue @@ -0,0 +1,54 @@ + + + + + diff --git a/web/src/views/it_mis/LicenceViewSet/viewAddEdit.vue b/web/src/views/it_mis/LicenceViewSet/viewAddEdit.vue new file mode 100644 index 0000000000000000000000000000000000000000..f8f3d0edce9ce4634d82d8e291e88af6af886ad4 --- /dev/null +++ b/web/src/views/it_mis/LicenceViewSet/viewAddEdit.vue @@ -0,0 +1,248 @@ + + + \ No newline at end of file diff --git a/web/src/views/it_mis/LineTagTables/LineAreaModelViewSet/api.ts b/web/src/views/it_mis/LineTagTables/LineAreaModelViewSet/api.ts new file mode 100644 index 0000000000000000000000000000000000000000..47cc42f9a46d45f9e24fbb343f0e299d46cc8787 --- /dev/null +++ b/web/src/views/it_mis/LineTagTables/LineAreaModelViewSet/api.ts @@ -0,0 +1,50 @@ +import { request,downloadFile } from '/@/utils/service'; +import { PageQuery, AddReq, DelReq, EditReq, InfoReq } from '@fast-crud/fast-crud'; + +export const apiPrefix = '/api/LineAreaModelViewSet/'; + +export function GetList(query: PageQuery) { + return request({ + url: apiPrefix, + method: 'get', + params: query, + }); +} +export function GetObj(id: InfoReq) { + return request({ + url: apiPrefix + id, + method: 'get', + }); +} + +export function AddObj(obj: AddReq) { + return request({ + url: apiPrefix, + method: 'post', + data: obj, + }); +} + +export function UpdateObj(obj: EditReq) { + return request({ + url: apiPrefix + obj.id + '/', + method: 'put', + data: obj, + }); +} + +export function DelObj(id: DelReq) { + return request({ + url: apiPrefix + id + '/', + method: 'delete', + data: { id }, + }); +} + +export function exportData(params:any){ + return downloadFile({ + url: apiPrefix + 'export_data/', + params: params, + method: 'get' + }) +} diff --git a/web/src/views/it_mis/LineTagTables/LineAreaModelViewSet/crud.tsx b/web/src/views/it_mis/LineTagTables/LineAreaModelViewSet/crud.tsx new file mode 100644 index 0000000000000000000000000000000000000000..8b8f083591455a92e35207041c8f85dede0a27da --- /dev/null +++ b/web/src/views/it_mis/LineTagTables/LineAreaModelViewSet/crud.tsx @@ -0,0 +1,72 @@ +import { CrudOptions, AddReq, DelReq, EditReq, dict, CrudExpose, compute, UserPageQuery, CreateCrudOptionsRet} from '@fast-crud/fast-crud'; +import _ from 'lodash-es'; +import * as api from './api'; +import { request } from '/@/utils/service'; +import { dictionary } from '/@/utils/dictionary'; + + + +//此处为crudOptions配置 +export default function ({ crudExpose}: { crudExpose: CrudExpose}): CreateCrudOptionsRet { + const pageRequest = async (query: any) => { + return await api.GetList(query); + }; + const editRequest = async ({ form, row }: EditReq) => { + if (row.id) { + form.id = row.id; + } + return await api.UpdateObj(form); + }; + const delRequest = async ({ row }: DelReq) => { + return await api.DelObj(row.id); + }; + const addRequest = async ({ form }: AddReq) => { + return await api.AddObj(form); + }; + + const exportRequest = async (query: UserPageQuery) => { + return await api.exportData(query) + }; + + + + return { + crudOptions: { + request: { + pageRequest, + addRequest, + editRequest, + delRequest, + }, + actionbar: { + buttons: { + export:{ + click(){ + return exportRequest(crudExpose.getSearchFormData()) + } + } + } + }, + columns: { + + title: { + title: '线路区域', + type: 'input', + search: { show: true}, + column: { + // minWidth: 120, + sortable: 'custom', + }, + form: { + rules: [{ required: true, message: '线路区域必填' }], + component: { + placeholder: '请输入线路区域', + }, + }, + }, + + }, + + }, + }; +}; diff --git a/web/src/views/it_mis/LineTagTables/LineAreaModelViewSet/index.vue b/web/src/views/it_mis/LineTagTables/LineAreaModelViewSet/index.vue new file mode 100644 index 0000000000000000000000000000000000000000..435d307e1959adf22c3d606bc570e163987df558 --- /dev/null +++ b/web/src/views/it_mis/LineTagTables/LineAreaModelViewSet/index.vue @@ -0,0 +1,56 @@ + + + + + diff --git a/web/src/views/it_mis/LineTagTables/LineTagModelViewSet/api.ts b/web/src/views/it_mis/LineTagTables/LineTagModelViewSet/api.ts new file mode 100644 index 0000000000000000000000000000000000000000..977b877d5a090e6c2906fe8f7ed991aef11f70b8 --- /dev/null +++ b/web/src/views/it_mis/LineTagTables/LineTagModelViewSet/api.ts @@ -0,0 +1,50 @@ +import { request,downloadFile } from '/@/utils/service'; +import { PageQuery, AddReq, DelReq, EditReq, InfoReq } from '@fast-crud/fast-crud'; + +export const apiPrefix = '/api/LineTagModelViewSet/'; + +export function GetList(query: PageQuery) { + return request({ + url: apiPrefix, + method: 'get', + params: query, + }); +} +export function GetObj(id: InfoReq) { + return request({ + url: apiPrefix + id, + method: 'get', + }); +} + +export function AddObj(obj: AddReq) { + return request({ + url: apiPrefix, + method: 'post', + data: obj, + }); +} + +export function UpdateObj(obj: EditReq) { + return request({ + url: apiPrefix + obj.id + '/', + method: 'put', + data: obj, + }); +} + +export function DelObj(id: DelReq) { + return request({ + url: apiPrefix + id + '/', + method: 'delete', + data: { id }, + }); +} + +export function exportData(params:any){ + return downloadFile({ + url: apiPrefix + 'export_data/', + params: params, + method: 'get' + }) +} diff --git a/web/src/views/it_mis/LineTagTables/LineTagModelViewSet/crud.tsx b/web/src/views/it_mis/LineTagTables/LineTagModelViewSet/crud.tsx new file mode 100644 index 0000000000000000000000000000000000000000..0e0fad2b3314e41f9806c3732b7a121ae74ef1cb --- /dev/null +++ b/web/src/views/it_mis/LineTagTables/LineTagModelViewSet/crud.tsx @@ -0,0 +1,200 @@ +import { CrudOptions, AddReq, DelReq, EditReq, dict, CrudExpose, compute, UserPageQuery, CreateCrudOptionsRet, CreateCrudOptionsProps, ScopeContext} from '@fast-crud/fast-crud'; +import _ from 'lodash-es'; +import * as api from './api'; +import { request } from '/@/utils/service'; +// import { dictionary } from '/@/utils/dictionary'; +// import {inject} from "vue"; + + +// 注释编号:django-vue3-admin__crud400716:这里引入光纤网络的子表进来 +import subTableComponent from "../SubLineTagModelViewSet/SubLineTagModelViewSetSub/index.vue"; + + +//此处为crudOptions配置 +export default function (object: CreateCrudOptionsProps): CreateCrudOptionsRet { + + const {crudRef } = object.crudExpose; + const { crudExpose } = object; + + const pageRequest = async (query: any) => { + return await api.GetList(query); + }; + const editRequest = async ({ form, row }: EditReq) => { + if (row.id) { + form.id = row.id; + } + return await api.UpdateObj(form); + }; + const delRequest = async ({ row }: DelReq) => { + return await api.DelObj(row.id); + }; + const addRequest = async ({ form }: AddReq) => { + return await api.AddObj(form); + }; + + const exportRequest = async (query: UserPageQuery) => { + return await api.exportData(query) + }; + + + + return { + crudOptions: { + request: { + pageRequest, + addRequest, + editRequest, + delRequest, + }, + actionbar: { + buttons: { + export:{ + click(){ + return exportRequest(crudExpose.getSearchFormData()) + } + } + } + }, + form: { + col: { span: 6 }, + // labelWidth: '100px', + wrapper: { + is: 'el-dialog', + width: '1200px', + }, + + }, + columns: { + id: { + title: 'ID', + type: 'number', + column: { show: false }, + search: { show: false }, + form: { show: false }, + }, + line_num: { + title: '线编号', + type: 'number', + search: { show: true}, + column: { + // minWidth: 120, + sortable: 'custom', + }, + form: { + rules: [{ required: true, message: '线编号必填' }], + component: { + placeholder: '请输入线编号', + }, + }, + }, + seat_num: { + title: '卡位编号', + type: 'number', + search: { show: true}, + column: { + // minWidth: 120, + sortable: 'custom', + }, + form: { + rules: [{ required: true, message: '卡位编号必填' }], + component: { + placeholder: '请输入卡位编号', + }, + }, + }, + linetagtype: { + title: '线路类型', + search: { + show: true, + }, + type: 'dict-select', + dict: dict({ + url: '/api/LineTagtypeModelViewSet/?limit=999', + value: 'id', + label: 'title', + getData: async ({ url }: { url: string }) => { + return request({ + url: url, + }).then((ret: any) => { + return ret.data; + }); + }, + }), + column: { + minWidth: 120, //最小列宽 + // fixed:true, + }, + form:{ + // rules: [ + // // 表单校验规则 + // { + // required: true, + // message: '必填项', + // }, + // ], + component:{ + filterable: true, + }, + }, + + }, + + description: { + title: '备注说明', + type: ["textarea","colspan"], + search: {show: false}, + form: { + component: { + rows:1, //配置一共默认占用1行的高度的 + // maxlength: 500, + placeholder: '输入备注', + }, + }, + }, + + // 注释编号:django-vue3-admin-crud514816:代码开始行 + // 功能说明:由这个subTable字段来引用相应子表进来 + subTable: { + title: "线路接线情况", + type: "text", + form: { + title: "", //配置在form内没有title内容 + labelWidth:"0", //配置子表的宽度占满介面 + component: { + name: subTableComponent, + id:compute(({form})=>{ + return form.id + }), + on:{ + //可以传进form进去async saveMain({form}) + async saveMain(){ + //保存主表 + const formRef = crudExpose.getFormRef() + const ret = await formRef.submit() + //将form改为编辑模式 + let formWrapperRef = crudExpose.getFormWrapperRef(); + // 这个地方要改为拿到ret.res.data,示例中拿到的是ret.res,如果没有拿到值,会出现无法把值传过去窗口,或者传他认为那是一个新的对象 + //如果这里三行代码出现问题,都有可能会导致保存之后,再保存会出现新的对象 + formWrapperRef.setFormData(ret.res.data) + crudRef.value.formWrapperRef.formOptions.mode = "edit" + crudRef.value.formWrapperRef.title="编辑" + } + } + }, + col: { + span: 24 + }, + }, + column: { + formatter: ({ row }) => { + return "查看或编辑状态查看内容"; + } + } + }, + // 注释编号:django-vue3-admin-crud514816:代码结束行 + + }, + + }, + }; +} diff --git a/web/src/views/it_mis/LineTagTables/LineTagModelViewSet/index.vue b/web/src/views/it_mis/LineTagTables/LineTagModelViewSet/index.vue new file mode 100644 index 0000000000000000000000000000000000000000..ec13e62299c375431101e3182b6a581e78567710 --- /dev/null +++ b/web/src/views/it_mis/LineTagTables/LineTagModelViewSet/index.vue @@ -0,0 +1,55 @@ + + + + + diff --git a/web/src/views/it_mis/LineTagTables/LineTagtypeModelViewSet/api.ts b/web/src/views/it_mis/LineTagTables/LineTagtypeModelViewSet/api.ts new file mode 100644 index 0000000000000000000000000000000000000000..38541af11a8ee07e118bf91534dc85262f8492d3 --- /dev/null +++ b/web/src/views/it_mis/LineTagTables/LineTagtypeModelViewSet/api.ts @@ -0,0 +1,50 @@ +import { request,downloadFile } from '/@/utils/service'; +import { PageQuery, AddReq, DelReq, EditReq, InfoReq } from '@fast-crud/fast-crud'; + +export const apiPrefix = '/api/LineTagtypeModelViewSet/'; + +export function GetList(query: PageQuery) { + return request({ + url: apiPrefix, + method: 'get', + params: query, + }); +} +export function GetObj(id: InfoReq) { + return request({ + url: apiPrefix + id, + method: 'get', + }); +} + +export function AddObj(obj: AddReq) { + return request({ + url: apiPrefix, + method: 'post', + data: obj, + }); +} + +export function UpdateObj(obj: EditReq) { + return request({ + url: apiPrefix + obj.id + '/', + method: 'put', + data: obj, + }); +} + +export function DelObj(id: DelReq) { + return request({ + url: apiPrefix + id + '/', + method: 'delete', + data: { id }, + }); +} + +export function exportData(params:any){ + return downloadFile({ + url: apiPrefix + 'export_data/', + params: params, + method: 'get' + }) +} diff --git a/web/src/views/it_mis/LineTagTables/LineTagtypeModelViewSet/crud.tsx b/web/src/views/it_mis/LineTagTables/LineTagtypeModelViewSet/crud.tsx new file mode 100644 index 0000000000000000000000000000000000000000..79d07741643991e766a76ed7feb6ef3bcc602116 --- /dev/null +++ b/web/src/views/it_mis/LineTagTables/LineTagtypeModelViewSet/crud.tsx @@ -0,0 +1,72 @@ +import { CrudOptions, AddReq, DelReq, EditReq, dict, CrudExpose, compute, UserPageQuery, CreateCrudOptionsRet} from '@fast-crud/fast-crud'; +import _ from 'lodash-es'; +import * as api from './api'; +import { request } from '/@/utils/service'; +import { dictionary } from '/@/utils/dictionary'; +import {inject} from "vue"; + + +//此处为crudOptions配置 +export default function ({ crudExpose}: { crudExpose: CrudExpose}): CreateCrudOptionsRet { + const pageRequest = async (query: any) => { + return await api.GetList(query); + }; + const editRequest = async ({ form, row }: EditReq) => { + if (row.id) { + form.id = row.id; + } + return await api.UpdateObj(form); + }; + const delRequest = async ({ row }: DelReq) => { + return await api.DelObj(row.id); + }; + const addRequest = async ({ form }: AddReq) => { + return await api.AddObj(form); + }; + + const exportRequest = async (query: UserPageQuery) => { + return await api.exportData(query) + }; + + + + return { + crudOptions: { + request: { + pageRequest, + addRequest, + editRequest, + delRequest, + }, + actionbar: { + buttons: { + export:{ + click(){ + return exportRequest(crudExpose.getSearchFormData()) + } + } + } + }, + columns: { + + title: { + title: '线路类型', + type: 'input', + search: { show: true}, + column: { + // minWidth: 120, + sortable: 'custom', + }, + form: { + rules: [{ required: true, message: '线路类型必填' }], + component: { + placeholder: '请输入线路类型', + }, + }, + }, + + }, + + }, + }; +} diff --git a/web/src/views/it_mis/LineTagTables/LineTagtypeModelViewSet/index.vue b/web/src/views/it_mis/LineTagTables/LineTagtypeModelViewSet/index.vue new file mode 100644 index 0000000000000000000000000000000000000000..736d9fdccf730cc19d363a8f91338cacf94bb570 --- /dev/null +++ b/web/src/views/it_mis/LineTagTables/LineTagtypeModelViewSet/index.vue @@ -0,0 +1,55 @@ + + + + + diff --git a/web/src/views/it_mis/LineTagTables/NetworkFrameModelViewSet/api.ts b/web/src/views/it_mis/LineTagTables/NetworkFrameModelViewSet/api.ts new file mode 100644 index 0000000000000000000000000000000000000000..8008b6fa510636d5c7556774c7406dbe1c8f3542 --- /dev/null +++ b/web/src/views/it_mis/LineTagTables/NetworkFrameModelViewSet/api.ts @@ -0,0 +1,50 @@ +import { request,downloadFile } from '/@/utils/service'; +import { PageQuery, AddReq, DelReq, EditReq, InfoReq } from '@fast-crud/fast-crud'; + +export const apiPrefix = '/api/NetworkFrameModelViewSet/'; + +export function GetList(query: PageQuery) { + return request({ + url: apiPrefix, + method: 'get', + params: query, + }); +} +export function GetObj(id: InfoReq) { + return request({ + url: apiPrefix + id, + method: 'get', + }); +} + +export function AddObj(obj: AddReq) { + return request({ + url: apiPrefix, + method: 'post', + data: obj, + }); +} + +export function UpdateObj(obj: EditReq) { + return request({ + url: apiPrefix + obj.id + '/', + method: 'put', + data: obj, + }); +} + +export function DelObj(id: DelReq) { + return request({ + url: apiPrefix + id + '/', + method: 'delete', + data: { id }, + }); +} + +export function exportData(params:any){ + return downloadFile({ + url: apiPrefix + 'export_data/', + params: params, + method: 'get' + }) +} diff --git a/web/src/views/it_mis/LineTagTables/NetworkFrameModelViewSet/crud.tsx b/web/src/views/it_mis/LineTagTables/NetworkFrameModelViewSet/crud.tsx new file mode 100644 index 0000000000000000000000000000000000000000..d106542f0e54c943574229c1d2ee1db6dfebc7b8 --- /dev/null +++ b/web/src/views/it_mis/LineTagTables/NetworkFrameModelViewSet/crud.tsx @@ -0,0 +1,72 @@ +import { CrudOptions, AddReq, DelReq, EditReq, dict, CrudExpose, compute, UserPageQuery, CreateCrudOptionsRet} from '@fast-crud/fast-crud'; +import _ from 'lodash-es'; +import * as api from './api'; +import { request } from '/@/utils/service'; +import { dictionary } from '/@/utils/dictionary'; +import {inject} from "vue"; + + +//此处为crudOptions配置 +export default function ({ crudExpose}: { crudExpose: CrudExpose}): CreateCrudOptionsRet { + const pageRequest = async (query: any) => { + return await api.GetList(query); + }; + const editRequest = async ({ form, row }: EditReq) => { + if (row.id) { + form.id = row.id; + } + return await api.UpdateObj(form); + }; + const delRequest = async ({ row }: DelReq) => { + return await api.DelObj(row.id); + }; + const addRequest = async ({ form }: AddReq) => { + return await api.AddObj(form); + }; + + const exportRequest = async (query: UserPageQuery) => { + return await api.exportData(query) + }; + + + + return { + crudOptions: { + request: { + pageRequest, + addRequest, + editRequest, + delRequest, + }, + actionbar: { + buttons: { + export:{ + click(){ + return exportRequest(crudExpose.getSearchFormData()) + } + } + } + }, + columns: { + + title: { + title: '网络配线架', + type: 'input', + search: { show: true}, + column: { + // minWidth: 120, + sortable: 'custom', + }, + form: { + rules: [{ required: true, message: '网络配线架必填' }], + component: { + placeholder: '请输入网络配线架', + }, + }, + }, + + }, + + }, + }; +}; diff --git a/web/src/views/it_mis/LineTagTables/NetworkFrameModelViewSet/index.vue b/web/src/views/it_mis/LineTagTables/NetworkFrameModelViewSet/index.vue new file mode 100644 index 0000000000000000000000000000000000000000..15fb3392675751066d240db4431f2c4671a0d75b --- /dev/null +++ b/web/src/views/it_mis/LineTagTables/NetworkFrameModelViewSet/index.vue @@ -0,0 +1,55 @@ + + + + + diff --git a/web/src/views/it_mis/LineTagTables/SubLineTagModelViewSet/SubLineTagModelViewSetSub/api.ts b/web/src/views/it_mis/LineTagTables/SubLineTagModelViewSet/SubLineTagModelViewSetSub/api.ts new file mode 100644 index 0000000000000000000000000000000000000000..8fb054c3877546321fad1c639f3695168a5c9469 --- /dev/null +++ b/web/src/views/it_mis/LineTagTables/SubLineTagModelViewSet/SubLineTagModelViewSetSub/api.ts @@ -0,0 +1,67 @@ +import { id } from 'element-plus/es/locale'; +import { request,downloadFile } from '/@/utils/service'; +import { PageQuery, AddReq, DelReq, EditReq, InfoReq } from '@fast-crud/fast-crud'; + +export const apiPrefix = '/api/SubLineTagModelViewSet/'; + + +export function GetList(query: PageQuery) { + return request({ + url: apiPrefix, + method: 'get', + params: query, // 注释编号:django-vue3-admin__api351018:新版本已经把父ID直接放在query里面了不需要再单独传了 + }) +} + + + + +export function GetObj(id: InfoReq) { + return request({ + url: apiPrefix + id, + method: 'get', + }); +} + +export function AddObj(obj: AddReq) { + return request({ + url: apiPrefix, + method: 'post', + data: obj, + }); +} + +export function UpdateObj(obj: EditReq) { + return request({ + url: apiPrefix + obj.id + '/', + method: 'put', + data: obj, + }); +} + +// 注释编号:django-vue3-admin__api455216:重新写一条数据要匹配上移及下移时提交数据 +export function RowUpdateObj(obj: EditReq) { + return request({ + url: apiPrefix + obj.id + '/', + method: 'put', + data: obj, + }); +} + + + +export function DelObj(id: DelReq) { + return request({ + url: apiPrefix + id + '/', + method: 'delete', + data: { id }, + }); +} + +export function exportData(params:any){ + return downloadFile({ + url: apiPrefix + 'export_data/', + params: params, + method: 'get' + }) +} diff --git a/web/src/views/it_mis/LineTagTables/SubLineTagModelViewSet/SubLineTagModelViewSetSub/crud.tsx b/web/src/views/it_mis/LineTagTables/SubLineTagModelViewSet/SubLineTagModelViewSetSub/crud.tsx new file mode 100644 index 0000000000000000000000000000000000000000..9db1f532fc196f232dc3c31f161b82096b293dd9 --- /dev/null +++ b/web/src/views/it_mis/LineTagTables/SubLineTagModelViewSet/SubLineTagModelViewSetSub/crud.tsx @@ -0,0 +1,686 @@ +import { + AddReq, + CreateCrudOptionsProps, + CreateCrudOptionsRet, + DelReq, + dict, + EditReq, + ScopeContext, + EditableRow, + } from "@fast-crud/fast-crud"; + import * as api from "./api"; + import { request } from '/@/utils/service'; + import { ref } from "vue"; + import _ from "lodash-es"; + + + + + export default function ({ crudExpose, context }: CreateCrudOptionsProps): CreateCrudOptionsRet { + const { crudBinding } = crudExpose; + const { parentIdRef } = context; + + // 注释编号:django-vue3-admin-crud290016:拿到showStatus的值,并对于!showStatus.value.disabled的值这里如果点查看进来的就会拿到false,如果编辑进来的就会true + const { showStatus } = context; + + + const pageRequest = async (query: any) => { + // 注释编号:django-vue3-admin__crud312516:这里不再需求把parentIdRef.value做ID传进去,因为新版本已经直接把父ID封装到query里面了 + return await api.GetList(query); + }; + const editRequest = async ({ form, row }: EditReq) => { + if (form.id == null) { + form.id = row.id; + } + return await api.UpdateObj(form); + }; + + // 注释编号:django-vue3-admin__crud585116:重新写一条数据要匹配上移及下移时提交数据 + const rowEditRequest = async ({ row }: EditReq) => { + + return await api.RowUpdateObj(row); + }; + + + const delRequest = async ({ row }: DelReq) => { + return await api.DelObj(row.id); + }; + + const addRequest = async ({ form }: AddReq) => { + + // 注释编号:django-vue3-admin__crud512516:这里要进行修改,需要返回ID对行,不然第二次点击新增时,会引发两条数据同时进行编辑 + const result = await api.AddObj(form); + return { id: result.data.id }; + }; + + + // 注释编号:django-vue3-admin-crud264910:这是是配置一个变量去拿到编辑时,传过来的当前行数据 + let curRowData = ref() + + + // 注释编号:django-vue3-admin-crud390616:配合table单选存储的当前行数据 + const curChangeRow = ref() + + const editStatus = ref(false) // 这里存一个点击编辑按钮的状态,默认为false + + // 注释编号:django-vue3-admin-crud210616:这是单选选中触发的方法 + const onCurrentChange = (row:any) =>{ + curChangeRow.value = row + + } + + + const device_ownership_dit_ref = dict({ + isTree:true, + cache: true, + prototype: true, // 注释编号:django-vue3-admin__crud382417:这里配置每一次记录都单独请求一次,这是必须的,要不后面就无法做懒加载 + value: 'id', + getData: async ({ row ,value, dict, componentRef}: any) => {// 注释编号:django-vue3-admin-crud150812:传componentRef进来,这样我们可以在当前函数内拿到componentRef传过来的值 + + + // 注释编号:django-vue3-admin-crud085511:let values是为了做懒加载准备的 + let values= []; + values.push(value) + + + if (componentRef && componentRef.url){ + + const new_url = `${componentRef.url}/?limit=999` //进行动态拼接路由URL请求地址 + + dict.label = componentRef.label // 注释编号:django-vue3-admin__crud181318:不同地请求有不同的label对应字段,label做成动态赋予 + + return request({ + url: new_url, + }).then((ret: any) => { + return ret.data; + }); + } else{ + // 注释编号:django-vue3-admin__crud462417:这里就是配置第一次点开,需要去处理的请求,这里看一下是否可以做成懒加载,这样请求才不会请求大量的数据 + + if(value){ //这里要判断当前的值是否为真,才进行请求,不为真的情况下,比如点击新增时,就不应该进行请求 + + if(row&&!editStatus.value){ //这里添加了添加编辑状态,如果点击编辑进来的,那这里就匹配不成功,走else配置 + + const new_url = `${row.device_ownership_url}/getbyIds/` // 注释编号:django-vue3-admin-crud325511:这里做成了懒加载,加载速度才会明显的快起来。 + dict.label = row.device_ownership_label + + //进来正确开始处理数据时,要把判断值重置,防止变量继续存储到数据,影响到其它功能 + editStatus.value = false + + return request({ + url: new_url, + method: "post", + data: {values}, + }).then((ret: any) => { + return ret.data; + }); + } else if(curRowData.value && curRowData.value.device_ownership_url && editStatus.value){ //这里要做个判断,必须要curRowData.value.device_ownership_url有值才能进行请求处理 + // 注释编号:django-vue3-admin-crud214617:点编辑的时候,才会进到这里进行请求 + //curRowData是由编辑按钮拿到的值传进来的 + + const new_url = `${curRowData.value.device_ownership_url}/?limit=999` + dict.label = curRowData.value.device_ownership_label + + //进来正确开始处理数据时,要把判断值重置,防止变量继续存储到数据,影响到其它功能 + curRowData.value = ref() + editStatus.value = false + + return request({ + url: new_url, + }).then((ret: any) => { + return ret.data; + }); + + } else if(curChangeRow.value && curChangeRow.value.device_ownership_url && editStatus.value){//这里要做个判断,必须要curChangeRow.value.device_ownership_url有值才能进行请求处理 + //点击复制数据之后,进来这里进行拼接新的URl及label,而curChangeRow是我们选中的当前行数据 + + const new_url = `${curChangeRow.value.device_ownership_url}/?limit=999` + dict.label = curChangeRow.value.device_ownership_label + + //进来正确开始处理数据时,要把判断值重置,防止变量继续存储到数据,影响到其它功能 + curChangeRow.value = ref() + editStatus.value = false + + return request({ + url: new_url, + }).then((ret: any) => { + return ret.data; + }); + + } + + + } + + } + }, + + }) + + + + return { + crudOptions: { + request: { + pageRequest, + addRequest, + editRequest, + rowEditRequest, + delRequest + }, + actionbar: { + buttons: { + add: { + show: false + }, + addRow: { + show: true + }, + + // 注释编号:django-vue3-admin-crud243914:代码开始行 + // 功能说明:自定义复制一条线行数据 + copyRow: { + text:"复制",//按钮文字 + type:"warning", //修改颜色 + show:!showStatus.value.disabled, // 按查看与编辑的情况下显示或隐藏当前按钮 + async click(){ + try{ + if(curChangeRow.value){ + let copyRowData = JSON.parse(JSON.stringify(curChangeRow.value)); // 深拷贝对象 + + //如下是为要排除的字段,每张子表可能有所不同,可以使用console.log("111111111111", copyRowData)查看一下 + const excludeFields = ['id', 'sortIndex', 'create_datetime', 'update_datetime', 'dept_belong_id', 'modifier', 'creator', '$editable_id', 'modifier_name', 'creator_name']; + for(let field of excludeFields) { + delete copyRowData[field]; + } + + //调用新增方法,并且把调整好的copyRowData传进去,如下我们就一定要配置 crudBinding.value?.table?.editable?.addRow方法 + crudBinding.value?.table?.editable?.addRow(crudBinding.value.data, copyRowData) + + //复制数据,相当于引发编辑状态,所以这里要配置editStatus.value = true来引发相应的dict的URl及label的不同加载 + editStatus.value = true + + //刷新dict字典 + device_ownership_dit_ref.reloadDict() + + } + + }catch (error) { + console.error('Error editing row:', error); + } + + }, + + }, + // 注释编号:django-vue3-admin-crud243914:代码结束行 + + + + + + // 注释编号:django-vue3-admin-crud541816:代码开始行 + // 功能说明:上下移动行数据的实现 + sortUp:{ + text:"上移",//按钮文字 + // title:"数据必须先单击选中之后再单击上移",//鼠标停留显示的信息 + type:"success", //修改为绿色 + show:!showStatus.value.disabled, // 注释编号:django-vue3-admin-crud550115:按查看与编辑的情况下显示或隐藏当前按钮 + async click(){ + try { + // 注释编号:django-vue3-admin-crud020816:选移动对象时,先去拿到当前table单选之选中的对象(选中的行数据) + let row = curChangeRow.value + + if (row.sortIndex != 1){ //这里要进行判断如果是选中了第一条的话,那就不再执行上移的操作,防止出错 + + // 注释编号:django-vue3-admin__crud033511:在所有crudBinding.value.data数据当中找到上一个row.sortIndex - 1的对象,并且去除[].shift()返回一个字典对象 + let anotherRow = crudBinding.value.data?.filter(item => item.sortIndex === row.sortIndex - 1).shift(); //拿到当前单选选中数据的上一条数据 + + anotherRow.sortIndex = anotherRow.sortIndex + 1 //上一条数据减1排序 + row.sortIndex = row.sortIndex - 1 //当前选中的这一条数据+1排序 + + + // 注释编号:django-vue3-admin__crud594716:这里自己重新做一条row提交的请求,不要直接使用crudExpose.editable.doSaveRow({row}) ,这样页面就不会存在闪一下的情况 + await rowEditRequest({row}) + await rowEditRequest({row:anotherRow}) + + crudExpose.doRefresh(); //最后刷新页面 + } + }catch (error) { + console.error('Error editing row:', error); + } + + }, + + }, + sortDown:{ + text:"下移",//按钮文字 + // title:"数据必须先单击选中之后再单击下移",//鼠标停留显示的信息 + type:"success", //修改为绿色 + show:!showStatus.value.disabled, // 注释编号:django-vue3-admin-crud252816:按查看与编辑的情况下显示或隐藏当前按钮 + async click(){ + + try { + const row = curChangeRow.value + const anotherRow = crudBinding.value.data?.filter(item => item.sortIndex === row.sortIndex + 1).shift(); + if (anotherRow){ //判断他是否还有下一条数据,如果没有了,说明当前这一条数据是最后一条,那就不需要再下移了 + + row.sortIndex = row.sortIndex + 1 + anotherRow.sortIndex = anotherRow.sortIndex - 1 + + //先取消所有行的编辑状态 + crudExpose.editable.cancel() + + // 注释编号:django-vue3-admin__crud594716:这里自己重新做一条row提交的请求,不要直接使用crudExpose.editable.doSaveRow({row}) ,这样页面就不会存在闪一下的情况 + + await rowEditRequest({row}) + await rowEditRequest({row:anotherRow}) + + crudExpose.doRefresh(); //最后刷新页面 + } + + }catch (error) { + + console.error('Error editing row:', error); + + } + + }, + }, + // 注释编号:django-vue3-admin-crud541816:代码结束行 + } + }, + search: { + show: false, + initialForm: { + parentId: parentIdRef + } + }, + toolbar: { + show: false, + buttons: { + refresh: { + show: false, + } + } + }, + table: { + // 注释编号:django-vue3-admin-crud300516:代码开始行 + // 功能说明:启用table的单选功能及触发的事件 + highlightCurrentRow:true, //启用单选方法,与onCurrentChange单选事件做配套 + onCurrentChange,//启用单独事件,与highlightCurrentRow单选方法做配套 + // 注释编号:django-vue3-admin-crud300516:代码结束行 + + editable: { + // rowKey:'id', + // rowKey:'_index', + enabled: true, + mode: "row", + activeDefault: false, + + //排它式激活,限制当前子表行编辑只能同时激活一行,当前mode: "row",状态下不生效 + exclusive: true, + exclusiveEffect: "save", // "cancel" | "save"; + + + addRow: (data: any[], row: any)=>{ + // (data: any[], row: any) => void + //在最后一行插入数据 + data.push(row) + }, + } + }, + rowHandle: { + + width:200, // 注释编号:django-vue3-admin-crud390718:这里要重新定义一个宽度,因为全局定制了170,这里不够使用 + + //这个地方才是配置了子表中编辑、取消、保存等按钮的地方 + group: { + "editRow": { //行编辑模式 + + // 注释编号:django-vue3-admin-crud170618:代码开始行 + // 功能说明:这里对edit按钮进行了定制事件,核心代码是直接使用fastcurd的 + "edit": { //进入编辑 + click: (context: ScopeContext) => { + //如下代码是由fastcrut作者写的,拿到了当前行的标识 + const { index, row } = context; + const editableId = row[crudBinding.value.table?.editable?.rowKey]; + + if (crudBinding.value.table?.editable?.exclusive) { + //排他式激活 + const activeRows: EditableRow[] = crudExpose.editable.getActiveRows(); + _.forEach(activeRows, (item: EditableRow) => { + if (crudBinding.value.table?.editable?.exclusiveEffect === "save") { + crudExpose.editable.doSaveRow({ row: item.rowData }); + } else { + crudExpose.editable.doCancelRow({ row: item.rowData }); + } + + }); + } + + crudExpose.editable.getEditableRow(editableId)?.active(); + + + + // 注释编号:django-vue3-admin-crud204810:这里是拿到了当前点击编辑的行数据,并且赋值给curRowData,对标注释编号:django-vue3-admin-crud264910 + curRowData.value = context.row + + + // editStatus.value = false //配置一个编辑状态,先把他恢复成 + editStatus.value = true //配置一个编辑状态 + + + // 注释编号:django-vue3-admin-crud085714:功能说明:对动态的URL及label进行判断及赋值,这里主要是给accessInfo字段使用的 + // console.log("1111111111", context.row) + // if(context.row.device_ownership_url&&context.row.device_ownership_label){ + // dynamic_url.value = context.row.url + // dynamic_label.value = context.row.label + // } + + }, + }, + + // 注释编号:django-vue3-admin-crud170618:代码结束行 + + save: { + click: async (context: ScopeContext) => { + const { index, row } = context; + + // 注释编号:django-vue3-admin__crud463316:代码开始行 + // 功能说明:这里通过对应的dict的id再拿到url去请求回来对应的label值,当然如果fastcrud后面发现可以直接在页面上拿到对应的dict里面的id及label那最好了,这里就可以直接优化掉了。 + + if (row.device_ownership_url&&row.device_ownership){ //这里一定要先做个判断,防止点击新增之后,什么都没有填写,就直接按保存提交了,从而引发下面request请求的错误 + const new_url = `${row.device_ownership_url}/${row.device_ownership}` + + const retdata = await request({ + url: new_url, + }).then((ret: any) => { + return ret.data[row.device_ownership_label]; + }); + + row.device_ownership_title = retdata + + } + + // 注释编号:django-vue3-admin__crud463316:代码结束行 + + + + + // 注释编号:django-vue3-admin__crud075017:代码开始行 + // 功能说明:在点击保存时,前端对row.sortIndex进行处理 + if (row.device_ownership_url&&row.device_ownership){ + //如果当前行没有sortIndex值,说明是新增的对象,那么就要自动给添加sortIndex的值 + if(!row.sortIndex){ + const dictLength = Object.keys(crudBinding.value.data).length; //查询当前整个table有多少条数据,包括点击保存的当前对象 + row.sortIndex = dictLength + + } + } + // 注释编号:django-vue3-admin__crud075017:代码结束行 + + await crudExpose.editable.doSaveRow({ row }); //行数据做保存 + }, + + + }, + }, + } + + }, + pagination: { show: false, pageSize: 9999999 }, + columns: { + + // 注释编号:django-vue3-admin-crud532910:代码开始行 + // 功能说明:配置出来fastcrud自带的index索引字段 + _index: { //把table表索引给显示出来 + title: "线序", + form: { show: false }, + column: { + align: "center", + columnSetDisabled: true, //禁止在列设置中选择 + } + }, + // 注释编号:django-vue3-admin-crud532910:代码结束行 + + sortIndex:{ + title: "排序", + form: { show: false }, + column: { + show:false, //要把这个专门拿来排序的字段进行隐藏显示 + align: "center", + columnSetDisabled: true, //禁止在列设置中选择 + + }, + + }, + + // 注释编号:django-vue3-admin-crud084317:代码开始行 + // 功能说明:联动选择中主动的select项目,它自己的选择项目会引发被动字典的dict根据新的需求请求重新请求 + lineaccesstype: { + title: '线路接入类型', + type: 'dict-select', + dict: dict({ + // 注释编号:django-vue3-admin-crud274017:这里传&filterUrlAndLabel=yes是让后端判断一下,把url及label过滤掉空的对象,再传给前端,这里要后端在querySet中进行处理 + url: '/api/lineAccessTypeModelViewSet/?limit=999&filterUrlAndLabel=yes', + value: 'id', + label: 'title', + getData: async ({ url }: { url: string }) => { + return request({ + url: url, + }).then((ret: any) => { + return ret.data; + }); + }, + }), + column: { + rules: [{required: true, message: "线路接入类型为必选项"},], + minWidth: 80, //最小列宽 + // 注释编号:django-vue3-admin__crud165216:代码开始行 + // 功能说明:异步函数的处理,如果不写成异步,那怕是赋值后,也总是拿到变动前的值 + // async valueChange ({row,getComponentRef}){ + // row.device_ownership= undefined; //把row.device_ownership的值置空,因为它可能会被先选择了值,所以要置空它,接下来的代码便是再重新加载一下字典 + + // //把当前字段线路接入类型的值给传到getComponentRef("device_ownership")字典中的data拿到 + + // if (row.lineaccesstype){ + // const data = getComponentRef("lineaccesstype").dict._data + // //根据当前选中的id值去字典data里面拿到对应的url + // let new_data = data.find(obj => obj.id === row.lineaccesstype) + // let id_url = new_data.url; + // let label = new_data.label + // //把对应的url传给设备归属device_ownership + // getComponentRef("device_ownership").url = id_url + // getComponentRef("device_ownership").label = label + + // row.device_ownership_url = id_url //这里把当前设备归属对应的url进行填充至当前row里面的device_ownership_url + // row.device_ownership_label = label //这里要把label同步给新对象赋值 + + // //重新刷新device_ownership字段的dict字典请求 + // await getComponentRef("device_ownership").reloadDict(); + // } + + + + // }, + // 注释编号:django-vue3-admin__crud165216:代码结束行 + }, + + form:{ + rules: [{required: true, message: "线路接入类型为必选项"},], + component:{ + filterable: true, + on:{ + + // 注释编号:django-vue3-admin-crud233216:代码开始行 + // 功能说明:选中值之后,再进行device_ownership字段的处理,这里要比在async valueChange ({row,getComponentRef})里面处理更灵活一点 + onSelectedChange({$event, row, getComponentRef}:{$event:any, row:any, getComponentRef:any}){ + + if ($event.url&&$event.label){ + + row.device_ownership= undefined;//把row.device_ownership的值置空,因为它可能会被先选择了值,所以要置空它,接下来的代码便是再重新加载一下字典 + + //把当前字段线路接入类型的值给传到getComponentRef("device_ownership")字典中的data拿到 + getComponentRef("device_ownership").url = $event.url + getComponentRef("device_ownership").label = $event.label + + row.device_ownership_url = $event.url //这里把当前设备归属对应的url进行填充至当前row里面的device_ownership_url + row.device_ownership_label = $event.label //这里要把label同步给新对象赋值 + + + //重新刷新device_ownership字段的dict字典请求 + getComponentRef("device_ownership").reloadDict(); + + } + + + + } + // 注释编号:django-vue3-admin-crud233216:代码结束行 + + }, + + + + }, + }, + }, + // 注释编号:django-vue3-admin-crud084317:代码结束行 + + // 注释编号:django-vue3-admin-crud264117:代码开始行 + // 功能说明:联动选择中被动的字典,他的dict是由主的select引发传过来的url及label之后再展现数据的 + + device_ownership: { //测试懒加载 + title: "设备归属", + type: "dict-select", + search: { + show: true + }, + dict: device_ownership_dit_ref, + form: { + component: {filterable: true,}, + rules: [{required: true, message: "设备归属为必选项"},], + + }, + column: { + rules: [{required: true, message: "设备归属为必选项"},], + }, + + + }, + // 注释编号:django-vue3-admin-crud264117:代码结束行 + + port_direction: { + title: '端口方向', + type: 'dict-select', + + dict: dict({ + value: 'dictNum', + label: 'dictName', + getData: async ({ url }: { url: string }) => { + const curId = await request({ + url: '/api/globalDictModelViewSet/?dictName=lineTagPortDirection', + }).then((ret: any) => { + return ret.data[0].id; + }); + return request({ + url: `/api/globalDictModelViewSet/?limit=999&dictMark=${curId}`, + }).then((ret: any) => { + return ret.data; + }); + }, + }), + + form: { + component: { + span: 12, + + }, + }, + column: { + minWidth: 60, //最小列宽 + valueChange({row}){ // 注释编号:django-vue3-admin-crud482915:这里使用valueChange,取消select选择之后,拿到了""空值传给后端,会导致出错,这里做了判断,重置为null就不会出错了 + if(row.port_direction == ""){ + row.port_direction = null + } + + }, + + }, + component: { props: { color: 'auto' } }, // 自动染色 + }, + device_port: { + title: '端口', + type: 'dict-select', + dict: dict({ + url: '/api/DevicePortModelViewSet/?limit=999', + value: 'id', + label: 'title', + getData: async ({ url }: { url: string }) => { + return request({ + url: url, + }).then((ret: any) => { + return ret.data; + }); + }, + }), + column: { + minWidth: 60, //最小列宽 + }, + form:{ + // rules: [ + // // 表单校验规则 + // { + // required: true, + // message: '必填项', + // }, + // ], + component:{ + filterable: true, + }, + }, + }, + description: { + title: "备注说明", + type: "input", + }, + device_ownership_url: { + title: '设备归属之URL', + type: 'input', + column: { + show: false, + }, + }, + device_ownership_title: { + title: '设备归属的显示名称', + type: 'input', + column: { + show: false, + }, + }, + device_ownership_id: { + title: '设备归属之ID', + type: 'input', + column: { + show: false, + }, + }, + parentId: { + title: "父Id-线路编码", + type: "number", + form: { + value: parentIdRef, + component: { + disabled: true, + } + }, + //在页面隐藏起来,不让用户看到父Id字段 + column: { + show: false, + } + }, + } + } + }; + } + diff --git a/web/src/views/it_mis/LineTagTables/SubLineTagModelViewSet/SubLineTagModelViewSetSub/index.vue b/web/src/views/it_mis/LineTagTables/SubLineTagModelViewSet/SubLineTagModelViewSetSub/index.vue new file mode 100644 index 0000000000000000000000000000000000000000..2116167d387d3d8b93caafb24808daf180b257b4 --- /dev/null +++ b/web/src/views/it_mis/LineTagTables/SubLineTagModelViewSet/SubLineTagModelViewSetSub/index.vue @@ -0,0 +1,124 @@ + + + + + + + \ No newline at end of file diff --git a/web/src/views/it_mis/LineTagTables/SubLineTagModelViewSet/api.ts b/web/src/views/it_mis/LineTagTables/SubLineTagModelViewSet/api.ts new file mode 100644 index 0000000000000000000000000000000000000000..0dc9dff2c2056400b4646c640b7ead9ef0f9c0c5 --- /dev/null +++ b/web/src/views/it_mis/LineTagTables/SubLineTagModelViewSet/api.ts @@ -0,0 +1,50 @@ +import { request,downloadFile } from '/@/utils/service'; +import { PageQuery, AddReq, DelReq, EditReq, InfoReq } from '@fast-crud/fast-crud'; + +export const apiPrefix = '/api/SubLineTagModelViewSet/'; + +export function GetList(query: PageQuery) { + return request({ + url: apiPrefix, + method: 'get', + params: query, + }); +} +export function GetObj(id: InfoReq) { + return request({ + url: apiPrefix + id, + method: 'get', + }); +} + +export function AddObj(obj: AddReq) { + return request({ + url: apiPrefix, + method: 'post', + data: obj, + }); +} + +export function UpdateObj(obj: EditReq) { + return request({ + url: apiPrefix + obj.id + '/', + method: 'put', + data: obj, + }); +} + +export function DelObj(id: DelReq) { + return request({ + url: apiPrefix + id + '/', + method: 'delete', + data: { id }, + }); +} + +export function exportData(params:any){ + return downloadFile({ + url: apiPrefix + 'export_data/', + params: params, + method: 'get' + }) +} diff --git a/web/src/views/it_mis/LineTagTables/SubLineTagModelViewSet/crud.tsx b/web/src/views/it_mis/LineTagTables/SubLineTagModelViewSet/crud.tsx new file mode 100644 index 0000000000000000000000000000000000000000..03f56a80a597d2c1cbae6a9d39842357d93364c4 --- /dev/null +++ b/web/src/views/it_mis/LineTagTables/SubLineTagModelViewSet/crud.tsx @@ -0,0 +1,253 @@ +import { AddReq, DelReq, EditReq, dict, CrudExpose, UserPageQuery, CreateCrudOptionsRet} from '@fast-crud/fast-crud'; +import _ from 'lodash-es'; +import * as api from './api'; +import { request } from '/@/utils/service'; + + +//此处为crudOptions配置 +export default function ({ crudExpose}: { crudExpose: CrudExpose}): CreateCrudOptionsRet { + const pageRequest = async (query: any) => { + return await api.GetList(query); + }; + const editRequest = async ({ form, row }: EditReq) => { + if (row.id) { + form.id = row.id; + } + return await api.UpdateObj(form); + }; + const delRequest = async ({ row }: DelReq) => { + return await api.DelObj(row.id); + }; + const addRequest = async ({ form }: AddReq) => { + return await api.AddObj(form); + }; + + const exportRequest = async (query: UserPageQuery) => { + return await api.exportData(query) + }; + + + + return { + crudOptions: { + request: { + pageRequest, + addRequest, + editRequest, + delRequest, + }, + actionbar: { + buttons: { + add:{ + show:false + }, + export:{ + click(){ + return exportRequest(crudExpose.getSearchFormData()) + } + } + } + }, + rowHandle:{ + + buttons:{ + edit:{ + show:false + }, + copy:{ + show:false + }, + remove:{ + show:false + } + } + }, + columns: { + parentId: { + title: '线编号', + type: 'dict-select', + search: { + component: { + placeholder: '请输入设备归属查询', + clearable: true, + filterable:true, + }, + show: true + }, + dict: dict({ + url: '/api/LineTagModelViewSet/?limit=999', + value: 'id', + label: 'line_num', + getData: async ({ url }: { url: string }) => { + return request({ + url: url, + }).then((ret: any) => { + return ret.data; + }); + }, + }), + column: { + minWidth: 80, //最小列宽 + sortable: 'custom', + }, + + }, + + + lineaccesstype: { + title: '线路接入类型', + type: 'dict-select', + dict: dict({ + url: '/api/lineAccessTypeModelViewSet/?limit=999', + value: 'id', + label: 'title', + getData: async ({ url }: { url: string }) => { + return request({ + url: url, + }).then((ret: any) => { + return ret.data; + }); + }, + }), + column: { + minWidth: 80, //最小列宽 + + }, + }, + + device_ownership: { //测试懒加载 + title: "设备归属", + type: "dict-select", + // search: { + // show: true // 注释编号:django-vue3-admin-crud550616:为什么要取消这个搜索,因为当前页面的设备归属搜索其实是搜索device_ownership_title字段 + // }, + dict: dict({ + prototype: true, // 注释编号:django-vue3-admin-crud463016:这里配置每一次记录都单独请求一次,要不然每一条数据无法都根据URL再去请求相差的对象回来 + value: 'id', + getData: async ({ form ,value, dict}: any) => { + let values= []; + values.push(value) + if(value){ //这里要判断当前的值是否为真,才进行请求 + if(form){ + const new_url = `${form.device_ownership_url}/getbyIds/` //这里做成了懒加载,加载速度才会明显的快起来。 + dict.label = form.device_ownership_label + return request({ + url: new_url, + method: "post", + data: {values}, + }).then((ret: any) => { + return ret.data; + }); + } + + } + + }, + + }), + column: { + // minWidth: 120, + sortable: 'custom', + }, + }, + device_ownership_url: { + title: '设备归属之URL', + type: 'input', + // search: { show: true}, + readonly:true, + column: { + // minWidth: 120, + sortable: 'custom', + }, + form: { + // show:false, + component: { + placeholder: '请输入设备归属之URL', + }, + }, + }, + device_ownership_title: { // 注释编号:django-vue3-admin-crud170816:这个字段要全部隐藏,因为他只是拿到作搜索使用的,并无实际作用 + title: '设备归属', + type: 'input', + search: { + component: { + placeholder: '请输入设备归属查询', + clearable: true, + }, + show: true + }, + + column: { + show:false, + }, + form: { + show:false, + component: { + placeholder: '请输入设备归属', + }, + }, + }, + port_direction: { + title: '端口方向', + type: 'dict-select', + dict: dict({ + value: 'dictNum', + label: 'dictName', + getData: async () => { + const curId = await request({ + url: '/api/globalDictModelViewSet/?dictName=lineTagPortDirection', + }).then((ret: any) => { + return ret.data[0].id; + }); + return request({ + url: `/api/globalDictModelViewSet/?limit=999&dictMark=${curId}`, + }).then((ret: any) => { + return ret.data; + }); + }, + }), + form: { + component: { + span: 12, + }, + }, + component: { props: { color: 'auto' } }, // 自动染色 + }, + device_port: { + title: '端口', + type: 'dict-select', + dict: dict({ + url: '/api/DevicePortModelViewSet/?limit=999', + value: 'id', + label: 'title', + getData: async ({ url }: { url: string }) => { + return request({ + url: url, + }).then((ret: any) => { + return ret.data; + }); + }, + }), + column: { + minWidth: 80, //最小列宽 + sortable: 'custom', + }, + form:{ + // rules: [ + // // 表单校验规则 + // { + // required: true, + // message: '必填项', + // }, + // ], + component:{ + filterable: true, + }, + }, + }, + + }, + + }, + }; +} diff --git a/web/src/views/it_mis/LineTagTables/SubLineTagModelViewSet/index.vue b/web/src/views/it_mis/LineTagTables/SubLineTagModelViewSet/index.vue new file mode 100644 index 0000000000000000000000000000000000000000..486adfdb0f7aa4099802b138b5804982322967c6 --- /dev/null +++ b/web/src/views/it_mis/LineTagTables/SubLineTagModelViewSet/index.vue @@ -0,0 +1,55 @@ + + + + + diff --git a/web/src/views/it_mis/LineTagTables/lineAccessTypeModelViewSet/api.ts b/web/src/views/it_mis/LineTagTables/lineAccessTypeModelViewSet/api.ts new file mode 100644 index 0000000000000000000000000000000000000000..925b441cdf4290b832a0dff19f0d05124f5aaf9b --- /dev/null +++ b/web/src/views/it_mis/LineTagTables/lineAccessTypeModelViewSet/api.ts @@ -0,0 +1,50 @@ +import { request,downloadFile } from '/@/utils/service'; +import { PageQuery, AddReq, DelReq, EditReq, InfoReq } from '@fast-crud/fast-crud'; + +export const apiPrefix = '/api/lineAccessTypeModelViewSet/'; + +export function GetList(query: PageQuery) { + return request({ + url: apiPrefix, + method: 'get', + params: query, + }); +} +export function GetObj(id: InfoReq) { + return request({ + url: apiPrefix + id, + method: 'get', + }); +} + +export function AddObj(obj: AddReq) { + return request({ + url: apiPrefix, + method: 'post', + data: obj, + }); +} + +export function UpdateObj(obj: EditReq) { + return request({ + url: apiPrefix + obj.id + '/', + method: 'put', + data: obj, + }); +} + +export function DelObj(id: DelReq) { + return request({ + url: apiPrefix + id + '/', + method: 'delete', + data: { id }, + }); +} + +export function exportData(params:any){ + return downloadFile({ + url: apiPrefix + 'export_data/', + params: params, + method: 'get' + }) +} diff --git a/web/src/views/it_mis/LineTagTables/lineAccessTypeModelViewSet/crud.tsx b/web/src/views/it_mis/LineTagTables/lineAccessTypeModelViewSet/crud.tsx new file mode 100644 index 0000000000000000000000000000000000000000..4cb4e1c00b1dee6512aa86e2b0155b3c833de1e4 --- /dev/null +++ b/web/src/views/it_mis/LineTagTables/lineAccessTypeModelViewSet/crud.tsx @@ -0,0 +1,132 @@ +import { CrudOptions, AddReq, DelReq, EditReq, dict, CrudExpose, compute, UserPageQuery, CreateCrudOptionsRet} from '@fast-crud/fast-crud'; +import _ from 'lodash-es'; +import * as api from './api'; +import { request } from '/@/utils/service'; +import { dictionary } from '/@/utils/dictionary'; + + +//此处为crudOptions配置 +export default function ({ crudExpose}: { crudExpose: CrudExpose}): CreateCrudOptionsRet { + const pageRequest = async (query: any) => { + return await api.GetList(query); + }; + const editRequest = async ({ form, row }: EditReq) => { + if (row.id) { + form.id = row.id; + } + return await api.UpdateObj(form); + }; + const delRequest = async ({ row }: DelReq) => { + return await api.DelObj(row.id); + }; + const addRequest = async ({ form }: AddReq) => { + return await api.AddObj(form); + }; + + const exportRequest = async (query: UserPageQuery) => { + return await api.exportData(query) + }; + + + + return { + crudOptions: { + request: { + pageRequest, + addRequest, + editRequest, + delRequest, + }, + actionbar: { + buttons: { + export:{ + click(){ + return exportRequest(crudExpose.getSearchFormData()) + } + } + } + }, + form: { + col: { span: 24 }, + // labelWidth: '100px', + wrapper: { + is: 'el-dialog', + // width: '600px', + }, + + }, + columns: { + + title: { + title: '接入类型', + type: 'input', + search: { show: true}, + column: { + // minWidth: 120, + sortable: 'custom', + }, + form: { + rules: [{ required: true, message: '线路接入类型必填' }], + component: { + placeholder: '请输入线路接入类型', + }, + + bottomRender({ value }) { + return 线路接入类型是指线路接入到什么类型的设备当中,当前类型必须唯一; + }, + }, + }, + url: { + title: '接入类型请求的URL', + type: 'input', + search: { show: true}, + column: { + // minWidth: 120, + sortable: 'custom', + }, + form: { + // rules: [{ required: true, message: '线路类型请求的URL必填' }], + component: { + placeholder: '请输入线路类型请求的URL', + }, + bottomRender({ value }) { + return 重要:要查找对应的线路接入类型,并将后端API请求地址填写在此处; + }, + }, + }, + label: { + title: '相应URL请求回来之后对应在label', + type: 'input', + search: { show: true}, + column: { + // minWidth: 120, + sortable: 'custom', + }, + form: { + // rules: [{ required: true, message: '相应URL请求回来之后对应在label必填' }], + component: { + placeholder: '请输入相应URL请求回来之后对应在label', + }, + bottomRender({ value }) { + return 重要:这个label最终会被前端线路接入类型与设备归属的联动选择所引用; + }, + }, + }, + + description: { + title: '备注', + type: 'textarea', + search: {show: false}, + form: { + component: { + maxlength: 200, + placeholder: '输入备注', + }, + }, + }, + + }, + + }, + }; +}; diff --git a/web/src/views/it_mis/LineTagTables/lineAccessTypeModelViewSet/index.vue b/web/src/views/it_mis/LineTagTables/lineAccessTypeModelViewSet/index.vue new file mode 100644 index 0000000000000000000000000000000000000000..56ffc621168dff90fb88fbb5a778e767da08a2be --- /dev/null +++ b/web/src/views/it_mis/LineTagTables/lineAccessTypeModelViewSet/index.vue @@ -0,0 +1,55 @@ + + + + + diff --git a/web/src/views/it_mis/Memory/api.ts b/web/src/views/it_mis/Memory/api.ts new file mode 100644 index 0000000000000000000000000000000000000000..e246ec1caf4ca16a1e3759e35eb55a54efa6b270 --- /dev/null +++ b/web/src/views/it_mis/Memory/api.ts @@ -0,0 +1,50 @@ +import { request,downloadFile } from '/@/utils/service'; +import { PageQuery, AddReq, DelReq, EditReq, InfoReq } from '@fast-crud/fast-crud'; + +export const apiPrefix = '/api/MemoryViewSet/'; + +export function GetList(query: PageQuery) { + return request({ + url: apiPrefix, + method: 'get', + params: query, + }); +} +export function GetObj(id: InfoReq) { + return request({ + url: apiPrefix + id, + method: 'get', + }); +} + +export function AddObj(obj: AddReq) { + return request({ + url: apiPrefix, + method: 'post', + data: obj, + }); +} + +export function UpdateObj(obj: EditReq) { + return request({ + url: apiPrefix + obj.id + '/', + method: 'put', + data: obj, + }); +} + +export function DelObj(id: DelReq) { + return request({ + url: apiPrefix + id + '/', + method: 'delete', + data: { id }, + }); +} + +export function exportData(params:any){ + return downloadFile({ + url: apiPrefix + 'export_data/', + params: params, + method: 'get' + }) +} diff --git a/web/src/views/it_mis/Memory/crud.tsx b/web/src/views/it_mis/Memory/crud.tsx new file mode 100644 index 0000000000000000000000000000000000000000..a1ab0b06ef18729674cb9a81701f7f402a20cb07 --- /dev/null +++ b/web/src/views/it_mis/Memory/crud.tsx @@ -0,0 +1,91 @@ +import { AddReq, DelReq, EditReq, dict, CrudExpose, compute, UserPageQuery, CreateCrudOptionsRet} from '@fast-crud/fast-crud'; +import _ from 'lodash-es'; +import * as api from './api'; +import { request } from '/@/utils/service'; +import { dictionary } from '/@/utils/dictionary'; +import {inject} from "vue"; + + + +//此处为crudOptions配置 + export default function ({ crudExpose}: { crudExpose: CrudExpose}): CreateCrudOptionsRet { + const pageRequest = async (query: any) => { + return await api.GetList(query); + }; + const editRequest = async ({ form, row }: EditReq) => { + if (row.id) { + form.id = row.id; + } + return await api.UpdateObj(form); + }; + const delRequest = async ({ row }: DelReq) => { + return await api.DelObj(row.id); + }; + const addRequest = async ({ form }: AddReq) => { + return await api.AddObj(form); + }; + + const exportRequest = async (query: UserPageQuery) => { + return await api.exportData(query) + }; + + + + + + + return { + crudOptions: { + request: { + pageRequest, + addRequest, + editRequest, + delRequest, + }, + actionbar: { + buttons: { + export:{ + click(){ + return exportRequest(crudExpose.getSearchFormData()) + } + } + } + }, + form: { + col: { span: 24 }, + labelWidth: '100px', + wrapper: { + is: 'el-dialog', + width: '600px', + }, + + }, + columns: { + + + + title: { + title: '内存大小', + type: 'input', + search: { show: true}, + column: { + minWidth: 120, + sortable: 'custom', + }, + form: { + rules: [{ required: true, message: '内存大小名称必填' }], + component: { + placeholder: '请输入内存大小', + }, + }, + }, + + + + + + }, + + }, + }; +}; diff --git a/web/src/views/it_mis/Memory/index.vue b/web/src/views/it_mis/Memory/index.vue new file mode 100644 index 0000000000000000000000000000000000000000..f559eebabce671bf7a0c650cdf2d16922416cc67 --- /dev/null +++ b/web/src/views/it_mis/Memory/index.vue @@ -0,0 +1,54 @@ + + + + + diff --git a/web/src/views/it_mis/SoftType/api.ts b/web/src/views/it_mis/SoftType/api.ts new file mode 100644 index 0000000000000000000000000000000000000000..308b9693de36aaa97648202a59483f09743bd5dc --- /dev/null +++ b/web/src/views/it_mis/SoftType/api.ts @@ -0,0 +1,50 @@ +import { request,downloadFile } from '/@/utils/service'; +import { PageQuery, AddReq, DelReq, EditReq, InfoReq } from '@fast-crud/fast-crud'; + +export const apiPrefix = '/api/SoftTypeViewSet/'; + +export function GetList(query: PageQuery) { + return request({ + url: apiPrefix, + method: 'get', + params: query, + }); +} +export function GetObj(id: InfoReq) { + return request({ + url: apiPrefix + id, + method: 'get', + }); +} + +export function AddObj(obj: AddReq) { + return request({ + url: apiPrefix, + method: 'post', + data: obj, + }); +} + +export function UpdateObj(obj: EditReq) { + return request({ + url: apiPrefix + obj.id + '/', + method: 'put', + data: obj, + }); +} + +export function DelObj(id: DelReq) { + return request({ + url: apiPrefix + id + '/', + method: 'delete', + data: { id }, + }); +} + +export function exportData(params:any){ + return downloadFile({ + url: apiPrefix + 'export_data/', + params: params, + method: 'get' + }) +} diff --git a/web/src/views/it_mis/SoftType/crud.tsx b/web/src/views/it_mis/SoftType/crud.tsx new file mode 100644 index 0000000000000000000000000000000000000000..0f23fc1c3151992a8c5915cd069499f460d7a28c --- /dev/null +++ b/web/src/views/it_mis/SoftType/crud.tsx @@ -0,0 +1,91 @@ +import { AddReq, DelReq, EditReq, dict, CrudExpose, compute, UserPageQuery, CreateCrudOptionsRet} from '@fast-crud/fast-crud'; +import _ from 'lodash-es'; +import * as api from './api'; +import { request } from '/@/utils/service'; +import { dictionary } from '/@/utils/dictionary'; +import {inject} from "vue"; + + + +//此处为crudOptions配置 + export default function ({ crudExpose}: { crudExpose: CrudExpose}): CreateCrudOptionsRet { + const pageRequest = async (query: any) => { + return await api.GetList(query); + }; + const editRequest = async ({ form, row }: EditReq) => { + if (row.id) { + form.id = row.id; + } + return await api.UpdateObj(form); + }; + const delRequest = async ({ row }: DelReq) => { + return await api.DelObj(row.id); + }; + const addRequest = async ({ form }: AddReq) => { + return await api.AddObj(form); + }; + + const exportRequest = async (query: UserPageQuery) => { + return await api.exportData(query) + }; + + + + + + + return { + crudOptions: { + request: { + pageRequest, + addRequest, + editRequest, + delRequest, + }, + actionbar: { + buttons: { + export:{ + click(){ + return exportRequest(crudExpose.getSearchFormData()) + } + } + } + }, + form: { + col: { span: 24 }, + labelWidth: '100px', + wrapper: { + is: 'el-dialog', + width: '600px', + }, + + }, + columns: { + + + + title: { + title: '软件类型', + type: 'input', + search: { show: true}, + column: { + minWidth: 120, + sortable: 'custom', + }, + form: { + rules: [{ required: true, message: '软件类型名称必填' }], + component: { + placeholder: '请输入软件类型', + }, + }, + }, + + + + + + }, + + }, + }; +}; diff --git a/web/src/views/it_mis/SoftType/index.vue b/web/src/views/it_mis/SoftType/index.vue new file mode 100644 index 0000000000000000000000000000000000000000..e129ac5bf88946816a4775c4a8630323d876d9bc --- /dev/null +++ b/web/src/views/it_mis/SoftType/index.vue @@ -0,0 +1,54 @@ + + + + + diff --git a/web/src/views/it_mis/SuppliersTables/SuppliersTypeViewSet/api.ts b/web/src/views/it_mis/SuppliersTables/SuppliersTypeViewSet/api.ts new file mode 100644 index 0000000000000000000000000000000000000000..18e0b12930d10390cc87bb3643e1681977c46d9f --- /dev/null +++ b/web/src/views/it_mis/SuppliersTables/SuppliersTypeViewSet/api.ts @@ -0,0 +1,50 @@ +import { request,downloadFile } from '/@/utils/service'; +import { PageQuery, AddReq, DelReq, EditReq, InfoReq } from '@fast-crud/fast-crud'; + +export const apiPrefix = '/api/SuppliersTypeViewSet/'; + +export function GetList(query: PageQuery) { + return request({ + url: apiPrefix, + method: 'get', + params: query, + }); +} +export function GetObj(id: InfoReq) { + return request({ + url: apiPrefix + id, + method: 'get', + }); +} + +export function AddObj(obj: AddReq) { + return request({ + url: apiPrefix, + method: 'post', + data: obj, + }); +} + +export function UpdateObj(obj: EditReq) { + return request({ + url: apiPrefix + obj.id + '/', + method: 'put', + data: obj, + }); +} + +export function DelObj(id: DelReq) { + return request({ + url: apiPrefix + id + '/', + method: 'delete', + data: { id }, + }); +} + +export function exportData(params:any){ + return downloadFile({ + url: apiPrefix + 'export_data/', + params: params, + method: 'get' + }) +} diff --git a/web/src/views/it_mis/SuppliersTables/SuppliersTypeViewSet/crud.tsx b/web/src/views/it_mis/SuppliersTables/SuppliersTypeViewSet/crud.tsx new file mode 100644 index 0000000000000000000000000000000000000000..414b260e7dbb51dec714e16ea7a596d7be936b6a --- /dev/null +++ b/web/src/views/it_mis/SuppliersTables/SuppliersTypeViewSet/crud.tsx @@ -0,0 +1,90 @@ +import { CrudOptions, AddReq, DelReq, EditReq, CrudExpose, UserPageQuery, dict} from '@fast-crud/fast-crud'; +import _ from 'lodash-es'; +import * as api from './api'; +import {inject} from "vue"; +import { request } from '/@/utils/service'; + + + +//此处为crudOptions配置 + export default function ({ crudExpose}: { crudExpose: CrudExpose}): CreateCrudOptionsRet { + const pageRequest = async (query: any) => { + return await api.GetList(query); + }; + const editRequest = async ({ form, row }: EditReq) => { + if (row.id) { + form.id = row.id; + } + return await api.UpdateObj(form); + }; + const delRequest = async ({ row }: DelReq) => { + return await api.DelObj(row.id); + }; + const addRequest = async ({ form }: AddReq) => { + return await api.AddObj(form); + }; + + const exportRequest = async (query: UserPageQuery) => { + return await api.exportData(query) + }; + + + + + + + return { + crudOptions: { + request: { + pageRequest, + addRequest, + editRequest, + delRequest, + }, + actionbar: { + buttons: { + export:{ + click(){ + return exportRequest(crudExpose.getSearchFormData()) + } + } + } + }, + form: { + col: { span: 24 }, + labelWidth: '100px', + wrapper: { + is: 'el-dialog', + width: '600px', + }, + + }, + columns: { + + + + title: { + title: '供应商类型', + type: 'input', + search: { show: true}, + column: { + minWidth: 120, + sortable: 'custom', + }, + form: { + rules: [{ required: true, message: '供应商类型名称必填' }], + component: { + placeholder: '请输入供应商类型', + }, + }, + }, + + + + + + }, + + }, + }; +}; diff --git a/web/src/views/it_mis/SuppliersTables/SuppliersTypeViewSet/index.vue b/web/src/views/it_mis/SuppliersTables/SuppliersTypeViewSet/index.vue new file mode 100644 index 0000000000000000000000000000000000000000..ca99f3f5e0b1f24ab5b40b2845a12aca83d17006 --- /dev/null +++ b/web/src/views/it_mis/SuppliersTables/SuppliersTypeViewSet/index.vue @@ -0,0 +1,53 @@ + + + + + diff --git a/web/src/views/it_mis/SuppliersTables/SuppliersViewSet/api.ts b/web/src/views/it_mis/SuppliersTables/SuppliersViewSet/api.ts new file mode 100644 index 0000000000000000000000000000000000000000..fa9c8c5dfd4577c2127ff85abe0e663436525c70 --- /dev/null +++ b/web/src/views/it_mis/SuppliersTables/SuppliersViewSet/api.ts @@ -0,0 +1,50 @@ +import { request,downloadFile } from '/@/utils/service'; +import { PageQuery, AddReq, DelReq, EditReq, InfoReq } from '@fast-crud/fast-crud'; + +export const apiPrefix = '/api/SuppliersViewSet/'; + +export function GetList(query: PageQuery) { + return request({ + url: apiPrefix, + method: 'get', + params: query, + }); +} +export function GetObj(id: InfoReq) { + return request({ + url: apiPrefix + id, + method: 'get', + }); +} + +export function AddObj(obj: AddReq) { + return request({ + url: apiPrefix, + method: 'post', + data: obj, + }); +} + +export function UpdateObj(obj: EditReq) { + return request({ + url: apiPrefix + obj.id + '/', + method: 'put', + data: obj, + }); +} + +export function DelObj(id: DelReq) { + return request({ + url: apiPrefix + id + '/', + method: 'delete', + data: { id }, + }); +} + +export function exportData(params:any){ + return downloadFile({ + url: apiPrefix + 'export_data/', + params: params, + method: 'get' + }) +} diff --git a/web/src/views/it_mis/SuppliersTables/SuppliersViewSet/crud.tsx b/web/src/views/it_mis/SuppliersTables/SuppliersViewSet/crud.tsx new file mode 100644 index 0000000000000000000000000000000000000000..75054771cee5e92f9ff5e40e598963ca3de35ea6 --- /dev/null +++ b/web/src/views/it_mis/SuppliersTables/SuppliersViewSet/crud.tsx @@ -0,0 +1,352 @@ +import { CrudOptions, AddReq, DelReq, EditReq, CrudExpose, UserPageQuery, dict, CreateCrudOptionsRet } from '@fast-crud/fast-crud'; +import _ from 'lodash-es'; +import * as api from './api'; +import {inject} from "vue"; +import { request } from '/@/utils/service'; + +// 注释编号:django-vue3-admin__crud265914:代码开始行 +// 功能说明:导入懒加载外键对应的crud进行复用 + +import it_area from "/@/views/PublicResource/area/crud"; +import SuppliersTypeViewSet from "/@/views/it_mis/SuppliersTables/SuppliersTypeViewSet/crud"; + +// 注释编号:django-vue3-admin__crud265914:代码结束行 + + + + +//此处为crudOptions配置 + export default function ({ crudExpose}: { crudExpose: CrudExpose}): CreateCrudOptionsRet { + const pageRequest = async (query: any) => { + return await api.GetList(query); + }; + const editRequest = async ({ form, row }: EditReq) => { + if (row.id) { + form.id = row.id; + } + return await api.UpdateObj(form); + }; + const delRequest = async ({ row }: DelReq) => { + return await api.DelObj(row.id); + }; + const addRequest = async ({ form }: AddReq) => { + return await api.AddObj(form); + }; + + const exportRequest = async (query: UserPageQuery) => { + return await api.exportData(query) + }; + + + + + + + return { + crudOptions: { + request: { + pageRequest, + addRequest, + editRequest, + delRequest, + }, + actionbar: { + buttons: { + export:{ + click(){ + return exportRequest(crudExpose.getSearchFormData()) + } + } + } + }, + // form: { + // // col: { span: 12 }, + // labelWidth: '100px', + // wrapper: { + // is: 'el-dialog', + // // width: '600px', + // }, + + // }, + columns: { + + + resource_area: { + title: '区域', + search: { + // disabled: true, + show: true, + }, + type: 'table-select', + dict: dict({ + isTree: true, + value: 'id', + label: 'title', + getNodesByValues: async (values: any[]) => { + if (!values.includes("")) { + return request({ + url: '/api/it_area/' + "getbyIds/", + method: "post", + data: { values } + }).then((ret: any) => { + return ret.data; + }); + } + }, + }), + column: { + minWidth: 150, //最小列宽 + }, + form: { + helper: { + render() { + return
区域是必需要填写的
; + } + }, + rules: [ + // 表单校验规则 + { + required: true, + message: '必填项', + }, + ], + component: { + rowKey: "id", //element-plus 必传 + createCrudOptions: it_area, + filterable: true, + placeholder: '请选择', + props: { + props: { + value: 'id', + label: 'title', + }, + }, + }, + }, + }, + suppliers_type: { + title: '供应商归属', + search: { + // disabled: true, + show: true, + }, + type: 'table-select', + dict: dict({ + isTree: true, + value: 'id', + label: 'title', + getNodesByValues: async (values: any[]) => { + if (!values.includes("")) { + return request({ + url: '/api/SuppliersTypeViewSet/' + "getbyIds/", + method: "post", + data: { values } + }).then((ret: any) => { + return ret.data; + }); + } + }, + }), + column: { + minWidth: 150, //最小列宽 + }, + form: { + rules: [ + // 表单校验规则 + { + required: true, + message: '必填项', + }, + ], + component: { + rowKey: "id", //element-plus 必传 + createCrudOptions: SuppliersTypeViewSet, + filterable: true, + placeholder: '请选择', + props: { + props: { + value: 'id', + label: 'title', + }, + }, + }, + }, + }, + SuppliersBelongToType: { + title: '供应商类型', + type: 'dict-select', + search: { + show: true, //可被搜索过滤 + }, + dict: dict({ + url: '/api/ItNetTypeViewSet/?limit=999', + value: 'id', + label: 'title', + getData: async ({ url }: { url: string }) => { + return request({ + url: url, + }).then((ret: any) => { + return ret.data; + }); + }, + }), + column: { + minWidth: 100, //最小列宽 + }, + form: { + helper: { + render() { + return
供应商类型是引用了网络资源表的资源类型表
; + } + }, + rules: [ + // 表单校验规则,这里配置必填项 + { + required: true, + message: '必填项', + }, + ], + component:{ + filterable: true, //配置在选择时,可过滤搜索 + }, + } + }, + title: { + title: '供应商描述', + type: 'input', + search: { show: true }, + column: { + minWidth: 120, + sortable: 'custom', + }, + form: { + rules: [{ required: true, message: '供应商描述必填' }], + component: { + placeholder: '请输入供应商描述', + }, + }, + }, + name: { + title: '联系人', + type: 'input', + search: { show: true }, + column: { + minWidth: 120, + sortable: 'custom', + }, + form: { + rules: [{ required: true, message: '联系人' }], + component: { + placeholder: '请输入联系人', + }, + }, + }, + fixed_phone: { + title: '固定电话', + type: 'input', + search: { show: true }, + column: { + minWidth: 120, + sortable: 'custom', + }, + form: { + rules: [{ pattern: /^[1-9]\d*$/, message: '此项必须为纯数字' }], + component: { + placeholder: '请输入固定电话', + }, + }, + }, + mobile_phone: { + title: '移动电话', + type: 'input', + search: { show: true }, + column: { + minWidth: 120, + sortable: 'custom', + }, + form: { + rules: [{ pattern: /^[1-9]\d*$/, message: '此项必须为纯数字' }], + component: { + placeholder: '请输入移动电话', + }, + }, + }, + email: { + title: '邮箱地址', + type: 'text', + search: { show: true }, + column: { + minWidth: 120, + sortable: 'custom', + }, + form: { + rules: [{ type: 'email', message: '必须输入邮箱地址格式' }], + component: { + placeholder: '请输入邮箱地址', + }, + }, + }, + addr: { + title: '供应商地址', + type: 'input', + search: { show: true }, + column: { + minWidth: 120, + sortable: 'custom', + }, + form: { + // rules: [{ message: '供应商地址' }], + component: { + placeholder: '请输入供应商地址', + }, + }, + }, + status: { + title: '服务状态', + search: { show: true }, + type: 'dict-radio', + dict: dict({ + data: [ + { + label: '是', + value: true, + color: 'success', + }, + { + label: '否', + value: false, + color: 'danger', + }, + ], + }), + form: { + rules: [{ required: true, message: '服务状态必填' }], + value: true, + }, + }, + + description: { + title: '备注说明', + type: ["textarea","colspan"], + search: {show: false}, + column: { + show: false + }, + form: { + component: { + rows:4, //配置一共默认占用1行的高度的 + // maxlength: 500, + placeholder: '输入备注', + }, + }, + }, + + + + }, + + }, + + } +}; + diff --git a/web/src/views/it_mis/SuppliersTables/SuppliersViewSet/index.vue b/web/src/views/it_mis/SuppliersTables/SuppliersViewSet/index.vue new file mode 100644 index 0000000000000000000000000000000000000000..8dccbe2a25a15d05ea2d39bbf1431eb1545728ed --- /dev/null +++ b/web/src/views/it_mis/SuppliersTables/SuppliersViewSet/index.vue @@ -0,0 +1,53 @@ + + + + + diff --git a/web/src/views/it_mis/TelephoneTables/MysqlViewSubTelephoneModelViewSet/api.ts b/web/src/views/it_mis/TelephoneTables/MysqlViewSubTelephoneModelViewSet/api.ts new file mode 100644 index 0000000000000000000000000000000000000000..ea8e3fbdee16030f177a9895bc8ca758cc2b460f --- /dev/null +++ b/web/src/views/it_mis/TelephoneTables/MysqlViewSubTelephoneModelViewSet/api.ts @@ -0,0 +1,50 @@ +import { request,downloadFile } from '/@/utils/service'; +import { PageQuery, AddReq, DelReq, EditReq, InfoReq } from '@fast-crud/fast-crud'; + +export const apiPrefix = '/api/MysqlViewSubTelephoneModelViewSet/'; + +export function GetList(query: PageQuery) { + return request({ + url: apiPrefix, + method: 'get', + params: query, + }); +} +export function GetObj(id: InfoReq) { + return request({ + url: apiPrefix + id, + method: 'get', + }); +} + +export function AddObj(obj: AddReq) { + return request({ + url: apiPrefix, + method: 'post', + data: obj, + }); +} + +export function UpdateObj(obj: EditReq) { + return request({ + url: apiPrefix + obj.id + '/', + method: 'put', + data: obj, + }); +} + +export function DelObj(id: DelReq) { + return request({ + url: apiPrefix + id + '/', + method: 'delete', + data: { id }, + }); +} + +export function exportData(params:any){ + return downloadFile({ + url: apiPrefix + 'export_data/', + params: params, + method: 'get' + }) +} diff --git a/web/src/views/it_mis/TelephoneTables/MysqlViewSubTelephoneModelViewSet/crud.tsx b/web/src/views/it_mis/TelephoneTables/MysqlViewSubTelephoneModelViewSet/crud.tsx new file mode 100644 index 0000000000000000000000000000000000000000..9a5aa29ca40397ccbba88206efdebca9f2b4a071 --- /dev/null +++ b/web/src/views/it_mis/TelephoneTables/MysqlViewSubTelephoneModelViewSet/crud.tsx @@ -0,0 +1,469 @@ +import { AddReq, DelReq, EditReq, dict, CrudExpose, UserPageQuery, CreateCrudOptionsRet} from '@fast-crud/fast-crud'; +import _ from 'lodash-es'; +import * as api from './api'; +import { request } from '/@/utils/service'; + + +import it_area from "/@/views/PublicResource/area/crud"; +import department from "/@/views/PublicResource/department/crud"; +import organization from "/@/views/PublicResource/organization/crud"; + + +//此处为crudOptions配置 +export default function ({ crudExpose}: { crudExpose: CrudExpose}): CreateCrudOptionsRet { + const pageRequest = async (query: any) => { + return await api.GetList(query); + }; + const editRequest = async ({ form, row }: EditReq) => { + if (row.id) { + form.id = row.id; + } + return await api.UpdateObj(form); + }; + const delRequest = async ({ row }: DelReq) => { + return await api.DelObj(row.id); + }; + const addRequest = async ({ form }: AddReq) => { + return await api.AddObj(form); + }; + + const exportRequest = async (query: UserPageQuery) => { + return await api.exportData(query) + }; + + + + return { + crudOptions: { + request: { + pageRequest, + addRequest, + editRequest, + delRequest, + }, + actionbar: { + buttons: { + add:{ + show:false + }, + export:{ + click(){ + return exportRequest(crudExpose.getSearchFormData()) + } + } + } + }, + rowHandle:{ + + buttons:{ + edit:{ + show:false + }, + copy:{ + show:false + }, + remove:{ + show:false + } + } + }, + columns: { + _index: { + title: '序号', + form: { show: false }, + column: { + type: 'index', + align: 'center', + width: '70px', + columnSetDisabled: true, //禁止在列设置中选择 + fixed:true, + }, + }, + id: { + title: 'ID', + type: 'number', + column: { show: false }, + search: { show: false }, + form: { show: false }, + }, + company: { + title: '公司', + search: { + // disabled: true, + show: true, + }, + type: 'dict-select', + dict: dict({ + // + url: '/api/company/?limit=999', + value: 'id', + label: 'title', + getData: async ({ url }: { url: string }) => { + return request({ + url: url, + }).then((ret: any) => { + return ret.data; + }); + }, + }), + column: { + // minWidth: 100, //最小列宽 + fixed:true, + }, + }, + area: { + title: '区域', + search: { + // disabled: true, + show: true, + }, + type: 'table-select', + dict: dict({ + // prototype: true, //这里配置每一次都要进行请求,这样可以解决mysql视图中关系显示的外键字段问题,但是配置这个之后,他同步也无法显示出来title + value: 'id', + label: 'title', + getNodesByValues: async (values: any[]) => { + if (!values.includes("")) { //element plus的一个bug,这里必须要对values的值进行判断非"" + return request({ + url: '/api/it_area/' + "getbyIds/", + method: "post", + data: { values } + }).then((ret: any) => { + return ret.data; + }); + } + }, + }), + column: { + minWidth: 100, //最小列宽 + fixed:true, + }, + form: { + show: false, + component: { + rowKey: "id", //element-plus 必传 + createCrudOptions: it_area, + }, + }, + }, + department: { + title: '部门', + search: { + // disabled: true, + show: true, + }, + type: 'table-select', + dict: dict({ + // prototype: true, //这里配置每一次都要进行请求,这样可以解决mysql视图中关系显示的外键字段问题,但是配置这个之后,他同步也无法显示出来title + // + value: 'id', + label: 'title', + getNodesByValues: async (values: any[]) => { + if (!values.includes("")) { //element plus的一个bug,这里必须要对values的值进行判断非"" + return request({ + url: '/api/department/' + "getbyIds/", + method: "post", + data: { values } + }).then((ret: any) => { + return ret.data; + }); + } + + } + }), + column: { + minWidth: 100, //最小列宽 + fixed:true, + }, + form: { + + show: false, + component: { + rowKey: "id", //element-plus 必传 + createCrudOptions: department, + }, + }, + }, + TelUser: { + title: '号码使用人', + search: { + order:0, //默认是1,所以0是排在最前面的 + show: true, + }, + type: 'table-select', + dict: dict({ + value: 'id', + label: 'use', + getNodesByValues: async (values: any[]) => { + if (!values.includes("")) { //element plus的一个bug,这里必须要对values的值进行判断非"" + return request({ + url: '/api/organization/' + "getbyIds/", + method: "post", + data: { values } + }).then((ret: any) => { + return ret.data; + }); + } + } + }), + column: { + minWidth: 150, //最小列宽 + fixed:true, + }, + form: { + component: { + rowKey: "id", //element-plus 必传 + createCrudOptions: organization, + filterable: true, + placeholder: '请选择', + props: { + props: { + value: 'id', + label: 'use', + }, + }, + }, + }, + }, + TelRealPerson: { + title: '号码实名认证人', + search: { + show: true, + }, + type: 'table-select', + dict: dict({ + value: 'id', + label: 'use', + getNodesByValues: async (values: any[]) => { + if (!values.includes("")) { //element plus的一个bug,这里必须要对values的值进行判断非"" + return request({ + url: '/api/organization/' + "getbyIds/", + method: "post", + data: { values } + }).then((ret: any) => { + return ret.data; + }); + } + } + }), + column: { + minWidth: 150, //最小列宽 + fixed:true, + }, + form: { + component: { + rowKey: "id", //element-plus 必传 + createCrudOptions: organization, + filterable: true, + placeholder: '请选择', + props: { + props: { + value: 'id', + label: 'use', + }, + }, + }, + }, + }, + realDepartment: { + title: '号码管理部门', + search: { + // disabled: true, + show: true, + }, + type: 'table-select', + dict: dict({ + // prototype: true, //这里配置每一次都要进行请求,这样可以解决mysql视图中关系显示的外键字段问题,但是配置这个之后,他同步也无法显示出来title + value: 'id', + label: 'title', + getNodesByValues: async (values: any[]) => { + if (!values.includes("")) { //element plus的一个bug,这里必须要对values的值进行判断非"" + return request({ + url: '/api/department/' + "getbyIds/", + method: "post", + data: { values } + }).then((ret: any) => { + return ret.data; + }); + } + + } + }), + column: { + minWidth: 100, //最小列宽 + fixed:true, + }, + form: { + + show: false, + component: { + rowKey: "id", //element-plus 必传 + createCrudOptions: department, + }, + }, + }, + parentId: { + title: '关联电话号码', + type: 'dict-select', + search: { + component: { + // placeholder: '请输入关联电话号码', + clearable: true, + filterable:true, + }, + show: true + }, + dict: dict({ + url: '/api/TelephoneModelViewSet/?limit=999', + value: 'id', + label: 'TelNumber', + getData: async ({ url }: { url: string }) => { + return request({ + url: url, + }).then((ret: any) => { + return ret.data; + }); + }, + }), + column: { + minWidth: 80, //最小列宽 + sortable: 'custom', + }, + + }, + sortIndex: { + title: '子表排序索引', + type: 'input', + // show: false, + column: { + // minWidth: 120, + sortable: 'custom', + }, + }, + accesstype: { + title: '接入类型', + type: 'dict-select', + search: { + component: { + // placeholder: '请输入关联电话号码', + clearable: true, + filterable:true, + }, + show: true + }, + dict: dict({ + url: '/api/lineAccessTypeModelViewSet/?limit=999', + value: 'id', + label: 'title', + getData: async ({ url }: { url: string }) => { + return request({ + url: url, + }).then((ret: any) => { + return ret.data; + }); + }, + }), + column: { + minWidth: 80, //最小列宽 + + }, + }, + accessInfo: { + title: '接入信息', + type: 'input', + search: { + component: { + // placeholder: '请输入关联电话号码', + clearable: true, + filterable:true, + }, + show: true + }, + column: { + // minWidth: 120, + sortable: 'custom', + }, + + }, + url: { + title: '接入类型之URL', + type: 'input', + // show: false, + column: { + // minWidth: 120, + sortable: 'custom', + }, + }, + label: { + title: '接入类型之Label', + type: 'input', + // show: false, + column: { + // minWidth: 120, + sortable: 'custom', + }, + }, + port_direction: { + title: '端口方向', + type: 'dict-select', + dict: dict({ + value: 'dictNum', + label: 'dictName', + getData: async () => { + const curId = await request({ + url: '/api/globalDictModelViewSet/?dictName=lineTagPortDirection', + }).then((ret: any) => { + return ret.data[0].id; + }); + return request({ + url: `/api/globalDictModelViewSet/?limit=999&dictMark=${curId}`, + }).then((ret: any) => { + return ret.data; + }); + }, + }), + form: { + component: { + span: 12, + }, + }, + component: { props: { color: 'auto' } }, // 自动染色 + }, + device_port: { + title: '端口', + type: 'dict-select', + dict: dict({ + url: '/api/DevicePortModelViewSet/?limit=999', + value: 'id', + label: 'title', + getData: async ({ url }: { url: string }) => { + return request({ + url: url, + }).then((ret: any) => { + return ret.data; + }); + }, + }), + column: { + minWidth: 80, //最小列宽 + sortable: 'custom', + }, + form:{ + // rules: [ + // // 表单校验规则 + // { + // required: true, + // message: '必填项', + // }, + // ], + component:{ + filterable: true, + }, + }, + }, + + }, + + }, + }; +} diff --git a/web/src/views/it_mis/TelephoneTables/MysqlViewSubTelephoneModelViewSet/index.vue b/web/src/views/it_mis/TelephoneTables/MysqlViewSubTelephoneModelViewSet/index.vue new file mode 100644 index 0000000000000000000000000000000000000000..00ba97590ef937bb93f40818661521c3aa00d292 --- /dev/null +++ b/web/src/views/it_mis/TelephoneTables/MysqlViewSubTelephoneModelViewSet/index.vue @@ -0,0 +1,54 @@ + + + + + diff --git a/web/src/views/it_mis/TelephoneTables/SubTelephoneModelViewSetSub/api.ts b/web/src/views/it_mis/TelephoneTables/SubTelephoneModelViewSetSub/api.ts new file mode 100644 index 0000000000000000000000000000000000000000..583bc8517f5884efdeed0821769e932af508edcd --- /dev/null +++ b/web/src/views/it_mis/TelephoneTables/SubTelephoneModelViewSetSub/api.ts @@ -0,0 +1,66 @@ +import { id } from 'element-plus/es/locale'; +import { request,downloadFile } from '/@/utils/service'; +import { PageQuery, AddReq, DelReq, EditReq, InfoReq } from '@fast-crud/fast-crud'; + +export const apiPrefix = '/api/SubTelephoneModelViewSet/'; + + +export function GetList(query: PageQuery) { + return request({ + url: apiPrefix, + method: 'get', + params: query, + }) +} + + + +export function GetObj(id: InfoReq) { + return request({ + url: apiPrefix + id, + method: 'get', + }); +} + +export function AddObj(obj: AddReq) { + return request({ + url: apiPrefix, + method: 'post', + data: obj, + }); +} + +export function UpdateObj(obj: EditReq) { + return request({ + url: apiPrefix + obj.id + '/', + method: 'put', + data: obj, + }); +} + +// 重新写一条数据要匹配上移及下移时提交数据 +export function RowUpdateObj(obj: EditReq) { + return request({ + url: apiPrefix + obj.id + '/', + method: 'put', + data: obj, + }); +} + + + +export function DelObj(id: DelReq) { + return request({ + url: apiPrefix + id + '/', + method: 'delete', + data: { id }, + }); +} + +export function exportData(params:any){ + return downloadFile({ + url: apiPrefix + 'export_data/', + params: params, + method: 'get' + }) +} diff --git a/web/src/views/it_mis/TelephoneTables/SubTelephoneModelViewSetSub/crud.tsx b/web/src/views/it_mis/TelephoneTables/SubTelephoneModelViewSetSub/crud.tsx new file mode 100644 index 0000000000000000000000000000000000000000..4bdc75c3b6884f062df63ae06267967a1868a509 --- /dev/null +++ b/web/src/views/it_mis/TelephoneTables/SubTelephoneModelViewSetSub/crud.tsx @@ -0,0 +1,606 @@ +import { + AddReq, + CreateCrudOptionsProps, + CreateCrudOptionsRet, + DelReq, + dict, + EditReq, + ScopeContext, + EditableRow, + } from "@fast-crud/fast-crud"; + +import * as api from "./api"; +import { request } from '/@/utils/service'; +import _ from "lodash-es"; +import { ref } from "vue"; + + + + export default function ({ crudExpose, context }: CreateCrudOptionsProps): CreateCrudOptionsRet { + const { crudBinding } = crudExpose; + const { parentIdRef } = context; + + // 拿到showStatus的值,并对于!showStatus.value.disabled的值这里如果点查看进来的就会拿到false,如果编辑进来的就会true + const { showStatus } = context; + + const pageRequest = async (query: any) => { + return await api.GetList(query); + }; + + const editRequest = async ({ form, row }: EditReq) => { + if (form.id == null) { + form.id = row.id; + } + return await api.UpdateObj(form); + }; + + // 重新写一条数据要匹配上移及下移时提交数据 + const rowEditRequest = async ({ row }: EditReq) => { + + return await api.RowUpdateObj(row); + }; + + + const delRequest = async ({ row }: DelReq) => { + return await api.DelObj(row.id); + }; + + const addRequest = async ({ form }: AddReq) => { + + // 这里要进行修改,需要返回ID对行,不然第二次点击新增时,会引发两条数据同时进行编辑 + const result = await api.AddObj(form); + return { id: result.data.id }; + }; + + + // 这是是配置一个变量去拿到编辑时,传过来的当前行数据 + let curRowData = {} + + + // 配合table单选存储的当前行数据 + const curChangeRow = ref() + + // 这是单选选中触发的方法 + const onCurrentChange = (row:any) =>{ + curChangeRow.value = row + + } + + // 注释编号:django-vue3-admin-crud395810:代码开始行 + // 功能说明:配置一个动态获取的URL及label + const dynamic_url = ref() + + //动态获取label + const dynamic_label = ref() + + // 注释编号:django-vue3-admin-crud395810:代码结束行 + + + + + + return { + crudOptions: { + request: { + pageRequest, + addRequest, + editRequest, + rowEditRequest, + delRequest + }, + actionbar: { + buttons: { + add: { + show: false + }, + addRow: { + show: true + }, + copyRow: { + //自定义复制一条线行数据 + text:"复制",//按钮文字 + type:"warning", //修改为绿色 + show:!showStatus.value.disabled, // 按查看与编辑的情况下显示或隐藏当前按钮 + async click(){ + try{ + if(curChangeRow.value){ + let copyRowData = JSON.parse(JSON.stringify(curChangeRow.value)); // 深拷贝对象 + + //如下是为要排除的字段 + const excludeFields = ['id', 'sortIndex', 'create_datetime', 'update_datetime', 'dept_belong_id', 'modifier', 'creator', '$editable_id', 'modifier_name', 'creator_name']; + for(let field of excludeFields) { + delete copyRowData[field]; + } + + //调用新增方法,并且把调整好的copyRowData传进去,如下我们就一定要配置 crudBinding.value?.table?.editable?.addRow方法 + crudBinding.value?.table?.editable?.addRow(crudBinding.value.data, copyRowData) + + + //当copy一条新数据的时候,必须要对dynamic_url及dynamic_label进行更新,否则会报错 + dynamic_url.value = copyRowData.url + dynamic_label.value = copyRowData.label + + } + + }catch (error) { + console.error('Error editing row:', error); + } + + }, + + }, + + // 功能说明:上下移动行数据的实现 + sortUp:{ + text:"上移",//按钮文字 + // title:"数据必须先单击选中之后再单击上移",//鼠标停留显示的信息 + type:"success", //修改为绿色 + show:!showStatus.value.disabled, // 按查看与编辑的情况下显示或隐藏当前按钮 + async click(){ + try { + // 选移动对象时,先去拿到当前table单选之选中的对象(选中的行数据) + let row = curChangeRow.value + + if (row.sortIndex != 1){ //这里要进行判断如果是选中了第一条的话,那就不再执行上移的操作,防止出错 + + // 在所有crudBinding.value.data数据当中找到上一个row.sortIndex - 1的对象,并且去除[].shift()返回一个字典对象 + let anotherRow = crudBinding.value.data?.filter(item => item.sortIndex === row.sortIndex - 1).shift(); //拿到当前单选选中数据的上一条数据 + + anotherRow.sortIndex = anotherRow.sortIndex + 1 //上一条数据减1排序 + row.sortIndex = row.sortIndex - 1 //当前选中的这一条数据+1排序 + + + // 这里自己重新做一条row提交的请求,不要直接使用crudExpose.editable.doSaveRow({row}) ,这样页面就不会存在闪一下的情况 + await rowEditRequest({row}) + await rowEditRequest({row:anotherRow}) + + crudExpose.doRefresh(); //最后刷新页面 + } + }catch (error) { + console.error('Error editing row:', error); + } + + }, + + }, + sortDown:{ + text:"下移",//按钮文字 + // title:"数据必须先单击选中之后再单击下移",//鼠标停留显示的信息 + type:"success", //修改为绿色 + show:!showStatus.value.disabled, // 按查看与编辑的情况下显示或隐藏当前按钮 + async click(){ + + try { + const row = curChangeRow.value + const anotherRow = crudBinding.value.data?.filter(item => item.sortIndex === row.sortIndex + 1).shift(); + if (anotherRow){ //判断他是否还有下一条数据,如果没有了,说明当前这一条数据是最后一条,那就不需要再下移了 + + row.sortIndex = row.sortIndex + 1 + anotherRow.sortIndex = anotherRow.sortIndex - 1 + + //先取消所有行的编辑状态 + crudExpose.editable.cancel() + + // 这里自己重新做一条row提交的请求,不要直接使用crudExpose.editable.doSaveRow({row}) ,这样页面就不会存在闪一下的情况 + + await rowEditRequest({row}) + await rowEditRequest({row:anotherRow}) + + crudExpose.doRefresh(); //最后刷新页面 + } + + }catch (error) { + + console.error('Error editing row:', error); + + } + + }, + }, + // 注释编号:django-vue3-admin-crud541816:代码结束行 + } + }, + search: { + show: false, + initialForm: { + parentId: parentIdRef + } + }, + toolbar: { + show: false, + buttons: { + refresh: { + show: false, + } + } + }, + table: { + // 功能说明:启用table的单选功能及触发的事件 + highlightCurrentRow:true, //启用单选方法,与onCurrentChange单选事件做配套 + onCurrentChange,//启用单独事件,与highlightCurrentRow单选方法做配套 + editable: { + // rowKey:'id', + // rowKey:'_index', + enabled: true, + mode: "row", + activeDefault: false, + + //排它式激活,限制当前子表行编辑只能同时激活一行 + exclusive: true, + exclusiveEffect: "save", // "cancel" | "save"; + + + addRow: (data: any[], row: any)=>{ + // 注释编号:django-vue3-admin-crud232516:代码开始行 + // 功能说明:如果数据里面上一个对象的$editable_id值为负数,那说明前面已经点击了一次新增,就什么都不要操作,不允许点击两次新增 + + let pre_obj_editableId = null + + + if (data.length > 0) { //在这种情况下,就说明原来已经有对象存在,那么便可以放心的执行这里面的逻辑了 + pre_obj_editableId = data[data.length - 1].id; + }else{ + pre_obj_editableId = 1 //直接给一个1做为标识值,引导新增按钮一条新数据 + } + + if ( pre_obj_editableId) { + //在最后一行插入数据 + data.push(row) + } + + // 注释编号:django-vue3-admin-crud232516:代码结束行 + + }, + } + }, + rowHandle: { + + width:200, // 这里要重新定义一个宽度,因为全局定制了170,这里不够使用 + + //这个地方才是配置了子表中编辑、取消、保存等按钮的地方 + group: { + "editRow": { //行编辑模式 + // 功能说明:这里对edit按钮进行了定制事件,核心代码是直接使用fastcurd的 + "edit": { //进入编辑 + click: (context: ScopeContext) => { + //如下代码是由fastcrut作者写的,拿到了当前行的标识 + const { index, row } = context; + const editableId = row[crudBinding.value.table?.editable?.rowKey]; + + if (crudBinding.value.table?.editable?.exclusive) { + //排他式激活 + const activeRows: EditableRow[] = crudExpose.editable.getActiveRows(); + _.forEach(activeRows, (item: EditableRow) => { + if (crudBinding.value.table?.editable?.exclusiveEffect === "save") { + crudExpose.editable.doSaveRow({ row: item.rowData }); + } else { + crudExpose.editable.doCancelRow({ row: item.rowData }); + } + + }); + } + + crudExpose.editable.getEditableRow(editableId)?.active(); + + + // 这里是拿到了当前点击编辑的行数据,并且赋值给curRowData + curRowData = context.row + + // 注释编号:django-vue3-admin-crud155310:代码开始行 + // 功能说明:对动态的URL及label进行判断及赋值,这里主要是给accessInfo字段使用的 + if(context.row.url&&context.row.label){ + dynamic_url.value = context.row.url + dynamic_label.value = context.row.label + } + + // 注释编号:django-vue3-admin-crud155310:代码结束行 + + }, + }, + + save: { + click: async (context: ScopeContext) => { + const { row } = context; + if(!row.sortIndex){ + const dictLength = Object.keys(crudBinding.value.data).length; //查询当前整个table有多少条数据,包括点击保存的当前对象 + row.sortIndex = dictLength //长度是0开始算的 + } + // } + await crudExpose.editable.doSaveRow({ row }); //行数据做保存 + }, + + + }, + }, + } + + }, + pagination: { show: false, pageSize: 999}, + columns: { + + // 功能说明:配置出来fastcrud自带的index索引字段 + _index: { //把table表索引给显示出来 + title: "线序", + form: { show: false }, + column: { + align: "center", + columnSetDisabled: true, //禁止在列设置中选择 + } + }, + sortIndex:{ + title: "排序", + form: { show: false }, + column: { + show:false, //要把这个专门拿来排序的字段进行隐藏显示 + align: "center", + columnSetDisabled: true, //禁止在列设置中选择 + + }, + + }, + + // 功能说明:联动选择中主动的select项目,它自己的选择项目会引发被动字典的dict根据新的需求请求重新请求 + accesstype: { + title: '接入类型', + type: 'dict-select', + dict: dict({ + url: '/api/lineAccessTypeModelViewSet/?limit=999', + value: 'id', + label: 'title', + getData: async ({ url }: { url: string }) => { + return request({ + url: url, + }).then((ret: any) => { + return ret.data; + }); + }, + }), + column: { + rules: [{required: true, message: "线路接入类型为必选项"},], + minWidth: 80, //最小列宽 + }, + + form:{ + // rules: [{required: true, message: "电话接入类型为必选项"},], + component:{ + filterable: true, + // 注释编号:django-vue3-admin-crud565610:代码开始行 + // 功能说明:配置选择后触发事件,进行拼接URL及label + // onSelectedChange(selectedObj:any){ + // if(selectedObj.url&&selectedObj.label){ + // dynamic_url.value = selectedObj.url + // dynamic_label.value = selectedObj.label + // } + // }, + + // 注释编号:django-vue3-admin-crud565610:代码结束行 + + + // 注释编号:django-vue3-admin-crud513014:代码开始行 + // 功能说明:参考fastcrud官方中component.on.onXxx对原始事件监听http://fast-crud.docmirror.cn/api/common-options.html#component-on-onxxx + on:{ + onSelectedChange({$event, row}:{$event:any, row:any}){ + //如果$event.url&&$event.label有值,则一定要把URl及Label进行赋值,否则会报错 + if ($event.url&&$event.label){ + row.url = $event.url + row.label = $event.label + dynamic_url.value = $event.url + dynamic_label.value = $event.label + }else{ + //如果$event.url&&$event.label无值,即是不成立,那也要把dynamic_url.value dynamic_label.value清空 + dynamic_url.value = $event.url + dynamic_label.value = $event.label + } + } + + }, + // 注释编号:django-vue3-admin-crud513014:代码结束行 + + + }, + }, + }, + + // 功能说明:联动选择中被动的字典,他的dict是由主的select引发传过来的url及label之后再展现数据的 + + accessInfo: { + title: "接入信息", + type: "autocomplete", + search: { + show: true + }, + form: { + component: { + filterable: true, //可清空 + debounce:500, //获取输入建议的防抖延时,单位为毫秒,默认300 + props: { + placeholder: '请输入接入信息', + // queryString就是你输入框的值,即是需要搜索的值,而cb就回调函数 + // 注释编号:django-vue3-admin-crud190011:代码开始行 + // 功能说明:这里就是配置autocomplete触发的URL请求数据及过滤 + fetchSuggestions:async(queryString: string, cb: any) => { + + + // 注释编号:django-vue3-admin-crud163015:代码开始行 + // 功能说明:需要做个判断是否是点复制进来的,而且editDynamic_url.value是否有值 + const url = `${dynamic_url.value}/?limit=999` + // if(editDynamic_url.value){ + // url = `${editDynamic_url.value}/?limit=999` + // console.log("1111111111110000000000", url, queryString) + // }else{ + // console.log("111111111111222222222", url, queryString) + // url = `${dynamic_url.value}/?limit=999` + // } + // 注释编号:django-vue3-admin-crud163015:代码结束行 + // console.log("111111111111", url, queryString) + + //这里一定要提前判断一下是否有URL及label传进来才行,有传进来,才进行相应的请求数据及过滤操作,如果没有传进不,即是当前的autocomplete便是一个普通的input而以 + if (dynamic_url.value&&dynamic_label.value){ + + const response = await request({ + url: url, + }).then((ret: any) => { + return ret.data; + }); + + // 根据实际返回数据格式处理(列表) + let fileLists: Array = response.map((val: any) => ({ + value: val[dynamic_label.value], //autocomplete默认的是显示及提交value的值,而不是lable,所以这里要设置为反过来 + label: val.id, + })); + + const createFilter = (queryString: string) => { + + /** + * (item: any) 表示函数接受一个名为 item 的参数,类型声明为 any,意味着它可以接受任何类型的参数。在实际应用中,你应该尽量明确参数类型,但这里为了通用性使用了 any 类型。 + * item.value.toLowerCase() 将 item 对象的 value 属性转换为小写字符串。 + * queryString.toLowerCase() 同样将外部传入的 queryString 变量转换为小写字符串。。 + * .includes(queryString.toLowerCase()) 在 item.value 转换为小写后的字符串中查找 queryString 转换为小写后的字符串,只要包含在里面就会返回数据 + */ + + // `${item.value}`是把他先转为字符串,这样才统一queryString及item.value的格式都为字符串string + return (item: any) => `${item.value}`.toLowerCase().includes(queryString.toLowerCase()); + + + }; + + //这里使用三元运算,这里先判断queryString && queryString !=="null",如果为真,则调用前面的fileLists.filter(createFilter(queryString)),否则直接给fileLists + const results = queryString && queryString !=="null" ? fileLists.filter(createFilter(queryString)) : fileLists; + + cb(results); // 将筛选结果传递给回调函数 + }else{ + // 如果没有传进来dynamic_url.value&&dynamic_label.value,则返回空数组,即是不需要搜索 + let fileLists: Array = [] + return fileLists + + } + + + }, + // 注释编号:django-vue3-admin-crud190011:代码结束行 + + }, + + + }, + column: { + rules: [{required: true, message: "接入信息必选项"},], + }, + + + }, + }, + + + port_direction: { + title: '端口方向', + type: 'dict-select', + + dict: dict({ + value: 'dictNum', + label: 'dictName', + getData: async ({ url }: { url: string }) => { + const curId = await request({ + url: '/api/globalDictModelViewSet/?dictName=lineTagPortDirection', + }).then((ret: any) => { + return ret.data[0].id; + }); + return request({ + url: `/api/globalDictModelViewSet/?limit=999&dictMark=${curId}`, + }).then((ret: any) => { + return ret.data; + }); + }, + }), + + form: { + component: { + span: 12, + + }, + }, + column: { + minWidth: 60, //最小列宽 + valueChange({row}){ // 这里使用valueChange,取消select选择之后,拿到了""空值传给后端,会导致出错,这里做了判断,重置为null就不会出错了 + if(row.port_direction == ""){ + row.port_direction = null + } + + }, + + }, + component: { props: { color: 'auto' } }, // 自动染色 + }, + device_port: { + title: '端口', + type: 'dict-select', + dict: dict({ + url: '/api/DevicePortModelViewSet/?limit=999', + value: 'id', + label: 'title', + getData: async ({ url }: { url: string }) => { + return request({ + url: url, + }).then((ret: any) => { + return ret.data; + }); + }, + }), + column: { + minWidth: 60, //最小列宽 + }, + form:{ + // rules: [ + // // 表单校验规则 + // { + // required: true, + // message: '必填项', + // }, + // ], + component:{ + filterable: true, + }, + }, + }, + description: { + title: "备注说明", + type: "input", + column: { + show: true, + }, + }, + url: { + title: '设备归属之URL', + type: 'input', + column: { + show: false, + }, + + }, + label: { + title: '设备归属之label', + type: 'input', + column: { + show: false, + }, + + }, + parentId: { + title: "父Id", + type: "number", + form: { + value: parentIdRef, + component: { + disabled: true, + } + }, + //在页面隐藏起来,不让用户看到父Id字段 + column: { + show: false, + } + }, + } + } + }; + } + diff --git a/web/src/views/it_mis/TelephoneTables/SubTelephoneModelViewSetSub/index.vue b/web/src/views/it_mis/TelephoneTables/SubTelephoneModelViewSetSub/index.vue new file mode 100644 index 0000000000000000000000000000000000000000..ae469787aff9606bd25343b23232d4e4b608ac91 --- /dev/null +++ b/web/src/views/it_mis/TelephoneTables/SubTelephoneModelViewSetSub/index.vue @@ -0,0 +1,124 @@ + + + + + + + \ No newline at end of file diff --git a/web/src/views/it_mis/TelephoneTables/TelAccessTypeModelViewSet/api.ts b/web/src/views/it_mis/TelephoneTables/TelAccessTypeModelViewSet/api.ts new file mode 100644 index 0000000000000000000000000000000000000000..b7ad7872594d755e3fe5e416ed53ad00b9c86238 --- /dev/null +++ b/web/src/views/it_mis/TelephoneTables/TelAccessTypeModelViewSet/api.ts @@ -0,0 +1,50 @@ +import { request,downloadFile } from '/@/utils/service'; +import { PageQuery, AddReq, DelReq, EditReq, InfoReq } from '@fast-crud/fast-crud'; + +export const apiPrefix = '/api/TelAccessTypeModelViewSet/'; + +export function GetList(query: PageQuery) { + return request({ + url: apiPrefix, + method: 'get', + params: query, + }); +} +export function GetObj(id: InfoReq) { + return request({ + url: apiPrefix + id, + method: 'get', + }); +} + +export function AddObj(obj: AddReq) { + return request({ + url: apiPrefix, + method: 'post', + data: obj, + }); +} + +export function UpdateObj(obj: EditReq) { + return request({ + url: apiPrefix + obj.id + '/', + method: 'put', + data: obj, + }); +} + +export function DelObj(id: DelReq) { + return request({ + url: apiPrefix + id + '/', + method: 'delete', + data: { id }, + }); +} + +export function exportData(params:any){ + return downloadFile({ + url: apiPrefix + 'export_data/', + params: params, + method: 'get' + }) +} diff --git a/web/src/views/it_mis/TelephoneTables/TelAccessTypeModelViewSet/crud.tsx b/web/src/views/it_mis/TelephoneTables/TelAccessTypeModelViewSet/crud.tsx new file mode 100644 index 0000000000000000000000000000000000000000..0cead05a7bea6cc453e4c38c837bcb78824fba9f --- /dev/null +++ b/web/src/views/it_mis/TelephoneTables/TelAccessTypeModelViewSet/crud.tsx @@ -0,0 +1,132 @@ +import { CrudOptions, AddReq, DelReq, EditReq, dict, CrudExpose, compute, UserPageQuery, CreateCrudOptionsRet} from '@fast-crud/fast-crud'; +import _ from 'lodash-es'; +import * as api from './api'; +import { request } from '/@/utils/service'; +import { dictionary } from '/@/utils/dictionary'; + + +//此处为crudOptions配置 +export default function ({ crudExpose}: { crudExpose: CrudExpose}): CreateCrudOptionsRet { + const pageRequest = async (query: any) => { + return await api.GetList(query); + }; + const editRequest = async ({ form, row }: EditReq) => { + if (row.id) { + form.id = row.id; + } + return await api.UpdateObj(form); + }; + const delRequest = async ({ row }: DelReq) => { + return await api.DelObj(row.id); + }; + const addRequest = async ({ form }: AddReq) => { + return await api.AddObj(form); + }; + + const exportRequest = async (query: UserPageQuery) => { + return await api.exportData(query) + }; + + + + return { + crudOptions: { + request: { + pageRequest, + addRequest, + editRequest, + delRequest, + }, + actionbar: { + buttons: { + export:{ + click(){ + return exportRequest(crudExpose.getSearchFormData()) + } + } + } + }, + form: { + col: { span: 24 }, + // labelWidth: '100px', + wrapper: { + is: 'el-dialog', + // width: '600px', + }, + + }, + columns: { + + title: { + title: '电话接入类型', + type: 'input', + search: { show: true}, + column: { + // minWidth: 120, + sortable: 'custom', + }, + form: { + rules: [{ required: true, message: '电话接入类型必填' }], + component: { + placeholder: '请输入电话接入类型', + }, + + bottomRender({ value }) { + return 电话接入类型是指电话接入时是使用什么类型的,当前类型必须唯一; + }, + }, + }, + Tel_access_url: { + title: '电话类型请求的URL', + type: 'input', + search: { show: true}, + column: { + // minWidth: 120, + sortable: 'custom', + }, + form: { + rules: [{ required: true, message: '电话类型请求的URL必填' }], + component: { + placeholder: '请输入电话类型请求的URL', + }, + bottomRender({ value }) { + return 重要必填:要查找对应的电话接入类型,并将后端API请求地址填写在此处; + }, + }, + }, + label: { + title: '相应URL请求回来之后对应在label', + type: 'input', + search: { show: true}, + column: { + // minWidth: 120, + sortable: 'custom', + }, + form: { + rules: [{ required: true, message: '相应URL请求回来之后对应在label必填' }], + component: { + placeholder: '请输入相应URL请求回来之后对应在label', + }, + bottomRender({ value }) { + return 重要必填:这个label最终会被前端电话接入类型与电话转接情况的联动选择所引用; + }, + }, + }, + + description: { + title: '备注', + type: 'textarea', + search: {show: false}, + form: { + component: { + maxlength: 200, + placeholder: '输入备注', + }, + }, + }, + + }, + + }, + }; +}; diff --git a/web/src/views/it_mis/TelephoneTables/TelAccessTypeModelViewSet/index.vue b/web/src/views/it_mis/TelephoneTables/TelAccessTypeModelViewSet/index.vue new file mode 100644 index 0000000000000000000000000000000000000000..aa2fbda457ba98e36458abc4ea8ba3cce058a8e0 --- /dev/null +++ b/web/src/views/it_mis/TelephoneTables/TelAccessTypeModelViewSet/index.vue @@ -0,0 +1,55 @@ + + + + + diff --git a/web/src/views/it_mis/TelephoneTables/TelephoneModelViewSet/api.ts b/web/src/views/it_mis/TelephoneTables/TelephoneModelViewSet/api.ts new file mode 100644 index 0000000000000000000000000000000000000000..4af30d7b434e86c34e02878a3e4c3fda5d20d8b0 --- /dev/null +++ b/web/src/views/it_mis/TelephoneTables/TelephoneModelViewSet/api.ts @@ -0,0 +1,50 @@ +import { request,downloadFile } from '/@/utils/service'; +import { PageQuery, AddReq, DelReq, EditReq, InfoReq } from '@fast-crud/fast-crud'; + +export const apiPrefix = '/api/TelephoneModelViewSet/'; + +export function GetList(query: PageQuery) { + return request({ + url: apiPrefix, + method: 'get', + params: query, + }); +} +export function GetObj(id: InfoReq) { + return request({ + url: apiPrefix + id, + method: 'get', + }); +} + +export function AddObj(obj: AddReq) { + return request({ + url: apiPrefix, + method: 'post', + data: obj, + }); +} + +export function UpdateObj(obj: EditReq) { + return request({ + url: apiPrefix + obj.id + '/', + method: 'put', + data: obj, + }); +} + +export function DelObj(id: DelReq) { + return request({ + url: apiPrefix + id + '/', + method: 'delete', + data: { id }, + }); +} + +export function exportData(params:any){ + return downloadFile({ + url: apiPrefix + 'export_data/', + params: params, + method: 'get' + }) +} diff --git a/web/src/views/it_mis/TelephoneTables/TelephoneModelViewSet/crud.tsx b/web/src/views/it_mis/TelephoneTables/TelephoneModelViewSet/crud.tsx new file mode 100644 index 0000000000000000000000000000000000000000..b831c0d9bdc54597c4f072fa1b2d4d29709d438a --- /dev/null +++ b/web/src/views/it_mis/TelephoneTables/TelephoneModelViewSet/crud.tsx @@ -0,0 +1,814 @@ +/* eslint-disable no-mixed-spaces-and-tabs */ +import { CrudOptions, AddReq, DelReq, EditReq, dict, compute, UserPageQuery, CreateCrudOptionsProps, CreateCrudOptionsRet} from '@fast-crud/fast-crud'; +import _ from 'lodash-es'; +import * as api from './api'; +import { request } from '/@/utils/service'; +import { dictionary } from '/@/utils/dictionary'; +import { useRouter } from "vue-router"; + + +// import it_area from "/@/views/PublicResource/area/crud"; +// import department from "/@/views/PublicResource/department/crud"; +import organization from "/@/views/PublicResource/organization/crud"; + + + +import subTableComponent from "/@/views/it_mis/TelephoneTables/SubTelephoneModelViewSetSub/index.vue"; + + +//此处为crudOptions配置 +export default function (object: CreateCrudOptionsProps): CreateCrudOptionsRet { + + + const { crudBinding, crudRef } = object.crudExpose; + const { crudExpose } = object; + + const pageRequest = async (query: any) => { + return await api.GetList(query); + }; + const editRequest = async ({ form, row }: EditReq) => { + if (row.id) { //这里一定要判断row.id是否存在,存在才能form.id = row.id,要不会出现问题的 + form.id = row.id; + } + return await api.UpdateObj(form); + }; + const delRequest = async ({ row }: DelReq) => { + return await api.DelObj(row.id); + }; + const addRequest = async ({ form }: AddReq) => { + return await api.AddObj(form); + }; + + const exportRequest = async (query: UserPageQuery) => { + return await api.exportData(query) + }; + + //路由初始化 + const router = useRouter(); + + + + + return { + crudOptions: { + request: { + pageRequest, + addRequest, + editRequest, + delRequest, + }, + // 这个search是配置多行搜索配置的 + search: { + container: { + layout: "multi-line" + }, + col: { + span: 4 //一行是24,而这里配置每一个对象占用4,就说明每一行有6个对象 + }, + // options: { + // labelWidth: "50px" + // } + }, + actionbar: { + buttons: { + export:{ + click(){ + return exportRequest(crudExpose.getSearchFormData()) + } + } + } + }, + form: { + + // 功能说明:这里设置form的宽度及一行几条数据 + col: { span: 12 }, + // labelWidth: '100px', + wrapper: { + is: 'el-dialog', + width: '1200px', //弹窗宽度 + }, + + group: { + groups: { + base: { //分组key,可随意命名,不重复便可 + // 注释编号:django-vue3-admin__crud532710:这里把label写在slots里面,以scope.hasError来判断是否有引发错误,比如必填项没有写 + slots: { + label: (scope) => { + return ( + + 基本信息 + + ); + } + }, + + //对应隐藏在tabs里面的字段 + columns: [ "company", + "area", + "department", + "TelUser", + "TelRealPerson", + "realDepartment", + "TelAreaNum", + "TelephoneType", + "TelNumber", + "Telstatus", + "SuppliersItNetType", + "Suppliers", + "data", + ] + }, + + // 功能说明:将子表配置进单独的tags标签里面,这里视自己的项目页面情况而定的,非必须配置事项 + base1: { + label: "转接配置", + columns: [ "subTable", + ] + }, + + base2: { + label: "转接需求", + columns: [ "transfer_address", "transfer_dial_num", "transfer_account", "transfer_password", "transfer_description" + ] + }, + + base99: { + label: "其它说明", + columns: [ "description", + ] + }, + + + }, + }, + + + }, + + columns: { + _index: { + title: '序号', + form: { show: false }, + column: { + type: 'index', + align: 'center', + width: '70px', + columnSetDisabled: true, //禁止在列设置中选择 + fixed:true, + }, + }, + id: { + title: 'ID', + type: 'number', + column: { show: false }, + search: { show: false }, + form: { show: false }, + }, + company: { + title: '归属公司', + search: { + show: true, + }, + type: 'dict-select', + dict: dict({ + url: '/api/company/?limit=999', + value: 'id', + label: 'title', + getData: async ({ url }: { url: string }) => { + return request({ + url: url, + }).then((ret: any) => { + return ret.data; + }); + }, + }), + column: { + minWidth: 150, //最小列宽 + fixed:true, + }, + form: { + rules: [ + // 表单校验规则,这里配置必填项 + { + required: true, + message: '必填项', + }, + ], + component:{ + filterable: true, //配置在选择时,可过滤搜索 + }, + }, + }, + area: { + title: '归属区域', + search: { + show: true, + }, + type: 'dict-select', + dict: dict({ + url: '/api/it_area/?limit=999', + value: 'id', + label: 'title', + getData: async ({ url }: { url: string }) => { + return request({ + url: url, + }).then((ret: any) => { + return ret.data; + }); + }, + }), + column: { + minWidth: 100, //最小列宽 + fixed:true, + }, + form: { + rules: [ + // 表单校验规则,这里配置必填项 + { + required: true, + message: '必填项', + }, + ], + component:{ + filterable: true, //配置在选择时,可过滤搜索 + }, + // 注释编号:django-vue3-admin-crud135415:代码开始行 + // 功能说明:利用区域对区号进行自动填写 + async valueChange ({form,value,getComponentRef}){ + form.TelAreaNum= undefined; //把区号先置空 + if (value){ + const data = getComponentRef("area").dict._data + //根据当前选中的id值去字典data里面拿到对应的AreaNum + form.TelAreaNum = data.find(obj => obj.id === value)?.AreaNum + } + }, + // 注释编号:django-vue3-admin-crud135415:代码结束行 + + }, + }, + department: { + title: '使用部门', + search: { + show: true, + }, + type: 'dict-select', + dict: dict({ + url: '/api/department/?limit=999', + value: 'id', + label: 'title', + getData: async ({ url }: { url: string }) => { + return request({ + url: url, + }).then((ret: any) => { + return ret.data; + }); + }, + }), + column: { + minWidth: 100, //最小列宽 + fixed:true, + }, + form: { + rules: [ + // 表单校验规则,这里配置必填项 + { + required: true, + message: '必填项', + }, + ], + component:{ + filterable: true, //配置在选择时,可过滤搜索 + }, + }, + }, + TelUser: { + title: '使用人', + + // search: { + // component: { + // name: "el-input",// 把搜索框从dict-select类型变成el-input类型,注意这里的name对应的是Ui的组件名称 + // placeholder: '信息归属、用户名、资产编码查询', + // clearable: true, + // }, + // order:0, //默认是1,所以0是排在最前面的 + // show: true, + // col:{span:8}, + + // }, + search:{show:true}, + + type: 'table-select', + dict: dict({ + + value: 'id', + label: 'use', + getNodesByValues: async (values: any[]) => { + if (!values.includes("")) { //element plus的一个bug,这里必须要对values的值进行判断非"" + return request({ + url: '/api/organization/' + "getbyIds/", + method: "post", + data: { values } + }).then((ret: any) => { + return ret.data; + }); + } + } + }), + column: { + minWidth: 200, //最小列宽 + fixed:true, + }, + form: { + suffixRender({value}) { + //这里把当前的value传进去 + function goto({value}: {value: any}) { + if (!value){ + // 这里判断当选项没有值是,用户又点了跳转按钮,那说明是需要新增对象 + value =0 + } + // 这里是跳转至相应的路由,把value给到id + //这里整个配置主要name:'organizationNewPageEdit'便可 + router.push({name:'organizationNewPageEdit',params:{id:value}}) + } + return ( + // 这里配置一个跳转的按钮及引用函数 + + goto({value})} >跳转 + + ); + }, + // rules: [ + // // 表单校验规则 + // { + // required: true, + // message: '必填项', + // }, + // ], + component: { + rowKey: "id", //element-plus 必传 + createCrudOptions: organization, + filterable: true, + placeholder: '请选择', + props: { + props: { + value: 'id', + label: 'use', + }, + }, + }, + }, + }, + TelRealPerson: { + title: '号码实名人', + + // search: { + // component: { + // name: "el-input",// 把搜索框从dict-select类型变成el-input类型,注意这里的name对应的是Ui的组件名称 + // placeholder: '信息归属、用户名、资产编码查询', + // clearable: true, + // }, + // order:0, //默认是1,所以0是排在最前面的 + // show: true, + // col:{span:8}, + + // }, + + search:{show: true}, + + type: 'table-select', + dict: dict({ + + value: 'id', + label: 'use', + getNodesByValues: async (values: any[]) => { + if (!values.includes("")) { //element plus的一个bug,这里必须要对values的值进行判断非"" + return request({ + url: '/api/organization/' + "getbyIds/", + method: "post", + data: { values } + }).then((ret: any) => { + return ret.data; + }); + } + } + }), + column: { + minWidth: 200, //最小列宽 + // fixed:true, //固定列 + }, + form: { + suffixRender({value}) { + //这里把当前的value传进去 + function goto({value}: {value: any}) { + if (!value){ + // 这里判断当选项没有值是,用户又点了跳转按钮,那说明是需要新增对象 + value =0 + } + // 这里是跳转至相应的路由,把value给到id + //这里整个配置主要name:'organizationNewPageEdit'便可 + router.push({name:'organizationNewPageEdit',params:{id:value}}) + } + return ( + // 这里配置一个跳转的按钮及引用函数 + + goto({value})} >跳转 + + ); + }, + rules: [ + // 表单校验规则 + { + required: true, + message: '必填项', + }, + ], + component: { + rowKey: "id", //element-plus 必传 + createCrudOptions: organization, + filterable: true, + placeholder: '请选择', + props: { + props: { + value: 'id', + label: 'use', + }, + }, + }, + }, + }, + realDepartment: { + title: '号码管理部门', + search: { + show: true, + }, + type: 'dict-select', + dict: dict({ + url: '/api/department/?limit=999', + value: 'id', + label: 'title', + getData: async ({ url }: { url: string }) => { + return request({ + url: url, + }).then((ret: any) => { + return ret.data; + }); + }, + }), + column: { + minWidth: 150, //最小列宽 + // fixed:true, //固定列 + }, + form: { + rules: [ + // 表单校验规则,这里配置必填项 + { + required: true, + message: '必填项', + }, + ], + component:{ + filterable: true, //配置在选择时,可过滤搜索 + }, + }, + }, + TelephoneType: { + title: '电话类型', + search: { + show: true, + }, + type: 'dict-select', + dict: dict({ + url: '/api/TelephoneTypeModelViewSet/?limit=999', + value: 'id', + label: 'title', + getData: async ({ url }: { url: string }) => { + return request({ + url: url, + }).then((ret: any) => { + return ret.data; + }); + }, + }), + column: { + minWidth: 100, //最小列宽 + // fixed:true, //固定列 + }, + form: { + rules: [ + // 表单校验规则,这里配置必填项 + { + required: true, + message: '必填项', + }, + ], + component: { + span: 12, + filterable: true, //配置在选择时,可过滤搜索 + }, + }, + }, + TelAreaNum: { + title: '号码区号', + type: 'input', + // search: { show: true}, + // readonly:true, //配置成自定义的readonly + column: { + minWidth: 120, + sortable: 'custom', + }, + form: { + rules: [ + // 表单校验规则,这里配置必填项 + { + required: true, + message: '必填项', + pattern: /^[0-9]\d*$/, + }, + ], + helper: "当前数字区号由区域选择之后自动生成", + component: { + placeholder: '请输入号码区号', + disabled: true, + }, + }, + }, + TelNumber: { + title: '电话号码', + type: 'input', + search: { show: true }, + column: { + minWidth: 120, + sortable: 'custom', + // order:-980, + }, + form: { + rules: [ + // 表单校验规则,这里配置必填项 + { + required: true, + message: '必填项且必须填写纯数字', + pattern: /^[1-9]\d*$/, + }, + ], + // helper: "必须填写纯数字", + component: { + placeholder: '请输入电话号码', + }, + }, + }, + Telstatus: { + title: '号码状态', + type: 'dict-select', + dict: dict({ + value: 'id', + label: 'dictName', // 这里要添加为字典名称的字段 + getData: async ({ url }: { url: string }) => { + const curId = await request({ + // 请求回来字典名称为TelephoneModel_Telstatus_choices对象ID + url: '/api/globalDictModelViewSet/?dictName=TelephoneModel_Telstatus_choices', + }).then((ret: any) => { + return ret.data[0].id; + }); + // 通过上面请求回来的TelephoneModel_Telstatus_choices对象ID来拼接直正要拿到的字典名称需求 + return request({ + url: `/api/globalDictModelViewSet/?limit=999&dictMark=${curId}`, + }).then((ret: any) => { + return ret.data; + }); + }, + }), + column: { + minWidth: 100, //最小列宽 + // fixed:true, //固定列 + }, + form: { + rules: [ + // 表单校验规则,这里配置必填项 + { + required: true, + message: '必填项', + }, + + ], + component: { + span: 12, + }, + }, + component: { props: { color: 'auto' } }, // 自动染色 + }, + + + + SuppliersItNetType: { + title: '供应商类型', + search: { + show: true, + }, + type: 'dict-select', + dict: dict({ + url: '/api/ItNetTypeViewSet/?limit=999', + value: 'id', + label: 'title', + getData: async ({ url }: { url: string }) => { + return request({ + url: url, + }).then((ret: any) => { + return ret.data; + }); + }, + }), + column: { + minWidth: 100, //最小列宽 + // fixed:true, //固定列 + }, + form: { + rules: [ + // 表单校验规则,这里配置必填项 + { + required: true, + message: '必填项', + }, + ], + component: { + span: 12, + filterable: true, //配置在选择时,可过滤搜索 + }, + }, + + }, + Suppliers: { + title: '供应商', + search: { + show: true, + }, + type: 'dict-select', + dict: dict({ + url: '/api/SuppliersViewSet/?limit=999', + value: 'id', + label: 'title', + getData: async ({ url }: { url: string }) => { + return request({ + url: url, + }).then((ret: any) => { + return ret.data; + }); + }, + }), + column: { + minWidth: 200, //最小列宽 + // fixed:true, //固定列 + }, + form: { + rules: [ + // 表单校验规则,这里配置必填项 + { + required: true, + message: '必填项', + }, + ], + component: { + span: 12, + filterable: true, //配置在选择时,可过滤搜索 + }, + }, + }, + + // 功能说明:对注释进行跨列配置,解决看起来太小的问题,重点参数colspan + description: { + title: '备注说明', + type: ["textarea","colspan"], + search: {show: false}, + column: { + minWidth: 200, //最小列宽 + // show: false, + }, + form: { + component: { + rows:8, //配置一共默认占用8行的高度的 + maxlength: 500, + placeholder: '输入备注', + }, + }, + }, + // 功能说明:引用入了一张子表,并且配置了相应的保存及保存之后页面的处理 + subTable: { + title: "子表", + type: "text", + form: { + title: "", //配置在form内没有title内容 + labelWidth:"0", //配置子表的宽度占满介面 + component: { + name: subTableComponent, + id:compute(({form})=>{ + return form.id + }), + on:{ + //可以传进form进去async saveMain({form}) + async saveMain(){ + //保存主表 + const formRef = crudExpose.getFormRef() + const ret = await formRef.submit() + //将form改为编辑模式 + let formWrapperRef = crudExpose.getFormWrapperRef(); + // 这个地方要改为拿到ret.res.data,示例中拿到的是ret.res + formWrapperRef.setFormData(ret.res.data) + crudRef.value.formWrapperRef.formOptions.mode = "edit" + crudRef.value.formWrapperRef.title="编辑" + } + } + }, + col: { + span: 24 + }, + }, + column: { + minWidth: 200, //最小列宽 + formatter: ({ row }) => { + return "查看或编辑状态查看内容"; + } + } + }, + + + // 注释编号:django-vue3-admin-crud273411:代码开始行 + // 功能说明:这里是配置转接需求的字段 + transfer_address: { + title: '转接需求地址', + type: 'input', + column: { + minWidth: 120, + sortable: 'custom', + }, + form: { + component: { + placeholder: '转接需求地址,如URL', + }, + }, + }, + transfer_dial_num: { + title: '转接拨打号码', + type: 'input', + column: { + minWidth: 120, + sortable: 'custom', + }, + form: { + // helper: "如电话号码或者带有#+分机的号码等", + component: { + placeholder: '如电话号码或者带有#+分机的号码等', + }, + }, + }, + transfer_account: { + title: '转接需求账号', + type: 'input', + column: { + minWidth: 120, + sortable: 'custom', + }, + form: { + // helper: "转接需求账号", + component: { + placeholder: '转接需求账号', + }, + }, + }, + transfer_password: { + title: '转接需求密码', + type: 'input', + column: { + minWidth: 120, + sortable: 'custom', + }, + form: { + // helper: "转接需求账号", + component: { + placeholder: '转接需求密码', + }, + }, + }, + transfer_description: { + title: '转接需求说明', + type: ["textarea","colspan"], + search: {show: false}, + column: { + minWidth: 200, //最小列宽 + // show: false, + }, + form: { + component: { + rows:8, //配置一共默认占用8行的高度的 + maxlength: 500, + placeholder: '转接需求说明', + }, + }, + }, + + // 注释编号:django-vue3-admin-crud273411:代码结束行 + + + }, + + }, + }; +}; diff --git a/web/src/views/it_mis/TelephoneTables/TelephoneModelViewSet/index.vue b/web/src/views/it_mis/TelephoneTables/TelephoneModelViewSet/index.vue new file mode 100644 index 0000000000000000000000000000000000000000..5a17897932d5426abaa7509f9ec7cbcdb01fe17b --- /dev/null +++ b/web/src/views/it_mis/TelephoneTables/TelephoneModelViewSet/index.vue @@ -0,0 +1,53 @@ + + + + + diff --git a/web/src/views/it_mis/TelephoneTables/TelephoneTypeModelViewSet/api.ts b/web/src/views/it_mis/TelephoneTables/TelephoneTypeModelViewSet/api.ts new file mode 100644 index 0000000000000000000000000000000000000000..7efdabcbf1f0eeb3f4487f2f631cd51a329cfad8 --- /dev/null +++ b/web/src/views/it_mis/TelephoneTables/TelephoneTypeModelViewSet/api.ts @@ -0,0 +1,50 @@ +import { request,downloadFile } from '/@/utils/service'; +import { PageQuery, AddReq, DelReq, EditReq, InfoReq } from '@fast-crud/fast-crud'; + +export const apiPrefix = '/api/TelephoneTypeModelViewSet/'; + +export function GetList(query: PageQuery) { + return request({ + url: apiPrefix, + method: 'get', + params: query, + }); +} +export function GetObj(id: InfoReq) { + return request({ + url: apiPrefix + id, + method: 'get', + }); +} + +export function AddObj(obj: AddReq) { + return request({ + url: apiPrefix, + method: 'post', + data: obj, + }); +} + +export function UpdateObj(obj: EditReq) { + return request({ + url: apiPrefix + obj.id + '/', + method: 'put', + data: obj, + }); +} + +export function DelObj(id: DelReq) { + return request({ + url: apiPrefix + id + '/', + method: 'delete', + data: { id }, + }); +} + +export function exportData(params:any){ + return downloadFile({ + url: apiPrefix + 'export_data/', + params: params, + method: 'get' + }) +} diff --git a/web/src/views/it_mis/TelephoneTables/TelephoneTypeModelViewSet/crud.tsx b/web/src/views/it_mis/TelephoneTables/TelephoneTypeModelViewSet/crud.tsx new file mode 100644 index 0000000000000000000000000000000000000000..ea2c529eac6a0983f1d50f6a2d1e5b7d8fa09412 --- /dev/null +++ b/web/src/views/it_mis/TelephoneTables/TelephoneTypeModelViewSet/crud.tsx @@ -0,0 +1,87 @@ +import { AddReq, DelReq, EditReq, dict, CrudExpose, compute, UserPageQuery, CreateCrudOptionsRet} from '@fast-crud/fast-crud'; +import _ from 'lodash-es'; +import * as api from './api'; +import { request } from '/@/utils/service'; +import { dictionary } from '/@/utils/dictionary'; + + + +//此处为crudOptions配置 + export default function ({ crudExpose}: { crudExpose: CrudExpose}): CreateCrudOptionsRet { + const pageRequest = async (query: any) => { + return await api.GetList(query); + }; + const editRequest = async ({ form, row }: EditReq) => { + if (row.id) { + form.id = row.id; + } + return await api.UpdateObj(form); + }; + const delRequest = async ({ row }: DelReq) => { + return await api.DelObj(row.id); + }; + const addRequest = async ({ form }: AddReq) => { + return await api.AddObj(form); + }; + + const exportRequest = async (query: UserPageQuery) => { + return await api.exportData(query) + }; + + + + + + + return { + crudOptions: { + request: { + pageRequest, + addRequest, + editRequest, + delRequest, + }, + actionbar: { + buttons: { + export:{ + click(){ + return exportRequest(crudExpose.getSearchFormData()) + } + } + } + }, + form: { + col: { span: 24 }, + labelWidth: '100px', + wrapper: { + is: 'el-dialog', + width: '600px', + }, + + }, + columns: { + title: { + title: '电话类型', + type: 'input', + search: { show: true}, + column: { + minWidth: 120, + sortable: 'custom', + }, + form: { + rules: [{ required: true, message: '电话类型必填' }], + component: { + placeholder: '请输入电话类型', + }, + }, + }, + + + + + + }, + + }, + }; +}; diff --git a/web/src/views/it_mis/TelephoneTables/TelephoneTypeModelViewSet/index.vue b/web/src/views/it_mis/TelephoneTables/TelephoneTypeModelViewSet/index.vue new file mode 100644 index 0000000000000000000000000000000000000000..8459a6a2bc3fcfa6a24edc69cc6a1fb91759e1c6 --- /dev/null +++ b/web/src/views/it_mis/TelephoneTables/TelephoneTypeModelViewSet/index.vue @@ -0,0 +1,56 @@ + + + + + diff --git a/web/src/views/it_mis/TelephoneTables/lineAccessModelViewSet/api.ts b/web/src/views/it_mis/TelephoneTables/lineAccessModelViewSet/api.ts new file mode 100644 index 0000000000000000000000000000000000000000..71c02e511010be0fa6e202e0a92cd6d280f1a049 --- /dev/null +++ b/web/src/views/it_mis/TelephoneTables/lineAccessModelViewSet/api.ts @@ -0,0 +1,50 @@ +import { request,downloadFile } from '/@/utils/service'; +import { PageQuery, AddReq, DelReq, EditReq, InfoReq } from '@fast-crud/fast-crud'; + +export const apiPrefix = '/api/lineAccessModelViewSet/'; + +export function GetList(query: PageQuery) { + return request({ + url: apiPrefix, + method: 'get', + params: query, + }); +} +export function GetObj(id: InfoReq) { + return request({ + url: apiPrefix + id, + method: 'get', + }); +} + +export function AddObj(obj: AddReq) { + return request({ + url: apiPrefix, + method: 'post', + data: obj, + }); +} + +export function UpdateObj(obj: EditReq) { + return request({ + url: apiPrefix + obj.id + '/', + method: 'put', + data: obj, + }); +} + +export function DelObj(id: DelReq) { + return request({ + url: apiPrefix + id + '/', + method: 'delete', + data: { id }, + }); +} + +export function exportData(params:any){ + return downloadFile({ + url: apiPrefix + 'export_data/', + params: params, + method: 'get' + }) +} diff --git a/web/src/views/it_mis/TelephoneTables/lineAccessModelViewSet/crud.tsx b/web/src/views/it_mis/TelephoneTables/lineAccessModelViewSet/crud.tsx new file mode 100644 index 0000000000000000000000000000000000000000..a743f7c9ce126669211fb828e00a0a4d6c2094f2 --- /dev/null +++ b/web/src/views/it_mis/TelephoneTables/lineAccessModelViewSet/crud.tsx @@ -0,0 +1,85 @@ +import { CrudOptions, AddReq, DelReq, EditReq, dict, CrudExpose, compute, UserPageQuery, CreateCrudOptionsRet} from '@fast-crud/fast-crud'; +import _ from 'lodash-es'; +import * as api from './api'; +import { request } from '/@/utils/service'; +import { dictionary } from '/@/utils/dictionary'; + + +//此处为crudOptions配置 +export default function ({ crudExpose}: { crudExpose: CrudExpose}): CreateCrudOptionsRet { + const pageRequest = async (query: any) => { + return await api.GetList(query); + }; + const editRequest = async ({ form, row }: EditReq) => { + if (row.id) { + form.id = row.id; + } + return await api.UpdateObj(form); + }; + const delRequest = async ({ row }: DelReq) => { + return await api.DelObj(row.id); + }; + const addRequest = async ({ form }: AddReq) => { + return await api.AddObj(form); + }; + + const exportRequest = async (query: UserPageQuery) => { + return await api.exportData(query) + }; + + + + return { + crudOptions: { + request: { + pageRequest, + addRequest, + editRequest, + delRequest, + }, + actionbar: { + buttons: { + export:{ + click(){ + return exportRequest(crudExpose.getSearchFormData()) + } + } + } + }, + form: { + col: { span: 24 }, + // labelWidth: '100px', + wrapper: { + is: 'el-dialog', + // width: '600px', + }, + + }, + columns: { + + title: { + title: '线路接入信息', + type: 'input', + search: { show: true}, + column: { + // minWidth: 120, + sortable: 'custom', + }, + form: { + rules: [{ required: true, message: '线路接入信息必填' }], + component: { + placeholder: '请输入线路接入信息', + }, + + bottomRender({ value }) { + return 线路接入信息,比如1号街线+黄色,2号街线+绿色,这样写; + }, + }, + }, + + + }, + + }, + }; +}; diff --git a/web/src/views/it_mis/TelephoneTables/lineAccessModelViewSet/index.vue b/web/src/views/it_mis/TelephoneTables/lineAccessModelViewSet/index.vue new file mode 100644 index 0000000000000000000000000000000000000000..0f29691756880717ca0ffbce3bbf29981eac66da --- /dev/null +++ b/web/src/views/it_mis/TelephoneTables/lineAccessModelViewSet/index.vue @@ -0,0 +1,55 @@ + + + + + diff --git a/web/src/views/system/areas/crud.tsx b/web/src/views/system/areas/crud.tsx index 01d1860253220ac98200c98e4a6446c79a5daab5..fe4951dfb4200a801cf3756a06bccb4a9fc5eea2 100644 --- a/web/src/views/system/areas/crud.tsx +++ b/web/src/views/system/areas/crud.tsx @@ -18,7 +18,9 @@ export const createCrudOptions = function ({crudExpose}: CreateCrudOptionsProps) return await api.GetList(query); }; const editRequest = async ({form, row}: EditReq) => { - form.id = row.id; + if(row.id){ + form.id = row.id; + } return await api.UpdateObj(form); }; const delRequest = async ({row}: DelReq) => { diff --git a/web/src/views/system/demo/index.vue b/web/src/views/system/demo/index.vue deleted file mode 100644 index 4e71a9cfc2dc57b27caaffecb711e005025e1843..0000000000000000000000000000000000000000 --- a/web/src/views/system/demo/index.vue +++ /dev/null @@ -1,80 +0,0 @@ - - - diff --git a/web/src/views/system/dept/components/DeptUserCom/index.vue b/web/src/views/system/dept/components/DeptUserCom/index.vue index fb50ff90e2fc6c9eedc259fc33d71ae777411cb1..e0e2e80ca2c25e882015b999289d8f7abd9aa825 100644 --- a/web/src/views/system/dept/components/DeptUserCom/index.vue +++ b/web/src/views/system/dept/components/DeptUserCom/index.vue @@ -63,7 +63,7 @@ import { ref, reactive, onMounted } from 'vue'; import { useExpose, useCrud } from '@fast-crud/fast-crud'; import { Md5 } from 'ts-md5'; import { createCrudOptions } from './crud'; -import importExcel from '/@/components/importExcel/index.vue'; +; import * as echarts from 'echarts'; import { ECharts, EChartsOption, init } from 'echarts'; import { getDeptInfoById, resetPwd } from './api'; diff --git a/web/src/views/system/dictionary/subDict/crud.tsx b/web/src/views/system/dictionary/subDict/crud.tsx index 342d989f3f21fea2fb44806db71b5c3528ca1aca..8ee841cf171292574d75554991f656c09e243f83 100644 --- a/web/src/views/system/dictionary/subDict/crud.tsx +++ b/web/src/views/system/dictionary/subDict/crud.tsx @@ -23,7 +23,7 @@ export const createCrudOptions = function ({crudExpose, context}: CreateCrudOpti return await api.DelObj(row.id); }; const addRequest = async ({form}: AddReq) => { - const data = crudExpose!.getSearchFormData() + const data = crudExpose.getSearchFormData() const parent = data.parent form.parent = parent if (parent) { diff --git a/web/src/views/system/login/index.vue b/web/src/views/system/login/index.vue index bb442bf61c6f05311783f9beba5df92d563611ef..4ce87711b576a66794990e29b854cc4567a3fcaf 100644 --- a/web/src/views/system/login/index.vue +++ b/web/src/views/system/login/index.vue @@ -2,11 +2,17 @@