index.vue 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231
  1. <template>
  2. <div class="warehouse container">
  3. <div v-if="menuTrueFalseBy" class="menu">
  4. <div class="name">
  5. {{ userInfo.username }}
  6. </div>
  7. <div
  8. v-for="(item, index) in menuList"
  9. :key="index"
  10. :class="menuId === item.id ? 'active' : ''"
  11. @click="onConfirm(item)"
  12. class="title flex"
  13. >
  14. <div class="icon">
  15. <van-icon :name="item.icon"></van-icon>
  16. </div>
  17. <div>{{ item.title }}</div>
  18. </div>
  19. <div class="title flex" style="margin-top: 30px;" @click="outLogin">
  20. <div class="icon">
  21. <van-icon name="upgrade" />
  22. </div>
  23. <div>退出登录</div>
  24. </div>
  25. </div>
  26. <div :class="menuTrueFalseBy ? 'content-box' : 'content-show'">
  27. <div class="content">
  28. <van-nav-bar
  29. placeholder
  30. :fixed="!menuTrueFalseBy"
  31. @click-left="back"
  32. @click-right="showSelect"
  33. >
  34. <template #left>
  35. <div class="u-nav-slot">
  36. <van-icon name="bars" size="25" />
  37. </div>
  38. </template>
  39. <template #title>
  40. <div class="flex flexColumn alignCenter">
  41. <div>工作台</div>
  42. </div>
  43. </template>
  44. <template #right>
  45. <div style="color: #fff">{{ warehousesMap[warehouse] }}</div>
  46. </template>
  47. </van-nav-bar>
  48. <div class="menu-box">
  49. <div v-for="(item, index) in menuList[menuId].menu" class="menu-list">
  50. <div class="menu-title">{{ item.title }}</div>
  51. <div class="menu-item-box">
  52. <div v-for="(items, index) in item.children" class="menu-item" @click="onRouter(items.path)">
  53. <div class="menu-item-icon">
  54. <van-icon :name="items.icon" size="28" />
  55. </div>
  56. <div class="menu-item-title">{{ items.title }}</div>
  57. </div>
  58. </div>
  59. </div>
  60. </div>
  61. </div>
  62. <div v-if="menuTrueFalseBy" @click="hideMenu" class="hide-menu"></div>
  63. </div>
  64. <select-warehouse ref="selectWarehouseRef" @setWarehouse="setWarehouse" />
  65. </div>
  66. </template>
  67. <script setup>
  68. import { ref } from 'vue'
  69. import menu from '@/hooks/basic/menu.js'
  70. import { useRouter } from 'vue-router'
  71. import { getHeader, goBack } from '@/utils/android'
  72. import { useStore } from '@/store/modules/user'
  73. import { getUserInfo } from '@/api/login/index'
  74. import SelectWarehouse from '@/components/SelectWarehouse.vue'
  75. import { showToast } from 'vant'
  76. const router = useRouter()
  77. const store = useStore()
  78. const userInfo = ref({})
  79. try {
  80. getHeader()
  81. } catch (error) {
  82. }
  83. setTimeout(() => {
  84. getUserInfo().then(res => {
  85. userInfo.value = res.data
  86. })
  87. }, 300)
  88. const { menuList } = menu()
  89. const menuId = ref(0)
  90. const menuTrueFalseBy = ref(false)
  91. const storeUser = useStore()
  92. const warehouse = ref(storeUser.warehouse)
  93. const warehousesMap = ref({
  94. 'WH99': '测试仓库(WH99)',
  95. 'WH01': '九干仓(WH01)',
  96. 'WH02': '新浜一仓(WH02)',
  97. 'WH10': '新浜二仓(WH10)',
  98. })
  99. const onRouter = (path) => {
  100. router.push(`/${path}`)
  101. }
  102. const onConfirm = (item) => {
  103. menuTrueFalseBy.value = false
  104. }
  105. const back = () => {
  106. try {
  107. window.android.goBack()
  108. }catch (e){
  109. menuTrueFalseBy.value = true
  110. }
  111. }
  112. const selectWarehouseRef = ref(null)
  113. const showSelect = () => {
  114. try {
  115. if(window.android.getHeader()){
  116. showToast('app内不支持切换仓库')
  117. }
  118. }catch (e){
  119. selectWarehouseRef.value.show(warehouse.value)
  120. }
  121. }
  122. const hideMenu = () => {
  123. if (menuTrueFalseBy.value) {
  124. menuTrueFalseBy.value = false
  125. }
  126. }
  127. const setWarehouse = (code) => {
  128. warehouse.value = code
  129. }
  130. const outLogin = () => {
  131. router.push(`/login`)
  132. }
  133. </script>
  134. <style lang="sass" scoped>
  135. .warehouse
  136. width: 100%
  137. height: 100vh
  138. display: flex
  139. .menu
  140. width: 50%
  141. margin-left: 15px
  142. .name
  143. margin: 50px auto
  144. text-align: center
  145. font-size: 18px
  146. font-weight: 500
  147. .title
  148. line-height: 40px
  149. .active
  150. color: #3c9cff
  151. .content-box
  152. width: 50%
  153. transition: width 0.2s
  154. overflow: hidden
  155. background-color: #ffffff
  156. margin: 80px 0 110px 0
  157. position: relative
  158. .content
  159. width: 375px
  160. overflow: hidden
  161. transform: scale(0.75)
  162. transform-origin: left top
  163. pointer-events: none
  164. .menu-box
  165. .menu-list
  166. background: #fff
  167. padding: 10px 0
  168. font-size: 13px
  169. margin-bottom: 10px
  170. color: #333
  171. .menu-title
  172. padding: 0 15px 10px 15px
  173. text-align: left
  174. .menu-item-box
  175. display: flex
  176. .menu-item
  177. width: 25%
  178. .hide-menu
  179. position: absolute
  180. height: 100%
  181. width: 100%
  182. left: 0
  183. right: 0
  184. top: 0
  185. bottom: 0
  186. .content-show
  187. width: 100%
  188. .content
  189. .menu-box
  190. .menu-list
  191. background: #fff
  192. font-size: 13px
  193. margin-bottom: 10px
  194. color: #333
  195. .menu-title
  196. padding: 10px 15px 10px 15px
  197. text-align: left
  198. .menu-item-box
  199. display: flex
  200. flex-wrap: wrap
  201. .menu-item
  202. width: 20%
  203. margin-bottom: 10px
  204. .grid-text
  205. font-size: 14px
  206. color: #909399
  207. padding: 5px 0 10px 0
  208. </style>