Browse Source

自定义应用页面

v8_master
超级管理员 2 years ago
parent
commit
2d257a3156
  1. 24
      src/api/DesignForm/requestapi.ts
  2. 6
      src/components/IconSelect/appMenuSvgPage.vue
  3. 8
      src/types/components.d.ts
  4. 91
      src/views/sysworkflow/lowcodepage/appPage/appMenus.vue
  5. 17
      src/views/sysworkflow/lowcodepage/appPage/appPageForm/pageFlow.vue
  6. 26
      src/views/sysworkflow/lowcodepage/appPage/appPageForm/pageForm.vue
  7. 25
      src/views/sysworkflow/lowcodepage/appPage/appPageForm/pageList.vue
  8. 121
      src/views/sysworkflow/lowcodepage/appPage/createAppFormPage.vue
  9. 112
      src/views/sysworkflow/lowcodepage/appPage/editAppMenuNamePage.vue
  10. 26
      src/views/sysworkflow/lowcodepage/appPage/index.vue

24
src/api/DesignForm/requestapi.ts

@ -391,3 +391,27 @@ export function editAppMenuCont(data: any) {
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
});
}

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()
}

8
src/types/components.d.ts

@ -32,6 +32,7 @@ declare module '@vue/runtime-core' {
ElCard: typeof import('element-plus/es')['ElCard']
ElCarousel: typeof import('element-plus/es')['ElCarousel']
ElCarouselItem: typeof import('element-plus/es')['ElCarouselItem']
ElCascader: typeof import('element-plus/es')['ElCascader']
ElCheckbox: typeof import('element-plus/es')['ElCheckbox']
ElCheckboxGroup: typeof import('element-plus/es')['ElCheckboxGroup']
ElCol: typeof import('element-plus/es')['ElCol']
@ -63,6 +64,7 @@ declare module '@vue/runtime-core' {
ElPagination: typeof import('element-plus/es')['ElPagination']
ElPopconfirm: typeof import('element-plus/es')['ElPopconfirm']
ElPopover: typeof import('element-plus/es')['ElPopover']
ElProgress: typeof import('element-plus/es')['ElProgress']
ElRadio: typeof import('element-plus/es')['ElRadio']
ElRadioButton: typeof import('element-plus/es')['ElRadioButton']
ElRadioGroup: typeof import('element-plus/es')['ElRadioGroup']
@ -111,7 +113,13 @@ declare module '@vue/runtime-core' {
IconSelect: typeof import('./../components/IconSelect/index.vue')['default']
IEpCaretBottom: typeof import('~icons/ep/caret-bottom')['default']
IEpClose: typeof import('~icons/ep/close')['default']
IEpDelete: typeof import('~icons/ep/delete')['default']
IEpEdit: typeof import('~icons/ep/edit')['default']
IEpPlus: typeof import('~icons/ep/plus')['default']
IEpRefresh: typeof import('~icons/ep/refresh')['default']
IEpSearch: typeof import('~icons/ep/search')['default']
IEpSetting: typeof import('~icons/ep/setting')['default']
IEpView: typeof import('~icons/ep/view')['default']
LangSelect: typeof import('./../components/LangSelect/index.vue')['default']
LayoutPage: typeof import('./../components/DesignForm/layoutPage/index.vue')['default']
List: typeof import('./../components/DesignForm/public/form/components/list.vue')['default']

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

@ -8,13 +8,15 @@ import type {
AllowDropType,
NodeDropType,
} from 'element-plus/es/components/tree/src/tree.type'
import { gainAllAppMenu,editAppMenuCont } from '@/api/DesignForm/requestapi'
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:{
@ -32,10 +34,15 @@ const props = defineProps({
default(){
return {}
}
}
},
drawerWith:{
type:Number,
default:0
},
});
const svgIsShow = ref(false)
const emits = defineEmits(["update:menusTree"]);
const appOenMenu = ref<appMenuTreeInfo>({})
/**
@ 作者: 秦东
@ 时间: 2024-04-24 13:17:30
@ -159,9 +166,64 @@ const gainSunAppContent = () =>{
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 createNewPage = () => {
saveAppFormIsShow.value = true;
}
</script>
<template>
<AppMenuGroup v-model:is-show="menuGroupShow" :menu-parent-key="menuParentKey" :app-cont="props.appCont" @updateMenu="gainSunAppContent" />
<CreateAppFormPage v-if="saveAppFormIsShow" v-model:is-show="saveAppFormIsShow" :drawer-with="props.drawerWith" :app-cont="props.appCont" />
<el-tree
:data="appMenuTree"
draggable
@ -179,22 +241,25 @@ const gainSunAppContent = () =>{
<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 @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>新建普通表单</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="">新建普通表单</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>

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

@ -0,0 +1,26 @@
<!--
@ 作者: 秦东
@ 时间: 2024-05-07 15:05:29
@ 备注: 自定义表单
-->
<script lang='ts' setup>
</script>
<template>
<el-aside class="asideBox">Aside</el-aside>
<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>

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>

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

@ -0,0 +1,121 @@
<!--
@ 作者: 秦东
@ 时间: 2024-05-07 11:26:40
@ 备注: 编辑表单
-->
<script lang='ts' setup>
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
},
});
const emits = defineEmits(["update:isShow"]);
const tabsActive = ref(1)
/**
@ 作者: 秦东
@ 时间: 2024-05-07 15:11:24
@ 功能: 关闭页面
*/
const closeSavePageForm = () =>{
emits("update:isShow",false)
}
</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="props.appCont.appName"
placement="bottom"
>
<el-text class="w-150px mb-2" truncated>未命名表单</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">
<el-button type="danger" size="small" @click="closeSavePageForm" >关闭</el-button>
</div>
</el-header>
<el-container>
<PageForm v-if="tabsActive==1" />
<PageFlow v-if="tabsActive==2" />
<PageList v-if="tabsActive==3" />
</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>

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

@ -29,7 +29,7 @@ const props = defineProps({
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,7 +97,14 @@ const addMenu = (key?:string) => {
}
menuGroupShow.value = true;
}
/**
@ 作者: 秦东
@ 时间: 2024-05-06 11:09:44
@ 功能: 创建页面
*/
const addAppPageForm = (key?:string) => {
}
</script>
<template>
<div class="drawerClass">
@ -145,7 +152,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 +177,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 +253,7 @@ const addMenu = (key?:string) => {
</el-menu-item>
</el-menu> -->
<AppMenus :form-Key="formKey" v-model:menus-tree="menusTree" :app-cont="appCont" />
<AppMenus :form-Key="formKey" v-model:menus-tree="menusTree" :app-cont="appCont" :drawer-with="props.drawerWith" />

Loading…
Cancel
Save