App.vue 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255
  1. <!--
  2. * @Author: your name
  3. * @Date: 2021-01-07 09:49:29
  4. * @LastEditTime: 2021-11-01 14:08:55
  5. * @LastEditors: Please set LastEditors
  6. * @Description: In User Settings Edit
  7. * @FilePath: \vue3-element-admin\src\App.vue
  8. -->
  9. <template>
  10. <!-- <router-view v-slot="{ Component }">
  11. <keep-alive exclude="GardenReport">
  12. <component :is="Component" />
  13. </keep-alive>
  14. </router-view> -->
  15. <el-config-provider :locale="elementLocale">
  16. <!-- keep-alive 必须常驻;用内部 component 的 v-if 区分是否缓存,避免切到非缓存页时整棵 keep-alive 被销毁 -->
  17. <router-view v-slot="{ Component }">
  18. <keep-alive>
  19. <component
  20. :is="Component"
  21. v-if="Component && route.meta.keepAlive"
  22. :key="route.name"
  23. />
  24. </keep-alive>
  25. <component
  26. :is="Component"
  27. v-if="Component && !route.meta.keepAlive"
  28. :key="route.name"
  29. />
  30. </router-view>
  31. <Tabbar class="tabbar" route fixed v-show="showTab" active-color="#2199F8" inactive-color="#898989">
  32. <!-- 托管农户:首页、农事档案、农事记录 -->
  33. <!-- <template v-if="userType == 2"> -->
  34. <tabbar-item replace to="/growth_report">
  35. <span>{{ t("tabbar.situationAssessment") }}</span>
  36. <template #icon="props">
  37. <img
  38. :src="
  39. props.active
  40. ? require('@/assets/img/tab_bar/home-active.png')
  41. : require('@/assets/img/tab_bar/home.png')
  42. "
  43. />
  44. </template>
  45. </tabbar-item>
  46. <tabbar-item replace to="/agri_file">
  47. <span>{{ t("tabbar.agriFile") }}</span>
  48. <template #icon="props">
  49. <img
  50. :src="
  51. props.active
  52. ? require('@/assets/img/tab_bar/tree-active.png')
  53. : require('@/assets/img/tab_bar/tree.png')
  54. "
  55. />
  56. </template>
  57. </tabbar-item>
  58. <!-- <tabbar-item replace to="/agri_record">
  59. <span>{{ t("tabbar.agriRecord") }}</span>
  60. <template #icon="props">
  61. <img
  62. :src="
  63. props.active
  64. ? require('@/assets/img/tab_bar/task-active.png')
  65. : require('@/assets/img/tab_bar/task.png')
  66. "
  67. />
  68. </template>
  69. </tabbar-item> -->
  70. <tabbar-item replace to="/work_execute">
  71. <span>{{ t("tabbar.schedule") }}</span>
  72. <template #icon="props">
  73. <img
  74. :src="
  75. props.active
  76. ? require('@/assets/img/tab_bar/task-active.png')
  77. : require('@/assets/img/tab_bar/task.png')
  78. "
  79. />
  80. </template>
  81. </tabbar-item>
  82. <!-- </template> -->
  83. <!-- 普通农户:首页、农事服务、用户管理、个人中心(保留原逻辑) -->
  84. <!-- <template v-else-if="userType == 1">
  85. <tabbar-item replace to="/home" v-if="curRole == 0 || curRole == 2">
  86. <span>{{ $t('首页') }}</span>
  87. <template #icon="props">
  88. <img
  89. :src="
  90. props.active
  91. ? require('@/assets/img/tab_bar/home-active.png')
  92. : require('@/assets/img/tab_bar/home.png')
  93. "
  94. />
  95. </template>
  96. </tabbar-item>
  97. <tabbar-item replace to="/task_condition">
  98. <span>{{ $t('农事服务') }}</span>
  99. <template #icon="props">
  100. <img
  101. :src="
  102. props.active
  103. ? require('@/assets/img/tab_bar/service-active.png')
  104. : require('@/assets/img/tab_bar/service.png')
  105. "
  106. />
  107. </template>
  108. </tabbar-item>
  109. <tabbar-item replace to="/user">
  110. <span>{{ $t('用户管理') }}</span>
  111. <template #icon="props">
  112. <img
  113. :src="
  114. props.active
  115. ? require('@/assets/img/tab_bar/user-active.png')
  116. : require('@/assets/img/tab_bar/user.png')
  117. "
  118. />
  119. </template>
  120. </tabbar-item>
  121. <tabbar-item replace to="/mine">
  122. <span>{{ $t('个人中心') }}</span>
  123. <template #icon="props">
  124. <img
  125. :src="
  126. props.active
  127. ? require('@/assets/img/tab_bar/mine-active.png')
  128. : require('@/assets/img/tab_bar/mine.png')
  129. "
  130. />
  131. </template>
  132. </tabbar-item>
  133. </template> -->
  134. </Tabbar>
  135. <!-- 开启底部安全区适配 -->
  136. <number-keyboard safe-area-inset-bottom />
  137. </el-config-provider>
  138. </template>
  139. <script setup>
  140. import { NumberKeyboard } from "vant";
  141. import { Tabbar, TabbarItem } from "vant";
  142. import { nextTick, watch, onMounted, ref, computed } from "vue";
  143. import { useRoute, useRouter } from "vue-router";
  144. import { useStore } from "vuex";
  145. import { NH, NZ, EXPERT } from "@/common/user_role";
  146. import zhCn from "element-plus/es/locale/lang/zh-cn";
  147. import en from "element-plus/es/locale/lang/en";
  148. import { useI18n } from "@/i18n";
  149. const { t, locale } = useI18n();
  150. const store = useStore();
  151. const elementLocale = computed(() => (locale.value === "en" ? en : zhCn));
  152. const route = useRoute();
  153. const router = useRouter();
  154. // 首页loading加载完才显示底部导航栏
  155. const showTab = ref(false);
  156. // 0: 农户, 1: 专家, 2:农资农服
  157. const curRole = ref(0);
  158. // USER_TYPE: 1 普通农户,2 托管农户
  159. const userType = ref("2");
  160. // 获取用户是否为托管农户,并缓存 USER_TYPE(与 dev_login.vue 逻辑一致)
  161. const fetchUserType = async () => {
  162. userType.value = "2";
  163. localStorage.setItem("USER_TYPE", "2");
  164. // // 检查是否有 token,没有 token 则不调用接口
  165. // const token = store.state.app.token || localStorage.getItem("token");
  166. // if (!token) {
  167. // // 没有 token 时使用缓存的值
  168. // userType.value = localStorage.getItem("USER_TYPE") || "1";
  169. // return;
  170. // }
  171. // try {
  172. // const { data } = await VE_API.farm.userFarmSelectOption({ userType: 2 });
  173. // if (Array.isArray(data) && data.length > 0) {
  174. // // 有托管农户数据
  175. // userType.value = "2";
  176. // localStorage.setItem("USER_TYPE", "2");
  177. // } else {
  178. // userType.value = "1";
  179. // localStorage.setItem("USER_TYPE", "1");
  180. // }
  181. // } catch (error) {
  182. // // 请求失败时保留默认值
  183. // userType.value = localStorage.getItem("USER_TYPE") || "1";
  184. // }
  185. };
  186. let tabBarHeight = 0;
  187. // 监听 token 变化,当有 token 时调用接口获取用户类型
  188. watch(
  189. () => store.state.app.token,
  190. (newToken) => {
  191. if (newToken) {
  192. fetchUserType();
  193. }
  194. },
  195. { immediate: true }
  196. );
  197. onMounted(() => {
  198. setTimeout(() => {
  199. curRole.value = store.state.app.curRole;
  200. if (route.meta.showTabbar) {
  201. showTab.value = true;
  202. }
  203. nextTick(() => {
  204. const tabBarElement = document.querySelector(".van-tabbar");
  205. if (tabBarElement) {
  206. tabBarHeight = tabBarElement.offsetHeight;
  207. localStorage.setItem("tabBarHeight", tabBarHeight);
  208. store.commit("home/SET_TAB_BAR_HEIGHT", tabBarHeight);
  209. }
  210. });
  211. }, 500);
  212. });
  213. watch(
  214. () => route.name,
  215. (newName, oldName) => {
  216. // 在这里执行你的自定义逻辑
  217. showTab.value = false;
  218. if (route.meta.showTabbar) {
  219. showTab.value = true;
  220. }
  221. nextTick(() => {
  222. const tabBarElement = document.querySelector(".van-tabbar");
  223. if (tabBarElement) {
  224. tabBarHeight = tabBarElement.offsetHeight;
  225. localStorage.setItem("tabBarHeight", tabBarHeight);
  226. store.commit("home/SET_TAB_BAR_HEIGHT", tabBarHeight);
  227. }
  228. curRole.value = store.state.app.curRole
  229. });
  230. },
  231. { immediate: false }
  232. );
  233. </script>
  234. <style lang="scss" scoped>
  235. .tabbar {
  236. position: fixed;
  237. pointer-events: all;
  238. z-index: 9999;
  239. }
  240. </style>