演示项目-图书馆
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

278 lines
7.6 KiB

  1. <template>
  2. <div class="main">
  3. <div class="top-header">
  4. <span class="back" @click="toBack"></span>
  5. <p>开始选书</p>
  6. <img @click="toCart" style="width: .48rem;" src="@assets/images/cart.png" alt="" />
  7. </div>
  8. <div class="bookList-main">
  9. <input type="text" v-model="query" placeholder="搜索" class="search-input" />
  10. <div class="banner">
  11. <img src="@assets/images/banner.png" alt="" />
  12. </div>
  13. <div class="booList-all">
  14. <div class="booList-filter">
  15. <select v-model="selectedValue">
  16. <option value="1">热度降序</option>
  17. <option value="2">热度升序</option>
  18. <option value="3">价格降序</option>
  19. <option value="4">价格升序</option>
  20. </select>
  21. </div>
  22. <van-list
  23. v-model:loading="loading"
  24. :finished="finished"
  25. finished-text="没有更多了"
  26. @load="onLoad"
  27. >
  28. <div class="book-item" v-for="(item,index) in list" :key="item" @click="showDetial=true">
  29. <div class="product-cont">
  30. <div class="product-img"><img src="" alt="" /></div>
  31. <div class="product-txt">
  32. <div class="product-info">
  33. <h4 class="overflow-txt">秒懂AI提问让人工智能开发大脑{{ item }} </h4>
  34. <div class="author-date">
  35. <p class="author overflow-txt-only">秋叶 刘进新 姜梅 定秋枫</p>
  36. <p class="date overflow-txt-only">2023年07月</p>
  37. </div>
  38. <p class="book-publish">人民邮电出版社</p>
  39. </div>
  40. </div>
  41. <div class="dealer"> 京东商城</div>
  42. </div>
  43. <div class="sales-progress">
  44. <van-progress :percentage="50" :show-pivot="false" color="#5A86F4" stroke-width=".17rem" />
  45. <p>已定<span>5</span></p>
  46. <p>剩余<span>5</span></p>
  47. </div>
  48. </div>
  49. </van-list>
  50. </div>
  51. </div>
  52. <van-dialog v-model:show="showDetial" :show-confirm-button="false">
  53. <div class="bookItem-dialog-detail">
  54. <div class="list-top">
  55. <div class="top-info">
  56. <p class="active-name">你选书我买单<i></i></p>
  57. </div>
  58. </div>
  59. <div class="product-cont">
  60. <div class="product-img">
  61. <img src="" alt="" />
  62. </div>
  63. <div class="book-inventory">
  64. <p>剩余库存</p>
  65. <span><i>5</i></span>
  66. </div>
  67. <div class="product-txt">
  68. <div class="product-info">
  69. <h4>秒懂AI提问让人工智能开发大脑</h4>
  70. <div class="bookItem-txt">
  71. <span>著者</span>
  72. <p class="author">秋叶 刘进新 姜梅 定秋枫</p>
  73. </div>
  74. <div class="bookItem-txt">
  75. <span>出版社</span>
  76. <p>人民邮电出版社</p>
  77. </div>
  78. <div class="bookItem-txt">
  79. <span>出版时间</span>
  80. <p>2023年07月</p>
  81. </div>
  82. <div class="bookItem-txt">
  83. <span class="txt-title">简介</span>
  84. <p class="intro-txt">精心提炼20种GPT提问方法及指令从入门到进阶再到精通100个案例带你玩</p>
  85. </div>
  86. </div>
  87. </div>
  88. </div>
  89. <div class="order-dealer">
  90. <p class="dealer">京东商城</p>
  91. <div class="order-pay">
  92. <p>实付款<span><i></i>0</span></p>
  93. <span class="yj-price"><i></i><em>129.0</em></span>
  94. </div>
  95. </div>
  96. </div>
  97. <div class="dialog-btn">
  98. <span @click="showDetial=false">取消</span>
  99. <span class="btn-comfired" @click="addCart">加入书车</span>
  100. </div>
  101. </van-dialog>
  102. </div>
  103. </template>
  104. <script>
  105. import { Toast } from 'vant'
  106. import { reactive, onMounted, getCurrentInstance, toRefs } from 'vue'
  107. export default {
  108. name: 'BookList',
  109. setup() {
  110. const { proxy } = getCurrentInstance()
  111. let data = reactive({
  112. query: '',
  113. selectedValue: '1',
  114. showDetial: false,
  115. list:[],
  116. loading: false,
  117. finished: false
  118. })
  119. onMounted(() => {})
  120. let toBack = () => {
  121. proxy.$router.push({ path: '/' })
  122. }
  123. let onLoad = () => {
  124. // 异步更新数据
  125. setTimeout(() => {
  126. for (let i = 0; i < 10; i++) {
  127. data.list.push(data.list.length + 1);
  128. }
  129. // 加载状态结束
  130. data.loading = false;
  131. // 数据全部加载完成
  132. if (data.list.length >= 40) {
  133. data.finished = true;
  134. }
  135. }, 1000);
  136. }
  137. let addCart = () => {
  138. data.showDetial = false
  139. Toast('当前书籍已成功加入书车')
  140. }
  141. let toCart = () => {
  142. proxy.$router.push({ path: '/Cart' })
  143. }
  144. return {
  145. ...toRefs(data),
  146. toBack,
  147. addCart,
  148. onLoad,
  149. toCart
  150. }
  151. },
  152. }
  153. </script>
  154. <style scoped lang="scss">
  155. .bookList-main{
  156. padding: 1.2rem .16rem 0 .16rem;
  157. height: calc(100% - 1.2rem);
  158. background-color: #fff;
  159. .search-input{
  160. display: block;
  161. padding: .18rem .18rem .18rem .66rem;
  162. width: calc(100% - .84rem);
  163. height: .32rem;
  164. line-height: .32rem;
  165. font-size: .26rem;
  166. background: url('@assets/images/search.png') no-repeat #F1F4FE .24rem center;
  167. background-size: .24rem .24rem;
  168. border-radius: 0.08rem;
  169. }
  170. .banner{
  171. margin: .3rem 0 .2rem 0;
  172. box-shadow: 0px 0.1rem 0.6rem 1px rgba(20, 69, 207, 0.20);
  173. img{
  174. display: block;
  175. width: 100%;
  176. }
  177. }
  178. }
  179. .booList-all{
  180. padding: .36rem .24rem;
  181. background: #fff;
  182. box-shadow: 0px 0.03rem 0.6rem 1px rgba(0, 0, 0, 0.08);
  183. border-radius: 0.08rem;
  184. }
  185. .booList-filter{
  186. select{
  187. display: block;
  188. font-size: .28rem;
  189. padding-right: .24rem;
  190. border: none;
  191. color: #FE6902;
  192. background: url('@assets/images/book-arrow.png') no-repeat transparent right center;
  193. background-size: .16rem .16rem;
  194. -webkit-appearance:none;
  195. -moz-appearance:none;
  196. appearance:none;
  197. outline: none;
  198. -webkit-tap-highlight-color: rgba(0,0,0,0);
  199. }
  200. }
  201. .book-item{
  202. padding-top: .4rem;
  203. .product-cont{
  204. position: relative;
  205. .product-info{
  206. h4{
  207. width: 3.34rem;
  208. }
  209. }
  210. .author-date{
  211. margin: 0.04rem 0;
  212. p{
  213. height: .36rem;
  214. line-height: .36rem;
  215. border-radius: 0.04rem;
  216. }
  217. }
  218. .book-publish{
  219. font-size: .24rem;
  220. opacity: .6;
  221. }
  222. .dealer{
  223. position: absolute;
  224. top: 0;
  225. right: 0;
  226. padding: 0.04rem 0.08rem 0.04rem .32rem;
  227. font-size: .24rem;
  228. background-color: #F4F6FC;
  229. background-position: .08rem center;
  230. opacity: .6;
  231. }
  232. }
  233. .sales-progress{
  234. display: flex;
  235. justify-content: space-between;
  236. align-items: center;
  237. margin-top: .24rem;
  238. padding: .2rem .24rem;
  239. background-color: #F9F9FD;
  240. border: 1px solid #f2f2f2;
  241. border-radius: 0.08rem;
  242. :deep(.van-progress){
  243. width: 2.88rem;
  244. border-radius: 0.03rem;
  245. background-color: #E1E8FC;
  246. }
  247. p{
  248. font-size: .24rem;
  249. color: #737475;
  250. span{
  251. color: #191A1A;
  252. }
  253. &:last-child{
  254. span{
  255. color: #FF3871;
  256. }
  257. }
  258. }
  259. }
  260. }
  261. .dialog-btn{
  262. span{
  263. width: 2rem;
  264. text-align: center;
  265. padding: 0;
  266. }
  267. }
  268. </style>