路由进度条

This commit is contained in:
熊猫 2024-03-31 13:13:41 +08:00
parent 503b1e1432
commit 2b42615aca
13 changed files with 140 additions and 119 deletions

View File

@ -16,7 +16,9 @@
"echarts": "^5.4.1", "echarts": "^5.4.1",
"element-plus": "2.3.1", "element-plus": "2.3.1",
"js-cookie": "^3.0.5", "js-cookie": "^3.0.5",
"nprogress": "^0.2.0",
"pinia": "^2.1.7", "pinia": "^2.1.7",
"progress": "^2.0.3",
"sass": "^1.58.3", "sass": "^1.58.3",
"uuid": "^9.0.1", "uuid": "^9.0.1",
"vant": "^4.8.3", "vant": "^4.8.3",

74
permisstion.ts Normal file
View File

@ -0,0 +1,74 @@
//路由鉴权:鉴权,项目当中路由能不能被的权限的设置(某一个路由什么条件下可以访问、什么条件下不可以访问)
import router from './src/router'
//@ts-ignore
import nprogress from 'nprogress'
//引入进度条样式
import 'nprogress/nprogress.css'
/*nprogress.configure({ showSpinner: false })
//获取用户相关的小仓库内部token数据,去判断用户是否登录成功
import useUserStore from './store/modules/user'
import pinia from './store'
const userStore = useUserStore(pinia)*/
//全局守卫:项目当中任意路由切换都会触发的钩子
//全局前置守卫
router.beforeEach(async (to: any, from: any, next: any) => {
nprogress.start();
next();
}
/*document.title = `${setting.title} - ${to.meta.title}`
//to:你将要访问那个路由
//from:你从来个路由而来
//next:路由的放行函数
nprogress.start()
//获取token,去判断用户登录、还是未登录
const token = userStore.token
//获取用户名字
const username = userStore.username
//用户登录判断
if (token) {
//登录成功,访问login,不能访问,指向首页
if (to.path == '/login') {
next({ path: '/' })
} else {
//登录成功访问其余六个路由(登录排除)
//有用户信息
if (username) {
//放行
next()
} else {
//如果没有用户信息,在守卫这里发请求获取到了用户信息再放行
try {
//获取用户信息
await userStore.userInfo()
//放行
//万一:刷新的时候是异步路由,有可能获取到用户信息、异步路由还没有加载完毕,出现空白的效果
next({ ...to })
} catch (error) {
//token过期:获取不到用户信息了
//用户手动修改本地存储token
//退出登录->用户相关的数据清空
await userStore.userLogout()
next({ path: '/login', query: { redirect: to.path } })
}
}
}
} else {
//用户未登录判断
if (to.path == '/login') {
next()
} else {
next({ path: '/login', query: { redirect: to.path } })
}
}
}*/)
//全局后置守卫
router.afterEach((to: any, from: any) => {
nprogress.done()
})
//第一个问题:任意路由切换实现进度条业务 ---nprogress
//第二个问题:路由鉴权(路由组件访问权限的设置)
//全部路由组件:登录|404|任意路由|首页|数据大屏|权限管理(三个子路由)|商品管理(四个子路由)
//用户未登录:可以访问login,其余六个路由不能访问(指向login)
//用户登录成功:不可以访问login[指向首页],其余的路由可以访问

View File

@ -1,11 +1,12 @@
import axios from "axios"; import axios from "axios";
import * as other from "@/utils/other"; import * as other from "@/utils/other";
import {HOST} from "@/utils/request"; import {get, HOST, post} from "@/utils/request";
import {ElMessage} from "element-plus"; import {ElMessage} from "element-plus";
const FORM_CONTENT_TYPE = 'application/x-www-form-urlencoded'; const FORM_CONTENT_TYPE = 'application/x-www-form-urlencoded';
const registerUrl = "/admin/register/user" const registerUrl = "/admin/register/user"
export const login = (data: any) => { export const login = (data: any) => {
return new Promise(resolve => { return new Promise(resolve => {
const basicAuth = 'Basic ' + window.btoa(import.meta.env.VITE_OAUTH2_PASSWORD_CLIENT); const basicAuth = 'Basic ' + window.btoa(import.meta.env.VITE_OAUTH2_PASSWORD_CLIENT);

View File

@ -1,53 +1,24 @@
/* /*
//用户管理模块的接口 //统一管理咱们项目用户相关的接口
import request from '@/utils/request' import request from '@/utils/request'
import type { import type {
UserResponseData, loginFormData,
User, loginResponseData,
AllRoleResponseData, userInfoReponseData,
SetRoleData,
} from './type' } from './type'
//枚举地址 //项目用户相关的请求地址
enum API { enum API {
//获取全部已有用户账号信息 LOGIN_URL = '/admin/acl/index/login',
ALLUSER_URL = '/admin/acl/user/', USERINFO_URL = '/admin/acl/index/info',
//添加一个新的用户账号 LOGOUT_URL = '/admin/acl/index/logout',
ADDUSER_URL = '/admin/acl/user/save',
//更新已有的用户账号
UPDATEUSER_URL = '/admin/acl/user/update',
//获取全部职位,当前账号拥有的职位接口
ALLROLEURL = '/admin/acl/user/toAssign/',
//给已有的用户分配角色接口
SETROLE_URL = '/admin/acl/user/doAssignRole',
//删除某一个账号
DELETEUSER_URL = '/admin/acl/user/remove/',
//批量删除的接口
DELETEALLUSER_URL = '/admin/acl/user/batchRemove',
} }
//获取用户账号信息的接口
export const reqUserInfo = (page: number, limit: number, username: string) => //登录接口
request.get<any, UserResponseData>( export const reqLogin = (data: loginFormData) =>
API.ALLUSER_URL + `${page}/${limit}/?username=${username}`, request.post<any, loginResponseData>(API.LOGIN_URL, data)
) //获取用户信息
//添加用户与更新已有用户的接口 export const reqUserInfo = () =>
export const reqAddOrUpdateUser = (data: User) => { request.get<any, userInfoReponseData>(API.USERINFO_URL)
//携带参数有ID更新 //退出登录
if (data.id) { export const reqLogout = () => request.post<any, any>(API.LOGOUT_URL)
return request.put<any, any>(API.UPDATEUSER_URL, data)
} else {
return request.post<any, any>(API.ADDUSER_URL, data)
}
}
//获取全部职位以及包含当前用户的已有的职位
export const reqAllRole = (userId: number) =>
request.get<any, AllRoleResponseData>(API.ALLROLEURL + userId)
//分配职位
export const reqSetUserRole = (data: SetRoleData) =>
request.post<any, any>(API.SETROLE_URL, data)
//删除某一个账号的信息
export const reqRemoveUser = (userId: number) =>
request.delete<any, any>(API.DELETEUSER_URL + userId)
//批量删除的接口
export const reqSelectUser = (idList: number[]) =>
request.delete(API.DELETEALLUSER_URL, { data: idList })
*/ */

View File

@ -1,55 +1,31 @@
/* /*
//账号信息的ts类型 //定义用户相关数据的ts类型
//用户登录接口携带参数的ts类型
export interface loginFormData {
username: string
password: string
}
//定义全部接口返回数据都拥有ts类型
export interface ResponseData { export interface ResponseData {
code: number code: number
message: string message: string
ok: boolean ok: boolean
} }
//代表一个账号信息的ts类型
export interface User { //定义登录接口返回数据类型
id?: number export interface loginResponseData extends ResponseData {
createTime?: string data: string
updateTime?: string
username?: string
password?: string
name?: string
phone?: null
roleName?: string
}
//数组包含全部的用户信息
export type Records = User[]
//获取全部用户信息接口返回的数据ts类型
export interface UserResponseData extends ResponseData {
data: {
records: Records
total: number
size: number
current: number
pages: number
}
} }
//代表一个职位的ts类型 //定义获取用户信息返回数据类型
export interface RoleData { export interface userInfoReponseData extends ResponseData {
id?: number
createTime?: string
updateTime?: string
roleName: string
remark: null
}
//全部职位的列表
export type AllRole = RoleData[]
//获取全部职位的接口返回的数据ts类型
export interface AllRoleResponseData extends ResponseData {
data: { data: {
assignRoles: AllRole routes: string[]
allRolesList: AllRole buttons: string[]
roles: string[]
name: string
avatar: string
} }
} }
//给用户分配职位接口携带参数的ts类型
export interface SetRoleData {
roleIdList: number[]
userId: number
}
*/ */

View File

@ -12,8 +12,9 @@ import TableAbility from '@/components/table-ability.vue'
import 'element-plus/dist/index.css'; import 'element-plus/dist/index.css';
import './assets/css/global.scss'; import './assets/css/global.scss';
import './assets/font/iconfont.css'; import './assets/font/iconfont.css';
import '@/assets/css/custom-element.scss' import '@/assets/css/custom-element.scss';
import '@/assets/css/animastore.css' import '@/assets/css/animastore.css';
import '../permisstion';
// import '@/utils/debugger' // import '@/utils/debugger'

View File

@ -110,7 +110,7 @@ export const constantRoute=[
}, },
{ {
path: '/logs-manage', path: '/logs-manage',
name: '日志管理', name: '系统管理',
redirect: '/logs-manage/message-manage', redirect: '/logs-manage/message-manage',
component: () => import('@/views/logs-manage/index.vue'), component: () => import('@/views/logs-manage/index.vue'),
children: [ children: [

View File

@ -111,7 +111,7 @@ export const getMenuData = () => {
}) })
menu.push({ menu.push({
id: '5', id: '5',
menuName: '日志管理', menuName: '系统管理',
order: 1, order: 1,
icon: 'icon-setting', icon: 'icon-setting',
route: '/logs-manage', route: '/logs-manage',

View File

@ -18,17 +18,11 @@ export const get = (url: any, params: any, success: any) => {
success(err); success(err);
}); });
}; };
export const post = (url: any, params: any, success: any) => { export const post = (url: any, params: any, config?: any) => {
axios.post(HOST + url, params) return axios.post(HOST + url, params, config);
.then(res => {
success(res);
})
.catch(err => {
success(err);
});
}; };
export const getMapJson = (name: string) => { export const getMapJson = (name: string) => {
return axios.post(BASE_URL+'/static/json/' + name) return axios.post(BASE_URL + '/static/json/' + name)
} }
export const getData = (url: string, params?: any) => { export const getData = (url: string, params?: any) => {
return axios.get(url, params) return axios.get(url, params)

View File

@ -85,14 +85,14 @@ switch (userInfo.permissions) {
menus.push({ label: '患者管理', path: '/patients-manage', icon: 'icon-renyuanguanli' }) menus.push({ label: '患者管理', path: '/patients-manage', icon: 'icon-renyuanguanli' })
menus.push({ label: '远程管理', path: '/remote-manage', icon: 'icon-anquanbaozhang' }) menus.push({ label: '远程管理', path: '/remote-manage', icon: 'icon-anquanbaozhang' })
menus.push({ label: '后台管理', path: '/system-manage', icon: 'icon-houtaiguanli' }) menus.push({ label: '后台管理', path: '/system-manage', icon: 'icon-houtaiguanli' })
menus.push({ label: '日志管理', path: '/logs-manage', icon: 'icon-setting' }) menus.push({ label: '系统管理', path: '/logs-manage', icon: 'icon-setting' })
break; break;
case '高级管理员': case '高级管理员':
menus.push({ label: '首页', path: '/home', icon: 'icon-shouye' }) menus.push({ label: '首页', path: '/home', icon: 'icon-shouye' })
menus.push({ label: '权限管理', path: '/permissions-manage', icon: 'icon-users' }) menus.push({ label: '权限管理', path: '/permissions-manage', icon: 'icon-users' })
menus.push({ label: '患者管理', path: '/patients-manage', icon: 'icon-renyuanguanli' }) menus.push({ label: '患者管理', path: '/patients-manage', icon: 'icon-renyuanguanli' })
menus.push({ label: '远程管理', path: '/remote-manage', icon: 'icon-anquanbaozhang' }) menus.push({ label: '远程管理', path: '/remote-manage', icon: 'icon-anquanbaozhang' })
menus.push({ label: '日志管理', path: '/logs-manage', icon: 'icon-setting' }) menus.push({ label: '系统管理', path: '/logs-manage', icon: 'icon-setting' })
break; break;
case '中级管理员': case '中级管理员':
menus.push({ label: '首页', path: '/home', icon: 'icon-shouye' }) menus.push({ label: '首页', path: '/home', icon: 'icon-shouye' })

View File

@ -162,18 +162,18 @@ const validatorUserName = (rule: any, value: any, callback: any) => {
//value: //value:
//:callBack //:callBack
//callBack, //callBack,
if (value.length >= 4) { if (/^[a-zA-Z0-9_-]{4,16}$/) {
callback(); callback();
} else { } else {
callback(new Error('账号长度至少4位')); callback(new Error('账号长度4到16(字母,数字,下划线,减号)'));
} }
} }
const validatorPassword = (rule: any, value: any, callback: any) => { const validatorPassword = (rule: any, value: any, callback: any) => {
if (value.length >= 6) { if (/^\S*(?=\S{6,})(?=\S*\d)(?=\S*[A-Z])(?=\S*[a-z])(?=\S*[!@#$%^&*? ])\S*$/) {
callback(); callback();
} else { } else {
callback(new Error('密码长度至少6位')); callback(new Error('密码最少6位包括至少1个大写字母1个小写字母1个数字1个特殊字符'));
} }
} }
@ -324,22 +324,24 @@ const sendCode = () => {
}, 1000); }, 1000);
} }
const login = async (type: string) => { const login = async (type: string) => {
//:
loading.value=true;
const obj = loginParams.value const obj = loginParams.value
if (!currentHospital.value) { if (!currentHospital.value) {
ElMessage.warning('请在右上角选择院区') ElMessage.warning('请在右上角选择院区')
return return
} }
//
await loginFormRef.value.validate((valid: any, fields: any) => { await loginFormRef.value.validate((valid: any, fields: any) => {
if (valid) { if (valid) {
// console.log('submit!') // console.log('submit!')
sliderVConf.value.isShowSelf = true sliderVConf.value.isShowSelf = true;
} else { } else {
// console.log('error submit!', fields) // console.log('error submit!', fields)
} }
//:
loading.value = true;
/*try { /*try {
// //
@ -364,8 +366,7 @@ const login = async (type: string) => {
})*/ })*/
}) })
//
loading.value = false;
} }
function getCaptchaCode() { function getCaptchaCode() {
@ -399,7 +400,6 @@ const toHome = () => {
title: `HI,${getTime()}` title: `HI,${getTime()}`
}); });
const getPermissions = () => { const getPermissions = () => {
let permissions = '普通用户' let permissions = '普通用户'
switch (loginParams.value.account) { switch (loginParams.value.account) {

View File

@ -16,7 +16,7 @@
</div> </div>
<div class="button-part" style="justify-content: space-between;"> <div class="button-part" style="justify-content: space-between;">
<div> <div>
<el-button type="primary" icon="FirstAidKit" @click="addData">新增</el-button> <!-- <el-button type="primary" icon="FirstAidKit" @click="addData">新增</el-button>-->
<el-button icon="FirstAidKit" @click="importData">导入</el-button> <el-button icon="FirstAidKit" @click="importData">导入</el-button>
<el-button icon="Delete" @click="removeData()">删除</el-button> <el-button icon="Delete" @click="removeData()">删除</el-button>
</div> </div>

View File

@ -23,13 +23,15 @@ export default defineConfig({
server: { server: {
proxy: { proxy: {
'/api': { '/api': {
target: 'http://localhost:9999', // 目标服务器地址 //target: 'http://192.168.137.235:9999', // 目标服务器地址
target: 'http://192.168.71.44:9999', // 目标服务器地址
ws: true, // 是否启用 WebSocket ws: true, // 是否启用 WebSocket
changeOrigin: true, // 是否修改请求头中的 Origin 字段 changeOrigin: true, // 是否修改请求头中的 Origin 字段
rewrite: (path) => path.replace(/^\/api/, ''), rewrite: (path) => path.replace(/^\/api/, ''),
}, },
'/socket.io': { '/socket.io': {
target: 'ws://localhost:9999', //target: 'ws://192.168.137.235:9999',
target: 'ws://192.168.71.44:9999',
ws: true, ws: true,
changeOrigin: true, changeOrigin: true,
rewrite: (path) => path.replace(/^\/socket.io/, ''), rewrite: (path) => path.replace(/^\/socket.io/, ''),