App.vue 8.6 KB

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