index.js 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280
  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. if(to.query._noTop==1){
  126. store.dispatch('SetNoTop', true)
  127. }
  128. new Promise((resolve, reject)=>{
  129. if(to.query._code){
  130. authLogin(to.query._code, to)
  131. .then(res=>{
  132. Toast.clear()
  133. resolve()
  134. })
  135. } else {
  136. resolve()
  137. }
  138. })
  139. .then(res=>{
  140. if((store.getters.user && store.getters.user.accessToken)) {
  141. if(!routerLoaded){
  142. findLoginRoleMenuTree({
  143. roleId: store.getters.user.curRoleId
  144. })
  145. .then(res=>{
  146. routerLoaded = true
  147. var routeList = formatAuthMenu(res.detailModelList)
  148. store.dispatch('SetAuthMenu', routeList)
  149. console.log('routeList', routeList)
  150. next()
  151. })
  152. .catch(err=>{
  153. console.error(err)
  154. })
  155. } else {
  156. next()
  157. }
  158. } else {
  159. if( whiteList.indexOf(to.path) > -1) {
  160. next()
  161. } else {
  162. redirectToLogin(to, from, next)
  163. }
  164. }
  165. })
  166. .catch(err=>{
  167. console.error(err)
  168. })
  169. })
  170. function authLogin(code, to){
  171. return new Promise((resolve, reject)=>{
  172. Toast.loading({
  173. message: '授权登录中..',
  174. duration: 0,
  175. forbidClick: true
  176. })
  177. getHwlyyDecrypt({code: decodeURIComponent(code)})
  178. .then(data=>{
  179. return new Promise((resolve, reject)=>{
  180. getPublicKey({})
  181. .then(res=>{
  182. var encrypt = new JSEncrypt()
  183. encrypt.setPublicKey(res.obj.publicKey)
  184. resolve(encrypt.encrypt(data.obj.code))
  185. })
  186. .catch(err=>{
  187. reject(err)
  188. })
  189. })
  190. })
  191. .then(code=>{
  192. return checkWlyyLogin({
  193. code: code,
  194. client_id: store.getters.clientId,
  195. login_type: 1
  196. })
  197. })
  198. .then(res=>{
  199. if(res.obj && res.obj.authCode==1){
  200. var userInfo = res.obj.WlyyUserSimple
  201. userInfo.token = userInfo.accessToken
  202. userInfo.clientType = to.query.clientType//1 来自i健康app 区域互联网
  203. store.dispatch('SetLoginUser', userInfo)
  204. findOneUserFormat({
  205. id: userInfo.id
  206. }).then(userInfo2 => {
  207. userInfo = _.assignIn(userInfo, userInfo2);
  208. store
  209. .dispatch('SetLoginUser', userInfo)
  210. .then(res=>{
  211. resolve()
  212. })
  213. }).catch(err=>{
  214. console.error(err)
  215. })
  216. // // "saasAdmin": "管理员"; regionAdmin" "区域管理员" ; communityAdmin "社区管理员" ; " "replenisher": "补货员"
  217. // // 18补货员 19社区管理员 20区域管理员 21超管
  218. // var dictList = {
  219. // 18: {
  220. // curRoleCode: "replenisher",
  221. // curRoleName: "补货员"
  222. // },
  223. // 19: {
  224. // curRoleCode: "communityAdmin",
  225. // curRoleName: "社区管理员"
  226. // },
  227. // 20: {
  228. // curRoleCode: "regionAdmin",
  229. // curRoleName: "区域管理员"
  230. // },
  231. // 21: {
  232. // curRoleCode: "saasAdmin",
  233. // curRoleName: "管理员"
  234. // },
  235. // }
  236. // var { curRoleCode, curRoleName } = dictList[to.query._role]
  237. // userInfo.curRoleCode = curRoleCode
  238. // userInfo.curRoleName = curRoleName
  239. // store
  240. // .dispatch('SetLoginUser', userInfo)
  241. // .then(res=>{
  242. // resolve()
  243. // })
  244. } else {
  245. Toast(res.message|| (res.obj&&res.obj.mes))
  246. reject(res)
  247. }
  248. })
  249. .catch(err=>{
  250. console.error(err)
  251. // Toast("获取医生数据错误")
  252. reject(err)
  253. })
  254. })
  255. }
  256. const noSetTitleList = []
  257. router.afterEach((to, from) => {
  258. // 更新页面标题
  259. console.log(to,from)
  260. if (to.meta && to.meta.title && noSetTitleList.indexOf(to.path)==-1) {
  261. setTitle(to.meta.title)
  262. store.dispatch("SetPageTitle", to.meta.title)
  263. }
  264. else if(noSetTitleList.indexOf(to.path)>-1){
  265. }
  266. window.scrollTo(0, 0);
  267. })
  268. export default router