new_file.vue 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804
  1. <template>
  2. <view class="notice-board">
  3. <view class="board-header">
  4. <text class="board-title">人员留观通知</text>
  5. </view>
  6. <!-- 表格容器 -->
  7. <view class="table-container">
  8. <!-- 主要表头 -->
  9. <view class="table-header">
  10. <view class="table-row header-row">
  11. <view class="table-cell cell-id">编号</view>
  12. <view class="table-cell cell-name">姓名</view>
  13. <view class="table-cell cell-time">留观时间</view>
  14. <view class="table-cell cell-status">状态</view>
  15. </view>
  16. </view>
  17. <!-- 特殊状态数据展示区域(固定) -->
  18. <view class="special-status-container" v-if="specialStatusData.length > 0">
  19. <view
  20. class="table-row special-row"
  21. v-for="(item, index) in specialStatusData"
  22. :key="item.id"
  23. :class="{
  24. 'status-completed': item.status === 1,
  25. 'status-left': item.status === 2
  26. }">
  27. <view class="table-cell cell-id">{{ item.id }}</view>
  28. <view class="table-cell cell-name">{{ item.name }}</view>
  29. <view class="table-cell cell-time">{{ formatTime(item.watchTime) }}</view>
  30. <view class="table-cell cell-status">
  31. <view class="status-tag" :class="getStatusClass(item.status)">
  32. {{ getStatusText(item.status) }}
  33. </view>
  34. </view>
  35. </view>
  36. <!-- 分隔线 -->
  37. <view class="divider"></view>
  38. </view>
  39. <!-- 普通数据内容区域 -->
  40. <view
  41. class="table-body"
  42. @touchstart="handleTouchStart"
  43. @touchmove="handleTouchMove"
  44. @touchend="handleTouchEnd">
  45. <view
  46. class="table-row"
  47. v-for="(item, index) in displayNormalData"
  48. :key="item.id"
  49. :class="{
  50. 'row-even': index % 2 === 0,
  51. 'row-odd': index % 2 === 1,
  52. 'buffer-row': index === actualPageSize, // 缓冲行
  53. 'status-watching': item.status === 0
  54. }">
  55. <view class="table-cell cell-id">{{ item.id }}</view>
  56. <view class="table-cell cell-name">{{ item.name }}</view>
  57. <view class="table-cell cell-time">{{ formatTime(item.watchTime) }}</view>
  58. <view class="table-cell cell-status">
  59. <view class="status-tag" :class="getStatusClass(item.status)">
  60. {{ getStatusText(item.status) }}
  61. </view>
  62. </view>
  63. </view>
  64. <!-- 空数据提示 -->
  65. <view v-if="displayNormalData.length === 0 && !loading" class="empty-tip">
  66. 暂无留观人员信息
  67. </view>
  68. </view>
  69. </view>
  70. <!-- 分页控制 -->
  71. <view class="pagination-control">
  72. <view class="page-info">
  73. 第 {{ currentPage }} / {{ totalPages }} 页 (共{{ normalData.length }}人)
  74. </view>
  75. <view class="control-buttons">
  76. <button
  77. class="control-btn"
  78. :disabled="currentPage <= 1"
  79. @click="prevPage">
  80. 上一页
  81. </button>
  82. <label class="auto-scroll-label">
  83. <switch
  84. :checked="autoScroll"
  85. @change="toggleAutoScroll"
  86. color="#007AFF"/>
  87. <text>自动播放</text>
  88. </label>
  89. <button
  90. class="control-btn"
  91. :disabled="currentPage >= totalPages"
  92. @click="nextPage">
  93. 下一页
  94. </button>
  95. </view>
  96. </view>
  97. </view>
  98. </template>
  99. <script>
  100. export default {
  101. data() {
  102. return {
  103. // 所有数据
  104. allData: [],
  105. // 当前页码
  106. currentPage: 1,
  107. // 每页显示条数(自适应计算)
  108. pageSize: 10,
  109. // 是否自动滚动
  110. autoScroll: true,
  111. // 自动滚动定时器
  112. autoScrollTimer: null,
  113. // 滚动间隔时间(毫秒)
  114. scrollInterval: 3000,
  115. // 加载状态
  116. loading: false,
  117. // 窗口高度
  118. windowHeight: 0,
  119. // 触摸相关
  120. touchStartX: 0,
  121. touchStartTime: 0,
  122. isTouching: false,
  123. touchStartY: 0,
  124. // 垂直滑动相关
  125. lastSwipeTime: 0
  126. }
  127. },
  128. computed: {
  129. // 特殊状态数据(状态1和2)
  130. specialStatusData() {
  131. return this.allData.filter(item => item.status === 1 || item.status === 2)
  132. },
  133. // 普通状态数据(状态0)
  134. normalData() {
  135. return this.allData.filter(item => item.status === 0)
  136. },
  137. // 实际显示的条数(减去缓冲行)
  138. actualPageSize() {
  139. return Math.max(1, this.pageSize - 1)
  140. },
  141. // 总页数(基于普通数据计算)
  142. totalPages() {
  143. if (this.actualPageSize <= 0 || this.normalData.length === 0) return 1
  144. return Math.ceil(this.normalData.length / this.actualPageSize)
  145. },
  146. // 显示的普通数据(包含缓冲行)
  147. displayNormalData() {
  148. const start = (this.currentPage - 1) * this.actualPageSize
  149. const end = Math.min(start + this.pageSize, this.normalData.length)
  150. return this.normalData.slice(start, end)
  151. }
  152. },
  153. mounted() {
  154. this.initPage()
  155. this.loadData()
  156. // 在H5平台添加鼠标滚轮支持
  157. //#ifdef H5
  158. this.addMouseWheelSupport()
  159. //#endif
  160. },
  161. beforeDestroy() {
  162. this.stopAutoScroll()
  163. uni.offWindowResize(this.handleWindowResize)
  164. //#ifdef H5
  165. this.removeMouseWheelSupport()
  166. //#endif
  167. },
  168. methods: {
  169. // 初始化页面
  170. initPage() {
  171. this.calculatePageSize()
  172. this.handleWindowResize = this.debounce(this.calculatePageSize, 300)
  173. uni.onWindowResize(this.handleWindowResize)
  174. },
  175. // 计算自适应的页面大小
  176. calculatePageSize() {
  177. try {
  178. // 获取系统信息
  179. const systemInfo = uni.getSystemInfoSync()
  180. this.windowHeight = systemInfo.windowHeight
  181. // 计算可用高度
  182. const headerHeight = uni.upx2px(100) // 头部高度
  183. const paginationHeight = uni.upx2px(120) // 分页区域高度
  184. const tableHeaderHeight = uni.upx2px(80) // 表格头部高度
  185. const specialDataHeight = this.specialStatusData.length > 0 ?
  186. uni.upx2px(80 * this.specialStatusData.length) : 0 // 特殊数据区域高度 + 分隔线
  187. const padding = uni.upx2px(0) // 上下padding
  188. const availableHeight = this.windowHeight - headerHeight - paginationHeight -
  189. tableHeaderHeight - specialDataHeight - padding
  190. // 计算行高(px)- 固定60rpx
  191. const rowHeightPx = uni.upx2px(60)
  192. // 计算可显示的行数
  193. const calculatedPageSize = Math.floor(availableHeight / rowHeightPx)
  194. // 设置页面大小(最少显示4行,最多显示30行)
  195. this.pageSize = Math.max(4, Math.min(30, calculatedPageSize))
  196. // 验证当前页
  197. this.validateCurrentPage()
  198. } catch (error) {
  199. console.error('计算页面大小失败:', error)
  200. this.pageSize = 10 // 默认值
  201. }
  202. },
  203. // 防抖函数
  204. debounce(func, wait) {
  205. let timeout
  206. return function executedFunction(...args) {
  207. const later = () => {
  208. clearTimeout(timeout)
  209. func(...args)
  210. }
  211. clearTimeout(timeout)
  212. timeout = setTimeout(later, wait)
  213. }
  214. },
  215. // 验证当前页是否有效
  216. validateCurrentPage() {
  217. if (this.currentPage > this.totalPages && this.totalPages > 0) {
  218. this.currentPage = this.totalPages
  219. }
  220. if (this.currentPage < 1) {
  221. this.currentPage = 1
  222. }
  223. },
  224. // 加载数据 - 状态1和2只保留一条实例
  225. loadData() {
  226. this.loading = true
  227. try {
  228. // 生成模拟数据
  229. const mockData = []
  230. const names = ['张三', '李四', '王五', '赵六', '钱七', '孙八', '周九', '吴十', '郑一', '王二']
  231. // 生成100条数据
  232. for (let i = 1; i <= 100; i++) {
  233. const randomName = names[Math.floor(Math.random() * names.length)] + i
  234. let status = 0 // 默认状态为0(留观中)
  235. // 特殊处理:只让第10条数据状态为1(完成),第20条数据状态为2(提前离开)
  236. if (i === 10) {
  237. status = 1 // 完成
  238. } else if (i === 20) {
  239. status = 2 // 提前离开
  240. }
  241. // 其他所有数据保持状态0(留观中)
  242. mockData.push({
  243. id: i,
  244. name: randomName,
  245. watchTime: Date.now() - Math.random() * 24 * 60 * 60 * 1000,
  246. status: status // 0=留观中,1=完成,2=提前离开
  247. })
  248. }
  249. this.allData = mockData
  250. console.log('数据加载完成,状态分布:', {
  251. '留观中(0)': this.normalData.length,
  252. '已完成(1)': this.specialStatusData.filter(item => item.status === 1).length,
  253. '提前离开(2)': this.specialStatusData.filter(item => item.status === 2).length
  254. })
  255. // 验证当前页
  256. this.validateCurrentPage()
  257. } catch (error) {
  258. console.error('加载数据失败:', error)
  259. uni.showToast({
  260. title: '数据加载失败',
  261. icon: 'none'
  262. })
  263. } finally {
  264. this.loading = false
  265. }
  266. },
  267. // 格式化时间
  268. formatTime(timestamp) {
  269. if (!timestamp) return ''
  270. const date = new Date(timestamp)
  271. return `${date.getFullYear()}-${String(date.getMonth() + 1).padStart(2, '0')}-${String(date.getDate()).padStart(2, '0')} ${String(date.getHours()).padStart(2, '0')}:${String(date.getMinutes()).padStart(2, '0')}`
  272. },
  273. // 获取状态文本
  274. getStatusText(status) {
  275. switch (status) {
  276. case 0: return '留观中'
  277. case 1: return '已完成'
  278. case 2: return '提前离开'
  279. default: return '未知'
  280. }
  281. },
  282. // 获取状态样式类
  283. getStatusClass(status) {
  284. switch (status) {
  285. case 0: return 'status-watching-tag'
  286. case 1: return 'status-completed-tag'
  287. case 2: return 'status-left-tag'
  288. default: return ''
  289. }
  290. },
  291. // 上一页
  292. prevPage() {
  293. if (this.currentPage > 1) {
  294. this.currentPage--
  295. this.resetAutoScroll()
  296. }
  297. },
  298. // 下一页
  299. nextPage() {
  300. if (this.currentPage < this.totalPages) {
  301. this.currentPage++
  302. this.resetAutoScroll()
  303. }
  304. },
  305. // 触摸开始
  306. handleTouchStart(e) {
  307. this.touchStartX = e.touches[0].clientX
  308. this.touchStartY = e.touches[0].clientY
  309. this.touchStartTime = Date.now()
  310. this.isTouching = true
  311. // 停止自动滚动
  312. if (this.autoScroll) {
  313. this.stopAutoScroll()
  314. }
  315. },
  316. // 触摸移动
  317. handleTouchMove(e) {
  318. if (!this.isTouching) return
  319. },
  320. // 触摸结束
  321. handleTouchEnd(e) {
  322. if (!this.isTouching) return
  323. const touchEndX = e.changedTouches[0].clientX
  324. const touchEndY = e.changedTouches[0].clientY
  325. const touchEndTime = Date.now()
  326. const deltaX = touchEndX - this.touchStartX
  327. const deltaY = touchEndY - this.touchStartY
  328. const deltaTime = touchEndTime - this.touchStartTime
  329. // 防抖:限制滑动切换频率
  330. const now = Date.now()
  331. if (now - this.lastSwipeTime < 300) {
  332. this.isTouching = false
  333. return
  334. }
  335. // 判断滑动方向
  336. const absDeltaX = Math.abs(deltaX)
  337. const absDeltaY = Math.abs(deltaY)
  338. // 水平滑动优先
  339. if (absDeltaX > 50 && absDeltaX > absDeltaY && deltaTime < 500) {
  340. this.lastSwipeTime = now
  341. if (deltaX > 0) {
  342. // 向右滑动 - 上一页
  343. this.prevPage()
  344. } else {
  345. // 向左滑动 - 下一页
  346. this.nextPage()
  347. }
  348. }
  349. // 垂直滑动
  350. else if (absDeltaY > 50 && absDeltaY > absDeltaX && deltaTime < 500) {
  351. this.lastSwipeTime = now
  352. if (deltaY > 0) {
  353. // 向下滑动 - 上一页
  354. this.prevPage()
  355. } else {
  356. // 向上滑动 - 下一页
  357. this.nextPage()
  358. }
  359. }
  360. this.isTouching = false
  361. // 如果开启了自动滚动,重新启动
  362. if (this.autoScroll) {
  363. this.resetAutoScroll()
  364. }
  365. },
  366. // 添加鼠标滚轮支持(仅H5平台)
  367. //#ifdef H5
  368. addMouseWheelSupport() {
  369. const tableBody = document.querySelector('.table-body')
  370. if (tableBody) {
  371. this.wheelHandler = this.debounce((e) => {
  372. e.preventDefault()
  373. const delta = e.wheelDelta || -e.detail
  374. if (delta < 0) {
  375. // 向下滚动 - 下一页
  376. this.nextPage()
  377. } else {
  378. // 向上滚动 - 上一页
  379. this.prevPage()
  380. }
  381. }, 150)
  382. tableBody.addEventListener('mousewheel', this.wheelHandler, { passive: false })
  383. tableBody.addEventListener('DOMMouseScroll', this.wheelHandler, { passive: false })
  384. }
  385. },
  386. // 移除鼠标滚轮支持
  387. removeMouseWheelSupport() {
  388. const tableBody = document.querySelector('.table-body')
  389. if (tableBody && this.wheelHandler) {
  390. tableBody.removeEventListener('mousewheel', this.wheelHandler)
  391. tableBody.removeEventListener('DOMMouseScroll', this.wheelHandler)
  392. }
  393. },
  394. //#endif
  395. // 切换自动滚动
  396. toggleAutoScroll(e) {
  397. this.autoScroll = e.detail.value
  398. if (this.autoScroll) {
  399. this.startAutoScroll()
  400. } else {
  401. this.stopAutoScroll()
  402. }
  403. },
  404. // 开始自动滚动
  405. startAutoScroll() {
  406. this.stopAutoScroll()
  407. if (this.autoScroll && this.normalData.length > 0 && this.totalPages > 1) {
  408. this.autoScrollTimer = setInterval(() => {
  409. if (this.currentPage < this.totalPages) {
  410. this.currentPage++
  411. } else {
  412. this.currentPage = 1 // 回到第一页
  413. }
  414. }, this.scrollInterval)
  415. }
  416. },
  417. // 停止自动滚动
  418. stopAutoScroll() {
  419. if (this.autoScrollTimer) {
  420. clearInterval(this.autoScrollTimer)
  421. this.autoScrollTimer = null
  422. }
  423. },
  424. // 重置自动滚动(手动操作后)
  425. resetAutoScroll() {
  426. if (this.autoScroll) {
  427. this.stopAutoScroll()
  428. setTimeout(() => {
  429. this.startAutoScroll()
  430. }, this.scrollInterval)
  431. }
  432. }
  433. },
  434. watch: {
  435. // 监听数据变化
  436. allData: {
  437. handler() {
  438. this.$nextTick(() => {
  439. this.validateCurrentPage()
  440. if (this.autoScroll) {
  441. this.startAutoScroll()
  442. }
  443. })
  444. },
  445. immediate: true
  446. },
  447. // 监听页面大小变化
  448. pageSize() {
  449. this.validateCurrentPage()
  450. },
  451. // 监听特殊状态数据变化
  452. specialStatusData() {
  453. // 特殊状态数据变化时重新计算页面大小
  454. this.$nextTick(() => {
  455. this.calculatePageSize()
  456. })
  457. }
  458. }
  459. }
  460. </script>
  461. <style scoped>
  462. .notice-board {
  463. width: 100%;
  464. height: 100vh;
  465. display: flex;
  466. flex-direction: column;
  467. background-color: #f0f2f5;
  468. padding: 20rpx;
  469. box-sizing: border-box;
  470. }
  471. .board-header {
  472. text-align: center;
  473. margin-bottom: 20rpx;
  474. flex-shrink: 0;
  475. }
  476. .board-title {
  477. font-size: 36rpx;
  478. font-weight: bold;
  479. color: #333;
  480. }
  481. .table-container {
  482. flex: 1;
  483. background-color: #fff;
  484. border-radius: 16rpx;
  485. box-shadow: 0 4rpx 20rpx rgba(0, 0, 0, 0.1);
  486. overflow: hidden;
  487. display: flex;
  488. flex-direction: column;
  489. }
  490. .table-header {
  491. background: linear-gradient(135deg, #007AFF, #0066CC);
  492. color: #fff;
  493. flex-shrink: 0;
  494. }
  495. .table-row {
  496. display: flex;
  497. flex-direction: row;
  498. min-height: 60rpx; /* 控制行高为60rpx */
  499. line-height: 60rpx;
  500. border-bottom: 1rpx solid #eee;
  501. transition: all 0.2s ease;
  502. }
  503. .header-row {
  504. font-weight: bold;
  505. }
  506. .table-cell {
  507. flex: 1;
  508. padding: 0 15rpx;
  509. font-size: 24rpx;
  510. overflow: hidden;
  511. text-overflow: ellipsis;
  512. white-space: nowrap;
  513. display: flex;
  514. align-items: center;
  515. }
  516. .cell-id {
  517. flex: 0.5;
  518. text-align: center;
  519. justify-content: center;
  520. }
  521. .cell-name {
  522. flex: 1.5;
  523. }
  524. .cell-time {
  525. flex: 2;
  526. }
  527. .cell-status {
  528. flex: 1;
  529. text-align: center;
  530. justify-content: center;
  531. }
  532. /* 特殊状态数据容器 */
  533. .special-status-container {
  534. background-color: #fff8e6;
  535. }
  536. .special-row {
  537. background-color: #fff8e6 !important;
  538. min-height: 60rpx;
  539. line-height: 60rpx;
  540. }
  541. /* 分隔线 */
  542. .divider {
  543. height: 1rpx;
  544. background-color: #ddd;
  545. }
  546. /* 普通数据内容区域 */
  547. .table-body {
  548. flex: 1;
  549. overflow-y: auto;
  550. /* 添加触摸反馈 */
  551. -webkit-overflow-scrolling: touch;
  552. touch-action: pan-y;
  553. }
  554. .row-even {
  555. background-color: #fff;
  556. }
  557. .row-odd {
  558. background-color: #fafafa;
  559. }
  560. /* 状态行样式 */
  561. .status-watching {
  562. background-color: #e6f7ff !important;
  563. border-left: 4rpx solid #1890ff;
  564. }
  565. .status-completed {
  566. background-color: #f6ffed !important;
  567. border-left: 4rpx solid #52c41a;
  568. }
  569. .status-left {
  570. background-color: #fff2e8 !important;
  571. border-left: 4rpx solid #fa8c16;
  572. }
  573. /* 缓冲行样式 */
  574. .buffer-row {
  575. background-color: #f0f0f0 !important;
  576. opacity: 0.6;
  577. }
  578. /* 状态标签样式 - 控制高度不超过40rpx */
  579. .status-tag {
  580. padding: 4rpx 12rpx;
  581. border-radius: 20rpx;
  582. font-size: 20rpx;
  583. font-weight: normal;
  584. line-height: 32rpx;
  585. height: 40rpx;
  586. display: inline-flex;
  587. align-items: center;
  588. justify-content: center;
  589. min-width: 100rpx;
  590. }
  591. .status-watching-tag {
  592. background-color: #e6f7ff;
  593. color: #1890ff;
  594. border: 1rpx solid #91d5ff;
  595. }
  596. .status-completed-tag {
  597. background-color: #f6ffed;
  598. color: #52c41a;
  599. border: 1rpx solid #b7eb8f;
  600. }
  601. .status-left-tag {
  602. background-color: #fff2e8;
  603. color: #fa8c16;
  604. border: 1rpx solid #ffbb96;
  605. }
  606. .empty-tip {
  607. text-align: center;
  608. padding: 80rpx;
  609. color: #999;
  610. font-size: 28rpx;
  611. }
  612. /* 分页控制 */
  613. .pagination-control {
  614. display: flex;
  615. flex-direction: column;
  616. align-items: center;
  617. margin: 20rpx 0;
  618. padding: 0 20rpx;
  619. flex-shrink: 0;
  620. background-color: #fff;
  621. border-radius: 12rpx;
  622. padding: 20rpx;
  623. box-shadow: 0 2rpx 10rpx rgba(0, 0, 0, 0.1);
  624. }
  625. .page-info {
  626. font-size: 24rpx;
  627. color: #666;
  628. margin-bottom: 20rpx;
  629. }
  630. .control-buttons {
  631. display: flex;
  632. flex-direction: row;
  633. justify-content: space-between;
  634. align-items: center;
  635. width: 100%;
  636. }
  637. .control-btn {
  638. flex: 1;
  639. height: 60rpx;
  640. line-height: 60rpx;
  641. font-size: 24rpx;
  642. background: linear-gradient(135deg, #007AFF, #0066CC);
  643. color: #fff;
  644. border: none;
  645. border-radius: 10rpx;
  646. margin: 0 10rpx;
  647. }
  648. .control-btn[disabled] {
  649. background: #ccc;
  650. opacity: 0.6;
  651. }
  652. .auto-scroll-label {
  653. display: flex;
  654. flex-direction: row;
  655. align-items: center;
  656. justify-content: center;
  657. font-size: 24rpx;
  658. color: #666;
  659. flex: 1;
  660. }
  661. .auto-scroll-label text {
  662. margin-left: 10rpx;
  663. }
  664. /* 响应式优化 */
  665. @media screen and (max-height: 600px) {
  666. .table-row {
  667. min-height: 50rpx;
  668. line-height: 50rpx;
  669. }
  670. .table-cell {
  671. font-size: 22rpx;
  672. padding: 0 10rpx;
  673. }
  674. .status-tag {
  675. padding: 2rpx 10rpx;
  676. font-size: 18rpx;
  677. line-height: 28rpx;
  678. height: 32rpx;
  679. min-width: 80rpx;
  680. }
  681. .control-btn {
  682. height: 50rpx;
  683. line-height: 50rpx;
  684. font-size: 22rpx;
  685. }
  686. }
  687. /* 滚动条样式 */
  688. .table-body::-webkit-scrollbar {
  689. width: 4rpx;
  690. }
  691. .table-body::-webkit-scrollbar-track {
  692. background: #f1f1f1;
  693. border-radius: 6rpx;
  694. }
  695. .table-body::-webkit-scrollbar-thumb {
  696. background: #c1c1c1;
  697. border-radius: 6rpx;
  698. }
  699. .table-body::-webkit-scrollbar-thumb:hover {
  700. background: #a8a8a8;
  701. }
  702. </style>