From 9b47bfa2cc65963b487035772db15eccebab9b54 Mon Sep 17 00:00:00 2001
From: yxh <172933527@qq.com>
Date: 星期二, 15 九月 2026 23:38:41 +0800
Subject: [PATCH] 优化了科室选择页面布局

---
 src/views/ecg/room/RoomLoginSelect.vue             |   74 ++++++++++++--
 src/components/RoomBedSelect/src/RoomBedSelect.vue |  185 ++++++++++++++++++++++--------------
 .env.prod                                          |    2 
 3 files changed, 179 insertions(+), 82 deletions(-)

diff --git a/.env.prod b/.env.prod
index 65868c2..0587f14 100644
--- a/.env.prod
+++ b/.env.prod
@@ -5,11 +5,13 @@
 
 # 璇锋眰璺緞
 VITE_BASE_URL='http://10.0.2.193'
+# VITE_BASE_URL='http://localhost'
 
 # 鏂囦欢涓婁紶绫诲瀷锛歴erver - 鍚庣涓婁紶锛� client - 鍓嶇鐩磋繛涓婁紶锛屼粎鏀寔S3鏈嶅姟
 VITE_UPLOAD_TYPE=server
 # 涓婁紶璺緞
 VITE_UPLOAD_URL='http://10.0.2.193/admin-api/infra/file/upload'
+# VITE_UPLOAD_URL='http://localhost/admin-api/infra/file/upload'
 
 # 鎺ュ彛鍦板潃
 VITE_API_URL=/admin-api
diff --git a/src/components/RoomBedSelect/src/RoomBedSelect.vue b/src/components/RoomBedSelect/src/RoomBedSelect.vue
index 174ba64..d53c21d 100644
--- a/src/components/RoomBedSelect/src/RoomBedSelect.vue
+++ b/src/components/RoomBedSelect/src/RoomBedSelect.vue
@@ -1,9 +1,11 @@
 <script lang="ts" setup>
 import { RoomVO } from '@/api/ecg/room'
 import { PropType } from "vue";
-import { useCheckTypeStore } from "@/store/modules/checkType";
 import { UserVO } from "@/store/modules/user";
 import { getCheckTypeName } from "../../../utils/checkTypeFormatter";
+// 鍔ㄦ�� :src 涓嶄細琚� Vite 鑷姩澶勭悊锛岄渶瑕佹樉寮� import
+import openImg from '@/assets/room/open.jpg'
+import doctorImg from '@/assets/room/desk-doctor.jpg'
 
 const emit = defineEmits(['event-haveseat', 'event-leaveseat', 'event-setcurseat'])
 
@@ -12,13 +14,9 @@
 })
 
 const props = defineProps({
-  // defineProps({
-  title: {
-    type: Number,
-    required: true
-  },
-  bedList: {
-    type: Array as PropType<RoomVO[]>,
+  // 涓�涓簥浣嶄竴寮犲崱鐗�
+  bed: {
+    type: Object as PropType<RoomVO>,
     required: true
   },
   curBed: {
@@ -31,86 +29,129 @@
   }
 })
 
-const checkTypeStore = useCheckTypeStore();
+// 璇ュ簥浣嶆槸鍚﹀凡鐢卞綋鍓嶅尰鐢熷叆搴�
+const isMine = computed(() => props.bed.docId != null && props.bed.docId === props.curUser.id)
+// 璇ュ簥浣嶆槸鍚﹀氨鏄綋鍓嶄細璇濅娇鐢ㄤ腑鐨勫伐浣�
+const isCurSeat = computed(
+  () => props.bed.roomId === props.curBed.roomId && props.bed.bedNo === props.curBed.bedNo
+)
 
-const onHaveSeatclick = (newItem: RoomVO) => {
-  emit('event-haveseat', newItem)
+const onHaveSeatclick = (bed: RoomVO) => {
+  emit('event-haveseat', bed)
 }
-const onLeaveSeatclick = (curItem: RoomVO) => {
-  emit('event-leaveseat', curItem)
+const onLeaveSeatclick = (bed: RoomVO) => {
+  emit('event-leaveseat', bed)
 }
-const onSetCurSeatclick = (curItem: RoomVO) => {
-  emit('event-setcurseat', curItem)
+const onSetCurSeatclick = (bed: RoomVO) => {
+  emit('event-setcurseat', bed)
 }
-
-/** 鍒濆鍖� **/
-onMounted(() => {
-  console.info(props.bedList)
-})
 
 </script>
 
 <template>
-  <el-card style="width: 200px" shadow="hover">
-    <template #header>{{ bedList[0].roomName }}</template>
-    <div v-for="(bedItem, index) in bedList" :key="index">
-      <div class="deskwarp">
+  <el-card class="bed-card" shadow="hover" :body-style="{ padding: '10px' }">
+    <template #header>
+      <div class="bed-card__title">{{ bed.roomName }}</div>
+    </template>
 
-        <div v-for="(checkType, subIndex) in bedItem.checkTypes" :key="subIndex">
-          {{ getCheckTypeName(checkType) }}
-        </div>
-        <div>
-          {{ bedItem.opType === 1 ? "棰嗙敤" : "" }}
-          {{ bedItem.opType === 2 ? "瀹夎" : "" }}
-        </div>
+    <img
+      class="bed-card__img"
+      :src="bed.docId === null ? openImg : doctorImg"
+      :alt="bed.docId === null ? '鏃犲尰鐢�' : '鏈夊尰鐢�'"
+    />
 
-        <img v-if="bedItem.docId === null" src="@/assets/room/open.jpg" style="width: 100%" alt="鏃犲尰鐢�" />
-        <img v-else src="@/assets/room/desk-doctor.jpg" style="width: 100%" alt="鏈夊尰鐢�" />
-        <div>{{ bedItem.bedNo }} {{ bedItem.docName }} {{ bedItem.status === 30 ? "-鏆傚仠" : "" }}</div>
-        <el-button v-if="bedItem.docId == null || bedItem.docId != curUser.id" @click="onHaveSeatclick(bedItem)">
-          鍏ュ骇
-        </el-button>
-        <div v-if="bedItem.docId === curUser.id">
-          <el-button @click=onLeaveSeatclick(bedItem)>
-            绂诲骇
-          </el-button>
-          <span v-if="bedItem.roomId === curBed.roomId && bedItem.bedNo === curBed.bedNo">
-            褰撳墠
-          </span>
-          <el-button v-else @click=onSetCurSeatclick(bedItem)>
-            璁句负褰撳墠
-          </el-button>
-        </div>
-        <el-divider />
-      </div>
+    <div class="bed-card__label">
+      {{ bed.bedNo }} {{ bed.docName }} {{ bed.status === 30 ? "-鏆傚仠" : "" }}
+    </div>
+
+    <div class="bed-card__meta">
+      <span v-for="(checkType, subIndex) in bed.checkTypes" :key="subIndex">
+        {{ getCheckTypeName(checkType) }}
+      </span>
+      <span v-if="bed.opType === 1">棰嗙敤</span>
+      <span v-if="bed.opType === 2">瀹夎</span>
+    </div>
+
+    <div class="bed-card__actions">
+      <el-button v-if="!isMine" @click="onHaveSeatclick(bed)"> 鍏ュ骇 </el-button>
+      <template v-else>
+        <el-button @click="onLeaveSeatclick(bed)"> 绂诲骇 </el-button>
+        <span v-if="isCurSeat" class="bed-card__current">褰撳墠</span>
+        <el-button v-else @click="onSetCurSeatclick(bed)"> 璁句负褰撳墠 </el-button>
+      </template>
     </div>
   </el-card>
 </template>
 
 <style scoped lang="scss">
-.card-title {
-  font-size: 14px;
-  font-weight: 600;
-
-  &::before {
-    position: relative;
-    top: 8px;
-    left: -5px;
-    display: inline-block;
-    width: 3px;
-    height: 14px;
-    //background-color: #105cfb;
-    background: var(--el-color-primary);
-    border-radius: 5px;
-    content: '';
-    transform: translateY(-50%);
-  }
-}
-
-.deskwarp {
+.bed-card {
   display: flex;
   flex-direction: column;
-  align-items: center;
-  /*height: 260px;*/
+  height: 100%;
+  overflow: hidden;
+
+  // 鍗$墖澶达紙璇婂鍚嶏級绱у噾鍖�
+  :deep(.el-card__header) {
+    flex: none;
+    padding: 6px 10px;
+    text-align: center;
+  }
+
+  // 鍗$墖浣擄細绾靛悜鎺掑垪銆佹按骞冲眳涓�
+  :deep(.el-card__body) {
+    display: flex;
+    flex: 1;
+    flex-direction: column;
+    align-items: center;
+    gap: 4px;
+  }
+
+  &__title {
+    font-size: 16px;
+    font-weight: 600;
+    line-height: 1.2;
+  }
+
+  // 鍥剧墖鍥哄畾灏忓昂瀵革紝涓嶅啀闅忓崱鐗囧搴︽斁澶�
+  &__img {
+    flex: none;
+    width: 80px;
+    height: 64px;
+    object-fit: contain;
+  }
+
+  &__label {
+    font-size: 15px;
+    font-weight: 600;
+    line-height: 1.3;
+    // 鍒楀鍥哄畾锛屽厑璁告崲琛岄伩鍏嶆孩鍑哄崱鐗�
+    text-align: center;
+  }
+
+  &__meta {
+    display: flex;
+    flex-wrap: wrap;
+    gap: 0 5px;
+    justify-content: center;
+    font-size: 14px;
+    line-height: 1.3;
+    color: var(--el-text-color-secondary);
+    text-align: center;
+  }
+
+  &__actions {
+    display: flex;
+    flex-wrap: wrap;
+    gap: 5px;
+    align-items: center;
+    justify-content: center;
+    margin-top: 3px;
+  }
+
+  &__current {
+    font-size: 15px;
+    font-weight: 600;
+    color: var(--el-color-primary);
+  }
 }
 </style>
diff --git a/src/views/ecg/room/RoomLoginSelect.vue b/src/views/ecg/room/RoomLoginSelect.vue
index 0602391..9922457 100644
--- a/src/views/ecg/room/RoomLoginSelect.vue
+++ b/src/views/ecg/room/RoomLoginSelect.vue
@@ -1,14 +1,16 @@
 <template>
-  <div style="display: flex; flex-direction: column; align-items: center; height: 100vh; overflow-y: auto;">
-    <div style="display: flex; flex-wrap: wrap; justify-content: center; margin-bottom: 20px">
-      <div class=roomwrap v-for="(value, key) in bedMap" :key="key">
-        <RoomBedSelect :title="key" :bedList="value" :curBed="curSel" :curUser='curUser' @event-haveseat="haveSeat" @event-leaveseat="leaveSeat" @event-setcurseat="setCurSeat"/>
+  <div class="room-select">
+    <div class="room-select__scroll">
+      <div class="room-select__list">
+        <div class="room-select__item" v-for="(bed, index) in bedList" :key="`${bed.roomId}-${bed.bedNo}-${index}`">
+          <RoomBedSelect :bed="bed" :curBed="curSel" :curUser='curUser' @event-haveseat="haveSeat" @event-leaveseat="leaveSeat" @event-setcurseat="setCurSeat"/>
+        </div>
+        <el-empty v-if="isEmptyOpeningBed" class="room-select__empty" description="宸ヤ綅娌℃湁寮�鏀�"/>
       </div>
-      <el-empty v-if="isEmptyOpeningBed" description="宸ヤ綅娌℃湁寮�鏀�"/>
     </div>
-    <div>
-      <el-button @click="confirmCurSel">纭</el-button>
-      <el-button @click="resetPage">閲嶇疆</el-button>
+    <div class="room-select__actions">
+      <el-button type="primary" size="large" @click="confirmCurSel">纭</el-button>
+      <el-button size="large" @click="resetPage">閲嶇疆</el-button>
     </div>
   </div>
 </template>
@@ -44,6 +46,22 @@
   ip: "",
   checkTypes: [],
   opType: 0
+})
+
+// 涓�涓簥浣嶄竴涓崱鐗囷細鎶� {璇婂鍚�: 搴婁綅[]} 鎷嶅钩鎴愬簥浣嶅垪琛�
+const bedList = computed<RoomVO[]>(() => {
+  const list: RoomVO[] = []
+  const map = bedMap.value
+  if (!map) {
+    return list
+  }
+  for (const key in map) {
+    const beds = map[key] as RoomVO[]
+    if (beds && beds.length > 0) {
+      list.push(...beds)
+    }
+  }
+  return list
 })
 
 /** 鍒濆鍖� **/
@@ -289,7 +307,43 @@
 </script>
 
 <style scoped lang="scss">
-.roomwrap {
-  margin-right: 20px;
+// 搴婁綅澶氭椂鍏ㄩ儴鍘嬬缉鍦ㄤ竴灞忓唴鏄剧ず锛屼笉鍑虹幇椤甸潰婊氬姩鏉�
+.room-select {
+  display: flex;
+  flex-direction: column;
+  box-sizing: border-box;
+  height: 100vh;
+  padding: 15px;
+  overflow: hidden;
+
+  // 楂樺害闅忓崱鐗囨暟閲忚嚜閫傚簲锛涘崱鐗囧鍒拌涓嶄笅鏃舵墠鍐呴儴婊氬姩锛堥〉闈㈡湰韬缁堜笉婊氬姩锛�
+  &__scroll {
+    flex: 0 1 auto;
+    min-height: 0;
+    overflow-y: auto;
+  }
+
+  &__list {
+    display: grid;
+    // 鍥哄畾鍒楀锛氬崱鐗囦笉浼氳鎷変几鍙樺舰锛屼粠宸﹀埌鍙炽�佷粠涓婂線涓嬫帓鍒�
+    grid-template-columns: repeat(auto-fit, 188px);
+    justify-content: center;
+    gap: 12px;
+  }
+
+  &__item {
+    min-width: 0;
+  }
+
+  // 绌虹姸鎬佽法婊℃暣琛岋紝閬垮厤琚尋鍒板崟鐙竴鍒楅噷
+  &__empty {
+    grid-column: 1 / -1;
+  }
+
+  &__actions {
+    flex: none;
+    padding-top: 12px;
+    text-align: center;
+  }
 }
 </style>

--
Gitblit v1.9.3