Browse Source

Merge branch 'qin_16'

qin_17
herenshan112 6 months ago
parent
commit
d6aa3c1e2b
  1. 1
      package-lock.json
  2. 1
      package.json
  3. 1
      src/App.vue
  4. 2
      src/components/formTable/formItemGroup.vue
  5. 2
      src/components/lowCode/assistant/associatedForms.vue
  6. 17
      src/components/lowCode/assistant/baiDuMap.vue
  7. 109
      src/components/lowCode/assistant/cascader.vue
  8. 182
      src/components/lowCode/assistant/checkboxPage.vue
  9. 45
      src/components/lowCode/assistant/colorPickerPage.vue
  10. 96
      src/components/lowCode/assistant/datePicker.vue
  11. 79
      src/components/lowCode/assistant/departmentOrg.vue
  12. 20
      src/components/lowCode/assistant/digitpage.vue
  13. 7
      src/components/lowCode/assistant/editTime.vue
  14. 14
      src/components/lowCode/assistant/founder.vue
  15. 8
      src/components/lowCode/assistant/founderTime.vue
  16. 37
      src/components/lowCode/assistant/inputNumberPage.vue
  17. 167
      src/components/lowCode/assistant/inputPage.vue
  18. 77
      src/components/lowCode/assistant/org.vue
  19. 2
      src/components/lowCode/assistant/orgCitys.vue
  20. 64
      src/components/lowCode/assistant/ownerPage.vue
  21. 73
      src/components/lowCode/assistant/pickpost.vue
  22. 40
      src/components/lowCode/assistant/pickrole.vue
  23. 15
      src/components/lowCode/assistant/quillEditor.vue
  24. 180
      src/components/lowCode/assistant/radioPage.vue
  25. 195
      src/components/lowCode/assistant/selectPage.vue
  26. 9
      src/components/lowCode/assistant/serialNumber.vue
  27. 6
      src/components/lowCode/assistant/signatureMap.vue
  28. 49
      src/components/lowCode/assistant/switchPage.vue
  29. 69
      src/components/lowCode/assistant/textareaPage.vue
  30. 78
      src/components/lowCode/assistant/timePickerPage.vue
  31. 132
      src/components/lowCode/assistant/treeSelectPage.vue
  32. 3
      src/components/lowCode/assistant/uploadPage.vue
  33. 10
      src/components/lowCode/assistant/urlLink.vue
  34. 24
      src/components/lowCode/assistant/user.vue
  35. 7
      src/components/lowCode/assistant/videoUpAndPlay.vue
  36. 2
      src/components/lowCode/formItemGroups.vue
  37. 445
      src/components/lowCode/newFormItem.vue
  38. 2
      src/components/lowCode/tablePage.vue
  39. 2
      src/utils/lowCode/index.ts
  40. 4
      src/views/formTable/page/cardPage.vue
  41. 4
      src/views/formTable/page/cardPageNew.vue
  42. 8
      src/views/formTable/pageInfo.vue

1
package-lock.json

@ -17,6 +17,7 @@
"@zxing/library": "^0.21.3",
"appformlowcode": "file:",
"axios": "^1.7.7",
"dayjs": "^1.11.13",
"element-plus": "^2.8.6",
"font-awesome": "^4.7.0",
"html5-qrcode": "^2.3.8",

1
package.json

@ -50,6 +50,7 @@
"@zxing/library": "^0.21.3",
"appformlowcode": "file:",
"axios": "^1.7.7",
"dayjs": "^1.11.13",
"element-plus": "^2.8.6",
"font-awesome": "^4.7.0",
"html5-qrcode": "^2.3.8",

1
src/App.vue

@ -1,5 +1,4 @@
<script setup lang="ts">
import HelloWorld from './components/HelloWorld.vue'
</script>
<template>

2
src/components/formTable/formItemGroup.vue

@ -629,7 +629,7 @@ const linksIf = (obj: FormList) => {
</el-button>
</div>
</template>
<FormItem v-else :data="element" @asf-value-changed="asfValueChanged" />
<NewFormItem v-else :data="element" @asf-value-changed="asfValueChanged" />
</div>
</div>

2
src/components/lowCode/assistant/associatedForms.vue

@ -1,6 +1,6 @@
<template>
{{tableFlag}}<br>{{options}}<br>{{value2}}
<!-- <span style="font-size: 14px; margin-right: 12px;padding-top: 4px;" class="small-span" >{{ props.data.item?props.data.item.label:"关联表单" }}</span> -->
<!-- <div style="margin-right: 12px;"></div> -->

17
src/components/lowCode/assistant/baiDuMap.vue

@ -236,9 +236,24 @@ const updateMapInfo = (ads:string,lng:any,lat:any) =>{
latitude.value = lat
// mapInit(mapObject)
}
/**
@ 作者: 秦东
@ 时间: 2025-06-11 14:03:37
@ 功能: 打印地址
*/
const valPrint = (val:string) => {
console.log("打印地址----------》",val)
if(val != "" && val != undefined){
let addStr = val.split("|*@*|")
return addStr[0]
}else{
return ""
}
}
</script>
<template>
<div v-if="type === 4" class="form-value" v-html="value"></div>
<div v-if="type === 3" class="form-value" v-html="valPrint(value)"></div>
<template v-else>
<input v-model="value" type="hidden" />
<input v-model="lngLat" type="hidden" />

109
src/components/lowCode/assistant/cascader.vue

@ -15,6 +15,7 @@ const props = withDefaults(
config?: Object
data?: Object
options?: Object
types?: number
}>(),
{}
)
@ -24,7 +25,16 @@ const emits = defineEmits<{
const value = computed({
get: () => {
// console.log("-112->",props.modelValue)
return props.modelValue
if(props.modelValue != "" && props.modelValue != undefined){
if(Array.isArray(props.modelValue)){
return props.modelValue
}else{
return JSON.parse(props.modelValue);
}
}else{
return ""
}
},
set: (newVal: any) => {
emits('update:modelValue', newVal)
@ -33,15 +43,110 @@ const value = computed({
});
const handleChange = () => {
}
/**
@ 作者: 秦东
@ 时间: 2025-06-11 09:06:05
@ 功能: 获取值
*/
const valPrint = (val:string,orgList:any[]) => {
let title = treeData(orgList)
let nameAry = new Array
console.log("递归查询-2--->",val,title)
if(val != "" && val != undefined){
if(Array.isArray(val)){
console.log("递归查询-4--->",val)
val.forEach((vItem:any) => {
if(Array.isArray(title)){
console.log("递归查询-3--->",vItem,title)
title.forEach((item:TreeNodeInfo) => {
if(vItem == item.value){
nameAry.push(item.label)
}
})
}
})
}else{
let valAry = JSON.parse(val);
console.log("递归查询-45--->",val)
valAry.forEach((vItem:any) => {
if(Array.isArray(title)){
console.log("递归查询-3--->",vItem,title)
title.forEach((item:TreeNodeInfo) => {
if(vItem == item.value){
nameAry.push(item.label)
}
})
}
})
}
}
console.log("递归查询-1--->",nameAry)
if(nameAry.length > 0){
return nameAry.join("、")
}else{
return ""
}
}
/**
@ 作者: 秦东
@ 时间: 2025-06-11 09:10:37
@ 功能: 递归处理树循环数据
*/
//
interface TreeNode {
value: number;
label: string;
children?: TreeNode[];
}
interface TreeNodeInfo {
value: number;
label: string;
}
function treeData(node: TreeNode[],title: TreeNodeInfo[]){
// let title = new Array
if(Array.isArray(node)){
node.forEach((item:TreeNode) => {
if(Array.isArray(title)){
title.push({
value:item.value,
label:item.label
});
}else{
title =[{
value:item.value,
label:item.label
}];
}
if (item.children) {
if(Array.isArray(item.children)){
treeData(item.children,title)
// for (const child of item.children) {
// treeData(child,title)
// }
}
}
})
}
return title;
}
</script>
<template>
<el-cascader
v-if="props.types!=3"
v-model="value"
:options="props.options"
@change="handleChange"
/>
<el-text v-else class="wordColor">{{valPrint(value,props.options)}}</el-text>
</template>
<style lang='scss' scoped>
.wordColor{
color:#000000;
}
</style>

182
src/components/lowCode/assistant/checkboxPage.vue

@ -0,0 +1,182 @@
<!--
@ 作者: 秦东
@ 时间: 2025-06-10 15:54:32
@ 备注: 多选控件
-->
<script lang='ts' setup>
import { AnalysisCss,AnalysisInputCss } from '@/api/common/cssInfo'
import {
formatNumber,
constFormProps
} from '@/api/lowCode/utils';
const props = withDefaults(
defineProps<{
data: FormList
tablekey: any
numrun?: number
modelValue?: any //
tProp?: string // form-itemprop
types?:number
control:any
}>(),
{}
)
const emits = defineEmits(['update:modelValue','pageIdAry'])
const formProps = inject(constFormProps, {}) as any
const config = computed(() => {
return props.data.config || {}
})
const type = computed(() => {
return formProps.value.type
})
const value = computed({
get: () => {
return props.modelValue
},
set: (newVal: any) => {
emits('update:modelValue', newVal)
},
});
/**
@ 作者: 秦东
@ 时间: 2025-06-10 14:25:01
@ 功能: 获取组件名称
*/
const getLabel = (val:any) => {
if(val.label){
return val.label;
}else{
return "";
}
}
/**
@ 作者: 秦东
@ 时间: 2024-11-13 14:36:08
@ 功能: 解析css
*/
const getFormItemLableStyle = (ele: any) => {
if(ele?.labelStyle){
// console.log("3",AnalysisCss(ele))
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)
}
}
/**
@ 作者: 秦东
@ 时间: 2024-07-27 15:11:42
@ 功能: 判断是否禁用
*/
const judgeIsDisabled = (key:string) => {
return false
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;
}
}
/****input slot处理***/
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
}
//
const transformOption = (val: string | number, type?: string) => {
switch (config.value.transformData || type) {
case 'none':
return val
case 'string':
try {
return val.toString()
} catch (e) {
return val
}
}
return formatNumber(val)
}
/**
@ 作者: 秦东
@ 时间: 2025-06-10 11:13:06
@ 功能: 输出结果
*/
const valPrint = (val:any[],orgList:any[]) => {
let title = new Array
if(Array.isArray(val)){
if(Array.isArray(orgList)){
val.forEach((vitem: any) => {
orgList.forEach((item: any) => {
if(vitem==item.value){
title.push(item.label)
}
})
})
}
}
return title.join("、")
}
</script>
<template>
<el-checkbox-group
v-if="props.types!=3"
v-bind="control"
v-model="value"
:style="getFormItemInputStyle(configStyle,4)"
>
<el-checkbox
v-for="(item, index) in props.data.options"
:key="index"
:label="transformOption(item.value)"
>
<span :style="getFormItemInputStyle(configStyle,5)">{{ item.label }}</span>
</el-checkbox>
</el-checkbox-group>
<el-text v-else class="wordColor">{{valPrint(value,props.data.options)}}</el-text>
</template>
<style lang='scss' scoped>
.wordColor{
color:#000000;
}
</style>

45
src/components/lowCode/assistant/colorPickerPage.vue

@ -0,0 +1,45 @@
<!--
@ 作者: 秦东
@ 时间: 2025-06-11 13:47:22
@ 备注: 取色器
-->
<script lang='ts' setup>
const props = withDefaults(
defineProps<{
modelValue?: string
disabled?: boolean
data?:any
types?:number
}>(),
{}
)
const emits = defineEmits<{
(e: 'update:modelValue', value: string): void
}>()
const value = computed({
get: () => {
return props.modelValue
},
set: (newVal: any) => {
emits('update:modelValue', newVal)
},
});
const control = computed(() => {
if(props.data.type == "upload"){
props.data.control.action = uploadUrl
}
return props.data.control
})
</script>
<template>
<el-color-picker v-if="props.types!=3" v-model="value" v-bind="control" />
<div v-else :style="'padding:5px;background-color:'+value"><el-text class="wordColor">{{value}}</el-text></div>
</template>
<style lang='scss' scoped>
.wordColor{
color:#000000;
}
</style>

96
src/components/lowCode/assistant/datePicker.vue

@ -4,11 +4,14 @@
@ 备注: 日期选择器
-->
<script lang='ts' setup>
import dayJs from 'dayjs'
const props = withDefaults(
defineProps<{
modelValue?: string
disabled?: boolean
data?:any
types?:number
}>(),
{}
)
@ -28,9 +31,96 @@ const handleClick = (event) => {
//
event.target.readOnly = true;
};
//
const valPrint = (val:number,group:string,type:string) => {
switch(group){
case "year":
if(type != "" && type == "x"){
return dayJs(val).format('YYYY');
}else{
return dayJs(val).format(type);
}
break;
case "month":
if(type != "" && type == "x"){
return dayJs(val).format('MM');
}else{
return dayJs(val).format(type);
}
break;
case "datetime":
if(type != "" && type == "x"){
return dayJs(val).format('YYYY-MM-DD HH:mm:ss');
}else{
return dayJs(val).format(type);
}
break;
case "week":
if(type != "" && type == "x"){
return dayJs(val).format('YYYY年第ww周');
}else{
return dayJs(val).format(type);
}
break;
case "datetimerange":
if(Array.isArray(val)){
let startTime = val[0]
let endNum = val.length-1
if(endNum<0){
endNum = 0
}
let endEnd = val[endNum]
if(type != "" && type == "x"){
return dayJs(startTime).format('YYYY-MM-DD HH:mm:ss') + " - " + dayJs(endEnd).format('YYYY-MM-DD HH:mm:ss');
}else{
return dayJs(startTime).format(type) + " - " + dayJs(endEnd).format(type);
}
}
break;
case "daterange":
if(Array.isArray(val)){
let startTime = val[0]
let endNum = val.length-1
if(endNum<0){
endNum = 0
}
let endEnd = val[endNum]
if(type != "" && type == "x"){
return dayJs(startTime).format('YYYY-MM-DD') + " - " + dayJs(endEnd).format('YYYY-MM-DD');
}else{
return dayJs(startTime).format(type) + " - " + dayJs(endEnd).format(type);
}
}
break;
case "monthrange":
if(Array.isArray(val)){
let startTime = val[0]
let endNum = val.length-1
if(endNum<0){
endNum = 0
}
let endEnd = val[endNum]
if(type != "" && type == "x"){
return dayJs(startTime).format('YYYY-MM') + " - " + dayJs(endEnd).format('YYYY-MM');
}else{
return dayJs(startTime).format(type) + " - " + dayJs(endEnd).format(type);
}
}
break;
default:
if(type != "" && type == "x"){
return dayJs(val).format('YYYY-MM-DD');
}else{
return dayJs(val).format(type);
}
}
}
</script>
<template>
<el-date-picker
v-if="props.types!=3"
align="left"
v-model="value"
:type="props.data.control.type"
@ -44,7 +134,11 @@ const handleClick = (event) => {
@click="handleClick"
@focus="handleClick"
/>
<el-text v-else class="wordColor">{{valPrint(value,props.data.control.type,props.data.control.valueFormat)}}</el-text>
</template>
<style lang='scss' scoped>
.wordColor{
color:#000000;
}
</style>

79
src/components/lowCode/assistant/departmentOrg.vue

@ -21,6 +21,7 @@ const props = withDefaults(
numrun?: number
modelValue?: any //
tProp?: string // form-itemprop
types?: string
}>(),
{}
)
@ -122,9 +123,9 @@ const getFormItemInputStyle = (ele: any,sty:number) => {
const value = computed({
get() {
if (props.tProp) {
if (props.modelValue != "" && props.modelValue != undefined){
//
return props.modelValue
return props.modelValue*1
} else {
return formProps.value.model[props.data.name]
}
@ -186,9 +187,77 @@ const orgTreeProps ={
label: 'name',
children:'child',
}
interface TreeNodeInfo {
value: number;
label: string;
}
function treeData(node: orgInfo[],title: TreeNodeInfo[]){
// let title = new Array
if(Array.isArray(node)){
node.forEach((item:TreeNode) => {
if(Array.isArray(title)){
title.push({
value:item.id,
label:item.name
});
}else{
title =[{
value:item.id,
label:item.name
}];
}
if (item.child) {
if(Array.isArray(item.child)){
treeData(item.child,title)
// for (const child of item.children) {
// treeData(child,title)
// }
}
}
})
}
return title;
}
/**
@ 作者: 秦东
@ 时间: 2025-06-10 11:13:06
@ 功能: 输出结果
*/
const valPrint = (val:any,orgList:orgInfo[]) => {
let titlaAry = new Array
// console.log(val,"=======>orgList------------>",orgList)
// if(Array.isArray(orgList)){
// console.log(val,"=======>orgList-------2----->",orgList)
// orgList.forEach((item: any) => {
// console.log(val,"=======>orgList-----3------->",item.id)
// if(item.id==val){
// console.log(val,"=======>orgList----1-------->",orgList)
// title = item.name
// }
// })
// }
if(val != "" && val != undefined){
let orgAry = treeData(orgList)
console.log(val,"=======>orgList------------>",orgAry)
if(Array.isArray(orgAry)){
orgAry.forEach((item:orgInfo) => {
if(item.value == val){
titlaAry.push(item.label)
}
})
}
}
return titlaAry.join("、")
}
</script>
<template>
<div class="inputbox">
<div class="inputbox" v-if="props.types!=3">
<el-tree-select
v-loading="peopleLoading"
element-loading-text="Loading..."
@ -202,9 +271,13 @@ const orgTreeProps ={
disabled
/>
</div>
<el-text v-else class="wordColor">{{valPrint(value,orgPeople)}}</el-text>
</template>
<style lang='scss' scoped>
.inputbox{
width:100%;
}
.wordColor{
color:#000000;
}
</style>

20
src/components/lowCode/assistant/digitpage.vue

@ -12,6 +12,7 @@ const props = withDefaults(
numrun?: number
modelValue?: any //
tProp?: string // form-itemprop
types?:number
}>(),
{}
)
@ -66,9 +67,21 @@ const getInputSlot = (key?: string) => {
}
return control
}
/**
@ 作者: 秦东
@ 时间: 2025-06-10 10:58:36
@ 功能: 结果输出
*/
const valPrint = (val:any,dateVal:any) => {
if(dateVal.config&&dateVal.config.append){
return val+dateVal.config.append
}else{
return val
}
}
</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 v-if="props.types!=3" 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 #prepend v-if="config.prepend">
<div v-if="getInputSlot('p')">
@ -96,7 +109,10 @@ const getInputSlot = (key?: string) => {
</template>
</el-input>
<el-text v-else class="wordColor">{{valPrint(value,props.data)}}</el-text>
</template>
<style lang='scss' scoped>
.wordColor{
color:#000000;
}
</style>

7
src/components/lowCode/assistant/editTime.vue

@ -19,6 +19,7 @@ const props = withDefaults(
numrun?: number
modelValue?: any //
tProp?: string // form-itemprop
types?: string
}>(),
{}
)
@ -202,9 +203,10 @@ const getCurrentTime = () => {
}
</script>
<template>
<div class="inputbox">
<div v-if="props.types!=3" class="inputbox">
<el-input v-model="value" :style="getFormItemInputStyle(configStyle,2)" :input-style="getFormItemInputStyle(configStyle,3)" placeholder="系统自动生成" disabled readonly></el-input>
</div>
<el-text v-else class="wordColor">{{value}}</el-text>
</template>
<style lang='scss' scoped>
.inputbox{
@ -213,4 +215,7 @@ const getCurrentTime = () => {
pointer-events: none;
}
}
.wordColor{
color:#000000;
}
</style>

14
src/components/lowCode/assistant/founder.vue

@ -20,6 +20,7 @@ const props = withDefaults(
numrun?: number
modelValue?: any //
tProp?: string // form-itemprop
types?:number
}>(),
{}
)
@ -171,18 +172,13 @@ const getFormFounder = (val: any) => {
}
</script>
<template>
<div class="inputbox">
<div v-if="props.types!=3" class="inputbox">
<el-input disabled v-model="value" :style="getFormItemInputStyle(configStyle,2)" :input-style="getFormItemInputStyle(configStyle,3)" placeholder="系统自动生成" ></el-input>
</div>
<el-text v-else class="wordColor">{{value}}</el-text>
</template>
<style lang='scss' scoped>
.el-form-item--default{
margin-bottom: 0px;
}
.el-form-item{
margin-bottom: 0px;
}
.inputbox{
width:100%;
.wordColor{
color:#000000;
}
</style>

8
src/components/lowCode/assistant/founderTime.vue

@ -18,6 +18,7 @@ const props = withDefaults(
numrun?: number
modelValue?: any //
tProp?: string // form-itemprop
types?:number
}>(),
{}
)
@ -174,12 +175,13 @@ const getCurrentTime = () => {
}
</script>
<template>
<div class="inputbox">
<div v-if="props.types!=3" class="inputbox">
<el-input v-model="value" :style="getFormItemInputStyle(configStyle,2)" :input-style="getFormItemInputStyle(configStyle,3)" placeholder="系统自动生成" disabled></el-input>
</div>
<el-text v-else class="wordColor">{{value}}</el-text>
</template>
<style lang='scss' scoped>
.inputbox{
width:100%;
.wordColor{
color:#000000;
}
</style>

37
src/components/lowCode/assistant/inputNumberPage.vue

@ -0,0 +1,37 @@
<!--
@ 作者: 秦东
@ 时间: 2025-06-11 11:11:16
@ 备注: 计数组件
-->
<script lang='ts' setup>
const props = withDefaults(
defineProps<{
modelValue?: string
disabled?: boolean
data?:any
types?:number
}>(),
{}
)
const emits = defineEmits<{
(e: 'update:modelValue', value: string): void
}>()
const value = computed({
get: () => {
return props.modelValue
},
set: (newVal: any) => {
emits('update:modelValue', newVal)
},
});
</script>
<template>
<el-input-number v-if="props.types!=3" v-model="value" />
<el-text v-else class="wordColor">{{value}}</el-text>
</template>
<style lang='scss' scoped>
.wordColor{
color:#000000;
}
</style>

167
src/components/lowCode/assistant/inputPage.vue

@ -0,0 +1,167 @@
<!--
@ 作者: 秦东
@ 时间: 2025-06-10 15:34:04
@ 备注: 单行文本及密码
-->
<script lang='ts' setup>
import { AnalysisCss,AnalysisInputCss } from '@/api/common/cssInfo'
import {
constFormProps
} from '@/api/lowCode/utils';
const props = withDefaults(
defineProps<{
data: FormList
tablekey: any
numrun?: number
modelValue?: any //
tProp?: string // form-itemprop
types?:number
control:any
}>(),
{}
)
const emits = defineEmits(['update:modelValue','pageIdAry'])
const formProps = inject(constFormProps, {}) as any
const config = computed(() => {
return props.data.config || {}
})
const type = computed(() => {
return formProps.value.type
})
const value = computed({
get: () => {
return props.modelValue
},
set: (newVal: any) => {
emits('update:modelValue', newVal)
},
});
/**
@ 作者: 秦东
@ 时间: 2025-06-10 14:25:01
@ 功能: 获取组件名称
*/
const getLabel = (val:any) => {
if(val.label){
return val.label;
}else{
return "";
}
}
/**
@ 作者: 秦东
@ 时间: 2024-11-13 14:36:08
@ 功能: 解析css
*/
const getFormItemLableStyle = (ele: any) => {
if(ele?.labelStyle){
// console.log("3",AnalysisCss(ele))
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)
}
}
/**
@ 作者: 秦东
@ 时间: 2024-07-27 15:11:42
@ 功能: 判断是否禁用
*/
const judgeIsDisabled = (key:string) => {
return false
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;
}
}
/****input slot处理***/
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
}
</script>
<template>
<el-input
v-if="props.types!=3"
v-bind="control"
v-model="value"
:type="data.type === 'password' ? 'password' : 'text'"
:style="getFormItemInputStyle(configStyle,2)"
:input-style="getFormItemInputStyle(configStyle,3)"
:placeholder="data.control.placeholder?data.control.placeholder:'请输入'+getLabel(data.item)"
>
<template #prepend v-if="config.prepend">
<div v-if="getInputSlot('p')">
<SelectDesign
:data="getInputSlot('p')"
:disabled="judgeIsDisabled(data.name)"
:transform-option="transformOption"
@change="inputSlotChange"
type="slot"
/>
</div>
<span v-else>{{ config.prepend }}</span>
</template>
<template #append v-if="config.append">
<div v-if="getInputSlot()">
<SelectDesign
:data="getInputSlot()"
:disabled="judgeIsDisabled(data.name)"
:transform-option="transformOption"
@change="inputSlotChange"
type="slot"
/>
</div>
<span v-else>{{ config.append }}</span>
</template>
</el-input>
<el-text v-else class="wordColor">{{value}}</el-text>
</template>
<style lang='scss' scoped>
.wordColor{
color:#000000;
}
</style>

77
src/components/lowCode/assistant/org.vue

@ -12,6 +12,7 @@ const props = withDefaults(
numrun?: number
modelValue?: any //
tProp?: string // form-itemprop
types?:number
}>(),
{}
)
@ -53,9 +54,80 @@ function haveOrgTreeInfo(){
onBeforeMount(() => {
haveOrgTreeInfo();
})
interface TreeNodeInfo {
value: number;
label: string;
}
function treeData(node: orgInfo[],title: TreeNodeInfo[]){
// let title = new Array
if(Array.isArray(node)){
node.forEach((item:TreeNode) => {
if(Array.isArray(title)){
title.push({
value:item.id,
label:item.name
});
}else{
title =[{
value:item.id,
label:item.name
}];
}
if (item.child) {
if(Array.isArray(item.child)){
treeData(item.child,title)
// for (const child of item.children) {
// treeData(child,title)
// }
}
}
})
}
return title;
}
/**
@ 作者: 秦东
@ 时间: 2025-06-10 11:13:06
@ 功能: 输出结果
*/
const valPrint = (val:any,orgList:orgInfo[]) => {
let titlaAry = new Array
// console.log(val,"=======>orgList------------>",orgList)
// if(Array.isArray(orgList)){
// console.log(val,"=======>orgList-------2----->",orgList)
// orgList.forEach((item: any) => {
// console.log(val,"=======>orgList-----3------->",item.id)
// if(item.id==val){
// console.log(val,"=======>orgList----1-------->",orgList)
// title = item.name
// }
// })
// }
if(val != "" && val != undefined){
let orgAry = treeData(orgList)
console.log(val,"=======>orgList------------>",orgAry)
if(Array.isArray(orgAry)){
orgAry.forEach((item:orgInfo) => {
if(item.value == val){
titlaAry.push(item.label)
}
})
}
}
return titlaAry.join("、")
}
</script>
<template>
<el-tree-select
v-if="props.types!=3"
v-bind="$props"
v-model="value"
v-loading="orgTreeLoading"
@ -65,7 +137,10 @@ onBeforeMount(() => {
check-strictly
:render-after-expand="false"
/>
<el-text v-else class="wordColor">{{valPrint(value,orgTreeList)}}</el-text>
</template>
<style lang='scss' scoped>
.wordColor{
color:#000000;
}
</style>

2
src/components/lowCode/assistant/orgCitys.vue

@ -245,7 +245,7 @@ const getFormItemInputStyle = (ele: any,sty:number) => {
}
</script>
<template>
<div v-if="type === 14" class="form-value" v-html="value"></div>
<div v-if="type === 3" class="form-value" v-html="value"></div>
<el-input v-else v-model="value" :disabled="editDisabled" clearable placeholder="请选择地址" style="width:100%" @click="openAddress" :style="getFormItemInputStyle(configStyle,2)" :input-style="getFormItemInputStyle(configStyle,3)" />
<el-dialog
v-model="addressBox"

64
src/components/lowCode/assistant/ownerPage.vue

@ -21,6 +21,7 @@ const props = withDefaults(
numrun?: number
modelValue?: any //
tProp?: string // form-itemprop
types?: string
}>(),
{}
)
@ -181,13 +182,71 @@ onMounted(()=>{
})
});
const orgTreeProps ={
label: 'name',
children:'child',
}
interface TreeNodeInfo {
value: number;
label: string;
}
function treeData(node: orgAndPeople[],title: TreeNodeInfo[]){
// let title = new Array
if(Array.isArray(node)){
node.forEach((item:TreeNode) => {
if(Array.isArray(title)){
title.push({
value:item.id,
label:item.name
});
}else{
title =[{
value:item.id,
label:item.name
}];
}
if (item.child) {
if(Array.isArray(item.child)){
treeData(item.child,title)
// for (const child of item.children) {
// treeData(child,title)
// }
}
}
})
}
return title;
}
/**
@ 作者: 秦东
@ 时间: 2025-06-10 11:13:06
@ 功能: 输出结果
*/
const valPrint = (val:any,orgList:orgInfo[]) => {
let titlaAry = new Array
if(val != "" && val != undefined){
let orgAry = treeData(orgList)
console.log(val,"=======>orgList------------>",orgAry)
if(Array.isArray(orgAry)){
orgAry.forEach((item:orgInfo) => {
if(item.value == val){
titlaAry.push(item.label)
}
})
}
}
return titlaAry.join("、")
}
</script>
<template>
<el-tree-select
v-if="props.types!=3"
v-loading="peopleLoading"
element-loading-text="Loading..."
v-model="value"
@ -200,7 +259,10 @@ const orgTreeProps ={
:disabled="type == 4"
/>
<el-text v-else class="wordColor">{{valPrint(value,orgPeople)}}</el-text>
</template>
<style lang='scss' scoped>
.wordColor{
color:#000000;
}
</style>

73
src/components/lowCode/assistant/pickpost.vue

@ -13,6 +13,7 @@ const props = withDefaults(
numrun?: number
modelValue?: any //
tProp?: string // form-itemprop
types?: string
}>(),
{}
)
@ -187,9 +188,74 @@ const writeInfo = (val: any) => {
}
return sendInfo;
};
interface TreeNodeInfo {
value: number;
label: string;
}
function treeData(node: orgInfo[],title: TreeNodeInfo[]){
// let title = new Array
if(Array.isArray(node)){
node.forEach((item:TreeNode) => {
if(Array.isArray(title)){
title.push({
value:item.id,
label:item.name
});
}else{
title =[{
value:item.id,
label:item.name
}];
}
if (item.child) {
if(Array.isArray(item.child)){
treeData(item.child,title)
// for (const child of item.children) {
// treeData(child,title)
// }
}
}
})
}
return title;
}
/**
@ 作者: 秦东
@ 时间: 2025-06-12 11:19:39
@ 功能: 输出岗位结果
*/
const valPrint = (val:string,orgList:orgInfo[],postList:any[]) => {
let titlaAry = new Array
if(val != "" && val != undefined){
if(Array.isArray(orgList)){
let orgAry = treeData(orgList)
console.log("输出岗位结果-------->",orgAry)
if(Array.isArray(orgAry)){
orgAry.forEach((item:orgInfo) => {
if(item.value == val.orgId){
titlaAry.push(item.label)
}
})
}
}
if(Array.isArray(postList)){
postList.forEach((item:any) => {
if(item.id == val.postId){
titlaAry.push(item.name)
}
})
}
}
return titlaAry.join("-")
}
</script>
<template>
<div v-if="props.types!=3" class="kuandu">
<el-tree-select
v-bind="$props"
v-model="orgPostInfo.orgId"
@ -218,9 +284,14 @@ const writeInfo = (val: any) => {
</el-select>
<el-input style="display: none" v-model="value" placeholder="请选择" />
</div>
<el-text v-else class="wordColor">{{valPrint(orgPostInfo,orgTreeList,postOptions)}}</el-text>
</template>
<style lang="scss" scoped>
.el-row {
width: 100%;
}
.kuandu{
width: 100%;
}
</style>

40
src/components/lowCode/assistant/pickrole.vue

@ -7,11 +7,12 @@
import { gainRoleList } from '@/api/hr/org/index'
const props = withDefaults(
defineProps<{
data: FormList
tablekey: any
numrun?: number
modelValue?: any //
tProp?: string // form-itemprop
data: FormList
tablekey: any
numrun?: number
modelValue?: any //
tProp?: string // form-itemprop
types?: string
}>(),
{}
)
@ -36,16 +37,36 @@ onBeforeMount(() => {
roleLoading.value = true;
gainRoleList()
.then(({ data }) => {
console.log("角色列表", data);
roleLiet.value = data;
})
.finally(() => {
roleLoading.value = false;
});
});
/**
@ 作者: 秦东
@ 时间: 2025-06-12 10:58:16
@ 功能: 输出结果
*/
const valPrint = (val:any,orgList:any[]) => {
let titlaAry = new Array
if(val != "" && val != undefined){
if(Array.isArray(orgList)){
orgList.forEach((item:any) => {
if(item.id == val){
// console.log("-----1------>", item);
titlaAry.push(item.name)
}
})
}
}
return titlaAry.join("、")
}
</script>
<template>
<el-select v-model="value" placeholder="请选择">
<el-select v-if="props.types!=3" v-model="value" placeholder="请选择">
<el-option
v-for="item in roleLiet"
:key="item.id"
@ -53,7 +74,10 @@ onBeforeMount(() => {
:value="item.id"
/>
</el-select>
<el-text v-else class="wordColor">{{valPrint(value,roleLiet)}}</el-text>
</template>
<style lang='scss' scoped>
.wordColor{
color:#000000;
}
</style>

15
src/components/lowCode/assistant/quillEditor.vue

@ -1,7 +1,7 @@
<!--
@ 作者: 秦东
@ 时间: 2025-03-14 19:17:35
@ 备注:
@ 备注: 富文本
-->
<script lang='ts' setup>
import { newUploadFileApi } from '@/api/common/public'
@ -17,6 +17,7 @@ const props = withDefaults(
imgUrl?: string
config?: any
type?: number
types?:number
}>(),
{
modelValue: '',
@ -34,7 +35,14 @@ const props = withDefaults(
const emits = defineEmits<{
(e: 'update:modelValue', value: string): void
}>()
const value = computed({
get: () => {
return props.modelValue
},
set: (newVal: any) => {
emits('update:modelValue', newVal)
},
});
// const content = ref(props.modelValue);
const content = computed({
@ -130,10 +138,11 @@ onBeforeUnmount(() => {
});
</script>
<template><div class="butBox" >按钮</div>
<div style="border: 1px solid #ccc; width: 100%; margin: 20px auto">
<div v-if="props.types!=3" style="border: 1px solid #ccc; width: 100%; margin: 20px auto">
<Toolbar style="border-bottom: 1px solid #ccc" :editor="editorRef" :defaultConfig="toolbarConfig" mode="default" />
<Editor style="height: 600px; overflow-y: hidden" v-model="content" :defaultConfig="editorConfig" mode="default" @onCreated="handleCreated" @customPaste="customPaste" />
</div>
<el-text v-else class="wordColor" v-html="value"></el-text>
</template>
<style lang='scss' scoped>
.butBox{

180
src/components/lowCode/assistant/radioPage.vue

@ -0,0 +1,180 @@
<!--
@ 作者: 秦东
@ 时间: 2025-06-10 15:46:55
@ 备注: 单选
-->
<script lang='ts' setup>
import { AnalysisCss,AnalysisInputCss } from '@/api/common/cssInfo'
import {
formatNumber,
constFormProps
} from '@/api/lowCode/utils';
const props = withDefaults(
defineProps<{
data: FormList
tablekey: any
numrun?: number
modelValue?: any //
tProp?: string // form-itemprop
types?:number
control:any
}>(),
{}
)
const emits = defineEmits(['update:modelValue','pageIdAry'])
const formProps = inject(constFormProps, {}) as any
const config = computed(() => {
return props.data.config || {}
})
const type = computed(() => {
return formProps.value.type
})
const value = computed({
get: () => {
return props.modelValue
},
set: (newVal: any) => {
emits('update:modelValue', newVal)
},
});
/**
@ 作者: 秦东
@ 时间: 2025-06-10 14:25:01
@ 功能: 获取组件名称
*/
const getLabel = (val:any) => {
if(val.label){
return val.label;
}else{
return "";
}
}
/**
@ 作者: 秦东
@ 时间: 2024-11-13 14:36:08
@ 功能: 解析css
*/
const getFormItemLableStyle = (ele: any) => {
if(ele?.labelStyle){
// console.log("3",AnalysisCss(ele))
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)
}
}
/**
@ 作者: 秦东
@ 时间: 2024-07-27 15:11:42
@ 功能: 判断是否禁用
*/
const judgeIsDisabled = (key:string) => {
return false
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;
}
}
/****input slot处理***/
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
}
//
const transformOption = (val: string | number, type?: string) => {
switch (config.value.transformData || type) {
case 'none':
return val
case 'string':
try {
return val.toString()
} catch (e) {
return val
}
}
return formatNumber(val)
}
/**
@ 作者: 秦东
@ 时间: 2025-06-10 11:13:06
@ 功能: 输出结果
*/
const valPrint = (val:any,orgList:any[]) => {
let title = ""
if(Array.isArray(orgList)){
orgList.forEach((item: any) => {
if(item.value==val){
title = item.label
}
})
}
return title
}
</script>
<template>
<el-radio-group
v-if="props.types!=3"
v-bind="control"
v-model="value"
:style="getFormItemInputStyle(configStyle,4)"
>
<el-radio
:key="index"
:label="transformOption(item.value)"
v-for="(item, index) in props.data.options"
>
<span :style="getFormItemInputStyle(configStyle,5)">{{ item.label }}</span>
</el-radio>
</el-radio-group>
<el-text v-else class="wordColor">{{valPrint(value,props.data.options)}}</el-text>
</template>
<style lang='scss' scoped>
.wordColor{
color:#000000;
}
</style>

195
src/components/lowCode/assistant/selectPage.vue

@ -0,0 +1,195 @@
<!--
@ 作者: 秦东
@ 时间: 2025-06-10 16:04:34
@ 备注: 下来组件
-->
<script lang='ts' setup>
import { AnalysisCss,AnalysisInputCss } from '@/api/common/cssInfo'
import {
formatNumber,
constFormProps
} from '@/api/lowCode/utils';
const props = withDefaults(
defineProps<{
data: FormList
tablekey: any
numrun?: number
modelValue?: any //
tProp?: string // form-itemprop
types?:number
control:any
}>(),
{}
)
const emits = defineEmits(['update:modelValue','pageIdAry'])
const formProps = inject(constFormProps, {}) as any
const config = computed(() => {
return props.data.config || {}
})
const type = computed(() => {
return formProps.value.type
})
const value = computed({
get: () => {
return props.modelValue
},
set: (newVal: any) => {
emits('update:modelValue', newVal)
},
});
/**
@ 作者: 秦东
@ 时间: 2025-06-10 14:25:01
@ 功能: 获取组件名称
*/
const getLabel = (val:any) => {
if(val.label){
return val.label;
}else{
return "";
}
}
/**
@ 作者: 秦东
@ 时间: 2024-11-13 14:36:08
@ 功能: 解析css
*/
const getFormItemLableStyle = (ele: any) => {
if(ele?.labelStyle){
// console.log("3",AnalysisCss(ele))
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)
}
}
/**
@ 作者: 秦东
@ 时间: 2024-07-27 15:11:42
@ 功能: 判断是否禁用
*/
const judgeIsDisabled = (key:string) => {
return false
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;
}
}
/****input slot处理***/
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
}
//
const transformOption = (val: string | number, type?: string) => {
switch (config.value.transformData || type) {
case 'none':
return val
case 'string':
try {
return val.toString()
} catch (e) {
return val
}
}
return formatNumber(val)
}
/**
@ 作者: 秦东
@ 时间: 2025-06-10 11:13:06
@ 功能: 输出结果
*/
const valPrint = (val:any[],orgList:any[]) => {
if(Array.isArray(val)){
let title = new Array
if(Array.isArray(orgList)){
val.forEach((vitem: any) => {
orgList.forEach((item: any) => {
if(vitem==item.value){
title.push(item.label)
}
})
})
}
if(title.length>0){
return title.join("、")
}else{
return ""
}
}else{
let title = ""
if(Array.isArray(orgList)){
orgList.forEach((item: any) => {
if(item.value==val){
title = item.label
}
})
}
return title
}
}
</script>
<template>
<SelectDesign
v-if="props.types!=3"
:data="data"
:disabled="judgeIsDisabled(data.name)"
v-model="value"
:options="props.data.options"
:remote-method="getAxiosOptions"
:transformOption="transformOption"
:placeholder="data.control.placeholder?data.control.placeholder:'请选择'+getLabel(data.item)"
/>
<el-text v-else class="wordColor">{{valPrint(value,props.data.options)}}</el-text>
</template>
<style lang='scss' scoped>
.wordColor{
color:#000000;
}
</style>

9
src/components/lowCode/assistant/serialNumber.vue

@ -21,6 +21,8 @@ const props = withDefaults(
numrun?: number
modelValue?: any //
tProp?: string // form-itemprop
types?:number
control?:any
}>(),
{}
)
@ -188,10 +190,13 @@ const formatCustomRules = () => {
}
</script>
<template>
<el-input v-model="value" :disabled="editDisabled" placeholder="请输入编码">
<el-input v-if="props.types!=3" v-model="value" :disabled="editDisabled" placeholder="请输入编码">
<template #prefix >NO.</template>
</el-input>
<el-text v-else class="wordColor">NO.{{value}}</el-text>
</template>
<style lang='scss' scoped>
.wordColor{
color:#000000;
}
</style>

6
src/components/lowCode/assistant/signatureMap.vue

@ -1,13 +1,13 @@
<!--
@ 作者: 秦东
@ 时间: 2024-11-17 15:32:52
@ 备注: 名板
@ 时间: 2025-06-11 13:41:24
@ 备注: 字版
-->
<script lang='ts' setup>
</script>
<template>
<div>签名版</div>
<div></div>
</template>
<style lang='scss' scoped>

49
src/components/lowCode/assistant/switchPage.vue

@ -0,0 +1,49 @@
<!--
@ 作者: 秦东
@ 时间: 2025-06-11 14:11:25
@ 备注: 开关
-->
<script lang='ts' setup>
const props = withDefaults(
defineProps<{
modelValue?: string
disabled?: boolean
data?:any
types?:number
}>(),
{}
)
const emits = defineEmits<{
(e: 'update:modelValue', value: string): void
}>()
const value = computed({
get: () => {
return props.modelValue
},
set: (newVal: any) => {
emits('update:modelValue', newVal)
},
});
/**
@ 作者: 秦东
@ 时间: 2025-06-11 14:03:37
@ 功能: 打印地址
*/
const valPrint = (val:any,openVal:string) => {
if(val == openVal){
return "开"
}else{
return "关"
}
}
</script>
<template>
<el-switch v-if="props.types!=3" v-model="value" />
<el-text v-else class="wordColor">{{valPrint(value,props.data.control.activeValue)}}</el-text>
</template>
<style lang='scss' scoped>
.wordColor{
color:#000000;
}
</style>

69
src/components/lowCode/assistant/textareaPage.vue

@ -0,0 +1,69 @@
<!--
@ 作者: 秦东
@ 时间: 2025-06-10 14:20:12
@ 备注: 多行文本
-->
<script lang='ts' setup>
import {
constFormProps
} from '@/api/lowCode/utils';
const props = withDefaults(
defineProps<{
data: FormList
tablekey: any
numrun?: number
modelValue?: any //
tProp?: string // form-itemprop
types?:number
control:any
}>(),
{}
)
const emits = defineEmits(['update:modelValue','pageIdAry'])
const formProps = inject(constFormProps, {}) as any
const config = computed(() => {
return props.data.config || {}
})
const type = computed(() => {
return formProps.value.type
})
const value = computed({
get: () => {
return props.modelValue
},
set: (newVal: any) => {
emits('update:modelValue', newVal)
},
});
/**
@ 作者: 秦东
@ 时间: 2025-06-10 14:25:01
@ 功能: 获取组件名称
*/
const getLabel = (val:any) => {
if(val.label){
return val.label;
}else{
return "";
}
}
</script>
<template>
<el-input
v-if="props.types!=3"
v-bind="props.control"
v-model="value"
type="textarea"
:autosize="{ minRows: 2, maxRows: 20 }"
:placeholder="data.control.placeholder?data.control.placeholder:'请输入'+getLabel(data.item)"
/>
<el-text v-else class="wordColor">{{value}}</el-text>
</template>
<style lang='scss' scoped>
.wordColor{
color:#000000;
}
</style>

78
src/components/lowCode/assistant/timePickerPage.vue

@ -0,0 +1,78 @@
<!--
@ 作者: 秦东
@ 时间: 2025-06-11 10:33:20
@ 备注: 时间选择器
-->
<script lang='ts' setup>
import dayJs from 'dayjs'
import {
constFormProps
} from '@/api/lowCode/utils';
const props = withDefaults(
defineProps<{
data: FormList
tablekey: any
numrun?: number
modelValue?: any //
tProp?: string // form-itemprop
types?:number
control:any
}>(),
{}
)
const emits = defineEmits(['update:modelValue','pageIdAry'])
const formProps = inject(constFormProps, {}) as any
const config = computed(() => {
return props.data.config || {}
})
const type = computed(() => {
return formProps.value.type
})
const value = computed({
get: () => {
return props.modelValue
},
set: (newVal: any) => {
emits('update:modelValue', newVal)
},
});
/**
@ 作者: 秦东
@ 时间: 2025-06-10 14:25:01
@ 功能: 获取组件名称
*/
const getLabel = (val:any) => {
if(val.label){
return val.label;
}else{
return "";
}
}
//
const handleClick = (event) => {
//
event.target.readOnly = true;
};
//
const valPrint = (val:number,group:string,type:string) => {
return dayJs(val).format('HH:mm:ss');
}
</script>
<template>
<el-time-picker
v-if="props.types!=3"
v-model="value"
value-format="x"
:placeholder="data.control.placeholder? data.control.placeholder: '请选择' + getLabel(data.item)"
@click="handleClick"
@focus="handleClick"
/>
<el-text v-else class="wordColor">{{valPrint(value)}}</el-text>
</template>
<style lang='scss' scoped>
.wordColor{
color:#000000;
}
</style>

132
src/components/lowCode/assistant/treeSelectPage.vue

@ -0,0 +1,132 @@
<!--
@ 作者: 秦东
@ 时间: 2025-06-11 14:23:59
@ 备注: 树形控件
-->
<script lang='ts' setup>
const props = withDefaults(
defineProps<{
modelValue?: string
disabled?: boolean
data?:any
types?:number
control?:any
}>(),
{}
)
const emits = defineEmits<{
(e: 'update:modelValue', value: string): void
}>()
const value = computed({
get: () => {
if(props.modelValue != "" && props.modelValue != undefined){
if(Array.isArray(props.modelValue)){
return props.modelValue
}else{
return JSON.parse(props.modelValue);
}
}else{
return ""
}
},
set: (newVal: any) => {
emits('update:modelValue', newVal)
},
});
const control = computed(() => {
return props.control || {}
// return props.data
})
//
interface TreeNode {
value: number;
label: string;
children?: TreeNode[];
}
interface TreeNodeInfo {
value: number;
label: string;
}
function treeData(node: TreeNode[],title: TreeNodeInfo[]){
// let title = new Array
if(Array.isArray(node)){
node.forEach((item:TreeNode) => {
if(Array.isArray(title)){
title.push({
value:item.value,
label:item.label
});
}else{
title =[{
value:item.value,
label:item.label
}];
}
if (item.children) {
if(Array.isArray(item.children)){
treeData(item.children,title)
// for (const child of item.children) {
// treeData(child,title)
// }
}
}
})
}
return title;
}
/**
@ 作者: 秦东
@ 时间: 2025-06-10 11:13:06
@ 功能: 输出结果
*/
const valPrint = (pickVal:string,orgList:any[]) => {
let titlaAry = new Array
let title = treeData(orgList)
if(pickVal != "" && pickVal != undefined){
// let pickVal = JSON.parse(val)
if(Array.isArray(pickVal)){
console.log("输出结果--数组-->",pickVal,orgList)
if(Array.isArray(title)){
pickVal.forEach((pitem) => {
title.forEach((item:TreeNodeInfo) => {
if(item.value == pitem){
titlaAry.push(item.label)
}
})
})
}
}else{
console.log("输出结果--字符-->",pickVal,orgList)
if(Array.isArray(title)){
title.forEach((item:TreeNodeInfo) => {
if(item.value == pickVal){
titlaAry.push(item.label)
}
})
}
}
}
return titlaAry.join("、")
}
</script>
<template>
<el-tree-select
v-if="props.types!=3"
v-model="value"
:data="data"
:multiple="props.control.multiple"
:render-after-expand="false"
style="width: 240px"
/>
<el-text v-else class="wordColor">{{valPrint(value,props.data)}}</el-text>
</template>
<style lang='scss' scoped>
.wordColor{
color:#000000;
}
</style>

3
src/components/lowCode/assistant/uploadPage.vue

@ -25,6 +25,7 @@ const props = withDefaults(
control?: Object
config?: Object
data?: Object
types?:number
}>(),
{}
)
@ -137,7 +138,7 @@ const uploadSuccess = (response: any, uploadFile: any, uploadFiles: any) => {
// console.log("uploadSuccess=fileList==>",fileList)
}
</script>
<template>
<template>{{types}}
<div>
<el-upload
v-bind="props.control"

10
src/components/lowCode/assistant/urlLink.vue

@ -18,6 +18,7 @@ const props = withDefaults(
numrun?: number
modelValue?: any //
tProp?: string // form-itemprop
types?: string
}>(),
{}
)
@ -142,7 +143,7 @@ const urlVal = ref("http://")
//访URL
const openUrl = () => {
let patt = /^http(s)?:\/\/[\w-]+(\.[\w-]+)+(\:\d+)?(\/\w+)*(\?\w+=.*(\&\w+=.*)*)?$/i;
// console.log("-url-1111-",value.value,patt.test(value.value))
console.log("编码组件-url-1111-》",value.value,patt.test(value.value))
if(patt.test(value.value)){
// console.log("-url--",value)
window.open(value.value,'_blank')
@ -158,7 +159,7 @@ onMounted(() => {
})
</script>
<template>
<el-input v-model="value">
<el-input v-if="types != 3" v-model="value">
<template #prepend>
<el-select v-model="urlVal" style="width: 115px">
<el-option label="http://" value="http://" />
@ -167,7 +168,10 @@ onMounted(() => {
</template>
<template #append><el-button type="warning" @click="openUrl">访问</el-button></template>
</el-input>
<div v-else class="wordColor" @click="openUrl">{{urlVal}}{{value}}</div>
</template>
<style lang='scss' scoped>
.wordColor{
color:#000000;
}
</style>

24
src/components/lowCode/assistant/user.vue

@ -10,6 +10,8 @@ const props = withDefaults(
defineProps<{
modelValue?: string
disabled?: boolean
types?:number
control?:any
}>(),
{}
)
@ -57,11 +59,24 @@ onMounted(() => {
nextTick(() => {})
})
/**
@ 作者: 秦东
@ 时间: 2025-06-10 11:13:06
@ 功能: 输出结果
*/
const valPrint = (val:string) => {
if(val != "" && val != undefined){
let pickVal = JSON.parse(val)
if(Array.isArray(pickVal)){
return pickVal.join("、")
}
}
}
</script>
<template>
<el-input
v-if="props.types!=3"
placeholder="请选择用户"
v-bind="$props"
v-model="value"
@ -71,8 +86,11 @@ onMounted(() => {
<SvgIcon icon-class="user" :size="20" @click.stop="openDialog" />
</template>
</el-input>
<UserDrawer ref="userDialogEl" v-model="value" />
<UserDrawer v-if="props.types!=3" ref="userDialogEl" v-model="value" />
<el-text v-else class="wordColor">{{valPrint(value)}}</el-text>
</template>
<style lang='scss' scoped>
.wordColor{
color:#000000;
}
</style>

7
src/components/lowCode/assistant/videoUpAndPlay.vue

@ -13,6 +13,9 @@ const props = defineProps({
valInfo: {
type: String,
},
modelValue: {
type: String,
},
})
const configStyle = computed(() => {
// console.log("",props.data)
@ -50,7 +53,9 @@ const openVideo = () => {
const imgUrl = computed({
get() {
if (props.valInfo != "") {
if (props.modelValue != "") {
return props.modelValue;
} else if (props.valInfo != "") {
return props.valInfo;
} else {
return props.data?.control.videoMsg[0].url;

2
src/components/lowCode/formItemGroups.vue

@ -147,7 +147,7 @@ const getFormItemInputStyle = (ele: any,sty:number) => {
</el-button>
</div>
</template>
<FormItem v-else :data="item" />
<NewFormItem v-else :data="item" />
</div>
</div>
</template>

445
src/components/lowCode/newFormItem.vue

@ -0,0 +1,445 @@
<!--
@ 作者: 秦东
@ 时间: 2025-06-11 08:11:22
@ 备注: 表单组件循环(新版)
-->
<script lang='ts' setup>
import { Md5 } from 'ts-md5'
import { debounce } from '@/utils/lowCode/item/index'
import { uploadUrl } from '@/api/lowCode/form/fieldUnit'
import {
constFormProps,
constControlChange,
constGetControlByName,
constSetFormOptions
} from '@/api/lowCode/utils';
import validate from "@/api/lowCode/form/validate"
import { AnalysisCss,AnalysisInputCss } from '@/api/common/cssInfo' //
//
import InputPage from '@/components/lowCode/assistant/inputPage.vue'
import DigitpagePage from '@/components/lowCode/assistant/digitpage.vue'
import TextareaPage from '@/components/lowCode/assistant/textareaPage.vue'
import RadioPage from '@/components/lowCode/assistant/radioPage.vue'
import CheckboxPage from '@/components/lowCode/assistant/checkboxPage.vue'
import SelectPage from '@/components/lowCode/assistant/selectPage.vue'
import CascaderPage from '@/components/lowCode/assistant/cascader.vue'
import DatePickerPage from '@/components/lowCode/assistant/datePicker.vue'
import TimePickerPage from '@/components/lowCode/assistant/timePickerPage.vue'
import OrgCitys from '@/components/lowCode/assistant/orgCitys.vue'
import SwitchPage from '@/components/lowCode/assistant/switchPage.vue'
import InputNumberPage from '@/components/lowCode/assistant/inputNumberPage.vue'
import LowcodeImagePage from '@/components/lowCode/assistant/lowcodeImage.vue'
import VideoUpAndPlay from '@/components/lowCode/assistant/videoUpAndPlay.vue'
import UploadPage from '@/components/lowCode/assistant/uploadPage.vue'
import UrlLinkPage from '@/components/lowCode/assistant/urlLink.vue'
import BaiDuMapPage from '@/components/lowCode/assistant/baiDuMap.vue'
import QuillEditor from '@/components/lowCode/assistant/quillEditor.vue'
import LowcodeCarsusel from '@/components/lowCode/assistant/lowcodeCarsusel.vue'
import SignatureMap from '@/components/lowCode/assistant/signatureMap.vue'
import LowcodeTransfer from '@/components/lowCode/assistant/lowcodeTransfer.vue'
import ColorPickerPage from '@/components/lowCode/assistant/colorPickerPage.vue'
import TreeSelectPage from '@/components/lowCode/assistant/treeSelectPage.vue'
import AssociatedForms from '@/components/lowCode/assistant/associatedForms.vue'
import SerialNumber from '@/components/lowCode/assistant/serialNumber.vue'
import ExpandUser from '@/components/lowCode/assistant/user.vue'
import OrgCentent from '@/components/lowCode/assistant/org.vue'
import FounderForm from '@/components/lowCode/assistant/founder.vue'
import FounderTime from '@/components/lowCode/assistant/founderTime.vue'
import EditTime from '@/components/lowCode/assistant/editTime.vue'
import OwnerPage from '@/components/lowCode/assistant/ownerPage.vue'
import DepartmentOrg from '@/components/lowCode/assistant/departmentOrg.vue'
import PickRole from '@/components/lowCode/assistant/pickrole.vue'
import PickPost from '@/components/lowCode/assistant/pickpost.vue'
const props = withDefaults(
defineProps<{
data: FormList
modelValue?: any //
tProp?: string // form-itemprop
nodeKey?:string
purview?:any[]
optionsValue3Get1?:any
tablekey?:any
numrun?:any
rowIndex?:any
}>(),
{}
)
const emits = defineEmits<{
(e: 'update:modelValue', val: any): void
(e: 'optionsValue3Get1', val: any,fieldName: string): void
(e: 'asfValueChanged', val: any): void
}>()
const formProps = inject(constFormProps, {}) as any
const imgUploadApiUrl = import.meta.env.VITE_APP_BASE_API+"/api/upordown" //
//
const type = computed(() => {
return formProps.value.type
})
//
const config = computed(() => {
return props.data.config || {}
})
//css
const configStyle = computed(() => {
return props.data.styles || {}
})
const control = computed(() => {
if(props.data.type == "upload"){
props.data.control.action = uploadUrl
}
return props.data.control
})
const options = ref(props.data.options) //
const changeEvent = inject(constControlChange, '') as any
//
const value = computed({
get() {
if (props.tProp) {
//
return props.modelValue
} else {
if(props.data.type == "checkbox"){
if (formProps.value.model[props.data.name] == null || formProps.value.model[props.data.name] == ""){
// formProps.value.model[props.data.name] = []
// return formProps.value.model[props.data.name]
return []
}else{
return formProps.value.model[props.data.name]
}
}else{
return formProps.value.model[props.data.name]
}
}
},
set(newVal: any) {
if (props.tProp) {
emits('update:modelValue', newVal)
}
updateModel(newVal)
}
})
const getControlByName = inject(constGetControlByName) as any
// selectoptions
const formOptions = inject(constSetFormOptions, {}) as any
//
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
})
}
// 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
}
/**
@ 作者: 秦东
@ 时间: 2024-07-27 15:11:42
@ 功能: 判断是否禁用
*/
const judgeIsDisabled = (key:string) => {
return false
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;
}
}
/**
@ 作者: 秦东
@ 时间: 2024-11-13 14:36:08
@ 功能: 解析css
*/
const getFormItemLableStyle = (ele: any) => {
if(ele?.labelStyle){
// console.log("3",AnalysisCss(ele))
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 getLabel = (ele: FormItem) => {
const showColon = formProps.value.showColon ? ':' : ''
if (ele) {
return ele.showLabel ? '' : ele.label + showColon
} else {
return ''
}
}
function asfValueChanged(val:any){
emits("asfValueChanged",val)
}
/**
@ 作者: 秦东
@ 时间: 2024-11-13 16:18:59
@ 功能: 自定义组件
*/
const currentComponent = computed(() => {
switch(props.data.type){
case "component":
//
return config.value.componentName;
break;
case "input":
case "password":
return markRaw(InputPage);
break;
case "digitpage":
return markRaw(DigitpagePage);
break;
case "textarea":
case "description":
return markRaw(TextareaPage);
break;
case "radio":
return markRaw(RadioPage);
break;
case "checkbox":
return markRaw(CheckboxPage);
break;
case "select":
return markRaw(SelectPage);
break;
case "cascader":
return markRaw(CascaderPage);
break;
case "datePicker":
props.data.control.valueFormat = "x";
return markRaw(DatePickerPage)
break;
case "timePicker":
props.data.control.valueFormat = "x";
return markRaw(TimePickerPage)
break;
case "organization":
return markRaw(OrgCitys)
break;
case "switch":
return markRaw(SwitchPage)
break;
case "inputNumber":
return markRaw(InputNumberPage)
break;
case "lowcodeImage":
return markRaw(LowcodeImagePage)
break;
case "videoUpAndPlay":
return markRaw(VideoUpAndPlay);
break
case "upload":
return markRaw(UploadPage);
break
case "urllink":
return markRaw(UrlLinkPage);
break
case "baidumap":
return markRaw(BaiDuMapPage);
break;
case "tinymce":
return markRaw(QuillEditor);
break;
case "lowcodeCarsusel":
return markRaw(LowcodeCarsusel);
break;
case "signaturemap":
return markRaw(SignatureMap);
break;
case "lowcodeTransfer":
return markRaw(LowcodeTransfer);
break;
case "colorPicker":
return markRaw(ColorPickerPage);
break;
case "treeSelect":
return markRaw(TreeSelectPage);
break;
case "associatedForms":
return markRaw(AssociatedForms);
break;
case "serialNumber":
return markRaw(SerialNumber);
break;
case "expand-user":
return markRaw(ExpandUser);
break;
case "orgCentent":
return markRaw(OrgCentent);
break;
case "founder":
return markRaw(FounderForm);
break;
case "founderTime":
return markRaw(FounderTime);
break;
case "editTime":
return markRaw(EditTime);
break;
case "owner":
return markRaw(OwnerPage);
break;
case "deptOrg":
return markRaw(DepartmentOrg);
break;
case "pickpost":
return markRaw(PickPost);
break;
case "pickrole":
return markRaw(PickRole);
break;
default:
return `el-${props.data.type}`
}
})
</script>
<template>
<el-form-item
v-bind="data.item"
:prop="tProp || data.name"
:class="config.className"
:label="getLabel(data.item as FormItem)"
:rules="itemRules"
>
<template #label v-if="config.help">
<span :style="getFormItemLableStyle(configStyle)">{{ getLabel(data.item) }}</span>
<Tooltips :content="config.help" />
</template>
<template #label v-else>
<span :style="getFormItemLableStyle(configStyle)" >{{ getLabel(data.item) }}</span>
</template>
<!--关联表单-->
<component
v-if="['associatedForms'].includes(data.type)"
:is="currentComponent"
:data="data"
:formProps = "formProps"
v-bind="control"
:control="control"
:config="config"
:name="control.file || 'file'"
:disabled="judgeIsDisabled(data.name)"
:options="options"
:row-index = "rowIndex"
v-model="value"
@asf-value-changed="asfValueChanged"
/>
<!--单行文本及密码组件-->
<component
v-else
:types="type"
:is="currentComponent"
:data="data"
v-bind="control"
:control="control"
:config="config"
:name="control.file || 'file'"
:disabled="judgeIsDisabled(data.name)"
:options="options"
v-model="value"
/>
</el-form-item>
</template>
<style lang='scss' scoped>
</style>

2
src/components/lowCode/tablePage.vue

@ -203,7 +203,7 @@ function asfValueChanged(val:any){
</el-form-item>
<FormItem
<NewFormItem
v-model="itval[item.name]"
:tProp="`${data.name}.${itIndex}.${item.name}`"
:row-index="itIndex"

2
src/utils/lowCode/index.ts

@ -17,6 +17,7 @@ import SelectDesign from '@/components/lowCode/select.vue'
import FormDesign from '@/components/formTable/index.vue'
import FormItemGroup from '@/components/formTable/formItemGroup.vue'
import FormItem from '@/components/lowCode/formItem.vue'
import NewFormItem from '@/components/lowCode/newFormItem.vue'
import TablePage from '@/components/lowCode/tablePage.vue'
import UserDialog from '@/components/lowCode/assistant/userDialog.vue'
import UserDrawer from '@/components/lowCode/assistant/userDrawer.vue'
@ -26,6 +27,7 @@ export default (app: any) => {
app.component('FormDesign', FormDesign) //自定义表单画布
app.component('FormItemGroup', FormItemGroup) //自定义表单组件聚合
app.component('FormItem', FormItem) //自定义表单组件
app.component('NewFormItem', NewFormItem) //自定义表单组件
app.component('TablePage', TablePage) //自定义表单子表组件
app.component('Tooltip', Tooltip) //自定义表单组件
app.component('FlexBox', FlexBox) //自定义表单组件

4
src/views/formTable/page/cardPage.vue

@ -742,8 +742,8 @@ const delTask = (val:any) => {
@ 1:提交审批;2:重新申请;3:撤回;4:申请修改;5:修改;6:删除
*/
const butIsShow = (val:any,type:number) => {
console.log("判断是否显示--->type",type)
console.log("判断是否显示",val)
// console.log("--->type",type)
// console.log("",val)
switch (type) {
case 7:
if(val.flowIsOpens == 1 && val.taskStatus*1 == 1){

4
src/views/formTable/page/cardPageNew.vue

@ -333,8 +333,8 @@ watch(()=>pageIdAry,(val:any)=>{
@ 1:提交审批;2:重新申请;3:撤回;4:申请修改;5:修改;6:删除
*/
const butIsShow = (val:any,type:number) => {
console.log("判断是否显示--->type",type)
console.log("判断是否显示",val)
// console.log("--->type",type)
// console.log("",val)
switch (type) {
case 7:
if(val.flowIsOpens == 1 && val.taskStatus*1 == 1){

8
src/views/formTable/pageInfo.vue

@ -195,10 +195,10 @@ onMounted(()=>{
const flowFactor = reactive<conditionInfo[]>([]); //
//
const changeKeyVal = (key: any, val: any, type: any, attribute: any) => {
console.log("改变表单值--key--->",key)
console.log("改变表单值--val--->",val,Array.isArray(val))
console.log("改变表单值--type--->",type)
console.log("改变表单值--attribute--->",attribute)
// console.log("--key--->",key)
// console.log("--val--->",val,Array.isArray(val))
// console.log("--type--->",type)
// console.log("--attribute--->",attribute)
let unitsVal = val;
let isUpdateFlowChart = false;

Loading…
Cancel
Save