From 9d486c37426102cf7d2281e2b39063f132cd251d Mon Sep 17 00:00:00 2001 From: chenqi Date: Fri, 19 Jun 2026 12:48:57 +0800 Subject: [PATCH] =?UTF-8?q?feat(mobile):=20=E6=B7=BB=E5=8A=A0=E7=99=BB?= =?UTF-8?q?=E5=BD=95=E9=A1=B5=E9=9D=A2+=E7=A7=9F=E6=88=B7=E9=80=89?= =?UTF-8?q?=E6=8B=A9+=E8=B7=AF=E7=94=B1=E5=AE=88=E5=8D=AB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- healthlink-his-mobile/.gitignore | 5 ++ healthlink-his-mobile/package.json | 4 +- healthlink-his-mobile/src/api/index.js | 29 ++++++- healthlink-his-mobile/src/router/index.js | 12 ++- healthlink-his-mobile/src/views/Login.vue | 98 +++++++++++++++++++++++ 5 files changed, 143 insertions(+), 5 deletions(-) create mode 100644 healthlink-his-mobile/.gitignore create mode 100644 healthlink-his-mobile/src/views/Login.vue diff --git a/healthlink-his-mobile/.gitignore b/healthlink-his-mobile/.gitignore new file mode 100644 index 000000000..c2458765e --- /dev/null +++ b/healthlink-his-mobile/.gitignore @@ -0,0 +1,5 @@ +node_modules/ +dist/ +.env.local +.env.*.local +*.log diff --git a/healthlink-his-mobile/package.json b/healthlink-his-mobile/package.json index 43779ae25..207255bf4 100644 --- a/healthlink-his-mobile/package.json +++ b/healthlink-his-mobile/package.json @@ -5,7 +5,9 @@ "scripts": { "dev": "vite", "build": "vite build", - "preview": "vite preview" + "build:dev": "vite build", + "preview": "vite preview", + "lint": "echo 'No lint configured'" }, "dependencies": { "vue": "^3.4.0", diff --git a/healthlink-his-mobile/src/api/index.js b/healthlink-his-mobile/src/api/index.js index 8f681a093..2eb812550 100644 --- a/healthlink-his-mobile/src/api/index.js +++ b/healthlink-his-mobile/src/api/index.js @@ -1,4 +1,5 @@ import axios from 'axios' +import { ElMessage } from 'element-plus' const request = axios.create({ baseURL: '/dev-api', @@ -8,19 +9,41 @@ const request = axios.create({ request.interceptors.request.use(config => { const token = localStorage.getItem('token') if (token) config.headers.Authorization = `Bearer ${token}` + const tenantId = localStorage.getItem('tenantId') + if (tenantId) config.headers['tenant-id'] = tenantId return config }) request.interceptors.response.use( - res => res.data, - err => { console.error(err); return Promise.reject(err) } + res => { + if (res.data?.code === 401) { + localStorage.removeItem('token') + window.location.href = '/login' + return Promise.reject(new Error('登录已过期')) + } + return res.data + }, + err => { + if (err.response?.status === 401) { + localStorage.removeItem('token') + window.location.href = '/login' + } + ElMessage.error(err.response?.data?.msg || '请求失败') + return Promise.reject(err) + } ) +export const authApi = { + login: (data) => request.post('/login', data), + getTenants: () => request.get('/tenant/list'), + logout: () => request.post('/logout') +} + export const nursingApi = { getTasks: (params) => request.get('/mp/nursing/tasks', { params }), completeTask: (id, data) => request.post(`/mp/nursing/tasks/${id}/complete`, data), - getPatientList: (params) => request.get('/mp/nursing/patient/list', { params }), getPatientInfo: (id) => request.get(`/mp/nursing/patient/${id}`), + getPatientList: (params) => request.get('/mp/nursing/patient/list', { params }), getOrders: (patientId) => request.get(`/mp/nursing/orders/${patientId}`), getVitalSigns: (patientId) => request.get(`/mp/nursing/vital-signs/${patientId}`), submitVitalSign: (data) => request.post('/mp/nursing/vital-sign', data), diff --git a/healthlink-his-mobile/src/router/index.js b/healthlink-his-mobile/src/router/index.js index de91e352d..4075999db 100644 --- a/healthlink-his-mobile/src/router/index.js +++ b/healthlink-his-mobile/src/router/index.js @@ -1,8 +1,9 @@ import { createRouter, createWebHistory } from 'vue-router' const routes = [ + { path: '/login', component: () => import('../views/Login.vue'), meta: { title: '登录' } }, { path: '/', redirect: '/mobile/tasks' }, - { path: '/mobile', component: () => import('../views/MobileLayout.vue'), children: [ + { path: '/mobile', component: () => import('../views/MobileLayout.vue'), meta: { requiresAuth: true }, children: [ { path: 'tasks', component: () => import('../views/TaskList.vue'), meta: { title: '任务' } }, { path: 'patients', component: () => import('../views/PatientList.vue'), meta: { title: '患者' } }, { path: 'patient-detail/:id', component: () => import('../views/PatientDetail.vue'), meta: { title: '患者详情' } }, @@ -13,4 +14,13 @@ const routes = [ ] const router = createRouter({ history: createWebHistory(), routes }) + +router.beforeEach((to, from, next) => { + if (to.meta.requiresAuth) { + const token = localStorage.getItem('token') + if (!token) { next('/login'); return } + } + next() +}) + export default router diff --git a/healthlink-his-mobile/src/views/Login.vue b/healthlink-his-mobile/src/views/Login.vue new file mode 100644 index 000000000..8ce499626 --- /dev/null +++ b/healthlink-his-mobile/src/views/Login.vue @@ -0,0 +1,98 @@ + + + + +