|
@@ -1,131 +1,157 @@
|
|
|
<template>
|
|
<template>
|
|
|
<div class="achievement-report-page">
|
|
<div class="achievement-report-page">
|
|
|
<custom-header name="生成成果报告"></custom-header>
|
|
<custom-header name="生成成果报告"></custom-header>
|
|
|
- <div ref="reportDom" class="report-content">
|
|
|
|
|
- <div class="report-header">
|
|
|
|
|
- <img class="header-book" src="@/assets/img/home/book.png" alt="">
|
|
|
|
|
- <div class="time-tag">2025.12.15</div>
|
|
|
|
|
- <div class="report-title">成果报告</div>
|
|
|
|
|
- <div class="report-info">
|
|
|
|
|
- <div class="info-item">
|
|
|
|
|
- <img class="info-icon" src="@/assets/img/home/nz.png" alt="">
|
|
|
|
|
- <span class="info-text">执行组织:大荔农资组织</span>
|
|
|
|
|
|
|
+ <div class="report-content-wrap" v-loading="loading">
|
|
|
|
|
+ <div class="report-content" ref="reportDom">
|
|
|
|
|
+ <img src="@/assets/img/home/qrcode.png" alt="" class="code-icon" />
|
|
|
|
|
+ <div class="report-header">
|
|
|
|
|
+ <img class="header-book" src="@/assets/img/home/book.png" alt="" />
|
|
|
|
|
+ <div class="time-tag">{{ workItem?.executeDate }}</div>
|
|
|
|
|
+ <div class="report-title">成果报告</div>
|
|
|
|
|
+ <div class="report-info">
|
|
|
|
|
+ <div class="info-item">
|
|
|
|
|
+ <img class="info-icon" src="@/assets/img/home/nz.png" alt="" />
|
|
|
|
|
+ <span class="info-text">执行组织:{{ workItem?.executeMain }}</span>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ <div class="info-item">
|
|
|
|
|
+ <img class="info-icon" src="@/assets/img/home/nz.png" alt="" />
|
|
|
|
|
+ <span class="info-text">服务农场:{{ workItem?.farmName }}</span>
|
|
|
|
|
+ </div>
|
|
|
</div>
|
|
</div>
|
|
|
- <div class="info-item">
|
|
|
|
|
- <img class="info-icon" src="@/assets/img/home/nz.png" alt="">
|
|
|
|
|
- <span class="info-text">服务农场:荔博园</span>
|
|
|
|
|
|
|
+ </div>
|
|
|
|
|
+
|
|
|
|
|
+ <div class="report-box">
|
|
|
|
|
+ <div class="report-box-item">
|
|
|
|
|
+ <div class="item-content">{{ workItem?.farmWorkName || "--" }}</div>
|
|
|
|
|
+ <div class="item-title">作业农事</div>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ <div class="report-box-item">
|
|
|
|
|
+ <div class="item-content">{{ formatArea(workItem?.area) || "--" }}</div>
|
|
|
|
|
+ <div class="item-title">作业面积</div>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ <div class="report-box-item">
|
|
|
|
|
+ <div class="item-content">{{ workItem?.reviewDate || "--" }}</div>
|
|
|
|
|
+ <div class="item-title">作业周期</div>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ <div class="report-box-item">
|
|
|
|
|
+ <div class="item-content">{{ workItem?.usageMode || "--" }}</div>
|
|
|
|
|
+ <div class="item-title">使用设备</div>
|
|
|
</div>
|
|
</div>
|
|
|
</div>
|
|
</div>
|
|
|
- </div>
|
|
|
|
|
|
|
|
|
|
- <div class="report-box">
|
|
|
|
|
- <div class="report-box-item" v-for="(item, index) in reportBoxList" :key="index">
|
|
|
|
|
- <div class="item-content">{{ item.content }}</div>
|
|
|
|
|
- <div class="item-title">{{ item.title }}</div>
|
|
|
|
|
|
|
+ <div class="report-box">
|
|
|
|
|
+ <div class="box-title">精准施治,智慧护航</div>
|
|
|
|
|
+ <div class="box-text">
|
|
|
|
|
+ 我们凭借时机精准的判断与定制化方案的核心能力,结合***高效产品与专业设备,病虫害防治率95%
|
|
|
|
|
+ ,落果减少30%
|
|
|
|
|
+ </div>
|
|
|
</div>
|
|
</div>
|
|
|
- </div>
|
|
|
|
|
|
|
|
|
|
- <div class="report-box">
|
|
|
|
|
- <div class="box-title">精准施治,智慧护航</div>
|
|
|
|
|
- <div class="box-text">
|
|
|
|
|
- 我们凭借时机精准的判断与定制化方案的核心能力,结合***高效产品与专业设备,病虫害防治率95% ,落果减少30%
|
|
|
|
|
|
|
+ <div class="report-excute" v-for="(item, index) in workItem?.executeEvidence" :key="index">
|
|
|
|
|
+ <!-- <album-carousel
|
|
|
|
|
+ :key="index"
|
|
|
|
|
+ labelText="执行照片"
|
|
|
|
|
+ :images="[item]"
|
|
|
|
|
+ ></album-carousel> -->
|
|
|
|
|
+ <div class="tag-label">执行照片</div>
|
|
|
|
|
+ <album-draw-box :isShowNum="0" :photo="item" :current="index" :index="index" :length="workItem?.executeEvidence?.length"></album-draw-box>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ <div class="report-excute">
|
|
|
|
|
+ <album-carousel
|
|
|
|
|
+ :key="93"
|
|
|
|
|
+ :isAchievementImgs="true"
|
|
|
|
|
+ :images="combinedReviewImages"
|
|
|
|
|
+ ></album-carousel>
|
|
|
</div>
|
|
</div>
|
|
|
</div>
|
|
</div>
|
|
|
|
|
|
|
|
- <div class="report-excute" v-for="(item, index) in executeViewImage" :key="index">
|
|
|
|
|
- <album-carousel
|
|
|
|
|
- :key="index"
|
|
|
|
|
- labelText="执行照片"
|
|
|
|
|
- :images="[item]"
|
|
|
|
|
- ></album-carousel>
|
|
|
|
|
- </div>
|
|
|
|
|
- <div class="report-excute">
|
|
|
|
|
- <!-- <album-carousel
|
|
|
|
|
- :key="2"
|
|
|
|
|
- labelText="执行照片"
|
|
|
|
|
- :images="executeViewImage2"
|
|
|
|
|
- ></album-carousel> -->
|
|
|
|
|
|
|
+ <div class="bottom-btn">
|
|
|
|
|
+ <div class="btn-item second" @click="handleDownload">保存图片</div>
|
|
|
|
|
+ <div class="btn-item primay">转发</div>
|
|
|
</div>
|
|
</div>
|
|
|
</div>
|
|
</div>
|
|
|
|
|
|
|
|
- <el-button class="download-btn" type="primary" @click="handleDownload">转发</el-button>
|
|
|
|
|
|
|
+ <!-- 组合照片(用于生成合成图片) -->
|
|
|
|
|
+ <div class="review-hide-box">
|
|
|
|
|
+ <div class="review-image" ref="reviewComboRef">
|
|
|
|
|
+ <div class="review-mask">
|
|
|
|
|
+ <div class="review-text">复核成效</div>
|
|
|
|
|
+ <div class="review-content">
|
|
|
|
|
+ 促进分蘖芽萌发、加快分蘖生长,同时补充氮素等关键养分,增强植株长势,为形成足够穗数、提高群体产量打基础。
|
|
|
|
|
+ </div>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ <div class="vs-wrap" v-if="workItem?.reviewImage && workItem?.reviewImage?.length">
|
|
|
|
|
+ <img src="@/assets/img/home/vs.png" alt="" />
|
|
|
|
|
+ </div>
|
|
|
|
|
+ <div class="review-image-item" v-if="workItem?.executeEvidence?.length">
|
|
|
|
|
+ <div class="review-image-item-title">复核照片</div>
|
|
|
|
|
+ <!-- <img
|
|
|
|
|
+ class="review-image-item-img left-img"
|
|
|
|
|
+ :src="base_img_url2 + triggerImg[triggerImg.length - 1].cloudFilename"
|
|
|
|
|
+ alt=""
|
|
|
|
|
+ /> -->
|
|
|
|
|
+ <img
|
|
|
|
|
+ class="review-image-item-img left-img"
|
|
|
|
|
+ :src="leftCoverImg"
|
|
|
|
|
+ style="width: 100%; height: 255px; display: block; image-rendering: auto"
|
|
|
|
|
+ />
|
|
|
|
|
+ </div>
|
|
|
|
|
+ <div class="review-image-item" v-if="workItem?.reviewImage?.length">
|
|
|
|
|
+ <!-- <img
|
|
|
|
|
+ class="review-image-item-img right-img"
|
|
|
|
|
+ :src="base_img_url2 + workItem.reviewImage[workItem.reviewImage.length - 1]"
|
|
|
|
|
+ alt=""
|
|
|
|
|
+ /> -->
|
|
|
|
|
+ <img
|
|
|
|
|
+ class="review-image-item-img right-img"
|
|
|
|
|
+ :src="rightCoverImg"
|
|
|
|
|
+ style="width: 100%; height: 255px; display: block; image-rendering: auto"
|
|
|
|
|
+ />
|
|
|
|
|
+ </div>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ </div>
|
|
|
</div>
|
|
</div>
|
|
|
</template>
|
|
</template>
|
|
|
|
|
|
|
|
<script setup>
|
|
<script setup>
|
|
|
import CustomHeader from "@/components/customHeader.vue";
|
|
import CustomHeader from "@/components/customHeader.vue";
|
|
|
import AlbumCarousel from "@/components/album_compoents/albumCarousel";
|
|
import AlbumCarousel from "@/components/album_compoents/albumCarousel";
|
|
|
-import { ref } from "vue";
|
|
|
|
|
|
|
+import { ref, onActivated, nextTick, watch } from "vue";
|
|
|
import html2canvas from "html2canvas";
|
|
import html2canvas from "html2canvas";
|
|
|
import { uploadBase64 } from "@/common/uploadImg";
|
|
import { uploadBase64 } from "@/common/uploadImg";
|
|
|
import { detectRuntimeEnvironment } from "@/common/commonFun";
|
|
import { detectRuntimeEnvironment } from "@/common/commonFun";
|
|
|
|
|
+import { useRoute } from "vue-router";
|
|
|
|
|
+import { base_img_url2 } from "@/api/config";
|
|
|
|
|
+import AlbumDrawBox from "@/components/album_compoents/albumDrawBox.vue";
|
|
|
|
|
|
|
|
-const reportBoxList = ref([
|
|
|
|
|
- {
|
|
|
|
|
- title: "作业农事",
|
|
|
|
|
- content: "梢期杀虫",
|
|
|
|
|
- },
|
|
|
|
|
- {
|
|
|
|
|
- title: "作业面积",
|
|
|
|
|
- content: "200亩",
|
|
|
|
|
- },
|
|
|
|
|
- {
|
|
|
|
|
- title: "作业周期",
|
|
|
|
|
- content: "2天",
|
|
|
|
|
- },
|
|
|
|
|
- {
|
|
|
|
|
- title: "使用设备",
|
|
|
|
|
- content: "无人机NI-7",
|
|
|
|
|
- },
|
|
|
|
|
-]);
|
|
|
|
|
-
|
|
|
|
|
-const executeViewImage = ref([
|
|
|
|
|
- {
|
|
|
|
|
- "address": "",
|
|
|
|
|
- "angle": "",
|
|
|
|
|
- "baseMap": "https://birdseye-img.sysuimars.com/birdseye-look-mini/base_map/v2/111594.jpg",
|
|
|
|
|
- "blueZoneId": null,
|
|
|
|
|
- "district": "东莞市",
|
|
|
|
|
-// "filename": "birdseye-look-mini/91429/1763371316207.jpg",
|
|
|
|
|
- "filename": "birdseye-look-mini/91429/1763461501781.png",
|
|
|
|
|
-// "filename": "3f27e127-6497-4175-8efb-ba18d703852b/b1f6d99e-826d-4468-a6dd-83f9e7a12ea3/DJI_202512131000_001_b1f6d99e-826d-4468-a6dd-83f9e7a12ea3/DJI_20251213100724_0070_V_code-ws0fsmghvf91.jpeg",
|
|
|
|
|
- "fosterCode": "LCGW-DGJH-GLY0253",
|
|
|
|
|
- "gardenId": null,
|
|
|
|
|
- "gardenName": "莞荔园",
|
|
|
|
|
- "growText": "当前进入冬梢。\n\n\n\n 暂无病虫害\n\n 暂无生长异常\n",
|
|
|
|
|
- "id": "787625848910909520",
|
|
|
|
|
- "localPath": "",
|
|
|
|
|
- "localResPath": "",
|
|
|
|
|
- "location": "POINT (113.746646 22.970229)",
|
|
|
|
|
- "miniUserId": null,
|
|
|
|
|
- "miniUserName": "",
|
|
|
|
|
- "modelId": null,
|
|
|
|
|
- "phenologyId": "18",
|
|
|
|
|
- "pingzhong": "",
|
|
|
|
|
- "planId": null,
|
|
|
|
|
- "regionId": null,
|
|
|
|
|
- "regionName": "2区",
|
|
|
|
|
- "resFilename": "",
|
|
|
|
|
- "shotCode": "",
|
|
|
|
|
- "source": "dji",
|
|
|
|
|
- "sourceCode": null,
|
|
|
|
|
- "status": null,
|
|
|
|
|
- "sysId": null,
|
|
|
|
|
- "treeCode": "莞荔园_M2_064",
|
|
|
|
|
- "treeGeoHash": "ws0fsmgq9uhp",
|
|
|
|
|
- "treeId": 111594,
|
|
|
|
|
- "uploadDate": "2025-12-13",
|
|
|
|
|
- "watermarkMsg": "",
|
|
|
|
|
- "watermarkUrl": "",
|
|
|
|
|
- "watermarks": [],
|
|
|
|
|
- "weather": null,
|
|
|
|
|
- "workspaceId": ""
|
|
|
|
|
-}
|
|
|
|
|
-]);
|
|
|
|
|
-
|
|
|
|
|
-const executeViewImage2 = ref(["birdseye-look-mini/91754/1763373487891.png"]);
|
|
|
|
|
|
|
+const route = useRoute();
|
|
|
|
|
+const loading = ref(false);
|
|
|
|
|
+const workItem = ref({});
|
|
|
|
|
|
|
|
|
|
+function formatArea(val) {
|
|
|
|
|
+ const num = typeof val === "number" ? val : parseFloat(val);
|
|
|
|
|
+ if (Number.isNaN(num)) return val;
|
|
|
|
|
+ return Number.isInteger(num) ? num : num.toFixed(2) + "亩";
|
|
|
|
|
+}
|
|
|
|
|
+const paramsPage = ref({});
|
|
|
|
|
+onActivated(() => {
|
|
|
|
|
+ window.scrollTo(0, 0);
|
|
|
|
|
+ paramsPage.value = route.query.miniJson ? JSON.parse(route.query.miniJson) : {};
|
|
|
|
|
+ getDetail();
|
|
|
|
|
+});
|
|
|
|
|
|
|
|
|
|
+const getDetail = () => {
|
|
|
|
|
+ if (!paramsPage.value.id) return;
|
|
|
|
|
+ loading.value = true;
|
|
|
|
|
+ VE_API.z_farm_work_record
|
|
|
|
|
+ .getDetail({ id: paramsPage.value.id })
|
|
|
|
|
+ .then(({ data }) => {
|
|
|
|
|
+ workItem.value = data[0];
|
|
|
|
|
+ })
|
|
|
|
|
+ .finally(() => {
|
|
|
|
|
+ loading.value = false;
|
|
|
|
|
+ });
|
|
|
|
|
+};
|
|
|
|
|
|
|
|
const isDowload = ref(true);
|
|
const isDowload = ref(true);
|
|
|
const reportDom = ref(null);
|
|
const reportDom = ref(null);
|
|
@@ -166,7 +192,7 @@ async function handleDownload() {
|
|
|
// }
|
|
// }
|
|
|
// });
|
|
// });
|
|
|
} else {
|
|
} else {
|
|
|
- downloadImage(image,'果园报告')
|
|
|
|
|
|
|
+ downloadImage(image, "果园报告");
|
|
|
}
|
|
}
|
|
|
isDowload.value = true;
|
|
isDowload.value = true;
|
|
|
} catch (error) {
|
|
} catch (error) {
|
|
@@ -183,6 +209,107 @@ function downloadImage(dataUrl, filename) {
|
|
|
link.click();
|
|
link.click();
|
|
|
document.body.removeChild(link);
|
|
document.body.removeChild(link);
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
|
|
+const reviewComboRef = ref(null);
|
|
|
|
|
+const combinedReviewImages = ref([]);
|
|
|
|
|
+// 生成组合照片,传给相册组件
|
|
|
|
|
+const generateCombinedReviewImage = async () => {
|
|
|
|
|
+ try {
|
|
|
|
|
+ await prepareCoverImages();
|
|
|
|
|
+ await nextTick();
|
|
|
|
|
+
|
|
|
|
|
+ const canvas = await html2canvas(reviewComboRef.value, {
|
|
|
|
|
+ backgroundColor: null,
|
|
|
|
|
+ useCORS: true,
|
|
|
|
|
+ allowTaint: true,
|
|
|
|
|
+ scale: window.devicePixelRatio || 2,
|
|
|
|
|
+ });
|
|
|
|
|
+
|
|
|
|
|
+ combinedReviewImages.value = [canvas.toDataURL("image/png")];
|
|
|
|
|
+ } catch (e) {
|
|
|
|
|
+ console.error("生成组合照片失败", e);
|
|
|
|
|
+ }
|
|
|
|
|
+};
|
|
|
|
|
+
|
|
|
|
|
+const prepareCoverImages = async () => {
|
|
|
|
|
+ await nextTick();
|
|
|
|
|
+
|
|
|
|
|
+ const itemEl = reviewComboRef.value.querySelector(".review-image-item");
|
|
|
|
|
+
|
|
|
|
|
+ const cssWidth = itemEl.offsetWidth;
|
|
|
|
|
+ const cssHeight = 255;
|
|
|
|
|
+
|
|
|
|
|
+ if (workItem.value?.executeEvidence?.length) {
|
|
|
|
|
+ leftCoverImg.value = await coverImageToBase64HD(
|
|
|
|
|
+ base_img_url2 + workItem.value.executeEvidence.at(-1),
|
|
|
|
|
+ cssWidth,
|
|
|
|
|
+ cssHeight
|
|
|
|
|
+ );
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ if (workItem.value?.reviewImage?.length) {
|
|
|
|
|
+ rightCoverImg.value = await coverImageToBase64HD(
|
|
|
|
|
+ base_img_url2 + workItem.value.reviewImage.at(-1),
|
|
|
|
|
+ cssWidth,
|
|
|
|
|
+ cssHeight
|
|
|
|
|
+ );
|
|
|
|
|
+ }
|
|
|
|
|
+};
|
|
|
|
|
+
|
|
|
|
|
+const leftCoverImg = ref("");
|
|
|
|
|
+const rightCoverImg = ref("");
|
|
|
|
|
+
|
|
|
|
|
+function coverImageToBase64HD(imgUrl, cssWidth, cssHeight) {
|
|
|
|
|
+ return new Promise((resolve, reject) => {
|
|
|
|
|
+ const dpr = window.devicePixelRatio || 2;
|
|
|
|
|
+
|
|
|
|
|
+ const img = new Image();
|
|
|
|
|
+ img.crossOrigin = "anonymous";
|
|
|
|
|
+ img.src = imgUrl;
|
|
|
|
|
+
|
|
|
|
|
+ img.onload = () => {
|
|
|
|
|
+ // ⚠️ 用“物理像素”创建 canvas
|
|
|
|
|
+ const canvas = document.createElement("canvas");
|
|
|
|
|
+ canvas.width = cssWidth * dpr;
|
|
|
|
|
+ canvas.height = cssHeight * dpr;
|
|
|
|
|
+
|
|
|
|
|
+ const ctx = canvas.getContext("2d");
|
|
|
|
|
+ ctx.scale(dpr, dpr);
|
|
|
|
|
+
|
|
|
|
|
+ const imgRatio = img.width / img.height;
|
|
|
|
|
+ const targetRatio = cssWidth / cssHeight;
|
|
|
|
|
+
|
|
|
|
|
+ let sx = 0,
|
|
|
|
|
+ sy = 0,
|
|
|
|
|
+ sw = img.width,
|
|
|
|
|
+ sh = img.height;
|
|
|
|
|
+
|
|
|
|
|
+ if (imgRatio > targetRatio) {
|
|
|
|
|
+ sw = img.height * targetRatio;
|
|
|
|
|
+ sx = (img.width - sw) / 2;
|
|
|
|
|
+ } else {
|
|
|
|
|
+ sh = img.width / targetRatio;
|
|
|
|
|
+ sy = (img.height - sh) / 2;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ ctx.drawImage(img, sx, sy, sw, sh, 0, 0, cssWidth, cssHeight);
|
|
|
|
|
+
|
|
|
|
|
+ resolve(canvas.toDataURL("image/png"));
|
|
|
|
|
+ };
|
|
|
|
|
+
|
|
|
|
|
+ img.onerror = reject;
|
|
|
|
|
+ });
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+watch(
|
|
|
|
|
+ () => [workItem.value.executeEvidence, workItem.value.reviewImage],
|
|
|
|
|
+ ([preImgs, reviewImgs]) => {
|
|
|
|
|
+ if (preImgs && preImgs.length && reviewImgs && reviewImgs.length) {
|
|
|
|
|
+ generateCombinedReviewImage();
|
|
|
|
|
+ }
|
|
|
|
|
+ },
|
|
|
|
|
+ { deep: true }
|
|
|
|
|
+);
|
|
|
</script>
|
|
</script>
|
|
|
|
|
|
|
|
<style lang="scss" scoped>
|
|
<style lang="scss" scoped>
|
|
@@ -192,25 +319,68 @@ function downloadImage(dataUrl, filename) {
|
|
|
background: linear-gradient(195.35deg, #d4e4ff 16.34%, rgba(93, 189, 255, 0) 50.3%),
|
|
background: linear-gradient(195.35deg, #d4e4ff 16.34%, rgba(93, 189, 255, 0) 50.3%),
|
|
|
linear-gradient(156.64deg, rgba(255, 255, 255, 0.16) 27.7%, rgba(255, 255, 255, 0) 72.82%);
|
|
linear-gradient(156.64deg, rgba(255, 255, 255, 0.16) 27.7%, rgba(255, 255, 255, 0) 72.82%);
|
|
|
|
|
|
|
|
|
|
+ .report-content-wrap {
|
|
|
|
|
+ height: calc(100% - 40px);
|
|
|
|
|
+ padding-bottom: 60px;
|
|
|
|
|
+ overflow: auto;
|
|
|
|
|
+ box-sizing: border-box;
|
|
|
|
|
+ position: relative;
|
|
|
|
|
+ .bottom-btn {
|
|
|
|
|
+ position: fixed;
|
|
|
|
|
+ bottom: 0;
|
|
|
|
|
+ left: 0;
|
|
|
|
|
+ width: 100%;
|
|
|
|
|
+ background: #fff;
|
|
|
|
|
+ height: 60px;
|
|
|
|
|
+ display: flex;
|
|
|
|
|
+ align-items: center;
|
|
|
|
|
+ justify-content: space-between;
|
|
|
|
|
+ padding: 0 12px;
|
|
|
|
|
+ box-sizing: border-box;
|
|
|
|
|
+ box-shadow: 2px 2px 4.5px 0px rgba(0, 0, 0, 0.4);
|
|
|
|
|
+ .btn-item {
|
|
|
|
|
+ height: 40px;
|
|
|
|
|
+ line-height: 40px;
|
|
|
|
|
+ padding: 0 24px;
|
|
|
|
|
+ border-radius: 20px;
|
|
|
|
|
+ font-size: 14px;
|
|
|
|
|
+ &.second {
|
|
|
|
|
+ color: #666666;
|
|
|
|
|
+ border: 1px solid rgba(153, 153, 153, 0.5);
|
|
|
|
|
+ }
|
|
|
|
|
+ &.primay {
|
|
|
|
|
+ padding: 0 34px;
|
|
|
|
|
+ background: linear-gradient(180deg, #76c3ff, #2199f8);
|
|
|
|
|
+ color: #fff;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ .code-icon {
|
|
|
|
|
+ position: absolute;
|
|
|
|
|
+ right: 10px;
|
|
|
|
|
+ top: 12px;
|
|
|
|
|
+ width: 48px;
|
|
|
|
|
+ }
|
|
|
.report-content {
|
|
.report-content {
|
|
|
background: url("@/assets/img/home/report_bg.png") no-repeat center center;
|
|
background: url("@/assets/img/home/report_bg.png") no-repeat center center;
|
|
|
background-size: 100% auto;
|
|
background-size: 100% auto;
|
|
|
background-position: top center;
|
|
background-position: top center;
|
|
|
- height: calc(100% - 40px);
|
|
|
|
|
- overflow: auto;
|
|
|
|
|
padding: 24px 16px 16px;
|
|
padding: 24px 16px 16px;
|
|
|
box-sizing: border-box;
|
|
box-sizing: border-box;
|
|
|
|
|
+ position: relative;
|
|
|
.report-header {
|
|
.report-header {
|
|
|
position: relative;
|
|
position: relative;
|
|
|
.header-book {
|
|
.header-book {
|
|
|
position: absolute;
|
|
position: absolute;
|
|
|
right: 0;
|
|
right: 0;
|
|
|
- top: 0;
|
|
|
|
|
- width: 160px;
|
|
|
|
|
- height: 160px;
|
|
|
|
|
|
|
+ bottom: -6px;
|
|
|
|
|
+ height: 88px;
|
|
|
|
|
+ z-index: 10;
|
|
|
}
|
|
}
|
|
|
.time-tag {
|
|
.time-tag {
|
|
|
- background: linear-gradient(137.86deg, #9FD5FF 5.87%, #2199F8 82.98%);
|
|
|
|
|
|
|
+ background: linear-gradient(137.86deg, #9fd5ff 5.87%, #2199f8 82.98%);
|
|
|
border-radius: 5px 0 5px 0;
|
|
border-radius: 5px 0 5px 0;
|
|
|
height: 23px;
|
|
height: 23px;
|
|
|
line-height: 23px;
|
|
line-height: 23px;
|
|
@@ -246,7 +416,7 @@ function downloadImage(dataUrl, filename) {
|
|
|
}
|
|
}
|
|
|
.info-text {
|
|
.info-text {
|
|
|
font-size: 14px;
|
|
font-size: 14px;
|
|
|
- color: #2199F8;
|
|
|
|
|
|
|
+ color: #2199f8;
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
.info-item + .info-item {
|
|
.info-item + .info-item {
|
|
@@ -259,8 +429,8 @@ function downloadImage(dataUrl, filename) {
|
|
|
display: flex;
|
|
display: flex;
|
|
|
align-items: center;
|
|
align-items: center;
|
|
|
padding: 8px;
|
|
padding: 8px;
|
|
|
- background: linear-gradient(0deg, #FFFFFF 86.32%, #2199F8 136.87%);
|
|
|
|
|
- border: 1px solid #FFFFFF;
|
|
|
|
|
|
|
+ background: linear-gradient(0deg, #ffffff 86.32%, #2199f8 136.87%);
|
|
|
|
|
+ border: 1px solid #ffffff;
|
|
|
border-radius: 8px;
|
|
border-radius: 8px;
|
|
|
gap: 5px;
|
|
gap: 5px;
|
|
|
position: relative;
|
|
position: relative;
|
|
@@ -270,7 +440,7 @@ function downloadImage(dataUrl, filename) {
|
|
|
background: rgba(33, 153, 248, 0.1);
|
|
background: rgba(33, 153, 248, 0.1);
|
|
|
border-radius: 8px;
|
|
border-radius: 8px;
|
|
|
.item-content {
|
|
.item-content {
|
|
|
- color: #2199F8;
|
|
|
|
|
|
|
+ color: #2199f8;
|
|
|
font-size: 14px;
|
|
font-size: 14px;
|
|
|
text-align: center;
|
|
text-align: center;
|
|
|
}
|
|
}
|
|
@@ -289,8 +459,8 @@ function downloadImage(dataUrl, filename) {
|
|
|
height: 32px;
|
|
height: 32px;
|
|
|
line-height: 26px;
|
|
line-height: 26px;
|
|
|
padding: 0 10px;
|
|
padding: 0 10px;
|
|
|
- color: #FFFFFF;
|
|
|
|
|
- background: url("@/assets/img/home/title-bg.png") no-repeat center center /100% 100%;
|
|
|
|
|
|
|
+ color: #ffffff;
|
|
|
|
|
+ background: url("@/assets/img/home/title-bg.png") no-repeat center center / 100% 100%;
|
|
|
}
|
|
}
|
|
|
.box-text {
|
|
.box-text {
|
|
|
padding: 22px 0 12px 0;
|
|
padding: 22px 0 12px 0;
|
|
@@ -300,7 +470,25 @@ function downloadImage(dataUrl, filename) {
|
|
|
margin-top: 20px;
|
|
margin-top: 20px;
|
|
|
}
|
|
}
|
|
|
.report-excute {
|
|
.report-excute {
|
|
|
|
|
+ position: relative;
|
|
|
margin-top: 12px;
|
|
margin-top: 12px;
|
|
|
|
|
+ .tag-label {
|
|
|
|
|
+ position: absolute;
|
|
|
|
|
+ top: 0;
|
|
|
|
|
+ left: 0;
|
|
|
|
|
+ padding: 4px 10px;
|
|
|
|
|
+ background: rgba(54, 52, 52, 0.8);
|
|
|
|
|
+ color: #fff;
|
|
|
|
|
+ font-size: 12px;
|
|
|
|
|
+ border-radius: 8px 0 8px 0;
|
|
|
|
|
+ z-index: 1;
|
|
|
|
|
+ }
|
|
|
|
|
+ ::v-deep {
|
|
|
|
|
+ .carousel-container .carousel-wrapper .carousel-img {
|
|
|
|
|
+ min-width: calc(100vw - 32px);
|
|
|
|
|
+ width: calc(100vw - 32px);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
.download-btn {
|
|
.download-btn {
|
|
@@ -312,5 +500,103 @@ function downloadImage(dataUrl, filename) {
|
|
|
// width: 100%;
|
|
// width: 100%;
|
|
|
transform: translateX(-50%);
|
|
transform: translateX(-50%);
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
|
|
+ .review-hide-box {
|
|
|
|
|
+ position: absolute;
|
|
|
|
|
+ left: 0;
|
|
|
|
|
+ width: 100%;
|
|
|
|
|
+ height: 100%;
|
|
|
|
|
+ z-index: -1;
|
|
|
|
|
+ bottom: 0;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ .review-image {
|
|
|
|
|
+ position: relative;
|
|
|
|
|
+ display: flex;
|
|
|
|
|
+ align-items: center;
|
|
|
|
|
+ justify-content: center;
|
|
|
|
|
+ gap: 8px;
|
|
|
|
|
+ margin: 12px;
|
|
|
|
|
+ background: #fff;
|
|
|
|
|
+ border-radius: 8px;
|
|
|
|
|
+ .review-mask {
|
|
|
|
|
+ z-index: 1;
|
|
|
|
|
+ pointer-events: none;
|
|
|
|
|
+ position: absolute;
|
|
|
|
|
+ left: 0;
|
|
|
|
|
+ top: 0;
|
|
|
|
|
+ width: 100%;
|
|
|
|
|
+ height: 100%;
|
|
|
|
|
+ border-radius: 8px;
|
|
|
|
|
+ background: linear-gradient(
|
|
|
|
|
+ 360deg,
|
|
|
|
|
+ rgba(0, 0, 0, 0.78) 0%,
|
|
|
|
|
+ rgba(0, 0, 0, 0.437208) 19.87%,
|
|
|
|
|
+ rgba(0, 0, 0, 0) 33.99%
|
|
|
|
|
+ );
|
|
|
|
|
+ display: flex;
|
|
|
|
|
+ flex-direction: column;
|
|
|
|
|
+ align-items: baseline;
|
|
|
|
|
+ justify-content: end;
|
|
|
|
|
+ padding: 12px;
|
|
|
|
|
+ box-sizing: border-box;
|
|
|
|
|
+ color: #fff;
|
|
|
|
|
+ .review-text {
|
|
|
|
|
+ font-family: "PangMenZhengDao";
|
|
|
|
|
+ font-size: 16px;
|
|
|
|
|
+ margin-bottom: 1px;
|
|
|
|
|
+ }
|
|
|
|
|
+ .review-content {
|
|
|
|
|
+ font-size: 10px;
|
|
|
|
|
+ line-height: 15px;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ .vs-wrap {
|
|
|
|
|
+ position: absolute;
|
|
|
|
|
+ left: 50%;
|
|
|
|
|
+ top: 50%;
|
|
|
|
|
+ transform: translate(-50%, -50%);
|
|
|
|
|
+ width: 40px;
|
|
|
|
|
+ height: 40px;
|
|
|
|
|
+ z-index: 10;
|
|
|
|
|
+ img {
|
|
|
|
|
+ width: 100%;
|
|
|
|
|
+ height: 100%;
|
|
|
|
|
+ object-fit: cover;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ .review-image-item {
|
|
|
|
|
+ position: relative;
|
|
|
|
|
+ flex: 1;
|
|
|
|
|
+ .review-image-item-title {
|
|
|
|
|
+ position: absolute;
|
|
|
|
|
+ top: 0;
|
|
|
|
|
+ left: 0;
|
|
|
|
|
+ background: rgba(54, 52, 52, 0.6);
|
|
|
|
|
+ padding: 4px 10px;
|
|
|
|
|
+ border-radius: 8px 0 8px 0;
|
|
|
|
|
+ backdrop-filter: 4px;
|
|
|
|
|
+ font-size: 12px;
|
|
|
|
|
+ color: #fff;
|
|
|
|
|
+ }
|
|
|
|
|
+ // .review-image-item-img {
|
|
|
|
|
+ // width: 100%;
|
|
|
|
|
+ // height: 250px;
|
|
|
|
|
+ // object-fit: cover;
|
|
|
|
|
+ // }
|
|
|
|
|
+ .review-image-item-img {
|
|
|
|
|
+ width: 100%;
|
|
|
|
|
+ height: 100%;
|
|
|
|
|
+ object-fit: cover;
|
|
|
|
|
+ object-position: center;
|
|
|
|
|
+ }
|
|
|
|
|
+ .left-img {
|
|
|
|
|
+ border-radius: 8px 0 0 8px;
|
|
|
|
|
+ }
|
|
|
|
|
+ .right-img {
|
|
|
|
|
+ border-radius: 0 8px 8px 0;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
</style>
|
|
</style>
|