提交宿舍楼树形结构的代码

This commit is contained in:
zlwu committed 2025-07-22 10:20:15 +08:00
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;
}
+2 -2
View File
@@ -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>
+56 -36
View File
@@ -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%;
}
+2 -9
View File
@@ -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) {