stat.vue 20 KB

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