提交宿舍楼树形结构的代码
This commit is contained in:
1 parent
12b4b58647
commit
92f2598017
21 files changed
+1156
-515
No files matched your search
@@ -14,6 +14,7 @@ export interface DormBuildingVO {
|
||||
remark: string;
|
||||
areaName?: string;
|
||||
campusName?: string;
|
||||
floors: number;
|
||||
}
|
||||
|
||||
export interface DormBuildingForm extends Omit<DormBuildingVO, 'createTime' | 'createBy' | 'updateTime' | 'updateBy' | 'areaName' | 'campusName'> {
|
||||
@@ -25,6 +26,7 @@ export interface DormBuildingQuery {
|
||||
areaId?: string | number;
|
||||
campusId?: string | number;
|
||||
buildingType?: string;
|
||||
floors?: number;
|
||||
params?: Record<string, any>;
|
||||
}
|
||||
|
||||
@@ -40,6 +42,7 @@ export interface BuildingTreeSelectVo {
|
||||
createBy?: number;
|
||||
createTime?: string;
|
||||
updateBy?: number;
|
||||
floors?: number;
|
||||
updateTime?: string;
|
||||
}
|
||||
|
||||
|
||||
@@ -5,11 +5,11 @@ import { DormQuery, RoomForm, BedForm, DormTreeNode, RoomInfo, BedInfo } from '.
|
||||
const baseUrl = '/xsssfjgl';
|
||||
|
||||
/**
|
||||
* 获取宿舍树形结构
|
||||
* 获取宿舍楼树形结构
|
||||
*/
|
||||
export function getDormTree() {
|
||||
return request({
|
||||
url: baseUrl + '/tree',
|
||||
url: '/xgss/dormBuildingTree/list',
|
||||
method: 'get'
|
||||
});
|
||||
}
|
||||
|
||||
@@ -86,6 +86,7 @@
|
||||
<el-table-column label="宿舍楼名称" align="center" prop="buildingName" />
|
||||
<el-table-column label="所属校区" align="center" prop="campusName" />
|
||||
<el-table-column label="所属宿舍区" align="center" prop="areaName" />
|
||||
<el-table-column label="总楼层数" align="center" prop="floors" />
|
||||
<el-table-column label="宿舍楼类型" align="center" prop="buildingType">
|
||||
<template #default="scope">
|
||||
<dict-tag :options="dorm_type" :value="scope.row.buildingType" />
|
||||
@@ -128,7 +129,18 @@
|
||||
<el-input v-model="form.buildingCode" placeholder="请输入宿舍楼编码" />
|
||||
</el-form-item>
|
||||
<el-form-item label="宿舍楼名称" prop="buildingName">
|
||||
<el-input v-model="form.buildingName" placeholder="请输入宿舍楼名称" />
|
||||
<el-input v-model="form.buildingName" placeholder="请输入宿舍楼名称" class="fixed-width-input" />
|
||||
</el-form-item>
|
||||
<el-form-item label="总楼层数" prop="floors">
|
||||
<el-input-number
|
||||
v-model="form.floors"
|
||||
:min="1"
|
||||
:max="99"
|
||||
:step="1"
|
||||
:default-value="6"
|
||||
placeholder="请输入总楼层数"
|
||||
class="fixed-width-input"
|
||||
/>
|
||||
</el-form-item>
|
||||
<el-form-item label="宿舍楼类型" prop="buildingType">
|
||||
<el-select v-model="form.buildingType" placeholder="请选择宿舍楼类型">
|
||||
@@ -198,7 +210,8 @@ const initFormData: DormBuildingForm = {
|
||||
campusId: undefined,
|
||||
buildingType: undefined,
|
||||
buildingDescription: undefined,
|
||||
sortOrder: undefined
|
||||
sortOrder: undefined,
|
||||
floors: 6 // 添加默认值为6
|
||||
};
|
||||
const data = reactive<PageData<DormBuildingForm, DormBuildingQuery>>({
|
||||
form: { ...initFormData },
|
||||
@@ -537,4 +550,7 @@ onMounted(() => {
|
||||
margin-bottom: 0 !important;
|
||||
}
|
||||
}
|
||||
.fixed-width-input {
|
||||
width: 100%;
|
||||
}
|
||||
</style>
|
||||
@@ -1,10 +1,18 @@
|
||||
<template>
|
||||
<div class="p-2">
|
||||
<el-row :gutter="20">
|
||||
<div class="flex-layout">
|
||||
<!-- 宿舍树 -->
|
||||
<el-col :lg="4" :xs="24">
|
||||
<div class="tree-sidebar">
|
||||
<el-card shadow="hover">
|
||||
<el-input v-model="buildingName" placeholder="请输入宿舍楼名称" prefix-icon="Search" clearable />
|
||||
<el-input
|
||||
v-model="buildingName"
|
||||
prefix-icon="Search"
|
||||
placeholder="请输入宿舍楼名称"
|
||||
clearable
|
||||
@clear="watchBuildingName"
|
||||
@keyup.enter="watchBuildingName"
|
||||
>
|
||||
</el-input>
|
||||
<el-tree
|
||||
ref="dormTreeRef"
|
||||
class="mt-2"
|
||||
@@ -18,9 +26,9 @@
|
||||
@node-click="handleNodeClick"
|
||||
/>
|
||||
</el-card>
|
||||
</el-col>
|
||||
</div>
|
||||
|
||||
<el-col :lg="20" :xs="24">
|
||||
<div class="content-area">
|
||||
<transition :enter-active-class="animate.searchAnimate.enter" :leave-active-class="animate.searchAnimate.leave">
|
||||
<div v-show="showSearch" class="mb-[10px]">
|
||||
<el-card shadow="hover">
|
||||
@@ -109,8 +117,8 @@
|
||||
</div>
|
||||
</el-card>
|
||||
</template>
|
||||
</el-col>
|
||||
</el-row>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 房间管理对话框 -->
|
||||
<room-dialog
|
||||
@@ -159,21 +167,11 @@
|
||||
</template>
|
||||
|
||||
<script setup name="DormRoomManagement" lang="ts">
|
||||
import { ref, computed, reactive, onMounted, nextTick } from 'vue';
|
||||
import { ref, computed, reactive, onMounted, nextTick, watch } from 'vue';
|
||||
import { ElMessageBox, ElMessage } from 'element-plus';
|
||||
import { InfoFilled } from '@element-plus/icons-vue';
|
||||
import { InfoFilled, Search } from '@element-plus/icons-vue';
|
||||
import { DormTreeNode, RoomInfo, BedInfo, DormQuery } from '@/api/xgss/xsssfjgl/types';
|
||||
import {
|
||||
getDormTree,
|
||||
listRooms,
|
||||
delRoom,
|
||||
listBeds,
|
||||
delBed,
|
||||
// 以下为模拟数据
|
||||
getMockDormTree,
|
||||
getMockRooms,
|
||||
getMockBeds
|
||||
} from '@/api/xgss/xsssfjgl';
|
||||
import { getDormTree, listRooms, delRoom, listBeds, delBed } from '@/api/xgss/xsssfjgl';
|
||||
|
||||
// 引入子组件
|
||||
import RoomDialog from './components/RoomDialog.vue';
|
||||
@@ -242,7 +240,7 @@ const bedLoading = ref(false);
|
||||
/** 通过条件过滤节点 */
|
||||
const filterNode = (value: string, data: DormTreeNode) => {
|
||||
if (!value) return true;
|
||||
return data.label.indexOf(value) !== -1;
|
||||
return data.label.toLowerCase().indexOf(value.toLowerCase()) !== -1;
|
||||
};
|
||||
|
||||
/** 监听宿舍楼名称变化,筛选树 */
|
||||
@@ -250,12 +248,15 @@ const watchBuildingName = () => {
|
||||
dormTreeRef.value?.filter(buildingName.value);
|
||||
};
|
||||
|
||||
// 监听buildingName变化,实时筛选宿舍楼
|
||||
watch(buildingName, () => {
|
||||
watchBuildingName();
|
||||
});
|
||||
|
||||
/** 获取宿舍树数据 */
|
||||
const getDormTreeData = async () => {
|
||||
try {
|
||||
// const res = await getDormTree();
|
||||
// 使用模拟数据
|
||||
const res = getMockDormTree();
|
||||
const res = await getDormTree();
|
||||
dormOptions.value = res.data;
|
||||
} catch (error) {
|
||||
console.error('获取宿舍树失败', error);
|
||||
@@ -279,9 +280,7 @@ const loadRoomData = async () => {
|
||||
if (!queryParams.buildingId) return;
|
||||
|
||||
try {
|
||||
// const res = await listRooms(queryParams);
|
||||
// 使用模拟数据
|
||||
const res = getMockRooms(queryParams.buildingId);
|
||||
const res = await listRooms(queryParams);
|
||||
roomList.value = res.rows;
|
||||
} catch (error) {
|
||||
console.error('获取房间列表失败', error);
|
||||
@@ -366,9 +365,7 @@ const handleManageBeds = async (room: RoomInfo) => {
|
||||
const loadBedData = async (roomId: string | number) => {
|
||||
bedLoading.value = true;
|
||||
try {
|
||||
// const res = await listBeds(roomId);
|
||||
// 使用模拟数据
|
||||
const res = getMockBeds(roomId);
|
||||
const res = await listBeds(roomId);
|
||||
bedList.value = res.data;
|
||||
} catch (error) {
|
||||
console.error('获取床位列表失败', error);
|
||||
@@ -420,16 +417,39 @@ const handleBedSuccess = () => {
|
||||
|
||||
onMounted(() => {
|
||||
getDormTreeData();
|
||||
|
||||
// 监听宿舍楼名称变化
|
||||
nextTick(() => {
|
||||
buildingName.value = '';
|
||||
watchBuildingName();
|
||||
});
|
||||
});
|
||||
|
||||
// 确保树加载后才能过滤
|
||||
watch(
|
||||
dormOptions,
|
||||
() => {
|
||||
if (buildingName.value) {
|
||||
nextTick(() => {
|
||||
watchBuildingName();
|
||||
});
|
||||
}
|
||||
},
|
||||
{ deep: true }
|
||||
);
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
.flex-layout {
|
||||
display: flex;
|
||||
gap: 20px;
|
||||
}
|
||||
|
||||
.tree-sidebar {
|
||||
min-width: 320px;
|
||||
max-width: 320px;
|
||||
flex-shrink: 0;
|
||||
}
|
||||
|
||||
.content-area {
|
||||
flex: 1;
|
||||
min-width: 0; /* 防止内容溢出 */
|
||||
}
|
||||
|
||||
.room-container {
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
@@ -418,15 +418,8 @@ function onScope(type: string, admin: any) {
|
||||
scopeDialogVisible.value = true;
|
||||
}
|
||||
function onDialogSubmit(admin: any) {
|
||||
// TODO: 新增/编辑时调用API,成功后刷新
|
||||
const list = getListByType(activeTab.value);
|
||||
if (dialogMode.value === 'add') {
|
||||
admin.id = Date.now();
|
||||
list.value.push(admin);
|
||||
} else {
|
||||
const idx = list.value.findIndex((a: any) => a.id === admin.id);
|
||||
if (idx !== -1) list.value[idx] = { ...admin };
|
||||
}
|
||||
// 修改后立即刷新列表数据
|
||||
fetchAdmins(activeTab.value);
|
||||
dialogVisible.value = false;
|
||||
}
|
||||
async function onScopeSubmit(scope: any) {
|
||||
|
||||
Reference in new issue
Block a user