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

707 lines
20 KiB

2 months ago
1 month ago
2 months ago
2 months ago
2 months ago
1 month ago
2 months ago
2 months ago
2 months ago
1 month ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
1 month ago
1 month ago
2 months ago
2 months ago
2 months ago
1 month ago
2 months ago
1 month ago
2 months ago
2 months ago
2 months ago
1 month ago
2 months ago
2 months ago
1 month ago
2 months ago
2 months ago
1 month ago
2 months ago
1 month ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
1 month ago
2 months ago
2 months ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
2 months ago
1 month ago
2 months ago
1 month ago
1 month ago
2 months ago
1 month ago
2 months ago
2 months ago
1 month ago
1 month ago
1 month ago
1 month ago
2 months ago
1 month ago
2 months ago
1 month ago
1 month ago
2 months ago
1 month ago
1 month ago
1 month ago
1 month ago
2 months ago
1 month ago
2 months ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
1 month ago
2 months ago
1 month ago
2 months ago
1 month ago
2 months ago
1 month ago
2 months ago
1 month ago
2 months ago
1 month ago
1 month ago
2 months ago
2 months ago
1 month ago
1 month ago
2 months ago
1 month ago
1 month ago
2 months ago
2 months ago
2 months ago
2 months ago
2 months ago
1 month ago
2 months ago
1 month ago
2 months ago
1 month ago
2 months ago
1 month ago
2 months ago
2 months ago
2 months ago
1 month ago
2 months ago
1 month ago
2 months ago
1 month ago
2 months ago
1 month ago
2 months ago
2 months ago
2 months ago
1 month ago
1 month ago
1 month ago
1 month ago
2 months 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/logo.jpg" 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(0)">
  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="toBorrowPage(1)">
  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. <!-- :indicator-dots="true" -->
  46. <swiper class="menu-swiper" interval="6000" :vertical="false" :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="onToLendCar">
  56. <view class="menu-icon">
  57. <uni-icons custom-prefix="iconfont" type="icon-z_renew_normal" size="24"></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-guanwaizhuanjie1" size="26"></uni-icons>
  64. </view>
  65. <view class="menu-label">图书转借</view>
  66. </view> -->
  67. <view class="menu-item" @click="toLibraryCard">
  68. <view class="menu-icon">
  69. <uni-icons custom-prefix="iconfont" type="icon-duzhezheng" 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="onToUser">
  92. <view class="menu-icon">
  93. <uni-icons custom-prefix="iconfont" type="icon-yonghuxinxi-gerenxinxi" size="20"></uni-icons>
  94. </view>
  95. <view class="menu-label">个人中心</view>
  96. </view>
  97. </view>
  98. </swiper-item>
  99. </swiper>
  100. <!-- 已有绑定滑动切换多个借阅证 -->
  101. <view v-if="isBindLibraryCard" class="library-card-has">
  102. <view class="section-title">我的借阅证</view>
  103. <!-- 左右滑动切换证件 -->
  104. <!-- :indicator-dots="readerCardList.length > 1"
  105. indicator-color="#d1d1d1"
  106. indicator-active-color="#01a4fe" -->
  107. <swiper
  108. class="card-swiper"
  109. :circular="false"
  110. >
  111. <swiper-item v-for="item in readerCardList" :key="item.id">
  112. <view class="card-item" @click.stop="showQrcode(item.bindValue)">
  113. <image class="card-left-img" src="@/static/images/card-img2.png" mode="widthFix" />
  114. <view class="card-right-info">
  115. <text class="info-title">读者证号</text>
  116. <text class="info-num">{{ formatCardNo(item.bindValue) }}</text>
  117. </view>
  118. <view class="default-tag" v-if="item.bindDefault">默认证</view>
  119. <uni-icons class="erweima-style" custom-prefix="iconfont" type="icon-erweima" size="28"></uni-icons>
  120. </view>
  121. </swiper-item>
  122. </swiper>
  123. </view>
  124. <!-- 未绑定借阅证 -->
  125. <view class="library-card-section" @click="toCheckLogin" v-else>
  126. <view class="section-title">借阅证</view>
  127. <image class="card-icon" src="@/static/images/card-img2.png"></image>
  128. <view class="card-tip">您还没有绑定读者证哦</view>
  129. <button class="bind-btn">立即绑定</button>
  130. </view>
  131. <root-portal>
  132. <uni-popup
  133. ref="popup"
  134. type="center"
  135. :mask-click="true"
  136. @maskClick="closePopup"
  137. :custom-style="popupFixedStyle"
  138. >
  139. <view class="qrcode-popup">
  140. <view class="qrcode-title">读者证二维码</view>
  141. <w-qrcode
  142. v-if="qrcodeText"
  143. :value="qrcodeText"
  144. :size="160"
  145. foreground="#333"
  146. background="#ffffff"
  147. />
  148. <view class="qrcode-num">{{ qrcodeText }}</view>
  149. <view class="close-btn" @click="closePopup">关闭</view>
  150. </view>
  151. </uni-popup>
  152. </root-portal>
  153. <view class="recommendation-section">
  154. <view class="section-title">
  155. <text class="left-txt">图书推荐</text>
  156. <view class="more-link" @click="getMoreBoook" v-if="!(recommendedBooks.length === 0 && !isLoading)">
  157. <text style="margin-right: 5px;">查看更多</text>
  158. <uni-icons custom-prefix="iconfont" type="icon-gengduo" size="12"></uni-icons>
  159. </view>
  160. </view>
  161. <view class="recommendation-list">
  162. <uni-load-more status="loading" v-if="isLoading"></uni-load-more>
  163. <view v-else class="book-item" v-for="(item,index) in recommendedBooks.slice(0,3)" @click="goToBookDetail(item)" :key="index" >
  164. <image
  165. class="book-cover"
  166. :src="item.base64Cover || '/static/images/default-book.png'"
  167. @error="onImgError"
  168. ></image>
  169. <view class="book-title">{{item.name}}</view>
  170. </view>
  171. </view>
  172. <view class="empty-box" v-if="recommendedBooks.length === 0 && !isLoading">
  173. <uni-icons custom-prefix="iconfont" type="icon-kongshuju" size="80"></uni-icons>
  174. <text style="margin-top: 20px;">暂无推荐书籍~</text>
  175. </view>
  176. </view>
  177. </view>
  178. </template>
  179. <script>
  180. import { FetchOpenId, FetchFindAllReaderBindByOpenId} from '@/api/user';
  181. import { FetchInitScreenBookRecommend } from '@/api/book';
  182. import config from '@/utils/config';
  183. import { STORAGE_KEYS } from '@/utils/storage';
  184. export default {
  185. data() {
  186. return {
  187. isLoading: true,
  188. recommendedBooks: [],
  189. token: "",
  190. userInfo: {},
  191. isBindLibraryCard: false,
  192. readerCardList: [], // 多个借阅证
  193. baseUrl: config.baseUrl,
  194. qrcodeText: '', // 二维码内容
  195. popupFixedStyle: 'position:fixed;top:0;left:0;right:0;bottom:0;'
  196. };
  197. },
  198. onLoad() {
  199. this.getRecommendBooks();
  200. },
  201. onShow() {
  202. this.initUserAndCheckBind();
  203. },
  204. methods:{
  205. // 格式化读者证号
  206. formatCardNo(cardNo) {
  207. if (!cardNo) return '';
  208. const str = String(cardNo);
  209. const len = str.length;
  210. if (len > 8) {
  211. // 前2位 + 中间全部* + 后2位
  212. const front = str.substring(0, 2);
  213. const end = str.substring(len - 2);
  214. const star = '*'.repeat(len - 4); // 中间全部隐藏
  215. return front + star + end;
  216. } else {
  217. // 小于等于8:*** + 后2位
  218. return '***' + str.substring(len - 2);
  219. }
  220. },
  221. onImgError(e) {
  222. e.target.src = "/static/images/default-book.png";
  223. },
  224. // 初始化:登录 → 获取openid → 查是否绑定
  225. async initUserAndCheckBind() {
  226. try {
  227. // 1. 先看缓存有没有 openId
  228. let openId = uni.getStorageSync('wx_login_code');
  229. // 2. 没有 → 走微信登录流程
  230. if (!openId) {
  231. const loginRes = await new Promise((resolve, reject) => {
  232. uni.login({
  233. success: resolve,
  234. fail: reject
  235. });
  236. });
  237. if (!loginRes.code) {
  238. uni.showToast({ title: '授权失败', icon: 'none' });
  239. return;
  240. }
  241. // 3. 获取 openId
  242. const openRes = await FetchOpenId({
  243. libcode: '1201',
  244. code: loginRes.code
  245. });
  246. if (openRes.code !== 200 || !openRes.data) {
  247. return;
  248. }
  249. openId = openRes.data;
  250. uni.setStorageSync('wx_login_code', openId);
  251. }
  252. // 4. 有了 openId → 查绑定状态
  253. const res = await FetchFindAllReaderBindByOpenId({
  254. libcode: '1201',
  255. openId: openId
  256. });
  257. if (res.code === 200 && res.data.length > 0) {
  258. this.isBindLibraryCard = true;
  259. // 👉 默认证排第一位
  260. const defaultCard = res.data.find(item => item.bindDefault === true);
  261. const otherCards = res.data.filter(item => !item.bindDefault);
  262. // 合并:默认在前,其他在后
  263. this.readerCardList = defaultCard ? [defaultCard, ...otherCards] : res.data;
  264. uni.setStorageSync(STORAGE_KEYS.READER_CARD_LIST, this.readerCardList);
  265. uni.setStorageSync(STORAGE_KEYS.CURRENT_READER_CARD, defaultCard);
  266. } else {
  267. this.isBindLibraryCard = false;
  268. this.readerCardList = [];
  269. uni.setStorageSync(STORAGE_KEYS.READER_CARD_LIST, []);
  270. }
  271. } catch (err) {
  272. console.error('初始化失败:', err);
  273. const list = uni.getStorageSync(STORAGE_KEYS.READER_CARD_LIST) || [];
  274. // 同样默认排第一
  275. const defaultCard = list.find(item => item.bindDefault === true);
  276. const otherCards = list.filter(item => !item.bindDefault);
  277. this.readerCardList = defaultCard ? [defaultCard, ...otherCards] : list;
  278. this.isBindLibraryCard = list.length > 0;
  279. }
  280. },
  281. // 获取图书推荐 + 封面转 base64
  282. async getRecommendBooks() {
  283. try {
  284. const res = await FetchInitScreenBookRecommend({ libcode: '1201' });
  285. let books = res.data || [];
  286. // 只处理并展示前3条,避免setData数据过大
  287. const limit = 3;
  288. const displayBooks = books.slice(0, limit);
  289. for (let i = 0; i < displayBooks.length; i++) {
  290. let item = displayBooks[i];
  291. if (item.imgPath) {
  292. const imageUrl = this.baseUrl + '/api/fileRelevant/getImg?imgType=2&imgId=' + item.imgPath;
  293. try {
  294. const base64 = await this.urlToBase64(imageUrl);
  295. item.base64Cover = base64;
  296. } catch (err) {
  297. item.base64Cover = '';
  298. }
  299. } else {
  300. item.base64Cover = '';
  301. }
  302. }
  303. // 只将展示所需的前3条数据放入响应式,减少setData传输量
  304. this.recommendedBooks = displayBooks;
  305. this.isLoading = false;
  306. } catch (err) {
  307. console.error('获取图书推荐失败:', err);
  308. this.isLoading = false;
  309. }
  310. },
  311. goToBookDetail(item) {
  312. // 把整个图书对象 转成字符串 带过去
  313. uni.navigateTo({
  314. url: "/subpkg/pages/book-detail/book-detail?bookData=" + encodeURIComponent(JSON.stringify(item))
  315. })
  316. },
  317. // 查看更多 → 进入图书列表页
  318. getMoreBoook(){
  319. uni.navigateTo({
  320. url: "/subpkg/pages/book-list/book-list"
  321. })
  322. },
  323. // 去图书检索页
  324. onToSearch() {
  325. uni.switchTab({
  326. url: "/pages/search/search"
  327. });
  328. },
  329. // 去图书借阅车页
  330. onToLendCar() {
  331. uni.switchTab({
  332. url: "/pages/lendCar/lendCar"
  333. });
  334. },
  335. // 点击未绑定借阅证区域 触发跳转
  336. toCheckLogin() {
  337. uni.navigateTo({
  338. url: "/pages/login/login"
  339. });
  340. },
  341. toRanking(){
  342. uni.navigateTo({
  343. url: "/subpkg/pages/ranking/ranking"
  344. })
  345. },
  346. toActivityList(){
  347. uni.navigateTo({
  348. url: "/subpkg/pages/activity-list/activity-list"
  349. })
  350. },
  351. toBorrowPage(index) {
  352. uni.setStorageSync('switch_tab_index', index);
  353. uni.navigateTo({
  354. url: '/subpkg/pages/myLending/myLending'
  355. });
  356. },
  357. toBorrowCar() {
  358. uni.switchTab({
  359. url: '/pages/lendCar/lendCar'
  360. });
  361. },
  362. toFeedback() {
  363. uni.navigateTo({
  364. url: '/subpkg/pages/feedback-list/feedback-list'
  365. });
  366. },
  367. // 去借阅证列表页
  368. toLibraryCard() {
  369. // 已绑定 → 进列表
  370. if (this.isBindLibraryCard) {
  371. uni.navigateTo({ url: '/subpkg/pages/reader-card/reader-card' });
  372. }
  373. // 未绑定 → 进绑定页
  374. else {
  375. uni.navigateTo({ url: "/pages/login/login" });
  376. }
  377. },
  378. // 去个人中心页
  379. onToUser() {
  380. uni.switchTab({
  381. url: "/pages/user/user"
  382. });
  383. },
  384. showQrcode(bindValue) {
  385. this.qrcodeText = bindValue;
  386. this.$refs.popup.open();
  387. },
  388. closePopup() {
  389. console.log('关闭弹窗');
  390. this.qrcodeText = '';
  391. this.$refs.popup.close();
  392. },
  393. urlToBase64(url) {
  394. return new Promise((resolve, reject) => {
  395. uni.request({
  396. url,
  397. method: 'GET',
  398. responseType: 'arraybuffer',
  399. success: (res) => {
  400. try {
  401. const buffer = new Uint8Array(res.data);
  402. let binary = '';
  403. for (let i = 0; i < buffer.length; i++) {
  404. binary += String.fromCharCode(buffer[i]);
  405. }
  406. const base64 = uni.arrayBufferToBase64(res.data);
  407. const dataUri = 'data:image/jpeg;base64,' + base64;
  408. resolve(dataUri);
  409. } catch (e) {
  410. reject(e);
  411. }
  412. },
  413. fail: reject
  414. });
  415. });
  416. },
  417. }
  418. }
  419. </script>
  420. <style lang="scss" scoped>
  421. .top-bar{
  422. .search-icon{
  423. position: absolute;
  424. right: 16px;
  425. top: 15px;
  426. z-index: 22;
  427. ::v-deep .uni-icons{
  428. color: #fff !important;
  429. }
  430. }
  431. }
  432. .status-cards {
  433. display: flex;
  434. background-color: #fff;
  435. margin: 10px;
  436. border-radius: 8px;
  437. padding: 20px 10px;
  438. box-shadow: 0 1px 5px rgba(0, 0, 0, 0.05);
  439. .status-card {
  440. flex: 1;
  441. display: flex;
  442. flex-direction: column;
  443. align-items: center;
  444. }
  445. .status-icon {
  446. display: flex;
  447. justify-content: center;
  448. align-items: center;
  449. width: 40px;
  450. height: 40px;
  451. margin-bottom: 6px;
  452. border-radius: 50%;
  453. }
  454. .icon-color1{
  455. background-color: #e4f2ff;
  456. }
  457. .icon-color2{
  458. background-color: #ffeff0;
  459. }
  460. .icon-color3{
  461. background-color: #e4fff4;
  462. }
  463. .icon-color4{
  464. background-color: #fef8e2;
  465. }
  466. .status-label {
  467. font-size: 12px;
  468. color: #333;
  469. }
  470. }
  471. swiper.banner-swiper{
  472. width: 100%;
  473. height: 130px;
  474. }
  475. swiper.banner-swiper image{
  476. width: 100%;
  477. height: 130px;
  478. }
  479. swiper.menu-swiper{
  480. width:100%;
  481. margin-top: 10px;
  482. background-color: #fff;
  483. }
  484. .menu-grid {
  485. display: grid;
  486. grid-template-columns: repeat(4, 1fr);
  487. .menu-item {
  488. flex: 1;
  489. display: flex;
  490. flex-direction: column;
  491. align-items: center;
  492. padding: 10px 0;
  493. .menu-icon{
  494. display: flex;
  495. flex-direction: column;
  496. justify-content: center;
  497. height: 30px;
  498. ::v-deep .uni-icons{
  499. color: #01a4fe !important;
  500. }
  501. }
  502. .menu-label {
  503. font-size: 12px;
  504. color: #333;
  505. text-align: center;
  506. }
  507. }
  508. }
  509. .library-card-section {
  510. display: flex;
  511. flex-direction: column;
  512. justify-content: space-between;
  513. align-items: center;
  514. width: 100%;
  515. padding: 20px 0;
  516. .section-title {
  517. font-size: 22px;
  518. font-weight: bold;
  519. background: linear-gradient(140deg, #01a4ff, #2ec8fe);
  520. -webkit-background-clip: text;
  521. color: transparent;
  522. letter-spacing: 0.1em;
  523. margin-bottom: 5px;
  524. }
  525. .card-icon {
  526. width: 80px;
  527. height: 80px;
  528. }
  529. .card-tip {
  530. font-size: 12px;
  531. color: #999;
  532. margin: 5px 0;
  533. }
  534. .bind-btn {
  535. display: flex;
  536. flex-direction: row;
  537. align-items: center;
  538. justify-content: center;
  539. border: 1px solid #06a8ff ;
  540. width: 128px !important;
  541. height: 28px;
  542. border-radius: 28px;
  543. background: linear-gradient(140deg, #01a4ff, #2ec8fe);
  544. font-size: 14px;
  545. color: #fff;
  546. line-height: 28px;
  547. }
  548. }
  549. .recommendation-section {
  550. background-color: #fff;
  551. margin: 10px;
  552. border-radius: 8px;
  553. padding: 0 0 10px 0;
  554. box-shadow: 0 1px 5px rgba(0, 0, 0, 0.05);
  555. .section-title{
  556. display: flex;
  557. flex-direction: row;
  558. justify-content: space-between;
  559. align-items: center;
  560. height: 40px;
  561. padding: 0 10px;
  562. .left-txt{
  563. color: #343434;
  564. font-size: 15px;
  565. font-weight: 700;
  566. }
  567. .more-link{
  568. display: flex;
  569. flex-direction: row;
  570. justify-content: flex-start;
  571. align-items: center;
  572. color: #999;
  573. font-size: 11px;
  574. }
  575. }
  576. }
  577. .library-card-has {
  578. width: 100%;
  579. padding: 20px 10px;
  580. box-sizing: border-box;
  581. .section-title {
  582. font-size: 22px;
  583. font-weight: bold;
  584. background: linear-gradient(140deg, #01a4ff, #2ec8fe);
  585. -webkit-background-clip: text;
  586. color: transparent;
  587. letter-spacing: 0.1em;
  588. margin-bottom: 10px;
  589. padding-left: 5px;
  590. }
  591. .card-list {
  592. width: 100%;
  593. }
  594. }
  595. .card-swiper {
  596. height: 106px;
  597. .card-item{
  598. display: flex;
  599. justify-content: space-between;
  600. align-items: center;
  601. padding: 10px;
  602. border: 2px solid #C6C6E2;
  603. border-radius: 8px;
  604. background: rgba(241,241,249,0.4);
  605. cursor: pointer;
  606. &.active{
  607. border-color: #01a4fe;
  608. background: rgba(1, 164, 254, 0.1);
  609. }
  610. .card-left-img{
  611. width: 80px;
  612. margin-right: 12px;
  613. display: block;
  614. }
  615. .card-right-info{
  616. flex: 1;
  617. display: flex;
  618. flex-direction: column;
  619. .info-title{
  620. font-size: 16px;
  621. color: #333;
  622. font-weight: bold;
  623. padding-bottom: 12px;
  624. }
  625. .info-num{
  626. font-size: 14px;
  627. color: #999;
  628. }
  629. }
  630. .default-tag {
  631. position: absolute;
  632. right: 12px;
  633. top: 12px;
  634. font-size: 11px;
  635. color: #01a4fe;
  636. border: 1px solid #01a4fe;
  637. border-radius: 4px;
  638. padding: 2px 6px;
  639. }
  640. }
  641. }
  642. .erweima-style{
  643. position: absolute;
  644. right: 12px;
  645. bottom: 22px;
  646. ::v-deep .icon-erweima{
  647. // font-weight: bold;
  648. color: #999 !important;
  649. }
  650. }
  651. /* 空状态 */
  652. .empty-box {
  653. display: flex;
  654. flex-direction: column;
  655. justify-content: center;
  656. align-items: center;
  657. color: #999;
  658. font-size: 15px;
  659. padding: 20px;
  660. }
  661. </style>