Skip to content

Commit

Permalink
feat: Support functionlib icon and init_fields
Browse files Browse the repository at this point in the history
--story=1017947 --user=刘瑞斌 【函数库】- 函数支持配置参数及操作优化 https://www.tapd.cn/57709429/s/1664936
  • Loading branch information
liuruibin committed Mar 10, 2025
1 parent e11c550 commit 73edf42
Show file tree
Hide file tree
Showing 12 changed files with 437 additions and 34 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
# Generated by Django 4.2.15 on 2025-03-07 10:31

from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
('function_lib', '0002_functionlib_is_active_functionlib_permission_type'),
]

operations = [
migrations.AddField(
model_name='functionlib',
name='icon',
field=models.CharField(default='/ui/favicon.ico', max_length=256, verbose_name='函数库icon'),
),
migrations.AddField(
model_name='functionlib',
name='init_field_list',
field=models.JSONField(default=list, verbose_name='启动字段列表'),
),
]
2 changes: 2 additions & 0 deletions apps/function_lib/models/function.py
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,8 @@ class FunctionLib(AppModelMixin):
input_field_list = ArrayField(verbose_name="输入字段列表",
base_field=models.JSONField(verbose_name="输入字段", default=dict)
, default=list)
init_field_list = models.JSONField(verbose_name="启动字段列表", default=list)
icon = models.CharField(max_length=256, verbose_name="函数库icon", default="/ui/favicon.ico")
is_active = models.BooleanField(default=True)
permission_type = models.CharField(max_length=20, verbose_name='权限类型', choices=PermissionType.choices,
default=PermissionType.PRIVATE)
Expand Down
14 changes: 12 additions & 2 deletions apps/function_lib/serializers/function_lib_serializer.py
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ def __init__(self, function_lib: dict, version: str):
class FunctionLibModelSerializer(serializers.ModelSerializer):
class Meta:
model = FunctionLib
fields = ['id', 'name', 'desc', 'code', 'input_field_list', 'permission_type', 'is_active', 'user_id',
fields = ['id', 'name', 'desc', 'code', 'input_field_list','init_field_list', 'permission_type', 'is_active', 'user_id',
'create_time', 'update_time']


Expand All @@ -65,6 +65,7 @@ class DebugField(serializers.Serializer):
class DebugInstance(serializers.Serializer):
debug_field_list = DebugField(required=True, many=True)
input_field_list = FunctionLibInputField(required=True, many=True)
init_field_list = serializers.ListField(required=False, default=list)
code = serializers.CharField(required=True, error_messages=ErrMessage.char(_('function content')))


Expand All @@ -80,6 +81,8 @@ class EditFunctionLib(serializers.Serializer):

input_field_list = FunctionLibInputField(required=False, many=True)

init_field_list = serializers.ListField(required=False, default=list)

is_active = serializers.BooleanField(required=False, error_messages=ErrMessage.char(_('Is active')))


Expand All @@ -93,6 +96,8 @@ class CreateFunctionLib(serializers.Serializer):

input_field_list = FunctionLibInputField(required=True, many=True)

init_field_list = serializers.ListField(required=False, default=list)

permission_type = serializers.CharField(required=True, error_messages=ErrMessage.char(_('permission')), validators=[
validators.RegexValidator(regex=re.compile("^PUBLIC|PRIVATE$"),
message="权限只支持PUBLIC|PRIVATE", code=500)
Expand Down Expand Up @@ -148,6 +153,7 @@ def insert(self, instance, with_valid=True):
code=instance.get('code'),
user_id=self.data.get('user_id'),
input_field_list=instance.get('input_field_list'),
init_field_list=instance.get('init_field_list'),
permission_type=instance.get('permission_type'),
is_active=instance.get('is_active', True))
function_lib.save()
Expand All @@ -163,12 +169,16 @@ def debug(self, debug_instance, with_valid=True):
input_field_list = debug_instance.get('input_field_list')
code = debug_instance.get('code')
debug_field_list = debug_instance.get('debug_field_list')
init_field_list = debug_instance.get('init_field_list')
init_params = {field.get('field'): field.get('value') if field.get('value', None) is not None else field.get('default_value') for field in init_field_list}
params = {field.get('name'): self.convert_value(field.get('name'), field.get('value'), field.get('type'),
field.get('is_required'))
for field in
[{'value': self.get_field_value(debug_field_list, field.get('name'), field.get('is_required')),
**field} for field in
input_field_list]}
# 合并初始化参数
params = init_params | params
return function_executor.exec_code(code, params)

@staticmethod
Expand Down Expand Up @@ -224,7 +234,7 @@ def edit(self, instance, with_valid=True):
if with_valid:
self.is_valid(raise_exception=True)
EditFunctionLib(data=instance).is_valid(raise_exception=True)
edit_field_list = ['name', 'desc', 'code', 'input_field_list', 'permission_type', 'is_active']
edit_field_list = ['name', 'desc', 'code', 'input_field_list', 'init_field_list', 'permission_type', 'is_active']
edit_dict = {field: instance.get(field) for field in edit_field_list if (
field in instance and instance.get(field) is not None)}
QuerySet(FunctionLib).filter(id=self.data.get('id')).update(**edit_dict)
Expand Down
2 changes: 2 additions & 0 deletions ui/src/api/type/function-lib.ts
Original file line number Diff line number Diff line change
@@ -1,10 +1,12 @@
interface functionLibData {
id?: String
name?: String
icon?: String
desc?: String
code?: String
permission_type?: 'PRIVATE' | 'PUBLIC'
input_field_list?: Array<any>
init_field_list?: Array<any>
is_active?: Boolean
}

Expand Down
3 changes: 2 additions & 1 deletion ui/src/locales/lang/en-US/common.ts
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,8 @@ export default {
},
param: {
outputParam: 'Output Parameters',
inputParam: 'Input Parameters'
inputParam: 'Input Parameters',
initParam: 'Startup Parameters',
},

inputPlaceholder: 'Please input',
Expand Down
3 changes: 2 additions & 1 deletion ui/src/locales/lang/zh-CN/common.ts
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,8 @@ export default {
content: '内容',
param: {
outputParam: '输出参数',
inputParam:'输入参数'
inputParam: '输入参数',
initParam: '启动参数',
},
rename:'重命名'
}
3 changes: 2 additions & 1 deletion ui/src/locales/lang/zh-Hant/common.ts
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,8 @@ export default {
content: '内容',
param: {
outputParam: '輸出參數',
inputParam: '輸入參數'
inputParam: '輸入參數',
initParam: '啟動參數',
},
rename: '重命名'
}
25 changes: 23 additions & 2 deletions ui/src/views/function-lib/component/FunctionDebugDrawer.vue
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,22 @@
</div>
</template>
<div>
<div v-if="form.init_field_list.length > 0">
<h4 class="title-decoration-1 mb-16">
{{ $t('common.param.initParam') }}
</h4>
<el-card shadow="never" class="card-never" style="--el-card-padding: 12px">
<DynamicsForm
v-model="init_form_data"
:model="init_form_data"
label-position="top"
require-asterisk-position="right"
:render_data="form.init_field_list"
ref="dynamicsFormRef"
>
</DynamicsForm>
</el-card>
</div>
<div v-if="form.debug_field_list.length > 0" class="mb-16">
<h4 class="title-decoration-1 mb-16">
{{ $t('common.param.inputParam') }}
Expand Down Expand Up @@ -95,18 +111,21 @@
import { ref, reactive, watch } from 'vue'
import functionLibApi from '@/api/function-lib'
import type { FormInstance } from 'element-plus'
import DynamicsForm from '@/components/dynamics-form/index.vue'
const FormRef = ref()
const loading = ref(false)
const debugVisible = ref(false)
const showResult = ref(false)
const isSuccess = ref(false)
const result = ref('')
const init_form_data = ref<any>({})
const form = ref<any>({
debug_field_list: [],
code: '',
input_field_list: []
input_field_list: [],
init_field_list: []
})
watch(debugVisible, (bool) => {
Expand All @@ -117,7 +136,8 @@ watch(debugVisible, (bool) => {
form.value = {
debug_field_list: [],
code: '',
input_field_list: []
input_field_list: [],
init_field_list: []
}
}
})
Expand Down Expand Up @@ -150,6 +170,7 @@ const open = (data: any) => {
}
form.value.code = data.code
form.value.input_field_list = data.input_field_list
form.value.init_field_list = data.init_field_list
debugVisible.value = true
}
Expand Down
98 changes: 98 additions & 0 deletions ui/src/views/function-lib/component/FunctionFormDrawer.vue
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,74 @@
</el-radio-group>
</el-form-item>
</el-form>
<div class="flex-between">
<h4 class="title-decoration-1 mb-16">
{{ $t('common.param.initParam') }}
</h4>
<el-button link type="primary" @click="openAddInitDialog()">
<el-icon class="mr-4"><Plus /></el-icon> {{ $t('common.add') }}
</el-button>
</div>
<el-table :data="form.init_field_list" class="mb-16">
<el-table-column prop="field" :label="$t('dynamicsForm.paramForm.field.label')" >
<template #default="{ row }">
<span :title="row.field" class="ellipsis-1">{{ row.field }}</span>
</template>
</el-table-column>
<el-table-column :label="$t('dynamicsForm.paramForm.input_type.label')">
<template #default="{ row }">
<el-tag type="info" class="info-tag" v-if="row.input_type === 'TextInput'">{{
$t('dynamicsForm.input_type_list.TextInput')
}}</el-tag>
<el-tag type="info" class="info-tag" v-if="row.input_type === 'PasswordInput'">{{
$t('dynamicsForm.input_type_list.PasswordInput')
}}</el-tag>
<el-tag type="info" class="info-tag" v-if="row.input_type === 'Slider'">{{
$t('dynamicsForm.input_type_list.Slider')
}}</el-tag>
<el-tag type="info" class="info-tag" v-if="row.input_type === 'SwitchInput'">{{
$t('dynamicsForm.input_type_list.SwitchInput')
}}</el-tag>
<el-tag type="info" class="info-tag" v-if="row.input_type === 'SingleSelect'">{{
$t('dynamicsForm.input_type_list.SingleSelect')
}}</el-tag>
<el-tag type="info" class="info-tag" v-if="row.input_type === 'MultiSelect'">{{
$t('dynamicsForm.input_type_list.MultiSelect')
}}</el-tag>
<el-tag type="info" class="info-tag" v-if="row.input_type === 'RadioCard'">{{
$t('dynamicsForm.input_type_list.RadioCard')
}}</el-tag>
<el-tag type="info" class="info-tag" v-if="row.input_type === 'DatePicker'">{{
$t('dynamicsForm.input_type_list.DatePicker')
}}</el-tag>
</template>
</el-table-column>
<el-table-column :label="$t('common.required')">
<template #default="{ row }">
<div @click.stop>
<el-switch disabled size="small" v-model="row.required" />
</div>
</template>
</el-table-column>
<el-table-column :label="$t('common.operation')" align="left" width="90">
<template #default="{ row, $index }">
<span class="mr-4">
<el-tooltip effect="dark" :content="$t('common.modify')" placement="top">
<el-button type="primary" text @click.stop="openAddInitDialog(row, $index)">
<el-icon><EditPen /></el-icon>
</el-button>
</el-tooltip>
</span>
<el-tooltip effect="dark" :content="$t('common.delete')" placement="top">
<el-button type="primary" text @click="deleteInitField($index)">
<el-icon>
<Delete />
</el-icon>
</el-button>
</el-tooltip>
</template>
</el-table-column>
</el-table>
<div class="flex-between">
<h4 class="title-decoration-1 mb-16">
{{ $t('common.param.inputParam') }}
Expand Down Expand Up @@ -163,6 +231,7 @@

<FunctionDebugDrawer ref="FunctionDebugDrawerRef" />
<FieldFormDialog ref="FieldFormDialogRef" @refresh="refreshFieldList" />
<UserFieldFormDialog ref="UserFieldFormDialogRef" @refresh="refreshInitFieldList"/>
</el-drawer>
</template>

Expand All @@ -177,13 +246,15 @@ import { MsgSuccess, MsgConfirm } from '@/utils/message'
import { cloneDeep } from 'lodash'
import { PermissionType, PermissionDesc } from '@/enums/model'
import { t } from '@/locales'
import UserFieldFormDialog from '@/workflow/nodes/base-node/component/UserFieldFormDialog.vue'
const props = defineProps({
title: String
})
const emit = defineEmits(['refresh'])
const FieldFormDialogRef = ref()
const FunctionDebugDrawerRef = ref()
const UserFieldFormDialogRef = ref()
const FormRef = ref()
Expand All @@ -198,6 +269,7 @@ const form = ref<functionLibData>({
desc: '',
code: '',
input_field_list: [],
init_field_list: [],
permission_type: 'PRIVATE'
})
Expand All @@ -211,6 +283,7 @@ watch(visible, (bool) => {
desc: '',
code: '',
input_field_list: [],
init_field_list: [],
permission_type: 'PRIVATE'
}
FormRef.value?.clearValidate()
Expand Down Expand Up @@ -286,10 +359,35 @@ function refreshFieldList(data: any) {
currentIndex.value = null
}
function openAddInitDialog(data?: any, index?: any) {
if (typeof index !== 'undefined') {
currentIndex.value = index
}
UserFieldFormDialogRef.value.open(data)
}
function refreshInitFieldList(data: any) {
if (currentIndex.value !== null) {
form.value.init_field_list?.splice(currentIndex.value, 1, data)
} else {
form.value.init_field_list?.push(data)
}
currentIndex.value = null
UserFieldFormDialogRef.value.close()
}
function deleteInitField(index: any) {
form.value.init_field_list?.splice(index, 1)
}
const submit = async (formEl: FormInstance | undefined) => {
if (!formEl) return
await formEl.validate((valid: any) => {
if (valid) {
// console.log(form.value)
if (isEdit.value) {
functionLibApi.putFunctionLib(form.value?.id as string, form.value, loading).then((res) => {
MsgSuccess(t('common.editSuccess'))
Expand Down
Loading

0 comments on commit 73edf42

Please sign in to comment.