Browse Source

添加游戏列表页

丸子 8 months ago
parent
commit
9637ba94c5

+ 10 - 0
src/api/game/game.js

@@ -0,0 +1,10 @@
+import axios from '@/utils/request'
+
+// 获取游戏列表
+export function GameList (data) {
+  return axios({
+    url: 'bjdxWeb/ai/selectMapGame',
+    method: 'get',
+    data
+  })
+}

BIN
src/assets/images/xiaozhi2.png


+ 3 - 0
src/router/index.js

@@ -83,6 +83,9 @@ const routes = [
   // Blockly2
   { path: '/blockly2', component: () => import('../views/block/Blockly2.vue') },
   { path: '/mapGame', component: () => import('../views/block/MapGame.vue') },
+  // 编程游戏列表
+  { path: '/gamepage', component: () => import('../views/gamepage/GameIndex.vue') },
+
 ]
 const router = createRouter({
   history: createWebHistory(),

+ 49 - 30
src/views/block/MapGame.vue

@@ -4,7 +4,7 @@
     <div class="title-box">
       <div class="box-icon" @click="navigateBack">
         <el-icon class="left-icon"><ArrowLeftBold /></el-icon>
-        地图游戏编程
+        {{ gameTitle }}
       </div>
     </div>
 
@@ -116,7 +116,7 @@
 
 <script setup>
 import { ref, onMounted, onUnmounted, reactive, computed } from 'vue';
-import { useRouter } from 'vue-router';
+import { useRouter, useRoute } from 'vue-router'; 
 import { ArrowLeftBold } from '@element-plus/icons-vue';
 import * as Blockly from "blockly";
 import 'blockly/msg/zh-hans';
@@ -124,6 +124,17 @@ import { javascriptGenerator } from "blockly/javascript";
 import mapBackgroundImage from '@/assets/images/blockly/mapGame.png';
 
 const router = useRouter();
+const route = useRoute();
+const gameTitle = ref('地图游戏编程'); // 默认标题
+
+onMounted(() => {
+  // 获取路由参数中的gameName
+  const nameFromRoute = route.query.gameName;
+  if (nameFromRoute) {
+    gameTitle.value = nameFromRoute;
+  }
+})
+
 
 // 创建游戏状态的响应式对象
 const gameState = reactive({
@@ -214,15 +225,21 @@ function getPointStyle(point) {
 }
 
 // 计算玩家样式
-const playerStyle = computed(() => ({
-  left: playerPosition.value.x * tileSize.value - tileSize.value + 'px',
-  top: playerPosition.value.y * tileSize.value - tileSize.value + 'px',
-  transform: `rotate(${playerDirection.value * 90}deg)`,
-  '--player-rotation': `${playerDirection.value * 90}deg`,
-  width: (tileSize.value * 0.8) + 'px',
-  height: (tileSize.value * 0.8) + 'px',
-  margin: (tileSize.value * 0.1) + 'px'
-}));
+const playerStyle = computed(() => {
+  // 调整旋转角度,使direction=1(右)时图片显示为正的
+  // 原来的角度计算:0=上(0度), 1=右(90度), 2=下(180度), 3=左(270度)
+  // 调整后的角度计算:0=上(270度), 1=右(0度), 2=下(90度), 3=左(180度)
+  const adjustedRotation = (playerDirection.value - 1 + 4) % 4 * 90;
+  return {
+    left: playerPosition.value.x * tileSize.value - tileSize.value + 'px',
+    top: playerPosition.value.y * tileSize.value - tileSize.value + 'px',
+    transform: `rotate(${adjustedRotation}deg)`,
+    '--player-rotation': `${adjustedRotation}deg`,
+    width: (tileSize.value * 0.8) + 'px',
+    height: (tileSize.value * 0.8) + 'px',
+    margin: (tileSize.value * 0.1) + 'px'
+  };
+});
 
 // 显示游戏消息
 function showGameMessage(message, type = 'info') {
@@ -240,6 +257,7 @@ function navigateBack() {
   router.back();
 }
 
+
 // 注册自定义积木
 function registerCustomBlocks() {
   // 向前移动积木
@@ -512,13 +530,12 @@ async function move(direction) {
     output.value += `${moveType}到: (${newX}, ${newY})\n`;
 
     // 检查是否到达终点 - 确保在动画完全完成后才触发终点效果
-    if (Math.abs(newX - endPoint.value.x) < 0.01 && Math.abs(newY - endPoint.value.y) < 0.01) {
-      // 等待动画完全完成后再标记到达终点
-      setTimeout(() => {
-        gameState.player.hasReachedEnd = true;
-        gameState.player.direction = 1;
-        showGameMessage('恭喜你到达终点!', 'success');
-      }, 500); // 等待动画持续时间
+    if (Math.abs(playerPosition.value.x - endPoint.value.x) < 0.01 && Math.abs(playerPosition.value.y - endPoint.value.y) < 0.01) {
+      // 确保玩家精确停在终点位置
+      gameState.player.position = { x: endPoint.value.x, y: endPoint.value.y };
+      gameState.player.hasReachedEnd = true;
+      gameState.player.direction = 1;
+      showGameMessage('恭喜你到达终点!', 'success');
       output.value += '恭喜你到达终点!';
     }
   } else {
@@ -872,13 +889,15 @@ onUnmounted(() => {
 /* 玩家样式 */
 .player {
   position: absolute;
-  background-image: url('@/assets/images/xiaozhi.png');
+  background-image: url('@/assets/images/xiaozhi2.png');
   background-size: contain;
   background-repeat: no-repeat;
   background-position: center;
   border-radius: 5px;
   transition: all 0.3s ease;
   z-index: 10;
+  /* 初始旋转调整,使图片朝右时显示为正的 */
+  transform-origin: center;
 }
 
 /* 碰撞动画 */
@@ -900,17 +919,17 @@ onUnmounted(() => {
 }
 
 @keyframes success {
-  0% { transform: rotate(90deg) scale(1); }
-  10% { transform: rotate(90deg) scale(1.2) translateX(-5px) translateY(-5px); }
-  20% { transform: rotate(90deg) scale(1.3) translateX(5px) translateY(5px); }
-  30% { transform: rotate(90deg) scale(1.2) translateX(-5px) translateY(-5px); }
-  40% { transform: rotate(90deg) scale(1.3) translateX(5px) translateY(5px); }
-  50% { transform: rotate(90deg) scale(1.4) translateX(0) translateY(0); }
-  60% { transform: rotate(90deg) scale(1.3) translateX(-3px) translateY(-3px); }
-  70% { transform: rotate(90deg) scale(1.2) translateX(3px) translateY(3px); }
-  80% { transform: rotate(90deg) scale(1.3) translateX(-3px) translateY(-3px); }
-  90% { transform: rotate(90deg) scale(1.2) translateX(3px) translateY(3px); }
-  100% { transform: rotate(90deg) scale(1); }
+  0% { transform: rotate(0deg) scale(1); }
+  10% { transform: rotate(0deg) scale(1.2) translateX(-5px) translateY(-5px); }
+  20% { transform: rotate(0deg) scale(1.3) translateX(5px) translateY(5px); }
+  30% { transform: rotate(0deg) scale(1.2) translateX(-5px) translateY(-5px); }
+  40% { transform: rotate(0deg) scale(1.3) translateX(5px) translateY(5px); }
+  50% { transform: rotate(0deg) scale(1.4) translateX(0) translateY(0); }
+  60% { transform: rotate(0deg) scale(1.3) translateX(-3px) translateY(-3px); }
+  70% { transform: rotate(0deg) scale(1.2) translateX(3px) translateY(3px); }
+  80% { transform: rotate(0deg) scale(1.3) translateX(-3px) translateY(-3px); }
+  90% { transform: rotate(0deg) scale(1.2) translateX(3px) translateY(3px); }
+  100% { transform: rotate(0deg) scale(1); }
 }
 
 /* 游戏消息样式 */

+ 590 - 0
src/views/gamepage/GameIndex.vue

@@ -0,0 +1,590 @@
+<template>
+  <!-- 游戏页面 -->
+  <div class="home-container">
+    <!-- 展开收起侧边栏 -->
+    <div class="sidebar-container">
+      <div class="sidebar-layout">
+        <div
+          class="icon-expand"
+          :style="{
+            backgroundColor: drawerVisible ? '#44449c' : '#7F70C840',
+            left: drawerVisible ? '18%' : '0'
+          }"
+          @click="toggleDrawer"
+        >
+          <span
+            class="vertical-lines"
+            :style="{
+              color: drawerVisible ? '#8a78d0' : 'white'
+            }"
+            >||</span
+          >
+        </div>
+      </div>
+
+      <transition name="drawer-slide">
+        <div class="main-content" v-if="drawerVisible">
+          <!-- 菜单栏 -->
+          <div class="drawer-box">
+            <el-row class="tac">
+              <el-col :span="12">
+                <span class="mb-2">
+                  <img :src="teachingImg" alt="游戏" />
+                  游戏列表
+                </span>
+                <el-menu
+                  default-active="1"
+                  :class="{ 'el-menu-vertical-demo': true }"
+                >
+                  <el-menu-item
+                    v-for="(title, index) in gameTitles"
+                    :key="index + 1"
+                    :index="(index + 1).toString()"
+                    @click="goToGame(gameData[index])"
+                  >
+                   {{ title }}
+                  </el-menu-item>
+                </el-menu>
+              </el-col>
+            </el-row>
+          </div>
+        </div>
+      </transition>
+    </div>
+
+    <div class="content-box">
+      <div class="box-1">
+        <div class="inner-box left-box">
+          <div class="box-icon" @click="goBack">
+            <el-icon class="left-icon"><ArrowLeftBold /></el-icon>
+            {{ pageTitle }}
+          </div>
+          <!-- 下拉菜单已移除 -->
+        </div>
+        <div class="inner-box right-box">
+          <div class="top-right-box">
+            <el-autocomplete
+              v-model="SearchInput"
+              :fetch-suggestions="querySearch"
+              placeholder="搜索游戏"
+              @select="handleSearchSelect"
+              class="search-input"
+              value-key="typeName"
+              :trigger-on-focus="false"
+              :key="searchKey"
+            >
+              <template #prefix>
+                <el-icon class="el-input__icon"><search /></el-icon>
+              </template>
+              <!-- 下拉项模板 -->
+              <template #default="{ item }">
+                <div class="scrollbar">
+                  <!-- 序号和标题 -->
+                  {{ item.gameSort }} {{ item.typeName }}
+                </div>
+              </template>
+            </el-autocomplete>
+          </div>
+        </div>
+      </div>
+
+      <div class="box-2">
+        <div
+          class="small-box"
+          v-for="(game, index) in gameData"
+          :key="index"
+          @click="goToGame(game)"
+        >
+          <div
+            class="nested-box"
+            :style="{
+              backgroundImage: `url(${game.gameImage})`,
+              backgroundSize: 'cover'
+            }"
+          ></div>
+          <div class="additional-text">
+            {{ game.gameSort }} {{ game.typeName }}
+          </div>
+        </div>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script setup>
+import { ref, onMounted, computed } from 'vue'
+// Element Plus 组件引入
+import { ArrowDown, Search, ArrowLeftBold } from '@element-plus/icons-vue'
+import { useRouter } from 'vue-router'
+import teachingImg from '@/assets/icon/teaching.png'
+// 引入游戏列表接口
+import { GameList } from '@/api/game/game.js'
+
+// 获取当前路由对象
+const router = useRouter() 
+// 页面标题
+const pageTitle = ref('返回虚拟实验室')
+// 抽屉显示状态
+const drawerVisible = ref(true)
+// 游戏数据
+const gameData = ref([])
+
+// 获取游戏列表
+onMounted(() => {
+  GameList().then(res => {
+    // 根据接口返回的数据结构
+    if (res && res.data) {
+      // 处理返回的数据
+      gameData.value = res.data.list.map(item => {
+        let sortNum = item.sort || 0;
+        sortNum = sortNum > 9 ? sortNum : "0" + sortNum;
+        return {
+          id: item.id,
+          typeName: item.name,
+          gameImage: item.mapBackground,
+          gameSort: sortNum
+        };
+      })
+      // 重新渲染搜索组件
+      searchKey.value = Date.now()
+    }
+  }).catch(error => {
+    console.error('获取游戏列表失败:', error)
+  })
+})
+// 切换抽屉显示状态的函数
+const toggleDrawer = () => {
+  drawerVisible.value = !drawerVisible.value
+}
+// 游戏标题数组
+const gameTitles = computed(() => {
+  return gameData.value.map(item => {
+    return `${item.gameSort} ${item.typeName}`;
+  });
+})
+// 搜索框
+const SearchInput = ref('')
+// 用于强制重新渲染搜索组件的key
+const searchKey = ref(Date.now())
+// 搜索建议查询方法
+const querySearch = (queryString, cb) => {
+  const results = queryString
+    ? gameData.value.filter(item => {
+        // 游戏标题和序号查询
+        return item.typeName.toLowerCase().includes(queryString.toLowerCase()) ||
+               item.gameSort.includes(queryString)
+      })
+    : gameData.value
+  cb(results)
+}
+// 搜索选择处理方法
+const handleSearchSelect = item => {
+  goToGame(item)
+  // 清空输入框
+  SearchInput.value = ''
+}
+// 返回上一页
+const goBack = () => {
+  router.go(-1)
+}
+// 跳转到游戏页面
+const goToGame = game => {
+  router.push({
+    path: '/mapGame',
+    query: { gameId: game.id, gameName: game.typeName }
+  })
+}
+
+</script>
+
+<style scoped lang="scss">
+@use 'sass:math';
+// 定义rpx转换函数
+@function rpx($px) {
+  @return math.div($px, 750) * 100vw;
+}
+
+/* 过渡样式 */
+.drawer-slide-enter-active,
+.drawer-slide-leave-active {
+  transition: all 0.3s ease;
+}
+.drawer-slide-enter-from,
+.drawer-slide-leave-to {
+  transform: translateX(-100%);
+  opacity: 0;
+  transition: all 0.3s ease;
+}
+.home-container {
+  position: fixed;
+  top: 0;
+  left: 0;
+  right: 0;
+  bottom: 0;
+  display: flex;
+  flex-direction: row;
+  background: linear-gradient(
+    to bottom,
+    #e2ddfc,
+    #f1effd
+  ); /* 设置悬停、聚焦、点击状态下的背景色 */
+  gap: rpx(0);
+}
+.sidebar-layout {
+  display: flex;
+  flex-direction: row;
+  align-items: flex-start;
+}
+.icon-wrapper {
+  width: 40px; /* 根据实际需要调整宽度 */
+  flex-shrink: 0;
+  background-color: saddlebrown;
+}
+.main-content {
+  width: rpx(135);
+  height: 100%;
+  flex-grow: 1;
+  background: linear-gradient(to bottom, hsl(230, 100%, 21%), #8a78d0);  position: relative;
+  overflow-y: auto; /* 添加垂直滚动条 */
+  max-height: 100%; /* 设置最大高度 */
+  transition: all 0.3s ease;
+  // 自定义滚动条样式
+  &::-webkit-scrollbar {
+    width: rpx(0); // 滚动条宽度
+  }
+  &::-webkit-scrollbar-track {
+    background-color: rgba(255, 255, 255, 0.1); // 滚动条轨道背景色
+    border-radius: rpx(2); // 滚动条轨道圆角
+  }
+  &::-webkit-scrollbar-thumb {
+    background-color: rgba(255, 255, 255, 0.3); // 滚动条滑块颜色
+    border-radius: rpx(2); // 滚动条滑块圆角
+    transition: background-color 0.3s ease; // 滑块颜色过渡效果
+  }
+  &::-webkit-scrollbar-thumb:hover {
+    background-color: rgba(255, 255, 255, 0.5); // 鼠标悬停时的滑块颜色
+  }
+}
+.icon-expand {
+  width: rpx(8);
+  height: rpx(35);
+  border-top-right-radius: rpx(5);
+  border-bottom-right-radius: rpx(5);
+  z-index: 9999;
+  position: absolute;
+  top: 50%;
+  transform: translateY(-50%);
+  cursor: pointer; // 鼠标指针样式
+  // 修改裁剪路径使右侧边缘垂直无缝贴合
+  clip-path: polygon(0 0, 100% 15%, 100% 90%, 0 100%);
+  display: flex;
+  justify-content: center;
+  align-items: center;
+  // 统一过渡时间与菜单保持同步
+  transition: all 0.3s ease;
+}
+.icon-expand .vertical-lines {
+  color: #8a78d0;
+  font-size: rpx(10);
+}
+.content-box {
+  flex: 1;
+  height: 100%;
+  display: flex;
+  flex-direction: column; /* 子元素上下排列 */
+  background: linear-gradient(
+    to bottom,
+    #e2ddfc,
+    #f1effd
+  ); /* 设置悬停、聚焦、点击状态下的背景色 */
+}
+.tac .el-menu {
+  background-color: transparent;
+  border: none;
+  width: 100%;
+  margin-left: rpx(10);
+  margin-top: rpx(10);
+}
+
+.mb-2 {
+  color: white;
+  font-size: rpx(9);
+  margin-left: rpx(10);
+  white-space: nowrap; /* 防止文字换行 */
+}
+.mb-2 img {
+  width: rpx(15);
+  height: rpx(15);
+  vertical-align: middle;
+  margin-top: rpx(-2);
+  margin-left: 0;
+}
+.el-menu-item {
+  width: rpx(115);
+  // height: rpx(20);
+  margin-bottom: rpx(5);
+  border-radius: rpx(6);
+  color: white;
+  font-size: rpx(8);
+}
+
+.el-menu ::v-deep(.el-menu-item:hover),
+.el-menu ::v-deep(.el-menu-item:focus),
+.el-menu ::v-deep(.el-menu-item:active) {
+  background: linear-gradient(
+    to bottom,
+    #ffefb0,
+    #ffcc00
+  ); /* 设置悬停、聚焦、点击状态下的背景色 */
+  box-shadow: 0 8px 8px rgb(0, 0, 0, 0.3);
+  color: black;
+}
+
+.drawer-box {
+  position: absolute;
+  display: flex;
+  // align-items: center;
+  margin-top: rpx(30);
+  height: 100%;
+  width: 100%;
+}
+
+.box-1 {
+  width: 100%;
+  height: rpx(50);
+  display: flex;
+  justify-content: center;
+  align-items: center;
+  box-sizing: border-box;
+  font-size: rpx(16); // 默认字体大小
+}
+.inner-box {
+  height: 100%;
+  display: flex;
+  justify-content: center;
+  align-items: center;
+  font-size: rpx(16); // 默认字体大小
+}
+.left-box {
+  position: relative;
+  justify-content: left;
+  flex: 1;
+  display: flex;
+  align-items: center;
+  gap: rpx(5); // 间距控制
+}
+.box-icon {
+  height: 100%;
+  display: flex;
+  align-items: center; // 垂直居中
+  color: black; // 设置图标颜色为白色
+  padding-left: rpx(15);
+  font-size: rpx(10); // 设置图标大小,可按需调整
+  cursor: pointer; // 鼠标指针样式
+  z-index: 999;
+}
+.box-icon .left-icon {
+  margin-left: rpx(10);
+  margin-right: rpx(5); // 设置图标和文字之间的间距 ;
+}
+
+.dropdown-box {
+  height: 100%;
+  display: flex; // flex 布局;
+  align-items: center; // 垂直居中;
+}
+.dropdown-box .el-button {
+  width: rpx(60); // 设置按钮宽度;
+  height: rpx(15); // 设置按钮高度;
+  background-color: rgb(255, 255, 255, 0.7);
+  border: 1px white solid;
+  box-shadow: 0 4px 8px rgb(0, 0, 0, 0.3);
+  color: black;
+  border: none;
+  margin-left: rpx(10);
+  border-radius: rpx(12);
+  font-size: rpx(8); // 设置字体大小;
+}
+.dropdown-box .el-button:hover,
+.dropdown-box .el-button:focus,
+.dropdown-box .el-button:active {
+  border: none; /* 移除悬停、聚焦、点击状态下的边框 */
+  outline: none; /* 移除悬停、聚焦、点击状态下的轮廓线 el-scrollbar__view el-dropdown__list */
+}
+.dropdown-menu {
+  width: rpx(100);
+  border-radius: rpx(5);
+  border: 1px white solid;
+  background-color: rgb(255, 255, 255, 0.5);
+  backdrop-filter: blur(rpx(5));
+  box-shadow: 0 4px 8px rgba(202, 52, 52, 0.1);
+  margin-left: rpx(40);
+}
+.dropdown-menu ::v-deep(.el-dropdown-menu__item) {
+  font-size: rpx(8);
+  color: black;
+  border-radius: rpx(5);
+  width: rpx(78);
+  height: rpx(20);
+  margin-left: rpx(4);
+  margin-bottom: rpx(8);
+}
+.dropdown-menu ::v-deep(.el-dropdown-menu__item:hover),
+.dropdown-menu ::v-deep(.el-dropdown-menu__item:focus),
+.dropdown-menu ::v-deep(.el-dropdown-menu__item:active) {
+  background: linear-gradient(
+    to bottom,
+    #fee78a,
+    #ffce1b
+  ); /* 设置悬停、聚焦、点击状态下的背景色 */
+}
+.right-box {
+  flex: 1;
+  position: relative; // 添加相对定位;
+  // background-color: #fff;
+  display: flex;
+  justify-content: right;
+  align-items: center;
+}
+.top-right-box {
+   width: rpx(130);
+  display: flex;
+  justify-content: flex;
+}
+.top-right-box {
+  ::v-deep(.el-input__wrapper) {
+    height: rpx(15);
+    font-size: rpx(6);
+    background-color: rgb(255, 255, 255, 0.5);
+    border-radius: rpx(12);
+    border: white 1px solid;
+    color: #aaa5c5;
+  }
+  ::v-deep(.el-input__icon) {
+    color: #aaa5c5; // 设置输入框图标颜色为白色
+  }
+  // 添加占位符样式
+  ::v-deep(.el-input__inner::placeholder) {
+    color: #aaa5c5;
+  }
+  // 添加输入框文字颜色样式
+  ::v-deep(.el-input__inner) {
+    color: black;
+  }
+  ::v-deep(.el-input--prefix){
+    width: rpx(100);
+    text-align: right;
+  }
+}
+// 搜索
+.search-input {
+  width: rpx(200); // 增加搜索框宽度
+  height: rpx(30); // 增加搜索框高度
+  font-size: rpx(9);
+  border-radius: rpx(8); // 添加圆角
+  border: 1px solid #dcdfe6; // 添加边框
+}
+::v-deep(.el-input__inner) {
+  color: #333; // 调整文字颜色
+}
+
+
+.box-2 {
+  width: 100%;
+  // flex: 1;
+  box-sizing: border-box;
+  display: flex; // 确保子元素水平排列
+  flex-wrap: wrap; // 允许子元素换行;
+  cursor: pointer; // 添加鼠标指针样式
+  // margin: rpx(10) 0; 
+  overflow-y: auto;
+}
+// Chrome、Edge等浏览器的滚动条样式
+.box-2::-webkit-scrollbar {
+  width: rpx(2);
+}
+.box-2::-webkit-scrollbar-track {
+  background: transparent; // 设置滚动条轨道背景
+  border-radius: rpx(3); // 设置滚动条轨道圆角
+}
+.box-2::-webkit-scrollbar-thumb {
+  background: linear-gradient(to bottom, hsl(230, 100%, 21%), #8a78d0);
+  border-radius: rpx(3); // 设置滚动条滑块圆角
+}
+.box-2::-webkit-scrollbar-thumb:hover {
+  background: linear-gradient(to bottom, hsl(230, 100%, 21%), #8a78d0);
+}
+.small-box {
+  flex: 0 0 calc(33.333% - rpx(10)); // 每个小盒子占三分之一宽度,减去间距
+  margin-left: rpx(10); // 设置小盒子间距
+  margin-top: rpx(3); // 设置小盒子间距
+  display: flex;
+  flex-direction: column;
+  justify-content: flex-start;
+  align-items: center;
+  color: black;
+  font-size: rpx(8);
+}
+.nested-box {
+  width: rpx(150);
+  height: rpx(80);
+  border-radius: rpx(10);
+  margin-top: rpx(5);
+  display: flex;
+  border: 1px solid white; // 添加边框;
+  justify-content: center;
+  align-items: center;
+}
+.nested-box:hover,
+.nested-box:active {
+  box-shadow: 0 4px 8px rgba(0, 0, 0, 0.5);
+}
+.additional-text {
+  margin-bottom: rpx(4);
+  font-size: rpx(8);
+}
+</style>
+
+<style lang="scss">
+/* 消除小三角 */
+.el-popper__arrow {
+  display: none;
+}
+.el-popper.is-light,
+.el-dropdown__popper.el-popper {
+  background: transparent;
+  border: none;
+  box-shadow: none;
+}
+.el-dropdown__popper {
+  --el-dropdown-menuItem-hover-color: none;
+}
+</style>
+
+<style lang='scss'>
+// 搜索下拉框样式
+@use 'sass:math';
+// 定义rpx转换函数
+@function rpx($px) {
+  @return math.div($px, 750) * 100vw;
+}
+ .el-autocomplete-suggestion .el-scrollbar__wrap{
+  margin: 0 auto;
+  background-color: rgba(255, 255, 255, 0.7);
+  border: 2px solid white;
+  border-radius: rpx(5);
+  backdrop-filter: blur(rpx(5));
+}
+ .el-autocomplete-suggestion li{
+  color: black;
+  font-size: rpx(7);
+  padding: rpx(5) rpx(8); // 调整下拉项内边距
+}
+ .el-autocomplete-suggestion li:hover{
+  background: linear-gradient(
+    to bottom,
+    #ffefb0,
+    #ffcc00
+  );
+}
+</style>