Переглянути джерело

Merge remote-tracking branch 'origin/master'

wangkaiyue 4 роки тому
батько
коміт
7f5497e805
33 змінених файлів з 1091 додано та 303 видалено
  1. 29 0
      jydocs-mobile/src/api/main.ts
  2. 14 0
      jydocs-mobile/src/api/mock/coin.json
  3. 3 2
      jydocs-mobile/src/api/mock/detail.json
  4. 11 0
      jydocs-mobile/src/api/mock/indexTag.json
  5. 0 0
      jydocs-mobile/src/api/mock/userCollectAdd.json
  6. 0 0
      jydocs-mobile/src/api/mock/userCollectRemove.json
  7. 11 9
      jydocs-mobile/src/components/Recharge.vue
  8. 21 10
      jydocs-mobile/src/components/RechargeHave.vue
  9. 29 2
      jydocs-mobile/src/store/modules/main.ts
  10. 15 0
      jydocs-mobile/src/utils/globalFunctionsForApp.ts
  11. 72 17
      jydocs-mobile/src/views/details/details.vue
  12. 79 13
      jydocs-mobile/src/views/purchase/purchase.vue
  13. 21 21
      jydocs-mobile/src/views/purchase/purchasesuccess.vue
  14. 8 0
      jydocs-mobile/vue.config.js
  15. 5 4
      jydocs-pc/src/App.vue
  16. 14 0
      jydocs-pc/src/api/mock/coin.json
  17. 5 2
      jydocs-pc/src/api/mock/detail.json
  18. 11 0
      jydocs-pc/src/api/mock/indexTag.json
  19. 0 0
      jydocs-pc/src/api/mock/userCollectAdd.json
  20. 0 0
      jydocs-pc/src/api/mock/userCollectRemove.json
  21. 53 0
      jydocs-pc/src/api/modules/detail.js
  22. 7 0
      jydocs-pc/src/api/modules/home.js
  23. 38 0
      jydocs-pc/src/api/modules/purchase.js
  24. 6 3
      jydocs-pc/src/api/modules/user.js
  25. 22 20
      jydocs-pc/src/components/Search.vue
  26. 17 2
      jydocs-pc/src/router.js
  27. 5 1
      jydocs-pc/src/utils/globalFunctions.js
  28. 190 177
      jydocs-pc/src/views/Content.vue
  29. 3 5
      jydocs-pc/src/views/Home.vue
  30. 4 4
      jydocs-pc/src/views/Search.vue
  31. 161 0
      jydocs-pc/src/views/UserCollections.vue
  32. 177 0
      jydocs-pc/src/views/UserDocs.vue
  33. 60 11
      jydocs-pc/src/views/purchase/purchase.vue

+ 29 - 0
jydocs-mobile/src/api/main.ts

@@ -46,6 +46,35 @@ export function getDetails (data: any) {
   })
 }
 
+export function getAdd (data: any) {
+  console.log(data)
+  // data = qs.stringify(data)
+  return $request({
+    url: '/userCollectAdd',
+    method: 'post',
+    data
+  })
+}
+
+export function getRemove (data: any) {
+  console.log(data)
+  // data = qs.stringify(data)
+  return $request({
+    url: '/userCollectRemove',
+    method: 'post',
+    data
+  })
+}
+
+export function getCoin (data: any) {
+  console.log(data)
+  return $request({
+    url: '/coin',
+    method: 'post',
+    data
+  })
+}
+
 // 文库购买
 export function getDocPay (data: any) {
   //   data = qs.stringify(data)

+ 14 - 0
jydocs-mobile/src/api/mock/coin.json

@@ -0,0 +1,14 @@
+{
+    "error_code": 0,
+    "data": {
+        "code": 1,
+        "message": "积分明细查询成功",
+        "count": 42,
+        "data": {
+            "points": {
+                "balance": 200,
+                "expire": 0
+            }
+        }
+    }
+}

+ 3 - 2
jydocs-mobile/src/api/mock/detail.json

@@ -2,7 +2,8 @@
   "error_code": 0,
   "error_msg": "",
   "data": {
-    "status": 1,
+    "status": 0,
+    "docCang": 1,
     "detail": {
       "docId": "RJ82241sM3DyHwrupW7w",
       "total": 10,
@@ -13,7 +14,7 @@
       "docPageSize": 5,
       "tags": "信息技术",
       "uploadDate": "2021-03-17 15:46:04",
-      "docFileType": 6,
+      "docFileType": 2,
       "docSummary": "公告软件单元、组装、确认测试系统-中标候选人公示(招标编号:ZKX20210231A002)公示开始时间:2021年01月28日09时00分00秒公示结束时间:2021年02月01日23时59分59秒本软件单元、组装、确认测试系统(招标项目"
     }
   }

+ 11 - 0
jydocs-mobile/src/api/mock/indexTag.json

@@ -0,0 +1,11 @@
+{
+  "error_code": 0,
+  "error_msg": "",
+  "data": [
+    "全部",
+    "招标",
+    "法律法规",
+    "行业报告",
+    "测试"
+  ]
+}

+ 0 - 0
jydocs-mobile/src/api/mock/user$collect$add.json → jydocs-mobile/src/api/mock/userCollectAdd.json


+ 0 - 0
jydocs-mobile/src/api/mock/user$collect$remove.json → jydocs-mobile/src/api/mock/userCollectRemove.json


+ 11 - 9
jydocs-mobile/src/components/Recharge.vue

@@ -3,14 +3,14 @@
         <div class="recharge_top">
             <div class="recharge_title">
                 <div class="thumbnail">
-                    <img src="../assets/images/banner.png" class="thumbnail_img" alt="">
+                    <img :src="detailData.previewImgId" class="thumbnail_img" alt="">
                 </div>
                 <div class="recharge_t_right">
-                    <div class="t_right_name">优化招投标市场营商环境与国企采购</div>
+                    <div class="t_right_name">{{detailData.docName}}</div>
                     <div class="t_right_active">
-                        <span>500剑鱼币</span>
-                        <span>共18页</span>
-                        <span>123k</span>
+                        <span>{{detailData.price}}剑鱼币</span>
+                        <span>共{{detailData.docPageSize}}页</span>
+                        <span>{{detailData.docFileSize}}k</span>
                     </div>
                 </div>
             </div>
@@ -24,18 +24,18 @@
             </div>
             <div class="jianyu_pay">
                 <span class="jy_money">剑鱼币</span>
-                <span class="jy_tip">(剑鱼币不足,剩余20剑鱼币)</span>
+                <span class="jy_tip">(剑鱼币不足,剩余{{coins.balance}}剑鱼币)</span>
             </div>
         </div>
         <div class="recharge_footer">
-                <button class="j-button-cancel btn_active" @click="closePopup()">取消</button>
-                <button class="j-button-sure btn_active">去充值</button>
+            <button class="j-button-cancel btn_active" @click="closePopup()">取消</button>
+            <button class="j-button-sure btn_active">去充值</button>
         </div>
     </van-popup>
 </template>
 
 <script lang="ts">
-import { Component, Vue } from 'vue-property-decorator'
+import { Component, Prop, Vue } from 'vue-property-decorator'
 import { Icon, Popup, Sticky } from 'vant'
 
 // @ is an alias to /src
@@ -51,6 +51,8 @@ import { Icon, Popup, Sticky } from 'vant'
     }
   })
 export default class extends Vue {
+    @Prop() detailData: any
+    @Prop() coins: any
     show = false
     closePopup () {
       this.show = false

+ 21 - 10
jydocs-mobile/src/components/RechargeHave.vue

@@ -3,14 +3,14 @@
         <div class="rechargehave_top">
             <div class="rechargehave_title">
                 <div class="thumbnail">
-                    <img src="../assets/images/banner.png" class="thumbnail_img" alt="">
+                    <img :src="detailData.previewImgId" class="thumbnail_img" alt="">
                 </div>
                 <div class="rechargehave_t_right">
-                    <div class="t_right_name">优化招投标市场营商环境与国企采购</div>
+                    <div class="t_right_name">{{detailData.docName}}</div>
                     <div class="t_right_active">
-                        <span>500剑鱼币</span>
-                        <span>共18页</span>
-                        <span>123k</span>
+                        <span>{{detailData.price}}剑鱼币</span>
+                        <span>共{{detailData.docPageSize}}页</span>
+                        <span>{{detailData.docFileSize}}k</span>
                     </div>
                 </div>
             </div>
@@ -25,7 +25,7 @@
             <div class="jianyu_pay">
                 <div class="jy_pay_left">
                     <span class="jy_money">剑鱼币</span>
-                    <span class="jy_tip">(剩余2020剑鱼币)</span>
+                    <span class="jy_tip">(剩余{{coins.balance}}剑鱼币)</span>
                 </div>
                 <div class="jy_pay_icon">
                     <img src="../assets/icon/checked.png" class="icon_right_option" />
@@ -38,23 +38,24 @@
                 支付积分:
                 </div>
                 <div class="det_right">
-                <span class="det_money">500</span>
+                <span class="det_money">{{detailData.price}}</span>
                 <span>剑鱼币</span>
                 </div>
             </div>
             <div class="readly">
-                <van-checkbox v-model="checked" checked-color="#2ABED1" >我已阅读,理解并接受<a href="javascript:;" class="clause" @click="clause()">《剑鱼伙伴服务条款》</a></van-checkbox>
+                <van-checkbox v-model="checked" checked-color="#2ABED1" >我已阅读,理解并接受</van-checkbox><a href="javascript:;" class="clause" @click="clause()">《剑鱼伙伴服务条款》</a>
             </div>
             <div class="apply_footer">
                 <button class="j-button-cancel btn_active" @click="closePopup()">取消</button>
-                <button class="j-button-sure btn_active" :disabled="!this.checked" @click="exchange()">去充值</button>
+                <button class="j-button-sure btn_active" :disabled="!checked" @click="exchange()">去兑换</button>
+                <!-- <button class="j-button-sure btn_active" :disabled="!this.checked" @click="exchange()">剑鱼币购买</button> -->
             </div>
         </div>
     </van-popup>
 </template>
 
 <script lang="ts">
-import { Component, Vue } from 'vue-property-decorator'
+import { Component, Prop, Vue } from 'vue-property-decorator'
 import { Icon, Popup, Checkbox } from 'vant'
 
 // @ is an alias to /src
@@ -70,11 +71,21 @@ import { Icon, Popup, Checkbox } from 'vant'
     }
   })
 export default class extends Vue {
+    @Prop() detailData: any
+    @Prop() coins: any
     show = false
     checked = false
     closePopup () {
       this.show = false
     }
+
+    clause () {
+      console.log('0000')
+    }
+
+    exchange () {
+      console.log('99999')
+    }
 }
 </script>
 

+ 29 - 2
jydocs-mobile/src/store/modules/main.ts

@@ -5,8 +5,11 @@ import {
   getHomeActivity,
   getCashOutInfo,
   submitCashOutInfo,
-  getDocPay,
-  getDetails
+  getDetails,
+  getRemove,
+  getAdd,
+  getCoin,
+  getDocPay
 } from '@/api/main'
 
 interface InterfaceStore<S> extends StoreOptions<S> {
@@ -156,6 +159,30 @@ const modulesOption: modulesOption = {
         console.log(res)
         return res.data
       } catch (error) {}
+    },
+    // 文库收藏
+    async getAdd (state, data) {
+      try {
+        const res = await getAdd(data)
+        console.log(res)
+        return res.data
+      } catch (error) {}
+    },
+    // 文库取消收藏
+    async getRemove (state, data) {
+      try {
+        const res = await getRemove(data)
+        console.log(res)
+        return res.data
+      } catch (error) {}
+    },
+    // 剑鱼币
+    async getCoin (state, data) {
+      try {
+        const res = await getCoin(data)
+        console.log(res)
+        return res.data
+      } catch (error) {}
     }
   },
   getters: {}

+ 15 - 0
jydocs-mobile/src/utils/globalFunctionsForApp.ts

@@ -17,3 +17,18 @@ export function hiddenBottomBar (params = 0) {
     }
   }
 }
+
+// 分享封装
+export function shareToOthers (options: any = {}) {
+  if (inWeiXinBrowser) {
+    // 微信分享
+  } else {
+    // app分享
+    try {
+      // options.type--1微信分享,2qq分享,3朋友圈分享
+      JyObj.share(options.type, options.title, options.link)
+    } catch (error) {
+      console.log(error)
+    }
+  }
+}

+ 72 - 17
jydocs-mobile/src/views/details/details.vue

@@ -2,16 +2,16 @@
     <div class="details-p">
         <div class="tops">
             <h3>
-                <van-icon class="word01" name="diy-word" />
+                <van-icon class="word01" :name="'diy-' + fileType(detailData.docFileType)" />
                 {{detailData.docName}}
             </h3>
         </div>
         <div class="middles">
             <h3>摘要</h3>
             <p>{{detailData.docSummary}}</p>
-            <div class="continue">全文共18页,<span>继续阅读<van-icon name="arrow-down" size="18" /></span></div>
+            <div class="continue" v-show="!buyed">全文共{{detailData.docPageSize}}页,<span @click="continued">继续阅读<van-icon name="arrow-down" size="18" /></span></div>
         </div>
-        <div class="botts">
+        <div class="botts" v-show="buyed">
             <div class="cont-page">
                 优化招投标市场营商环境与国企采购人主体责任、采购与招标培训资料摘要摘要。优化招投标市场营商环境与国企采购人主体责任、采购与招标培训资料摘要摘要。优化招投标市场营商环境与国企采购人主体责任、采购与招标培训资料摘要摘要。优化招投标市场营商环境与国企采购人主体责任、采购与招标培训资料摘要摘要。优化招投标市场营商环境与国企采购人主体责任、采购与招标培训资料摘要摘要。优化招投标市场营商环境与国企采购人主体责任、采购与招标培训资料摘要摘要。
             </div>
@@ -20,17 +20,17 @@
             <van-goods-action-icon class="no-icon">
                 <template #default>
                     <p class="p1">剑鱼币</p>
-                    <p class="p2">500</p>
+                    <p class="p2">{{detailData.price}}</p>
                 </template>
             </van-goods-action-icon>
             <van-goods-action-icon icon="diy-jubao" text="投诉举报" @click="jubaod" />
-            <van-goods-action-icon :icon="collectd?'diy-weiguanzhu':'diy-guanzhu'" text="收藏" @click="canged" />
+            <van-goods-action-icon :icon="collectd==1?'diy-guanzhu':'diy-weiguanzhu'" text="收藏" @click="canged" />
             <van-goods-action-button text="下载文档" @click="uploaded" />
         </van-goods-action>
         <!-- 充值 -->
-        <recharge ref="charge"></recharge>
+        <recharge ref="charge" :detailData="detailData" :coins="coins"></recharge>
         <!-- 购买 -->
-        <purchase ref="buys"></purchase>
+        <purchase ref="buys" :detailData="detailData" :coins="coins"></purchase>
     </div>
 </template>
 
@@ -52,15 +52,22 @@ import Purchase from '@/components/RechargeHave.vue'
   },
   methods: {
     ...mapActions({
-      getDetails: 'main/getDetails'
+      getDetails: 'main/getDetails',
+      getCoin: 'main/getCoin',
+      getAdd: 'main/getAdd',
+      getRemove: 'main/getRemove'
     })
   }
 })
 export default class extends Vue {
   getDetails: any
+  getCoin: any
+  coins: any = []
+  getAdd: any
+  getRemove: any
   detailData: any = []
-  collectd = true
-  nums = 1
+  collectd = 0
+  buyed = 0
   created () {
     this.onList()
   }
@@ -69,6 +76,12 @@ export default class extends Vue {
     this.getDetails({ docId: '111' }).then((res: any) => {
       console.log(res.data)
       this.detailData = res.data.detail
+      this.buyed = res.data.status
+      this.collectd = res.data.docCang
+    })
+    this.getCoin({ L: true }).then((res: any) => {
+      console.log(res.data.data)
+      this.coins = res.data.data.points
     })
   }
 
@@ -80,21 +93,64 @@ export default class extends Vue {
   }
 
   canged () {
-    this.collectd = !this.collectd
+    if (this.collectd === 0) {
+      this.getAdd({ docId: '111' }).then((res: any) => {
+        console.log(res)
+        if (res.error_code === 0) {
+          this.collectd = 1
+          Toast('收藏成功')
+        }
+      })
+    } else {
+      this.getRemove({ docId: '111' }).then((res: any) => {
+        console.log(res)
+        if (res.error_code === 0) {
+          this.collectd = 0
+          Toast('取消收藏')
+        }
+      })
+    }
+  }
+
+  continued () {
+    this.uploaded()
   }
 
   uploaded () {
-    if (this.nums === 0) {
-      ;(this.$refs.charge as any).show = true
+    if (this.buyed === 1) {
+      this.$router.push('/')
+    } else {
+      if (this.coins.balance < this.detailData.price) {
+        ;(this.$refs.charge as any).show = true
+      } else {
+        ;(this.$refs.buys as any).show = true
+      }
+    }
+  }
+
+  fileType (val: any) {
+    if (val === 1) {
+      return 'word'
+    } else if (val === 2) {
+      return 'pdf'
+    } else if (val === 3) {
+      return 'excel'
+    } else if (val === 4) {
+      return 'ppt'
+    } else if (val === 5) {
+      return 'txt'
     } else {
-      ;(this.$refs.buys as any).show = true
+      return ''
     }
   }
 }
 </script>
 
 <style lang="scss" scoped>
+@include diy-icon('pdf', 24, 24);
 @include diy-icon('word', 24, 24);
+@include diy-icon('excel', 24, 24);
+@include diy-icon('ppt', 24, 24);
 @include diy-icon('jubao', 20, 20);
 @include diy-icon('weiguanzhu', 20, 20);
 @include diy-icon('guanzhu', 20, 20);
@@ -167,16 +223,15 @@ export default class extends Vue {
         display: flex;
         justify-content: space-between;
         .no-icon {
-            p {
-                color:#2ABED1;
-            }
             .p1 {
                 font-size: 12px;
                 line-height: 18px;
+                color: #5F5E64;
             }
             .p2 {
                 font-size: 18px;
                 line-height: 26px;
+                color: #FB483D;
             }
             .van-icon {
                 display: none!important;

+ 79 - 13
jydocs-mobile/src/views/purchase/purchase.vue

@@ -3,25 +3,35 @@
     <div class="j-main exchange_main">
       <div class="docs_infor">
         <div class="docs_left">
-          <img src="" class="docs_img" alt="">
+          <img :src="response.previewImgId" class="docs_img" alt="">
+          <span class="icon_word"></span>
         </div>
         <div class="docs_right">
           <div class="docs_title ellipsis-2">
-            优化招投标市场营商环境与国企采购人主体责任、采购与招标优化招投标市场营商环境与国企采购人主体责任、采购与招标
+            {{response.docName}}
           </div>
           <div class="docs_other">
-            <div class="docs_auther">贡献者:张三</div>
+            <!-- <div class="docs_auther">贡献者:张三</div> -->
             <div class="docs_download">
-              <span>2020次下载</span> | 共18页 | 220K
+              <span>{{response.downTimes}}次下载</span> | 共{{response.docPageSize}}页 | {{response.docFileSize}}K
             </div>
-            <div class="docs_money"><span class="docs_num">500</span> 剑鱼币</div>
+            <div class="docs_money"><span class="docs_num">{{response.price}}</span> 剑鱼币</div>
           </div>
         </div>
       </div>
       <div class="docs_phone">
-        <van-cell-group>
+        <!-- <van-cell-group>
           <van-field v-model="tel" type="number" label="手机号码" placeholder="请输入手机号码" />
-        </van-cell-group>
+        </van-cell-group> -->
+        <van-field
+          class="editable"
+          v-model="tel"
+          name="phone"
+          type="tel"
+          label="手机号码"
+          placeholder="请输入手机号码"
+          :rules="phoneRules"
+        />
       </div>
     </div>
     <div class="j-footer exchange_footer">
@@ -30,7 +40,7 @@
           支付积分:
         </div>
         <div class="det_right">
-          <span class="det_money">500</span>
+          <span class="det_money">{{response.price}}</span>
           <span>剑鱼币</span>
         </div>
       </div>
@@ -48,7 +58,8 @@
 import { Component, Vue } from 'vue-property-decorator'
 import { Checkbox, CheckboxGroup, Field, CellGroup } from 'vant'
 import { mapActions } from 'vuex'
-import { getDocPay } from '../../api/main'
+// import { getDocPay } from '../../api/main'
+const regPhoneExg = /^(0|86|17951)?(13[0-9]|15[012356789]|166|17[3678]|18[0-9]|14[57]|19[0-9])[0-9]{8}$/
 @Component({
   name: 'purchase-page',
   components: {
@@ -59,24 +70,68 @@ import { getDocPay } from '../../api/main'
   },
   methods: {
     ...mapActions({
-      getDocPay: 'main/getDocPay'
+      getDocPay: 'main/getDocPay',
+      getDetails: 'main/getDetails'
     })
   }
 })
 export default class extends Vue {
-  // protected getDocPay!: any
+  protected getDocPay!: any
+  protected getDetails!: any
   checked = false
   tel = ''
   $router: any
+  response = {
+    docName: '',
+    price: '',
+    downTimes: '',
+    docFileSize: '',
+    docPageSize: '',
+    previewImgId: ''
+  }
+
+  created () {
+    this.getWordInfor()
+  }
+
+  // 文档信息
+  getWordInfor () {
+    this.getDetails({ docId: '4f6c00ba-8882-11eb-8699-0050568f51e7' }).then((res: any) => {
+      console.log(res)
+      const item = res.data.detail
+      if (res.error_code === 0) {
+        this.response.docName = item.docName
+        this.response.price = item.price
+        this.response.downTimes = item.downTimes
+        this.response.docFileSize = item.docFileSize
+        this.response.docPageSize = item.docPageSize
+        this.response.previewImgId = item.previewImgId
+      }
+    })
+  }
 
   // 确定兑换
   exchange () {
-    getDocPay({ docId: 'RJ82241sM3DyHwrupW7w', phone: '18439509554' }).then((res: any) => {
+    this.getDocPay({ docId: '4f6c00ba-8882-11eb-8699-0050568f51e7', phone: '18439509554' }).then((res: any) => {
       console.log(res)
+      if (res.data === 'success') {
+        this.$router.push('/purchasesuccess')
+      }
     })
-    // this.$router.push('/purchasesuccess')
   }
 
+  phoneRules = [{
+    validator: (val: string) => {
+      const status = regPhoneExg.test(val)
+      if (val === '') {
+        console.log(true)
+        return true
+      }
+      return status
+    },
+    message: '手机号格式错误'
+  }]
+
   // 剑鱼标讯服务条款
   clause () {
     // this.$router.push('/readme')
@@ -95,6 +150,7 @@ export default class extends Vue {
         padding: 20px 16px;
         background: #ffffff;
         .docs_left{
+          position: relative;
           width: 100px;
           height: 124px;
           border-radius: 4px;
@@ -103,6 +159,16 @@ export default class extends Vue {
             width: 100%;
             height: 100%;
           }
+          .icon_word{
+            position: absolute;
+            right: 0;
+            bottom: 0;
+            display: flex;
+            width: 24px;
+            height: 24px;
+            background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADAAAAAwCAYAAABXAvmHAAAACXBIWXMAABYlAAAWJQFJUiTwAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAJASURBVHgB7Zm/TuQwEMY/J5x016B7gC2oqbju2muuuOoKClooqEGiodliGxokqLdYXoACWireACpqin0ARAMCEvONcXaXf+sQjTdI+CclTuKJM+NMnBkbSCQSiTYxdYS+79gFCh7wcInbT8TG4MhabN5um8uwaACv/BlmofhzrizwK2TEHAIYgz1YKm9wmN2hV2S4RkRMhg6LDT5v2b/1P9PkM4Sw+O/KEvuxlXePKzEsHtDzp0sh+bABEw1jRmTjjgq6bW0DPivJgLZJBrRN8D/wHibHZXVsCyygARptJBdqm2RA20QzwAVlOfosd/MS84hE41EoBKPYPotFCdjtN5YF/iECUd6A9LoV5T1yLNcQAXUDqKiL5V9XML6XOmVUDfDKj5Sk9wzY+4OxAOsyrEERtW+AMfxfO6E8FT/h3/UpMcmdO/2WQ34bXZ5fs+4QCqi8ASq+WJpnPj7M77FVnRT3WKdBFyN5oCv3QAEVA9j7fbpLNVQOqeHKZPopGZaxWHd1cK41L/dAAa1voONLp/xb6ae7JnUYGdaBAqofcVnSVabkzlLHbQWKqBnAiage3eQiJOdltqCEjgEG+5x2GdQVdyOQ3KNAcwMqBVjah48r4+6ZaAMNCU4t/tihc6B5xtSUKlu72TZTdUzhdNt8CQOuZBczKXmJn6GuRR0DzmVXzqH7kYab4juqCgqPQ/LBaJRD0Kpb4HiK8Zc5OkSlHLcvCxzB/CH4BmSFRFZKGG0eYTaI4qd1VmcSiUSifR4BOQuhbc3lgT4AAAAASUVORK5CYII=) no-repeat;
+            background-size: contain;
+          }
         }
         .docs_right{
           flex: 1;

+ 21 - 21
jydocs-mobile/src/views/purchase/purchasesuccess.vue

@@ -10,7 +10,7 @@
           <span class="icon_num"></span>
           <span class="money_num">500</span>
         </div>
-        <p class="success_days">2s后自动跳转到文档页面</p>
+        <p class="success_days">{{count}}s后自动跳转到文档页面</p>
       </div>
       <div class="logout_infor">
         <div class="infor_group">
@@ -42,30 +42,30 @@ import { Component, Vue } from 'vue-property-decorator'
 @Component({
   name: 'test',
   components: {
-  },
-  methods: {
-  },
-  computed: {
-    // ...mapState('logout', {
-    //   logout: function (state: any) {
-    //     return state.logoutdata
-    //   }
-    // })
   }
-//   beforeRouteLeave (to, form, next) {
-//     setTimeout(() => {
-//       history.go(-history.length + 1)
-//     }, 50)
-//     next(false)
-//   }
 })
 export default class extends Vue {
-  protected logout: any
+  count = 3
+  timer: any
+  $router: any
 
-  // 注销完成,返回我的页面
-  // complete () {
-  // history.go(-history.length + 1)
-  // }
+  created () {
+    this.setCountDown()
+  }
+
+  setCountDown () {
+    if (!this.timer) {
+      this.timer = setInterval(() => {
+        if (this.count > 0 && this.count <= 10) {
+          this.count--
+        } else {
+          clearInterval(this.timer)
+          this.timer = null
+          this.$router.push('/home')
+        }
+      }, 1000)
+    }
+  }
 }
 </script>
 <style lang="scss">

+ 8 - 0
jydocs-mobile/vue.config.js

@@ -60,6 +60,14 @@ module.exports = {
         pathRewrite: {
           '^/distribution': '/distribution'
         }
+      },
+      '^/jydocs': {
+        target: '192.168.20.180:821',
+        changeOrigin: true,
+        logLevel: 'debug',
+        pathRewrite: {
+          '^/jydocs': '/jydocs'
+        }
       }
     }
   },

+ 5 - 4
jydocs-pc/src/App.vue

@@ -24,12 +24,12 @@ export default {
           text: '列表页'
         },
         {
-          to: '/keep',
+          to: '/user/docs',
           text: '收藏页'
         },
         {
-          to: '/mine',
-          text: '我的'
+          to: '/user/collections',
+          text: '收藏页2'
         }
       ]
     }
@@ -37,9 +37,10 @@ export default {
 }
 </script>
 <style lang="scss">
-@import '~@/assets/style/reset-ele.scss';
+@import "~@/assets/style/reset-ele.scss";
 
 .page--docs--index.bg-white {
+  background-color: #fff;
   .page-container {
     background-color: #fff;
   }

+ 14 - 0
jydocs-pc/src/api/mock/coin.json

@@ -0,0 +1,14 @@
+{
+    "error_code": 0,
+    "data": {
+        "code": 1,
+        "message": "积分明细查询成功",
+        "count": 42,
+        "data": {
+            "points": {
+                "balance": 200,
+                "expire": 0
+            }
+        }
+    }
+}

+ 5 - 2
jydocs-pc/src/api/mock/detail.json

@@ -3,15 +3,18 @@
   "error_msg": "",
   "data": {
     "status": 1,
+    "docCang": 1,
     "detail": {
       "docId": "RJ82241sM3DyHwrupW7w",
       "docName": "软件单元、组装、确认测试系统-中标候选人公示",
       "price": 359,
       "docFileSize": 387,
       "docPageSize": 5,
-      "tags": "信息技术",
+      "tags": "法律法规,行政法规",
       "uploadDate": "2021-03-17 15:46:04",
-      "docFileType": 6,
+      "viewTimes": 55,
+      "downTimes": 6,
+      "docFileType": 1,
       "docSummary": "公告软件单元、组装、确认测试系统-中标候选人公示(招标编号:ZKX20210231A002)公示开始时间:2021年01月28日09时00分00秒公示结束时间:2021年02月01日23时59分59秒本软件单元、组装、确认测试系统(招标项目"
     }
   }

+ 11 - 0
jydocs-pc/src/api/mock/indexTag.json

@@ -0,0 +1,11 @@
+{
+  "error_code": 0,
+  "error_msg": "",
+  "data": [
+    "全部",
+    "招标",
+    "法律法规",
+    "行业报告",
+    "测试"
+  ]
+}

+ 0 - 0
jydocs-pc/src/api/mock/user$collect$add.json → jydocs-pc/src/api/mock/userCollectAdd.json


+ 0 - 0
jydocs-pc/src/api/mock/user$collect$remove.json → jydocs-pc/src/api/mock/userCollectRemove.json


+ 53 - 0
jydocs-pc/src/api/modules/detail.js

@@ -0,0 +1,53 @@
+import httpRequest from '@/api'
+import mockRequest from '@/api/mock'
+// import qs from 'qs'
+
+let request = httpRequest
+if (process.env.NODE_ENV === 'development' && process.env.VUE_APP_MOCK === 'true') {
+  // @ts-ignore
+  request = mockRequest
+}
+
+export function getDetails (data) {
+//   data = qs.stringify(data)
+  return request({
+    url: '/detail',
+    method: 'post',
+    data: data
+  })
+}
+
+export function getAdverse (data) {
+  return request({
+    url: '/getAdvertisement',
+    method: 'post',
+    data: data
+  })
+}
+
+export function getAdd (data) {
+  console.log(data)
+  return request({
+    url: '/userCollectAdd',
+    method: 'post',
+    data
+  })
+}
+
+export function getRemove (data) {
+  console.log(data)
+  return request({
+    url: '/userCollectRemove',
+    method: 'post',
+    data
+  })
+}
+
+export function getCoin (data) {
+  console.log(data)
+  return request({
+    url: '/coin',
+    method: 'post',
+    data
+  })
+}

+ 7 - 0
jydocs-pc/src/api/modules/home.js

@@ -17,6 +17,13 @@ export function getHomeHot (data) {
   })
 }
 
+export function getSearchTag () {
+  return request({
+    url: '/indexTag',
+    method: 'post'
+  })
+}
+
 export function getHomeActivity (data) {
   return request({
     url: '/activityList',

+ 38 - 0
jydocs-pc/src/api/modules/purchase.js

@@ -0,0 +1,38 @@
+import httpRequest from '@/api'
+import mockRequest from '@/api/mock'
+import qs from 'qs'
+
+let request = httpRequest
+if (process.env.NODE_ENV === 'development' && process.env.VUE_APP_MOCK === 'true') {
+  // @ts-ignore
+  request = mockRequest
+}
+
+// 文档购买
+export function getDocPays (data) {
+  data = qs.stringify(data)
+  return request({
+    url: '/user/buy',
+    method: 'post',
+    data: data
+  })
+}
+
+// 积分详情
+export function getJYchannel (data) {
+  data = qs.stringify(data)
+  return request({
+    url: '/getList',
+    method: 'post',
+    data: data
+  })
+}
+
+export function getDetails (data) {
+  data = qs.stringify(data)
+  return request({
+    url: '/detail',
+    method: 'post',
+    data: data
+  })
+}

+ 6 - 3
jydocs-pc/src/api/modules/user.js

@@ -1,5 +1,6 @@
 import httpRequest from '@/api'
 import mockRequest from '@/api/mock'
+import qs from 'qs'
 
 let request = httpRequest
 if (process.env.NODE_ENV === 'development' && process.env.VUE_APP_MOCK === 'true') {
@@ -15,9 +16,11 @@ export function ajaxSetLogin (data) {
   })
 }
 
-export function ajaxGetTest () {
+export function getUserDocs (data) {
+  data = qs.stringify(data)
   return request({
-    url: '/test/ajax',
-    method: 'get'
+    url: '/user/list',
+    method: 'POST',
+    data
   })
 }

+ 22 - 20
jydocs-pc/src/components/Search.vue

@@ -7,7 +7,7 @@
                 clearable>
             <el-button @click="submitSearch" slot="append" icon="el-icon-jy-search"></el-button>
         </el-input>
-        <el-tabs v-model="type">
+        <el-tabs v-model="type" v-show="tabs.length">
           <el-tab-pane v-for="item in tabs" :key="item.type" :label="item.label" :name="item.type"></el-tab-pane>
         </el-tabs>
     </div>
@@ -15,6 +15,9 @@
 
 <script>
 import { Input, Button, Tabs, TabPane } from 'element-ui'
+import { getSearchTag } from '../api/modules/home'
+import { recoveryPageData } from '../utils'
+
 export default {
   name: 'Search-Input',
   props: {
@@ -29,28 +32,13 @@ export default {
   data () {
     return {
       input: '',
-      type: 'all',
-      tabs: [
-        {
-          type: 'all',
-          label: '全部'
-        },
-        {
-          type: '招标',
-          label: '招标'
-        },
-        {
-          type: '法律法规',
-          label: '法律法规'
-        },
-        {
-          type: '行业报告',
-          label: '行业报告'
-        }
-      ]
+      type: '全部',
+      tabs: []
     }
   },
   beforeMount () {
+    this.tabs = recoveryPageData('jy-docs-search-tags-pc')
+    this.getTags()
     const qUrl = this.$route.query
     qUrl && qUrl.type && (this.type = qUrl.type)
     if (qUrl && qUrl.text) {
@@ -62,6 +50,20 @@ export default {
     }
   },
   methods: {
+    async getTags () {
+      getSearchTag().then(res => {
+        if (!res.data.error_msg.length) {
+          this.tabs = res.data.data.map(v => {
+            return {
+              type: v,
+              label: v
+            }
+          })
+          this.type = this.tabs[0].type
+          sessionStorage.setItem('jy-docs-search-tags-pc', JSON.stringify(this.tabs))
+        }
+      })
+    },
     submitSearch () {
       if (!this.input.length) {
         return

+ 17 - 2
jydocs-pc/src/router.js

@@ -1,6 +1,6 @@
 import Vue from 'vue'
 import Router from 'vue-router'
-import Home from './views/Home.vue'
+// import Home from './views/Home.vue'
 
 Vue.use(Router)
 
@@ -43,10 +43,25 @@ export default new Router({
       name: 'purchasesuccess',
       component: () => import('@/views/purchase/purchasesuccess.vue')
     },
+    {
+      // 我的文库
+      path: '/user/docs',
+      name: 'user-docs',
+      component: () => import('@/views/UserDocs.vue')
+    },
+    {
+      // 我的收藏
+      path: '/user/collections',
+      name: 'user-docs',
+      component: () => import('@/views/UserCollections.vue')
+    },
     {
       path: '/404',
       name: '404',
       component: () => import('@/views/404.vue')
     }
-  ]
+  ],
+  scrollBehavior (to, from, savedPosition) {
+    return { x: 0, y: 0 }
+  }
 })

+ 5 - 1
jydocs-pc/src/utils/globalFunctions.js

@@ -248,7 +248,7 @@ export function docTypeConvert (docType = 'pdf') {
     pdf: 'pdf'
   }
   const type = typeMap[docType]
-  return type ? type : docType  // map中不存在的,则返回原始类型
+  return type || docType // map中不存在的,则返回原始类型
 }
 
 /**
@@ -328,3 +328,7 @@ export function replaceKeyword (value, oldChar, newChar) {
   }
   return value
 }
+
+export function recoveryPageData (key, defaultValues = {}) {
+  return sessionStorage.getItem(key) ? JSON.parse(sessionStorage.getItem(key) || '') : defaultValues
+}

+ 190 - 177
jydocs-pc/src/views/Content.vue

@@ -3,24 +3,25 @@
       <div class="d-left">
           <div class="tops">
               <h3>
-                  <i class="el-icon-jy-word"></i>
-                  优化招投标市场营商环境与国企采购人主体责任、采购与招标培训资料
+                  <i :class="'el-icon-jy-' + fileType(datas.docFileType)"></i>
+                  {{datas.docName}}
               </h3>
               <div class="tips">
                   <ul>
-                      <li class="tags" v-for="(item,index) in datas" :key="index">{{item.name}}</li>
-                      <li>11222次浏览<el-divider direction="vertical"></el-divider></li>
-                      <li>222次下载<el-divider direction="vertical"></el-divider></li>
-                      <li>共13页<el-divider direction="vertical"></el-divider></li>
-                      <li>22k<el-divider direction="vertical"></el-divider></li>
-                      <li class="no-line">2021-02-23上传</li>
+                      <li class="tags" v-for="item in datas.tags" :key="item">{{item}}</li>
+                      <li>{{datas.viewTimes}}次浏览<el-divider direction="vertical"></el-divider></li>
+                      <li>{{datas.downTimes}}次下载<el-divider direction="vertical"></el-divider></li>
+                      <li>共{{datas.docPageSize}}页<el-divider direction="vertical"></el-divider></li>
+                      <li>{{datas.docFileSize}}k<el-divider direction="vertical"></el-divider></li>
+                      <li class="no-line">{{datas.uploadDate | dateFormatter}}上传</li>
                   </ul>
-                  <div class="coin"><span>200</span>剑鱼币</div>
+                  <div class="coin"><i class="el-icon-jy-iconJianYu"></i><span>{{datas.price}}</span></div>
               </div>
               <div class="buyed" v-if="buyed">您已兑换过该文档,可直接下载</div>
-              <div class="buyed no-buyed" v-else>剑鱼币余额不足,现有 50 剑鱼币,还需 150 剑鱼币,请先充值</div>
+              <div class="buyed no-buyed" v-else-if="datas.price > coinNum && !buyed">剑鱼币余额不足,现有 {{coinNum}} 剑鱼币,还需 {{datas.price - coinNum}} 剑鱼币,请先充值</div>
+              <el-divider class="heng-line" v-else></el-divider>
               <div class="load-doc">
-                  <el-button type="primary">下载文档</el-button>
+                  <el-button type="primary">{{btnName}}</el-button>
                   <div class="icons">
                       <el-tooltip placement="bottom" effect="light" popper-class="f-share">
                           <span class="spa1"><i class="el-icon-jy-share"></i>分享</span>
@@ -29,7 +30,7 @@
                               <p style="color: #686868;font-size: 14px;text-align:center;">微信扫码分享</p>
                           </div>
                       </el-tooltip>
-                      <span class="spa1 spa2" @click="collectd=!collectd"><i :class="collectd?'el-icon-jy-weiguanzhu':'el-icon-jy-guanzhu'"></i>收藏</span>
+                      <span class="spa1 spa2" @click="shoucang"><i :class="collectd==1?'el-icon-jy-guanzhu':'el-icon-jy-weiguanzhu'"></i>收藏</span>
                       <el-tooltip content="如果您发现此内容有侵权行为,请联系客服400-108-6670进行投诉" placement="top" effect="dark">
                           <span class="spa1"><i class="el-icon-jy-jubao"></i>投诉举报</span>
                       </el-tooltip>
@@ -38,18 +39,19 @@
           </div>
           <div class="middles">
               <h3>摘要</h3>
-              <p>优化招投标市场营商环境与国企采购人主体责任、采购与招标培训资料摘要摘要摘要摘要摘要摘要摘要摘要摘要摘要摘要摘要摘要摘要摘要摘要摘要摘要摘要摘要摘要摘要摘要摘要摘要摘要摘要摘要摘要摘要摘要摘要摘要摘要摘要摘要摘要摘要摘要摘要摘要摘要摘要摘要摘要摘要摘要摘要摘要摘要摘要摘要摘要摘要摘要摘要摘要摘要摘要摘要摘要摘要摘要摘要摘要摘要摘要摘要摘要摘要摘要摘要摘要摘要摘要摘要摘要摘要摘要摘要摘要。</p>
+              <p>{{datas.docSummary}}</p>
               <div class="continue" v-show="!buyed">全文共18页,<span @click="continued">继续阅读<i class="el-icon-arrow-down"></i></span></div>
           </div>
+          <div class="head-tip" id="fixedTop" :class="{'is-fixed':fixed}">
+                <h3 v-show="fixed">
+                <i :class="'el-icon-jy-' + fileType(datas.docFileType)"></i>
+                <span>{{datas.docName}}</span>
+                </h3>
+                <span><i>1</i> / {{datas.docPageSize}}</span>
+          </div>
           <div class="bottoms" id="colWidth" v-show="buyed">
               <div class="page">
-                  <div class="head-tip" id="fixedCard" :class="{'is-fixed':fixed}">
-                      <h3 v-show="fixed">
-                          <i class="el-icon-jy-word"></i>
-                          <span>优化招投标市场营商环境与国企采购人主体责任、采购与招标培训资料优化招投标市场营商环境与国企采购人主体责任、采购与招标培训资料</span>
-                      </h3>
-                      <span><i>1</i> / 8</span>
-                  </div>
+                  
                   <div class="cont-p"></div>
               </div>
               <div class="foot-tip tops">
@@ -62,101 +64,168 @@
                                   <p style="color: #686868;font-size: 14px;text-align:center;">微信扫码分享</p>
                               </div>
                           </el-tooltip>
-                          <span class="spa1 spa2" @click="collectd=!collectd"><i :class="collectd?'el-icon-jy-weiguanzhu':'el-icon-jy-guanzhu'"></i>收藏</span>
+                          <span class="spa1 spa2" @click="shoucang"><i :class="collectd==1?'el-icon-jy-guanzhu':'el-icon-jy-weiguanzhu'"></i>收藏</span>
                           <el-tooltip content="如果您发现此内容有侵权行为,请联系客服400-108-6670进行投诉" placement="top" effect="dark">
                               <span class="spa1"><i class="el-icon-jy-jubao"></i>投诉举报</span>
                           </el-tooltip>
                       </div>
-                      <el-button type="primary">下载文档</el-button>
+                      <el-button type="primary">{{btnName}}</el-button>
                   </div>
               </div>
           </div>
       </div>
       <div class="d-right">
           <div class="r-tops">
-
-          </div>
-          <div class="r-bott">
-              <h3>相关推荐</h3>
-              <div class="docs">
-                  <div class="imgs">
-                      <img src="../assets/images/123.png" alt="">
-                      <i class="el-icon-jy-word"></i>
-                  </div>
-                  <div class="conts">
-                      <h5>优化招投标市场营商环境与国企采购人主体优化招投标市场营商环境与国企采购人主体</h5>
-                      <p>贡献者:刘梅里</p>
-                      <div class="d-tip">
-                          <p>2022次下载</p>
-                          <el-divider direction="vertical"></el-divider>
-                          <p>共18页</p>
-                          <el-divider direction="vertical"></el-divider>
-                          <p>220k</p>
-                      </div>
-                      <div class="r-coin">500剑鱼币</div>
-                  </div>
-              </div>
+              <router-link v-for="item in adsUrl" :key="item.s_pic" :to="item.s_link">
+                <img :src="item.s_pic">
+              </router-link>
           </div>
       </div>
   </div>
 </template>
 
 <script>
-import { Button, Tooltip, Divider } from 'element-ui'
+import { Button, Tooltip, Divider, Message } from 'element-ui'
+import { getDetails, getAdverse, getCoin, getAdd, getRemove } from '../api/modules/detail'
 export default {
   components: {
     [Button.name]: Button,
     [Tooltip.name]: Tooltip,
-    [Divider.name]: Divider
+    [Divider.name]: Divider,
+    [Message.name]: Message
   },
   data () {
     return {
-      datas: [{ name: '招标' }, { name: '培训' }],
-      buyed: true,
-      collectd: true,
+      datas: [],
+      adsUrl: [],
+      coinNum: 0,
+      btnName: '',
+      buyed: false,
+      collectd: 0,
       offsetTop: 0,
       offsetWidth: 0,
       colWidth: 0,
       fixed: false
     }
   },
+  created () {
+    this.details()
+    this.adverse()
+    this.setTop()
+  },
   mounted () {
     // 监听滚轮
     window.addEventListener('scroll', this.initHeight)
-    this.setTop()
+    
   },
   destroyed () { // 移除监听
     window.removeEventListener('scroll', this.initHeight)
   },
   methods: {
+    details () {
+      getDetails({ docId: '123132' }).then(res => {
+        console.log(res)
+        if (res.data.error_code === 0) {
+          this.datas = res.data.data.detail
+          this.datas.tags = this.datas.tags.split(',')
+          this.buyed = !!(res.data.data.status)
+          this.collectd = res.data.data.docCang
+        }
+      })
+      getCoin({L: true}).then(res => {
+        console.log(res)
+        if (res.data.error_code === 0) {
+          this.coinNum = res.data.data.data.points.balance
+          if (this.buyed) {
+           this.btnName = '下载文档'
+          } else {
+            if (this.coinNum < this.datas.price) {
+                this.btnName = '立即充值'
+            } else {
+                this.btnName = '立即兑换'
+            }
+          }
+        }
+      })
+      
+    },
+    adverse () {
+      getAdverse({ code: '1233456', num: 1 }).then(res => {
+        console.log(res)
+        this.adsUrl = res.data.data
+      })
+    },
     setTop () {
       this.$nextTick(() => {
         // 获取到达页面顶端的值
-        const height = document.getElementById('fixedCard')
-        this.offsetTop = height.offsetTop
+        const height = document.getElementById('fixedTop')
+        this.offsetTop = height.getBoundingClientRect().top
         console.log(this.offsetTop)
       })
     },
     initHeight () {
       // 获取页面滚动距离
       const scrollTop = window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop
-      // 判断滚动距离是否大于元素到顶端距离
       this.fixed = !!(scrollTop > this.offsetTop && this.buyed)
     },
+    shoucang () {
+      if (this.collectd === 0) {
+        getAdd({ docId: '111' }).then(res => {
+          console.log(res)
+          if (res.data.error_code === 0) {
+            this.collectd = 1
+            Message({
+              message: '收藏成功',
+              type: 'success'
+            })
+          }
+        })
+      } else {
+        getRemove({ docId: '111' }).then(res => {
+          console.log(res)
+          if (res.data.error_code === 0) {
+            this.collectd = 0
+            Message({
+              message: '取消收藏',
+              type: 'warning'
+            })
+          }
+        })
+      }
+    },
     continued () {
       // this.buyed = !this.buyed;
       // this.setTop();
+    },
+    fileType (val) {
+      if (val === 1) {
+        return 'word'
+      } else if (val === 2) {
+        return 'pdf'
+      } else if (val === 3) {
+        return 'excel'
+      } else if (val === 4) {
+        return 'ppt'
+      } else if (val === 5) {
+        return 'txt'
+      } else {
+        return ''
+      }
     }
   }
 }
 </script>
 
 <style lang="scss" scoped>
+@include diy-icon('pdf', 24);
+@include diy-icon('word', 24);
+@include diy-icon('excel', 24);
+@include diy-icon('ppt', 24);
 @include diy-icon('share', 18);
 @include diy-icon('jubao', 18);
 @include diy-icon('weiguanzhu', 18);
 @include diy-icon('guanzhu', 18);
-@include diy-icon('word', 24);
+@include diy-icon('iconJianYu', 24);
 
 .c-details {
   width: 1200px;
@@ -193,11 +262,12 @@ export default {
                   flex-direction: initial;
                   align-items: center;
                   li {
+                      display: flex;
                       list-style-type: none;
+                      align-items: center;
                   }
                   .tags {
-                      width: 40px;
-                      height: 22px;
+                      padding: 2px 8px;
                       border-radius: 4px;
                       background: rgba(44, 167, 227, 0.08);
                       color: #2cb7ca;
@@ -216,13 +286,12 @@ export default {
                   }
               }
               .coin {
+                  display: flex;
+                  align-items: center;
                   span {
-                      font-size: 24px;
-                      margin-right: 4px;
+                      font-size: 20px;
+                      color: #FF3A20;
                   }
-                  color: rgba(44,183,202,1);
-                  font-size: 12px;
-                  line-height: 20px;
               }
           }
           .buyed {
@@ -239,6 +308,10 @@ export default {
               background: rgba(255,58,32,0.05)!important;
               color: rgb(255,58,32)!important;
           }
+          .heng-line {
+            margin: 8px 0;
+            background-color: #ECECEC;
+          }
           .load-doc {
               height: 52px;
               display: flex;
@@ -308,59 +381,59 @@ export default {
               }
           }
       }
+      .head-tip {
+            width: 920px;
+            height: 42px;
+            background: #fcfcfc;
+            // filter:alpha(opacity=80); //IE
+            // opacity: 0.8;   //Chrome
+            display: flex;
+            justify-content: flex-end;
+            align-items: center;
+            padding: 0 40px;
+            border-bottom: 1px solid #F2F2F4;
+            h3 {
+                display: flex;
+                align-items: center;
+                span {
+                    width: 700px;
+                    color: #686868;
+                    font-weight: 500;
+                    font-size: 16px;
+                    line-height: 24px;
+                    overflow: hidden;
+                    text-overflow:ellipsis;
+                    white-space: nowrap;
+                }
+                i {
+                    margin-right: 8px;
+                }
+            }
+            span {
+                color: #686868;
+                font-size: 14px;
+                i {
+                    display: inline-block;
+                    font-style: normal;
+                    width: 22px;
+                    height: 22px;
+                    line-height: 24px;
+                    text-align: center;
+                    border-radius: 2px;
+                    background: #FFFFFF;
+                    border: 1px solid #ECECEC;
+                }
+            }
+        }
+        .is-fixed {
+            position: fixed;
+            top: 0;
+            justify-content: space-between;
+        }
       .bottoms {
           display: flex;
           flex-direction: column;
           .page {
-              .head-tip {
-                  width: 920px;
-                  height: 42px;
-                  background: #fcfcfc;
-                  // filter:alpha(opacity=80); //IE
-                  // opacity: 0.8;   //Chrome
-                  display: flex;
-                  justify-content: flex-end;
-                  align-items: center;
-                  padding: 0 40px;
-                  border-bottom: 1px solid #F2F2F4;
-                  h3 {
-                      display: flex;
-                      align-items: center;
-                      span {
-                          width: 700px;
-                          color: #686868;
-                          font-weight: 500;
-                          font-size: 16px;
-                          line-height: 24px;
-                          overflow: hidden;
-                          text-overflow:ellipsis;
-                          white-space: nowrap;
-                      }
-                      i {
-                          margin-right: 8px;
-                      }
-                  }
-                  span {
-                      color: #686868;
-                      font-size: 14px;
-                      i {
-                          display: inline-block;
-                          font-style: normal;
-                          width: 22px;
-                          height: 22px;
-                          line-height: 24px;
-                          text-align: center;
-                          border-radius: 2px;
-                          background: #FFFFFF;
-                          border: 1px solid #ECECEC;
-                      }
-                  }
-              }
-              .is-fixed {
-                  position: fixed;
-                  top: 0;
-                  justify-content: space-between;
-              }
               .cont-p {
                   height: 1248px;
                   background: #fff;
@@ -389,76 +462,16 @@ export default {
       width: 264px;
       margin-left: 16px;
       .r-tops {
+          overflow: hidden;
           min-height: 456px;
           border-radius: 4px;
-          background: #c4c4c4;
-      }
-      .r-bott {
-          min-height: 448px;
-          border-radius: 4px;
-          background: #fff;
-          margin-top: 16px;
-          padding: 15px 12px;
-          h3 {
-              color: #686868;
-              font-size: 16px;
-              line-height: 24px;
-              font-weight: 500;
-              margin-bottom: 13px;
+        //   background: #c4c4c4;
+          img {
+              width: 100%;
+              cursor: pointer;
           }
-          .docs {
-              display: flex;
-              .imgs {
-                  position: relative;
-                  border-radius: 4px;
-                  border: 1px solid #ECECEC;
-                  img {
-                      width: 78px;
-                      height: 112px;
-                      border: 0;
-                  }
-                  i {
-                      position: absolute;
-                      right: 0;
-                      bottom: 0;
-                  }
-              }
-              .conts {
-                  margin-left: 8px;
-                  h5 {
-                      font-size: 14px;
-                      line-height: 24px;
-                      font-weight: 500;
-                      display: -webkit-box;
-                      -webkit-line-clamp:2;
-                      overflow: hidden;
-                      text-overflow: ellipsis;
-                      -webkit-box-orient: vertical;
-                  }
-                  p {
-                      color: #999999;
-                      font-size: 12px;
-                      line-height: 20px;
-                  }
-                  .d-tip {
-                      display: flex;
-                      flex-direction: initial;
-                      align-items: center;
-                      .el-divider--vertical {
-                          height: 0.8em;
-                          margin: 0 2px;
-                      }
-                      p {
-                          padding: 0 2px;
-                      }
-                  }
-                  .r-coin {
-                      color: #2CB7CA;
-                      font-size: 14px;
-                      line-height: 24px;
-                      margin-top: 2px;
-                  }
-              }
+          img:not(:last-child) {
+              margin-bottom: 5px;
           }
       }
   }

+ 3 - 5
jydocs-pc/src/views/Home.vue

@@ -125,9 +125,7 @@ import { ajaxGetTest } from '../api/modules/user'
 import { Button } from 'element-ui'
 import SearchInput from '../components/Search'
 import { getHomeActivity, getHomeHot } from '../api/modules/home'
-function recoveryPageData (key, defaultValues = {}) {
-  return sessionStorage.getItem(key) ? JSON.parse(sessionStorage.getItem(key) || '') : defaultValues
-}
+import { recoveryPageData } from '../utils'
 
 function checkType (type) {
   let typeStr = ''
@@ -202,13 +200,13 @@ export default {
       return this.pageData?.new && this.pageData?.new.slice(0, 5)
     },
     newList2 () {
-      return this.pageData?.new && this.pageData?.new.slice(5,)
+      return this.pageData?.new && this.pageData?.new.slice(5)
     },
     hotList1 () {
       return this.pageData?.hot && this.pageData?.hot.slice(0, 5)
     },
     hotList2 () {
-      return this.pageData?.hot && this.pageData?.hot.slice(5,)
+      return this.pageData?.hot && this.pageData?.hot.slice(5)
     }
   },
   methods: {

+ 4 - 4
jydocs-pc/src/views/Search.vue

@@ -119,7 +119,7 @@ export default {
         loaded: false,
         loading: false,
         pageNum: 1,
-        list: [] 
+        list: []
       }
       Object.assign(this.listState, state)
     },
@@ -148,7 +148,7 @@ export default {
       const r = await getSearch(query)
       this.listState.loading = false
       this.listState.loaded = true
-  
+
       const res = r.data
       if (res.error_code === 0) {
         this.listState.total = res.data.total
@@ -177,7 +177,6 @@ export default {
     },
     onPageChange (p) {
       this.listState.pageNum = p
-      this.listState.loading = true
       this.doSearch()
     },
     calcSubInfo (item) {
@@ -232,7 +231,8 @@ export default {
     min-height: 500px;
   }
   .search-pagination {
-    margin: 28px 0 60px;
+    margin-top: 28px;
+    padding-bottom: 60px;
     text-align: right;
   }
 }

+ 161 - 0
jydocs-pc/src/views/UserCollections.vue

@@ -0,0 +1,161 @@
+<template>
+  <div class="user-collections">
+    <div class="user-collections-header">
+      <span class="u-d-title">{{ title }}</span>
+    </div>
+    <div class="user-collections-content">
+      <div class="user-d-list" v-loading="listState.loading">
+        <doc-card
+          v-for="(item, index) in listState.list"
+          :key="index"
+          :title="item.DocName"
+          :desc="item.DocSummary"
+          :docType="item.docFileType"
+          :subInfo="calcSubInfo(item)"
+          @onClick="toDocDetail(item)"
+        >
+          <template slot="price">
+            <div class="highlight-text" v-if="item.Cost === '已购买'">已购买</div>
+            <Price v-else :price="item.Cost" />
+          </template>
+        </doc-card>
+        <no-data v-if="listState.list.length === 0 && listState.loaded">暂无文库收藏</no-data>
+      </div>
+      <div class="user-collections-pagination">
+        <el-pagination
+          background
+          layout="prev, pager, next, ->, total"
+          :hide-on-single-page="true"
+          :current-page="listState.pageNum"
+          :page-size="listState.pageSize"
+          :total="listState.total"
+          @current-change="onPageChange"
+        >
+        </el-pagination>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+import { Pagination } from 'element-ui'
+import DocCard from '@/components/doc-item-card/Card'
+import Price from '@/components/doc-item-card/Price'
+import NoData from '@/components/NoData'
+import { getUserDocs } from '../api/modules/user'
+import { dateFormatter, formatSize } from '@/utils/'
+import { mixinBackground } from '@/utils/mixins'
+
+export default {
+  name: 'user-collections',
+  mixins: [mixinBackground],
+  components: {
+    [Pagination.name]: Pagination,
+    DocCard,
+    Price,
+    NoData
+  },
+  data () {
+    return {
+      title: '我的收藏',
+      listState: {
+        loaded: false, // 是否已经搜索过
+        loading: false,
+        pageNum: 1, // 当前页
+        pageSize: 10, // 每页多少条数据
+        total: 0, // 一共多少条数据
+        list: [] // 查询请求返回的数据
+      }
+    }
+  },
+  created () {
+    this.getList()
+  },
+  methods: {
+    async getList () {
+      const query = {
+        sign: 1,
+        num: this.listState.pageNum,
+        size: this.listState.pageSize
+      }
+      console.log(query)
+      this.listState.loading = true
+      this.listState.loaded = false
+      const r = await getUserDocs(query)
+      this.listState.loading = false
+      this.listState.loaded = true
+      const res = r.data
+      if (res.error_code === 0) {
+        this.listState.total = res.data.total
+        this.listState.list = res.data.list || []
+      }
+    },
+    toDocDetail (item) {
+      const { DocId: id } = item
+      this.$router.push({
+        name: 'content',
+        params: { id }
+      })
+    },
+    onPageChange (p) {
+      this.listState.pageNum = p
+      this.getList()
+    },
+    calcSubInfo (item) {
+      // eslint-disable-next-line
+      const { DocFileSize, CreateAt, UpdateAt, DeletedAt } = item
+      return [dateFormatter(CreateAt * 1000, 'yyyy-MM-dd'), formatSize(DocFileSize)]
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+.user-collections {
+  background-color: #fff;
+  margin: 0 auto;
+  .user-collections-header {
+    padding-top: 48px;
+    .u-d-title {
+      font-size: 24px;
+      line-height: 36px;
+      color: #1D1D1D;
+    }
+  }
+  .user-collections-content {
+    margin-top: 48px;
+    .u-d-header {
+      display: flex;
+      align-items: center;
+      justify-content: space-between;
+      padding: 0 28px;
+      height: 48px;
+      font-size: 14px;
+      line-height: 24px;
+      color: #686868;
+      border-radius: 4px;
+      background-color: #F5F6F7;
+    }
+    .user-d-list {
+      border-top: 1px solid transparent;
+      min-height: 500px;
+    }
+    .u-d-h-r {
+      display: inline-block;
+      width: 170px;
+      .u-d-h-item {
+        display: inline-block;
+        width: 50%;
+        &.size {
+          text-align: center;
+        }
+      }
+    }
+  }
+  .user-collections-pagination {
+    margin-top: 28px;
+    padding-bottom: 60px;
+    text-align: right;
+  }
+}
+</style>

+ 177 - 0
jydocs-pc/src/views/UserDocs.vue

@@ -0,0 +1,177 @@
+<template>
+  <div class="user-docs">
+    <div class="user-docs-header">
+      <span class="u-d-title">{{ title }}</span>
+    </div>
+    <div class="user-docs-content">
+      <div class="u-d-header">
+        <span class="u-d-h-l">文件名</span>
+        <span class="u-d-h-r">
+          <span class="u-d-h-item time">下载时间</span>
+          <span class="u-d-h-item size">大小</span>
+        </span>
+      </div>
+      <div class="user-d-list" v-loading="listState.loading">
+        <doc-card
+          v-for="(item, index) in listState.list"
+          cardType="oneline"
+          :key="index"
+          :title="item.DocName"
+          :docType="item.docFileType"
+          :subInfo="calcSubInfo(item)"
+          @onClick="toDocDetail(item)"
+        />
+        <no-data v-if="listState.list.length === 0 && listState.loaded">暂无我的文库</no-data>
+      </div>
+      <div class="user-docs-pagination">
+        <el-pagination
+          background
+          layout="prev, pager, next, ->, total"
+          :hide-on-single-page="true"
+          :current-page="listState.pageNum"
+          :page-size="listState.pageSize"
+          :total="listState.total"
+          @current-change="onPageChange"
+        >
+        </el-pagination>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+import { Pagination } from 'element-ui'
+import DocCard from '@/components/doc-item-card/Card'
+import NoData from '@/components/NoData'
+import { getUserDocs } from '../api/modules/user'
+import { dateFormatter, formatSize } from '@/utils/'
+import { mixinBackground } from '@/utils/mixins'
+
+export default {
+  name: 'user-docs',
+  mixins: [mixinBackground],
+  components: {
+    [Pagination.name]: Pagination,
+    DocCard,
+    NoData
+  },
+  data () {
+    return {
+      title: '我的文库',
+      listState: {
+        loaded: false, // 是否已经搜索过
+        loading: false,
+        pageNum: 1, // 当前页
+        pageSize: 10, // 每页多少条数据
+        total: 0, // 一共多少条数据
+        list: [] // 查询请求返回的数据
+      }
+    }
+  },
+  created () {
+    this.getList()
+  },
+  methods: {
+    async getList () {
+      const query = {
+        sign: 0,
+        num: this.listState.pageNum,
+        size: this.listState.pageSize
+      }
+      console.log(query)
+      this.listState.loading = true
+      this.listState.loaded = false
+      const r = await getUserDocs(query)
+      this.listState.loading = false
+      this.listState.loaded = true
+      const res = r.data
+      if (res.error_code === 0) {
+        this.listState.total = res.data.total
+        this.listState.list = res.data.list || []
+      }
+    },
+    toDocDetail (item) {
+      const { DocId: id } = item
+      this.$router.push({
+        name: 'content',
+        params: { id }
+      })
+    },
+    onPageChange (p) {
+      this.listState.pageNum = p
+      this.getList()
+    },
+    calcSubInfo (item) {
+      // eslint-disable-next-line
+      const { DocFileSize, CreateAt, UpdateAt, DeletedAt } = item
+      return [dateFormatter(CreateAt * 1000, 'yyyy-MM-dd'), formatSize(DocFileSize)]
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+.user-docs {
+  background-color: #fff;
+  margin: 0 auto;
+  .user-docs-header {
+    padding-top: 48px;
+    .u-d-title {
+      font-size: 24px;
+      line-height: 36px;
+      color: #1D1D1D;
+    }
+  }
+  .user-docs-content {
+    margin-top: 48px;
+    .u-d-header {
+      display: flex;
+      align-items: center;
+      justify-content: space-between;
+      padding: 0 28px;
+      height: 48px;
+      font-size: 14px;
+      line-height: 24px;
+      color: #686868;
+      border-radius: 4px;
+      background-color: #F5F6F7;
+    }
+    .user-d-list {
+      border-top: 1px solid transparent;
+      min-height: 500px;
+    }
+    .u-d-h-r {
+      display: inline-block;
+      width: 170px;
+      .u-d-h-item {
+        display: inline-block;
+        width: 50%;
+        &.size {
+          text-align: center;
+        }
+      }
+    }
+
+    ::v-deep {
+      .subinfo-container {
+        display: inline-block;
+        margin-right: 10px;
+        width: 170px;
+        .subinfo-item {
+          display: inline-block;
+          margin-right: 0;
+          width: 50%;
+          &.last {
+            text-align: center;
+          }
+        }
+      }
+    }
+  }
+  .user-docs-pagination {
+    margin-top: 28px;
+    padding-bottom: 60px;
+    text-align: right;
+  }
+}
+</style>

+ 60 - 11
jydocs-pc/src/views/purchase/purchase.vue

@@ -21,22 +21,22 @@
             </div>
             <div class="doc_c_right">
               <div class="doc_c_infor">
-                <div class="doc_in_title">优化招投标市场营商环境与国企采购人主体负责人</div>
-                <div class="doc_in_author">贡献者:张三</div>
+                <div class="doc_in_title">{{response.docName}}</div>
+                <!-- <div class="doc_in_author">贡献者:张三</div> -->
                 <div class="doc_in_actions">
-                  <span class="doc_download">2022次下载</span>
-                  <span class="doc_pages"> | 共18页 | </span>
-                  <span class="doc_readhot">220k</span>
+                  <span class="doc_download">{{response.downTimes}}次下载</span>
+                  <span class="doc_pages"> | 共{{response.docPageSize}}页 | </span>
+                  <span class="doc_readhot">{{response.docFileSize}}k</span>
                 </div>
               </div>
               <div class="doc_abstract">
-                本次股票发行后拟在科创板市场上市,该市场具有较高的投资风险。科创板公司具有研发投入大、经营风险高、业绩不稳定、退市风险高等特点该市场具有较高的投资风险。科创板公司具有研发投入大、经营风险高、业绩不稳定、退市风险高等特点,投资者面临较大的市场风险。投资者应充分了解科创板市场的投资...
+                {{response.docSummary}}
               </div>
             </div>
           </div>
           <div class="doc_content_actical">
             <span class="icon_jianyu"></span>
-            <span class="jianyumoney">500</span>
+            <span class="jianyumoney">{{response.price}}</span>
           </div>
         </div>
         <div class="doc_bindphone">
@@ -45,20 +45,20 @@
         </div>
         <div class="doc_balance">
           <span class="balance_label">剑鱼币余额:</span>
-          <span class="balance_num">3200</span>
+          <span class="balance_num">{{response.channel}}</span>
         </div>
         <div class="doc_setment">
           <span class="setment_label">兑换所需剑鱼币:</span>
           <div class="setment_num">
             <span class="icon_jianyu"></span>
-            <span class="setmoney">500</span>
+            <span class="setmoney">{{response.price}}</span>
           </div>
         </div>
         <div class="doc_agreement">
           <el-checkbox v-model="checked" >我已阅读并同意<a href="javascript:;" class="agree_link">《剑鱼标讯线上购买与服务条款》</a></el-checkbox>
         </div>
         <div class="doc_surepur">
-          <button class="btnsure" id="btnsure">确定兑换</button>
+          <button class="btnsure" @click="setExhange()" :disabled="!this.checked" id="btnsure">确定兑换</button>
         </div>
       </div>
     </div>
@@ -67,6 +67,7 @@
 
 <script>
 import { checkbox } from 'element-ui'
+import { getDocPays, getJYchannel, getDetails } from '../../api/modules/purchase'
 
 export default {
   name: 'purchasePage',
@@ -75,10 +76,55 @@ export default {
   },
   data () {
     return {
-      checked: true
+      checked: true,
+      response: {
+        docName: '',
+        price: '',
+        downTimes: '',
+        docFileSize: '',
+        docPageSize: '',
+        previewImgId: '',
+        docSummary: '',
+        channel: ''
+      }
     }
   },
+  created () {
+    this.getWordDetail()
+  },
   methods: {
+    // 文档信息
+    async getWordDetail () {
+      getDetails({ docId: '4e9cf3a8-8853-11eb-8699-0050568f51e7', phone: '18439509554' }).then((res) => {
+        console.log(res)
+        const item = res.data.detail
+        if (res.error_code === 0) {
+          this.response.docName = item.docName
+          this.response.price = item.price
+          this.response.downTimes = item.downTimes
+          this.response.docFileSize = item.docFileSize
+          this.response.docPageSize = item.docPageSize
+          this.response.previewImgId = item.previewImgId
+          this.response.docSummary = item.docSummary
+        }
+      })
+      getJYchannel({ B: true }).then((res) => {
+        console.log(res)
+        if (res.error_code === 0) {
+          this.response.channel = res.points.balance
+        }
+      })
+    },
+    // 确定兑换
+    setExhange () {
+      console.log(111)
+      getDocPays({ docId: '4f6c00ba-8882-11eb-8699-0050568f51e7', phone: '18439509554' }).then((res) => {
+        console.log(res)
+        if (res.data === 'success') {
+          this.$router.push('/purchasesuccess')
+        }
+      })
+    }
   }
 }
 </script>
@@ -329,6 +375,9 @@ export default {
           color: #FFFFFF;
           font-size: 16px;
         }
+        .btnsure:disabled{
+          opacity: 0.5;
+        }
       }
     }
   }