jwyu 2 years ago
parent
commit
954713f4e0

+ 3 - 1
.env.development

@@ -1,3 +1,5 @@
 VITE_APP_API_URL="http://8.136.199.33:8612/api"
 VITE_APP_BASE_URL="/"
-VITE_APP_OUTDIR="dist"
+VITE_APP_OUTDIR="dist"
+VITE_APP_APPID="wx615472d6874eeb7f"
+VITE_APP_REDIRECT_URI="https://hzreport.hzinsights.com/index"

+ 3 - 1
.env.product

@@ -1,3 +1,5 @@
 VITE_APP_API_URL="https://yanbao.hzinsights.com/api"
 VITE_APP_BASE_URL="/"
-VITE_APP_OUTDIR="hongze_yb_pc"
+VITE_APP_OUTDIR="hongze_yb_pc"
+VITE_APP_APPID=""
+VITE_APP_REDIRECT_URI="https://ybpc.hzinsights.com/report/index"

+ 3 - 1
.env.test

@@ -1,3 +1,5 @@
 VITE_APP_API_URL="https://ybpctest.hzinsights.com/api"
 VITE_APP_BASE_URL="/"
-VITE_APP_OUTDIR="hongze_yb_pc"
+VITE_APP_OUTDIR="hongze_yb_pc"
+VITE_APP_APPID=""
+VITE_APP_REDIRECT_URI="https://ybpctest.hzinsights.com/report/index"

+ 10 - 10
src/api/report.js

@@ -102,19 +102,12 @@ export const apiChapterTickerValue=params=>{
 }
 
 /**
- * 研报首页上新公告背景图
+ * 研报首页上新公告
  */
 export const apiReportIndexNewbanner=()=>{
     return get('/pc/banner',{})
 }
 
-/**
- * 研报首页上新公共内容
- */
-export const apiReportIndexNew=params=>{
-    return get('/pc/latest_release',params)
-}
-
 /**
  * 专栏详情中客户评价
  */
@@ -125,6 +118,13 @@ export const apiSpecialColumnComment=params=>{
 /**
  * 首页最新资讯
  */
-export const apiLatestNews=()=>{
-    return get('/pc/latest_news')
+export const apiLatestNews=params=>{
+    return get('/pc/latest_news',params)
+}
+
+/**
+ * 报告详情中更多推荐
+ */
+export const apiReportMoreRecmd=params=>{
+    return get('/pc/recommend',params)
 }

+ 22 - 11
src/components/LoginPop.vue

@@ -1,15 +1,14 @@
 <script setup>
-import { onMounted } from 'vue';
-
-let obj = null
+import { onMounted} from 'vue';
 
 onMounted(()=>{
     // https://hzreport.hzinsights.com/index     wx615472d6874eeb7f  
-    const redirect_uri=encodeURIComponent('https://ybpctest.hzinsights.com')
-    obj=new WxLogin({
-        self_redirect:true,
+    // https://ybpctest.hzinsights.com           wxb059c872d79b9967
+    const redirect_uri=encodeURIComponent(import.meta.env.VITE_APP_REDIRECT_URI)
+    let obj=new WxLogin({
+        self_redirect:false,
         id:"wx-qrcode-box", 
-        appid: "wxb059c872d79b9967", 
+        appid: import.meta.env.VITE_APP_APPID, 
         scope: "snsapi_login", 
         redirect_uri: redirect_uri,
         state: "",
@@ -23,7 +22,9 @@ onMounted(()=>{
 
 <template>
     <div class="login-wrap">
-        <div id="wx-qrcode-box" class="wx-qrcode-box">
+        <div class="content">
+            <!-- <img class="close-icon" src="@/assets/icon-close.png" alt=""> -->
+            <div id="wx-qrcode-box" class="wx-qrcode-box"></div>
         </div>
     </div>
 </template>
@@ -37,16 +38,26 @@ onMounted(()=>{
     top: 0;
     background-color: rgba(0,0,0,0.4);
     z-index: 9999;
-    .wx-qrcode-box{
+    .content{
         position: absolute;
         top: 50%;
         left: 50%;
         transform: translate(-50%,-50%);
+    }
+    .wx-qrcode-box{
+        padding-top: 20px;
         width: 400px;
-        height: 500px;
+        max-height: 500px;
         background-color: #fff;
         border-radius: 16px;
+        text-align: center;
+    }
+    .close-icon{
+        position: absolute;
+        top: 10px;
+        right: 10px;
+        width: 20px;
+        height: 20px;
     }
-
 }
 </style>

+ 1 - 1
src/router/index.js

@@ -36,7 +36,7 @@ const routes=[
         },
       },
       {
-        path:'detail',//query:activityId 活动id
+        path:'detail',//query: id(活动id)
         name:"ActivityDetail",
         component: () => import("@/views/activity/Detail.vue"),
         meta: {

+ 2 - 2
src/store/index.js

@@ -134,12 +134,12 @@ export default createStore({
         //判断路由栈中是否包含当前路由
         let index = -1
         state.breadCrumbList.forEach((item,e) => {
-          if(item.path === data.fullPath){
+          if(item.path === data.path){
             index=e
           }
         });
         if (index==-1) {
-          state.breadCrumbList.push({name:data.meta.title,path:data.fullPath})
+          state.breadCrumbList.push({name:data.meta.title,path:data.path})
         }else{
           const arr=state.breadCrumbList.slice(0,index+1)
           state.breadCrumbList=arr

+ 9 - 0
src/style/global.scss

@@ -151,6 +151,13 @@ img {
   }
 }
 
+//单行省略
+.multi-ellipsis{
+  overflow: hidden;
+  white-space: nowrap;
+  text-overflow: ellipsis;
+}
+
 // 两行省略
 .multi-ellipsis-l2 {
   display: -webkit-box;
@@ -219,6 +226,8 @@ img {
         background: linear-gradient(180deg, #282F4B 0%, #586184 100%);
         box-shadow: 0px 4px 12px 1px rgba(0, 0, 0, 0.06);
         border-radius: 4px;
+        background-size: cover;
+        background-repeat: no-repeat;
       }
     }
 

+ 17 - 1
src/views/report/ChapterDetail.vue

@@ -1,6 +1,6 @@
 <script setup>
 import {ref,onMounted} from 'vue'
-import {apiChapterDetail,apiChapterTickerValue} from '@/api/report'
+import {apiChapterDetail,apiChapterTickerValue,apiReportMoreRecmd} from '@/api/report'
 import {apiApplyPermission} from '@/api/user'
 import {apiGetWechatQRCode} from '@/api/common'
 import { ElMessageBox } from 'element-plus'
@@ -68,6 +68,15 @@ const getTickerValue=async ()=>{
     }
 }
 
+// 侧边栏更多推荐
+let moreRecmdList=ref([])
+const getAsideMoreRecmd=async (reportId)=>{
+    const res=await apiReportMoreRecmd({reportId:Number(reportId)})
+    if(res.code===200){
+        moreRecmdList.value=res.data 
+    }
+}
+
 // 获取章节报告详情
 let info=ref(null)
 let audioData=ref(null)
@@ -107,6 +116,12 @@ const getChapterReportDetail=async ()=>{
                 }
             }
         }
+
+        // 获取侧边更多推荐
+        if(res.data.auth_ok){
+            getAsideMoreRecmd(res.data.report_chapter_item.report_id)
+        }
+
         //向小程序发送分享数据
         const postData={
             path:'/pages-report/chapterDetail',
@@ -208,6 +223,7 @@ const handleGoApply=async ()=>{
 
 let showDisclaimers=ref(false)//显示免责声明
 
+
 </script>
 
 <template>

+ 44 - 14
src/views/report/Detail.vue

@@ -1,19 +1,34 @@
 <script setup>
-import {onMounted, ref} from 'vue'
+import {onMounted, onUpdated, ref} from 'vue'
 import { ElMessageBox } from 'element-plus'
 import moment from 'moment';
 import 'moment/dist/locale/zh-cn'
 import AudioBox from './components/AudioBox.vue'
-import {apiReportDetail} from '@/api/report'
+import {apiReportDetail,apiReportMoreRecmd} from '@/api/report'
 import {apiGetWechatQRCode} from '@/api/common'
 import { useRoute, useRouter } from 'vue-router';
-
+import { useStore } from 'vuex';
 moment.locale('zh-cn')
 
 const route=useRoute()
 const router=useRouter()
+const store=useStore()
 
 let reportId=ref(route.query.reportId||'')
+
+//点击侧边栏更多推荐
+const handleClickAsideRecmd=(item)=>{
+    router.replace({
+        query:{
+            reportId:item.Id
+        }
+    })
+    // 更新页面数据
+    reportId.value=item.Id
+    getReportDetail()
+    getQRCodeImg()
+}
+
 // 获取报告详情
 let info=ref(null)
 let audioData=ref(null)
@@ -32,6 +47,10 @@ const getReportDetail=async ()=>{
             reportId:res.data.report_info.report_id
         }
         document.title = res.data.report_info.classify_name_first
+        if(['晨报','周报'].includes(res.data.report_info.classify_name_first)){
+            store.commit('modifyBreadCrumb',res.data.report_info.classify_name_first)
+        }
+        
         // 获取详情如果为联系销售根据判断条件是否主动申请一次
         if(!res.data.auth_ok){
             if(info.value.permission_check.type=='contact'&&!info.value.permission_check.customer_info.has_apply){
@@ -49,6 +68,12 @@ const getReportDetail=async ()=>{
                 }
             }
         }
+
+        // 获取侧边更多推荐
+        if(res.data.auth_ok){
+            getAsideMoreRecmd(res.data.report_info.report_id)
+        }
+
         //向小程序发送分享数据
         const postData={
             path:'/pages-report/reportDetail',
@@ -64,6 +89,14 @@ const getReportDetail=async ()=>{
 }
 getReportDetail()
 
+// 侧边栏更多推荐
+let moreRecmdList=ref([])
+const getAsideMoreRecmd=async (reportId)=>{
+    const res=await apiReportMoreRecmd({reportId:Number(reportId)})
+    if(res.code===200){
+        moreRecmdList.value=res.data 
+    }
+}
 
 let preViewImgs=ref([])
 let preViewImgIndex=ref(0)
@@ -264,17 +297,14 @@ let showDisclaimers=ref(false)//显示免责声明
                 </div>
                 <div class="recmd-box" style="margin-top: 60px;">
                     <div class="label">更多推荐</div>
-                    <div class="recmd-item">
-                        <div class="title">股债日评</div>
-                        <div>178 | 关注中美领导交流</div>
-                    </div>
-                    <div class="recmd-item">
-                        <div class="title">股债日评</div>
-                        <div>178 | 关注中美领导交流</div>
-                    </div>
-                    <div class="recmd-item">
-                        <div class="title">股债日评</div>
-                        <div>178 | 关注中美领导交流</div>
+                    <div 
+                        class="recmd-item" 
+                        v-for="item in moreRecmdList" 
+                        :key="item.Id"
+                        @click="handleClickAsideRecmd(item)"
+                    >
+                        <div class="title">{{item.ClassifyNameSecond}}</div>
+                        <div>{{item.Stage}} | {{item.Title}}</div>
                     </div>
                 </div>
                 </div>

+ 87 - 58
src/views/report/Index.vue

@@ -3,7 +3,6 @@ import {
   apiReportIndexPageAuthList, 
   apiReportIndexPageList,
   apiReportIndexNewbanner,
-  apiReportIndexNew,
   apiLatestNews 
 } from '@/api/report'
 import { onActivated, onMounted, reactive, ref } from "vue"
@@ -28,6 +27,15 @@ const handleDataToXcx=()=>{
   wx.miniProgram.postMessage({ data: postData })
 }
 
+// 获取最新资讯
+let latestNewsList=ref([])
+const getLatestNews=async ()=>{
+  const res=await apiLatestNews({chart_permission_id:Number(selectSubType.value)})
+  if(res.code===200){
+    latestNewsList.value=res.data||[]
+  }
+}
+
 // 获取顶部权限分类数据
 let authData=reactive({
   isBuy:false,
@@ -115,6 +123,7 @@ const clickSubType = (item) => {
   reportState.finished = false
   getReportList()
   handleShowAuthData(item)
+  getLatestNews()
 }
 
 // 判断是否要为已购用户且点击的品种没有权限
@@ -141,29 +150,48 @@ const onLoad=()=>{
 }
 
 // 获取上新公告
+let newAnnounce=ref(null)
 const getNewAnnounce=async ()=>{
-  const res1=await apiReportIndexNewbanner()
-  if(res1.code===200){
-    const res2=await apiReportIndexNew({ClassifyId:res1.data.ClassifyId})
-  }
-}
-getNewAnnounce()
-
-// 获取最新资讯
-let LatestNewsList=ref([])
-const getLatestNews=async ()=>{
-  const res=await apiLatestNews()
+  const res=await apiReportIndexNewbanner()
   if(res.code===200){
-
+    newAnnounce.value=res.data
   }
 }
-getLatestNews()
+getNewAnnounce()
 
 //跳转至研报分类页
 const handleGoMoreClassify = () => {
   router.push({ path:'/report/classify' });
 };
 
+//点击上新公告
+const handleClickAnnounce=(data)=>{
+  //redirect_type 0活动 1专栏
+  if(data.redirect_type==0){
+    router.push({
+      path:'/activity/detail',
+      query:{
+        id:data.Activity.activityID
+      }
+    })
+  }else{
+    router.push({
+      path:'/report/specialcolumndetail',
+      query:{
+        columnId:data.ReportId
+      }
+    })
+  }
+}
+
+//格式化上新公告中的活动时间
+const formatAnnounceActivityTime=(start,end)=>{
+  const day = moment(start).format('YYYY-MM-DD');
+  const startTime = moment(start).format('HH:mm');
+  const endTime = moment(end).format('HH:mm');
+  return `${day} ${startTime}-${endTime}`
+}
+
 //跳转报告详情
 const handleGoReportDetail=(item)=>{
   if(['晨报','周报'].includes(item.classify_name_first)){
@@ -273,22 +301,26 @@ onActivated(()=>{
       <div class="fix-top" style="z-index: 100;">
         <div class="recmd-box">
           <div class="label">最新资讯</div>
-          <div class="recmd-item">
-            <div class="title">股债日评</div>
-            <div>178 | 关注中美领导交流</div>
-          </div>
-          <div class="recmd-item">
-            <div class="title">股债日评</div>
-            <div>178 | 关注中美领导交流</div>
+          <div 
+            class="recmd-item" 
+            v-for="item in latestNewsList" 
+            :key="item.report_id"
+            @click="handleGoReportDetail(item)"
+          >
+            <div class="title">{{item.classify_name_second}}</div>
+            <div>{{item.stage}} | {{item.title}}</div>
           </div>
-          <div class="recmd-item">
-            <div class="title">股债日评</div>
-            <div>178 | 关注中美领导交流</div>
-          </div>  
         </div>
         <div class="hot-box" style="margin-top: 60px;">
           <div class="label">上新公告</div>
-          <div class="img-con"></div>
+          <div class="img-con" :style="'background-image:url('+newAnnounce.ImgUrl+')'" v-if="newAnnounce">
+            <!-- 活动的话要手搓文字上去 -->
+            <div class="activity-con" v-if="newAnnounce.redirect_type==0" @click="handleClickAnnounce(newAnnounce)">
+              <div class="multi-ellipsis title">{{newAnnounce.Activity.activityTypeName}}</div>
+              <div class="user-name">主讲人: {{newAnnounce.Activity.speaker}}</div>
+              <div class="time">{{formatAnnounceActivityTime(newAnnounce.Activity.startTime,newAnnounce.Activity.endTime)}}</div>
+            </div>
+          </div>
         </div>
       </div>
     </div>
@@ -303,8 +335,6 @@ onActivated(()=>{
 .el-backtop{
   z-index: 1000;
 }
-$bg-color: #f6f6f6;
-$active-color: #f3a52f;
 
 .report-index-page {
   position: relative;
@@ -318,9 +348,11 @@ $active-color: #f3a52f;
       padding-bottom: 12px;
       width: 100%;
       .first-nav {
-        max-width: 1240px;
-        @media (max-width:1200px) {
-          max-width: 55vw;
+        width: calc(100vw - 500px);
+        overflow-x: auto;
+        overflow-y: hidden;
+        &::-webkit-scrollbar{
+          height: 5px;
         }
         .item {
           width: 140px;
@@ -333,14 +365,6 @@ $active-color: #f3a52f;
           font-size: 16px;
           margin-right: 30px;
           cursor: pointer;
-          @media (max-width:1200px) {
-            width: 80px;
-            font-size: 14px;
-            height: 30px;
-            line-height: 30px;
-            margin-right: 15px;
-          }
-
           &:hover {
             background: #FFFBF5;
             color: #F3A52F;
@@ -390,33 +414,19 @@ $active-color: #f3a52f;
 
       .sub-nav {
         margin-top: 30px;
-        overflow-x: scroll;
-
+        overflow-x: auto;
+        overflow-y: hidden;
         &::-webkit-scrollbar {
-          display: none;
-        }
-        max-width: 1240px;
-        @media (max-width:1200px) {
-          max-width: 50vw;
-          &::-webkit-scrollbar {
-            display: block;
-            width: 0px;
-            height: 5px;
-          }
+          height: 5px;
         }
-
+        width: calc(100vw - 500px);
         .sub-item {
           flex-shrink: 0;
           margin-right: 30px;
           font-size: 16px;
           color: #666666;
           cursor: pointer;
-          @media (max-width:1200px){
-            font-size: 14px;
-            margin-right: 15px;
-          }
         }
-
         .sub-active {
           color: #F3A52F;
         }
@@ -441,7 +451,7 @@ $active-color: #f3a52f;
           .all-btn {
             position: absolute;
             right: 20px;
-            bottom: 20px;
+            bottom: 10px;
             width: 88px;
             height: 30px;
             line-height: 30px;
@@ -530,5 +540,24 @@ $active-color: #f3a52f;
     }
 
   }
+  .right-aside-box{
+    .activity-con{
+      padding: 17px 10px;
+      .title{
+        color: #fff;
+        font-size: 16px;
+        font-weight: bold;
+      }
+      .user-name{
+        margin: 5px 0;
+        font-size: 14px;
+        color: #fff;
+      }
+      .time{
+        font-size: 12px;
+        color: #F3A52F;
+      }
+    }
+  }
 }
 </style>

+ 3 - 1
src/views/report/specialColumn/Detail.vue

@@ -122,7 +122,9 @@ onActivated(()=>{
         getSpecialColumnDetail()
         getReportList()
     }else{
-        handleDataToXcx(info.value.classify_name_second)
+        if(info.value){
+            handleDataToXcx(info.value.classify_name_second)
+        }
     }
 })