Browse Source

Merge branch 'qin_v5' into lwx_v9

lwx_v9
超级管理员 1 year ago
parent
commit
aa263fa1fe
  1. 5
      pkg/sumdb/sum.golang.org/latest
  2. 8
      src/api/DesignForm/type.ts
  3. BIN
      src/assets/image/tinymce.png
  4. BIN
      src/assets/image/tinymce1.png
  5. 269
      src/components/DesignForm/aceDrawer.vue
  6. 92
      src/components/DesignForm/aceDrawerPage.vue
  7. 254
      src/components/DesignForm/aceDrawerTree.vue
  8. 88
      src/components/DesignForm/assembly/index.ts
  9. 3
      src/components/DesignForm/dragControlApp.vue
  10. 4
      src/components/DesignForm/formControlAttr.vue
  11. 6
      src/components/DesignForm/formControlAttres.vue
  12. 12
      src/components/DesignForm/formControlPropertiNew.vue
  13. 6
      src/components/DesignForm/formControlProperties.vue
  14. 47
      src/components/DesignForm/public/expand/cascader.vue
  15. 43
      src/components/DesignForm/public/expand/datePicker.vue
  16. 9
      src/components/DesignForm/public/expand/org.vue
  17. 320
      src/components/DesignForm/public/expand/orgCitys.vue
  18. 174
      src/components/DesignForm/public/expand/uploadPage.vue
  19. 106
      src/components/DesignForm/public/expand/uploadPageList.vue
  20. 4
      src/components/DesignForm/public/expand/userDialog.vue
  21. 7
      src/components/DesignForm/public/form/childTable.vue
  22. 2
      src/components/DesignForm/public/form/formGroup.vue
  23. 138
      src/components/DesignForm/public/form/formItem.vue
  24. 2
      src/components/DesignForm/public/headToolsApp.vue
  25. 4
      src/components/DesignForm/tableListPage/index.vue
  26. 1386
      src/components/DesignForm/tableListPage/index_20240919.vue
  27. 2
      src/views/hr/archives/archivescont.vue
  28. 10
      src/views/hr/archives/basicinformation/certificates.vue
  29. 5
      src/views/hr/archives/basicinformation/jobtitle.vue
  30. 2
      src/views/hr/archives/basicinformation/personalityTest.vue
  31. 86
      src/views/hr/archives/downpage/xingGeFengXi.vue
  32. 198
      src/views/hr/archives/index.vue
  33. 65
      src/views/sysworkflow/codepage/page.vue
  34. 40
      src/views/sysworkflow/lowcodepage/appPage/appMenus.vue
  35. 8
      src/views/sysworkflow/lowcodepage/appPage/appPageForm/openAppFormPage.vue
  36. 44
      src/views/sysworkflow/lowcodepage/appPage/appPageForm/pageForm.vue
  37. 36
      src/views/sysworkflow/lowcodepage/appPage/appPageForm/pageList.vue
  38. 3
      src/views/sysworkflow/lowcodepage/appPage/createAppFormPage.vue
  39. 6
      src/views/sysworkflow/lowcodepage/newLowCode/appLayoutEdit/appContainerPage.vue
  40. 2
      src/views/sysworkflow/lowcodepage/pageFlow/appTableFlow.vue
  41. 7
      src/views/sysworkflow/lowcodepage/runApp/runAppForm.vue
  42. 14
      src/widget/lowcodeimage/lowcodeImage.vue
  43. 1
      src/widget/orgcitys/index.vue

5
pkg/sumdb/sum.golang.org/latest

@ -0,0 +1,5 @@
go.sum database tree
29530890
yb6t6HZvxxy4PrtbS+3QjpejyjLeRuqQ2INBTisrK38=
— sum.golang.org Az3grvtY2DM7q7cq6/vo+qjK+WpbUaK7FrxZoFBSvTJ3U6QlFARxFVdrEusYH48zS1BENhlysJZH2iz7XZmGlOf1aAU=

8
src/api/DesignForm/type.ts

@ -220,3 +220,11 @@ export interface optionsInfo {
label: string;
value: string;
}
//定义树形结构体
export interface treeStruct {
value: string
label?: string
children?: treeStruct[]
}

BIN
src/assets/image/tinymce.png

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.1 KiB

After

Width:  |  Height:  |  Size: 23 KiB

BIN
src/assets/image/tinymce1.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.1 KiB

269
src/components/DesignForm/aceDrawer.vue

@ -5,10 +5,12 @@
-->
<script lang='ts' setup>
import { ref, nextTick, watch, onMounted, onUnmounted } from 'vue'
import { aceEdit } from '@/api/DesignForm/utils'
import { aceEdit } from '@/api/DesignForm/utils'
import { treeStruct } from '@/api/DesignForm/type'
const props = withDefaults(
defineProps<{
data?:object
modelValue: boolean
// eslint-disable-next-line vue/require-default-prop
title?: string
@ -17,6 +19,7 @@ const props = withDefaults(
id?: string
// eslint-disable-next-line vue/require-default-prop
codeType?: string
data?: object
}>(),
{
id: 'editJson',
@ -24,13 +27,36 @@ const props = withDefaults(
direction: 'ltr'
}
)
const emits = defineEmits<{
const emits = defineEmits<{
(e: 'beforeClose'): void
(e: 'confirm', content: string): void
(e: 'confirmTree', content: string): void
(e: 'update:modelValue', val: boolean): void
}>()
const editor = ref<any>({})
const visible = ref(false)
const visible = ref(false)
const treeSelectAry = reactive<treeStruct[]>([]) //
const editTitleFormRef = ref(ElForm); //
const editTitleInfoRef = ref(ElForm);
let jibuqi = 0 //
const isTopHeader = ref(false) //
const guodu = ref<treeStruct>({}) //使
const addIsShow = ref(false) //
const treeSelectTitle = reactive<treeStruct>({
value: "1",
label: ""
}) //
const butLoad = ref(false) //
/**
* 表单验证规则
*/
const editTitleRules = reactive({
label: [{ required: true, message: "请输入名称", trigger: "blur" }],
});
watch(
() => props.modelValue,
(val: boolean) => {
@ -52,6 +78,7 @@ const dialogConfirm = () => {
const drawerBeforeClose = () => {
emits('update:modelValue', false)
emits('beforeClose')
treeSelectAry=[]
}
onMounted(() => {})
onUnmounted(() => {
@ -60,6 +87,173 @@ onUnmounted(() => {
editor.value.container.remove()
}
})
/**
@ 作者: 秦东
@ 时间: 2024-09-27 16:03:26
@ 功能: 打开添加弹窗
*/
const pickAdd = (val:treeStruct) => {
guodu.value = val
isTopHeader.value = false
addIsShow.value = true
}
/**
@ 作者: 秦东
@ 时间: 2024-09-27 16:06:41
@ 功能: 关闭弹窗
*/
const pickAddClose = () => {
guodu.value = {}
treeSelectTitle.label = ""
addIsShow.value = false
butLoad.value = false
editTitleFormRef.value.resetFields();
}
/**
@ 作者: 秦东
@ 时间: 2024-09-27 16:09:53
@ 功能: 添加顶级分类
*/
const addTopClass = () => {
isTopHeader.value = true
addIsShow.value = true
}
/**
@ 作者: 秦东
@ 时间: 2024-09-27 16:10:27
@ 功能: 确定添加分类
*/
const pickIsTrue = () => {
butLoad.value = true
editTitleFormRef.value.validate((isValid: boolean) => {
if(isValid){
jibuqi++
if(isTopHeader.value){
treeSelectAry.push({
value: jibuqi,
label: treeSelectTitle.label,
children: []
})
}else{
if(guodu.value.children){
guodu.value.children.push({
value: jibuqi,
label: treeSelectTitle.label,
children: []
})
}else{
guodu.value.children=[
{
value: jibuqi,
label: treeSelectTitle.label,
children: []
}
]
}
}
pickAddClose()
}else{
butLoad.value = false
}
})
}
/**
@ 作者: 秦东
@ 时间: 2024-09-27 08:38:35
@ 功能: 回填主表值
*/
const dialogConfirmTree = () => {
// let drawer = ({
// visible: false,
// type: '',
// title: '',
// codeType: '',
// direction: undefined, //rtl / ltr
// callback: ''
// })
// let opt = new Array
// treeSelectAry.forEach((item:treeStruct) => {
// opt.push({
// value: item.value,
// label: item.label,
// children: item.children
// })
// })
// emits('confirm', treeSelectAry)
emits('confirmTree', treeSelectAry)
drawerBeforeClose()
}
/**
@ 作者: 秦东
@ 时间: 2024-09-27 13:51:31
@ 功能: 删除指定节点数据
*/
const pickDel = (val:treeStruct) => {
console.log("要删除得节点-->",val.value)
delDiGui(treeSelectAry,val)
console.log("删除指定节点数据---结果-->",treeSelectAry)
}
/**
@ 作者: 秦东
@ 时间: 2024-09-27 14:13:23
@ 功能: 执行递归删除
*/
const delDiGui = (tree: treeStruct[],val:treeStruct) => {
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) {
return delDiGui(node.children, val);
}
}
}
const edisIsShow = ref(false)
const butLoadEdit = ref(false)
/**
@ 作者: 秦东
@ 时间: 2024-09-29 13:29:17
@ 功能: 编辑级联舒体
*/
const pickEdis = (val:treeStruct) => {
guodu.value = val
treeSelectTitle.label = val.label
edisIsShow.value = true
}
/**
@ 作者: 秦东
@ 时间: 2024-09-29 13:33:51
@ 功能: 关闭编辑窗体
*/
const pickEditClose = () => {
guodu.value = {}
treeSelectTitle.label = ""
edisIsShow.value = false
butLoadEdit.value = false
editTitleInfoRef.value.resetFields();
}
/**
@ 作者: 秦东
@ 时间: 2024-09-29 13:36:30
@ 功能: 确定修改
*/
const pickEditIsTrue = () => {
butLoadEdit.value = true
editTitleInfoRef.value.validate((isValid: boolean) => {
if(isValid){
guodu.value.label = treeSelectTitle.label
pickEditClose()
}else{
butLoad.value = false
}
})
}
</script>
<template>
<el-drawer
@ -74,12 +268,77 @@ onUnmounted(() => {
<template #header>
<div v-html="title"></div>
</template>
<div v-if="visible" :id="id"></div>
<div v-if="['cascader', 'treeSelect'].includes(props.data.type)">
<el-table
:data="treeSelectAry"
row-key="value"
default-expand-all
>
<el-table-column prop="label" label="名称" />
<el-table-column label="操作" width="200" align="center">
<template #header>
<el-button type="success" @click="addTopClass">添加顶级分类</el-button>
</template>
<template #default="scope">
<el-button-group>
<el-button text type="success" @click="pickAdd(scope.row)">添加</el-button>
<el-button text type="warning" @click="pickEdis(scope.row)">修改</el-button>
<el-button text type="danger" @click="pickDel(scope.row)">删除</el-button>
</el-button-group>
</template>
</el-table-column>
</el-table>
</div>
<div v-else :id="id"></div>
<div class="dialog-footer">
<el-button type="primary" size="small" @click="dialogConfirm">
<el-button v-if="['cascader', 'treeSelect'].includes(props.data.type)" type="primary" size="small" @click="dialogConfirmTree">
确定
</el-button>
<el-button v-else type="primary" size="small" @click="dialogConfirm">
确定
</el-button>
</div>
<el-dialog
v-model="addIsShow"
title="编辑"
width="500"
:before-close="pickAddClose"
>
<el-form ref="editTitleFormRef" :rules="editTitleRules" :model="treeSelectTitle" label-width="auto" style="max-width: 600px">
<el-form-item label="名称:" prop="label">
<el-input v-model="treeSelectTitle.label" />
</el-form-item>
</el-form>
<template #footer>
<div class="dialog-footer">
<el-button @click="pickAddClose">取消</el-button>
<el-button v-loading="butLoad" type="primary" @click="pickIsTrue">确定</el-button>
</div>
</template>
</el-dialog>
<el-dialog
v-model="edisIsShow"
title="编辑"
width="500"
:before-close="pickEditClose"
>
<el-form ref="editTitleInfoRef" :rules="editTitleRules" :model="treeSelectTitle" label-width="auto" style="max-width: 600px">
<el-form-item label="名称:" prop="label">
<el-input v-model="treeSelectTitle.label" />
</el-form-item>
</el-form>
<template #footer>
<div class="dialog-footer">
<el-button @click="pickEditClose">取消</el-button>
<el-button v-loading="butLoadEdit" type="primary" @click="pickEditIsTrue">确定</el-button>
</div>
</template>
</el-dialog>
</el-drawer>
</template>
<style lang='scss' scoped>

92
src/components/DesignForm/aceDrawerPage.vue

@ -0,0 +1,92 @@
<!--
@ 作者: 秦东
@ 时间: 2023-07-19 08:39:34
@ 备注: 抽屉
-->
<script lang='ts' setup>
import { ref, nextTick, watch, onMounted, onUnmounted } from 'vue'
import { aceEdit } from '@/api/DesignForm/utils'
const props = withDefaults(
defineProps<{
data?:object
modelValue: boolean
// eslint-disable-next-line vue/require-default-prop
title?: string
direction?: 'rtl' | 'ltr'
content: string
id?: string
// eslint-disable-next-line vue/require-default-prop
codeType?: string
}>(),
{
id: 'editJson',
content: '',
direction: 'ltr'
}
)
const emits = defineEmits<{
(e: 'beforeClose'): void
(e: 'confirm', content: string): void
(e: 'update:modelValue', val: boolean): void
}>()
const editor = ref<any>({})
const visible = ref(false)
watch(
() => props.modelValue,
(val: boolean) => {
visible.value = val
if (val) {
initEditor()
}
}
)
const initEditor = () => {
nextTick(() => {
editor.value = aceEdit(props.content, props.id, props.codeType)
})
}
const dialogConfirm = () => {
const editVal = editor.value.getValue()
emits('confirm', editVal)
}
const drawerBeforeClose = () => {
emits('update:modelValue', false)
emits('beforeClose')
}
onMounted(() => {})
onUnmounted(() => {
if (Object.keys(editor.value).length !== 0) {
editor.value.destroy()
editor.value.container.remove()
}
})
</script>
<template>
<el-drawer
v-model="visible"
size="60%"
:title="title"
:direction="direction as any"
class="ace-dialog"
:append-to-body="true"
:before-close="drawerBeforeClose"
>
<template #header>
<div v-html="title"></div>
</template>
<div>{{props.data}}</div>
<div v-if="visible" :id="id"></div>
<div class="dialog-footer">
<el-button type="primary" size="small" @click="dialogConfirm">
确定
</el-button>
</div>
</el-drawer>
</template>
<style lang='scss' scoped>
#editJson, #editJsonCopy {
width: 100%;
height: calc(100vh - 90px);
}
</style>

254
src/components/DesignForm/aceDrawerTree.vue

@ -0,0 +1,254 @@
<!--
@ 作者: 秦东
@ 时间: 2023-07-19 08:39:34
@ 备注: 抽屉
-->
<script lang='ts' setup>
import { ref, nextTick, watch, onMounted, onUnmounted } from 'vue'
import { aceEdit } from '@/api/DesignForm/utils'
const props = withDefaults(
defineProps<{
modelValue: boolean
// eslint-disable-next-line vue/require-default-prop
title?: string
direction?: 'rtl' | 'ltr'
content: string
id?: string
// eslint-disable-next-line vue/require-default-prop
codeType?: string
data?: object
}>(),
{
id: 'editJson',
content: '',
direction: 'ltr'
}
)
interface treeStruct {
value: string
label?: string
children?: treeStruct[]
}
const emits = defineEmits<{
(e: 'beforeClose'): void
(e: 'confirm', content: string): void
(e: 'update:modelValue', val: boolean): void
}>()
const editor = ref<any>({})
const visible = ref(false)
const treeSelectAry = reactive<treeStruct[]>([])
const editTitleFormRef = ref(ElForm); //
watch(
() => props.modelValue,
(val: boolean) => {
visible.value = val
if (val) {
initEditor()
}
}
)
const initEditor = () => {
nextTick(() => {
editor.value = aceEdit(props.content, props.id, props.codeType)
})
}
const dialogConfirm = () => {
const editVal = editor.value.getValue()
emits('confirm', editVal)
}
const drawerBeforeClose = () => {
emits('update:modelValue', false)
emits('beforeClose')
}
onMounted(() => {})
onUnmounted(() => {
if (Object.keys(editor.value).length !== 0) {
editor.value.destroy()
editor.value.container.remove()
}
})
let jibuqi = 0
const isTopHeader = ref(false)
const guodu = ref<treeStruct>({})
const addIsShow = ref(false)
const pickAdd = (val:treeStruct) => {
guodu.value = val
isTopHeader.value = false
addIsShow.value = true
}
const pickAddClose = () => {
guodu.value = {}
treeSelectTitle.label = ""
addIsShow.value = false
butLoad.value = false
editTitleFormRef.value.resetFields();
}
//
const addTopClass = () => {
isTopHeader.value = true
addIsShow.value = true
}
//
const treeSelectTitle = reactive<treeStruct>({
value: "1",
label: ""
})
const butLoad = ref(false)
const pickIsTrue = () => {
butLoad.value = true
editTitleFormRef.value.validate((isValid: boolean) => {
if(isValid){
jibuqi++
if(isTopHeader.value){
treeSelectAry.push({
value: jibuqi,
label: treeSelectTitle.label,
children: []
})
}else{
if(guodu.value.children){
guodu.value.children.push({
value: jibuqi,
label: treeSelectTitle.label,
children: []
})
}else{
guodu.value.children=[
{
value: jibuqi,
label: treeSelectTitle.label,
children: []
}
]
}
}
pickAddClose()
}else{
butLoad.value = false
}
})
}
/**
@ 作者: 秦东
@ 时间: 2024-09-27 08:38:35
@ 功能: 设定值
*/
const dialogConfirmTree = () => {
emits('confirm', treeSelectAry)
drawerBeforeClose()
}
/**
* 表单验证规则
*/
const editTitleRules = reactive({
label: [{ required: true, message: "请输入名称", trigger: "blur" }],
});
/**
@ 作者: 秦东
@ 时间: 2024-09-27 13:51:31
@ 功能: 删除指定节点数据
*/
const pickDel = (val:treeStruct) => {
console.log("要删除得节点-->",val.value)
delDiGui(treeSelectAry,val)
console.log("删除指定节点数据---结果-->",treeSelectAry)
}
/**
@ 作者: 秦东
@ 时间: 2024-09-27 14:13:23
@ 功能: 执行递归删除
*/
const delDiGui = (tree: treeStruct[],val:treeStruct) => {
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) {
return delDiGui(node.children, val);
}
}
}
</script>
<template>
<el-drawer
v-model="visible"
size="60%"
:title="title"
:direction="direction as any"
class="ace-dialog"
:append-to-body="true"
:before-close="drawerBeforeClose"
>
<template #header>
<div v-html="title"></div>
</template>
<div v-if="['cascader', 'treeSelect'].includes(props.data.type)">{{props.data}}
<el-table
:data="treeSelectAry"
row-key="value"
default-expand-all
>
<el-table-column prop="label" label="名称" />
<el-table-column label="操作" width="200" align="center">
<template #header>
<el-button type="success" @click="addTopClass">添加顶级分类</el-button>
</template>
<template #default="scope">
<el-button-group>
<el-button text type="success" @click="pickAdd(scope.row)">添加</el-button>
<el-button text type="warning" @click="pick(scope.row)">修改</el-button>
<el-button text type="danger" @click="pickDel(scope.row)">删除</el-button>
</el-button-group>
</template>
</el-table-column>
</el-table>
</div>
<div v-else :id="id"></div>
<div class="dialog-footer">
<el-button v-if="['cascader', 'treeSelect'].includes(props.data.type)" type="primary" size="small" @click="dialogConfirmTree">
确定
</el-button>
<el-button v-else type="primary" size="small" @click="dialogConfirm">
确定
</el-button>
</div>
<el-dialog
v-model="addIsShow"
title="编辑"
width="500"
:before-close="pickAddClose"
>
<el-form ref="editTitleFormRef" :rules="editTitleRules" :model="treeSelectTitle" label-width="auto" style="max-width: 600px">
<el-form-item label="名称:" prop="label">
<el-input v-model="treeSelectTitle.label" />
</el-form-item>
</el-form>
<template #footer>
<div class="dialog-footer">
<el-button @click="pickAddClose">取消</el-button>
<el-button v-loading="butLoad" type="primary" @click="pickIsTrue">确定</el-button>
</div>
</template>
</el-dialog>
</el-drawer>
</template>
<style lang='scss' scoped>
#editJson, #editJsonCopy {
width: 100%;
height: calc(100vh - 90px);
}
</style>

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

@ -32,7 +32,7 @@ export default [
config: {},
styles: {
divStyle: {
marginBot: "10"
marginBot: "15"
},
labelStyle: {
paddingLeft: "7",
@ -61,7 +61,7 @@ export default [
selectvalue: "default",
styles: {
divStyle: {
marginBot: "10"
marginBot: "15"
},
labelStyle: {
paddingLeft: "7",
@ -82,7 +82,7 @@ export default [
config: {}, // 其他配置信息
styles: {
divStyle: {
marginBot: "10"
marginBot: "15"
},
labelStyle: {
paddingLeft: "7",
@ -103,7 +103,7 @@ export default [
config: {},
styles: {
divStyle: {
marginBot: "10"
marginBot: "15"
},
labelStyle: {
paddingLeft: "7",
@ -127,7 +127,7 @@ export default [
config: config,
styles: {
divStyle: {
marginBot: "10"
marginBot: "15"
},
labelStyle: {
paddingLeft: "7",
@ -151,7 +151,7 @@ export default [
config: config,
styles: {
divStyle: {
marginBot: "10"
marginBot: "15"
},
labelStyle: {
paddingLeft: "7",
@ -176,7 +176,7 @@ export default [
config: config,
styles: {
divStyle: {
marginBot: "10"
marginBot: "15"
},
labelStyle: {
paddingLeft: "7",
@ -197,7 +197,7 @@ export default [
config: config,
styles: {
divStyle: {
marginBot: "10"
marginBot: "15"
},
labelStyle: {
paddingLeft: "7",
@ -218,7 +218,7 @@ export default [
config: {},
styles: {
divStyle: {
marginBot: "10"
marginBot: "15"
},
labelStyle: {
paddingLeft: "7",
@ -238,7 +238,7 @@ export default [
config: {},
styles: {
divStyle: {
marginBot: "10"
marginBot: "15"
},
labelStyle: {
paddingLeft: "7",
@ -258,7 +258,7 @@ export default [
config: {},
styles: {
divStyle: {
marginBot: "10"
marginBot: "15"
},
labelStyle: {
paddingLeft: "7",
@ -267,7 +267,7 @@ export default [
}
},
{
type: 'organization',
type: 'organization',
label: '联系地址',
unitName: '联系地址',
icon: 'marker',
@ -277,7 +277,7 @@ export default [
config: {},
styles: {
divStyle: {
marginBot: "10"
marginBot: "15"
},
labelStyle: {
paddingLeft: "7",
@ -311,7 +311,7 @@ export default [
config: {},
styles: {
divStyle: {
marginBot: "10"
marginBot: "15"
},
labelStyle: {
paddingLeft: "7",
@ -332,7 +332,7 @@ export default [
config: {},
styles: {
divStyle: {
marginBot: "10"
marginBot: "15"
},
labelStyle: {
paddingLeft: "7",
@ -352,7 +352,7 @@ export default [
config: {},
styles: {
divStyle: {
marginBot: "10"
marginBot: "15"
},
labelStyle: {
paddingLeft: "7",
@ -372,7 +372,7 @@ export default [
// config: {},
// styles: {
// divStyle: {
// marginBot: "10"
// marginBot: "15"
// },
// labelStyle: {
// paddingLeft: "7",
@ -415,7 +415,7 @@ export default [
config: {},
styles: {
divStyle: {
marginBot: "10"
marginBot: "15"
},
labelStyle: {
paddingLeft: "7",
@ -435,7 +435,7 @@ export default [
item: {}, // label标题相关
styles: {
divStyle: {
marginBot: "10"
marginBot: "15"
},
labelStyle: {
paddingLeft: "7",
@ -457,7 +457,7 @@ export default [
},
styles: {
divStyle: {
marginBot: "10"
marginBot: "15"
},
labelStyle: {
paddingLeft: "7",
@ -476,7 +476,7 @@ export default [
list: [],
styles: {
divStyle: {
marginBot: "10"
marginBot: "15"
},
labelStyle: {
paddingLeft: "7",
@ -501,7 +501,7 @@ export default [
config: {},
styles: {
divStyle: {
marginBot: "10"
marginBot: "15"
},
labelStyle: {
paddingLeft: "7",
@ -520,7 +520,7 @@ export default [
config: {},
styles: {
divStyle: {
marginBot: "10"
marginBot: "15"
},
labelStyle: {
paddingLeft: "7",
@ -601,7 +601,7 @@ export default [
config: {},
styles: {
divStyle: {
marginBot: "10"
marginBot: "15"
},
labelStyle: {
paddingLeft: "7",
@ -622,7 +622,7 @@ export default [
config: {},
styles: {
divStyle: {
marginBot: "10"
marginBot: "15"
},
labelStyle: {
paddingLeft: "7",
@ -642,7 +642,7 @@ export default [
config: {},
styles: {
divStyle: {
marginBot: "10"
marginBot: "15"
},
labelStyle: {
paddingLeft: "7",
@ -666,7 +666,7 @@ export default [
},
styles: {
divStyle: {
marginBot: "10"
marginBot: "15"
},
labelStyle: {
paddingLeft: "7",
@ -685,7 +685,7 @@ export default [
config: {},
styles: {
divStyle: {
marginBot: "10"
marginBot: "15"
},
labelStyle: {
paddingLeft: "7",
@ -705,7 +705,7 @@ export default [
config: {},
styles: {
divStyle: {
marginBot: "10"
marginBot: "15"
},
labelStyle: {
paddingLeft: "7",
@ -725,7 +725,7 @@ export default [
config: {},
styles: {
divStyle: {
marginBot: "10"
marginBot: "15"
},
labelStyle: {
paddingLeft: "7",
@ -745,7 +745,7 @@ export default [
config: {},
styles: {
divStyle: {
marginBot: "10"
marginBot: "15"
},
labelStyle: {
paddingLeft: "7",
@ -778,7 +778,7 @@ export default [
config: {},
styles: {
divStyle: {
marginBot: "10"
marginBot: "15"
},
labelStyle: {
paddingLeft: "7",
@ -798,7 +798,7 @@ export default [
config: {},
styles: {
divStyle: {
marginBot: "10"
marginBot: "15"
},
labelStyle: {
paddingLeft: "7",
@ -849,7 +849,7 @@ export default [
config: {},
styles: {
divStyle: {
marginBot: "10"
marginBot: "15"
},
labelStyle: {
paddingLeft: "7",
@ -873,7 +873,7 @@ export default [
},
styles: {
divStyle: {
marginBot: "10"
marginBot: "15"
},
labelStyle: {
paddingLeft: "7",
@ -953,7 +953,7 @@ export default [
config: {},
styles: {
divStyle: {
marginBot: "10"
marginBot: "15"
},
labelStyle: {
paddingLeft: "7",
@ -990,7 +990,7 @@ export default [
},
styles: {
divStyle: {
marginBot: "10"
marginBot: "15"
},
labelStyle: {
paddingLeft: "7",
@ -1011,7 +1011,7 @@ export default [
config: {}, // 其他配置信息
styles: {
divStyle: {
marginBot: "10"
marginBot: "15"
},
labelStyle: {
paddingLeft: "7",
@ -1030,7 +1030,7 @@ export default [
config: {},
styles: {
divStyle: {
marginBot: "10"
marginBot: "15"
},
labelStyle: {
paddingLeft: "7",
@ -1050,7 +1050,7 @@ export default [
config: {},
styles: {
divStyle: {
marginBot: "10"
marginBot: "15"
},
labelStyle: {
paddingLeft: "7",
@ -1070,7 +1070,7 @@ export default [
config: {},
styles: {
divStyle: {
marginBot: "10"
marginBot: "15"
},
labelStyle: {
paddingLeft: "7",
@ -1090,7 +1090,7 @@ export default [
config: {},
styles: {
divStyle: {
marginBot: "10"
marginBot: "15"
},
labelStyle: {
paddingLeft: "7",
@ -1110,7 +1110,7 @@ export default [
config: {},
styles: {
divStyle: {
marginBot: "10"
marginBot: "15"
},
labelStyle: {
paddingLeft: "7",
@ -1130,7 +1130,7 @@ export default [
config: {},
styles: {
divStyle: {
marginBot: "10"
marginBot: "15"
},
labelStyle: {
paddingLeft: "7",

3
src/components/DesignForm/dragControlApp.vue

@ -157,8 +157,9 @@ const clone = (origin: any) => {
}
.fontIcon{
height: 35px;
i{
padding: 4px 0px 0 0px;
padding: 3px 0px 0 0px;
}
}
</style>

4
src/components/DesignForm/formControlAttr.vue

@ -880,7 +880,7 @@
isNum: true
},
{
label: 'type',
label: '显示类型',
value: control.type,
path: 'control.type',
vShow: ['datePicker'],
@ -898,7 +898,7 @@
}
},
{
label: 'format',
label: '时间类型',
value: control.format,
path: 'control.format',
vShow: ['datePicker', 'timePicker'],

6
src/components/DesignForm/formControlAttres.vue

@ -592,7 +592,7 @@ const attrList = computed(() => {
vShow: ['upload']
},
{
label: 'direction',
label: '分割线方向',
type: 'select',
dict: { horizontal: 'horizontal', vertical: 'vertical' },
placeholder: '分割线方向,默认horizontal',
@ -601,14 +601,14 @@ const attrList = computed(() => {
vShow: ['divider']
},
{
label: 'border-style',
label: '分隔符样式',
placeholder: '分隔符样式,默认solid',
value: control.borderStyle,
path: 'control.borderStyle',
vShow: ['divider']
},
{
label: 'content-position',
label: '文字方位',
type: 'select',
dict: { left: 'left', right: 'right', center: 'center' },
value: control.contentPosition,

12
src/components/DesignForm/formControlPropertiNew.vue

@ -908,7 +908,7 @@ const attrList = computed(() => {
vShow: ['upload']
},
{
label: 'direction',
label: '分割线方向',
type: 'select',
dict: { horizontal: 'horizontal', vertical: 'vertical' },
placeholder: '分割线方向,默认horizontal',
@ -917,14 +917,14 @@ const attrList = computed(() => {
vShow: ['divider']
},
{
label: 'border-style',
label: '分隔符样式',
placeholder: '分隔符样式,默认solid',
value: control.borderStyle,
path: 'control.borderStyle',
vShow: ['divider']
},
{
label: 'content-position',
label: '文字方位',
type: 'select',
dict: { left: 'left', right: 'right', center: 'center' },
value: control.contentPosition,
@ -956,7 +956,7 @@ const attrList = computed(() => {
isNum: true
},
{
label: 'type',
label: '显示类型',
value: control.type,
path: 'control.type',
vShow: ['datePicker'],
@ -974,7 +974,7 @@ const attrList = computed(() => {
}
},
{
label: 'format',
label: '时间格式',
value: control.format,
path: 'control.format',
vShow: ['datePicker', 'timePicker'],
@ -1840,7 +1840,7 @@ const currentAsfChangeCount = ref(0)
}
}
// console.log(resDataForGlxxszExceptself1)
if(getAssociatedFormsCurrentFieldTreeData.treeAttrs!=undefined){
if(getAssociatedFormsCurrentFieldTreeData && getAssociatedFormsCurrentFieldTreeData.treeAttrs && getAssociatedFormsCurrentFieldTreeData.treeAttrs!=undefined){
associatedFormsCurrentFormFieldTreeForGlxxszExceptSelf.value = [{
id: 'rootid_'+getAssociatedFormsCurrentFieldTreeData.label,
//label: '',

6
src/components/DesignForm/formControlProperties.vue

@ -915,7 +915,7 @@ const attrList = computed(()=>{
vShow: ['upload']
},
{
label: 'direction',
label: '分割线方向',
type: 'select',
dict: { horizontal: 'horizontal', vertical: 'vertical' },
placeholder: '分割线方向,默认horizontal',
@ -924,14 +924,14 @@ const attrList = computed(()=>{
vShow: ['divider']
},
{
label: 'border-style',
label: '分隔符样式',
placeholder: '分隔符样式,默认solid',
value: control.borderStyle,
path: 'control.borderStyle',
vShow: ['divider']
},
{
label: 'content-position',
label: '文字方位',
type: 'select',
dict: { left: 'left', right: 'right', center: 'center' },
value: control.contentPosition,

47
src/components/DesignForm/public/expand/cascader.vue

@ -0,0 +1,47 @@
<!--
@ 作者: 秦东
@ 时间: 2024-09-29 13:46:55
@ 备注: 级联器
-->
<script lang='ts' setup>
const props = withDefaults(
defineProps<{
modelValue?: string
disabled?: boolean
action?: string
name?: string
fileList?: Object
control?: Object
config?: Object
data?: Object
options?: Object
}>(),
{}
)
const emits = defineEmits<{
(e: 'update:modelValue', value: string): void
}>()
const value = computed({
get: () => {
console.log("图片上传处理-112->",props.modelValue)
return props.modelValue
},
set: (newVal: any) => {
emits('update:modelValue', newVal)
return newVal
},
});
const handleChange = () => {
}
</script>
<template>
<el-cascader
v-model="value"
:options="props.options"
@change="handleChange"
/>
</template>
<style lang='scss' scoped>
</style>

43
src/components/DesignForm/public/expand/datePicker.vue

@ -0,0 +1,43 @@
<!--
@ 作者: 秦东
@ 时间: 2024-09-25 15:01:57
@ 备注: 时间控件
-->
<script lang='ts' setup>
const props = withDefaults(
defineProps<{
modelValue?: string
disabled?: boolean
data?:any
}>(),
{}
)
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-date-picker
align="left"
v-model="value"
:type="props.data.control.type"
range-separator="-"
start-placeholder="开始日期"
end-placeholder="结束日期"
:teleported="true"
:placeholder="props.data.control.placeholder"
:value-format="props.data.valueFormat"
:format="props.data.control.format"
/>
</template>
<style lang='scss' scoped>
</style>

9
src/components/DesignForm/public/expand/org.vue

@ -19,7 +19,12 @@ const emits = defineEmits<{
}>()
const value = computed({
get: () => {
return props.modelValue*1
if (props.modelValue != "" && props.modelValue != undefined){
return props.modelValue*1
}else{
return props.modelValue
}
},
set: (newVal: any) => {
emits('update:modelValue', newVal)
@ -48,7 +53,7 @@ const orgTreeProps ={
function haveOrgTreeInfo(){
orgTreeLoading.value = true;
getOrgTreeList({})
getOrgTreeList({"orgid": 309})
.then(({ data })=>{
orgTreeList.value = data
}).finally(()=>{orgTreeLoading.value = false;})

320
src/components/DesignForm/public/expand/orgCitys.vue

@ -0,0 +1,320 @@
<!--
@ 作者: 秦东
@ 时间: 2024-09-25 09:18:33
@ 备注: 联系地址
-->
<script lang='ts' setup>
import { AnalysisCss,AnalysisInputCss } from '@/components/DesignForm/public/form/calculate/cssInfo.ts'
import {
constControlChange,
constFormProps,
} from '@/api/DesignForm/utils'
import validate from '@/api/DesignForm/validate'
import { FormItem, FormList } from '@/api/DesignForm/types'
import Tooltips from '@/components/DesignForm/tooltip.vue'
import areaObj from '@/widget/orgcitys/pca.json'
const props = withDefaults(
defineProps<{
data: FormList
tablekey: any
numrun?: number
modelValue?: any //
tProp?: string // form-itemprop
}>(),
{}
)
const emits = defineEmits<{
(e: 'update:modelValue', numVal: any): void
}>()
const formProps = inject(constFormProps, {}) as any
const type = computed(() => {
return formProps.value.type
})
const control = computed(() => {
return props.data.control || {}
// return props.data
})
const config = computed(() => {
return props.data.config || {}
})
const changeEvent = inject(constControlChange, '') as any
const value = computed({
get: () => {
return props.modelValue
},
set: (newVal: any) => {
emits('update:modelValue', newVal)
},
});
//
const editDisabled = computed(() => {
if (type.value === 3) {
return true //
}
if (type.value === 1 && config.value.addDisabled) {
return true
}
if (type.value === 2 && config.value.editDisabled) {
return true //
}
return control.value.disabled
})
const updateModel = (val: any) => {
let controlAttribute = ""
if(props.data.control){
if(props.data.control.type){
controlAttribute = props.data.control.type
}
}
// changeEvent &&
// changeEvent({
// key: props.data.name,
// value: val,
// data: props.data,
// tProp: props.tProp,
// type: props.data.type,
// attribute: controlAttribute
// })
}
const getLabel = (ele: FormItem) => {
const showColon = formProps.value.showColon ? ':' : ''
if (ele) {
return ele.showLabel ? '' : ele.label + showColon
} else {
return ''
}
}
// item
const itemRules = computed(() => {
let temp
const itemR: any = props.data.item?.rules || []
const customR = formatCustomRules()
// undefined
if (itemR?.length || customR?.length) {
temp = [...customR, ...itemR]
}
return temp
})
// customRulesrules
const formatCustomRules = () => {
const rulesReg: any = {}
validate &&
validate.forEach(item => {
rulesReg[item.type] = item.regExp
})
// 使provide
const temp: any = []
props.data.customRules?.forEach((item: any) => {
if (!item.message && item.type !== 'methods') {
return //
}
let obj = {}
if (item.type === 'required') {
obj = { required: true }
} else if (item.type === 'rules') {
//
obj = { pattern: item.rules }
} else if (item.type === 'methods') {
//
const methods: any = item.methods
if (methods) {
obj = { validator: inject(methods, {}) }
}
} else if (item.type) {
obj = { pattern: rulesReg[item.type as string] }
}
// push
let message: any = { message: item.message }
if (!item.message) {
// 使validatormessage使 callback(new Error('x'));
message = {}
}
temp.push(
Object.assign(
{
trigger: item.trigger || 'blur'
},
obj,
message
)
)
})
return temp
}
const addressBox = ref(false)
//
const provinceArr = Object.keys(areaObj)
const province = ref(provinceArr[0])
//
const cityArr = computed(() => {
return Object.keys(areaObj[province.value])
})
const city = ref(cityArr.value[0])
//
watch(province, (newVal) => {
city.value = Object.keys(areaObj[newVal])[0];
if(value.value != "" && value.value != null){
let ads = value.value.split(" - ")
if(ads.length >=2){
city.value = ads[1]
}else{
city.value = Object.keys(areaObj[newVal])[0];
}
}else{
city.value = Object.keys(areaObj[newVal])[0];
}
});
//
const areaArr = computed(() => {
return areaObj[province.value][city.value]
})
const area = ref(areaArr.value[0])
//
watch(city, (newVal) => {
if(value.value != "" && value.value != null){
let ads = value.value.split(" - ")
if(ads.length >=3){
area.value = ads[2]
}else{
area.value = areaObj[province.value][newVal][0]
}
}else{
area.value = areaObj[province.value][newVal][0]
}
})
const fullAddress = ref<string>("")
//
const openAddress = () =>{
if(value.value != "" && value.value != null){
let ads = value.value.split(" - ")
// console.log(ads)
if(ads.length >= 4){
province.value = ads[0]
fullAddress.value = ads[3]
}else if(ads.length >0){
province.value = ads[0]
}
}else{
province.value = provinceArr[0]
city.value = cityArr.value[0]
area.value = areaArr.value[0]
fullAddress.value = ""
}
addressBox.value=true
}
//
const addressBoxClose = () => {
addressBox.value=false
initAddressData()
}
//
const submitAddress = () => {
// console.log(province.value,city.value,area.value,fullAddress.value)
if(province.value == "" || province.value == null){
ElMessage.error('未选择省份!')
return
}
if(city.value == "" || city.value == null){
ElMessage.error('未选择市/区!')
return
}
if(area.value == "" || area.value == null){
ElMessage.error('未选择县/市!')
return
}
if(fullAddress.value == "" || fullAddress.value == null){
ElMessage.error('未填写详细信息!')
return
}
value.value = province.value + " - " + city.value + " - " + area.value + " - " + fullAddress.value
console.log(province.value + " - " + city.value + " - " + area.value + " - " + fullAddress.value)
console.log(value.value)
addressBoxClose()
}
const initAddressData = () =>{
province.value = provinceArr[0]
fullAddress.value = ""
}
const configStyle = computed(() => {
return props.data.styles || {}
})
const getFormItemInputStyle = (ele: any,sty:number) => {
if(ele?.inputStyle){
//console.log("4",AnalysisInputCss(ele?.inputStyle,sty))
return AnalysisInputCss(ele?.inputStyle,sty)
}
}
</script>
<template>
<div v-if="type === 4" 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"
title="填写地址"
width="600px"
:append-to-body="true"
:draggable="true"
:before-close="addressBoxClose"
>
<el-row>
<el-col :span="3">所在地区</el-col>
<el-col :span="21">
<el-row :gutter="20">
<el-col :span="8">
<el-select v-model="province" class="m-2" placeholder="省">
<el-option v-for="item in provinceArr" :key="item" :label="item" :value="item" />
</el-select>
</el-col>
<el-col :span="8">
<el-select v-model="city" class="m-2" placeholder="市">
<el-option v-for="item in cityArr" :key="item" :label="item" :value="item" />
</el-select>
</el-col>
<el-col :span="8">
<el-select v-model="area" class="m-2" placeholder="区/县">
<el-option v-for="item in areaArr" :key="item" :label="item" :value="item" />
</el-select>
</el-col>
</el-row>
</el-col>
</el-row>
<el-row>
<el-col :span="3">详细地址</el-col>
<el-col :span="21">
<el-input
v-model="fullAddress"
:autosize="{ minRows: 2, maxRows: 4 }"
type="textarea"
placeholder="请输入详细地址"
style="width:100%"
/>
</el-col>
</el-row>
<template #footer>
<span class="dialog-footer">
<el-button @click="addressBoxClose">取消</el-button>
<el-button type="primary" @click="submitAddress">确定</el-button>
</span>
</template>
</el-dialog>
</template>
<style lang='scss' scoped>
</style>

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

@ -0,0 +1,174 @@
<!--
@ 作者: 秦东
@ 时间: 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'
const props = withDefaults(
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
}>()
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
},
});
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 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 || {}
})
//
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 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
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
// })
}
//
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)
}
</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>
</template>
<style lang='scss' scoped>
</style>

106
src/components/DesignForm/public/expand/uploadPageList.vue

@ -0,0 +1,106 @@
<!--
@ 作者: 秦东
@ 时间: 2024-09-17 14:57:49
@ 备注: 解析上传文件问题
-->
<script lang='ts' setup>
import { AnalysisCss,AnalysisInputCss } from '@/components/DesignForm/public/form/calculate/cssInfo'
const props = defineProps({
imgList:{
type:String,
default:""
},
data:{
type:Object,
default(){
return {}
}
},
control:{
type:Object,
default(){
return {}
}
}
})
const imgStr = ref<String>(props.imgList)
//css
/**
@ 作者: 秦东
@ 时间: 2024-09-17 15:02:50
@ 功能: 文件列表
*/
// const imgAry = () => {
// console.log("====>",imgStr.value)
// if(imgStr.value != ""){
// // let zj = imgStr.value
// // let img = zj.Split(",");
// let arr = imgStr.value.match(/[^,]+/g);
// console.log("",arr)
// return arr
// }else{
// return []
// }
// }
const imgAry =computed({
get: () => {
if(props.imgList != "" && props.imgList != null && props.imgList != undefined && props.imgList != "undefined"){
// let zj = props.imgList
// let img = zj.Split(",");
let arr = props.imgList.match(/[^,]+/g);
console.log("文件列表",arr)
return arr
}else{
return []
}
}
})
const listType = () => {
if(props.control.listType){
return props.control.listType
}else{
return "text"
}
}
//
const getFormItemInputStyle = (ele: any,sty:number) => {
if(ele?.inputStyle){
console.log("返回栅格宽度4",AnalysisInputCss(ele?.inputStyle,sty))
return AnalysisInputCss(ele?.inputStyle,sty)
}
}
const configStyle = computed(() => {
return props.data.styles || {}
})
</script>
<template>
<div>
<div v-if="props.control.listType=='picture-card'">
<div v-for="item in imgAry">
<el-image class="imgCss" :style="getFormItemInputStyle(configStyle,2)" :src="item" :fit="fit" :preview-src-list="imgAry" />
</div>
</div>
<div v-else-if="props.control.listType=='picture'">
<div v-for="item in imgAry">
<el-image class="imgCss" :style="getFormItemInputStyle(configStyle,2)" :src="item" :fit="fit" :preview-src-list="imgAry" />
</div>
</div>
<div v-else>
<div v-for="item in imgAry">
<el-link :underline="false" :href="item" target="_blank">{{ item }}</el-link><br>
</div>
</div>
</div>
</template>
<style lang='scss' scoped>
.imgCss{
width: 100px;
height: 100px;
}
</style>

4
src/components/DesignForm/public/expand/userDialog.vue

@ -24,7 +24,7 @@ const visible = ref(false)
//
const treeEl = ref()
const treeData = ref<orgform[]>([])
const department = ref()
const department = ref(309)
const handleNodeClick = (data: any) => {
department.value = data.id
getUserList()
@ -33,7 +33,7 @@ const getTreeData = () => {
// getRequest('deptList', {}).then((res: any) => {
// treeData.value = formatResult(res.data, 'transformDataToChild')
// })
getOrgFormTree()
getOrgFormTree({id:309})
.then(({ data }) => {
// console.log(data)
treeData.value = data.list

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

@ -10,7 +10,7 @@ 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 UploadPageList from '@/components/DesignForm/public/expand/uploadPageList.vue'
import LokOrgCentent from '@/widget/org/cont.vue'
@ -197,7 +197,7 @@ const timeToString = (timeVal:any,types:int) => {
: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()" />
@ -205,6 +205,9 @@ const timeToString = (timeVal:any,types:int) => {
<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>{{ getText(scope.row[item.name],scope.row,item.name) }}</div>

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

@ -778,7 +778,7 @@ function optionsValue3Get1(data: any,fieldName: string){
</template>
<!--格栅布局-->
<template v-else-if="element.type === 'grid'">
<el-row class="form-row" :class="[element.className]">
<el-row class="form-row" :style="type === 5?'padding: 0 0 20px 0;':''" :class="[element.className]">
<el-col
class="form-col"
:class="{

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

@ -31,7 +31,18 @@ import OrgCentent from '@/components/DesignForm/public/expand/org.vue'
import LokOrgCentent from '@/widget/org/cont.vue'
import DigitpagePage from '@/components/DesignForm/public/expand/digitpage.vue'
import LowcodeImagePage from '@/components/DesignForm/public/expand/lowcodeImage.vue'
// import LowcodeImagePage from '@/components/DesignForm/public/expand/lowcodeImage.vue'
import LowcodeImagePage from '@/widget/lowcodeimage/index.vue'
import UploadPage from '@/components/DesignForm/public/expand/uploadPage.vue'
import UploadPageList from '@/components/DesignForm/public/expand/uploadPageList.vue'
import OrgCitys from '@/components/DesignForm/public/expand/orgCitys.vue'
import DatePickerPage from '@/components/DesignForm/public/expand/datePicker.vue'
import CascaderPage from '@/components/DesignForm/public/expand/cascader.vue'
import AKSelect from './select.vue'
import { uploadUrl,getRequest } from '@/api/DesignForm'
@ -41,6 +52,7 @@ import { useRoute } from 'vue-router'
import { json2string,objToStringify,string2json,stringToObj } from '@/utils/DesignForm/form'
import TextImg from "@/assets/image/tinymce.png"
import { AnalysisCss,AnalysisInputCss } from '@/components/DesignForm/public/form/calculate/cssInfo.ts'
@ -182,9 +194,21 @@ const currentComponent = computed(() => {
}
if (props.data.type === 'lowcodeImage') {
return markRaw(LowcodeImagePage)
}
if (props.data.type === 'upload') {
return markRaw(UploadPage)
}
if (props.data.type === 'organization') {
return markRaw(OrgCitys)
}
if (props.data.type === 'datePicker') {
props.data.control.valueFormat="x"
// props.data.control.align="right"
// props.data.control.appendToBody =true
return markRaw(DatePickerPage)
}
if(props.data.type === 'cascader'){
return markRaw(CascaderPage)
}
if (props.data.type === 'switch') {
if(typeof props.data.control.activeValue === "number"){
@ -877,8 +901,22 @@ function asfValueChanged(val:any){
//console.log("asfValueChanged",val)
emits("asfValueChanged",val)
}
/**
@ 作者: 秦东
@ 时间: 2024-09-17 14:30:37
@ 功能: 解析下载图片
*/
const uploadPic = (val:any) => {
console.log("解析下载图片-->",val)
if(val != ""){
let urlAry = string2json(val)
// let urlAry = val.toString().split(",")
console.log("解析下载图片-2->",urlAry)
return urlAry
}else{
return [];
}
}
</script>
<template>
<BaiduMap v-if="judgeIsShow(data.name) &&data.type === 'baidumap' && type != 4" :data="data" />
@ -907,14 +945,14 @@ function asfValueChanged(val:any){
<OrgCitys v-else-if="judgeIsShow(data.name) && data.type === 'organization' " :data="data" />
<UrlLink v-else-if="judgeIsShow(data.name) && data.type === 'urllink' && type != 4" :data="data" />
<el-form-item
v-bind="data.item"
v-if="judgeIsShow(data.name) && data.type != 'owner' && data.type != 'baidumap' && data.type != 'serialNumber' && data.type != 'founder' && data.type != 'founderTime' && data.type != 'editTime' && data.type != 'associatedForms' && data.type != 'videoUpAndPlay' && data.type != 'organization' && data.type != 'lowcodeTransfer' && data.type != 'lowcodeCarsusel' && data.type != 'signaturemap' && data.type != 'signaturemap' && data.type != 'urllink'"
v-if="judgeIsShow(data.name) && data.type != 'owner' && data.type != 'baidumap' && data.type != 'serialNumber' && data.type != 'founder' && data.type != 'founderTime' && data.type != 'editTime' && data.type != 'associatedForms' && data.type != 'videoUpAndPlay' && data.type != 'lowcodeTransfer' && data.type != 'lowcodeCarsusel' && data.type != 'signaturemap' && data.type != 'signaturemap' && data.type != 'urllink'"
:disabled="judgeIsDisabled(data.name)"
:prop="tProp || data.name"
:class="config.className"
@ -964,9 +1002,10 @@ function asfValueChanged(val:any){
<div class="form-value" v-else-if="data.type == 'select'" v-html="selectValue(value,data.options)">
</div>
<div class="form-value" v-else-if="data.type == 'upload'" v-html="value">
<div class="form-value" v-else-if="data.type == 'upload'" >
<UploadPageList :img-list="value" :control="control" :data="data" />
</div>
</div>
<div class="form-value" v-else-if="data.type == 'tinymce'" v-html="value">
</div>
@ -1078,45 +1117,70 @@ function asfValueChanged(val:any){
:transformOption="transformOption"
:placeholder="data.control.placeholder?data.control.placeholder:'请选择'+getLabel(data.item)"
/>
<el-upload
class="upload-style"
v-if="data.type === 'upload'"
:action="uploadUrl"
<component
v-if="['organization'].includes(data.type)"
:is="currentComponent"
:data="data"
v-bind="control"
:control="control"
:config="config"
:name="control.file || 'file'"
:disabled="judgeIsDisabled(data.name)"
:file-list="fileList as any"
:class="{limit: control.limit <= fileList.length}"
:on-error="uploadError"
:on-success="uploadSuccess"
:on-remove="uploadRemove"
>
<i class="icon-plus" v-if="control?.listType=='picture-card'"></i>
<el-button type="primary" plain v-else-if="control?.listType=='picture'">
<span v-if="config?.btnText">{{ config?.btnText }} </span>
<span class="fa fa-plus" v-else></span>
</el-button>
<template v-else>
<el-button type="primary" plain v-if="config?.btnText">
{{ config?.btnText }}
</el-button>
<i class="icon-plus" v-else></i>
</template>
<template #tip v-if="config?.tip">
<div class="el-upload__tip">
{{ config?.tip }}
</div>
</template>
</el-upload>
:options="options"
v-model="value"
/>
<component
v-if="['cascader', 'treeSelect'].includes(data.type)"
v-if="['upload'].includes(data.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"
/>
<component
v-if="['cascader'].includes(data.type)"
:is="currentComponent"
v-bind="control"
:data="data"
:control="control"
:config="config"
:disabled="judgeIsDisabled(data.name)"
:options="options"
v-model="value"
/>
<component
v-if="['treeSelect'].includes(data.type)"
:is="currentComponent"
v-bind="control"
:disabled="judgeIsDisabled(data.name)"
:options="options"
v-model="value"
/>
<el-time-picker v-if="data.type=='timePicker'" v-model="value" value-format="x" :placeholder="data.control.placeholder?data.control.placeholder:'请选择'+getLabel(data.item)" />
<component
v-if="
[
'datePicker'
].includes(data.type)
"
:is="currentComponent"
v-bind="control"
:disabled="judgeIsDisabled(data.name)"
:data="data"
:placeholder="data.control.placeholder?data.control.placeholder:'请选择'+getLabel(data.item)"
v-model="value"
/>
<component
v-if="
[
@ -1125,8 +1189,6 @@ function asfValueChanged(val:any){
'switch',
'inputNumber',
'colorPicker',
'datePicker',
'component',
'expand-user',
'orgCentent',
@ -1156,7 +1218,7 @@ function asfValueChanged(val:any){
/>
<!--所属部门-->

2
src/components/DesignForm/public/headToolsApp.vue

@ -62,7 +62,7 @@ const btnClick = (type: string) => {
v-if="(item.icon != 'branch') || (item.icon == 'branch' && (props.customerformid !=''))"
@click="btnClick(item.icon)"
:key="item.icon"
:type="item.key==6?'danger':item.key==5?'success':item.key==4?'warning':'primary'"
:type="item.key==6?'danger':item.key==5?'success':item.key==4?'warning':''"
>
<i v-if="item.iconFont==''" :class="['icon-' + item.icon]" ></i><i v-if="item.iconFont!=''" :class="['fa ' + item.iconFont]" ></i>{{ item.label }}
</el-button>

4
src/components/DesignForm/tableListPage/index.vue

@ -214,7 +214,7 @@ const setUpClick = (val:string,id:string) =>{
.then((data)=>{
// console.log('cancel!',data)
ElNotification({
title: '温馨提示!',
title: '提示信息!',
message: data.mag,
type: 'success',
})
@ -1296,7 +1296,7 @@ const transformOption = (val: string | number, type?: string) => {
>
<el-button type="info" size="small" class="fa fa-edit" />
</el-tooltip>
</el-button-group>
</el-button-group>
</el-col>

1386
src/components/DesignForm/tableListPage/index_20240919.vue

File diff suppressed because it is too large

2
src/views/hr/archives/archivescont.vue

@ -26,7 +26,7 @@ import Talentinventory from "@/views/hr/archives/basicinformation/talentinventor
import Employmentrelations from "@/views/hr/archives/basicinformation/employmentrelations.vue"; //
import Jobtitle from "@/views/hr/archives/basicinformation/jobtitle.vue"; //
import Certificates from "@/views/hr/archives/basicinformation/certificates.vue"; //
import PersonalityTest from "@/views/hr/archives/basicinformation/personalityTest.vue"; //
import PersonalityTest from "@/views/hr/archives/basicinformation/personalityTest.vue"; //
const props = defineProps({

10
src/views/hr/archives/basicinformation/certificates.vue

@ -145,7 +145,7 @@ const delzsxxBox = (cont: zhengshuxinxi) => {
<template #label>
<el-text><el-icon><Tickets /></el-icon> </el-text>
</template>
{{ item.name }}
{{ item.title }}
</el-descriptions-item>
<el-descriptions-item>
<template #label>
@ -157,19 +157,19 @@ const delzsxxBox = (cont: zhengshuxinxi) => {
<template #label>
<el-text><el-icon><OfficeBuilding /></el-icon> </el-text>
</template>
{{ item.issuingunit }}
{{ item.issuingUnit }}
</el-descriptions-item>
<el-descriptions-item>
<template #label>
<el-text><svg-icon icon-class="yunxing" class="svg_box"></svg-icon> </el-text>
</template>
{{ item.effectivetime }}
{{ item.timeDataStr }}
</el-descriptions-item>
<el-descriptions-item>
<template #label>
<el-text><svg-icon icon-class="stop" class="svg_box"></svg-icon> </el-text>
</template>
{{ item.deadline }}
{{ item.endTimeStr }}
</el-descriptions-item>
<el-descriptions-item>
<template #label>
@ -181,7 +181,7 @@ const delzsxxBox = (cont: zhengshuxinxi) => {
<template #label>
<el-text><el-icon><QuestionFilled /></el-icon> </el-text>
</template>
{{ item.iseffective }}
{{ item.validPeriod }}
</el-descriptions-item>
</el-descriptions>
</el-col>

5
src/views/hr/archives/basicinformation/jobtitle.vue

@ -38,7 +38,7 @@ const getzcxxList = () => {
tableLoading.value = true;
getJobtitleCont({ id: props.usercont.keystr })
.then((data) => {
zcxxList.value = data.data.list;
zcxxList.value = data.data;
totalVal.value = data.data.total
})
.finally(() => {
@ -108,7 +108,8 @@ const delzcxxBox = (cont: zhichengxinxi) => {
<el-table
v-loading="tableLoading"
highlight-current-row
:data="zcxxList" border
:data="zcxxList"
border
:header-cell-style="{ background: '#F5F7FA' }">
<el-table-column label="职称级别" prop="types" align="center"/>
<el-table-column label="职称系列" prop="series" align="center"/>

2
src/views/hr/archives/basicinformation/personalityTest.vue

@ -67,7 +67,7 @@ const isTestShouw = (val:number) => {
<div>
<CharacterColor v-if="isTestShouw(1)" :usercont="props.usercont" :tabsid="props.tabsid" />
<DiscTest v-if="isTestShouw(2)" :usercont="props.usercont" :tabsid="props.tabsid" />
<NinePage :usercont="props.usercont" :tabsid="props.tabsid" />
<NinePage v-if="isTestShouw(1)" :usercont="props.usercont" :tabsid="props.tabsid" />
<div v-if="isTestShouw(3)" v-html="props.usercont.userTypes"></div>
</div>
</template>

86
src/views/hr/archives/downpage/xingGeFengXi.vue

@ -0,0 +1,86 @@
<!--
@ 作者: 秦东
@ 时间: 2024-09-19 13:16:56
@ 备注: 性格分析过度
-->
<script lang='ts' setup>
const downloadUrl = import.meta.env.VITE_APP_BASE_API+"/systemapi/rongxin/downLoadNineTestPage"
const downloadUrlStis = import.meta.env.VITE_APP_BASE_API+"/systemapi/rongxin/statisticsPersonality"
const props = defineProps({
downTableType: {
type: String,
default: "10000003",
},
downClassType: {
type: Number,
default: 1,
},
orgTree: {
type: Object,
default() {
return {};
},
},
});
const dialogVisible = ref(true)
const emits = defineEmits(["closeXigePage"]);
const searchQuery = reactive({
types:1,
org:"",
keywords:"",
typekey:props.downTableType?props.downTableType.toString():""
})
const handleTypeClose = () => {
emits("closeXigePage")
}
const orgTreeProps ={
children: 'child',
label: 'name',
value:"id"
} //
</script>
<template>
<el-dialog
v-model="dialogVisible"
title="选择下载范围"
width="500"
:before-close="handleTypeClose"
>
<el-form :model="searchQuery" label-width="90px" >
<el-form-item v-if="props.downClassType!=1" label="统计类型" label-position="left">
<el-radio-group v-model="searchQuery.types">
<el-radio :value="1">未做</el-radio>
<el-radio :value="2">已做</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="行政组织" label-position="left">
<el-tree-select
v-model="searchQuery.org"
:data="props.orgTree"
check-strictly
:render-after-expand="false"
:props="orgTreeProps"
clearable
/>
</el-form-item>
<el-form-item label="工号或姓名" label-position="left">
<el-input v-model="searchQuery.keywords" clearable />
</el-form-item>
<el-form-item>
<el-link v-if="props.downClassType==2" type="primary" :underline="false" :href="downloadUrlStis+'?keywords='+searchQuery.keywords+'&org='+searchQuery.org+'&typekey='+searchQuery.typekey+'&types='+searchQuery.types" target="_blank">
<el-button type="primary">
确定下载
</el-button>
</el-link>
<el-link v-else type="primary" :underline="false" :href="downloadUrl+'?keywords='+searchQuery.keywords+'&adminorg='+searchQuery.org+'&typekey='+searchQuery.typekey" target="_blank">
<el-button type="primary">
确定下载
</el-button>
</el-link>
</el-form-item>
</el-form>
</el-dialog>
</template>
<style lang='scss' scoped>
</style>

198
src/views/hr/archives/index.vue

@ -17,7 +17,7 @@ import { uploadUrl } from '@/api/DesignForm'
* 引入页面
*/
import ArchivesCont from '@/views/hr/archives/archivescont.vue'
import XingGeFengXi from '@/views/hr/archives/downpage/xingGeFengXi.vue'
import { ElScrollbar as ElScrollbarType } from 'element-plus';
@ -41,6 +41,7 @@ const handleClick = () => {
})
}
const direction = ref("rtl")
// const uploadFFurl = import.meta.env.VITE_APP_BASE_API + "/hrapi/staff/uploadUserFiles"
const uploadFFurl = import.meta.env.VITE_APP_BASE_API + "/hrapi/staff/uploadUserFilesRedis"
@ -497,7 +498,74 @@ const downLoadTeamTable = () => {
console.log("下团队角色分析表",data)
})
}
const openSetup = ref(false)
/**
@ 作者: 秦东
@ 时间: 2024-09-19 09:57:42
@ 功能: 设置相关操作
*/
const setupClick = () => {
openSetup.value = true
temList()
}
/**
@ 作者: 秦东
@ 时间: 2024-09-19 10:12:29
@ 功能: 关闭设置
*/
const closeSetup = () => {
openSetup.value = false
}
const setupActiveName = ref("1")
watch(() =>setupActiveName.value, (val:any) => {
console.log("切换选项",val)
})
/**
@ 作者: 秦东
@ 时间: 2024-09-19 13:12:29
@ 功能: 下载性格分析表
*/
const openTableType = ref(false)
const downTableType = ref("10000003")
const downClassType = ref(1)
const selectDownTiaojian = (val:string) => {
downTableType.value = val
openTableType.value = true
downClassType.value = 1
}
/**
@ 作者: 秦东
@ 时间: 2024-09-19 13:23:09
@ 功能: 关闭下载页面
*/
const closeXigePage = () => {
openTableType.value = false
}
/**
@ 作者: 秦东
@ 时间: 2024-09-19 13:55:09
@ 功能: 性格类型
*/
const characterList = reactive([
{
label:"性格色彩",
code:"10000001"
},
{
label:"DISC性格特质",
code:"10000002"
},
{
label:"九型人格特质",
code:"10000003"
}
])
const downStatistics = (val:any) => {
console.log("下载数据嗖嗖嗖--->",val)
downTableType.value = val.code
openTableType.value = true
downClassType.value = 2
}
</script>
<template>
<div class="app-container">
@ -586,7 +654,7 @@ const downLoadTeamTable = () => {
批量导入数据
</el-button>
<el-button
v-if="false"
v-hasPerm="['287868103478489088']"
plain
type="primary"
@ -596,7 +664,7 @@ const downLoadTeamTable = () => {
导入模板下载
</el-button>
<el-link type="primary" :underline="false" :href="downloadUrl+'?keywords='+searchArchiveQuery.keywords+'&adminorg='+searchArchiveQuery.adminorg+'&emptype='+json2string(searchArchiveQuery.emptype)" target="_blank"><el-button
<el-link type="primary" v-if="false" :underline="false" :href="downloadUrl+'?keywords='+searchArchiveQuery.keywords+'&adminorg='+searchArchiveQuery.adminorg+'&emptype='+json2string(searchArchiveQuery.emptype)" target="_blank"><el-button
v-hasPerm="['287868103478489088']"
plain
@ -605,7 +673,13 @@ const downLoadTeamTable = () => {
<el-icon><Download /></el-icon>
下载团队角色分析表
</el-button></el-link>
</el-space>
<el-button type="warning" @click="setupClick">
<el-icon><Setting /></el-icon>
设置
</el-button>
</el-space>
</div>
<el-table
v-loading="tableLoading"
@ -808,11 +882,117 @@ const downLoadTeamTable = () => {
</el-form-item>
</el-form>
</el-dialog>
<!--设置-->
<el-drawer
v-model="openSetup"
title="各行政组织员工信息点在档案模板"
:direction="direction"
:before-close="closeSetup"
:size="500"
class="drwBody"
>
<el-tabs v-model="setupActiveName" type="border-card">
<el-tab-pane label="员工档案导入模版" name="1">
<template #label>
<el-space wrap>
<span class="fa fa-upload"></span>
<span>员工档案导入模版</span>
</el-space>
</template>
<div v-hasPerm="['288626950073757696']" style="flex: auto; text-align:right; margin-bottom:10px;">
<el-button type="primary" @click="setUpNewTemplate">上传新模版</el-button>
</div>
<el-table :data="downTemplate" border style="width: 100%">
<el-table-column prop="orgName" label="行政组织" width="200" />
<el-table-column prop="fileName" label="文件名称">
<template #default="scope">
<el-link type="success" :underline="false" :href="scope.row.fileUrl" target="_blank">{{ scope.row.fileName }}</el-link>
</template>
</el-table-column>
<el-table-column v-hasPerm="['288626867236253696']" prop="address" label="操作" align="center" width="100">
<template #default="scope">
<el-button link type="warning" size="small" @click="editUserTemp(scope.row)">编辑</el-button>
<el-button link type="danger" size="small" @click="delUserTemp(scope.row,3)">删除</el-button>
</template>
</el-table-column>
</el-table>
<div class="pageBox">
<el-pagination layout="prev, pager, next" :total="totalVal" />
</div>
</el-tab-pane>
<el-tab-pane label="性格分析表" name="2">
<template #label>
<el-space wrap>
<span class="fa fa-list"></span>
<span>性格分析表</span>
</el-space>
</template>
<div class="downLink">
<div>团队角色九型人格测试</div>
<div>
<el-button
type="danger"
text
v-hasPerm="['287868103478489088']"
@click="selectDownTiaojian('10000003')"
>
下载
</el-button>
</div>
</div>
<!-- <el-link type="primary" :underline="false" :href="downloadUrl+'?keywords='+searchArchiveQuery.keywords+'&adminorg='+searchArchiveQuery.adminorg+'&emptype='+json2string(searchArchiveQuery.emptype)" target="_blank"><el-button
v-hasPerm="['287868103478489088']"
plain
type="primary"
>
<el-icon><Download /></el-icon>
下载团队角色分析表
</el-button></el-link> -->
</el-tab-pane>
<el-tab-pane label="测试统计" name="3">
<template #label>
<el-space wrap>
<span class="fa fa-bar-chart"></span>
<span>测试统计</span>
</el-space>
</template>
<el-table :data="characterList" border style="width: 100%">
<el-table-column prop="label" label="测试名称" />
<el-table-column label="操作" align="center" width="80">
<template #default="scope">
<el-button link type="danger" size="small" @click="downStatistics(scope.row)">下载</el-button>
</template>
</el-table-column>
</el-table>
</el-tab-pane>
</el-tabs>
</el-drawer>
<XingGeFengXi v-if="openTableType" :down-table-type="downTableType" :down-class-type="downClassType" :org-tree="orgTreeList" @close-xige-page="closeXigePage" />
</el-container>
</div>
</template>
<style lang='scss' scoped>
.app-container{
:deep .el-drawer__body{
padding: 0 10px;
}
}
.common-layout{
height: calc(100% - 60px);
@ -841,5 +1021,13 @@ const downLoadTeamTable = () => {
text-align: center;
display:flex;
align-items: center;
width: 100%;
}
.downLink{
display: flex;
width: 100%;
align-items: center;
justify-content: space-between;
}
</style>

65
src/views/sysworkflow/codepage/page.vue

@ -48,8 +48,73 @@ function sendMessage() {
import Editor from "@/components/WangEditor/index.vue";
const value = ref("初始内容");
const tableData = [
{
date: '2016-05-03',
name: 'Tom',
address: 'No. 189, Grove St, Los Angeles',
},
{
date: '2016-05-02',
name: 'Tom',
address: 'No. 189, Grove St, Los Angeles',
},
{
date: '2016-05-04',
name: 'Tom',
address: 'No. 189, Grove St, Los Angeles',
},
{
date: '2016-05-01',
name: 'Tom',
address: 'No. 189, Grove St, Los Angeles',
},
]
const dialogVisible = ref(false)
const handleClose = (done: () => void) => {
ElMessageBox.confirm('Are you sure to close this dialog?')
.then(() => {
done()
})
.catch(() => {
// catch error
})
}
</script>
<template>
<el-table :data="tableData" border style="width: 100%">
<el-table-column prop="date" label="Date" width="180" />
<el-table-column prop="name" label="Name" width="180" />
<el-table-column prop="address" label="Address" />
<el-table-column >
<el-button plain @click="dialogVisible = true">
Click to open the Dialog
</el-button>
<el-dialog
v-model="dialogVisible"
title="Tips"
width="500"
:before-close="handleClose"
>
<span>This is a message</span>
<template #footer>
<div class="dialog-footer">
<el-button @click="dialogVisible = false">Cancel</el-button>
<el-button type="primary" @click="dialogVisible = false">
Confirm
</el-button>
</div>
</template>
</el-dialog>
</el-table-column>
</el-table>
<div>
<input v-model="message" placeholder="输入消息" />
<button @click="sendMessage">发送</button>

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

@ -235,15 +235,33 @@ const showOrHide = (val:appMenuTreeInfo,types:number) =>{
*/
const editAppMenu = (val:appMenuTreeInfo) =>{
// console.log('editAppMenu:',val);
let sendInfo = {
id:val.id.toString(),
status:3
}
delAppMenu(sendInfo)
.then((data) =>{
// console.log('app:',data);
gainSunAppContent()
});
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)
/**
@ -336,7 +354,9 @@ const openAppPage = (val:any) =>{
<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>
<el-dropdown-item @click="editAppMenu(data)" divided>
<el-text class="mx-1" type="danger">删除</el-text>
</el-dropdown-item>
</template>
</el-dropdown>
</div>

8
src/views/sysworkflow/lowcodepage/appPage/appPageForm/openAppFormPage.vue

@ -279,7 +279,7 @@ const gainAppFormPageInit = () =>{
}
if(stateData.searchData.length>0){
if(stateData.searchData && stateData.searchData.length>0){
for(let j = 0;j<stateData.searchData.length;j++){
//console.log(stateData.searchData[j])
if(stateData.searchData[j].id==stateData.tableData.columns[i].id){
@ -299,7 +299,12 @@ const gainAppFormPageInit = () =>{
stateList.tableData = stateData.tableData
stateList.searchData = stateData.searchData
if(stateList.searchData == null){
stateList.searchData = new Array()
}
// console.log("",stateList.searchData)
stateList.loading = stateData.loading
stateList.attrObj = stateData.attrObj
stateList.config = stateData.config
@ -369,7 +374,6 @@ defineExpose({
<el-col v-if="activePage!=3" :span="24" class="pageBoxInfo">
<el-card class="tispMsg" shadow="always">
<el-scrollbar class="suojing">
<ak-page-list
v-if="activePage==1"
:data="stateList.tableData"

44
src/views/sysworkflow/lowcodepage/appPage/appPageForm/pageForm.vue

@ -10,13 +10,14 @@ import { json2string,objToStringify,string2json,stringToObj } from '@/utils/Desi
import { customerFormVersionCont } from '@/api/DesignForm/type'
import { FormData,formStruct,DrawerStruct, VideoMsg } from '@/api/DesignForm/types'
import { saveProductionForm,getOneProductionForm,haveCustomerFormVersion,editCustomerFormInfo,saveAsNewVersion,enableVersion,judgeSubmitCancel,createAppForm,editAppPageInfo,saveOtherVersion,previewAppFormVersion } from '@/api/DesignForm/requestapi'
import { treeStruct } from '@/api/DesignForm/type'
//
import DragControlApp from '@/components/DesignForm/dragControlApp.vue';
import HeadToolsApp from '@/components/DesignForm/public/headToolsApp.vue';
import FormDesign from '@/components/DesignForm/public/form/form.vue'
import PreviewPage from '@/views/sysworkflow/lowcodepage/appPage/appPageForm/previewPage.vue'
import AceDrawerPage from '@/components/DesignForm/aceDrawerPage.vue'
const props = defineProps({
appCont:{
@ -104,7 +105,15 @@ const route: any = useRoute().query || {}
const versionCont = ref<customerFormVersionCont[]>([]) //
const tableKey = ref("")
const versionId = ref<string>("") //
const store = useDesignFormStore()
// const store = useDesignFormStore()
const store = useDesignFormStore() as any
const controlData = computed(() => {
// console.log("----------------->",props.formInfo)
// console.log("--------1--------->",store.controlAttr)
// console.log("---------3-------->",controlData.value.customRules)
return store.controlAttr
})
const drawer = reactive<DrawerStruct>({
visible: false,
type: '',
@ -544,15 +553,21 @@ function optionsValue3Get3(data: any,fieldName: string){
}
}
//
// 3174.15 2924.57 3326.15 3119.33
const dialogConfirm = (editVal: string) => {
// jsonstate.formData
console.log("生成脚本预览和导入",editVal)
console.log("生成脚本预览和导入----->",drawer.type,"==========",drawer.callback,"==========",drawer)
console.log("生成脚本预览和导入===========>",state.value.formData)
try {
if (typeof drawer.callback === 'function') {
console.log("1======2========>",drawer.codeType,stringToObj(editVal))
// callback
const newObj =
drawer.codeType === 'json'? string2json(editVal): stringToObj(editVal)
drawer.callback(newObj)
console.log("1==============>",)
} else {
switch (drawer.type) {
case 'css':
@ -561,6 +576,7 @@ const dialogConfirm = (editVal: string) => {
state.value.formData.config = {}
}
state.value.formData.config.style = editVal
console.log("2==============>",)
break
case 'dict':
state.value.formDict = string2json(editVal)
@ -575,17 +591,34 @@ const dialogConfirm = (editVal: string) => {
state.value.formData.events = {}
}
state.value.formData.events[drawer.type] = stringToObj(editVal)
console.log("3==============>",)
break
default:
state.value.formData = stringToObj(editVal)
console.log("4==============>",)
}
}
dialogCancel()
} catch (res) {
// console.log(res.message)
//ElMessage.error(res.message)
ElMessage.error(res.message)
}
}
/**
@ 作者: 秦东
@ 时间: 2024-09-27 16:53:30
@ 功能: 级联选择与树
*/
const dialogConfirmTree = (val:treeStruct[]) => {
// console.log("",val)
// const newObj =
// drawer.codeType === 'json'? string2json(val): stringToObj(val)
// drawer.callback(newObj)
controlData.value.options = val
// console.log("--->",controlData)
}
</script>
<template>
<el-aside class="asideBox leftBox">
@ -634,14 +667,17 @@ const dialogConfirm = (editVal: string) => {
@form-name-change="formNameChanged"
/>
</el-aside>
<ace-drawer
v-model="drawer.visible"
:title="drawer.title"
:direction="drawer.direction"
:content="drawer.content"
:code-type="drawer.codeType"
:data="drawer"
@before-close="dialogCancel"
@confirm="dialogConfirm"
@confirmTree="dialogConfirmTree"
/>
<PreviewPage v-model:state="state" @clickClose="closePreviewPage" />
</template>

36
src/views/sysworkflow/lowcodepage/appPage/appPageForm/pageList.vue

@ -271,9 +271,13 @@ const jieForm = () => {
if(props.appPageKey != ""){
gainFormTableField({id:props.appPageKey.toString()})
.then((data)=>{
// console.log('--->',data)
console.log('解析表单--->',data)
formTableField.masterTable=data.data.masterTable
formTableField.sunTable=data.data.sunTable
nextTick(()=>{
columnDrop()
getListInfo();
})
})
}
}
@ -286,8 +290,7 @@ const jieForm = () => {
onMounted(()=>{
jieForm();
nextTick(() => {
columnDrop()
getListInfo();
gainFormTableKeyWord(props.appPageKey.toString())
@ -362,6 +365,9 @@ const getListInfo = () => {
// console.log("---->",stateData)
state.tableData = stateData.tableData
state.searchData = stateData.searchData
if(state.searchData == null){
state.searchData = new Array()
}
state.loading = stateData.loading
state.attrObj = stateData.attrObj
state.config = stateData.config
@ -408,7 +414,9 @@ const getListInfo = () => {
zhuDaunIsTrue.value = false
// console.log("========>",state.tableData)
// console.log("====1====>",state.tableData.columns)
// console.log("====2====>",formTableField.masterTable)
// console.log("====3====>",state.searchData)
if(state.searchData && state.searchData.length>0) {
if(formTableField.masterTable && formTableField.masterTable.length > 0){
state.searchData.forEach((itemCol:any)=>{
@ -417,14 +425,25 @@ const getListInfo = () => {
// console.log("====111====>",itemCol)
// console.log("====222====>",item)
item.isSearch = true
// tableFieldList.value!.toggleRowSelection(item, true)
}
})
})
}
}
if(state.tableData.columns && state.tableData.columns.length > 0){
if(formTableField.masterTable && formTableField.masterTable.length > 0){
state.tableData.columns.forEach((itemCol:any)=>{
formTableField.masterTable.forEach((item:any)=>{
if(itemCol.id == item.id){
tableFieldList.value!.toggleRowSelection(item, true)
}
})
})
}
if(tableAttrLogButtonList && tableAttrLogButtonList.length > 0){
}
if(tableAttrLogButtonList && tableAttrLogButtonList.length > 0){
state.tableData.columns.forEach((itemCol:any)=>{
tableAttrLogButtonList.forEach((item:any)=>{
if(itemCol.id == item.id){
@ -433,8 +452,6 @@ const getListInfo = () => {
})
})
}
}
if(state.tableData && state.tableData.controlBtn && state.tableData.controlBtn.length > 0) {
state.tableData.controlBtn.forEach((itemCol:any)=>{
@ -608,6 +625,7 @@ const tableListFieldClick = (val:any[]) => {
@ 功能: 处理查询条件
*/
const addOrDelSearchField = (val:attrButton,isTrue:boolean) => {
console.log("处理查询条件",state.searchData)
if(isTrue){
if(state.searchData.length>0){
let isWrite = true;

3
src/views/sysworkflow/lowcodepage/appPage/createAppFormPage.vue

@ -78,7 +78,8 @@ const state = reactive<formStruct>({
labelPosition: "left"
},
config: {
groupKey:props.groupKey
groupKey:props.formKey,
classify:4
},
styles:{
divStyle:{},

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

@ -105,6 +105,7 @@ const closeAppDraw = () =>{
*/
const openAppPageForm = (val:appMenuTreeInfo) => {
checkedMenu.value = val
console.log("操作表单页面",val)
}
/**
@ 作者: 秦东
@ -147,6 +148,11 @@ const addMenu = (key?:string) => {
}
menuGroupShow.value = true;
}
const openAppPageInit = ref(null)
const updataPageInit = () => {
openAppPageInit.value.gainAppFormPageInit()
}
</script>
<template>
<el-drawer v-model="props.editIsOpen" :with-header="false" :close-on-click-modal="false" :close-on-press-escape="false" :destroy-on-close="true" :size="props.drawerWith">

2
src/views/sysworkflow/lowcodepage/pageFlow/appTableFlow.vue

@ -507,7 +507,7 @@ function optionsValue3Get3(data: any,fieldName: string){
}
</script>
<template>
<el-drawer v-model="drawerOpenOrClose" v-loading="loadingData" :title="versiontitle" :close-on-click-modal="false" :close-on-press-escape="false" :destroy-on-close="true" :size="drawbox" class="drawerClass" >{{drawbox}}
<el-drawer v-model="drawerOpenOrClose" v-loading="loadingData" :title="versiontitle" :close-on-click-modal="false" :close-on-press-escape="false" :destroy-on-close="true" :size="drawbox" class="drawerClass" >
<AppFormPage
ref="formEl"

7
src/views/sysworkflow/lowcodepage/runApp/runAppForm.vue

@ -195,7 +195,7 @@ const initLoadData = () => {
let stateData = string2json(data.data.appForm.listjson)
// console.log("",stateData)
let holeControlAndConfigStateData = string2json(data.data.appForm.mastesformjson)
if(stateData.tableData.columns.length>0){
if(stateData.tableData.columns && stateData.tableData.columns.length>0){
for(let i = 0;i<stateData.tableData.columns.length;i++){
for(let u = 0;u<holeControlAndConfigStateData.list.length;u++){
if(stateData.tableData.columns[i].id==holeControlAndConfigStateData.list[u].name){
@ -226,7 +226,7 @@ const initLoadData = () => {
}
})
}
if(stateData.searchData.length>0){
if(stateData.searchData && stateData.searchData.length>0){
for(let j = 0;j<stateData.searchData.length;j++){
// console.log(stateData.searchData[j])
if(stateData.searchData[j].id==stateData.tableData.columns[i].id){
@ -244,6 +244,9 @@ const initLoadData = () => {
}
stateList.tableData = stateData.tableData
stateList.searchData = stateData.searchData
if(stateList.searchData == null){
stateList.searchData = new Array()
}
stateList.loading = stateData.loading
stateList.attrObj = stateData.attrObj
stateList.config = stateData.config

14
src/widget/lowcodeimage/lowcodeImage.vue

@ -36,6 +36,7 @@ let styleObject = reactive({
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
@ -93,8 +94,6 @@ watch(()=>props.data?.control, (val) => {
styleObject.width = widthPercent+'%';
styleObject.height = heightPercent+'%';
}
},{
deep: true,
})
@ -207,8 +206,9 @@ watch(() =>props.imgUrl,(val)=>{
</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)" /> -->
<el-upload
<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"
@ -217,9 +217,9 @@ watch(() =>props.imgUrl,(val)=>{
:on-success="handleAvatarSuccess"
:before-upload="beforeAvatarUpload"
>
<!-- <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>
<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>
</template>

1
src/widget/orgcitys/index.vue

@ -275,6 +275,7 @@ const initAddressData = () =>{
v-model="addressBox"
title="填写地址"
width="600px"
:modal="false"
:before-close="addressBoxClose"
>
<el-row>

Loading…
Cancel
Save