vue动态生成路由及常见问题

Vue如何实现动态路由以及动态路由详解 阅读详情

原文地址: http://www.linzichen.cn/article/1581289405333635072

在一些常见的 RBAC 系统中,对于角色和权限的管理是极其重要的。一个人可以拥有多个角色,而一个角色又会被赋予多个权限。不同的角色在登录后台系统后,看到的系统菜单也是不同的。在前后端不分离的项目中,后端可以整合 Spring Security、Shiro等安全框架对页面元素进行标签化管理。但是随着前后分离模式的普及,我们现常常把展示逻辑放到前端来完成。本文就详细聊一聊在 vue 中如何实现对于菜单的动态控制。

两种方案

目前项目中对于角色菜单的控制,常见的有两种方案。

1、前端记录所有路由,通过角色动态控制

思路:

前端在 router.js 中,定义出所有页面的路由,在每个 router 节点上,我们给增加一个角色属性,例如:

roles.png

由上图发现,我们自定义了一个属性 roles, 用户在登录系统后,后端返回的用户信息中,就有用户的角色。前端需要判断每个路由节点的 roles 数组中,是否包含这个角色,如果包含,就保留此router,否则就过滤掉。最后前端只需要将过滤完成后的路由展示在页面上即可。

优缺点:

此种方法优点是比较简单易实现,在角色固定的情况下可以考虑采取。但缺点是不灵活,如果后期增加了新的角色,我们需要修改代码。所以此种方式不是本文聊的重点

2、后端返回路由数据,前端动态生成

此方案也是目前项目中最常用的,但是需要跟后端有较强的约定性。

2.1 思路分析

由于路由是动态生成的,所以我们先看一下如果要生成一个路由,需要哪些条件,我们一个常见的路由节点如下:

router.png

我们发现,一个基本的路由节点,包含 path、name、component、meta 属性,如果是多级菜单,那么还需要children数组属性,在 children中又是同样属性的路由节点对象。所以我们需要跟后端约定好,返回的路由中必须要存在这些字段。

其中有个特殊的字段 component,这个代表 path 路径指向的页面组件。所以 后端在返回这个字段的时候,其值必须要跟前端组件的路径位置保持一致。例如前端有个组件的路径是 @/views/user/index.vue,其中,/user/index 是标记我们这个组件的唯一位置,所以后端返回的 component值中,必须存在 /user/index,这样前端才能根据这个路径,找到对应的组件。

在跟后端约定好规则后,接下来我们看一下具体的实现步骤:

1、在 router.js 中,定义公共的路由。比如登录、首页、404 等路由,因为这些页面是所有角色都会存在的,所以就没有必要后端返回了。

2、用户登录后,随即会跳转首页。所以我们需要在跳转页面之前,调用后端接口,获取该用户的路由信息。而监听路由跳转,一般是在 路由守卫中实现。

3、在路由守卫中,获取用户路由信息,动态生成路由数据,并与 router.js 定义的公共路由数据进行合并。

4、将合并后的路由存储到 vuex或者 sessionStoreate 中。

5、将存储的路由数据遍历展示到页面上。

2.2 代码实现

项目模板是基于花裤衩大神的 vue-admin-template ,gitee地址。

前端项目页面组件位置如下:

views.png

需求是我们希望红框中的路由是动态加载的。

2.2.1 定义公共路由

在 router/index.js中已经帮我们写了很多路由信息,为了跟上图路由保持一直,简化为以下(path为*的路由一定放最后):

constant.png

2.2.2 获取路由接口数据

假设后端定义 getRouters 为获取路由接口,那么它返回的数据应该是:

[
    {
        "path":"/order",
        "component":"order/index",
        "name":"Order",
        "meta":{
            "title":"订单管理"
        }
    },
    {
        "path":"/user",
        "component":"user/index",
        "name":"User",
        "meta":{
            "title":"用户管理"
        },
        "children":[
            {
                "path":"/user/list",
                "component":"user/components/list",
                "name":"UserList",
                "meta":{
                    "title":"用户列表"
                }
            },
            {
                "path":"/user/consume",
                "component":"user/components/consume",
                "name":"UserConsume",
                "meta":{
                    "title":"消费记录"
                }
            }
        ]
    }
]

2.2.3 动态生成路由

我们从原框架代码的逻辑中不难看出,用户在登录成功后,会跳转到首页,在 views/login/index.vue中:

login.png

而在 src/permission.js 文件中,框架配置了 路由守卫,里面的逻辑也不复杂,这里简单说一下。

路由守卫.png

去查看用户登录的逻辑,发现会在登录成功后,在cookie中存储一条token。框架这里通过 getToken()方法来获取用户token。
如果存在token信息,且如果当前路径是login登录页的话,会强制给回到首页;如果不是login路径,则会从 vuex 中获取用户的基本信息,如果 vuex 中存在则直接放行,否则会重新调用获取用户信息的方法,如果途中发生异常,则会强制返回loing页面。if (hasGetUserInfo) 判断是为了避免重复获取用户信息,因为每次路由跳转都会走这段逻辑,如果不加判断,则每次都会去后端请求。
如果不存在token信息,且访问的路径是非白名单路径,则强制退出返回 login页面。

由以上逻辑可知,我们获取用户路由信息的时机应该在跳转主页面之前,且vuex 中的数据刷新页面后就没有了,页面刷新后会根据当前地址栏的路径进行路由跳转,也会走这段代码,所以应该在这里写我们的逻辑。

src/permission.js 文件代码:

import router from './router'
import store from './store'
import NProgress from 'nprogress' // progress bar
import 'nprogress/nprogress.css' // progress bar style
import { getToken } from '@/utils/auth' // get token from cookie
import getPageTitle from '@/utils/get-page-title'
import { getRouters } from '@/api/user'
import { constantRoutes } from '@/router'

NProgress.configure({ showSpinner: false }) // NProgress Configuration

const whiteList = ['/login'] // no redirect whitelist

router.beforeEach(async(to, from, next) => {
  // start progress bar
  NProgress.start()

  // set page title
  document.title = getPageTitle(to.meta.title)

  // determine whether the user has logged in
  const hasToken = getToken()

  if (hasToken) {
    if (to.path === '/login') {
      // if is logged in, redirect to the home page
      next({ path: '/' })
      NProgress.done()
    } else {
      // 我们把最终的路由信息存储在 vuex 中,
      // 这里加判断的原因也是为了避免每次路由跳转时都会重新获取一次
      // 且页面刷新后vuex数据会消失
      if (store.getters.routers.length) {
        // 如果存在路由信息,则直接放行
        next() ;
      } else {
        // 如果不存在,则重新获取
        // getRouters 是定义在 api 中的接口,需要 import 进来
        getRouters(hasToken).then(res => {
          // 生成动态路由节点
          const dynamicRouters = handleRouter(res)
          // 我们需要把动态生成的路由作为 Layout 组件的子路由,而Layout组件在常量路由数组中
          // 倒数第二个元素,所以 constantRoutes[constantRoutes.length - 2] 目的是获取Layout路由节点,
          // 并将动态路由合并到 Layout 的子节点中
          constantRoutes[constantRoutes.length - 2].children.push(...dynamicRouters)
          // 将最终的路由信息保存到 vuex 中,保存完成后,再添加到 router 对象中。
          store.dispatch('router/setRouters', constantRoutes).then(() => {
            router.addRoutes(store.getters.routers)
            
          })
          next()
        })
      }
      
      // const hasGetUserInfo = store.getters.name
      // if (hasGetUserInfo) {
      //   next()
      // } else {
      //   try {
      //     // get user info
      //     await store.dispatch('user/getInfo')

      //     next()
      //   } catch (error) {
      //     // remove token and go to login page to re-login
      //     await store.dispatch('user/resetToken')
      //     Message.error(error || 'Has Error')
      //     next(`/login?redirect=${to.path}`)
      //     NProgress.done()
      //   }
      // }
      
    }
  } else {
    /* has no token*/

    if (whiteList.indexOf(to.path) !== -1) {
      // in the free login whitelist, go directly
      next()
    } else {
      // other pages that do not have permission to access are redirected to the login page.
      next(`/login?redirect=${to.path}`)
      NProgress.done()
    }
  }
})

/**
 * 组装动态路由函数
 * @param {*} routerList 
 * @returns 最终的动态路由数组
 */
const handleRouter = (routerList) => {
  const routers = []
  for (const router of routerList) {
    const node = {
      path: router.path,
      component: (resolve) =>  require([`@/views/${router.component}.vue`], resolve),
      name: router.name,
      meta: router.meta
    }
    // 如果当前路由节点存在子路由,需要递归组装数据
    if (router.children && router.children.length) {
      node.children = handleRouter(router.children)
    } 
    routers.push(node)
  }
  return routers
}

router.afterEach(() => {
  NProgress.done()
})

2.2.4 关于route的state

此框架的 vuex 是模块化管理,所以我们在 src/store/modules中新建一个路由的 router.js文件:


const state = {
    routers: []
}
const mutations = {
    SET_ROUTERS: (state, routers) => {
        state.routers = routers
    }
}
const actions = {
    setRouters( { commit }, routers ) {
        return new Promise((resolve) => {
            commit('SET_ROUTERS', routers)
            resolve()
        })
    }
}
export default {
    namespaced: true,
    state,
    mutations,
    actions
}

在 src/store/index.js中管理 router 的 state:

import Vue from 'vue'
import Vuex from 'vuex'
import getters from './getters'
import app from './modules/app'
import settings from './modules/settings'
import user from './modules/user'
import router from './modules/router'

Vue.use(Vuex)

const store = new Vuex.Store({
  modules: {
    app,
    settings,
    user,
    router
  },
  getters
})

export default store

因为我们最终菜单获取的路由数据是从 vuex 获取的,所以我们需要在 src/store/getters.js中对外提供路由数据:

const getters = {
  sidebar: state => state.app.sidebar,
  device: state => state.app.device,
  token: state => state.user.token,
  avatar: state => state.user.avatar,
  name: state => state.user.name,
  routers: state => state.router.routers
}
export default getters

2.2.5 从vuex中获取路由,并展示在页面上

根据框架代码,我们发现有关菜单侧边栏的内容,都在 src/layout/components/Sidebar/index.vue组件中,我们把其计算属性中的 routes 改为从 vuex 中获取。

sidebar.png

至此,我们动态生成路由的代码就已经实现了。

demo.gif

常见问题

1. 用 require 而不用 import

我们在根据字符串生成路由组件的时候,要用 require 而不是 import ,否则会报以下错误信息:

notFound.png

2. 侧边栏消失

在点击动态生成的路由时,页面可以正常跳转,但是测试边不见了。是因为 动态生成的路由没有作为 Layout 组件的子组件,应该添加到 Layout 组件的 children 数组中。

3. 页面无内容

在点击二级菜单的时候,页面是空白的,没有任何内容。以上面案例为例,我们只需要在对应组件的父目录下,新建 index.vue 文件,写入 <router-view /> 即可。

4. 二级菜单展示不全

这个问题不属于动态路由的问题,elementui 框架中,如果子菜单只有一个,那么就不会生成多级菜单的形式。

vue权限控制和动态路由 阅读详情

相关推荐

vue 根据用户权限,加载不同的路由,生成多级侧边栏

第一次做根据不同权限,生成不同的路由,同时生成不同侧边栏,看了好多文章写的侧边栏只能嵌套两层,自己稍微改进了一下,可以无限嵌套。第一次写文章,写的不好,多提提意见啊!有些人会问:为什么要生成不同路由,直接路由根据权限在侧边栏进行显示隐藏不就好了吗? 我的理解,在侧边栏显示隐藏的话就是把所有的路由注册了,虽然侧边栏没有了,但是用户还是可以通过直接在地址栏输入地址进行跳转,动态生成路由,只有有权限角色才可以访问,在地址栏输入无权查看的页面是无法跳转的,因为路由没有进行添加到第一种是后端直接返回路由表,这种后续有

qq_43294027的博客 3341

Vue 生成自动路由

Vue 生成自动路由

weixin_45046996的博客 1298

Vue和Vue-Element-Admin(三):路由及constantRoutes和asyncRoutes的区别

Vue-Element-Admin框架在定义路由使用constantRoutes和asyncRoutes两种,在store.modules.permission.js中对于两者的权限有默认的判断方式,后者需要动态判断权限,前者不需要; constantRoutes: 不需要动态判断权限的路由,如登录页、404、等通用页面; asyncRoutes: 需动态判断权限并通过addRoutes动态添加的页面; xxx ...

叶子叶来 2万+

constantRoutes 和asyncRoutes的区别

constantRoutes:代表那些不需要动态判断权限的路由,如登录页、404、等通用页面。 asyncRoutes:代表那些需求动态判断权限并通过addRoutes动态添加的页面

qq_58003121的博客 1239

微信小游戏过审实战:JS混淆与马甲包规避技巧

本文详细解析了微信小游戏过审的实战技巧,重点介绍了JS代码混淆与马甲包规避策略。通过代码混淆、资源文件处理和分阶段提审等方法,有效应对微信机审系统的代码包侵权检测,提升过审成功率。文章还分享了常见问题的解决方案和实战经验,为开发者提供实用指导。

weixin_29234423的博客 279

软件破解逆向安全(一)初识内存地址和偏移

工具:CE 内存:数字->存访在电脑中->内存 实例:如何修改植物大战僵尸阳光 内存搜索最核心:过滤数据 先用CE加载植物大战僵尸,如下图 我们可以看到目前我们的阳光数是50,我们尝试在ce里搜索精确数值,4 byte是int整数的表示。 我们发现有很多数据,尝试收集一个阳光变成75再次搜索: 我们发现就一个了,这时我们可以双击Value随便修改阳光的数值了。 这里我们说一下动态和静态地址 动态地址:临时用于存放数据的地址,黑色。特征:重新启动游戏地..

weixin_43781139的博客 2590

vue3-element-admin 动态路由生成:后端接口驱动菜单渲染

你是否还在为前端静态路由配置繁琐、权限变更需重新部署而烦恼?本文将深入解析 vue3-element-admin 如何通过后端接口动态生成路由,实现菜单渲染与权限管理的无缝衔接。读完本文,你将掌握从后端接口设计到前端路由渲染的完整实现方案,彻底告别静态路由的维护困境。 ## 动态路由架构概览 动态路由(Dynamic Routing)是指根据用户权限或其他条件,在应用运行时动态生成并加载的路由...

gitblog_01052的博客 989

PX4从放弃到精通(二十八):垂起过渡控制

固件版本:1.14.0可加名片交流学习。

超维空间科技的博客 2873

Vue3路由进阶:动态路由、导航守卫与权限管理实战

前端路由是单页应用的核心机制,通过URL与组件的映射实现无刷新页面切换。Vue Router 4作为Vue3官方路由库,以组合式API和TypeScript支持重构了实例创建与守卫逻辑。理解其history模式、动态路由和导航守卫,能有效处理权限控制、页面缓存和404兜底等工程难题。在后台管理系统中,动态权限路由与菜单生成深度绑定,通过addRoute按权限注册路由,配合全局守卫实现访问控制。本文基于Vue3项目实践,梳理路由配置、传参、懒加载及常见部署坑,帮助开发者构建健壮的单页应用导航体系。

weixin_29014237的博客 180

Google 二次签名 导致 Facebook , Google 登录失败

google 授权登录

xq610928的博客 1957

嵌入式硬件中AI硬件设计方法与技巧

嘉立创EDA推出AI助手Kimi插件,为PCB设计提供智能支持。该插件具备四大核心功能:AI问答助手可解答各类电路设计问题;元件查询功能直接展示参数和应用场景;智能分析网表可检测潜在问题;电路图识别能解析图纸结构并提供改进建议。用户需通过扩展插件安装,并配置Kimi API密钥后使用。该工具旨在提升工程师的设计效率,减少查阅资料时间,特别适合项目交接和设计自查场景。

嵌入式技术开发 1866

vue后台项目基于RBAC实现权限管理

一、RBAC(Role-Based Access control) RBAC中文意为基于角色的权限控制,是一个权限设计思想,也就是说根据不同的用户角色,有不同的权限控制,例如权限页面,权限功能。 使用场景:登录后每个用户看到的菜单界面是不同的,操作的功能也不一样,例如老板、财务和员工,老板的级别就高级一点了,所有的菜单栏都可以访问,而财务只能看见考勤和对应的工资,而员工只能看见自己的个人信息。 这时候就产生了三个关系,分为用户、角色、权限点 用户:每个账号的人 角色:在公司中什么位置映射这有什

^_^ 8095

QT使用libssh2库通过密匙实现sftp协议上传文件

qt下使用libssh2通过密匙连接sftp服务器端

小米的修行之路 940

Vue3后台管理系统权限控制实战指南

权限控制是现代后台管理系统的核心技术之一,基于RBAC(基于角色的访问控制)模型实现用户-角色-权限的三层架构。通过Vue3的组合式API和Pinia状态管理,可以高效处理复杂权限逻辑,实现路由级、菜单级和操作级的细粒度控制。动态路由过滤算法和路由守卫机制确保了权限系统的安全性,而自定义指令和组件化方案则简化了按钮级权限的实现。在电商、ERP等企业级应用中,合理的权限设计既能防止数据泄露,又能保证用户体验。本文以Vue3+Pinia技术栈为例,详解如何构建高性能、可维护的权限控制系统,涵盖从数据结构设计到性

weixin_32288959的博客 192

SAP采购申请审批策略配置简介

SAP采购申请审批策略配置简介 1、CT04创建特征

我小时候很黑的博客 8160

YOLOv11涨点改进 | NeurIPS2025最佳论文!注意力改进篇| 引入Gated Attention门控注意力模块、太牛了!直接拯救了大模型的发展,助力目标检测、图像分割、图像分类有效涨点

本文提出了一种基于门控注意力机制(GatedAttention)的YOLOv11改进方法。该模块通过在标准注意力机制中引入头部特定的sigmoid门控,有效提升了模型性能和训练稳定性。实验表明,GatedAttention能够增强模型对关键信息的聚焦能力,减少无关区域关注,提高检测精度。同时,门控机制带来的非线性和稀疏性优化了计算效率,并缓解了训练不稳定性问题。文章详细介绍了模块原理、实现代码及三种改进方案配置方法,为YOLOv11在复杂场景下的目标检测提供了有效解决方案。

Ai缝合怪、助力小伙伴高效发论文 495

Vue 实现动态生成路由(动态生成菜单,根据菜单动态生成路由)

在后台管理系统中,常常会因为不同的权限,展现不同的菜单。但这仅仅是显示控制,而我们要做的是没有的菜单权限,直接输入URL也不可访问,真正的实现菜单权限控制。 一、动态菜单显示 1. 后端返回的菜单数据处理 后端返回的菜单数据一般有两种,处理好的树状结构、或者未处理的列表数据(这种情况需要我们去转换成树状结构,可看我的另外一篇博客【js树形结构操作】)。 下面是后端返回的数据: [ { "id": "1", "pid": "0", "name": "工作台", "url.

Vincent的博客 7万+

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Vue3 中如何根据路由动态生成侧边菜单

在 Vue3 的项目开发,尤其是后台管理系统这类复杂应用场景中,侧边菜单扮演着举足轻重的角色,它是用户快速导航至各个功能模块的得力助手。而根据路由动态生成侧边菜单,则为系统的灵活性和可扩展性增添了强大动力。接下来,我们将深入探讨如何在 Vue3 中实现这一关键功能。gitCode代码地址:https://gitcode.com/Jiaberrr/vue3-pc-template/overview,gitee代码地址:https://gitee.com/zunyi-gabe/vue3-pc-template

Jiaberrr的博客 2008

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

Vue + ElementUI 动态生成面包屑导航教程

在Web应用程序中,面包屑导航是一种常用的导航方式,它可以帮助用户更好地理解当前页面的位置和层次关系。在Vue项目中,结合ElementUI组件库,我们可以很容易地实现一个动态生成面包屑导航的功能。本教程将介绍如何使用Vue + ElementUI来实现动态生成面包屑导航的功能。

qq_45861961的博客 8192

Vue2中利用webpack动态生成路由

利用webpack来根据目录结构动态生成路由,将对路由的维护集中到路由组件本身,降低维护的难度。

2301_76250038的博客 1423

【vuejs】vue-router 之 addRoute 动态路由的应用总结

Vue Router 是 Vue.js 官方的路由管理器,用于构建单页面应用。它与 Vue.js 深度集成,让开发者能够轻松地构建具有复杂用户界面的单页面应用。Vue Router 允许你定义不同的路由,并通过 组件在应用中显示匹配的组件。Vue Router 的核心特性包括:Vue Router 的安装和基本使用步骤如下:对于 Vue 2,推荐使用 Vue Router 3.x 版本。可以通过 npm 或 yarn 进行安装: 1.2 项目中引入 Vue Router 在项目的入口文件(如 main.j

工作的日常记录和平凡的生活分享 8345

vue+ element 后台动态生成权限菜单,前端动态绑定路由

导语 人生呀 总会有一些改变,入行快2年了,今天来记录下我的第一篇博客,哈哈 不管有没有人看。 开始正题 一、通过后端返回的信息 动态添加路由 首先登录,获取到你的用户信息,把token存在cookies 里面,然后跳转系统首页。在跳转之前我做了一个路由处理 新增了一个 permission.js 直接在main.js 引用就可以了 这个文件用了 router 的 beforeEach ...

qq_39651981的博客 2万+

Ant Design Vue 动态生成菜单和路由绑定

AntDesign Vue动态生成菜单项和动态配置路由, 能够根据数据库的数据动态生成路由文件和菜单项

zukxu123的博客 2812

前端单独实现 vue 动态路由

在用户登录成功后从服务器获取用户的权限信息,在 vuex 的异步处理函数中过滤掉角色权限不存在的路由,使用concat()合并公共路由,最后使用动态添加可访问的路由。这样可以确保应用根据用户的权限动态加载相应的路由,增强安全性与灵活性。

a123456234的博客 1951

Vue 动态添加路由及生成菜单

更多文章 写后台管理系统,估计有不少人遇过这样的需求:根据后台数据动态添加路由和菜单。 为什么这么做呢?因为不同的用户有不同的权限,能访问的页面是不一样的。 在网上找了好多资料,终于想到了解决办法。 动态生成路由 利用 vue-router 的 addRoutes 方法可以动态添加路由。 先看一下官方介绍: router.addRoutes router.addRoutes(routes: Arr...

分享我的编程经验和学习心得 1万+
上一篇: React脚手架配置别名(非eject)
下一篇: 线性表之链表
Zichen_Lin
博客等级 码龄9年 9粉丝 19原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值