Browse Source

merge 10.8

bding 1 year ago
parent
commit
9583054d9d
82 changed files with 1343 additions and 572 deletions
  1. 0 1
      .gitignore
  2. 23 3
      activityPages/activityDetail/activityDetail.vue
  3. 71 40
      activityPages/activityDetail/manageMixin.js
  4. 11 3
      activityPages/components/selectMixins.js
  5. 1 0
      activityPages/editOutbound/editOutbound.vue
  6. 1 0
      activityPages/endActivity/endActivity.vue
  7. 1 0
      activityPages/generationAsk/generationAsk.vue
  8. 1 0
      activityPages/playBack/playBack.vue
  9. 1 0
      activityPages/specialDetail/specialDetail.vue
  10. 1 0
      activityPages/specialResearchPage/specialResearchPage.vue
  11. 42 55
      activityPages/themeActivity/themeActivity.vue
  12. 96 67
      components/ItemComponent/activityItem.vue
  13. 81 51
      components/activity/indexActivity.js
  14. 10 4
      components/activity/indexActivity.scss
  15. 206 0
      components/activity/showResearchDlg.vue
  16. 40 0
      components/loadingAll/loadingAll.vue
  17. 1 1
      config/modules/Home.js
  18. 2 2
      config/modules/Reports.js
  19. 3 3
      config/modules/Research.js
  20. 1 1
      config/modules/User.js
  21. 9 1
      config/modules/activity.js
  22. 10 15
      config/request.js
  23. 242 246
      config/util.js
  24. 19 13
      main.js
  25. 1 0
      pageMy/advice/advice.vue
  26. 1 0
      pageMy/applyInterview/applyInterview.vue
  27. 1 0
      pageMy/browseHistory/browseHistory.vue
  28. 1 0
      pageMy/login/login.vue
  29. 1 0
      pageMy/myCollection/myCollection.vue
  30. 1 0
      pageMy/myLeavingMessage/myLeavingMessage.vue
  31. 5 8
      pageMy/myPage/myPage.vue
  32. 6 0
      pageMy/mySchedulepage/mySchedulepage.vue
  33. 1 0
      pageMy/reportDetail/reportDetail.vue
  34. 1 0
      pageMy/reportPage/reportPage.vue
  35. 1 0
      pages-message/activityTemplate/activityTemplate.vue
  36. 1 0
      pages-message/applyFor/applyFor.vue
  37. 1 0
      pages-message/templateMsg/templateMsg.vue
  38. 1 0
      pages-purchaser/ProductQuotation/ProductQuotation.vue
  39. 1 0
      pages-purchaser/newResources/newResources.vue
  40. 1 0
      pages-purchaser/productIntroduction/productIntroduction.vue
  41. 1 0
      pages-purchaser/researchAuthor/researchAuthor.vue
  42. 1 0
      pages-purchaser/researchTheme/researchTheme.vue
  43. 4 0
      pages-search/components/activityBack.vue
  44. 1 0
      pages-search/indedxSearch/indedxSearch.vue
  45. 1 0
      pages-signIn/isSignIn/isSignIn.vue
  46. 30 56
      pages/activity/activity.vue
  47. 2 0
      pages/index/index.vue
  48. 1 0
      pages/material/material.vue
  49. 1 0
      pages/purchaser/purchaser.vue
  50. 2 1
      pages/reportForm/reportForm.vue
  51. 1 0
      reportPages/IndustryReport/IndustryReport.vue
  52. 1 0
      reportPages/authorPages/authorPages.vue
  53. 1 0
      reportPages/companyTabulation/companyTabulation.vue
  54. 1 0
      reportPages/hotList/hotList.vue
  55. 1 0
      reportPages/industrialReport/industrialReport.vue
  56. 1 0
      reportPages/internalDetials/internalDetials.vue
  57. 1 0
      reportPages/internalTesting/internalTesting.vue
  58. 1 0
      reportPages/keyCompany/keyCompany.vue
  59. 1 0
      reportPages/morningAll/morningAll.vue
  60. 1 0
      reportPages/morningDetails/morningDetails.vue
  61. 1 0
      reportPages/myAskPage/myAskPage.vue
  62. 1 0
      reportPages/recentPages/recentPages.vue
  63. 1 0
      reportPages/reportSecretDetail/reportSecretDetail.vue
  64. 1 0
      reportPages/researchTheme/researchTheme.vue
  65. 1 0
      reportPages/roadEssence/roadEssence.vue
  66. 1 0
      reportPages/secretDetails/secretDetails.vue
  67. 10 1
      store/index.js
  68. 1 0
      wxcomponents/vant/dist/cascader/index.d.ts
  69. 208 0
      wxcomponents/vant/dist/cascader/index.js
  70. 8 0
      wxcomponents/vant/dist/cascader/index.json
  71. 53 0
      wxcomponents/vant/dist/cascader/index.wxml
  72. 24 0
      wxcomponents/vant/dist/cascader/index.wxs
  73. 1 0
      wxcomponents/vant/dist/cascader/index.wxss
  74. 1 0
      wxcomponents/vant/dist/config-provider/index.d.ts
  75. 9 0
      wxcomponents/vant/dist/config-provider/index.js
  76. 3 0
      wxcomponents/vant/dist/config-provider/index.json
  77. 5 0
      wxcomponents/vant/dist/config-provider/index.wxml
  78. 29 0
      wxcomponents/vant/dist/config-provider/index.wxs
  79. 8 0
      wxcomponents/vant/dist/field/types.d.ts
  80. 1 0
      wxcomponents/vant/dist/field/types.js
  81. 10 0
      wxcomponents/vant/dist/overlay/overlay.wxml
  82. 14 0
      wxcomponents/vant/dist/popup/popup.wxml

+ 0 - 1
.gitignore

@@ -1,5 +1,4 @@
 unpackage/
 node_modules/
-wxcomponents/
 .Ds_Store
 .hbuilderx

+ 23 - 3
activityPages/activityDetail/activityDetail.vue

@@ -13,7 +13,11 @@
           </view>
           <!-- 内容部分 -->
           <view class="content">
-            <view v-if="detailData.ActivityName" class="dialog-title brackets-title">{{ detailData.ActivityName }}</view>
+            <view v-if="detailData.ActivityName" class="dialog-title brackets-title">
+              <image style="width:83rpx;height:33rpx"  v-if="detailData.IsResearchPoints" src="https://hzchart.oss-cn-shanghai.aliyuncs.com/cygx/Research_Points.png"></image>
+              <image v-if="!detailData.IsResearchPoints && detailData.IsExternalLabel" src="https://hzchart.oss-cn-shanghai.aliyuncs.com/cygx/activity_external.png"></image>
+              {{ detailData.ActivityName }}
+            </view>
             <block v-if="detailData.FileType == 1">
               <view class="audio-card" v-if="detailData.VoiceList && detailData.VoiceList.Url">
                 <view class="slider-paly">
@@ -180,8 +184,11 @@
               <view class="network-left">链接参会:</view>
               <view class="network-right network-zoom" style="color: #2c83ff">
                 <view>
-                  <text class="default text_zoom">{{ detailData.LinkParticipants }}</text>
-                  <view> 点击<text class="default copy-link copy-zoom" @click="copyLink(1)">复制链接</text>在手机浏览器打开,并输入会议密码 </view>
+                  <view class="default text_zoom" v-if="!detailData.IsSignup && detailData.ActivityTypeName == '公司调研电话会' && detailData.IsLimitPeople">请报名获取 </view>
+                  <blcok v-else>
+                    <text class="default text_zoom">{{ detailData.LinkParticipants }}</text>
+                    <view> 点击<text class="default copy-link copy-zoom" @click="copyLink(1)">复制链接</text>在手机浏览器打开,并输入会议密码 </view>
+                  </blcok>
                 </view>
               </view>
             </view>
@@ -314,8 +321,11 @@
           </view>
         </view>
       </van-popup>
+      <!-- 各种弹框部分 -->
+      <ShowResearchDlg :isResearchModalShow.sync="isResearchModalShow" :jurisdictionList="jurisdictionList" :checkResearchList.sync="checkResearchList" />
     </view>
     <not-have-login v-else />
+    <Loading />
   </block>
 </template>
 
@@ -330,6 +340,7 @@ import IsTrackFollow from "@/components/isTrackFollow.vue";
 import SelectPopup from "@/components/activity/selectPopup";
 import NotHaveLogin from "@/components/notHaveLogin.vue";
 import suspenButton from "@/components/suspen_button.vue";
+import ShowResearchDlg from "@/components/activity/showResearchDlg.vue";
 let app = getApp({ allowDefault: true });
 export default {
   filters: {
@@ -378,6 +389,8 @@ export default {
       isSendWx: "",
       isDlgImg: false,
       showSingInImg: false,
+      isResearchModalShow: false,
+      checkResearchList: {},
     };
   },
   mixins: [manageMixin],
@@ -421,6 +434,7 @@ export default {
     SelectPopup,
     NotHaveLogin,
     suspenButton,
+    ShowResearchDlg,
   },
   watch: {
     haveAuth: {
@@ -819,6 +833,12 @@ export default {
       font-weight: bold;
       margin-bottom: 15rpx;
       color: #000;
+      image {
+        width: 83rpx;
+        height: 33rpx;
+        vertical-align: middle;
+        margin-right: 5rpx;
+      }
     }
     .brackets-title {
       padding-left: 20rpx;

+ 71 - 40
activityPages/activityDetail/manageMixin.js

@@ -1,4 +1,5 @@
 import { activity, User } from "@/config/api.js";
+import { isTimeGreaterThanCurrent, isWithinOneHour } from "@/config/util.js";
 let app = getApp();
 export default {
   methods: {
@@ -6,11 +7,18 @@ export default {
     signupIsAddOfCancel(type, valName = "") {
       type = type ? type : valName;
       if (this.detailData.IsSignup == 1) {
-        const str = this.detailData.ActivityTime.replace(/-/g, "/");
-        const date = new Date(str);
-        const times = date.getTime();
-        const num = new Date().getTime();
-        if (times - num <= 3600000) {
+        if (this.detailData.IsResearchPoints) {
+          if (isTimeGreaterThanCurrent(this.detailData.SiginupDeadline)) {
+            uni.showModal({
+              confirmText: "知道了",
+              showCancel: false,
+              confirmColor: "#3385FF",
+              content: "报名名单已提交举办方,若想取消,请联系对口销售",
+            });
+            return;
+          }
+        }
+        if (isWithinOneHour(this.detailData.ActivityTime, 3600000)) {
           uni.showModal({
             confirmText: "知道了",
             showCancel: false,
@@ -47,44 +55,16 @@ export default {
         clearTimeout(timer);
         this.flag = true;
         this.selectShow = false;
-        activity
-          .signupAdd({
-            ActivityId: this.detailData.ActivityId,
-            SignupType: type,
-            PageRouter: this.$store.state.pageRouterActivity,
-          })
-          .then((res) => {
-            if (res.Ret == 200) {
-              this.hasPermission = res.Data.HasPermission;
-              this.jurisdictionList = res.Data;
-              this.signupType = valName == "CClass" ? "CClass" : res.Data.SignupType;
-              this.countryCode = res.Data.CountryCode;
-              this.mobileEdit = res.Data.Mobile;
-              this.goOnNextStep = res.Data.GoFollow;
-              this.idTypeCancel = {
-                cutId: res.Data.ActivityId,
-                state: 1,
-              };
-              if (res.Data.SignupStatus !== "Success") {
-                this.isShow = true;
-              } else {
-                this.detailData.IsSignup = 1;
-                this.detailData.SignupNum += 1;
-                this.detailData.SignupType = type;
-                this.synchronization();
-                if (res.Data.GoBindEmail) this.mailboxBinding = true;
-                if (res.Data.GoOutboundMobile) this.editIsShow = true;
-                else if (res.Data.GoFollow) this.goFollow = res.Data.GoFollow;
-                else if (res.Data.SignupStatus == "Success") this.isShow = true;
-              }
-            }
-          });
+        if (this.detailData.IsResearchPoints) {
+          this.researchPointsHandler(this.detailData.ActivityId, type, this.detailData);
+        } else {
+          this.myIsApplyHandler(this.detailData.ActivityId, type, valName);
+        }
         timer = setTimeout(() => {
           this.flag = false;
         }, 500);
       }
     },
-
     // 预约/取消
     async summaryIsHandel() {
       if (this.detailData.IsAppointment == 0) {
@@ -173,8 +153,9 @@ export default {
     // 我要报名
     wanttosignup() {
       if (
-        (!this.detailData.IsYidongConduct && this.detailData.IsLimitPeople && [1, 2, 3].includes(this.detailData.ActivityTypeId)) ||
-        (this.detailData.IsYidongConduct && this.detailData.IsCanOutboundCall)
+        (!this.detailData.IsResearchPoints && this.detailData.ActivityTypeId == 3 && !this.detailData.IsYidongConduct && this.detailData.IsLimitPeople == 1) ||
+        (this.detailData.IsYidongConduct && this.detailData.IsCanOutboundCall) ||
+        (!this.detailData.IsYidongConduct && this.detailData.IsLimitPeople == 1 && [1, 2].includes(this.detailData.ActivityTypeId))
       ) {
         this.selectShow = true;
         this.selectYdong = this.detailData.IsYidongConduct;
@@ -188,5 +169,55 @@ export default {
         url: "/activityPages/generationAsk/generationAsk?id=" + this.id + "&type=" + type,
       });
     },
+
+    // 研选扣点的事件
+    async researchPointsHandler(id, type, item) {
+      const res = await activity.activityCheck({
+        ActivityId: id,
+      });
+      if (res.Ret === 200) {
+        let { Data } = res;
+        this.checkResearchList = Data;
+        this.checkResearchList.childrenType = type;
+        this.jurisdictionList = item;
+        this.isResearchModalShow = true;
+      }
+    },
+
+    // 报名拆分出来
+    myIsApplyHandler(id, type, valName = "") {
+      activity
+        .signupAdd({
+          ActivityId: this.detailData.ActivityId,
+          SignupType: type,
+          PageRouter: this.$store.state.pageRouterActivity,
+        })
+        .then((res) => {
+          if (res.Ret == 200) {
+            this.hasPermission = res.Data.HasPermission;
+            this.jurisdictionList = res.Data;
+            this.signupType = valName == "CClass" ? "CClass" : res.Data.SignupType;
+            this.countryCode = res.Data.CountryCode;
+            this.mobileEdit = res.Data.Mobile;
+            this.goOnNextStep = res.Data.GoFollow;
+            this.idTypeCancel = {
+              cutId: res.Data.ActivityId,
+              state: 1,
+            };
+            if (res.Data.SignupStatus !== "Success") {
+              this.isShow = true;
+            } else {
+              this.detailData.IsSignup = 1;
+              this.detailData.SignupNum += 1;
+              this.detailData.SignupType = type;
+              this.synchronization();
+              if (res.Data.GoBindEmail) this.mailboxBinding = true;
+              if (res.Data.GoOutboundMobile) this.editIsShow = true;
+              else if (res.Data.GoFollow) this.goFollow = res.Data.GoFollow;
+              else if (res.Data.SignupStatus == "Success") this.isShow = true;
+            }
+          }
+        });
+    },
   },
 };

+ 11 - 3
activityPages/components/selectMixins.js

@@ -11,6 +11,7 @@ export default {
       chartPermissionIds: "",
       whichDay: "", //选择今日/明日\本、上周 月
       selectActiveId: "", //专家、分析师的id
+      ResearchExternalAct: "",
       activityTimeList: [
         { Id: 1, IsChoose: false, StatusName: "今日活动" },
         { Id: 2, IsChoose: false, StatusName: "明日活动" },
@@ -25,6 +26,10 @@ export default {
         { Id: 5, IsChoose: false, StatusName: "本月", type: "month" },
         { Id: 6, IsChoose: false, StatusName: "上月", type: "month" },
       ],
+      ResearchExternal: [
+        { Id: 1, IsChoose: false, StatusName: "研选扣点" },
+        { Id: 2, IsChoose: false, StatusName: "外部资源" },
+      ],
     };
   },
   methods: {
@@ -74,6 +79,7 @@ export default {
     },
     // 是否有权限的点击事件
     async permissioActivity() {
+      this.page_no = 1;
       if (!this.$store.state.isAuth && !this.$store.state.isBind) {
         this.selectComponent("#industry").toggle(false);
         this.isShowJurisdiction = !this.isShowJurisdiction;
@@ -87,11 +93,12 @@ export default {
         }
       } else {
         //已授权未绑定
-        this.$store.dispatch('checkHandle')
+        this.$store.dispatch("checkHandle");
       }
     },
     // 下拉选择的确定事件
     replacementConfirm() {
+      this.page_no = 1;
       const arr = [];
       const str = [];
       this.listChartPermission &&
@@ -113,6 +120,7 @@ export default {
 
     // 下拉的选择的重置事件
     replacementBtn() {
+      this.page_no = 1;
       this.listChartPermission = this.listChartPermissionInit;
       this.chartPermissionIds = "";
       this.isShowJurisdiction = false;
@@ -152,8 +160,8 @@ export default {
         this.selectComponent("#industry").toggle(false);
       }
       item.IsChoose = !item.IsChoose;
-      let val = this.obtainSelectId(type == "类型" ? this.activityTypeList : this.activityTimeList);
-      type == "类型" ? (this.selectActiveId = val) : (this.whichDay = val);
+      let val = this.obtainSelectId(type == "类型" ? this.activityTypeList : type == "扣点" ? this.ResearchExternal : this.activityTimeList);
+      type == "类型" ? (this.selectActiveId = val) : type == "扣点" ? (this.ResearchExternalAct = val) : (this.whichDay = val);
       this.getActivityList();
     },
 

+ 1 - 0
activityPages/editOutbound/editOutbound.vue

@@ -65,6 +65,7 @@
       </view>
     </u-modal>
     <freeCharge class="free-charge" :isShowFreeBtn="isShowFree" />
+    <Loading />
   </view>
 </template>
 

+ 1 - 0
activityPages/endActivity/endActivity.vue

@@ -38,6 +38,7 @@
       <image src="https://hzchart.oss-cn-shanghai.aliyuncs.com/cygx/czbk/act_search.png" mode="" class="nodata_ico"></image>
       <text>暂时没有符合条件的活动</text>
     </view>
+    <Loading />
   </view>
 </template>
 

+ 1 - 0
activityPages/generationAsk/generationAsk.vue

@@ -6,6 +6,7 @@
     </view>
     <view class="btn-cont" @click="submitHandle"> 提交 </view>
     <freeCharge class="free-charge" :isShowFreeBtn="isShowFree" />
+    <Loading />
   </view>
 </template>
 

+ 1 - 0
activityPages/playBack/playBack.vue

@@ -97,6 +97,7 @@
       />
     </view>
     <not-have-login v-else />
+    <Loading />
   </block>
 </template>
 

+ 1 - 0
activityPages/specialDetail/specialDetail.vue

@@ -105,6 +105,7 @@
       </u-modal>
     </view>
     <not-have-login v-else />
+    <Loading />
   </block>
 </template>
 

+ 1 - 0
activityPages/specialResearchPage/specialResearchPage.vue

@@ -89,6 +89,7 @@
       </u-modal>
     </view>
     <not-have-login v-else />
+    <Loading />
   </block>
 </template>
 

+ 42 - 55
activityPages/themeActivity/themeActivity.vue

@@ -7,12 +7,7 @@
           <view :class="['content-title', !contentDetail.IsJump && 'jump-title']" @click="jumpHandler">
             <text class="jump-label">{{ contentDetail.Label }}</text>
             <text v-if="contentDetail.IsJump" class="jump-text"> 查看资源包>></text>
-            <image
-              v-if="contentDetail.IndustryNewLabel"
-              class="new_icon"
-              src="https://hzchart.oss-cn-shanghai.aliyuncs.com/cygx/new_report.png"
-              mode=""
-            ></image>
+            <image v-if="contentDetail.IndustryNewLabel" class="new_icon" src="https://hzchart.oss-cn-shanghai.aliyuncs.com/cygx/new_report.png" mode=""></image>
           </view>
         </view>
         <view :class="['screen-item', (isEndActivity || !type) && 'end-select-item']">
@@ -39,32 +34,17 @@
             </view>
           </block>
           <block v-if="isEndActivity">
-            <text
-              @click="selectMultipleHandler(item, '类型')"
-              v-for="item in activityTypeList"
-              :key="item.Id"
-              :class="['select-item-multiple', item.IsChoose && 'active']"
-              >{{ item.StatusName }}</text
-            >
+            <text @click="selectMultipleHandler(item, '类型')" v-for="item in activityTypeList" :key="item.Id" :class="['select-item-multiple', item.IsChoose && 'active']">{{ item.StatusName }}</text>
           </block>
           <block v-else>
-            <text
-              @click="selectMultipleHandler(item, '日期')"
-              v-for="item in activityTimeList"
-              :key="item.Id"
-              :class="['select-item-multiple', item.IsChoose && 'active']"
-              >{{ item.StatusName }}</text
-            >
+            <text @click="selectMultipleHandler(item, '日期')" v-for="item in activityTimeList" :key="item.Id" :class="['select-item-multiple', item.IsChoose && 'active']">{{ item.StatusName }}</text>
           </block>
         </view>
+        <view class="research-external-item" v-if="!isEndActivity && type && contentDetail.IsShowResearchPoints">
+          <text @click="selectMultipleHandler(item, '扣点')" v-for="item in ResearchExternal" :key="item.Id" :class="['select-item-multiple', item.IsChoose && 'active']">{{ item.StatusName }}</text>
+        </view>
         <view class="screen-item screen-item-ul" v-if="isEndActivity">
-          <text
-            @click="monthWeekHandler(item)"
-            v-for="item in activityMonthWeekList"
-            :key="item.Id"
-            :class="['text-item', item.IsChoose && 'active']"
-            >{{ item.StatusName }}</text
-          >
+          <text @click="monthWeekHandler(item)" v-for="item in activityMonthWeekList" :key="item.Id" :class="['text-item', item.IsChoose && 'active']">{{ item.StatusName }}</text>
         </view>
       </view>
       <!-- 活动列表 -->
@@ -106,7 +86,11 @@
               </view>
               <view class="item">
                 <view class="item-text" @click="goDetail(item)">
-                  <text class="activity-title"> {{ item.ActivityName }} </text>
+                  <view class="activity-title text_twoLine">
+                    <image style="width:83rpx;height:33rpx" v-if="item.IsResearchPoints" src="https://hzchart.oss-cn-shanghai.aliyuncs.com/cygx/Research_Points.png"></image>
+                    <image v-if="!item.IsResearchPoints && item.IsExternalLabel" src="https://hzchart.oss-cn-shanghai.aliyuncs.com/cygx/activity_external.png"></image>
+                    {{ item.ActivityName }}
+                  </view>
                   <text class="text_twoLine" v-if="item.Expert && item.SourceType == 1">专家背景:{{ item.Expert }} </text>
                   <text class="text_twoLine" v-if="item.DistinguishedGuest">嘉宾:{{ item.DistinguishedGuest }} </text>
                   <text class="text_twoLine" v-if="item.Speaker">主讲人:{{ item.Speaker }}</text>
@@ -123,33 +107,23 @@
                         {{ item.City }}
                       </view>
                       <view style="display: flex">
-                        <text v-if="item.IsShowOutboundCall && item.ActivityTypeId == 1" class="button" @click="signupIsAddOfCancel(item, 1)">{{
-                          item.IsSignup == 1 ? "取消外呼" : "预约外呼"
-                        }}</text>
-                        <text v-if="item.IsShowAppointment" @click="summaryIsHandel(item)">{{
-                          item.IsAppointment == 1 ? "取消纪要" : "预约纪要"
-                        }}</text>
+                        <text v-if="item.IsShowOutboundCall && item.ActivityTypeId == 1" class="button" @click="signupIsAddOfCancel(item, 1)">{{ item.IsSignup == 1 ? "取消外呼" : "预约外呼" }}</text>
+                        <text v-if="item.IsShowAppointment" @click="summaryIsHandel(item)">{{ item.IsAppointment == 1 ? "取消纪要" : "预约纪要" }}</text>
                         <text v-if="item.IsShowMeetingReminder" @click="meetingReminderAdd(item.ActivityId, item.IsCancelMeetingReminder)">
                           {{ item.IsCancelMeetingReminder == 0 ? "消息提醒" : "取消提醒" }}
                         </text>
                         <view v-if="item.IsShowHelpSsk" style="width: 130rpx">
                           <text @click="askingGo(item)">帮我带问</text>
                         </view>
-                        <text v-if="item.IsShowOutboundCall && item.ActivityTypeId != 1" class="button" @click="signupIsAddOfCancel(item, 1)">{{
-                          item.IsSignup == 1 ? "取消外呼" : "预约外呼"
-                        }}</text>
+                        <text v-if="item.IsShowOutboundCall && item.ActivityTypeId != 1" class="button" @click="signupIsAddOfCancel(item, 1)">{{ item.IsSignup == 1 ? "取消外呼" : "预约外呼" }}</text>
                         <text v-if="item.IsShowDetails" @click="goDetail(item)" class="button">查看详情</text>
                         <block v-if="item.IsShowSignup">
                           <block v-if="item.IsCClassMeeting && !item.IsYidongConduct">
-                            <text class="button" @click="signupIsAddOfCancel(item, 3, 'CClass')">{{
-                              item.IsSignup == 1 ? "取消报名" : "我要报名"
-                            }}</text>
+                            <text class="button" @click="signupIsAddOfCancel(item, 3, 'CClass')">{{ item.IsSignup == 1 ? "取消报名" : "我要报名" }}</text>
                           </block>
                           <block v-else>
                             <text class="button" v-if="item.IsSignup !== 1" @click="wanttosignup(item)">我要报名</text>
-                            <text class="button" v-else @click="signupIsAddOfCancel(item, 2)">{{
-                              item.SignupType == 1 ? "取消外呼" : "取消报名"
-                            }}</text>
+                            <text class="button" v-else @click="signupIsAddOfCancel(item, 2)">{{ item.SignupType == 1 ? "取消外呼" : "取消报名" }}</text>
                           </block>
                         </block>
                       </view>
@@ -212,6 +186,8 @@
       <videoModule :showVideoPop.sync="showVideoPop" :videoPopList="videoPopList" />
     </view>
     <not-have-login v-else />
+    <ShowResearchDlg :isResearchModalShow.sync="isResearchModalShow" :jurisdictionList="jurisdictionList" :checkResearchList.sync="checkResearchList" />
+    <Loading />
   </block>
 </template>
 
@@ -228,6 +204,7 @@ import videoModule from "@/components/videoModule/index";
 import SelectPopup from "@/components/activity/selectPopup";
 import NotHaveLogin from "../../components/notHaveLogin.vue";
 
+import ShowResearchDlg from "@/components/activity/showResearchDlg.vue";
 export default {
   mixins: [myActivityMixin, selectMixins, mediaMixins],
   data() {
@@ -250,6 +227,7 @@ export default {
     videoModule,
     SelectPopup,
     NotHaveLogin,
+    ShowResearchDlg,
   },
   methods: {
     // 判断几个按钮
@@ -275,6 +253,7 @@ export default {
         WhichDay: this.whichDay,
         ActivityId: this.activityId,
         TypeName: this.selectActiveId,
+        IsResearchPoints: this.ResearchExternalAct,
       });
       if (res.Ret === 200) {
         if (this.type) {
@@ -379,15 +358,7 @@ export default {
   onShareAppMessage: function (res) {
     return {
       title: this.isHorzMobile ? "好友向您推荐此内容,上传名片享查研观向免费月卡!" : this.type || this.label,
-      path:
-        "/activityPages/themeActivity/themeActivity?title=" +
-        this.label +
-        "&permissionIds=" +
-        this.chartPermissionIds +
-        "&whichDay=" +
-        this.whichDay +
-        "&type=" +
-        this.type,
+      path: "/activityPages/themeActivity/themeActivity?title=" + this.label + "&permissionIds=" + this.chartPermissionIds + "&whichDay=" + this.whichDay + "&type=" + this.type,
     };
   },
 };
@@ -440,11 +411,27 @@ export default {
   .collect-ul {
     padding-top: 10rpx;
   }
+  .research-external-item {
+    width: 100%;
+    background-color: #fff;
+    height: 60rpx;
+    padding: 0 34rpx;
+    font-size: 24rpx;
+    margin-top: -15rpx;
+    color: #333;
+    display: flex;
+    align-items: center;
+    .active {
+      background-color: #3385ff !important;
+      color: #fff !important;
+    }
+  }
   .end-select-item {
+    flex-wrap: wrap !important;
     justify-content: flex-start !important;
-    .select-item-multiple {
-      margin-right: 38rpx;
-    }
+  }
+  .select-item-multiple {
+    margin-right: 38rpx;
   }
   @import "../components/selectCss.scss";
   @import "@/components/activity/indexActivity.scss";

+ 96 - 67
components/ItemComponent/activityItem.vue

@@ -2,10 +2,7 @@
   <view class="container-activity-item" @click="goDetail(list)">
     <view class="content-sign">
       <view :class="[list.ActivityType === 0 ? 'is-down' : 'is-up', 'is-up-down']">{{ list.ActivityType === 0 ? "线下" : "线上" }}</view>
-      <view
-        v-if="list.ActiveState == 1 || list.ActiveState == 2"
-        :class="[list.ActiveState == 1 ? 'is-down-state' : 'is-up-state', 'is-up-down', 'state']"
-      >
+      <view v-if="list.ActiveState == 1 || list.ActiveState == 2" :class="[list.ActiveState == 1 ? 'is-down-state' : 'is-up-state', 'is-up-down', 'state']">
         {{ list.ActiveState == 1 ? "未开始" : "进行中" }}
       </view>
       <block v-else>
@@ -14,11 +11,12 @@
     </view>
     <view class="content-type"> {{ list.ActivityTypeName || "专项产业调研" }}</view>
     <view :class="['content-title', 'text-Line', list.ResearchTheme && 'content-min-hight']" v-if="list.ActivityName || list.ResearchTheme">
+      <image style="width:83rpx;height:33rpx" v-if="list.IsResearchPoints" src="https://hzchart.oss-cn-shanghai.aliyuncs.com/cygx/Research_Points.png"></image>
+      <image v-if="!list.IsResearchPoints && list.IsExternalLabel" src="https://hzchart.oss-cn-shanghai.aliyuncs.com/cygx/activity_external.png"></image>
       {{ list.ActivityName || list.ResearchTheme }}
     </view>
     <view style="display: flex" class="content-text content-min-hight text_twoLine" v-if="list.ActivityTimeText && list.SourceType !== 1">
-      <text style="flex-shrink: 0"> 活动时间:</text>
-      <text> {{ list.ActivityTimeText }}</text>
+      <text> 活动时间:{{ list.ActivityTimeText }}</text>
     </view>
     <view class="content-text text-Line" v-else>
       {{ list.Host ? "主持人:" : list.Expert ? "专家背景:" : list.Speaker ? "主讲人:" : list.DistinguishedGuest ? "嘉宾:" : "" }}
@@ -37,9 +35,7 @@
           <text class="item-btn btn-solid" v-if="list.IsShowOutboundCall && list.ActivityTypeId == 1" @click.stop="signupIsAddOfCancel(list, 1)">{{
             list.IsSignup == 1 ? "取消外呼" : "预约外呼"
           }}</text>
-          <text class="item-btn" v-if="list.IsShowAppointment" @click.stop="summaryIsHandel(list)">{{
-            list.IsAppointment == 1 ? "取消纪要" : "预约纪要"
-          }}</text>
+          <text class="item-btn" v-if="list.IsShowAppointment" @click.stop="summaryIsHandel(list)">{{ list.IsAppointment == 1 ? "取消纪要" : "预约纪要" }}</text>
           <text class="item-btn" v-if="list.IsShowMeetingReminder" @click.stop="meetingReminderAdd(list, list.IsCancelMeetingReminder)">
             {{ list.IsCancelMeetingReminder == 0 ? "消息提醒" : "取消提醒" }}
           </text>
@@ -52,15 +48,11 @@
           <text class="item-btn" v-if="list.IsShowDetails" @click.stop="goDetail(list)">查看详情</text>
           <block v-if="list.IsShowSignup">
             <block v-if="list.IsCClassMeeting && !list.IsYidongConduct">
-              <text class="item-btn btn-solid" @click.stop="signupIsAddOfCancel(list, 3, 'CClass')">{{
-                list.IsSignup == 1 ? "取消报名" : "我要报名"
-              }}</text>
+              <text class="item-btn btn-solid" @click.stop="signupIsAddOfCancel(list, 3, 'CClass')">{{ list.IsSignup == 1 ? "取消报名" : "我要报名" }}</text>
             </block>
             <block v-else>
               <text class="item-btn btn-solid" v-if="list.IsSignup !== 1" @click.stop="wanttosignup(list)">我要报名</text>
-              <text class="item-btn btn-solid" v-else @click.stop="signupIsAddOfCancel(list, 2)">{{
-                list.SignupType == 1 ? "取消外呼" : "取消报名"
-              }}</text>
+              <text class="item-btn btn-solid" v-else @click.stop="signupIsAddOfCancel(list, 2)">{{ list.SignupType == 1 ? "取消外呼" : "取消报名" }}</text>
             </block>
           </block>
         </block>
@@ -71,9 +63,7 @@
           <view class="" style="width: 130rpx"> </view>
           <text class="item-btn" @click.stop="lookImg(list)">行程安排</text>
           <block v-if="list.TripStatus == 2">
-            <text v-if="list.ActiveState == 1" class="item-btn btn-solid" @click.stop="applyOfcancel(list)">{{
-              list.IsTrip == 0 ? "我要报名" : "取消报名"
-            }}</text>
+            <text v-if="list.ActiveState == 1" class="item-btn btn-solid" @click.stop="applyOfcancel(list)">{{ list.IsTrip == 0 ? "我要报名" : "取消报名" }}</text>
           </block>
           <block v-else>
             <text class="item-btn btn-solid" v-if="list.IsSignup !== 1" @click.stop="interest(list)">感兴趣</text>
@@ -123,6 +113,7 @@
       </view>
     </u-modal>
     <SelectPopup :selectShow.sync="selectShow" @signupIsAddOfCancel="signupIsAddOfCancel" :selectYdong="selectYdong" />
+    <ShowResearchDlg :isResearchModalShow.sync="isResearchModalShow" :jurisdictionList="jurisdictionList" :checkResearchList.sync="checkResearchList" />
   </view>
 </template>
 
@@ -130,9 +121,12 @@
 import modalDialog from "../modalDialog.vue";
 import { activity, User } from "@/config/api.js";
 import SelectPopup from "@/components/activity/selectPopup";
+import ShowResearchDlg from "@/components/activity/showResearchDlg.vue";
+import { isTimeGreaterThanCurrent, isWithinOneHour } from "@/config/util.js";
+
 export default {
   name: "",
-  components: { modalDialog, SelectPopup },
+  components: { modalDialog, SelectPopup, ShowResearchDlg },
   props: {
     list: {
       type: Object,
@@ -180,6 +174,9 @@ export default {
       show_cancel_button: false, // 取消按钮的隐藏显示
       show_confirm_button: false, // 确定按钮的隐藏显示
       itemData: {},
+      isResearchModalShow: false,
+      checkResearchList: {},
+      addItemData: {},
     };
   },
   computed: {},
@@ -205,8 +202,9 @@ export default {
         this.goDetail(item);
         return;
       } else if (
+        (!item.IsResearchPoints && item.ActivityTypeId == 3 && !item.IsYidongConduct && item.IsLimitPeople == 1) ||
         (item.IsYidongConduct && item.IsCanOutboundCall) ||
-        (!item.IsYidongConduct && item.IsLimitPeople == 1 && [1, 2, 3].includes(item.ActivityTypeId))
+        (!item.IsYidongConduct && item.IsLimitPeople == 1 && [1, 2].includes(item.ActivityTypeId))
       ) {
         this.selectShow = true;
         this.selectYdong = item.IsYidongConduct;
@@ -216,16 +214,23 @@ export default {
       }
     },
 
-    //报名/取消报名
+    //报名 取消报名 预约外呼/取消预约外呼报名
     signupIsAddOfCancel(item, type, valName = "") {
       let id = this.activityIdAdd || item.ActivityId;
-      let itemData = item || this.itemData;
+      this.addItemData = item || this.itemData;
       if (item && item.IsSignup == 1) {
-        const str = item.ActivityTime.replace(/-/g, "/");
-        const date = new Date(str);
-        const times = date.getTime();
-        const num = new Date().getTime();
-        if (times - num <= 3600000) {
+        if (item.IsResearchPoints) {
+          if (isTimeGreaterThanCurrent(item.SiginupDeadline)) {
+            uni.showModal({
+              confirmText: "知道了",
+              showCancel: false,
+              confirmColor: "#3385FF",
+              content: "报名名单已提交举办方,若想取消,请联系对口销售",
+            });
+            return;
+          }
+        }
+        if (isWithinOneHour(item.ActivityTime, 3600000)) {
           uni.showModal({
             confirmText: "知道了",
             showCancel: false,
@@ -246,7 +251,7 @@ export default {
                 PageRouter: this.$store.state.pageRouterActivity,
               });
               if (res.Ret === 200) {
-                this.parentDataEmit(itemData, "IsSignup", 0);
+                this.parentDataEmit(this.addItemData, "IsSignup", 0);
                 this.init();
                 type == 1
                   ? uni.showToast({
@@ -270,45 +275,11 @@ export default {
         clearTimeout(timer);
         this.flag = true;
         this.selectShow = false;
-        activity
-          .signupAdd({
-            ActivityId: id,
-            SignupType: type,
-            PageRouter: this.$store.state.pageRouterActivity,
-          })
-          .then((res) => {
-            if (res.Ret == 200) {
-              this.hasPermission = res.Data.HasPermission;
-              this.jurisdictionList = res.Data;
-              if (this.hasPermission == 1) {
-                this.signupType = valName == "CClass" ? "CClass" : res.Data.SignupType;
-                this.countryCode = res.Data.CountryCode;
-                this.mobileEdit = res.Data.Mobile;
-                this.goOnNextStep = res.Data.GoFollow;
-                this.idTypeCancel = {
-                  cutId: res.Data.ActivityId,
-                  state: 1,
-                };
-                if (res.Data.GoBindEmail) {
-                  this.mailboxBinding = true;
-                  return;
-                }
-                if (res.Data.SignupStatus !== "Success") {
-                  this.isShow = true;
-                } else {
-                  if (res.Data.GoOutboundMobile) this.editIsShow = true;
-                  else if (res.Data.GoFollow) this.goFollow = res.Data.GoFollow;
-                  else if (res.Data.SignupStatus == "Success") this.isShow = true;
-                  this.parentDataEmit(itemData, "IsSignup", 1);
-                  this.parentDataEmit(itemData, "SignupType", type);
-                }
-              } else if (this.hasPermission == 2) {
-                this.isShowhasPermission = true;
-              } else if (this.hasPermission == 3 || this.hasPermission == 4 || this.hasPermission == 5) {
-                this.applyForIsShow = true;
-              }
-            }
-          });
+        if (this.addItemData.IsResearchPoints) {
+          this.researchPointsHandler(id, type, item);
+        } else {
+          this.myIsApplyHandler(id, type, valName);
+        }
         timer = setTimeout(() => {
           this.flag = false;
         }, 500);
@@ -583,6 +554,58 @@ export default {
       let index = this.$parent.newDataList.findIndex((key) => key.Activity && key.Activity.ActivityId === item.ActivityId);
       this.$parent.newDataList[index].Activity[value] = num;
     },
+    // 我要报名的请求拆分出来了
+    async myIsApplyHandler(id, type, valName = "") {
+      const res = await activity.signupAdd({
+        ActivityId: id,
+        SignupType: type,
+        PageRouter: this.$store.state.pageRouterActivity,
+      });
+      if (res.Ret == 200) {
+        this.hasPermission = res.Data.HasPermission;
+        this.jurisdictionList = res.Data;
+        if (this.hasPermission == 1) {
+          this.signupType = valName == "CClass" ? "CClass" : res.Data.SignupType;
+          this.countryCode = res.Data.CountryCode;
+          this.mobileEdit = res.Data.Mobile;
+          this.goOnNextStep = res.Data.GoFollow;
+          this.idTypeCancel = {
+            cutId: res.Data.ActivityId,
+            state: 1,
+          };
+          if (res.Data.GoBindEmail) {
+            this.mailboxBinding = true;
+            return;
+          }
+          if (res.Data.SignupStatus !== "Success") {
+            this.isShow = true;
+          } else {
+            if (res.Data.GoOutboundMobile) this.editIsShow = true;
+            else if (res.Data.GoFollow) this.goFollow = res.Data.GoFollow;
+            else if (res.Data.SignupStatus == "Success") this.isShow = true;
+            this.parentDataEmit(this.addItemData, "IsSignup", 1);
+            this.parentDataEmit(this.addItemData, "SignupType", type);
+          }
+        } else if (this.hasPermission == 2) {
+          this.isShowhasPermission = true;
+        } else if (this.hasPermission == 3 || this.hasPermission == 4 || this.hasPermission == 5) {
+          this.applyForIsShow = true;
+        }
+      }
+    },
+    // 研选扣点的事件
+    async researchPointsHandler(id, type, item) {
+      const res = await activity.activityCheck({
+        ActivityId: id,
+      });
+      if (res.Ret === 200) {
+        let { Data } = res;
+        this.checkResearchList = Data;
+        this.checkResearchList.childrenType = type;
+        this.jurisdictionList = item;
+        this.isResearchModalShow = true;
+      }
+    },
   },
 };
 </script>
@@ -639,6 +662,12 @@ export default {
     font-weight: 400;
     color: #333333;
     line-height: 44rpx;
+    image {
+      width: 83rpx;
+      height: 33rpx;
+      vertical-align: middle;
+      margin-right: 5rpx;
+    }
   }
   .content-text {
     font-size: 28rpx;

+ 81 - 51
components/activity/indexActivity.js

@@ -1,4 +1,5 @@
 import { activity, User } from "@/config/api.js";
+import { isTimeGreaterThanCurrent, isWithinOneHour } from "@/config/util.js";
 let app = getApp();
 export default {
   data() {
@@ -39,6 +40,9 @@ export default {
       mailboxBinding: false, //是否绑定邮箱
       selectShow: false, // 是否显示选择弹框
       selectYdong: false,
+      isResearchModalShow: false,
+      checkResearchList: {},
+      itemData: null,
     };
   },
   methods: {
@@ -49,8 +53,9 @@ export default {
         this.goDetail(item);
         return;
       } else if (
+        (!item.IsResearchPoints && item.ActivityTypeId == 3 && !item.IsYidongConduct && item.IsLimitPeople == 1) ||
         (item.IsYidongConduct && item.IsCanOutboundCall) ||
-        (!item.IsYidongConduct && item.IsLimitPeople == 1 && [1, 2, 3].includes(item.ActivityTypeId))
+        (!item.IsYidongConduct && item.IsLimitPeople == 1 && [1, 2].includes(item.ActivityTypeId))
       ) {
         this.selectShow = true;
         this.selectYdong = item.IsYidongConduct;
@@ -63,13 +68,20 @@ export default {
     //报名/取消报名
     signupIsAddOfCancel(item, type, valName = "") {
       let id = this.activityIdAdd || item.ActivityId;
-      let itemData = item;
+      this.itemData = item;
       if (item && item.IsSignup == 1) {
-        const str = item.ActivityTime.replace(/-/g, "/");
-        const date = new Date(str);
-        const times = date.getTime();
-        const num = new Date().getTime();
-        if (times - num <= 3600000) {
+        if (item.IsResearchPoints) {
+          if (isTimeGreaterThanCurrent(item.SiginupDeadline)) {
+            uni.showModal({
+              confirmText: "知道了",
+              showCancel: false,
+              confirmColor: "#3385FF",
+              content: "报名名单已提交举办方,若想取消,请联系对口销售",
+            });
+            return;
+          }
+        }
+        if (isWithinOneHour(item.ActivityTime, 3600000)) {
           uni.showModal({
             confirmText: "知道了",
             showCancel: false,
@@ -118,50 +130,11 @@ export default {
         clearTimeout(timer);
         this.flag = true;
         this.selectShow = false;
-        activity
-          .signupAdd({
-            ActivityId: id,
-            SignupType: type,
-            PageRouter: this.$store.state.pageRouterActivity,
-          })
-          .then((res) => {
-            if (res.Ret == 200) {
-              this.hasPermission = res.Data.HasPermission;
-              this.jurisdictionList = res.Data;
-              if (this.hasPermission == 1) {
-                const index = this.collectList.findIndex((key) => key.ActivityId == id);
-                this.collectList[index].SignupType = type;
-                this.signupType = valName == "CClass" ? "CClass" : res.Data.SignupType;
-                this.countryCode = res.Data.CountryCode;
-                this.mobileEdit = res.Data.Mobile;
-                this.goOnNextStep = res.Data.GoFollow;
-                this.idTypeCancel = {
-                  cutId: res.Data.ActivityId,
-                  state: 1,
-                };
-                if (res.Data.GoBindEmail) {
-                  this.mailboxBinding = true;
-                  return;
-                }
-                if (res.Data.SignupStatus !== "Success") {
-                  this.isShow = true;
-                } else {
-                  if (res.Data.GoOutboundMobile) this.editIsShow = true;
-                  else if (res.Data.GoFollow) this.goFollow = res.Data.GoFollow;
-                  else if (res.Data.SignupStatus == "Success") this.isShow = true;
-                  this.collectList.forEach((valueAct) => {
-                    if (valueAct.ActivityId === id) {
-                      valueAct.IsSignup = 1;
-                    }
-                  });
-                }
-              } else if (this.hasPermission == 2) {
-                this.isShowhasPermission = true;
-              } else if (this.hasPermission == 3 || this.hasPermission == 4 || this.hasPermission == 5) {
-                this.applyForIsShow = true;
-              }
-            }
-          });
+        if (this.itemData.IsResearchPoints) {
+          this.researchPointsHandler(id, type, item);
+        } else {
+          this.myIsApplyHandler(id, type);
+        }
         timer = setTimeout(() => {
           this.flag = false;
         }, 500);
@@ -319,5 +292,62 @@ export default {
         uni.navigateTo({ url: "/activityPages/activityDetail/activityDetail?id=" + item.ActivityId });
       }
     },
+
+    // 我要报名的请求拆分出来了
+    async myIsApplyHandler(id, type, valName = "") {
+      const res = await activity.signupAdd({
+        ActivityId: id,
+        SignupType: type,
+        PageRouter: this.$store.state.pageRouterActivity,
+      });
+      if (res.Ret == 200) {
+        this.hasPermission = res.Data.HasPermission;
+        this.jurisdictionList = res.Data;
+        if (this.hasPermission == 1) {
+          this.signupType = valName == "CClass" ? "CClass" : res.Data.SignupType;
+          this.countryCode = res.Data.CountryCode;
+          this.mobileEdit = res.Data.Mobile;
+          this.goOnNextStep = res.Data.GoFollow;
+          this.idTypeCancel = {
+            cutId: res.Data.ActivityId,
+            state: 1,
+          };
+          if (res.Data.GoBindEmail) {
+            this.mailboxBinding = true;
+            return;
+          }
+          if (res.Data.SignupStatus !== "Success") {
+            this.isShow = true;
+          } else {
+            if (res.Data.GoOutboundMobile) this.editIsShow = true;
+            else if (res.Data.GoFollow) this.goFollow = res.Data.GoFollow;
+            else if (res.Data.SignupStatus == "Success") this.isShow = true;
+            this.collectList.forEach((valueAct) => {
+              if (valueAct.ActivityId === id) {
+                valueAct.IsSignup = 1;
+                valueAct.SignupType = type;
+              }
+            });
+          }
+        } else if (this.hasPermission == 2) {
+          this.isShowhasPermission = true;
+        } else if (this.hasPermission == 3 || this.hasPermission == 4 || this.hasPermission == 5) {
+          this.applyForIsShow = true;
+        }
+      }
+    },
+    // 研选扣点的事件
+    async researchPointsHandler(id, type, item) {
+      const res = await activity.activityCheck({
+        ActivityId: id,
+      });
+      if (res.Ret === 200) {
+        let { Data } = res;
+        this.checkResearchList = Data;
+        this.checkResearchList.childrenType = type;
+        this.jurisdictionList = item;
+        this.isResearchModalShow = true;
+      }
+    },
   },
 };

+ 10 - 4
components/activity/indexActivity.scss

@@ -108,6 +108,12 @@
           color: #333333;
           font-weight: 700;
           margin-bottom: 20rpx;
+          image {
+            width: 83rpx;
+            height: 33rpx;
+            vertical-align: middle;
+            margin-right: 5rpx;
+          }
         }
       }
     }
@@ -120,14 +126,14 @@
       display: flex;
       justify-content: flex-end;
       align-items: center;
-      color: #3385FF;
+      color: #3385ff;
       overflow: hidden;
       overflow-x: auto;
 
       text {
         display: flex;
         align-items: center;
-        justify-content:center;
+        justify-content: center;
         width: 113rpx;
         height: 42rpx;
         background: #ffffff;
@@ -159,7 +165,7 @@
       .city-img {
         display: flex;
         align-items: center;
-       flex-shrink: 0;
+        flex-shrink: 0;
       }
     }
   }
@@ -220,4 +226,4 @@
       padding: 10rpx 10rpx 20rpx 20rpx;
     }
   }
-}
+}

+ 206 - 0
components/activity/showResearchDlg.vue

@@ -0,0 +1,206 @@
+<template>
+  <view class="show_Research_Dlg">
+    <u-modal
+      ref="modalResearch"
+      async-close
+      v-model="isShow"
+      :content-style="{ fontSize: '32rpx' }"
+      @confirm="confirmModal"
+      :show-cancel-button="!isShowView"
+      :confirm-text="isShowView ? '知道了' : '确定'"
+      cancel-text="取消"
+      @cancel="cancelModal"
+      :show-title="false"
+      :cancel-style="{ borderRight: '1rpx solid #EBEBEB' }"
+      :confirm-style="{ fontWeight: '700' }"
+    >
+      <view class="slot-content">
+        <block v-if="!checkResearchList.CheckPermission"> 签约买方研选套餐才可参与此活动,请联系对口销售 </block>
+        <block v-else-if="!checkResearchList.CheckTime"> <rich-text :nodes="content"></rich-text></block>
+        <block v-else-if="!checkResearchList.CheckPoints">
+          <view class="title-box txt-check">
+            点数不足,若想报名,<br />请联系对口销售
+            <text style="display: inline-block; color: #3385ff" @click="promptTextHandler">升级套餐</text>
+          </view>
+          <view class="content-box">
+            <text>当前剩余点数:</text>
+            <text>{{ checkResearchList.CompanyPoints }}</text>
+          </view>
+          <view class="content-box">
+            <text>本次会议扣除点数:</text>
+            <text>{{ checkResearchList.ActivityPoints }}</text>
+          </view>
+        </block>
+        <block v-else-if="!checkResearchList.CheckEmail">
+          <text class="title-box">应上市公司要求,该会议报名需 提供邮箱,请填写您的工作邮箱</text>
+          <view class="content-input">
+            <input v-model="inputVal" type="text" placeholder="请输入正确的邮箱地址" />
+          </view>
+        </block>
+        <block v-else-if="checkResearchList.CheckPoints">
+          <view class="title-box"> 确定报名参加吗? </view>
+          <view class="content-box">
+            <text>当前剩余点数:</text>
+            <text>{{ checkResearchList.CompanyPoints }}</text>
+          </view>
+          <view class="content-box">
+            <text>本次会议扣除点数:</text>
+            <text>{{ checkResearchList.ActivityPoints }}</text>
+          </view>
+        </block>
+      </view>
+    </u-modal>
+    <u-modal
+      v-model="show"
+      :show-title="false"
+      confirm-text="知道了"
+      :content-style="{ fontSize: '32rpx' }"
+      :cancel-style="{ borderRight: '1rpx solid #EBEBEB' }"
+      :confirm-style="{ fontWeight: '700' }"
+    >
+      <view class="slot-content slot-content-text">
+        <rich-text :nodes="TextContent"></rich-text>
+      </view>
+    </u-modal>
+  </view>
+</template>
+
+<script>
+import { User, activity, FreeButton } from "@/config/api.js";
+export default {
+  data() {
+    return {
+      content: "该活动已截止报名<br />若想参加,请联系对口销售",
+      type: 3,
+      inputVal: "",
+      show: false,
+      TextContent:
+        "5万/年含无限量调研纪要查阅以及15次公开专家访谈或30次重点公司、专家小范围交流;<br /><br />10万/年含无限量调研纪要查阅以及40次公开专家访谈或80次重点公司、专家小范围交流或20次私享专家一对一",
+    };
+  },
+  props: {
+    isResearchModalShow: {
+      default: false,
+      type: Boolean,
+    },
+    checkResearchList: {
+      default: {},
+      type: Object,
+    },
+    jurisdictionList: {
+      default: {},
+      type: Object,
+    },
+  },
+  watch: {},
+  computed: {
+    isShowView() {
+      let list = this.checkResearchList;
+      let isNum = !list.CheckPermission || !list.CheckPoints ? true : false;
+      return isNum;
+    },
+    isShow: {
+      get() {
+        return this.isResearchModalShow;
+      },
+      set() {},
+    },
+  },
+  methods: {
+    cancelModal() {
+      this.$emit("update:isResearchModalShow", false);
+      this.$emit("update:checkResearchList", {});
+    },
+    promptTextHandler() {
+      this.cancelModal();
+      this.$nextTick(() => {
+        this.show = true;
+      });
+    },
+    async confirmModal() {
+      if (!this.checkResearchList.CheckPermission || !this.checkResearchList.CheckTime || !this.checkResearchList.CheckPoints) {
+        this.cancelModal();
+        return;
+      } else if (!this.checkResearchList.CheckEmail) {
+        this.$refs.modalResearch.clearLoading();
+        if (!this.inputVal)
+          return uni.showToast({
+            title: "邮箱不能为空",
+            icon: "none",
+            duration: 2000,
+          });
+        this.cancelModal();
+        const res = await activity.activityEmailBinding({
+          Email: this.inputVal,
+        });
+        if (res.Ret === 200) {
+          this.$parent.researchPointsHandler(this.jurisdictionList.ActivityId, this.checkResearchList.childrenType,this.jurisdictionList);
+        }
+        this.inputVal = "";
+        return;
+      } else if (this.checkResearchList.CheckPoints) {
+        this.$parent.myIsApplyHandler(this.jurisdictionList.ActivityId, this.checkResearchList.childrenType);
+        this.cancelModal();
+        return;
+      }
+    },
+  },
+};
+</script>
+
+<style lang="scss">
+.show_Research_Dlg {
+  .title-box {
+    color: #333333;
+    font-weight: 600;
+    font-size: 32rpx;
+    line-height: 44rpx;
+    margin-bottom: 35rpx;
+  }
+  .content-box {
+    font-weight: 400;
+    font-size: 28rpx;
+    line-height: 44rpx;
+    color: #333333;
+    display: flex;
+    justify-content: center;
+    text:nth-child(2) {
+      color: #3385ff;
+    }
+  }
+  .content-input {
+    display: flex;
+    input {
+      width: 100%;
+      height: 78rpx;
+      line-height: 78rpx;
+      background: #f7f7f7;
+      text-align: left;
+      padding-left: 30rpx;
+    }
+  }
+  .txt-check {
+    text {
+      margin-left: 8rpx;
+    }
+  }
+}
+.slot-content {
+  width: 100%;
+  padding: 50rpx;
+  text-align: center;
+  font-size: 32rpx;
+  color: #0f1826;
+  line-height: 48rpx;
+}
+.slot-content-text {
+  text-align: left;
+}
+.seller-mobile {
+  display: inline-block;
+  color: #2979ff;
+}
+.u-model__footer__button.data-v-3626fcec {
+  border-right: 1rpx solid #333;
+}
+</style>

+ 40 - 0
components/loadingAll/loadingAll.vue

@@ -0,0 +1,40 @@
+<template>
+  <view v-show="loadingShow">
+    <view class="request-loading-view">
+      <!-- <view class="loading-view"><view class="loading"></view></view> -->
+	  <image src="https://hzchart.oss-cn-shanghai.aliyuncs.com/cygx/all-loading.gif"></image>
+    </view>
+  </view>
+</template>
+<script>
+export default {
+  data() {
+    return {};
+  },
+  computed: {
+    //计算属性判断vuex中的显示状态
+    loadingShow() {
+      return this.$store.state.requestLoading;
+    },
+  },
+};
+</script>
+
+<style lang="scss" scoped>
+.request-loading-view {
+  position: fixed;
+  top: 0;
+  left: 0;
+  width: 100%;
+  height: 100%;
+  z-index: 10000;
+  background-color: rgba(0, 0, 0, 0.6);
+  display: flex;
+  justify-content: center;
+  align-items: center;
+  image {
+	width: 270rpx;
+	height: 282rpx;
+  }
+}
+</style>

+ 1 - 1
config/modules/Home.js

@@ -22,7 +22,7 @@ export const Home = {
   },
   /* 微路演列表 */
   microRoadshowList: (params) => {
-    return getHttp("/micro_roadshow/list", params, 0);
+    return getHttp("/micro_roadshow/list", params);
   },
   /* 新增视频播放记录 */
   microAideoHistoryAdd: (params) => {

+ 2 - 2
config/modules/Reports.js

@@ -16,7 +16,7 @@ export const Reports = {
   },
   /* 获取产业报告分类列表接口*/
   getTradeList: (params) => {
-    return getHttp("/report/home/tradeList", params, 0);
+    return getHttp("/report/home/tradeList", params);
   },
   /* 报告搜索接口*/
   getReportSearchReport: (params) => {
@@ -25,7 +25,7 @@ export const Reports = {
 
   /* 获取产业报告分类列表接口*/
   getIndustryList: (params) => {
-    return getHttp("/report/home/industryList", params, 0);
+    return getHttp("/report/home/industryList", params);
   },
   /* 获取产业文章列表接口*/
   getIndustryAndArticle: (params) => {

+ 3 - 3
config/modules/Research.js

@@ -16,7 +16,7 @@ export const Research = {
   },
   /* KOL榜列表接口 */
   researchKolList: (params) => {
-    return getHttp("/research/kolList", params, 0);
+    return getHttp("/research/kolList", params);
   },
   /* 研选作者详情接口 */
   departmentIdDetail: (params) => {
@@ -36,11 +36,11 @@ export const Research = {
   },
   /* 研选最新报告列表 */
   researchArticleNewList: (params) => {
-    return getHttp("/research/article/newList", params, 0);
+    return getHttp("/research/article/newList", params);
   },
   /* KOL榜列表 */
   researchKolList: (params) => {
-    return getHttp("/research/kolList", params, 0);
+    return getHttp("/research/kolList", params);
   },
 
   /* 买方研选产品介绍 */

+ 1 - 1
config/modules/User.js

@@ -80,7 +80,7 @@ export const User = {
   },
   // 埋点
   getUserTracking: (params) => {
-    return getHttp("/user/tracking", params);
+    return getHttp("/user/tracking", params,0);
   },
   //用户搜索记录统计-微路演
   userSearchKeyWordLog: (params) => {

+ 9 - 1
config/modules/activity.js

@@ -106,5 +106,13 @@ export const activity = {
     activityOverActivityList: (params) => {
       return getHttp("/activity/overActivityList", params, 0);
     },
-    
+    // 活动报名之前的校验(权限、时间、点数、邮箱)
+    activityCheck: (params) => {
+      return postHttp("/activity/check", params, 0);
+    },
+    // 更改绑定邮箱
+    activityEmailBinding: (params) => {
+      return postHttp("/user/email/binding", params, 0);
+    },
+   
   };

+ 10 - 15
config/request.js

@@ -1,7 +1,7 @@
 import * as db from "./db.js";
 import { baseUrl } from "./config.js";
 import { User } from "@/config/api.js";
-import { modal } from "@/config/util.js";
+import store from "../store/index.js";
 const showError = (error) => {
   let errorMsg = "";
   switch (error.status) {
@@ -53,15 +53,14 @@ const showError = (error) => {
     },
   });
 };
+
 // get请求
 export const getHttp = (url, data, status = 1) => {
   // 获取用户token和用户信息
   let token = db.get("access_token");
   let authHeader = token || "";
   if (status) {
-    uni.showLoading({
-      title: "加载中",
-    });
+    store.commit("requestShowLoading");
   }
   return new Promise((resolve, reject) => {
     uni.request({
@@ -74,7 +73,7 @@ export const getHttp = (url, data, status = 1) => {
       },
       method: "GET",
       success: (res) => {
-        status && uni.hideLoading();
+        status && store.commit("requestHideLoading");
         // 408 token失效
         if (res.data.Ret === 408) {
           refreshToken(getHttp, url, data, resolve);
@@ -90,14 +89,14 @@ export const getHttp = (url, data, status = 1) => {
         resolve(res.data);
       },
       fail: (error) => {
-        status && uni.hideLoading();
+        status && store.commit("requestHideLoading");
         if (error && error.response) {
           showError(error.response);
         }
       },
       complete: () => {
         setTimeout(() => {
-          status && uni.hideLoading();
+          status && store.commit("requestHideLoading");
         }, 250);
       },
     });
@@ -108,24 +107,20 @@ export const postHttp = (url, data, status = 1) => {
   // 获取用户token和用户信息
   let token = db.get("access_token");
   let authHeader = token || "";
-
   if (status) {
-    uni.showLoading({
-      title: "加载中",
-    });
+    store.commit("requestShowLoading");
   }
   return new Promise((resolve, reject) => {
     uni.request({
       url: baseUrl + url,
       data: data,
       header: {
-        // 'Accept': 'application/json',
         "Content-Type": "application/json",
         Authorization: authHeader,
       },
       method: "POST",
       success: (res) => {
-        status && uni.hideLoading();
+        status && store.commit("requestHideLoading");
         // 408 token失效
         if (res.data.Ret === 408) {
           refreshToken(postHttp, url, data, resolve);
@@ -141,14 +136,14 @@ export const postHttp = (url, data, status = 1) => {
         resolve(res.data);
       },
       fail: (error) => {
-        status && uni.hideLoading();
+        status && store.commit("requestHideLoading");
         if (error && error.response) {
           showError(error.response);
         }
       },
       complete: () => {
         setTimeout(() => {
-          status && uni.hideLoading();
+          status && store.commit("requestHideLoading");
         }, 250);
       },
     });

+ 242 - 246
config/util.js

@@ -1,150 +1,133 @@
-import { get } from './db.js'
+import { get } from "./db.js";
 // 检验手机号格式
-export const checkPhone = (mobile)=> {
-   // return /^1[345678]\d{9}$/.test(mobile);
-   if (mobile.length == 0) {
-      return false;
-   }
-   if (mobile.length != 11) {
-      return false;
-   }
-   // var myreg = /^0?(13[0-9]|15[0-9]|17[013678]|18[0-9]|14[57]|19[0-9]|18[0-9])[0-9]{8}$/;
-   var myreg = /^1(3|4|5|6|7|8|9)\d{9}$/ ;
-   if (!myreg.test(mobile)) {
-      return false;
-   }
-   return true;
-}
+export const checkPhone = (mobile) => {
+  // return /^1[345678]\d{9}$/.test(mobile);
+  if (mobile.length == 0) {
+    return false;
+  }
+  if (mobile.length != 11) {
+    return false;
+  }
+  // var myreg = /^0?(13[0-9]|15[0-9]|17[013678]|18[0-9]|14[57]|19[0-9]|18[0-9])[0-9]{8}$/;
+  var myreg = /^1(3|4|5|6|7|8|9)\d{9}$/;
+  if (!myreg.test(mobile)) {
+    return false;
+  }
+  return true;
+};
 // 密码验证格式
-export const checkPwd = (pwd)=> {
-   if (pwd.length == 0) {
-      return false;
-   }
-   var reg = /^(?![0-9]+$)(?![a-zA-Z]+$)[0-9A-Za-z]{6,16}$/
-   var re = new RegExp(reg)
-   if (re.test(pwd)) {
-      return true;
-   } else {
-      return false;
-   }
-}
+export const checkPwd = (pwd) => {
+  if (pwd.length == 0) {
+    return false;
+  }
+  var reg = /^(?![0-9]+$)(?![a-zA-Z]+$)[0-9A-Za-z]{6,16}$/;
+  var re = new RegExp(reg);
+  if (re.test(pwd)) {
+    return true;
+  } else {
+    return false;
+  }
+};
 //不足位数前面补0
-export const PrefixInteger = (num, length)=> {
-	return (Array(length).join('0') + num).slice(-length)
-}
-/**
- *
- *  判断是否在微信浏览器 true是
- */
-export const isWeiXinBrowser = ()=> {
-	// #ifdef H5
-	// window.navigator.userAgent属性包含了浏览器类型、版本、操作系统类型、浏览器引擎类型等信息,这个属性可以用来判断浏览器类型
-	let ua = window.navigator.userAgent.toLowerCase()
-	// 通过正则表达式匹配ua中是否含有MicroMessenger字符串
-	if (ua.match(/MicroMessenger/i) == 'micromessenger') {
-		return true
-	} else {
-		return false
-	}
-	// #endif
+export const PrefixInteger = (num, length) => {
+  return (Array(length).join("0") + num).slice(-length);
+};
 
-	return false
-}
 //深拷贝
-export const deepCopy = (newobj, obj)=> {
-	if (typeof obj != 'object') {
-		return obj
-	}
-	for (var attr in obj) {
-		var a = {}
-		if (newobj[attr]) {
-			a = newobj[attr]
-		}
-		newobj[attr] = deepCopy(a, obj[attr])
-	}
-	return newobj
-}
+export const deepCopy = (newobj, obj) => {
+  if (typeof obj != "object") {
+    return obj;
+  }
+  for (var attr in obj) {
+    var a = {};
+    if (newobj[attr]) {
+      a = newobj[attr];
+    }
+    newobj[attr] = deepCopy(a, obj[attr]);
+  }
+  return newobj;
+};
 //轻提示
-export const toast = (msg = '', callback = function() {})=> {
-	uni.showToast({
-		title: msg,
-		icon: 'none',
-		duration: 1000,
-		success() {
-			setTimeout(function() {
-				callback()
-			}, 1500)
-		}
-	})
-
-}
+export const toast = (msg = "", callback = function () {}) => {
+  uni.showToast({
+    title: msg,
+    icon: "none",
+    duration: 1000,
+    success() {
+      setTimeout(function () {
+        callback();
+      }, 1500);
+    },
+  });
+};
 /* 弹窗 */
-export const modal = (title='',content,callback = function() {}) => {
-	uni.showModal({
-	   title: title,
-	    content: content,
-		 confirmColor:'#3385FF',
-	    success: function (res) {
-	        if (res.confirm) {
-	            callback()
-	        } else if (res.cancel) {
-	        }
-	    }
-	});
-}
+export const modal = (title = "", content, callback = function () {}) => {
+  uni.showModal({
+    title: title,
+    content: content,
+    confirmColor: "#3385FF",
+    success: function (res) {
+      if (res.confirm) {
+        callback();
+      } else if (res.cancel) {
+      }
+    },
+  });
+};
 /* 弹窗 */
-export const modalShow = (title='',content,confirm,callback = function() {}) => {
-	uni.showModal({
-	   title: title,
-	    content: content,
-        showCancel: false,
-        confirmText:confirm==''?'确定':'知道了',
-		confirmColor:'#3385FF',
-	    success: function (res) {
-	        if (res.confirm) {
-	            callback()
-	        } else if (res.cancel) {
-	        }
-	    }
-	});
-}
+export const modalShow = (title = "", content, confirm, callback = function () {}) => {
+  uni.showModal({
+    title: title,
+    content: content,
+    showCancel: false,
+    confirmText: confirm == "" ? "确定" : "知道了",
+    confirmColor: "#3385FF",
+    success: function (res) {
+      if (res.confirm) {
+        callback();
+      } else if (res.cancel) {
+      }
+    },
+  });
+};
 /* 处理时间格式 */
-export const dateFormatter = (str,bol=false,bol2=false) => { //默认返回yyyy-MM-dd HH-mm-ss
-    var dateStr = String(str);
-    if(!(dateStr.indexOf('-')>-1 && dateStr.indexOf('T')>-1)){
-        dateStr = dateStr.replace(/\-/g,'/');
+export const dateFormatter = (str, bol = false, bol2 = false) => {
+  //默认返回yyyy-MM-dd HH-mm-ss
+  var dateStr = String(str);
+  if (!(dateStr.indexOf("-") > -1 && dateStr.indexOf("T") > -1)) {
+    dateStr = dateStr.replace(/\-/g, "/");
+  }
+  var d = new Date(dateStr);
+  var year = d.getFullYear();
+  var month = d.getMonth() + 1 < 10 ? "0" + (d.getMonth() + 1) : d.getMonth() + 1;
+  var day = d.getDate() < 10 ? "0" + d.getDate() : d.getDate();
+  var hour = d.getHours() < 10 ? "0" + d.getHours() : d.getHours();
+  var minute = d.getMinutes() < 10 ? "0" + d.getMinutes() : d.getMinutes();
+  var second = d.getSeconds() < 10 ? "0" + d.getSeconds() : d.getSeconds();
+  if (bol) {
+    if (bol2) {
+      return `${month}月${day}日 ${hour}时${minute}分${second}秒`;
     }
-	var d = new Date(dateStr);
-	var year = d.getFullYear();
-	var month = (d.getMonth() + 1) < 10 ? '0' + (d.getMonth() + 1) : (d.getMonth() + 1);
-	var day = d.getDate() < 10 ? '0' + d.getDate() : d.getDate();
-	var hour = d.getHours() < 10 ? '0' + d.getHours() : d.getHours();
-	var minute = d.getMinutes() < 10 ? '0' + d.getMinutes() : d.getMinutes();
-	var second = d.getSeconds() < 10 ? '0' + d.getSeconds() : d.getSeconds();
-	if(bol) {
-        if(bol2){
-            return `${month}月${day}日 ${hour}时${minute}分${second}秒`; 
-        }
-        return [year, month, day].join('-') + " " + [hour, minute, second].join(':');
-	} else {
-        if(bol2){
-            return `${month}月${day}日`; 
-        }
-		return [year, month, day].join('-');
-	}
-}
+    return [year, month, day].join("-") + " " + [hour, minute, second].join(":");
+  } else {
+    if (bol2) {
+      return `${month}月${day}日`;
+    }
+    return [year, month, day].join("-");
+  }
+};
 //加载显示
-export const loading = (msg = '加载中')=> {
-	uni.showToast({
-		title: msg,
-		icon: 'loading'
-	})
-}
+export const loading = (msg = "加载中") => {
+  uni.showToast({
+    title: msg,
+    icon: "loading",
+  });
+};
 
 //加载隐藏
-export const loadHide = ()=> {
-	uni.hideToast();
-}
+export const loadHide = () => {
+  uni.hideToast();
+};
 
 /**
  * 函数防抖 (只执行最后一次点击)
@@ -153,18 +136,18 @@ export const loadHide = ()=> {
  * @returns {Function}
  * @constructor
  */
-export const Debounce = (fn, t=300) => {
+export const Debounce = (fn, t = 300) => {
   let timer;
   return function () {
     let args = arguments;
-    if(timer){
+    if (timer) {
       clearTimeout(timer);
     }
     timer = setTimeout(() => {
       timer = null;
       fn.apply(this, args);
     }, t);
-  }
+  };
 };
 /**
  * 函数节流
@@ -173,7 +156,7 @@ export const Debounce = (fn, t=300) => {
  * @returns {Function}
  * @constructor
  */
-export const Throttle = (fn, t=500) => {
+export const Throttle = (fn, t = 500) => {
   let last;
   let timer;
   return function () {
@@ -189,114 +172,127 @@ export const Throttle = (fn, t=500) => {
       last = now;
       fn.apply(this, args);
     }
-  }
-}
+  };
+};
 
 // 上传图片封装
-export const upload = ({
-	/* 单张上传 */
-   Single: function (Funurl, fn) {
-		// 获取用户token和用户信息
-		let token = get("access_token");
-		let authHeader = token || '';
-      uni.chooseImage({
-         count: 1, ///最多可以选择一张图片
-         sizeType: ['original', 'compressed'],//原图或压缩图
-         sourceType: ['album', 'camera'],//图片来源
-         success: function (res) {
-            const tempFilePaths = res.tempFilePaths;//相当于src路径
+export const upload = {
+  /* 单张上传 */
+  Single: function (Funurl, fn) {
+    // 获取用户token和用户信息
+    let token = get("access_token");
+    let authHeader = token || "";
+    uni.chooseImage({
+      count: 1, ///最多可以选择一张图片
+      sizeType: ["original", "compressed"], //原图或压缩图
+      sourceType: ["album", "camera"], //图片来源
+      success: function (res) {
+        const tempFilePaths = res.tempFilePaths; //相当于src路径
+        uni.showToast({
+          title: "正在上传...",
+          icon: "loading",
+          mask: true,
+          duration: 10000,
+        });
+        uni.uploadFile({
+          header: {
+            "Content-Type": "multipart/form-data",
+            Authorization: authHeader,
+          },
+          name: "file",
+          url: Funurl,
+          filePath: tempFilePaths[0],
+          success(res) {
+            fn(res);
+            uni.hideToast();
             uni.showToast({
-               title: '正在上传...',
-               icon: 'loading',
-               mask: true,
-               duration: 10000
-            })
-            uni.uploadFile({
-               header: {
-                  "Content-Type": "multipart/form-data",
-						'Authorization':authHeader
-               },
-               name: 'file',
-               url: Funurl,
-               filePath: tempFilePaths[0],
-               success(res) {
-                  fn(res);
-                  uni.hideToast();
-                  uni.showToast({
-                     title: '上传成功',
-                     icon: 'none',
-                     mark: true,
-                  })
-               },
-               fail(err) {
-                  uni.hideToast();
-                  uni.showModal({
-                     title: '错误提示',
-                     content: '上传图片失败'+err,
-                     showCancel: false,
-                     success: function (res) { }
-                  })
-               }
-            })
-         },
-      })
-   },
-   //上传多张图片
-   Much: function (Funurl, fn, count) {
-		// 获取用户token和用户信息
-		let token = get("access_token");
-		let authHeader = token || '';
-      var list = new Array();
-      uni.chooseImage({
-         count: count,//最多可以选择3张图
-         sizeType: ['original', 'compressed'],
-         sourceType: ['album', 'camera'],
-         success: function (res) {
-            const tempFilePaths = res.tempFilePaths;
-            let uploadImgCount = 0;
-            uni.showToast({
-               title: '正在上传...',
-               icon: 'loading',
-               mask: true,
-               duration: 10000
-            })
-            for (var i = 0; i < tempFilePaths.length; i++) {
-               uni.uploadFile({
-                  url: Funurl,
-                  name: 'file',
-                  filePath: tempFilePaths[i],//第几张图片
-                  header: {
-                     "Content-Type": "multipart/form-data",
-							'Authorization':authHeader
-                  },
-                  success(res) {
-                     uploadImgCount++;
-								fn(res);
-                      //如果是最后一张,则隐藏等待中  
-                     if (uploadImgCount === tempFilePaths.length) {
-                        uni.hideToast();
-                        // uni.showToast({
-                        //    title: '上传图片成功',
-                        //    icon: 'none',
-                        //    mark: true,
-                        // })
-                     }else {
-								that.upload(imgs)
-							}
-                  },
-                  fail(res) {
-                     uni.hideToast();
-                     uni.showModal({
-                        title: '错误提示',
-                        content: '上传图片失败',
-                        showCancel: false,
-                        success: function (res) { }
-                     })
-                  }
-               })
-            }
-         },
-      })
-   }
-})
-
+              title: "上传成功",
+              icon: "none",
+              mark: true,
+            });
+          },
+          fail(err) {
+            uni.hideToast();
+            uni.showModal({
+              title: "错误提示",
+              content: "上传图片失败" + err,
+              showCancel: false,
+              success: function (res) {},
+            });
+          },
+        });
+      },
+    });
+  },
+  //上传多张图片
+  Much: function (Funurl, fn, count) {
+    // 获取用户token和用户信息
+    let token = get("access_token");
+    let authHeader = token || "";
+    var list = new Array();
+    uni.chooseImage({
+      count: count, //最多可以选择3张图
+      sizeType: ["original", "compressed"],
+      sourceType: ["album", "camera"],
+      success: function (res) {
+        const tempFilePaths = res.tempFilePaths;
+        let uploadImgCount = 0;
+        uni.showToast({
+          title: "正在上传...",
+          icon: "loading",
+          mask: true,
+          duration: 10000,
+        });
+        for (var i = 0; i < tempFilePaths.length; i++) {
+          uni.uploadFile({
+            url: Funurl,
+            name: "file",
+            filePath: tempFilePaths[i], //第几张图片
+            header: {
+              "Content-Type": "multipart/form-data",
+              Authorization: authHeader,
+            },
+            success(res) {
+              uploadImgCount++;
+              fn(res);
+              //如果是最后一张,则隐藏等待中
+              if (uploadImgCount === tempFilePaths.length) {
+                uni.hideToast();
+                // uni.showToast({
+                //    title: '上传图片成功',
+                //    icon: 'none',
+                //    mark: true,
+                // })
+              } else {
+                that.upload(imgs);
+              }
+            },
+            fail(res) {
+              uni.hideToast();
+              uni.showModal({
+                title: "错误提示",
+                content: "上传图片失败",
+                showCancel: false,
+                success: function (res) {},
+              });
+            },
+          });
+        }
+      },
+    });
+  },
+};
+// 判断是否大于当前时间
+export const isTimeGreaterThanCurrent = (timeToCheck) => {
+  const time = new Date(timeToCheck)
+  const currentTime = new Date();
+  return time.getTime() < currentTime.getTime();
+};
+// 判断离结束时间 是否大于指定时间
+export const isWithinOneHour = (activityTime,endTime) => {
+  const str = activityTime.replace(/-/g, "/");
+  const date = new Date(str);
+  const times = date.getTime();
+  const num = new Date().getTime();
+  return times - num <= endTime;
+};

+ 19 - 13
main.js

@@ -1,21 +1,27 @@
-import Vue from 'vue'
-import App from './App'
-import store from './store'
-import * as Db from './config/db.js';//缓存操作
-import * as Util from './config/util.js';//通用方法
+import Vue from "vue";
+import App from "./App";
+import store from "./store";
+import * as Db from "./config/db.js"; //缓存操作
+import * as Util from "./config/util.js"; //通用方法
 import uView from "uview-ui";
-import indexMixin from './mixin'
+import indexMixin from "./mixin";
+import Loading from "./components/loadingAll/loadingAll.vue";
 Vue.use(uView);
 
-Vue.config.productionTip = false
+//请求加载组件
+
+//组件挂载到全局,方便每个页面使用
+Vue.component("Loading", Loading);
+
+Vue.config.productionTip = false;
 Vue.prototype.$store = store;
 Vue.prototype.$db = Db;
 Vue.prototype.$util = Util;
 Vue.prototype.$global = App.globalData;
-App.mpType = 'app'
-Vue.mixin(indexMixin)
+App.mpType = "app";
+Vue.mixin(indexMixin);
 const app = new Vue({
-   ...App,
-	store
-})
-app.$mount()
+  ...App,
+  store,
+});
+app.$mount();

+ 1 - 0
pageMy/advice/advice.vue

@@ -18,6 +18,7 @@
     </view>
     <view class="btn-cont" @click="submitHandle"> 提交 </view>
     <freeCharge class="free-charge" :isShowFreeBtn="isShowFree" />
+    <Loading />
   </view>
 </template>
 

+ 1 - 0
pageMy/applyInterview/applyInterview.vue

@@ -19,6 +19,7 @@
       <text>暂时没有访谈申请的内容</text>
     </view>
     <freeCharge class="free-charge" :isShowFreeBtn="isShowFree" />
+    <Loading />
   </view>
 </template>
 

+ 1 - 0
pageMy/browseHistory/browseHistory.vue

@@ -38,6 +38,7 @@
       <text>暂时没有浏览历史</text>
     </view>
     <freeCharge class="free-charge" :isShowFreeBtn="isShowFree" />
+    <Loading />
   </view>
 </template>
 

+ 1 - 0
pageMy/login/login.vue

@@ -50,6 +50,7 @@
         <view class="box box-bottom" style="color: #a9afb8" @click="cancel">取消</view>
       </u-popup>
     </view>
+    <Loading />
   </view>
 </template>
 

+ 1 - 0
pageMy/myCollection/myCollection.vue

@@ -58,6 +58,7 @@
       <text>暂时没有收藏的内容</text>
     </view>
     <freeCharge class="free-charge" :isShowFreeBtn="isShowFree" />
+    <Loading />
   </view>
 </template>
 

+ 1 - 0
pageMy/myLeavingMessage/myLeavingMessage.vue

@@ -19,6 +19,7 @@
       <image src="https://hzchart.oss-cn-shanghai.aliyuncs.com/cygx/czbk/act_search.png" mode="" class="nodata_ico"></image>
       <text>暂时没有留言的内容</text>
     </view>
+    <Loading />
   </view>
 </template>
 

+ 5 - 8
pageMy/myPage/myPage.vue

@@ -1,10 +1,7 @@
 <template>
   <view class="container my-container" v-if="haveData">
     <view class="top-content-box">
-      <view
-        class="nav-bar-wrap"
-        :style="{ height: navBarStyle.height, paddingTop: navBarStyle.paddingTop, paddingBottom: navBarStyle.paddingBottom }"
-      >
+      <view class="nav-bar-wrap" :style="{ height: navBarStyle.height, paddingTop: navBarStyle.paddingTop, paddingBottom: navBarStyle.paddingBottom }">
         <van-icon custom-class="search-icon" name="arrow-left" size="24px" @click="goBack" />
       </view>
     </view>
@@ -66,9 +63,7 @@
           <text>{{ type }}</text>
           <view class="my-bot-box">
             <block v-if="type == '外呼号码'">
-              <text v-if="userInfo.OutboundCountryCode && userInfo.OutboundMobile" style="margin-right: 40rpx; font-size: 28rpx"
-                >{{ userInfo.OutboundCountryCode }}-{{ userInfo.OutboundMobile }}</text
-              >
+              <text v-if="userInfo.OutboundCountryCode && userInfo.OutboundMobile" style="margin-right: 40rpx; font-size: 28rpx">{{ userInfo.OutboundCountryCode }}-{{ userInfo.OutboundMobile }}</text>
               <text v-else style="margin-right: 40rpx; font-size: 28rpx">未设置</text>
             </block>
             <block v-if="type == '关注公众号'">
@@ -89,6 +84,7 @@
     </view>
 
     <freeCharge class="free-charge" :isShowFreeBtn="isShowFree" />
+    <Loading />
   </view>
 </template>
 
@@ -355,6 +351,7 @@ export default {
   }
   .my-info {
     position: absolute;
+    background: #f9f9f9;
     top: 301rpx;
     left: 50%;
     transform: translateX(-50%);
@@ -509,7 +506,7 @@ export default {
     z-index: 9;
     font-size: 20rpx;
     color: #999999;
-    width: 100%;
+    width:100%;
     text-align: center;
   }
   .not-bind-login {

+ 6 - 0
pageMy/mySchedulepage/mySchedulepage.vue

@@ -128,6 +128,8 @@
       <audioModule :showAudioPop.sync="showAudioPop" />
     </view>
     <videoModule :showVideoPop.sync="showVideoPop" :videoPopList="videoPopList" />
+    <ShowResearchDlg :isResearchModalShow.sync="isResearchModalShow" :jurisdictionList="jurisdictionList" :checkResearchList.sync="checkResearchList" />
+    <Loading />
   </view>
 </template>
 
@@ -141,6 +143,7 @@ import audioModule from "@/components/audioModule/index";
 import mediaMixins from "@/components/activity/mediaMixins";
 import videoModule from "@/components/videoModule/index";
 import SelectPopup from "@/components/activity/selectPopup";
+import ShowResearchDlg from "@/components/activity/showResearchDlg.vue";
 
 let app = getApp();
 export default {
@@ -151,6 +154,7 @@ export default {
     audioModule,
     videoModule,
     SelectPopup,
+    ShowResearchDlg,
   },
   data() {
     return {
@@ -164,6 +168,8 @@ export default {
       listChartPermission: [],
       listChartPermissionInit: [],
       collectTypeList: [],
+      isResearchModalShow: false,
+      checkResearchList: {},
     };
   },
   methods: {

+ 1 - 0
pageMy/reportDetail/reportDetail.vue

@@ -63,6 +63,7 @@
       </view>
     </view>
     <not-have-login v-else />
+    <Loading />
   </block>
 </template>
 

+ 1 - 0
pageMy/reportPage/reportPage.vue

@@ -89,6 +89,7 @@
       </view>
     </view>
     <not-have-login v-else />
+    <Loading />
   </block>
 </template>
 

+ 1 - 0
pages-message/activityTemplate/activityTemplate.vue

@@ -17,6 +17,7 @@
       <image src="https://hzchart.oss-cn-shanghai.aliyuncs.com/cygx/czbk/act_search.png" mode="" class="nodata_ico"></image>
       <text>无名下客户报名本场活动</text>
     </view>
+    <Loading />
   </view>
 </template>
 

+ 1 - 0
pages-message/applyFor/applyFor.vue

@@ -22,6 +22,7 @@
       </view>
       <image class="card-box" :src="detaList.BusinessCardUrl" @click="lookImage"></image>
     </blcok>
+    <Loading />
   </view>
 </template>
 

+ 1 - 0
pages-message/templateMsg/templateMsg.vue

@@ -6,6 +6,7 @@
     <view class="ButtonText" @click="routerHandler">
       {{ textData.ButtonText }}
     </view>
+    <Loading />
   </view>
 </template>
 

+ 1 - 0
pages-purchaser/ProductQuotation/ProductQuotation.vue

@@ -8,6 +8,7 @@
       :src="item.Img"
       :lazy-load="true"
     ></image>
+    <Loading />
   </view>
 </template>
 

+ 1 - 0
pages-purchaser/newResources/newResources.vue

@@ -8,6 +8,7 @@
     </view>
     <image class="img-bg" :src="imgList.HbImg"> </image>
     <image @click="goPage" class="img-btn" :style="{ width: '368rpx', bottom: '15%' }" :src="imgList.ButtonImg"> </image>
+    <Loading />
   </view>
 </template>
 

+ 1 - 0
pages-purchaser/productIntroduction/productIntroduction.vue

@@ -3,6 +3,7 @@
     <scroll-view scroll-y>
       <image v-for="(item, index) in imgList" :style="{ height: item.Height + 'rpx' }" :key="index" :src="item.Img" :lazy-load="true"></image>
     </scroll-view>
+    <Loading />
   </view>
 </template>
 

+ 1 - 0
pages-purchaser/researchAuthor/researchAuthor.vue

@@ -36,6 +36,7 @@
         <rich-text :nodes="accounts"></rich-text>
       </view>
     </u-modal>
+    <Loading />
   </view>
 </template>
 

+ 1 - 0
pages-purchaser/researchTheme/researchTheme.vue

@@ -38,6 +38,7 @@
         <rich-text :nodes="accounts"></rich-text>
       </view>
     </u-modal>
+    <Loading />
   </view>
 </template>
 

+ 4 - 0
pages-search/components/activityBack.vue

@@ -145,6 +145,7 @@
         <rich-text v-else :nodes="specialAccounts"></rich-text>
       </view>
     </u-modal>
+    <ShowResearchDlg :isResearchModalShow.sync="isResearchModalShow" :jurisdictionList="jurisdictionList" :checkResearchList.sync="checkResearchList" />
   </view>
 </template>
 
@@ -158,6 +159,8 @@ import audioModule from "@/components/audioModule/index";
 import videoModule from "@/components/videoModule/index";
 import { activity } from "@/config/api";
 import SelectPopup from "@/components/activity/selectPopup";
+import ShowResearchDlg from "@/components/activity/showResearchDlg.vue";
+
 export default {
   props: {
     collectLists: {
@@ -194,6 +197,7 @@ export default {
     audioModule,
     videoModule,
     SelectPopup,
+    ShowResearchDlg,
   },
   watch: {
     collectLists: {

+ 1 - 0
pages-search/indedxSearch/indedxSearch.vue

@@ -137,6 +137,7 @@
       </view>
     </view>
     <not-have-login v-else />
+    <Loading />
   </block>
 </template>
 

+ 1 - 0
pages-signIn/isSignIn/isSignIn.vue

@@ -4,6 +4,7 @@
       <upload-contact v-if="!isBindMobile" :codeId="codeId" :itemDetail="dataDetail" @getDetail="getDetail" />
       <signInItem :itemDetail="dataDetail" v-else />
     </view>
+    <Loading />
   </view>
 </template>
 

+ 30 - 56
pages/activity/activity.vue

@@ -32,9 +32,7 @@
             </van-dropdown-item>
           </van-dropdown-menu>
         </view>
-        <text v-for="item in activityTimeList" :key="item.Id" :class="item.IsChoose ? 'active' : ''" @click="isActivityDate(item.Id)">{{
-          item.StatusName
-        }}</text>
+        <text v-for="item in activityTimeList" :key="item.Id" :class="item.IsChoose ? 'active' : ''" @click="isActivityDate(item.Id)">{{ item.StatusName }}</text>
       </view>
     </view>
 
@@ -51,29 +49,21 @@
                 <view class="content">
                   <view class="item-img" @click="goDetails(item)"> </view>
                   <view :style="{ 'background-image': 'url(' + item.ImgUrlBg + ')' }" class="activity-ui">
-                    <view
-                      class="activity-li"
-                      :style="{ 'background-image': 'url(' + val.ImgUrlBg + ')' }"
-                      v-for="val in item.List"
-                      :key="val.ActivityId"
-                      @click="goDetails(val, item.Resource)"
-                    >
-                      <image
-                        v-if="val.IsNew"
-                        class="item-image"
-                        lazy-load
-                        src="https://hzchart.oss-cn-shanghai.aliyuncs.com/cygx/new_report.png"
-                      ></image>
-                      <image
-                        style="width: 73rpx; right: -6rpx"
-                        v-if="val.IsExternalLabel"
-                        class="item-image"
-                        lazy-load
-                        src="https://hzchart.oss-cn-shanghai.aliyuncs.com/cygx/activity_external.png"
-                      ></image>
+                    <view class="activity-li" :style="{ 'background-image': 'url(' + val.ImgUrlBg + ')' }" v-for="val in item.List" :key="val.ActivityId" @click="goDetails(val, item.Resource)">
+                      <image v-if="val.IsResearchPoints" style="width: 83rpx; right: -6rpx;height:33rpx" class="item-image" lazy-load src="https://hzchart.oss-cn-shanghai.aliyuncs.com/cygx/Research_Points.png"></image>
+                      <block v-else>
+                        <image
+                          style="width: 73rpx; right: -6rpx"
+                          v-if="val.IsExternalLabel"
+                          class="item-image"
+                          lazy-load
+                          src="https://hzchart.oss-cn-shanghai.aliyuncs.com/cygx/activity_external.png"
+                        ></image>
+                        <image v-if="!val.IsExternalLabel && val.IsNew" class="item-image" lazy-load src="https://hzchart.oss-cn-shanghai.aliyuncs.com/cygx/new_report.png"></image>
+                      </block>
                       <text class="text_oneLine"> {{ val.KeyWord }}</text>
                       <view class="item-trip" v-if="val.TripStatus == 2">确定行程</view>
-                      <view class="item-trip item-city" v-if="val.City.length == 2">{{ val.City }}</view>
+                      <view class="item-trip item-city" v-if="!val.IsResearchPoints && val.City.length == 2">{{ val.City }}</view>
                     </view>
                   </view>
                 </view>
@@ -87,29 +77,21 @@
                 <view class="content">
                   <view class="item-img" @click="goDetails(item)"> </view>
                   <view :style="{ 'background-image': 'url(' + item.ImgUrlBg + ')' }" class="activity-ui">
-                    <view
-                      class="activity-li"
-                      :style="{ 'background-image': 'url(' + val.ImgUrlBg + ')' }"
-                      v-for="val in item.List"
-                      :key="val.ActivityId"
-                      @click="goDetails(val, item.Resource)"
-                    >
-                      <image
-                        v-if="val.IsNew"
-                        class="item-image"
-                        lazy-load
-                        src="https://hzchart.oss-cn-shanghai.aliyuncs.com/cygx/new_report.png"
-                      ></image>
-                      <image
-                        style="width: 73rpx; right: -6rpx"
-                        v-if="val.IsExternalLabel"
-                        class="item-image"
-                        lazy-load
-                        src="https://hzchart.oss-cn-shanghai.aliyuncs.com/cygx/activity_external.png"
-                      ></image>
+                    <view class="activity-li" :style="{ 'background-image': 'url(' + val.ImgUrlBg + ')' }" v-for="val in item.List" :key="val.ActivityId" @click="goDetails(val, item.Resource)">
+                      <image v-if="val.IsResearchPoints" style="width: 83rpx; right: -6rpx;height:33rpx" class="item-image" lazy-load src="https://hzchart.oss-cn-shanghai.aliyuncs.com/cygx/Research_Points.png"></image>
+                      <block v-else>
+                        <image v-if="!val.IsExternalLabel && val.IsNew" class="item-image" lazy-load src="https://hzchart.oss-cn-shanghai.aliyuncs.com/cygx/new_report.png"></image>
+                        <image
+                          style="width: 73rpx; right: -6rpx"
+                          v-if="val.IsExternalLabel"
+                          class="item-image"
+                          lazy-load
+                          src="https://hzchart.oss-cn-shanghai.aliyuncs.com/cygx/activity_external.png"
+                        ></image>
+                      </block>
                       <text class="text_oneLine"> {{ val.KeyWord }}</text>
                       <view class="item-trip" v-if="val.TripStatus == 2">确定行程</view>
-                      <view class="item-trip item-city" v-if="val.City.length == 2">{{ val.City }}</view>
+                      <view class="item-trip item-city" v-if="!val.IsResearchPoints && val.City.length == 2">{{ val.City }}</view>
                     </view>
                   </view>
                 </view>
@@ -126,6 +108,7 @@
       <freeCharge class="free-charge" :isShowFreeBtn="isShowFree" />
     </block>
     <not-have-login v-else />
+    <Loading />
   </view>
 </template>
 
@@ -331,10 +314,7 @@ export default {
         let key = item.ActivityTypeId || item.KeyWord;
         let id = typeof key == "string" ? item.ActivityId : "";
         let str = type ? "&permissionIds=" + this.chartPermissionIds + "&showJurisdiction=" + (this.isShowJurisdiction ? "show" : "") : "";
-        this.$store.dispatch(
-          "checkHandle",
-          "/activityPages/themeActivity/themeActivity?title=" + key + "&type=" + type + "&id=" + id + "&whichDay=" + this.whichDay + str
-        );
+        this.$store.dispatch("checkHandle", "/activityPages/themeActivity/themeActivity?title=" + key + "&type=" + type + "&id=" + id + "&whichDay=" + this.whichDay + str);
       } else {
         if (key) {
           uni.navigateTo({ url: "/activityPages/specialDetail/specialDetail?id=" + item.ActivityId });
@@ -374,13 +354,7 @@ export default {
   onShareAppMessage: function (res) {
     return {
       title: this.isHorzMobile ? "好友向您推荐此内容,上传名片享查研观向免费月卡!" : this.messageTitle,
-      path:
-        "/pages/activity/activity?whichDay=" +
-        this.whichDay +
-        "&chartPermissionIds=" +
-        this.chartPermissionIds +
-        "&isGetJurisdiction=" +
-        this.isGetJurisdiction,
+      path: "/pages/activity/activity?whichDay=" + this.whichDay + "&chartPermissionIds=" + this.chartPermissionIds + "&isGetJurisdiction=" + this.isGetJurisdiction,
     };
   },
   /* 下拉刷新 */

+ 2 - 0
pages/index/index.vue

@@ -105,6 +105,8 @@
         <image @click.stop="goSecretDetail(3)" mode="widthFix" style="height: 120rpx; width: 120rpx" src="https://hzchart.oss-cn-shanghai.aliyuncs.com/cygx/week_summary.png"> </image>
       </template>
     </suspenButton>
+    <Loading />
+    <videoModule :showVideoPop.sync="showVideoPopUp" :videoPopList="videoPopListUp" />
   </page-meta>
 </template>
 

+ 1 - 0
pages/material/material.vue

@@ -99,6 +99,7 @@
       </block>
     </view>
     <freeCharge class="free-charge" :isShowFreeBtn="isShowFree" />
+    <Loading />
   </view>
 </template>
 

+ 1 - 0
pages/purchaser/purchaser.vue

@@ -176,6 +176,7 @@
         <rich-text :nodes="accounts"></rich-text>
       </view>
     </u-modal>
+    <Loading />
   </view>
 </template>
 

+ 2 - 1
pages/reportForm/reportForm.vue

@@ -1,5 +1,5 @@
 <template>
-  <view class="reportForm-container">
+  <view class="reportForm-container container">
     <view id="nav-bar-wrap-id" class="nav-bar-wrap">
       <search-bar @goSearch="goSearch" :searchTitle="searchPlaceholderList.SummarySearch" :width="50">
         <template slot="content-left">
@@ -185,6 +185,7 @@
       :jurisdictionList="jurisdictionList"
       :hasPermission="hasPermission"
     />
+    <Loading />
   </view>
 </template>
 

+ 1 - 0
reportPages/IndustryReport/IndustryReport.vue

@@ -70,6 +70,7 @@
       :jurisdictionList="jurisdictionList"
       :hasPermission="hasPermission"
     />
+    <Loading />
   </view>
 </template>
 

+ 1 - 0
reportPages/authorPages/authorPages.vue

@@ -65,6 +65,7 @@
         <rich-text :nodes="accounts"></rich-text>
       </view>
     </u-modal>
+    <Loading />
   </view>
 </template>
 

+ 1 - 0
reportPages/companyTabulation/companyTabulation.vue

@@ -23,6 +23,7 @@
       <text>暂时没有报告的内容</text>
     </view>
     <freeCharge class="free-charge" :isShowFreeBtn="isShowFree" />
+    <Loading />
   </view>
 </template>
 

+ 1 - 0
reportPages/hotList/hotList.vue

@@ -99,6 +99,7 @@
       :jurisdictionList="jurisdictionList"
       :hasPermission="hasPermission"
     />
+    <Loading />
   </view>
 </template>
 

+ 1 - 0
reportPages/industrialReport/industrialReport.vue

@@ -26,6 +26,7 @@
       <text>暂时没有报告的内容</text>
     </view>
     <freeCharge class="free-charge" :isShowFreeBtn="isShowFree" />
+    <Loading />
   </view>
 </template>
 

+ 1 - 0
reportPages/internalDetials/internalDetials.vue

@@ -25,6 +25,7 @@
         <view class="btn-cont month-back" @click="backIndex"> 返回</view>
       </block>
     </view>
+    <Loading />
   </block>
   <not-have-login v-else />
 </template>

+ 1 - 0
reportPages/internalTesting/internalTesting.vue

@@ -5,6 +5,7 @@
       <view class="li-tiem">{{ item.PublishTime }}</view>
     </view>
     <u-loadmore :status="status" icon-type="flower" :load-text="loadText" margin-top="20" v-if="page_no > 1" />
+    <Loading />
   </view>
 </template>
 

+ 1 - 0
reportPages/keyCompany/keyCompany.vue

@@ -96,6 +96,7 @@
       </view>
     </block>
     <not-have-login v-else />
+    <Loading />
   </block>
 </template>
 

+ 1 - 0
reportPages/morningAll/morningAll.vue

@@ -8,6 +8,7 @@
       </view>
     </view>
     <u-loadmore :status="status" icon-type="flower" :load-text="loadText" margin-top="20" v-if="page_no > 1" />
+    <Loading />
   </view>
 </template>
 

+ 1 - 0
reportPages/morningDetails/morningDetails.vue

@@ -31,6 +31,7 @@
         <view class="btn-cont month-back" @click="backIndex"> 返回</view>
       </block>
     </view>
+    <Loading />
   </view>
   <not-have-login v-else />
 </template>

+ 1 - 0
reportPages/myAskPage/myAskPage.vue

@@ -20,6 +20,7 @@
       <text>暂时没有提问的内容</text>
     </view>
     <freeCharge class="free-charge" :isShowFreeBtn="isShowFree" />
+    <Loading />
   </view>
 </template>
 

+ 1 - 0
reportPages/recentPages/recentPages.vue

@@ -33,6 +33,7 @@
         <rich-text :nodes="accounts"></rich-text>
       </view>
     </u-modal>
+    <Loading />
   </view>
 </template>
 

+ 1 - 0
reportPages/reportSecretDetail/reportSecretDetail.vue

@@ -124,6 +124,7 @@
       </view>
     </view>
     <not-have-login v-else />
+    <Loading />
   </block>
 </template>
 

+ 1 - 0
reportPages/researchTheme/researchTheme.vue

@@ -60,6 +60,7 @@
         <rich-text :nodes="accounts"></rich-text>
       </view>
     </u-modal>
+    <Loading />
   </view>
 </template>
 

+ 1 - 0
reportPages/roadEssence/roadEssence.vue

@@ -116,6 +116,7 @@
       </view>
     </view>
     <not-have-login v-else />
+    <Loading />
   </block>
 </template>
 

+ 1 - 0
reportPages/secretDetails/secretDetails.vue

@@ -29,6 +29,7 @@
       <text>暂时没有报告的内容</text>
     </view>
     <freeCharge class="free-charge" :isShowFreeBtn="isShowFree" />
+    <Loading />
   </view>
 </template>
 

+ 10 - 1
store/index.js

@@ -1,7 +1,6 @@
 import Vue from "vue";
 import Vuex from "vuex";
 import { checkToken, User } from "@/config/api.js";
-import { set } from "@/config/db.js"; //缓存操作
 import audioBg from "./modules/audioBg";
 import videoPlay from "./modules/videoPlay";
 Vue.use(Vuex);
@@ -12,6 +11,7 @@ const store = new Vuex.Store({
     isBind: "",
     pageRouterReport: "", //报告详情的路径
     pageRouterActivity: "", //活动详情的路径
+    requestLoading: false, //加载等待是否显示
   },
   mutations: {
     globalData(state, payload) {
@@ -24,6 +24,15 @@ const store = new Vuex.Store({
     setRouterActivity(state, payload) {
       state.pageRouterActivity = payload;
     },
+
+    //显示请求加载动画
+    requestShowLoading(state) {
+      state.requestLoading = true;
+    },
+    //隐藏请求加载动画
+    requestHideLoading(state) {
+      state.requestLoading = false;
+    },
   },
   actions: {
     checkHandle(context, navigateUrl = "") {

+ 1 - 0
wxcomponents/vant/dist/cascader/index.d.ts

@@ -0,0 +1 @@
+export {};

+ 208 - 0
wxcomponents/vant/dist/cascader/index.js

@@ -0,0 +1,208 @@
+import { VantComponent } from '../common/component';
+var FieldName;
+(function (FieldName) {
+    FieldName["TEXT"] = "text";
+    FieldName["VALUE"] = "value";
+    FieldName["CHILDREN"] = "children";
+})(FieldName || (FieldName = {}));
+const defaultFieldNames = {
+    text: FieldName.TEXT,
+    value: FieldName.VALUE,
+    children: FieldName.CHILDREN,
+};
+VantComponent({
+    props: {
+        title: String,
+        value: {
+            type: String,
+            observer: 'updateValue',
+        },
+        placeholder: {
+            type: String,
+            value: '请选择',
+        },
+        activeColor: {
+            type: String,
+            value: '#1989fa',
+        },
+        options: {
+            type: Array,
+            value: [],
+            observer: 'updateOptions',
+        },
+        swipeable: {
+            type: Boolean,
+            value: false,
+        },
+        closeable: {
+            type: Boolean,
+            value: true,
+        },
+        showHeader: {
+            type: Boolean,
+            value: true,
+        },
+        closeIcon: {
+            type: String,
+            value: 'cross',
+        },
+        fieldNames: {
+            type: Object,
+            value: defaultFieldNames,
+            observer: 'updateFieldNames',
+        },
+    },
+    data: {
+        tabs: [],
+        activeTab: 0,
+        textKey: FieldName.TEXT,
+        valueKey: FieldName.VALUE,
+        childrenKey: FieldName.CHILDREN,
+    },
+    created() {
+        this.updateTabs();
+    },
+    methods: {
+        updateOptions(val, oldVal) {
+            const isAsync = !!(val.length && oldVal.length);
+            this.updateTabs(isAsync);
+        },
+        updateValue(val) {
+            if (val !== undefined) {
+                const values = this.data.tabs.map((tab) => tab.selected && tab.selected[this.data.valueKey]);
+                if (values.indexOf(val) > -1) {
+                    return;
+                }
+            }
+            this.updateTabs();
+        },
+        updateFieldNames() {
+            const { text = 'text', value = 'value', children = 'children', } = this.data.fieldNames || defaultFieldNames;
+            this.setData({
+                textKey: text,
+                valueKey: value,
+                childrenKey: children,
+            });
+        },
+        getSelectedOptionsByValue(options, value) {
+            for (let i = 0; i < options.length; i++) {
+                const option = options[i];
+                if (option[this.data.valueKey] === value) {
+                    return [option];
+                }
+                if (option[this.data.childrenKey]) {
+                    const selectedOptions = this.getSelectedOptionsByValue(option[this.data.childrenKey], value);
+                    if (selectedOptions) {
+                        return [option, ...selectedOptions];
+                    }
+                }
+            }
+        },
+        updateTabs(isAsync = false) {
+            const { options, value } = this.data;
+            if (value !== undefined) {
+                const selectedOptions = this.getSelectedOptionsByValue(options, value);
+                if (selectedOptions) {
+                    let optionsCursor = options;
+                    const tabs = selectedOptions.map((option) => {
+                        const tab = {
+                            options: optionsCursor,
+                            selected: option,
+                        };
+                        const next = optionsCursor.find((item) => item[this.data.valueKey] === option[this.data.valueKey]);
+                        if (next) {
+                            optionsCursor = next[this.data.childrenKey];
+                        }
+                        return tab;
+                    });
+                    if (optionsCursor) {
+                        tabs.push({
+                            options: optionsCursor,
+                            selected: null,
+                        });
+                    }
+                    this.setData({
+                        tabs,
+                    });
+                    wx.nextTick(() => {
+                        this.setData({
+                            activeTab: tabs.length - 1,
+                        });
+                    });
+                    return;
+                }
+            }
+            // 异步更新
+            if (isAsync) {
+                const { tabs } = this.data;
+                tabs[tabs.length - 1].options =
+                    options[options.length - 1][this.data.childrenKey];
+                this.setData({
+                    tabs,
+                });
+                return;
+            }
+            this.setData({
+                tabs: [
+                    {
+                        options,
+                        selected: null,
+                    },
+                ],
+            });
+        },
+        onClose() {
+            this.$emit('close');
+        },
+        onClickTab(e) {
+            const { index: tabIndex, title } = e.detail;
+            this.$emit('click-tab', { title, tabIndex });
+            this.setData({
+                activeTab: tabIndex,
+            });
+        },
+        // 选中
+        onSelect(e) {
+            const { option, tabIndex } = e.currentTarget.dataset;
+            if (option && option.disabled) {
+                return;
+            }
+            const { valueKey, childrenKey } = this.data;
+            let { tabs } = this.data;
+            tabs[tabIndex].selected = option;
+            if (tabs.length > tabIndex + 1) {
+                tabs = tabs.slice(0, tabIndex + 1);
+            }
+            if (option[childrenKey]) {
+                const nextTab = {
+                    options: option[childrenKey],
+                    selected: null,
+                };
+                if (tabs[tabIndex + 1]) {
+                    tabs[tabIndex + 1] = nextTab;
+                }
+                else {
+                    tabs.push(nextTab);
+                }
+                wx.nextTick(() => {
+                    this.setData({
+                        activeTab: tabIndex + 1,
+                    });
+                });
+            }
+            this.setData({
+                tabs,
+            });
+            const selectedOptions = tabs.map((tab) => tab.selected).filter(Boolean);
+            const params = {
+                value: option[valueKey],
+                tabIndex,
+                selectedOptions,
+            };
+            this.$emit('change', params);
+            if (!option[childrenKey]) {
+                this.$emit('finish', params);
+            }
+        },
+    },
+});

+ 8 - 0
wxcomponents/vant/dist/cascader/index.json

@@ -0,0 +1,8 @@
+{
+  "component": true,
+  "usingComponents": {
+    "van-icon": "../icon/index",
+    "van-tab":  "../tab/index",
+    "van-tabs": "../tabs/index"
+  }
+}

+ 53 - 0
wxcomponents/vant/dist/cascader/index.wxml

@@ -0,0 +1,53 @@
+<wxs src="./index.wxs" module="utils" />
+
+<view wx:if="{{ showHeader }}" class="van-cascader__header">
+  <text class="van-cascader__title"><slot name="title"></slot>{{ title }}</text>
+  <van-icon
+    wx:if="{{ closeable }}"
+    name="{{ closeIcon }}"
+    class="van-cascader__close-icon"
+    bind:tap="onClose"
+  />
+</view>
+
+<van-tabs
+  active="{{ activeTab }}"
+  custom-class="van-cascader__tabs"
+  wrap-class="van-cascader__tabs-wrap"
+  tab-class="van-cascader__tab"
+  color="{{ activeColor }}"
+  border="{{ false }}"
+  swipeable="{{ swipeable }}"
+  bind:click="onClickTab"
+>
+  <van-tab
+    wx:for="{{ tabs }}"
+    wx:for-item="tab"
+    wx:for-index="tabIndex"
+    wx:key="tabIndex"
+    title="{{ tab.selected ? tab.selected[textKey] : placeholder }}"
+    style="width: 100%;"
+    title-style="{{ !tab.selected ? 'color: #969799;font-weight:normal;' : '' }}"
+  >
+    <!-- 暂不支持 -->
+    <!-- <slot name="options-top"></slot> -->
+
+    <view class="van-cascader__options">
+      <view
+        wx:for="{{ tab.options }}"
+        wx:for-item="option"
+        wx:key="index"
+        class="{{ option.className }} {{ utils.optionClass(tab, textKey, option) }}"
+        style="{{ utils.optionStyle({ tab, textKey, option, activeColor }) }}"
+        data-option="{{ option }}"
+        data-tab-index="{{ tabIndex }}"
+        bind:tap="onSelect"
+      >
+        <text>{{ option[textKey] }}</text>
+        <van-icon wx:if="{{ utils.isSelected(tab, textKey, option) }}" name="success" size="18" />
+      </view>
+    </view>
+    <!-- 暂不支持 -->
+    <!-- <slot name="options-bottom"></slot> -->
+  </van-tab>
+</van-tabs>

+ 24 - 0
wxcomponents/vant/dist/cascader/index.wxs

@@ -0,0 +1,24 @@
+var utils = require('../wxs/utils.wxs');
+var style = require('../wxs/style.wxs');
+
+function isSelected(tab, textKey, option) {
+  return tab.selected && tab.selected[textKey] === option[textKey]
+}
+
+function optionClass(tab, textKey, option) {
+  return utils.bem('cascader__option', { selected: isSelected({ tab, textKey, option }), disabled: option.disabled })
+}
+
+function optionStyle(data) {
+  var color = data.option.color || (isSelected(data.tab, data.textKey, data.option) ? data.activeColor : undefined);
+  return style({
+    color
+  });
+}
+
+
+module.exports = {
+  isSelected: isSelected,
+  optionClass: optionClass,
+  optionStyle: optionStyle,
+};

+ 1 - 0
wxcomponents/vant/dist/cascader/index.wxss

@@ -0,0 +1 @@
+@import '../common/index.wxss';.van-cascader__header{align-items:center;display:flex;height:48px;justify-content:space-between;padding:0 16px}.van-cascader__title{font-size:16px;font-weight:600;line-height:20px}.van-cascader__close-icon{color:#c8c9cc;font-size:22px;height:22px}.van-cascader__tabs-wrap{height:48px!important;padding:0 8px}.van-cascader__tab{color:#323233!important;flex:none!important;font-weight:600!important;padding:0 8px!important}.van-cascader__tab--unselected{color:#969799!important;font-weight:400!important}.van-cascader__option{align-items:center;cursor:pointer;display:flex;font-size:14px;justify-content:space-between;line-height:20px;padding:10px 16px}.van-cascader__option:active{background-color:#f2f3f5}.van-cascader__option--selected{color:#1989fa;font-weight:600}.van-cascader__option--disabled{color:#c8c9cc;cursor:not-allowed}.van-cascader__option--disabled:active{background-color:initial}.van-cascader__options{-webkit-overflow-scrolling:touch;box-sizing:border-box;height:384px;overflow-y:auto;padding-top:6px}

+ 1 - 0
wxcomponents/vant/dist/config-provider/index.d.ts

@@ -0,0 +1 @@
+export {};

+ 9 - 0
wxcomponents/vant/dist/config-provider/index.js

@@ -0,0 +1,9 @@
+import { VantComponent } from '../common/component';
+VantComponent({
+    props: {
+        themeVars: {
+            type: Object,
+            value: {},
+        },
+    },
+});

+ 3 - 0
wxcomponents/vant/dist/config-provider/index.json

@@ -0,0 +1,3 @@
+{
+  "component": true
+}

+ 5 - 0
wxcomponents/vant/dist/config-provider/index.wxml

@@ -0,0 +1,5 @@
+<wxs src="./index.wxs" module="computed" />
+
+<view class="van-config-provider" style="{{ computed.mapThemeVarsToCSSVars(themeVars) }}">
+  <slot />
+</view>

+ 29 - 0
wxcomponents/vant/dist/config-provider/index.wxs

@@ -0,0 +1,29 @@
+/* eslint-disable */
+var object = require('../wxs/object.wxs');
+var style = require('../wxs/style.wxs');
+
+function kebabCase(word) {
+  var newWord = word
+    .replace(getRegExp("[A-Z]", 'g'), function (i) {
+      return '-' + i;
+    })
+    .toLowerCase()
+    .replace(getRegExp("^-"), '');
+
+  return newWord;
+}
+
+function mapThemeVarsToCSSVars(themeVars) {
+  var cssVars = {};
+  object.keys(themeVars).forEach(function (key) {
+    var cssVarsKey = '--' + kebabCase(key);
+    cssVars[cssVarsKey] = themeVars[key];
+  });
+
+  return style(cssVars);
+}
+
+module.exports = {
+  kebabCase: kebabCase,
+  mapThemeVarsToCSSVars: mapThemeVarsToCSSVars,
+};

+ 8 - 0
wxcomponents/vant/dist/field/types.d.ts

@@ -0,0 +1,8 @@
+export interface InputDetails {
+    /** 输入框内容 */
+    value: string;
+    /** 光标位置 */
+    cursor?: number;
+    /** keyCode 为键值 (目前工具还不支持返回keyCode参数) `2.1.0` 起支持 */
+    keyCode?: number;
+}

+ 1 - 0
wxcomponents/vant/dist/field/types.js

@@ -0,0 +1 @@
+export {};

+ 10 - 0
wxcomponents/vant/dist/overlay/overlay.wxml

@@ -0,0 +1,10 @@
+<van-transition
+  show="{{ show }}"
+  custom-class="van-overlay custom-class"
+  custom-style="z-index: {{ zIndex }}; {{ customStyle }}"
+  duration="{{ duration }}"
+  bind:tap="onClick"
+  catch:touchmove="{{ lockScroll ? 'noop' : ''}}"
+>
+  <slot></slot>
+</van-transition>

+ 14 - 0
wxcomponents/vant/dist/popup/popup.wxml

@@ -0,0 +1,14 @@
+<view
+  wx:if="{{ inited }}"
+  class="custom-class {{ classes }} {{ utils.bem('popup', [position, { round, safe: safeAreaInsetBottom, safeTop: safeAreaInsetTop, safeTabBar: safeAreaTabBar }]) }}"
+  style="{{ computed.popupStyle({ zIndex, currentDuration, display, customStyle }) }}"
+  bind:transitionend="onTransitionEnd"
+>
+  <slot />
+  <van-icon
+    wx:if="{{ closeable }}"
+    name="{{ closeIcon }}"
+    class="close-icon-class van-popup__close-icon van-popup__close-icon--{{ closeIconPosition }}"
+    bind:tap="onClickCloseIcon"
+  />
+</view>