Browse Source

Merge branch 'v8_master'

# Conflicts:
#	src/types/components.d.ts
lwx_v10
超级管理员 2 years ago
parent
commit
3302b19113
  1. 40
      src/api/DesignForm/requestapi.ts
  2. 3
      src/components/DesignForm/assembly/isSearch.ts
  3. 5
      src/components/DesignForm/dragControl.vue
  4. 141
      src/components/DesignForm/dragControlApp.vue
  5. 141
      src/components/DesignForm/dragControlNew.vue
  6. 2
      src/components/DesignForm/formControlAttr.vue
  7. 2197
      src/components/DesignForm/formControlProperties.vue
  8. 139
      src/components/DesignForm/formVersion.vue
  9. 33
      src/components/DesignForm/rule/numberRules.ts
  10. 104
      src/components/DesignForm/validateApp.ts
  11. 6
      src/components/IconSelect/appMenuSvgPage.vue
  12. 1733
      src/styles/workflowcss/workflow.css
  13. 1
      src/styles/workflowcss/workflow.min.css
  14. 8
      src/types/components.d.ts
  15. 372
      src/views/dashboard/index.vue
  16. 146
      src/views/dashboard/index_1.vue
  17. 250
      src/views/dashboard/index_old.vue
  18. 24
      src/views/sysworkflow/lowcodepage/appFormList.vue
  19. 9
      src/views/sysworkflow/lowcodepage/appPage/appMenuGroup.vue
  20. 168
      src/views/sysworkflow/lowcodepage/appPage/appMenus.vue
  21. 17
      src/views/sysworkflow/lowcodepage/appPage/appPageForm/pageFlow.vue
  22. 135
      src/views/sysworkflow/lowcodepage/appPage/appPageForm/pageForm.vue
  23. 25
      src/views/sysworkflow/lowcodepage/appPage/appPageForm/pageList.vue
  24. 187
      src/views/sysworkflow/lowcodepage/appPage/createAppFormPage.vue
  25. 112
      src/views/sysworkflow/lowcodepage/appPage/editAppMenuNamePage.vue
  26. 34
      src/views/sysworkflow/lowcodepage/appPage/index.vue
  27. 3
      src/views/sysworkflow/lowcodepage/index.vue
  28. 19
      src/views/sysworkflow/lowcodepage/pageDesignes.vue

40
src/api/DesignForm/requestapi.ts

@ -375,3 +375,43 @@ export function saveAppMenu(data: any) {
data: data
});
}
//获取完整APP菜单树
export function gainAllAppMenu(data: any) {
return request({
url: '/systemapi/app/gainAllAppMenu',
method: 'post',
data: data
});
}
//获取完整APP菜单树
export function editAppMenuCont(data: any) {
return request({
url: '/systemapi/app/editAppMenuCont',
method: 'post',
data: data
});
}
//修改菜单名称
export function editAppMenuLable(data: any) {
return request({
url: '/systemapi/app/editAppMenuLable',
method: 'post',
data: data
});
}
//显示和隐藏菜单
export function appMenuShowOrHide(data: any) {
return request({
url: '/systemapi/app/appMenuShowOrHide',
method: 'post',
data: data
});
}
//编辑菜单状态
export function delAppMenu(data: any) {
return request({
url: '/systemapi/app/delAppMenu',
method: 'post',
data: data
});
}

3
src/components/DesignForm/assembly/isSearch.ts

@ -0,0 +1,3 @@
export const formControlProject = (val:any) =>{
return []
}

5
src/components/DesignForm/dragControl.vue

@ -41,7 +41,7 @@ const searchField = [
'component',
'button'
]
const designType = inject('formDesignType') as string
const designType = inject('formDesignType') as string // ( app.provide())
const formDataList = ref<any[]>([])
const isSearch = computed(() => {
return designType === 'search'
@ -82,6 +82,7 @@ const useTemplateClick = () => {
useTemplateEl.value.open()
}
const useTemplateSelect = (data: FormData) => {
console.log("使用模版",data);
emits('click', data)
}
const clone = (origin: any) => {
@ -197,7 +198,9 @@ const setupStatus = (val:any) =>{
ref="useTemplateEl"
@click="useTemplateSelect"
/>
<div>版本</div>
{{props.formId}}
<el-tabs v-model="activeName" :stretch="true" class="demo-tabs" @tab-change="handleTabsClick" >
<el-tab-pane v-for="(item,index) in props.versioncont" :key="index" :label="'V'+item.version" :name="item.id" class="tab_pane_body">
<el-button v-if="item.status!=1" type="primary" round @click="setupStatus(item)">启用</el-button>

141
src/components/DesignForm/dragControlApp.vue

@ -0,0 +1,141 @@
<!--
@ 作者: 秦东
@ 时间: 2024-05-09 15:12:45
@ 备注: 自定义表单组件页面(App专用)
-->
<script lang='ts' setup>
import controlListData from '@/components/DesignForm/assembly'
import Draggable from 'vuedraggable-es'
import '@/assets/iconfont/iconfont.css'
//
import FormVersion from '@/components/DesignForm/formVersion.vue';
const props = withDefaults(
defineProps<{
tableKey?: number | string,
signCode?: number | string,
}>(),
{}
)
const designType = inject('formDesignType') as string // ( app.provide())
//
const searchField = [
'input',
'radio',
'checkbox',
'select',
'datePicker',
'timePicker',
'inputNumber',
'cascader',
'component',
'button'
]
/**
@ 作者: 秦东
@ 时间: 2024-05-09 10:58:56
@ 功能: 表单组件数据
*/
const controlList = computed(() => {
if (designType === 'search') {
//
const temp: any = []
controlListData.forEach((item: any) => {
if (item.children) {
const filter = item.children.filter((ch: any) => {
return searchField.includes(ch.type)
})
if (filter && filter.length) {
temp.push({ title: item.title, children: filter })
}
}
})
return temp
} else {
return controlListData
}
})
const tableVersion = ref() //
const emits = defineEmits<{
(e: 'versionUpdateForm', value: string): void
}>()
/**
@ 作者: 秦东
@ 时间: 2024-05-09 11:36:59
@ 功能: 启用和禁用版本
*/
const enableOrDisable = (val?:any) =>{
console.log("启用和禁用版本",val)
emits('versionUpdateForm', val)
}
/**
@ 作者: 秦东
@ 时间: 2024-05-09 11:40:15
@ 功能: 打开版本选择页面
*/
const useVersionClick = () => {
tableVersion.value.open()
}
const activities = [
{
content: 'Event start',
timestamp: '2018-04-15',
},
{
content: 'Approved',
timestamp: '2018-04-13',
},
{
content: 'Success',
timestamp: '2018-04-11',
},
]
</script>
<template>
<div class="components-list">
<div v-for="(list, index) in controlList" :key="index">
<div class="title">
{{ list.title }}
<div
class="template"
@click="useVersionClick"
>
版本
</div>
</div>
<draggable
v-model="list.children"
tag="ul"
:group="{ name: 'form', pull: 'clone', put: false }"
ghost-class="ghost"
:sort="false"
:clone="clone"
item-key="key123"
>
<template #item="{ element }">
<li class="fontIcon" :class="[element.type]">
<i v-if="element.iconFont==''" :class="`icon-${element.icon}`"></i>
<i v-if="element.iconFont!=''" :class="`fa ${element.iconFont} `"></i>
<span :title="element.label">{{ element.label }}</span>
</li>
</template>
</draggable>
</div>
</div>
<FormVersion ref="tableVersion" :table-key="props.tableKey" :sign-code="props.signCode" @enableOrDisable="enableOrDisable" />
</template>
<style lang='scss' scoped>
.tab_pane_body{
text-align: center;
}
.fontIcon{
i{
padding: 4px 0px 0 0px;
}
}
</style>

141
src/components/DesignForm/dragControlNew.vue

@ -0,0 +1,141 @@
<!--
@ 作者: 秦东
@ 时间: 2024-05-09 10:47:19
@ 备注: 自定义表单组件
-->
<script lang='ts' setup>
import controlListData from '@/components/DesignForm/assembly'
import Draggable from 'vuedraggable-es'
import '@/assets/iconfont/iconfont.css'
//
import FormVersion from '@/components/DesignForm/formVersion.vue';
const props = withDefaults(
defineProps<{
tableKey?: number | string,
signCode?: number | string,
}>(),
{}
)
const designType = inject('formDesignType') as string // ( app.provide())
//
const searchField = [
'input',
'radio',
'checkbox',
'select',
'datePicker',
'timePicker',
'inputNumber',
'cascader',
'component',
'button'
]
/**
@ 作者: 秦东
@ 时间: 2024-05-09 10:58:56
@ 功能: 表单组件数据
*/
const controlList = computed(() => {
if (designType === 'search') {
//
const temp: any = []
controlListData.forEach((item: any) => {
if (item.children) {
const filter = item.children.filter((ch: any) => {
return searchField.includes(ch.type)
})
if (filter && filter.length) {
temp.push({ title: item.title, children: filter })
}
}
})
return temp
} else {
return controlListData
}
})
const tableVersion = ref() //
const emits = defineEmits<{
(e: 'versionUpdateForm', value: string): void
}>()
/**
@ 作者: 秦东
@ 时间: 2024-05-09 11:36:59
@ 功能: 启用和禁用版本
*/
const enableOrDisable = (val?:any) =>{
console.log("启用和禁用版本",val)
emits('versionUpdateForm', val)
}
/**
@ 作者: 秦东
@ 时间: 2024-05-09 11:40:15
@ 功能: 打开版本选择页面
*/
const useVersionClick = () => {
tableVersion.value.open()
}
const activities = [
{
content: 'Event start',
timestamp: '2018-04-15',
},
{
content: 'Approved',
timestamp: '2018-04-13',
},
{
content: 'Success',
timestamp: '2018-04-11',
},
]
</script>
<template>
<div class="components-list">
<div v-for="(list, index) in controlList" :key="index">
<div class="title">
{{ list.title }}
<div
class="template"
@click="useVersionClick"
>
版本
</div>
</div>
<draggable
v-model="list.children"
tag="ul"
:group="{ name: 'form', pull: 'clone', put: false }"
ghost-class="ghost"
:sort="false"
:clone="clone"
item-key="key123"
>
<template #item="{ element }">
<li class="fontIcon" :class="[element.type]">
<i v-if="element.iconFont==''" :class="`icon-${element.icon}`"></i>
<i v-if="element.iconFont!=''" :class="`fa ${element.iconFont} `"></i>
<span :title="element.label">{{ element.label }}</span>
</li>
</template>
</draggable>
</div>
</div>
<FormVersion ref="tableVersion" :table-key="props.tableKey" :sign-code="props.signCode" @enableOrDisable="enableOrDisable" />
</template>
<style lang='scss' scoped>
.tab_pane_body{
text-align: center;
}
.fontIcon{
i{
padding: 4px 0px 0 0px;
}
}
</style>

2
src/components/DesignForm/formControlAttr.vue

@ -1423,7 +1423,7 @@
defineExpose({ getFormFieldBySource })
//
const isNotWrite = (val:any) =>{
// console.log("--->",val)
console.log("判断输入框是否可写--->",val,props.customerformid)
if(val.key === "name" && props.customerformid != ""){
return true
}

2197
src/components/DesignForm/formControlProperties.vue

File diff suppressed because it is too large

139
src/components/DesignForm/formVersion.vue

@ -0,0 +1,139 @@
<!--
@ 作者: 秦东
@ 时间: 2024-05-08 14:52:03
@ 备注: 版本管理
-->
<script lang='ts' setup>
import { customerFormVersionCont } from '@/api/DesignForm/type'
import { haveCustomerFormVersion,enableVersion } from '@/api/DesignForm/requestapi'
const props = withDefaults(
defineProps<{
tableKey?: number | string,
signCode?: number | string,
}>(),
{}
)
const emits = defineEmits<{
(e: 'click', value: string): void
(e: 'enableOrDisable', value: string): void
}>()
const isOpen = ref(false)
const versionList = ref<customerFormVersionCont[]>([]) //
const loading = ref(false)
/**
@ 作者: 秦东
@ 时间: 2024-05-09 14:21:25
@ 功能: 编辑状态
*/
const setupStatus = (val:any) =>{
enableVersion({id:val.id.toString()})
.then(() =>{
init()
emits('enableOrDisable', val.id.toString())
});
}
/**
@ 作者: 秦东
@ 时间: 2024-05-08 14:55:50
@ 功能: 打开页面
*/
const open = () => {
console.log("open",isOpen)
isOpen.value = true
init()
}
/**
@ 作者: 秦东
@ 时间: 2024-05-08 14:56:13
@ 功能: 初始化数据
*/
const init = () => {
loading.value= true
haveCustomerFormVersion({id:props.tableKey})
.then(({data})=>{
console.log("加载异常-------------->",data)
versionList.value = data
// if(data.length > 0){
// data.forEach((item:any) => {
// if(item.status == 1){
// versionId.value = item.id.toString()
// emits('update:formVersion', item.id.toString())
// }
// });
// }
})
.finally(()=>{loading.value= false})
}
defineExpose({
open
})
/**
@ 作者: 秦东
@ 时间: 2024-05-09 14:03:54
@ 功能: 设置颜色
*/
const setColor = (val:number) => {
if(val == 1){
return "#67C23A"
}else{
return "#F56C6C"
}
}
</script>
<template>
<div
v-if="isOpen"
class="use-template active"
v-loading="loading"
>
<span class="close icon-close" @click="isOpen = false"></span>
<div v-if="versionList.length === 0" class="no-date">暂无版本</div>
<div v-else class="list">
<el-scrollbar class="timeLineBox">
<el-timeline style="max-width: 600px">
<el-timeline-item v-for="item in versionList" :key="item.id" placement="top" :color="setColor(item.status)">
<el-card v-if="item.status==1" >
<el-row>
<el-col>版本V{{ item.version }}</el-col>
<el-col>创建人{{ item.createrName }}</el-col>
<el-col>创建时间{{ item.dayTime }}</el-col>
<el-col style="text-align:right"><el-button text type="success" size="small" disabled>使用中</el-button></el-col>
</el-row>
</el-card>
<el-card v-else >
<el-row>
<el-col>版本V{{ item.version }}</el-col>
<el-col>创建人{{ item.createrName }}</el-col>
<el-col>创建时间{{ item.dayTime }}</el-col>
<el-col style="text-align:right"><el-button type="primary" size="small" @click="setupStatus(item)">启用</el-button></el-col>
</el-row>
</el-card>
</el-timeline-item>
</el-timeline>
</el-scrollbar>
</div>
</div>
</template>
<style lang='scss' scoped>
.use-template{
width:250px;
top: 40px;
.list{
padding: 30px 5px;
}
}
.timeLineBox{
height: calc(100vh - 80px);
::v-deep .el-card__body{
padding:5px;
// color: #FFF;
}
}
</style>

33
src/components/DesignForm/rule/numberRules.ts

@ -0,0 +1,33 @@
/**
@ 作者: 秦东
@ 时间: 2024-05-10 09:38:51
@ 功能: 数字规则列表
*/
interface NumberValidateTypes {
type: string
label: string
msg: string
}
const NumberValidateConfig: NumberValidateTypes[] = [
{
type: 'time',
label: '时间',
msg:'请选择时间格式'
},
{
type: 'text',
label: '自定义字符',
msg:'请输入自定义字符'
},
{
type: 'serialnumber',
label: '流水序号',
msg:'流水号起始值'
},
{
type: 'randomnumber',
label: '随机数',
msg:'请输入随机数位数'
}
]
export default NumberValidateConfig

104
src/components/DesignForm/validateApp.ts

@ -0,0 +1,104 @@
// 快速添加 内置校验规则
interface ValidateTypes {
type: string
label: string
regExp?: RegExp
message?: string
}
const validateConfig: ValidateTypes[] = [
{
type: 'required',
label: '必填',
regExp: /^\s*$/,
message: '必填项'
},
{
type: 'mobile',
label: '手机号码',
regExp: /^0{0,1}(13[0-9]|15[7-9]|153|156|18[7-9])[0-9]{8}$/,
message: '请输入手机号码'
},
{
type: 'tel',
label: '固话',
regExp: /^0\d{2,3}-\d{7,8}$/,
message: '请输入固定电话号码'
},
{
type: 'phone',
label: '固话或手机',
regExp: /^((0\d{2,3}(-?)\d{7,8})|(1[3456789]\d{9}))$/,
message: '请输入固定电话号码或手机号'
},
{
type: 'email',
label: '邮箱',
regExp: /^[a-z0-9A-Z._%-]+@([a-z0-9A-Z-]+\.)+[a-zA-Z]{2,4}$/,
message: '请输入邮箱地址'
},
{
type: 'int',
label: '正整数',
regExp: /^[0-9]*[1-9][0-9]*$/,
message: '请输入正整数'
},
{
type: 'number',
label: '数字',
regExp: /^\d+(\.\d+)?$/,
message: '请输入数字'
},
{
type: 'money',
label: '金额',
regExp: /^[0-9]+\.?[0-9]{0,2}$/,
message: '请输入正确的金额,最多两位小数'
},
{
type: 'card',
label: '身份证',
regExp:
/(^[1-9]\d{5}(18|19|([23]\d))\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{3}[0-9Xx]$)|(^[1-9]\d{5}\d{2}((0[1-9])|(10|11|12))(([0-2][1-9])|10|20|30|31)\d{2}$)/,
message: '请输入身份证号'
},
{
type: 'cn',
label: '中文',
regExp: /[\u4e00-\u9fa5]+/,
message: '请输入中文'
},
{
type: 'numberLetter',
label: '数字字母',
regExp: /[0-9a-zA-Z]$/,
message: '请输入数字或字母'
},
{
type: 'url',
label: '网址',
regExp: /^https?:\/\/((.)+(\.)?)*(:\d+)?(\/((\.)?(\?)?=?&?.(\?)?)*)*$/,
message: '请输入网址'
},
{
type: 'longitude',
label: '经度',
regExp: /^[-+]?(0?\d{1,2}\.\d{1,10}|1[0-7]?\d\.\d{1,10}|180\.0{1,10})$/,
message: '请输入正确的经度'
},
{
type: 'latitude',
label: '纬度',
regExp: /^[-+]?([0-8]?\d{1}\.\d{1,10}|90\.0{1,10})$/,
message: '请输入正确的纬度'
},
{
type: 'rules',
label: '自定义正则',
message:""
},
{
type: 'methods',
label: '自定义方法'
}
]
export default validateConfig

6
src/components/IconSelect/appMenuSvgPage.vue

@ -17,6 +17,11 @@ const props = defineProps({
require: false,
default:""
},
svgId:{
type:String,
require: false,
default:""
},
iconList:{
type:Object,
default(){
@ -54,6 +59,7 @@ const handleClose = () => {
@ 功能: 确定
*/
const handleSelect = (svgName:string) => {
console.log("确定",props.svgId)
emits("update:svgName",svgName)
handleClose()
}

1733
src/styles/workflowcss/workflow.css

File diff suppressed because it is too large

1
src/styles/workflowcss/workflow.min.css

File diff suppressed because one or more lines are too long

8
src/types/components.d.ts

@ -22,6 +22,8 @@ declare module '@vue/runtime-core' {
DesignLayoutPage: typeof import('./../components/DesignForm/designLayout/designLayoutPage.vue')['default']
DiyIconfont: typeof import('./../components/DesignForm/public/expand/diy-iconfont.vue')['default']
DragControl: typeof import('./../components/DesignForm/dragControl.vue')['default']
DragControlApp: typeof import('./../components/DesignForm/dragControlApp.vue')['default']
DragControlNew: typeof import('./../components/DesignForm/dragControlNew.vue')['default']
ElAffix: typeof import('element-plus/es')['ElAffix']
ElAlert: typeof import('element-plus/es')['ElAlert']
ElAside: typeof import('element-plus/es')['ElAside']
@ -105,10 +107,12 @@ declare module '@vue/runtime-core' {
FormControlAttr: typeof import('./../components/DesignForm/formControlAttr.vue')['default']
FormControlAttr_2024024: typeof import('./../components/DesignForm/formControlAttr_2024024.vue')['default']
FormControlAttres: typeof import('./../components/DesignForm/formControlAttres.vue')['default']
FormControlProperties: typeof import('./../components/DesignForm/formControlProperties.vue')['default']
FormGroup: typeof import('./../components/DesignForm/public/form/formGroup.vue')['default']
FormGroup1: typeof import('./../components/DesignForm/public/form/formGroup1.vue')['default']
FormItem: typeof import('./../components/DesignForm/public/form/formItem.vue')['default']
FormPageCont: typeof import('./../components/DesignForm/tableListPage/formPageCont.vue')['default']
FormVersion: typeof import('./../components/DesignForm/formVersion.vue')['default']
FormWord: typeof import('./../components/workflow/dialog/formWord.vue')['default']
GithubCorner: typeof import('./../components/GithubCorner/index.vue')['default']
Hamburger: typeof import('./../components/Hamburger/index.vue')['default']
@ -123,9 +127,13 @@ declare module '@vue/runtime-core' {
IEpDownload: typeof import('~icons/ep/download')['default']
IEpEdit: typeof import('~icons/ep/edit')['default']
IEpMessageBox: typeof import('~icons/ep/message-box')['default']
<<<<<<< HEAD
IEpMinus: typeof import('~icons/ep/minus')['default']
IEpOperation: typeof import('~icons/ep/operation')['default']
IEpPicture: typeof import('~icons/ep/picture')['default']
=======
IEpOperation: typeof import('~icons/ep/operation')['default']
>>>>>>> v8_master
IEpPlus: typeof import('~icons/ep/plus')['default']
IEpPosition: typeof import('~icons/ep/position')['default']
IEpRefresh: typeof import('~icons/ep/refresh')['default']

372
src/views/dashboard/index.vue

@ -1,146 +1,250 @@
<!--
@ 作者: 秦东
@ 时间: 2023-11-06 13:39:13
@ 备注: 首页
-->
<script lang='ts' setup>
import * as echarts from 'echarts'; //
<script lang="ts">
export default { name: "Dashboard" };
</script>
<script setup lang="ts">
import { useUserStore } from "@/store/modules/user";
import { useTransition, TransitionPresets } from "@vueuse/core";
import { orgInfo } from '@/api/displayboardapi/types'
import { getOrgChiled,getCompanyDeparment,targetListForDepartment } from '@/api/displayboardapi/indexapi'
import UserInfo from "@/views/dashboard/components/userinfo.vue";
import SanLianpIng from "@/views/dashboard/components/sanlianping.vue";
import EducationChart from "@/views/dashboard/components/education.vue";
import AllOrgYear from "@/views/dashboard/components/allorgyear.vue";
import OrgUserAge from "@/views/dashboard/components/orguserage.vue";
import OrgEducation from "@/views/dashboard/components/orgeducation.vue";
import Application from "@/views/dashboard/components/application.vue";
import HostNews from "@/views/dashboard/components/hostnews.vue";
import GithubCorner from "@/components/GithubCorner/index.vue";
import SvgIcon from "@/components/SvgIcon/index.vue";
import BarChart from "./components/BarChart.vue";
import PieChart from "./components/PieChart.vue";
import RadarChart from "./components/RadarChart.vue";
const userStore = useUserStore();
const orgListCont = ref<orgInfo[]>([])
const educationOrgId = ref<number>(309)
const masterBody = ref<any>(null)
const drawerWidht = ref<any>()
/**
* 获取行政组织
*/
function getOrgList(){
getOrgChiled({id:313})
.then(( {data} )=>{
console.log("获取行政组织-2-->",data)
orgListCont.value = data.list
educationOrgId.value = data.current
})
}
const orgAllYears = ref<any>() //
const oenOrg = ref<any>() //
//
onMounted(() => {
drawerWidht.value = masterBody.value?.clientWidth
getOrgList();
// console.log("----100---->",drawerWidht.value)
})
const date: Date = new Date();
const greetings = computed(() => {
if (date.getHours() >= 6 && date.getHours() < 8) {
return "晨起披衣出草堂,轩窗已自喜微凉🌅!";
} else if (date.getHours() >= 8 && date.getHours() < 12) {
return "上午好🌞!";
} else if (date.getHours() >= 12 && date.getHours() < 18) {
return "下午好☕!";
} else if (date.getHours() >= 18 && date.getHours() < 24) {
return "晚上好🌃!";
} else if (date.getHours() >= 0 && date.getHours() < 6) {
return "偷偷向银河要了一把碎星,只等你闭上眼睛撒入你的梦中,晚安🌛!";
}
});
const duration = 5000;
//
const amount = ref(0);
const amountOutput = useTransition(amount, {
duration: duration,
transition: TransitionPresets.easeOutExpo,
});
amount.value = 2000;
// 访
const visitCount = ref(0);
const visitCountOutput = useTransition(visitCount, {
duration: duration,
transition: TransitionPresets.easeOutExpo,
});
visitCount.value = 2000;
//
const messageCount = ref(0);
const messageCountOutput = useTransition(messageCount, {
duration: duration,
transition: TransitionPresets.easeOutExpo,
});
messageCount.value = 2000;
//
const orderCount = ref(0);
const orderCountOutput = useTransition(orderCount, {
duration: duration,
transition: TransitionPresets.easeOutExpo,
});
orderCount.value = 2000;
</script>
<template>
<div ref="masterBody" class="app_container">
<el-row :gutter="10">
<el-col :xs="24" :sm="16" :md="16" :lg="18" :xl="19" class="readback">
<AllOrgYear :org-list-cont="orgListCont" :education-org-id="educationOrgId" />
</el-col>
<el-col :xs="24" :sm="8" :md="8" :lg="6" :xl="5" class="greenColor">
<UserInfo :user-store="userStore" />
</el-col>
</el-row>
<el-row :gutter="10" class="cart_top_juLi">
<el-col :xs="24" :sm="16" :md="16" :lg="18" :xl="19" class="readback">
<el-row :gutter="10">
<el-col :xs="24" :sm="24" :md="24" :lg="12" :xl="12" class="readback">
<OrgUserAge :org-list-cont="orgListCont" :education-org-id="educationOrgId" />
</el-col>
<el-col :xs="24" :sm="24" :md="24" :lg="12" :xl="12" class="readback">
<OrgEducation :org-list-cont="orgListCont" :education-org-id="educationOrgId" />
</el-col>
</el-row>
</el-col>
<el-col :xs="24" :sm="8" :md="8" :lg="6" :xl="5" class="greenColor">
<HostNews v-model:drawer-widht="drawerWidht" />
</el-col>
</el-row>
<el-row :gutter="10" class="cart_top_juLi">
<el-col :xs="24" :sm="16" :md="16" :lg="18" :xl="19" class="readback">
<SanLianpIng />
</el-col>
<el-col :xs="24" :sm="8" :md="8" :lg="6" :xl="5" class="greenColor">
<Application :org-list-cont="orgListCont" :education-org-id="educationOrgId" />
</el-col>
</el-row>
</div>
<template>
<div class="dashboard-container">
<!-- github角标 -->
<!-- 用户信息 -->
<el-row class="mb-8">
<el-card class="w-full">
<div class="flex justify-between flex-wrap">
<div class="flex items-center">
<img
class="user-avatar"
:src="userStore.avatar + '?imageView2/1/w/80/h/80'"
/>
<span class="ml-[10px] text-[16px]">
{{ userStore.nickname }}
</span>
</div>
<div class="leading-[40px]">
{{ greetings }}
</div>
<div v-if="false" class="space-x-2 flex items-center" >
<el-link
target="_blank"
type="danger"
href="https://www.cnblogs.com/haoxianrui/p/16090029.html"
>官方0到1教程</el-link
>
<el-divider direction="vertical" />
<el-link
target="_blank"
type="success"
href="https://gitee.com/youlaiorg/vue3-element-admin"
>Gitee源码</el-link
>
<el-divider direction="vertical" />
<el-link
target="_blank"
type="primary"
href="https://github.com/youlaitech/vue3-element-admin"
>GitHub源码
</el-link>
</div>
</div>
</el-card>
</el-row>
<!-- 数据卡片 -->
<el-row :gutter="40" class="mb-4">
<el-col :xs="24" :sm="12" :lg="6" class="mb-4">
<div class="data-box">
<div
class="text-[#40c9c6] hover:!text-white hover:bg-[#40c9c6] p-3 rounded"
>
<svg-icon icon-class="uv" size="3em" />
</div>
<div class="flex flex-col space-y-3">
<div class="text-[var(--el-text-color-secondary)]">访问数</div>
<div class="text-lg">
{{ Math.round(visitCountOutput) }}
</div>
</div>
</div>
</el-col>
<!--消息数-->
<el-col :xs="24" :sm="12" :lg="6" class="mb-4">
<div class="data-box">
<div
class="text-[#36a3f7] hover:!text-white hover:bg-[#36a3f7] p-3 rounded"
>
<svg-icon icon-class="message" size="3em" />
</div>
<div class="flex flex-col space-y-3">
<div class="text-[var(--el-text-color-secondary)]">消息数</div>
<div class="text-lg">
{{ Math.round(messageCountOutput) }}
</div>
</div>
</div>
</el-col>
<el-col :xs="24" :sm="12" :lg="6" class="mb-4">
<div class="data-box">
<div
class="text-[#f4516c] hover:!text-white hover:bg-[#f4516c] p-3 rounded"
>
<svg-icon icon-class="money" size="3em" />
</div>
<div class="flex flex-col space-y-3">
<div class="text-[var(--el-text-color-secondary)]">收入金额</div>
<div class="text-lg">
{{ Math.round(amountOutput) }}
</div>
</div>
</div>
</el-col>
<el-col :xs="24" :sm="12" :lg="6" class="mb-2">
<div class="data-box">
<div
class="text-[#34bfa3] hover:!text-white hover:bg-[#34bfa3] p-3 rounded"
>
<svg-icon icon-class="shopping" size="3em" />
</div>
<div class="flex flex-col space-y-3">
<div class="text-[var(--el-text-color-secondary)]">订单数</div>
<div class="text-lg">
{{ Math.round(orderCountOutput) }}
</div>
</div>
</div>
</el-col>
</el-row>
<!-- Echarts 图表 -->
<el-row :gutter="40">
<el-col :sm="24" :lg="8" class="mb-4">
<BarChart
id="barChart"
height="400px"
width="100%"
class="bg-[var(--el-bg-color-overlay)]"
/>
</el-col>
<el-col :xs="24" :sm="12" :lg="8" class="mb-4">
<PieChart
id="pieChart"
height="400px"
width="100%"
class="bg-[var(--el-bg-color-overlay)]"
/>
</el-col>
<el-col :xs="24" :sm="12" :lg="8" class="mb-4">
<RadarChart
id="radarChart"
height="400px"
width="100%"
class="bg-[var(--el-bg-color-overlay)]"
/>
</el-col>
</el-row>
</div>
</template>
<style lang='scss' scoped>
.app_container{
padding: 10px 20px 0px 20px;
height: calc(100vh - 90px);
overflow: hidden;
overflow-y: auto;
}
.readback{
// background-color:#FF0000;
.allOrgAxisCares{
display: block;
width:100%;
height:280px;
overflow:auto;
}
}
.orgAllMothsTitle{
width:100%;
display: flex;
align-items: center;
justify-content:space-between;
}
.greenColor{
// background-color:#FFAC52;
// padding:0 10px 0 10px;
}
.span_icon_left{
margin-right:10px;
}
.cart_top_juLi{
// margin-top:10px;
}
.titleInfo{
font-size: 20px;
font-weight: bold;
<style lang="scss" scoped>
.dashboard-container {
position: relative;
padding: 24px;
.user-avatar {
width: 40px;
height: 40px;
border-radius: 50%;
}
.github-corner {
position: absolute;
top: 0;
right: 0;
z-index: 99;
border: 0;
}
.data-box {
display: flex;
justify-content: space-between;
padding: 20px;
font-weight: bold;
color: var(--el-text-color-regular);
background: var(--el-bg-color-overlay);
border-color: var(--el-border-color);
box-shadow: var(--el-box-shadow-dark);
}
.svg-icon {
fill: currentcolor !important;
}
}
</style>

146
src/views/dashboard/index_1.vue

@ -0,0 +1,146 @@
<!--
@ 作者: 秦东
@ 时间: 2023-11-06 13:39:13
@ 备注: 首页
-->
<script lang='ts' setup>
import * as echarts from 'echarts'; //
import { useUserStore } from "@/store/modules/user";
import { orgInfo } from '@/api/displayboardapi/types'
import { getOrgChiled,getCompanyDeparment,targetListForDepartment } from '@/api/displayboardapi/indexapi'
import UserInfo from "@/views/dashboard/components/userinfo.vue";
import SanLianpIng from "@/views/dashboard/components/sanlianping.vue";
import EducationChart from "@/views/dashboard/components/education.vue";
import AllOrgYear from "@/views/dashboard/components/allorgyear.vue";
import OrgUserAge from "@/views/dashboard/components/orguserage.vue";
import OrgEducation from "@/views/dashboard/components/orgeducation.vue";
import Application from "@/views/dashboard/components/application.vue";
import HostNews from "@/views/dashboard/components/hostnews.vue";
const userStore = useUserStore();
const orgListCont = ref<orgInfo[]>([])
const educationOrgId = ref<number>(309)
const masterBody = ref<any>(null)
const drawerWidht = ref<any>()
/**
* 获取行政组织
*/
function getOrgList(){
getOrgChiled({id:313})
.then(( {data} )=>{
console.log("获取行政组织-2-->",data)
orgListCont.value = data.list
educationOrgId.value = data.current
})
}
const orgAllYears = ref<any>() //
const oenOrg = ref<any>() //
//
onMounted(() => {
drawerWidht.value = masterBody.value?.clientWidth
getOrgList();
// console.log("----100---->",drawerWidht.value)
})
</script>
<template>
<div ref="masterBody" class="app_container">
<el-row :gutter="10">
<el-col :xs="24" :sm="16" :md="16" :lg="18" :xl="19" class="readback">
<AllOrgYear :org-list-cont="orgListCont" :education-org-id="educationOrgId" />
</el-col>
<el-col :xs="24" :sm="8" :md="8" :lg="6" :xl="5" class="greenColor">
<UserInfo :user-store="userStore" />
</el-col>
</el-row>
<el-row :gutter="10" class="cart_top_juLi">
<el-col :xs="24" :sm="16" :md="16" :lg="18" :xl="19" class="readback">
<el-row :gutter="10">
<el-col :xs="24" :sm="24" :md="24" :lg="12" :xl="12" class="readback">
<OrgUserAge :org-list-cont="orgListCont" :education-org-id="educationOrgId" />
</el-col>
<el-col :xs="24" :sm="24" :md="24" :lg="12" :xl="12" class="readback">
<OrgEducation :org-list-cont="orgListCont" :education-org-id="educationOrgId" />
</el-col>
</el-row>
</el-col>
<el-col :xs="24" :sm="8" :md="8" :lg="6" :xl="5" class="greenColor">
<HostNews v-model:drawer-widht="drawerWidht" />
</el-col>
</el-row>
<el-row :gutter="10" class="cart_top_juLi">
<el-col :xs="24" :sm="16" :md="16" :lg="18" :xl="19" class="readback">
<SanLianpIng />
</el-col>
<el-col :xs="24" :sm="8" :md="8" :lg="6" :xl="5" class="greenColor">
<Application :org-list-cont="orgListCont" :education-org-id="educationOrgId" />
</el-col>
</el-row>
</div>
</template>
<style lang='scss' scoped>
.app_container{
padding: 10px 20px 0px 20px;
height: calc(100vh - 90px);
overflow: hidden;
overflow-y: auto;
}
.readback{
// background-color:#FF0000;
.allOrgAxisCares{
display: block;
width:100%;
height:280px;
overflow:auto;
}
}
.orgAllMothsTitle{
width:100%;
display: flex;
align-items: center;
justify-content:space-between;
}
.greenColor{
// background-color:#FFAC52;
// padding:0 10px 0 10px;
}
.span_icon_left{
margin-right:10px;
}
.cart_top_juLi{
// margin-top:10px;
}
.titleInfo{
font-size: 20px;
font-weight: bold;
}
</style>

250
src/views/dashboard/index_old.vue

@ -1,250 +0,0 @@
<script lang="ts">
export default { name: "Dashboard" };
</script>
<script setup lang="ts">
import { useUserStore } from "@/store/modules/user";
import { useTransition, TransitionPresets } from "@vueuse/core";
import GithubCorner from "@/components/GithubCorner/index.vue";
import SvgIcon from "@/components/SvgIcon/index.vue";
import BarChart from "./components/BarChart.vue";
import PieChart from "./components/PieChart.vue";
import RadarChart from "./components/RadarChart.vue";
const userStore = useUserStore();
const date: Date = new Date();
const greetings = computed(() => {
if (date.getHours() >= 6 && date.getHours() < 8) {
return "晨起披衣出草堂,轩窗已自喜微凉🌅!";
} else if (date.getHours() >= 8 && date.getHours() < 12) {
return "上午好🌞!";
} else if (date.getHours() >= 12 && date.getHours() < 18) {
return "下午好☕!";
} else if (date.getHours() >= 18 && date.getHours() < 24) {
return "晚上好🌃!";
} else if (date.getHours() >= 0 && date.getHours() < 6) {
return "偷偷向银河要了一把碎星,只等你闭上眼睛撒入你的梦中,晚安🌛!";
}
});
const duration = 5000;
//
const amount = ref(0);
const amountOutput = useTransition(amount, {
duration: duration,
transition: TransitionPresets.easeOutExpo,
});
amount.value = 2000;
// 访
const visitCount = ref(0);
const visitCountOutput = useTransition(visitCount, {
duration: duration,
transition: TransitionPresets.easeOutExpo,
});
visitCount.value = 2000;
//
const messageCount = ref(0);
const messageCountOutput = useTransition(messageCount, {
duration: duration,
transition: TransitionPresets.easeOutExpo,
});
messageCount.value = 2000;
//
const orderCount = ref(0);
const orderCountOutput = useTransition(orderCount, {
duration: duration,
transition: TransitionPresets.easeOutExpo,
});
orderCount.value = 2000;
</script>
<template>
<div class="dashboard-container">
<!-- github角标 -->
<!-- 用户信息 -->
<el-row class="mb-8">
<el-card class="w-full">
<div class="flex justify-between flex-wrap">
<div class="flex items-center">
<img
class="user-avatar"
:src="userStore.avatar + '?imageView2/1/w/80/h/80'"
/>
<span class="ml-[10px] text-[16px]">
{{ userStore.nickname }}
</span>
</div>
<div class="leading-[40px]">
{{ greetings }}
</div>
<div v-if="false" class="space-x-2 flex items-center" >
<el-link
target="_blank"
type="danger"
href="https://www.cnblogs.com/haoxianrui/p/16090029.html"
>官方0到1教程</el-link
>
<el-divider direction="vertical" />
<el-link
target="_blank"
type="success"
href="https://gitee.com/youlaiorg/vue3-element-admin"
>Gitee源码</el-link
>
<el-divider direction="vertical" />
<el-link
target="_blank"
type="primary"
href="https://github.com/youlaitech/vue3-element-admin"
>GitHub源码
</el-link>
</div>
</div>
</el-card>
</el-row>
<!-- 数据卡片 -->
<el-row :gutter="40" class="mb-4">
<el-col :xs="24" :sm="12" :lg="6" class="mb-4">
<div class="data-box">
<div
class="text-[#40c9c6] hover:!text-white hover:bg-[#40c9c6] p-3 rounded"
>
<svg-icon icon-class="uv" size="3em" />
</div>
<div class="flex flex-col space-y-3">
<div class="text-[var(--el-text-color-secondary)]">访问数</div>
<div class="text-lg">
{{ Math.round(visitCountOutput) }}
</div>
</div>
</div>
</el-col>
<!--消息数-->
<el-col :xs="24" :sm="12" :lg="6" class="mb-4">
<div class="data-box">
<div
class="text-[#36a3f7] hover:!text-white hover:bg-[#36a3f7] p-3 rounded"
>
<svg-icon icon-class="message" size="3em" />
</div>
<div class="flex flex-col space-y-3">
<div class="text-[var(--el-text-color-secondary)]">消息数</div>
<div class="text-lg">
{{ Math.round(messageCountOutput) }}
</div>
</div>
</div>
</el-col>
<el-col :xs="24" :sm="12" :lg="6" class="mb-4">
<div class="data-box">
<div
class="text-[#f4516c] hover:!text-white hover:bg-[#f4516c] p-3 rounded"
>
<svg-icon icon-class="money" size="3em" />
</div>
<div class="flex flex-col space-y-3">
<div class="text-[var(--el-text-color-secondary)]">收入金额</div>
<div class="text-lg">
{{ Math.round(amountOutput) }}
</div>
</div>
</div>
</el-col>
<el-col :xs="24" :sm="12" :lg="6" class="mb-2">
<div class="data-box">
<div
class="text-[#34bfa3] hover:!text-white hover:bg-[#34bfa3] p-3 rounded"
>
<svg-icon icon-class="shopping" size="3em" />
</div>
<div class="flex flex-col space-y-3">
<div class="text-[var(--el-text-color-secondary)]">订单数</div>
<div class="text-lg">
{{ Math.round(orderCountOutput) }}
</div>
</div>
</div>
</el-col>
</el-row>
<!-- Echarts 图表 -->
<el-row :gutter="40">
<el-col :sm="24" :lg="8" class="mb-4">
<BarChart
id="barChart"
height="400px"
width="100%"
class="bg-[var(--el-bg-color-overlay)]"
/>
</el-col>
<el-col :xs="24" :sm="12" :lg="8" class="mb-4">
<PieChart
id="pieChart"
height="400px"
width="100%"
class="bg-[var(--el-bg-color-overlay)]"
/>
</el-col>
<el-col :xs="24" :sm="12" :lg="8" class="mb-4">
<RadarChart
id="radarChart"
height="400px"
width="100%"
class="bg-[var(--el-bg-color-overlay)]"
/>
</el-col>
</el-row>
</div>
</template>
<style lang="scss" scoped>
.dashboard-container {
position: relative;
padding: 24px;
.user-avatar {
width: 40px;
height: 40px;
border-radius: 50%;
}
.github-corner {
position: absolute;
top: 0;
right: 0;
z-index: 99;
border: 0;
}
.data-box {
display: flex;
justify-content: space-between;
padding: 20px;
font-weight: bold;
color: var(--el-text-color-regular);
background: var(--el-bg-color-overlay);
border-color: var(--el-border-color);
box-shadow: var(--el-box-shadow-dark);
}
.svg-icon {
fill: currentcolor !important;
}
}
</style>

24
src/views/sysworkflow/lowcodepage/appFormList.vue

@ -53,12 +53,14 @@ const pageAppTotal = ref<number>(0) //总记录数
const contList = ref<customerFormCont[]>()
const lookPageIsShow = ref(false)
const loadingApp = ref(false)
/**
@ 作者: 秦东
@ 时间: 2024-03-21 10:54:23
@ 功能: 获取表单列表
*/
const getFormAppList = () => {
loadingApp.value = true
let sendInfo = {
page:pageApp.value,
pagesize:pageAppSize.value,
@ -66,11 +68,13 @@ const getFormAppList = () => {
}
getCustomerFormList(sendInfo)
.then(({ data }) => {
// console.log("-->",data);
console.log("搜索表单-->",data);
pageAppTotal.value = data.total
contList.value = data.list
})
.finally(() => {})
.finally(() => {
loadingApp.value = false
})
}
/**
@ 作者: 秦东
@ -222,12 +226,22 @@ const appKey = ref<string>("")
@ 功能: 编辑app内容
*/
const editAppCont = (val:string) => {
emits('getRongQiAttr')
appKey.value = val.toString();
appPageShow.value = true;
}
/**
@ 作者: 秦东
@ 时间: 2024-04-24 10:44:42
@ 功能: 翻页
*/
const fanyePage = (val: number) =>{
pageApp.value = val
getFormAppList()
}
</script>
<template>
<div>
<div v-loading="loadingApp">
<el-row :gutter="10" >
<el-col v-for="item in contList" :key="item.id" :xs="8" :sm="12" :md="8" :lg="8" :xl="8" style=" margin-top: 10px;">
<el-card class="cardpattern" body-style="padding:5px;">
@ -274,14 +288,14 @@ const editAppCont = (val:string) => {
</el-col>
</el-row>
<div class="formGroupPage">
<el-pagination layout="prev, pager, next" v-model:current-page="pageApp" :page-size="pageAppSize" :total="pageAppTotal" />
<el-pagination layout="prev, pager, next" v-model:current-page="pageApp" :page-size="pageAppSize" :total="pageAppTotal" @current-change="fanyePage" />
</div>
<TableFlow v-model:isopen="openTaskDrawer" :versionid="versionId" :versiontitle="versionTitle" :drawerwith="props.drawerWith" @searchquery="getFormAppList" />
<LowCodeFormPage v-if="addFormIsShow" :drawer-with="props.drawerWith" v-model:form-key="formId" @refreshPage="refreshPage" />
<DesignAPPpage v-model:is-show="appPageShow" v-model:form-key="appKey" :drawer-with="props.drawerWith" @refreshPage="closeAppPage" />
<DesignAPPpage v-model:is-show="appPageShow" v-model:form-key="appKey" :group-key="props.groupId" :drawer-with="props.drawerWith" @refreshPage="getFormAppList" />
<el-drawer
v-model="lookPageIsShow"

9
src/views/sysworkflow/lowcodepage/appPage/appMenuGroup.vue

@ -26,11 +26,18 @@ const props = defineProps({
default:1
}
});
const isNotEdit = ref(false)
const emits = defineEmits(["update:isShow","updateMenu"]);
watch(()=>props.isShow,(val:boolean)=>{
if(val){
console.log("props.appCont",props.appCont)
console.log("props.menuParentKey",props.menuParentKey)
if(props.menuParentKey !=""){
menuGroupInfo.group = props.menuParentKey
isNotEdit.value = true
}else{
isNotEdit.value = false
}
getOldMenuTree()
}
})
@ -51,6 +58,7 @@ const handleClose = () => {
loading.value = false;
emits("updateMenu")
emits("update:isShow",false)
isNotEdit.value = false
resetForm()
}
/**
@ -149,6 +157,7 @@ const saveMenuData = () => {
value-key="id"
check-on-click-node
clearable
:disabled="isNotEdit"
/>
</el-form-item>
</el-form>

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

@ -8,11 +8,23 @@ import type {
AllowDropType,
NodeDropType,
} from 'element-plus/es/components/tree/src/tree.type'
import { appMenuTreeInfo,appSetInfo } from "@/api/date/type"
import { gainAllAppMenu,editAppMenuCont,appMenuShowOrHide,delAppMenu } from '@/api/DesignForm/requestapi'
import SvgIcon from "@/components/SvgIcon/index.vue";
import { threeShiyanData } from "@/api/date/type"
import AppMenuSvgPage from "@/components/IconSelect/appMenuSvgPage.vue";
import AppMenuGroup from "@/views/sysworkflow/lowcodepage/appPage/appMenuGroup.vue"
import EditAppMenuNamePage from "@/views/sysworkflow/lowcodepage/appPage/editAppMenuNamePage.vue"
import CreateAppFormPage from "@/views/sysworkflow/lowcodepage/appPage/createAppFormPage.vue"
const props = defineProps({
appCont:{
type:Object,
default(){
return {}
}
},
formKey:{
type:String,
default:""
@ -22,24 +34,55 @@ const props = defineProps({
default(){
return {}
}
},
drawerWith:{
type:Number,
default:0
},
groupKey:{
type:String,
default:""
}
});
const svgIsShow = ref(false)
const emits = defineEmits(["update:menusTree"]);
const appOenMenu = ref<appMenuTreeInfo>({})
/**
@ 作者: 秦东
@ 时间: 2024-04-24 13:17:30
@ 功能: 菜单列表
*/
const appMenuTree = computed({
get() {
return props.menusTree
},
set(val: any) {
emits('update:menusTree', val)
}
});
/**
@ 作者: 秦东
@ 时间: 2024-04-22 10:06:20
@ 功能: 树移动完毕后执行的操作
*/
const handleDrop = (
draggingNode: Node,
dropNode: Node,
dropType: NodeDropType,
ev: DragEvents
draggingNode: Node,
dropNode: Node,
dropType: NodeDropType,
ev: DragEvents
) => {
console.log('draggingNode:', draggingNode)
console.log('dropNode:', dropNode)
console.log('dropType:', dropType)
console.log('ev:', ev)
let sendCont = {
id:props.appCont.uuid,
menuTree:appMenuTree.value
}
editAppMenuCont(sendCont)
.then((data)=>{
console.log('树移动完毕后执行的操作============>',data)
})
}
const treeList = ref<any[]>([])
@ -102,10 +145,93 @@ const diguiData = (val:any) =>{
}
}
}
/**
@ 作者: 秦东
@ 时间: 2024-04-24 13:12:18
@ 功能: 新建子分组
*/
const menuGroupShow = ref(false)
const menuParentKey = ref("")
const addNewSunMenuGroup = (val:any) =>{
console.log('新建子分组:', val);
menuParentKey.value = val.id
menuGroupShow.value = true
}
/**
@ 作者: 秦东
@ 时间: 2024-04-24 13:22:47
@ 功能: 更新
*/
const gainSunAppContent = () =>{
console.log('更新:');
gainAllAppMenu({id:props.appCont.uuid})
.then((data) =>{
console.log('更新:',data);
appMenuTree.value = data.data
})
}
/**
@ 作者: 秦东
@ 时间: 2024-04-25 13:23:46
@ 功能: 修改名称
*/
const editAppMenuNameShow = ref(false)
const editMenuName = (val:appMenuTreeInfo) =>{
console.log('修改名称:',val);
appOenMenu.value = val
editAppMenuNameShow.value = true
}
/**
@ 作者: 秦东
@ 时间: 2024-05-07 09:00:47
@ 功能: 显示和隐藏菜单
*/
const showOrHide = (val:appMenuTreeInfo,types:number) =>{
console.log('显示和隐藏菜单:',val,types);
let sendInfo = {
types:types,
menuInfo:val
}
appMenuShowOrHide(sendInfo)
.then((data) =>{
console.log('显示和隐藏菜单:',data);
gainSunAppContent()
});
}
/**
@ 作者: 秦东
@ 时间: 2024-05-07 10:03:30
@ 功能: 删除app自定义菜单
*/
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()
});
}
const saveAppFormIsShow = ref(false)
/**
@ 作者: 秦东
@ 时间: 2024-05-07 11:21:39
@ 功能: 新增表单页面
*/
const creetMenuId = ref("")
const createNewPage = (val?:string) => {
creetMenuId.value = val.toString();
saveAppFormIsShow.value = true;
}
</script>
<template>
<CreateAppFormPage v-if="saveAppFormIsShow" v-model:is-show="saveAppFormIsShow" :drawer-with="props.drawerWith" :form-Key="props.formKey" :app-cont="props.appCont" :group-key="props.groupKey" :menu-id="creetMenuId" />
<el-tree
:data="props.menusTree"
:data="appMenuTree"
draggable
default-expand-all
node-key="id"
@ -113,6 +239,7 @@ const diguiData = (val:any) =>{
@node-drop="handleDrop"
>
<template #default="{ node, data }">
<div class="appMenuTitle">
<el-space wrap>
<svg-icon prefix="icon" :icon-class="data.svg" @click="setAppMenusSvg(data)" />
@ -121,22 +248,25 @@ const diguiData = (val:any) =>{
<el-dropdown>
<svg-icon class="svgBox" prefix="icon" icon-class="set" />
<template #dropdown>
<el-dropdown-item>修改名称</el-dropdown-item>
<el-dropdown-item>复制</el-dropdown-item>
<el-dropdown-item>移动到</el-dropdown-item>
<el-dropdown-item divided>新建子分组</el-dropdown-item>
<el-dropdown-item>新建普通表单</el-dropdown-item>
<el-dropdown-item>新建流程表单</el-dropdown-item>
<el-dropdown-item divided>隐藏PC端</el-dropdown-item>
<el-dropdown-item>隐藏移动端</el-dropdown-item>
<el-dropdown-item divided><el-text class="mx-1" type="danger">删除</el-text></el-dropdown-item>
<el-dropdown-item @click="editMenuName(data)">修改名称</el-dropdown-item>
<!-- <el-dropdown-item @click="">复制</el-dropdown-item> -->
<!-- <el-dropdown-item @click="moveMenus(data)">移动到</el-dropdown-item> -->
<el-dropdown-item divided @click="addNewSunMenuGroup(data)">新建子分组</el-dropdown-item>
<!-- <el-dropdown-item @click="">新建普通表单</el-dropdown-item>
<el-dropdown-item @click="">新建流程表单</el-dropdown-item> -->
<el-dropdown-item v-if="data.type==1" @click="createNewPage(data.id)">新建页面</el-dropdown-item>
<el-dropdown-item @click="showOrHide(data,1)" divided><el-text v-if="data.pcIsShow==1">隐藏PC端</el-text><el-text v-else>取消-隐藏PC端</el-text></el-dropdown-item>
<el-dropdown-item @click="showOrHide(data,2)"><el-text v-if="data.wapIsShow==1">隐藏移动端</el-text><el-text v-else>取消-隐藏移动端</el-text></el-dropdown-item>
<el-dropdown-item @click="editAppMenu(data)" divided><el-text class="mx-1" type="danger">删除</el-text></el-dropdown-item>
</template>
</el-dropdown>
</div>
</template>
</el-tree>
<AppMenuSvgPage v-model:is-show="svgIsShow" v-model:svg-name="svgName" :icon-list="allIconNames" />
<AppMenuSvgPage v-model:is-show="svgIsShow" v-model:svg-name="svgName" :svg-id="svgId" :icon-list="allIconNames" />
<AppMenuGroup v-model:is-show="menuGroupShow" :menu-parent-key="menuParentKey" :app-cont="props.appCont" @updateMenu="gainSunAppContent" />
<EditAppMenuNamePage v-model:is-show="editAppMenuNameShow" :menu-cont="appOenMenu" @updateMenu="gainSunAppContent" />
</template>
<style lang='scss' scoped>
.appMenuTitle{

17
src/views/sysworkflow/lowcodepage/appPage/appPageForm/pageFlow.vue

@ -0,0 +1,17 @@
<!--
@ 作者: 秦东
@ 时间: 2024-05-07 15:07:51
@ 备注: 表单流程
-->
<script lang='ts' setup>
</script>
<template>
<el-main class="mainBox">Main</el-main>
</template>
<style lang='scss' scoped>
.mainBox{
padding: 0;
overflow-y : auto;
}
</style>

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

@ -0,0 +1,135 @@
<!--
@ 作者: 秦东
@ 时间: 2024-05-07 15:05:29
@ 备注: 自定义表单
-->
<script lang='ts' setup>
import { useRoute, useRouter } from 'vue-router'
import { json2string,objToStringify,string2json,stringToObj } from '@/utils/DesignForm/form'
import { customerFormVersionCont } from '@/api/DesignForm/type'
import { FormData,formStruct,DrawerStruct, VideoMsg } from '@/api/DesignForm/types'
//
import DragControlApp from '@/components/DesignForm/dragControlApp.vue';
const props = defineProps({
appCont:{
type:Object,
default(){
return {}
}
},
formKey:{
type:String,
default:""
},
groupKey:{
type:String,
default:""
},
formVersion:{
type:String,
default:""
},
formconfigcont:{
type:Object,
default(){
return {}
}
},
state:{
type:Object,
default(){
return {}
}
}
});
const emits = defineEmits<{
(e: 'update:state', val: formStruct): void
(e: 'update:formKey', val: string): void
(e: 'update:formVersion', val: string): void
(e: 'judgeFormIsEdit', val: boolean): void
(e: 'runNextWindows', val: number): void
(e: 'closeFormPage'): void
}>()
const state = computed({
get() {
return props.state
},
set(val: formStruct) {
emits('update:state', val)
}
});
provide('formDesignType', state.value.designType)
const appFormKeyVal = computed({
get() {
return props.formKey
},
set(val: formStruct) {
emits('update:formKey', val)
}
});
const versionCont = ref<customerFormVersionCont[]>([]) //
const tableKey = ref("")
//
const searchCheckField = (data: FormData) => {
state.value.formData.list.push(data)
}
//
const selectTemplate = (data: FormData) => {
state.value.formData = stringToObj(objToStringify(data))
}
//
const editversionstaus = (id:string) =>{
}
//
const openAceEditDrawer = (params: any) => {
}
</script>
<template>
<el-aside class="asideBox leftBox">
<DragControlApp
:table-key="state.formData.form.name"
@versionUpdateForm="versionUpdateForm"
/>
</el-aside>
<el-main class="mainBox rightBox">
{{state.formData.config}}
</el-main>
<el-aside class="asideBox">
<formControlProperties
ref="formControlAttrEl"
v-model:formOtherData="state.formOtherData"
:form-data="state.formData.form"
:form-config="state.formData.config"
:customerformid="tableKey"
:form-list="state.formData.list"
:form-info="state.formData"
@open-dialog="openAceEditDrawer"
/>
</el-aside>
</template>
<style lang='scss' scoped>
.asideBox{
height: calc(100vh - 40px);
overflow-y : auto;
.leftBox{
width: 250px;
}
.rightBox{
width: 300px;
}
}
.mainBox{
border-left: 1px solid #ECECEC;
border-right: 1px solid #ECECEC;
padding: 0;
overflow-y : auto;
}
</style>

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

@ -0,0 +1,25 @@
<!--
@ 作者: 秦东
@ 时间: 2024-05-07 15:09:21
@ 备注: 表单列表
-->
<script lang='ts' setup>
</script>
<template>
<el-main class="mainBox">Main</el-main>
<el-aside class="asideBox">Aside</el-aside>
</template>
<style lang='scss' scoped>
.asideBox{
height: calc(100vh - 40px);
width: 300px;
overflow-y : auto;
}
.mainBox{
border-left: 1px solid #ECECEC;
border-right: 1px solid #ECECEC;
padding: 0;
overflow-y : auto;
}
</style>

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

@ -0,0 +1,187 @@
<!--
@ 作者: 秦东
@ 时间: 2024-05-07 11:26:40
@ 备注: 编辑表单
-->
<script lang='ts' setup>
import { useRoute, useRouter } from 'vue-router'
import { customerFormConfig,formStruct } from '@/api/DesignForm/types'
import { getProductionMarkForm } from '@/api/DesignForm/requestapi'
import PageForm from "@/views/sysworkflow/lowcodepage/appPage/appPageForm/pageForm.vue"
import PageFlow from "@/views/sysworkflow/lowcodepage/appPage/appPageForm/pageFlow.vue"
import PageList from "@/views/sysworkflow/lowcodepage/appPage/appPageForm/pageList.vue"
const props = defineProps({
appCont:{
type:Object,
default(){
return {}
}
},
isShow:{
type: Boolean,
default: false,
},
drawerWith:{
type:Number,
default:0
},
formKey:{
type:String,
default:""
},
groupKey:{
type:String,
default:""
},
menuId:{
type:String,
default:""
}
});
const emits = defineEmits(["update:isShow"]);
const tabsActive = ref(1)
const route: any = useRoute().query || {}
const formConfigCont = reactive<customerFormConfig>({
formName:"",
formlogo:""
})
//ID
const formVersion = ref<string>("")
const state = reactive<formStruct>({
formData: {
list: [],
form: {
size: 'default',
name:'',
formName: formConfigCont.formName
},
config: {
groupKey:props.groupKey
},
styles:{
divStyle:{},
labelStyle:{},
inputStyle:{}
},
purview:[]
},
editor: {},
loading: false,
formDataPreview: {},
previewVisible: false, //
designType: route.type, // search
formDict: {},
formOtherData: {
source: route.source || '',
formName: formConfigCont.formName
}
})
/**
@ 作者: 秦东
@ 时间: 2024-05-07 15:11:24
@ 功能: 关闭页面
*/
const closeSavePageForm = () =>{
emits("update:isShow",false)
}
onBeforeMount(() => {
getProductionMarkForm()
.then(({data})=>{
formConfigCont.formlogo = data.formlogo
formConfigCont.formName = data.formname
state.formData.form.name = data.formlogo
state.formData.form.formName = data.formname
state.formOtherData.formName = data.formname
})
.finally(()=>{
})
})
</script>
<template>
<el-drawer v-model="props.isShow" title="设置/编辑自定义表单" :with-header="false" :close-on-click-modal="false" :close-on-press-escape="false" :destroy-on-close="true" :size="props.drawerWith">
<div class="common-layout">
<el-container>
<el-header class="headerBox">
<div class="headLeft">
<el-space wrap>
<el-avatar shape="square" :size="25" :src="props.appCont.appSvg" />
<el-tooltip
class="box-item"
effect="dark"
:content="props.appCont.appName"
placement="bottom"
>
<el-text class="w-150px mb-2" truncated>{{ props.appCont.appName }}</el-text>
</el-tooltip>
<i class="fa fa-angle-right"></i>
<el-tooltip
class="box-item"
effect="dark"
:content="state.formData.form.formName"
placement="bottom"
>
<el-text class="w-150px mb-2" truncated>{{ state.formData.form.formName }}</el-text>
</el-tooltip>
</el-space>
</div>
<div>
<el-tabs v-model="tabsActive" @tab-click="handleClick" :stretch="true" class="tabsMain">
<el-tab-pane label="① 页面管理" :name="1">
</el-tab-pane>
<el-tab-pane label="② 流程设计" :name="2">
</el-tab-pane>
<el-tab-pane label="③ 列表设计" :name="3">
</el-tab-pane>
</el-tabs>
</div>
<div class="headRight">
{{props.groupKey}}
<el-button type="danger" size="small" @click="closeSavePageForm" >关闭</el-button>
</div>
</el-header>
<el-container>
<PageForm v-if="tabsActive==1" :form-Key="props.formKey" :app-cont="props.appCont" :group-key="props.groupKey" v-model:state="state" v-model:form-version="formVersion" :formconfigcont="formConfigCont" />
<PageFlow v-if="tabsActive==2" :form-Key="props.formKey" :app-cont="props.appCont" :group-key="props.groupKey" />
<PageList v-if="tabsActive==3" :form-Key="props.formKey" :app-cont="props.appCont" :group-key="props.groupKey" />
</el-container>
</el-container>
</div>
</el-drawer>
</template>
<style lang='scss' scoped>
.headerBox{
padding: 0px;
border-bottom: 2px solid #ECECEC;
display: flex;
align-items: center;
justify-content: space-between;
.headLeft{
width: 300px;
padding-left: 5px;
span{
max-width:100px;
}
}
.headRight{
width: 300px;
text-align: right;
padding-right: 5px;
}
.tabsMain{
::v-deep .el-tabs__header{
margin: 0px;
}
::v-deep .el-tabs__nav-scroll{
margin: 0 auto!important;
}
::v-deep .el-drawer__body{
padding: 0;
}
}
}
</style>

112
src/views/sysworkflow/lowcodepage/appPage/editAppMenuNamePage.vue

@ -0,0 +1,112 @@
<!--
@ 作者: 秦东
@ 时间: 2024-04-25 13:30:19
@ 备注: 修改自定义应用菜单
-->
<script lang='ts' setup>
import { appMenuTreeInfo } from "@/api/date/type"
import { editAppMenuLable } from '@/api/DesignForm/requestapi'
const props = defineProps({
isShow:{
type: Boolean,
default: false,
},
menuCont:{
type:Object,
default(){
return {}
}
},
});
const saveMenuName = ref(ElForm);
const loading = ref(false)
const emits = defineEmits(["update:isShow","updateMenu"]);
const appMenuInfo = ref<appMenuTreeInfo>({})
//
watch(()=>props.isShow,(val:boolean)=>{
if(val){
appMenuInfo.value = props.menuCont
}
})
/**
@ 作者: 秦东
@ 时间: 2024-04-25 13:39:46
@ 功能: 关闭页面
*/
const handleClose = () => {
loading.value = false;
emits("updateMenu")
emits("update:isShow",false)
resetForm()
}
/**
@ 作者: 秦东
@ 时间: 2024-04-24 09:33:56
@ 功能: 重置表单
*/
const resetForm = () => {
saveMenuName.value.resetFields();
saveMenuName.value.clearValidate();
appMenuInfo.label = "";
}
/**
@ 作者: 秦东
@ 时间: 2024-04-24 09:29:59
@ 功能: 表单验证规则
*/
const rules = reactive({
label: [{ required: true, message: "请输入名称", trigger: "blur" }],
});
/**
@ 作者: 秦东
@ 时间: 2024-04-25 13:44:42
@ 功能: 提交数据
*/
const saveMenuData = () => {
loading.value = true;
saveMenuName.value.validate((valid: any) => {
if (valid) {
editAppMenuLable({id:appMenuInfo.value.id, label:appMenuInfo.value.label})
.then((data) =>{
console.log("提交数据", data)
ElMessage({
message: data.msg,
type: 'success',
});
handleClose();
})
}else{
loading.value = false;
}
})
}
</script>
<template>
<el-dialog
v-model="props.isShow"
title="编辑名称"
width="500"
:before-close="handleClose"
>
<el-form
ref="saveMenuName"
:model="appMenuInfo"
:rules="rules"
label-width="120px"
>
<el-form-item label="名称" prop="label">
<el-input v-model="appMenuInfo.label" clearable placeholder="请输入名称" />
</el-form-item>
</el-form>
<template #footer>
<div class="dialog-footer">
<el-button @click="handleClose">取消</el-button>
<el-button type="primary" v-loading="loading" :disabled="loading" @click="saveMenuData">确定</el-button>
</div>
</template>
</el-dialog>
</template>
<style lang='scss' scoped>
</style>

34
src/views/sysworkflow/lowcodepage/appPage/index.vue

@ -24,12 +24,16 @@ const props = defineProps({
isShow:{
type: Boolean,
default: false,
},
groupKey:{
type:String,
default:""
}
});
const emits = defineEmits(["update:isShow","update:svgName","refreshPage"]);
const squareUrl = 'https://cube.elemecdn.com/9/c2/f0ee8a3c7c9638a54940382568c9dpng.png'
const drawerOpenOrClose = ref(false)
const tabsActive = ref("1")
const tabsActive = ref(1)
const menusTree = ref<appMenuTreeInfo[]>([])
const appCont = reactive<appSetInfo>({
appKey:"1",
@ -97,11 +101,18 @@ const addMenu = (key?:string) => {
}
menuGroupShow.value = true;
}
/**
@ 作者: 秦东
@ 时间: 2024-05-06 11:09:44
@ 功能: 创建页面
*/
const addAppPageForm = (key?:string) => {
}
</script>
<template>
<div class="drawerClass">
<AppMenuGroup v-model:is-show="menuGroupShow" :menu-parent-key="menuParentKey" :app-cont="appCont" @updateMenu="gainAppContent" />
<el-drawer v-model="props.isShow" title="设置/编辑自定义表单" :with-header="false" :close-on-click-modal="false" :close-on-press-escape="false" :destroy-on-close="true" :size="props.drawerWith">
<div class="common-layout">
<el-container>
@ -145,7 +156,7 @@ const addMenu = (key?:string) => {
<el-button type="primary" class="fa fa-plus" />
<template #dropdown>
<el-dropdown-menu>
<el-dropdown-item >
<!-- <el-dropdown-item >
<el-row>
<el-col :span="24">
<el-space wrap>
@ -170,6 +181,19 @@ const addMenu = (key?:string) => {
任务协同业务审批
</el-col>
</el-row>
</el-dropdown-item> -->
<el-dropdown-item @click="addAppPageForm">
<el-row>
<el-col :span="24">
<el-space wrap>
<svg-icon style="color: #eebe77;" prefix="icon" icon-class="liuChengBiaoDan" />
新建页面
</el-space>
</el-col>
<el-col :span="24" style="padding-left:20px; font-size:12px;">
数据收集事件记录<br>任务协同业务审批
</el-col>
</el-row>
</el-dropdown-item>
<el-dropdown-item divided @click="addMenu">
<el-row>
@ -233,7 +257,7 @@ const addMenu = (key?:string) => {
</el-menu-item>
</el-menu> -->
<AppMenus :form-Key="formKey" :menus-tree="menusTree" />
<AppMenus :form-Key="props.formKey" v-model:menus-tree="menusTree" :group-key="props.groupKey" :app-cont="appCont" :drawer-with="props.drawerWith" />
@ -247,7 +271,7 @@ const addMenu = (key?:string) => {
</el-container>
</el-container>
</div>
<AppMenuGroup v-model:is-show="menuGroupShow" :menu-parent-key="menuParentKey" :app-cont="appCont" @updateMenu="gainAppContent" />
</el-drawer >
</div>
</template>

3
src/views/sysworkflow/lowcodepage/index.vue

@ -56,6 +56,7 @@ const handleCommand = (command: string,groupId: string) => {
createApp(sendInfo)
.then((data)=>{
formKey.value = data.data.uuid
groupKey.value = groupId.toString()
nextTick(() =>{
appPageShow.value = true
});
@ -209,7 +210,7 @@ const getRongQiAttr = () => {
<el-pagination layout="prev, pager, next" v-model:current-page="page" :page-size="pageSize" :total="pageTotal" />
</div>
<DesignAPPpage v-model:is-show="appPageShow" :drawer-with="drawerWith" v-model:form-key="formKey" @refreshPage="refreshPage" />
<DesignAPPpage v-model:is-show="appPageShow" :drawer-with="drawerWith" v-model:form-key="formKey" :group-key="groupKey" @refreshPage="refreshPage" />
<LowCodeFormPage v-if="addFormIsShow" :drawer-with="drawerWith" v-model:form-key="formKey" :form-group-key="formGroupKey" @refreshPage="refreshPage" />
<LowCodeFormGroupPage v-if="addFormGroupIsShow" :drawer-with="drawerGroupWith" :group-key="groupKey" @refreshPage="refreshPage" />

19
src/views/sysworkflow/lowcodepage/pageDesignes.vue

@ -19,6 +19,7 @@ import { submitAndCancelButton,cancelButton,submitButton } from "@/api/DesignFor
//
import DragControl from '@/components/DesignForm/dragControl.vue';
import DragControlNew from '@/components/DesignForm/dragControlNew.vue';
import HeadTools from '@/components/DesignForm/public/headTools.vue';
// import HeadTools from '@/components/DesignForm/public/headToolsNew.vue';
import FormDesign from '@/components/DesignForm/public/form/form.vue'
@ -55,6 +56,7 @@ const emits = defineEmits<{
(e: 'judgeFormIsEdit', val: boolean): void
(e: 'runNextWindows', val: number): void
(e: 'closeFormPage'): void
(e: 'verTabsClick'): void
}>()
const state = computed({
@ -565,16 +567,31 @@ onMounted(() => {
// watch(() =>versionId.value ,(val:string)=>{
// emits('update:formVersion', val)
// })
/**
@ 作者: 秦东
@ 时间: 2024-05-09 14:29:06
@ 功能: 根据启用版本进行加载页面
*/
const versionUpdateForm = (val:string) => {
console.log("加载异常-------111------->",val)
versionId.value = val
getInitData()
}
</script>
<template>
<div class="design_container">
<DragControl
<!-- <DragControl
v-model:versionid="versionId"
:formid="state.formOtherData.source"
:versioncont="versionCont"
@click-check="searchCheckField"
@click="selectTemplate"
@editversionstaus="editversionstaus"
/> -->
<DragControlNew
:table-key="state.formData.form.name"
@versionUpdateForm="versionUpdateForm"
/>
<div class="main-body">
<HeadTools v-loading="state.loading" :customerformid="formKeyVal" @click="headToolClick" />

Loading…
Cancel
Save