diff --git a/.env b/.env index 08890b3..43bab3c 100644 --- a/.env +++ b/.env @@ -1,3 +1,5 @@ VITE_PWD_ENC_KEY='thanks,rax4cloud' -VITE_OAUTH2_PASSWORD_CLIENT='rax:rax' \ No newline at end of file +VITE_OAUTH2_PASSWORD_CLIENT='rax:rax' + +VITE_RAX_BASE_URL='/api' \ No newline at end of file diff --git a/src/api/acl/login.ts b/src/api/acl/login.ts index 5e9b880..71a2340 100644 --- a/src/api/acl/login.ts +++ b/src/api/acl/login.ts @@ -1,11 +1,10 @@ -import axios from "axios"; import * as other from "@/utils/other"; -import {get, HOST, post} from "@/utils/request"; import {ElMessage} from "element-plus"; +import request, {CommonHeaderEnum, postData} from "@/utils/request"; -const FORM_CONTENT_TYPE = 'application/x-www-form-urlencoded'; const registerUrl = "/admin/register/user" +const logoutUrl = "/admin/token/logout" export const login = (data: any) => { return new Promise(resolve => { @@ -19,30 +18,46 @@ export const login = (data: any) => { data.grant_type = 'password'; data.scope = 'server'; - axios.request({ - url: '/api/admin/oauth2/token', + request({ + url: '/admin/oauth2/token', method: 'post', data: {...data, password: encPassword}, headers: { skipToken: true, Authorization: basicAuth, - 'Content-Type': FORM_CONTENT_TYPE, + 'Content-Type': CommonHeaderEnum.FORM_CONTENT_TYPE, }, - }).then(res => { - resolve(res.data); + }).then((res: any) => { + resolve(res.data ? res.data : res.response.data) }).catch(err => { - if (err && err.response && err.response.data && err.response.data.msg) { - ElMessage.error(err.response.data.msg) - } else { - ElMessage.error('系统异常请联系管理员') - } + resolve(err) + handleError(err) }) }) }; export const register = (data: any) => { return new Promise(resolve => { - console.log(data) - resolve(true) + postData(registerUrl, data).then(res => { + resolve(res.data) + }).catch(err => { + resolve(err) + handleError(err) + }) }) +} + +export function logout() { + return request({ + url: logoutUrl, + method: "DELETE" + }) +} + +function handleError(err: any) { + if (err && err.msg) { + ElMessage.error(err.msg) + } else { + ElMessage.error('系统异常请联系管理员') + } } \ No newline at end of file diff --git a/src/api/acl/user/index.ts b/src/api/acl/user/index.ts index 6638504..7f0158f 100644 --- a/src/api/acl/user/index.ts +++ b/src/api/acl/user/index.ts @@ -22,3 +22,56 @@ export const reqUserInfo = () => //退出登录 export const reqLogout = () => request.post(API.LOGOUT_URL) */ +import request, {getData} from "@/utils/request"; + +const userInfoUrl = '/admin/user/info' + +const editUserUrl = '/admin/user/edit' + +const editPasswordUrl = '/admin/user/password' + +const userPageUrl = '/admin/user/page' + +export function getUserInfo() { + return new Promise(resolve => { + getData(userInfoUrl).then((data: any) => { + resolve(data.data) + }) + }) +} + +export function updateUserInfo(data: any) { + return new Promise(resolve => { + request.request({ + url: editUserUrl, + method: 'put', + data + }).then((res: any) => { + resolve(res.data) + }) + }) +} + +export function editPassword(data: any) { + return new Promise(resolve => { + request.request({ + url: editPasswordUrl, + method: "PUT", + data + }).then((res: any) => { + resolve(res.data) + }).catch(err => { + resolve(err) + }) + }) +} + +export function userPage(data: any) { + return new Promise(resolve => { + getData(userPageUrl, data).then((res: any) => { + resolve(res.data) + }).catch(err => { + console.log(err) + }) + }) +} diff --git a/src/api/file-upload.ts b/src/api/file-upload.ts new file mode 100644 index 0000000..edd2862 --- /dev/null +++ b/src/api/file-upload.ts @@ -0,0 +1,25 @@ +import request from "@/utils/request"; + +export const fileUploadUrl = '/admin/sys-file/upload' + +export const handleHttpUpload = (options: any) => { + let formData = new FormData(); + formData.append('file', options.file); + formData.append('dir', options.dir) + return new Promise((resolve, reject) => { + try { + request({ + url: fileUploadUrl, + method: 'post', + headers: { + 'Content-Type': 'multipart/form-data', + }, + data: formData, + }).then((res: any) => { + resolve(res.data) + }); + } catch (error) { + reject(error) + } + }) +} \ No newline at end of file diff --git a/src/api/hospital.ts b/src/api/hospital.ts index 026d902..7197055 100644 --- a/src/api/hospital.ts +++ b/src/api/hospital.ts @@ -1,16 +1,15 @@ -import axios from "axios"; +import request, {CommonHeaderEnum} from "@/utils/request"; -const getHospitalListUrl = "/api/admin/hospital/getHospitalList" -const getHospitalPageUrl = "/api/admin/hospital/getHospitalPage" -const FORM_CONTENT_TYPE = 'application/x-www-form-urlencoded' +const getHospitalListUrl = "/admin/hospital/getHospitalList" +const getHospitalPageUrl = "/admin/hospital/getHospitalPage" export const getHospitalList = () => { return new Promise(resolve => { - axios.request({ + request({ url: getHospitalListUrl, method: 'post', headers: { - 'Content-Type': FORM_CONTENT_TYPE, + 'Content-Type': CommonHeaderEnum.FORM_CONTENT_TYPE, }, }).then(res => { resolve(res.data); diff --git a/src/api/log-manage.ts b/src/api/log-manage.ts new file mode 100644 index 0000000..e002adb --- /dev/null +++ b/src/api/log-manage.ts @@ -0,0 +1,21 @@ +import request, {CommonHeaderEnum} from "@/utils/request"; + +const getMonthlyLogCountUrl = '/admin/log/getMonthlyLogCount' + +export function getMonthlyLogCount(startTime: string, endTime: string) { + return new Promise(resolve => { + request({ + url: getMonthlyLogCountUrl, + method: 'post', + data: { + startTime, + endTime + }, + headers: { + 'Content-Type': CommonHeaderEnum.FORM_CONTENT_TYPE, + }, + }).then(res => { + resolve(res.data); + }) + }) +} \ No newline at end of file diff --git a/src/components/user-info.vue b/src/components/user-info.vue index 3c06e49..f74fd2f 100644 --- a/src/components/user-info.vue +++ b/src/components/user-info.vue @@ -1,71 +1,88 @@ diff --git a/src/static-data/core.ts b/src/static-data/core.ts index 6146871..5ee4a70 100644 --- a/src/static-data/core.ts +++ b/src/static-data/core.ts @@ -34,11 +34,11 @@ export const getMessageType = () => { export const getLogType = () => { const type = [] - type.push({ label: '正常', value: '正常' }) - type.push({ label: '异常', value: '异常' }) - type.push({ label: '添加', value: '添加' }) - type.push({ label: '删除', value: '删除' }) - type.push({ label: '编辑', value: '编辑' }) + type.push({ label: '正常', value: '0' }) + type.push({ label: '异常', value: '9' }) + type.push({ label: '添加', value: '1' }) + type.push({ label: '删除', value: '2' }) + type.push({ label: '编辑', value: '3' }) return type } diff --git a/src/utils/date-util.ts b/src/utils/date-util.ts index ca2f8b2..bcf51e1 100644 --- a/src/utils/date-util.ts +++ b/src/utils/date-util.ts @@ -87,4 +87,8 @@ export function getDays(date: any, days: number) { const time = date.setDate(date.getDate() + days); // 天数 return new Date(time); } +} + +export function getEndOfMonth(year: number, month: number) { + return new Date(year, month, 0).getDate() } \ No newline at end of file diff --git a/src/utils/request.ts b/src/utils/request.ts index 98d8a4f..7208f16 100644 --- a/src/utils/request.ts +++ b/src/utils/request.ts @@ -1,16 +1,29 @@ //进行axios二次封装:使用请求与响应拦截器 import axios from "axios"; +import {Session} from "@/utils/storage"; +import {decryption, encryption} from "@/utils/other"; +import {ElMessageBox} from "element-plus"; /* import { ElMessage } from 'element-plus' //引入用户相关的仓库 import useUserStore from '@/stores/modules/user' */ -export const HOST = 'http://localhost:9999'; -const BASE_URL = import.meta.env.BASE_URL +const BASE_URL = import.meta.env.VITE_RAX_BASE_URL + +export enum CommonHeaderEnum { + 'TENANT_ID' = 'TENANT-ID', + 'ENC_FLAG' = 'Enc-Flag', + 'AUTHORIZATION' = 'Authorization', + 'FORM_CONTENT_TYPE' = 'application/x-www-form-urlencoded' +} + +const axiosInstance = axios.create({ + baseURL: BASE_URL +}); export const get = (url: any, params: any, success: any) => { - axios.get(HOST + url, params) + axiosInstance.get(url, params) .then(res => { success(res); }) @@ -18,19 +31,63 @@ export const get = (url: any, params: any, success: any) => { success(err); }); }; -export const post = (url: any, params: any, config?: any) => { - return axios.post(HOST + url, params, config); +export const post = (url: any, params: any, success: any) => { + axiosInstance.post(url, params) + .then(res => { + success(res); + }) + .catch(err => { + success(err); + }); }; export const getMapJson = (name: string) => { - return axios.post(BASE_URL + '/static/json/' + name) + return axiosInstance.post(BASE_URL+'/static/json/' + name) } export const getData = (url: string, params?: any) => { - return axios.get(url, params) + return axiosInstance.get(url, params) } export const postData = (url: string, params?: any) => { - return axios.post(url, params) + return axiosInstance.post(url, params) } +axiosInstance.interceptors.request.use(data => { + const token = Session.getToken() + if (token && !data.headers?.skipToken) { + data.headers[CommonHeaderEnum.AUTHORIZATION] = `Bearer ${token}` + } + if (data.headers[CommonHeaderEnum.ENC_FLAG]) { + const val = encryption(JSON.stringify(data.data), import.meta.env.VITE_PWD_ENC_KEY) + data.data = { + encryption: val + } + } + return data +}) + +function handleResponse(response: any) { + if (response.data.code == 1) throw response.data + if (response.data.encryption) { + const val = JSON.parse(decryption(response.data.encryption, import.meta.env.VITE_PWD_ENC_KEY)) + response.data = val + } + return response +} + +axiosInstance.interceptors.response.use(handleResponse, error => { + const code = error.response.status || 200 + if (code == 424) { + ElMessageBox.confirm('令牌状态已过期,请点击重新登录', "系统提示", { + confirmButtonText: "确定", + cancelButtonText: "取消", + type: 'warning', + }); + Session.clear(); + window.location.href = '/'; + } + return error +}) + +export default axiosInstance /* //第一步:利用axios对象的create方法,去创建axios实例(其他的配置:基础路径、超时的时间) diff --git a/src/views/index.vue b/src/views/index.vue index 3d34ce6..df6b30d 100644 --- a/src/views/index.vue +++ b/src/views/index.vue @@ -1,71 +1,75 @@ diff --git a/src/views/login/login.vue b/src/views/login/login.vue index 1cf2142..5a65d33 100644 --- a/src/views/login/login.vue +++ b/src/views/login/login.vue @@ -4,7 +4,7 @@
- +
@@ -66,7 +66,7 @@ - +
@@ -94,8 +94,8 @@ - + @@ -121,20 +121,18 @@ + :height="sliderVConf.height" @success="sliderSuccess" @close="sliderClose"> diff --git a/src/views/permissions-manage/doctor-manage.vue b/src/views/permissions-manage/doctor-manage.vue index 0f63c9b..3d4affd 100644 --- a/src/views/permissions-manage/doctor-manage.vue +++ b/src/views/permissions-manage/doctor-manage.vue @@ -64,6 +64,7 @@ import { tableRemoveRow, exportData } from '@/utils/table-util' import CommonPagination from '@/components/common-pagination.vue' import DoctorForm from './form/doctor-form.vue' import ImportDialog from '@/components/import-dialog.vue' +import {userPage} from "@/api/acl/user"; const tableRef = ref() const doctorFormRef = ref() @@ -76,6 +77,8 @@ const queryParams = ref({ userName: '' } as any) const tableData = ref([] as any) +let current = 0; +const size = 10; queryData() @@ -102,6 +105,11 @@ function queryData(e?: any) { loading.value = false }, 200); } + userPage({ + current, + size, + name: queryParams.value.userName + }) } const addData = () => { isFormDialog.value = true diff --git a/src/views/remote-manage/remote-manage.vue b/src/views/remote-manage/remote-manage.vue index 4efd922..352272e 100644 --- a/src/views/remote-manage/remote-manage.vue +++ b/src/views/remote-manage/remote-manage.vue @@ -174,7 +174,10 @@ function getSurgeryData(username: string, db: string) { console.log(username, db); surgeryClient.publish({ destination: "/front/getSurgeryData", - body: JSON.stringify({status: "start", db, token: Session.get('token')}) + headers: { + token: Session.get('token') + }, + body: JSON.stringify({status: "start", db}) }); const account = "admin"; surgeryClient.subscribe('/topic/user/' + account + ":" + db + '/surgeryData', (data: any) => { diff --git a/vite.config.ts b/vite.config.ts index da944d9..31d21ab 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -24,14 +24,14 @@ export default defineConfig({ proxy: { '/api': { //target: 'http://192.168.137.235:9999', // 目标服务器地址 - target: 'http://192.168.71.44:9999', // 目标服务器地址 + target: 'http://localhost:8888', // 目标服务器地址 ws: true, // 是否启用 WebSocket changeOrigin: true, // 是否修改请求头中的 Origin 字段 rewrite: (path) => path.replace(/^\/api/, ''), }, '/socket.io': { //target: 'ws://192.168.137.235:9999', - target: 'ws://192.168.71.44:9999', + target: 'ws://localhost:8888', ws: true, changeOrigin: true, rewrite: (path) => path.replace(/^\/socket.io/, ''),