xgwangman 4 жил өмнө
parent
commit
7669611da7
35 өөрчлөгдсөн 1102 нэмэгдсэн , 347 устгасан
  1. 8 2
      jydocs-back/config.json
  2. 9 3
      jydocs-back/config/config.go
  3. 1 2
      jydocs-back/filter/filter.go
  4. 2 2
      jydocs-back/filter/logfilter.go
  5. 3 2
      jydocs-back/go.mod
  6. 2 2
      jydocs-back/rpc/fileSystemRpc.go
  7. 1 16
      jydocs-back/rpc/stdDocRpc.go
  8. 1 0
      jydocs-back/servers/a_init.go
  9. 49 0
      jydocs-back/servers/share.go
  10. 4 1
      jydocs-back/servers/stdDoc.go
  11. 13 3
      jydocs-mobile/src/api/main.ts
  12. 1 0
      jydocs-mobile/src/components/RechargeHave.vue
  13. 40 3
      jydocs-mobile/src/store/modules/main.ts
  14. 15 0
      jydocs-mobile/src/utils/globalFunctionsForApp.ts
  15. 86 21
      jydocs-mobile/src/views/purchase/purchase.vue
  16. 21 26
      jydocs-mobile/src/views/purchase/purchasesuccess.vue
  17. 15 10
      jydocs-pc/src/App.vue
  18. 60 64
      jydocs-pc/src/api/mock/activityList.json
  19. 101 81
      jydocs-pc/src/api/mock/topList.json
  20. 38 0
      jydocs-pc/src/api/modules/purchase.js
  21. 3 1
      jydocs-pc/src/api/modules/search.js
  22. 6 3
      jydocs-pc/src/api/modules/user.js
  23. 15 0
      jydocs-pc/src/assets/style/reset-ele.scss
  24. 1 0
      jydocs-pc/src/components/NoData.vue
  25. 5 5
      jydocs-pc/src/components/Search.vue
  26. 5 4
      jydocs-pc/src/components/doc-item-card/Card.vue
  27. 16 1
      jydocs-pc/src/router.js
  28. 15 0
      jydocs-pc/src/utils/globalFunctions.js
  29. 8 0
      jydocs-pc/src/utils/mixins.js
  30. 34 3
      jydocs-pc/src/views/Home.vue
  31. 122 78
      jydocs-pc/src/views/Search.vue
  32. 161 0
      jydocs-pc/src/views/UserCollections.vue
  33. 177 0
      jydocs-pc/src/views/UserDocs.vue
  34. 60 11
      jydocs-pc/src/views/purchase/purchase.vue
  35. 4 3
      jydocs-pc/vue.config.js

+ 8 - 2
jydocs-back/config.json

@@ -1,7 +1,12 @@
 {
   "webport": "821",
   "appid": "10000",
-  "ossAdmin": "",
+  "ossAdmin": "oss-cn-beijing.aliyuncs.com",
+  "ossBucket": {
+    "std": "jydocs-std",
+    "user": "jydocs-priv",
+    "priv": "jydocs-previewimg"
+  },
   "rpcServers": {
     "stdDoc": {
       "key": "jydocs.stdlib.rpc",
@@ -27,5 +32,6 @@
         "127.0.0.1:2379"
       ]
     }
-  }
+  },
+  "shareUrl": "https://web-jydev-wky.jianyu360.cn/swordfish/docs/index/content/%s"
 }

+ 9 - 3
jydocs-back/config/config.go

@@ -3,15 +3,21 @@ package config
 import "app.yhyue.com/moapp/jybase/common"
 
 type appConfig struct {
-	WebPort    string `json:"webport"`  //程序端口
-	AppId      string `json:"appid"`    //程序标识
-	OssAdmin   string `json:"ossAdmin"` //阿里云oss域名
+	WebPort   string `json:"webport"`  //程序端口
+	AppId     string `json:"appid"`    //程序标识
+	OssAdmin  string `json:"ossAdmin"` //阿里云oss域名
+	OssBucket struct {
+		Std  string `json:"std"`  //标准库bucket
+		User string `json:"user"` //用户库
+		Priv string `json:"priv"` //缩略图片
+	} `json:"ossBucket"` //阿里云ossbucket
 	RpcServers struct {
 		StdDoc  rpcConfig `json:"stdDoc"`  //标准库rpc接口
 		UserDoc rpcConfig `json:"userDoc"` //用户收藏rpc接口
 		Points  rpcConfig `json:"points"`  //剑鱼积分rpc接口
 		JyFile  rpcConfig `json:"jyFile"`  //剑鱼文件rpc接口
 	} `json:"rpcServers"` //rpc服务配置
+	ShareUrl string `json:"shareUrl"`
 }
 
 type rpcConfig struct {

+ 1 - 2
jydocs-back/filter/filter.go

@@ -8,6 +8,7 @@ import (
 
 func init() {
 	xweb.AddFilter(&Filter{})
+	xweb.AddFilter(&sessionfilter{App: xweb.RootApp()})
 	time.AfterFunc(1*time.Minute, SaveLogTask)
 }
 
@@ -15,8 +16,6 @@ type Filter struct {
 }
 
 func (f *Filter) Do(w http.ResponseWriter, r *http.Request) bool {
-	xweb.AddFilter(&sessionfilter{App: xweb.RootApp()})
-
 	session := xweb.RootApp().SessionManager.Session(r, w)
 	getSession := session.GetMultiple()
 	if !(&logFilter{w, r, session, getSession, make(map[string]interface{})}).Do() {

+ 2 - 2
jydocs-back/filter/logfilter.go

@@ -55,7 +55,7 @@ func SaveLogTask() {
 		arr = make([]map[string]interface{}, 0)
 		go func() {
 			log.Println("timer..save..visit..log", len(tmp))
-			public.Mgo_Log.SaveBulk("jy_logs", tmp...)
+			public.Mgo_Log.SaveBulk("jy_docs_logs", tmp...)
 		}()
 	}
 
@@ -115,7 +115,7 @@ func (l *logFilter) addLog() {
 		arr = make([]map[string]interface{}, 0)
 		go func() {
 			log.Println("save..visit..log", len(tmp))
-			public.Mgo_Log.SaveBulk("jy_logs", tmp...)
+			public.Mgo_Log.SaveBulk("jy_docs_logs", tmp...)
 		}()
 	}
 	lock.Unlock()

+ 3 - 2
jydocs-back/go.mod

@@ -3,9 +3,10 @@ module jy-docs
 go 1.13
 
 require (
-	app.yhyue.com/moapp/jyPoints v0.0.0-20210319020458-484a38074edd
-	app.yhyue.com/moapp/jy_docs v0.0.0-20210319060022-e324f5108395
+	app.yhyue.com/moapp/jyPoints v0.0.0-20210319072011-5430a201e0aa
+	app.yhyue.com/moapp/jy_docs v0.0.0-20210319063914-d48d51e0cc46
 	app.yhyue.com/moapp/jybase v0.0.0-20210319015107-fe59d2046cf8
 	app.yhyue.com/moapp/jyfs v0.0.0-20210319011832-6cf539ddc5cd
+	github.com/SKatiyar/qr v0.0.0-20151201054752-25b6bdf44e67
 	github.com/tal-tech/go-zero v1.1.5
 )

+ 2 - 2
jydocs-back/rpc/fileSystemRpc.go

@@ -15,7 +15,7 @@ import (
 var jyFilelLib filesystemclient.FileSystem
 
 func init() {
-	filesystemclient.NewFileSystem(zrpc.MustNewClient(zrpc.RpcClientConf{
+	jyFilelLib = filesystemclient.NewFileSystem(zrpc.MustNewClient(zrpc.RpcClientConf{
 		Etcd: discov.EtcdConf{
 			Key:   config.JyDocsAppConfig.RpcServers.JyFile.Key,
 			Hosts: config.JyDocsAppConfig.RpcServers.JyFile.Address,
@@ -26,7 +26,7 @@ func init() {
 //获取用户对话pdf文件地址
 func GetFileContext(userId, ossId string) (string, error) {
 	resp, err := jyFilelLib.GetOssUril(context.Background(), &filesystem.LoadFileReq{
-		Domain: config.JyDocsAppConfig.OssAdmin,
+		Domain: config.JyDocsAppConfig.OssBucket.Std,
 		FileId: ossId,
 	})
 	if err != nil {

+ 1 - 16
jydocs-back/rpc/stdDocRpc.go

@@ -78,14 +78,13 @@ param
 return
 	文库列表、异常
 */
-func GeActivityList(userId string, code, pageNum, pageSize int64) (interface{}, error) {
+func GeActivityList(userId string, code, pageNum, pageSize int64) ([]*stdlib.DocActivity, error) {
 	resp, err := jyStdDocStdlib.DocActivity(context.Background(), &stdlib.DocActivityReq{
 		AppId:      config.JyDocsAppConfig.AppId,
 		ActivityId: code,
 		PageNum:    pageNum,
 		PageSize:   pageSize,
 	})
-	log.Println(config.JyDocsAppConfig.AppId, int32(code), int32(pageNum), int32(pageSize))
 	if err != nil {
 		log.Printf("%s GeActivityList call error %v\n", userId, err)
 		return nil, err
@@ -112,7 +111,6 @@ func GetDocDetail(userId, docId string) (*stdlib.DocInfo, bool, error) {
 		UserId: userId,
 		DocId:  docId,
 	})
-	log.Println(config.JyDocsAppConfig.AppId, userId, docId)
 	if err != nil {
 		log.Printf("%s GetDocDetail call error %v\n", userId, err)
 		return nil, false, err
@@ -123,16 +121,3 @@ func GetDocDetail(userId, docId string) (*stdlib.DocInfo, bool, error) {
 	}
 	return resp.DocDeail, resp.IsBuy, nil
 }
-
-/*
-获取文库内容
-param
-	userId  用户id
-	docId	文库id
-return
-	interface 文库内容
-	error 异常
-*/
-func GetDocContent(userId, docId string) (interface{}, error) {
-	return nil, nil
-}

+ 1 - 0
jydocs-back/servers/a_init.go

@@ -21,6 +21,7 @@ func init() {
 	xweb.RootApp().BasePath = "/jydocs"
 
 	xweb.AddAction(&Ad{})
+	xweb.AddAction(&Share{})
 	xweb.AddAction(&StdDoc{})
 	xweb.AddAction(&UserDoc{})
 }

+ 49 - 0
jydocs-back/servers/share.go

@@ -0,0 +1,49 @@
+package servers
+
+import (
+	. "app.yhyue.com/moapp/jybase/api"
+	"app.yhyue.com/moapp/jybase/common"
+	"app.yhyue.com/moapp/jybase/go-xweb/xweb"
+	"fmt"
+	"github.com/SKatiyar/qr"
+	"jy-docs/config"
+	"log"
+)
+
+type Share struct {
+	*xweb.Action
+	shareUrl xweb.Mapper `xweb:"/share/url"` //地址分享
+	shareImg xweb.Mapper `xweb:"/share/img"` //链接分享
+}
+
+func (share *Share) ShareUrl() {
+	userId := common.ObjToString(share.GetSession("userId"))
+	rData, errMsg := func() (interface{}, error) {
+		docId := share.GetString("docId") //分享地址
+		return map[string]interface{}{
+			"url": getShareUrl(userId, docId),
+		}, nil
+	}()
+	if errMsg != nil {
+		log.Printf("%s Share  err:%s\n", errMsg.Error(), userId)
+	}
+	share.ServeJson(NewResult(rData, errMsg))
+}
+
+func (share *Share) ShareImg() {
+	userId := common.ObjToString(share.GetSession("userId"))
+	docId := share.GetString("docId") //分享地址
+	data := getShareUrl(userId, docId)
+
+	w := share.ResponseWriter
+	w.Header().Set("Cache-Control", "no-cache, no-store, must-revalidate")
+	w.Header().Set("Pragma", "no-cache")
+	w.Header().Set("Expires", "0")
+	w.Header().Set("Content-Type", "image/png")
+	r, _ := qr.Encode(data, qr.M)
+	_, _ = w.Write(r.PNG())
+}
+
+func getShareUrl(userId, docId string) string {
+	return fmt.Sprintf(config.JyDocsAppConfig.ShareUrl+"?userId=%s", docId, userId)
+}

+ 4 - 1
jydocs-back/servers/stdDoc.go

@@ -5,6 +5,7 @@ import (
 	"app.yhyue.com/moapp/jybase/common"
 	"app.yhyue.com/moapp/jybase/go-xweb/xweb"
 	"fmt"
+	"jy-docs/config"
 	"jy-docs/public"
 	"jy-docs/rpc"
 	"log"
@@ -141,11 +142,13 @@ func (stdDoc *StdDoc) ActivityList() {
 			return nil, err
 		}
 		//存入redis缓存
-
 		list, err := rpc.GeActivityList(userId, code, pageNum, pageSize)
 		if err != nil {
 			return nil, err
 		}
+		for i := 0; i < len(list); i++ {
+			list[i].DocImg = fmt.Sprintf("https://%s.%s/%s", config.JyDocsAppConfig.OssBucket.Priv, config.JyDocsAppConfig.OssAdmin, list[i].DocImg)
+		}
 		return list, nil
 	}()
 	if errMsg != nil {

+ 13 - 3
jydocs-mobile/src/api/main.ts

@@ -21,9 +21,9 @@ export function getHomeActivity (data: any) {
 export function getCashOutInfo (data: any) {
   data = qs.stringify(data)
   return $request({
-    url: '/distribution/cashout/lastMsg',
-    method: 'get',
-    params: data
+    url: '/buy',
+    method: 'post',
+    data: data
   })
 }
 
@@ -74,3 +74,13 @@ export function getCoin (data: any) {
     data
   })
 }
+
+// 文库购买
+export function getDocPay (data: any) {
+  //   data = qs.stringify(data)
+  return $request({
+    url: '/user/buy',
+    method: 'post',
+    params: data
+  })
+}

+ 1 - 0
jydocs-mobile/src/components/RechargeHave.vue

@@ -48,6 +48,7 @@
             <div class="apply_footer">
                 <button class="j-button-cancel btn_active" @click="closePopup()">取消</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>

+ 40 - 3
jydocs-mobile/src/store/modules/main.ts

@@ -8,7 +8,8 @@ import {
   getDetails,
   getRemove,
   getAdd,
-  getCoin
+  getCoin,
+  getDocPay
 } from '@/api/main'
 
 interface InterfaceStore<S> extends StoreOptions<S> {
@@ -20,11 +21,40 @@ type modulesOption = InterfaceStore<any>;
 function recoveryPageData (key: string, defaultValues = {}) {
   return sessionStorage.getItem(key) ? JSON.parse(sessionStorage.getItem(key) || '') : defaultValues
 }
-
+function checkType (type: string | number) {
+  let typeStr = ''
+  switch (type) {
+    case 1: {
+      typeStr = 'word'
+      break
+    }
+    case 2: {
+      typeStr = 'pdf'
+      break
+    }
+    case 3: {
+      typeStr = 'excel'
+      break
+    }
+    case 4: {
+      typeStr = 'ppt'
+      break
+    }
+    case 'doc': {
+      typeStr = 'word'
+      break
+    }
+    case 'xls': {
+      typeStr = 'excel'
+      break
+    }
+  }
+  return typeStr
+}
 function formatData (v: APIStructure) {
   return {
     img: v?.docImg,
-    type: v?.docFileType,
+    type: checkType(v?.docFileType),
     id: v.docId,
     title: v?.docName || v?.docTitle,
     money: v.price,
@@ -101,6 +131,13 @@ const modulesOption: modulesOption = {
         }
       })
     },
+    // 文库购买
+    async getDocPay (state, data) {
+      try {
+        const res = await getDocPay(data)
+        return res.data
+      } catch (error) {}
+    },
     // 提现查询
     async getCashOutInfo (state, data) {
       try {

+ 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)
+    }
+  }
+}

+ 86 - 21
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-field v-model="tel" type="tel" label="手机号码" placeholder="请输入手机号码" />
-        </van-cell-group>
+        <!-- <van-cell-group>
+          <van-field v-model="tel" type="number" label="手机号码" placeholder="请输入手机号码" />
+        </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>
@@ -41,43 +51,87 @@
         <button class="apply_button" :disabled="!this.checked" @click="exchange()">确定兑换</button>
       </div>
     </div>
-    <RechargeHave></RechargeHave>
   </div>
 </template>
 
 <script lang="ts">
 import { Component, Vue } from 'vue-property-decorator'
 import { Checkbox, CheckboxGroup, Field, CellGroup } from 'vant'
-import { mapActions, mapMutations } from 'vuex'
-import RechargeHave from '../../components/RechargeHave.vue'
+import { mapActions } from 'vuex'
+// 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: {
-    RechargeHave,
     [Checkbox.name]: Checkbox,
     [CheckboxGroup.name]: CheckboxGroup,
     [Field.name]: Field,
     [CellGroup.name]: CellGroup
   },
   methods: {
-    ...mapMutations({
-      saveLogout: 'logout/setLogout'
-    }),
     ...mapActions({
-      sureLogout: 'logout/sureLogout'
+      getDocPay: 'main/getDocPay',
+      getDetails: 'main/getDetails'
     })
   }
 })
 export default class extends Vue {
-  protected sureLogout!: any
-  protected saveLogout!: any
+  protected getDocPay!: any
+  protected getDetails!: any
   checked = false
-  tel = 1
+  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 () {
-    this.$router.push('/purchasesuccess')
+    this.getDocPay({ docId: '4f6c00ba-8882-11eb-8699-0050568f51e7', phone: '18439509554' }).then((res: any) => {
+      console.log(res)
+      if (res.data === 'success') {
+        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')
@@ -96,6 +150,7 @@ export default class extends Vue {
         padding: 20px 16px;
         background: #ffffff;
         .docs_left{
+          position: relative;
           width: 100px;
           height: 124px;
           border-radius: 4px;
@@ -104,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 - 26
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">
@@ -27,7 +27,6 @@
             <div class="infor_value">6489798765465465</div>
           </div>
         </div>
-      <SharePopup></SharePopup>
       </div>
     </div>
     <div class="j-footer apply_footer">
@@ -39,38 +38,34 @@
 <script lang="ts">
 import { Component, Vue } from 'vue-property-decorator'
 // import { mapState } from 'vuex'
-import { fen2Yuan } from '../../utils/globalFunctions'
-import SharePopup from '../../components/SharePopup.vue'
 
 @Component({
   name: 'test',
   components: {
-    SharePopup
-  },
-  methods: {
-    fen2Yuan
-  },
-  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">

+ 15 - 10
jydocs-pc/src/App.vue

@@ -1,8 +1,7 @@
 <template>
-    <div class="home">
-        <router-link class="link-item" v-for="item in links" :key="item.to" :to="item.to">{{item.text}}</router-link>
-        <router-view></router-view>
-    </div>
+  <div class="docs-app">
+    <router-view></router-view>
+  </div>
 </template>
 
 <script>
@@ -10,6 +9,7 @@ export default {
   components: {},
   data () {
     return {
+      cashViews: [],
       links: [
         {
           to: '/',
@@ -24,12 +24,12 @@ export default {
           text: '列表页'
         },
         {
-          to: '/keep',
+          to: '/user/docs',
           text: '收藏页'
         },
         {
-          to: '/mine',
-          text: '我的'
+          to: '/user/collections',
+          text: '收藏页2'
         }
       ]
     }
@@ -37,7 +37,12 @@ export default {
 }
 </script>
 <style lang="scss">
-    .link-item {
-        margin: 0 10px;
-    }
+@import "~@/assets/style/reset-ele.scss";
+
+.page--docs--index.bg-white {
+  background-color: #fff;
+  .page-container {
+    background-color: #fff;
+  }
+}
 </style>

+ 60 - 64
jydocs-pc/src/api/mock/activityList.json

@@ -3,86 +3,82 @@
   "error_msg": "",
   "data": [
     {
-      "docId": "NyfuxSR0iUPobdFzNV2y3",
+      "docId": "001671fe-8890-11eb-8699-0050568f51e7",
       "activityId": 3,
-      "docTitle": "1111北京精密机电控制设备研究所软件单元、组装、确认测试系统北京精密机电控制设备研究所软件单元、组装、确认测试系统北京精密机电控制设备研究所软件单元、组装、确认测试系统",
-      "docSummary": "1111",
-      "docImg": "1111",
-      "price": 11,
-      "costPrice": 11,
-      "docFileSize": 666666666,
-      "docPageSize": 777,
-      "downTimes":5,
-      "sourceUserId":"剑鱼测试",
-      "docFileType": "ppt"
+      "docTitle": "蚌埠市城市管理条例",
+      "docSummary": "  安徽省人民代表大会常务委员会关于批准 《蚌埠市城市管理条例》的决议  (2017 年 7 月 28 日安徽省第十二届人民代表大会 常务委员会第三十九次会议通过)  安徽省第十二届人民代表大会常务委员会第三十九次会议审查了《蚌埠市城市管理条例》,决定予以批准,由蚌埠市人民代表大会常务委员会公布施行。   — 1 —  蚌埠市城市管理条例  (2017 年 6 月 27 日蚌埠市第十五届人民代表大会常务委员会第四十一次会议通过  2017 年 7 月 28 日安徽省第十二届人民代表大会常务委员会第三十九次会议批准)  第一章  总  则  第一条  为了规范城市管理,提升城市公共服务水平,建设文明和谐、生态宜居城市,根据有关法律、行政法规,结合本市实际,制定本条例。 第二条  本条例适用于本市区和怀远县、五河县、固镇县实施城市化管理区域内的城市管理活动。 实施城市化管理区域,是指城镇行政区域内实际已成片开发建设,市政公用设施和公共设施基本完备的区域,其范围由市、县人民政府在本条例施行之日向社会公布,以后每两年公布一次。 第三条  城市管理坚持以人为本、服务优先、疏管结合、权责一致、公众",
+      "docImg": "https://jydocs-previewimg.oss-cn-beijing.aliyuncs.com/ffec815e-888f-11eb-abba-000060546592.png",
+      "price": 692,
+      "costPrice": 692,
+      "downTimes": 647,
+      "docFileSize": 58368,
+      "docPageSize": 15,
+      "docFileType": 1
     },
     {
-      "docId": "NyfuxSR0iUPobdFzNV2y2",
+      "docId": "001d00e2-887b-11eb-8699-0050568f51e7",
       "activityId": 3,
-      "docTitle": "1111",
-      "docSummary": "1111",
-      "docImg": "1111",
-      "price": 11,
-      "costPrice": 11,
-      "docFileSize": 666,
-      "docPageSize": 777,
-      "downTimes":5,
-      "sourceUserId":""
+      "docTitle": "淮安市市容管理条例",
+      "docSummary": "   淮安市容管理条例  (2018 年 10 月 30 日淮安市第八届人民代表大会常务委员会第十七次会议通过  2018 年 1 月 23 日江苏省第十三届人民代表大会常务委员会第六次会议批准)  目  录 第一章  总则 第二章  建(构)筑物外立面管理 第三章  户外广告与店招标牌管理 第四章  城市道路与车辆管理 第五章  农贸市场与临时经营场点管理 第六章  垃圾与扬尘管理 第七章  责任区制度与监督管理 第八章  附则  第一章  总则  第一条  为了加强市容管理,创造整洁、优美、文明、宜居的城市环境,根据有关法律、法规,结合本市实际,制定本条例。 ─  1 ─    第二条  本市区、县城以及实施城市化管理的其他区域的市容管理活动适用本条例。实施城市化管理的其他区域由市、县(区)人民政府划定,并向社会公布。 本条例所称市容管理,包括对建(构)筑物外立面、户外广告与店招标牌、城市道路与车辆、农贸市场与临时经营场点、垃圾与扬尘、市容责任区等进行的管理。 第三条  市容管理坚持统一领导、分级负责、条块结合、属地管理、公众参与、社会监督相结合的原则。 第四条  市、县(区)人民",
+      "docImg": "https://jydocs-previewimg.oss-cn-beijing.aliyuncs.com/ffeccf6e-887a-11eb-a33e-000060544256.png",
+      "price": 852,
+      "costPrice": 852,
+      "downTimes": 948,
+      "docFileSize": 72192,
+      "docPageSize": 24,
+      "docFileType": 1
     },
     {
-      "docId": "NyfuxSR0iUPobdFzNV2y1",
+      "docId": "0025722a-886e-11eb-8699-0050568f51e7",
       "activityId": 3,
-      "docTitle": "1111",
-      "docSummary": "1111",
-      "docImg": "1111",
-      "price": 11,
-      "costPrice": 11,
-      "docFileSize": 666,
-      "docPageSize": 777,
-      "downTimes":5,
-      "sourceUserId":"",
-      "docFileType": "pdf"
+      "docTitle": "大连市华侨权益保护条例",
+      "docSummary": "  大连市华侨权益保护条例  (2019 年 4 月 26 日大连市第十六届人民代表大会常务委员会第十一次会议通过 2019 年 5 月 30 日辽宁省第十三届人民代表大会常务委员会第十一次会议批准)  第一条 为了保护华侨合法权益,发挥华侨在本市经济社会发展中的作用,根据宪法和有关法律、法规,结合本市实际,制定本条例。 第二条 本市行政区域内华侨合法权益的保护,适用本条例。 本条例所称华侨,是指定居在国外的中国公民。华侨身份的认定,由市及区(市)县侨务主管部门按照国家有关规定执行。 第三条 华侨权益保护应当遵循平等保护的原则。华侨享有宪法和法律规定的公民权利,并履行宪法和法律规定的公民义务。 第四条 本市应当加强对华侨权益保护工作的领导,建立健全华侨权益保障工作协调机制,制定华侨权益保护政策措施。 市及区(市)县侨务主管部门负责本行政区域内华侨权益保护的指导、协调、监督工作,加强对华侨权益保护有关法律法规和政策的宣传。  —1— 市及区(市)县人民政府有关部门按照各自职责,做好与华侨权益保护有关的工作。 第五条 市及区(市)县归国华侨联合会应当宣传贯彻法律法规和侨务政策,反映华侨的意",
+      "docImg": "https://jydocs-previewimg.oss-cn-beijing.aliyuncs.com/000217a6-886e-11eb-a042-000060542c87.png",
+      "price": 608,
+      "costPrice": 608,
+      "downTimes": 44,
+      "docFileSize": 29696,
+      "docPageSize": 8,
+      "docFileType": 1
     },
     {
-      "docId": "NyfuxSR0iUPobdFzNV2y33",
+      "docId": "0027f45e-885b-11eb-8699-0050568f51e7",
       "activityId": 3,
-      "docTitle": "1111",
-      "docSummary": "1111",
-      "docImg": "1111",
-      "price": 11,
-      "costPrice": 11,
-      "docFileSize": 666666666,
-      "docPageSize": 777,
-      "downTimes":5,
-      "sourceUserId":"剑鱼测试",
-      "docFileType": "ppt"
+      "docTitle": "三亚市人民代表大会常务委员会关于授权大社区综合服务中心行使有关行政管理权限的决定",
+      "docSummary": "三亚市人民代表大会常务委员会 关于授权大社区综合服务中心行使有关 行政管理权限的决定  (2020 年 4 月 29 日三亚市第七届人民代表大会常务委员会第三十九次会议通过 2020 年 6 月 16 日海南省第六届人民代表大会常务委员会第二十次会议批准)  为了探索建立适应城乡社区治理需要的体制机制,服务海南自由贸易港建设,根据有关法律法规,结合三亚市实际,三亚市人民代表大会常务委员会作出如下决定: 一、市、区人民政府及其有关部门可以依照本决定将本级有关城乡社区治理的管理权限授权或者委托依法设立的大社区综合服务中心行使,具体事项由市人民政府确定。 二、对授权或者委托行使的管理权限事项,市、区人民政府及其有关部门应当加强对大社区综合服务中心的业务培训指导,强化事中事后监管,做到放管结合。承接的大社区综合服务中心应当建立承接管理权限的有效机制,做到规范有序,确保严格依法行使职权。对实践证明不宜授权或者委托行使的,市、区人民政府及其有关部门应当及时收回相关管理权限。市人民政府根据本决定制定具体实施办法。 三、本决定自公布之日起施行。 - 1 -  ",
+      "docImg": "https://jydocs-previewimg.oss-cn-beijing.aliyuncs.com/fffda776-885a-11eb-82d9-000060540ca6.png",
+      "price": 514,
+      "costPrice": 514,
+      "downTimes": 35,
+      "docFileSize": 20923,
+      "docPageSize": 1,
+      "docFileType": 1
     },
     {
-      "docId": "NyfuxSR0iUPobdFzNV2y22",
+      "docId": "0036daac-87be-11eb-8af9-0050568f51e7",
       "activityId": 3,
-      "docTitle": "1111",
-      "docSummary": "1111",
-      "docImg": "1111",
-      "price": 11,
-      "costPrice": 11,
-      "docFileSize": 666,
-      "docPageSize": 777,
-      "downTimes":5,
-      "sourceUserId":""
+      "docTitle": "中华人民共和国电子签名法",
+      "docSummary": "   中华人民共和国电子签名法  (204 年 8 月 28 日第十届全国人民代表大会常务委员会第十一次会议通过 根据2015 年4 月 24 日第十二届全国人民代表大会常务委员会第十四次会议《关于修改\u003c中华人民共和国电力法\u003e等六部法律的决定》修正)  目  录   第一章 总则   第二章 数据电文   第三章 电子签名与认证   第四章 法律责任   第五章 附则  第一章 总则    第一条 为了规范电子签名行为,确立电子签名的法律效力,维护有关各方的合法权益,制定本法。   第二条 本法所称电子签名,是指数据电文中以电子形式所含、所附用于识别签名人身份并表明签名人认可其中内容的数据。  —1—    本法所称数据电文,是指以电子、光学、磁或者类似手段生成、发送、接收或者储存的信息。   第三条 民事活动中的合同或者其他文件、单证等文书,当事人可以约定使用或者不使用电子签名、数据电文。   当事人约定使用电子签名、数据电文的文书,不得仅因为其采用电子签名、数据电文的形式而否定其法律效力。   前款规定不适用下列文书:   (一)涉及婚姻、收养、继承等人身关系的;   (二)涉及土",
+      "docImg": "https://jydocs-previewimg.oss-cn-beijing.aliyuncs.com/000ce4ca-87be-11eb-b6d7-00006053053f.png",
+      "price": 632,
+      "costPrice": 632,
+      "downTimes": 404,
+      "docFileSize": 29869,
+      "docPageSize": 10,
+      "docFileType": 1
     },
     {
-      "docId": "NyfuxSR0iUPobdFzNV2y11",
+      "docId": "00395c6c-8874-11eb-8699-0050568f51e7",
       "activityId": 3,
-      "docTitle": "1111",
-      "docSummary": "1111",
-      "docImg": "1111",
-      "price": 11,
-      "costPrice": 11,
-      "docFileSize": 666,
-      "docPageSize": 777,
-      "downTimes":5,
-      "sourceUserId":"",
-      "docFileType": "pdf"
+      "docTitle": "中华人民共和国招标投标法实施条例",
+      "docSummary": "中华人民共和国招标投标法实施条例  (201 年12 月20 日中华人民共和国务院令第613 号公布 根据 2017 年 3 月 1 日《国务院关于修改和废止部分行政法规的决定》第一次修订 根据 2018 年 3 月 19 日《国务院关于修改和废止部分行政法规的决定》第二次修订 根据 2019 年 3 月 2 日《国务院关于修改部分行政法规的决定》第三次修订) 第一章 总则 第一条 为了规范招标投标活动,根据《中华人民共和国招标投标法》(以下简称招标投标法),制定本条例。 第二条 招标投标法第三条所称工程建设项目,是指工程以及与工程建设有关的货物、服务。 前款所称工程,是指建设工程,包括建筑物和构筑物的新建、改建、扩建及其相关的装修、拆除、修缮等;所称与工程建设有关的货物,是指构成工程不可分割的组成部分,且为实现工程基本功能所必需的设备、材料等;所称与工程建设有关的服务,是指为完成工程所需的勘察、设计、监理等服务。 第三条 依法必须进行招标的工程建设项目的具体范围和规模标准,由国务院发展改革部门会同国务院有关部门制订,报 - 1 - 国务院批准后公布施行。 第四条 国务院发展改革部门指",
+      "docImg": "https://jydocs-previewimg.oss-cn-beijing.aliyuncs.com/00027ad0-8874-11eb-87e9-000060543698.png",
+      "price": 876,
+      "costPrice": 876,
+      "downTimes": 919,
+      "docFileSize": 36855,
+      "docPageSize": 28,
+      "docFileType": 1
     }
   ]
 }

+ 101 - 81
jydocs-pc/src/api/mock/topList.json

@@ -1,106 +1,126 @@
 {
   "error_code": 0,
   "error_msg": "",
-  "data":  [
+  "data": [
     {
-      "docId": "RJ82241sM3DyHwrupW7w5",
-      "docName": "软件单元、组装、确认测试系统-中标候选人公示",
-      "price": 359,
-      "docFileSize": 387,
-      "docPageSize": 5,
-      "uploadDate": "2021-03-17 15:46:04",
-      "docSummary": "公告软件单元、组装、确认测试系统-中标候选人公示(招标编号:ZKX20210231A002)公示开始时间:2021年01月28日09时00分00秒公示结束时间:2021年02月01日23时59分59秒本软件单元、组装、确认测试系统(招标项目",
-      "docFileType": "其他"
+      "docId": "4e9cf3a8-8853-11eb-8699-0050568f51e7",
+      "docName": "白山市燃放烟花爆竹管理条例",
+      "price": 556,
+      "docFileSize": 32256,
+      "docPageSize": 4,
+      "downTimes": 999,
+      "viewTimes": 2286,
+      "uploadDate": "2021-03-19 09:34:55",
+      "docSummary": "   白山市燃放烟花爆竹管理条例  (2020 年 8 月 25 日白山市第八届人民代表大会常务委员会第三十一次 会议通过 2020 年 9 月 29 日吉林省第十三届人民代表大会常务委员会 第二十四次会议批准)  第一条 为了加强燃放烟花爆竹管理,减少大气、噪声和环境卫生等污染,保障公共安全和人身财产安全,根据国务院《烟花爆竹安全管理条例》等法律法规,结合实际,制定本条例。 第二条 浑江区、江源区城市中心区内燃放烟花爆竹及其相关管理活动,适用本条例。城市中心区具体范围由市人民政府确定并公布。 各县(市)可以参照本条例的规定执行。 依法应当由公安机关许可举办的焰火晚会、其他大型焰火燃放活动,不受本条例第七条、第八条限制。 第三条 燃放烟花爆竹管理,应当坚持禁限结合、安全环保的原则。 第四条 本条例由市人民政府组织实施。 公安机关负责烟花爆竹的公共安全管理,查处违法燃放烟花爆竹的行为。其他有关部门应当按照各自职责,做好燃放烟花爆  - 1 -   竹监督管理工作。 乡(镇)人民政府、街道办事处应当做好本行政区域内燃放烟花爆竹管理工作。 城市居民委员会、村民委员会、物业服务企业等应当协助做",
+      "docFileType": "doc"
     },
     {
-      "docId": "PImyRKyNohbocfUbhIef4",
-      "docName": "北京精密机电控制设备研究所软件单元、组装、确认测试系统北京精密机电控制设备研究所软件单元、组装、确认测试系统北京精密机电控制设备研究所软件单元、组装、确认测试系统",
-      "price": 193,
-      "docFileSize": 164,
-      "docPageSize": 3,
-      "uploadDate": "2021-03-17 15:46:05",
-      "docSummary": "1.招标条件本招标项目:软件单元、组装、确认测试系统已由中国航天科技集团有限公司部门批准建设,项目业主为北京精密机电控制设备研究所,建设资金及出资比例其他资金100.0%,招标人为北京精密机电控制设备研究所。项目已具备招标条件,中科信工程咨",
-      "docFileType": "pdf"
+      "docId": "4f6c00ba-8882-11eb-8699-0050568f51e7",
+      "docName": "福建省人民代表大会常务委员会关于深入学习宣传和贯彻实施《中华人民共和国宪法》的决定",
+      "price": 607,
+      "docFileSize": 28653,
+      "docPageSize": 7,
+      "downTimes": 999,
+      "viewTimes": 620,
+      "uploadDate": "2021-03-19 15:11:22",
+      "docSummary": " 福建省人民代表大会常务委员会 关于深入学习宣传和贯彻实施 《中华人民共和国宪法》的决定 (2018 年 7 月 26 日福建省第十三届人民代表大会 常务委员会第四次会议通过)  第十三届全国人民代表大会第一次会议通过《中华人民共和国宪法修正案》,这是国家政治生活中的一件大事。为了在全省进一步加强宪法的学习宣传,保证宪法的全面贯彻实施,特作如下决定: 一、树立宪法意识,充分认识深入学习宣传和贯彻实施宪法的重大意义 宪法是国家的根本法,是治国安邦的总章程,是全面依法治国的总依据。我国现行宪法是符合国情、符合时代发展要求的好宪法。这次宪法修改,确立了习近平新时代中国特色社会主义思想在国家政治和社会生活中的指导地位,这是党和国家从新时代坚持和发展中国特色社会主义全局和战略高度作出的重大决策,是推动全面依法治国、推进国家治理体系和治理能力现代化的重大举措,必将对党和国家事业产生极为广泛深刻持久的影响。深入学习宣传和贯彻实施宪法,对于深入学习贯彻习近平新时代中国特色社会主义思想和党的十九大精神,尤其是习近平总书记关— 1 —  于宪法的重要论述精神,对于进一步动员全省人民在以习近平同志为核心的党",
+      "docFileType": "doc"
     },
     {
-      "docId": "PImyRKyNohbocfUbhIef3",
-      "docName": "北京精密机电控制设备研究所软件单元、组装、确认测试系统",
-      "price": 193,
-      "docFileSize": 164,
-      "docPageSize": 3,
-      "uploadDate": "2021-03-17 15:46:05",
-      "docSummary": "1.招标条件本招标项目:软件单元、组装、确认测试系统已由中国航天科技集团有限公司部门批准建设,项目业主为北京精密机电控制设备研究所,建设资金及出资比例其他资金100.0%,招标人为北京精密机电控制设备研究所。项目已具备招标条件,中科信工程咨",
-      "docFileType": "word"
+      "docId": "0902e60a-87c6-11eb-a27b-0050568f51e7",
+      "docName": "中华人民共和国慈善法",
+      "price": 868,
+      "docFileSize": 37798,
+      "docPageSize": 26,
+      "downTimes": 998,
+      "viewTimes": 231,
+      "uploadDate": "2021-03-18 16:43:39",
+      "docSummary": "   中华人民共和国慈善法  (2016 年 3 月 16 日第十二届全国人民代表大会第四次会议通过)  目  录   第一章 总则   第二章 慈善组织   第三章 慈善募捐   第四章 慈善捐赠   第五章 慈善信托   第六章 慈善财产   第七章 慈善服务   第八章 信息公开   第九章 促进措施   第十章 监督管理   第十一章 法律责任   第十二章 附则  第一章 总则  —1—     第一条 为了发展慈善事业,弘扬慈善文化,规范慈善活动,保护慈善组织、捐赠人、志愿者、受益人等慈善活动参与者的合法权益,促进社会进步,共享发展成果,制定本法。   第二条 自然人、法人和其他组织开展慈善活动以及与慈善有关的活动,适用本法。其他法律有特别规定的,依照其规定。   第三条 本法所称慈善活动,是指自然人、法人和其他组织以捐赠财产或者提供服务等方式,自愿开展的下列公益活动:   (一)扶贫、济困;   (二)扶老、救孤、恤病、助残、优抚;   (三)救助自然灾害、事故灾难和公共卫生事件等突发事件造成的损害;   (四)促进教育、科学、文化、卫生、体育等事业的发展;   (五)防",
+      "docFileType": "doc"
     },
     {
-      "docId": "PImyRKyNohbocfUbhIef2",
-      "docName": "北京精密机电控制设备研究所软件单元、组装、确认测试系统",
-      "price": 193,
-      "docFileSize": 164,
-      "docPageSize": 3,
-      "uploadDate": "2021-03-17 15:46:05",
-      "docSummary": "1.招标条件本招标项目:软件单元、组装、确认测试系统已由中国航天科技集团有限公司部门批准建设,项目业主为北京精密机电控制设备研究所,建设资金及出资比例其他资金100.0%,招标人为北京精密机电控制设备研究所。项目已具备招标条件,中科信工程咨",
-      "docFileType": "ppt"
+      "docId": "a0b0fc32-8873-11eb-8699-0050568f51e7",
+      "docName": "宁夏回族自治区环境教育条例",
+      "price": 620,
+      "docFileSize": 25166,
+      "docPageSize": 10,
+      "downTimes": 998,
+      "viewTimes": 2110,
+      "uploadDate": "2021-03-19 13:26:16",
+      "docSummary": "  宁夏回族自治区环境教育条例    (201 年 12 月 1 日宁夏回族自治区第十届人民代表大会常务委员会第二十七次会议通过 根据 2019 年 3 月26 日宁夏回族自治区第十二届人民代表大会常务委员会第十一次会议《关于修改〈宁夏回族自治区商品交易市场管理条例〉等 18 件地方性法规的决定》修正)  目  录 第一章 总则 第二章 组织管理 第三章 学校环境教育 第四章 社会环境教育 第五章 保障与监督   第六章 附则  第一章 总则    第一条  为了加强环境保护宣传和普及环境教育,增强公民环境保护意识,推进生态文明建设,根据有关法律、法规,结合自治区实际,制定本条例。   第二条  自治区行政区域内的国家机关、企业、事业单位、 - 1 - 社会团体和其他组织,以及对有接受教育能力的公民,开展环境教育活动,适用本条例。   第三条  本条例所称环境教育,是指以环境意识、环境道德、环境法制、环境科普知识为主要内容,培养环境保护技能、树立环境价值观的教育活动。   第四条  普及和加强环境教育是全社会的共同责任。   环境教育的对象是有接受教育能力的公民。重点是国家机关工作人员",
+      "docFileType": "doc"
     },
     {
-      "docId": "PImyRKyNohbocfUbhIef1",
-      "docName": "北京精密机电控制设备研究所软件单元、组装、确认测试系统",
-      "price": 193,
-      "docFileSize": 164,
-      "docPageSize": 3,
-      "uploadDate": "2021-03-17 15:46:05",
-      "docSummary": "1.招标条件本招标项目:软件单元、组装、确认测试系统已由中国航天科技集团有限公司部门批准建设,项目业主为北京精密机电控制设备研究所,建设资金及出资比例其他资金100.0%,招标人为北京精密机电控制设备研究所。项目已具备招标条件,中科信工程咨",
-      "docFileType": "excel"
+      "docId": "81fa20c6-884f-11eb-a809-0050568f51e7",
+      "docName": "无锡市不动产登记条例",
+      "price": 768,
+      "docFileSize": 115840,
+      "docPageSize": 21,
+      "downTimes": 998,
+      "viewTimes": 2412,
+      "uploadDate": "2021-03-19 09:07:43",
+      "docSummary": "   无锡市不动产登记条例  (2018 年 4 月 26 日无锡市第十六届人民代表大会常务委员会第九次会议通过  2018 年 5 月 31 日江苏省第十三届人民代表大会常务委员会第三次会议批准  根据2020 年 8 月 27 日无锡市第十六届人民代表大会常务委员会第三十二次会议通过,2020 年 9 月 25 日江苏省第十三届人民代表大会常务委员会第十八次会议批准的《无锡市人民代表大会常务委员会关于修改〈无锡市不动产登记条例〉的决定》修正)  目  录 第一章  总则 第二章  一般规定 第三章  不动产权利登记     第一节  国有建设用地使用权和房屋等建筑物、构筑             物所有权登记   第二节  集体土地所有权和集体建设用地使用权及房             屋等建筑物、构筑物所有权登记   第三节  宅基地使用权和房屋等建筑物、构筑物所有             权登记 ─  1 ─       第四节  土地承包经营权登记   第五节  地役权登记   第六节  抵押权登记 第四章  其他登记   第一节  预告登记   第二节  更正登记   第三",
+      "docFileType": "doc"
     },
     {
-      "docId": "RJ82241sM3DyHwrupW7w55",
-      "docName": "软件单元、组装、确认测试系统-中标候选人公示",
-      "price": 359,
-      "docFileSize": 387,
-      "docPageSize": 5,
-      "uploadDate": "2021-03-17 15:46:04",
-      "docSummary": "公告软件单元、组装、确认测试系统-中标候选人公示(招标编号:ZKX20210231A002)公示开始时间:2021年01月28日09时00分00秒公示结束时间:2021年02月01日23时59分59秒本软件单元、组装、确认测试系统(招标项目",
-      "docFileType": "其他"
+      "docId": "593bbfa-8866-11eb-8699-0050568f51e7",
+      "docName": "福州市烟花爆竹销售和燃放管理办法",
+      "price": 594,
+      "docFileSize": 39995,
+      "docPageSize": 7,
+      "downTimes": 998,
+      "viewTimes": 289,
+      "uploadDate": "2021-03-19 11:54:15",
+      "docSummary": "          福州市烟花爆竹销售和燃放管理办法 (2019 年 6 月 27 日福州市第十五届人民 代表大会 常务委员会第二十次会议通过   2019 年 9 月 26 日福建省第十三届人民代表大会 常务委员会第十二次会议批准)  第一条 为了加强烟花爆竹销售和燃放管理,减少环境污染,保障公共安全和人身、财产安全,减少环境污染,根据国务院《烟花爆竹安全管理条例》和有关法律、法规,结合本市实际,制定本办法。 第二条 本市行政区域内烟花爆竹的销售和燃放管理,适用本办法。 第三条 本市烟花爆竹的销售和燃放实行严格管理、综合治理的原则,遵守安全环保、文明节俭的要求。 鼓励移风易俗,倡导经营、使用电子鞭炮、礼花筒等安全、环保的替代品。 第四条 市、县(市、区)人民政府应当加强对烟花爆竹销售和燃放管理工作的领导,建立烟花爆竹销售和燃放综合管理协调机制,统筹协调烟花爆竹销售和燃放管理工作中的重大事项。  — 1 — 应急管理部门负责烟花爆竹销售的管理;公安机关负责烟花爆竹燃放的公共安全管理。 生态环境、市场监督管理、城市管理、民政、住房保障和房产管理、供销等部门按照各自职责,做好烟花爆竹销售和",
+      "docFileType": "doc"
     },
     {
-      "docId": "PImyRKyNohbocfUbhIef44",
-      "docName": "北京精密机电控制设备研究所软件单元、组装、确认测试系统",
-      "price": 193,
-      "docFileSize": 164,
-      "docPageSize": 3,
-      "uploadDate": "2021-03-17 15:46:05",
-      "docSummary": "1.招标条件本招标项目:软件单元、组装、确认测试系统已由中国航天科技集团有限公司部门批准建设,项目业主为北京精密机电控制设备研究所,建设资金及出资比例其他资金100.0%,招标人为北京精密机电控制设备研究所。项目已具备招标条件,中科信工程咨",
-      "docFileType": "pdf"
+      "docId": "04dfec-885c-11eb-8699-0050568f51e7",
+      "docName": "广西壮族自治区优化营商环境条例",
+      "price": 965,
+      "docFileSize": 40828,
+      "docPageSize": 31,
+      "downTimes": 998,
+      "viewTimes": 2671,
+      "uploadDate": "2021-03-19 10:42:24",
+      "docSummary": " 广西壮族自治区优化营商环境条例  (2020 年 5 月 19 日广西壮族自治区第十三届 人民代表大会常务委员会第十五次会议通过)  目    录 第一章  总则 第二章  市场环境 第三章  政务服务 第四章  监管执法 第五章  法治保障 第六章  附则  第一章 总则    第一条 为了持续优化营商环境,激发市场主体活力,推动经济社会高质量发展,根据国务院《优化营商环境条例》,结合本自治区实际,制定本条例。   第二条  本条例所称营商环境是指企业以及其他从事生产经营活动的组织和个人(以下统称市场主体)在市场准入、生产经营、市场退出等市场经济活动中涉及的体制机制性因素和条件。 1    第三条  优化营商环境应当遵循市场化、法治化、国际化原则,坚持各类市场主体权利平等、机会平等、规则平等,以市场主体需求为导向,以政府职能转变为核心,全面深化“放管服”改革,践行“有事必应、无事不扰”的服务理念,持续对标国际国内先进水平,打造贸易投资便利、行政效率高效、政务服务规范、法治体系完善的国内一流营商环境,为各类市场主体投资兴业营造稳定、公平、透明、可预期的发展环境。   第四条  各级人",
+      "docFileType": "doc"
     },
     {
-      "docId": "PImyRKyNohbocfUbhIef33",
-      "docName": "北京精密机电控制设备研究所软件单元、组装、确认测试系统",
-      "price": 193,
-      "docFileSize": 164,
-      "docPageSize": 3,
-      "uploadDate": "2021-03-17 15:46:05",
-      "docSummary": "1.招标条件本招标项目:软件单元、组装、确认测试系统已由中国航天科技集团有限公司部门批准建设,项目业主为北京精密机电控制设备研究所,建设资金及出资比例其他资金100.0%,招标人为北京精密机电控制设备研究所。项目已具备招标条件,中科信工程咨",
-      "docFileType": "word"
+      "docId": "6c74914e-8879-11eb-8699-0050568f51e7",
+      "docName": "大同市御河流域生态保护条例",
+      "price": 601,
+      "docFileSize": 19337,
+      "docPageSize": 8,
+      "downTimes": 997,
+      "viewTimes": 2500,
+      "uploadDate": "2021-03-19 14:07:46",
+      "docSummary": "  大同市御河流域生态保护条例  (2018 年 8 月 29 日大同市第十五届人民代表大会常务 委员会第十六次会议通过   2018 年 1 月 30 日山西省 第十三届人民代表大会常务委员会第七次会议批准)  目  录 第一章  总则 第二章  生态修复 第三章  生态保护 第四章  法律责任 第五章  附则  第一章  总  则  第一条  为了加强御河流域生态保护,规范流域开发、利用、治理等活动,保障御河流域生态良好,促进全市经济和社会可持续发展,根据《中华人民共和国水法》《中华人民共和国环境保护法》等法律法规,结合本市实际,制定本条例。 第二条  本条例所称御河流域,是御河干流和支流汇水面积内的水域和陆域,以及跨流域向御河补水的水源和输水—1— 工程沿线管理范围。 第三条  在御河流域本市管辖范围从事规划建设、资源开发、生产生活、生态保护和监督管理等有关活动,应当遵守本条例。 第四条  御河流域生态保护应当坚持统一规划、保护优先、因地制宜、科学修复的原则。 第五条  市、县(区)人民政府应当加强御河流域生态保护的领导,实行河长制,建立流域生态保护工作联席会议制度,协调解决流域",
+      "docFileType": "doc"
     },
     {
-      "docId": "PImyRKyNohbocfUbhIef22",
-      "docName": "北京精密机电控制设备研究所软件单元、组装、确认测试系统北京精密机电控制设备研究所软件单元、组装、确认测试系统北京精密机电控制设备研究所软件单元、组装、确认测试系统",
-      "price": 193,
-      "docFileSize": 164,
-      "docPageSize": 3,
-      "uploadDate": "2021-03-17 15:46:05",
-      "docSummary": "1.招标条件本招标项目:软件单元、组装、确认测试系统已由中国航天科技集团有限公司部门批准建设,项目业主为北京精密机电控制设备研究所,建设资金及出资比例其他资金100.0%,招标人为北京精密机电控制设备研究所。项目已具备招标条件,中科信工程咨",
-      "docFileType": "ppt"
+      "docId": "20559ad4-885f-11eb-8699-0050568f51e7",
+      "docName": "山东省养老服务条例",
+      "price": 794,
+      "docFileSize": 33579,
+      "docPageSize": 21,
+      "downTimes": 997,
+      "viewTimes": 2834,
+      "uploadDate": "2021-03-19 10:59:31",
+      "docSummary": "  山东省养老服务条例  (2020 年 3 月 26 日山东省第十三届人民代表大会常务   委员会第十八次会议通过)  目  录     第一章  总则     第二章  养老服务设施规划和建设     第三章  居家社区养老服务     第四章  机构养老服务     第五章  医养康养结合服务     第六章  扶持保障措施     第七章  监督管理     第八章  法律责任     第九章  附则             第一章 总则  第一条 为了积极应对人口老龄化,健全养老服务体系,满足老年人多样化、多层次养老服务需求,促进养老服务健康发展,根据《中华人民共和国老年人权益保障法》等法律、行政法规, - 1 - 结合本省实际,制定本条例。 第二条 本条例适用于本省行政区域内养老服务及其监督管理活动。 本条例所称养老服务,是指在家庭成员承担赡养、扶养义务的基础上,由政府和社会为老年人提供的生活照料、医疗保健、康复护理、文体娱乐、精神慰藉、紧急救援、临终关怀等服务。 第三条 养老服务是社会公共服务体系的重要组成部分,养老服务发展应当与经济社会发展水平相适应,坚持政府主导、社会",
+      "docFileType": "doc"
     },
     {
-      "docId": "PImyRKyNohbocfUbhIef11",
-      "docName": "北京精密机电控制设备研究所软件单元、组装、确认测试系统",
-      "price": 193,
-      "docFileSize": 164,
-      "docPageSize": 3,
-      "uploadDate": "2021-03-17 15:46:05",
-      "docSummary": "1.招标条件本招标项目:软件单元、组装、确认测试系统已由中国航天科技集团有限公司部门批准建设,项目业主为北京精密机电控制设备研究所,建设资金及出资比例其他资金100.0%,招标人为北京精密机电控制设备研究所。项目已具备招标条件,中科信工程咨",
-      "docFileType": "excel"
+      "docId": "3d888586-87be-11eb-8af9-0050568f51e7",
+      "docName": "中华人民共和国农村土地承包法",
+      "price": 702,
+      "docFileSize": 31192,
+      "docPageSize": 15,
+      "downTimes": 997,
+      "viewTimes": 310,
+      "uploadDate": "2021-03-18 15:47:51",
+      "docSummary": "   中华人民共和国农村土地承包法  (202 年 8 月 29 日第九届全国人民代表大会常务委员会第二十九次会议通过 根据209 年 8 月27 日第十一届全国人民代表大会常务委员会第十次会议《关于修改部分法律的决定》修正)  目  录   第一章 总则   第二章 家庭承包     第一节 发包方和承包方的权利和义务     第二节 承包的原则和程序     第三节 承包期限和承包合同     第四节 土地承包经营权的保护     第五节 土地承包经营权的流转   第三章 其他方式的承包   第四章 争议的解决和法律责任   第五章 附则  第一章 总则  —1—     第一条 为稳定和完善以家庭承包经营为基础、统分结合的双层经营体制,赋予农民长期而有保障的土地使用权,维护农村土地承包当事人的合法权益,促进农业、农村经济发展和农村社会稳定,根据宪法,制定本法。   第二条 本法所称农村土地,是指农民集体所有和国家所有依法由农民集体使用的耕地、林地、草地,以及其他依法用于农业的土地。   第三条 国家实行农村土地承包经营制度。 农村土地承包采取农村集体经济组织内部的家庭承包方式,不",
+      "docFileType": "doc"
     }
   ]
 }

+ 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
+  })
+}

+ 3 - 1
jydocs-pc/src/api/modules/search.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') {
@@ -7,7 +8,8 @@ if (process.env.NODE_ENV === 'development' && process.env.VUE_APP_MOCK === 'true
   request = mockRequest
 }
 
-export function ajaxGetSearch (data) {
+export function getSearch (data) {
+  data = qs.stringify(data)
   return request({
     url: '/search',
     method: 'post',

+ 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
   })
 }

+ 15 - 0
jydocs-pc/src/assets/style/reset-ele.scss

@@ -0,0 +1,15 @@
+@import './_mixin';
+@import './_variables';
+
+.docs-app .el-pagination.is-background .el-pager {
+  li {
+    background-color: #fff;
+    border: 1px solid rgba($color: #000, $alpha: 0.05);
+  }
+
+  li:not(.disabled).active,
+  li:not(.disabled):hover {
+    color: #fff;
+    background-color: $color-text--highlight;
+  }
+}

+ 1 - 0
jydocs-pc/src/components/NoData.vue

@@ -20,6 +20,7 @@ export default {
 <style lang="scss" scoped>
 .no-data {
   margin: 0 auto;
+  margin-top: 150px;
   text-align: center;
   .el-image {
     width: 220px;

+ 5 - 5
jydocs-pc/src/components/Search.vue

@@ -29,22 +29,22 @@ export default {
   data () {
     return {
       input: '',
-      type: 'all1',
+      type: 'all',
       tabs: [
         {
-          type: 'all1',
+          type: 'all',
           label: '全部'
         },
         {
-          type: 'all2',
+          type: '招标',
           label: '招标'
         },
         {
-          type: 'all3',
+          type: '法律法规',
           label: '法律法规'
         },
         {
-          type: 'all4',
+          type: '行业报告',
           label: '行业报告'
         }
       ]

+ 5 - 4
jydocs-pc/src/components/doc-item-card/Card.vue

@@ -35,7 +35,7 @@
             >{{ item }}</span>
           </div>
           <div class="card-info-item price">
-            <Price :price="price" />
+            <slot name="price"><Price :price="price" /></slot>
           </div>
         </div>
       </div>
@@ -58,7 +58,7 @@
           >{{ item }}</span>
         </div>
         <div class="c-f-right flex-r-c">
-          <Price :price="price" />
+          <slot name="price"><Price :price="price" /></slot>
         </div>
       </div>
     </div>
@@ -68,7 +68,7 @@
 <script>
 import { Image } from 'element-ui'
 import Price from '@/components/doc-item-card/Price'
-import { replaceKeyword } from '@/utils/'
+import { replaceKeyword, docTypeConvert } from '@/utils/'
 
 export default {
   name: 'docs-card',
@@ -121,7 +121,8 @@ export default {
   },
   computed: {
     docTypeIcon () {
-      return `el-icon-jy-${this.docType}`
+      const t = docTypeConvert(this.docType)
+      return `el-icon-jy-${t}`
     },
     hightLightTitle () {
       return replaceKeyword(this.title, this.highlightKey, [

+ 16 - 1
jydocs-pc/src/router.js

@@ -48,10 +48,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 }
+  }
 })

+ 15 - 0
jydocs-pc/src/utils/globalFunctions.js

@@ -236,6 +236,21 @@ export function formatSize (size, pointLength, units) {
   }
   return (unit === 'B' ? size : size.toFixed(pointLength === undefined ? 2 : pointLength)) + (unit || '')
 }
+
+// 文件类型转换
+export function docTypeConvert (docType = 'pdf') {
+  const typeMap = {
+    doc: 'word',
+    docx: 'word',
+    xls: 'excel',
+    xlsx: 'excel',
+    ppt: 'ppt',
+    pdf: 'pdf'
+  }
+  const type = typeMap[docType]
+  return type || docType // map中不存在的,则返回原始类型
+}
+
 /**
  * 通用关键字高亮替换
  * @param {String} value 要高亮的字符串

+ 8 - 0
jydocs-pc/src/utils/mixins.js

@@ -0,0 +1,8 @@
+export const mixinBackground = {
+  beforeCreate () {
+    $('body').addClass('bg-white')
+  },
+  beforeDestroy () {
+    $('body').removeClass('bg-white')
+  }
+}

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

@@ -129,10 +129,41 @@ function recoveryPageData (key, defaultValues = {}) {
   return sessionStorage.getItem(key) ? JSON.parse(sessionStorage.getItem(key) || '') : defaultValues
 }
 
+function checkType (type) {
+  let typeStr = ''
+  switch (type) {
+    case 1: {
+      typeStr = 'word'
+      break
+    }
+    case 2: {
+      typeStr = 'pdf'
+      break
+    }
+    case 3: {
+      typeStr = 'excel'
+      break
+    }
+    case 4: {
+      typeStr = 'ppt'
+      break
+    }
+    case 'doc': {
+      typeStr = 'word'
+      break
+    }
+    case 'xls': {
+      typeStr = 'excel'
+      break
+    }
+  }
+  return typeStr
+}
+
 function formatData (v) {
   return {
     img: v?.docImg,
-    type: v?.docFileType,
+    type: checkType(v?.docFileType),
     id: v.docId,
     title: v?.docName || v?.docTitle,
     money: v.price,
@@ -171,13 +202,13 @@ export default {
       return this.pageData?.new && this.pageData?.new.slice(0, 5)
     },
     newList2 () {
-      return this.pageData?.new && this.pageData?.new.slice(0, 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(0, 5)
+      return this.pageData?.hot && this.pageData?.hot.slice(5)
     }
   },
   methods: {

+ 122 - 78
jydocs-pc/src/views/Search.vue

@@ -1,159 +1,201 @@
 <template>
   <div class="search-container">
-    <search-input @submit="goSubmit" @recovery="getTest"></search-input>
+    <search-input ref="search" @submit="doSearch" @recovery="doSearch"></search-input>
     <div class="search-result-container">
       <div class="sort-list">
         <span
           class="sort-item"
-          v-for="(item, index) in sortList"
+          v-for="(item, index) in sortTypeList"
           :key="index"
           @click="sortAndSearch(item, index)"
-          :class="index === listState.sortActive ? 'active': ''"
+          :class="{ active: item.active }"
         >
-          <span class="sort-text">{{ item.name }}</span>
-          <span class="sort-icon" :class="item.sortBy ? 'el-icon-top' : 'el-icon-bottom'"></span>
+          <span class="sort-text">{{ item.label }}</span>
+          <span class="sort-icon" :class="item.sort ? 'el-icon-top' : 'el-icon-bottom'"></span>
         </span>
       </div>
       <div class="search-result-list" v-loading="listState.loading">
         <doc-card
-          :title="title"
-          desc="关于设计图。。。"
-          :highlightKey="['设计图','更新']"
-          :subInfo="['设计图','更新']"
-          @onClick="clickFn"
+          v-for="(item, index) in listState.list"
+          :key="index"
+          :title="item.docName"
+          :desc="item.docSummary"
+          :docType="item.docFileType"
+          :price="item.price"
+          :highlightKey="highlightKey"
+          :subInfo="calcSubInfo(item)"
+          @onClick="toDocDetail(item)"
         />
-        <no-data v-if="listState.list.length === 0 && listState.loaded">暂无我的文库</no-data>
+        <no-data v-if="listState.list.length === 0 && listState.loaded"></no-data>
       </div>
       <div class="search-pagination">
         <el-pagination
           background
           layout="prev, pager, next, ->, total"
           :hide-on-single-page="true"
-          :current-page="listState.currentPage"
+          :current-page="listState.pageNum"
           :page-size="listState.pageSize"
-          :page-count="listState.pageCount"
           :total="listState.total"
           @current-change="onPageChange"
         >
         </el-pagination>
       </div>
     </div>
-    {{ajaxData}}
-    <button @click="getTest" type="primary">模拟Ajax</button>
-    <button  @click="getLoginStatus" type="info">获取登录状态</button>
   </div>
 </template>
 
 <script>
-import { Icon, Pagination, Image } from 'element-ui'
+import { Icon, Pagination } from 'element-ui'
 import SearchInput from '@/components/Search'
 import DocCard from '@/components/doc-item-card/Card'
 import NoData from '@/components/NoData'
-import { ajaxGetSearch } from '../api/modules/search'
+import { getSearch } from '../api/modules/search'
+import { formatSize } from '@/utils/'
+import { mixinBackground } from '@/utils/mixins'
 
 export default {
   name: 'seach',
+  mixins: [mixinBackground],
   components: {
     [Icon.name]: Icon,
     [Pagination.name]: Pagination,
-    [Image.name]: Image,
     SearchInput,
     DocCard,
     NoData
   },
   data () {
     return {
-      sortList: [
+      sortTypeList: [
         {
-          name: '上传时间',
-          sortBy: 1
+          type: 'tSort',
+          label: '上传时间',
+          sort: 0,
+          active: true
         },
         {
-          name: '下载次数',
-          sortBy: 0
+          type: 'dSort',
+          label: '下载次数',
+          sort: 0,
+          active: false
         },
         {
-          name: '浏览人数',
-          sortBy: 0
+          type: 'vSort',
+          label: '浏览人数',
+          sort: 0,
+          active: false
         }
       ],
+      searchQuery: {
+        type: '',
+        text: ''
+      },
       listState: {
         loaded: false, // 是否已经搜索过
-        sortActive: 0,
         loading: false,
-        currentPage: 2, // 当前页
+        pageNum: 1, // 当前页
         pageSize: 10, // 每页多少条数据
-        pageCount: 10, // 一共多少页
-        total: 100, // 一共多少条数据
+        total: 0, // 一共多少条数据
         list: [] // 查询请求返回的数据
-      },
-      searchQuery: {},
-      ajaxData: {},
-      title: '设计图变动更新设计图变动更新设计图变动更新设计图变动更新'
+      }
     }
   },
-  methods: {
-    goSubmit (search) {
-      this.$router.replace({
-        name: 'search',
-        query: search
-      })
-      this.searchQuery = search
-      this.getTest(search)
-    },
-    getTest (search) {
-      ajaxGetSearch({
-        keyWord: search.text,
-        tag: search.type,
-        // tSort时间倒叙 dSort下载倒叙 vSort浏览量倒叙
-        sort: 'tSort',
-        num: 1,
-        size: 10
-      }).then(res => {
-        console.log(res.data)
-        this.ajaxData = res.data
+  computed: {
+    activeSortList () {
+      return this.sortTypeList.find(item => {
+        return item.active
       })
     },
+    highlightKey () {
+      return [this.searchQuery.text]
+    }
+  },
+  methods: {
     getLoginStatus: function () {
-      alert(loginflag)
+      console.log(loginflag)
+    },
+    // 恢复数据至第一次请求的状态(页码等)
+    resetListState () {
+      const state = {
+        loaded: false,
+        loading: false,
+        pageNum: 1,
+        list: []
+      }
+      Object.assign(this.listState, state)
+    },
+    doSearch (search) {
+      if (search) {
+        Object.assign(this.searchQuery, search)
+      } else {
+        this.searchQuery.type = this.$refs.search.type
+        this.searchQuery.text = this.$refs.search.input
+      }
+      this.getList()
+    },
+    async getList () {
+      if (!this.searchQuery.text) return
+      const query = {
+        keyWord: this.searchQuery.text,
+        tag: this.searchQuery.type === 'all' ? '' : this.searchQuery.type,
+        sort: this.activeSortList.type,
+        num: this.listState.pageNum,
+        size: this.listState.pageSize
+      }
+      console.log(query)
+
+      this.listState.loading = true
+      this.listState.loaded = false
+      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
+        this.listState.list = res.data.list || []
+      }
     },
     sortAndSearch (item, index) {
-      console.log(...arguments)
+      if (item.active) {
+        // 改变sort
+        // item.sort = item.sort ? 0 : 1
+      } else {
+        this.sortTypeList.forEach(s => {
+          s.active = false
+        })
+        item.active = true
+      }
+      this.resetListState()
+      this.doSearch()
     },
-    clickFn () {
-      console.log('clickItem')
+    toDocDetail (item) {
+      const { docId: id } = item
+      this.$router.push({
+        name: 'content',
+        params: { id }
+      })
     },
     onPageChange (p) {
-      this.listState.currentPage = p
-      this.listState.loading = true
-      setTimeout(() => {
-        this.listState.loading = false
-      }, 2000)
-      console.log(JSON.stringify(this.listState, null, 4))
+      this.listState.pageNum = p
+      this.doSearch()
+    },
+    calcSubInfo (item) {
+      const { docFileSize: size, downTimes, uploadDate, docPageSize } = item
+      return [uploadDate, `${downTimes}次下载`, `共${docPageSize}页`, formatSize(size)]
     }
   }
 }
 </script>
-<style lang="scss">
-.el-pagination.is-background .el-pager {
-  li {
-    background-color: #fff;
-    border: 1px solid rgba($color: #000, $alpha: 0.05);
-  }
-
-  li:not(.disabled):hover {
-    color: #fff;
-    background-color: $color-text--highlight;
-  }
-}
-</style>
 <style lang="scss" scoped>
+.search-container {
+  padding-top: 48px;
+}
 .search-result-container {
   margin: 0 auto;
   .sort-list {
     display: flex;
     align-items: center;
-    margin: 0 18px;
+    margin: 18px;
     height: 48px;
     border-radius: 4px;
     background: #F5F6F7;
@@ -189,6 +231,8 @@ export default {
     min-height: 500px;
   }
   .search-pagination {
+    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;
+        }
       }
     }
   }

+ 4 - 3
jydocs-pc/vue.config.js

@@ -8,11 +8,12 @@ module.exports = {
     port: '8080',
     disableHostCheck: true,
     proxy: {
-      '^/api-docs': {
-        target: 'http://xxx.com/api-docs',
+      '^/jydocs': {
+        target: 'http://192.168.20.180:821',
         changeOrigin: true,
+        logLevel: 'debug',
         pathRewrite: {
-          '^/api-docs': ''
+          '^/jydocs': '/jydocs'
         }
       }
     }