|
|
@@ -3,313 +3,30 @@ meta:
|
|
|
enabled: false
|
|
|
</route>
|
|
|
|
|
|
-<script lang="ts" setup name="model_object_List">
|
|
|
-import { ElMessage, ElMessageBox } from 'element-plus'
|
|
|
-import ModelObjectComponent from '../object/components/ModelObject.vue'
|
|
|
-import ModelComponent from './components/Model.vue'
|
|
|
+<script lang="ts" setup>
|
|
|
+import LeftModelListComponent from './components/ModelList.vue'
|
|
|
+import ObjectListComponent from './components/ObjectList.vue'
|
|
|
+const modelListRef = ref()
|
|
|
+const objectListRef = ref()
|
|
|
|
|
|
-import { deleteModelById, getModelByList } from '@/api/model/modelApi'
|
|
|
-import { deleteObjectById, getObjectByList } from '@/api/model/modelObjectApi'
|
|
|
-import useSettingsStore from '@/store/modules/settings'
|
|
|
-
|
|
|
-const settingsStore = useSettingsStore()
|
|
|
-const router = useRouter()
|
|
|
-const tabbar = useTabbar()
|
|
|
-
|
|
|
-interface TreeNode {
|
|
|
- label: string
|
|
|
- isLeaf: boolean
|
|
|
- modelId: number
|
|
|
- children?: TreeNode[]
|
|
|
-}
|
|
|
-
|
|
|
-interface Object {
|
|
|
- modelId: number
|
|
|
- objectId: number
|
|
|
- objectTitle: string
|
|
|
- objectCode: string
|
|
|
- comment: string
|
|
|
-}
|
|
|
-
|
|
|
-const state = reactive({
|
|
|
- loading: false,
|
|
|
- keywords: '',
|
|
|
- treeData: [] as TreeNode[],
|
|
|
- curModelId: 0,
|
|
|
- objectList: [] as Object[],
|
|
|
- dialogState: 1,
|
|
|
- search: {
|
|
|
- keywords: '',
|
|
|
- },
|
|
|
-})
|
|
|
-
|
|
|
-const leftTreeRef = ref()
|
|
|
-const modelRef = ref()
|
|
|
-const getObjectData = async () => {
|
|
|
- const curModelId = state.curModelId
|
|
|
- if (curModelId > 0) {
|
|
|
- state.loading = true
|
|
|
- const { data } = await getObjectByList({ modelId: curModelId })
|
|
|
- state.objectList = data
|
|
|
- state.loading = false
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
-const getModelData = async () => {
|
|
|
- const { data } = await getModelByList('')
|
|
|
- const treeNodes: TreeNode[] = []
|
|
|
- data.forEach((item: any) => {
|
|
|
- return treeNodes.push({
|
|
|
- label: item.modelTitle,
|
|
|
- modelId: item.modelId,
|
|
|
- isLeaf: true,
|
|
|
- })
|
|
|
- })
|
|
|
- state.treeData = treeNodes
|
|
|
-
|
|
|
- if (data && data.length > 0) {
|
|
|
- state.curModelId = data[0].modelId
|
|
|
- nextTick(() => {
|
|
|
- leftTreeRef.value.setCurrentKey(data[0].modelId)
|
|
|
- })
|
|
|
- await getObjectData()
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
-onMounted(() => {
|
|
|
- getModelData()
|
|
|
-})
|
|
|
-
|
|
|
-// 模型新增
|
|
|
-const onModelAdd = () => {
|
|
|
- modelRef.value.showAddModel()
|
|
|
-}
|
|
|
-
|
|
|
-// 模型编辑
|
|
|
-const onModelEdit = (data: { modelId: number }) => {
|
|
|
- const modelId = data.modelId
|
|
|
- modelRef.value.showEditModel(modelId)
|
|
|
-}
|
|
|
-
|
|
|
-// 模型删除
|
|
|
-const onModelDelete = (data: any) => {
|
|
|
- ElMessageBox.confirm(`确认删除「${data.modelTitle}」吗?`, '确认信息').then(async () => {
|
|
|
- const { msg } = await deleteModelById(data.modelId)
|
|
|
- ElMessage.success(msg)
|
|
|
- await getModelData()
|
|
|
- })
|
|
|
-}
|
|
|
-
|
|
|
-// 模型选择
|
|
|
-const onTreeNodeClick = (node: TreeNode) => {
|
|
|
- if (node.isLeaf) {
|
|
|
- state.curModelId = node.modelId
|
|
|
- getObjectData()
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
-const modelObjectTableRef = ref()
|
|
|
-const modelObjectRef = ref()
|
|
|
-
|
|
|
-// 检索对象
|
|
|
-const onSearch = () => {
|
|
|
- getObjectData()
|
|
|
-}
|
|
|
-
|
|
|
-// 新增对象
|
|
|
-const onObjectAdd = () => {
|
|
|
- const modelId = state.curModelId
|
|
|
- if (modelId > 0) {
|
|
|
- modelObjectRef.value.showAddModel(modelId)
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
-// 详情
|
|
|
-const onObjectDetails = (row: { modelId: any; objectId: any }) => {
|
|
|
- if (settingsStore.settings.tabbar.enable && settingsStore.settings.tabbar.mergeTabsBy !== 'activeMenu') {
|
|
|
- tabbar.open({
|
|
|
- name: 'modelObjectDetails',
|
|
|
- params: {
|
|
|
- modelId: row.modelId,
|
|
|
- objectId: row.objectId,
|
|
|
- },
|
|
|
- })
|
|
|
- }
|
|
|
- else {
|
|
|
- router.push({
|
|
|
- name: 'modelObjectDetails',
|
|
|
- params: {
|
|
|
- modelId: row.modelId,
|
|
|
- objectId: row.objectId,
|
|
|
- },
|
|
|
- })
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
-const onObjectOAM = (row: any) => {
|
|
|
- if (settingsStore.settings.tabbar.enable && settingsStore.settings.tabbar.mergeTabsBy !== 'activeMenu') {
|
|
|
- tabbar.open({
|
|
|
- name: 'modelObjectOAM',
|
|
|
- params: {
|
|
|
- modelId: row.modelId,
|
|
|
- objectId: row.objectId,
|
|
|
- },
|
|
|
- })
|
|
|
- }
|
|
|
- else {
|
|
|
- router.push({
|
|
|
- name: 'modelObjectOAM',
|
|
|
- params: {
|
|
|
- modelId: row.modelId,
|
|
|
- objectId: row.objectId,
|
|
|
- },
|
|
|
- })
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
-// 删除对象
|
|
|
-const onObjectDelete = (row: any) => {
|
|
|
- const { modelId, objectId, objectTitle } = row
|
|
|
- ElMessageBox.confirm(`确认删除「${objectTitle}」吗?`, '确认信息').then(async () => {
|
|
|
- const { msg } = await deleteObjectById(modelId, objectId)
|
|
|
- ElMessage.success(msg)
|
|
|
- await getObjectData()
|
|
|
- })
|
|
|
+const onItemSelect = (modelId: number) => {
|
|
|
+ objectListRef.value.loadData(modelId)
|
|
|
}
|
|
|
</script>
|
|
|
|
|
|
<template>
|
|
|
<div class="absolute-container">
|
|
|
- <tool-header title="数据模型">
|
|
|
- <template #right>
|
|
|
- <el-button v-waves.float type="primary" @click="onModelAdd">
|
|
|
- <template #icon>
|
|
|
- <el-icon>
|
|
|
- <svg-icon name="i-ep:plus" />
|
|
|
- </el-icon>
|
|
|
- </template>
|
|
|
- 数据模型
|
|
|
- </el-button>
|
|
|
- </template>
|
|
|
- </tool-header>
|
|
|
+ <tool-header title="元数据模型" />
|
|
|
|
|
|
<div class="page-main">
|
|
|
<LayoutContainer left-side-width="250px" hide-left-side-toggle>
|
|
|
<template #leftSide>
|
|
|
- <el-scrollbar class="tree">
|
|
|
- <ElTree ref="leftTreeRef" :data="state.treeData" default-expand-all node-key="modelId" @node-click="onTreeNodeClick">
|
|
|
- <template #default="{ node, data }">
|
|
|
- <div class="custom-tree-node">
|
|
|
- <div class="label" :title="node.label">
|
|
|
- <el-icon v-if="data.isLeaf" size="16px" style="margin-right: 5px;">
|
|
|
- <svg-icon name="bx:bxs-component" />
|
|
|
- </el-icon>
|
|
|
- <div class="text">
|
|
|
- {{ data.label }}
|
|
|
- </div>
|
|
|
- </div>
|
|
|
- <div v-if="data.isLeaf" class="actions">
|
|
|
- <el-button-group>
|
|
|
- <el-button type="info" plain size="small" @click.stop="onModelEdit(data)">
|
|
|
- <template #icon>
|
|
|
- <el-icon>
|
|
|
- <svg-icon name="i-ep:edit" />
|
|
|
- </el-icon>
|
|
|
- </template>
|
|
|
- </el-button>
|
|
|
-
|
|
|
- <el-button type="danger" plain size="small" @click.stop="onModelDelete(data)">
|
|
|
- <template #icon>
|
|
|
- <el-icon>
|
|
|
- <svg-icon name="i-ep:delete" />
|
|
|
- </el-icon>
|
|
|
- </template>
|
|
|
- </el-button>
|
|
|
- </el-button-group>
|
|
|
- </div>
|
|
|
- </div>
|
|
|
- </template>
|
|
|
- </ElTree>
|
|
|
- </el-scrollbar>
|
|
|
+ <LeftModelListComponent ref="modelListRef" @onItemSelect="onItemSelect" />
|
|
|
</template>
|
|
|
|
|
|
- <div class="container">
|
|
|
- <tool-bar>
|
|
|
- <template #right>
|
|
|
- <el-input v-model="state.search.keywords" placeholder="请输入名称,支持模糊查询" style="padding-right: 10px;" clearable />
|
|
|
- <el-button type="primary" @click="onSearch">
|
|
|
- <template #icon>
|
|
|
- <el-icon>
|
|
|
- <svg-icon name="i-ep:search" />
|
|
|
- </el-icon>
|
|
|
- </template>
|
|
|
- </el-button>
|
|
|
-
|
|
|
- <el-button size="default" @click.stop="onObjectAdd">
|
|
|
- <template #icon>
|
|
|
- <el-icon>
|
|
|
- <svg-icon name="i-ep:plus" />
|
|
|
- </el-icon>
|
|
|
- </template>
|
|
|
- 数据对象
|
|
|
- </el-button>
|
|
|
- </template>
|
|
|
- </tool-bar>
|
|
|
-
|
|
|
- <el-table ref="modelObjectTableRef" v-loading="state.loading" class="list-table" :data="state.objectList" size="small" border stripe highlight-current-row height="100%">
|
|
|
- <el-table-column type="index" label="序号" header-align="center" align="center" width="60" />
|
|
|
-
|
|
|
- <el-table-column prop="objectTitle" label="名称" header-align="center" align="center" width="200">
|
|
|
- <template #default="scope">
|
|
|
- <div>
|
|
|
- <el-icon>
|
|
|
- <svg-icon name="uim:box" />
|
|
|
- </el-icon>
|
|
|
- <span>{{ scope.row.objectTitle }}</span>
|
|
|
- </div>
|
|
|
- </template>
|
|
|
- </el-table-column>
|
|
|
-
|
|
|
- <el-table-column prop="objectCode" label="代码" header-align="center" align="center" width="150">
|
|
|
- <template #default="scope">
|
|
|
- <span>{{ scope.row.objectCode }}</span>
|
|
|
- </template>
|
|
|
- </el-table-column>
|
|
|
-
|
|
|
- <el-table-column prop="objectType" label="类型" header-align="center" align="center" width="150">
|
|
|
- <template #default="scope">
|
|
|
- <span v-if="scope.row.objectType === 1">实体对象</span>
|
|
|
- <span v-else>视图对象</span>
|
|
|
- </template>
|
|
|
- </el-table-column>
|
|
|
-
|
|
|
- <el-table-column prop="comment" label="说明" header-align="center" align="left">
|
|
|
- <template #default="scope">
|
|
|
- <span>{{ scope.row.comment }}</span>
|
|
|
- </template>
|
|
|
- </el-table-column>
|
|
|
-
|
|
|
- <el-table-column label="操作" header-align="center" align="center" width="220">
|
|
|
- <template #default="scope">
|
|
|
- <div>
|
|
|
- <el-button type="primary" size="small" plain @click="onObjectOAM(scope.row)">
|
|
|
- 行为
|
|
|
- </el-button>
|
|
|
- <el-button type="warning" size="small" plain @click="onObjectDetails(scope.row)">
|
|
|
- 详情
|
|
|
- </el-button>
|
|
|
- <el-button type="danger" size="small" plain @click="onObjectDelete(scope.row)">
|
|
|
- 删除
|
|
|
- </el-button>
|
|
|
- </div>
|
|
|
- </template>
|
|
|
- </el-table-column>
|
|
|
- </el-table>
|
|
|
- </div>
|
|
|
+ <ObjectListComponent ref="objectListRef" />
|
|
|
</LayoutContainer>
|
|
|
</div>
|
|
|
- <ModelComponent ref="modelRef" @success="getModelData" />
|
|
|
- <ModelObjectComponent ref="modelObjectRef" @success="getObjectData" />
|
|
|
</div>
|
|
|
</template>
|
|
|
|
|
|
@@ -325,70 +42,6 @@ const onObjectDelete = (row: any) => {
|
|
|
display: flex;
|
|
|
flex-direction: column;
|
|
|
height: 100%;
|
|
|
-
|
|
|
- .btns {
|
|
|
- display: inline-flex;
|
|
|
- width: 100%;
|
|
|
- margin-bottom: var(--container-padding);
|
|
|
-
|
|
|
- .add {
|
|
|
- width: 100%;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- .tree {
|
|
|
- flex: 1;
|
|
|
- overflow-y: auto;
|
|
|
-
|
|
|
- .el-tree {
|
|
|
- .el-tree-node__content {
|
|
|
- height: 40px;
|
|
|
- }
|
|
|
-
|
|
|
- .is-current > .el-tree-node__content {
|
|
|
- background-color: var(--el-color-primary-light-9);
|
|
|
- }
|
|
|
-
|
|
|
- .custom-tree-node {
|
|
|
- flex: 1;
|
|
|
- position: relative;
|
|
|
- width: 0;
|
|
|
- height: 100%;
|
|
|
- display: flex;
|
|
|
- flex-direction: column;
|
|
|
- justify-content: center;
|
|
|
-
|
|
|
- .label {
|
|
|
- display: inline-flex;
|
|
|
- align-items: center;
|
|
|
- width: calc(100% - 10px);
|
|
|
- color: var(--el-text-color-primary);
|
|
|
-
|
|
|
- .text {
|
|
|
- @include text-overflow;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- &:hover {
|
|
|
- .actions {
|
|
|
- display: block;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- .actions {
|
|
|
- display: none;
|
|
|
- position: absolute;
|
|
|
- right: 10px;
|
|
|
- top: 50%;
|
|
|
- transform: translateY(-50%);
|
|
|
-
|
|
|
- .el-button {
|
|
|
- padding: 5px 8px;
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
}
|
|
|
}
|
|
|
</style>
|