Browse Source

Merge branch 'v7_master'

# Conflicts:
#	src/types/components.d.ts
yjf_v3
超级管理员 2 years ago
parent
commit
5237c58ac5
  1. 65
      src/components/DesignForm/assembly/index.ts
  2. 64
      src/components/DesignForm/formControlAttr.vue
  3. 5
      src/components/DesignForm/public/form/formGroup.vue
  4. 42
      src/components/workflow/drwer/approverDrawer.vue
  5. 19
      src/components/workflow/drwer/promoterDrawer.vue
  6. 15
      src/types/components.d.ts
  7. 15
      src/views/sysworkflow/lowcodepage/lowCodeFormPage.vue
  8. 14
      src/views/sysworkflow/lowcodepage/pageList.vue
  9. 5
      src/widget/index.ts
  10. 181
      src/widget/lowcodeimage/index.vue
  11. 147
      src/widget/lowcodeimage/lowcodeImage.vue
  12. 181
      src/widget/lowcodetransfer/index.vue
  13. 394
      src/widget/lowcodetransfer/lowcodeTransfer.vue

65
src/components/DesignForm/assembly/index.ts

@ -438,10 +438,11 @@ const selectOption: any = [
component: '' // 根据template注入的组件*/ component: '' // 根据template注入的组件*/
}, },
{ {
type: 'upload', type: 'upload',
label: '图片/文件', label: '图片/文件',
icon: 'image', icon: 'image',
iconFont: 'fa-photo', iconFont: 'fa-file-image-o',
control: { control: {
modelValue: '' // 也可以是[{name:'',url:''}]形式 modelValue: '' // 也可以是[{name:'',url:''}]形式
}, },
@ -451,6 +452,7 @@ const selectOption: any = [
labelStyle:{}, labelStyle:{},
inputStyle:{} inputStyle:{}
} }
}, },
{ {
type: 'tinymce', type: 'tinymce',
@ -522,13 +524,74 @@ const selectOption: any = [
interval:2000, interval:2000,
} }
}, },
config: {}, config: {},
styles:{ styles:{
divStyle:{}, divStyle:{},
labelStyle:{}, labelStyle:{},
inputStyle:{} inputStyle:{}
} }
},
{
type: 'lowcodeTransfer',
label: '穿梭框',
icon: '',
iconFont: 'fa-arrows-h',
control: {
modelValue: '',
fixedOptions: [{
id: 'thefirstrootnode',
label: '根节点1',
disabled: false,
children: []
},
{
id: 'thesecondrootnode',
label: '根节点2',
disabled: false,
children: []
}]
},
config: {
transferName:'穿梭框',
transferDataSource:'固定选项',
apiUrl:'/javasys/lowCode/transfer/getOrgAndManTree',
method:'post',
} }
},
{
type: 'lowcodeImage',
label: '图片',
icon: '',
iconFont: 'fa-photo',
control: {
modelValue: '',
uploadFlag:false,
imgId:'',
imgUrl: '',
link: '',
fit:1,
radius:false,
radiusNum:5,
boderAndShadow:false,
showMode:'自定义像素值',
pxWidth:448,
pxHeight:252,
widthPercent:90,
heightPercent:90,
mt:0,
mb:0,
ml:0,
mr:0,
pt:0,
pb:0,
pl:0,
pr:0,
floatFlag:false,
floatValue:'left',
},
config: {}
},
] ]
}, },
{ {

64
src/components/DesignForm/formControlAttr.vue

@ -21,10 +21,12 @@
import { uploadUrl } from '@/api/DesignForm' import { uploadUrl } from '@/api/DesignForm'
import { UploadFilled } from '@element-plus/icons-vue' import { UploadFilled } from '@element-plus/icons-vue'
import { UploadFile, UploadFiles } from 'element-plus/es/components/upload/src/upload'; import { UploadFile, UploadFiles } from 'element-plus/es/components/upload/src/upload';
import type Node from 'element-plus/es/components/tree/src/model/node'
// //
import LayoutPage from '@/components/DesignForm/layoutPage/index.vue' import LayoutPage from '@/components/DesignForm/layoutPage/index.vue'
import { Plus } from '@element-plus/icons-vue'
const props = withDefaults( // const props = withDefaults( //
defineProps<{ defineProps<{
@ -970,6 +972,7 @@
const newVal = obj.isNum ? formatNumber(val) : val // const newVal = obj.isNum ? formatNumber(val) : val //
obj.path && getPropByPath(controlData.value, obj.path, newVal) obj.path && getPropByPath(controlData.value, obj.path, newVal)
} }
} }
/** /**
* 获取非负整数随机数 * 获取非负整数随机数
@ -1523,6 +1526,7 @@
{ label: '每行四列', value: 'form-row-4' } { label: '每行四列', value: 'form-row-4' }
] ]
const layouytStyle = reactive<any>(controlData.value.styles) const layouytStyle = reactive<any>(controlData.value.styles)
watch(()=>layouytStyle,(val : any)=>{ watch(()=>layouytStyle,(val : any)=>{
console.log("监听样式处理",val) console.log("监听样式处理",val)
@ -1547,6 +1551,35 @@
} }
return false; return false;
} }
/**
@ 作者: 秦东
@ 时间: 2024-03-18 11:42:52
@ 功能: 上传图标相关
*/
const imgUploadApiUrl = import.meta.env.VITE_APP_BASE_API+"/api/upordown" //
const handleAvatarSuccess: UploadProps['onSuccess'] = (
response,
uploadFile
) => {
// imageUrl.value = URL.createObjectURL(uploadFile.raw!)
formConfig.value.imageUrl = response.data.url
}
const beforeAvatarUpload: UploadProps['beforeUpload'] = (rawFile) => {
console.log("beforeAvatarUpload",rawFile.type)
if (rawFile.type !== 'image/jpeg' && rawFile.type !== 'image/jpg' && rawFile.type !== 'image/png' && rawFile.type !== 'image/gif' && rawFile.type !== 'image/icon') {
ElMessage.error('请上传以下格式的图片(jpg、jpeg、png、gif、icon)!'+rawFile.type)
return false
} else if (rawFile.size / 1024 / 1024 > 2) {
ElMessage.error('图片大小不要大于 2MB!')
return false
}
return true
}
</script> </script>
<template> <template>
<div class="sidebar-tools"> <div class="sidebar-tools">
@ -2084,7 +2117,21 @@
/> />
</el-form-item> </el-form-item>
<el-form-item class="form_cont">
<template #label>
表单图标
</template>
<el-upload
class="avatar-uploader"
:action="imgUploadApiUrl"
:show-file-list="false"
:on-success="handleAvatarSuccess"
:before-upload="beforeAvatarUpload"
>
<img v-if="formConfig.imageUrl" :src="formConfig.imageUrl" class="avatar" />
<el-icon v-else class="avatar-uploader-icon"><Plus /></el-icon>
</el-upload>
</el-form-item>
<template v-if="!state.isSearch"> <template v-if="!state.isSearch">
<el-divider content-position="left">接口数据事件</el-divider> <el-divider content-position="left">接口数据事件</el-divider>
@ -2323,7 +2370,18 @@
.form_cont{ .form_cont{
padding: 0 10px; padding: 0 10px;
} }
.avatar-uploader{
width: 100px;
height: 100px;
.avatar{
width: 100px;
height: 100px;
}
.avatar-uploader-icon{
width: 100px;
height: 100px;
}
}
</style> </style>
<style > <style >

5
src/components/DesignForm/public/form/formGroup.vue

@ -459,8 +459,13 @@ const getFormItemLableStyle = (ele: any) => {
</template> </template>
<DigitPage v-else-if="element.type === 'digitpage'" :data="element" /> <DigitPage v-else-if="element.type === 'digitpage'" :data="element" />
<LowcodeImage v-else-if="element.type === 'lowcodeImage'" :data="element" />
<LowcodeTransfer v-else-if="element.type === 'lowcodeTransfer'" :data="element" />
<VideoUpAndPlay v-else-if="element.type === 'videoUpAndPlay'" :data="element" /> <VideoUpAndPlay v-else-if="element.type === 'videoUpAndPlay'" :data="element" />
<LowcodeCarsusel v-else-if="element.type === 'lowcodeCarsusel'" :data="element" /> <LowcodeCarsusel v-else-if="element.type === 'lowcodeCarsusel'" :data="element" />
<SignatureMap v-else-if="element.type === 'signaturemap'" :data="element" /> <SignatureMap v-else-if="element.type === 'signaturemap'" :data="element" />

42
src/components/workflow/drwer/approverDrawer.vue

@ -101,14 +101,24 @@ const matrixIsShow = ref(false)
watch(approverConfig1, (val:any)=>{ watch(approverConfig1, (val:any)=>{
val.value.attribute = val.value.attribute*1 val.value.attribute = val.value.attribute*1
// console.log("directormaxlevel",val.value) console.log("directormaxlevel",val.value)
matrixIsShow.value = false matrixIsShow.value = false
approverConfig.value = val.value approverConfig.value = val.value
if(val.type == 3){ if(val.type == 3){
if(val.value.nodeName != ""){
nodeTitle.value = val.value.nodeName+"设置"
}else{
nodeTitle.value = "执行人设置" nodeTitle.value = "执行人设置"
}
}else{
if(val.value.nodeName != ""){
nodeTitle.value = val.value.nodeName+"设置"
}else{ }else{
nodeTitle.value = "审批人设置" nodeTitle.value = "审批人设置"
} }
}
isExecutor.value = false isExecutor.value = false
// approverConfig.attribute = approverConfig.attribute*1 // approverConfig.attribute = approverConfig.attribute*1
if(visible.value){ if(visible.value){
@ -217,12 +227,12 @@ const saveApprover = ()=> {
} }
}); });
} }
console.log("正确",formData.value) // console.log("",formData.value)
if(formData.value.purview){ if(formData.value.purview){
console.log("正确") // console.log("")
let isNew = true let isNew = true
formData.value.purview.forEach((item:any)=>{ formData.value.purview.forEach((item:any)=>{
console.log("正确---->",item.nodeKey) // console.log("---->",item.nodeKey)
if(item.nodeKey == approverConfig1.value.value.nodeNumber){ if(item.nodeKey == approverConfig1.value.value.nodeNumber){
item.powerAry=powerAry item.powerAry=powerAry
isNew = false isNew = false
@ -299,6 +309,7 @@ watch(()=>visible.value,(val:boolean)=>{
jieForm(); jieForm();
} }
}) })
const nodeSetUp = ref("first")
</script> </script>
<template> <template>
@ -307,6 +318,15 @@ watch(()=>visible.value,(val:boolean)=>{
<div class="demo-drawer__content"> <div class="demo-drawer__content">
<!--审批人设置主体--> <!--审批人设置主体-->
<div class="drawer_content"> <div class="drawer_content">
<el-tabs v-model="nodeSetUp" class="demo-tabs">
<el-tab-pane name="first">
<template #label>
<span class="wordKeyCss">属性设置</span>
</template>
<!-- <el-divider content-position="left">节点属性</el-divider> -->
<div class="approver_content"> <div class="approver_content">
<el-radio-group v-model="approverConfig.settype" class="clear" @change="changeType"> <el-radio-group v-model="approverConfig.settype" class="clear" @change="changeType">
<template v-for="({value, label}) in setTypes" :key="value"> <template v-for="({value, label}) in setTypes" :key="value">
@ -463,8 +483,12 @@ watch(()=>visible.value,(val:boolean)=>{
<el-radio v-for="item in nodeOptional" :key="item.nodeNumber" :label="item.nodeNumber" >{{ item.nodeName }}编号{{ item.nodeNumber }}</el-radio> <el-radio v-for="item in nodeOptional" :key="item.nodeNumber" :label="item.nodeNumber" >{{ item.nodeName }}编号{{ item.nodeNumber }}</el-radio>
</el-radio-group> </el-radio-group>
</div> </div>
</el-tab-pane>
<el-divider content-position="left">操作权限</el-divider> <el-tab-pane name="second">
<template #label>
<span class="wordKeyCss">操作权限</span>
</template>
<!-- <el-divider content-position="left">操作权限</el-divider> -->
<div class="info_box"> <div class="info_box">
<div class="table_name"><el-text class="mx-1" type="primary">主表</el-text></div> <div class="table_name"><el-text class="mx-1" type="primary">主表</el-text></div>
<el-table v-if="powerUnitAry.recUnitAry.masterUnitList" :data="powerUnitAry.recUnitAry.masterUnitList" size="small" style="width: 100%; --el-table-border-color: none;" :header-cell-style="{background:'#eef1f6',color:'#606266'}" class="customer-no-border-table" > <el-table v-if="powerUnitAry.recUnitAry.masterUnitList" :data="powerUnitAry.recUnitAry.masterUnitList" size="small" style="width: 100%; --el-table-border-color: none;" :header-cell-style="{background:'#eef1f6',color:'#606266'}" class="customer-no-border-table" >
@ -499,7 +523,8 @@ watch(()=>visible.value,(val:boolean)=>{
</el-col> </el-col>
</el-row> </el-row>
</div> </div>
</el-tab-pane>
</el-tabs>
</div> </div>
<div class="demo-drawer__footer clear"> <div class="demo-drawer__footer clear">
@ -631,4 +656,7 @@ watch(()=>visible.value,(val:boolean)=>{
.info_box{ .info_box{
padding: 0 20px; padding: 0 20px;
} }
.wordKeyCss{
padding: 0 20px;
}
</style> </style>

19
src/components/workflow/drwer/promoterDrawer.vue

@ -169,19 +169,30 @@ watch(()=>visible.value,(val:boolean)=>{
jieForm(); jieForm();
} }
}) })
const nodeSetUp = ref("first")
</script> </script>
<template> <template>
<el-drawer v-model="visible" :append-to-body="true" title="发起人" class="set_promoter" :show-close="false" :size="550" :before-close="closeDrawer"> <el-drawer v-model="visible" :append-to-body="true" title="发起人" class="set_promoter" :show-close="false" :size="550" :before-close="closeDrawer">
<div class="demo-drawer__content"> <div class="demo-drawer__content">
<div class="promoter_content drawer_content"> <div class="promoter_content drawer_content">
<el-divider content-position="left">节点属性</el-divider> <el-tabs v-model="nodeSetUp" class="demo-tabs">
<el-tab-pane name="first">
<template #label>
<span class="wordKeyCss">属性设置</span>
</template>
<!-- <el-divider content-position="left">节点属性</el-divider> -->
<div class="info_box"> <div class="info_box">
<p>{{ $func.arrToStr(flowPermission) || '所有人' }}</p> <p>{{ $func.arrToStr(flowPermission) || '所有人' }}</p>
<el-button type="primary" @click="addPromoter">添加/修改发起人</el-button> <el-button type="primary" @click="addPromoter">添加/修改发起人</el-button>
</div> </div>
</el-tab-pane>
<el-divider content-position="left">操作权限</el-divider> <el-tab-pane name="second">
<template #label>
<span class="wordKeyCss">操作权限</span>
</template>
<!-- <el-divider content-position="left">操作权限</el-divider> -->
<div class="info_box"> <div class="info_box">
<div class="table_name"><el-text class="mx-1" type="primary">主表</el-text></div> <div class="table_name"><el-text class="mx-1" type="primary">主表</el-text></div>
<el-table v-if="powerUnitAry.recUnitAry.masterUnitList" :data="powerUnitAry.recUnitAry.masterUnitList" size="small" style="width: 100%; --el-table-border-color: none;" :header-cell-style="{background:'#eef1f6',color:'#606266'}" class="customer-no-border-table" > <el-table v-if="powerUnitAry.recUnitAry.masterUnitList" :data="powerUnitAry.recUnitAry.masterUnitList" size="small" style="width: 100%; --el-table-border-color: none;" :header-cell-style="{background:'#eef1f6',color:'#606266'}" class="customer-no-border-table" >
@ -216,6 +227,8 @@ watch(()=>visible.value,(val:boolean)=>{
</el-col> </el-col>
</el-row> </el-row>
</div> </div>
</el-tab-pane>
</el-tabs>
<!-- {{formData}} --> <!-- {{formData}} -->
</div> </div>

15
src/types/components.d.ts

@ -22,24 +22,24 @@ declare module '@vue/runtime-core' {
DiyIconfont: typeof import('./../components/DesignForm/public/expand/diy-iconfont.vue')['default'] DiyIconfont: typeof import('./../components/DesignForm/public/expand/diy-iconfont.vue')['default']
DragControl: typeof import('./../components/DesignForm/dragControl.vue')['default'] DragControl: typeof import('./../components/DesignForm/dragControl.vue')['default']
ElAffix: typeof import('element-plus/es')['ElAffix'] ElAffix: typeof import('element-plus/es')['ElAffix']
<<<<<<< HEAD
ElAlert: typeof import('element-plus/es')['ElAlert'] ElAlert: typeof import('element-plus/es')['ElAlert']
ElAside: typeof import('element-plus/es')['ElAside'] ElAside: typeof import('element-plus/es')['ElAside']
=======
>>>>>>> v7_master
ElAvatar: typeof import('element-plus/es')['ElAvatar'] ElAvatar: typeof import('element-plus/es')['ElAvatar']
ElBreadcrumb: typeof import('element-plus/es')['ElBreadcrumb'] ElBreadcrumb: typeof import('element-plus/es')['ElBreadcrumb']
ElBreadcrumbItem: typeof import('element-plus/es')['ElBreadcrumbItem'] ElBreadcrumbItem: typeof import('element-plus/es')['ElBreadcrumbItem']
ElButton: typeof import('element-plus/es')['ElButton'] ElButton: typeof import('element-plus/es')['ElButton']
ElButtonGroup: typeof import('element-plus/es')['ElButtonGroup']
ElCard: typeof import('element-plus/es')['ElCard'] ElCard: typeof import('element-plus/es')['ElCard']
ElCarousel: typeof import('element-plus/es')['ElCarousel'] ElCarousel: typeof import('element-plus/es')['ElCarousel']
ElCarouselItem: typeof import('element-plus/es')['ElCarouselItem'] ElCarouselItem: typeof import('element-plus/es')['ElCarouselItem']
ElCascader: typeof import('element-plus/es')['ElCascader']
ElCheckbox: typeof import('element-plus/es')['ElCheckbox'] ElCheckbox: typeof import('element-plus/es')['ElCheckbox']
ElCheckboxGroup: typeof import('element-plus/es')['ElCheckboxGroup'] ElCheckboxGroup: typeof import('element-plus/es')['ElCheckboxGroup']
ElCol: typeof import('element-plus/es')['ElCol'] ElCol: typeof import('element-plus/es')['ElCol']
ElCollapse: typeof import('element-plus/es')['ElCollapse'] ElCollapse: typeof import('element-plus/es')['ElCollapse']
ElCollapseItem: typeof import('element-plus/es')['ElCollapseItem'] ElCollapseItem: typeof import('element-plus/es')['ElCollapseItem']
ElColorPicker: typeof import('element-plus/es')['ElColorPicker'] ElColorPicker: typeof import('element-plus/es')['ElColorPicker']
ElContainer: typeof import('element-plus/es')['ElContainer']
ElDatePicker: typeof import('element-plus/es')['ElDatePicker'] ElDatePicker: typeof import('element-plus/es')['ElDatePicker']
ElDescriptions: typeof import('element-plus/es')['ElDescriptions'] ElDescriptions: typeof import('element-plus/es')['ElDescriptions']
ElDescriptionsItem: typeof import('element-plus/es')['ElDescriptionsItem'] ElDescriptionsItem: typeof import('element-plus/es')['ElDescriptionsItem']
@ -56,14 +56,11 @@ declare module '@vue/runtime-core' {
ElImageViewer: typeof import('element-plus/es')['ElImageViewer'] ElImageViewer: typeof import('element-plus/es')['ElImageViewer']
ElInput: typeof import('element-plus/es')['ElInput'] ElInput: typeof import('element-plus/es')['ElInput']
ElInputNumber: typeof import('element-plus/es')['ElInputNumber'] ElInputNumber: typeof import('element-plus/es')['ElInputNumber']
ElLink: typeof import('element-plus/es')['ElLink']
ElMain: typeof import('element-plus/es')['ElMain']
ElMenu: typeof import('element-plus/es')['ElMenu'] ElMenu: typeof import('element-plus/es')['ElMenu']
ElMenuItem: typeof import('element-plus/es')['ElMenuItem'] ElMenuItem: typeof import('element-plus/es')['ElMenuItem']
ElOption: typeof import('element-plus/es')['ElOption'] ElOption: typeof import('element-plus/es')['ElOption']
ElPagination: typeof import('element-plus/es')['ElPagination'] ElPagination: typeof import('element-plus/es')['ElPagination']
ElPopover: typeof import('element-plus/es')['ElPopover'] ElPopover: typeof import('element-plus/es')['ElPopover']
ElProgress: typeof import('element-plus/es')['ElProgress']
ElRadio: typeof import('element-plus/es')['ElRadio'] ElRadio: typeof import('element-plus/es')['ElRadio']
ElRadioButton: typeof import('element-plus/es')['ElRadioButton'] ElRadioButton: typeof import('element-plus/es')['ElRadioButton']
ElRadioGroup: typeof import('element-plus/es')['ElRadioGroup'] ElRadioGroup: typeof import('element-plus/es')['ElRadioGroup']
@ -71,7 +68,6 @@ declare module '@vue/runtime-core' {
ElRow: typeof import('element-plus/es')['ElRow'] ElRow: typeof import('element-plus/es')['ElRow']
ElScrollbar: typeof import('element-plus/es')['ElScrollbar'] ElScrollbar: typeof import('element-plus/es')['ElScrollbar']
ElSelect: typeof import('element-plus/es')['ElSelect'] ElSelect: typeof import('element-plus/es')['ElSelect']
ElSelectV2: typeof import('element-plus/es')['ElSelectV2']
ElSlider: typeof import('element-plus/es')['ElSlider'] ElSlider: typeof import('element-plus/es')['ElSlider']
ElSpace: typeof import('element-plus/es')['ElSpace'] ElSpace: typeof import('element-plus/es')['ElSpace']
ElStep: typeof import('element-plus/es')['ElStep'] ElStep: typeof import('element-plus/es')['ElStep']
@ -112,8 +108,8 @@ declare module '@vue/runtime-core' {
HeadToolsNew: typeof import('./../components/DesignForm/public/headToolsNew.vue')['default'] HeadToolsNew: typeof import('./../components/DesignForm/public/headToolsNew.vue')['default']
IconSelect: typeof import('./../components/IconSelect/index.vue')['default'] IconSelect: typeof import('./../components/IconSelect/index.vue')['default']
IEpCaretBottom: typeof import('~icons/ep/caret-bottom')['default'] IEpCaretBottom: typeof import('~icons/ep/caret-bottom')['default']
IEpCaretTop: typeof import('~icons/ep/caret-top')['default']
IEpClose: typeof import('~icons/ep/close')['default'] IEpClose: typeof import('~icons/ep/close')['default']
<<<<<<< HEAD
IEpCollection: typeof import('~icons/ep/collection')['default'] IEpCollection: typeof import('~icons/ep/collection')['default']
IEpDelete: typeof import('~icons/ep/delete')['default'] IEpDelete: typeof import('~icons/ep/delete')['default']
IEpDownload: typeof import('~icons/ep/download')['default'] IEpDownload: typeof import('~icons/ep/download')['default']
@ -132,6 +128,9 @@ declare module '@vue/runtime-core' {
IEpUploadFilled: typeof import('~icons/ep/upload-filled')['default'] IEpUploadFilled: typeof import('~icons/ep/upload-filled')['default']
IEpUser: typeof import('~icons/ep/user')['default'] IEpUser: typeof import('~icons/ep/user')['default']
IEpView: typeof import('~icons/ep/view')['default'] IEpView: typeof import('~icons/ep/view')['default']
=======
IEpSetting: typeof import('~icons/ep/setting')['default']
>>>>>>> v7_master
LangSelect: typeof import('./../components/LangSelect/index.vue')['default'] LangSelect: typeof import('./../components/LangSelect/index.vue')['default']
LayoutPage: typeof import('./../components/DesignForm/layoutPage/index.vue')['default'] LayoutPage: typeof import('./../components/DesignForm/layoutPage/index.vue')['default']
List: typeof import('./../components/DesignForm/public/form/components/list.vue')['default'] List: typeof import('./../components/DesignForm/public/form/components/list.vue')['default']

15
src/views/sysworkflow/lowcodepage/lowCodeFormPage.vue

@ -11,6 +11,7 @@ import { getProductionMarkForm } from '@/api/DesignForm/requestapi'
// import PageDesign from "@/views/sysworkflow/lowcodepage/pageDesign.vue" // import PageDesign from "@/views/sysworkflow/lowcodepage/pageDesign.vue"
import PageDesignEs from "@/views/sysworkflow/lowcodepage/pageDesignes.vue" import PageDesignEs from "@/views/sysworkflow/lowcodepage/pageDesignes.vue"
import WorkFlow from "@/views/sysworkflow/lowcodepage/workFlow.vue" import WorkFlow from "@/views/sysworkflow/lowcodepage/workFlow.vue"
import PageList from "@/views/sysworkflow/lowcodepage/pageList.vue"
@ -190,7 +191,7 @@ const runNextWindows = (val:number) => {
tabsActive.value = val tabsActive.value = val
} }
onMounted(()=>{ onMounted(()=>{
// formKeyStr.value = "16" formKeyStr.value = "16"
}) })
</script> </script>
<template> <template>
@ -199,15 +200,19 @@ onMounted(()=>{
<el-drawer v-model="drawerOpenOrClose" title="设置/编辑自定义表单" :with-header="false" :close-on-click-modal="false" :close-on-press-escape="false" :destroy-on-close="true" :size="props.drawerWith"> <el-drawer v-model="drawerOpenOrClose" title="设置/编辑自定义表单" :with-header="false" :close-on-click-modal="false" :close-on-press-escape="false" :destroy-on-close="true" :size="props.drawerWith">
<el-tabs v-model="tabsActive" @tab-click="handleClick" stretch class="tabsMain"> <el-tabs v-model="tabsActive" @tab-click="handleClick" stretch class="tabsMain">
<el-tab-pane label="页面设计" :name="1"> <el-tab-pane label="页面设计" :name="1">
{{creetTabsActive}} == {{tabsActive}}
<PageDesignEs v-model:state="state" v-model:form-key="formKeyStr" v-model:form-version="formVersion" :formconfigcont="formConfigCont" @judgeFormIsEdit="judgeFormIsEdit" @runNextWindows="runNextWindows" @closeFormPage="closeFormPage" /> <PageDesignEs v-model:state="state" v-model:form-key="formKeyStr" v-model:form-version="formVersion" :formconfigcont="formConfigCont" @judgeFormIsEdit="judgeFormIsEdit" @runNextWindows="runNextWindows" @closeFormPage="closeFormPage" />
</el-tab-pane> </el-tab-pane>
<el-tab-pane label="流程设计" :name="2"> <el-tab-pane label="流程设计" :name="2">
{{creetTabsActive}} == {{tabsActive}}
<WorkFlow v-model:state="state" v-model:form-key="formKeyStr" v-model:form-version="formVersion" @judgeFlowIsEdit="judgeFlowIsEdit" @runNextWindows="runNextWindows" @closeFormPage="closeFormPage" /> <WorkFlow v-model:state="state" v-model:form-key="formKeyStr" v-model:form-version="formVersion" @judgeFlowIsEdit="judgeFlowIsEdit" @runNextWindows="runNextWindows" @closeFormPage="closeFormPage" />
</el-tab-pane> </el-tab-pane>
<el-tab-pane label="列表设计" :name="3">{{creetTabsActive}} == {{tabsActive}}</el-tab-pane> <el-tab-pane label="列表设计" :name="3">
<el-tab-pane label="页面设置" :name="4"></el-tab-pane> <PageList v-model:state="state" v-model:form-key="formKeyStr" v-model:form-version="formVersion" />
</el-tab-pane>
<el-tab-pane label="页面设置" :name="4">
{{creetTabsActive}} == {{tabsActive}}
</el-tab-pane>
</el-tabs> </el-tabs>
</el-drawer> </el-drawer>
</div> </div>

14
src/views/sysworkflow/lowcodepage/pageList.vue

@ -0,0 +1,14 @@
<!--
@ 作者: 秦东
@ 时间: 2024-03-18 11:32:14
@ 备注: 自定义表单列表
-->
<script lang='ts' setup>
</script>
<template>
<div></div>
</template>
<style lang='scss' scoped>
</style>

5
src/widget/index.ts

@ -12,6 +12,8 @@ import digitPage from './digitpage/index.vue'
import signatureMap from './writingboard/index.vue' import signatureMap from './writingboard/index.vue'
import videoUpAndPlay from './videoupload/index.vue' import videoUpAndPlay from './videoupload/index.vue'
import lowcodeCarsusel from './carousel/index.vue' import lowcodeCarsusel from './carousel/index.vue'
import lowcodeTransfer from './lowcodetransfer/index.vue'
import lowcodeImage from './lowcodeimage/index.vue'
export default (app: any) => { export default (app: any) => {
@ -26,5 +28,6 @@ export default (app: any) => {
app.component('SignatureMap', signatureMap) app.component('SignatureMap', signatureMap)
app.component('VideoUpAndPlay',videoUpAndPlay) app.component('VideoUpAndPlay',videoUpAndPlay)
app.component('LowcodeCarsusel',lowcodeCarsusel) app.component('LowcodeCarsusel',lowcodeCarsusel)
app.component('LowcodeTransfer',lowcodeTransfer)
app.component('LowcodeImage',lowcodeImage)
} }

181
src/widget/lowcodeimage/index.vue

@ -0,0 +1,181 @@
<!--
@ 作者: 李文轩
@ 时间: 2024-03-14 13:49:57
@ 备注:
-->
<template>
<el-form-item
v-bind="data.item"
:prop="tProp || data.name"
:class="config.className"
:rules="itemRules as any"
:label="getLabel(data.item as FormItem)"
>
<input v-model="value" type="hidden" >
</el-form-item>
<LowcodeImage :data="props.data"></LowcodeImage>
</template>
<script lang='ts' setup>
import LowcodeImage from './lowcodeImage.vue';
import {
constControlChange,
constFormProps,
} from '@/api/DesignForm/utils'
import validate from '@/api/DesignForm/validate'
import { FormItem, FormList } from '@/api/DesignForm/types'
const props = withDefaults(
defineProps<{
data: FormList
tablekey: any
numrun?: number
modelValue?: any //
tProp?: string // form-itemprop
}>(),
{}
)
const emits = defineEmits<{
(e: 'update:modelValue', numVal: any): void
}>()
const formProps = inject(constFormProps, {}) as any
const type = computed(() => {
return formProps.value.type
})
const config = computed(() => {
return props.data.config || {}
})
const changeEvent = inject(constControlChange, '') as any
const value = computed({
get() {
if (props.tProp) {
//
return props.modelValue
} else {
return formProps.value.model[props.data.name]
}
},
set(newVal: any) {
if (props.tProp) {
emits('update:modelValue', newVal)
}
updateModel(newVal)
}
})
const updateModel = (val: any) => {
let controlAttribute = ""
if(props.data.control){
if(props.data.control.type){
controlAttribute = props.data.control.type
}
}
changeEvent &&
changeEvent({
key: props.data.name,
value: val,
data: props.data,
tProp: props.tProp,
type: props.data.type,
attribute: controlAttribute
})
}
const getLabel = (ele: FormItem) => {
const showColon = formProps.value.showColon ? ':' : ''
if (ele) {
return ele.showLabel ? '' : ele.label + showColon
} else {
return ''
}
}
// item
const itemRules = computed(() => {
let temp
const itemR: any = props.data.item?.rules || []
const customR = formatCustomRules()
// undefined
if (itemR?.length || customR?.length) {
temp = [...customR, ...itemR]
}
return temp
})
// customRulesrules
const formatCustomRules = () => {
const rulesReg: any = {}
validate &&
validate.forEach(item => {
rulesReg[item.type] = item.regExp
})
// 使provide
const temp: any = []
props.data.customRules?.forEach((item: any) => {
if (!item.message && item.type !== 'methods') {
return //
}
let obj = {}
if (item.type === 'required') {
obj = { required: true }
} else if (item.type === 'rules') {
//
obj = { pattern: item.rules }
} else if (item.type === 'methods') {
//
const methods: any = item.methods
if (methods) {
obj = { validator: inject(methods, {}) }
}
} else if (item.type) {
obj = { pattern: rulesReg[item.type as string] }
}
// push
let message: any = { message: item.message }
if (!item.message) {
// 使validatormessage使 callback(new Error('x'));
message = {}
}
temp.push(
Object.assign(
{
trigger: item.trigger || 'blur'
},
obj,
message
)
)
})
return temp
}
</script>
<style lang='scss' scoped>
.imgbox{
padding: 0 5px;
max-width: 300px;
max-height: 200px;
width: 100%;
height: 200px;
.image-slot {
display: flex;
justify-content: center;
align-items: center;
width: 100%;
height: 100%;
background: var(--el-fill-color-light);
color: var(--el-text-color-secondary);
font-size: 30px;
}
}
</style>

147
src/widget/lowcodeimage/lowcodeImage.vue

@ -0,0 +1,147 @@
<template>
<img referrerpolicy="no-referrer" :src="url" :style="styleObject" :fit="fit" :class="[boderAndShadowClassIsActive ? boderAndShadowClass : '', radiusClassIsActive ? radiusClass : '',mp, floatFlag ? floatStyle : '']" @click="handleLink(props.data?.control)" />
</template>
<script setup >
import errimg from '@/assets/404_images/imgNotFound.png'
const props = defineProps({
// eslint-disable-next-line vue/require-default-prop
data: {
type: Object,
}
})
/*
*/
let styleObject = {
}
let url = props.data?.control.imgUrl
if(props.data?.control.imgUrl===''){
url = errimg
}else{
url = props.data?.control.imgUrl
}
const fitNum = props.data?.control.fit
let fit= ''
switch (fitNum) {
case 1:
fit = "fill";
break;
case 2:
fit = "contain";
break;
case 3:
fit = "cover";
break;
case 4:
fit = "none";
break;
case 5:
fit = "scale-down";
break;
}
const showMode = props.data?.control.showMode
if (showMode==='自定义像素值') {
const pxWidth = props.data?.control.pxWidth
const pxHeight = props.data?.control.pxHeight
styleObject.width = pxWidth+'px';
styleObject.height = pxHeight+'px';
}else{
const widthPercent = props.data?.control.widthPercent
const heightPercent = props.data?.control.heightPercent
styleObject.width = widthPercent+'%';
styleObject.height = heightPercent+'%';
}
const radius = props.data?.control.radius
const radiusClass = ref('');
let radiusClassIsActive = false
let radiusNum = props.data?.control.radiusNum+'px'
if(radius === true ){
radiusClass.value = 'radius'
radiusClassIsActive = true
}
const mt = props.data?.control.mt+'px'
const mb = props.data?.control.mb+'px'
const ml = props.data?.control.ml+'px'
const mr = props.data?.control.mr+'px'
const pt = props.data?.control.pt+'px'
const pb = props.data?.control.pb+'px'
const pl = props.data?.control.pl+'px'
const pr = props.data?.control.pr+'px'
const mp = ref('mp')
const floatStyle = ref('floatStyle')
const floatFlag = props.data?.control.floatFlag
const floatValue = props.data?.control.floatValue
const boderAndShadowClass = ref('');
const boderAndShadow = props.data?.control.boderAndShadow
let boderAndShadowClassIsActive = false
if(boderAndShadow === true ){
boderAndShadowClass.value = 'boderAndShadow'
boderAndShadowClassIsActive = true
}
function handleLink(item){
console.log("handleLink")
let url = "";
let urlStart = 'http://'
// http:// 7
//https:// 8
if (item.link.length < 7) {
if (item.link == '') {
alert("未配置跳转地址")
return
}
url = urlStart + "" + item.link
} else {
const linkStartComplete1 = item.link.startsWith("http://")
const linkStartComplete2 = item.link.startsWith("https://")
if (linkStartComplete1 || linkStartComplete2) {
url = item.link
} else {
url = urlStart + "" + item.link
}
}
window.open(url, '_blank')
}
</script>
<style>
.boderAndShadow {
box-shadow: rgba(0, 0, 0, 0.24) 0px 3px 8px;
}
.radius {
border-radius: v-bind(radiusNum);
}
.mp {
margin-top: v-bind(mt);
margin-bottom: v-bind(mb);
margin-left:v-bind(ml);
margin-right:v-bind(mr);
padding-top: v-bind(pt);
padding-bottom: v-bind(pb);
padding-left: v-bind(pl);
padding-right: v-bind(pr);
}
.floatStyle {
float: v-bind(floatValue);
}
</style>

181
src/widget/lowcodetransfer/index.vue

@ -0,0 +1,181 @@
<!--
@ 作者: 李文轩
@ 时间: 2024-02-07 13:49:57
@ 备注:
-->
<template>
<el-form-item
v-bind="data.item"
:prop="tProp || data.name"
:class="config.className"
:rules="itemRules as any"
:label="getLabel(data.item as FormItem)"
>
<input v-model="value" type="hidden" >
</el-form-item>
<LowcodeTransfer :data="props.data"></LowcodeTransfer>
</template>
<script lang='ts' setup>
import LowcodeTransfer from './lowcodeTransfer.vue';
import {
constControlChange,
constFormProps,
} from '@/api/DesignForm/utils'
import validate from '@/api/DesignForm/validate'
import { FormItem, FormList } from '@/api/DesignForm/types'
const props = withDefaults(
defineProps<{
data: FormList
tablekey: any
numrun?: number
modelValue?: any //
tProp?: string // form-itemprop
}>(),
{}
)
const emits = defineEmits<{
(e: 'update:modelValue', numVal: any): void
}>()
const formProps = inject(constFormProps, {}) as any
const type = computed(() => {
return formProps.value.type
})
const config = computed(() => {
return props.data.config || {}
})
const changeEvent = inject(constControlChange, '') as any
const value = computed({
get() {
if (props.tProp) {
//
return props.modelValue
} else {
return formProps.value.model[props.data.name]
}
},
set(newVal: any) {
if (props.tProp) {
emits('update:modelValue', newVal)
}
updateModel(newVal)
}
})
const updateModel = (val: any) => {
let controlAttribute = ""
if(props.data.control){
if(props.data.control.type){
controlAttribute = props.data.control.type
}
}
changeEvent &&
changeEvent({
key: props.data.name,
value: val,
data: props.data,
tProp: props.tProp,
type: props.data.type,
attribute: controlAttribute
})
}
const getLabel = (ele: FormItem) => {
const showColon = formProps.value.showColon ? ':' : ''
if (ele) {
return ele.showLabel ? '' : ele.label + showColon
} else {
return ''
}
}
// item
const itemRules = computed(() => {
let temp
const itemR: any = props.data.item?.rules || []
const customR = formatCustomRules()
// undefined
if (itemR?.length || customR?.length) {
temp = [...customR, ...itemR]
}
return temp
})
// customRulesrules
const formatCustomRules = () => {
const rulesReg: any = {}
validate &&
validate.forEach(item => {
rulesReg[item.type] = item.regExp
})
// 使provide
const temp: any = []
props.data.customRules?.forEach((item: any) => {
if (!item.message && item.type !== 'methods') {
return //
}
let obj = {}
if (item.type === 'required') {
obj = { required: true }
} else if (item.type === 'rules') {
//
obj = { pattern: item.rules }
} else if (item.type === 'methods') {
//
const methods: any = item.methods
if (methods) {
obj = { validator: inject(methods, {}) }
}
} else if (item.type) {
obj = { pattern: rulesReg[item.type as string] }
}
// push
let message: any = { message: item.message }
if (!item.message) {
// 使validatormessage使 callback(new Error('x'));
message = {}
}
temp.push(
Object.assign(
{
trigger: item.trigger || 'blur'
},
obj,
message
)
)
})
return temp
}
</script>
<style lang='scss' scoped>
.imgbox{
padding: 0 5px;
max-width: 300px;
max-height: 200px;
width: 100%;
height: 200px;
.image-slot {
display: flex;
justify-content: center;
align-items: center;
width: 100%;
height: 100%;
background: var(--el-fill-color-light);
color: var(--el-text-color-secondary);
font-size: 30px;
}
}
</style>

394
src/widget/lowcodetransfer/lowcodeTransfer.vue

@ -0,0 +1,394 @@
<template>
<div v-if="dataFinished" class="transfer">
<div class="leftArea">
<div class="transferName">{{ transferConfig.transferName }}</div>
<div style="padding-left: 15px; padding-right: 25px;margin-top: 10px;margin-bottom: 8px;">
<ElInput v-model="keyword" placeholder="搜索">
<template #prefix>
<ElIcon class="el-input__icon">
<Search />
</ElIcon>
</template>
</ElInput>
</div>
<div class="leftScroll">
<ElScrollbar height="100%">
<ElTree
ref="treeRef" node-key="id" empty-text="暂无数据" :data="userList" :props="treeProps" show-checkbox
highlight-current :default-expand-all="isExpandAll" :filter-node-method="filterNode"
@check="handleCheckList" @check-change="getCheckedList" />
</ElScrollbar>
</div>
</div>
<div class="rigthArea">
<div style="margin-bottom: 8px;">
<div class="transferName"><span>已选: {{ checkList.length }}</span><ElButton link style="float: right;margin-right: 5px;" @click="clearCheckList" >清空</ElButton></div>
</div>
<ElScrollbar height="calc(100% - 50px)">
<ElTag v-for="user in checkList" :key="user.id" style="display: block; font-size: 13px; letter-spacing: 1.5px;text-align: center;margin-top: 8px;height: 30px;width: 75%;margin-left:40px;padding-top: 6px;" closable @close="handleCloseTag(user)">
{{
user.label
}}[{{
user.parent.data.label
}}]
</ElTag>
</ElScrollbar>
</div>
</div>
</template>
<script setup name="MultiTreeSelector">
import { ref, watch, onMounted } from 'vue'
import request from '@/utils/request';
const props = defineProps({
// eslint-disable-next-line vue/require-default-prop
data: {
type: Object,
}
})
const fixedOptions = props.data?.control.fixedOptions
const transferConfig = props.data?.config
const treeProps = {
value: 'id',
label: 'label',
disabled: 'disabled',
children: 'children'
}
let dataFinished = false
const treeRef = ref()
const isExpandAll = ref(true) //
const keyword = ref('') //
const checkList = ref([]) // list
const userList = ref([])
let checkedIdList = ["302697","ceshi","301625"];
checkedIdList = [];
const url = transferConfig.apiUrl;/* '/javasys/lowCode/transfer/getOrgAndManTree' */
function getDetail() {
//console.log(11111)
if(transferConfig.transferDataSource==="数据源"){
return request({
url: url,
method: transferConfig.method,
});
}
}
if(transferConfig.transferDataSource==="数据源"){
getDetail().then(({ data }) => {
//console.log(`穿`);
let resData = ref(data.children)
// 2: node
userList.value = [{
id: '全选',
label: '全选',
children: [...resData.value]
}]
treeRef.value.setCheckedKeys(checkedIdList,true)
setTimeout(() => {
checkedIdList.forEach(element => {
const _node = treeRef?.value?.getNode(element)
if (!_node) return
const _checkList = checkList.value
if (_node.checked) { //
if (_node.checked && _node.childNodes.length === 0) {
_checkList.push(_node)
}
// new Set()
checkList.value = Array.from(new Set(_checkList))
// ,,
if (_node.childNodes.length > 0) {
_node.childNodes.map(item => handleCheckList(item.data))
}
} else if (!_node.checked) { //
checkList.value = checkList.value.filter(item => item.checked)
}
});
}, 50);
});
}
const getCheckedList = () => {
checkedIdList = treeRef.value.getCheckedKeys(true)
}
let resData1 = ref([
{
id: '3',
label: '营销部',
children: [
{
id: '3-1',
label: '威震天'
},
{
id: '3-2',
label: '嫦娥'
}
]
},
{
id: '2',
label: '业务部',
children: [
{
id: '2-1-1',
label: '业务部子部1',
children: [
{
id: '2-1-0001',
label: '李白'
},
{
id: '2-1-0002',
label: '萧峰'
}
]
},
{
id: '2-2-1',
label: '业务部子部2',
children: [
{
id: '2-2-00006',
label: '武则天'
},
{
id: '2-2-00005',
label: '拿破仑'
}
]
}
]
},
{
id: '4',
label: '软件开发部',
children: [
{
id: '5-3',
label: '张辽'
},
{
id: '5-9',
label: '吕布'
},
{
id: '5-0',
label: '许褚'
},
]
}
])
//
const handleCheckList = (val) => {
const valId = val.id;
const _node = treeRef?.value?.getNode(valId)
if (!_node) return
const _checkList = checkList.value
if (_node.checked) { //
if (_node.checked && _node.childNodes.length === 0) {
_checkList.push(_node)
}
// new Set()
checkList.value = Array.from(new Set(_checkList))
// ,,
if (_node.childNodes.length > 0) {
_node.childNodes.map(item => handleCheckList(item.data))
}
} else if (!_node.checked) { //
checkList.value = checkList.value.filter(item => item.checked)
}
}
/*
* @node 当前节点
* @result 存结果的数组
* @key
* */
const getParentNode = (node, result, key) => {
let isPass = node?.data?.label?.indexOf(key) !== -1
isPass ? result.push(isPass) : ''
if (!isPass && node.level !== 1 && node.parent) {
return getParentNode(node.parent, result, key)
}
}
/*
* @value 过滤的关键字
* @data 被过滤的tree
* @node
* */
const filterNode = (value, data, node) => {
if (!value) {
data.disabled = false
return true
} else {
//,
// array.map(k => (!k.disabled) && (_childArr.push(k)))
(data.children) && (data.disabled = true)
}
let _arr = []
getParentNode(node, _arr, value)
let result = false
_arr.forEach(item => {
result = result || item
})
return result
}
// tag
const handleCloseTag = (tag) => {
if (!treeRef?.value) return
checkList.value = checkList.value.filter(item => {
treeRef.value.setChecked(tag, false)
if (!item?.data) return
return item.data.id !== tag.data.id
})
}
// CheckList
const clearCheckList = () => {
if (!treeRef?.value) return
treeRef.value.setCheckedKeys([])
while (checkList.value.length > 0) {
checkList.value.pop()
}
}
// /
const handleCheckAll = (array) => {
treeRef.value.setCheckedNodes(array)
array.map(item => {
handleCheckList(item)
})
}
// /
const expandAll = () => {
const nodesMap = treeRef.value.store.nodesMap
for (let key in nodesMap) {
nodesMap[key].expanded = isExpandAll.value
}
}
// tree
watch(keyword, (newVal) => {
treeRef.value.filter(newVal)
})
//
if(transferConfig.transferDataSource==="固定选项"){
setTimeout(() => {
// 2: node
userList.value = [{
id: '全选',
label: '全选',
children: fixedOptions
}]
//console.log(treeRef)
treeRef.value.setCheckedKeys(checkedIdList,true)
setTimeout(() => {
checkedIdList.forEach(element => {
const _node = treeRef?.value?.getNode(element)
if (!_node) return
const _checkList = checkList.value
if (_node.checked) { //
if (_node.checked && _node.childNodes.length === 0) {
_checkList.push(_node)
}
// new Set()
checkList.value = Array.from(new Set(_checkList))
// ,,
if (_node.childNodes.length > 0) {
_node.childNodes.map(item => handleCheckList(item.data))
}
} else if (!_node.checked) { //
checkList.value = checkList.value.filter(item => item.checked)
}
});
}, 50);
}, 50);
dataFinished = true
}else{
getDetail
dataFinished = true
}
onMounted(() => {
})
</script>
<style scoped>
.transfer {
display: flex;
}
.transferName {
height: 30px;
padding-top: 8px;
background-color: #F5F7FA;
padding-left: 10px;
border-radius: 5px 5px 0 0;
border-bottom: 1px solid gainsboro;
}
.buttonArea {
display: flex;
flex-direction: row;
align-items: center;
}
.buttonArea2 {
height: 33px;
}
.leftScroll {
height: 367px;
}
.leftArea {
border: 1px solid gainsboro;
width: 300px;
border-radius: 5px;
height: 456px;
position: relative;
background-color: white;
}
.rigthArea {
border: 1px solid gainsboro;
width: 300px;
border-radius: 5px;
height: 456px;
background-color: white;
}</style>
Loading…
Cancel
Save