index.vue 50 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152
  1. <template>
  2. <div class="album-page">
  3. <div class="album-wrap" ref="scrollContainer">
  4. <!-- <div class="barrage-title">
  5. 农情动态
  6. </div> -->
  7. <div class="album-content">
  8. <div class="album-bottom">
  9. <el-affix :offset="108">
  10. <div class="album-l">
  11. <el-menu default-active="0" class="el-menu-vertical-demo">
  12. <el-menu-item
  13. v-for="(item, index) in farmWorkList"
  14. :key="index"
  15. :index="index.toString()"
  16. :id="'menu' + index"
  17. :class="{ active: activeSection === index }"
  18. @click="scrollToSection(index)"
  19. v-show="item.menu"
  20. >
  21. <img
  22. class="menu-icon"
  23. :src="
  24. require('@/assets/img/gallery/icon-' +
  25. item.icon +
  26. (item.statuss === 0 ? '-no' : '') +
  27. '.png')
  28. "
  29. />
  30. <div
  31. :class="[
  32. 'menu-name',
  33. {
  34. noTime: item.status === 0,
  35. onTime: item.status === 2,
  36. now: item.status === 1,
  37. },
  38. ]"
  39. >
  40. {{ item.farmWorkName }}
  41. </div>
  42. </el-menu-item>
  43. </el-menu>
  44. </div>
  45. </el-affix>
  46. <!-- <div
  47. class="export-btn"
  48. v-show="farmId == 766 || farmId == 1"
  49. @click="handleExport"
  50. :style="{ bottom: `${tabBarHeight}px` }"
  51. >
  52. <div class="btn-item"><img src="@/assets/img/old_mini/export.png" />导出</div>
  53. </div> -->
  54. <div class="album-r" @scroll="debouncedHandleScroll2">
  55. <div
  56. class="done-card section"
  57. v-for="(card, cardI) in farmWorkList"
  58. :key="cardI"
  59. :class="{ flashing: card.status === 1 && isFlashing }"
  60. >
  61. <div
  62. class="card-dom"
  63. :id="'section' + cardI"
  64. ></div>
  65. <div v-if="card.status === 1 && indicatorChartData.content" class="log-wrap">
  66. <div class="log-box">
  67. <div class="log-title PangMenZhengDao-FONT">
  68. <span>果园日志</span>
  69. </div>
  70. <div class="log-content">
  71. <div class="log-desc" v-html="indicatorChartData?.content"></div>
  72. <indicatorChart
  73. :key="cardI+'log'"
  74. :isDark="true"
  75. :chartData="indicatorChartData"
  76. ></indicatorChart>
  77. </div>
  78. <div v-show="farmId == 766" class="time-img">
  79. <photo-provider :photo-closable="true">
  80. <photo-consumer
  81. class="time-item"
  82. :src="require('@/assets/img/gallery/time.png')"
  83. >
  84. <img src="@/assets/img/gallery/time.png" style="width: 100%" />
  85. </photo-consumer>
  86. </photo-provider>
  87. <!-- <img src="@/assets/img/gallery/time.png" /> -->
  88. </div>
  89. </div>
  90. </div>
  91. <div class="card-wrap" :class="{ noCarousel: card.status !== 0, 'done': card.status === 0 }">
  92. <div
  93. class="card-content"
  94. :class="{ push: card.status === 1, hasBg: card.status === 2 && !card.hasBg }"
  95. >
  96. <div
  97. class="card-top"
  98. @click.stop="showDetail(card)"
  99. >
  100. <!-- :class="{ noChart: !card.indexChart.length }" -->
  101. <div class="card-title serve-title">
  102. <div class="title-name">{{ card.farmWorkName }}</div>
  103. <div v-if="card.type === 1" class="status-tag standard">标准农事</div>
  104. <div v-if="card.type === 2" class="status-tag advice">推荐农事</div>
  105. <div v-if="card.type === 0" class="status-tag warning">预警农事</div>
  106. <!-- 右上角角标 -->
  107. <div v-if="card.status === 2 && card.execute === 0" class="add-btn">
  108. 未触发
  109. </div>
  110. <div
  111. v-if="card.execute === 2"
  112. class="add-btn unactive"
  113. >
  114. 未激活
  115. </div>
  116. <div v-if="card.execute === 3" class="add-btn">待执行</div>
  117. <div v-if="card.status === 0 && card.execute === 4" class="add-btn recheck">
  118. 已完成
  119. </div>
  120. <div v-if="card.status === 0 && card.reCheck === 1" class="add-btn recheck">
  121. 已复核
  122. </div>
  123. <div v-if="card.execute === 1" class="add-btn unactive">已失效</div>
  124. </div>
  125. <!-- <div v-else class="card-title">
  126. <div class="title-name">{{ card.farmWorkName }}</div>
  127. <div class="status-tag blue">{{ card.reCheck ? "已复核" : "已完成" }}</div>
  128. <div class="status-tag blue good-wrap">
  129. 优<img class="good" src="@/assets/img/weather_index/good.png" />
  130. </div>
  131. </div> -->
  132. <div v-if="card.status === 0">
  133. <!-- 已完成 -->
  134. <div class="card-desc">
  135. <span class="desc-title">服务主体:</span>
  136. {{ card.serviceMain || "大荔农业" }}
  137. </div>
  138. <div class="card-desc">
  139. <span class="desc-title">执行主体:</span>
  140. {{ card.executeMain || "大荔农业" }}
  141. </div>
  142. <div class="card-desc">
  143. <span class="desc-title">指导专家:</span>
  144. <span class="expert-link" @click="toExpert(card.expertName)">
  145. {{ card.expertName }}
  146. <el-icon color="#F0AC37" class="icon" size="12"><Link /></el-icon>
  147. </span>
  148. </div>
  149. </div>
  150. <div v-else>
  151. <div class="card-desc condition-wrap">
  152. <span class="desc-title">触发条件:</span>
  153. {{ card.condition }}
  154. </div>
  155. <div class="card-desc">
  156. <span class="desc-title">农事编号:</span>
  157. {{ card.code }}
  158. </div>
  159. <div v-if="card.status === 2" class="card-desc">
  160. <span class="desc-title">推荐时间:</span>
  161. {{ card.solarName }}
  162. </div>
  163. <div v-if="card.status === 1" class="card-desc">
  164. <span class="desc-title">推荐时间:</span>
  165. {{ card.executeDate }}
  166. </div>
  167. <div v-if="card.status === 0" class="card-desc">
  168. <span class="desc-title">{{
  169. card.reCheck ? "复核时间:" : "执行时间:"
  170. }}</span>
  171. {{ card.executeDate }}
  172. </div>
  173. </div>
  174. <div class="card-desc last-desc">
  175. <span class="desc-title">药物处方:</span>
  176. <div class="rescription-wrap">
  177. <div class="rescription">
  178. <span
  179. v-for="(
  180. fertilizer, fertilizerI
  181. ) in card.pesticideFertilizerList"
  182. :key="fertilizerI"
  183. >
  184. {{ fertilizer.ratio ? fertilizer.ratio + "倍" : "" }}
  185. {{ fertilizer.name }}
  186. <span
  187. v-if="
  188. fertilizerI !== card.pesticideFertilizerList.length - 1
  189. "
  190. >
  191. +
  192. </span>
  193. </span>
  194. </div>
  195. <div class="detail-text">查看详情></div>
  196. </div>
  197. </div>
  198. <div class="card-link" v-if="card.status === 2" @click.stop="handlePage(card)">
  199. <img src="@/assets/img/gallery/expert-icon.png" />
  200. <div class="expert-name">
  201. {{ card.expertName
  202. }}<el-icon size="12" class="icon"><ArrowRightBold /></el-icon>
  203. </div>
  204. </div>
  205. <div class="step-box" v-else>
  206. <step-box :card="card" :isDone="card.status === 0 && (card.reCheck === 1 || card.execute === 4)" v-if="card.orderStatus || card.status === 0 || card.orderStatus === 0"></step-box>
  207. </div>
  208. </div>
  209. <chart
  210. v-if="card.status !== 2 && card.indexChart.length && card.status !== 0"
  211. :key="cardI"
  212. :indexName="card.indexName"
  213. :type="card.status !== 1 ? 'normal' : 'feature'"
  214. :chartData="card.indexChart"
  215. ></chart>
  216. <div v-if="card.status === 0 && card.userEvaluation">
  217. <div class="evaluate">
  218. <div class="evaluate-title">用户评价</div>
  219. <div class="comment">
  220. <div class="user-info">
  221. <el-avatar
  222. class="avatar"
  223. :size="40"
  224. :src="card.userEvaluation.icon"
  225. />
  226. <div class="user-name">
  227. <div>{{ card.userEvaluation.commentUserName || "麦田守望者" }}</div>
  228. <span>{{ card.userEvaluation.commentDate }}</span>
  229. </div>
  230. </div>
  231. <div class="rate">
  232. <div class="rate-item">
  233. <span class="name">专家</span>
  234. <el-rate v-model="card.userEvaluation.expertServiceRating" size="small" />
  235. </div>
  236. <div class="rate-item">
  237. <span class="name">农资</span>
  238. <el-rate v-model="card.userEvaluation.agricultureServiceRating" size="small" />
  239. </div>
  240. <div class="rate-item">
  241. <span class="name">农服</span>
  242. <el-rate v-model="card.userEvaluation.farmServiceRating" size="small" />
  243. </div>
  244. </div>
  245. <div class="text van-multi-ellipsis--l2">
  246. {{ card.userEvaluation.detailedComment }}
  247. </div>
  248. </div>
  249. </div>
  250. </div>
  251. </div>
  252. </div>
  253. <div v-if="card.status !== 2" :class="['over-img']">
  254. <!-- 图片列表 -->
  255. <album-carousel7d
  256. :key="farmName"
  257. :farmId="farmId"
  258. :farmWork="card"
  259. ></album-carousel7d>
  260. </div>
  261. </div>
  262. </div>
  263. </div>
  264. </div>
  265. </div>
  266. </div>
  267. </template>
  268. <script setup>
  269. import { onMounted, ref, computed, onUnmounted, nextTick, onActivated, onDeactivated } from "vue";
  270. import { useStore } from "vuex";
  271. import { useRoute, useRouter } from "vue-router";
  272. import stepBox from "@/components/common/stepBox.vue";
  273. import eventBus from "@/api/eventBus";
  274. import chart from "./components/chart.vue";
  275. import indicatorChart from "./components/indicatorChart.vue";
  276. const store = useStore();
  277. import AlbumCarousel7d from "./album_compoents/albumCarousel7d";
  278. const miniUserId = 81881;
  279. const route = useRoute();
  280. // 监听页面滚动,更新当前激活的锚点
  281. const handleScroll = () => {
  282. const scrollPosition = window.scrollY; // 加上头部偏移量
  283. farmWorkList.value.forEach((_, index) => {
  284. const section = document.getElementById(`section${index}`);
  285. if (section && section.offsetTop <= scrollPosition) {
  286. activeSection.value = index;
  287. }
  288. });
  289. };
  290. // 防抖函数
  291. function debounce(func, wait) {
  292. let timeout;
  293. return function (...args) {
  294. const later = () => {
  295. clearTimeout(timeout);
  296. func.apply(this, args);
  297. };
  298. clearTimeout(timeout);
  299. timeout = setTimeout(later, wait);
  300. };
  301. }
  302. const handleRightScroll = () => {
  303. activeSection.value = null;
  304. };
  305. const debouncedHandleScroll = debounce(handleScroll, 100);
  306. const debouncedHandleScroll2 = debounce(handleRightScroll, 500);
  307. // onMounted(() => {
  308. // window.addEventListener("scroll", debouncedHandleScroll);
  309. // // myPushChart = echarts.init(chartPushRef.value);
  310. // // myPushChart.setOption(galleryLine);
  311. // getFarmDetail(farmId);
  312. // getFarmWorkList(farmId);
  313. // });
  314. const handlePage = (item) =>{
  315. router.push('/expert_page?name='+item.expertName)
  316. }
  317. const toExpert = (expertName) =>{
  318. router.push('/expert_page?name='+expertName)
  319. }
  320. onMounted(() => {
  321. sampleId.value = 766;
  322. farmId.value = 88388;
  323. // window.addEventListener("scroll", debouncedHandleScroll);
  324. getFarmDetail(farmId.value);
  325. getFarmWorkList(farmId.value);
  326. getFarmLog()
  327. window.addEventListener("scroll", debouncedHandleScroll);
  328. });
  329. const sampleId = ref(null);
  330. const farmId = ref(null);
  331. // 移除滚动事件监听
  332. onUnmounted(() => {
  333. window.removeEventListener("scroll", debouncedHandleScroll);
  334. });
  335. // 果园日志
  336. const indicatorChartData = ref({})
  337. const getFarmLog = () => {
  338. VE_API.farm.fetchFarmLog({id: "96966", farmId: 766}).then(({data,code}) => {
  339. if(code === 0){
  340. indicatorChartData.value = data
  341. eventBus.emit('chart:updateOption', indicatorChartData.value)
  342. } else {
  343. indicatorChartData.value = {}
  344. }
  345. })
  346. }
  347. // 农场详情
  348. const farmDetail = ref({});
  349. const getFarmDetail = (id) => {
  350. VE_API.farm.fetchFarmDetail({ id }).then(({ data }) => {
  351. farmDetail.value = data;
  352. });
  353. };
  354. // 农事列表
  355. const farmWorkList = ref([]);
  356. const getFarmWorkList = (farmId) => {
  357. VE_API.farm.fetchFarmWorkList({ farmId }).then(({ data }) => {
  358. getSecondLastIndex(data);
  359. // farmWorkList.value = data;
  360. nextTick(() => {
  361. initScrollToSection(secondLastIndex.value);
  362. });
  363. setTimeout(() => {
  364. startFlashing();
  365. }, 100);
  366. });
  367. };
  368. const router = useRouter();
  369. const activeSection = ref(0);
  370. const scrollContainer = ref(null);
  371. // 点击左侧菜单项,滚动到对应内容
  372. const scrollToSection = (index) => {
  373. // const section = farmWorkList.value[index];
  374. const sectionElement = document.getElementById(`section${index}`);
  375. if (sectionElement) {
  376. sectionElement.scrollIntoView({ behavior: "smooth" });
  377. activeSection.value = index;
  378. setTimeout(() => {
  379. // 获取滚动容器的当前滚动位置
  380. let scrollTop = scrollContainer.value.scrollTop;
  381. scrollTop += 44; // 加多 44px,头部的高度
  382. // 滚动至目标位置
  383. scrollContainer.value.scrollTop = scrollTop;
  384. }, 300);
  385. }
  386. };
  387. // 点击左侧菜单项,滚动到对应内容
  388. const initScrollToSection = (index) => {
  389. const menuElement = document.getElementById(`menu${index}`);
  390. if (menuElement) {
  391. menuElement.scrollIntoView({ behavior: "smooth" });
  392. activeSection.value = index;
  393. setTimeout(() => {
  394. scrollToSection(index);
  395. }, 0);
  396. }
  397. };
  398. const secondLastIndex = ref(-1); // 初始化索引值
  399. const getSecondLastIndex = (data) => {
  400. // 过滤出 status 为 2 的项
  401. const filteredItems = data.filter((item) => item.status === 1);
  402. // 获取倒数第二项
  403. if (filteredItems.length >= 1) {
  404. const secondLastItem = filteredItems[filteredItems.length - 1];
  405. // 获取该项在原数组中的索引
  406. secondLastIndex.value = data.indexOf(secondLastItem);
  407. const lastTwoItems = filteredItems.slice(-1);
  408. farmWorkList.value = data.map((item) => {
  409. // 如果是最后两项之一,则添加 feature 属性
  410. if (lastTwoItems.includes(item)) {
  411. return { ...item, hasBg: true };
  412. }
  413. return item;
  414. });
  415. } else {
  416. secondLastIndex.value = -1; // 如果没有足够的项,设置为 -1
  417. }
  418. };
  419. const isFlashing = ref(false);
  420. const startFlashing = () => {
  421. isFlashing.value = true;
  422. // 使用 setTimeout 在一段时间后停止闪动
  423. setTimeout(() => {
  424. isFlashing.value = false;
  425. }, 3000); // 3 秒后停止闪动
  426. };
  427. // 显示详情
  428. const showDetail = (card) => {
  429. const pageParams = {
  430. activeIndex: activeSection.value,
  431. card,
  432. };
  433. // eventBus.emit("detailDialog:showDialog", pageParams);
  434. if (card.orderStatus || card.orderStatus === 0) {
  435. router.push({ path: "/work_detail", query: { data: JSON.stringify(card), recordId: null } });
  436. }
  437. if (card.status === 0 && (card.reCheck === 1 || card.execute === 4)) {
  438. // 农事成效
  439. router.push({ path: "/ns_recrod_effect", query: { data: JSON.stringify(card) } });
  440. }
  441. };
  442. const farmName = ref("")
  443. //用户果园数据
  444. const userFarmData = ref([]);
  445. const initUserGardenData = () => {
  446. VE_API.garden.userGarden({ userId: miniUserId, show3dFarm: false }).then(({ data }) => {
  447. userFarmData.value = data;
  448. const arr = data.filter(item =>item.organId===farmId.value)
  449. farmName.value = arr[0].organId
  450. });
  451. };
  452. function addNsRecord(){
  453. router.push({
  454. path: "/edit_ns_record",
  455. query: { recordId: null },
  456. });
  457. }
  458. </script>
  459. <style lang="scss" scoped>
  460. .album-page {
  461. position: relative;
  462. width: 100%;
  463. height: 100%;
  464. overflow: hidden;
  465. background: #011217;
  466. .album-wrap {
  467. width: 100%;
  468. height: 100%;
  469. .slot-right {
  470. width: 70%;
  471. cursor: pointer;
  472. display: flex;
  473. flex-direction: row;
  474. justify-content: right;
  475. align-items: center;
  476. padding-right: 12px;
  477. .btn {
  478. cursor: pointer;
  479. background: url("@/assets/img/tabs_btn3.png") no-repeat center center /
  480. 100% 100%;
  481. margin-right: 5px;
  482. color: rgba(180,255,251,.8);
  483. font-weight: bold;
  484. font-size: 15px;
  485. width: 92px;
  486. height: 32px;
  487. text-align: center;
  488. line-height: 32px;
  489. }
  490. }
  491. .barrage-title {
  492. height: 44px;
  493. line-height: 44px;
  494. text-align: center;
  495. font-size: 17px;
  496. font-weight: bold;
  497. border: 1px solid #f5f5f5;
  498. width: 100%;
  499. background: #fff;
  500. position: fixed;
  501. top: 0;
  502. left: 0;
  503. z-index: 9;
  504. .title-icon {
  505. cursor: pointer;
  506. position: absolute;
  507. left: 16px;
  508. top: 13px;
  509. }
  510. }
  511. .album-content {
  512. height: 100%;
  513. // overflow: auto;
  514. // margin-top: 45px;
  515. .album-fixed {
  516. position: fixed;
  517. top: 0;
  518. z-index: 10;
  519. background: #fff;
  520. width: 100%;
  521. }
  522. .album-top {
  523. display: flex;
  524. padding: 12px 10px 16px 10px;
  525. width: 100%;
  526. overflow: hidden;
  527. box-sizing: border-box;
  528. .album-img {
  529. img {
  530. width: 78px;
  531. height: 78px;
  532. object-fit: cover;
  533. border-radius: 6px;
  534. }
  535. }
  536. .garden-content {
  537. position: relative;
  538. padding-left: 12px;
  539. display: flex;
  540. flex-direction: column;
  541. justify-content: center;
  542. .report_btn{
  543. position: absolute;
  544. bottom: 0px;
  545. right: 0px;
  546. z-index: 1000;
  547. width: 40px;
  548. height: 40px;
  549. display: flex;
  550. flex-direction: column;
  551. align-items: center;
  552. justify-content: center;
  553. font-size: 8px;
  554. color:#ffffff;
  555. background: rgba(30, 34, 83, 0.44);
  556. border-radius: 5px;
  557. }
  558. .garden-name {
  559. font-weight: bold;
  560. font-size: 16px;
  561. color: #000000;
  562. display: flex;
  563. align-items: center;
  564. flex-wrap: wrap;
  565. .tag-wrap {
  566. display: flex;
  567. flex-wrap: wrap;
  568. flex: 1;
  569. }
  570. .type-tag {
  571. margin-top: 2px;
  572. font-weight: normal;
  573. margin-left: 4px;
  574. padding: 0 6px;
  575. height: 21px;
  576. line-height: 21px;
  577. background: rgba(255, 149, 61, 0.32);
  578. border-radius: 2px;
  579. // border: 0.5px solid #FF953D;
  580. font-size: 12px;
  581. color: #fc8a2c;
  582. &.item-type {
  583. background: #f0e0fe;
  584. color: #ac4dff;
  585. }
  586. }
  587. }
  588. .garden-text {
  589. display: flex;
  590. align-items: flex-end;
  591. justify-content: space-between;
  592. .edit-btn {
  593. border: 1px solid #F0AC37;
  594. border-radius: 5px;
  595. color: #F0AC37;
  596. text-align: center;
  597. padding: 4px 2px;
  598. font-size: 9px;
  599. font-weight: bold;
  600. box-sizing: border-box;
  601. background: rgba(33, 153, 248, 0.22);
  602. }
  603. }
  604. .garden-desc {
  605. padding-top: 4px;
  606. font-size: 13px;
  607. color: #666666;
  608. }
  609. }
  610. }
  611. .album-camera {
  612. width: 100%;
  613. padding: 0 10px 10px;
  614. box-sizing: border-box;
  615. position: relative;
  616. .tips-text {
  617. position: absolute;
  618. left: calc(50% + 20px);
  619. top: 8px;
  620. height: 17px;
  621. padding: 1px 5px 2px 8px;
  622. color: #fff;
  623. font-size: 12px;
  624. border-radius: 24px 20px 20px 0;
  625. line-height: 18px;
  626. background: linear-gradient(45deg, #00d4ff, #008eff);
  627. }
  628. img {
  629. width: 100%;
  630. }
  631. }
  632. .album-bottom {
  633. display: flex;
  634. // height: calc(100% - 106px);
  635. position: relative;
  636. background: rgba(73, 73, 73, 0.3);
  637. height: 100%;
  638. overflow: hidden;
  639. .export-btn {
  640. position: fixed;
  641. z-index: 999;
  642. left: 0;
  643. bottom: 0px;
  644. height: 60px;
  645. padding-top: 10px;
  646. background: #f2f2f4;
  647. .btn-item {
  648. font-size: 14px;
  649. color: #fff;
  650. display: flex;
  651. align-items: center;
  652. justify-content: center;
  653. background: linear-gradient(45deg, #00d4ff, #008eff);
  654. width: 90px;
  655. height: 36px;
  656. }
  657. img {
  658. width: 24px;
  659. }
  660. }
  661. .album-l {
  662. width: 90px;
  663. height: 100%;
  664. overflow: auto;
  665. background: rgba(73, 73, 73, 0.31);
  666. border-radius: 0 4px 4px 0;
  667. .menu-icon {
  668. width: 16px;
  669. margin-right: 4px;
  670. }
  671. .menu-name {
  672. max-width: 80px;
  673. white-space: nowrap;
  674. overflow: hidden;
  675. text-overflow: ellipsis;
  676. }
  677. ::v-deep {
  678. .el-menu {
  679. background: transparent;
  680. border-right: 0;
  681. .el-menu-item {
  682. height: 32px;
  683. line-height: 32px;
  684. justify-content: center;
  685. color: #CECECE;
  686. margin: 10px 0;
  687. padding: 4px;
  688. &:hover {
  689. background: none;
  690. }
  691. &.is-active {
  692. background: transparent;
  693. color: #F0AC37;
  694. .menu-name {
  695. // color: #666666;
  696. }
  697. }
  698. &.active {
  699. background: #232323;
  700. color: #F0AC37;
  701. .menu-name {
  702. color: #F0AC37;
  703. }
  704. }
  705. }
  706. }
  707. }
  708. .noTime {
  709. // color: #cccccc;
  710. }
  711. .now {
  712. color: rgba(33, 153, 248, 1);
  713. }
  714. .onTime {
  715. color: rgba(255, 212, 137, 0.6);
  716. }
  717. }
  718. ::v-deep {
  719. .el-affix {
  720. background: transparent;
  721. border-radius: 0 4px 4px 0;
  722. width: 90px !important;
  723. & > div {
  724. height: 100%;
  725. }
  726. }
  727. }
  728. .album-r {
  729. padding: 2px 10px 10px 10px;
  730. flex: 1;
  731. background: #232323;
  732. height: 100%;
  733. overflow: auto;
  734. .common-btn {
  735. background: #F0AC37;
  736. border-radius: 4px;
  737. color: #fff;
  738. padding: 8px 10px;
  739. text-align: center;
  740. }
  741. .card-wrap {
  742. border: 1px solid #dddddd;
  743. border-radius: 8px;
  744. padding: 8px 8px;
  745. position: relative;
  746. z-index: 1;
  747. // margin-top: -20px;
  748. &.noCarousel {
  749. padding: 0;
  750. // margin-top: 12px;
  751. // padding-top: 10px;
  752. border: none;
  753. .card-top .card-link {
  754. top: 24px;
  755. }
  756. }
  757. &.done {
  758. padding: 0;
  759. border: none;
  760. }
  761. }
  762. .card-content {
  763. // background: #001917;
  764. border-radius: 8px;
  765. padding: 0 8px 8px 8px;
  766. border: 1px solid rgba(255, 218, 102, 0.3);
  767. background: rgba(105, 73, 13, 0.1);
  768. &.push {
  769. padding: 0 8px 12px 8px;
  770. // margin-bottom: 8px;
  771. // border: 1px solid rgba(102, 102, 102, 0.38);
  772. }
  773. &.hasBg {
  774. border: 1px solid #494949;
  775. padding: 0 8px 12px 8px;
  776. background: transparent;
  777. // border: 1px solid #045151;
  778. .card-top {
  779. border-bottom: none;
  780. padding-bottom: 0;
  781. }
  782. }
  783. .card-top {
  784. padding-bottom: 12px;
  785. // border-bottom: 1px solid rgba(255, 238, 208, 0.2);
  786. position: relative;
  787. &.noChart {
  788. border-bottom: 0;
  789. padding-bottom: 0;
  790. }
  791. .card-title {
  792. display: flex;
  793. align-items: center;
  794. padding-bottom: 8px;
  795. .serve-btn {
  796. padding: 3px 10px;
  797. background: #F0AC37;
  798. border-radius: 22px;
  799. color: #fff;
  800. text-align: center;
  801. }
  802. .title-name {
  803. color: #FFFFFF;
  804. font-size: 20px;
  805. padding-right: 8px;
  806. font-weight: 600;
  807. }
  808. img {
  809. width: 24px;
  810. }
  811. .status-tag {
  812. color: #f3a302;
  813. font-size: 12px;
  814. padding: 2px 6px;
  815. border-radius: 2px;
  816. background: rgba(243, 163, 2, 0.2);
  817. border: 1px solid transparent;
  818. &.blue {
  819. color: #F0AC37;
  820. background: rgba(33, 153, 248, 0.2);
  821. }
  822. &.good-wrap {
  823. margin-left: 4px;
  824. display: flex;
  825. align-items: center;
  826. .good {
  827. margin-left: 3px;
  828. width: 13px;
  829. }
  830. }
  831. &.standard {
  832. color: #F0AC37;
  833. background: #232323;
  834. border-color: #F0AC37;
  835. }
  836. &.advice {
  837. color: rgba(252, 167, 3, 0.9);
  838. background: rgba(255, 220, 104, 0.38);
  839. }
  840. &.warning {
  841. color: #ff4221;
  842. background: rgba(255, 175, 160, 0.24);
  843. }
  844. }
  845. &.serve-title {
  846. padding: 12px 0 8px 0;
  847. display: flex;
  848. align-items: center;
  849. position: relative;
  850. .add-btn {
  851. position: absolute;
  852. right: -8px;
  853. top: 0;
  854. background: #F7BE5A;
  855. color: #fff;
  856. font-size: 12px;
  857. border-radius: 0 8px 0 8px;
  858. padding: 2px 6px;
  859. &.unactive {
  860. color: #9F9F9F;
  861. background: #494949;
  862. }
  863. &.recheck {
  864. background: #f3c11d;
  865. }
  866. }
  867. .tag {
  868. display: flex;
  869. align-items: center;
  870. color: #ff7000;
  871. font-size: 10px;
  872. .desc {
  873. position: relative;
  874. left: -4px;
  875. }
  876. .photo-grid {
  877. display: flex;
  878. .photo {
  879. position: relative;
  880. img {
  881. width: 18px; /* 示例宽度,你可以根据需要调整 */
  882. height: 18px;
  883. object-fit: cover;
  884. border-radius: 50%;
  885. display: block; /* 去除图片底部的空白间隙 */
  886. }
  887. }
  888. }
  889. }
  890. }
  891. }
  892. .card-desc {
  893. color: #9F9F9F;
  894. font-size: 12px;
  895. line-height: 18.2px;
  896. .desc-title {
  897. color: #494949;
  898. }
  899. .rescription-wrap {
  900. display: flex;
  901. align-items: center;
  902. .detail-text {
  903. color: #FFD489;
  904. padding-left: 6px;
  905. }
  906. }
  907. .rescription {
  908. max-width: 100px;
  909. white-space: nowrap;
  910. overflow: hidden;
  911. text-overflow: ellipsis;
  912. }
  913. .expert-link {
  914. display: inline-flex;
  915. align-items: center;
  916. color: #F0AC37;
  917. .icon {
  918. padding-left: 4px;
  919. }
  920. }
  921. }
  922. .step-box {
  923. position: absolute;
  924. right: 0px;
  925. top: 32px;
  926. }
  927. .card-link {
  928. display: flex;
  929. flex-direction: column;
  930. align-items: center;
  931. justify-content: center;
  932. color: #A46700;
  933. font-size: 12px;
  934. position: absolute;
  935. right: 6px;
  936. top: 20px;
  937. .expert-name {
  938. background: #FFD489;
  939. border-radius: 4px;
  940. padding: 2px 6px 3px 10px;
  941. margin-top: 4px;
  942. display: flex;
  943. align-items: center;
  944. }
  945. img {
  946. width: 64px;
  947. }
  948. .icon {
  949. padding-right: 2px;
  950. }
  951. }
  952. }
  953. .card-chart {
  954. padding: 8px 4px 0 4px;
  955. height: 130px;
  956. border-top: 1px solid rgba(255, 238, 208, 0.2);
  957. }
  958. }
  959. .done-card {
  960. margin-bottom: 10px;
  961. }
  962. .card-dom {
  963. position: relative;
  964. // top: -216px;
  965. top: -6px;
  966. }
  967. .over-img {
  968. transition: all 0.2s ease-in-out;
  969. position: relative;
  970. z-index: 2;
  971. ::v-deep {
  972. img {
  973. border-radius: 8px;
  974. }
  975. }
  976. }
  977. .log-wrap {
  978. padding: 4px 0 10px 0;
  979. .log-box {
  980. background: #232323;
  981. border-radius: 8px;
  982. color: #FFD489;
  983. border: 1px solid rgba(255, 212, 137, 0.3);
  984. .log-title {
  985. font-family: "PangMenZhengDao";
  986. position: relative;
  987. top: -4px;
  988. background: url("@/assets/img/gallery/log-bg.png") no-repeat top center / cover;
  989. width: 97px;
  990. height: 42px;
  991. text-align: center;
  992. font-size: 18px;
  993. color: #fff;
  994. span {
  995. position: absolute;
  996. top: 7px;
  997. display: flex;
  998. align-items: center;
  999. justify-content: center;
  1000. width: 100%;
  1001. }
  1002. }
  1003. .log-content {
  1004. padding-bottom: 10px;
  1005. .log-desc {
  1006. padding: 0 10px;
  1007. font-size: 14px;
  1008. line-height: 22px;
  1009. }
  1010. }
  1011. .time-img {
  1012. width: 100%;
  1013. height: 100%;
  1014. img {
  1015. width: 100%;
  1016. }
  1017. }
  1018. }
  1019. }
  1020. }
  1021. }
  1022. .flashing {
  1023. position: relative;
  1024. &::after {
  1025. content: "";
  1026. position: absolute;
  1027. top: 0;
  1028. left: -2px;
  1029. width: 100%;
  1030. height: calc(100% - 2px);
  1031. border: 2px solid #F0AC37;
  1032. animation: flash 0.4s infinite alternate;
  1033. border-radius: 8px;
  1034. pointer-events: none;
  1035. }
  1036. }
  1037. @keyframes flash {
  1038. 0% {
  1039. box-shadow: 0 0 5px #F0AC37;
  1040. border-color: #F0AC37;
  1041. }
  1042. 100% {
  1043. box-shadow: 0 0 20px #F0AC37;
  1044. border: 2px solid #F0AC37;
  1045. }
  1046. }
  1047. }
  1048. .evaluate {
  1049. border-top: 1px solid rgba(255, 238, 208, 0.2);
  1050. color: #fff;
  1051. .evaluate-title {
  1052. padding-top: 8px;
  1053. font-size: 14px;
  1054. color: #fff;
  1055. display: flex;
  1056. align-items: center;
  1057. justify-content: space-between;
  1058. margin-bottom: 8px;
  1059. .more {
  1060. font-size: 14px;
  1061. color: #fff;
  1062. font-weight: 400;
  1063. display: flex;
  1064. align-items: center;
  1065. }
  1066. }
  1067. .rate {
  1068. display: flex;
  1069. justify-content: space-between;
  1070. ::v-deep {
  1071. .el-rate {
  1072. --el-rate-icon-margin: 0;
  1073. }
  1074. .el-rate--small .el-rate__icon {
  1075. font-size: 11px;
  1076. }
  1077. }
  1078. .rate-item {
  1079. display: flex;
  1080. align-items: center;
  1081. // background: #f5f5f5;
  1082. border-radius: 4px;
  1083. padding: 4px 0px;
  1084. font-size: 10px;
  1085. .name {
  1086. // margin-right: 2px;
  1087. color: #fff;
  1088. }
  1089. .num {
  1090. color: #f3c11d;
  1091. margin-left: 2px;
  1092. }
  1093. }
  1094. }
  1095. .comment {
  1096. margin-top: 12px;
  1097. .user-info {
  1098. display: flex;
  1099. align-items: center;
  1100. margin-bottom: 2px;
  1101. .user-name {
  1102. font-weight: 500;
  1103. margin-left: 8px;
  1104. span {
  1105. font-weight: 400;
  1106. font-size: 12px;
  1107. color: #fff;
  1108. }
  1109. }
  1110. }
  1111. }
  1112. }
  1113. }
  1114. }
  1115. </style>