Browse Source

修改BUG

qin_v16
hreenshan112 9 months ago
parent
commit
ba5efecfe3
  1. 4
      src/components/DesignForm/aceDrawer.vue
  2. 69
      src/components/DesignForm/formControlPropertiNew.vue
  3. 158
      src/components/DesignForm/public/expand/digitpage.vue
  4. 193
      src/components/DesignForm/public/expand/lowcodeImage.vue
  5. 299
      src/components/DesignForm/public/expand/uploadPage.vue
  6. 493
      src/components/DesignForm/public/form/childTable.vue
  7. 1
      src/components/DesignForm/public/form/formGroup.vue
  8. 1
      src/components/DesignForm/public/form/formItem.vue
  9. 10
      src/components/IconSelect/appMenuSvgPage.vue
  10. 605
      src/views/sysworkflow/lowcodepage/appPage/appMenus.vue
  11. 211
      src/views/sysworkflow/lowcodepage/appPage/appSetUp/index.vue
  12. 327
      src/views/sysworkflow/lowcodepage/appPage/appSetUp/setup.vue
  13. 3
      src/views/sysworkflow/lowcodepage/newLowCode/appLayoutEdit/appContainerPage.vue
  14. 329
      src/widget/lowcodeimage/lowcodeImage.vue

4
src/components/DesignForm/aceDrawer.vue

@ -227,7 +227,7 @@ const dialogConfirmTree = () => {
*/
const pickDel = (val: treeStruct) => {
console.log("要删除得节点-->", val.value);
delDiGui(treeSelectAry, val);
delDiGui(treeSelectAry.value, val);
console.log("删除指定节点数据---结果-->", treeSelectAry);
};
/**
@ -236,10 +236,12 @@ const pickDel = (val: treeStruct) => {
@ 功能: 执行递归删除
*/
const delDiGui = (tree: treeStruct[], val: treeStruct) => {
console.log("要删除得节点-11->", tree, val.value);
for (let i = 0; i < tree.length; i++) {
const node = tree[i];
if (node.value == val.value) {
tree.splice(i, 1);
return;
}
if (Array.isArray(node.children) && node.children.length) {

69
src/components/DesignForm/formControlPropertiNew.vue

@ -336,6 +336,12 @@ const attrList = computed(() => {
],
eventName: "labelNameVal",
},
{
label: "标题",
value: control.modelValue,
path: "control.modelValue",
vShow: ["title"],
},
{
label: "组件类型",
value: unitName,
@ -527,7 +533,7 @@ const attrList = computed(() => {
path: "config.append",
vShow: ["input", "password", "digitpage"],
},
// {
// label: '',
// value: control.activeValue,
@ -667,12 +673,7 @@ const attrList = computed(() => {
vShow: ["select", "inputSlot"],
eventName: "setInputSlot",
},
{
label: "标题",
value: control.modelValue,
path: "control.modelValue",
vShow: ["title"],
},
{
label: "占据的列数span",
value: attr.span,
@ -3389,14 +3390,14 @@ const gainFormGroupList = () => {
//liwenxuan 2025 start
const scanTypes = [
{
value: 'QrCode',
label: '二维码',
value: "QrCode",
label: "二维码",
},
{
value: 'OCR',
label: '光学字符识别',
value: "OCR",
label: "光学字符识别",
},
]
];
//liwenxuan 2025 end
let asfs: any[] = [];
@ -3759,17 +3760,20 @@ watch(
// }
});
} else {
formData.value.dataSourceConfig.id = "";
formData.value.dataSourceConfig.dataBaseName = "";
formData.value.dataSourceConfig.tableName = "";
formData.value.dataSourceConfig.tableKey = "";
formData.value.dataSourceConfig.dsn = {
dataBaseName: "",
ip: "",
port: 0,
userName: "",
password: "",
};
console.log("formData.value---------------", formData.value);
if (formData.value.dataSourceConfi) {
formData.value.dataSourceConfig.id = "";
formData.value.dataSourceConfig.dataBaseName = "";
formData.value.dataSourceConfig.tableName = "";
formData.value.dataSourceConfig.tableKey = "";
formData.value.dataSourceConfig.dsn = {
dataBaseName: "",
ip: "",
port: 0,
userName: "",
password: "",
};
}
formAttr.value.forEach((item) => {
console.log(item.label, "item.", item.type);
@ -4255,7 +4259,8 @@ const updataBase = (val: any) => {
>
</el-row>
<el-row v-else-if="item.type === 'input'"><!-- 移动端扫描输入 -->
<el-row v-else-if="item.type === 'input'"
><!-- 移动端扫描输入 -->
<el-switch v-model="controlData.control.scanInputFlag" />
<div
v-if="controlData.control.scanInputFlag"
@ -4267,21 +4272,19 @@ const updataBase = (val: any) => {
padding-bottom: 6px;
"
>
<div style="margin-right: 12px;">扫描方式</div>
<div style="margin-right: 12px">扫描方式</div>
<el-select
v-model="controlData.control.scanType"
style="width: 150px; height:20px">
<el-option
v-model="controlData.control.scanType"
style="width: 150px; height: 20px"
>
<el-option
v-for="scanType in scanTypes"
:key="scanType.value"
:label="scanType.label"
:value="scanType.value"
/>
</el-select>
/>
</el-select>
</div>
</el-row>
<el-row v-else-if="item.type === 'associatedForms_dataRange'">

158
src/components/DesignForm/public/expand/digitpage.vue

@ -3,26 +3,42 @@
@ 时间: 2024-09-12 10:25:52
@ 备注: 分值
-->
<script lang='ts' setup>
import { AnalysisCss,AnalysisInputCss } from '@/components/DesignForm/public/form/calculate/cssInfo.ts'
<script lang="ts" setup>
import {
formatNumber,
objectToArray,
constControlChange,
constSetFormOptions,
constFormProps,
constGetControlByName,
} from "@/api/DesignForm/utils";
import {
AnalysisCss,
AnalysisInputCss,
} from "@/components/DesignForm/public/form/calculate/cssInfo.ts";
const props = withDefaults(
defineProps<{
modelValue?: string
disabled?: boolean
}>(),
{}
)
defineProps<{
data?: Object;
modelValue?: string;
disabled?: boolean;
}>(),
{}
);
const getControlByName = inject(constGetControlByName) as any;
const emits = defineEmits<{
(e: 'update:modelValue', value: string): void
}>()
(e: "update:modelValue", value: string): void;
}>();
const value = computed({
get: () => {
return props.modelValue
},
set: (newVal: any) => {
emits('update:modelValue', newVal)
},
get: () => {
return props.modelValue;
},
set: (newVal: any) => {
emits("update:modelValue", newVal);
},
});
const config = computed(() => {
return props.data.config || {};
});
/**
@ 作者: 秦东
@ -30,21 +46,103 @@ const value = computed({
@ 功能: 布局处理
*/
const getFormItemLableStyle = (ele: any) => {
if(ele?.labelStyle){
// console.log("3",AnalysisCss(ele?.labelStyle))
return AnalysisCss(ele?.labelStyle)
}
}
const getFormItemInputStyle = (ele: any,sty:number) => {
if(ele?.inputStyle){
//console.log("4",AnalysisInputCss(ele?.inputStyle,sty))
return AnalysisInputCss(ele?.inputStyle,sty)
if (ele?.labelStyle) {
// console.log("3",AnalysisCss(ele?.labelStyle))
return AnalysisCss(ele?.labelStyle);
}
};
const getFormItemInputStyle = (ele: any, sty: number) => {
if (ele?.inputStyle) {
//console.log("4",AnalysisInputCss(ele?.inputStyle,sty))
return AnalysisInputCss(ele?.inputStyle, sty);
}
};
const getInputSlot = (key?: string) => {
const slot = key === "p" ? config.value.prepend : config.value.append;
const has = slot.indexOf("key:") === 0;
if (!has) {
return false;
}
const slotKey = slot.replace("key:", "");
const control = getControlByName(slotKey);
if (!control || Object.keys(control)?.length === 0) {
return false;
}
return control;
};
/**
@ 作者: 秦东
@ 时间: 2024-07-27 15:11:42
@ 功能: 判断是否禁用
*/
const judgeIsDisabled = (key: string) => {
if (type.value === 3) {
return true; //
}
if (type.value === 1 && config.value.addDisabled) {
return true;
}
if (type.value === 2 && config.value.editDisabled) {
return true; //
}
if (
props.nodeKey != undefined &&
props.purview != undefined &&
props.purview != null &&
props.purview != null &&
props.purview != "" &&
props.purview != ""
) {
if (props.purview.length < 1) {
return false;
} else {
let isShow = true;
props.purview.forEach((item) => {
if (item.nodeKey == props.nodeKey) {
if (item.powerAry && item.powerAry.length > 0) {
item.powerAry.forEach((itm) => {
if (itm.id == key) {
console.log(
"判断此组件是否禁用",
itm,
itm.id == key,
"--------->",
itm.isLook
);
isShow = !itm.isEdit;
}
});
}
}
});
return isShow;
}
}
} else {
return false;
}
};
</script>
<template>
<el-input v-bind="$props" v-model="value" :style="getFormItemInputStyle(configStyle,2)" :input-style="getFormItemInputStyle(configStyle,3)" oninput ="value=value.replace(/[^\d.]/g, '').replace(/\.{2,}/g, '.').replace('.', '$#$').replace(/\./g, '').replace('$#$', '.').replace(/^\./g, '')" placeholder="请输入"></el-input>
<el-input
v-bind="$props"
v-model="value"
:style="getFormItemInputStyle(configStyle, 2)"
:input-style="getFormItemInputStyle(configStyle, 3)"
oninput="value=value.replace(/[^\d.]/g, '').replace(/\.{2,}/g, '.').replace('.', '$#$').replace(/\./g, '').replace('$#$', '.').replace(/^\./g, '')"
placeholder="请输入"
>
<template #append v-if="config.append">
<div v-if="getInputSlot()">
<AKSelect
:data="getInputSlot()"
:disabled="judgeIsDisabled(data.name)"
:transform-option="transformOption"
type="slot"
@change="inputSlotChange"
/>
</div>
<span v-else>{{ config.append }}</span>
</template>
</el-input>
</template>
<style lang='scss' scoped>
</style>
<style lang="scss" scoped></style>

193
src/components/DesignForm/public/expand/lowcodeImage.vue

@ -3,119 +3,124 @@
@ 时间: 2024-09-12 10:44:17
@ 备注: 图片
-->
<script lang='ts' setup>
import { AnalysisCss,AnalysisInputCss } from '@/components/DesignForm/public/form/calculate/cssInfo.ts'
import errimg from '@/assets/404_images/imgNotFound.png'
import { uploadUrl,getRequest } from '@/api/DesignForm'
<script lang="ts" setup>
import {
AnalysisCss,
AnalysisInputCss,
} from "@/components/DesignForm/public/form/calculate/cssInfo.ts";
import errimg from "@/assets/404_images/imgNotFound.png";
import { uploadUrl, getRequest } from "@/api/DesignForm";
const props = withDefaults(
defineProps<{
modelValue?: string
disabled?: boolean
tablekey?: Object
data?: Object
formTableSetUp?: Object
imgUrl?: string
}>(),
{}
)
defineProps<{
modelValue?: string;
disabled?: boolean;
tablekey?: Object;
data?: Object;
formTableSetUp?: Object;
imgUrl?: string;
}>(),
{}
);
const emits = defineEmits<{
(e: 'update:modelValue', value: string): void
}>()
(e: "update:modelValue", value: string): void;
}>();
const value = computed({
get: () => {
if(props.data.control.imgUrl == ""){
return props.modelValue?props.modelValue:errimg;
}else{
return props.data.control.imgUrl
}
},
set: (newVal: any) => {
emits('update:modelValue', newVal)
return newVal
},
get: () => {
if (props.data.control.imgUrl == "") {
return props.modelValue ? props.modelValue : errimg;
} else {
return props.data.control.imgUrl;
}
},
set: (newVal: any) => {
emits("update:modelValue", newVal);
return newVal;
},
});
//css
const configStyle = computed(() => {
return props.data.styles || {}
})
return props.data.styles || {};
});
const imgLoading = ref(false)
const imgPath = ref(errimg)
const imgLoading = ref(false);
const imgPath = ref(errimg);
//
const beforeAvatarUpload = (rawFile) => {
imgLoading.value = true
imgLoading.value = true;
// console.log("",rawFile.type)
let imgType = ['image/jpeg','image/jpg','image/png','image/gif','image/svg']
let imgType = ["image/jpeg", "image/jpg", "image/png", "image/gif", "image/svg"];
if (!imgType.includes(rawFile.type)) {
ElMessage.error('您上传的不是图片!')
imgLoading.value = false
return false
ElMessage.error("您上传的不是图片!");
imgLoading.value = false;
return false;
} else if (rawFile.size / 1024 / 1024 > 200) {
ElMessage.error('您上传到额图片大于 200MB!')
imgLoading.value = false
return false
ElMessage.error("您上传到额图片大于 200MB!");
imgLoading.value = false;
return false;
}
return true
}
return true;
};
//
const handleAvatarSuccess = (
response,
uploadFile
) => {
const handleAvatarSuccess = (response, uploadFile) => {
// imageUrl.value = URL.createObjectURL(uploadFile.raw!)
console.log("上传成功回调",value)
emits('update:modelValue', response.data.url)
imgPath.value = response.data.url
value.value=response.data.url
console.log("上传成功回调---------->",value.value)
// let oldFormSetUp = props.formTableSetUp
// if(props.formTableSetUp && props.formTableSetUp.list && props.formTableSetUp.list.length > 0){
// oldFormSetUp.list.forEach((item)=>{
// if(item.name && item.name == props.data.name){
// // value.value = response.data.url
// // item.control.link = response.data.url
// value.set(response.data.url)
// emits('update:modelValue', response.data.url)
// console.log("------>",response.data.url)
// }
// })
// }
// props.setimgurl=response.data.url
// emits("update:imgUrl",response.data.url)
// console.log("------>",url.value)
// emits("updateCont",response.data.url)
console.log("上传成功回调", value);
imgLoading.value = false
}
const getFormItemInputStyle = (ele: any,sty:number) => {
if(ele?.inputStyle){
console.log("返回栅格宽度4",AnalysisInputCss(ele?.inputStyle,sty))
return AnalysisInputCss(ele?.inputStyle,sty)
}
}
emits("update:modelValue", response.data.url);
imgPath.value = response.data.url;
value.value = response.data.url;
console.log("上传成功回调---------->", value.value);
// let oldFormSetUp = props.formTableSetUp
// if(props.formTableSetUp && props.formTableSetUp.list && props.formTableSetUp.list.length > 0){
// oldFormSetUp.list.forEach((item)=>{
// if(item.name && item.name == props.data.name){
// // value.value = response.data.url
// // item.control.link = response.data.url
// value.set(response.data.url)
// emits('update:modelValue', response.data.url)
// console.log("------>",response.data.url)
// }
// })
// }
// props.setimgurl=response.data.url
// emits("update:imgUrl",response.data.url)
// console.log("------>",url.value)
// emits("updateCont",response.data.url)
imgLoading.value = false;
};
const getFormItemInputStyle = (ele: any, sty: number) => {
if (ele?.inputStyle) {
console.log("返回栅格宽度4", AnalysisInputCss(ele?.inputStyle, sty));
return AnalysisInputCss(ele?.inputStyle, sty);
}
};
</script>
<template>
<el-upload
v-bind="$props"
class="upload-demo"
:action="uploadUrl"
:show-file-list="false"
:on-success="handleAvatarSuccess"
:before-upload="beforeAvatarUpload"
v-loading="imgLoading"
>
<!-- <img referrerpolicy="no-referrer" :src="url" :style="styleObject" :fit="fit" :class="[boderAndShadowClassIsActive ? boderAndShadowClass : '', radiusClassIsActive ? radiusClass : '',mp, floatFlag ? floatStyle : '']" /> -->
<img v-if="value" :src="value" class="avatar" :style="getFormItemInputStyle(configStyle,2)" />
<el-icon v-else class="avatar-uploader-icon"><Plus /></el-icon>
</el-upload>
<el-upload
v-bind="$props"
class="upload-demo"
:action="uploadUrl"
:show-file-list="false"
:on-success="handleAvatarSuccess"
:before-upload="beforeAvatarUpload"
v-loading="imgLoading"
>
<!-- <img referrerpolicy="no-referrer" :src="url" :style="styleObject" :fit="fit" :class="[boderAndShadowClassIsActive ? boderAndShadowClass : '', radiusClassIsActive ? radiusClass : '',mp, floatFlag ? floatStyle : '']" /> -->
<img
v-if="value"
:src="value"
class="avatar"
:style="getFormItemInputStyle(configStyle, 2)"
/>
<el-icon v-else class="avatar-uploader-icon"><Plus /></el-icon>
</el-upload>
</template>
<style lang='scss' scoped>
<style lang="scss" scoped>
.upload-demo {
img {
width: 100%;
}
}
</style>

299
src/components/DesignForm/public/expand/uploadPage.vue

@ -3,172 +3,173 @@
@ 时间: 2024-09-17 10:44:30
@ 备注: 上传组件
-->
<script lang='ts' setup>
import { AnalysisCss,AnalysisInputCss } from '@/components/DesignForm/public/form/calculate/cssInfo'
import { uploadUrl,getRequest } from '@/api/DesignForm'
import {
formatNumber,
objectToArray,
constControlChange,
constSetFormOptions,
constFormProps,
constGetControlByName
} from '@/api/DesignForm/utils'
<script lang="ts" setup>
import {
AnalysisCss,
AnalysisInputCss,
} from "@/components/DesignForm/public/form/calculate/cssInfo";
import { uploadUrl, getRequest } from "@/api/DesignForm";
import {
formatNumber,
objectToArray,
constControlChange,
constSetFormOptions,
constFormProps,
constGetControlByName,
} from "@/api/DesignForm/utils";
const props = withDefaults(
defineProps<{
modelValue?: string
disabled?: boolean
action?: string
name?: string
fileList?: Object
control?: Object
config?: Object
data?: Object
}>(),
{}
)
defineProps<{
modelValue?: string;
disabled?: boolean;
action?: string;
name?: string;
fileList?: Object;
control?: Object;
config?: Object;
data?: Object;
}>(),
{}
);
const emits = defineEmits<{
(e: 'update:modelValue', value: string): void
}>()
(e: "update:modelValue", value: string): void;
}>();
const value = computed({
get: () => {
console.log("图片上传处理-112->",props.modelValue)
// if(props.modelValue != ""){
// return props.modelValue.split(",");
// }else{
// return props.modelValue
// }
return props.modelValue
},
set: (newVal: any) => {
emits('update:modelValue', newVal)
return newVal
},
get: () => {
console.log("图片上传处理-112->", props.modelValue);
// if(props.modelValue != ""){
// return props.modelValue.split(",");
// }else{
// return props.modelValue
// }
return props.modelValue;
},
set: (newVal: any) => {
emits("update:modelValue", newVal);
return newVal;
},
});
const formProps = inject(constFormProps, {}) as any
const formProps = inject(constFormProps, {}) as any;
// -----------------------
const fileList = computed<any>(() => {
// const imgVal = formProps.value.model[props.data.name]
console.log("图片上传处理-2->",value.value)
const imgVal = value.value
console.log("图片上传处理-->",imgVal)
if (imgVal && typeof imgVal === 'string') {
// console.log("-2->",imgVal)
const temp: any = []
imgVal.split(',').forEach((item: string) => {
// console.log("-3->",item)
temp.push({
name: item,
url: item
})
})
return temp
}
return imgVal || [] // array([name:'',url:''])
})
// const imgVal = formProps.value.model[props.data.name]
console.log("图片上传处理-2->", value.value);
const imgVal = value.value;
console.log("图片上传处理-->", imgVal);
if (imgVal && typeof imgVal === "string") {
// console.log("-2->",imgVal)
const temp: any = [];
imgVal.split(",").forEach((item: string) => {
// console.log("-3->",item)
temp.push({
name: item,
url: item,
});
});
return temp;
}
return imgVal || []; // array([name:'',url:''])
});
//
const getFormItemInputStyle = (ele: any,sty:number) => {
if(ele?.inputStyle){
console.log("返回栅格宽度4",AnalysisInputCss(ele?.inputStyle,sty))
return AnalysisInputCss(ele?.inputStyle,sty)
}
}
const getFormItemInputStyle = (ele: any, sty: number) => {
if (ele?.inputStyle) {
console.log("返回栅格宽度4", AnalysisInputCss(ele?.inputStyle, sty));
return AnalysisInputCss(ele?.inputStyle, sty);
}
};
//css
const configStyle = computed(() => {
return props.data.styles || {}
})
return props.data.styles || {};
});
//
const uploadRemove = (uploadFile: any, uploadFiles: any) => {
const oldList: any = []
fileList.value.forEach((item: any) => {
if (item.url !== uploadFile.url) {
oldList.push(item.url)
}
})
value.value = oldList
updateModel(oldList.join(','))
// props.control.value.onRemove && props.control.value.onRemove(uploadFile, uploadFiles)
// todo
}
const oldList: any = [];
fileList.value.forEach((item: any) => {
if (item.url !== uploadFile.url) {
oldList.push(item.url);
}
});
value.value = oldList;
updateModel(oldList.join(","));
// props.control.value.onRemove && props.control.value.onRemove(uploadFile, uploadFiles)
// todo
};
//
const uploadError = (err: any, file: any, fileList: any) => {
// console.log('uploadError')
ElMessage.error(file.name + '上传失败')
props.control.value.onError && props.control.value.onError(err, file, fileList)
}
const changeEvent = inject(constControlChange, '') as any
// console.log('uploadError')
ElMessage.error(file.name + "上传失败");
props.control.value.onError && props.control.value.onError(err, file, fileList);
};
const changeEvent = inject(constControlChange, "") as any;
const updateModel = (val: any) => {
console.log("图片上传处理-111->",val)
value.value = val
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
// })
}
console.log("图片上传处理-111->", val);
value.value = val;
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 uploadSuccess = (response: any, uploadFile: any, uploadFiles: any) => {
// console.log("response==>",response)
// console.log("uploadFile==>",uploadFile)
// console.log("uploadFiles==>",uploadFiles)
const oldList = []
fileList.value.forEach((item: any) => {
oldList.push(item.url)
})
// oldList.push(response.path)
oldList.push(response.data.url)
updateModel(oldList.join(','))
// props.control.value.onSuccess &&
// props.control.value.onSuccess(response, uploadFile, uploadFiles)
// console.log("uploadSuccess===>",control.value)
// console.log("uploadSuccess=fileList==>",fileList)
}
// console.log("response==>",response)
// console.log("uploadFile==>",uploadFile)
// console.log("uploadFiles==>",uploadFiles)
const oldList = [];
fileList.value.forEach((item: any) => {
oldList.push(item.url);
});
// oldList.push(response.path)
oldList.push(response.data.url);
updateModel(oldList.join(","));
// props.control.value.onSuccess &&
// props.control.value.onSuccess(response, uploadFile, uploadFiles)
// console.log("uploadSuccess===>",control.value)
// console.log("uploadSuccess=fileList==>",fileList)
};
</script>
<template>
<div>
<el-upload
v-bind="props.control"
:action="uploadUrl"
:name="props.name"
:class="{limit: props.control.limit <= fileList.length}"
:file-list="fileList as any"
:style="getFormItemInputStyle(configStyle,2)"
:on-error="uploadError"
:on-success="uploadSuccess"
:on-remove="uploadRemove"
>
<i class="icon-plus" v-if="props.control?.listType=='picture-card'"></i>
<el-button type="primary" plain v-else-if="props.control?.listType=='picture'">
<span v-if="props.config?.btnText">{{ props.config?.btnText }} </span>
<span class="fa fa-plus" v-else></span>
</el-button>
<template v-else>
<el-button type="primary" plain v-if="props.config?.btnText">
{{ props.config?.btnText }}
</el-button>
<i class="icon-plus" v-else></i>
</template>
<template #tip v-if="props.config?.tip">
<div class="el-upload__tip">
{{ props.config?.tip }}
</div>
</template>
</el-upload>
</div>
<div>
<el-upload
v-bind="props.control"
:action="uploadUrl"
:name="props.name"
:class="{ limit: props.control.limit <= fileList.length }"
:file-list="fileList as any"
:style="getFormItemInputStyle(configStyle, 2)"
:on-error="uploadError"
:on-success="uploadSuccess"
:on-remove="uploadRemove"
>
<i class="icon-plus" v-if="props.control?.listType == 'picture-card'"></i>
<el-button type="primary" plain v-else-if="props.control?.listType == 'picture'">
<span v-if="props.config?.btnText">{{ props.config?.btnText }} </span>
<span class="fa fa-plus" v-else></span>
</el-button>
<template v-else>
<el-button type="primary" plain v-if="props.config?.btnText">
{{ props.config?.btnText }}
</el-button>
<i class="icon-plus" v-else></i>
</template>
<template #tip v-if="props.config?.tip">
<div class="el-upload__tip">
{{ props.config?.tip }}
</div>
</template>
</el-upload>
</div>
</template>
<style lang='scss' scoped>
</style>
<style lang="scss" scoped></style>

493
src/components/DesignForm/public/form/childTable.vue

@ -3,275 +3,286 @@
@ 时间: 2023-07-14 08:51:25
@ 备注: 表单子表
-->
<script lang='ts' setup>
import FormItem from './formItem.vue'
import { inject, computed } from 'vue'
import Tooltips from '@/components/DesignForm/tooltip.vue'
import {constFormProps } from '@/api/DesignForm/utils'
import { jsonParseStringify } from '@/utils/DesignForm'
import LowcodeImagePage from '@/components/DesignForm/public/expand/lowcodeImage.vue'
import AssociatedForms from '@/widget/associatedforms/index.vue'
import UploadPageList from '@/components/DesignForm/public/expand/uploadPageList.vue'
import LokOrgCentent from '@/widget/org/cont.vue'
import { SCOPE } from 'element-plus'
<script lang="ts" setup>
import FormItem from "./formItem.vue";
import { inject, computed } from "vue";
import Tooltips from "@/components/DesignForm/tooltip.vue";
import { constFormProps } from "@/api/DesignForm/utils";
import { jsonParseStringify } from "@/utils/DesignForm";
import LowcodeImagePage from "@/components/DesignForm/public/expand/lowcodeImage.vue";
import AssociatedForms from "@/widget/associatedforms/index.vue";
import UploadPageList from "@/components/DesignForm/public/expand/uploadPageList.vue";
import LokOrgCentent from "@/widget/org/cont.vue";
import { SCOPE } from "element-plus";
const props = withDefaults(
defineProps<{
data: any
}>(),
{
data: () => {
return {}
}
}
)
const formProps = inject(constFormProps, {}) as any
defineProps<{
data: any;
}>(),
{
data: () => {
return {};
},
}
);
const sunTableName = computed(() => {
return props.data.item ? (props.data.item.label ? props.data.item.label : "") : "";
});
const formProps = inject(constFormProps, {}) as any;
const tableDataNew = computed(() => {
// console.log("-----1---->",props.data.name)
// console.log("-----2---->",formProps.value.model[props.data.name])
// console.log("-----3---->",formProps.value.model)
// console.log("-----4---->",formProps.value)
return formProps.value.model[props.data.name]
})
// console.log("-----1---->",props.data.name)
// console.log("-----2---->",formProps.value.model[props.data.name])
// console.log("-----3---->",formProps.value.model)
// console.log("-----4---->",formProps.value)
return formProps.value.model[props.data.name];
});
const type = computed(() => {
return formProps.value.type
})
return formProps.value.type;
});
// true
const editDisabled = computed(() => {
return formProps.value.type === 2 && props.data.config?.editDisabled
})
return formProps.value.type === 2 && props.data.config?.editDisabled;
});
const addColumn = () => {
// console.log("--------->",tableDataNew.value)
const temp: any = {}
if (props.data.list) {
props.data.list.forEach((item: any) => {
if (item.name) {
temp[item.name] = item.control.modelValue
}
})
tableDataNew.value.push(jsonParseStringify(temp))
}
}
const getText = (text: any,val:any,name:any) => {
console.log("text===>",text)
console.log("name===>",name)
console.log("val===>",val)
if (typeof text === 'string') {
return text
} else {
return text && text.toString()
}
}
console.log("如果编辑页禁用时--------->", tableDataNew.value);
const temp: any = {};
if (props.data.list) {
props.data.list.forEach((item: any) => {
if (item.name) {
temp[item.name] = item.control.modelValue;
}
});
console.log("如果编辑页禁用时-------temp:", temp);
console.log("如果编辑页禁用时-------jsonParseStringify:", jsonParseStringify(temp));
tableDataNew.value.push(jsonParseStringify(temp));
}
};
const getText = (text: any, val: any, name: any) => {
console.log("text===>", text);
console.log("name===>", name);
console.log("val===>", val);
if (typeof text === "string") {
return text;
} else {
return text && text.toString();
}
};
const delColumn = (index: number) => {
tableDataNew.value.splice(index, 1)
}
tableDataNew.value.splice(index, 1);
};
/**
@ 作者: 秦东
@ 时间: 2024-08-02 13:22:14
@ 功能: 时间戳转换对象
*/
const timeToAry = (timestamp:number) => {
const date = new Date(timestamp);
const year = date.getFullYear();
const month = ('0' + (date.getMonth() + 1)).slice(-2);
const day = ('0' + date.getDate()).slice(-2);
const hours = ('0' + date.getHours()).slice(-2);
const minutes = ('0' + date.getMinutes()).slice(-2);
const seconds = ('0' + date.getSeconds()).slice(-2);
return {
year:year,
month:month,
day:day,
hours:hours,
minutes:minutes,
seconds
}
}
const timeToAry = (timestamp: number) => {
const date = new Date(timestamp);
const year = date.getFullYear();
const month = ("0" + (date.getMonth() + 1)).slice(-2);
const day = ("0" + date.getDate()).slice(-2);
const hours = ("0" + date.getHours()).slice(-2);
const minutes = ("0" + date.getMinutes()).slice(-2);
const seconds = ("0" + date.getSeconds()).slice(-2);
return {
year: year,
month: month,
day: day,
hours: hours,
minutes: minutes,
seconds,
};
};
/**
@ 作者: 秦东
@ 时间: 2024-08-02 13:02:49
@ 功能: 将时间戳转换成字符串
*/
const timeToString = (timeVal:any,types:int) => {
let timeStr = ""
if(Array.isArray(timeVal)){
if(timeVal.length >= 2){
let startTime = timeToAry(timeVal[0])
let endTime = timeToAry(timeVal[1])
switch(types){
case "year": //
timeStr = `${startTime.year}${endTime.year}`;
break;
case "month": //
timeStr = `${startTime.year}-${startTime.month}${endTime.year}-${endTime.month}`;
break;
case "datetime": //+
timeStr = `${startTime.year}-${startTime.month}-${startTime.day} ${startTime.hours}:${startTime.minutes}:${startTime.seconds}${endTime.year}-${endTime.month}-${endTime.day} ${endTime.hours}:${endTime.minutes}:${endTime.seconds}`;
break;
case "week": //
let startWeek = getYearWeek(startTime)
let endWeek = getYearWeek(endTime)
timeStr = `${startWeek}${endWeek}`;
break;
case "timeCalss": //
timeStr = `${startTime.hours}:${startTime.minutes}:${startTime.seconds}${endTime.hours}:${endTime.minutes}:${endTime.seconds}`;
break;
case "datetimerange":
timeStr = `${startTime.year}-${startTime.month}-${startTime.day} ${startTime.hours}:${startTime.minutes}:${startTime.seconds}${endTime.year}-${endTime.month}-${endTime.day} ${endTime.hours}:${endTime.minutes}:${endTime.seconds}`;
break;
case "daterange":
timeStr = `${startTime.year}-${startTime.month}-${startTime.day}${endTime.year}-${endTime.month}-${endTime.day}`;
break;
case "monthrange":
timeStr = `${startTime.year}-${startTime.month}${endTime.year}-${endTime.month}`;
break;
default:
timeStr = `${startTime.year}-${startTime.month}-${startTime.day}${endTime.year}-${endTime.month}-${endTime.day}`;
break;
}
}else if(timeVal.length == 1){
let {year,month,day,hours,minutes,seconds} = timeToAry(timeVal[0])
switch(types){
case "year": //
timeStr = `${year}`;
break;
case "month": //
timeStr = `${year}-${month}`;
break;
case "datetime": //+
timeStr = `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
break;
case "week": //
timeStr = getYearWeek(timeVal)
break;
case "timeCalss": //
timeStr = `${hours}:${minutes}:${seconds}`;
break;
default:
timeStr = `${year}-${month}-${day}`
break;
}
}else{
timeStr = "未知时间"
}
}else{
let {year,month,day,hours,minutes,seconds} = timeToAry(timeVal)
switch(types){
case "year": //
timeStr = `${year}`;
break;
case "month": //
timeStr = `${year}-${month}`;
break;
case "datetime": //+
timeStr = `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
break;
case "week": //
timeStr = getYearWeek(timeVal)
break;
case "timeCalss": //
timeStr = `${hours}:${minutes}:${seconds}`;
break;
default:
timeStr = `${year}-${month}-${day}`
break;
}
}
return timeStr
}
let associatedFormsIndexTablekey = 0
const timeToString = (timeVal: any, types: int) => {
let timeStr = "";
if (Array.isArray(timeVal)) {
if (timeVal.length >= 2) {
let startTime = timeToAry(timeVal[0]);
let endTime = timeToAry(timeVal[1]);
switch (types) {
case "year": //
timeStr = `${startTime.year}${endTime.year}`;
break;
case "month": //
timeStr = `${startTime.year}-${startTime.month}${endTime.year}-${endTime.month}`;
break;
case "datetime": //+
timeStr = `${startTime.year}-${startTime.month}-${startTime.day} ${startTime.hours}:${startTime.minutes}:${startTime.seconds}${endTime.year}-${endTime.month}-${endTime.day} ${endTime.hours}:${endTime.minutes}:${endTime.seconds}`;
break;
case "week": //
let startWeek = getYearWeek(startTime);
let endWeek = getYearWeek(endTime);
timeStr = `${startWeek}${endWeek}`;
break;
case "timeCalss": //
timeStr = `${startTime.hours}:${startTime.minutes}:${startTime.seconds}${endTime.hours}:${endTime.minutes}:${endTime.seconds}`;
break;
case "datetimerange":
timeStr = `${startTime.year}-${startTime.month}-${startTime.day} ${startTime.hours}:${startTime.minutes}:${startTime.seconds}${endTime.year}-${endTime.month}-${endTime.day} ${endTime.hours}:${endTime.minutes}:${endTime.seconds}`;
break;
case "daterange":
timeStr = `${startTime.year}-${startTime.month}-${startTime.day}${endTime.year}-${endTime.month}-${endTime.day}`;
break;
case "monthrange":
timeStr = `${startTime.year}-${startTime.month}${endTime.year}-${endTime.month}`;
break;
default:
timeStr = `${startTime.year}-${startTime.month}-${startTime.day}${endTime.year}-${endTime.month}-${endTime.day}`;
break;
}
} else if (timeVal.length == 1) {
let { year, month, day, hours, minutes, seconds } = timeToAry(timeVal[0]);
switch (types) {
case "year": //
timeStr = `${year}`;
break;
case "month": //
timeStr = `${year}-${month}`;
break;
case "datetime": //+
timeStr = `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
break;
case "week": //
timeStr = getYearWeek(timeVal);
break;
case "timeCalss": //
timeStr = `${hours}:${minutes}:${seconds}`;
break;
default:
timeStr = `${year}-${month}-${day}`;
break;
}
} else {
timeStr = "未知时间";
}
} else {
let { year, month, day, hours, minutes, seconds } = timeToAry(timeVal);
switch (types) {
case "year": //
timeStr = `${year}`;
break;
case "month": //
timeStr = `${year}-${month}`;
break;
case "datetime": //+
timeStr = `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
break;
case "week": //
timeStr = getYearWeek(timeVal);
break;
case "timeCalss": //
timeStr = `${hours}:${minutes}:${seconds}`;
break;
default:
timeStr = `${year}-${month}-${day}`;
break;
}
}
return timeStr;
};
let associatedFormsIndexTablekey = 0;
/* const emits = defineEmits<{
(e: 'asfValueChanged', val: any): void
}>() */
let emits = defineEmits(['optionsValue3GetTable','asfValueChanged']);
let emits = defineEmits(["optionsValue3GetTable", "asfValueChanged"]);
function asfValueChanged(val:any){
//console.log("childTable-asfValueChanged",val)
emits("asfValueChanged",val)
function asfValueChanged(val: any) {
//console.log("childTable-asfValueChanged",val)
emits("asfValueChanged", val);
}
function optionsValue3Get1(data: any,fieldName: string){
fieldName = "childTable---"+props.data.name+"---"+fieldName
/* console.log("childTable---optionsValue3Get1")
function optionsValue3Get1(data: any, fieldName: string) {
fieldName = "childTable---" + props.data.name + "---" + fieldName;
/* console.log("childTable---optionsValue3Get1")
console.log(props.data.name) */
emits('optionsValue3GetTable',data,fieldName)
emits("optionsValue3GetTable", data, fieldName);
}
</script>
<template>
<div class="form-table form-table-add">
<el-table
v-bind="data.control"
:class="[data.className]"
:data="tableDataNew"
>
<el-table-column
v-for="(item, index) in data.list"
:key="index"
:prop="item.name"
:label="item.item.label"
:width="item.item.span"
>
<template #default="scope">
<span v-if="item.type === 'index'">{{ scope.$index + 1 }}</span>
<div v-if="type === 4 || editDisabled">
<LokOrgCentent v-if="item.type == 'orgCentent'" :orgid="scope.row[item.name].toString()" />
<div v-else-if="item.type=='lowcodeImage'">
<LowcodeImagePage :data="item"
v-model="scope.row[item.name]" />
</div>
<div v-else-if="item.type=='upload'" >
<UploadPageList :data="item" :img-list="scope.row[item.name]" :control="item.control" />
</div>
<div v-else-if="item.type=='datePicker'" v-html="timeToString(scope.row[item.name],item.control.type)">
</div>
<div v-else-if="item.type=='associatedForms'">
<AssociatedForms :data="item"
v-model="scope.row[item.name]" :tablekey="associatedFormsIndexTablekey" :row-index="scope.$index"/>
</div>
<div v-else>{{ getText(scope.row[item.name],scope.row,item.name) }}</div>
</div>
<div v-else>
<form-item
v-model="scope.row[item.name]"
:tProp="`${data.name}.${scope.$index}.${item.name}`"
:row-index="scope.$index"
:data="item"
@asf-value-changed="asfValueChanged"
@optionsValue3Get1="optionsValue3Get1"
/>
</div>
</template>
<template #header="scope" v-if="item.help">
{{ scope.column.label }}
<Tooltip :content="item.help" />
</template>
</el-table-column>
<el-table-column
prop="del"
label="操作"
v-if="[1, 2].includes(type as number) && data.config.delBtnText && !editDisabled"
>
<template #default="scope">
<el-button link type="primary" @click="delColumn(scope.$index)">{{ data.config.delBtnText }}</el-button>
</template>
</el-table-column>
</el-table>
<div
class="table-btn"
v-if="[1, 2].includes(type as number) && data.config.addBtnText && !editDisabled"
>
<el-button size="small" @click="addColumn">{{ data.config.addBtnText }}</el-button>
</div>
</div>
<div class="form-table form-table-add">
<el-text class="mx-1" size="large">{{ sunTableName }}</el-text>
<el-table v-bind="data.control" :class="[data.className]" :data="tableDataNew">
<el-table-column
v-for="(item, index) in data.list"
:key="index"
:prop="item.name"
:label="item.item.label"
:width="item.item.span"
>
<template #default="scope">
<span v-if="item.type === 'index'">{{ scope.$index + 1 }}</span>
<div v-if="type === 4 || editDisabled">
<LokOrgCentent
v-if="item.type == 'orgCentent'"
:orgid="scope.row[item.name].toString()"
/>
<div v-else-if="item.type == 'lowcodeImage'">
<LowcodeImagePage :data="item" v-model="scope.row[item.name]" />
</div>
<div v-else-if="item.type == 'upload'">
<UploadPageList
:data="item"
:img-list="scope.row[item.name]"
:control="item.control"
/>
</div>
<div
v-else-if="item.type == 'datePicker'"
v-html="timeToString(scope.row[item.name], item.control.type)"
></div>
<div v-else-if="item.type == 'associatedForms'">
<AssociatedForms
:data="item"
v-model="scope.row[item.name]"
:tablekey="associatedFormsIndexTablekey"
:row-index="scope.$index"
/>
</div>
<div v-else>{{ getText(scope.row[item.name], scope.row, item.name) }}</div>
</div>
<div v-else>
<form-item
v-model="scope.row[item.name]"
:tProp="`${data.name}.${scope.$index}.${item.name}`"
:row-index="scope.$index"
:data="item"
@asf-value-changed="asfValueChanged"
@optionsValue3Get1="optionsValue3Get1"
/>
</div>
</template>
<template #header="scope" v-if="item.help">
{{ scope.column.label }}
<Tooltip :content="item.help" />
</template>
</el-table-column>
<el-table-column
prop="del"
label="操作"
v-if="[1, 2].includes(type as number) && data.config.delBtnText && !editDisabled"
>
<template #default="scope">
<el-button link type="primary" @click="delColumn(scope.$index)">{{
data.config.delBtnText
}}</el-button>
</template>
</el-table-column>
</el-table>
<div
class="table-btn"
v-if="[1, 2].includes(type as number) && data.config.addBtnText && !editDisabled"
>
<el-button size="small" @click="addColumn">{{ data.config.addBtnText }}</el-button>
</div>
</div>
</template>
<style lang='scss' scoped>
</style>
<style lang="scss" scoped></style>

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

@ -815,6 +815,7 @@ function optionsValue3GetTable(data: any, fieldName: string) {
<!--表格组件-->
<template v-else-if="element.type === 'table'">
<div class="form-table" v-if="type === 5">
{{ element.item ? (element.item.label ? element.item.label : 2) : 3 }}
<!-- <form-group :data="element.list" data-type="not-nested" /> -->
<form-group :data="element.list" data-type="not-table" />
</div>

1
src/components/DesignForm/public/form/formItem.vue

@ -1370,6 +1370,7 @@ const diGuiJilian = (val: any, options: any[]) => {
? data.control.placeholder
: '请选择' + getLabel(data.item)
"
:data="data"
v-model="value"
/>
<component

10
src/components/IconSelect/appMenuSvgPage.vue

@ -47,6 +47,7 @@ watch(
}
}
);
const filterValue = ref("");
/**
@ 作者: 秦东
@ 时间: 2024-04-22 16:43:49
@ -65,6 +66,15 @@ const handleSelect = (svgName: string) => {
emits("update:svgName", svgName);
handleClose();
};
/**
@ 作者: 秦东
@ 时间: 2025-02-24 11:24:50
@ 功能: 搜索图标
*/
const handleFilter = (val: any) => {
// console.log("--->", val, props.iconList);s
filterIconNames.value = props.iconList.filter((item) => item.includes(val));
};
</script>
<template>
<el-dialog

605
src/views/sysworkflow/lowcodepage/appPage/appMenus.vue

@ -3,75 +3,81 @@
@ 时间: 2024-04-22 08:56:40
@ 备注:
-->
<script lang='ts' setup>
<script lang="ts" setup>
import type {
AllowDropType,
NodeDropType,
} from 'element-plus/es/components/tree/src/tree.type'
import { appMenuTreeInfo,appSetInfo } from "@/api/date/type"
import { gainAllAppMenu,editAppMenuCont,appMenuShowOrHide,delAppMenu,editAppMenusIcon } from '@/api/DesignForm/requestapi'
} from "element-plus/es/components/tree/src/tree.type";
import { appMenuTreeInfo, appSetInfo } from "@/api/date/type";
import {
gainAllAppMenu,
editAppMenuCont,
appMenuShowOrHide,
delAppMenu,
editAppMenusIcon,
} from "@/api/DesignForm/requestapi";
import SvgIcon from "@/components/SvgIcon/index.vue";
import { threeShiyanData } from "@/api/date/type"
import { threeShiyanData } from "@/api/date/type";
import AppMenuSvgPage from "@/components/IconSelect/appMenuSvgPage.vue";
import AppMenuGroup from "@/views/sysworkflow/lowcodepage/appPage/appMenuGroup.vue"
import EditAppMenuNamePage from "@/views/sysworkflow/lowcodepage/appPage/editAppMenuNamePage.vue"
import CreateAppFormPage from "@/views/sysworkflow/lowcodepage/appPage/createAppFormPage.vue"
import AppMenuGroup from "@/views/sysworkflow/lowcodepage/appPage/appMenuGroup.vue";
import EditAppMenuNamePage from "@/views/sysworkflow/lowcodepage/appPage/editAppMenuNamePage.vue";
import CreateAppFormPage from "@/views/sysworkflow/lowcodepage/appPage/createAppFormPage.vue";
const props = defineProps({
appCont:{
type:Object,
default(){
return {}
}
},
formKey:{
type:String,
default:""
},
menusTree:{
type:Object,
default(){
return {}
}
},
drawerWith:{
type:Number,
default:0
},
groupKey:{
type:String,
default:""
},
appPageKey:{
type:String,
default:""
}
appCont: {
type: Object,
default() {
return {};
},
},
formKey: {
type: String,
default: "",
},
menusTree: {
type: Object,
default() {
return {};
},
},
drawerWith: {
type: Number,
default: 0,
},
groupKey: {
type: String,
default: "",
},
appPageKey: {
type: String,
default: "",
},
});
const svgIsShow = ref(false)
const emits = defineEmits(["update:menusTree","update:appPageKey","openAppPageForm"]);
const appOenMenu = ref<appMenuTreeInfo>({})
const svgIsShow = ref(false);
const emits = defineEmits(["update:menusTree", "update:appPageKey", "openAppPageForm"]);
const appOenMenu = ref<appMenuTreeInfo>({});
/**
@ 作者: 秦东
@ 时间: 2024-04-24 13:17:30
@ 功能: 菜单列表
@ 功能: 菜单列表
*/
const appMenuTree = computed({
get() {
return props.menusTree
},
set(val: any) {
emits('update:menusTree', val)
}
const appMenuTree = computed({
get() {
return props.menusTree;
},
set(val: any) {
emits("update:menusTree", val);
},
});
const appPageKey = computed({
get() {
return props.appPageKey
},
set(val: any) {
emits('update:appPageKey', val)
}
const appPageKey = computed({
get() {
return props.appPageKey;
},
set(val: any) {
emits("update:appPageKey", val);
},
});
/**
@ 作者: 秦东
@ -79,307 +85,330 @@ const appPageKey = computed({
@ 功能: 树移动完毕后执行的操作
*/
const handleDrop = (
draggingNode: Node,
dropNode: Node,
dropType: NodeDropType,
ev: DragEvents
draggingNode: Node,
dropNode: Node,
dropType: NodeDropType,
ev: DragEvents
) => {
// console.log('====1========>',draggingNode)
// console.log('=====2=======>',dropNode)
// console.log('=====3=======>',dropType)
// console.log('=====4=======>',ev)
// return false;
let sendCont = {
id:props.appCont.uuid,
menuTree:appMenuTree.value
}
editAppMenuCont(sendCont)
.then((data)=>{
// console.log('============>',data)
})
}
// console.log('====1========>',draggingNode)
// console.log('=====2=======>',dropNode)
// console.log('=====3=======>',dropType)
// console.log('=====4=======>',ev)
// return false;
let sendCont = {
id: props.appCont.uuid,
menuTree: appMenuTree.value,
};
editAppMenuCont(sendCont).then((data) => {
// console.log('============>',data)
});
};
const treeList = ref<any[]>([])
const treeList = ref<any[]>([]);
/**
@ 作者: 秦东
@ 时间: 2024-04-22 15:53:35
@ 功能: 加载SVG图标
*/
const allIconNames:string[] = [];
const allIconNames: string[] = [];
const loadIcons = () => {
const icons = import.meta.glob("../../../../assets/icons/*.svg");
for (const icon in icons) {
const iconName = icon.split("assets/icons/")[1].split(".svg")[0];
allIconNames.push(iconName);
}
// console.log("icons",icons)
// console.log("allIconNames",allIconNames)
}
onMounted(()=>{
treeList.value = threeShiyanData
loadIcons();
})
const icons = import.meta.glob("../../../../assets/icons/*.svg");
for (const icon in icons) {
const iconName = icon.split("assets/icons/")[1].split(".svg")[0];
allIconNames.push(iconName);
}
// console.log("icons",icons)
// console.log("allIconNames",allIconNames)
};
onMounted(() => {
treeList.value = threeShiyanData;
loadIcons();
});
/**
@ 作者: 秦东
@ 时间: 2024-04-22 16:52:03
@ 功能: 设置表单图标
*/
const svgName = ref("")
const svgId= ref("")
const setAppMenusSvg = (val:any) =>{
// console.log("----setAppMenusSvg--->",val)
svgName.value = val.svg
svgId.value = val.id
treeList.value = val
svgIsShow.value = true;
}
watch(()=>svgName.value,(val:string)=>{
// console.log("----svgName--->",val)
// console.log("----threeShiyanData--->",threeShiyanData)
diguiData(appMenuTree.value)
})
const svgName = ref("");
const svgId = ref("");
const setAppMenusSvg = (val: any) => {
// console.log("----setAppMenusSvg--->",val)
svgName.value = val.svg;
svgId.value = val.id;
treeList.value = val;
svgIsShow.value = true;
};
watch(
() => svgName.value,
(val: string) => {
// console.log("----svgName--->",val)
// console.log("----threeShiyanData--->",threeShiyanData)
diguiData(appMenuTree.value);
}
);
/**
@ 作者: 秦东
@ 时间: 2024-04-23 09:44:14
@ 功能: 递归判断是哪个节点换了图标
*/
const diguiData = (val:any) =>{
// console.log(':', val);
if(Array.isArray(val)){
try {
val.forEach((item:any) => {
// console.log('--1-->:',item.id);
// console.log('---->:',svgId.value);
if(item.id == svgId.value){
item.svg = svgName.value
let sendInfo = {
id:item.id.toString(),
label:svgName.value
}
editAppMenusIcon(sendInfo)
.then(({data}) => {
})
throw item;
}
if(item.children&&Array.isArray(item.children)){
diguiData(item.children)
}
});
} catch (e) {
// console.log(':', threeShiyanData);
}
}
}
const diguiData = (val: any) => {
// console.log(':', val);
if (Array.isArray(val)) {
try {
val.forEach((item: any) => {
// console.log('--1-->:',item.id);
// console.log('---->:',svgId.value);
if (item.id == svgId.value) {
item.svg = svgName.value;
let sendInfo = {
id: item.id.toString(),
label: svgName.value,
};
editAppMenusIcon(sendInfo).then(({ data }) => {});
throw item;
}
if (item.children && Array.isArray(item.children)) {
diguiData(item.children);
}
});
} catch (e) {
// console.log(':', threeShiyanData);
}
}
};
/**
@ 作者: 秦东
@ 时间: 2024-04-24 13:12:18
@ 功能: 新建子分组
*/
const menuGroupShow = ref(false)
const menuParentKey = ref("")
const addNewSunMenuGroup = (val:any) =>{
console.log('新建子分组:', val);
menuParentKey.value = val.id.toString()
console.log('新建子分组-->:', menuParentKey.value);
menuGroupShow.value = true
}
const menuGroupShow = ref(false);
const menuParentKey = ref("");
const addNewSunMenuGroup = (val: any) => {
console.log("新建子分组:", val);
menuParentKey.value = val.id.toString();
console.log("新建子分组-->:", menuParentKey.value);
menuGroupShow.value = true;
};
/**
@ 作者: 秦东
@ 时间: 2024-04-24 13:22:47
@ 功能: 更新
*/
const gainSunAppContent = () =>{
// console.log(':');
gainAllAppMenu({id:props.appCont.uuid})
.then((data) =>{
// console.log(':',data);
appMenuTree.value = data.data
// openAppPage(appOenMenu)
})
}
const gainSunAppContent = () => {
// console.log(':');
gainAllAppMenu({ id: props.appCont.uuid }).then((data) => {
// console.log(':',data);
appMenuTree.value = data.data;
// openAppPage(appOenMenu)
});
};
/**
@ 作者: 秦东
@ 时间: 2024-04-25 13:23:46
@ 功能: 修改名称
*/
const editAppMenuNameShow = ref(false)
const editMenuName = (val:appMenuTreeInfo) =>{
// console.log(':',val);
appOenMenu.value = val
editAppMenuNameShow.value = true
}
const editAppMenuNameShow = ref(false);
const editMenuName = (val: appMenuTreeInfo) => {
// console.log(':',val);
appOenMenu.value = val;
editAppMenuNameShow.value = true;
};
/**
@ 作者: 秦东
@ 时间: 2024-05-07 09:00:47
@ 功能: 显示和隐藏菜单
*/
const showOrHide = (val:appMenuTreeInfo,types:number) =>{
// console.log(':',val,types);
let sendInfo = {
types:types,
menuInfo:val
}
const showOrHide = (val: appMenuTreeInfo, types: number) => {
// console.log(':',val,types);
let sendInfo = {
types: types,
menuInfo: val,
};
appMenuShowOrHide(sendInfo)
.then((data) =>{
// console.log(':',data);
gainSunAppContent()
});
}
appMenuShowOrHide(sendInfo).then((data) => {
// console.log(':',data);
gainSunAppContent();
});
};
/**
@ 作者: 秦东
@ 时间: 2024-05-07 10:03:30
@ 功能: 删除app自定义菜单
*/
const editAppMenu = (val:appMenuTreeInfo) =>{
// console.log('editAppMenu:',val);
ElMessageBox.confirm(
"您确定要删除此项?一经删除!将不可恢复!请慎重操作",
"删除提示",
{
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
}
)
.then(() => {
let sendInfo = {
id:val.id.toString(),
status:3
}
delAppMenu(sendInfo)
.then((data) =>{
// console.log('app:',data);
gainSunAppContent()
ElMessage({
type: 'success',
message: data.msg,
})
});
})
}
const saveAppFormIsShow = ref(false)
const editAppMenu = (val: appMenuTreeInfo) => {
// console.log('editAppMenu:',val);
ElMessageBox.confirm("您确定要删除此项?一经删除!将不可恢复!请慎重操作", "删除提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning",
}).then(() => {
let sendInfo = {
id: val.id.toString(),
status: 3,
};
delAppMenu(sendInfo).then((data) => {
// console.log('app:',data);
gainSunAppContent();
ElMessage({
type: "success",
message: data.msg,
});
});
});
};
const saveAppFormIsShow = ref(false);
/**
@ 作者: 秦东
@ 时间: 2024-05-07 11:21:39
@ 功能: 新增表单页面
*/
const creetMenuId = ref("")
const isNew = ref(false)
const createNewPage = (val?:string) => {
creetMenuId.value = val.toString();
saveAppFormIsShow.value = true;
isNew.value = true
}
const creetMenuId = ref("");
const isNew = ref(false);
const createNewPage = (val?: string) => {
creetMenuId.value = val.toString();
saveAppFormIsShow.value = true;
isNew.value = true;
};
/**
@ 作者: 秦东
@ 时间: 2024-05-17 14:22:12
@ 功能: 判断能否拖入此节点
*/
const allowDrop = (draggingNode: Node, dropNode: Node, type: AllowDropType) => {
// console.log("draggingNode--->",draggingNode)
// console.log("dropNode--->",dropNode)
// console.log("type--->",type)
// if (dropNode.data.type === 2) {
// return false
// } else {
// return true
// }
if(draggingNode.data.type === 2 && dropNode.data.type === 2 && type == "inner"){
return false
}else{
return true
}
// return true
}
// console.log("draggingNode--->",draggingNode)
// console.log("dropNode--->",dropNode)
// console.log("type--->",type)
// if (dropNode.data.type === 2) {
// return false
// } else {
// return true
// }
if (draggingNode.data.type === 2 && dropNode.data.type === 2 && type == "inner") {
return false;
} else {
return true;
}
// return true
};
/**
@ 作者: 秦东
@ 时间: 2024-05-17 16:45:40
@ 功能: 打开app表单
*/
const openAppPage = (val:any) =>{
// console.log("app------>",val)
if(val.isLock == 1){
ElMessage({
showClose: true,
message: '该页面为系统内置页面!请到应用层面访问查看!',
type: 'warning',
})
}else{
if(val.type !== 1){
// console.log("app--1---->",val)
emits('openAppPageForm', val)
}
}
}
const openAppPage = (val: any) => {
// console.log("app------>",val)
if (val.isLock == 1) {
ElMessage({
showClose: true,
message: "该页面为系统内置页面!请到应用层面访问查看!",
type: "warning",
});
} else {
if (val.type !== 1) {
// console.log("app--1---->",val)
emits("openAppPageForm", val);
}
}
};
</script>
<template>
<el-tree
:data="appMenuTree"
draggable
default-expand-all
node-key="id"
:allow-drop="allowDrop"
:expand-on-click-node="true"
@node-drag-start="startDrop"
@node-drop="handleDrop"
>
<template #default="{ node, data }">
<div class="appMenuTitle">
<el-space wrap>
<svg-icon prefix="icon" :icon-class="data.svg" @click="setAppMenusSvg(data)" />
<!-- <el-tooltip :content="node.label" placement="top" effect="dark">
<el-tree
:data="appMenuTree"
draggable
default-expand-all
node-key="id"
:allow-drop="allowDrop"
:expand-on-click-node="true"
@node-drag-start="startDrop"
@node-drop="handleDrop"
>
<template #default="{ node, data }">
<div class="appMenuTitle">
<el-space wrap>
<svg-icon prefix="icon" :icon-class="data.svg" @click="setAppMenusSvg(data)" />
<!-- <el-tooltip :content="node.label" placement="top" effect="dark">
<el-text class="w-120px mb-2" truncated @click="openAppPage(data)">{{node.label}}</el-text>
</el-tooltip> -->
<el-text class="w-120px mb-2" truncated @click="openAppPage(data)">{{node.label}}</el-text>
</el-space>
<el-dropdown>
<svg-icon class="svgBox" prefix="icon" icon-class="set" />
<template #dropdown>
<el-dropdown-item @click="editMenuName(data)">修改名称</el-dropdown-item>
<!-- <el-dropdown-item @click="">复制</el-dropdown-item> -->
<!-- <el-dropdown-item @click="moveMenus(data)">移动到</el-dropdown-item> -->
<el-dropdown-item v-if="data.type==1" divided @click="addNewSunMenuGroup(data)">新建子分组</el-dropdown-item>
<!-- <el-dropdown-item @click="">新建普通表单</el-dropdown-item>
<el-text class="w-120px mb-2" truncated @click="openAppPage(data)">{{
node.label
}}</el-text>
</el-space>
<el-dropdown>
<svg-icon class="svgBox" prefix="icon" icon-class="set" />
<template #dropdown>
<el-dropdown-item @click="editMenuName(data)">修改名称</el-dropdown-item>
<!-- <el-dropdown-item @click="">复制</el-dropdown-item> -->
<!-- <el-dropdown-item @click="moveMenus(data)">移动到</el-dropdown-item> -->
<el-dropdown-item
v-if="data.type == 1"
divided
@click="addNewSunMenuGroup(data)"
>新建子分组</el-dropdown-item
>
<!-- <el-dropdown-item @click="">新建普通表单</el-dropdown-item>
<el-dropdown-item @click="">新建流程表单</el-dropdown-item> -->
<el-dropdown-item v-if="data.type==1" @click="createNewPage(data.id)">新建页面</el-dropdown-item>
<el-dropdown-item @click="showOrHide(data,1)" divided><el-text v-if="data.pcIsShow==1">隐藏PC端</el-text><el-text v-else>取消-隐藏PC端</el-text></el-dropdown-item>
<el-dropdown-item @click="showOrHide(data,2)"><el-text v-if="data.wapIsShow==1">隐藏移动端</el-text><el-text v-else>取消-隐藏移动端</el-text></el-dropdown-item>
<el-dropdown-item @click="editAppMenu(data)" divided>
<el-text class="mx-1" type="danger">删除</el-text>
</el-dropdown-item>
</template>
</el-dropdown>
</div>
</template>
</el-tree>
<AppMenuSvgPage v-model:is-show="svgIsShow" v-model:svg-name="svgName" :svg-id="svgId" :icon-list="allIconNames" />
<AppMenuGroup v-model:is-show="menuGroupShow" :parent-key="menuParentKey" :app-cont="props.appCont" @updateMenu="gainSunAppContent" />
<EditAppMenuNamePage v-model:is-show="editAppMenuNameShow" :menu-cont="appOenMenu" @updateMenu="gainSunAppContent" />
<CreateAppFormPage v-if="saveAppFormIsShow" v-model:is-show="saveAppFormIsShow" :is-new="isNew" v-model:app-page-key="appPageKey" :drawer-with="props.drawerWith" :form-Key="props.formKey" :app-cont="props.appCont" :group-key="props.groupKey" :menu-id="creetMenuId" @gainSunAppContent="gainSunAppContent" />
<el-dropdown-item v-if="data.type == 1" @click="createNewPage(data.id)"
>新建页面</el-dropdown-item
>
<el-dropdown-item @click="showOrHide(data, 1)" divided
><el-text v-if="data.pcIsShow == 1">隐藏PC端</el-text
><el-text v-else>取消-隐藏PC端</el-text></el-dropdown-item
>
<el-dropdown-item @click="showOrHide(data, 2)"
><el-text v-if="data.wapIsShow == 1">隐藏移动端</el-text
><el-text v-else>取消-隐藏移动端</el-text></el-dropdown-item
>
<el-dropdown-item @click="editAppMenu(data)" divided>
<el-text class="mx-1" type="danger">删除</el-text>
</el-dropdown-item>
</template>
</el-dropdown>
</div>
</template>
</el-tree>
<AppMenuSvgPage
v-model:is-show="svgIsShow"
v-model:svg-name="svgName"
:svg-id="svgId"
:icon-list="allIconNames"
/>
<AppMenuGroup
v-model:is-show="menuGroupShow"
:parent-key="menuParentKey"
:app-cont="props.appCont"
@updateMenu="gainSunAppContent"
/>
<EditAppMenuNamePage
v-model:is-show="editAppMenuNameShow"
:menu-cont="appOenMenu"
@updateMenu="gainSunAppContent"
/>
<CreateAppFormPage
v-if="saveAppFormIsShow"
v-model:is-show="saveAppFormIsShow"
:is-new="isNew"
v-model:app-page-key="appPageKey"
:drawer-with="props.drawerWith"
:form-Key="props.formKey"
:app-cont="props.appCont"
:group-key="props.groupKey"
:menu-id="creetMenuId"
@gainSunAppContent="gainSunAppContent"
/>
</template>
<style lang='scss' scoped>
.appMenuTitle{
width: 100%;
padding-right: 5px;
display: flex;
align-items: center;
justify-content: space-between;
.svgBox{
display: none;
}
<style lang="scss" scoped>
.appMenuTitle {
width: 100%;
padding-right: 5px;
display: flex;
align-items: center;
justify-content: space-between;
.svgBox {
display: none;
}
}
.appMenuTitle:hover .svgBox{
display: block;
.appMenuTitle:hover .svgBox {
display: block;
}
</style>

211
src/views/sysworkflow/lowcodepage/appPage/appSetUp/index.vue

@ -3,128 +3,141 @@
@ 时间: 2024-05-22 09:37:55
@ 备注: 应用设置
-->
<script lang='ts' setup>
import SetUp from '@/views/sysworkflow/lowcodepage/appPage/appSetUp/setup.vue'
import AppPower from '@/views/sysworkflow/lowcodepage/appPage/appSetUp/appPower.vue'
import AppDevOps from '@/views/sysworkflow/lowcodepage/appPage/appSetUp/appDevOps.vue'
import DataManagement from '@/views/sysworkflow/lowcodepage/appPage/appSetUp/dataManagement.vue'
<script lang="ts" setup>
import SetUp from "@/views/sysworkflow/lowcodepage/appPage/appSetUp/setup.vue";
import AppPower from "@/views/sysworkflow/lowcodepage/appPage/appSetUp/appPower.vue";
import AppDevOps from "@/views/sysworkflow/lowcodepage/appPage/appSetUp/appDevOps.vue";
import DataManagement from "@/views/sysworkflow/lowcodepage/appPage/appSetUp/dataManagement.vue";
const props = defineProps({
appCont:{
type:Object,
default(){
return {}
}
},
groupKey:{
type:String,
default:""
}
appCont: {
type: Object,
default() {
return {};
},
},
groupKey: {
type: String,
default: "",
},
});
const activeMenuIndex = ref("1")
const activeMenuIndex = ref("1");
/**
@ 作者: 秦东
@ 时间: 2024-05-23 09:47:00
@ 功能: 菜单打开
*/
const handleOpen = (key: string, keyPath: string[]) => {
// console.log("",key, keyPath)
}
// console.log("",key, keyPath)
};
/**
@ 作者: 秦东
@ 时间: 2024-05-23 09:47:09
@ 功能: 菜单关闭
*/
const handleClose = (key: string, keyPath: string[]) => {
// console.log("",key, keyPath)
}
// console.log("",key, keyPath)
};
/**
@ 作者: 秦东
@ 时间: 2024-05-23 10:19:45
@ 功能: 单击菜单
*/
const clickMenu = (key:number) => {
activeMenuIndex.value = key
}
const clickMenu = (key: number) => {
activeMenuIndex.value = key;
};
</script>
<template>
<el-container>
<el-aside class="appMenuBox">
<el-menu
default-active="1"
class="el-menu-vertical-demo allHeight"
@open="handleOpen"
@close="handleClose"
>
<el-menu-item index="1" @click="clickMenu(1)">
<template #title>
<i class="fa fa-cog icont"></i>
<span>基础设置</span>
</template>
</el-menu-item>
<el-menu-item index="2" @click="clickMenu(2)">
<template #title>
<i class="fa fa-lock icont"></i>
<span>应用权限</span>
</template>
</el-menu-item>
<el-menu-item index="3" @click="clickMenu(3)">
<template #title>
<i class="fa fa-clone icont"></i>
<span>部署运维</span>
</template>
</el-menu-item>
<el-menu-item index="4" @click="clickMenu(4)">
<template #title>
<i class="fa fa-database icont"></i>
<span>数据管理</span>
</template>
</el-menu-item>
</el-menu>
</el-aside>
<el-main class="appSetUpBox">
<el-scrollbar class="appSetUpDraw">
<SetUp v-if="activeMenuIndex==1" :app-cont="appCont" :group-key="props.groupKey" />
<AppPower v-if="activeMenuIndex==2" :app-cont="appCont" :group-key="props.groupKey" />
<AppDevOps v-if="activeMenuIndex==3" :app-cont="appCont" :group-key="props.groupKey" />
<DataManagement v-if="activeMenuIndex==4" :app-cont="appCont" :group-key="props.groupKey" />
</el-scrollbar>
</el-main>
</el-container>
<el-container>
<el-aside class="appMenuBox">
<el-menu
default-active="1"
class="el-menu-vertical-demo allHeight"
@open="handleOpen"
@close="handleClose"
>
<el-menu-item index="1" @click="clickMenu(1)">
<template #title>
<i class="fa fa-cog icont"></i>
<span>基础设置</span>
</template>
</el-menu-item>
<el-menu-item index="2" @click="clickMenu(2)">
<template #title>
<i class="fa fa-lock icont"></i>
<span>应用权限</span>
</template>
</el-menu-item>
<el-menu-item index="3" @click="clickMenu(3)">
<template #title>
<i class="fa fa-clone icont"></i>
<span>部署运维</span>
</template>
</el-menu-item>
<el-menu-item index="4" @click="clickMenu(4)">
<template #title>
<i class="fa fa-database icont"></i>
<span>数据管理</span>
</template>
</el-menu-item>
</el-menu>
</el-aside>
<el-main class="appSetUpBox">
<el-scrollbar class="appSetUpDraw">
<SetUp
v-if="activeMenuIndex == 1"
:app-cont="appCont"
:group-key="props.groupKey"
/>
<AppPower
v-if="activeMenuIndex == 2"
:app-cont="appCont"
:group-key="props.groupKey"
/>
<AppDevOps
v-if="activeMenuIndex == 3"
:app-cont="appCont"
:group-key="props.groupKey"
/>
<DataManagement
v-if="activeMenuIndex == 4"
:app-cont="appCont"
:group-key="props.groupKey"
/>
</el-scrollbar>
</el-main>
</el-container>
</template>
<style lang='scss' scoped>
.appMenuBox{
width: 200px;
.allHeight{
height: calc(100vh - 45px);
.icont{
margin-left:15px;
margin-right:10px;
font-size:16px;
}
}
::v-deep .el-menu-item.is-active{
background-color : #ecf5ff
}
::v-deep .el-menu-item .is-active:hover{
background-color : #ecf5ff
}
::v-deep .el-menu--vertical .nest-menu .el-sub-menu > .el-sub-menu__title:hover, .el-menu--vertical .el-menu-item:hover{
background-color : #ecf5ff;
color:#FFFFFF;
}
<style lang="scss" scoped>
.appMenuBox {
width: 200px;
.allHeight {
height: calc(100vh - 45px);
.icont {
margin-left: 15px;
margin-right: 10px;
font-size: 16px;
}
}
::v-deep .el-menu-item.is-active {
background-color: #ecf5ff;
}
::v-deep .el-menu-item .is-active:hover {
background-color: #ecf5ff;
}
::v-deep .el-menu--vertical .nest-menu .el-sub-menu > .el-sub-menu__title:hover,
.el-menu--vertical .el-menu-item:hover {
background-color: #ecf5ff;
color: #ffffff;
}
}
.appSetUpBox{
padding:0;
background: var(--el-fill-color-light);
.appSetUpDraw{
background: var(--el-fill-color-light);
height: calc(100vh - 40px);
padding: 15px;
}
.appSetUpBox {
padding: 0;
background: var(--el-fill-color-light);
.appSetUpDraw {
background: var(--el-fill-color-light);
height: calc(100vh - 40px);
padding: 15px;
}
}
</style>

327
src/views/sysworkflow/lowcodepage/appPage/appSetUp/setup.vue

@ -3,195 +3,218 @@
@ 时间: 2024-05-22 14:33:09
@ 备注: app设置
-->
<script lang='ts' setup>
import { uploadUrl } from '@/api/DesignForm'
import type { ComponentSize, FormInstance, FormRules } from 'element-plus'
import { appSetUpContent } from '@src/api/DesignForm/types'
import { customerFormGroupList,appBasicSettings } from '@/api/DesignForm/requestapi'
import type { UploadInstance, UploadProps, UploadRawFile } from 'element-plus'
<script lang="ts" setup>
import { uploadUrl } from "@/api/DesignForm";
import type { ComponentSize, FormInstance, FormRules } from "element-plus";
import { appSetUpContent } from "@src/api/DesignForm/types";
import { customerFormGroupList, appBasicSettings } from "@/api/DesignForm/requestapi";
import type { UploadInstance, UploadProps, UploadRawFile } from "element-plus";
const props = defineProps({
appCont:{
type:Object,
default(){
return {}
}
},
groupKey:{
type:String,
default:""
}
appCont: {
type: Object,
default() {
return {};
},
},
groupKey: {
type: String,
default: "",
},
});
const appLoading = ref(false)
const formSize = ref<ComponentSize>('default')
const ruleFormRef = ref<FormInstance>()
const appLoading = ref(false);
const formSize = ref<ComponentSize>("default");
const ruleFormRef = ref<FormInstance>();
const appSetupCont = reactive<appSetUpContent>({
id:props.appCont.uuid,
title:props.appCont.appName,
appSvg:props.appCont.appSvg,
groupKey:props.groupKey,
appdescribe:props.appCont.describe
})
id: props.appCont.uuid,
title: props.appCont.appName,
appSvg: props.appCont.appSvg,
groupKey: props.groupKey,
appdescribe: props.appCont.describe,
});
const rules = reactive<FormRules<appSetUpContent>>({
groupKey: [{ required: true, message: "请选择分组", trigger: "blur" }],
title: [{ required: true, message: "请输入App名称", trigger: "blur" }],
})
groupKey: [{ required: true, message: "请选择分组", trigger: "blur" }],
title: [{ required: true, message: "请输入App名称", trigger: "blur" }],
});
/**
@ 作者: 秦东
@ 时间: 2024-05-22 15:55:21
@ 功能: 分组数据
*/
const formGroup = ref<any[]>([])
const gainFormGroupList = () =>{
let sendInfo = {
page:1,
pagesize:10000,
state:1
}
customerFormGroupList(sendInfo)
.then((data)=>{
formGroup.value = data.data
})
}
watch(()=>props.appCont,(val:any)=>{
gainFormGroupList();
},{
deep:true,
})
onMounted(()=>{
gainFormGroupList();
})
const formGroup = ref<any[]>([]);
const gainFormGroupList = () => {
let sendInfo = {
page: 1,
pagesize: 10000,
state: 1,
};
customerFormGroupList(sendInfo).then((data) => {
formGroup.value = data.data;
});
};
watch(
() => props.appCont,
(val: any) => {
gainFormGroupList();
},
{
deep: true,
}
);
onMounted(() => {
gainFormGroupList();
});
/**
@ 作者: 秦东
@ 时间: 2024-05-22 16:10:27
@ 功能: 重置表单
*/
const resetForm = (formEl: FormInstance | undefined) => {
if (!formEl) return
formEl.resetFields()
}
if (!formEl) return;
formEl.resetFields();
};
/**
@ 作者: 秦东
@ 时间: 2024-05-22 16:21:18
@ 功能: 提交表单数据
*/
const submitForm = () => {
appLoading.value = true
ruleFormRef.value.validate((isValid: boolean) => {
if (isValid) {
// console.log("",appSetupCont)
appBasicSettings(appSetupCont)
.then(() =>{
props.appCont.appName = appSetupCont.title
props.appCont.appSvg = appSetupCont.appSvg
props.appCont.describe = appSetupCont.appdescribe
appLoading.value = true;
ruleFormRef.value.validate((isValid: boolean) => {
if (isValid) {
// console.log("",appSetupCont)
appBasicSettings(appSetupCont)
.then(() => {
props.appCont.appName = appSetupCont.title;
props.appCont.appSvg = appSetupCont.appSvg;
props.appCont.describe = appSetupCont.appdescribe;
ElMessage.success("编辑成功");
appLoading.value = false;
})
.finally(() =>{appLoading.value = false;})
}else{
appLoading.value = false
}
})
}
const appSetupUpImg = ref(null)
ElMessage.success("编辑成功");
appLoading.value = false;
})
.finally(() => {
appLoading.value = false;
});
} else {
appLoading.value = false;
}
});
};
const appSetupUpImg = ref(null);
/**
@ 作者: 秦东
@ 时间: 2024-05-23 09:20:29
@ 功能: 上传成功后回调
*/
const handleAvatarSuccess: UploadProps['onSuccess'] = (
response,
uploadFile
) => {
// imageUrl.value = URL.createObjectURL(uploadFile.raw!)
appSetupCont.appSvg = response.data.url
// appSetupUpImg.clearFiles()
}
const handleAvatarSuccess: UploadProps["onSuccess"] = (response, uploadFile) => {
// imageUrl.value = URL.createObjectURL(uploadFile.raw!)
appSetupCont.appSvg = response.data.url;
// appSetupUpImg.clearFiles()
};
/**
@ 作者: 秦东
@ 时间: 2024-05-10 11:28:40
@ 功能: 上传前验证
*/
const beforeAvatarUpload: UploadProps['beforeUpload'] = (rawFile) => {
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 > 800) {
ElMessage.error('图片大小不要大于 800MB!')
return false
}
return true
}
const beforeAvatarUpload: UploadProps["beforeUpload"] = (rawFile) => {
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 > 800) {
ElMessage.error("图片大小不要大于 800MB!");
return false;
}
return true;
};
</script>
<template>
<el-card shadow="always">
<el-divider content-position="left">App基础设置</el-divider>
<el-form
ref="ruleFormRef"
:model="appSetupCont"
:rules="rules"
label-width="auto"
class="demo-ruleForm"
:size="formSize"
status-icon
v-loading="appLoading"
>
<el-form-item label="归属分组" prop="groupKey">
<el-select v-model="appSetupCont.groupKey" placeholder="请选择分组">
<el-option v-for="item in formGroup.list" :key="item.idStr" :label="item.title" :value="item.idStr" />
<p v-if="loadingmore">加载中</p>
<p v-if="loadingnomore">无数据</p>
</el-select>
</el-form-item>
<el-form-item label="App名称" prop="title">
<el-input v-model="appSetupCont.title" placeholder="请输入App名称" clearable style="width: 300px" />
</el-form-item>
<el-form-item label="App图标" prop="icont">
<el-upload
ref="appSetupUpImg"
class="upload-demo"
:drag="true"
:action="uploadUrl"
:show-file-list="false"
:on-success="handleAvatarSuccess"
:before-upload="beforeAvatarUpload"
>
<el-image v-if="appSetupCont.appSvg&&appSetupCont.appSvg!=''" :src="appSetupCont.appSvg" fit="cover" class="avatar" />
<div v-else>
<el-icon class="el-icon--upload"><upload-filled /></el-icon>
<div class="el-upload__text">
将文件拖到此处或 <em>单击上传</em>
</div>
</div>
</el-upload>
</el-form-item>
<el-form-item label="应用描述">
<el-input v-model="appSetupCont.appdescribe" type="textarea" show-word-limit maxlength="300" style="width: 60%" />
</el-form-item>
<el-form-item class="butClass">
<el-button type="primary" @click="submitForm(ruleFormRef)">保存</el-button>
<el-button @click="resetForm(ruleFormRef)">重置</el-button>
</el-form-item>
</el-form>
</el-card>
<el-card shadow="always"
>{{ props }}
<el-divider content-position="left">App基础设置</el-divider>
<el-form
ref="ruleFormRef"
:model="appSetupCont"
:rules="rules"
label-width="auto"
class="demo-ruleForm"
:size="formSize"
status-icon
v-loading="appLoading"
>
<el-form-item label="归属分组" prop="groupKey">
<el-select v-model="appSetupCont.groupKey" placeholder="请选择分组">
<el-option
v-for="item in formGroup.list"
:key="item.idStr"
:label="item.title"
:value="item.idStr"
/>
<p v-if="loadingmore">加载中</p>
<p v-if="loadingnomore">无数据</p>
</el-select>
</el-form-item>
<el-form-item label="App名称" prop="title">
<el-input
v-model="appSetupCont.title"
placeholder="请输入App名称"
clearable
style="width: 300px"
/>
</el-form-item>
<el-form-item label="App图标" prop="icont">
<el-upload
ref="appSetupUpImg"
class="upload-demo"
:drag="true"
:action="uploadUrl"
:show-file-list="false"
:on-success="handleAvatarSuccess"
:before-upload="beforeAvatarUpload"
>
<el-image
v-if="appSetupCont.appSvg && appSetupCont.appSvg != ''"
:src="appSetupCont.appSvg"
fit="cover"
class="avatar"
/>
<div v-else>
<el-icon class="el-icon--upload"><upload-filled /></el-icon>
<div class="el-upload__text">将文件拖到此处或 <em>单击上传</em></div>
</div>
</el-upload>
</el-form-item>
<el-form-item label="应用描述">
<el-input
v-model="appSetupCont.appdescribe"
type="textarea"
show-word-limit
maxlength="300"
style="width: 60%"
/>
</el-form-item>
<el-form-item class="butClass">
<el-button type="primary" @click="submitForm(ruleFormRef)">保存</el-button>
<el-button @click="resetForm(ruleFormRef)">重置</el-button>
</el-form-item>
</el-form>
</el-card>
</template>
<style lang='scss' scoped>
.boxk{
width:100%;
background: var(--el-fill-color-light);
<style lang="scss" scoped>
.boxk {
width: 100%;
background: var(--el-fill-color-light);
}
.avatar{
width: 150px;
height: 150px;
.avatar {
width: 150px;
height: 150px;
}
.butClass{
text-align: center;
.butClass {
text-align: center;
}
</style>

3
src/views/sysworkflow/lowcodepage/newLowCode/appLayoutEdit/appContainerPage.vue

@ -73,13 +73,14 @@ const gainAppContent = () => {
id: props.pickAppInfo.signCodeStr,
};
gainAppEditPsge(sendInfo).then((data) => {
// console.log("app---",data)
console.log("获取app信息---》", data);
menusTree.value = data.data.menuTree;
appCont.appKey = data.data.appKey;
appCont.appName = data.data.appName;
appCont.appSvg = data.data.appSvg;
appCont.state = data.data.state;
appCont.uuid = data.data.uuid;
appCont.describe = data.data.describe;
});
};

329
src/widget/lowcodeimage/lowcodeImage.vue

@ -1,53 +1,52 @@
<script setup >
import errimg from '@/assets/404_images/imgNotFound.png'
import { uploadUrl,getRequest } from '@/api/DesignForm'
<script setup>
import errimg from "@/assets/404_images/imgNotFound.png";
import { uploadUrl, getRequest } from "@/api/DesignForm";
const props = defineProps({
tablekey:{
type: Object,
default(){
return {}
}
},
tablekey: {
type: Object,
default() {
return {};
},
},
data: {
type: Object,
default(){
return {}
}
default() {
return {};
},
},
formTableSetUp: {
type: Object,
default() {
return {};
},
},
formTableSetUp:{
type: Object,
default(){
return {}
}
},
imgUrl:{
type:String,
default:""
}
})
imgUrl: {
type: String,
default: "",
},
});
/*
*/
let styleObject = reactive({
width:"0",
height:"0"
})
width: "0",
height: "0",
});
const emits = defineEmits(["update:imgUrl","updateCont"]);
const emits = defineEmits(["update:imgUrl", "updateCont"]);
// const url = ref(errimg)
const url = ref(props.data?.control.imgUrl?props.data?.control.imgUrl:props.imgUrl)
if(props.data?.control.imgUrl===''){
url.value = errimg
}else{
url.value = props.data?.control.imgUrl
const url = ref(props.data?.control.imgUrl ? props.data?.control.imgUrl : props.imgUrl);
if (props.data?.control.imgUrl === "") {
url.value = errimg;
} else {
url.value = props.data?.control.imgUrl;
}
const fitNum = props.data?.control.fit
const fitNum = props.data?.control.fit;
let fit= ''
let fit = "";
switch (fitNum) {
case 1:
@ -67,148 +66,174 @@ switch (fitNum) {
break;
}
const showMode = reactive(props.data?.control.showMode)
const showMode = reactive(props.data?.control.showMode);
// console.log("-1-",props.data?.control);
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+'%';
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 + "%";
}
watch(()=>props.data?.control, (val) => {
if (val.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
watch(
() => props.data?.control,
(val) => {
if (val.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
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){
function handleLink(item) {
// console.log("handleLink")
let url = "";
let urlStart = 'http://'
let urlStart = "http://";
// http:// 7
//https:// 8
if (item.link.length < 7) {
if (item.link == '') {
alert("未配置跳转地址")
return
if (item.link == "") {
alert("未配置跳转地址");
return;
}
url = urlStart + "" + item.link
url = urlStart + "" + item.link;
} else {
const linkStartComplete1 = item.link.startsWith("http://")
const linkStartComplete2 = item.link.startsWith("https://")
const linkStartComplete1 = item.link.startsWith("http://");
const linkStartComplete2 = item.link.startsWith("https://");
if (linkStartComplete1 || linkStartComplete2) {
url = item.link
url = item.link;
} else {
url = urlStart + "" + item.link
url = urlStart + "" + item.link;
}
}
window.open(url, '_blank')
window.open(url, "_blank");
}
//
const beforeAvatarUpload = (rawFile) => {
// console.log("",rawFile.type)
let imgType = ['image/jpeg','image/jpg','image/png','image/gif','image/svg']
let imgType = ["image/jpeg", "image/jpg", "image/png", "image/gif", "image/svg"];
if (!imgType.includes(rawFile.type)) {
ElMessage.error('您上传的不是图片!')
return false
ElMessage.error("您上传的不是图片!");
return false;
} else if (rawFile.size / 1024 / 1024 > 200) {
ElMessage.error('您上传到额图片大于 200MB!')
return false
ElMessage.error("您上传到额图片大于 200MB!");
return false;
}
return true
}
return true;
};
//
const handleAvatarSuccess = (
response,
uploadFile
) => {
const handleAvatarSuccess = (response, uploadFile) => {
// imageUrl.value = URL.createObjectURL(uploadFile.raw!)
// console.log("",response,uploadFile)
url.value = response.data.url
let oldFormSetUp = props.formTableSetUp
if(props.formTableSetUp && props.formTableSetUp.list && props.formTableSetUp.list.length > 0){
oldFormSetUp.list.forEach((item)=>{
if(item.name && item.name == props.data.name){
item.control.imgUrl = response.data.url
item.control.link = response.data.url
}
})
}
// props.setimgurl=response.data.url
emits("update:imgUrl",response.data.url)
console.log("上传成功回调------>",url.value)
emits("updateCont",response.data.url)
}
watch(() =>props.imgUrl,(val)=>{
// console.log("props.imgUrl.value ",props.data.control.link && (props.data.control.link == "" || props.data.control.link == "undefined") )
if(props.imgUrl && props.imgUrl != "" && props.imgUrl != "undefined"){
url.value = props.imgUrl
if((props.data.control.link == "" || props.data.control.link == "undefined") ){
props.data.control.link = props.imgUrl
}
}
},{ deep: true });
url.value = response.data.url;
let oldFormSetUp = props.formTableSetUp;
if (
props.formTableSetUp &&
props.formTableSetUp.list &&
props.formTableSetUp.list.length > 0
) {
oldFormSetUp.list.forEach((item) => {
if (item.name && item.name == props.data.name) {
item.control.imgUrl = response.data.url;
item.control.link = response.data.url;
}
});
}
// props.setimgurl=response.data.url
emits("update:imgUrl", response.data.url);
console.log("上传成功回调------>", url.value);
emits("updateCont", response.data.url);
};
watch(
() => props.imgUrl,
(val) => {
// console.log("props.imgUrl.value ",props.data.control.link && (props.data.control.link == "" || props.data.control.link == "undefined") )
if (props.imgUrl && props.imgUrl != "" && props.imgUrl != "undefined") {
url.value = props.imgUrl;
if (props.data.control.link == "" || props.data.control.link == "undefined") {
props.data.control.link = props.imgUrl;
}
}
},
{ deep: true }
);
</script>
<template>
<div>
<img v-if="url!=errimg" referrerpolicy="no-referrer" :src="url" :style="styleObject" :fit="fit" :class="[boderAndShadowClassIsActive ? boderAndShadowClass : '', radiusClassIsActive ? radiusClass : '',mp, floatFlag ? floatStyle : '']" @click="handleLink(props.data?.control)" />
<img v-else referrerpolicy="no-referrer" :src="url" :style="styleObject" :fit="fit" :class="[boderAndShadowClassIsActive ? boderAndShadowClass : '', radiusClassIsActive ? radiusClass : '',mp, floatFlag ? floatStyle : '']" @click="handleLink(props.data?.control)" />
<!-- <el-upload
<div class="imgBox">
<img
v-if="url != errimg"
referrerpolicy="no-referrer"
:src="url"
:style="styleObject"
:fit="fit"
:class="[
boderAndShadowClassIsActive ? boderAndShadowClass : '',
radiusClassIsActive ? radiusClass : '',
mp,
floatFlag ? floatStyle : '',
]"
@click="handleLink(props.data?.control)"
/>
<img
v-else
referrerpolicy="no-referrer"
:src="url"
:style="styleObject"
:fit="fit"
:class="[
boderAndShadowClassIsActive ? boderAndShadowClass : '',
radiusClassIsActive ? radiusClass : '',
mp,
floatFlag ? floatStyle : '',
]"
@click="handleLink(props.data?.control)"
/>
<!-- <el-upload
v-bind="$props"
class="upload-demo"
:action="uploadUrl"
@ -220,10 +245,16 @@ watch(() =>props.imgUrl,(val)=>{
<img referrerpolicy="no-referrer" :src="url" :style="styleObject" :fit="fit" :class="[boderAndShadowClassIsActive ? boderAndShadowClass : '', radiusClassIsActive ? radiusClass : '',mp, floatFlag ? floatStyle : '']" />
<img referrerpolicy="no-referrer" :src="url" :style="styleObject" :fit="fit" :class="[boderAndShadowClassIsActive ? boderAndShadowClass : '', radiusClassIsActive ? radiusClass : '',mp, floatFlag ? floatStyle : '']" />
</el-upload> -->
</div>
</div>
</template>
<style lang="scss" scoped>
.imgBox {
img {
width: 100%;
}
}
</style>
<style>
.boderAndShadow {
@ -235,8 +266,8 @@ watch(() =>props.imgUrl,(val)=>{
.mp {
margin-top: v-bind(mt);
margin-bottom: v-bind(mb);
margin-left:v-bind(ml);
margin-right:v-bind(mr);
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);

Loading…
Cancel
Save