Library.vue 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271
  1. <template>
  2. <div class="user-library">
  3. <van-tabs
  4. :title-active-color="tabConf.titleActiveColor"
  5. :title-inactive-color="tabConf.titleInactiveColor"
  6. :line-width="tabConf.lineWidth"
  7. :color="tabConf.color"
  8. :before-change="beforeTabChange"
  9. v-model="tabActive"
  10. class="j-container"
  11. >
  12. <van-tab title="我的文库" name="0">
  13. <van-list
  14. v-model="myLibListState.loading"
  15. :finished="myLibListState.finished"
  16. :offset="myLibListState.offset"
  17. @load="onLoad"
  18. class="more-list"
  19. ref="vanList"
  20. >
  21. <div>
  22. <Card
  23. v-for="(item, index) in myLibListState.list"
  24. :key="index"
  25. :title="item.DocName"
  26. :docType="item.DocFileType"
  27. :subInfo="calcSubInfoForLib(item)"
  28. @onClick="toDocDetail(item)"
  29. />
  30. </div>
  31. </van-list>
  32. <Empty v-if="myLibListState.list.length === 0 && myLibListState.loaded">暂无数据</Empty>
  33. </van-tab>
  34. <van-tab title="文库收藏" name="1">
  35. <van-list
  36. v-model="myCollectionListState.loading"
  37. :finished="myCollectionListState.finished"
  38. :offset="myCollectionListState.offset"
  39. @load="onLoad"
  40. class="more-list"
  41. ref="vanList"
  42. >
  43. <div>
  44. <Card
  45. v-for="(item, index) in myCollectionListState.list"
  46. :key="index"
  47. :title="item.DocName"
  48. :desc="item.DocSummary"
  49. :docType="item.DocFileType"
  50. :price="item.Cost"
  51. :subInfo="calcSubInfoForColl(item)"
  52. @onClick="toDocDetail(item)"
  53. />
  54. </div>
  55. </van-list>
  56. <Empty v-if="myCollectionListState.list.length === 0 && myCollectionListState.loaded">暂无数据</Empty>
  57. </van-tab>
  58. </van-tabs>
  59. </div>
  60. </template>
  61. <script lang="ts">
  62. import { Component, Vue, Watch } from 'vue-property-decorator'
  63. import { Tabs, Tab, List } from 'vant'
  64. import { mapState, mapMutations, mapActions } from 'vuex'
  65. import Card from '@/components/docs-card/Card.vue'
  66. import Empty from '@/components/common/Empty.vue'
  67. import { dateFormatter, formatSize } from '@/utils/globalFunctions'
  68. @Component({
  69. name: 'user-library',
  70. components: {
  71. [Tabs.name]: Tabs,
  72. [Tab.name]: Tab,
  73. [List.name]: List,
  74. Card,
  75. Empty
  76. },
  77. computed: {
  78. ...mapState('main', {
  79. userLibInfo: (state: any) => state.userLib
  80. })
  81. },
  82. methods: {
  83. ...mapMutations({
  84. saveLibState: 'main/saveMyLibState',
  85. clearLibState: 'main/clearMyLibState'
  86. }),
  87. ...mapActions({
  88. getMyLibList: 'main/getMyLibList'
  89. })
  90. }
  91. })
  92. export default class UserLibrary extends Vue {
  93. protected userLibInfo: any
  94. protected saveLibState: any
  95. protected clearLibState: any
  96. protected getMyLibList: any
  97. tabActive = '0'
  98. tabConf = {
  99. titleActiveColor: '#2ABED1',
  100. titleInactiveColor: '#5F5E64',
  101. lineWidth: '24',
  102. color: '#2ABED1'
  103. }
  104. myLibListState = {
  105. loaded: false,
  106. loading: false,
  107. finished: false,
  108. pageNum: 1,
  109. pageSize: 10,
  110. offset: 80,
  111. scrollTop: 0,
  112. list: []
  113. }
  114. myCollectionListState = {
  115. loaded: false,
  116. loading: false,
  117. finished: false,
  118. pageNum: 1,
  119. pageSize: 10,
  120. offset: 80,
  121. scrollTop: 0,
  122. list: []
  123. }
  124. get keyForList () {
  125. const map: any = {
  126. 0: 'myLibListState',
  127. 1: 'myCollectionListState'
  128. }
  129. return map[this.tabActive] || map[0]
  130. }
  131. @Watch('tabActive')
  132. onTabChange () {
  133. const i: any = this.$data[this.keyForList]
  134. this.setScrollTop(i.scrollTop)
  135. }
  136. created () {
  137. this.tabActive = this.$route.query.tab as string
  138. this.reStoreState()
  139. }
  140. beforeTabChange () {
  141. this.saveScrollTop()
  142. return true
  143. }
  144. toDocDetail (item: any) {
  145. const { DocId: id } = item
  146. this.saveState()
  147. this.$router.push({
  148. name: 'details',
  149. params: { id }
  150. })
  151. }
  152. calcSubInfoForLib (item: any) {
  153. const { UpdateAt, DocFileSize } = item
  154. return [`${dateFormatter(UpdateAt * 1000, 'yyyy/MM/dd')}下载`, formatSize(DocFileSize)]
  155. }
  156. calcSubInfoForColl (item: any) {
  157. const { DocPageSize, DocFileSize } = item
  158. return [`共${DocPageSize}页`, formatSize(DocFileSize)]
  159. }
  160. async onLoad () {
  161. const t: any = this.$data[this.keyForList]
  162. const query = {
  163. num: t.pageNum,
  164. size: t.pageSize,
  165. sign: this.tabActive
  166. }
  167. console.log('搜索参数:', query)
  168. t.loading = true
  169. const { data } = await this.getMyLibList(query)
  170. t.loading = false
  171. t.loaded = true
  172. if (data && Array.isArray(data.list)) {
  173. t.pageNum += 1
  174. t.total = data.total
  175. t.list = t.list.concat(data.list)
  176. } else {
  177. t.finished = true
  178. }
  179. // 数据请求完成(根据页码计算,当前页是否是最后一页)
  180. // 请求完成后,页码就变为了下一页的页面,所以这里要-1
  181. const isLastPage = (t.pageNum - 1) * t.pageSize >= t.total
  182. if (isLastPage) {
  183. t.finished = true
  184. }
  185. }
  186. reStoreState () {
  187. const listInfo = this.userLibInfo
  188. if (!listInfo || Object.keys(listInfo).length === 0) {
  189. return false
  190. } else {
  191. for (const key in listInfo) {
  192. this.$data[key] = listInfo[key]
  193. }
  194. this.setScrollTop(this.$data[this.keyForList].scrollTop)
  195. setTimeout(() => {
  196. this.clearLibState()
  197. }, 20)
  198. return true
  199. }
  200. }
  201. setScrollTop (scrollTop: number) {
  202. this.$nextTick(() => {
  203. const wrapper: any = document.querySelector('.van-tabs__content')
  204. wrapper.scrollTop = scrollTop
  205. })
  206. }
  207. saveScrollTop () {
  208. const wrapper: any = document.querySelector('.van-tabs__content')
  209. this.$data[this.keyForList].scrollTop = wrapper.scrollTop
  210. }
  211. saveState () {
  212. this.saveScrollTop()
  213. const d = {
  214. tabActive: this.tabActive,
  215. myLibListState: this.myLibListState,
  216. myCollectionListState: this.myCollectionListState
  217. }
  218. this.saveLibState(d)
  219. }
  220. }
  221. </script>
  222. <style lang="scss" scoped>
  223. .user-library {
  224. ::v-deep {
  225. .van-tabs__wrap {
  226. height: 48px;
  227. }
  228. .van-tabs__line {
  229. bottom: 18px;
  230. }
  231. .van-tab__pane {
  232. height: 100%;
  233. }
  234. .van-tabs__content {
  235. flex: 1;
  236. overflow-y: scroll;
  237. overflow-x: hidden;
  238. }
  239. .van-tabs {
  240. width: 100%;
  241. }
  242. .van-tab {
  243. font-size: 16px;
  244. line-height: 20px;
  245. }
  246. }
  247. }
  248. </style>