百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程字典 > 正文

关于自动化平台的动态菜单设计(关于自动化平台的动态菜单设计方案)

toyiye 2024-04-04 11:41 27 浏览 0 评论

最近几天是马不停蹄的做一些事情,今天计划把通用功能的部分先改进一些,比如说菜单的权限配置。目前使用的方案是用户可以看到所有的菜单,如果没有权限,则返回一个权限不足的页面。

因为整个开发后面会有多个模块,而且有些功能其实放在一起会看起来有些庞大,所以我们可以做裁剪,就是你登录以后,你能看到你拥有权限的菜单。

事情可以天马行空的想,但是落到实处做的时候,发现还是有一些差别。比如我考虑了几个方案:

  1. 重写目前的登录校验逻辑,不使用默认的admin模板的用户

  2. 复用已有的用户模型,然后添加几个定制字段来满足需求

根据目前的功能实现,如果重写user的模型,会有较大的难度,所以第一点可行但是代价太高,第二点的考虑是用户的密码校验一个是默认实现的逻辑,代码改动后会不稳定而且改动效率较低,因为原来的用户是一个抽象类,需要重新改动,代价也不低。

所以,思来想去,怎么做都代价不小,于是乎,换了一个思路。原来的逻辑是静态的,根据提供的菜单列表来得到一些可选的权限,我们可以保留这个逻辑,重新定制一下菜单的部分,菜单和用户为多对多的关系,原来的用户表也不用改动,只需要定制关系表就可以了。

所以权衡再三的想法是如果没权限就不要直接看到菜单,这部分的关系在多对多的映射中体现。

到了这个程度,其实就离具体实现不远了,我们继续来理一下。

系统中默认创建的用户只有普通权限,需要登录到系统激活才可以使用,所以我们的系统的想法是不要求一步到位,类似于邀请制,指定的用户才可以配置相应的权限,所以不会出现一下子创建出来多个超级用户的情况,原来的逻辑就不用改动,继续保留。

在这个基础上配置一个菜单管理页面,把每个菜单的标题,url,映射信息都和用户映射起来。

前端显示的部分则通过首页的index.html根据用户的信息动态匹配得到一个较新的菜单列表,意味着每个人看到的菜单可能不同。

用户和菜单之间是多对多的关联关系

所以Django中的models.py的内容如下:

class Menu(models.Model):
menu_type_choices = (
('dashborad', u'平台看板'),
('cmdb', u'资产管理'),
('env_deploy', u'环境部署'),
('backup', u'数据备份'),
('recover', u'数据恢复'),
('scheduler', u'任务调度'),
('global_config', u'全局配置'),
('user_center', u'用户中心'),
)
server_status_choices = (
('1', 'valid'),
('0', 'invalid'),
)
menu_id = models.SmallIntegerField(primary_key=True,verbose_name='菜单ID')
menu_title = models.CharField(max_length=50,verbose_name='菜单标题')
menu_url = models.CharField(max_length=50,verbose_name='菜单URL',unique=False)
menu_level = models.SmallIntegerField(blank=True,null=False,verbose_name='菜单等级')
menu_parent_level = models.SmallIntegerField(blank=True,null=False,verbose_name='菜单父等级')
menu_style = models.CharField(max_length=50,verbose_name='菜单选用的组件风格')
menu_type = models.CharField(max_length=50,choices=menu_type_choices,null=False,verbose_name='菜单大类')
create_date = models.DateTimeField(auto_now_add=True)
update_date = models.DateTimeField(auto_now_add=True)
user_role = models.ManyToManyField(User)
menu_status = models.SmallIntegerField(choices=server_status_choices,null=False,verbose_name='菜单状态')
class Meta:
db_table = 'menu'
permissions = (
("can_read_menu", "读取菜单权限"),
("can_change_menu", "更改菜单权限"),
("can_add_menu", "添加菜单权限"),
("can_delete_menu", "删除菜单权限"),
)
verbose_name = '菜单配置'
verbose_name_plural = '菜单配置'

ORM映射生成的SQL类似下面的形式:

BEGIN;
CREATE TABLE `menu` (`menu_id` smallint NOT NULL PRIMARY KEY, `menu_title` varchar(50) NOT NULL, `menu_url` varchar(50) NOT NULL, `menu_level` smallint NULL, `menu_parent_level` smallint NULL, `menu_style` varchar(50) NOT NULL, `menu_type` smallint NOT NULL, `create_date` datetime(6) NOT NULL, `update_date` datetime(6) NOT NULL, `menu_status` smallint NOT NULL);
CREATE TABLE `menu_user_role` (`id` integer AUTO_INCREMENT NOT NULL PRIMARY KEY, `menu_id` smallint NOT NULL, `user_id` integer NOT NULL, UNIQUE (`menu_id`, `user_id`));
ALTER TABLE `menu_user_role` ADD CONSTRAINT `menu_user_role_menu_id_15dc921823a77a3f_fk_menu_menu_id` FOREIGN KEY (`menu_id`) REFERENCES `menu` (`menu_id`);
ALTER TABLE `menu_user_role` ADD CONSTRAINT `menu_user_role_user_id_52439a830d70516d_fk_auth_user_id` FOREIGN KEY (`user_id`) REFERENCES `auth_user` (`id`);
COMMIT;

有了这些基本的设计,我们来模拟测试一下,当前的menu为空。

>>> from django.contrib.auth.models import User
>>> from db_ops.models import Menu
>>> Menu.objects.all()
(0.001) QUERY = u'SELECT "menu"."menu_id", "menu"."menu_title", "menu"."menu_url", "menu"."menu_level", "menu"."menu_parent_level", "menu"."menu_style", "menu"."menu_type", "menu"."create_date", "me
nu"."update_date", "menu"."menu_status" FROM "menu" LIMIT 21' - PARAMS = (); args=()
[]

我们调用API生成一个user,一个menu信息。

User.objects.create(password='admin2',is_superuser=0,username='admin2',first_name='admin',last_name='admin',email='aa@aa.com',is_staff=0,is_active=1,date_joined='2018-01-04')
Menu.objects.create(menu_id=1,menu_title='元数据管理',menu_url='cmdb_manage',menu_level=2,menu_parent_level=1,menu_type='cmdb',create_date='2018-01-04',update_date='2018-01-04',menu_status=1)

如果要做多对多的映射,则是使用add方法,注意生成的insert语句。

user = User.objects.get(pk=2)
menu = Menu.objects.get(pk=1)
>>> menu.user_role.add(user)
(0.000) QUERY = u'BEGIN' - PARAMS = (); args=None
(0.000) QUERY = u'SELECT "menu_user_role"."user_id" FROM "menu_user_role" WHERE ("menu_user_role"."menu_id" = %s AND "menu_user_role"."user_id" IN (%s))' - PARAMS = (1, 2); args=(1, 2)
(0.081) QUERY = u'INSERT INTO "menu_user_role" ("menu_id", "user_id") SELECT %s AS "menu_id", %s AS "user_id"' - PARAMS = (1, 2); args=(1, 2)

如果要查询中间表的数据,可以做关联,比如下面的形式。

>>>User.objects.filter(menu__user_role=1)

后续继续补充完善。

相关推荐

为何越来越多的编程语言使用JSON(为什么编程)

JSON是JavascriptObjectNotation的缩写,意思是Javascript对象表示法,是一种易于人类阅读和对编程友好的文本数据传递方法,是JavaScript语言规范定义的一个子...

何时在数据库中使用 JSON(数据库用json格式存储)

在本文中,您将了解何时应考虑将JSON数据类型添加到表中以及何时应避免使用它们。每天?分享?最新?软件?开发?,Devops,敏捷?,测试?以及?项目?管理?最新?,最热门?的?文章?,每天?花?...

MySQL 从零开始:05 数据类型(mysql数据类型有哪些,并举例)

前面的讲解中已经接触到了表的创建,表的创建是对字段的声明,比如:上述语句声明了字段的名称、类型、所占空间、默认值和是否可以为空等信息。其中的int、varchar、char和decimal都...

JSON对象花样进阶(json格式对象)

一、引言在现代Web开发中,JSON(JavaScriptObjectNotation)已经成为数据交换的标准格式。无论是从前端向后端发送数据,还是从后端接收数据,JSON都是不可或缺的一部分。...

深入理解 JSON 和 Form-data(json和formdata提交区别)

在讨论现代网络开发与API设计的语境下,理解客户端和服务器间如何有效且可靠地交换数据变得尤为关键。这里,特别值得关注的是两种主流数据格式:...

JSON 语法(json 语法 priority)

JSON语法是JavaScript语法的子集。JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔花括号保存对象方括号保存数组JS...

JSON语法详解(json的语法规则)

JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔大括号保存对象中括号保存数组注意:json的key是字符串,且必须是双引号,不能是单引号...

MySQL JSON数据类型操作(mysql的json)

概述mysql自5.7.8版本开始,就支持了json结构的数据存储和查询,这表明了mysql也在不断的学习和增加nosql数据库的有点。但mysql毕竟是关系型数据库,在处理json这种非结构化的数据...

JSON的数据模式(json数据格式示例)

像XML模式一样,JSON数据格式也有Schema,这是一个基于JSON格式的规范。JSON模式也以JSON格式编写。它用于验证JSON数据。JSON模式示例以下代码显示了基本的JSON模式。{"...

前端学习——JSON格式详解(后端json格式)

JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于JavaScriptProgrammingLa...

什么是 JSON:详解 JSON 及其优势(什么叫json)

现在程序员还有谁不知道JSON吗?无论对于前端还是后端,JSON都是一种常见的数据格式。那么JSON到底是什么呢?JSON的定义...

PostgreSQL JSON 类型:处理结构化数据

PostgreSQL提供JSON类型,以存储结构化数据。JSON是一种开放的数据格式,可用于存储各种类型的值。什么是JSON类型?JSON类型表示JSON(JavaScriptO...

JavaScript:JSON、三种包装类(javascript 包)

JOSN:我们希望可以将一个对象在不同的语言中进行传递,以达到通信的目的,最佳方式就是将一个对象转换为字符串的形式JSON(JavaScriptObjectNotation)-JS的对象表示法...

Python数据分析 只要1分钟 教你玩转JSON 全程干货

Json简介:Json,全名JavaScriptObjectNotation,JSON(JavaScriptObjectNotation(记号、标记))是一种轻量级的数据交换格式。它基于J...

比较一下JSON与XML两种数据格式?(json和xml哪个好)

JSON(JavaScriptObjectNotation)和XML(eXtensibleMarkupLanguage)是在日常开发中比较常用的两种数据格式,它们主要的作用就是用来进行数据的传...

取消回复欢迎 发表评论:

请填写验证码