diff --git a/src/Permission.vue b/src/Permission.vue new file mode 100644 index 0000000..c64b8da --- /dev/null +++ b/src/Permission.vue @@ -0,0 +1,60 @@ + + + + + diff --git a/src/components/Sidebar.vue b/src/components/Sidebar.vue index 1b7b5b0..a8e480d 100644 --- a/src/components/Sidebar.vue +++ b/src/components/Sidebar.vue @@ -27,12 +27,12 @@ export default { }, { path: "/upgradation", - name: "上传Apk", - }, - { - path: "/upgradationOta", - name: "上传Ota", + name: "上传APK/OTA", }, + // { + // path: "/upgradationOta", + // name: "上传Ota", + // }, { path: "/activity", name: "活动列表", diff --git a/src/main.js b/src/main.js index d50880b..b592b15 100644 --- a/src/main.js +++ b/src/main.js @@ -36,14 +36,41 @@ Vue.component(UTableColumn.name, UTableColumn); //使用钩子函数对路由进行权限跳转 router.beforeEach((to, from, next) => { document.title = `${to.meta.title} | 运维管理系统`; + // 获取用户的角色和token + const role = localStorage.getItem("role"); const token = localStorage.getItem("token"); + + // 如果没有token,并且不是登录页面,重定向到登录页面 if (!token && to.path !== "/login") { - next({ - path: "/login", - }); - } else { - next(); + return next({ path: "/login" }); + } + // 如果用户是超级管理员(role == 0),则允许访问任何页面 + if (role === "0") { + return next(); + } + // 如果用户从登录页面跳转到其他页面,并且已经拥有token,则允许通过 + if (from.path === "/login" && token) { + return next(); + } + // 获取权限列表(这里假设permissions是从后端获取的权限数组) + const permissions = JSON.parse(localStorage.getItem("menuPermission")) || []; + + // 检查用户是否有访问当前路由的权限 + const hasPermission = permissions.some( + (permission) => permission.key === to.path + ); + + // 如果路由需要权限,但用户没有权限,则重定向到无权限页面 + if (to.meta.requiresAuth && !hasPermission) { + return next({ path: "/permission" }); + } + + // 如果路由在免登录白名单中,则直接通过 + if (to.meta.noAuth) { + return next(); } + // 如果以上条件都不满足,正常通过 + next(); }); new Vue({ diff --git a/src/router/index.js b/src/router/index.js index 0ddeae9..ac8ba79 100644 --- a/src/router/index.js +++ b/src/router/index.js @@ -4,10 +4,20 @@ import VueRouter from "vue-router"; Vue.use(VueRouter); const routes = [ + { path: "/login", + name: "login", component: () => import("../views/login/index.vue"), - meta: { title: "登录" }, + meta: { title: "登录", noAuth: true }, // 标记为免登录页面 + }, + { + // 权限页面 + path: "/permission", + name: "permission", + component: () => + import(/* webpackChunkName: "permission" */ "../Permission.vue"), + meta: { title: "权限测试" }, }, { path: "/", @@ -21,6 +31,7 @@ const routes = [ meta: { title: "首页", keepAlive: true, + noAuth: true, }, }, { @@ -50,15 +61,7 @@ const routes = [ keepAlive: true, }, }, - { - path: "/upgradationOta", - component: () => import("../views/upgradationOta/index.vue"), - name: "upgradationOta", - meta: { - title: "上传Ota", - keepAlive: true, - }, - }, + { path: "/activity", component: () => import("../views/activityList/index.vue"), diff --git a/src/store/index.js b/src/store/index.js index d7edee2..e600128 100644 --- a/src/store/index.js +++ b/src/store/index.js @@ -6,11 +6,87 @@ Vue.use(Vuex); export default new Vuex.Store({ state: { //用户登录token 存储 - + token: "", + userName: "", + uid: "", + role: "", + currentData: "", + channelId: "", + termId: "", + protocol: "", + cmdId: "", + channelIdList: [], isRenderTab: true, }, - getters: {}, + getters: { + token: (state) => state.token, + userName: (state) => state.userName, + role: (state) => state.role, + menuPermission: (state) => state.resources, + }, mutations: { + //点击获取的左侧列表 + currentData(state, currentData) { + state.currentData = currentData; + console.log("保存起来currentData", state.currentData); + localStorage.setItem("currentData", JSON.stringify(currentData)); + }, + + channelId(state, channelId) { + state.channelId = channelId; + console.log("channelId", state.channelId); + localStorage.setItem("channelId", JSON.stringify(channelId)); + }, + termId(state, termId) { + state.termId = termId; + console.log("termId", state.termId); + localStorage.setItem("termId", JSON.stringify(termId)); + }, + + protocol(state, protocol) { + state.protocol = protocol; + console.log("protocol", state.protocol); + localStorage.setItem("protocol", JSON.stringify(protocol)); + }, + cmdId(state, cmdId) { + state.cmdId = cmdId; + console.log("protocol", state.cmdId); + localStorage.setItem("protocol", JSON.stringify(cmdId)); + }, + channelIdList(state, channelIdList) { + state.channelIdList = channelIdList; + console.log("channelIdList", state.channelIdList); + localStorage.setItem("channelIdList", JSON.stringify(channelIdList)); + }, + + SET_TOKEN(state, token) { + state.token = token; + localStorage.setItem("token", state.token); + }, + SET_USERINFO(state, val) { + state.userName = val.userName; + state.uid = val.uid; + state.role = val.role; + if (val.role !== 0) { + state.resources = val.resources; + const menuArr = val.resources + .filter((item) => item.key.includes("/")) + .sort((a, b) => a.id - b.id); + const btnArr = val.resources + .filter((item) => item.key.includes("Btn")) + .sort((a, b) => a.id - b.id); + localStorage.setItem("menuPermission", JSON.stringify(menuArr)); + localStorage.setItem("btnPermission", JSON.stringify(btnArr)); + } + + localStorage.setItem("userName", state.userName); + localStorage.setItem("uid", state.uid); + localStorage.setItem("role", state.role); + }, + //退出清除locastorge + REMOVE_INFO(state) { + localStorage.clear(); + }, setIsRenderTab(state, data) { state.isRenderTab = data; }, diff --git a/src/utils/api/index.js b/src/utils/api/index.js index cc6e08c..9594337 100644 --- a/src/utils/api/index.js +++ b/src/utils/api/index.js @@ -2,171 +2,216 @@ import request from "../request"; //获取登录 export function loginJoggle(data) { return request({ - url: "api/login.php", + url: "/xymanager/login", method: "post", data, }); } -//获取line -export function getqueryLineApi(data) { + +//获取用户装置信息 +export function getTerminalJoggle(data) { return request({ - url: "api/queryLine.php", + url: "/xymanager/terminal/listForMaintain", method: "get", params: data, - headers: { - "Content-Type": "application/x-www-form-urlencoded;charset=UTF-8", - }, }); } -export function getqueryTermsApi(data) { +export function exportTerminalApi(data) { return request({ - url: "api/queryTerms.php", + url: "/xymanager/terminal/exportForMaintain", method: "get", params: data, - headers: { - "Content-Type": "application/x-www-form-urlencoded;charset=UTF-8", - }, + responseType: 'blob' }); } -//获取规约 -export function getqueryProtocolApi(data) { + +//获取规约 +export function getProtocolList(data) { return request({ - url: "api/queryProtocol.php", + url: "/xymanager/getProtocolList", method: "get", params: data, - headers: { - "Content-Type": "application/x-www-form-urlencoded;charset=UTF-8", - }, + }); +} +//获取 电压 线路 杆塔 +export function getSearchInfo(data) { + return request({ + url: "/xymanager/getLineAndGt", + method: "post", + data, }); } -//运维,快心跳 -export function getdoActionApi(data) { +//获取活动列表 +export function getActivityApi(data) { return request({ - url: "api/doAction.php", + url: "/xymanager/activity/listAll", method: "get", params: data, + }); +} +//新增活动列表 +export function addActiveApi(data) { + return request({ + url: "/xymanager/activity/add", + method: "post", + data, + }); +} +//修改活动列表 +export function updActiveApi(data) { + return request({ + url: "/xymanager/activity/update", + method: "post", + data, + }); +} + +//删除活动列表 +export function delActiveApi(data) { + return request({ + url: "/xymanager/activity/delete", + method: "post", + data, headers: { "Content-Type": "application/x-www-form-urlencoded;charset=UTF-8", }, }); } -//上传日志列表 -export function getqueryUploadsApi(data) { +////运维,快心跳 +export function cmdSendApi(data) { + return request({ + url: "/xymanager/cmd/send", + method: "post", + data, + }); +} + +//获取命令列表 +export function getCmdActionApi(data) { return request({ - url: "api/queryUploads.php", + url: "/xymanager/cmd/listAction", method: "get", params: data, - headers: { - "Content-Type": "application/x-www-form-urlencoded;charset=UTF-8", - }, }); } -//删除日志列表 -export function updUploadApi(data) { + +//查询正在下发的命令 +export function cmdActlistApi(data) { return request({ - url: "api/updUpload.php", + url: "/xymanager/cmd/list", method: "get", params: data, - headers: { - "Content-Type": "application/x-www-form-urlencoded;charset=UTF-8", - }, }); } -//获取信息装置的信息 -export function getqueryRawApi(data) { + +//查询已经下发的命令 +export function cmdActHislistApi(data) { return request({ - url: "api/queryRawData.php", + url: "/xymanager/cmd/listHistory", method: "get", params: data, - headers: { - "Content-Type": "application/x-www-form-urlencoded;charset=UTF-8", - }, }); } -//带下发状态 -export function getqueryCmdsApi(data) { +//查询历史心跳信息 + +export function heartListApi(data) { return request({ - url: "api/queryCmds.php", + url: "/xymanager/terminal/listReport", method: "get", params: data, - headers: { - "Content-Type": "application/x-www-form-urlencoded;charset=UTF-8", - }, }); } -//上传apk - -export function postuploadFileApi(data) { +//修改备注 +export function updCommentApi(data) { return request({ - url: "api/uploadFile.php", + url: "/xymanager/terminal/updateComment", method: "post", - params: data, - headers: { - "Content-Type": "multipart/form-data", // set the content type to multipart/form-data - }, + data, }); } -//获取上传列表 -export function getqueryUpgradesApi(data) { + +//日志列表相关接口 +export function logListApi(data) { return request({ - url: "api/queryUpgrades.php", + url: "/xymanager/upload/listAll", method: "get", params: data, + }); +} +//日志删除 +export function logDeleteApi(data) { + return request({ + url: "/xymanager/upload/delete", + method: "post", + data, headers: { "Content-Type": "application/x-www-form-urlencoded;charset=UTF-8", }, }); } -//删除列表 -export function getupdUpgradeApi(data) { + +//获取升级列表 +export function upgradeListApi(data) { return request({ - url: "api/updUpgrade.php", + url: "/xymanager/upgrade/listAll", method: "get", params: data, - headers: { - "Content-Type": "application/x-www-form-urlencoded;charset=UTF-8", - }, }); } - -//新建活动和删除活动 - -export function updActivityApi(data) { +//修改备注 +export function upgradeTitleApi(data) { return request({ - url: "api/updActivity.php", + url: "/xymanager/upgrade/updateTitle", method: "post", data, - headers: { - "Content-Type": "multipart/form-data", // set the content type to multipart/form-data - }, }); } -//获取活动列表和详细列表 -export function getqueryActivityApi(data) { +//上传升级文件 +export function upgradeUpLoadApi(data, onUploadProgress) { return request({ - url: "api/queryActivity.php", - method: "get", - params: data, + url: "/xymanager/upgrade/upload", + method: "post", + data, headers: { - "Content-Type": "application/x-www-form-urlencoded;charset=UTF-8", + "Content-Type": "multipart/form-data", // set the content type to multipart/form-data }, + onUploadProgress: onUploadProgress, // 允许外部传递进度回调函数 }); } - -export function updComment(data) { +//删除升级的文件 +export function upgradeDeleteApi(data) { return request({ - url: "api/updComment.php", - method: "get", - params: data, + url: "/xymanager/upgrade/delete", + method: "post", + data, headers: { "Content-Type": "application/x-www-form-urlencoded;charset=UTF-8", }, }); } + + + + + + + + + + + + + + + + + + + diff --git a/src/utils/request.js b/src/utils/request.js index cecd94f..a5169b6 100644 --- a/src/utils/request.js +++ b/src/utils/request.js @@ -7,73 +7,68 @@ const service = axios.create({ // easy-mock服务挂了,暂时不使用了 // baseURL: '', // timeout: 5000 - baseURL: "/web", //把原来的项目地址,改成api,解决跨域问题 + baseURL: "api", //把原来的项目地址,改成api,解决跨域问题 timeout: 30000, }); -// 添加请求拦截器,一下内容是axios的拦截器,可以不用写 -service.interceptors.request.use( - function (config) { - // 在发送请求之前做些什么 - return config; - }, - function (error) { - // 对请求错误做些什么 - return Promise.reject(error); +service.interceptors.request.use((config) => { + if (localStorage.getItem("token")) { + // console.log("aaaaaaaaaaaaaa", localStorage.getItem("token")); + config.headers.Authorization = localStorage.getItem("token"); } -); - -// 添加响应拦截器 + return config; +}); service.interceptors.response.use( - function (response) { - // 对响应数据做点什么 - return response.data; + (response) => { + const res = response.data; + if (res.code !== 200) { + if (res.code === 401) { + Message({ + showClose: true, + message: res.msg, + type: "error", + duration: 1500, + }); + localStorage.removeItem("token"); + router.push("/login"); + } + + if (res.code === 400) { + Message({ + showClose: true, + message: res.msg, + type: "error", + duration: 1500, + }); + } + if (res.code === 500) { + //alert(res.msg || "Error"); + + Message({ + showClose: true, + message: res.msg, + type: "error", + duration: 1500, + }); + } + if (!res.code) { // 如果没有返回code,可能是下载excel + // return resolve(response.data, res); + return res + } + return Promise.reject(new Error(res.msg || "Error")); + } else { + return res; + } }, - function (error) { - // 对响应错误做点什么 + (error) => { + Message({ + message: error.message, + showClose: true, + type: "error", + duration: 1500, + }); return Promise.reject(error); } ); -export default service; -// service.interceptors.request.use((config) => { -// if (localStorage.getItem("token")) { -// config.headers.sessionId = localStorage.getItem("token"); -// } -// return config; -// }); -// service.interceptors.response.use( -// (response) => { -// const res = response.data; -// if (res.code !== 200) { -// if (res.code === 401) { -// Message({ message: res.msg, type: "error", duration: 1500 }); -// router.push("/login"); -// } -// if (res.code === 400) { -// Message({ message: res.msg, type: "error", duration: 1500 }); -// } - -// if (res.code === 500) { -// Message({ -// showClose: true, -// message: 服务器错误(500), -// type: "error", -// duration: 1500, -// }); -// } -// return Promise.reject(new Error(res.msg || "Error")); -// } else { -// return res; -// } -// }, -// (error) => { -// Message({ -// message: error.message, -// showClose: true, -// type: "error", -// duration: 1500, -// }); -// return Promise.reject(error); -// } -// ); +export default service; diff --git a/src/views/activityList/index.vue b/src/views/activityList/index.vue index e01dedc..c082387 100644 --- a/src/views/activityList/index.vue +++ b/src/views/activityList/index.vue @@ -106,8 +106,8 @@ > - - + + - diff --git a/src/views/homePage/index.vue b/src/views/homePage/index.vue index b2360fc..1af0ba5 100644 --- a/src/views/homePage/index.vue +++ b/src/views/homePage/index.vue @@ -8,6 +8,21 @@ class="demo-form-inline" >
+ + + + + + - {{ item.vname + item.name }} + @@ -45,13 +60,15 @@ - + + > + + @@ -61,7 +78,9 @@ :key="item.id" :label="item.name" :value="item.id" - > + > + {{ item.name }}-{{ item.id }} + @@ -79,10 +98,10 @@
-
- +
+ @@ -94,8 +113,8 @@ placement="top" > @@ -104,7 +123,7 @@ @@ -115,8 +134,8 @@ placement="top" > @@ -125,7 +144,7 @@ @@ -136,8 +155,8 @@ placement="top" > @@ -146,7 +165,7 @@ @@ -157,8 +176,8 @@ placement="top" > @@ -168,7 +187,7 @@ 查询 重置 -
+
@@ -147,9 +167,9 @@ export default { } .buttonText { cursor: pointer; - color: #606266; + white-space: pre-wrap; &:hover { - color: #337ab7; + text-decoration: underline; } } diff --git a/src/views/login/index.vue b/src/views/login/index.vue index 3087652..254c2c4 100644 --- a/src/views/login/index.vue +++ b/src/views/login/index.vue @@ -39,7 +39,9 @@ - diff --git a/src/views/userList/components/setPermission.vue b/src/views/userList/components/setPermission.vue index 545d0b8..efd0ff7 100644 --- a/src/views/userList/components/setPermission.vue +++ b/src/views/userList/components/setPermission.vue @@ -43,7 +43,7 @@