Commit f7c596b4 authored by 何远江's avatar 何远江

资源库接口对接

parent 6f57f1c1
...@@ -3,11 +3,14 @@ import { defHttp } from '@/utils/axios/index' ...@@ -3,11 +3,14 @@ import { defHttp } from '@/utils/axios/index'
import type { ApiResult } from '../model/baseModel' import type { ApiResult } from '../model/baseModel'
import type { ResourceFieldDto, ResourceRepositoryTreeDto } from './model/repositoryModel' import type { ResourceFieldDto, ResourceRepositoryTreeDto } from './model/repositoryModel'
export type ResourceSaveParamsDto = Omit<ResourceRepositoryTreeDto, 'childNode'>
enum Api { enum Api {
REPOSITORY_LIST = '/resource/findList', REPOSITORY_LIST = '/resource/findList',
GET_RESOURCE_FIELD = '/resourceField/getResourceField', GET_RESOURCE_FIELD = '/resourceField/getResourceField',
GET_RESOURCE_FIELD_VALUE = '/resourceField/getResourceFieldValue', GET_RESOURCE_FIELD_VALUE = '/resourceField/getResourceFieldValue',
FIND_PARENT_RESOURCE = '/resource/findParentResourceTypeAndFields' FIND_PARENT_RESOURCE = '/resource/findParentResourceTypeAndFields',
RESOURCE_SAVE = '/resource/save'
} }
export const apiGetRepositoryList = () => { export const apiGetRepositoryList = () => {
...@@ -48,3 +51,10 @@ export const apiFindParentResource = (tableName: string) => { ...@@ -48,3 +51,10 @@ export const apiFindParentResource = (tableName: string) => {
} }
}) })
} }
export const apiResourceSave = (data: ResourceSaveParamsDto) => {
return defHttp.post<ApiResult<ResourceRepositoryTreeDto>>({
url: Api.RESOURCE_SAVE,
data
})
}
...@@ -4,6 +4,10 @@ import 'vxe-table/lib/style.css' ...@@ -4,6 +4,10 @@ import 'vxe-table/lib/style.css'
// register svgIcon // register svgIcon
import 'virtual:svg-icons-register' import 'virtual:svg-icons-register'
import ElementPlus from 'element-plus'
import zhCn from 'element-plus/dist/locale/zh-cn.mjs'
import 'element-plus/dist/index.css'
import { router, setupRouter } from './router' import { router, setupRouter } from './router'
import { setupStore } from './stores' import { setupStore } from './stores'
import { setupRouterGuard } from './router/guard' import { setupRouterGuard } from './router/guard'
...@@ -26,6 +30,7 @@ function bootstrap() { ...@@ -26,6 +30,7 @@ function bootstrap() {
setupRouterGuard(router) setupRouterGuard(router)
setupGlobalComponents(app) setupGlobalComponents(app)
app.use(ElementPlus, { locale: zhCn })
app.mount('#app') app.mount('#app')
} }
......
<template> <template>
<Modal v-bind="getBindValue" @cancel="handleCancel"> <Modal v-bind="getBindValue" @cancel="handleCancel" @ok="confirmFrom">
<!-- 模态框内容 --> <!-- 模态框内容 -->
<Form ref="formRef" :model="formState" :label-col="{ style: { width: '5em' } }"> <Form ref="formRef" :model="formState" :label-col="{ style: { width: '5em' } }">
<Row :gutter="24"> <Row :gutter="24">
...@@ -42,59 +42,48 @@ ...@@ -42,59 +42,48 @@
</template> </template>
<template #resourceFiledTitle="{ row }"> <template #resourceFiledTitle="{ row }">
<Input placeholder="输入字段名" size="small" v-model:value="row.resourceFiledTitle" /> <el-input placeholder="输入字段名" size="small" v-model="row.resourceFiledTitle" />
</template> </template>
<template #resourceFieldType="{ row }"> <template #resourceFieldType="{ row }">
<Select <el-select v-model="row.resourceFieldType" size="small" clearable>
v-bind="selectOptions" <template v-for="item in dictOptions['resourceFieldType']" key="item.dictItemValue">
placeholder="请选择类型" <el-option :label="item.dictItemText" :value="item.dictItemValue"></el-option>
:options="dictOptions['resourceFieldType']" </template>
v-model:value="row.resourceFieldType" </el-select>
/>
</template> </template>
<template #dictCode="{ row }"> <template #dictCode="{ row }">
<Select <el-select
style="display: block" clearable
filterable
remote
size="small" size="small"
:field-names="{ :remote-method="handleSearch"
label: 'dictName', v-model="row.dictCode"
value: 'dictCode' :loading="searchLoading"
}" >
allowClear <template v-for="item in dictOptions['dict']" key="item.dictCode">
placeholder="请选择字典" <el-option :label="item.dictName" :value="item.dictCode"></el-option>
:options="dictOptions['dict']" </template>
show-search </el-select>
@search="handleSearch"
v-model:value="row.dictCode"
/>
</template> </template>
<template #resourceFieldShow="{ row }"> <template #resourceFieldShow="{ row }">
<Select <el-select size="small" v-model="row.resourceFieldShow" clearable>
placeholder="是否可见" <template v-for="item in dictOptions['resourceFieldShow']" key="item.dictItemValue">
v-bind="selectOptions" <el-option :label="item.dictItemText" :value="item.dictItemValue"></el-option>
:options="dictOptions['resourceFieldShow']" </template>
v-model:value="row.resourceFieldShow" </el-select>
/>
</template> </template>
<template #action="{ row, $rowIndex }"> <template #action="{ row, $rowIndex }">
<Tooltip title="删除"> <el-button v-if="!row.resourceFieldId" size="small" @click="removeRow($rowIndex)" type="danger" :icon="Delete" circle />
<Button
v-if="!row.resourceFieldId"
danger
size="small"
@click="removeRow($rowIndex)"
shape="circle"
><DeleteOutlined
/></Button>
</Tooltip>
</template> </template>
</vxe-grid> </vxe-grid>
</Modal> </Modal>
</template> </template>
<script lang="ts"> <script lang="ts">
import { Delete } from '@element-plus/icons-vue'
import { apiDictFindById, apiGetDictByCode, apiGetDictList } from '@/api/common/dict' import { apiDictFindById, apiGetDictByCode, apiGetDictList } from '@/api/common/dict'
import { apiFindParentResource } from '@/api/resource/repository' import { apiFindParentResource, apiResourceSave } from '@/api/resource/repository'
import { Row, Col, Modal, Form, FormItem, Input, Select, Button, Tooltip } from 'ant-design-vue' import { Row, Col, Modal, Form, FormItem, Input, Select, Button, Tooltip } from 'ant-design-vue'
import { onMounted, reactive } from 'vue' import { onMounted, reactive } from 'vue'
import { watch } from 'vue' import { watch } from 'vue'
...@@ -134,6 +123,7 @@ export default defineComponent({ ...@@ -134,6 +123,7 @@ export default defineComponent({
setup(props, { emit }) { setup(props, { emit }) {
const xGrid = ref() const xGrid = ref()
const formRef = ref() const formRef = ref()
const searchLoading = ref(false)
const visibleRef = ref(false) const visibleRef = ref(false)
const formState = reactive({ const formState = reactive({
resourceTableTitle: '', resourceTableTitle: '',
...@@ -245,12 +235,14 @@ export default defineComponent({ ...@@ -245,12 +235,14 @@ export default defineComponent({
const removeRow = (index: number) => gridOptions.data?.splice(index, 1) const removeRow = (index: number) => gridOptions.data?.splice(index, 1)
const handleSearch = async (dictCode: string) => { const handleSearch = async (dictCode: string) => {
searchLoading.value = true
const { result } = await apiGetDictByCode(dictCode) const { result } = await apiGetDictByCode(dictCode)
if (result !== null) { if (result !== null) {
dictOptions['dict'] = [result] dictOptions['dict'] = [result]
} else { } else {
dictOptions['dict'] = [] dictOptions['dict'] = []
} }
searchLoading.value = false
} }
const getDict = async (code: string) => { const getDict = async (code: string) => {
...@@ -258,6 +250,14 @@ export default defineComponent({ ...@@ -258,6 +250,14 @@ export default defineComponent({
dictOptions[code] = result dictOptions[code] = result
} }
const confirmFrom = async () => {
const params = {
...unref(formState),
resourceFileds: gridOptions.data
}
const {result} = await apiResourceSave(params)
}
const resetModalState = () => { const resetModalState = () => {
Object.assign(unref(formState), { Object.assign(unref(formState), {
resourceTableTitle: '', resourceTableTitle: '',
...@@ -289,6 +289,9 @@ export default defineComponent({ ...@@ -289,6 +289,9 @@ export default defineComponent({
dictOptions, dictOptions,
selectOptions, selectOptions,
getBindValue, getBindValue,
searchLoading,
confirmFrom,
Delete,
removeRow, removeRow,
addFieldRow, addFieldRow,
handleSearch, handleSearch,
......
<template> <template>
<Tree <el-card shadow="never" header="资源分类" style="height: 100%;">
v-if="treeList.length" <el-input v-model="searchText" placeholder="请输入要搜索的内容" :prefix-icon="Search" style="margin-bottom: 10px;"></el-input>
defaultExpandAll <el-tree
:treeData="treeList" ref="treeRef"
:fieldNames="fieldNames" :data="treeList"
:selectedKeys="selectedKeys" highlight-current
@select="onSelect" :loading="treeLoading"
> node-key="resourceTypeId"
<template #title="node"> @node-click="onSelect"
<Dropdown :trigger="['contextmenu']"> :current-node-key="selectedKey"
<span>{{ node.resourceTableTitle }}</span> :expand-on-click-node="false"
<template #overlay> :filter-node-method="filterNode"
<Menu @click="({key}) => onContextMenuClick(key, node)"> :props="{
<MenuItem key="add">添加资源分类</MenuItem> children: 'childNode',
<MenuItem key="modify">修改资源分类</MenuItem> label: 'resourceTableTitle'
<MenuItem key="delete">删除资源分类</MenuItem> }"
</Menu> >
</template> <template #default="{ node, data }">
</Dropdown> <el-dropdown
</template> style="flex: 1"
</Tree> trigger="contextmenu"
@command="(key) => onContextMenuClick(key, data)"
>
<p style="width: 100%">{{ node.label }}</p>
<template #dropdown>
<el-dropdown-menu>
<el-dropdown-item>添加资源分类</el-dropdown-item>
<el-dropdown-item>修改资源分类</el-dropdown-item>
<el-dropdown-item>删除资源分类</el-dropdown-item>
</el-dropdown-menu>
</template>
</el-dropdown>
</template>
</el-tree>
</el-card>
<RepositoryModal v-model:open="open" width="700px" :res-node="openNode" title="添加资源分类" /> <RepositoryModal v-model:open="open" width="700px" :res-node="openNode" title="添加资源分类" />
</template> </template>
<script lang="ts"> <script lang="ts">
import { Search } from '@element-plus/icons-vue'
import { Tree, Dropdown, Menu, MenuItem } from 'ant-design-vue' import { Tree, Dropdown, Menu, MenuItem } from 'ant-design-vue'
import RepositoryModal from './RepositoryModal.vue' import RepositoryModal from './RepositoryModal.vue'
import { defineComponent, ref } from 'vue' import { defineComponent, ref } from 'vue'
import { useRepositoryTree } from './useRepositoryTree' import { useRepositoryTree } from './useRepositoryTree'
export default defineComponent({ export default defineComponent({
components: { components: {
Tree,Menu, Tree,
Menu,
MenuItem, MenuItem,
Dropdown, Dropdown,
RepositoryModal RepositoryModal
}, },
setup() { setup() {
const repositoryState = useRepositoryTree() const repositoryState = useRepositoryTree()
return { return {
Search,
...repositoryState ...repositoryState
} }
} }
......
import type { ResourceRepositoryTreeDto } from '@/api/resource/model/repositoryModel' import type { ResourceRepositoryTreeDto } from '@/api/resource/model/repositoryModel'
import { apiGetRepositoryList } from '@/api/resource/repository' import { apiGetRepositoryList } from '@/api/resource/repository'
import { onMounted, reactive, ref, unref } from 'vue' import { onMounted, reactive, ref, unref, watch } from 'vue'
import mitter from '@/utils/eventBus' import mitter from '@/utils/eventBus'
import type { ElTree, TreeNode } from 'element-plus'
export function useRepositoryTree() { export function useRepositoryTree() {
const fieldNames = reactive({ const fieldNames = reactive({
...@@ -9,42 +10,66 @@ export function useRepositoryTree() { ...@@ -9,42 +10,66 @@ export function useRepositoryTree() {
title: 'resourceTableTitle', title: 'resourceTableTitle',
key: 'resourceTypeId' key: 'resourceTypeId'
}) })
const treeLoading = ref(false)
const treeRef = ref<InstanceType<typeof ElTree>>()
const searchText = ref('')
const selectedNodeData = reactive<Recordable>({}) const selectedNodeData = reactive<Recordable>({})
const openNode = reactive<Recordable>({}) const openNode = reactive<Recordable>({})
const selectedKeys = ref<(string | number)[]>([]) const selectedKey = ref<(string | number)>('')
const treeList = ref<ResourceRepositoryTreeDto[]>([]) const treeList = ref<ResourceRepositoryTreeDto[]>([])
const open = ref(false) const open = ref(false)
watch(searchText, (val) => {
treeRef.value?.filter(val)
})
const filterNode = (value: string, data: Recordable) => {
if (!value) return true
return data.resourceTableTitle.includes(value)
}
const getTreeList = async () => { const getTreeList = async () => {
const { result } = await apiGetRepositoryList() const { result } = await apiGetRepositoryList()
treeList.value = result treeList.value = result
// 设置默认选中第一个 // 设置默认选中第一个
onSelect([result[0].resourceTypeId]) onSelect([result[0]])
} }
const onSelect = (keys: (string | number)[], e?: any) => { // const onSelect = (keys: (string | number)[], e?: any) => {
e && Object.assign(selectedNodeData, e.node.data) const onSelect = (node: any) => {
selectedKeys.value = keys
node && Object.assign(selectedNodeData, unref(node))
selectedKey.value = node.resourceTypeId
// 触发 表格 查询 // 触发 表格 查询
mitter.emit('treeSelect', unref(selectedKeys)) mitter.emit('treeSelect', {
key: unref(selectedKey),
node: unref(node)
})
} }
const onContextMenuClick = (key: any, node: any) => { const onContextMenuClick = (key: any, data: any) => {
Object.assign(openNode, node) console.log('data', data)
Object.assign(openNode, unref(data))
open.value = true open.value = true
} }
onMounted(async () => { onMounted(async () => {
treeLoading.value = true
await getTreeList() await getTreeList()
treeLoading.value = false
}) })
return { return {
open, open,
treeRef,
treeLoading,
searchText,
openNode, openNode,
fieldNames, fieldNames,
treeList, treeList,
selectedKeys, selectedKey,
onSelect, onSelect,
filterNode,
onContextMenuClick onContextMenuClick
} }
} }
<template> <template>
<h1 class="resource-table-title">
当前资源表:{{ selectedNode?.resourceTableTitle }}
</h1>
<el-button type="primary">新增</el-button>
<vxe-table <vxe-table
border="none" border="inner"
ref="tableRef" ref="tableRef"
:data="tableData" :data="tableData"
size="small" size="small"
min-height="400"
:loading="loading" :loading="loading"
row-class-name="query-table-row"
header-row-class-name="query-table-header" header-row-class-name="query-table-header"
> >
<template v-for="item in tableColumns" :key="item.resourceFieldId"> <template v-for="item in tableColumns" :key="item.resourceFieldId">
...@@ -13,36 +17,37 @@ ...@@ -13,36 +17,37 @@
</template> </template>
<vxe-column field="action" title="操作" key="action" fixed="right"> <vxe-column field="action" title="操作" key="action" fixed="right">
<template #default="{ row }"> <template #default="{ row }">
<Space> <el-button type="primary" size="small" :icon="Edit" circle />
<span><FormOutlined />授权</span> <el-button type="danger" size="small" :icon="Delete" circle />
<span><FormOutlined />修改</span>
<span><DeleteOutlined />删除</span>
</Space>
</template> </template>
</vxe-column> </vxe-column>
</vxe-table> </vxe-table>
</template> </template>
<script lang="ts"> <script lang="ts">
import { Space } from 'ant-design-vue'
import { FormOutlined, DeleteOutlined } from '@ant-design/icons-vue'
import { defineComponent } from 'vue' import { defineComponent } from 'vue'
import {Edit, Star, Delete} from '@element-plus/icons-vue'
import { useResourceFieldsTable } from './useResourceFieldsTable' import { useResourceFieldsTable } from './useResourceFieldsTable'
export default defineComponent({ export default defineComponent({
name: 'ResourceFieldsTable', name: 'ResourceFieldsTable',
components: { components: {
Space,
FormOutlined,
DeleteOutlined
}, },
setup() { setup() {
const state = useResourceFieldsTable() const state = useResourceFieldsTable()
return { return {
Edit,
Star,
Delete,
...state ...state
} }
} }
}) })
</script> </script>
<style lang="scss" scoped></style> <style lang="scss" scoped>
.resource-table-title {
line-height: 50px;
font-size: 18px;
}
</style>
import { onBeforeUnmount, ref } from 'vue' import { onBeforeUnmount, reactive, ref } from 'vue'
import mitter from '@/utils/eventBus' import mitter from '@/utils/eventBus'
import { apiGetResourceField, apiGetResourceFieldValue } from '@/api/resource/repository' import { apiGetResourceField, apiGetResourceFieldValue } from '@/api/resource/repository'
import type { ResourceFieldDto } from '@/api/resource/model/repositoryModel' import type { ResourceFieldDto, ResourceRepositoryTreeDto } from '@/api/resource/model/repositoryModel'
export function useResourceFieldsTable() { export function useResourceFieldsTable() {
const tableData = ref<Recordable[]>([]) const tableData = ref<Recordable[]>([])
const tableColumns = ref<ResourceFieldDto[]>([]) const tableColumns = ref<ResourceFieldDto[]>([])
const selectedNode = ref<ResourceRepositoryTreeDto>()
const loading = ref(false) const loading = ref(false)
mitter.on('treeSelect', async ([key]: any) => { mitter.on('treeSelect', async (params) => {
const { key, node } = params as { key: string; node: ResourceRepositoryTreeDto }
if (key) { if (key) {
loading.value = true loading.value = true
selectedNode.value = node
try { try {
await getColumn(key) await getColumn(key)
await getTableData(key) await getTableData(key)
...@@ -32,7 +35,7 @@ export function useResourceFieldsTable() { ...@@ -32,7 +35,7 @@ export function useResourceFieldsTable() {
* 获取表格数据 * 获取表格数据
*/ */
const getTableData = async (key: any) => { const getTableData = async (key: any) => {
const {result } =await apiGetResourceFieldValue(key) const { result } = await apiGetResourceFieldValue(key)
tableData.value = result tableData.value = result
} }
...@@ -43,6 +46,7 @@ export function useResourceFieldsTable() { ...@@ -43,6 +46,7 @@ export function useResourceFieldsTable() {
return { return {
loading, loading,
tableData, tableData,
selectedNode,
tableColumns tableColumns
} }
} }
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
<div class="page-search"> <div class="page-search">
<PageTitle title="资源库" /> <PageTitle title="资源库" />
<div class="page-search-wrap"> <div class="page-search-wrap">
<Row> <Row :gutter="24" style="height: 100%;">
<Col span="6"> <Col span="6">
<RepositoryTree /> <RepositoryTree />
</Col> </Col>
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment