index.vue 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  1. <template>
  2. <view class="page-no-tab">
  3. <uni-nav-bar
  4. fixed="true"
  5. statusBar="true"
  6. left-icon="back"
  7. title="假期余额"
  8. background-color="#157A2C"
  9. color="#fff"
  10. @clickLeft="back"
  11. ></uni-nav-bar>
  12. <view class="leave-hero">
  13. <text>2026年度假期</text>
  14. <text>余额更新至今天 14:30</text>
  15. </view>
  16. <view class="leave-grid">
  17. <view v-for="item in leaves" :key="item.name" class="leave-card card">
  18. <view class="circle" :style="{ borderColor: item.color, color: item.color }">
  19. <text>{{ item.left }}</text><small>{{ item.unit }}</small>
  20. </view>
  21. <text class="leave-name">{{ item.name }}</text>
  22. <text class="leave-used">已用 {{ item.used }}{{ item.unit }}</text>
  23. </view>
  24. </view>
  25. <view class="rule card section">
  26. <text class="rule-title">假期说明</text>
  27. <view v-for="r in rules" :key="r" class="rule-row">
  28. <view></view>
  29. <text>{{ r }}</text>
  30. </view>
  31. </view>
  32. <button class="apply-btn" @click="go('/pages/hr/apply/form?type=leave')">
  33. 发起请假申请
  34. </button>
  35. </view>
  36. </template>
  37. <script>
  38. export default {
  39. data() {
  40. return {
  41. // TODO(后端): 假期余额目前无对应接口,暂用静态数据兜底
  42. leaves: [
  43. { name: "年假", left: "4.5", used: "0.5", unit: "天", color: "#157a2c" },
  44. { name: "调休", left: "6", used: "2", unit: "小时", color: "#07a44d" },
  45. { name: "病假", left: "10", used: "0", unit: "天", color: "#f59a23" },
  46. { name: "事假", left: "—", used: "1", unit: "天", color: "#8b939f" },
  47. ],
  48. rules: [
  49. "年假有效期至2026年12月31日,逾期按制度处理。",
  50. "调休余额来自已审批加班,可用于小时级请假。",
  51. "病假需按规定上传医院相关证明材料。",
  52. ],
  53. };
  54. },
  55. methods: {
  56. go(url) {
  57. uni.navigateTo({ url });
  58. },
  59. },
  60. };
  61. </script>
  62. <style scoped lang="scss">
  63. @import "@/pages/hr/common-style.scss";
  64. .leave-hero {
  65. padding: 38rpx 28rpx 76rpx;
  66. background: linear-gradient(145deg, #1b8c37, #157a2c);
  67. color: #fff;
  68. }
  69. .leave-hero text {
  70. display: block;
  71. font-size: 35rpx;
  72. font-weight: 600;
  73. }
  74. .leave-hero text + text {
  75. margin-top: 10rpx;
  76. font-size: 22rpx;
  77. font-weight: 400;
  78. opacity: 0.75;
  79. }
  80. .leave-grid {
  81. display: grid;
  82. grid-template-columns: 1fr 1fr;
  83. gap: 20rpx;
  84. margin: -50rpx 24rpx 0;
  85. }
  86. .leave-card {
  87. padding: 28rpx;
  88. text-align: center;
  89. box-shadow: 0 10rpx 24rpx rgba(21, 122, 44, 0.08);
  90. }
  91. .circle {
  92. width: 116rpx;
  93. height: 116rpx;
  94. margin: auto;
  95. border: 7rpx solid;
  96. border-radius: 50%;
  97. display: flex;
  98. align-items: baseline;
  99. justify-content: center;
  100. padding-top: 28rpx;
  101. }
  102. .circle text {
  103. font-size: 33rpx;
  104. font-weight: 600;
  105. }
  106. .circle small {
  107. margin-left: 4rpx;
  108. font-size: 19rpx;
  109. }
  110. .leave-name {
  111. display: block;
  112. margin-top: 18rpx;
  113. font-size: 28rpx;
  114. font-weight: 500;
  115. }
  116. .leave-used {
  117. display: block;
  118. margin-top: 8rpx;
  119. color: #8b939f;
  120. font-size: 21rpx;
  121. }
  122. .rule {
  123. padding: 28rpx;
  124. }
  125. .rule-title {
  126. display: block;
  127. margin-bottom: 22rpx;
  128. font-size: 29rpx;
  129. font-weight: 600;
  130. }
  131. .rule-row {
  132. display: flex;
  133. margin: 15rpx 0;
  134. color: #6f7782;
  135. line-height: 1.6;
  136. font-size: 23rpx;
  137. }
  138. .rule-row view {
  139. width: 9rpx;
  140. height: 9rpx;
  141. margin: 13rpx 14rpx 0 0;
  142. border-radius: 50%;
  143. background: #b6bdc6;
  144. }
  145. .apply-btn {
  146. height: 88rpx;
  147. margin: 28rpx 24rpx;
  148. border-radius: 12rpx;
  149. background: #157a2c;
  150. color: #fff;
  151. display: flex;
  152. align-items: center;
  153. justify-content: center;
  154. font-size: 30rpx;
  155. }
  156. </style>