Browse Source

Merge remote-tracking branch 'origin/master'

master
xueyinfei 2 months ago
parent
commit
2eea8a09a2
  1. 57
      vue-fastapi-backend/module_admin/service/metasecurity_service.py
  2. 53
      vue-fastapi-backend/module_admin/service/metatask_service.py
  3. 7
      vue-fastapi-frontend/src/views/meta/metatask/index.vue

57
vue-fastapi-backend/module_admin/service/metasecurity_service.py

@ -586,33 +586,54 @@ async def generate_sql(tablesRowCol:dict, table_columns:dict):
# # 创建一个正则表达式,匹配原始 SQL 中的表名(注意大小写问题,正则会忽略大小写) # # 创建一个正则表达式,匹配原始 SQL 中的表名(注意大小写问题,正则会忽略大小写)
# # 匹配类似 "模式名.tab1" 或 "tab1" 的表名 # # 匹配类似 "模式名.tab1" 或 "tab1" 的表名
# table_name_pattern = r'\b(?:[a-zA-Z_][a-zA-Z0-9_]*\.)?' + re.escape(table_name) + r'\b' # table_name_pattern = r'\b(?:[a-zA-Z_][a-zA-Z0-9_]*\.)?' + re.escape(table_name) + r'\b'
# # 替换原始 SQL 中的表名为对应的子查询 # # 替换原始 SQL 中的表名为对应的子查询
# oldStrSql = re.sub(table_name_pattern, f"({subquery})", oldStrSql, flags=re.IGNORECASE) # def add_alias(match):
# # 子查询替换后,检查是否有 AS 关键字
# replaced = f"({subquery})"
# # 检查是否已经有 AS
# if ' AS ' not in match.group(0).upper():
# # 如果没有 AS 关键字,则添加一个默认别名
# alias = table_name # 你可以根据需求设置别名格式,这里使用表名作为别名
# replaced += f" AS {alias}"
# return replaced
# oldStrSql = re.sub(table_name_pattern, add_alias, oldStrSql, flags=re.IGNORECASE)
# return oldStrSql # return oldStrSql
async def replace_table_with_subquery(ctrSqlDict, oldStrSql): async def replace_table_with_subquery(ctrSqlDict, oldStrSql):
# 遍历 ctrSqlDict 并替换 SQL 查询中的表名
for table_name, subquery in ctrSqlDict.items(): for table_name, subquery in ctrSqlDict.items():
# 创建一个正则表达式,匹配原始 SQL 中的表名(注意大小写问题,正则会忽略大小写) # 构建正则表达式,匹配表名及可能的别名
# 匹配类似 "模式名.tab1" 或 "tab1" 的表名 pattern = (
table_name_pattern = r'\b(?:[a-zA-Z_][a-zA-Z0-9_]*\.)?' + re.escape(table_name) + r'\b' r'(\b(?:[a-zA-Z_][a-zA-Z0-9_]*\.)?' # 匹配模式名(可选)
+ re.escape(table_name) # 转义表名
# 替换原始 SQL 中的表名为对应的子查询 + r'\b)' # 结束表名
def add_alias(match): r'(\s+(?:AS\s+)?(\w+))?' # 捕获别名部分(含 AS 或直接别名)
# 子查询替换后,检查是否有 AS 关键字 r'(?=\s*[\w\(\)]*)' # 确保后面是合法 SQL 语法,不是 SQL 关键字
replaced = f"({subquery})" )
# 检查是否已经有 AS def replace(match):
if ' AS ' not in match.group(0).upper(): original_table = match.group(1) # 原始表名(可能含模式名)
# 如果没有 AS 关键字,则添加一个默认别名 alias_part = match.group(2) # 别名部分(含空格、AS 或直接别名)
alias = table_name # 你可以根据需求设置别名格式,这里使用表名作为别名 alias_name = match.group(3) # 别名名称(无 AS 前缀)
replaced += f" AS {alias}" # 处理表名后直接跟着 SQL 关键字的情况
following_text = alias_name.upper()
sql_keywords = {"LIMIT", "WHERE", "ORDER", "GROUP", "HAVING", "JOIN", "ON", "USING", "UNION",
"EXCEPT", "INTERSECT", "FETCH", "OFFSET"}
if alias_name and following_text.split()[0] not in sql_keywords:
# 已存在别名,且别名后没有紧跟 SQL 关键字,保留原别名
replaced = f"({subquery}) {alias_part}"
else:
# 无别名时,或者别名无效(如 LIMIT),添加默认别名
alias = original_table.split('.')[-1]
replaced = f"({subquery}) AS {alias}{alias_part}"
return replaced return replaced
# 执行替换(忽略大小写)
oldStrSql = re.sub(table_name_pattern, add_alias, oldStrSql, flags=re.IGNORECASE) oldStrSql = re.sub(pattern, replace, oldStrSql, flags=re.IGNORECASE)
return oldStrSql return oldStrSql
async def get_data_source_tree(request: Request, current_user: MetaSecurityApiModel): async def get_data_source_tree(request: Request, current_user: MetaSecurityApiModel):
url = f'{AppConfig.ds_server_url}/dolphinscheduler/datasources/withpwdlist?pageNo=1&pageSize=100' url = f'{AppConfig.ds_server_url}/dolphinscheduler/datasources/withpwdlist?pageNo=1&pageSize=100'

53
vue-fastapi-backend/module_admin/service/metatask_service.py

@ -215,7 +215,11 @@ class MetataskService:
for config in processConfigList: for config in processConfigList:
# mysql表字段 # mysql表字段
if config.ac_target=='0': if config.ac_target=='0':
modified_json_str = config.taskDefinitionJson.replace("16199683466336", str_list[0]).replace("16199683466337", str_list[1]).replace("16199683466338", str_list[2]).replace("'dash_test_w'", f"'{page_object.dbSName}'").replace("'mysql_conn'", f"'{page_object.dbRName}'") modified_json_str = config.taskDefinitionJson.replace("16199683466336", str_list[0]).replace("16199683466337", str_list[1]).replace("16199683466338", str_list[2]).replace("'mysql_conn'", f"'{page_object.dbRName}'")
if page_object.dbSName:
modified_json_str=modified_json_str.replace("'dash_test_w'", f"'{page_object.dbSName}'")
else:
modified_json_str=modified_json_str.replace("t.table_schema = 'dash_test_w'", "1=1")
modified_json_str2=config.taskRelationJson.replace("16199683466336", str_list[0]).replace("16199683466337", str_list[1]).replace("16199683466338", str_list[2]) modified_json_str2=config.taskRelationJson.replace("16199683466336", str_list[0]).replace("16199683466337", str_list[1]).replace("16199683466338", str_list[2])
modified_json_str3=config.locations.replace("16199683466336", str_list[0]).replace("16199683466337", str_list[1]).replace("16199683466338", str_list[2]) modified_json_str3=config.locations.replace("16199683466336", str_list[0]).replace("16199683466337", str_list[1]).replace("16199683466338", str_list[2])
metaprocessconfig_dict = MetaprocessconfigModel(taskDefinitionJson=modified_json_str,# 替换taskDefinitionJson metaprocessconfig_dict = MetaprocessconfigModel(taskDefinitionJson=modified_json_str,# 替换taskDefinitionJson
@ -245,7 +249,11 @@ class MetataskService:
message += ", " message += ", "
message += page_object.metatask_name + "-表字段采集新增失败" message += page_object.metatask_name + "-表字段采集新增失败"
if config.ac_target=='1': if config.ac_target=='1':
modified_json_str = config.taskDefinitionJson.replace("16286410625888", str_list[0]).replace("16286410625889", str_list[1]).replace("16286410625890", str_list[2]).replace("16286410625891", str_list[3]).replace("'dash_test_w'", f"'{page_object.dbSName}'").replace("'mysql_conn'", f"'{page_object.dbRName}'").replace("mysql_conn dash_test_w", f"{page_object.dbRName} {page_object.dbSName}") modified_json_str = config.taskDefinitionJson.replace("16286410625888", str_list[0]).replace("16286410625889", str_list[1]).replace("16286410625890", str_list[2]).replace("16286410625891", str_list[3]).replace("'mysql_conn'", f"'{page_object.dbRName}'").replace("mysql_conn dash_test_w", f"{page_object.dbRName} {page_object.dbSName}")
if page_object.dbSName:
modified_json_str=modified_json_str.replace("'dash_test_w'", f"'{page_object.dbSName}'")
else:
modified_json_str=modified_json_str.replace("t.table_schema = 'dash_test_w'", "1=1")
modified_json_str2=config.taskRelationJson.replace("16286410625888", str_list[0]).replace("16286410625889", str_list[1]).replace("16286410625890", str_list[2]).replace("16286410625891", str_list[3]) modified_json_str2=config.taskRelationJson.replace("16286410625888", str_list[0]).replace("16286410625889", str_list[1]).replace("16286410625890", str_list[2]).replace("16286410625891", str_list[3])
modified_json_str3=config.locations.replace("16286410625888", str_list[0]).replace("16286410625889", str_list[1]).replace("16286410625890", str_list[2]).replace("16286410625891", str_list[3]) modified_json_str3=config.locations.replace("16286410625888", str_list[0]).replace("16286410625889", str_list[1]).replace("16286410625890", str_list[2]).replace("16286410625891", str_list[3])
metaprocessconfig_dict = MetaprocessconfigModel(taskDefinitionJson=modified_json_str,# 替换taskDefinitionJson metaprocessconfig_dict = MetaprocessconfigModel(taskDefinitionJson=modified_json_str,# 替换taskDefinitionJson
@ -300,7 +308,8 @@ class MetataskService:
text= response.text text= response.text
responsJson = json.loads(text) responsJson = json.loads(text)
if responsJson['msg'] == 'success': if responsJson['msg'] == 'success':
modified_json_str = json.dumps(responsJson['data']['taskDefinitionList'], ensure_ascii=False, indent=0).replace( f"'{metatask_old.dbSName}'", f"'{page_object.dbSName}'") # modified_json_str = json.dumps(responsJson['data']['taskDefinitionList'], ensure_ascii=False, indent=0).replace( f"'{metatask_old.dbSName}'", f"'{page_object.dbSName}'")
modified_json_str = json.dumps(responsJson['data']['taskDefinitionList'], ensure_ascii=False, indent=0)
getTaskRelationList=responsJson['data']['processTaskRelationList'] getTaskRelationList=responsJson['data']['processTaskRelationList']
putTaskRelationList=[] putTaskRelationList=[]
for item in getTaskRelationList: for item in getTaskRelationList:
@ -494,9 +503,13 @@ class MetataskService:
code_list = data["data"] code_list = data["data"]
str_list = list(map(str, code_list)) str_list = list(map(str, code_list))
for config in processConfigList: for config in processConfigList:
# mysql表字段 # oracl表字段
if config.ac_target=='0': if config.ac_target=='0':
modified_json_str = config.taskDefinitionJson.replace("16699723296864", str_list[0]).replace("16699723296865", str_list[1]).replace("16699723296866", str_list[2]).replace("'ORCL_USER'", f"'{page_object.dbSName}'").replace("'orcl_conn'", f"'{page_object.dbRName}'") modified_json_str = config.taskDefinitionJson.replace("16699723296864", str_list[0]).replace("16699723296865", str_list[1]).replace("16699723296866", str_list[2]).replace("'ORCL_USER'", f"'{page_object.dbSName}'").replace("'orcl_conn'", f"'{page_object.dbRName}'")
if page_object.dbSName:
modified_json_str=modified_json_str.replace("'ORCL_USER'", f"'{page_object.dbSName}'")
else:
modified_json_str=modified_json_str.replace("t.owner = 'ORCL_USER'", "1=1")
modified_json_str2=config.taskRelationJson.replace("16699723296864", str_list[0]).replace("16699723296865", str_list[1]).replace("16699723296866", str_list[2]) modified_json_str2=config.taskRelationJson.replace("16699723296864", str_list[0]).replace("16699723296865", str_list[1]).replace("16699723296866", str_list[2])
modified_json_str3=config.locations.replace("16699723296864", str_list[0]).replace("16699723296865", str_list[1]).replace("16699723296866", str_list[2]) modified_json_str3=config.locations.replace("16699723296864", str_list[0]).replace("16699723296865", str_list[1]).replace("16699723296866", str_list[2])
metaprocessconfig_dict = MetaprocessconfigModel(taskDefinitionJson=modified_json_str,# 替换taskDefinitionJson metaprocessconfig_dict = MetaprocessconfigModel(taskDefinitionJson=modified_json_str,# 替换taskDefinitionJson
@ -526,7 +539,11 @@ class MetataskService:
message += ", " message += ", "
message += page_object.metatask_name + "-表字段采集新增失败" message += page_object.metatask_name + "-表字段采集新增失败"
if config.ac_target=='1': if config.ac_target=='1':
modified_json_str = config.taskDefinitionJson.replace("16699841738592", str_list[0]).replace("16699841738593", str_list[1]).replace("16699841738594", str_list[2]).replace("16699841738595", str_list[3]).replace("'ORCL_USER'", f"'{page_object.dbSName}'").replace("'orcl_conn'", f"'{page_object.dbRName}'") modified_json_str = config.taskDefinitionJson.replace("16699841738592", str_list[0]).replace("16699841738593", str_list[1]).replace("16699841738594", str_list[2]).replace("16699841738595", str_list[3]).replace("'orcl_conn'", f"'{page_object.dbRName}'")
if page_object.dbSName:
modified_json_str=modified_json_str.replace("'ORCL_USER'", f"'{page_object.dbSName}'")
else:
modified_json_str=modified_json_str.replace("t.owner = 'ORCL_USER'", "1=1")
modified_json_str2=config.taskRelationJson.replace("16699841738592", str_list[0]).replace("16699841738593", str_list[1]).replace("16699841738594", str_list[2]).replace("16699841738595", str_list[3]) modified_json_str2=config.taskRelationJson.replace("16699841738592", str_list[0]).replace("16699841738593", str_list[1]).replace("16699841738594", str_list[2]).replace("16699841738595", str_list[3])
modified_json_str3=config.locations.replace("16699841738592", str_list[0]).replace("16699841738593", str_list[1]).replace("16699841738594", str_list[2]).replace("16699841738595", str_list[3]) modified_json_str3=config.locations.replace("16699841738592", str_list[0]).replace("16699841738593", str_list[1]).replace("16699841738594", str_list[2]).replace("16699841738595", str_list[3])
metaprocessconfig_dict = MetaprocessconfigModel(taskDefinitionJson=modified_json_str,# 替换taskDefinitionJson metaprocessconfig_dict = MetaprocessconfigModel(taskDefinitionJson=modified_json_str,# 替换taskDefinitionJson
@ -583,9 +600,13 @@ class MetataskService:
code_list = data["data"] code_list = data["data"]
str_list = list(map(str, code_list)) str_list = list(map(str, code_list))
for config in processConfigList: for config in processConfigList:
# mysql表字段 # db2表字段
if config.ac_target=='0': if config.ac_target=='0':
modified_json_str = config.taskDefinitionJson.replace("16699625480160", str_list[0]).replace("16699625480161", str_list[1]).replace("16699625480162", str_list[2]).replace("'MYSCHEMA'", f"'{page_object.dbSName}'").replace("'db2_conn'", f"'{page_object.dbRName}'") modified_json_str = config.taskDefinitionJson.replace("16699625480160", str_list[0]).replace("16699625480161", str_list[1]).replace("16699625480162", str_list[2]).replace("'db2_conn'", f"'{page_object.dbRName}'")
if page_object.dbSName:
modified_json_str=modified_json_str.replace("'MYSCHEMA'", f"'{page_object.dbSName}'")
else:
modified_json_str=modified_json_str.replace("TABSCHEMA = 'MYSCHEMA'", "1=1")
modified_json_str2=config.taskRelationJson.replace("16699625480160", str_list[0]).replace("16699625480161", str_list[1]).replace("16699625480162", str_list[2]) modified_json_str2=config.taskRelationJson.replace("16699625480160", str_list[0]).replace("16699625480161", str_list[1]).replace("16699625480162", str_list[2])
modified_json_str3=config.locations.replace("16699625480160", str_list[0]).replace("16699625480161", str_list[1]).replace("16699625480162", str_list[2]) modified_json_str3=config.locations.replace("16699625480160", str_list[0]).replace("16699625480161", str_list[1]).replace("16699625480162", str_list[2])
metaprocessconfig_dict = MetaprocessconfigModel(taskDefinitionJson=modified_json_str,# 替换taskDefinitionJson metaprocessconfig_dict = MetaprocessconfigModel(taskDefinitionJson=modified_json_str,# 替换taskDefinitionJson
@ -614,7 +635,11 @@ class MetataskService:
message += ", " message += ", "
message += page_object.metatask_name + "-表字段采集新增失败" message += page_object.metatask_name + "-表字段采集新增失败"
if config.ac_target=='1': if config.ac_target=='1':
modified_json_str = config.taskDefinitionJson.replace("16699623866592", str_list[0]).replace("16699623866593", str_list[1]).replace("16699623866594", str_list[2]).replace("16699623866595", str_list[3]).replace("'MYSCHEMA'", f"'{page_object.dbSName}'").replace("'db2_conn'", f"'{page_object.dbRName}'") modified_json_str = config.taskDefinitionJson.replace("16699623866592", str_list[0]).replace("16699623866593", str_list[1]).replace("16699623866594", str_list[2]).replace("16699623866595", str_list[3]).replace("'db2_conn'", f"'{page_object.dbRName}'")
if page_object.dbSName:
modified_json_str=modified_json_str.replace("'MYSCHEMA'", f"'{page_object.dbSName}'")
else:
modified_json_str=modified_json_str.replace("TABSCHEMA = 'MYSCHEMA'", "1=1")
modified_json_str2=config.taskRelationJson.replace("16699623866592", str_list[0]).replace("16699623866593", str_list[1]).replace("16699623866594", str_list[2]).replace("16699623866595", str_list[3]) modified_json_str2=config.taskRelationJson.replace("16699623866592", str_list[0]).replace("16699623866593", str_list[1]).replace("16699623866594", str_list[2]).replace("16699623866595", str_list[3])
modified_json_str3=config.locations.replace("16699623866592", str_list[0]).replace("16699623866593", str_list[1]).replace("16699623866594", str_list[2]).replace("16699623866595", str_list[3]) modified_json_str3=config.locations.replace("16699623866592", str_list[0]).replace("16699623866593", str_list[1]).replace("16699623866594", str_list[2]).replace("16699623866595", str_list[3])
metaprocessconfig_dict = MetaprocessconfigModel(taskDefinitionJson=modified_json_str,# 替换taskDefinitionJson metaprocessconfig_dict = MetaprocessconfigModel(taskDefinitionJson=modified_json_str,# 替换taskDefinitionJson
@ -770,7 +795,11 @@ class MetataskService:
for config in processConfigList: for config in processConfigList:
# POSTGRESQL表字段 # POSTGRESQL表字段
if config.ac_target=='0': if config.ac_target=='0':
modified_json_str = config.taskDefinitionJson.replace("16688213802592", str_list[0]).replace("16688213802593", str_list[1]).replace("16688213802594", str_list[2]).replace("'public'", f"'{page_object.dbSName}'").replace("'pg_conn'", f"'{page_object.dbRName}'") modified_json_str = config.taskDefinitionJson.replace("16688213802592", str_list[0]).replace("16688213802593", str_list[1]).replace("16688213802594", str_list[2]).replace("'pg_conn'", f"'{page_object.dbRName}'")
if page_object.dbSName:
modified_json_str=modified_json_str.replace("'public'", f"'{page_object.dbSName}'")
else:
modified_json_str=modified_json_str.replace("n.nspname = 'public'", "1=1")
modified_json_str2=config.taskRelationJson.replace("16688213802592", str_list[0]).replace("16688213802593", str_list[1]).replace("16688213802594", str_list[2]) modified_json_str2=config.taskRelationJson.replace("16688213802592", str_list[0]).replace("16688213802593", str_list[1]).replace("16688213802594", str_list[2])
modified_json_str3=config.locations.replace("16688213802592", str_list[0]).replace("16688213802593", str_list[1]).replace("16688213802594", str_list[2]) modified_json_str3=config.locations.replace("16688213802592", str_list[0]).replace("16688213802593", str_list[1]).replace("16688213802594", str_list[2])
metaprocessconfig_dict = MetaprocessconfigModel(taskDefinitionJson=modified_json_str,# 替换taskDefinitionJson metaprocessconfig_dict = MetaprocessconfigModel(taskDefinitionJson=modified_json_str,# 替换taskDefinitionJson
@ -799,7 +828,11 @@ class MetataskService:
message += ", " message += ", "
message += page_object.metatask_name + "-表字段采集新增失败" message += page_object.metatask_name + "-表字段采集新增失败"
elif config.ac_target=='1': elif config.ac_target=='1':
modified_json_str = config.taskDefinitionJson.replace("16688477124320", str_list[0]).replace("16688477124321", str_list[1]).replace("16688477124322", str_list[2]).replace("16688477124323", str_list[3]).replace("'public'", f"'{page_object.dbSName}'").replace("'pg_conn'", f"'{page_object.dbRName}'") modified_json_str = config.taskDefinitionJson.replace("16688477124320", str_list[0]).replace("16688477124321", str_list[1]).replace("16688477124322", str_list[2]).replace("16688477124323", str_list[3]).replace("'pg_conn'", f"'{page_object.dbRName}'")
if page_object.dbSName:
modified_json_str=modified_json_str.replace("'public'", f"'{page_object.dbSName}'")
else:
modified_json_str=modified_json_str.replace("n.nspname = 'public'", "1=1")
modified_json_str2=config.taskRelationJson.replace("16688477124320", str_list[0]).replace("16688477124321", str_list[1]).replace("16688477124322", str_list[2]).replace("16688477124323", str_list[3]) modified_json_str2=config.taskRelationJson.replace("16688477124320", str_list[0]).replace("16688477124321", str_list[1]).replace("16688477124322", str_list[2]).replace("16688477124323", str_list[3])
modified_json_str3=config.locations.replace("16688477124320", str_list[0]).replace("16688477124321", str_list[1]).replace("16688477124322", str_list[2]).replace("16688477124323", str_list[3]) modified_json_str3=config.locations.replace("16688477124320", str_list[0]).replace("16688477124321", str_list[1]).replace("16688477124322", str_list[2]).replace("16688477124323", str_list[3])
metaprocessconfig_dict = MetaprocessconfigModel(taskDefinitionJson=modified_json_str,# 替换taskDefinitionJson metaprocessconfig_dict = MetaprocessconfigModel(taskDefinitionJson=modified_json_str,# 替换taskDefinitionJson

7
vue-fastapi-frontend/src/views/meta/metatask/index.vue

@ -423,6 +423,7 @@
<el-cascader <el-cascader
v-model="form.metataskType" v-model="form.metataskType"
:options="metataskTypeOptions" :options="metataskTypeOptions"
:disabled="isEdit"
:props="{ expandTrigger: 'hover' }" :props="{ expandTrigger: 'hover' }"
@change="handleChangeType" @change="handleChangeType"
></el-cascader> ></el-cascader>
@ -447,6 +448,7 @@
v-model="form.acquisitionType" v-model="form.acquisitionType"
placeholder="请选择采集方式" placeholder="请选择采集方式"
maxlength="30" maxlength="30"
:disabled="isEdit"
style="width: 80%" style="width: 80%"
> >
<el-option <el-option
@ -483,6 +485,7 @@
<el-col :span="24"> <el-col :span="24">
<el-form-item label="数据库" prop="dbCode"> <el-form-item label="数据库" prop="dbCode">
<el-input <el-input
:disabled="isEdit"
v-model="form.dbCode" v-model="form.dbCode"
placeholder="请输入数据库" placeholder="请输入数据库"
maxlength="30" maxlength="30"
@ -498,6 +501,7 @@
v-model="form.dbSName" v-model="form.dbSName"
placeholder="请输入模式列表" placeholder="请输入模式列表"
maxlength="30" maxlength="30"
:disabled="isEdit"
style="width: 80%" style="width: 80%"
/> />
</el-form-item> </el-form-item>
@ -567,6 +571,7 @@ const loading = ref(true);
const ids = ref([]); const ids = ref([]);
const dsIds = ref([]); const dsIds = ref([]);
const single = ref(true); const single = ref(true);
const isEdit = ref(true);
const singleOne = ref(true); // Online, Edit, Delete const singleOne = ref(true); // Online, Edit, Delete
const singleTwo = ref(true); // Offline, Logs, Scheduling const singleTwo = ref(true); // Offline, Logs, Scheduling
const multiple = ref(true); const multiple = ref(true);
@ -802,6 +807,7 @@ const handleAdd = () => {
return; return;
} }
reset(); reset();
isEdit.value=false;
open.value = true; open.value = true;
}; };
@ -811,6 +817,7 @@ const handleUpdate = async (row) => {
const response = await getmetatask(metataskId); const response = await getmetatask(metataskId);
form.value = response.data; form.value = response.data;
open.value = true; open.value = true;
isEdit.value=true;
}; };

Loading…
Cancel
Save