stock.blade.php 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349
  1. @extends('wap-browser.template')
  2. @section('head')
  3. <link rel="stylesheet" href="/wapbrowser/web/component.css">
  4. <style>
  5. .stock-limit{
  6. margin-top: .24rem;
  7. padding: 0 .24rem;
  8. font-size: .24rem;
  9. overflow: hidden;
  10. transition: height .3s;
  11. }
  12. .stock-limit__type {
  13. display: -webkit-box;
  14. display: -ms-flexbox;
  15. display: flex;
  16. -webkit-box-align: start;
  17. -ms-flex-align: start;
  18. align-items: flex-start;
  19. -webkit-box-orient: horizontal;
  20. -webkit-box-direction: normal;
  21. -ms-flex-direction: row;
  22. flex-direction: row;
  23. -webkit-box-pack: justify;
  24. -ms-flex-pack: justify;
  25. justify-content: space-between;
  26. }
  27. .stock-limit__label {
  28. width: 1.2rem;
  29. line-height: .5rem;
  30. }
  31. .stock-limit__items {
  32. display: -webkit-box;
  33. display: -ms-flexbox;
  34. display: flex;
  35. -webkit-box-align: center;
  36. -ms-flex-align: center;
  37. align-items: center;
  38. -webkit-box-orient: horizontal;
  39. -webkit-box-direction: normal;
  40. -ms-flex-direction: row;
  41. flex-direction: row;
  42. -webkit-box-pack: start;
  43. -ms-flex-pack: start;
  44. justify-content: flex-start;
  45. width: 5.8rem;
  46. -ms-flex-wrap: wrap;
  47. flex-wrap: wrap;
  48. }
  49. .stock-limit__item {
  50. width: 22%;
  51. box-sizing: border-box;
  52. border: 1px solid #999;
  53. color: #999;
  54. border-radius: .25rem;
  55. height: .5rem;
  56. line-height: .5rem;
  57. text-align: center;
  58. margin-bottom: .3rem;
  59. margin-right: 4%;
  60. }
  61. .stock-limit__item:nth-child(4n) {
  62. margin-right: 0;
  63. }
  64. .stock-limit__item.is-active {
  65. border-color: #ff6060;
  66. color: #ff6060;
  67. }
  68. .book-stock-switch {
  69. margin-top: -.2rem;
  70. background-color: #fff;
  71. }
  72. .book-stock-switch__content {
  73. text-align: center;
  74. color: #999;
  75. display: -webkit-box;
  76. display: -ms-flexbox;
  77. display: flex;
  78. -webkit-box-align: center;
  79. -ms-flex-align: center;
  80. align-items: center;
  81. -webkit-box-orient: horizontal;
  82. -webkit-box-direction: normal;
  83. -ms-flex-direction: row;
  84. flex-direction: row;
  85. -webkit-box-pack: center;
  86. -ms-flex-pack: center;
  87. justify-content: center;
  88. height: 2.5em;
  89. }
  90. .book-stock-switch__icon {
  91. width: 1em;
  92. margin-left: .5em;
  93. }
  94. .book-stock-switch__shadow {
  95. width: 7.5rem;
  96. height: .2rem;
  97. background: radial-gradient(3.75rem .1rem at 50% 0,#f0f0f0,#fff);
  98. }
  99. .x-book--stock{
  100. margin: .36rem .24rem;
  101. }
  102. </style>
  103. @endsection
  104. @section('body')
  105. @component('wap-browser.component.header',['name'=> $title])
  106. @endcomponent
  107. <!-- 输入框 -->
  108. <!-- 输入框 -->
  109. <div class="stock-limit">
  110. <dl class="stock-limit__type">
  111. <dt class="stock-limit__label">频道</dt>
  112. <dd class="stock-limit__items stock-limit__items--channel">
  113. </dd>
  114. </dl>
  115. <dl class="stock-limit__type stock-limit__type--category">
  116. <dt class="stock-limit__label">分类</dt>
  117. <dd class="stock-limit__items stock-limit__items--category">
  118. </dd>
  119. </dl>
  120. <dl class="stock-limit__type">
  121. <dt class="stock-limit__label">是否完结</dt>
  122. <dd class="stock-limit__items stock-limit__items--status">
  123. </dd>
  124. </dl>
  125. </div>
  126. <div class="book-stock-switch">
  127. <div class="book-stock-switch__content">
  128. <span>收回筛选项</span>
  129. <img src="data:image/png;base64,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UmVhZHlxyWU8AAADIWlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS41LWMwMTQgNzkuMTUxNDgxLCAyMDEzLzAzLzEzLTEyOjA5OjE1ICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDpDNkExODdBOEJFQUYxMUU3OEFFRkRCNDMwRjc1MkZBMyIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDpDNkExODdBN0JFQUYxMUU3OEFFRkRCNDMwRjc1MkZBMyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ0MgKFdpbmRvd3MpIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6MzUzRjk5NDdCRUE2MTFFN0FGNTJFQkQ3OUU5ODBEREQiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6MzUzRjk5NDhCRUE2MTFFN0FGNTJFQkQ3OUU5ODBEREQiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz52KAuAAAAAzElEQVR42mL8//8/A6WAcdAYwjJr1iyKDWEC4lVA7ECmfnuQfpAhE4B4GRC7kmgASP1yIJ4IMuQYEPsD8UIg9iDSAA+oepC+o0xQwdNA7APE84DYl4ABMHU+UH0MLEiS54DYC4i3ADErEK/DYkAgEE+GqrsAjx00RSAJNyDeCZVbhSQXCsR9QOwOxFdRohiLbdeggbYLKg8K9Cgg7oSK38BIJzj8DVLoAnWRI5TtDMS3cKUTXOAWVKMaPgPwuQQG7kET1BDJgFQxBCDAAJYiNRrFawMuAAAAAElFTkSuQmCC" class="book-stock-switch__icon"></div>
  130. <div class="book-stock-switch__shadow">
  131. </div>
  132. </div>
  133. <div class="stock-list">
  134. </div>
  135. <div class="spinner" style="heigth: 30px; overflow: hidden;">
  136. <div class="mint-spinner-snake" style="margin: 0 auto;border-top-color: rgb(38, 162, 255); border-left-color: rgb(38, 162, 255); border-bottom-color: rgb(38, 162, 255); height: 28px; width: 28px;"></div>
  137. </div>
  138. @endsection
  139. @section('foot')
  140. <script>
  141. var categories = @json($categories);
  142. categories.unshift({
  143. id: 0,
  144. name: '不限'
  145. })
  146. categories.map(function(item){
  147. if(item.children){
  148. item.children.unshift({
  149. id: item.id,
  150. name: '不限'
  151. })
  152. }
  153. })
  154. var stats = [
  155. { id: -1, name: '不限' },
  156. { id: 1, name: '完结' },
  157. { id: 0, name: '连载' }
  158. ]
  159. var channel = '1' , category = '1', stat = '1', page = '1', last = false
  160. function createItem(list,event){
  161. return list.map(function(v){
  162. var item = document.createElement('div')
  163. item.setAttribute('class','stock-limit__item')
  164. item.setAttribute('data-id',v.id)
  165. item.innerHTML = v.name
  166. addEvent(item,'click',event)
  167. return item
  168. })
  169. }
  170. function isActivbe(nodes,id){
  171. nodes.map(function(node){
  172. if(node.getAttribute('data-id') === id){
  173. addClass(node,'is-active')
  174. }else{
  175. removeClass(node,'is-active')
  176. }
  177. })
  178. }
  179. function setHeight(hide){
  180. var dom = document.querySelector('.stock-limit')
  181. var limit = document.querySelector('.book-stock-switch__content span')
  182. if(hide && dom.offsetHeight){
  183. dom.style.height = 0
  184. limit.innerHTML = '收回筛选项'
  185. }else{
  186. var h = Math.ceil(categories.length / 4)
  187. + (categories[channel].children ? Math.ceil(categories[channel].children.length / 4) : 0)
  188. + Math.ceil(stats.length / 4)
  189. limit.innerHTML = '展开筛选项'
  190. dom.style.height = h * 0.8 + "rem"
  191. }
  192. }
  193. function initChannel(channel_id){
  194. var dom = document.querySelector('.stock-limit__items--channel')
  195. var items = createItem(categories,function(e){
  196. var id = e.target.getAttribute('data-id')
  197. if(id !== channel){
  198. channel = id
  199. category = id
  200. page = 1
  201. initCategory(id)
  202. isActivbe(items,id)
  203. setHeight()
  204. getList()
  205. }
  206. })
  207. items.map(function(item,i){
  208. dom.appendChild(item)
  209. })
  210. isActivbe(items,channel_id)
  211. }
  212. function initCategory(channel_id){
  213. var dom = document.querySelector('.stock-limit__items--category')
  214. var parent = document.querySelector('.stock-limit__type--category')
  215. if(categories[channel_id].children){
  216. dom.innerHTML = ''
  217. parent.style.display = ''
  218. var items = createItem(categories[channel_id].children,function(e){
  219. var id = e.target.getAttribute('data-id')
  220. category = id
  221. page = 1
  222. getList()
  223. isActivbe(items,id)
  224. })
  225. items.map(function(item){
  226. dom.appendChild(item)
  227. })
  228. isActivbe(items,channel_id)
  229. }else{
  230. parent.style.display = 'none'
  231. }
  232. }
  233. function initStatus(){
  234. var dom = document.querySelector('.stock-limit__items--status')
  235. var items = createItem(stats,function(e){
  236. var id = e.target.getAttribute('data-id')
  237. stat = id
  238. page = 1
  239. getList()
  240. isActivbe(items,id)
  241. })
  242. items.map(function(item){
  243. dom.appendChild(item)
  244. })
  245. isActivbe(items,stat)
  246. }
  247. function createBook(book){
  248. var a = document.createElement('a')
  249. a.setAttribute('href','/detail?bid='+ book.book_id)
  250. a.innerHTML = '\
  251. <dl class="x-book x-book--multi x-book--stock">\
  252. <dt class="x-book__coverbox" style="width: 1.8rem;height: 2.4rem">\
  253. <img src="'+book.cover_url+'" class="x-book__cover" style="width: 1.8rem;height: 2.4rem">\
  254. </dt>\
  255. <dd class="x-book__text--multi" style="width: calc(100% - 1.8rem);height: 2.4rem">\
  256. <div class="x-book-info">\
  257. <p class="x-book-info__name">'+ book.book_name +'</p>\
  258. <p class="x-book-info__flex">\
  259. <span class="x-book-info__author">'+ book.book_author +'</span>\
  260. <span class="x-book-info__finish"> '+ (book.book_end_status ? '完结' : '连载') +' </span>\
  261. </p>\
  262. <p class="x-book-info__count">字数:'+ book.book_word_count +'</p>\
  263. <p class="x-book-info__flex">\
  264. <span class="x-book-info__lastest">\
  265. <span class="red">最新:'+ book.last_chapter +'</span></span>\
  266. '+(book.last_chapter_is_vip ? '<img src="/wapbrowser/web/vip.png" class="x-book-info__vip">' : '<img src="/wapbrowser/web/vip.png" class="x-book-info__vip">')+'\
  267. </p>\
  268. </div>\
  269. </dd>\
  270. </dl>'
  271. return a
  272. }
  273. function queryString(obj) {
  274. let str = ''
  275. for (k in obj){
  276. str = k+'='+obj.k+'&'
  277. }
  278. if(str){
  279. str = str.substr(0,str.length-1)
  280. }
  281. return str;
  282. }
  283. function getList(append){
  284. var wrap = document.querySelector('.stock-list')
  285. if(getList.prev) getList.prev.xhr.abort()
  286. if(!append) wrap.innerHTML = ''
  287. var params = {
  288. category_id: category,
  289. page: page
  290. }
  291. params.stat === -1 ? (params.stat = stat) : null
  292. var url = '/api/books/library?' + queryString(params)
  293. function callback(json){
  294. getList.loading = false
  295. json.data.list.map(function(book){
  296. wrap.appendChild(createBook(book))
  297. })
  298. if( json.data.meta.last_page === json.data.meta.current_page ) {
  299. last = true
  300. document.querySelector('.spinner').style.display = 'none'
  301. }else{
  302. last = false
  303. document.querySelector('.spinner').style.display = ''
  304. }
  305. }
  306. getList.prev = {
  307. params : params,
  308. xhr : getJSON(url,callback)
  309. }
  310. getList.loading = true
  311. }
  312. initChannel(channel)
  313. initCategory(channel,category)
  314. initStatus(stat)
  315. setTimeout(setHeight,0)
  316. getList()
  317. addEvent( document.querySelector('.book-stock-switch'),'click',function () {
  318. setHeight(true)
  319. })
  320. addEvent(window, 'scroll', function(e){
  321. if(getList.loading || last) return
  322. var scrollbottom = Math.max(window.pageYOffset || 0, document.documentElement.scrollTop) + document.documentElement.clientHeight
  323. if(scrollbottom + 50 > document.body.offsetHeight){
  324. page++
  325. getList(true)
  326. }
  327. })
  328. </script>
  329. @endsection