精华内容
下载资源
问答
  • 后台系统

    千次阅读 2017-08-16 17:12:04
    后台系统 (Foreground/Background System)  这种系统可称为前后台系统或超循环系统(Super-Loops)。应用程序是一个无限的循环,循环中调用相应的函数完成相应的操作,这部分可以看成后台行为(background)。中断...

    前后台系统 (Foreground/Background System)
            这种系统可称为前后台系统或超循环系统(Super-Loops)。应用程序是一个无限的循环,循环中调用相应的函数完成相应的操作,这部分可以看成后台行为(background)。中断服务程序处理异步事件,这部分可以看成前台行为(foreground)。后台也可以叫做任务级。前台也叫中断级。时间相关性很强的关键操作(Critical operation)一定是靠中断服务来保证的。因为中断服务提供的信息一直要等到后台程序走到该处理这个信息这一步时才能得到处理,这种系统在处理信息的及时性上,比实际可以做到的要差。这个指标称作任务级响应时间。最坏情况下的任务级响应时间取决于整个循环的执行时间。因为循环的执行时间不是常数,程序经过某一特定部分的准确时间也是不能确定的。进而,如果程序修改了,循环的时序也会受到影响。

          其实第一眼看到前后台系统,我脑海里不知怎么地就想起来初中学过的华罗庚的统筹方法。原文已经忘的干干静静了,只是清楚里面的道理。统筹方法告诉我们要合理分配时间,这样可以避免不必要等待,造成时间的浪费和效率的下降,这个在公司的项目管理中尤为有用。下面给出统筹法的连接

    华罗庚的统筹方法——小学对我影响最深的课文

    http://baike.baidu.com/view/293640.htm

    在介绍前后台系统前,我们还是从最简单的程序开始,抛砖引玉。还是从最简单的LED灯闪烁开始,要求LED0以1Hz闪烁。

          这里给出教科书上最经典的闪烁LED程序。

    [cpp] view plain copy
    1. void main(void)  
    2. {  
    3.         While(1)   
    4.     {  
    5.         LED0 = ON;  
    6.         DelayMs(500);  
    7.         LED0 = OFF;  
    8.         DelayMs(500);  
    9.      }  
    10. }  

              把程序下载到单片机后,上电后看见LED0按预期目标闪烁,没什么问题。但是实际中你看哪个单片机系统只是用来闪烁个LED灯来着,那也太浪费了吧!总要加点功能吧!比如要求LED0以1Hz闪烁,LED1以2Hz闪烁,怎么办?好办啊,我改下程序就是了:

    [cpp] view plain copy
    1. void main(void)  
    2. {  
    3.         While(1)   
    4.     {  
    5.         LED1 = ON;  
    6.         DelayMs(250);  
    7.         LED1 = OFF;  
    8.         DelayMs(250);  
    9.         LED0=ON;  
    10.   
    11.         LED1 = ON;  
    12.         DelayMs(250);  
    13.         LED1 = OFF;  
    14.         DelayMs(250);  
    15.         LED0=OFF;  
    16.      }  
    17. }  

           如果再加些需求,要求LED0以1Hz闪烁,LED1以2Hz闪烁,LED2以3Hz闪烁,LED4以50Hz闪烁,再加上检测每10ms检测一次按键,每20ms动态刷新一次数码管。怎么办?你还有信心改程序么?反正我是已经头大了,还是想想问题出在哪了!想来想去都觉得问题是出在延时DelayMs()上了。为了说明问题,我这里做个估算,假设一个12MHz的51单片机,执行一个单周期指令需要1us。那么10ms差不多就可以执行10000条指令了。10000条指令,这是个什么概念啊?10ms对人来说可能都感觉不到,可对于单片机来说,哪可是相当长的时间啊。如果这段时间让CPU无意义的死等。什么事也不干。这可比人死等在火炉边等水烧开要严重的多。如果人要都像单片机这种等法,那就是等死啊。总之一句话,死等=等死。

             思路决定出路,所以要换个思路来解决问题了。思考一下,要是不用DelayMs()的话,那CPU怎么样才知道每隔多久改变一次LED状态啊?这里又要联系到华罗庚的统筹方法了,这里面最重要的因素是什么?我觉得应该的时间,既然是时间那就离不开钟表。那么51单片机里面有没有钟表么?很幸运,还真有一个类似的,就是我们常说的定时器Timer。关于定时器网上描述一大堆,这里就不做详细说明了。简单的说定时器就像个闹铃,只要设置好每次闹铃的间隔时间,比如1ms的话,当启动定时器后,每隔1ms闹铃就会响一次(产生一次中断)。那么从现在开始设置闹铃,闹铃响10下,单片机就知道10ms到了;响了1000下,就知道经过了1s……。这样的话单片机就可以像人一样利用统筹法来工作了,比如LED0以1Hz闪烁的话(周期为1s,半个周期就是500ms),那么单片机可以在闹铃每响500下后,才去改变LED0 的状态。单片机在这段时间可以用来干其他事,完全不需要死等500ms。

       好了,说了一大堆,脑袋有点晕了,上程序:

    [cpp] view plain copy
    1. #include <reg52.h>  
    2.   
    3. sbit LED0 = P1^0;  
    4. sbit LED1 = P1^1;  
    5. sbit LED2 = P1^2;  
    6.   
    7. //定义软件计数器,用于对每个事件进行计数  
    8. unsigned int LED0_Counter;  
    9. unsigned int LED1_Counter;  
    10. unsigned int LED2_Counter;  
    11.   
    12. void Init(void)  
    13. {  
    14.     //设置软件计数器  
    15.     LED0_Counter=500;  
    16.     LED1_Counter=250;  
    17.     LED2_Counter=125;  
    18.   
    19.          //设置定时器T0   
    20.          TMOD&=0xf0;     
    21.          TMOD|=0x01;  
    22.          TH0=(65536-1000)/256; //定时1ms(晶振12MHz)  
    23.           TL0=(65536-1000)%256;  
    24.       
    25.          ET0=1;  //开定时器中断  
    26.           TR0=1; //开定时器  
    27.           EA=1; //开总中断  
    28.   
    29. }  
    30.   
    31. void main(void)  
    32. {  
    33.     Init();   
    34.     while(1){  
    35.   
    36.         if(LED0_Counter==0){  //判断时间是否到,如果到了则执行LED0Event(),否则绕行  
    37.             LED0_Counter=500;//LED0Event(),每500*1ms执行一次  
    38.             LED0Event();  
    39.         }  
    40.    
    41.         if(LED1_Counter==0){  
    42.             LED1_Counter=250;  
    43.             LED1Event();  //LED1Event(),每250*1ms执行一次      
    44.         }  
    45.   
    46.         if(LED1_Counter==0){  
    47.             LED2_Counter==125;  
    48.             LED2Event(); //LED2Event(),每125*1ms执行一次   
    49.         }  
    50.     }  
    51. }  
    52.   
    53.   
    54.   
    55. void Timer0_isr(void) interrupt 1   
    56. {  
    57.     TH0=(65536-1000)/256; //定时1ms  
    58.     TL0=(65536-1000)%256;  
    59.           //每次中断,所有软件定时器减一,如果定时器为0,表明其相应事件执行的时间到了  
    60.     if(LED0_Counter) LED0_Counter--;  
    61.     if(LED1_Counter) LED1_Counter--;  
    62.     if(LED2_Counter) LED2_Counter--;  
    63.   
    64. }  

          这里最关键的是定义了三个全局变量 LED0_Counter、LED1_Counter和LED2_Counter,相当于分别对LED0、LED1、LED2定义了一个软件计数器。软件定时器采用倒计时方式,只在Timer0中断中进行减一操作(相当于在每次闹铃的时候减一) ,只要减为0的话,就执行相应操作。

    展开全文
  • 后台系统:库存管理系统

    千次阅读 2019-01-04 16:07:26
    库存系统作为电商后台系统中不可或缺的一部分,虽然公司业务千差万别,但主要的元素却是相似的,文章主要是根据自己的经验来浅谈一下库存系统的设计。亦作为一个自我工作的总结和梳理。 库存管理系统,简单的说,...

    库存系统作为电商后台系统中不可或缺的一部分,虽然公司业务千差万别,但主要的元素却是相似的,文章主要是根据自己的经验来浅谈一下库存系统的设计。亦作为一个自我工作的总结和梳理。

    库存管理系统,简单的说,就是管理商品和数量之间的关系。在功能划分上,主要包括商品库存数量、入库、出库、盘点几个部分。

     

    一、商品库存

    即各个商品的数量管理。需要注意的是,在系统里需要保证商品的唯一性。在这里,涉及到以下几个数量:

    库存总数:目前仓库里还剩余的真实数量;可用数量:可以用于销售、调拨等的数量;锁定数量:指已经有了去处或者计划,但还未真正出库的数量(该部分在很多系统中,又会根据业务的不同而分成多个部分,在这里,暂且统一称之为锁定数量);

    当然,在实际设计过程中,还会涉及到其他的值和功能点,以下几点可作为参考:

    可以针对每个商品,做一个商品的历史变动明细、或根据不同维度做一些简单的数量统计;设置阈值,当数量小于某个值时,给出通知或提示,以告知相关人员进行采购;每个商品从采购到出库,每一个商品的流向进出都需要有所记录。在设计过程中,这一点是特别重要的,但却也是最复杂的,因为每一个业务通常都有很多的环节,会涉及到审批、物流、成本价等等,一个不小心,数据就会出现偏差;

    二、商品入库

    商品入库即商品数量增加的情形,主要包括采购、退货和调拨几种情形:

    采购:即仓库向供应商进行采购。(在不同的公司不同业务中,可能会涉及到很多的层采购,流程的复杂程度也随之各不相同);退货:从商城等的退货;调拨:从其他仓库调拨过来;虽然看起来入库包含的内容不是很多,但实际上是仓库系统的设计在后台系统中却是较为复杂的一部分。不同的业务,需要考虑的因素太多,每一个商品,每一个批次,每一个入库的类型,还有相关的物流信息等,都需要反复思考和优化。

    那么,下面就来介绍一下商品的入库流程及每一个环节中可以考虑的问题吧。

    1、采购

    采购单信息:作为一批货品的采购信息,需要保证商品信息的完善和准确性;预估功能:对各个商品的出库数量做一个周期性的预估,以便更好的进行库存控制;采购提醒:在系统中可以设计一个监控功能,当商品可用数量少于一定值时,提醒采购;快捷填写采购单:因为录入采购单比较耗时,所以是否可以考虑做一个快捷填充的入口,比如可以根据上次的采购数量生成一个基础的采购单,然后再在自动生成的采购单基础上进行修改。当然,此方法是否可行还要看具体业务流程,在此只是作为一个参考;采购审核:在一些业务流程中,填写采购单后,是需要相关负责人先进行审核的,审核通过后会根据审核结果生成一张真正的采购单。此时,要考虑在审核过程中允许操作的点,比如是否允许修改数量、规格等;采购状态:需要提供一个可以追踪的界面,以便知道申请进度;权限:还需要注意的是,每个状态下每个角色的操作权限。比如哪些人可以申请采购,哪些人可以审核等;2、退货

    在这里,所指的入库是已经从仓库里面发出,之后再进行退还的过程。此过程中需要考虑的点有:

    退货状态:虽然这是属于订单系统里面的内容,但在仓库系统里面最好也有所表示,这样有利于仓库管理者监控商品的动态;退货仓库:考虑在库存里,是否需要把退货部分单独统一管理;退货商品成本:在有的系统中,从供应商采购再到最后零售的过程,可能会存在断层的情况,而且每一批商品的成本价可能会有所不同,此时就需要直接从入库单开始,实行先买先卖的原则,当退货时,就需要保证退回的商品退到了原始批次上;这一操作,主要是为了财务对账做准备3、调拨

    这就涉及到两个仓库之间的数量变化了。基本上调拨中仓库之间的变化如下:

    如上图所示,若要从仓库A调拨50个某商品到仓库B,则:

    发货仓库:发起调拨后,发货仓库需要先锁定库存,此时,可用数量减少。发货后,锁定库存为0,,总库存减少;收货仓库:在真正入库之前,一切数量均不改变;

    三、商品出库

    商品出库主要包含:销售(经销商/零售/线上/线下/不同平台和渠道等)、调拨出库

    1、销售

    销售出库是最主要的一种出库形式,虽然销售的形式、渠道等都各不相同,但主要的逻辑都是相似的。

    举个简单的例子:仓库A里面目前还有可口可乐500箱,有100箱已经卖出去了,但买家要明天才来提货。那么这100箱就会被锁定,不可再用于其他地方,此时,可用的只有400箱。若买家又不想买了取消了订单,那么被锁定的100箱库存又被释放,可用数量再次变为500箱。

    2、调拨:如入库调拨所示。

    四、仓库盘点

    盘点主要是用于管理仓库实际值与系统值的差异的。理论上来说,若商品的各个环节数据都准确的话,实际值与系统值应该是一致的。但实际中可能会有一些系统检测不到的因素影响了真实的库存,这就需要仓库进行周期性的盘点了。

    盘点之后,若实际值与系统值不一致,就需要把系统值修改正确,这时,可以通过人工或者自动生成出入库单的形式去修改系统值,而且修改的这部分数据是需要做出标记的,以便于财务之后的对账。(当然,实际设计中如何处理这部分差异,还要看业务性质和需求)

    由于在实际的设计中,仓库系统涉及到的东西比较多,而且与业务的相关度比较高,不同的业务,设计出来的库存系统会有很大的差别,这里仅做了一个简单的概括和总结,若有其他的建议和方法,欢迎交流分享。

    展开全文
  • 基于Vue实现后台系统权限控制

    万次阅读 多人点赞 2018-03-01 19:09:19
    基于Vue.js 2.x系列 + Element UI 的后台系统权限控制 前言:关于vue权限路由的那些事儿…… 项目背景:现有一个后台管理系统,共存在两种类型的人员 ①超级管理员(称作admin),②普通用户(称作editor) 每...

    基于Vue.js 2.x系列 + Element UI 的后台系统权限控制

    前言:关于vue权限路由的那些事儿……

    项目背景:现有一个后台管理系统,共存在两种类型的人员

    ①超级管理员(称作admin),②普通用户(称作editor)

    每种类型的人看到的操作栏并不一样,可以进行的操作也不尽相同,于是就需要程序处理一下各个权限问题。

    过程说难不难,说简单不算简单

    vue权限

    【迷茫的前期】

    上百度、Google,狂搜了好多关于权限的问题,也许是仁者见仁智者见智吧,五花八门的介绍让自己更加迷茫不堪,真心不知道从哪里下手:

    1)让后端返回关于权限的json数据吧,但却不太懂这样的数据应该怎样处理;

    2)在前端路由那里处理,可是不明白应该怎样使用何种属性来实现这个功能;

    【最后】

    最后看到一篇文章 手摸手,带你用vue撸后台 系列二(登录权限篇)
    ,但是发现代码非常多权限功能是整合在框架里面的,伤心,我就想实现一个小小的权限功能,没办法还是仔细的研究了起来。

    具体实现思路

    1 创建vue实例的时候将vue-router挂载,但这个时候vue-router挂载一些登录或者不用权限的公用的页面。

    2 当用户登录后,获取用role,将role和路由表每个页面的需要的权限作比较,生成最终用户可访问的路由表。

    3 调用router.addRoutes(store.getters.addRouters)添加用户可访问的路由。

    4 使用vuex管理路由表,根据vuex中可访问的路由渲染侧边栏组件。

    是不是有点懵没关系下面我尽量用通俗点的话来讲每一步

    1在路由router.js里面声明权限为admin的路由(异步挂载的路由asyncRouterMap)

    // router.js
    import Vue from 'vue'
    import Router from 'vue-router'
    
    Vue.use(Router)
    
    export const constantRouterMap = [
      {
        path: '/',
        redirect: '/login',
        hidden: true
      },
      {
        path: '/login',
        name: '登录页面',
        hidden: true,
        component: resolve => require(['../views/login/Login.vue'], resolve)
      },
      {
        path: '/Readme',
        // name: 'Readmehome',
        index: 'Readme',
        meta: {
          title: 'Readme',
          icon: 'el-icon-menu'
        },
        component: resolve => require(['../components/common/Home.vue'], resolve),
        children: [
          {
            name: 'Readme',
            path: '/',
            meta: { title: 'Readme', icon: 'el-icon-menu' },
            component: resolve => require(['../components/page/Readme.vue'], resolve)
          }
        ]
      }
    ]
    
    export default new Router({
      routes: constantRouterMap
    })
    // 异步挂载的路由
    // 动态需要根据权限加载的路由表
    export const asyncRouterMap = [
      {
        path: '/permission',
        // name: 'permissionhome',
        meta: {
          title: 'permission',
          icon: 'el-icon-setting',
          roles: ['admin']
        },
        component: resolve => require(['../components/common/Home.vue'], resolve),
        children: [
          {
            name: 'permission',
            path: '/permission',
            meta: {
              title: 'permission', icon: 'el-icon-menu', roles: ['admin']
            },
            component: resolve => require(['../components/page/permission.vue'], resolve)
          }
        ]
      },
      { path: '*', redirect: '/404', hidden: true }
    ]
    

    这里我们根据 vue-router官方推荐 的方法通过meta标签来标示改页面能访问的权限有哪些。如meta: { role: [‘admin’,’super_editor’] }表示该页面只有admin和超级编辑才能有资格进入。

    注意事项:这里有一个需要非常注意的地方就是 404 页面一定要最后加载,如果放在constantRouterMap一同声明了404,后面的所以页面都会被拦截到404,详细的问题见addRoutes when you’ve got a wildcard route for 404s does not work

    2当用户登录后,获取用role,将role和路由表每个页面的需要的权限作比较,调用router.addRoutes(store.getters.addRouters)添加用户可访问的路由,生成最终用户可访问的路由表。路由表存在vuex里面

    permission.js

    // permission.js
    import router from './router'
    import store from './store'
    import { Message } from 'element-ui'
    import { getToken } from '@/utils/auth' // 验权
    
    const whiteList = ['/login', '/authredirect'] // 不重定向白名单
    
    router.beforeEach((to, from, next) => {
      if (getToken()) { // 判断是否有token
        if (to.path === '/login') {
          next({ path: '/' })
        } else {
          if (store.getters.roles.length === 0) {
            console.log('roles====0')
            store.dispatch('GetInfo').then(res => { // 拉取用户信息
              const roles = res.data.roles // note: roles must be a array! such as: ['editor','develop']
              console.log('roles?', roles)
              store.dispatch('GenerateRoutes', { roles }).then(() => { // 根据roles权限生成可访问的路由表
                console.log('addrouters', store.getters.addRouters)
                router.addRoutes(store.getters.addRouters) // 动态添加可访问路由表
                next({ ...to, replace: true }) // hack方法 确保addRoutes已完成 ,set the replace: true so the navigation will not leave a history record
              })
            }).catch(() => {
              store.dispatch('FedLogOut').then(() => {
                Message.error('验证失败,请重新登录')
                next({ path: '/login' })
              })
            })
          } else {
            console.log('====1')
            next() // 当有用户权限的时候,说明所有可访问路由已生成 如访问没权限的全面会自动进入404页面
          }
        }
      } else {
        if (whiteList.indexOf(to.path) !== -1) {
          next()
        } else {
          next('/login')
        }
      }
    })
    
    

    3使用vuex管理路由表,根据vuex中可访问的路由渲染侧边栏组件(菜单)。

    sidebar

    最后预览链接

    vue实现的权限系统

    源码下载

    https://github.com/mgbq/vue-permission

    打赏 衷心的表示感谢

    打赏
    支付宝扫一扫

    最后如有不对的麻烦指正

    展开全文
  • vue 后台系统权限管理

    千次阅读 2018-12-07 09:07:18
    最近在做一个后台管理系统,一般的后台系统都有权限管理这块,下面我就分享下我实现权限管理这块的思路。 技术栈及实现思路 首先说下这个系统前端用到的技术栈,vue全家桶,element-ui,axios。首先,用户的权限是通过...

    前言

    最近在做一个后台管理系统,一般的后台系统都有权限管理这块,下面我就分享下我实现权限管理这块的思路。

    技术栈及实现思路

    首先说下这个系统前端用到的技术栈,vue全家桶,element-ui,axios。首先,用户的权限是通过前端来进行配置的,那么就需要一个页面去进行用户的权限配置。在用户登录之后,通过请求后台查找该用户的权限信息,然后返回到前端。前端拿到权限信息之后,动态配置路由,再生成出对应的菜单列表。

    如何进行权限配置

    权限分配页面

    毋庸置疑,权限是跟用户挂钩的。在用户管理页面,做一个授权页面。如下图:

    树结构用的是element-ui里面的树形控件。生成这个树形菜单的数据源为前端配置好的默认的路由表。'icon’为菜单对应的图表,'index’为自定义的索引,用来配合这个树形控件生成权限信息。

    export const homeRoute = {
      path: '/',
      component: index,
      redirect: '/home',
      children: []
    };
    export const routes = [
      {
        path: '/home',
        component: home,
        icon: 'el-icon-home',
        index: '1',
        name: '系统首页',
        disabled: true
      }, {
        path: '/list',
        component: list,
        icon: 'el-icon-tickets',
        name: '菜单1',
        redirect: '/list1',
        index: '2',
        children: [
          {
            path: '/list1',
            name: '菜单列表1',
            component: list1,
            index: '2-1'
          },
          {
            path: '/list2',
            name: '菜单列表2',
            component: list2,
            index: '2-2'
          }
        ]
      }, {
        path: '/userManage',
        component: userManage,
        icon: 'el-icon-ticket',
        name: '用户管理',
        index: '3'
      }
    ];
    
    

    首页默认是所有用户都能查看的。当为改用户勾选对应的菜单后,则会生成一个数组,存储着选中的菜单列表,如:[‘1’, ‘2-1’, ‘3’, ‘2’, ‘2-2’]。

    动态配置路由

    我在main.js文件做了如下配置:

    var per = true;
    router.beforeEach((to, from, next) => {
      if (getStore('token') == null && to.path !== '/login') {
        next('/login');
      } else {
        if (from.path !== '/login') {
          if (per) {
            store.dispatch('setPermList').then(() => {
              per = false;
            });
          } else {
            next();
          }
        } else {
          next();
        }
      }
      next();
    });
    

    当页面每次刷新的时候(ps:定义per变量,就是为了防止每次进刷新的时候去dispatch,而是在页面刷新的时候去触发),去dispatch.状态管理的代码如下。首先拿到用户权限数组,然后分成一级菜单跟二级菜单两个数组。对一级菜单和默认的路由表进行遍历,筛选出有权限的路由表,再过滤掉一级路由里没有权限的二级路由。

    const state = {
      permList: []
    };
    const getters = {
      permList: state => state.permList
    };
    const getters = {
      permList: state => state.permList
    };
    const actions = {
      setPermList ({commit}) {
        return new Promise(resolve => {
          api.getUserPerm().then(res => {
            let perm = res.data;
            // 一级菜单
            let oldParent = perm.filter(item => item.indexOf('-') < 0);
            // 一级菜单下的二级菜单
            let child = perm.filter(item => item.indexOf('-') > 0);
            // for (let c of child) {
            //   oldParent.push(c.split('-')[0]);
            // }
            child.map(c => {
              oldParent.push(c.split('-')[0]);
            });
            console.log(child);
            let newParent = [...new Set(oldParent)]; // 去重
            let routesList = [...new Set(routes)]; // 去重
            let parentArray = [];
            // 生成一级菜单
            newParent.map(
              item => {
                routesList.map(
                  routesItem => {
                    if (routesItem.index === item) {
                      let it = Object.assign({}, routesItem);
                      parentArray.push(it);
                    }
                  }
                );
              }
            );
            // 过滤掉一级菜单下的二级菜单
            for (let pItem of parentArray) {
              pItem.children = pItem.children ? pItem.children.filter(n => child.indexOf(n.index) != -1) : null;
            }
            homeRoute.children = parentArray;
            router.addRoutes([homeRoute]);
            commit(types.PERM_LIST, parentArray);
            resolve(perm);
          });
        });
      }
    };
    const mutations = {
      [types.PERM_LIST] (state, data) {
        state.permList = data;
      }
    };
    

    例如,当获取到的用户权限为:[‘1’, ‘2-1’, ‘3’],那么生成的路由为:

      {
        path: '/home',
        component: home,
        icon: 'el-icon-home',
        index: '1',
        name: '系统首页',
        disabled: true
      }, {
        path: '/list',
        component: list,
        icon: 'el-icon-tickets',
        name: '菜单1',
        redirect: '/list1',
        index: '2',
        children: [
          {
            path: '/list1',
            name: '菜单列表1',
            component: list1,
            index: '2-1'
          }
        ]
      }, {
        path: '/userManage',
        component: userManage,
        icon: 'el-icon-ticket',
        name: '用户管理',
        index: '3'
      }
    

    根据路由生成首页菜单

    路由数组都出来了,那么生成菜单就不在话下了。菜单也是用到了element-ui的菜单

      <div class="sidebar">
        <!-- default-active:当前激活菜单的index ,collapse:是否折叠-->
        <el-menu class="sidebar-el-menu" :default-active="onRoutes" :collapse="collapse" background-color="#324157" text-color="#bfcbd9" active-text-color="#20a0ff" unique-opened router>
           <!--每个菜单项-->
           <template v-for="item in permList">
               <!--二级子菜单-->
                <template v-if="item.children">
                    <el-submenu :index="item.path" :key="item.path">
                        <template slot="title">
                            <i :class="item.icon"></i>
                            <span slot="title">{{ item.name }}</span>
                        </template>
                        <template v-for="subItem in item.children">
                            <!--v-if,v-else:条件选择,加key属性会重新渲染-->
                            <el-submenu v-if="subItem.children" :index="subItem.path" :key="subItem.path">
                                <template slot="title">{{ subItem.name }}</template>
                                <el-menu-item v-for="(threeItem,i) in subItem.children" :key="i" :index="threeItem.path">
                                    {{ threeItem.name }}
                                </el-menu-item>
                           </el-submenu>
                           <!--没有三级子菜单,所以全部走else条件-->
                            <el-menu-item v-else :index="subItem.path" :key="subItem.path">
                                {{ subItem.name }}
                            </el-menu-item>
                        </template>
                    </el-submenu>
                </template>
                <template v-else>
                    <el-menu-item :index="item.path" :key="item.path">
                        <i :class="item.icon"></i>
                        <span slot="title">{{ item.name }}</span>
                    </el-menu-item>
                </template>
                </template>
        </el-menu>
      </div>
    

    生成的菜单如下:

    补充

    我在网上查阅到的后台权限管理,都是跟角色挂钩的,无法满足我的需求,于是在反复思考下想到了这样的做法,有些不足的地方还需要继续补充和完善。例如:目前在菜单级别上,只是做了一二级菜单,没有三级菜单。在状态管理生成新的路由的代码片段感觉写的有点繁琐,有待优化。希望大家能提出意见,想要看源码的可以私聊我。原文地址:https://juejin.im/post/5c08c3ece51d451dde1b0c08

    展开全文
  • 前台系统和后台系统中异常的设计

    千次阅读 2017-04-24 10:21:53
    前台系统和后台系统中异常的设计 后台系统后台系统应将异常信息完整地、准确地返回给前台系统。 如: facade层 LoanFacadeImpl.java //申请贷款 try { String loanRecordNo = loanBiz.applyLoan...
  • 在写一个程序之前,需要在大脑中对整个系统有一...电子商城的后台系统,通常都会有权限管理模块,但权限管理模块,与商城的业务没有关系,所以权限管理就要放到框架中。而且,不单是电子商城,其它系统的后台,也可...
  • vue开发的一个后台系统

    千次阅读 2017-09-16 18:13:41
    vue开发的一个后台系统
  • 【代码分享】一套后台系统RuoYi

    千次阅读 2019-06-28 08:59:52
    于是利用空闲休息时间开始自己写了一套后台系统。如此有了若依。她可以用于所有的Web应用程序,如网站管理后台,网站会员中心,CMS,CRM,OA。所有前端后台代码封装过后十分精简易上手,出错概率低。同时支持移动...
  • 基础版的聊天后台系统

    千次阅读 2018-09-20 16:37:15
    基础版的聊天后台系统一、聊天功能二、 架构组成三、 流程图四、 会遇见的问题 一、聊天功能 一对一聊天 语音发送 表情发送 图片发送 聊天历史 聊天联系人 在线消息提醒 个人设置 下线消息通知 功能...
  • 推荐一个Java后台系统Bootstrap模板

    千次阅读 2018-03-29 19:42:18
    推荐一个Java后台系统Bootstrap模板 这个模板是我们公司专门用来做后台系统的,简单,漂亮,不会前端的也可以做 下载地址:https://download.csdn.net/download/qq_21683643/10316430...
  • 基于SpringBoot 2的管理后台系统

    万次阅读 2018-04-24 20:02:50
    本文demo下载:http://www.wisdomdd.cn/Wisdom/resource/articleDetail.htm?resourceId=1062一个基于SpringBoot 2 的管理后台系统,包含了用户管理,组织机构管理,角色管理,功能点管理,菜单管理,权限分配,数据...
  • 案例五:网站后台系统页面

    千次阅读 多人点赞 2019-01-15 21:19:00
    案例五:网站后台系统页面 框架集标签: &amp;lt;frameset rows=&quot;&quot; cols=&quot;&quot;&amp;gt; &amp;lt;frame src=&quot;&quot;/&amp;gt; &amp;...
  • 微信红包后台系统可用性设计实践

    千次阅读 2017-07-04 21:28:48
    微信红包业务量级的高速发展,对后台系统架构的可用性要求越来越高。在保障微信红包业务体验的前提下,红包后台系统进行了一系列高可用方面的优化设计。本次演讲介绍了微信红包后台系统的高可用实践经验,主要包括...
  • 支付宝等大型支付系统交易额巨大,后台系统是如何对账和风控的呢?
  • TP5后台系统+小程序商城源码【前端+后台】开源完整版 扩展性 独立模块式开发,完善的注释,易扩展。 安全性 防止sql注入,代码高安全性。 轻量级,高性能 支持多数据库,读写分离,高并发,内置缓存机制。 后端基于...
  • 后台系统设计:工作流设计剖析

    千次阅读 2017-11-28 00:00:00
    一般在稍微复杂一些的后台系统中,工作流的设计是不可避免的一个重要部分。 设计好一个后台工作流,不仅可以使得后期使用系统的时候更加高效,同时也是十分考验产品经理的。 刚好最近自己在做这方面的工作...
  • 秒杀后台系统设计

    千次阅读 2016-10-20 18:07:39
    网上有很多介绍秒杀系统架构文章,写得不错,包括前后端的实现,这里只从后台服务系统架构阐述。 打开页面时查询商品数量和点击抢购按钮提交校验时都是从本地web进程内缓存读取,这里没有使用redis,是考虑到...
  • 10个细节提升后台系统的用户体验

    千次阅读 2017-01-08 09:57:02
    要说程序员最开心的事情是什么,不是钱多活少离家近...尽管它只是一个后台系统。 说到后台系统(管理系统、ERP系统),我也做过很多了,无一不难看、难用。因为这类系统不是给终端用户使用,对交互要求不高,也没有UI
  • 后台系统 (Foreground/Background System) 这种系统可称为前后台系统或超循环系统(Super-Loops)。应用程序是一个无限的循环,循环中调用相应的函数完成相应的操作,这部分可以看成后台行为(background)。中断...
  • ace admin 是一个非常好的后台系统ui。 集成了很多的好东西。非常的方便开发后天系统,而且能很漂亮。 上面有一堆的例子。非常的漂亮。 http://ace.jeka.by/ 之前还是收费的。后来在github 上面放了一个项目。...
  • 后台系统不好用?找不到结症在哪里?可能缺少了这样的交互设计——后台说明。 1.背景 这事要从自己经历的案例说起,最近忙活的一个后台管理系统上线了。吻合业务需求的功能,准确有效率的数据,好用的...
  • Ant Design Pro of Vue——蚂蚁金服中后台系统框架搭建 Ant Design Pro of Vue下载安装启动步骤: 一、Ant Design Pro of Vue 的介绍 Ant Design Pro 是一个企业级中后台前端/设计解决方案,我们秉承 Ant Design 的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 94,259
精华内容 37,703
关键字:

后台系统