Quellcode durchsuchen

完成流程管理 页面接口

hzj18279462576@163.com vor 2 Jahren
Ursprung
Commit
644893344d
77 geänderte Dateien mit 9915 neuen und 540 gelöschten Zeilen
  1. 39 1
      README.md
  2. 120 0
      src/api/system.js
  3. BIN
      src/assets/addRoom.png
  4. BIN
      src/assets/blockUp.png
  5. BIN
      src/assets/cleanRoom.png
  6. BIN
      src/assets/comment.png
  7. BIN
      src/assets/delete.png
  8. BIN
      src/assets/delete_hover.png
  9. BIN
      src/assets/hint.png
  10. BIN
      src/assets/houseS.png
  11. BIN
      src/assets/images/consult.png
  12. BIN
      src/assets/images/consult_s.png
  13. BIN
      src/assets/images/dance.png
  14. BIN
      src/assets/images/dance_s.png
  15. BIN
      src/assets/images/design.png
  16. BIN
      src/assets/images/design_s.png
  17. BIN
      src/assets/images/financing.png
  18. BIN
      src/assets/images/financing_s.png
  19. BIN
      src/assets/images/gold.png
  20. BIN
      src/assets/images/gold_s.png
  21. BIN
      src/assets/images/guestRoom.png
  22. BIN
      src/assets/images/guestRoom_s.png
  23. BIN
      src/assets/images/hall.png
  24. BIN
      src/assets/images/hall_s.png
  25. BIN
      src/assets/images/interflow.png
  26. BIN
      src/assets/images/interflow_s.png
  27. BIN
      src/assets/images/league.png
  28. BIN
      src/assets/images/league_s.png
  29. BIN
      src/assets/images/live.png
  30. BIN
      src/assets/images/live_s.png
  31. BIN
      src/assets/images/musical.png
  32. BIN
      src/assets/images/musical_s.png
  33. BIN
      src/assets/images/platina.png
  34. BIN
      src/assets/images/platina_s.png
  35. BIN
      src/assets/images/programme.png
  36. BIN
      src/assets/images/programme_s.png
  37. BIN
      src/assets/images/protocol.png
  38. BIN
      src/assets/images/protocol_s.png
  39. BIN
      src/assets/images/repast.png
  40. BIN
      src/assets/images/repast_s.png
  41. BIN
      src/assets/images/select.png
  42. BIN
      src/assets/images/silver.png
  43. BIN
      src/assets/images/silver_s.png
  44. BIN
      src/assets/images/sing.png
  45. BIN
      src/assets/images/sing_s.png
  46. BIN
      src/assets/images/video.png
  47. BIN
      src/assets/images/video_s.png
  48. BIN
      src/assets/imgDel.png
  49. BIN
      src/assets/lookImg.png
  50. BIN
      src/assets/maintain.png
  51. BIN
      src/assets/photo.png
  52. BIN
      src/assets/retain.png
  53. BIN
      src/assets/roomFlow.png
  54. BIN
      src/assets/roomFlowC.png
  55. BIN
      src/assets/roomState.png
  56. BIN
      src/assets/roomStateC.png
  57. BIN
      src/assets/roomStates.png
  58. BIN
      src/assets/shop.png
  59. BIN
      src/assets/shop_s.png
  60. 1 1
      src/layout/index.vue
  61. 100 49
      src/layout/sidebar/SidevarItem.vue
  62. 47 8
      src/router/index.js
  63. 2 1
      src/store/modules/user.js
  64. 5 1
      src/views/account/account.vue
  65. 5 1
      src/views/houseList/houseList.vue
  66. 1325 0
      src/views/housePrice/housePrice.vue
  67. 3803 0
      src/views/houseState/houseState.vue
  68. 5 1
      src/views/ledger/ledger.vue
  69. 1 1
      src/views/login/index.vue
  70. 51 2
      src/views/map/map.vue
  71. 496 235
      src/views/order/order.vue
  72. 1504 0
      src/views/orderEvaluate/orderEvaluate.vue
  73. 1141 0
      src/views/roomFlow/roomFlow.vue
  74. 402 211
      src/views/roomInfo/roomInfo.vue
  75. 228 15
      src/views/roomType/roomType.vue
  76. 626 0
      src/views/serviceMall/serviceMall.vue
  77. 14 13
      vite.config.js

+ 39 - 1
README.md

@@ -1 +1,39 @@
-#Homestay_manage_business
+# 校园报修系统
+
+#### 介绍
+{**以下是 Gitee 平台说明,您可以替换此简介**
+Gitee 是 OSCHINA 推出的基于 Git 的代码托管平台(同时支持 SVN)。专为开发者提供稳定、高效、安全的云端软件开发协作平台
+无论是个人、团队、或是企业,都能够用 Gitee 实现代码托管、项目管理、协作开发。企业项目请看 [https://gitee.com/enterprises](https://gitee.com/enterprises)}
+
+#### 软件架构
+软件架构说明
+
+
+#### 安装教程
+
+1.  xxxx
+2.  xxxx
+3.  xxxx
+
+#### 使用说明
+
+1.  xxxx
+2.  xxxx
+3.  xxxx
+
+#### 参与贡献
+
+1.  Fork 本仓库
+2.  新建 Feat_xxx 分支
+3.  提交代码
+4.  新建 Pull Request
+
+
+#### 特技
+
+1.  使用 Readme\_XXX.md 来支持不同的语言,例如 Readme\_en.md, Readme\_zh.md
+2.  Gitee 官方博客 [blog.gitee.com](https://blog.gitee.com)
+3.  你可以 [https://gitee.com/explore](https://gitee.com/explore) 这个地址来了解 Gitee 上的优秀开源项目
+4.  [GVP](https://gitee.com/gvp) 全称是 Gitee 最有价值开源项目,是综合评定出的优秀开源项目
+5.  Gitee 官方提供的使用手册 [https://gitee.com/help](https://gitee.com/help)
+6.  Gitee 封面人物是一档用来展示 Gitee 会员风采的栏目 [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/)

+ 120 - 0
src/api/system.js

@@ -0,0 +1,120 @@
+import request from "@/utils/request";
+const requests = "/video/transcoding"; // 线上
+// const requests = '/video/transcoding/transcoding'// 线下
+export default {
+  // 添加监控信息
+  async systemList(data) {
+    let requestData = await request({
+      url: `${requests}/config/showCfg`,
+      method: "get",
+      headers: {
+        "Content-Type": "application/x-www-form-urlencoded;charset=utf-8",
+      },
+      params: data,
+    });
+    return requestData;
+  },
+
+  // 删除监控信息
+  async delCamera(data) {
+    let requestData = await request({
+      url: `${requests}/camera/delete`,
+      method: "DELETE",
+      data,
+    });
+    return requestData;
+  },
+
+  // 修改监控信息
+  async updateCamera(data) {
+    let requestData = await request({
+      url: `${requests}/camera/updateCamera`,
+      method: "PUT",
+      headers: { "Content-Type": "application/json; charset=utf-8" },
+      data,
+    });
+    return requestData;
+  },
+
+  // 监控信息列表
+  async queryCamera(data) {
+    let requestData = await request({
+      url: `${requests}/camera/queryCamera`,
+      method: "POST",
+      headers: {
+        "Content-Type": "application/x-www-form-urlencoded;charset=utf-8",
+      },
+      params: data,
+    });
+    return requestData;
+  },
+  // 导出监控信息
+  async download(params) {
+    let requestData = await request({
+      url: `${requests}/camera/download`,
+      method: "GET",
+      headers: {
+        "Content-Type": "application/x-www-form-urlencoded;charset=utf-8",
+      },
+      responseType: "blob",
+      params,
+    });
+    return requestData;
+  },
+  // 导入监控信息
+  async importByExcel(data) {
+    let requestData = await request({
+      url: `${requests}/camera/importByExcel`,
+      method: "POST",
+      headers: { "Content-Type": "multipart/form-data" },
+      data,
+    });
+    return requestData;
+  },
+
+  // 使用Stream推拉流
+  async addStreamSource(data) {
+    let requestData = await request({
+      url: `${requests}/stream/addStreamSource`,
+      method: "POST",
+      headers: { "Content-Type": "application/json; charset=utf-8" },
+      data,
+    });
+    return requestData;
+  },
+
+  // 关闭Stream推拉流
+  async delStreamSource(data) {
+    let requestData = await request({
+      url: `${requests}/stream/delStreamSource`,
+      method: "POST",
+      headers: { "Content-Type": "application/json; charset=utf-8" },
+      data,
+    });
+    return requestData;
+  },
+  // 更新输出链接
+  async updateCameraLink(params) {
+    let requestData = await request({
+      url: `${requests}/camera/updateCameraLink`,
+      method: "GET",
+      headers: {
+        "Content-Type": "application/x-www-form-urlencoded;charset=utf-8",
+      },
+      params,
+    });
+    return requestData;
+  },
+  // 关闭当前播放回写剩下的播放链接、
+  async delAndUpdateLink(params) {
+    let requestData = await request({
+      url: `${requests}/stream/delAndUpdateLink`,
+      method: "GET",
+      headers: {
+        "Content-Type": "application/x-www-form-urlencoded;charset=utf-8",
+      },
+      params,
+    });
+    return requestData;
+  },
+};

BIN
src/assets/addRoom.png


BIN
src/assets/blockUp.png


BIN
src/assets/cleanRoom.png


BIN
src/assets/comment.png


BIN
src/assets/delete.png


BIN
src/assets/delete_hover.png


BIN
src/assets/hint.png


BIN
src/assets/houseS.png


BIN
src/assets/images/consult.png


BIN
src/assets/images/consult_s.png


BIN
src/assets/images/dance.png


BIN
src/assets/images/dance_s.png


BIN
src/assets/images/design.png


BIN
src/assets/images/design_s.png


BIN
src/assets/images/financing.png


BIN
src/assets/images/financing_s.png


BIN
src/assets/images/gold.png


BIN
src/assets/images/gold_s.png


BIN
src/assets/images/guestRoom.png


BIN
src/assets/images/guestRoom_s.png


BIN
src/assets/images/hall.png


BIN
src/assets/images/hall_s.png


BIN
src/assets/images/interflow.png


BIN
src/assets/images/interflow_s.png


BIN
src/assets/images/league.png


BIN
src/assets/images/league_s.png


BIN
src/assets/images/live.png


BIN
src/assets/images/live_s.png


BIN
src/assets/images/musical.png


BIN
src/assets/images/musical_s.png


BIN
src/assets/images/platina.png


BIN
src/assets/images/platina_s.png


BIN
src/assets/images/programme.png


BIN
src/assets/images/programme_s.png


BIN
src/assets/images/protocol.png


BIN
src/assets/images/protocol_s.png


BIN
src/assets/images/repast.png


BIN
src/assets/images/repast_s.png


BIN
src/assets/images/select.png


BIN
src/assets/images/silver.png


BIN
src/assets/images/silver_s.png


BIN
src/assets/images/sing.png


BIN
src/assets/images/sing_s.png


BIN
src/assets/images/video.png


BIN
src/assets/images/video_s.png


BIN
src/assets/imgDel.png


BIN
src/assets/lookImg.png


BIN
src/assets/maintain.png


BIN
src/assets/photo.png


BIN
src/assets/retain.png


BIN
src/assets/roomFlow.png


BIN
src/assets/roomFlowC.png


BIN
src/assets/roomState.png


BIN
src/assets/roomStateC.png


BIN
src/assets/roomStates.png


BIN
src/assets/shop.png


BIN
src/assets/shop_s.png


+ 1 - 1
src/layout/index.vue

@@ -22,7 +22,7 @@ const flag = ref(true);
 watch(
   () => router.currentRoute.value.fullPath,
   (newValue, oldValue) => {
-    console.log(newValue);
+    // console.log(newValue);
     store.commit("indexUp", newValue);
     sessionStorage.setItem("sidevarItem", newValue);
   }

+ 100 - 49
src/layout/sidebar/SidevarItem.vue

@@ -1,21 +1,32 @@
 <template>
   <div class="box-item">
-    <el-menu
-      class="el-menu-vertical-demo"
-      text-color="#fff"
-      active-color="rgba(9, 101, 98, 1)"
-      :default-active="activeIndex"
-      :collapse="menuClose"
-      @select="handleSelect"
-      :default-openeds="[34]"
-      :router="true"
-    >
+    <el-menu class="el-menu-vertical-demo" text-color="#fff" active-color="rgba(9, 101, 98, 1)"
+      :default-active="activeIndex" :collapse="menuClose" @select="handleSelect" :router="true">
+      <!-- :default-openeds="[34]" -->
       <div class="logo el-menu-item">
-        <el-icon :size="20"
-          ><img src="@/assets/logo.png" style="width: 30px; height: 24px"
-        /></el-icon>
+        <el-icon :size="20"><img src="@/assets/logo.png" style="width: 30px; height: 24px" /></el-icon>
       </div>
-      <el-menu-item index="/seniorCelebrity/order">
+      <!-- 订单管理 -->
+      <el-sub-menu :index="12">
+        <template #title>
+          <img v-if="activeIndex == '/seniorCelebrity/order' ||
+            activeIndex == '/seniorCelebrity/orderEvaluate'
+            " src="@/assets/orderS.png" alt="" style="width: 22px; height: 22px; margin: 0 18px" />
+          <img v-else src="@/assets/order.png" alt="" style="width: 22px; height: 22px; margin: 0 18px" />
+          <span>订单管理</span>
+        </template>
+        <el-menu-item index="/seniorCelebrity/order">
+          <template #title>
+            <span>订单管理</span>
+          </template>
+        </el-menu-item>
+        <el-menu-item index="/seniorCelebrity/orderEvaluate">
+          <template #title>
+            <span>订单评价</span>
+          </template>
+        </el-menu-item>
+      </el-sub-menu>
+      <!-- <el-menu-item index="/seniorCelebrity/order">
         <img
           v-if="activeIndex == '/seniorCelebrity/order'"
           src="@/assets/orderS.png"
@@ -29,29 +40,42 @@
           style="width: 22px; height: 22px; margin: 0 18px"
         />
         <span>订单管理</span>
-      </el-menu-item>
+      </el-menu-item> -->
+      <!-- 房态管理 -->
+      <el-sub-menu :index="34">
+        <template #title>
+          <img v-if="activeIndex == '/seniorCelebrity/houseState' ||
+            activeIndex == '/seniorCelebrity/housePrice'
+            " src="@/assets/roomStateC.png" alt="" style="width: 22px; height: 22px; margin: 0 18px" />
+          <img v-else src="@/assets/roomState.png" alt="" style="width: 22px; height: 22px; margin: 0 18px" />
+          <span>房态管理</span>
+        </template>
+        <el-menu-item index="/seniorCelebrity/houseState">
+          <template #title>
+            <span>房态管理</span>
+          </template>
+        </el-menu-item>
+        <el-menu-item index="/seniorCelebrity/housePrice">
+          <template #title>
+            <span>房价管理</span>
+          </template>
+        </el-menu-item>
+      </el-sub-menu>
+      <!-- 台账管理 -->
       <el-menu-item index="/seniorCelebrity/ledger">
-        <img
-          v-if="activeIndex == '/seniorCelebrity/ledger'"
-          src="@/assets/ledgerS.png"
-          alt=""
-          style="width: 22px; height: 22px; margin: 0 18px"
-        />
-        <img
-          v-else
-          src="@/assets/ledger.png"
-          alt=""
-          style="width: 22px; height: 22px; margin: 0 18px"
-        />
+        <img v-if="activeIndex == '/seniorCelebrity/ledger'" src="@/assets/ledgerS.png" alt=""
+          style="width: 22px; height: 22px; margin: 0 18px" />
+        <img v-else src="@/assets/ledger.png" alt="" style="width: 22px; height: 22px; margin: 0 18px" />
         <span>台账管理</span>
       </el-menu-item>
-      <el-sub-menu :index="34">
+      <!-- 民宿管理 -->
+      <el-sub-menu :index="56">
         <template #title>
-          <img
-            src="@/assets/house.png"
-            style="width: 22px; height: 22px; margin: 0 20px 0 18px"
-            alt=""
-          />
+          <img v-if="activeIndex == '/seniorCelebrity/houseInfo' ||
+            activeIndex == '/seniorCelebrity/houseType' ||
+            activeIndex == '/seniorCelebrity/houseList'
+            " src="@/assets/houseS.png" style="width: 22px; height: 22px; margin: 0 20px 0 18px" alt="" />
+          <img v-else src="@/assets/house.png" style="width: 22px; height: 22px; margin: 0 20px 0 18px" alt="" />
           <span>民宿管理</span>
         </template>
         <el-menu-item index="/seniorCelebrity/houseInfo">
@@ -73,24 +97,34 @@
           </template>
         </el-menu-item>
       </el-sub-menu>
-      <el-menu-item
-        index="/seniorCelebrity/account"
-        v-if="store.state.user.level == 2"
-      >
-        <img
-          v-if="activeIndex == '/seniorCelebrity/account'"
-          src="@/assets/systemS.png"
-          alt=""
-          style="width: 20px; height: 20px; margin: 0 20px"
-        />
-        <img
-          v-else
-          src="@/assets/system.png"
-          alt=""
-          style="width: 20px; height: 20px; margin: 0 21px"
-        />
+      <!-- 流程管理 -->
+      <el-sub-menu :index="78">
+        <template #title>
+          <img v-if="activeIndex == '/seniorCelebrity/roomFlow'" src="@/assets/roomFlowC.png" alt=""
+            style="width: 22px; height: 22px; margin: 0 18px" />
+          <img v-else src="@/assets/roomFlow.png" alt="" style="width: 22px; height: 22px; margin: 0 18px" />
+          <span>流程管理</span>
+        </template>
+        <el-menu-item index="/seniorCelebrity/roomFlow">
+          <template #title>
+            <span>我发起的</span>
+          </template>
+        </el-menu-item>
+      </el-sub-menu>
+      <!-- 账号管理 -->
+      <el-menu-item index="/seniorCelebrity/account" v-if="store.state.user.level == 2">
+        <img v-if="activeIndex == '/seniorCelebrity/account'" src="@/assets/systemS.png" alt=""
+          style="width: 20px; height: 20px; margin: 0 20px" />
+        <img v-else src="@/assets/system.png" alt="" style="width: 20px; height: 20px; margin: 0 20px" />
         <span>账号管理</span>
       </el-menu-item>
+      <!-- 服务商城 -->
+      <el-menu-item index="/seniorCelebrity/serviceMall">
+        <img v-if="activeIndex == '/seniorCelebrity/serviceMall'" src="@/assets/shop_s.png" alt=""
+          style="width: 20px; height: 20px; margin: 0 20px" />
+        <img v-else src="@/assets/shop.png" alt="" style="width: 20px; height: 20px; margin: 0 20px" />
+        <span>服务商城</span>
+      </el-menu-item>
     </el-menu>
   </div>
 </template>
@@ -177,6 +211,7 @@ onBeforeMount(() => {
   width: 200px;
   // min-height: 400px;
 }
+
 .el-menu {
   width: 100%;
   height: 100%;
@@ -196,21 +231,26 @@ onBeforeMount(() => {
     justify-content: space-around;
     align-items: center;
   }
+
   .logo:hover {
     background-color: transparent !important;
   }
+
   .el-sub-menu {
     .el-menu-item {
       // background-color: rgba(255, 255, 255, 1);
       // color: rgba(9, 101, 98, 1);
       padding: 0 20px 0 78px;
     }
+
     :deep(.el-tooltip__trigger) {
       padding: 0 20px;
     }
+
     :deep(.el-sub-menu__title):hover {
       color: rgba(9, 101, 98, 1);
       background-color: rgb(214, 214, 214);
+
       span {
         color: rgba(9, 101, 98, 1);
       }
@@ -220,16 +260,19 @@ onBeforeMount(() => {
       background-color: rgba(9, 101, 98, 1);
     }
   }
+
   .el-menu {
     .el-menu-item {
       background-color: rgba(9, 101, 98, 1);
       // padding-left: 30px;
     }
+
     .el-menu-item:hover {
       color: rgba(9, 101, 98, 1);
       background-color: rgb(214, 214, 214);
     }
   }
+
   .el-sub-menu:hover {
     color: rgba(9, 101, 98, 1);
   }
@@ -238,6 +281,7 @@ onBeforeMount(() => {
     background-color: rgb(214, 214, 214);
     color: rgba(9, 101, 98, 1);
   }
+
   .el-menu-item.is-active {
     background-color: rgba(255, 255, 255, 1);
     color: rgba(9, 101, 98, 1);
@@ -250,4 +294,11 @@ onBeforeMount(() => {
 //   background-color: rgba(111, 182, 184, 1);
 //   color: #fff;
 // }
+.el-sub-menu.is-active {
+  :deep(.el-sub-menu__title) {
+    // border: 1px solid red;
+    color: rgba(9, 101, 98, 1) !important;
+    background-color: rgb(255, 255, 255);
+  }
+}
 </style>

+ 47 - 8
src/router/index.js

@@ -5,6 +5,7 @@ import {
 } from "vue-router";
 import Layout from "@/layout/index.vue";
 import store from "@/store";
+import { ElMessage, ElMessageBox } from "element-plus";
 const routes = [
   {
     path: "/login",
@@ -26,6 +27,24 @@ const routes = [
         meta: { title: "Dashboard", icon: "dashboard" },
       },
       {
+        path: "orderEvaluate",
+        name: "orderEvaluate",
+        component: () => import("@/views/orderEvaluate/orderEvaluate.vue"),
+        meta: { title: "Dashboard", icon: "dashboard" },
+      },
+      {
+        path: "houseState",
+        name: "houseState",
+        component: () => import("@/views/houseState/houseState.vue"),
+        meta: { title: "Dashboard", icon: "dashboard" },
+      },
+      {
+        path: "housePrice",
+        name: "housePrice",
+        component: () => import("@/views/housePrice/housePrice.vue"),
+        meta: { title: "Dashboard", icon: "dashboard" },
+      },
+      {
         path: "ledger",
         name: "ledger",
         component: () => import("@/views/ledger/ledger.vue"),
@@ -49,11 +68,20 @@ const routes = [
         component: () => import("@/views/houseList/houseList.vue"),
         meta: { title: "Dashboard", icon: "dashboard" },
       },
-      // {
-      //   path: "account",
-      //   component: () => import("@/views/account/account.vue"),
-      //   meta: { title: "Dashboard", icon: "dashboard" },
-      // },
+      {
+        path: "roomFlow",
+        name: "roomFlow",
+        component: () => import("@/views/roomFlow/roomFlow.vue"),
+        meta: { title: "Dashboard", icon: "dashboard" },
+      },
+      {
+        path: "serviceMall",
+        name: "serviceMall",
+        component: () => import("@/views/serviceMall/serviceMall.vue"),
+        meta: {
+          title: "服务商城",
+        },
+      },
     ],
   },
   {
@@ -63,9 +91,9 @@ const routes = [
   },
 ];
 const router = createRouter({
-  // history: createWebHashHistory("/carstop/dist6"), // 线上地址
+  history: createWebHashHistory("/business"), // 线上地址
   // history: createWebHashHistory("/testingServertomcat/dist6"), // 测试环境发布地址
-  history: createWebHashHistory("/hotelReservation/pc3/"), // 测试环境发布地址
+  // history: createWebHashHistory("/hotelReservation/pc3/"), // 测试环境发布地址
   routes: routes,
 });
 export default router;
@@ -80,6 +108,7 @@ router.beforeEach(async (to, from, next) => {
         adminName: sessionStorage.getItem("username"),
         password: sessionStorage.getItem("name"),
       });
+      console.log(res, "路由判断登录");
       if (res == "success") {
         if (store.state.user.level == 2) {
           let modules = import.meta.glob("../views/**/*.vue");
@@ -90,8 +119,18 @@ router.beforeEach(async (to, from, next) => {
           };
           router.addRoute("seniorCelebrity", arr);
         }
+        next({ ...to, replace: true });
+      } else {
+        sessionStorage.removeItem("token");
+        sessionStorage.removeItem("name");
+        ElMessage({
+          type: "error",
+          showClose: true,
+          message: res.data.data.message,
+          center: true,
+        });
       }
-      next({ ...to, replace: true }); //----------解决
+      //----------解决
 
       // next({ path: "/index" }); //----------解决
     }

+ 2 - 1
src/store/modules/user.js

@@ -69,6 +69,7 @@ const actions = {
         sessionStorage.setItem("name", data.password);
 
         sessionStorage.setItem("token", res.data.data.managerId);
+        sessionStorage.setItem("roomId", res.data.data.id);
         // 1 是  0 否
         if (res.data.isLogin == 1) {
           sessionStorage.setItem("isLogin", 1);
@@ -85,7 +86,7 @@ const actions = {
 
         resolve("success");
       } else {
-        reject("reject");
+        resolve({ name: "reject", data: res });
       }
     });
   },

+ 5 - 1
src/views/account/account.vue

@@ -34,7 +34,7 @@
         >
       </div>
     </div>
-    <div class="footer">
+    <div class="footer" v-loading="loading">
       <el-table
         :row-class-name="tableRowClassName"
         :data="tableData.list"
@@ -200,6 +200,7 @@ import { useStore } from "vuex";
 const store = useStore();
 const router = useRouter();
 // 表格数据
+const loading = ref(false);
 const tableData = reactive({
   list: [
     // {
@@ -370,6 +371,7 @@ const getList = async () => {
   // if (searchInput.account) {
   //   data.adminName = searchInput.adminName;
   // }
+  loading.value = true;
   let data = {
     page: currentPage.value, // 当前页
     rows: pageSize.value, // 一页数据条数
@@ -388,6 +390,7 @@ const getList = async () => {
   if (res.data.code == 200) {
     tableData.list = res.data.data.pageList;
     total.value = res.data.data.total;
+    loading.value = false;
     // ElMessage({
     //   type: "success",
     //   showClose: true,
@@ -395,6 +398,7 @@ const getList = async () => {
     //   center: true,
     // });
   } else {
+    loading.value = false;
     ElMessage({
       type: "error",
       showClose: true,

+ 5 - 1
src/views/houseList/houseList.vue

@@ -45,7 +45,7 @@
         >
       </div> -->
     </div>
-    <div class="footer">
+    <div class="footer" v-loading="loading">
       <el-table
         :row-class-name="tableRowClassName"
         :data="tableData.list"
@@ -217,6 +217,7 @@ import { useStore } from "vuex";
 const store = useStore();
 const router = useRouter();
 // 表格数据
+const loading = ref(false);
 const tableData = reactive({
   list: [
     // {
@@ -342,6 +343,7 @@ watch(
 );
 // 获取账户列表
 const getList = async () => {
+  loading.value = true;
   let data = {
     page: currentPage.value, // 当前页
     rows: pageSize.value, // 一页数据条数
@@ -361,6 +363,7 @@ const getList = async () => {
   if (res.data.code == 200) {
     tableData.list = res.data.data.pageList;
     total.value = res.data.data.total;
+    loading.value = false;
     // ElMessage({
     //   type: "success",
     //   showClose: true,
@@ -368,6 +371,7 @@ const getList = async () => {
     //   center: true,
     // });
   } else {
+    loading.value = false;
     ElMessage({
       type: "error",
       showClose: true,

Datei-Diff unterdrückt, da er zu groß ist
+ 1325 - 0
src/views/housePrice/housePrice.vue


Datei-Diff unterdrückt, da er zu groß ist
+ 3803 - 0
src/views/houseState/houseState.vue


+ 5 - 1
src/views/ledger/ledger.vue

@@ -51,7 +51,7 @@
           >
         </div>
       </div>
-      <div class="footer">
+      <div class="footer" v-loading="loading">
         <el-table
           :row-class-name="tableRowClassName"
           :data="tableData.list"
@@ -157,6 +157,7 @@ const store = useStore();
 const api = ref("");
 const router = useRouter();
 // 表格数据
+const loading = ref(false);
 const tableData = reactive({
   list: [
     // {
@@ -284,6 +285,7 @@ watch(
 
 // 查看员工列表
 const getList = async () => {
+  loading.value = true;
   let data = {
     page: currentPage.value,
     rows: pageSize.value,
@@ -307,6 +309,7 @@ const getList = async () => {
   if (res.data.code == 200) {
     tableData.list = res.data.data.bookIPage.pageList;
     total.value = res.data.data.bookIPage.total;
+    loading.value = false;
     // ElMessage({
     //   type: "success",
     //   showClose: true,
@@ -314,6 +317,7 @@ const getList = async () => {
     //   center: true,
     // });
   } else {
+    loading.value = false;
     ElMessage({
       type: "error",
       showClose: true,

+ 1 - 1
src/views/login/index.vue

@@ -151,7 +151,7 @@ const submitForm = (formEl) => {
         ElMessage({
           type: "error",
           showClose: true,
-          message: "用户名或密码错误",
+          message: res.data.data.message,
           center: true,
         });
       }

+ 51 - 2
src/views/map/map.vue

@@ -24,15 +24,28 @@
 
 <script setup>
 import loadBMap from "@/utils/loadMap.js";
-import { ref, reactive, onBeforeMount, onMounted, watch } from "vue";
+import {
+  ref,
+  reactive,
+  onBeforeMount,
+  onMounted,
+  watch,
+  watchEffect,
+  nextTick,
+} from "vue";
 const mapInit = loadBMap("jmkawuXGwcepLcsAqcAi3FeDMfaLhnOE");
 
+const props = defineProps({
+  fatherMessage: {},
+});
+
 const lng = ref("--");
 const lat = ref("--");
 const address = ref("");
 const map = ref();
 
 const emit = defineEmits(["mapClick"]);
+
 // 确定按钮
 const mapAddress = (flag) => {
   let data = {
@@ -48,8 +61,24 @@ const getList = () => {
   mapInit.then((BMap) => {
     //创建地图实例,位于BMap命名空间下的Map类表示地图,通过new操作符可以创建一个地图实例。其参数可以是元素id也可以是元素对象。
     map.value = new BMap.Map("map");
-    map.value.centerAndZoom("江西", 12); // 初始化地图,设置城市和地图级别
+    var points;
+    // 创建点坐标
+    if (props.fatherMessage.lat && props.fatherMessage.lng) {
+      points = new BMap.Point(props.fatherMessage.lat, props.fatherMessage.lng);
+      lng.value = props.fatherMessage.lng;
+      lat.value = props.fatherMessage.lat;
+      address.value = props.fatherMessage.position;
+    } else {
+      points = "江西";
+    }
+    map.value.centerAndZoom(points, 16); // 初始化地图,设置城市和地图级别
     map.value.enableScrollWheelZoom(true); //开启鼠标滚轮缩放
+    // map.value.addOverlay(
+    //   new BMap.Marker({
+    //     lng: 114.97804777753186,
+    //     lat: 28.838700575036494,
+    //   })
+    // );
 
     const ac = new BMap.Autocomplete({
       input: "suggestId",
@@ -83,6 +112,25 @@ const getList = () => {
           lat: e.Af.lat.toFixed(8),
         })
       );
+      // 地址逆解析(无法获取精确地址)
+      // var geoc = new BMap.Geocoder();
+      // var pt = e.Af;
+      // var marker = new BMap.Marker(new BMap.Point(pt.lng, pt.lat));
+      // map.value.addOverlay(marker);
+      // geoc.getLocation(pt, function (rs) {
+      //   var addComp = rs.addressComponents;
+      //   console.log(
+      //     addComp.province +
+      //       ", " +
+      //       addComp.city +
+      //       ", " +
+      //       addComp.district +
+      //       ", " +
+      //       addComp.street +
+      //       ", " +
+      //       addComp.streetNumber
+      //   );
+      // });
     });
     // map.value.removeEventListener("click", handleClick); // 移除当前点击点的经纬度事件监听
   });
@@ -155,6 +203,7 @@ const latlngToAddress = (BMap, latlng) => {
 };
 onBeforeMount(async () => {
   getList();
+  console.log(props.fatherMessage);
 });
 </script>
 

Datei-Diff unterdrückt, da er zu groß ist
+ 496 - 235
src/views/order/order.vue


Datei-Diff unterdrückt, da er zu groß ist
+ 1504 - 0
src/views/orderEvaluate/orderEvaluate.vue


Datei-Diff unterdrückt, da er zu groß ist
+ 1141 - 0
src/views/roomFlow/roomFlow.vue


Datei-Diff unterdrückt, da er zu groß ist
+ 402 - 211
src/views/roomInfo/roomInfo.vue


+ 228 - 15
src/views/roomType/roomType.vue

@@ -38,7 +38,7 @@
           >
         </div>
       </div>
-      <div class="footer">
+      <div class="footer" v-loading="loading">
         <el-table
           :row-class-name="tableRowClassName"
           :data="tableData.list"
@@ -115,9 +115,19 @@
                       <div class="img img1">
                         <div class="updateImg">
                           <div class="imglist" v-if="fileList.list.length">
-                            <div v-for="i in fileList.list">
+                            <div class="imgItem" v-for="i in fileList.list">
                               <img :src="i.url" alt="" />
-                              <div class="del" @click="handleRemove(i)"></div>
+                              <div class="lookImg">
+                                <img
+                                  src="@/assets/lookImg.png"
+                                  alt=""
+                                  @click="lookImg(i)"
+                                />
+                                <div
+                                  class="delimg"
+                                  @click="handleRemove(i)"
+                                ></div>
+                              </div>
                             </div>
                           </div>
                           <div class="imglist" v-else>
@@ -208,6 +218,32 @@
                   </el-form-item>
                 </div>
               </div>
+              <div class="form_item">
+                <div class="roomUl">
+                  <div class="title">房间</div>
+                  <div class="delRoom">
+                    <div class="ul">
+                      <!-- <div class="li">
+                        <span>102</span>
+                        <div class="del"></div>
+                      </div>
+                      <div class="li">
+                        <span>103</span>
+                        <div class="del"></div>
+                      </div> -->
+                      <div class="li" v-for="i in ruleForm.houseNumbers">
+                        <!-- <span>{{ i.numberName }}</span> -->
+                        <el-input v-model="i.numberName" placeholder="房间号" />
+                        <div class="del" @click="delRoom(i)"></div>
+                      </div>
+                      <div class="addRoom" @click="addRoom">
+                        <img src="@/assets/addRoom.png" alt="" />
+                        <span>新增房间</span>
+                      </div>
+                    </div>
+                  </div>
+                </div>
+              </div>
 
               <div class="titles">
                 <span>房型配置</span
@@ -260,6 +296,20 @@
         />
       </div>
     </div>
+    <div class="bgImg" v-if="bgImg">
+      <el-carousel
+        @click="bgImg = false"
+        ref="bgImgs"
+        indicator-position
+        arrow="always"
+        :autoplay="false"
+        trigger
+      >
+        <el-carousel-item v-for="item in bgImgList" :key="item.id">
+          <img :src="item.url" alt="" />
+        </el-carousel-item>
+      </el-carousel>
+    </div>
   </div>
 </template>
 
@@ -277,6 +327,7 @@ const store = useStore();
 const api = ref("");
 const router = useRouter();
 // 表格数据
+const loading = ref(false);
 const tableData = reactive({
   list: [
     // {
@@ -322,6 +373,10 @@ const searchInput = reactive({
   schoolId: "",
 }); // 搜索按钮数据
 
+// 查看图片按钮
+const bgImg = ref(false);
+const bgImgList = ref();
+
 const currentPage = ref(1); // 当前页
 const pageSize = ref(10);
 const total = ref(); // 当前总数
@@ -339,8 +394,10 @@ const ruleForm = reactive({
   number: "", //数量
   hConfig: "", //房型配置
   remark: "", //备注
+  houseNumbers: [], // 房间号列表
   id: "",
 });
+
 // 房费验证
 const validatePrice = (rule, value, callback) => {
   if (/^(?!0+(?:\.0+)?$)(?:[1-9]\d*|0)(?:\.\d{1,2})?$/.test(value)) {
@@ -369,7 +426,11 @@ const rules = reactive({
   ],
   number: [
     { required: true, message: "数量不能为空", trigger: "blur" },
-    { pattern: /^\+?[1-9]\d*$/, message: "请输入大于0的正整数" },
+    {
+      pattern: /^\+?[1-9]\d*$/,
+      message: "请输入大于0的正整数",
+      trigger: "blur",
+    },
   ],
   hAreas: [
     { required: true, message: "房型面积不能为空", trigger: "blur" },
@@ -380,6 +441,7 @@ const rules = reactive({
 
 // 查看房型列表
 const getList = async () => {
+  loading.value = true;
   let data = {
     page: currentPage.value,
     rows: pageSize.value,
@@ -397,6 +459,7 @@ const getList = async () => {
   });
   console.log(res, "房型管理");
   if (res.data.code == 200) {
+    loading.value = false;
     tableData.list = res.data.data.pageList;
     total.value = res.data.data.total;
     // ElMessage({
@@ -406,6 +469,7 @@ const getList = async () => {
     //   center: true,
     // });
   } else {
+    loading.value = false;
     ElMessage({
       type: "error",
       showClose: true,
@@ -461,7 +525,7 @@ const handleUpload = async (file) => {
   data.set("myFile", file.file);
   let res = await axios({
     method: "post",
-    url: api.value + "/fileload/loadhimage.action",
+    url: "https://chtech.ncjti.edu.cn/hotelReservation/mhotel/uploadhimage.action",
     headers: {},
     data: data,
   });
@@ -487,6 +551,7 @@ const addlist = async () => {
   ruleForm.hConfig = ""; //房型配置
   ruleForm.remark = ""; //备注
   ruleForm.id = ""; //id
+  ruleForm.houseNumbers = []; // 房间号列表
   checkedCities.value = [];
 };
 
@@ -535,6 +600,7 @@ const edit = async (row) => {
   });
   ruleForm.hConfig = row.hConfig; //房型配置
   // ruleForm.remark = "备注"; //备注
+  ruleForm.houseNumbers = row.houseNumbers; // 房间号列表
   ruleForm.id = row.id; //id
 };
 // 取消添加员工
@@ -547,6 +613,23 @@ const checkHouse = (val) => {
   console.log(val);
   ruleForm.hConfig = val.join(",");
 };
+
+// 新增房间号
+const addRoom = () => {
+  console.log(ruleForm.houseNumbers);
+  let arr = {
+    numberName: "",
+    id: ruleForm.houseNumbers.length,
+  };
+  ruleForm.houseNumbers.push(arr);
+};
+// 删除房间号
+const delRoom = (i) => {
+  ruleForm.houseNumbers = ruleForm.houseNumbers.filter((item) => {
+    return i.id != item.id;
+  });
+};
+
 // 确认添加员工
 const submitAdd = lodash.debounce(async (formEl) => {
   if (!formEl) return;
@@ -589,6 +672,10 @@ const submitAdd = lodash.debounce(async (formEl) => {
           });
         }
       } else {
+        const arr = [];
+        ruleForm.houseNumbers.forEach((item) => {
+          arr.push(item.numberName);
+        });
         let data = new FormData();
         data.set("managerId", sessionStorage.getItem("token"));
         data.set("id", ruleForm.id);
@@ -598,6 +685,7 @@ const submitAdd = lodash.debounce(async (formEl) => {
         data.set("number", ruleForm.number);
         data.set("hConfig", ruleForm.hConfig);
         data.set("fileListJson", JSON.stringify(ruleForm.fileListJson));
+        data.set("houseNumber", arr.join(","));
         console.log(data);
         let res = await axios({
           method: "post",
@@ -738,9 +826,22 @@ const handleCurrentChange = (value) => {
   currentPage.value = value;
   getList();
 };
+// 查看图片
+const lookImg = (i) => {
+  console.log(i);
 
+  bgImg.value = true;
+  let arr = [
+    {
+      url: i.url,
+      id: i.uid,
+    },
+  ];
+  bgImgList.value = arr;
+};
 onBeforeMount(async () => {
   api.value = store.state.user.api;
+  getList();
   // 查看房型配置
   let data = {
     code: 4,
@@ -766,7 +867,6 @@ onBeforeMount(async () => {
   });
   console.log(ress, "查看房型");
   houseType.value = ress.data.data;
-  getList();
 });
 onUnmounted(() => {
   // document.removeEventListener("keyup", Enters);
@@ -986,16 +1086,44 @@ onUnmounted(() => {
               img {
                 margin-right: 15px;
               }
-              .del {
-                cursor: pointer;
+              .imgItem {
                 position: relative;
-                width: 20px;
-                height: 20px;
-                background-size: 100%;
-                opacity: 0.5;
-                background-image: url("@/assets/del.png");
-                top: -125px;
-                right: -155px;
+              }
+              .lookImg {
+                width: 183px;
+                height: 121px;
+                cursor: pointer;
+                position: absolute;
+                top: 0;
+                left: 0;
+                border-radius: 10px;
+                display: flex;
+                justify-content: center;
+                align-items: center;
+                img {
+                  width: 30px;
+                  height: 30px;
+                  opacity: 0;
+                }
+                .delimg {
+                  width: 30px;
+                  height: 30px;
+                  background-image: url("@/assets/imgDel.png");
+                  background-size: 100%;
+                  opacity: 0;
+                  margin-left: 5px;
+                }
+              }
+              .lookImg:hover {
+                background-color: rgba(0, 0, 0, 0.2);
+                img {
+                  opacity: 1;
+                  cursor: pointer;
+                }
+                .delimg {
+                  opacity: 1;
+                  cursor: pointer;
+                }
               }
             }
           }
@@ -1035,6 +1163,70 @@ onUnmounted(() => {
               width: 200px;
             }
           }
+          .roomUl {
+            display: flex;
+            // margin: 10px 0;
+            // align-items: center;
+            .title {
+              width: 100px;
+              height: 40px;
+              text-align: left;
+              line-height: 40px;
+            }
+            .delRoom {
+              .ul {
+                width: 680px;
+                list-style: none;
+                border: none;
+                display: flex;
+                flex-wrap: wrap;
+                margin: 0;
+                padding: 0;
+                .li {
+                  width: 108px;
+                  height: 40px;
+                  border: 1px solid #e0e0e0;
+                  display: flex;
+                  justify-content: space-around;
+                  align-items: center;
+                  margin: 0 10px 10px 0;
+                  border-radius: 7px;
+                  span {
+                    margin-right: 40px;
+                  }
+                  .el-input {
+                    width: 70px;
+                    .el-input__wrapper {
+                      box-shadow: none;
+                    }
+                  }
+                  .del {
+                    width: 14px;
+                    height: 14px;
+                    background-image: url("@/assets/delete.png");
+                    background-size: 100%;
+                  }
+                  .del:hover {
+                    background-image: url("@/assets/delete_hover.png");
+                    cursor: pointer;
+                  }
+                }
+                .addRoom {
+                  cursor: pointer;
+                  margin-left: 10px;
+                  height: 42px;
+                  color: rgba(9, 101, 98, 1);
+                  display: flex;
+                  justify-content: space-around;
+                  align-items: center;
+                  img {
+                    width: 15px;
+                    margin-right: 5px;
+                  }
+                }
+              }
+            }
+          }
         }
         .options {
           width: 100%;
@@ -1051,6 +1243,27 @@ onUnmounted(() => {
       }
     }
   }
+  .bgImg {
+    position: absolute;
+    left: 0;
+    top: 0;
+    z-index: 99999999;
+    width: 100%;
+    height: 100%;
+    background-color: rgba(255, 255, 255, 0.8);
+    // border-radius: 50px;
+    :deep(.el-carousel__container) {
+      width: 100%;
+      height: calc(100vh);
+      .el-carousel__item {
+        display: flex;
+        justify-content: center;
+        img {
+          height: 100%;
+        }
+      }
+    }
+  }
   .pageSize {
     display: flex;
     align-items: center;

+ 626 - 0
src/views/serviceMall/serviceMall.vue

@@ -0,0 +1,626 @@
+<template>
+  <div class="content-box">
+    <el-row>
+      <el-col :span="24">
+        <div class="cell">
+          <div class="cell-title">
+            <div class="title-left">
+              <div class="title">服务商城</div>
+            </div>
+          </div>
+          <div class="cell-body">
+            <!-- 咨询服务 -->
+            <div class="cell_block">
+              <div class="title">
+                <div class="title_block"></div>
+                <h2>咨询服务</h2>
+                <span style="color: rgba(255, 87, 51, 1)">(免费)</span>
+              </div>
+              <div class="block_ul">
+                <div
+                  class="block_li"
+                  :class="flag == 1 ? 'is_active' : ''"
+                  @click="serveClick(1)"
+                >
+                  <img
+                    v-if="flag == 1"
+                    src="@/assets/images/interflow_s.png"
+                    alt=""
+                  />
+                  <img v-else src="@/assets/images/interflow.png" alt="" />
+                  <span>经营交流</span>
+                  <div class="select" v-if="flag == 1">
+                    <img src="@/assets/images/select.png" alt="" />
+                  </div>
+                </div>
+                <div
+                  class="block_li"
+                  :class="flag == 2 ? 'is_active' : ''"
+                  @click="serveClick(2)"
+                >
+                  <img
+                    v-if="flag == 2"
+                    src="@/assets/images/consult_s.png"
+                    alt=""
+                  />
+                  <img v-else src="@/assets/images/consult.png" alt="" />
+                  <span>政策咨询</span>
+                  <div class="select" v-if="flag == 2">
+                    <img src="@/assets/images/select.png" alt="" />
+                  </div>
+                </div>
+              </div>
+            </div>
+            <!-- 金融服务 -->
+            <div class="cell_block">
+              <div class="title">
+                <h4>金融服务</h4>
+              </div>
+              <div class="block_ul">
+                <div
+                  class="block_li is_active"
+                  @click="serveClick(3)"
+                  v-if="flag == 3"
+                >
+                  <img src="@/assets/images/financing_s.png" alt="" />
+                  <span>投融资</span>
+                  <div class="select">
+                    <img src="@/assets/images/select.png" alt="" />
+                  </div>
+                </div>
+                <div class="block_li" @click="serveClick(3)" v-else>
+                  <img src="@/assets/images/financing.png" alt="" />
+                  <span>投融资</span>
+                </div>
+              </div>
+            </div>
+            <!-- 收费服务 -->
+            <div class="cell_block">
+              <div class="title">
+                <div class="title_block"></div>
+                <h2>收费服务</h2>
+                <span style="color: rgba(255, 87, 51, 1)">(收费)</span>
+              </div>
+              <div class="block_ul">
+                <div
+                  class="block_li is_active"
+                  @click="serveClick(4)"
+                  v-if="flag == 4"
+                >
+                  <img src="@/assets/images/design_s.png" alt="" />
+                  <span>文创设计</span>
+                  <div class="select">
+                    <img src="@/assets/images/select.png" alt="" />
+                  </div>
+                </div>
+                <div class="block_li" @click="serveClick(4)" v-else>
+                  <img src="@/assets/images/design.png" alt="" />
+                  <span>文创设计</span>
+                </div>
+                <div
+                  class="block_li is_active"
+                  @click="serveClick(5)"
+                  v-if="flag == 5"
+                >
+                  <img src="@/assets/images/programme_s.png" alt="" />
+                  <span>民宿规划设计</span>
+                  <div class="select">
+                    <img src="@/assets/images/select.png" alt="" />
+                  </div>
+                </div>
+                <div class="block_li" @click="serveClick(5)" v-else>
+                  <img src="@/assets/images/programme.png" alt="" />
+                  <span>民宿规划设计</span>
+                </div>
+                <div
+                  class="block_li is_active"
+                  @click="serveClick(6)"
+                  v-if="flag == 6"
+                >
+                  <img src="@/assets/images/video_s.png" alt="" />
+                  <span>宣传视频制作</span>
+                  <div class="select">
+                    <img src="@/assets/images/select.png" alt="" />
+                  </div>
+                </div>
+                <div class="block_li" @click="serveClick(6)" v-else>
+                  <img src="@/assets/images/video.png" alt="" />
+                  <span>宣传视频制作</span>
+                </div>
+              </div>
+            </div>
+            <!-- 管家服务 -->
+            <div class="cell_block">
+              <div class="title">
+                <h4>管家服务</h4>
+              </div>
+              <div class="block_ul">
+                <div
+                  class="block_li is_active"
+                  @click="serveClick(7)"
+                  v-if="flag == 7"
+                >
+                  <img src="@/assets/images/platina_s.png" alt="" />
+                  <span>白金级</span>
+                  <div class="select">
+                    <img src="@/assets/images/select.png" alt="" />
+                  </div>
+                </div>
+                <div class="block_li" @click="serveClick(7)" v-else>
+                  <img src="@/assets/images/platina.png" alt="" />
+                  <span>白金级</span>
+                </div>
+
+                <div
+                  class="block_li is_active"
+                  @click="serveClick(8)"
+                  v-if="flag == 8"
+                >
+                  <img src="@/assets/images/gold_s.png" alt="" />
+                  <span>金宿级</span>
+                  <div class="select">
+                    <img src="@/assets/images/select.png" alt="" />
+                  </div>
+                </div>
+                <div class="block_li" @click="serveClick(8)" v-else>
+                  <img src="@/assets/images/gold.png" alt="" />
+                  <span>金宿级</span>
+                </div>
+
+                <div
+                  class="block_li is_active"
+                  @click="serveClick(9)"
+                  v-if="flag == 9"
+                >
+                  <img src="@/assets/images/silver_s.png" alt="" />
+                  <span>银宿级</span>
+                  <div class="select">
+                    <img src="@/assets/images/select.png" alt="" />
+                  </div>
+                </div>
+                <div class="block_li" @click="serveClick(9)" v-else>
+                  <img src="@/assets/images/silver.png" alt="" />
+                  <span>银宿级</span>
+                </div>
+              </div>
+            </div>
+            <!-- 人力资源服务 -->
+            <div class="cell_block">
+              <div class="title">
+                <h4>人力资源服务</h4>
+              </div>
+              <div class="block_ul">
+                <div
+                  class="block_li is_active"
+                  @click="serveClick(10)"
+                  v-if="flag == 10"
+                >
+                  <img src="@/assets/images/guestRoom_s.png" alt="" />
+                  <span>客房</span>
+                  <div class="select">
+                    <img src="@/assets/images/select.png" alt="" />
+                  </div>
+                </div>
+                <div class="block_li" @click="serveClick(10)" v-else>
+                  <img src="@/assets/images/guestRoom.png" alt="" />
+                  <span>客房</span>
+                </div>
+                <div
+                  class="block_li is_active"
+                  @click="serveClick(11)"
+                  v-if="flag == 11"
+                >
+                  <img src="@/assets/images/hall_s.png" alt="" />
+                  <span>大厅</span>
+                  <div class="select">
+                    <img src="@/assets/images/select.png" alt="" />
+                  </div>
+                </div>
+                <div class="block_li" @click="serveClick(11)" v-else>
+                  <img src="@/assets/images/hall.png" alt="" />
+                  <span>大厅</span>
+                </div>
+                <div
+                  class="block_li is_active"
+                  v-if="flag == 12"
+                  @click="serveClick(12)"
+                >
+                  <img src="@/assets/images/repast_s.png" alt="" />
+                  <span>餐饮</span>
+                  <div class="select">
+                    <img src="@/assets/images/select.png" alt="" />
+                  </div>
+                </div>
+                <div class="block_li" @click="serveClick(12)" v-else>
+                  <img src="@/assets/images/repast.png" alt="" />
+                  <span>餐饮</span>
+                </div>
+                <div
+                  class="block_li is_active"
+                  v-if="flag == 13"
+                  @click="serveClick(13)"
+                >
+                  <img src="@/assets/images/sing_s.png" alt="" />
+                  <span>唱歌</span>
+                  <div class="select">
+                    <img src="@/assets/images/select.png" alt="" />
+                  </div>
+                </div>
+                <div v-else class="block_li" @click="serveClick(13)">
+                  <img src="@/assets/images/sing.png" alt="" />
+                  <span>唱歌</span>
+                </div>
+                <div
+                  class="block_li is_active"
+                  v-if="flag == 14"
+                  @click="serveClick(14)"
+                >
+                  <img src="@/assets/images/league_s.png" alt="" />
+                  <span>团建教练</span>
+                  <div class="select">
+                    <img src="@/assets/images/select.png" alt="" />
+                  </div>
+                </div>
+                <div class="block_li" v-else @click="serveClick(14)">
+                  <img src="@/assets/images/league.png" alt="" />
+                  <span>团建教练</span>
+                </div>
+                <div
+                  class="block_li is_active"
+                  v-if="flag == 15"
+                  @click="serveClick(15)"
+                >
+                  <img src="@/assets/images/musical_s.png" alt="" />
+                  <span>乐器表演</span>
+                  <div class="select">
+                    <img src="@/assets/images/select.png" alt="" />
+                  </div>
+                </div>
+                <div class="block_li" @click="serveClick(15)" v-else>
+                  <img src="@/assets/images/musical.png" alt="" />
+                  <span>乐器表演</span>
+                </div>
+                <div
+                  class="block_li is_active"
+                  v-if="flag == 16"
+                  @click="serveClick(16)"
+                >
+                  <img src="@/assets/images/dance_s.png" alt="" />
+                  <span>舞蹈</span>
+                  <div class="select">
+                    <img src="@/assets/images/select.png" alt="" />
+                  </div>
+                </div>
+                <div v-else class="block_li" @click="serveClick(16)">
+                  <img src="@/assets/images/dance.png" alt="" />
+                  <span>舞蹈</span>
+                </div>
+                <div
+                  class="block_li is_active"
+                  v-if="flag == 17"
+                  @click="serveClick(17)"
+                >
+                  <img src="@/assets/images/protocol_s.png" alt="" />
+                  <span>礼仪培训</span>
+                  <div class="select">
+                    <img src="@/assets/images/select.png" alt="" />
+                  </div>
+                </div>
+                <div class="block_li" @click="serveClick(17)" v-else>
+                  <img src="@/assets/images/protocol.png" alt="" />
+                  <span>礼仪培训</span>
+                </div>
+              </div>
+            </div>
+            <!-- 直播服务 -->
+            <div class="cell_block">
+              <div class="title">
+                <h4>直播服务</h4>
+              </div>
+              <div class="block_ul">
+                <div
+                  class="block_li is_active"
+                  v-if="flag == 18"
+                  @click="serveClick(18)"
+                >
+                  <img src="@/assets/images/live_s.png" alt="" />
+                  <span>民宿直播</span>
+                  <div class="select">
+                    <img src="@/assets/images/select.png" alt="" />
+                  </div>
+                </div>
+                <div v-else class="block_li" @click="serveClick(18)">
+                  <img src="@/assets/images/live.png" alt="" />
+                  <span>民宿直播</span>
+                </div>
+                <div
+                  class="block_li is_active"
+                  v-if="flag == 19"
+                  @click="serveClick(19)"
+                >
+                  <img src="@/assets/images/live_s.png" alt="" />
+                  <span>产品直播</span>
+                  <div class="select">
+                    <img src="@/assets/images/select.png" alt="" />
+                  </div>
+                </div>
+                <div v-else class="block_li" @click="serveClick(19)">
+                  <img src="@/assets/images/live.png" alt="" />
+                  <span>产品直播</span>
+                </div>
+              </div>
+            </div>
+          </div>
+        </div>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+
+<script setup>
+import {
+  ref,
+  reactive,
+  nextTick,
+  watch,
+  onBeforeMount,
+  onUnmounted,
+} from "vue";
+import { useRouter } from "vue-router";
+import { ElMessage, ElMessageBox } from "element-plus";
+import { Calendar } from "@element-plus/icons-vue";
+import vidiconsApi from "@/api/vidicons.js";
+import { dayjs } from "element-plus";
+import lodash from "lodash";
+import axios from "axios";
+import { useStore } from "vuex";
+const store = useStore();
+const api = ref("");
+const router = useRouter();
+
+const flag = ref(1);
+const serveClick = (i) => {
+  flag.value = i;
+};
+</script>
+
+<style lang="scss" scoped>
+.content-box {
+  box-shadow: 0px 3px 10px rgba(0, 97, 255, 0.2);
+  width: 97.5%;
+  height: 89%;
+  margin: 20px auto;
+  background-color: #fff;
+  display: flex;
+  flex-direction: column;
+  .el-row {
+    .el-col {
+      // padding: 10px;
+
+      .cell {
+        padding: 0 30px;
+        // border-radius: 10px;
+        background-color: #ffffff;
+        box-shadow: 0px 3px 21px 0px rgba(60, 108, 254, 0.16);
+
+        .cell-title {
+          display: flex;
+          justify-content: space-between;
+          align-items: center;
+          // margin-bottom: 30px;
+          // padding-bottom: 30px;
+          height: 60px;
+          border-bottom: 1px solid #cccccc;
+
+          .title-left {
+            display: flex;
+            align-items: center;
+
+            .title {
+              font-size: 22px;
+              font-family: Microsoft YaHei-3970(82674968);
+              font-weight: bold;
+              color: #1a202b;
+            }
+
+            .title-detail {
+              margin-left: 50px;
+              font-size: 18px;
+              font-family: Microsoft YaHei-3970(82674968);
+              color: #1a202b;
+            }
+          }
+
+          .title-right {
+            display: flex;
+            justify-content: space-between;
+            align-items: center;
+
+            .el-button {
+              width: 110px;
+              height: 46px;
+              background: #2b4cfe;
+              font-size: 18px;
+              color: #ffffff;
+              font-family: Microsoft YaHei-3970(82674968);
+              border-radius: 5px;
+            }
+
+            .el-button--warning {
+              background: #f88a64;
+            }
+          }
+        }
+
+        .cell-body {
+          height: 760px;
+          overflow: auto;
+
+          .cell_block {
+            .title {
+              display: flex;
+              align-items: center;
+              .title_block {
+                width: 17px;
+                height: 17px;
+                opacity: 1;
+                border-radius: 4px;
+                background: rgba(9, 101, 98, 1);
+                margin-right: 10px;
+              }
+              h2 {
+                font-size: 20px;
+              }
+            }
+          }
+          .block_ul {
+            display: flex;
+            flex-wrap: wrap;
+            cursor: pointer;
+            .block_li {
+              position: relative;
+              width: 188px;
+              height: 96px;
+              opacity: 1;
+              border-radius: 6px;
+              background: rgba(242, 242, 242, 1);
+              display: flex;
+              align-items: center;
+              justify-content: center;
+              margin: 0 17px 17px 0;
+              img {
+                width: 25px;
+                height: 25px;
+                margin-right: 9px;
+              }
+              .select {
+                position: absolute;
+                right: 0;
+                top: 0;
+                border-top-right-radius: 5px;
+                width: 20px;
+                height: 20px;
+                background-color: rgb(255, 87, 51);
+                display: flex;
+                justify-content: center;
+                align-items: center;
+                img {
+                  width: 15px;
+                  height: 11px;
+                  transform: translateX(4px);
+                }
+              }
+            }
+            .block_li.is_active {
+              background-color: rgba(9, 101, 98, 1);
+              color: #fff;
+            }
+          }
+        }
+      }
+    }
+  }
+}
+</style>
+
+<style>
+.add-voucher-class {
+  width: 800px !important;
+  height: 890px !important;
+}
+
+.el-date-editor--daterange.el-input__inner {
+  width: 280px !important;
+}
+
+.demo-table-expand {
+  font-size: 0;
+}
+
+.demo-table-expand label {
+  width: 180px;
+  color: #99a9bf;
+}
+
+.demo-table-expand .el-form-item {
+  margin-right: 0;
+  margin-bottom: 0;
+  width: 33%;
+}
+
+.show-imgs {
+  display: flex;
+}
+
+.imgs {
+  display: flex;
+  flex-direction: row;
+  margin-left: 20px;
+}
+
+.lbl-cls {
+  display: inline-block;
+  width: 100px;
+  text-align: right;
+  padding-right: 10px;
+  color: #bbb;
+}
+
+.export {
+  background: rgba(9, 101, 98, 1) !important;
+  font-size: 14px !important;
+  color: #ffffff !important;
+  font-family: Microsoft YaHei-3970(82674968);
+  border-radius: 5px !important;
+  margin-bottom: 22px !important;
+  border: none !important;
+}
+
+.add-class {
+  height: 450px !important;
+  width: 800px !important;
+}
+
+.dialog-footer {
+  display: flex;
+  justify-content: flex-end;
+}
+
+.add-info-cancel-btn {
+  color: rgba(9, 101, 98, 1) !important;
+  border: 1px solid rgba(9, 101, 98, 1) !important;
+}
+
+.add-info-confirm-btn {
+  border: none !important;
+  background: rgba(9, 101, 98, 1) !important;
+  color: #fff !important;
+  border-radius: 5px !important;
+  margin-left: 28px !important;
+}
+
+.el-form-item > label {
+  color: rgba(128, 128, 128, 1) !important;
+}
+
+.custom-input {
+  width: 7rem !important;
+}
+
+.custom-input input {
+  width: 7rem !important;
+}
+
+.el-radio {
+  margin-right: 10px;
+}
+
+.el-checkbox-group {
+  height: 22px !important;
+  line-height: 22px !important;
+}
+
+.el-form-item {
+  margin-bottom: 16px !important;
+}
+</style>

+ 14 - 13
vite.config.js

@@ -19,27 +19,28 @@ export default defineConfig({
   },
   server: {
     host: "0.0.0.0",
-    port: 8686,
+    port: 8866,
     // 是否开启 https
     // https: false,
     // 线上地址 https://chtech.ncjti.edu.cn/hotelReservation/pc3/
+    // proxy: {
+    //   "/api": {
+    //     // target: "https://chtech.ncjti.edu.cn/hotelReservation",
+    //     target: "http://101.42.162.31:8088/",
+    //     changeOrigin: true,
+    //     rewrite: (path) => path.replace(/^\/api/, ""),
+    //   },
+    // }, // https://chtech.ncjti.edu.cn/hotelReservation/pc2
+
+    // // 测试地址
     proxy: {
       "/hotelReservation": {
         target: "https://chtech.ncjti.edu.cn/hotelReservation",
-        // target: "http://gf43w4.natappfree.cc",
+        // target: "http://101.42.162.31/hotelReservation/", // 测试环境
         changeOrigin: true,
         rewrite: (path) => path.replace(/^\/hotelReservation/, ""),
       },
-    }, // https://chtech.ncjti.edu.cn/hotelReservation/pc2
-
-    // // 测试地址
-    // proxy: {
-    //   "/hotelReservation/pc2": {
-    //     target: "https://chtech.ncjti.edu.cn/hotelReservation/pc2", // 测试环境
-    //     changeOrigin: true,
-    //     rewrite: (path) => path.replace(/^\/hotelReservation\/pc2/, ""),
-    //   },
-    // },
+    },
   },
   publicDir: "public",
   base: "./",
@@ -48,7 +49,7 @@ export default defineConfig({
     target: "modules", //设置最终构建的浏览器兼容目标  //es2015(编译成es5) | modules
     outDir: "dist", // 构建得包名  默认:dist
     assetsDir: "static", // 静态资源得存放路径文件名  assets
-    // sourcemap: false, //构建后是否生成 source map 文件
+    sourcemap: false, //构建后是否生成 source map 文件
     // brotliSize: false, // 启用/禁用 brotli 压缩大小报告。 禁用该功能可能会提高大型项目的构建性能
     chunkSizeWarningLimit: 1000, //chunk 大小警告的限制(以 kbs 为单位)默认:500
     // cssTarget: 'chrome61' //防止 vite 将 rgba() 颜色转化为 #RGBA 十六进制符号的形式  (要兼容的场景是安卓微信中的 webview 时,它不支持 CSS 中的 #RGBA 十六进制颜色符号)