stat.vue 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939
  1. <template>
  2. <view>
  3. <view class="container">
  4. <view class="placeholder"></view>
  5. <!-- 顶部分段器区域 -->
  6. <view class="control" v-if="flag">
  7. <uni-segmented-control :current="current" :values="items" styleType="text" @clickItem="onClickItem" activeColor="#0082FC"></uni-segmented-control>
  8. </view>
  9. <!-- 头部月份区域 -->
  10. <view class="header">
  11. <view class="title">
  12. <view class="month">{{ month }}月汇总</view>
  13. <view class="right" @click="goToDetail"><img src="../../static/imgs/right.png" alt="" /></view>
  14. </view>
  15. <view class="state">
  16. <view class="err">
  17. <view class="number">{{ fail_count }}</view>
  18. <view class="mes">异常次数(次)</view>
  19. </view>
  20. <view class="success">
  21. <view class="number">{{ success_count }}</view>
  22. <view class="mes">打卡成功(次)</view>
  23. </view>
  24. </view>
  25. </view>
  26. <!-- 日历区域 -->
  27. <view class="calendar">
  28. <view class="calendar_title">
  29. 每日记录
  30. <span>({{ month }}月)</span>
  31. </view>
  32. <view class="calendar_body"><uni-calendar :showMonth="false" @change="change" :selected="selectList" /></view>
  33. <view class="calendar_foot" v-if="current == 1">
  34. <!-- 每一条记录区域 -->
  35. <view class="foot_item" v-for="(item, index) in list2" :key="index">
  36. <view>规则:{{ item.ruleName }} {{ item.timeRange }}</view>
  37. <view class="box">
  38. <view class="circular" v-if="item.status == 4"></view>
  39. <view class="circular color" v-else></view>
  40. <view v-if="item.status == 1">未开始</view>
  41. <view v-if="item.status == 2">已开始</view>
  42. <view v-if="item.status == 3">已超时</view>
  43. <view v-if="item.status == 4">已打卡</view>
  44. <span v-if="item.status == 4">{{ format_time(item.updateTime) }}</span>
  45. </view>
  46. </view>
  47. </view>
  48. <!-- 环形图区域 -->
  49. <view class="progress" v-if="current == 0">
  50. <view class="chart"><progressBar v-if="showBar" :value="progress_proportion" :progress_txt="progress_txt" :progress_total="progress_total" /></view>
  51. <view class="look" @click="handleLookDetail">
  52. <view class="info">查看明细</view>
  53. <img src="../../static/imgs/right.png" />
  54. </view>
  55. </view>
  56. </view>
  57. <!-- 异常人员名单区域 -->
  58. <view class="errPeople" v-if="current == 0">
  59. <!-- 标题区域 -->
  60. <view class="e_header">
  61. <view class="left">异常人员名单</view>
  62. <view class="right">
  63. <view class="icon" @click="handleInform"><img src="../../static/imgs/notice.png" /></view>
  64. <view class="info" @click="handleInform">通知</view>
  65. </view>
  66. </view>
  67. <!-- 选择时间区域 -->
  68. <view class="e_calendar">
  69. <!-- 双左箭头区域 -->
  70. <view class="double" @click="handleDoubleLeft"><img src="../../static/imgs/double_left.png" /></view>
  71. <!-- 左箭头区域区域 -->
  72. <view class="single" @click="handleLeft"><img src="../../static/imgs/left.png" /></view>
  73. <!-- 时间区域 -->
  74. <view class="time">{{ year }}-{{ comMonth }}</view>
  75. <!-- 双右箭头区域 -->
  76. <view class="single2" @click="handleRight"><img src="../../static/imgs/right2.png" /></view>
  77. <!-- 右箭头区域 -->
  78. <view class="double" @click="handleDoubleRight"><img src="../../static/imgs/double_right.png" /></view>
  79. </view>
  80. <view class="e_list" v-if="errList.length">
  81. <view class="e_box" v-for="item in errList" :key="item.userId">
  82. <view class="e_img"><img :src="item.headImage || '../../static/imgs/headImage.png'" /></view>
  83. <view class="e_name">{{ item.name }}</view>
  84. <view class="e_msg">未打卡{{ item.times }}次</view>
  85. </view>
  86. </view>
  87. <view class="e_list2" v-else>
  88. <img src="../../static/imgs/nodata.png" />
  89. <view class="info">暂无数据</view>
  90. </view>
  91. </view>
  92. </view>
  93. <!-- 底部导航栏区域 -->
  94. <cover-view class="tab_bar" v-if="showTabBar">
  95. <cover-view class="tab_box" @click="handleGoPage('/pages/home/home')">
  96. <cover-image class="tab_img" v-if="pageUrl == 'pages/home/home'" src="../../static/imgs/home_active.png"></cover-image>
  97. <cover-image class="tab_img" v-else src="../../static/imgs/home.png"></cover-image>
  98. <cover-view v-if="pageUrl == 'pages/home/home'" class="tab_title_active">首页</cover-view>
  99. <cover-view v-else class="tab_title">首页</cover-view>
  100. </cover-view>
  101. <cover-view class="tab_box" @click="handleGoPage('/pages/stat/stat')">
  102. <cover-image class="tab_img" v-if="pageUrl == 'pages/stat/stat'" src="../../static/imgs/stat_active.png"></cover-image>
  103. <cover-image class="tab_img" v-else src="../../static/imgs/stat.png"></cover-image>
  104. <cover-view v-if="pageUrl == 'pages/stat/stat'" class="tab_title_active">统计</cover-view>
  105. <cover-view v-else class="tab_title">统计</cover-view>
  106. </cover-view>
  107. <cover-view v-if="flag" class="tab_box" @click="handleGoPage('/pages/my/my')">
  108. <cover-image class="tab_img" v-if="pageUrl == 'pages/my/my'" src="../../static/imgs/my_active.png"></cover-image>
  109. <cover-image class="tab_img" v-else src="../../static/imgs/my.png"></cover-image>
  110. <cover-view v-if="pageUrl == 'pages/my/my'" class="tab_title_active">我的</cover-view>
  111. <cover-view v-else class="tab_title">我的</cover-view>
  112. </cover-view>
  113. </cover-view>
  114. </view>
  115. </template>
  116. <script>
  117. import progressBar from '../../components/progress/progress.vue'
  118. export default {
  119. components: {
  120. progressBar
  121. },
  122. data() {
  123. return {
  124. // 是否为管理员或子管理员标识
  125. flag: false,
  126. // 有标记点的数组日期
  127. selectList: [
  128. // {
  129. // date: "2022-12-20",
  130. // info: '打卡'
  131. // },
  132. // {
  133. // date: "2022-12-21",
  134. // info: '未打卡',
  135. // data: {
  136. // custom: '自定义信息',
  137. // name: '自定义消息头'
  138. // }
  139. // }
  140. ],
  141. // 个人考勤规则列表
  142. list2: [],
  143. // 分段器数组
  144. items: ['团队统计', '我的统计'],
  145. // 分段器默认索引
  146. current: 1,
  147. // 当前年份
  148. year: null,
  149. // 当前月份
  150. month: null,
  151. // 当前天数
  152. day: null,
  153. // 异常人员名单数组
  154. errList: [],
  155. // 环形图完成数量
  156. progress_txt: 2,
  157. // 环形图总数
  158. progress_total: 10,
  159. // 当前时间
  160. nowTime: '',
  161. // 打卡异常次数
  162. fail_count: 0,
  163. // 打卡成功次数
  164. success_count: 0,
  165. // 异常人员名单当前页
  166. page: 1,
  167. // 异常人员名单总条数
  168. total: 0,
  169. // 环形图显示隐藏控制
  170. showBar: false,
  171. // 当前页面的路由地址
  172. pageUrl: '',
  173. showTabBar: true,
  174. timer: null,
  175. timer2: null,
  176. currentYear: ''
  177. }
  178. },
  179. onLoad() {
  180. this.getTime()
  181. },
  182. onShow() {
  183. this.getPageUrl()
  184. let flag = uni.getStorageSync('manager')
  185. let flag2 = uni.getStorageSync('sub-administrator')
  186. if (flag || flag2) {
  187. this.flag = true
  188. } else {
  189. this.flag = false
  190. }
  191. if (this.flag) {
  192. this.current = 0
  193. this.errList = []
  194. this.getMonthTimes_team()
  195. this.getProportion()
  196. this.getErrList()
  197. } else {
  198. this.current = 1
  199. this.getMonthTimes()
  200. this.getRulesList()
  201. }
  202. },
  203. computed: {
  204. comMonth() {
  205. if (this.month) {
  206. let month = this.month < 10 ? '0' + this.month : this.month
  207. return month
  208. }
  209. },
  210. progress_proportion() {
  211. if (this.progress_total == 0) {
  212. return 0
  213. } else {
  214. return (this.progress_txt / this.progress_total) * 100
  215. }
  216. }
  217. },
  218. watch: {
  219. progress_txt() {
  220. this.showBar = false
  221. setTimeout(() => {
  222. this.showBar = true
  223. }, 10)
  224. },
  225. progress_total() {
  226. this.showBar = false
  227. setTimeout(() => {
  228. this.showBar = true
  229. }, 10)
  230. }
  231. },
  232. // 页面拉到底部触发函数
  233. onReachBottom() {
  234. if (this.current == 0) {
  235. if (this.errList.length < this.total) {
  236. this.page++
  237. this.getErrList()
  238. } else {
  239. uni.showToast({
  240. title: '没有更多数据了',
  241. icon: 'none'
  242. })
  243. }
  244. }
  245. },
  246. onPageScroll(value) {
  247. if (this.timer) {
  248. clearInterval(this.timer)
  249. }
  250. this.timer = setTimeout(() => {
  251. this.showTabBar = false
  252. this.showTabBar = true
  253. this.timer = null
  254. }, 500)
  255. },
  256. methods: {
  257. getPageUrl() {
  258. // 获取当前打开过的页面路由数组
  259. let routes = getCurrentPages()
  260. // 获取当前页面路由,也就是最后一个打开的页面路由
  261. let curRoute = routes[routes.length - 1].route
  262. this.pageUrl = curRoute
  263. },
  264. handleGoPage(url) {
  265. // console.log(url);
  266. uni.redirectTo({
  267. url
  268. })
  269. },
  270. // 获取当前年 月 日
  271. getTime() {
  272. let date = new Date()
  273. let year = date.getFullYear()
  274. let month = date.getMonth() + 1
  275. let day = date.getDate() < 10 ? '0' + date.getDate() : date.getDate()
  276. this.year = year
  277. this.month = month
  278. this.day = day
  279. this.nowTime = year + '-' + this.comMonth + '-' + day + ' ' + '00:00:00'
  280. this.currentYear = year
  281. },
  282. // 获取我的月打卡次数
  283. async getMonthTimes() {
  284. let res = await this.$myRequest_clockIn({
  285. url: '/attendance/api/sign/check/in/month/times',
  286. data: {
  287. time: this.nowTime
  288. }
  289. })
  290. // console.log(res);
  291. if (res.code == 200) {
  292. this.fail_count = res.data.fail
  293. this.success_count = res.data.success
  294. }
  295. },
  296. // 获取我的团队月打卡次数
  297. async getMonthTimes_team() {
  298. let res = await this.$myRequest_clockIn({
  299. url: '/attendance/api/sign/check/in/month/times/team',
  300. data: {
  301. time: this.nowTime
  302. }
  303. })
  304. // console.log(res);
  305. if (res.code == 200) {
  306. this.fail_count = res.data.fail
  307. this.success_count = res.data.success
  308. }
  309. },
  310. // 获取团队打卡每日完成占比
  311. async getProportion() {
  312. let res = await this.$myRequest_clockIn({
  313. url: '/attendance/api/sign/check/in/proportion',
  314. data: {
  315. time: this.nowTime
  316. }
  317. })
  318. // console.log(res);
  319. if (res.code == 200) {
  320. this.progress_txt = res.data.complete
  321. this.progress_total = res.data.total
  322. }
  323. },
  324. // 获取打卡异常人员名单
  325. async getErrList() {
  326. let res = await this.$myRequest_clockIn({
  327. url: '/attendance/api/sign/check/in/abnormal',
  328. data: {
  329. time: this.nowTime,
  330. page: this.page,
  331. size: 9
  332. }
  333. })
  334. // console.log(res);
  335. if (res.code == 200) {
  336. this.total = res.data.total
  337. this.errList = [...this.errList, ...res.data.list]
  338. }
  339. },
  340. // 获取打卡规则列表
  341. async getRulesList() {
  342. // let name = uni.getStorageSync("userInfo").username
  343. let res = await this.$myRequest_clockIn({
  344. url: '/attendance/api/sign/check/in/list/day',
  345. data: {
  346. // page: this.page_my,
  347. time: this.nowTime
  348. }
  349. })
  350. // console.log(res);
  351. if (res.code == 200) {
  352. // this.list2 = [...this.list2, ...res.data]
  353. this.list2 = res.data
  354. // this.total_my = res.data.total
  355. }
  356. },
  357. // 点击日历日期回调
  358. change(e) {
  359. // console.log('change 返回:', e.fulldate)
  360. if (this.timer2) {
  361. clearTimeout(this.timer2)
  362. }
  363. this.timer2 = setTimeout(() => {
  364. this.nowTime = e.fulldate + ' ' + '00:00:00'
  365. if (this.current == 0) {
  366. this.getProportion()
  367. } else {
  368. this.getRulesList()
  369. }
  370. this.timer2 = null
  371. }, 100)
  372. },
  373. // 分段器点击回调
  374. onClickItem(e) {
  375. this.fail_count = ''
  376. this.success_count = ''
  377. // this.list2 = []
  378. this.errList = []
  379. this.page = 1
  380. // console.log(e.currentIndex);
  381. this.current = e.currentIndex
  382. if (e.currentIndex == 0) {
  383. this.getMonthTimes_team()
  384. this.getProportion()
  385. this.getErrList()
  386. } else {
  387. this.getMonthTimes()
  388. this.getRulesList()
  389. }
  390. },
  391. // 点击通知回调
  392. handleInform() {
  393. if (this.total > 0) {
  394. uni.showModal({
  395. title: '提示',
  396. content: `当前列表中有 ${this.total} 位异常人员,确定需要全部通知吗?`,
  397. success: async res => {
  398. if (res.confirm) {
  399. let data = JSON.stringify(this.nowTime)
  400. let res = await this.$myRequest_clockIn({
  401. url: '/attendance/api/sign/check/in/abnormal/notify/app',
  402. method: 'post',
  403. data,
  404. header: {
  405. 'content-type': 'application/json'
  406. }
  407. })
  408. // console.log(res);
  409. if (res.code == 200) {
  410. uni.showToast({
  411. title: '通知成功'
  412. })
  413. }
  414. }
  415. }
  416. })
  417. } else {
  418. uni.showToast({
  419. title: '当前异常人员名单为空,无法通知',
  420. icon: 'none'
  421. })
  422. }
  423. },
  424. // 点击查看明细回调
  425. handleLookDetail() {
  426. // console.log(this.nowTime);
  427. uni.navigateTo({
  428. url: `/pages/particulars/particulars?nowTime_day=${this.nowTime}&type=1`
  429. })
  430. },
  431. // 跳转统计详情页面
  432. goToDetail() {
  433. if (this.current == 1) {
  434. uni.navigateTo({
  435. url: `/pages/statDetail/statDetail`
  436. })
  437. } else {
  438. uni.navigateTo({
  439. url: '/pages/particulars/particulars?type=2'
  440. })
  441. }
  442. },
  443. // 往后选择年份回调
  444. handleDoubleLeft() {
  445. if (this.year <= this.currentYear - 3) {
  446. uni.showToast({
  447. title: `不能选择${this.currentYear - 3}年之前`,
  448. icon: 'none'
  449. })
  450. } else {
  451. this.year -= 1
  452. this.nowTime = this.year + '-' + this.comMonth + '-' + this.day + ' ' + '00:00:00'
  453. this.page = 1
  454. this.errList = []
  455. this.getErrList()
  456. }
  457. },
  458. // 往前选择年份回调
  459. handleDoubleRight() {
  460. if (this.year >= this.currentYear - 0 + 3) {
  461. uni.showToast({
  462. title: `不能选择${this.currentYear - 0 + 3}年之后`,
  463. icon: 'none'
  464. })
  465. } else {
  466. this.year += 1
  467. this.nowTime = this.year + '-' + this.comMonth + '-' + this.day + ' ' + '00:00:00'
  468. this.page = 1
  469. this.errList = []
  470. this.getErrList()
  471. }
  472. },
  473. // 往后选择月份回调
  474. handleLeft() {
  475. if (this.month <= 1) {
  476. if (this.year <= this.currentYear - 3) {
  477. uni.showToast({
  478. title: `不能选择${this.currentYear - 3}年之前`,
  479. icon: 'none'
  480. })
  481. } else {
  482. this.year -= 1
  483. this.month = 12
  484. this.nowTime = this.year + '-' + this.comMonth + '-' + this.day + ' ' + '00:00:00'
  485. this.page = 1
  486. this.errList = []
  487. this.getErrList()
  488. }
  489. } else {
  490. this.month -= 1
  491. this.nowTime = this.year + '-' + this.comMonth + '-' + this.day + ' ' + '00:00:00'
  492. this.page = 1
  493. this.errList = []
  494. this.getErrList()
  495. }
  496. },
  497. // 往前选择月份回调
  498. handleRight() {
  499. if (this.month >= 12) {
  500. if (this.year >= this.currentYear - 0 + 3) {
  501. uni.showToast({
  502. title: `不能选择${this.currentYear - 0 + 3}年之后`,
  503. icon: 'none'
  504. })
  505. } else {
  506. this.year += 1
  507. this.month = 1
  508. this.nowTime = this.year + '-' + this.comMonth + '-' + this.day + ' ' + '00:00:00'
  509. this.page = 1
  510. this.errList = []
  511. this.getErrList()
  512. }
  513. } else {
  514. this.month += 1
  515. this.nowTime = this.year + '-' + this.comMonth + '-' + this.day + ' ' + '00:00:00'
  516. this.page = 1
  517. this.errList = []
  518. this.getErrList()
  519. }
  520. },
  521. // 格式化时间
  522. format_time(timestamp) {
  523. //时间戳为10位需*1000,时间戳为13位的话不需乘1000
  524. var date = new Date(timestamp)
  525. var h = (date.getHours() < 10 ? '0' + date.getHours() : date.getHours()) + ':'
  526. var m = date.getMinutes() < 10 ? '0' + date.getMinutes() : date.getMinutes()
  527. let strDate = h + m
  528. return strDate
  529. }
  530. }
  531. }
  532. </script>
  533. <style lang="scss" scoped>
  534. .container {
  535. width: 100vw;
  536. height: calc(100vh - 128rpx);
  537. // overflow-y: auto;
  538. background-color: #f2f2f2;
  539. .placeholder {
  540. height: 20rpx;
  541. }
  542. .control {
  543. margin-bottom: 20rpx;
  544. width: 750rpx;
  545. height: 90rpx;
  546. background-color: #fff;
  547. }
  548. .header {
  549. margin: 0 auto;
  550. width: 710rpx;
  551. height: 236rpx;
  552. background-color: #fff;
  553. .title {
  554. display: flex;
  555. height: 92rpx;
  556. .month {
  557. flex: 8;
  558. margin: 30rpx 0 0 30rpx;
  559. font-size: 32rpx;
  560. font-weight: 500;
  561. }
  562. .right {
  563. display: flex;
  564. justify-content: center;
  565. align-items: center;
  566. flex: 1;
  567. img {
  568. width: 15rpx;
  569. height: 30rpx;
  570. }
  571. }
  572. }
  573. .state {
  574. display: flex;
  575. height: 144rpx;
  576. .err {
  577. flex: 1;
  578. display: flex;
  579. flex-direction: column;
  580. justify-content: center;
  581. align-items: center;
  582. .number {
  583. font-size: 46rpx;
  584. font-weight: 700;
  585. }
  586. .mes {
  587. font-size: 28rpx;
  588. color: #999999;
  589. }
  590. }
  591. .success {
  592. flex: 1;
  593. display: flex;
  594. flex-direction: column;
  595. justify-content: center;
  596. align-items: center;
  597. .number {
  598. font-size: 46rpx;
  599. font-weight: 700;
  600. }
  601. .mes {
  602. font-size: 28rpx;
  603. color: #999999;
  604. }
  605. }
  606. }
  607. }
  608. .calendar {
  609. margin: 0 auto;
  610. margin-top: 30rpx;
  611. width: 710rpx;
  612. background-color: #fff;
  613. .calendar_title {
  614. padding-left: 30rpx;
  615. height: 100rpx;
  616. line-height: 100rpx;
  617. font-size: 32rpx;
  618. font-weight: 500;
  619. span {
  620. font-size: 26rpx;
  621. color: #999999;
  622. }
  623. }
  624. .calendar_body {
  625. height: 690rpx;
  626. }
  627. .calendar_foot {
  628. padding: 100rpx 30rpx 150rpx;
  629. // padding-bottom: 150rpx;
  630. .foot_item {
  631. box-sizing: border-box;
  632. padding: 30rpx;
  633. display: flex;
  634. flex-direction: column;
  635. justify-content: space-evenly;
  636. height: 130rpx;
  637. font-size: 24rpx;
  638. color: #808080;
  639. .box {
  640. display: flex;
  641. align-items: center;
  642. .circular {
  643. margin-right: 18rpx;
  644. width: 12rpx;
  645. height: 12rpx;
  646. border-radius: 6rpx;
  647. background-color: #31c20e;
  648. }
  649. .color {
  650. background-color: #999999;
  651. }
  652. span {
  653. margin-left: 18rpx;
  654. }
  655. }
  656. }
  657. }
  658. .progress {
  659. position: relative;
  660. display: flex;
  661. justify-content: center;
  662. padding: 0 30rpx;
  663. height: 121px;
  664. background-color: #fff;
  665. .chart {
  666. margin-top: 20rpx;
  667. width: 170px;
  668. height: 100%;
  669. }
  670. .look {
  671. position: absolute;
  672. top: 40rpx;
  673. right: 36rpx;
  674. display: flex;
  675. align-items: center;
  676. width: 150rpx;
  677. height: 42rpx;
  678. .info {
  679. margin-right: 15rpx;
  680. font-size: 28rpx;
  681. color: #a6a6a6;
  682. }
  683. img {
  684. width: 16rpx;
  685. height: 24rpx;
  686. }
  687. }
  688. }
  689. }
  690. .errPeople {
  691. margin: 0 auto;
  692. margin-top: 32rpx;
  693. width: 710rpx;
  694. border-radius: 7rpx;
  695. background-color: #fff;
  696. .e_header {
  697. display: flex;
  698. align-items: center;
  699. width: 690rpx;
  700. height: 121rpx;
  701. .left {
  702. flex: 1;
  703. margin-left: 30rpx;
  704. font-size: 32rpx;
  705. font-weight: 500;
  706. }
  707. .right {
  708. flex: 1;
  709. display: flex;
  710. justify-content: flex-end;
  711. align-items: center;
  712. margin-right: 32rpx;
  713. .icon {
  714. margin-right: 10rpx;
  715. width: 26rpx;
  716. height: 26rpx;
  717. line-height: 26rpx;
  718. img {
  719. width: 100%;
  720. height: 100%;
  721. }
  722. }
  723. .info {
  724. width: 56rpx;
  725. height: 41rpx;
  726. font-size: 28rpx;
  727. color: #2a82e4;
  728. }
  729. }
  730. }
  731. .e_calendar {
  732. display: flex;
  733. justify-content: flex-end;
  734. align-items: center;
  735. .double {
  736. margin-right: 30rpx;
  737. width: 40rpx;
  738. height: 40rpx;
  739. img {
  740. width: 100%;
  741. height: 100%;
  742. }
  743. }
  744. .single {
  745. width: 40rpx;
  746. height: 40rpx;
  747. img {
  748. width: 80%;
  749. height: 70%;
  750. }
  751. }
  752. .single2 {
  753. margin-right: 30rpx;
  754. width: 40rpx;
  755. height: 40rpx;
  756. img {
  757. width: 100%;
  758. height: 70%;
  759. }
  760. }
  761. .time {
  762. width: 180rpx;
  763. height: 44rpx;
  764. font-size: 32rpx;
  765. text-align: center;
  766. }
  767. }
  768. .e_list {
  769. display: flex;
  770. flex-wrap: wrap;
  771. justify-content: space-evenly;
  772. align-items: center;
  773. margin-top: 20rpx;
  774. padding: 30rpx;
  775. padding-bottom: 150rpx;
  776. width: 630rpx;
  777. .e_box {
  778. display: flex;
  779. flex-direction: column;
  780. justify-content: space-evenly;
  781. align-items: center;
  782. margin-bottom: 20rpx;
  783. width: 180rpx;
  784. height: 190rpx;
  785. .e_img {
  786. width: 100rpx;
  787. height: 100rpx;
  788. img {
  789. width: 100%;
  790. height: 100%;
  791. border-radius: 50%;
  792. }
  793. }
  794. .e_name {
  795. width: 180rpx;
  796. text-align: center;
  797. font-size: 28rpx;
  798. overflow: hidden;
  799. white-space: nowrap;
  800. text-overflow: ellipsis;
  801. }
  802. .e_msg {
  803. font-size: 24rpx;
  804. color: #808080;
  805. }
  806. }
  807. }
  808. .e_list2 {
  809. margin: 0 auto;
  810. padding: 180rpx 0;
  811. text-align: center;
  812. img {
  813. width: 480rpx;
  814. height: 508rpx;
  815. }
  816. .info {
  817. padding-bottom: 50rpx;
  818. color: #5792f0;
  819. }
  820. }
  821. }
  822. }
  823. .tab_bar {
  824. z-index: 9999;
  825. position: fixed;
  826. left: 0;
  827. bottom: 0;
  828. display: flex;
  829. width: 750rpx;
  830. height: 128rpx;
  831. border-top: 1rpx solid #ccc;
  832. background-color: #fff;
  833. .tab_box {
  834. flex: 1;
  835. display: flex;
  836. flex-direction: column;
  837. justify-content: center;
  838. align-items: center;
  839. .tab_img {
  840. width: 54rpx;
  841. height: 48rpx;
  842. margin-bottom: 10rpx;
  843. }
  844. .tab_title {
  845. font-size: 20rpx;
  846. }
  847. .tab_title_active {
  848. font-size: 20rpx;
  849. color: #0082fc;
  850. }
  851. }
  852. }
  853. // 修改选中日期盒子圆角
  854. ::v-deep .uni-calendar-item--isDay {
  855. border-radius: 50rpx;
  856. }
  857. ::v-deep .uni-calendar-item--checked {
  858. border-radius: 50rpx;
  859. }
  860. </style>