roomType.vue 53 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870
  1. <template>
  2. <div class="content-box">
  3. <div class="left">
  4. <!-- <el-icon :size="23" class="camera"><VideoCameraFilled /></el-icon> -->
  5. <span class="cameratxt">房型管理</span>
  6. </div>
  7. <div class="scroll">
  8. <div class="middle">
  9. <div class="filter">
  10. <div class="condition">
  11. <el-input
  12. :clearable="true"
  13. @clear="searchBtn"
  14. v-model.trim="searchInput.keyWord"
  15. class="w-50 m-2"
  16. placeholder="请输入房号"
  17. style="width: 180px"
  18. />
  19. </div>
  20. <el-button
  21. color="rgba(0, 97, 255, 1)"
  22. type="primary"
  23. class="search"
  24. @click="searchBtn"
  25. ><el-icon>
  26. <Search />
  27. </el-icon>
  28. <span>查询</span></el-button
  29. >
  30. <div class="condition">
  31. <span>房间类型</span>
  32. <el-select
  33. :clearable="false"
  34. v-model="searchInput.type"
  35. @change="getList"
  36. class="m-2"
  37. placeholder="请选择房间类型"
  38. style="width: 120px"
  39. >
  40. <el-option label="全日房" :value="1" />
  41. <el-option label="钟点房" :value="2" />
  42. </el-select>
  43. </div>
  44. <!-- <div class="condition" style="margin-left: 50px">
  45. <span>房间名称</span>
  46. <el-select
  47. style="width: 180px"
  48. v-model="searchInput.name"
  49. class="m-2"
  50. placeholder="请选择房型"
  51. :clearable="true"
  52. @change="searchBtn"
  53. >
  54. <el-option
  55. :label="`${i.roomName}(${i.roomType == 1 ? '全' : '钟'})`"
  56. :value="i.id"
  57. v-for="i in houseTypeList"
  58. />
  59. </el-select>
  60. </div> -->
  61. </div>
  62. <!-- 按钮列表 -->
  63. <div class="gongneng" v-if="flagBtn.tianjia == 1">
  64. <el-button type="primary" color="rgba(0, 97, 255, 1)" @click="addlist"
  65. ><img
  66. src="@/assets/add.png"
  67. style="width: 14px; height: 14px; margin-right: 4px"
  68. alt=""
  69. /><span>添加房型</span></el-button
  70. >
  71. </div>
  72. </div>
  73. <div class="footer" v-loading="loading">
  74. <el-table
  75. :row-class-name="tableRowClassName"
  76. :data="tableData.list"
  77. @selection-change="handleSelectionChange"
  78. style="width: 100%"
  79. :header-cell-style="{
  80. background: 'rgba(240, 243, 247, 1)',
  81. height: '50px',
  82. border: 0,
  83. }"
  84. >
  85. <!-- <el-table-column align="center" type="selection" width="80" /> -->
  86. <el-table-column
  87. width="150"
  88. align="center "
  89. type="index"
  90. label="序号"
  91. />
  92. <el-table-column
  93. v-if="searchInput.type == 2"
  94. align="center"
  95. prop="time"
  96. label="钟点时长"
  97. />
  98. <el-table-column align="center" prop="name" label="房型名称">
  99. <template #default="{ row }">
  100. <span>{{ row.name }}</span
  101. ><span style="color: #1e7dfb"
  102. >({{ row.type == 1 ? "全" : "钟" }})</span
  103. >
  104. </template>
  105. </el-table-column>
  106. <el-table-column
  107. align="center"
  108. prop="roomId"
  109. label="房号"
  110. width="220"
  111. >
  112. <template #default="{ row }">
  113. <div class="ul" style="display: flex; flex-wrap: wrap">
  114. <el-tag
  115. v-for="i in row.roomList"
  116. style="margin: 5px"
  117. type="primary"
  118. >{{ i }}</el-tag
  119. >
  120. </div>
  121. </template>
  122. </el-table-column>
  123. <el-table-column align="center" prop="roomLength" label="数量" />
  124. <el-table-column align="center" prop="price" label="房费(元)" />
  125. <!-- <el-table-column align="center" prop="count" label="数量" /> -->
  126. <!-- <el-table-column align="center" prop="count" label="类型">
  127. <template #default="scope">
  128. <span v-if="scope.row.type == 1">全日房</span>
  129. <span v-if="scope.row.type == 2">钟点房</span>
  130. </template>
  131. </el-table-column> -->
  132. <el-table-column align="center" label="操作" width="150">
  133. <template #default="scope">
  134. <div class="edit">
  135. <div
  136. class="look"
  137. v-if="flagBtn.xiugai == 1"
  138. @click="edit(scope.row)"
  139. >
  140. 编辑
  141. </div>
  142. <el-popconfirm
  143. v-if="flagBtn.shanchu == 1"
  144. width="220"
  145. confirm-button-text="确认"
  146. cancel-button-text="取消"
  147. :icon="InfoFilled"
  148. icon-color="#f89626"
  149. title="是否删除此房型?"
  150. @confirm="del(scope.row)"
  151. @cancel="cancelEvent"
  152. >
  153. <template #reference>
  154. <div class="del">删除</div>
  155. </template>
  156. </el-popconfirm>
  157. </div>
  158. </template>
  159. </el-table-column>
  160. </el-table>
  161. <!-- 分页组件 -->
  162. <div class="pageSize">
  163. <span></span>
  164. <el-pagination
  165. background
  166. :current-page="currentPage"
  167. :page-size="pageSize"
  168. layout="total, prev, pager, next, jumper, slot"
  169. :total="total"
  170. @update:current-page="handleCurrentChange"
  171. />
  172. </div>
  173. <!-- 添加房型弹窗 -->
  174. <el-dialog
  175. class="addStaff"
  176. v-model="addDialogVisible"
  177. :close-on-click-modal="false"
  178. :close-on-press-escape="false"
  179. :title="dialongTitle"
  180. align-center
  181. width="900"
  182. :before-close="cancelAdd"
  183. >
  184. <div class="slider">
  185. <el-form
  186. ref="ruleFormRef"
  187. :model="ruleForm"
  188. :rules="rules"
  189. label-width="100px"
  190. class="demo-ruleForm"
  191. size="default"
  192. label-position="left"
  193. status-icon
  194. :inline="true"
  195. >
  196. <div class="titles"><span>房型信息</span></div>
  197. <div class="form_item tag">
  198. <div class="items">
  199. <!-- prop="fileListJson" -->
  200. <el-form-item label="房间图片 :" prop="roomPicture">
  201. <div class="tooltips" v-loading="imgShow">
  202. <div class="img img1">
  203. <div class="updateImg">
  204. <div class="imglist" v-if="fileList.list.length">
  205. <div
  206. class="imgItem"
  207. v-for="i in fileList.list"
  208. :key="i.id"
  209. >
  210. <img :src="i.url" alt="" />
  211. <div class="lookImg">
  212. <img
  213. src="@/assets/lookImg.png"
  214. alt=""
  215. @click="lookImg(i)"
  216. />
  217. <div
  218. class="delimg"
  219. @click="handleRemove(i)"
  220. ></div>
  221. </div>
  222. </div>
  223. </div>
  224. <div class="imglist" v-else>
  225. <img src="#" alt="" />
  226. </div>
  227. <el-upload
  228. class="avatar-uploader"
  229. action=""
  230. list-type="picture"
  231. :on-preview="handlePreview"
  232. :on-change="handleChange"
  233. :http-request="handleUpload"
  234. :before-upload="beforeAvatarUpload"
  235. >
  236. <template #trigger>
  237. <el-button
  238. type="primary"
  239. color="rgba(0, 97, 255, 1)"
  240. @click="updateImg"
  241. >上传图片</el-button
  242. >
  243. <span class="zhu"
  244. >(注:最多可上传6张图片,建议按16:9的比例)</span
  245. >
  246. </template>
  247. <!-- <template #tip>
  248. <div class="el-upload__tip">
  249. (注:图片大小不超过10M,建议按3:2比例)
  250. </div>
  251. </template> -->
  252. </el-upload>
  253. </div>
  254. </div>
  255. </div>
  256. </el-form-item>
  257. </div>
  258. </div>
  259. <div class="form_item">
  260. <div class="items">
  261. <el-form-item label="房型名称 :" prop="roomName">
  262. <el-input
  263. v-model.trim="ruleForm.roomName"
  264. placeholder="请输入房型名称"
  265. clearable
  266. />
  267. <!-- <el-select
  268. v-model="ruleForm.hName"
  269. class="m-2"
  270. placeholder="请选择民宿类型"
  271. >
  272. <el-option
  273. v-for="i in houseType"
  274. :label="i.name"
  275. :value="i.name"
  276. />
  277. </el-select> -->
  278. </el-form-item>
  279. </div>
  280. <div class="items">
  281. <el-form-item label="房费 :" prop="roomPrice">
  282. <el-input
  283. v-model.trim="ruleForm.roomPrice"
  284. placeholder="请输入房费"
  285. clearable
  286. />
  287. </el-form-item>
  288. </div>
  289. </div>
  290. <div class="form_item">
  291. <div class="items">
  292. <el-form-item label="面积 :" prop="roomArea">
  293. <el-input
  294. v-model.trim="ruleForm.roomArea"
  295. placeholder="请输入面积大小"
  296. clearable
  297. ></el-input>
  298. &nbsp;&nbsp;㎡
  299. </el-form-item>
  300. </div>
  301. <div class="items">
  302. <el-form-item label="房间上架 :" prop="putaway">
  303. <el-switch
  304. v-model="ruleForm.putaway"
  305. style="
  306. --el-switch-on-color: #0f6aff;
  307. "
  308. :active-value="1"
  309. :inactive-value="2"
  310. />
  311. </el-form-item>
  312. <span style="color: #f81313;display:inline-block;transform: translateY(-7px)">开启则不在小程序上显示</span>
  313. </div>
  314. </div>
  315. <div class="form_item">
  316. <div class="roomUl">
  317. <div
  318. class="title"
  319. style="line-height: normal; transform: translateX(10px)"
  320. >
  321. 房间
  322. </div>
  323. <div class="delRoom">
  324. <div class="ul">
  325. <div class="li" v-for="i in ruleForm.roomNumbers">
  326. <el-tag
  327. size="large"
  328. style="margin: 0 15px 8px 0"
  329. type="primary"
  330. >{{ i }}</el-tag
  331. >
  332. </div>
  333. </div>
  334. </div>
  335. </div>
  336. <!-- <el-form-item label="房间号 :" prop="roomNumbers">
  337. <el-tree-select
  338. v-model="roomSelNumList"
  339. :data="roomNumList"
  340. multiple
  341. :render-after-expand="false"
  342. show-checkbox
  343. style="width: 240px"
  344. :props="defaultProps"
  345. node-key="id"
  346. />
  347. </el-form-item> -->
  348. </div>
  349. <div class="form_item">
  350. <div class="items">
  351. <el-form-item label="类型 :" prop="roomType">
  352. <el-select
  353. v-model="ruleForm.roomType"
  354. class="m-2"
  355. placeholder="请选择类型"
  356. style="width: 200px"
  357. >
  358. <el-option label="全日房" value="1" />
  359. <el-option label="钟点房" value="2" />
  360. </el-select>
  361. </el-form-item>
  362. </div>
  363. </div>
  364. <div class="form_item" v-if="ruleForm.roomType == 2">
  365. <div class="items">
  366. <el-form-item label="钟点时长 :" prop="roomLiveTime">
  367. <el-select
  368. v-model="ruleForm.roomLiveTime"
  369. class="m-2"
  370. placeholder="请选择类型"
  371. style="width: 200px"
  372. >
  373. <el-option label="1小时" value="1" />
  374. <el-option label="2小时" value="2" />
  375. <el-option label="3小时" value="3" />
  376. <el-option label="4小时" value="4" />
  377. </el-select>
  378. </el-form-item>
  379. </div>
  380. <!-- <div class="items">
  381. <el-form-item label="使用时间 :" prop="receivingTime">
  382. <el-time-picker
  383. v-model="ruleForm.receivingTime"
  384. is-range
  385. range-separator="-"
  386. format="HH:ss"
  387. value-format="HH:ss"
  388. start-placeholder="开始时间"
  389. end-placeholder="结束时间"
  390. style="width: 200px"
  391. />
  392. </el-form-item>
  393. </div> -->
  394. </div>
  395. <div class="titles">
  396. <span>房型配置</span
  397. ><span>(最多可选择5个描述展示,管理端房型配置管理)</span>
  398. </div>
  399. <div class="form_item">
  400. <div class="items">
  401. <el-form-item label="选择配置 :" prop="roomConfig">
  402. <!-- <el-checkbox-group
  403. @change="checkHouse"
  404. v-model="ruleForm.roomConfig"
  405. :max="5"
  406. >
  407. <el-checkbox
  408. v-for="city in cities"
  409. :key="city.id"
  410. :label="city.id"
  411. >{{ city.name }}</el-checkbox
  412. >
  413. </el-checkbox-group> -->
  414. <el-checkbox-group
  415. @change="checkHouse"
  416. v-model="ruleForm.roomConfig"
  417. :max="5"
  418. >
  419. <el-checkbox
  420. v-for="i in roomConfig"
  421. :label="i.houseService"
  422. >{{ i.houseService }}</el-checkbox
  423. >
  424. <!-- <el-checkbox label="电视">电视</el-checkbox>
  425. <el-checkbox label="双人床">双人床</el-checkbox>
  426. <el-checkbox label="浴室">浴室</el-checkbox>
  427. <el-checkbox label="投影机">投影机</el-checkbox> -->
  428. </el-checkbox-group>
  429. </el-form-item>
  430. </div>
  431. </div>
  432. <el-form-item class="options">
  433. <el-button
  434. color="rgba(41, 109, 227, 1)"
  435. class="queding"
  436. type="primary"
  437. @click="submitAdd(ruleFormRef)"
  438. >
  439. 确认
  440. </el-button>
  441. <el-button type="primary" plain @click="cancelAdd(ruleFormRef)"
  442. >取消</el-button
  443. >
  444. </el-form-item>
  445. </el-form>
  446. </div>
  447. </el-dialog>
  448. </div>
  449. </div>
  450. <div class="bgImg" v-if="bgImg">
  451. <el-carousel
  452. @click="bgImg = false"
  453. ref="bgImgs"
  454. indicator-position
  455. arrow="always"
  456. :autoplay="false"
  457. trigger
  458. >
  459. <el-carousel-item v-for="item in bgImgList" :key="item.id">
  460. <img :src="item.url" alt="" />
  461. </el-carousel-item>
  462. </el-carousel>
  463. </div>
  464. </div>
  465. </template>
  466. <script setup>
  467. import {
  468. ref,
  469. reactive,
  470. watch,
  471. nextTick,
  472. onBeforeMount,
  473. onUnmounted,
  474. } from "vue";
  475. import { useRouter } from "vue-router";
  476. import { ElMessage, ElMessageBox } from "element-plus";
  477. import { Calendar } from "@element-plus/icons-vue";
  478. import vidiconsApi from "@/api/vidicons.js";
  479. import { dayjs } from "element-plus";
  480. import lodash from "lodash";
  481. import axios from "axios";
  482. import { useStore } from "vuex";
  483. const store = useStore();
  484. const api = ref("");
  485. const router = useRouter();
  486. const flagBtn = ref(); // 按钮权限
  487. // 表格数据
  488. const loading = ref(false);
  489. const tableData = reactive({
  490. list: [],
  491. });
  492. // 添加员工弹窗数据 (------------------------------------)
  493. const dialongTitle = ref("添加房型"); // 弹窗标题
  494. const cities = ref([
  495. "会议室",
  496. "订车场",
  497. "免费WIFI",
  498. "储物柜",
  499. "无早餐",
  500. "无停车场",
  501. ]); // 名宿配置数据
  502. const houseTypeList = ref(); // 房型选择
  503. const searchInput = reactive({
  504. keyWord: "",
  505. type: 1,
  506. }); // 搜索按钮数据
  507. // 查看图片按钮
  508. const bgImg = ref(false);
  509. const bgImgList = ref();
  510. const currentPage = ref(1); // 当前页
  511. const pageSize = ref(10);
  512. const total = ref(); // 当前总数
  513. const selectData = reactive({ list: [] }); // 多选框选择的数据
  514. const addDialogVisible = ref(false); // 控制添加员工弹窗
  515. // 添加员工表单数据
  516. const ruleFormRef = ref();
  517. const ruleForm = reactive({
  518. roomName: "", // 房型名称
  519. roomArea: "", //房型面积
  520. roomPrice: "", //单价
  521. number: "", //数量
  522. putaway: "", //房间上架
  523. visible: "", // 可见范围
  524. roomType: "", // 类型
  525. roomLiveTime: "", // 钟点时长
  526. receivingTime: "", // 使用时间
  527. roomConfig: "", //房型配置
  528. roomNumbers: [], // 房间号列表
  529. roomPicture: [], // 房间图片
  530. id: "",
  531. });
  532. const roomNumList = ref(); // 房间号列表数据
  533. const roomSelNumList = ref(); // 房间号列表数据选择
  534. const defaultProps = {
  535. children: "vos",
  536. label: "roomNumber",
  537. value: "id",
  538. // checkStrictly: true,
  539. };
  540. const imgShow = ref(false);
  541. const fileList = reactive({ list: [] }); // 添加多张图片的文件
  542. const roomConfig = ref([]); //房型配置
  543. // 房费验证
  544. const validatePrice = (rule, value, callback) => {
  545. if (/^(?!0+(?:\.0+)?$)(?:[1-9]\d*|0)(?:\.\d{1,2})?$/.test(value)) {
  546. callback();
  547. } else {
  548. callback(new Error("最多包含两位小数的正数"));
  549. }
  550. };
  551. // 房费验证
  552. const area = (rule, value, callback) => {
  553. if (/^(?!0+(?:\.0+)?$)(?:[1-9]\d*|0)(?:\.\d{1,4})?$/.test(value)) {
  554. callback();
  555. } else {
  556. callback(new Error("最多包含四位小数的正数"));
  557. }
  558. };
  559. // 房间数量验证
  560. const validateNumber = (rule, value, callback) => {
  561. console.log(value, "房间数量");
  562. if (/^\+?[1-9]\d*$/.test(value)) {
  563. callback();
  564. } else {
  565. callback(new Error("房间数量最大不能超过三位数"));
  566. }
  567. };
  568. // 表单验证
  569. const rules = reactive({
  570. roomPicture: [
  571. { required: true, message: "民宿图片不能为空", trigger: "blur" },
  572. ],
  573. roomName: [{ required: true, message: "房型名称不能为空", trigger: "blur" }],
  574. roomPrice: [
  575. { required: true, message: "房费不能为空", trigger: "blur" },
  576. // { validator: validatePrice, trigger: "blur" },
  577. ],
  578. number: [
  579. { required: true, message: "数量不能为空", trigger: "blur" },
  580. { validator: validateNumber, trigger: "blur" },
  581. // {
  582. // pattern: /^\+?[1-9]\d*$/,
  583. // message: "请输入大于0的正整数",
  584. // trigger: "blur",
  585. // },
  586. ],
  587. putaway: [{ required: true, message: "房间上架", trigger: "blur" }],
  588. visible: [{ required: true, message: "请选择可见范围", trigger: "blur" }],
  589. roomType: [{ required: true, message: "类型不能为空", trigger: "blur" }],
  590. roomNumbers: [{ required: true, message: "房间号不能为空", trigger: "blur" }],
  591. roomLiveTime: [
  592. { required: true, message: "钟点时长不能为空", trigger: "blur" },
  593. ],
  594. receivingTime: [
  595. { required: true, message: "使用时间不能为空", trigger: "blur" },
  596. ],
  597. roomArea: [
  598. { required: true, message: "房型面积不能为空", trigger: "blur" },
  599. { validator: area, trigger: "blur" },
  600. ],
  601. roomConfig: [
  602. { required: true, message: "房型配置不能为空", trigger: "blur" },
  603. ],
  604. });
  605. // 查看房型列表
  606. const getList = async () => {
  607. loading.value = true;
  608. let data = {
  609. page: currentPage.value,
  610. size: pageSize.value,
  611. keyWord: searchInput.keyWord, // 房型名称
  612. type: searchInput.type,
  613. };
  614. let res = await axios({
  615. method: "get",
  616. url: api.value + "/house/list",
  617. headers: {
  618. token: sessionStorage.getItem("token"),
  619. user_head: sessionStorage.getItem("user_head"),
  620. },
  621. params: data,
  622. });
  623. console.log(res, "房型管理");
  624. if (res.data.code == 200) {
  625. loading.value = false;
  626. // res.data.data.list.forEach((item) => {
  627. // let arr = [];
  628. // item.visible.split(",").forEach((i) => {
  629. // if (i == 0) {
  630. // arr.push("全部");
  631. // } else if (i == 1) {
  632. // arr.push("学生");
  633. // } else if (i == 2) {
  634. // arr.push("教职工");
  635. // } else if (i == 3) {
  636. // arr.push("校友");
  637. // } else if (i == 4) {
  638. // arr.push("访客");
  639. // } else if (i == 5) {
  640. // arr.push("临时人员");
  641. // } else if (i == 6) {
  642. // arr.push("其他");
  643. // } else if (i == 7) {
  644. // arr.push("领导");
  645. // }
  646. // });
  647. // item.visibleName = arr.join(",");
  648. // });
  649. res.data.data.list.forEach((i) => {
  650. if (i.roomId) {
  651. let arr = i.roomId.split(",");
  652. i.roomList = arr;
  653. i.roomLength = arr.length;
  654. }
  655. });
  656. tableData.list = res.data.data.list;
  657. total.value = res.data.data.totalCount;
  658. } else {
  659. loading.value = false;
  660. ElMessage({
  661. type: "error",
  662. showClose: true,
  663. message: res.data.message,
  664. center: true,
  665. });
  666. }
  667. };
  668. const systemList = async () => {
  669. let data = {
  670. permissionSettingId: sessionStorage.getItem("permissionSettingId"),
  671. };
  672. let res = await axios({
  673. method: "get",
  674. url: api.value + "/facility-services/list",
  675. headers: {
  676. token: sessionStorage.getItem("token"),
  677. user_head: sessionStorage.getItem("user_head"),
  678. },
  679. params: data,
  680. });
  681. console.log(res, "房型配置");
  682. if (res.data.code == 200) {
  683. roomConfig.value = res.data.data;
  684. } else {
  685. loading.value = false;
  686. ElMessage({
  687. type: "error",
  688. showClose: true,
  689. message: res.data.message,
  690. center: true,
  691. });
  692. }
  693. };
  694. // 房型列表数据
  695. const roomTypeList = async () => {
  696. let res = await axios({
  697. method: "get",
  698. url: api.value + "/house/displayBar",
  699. headers: {
  700. token: sessionStorage.getItem("token"),
  701. user_head: sessionStorage.getItem("user_head"),
  702. },
  703. });
  704. console.log(res, "房型列表数据");
  705. if (res.data.code == 200) {
  706. houseTypeList.value = res.data.data;
  707. } else {
  708. ElMessage({
  709. type: "error",
  710. showClose: true,
  711. message: res.data.message,
  712. center: true,
  713. });
  714. }
  715. };
  716. // 房间号列表数据
  717. const roomNumberList = async () => {
  718. let res = await axios({
  719. method: "get",
  720. url: api.value + "/house-number/houseNumberPullDown",
  721. headers: {
  722. token: sessionStorage.getItem("token"),
  723. user_head: sessionStorage.getItem("user_head"),
  724. },
  725. });
  726. console.log(res, "房间号列表数据");
  727. if (res.data.code == 200) {
  728. roomNumList.value = res.data.data;
  729. } else {
  730. ElMessage({
  731. type: "error",
  732. showClose: true,
  733. message: res.data.message,
  734. center: true,
  735. });
  736. }
  737. };
  738. // 搜索功能
  739. const searchBtn = lodash.debounce(async () => {
  740. getList();
  741. }, 300);
  742. // 移出照片
  743. const handleRemove = (uploadFile, uploadFiles) => {
  744. // console.log(uploadFile.uid, uploadFiles);
  745. fileList.list = fileList.list.filter((item) => {
  746. return item.uid != uploadFile.uid;
  747. });
  748. ruleForm.roomPicture = fileList.list;
  749. };
  750. // 点击图片的查看按钮
  751. const handlePreview = (file) => {
  752. imgUrl.value = file.url;
  753. imgVisible.value = true;
  754. // console.log(file);
  755. };
  756. // 限制上传图片的大小
  757. const beforeAvatarUpload = (rawFile) => {
  758. console.log(rawFile.type);
  759. if (rawFile.type !== "image/jpeg" && rawFile.type !== "image/png") {
  760. ElMessage.error("图片格式必须为JPG/PNG格式!");
  761. return false;
  762. } else if (rawFile.size / 1024 / 1024 > 10) {
  763. ElMessage.erroapi.valuer("图片的大小不能超过10MB!");
  764. return false;
  765. }
  766. return true;
  767. };
  768. // 添加照片时往fileList列表中添加图片信息
  769. const handleChange = async (file, fileLists) => {
  770. console.log(file, "1111");
  771. // fileList.list.push(file);
  772. };
  773. // 可以获取图片参数
  774. const handleUpload = async (file) => {
  775. if (fileList.list.length >= 6) {
  776. ElMessage.warning("最多可上传6张图片!");
  777. return false;
  778. }
  779. imgShow.value = true;
  780. console.log(file, "2222");
  781. let data = new FormData();
  782. data.set("file", file.file);
  783. let res = await axios({
  784. method: "post",
  785. url: api.value + "/upload/save",
  786. headers: {
  787. token: sessionStorage.getItem("token"),
  788. user_head: sessionStorage.getItem("user_head"),
  789. },
  790. data: data,
  791. });
  792. console.log(res, "图片上传成功");
  793. if (res.data.code == 200) {
  794. // res.data.uid = file.file.uid;
  795. fileList.list.push({ url: res.data.data.url, uid: file.file.uid });
  796. ruleForm.roomPicture = fileList.list;
  797. console.log(fileList.list);
  798. imgShow.value = false;
  799. } else {
  800. imgShow.value = false;
  801. ElMessage({
  802. type: "error",
  803. showClose: true,
  804. message: res.data.message,
  805. center: true,
  806. });
  807. }
  808. };
  809. //添加房型 (--------------------------------------)
  810. const addlist = async () => {
  811. dialongTitle.value = "添加房型";
  812. addDialogVisible.value = true;
  813. systemList();
  814. ruleForm.roomPicture = []; // 房间图片
  815. fileList.list = []; // 将选中的图片文件置为空
  816. ruleForm.roomName = ""; // 房型名称
  817. ruleForm.roomArea = ""; //房型面积
  818. ruleForm.roomPrice = ""; //单价
  819. ruleForm.number = ""; //数量
  820. ruleForm.putaway = 2; //数量
  821. ruleForm.roomType = ""; // 类型
  822. ruleForm.visible = ""; // 可见范围
  823. ruleForm.roomConfig = []; //房型配置
  824. ruleForm.id = ""; // id
  825. ruleForm.roomNumbers = []; // 房间号列表
  826. ruleForm.roomLiveTime = ""; // 钟点时长
  827. ruleForm.receivingTime = ""; // 使用时间
  828. };
  829. //编辑按钮 (-------------------------------------------)
  830. const edit = async (row) => {
  831. console.log(row, "编辑房型");
  832. dialongTitle.value = "编辑房型";
  833. ruleForm.id = row.id;
  834. ruleForm.putaway = row.isAdded;
  835. if (row.roomId) {
  836. ruleForm.roomNumbers = row.roomId.split(",");
  837. }
  838. let data = {
  839. houseId: row.id,
  840. };
  841. let res = await axios({
  842. method: "get",
  843. url: api.value + "/house/details",
  844. headers: {
  845. token: sessionStorage.getItem("token"),
  846. user_head: sessionStorage.getItem("user_head"),
  847. },
  848. params: data,
  849. });
  850. console.log(res, "编辑详情");
  851. if (res.data.code == 200) {
  852. addDialogVisible.value = true;
  853. ruleForm.roomName = res.data.data.roomName;
  854. ruleForm.roomArea = res.data.data.roomArea;
  855. ruleForm.roomPrice = res.data.data.roomPrice;
  856. ruleForm.number = res.data.data.number;
  857. // ruleForm.visible = res.data.data.visible.split(",");
  858. ruleForm.roomType = String(res.data.data.roomType);
  859. ruleForm.roomLiveTime = res.data.data.roomLiveTime;
  860. if (res.data.data.receivingTime) {
  861. ruleForm.receivingTime = res.data.data.receivingTime.split("-");
  862. } else {
  863. ruleForm.receivingTime = "";
  864. }
  865. systemList().then(() => {
  866. console.log(res.data.data.roomConfiguration);
  867. if (res.data.data.roomConfiguration) {
  868. ruleForm.roomConfig = res.data.data.roomConfiguration.split(",");
  869. } else {
  870. ruleForm.roomConfig = [];
  871. }
  872. });
  873. let imgArr = [];
  874. if (res.data.data.housePicture) {
  875. res.data.data.housePicture.split(",").forEach((i, ind) => {
  876. imgArr.push({
  877. url: i,
  878. uid: ind,
  879. });
  880. });
  881. ruleForm.roomPicture = imgArr;
  882. fileList.list = imgArr;
  883. } else {
  884. ruleForm.roomPicture = imgArr;
  885. fileList.list = imgArr;
  886. }
  887. // let arr = [];
  888. // res.data.data.roomIds.split(",").forEach((item, ind) => {
  889. // arr.push({
  890. // numberName: item,
  891. // id: ind,
  892. // });
  893. // });
  894. // ruleForm.roomNumbers = arr;
  895. } else {
  896. ElMessage({
  897. type: "error",
  898. showClose: true,
  899. message: res.data.message,
  900. center: true,
  901. });
  902. }
  903. // dialongTitle.value = "编辑房型";
  904. // addDialogVisible.value = true;
  905. // ruleForm.hName = row.hName; // 房型名称
  906. // ruleForm.hAreas = row.hAreas; //房型面积
  907. // ruleForm.price = row.price; //单价
  908. // ruleForm.number = row.number; //数量
  909. // return Number(item);
  910. // });
  911. // ruleForm.hConfig = row.hConfig; //房型配置
  912. // ruleForm.houseNumbers = row.houseNumbers; // 房间号列表
  913. // ruleForm.id = row.id; //id
  914. };
  915. // 取消添加房型
  916. const cancelAdd = () => {
  917. addDialogVisible.value = false;
  918. ruleFormRef.value.resetFields();
  919. ruleForm.roomName = "";
  920. ruleForm.roomArea = "";
  921. ruleForm.roomPrice = "";
  922. ruleForm.number = "";
  923. ruleForm.visible = "";
  924. ruleForm.roomType = "";
  925. ruleForm.roomLiveTime = "";
  926. ruleForm.receivingTime = "";
  927. ruleForm.roomConfig = "";
  928. // roomConfig.value = '';
  929. ruleForm.roomNumbers = [];
  930. ruleForm.roomPicture = [];
  931. fileList.list = [];
  932. };
  933. // 选择房型配置
  934. const checkHouse = (val) => {
  935. console.log(val);
  936. // ruleForm.roomConfig = val
  937. ruleForm.roomConfig = val;
  938. // console.log(ruleForm.roomConfig);
  939. };
  940. // 监听房间数量
  941. // watch(
  942. // () => ruleForm.number,
  943. // (newVal, oldVal) => {
  944. // console.log(newVal, "监听房间数量");
  945. // if (ruleForm.number <= 999) {
  946. // let arr = [];
  947. // if (newVal > 0) {
  948. // for (let i = 0; i < newVal; i++) {
  949. // arr[i] = {
  950. // numberName: "",
  951. // id: Math.random()
  952. // .toString(36)
  953. // .substr(3, i + 1),
  954. // };
  955. // }
  956. // }
  957. // arr.forEach((item, index) => {
  958. // ruleForm.roomNumbers.forEach((i, ind) => {
  959. // if (index == ind) {
  960. // item.numberName = i.numberName;
  961. // item.id = i.id;
  962. // }
  963. // });
  964. // });
  965. // ruleForm.roomNumbers = arr;
  966. // console.log(arr, "根据数量添加空房间");
  967. // } else {
  968. // ElMessage({
  969. // type: "warning",
  970. // showClose: true,
  971. // message: "房间数量最大为三位数",
  972. // center: true,
  973. // });
  974. // console.log(newVal.slice(0, 3));
  975. // ruleForm.number = newVal.slice(0, 3);
  976. // }
  977. // }
  978. // );
  979. // 新增房间号
  980. const addRoom = () => {
  981. console.log(ruleForm.roomNumbers);
  982. let arr = {
  983. numberName: "",
  984. id: Math.random().toString(36).substr(3, 6),
  985. };
  986. ruleForm.roomNumbers.push(arr);
  987. if (ruleForm.roomNumbers.length > 0) {
  988. ruleForm.number = ruleForm.roomNumbers.length;
  989. }
  990. // console.log(ruleForm.roomNumbers.length, "房间数量");
  991. };
  992. // 删除房间号
  993. const delRoom = (i) => {
  994. ruleForm.roomNumbers = ruleForm.roomNumbers.filter((item) => {
  995. return i.id != item.id;
  996. });
  997. if (ruleForm.roomNumbers.length > 0) {
  998. ruleForm.number = ruleForm.roomNumbers.length;
  999. } else {
  1000. ruleForm.number = "";
  1001. }
  1002. // console.log(ruleForm.roomNumbers.length, "房间数量");
  1003. };
  1004. // 确认添加房型
  1005. const submitAdd = lodash.debounce(async (formEl) => {
  1006. if (!formEl) return;
  1007. await formEl.validate(async (valid, fields) => {
  1008. if (valid) {
  1009. if (dialongTitle.value == "添加房型") {
  1010. // const arr = [];
  1011. // let flag = ruleForm.roomNumbers.some((i) => {
  1012. // return i.numberName == "";
  1013. // });
  1014. // if (flag) {
  1015. // ElMessage({
  1016. // type: "warning",
  1017. // showClose: true,
  1018. // message: "房间号不能为空",
  1019. // center: true,
  1020. // });
  1021. // return false;
  1022. // }
  1023. // ruleForm.roomNumbers.forEach((item) => {
  1024. // arr.push(item.numberName);
  1025. // console.log(item);
  1026. // });
  1027. const imgArr = [];
  1028. ruleForm.roomPicture.forEach((i) => {
  1029. imgArr.push(i.url);
  1030. });
  1031. console.log(ruleForm.roomPicture, "图片列表");
  1032. console.log(imgArr, "图片列表");
  1033. let data = {
  1034. // roomNumbers: arr, //房间号
  1035. house: {
  1036. roomName: ruleForm.roomName, //房间名字
  1037. roomType: ruleForm.roomType, //1:全日房,2:钟点房
  1038. roomPrice: ruleForm.roomPrice,
  1039. // number: ruleForm.number,
  1040. roomArea: ruleForm.roomArea,
  1041. roomLiveTime: ruleForm.roomLiveTime,
  1042. // receivingTime: `${ruleForm.receivingTime[0]}-${ruleForm.receivingTime[1]}`,
  1043. // visible: ruleForm.visible.join(","), //可见类型(0:全部,1:学生,2:教职工,3:校友,4:访客,5:临时人员,6:其他,7:领导)
  1044. roomConfiguration: ruleForm.roomConfig.join(","),
  1045. roomPicture: imgArr[0], // 房型首页图
  1046. housePicture: imgArr.join(","), //房型图,多张用逗号隔开
  1047. isAdded: ruleForm.putaway, //是否上架 1:上架 ,2:下架
  1048. },
  1049. adminId: sessionStorage.getItem("permissionSettingId"),
  1050. };
  1051. console.log(data, "添加房型参数");
  1052. let res = await axios({
  1053. method: "post",
  1054. url: api.value + "/house/save",
  1055. headers: {
  1056. token: sessionStorage.getItem("token"),
  1057. user_head: sessionStorage.getItem("user_head"),
  1058. },
  1059. data: data,
  1060. });
  1061. console.log(res, "添加房型");
  1062. if (res.data.code == 200) {
  1063. getList();
  1064. ElMessage({
  1065. type: "success",
  1066. showClose: true,
  1067. message: res.data.message,
  1068. center: true,
  1069. });
  1070. addDialogVisible.value = false;
  1071. ruleFormRef.value.resetFields();
  1072. } else {
  1073. ElMessage({
  1074. type: "error",
  1075. showClose: true,
  1076. message: res.data.message,
  1077. center: true,
  1078. });
  1079. }
  1080. } else {
  1081. // const arr = [];
  1082. // let flag = ruleForm.roomNumbers.some((i) => {
  1083. // return i.numberName == "";
  1084. // });
  1085. // if (flag) {
  1086. // ElMessage({
  1087. // type: "warning",
  1088. // showClose: true,
  1089. // message: "房间号不能为空",
  1090. // center: true,
  1091. // });
  1092. // return false;
  1093. // }
  1094. // ruleForm.roomNumbers.forEach((item) => {
  1095. // arr.push(item.numberName);
  1096. // console.log(item);
  1097. // });
  1098. const imgArr = [];
  1099. ruleForm.roomPicture.forEach((i) => {
  1100. imgArr.push(i.url);
  1101. });
  1102. console.log(ruleForm.roomPicture, "图片列表");
  1103. console.log(imgArr, "图片列表");
  1104. let data = {
  1105. // roomNumbers: arr, //房间号
  1106. house: {
  1107. id: ruleForm.id,
  1108. roomName: ruleForm.roomName, //房间名字
  1109. roomType: ruleForm.roomType, //1:全日房,2:钟点房
  1110. roomPrice: ruleForm.roomPrice,
  1111. // number: ruleForm.number,
  1112. roomArea: ruleForm.roomArea,
  1113. roomLiveTime: ruleForm.roomLiveTime,
  1114. // receivingTime: `${ruleForm.receivingTime[0]}-${ruleForm.receivingTime[1]}`,
  1115. // visible: ruleForm.visible.join(","), //可见类型(0:全部,1:学生,2:教职工,3:校友,4:访客,5:临时人员,6:其他,7:领导)
  1116. roomConfiguration: ruleForm.roomConfig.join(","),
  1117. roomPicture: imgArr[0], // 房型首页图
  1118. housePicture: imgArr.join(","), //房型图,多张用逗号隔开
  1119. isAdded: ruleForm.putaway, //是否上架 1:上架 ,2:下架
  1120. },
  1121. adminId: sessionStorage.getItem("permissionSettingId"),
  1122. };
  1123. console.log(data, "添加房型参数");
  1124. let res = await axios({
  1125. method: "post",
  1126. url: api.value + "/house/update",
  1127. headers: {
  1128. token: sessionStorage.getItem("token"),
  1129. user_head: sessionStorage.getItem("user_head"),
  1130. },
  1131. data: data,
  1132. });
  1133. console.log(res, "修改房型");
  1134. if (res.data.code == 200) {
  1135. getList();
  1136. ElMessage({
  1137. type: "success",
  1138. showClose: true,
  1139. message: res.data.message,
  1140. center: true,
  1141. });
  1142. addDialogVisible.value = false;
  1143. ruleFormRef.value.resetFields();
  1144. } else {
  1145. ElMessage({
  1146. type: "error",
  1147. showClose: true,
  1148. message: res.data.message,
  1149. center: true,
  1150. });
  1151. }
  1152. }
  1153. } else {
  1154. console.log("error submit!", fields);
  1155. }
  1156. });
  1157. }, 1000);
  1158. //删除按钮
  1159. const del = async (row) => {
  1160. console.log(row);
  1161. let data = {
  1162. houseId: row.id,
  1163. adminId: sessionStorage.getItem("permissionSettingId"),
  1164. };
  1165. let res = await axios({
  1166. method: "get",
  1167. url: api.value + "/house/delete",
  1168. headers: {
  1169. token: sessionStorage.getItem("token"),
  1170. user_head: sessionStorage.getItem("user_head"),
  1171. },
  1172. params: data,
  1173. });
  1174. if (res.data.code == 200) {
  1175. if (tableData.list.length == 1 && currentPage.value != 1) {
  1176. currentPage.value = currentPage.value - 1;
  1177. }
  1178. getList();
  1179. ElMessage({
  1180. type: "success",
  1181. showClose: true,
  1182. message: res.data.message,
  1183. center: true,
  1184. });
  1185. } else {
  1186. ElMessage({
  1187. type: "error",
  1188. showClose: true,
  1189. message: res.data.message,
  1190. center: true,
  1191. });
  1192. }
  1193. // console.log(res);
  1194. };
  1195. // 多选框功能
  1196. const handleSelectionChange = (val) => {
  1197. console.log(val);
  1198. selectData.list = val;
  1199. };
  1200. //导出功能
  1201. // const importExcel = async () => {
  1202. // if (searchInput.createTime == null) {
  1203. // searchInput.createTime = "";
  1204. // }
  1205. // let data = new FormData();
  1206. // data.set("car_number", searchInput.carnumber);
  1207. // data.set("create_time", searchInput.createTime);
  1208. // let res = await axios({
  1209. // method: "post",
  1210. // url: api.value + "/carBook/cinfotoExcel.action",
  1211. // headers: {
  1212. // token: sessionStorage.getItem("token"),
  1213. // },
  1214. // data: data,
  1215. // });
  1216. // // console.log(res, "导出账号");
  1217. // if (res.data.code == 200) {
  1218. // // const elt = document.createElement("a");
  1219. // // elt.setAttribute(
  1220. // // "href",
  1221. // // "https://chtech.ncjti.edu.cn/carstop" + res.data.downurl
  1222. // // );
  1223. // // elt.setAttribute("download", "file.png");
  1224. // // elt.style.display = "none";
  1225. // // document.body.appendChild(elt);
  1226. // // elt.click();
  1227. // var downloadPath = "https://chtech.ncjti.edu.cn/carstop" + res.data.downurl;
  1228. // console.log("获得地址数据:", downloadPath);
  1229. // var downloadLink = document.createElement("a");
  1230. // downloadLink.style.display = "none"; // 使其隐藏
  1231. // downloadLink.href = downloadPath;
  1232. // downloadLink.download = "";
  1233. // downloadLink.click();
  1234. // document.body.appendChild(downloadLink);
  1235. // document.body.removeChild(downloadLink);
  1236. // ElMessage({
  1237. // type: "success",
  1238. // showClose: true,
  1239. // message: res.data.message,
  1240. // center: true,
  1241. // });
  1242. // } else {
  1243. // ElMessage({
  1244. // type: "error",
  1245. // showClose: true,
  1246. // message: res.data.message,
  1247. // center: true,
  1248. // });
  1249. // }
  1250. // };
  1251. // 表格斑马纹颜色修改
  1252. const tableRowClassName = ({ row, rowIndex }) => {
  1253. if (rowIndex % 2 === 0) {
  1254. return "even";
  1255. } else if (rowIndex % 2 !== 0) {
  1256. return "odd";
  1257. }
  1258. return "";
  1259. };
  1260. // 分页
  1261. const handleCurrentChange = (value) => {
  1262. // console.log(value);
  1263. currentPage.value = value;
  1264. getList();
  1265. };
  1266. // 查看图片
  1267. const lookImg = (i) => {
  1268. console.log(i);
  1269. bgImg.value = true;
  1270. let arr = [
  1271. {
  1272. url: i.url,
  1273. id: i.uid,
  1274. },
  1275. ];
  1276. bgImgList.value = arr;
  1277. };
  1278. onBeforeMount(async () => {
  1279. api.value = store.state.user.api;
  1280. const btnflag = JSON.parse(sessionStorage.getItem("btnflag"));
  1281. flagBtn.value = btnflag.roomType;
  1282. console.log(flagBtn.value, "按钮权限");
  1283. getList();
  1284. // roomTypeList();
  1285. // roomNumberList();
  1286. });
  1287. onUnmounted(() => {
  1288. // document.removeEventListener("keyup", Enters);
  1289. });
  1290. </script>
  1291. <style scoped lang="scss">
  1292. .content-box {
  1293. width: calc(100% - 40px);
  1294. height: calc(100% - 105px);
  1295. margin: 20px auto;
  1296. background-color: #fff;
  1297. color: #fff;
  1298. display: flex;
  1299. flex-direction: column;
  1300. box-shadow: 0px 3px 10px rgba(0, 97, 255, 0.2);
  1301. .left {
  1302. // width: calc(100wh - 40px);
  1303. display: flex;
  1304. align-items: center;
  1305. height: 60px;
  1306. margin: 0 30px;
  1307. border-bottom: 1px solid #ccc;
  1308. color: rgb(0, 0, 0);
  1309. font-size: 18px;
  1310. font-weight: 600;
  1311. span {
  1312. margin-right: 20px;
  1313. cursor: pointer;
  1314. }
  1315. .is_active {
  1316. color: rgba(111, 182, 184, 1);
  1317. }
  1318. }
  1319. .middle {
  1320. color: #000;
  1321. // border-bottom: 1px solid rgb(231, 231, 231);
  1322. .filter {
  1323. display: flex;
  1324. flex-wrap: wrap;
  1325. align-items: center;
  1326. padding: 10px 0 0 0;
  1327. .search {
  1328. color: #fff;
  1329. margin: 0 30px 0 0;
  1330. }
  1331. .condition {
  1332. display: flex;
  1333. align-items: center;
  1334. margin: 10px 30px 10px 0;
  1335. :deep(.el-input .el-input__inner) {
  1336. font-size: 14px;
  1337. }
  1338. span {
  1339. margin: 0 10px 0 0;
  1340. }
  1341. }
  1342. }
  1343. .gongneng {
  1344. padding: 10px 0 20px 0;
  1345. span {
  1346. color: #fff;
  1347. }
  1348. }
  1349. :deep(.cont) {
  1350. width: 60%;
  1351. margin: 20px auto;
  1352. }
  1353. :deep(.download) {
  1354. display: flex;
  1355. align-items: center;
  1356. margin: 10px;
  1357. }
  1358. :deep(.download span) {
  1359. font-size: 16px;
  1360. margin-left: 20px;
  1361. }
  1362. :deep(.cont .el-button) {
  1363. margin-left: 60px;
  1364. margin-bottom: 30px;
  1365. }
  1366. :deep(.cont .accomplish) {
  1367. width: 100%;
  1368. display: flex;
  1369. justify-content: center;
  1370. }
  1371. :deep(.cont .accomplish .el-button) {
  1372. width: 50%;
  1373. margin: 0;
  1374. }
  1375. }
  1376. .scroll {
  1377. width: calc(100% - 60px);
  1378. height: calc(100% - 61px);
  1379. margin: 0 auto;
  1380. overflow: auto;
  1381. display: flex;
  1382. flex-direction: column;
  1383. }
  1384. .footer {
  1385. flex: 1;
  1386. overflow: auto;
  1387. .el-table--fit {
  1388. height: calc(100% - 60px);
  1389. :deep(.el-table__header-wrapper) {
  1390. background-color: #000;
  1391. font-size: 16px;
  1392. tr {
  1393. color: #000;
  1394. }
  1395. }
  1396. :deep(.el-table__row) {
  1397. height: 50px;
  1398. font-size: 16px;
  1399. color: #000;
  1400. }
  1401. :deep(.el-table__row):nth-child(2n) {
  1402. .el-table-fixed-column--right {
  1403. background-color: rgba(240, 243, 247, 1);
  1404. }
  1405. }
  1406. :deep(.el-table__row td) {
  1407. padding: 0;
  1408. border: 0;
  1409. }
  1410. .el-button--primary {
  1411. margin-left: 5px;
  1412. }
  1413. :deep(.el-table__body .even) {
  1414. background-color: #fff;
  1415. }
  1416. :deep(.el-table__body .odd) {
  1417. background-color: rgba(240, 243, 247, 1);
  1418. }
  1419. :deep(.edit) {
  1420. display: flex;
  1421. align-items: center;
  1422. justify-content: center;
  1423. color: rgba(111, 182, 184, 1);
  1424. }
  1425. :deep(.look) {
  1426. padding: 0 10px;
  1427. cursor: pointer;
  1428. color: rgba(30, 125, 251, 1);
  1429. }
  1430. .del {
  1431. color: rgba(212, 48, 48, 1);
  1432. cursor: pointer;
  1433. }
  1434. // :deep(.look):hover {
  1435. // color: red;
  1436. // }
  1437. // :deep(.del):hover {
  1438. // color: red;
  1439. // }
  1440. }
  1441. // 添加房型弹窗样式
  1442. :deep(.addStaff) {
  1443. height: 650px;
  1444. border-radius: 11px;
  1445. .el-dialog__header {
  1446. border-radius: 11px 11px 0 0;
  1447. background: rgba(237, 241, 245, 1);
  1448. font-weight: 600;
  1449. margin: 0;
  1450. .el-dialog__headerbtn {
  1451. outline: none;
  1452. }
  1453. }
  1454. .el-dialog__body {
  1455. padding: 10px 30px 10px 35px;
  1456. .slider {
  1457. height: 560px;
  1458. overflow: auto;
  1459. }
  1460. .tooltips {
  1461. display: flex;
  1462. .img {
  1463. display: flex;
  1464. .img_title {
  1465. span {
  1466. display: inline-block;
  1467. width: 60px;
  1468. }
  1469. }
  1470. .updateImg {
  1471. display: flex;
  1472. flex-direction: column;
  1473. width: 720px;
  1474. .el-upload {
  1475. // margin-top: 20px;
  1476. .zhu {
  1477. color: rgba(212, 48, 48, 1);
  1478. }
  1479. }
  1480. }
  1481. }
  1482. }
  1483. .img1 {
  1484. img {
  1485. width: 183px;
  1486. height: 121px;
  1487. opacity: 1;
  1488. border-radius: 10px;
  1489. }
  1490. .updateImg {
  1491. .el-upload__tip {
  1492. color: rgba(212, 48, 48, 1);
  1493. transform: translateX(-30px);
  1494. }
  1495. .el-upload-list {
  1496. display: none;
  1497. }
  1498. .imglist {
  1499. display: flex;
  1500. flex-wrap: wrap;
  1501. margin-bottom: 15px;
  1502. img {
  1503. margin-right: 15px;
  1504. }
  1505. .imgItem {
  1506. position: relative;
  1507. }
  1508. .lookImg {
  1509. width: 183px;
  1510. height: 121px;
  1511. cursor: pointer;
  1512. position: absolute;
  1513. top: 0;
  1514. left: 0;
  1515. border-radius: 10px;
  1516. display: flex;
  1517. justify-content: center;
  1518. align-items: center;
  1519. img {
  1520. width: 30px;
  1521. height: 30px;
  1522. opacity: 0;
  1523. }
  1524. .delimg {
  1525. width: 30px;
  1526. height: 30px;
  1527. background-image: url("@/assets/imgDel.png");
  1528. background-size: 100%;
  1529. opacity: 0;
  1530. margin-left: 5px;
  1531. }
  1532. }
  1533. .lookImg:hover {
  1534. background-color: rgba(0, 0, 0, 0.2);
  1535. img {
  1536. opacity: 1;
  1537. cursor: pointer;
  1538. }
  1539. .delimg {
  1540. opacity: 1;
  1541. cursor: pointer;
  1542. }
  1543. }
  1544. }
  1545. }
  1546. }
  1547. .el-input {
  1548. width: 200px;
  1549. }
  1550. .el-form {
  1551. .titles {
  1552. font-weight: 600;
  1553. color: #000;
  1554. font-size: 18px;
  1555. margin: 10px 0 20px 0;
  1556. span:nth-child(2) {
  1557. color: rgba(212, 48, 48, 1);
  1558. }
  1559. }
  1560. .footer {
  1561. color: rgba(212, 48, 48, 1);
  1562. }
  1563. .form_item {
  1564. display: flex;
  1565. margin-bottom: 10px;
  1566. .intro {
  1567. .el-form-item__content {
  1568. width: 550px;
  1569. }
  1570. }
  1571. .default {
  1572. .el-form-item__label {
  1573. width: 160px !important;
  1574. }
  1575. }
  1576. }
  1577. .tag {
  1578. .el-form-item__content {
  1579. width: 200px;
  1580. }
  1581. }
  1582. .roomUl {
  1583. display: flex;
  1584. // margin: 10px 0;
  1585. // align-items: center;
  1586. .title {
  1587. width: 100px;
  1588. height: 40px;
  1589. text-align: left;
  1590. line-height: 40px;
  1591. }
  1592. .delRoom {
  1593. .ul {
  1594. width: 680px;
  1595. list-style: none;
  1596. border: none;
  1597. display: flex;
  1598. flex-wrap: wrap;
  1599. margin: 0;
  1600. padding: 0;
  1601. .li {
  1602. display: flex;
  1603. flex-wrap: wrap;
  1604. .li_items {
  1605. // span {
  1606. // margin-right: 40px;
  1607. // }
  1608. .li_item {
  1609. display: flex;
  1610. justify-content: space-around;
  1611. align-items: center;
  1612. width: 120px;
  1613. height: 40px;
  1614. border: 1px solid #e0e0e0;
  1615. margin: 0 10px 10px 0;
  1616. border-radius: 7px;
  1617. }
  1618. .li_item_warning {
  1619. border: 1px solid red;
  1620. }
  1621. .warning {
  1622. color: red;
  1623. // text-align: center;
  1624. font-size: 12px;
  1625. }
  1626. .el-input {
  1627. width: 70px;
  1628. .el-input__wrapper {
  1629. box-shadow: none;
  1630. }
  1631. }
  1632. .del {
  1633. width: 14px;
  1634. height: 14px;
  1635. background-image: url("@/assets/delete.png");
  1636. background-size: 100%;
  1637. }
  1638. .del:hover {
  1639. background-image: url("@/assets/delete_hover.png");
  1640. cursor: pointer;
  1641. }
  1642. }
  1643. }
  1644. .addRoom {
  1645. cursor: pointer;
  1646. margin-left: 10px;
  1647. height: 42px;
  1648. color: rgba(9, 101, 98, 1);
  1649. display: flex;
  1650. justify-content: space-around;
  1651. align-items: center;
  1652. img {
  1653. width: 15px;
  1654. margin-right: 5px;
  1655. }
  1656. }
  1657. }
  1658. }
  1659. }
  1660. }
  1661. .options {
  1662. width: 100%;
  1663. margin: 25px 0 15px 0;
  1664. .el-form-item__content {
  1665. .queding {
  1666. margin-left: 20px;
  1667. color: #fff;
  1668. }
  1669. display: flex;
  1670. flex-direction: row-reverse;
  1671. }
  1672. }
  1673. }
  1674. }
  1675. }
  1676. .bgImg {
  1677. position: absolute;
  1678. left: 0;
  1679. top: 0;
  1680. z-index: 99999999;
  1681. width: 100%;
  1682. height: 100%;
  1683. background-color: rgba(255, 255, 255, 0.8);
  1684. // border-radius: 50px;
  1685. :deep(.el-carousel__container) {
  1686. width: 100%;
  1687. height: calc(100vh);
  1688. .el-carousel__item {
  1689. display: flex;
  1690. justify-content: center;
  1691. img {
  1692. height: 100%;
  1693. }
  1694. }
  1695. }
  1696. }
  1697. .pageSize {
  1698. height: 60px;
  1699. display: flex;
  1700. align-items: center;
  1701. justify-content: space-between;
  1702. span {
  1703. color: #000;
  1704. }
  1705. .el-pagination {
  1706. // width: 1600px;
  1707. :deep(.el-pagination__total) {
  1708. color: #000;
  1709. }
  1710. :deep(.el-pagination__goto) {
  1711. color: #000;
  1712. }
  1713. :deep(.el-pagination__classifier) {
  1714. color: #000;
  1715. }
  1716. :deep(.el-input__wrapper) {
  1717. border: 1px solid rgba(0, 0, 0, 1);
  1718. border-radius: 5px;
  1719. box-shadow: none;
  1720. }
  1721. :deep(.el-pager li) {
  1722. margin: 0 5px;
  1723. border: 1px solid rgba(0, 0, 0, 1);
  1724. border-radius: 5px;
  1725. background-color: transparent;
  1726. }
  1727. :deep(.el-pager li.is-active) {
  1728. // background-color: rgba(0, 97, 255, 0.8);
  1729. border: 1px solid rgba(0, 97, 255, 1);
  1730. color: rgba(0, 97, 255, 1);
  1731. }
  1732. :deep(.btn-prev) {
  1733. margin-right: 5px;
  1734. border: 1px solid rgba(0, 0, 0, 1);
  1735. border-radius: 5px;
  1736. background-color: transparent;
  1737. }
  1738. :deep(.btn-next) {
  1739. margin-left: 5px;
  1740. border: 1px solid rgba(0, 0, 0, 1);
  1741. border-radius: 5px;
  1742. background-color: transparent;
  1743. }
  1744. }
  1745. }
  1746. }
  1747. .el-input {
  1748. width: 192px;
  1749. }
  1750. </style>