Browse Source

金瑞报告详情修改

chenlei 1 month ago
parent
commit
3024acf4b2

+ 0 - 24
src/api/modules/chart.js

@@ -1,24 +0,0 @@
-import {get,post} from '@/api/index'
-
-export default{
-  // 获取图表详情
-  getChartDetail:params=>{
-    return get('/mychart/detail',params)
-  },
-  // 收藏图表
-  chartCollect:params=>{
-    return post('/mychart/collect',params)
-  },
-  // 取消收藏图表
-  chartCollectCancel:params=>{
-    return post('/mychart/collectCancel',params)
-  },
-  // 获取首页进入图表上一张下一张信息
-  commonChartLocate:()=>{
-    return get('/chart/locate',{})
-  },
-  // 获取收藏进入图表上一张下一张信息
-  myChartLocate:()=>{
-    return get('/mychart/locate',{})
-  }
-}

+ 1 - 38
src/api/modules/report.js

@@ -3,47 +3,10 @@ import {get,post} from '@/api/index'
 export default{
   // 获取报告详情
   getReportDetail:params=>{
-    return get('/report/detail',params)
+    return get('/h5/report/detail',params)
   },
-  // 收藏报告
-  reportCollect:params=>{
-    return post('/myreport/collect',params)
-  },
-  // 取消收藏报告
-  reportCollectCancel:params=>{
-    return post('/myreport/collectCancel',params)
-  },
-
   // 获取PDF报告详情
   getPdfReportDetail:params=>{
     return get('/report/pdf/detail',params)
   },
-  // 收藏PDF报告
-  pdfReportCollect:params=>{
-    return post('/myreport/pdf/collect',params)
-  },
-  // 取消收藏PDF报告
-  pdfReportCollectCancel:params=>{
-    return post('/myreport/pdf/collectCancel',params)
-  },
-  // 获取推送报告列表
-  getReportList:params=>{
-    return get('h5/report/list',params)
-  },
-   // 报告首页搜索
-   getReportSearch:params=>{
-    return get('h5/report/search',params)
-  },
-  // 推送报告详情
-  getPushReportDetail:params=>{
-    return get('h5/report/detail',params)
-  },
-  // 推送报告品种 chartPermissonId
-  permissionList:params=>{
-    return get('h5/chart_perimission/list',params)
-  },
-  // 推送报告分类
-  reportClassifyOpts:params=>{
-    return get('h5/chart_perimission/classify/tree',params)
-  },
 }

+ 1 - 11
src/api/modules/user.js

@@ -3,16 +3,6 @@ import {get,post} from '@/api/index'
 export default{
   // 用户信息
   userInfo:()=>{
-    return get('/user/info',{})
+    return post('/user/info',{})
   },
-
-  //用户绑定公众号
-  userBindWxOfficial:params=>{
-    return post('/wechat/subscribe',params)
-  },
-
-  // 申请认证
-  userApplyPermission:params=>{
-    return post('/user/apply/permission',params)
-  }
 }

BIN
src/assets/imgs/lock-img.png


+ 0 - 24
src/router/modules/report.js

@@ -14,29 +14,5 @@ export default[
     meta:{
       title:'报告详情'
     },
-  },
-  {
-    path:'/report/list',
-    component:()=>import('@/views/report/PushList.vue'),
-    name:'ReportList',
-    meta:{
-      title:'研报精选 '
-    },
-  },
-  {
-    path:'/report/Search',
-    component:()=>import('@/views/report/Search.vue'),
-    name:'ReportSearch',
-    meta:{
-      title:'搜索'
-    },
-  },
-  {
-    path:'/pushReport/detail',
-    component:()=>import('@/views/report/PushDetail.vue'),
-    name:'PushDetail',
-    meta:{
-      title:'研报详情'
-    },
   }
 ]

+ 95 - 134
src/views/report/Detail.vue

@@ -10,22 +10,31 @@ const route = useRoute()
 
 // 获取系统配置
 let systemConfig = null
+const telephoneNum = ref('')
 function getSystemConfig() {
   apiCommon.systemConfig().then(res => {
     if (res.Ret === 200) {
       systemConfig = res.Data
-      console.log(res.Data);
+      systemConfig.forEach(item => {
+      if (item.ConfKey === 'ServicePhone') {
+        telephoneNum.value = item.ConfVal
+      }
+    });
     }
   })
 }
 getSystemConfig()
 
+const isLogin = ref(false)
+const TrialExpired = ref(false)
 // 获取用户信息
 let userInfo = null
 async function getUserInfo() {
   const res = await apiUser.userInfo()
   if (res.Ret === 200) {
     userInfo = res.Data
+    isLogin.value = userInfo.LoginStatus === 0
+    TrialExpired.value = userInfo.TrialExpired
   }
 }
 
@@ -33,10 +42,6 @@ async function getUserInfo() {
 
 const reportId = route.query.reportid
 const reportInfo = ref(null)
-const reportContent = ref('')
-const reportStatus = ref(0)//1已过期,2没有该品种权限,3没有权限,4有权限,5未绑定
-const reportCollected = ref(false)//报告是否收藏
-const isBind=ref(false)
 const headImgStyle=ref([])
 const endImgStyle=ref([])
 const layoutBaseInfo=ref({
@@ -51,11 +56,8 @@ async function getReportInfo() {
   })
   if (res.Ret === 200) {
     reportInfo.value = res.Data.Report
-    reportStatus.value = res.Data.Status
-    reportCollected.value = res.Data.IsCollect || false
-    isBind.value=res.Data.IsSignIn
-    headImgStyle.value=res.Data.Report.HeadResource.Style?JSON.parse(res.Data.Report.HeadResource.Style):[]
-    endImgStyle.value=res.Data.Report.EndResource.Style?JSON.parse(res.Data.Report.EndResource.Style):[]
+    headImgStyle.value=res.Data.Report.HeadResource?.Style?JSON.parse(res.Data.Report.HeadResource.Style):[]
+    endImgStyle.value=res.Data.Report.EndResource?.Style?JSON.parse(res.Data.Report.EndResource.Style):[]
     layoutBaseInfo.value['研报标题']=res.Data.Report.Title
     layoutBaseInfo.value['研报作者']=res.Data.Report.Author
     layoutBaseInfo.value['创建时间']=res.Data.Report.PublishTime
@@ -74,27 +76,23 @@ async function getReportInfo() {
     });
 
     await getUserInfo()
-    if (res.Data.Status === 4) {
-      let htmlStr=''
-      if(reportInfo.value.HasChapter===1){//章节报告
-        const arr=reportInfo.value.ChapterContent||[]
-        arr.forEach(i=>{
-          const str=`<div class="chapter-item-wrap"><div class="chapter-title"><h3 class="chapter-title-text">${i.Title}</h3></div></div><div>${i.Content}</div>`
-          htmlStr=htmlStr+str
-        })
-      }else{
-        htmlStr=reportInfo.value.Content
-      }
-      if (userInfo.Status === 2 && userInfo.HasPermission === '私有权限') {
-        htmlStr=modifyReportContentIframeData(htmlStr)
-        htmlStr=formatIframeData(htmlStr)
-      }else{
-        htmlStr = modifyReportContentIframeData(htmlStr)
-      }
-      splitReportContent(htmlStr)
-    } else {//无权限
-      reportContent.value = modifyReportContentIframeData(reportInfo.value.ContentSub)
+    let htmlStr=''
+    if(reportInfo.value.HasChapter===1){//章节报告
+      const arr=reportInfo.value.ChapterContent||[]
+      arr.forEach(i=>{
+        const str=`<div class="chapter-item-wrap"><div class="chapter-title"><h3 class="chapter-title-text">${i.Title}</h3></div></div><div>${i.Content}</div>`
+        htmlStr=htmlStr+str
+      })
+    }else{
+      htmlStr=reportInfo.value.Content
+    }
+    if (userInfo.Status === 2 && userInfo.HasPermission === '私有权限') {
+      htmlStr=modifyReportContentIframeData(htmlStr)
+      htmlStr=formatIframeData(htmlStr)
+    }else{
+      htmlStr = modifyReportContentIframeData(htmlStr)
     }
+    splitReportContent(htmlStr)
 
     // 智能研报将富文本盒子高度设置为自动
     if(res.Data.Report.ReportLayout===2){
@@ -143,29 +141,16 @@ function handleLoadContent(){
   renderContentList.value=renderContentList.value.concat(contentTotals.slice(page*pageSize,(page+1)*pageSize))
 }
 
-// 打电话按钮显示
-const callShow = ref(false)
-const phoneList = ref([])
-function handleCallShow() {
-  callShow.value = true
-  phoneList.value = userInfo.SellerDepartmentPhone || []
-  console.log(phoneList.value);
-  
-}
-function visiblechange(val) {
-  callShow.value = false
-}
-
 // 拨打电话
-function handleCallPhone(tel) {
-  visiblechange()
-  // if (!tel) {
-  //   systemConfig.forEach(item => {
-  //     if (item.ConfKey === 'ServicePhone') {
-  //       tel = item.ConfVal
-  //     }
-  //   });
-  // }
+function handleCallPhone() {
+  let tel = ''
+  if (!tel) {
+    systemConfig.forEach(item => {
+      if (item.ConfKey === 'ServicePhone') {
+        tel = item.ConfVal
+      }
+    });
+  }
 
   var phoneLink = 'tel:' + tel;
   var link = document.createElement('a');
@@ -176,18 +161,6 @@ function handleCallPhone(tel) {
   link.click();
 }
 
-// 点击收藏
-async function handleCollect() {
-  const res = reportCollected.value ? await apiReport.reportCollectCancel({ ReportId: Number(reportId) }) : await apiReport.reportCollect({ ReportId: Number(reportId) })
-  if (res.Ret === 200) {
-    Message.success(reportCollected.value ? '取消收藏成功' : '收藏成功')
-    reportCollected.value = !reportCollected.value
-    // 通知更新收藏列表
-    wx.miniProgram.postMessage({
-      data: 'refreshCollectList'
-    });
-  }
-}
 
 // 显示免责声明
 const isShowMZSM = ref(false)
@@ -267,10 +240,10 @@ function handleTips () {
 </script>
 
 <template>
-  <div class="report-detail-page" v-if="reportInfo">
+  <div class="report-detail-page" v-if="reportInfo" :class="isLogin || TrialExpired ? 'fixation' : ''">
     <!-- 智能研报有版头版尾 -->
-    <div class="html-head-img-box" v-if="reportInfo.HeadResource.ImgUrl">
-      <img :src="reportInfo.HeadResource.ImgUrl" alt="" style="display:block;width:100%">
+    <div class="html-head-img-box" v-if="reportInfo?.HeadResource?.ImgUrl">
+      <img :src="reportInfo.HeadResource?.ImgUrl" alt="" style="display:block;width:100%">
       <div 
         class="head-layout-item" 
         v-for="item in headImgStyle" 
@@ -290,12 +263,12 @@ function handleTips () {
         {{ layoutBaseInfo[item.value] }}
       </div>
     </div>
-    <div class="time-box" style="text-align:right;" v-if="reportInfo.HeadResource.ImgUrl">
+    <div class="time-box" style="text-align:right;" v-if="reportInfo.HeadResource?.ImgUrl">
       <span>如有内容疑问 请查看 &nbsp;</span>
       <span class="btn" @click="isShowMZSM = true">免责声明</span>
     </div>
 
-    <template v-if="!reportInfo.HeadResource.ImgUrl&&!reportInfo.EndResource.ImgUrl">
+    <template v-if="!reportInfo.HeadResource?.ImgUrl&&!reportInfo.EndResource?.ImgUrl">
     <div class="title-box">{{ reportInfo.Title }}</div>
     <div class="author-box">{{ reportInfo.Author }}</div>
     <div class="time-box">
@@ -305,26 +278,20 @@ function handleTips () {
     </template>
 
     <div class="des-box" v-if="reportInfo.Abstract">
-      <svg-icon name="icon01"></svg-icon>
-      <div>{{ reportInfo.Abstract }}</div>
+      <!-- <svg-icon name="icon01"></svg-icon> -->
+       <span class="des-title">摘要:</span>
+      <span>{{ reportInfo.Abstract }}{{ reportInfo.Abstract }}{{ reportInfo.Abstract }}{{ reportInfo.Abstract }}{{ reportInfo.Abstract }}{{ reportInfo.Abstract }}{{ reportInfo.Abstract }}{{ reportInfo.Abstract }}{{ reportInfo.Abstract }}</span>
     </div>
     <div
       id="rich-content"
       class="report-content-box rich-content"
-      v-html="reportContent"
-      v-if="reportStatus !== 4"
-    />
-    <div
-      id="rich-content"
-      class="report-content-box rich-content"
-      v-else
     >
       <div v-for="item in renderContentList" :key="item" v-html="item"></div>
     </div>    
 
     <!-- 拼接版尾 -->
-    <div class="html-end-img-box" v-if="reportInfo.EndResource.ImgUrl">
-      <img :src="reportInfo.EndResource.ImgUrl" alt="" style="display:block;width:100%">
+    <div class="html-end-img-box" v-if="reportInfo.EndResource?.ImgUrl">
+      <img :src="reportInfo.EndResource?.ImgUrl" alt="" style="display:block;width:100%">
       <div 
         class="head-layout-item" 
         v-for="item in endImgStyle" 
@@ -345,13 +312,6 @@ function handleTips () {
     </div>
     <!-- 右侧悬浮操作栏 -->
     <div class="right-fix-box">
-      <!-- 收藏 -->
-      <svg-icon
-        @click="handleCollect"
-        class="item collect-icon"
-        :name="reportCollected ? 'collected' : 'collect'"
-        v-if="reportStatus === 4 && userInfo?.Status === 2"
-      />
       <!-- 返回顶部 -->
       <div class="item back-top-img">
         <svg-icon
@@ -363,53 +323,34 @@ function handleTips () {
       </div>
     </div>
   </div>
-  <!-- 无权限  -->
-  <div class="no-auth-wrap" v-if="reportInfo&&reportStatus !== 4">
+  <!-- 未绑定 -->
+  <div class="no-auth-wrap" v-if="isLogin">
     <div class="opcity-box"></div>
     <div class="content-box">
       <img class="icon" src="@/assets/imgs/lock-img.png" alt="" />
-      <div class="text" v-if="reportStatus === 3">
-        您暂无权限查看,<br />请申请认证!
-      </div>
-      <div class="text" v-if="reportStatus === 2">
-        您暂无该品种权限,<br />请联系客服人员开通!
-      </div>
-      <div class="text" v-if="reportStatus === 1">
-        您的权限已过期,<br />请联系客服人员开通!
+      <div class="text">
+        为了优化您的用户体验<br />请登录后查看更多信息!
       </div>
       <t-button
-        v-if="reportStatus !== 3"
-        theme="primary"
-        block
-        style="width: 300px; margin: 30px auto"
-        @click="handleCallShow"
-        >立即联系</t-button
-      >
-      <t-button
-        v-else
         theme="primary"
-        block
-        style="width: 300px; margin: 30px auto"
-        @click="handleApplyCertification"
-        >申请认证</t-button
+        shape="round"
+        style="width: 300px; margin: 30px auto; background: linear-gradient(270deg, #BB5B29 0%, #E09056 100%);"
+        @click="handleGoLogin"
+        >去登陆</t-button
       >
     </div>
   </div>
-  <!-- 未绑定 -->
-  <div class="no-auth-wrap" v-if="reportInfo&&reportStatus === 5&&!isBind">
+  <!-- 无权限  -->
+  <div class="no-auth-wrap" v-else-if="TrialExpired">
     <div class="opcity-box"></div>
     <div class="content-box">
       <img class="icon" src="@/assets/imgs/lock-img.png" alt="" />
       <div class="text">
-        为了优化您的用户体验<br />请登录后查看更多信息!
+        您的报告查看权限已到期,如有需要<br />请联系客户经理开通权限
+      </div>
+      <div class="num" @click="handleCallPhone()">
+        {{telephoneNum}}
       </div>
-      <t-button
-        theme="primary"
-        block
-        style="width: 300px; margin: 30px auto"
-        @click="handleGoLogin"
-        >去登陆</t-button
-      >
     </div>
   </div>
   <!-- 免责声明 -->
@@ -422,15 +363,6 @@ function handleTips () {
     @confirm="handleTips"
   >
   </t-dialog>
-  <t-popup
-    :visible="callShow"
-    placement="bottom"
-    @visiblechange="visiblechange"
-  > 
-    <div class="call-box">
-      <div class="phone-item" v-for="(item, index) in phoneList" :key="index" @click="handleCallPhone(item)">{{ item }}</div>
-    </div>
-  </t-popup>
 </template>
 
 <style lang="scss" scoped>
@@ -448,18 +380,32 @@ function handleTips () {
     color: var(--text-color-grey);
     .btn {
       float: right;
-      color: var(--primary-color);
+      color: #D49633;
     }
   }
   .des-box {
-    background-color: #f8f8f8;
+    background-color: #FEF9F4;
     padding: 20px;
     margin: 20px 0;
-    display: flex;
-    gap: 0 10px;
     color: var(--text-color-sub);
     font-size: var(--font-size-small);
     line-height: 36px;
+    position: relative;
+    &::before {
+      position: absolute;
+      top: 0;
+      left: 0;
+      content: '';
+      display: block;
+      height: 100%;
+      width: 1px;
+      background-color: #BC6031;
+    }
+    .des-title {
+      font-size: 30px;
+      font-weight: 600;
+      color: #666666;
+    }
   }
   .report-content-box {
     margin-top: 20px;
@@ -558,6 +504,10 @@ function handleTips () {
     }
   }
 }
+.fixation {
+  height: 100vh;
+  overflow: hidden;
+}
 .no-auth-wrap {
   position: fixed;
   left: 0;
@@ -573,10 +523,21 @@ function handleTips () {
     );
   }
   .content-box {
+    --td-button-primary-border-color: #D49633;
+    --td-button-primary-active-bg-color:#BB5B29;
+    --td-button-primary-active-border-color:#BB5B29;
     background-color: #fff;
     padding-bottom: 200px;
     text-align: center;
-    color: var(--primary-color);
+    color: #D49633;
+    .text {
+      font-size: 28px;
+      margin-top: 20px;
+    }
+    .num {
+      margin-top: 20px;
+      font-size: 32px;
+    }
   }
 
   .icon {

+ 0 - 537
src/views/report/PushDetail.vue

@@ -1,537 +0,0 @@
-<script setup>
-import apiReport from '@/api/modules/report'
-import { useRoute } from 'vue-router'
-import { Message } from 'tdesign-mobile-vue';
-import apiCommon from '@/api/modules/common'
-import apiUser from '@/api/modules/user'
-import { useThrottleFn } from '@vueuse/core'
-
-const route = useRoute()
-
-
-const reportId = route.query.ReportId
-const ReportType = route.query.ReportType
-const reportInfo = ref(null)
-const reportContent = ref('')
-// const reportStatus = ref(0)//1已过期,2没有该品种权限,3没有权限,4有权限,5未绑定
-const headImgStyle=ref([])
-const endImgStyle=ref([])
-const PdfUrl = ref('')
-const layoutBaseInfo=ref({
-  '研报标题':'',
-  '研报作者':'',
-  '创建时间':''
-})
-async function getReportInfo() {
-  
-  if (!reportId) return
-  const res = await apiReport.getPushReportDetail({
-    ReportId: Number(reportId),
-    ReportType: Number(ReportType)
-  })
-  if (res.Ret === 200) {
-    reportInfo.value = res.Data.Report
-    if (ReportType === '1') {
-      reportInfo.value.Content =reportInfo.value.Content.split('<p data-f-id="pbf" style="text-align: center; font-size: 14px; margin-top: 30px; opacity: 0.65; font-family: sans-serif;">Powered by <a href="https://www.froala.com/wysiwyg-editor?pb=1" title="Froala Editor">Froala Editor</a></p>')[0]
-      headImgStyle.value=res.Data.Report.HeadResource.Style?JSON.parse(res.Data.Report.HeadResource.Style):[]
-      endImgStyle.value=res.Data.Report.EndResource.Style?JSON.parse(res.Data.Report.EndResource.Style):[]
-      layoutBaseInfo.value['研报标题']=res.Data.Report.Title
-      layoutBaseInfo.value['研报作者']=res.Data.Report.Author
-      layoutBaseInfo.value['创建时间']=res.Data.Report.PublishTime
-      reportInfo.value.Content=modifyReportContentIframeData(reportInfo.value.Content)
-      formatIframeData()
-    } else {
-      // PdfUrl.value = res.Data.PdfUrl
-      // console.log(PdfUrl.value);
-      reportInfo.value = res.Data
-      layoutBaseInfo.value['研报标题']=res.Data.Title
-      layoutBaseInfo.value['研报作者']=res.Data.Author
-      layoutBaseInfo.value['创建时间']=res.Data.PublishTime
-    }
-    // reportStatus.value = res.Data.Status
-
-
-    nextTick(() => {
-      if (ReportType === '1') {
-        handlePreviewImgs()
-      }
-    })
-    // 设置分享文案
-    // wx.miniProgram.postMessage({
-    //   data: {
-    //     title: res.Data.Report.Title
-    //   }
-    // });
-  }
-}
-getReportInfo()
-
-// 修改报告中嵌入的图表地址
-function modifyReportContentIframeData(str){
-  let temStr=str.replace(/http:\/\/eta.dwfutures.com:8001/g,'https://dwresearch.dwfutures.com')
-  return temStr.replace(/http:\/\/58.210.74.21:9100\/etastatic/g,'https://dwresearch.dwfutures.com/etastatic')
-}
-
-// 给报告详情中图表加参数
-function formatIframeData() {
-  reportContent.value = reportInfo.value.Content.replace(/\/chartshow\?code=/g, `/chartshow? reportId=${reportId}&code=`)
-  splitReportContent(reportContent.value)
-}
-
-// 报告内容分页
-const pageSize=20
-let page=0
-let endPageNum=0
-let contentTotals=[]
-const renderContentList=ref([])
-function splitReportContent(data){
-  const arr=data.split('</p>');
-  contentTotals=arr.map(_ => _+'</p>')
-  renderContentList.value=contentTotals.slice(0,pageSize)
-  endPageNum=parseInt(contentTotals.length / pageSize) + 1;
-}
-function handleLoadContent(){
-  renderContentList.value=renderContentList.value.concat(contentTotals.slice(page*pageSize,(page+1)*pageSize))
-}
-
-// 显示免责声明
-const isShowMZSM = ref(false)
-
-// 显示返回顶部
-const showToTop = ref(false)
-const handlePageScroll=useThrottleFn(()=>{
-  const top = document.documentElement.scrollTop || document.body.scrollTop
-  if (top > window.outerHeight) {
-    showToTop.value = true
-  } else {
-    showToTop.value = false
-  }
-
-  if(page >= endPageNum) return
-  const clientHeight = document.documentElement.clientHeight || document.body.clientHeight; // 可视高度
-  const scrollHeight = document.body.scrollHeight; // 总高度
-  const bufferHeight = 400;
-  if((scrollHeight - top - clientHeight) < bufferHeight+100) {
-    console.log('触底')
-    page++
-    handleLoadContent();
-  }
-},300)
-
-function handleBackTop() {
-  console.log(1)
-  document.body.scrollTop = document.documentElement.scrollTop = 0
-}
-
-// 点击报告内容中的图片
-function handlePreviewImgs() {
-  document.getElementById('rich-content').addEventListener('click', function (event) {
-    let imgArray = [];
-    let curImageSrc = event.target.src;
-    let oParent = event.target.parentNode;
-    if (curImageSrc && !oParent.hasAttribute('href')) {
-      let imgs = document.querySelectorAll('.rich-content img');
-      for (let i = 0; i < imgs.length; i++) {
-        let itemSrc = imgs[i].src;
-        imgArray.push(itemSrc);
-      }
-      wx.previewImage({ current: curImageSrc, urls: imgArray });
-    }
-  });
-}
-
-onMounted(() => {
-  window.addEventListener('scroll', handlePageScroll)
-})
-onUnmounted(() => {
-  window.removeEventListener('scroll', handlePageScroll)
-})
-
-</script>
-
-<template>
-  <div class="report-detail-page" v-if="reportInfo">
-    <!-- 智能研报有版头版尾 -->
-    <div class="html-head-img-box" v-if="reportInfo.HeadResource && reportInfo.HeadResource.ImgUrl">
-      <img :src="reportInfo.HeadResource.ImgUrl" alt="" style="display:block;width:100%">
-      <div 
-        class="head-layout-item" 
-        v-for="item in headImgStyle" 
-        :key="item.value"
-        :style="{
-          fontFamily:item.family,
-          fontSize:(item.size*2)+'px',
-          fontWeight:item.weight,
-          textAlign:item.align,
-          color:item.color,
-          width:item.width,
-          height:item.height,
-          left:item.left,
-          top:item.top
-        }"
-      >
-        {{ layoutBaseInfo[item.value] }}
-      </div>
-    </div>
-    <div class="time-box" style="text-align:right;" v-if="reportInfo.HeadResource && reportInfo.HeadResource.ImgUrl">
-      <span>如有内容疑问 请查看 &nbsp;</span>
-      <span class="btn" @click="isShowMZSM = true">免责声明</span>
-    </div>
-
-    <template v-if="ReportType === '1'">
-      <template v-if="!reportInfo.HeadResource.ImgUrl&&!reportInfo.EndResource.ImgUrl">
-        <div class="title-box">{{ reportInfo.Title }}</div>
-        <div class="author-box">{{ reportInfo.Author }}</div>
-        <div class="time-box">
-          <span>{{ reportInfo.PublishTime }}</span>
-          <span class="btn" @click="isShowMZSM = true">免责声明</span>
-        </div>
-      </template>
-    </template>
-    <template v-else>
-      <div class="title-box">{{ reportInfo.Title }}</div>
-        <div class="author-box">{{ reportInfo.Author }}</div>
-        <div class="time-box">
-          <span>{{ reportInfo.PublishTime }}</span>
-          <span class="btn" @click="isShowMZSM = true">免责声明</span>
-        </div>
-    </template>
-    
-
-    <div class="des-box" v-if="reportInfo.Abstract">
-      <svg-icon name="icon01"></svg-icon>
-      <div>{{ reportInfo.Abstract }}</div>
-    </div>
-    <div
-      id="rich-content"
-      class="report-content-box rich-content"
-      v-html="reportContent"
-      v-if="ReportType === '1'"
-    />
-    <template v-if="ReportType === '1'">
-    <div
-      id="rich-content"
-      class="report-content-box rich-content"
-      v-if="reportInfo.HasChapter!==1"
-    >
-      <div v-for="item in renderContentList" :key="item" v-html="item"></div>
-    </div>
-    <!-- 章节报告 -->
-    <div
-      id="rich-content"
-      class="report-content-box rich-content"
-      v-if="reportInfo.HasChapter===1"
-    >
-      <div 
-        class="chapter-item-wrap" 
-        v-for="chapter,index in reportInfo.ChapterContent"
-        :key="index"
-      >
-        <div class="chapter-title">
-          <h3 class="chapter-title-text">{{chapter.Title}}</h3>
-        </div>
-        <div v-html="chapter.Content"></div>
-      </div>
-    </div>
-    </template>
-    <template v-if="ReportType === '2'">
-      <div class="report-content-box rich-content">
-        <preview-PDF :url="reportInfo.PdfUrl"/>
-      </div>
-    </template>
-
-
-    <!-- 拼接版尾 -->
-    <div class="html-end-img-box" v-if="reportInfo.EndResource && reportInfo.EndResource.ImgUrl">
-      <img :src="reportInfo.EndResource.ImgUrl" alt="" style="display:block;width:100%">
-      <div 
-        class="head-layout-item" 
-        v-for="item in endImgStyle" 
-        :key="item.value"
-        :style="{
-          fontFamily:item.family,
-          fontSize:(item.size*2)+'px',
-          fontWeight:item.weight,
-          textAlign:item.align,
-          color:item.color,
-          width:item.width,
-          height:item.height,
-          left:item.left,
-          top:item.top
-        }"
-      >{{ layoutBaseInfo[item.value] }}
-      </div>
-    </div>
-    <!-- 右侧悬浮操作栏 -->
-    <div class="right-fix-box">
-      <!-- 返回顶部 -->
-      <div class="item back-top-img">
-        <svg-icon
-          name="backtop"
-          v-show="showToTop"
-          @click="handleBackTop"
-          class="back-top-img"
-        />
-      </div>
-    </div>
-  </div>
-  <!-- 免责声明 -->
-  <disclaimers-wrap v-model:show="isShowMZSM" />
-</template>
-
-<style lang="scss" scoped>
-.report-detail-page {
-  background-color: #fff;
-  padding: var(--page-padding);
-  .title-box {
-    font-size: 36px;
-    line-height: 44px;
-    margin-bottom: 20px;
-  }
-  .time-box {
-    margin-top: 10px;
-    font-size: var(--font-size-small);
-    color: var(--text-color-grey);
-    .btn {
-      float: right;
-      color: var(--primary-color);
-    }
-  }
-  .des-box {
-    background-color: #f8f8f8;
-    padding: 20px;
-    margin: 20px 0;
-    display: flex;
-    gap: 0 10px;
-    color: var(--text-color-sub);
-    font-size: var(--font-size-small);
-    line-height: 36px;
-  }
-  .report-content-box {
-    margin-top: 20px;
-    line-height: 1.8;
-    font-size: 36px;
-    :deep(img) {
-      width: 100% !important;
-    }
-    :deep(span) {
-      font-size: 36px !important;
-      line-height: 1.8 !important;
-      background-color: rgba(255, 255, 255, 0) !important;
-    }
-    :deep(p) {
-      font-size: 36px !important;
-      line-height: 1.8 !important;
-      background-color: rgba(255, 255, 255, 0) !important;
-    }
-    :deep(ul) {
-      font-size: 36px !important;
-      line-height: 1.8 !important;
-      background-color: rgba(255, 255, 255, 0) !important;
-    }
-    :deep(ol) {
-      font-size: 36px !important;
-      line-height: 1.8 !important;
-      background-color: rgba(255, 255, 255, 0) !important;
-    }
-    :deep(iframe) {
-      width: 100% !important;
-    }
-    :deep(li) {
-      font-size: 36px !important;
-      line-height: 1.8 !important;
-      background-color: rgba(255, 255, 255, 0) !important;
-      list-style: inherit !important;
-      list-style-position: inside !important;
-    }
-    :deep(span.fr-emoticon) {
-      width: 36px !important;
-      height: 36px !important;
-      background-repeat: no-repeat !important;
-      background-size: cover !important;
-      display: inline-block !important;
-      vertical-align: middle !important;
-    }
-    
-    .chapter-item-wrap {
-      padding: 20px 0;
-      .chapter-title {
-          display: flex;
-          align-items: center;
-          font-size: 30px;
-          .type {
-              height: fit-content;
-              display: inline-block;
-              color: #fff;
-              padding: 10px 20px;
-              background-color: #E6A23C;
-              border-radius: 8px; 
-              margin-right: 20px;
-          }
-          .chapter-title-text {
-              font-size: 30px;
-          }
-      }
-    }
-  }
-  .right-fix-box {
-    position: fixed;
-    z-index: 99;
-    right: 34px;
-    bottom: 130px;
-    .item {
-      margin-top: 10px;
-    }
-    .back-top-img {
-      width: 100px;
-      height: 100px;
-      display: block;
-    }
-    .collect-icon {
-      width: 100px;
-      height: 100px;
-      display: block;
-    }
-  }
-  .html-head-img-box,.html-end-img-box{
-    margin-bottom: 10px;
-    position: relative;
-    overflow: hidden;
-    .head-layout-item{
-        position: absolute;
-        overflow: hidden;
-        box-sizing: border-box
-    }
-  }
-}
-.no-auth-wrap {
-  position: fixed;
-  left: 0;
-  right: 0;
-  bottom: 0;
-  z-index: 99;
-  .opcity-box {
-    height: 129px;
-    background: linear-gradient(
-      360deg,
-      #ffffff 0%,
-      rgba(255, 255, 255, 0) 100%
-    );
-  }
-  .content-box {
-    background-color: #fff;
-    padding-bottom: 200px;
-    text-align: center;
-    color: var(--primary-color);
-  }
-
-  .icon {
-    display: block;
-    margin: 0 auto;
-    width: 200px;
-    height: 200px;
-  }
-}
-@media (max-width: 599px){
-  .report-detail-page{
-    .report-content-box{
-      :deep(.report-drag-item-wrap_child-wrap){
-        flex-wrap: wrap;
-        .report-drag-item-wrap_child_content{
-          flex: none !important;
-          width: 100%;
-        }
-      }
-    }
-    
-  }
-}
-@media (min-width: 600px) {
-  .report-detail-page {
-    .title-box {
-      font-size: 18px;
-      line-height: 22px;
-      margin-bottom: 10px;
-    }
-    .time-box {
-      margin-top: 5px;
-    }
-    .des-box {
-      padding: 10px;
-      margin: 10px 0;
-      gap: 0 5px;
-      line-height: 18px;
-    }
-    .report-content-box {
-      margin-top: 10px;
-      font-size: 18px;
-      :deep(span) {
-        font-size: 18px !important;
-      }
-      :deep(p) {
-        font-size: 18px !important;
-      }
-      :deep(ul) {
-        font-size: 18px !important;
-      }
-      :deep(ol) {
-        font-size: 18px !important;
-      }
-      :deep(li) {
-        font-size: 18px !important;
-      }
-      :deep(span.fr-emoticon) {
-        width: 18px !important;
-        height: 18px !important;
-      }
-
-      .chapter-item-wrap {
-        padding: 10px 0;
-        .chapter-title {
-            display: flex;
-            align-items: center;
-            font-size: 20px;
-            .type {
-                padding: 5px 10px;
-                border-radius: 4px; 
-                margin-right: 10px;
-            }
-            .chapter-title-text {
-                font-size: 20px;
-            }
-        }
-      }
-    }
-    .right-fix-box {
-      right: 17px;
-      bottom: 65px;
-      .item {
-        margin-top: 5px;
-      }
-      .back-top-img {
-        width: 50px;
-        height: 50px;
-      }
-      .collect-icon {
-        width: 50px;
-        height: 50px;
-      }
-    }
-    .html-head-img-box,.html-end-img-box{
-      margin-bottom: 5px;
-    }
-  }
-  .no-auth-wrap {
-    .opcity-box {
-      height: 65px;
-    }
-    .content-box {
-      padding-bottom: 100px;
-    }
-    .icon {
-      width: 100px;
-      height: 100px;
-    }
-  }
-}
-</style>

+ 0 - 322
src/views/report/PushList.vue

@@ -1,322 +0,0 @@
-<script setup>
-  import apiReport from '@/api/modules/report'
-  import { useRouter } from 'vue-router'
-  import { Message } from 'tdesign-mobile-vue';
-  import Filter from './components/Filter.vue'
-  import ReportItem from './components/ReportItem.vue'
-  import EmptyBox from './components/EmptyBox.vue'
-
-  // 数据
-  const router = useRouter()
-  let loading = ref(false)
-  let list = ref([])
-  let finished = ref(false)
-  const pageSize = 30
-  let typeOpts = ref([])
-  let varietyOpts = ref([])
-  let activeType = ref(0)
-  let timeRangeType = ref(3)
-  let pdfPermissionId = ref(0)
-  let pid = ref(0)
-  let isPdf = ref(false)
-  let Parent = ref(0)
-  const tabs = ref(null)
-  const activeTypeTabs = ref(null)
-  let defaultValue = ref(0)
-  let secondary = ref(false) // 是否选择过品种
-  let secondaryList = ref([]) // 选择中品种后的三级品种列表
-  const showFilter = ref(false)
-  const filterState = reactive({
-    CurrentIndex: 1,
-    PageSize: pageSize,
-    Level:activeType.value === 0 ? 0 : 2,
-    ChartPermissionId:activeType.value === 0 ? pid.value : activeType.value,
-    RangeType: timeRangeType.value,
-    ClassifyId: 0,
-    ReportType: 1
-  })
-
-  getReportPermissionOpts()
-  getReportList()
-
-  // 获取品种
-  function getReportPermissionOpts() {
-    apiReport.permissionList({ chartPermissonId: pid.value }).then(res => {
-      if (res.Ret === 200) {
-        const arr = res.Data || []
-        varietyOpts.value=[{ChartPermissionId:0,PermissionName:'全部',ChartPermissionType:1},...arr]
-        if (!secondary.value)  typeOpts.value=[{ChartPermissionId:0,PermissionName:'全部',ChartPermissionType:1},...arr]
-        else {
-          if(activeType.value === 0) {
-            secondaryList.value = []
-            filterState.ChartPermissionId = 0
-            filterState.Level = 0
-            defaultValue.value = 0
-          } else {
-            secondaryList.value = arr 
-            filterState.ChartPermissionId = arr[0].ChartPermissionId
-            filterState.ReportType = arr[0].ChartPermissionType
-            filterState.Level = arr[0].ChartPermissionType === 2 ? 1 : 2
-            defaultValue.value = arr[0].ChartPermissionId
-          }
-          getReportList()
-        }
-      }
-    })
-  }
-
-
-  // 获取报告列表
-  async function getReportList() {
-    isPdf.value = filterState.ReportType === 2 ? true : false
-    loading.value = true
-    const res = await apiReport.getReportList(filterState)
-    loading.value = false
-    if (res.Ret === 200) {
-      const arr = res.Data.List || []
-      list.value = [...list.value, ...arr]
-      // console.log(list.value);
-      finished.value = res.Data.Paging.IsEnd
-    } else {
-      finished.value = true
-    }
-  }
-
-  // 监听滚动事件
-  onMounted(() => {
-    const handleScroll = () => {
-      const { scrollTop, scrollHeight, clientHeight } = document.documentElement; // 兼容大多数浏览器
-      // 检查是否滚动到底部
-      const isScrolledToBottom = scrollTop + clientHeight >= scrollHeight;
-      if (isScrolledToBottom && !finished.value) {
-        filterState.CurrentIndex++ 
-        getReportList()
-      }
-    };
-    // 监听整个文档的滚动事件
-    window.addEventListener('scroll', handleScroll);
-    // 组件卸载时移除事件监听器
-    onUnmounted(() => {
-      window.removeEventListener('scroll', handleScroll);
-    });
-  });
-
-  // 第一层选中
-  function handleTypeChange(e, index, w) {
-    if(activeType.value === e) return
-    list.value = []
-    activeType.value = e
-    filterState.Level = 2
-    filterState.RangeType = 3
-    pid.value = e
-    filterState.ClassifyId = 0
-    filterState.ChartPermissionId = e === 0 ? pid.value : e,
-    Parent.value = e
-    secondary.value = true
-    nextTick(()=>{
-      // activeTypeTabs.value.setTrack()//设置滑块位置
-    })
-    getReportPermissionOpts()
-  }
-  // 第二层选中
-  function handleSecondary(e) {
-    list.value = []
-    defaultValue.value = e
-    // if(activeType.value === e) return
-    activeType.value = e
-    filterState.RangeType = 3
-    // filterState.ClassifyId = e
-    filterState.ClassifyId = 0
-    pid.value = e
-    filterState.ChartPermissionId = e === 0 ? pid.value : e,
-    filterState.ReportType = e === Parent.value ? 2 : 1
-    filterState.Level = e === Parent.value ? 1 : 2
-    handleRefreshList()
-  }
-
-  function handleFilterList(e) {
-    filterState.RangeType = e.time
-    if(filterState.ReportType === 2) filterState.ChartPermissionId = e.permission
-    if (activeType.value !== 0) filterState.Level = 2
-    filterState.ClassifyId = e.classifyId
-    handleRefreshList()
-  }
-
-  nextTick(()=>{
-    // activeTypeTabs.value.setTrack()//设置滑块位置
-  })
-  function handleRefreshList(){
-    filterState.CurrentIndex = 1
-    list.value=[]
-    finished.value=false
-    getReportList()
-  }
-  // 点击筛选
-  function handleFilter() {
-    showFilter.value = true
-    // getReportList()
-  }
-
-  // 点击搜索
-  function toSearch(e) {
-    router.push('/report/Search')
-  }
-  // 关闭报告筛选
-  function updateShowFilter(val) {
-    showFilter.value = val
-  }
-
-  const filterClassifyPermissionId = computed(() => {
-    return activeType.value === 0 ? pid.value : defaultValue.value
-  })
-</script>
-
-<template>
-  <!-- <default-page> -->
-    <div class="report-list-page">
-      <div class="top-filter-wrap">
-        <div class="search">
-          <div class="top">
-            <img src="@/assets/imgs/logo.png" alt="" class="logo">
-            <div>
-              <t-icon name="search" size="20px" color="RGBA(0, 79, 189, 1)" @click="toSearch" style="margin-right: 10px;"></t-icon>
-              <t-icon name="filter"  size="20px" color="RGBA(0, 79, 189, 1)" @click="handleFilter"></t-icon>
-            </div>
-          </div> 
-        </div>
-        <t-tabs
-          ref="activeTypeTabs"
-          :value="activeType"
-          :space-evenly="false"
-          @click="handleTypeChange"
-        >
-          <t-tab-panel
-            v-for="item in typeOpts"
-            :key="item.ChartPermissionId"
-            :label="item.PermissionName"
-            :value="item.ChartPermissionId"
-          />
-        </t-tabs>
-        <t-tabs
-          v-if="secondaryList.length > 0"
-          ref="tabs"
-          theme="tag"
-          :value="defaultValue"
-          :space-evenly="false"
-          @click="handleSecondary"
-        >
-          <t-tab-panel
-            class="tab"
-            v-for="item in secondaryList"
-            :key="item.ChartPermissionId"
-            :label="item.PermissionName"
-            :value="item.ChartPermissionId"
-          />
-        </t-tabs>
-        <!-- <image
-          class="filter-icon"
-          src="@/static/icons/filter.png"
-          mode="aspectFill"
-          @click="showFilter = true"
-        /> -->
-      </div>
-      <div class="report-list-wrap">
-        <report-item
-          :data="item" 
-          v-for="item in list" 
-          :key="item.ReportId" 
-        />
-      </div>
-      <EmptyBox v-if="list.length === 0 && finished" />
-    </div>
-      <!-- eslint-disable -->
-    <Filter 
-      v-model:show="showFilter" 
-      :permissionOpts="varietyOpts"
-      :filterClassifyPermissionId="filterClassifyPermissionId"
-      :firstPermissionId="pid"
-      :isPdf="isPdf"
-      @updateShowFilter="updateShowFilter"
-      @change="handleFilterList" 
-    />
-  <!-- </default-page> -->
-</template>
-
-<style lang="scss" scoped>
-.report-list-page {
-  background-color: var(--bg-grey-color);
-  min-height: 100vh;
-}
-.top-filter-wrap {
-  --filter-icon-width:44PX;
-  position: sticky;
-  top: 0;
-  left: 0;
-  right: 0;
-  z-index: 99;
-  background-color: var(--bg-color);
-  // background-color: #fff;
-  border-bottom: 1px solid var(--border-color);
-  overflow: hidden;
-  // padding-right: calc(var(--filter-icon-width) + var(--page-padding));
-  .filter-icon {
-    width: var(--filter-icon-width);
-    height: var(--filter-icon-width);
-    position: absolute;
-    right: var(--page-padding);
-    top: 50%;
-    transform: translateY(-50%);
-  }
-}
-.top-filter-wrap {
-  .search {
-    padding-top: 16px;
-    background-color: #fff;
-    .top {
-      padding: 4px 20px;
-      display: flex;
-      justify-content:space-between;
-      align-items: center;
-      .logo {
-        width: 50%;
-        height: 80px;
-      }
-    }
-  }
-}
-@media (min-width: 600px) {
-  .top-filter-wrap {
-    .filter-icon {
-      width: 22px;
-      height: 22px;
-    }
-    .search {
-      margin-top: 8px;
-      .top {
-        padding: 2px 10px;
-        .logo {
-          width: 25%;
-          height: 40px;
-          
-        }
-      }
-    }
-  }
-}
-
-:deep(.t-input__icon--prefix){
-  justify-content: center;
-  align-items: center;
-}
-:deep(.t-tabs__item-inner--tag){
-  background-color: #fff;
-}
-:deep(.t-tabs__item--active .t-tabs__item-inner--tag){
-  border-radius: 8px;
-  background: rgba(229, 239, 255, 1);
-}
-:deep(.t-input--border) {
-  position: static;
-}
-
-</style>

+ 0 - 158
src/views/report/Search.vue

@@ -1,158 +0,0 @@
-<script setup>
-  import apiReport from '@/api/modules/report'
-  import ReportItem from './components/ReportItem.vue'
-  import EmptyBox from './components/EmptyBox.vue'
-
-  // 数据
-  let loading = ref(false)
-  let list = ref([])
-  let finished = ref(false)
-  const SearchState = reactive({
-    CurrentIndex: 1,
-    PageSize: 30,
-    KeyWord: ''
-  })
-
-  // 搜索
-  function handleFilter() {
-    getReportSearch()
-  }
-
-  // 获取报告列表
-  async function getReportSearch() {
-    loading.value = true
-    const res = await apiReport.getReportSearch(SearchState)
-    loading.value = false
-    if (res.Ret === 200) {
-      const arr = res.Data.List || []
-      list.value = [...list.value, ...arr]
-      finished.value = res.Data.Paging.IsEnd
-    } else {
-      finished.value = true
-    }
-  }
-  function onPhoneInput(val) {
-    SearchState.KeyWord = val
-  }
-
-  // 创建一个响应式引用来存储是否滚动到底部的状态
-  const isScrolledToBottom = ref(false);
-
-  // 监听滚动事件
-  onMounted(() => {
-    const handleScroll = () => {
-      const { scrollTop, scrollHeight, clientHeight } = document.documentElement; // 兼容大多数浏览器
-      // 检查是否滚动到底部
-      isScrolledToBottom.value = scrollTop + clientHeight >= scrollHeight;
-      if (isScrolledToBottom.value && !finished.value) {
-        SearchState.CurrentIndex++ 
-        getReportSearch()
-      }
-    };
-    // 监听整个文档的滚动事件
-    window.addEventListener('scroll', handleScroll);
-    // 组件卸载时移除事件监听器
-    onUnmounted(() => {
-      window.removeEventListener('scroll', handleScroll);
-    });
-  });
-
-</script>
-
-<template>
-  <div class="report-list-page">
-    <div class="top-filter-wrap">
-      <div class="search">
-        <div class="top">
-          <t-input placeholder="请输入关键字" class="input" @change="onPhoneInput" @enter="handleFilter">
-            <template #prefixIcon>
-              <t-icon name="search" size="24px" color="RGBA(0, 79, 189, 1)"></t-icon>
-            </template>
-          </t-input>
-          <t-button variant="text" size="large" class="btn" @click="handleFilter">
-            搜索
-          </t-button>
-        </div> 
-      </div>
-    </div>
-    <div class="report-list-wrap">
-      <report-item
-        :data="item" 
-        v-for="item in list" 
-        :key="item.ReportId" 
-      />
-    </div>
-    <EmptyBox v-if="list.length === 0" />
-  </div>
-</template>
-
-<style lang="scss" scoped>
-.report-list-page {
-  // background-color: #fff;
-  min-height: 100vh;
-}
-.top-filter-wrap {
-  --filter-icon-width:44PX;
-  position: sticky;
-  top: 0;
-  left: 0;
-  right: 0;
-  z-index: 99;
-  background-color: var(--bg-color);
-  // background-color: #fff;
-  overflow: hidden;
-  // padding-right: calc(var(--filter-icon-width) + var(--page-padding));
-  .filter-icon {
-    width: var(--filter-icon-width);
-    height: var(--filter-icon-width);
-    position: absolute;
-    right: var(--page-padding);
-    top: 50%;
-    transform: translateY(-50%);
-  }
-}
-@media (min-width: 600px) {
-  .top-filter-wrap {
-    .filter-icon {
-      width: 22px;
-      height: 22px;
-    }
-  }
-}
-.search {
-  padding: 20px 0;
-  background-color: #fff;
-  .top {
-    // margin-top: 20px;
-    display: flex;
-    align-items: center;
-    padding: 0 28px;
-    .input {
-      height: 80px;
-      padding: 0 30px;
-      border-radius: 40px;
-      background: rgba(248, 248, 250, 1);
-    }
-    .btn {
-      color: rgba(0, 79, 189, 1);
-      font-size: 28px;
-      font-weight: 400;
-    }
-  }
-}
-
-:deep(.t-input__icon--prefix){
-  justify-content: center;
-  align-items: center;
-}
-:deep(.t-tabs__item-inner--tag){
-  background-color: #fff;
-}
-:deep(.t-tabs__item--active .t-tabs__item-inner--tag){
-  border-radius: 8px;
-  background: rgba(229, 239, 255, 1);
-}
-:deep(.t-input--border) {
-  position: static;
-}
-</style>

+ 0 - 137
src/views/report/components/CollapsibleList.vue

@@ -1,137 +0,0 @@
-<template>
-  <ul class="one-level-menu">
-    <li v-for="node in props.treeData" :key="node.Id">
-      <div @click="toggle(node)" :class="row == node.value ? 'clicked' : ''">
-        {{ node.label }}
-        <svg-icon name="up" class="one-level-icon" v-if="node.children && node.children.length > 0 && !node.expanded"></svg-icon>
-        <svg-icon name="down" class="one-level-icon" v-else-if="node.children && node.children.length > 0 && node.expanded"></svg-icon>
-      </div>
-      <!-- <collapsible-list
-        v-if="node.expanded && node.children && node.children.length > 0"
-        :tree-data="node.children"
-      /> -->
-      <ul class="two-level-menu" v-if="node.expanded && node.children && node.children.length > 0">
-        <li v-for="item in node.children" :key="item.Id">
-          <div @click="toggle(item, node)" :class="row == item.value ? 'clicked' : ''"> 
-            {{ item.label }}
-            <svg-icon name="up" class="two-level-icon" v-if="item.children && item.children.length > 0 && !item.expanded"></svg-icon>
-            <svg-icon name="down" class="two-level-icon" v-else-if="item.children && item.children.length > 0 && item.expanded"></svg-icon>
-          </div>
-          <ul class="three-level-menu" v-if="item.expanded && item.children && item.children.length > 0">
-            <!-- <t-tag v-for="items in item.children" :key="items.Id" class="margin-16" :variant="'light'" :content="items.label" @click="tagClick">{{ items.label }}</t-tag> -->
-            <text :class="tag == items.value ? 'margin-16 items clicked' : 'margin-16 items'" v-for="items in item.children" :key="items.Id" @click="toggle(items)">{{ items.label }}</text>
-          </ul>
-        </li>
-      </ul>
-    </li>
-  </ul>
-</template>
-
-<script setup>
-import { ref } from 'vue';
-
-  // const CollapsibleList = defineAsyncComponent(() => import('./CollapsibleList.vue')); // 更改组件名为RecursiveList以避免冲突
-
-  const props = defineProps({
-    treeData:{
-      type:Array,
-      default:()=>[]
-    },
-  })
-  const emit = defineEmits(["change"])
-  const handleData = ref([])
-  const row = ref(0)
-  const tag = ref(0)
-
-
-  function toggle(node) {
-    row.value = node.value;
-    tag.value = node.value;
-    node.expanded = !node.expanded;
-    if (node.level === 1) {
-      handleData._rawValue[0] = node.value;
-    } else if (node.level === 2) {
-      handleData._rawValue[1] = node.value;
-    } else if (node.level === 3) {
-      handleData._rawValue[2] = node.value;
-    } else if (node.level === 4) {
-      handleData._rawValue[3] = node.value;
-    } else if (node.level === 5) {
-      handleData._rawValue[4] = node.value;
-    }
-    
-    // console.log(handleData._value);
-    emit("change", handleData._value, node.level)
-  }
-</script>
-
-<style lang="scss" scoped>
-/* 你可以在这里添加一些CSS样式 */
-.one-level-menu {
-  height: 572px;
-  .one-level-icon {
-    width: 24px;
-    height: 12px;
-    color: rgba(51, 51, 51, 1);
-  }
-  .two-level-icon {
-    width: 20px;
-    height: 10px;
-    color: rgba(153, 153, 153, 1);
-  }
-}
-.clicked {
-  color: rgba(0, 79, 189, 1) !important;
-  background: rgba(245, 249, 255, 1);
-}
-.items {
-  background: rgba(245, 249, 255, 1);
-  padding: 2px 20px;
-  border-radius: 8px;
-}
-
-ul {
-  list-style-type: none;
-  padding: 0;
-  overflow-y: auto;
-}
-
-li {
-  /* margin: 8px 0; */
-  /* cursor: pointer; */
-}
-li > div {
-  display: flex;
-  justify-content: space-between;
-  align-items: center;
-}
-
-.one-level-menu > li > div {
-  font-size: 28px;
-  font-weight: 400;
-  line-height: 39.2px;
-  text-align: left;
-  padding: 28px 24px 28px 24px;
-  /* display: flex;
-  justify-content: space-between;
-  align-items: center; */
-}
-.two-level-menu > li > div{
-  font-size: 28px;
-  font-weight: 400;
-  color: rgba(102, 102, 102, 1);
-  line-height: 33.6px;
-  text-align: left;
-  padding: 12px 24px 12px 48px;
-}
-.three-level-menu {
-  padding: 20px 24px 20px 64px;
-  gap: 24px;
-  border: 0px 0px 0.5px 0px;
-  font-size: 28px;
-  font-weight: 400;
-  // line-height: 44px;
-  text-align: left;
-}
-
-</style>

+ 0 - 51
src/views/report/components/EmptyBox.vue

@@ -1,51 +0,0 @@
-<script setup>
-
-const props = defineProps({
-  img: {
-    type: String,
-    default: ''
-  },
-  text: {
-    type: String,
-    default: '暂无内容'
-  }
-})
-
-
-
-</script>
-
-<template>
-  <div class="empty-box">
-    <svg-icon name="empty" class="img"></svg-icon>
-    <div class="text" v-html="props.text"></div>
-  </div>
-</template>
-
-<style lang="scss" scoped>
-.empty-box {
-  text-align: center;
-  padding: 100px 0;
-  .img {
-    width: 335px;
-    height: 380px;
-    margin-bottom: 67px;
-    display: block;
-    margin-left: auto;
-    margin-right: auto;
-  }
-  .text {
-    color: var(--text-color-grey);
-    font-size: var(--font-size-large);
-  }
-}
-@media (min-width: 600px) {
-  .empty-box {
-    padding: 50px 0;
-    .img {
-      width: 177px;
-      margin-bottom: 33px;
-    }
-  }
-}
-</style>

+ 0 - 297
src/views/report/components/Filter.vue

@@ -1,297 +0,0 @@
-<script setup>
-import { ref,computed,watch } from 'vue'
-import apiReport from '@/api/modules/report'
-import CollapsibleList from './CollapsibleList.vue'
-
-const props=defineProps({
-  show:{
-    type:Boolean,
-    default:false
-  },
-  permissionOpts:{
-    type:Array,
-    default:()=>[]
-  },
-  filterClassifyPermissionId:{
-    type:Number,
-    default:0
-  },
-  isPdf:{
-    type:Boolean,
-    default:false
-  },
-  firstPermissionId:{//一级品种id
-    type:Number,
-    default:0,
-  }
-})
-const emits = defineEmits(['update:show', 'updateShowFilter','change'])
-
-function onVisibleChange(e){
-  emits('updateShowFilter', e)
-}
-
-const typeActive=ref('报告分类')
-
-// 发布时间
-const timeFilterOpts = [
-  { name: '一天内', value: 1 }, 
-  { name: '一周内', value: 2 }, 
-  { name: '半年内', value: 3 }
-]
-const activeTime = ref(3)
-const selectedClassifyId = ref('0')
-
-// 报告品种
-const activePermission=ref(0)
-const permissionOpts=computed(()=>{
-  const arr=props.permissionOpts||[]
-  return arr.filter(e=>e.ChartPermissionType===1)
-})
-function handlePermissionChange(e){
-  activePermission.value=e
-}
-
-// 报告分类
-const classifyId=ref([0])
-const classifyOpts=ref([])
-function formatClassify(arr){
-  return arr.map(item => {
-    return {
-      label:item.ClassifyName,
-      value:item.Id,
-      level:item.Level,
-      children:item.Level === 1 && !item.Child.length ? [] : (item.Child.length ? formatClassify(item.Child) : null)
-    }
-  });
-}
-function getReportClassifyList(){
-  apiReport.reportClassifyOpts({
-    ChartPermissionId: props.isPdf?props.firstPermissionId:props.filterClassifyPermissionId,
-  }).then(res=>{
-    if(res.Ret===200){
-      const arr=res.Data||[]
-      classifyOpts.value = formatClassify([
-        {
-          Id:0,
-          ClassifyName:'全部',
-          Level:1,
-          Child:[]
-        },
-        ...arr
-      ])
-      
-    }
-  })
-}
-watch(()=>props.show,()=>{
-  if(props.show){
-    if(props.isPdf){
-      typeActive.value='报告品种'
-    }else{
-      typeActive.value='报告分类'
-    }
-    getReportClassifyList()
-  }
-})
-function handleClassifyChange(e, level){
-  selectedClassifyId.value = e[level - 1]
-}
-
-function handleFilter(type){
-  if(type==='reset'){
-    activeTime.value = 3
-    activePermission.value=0
-    classifyId.value=[0]
-    selectedClassifyId.value = 0
-  }
-  emits('change',{
-    time:activeTime.value,
-    permission:activePermission.value,
-    classifyId:selectedClassifyId.value || 0
-  })
-  onVisibleChange(false)
-}
-
-</script>
-
-<template>
-  <t-popup :visible="props.show" placement="top" @visible-change="onVisibleChange" :close-on-overlay-click="true">
-    <div class="filter-wrap">
-      <!-- <div class="header">
-        <div class="title">全部筛选</div>
-        <t-icon name="close" size="17px" class="close-icon" @click="handleClose"></t-icon>
-      </div> -->
-      <div class="content">
-        <div class="type-wrap">
-          <div 
-            :class="['type-item',typeActive==='报告品种'?'type-item_active':'']" 
-            @click="typeActive='报告品种'"
-            v-if="props.isPdf"
-          >报告品种</div>
-          <div 
-            :class="['type-item',typeActive==='报告分类'?'type-item_active':'']" 
-            @click="typeActive='报告分类'"
-          >报告分类</div>
-          <div 
-            :class="['type-item',typeActive==='发布时间'?'type-item_active':'']" 
-            @click="typeActive='发布时间'"
-          >发布时间</div>
-        </div>
-        <div :class="['context-wrap', typeActive === '发布时间' ? 'type-item_height':'']">
-          <!-- 报告品种 -->
-          <div class="premission-wrap" v-if="typeActive==='报告品种'">
-            <t-radio-group 
-              :value="activePermission" 
-              icon="line" 
-              placement="right" 
-              :options="permissionOpts"
-              :keys="{
-                label:'PermissionName',
-                value:'ChartPermissionId'
-              }"
-              @change="handlePermissionChange"
-            />
-          </div>
-          <!-- 报告分类 -->
-          <div class="classify-wrap" v-if="typeActive==='报告分类'">
-            <!-- <t-tree-select 
-              :options="classifyOpts" 
-              :value="classifyId"
-              @change="handleClassifyChange" 
-            /> -->
-            <CollapsibleList :treeData="classifyOpts" @change="handleClassifyChange" ></CollapsibleList>
-          </div>
-          <!-- 发布时间 -->
-          <div class="time-wrap" v-if="typeActive==='发布时间'">
-            <div class="opts">
-              <div
-                :class="['opt', activeTime === item.value ? 'opt-active' : '']"
-                v-for="item in timeFilterOpts"
-                :key="item.value"
-                @click="activeTime = item.value"
-                >{{ item.name }}</div
-              >
-            </div>
-          </div>
-        </div>
-          
-        
-        
-      </div>
-      <div class="footer">
-        <t-button theme="light" style="flex: 1" @click="handleFilter('reset')">重置</t-button>
-        <t-button theme="primary" style="flex: 4" @click="handleFilter('done')">完成</t-button>
-      </div>
-    </div>
-  </t-popup>
-</template>
-
-<style lang="scss" scoped>
-.filter-wrap {
-  background-color: var(--bg-color);
-  border-top-left-radius: 20px;
-  border-top-right-radius: 20px;
-  .header {
-    text-align: center;
-    position: relative;
-    .title {
-      font-size: var(--font-size-large);
-      line-height: 2;
-    }
-    .close-icon {
-      position: absolute;
-      right: 28px;
-      top: 14px;
-    }
-  }
-  .content {
-    .type-wrap{
-      padding: var(--page-padding);
-      display: flex;
-      align-items: center;
-      gap: 0 30px;
-      border-bottom: 1px solid var(--border-color);
-      .type-item{
-        font-size:var(--font-size-large);
-      }
-      .type-item_active{
-        color: var(--primary-color);
-      }
-    }
-    .context-wrap{
-      height: 572px;
-      // overflow-y: auto;
-      .premission-wrap {
-        height: 572px;
-        overflow-y: auto;
-      }
-    }
-    .type-item_height {
-      height: 388px;
-    }
-    .time-wrap{
-      padding: var(--page-padding);
-      .opts {
-        margin-top: 20px;
-        display: flex;
-        // flex-wrap: wrap;\
-        flex-direction: column;
-        justify-content: center;
-        gap: 20px 40px;
-        .opt {
-          width: 100%;
-          text-align: center;
-          padding: 25px 40px;
-          background-color: var(--bg-grey-color);
-          border-radius: 40px;
-        }
-        .opt-active {
-          background-color: var(--bg-index-page);
-          color: var(--primary-color);
-        }
-      }
-    }
-    
-  }
-  .footer {
-    display: flex;
-    gap: 0 20px;
-    padding: var(--page-padding);
-  }
-}
-
-@media (min-width: 600px){
-  .filter-wrap{
-    border-top-left-radius: 10px;
-    border-top-right-radius: 10px;
-    .header{
-      .close-icon{
-        right: 14px;
-        top: 7px;
-      }
-    }
-    .content{
-      .type-wrap{
-        gap: 0 15px;
-      }
-      .context-wrap{
-        height: 250px;
-      }
-      .time-wrap{
-        .opts{
-          margin-top: 10px;
-          gap: 10px 20px;
-          .opt{
-            padding: 12px 20px;
-            border-radius: 20px;
-          }
-        }
-      }
-    }
-    .footer{
-      gap: 0 10px;
-    }
-  }
-}
-</style>

+ 0 - 117
src/views/report/components/ReportItem.vue

@@ -1,117 +0,0 @@
-<script setup>
-import {computed} from 'vue'
-import { useRouter } from 'vue-router'
-// import dayjs from '@/utils/dayjs.js'
-
-const router = useRouter()
-const props = defineProps({
-  data: {
-    type: Object,
-    default: () => { }
-  },
-  desLine: {//默认展示三行摘要
-    type: Number,
-    default: 3
-  }
-})
-
-async function goDetail(){
-  router.push(`/pushReport/detail?ReportId=${props.data.ReportId}&ReportType=${props.data.ReportType}`)
-}
-
-const title=computed(()=>{
-  return `<div class='report-title_con'>${props.data.Title}</div>`
-})
-
-</script>
-
-<template>
-  <div class="report-item-box" @click="goDetail">
-    <!-- eslint-disable-next-line -->
-    <div class="report-title" v-html="title"></div>
-    <div :class="['text-ellipsis--l' + props.desLine, 'report-des']"
-      >{{props.data.Abstract}}</div
-    >
-    <div class="report-bot">
-      <div class="author">{{props.data.Author}}</div>
-      <div class="bottom">
-        <!-- <text class="time">{{dayjs(props.data.PublishTime).format('YYYY-MM-DD')}}</text> -->
-        <div class="time">{{props.data.PublishTime.substring(0, 10)}}</div>
-        <div class="stage">第{{props.data.Stage}}期</div>
-      </div>
-    </div>
-  </div>
-</template>
-
-<style lang="scss" scoped>
-
-.report-item-box {
-  padding: 30px 30px 20px 30px;
-  margin-bottom: 2PX;
-  background-color: var(--bg-color);
-  .report-title {
-    margin-bottom: 6px;
-    font-size: var(--font-size-huge);
-    :deep(.report-title_color){
-      color: var(--primary-color);
-    }
-    :deep(.report-title_con){
-      overflow: hidden;
-      text-overflow: ellipsis;
-      white-space: nowrap;
-    }
-  }
-  .report-des {
-    margin-top: 4PX;
-    color: var(--text-color-grey);
-    font-size: var(--font-size-small);
-    line-height: 1.5;
-  }
-  .report-bot {
-    display: flex;
-    justify-content: space-between;
-    color: var(--text-color-sub);
-    font-size: var(--font-size-small);
-    padding-top: 8px;
-    .author {
-      width: 60%;
-      // overflow: hidden;
-      // text-overflow: ellipsis;
-      // white-space: nowrap;
-      padding: 4PX 0;
-    }
-    .bottom {
-      display: flex;
-      justify-content: space-between;
-      .time {
-        height: 42px;
-        line-height: 28px;
-        padding: 4PX 6PX;
-      }
-      .stage {
-        height: 42px;
-        line-height: 28px;
-        display: inline-block;
-        background-color: var(--td-primary-color-1);
-        color: var(--primary-color);
-        padding: 4PX 6PX;
-      }
-    }
-  }
-}
-@media (min-width: 600px){
-  .report-item-box{
-    padding: 15px 15px 10px 15px;
-    margin-bottom: 1px;
-    .report-des{
-      margin: 8px 0;
-    }
-    .report-bot{
-      .stage{
-        padding: 2px 3px;
-        margin-left: 10px;
-      }
-    }
-  }
-}
-</style>

+ 1 - 0
vite.config.js

@@ -86,6 +86,7 @@ export default defineConfig(({ mode }) => {
       proxy: {
         "/api": {
           target: "http://8.136.199.33:8709/api",
+          // target: "http://192.168.77.34:8704/api",
           changeOrigin: true,
           rewrite: (path) => path.replace(/^\/api/, ""),
         },