From ee213bf458d3961a0560ce3b68a3ad38322ece97 Mon Sep 17 00:00:00 2001
From: 杨磊 <505174330@qq.com>
Date: 星期一, 25 八月 2025 01:15:06 +0800
Subject: [PATCH] Merge branch 'master' of http://182.92.203.7:2001/r/xiehe_website

---
 src/views/bookStore/detail.vue | 1107 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 1,107 insertions(+), 0 deletions(-)

diff --git a/src/views/bookStore/detail.vue b/src/views/bookStore/detail.vue
new file mode 100644
index 0000000..aed3219
--- /dev/null
+++ b/src/views/bookStore/detail.vue
@@ -0,0 +1,1107 @@
+<template>
+  <div class="homePage">
+    <div class="infoBox">
+      <div class="contentBox">
+        <div class="crumbs">
+          <el-breadcrumb separator-class="el-icon-arrow-right">
+            <el-breadcrumb-item :to="{ name: 'bookStore' }">鏁板瓧鏁欐潗</el-breadcrumb-item>
+            <el-breadcrumb-item>璇︽儏</el-breadcrumb-item>
+          </el-breadcrumb>
+        </div>
+        <div class="infoTag" v-if="bookInfo.projectTitle">
+          <el-tooltip
+            class="item"
+            effect="dark"
+            :content="bookInfo.projectTitle"
+            placement="top-start"
+          >
+            <div class="tagText">
+              {{ bookInfo.projectTitle }}
+            </div>
+          </el-tooltip>
+        </div>
+        <div class="bookDetail" v-loading="loading">
+          <div class="bookImg">
+            <img class="autoImg" :src="bookInfo.icon ? bookInfo.icon : defaultImg" alt="" />
+          </div>
+          <span class="iconfont icon-tubiaozhizuo"></span>
+
+          <div class="detailBox">
+            <div class="bookTitle">
+              <div class="bookName" :title="bookInfo.name">
+                {{ bookInfo.name }}
+              </div>
+              <div class="bookTag" :title="bookInfo.seriesName">
+                {{ bookInfo.seriesName }}
+              </div>
+              <div class="collectBox">
+                <div class="collectText" @click="collectBook" v-if="bookInfo.isFavourite">
+                  宸叉敹钘�
+                </div>
+                <img
+                  @click="collectBook"
+                  v-if="bookInfo.isFavourite"
+                  class="buyIcon"
+                  src="@/assets/images/xiehe/detail/Collection_fill.png"
+                  style="margin-right: 10px"
+                />
+                <span v-else class="iconfont icon-shoucang" style="margin-right: 10px"> </span>
+
+                <div class="collectText" @click="collectBook" v-else>
+                  鏀惰棌
+
+                  <img
+                    class="buyIcon"
+                    src="@/assets/images/xiehe/detail/Collection.png"
+                    style="margin-right: 10px"
+                  />
+                </div>
+              </div>
+            </div>
+            <div class="authorBox">
+              <div class="titleBox1">
+                <div>浣滆�咃細</div>
+                <div>鍑虹増鏃堕棿锛�</div>
+              </div>
+              <div class="valueBox">
+                <div>
+                  {{ bookInfo.author ? bookInfo.author : '-' }}
+                </div>
+                <div>
+                  {{
+                    bookInfo.publicationDate
+                      ? moment(bookInfo.publicationDate).format('YYYY-MM-DD')
+                      : '-'
+                  }}
+                </div>
+              </div>
+              <div class="titleBox1" style="margin-left: 30px">
+                <div>ISBN锛�</div>
+                <div>鐗堟锛�</div>
+              </div>
+              <div class="valueBox">
+                <div>
+                  {{ bookInfo.isbn ? bookInfo.isbn : '-' }}
+                </div>
+                <div>
+                  {{ bookInfo.pubNumber ? bookInfo.pubNumber : '-' }}
+                </div>
+              </div>
+            </div>
+            <div class="authorBox" style="box-sizing: border-box">
+              <div class="titleBox1">
+                <div>鍒嗙被锛�</div>
+              </div>
+              <div class="valueBox">
+                <div>鍏ㄥ浗楂樼瓑鑱屼笟鏁欒偛棰勯槻鍖诲涓撲笟瑙勫垝鏁欐潗</div>
+              </div>
+            </div>
+            <div class="purchaseBox">
+              <div class="priceBox">
+                <span v-if="bookInfo.price && bookInfo.price > 0">
+                  <span>鏁板瓧鏁欐潗</span><span>锟�</span> <span>{{ bookInfo.price || '-' }}</span
+                  ><span v-if="bookInfo.VirtualPrice">鍘熶环锛氾骏{{ bookInfo.VirtualPrice }}</span>
+                </span>
+
+                <span class="price" v-else>
+                  <span class="freePrice">鍏嶈垂</span>
+                </span>
+              </div>
+              <div
+                class="buyInfo"
+                v-if="
+                  (currentRoute !== 'teachingServices' && bookInfo.paperBookDD) ||
+                  bookInfo.paperBookJD ||
+                  bookInfo.paperBookTmall
+                "
+              >
+                绾歌川涔﹀叾浠栬喘涔版笭閬擄細
+                <span @click="toJDLink" v-if="bookInfo.paperBookJD">
+                  <img class="buyIcon" src="@/assets/images/bookStore/浜笢icon-01.svg" />浜笢</span
+                >
+                <span @click="toDDLink" v-if="bookInfo.paperBookDD"
+                  ><img class="buyIcon" src="@/assets/images/bookStore/褰撳綋缃�.svg" />褰撳綋</span
+                >
+                <span @click="toTmLink" v-if="bookInfo.paperBookTmall"
+                  ><img
+                    class="buyIcon"
+                    src="@/assets/images/bookStore/tianmaologo2.svg"
+                  />澶╃尗</span
+                >
+              </div>
+            </div>
+            <div class="btnBox">
+              <el-button
+                v-if="
+                  currentRoute !== 'teachingServices' &&
+                  !bookInfo.alreadyBuy &&
+                  bookInfo.isSell &&
+                  bookInfo.isSell == '1'
+                "
+                type="primary"
+                :disabled="bookInfo.alreadyBuy"
+                @click="gotoOrder"
+                >鐢靛瓙涔﹁喘涔�</el-button
+              >
+              <el-button
+                v-if="bookInfo.pdfFreeFile && !bookInfo.alreadyBuy"
+                type="primary"
+                plain
+                style="min-width: 98px"
+                @click="previewBook"
+                >璇曡</el-button
+              >
+              <el-button
+                v-else-if="bookInfo.pdfFile && bookInfo.alreadyBuy"
+                type="primary"
+                plain
+                style="min-width: 98px"
+                @click="previewBook"
+                >绔嬪嵆闃呰</el-button
+              >
+              <el-button
+                v-if="currentRoute == 'teachingServices' && !bookInfo.alreadyBuy"
+                plain
+                @click="addEbook"
+                >鐢靛瓙鏍蜂功</el-button
+              >
+              <el-button v-if="currentRoute == 'teachingServices'" plain @click="addPaperBook"
+                >绾歌川鏍蜂功</el-button
+              >
+              <el-button
+                size="large"
+                type="primary"
+                @click="useCode"
+                v-if="!bookInfo.alreadyBuy && currentBook?.state !== 'Normal'"
+                >浣跨敤璐功鐮�</el-button
+              >
+              <el-button
+                style="background-color: #144941; color: #fff"
+                @click="applyTextBook"
+                size="large"
+                type="primary"
+                v-if="!bookInfo.alreadyBuy && currentBook?.state !== 'Normal'"
+                >鐢宠璇曠敤</el-button
+              >
+
+              <el-button
+                plain
+                size="large"
+                @click="read"
+                v-if="bookInfo.alreadyBuy || currentBook?.state == 'Normal'"
+                >寮�濮嬮槄璇�</el-button
+              >
+            </div>
+          </div>
+        </div>
+      </div>
+    </div>
+    <el-dialog v-model="buyBookCodeDialog" title="璐功" width="30%">
+      <div class="buyBookCode">
+        <div style="line-height: 30px">璐功鐮� 锛�</div>
+        <el-input style="width: 70%" v-model="activateCode" clearable />
+      </div>
+      <template #footer>
+        <span class="dialog-footer">
+          <el-button @click="buyBookCodeDialog = false">鍙栨秷</el-button>
+          <el-button type="primary" @click="userActiveCodeGet"> 婵�娲� </el-button>
+        </span>
+      </template>
+    </el-dialog>
+    <div class="detailContent contentBox">
+      <div class="resourceBox">
+        <div class="tabsBox">
+          <el-tabs v-model="editableTabsValue" type="card" class="demo-tabs">
+            <el-tab-pane
+              v-for="item in editableTabs"
+              :key="item.name"
+              :label="item.title"
+              :name="item.name"
+            >
+              {{ item.content }}
+            </el-tab-pane>
+          </el-tabs>
+        </div>
+        <div v-if="editableTabsValue == '1'" class="textbookInfo">
+          <div class="textbookInfoItem">
+            <div class="titleBorderBox">鍥句功绠�浠�</div>
+            <div class="textbookContent" v-if="bookInfo.content" v-html="bookInfo.content"></div>
+            <div v-else>
+              <el-empty description="鏆傛棤鏁版嵁" />
+            </div>
+          </div>
+          <div class="textbookInfoItem">
+            <div class="titleBorderBox">浣滆�呯畝浠�</div>
+            <div
+              class="authorInfo"
+              v-if="bookInfo.authorIntroduction"
+              v-html="bookInfo.authorIntroduction"
+            ></div>
+            <div v-else>
+              <el-empty description="鏆傛棤鏁版嵁" />
+            </div>
+          </div>
+        </div>
+        <div v-else-if="editableTabsValue == '2'" class="catalogue">
+          <div v-if="bookInfo.catalogue" v-html="bookInfo.catalogue" class="catalogueContent"></div>
+          <el-empty description="鏆傛棤鏁版嵁" v-else />
+        </div>
+        <div v-else-if="editableTabsValue == '6'" class="supportingResources">
+          <div class="resourcesBox">
+            <el-empty v-if="!resourceHave" :image-size="150" description="鏆傛棤鍐呭"></el-empty>
+            <div class="distribution" v-if="resourceHave">
+              <div class="titleBorderBox">璧勬簮鍒嗗竷</div>
+              <div class="echartsBox">
+                <div class="left">
+                  <div id="chartsContent" style="width: 600px; height: 400px"></div>
+                </div>
+                <div class="right">
+                  <div>
+                    <p>璧勬簮绉嶇被</p>
+                    <p>
+                      <span class="num">{{ resourceData.length }}</span
+                      >绉�
+                    </p>
+                  </div>
+                </div>
+              </div>
+            </div>
+          </div>
+        </div>
+        <div v-else class="catalogue"><el-empty description="鏆傛棤鏁版嵁" /></div>
+      </div>
+      <div class="recommendBox">
+        <div class="recommendTitle">鎺ㄨ崘鏁欐潗</div>
+        <div class="newRecommendList">
+          <div class="recommendItem" v-for="item in recommendBookListData" :key="item.id">
+            <div class="recommendItemImg">
+              <img class="autoImg" :src="item.icon" />
+            </div>
+            <div class="infoBox2">
+              <div class="bookName2">{{ item.name }}</div>
+              <div class="author2">
+                浣滆�咃細{{ item.authorcaupress_author ? item.caupress_author : '-' }}
+              </div>
+              <div class="priceBox2">
+                <span class="oldPrice" v-if="item.oldPrice">鍘熶环锛毬{ item.oldPrice }}</span>
+                <span class="price" v-if="item.price && item.price > 0">
+                  瀹氫环锛毬�
+                  <span>{{ item.price }}</span>
+                </span>
+                <span class="price" v-else> 瀹氫环锛�<span class="freePrice">鍏嶈垂</span> </span>
+              </div>
+            </div>
+          </div>
+        </div>
+      </div>
+    </div>
+    <teacherCertification :isShow="teacherDialog" @dialog-Change="dialogChange" />
+  </div>
+</template>
+
+<script setup>
+import moment from 'moment'
+import axios from 'axios'
+import * as echarts from 'echarts'
+import defaultImg from '@/assets/images/book-cover.png'
+import imgIcon from '@/assets/images/digitalTextbooks/img.png'
+import AudioIcon from '@/assets/images/digitalTextbooks/Audio.png'
+import DIcon from '@/assets/images/digitalTextbooks/3D.png'
+import PPTIcon from '@/assets/images/digitalTextbooks/PPT.png'
+import shijuanIcon from '@/assets/images/digitalTextbooks/shijuan.png'
+import shixunIcon from '@/assets/images/digitalTextbooks/shixun.png'
+import tuozhanIcon from '@/assets/images/digitalTextbooks/tuozhan.png'
+import videoIcon from '@/assets/images/digitalTextbooks/video.png'
+import VRIcon from '@/assets/images/digitalTextbooks/VR.png'
+import ziliaoIcon from '@/assets/images/digitalTextbooks/ziliao.png'
+import teacherCertification from '@/views/personalCenter/teacherCertification.vue'
+import { ElMessage, ElMessageBox } from 'element-plus'
+import { ref, onBeforeMount, inject, reactive, onMounted, watchEffect } from 'vue'
+const MG = inject('MG')
+const config = inject('config')
+const logIn = inject('logIn')
+import { useUserStore } from '@/store'
+const userStore = useUserStore()
+let teacherDialog = ref(false)
+
+import { useRouter, useRoute } from 'vue-router'
+import { applyBookStore } from '@/store'
+const route = useRoute()
+const router = useRouter()
+let bookInfo = ref({})
+let digitalTextId = ref('')
+let resourceData = ref([])
+let recommendBookListData = ref([])
+let editableTabsValue = ref('1')
+let activateCode = ref('')
+let resourceHave = ref(true)
+let currentBook = ref(null)
+let loading = ref(false)
+let buyBookCodeDialog = ref(false)
+var chartDom = null
+var myChart = {}
+var option = null
+
+const editableTabs = reactive([
+  {
+    title: '鏁欐潗淇℃伅',
+    name: '1',
+  },
+  {
+    title: '鐩綍',
+    name: '2',
+  },
+  {
+    title: '閰嶅璧勬簮',
+    name: '3',
+  },
+  {
+    title: '棰樺簱',
+    name: '4',
+  },
+  {
+    title: '鏁欏笀璧勬簮',
+    name: '5',
+  },
+  {
+    title: '璧勬簮缁熻',
+    name: '6',
+  },
+])
+
+onMounted(() => {
+  digitalTextId.value = route.query.bookId
+  getBookDetail(digitalTextId.value)
+  getRecommendBookList()
+  getTextBookList()
+})
+
+watchEffect(() => {
+  if (editableTabsValue.value == '6') {
+    getBookResource()
+  }
+})
+
+const getTextBookList = async () => {
+  const data = {
+    start: 0,
+    size: 9999,
+    topicIdOrRefCode: 'applyDigitalBook',
+    appRefCode: config.appRefCode,
+    sort: {
+      type: 'Desc',
+      field: 'CreateDate',
+    },
+  }
+  const res = await MG.ugc.getTopicMessageList(data)
+  if (res.datas && res.datas.length > 0) {
+    for (let i = 0; i < res.datas.length; i++) {
+      const item = res.datas[i]
+      item.content = JSON.parse(item.content)[0]
+      item.productId = item.content.id
+    }
+    currentBook.value = res.datas.find((item) => item.productId == digitalTextId.value)
+  }
+}
+
+const read = () => {
+  let token = localStorage.getItem(config.tokenKey)
+  const url = config.textBookResourceUrl + '?bookId=' + bookInfo.value.refCode + '&token=' + token
+  window.open(url)
+}
+
+const userActiveCodeGet = () => {
+  let lock = true
+  console.log(activateCode.value, 'activateCode.value')
+
+  if (activateCode.value == '') {
+    ElMessage({
+      type: 'error',
+      message: '璇疯緭鍏ユ縺娲荤爜锛�',
+    })
+  } else {
+    if (lock) {
+      lock = false
+
+      MG.store
+        .getActiveCode({
+          code: activateCode.value,
+        })
+        .then((res) => {
+          console.log(res, 'res')
+          const cfg = JSON.parse(res.config)
+          console.log(cfg, 'cfg')
+          if (cfg && cfg.length > 0) {
+            const isActive = cfg.findIndex((item) => item.id == digitalTextId.value)
+
+            if (isActive > -1) {
+              MG.store
+                .userActiveCode({
+                  code: activateCode.value,
+                })
+                .then((res) => {
+                  ElMessage({
+                    type: res == '婵�娲绘垚鍔�' ? 'success' : 'error',
+                    message: res,
+                  })
+                  activateCode.value = ''
+                  buyBookCodeDialog.value = false
+                  getBookDetail(digitalTextId.value)
+                  lock = true
+                })
+            } else {
+              ElMessage({
+                type: 'error',
+                message: '鎮ㄨ緭鍏ョ殑璐功鐮佹湁璇�',
+              })
+            }
+          } else {
+            ElMessage({
+              type: 'error',
+              message: '鎮ㄨ緭鍏ョ殑璐功鐮佹湁璇�',
+            })
+          }
+        })
+    }
+  }
+}
+
+const useCode = () => {
+  if (localStorage.getItem(config.tokenKey)) {
+    buyBookCodeDialog.value = true
+  } else {
+    logIn()
+  }
+}
+
+const dialogChange = (val) => {
+  if (val == false) {
+    teacherDialog.value = false
+  } else {
+    teacherDialog.value = true
+  }
+}
+
+//鏀惰棌涔︾睄
+const collectBook = () => {
+  if (localStorage.getItem(config.tokenKey)) {
+    if (bookInfo.value.isFavourite) {
+      MG.store
+        .delProductLink({
+          productIds: [bookInfo.value.id],
+          linkType: 'FavoriteBookCity',
+        })
+        .then(() => {
+          bookInfo.value.isFavourite = false
+        })
+    } else {
+      let params = {
+        productIds: [bookInfo.value.id],
+        linkType: 'FavoriteBookCity',
+      }
+      MG.store.addProductLink(params).then((res) => {
+        bookInfo.value.isFavourite = true
+      })
+    }
+  } else {
+    logIn()
+    console.log(logIn)
+  }
+}
+
+//鐢宠璇曠敤
+const applyTextBook = async () => {
+  if (currentBook.value?.state == 'WaitAudit') {
+    ElMessageBox.confirm('鎮ㄥ凡鐢宠璇曠敤璇ヤ功锛屾槸鍚﹀墠寰�鏌ョ湅', '鎻愮ず', {
+      confirmButtonText: '纭畾',
+      cancelButtonText: '鍙栨秷',
+      type: 'warning',
+    }).then(() => {
+      router.push({
+        path: '/myApply',
+      })
+    })
+  } else {
+    toApply()
+  }
+}
+
+const toApply = () => {
+  if (localStorage.getItem(config.tokenKey)) {
+    if (userStore.userInfo && userStore.userInfo.role == 'Teacher') {
+      localStorage.setItem('applyBookInfo', JSON.stringify(bookInfo.value))
+      router.push({
+        path: '/textBookApply',
+      })
+    } else {
+      teacherDialog.value = true
+    }
+  } else {
+    logIn()
+  }
+}
+
+const getRecommendBookList = () => {
+  MG.store
+    .getProductList({
+      path: 'recommendedTextbooks',
+      paging: {
+        start: 0,
+        size: 5,
+      },
+      fields: {
+        author: [],
+      },
+    })
+    .then((res) => {
+      console.log(res, '鎺ㄨ崘鏁欐潗')
+      recommendBookListData.value = res.datas
+    })
+}
+
+const getBookResource = () => {
+  try {
+    axios
+      .get('https://yxjy.pumcp.com/books/resource/' + bookInfo.value.refCode + '/resource.json')
+      .then(async (res) => {
+        console.log(res, 'resource')
+        if (res.data.length > 0) {
+          res.data.forEach((item) => {
+            if (item.resourceTypeShow == '鍥剧墖') {
+              item.icon = imgIcon
+            } else if (item.resourceTypeShow == '瑙嗛') {
+              item.icon = videoIcon
+            } else if (item.resourceTypeShow == '闊抽') {
+              item.icon = AudioIcon
+            } else if (item.resourceTypeShow == 'PPT') {
+              item.icon = PPTIcon
+            } else if (item.resourceTypeShow == '鎷撳睍') {
+              item.icon = tuozhanIcon
+            } else if (item.resourceTypeShow == '璧勬枡') {
+              item.icon = ziliaoIcon
+            } else if (item.resourceTypeShow == '璇曞嵎') {
+              item.icon = shijuanIcon
+            } else if (item.resourceTypeShow == '3D') {
+              item.icon = DIcon
+            } else if (item.resourceTypeShow == '瀹炶') {
+              item.icon = shixunIcon
+            } else if (item.resourceTypeShow == 'VR') {
+              item.icon = VRIcon
+            } else {
+              item.icon = ziliaoIcon
+            }
+          })
+          resourceData.value = await groupByResourceTypeShow(res.data)
+          resourceHave.value = true
+          console.log(resourceData.value, 'resourceData')
+          initChart(resourceData.value)
+        } else {
+          resourceHave.value = false
+        }
+      })
+      .catch((error) => {
+        console.log(error, 'error1')
+
+        resourceData = []
+        resourceHave = false
+      })
+  } catch (error) {
+    console.log(error, 'error')
+    resourceData = []
+    resourceHave = false
+  }
+}
+
+const groupByResourceTypeShow = (resources) => {
+  const grouped = resources.reduce((acc, item) => {
+    const key = item.resourceTypeShow
+    if (!acc[key]) {
+      acc[key] = {
+        resourceTypeShow: key,
+        list: [],
+      }
+    }
+    acc[key].list.push(item)
+    return acc
+  }, {})
+  return Object.values(grouped)
+}
+
+const initChart = (data) => {
+  let dataList = []
+  let num = []
+  data.forEach((item) => {
+    dataList.push(item.resourceTypeShow)
+    num.push(item.list.length)
+  })
+  chartDom = document.getElementById('chartsContent')
+  console.log(chartDom, 'chartDom')
+
+  myChart = echarts.init(chartDom)
+  myChart.setOption({
+    tooltip: {},
+    xAxis: {
+      data: dataList,
+    },
+    yAxis: {},
+    series: [
+      {
+        name: '鏁伴噺',
+        type: 'bar',
+        data: num,
+        itemStyle: {
+          color: function (params) {
+            // params.dataIndex鏄暟鎹」鐨勭储寮曪紝浣犲彲浠ユ牴鎹繖涓储寮曟潵璁剧疆涓嶅悓鐨勯鑹�
+            const colors = [
+              '#5EA1FF',
+              '#FF5A85',
+              '#7E7AFF',
+              '#3CB768',
+              '#FF8F54',
+              '#FF574B',
+              '#3DB0BF',
+              '#FBBB3B',
+              '#3B5EFB',
+              '#B1FB3B',
+            ]
+            return colors[params.dataIndex % colors.length]
+          },
+        },
+      },
+    ],
+  })
+}
+
+const getBookDetail = (id) => {
+  loading.value = true
+  const query = {
+    path: '*',
+    queryType: '*',
+    productId: id,
+    storeInfo: 'defaultGoodsStore1',
+    coverSize: {
+      height: 300,
+      width: 210,
+    },
+    fields: {
+      author: [],
+      isbn: [],
+      editionPrinting: [],
+      publicationDate: [],
+      content: [],
+      authorIntroduction: [],
+      catalogue: [],
+      probationPage: [],
+      teachingLevel: [],
+      professionalCategory: [],
+      executiveEditor: [],
+    },
+  }
+  MG.store.getProductDetail(query).then((res) => {
+    console.log(res, 'res')
+    bookInfo.value = res.datas
+    loading.value = false
+    console.log(res.datas, 'res')
+  })
+}
+</script>
+
+<style lang="less" scoped>
+.homePage {
+  min-width: 1220px;
+  min-height: calc(100vh - 61.8%);
+  background-color: #fff;
+  padding-bottom: 100px;
+}
+
+.infoBox {
+  width: 100%;
+  height: 530px;
+  padding-top: 10px;
+  background-color: #fff;
+  background-image: url('@/assets/images/xiehe/detail/details_bg.png');
+}
+.infoTag {
+  position: relative;
+  width: 0px;
+  height: 0px;
+  border-right: 20px solid #fff;
+  border-left: 503px solid #e50021;
+  border-top: 19px solid #e50021;
+  border-bottom: 19px solid #e50021;
+}
+.tagText {
+  position: absolute;
+  left: -480px;
+  top: -9.5px;
+  max-width: 480px;
+  text-overflow: ellipsis;
+  color: #fff;
+  font-size: 18px;
+  overflow: hidden;
+  white-space: nowrap;
+}
+.bookDetail {
+  display: flex;
+  overflow: hidden;
+  margin-top: 30px;
+}
+.bookImg {
+  position: relative;
+  width: 338px;
+  height: 400px;
+  box-shadow: 2px 2px 10px #f2f2f2;
+}
+.detailBox {
+  flex: 1;
+  height: 450px;
+  position: relative;
+  margin-top: 20px;
+  overflow: hidden;
+}
+.collectBox {
+  position: absolute;
+  right: 80px;
+  font-size: 14px;
+  color: #999999;
+  cursor: pointer;
+}
+
+.collectBox span:nth-child(1) {
+  margin-right: 10px;
+  font-size: 16px;
+}
+.collectBox span:nth-child(2) {
+  margin-left: 10px;
+  margin-right: 10px;
+
+  font-size: 16px;
+}
+.iconfont {
+  font-size: 25px !important;
+  vertical-align: middle;
+}
+.bookTitle {
+  width: 100%;
+  height: 40px;
+  line-height: 40px;
+  padding-left: 100px;
+  display: flex;
+  padding-right: 240px;
+  box-sizing: border-box;
+}
+.collectText {
+  font-size: 18px;
+  line-height: 18px;
+  display: inline-block;
+}
+.bookName {
+  flex: 1;
+  font-size: 26px;
+  color: #333;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+  overflow: hidden;
+}
+.bookTag {
+  max-width: 200px;
+  font-size: 16px;
+  color: #333;
+  line-height: 36px;
+  margin-left: 15px;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+  overflow: hidden;
+}
+.authorBox {
+  width: 80%;
+  display: flex;
+  padding: 20px;
+  padding-left: 100px;
+  position: relative;
+}
+.valueBox {
+  margin-left: 20px;
+}
+.valueBox div {
+  height: 30px;
+}
+.titleBox1 div {
+  height: 30px;
+}
+.relationBox {
+  position: absolute;
+  right: 50px;
+  color: #999;
+  cursor: pointer;
+  font-size: 14px;
+}
+.purchaseBox {
+  margin-left: 100px;
+  padding-top: 20px;
+}
+.priceBox {
+  border-bottom: 1px dashed #ececec;
+  background-color: #b2d9c8;
+  height: 50px;
+  line-height: 50px;
+  padding-left: 20px;
+}
+.priceBox span:nth-child(1) {
+  color: #000;
+  font-weight: 700;
+  font-size: 16px;
+  padding-right: 20px;
+}
+.priceBox span:nth-child(2) {
+  color: #e50021;
+  font-size: 16px;
+}
+.priceBox span:nth-child(3) {
+  color: #e50021;
+  font-size: 22px;
+  font-weight: 700;
+  padding-right: 20px;
+}
+.priceBox span:nth-child(4) {
+  color: #333;
+  font-size: 16px;
+  padding-right: 20px;
+  text-decoration: line-through;
+}
+.buyInfo {
+  padding: 20px 0px;
+  border-bottom: 1px dashed #ececec;
+  cursor: pointer;
+}
+.buyInfo img {
+  margin-left: 10px;
+}
+.btnBox {
+  margin-left: 100px;
+  margin-top: 30px;
+}
+.infoItem {
+  display: flex;
+  margin-top: 40px;
+}
+.infoImg {
+  width: 50px;
+  height: 50px;
+  border-radius: 50%;
+  border: 1px solid #ccc;
+  background: #efefef;
+  text-align: center;
+  line-height: 60px;
+  position: relative;
+}
+.infoImg i {
+  font-size: 28px;
+}
+.infoList {
+  margin-top: 20px;
+  overflow: auto;
+}
+.infoContent {
+  flex: 1;
+  overflow: hidden;
+  padding: 0 20px 0 10px;
+}
+.infoDialog {
+  padding: 20px;
+}
+.infoTitle {
+  width: 100%;
+  display: flex;
+  justify-content: space-between;
+}
+.infoText {
+  margin-top: 24px;
+  line-height: 20px;
+}
+.contactBox {
+  padding: 0px 40px;
+}
+.contacItem {
+  margin-top: 20px;
+}
+.contacIcon {
+  padding-right: 20px;
+}
+.subBtn {
+  margin-top: 20px;
+  text-align: right;
+}
+.buyIcon {
+  width: 24px;
+  height: 24px;
+  vertical-align: middle;
+}
+.crumbs {
+  margin-top: 10px;
+  border-bottom: 1px solid rgba(20, 73, 65, 0.26);
+  padding-bottom: 20px;
+}
+
+.detailContent {
+  margin-top: 30px;
+  display: flex;
+  justify-content: space-between;
+  .resourceBox {
+    width: 76%;
+  }
+  .textbookInfo {
+    padding: 20px 0;
+  }
+}
+.titleBorderBox {
+  height: 30px;
+  line-height: 30px;
+  font-weight: 700;
+  border-left: 6px solid #019e58;
+  padding-left: 20px;
+  font-size: 18px;
+}
+.textbookInfoItem {
+  margin-top: 20px;
+}
+
+.distribution {
+  .title {
+    margin: 10px 0;
+    font-weight: bold;
+  }
+  .echartsBox {
+    height: 400px;
+    border-radius: 7px 7px 7px 7px;
+    border: 1px solid #e4e7ed;
+    display: flex;
+    justify-content: space-between;
+    margin-bottom: 20px;
+    margin-top: 20px;
+  }
+  .left {
+  }
+  .right {
+    background: rgba(64, 158, 255, 0.09);
+    display: flex;
+    align-items: center;
+    justify-content: center;
+    text-align: center;
+    width: 200px;
+    p {
+      line-height: 30px;
+    }
+    .num {
+      font-size: 18px;
+      font-weight: bold;
+    }
+  }
+  .list {
+    display: flex;
+    margin-bottom: 40px;
+    .listItem {
+      width: 100px;
+      display: block;
+      box-sizing: border-box;
+      .imgBox {
+        margin: 0 auto;
+        position: relative;
+        width: 80px;
+        height: 80px;
+      }
+      .bookInfo {
+        margin: 0;
+        overflow: hidden;
+        text-align: center;
+        .title {
+          color: #333;
+          margin: 10px 0;
+          white-space: nowrap;
+          text-overflow: ellipsis;
+          overflow: hidden;
+        }
+      }
+    }
+  }
+}
+
+.recommendBox {
+  width: 23%;
+  border: 1px solid #e4e7ed;
+  border-radius: 10px;
+  .recommendTitle {
+    height: 50px;
+    line-height: 50px;
+    padding-left: 20px;
+    border-bottom: 1px solid #e4e7ed;
+    color: #333333;
+    font-weight: 700;
+  }
+}
+
+.newRecommendList {
+  padding-top: 0;
+  display: flex;
+  flex-direction: column;
+  justify-content: center;
+  align-items: center;
+  .recommendItem {
+    margin-right: 20px;
+    height: 300px;
+    background-repeat: no-repeat;
+    background-size: 100% 100%;
+    cursor: pointer;
+    background-color: #fff;
+    padding-top: 10px;
+    margin-top: 10px;
+    &:last-child {
+      margin-right: 0;
+    }
+  }
+  .recommendItemImg {
+    width: 150px;
+    height: 200px;
+    position: relative;
+    margin: 0 auto;
+  }
+  .infoBox2 {
+    text-align: center;
+    margin-top: 10px;
+  }
+  .author2 {
+    margin-top: 10px;
+  }
+  .priceBox2 {
+    margin-top: 10px;
+    .oldPrice {
+      font-size: 16px;
+      color: #444444;
+      text-decoration: line-through;
+      margin-right: 20px;
+    }
+    .price {
+      span {
+        font-weight: bold;
+        font-size: 14px;
+      }
+    }
+  }
+}
+.textbookContent,
+.authorInfo {
+  margin-top: 20px;
+  line-height: 28px;
+}
+.buyBookCode {
+  width: 100%;
+  display: flex;
+  padding: 40px 10px;
+  text-align: center;
+  align-items: center;
+}
+.tab-name {
+  width: 100px;
+  height: 40px;
+}
+</style>

--
Gitblit v1.9.1