From 95666233bfd16e22822d27149be5a1218cc86733 Mon Sep 17 00:00:00 2001 From: waylon <1158341873@qq.com> Date: Sat, 7 Oct 2023 14:47:17 +0800 Subject: [PATCH 01/20] =?UTF-8?q?optimization:=20=E4=BB=BB=E5=8A=A1?= =?UTF-8?q?=E5=88=97=E8=A1=A8=E8=BF=87=E6=BB=A4=20sql=20=E8=AF=AD=E5=8F=A5?= =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- gcloud/apigw/views/get_task_list.py | 17 ++++++------- .../core/apis/drf/viewsets/function_task.py | 12 +++++----- gcloud/core/apis/drf/viewsets/taskflow.py | 24 +++++-------------- gcloud/iam_auth/resource_api/task.py | 20 ++++++++-------- 4 files changed, 31 insertions(+), 42 deletions(-) diff --git a/gcloud/apigw/views/get_task_list.py b/gcloud/apigw/views/get_task_list.py index 3fb91bfaa4..5115d842e1 100644 --- a/gcloud/apigw/views/get_task_list.py +++ b/gcloud/apigw/views/get_task_list.py @@ -10,19 +10,20 @@ an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. """ +from apigw_manager.apigw.decorators import apigw_require +from blueapps.account.decorators import login_exempt +from django.db.models import Value from django.views.decorators.http import require_GET -from blueapps.account.decorators import login_exempt from gcloud import err_code -from gcloud.apigw.decorators import mark_request_whether_is_trust, timezone_inject, project_inject, return_json_response -from gcloud.taskflow3.models import TaskFlowInstance +from gcloud.apigw.decorators import mark_request_whether_is_trust, project_inject, return_json_response, timezone_inject +from gcloud.apigw.forms import GetTaskListForm from gcloud.apigw.views.utils import format_task_list_data, paginate_list_data +from gcloud.iam_auth.conf import TASK_ACTIONS from gcloud.iam_auth.intercept import iam_intercept -from gcloud.iam_auth.view_interceptors.apigw import ProjectViewInterceptor from gcloud.iam_auth.utils import get_task_allowed_actions_for_user -from gcloud.iam_auth.conf import TASK_ACTIONS -from gcloud.apigw.forms import GetTaskListForm -from apigw_manager.apigw.decorators import apigw_require +from gcloud.iam_auth.view_interceptors.apigw import ProjectViewInterceptor +from gcloud.taskflow3.models import TaskFlowInstance @login_exempt @@ -44,7 +45,7 @@ def get_task_list(request, project_id): "is_finished": "pipeline_instance__is_finished", "executor": "pipeline_instance__executor", } - filter_kwargs = dict(is_deleted=False, project_id=project.id) + filter_kwargs = dict(is_deleted=Value(0), project_id=project.id) for param, filter_key in param_mappings.items(): if param in request.GET: filter_kwargs[filter_key] = params_validator.cleaned_data[param] diff --git a/gcloud/core/apis/drf/viewsets/function_task.py b/gcloud/core/apis/drf/viewsets/function_task.py index 3a5cf5a16e..0429af9aec 100644 --- a/gcloud/core/apis/drf/viewsets/function_task.py +++ b/gcloud/core/apis/drf/viewsets/function_task.py @@ -10,16 +10,16 @@ an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. """ - +from django.db.models import Value from rest_framework import permissions -from gcloud.core.apis.drf.viewsets import GcloudListViewSet from gcloud.contrib.function.models import FunctionTask -from gcloud.core.apis.drf.serilaziers.function_task import FunctionTaskSerializer +from gcloud.core.apis.drf.permission import IamPermission, IamPermissionInfo from gcloud.core.apis.drf.resource_helpers import ViewSetResourceHelper -from gcloud.iam_auth import res_factory, IAMMeta +from gcloud.core.apis.drf.serilaziers.function_task import FunctionTaskSerializer +from gcloud.core.apis.drf.viewsets import GcloudListViewSet +from gcloud.iam_auth import IAMMeta, res_factory from gcloud.iam_auth.conf import TASK_ACTIONS -from gcloud.core.apis.drf.permission import IamPermissionInfo, IamPermission class FunctionTaskPermission(IamPermission): @@ -29,7 +29,7 @@ class FunctionTaskPermission(IamPermission): class FunctionTaskViewSet(GcloudListViewSet): - queryset = FunctionTask.objects.filter(task__is_deleted=False) + queryset = FunctionTask.objects.filter(task__is_deleted=Value(0)) serializer_class = FunctionTaskSerializer iam_resource_helper = ViewSetResourceHelper( resource_func=res_factory.resources_for_function_task_obj, actions=TASK_ACTIONS, id_field="task.id" diff --git a/gcloud/core/apis/drf/viewsets/taskflow.py b/gcloud/core/apis/drf/viewsets/taskflow.py index 839b319f85..ef10759bbe 100644 --- a/gcloud/core/apis/drf/viewsets/taskflow.py +++ b/gcloud/core/apis/drf/viewsets/taskflow.py @@ -15,7 +15,7 @@ from django.conf import settings from django.db import transaction -from django.db.models import Q +from django.db.models import Q, Value from django.utils.translation import ugettext_lazy as _ from django_filters import FilterSet from drf_yasg.utils import swagger_auto_schema @@ -32,11 +32,7 @@ from gcloud.constants import TASK_NAME_MAX_LENGTH, TaskCreateMethod from gcloud.contrib.appmaker.models import AppMaker from gcloud.contrib.function.models import FunctionTask -from gcloud.contrib.operate_record.constants import ( - OperateSource, - OperateType, - RecordType, -) +from gcloud.contrib.operate_record.constants import OperateSource, OperateType, RecordType from gcloud.contrib.operate_record.signal import operate_record_signal from gcloud.contrib.operate_record.utils import extract_extra_info from gcloud.core.apis.drf.exceptions import ValidationException @@ -66,17 +62,9 @@ from gcloud.core.models import EngineConfig from gcloud.iam_auth import IAMMeta, get_iam_client, res_factory from gcloud.iam_auth.conf import TASK_ACTIONS -from gcloud.iam_auth.utils import ( - get_common_flow_allowed_actions_for_user, - get_flow_allowed_actions_for_user, -) +from gcloud.iam_auth.utils import get_common_flow_allowed_actions_for_user, get_flow_allowed_actions_for_user from gcloud.taskflow3.domains.auto_retry import AutoRetryNodeStrategyCreator -from gcloud.taskflow3.models import ( - TaskConfig, - TaskFlowInstance, - TaskFlowRelation, - TimeoutNodeConfig, -) +from gcloud.taskflow3.models import TaskConfig, TaskFlowInstance, TaskFlowRelation, TimeoutNodeConfig from gcloud.tasktmpl3.models import TaskTemplate from gcloud.utils.strings import standardize_name, standardize_pipeline_node_name @@ -174,7 +162,7 @@ def has_permission(self, request, view): class TaskFlowInstanceViewSet(GcloudReadOnlyViewSet, generics.CreateAPIView, generics.DestroyAPIView): serializer_class = TaskFlowInstanceSerializer queryset = TaskFlowInstance.objects.filter( - pipeline_instance__isnull=False, is_deleted=False, pipeline_instance__is_expired=False + pipeline_instance__isnull=False, is_deleted=Value(0), pipeline_instance__is_expired=False ).order_by("-id") iam_resource_helper = ViewSetResourceHelper(resource_func=res_factory.resources_for_task_obj, actions=TASK_ACTIONS) filter_class = TaskFlowFilterSet @@ -389,7 +377,7 @@ def list_children_taskflow(self, request, *args, **kwargs): ) children_task_ids = [info["task_id"] for info in children_task_info] queryset = TaskFlowInstance.objects.filter( - id__in=children_task_ids, pipeline_instance__isnull=False, is_deleted=False + id__in=children_task_ids, pipeline_instance__isnull=False, is_deleted=Value(0) ) queryset = self.filter_queryset(queryset) serializer = self.get_serializer(queryset, many=True) diff --git a/gcloud/iam_auth/resource_api/task.py b/gcloud/iam_auth/resource_api/task.py index 8b8dd322ae..e3b4a8963c 100644 --- a/gcloud/iam_auth/resource_api/task.py +++ b/gcloud/iam_auth/resource_api/task.py @@ -10,17 +10,17 @@ an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. """ -from django.core.cache import cache from django.contrib.auth import get_user_model -from django.db.models import Q +from django.core.cache import cache +from django.db.models import Q, Value from django.utils.translation import ugettext_lazy as _ +from iam.resource.provider import ListResult, ResourceProvider +from gcloud.core.models import Project from gcloud.iam_auth.conf import SEARCH_INSTANCE_CACHE_TIME +from gcloud.taskflow3.models import TaskFlowInstance from iam import PathEqDjangoQuerySetConverter from iam.contrib.django.dispatcher import InvalidPageException -from iam.resource.provider import ListResult, ResourceProvider -from gcloud.core.models import Project -from gcloud.taskflow3.models import TaskFlowInstance attr_names = { "en": {"type": "Task type", "iam_resource_owner": "Resource owner"}, @@ -65,7 +65,7 @@ def search_instance(self, filter, page, **options): if results is None: queryset = ( TaskFlowInstance.objects.select_related("pipeline_instance") - .filter(pipeline_instance__name__icontains=keyword, is_deleted=False) + .filter(pipeline_instance__name__icontains=keyword, is_deleted=Value(0)) .only("pipeline_instance__name") ) if project_id: @@ -114,13 +114,13 @@ def list_instance(self, filter, page, **options): with_path = False if not (filter.parent or filter.search or filter.resource_type_chain): - queryset = TaskFlowInstance.objects.filter(is_deleted=False) + queryset = TaskFlowInstance.objects.filter(is_deleted=Value(0)) elif filter.parent: parent_id = filter.parent["id"] if parent_id: - queryset = TaskFlowInstance.objects.filter(project_id=str(parent_id), is_deleted=False) + queryset = TaskFlowInstance.objects.filter(project_id=str(parent_id), is_deleted=Value(0)) else: - queryset = TaskFlowInstance.objects.filter(is_deleted=False) + queryset = TaskFlowInstance.objects.filter(is_deleted=Value(0)) elif filter.search and filter.resource_type_chain: # 返回结果需要带上资源拓扑路径信息 with_path = True @@ -129,7 +129,7 @@ def list_instance(self, filter, page, **options): task_keywords = filter.search.get("task", []) project_filter = Q() - task_filter = Q(is_deleted=False) + task_filter = Q(is_deleted=Value(0)) for keyword in project_keywords: project_filter |= Q(name__icontains=keyword) From afc5b2144523ebef2896b8fc9cc01f42d840063b Mon Sep 17 00:00:00 2001 From: v_xugzhou <941071842@qq.com> Date: Mon, 9 Oct 2023 09:48:00 +0800 Subject: [PATCH 02/20] =?UTF-8?q?minor:=20=E5=8F=98=E9=87=8F=E7=A6=81?= =?UTF-8?q?=E6=AD=A2=E5=88=A0=E9=99=A4=E6=8F=90=E7=A4=BA=E6=96=87=E6=A1=88?= =?UTF-8?q?=E7=BB=9F=E4=B8=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../TemplateSetting/TabGlobalVariables/VariableItem.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/desktop/src/pages/template/TemplateEdit/TemplateSetting/TabGlobalVariables/VariableItem.vue b/frontend/desktop/src/pages/template/TemplateEdit/TemplateSetting/TabGlobalVariables/VariableItem.vue index 2eb3b43335..90cf0ea912 100644 --- a/frontend/desktop/src/pages/template/TemplateEdit/TemplateSetting/TabGlobalVariables/VariableItem.vue +++ b/frontend/desktop/src/pages/template/TemplateEdit/TemplateSetting/TabGlobalVariables/VariableItem.vue @@ -111,7 +111,7 @@

{{ $t('删除') }}

From fcefd91c9fa05dda4d7964defe35b04d4795ba0c Mon Sep 17 00:00:00 2001 From: crayon <873217631@qq.com> Date: Mon, 9 Oct 2023 20:50:18 +0800 Subject: [PATCH 03/20] =?UTF-8?q?bugfix:=20=E4=BF=AE=E5=A4=8D=20Job=20?= =?UTF-8?q?=E5=BC=95=E7=94=A8=E5=85=A8=E5=B1=80=E5=8F=98=E9=87=8F=E5=9C=BA?= =?UTF-8?q?=E6=99=AF=E4=B8=8B=E5=80=BC=E8=A7=A3=E6=9E=90=E4=B8=8D=E7=AC=A6?= =?UTF-8?q?=E5=90=88=E9=A2=84=E6=9C=9F=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../all_biz_execute_job_plan/base_service.py | 17 ++++++++++++- .../job/execute_task/execute_task_base.py | 17 ++++++++++++- pipeline_plugins/components/utils/common.py | 10 ++++++++ .../all_biz_execute_job_plan/test_v1_0.py | 25 +++++++++++++++++++ 4 files changed, 67 insertions(+), 2 deletions(-) diff --git a/pipeline_plugins/components/collections/sites/open/job/all_biz_execute_job_plan/base_service.py b/pipeline_plugins/components/collections/sites/open/job/all_biz_execute_job_plan/base_service.py index 3a67b8b6f4..ab7e9e262c 100644 --- a/pipeline_plugins/components/collections/sites/open/job/all_biz_execute_job_plan/base_service.py +++ b/pipeline_plugins/components/collections/sites/open/job/all_biz_execute_job_plan/base_service.py @@ -19,6 +19,7 @@ get_job_instance_url, get_node_callback_url, has_biz_set, + is_cipher_structure, loose_strip, parse_passwd_value, plat_ip_reg, @@ -124,7 +125,21 @@ def execute(self, data, parent_data): self.biz_scope_type = JobBizScopeType.BIZ.value for _value in original_global_var: - val = loose_strip(crypto.decrypt(parse_passwd_value(_value["value"]))) + + if is_cipher_structure(_value["value"]): + # 只有当变量值符合密码结构,才需要尝试解析密码变量 + try: + val = loose_strip(crypto.decrypt(parse_passwd_value(_value["value"]))) + except Exception: + self.logger.exception( + "[job_execute_task_base] failed to decrypt value -> {value}, use plaintext".format( + value=_value["value"] + ) + ) + val = loose_strip(_value["value"]) + else: + val = loose_strip(_value["value"]) + if _value["type"] == JOBV3_VAR_CATEGORY_IP: ip_list = self.get_ip_list(val) diff --git a/pipeline_plugins/components/collections/sites/open/job/execute_task/execute_task_base.py b/pipeline_plugins/components/collections/sites/open/job/execute_task/execute_task_base.py index 31eec55d9b..66f5874a3e 100644 --- a/pipeline_plugins/components/collections/sites/open/job/execute_task/execute_task_base.py +++ b/pipeline_plugins/components/collections/sites/open/job/execute_task/execute_task_base.py @@ -27,6 +27,7 @@ from pipeline_plugins.components.utils import ( get_job_instance_url, get_node_callback_url, + is_cipher_structure, loose_strip, parse_passwd_value, ) @@ -156,7 +157,21 @@ def execute(self, data, parent_data): biz_across = data.get_one_of_inputs("biz_across") for _value in original_global_var: - val = loose_strip(crypto.decrypt(parse_passwd_value(_value["value"]))) + + if is_cipher_structure(_value["value"]): + # 只有当变量值符合密码结构,才需要尝试解析密码变量 + try: + val = loose_strip(crypto.decrypt(parse_passwd_value(_value["value"]))) + except Exception: + self.logger.exception( + "[job_execute_task_base] failed to decrypt value -> {value}, use plaintext".format( + value=_value["value"] + ) + ) + val = loose_strip(_value["value"]) + else: + val = loose_strip(_value["value"]) + # category为3,表示变量类型为IP if _value["category"] == JOBV3_VAR_CATEGORY_IP: self.logger.info("[job_execute_task_base] start find ip, var={}".format(val)) diff --git a/pipeline_plugins/components/utils/common.py b/pipeline_plugins/components/utils/common.py index aa75ddcf78..b585e65fa5 100644 --- a/pipeline_plugins/components/utils/common.py +++ b/pipeline_plugins/components/utils/common.py @@ -121,6 +121,16 @@ def convert_num_to_str(export_data: list): return export_data +def is_cipher_structure(value: typing.Any) -> bool: + """检测一个变量是否具备密码变量结构""" + if isinstance(value, str): + return True + # 密码变量格式:{"tag": "xxx", "value": "xxx"} + if isinstance(value, dict) and "tag" in value and "value" in value: + return True + return False + + def parse_passwd_value(passwd_value: typing.Union[str, typing.Dict[str, str]]) -> str: if isinstance(passwd_value, str): return passwd_value diff --git a/pipeline_plugins/tests/components/collections/sites/open/job_test/all_biz_execute_job_plan/test_v1_0.py b/pipeline_plugins/tests/components/collections/sites/open/job_test/all_biz_execute_job_plan/test_v1_0.py index 51ab94ccbd..3459de9ba8 100644 --- a/pipeline_plugins/tests/components/collections/sites/open/job_test/all_biz_execute_job_plan/test_v1_0.py +++ b/pipeline_plugins/tests/components/collections/sites/open/job_test/all_biz_execute_job_plan/test_v1_0.py @@ -714,8 +714,30 @@ def __init__( "id": 1000032, "type": JOBV3_VAR_CATEGORY_PASSWORD, "name": "password", + # 密文变量 "value": {"tag": "variable", "value": crypto.encrypt("123")}, }, + { + "id": 1000033, + "type": 1, + "name": "dict", + # 结构化数据 + "value": {"value": 1, "test": True}, + }, + { + "id": 1000034, + "type": 1, + "name": "int from page", + # 页面输入的整型 + "value": 0, + }, + { + "id": 1000035, + "type": 1, + "name": "int from page", + # 页面输入的整型 + "value": 1232314345, + }, {"id": 1000031, "type": 3, "name": "ip", "value": "0:192.168.20.218", "description": ""}, ], } @@ -758,6 +780,9 @@ def __init__( "global_var_list": [ {"id": 1000030, "value": "test"}, {"id": 1000032, "value": "123"}, + {"id": 1000033, "value": "{'value': 1, 'test': True}"}, + {"id": 1000034, "value": "0"}, + {"id": 1000035, "value": "1232314345"}, {"id": 1000031, "server": {"ip_list": [{"ip": "192.168.20.218", "bk_cloud_id": 0}]}}, ], "callback_url": "callback_url", From 58a65183e12034563fa3d6f23051ffbca1d64f88 Mon Sep 17 00:00:00 2001 From: crayon <873217631@qq.com> Date: Tue, 10 Oct 2023 10:50:54 +0800 Subject: [PATCH 04/20] minor: release 3.30.1 --- app.yml | 2 +- app_desc.yaml | 2 +- config/default.py | 3 +-- 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/app.yml b/app.yml index 650371dfe3..9a385f9be3 100644 --- a/app.yml +++ b/app.yml @@ -6,7 +6,7 @@ is_use_celery: True author: 蓝鲸智云 introduction: 标准运维是通过一套成熟稳定的任务调度引擎,把在多系统间的工作整合到一个流程,助力运维实现跨系统调度自动化的SaaS应用。 introduction_en: SOPS is a SaaS application that utilizes a set of mature and stable task scheduling engines to help realize cross-system scheduling automation, and integrates the work among multiple systems into a single process. -version: 3.30.0 +version: 3.30.1 category: 运维工具 language_support: 中文 desktop: diff --git a/app_desc.yaml b/app_desc.yaml index 0324f4d24f..79a97d0580 100644 --- a/app_desc.yaml +++ b/app_desc.yaml @@ -1,5 +1,5 @@ spec_version: 2 -app_version: "3.30.0" +app_version: "3.30.1" app: region: default bk_app_code: bk_sops diff --git a/config/default.py b/config/default.py index e9dafacff5..995b129b03 100644 --- a/config/default.py +++ b/config/default.py @@ -211,7 +211,7 @@ # mako模板中: # 如果静态资源修改了以后,上线前改这个版本号即可 -STATIC_VERSION = "3.30.0" +STATIC_VERSION = "3.30.1" DEPLOY_DATETIME = datetime.datetime.now().strftime("%Y%m%d%H%M%S") STATICFILES_DIRS = [os.path.join(BASE_DIR, "static")] @@ -676,7 +676,6 @@ def monitor_report_config(): from bk_monitor_report import MonitorReporter # noqa from bk_monitor_report.contrib.celery import MonitorReportStep # noqa - from blueapps.core.celery import celery_app # noqa reporter = MonitorReporter( From dad3fb69819bdd262073302c5b666395c8a1e5f2 Mon Sep 17 00:00:00 2001 From: luofann Date: Tue, 10 Oct 2023 10:21:02 +0800 Subject: [PATCH 05/20] =?UTF-8?q?bugfix:=20=E4=BF=AE=E5=A4=8D=E8=A1=A8?= =?UTF-8?q?=E6=A0=BC=E5=86=85tag=20blur=E4=BA=8B=E4=BB=B6=E4=B8=8D?= =?UTF-8?q?=E7=94=9F=E6=95=88=E7=9A=84=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/components/common/RenderForm/tags/TagDatatable.vue | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/frontend/desktop/src/components/common/RenderForm/tags/TagDatatable.vue b/frontend/desktop/src/components/common/RenderForm/tags/TagDatatable.vue index af73e86aed..8ff22aa0ba 100644 --- a/frontend/desktop/src/components/common/RenderForm/tags/TagDatatable.vue +++ b/frontend/desktop/src/components/common/RenderForm/tags/TagDatatable.vue @@ -81,7 +81,7 @@ :parent-value="scope.row" @init="onInitColumn(scope.$index, cIndex, ...arguments)" @change="onEditColumn(scope.$index, cIndex, ...arguments)" - @blur="onColumnInputBlur(scope.$index, ...arguments)"> + @blur="onColumnInputBlur(scope.$index, cIndex, ...arguments)"> @@ -570,8 +570,8 @@ this.$set(this.tableValue[this.editRowNumber], field, val) this.triggerSameRowEvent('change', row, col, val) }, - onColumnInputBlur (scope, val) { - this.triggerSameRowEvent('blur', scope.$index, scope.column.index, val) + onColumnInputBlur (row, col, val) { + this.triggerSameRowEvent('blur', row, col, val) }, onDelete (index, row) { if (this.pagination) { From 722ad4da771038852e41b93ee5c5ea0f396db767 Mon Sep 17 00:00:00 2001 From: luofann Date: Fri, 29 Sep 2023 14:48:53 +0800 Subject: [PATCH 06/20] =?UTF-8?q?feature:=20=E5=AF=86=E7=A0=81tag=E6=94=AF?= =?UTF-8?q?=E6=8C=81=E5=B0=8F=E7=9C=BC=E7=9D=9B=E6=9F=A5=E7=9C=8B=E8=BE=93?= =?UTF-8?q?=E5=85=A5=E5=80=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/RenderForm/tags/TagPassword.vue | 51 +++++++++++++++---- 1 file changed, 40 insertions(+), 11 deletions(-) diff --git a/frontend/desktop/src/components/common/RenderForm/tags/TagPassword.vue b/frontend/desktop/src/components/common/RenderForm/tags/TagPassword.vue index 936b10307d..df79759ebd 100644 --- a/frontend/desktop/src/components/common/RenderForm/tags/TagPassword.vue +++ b/frontend/desktop/src/components/common/RenderForm/tags/TagPassword.vue @@ -23,12 +23,12 @@ - + + @@ -104,8 +108,9 @@ value: '' }, cursorPos: 0, - inputText: '', + inputDisplayText: '', // 输入框展示的值 inputPlaceholder: '', + showInputVal: false, ASYMMETRIC_CIPHER_TYPE: window.ASYMMETRIC_CIPHER_TYPE, ASYMMETRIC_PUBLIC_KEY: window.ASYMMETRIC_PUBLIC_KEY, ASYMMETRIC_PREFIX: window.ASYMMETRIC_PREFIX @@ -140,7 +145,7 @@ }, mounted () { if (this.localVal?.tag === 'value') { - this.inputText = this.localVal.value ? '******' : '' + this.inputDisplayText = this.localVal.value ? '******' : '' } }, methods: { @@ -149,9 +154,10 @@ tag: val, value: '' } - this.inputText = '' + this.inputDisplayText = '' this.change() }, + // 单行文本框输入 handleInput (e) { this.localVal.value = e.target.value this.inputPlaceholder = '' @@ -159,6 +165,7 @@ handleTextareaKeyDown (e) { this.cursorPos = e.target.selectionStart }, + // 多行文本框输入 handleTextareaInput (e) { const value = e.target.value const start = this.cursorPos > e.target.selectionStart ? e.target.selectionStart : this.cursorPos @@ -173,23 +180,27 @@ }, handleTextareaKeyUp (e) { this.inputPlaceholder = '' - this.inputText = e.target.value.replace(/[^\n]/g, '·') + this.inputDisplayText = e.target.value.replace(/[^\n]/g, '·') }, + // 获取焦点后清空密码 handleFocus () { if (this.localVal.value.length > 0) { this.inputPlaceholder = i18n.t('要修改密码请点击后重新输入密码') } this.localVal.value = '' - this.inputText = '' + this.inputDisplayText = '' this.change() }, // 输入框失焦后执行加密逻辑 handleBlur () { - this.inputText = this.textareaMode ? this.localVal.value.replace(/[^\n]/g, '·') : this.localVal.value + this.inputDisplayText = this.textareaMode ? this.localVal.value.replace(/[^\n]/g, '·') : this.localVal.value const encryptedVal = this.encryptPassword() this.localVal.value = encryptedVal this.change() }, + handleToggleEye () { + this.showInputVal = !this.showInputVal + }, handleSelectVariable (val) { this.localVal.value = val this.change() @@ -228,6 +239,12 @@ border-top-right-radius: 0; border-bottom-right-radius: 0; } + .value-edit-input { + display: flex; + align-items: center; + flex: 1; + position: relative; + } .value-input { flex: 1; padding: 0 10px; @@ -268,6 +285,18 @@ background-color: #ffffff; } } + .toggle-eye-icon { + position: absolute; + top: 50%; + right: 12px; + font-size: 14px; + color: #979ba5; + transform: translateY(-50%); + cursor: pointer; + &:hover { + color: #3a84ff; + } + } .select-var { flex: 1; border-top-left-radius: 0; From ca21d14f0e3e88ccae85c8d47ead763988b2ab96 Mon Sep 17 00:00:00 2001 From: luofann Date: Fri, 29 Sep 2023 14:48:53 +0800 Subject: [PATCH 07/20] =?UTF-8?q?feature:=20=E5=AF=86=E7=A0=81tag=E6=94=AF?= =?UTF-8?q?=E6=8C=81=E5=B0=8F=E7=9C=BC=E7=9D=9B=E6=9F=A5=E7=9C=8B=E8=BE=93?= =?UTF-8?q?=E5=85=A5=E5=80=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/RenderForm/tags/TagPassword.vue | 51 +++++++++++++++---- 1 file changed, 40 insertions(+), 11 deletions(-) diff --git a/frontend/desktop/src/components/common/RenderForm/tags/TagPassword.vue b/frontend/desktop/src/components/common/RenderForm/tags/TagPassword.vue index 8f6ec7cd1a..6af5e05773 100644 --- a/frontend/desktop/src/components/common/RenderForm/tags/TagPassword.vue +++ b/frontend/desktop/src/components/common/RenderForm/tags/TagPassword.vue @@ -23,12 +23,12 @@ - + + @@ -104,8 +108,9 @@ value: '' }, cursorPos: 0, - inputText: '', + inputDisplayText: '', // 输入框展示的值 inputPlaceholder: '', + showInputVal: false, ASYMMETRIC_CIPHER_TYPE: window.ASYMMETRIC_CIPHER_TYPE, ASYMMETRIC_PUBLIC_KEY: window.ASYMMETRIC_PUBLIC_KEY, ASYMMETRIC_PREFIX: window.ASYMMETRIC_PREFIX @@ -141,7 +146,7 @@ }, mounted () { if (this.localVal?.tag === 'value') { - this.inputText = this.localVal.value ? '******' : '' + this.inputDisplayText = this.localVal.value ? '******' : '' } }, methods: { @@ -150,9 +155,10 @@ tag: val, value: '' } - this.inputText = '' + this.inputDisplayText = '' this.change() }, + // 单行文本框输入 handleInput (e) { this.localVal.value = e.target.value this.inputPlaceholder = '' @@ -160,6 +166,7 @@ handleTextareaKeyDown (e) { this.cursorPos = e.target.selectionStart }, + // 多行文本框输入 handleTextareaInput (e) { const value = e.target.value const start = this.cursorPos > e.target.selectionStart ? e.target.selectionStart : this.cursorPos @@ -174,23 +181,27 @@ }, handleTextareaKeyUp (e) { this.inputPlaceholder = '' - this.inputText = e.target.value.replace(/[^\n]/g, '·') + this.inputDisplayText = e.target.value.replace(/[^\n]/g, '·') }, + // 获取焦点后清空密码 handleFocus () { if (this.localVal.value.length > 0) { this.inputPlaceholder = i18n.t('要修改密码请点击后重新输入密码') } this.localVal.value = '' - this.inputText = '' + this.inputDisplayText = '' this.change() }, // 输入框失焦后执行加密逻辑 handleBlur () { - this.inputText = this.textareaMode ? this.localVal.value.replace(/[^\n]/g, '·') : this.localVal.value + this.inputDisplayText = this.textareaMode ? this.localVal.value.replace(/[^\n]/g, '·') : this.localVal.value const encryptedVal = this.encryptPassword() this.localVal.value = encryptedVal this.change() }, + handleToggleEye () { + this.showInputVal = !this.showInputVal + }, handleSelectVariable (val) { this.localVal.value = val this.change() @@ -229,6 +240,12 @@ border-top-right-radius: 0; border-bottom-right-radius: 0; } + .value-edit-input { + display: flex; + align-items: center; + flex: 1; + position: relative; + } .value-input { flex: 1; padding: 0 10px; @@ -269,6 +286,18 @@ background-color: #ffffff; } } + .toggle-eye-icon { + position: absolute; + top: 50%; + right: 12px; + font-size: 14px; + color: #979ba5; + transform: translateY(-50%); + cursor: pointer; + &:hover { + color: #3a84ff; + } + } .select-var { flex: 1; border-top-left-radius: 0; From 41d3cfdf9e168e91b1e070de49b75d8e96d4606f Mon Sep 17 00:00:00 2001 From: waylon <1158341873@qq.com> Date: Tue, 10 Oct 2023 14:18:31 +0800 Subject: [PATCH 08/20] minor: version bumps to 3.30.2 --- app.yml | 2 +- app_desc.yaml | 2 +- config/default.py | 6 ++---- 3 files changed, 4 insertions(+), 6 deletions(-) diff --git a/app.yml b/app.yml index 9a385f9be3..f0cd49fbe6 100644 --- a/app.yml +++ b/app.yml @@ -6,7 +6,7 @@ is_use_celery: True author: 蓝鲸智云 introduction: 标准运维是通过一套成熟稳定的任务调度引擎,把在多系统间的工作整合到一个流程,助力运维实现跨系统调度自动化的SaaS应用。 introduction_en: SOPS is a SaaS application that utilizes a set of mature and stable task scheduling engines to help realize cross-system scheduling automation, and integrates the work among multiple systems into a single process. -version: 3.30.1 +version: 3.30.2 category: 运维工具 language_support: 中文 desktop: diff --git a/app_desc.yaml b/app_desc.yaml index 79a97d0580..f399ae89cf 100644 --- a/app_desc.yaml +++ b/app_desc.yaml @@ -1,5 +1,5 @@ spec_version: 2 -app_version: "3.30.1" +app_version: "3.30.2" app: region: default bk_app_code: bk_sops diff --git a/config/default.py b/config/default.py index 995b129b03..7f446844e6 100644 --- a/config/default.py +++ b/config/default.py @@ -211,7 +211,7 @@ # mako模板中: # 如果静态资源修改了以后,上线前改这个版本号即可 -STATIC_VERSION = "3.30.1" +STATIC_VERSION = "3.30.2" DEPLOY_DATETIME = datetime.datetime.now().strftime("%Y%m%d%H%M%S") STATICFILES_DIRS = [os.path.join(BASE_DIR, "static")] @@ -803,9 +803,7 @@ def check_engine_admin_permission(request, *args, **kwargs): }, }, }, - "SYMMETRIC_CIPHERS": { - "default": {"get_key_config": "gcloud.utils.crypto.get_default_symmetric_key_config"}, - }, + "SYMMETRIC_CIPHERS": {"default": {"get_key_config": "gcloud.utils.crypto.get_default_symmetric_key_config"}}, } # 启用框架内置数据加密 From 630b28e9d558474de9fe1719a72b91794fe8f7e6 Mon Sep 17 00:00:00 2001 From: hanshuaikang <1758504262@qq.com> Date: Tue, 10 Oct 2023 14:53:02 +0800 Subject: [PATCH 09/20] =?UTF-8?q?minor:=20=E8=A1=A5=E5=85=85node=5Fcallbac?= =?UTF-8?q?k=E7=9A=84=E6=97=A5=E5=BF=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- gcloud/apigw/views/node_callback.py | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/gcloud/apigw/views/node_callback.py b/gcloud/apigw/views/node_callback.py index b5f209d511..9afa01df98 100644 --- a/gcloud/apigw/views/node_callback.py +++ b/gcloud/apigw/views/node_callback.py @@ -13,18 +13,17 @@ import ujson as json +from apigw_manager.apigw.decorators import apigw_require +from blueapps.account.decorators import login_exempt from django.views.decorators.csrf import csrf_exempt from django.views.decorators.http import require_POST -from blueapps.account.decorators import login_exempt from gcloud import err_code -from gcloud.apigw.decorators import mark_request_whether_is_trust, return_json_response -from gcloud.apigw.decorators import project_inject -from gcloud.taskflow3.models import TaskFlowInstance +from gcloud.apigw.decorators import mark_request_whether_is_trust, project_inject, return_json_response from gcloud.apigw.views.utils import logger from gcloud.iam_auth.intercept import iam_intercept from gcloud.iam_auth.view_interceptors.apigw import TaskOperateInterceptor -from apigw_manager.apigw.decorators import apigw_require +from gcloud.taskflow3.models import TaskFlowInstance @login_exempt @@ -42,7 +41,7 @@ def node_callback(request, task_id, project_id): return {"result": False, "message": "invalid json format", "code": err_code.REQUEST_PARAM_INVALID.code} project = request.project - + logger.info("[apigw][node_callback] receive a node callback request, task_id={}, params={}".format(task_id, params)) try: task = TaskFlowInstance.objects.get(id=task_id, project_id=project.id) except TaskFlowInstance.DoesNotExist: @@ -59,4 +58,7 @@ def node_callback(request, task_id, project_id): callback_data = params.get("callback_data") version = params.get("version") - return task.callback(node_id, callback_data, version) + logger.info("[apigw][node_callback] node_callback start, task_id={}".format(task_id)) + result = task.callback(node_id, callback_data, version) + logger.info("[apigw][node_callback] node_callback finished, task_id={}".format(task_id)) + return result From f674472a8720225fd628991f6680783d3ec073c2 Mon Sep 17 00:00:00 2001 From: waylon <1158341873@qq.com> Date: Sun, 8 Oct 2023 21:55:15 +0800 Subject: [PATCH 10/20] minor: update pre-commit-config --- .pre-commit-config.yaml | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 61544f301d..9ad273b602 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -5,13 +5,12 @@ repos: hooks: - id: check-merge-conflict - repo: https://github.com/psf/black - rev: 22.3.0 + rev: stable hooks: - id: black - name: black - language: python + language_version: python3.6 - repo: https://github.com/pycqa/isort - rev: 5.11.5 + rev: 5.6.4 hooks: - id: isort args: ["--profile", "black", "--filter-files"] From ed9df6932139df497ec7d59eb43b42fd3aae2dc6 Mon Sep 17 00:00:00 2001 From: waylon <1158341873@qq.com> Date: Tue, 10 Oct 2023 19:52:47 +0800 Subject: [PATCH 11/20] =?UTF-8?q?minor:=20=E5=90=8E=E7=AB=AF=E5=9B=BD?= =?UTF-8?q?=E9=99=85=E5=8C=96=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- locale/en/LC_MESSAGES/django.mo | Bin 113735 -> 118889 bytes locale/en/LC_MESSAGES/django.po | 2 +- locale/zh_hans/LC_MESSAGES/django.po | 2 +- .../components/atoms/job/execute_task/v1_0.js | 2 +- .../components/atoms/job/execute_task/v1_1.js | 4 ++-- .../components/atoms/job/execute_task/v1_2.js | 4 ++-- .../atoms/job/fast_execute_script/v1_1.js | 2 +- .../atoms/job/fast_execute_script/v1_2.js | 2 +- 8 files changed, 9 insertions(+), 9 deletions(-) diff --git a/locale/en/LC_MESSAGES/django.mo b/locale/en/LC_MESSAGES/django.mo index d3f262075143a2d30b51e84ee07c9db09ad35094..58e61dfdd2cdda35553a562a61cb2f216f06e1d4 100644 GIT binary patch delta 25730 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前往作业平台(JOB)查看详情" -msgstr "JOB task failed,GOTO(JOB)" +msgstr "JOB task failed,GOTO(JOB)" #: pipeline_plugins/components/collections/sites/open/job/base.py:537 #: pipeline_plugins/components/collections/sites/open/job/base.py:778 diff --git a/locale/zh_hans/LC_MESSAGES/django.po b/locale/zh_hans/LC_MESSAGES/django.po index 16de7330bd..42115435ea 100644 --- a/locale/zh_hans/LC_MESSAGES/django.po +++ b/locale/zh_hans/LC_MESSAGES/django.po @@ -3566,7 +3566,7 @@ msgstr " | get_job_instance_log" #: pipeline_plugins/components/collections/sites/open/job/base.py:801 #, fuzzy msgid "任务执行失败,前往作业平台(JOB)查看详情" -msgstr "任务执行失败,前往作业平台(JOB)查看详情" +msgstr "任务执行失败,前往作业平台(JOB)查看详情" #: pipeline_plugins/components/collections/sites/open/job/base.py:537 #: pipeline_plugins/components/collections/sites/open/job/base.py:778 diff --git a/pipeline_plugins/components/static/components/atoms/job/execute_task/v1_0.js b/pipeline_plugins/components/static/components/atoms/job/execute_task/v1_0.js index 4142a6f4b1..6c4aeef6b2 100644 --- a/pipeline_plugins/components/static/components/atoms/job/execute_task/v1_0.js +++ b/pipeline_plugins/components/static/components/atoms/job/execute_task/v1_0.js @@ -111,7 +111,7 @@ attrs: { hookable: false, type: "primary", - title: '刷新', + title: gettext('刷新'), size: "normal", cols: 1, formViewHidden: true diff --git a/pipeline_plugins/components/static/components/atoms/job/execute_task/v1_1.js b/pipeline_plugins/components/static/components/atoms/job/execute_task/v1_1.js index 91b9f152a1..211799acfa 100644 --- a/pipeline_plugins/components/static/components/atoms/job/execute_task/v1_1.js +++ b/pipeline_plugins/components/static/components/atoms/job/execute_task/v1_1.js @@ -122,7 +122,7 @@ attrs: { hookable: false, type: "primary", - title: '刷新', + title: gettext('刷新'), size: "normal", cols: 1, formViewHidden: true @@ -393,7 +393,7 @@ attrs: { hookable: false, type: "primary", - title: '刷新', + title: gettext('刷新'), size: "normal", cols: 1, formViewHidden: true diff --git a/pipeline_plugins/components/static/components/atoms/job/execute_task/v1_2.js b/pipeline_plugins/components/static/components/atoms/job/execute_task/v1_2.js index 9d9d9bde1e..d646cc4020 100644 --- a/pipeline_plugins/components/static/components/atoms/job/execute_task/v1_2.js +++ b/pipeline_plugins/components/static/components/atoms/job/execute_task/v1_2.js @@ -122,7 +122,7 @@ attrs: { hookable: false, type: "primary", - title: '刷新', + title: gettext('刷新'), size: "normal", cols: 1, formViewHidden: true @@ -341,7 +341,7 @@ attrs: { hookable: false, type: "primary", - title: '刷新', + title: gettext('刷新'), size: "normal", cols: 1, formViewHidden: true diff --git a/pipeline_plugins/components/static/components/atoms/job/fast_execute_script/v1_1.js b/pipeline_plugins/components/static/components/atoms/job/fast_execute_script/v1_1.js index ccae0ef1b8..1a9816cd24 100644 --- a/pipeline_plugins/components/static/components/atoms/job/fast_execute_script/v1_1.js +++ b/pipeline_plugins/components/static/components/atoms/job/fast_execute_script/v1_1.js @@ -743,7 +743,7 @@ job_start attrs: { hookable: false, type: "primary", - title: '刷新', + title: gettext('刷新'), size: "normal", cols: 1, formViewHidden: true diff --git a/pipeline_plugins/components/static/components/atoms/job/fast_execute_script/v1_2.js b/pipeline_plugins/components/static/components/atoms/job/fast_execute_script/v1_2.js index 292e7f1704..fafa4f23f5 100644 --- a/pipeline_plugins/components/static/components/atoms/job/fast_execute_script/v1_2.js +++ b/pipeline_plugins/components/static/components/atoms/job/fast_execute_script/v1_2.js @@ -975,7 +975,7 @@ job_start attrs: { hookable: false, type: "primary", - title: '刷新', + title: gettext('刷新'), size: "normal", cols: 1, formViewHidden: true From 03fbb6a924e7eb230bbb3849afc688a669a52d8b Mon Sep 17 00:00:00 2001 From: hanshuaikang <1758504262@qq.com> Date: Tue, 26 Sep 2023 19:53:15 +0800 Subject: [PATCH 12/20] =?UTF-8?q?minor:=20job=20=E7=B1=BB=E8=87=AA?= =?UTF-8?q?=E5=8A=A8=E5=8E=BB=E9=99=A4=E7=94=A8=E6=88=B7=E8=BE=93=E5=85=A5?= =?UTF-8?q?=E7=9A=84=E5=B7=A6=E5=8F=B3=E7=A9=BA=E6=A0=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../open/job/fast_execute_script/v1_2.py | 24 +++++++++---------- .../job/local_content_upload/base_service.py | 17 +++++++++---- .../sites/open/job/push_local_files/v2_1.py | 5 ++-- 3 files changed, 26 insertions(+), 20 deletions(-) diff --git a/pipeline_plugins/components/collections/sites/open/job/fast_execute_script/v1_2.py b/pipeline_plugins/components/collections/sites/open/job/fast_execute_script/v1_2.py index 27ba307076..702a33962c 100644 --- a/pipeline_plugins/components/collections/sites/open/job/fast_execute_script/v1_2.py +++ b/pipeline_plugins/components/collections/sites/open/job/fast_execute_script/v1_2.py @@ -33,23 +33,18 @@ from django.utils import translation from django.utils.translation import ugettext_lazy as _ - -from pipeline.core.flow.io import ( - StringItemSchema, - ObjectItemSchema, - BooleanItemSchema, -) from pipeline.component_framework.component import Component +from pipeline.core.flow.io import BooleanItemSchema, ObjectItemSchema, StringItemSchema from api.utils.request import batch_request -from gcloud.exceptions import ApiRequestError -from pipeline_plugins.components.collections.sites.open.job import JobService, GetJobTargetServerMixin -from pipeline_plugins.components.utils import get_job_instance_url, get_node_callback_url -from ..base import GetJobHistoryResultMixin, get_job_tagged_ip_dict_complex - from gcloud.conf import settings from gcloud.constants import JobBizScopeType +from gcloud.exceptions import ApiRequestError from gcloud.utils.handlers import handle_api_error +from pipeline_plugins.components.collections.sites.open.job import GetJobTargetServerMixin, JobService +from pipeline_plugins.components.utils import get_job_instance_url, get_node_callback_url + +from ..base import GetJobHistoryResultMixin, get_job_tagged_ip_dict_complex __group_name__ = _("作业平台(JOB)") @@ -119,7 +114,10 @@ def inputs_format(self): schema=StringItemSchema(description=_("执行脚本的目标机器 IP,多个用英文逗号 `,` 分隔")), ), self.InputItem( - name=_("目标账户"), key="job_account", type="string", schema=StringItemSchema(description=_("执行脚本的目标机器账户")), + name=_("目标账户"), + key="job_account", + type="string", + schema=StringItemSchema(description=_("执行脚本的目标机器账户")), ), self.InputItem( name=_("滚动执行"), @@ -217,7 +215,7 @@ def execute(self, data, parent_data): "bk_scope_id": str(biz_cc_id), "bk_biz_id": biz_cc_id, "timeout": data.get_one_of_inputs("job_script_timeout"), - "account_alias": data.get_one_of_inputs("job_account"), + "account_alias": data.get_one_of_inputs("job_account").strip(), "target_server": target_server, "callback_url": get_node_callback_url(self.root_pipeline_id, self.id, getattr(self, "version", "")), } diff --git a/pipeline_plugins/components/collections/sites/open/job/local_content_upload/base_service.py b/pipeline_plugins/components/collections/sites/open/job/local_content_upload/base_service.py index d73b74796e..b30e9e96a1 100644 --- a/pipeline_plugins/components/collections/sites/open/job/local_content_upload/base_service.py +++ b/pipeline_plugins/components/collections/sites/open/job/local_content_upload/base_service.py @@ -39,10 +39,16 @@ class BaseJobLocalContentUploadService(Service, GetJobTargetServerMixin): def inputs_format(self): return [ self.InputItem( - name=_("生成文件名[后缀]"), key="local_name", type="string", schema=StringItemSchema(description=_("生成文件名")), + name=_("生成文件名[后缀]"), + key="local_name", + type="string", + schema=StringItemSchema(description=_("生成文件名")), ), self.InputItem( - name=_("文本内容"), key="local_content", type="string", schema=StringItemSchema(description=_("文本内容")), + name=_("文本内容"), + key="local_content", + type="string", + schema=StringItemSchema(description=_("文本内容")), ), self.InputItem( name=_("目标IP"), @@ -59,7 +65,10 @@ def inputs_format(self): schema=StringItemSchema(description=_("请输入在蓝鲸作业平台上注册的账户名")), ), self.InputItem( - name=_("目标路径"), key="file_path", type="string", schema=StringItemSchema(description=_("目标路径")), + name=_("目标路径"), + key="file_path", + type="string", + schema=StringItemSchema(description=_("目标路径")), ), self.InputItem( name=_("是否允许跨业务"), @@ -113,7 +122,7 @@ def get_job_kwargs(self, biz_cc_id, data, target_server): "bk_scope_type": JobBizScopeType.BIZ.value, "bk_scope_id": str(biz_cc_id), "bk_biz_id": biz_cc_id, - "account_alias": data.get_one_of_inputs("file_account"), + "account_alias": data.get_one_of_inputs("file_account").strip(), "file_target_path": data.get_one_of_inputs("file_path"), "file_list": [ { diff --git a/pipeline_plugins/components/collections/sites/open/job/push_local_files/v2_1.py b/pipeline_plugins/components/collections/sites/open/job/push_local_files/v2_1.py index a282cf6d9a..79262b07bc 100644 --- a/pipeline_plugins/components/collections/sites/open/job/push_local_files/v2_1.py +++ b/pipeline_plugins/components/collections/sites/open/job/push_local_files/v2_1.py @@ -12,14 +12,13 @@ """ from django.utils.translation import ugettext_lazy as _ - from pipeline.component_framework.component import Component from pipeline.core.flow.io import BooleanItemSchema, StringItemSchema +from gcloud.conf import settings from pipeline_plugins.components.collections.sites.open.job.push_local_files.base_service import ( BaseJobPushLocalFilesService, ) -from gcloud.conf import settings __group_name__ = _("作业平台(JOB)") @@ -67,7 +66,7 @@ def get_params_list(self, client, data, target_server, local_files_and_target_pa job_rolling_mode = job_rolling_config.get("job_rolling_mode") rolling_config = {"expression": job_rolling_expression, "mode": job_rolling_mode} - target_account = data.inputs.job_target_account + target_account = data.inputs.job_target_account.strip() params_list = [ { "esb_client": client, From b1918b30ae73ffa18c1e306b2b04158e892bf39c Mon Sep 17 00:00:00 2001 From: waylon <1158341873@qq.com> Date: Wed, 11 Oct 2023 17:43:57 +0800 Subject: [PATCH 13/20] =?UTF-8?q?minor:=20=E5=90=8E=E7=AB=AF=E5=9B=BD?= =?UTF-8?q?=E9=99=85=E5=8C=96=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- locale/en/LC_MESSAGES/django.mo | Bin 118889 -> 113747 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/locale/en/LC_MESSAGES/django.mo b/locale/en/LC_MESSAGES/django.mo index 58e61dfdd2cdda35553a562a61cb2f216f06e1d4..bac0d2db4412d398ce8c41089cb230dd8fd30c3f 100644 GIT binary patch delta 18845 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

I&1Y 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%0A{u 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 qjY From c87d099b8f3758fd31ea7ba6b3c96a39596dd4fa Mon Sep 17 00:00:00 2001 From: v_xugzhou <941071842@qq.com> Date: Wed, 11 Oct 2023 17:38:17 +0800 Subject: [PATCH 14/20] =?UTF-8?q?optimization:=20=E9=AA=8C=E6=94=B6?= =?UTF-8?q?=E4=BC=9A=E9=97=AE=E9=A2=98=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../desktop/src/assets/fonts/bksops-icon.eot | Bin 40776 -> 40768 bytes .../desktop/src/assets/fonts/bksops-icon.svg | 2 +- .../desktop/src/assets/fonts/bksops-icon.ttf | Bin 40608 -> 40600 bytes .../desktop/src/assets/fonts/bksops-icon.woff | Bin 24000 -> 23972 bytes .../common/RenderForm/FormGroup.vue | 27 ++++++-- .../components/common/RenderForm/FormItem.vue | 18 +++-- .../common/RenderForm/tags/TagCodeEditor.vue | 14 ++-- .../common/RenderForm/tags/TagInput.vue | 62 +++++++++++------- .../common/RenderForm/tags/TagTextarea.vue | 62 +++++++++++------- frontend/desktop/src/config/i18n/cn.js | 5 +- frontend/desktop/src/config/i18n/en.js | 5 +- .../pages/task/TaskExecute/ExecuteInfo.vue | 19 +++--- .../ExecuteInfo/ExecuteInfoForm.vue | 2 +- .../TaskExecute/ExecuteInfo/ExecuteRecord.vue | 18 ++--- .../TemplateEdit/NodeConfig/InputParams.vue | 2 +- .../TabGlobalVariables/VariableCitedList.vue | 2 +- frontend/desktop/src/scss/iconfont.scss | 6 +- 17 files changed, 156 insertions(+), 88 deletions(-) diff --git a/frontend/desktop/src/assets/fonts/bksops-icon.eot b/frontend/desktop/src/assets/fonts/bksops-icon.eot index d8c71d9d0fd5dd7bcc870cccdd60cc1173120e0e..0ed6cf8ed2cc224e7cfc22d8a8d6d9c66f5c7cd3 100644 GIT binary patch delta 1001 zcmX|9OKcle6utM&yf+`uc>I}Z($|0P1Bl-NXdk}3`qs++FPE+W zq;>(``J;cnw_Lt-VPor`+%pGH9S*tgCjfGP_2N=*(^~xzAo(Kiy}s6aa~=2K0k1PW zcl?#!+WAen9|QR47T3SGe(}}U&h(!99pIBw(IP&Y+uOLabIv&R7sN!a2e|uunlE|8 z(GASvL9~nKP>9N;gVL~1{wD1sB~UIC_?hB|w}hL3yaIBAcSqF}XZ2xUBv<*p4dYzr zN1xG?f_P7g_Gz2b;bD}N=jV}++pq|IxB&0Mmv9S34u&}npQG{+RXjo+pTI6I;tKZh zGF~3O&(6lE1aMCp9we_IJ{Yc~mj?rY!yVx_zEBGuhiBm`+=Tl8VbBa~j_KG=V@7Dy z+ZZ-#k}27a#SAP=)`NO5gMsA}%ZwArath6G2GdN6qh;Dox{ZxGpJTOV@v&)fD`y`a zJCCO03!znDqkzfzXb>f2hfkUvbfRmKKL~?KKAMn%CS?)_cd+Bwu=x(nd8~&c=8thN z@+E{qqgEaHN6DNf2*V5tUMnbPV|FWW5!-=)LI#m2c&}!c;BJTKMf4Qw3IO=!O|1qj*h8S{{`UWi6>0z8z06iE2uP zhTX;>rZ^i?1{K-pys8i{gszVxjfuUyOY;*Ebb&FG*DHXbhfbV=S?Q)Nvh~(>5I-| zpC($}Aba{OVu{dWt?C=Cj84T8qEVP#SV)XjODG$gADFt#NHP9%f+_KIX}dFLpy8S{ jzn#q_T~(sYOS$FiIZ1a7X2hibUm7lbd{+@e{>T3V6CSS; delta 987 zcmXw%OKcle6o${a^Y+-|jOS&$j$_Zn89Ony<9O^q{AdzV1uTe)+8}|H)@>4kl(bQc zsvwZuE?5AYM#Dqh&>|rgh_I+PEKupPLKHTrt=Oe(KnfBm zw*exz0j@k=Tj?yjk3P<9KTgc=Y5kjY-wy!f=k@bvJ68wSzX4F^Y46fTXKNF`gTJYd zQf}&8XJh56xF!R+wap1M~k7Ar$sk2p8-+_l)nN%%VGSCHzliJc=i9372sd zw|XD&FUlM}$wRL9yZQ#=e(#*N-0k-J{ZZ~NlZU5Z7TRzHz65$L%dOTXOvAKHOD!;7 zrHM6fLg#72;KS&Qconze7SL6b#LyKY7?xA@>=BI@6f|_x(wgX1=p3!Gl|;)NL_LW^ z$O}}|^JD0llv%9}dX?Itq2ZARQYhnO%9cTyH0V$IIfg;euCO7&ZbSJ3HrE!Du>H4Mj7>nj0LLoj#+4#R1I} z7oQNHxj4gx)ngpGfmFRcwy^Y^G%dvw?5L28Ur1_(%*)X<+5b~1y)-|!I+F=hy2mD4 z2Kh}6sZ&m&A@4T_7ABpF!;?HJ(ok%;@F45PMZ*w-TC9Bk#Pd38cAQT<%%rSzFd&Fd zH0|9R4yd*+(h;h5oE!YfPFuDiN>0o!-^)mmAxk1UhJpvU`xGa!swo5`@dIAzuGzle yIU9tO8KK&qx!z8x0zZzZ7h5M!nz`9=A}h;hzK%x%5?j&$dN04fE3qE^tN#U72fnia diff --git a/frontend/desktop/src/assets/fonts/bksops-icon.svg b/frontend/desktop/src/assets/fonts/bksops-icon.svg index 0b4dc054f8..e1c5106cd9 100644 --- a/frontend/desktop/src/assets/fonts/bksops-icon.svg +++ b/frontend/desktop/src/assets/fonts/bksops-icon.svg @@ -587,7 +587,7 @@ - + diff --git a/frontend/desktop/src/assets/fonts/bksops-icon.ttf b/frontend/desktop/src/assets/fonts/bksops-icon.ttf index ed11d935cbc610b9610e58427e97ed01b427728f..59bf7604dd089fd7a403e6546f81da738e47b88c 100644 GIT binary patch delta 1007 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 delta 3589 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 .rf-tag-form { + margin-right: 58px; + } + .hook-icon { + padding-right: 3px !important; + } } .rf-group-name { display: block @@ -446,15 +454,17 @@ display: flex; align-items: center; justify-content: center; - padding: 0 8px; height: 32px; background: #f0f1f5; border-radius: 2px; + cursor: pointer; z-index: 1; - .hook-icon { - font-size: 16px; + .hook-icon, + .render-skip-icon { + height: 32px; + line-height: 32px; + font-size: 12px; color: #979ba5; - cursor: pointer; &.disabled { color: #c4c6cc; cursor: not-allowed; @@ -464,8 +474,13 @@ } } .hook-icon { + line-height: 33px; + padding: 0 8px; font-size: 16px; } + .render-skip-icon { + padding: 0 8px 0 3px; + } .icon-angle-up-fill { font-size: 12px; color: #c4c6cc; diff --git a/frontend/desktop/src/components/common/RenderForm/FormItem.vue b/frontend/desktop/src/components/common/RenderForm/FormItem.vue index dae623311b..6d53b47681 100644 --- a/frontend/desktop/src/components/common/RenderForm/FormItem.vue +++ b/frontend/desktop/src/components/common/RenderForm/FormItem.vue @@ -477,12 +477,15 @@ } &.rf-has-hook { & > .rf-tag-form { - margin-right: 45px; + margin-right: 40px; } } &.show-render { > .rf-tag-form { - margin-right: 64px; + margin-right: 58px; + } + .hook-icon { + padding-right: 3px !important; } } &.rf-col-layout { @@ -548,16 +551,17 @@ display: flex; align-items: center; justify-content: space-between; - padding: 0 8px; height: 32px; background: #f0f1f5; border-radius: 2px; z-index: 1; + cursor: pointer; .hook-icon, .render-skip-icon { - font-size: 14px; + height: 32px; + line-height: 32px; + font-size: 12px; color: #979ba5; - cursor: pointer; &.disabled { color: #c4c6cc; cursor: not-allowed; @@ -567,10 +571,12 @@ } } .hook-icon { + line-height: 31px; + padding: 0 8px; font-size: 16px; } .render-skip-icon { - margin-left: 7px; + padding: 0 8px 0 3px; } .icon-angle-up-fill { font-size: 12px; diff --git a/frontend/desktop/src/components/common/RenderForm/tags/TagCodeEditor.vue b/frontend/desktop/src/components/common/RenderForm/tags/TagCodeEditor.vue index 520428a8f5..e438f40b05 100644 --- a/frontend/desktop/src/components/common/RenderForm/tags/TagCodeEditor.vue +++ b/frontend/desktop/src/components/common/RenderForm/tags/TagCodeEditor.vue @@ -213,12 +213,14 @@ } }) }) - } else if (this.decorationsMap[lineNumber]) { - this.decorationsMap[lineNumber].forEach(decorations => { - monacoInstance.deltaDecorations( - [...decorations], - [] - ) + } else { + Object.keys(this.decorationsMap).forEach(key => { + this.decorationsMap[key].forEach(decorations => { + monacoInstance.deltaDecorations( + [...decorations], + [] + ) + }) }) this.decorationsMap = {} } diff --git a/frontend/desktop/src/components/common/RenderForm/tags/TagInput.vue b/frontend/desktop/src/components/common/RenderForm/tags/TagInput.vue index f3679cd257..3b772babee 100644 --- a/frontend/desktop/src/components/common/RenderForm/tags/TagInput.vue +++ b/frontend/desktop/src/components/common/RenderForm/tags/TagInput.vue @@ -48,11 +48,11 @@

  • - {{ item }} + :key="item.key" + :class="{ 'is-hover': hoverKey === item.key }" + @click.stop="onSelectVal(item.key)"> + {{ item.key }} + {{ item.name }}
  • @@ -122,14 +122,14 @@ }), constantArr: { get () { - let Keylist = [] + let KeyList = [] if (this.constants) { - Keylist = [...Object.keys(this.constants)] + KeyList = [...Object.values(this.constants)] } if (this.internalVariable) { - Keylist = [...Keylist, ...Object.keys(this.internalVariable)] + KeyList = [...KeyList, ...Object.values(this.internalVariable)] } - return Keylist + return KeyList }, set (val) { this.varList = val @@ -330,7 +330,7 @@ matchResult = [matchText] } if (matchResult && matchResult[0]) { - this.varList = this.constantArr.filter(item => item.indexOf(matchText) > -1) + this.varList = this.constantArr.filter(item => item.key.indexOf(matchText) > -1) // 计算变量下拉列表的left this.isListOpen = false if (this.varList.length) { @@ -352,11 +352,10 @@ this.$el.appendChild(newDom) const focusValueWidth = newDom.offsetWidth || 0 this.$el.removeChild(newDom) - let right = inputWidth - 238 - previousDomLeft - previousDomWidth - focusValueWidth - right = right > 0 ? right : 0 - this.varListPositionRight = right this.$nextTick(() => { - const { height: varListHeight } = document.querySelector('.rf-select-list').getBoundingClientRect() + const { width: varListWidth, height: varListHeight } = document.querySelector('.rf-select-list').getBoundingClientRect() + let right = inputWidth - varListWidth - previousDomLeft - previousDomWidth - focusValueWidth + right = right > 0 ? right : 0 const top = window.innerHeight < inputTop + 30 + varListHeight + 50 ? -95 : 30 this.varListPosition = `right: ${right}px; top: ${top}px` }) @@ -382,9 +381,14 @@ // 获取行内纯文本 const divInputDom = this.$el.querySelector('.div-input') let inputValue = divInputDom.textContent + inputValue.replace(' ', ' ') if (divInputDom.childNodes.length) { inputValue = Array.from(divInputDom.childNodes).map(item => { - return item.type === 'button' ? item.value : item.textContent + return item.type === 'button' + ? item.value + : item.textContent.trim() === '' + ? ' ' + : item.textContent.replace(/ /g, ' ') }).join('') } this.input.value = inputValue @@ -410,7 +414,7 @@ let isExistVar = false if ($0) { isExistVar = this.constantArr.some(item => { - const varText = item.slice(2, -1) + const varText = item.key.slice(2, -1) if ($0.indexOf(varText) > -1) { const regexp = new RegExp(`^(.*\\W|\\W)?${varText}(\\W|\\W.*)?$`) return regexp.test($0) @@ -451,12 +455,12 @@ if (len) { event.preventDefault() event.stopPropagation() - let curIndex = this.varList.findIndex(item => item === this.hoverKey) + let curIndex = this.varList.findIndex(item => item.key === this.hoverKey) curIndex = event.code === 'ArrowDown' ? curIndex + 1 : curIndex - 1 curIndex = curIndex > len - 1 ? 0 : (curIndex < 0 ? len - 1 : curIndex) const option = this.varList[curIndex] if (option) { - this.hoverKey = option + this.hoverKey = option.key const selectDom = this.$el.querySelector('.rf-select-content') const hoverItemDom = selectDom.querySelector('.is-hover') if (hoverItemDom) { @@ -487,12 +491,17 @@ position: absolute; top: 30px; right: 0; - width: 238px; + max-width: 600px; background: #ffffff; + border: 1px solid #dcdee5; border-radius: 2px; - box-shadow: 0 0 8px 1px rgba(0, 0, 0, 0.1); + box-shadow: 0 3px 9px 0 rgba(0,0,0,.1); overflow-y: hidden; z-index: 100; + .name { + color: #c4c6cc; + margin-left: 16px; + } } .rf-select-content { max-height: 100px; @@ -501,12 +510,21 @@ @include scrollbar; } .rf-select-item { + display: flex; + align-items: center; padding: 0 10px; line-height: 32px; font-size: 12px; cursor: pointer; - overflow: hidden; - text-overflow: ellipsis; + > span { + flex-shrink: 0; + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; + } + .name { + max-width: 250px; + } &.is-hover, &:hover { background: #f5f7fa; diff --git a/frontend/desktop/src/components/common/RenderForm/tags/TagTextarea.vue b/frontend/desktop/src/components/common/RenderForm/tags/TagTextarea.vue index 4d16f302c8..c3f3832971 100644 --- a/frontend/desktop/src/components/common/RenderForm/tags/TagTextarea.vue +++ b/frontend/desktop/src/components/common/RenderForm/tags/TagTextarea.vue @@ -38,11 +38,11 @@
  • - {{ item }} + :key="item.key" + :class="{ 'is-hover': hoverKey === item.key }" + @click.stop="onSelectVal(item.key)"> + {{ item.key }} + {{ item.name }}
  • @@ -107,10 +107,10 @@ get () { let KeyList = [] if (this.constants) { - KeyList = [...Object.keys(this.constants)] + KeyList = [...Object.values(this.constants)] } if (this.internalVariable) { - KeyList = [...KeyList, ...Object.keys(this.internalVariable)] + KeyList = [...KeyList, ...Object.values(this.internalVariable)] } return KeyList }, @@ -277,7 +277,7 @@ } // 判断是否为变量格式 if (matchText === '$' || /^\${[a-zA-Z_]*[\w|.]*/.test(matchText)) { - this.varList = this.constantArr.filter(item => item.indexOf(matchText) > -1) + this.varList = this.constantArr.filter(item => item.key.indexOf(matchText) > -1) // 计算变量下拉列表的坐标 this.isListOpen = false if (this.varList.length) { @@ -307,13 +307,13 @@ const focusValueWidth = newDom.offsetWidth || 0 const focusValueHeight = newDom.offsetHeight || 0 this.$el.removeChild(newDom) - let popLeft = previousDomLeft + previousDomWidth + focusValueWidth - if (popLeft > inputWidth - 238) { - popLeft = inputWidth - 238 - } - let popTop = textNodeTop - inputTop + focusValueHeight + 2 // 2px是为了使光标和联想列表隔开 this.$nextTick(() => { - const { height: varListHeight } = document.querySelector('.rf-select-list').getBoundingClientRect() + const { height: varListHeight, width: varListWidth } = document.querySelector('.rf-select-list').getBoundingClientRect() + let popLeft = previousDomLeft + previousDomWidth + focusValueWidth + if (popLeft > inputWidth - varListWidth) { + popLeft = inputWidth - varListWidth + } + let popTop = textNodeTop - inputTop + focusValueHeight + 2 // 2px是为了使光标和联想列表隔开 if (window.innerHeight < textNodeTop + focusValueHeight + varListHeight + 50) { popTop = textNodeTop - inputTop - varListHeight - 2 } @@ -345,7 +345,11 @@ let domValue = dom.textContent || '\n' if (dom.childNodes.length) { domValue = Array.from(dom.childNodes).map(item => { - return item.type === 'button' ? item.value : item.textContent + return item.type === 'button' + ? item.value + : item.textContent.trim() === '' + ? ' ' + : item.textContent.replace(/ /g, ' ') }).join('') } return domValue @@ -376,7 +380,7 @@ let isExistVar = false if ($0) { isExistVar = this.constantArr.some(item => { - const varText = item.slice(2, -1) + const varText = item.key.slice(2, -1) if ($0.indexOf(varText) > -1) { const regexp = new RegExp(`^(.*\\W|\\W)?${varText}(\\W|\\W.*)?$`) return regexp.test($0) @@ -436,12 +440,12 @@ if (len) { event.preventDefault() event.stopPropagation() - let curIndex = this.varList.findIndex(item => item === this.hoverKey) + let curIndex = this.varList.findIndex(item => item.key === this.hoverKey) curIndex = event.code === 'ArrowDown' ? curIndex + 1 : curIndex - 1 curIndex = curIndex > len - 1 ? 0 : (curIndex < 0 ? len - 1 : curIndex) const option = this.varList[curIndex] if (option) { - this.hoverKey = option + this.hoverKey = option.key const selectDom = this.$el.querySelector('.rf-select-content') const hoverItemDom = selectDom.querySelector('.is-hover') if (hoverItemDom) { @@ -471,12 +475,17 @@ position: absolute; top: 40px; right: 0; - width: 238px; + max-width: 600px; background: #ffffff; + border: 1px solid #dcdee5; border-radius: 2px; - box-shadow: 0 0 8px 1px rgba(0, 0, 0, 0.1); + box-shadow: 0 3px 9px 0 rgba(0,0,0,.1); overflow-y: hidden; z-index: 100; + .name { + color: #c4c6cc; + margin-left: 16px; + } } .rf-select-content { max-height: 100px; @@ -485,12 +494,21 @@ @include scrollbar; } .rf-select-item { + display: flex; + align-items: center; padding: 0 10px; line-height: 32px; font-size: 12px; cursor: pointer; - overflow: hidden; - text-overflow: ellipsis; + > span { + flex-shrink: 0; + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; + } + .name { + max-width: 250px; + } &.is-hover, &:hover { background: #f5f7fa; diff --git a/frontend/desktop/src/config/i18n/cn.js b/frontend/desktop/src/config/i18n/cn.js index fff8ebb805..b69269f734 100644 --- a/frontend/desktop/src/config/i18n/cn.js +++ b/frontend/desktop/src/config/i18n/cn.js @@ -1788,7 +1788,10 @@ const cn = { '清除所有IP': '清除所有IP', '清除异常IP': '清除异常IP', '节点输入型变量仅支持从节点"取消使用变量"来删除': '节点输入型变量仅支持从节点"取消使用变量"来删除', - '节点输出型变量仅支持从节点"取消接收输出"来删除': '节点输出型变量仅支持从节点"取消接收输出"来删除 ' + '节点输出型变量仅支持从节点"取消接收输出"来删除': '节点输出型变量仅支持从节点"取消接收输出"来删除', + '刷新': '刷新', + 'exFailedText': '节点执行失败,请前往{0}查看错误原因', + 'exFailedText_调用日志': '调用日志' } export default cn diff --git a/frontend/desktop/src/config/i18n/en.js b/frontend/desktop/src/config/i18n/en.js index ecff355d91..ad57c28e8d 100644 --- a/frontend/desktop/src/config/i18n/en.js +++ b/frontend/desktop/src/config/i18n/en.js @@ -1822,7 +1822,10 @@ const en = { '清除所有IP': 'Clear all IPs', '清除异常IP': 'Clear abnormal IP', '节点输入型变量仅支持从节点"取消使用变量"来删除': 'Node input variables can only be deleted by the node "Cancel Using variable"', - '节点输出型变量仅支持从节点"取消接收输出"来删除': 'Node output variables can only be deleted by the node "Cancel Receiving Output"' + '节点输出型变量仅支持从节点"取消接收输出"来删除': 'Node output variables can only be deleted by the node "Cancel Receiving Output"', + '刷新': 'Refresh', + 'exFailedText': 'Node execution failed. Please go to the {0} to check the error reason.', + 'exFailedText_调用日志': 'call log' } export default en diff --git a/frontend/desktop/src/pages/task/TaskExecute/ExecuteInfo.vue b/frontend/desktop/src/pages/task/TaskExecute/ExecuteInfo.vue index d654c1de1a..14df3b33f6 100644 --- a/frontend/desktop/src/pages/task/TaskExecute/ExecuteInfo.vue +++ b/frontend/desktop/src/pages/task/TaskExecute/ExecuteInfo.vue @@ -130,7 +130,8 @@ :execute-info="executeRecord" :node-detail-config="nodeDetailConfig" :not-performed-sub-node="notPerformedSubNode" - :is-sub-process-node="isSubProcessNode"> + :is-sub-process-node="isSubProcessNode" + @onTabChange="onTabChange">
    diff --git a/frontend/desktop/src/scss/iconfont.scss b/frontend/desktop/src/scss/iconfont.scss index bad7e07801..eb48bed614 100644 --- a/frontend/desktop/src/scss/iconfont.scss +++ b/frontend/desktop/src/scss/iconfont.scss @@ -590,9 +590,9 @@ .common-icon-full-screen:before { content: "\e202"; } -.common-icon-variable-hook:before { - content: "\e205"; -} .common-icon-converge-node:before { content: "\e204"; } +.common-icon-variable-hook:before { + content: "\e207"; +} From 7a8d18cf479ed5c4eb8ab17db2f23941515371cf Mon Sep 17 00:00:00 2001 From: v_xugzhou <941071842@qq.com> Date: Fri, 13 Oct 2023 16:45:26 +0800 Subject: [PATCH 15/20] =?UTF-8?q?optimization:=20=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E8=87=AA=E5=AE=9A=E4=B9=89=E5=B1=9E=E6=80=A7&&=E4=BC=98?= =?UTF-8?q?=E5=8C=96=E4=BB=BB=E5=8A=A1=E8=8A=82=E7=82=B9=E8=AF=A6=E6=83=85?= =?UTF-8?q?=E6=8B=96=E6=8B=BD=E5=AE=BD=E5=BA=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/components/common/RenderForm/tags/TagInput.vue | 1 + .../components/common/RenderForm/tags/TagTextarea.vue | 1 + frontend/desktop/src/pages/task/PeriodicList/index.vue | 3 ++- .../desktop/src/pages/task/TaskExecute/ExecuteInfo.vue | 5 +++-- .../desktop/src/pages/task/TaskExecute/TaskOperation.vue | 9 ++++++++- 5 files changed, 15 insertions(+), 4 deletions(-) diff --git a/frontend/desktop/src/components/common/RenderForm/tags/TagInput.vue b/frontend/desktop/src/components/common/RenderForm/tags/TagInput.vue index 3b772babee..b5b38ea8e5 100644 --- a/frontend/desktop/src/components/common/RenderForm/tags/TagInput.vue +++ b/frontend/desktop/src/components/common/RenderForm/tags/TagInput.vue @@ -32,6 +32,7 @@ }" :contenteditable="!isDisabled" :data-placeholder="placeholder" + data-test-name="formTag_input_divInput" v-bk-clickoutside="handleClickOutSide" @mouseup="handleInputMouseUp" @focus="handleInputFocus" diff --git a/frontend/desktop/src/components/common/RenderForm/tags/TagTextarea.vue b/frontend/desktop/src/components/common/RenderForm/tags/TagTextarea.vue index c3f3832971..0ec4ac324d 100644 --- a/frontend/desktop/src/components/common/RenderForm/tags/TagTextarea.vue +++ b/frontend/desktop/src/components/common/RenderForm/tags/TagTextarea.vue @@ -21,6 +21,7 @@ }" :contenteditable="!isDisabled" :data-placeholder="placeholder" + data-test-name="formTag_textarea_divInput" v-bk-clickoutside="handleClickOutSide" @mouseup="handleInputMouseUp" @focus="handleInputFocus" diff --git a/frontend/desktop/src/pages/task/PeriodicList/index.vue b/frontend/desktop/src/pages/task/PeriodicList/index.vue index 5455b34667..891bdd5ff2 100644 --- a/frontend/desktop/src/pages/task/PeriodicList/index.vue +++ b/frontend/desktop/src/pages/task/PeriodicList/index.vue @@ -65,9 +65,10 @@ 'disable': collectingId === row.id, 'text-permission-disable': !hasPermission(['periodic_task_edit'], row.auth_actions) }" + :title="row.name" @click="onCollectTask(row)"> - {{row.name || '--'}} + {{row.name || '--'}}
    - + @@ -107,6 +107,7 @@ :constants="pipelineData.constants" :gateways="pipelineData.gateways" :condition-data="conditionData" + :sidebar-width="sidebarWidth" @close="onCloseConfigPanel" @onRetryClick="onRetryClick" @onSkipClick="onSkipClick" @@ -488,6 +489,12 @@ }, adminView () { return this.hasAdminPerm && this.$route.query.is_admin === 'true' + }, + sidebarWidth () { + if (['viewNodeDetails', 'executeInfo'].includes(this.nodeInfoType)) { + return window.innerWidth - 340 + } + return 960 } }, mounted () { From 4495f9637eb728802f288257cf6c63020db46e6e Mon Sep 17 00:00:00 2001 From: v_xugzhou <941071842@qq.com> Date: Mon, 16 Oct 2023 14:37:57 +0800 Subject: [PATCH 16/20] =?UTF-8?q?optimization:=20=E8=BE=93=E5=87=BA?= =?UTF-8?q?=E5=8F=82=E6=95=B0hover=E8=A7=A6=E5=8F=91=E7=83=AD=E5=8C=BA?= =?UTF-8?q?=E4=BC=98=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../TemplateEdit/NodeConfig/OutputParams.vue | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/frontend/desktop/src/pages/template/TemplateEdit/NodeConfig/OutputParams.vue b/frontend/desktop/src/pages/template/TemplateEdit/NodeConfig/OutputParams.vue index ebdd9c6c5a..65495fa772 100644 --- a/frontend/desktop/src/pages/template/TemplateEdit/NodeConfig/OutputParams.vue +++ b/frontend/desktop/src/pages/template/TemplateEdit/NodeConfig/OutputParams.vue @@ -25,17 +25,18 @@