index.js 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294
  1. import Vue from 'vue'
  2. import VueRouter from 'vue-router'
  3. import NavLayout from "@/components/layout/NavLayout"
  4. import store from '@/store'
  5. import { isSupportHtml5Plus } from '@/utils/platform'
  6. import {
  7. setTitle
  8. } from "@/utils/title"
  9. import Login from '@/views/login/Login'
  10. import Register from '@/views/login/Register'
  11. import FotgetPassword from '@/views/login/FotgetPassword'
  12. import DrugList from '@/views/drug/list'
  13. import Index from '@/views/index/Index'
  14. import personal from './personal'
  15. import order from './order'
  16. import replenishment from './replenishment'
  17. import device from './device'
  18. import machine from './machine'
  19. import {getPublicKey, getHwlyyDecrypt, checkWlyyLogin, findOneUserFormat} from '@/api/login'
  20. import JSEncrypt from "@/utils/jsencrypt";
  21. import { Toast } from 'vant'
  22. import { findLoginRoleMenuTree } from '@/api/login'
  23. import { _ } from 'core-js'
  24. Vue.use(VueRouter)
  25. const routes = [
  26. {
  27. path: '/',
  28. redirect: '/home'
  29. },
  30. {
  31. path: '/404',
  32. name: '404',
  33. component: () => import('@/views/404/404.vue')
  34. },
  35. {
  36. path: '/login',
  37. name: 'login',
  38. component: Login,
  39. meta: {
  40. title: '登录',
  41. hasTop: false
  42. }
  43. },
  44. {
  45. path: '/register',
  46. name: 'register',
  47. component: Register,
  48. meta: {
  49. title: '注册'
  50. }
  51. },
  52. {
  53. path: '/fotgetPassword',
  54. name: 'fotgetPassword',
  55. component: FotgetPassword,
  56. meta: {
  57. title: '忘记密码',
  58. }
  59. },
  60. {
  61. path: '/home',
  62. name: 'home',
  63. component: NavLayout,
  64. redirect: "/home/index",
  65. children: [{
  66. path: "index",
  67. name: "homeIndex",
  68. component: Index,
  69. meta: {
  70. title: '首页',
  71. hasBot: true,
  72. hasTop: false
  73. }
  74. }]
  75. },
  76. {
  77. path: '/drugList',
  78. name: 'drugList',
  79. component: NavLayout,
  80. children: [{
  81. path: '/drugList',
  82. name: 'drugList',
  83. component: DrugList,
  84. meta: {
  85. title: '选择药品'
  86. }
  87. }]
  88. },
  89. ]
  90. const whiteList = [
  91. '/login',
  92. '/register',
  93. '/fotgetPassword',
  94. '/machine/index',
  95. '/machine'
  96. ]
  97. const router = new VueRouter({
  98. mode: 'history',
  99. base: process.env.BASE_URL,
  100. routes: routes.concat( personal, order, replenishment, device, machine )
  101. })
  102. function redirectToLogin(to, from, next) {
  103. let isApp = to.query.isApp || isSupportHtml5Plus
  104. if(isApp) {
  105. next(`/login?isApp=1&redirectUrl=${encodeURIComponent(to.fullPath)}`)
  106. } else {
  107. next('/login')
  108. }
  109. }
  110. var routerLoaded = false
  111. function formatAuthMenu(menu){
  112. if(menu){
  113. return _.map(menu, v=>{
  114. return {
  115. name: v.name,
  116. url: v.url,
  117. type: v.type,
  118. children: v.children? formatAuthMenu(v.children) : []
  119. }
  120. })
  121. }
  122. }
  123. router.beforeEach(async (to, from, next) => {
  124. // _from=ihealth&_platform=webApp
  125. // debugger
  126. if(to.query._noTop==1){
  127. store.dispatch('SetNoTop', true)
  128. }
  129. new Promise((resolve, reject)=>{
  130. if(to.query._code){
  131. authLogin(to.query._code, to)
  132. .then(res=>{
  133. Toast.clear()
  134. resolve()
  135. })
  136. } else {
  137. resolve()
  138. }
  139. })
  140. .then(res=>{
  141. if((store.getters.user && store.getters.user.accessToken)) {
  142. if(!routerLoaded){
  143. findOneUserFormat({
  144. id: store.getters.user.id
  145. }).then(userInfo2 => {
  146. var userInfo = _.assignIn(store.getters.user, userInfo2);
  147. store
  148. .dispatch('SetLoginUser', userInfo)
  149. .then(res=>{
  150. findLoginRoleMenuTree({
  151. roleId: store.getters.user.curRoleId
  152. })
  153. .then(res=>{
  154. routerLoaded = true
  155. var routeList = formatAuthMenu(res.detailModelList)
  156. store.dispatch('SetAuthMenu', routeList)
  157. console.log('routeList', routeList)
  158. next()
  159. })
  160. .catch(err=>{
  161. console.error(err)
  162. })
  163. })
  164. }).catch(err=>{
  165. routerLoaded = true
  166. console.error(err)
  167. })
  168. } else {
  169. next()
  170. }
  171. } else {
  172. routerLoaded = false
  173. if( whiteList.indexOf(to.path) > -1) {
  174. next()
  175. } else {
  176. redirectToLogin(to, from, next)
  177. }
  178. }
  179. })
  180. .catch(err=>{
  181. console.error(err)
  182. })
  183. })
  184. function authLogin(code, to){
  185. return new Promise((resolve, reject)=>{
  186. Toast.loading({
  187. message: '授权登录中..',
  188. duration: 0,
  189. forbidClick: true
  190. })
  191. getHwlyyDecrypt({code: decodeURIComponent(code)})
  192. .then(data=>{
  193. return new Promise((resolve, reject)=>{
  194. getPublicKey({})
  195. .then(res=>{
  196. var encrypt = new JSEncrypt()
  197. encrypt.setPublicKey(res.obj.publicKey)
  198. resolve(encrypt.encrypt(data.obj.code))
  199. })
  200. .catch(err=>{
  201. reject(err)
  202. })
  203. })
  204. })
  205. .then(code=>{
  206. return checkWlyyLogin({
  207. code: code,
  208. client_id: store.getters.clientId,
  209. login_type: 1
  210. })
  211. })
  212. .then(res=>{
  213. if(res.obj && res.obj.authCode==1){
  214. var userInfo = res.obj.WlyyUserSimple
  215. userInfo.token = userInfo.accessToken
  216. userInfo.clientType = to.query.clientType//1 来自i健康app 区域互联网
  217. store.dispatch('SetLoginUser', userInfo)
  218. findOneUserFormat({
  219. id: userInfo.id
  220. }).then(userInfo2 => {
  221. userInfo = _.assignIn(userInfo, userInfo2);
  222. store
  223. .dispatch('SetLoginUser', userInfo)
  224. .then(res=>{
  225. resolve()
  226. })
  227. }).catch(err=>{
  228. console.error(err)
  229. })
  230. // // "saasAdmin": "管理员"; regionAdmin" "区域管理员" ; communityAdmin "社区管理员" ; " "replenisher": "补货员"
  231. // // 18补货员 19社区管理员 20区域管理员 21超管
  232. // var dictList = {
  233. // 18: {
  234. // curRoleCode: "replenisher",
  235. // curRoleName: "补货员"
  236. // },
  237. // 19: {
  238. // curRoleCode: "communityAdmin",
  239. // curRoleName: "社区管理员"
  240. // },
  241. // 20: {
  242. // curRoleCode: "regionAdmin",
  243. // curRoleName: "区域管理员"
  244. // },
  245. // 21: {
  246. // curRoleCode: "saasAdmin",
  247. // curRoleName: "管理员"
  248. // },
  249. // }
  250. // var { curRoleCode, curRoleName } = dictList[to.query._role]
  251. // userInfo.curRoleCode = curRoleCode
  252. // userInfo.curRoleName = curRoleName
  253. // store
  254. // .dispatch('SetLoginUser', userInfo)
  255. // .then(res=>{
  256. // resolve()
  257. // })
  258. } else {
  259. Toast(res.message|| (res.obj&&res.obj.mes))
  260. reject(res)
  261. }
  262. })
  263. .catch(err=>{
  264. console.error(err)
  265. // Toast("获取医生数据错误")
  266. reject(err)
  267. })
  268. })
  269. }
  270. const noSetTitleList = []
  271. router.afterEach((to, from) => {
  272. // 更新页面标题
  273. console.log(to,from)
  274. if (to.meta && to.meta.title && noSetTitleList.indexOf(to.path)==-1) {
  275. setTitle(to.meta.title)
  276. store.dispatch("SetPageTitle", to.meta.title)
  277. }
  278. else if(noSetTitleList.indexOf(to.path)>-1){
  279. }
  280. window.scrollTo(0, 0);
  281. })
  282. export default router