myCalendar.vue 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191
  1. <script setup>
  2. import { ref,onMounted } from 'vue';
  3. import { Icon } from 'vant';
  4. import { useRoute } from 'vue-router';
  5. import moment from 'moment';
  6. import 'moment/dist/locale/zh-cn';
  7. moment.locale('zh-cn');
  8. import { getTabsByRole } from './common-calendar';
  9. import { isWxprogram } from '../utils';
  10. import Calendar from '../components/calendar.vue';
  11. import { myEvents } from '@/api/ssbg/api';
  12. const route = useRoute();
  13. localStorage.setItem('ssbg-token',route.query.token || '5e532bc5fa7281aebaa6d89960b54c4ab22f1ab18e969258c634a7940fdb0922');
  14. localStorage.setItem('ssbg-role',route.query.role || 'researcher');
  15. const calendarRef = ref(null);//日历ref
  16. const actionsList = ref([
  17. {
  18. label: '今天',
  19. key: 'weeknow',
  20. show: true,
  21. },
  22. {
  23. label: '添加事项',
  24. key: 'add_matter',
  25. icon: 'add-o',
  26. show: ['ficc_researcher', 'researcher', 'rai_researcher','ficc_admin', 'rai_admin'].includes(localStorage.getItem('ssbg-role'))
  27. },
  28. ]);//底部固定数据
  29. const eventList = ref([]);//日程信息
  30. const Tabs = ref(getTabsByRole(localStorage.getItem('ssbg-role')));//顶部tab
  31. const showCalendar = ref(true);
  32. onMounted(() => {
  33. showCalendar.value = localStorage.getItem('ssbg-role') === 'admin' ? false : true;
  34. })
  35. /* 获取日历日程列表 */
  36. const getEventList = async () => {
  37. if(localStorage.getItem('ssbg-role') === 'admin') return;
  38. const { currentStart } = calendarRef.value.calendarApi.view;
  39. const { code,data } = await myEvents({
  40. StartDate: moment(currentStart).format('YYYY-MM-DD'),
  41. EndDate: moment(currentStart).format('YYYY-MM-DD')
  42. })
  43. if(code !== 200) return
  44. eventList.value = [
  45. ...(data.CalendarList || []),
  46. ...(data.RsMattersList || []),
  47. ].map((item, index) => ( { ...item, id: index }));
  48. };
  49. /* 底部操作 */
  50. const dealActionHandler = (type) => {
  51. const deal_methods_handles = {
  52. weeknow: toogeCurrentWeek,
  53. add_matter: addMatterHandle
  54. };
  55. deal_methods_handles[type]();
  56. }
  57. const addMatterHandle = () => {
  58. wx.miniProgram.navigateTo({
  59. url: '/pages-roadshow/addMatter/index',
  60. });
  61. }
  62. /* 切换为今天 */
  63. const toogeCurrentWeek = () => {
  64. calendarRef.value.toogeCurrentWeek();
  65. };
  66. /* 进入活动列表 */
  67. const switchTabHandle = (key) => {
  68. wx.miniProgram.navigateTo({
  69. url: `/pages-approve/activity/list?type=${key}`,
  70. });
  71. }
  72. </script>
  73. <!-- -->
  74. <template>
  75. <div class="mycalendar-container">
  76. <div class="tab-cont" v-if="route.path === '/ssbg/roadshow/mine'">
  77. <ul class="tab-ul">
  78. <li v-for="tab in Tabs" :key="tab.key" @click="switchTabHandle(tab.label)">
  79. <img class="item-img" src="@/assets/ssbg/tab_icon1.png" v-if="[1,2].includes(tab.key)"/>
  80. <img class="item-img" src="@/assets/ssbg/tab_icon2.png" v-if="tab.key === 3"/>
  81. <img class="item-img" src="@/assets/ssbg/tab_icon3.png" v-if="tab.key === 5"/>
  82. <img class="item-img" src="@/assets/ssbg/tab_icon4.png" v-if="tab.key === 4"/>
  83. {{ tab.label }}
  84. </li>
  85. </ul>
  86. </div>
  87. <Calendar
  88. ref="calendarRef"
  89. :eventList="eventList"
  90. @dateChange="getEventList"
  91. v-if="showCalendar"
  92. />
  93. <div class="fix-action" v-if="isWxprogram() && showCalendar">
  94. <ul class="action-ul">
  95. <li
  96. v-for="item in actionsList"
  97. key="item.key"
  98. @click="dealActionHandler(item.key)"
  99. v-show="item.show"
  100. >
  101. <Icon :name="item.icon" class="item-icon" v-if="item.icon" />
  102. <img
  103. class="item-img"
  104. src="@/assets/ssbg/calendar_ico.png"
  105. alt=""
  106. v-else-if="item.key === 'weeknow'"
  107. />
  108. {{ item.label }}
  109. </li>
  110. </ul>
  111. </div>
  112. </div>
  113. </template>
  114. <style scoped lang="scss">
  115. .mycalendar-container {
  116. .tab-cont {
  117. padding: 30px;
  118. background: #fff;
  119. box-shadow: 0px 3px 12px rgba(175, 175, 175, 0.16);
  120. border-bottom: 6px solid #f6f6f6;
  121. margin-bottom: 20px;
  122. .tab-ul {
  123. display: flex;
  124. align-items: center;
  125. li {
  126. margin-right: 50px;
  127. color: #666;
  128. text-align: center;
  129. .item-img {
  130. width: 78px;
  131. height: 78px;
  132. display:block;
  133. margin: 0 auto 10px;
  134. }
  135. }
  136. }
  137. }
  138. .fix-action {
  139. height: 160px;
  140. position: fixed;
  141. bottom: 0;
  142. left: 0;
  143. right: 0;
  144. z-index: 99;
  145. background-color: #fff;
  146. box-shadow: 0px -3px 6px rgba(172, 172, 172, 0.16);
  147. padding-top: 20px;
  148. padding-bottom: constant(safe-area-inset-bottom);
  149. padding-bottom: env(safe-area-inset-bottom);
  150. .action-ul {
  151. height: 100%;
  152. display: flex;
  153. align-items: center;
  154. justify-content: space-around;
  155. color: #3385ff;
  156. li:hover {
  157. opacity: 0.8;
  158. }
  159. .item-icon {
  160. font-size: 52px;
  161. display: block;
  162. text-align: center;
  163. margin: 0 auto 10px;
  164. }
  165. .item-img {
  166. display: block;
  167. width: 46px;
  168. height: 46px;
  169. margin: 0 auto 10px;
  170. }
  171. }
  172. }
  173. }
  174. </style>