群控系统服务端开发模式-应用开发-前端个人资料开发

news2024/12/23 18:54:51

一、总结

        其实程序开发到现在,简单的后端框架就只剩下获取登录账号信息及获取登录账号菜单这两个功能咯。详细见下图:

        1、未登录时总业务流程图

        2、登录后总业务流程图

二、获取登录账号信息对接

        在根目录下src文件夹下store文件夹下modules文件夹下的user.js文件中,修改代码如下:

const state = {
    token: getToken(),
    username: '',
    avatar: '',
    email: '',
    realname: '',
    department_title: '',
    grade_title: '',
    rolename: '',
    roles: [],
    butts: []
}

const mutations = {
    SET_TOKEN: (state, token) => {
        state.token = token
    },
    SET_EMAIL: (state, email) => {
        state.email = email
    },
    SET_USERNAME: (state, username) => {
        state.username = username
    },
    SET_AVATAR: (state, avatar) => {
        state.avatar = avatar
    },
    SET_REALNAME: (state, realname) => {
        state.realname = realname
    },
    SET_DEPARTMENT_TITLE: (state, department_title) => {
        state.department_title = department_title
    },
    SET_GRADE_TITLE: (state, grade_title) => {
        state.grade_title = grade_title
    },
    SET_ROLENAME: (state, rolename) => {
        state.rolename = rolename
    },
    SET_BUTTS: (state, butts) => {
        state.butts = butts
    },
    SET_ROLES: (state, roles) => {
        state.roles = roles
    }
}
// get user info
getInfo({commit, state}) {
    return new Promise((resolve, reject) => {
        getInfo().then(response => {
            const {data} = response
            if (!data) {
                reject('验证失败,请重新登录。')
            }
            const { butt, key, username, avatar, email, realname, department_title, grade_title, rolename } = data
            if (!butt || butt.length <= 0) {
                reject('您权限不足,请联系系统管理员')
            }
            commit('SET_BUTTS', butt)
            commit('SET_ROLES', key)
            commit('SET_USERNAME', username)
            commit('SET_AVATAR', avatar)
            commit('SET_EMAIL', email)
            commit('SET_REALNAME', realname)
            commit('SET_DEPARTMENT_TITLE', department_title)
            commit('SET_GRADE_TITLE', grade_title)
            commit('SET_ROLENAME', rolename)
            resolve(key)
        }).catch(error => {
            reject(error)
        })
    })
},

三、获取登录账号菜单信息对接

       获取菜单这块,需要更改两部分,第一部分就是路由修改,第二部分才是菜单转换成路由

        1、路由修改

                在根目录下src文件夹下route文件夹下,修改index.js文件,代码如下

import Vue from 'vue'
import Router from 'vue-router'

/* Layout */
import Layout from '@/layout'

Vue.use(Router)

/**
 * Note: sub-menu only appear when route children.length >= 1
 * Detail see: https://panjiachen.github.io/vue-element-admin-site/guide/essentials/router-and-nav.html
 *
 * hidden: true                   if set true, item will not show in the sidebar(default is false)
 * alwaysShow: true               if set true, will always show the root menu
 *                                if not set alwaysShow, when item has more than one children route,
 *                                it will becomes nested mode, otherwise not show the root menu
 * redirect: noRedirect           if set noRedirect will no redirect in the breadcrumb
 * name:'router-name'             the name is used by <keep-alive> (must set!!!)
 * meta : {
    roles: ['admin','editor']    control the page roles (you can set multiple roles)
    title: 'title'               the name show in sidebar and breadcrumb (recommend set)
    icon: 'svg-name'/'el-icon-x' the icon show in the sidebar
    noCache: true                if set true, the page will no be cached(default is false)
    affix: true                  if set true, the tag will affix in the tags-view
    breadcrumb: false            if set false, the item will hidden in breadcrumb(default is true)
    activeMenu: '/example/list'  if set path, the sidebar will highlight the path you set
  }
 */

/**
 * constantRoutes
 * a base page that does not have permission requirements
 * all roles can be accessed
 */
export const constantRoutes = [
  {
    path: '/redirect',
    component: Layout,
    hidden: true,
    children: [
      {
        path: '/redirect/:path(.*)',
        component: () => import('@/views/redirect/index')
      }
    ]
  },
  {
    path: '/login',
    component: () => import('@/views/login/index'),
    hidden: true
  },
  {
    path: '/404',
    component: () => import('@/views/error-page/404'),
    hidden: true
  },
  {
    path: '/401',
    component: () => import('@/views/error-page/401'),
    hidden: true
  },
  {
    path: '/',
    component: Layout,
    redirect: '/dashboard',
    children: [
      {
        path: 'dashboard',
        component: () => import('@/views/dashboard/index'),
        name: '首页',
        meta: { title: '首页', icon: 'dashboard', affix: true }
      }
    ]
  },
  {
    path: '/profile',
    component: Layout,
    redirect: '/profile/index',
    hidden: true,
    children: [
      {
        path: 'index',
        component: () => import('@/views/profile/index'),
        name: 'Profile',
        meta: { title: 'Profile', icon: 'user', noCache: true }
      }
    ]
  }
]

/**
 * asyncRoutes
 * the routes that need to be dynamically loaded based on user roles
 */
export const asyncRoutes = [
  // 404 page must be placed at the end !!!
  { path: '*', redirect: '/404', hidden: true }
]

const createRouter = () => new Router({
  // mode: 'history', // require service support
  scrollBehavior: () => ({ y: 0 }),
  routes: constantRoutes
})

const router = createRouter()

// Detail see: https://github.com/vuejs/vue-router/issues/1234#issuecomment-357941465
export function resetRouter() {
  const newRouter = createRouter()
  router.matcher = newRouter.matcher // reset router
}

export default router

        2、登录者菜单转换成路由

                在根目录下src文件夹下store文件夹下modules文件夹下,修改permission.js文件,代码如下

import {asyncRoutes, constantRoutes} from '@/router'
import {getPersonalMenu} from '@/api/common'
import {warn} from '@/utils/message'
import Layout from '@/layout'

/**
 * Use meta.role to determine if the current user has permission
 * @param roles
 * @param route
 */
function hasPermission(roles, route) {
    if (route.meta && route.meta.roles) {
        return roles.some(role => route.meta.roles.includes(role))
    } else {
        return true
    }
}

/**
 * Filter asynchronous routing tables by recursion
 * @param routes asyncRoutes
 * @param roles
 */
export function filterAsyncRoutes(routes, roles) {
    const res = []
    routes.forEach(route => {
        const tmp = {...route}
        if (hasPermission(roles, tmp)) {
            if (tmp.children) {
                tmp.children = filterAsyncRoutes(tmp.children, roles)
            }
            res.push(tmp)
        }
    })

    return res
}

const state = {
    routes: [],
    addRoutes: []
}

const mutations = {
    SET_ROUTES: (state, routes) => {
        state.addRoutes = routes
        state.routes = constantRoutes.concat(routes)
    }
}


/**
 * 后台查询的菜单数据拼装成路由格式的数据
 * @param routes
 */
export function generaMenu(routes, data) {
    data.forEach(item => {
        const menu = {
            path: item.path === '#' ? item.id + '_key' : item.path,
            component: item.component === '#' ? Layout : resolve => require([`@/views/${item.component}`], resolve),
            hidden: item.is_hidden,
            redirect: item.redirect,
            children: [],
            name: 'menu_' + item.menuname,
            alwaysShow: item.always_show,
            meta: {
                title: item.title,
                id: item.id,
                icon: item.is_icon === 1 ? item.icon : '',
                /* affix: item.affix,*/
                noCache: item.is_cache
            }
        }
        // 一级路由
        if (!item.children && item.pid === 0) {
            menu.name = undefined
            menu.children = [
                {
                    path: item.path,
                    component: resolve => require([`@/views/${item.path}`], resolve),
                    name: 'menu_' + item.menuname,
                    meta: {
                        title: item.title,
                        icon: item.is_icon === 1 ? item.icon : '',
                        noCache: item.is_cache,
                        //affix: item.affix
                    }
                }
            ]
        }
        // 二级路由
        if (item.children) {
            generaMenu(menu.children, item.children)
        }
        routes.push(menu)
    })
}

function filterMenus(localMenus, remoteMenus) {
    const res = []
    localMenus.forEach(local => {
        remoteMenus.forEach(remote => {
            if (remote.path === local.path) {
                local.meta.roles = remote.roleSlugs
                if (local.children && remote.children) {
                    local.children = filterMenus(local.children, remote.children)
                }
                res.push(local)
            }
        })
    })
    return res
}

const actions = {
    generateRoutes({commit, state}, key) {
        return new Promise(resolve => {
            const loadMenuData = []
            getPersonalMenu().then(res => {
                if (res.code === 50034) {
                    reject(res.message)
                } else if (res.code === 50000) {
                    warn(res.message)
                } else {
                    const remoteRoutes = res.data.menu
                    Object.assign(loadMenuData, remoteRoutes)
                    const tempAsyncRoutes = Object.assign([], asyncRoutes)
                    generaMenu(tempAsyncRoutes, loadMenuData)
                    let accessedRoutes
                    /*if (key == 'admin') {
                        accessedRoutes = tempAsyncRoutes || []
                    } else {
                        accessedRoutes = filterAsyncRoutes(tempAsyncRoutes, key)
                    }*/
                    accessedRoutes = filterAsyncRoutes(tempAsyncRoutes, key)
                    commit('SET_ROUTES', accessedRoutes)
                    resolve(accessedRoutes)
                }
            }).catch(error => {
                reject(error)
            })
        })
    }
}

export default {
    namespaced: true,
    state,
    mutations,
    actions
}

四、提前说明

        此时就已经可以登录到系统里面去了,结果如下图。明天将完成个人资料页面、退出及后端过期退出自动更新数据库的退出数据。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2239667.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Harmony- List组件最后一个item显示不全

在使用List组件显示数据的时候会出现最后一个item显示不全的问题&#xff0c;如下 出现在高度问题上&#xff0c;如果List组件上下没有其他占位组件就是正常显示的 解决方案&#xff1a; 1.给List组件加上layoutWeight(1)&#xff0c;使它填满父控件剩余空间; 2.还有一种情况…

Go语言实现用户登录Web应用

文章目录 1. Go语言Web框架1.1 框架比较1.2 安装Gin框架 2. 实现用户登录功能2.1 创建项目目录2.2 打开项目目录2.3 创建登录Go程序2.4 创建模板页面2.4.1 登录页面2.4.2 登录成功页面2.4.3 登录失败页面 3. 测试用户登录项目3.1 运行登录主程序3.2 访问登录页面3.3 演示登录成…

25浙江省考--两大模块(数量关系+常识判断)题型积累【2024.12.8考前每日更新】

行政执法C卷&#xff0c;两大模块题量占比&#xff1a;35/115&#xff0c;每题 100 115 \frac{100}{115} 115100​分&#xff0c;时间分配&#xff1a;20~35分钟&#xff0c;留10分钟涂卡 数量关系【题量占比&#xff1a;15/115】【时间分配&#xff1a;15~30分钟】 数字推理…

【掌握未来办公:OnlyOffice 8.2深度使用指南与新功能揭秘】

&#x1f308;个人主页: Aileen_0v0 &#x1f525;热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 ​&#x1f4ab;个人格言:“没有罗马,那就自己创造罗马~” 文章目录 一、功能亮点1. PDF文档的协同编辑2. PDF表单的电子签名3. 界面的现代化改造4. 性能的显著提升5. 文…

AI写作(四)预训练语言模型:开启 AI 写作新时代(4/10)

一、预训练语言模型概述 ​ 预训练语言模型在自然语言处理领域占据着至关重要的地位。它以其卓越的语言理解和生成能力&#xff0c;成为众多自然语言处理任务的关键工具。 预训练语言模型的发展历程丰富而曲折。从早期的神经网络语言模型开始&#xff0c;逐渐发展到如今的大规…

EulerOS 编译安装 ffmpeg

EulerOS 编译安装 ffmpeg 欧拉系统是国内自主研发的服务器操作系统&#xff0c;EulerOS基于CentOS的源码开发&#xff0c;运行环境兼容CentOS&#xff0c;国内的华为云、天翼云、移动云、联通云均采用欧拉系统。 安装工具包 经实测&#xff0c;在欧拉系统上需要通过yum安装下…

JavaWeb:文件上传1

欢迎来到“雪碧聊技术”CSDN博客&#xff01; 在这里&#xff0c;您将踏入一个专注于Java开发技术的知识殿堂。无论您是Java编程的初学者&#xff0c;还是具有一定经验的开发者&#xff0c;相信我的博客都能为您提供宝贵的学习资源和实用技巧。作为您的技术向导&#xff0c;我将…

Vue3中使用LogicFlow实现简单流程图

实现结果 实现功能&#xff1a; 拖拽创建节点自定义节点/边自定义快捷键人员选择弹窗右侧动态配置组件配置项获取/回显必填项验证历史记录&#xff08;撤销/恢复&#xff09; 自定义节点与拖拽创建节点 拖拽节点面板node-panel.vue <template><div class"node-…

机器学习——贝叶斯

&#x1f33a;历史文章列表&#x1f33a; 机器学习——损失函数、代价函数、KL散度机器学习——特征工程、正则化、强化学习机器学习——常见算法汇总机器学习——感知机、MLP、SVM机器学习——KNN机器学习——贝叶斯机器学习——决策树机器学习——随机森林、Bagging、Boostin…

大模型书籍推荐丨这本书必看:大语言模型 基础与前沿(附PDF)

哈喽大家好&#xff01;很久都没有更新大模型这块的书了&#xff0c;今天给大家说一下这本&#xff1a;《大语言模型&#xff1a;基础与前沿》&#xff0c;本书深入阐述了大语言模型的基本概念和算法、研究前沿以及应用&#xff0c;涵盖大语言模型的广泛主题&#xff0c;从基础…

Tofu AI视频处理模块视频输入配置方法

应用Tofu产品对网络视频进行获取做视频处理时&#xff0c;首先需要配置Tofu产品的硬件连接关系与设备IP地址、视频拉流地址。 步骤1 Tofu设备点对点直连或者通过交换机连接到电脑&#xff0c;电脑IP配置到与Tofu默认IP地址同一个网段。 打开软件 点击右上角系统设置 单击左侧…

MTSET可溶于DMSO、DMF、THF等有机溶剂,并在水中有轻微的溶解性,91774-25-3

一、基本信息 中文名称&#xff1a;[2-(三甲基铵)乙基]甲硫基磺酸溴&#xff1b;MTSET巯基反应染料 英文名称&#xff1a;MTSET&#xff1b;[2-(Trimethylammonium)ethyl]methanethiosulfonate Bromide CAS号&#xff1a;91774-25-3 分子式&#xff1a;C6H16BrNO2S2 分子量…

BERT框架详解

BERT&#xff08;Bidirectional Encoder Representations from Transformers&#xff09;是由Google在2018年提出的一种自然语言处理&#xff08;NLP&#xff09;模型。BERT通过使用Transformer架构&#xff0c;实现了对文本的双向上下文理解&#xff0c;从而在多个NLP任务中取…

定时器(QTimer)与随机数生成器(QRandomGenerator)的应用实践——Qt(C++)

一、QTimer与QRandomGenerator &#xff08;一&#xff09;QTimer&#xff08;定时器&#xff09;[2] QTimer类为定时功能提供了一个高级编程接口。在使用QTimer时&#xff0c;实例化一个QTimer对象并将其timeout()发射信号与合适的信号槽相连接。通过调用QTimer的start()函数…

Linux 进程线程间通信总结

线程 线程共享存储空间主要带来的问题是数据同步和互斥。由于线程在同一进程中运行&#xff0c;它们共享相同的内存空间&#xff0c;任何线程都可以访问共享数据。这样&#xff0c;多个线程并发执行时&#xff0c;可能会导致以下两种主要问题&#xff1a; 互斥问题&#xff0…

什么是RAG? LangChain的RAG实践!

1. 什么是RAG RAG的概念最先在2020年由Facebook的研究人员在论文《Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks》中提出来。在这篇论文中他们提出了两种记忆类型&#xff1a; 基于预训练模型&#xff08;当时LLM的概念不像现在这么如日中天&#xff0…

Python 进阶函数教程

Python 进阶函数教程 引言 在 Python 编程中&#xff0c;函数是组织代码、提高可重用性和可读性的关键组成部分。尽管许多初学者掌握了基本的函数定义和调用&#xff0c;但 Python 还提供了许多高级功能&#xff0c;使函数更加灵活和强大。本文将深入探讨 Python 中的高级函数…

ReactPress:深入解析技术方案设计与源码

ReactPress Github项目地址&#xff1a;https://github.com/fecommunity/reactpress 欢迎提出宝贵的建议&#xff0c;欢迎一起共建&#xff0c;感谢Star。 ReactPress是一个基于React框架开发的开源发布平台&#xff0c;它不仅仅是一个简单的博客系统&#xff0c;更是一个功能全…

c++实现B树(下)

书接上回小吉讲的是B树的搭建和新增方法的实现&#xff08;blog传送门&#x1f6aa;&#xff1a;B树实现上&#xff09;&#xff08;如果有小可爱对B树还不是很了解的话&#xff0c;可以先看完上一篇blog&#xff0c;再来看小吉的这篇blog&#xff09;。那这一篇主要讲的是B树中…

【漏洞分析】Fastjson最新版本RCE漏洞

01漏洞编号 CVE-2022-25845CNVD-2022-40233CNNVD-202206-1037二、Fastjson知多少 万恶之源AutoType Fastjson的主要功能是将Java Bean序列化为JSON字符串&#xff0c;这样得到的字符串就可以通过数据库等方式进行持久化了。 但是&#xff0c;Fastjson在序列化及反序列化的过…