Explorar o código

资源类型添加

东方国信-蔡芳 hai 8 meses
pai
achega
5b4c22fe07

+ 53 - 0
src/api/resourceType/resourceType.js

@@ -0,0 +1,53 @@
+/**
+ *  Copyright [2022] [https://www.xiaonuo.vip]
+ *	Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+ *	1.请不要删除和修改根目录下的LICENSE文件。
+ *	2.请不要删除和修改Snowy源码头部的版权声明。
+ *	3.本项目代码可免费商业使用,商业使用请保留源码和相关描述文件的项目出处,作者声明等。
+ *	4.分发源码时候,请注明软件出处 https://www.xiaonuo.vip
+ *	5.不可二次分发开源参与同类竞品,如有想法可联系团队xiaonuobase@qq.com商议合作。
+ *	6.若您的项目无法满足以上几点,需要更多功能代码,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+import { baseRequest } from '@/utils/request'
+
+const request = (url, ...arg) => baseRequest(`/api/webapp/disk/type/${url}`, ...arg)
+/**
+ * 机构
+ *
+ * @author yubaoshan
+ * @date 2022-09-22 22:33:20
+ */
+export default {
+	// 获取组织分页
+	orgPage(data) {
+		return request('page', data, 'get')
+	},
+	// 获取组织列表
+	orgList(data) {
+		return request('list', data, 'get')
+	},
+	// 获取组织树
+	orgTree(data) {
+		return request('tree', data, 'get')
+	},
+	// 提交表单 edit为true时为编辑,默认为新增
+	submitForm(data, edit = false) {
+		return request(edit ? 'edit' : 'add', data)
+	},
+	// 删除组织
+	orgDelete(data) {
+		return request('delete', data)
+	},
+	// 获取组织详情
+	orgDetail(data) {
+		return request('detail', data, 'get')
+	},
+	// 获取组织树选择器
+	orgOrgTreeSelector(data) {
+		return request('orgTreeSelector', data, 'get')
+	},
+	// 获取用户选择器
+	orgUserSelector(data) {
+		return request('userSelector', data, 'get')
+	}
+}

+ 183 - 0
src/views/resourceType/form.vue

@@ -0,0 +1,183 @@
+<template>
+	<xn-form-container
+		:title="formData.id ? '编辑资源类型' : '增加资源类型'"
+		:width="550"
+		:visible="visible"
+		:destroy-on-close="true"
+		@close="onClose"
+	>
+		<a-form ref="formRef" :model="formData" :rules="formRules" layout="vertical">
+			<a-form-item label="上级资源类型:" name="parentId">
+				<a-tree-select
+					v-model:value="formData.parentId"
+					style="width: 100%"
+					:dropdown-style="{ maxHeight: '400px', overflow: 'auto' }"
+					placeholder="请选择上级资源类型"
+					allow-clear
+					tree-default-expand-all
+					:tree-data="treeData"
+					:field-names="{
+						children: 'children',
+						label: 'name',
+						value: 'id'
+					}"
+					selectable="false"
+					tree-line
+				/>
+			</a-form-item>
+			<a-form-item label="类型名称:" name="name">
+				<a-input v-model:value="formData.name" placeholder="请输入组织名称" allow-clear />
+			</a-form-item>
+			<!-- <a-form-item label="组织分类:" name="category">
+				<a-select
+					v-model:value="formData.category"
+					:options="orgCategoryOptions"
+					style="width: 100%"
+					placeholder="请选择组织分类"
+				/>
+			</a-form-item> -->
+			<a-form-item label="排序:" name="sortCode">
+				<a-input-number style="width: 100%" v-model:value="formData.sortCode" :max="100" />
+			</a-form-item>
+			<!-- <a-form-item label="指定主管:" name="directorId">
+				<a-button type="link" style="padding-left: 0px" @click="openSelector(formData.directorId)">选择</a-button>
+				<a-tag v-if="formData.directorId && formData.directorName" color="orange" closable @close="closeUserTag">{{
+					formData.directorName
+				}}</a-tag>
+				<a-input v-show="false" v-model:value="formData.directorId" />
+			</a-form-item> -->
+		</a-form>
+		<template #footer>
+			<a-button style="margin-right: 8px" @click="onClose">关闭</a-button>
+			<a-button type="primary" :loading="submitLoading" @click="onSubmit">保存</a-button>
+		</template>
+		<user-selector-plus
+			ref="userSelectorPlusRef"
+			:org-tree-api="selectorApiFunction.orgTreeApi"
+			:user-page-api="selectorApiFunction.userPageApi"
+			:checked-user-list-api="selectorApiFunction.checkedUserListApi"
+			:radio-model="true"
+			@onBack="userBack"
+		/>
+	</xn-form-container>
+</template>
+
+<script setup name="orgForm">
+	import { required } from '@/utils/formRules'
+	import orgApi from '@/api/resourceType/resourceType'
+	import userCenterApi from '@/api/sys/userCenterApi'
+	import UserSelectorPlus from '@/components/Selector/userSelectorPlus.vue'
+	import tool from '@/utils/tool'
+
+	// 定义emit事件
+	const emit = defineEmits({ successful: null })
+	// 默认是关闭状态
+	let visible = $ref(false)
+	let userSelectorPlusRef = ref()
+	const formRef = ref()
+	// 表单数据,也就是默认给一些数据
+	const formData = ref({})
+	// 定义机构元素
+	const treeData = ref([])
+	const submitLoading = ref(false)
+
+	// 打开抽屉
+	const onOpen = (record, parentId) => {
+		visible = true
+		formData.value = {
+			sortCode: 99
+		}
+		if (parentId) {
+			formData.value.parentId = parentId
+		}
+		if (record) {
+			const param = {
+				id: record.id
+			}
+			orgApi.orgDetail(param).then((data) => {
+				formData.value = Object.assign({}, data)
+			})
+		}
+		// 获取机构树并加入顶级
+		orgApi.orgOrgTreeSelector().then((res) => {
+			treeData.value = [
+				{
+					id: 0,
+					parentId: '-1',
+					name: '顶级',
+					children: res
+				}
+			]
+		})
+	}
+	// 关闭抽屉
+	const onClose = () => {
+		visible = false
+	}
+	// 默认要校验的
+	const formRules = {
+		name: [required('请输入资源名称')],
+		// category: [required('请选择组织分类')],
+		sortCode: [required('请选择排序')]
+	}
+	// 机构分类字典
+	const orgCategoryOptions = tool.dictList('ORG_CATEGORY')
+	// 打开人员选择器,选择主管
+	const openSelector = (id) => {
+		let checkedUserIds = []
+		checkedUserIds.push(id)
+		userSelectorPlusRef.value.showUserPlusModal(checkedUserIds)
+	}
+	// 人员选择器回调
+	const userBack = (value) => {
+		if (value.length > 0) {
+			formData.value.directorId = value[0].id
+			formData.value.directorName = value[0].name
+		} else {
+			formData.value.directorId = ''
+			formData.value.directorName = ''
+		}
+	}
+	// 通过小标签删除主管
+	const closeUserTag = () => {
+		formData.value.directorId = ''
+		formData.value.directorName = ''
+	}
+	// 验证并提交数据
+	const onSubmit = () => {
+		formRef.value.validate().then(() => {
+			submitLoading.value = true
+			orgApi
+				.submitForm(formData.value, formData.value.id)
+				.then(() => {
+					visible = false
+					emit('successful')
+				})
+				.finally(() => {
+					submitLoading.value = false
+				})
+		})
+	}
+	// 传递设计器需要的API
+	const selectorApiFunction = {
+		orgTreeApi: (param) => {
+			return orgApi.orgOrgTreeSelector(param).then((data) => {
+				return Promise.resolve(data)
+			})
+		},
+		userPageApi: (param) => {
+			return orgApi.orgUserSelector(param).then((data) => {
+				return Promise.resolve(data)
+			})
+		},
+		checkedUserListApi: (param) => {
+			return userCenterApi.userCenterGetUserListByIdList(param).then((data) => {
+				return Promise.resolve(data)
+			})
+		}
+	}
+	// 调用这个函数将子组件的一些数据和方法暴露出去
+	defineExpose({
+		onOpen
+	})
+</script>

+ 204 - 0
src/views/resourceType/index.vue

@@ -0,0 +1,204 @@
+<template>
+	<a-row :gutter="10">
+		<a-col :xs="24" :sm="24" :md="24" :lg="5" :xl="5">
+			<a-card :bordered="false" :loading="cardLoading">
+				<a-tree
+					v-if="treeData.length > 0"
+					v-model:expandedKeys="defaultExpandedKeys"
+					:tree-data="treeData"
+					:field-names="treeFieldNames"
+					@select="treeSelect"
+				/>
+				<a-empty :image="Empty.PRESENTED_IMAGE_SIMPLE" />
+			</a-card>
+		</a-col>
+		<a-col :xs="24" :sm="24" :md="24" :lg="19" :xl="19">
+			<a-card :bordered="false" style="margin-bottom: 10px">
+				<a-form ref="searchFormRef" name="advanced_search" class="ant-advanced-search-form" :model="searchFormState">
+					<a-row :gutter="24">
+						<a-col :span="8">
+							<a-form-item name="searchKey" label="资源类型">
+								<a-input v-model:value="searchFormState.searchKey" placeholder="请输入资源类型" />
+							</a-form-item>
+						</a-col>
+						<a-col :span="8">
+							<a-button type="primary" @click="table.refresh(true)">
+								<template #icon><SearchOutlined /></template>
+								查询
+							</a-button>
+							<a-button class="snowy-buttom-left" @click="reset">
+								<template #icon><redo-outlined /></template>
+								重置
+							</a-button>
+						</a-col>
+					</a-row>
+				</a-form>
+			</a-card>
+			<a-card :bordered="false">
+				<s-table
+					ref="table"
+					:columns="columns"
+					:data="loadData"
+					:expand-row-by-click="true"
+					:alert="options.alert.show"
+					bordered
+					:row-key="(record) => record.id"
+					:row-selection="options.rowSelection"
+				>
+					<template #operator class="table-operator">
+						<a-space>
+							<a-button type="primary" @click="formRef.onOpen(undefined, searchFormState.parentId)">
+								<template #icon><plus-outlined /></template>
+								新增
+							</a-button>
+							<xn-batch-delete :selectedRowKeys="selectedRowKeys" @batchDelete="deleteBatchOrg" />
+						</a-space>
+					</template>
+					<template #bodyCell="{ column, record }">
+						<template v-if="column.dataIndex === 'category'">
+							{{ $TOOL.dictTypeData('ORG_CATEGORY', record.category) }}
+						</template>
+						<template v-if="column.dataIndex === 'action'">
+							<a @click="formRef.onOpen(record)">编辑</a>
+							<a-divider type="vertical" />
+							<a-popconfirm title="删除此资源类型吗?" @confirm="removeOrg(record)">
+								<a-button type="link" danger size="small">删除</a-button>
+							</a-popconfirm>
+						</template>
+					</template>
+				</s-table>
+			</a-card>
+		</a-col>
+	</a-row>
+	<Form ref="formRef" @successful="table.refresh()" />
+</template>
+
+<script setup name="sysOrg">
+	import { Empty } from 'ant-design-vue'
+	import { isEmpty } from 'lodash-es'
+	import orgApi from '@/api/resourceType/resourceType'
+	import Form from './form.vue'
+
+	const columns = [
+		{
+			title: '资源类型',
+			dataIndex: 'name'
+		},
+		// {
+		// 	title: '分类',
+		// 	dataIndex: 'category'
+		// },
+		{
+			title: '排序',
+			dataIndex: 'sortCode',
+			width: 100
+		},
+		{
+			title: '操作',
+			dataIndex: 'action',
+			align: 'center',
+			width: '150px'
+		}
+	]
+	const selectedRowKeys = ref([])
+	// 列表选择配置
+	const options = {
+		alert: {
+			show: false,
+			clear: () => {
+				selectedRowKeys.value = ref([])
+			}
+		},
+		rowSelection: {
+			onChange: (selectedRowKey, selectedRows) => {
+				selectedRowKeys.value = selectedRowKey
+			}
+		}
+	}
+	// 定义tableDOM
+	const table = ref(null)
+	const formRef = ref()
+	const searchFormRef = ref()
+	const searchFormState = ref({})
+	// 默认展开的节点
+	const defaultExpandedKeys = ref([])
+	const treeData = ref([])
+	// 替换treeNode 中 title,key,children
+	const treeFieldNames = { children: 'children', title: 'name', key: 'id' }
+	const cardLoading = ref(true)
+
+	// 表格查询 返回 Promise 对象
+	const loadData = (parameter) => {
+		loadTreeData()
+		return orgApi.orgPage(Object.assign(parameter, searchFormState.value)).then((res) => {
+			return res
+		})
+	}
+	// 重置
+	const reset = () => {
+		searchFormRef.value.resetFields()
+		table.value.refresh(true)
+	}
+	// 加载左侧的树
+	const loadTreeData = () => {
+		orgApi.orgTree().then((res) => {
+			cardLoading.value = false
+			if (res !== null) {
+				treeData.value = res
+				if (isEmpty(defaultExpandedKeys.value)) {
+					// 默认展开2级
+					treeData.value.forEach((item) => {
+						// 因为0的顶级
+						if (item.parentId === '0') {
+							defaultExpandedKeys.value.push(item.id)
+							// 取到下级ID
+							if (item.children) {
+								item.children.forEach((items) => {
+									defaultExpandedKeys.value.push(items.id)
+								})
+							}
+						}
+					})
+				}
+			}
+		})
+	}
+	// 点击树查询
+	const treeSelect = (selectedKeys) => {
+		if (selectedKeys.length > 0) {
+			searchFormState.value.parentId = selectedKeys.toString()
+		} else {
+			delete searchFormState.value.parentId
+		}
+		table.value.refresh(true)
+	}
+	// 删除
+	const removeOrg = (record) => {
+		let params = [
+			{
+				id: record.id
+			}
+		]
+		orgApi.orgDelete(params).then(() => {
+			table.value.refresh(true)
+		})
+	}
+	// 批量删除
+	const deleteBatchOrg = (params) => {
+		orgApi.orgDelete(params).then(() => {
+			table.value.clearRefreshSelected()
+		})
+	}
+</script>
+
+<style scoped>
+	.ant-form-item {
+		margin-bottom: 0 !important;
+	}
+	.primaryAdd {
+		margin-right: 10px;
+	}
+	.snowy-buttom-left {
+		margin-left: 8px;
+	}
+</style>