图书馆小程序
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.

465 lines
13 KiB

2 weeks ago
1 week ago
2 weeks ago
1 week ago
2 weeks ago
1 week ago
2 weeks ago
1 week ago
2 weeks ago
1 week ago
2 weeks ago
1 week ago
2 weeks ago
1 week ago
2 weeks ago
1 week ago
2 weeks ago
1 week ago
2 weeks ago
1 week ago
2 weeks ago
1 week ago
2 weeks ago
1 week ago
2 weeks ago
1 week ago
2 weeks ago
1 week ago
2 weeks ago
1 week ago
2 weeks ago
1 week ago
2 weeks ago
1 week ago
2 weeks ago
1 week ago
2 weeks ago
1 week ago
2 weeks ago
1 week ago
2 weeks ago
1 week ago
2 weeks ago
  1. <template>
  2. <view style="padding-bottom: 20px;">
  3. <view class="top-bar">
  4. <image class="top-bar-bg" src="@/static/images/mingqi-beij@2x.png" mode="aspectFill"></image>
  5. <view class="library-info">
  6. <image class="avatar" src="@/static/images/avatar.png" mode="aspectFill"></image>
  7. <view class="library-name">葛店经济技术开发区图书馆</view>
  8. </view>
  9. <uni-icons class="search-icon" type="search" size="30" @click="onToSearch"></uni-icons>
  10. </view>
  11. <view class="status-cards">
  12. <view class="status-card" @click="toBorrowPage(1)">
  13. <view class="status-icon icon-color1" >
  14. <uni-icons custom-prefix="iconfont" type="icon-daiban02" size="22"></uni-icons>
  15. </view>
  16. <view class="status-label">在借中</view>
  17. </view>
  18. <view class="status-card" @click="toBorrowPage(2)">
  19. <view class="status-icon icon-color2" >
  20. <uni-icons custom-prefix="iconfont" type="icon-zuofei05" size="22"></uni-icons>
  21. </view>
  22. <view class="status-label">将过期</view>
  23. </view>
  24. <view class="status-card" @click="toBorrowPage(3)">
  25. <view class="status-icon icon-color3" >
  26. <uni-icons custom-prefix="iconfont" type="icon-yuqi04" size="22"></uni-icons>
  27. </view>
  28. <view class="status-label">已过期</view>
  29. </view>
  30. <view class="status-card" @click="toBorrowCar">
  31. <view class="status-icon icon-color4" >
  32. <uni-icons custom-prefix="iconfont" type="icon-a-zhidu4" size="22"></uni-icons>
  33. </view>
  34. <view class="status-label">借阅清单</view>
  35. </view>
  36. </view>
  37. <swiper class="banner-swiper" interval="3000" circular :vertical="false" :indicator-dots="true" :autoplay="true">
  38. <swiper-item>
  39. <image data-post-id="3" src="https://qiniu.aiyxlib.com/1605060269830"></image>
  40. </swiper-item>
  41. <swiper-item>
  42. <image data-post-id="4" src="https://qiniu.aiyxlib.com/1605060269830"></image>
  43. </swiper-item>
  44. </swiper>
  45. <!-- circular -->
  46. <swiper class="menu-swiper" interval="6000" :vertical="false" :indicator-dots="true" :autoplay="false">
  47. <swiper-item>
  48. <view class="menu-grid">
  49. <view class="menu-item" @click="onToSearch">
  50. <view class="menu-icon">
  51. <uni-icons custom-prefix="iconfont" type="icon-ziyuan" size="22"></uni-icons>
  52. </view>
  53. <view class="menu-label">书目检索</view>
  54. </view>
  55. <view class="menu-item" @click="onToScan">
  56. <view class="menu-icon">
  57. <uni-icons custom-prefix="iconfont" type="icon-saomajieshu1" size="22"></uni-icons>
  58. </view>
  59. <view class="menu-label">扫码借书</view>
  60. </view>
  61. <view class="menu-item">
  62. <view class="menu-icon">
  63. <uni-icons custom-prefix="iconfont" type="icon-z_renew_normal" size="24"></uni-icons>
  64. </view>
  65. <view class="menu-label">图书续借</view>
  66. </view>
  67. <view class="menu-item" >
  68. <view class="menu-icon">
  69. <uni-icons custom-prefix="iconfont" type="icon-guanwaizhuanjie1" size="26"></uni-icons>
  70. </view>
  71. <view class="menu-label">图书转借</view>
  72. </view>
  73. <view class="menu-item" @click="toRanking">
  74. <view class="menu-icon">
  75. <uni-icons custom-prefix="iconfont" type="icon-paihangbang" size="22"></uni-icons>
  76. </view>
  77. <view class="menu-label">借阅排行</view>
  78. </view>
  79. <view class="menu-item" @click="toActivityList">
  80. <view class="menu-icon">
  81. <uni-icons custom-prefix="iconfont" type="icon-remenhuodong" size="26"></uni-icons>
  82. </view>
  83. <view class="menu-label">活动报名</view>
  84. </view>
  85. <view class="menu-item" @click="toFeedback">
  86. <view class="menu-icon">
  87. <uni-icons custom-prefix="iconfont" type="icon-duzheliuyan" size="26"></uni-icons>
  88. </view>
  89. <view class="menu-label">读者留言</view>
  90. </view>
  91. <view class="menu-item" @click="toLibraryCard">
  92. <view class="menu-icon">
  93. <uni-icons custom-prefix="iconfont" type="icon-duzhezheng" size="26"></uni-icons>
  94. </view>
  95. <view class="menu-label">电子证</view>
  96. </view>
  97. </view>
  98. </swiper-item>
  99. <swiper-item>
  100. <view class="menu-grid">
  101. <view class="menu-item">
  102. <view class="menu-icon">
  103. <uni-icons custom-prefix="iconfont" type="icon-yonghuxinxi-gerenxinxi" size="20"></uni-icons>
  104. </view>
  105. <view class="menu-label">个人中心</view>
  106. </view>
  107. </view>
  108. </swiper-item>
  109. </swiper>
  110. <!-- 借阅证区域登录后隐藏 -->
  111. <view class="library-card-section" @click="toCheckLogin" v-if="!isBindLibraryCard">
  112. <view class="section-title">借阅证</view>
  113. <image class="card-icon" src="@/static/images/card-img2.png"></image>
  114. <view class="card-tip">您还没有绑定读者证哦</view>
  115. <button class="bind-btn">立即绑定</button>
  116. </view>
  117. <view class="recommendation-section">
  118. <view class="section-title">
  119. <text class="left-txt">图书推荐</text>
  120. <view class="more-link" @click="getMoreBoook">
  121. <text style="margin-right: 5px;">查看更多</text>
  122. <uni-icons custom-prefix="iconfont" type="icon-gengduo" size="12"></uni-icons>
  123. </view>
  124. </view>
  125. <view class="recommendation-list">
  126. <uni-load-more status="loading" v-if="isLoading"></uni-load-more>
  127. <view v-else class="book-item" v-for="(item,index) in recommendedBooks" @click="goToBookDetail(item)" :key="index" >
  128. <image class="book-cover" :src="item.cover"></image>
  129. <view class="book-title">{{item.title}}</view>
  130. </view>
  131. </view>
  132. </view>
  133. </view>
  134. </template>
  135. <script>
  136. export default {
  137. data() {
  138. return {
  139. isLoading: true,
  140. recommendedBooks: [],
  141. token: "",
  142. userInfo: {},
  143. isBindLibraryCard: false // 标记是否已登录/绑定借阅证
  144. };
  145. },
  146. onLoad() {
  147. this.getRecommendBooks();
  148. this.checkLoginStatus(); // 页面加载检查登录状态
  149. },
  150. // 页面显示时刷新状态(从登录页返回时生效)
  151. onShow() {
  152. this.checkLoginStatus();
  153. },
  154. methods:{
  155. // 检查登录状态,控制借阅证区域显示隐藏
  156. checkLoginStatus() {
  157. this.loadUser();
  158. // 如果有 token,说明已登录 → 隐藏借阅证提示
  159. this.isBindLibraryCard = !!this.token;
  160. },
  161. getRecommendBooks() {
  162. setTimeout(() => {
  163. this.recommendedBooks = [
  164. {
  165. isbn: '9787544741110',
  166. title: '人工智能基础——数学知识',
  167. cover: 'https://qiniu.aiyxlib.com/1606124577077'
  168. },
  169. {
  170. isbn: '9787539938032',
  171. title: 'Vim 8文本处理实战',
  172. cover: 'https://qiniu.aiyxlib.com/1606178450151'
  173. },
  174. {
  175. isbn: '9787536692930',
  176. title: 'Oracle从入门到精通',
  177. cover: 'https://qiniu.aiyxlib.com/1606123986028'
  178. }
  179. ];
  180. this.isLoading = false;
  181. }, 1200);
  182. },
  183. goToBookDetail(item) {
  184. console.log('item',item)
  185. uni.navigateTo({
  186. url: "/subpkg/pages/book-detail/book-detail?isbn=" + item.isbn
  187. })
  188. },
  189. getMoreBoook(){
  190. uni.navigateTo({
  191. url: "/subpkg/pages/book-list/book-list"
  192. })
  193. },
  194. onToSearch() {
  195. uni.switchTab({
  196. url: "/pages/search/search"
  197. });
  198. },
  199. // 统一读取用户信息
  200. loadUser() {
  201. this.token = uni.getStorageSync("token") || ""
  202. this.userInfo = uni.getStorageSync("user-info") || {}
  203. },
  204. toCheckLogin(pageName) {
  205. this.loadUser();
  206. if (!this.token) {
  207. uni.getUserProfile({
  208. desc: "绑定读者证",
  209. success: (res) => {
  210. const userInfo = JSON.parse(res.rawData);
  211. uni.setStorageSync("wxUserInfo", userInfo);
  212. uni.setStorageSync("wxSignature", res.signature);
  213. uni.navigateTo({
  214. url: "/pages/login/login"
  215. });
  216. },
  217. fail: () => {
  218. uni.showToast({ title: "授权失败", icon: "error" });
  219. }
  220. });
  221. return
  222. }
  223. },
  224. toRanking(){
  225. uni.navigateTo({
  226. url: "/subpkg/pages/ranking/ranking"
  227. })
  228. },
  229. toActivityList(){
  230. uni.navigateTo({
  231. url: "/subpkg/pages/activity-list/activity-list"
  232. })
  233. },
  234. toBorrowPage(index) {
  235. uni.setStorageSync('switch_tab_index', index);
  236. uni.navigateTo({
  237. url: '/subpkg/pages/myLending/myLending'
  238. });
  239. },
  240. toBorrowCar() {
  241. uni.switchTab({
  242. url: '/pages/lendCar/lendCar'
  243. });
  244. },
  245. toFeedback() {
  246. uni.navigateTo({
  247. url: '/subpkg/pages/feedback-list/feedback-list'
  248. });
  249. },
  250. toLibraryCard(){
  251. uni.navigateTo({
  252. url: '/subpkg/pages/reader-card/reader-card'
  253. });
  254. },
  255. onToScan() {
  256. // 调用微信扫码
  257. uni.scanCode({
  258. onlyFromCamera: true, // 只允许相机扫码
  259. scanType: ['barCode'], // 只扫图书条形码(ISBN)
  260. success: (res) => {
  261. uni.showToast({
  262. title: '扫码结果:'+ res.result,
  263. icon: 'none'
  264. })
  265. console.log('扫码结果:', res.result)
  266. // 获取真实ISBN
  267. let isbn = res.result || ''
  268. // ===== 测试模式:没有扫到真实图书,用测试ISBN =====
  269. if (!isbn || isbn.length < 10) {
  270. isbn = '9787020167319' // 活着 余华
  271. }
  272. // 跳转到图书详情页
  273. uni.navigateTo({
  274. url: '/subpkg/pages/book-detail/book-detail?isbn=' + isbn
  275. })
  276. },
  277. fail: (err) => {
  278. console.log('扫码失败:', err)
  279. uni.showToast({
  280. title: '扫码取消或失败',
  281. icon: 'none'
  282. })
  283. }
  284. })
  285. }
  286. }
  287. }
  288. </script>
  289. <style lang="scss" scoped>
  290. .top-bar{
  291. .search-icon{
  292. position: absolute;
  293. right: 16px;
  294. top: 15px;
  295. z-index: 22;
  296. ::v-deep .uni-icons{
  297. color: #fff !important;
  298. }
  299. }
  300. }
  301. .status-cards {
  302. display: flex;
  303. background-color: $uni-white;
  304. margin: 10px;
  305. border-radius: 8px;
  306. padding: 20px 10px;
  307. box-shadow: 0 1px 5px rgba(0, 0, 0, 0.05);
  308. .status-card {
  309. flex: 1;
  310. display: flex;
  311. flex-direction: column;
  312. align-items: center;
  313. }
  314. .status-icon {
  315. display: flex;
  316. justify-content: center;
  317. align-items: center;
  318. width: 40px;
  319. height: 40px;
  320. margin-bottom: 6px;
  321. border-radius: 50%;
  322. }
  323. .icon-color1{
  324. background-color: #e4f2ff;
  325. }
  326. .icon-color2{
  327. background-color: #ffeff0;
  328. }
  329. .icon-color3{
  330. background-color: #e4fff4;
  331. }
  332. .icon-color4{
  333. background-color: #fef8e2;
  334. }
  335. .status-label {
  336. font-size: 12px;
  337. color: $uni-main-color;
  338. }
  339. }
  340. swiper.banner-swiper{
  341. width: 100%;
  342. height: 130px;
  343. }
  344. swiper.banner-swiper image{
  345. width: 100%;
  346. height: 130px;
  347. }
  348. swiper.menu-swiper{
  349. width:100%;
  350. margin-top: 10px;
  351. background-color: $uni-white;
  352. }
  353. .menu-grid {
  354. display: grid;
  355. grid-template-columns: repeat(4, 1fr);
  356. .menu-item {
  357. display: flex;
  358. flex-direction: column;
  359. align-items: center;
  360. padding: 10px 0;
  361. .menu-icon{
  362. display: flex;
  363. flex-direction: column;
  364. justify-content: center;
  365. height: 30px;
  366. ::v-deep .uni-icons{
  367. color: #01a4fe !important;
  368. }
  369. }
  370. .menu-label {
  371. font-size: 12px;
  372. color: $uni-main-color;
  373. text-align: center;
  374. }
  375. }
  376. }
  377. .library-card-section {
  378. display: flex;
  379. flex-direction: column;
  380. justify-content: space-between;
  381. align-items: center;
  382. width: 100%;
  383. padding: 20px 0;
  384. .section-title {
  385. font-size: 22px;
  386. font-weight: bold;
  387. background: linear-gradient(140deg, #01a4ff, #2ec8fe);
  388. -webkit-background-clip: text;
  389. color: transparent;
  390. letter-spacing: 0.1em;
  391. margin-bottom: 5px;
  392. }
  393. .card-icon {
  394. width: 80px;
  395. height: 80px;
  396. }
  397. .card-tip {
  398. font-size: 12px;
  399. color: $uni-secondary-color;
  400. margin: 5px 0;
  401. }
  402. .bind-btn {
  403. display: flex;
  404. flex-direction: row;
  405. align-items: center;
  406. justify-content: center;
  407. border: 1px solid #06a8ff ;
  408. width: 128px !important;
  409. height: 28px;
  410. border-radius: 28px;
  411. background: linear-gradient(140deg, #01a4ff, #2ec8fe);
  412. font-size: 14px;
  413. color: $uni-white;
  414. line-height: 28px;
  415. }
  416. }
  417. .recommendation-section {
  418. background-color: #fff;
  419. margin: 10px;
  420. border-radius: 8px;
  421. padding: 0 0 10px 0;
  422. box-shadow: 0 1px 5px rgba(0, 0, 0, 0.05);
  423. .section-title{
  424. display: flex;
  425. flex-direction: row;
  426. justify-content: space-between;
  427. align-items: center;
  428. height: 40px;
  429. padding: 0 10px;
  430. .left-txt{
  431. color: #343434;
  432. font-size: 15px;
  433. font-weight: 700;
  434. }
  435. .more-link{
  436. display: flex;
  437. flex-direction: row;
  438. justify-content: flex-start;
  439. align-items: center;
  440. color: $uni-base-color;
  441. font-size: 11px;
  442. }
  443. }
  444. }
  445. </style>