内容目录:

  • 数据库设计
  • easyUI的使用

数据库设计

权限表Perssion

角色表Role

权限和角色关系表RoleToPermission

用户表UserInfo

用户和角色关系表UserInfoToRole

  1. from django.db import models
  2.  
  3. # Create your models here.
  4.  
  5. class Permission(models.Model):
  6. caption = models.CharField(max_length=32)
  7. parent_id = models.ForeignKey('Permission', related_name='k', to_field='id', null=True, blank=True)
  8. code = models.CharField(max_length=64, null=True,blank=True)
  9. method = models.CharField(max_length=16, null=True,blank=True)
  10. kwargs = models.CharField(max_length=128, null=True,blank=True)
  11. is_menu = models.BooleanField(default=False)
  12.  
  13. def __str__(self):
  14. return self.caption
  15.  
  16. class Role(models.Model):
  17. name = models.CharField(max_length=32)
  18. def __str__(self):
  19. return self.name
  20.  
  21. class RoleToPermission(models.Model):
  22. menu_id = models.ForeignKey(Permission, to_field='id')
  23. role_id = models.ForeignKey(Role, to_field='id')
  24.  
  25. def __str__(self):
  26. return "%s-%s" %(self.menu_id.caption, self.role_id.name)
  27. # 目标,根据角色列表获取权限 li
  28. # 获取当前用户的所有标题权限
  29. # RoleToPermission.objects.filter(role_id__in=li,menu_id__is_menu=True).\
  30. # values('menu_id__caption','menu_id__parent_id','menu_id__parent_id','menu_id__code')
  31.  
  32. # 获取当前用户的所有权限
  33. # RoleToPermission.objects.filter(role_id__in=li).\
  34. # values('menu_id__caption','menu_id__parent_id','menu_id__parent_id','menu_id__code')
  35.  
  36. class UserInfo(models.Model):
  37. username = models.CharField(max_length=32)
  38. password = models.CharField(max_length=64)
  39.  
  40. def __str__(self):
  41. return self.username
  42.  
  43. class UserInfoToRole(models.Model):
  44. user_id = models.ForeignKey(UserInfo, to_field='id')
  45. role_id = models.ForeignKey(Role, to_field='id')
  46. def __str__(self):
  47. return '%s-%s' %(self.user_id.username, self.role_id.name)
  48.  
  49. # userinfo: id = 3 username=alex
  50. # result_list = UserInfoToRole.objects.filter(user_id_id=3).values('role_id_id')
  51. # UserInfoToRole.objects.filter(user_id_id=1).values_list('role_id_id')
  52. # [{'role_id_id': 1}.{'role_id_id': 2}.{'role_id_id': 3}]
  53. # 当前用户的角色列表
  54. # li = list(map(lambda x: x['role_id_id'], result_list))
  55. # [1,2,3]
  56. # [(1,)]
  57. # [1,2,3]

models code

可以通过django自带的后台admin添加插入数据

  1. from django.contrib import admin
  2. from app01 import models
  3. # Register your models here.
  4. admin.site.register(models.Permission)
  5. admin.site.register(models.Role)
  6. admin.site.register(models.RoleToPermission)
  7. admin.site.register(models.UserInfo)
  8. admin.site.register(models.UserInfoToRole)
  9. # python manage.py createsuperuser
  10. # root, root!23456

admin code

创建admin的超级用户root/root!23456

python3 manage.py createsuperuser

上面的models中定义的def __str__只是为了在admin后台中显示正常的名称,否则显示的为对象

easyUI的使用

下载easyui包,引用包中自带的功能

  1. from django.conf.urls import url
  2. from django.contrib import admin
  3. from app01 import views
  4. urlpatterns = [
  5. url(r'^admin/', admin.site.urls),
  6. url(r'^login/', views.login),
  7. url(r'^index/', views.index),
  8. url(r'^permission/', views.permission),
  9. url(r'^get_permission_tree/', views.get_permission_tree),
  10. url(r'^get_child_permission/', views.get_child_permission),
  11. url(r'^user/', views.user),
  12. ]

Url Code

  1. from django.shortcuts import render, redirect, HttpResponse
  2. from app01 import models
  3. import json
  4.  
  5. # Create your views here.
  6. def login(request):
  7. if request.method == 'POST':
  8. user = request.POST.get('user')
  9. pwd = request.POST.get('pwd')
  10. obj = models.UserInfo.objects.filter(username=user, password=pwd).first()
  11. if obj:
  12. # 当前用户信息保存至Session
  13. request.session['user_info'] = {'id': obj.id, 'name': obj.username}
  14.  
  15. # 当前用户角色列表保存至Session
  16. result_list = models.UserInfoToRole.objects.filter(user_id_id=obj.id).values('role_id_id')
  17. role_list = list(map(lambda x: x['role_id_id'], result_list))
  18. request.session['role_list'] = role_list
  19.  
  20. # 当前用户所有权限加入Session
  21. from django.db.models import Count, Min, Max, Sum
  22. permission_list = models.RoleToPermission.objects.filter(role_id__in=role_list).values(
  23. 'menu_id_id').annotate(c=Count('menu_id_id')).values('menu_id__caption',
  24. 'menu_id__parent_id',
  25. 'menu_id__code',
  26. 'menu_id__method',
  27. 'menu_id__kwargs',
  28. 'menu_id__id')
  29. # 根据permission_id去重
  30. permission_list = list(permission_list)
  31. request.session['permission_list'] = permission_list
  32.  
  33. menu_list = models.RoleToPermission.objects.filter(role_id__in=role_list,menu_id__is_menu=True).values(
  34. 'menu_id_id').annotate(c=Count('menu_id_id')).values('menu_id__caption',
  35. 'menu_id__parent_id',
  36. 'menu_id__code',
  37. 'menu_id__method',
  38. 'menu_id__kwargs',
  39. 'menu_id__id',)
  40. # 根据permission_id去重
  41. menu_list = list(menu_list)
  42. request.session['menu_list'] = menu_list
  43.  
  44. return redirect('/index/')
  45. return render(request, 'login.html')
  46.  
  47. def build_node(menu_list, dic):
  48. #
  49. for menu in menu_list:
  50. if menu['id'] == dic['menu_id__parent_id']:
  51. temp = {'id': dic['menu_id__id'],'text': dic['menu_id__caption'], 'url': dic['menu_id__code'],'children': []}
  52. menu['children'].append(temp)
  53. break
  54. else:
  55. build_node(menu['children'], dic)
  56.  
  57. def build_tree(session_menu_list):
  58. # [ {menu_id__parent_id: None, 'menu_id__caption': '权限管理', 'menu_id__code': 'permission'},{},{} ]
  59. menu_list = []
  60. # menu_list = [{...}]
  61. for dic in session_menu_list:
  62. if dic['menu_id__parent_id'] == None:
  63. temp = {'id': dic['menu_id__id'],'text': dic['menu_id__caption'], 'url': dic['menu_id__code'],'children': []}
  64. menu_list.append(temp)
  65. else:
  66. # 当前
  67. build_node(menu_list, dic)
  68. return menu_list
  69.  
  70. def my_render(request, template_name, context=None, *args, **kwargs):
  71. session_menu_list = request.session['menu_list']
  72. menu_list = build_tree(session_menu_list)
  73. if context:
  74. context['menu_list'] = menu_list
  75. else:
  76. context = {'menu_list': menu_list}
  77. return render(request, template_name, context, *args, **kwargs)
  78.  
  79. def index(request):
  80. # 根据session中保存的menu_list生成动态菜单
  81. # session_menu_list = request.session['menu_list']
  82. # menu_list = build_tree(session_menu_list)
  83. #
  84. # menu_list = [
  85. # {
  86. # 'id': 1,
  87. # 'text': '权限管理',
  88. # 'url': None,
  89. # 'children': [
  90. # {
  91. # 'id': 4,
  92. # 'text': '权限',
  93. # 'url': 'permission'
  94. # },
  95. # {
  96. # 'id': 5,
  97. # 'text': '用户',
  98. # 'url': 'user'
  99. # }
  100. # ]
  101. # },
  102. # {
  103. # 'id': 2,
  104. # 'text': '用户管理',
  105. # 'url': None
  106. # },
  107. # {
  108. # 'id': 3,
  109. # 'text': '帮助',
  110. # 'url': None
  111. # }
  112. #
  113. #
  114. # ]
  115.  
  116. return my_render(request, 'index.html')
  117.  
  118. def permission(request):
  119. # 当前用户所有的权限
  120.  
  121. return my_render(request, 'permission.html')
  122.  
  123. def get_permission_tree(request):
  124. session_permission_list = request.session['permission_list']
  125. permission_list = build_tree(session_permission_list)
  126. return HttpResponse(json.dumps(permission_list))
  127.  
  128. def get_child_permission(request):
  129. node_parent_id = request.GET.get('node_parent_id')
  130. page = request.GET.get('page')
  131. rows = request.GET.get('rows')
  132. page = int(page)
  133. rows = int(rows)
  134. start = (page - 1) * rows
  135. end = page * rows
  136.  
  137. result_queryset = models.Permission.objects.filter(parent_id = node_parent_id).values('caption','code')[start:end]
  138. result_list = list(result_queryset)
  139. # [ {'caption': 'x', 'code': xxx} ]
  140. return HttpResponse(json.dumps(result_list))
  141.  
  142. def user(request):
  143. return my_render(request, 'user.html')

Views Code

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Full Layout - jQuery EasyUI Demo</title>
  6. <link rel="stylesheet" type="text/css" href="/static/easyui/themes/default/easyui.css">
  7. <link rel="stylesheet" type="text/css" href="/static/easyui/themes/icon.css">
  8. <script type="text/javascript" src="/static/easyui/jquery.min.js"></script>
  9. <script type="text/javascript" src="/static/easyui/jquery.easyui.min.js"></script>
  10. <style>
  11. .crm-menu{
  12. display: block;
  13. padding: 8px;
  14. border-bottom: 1px dotted #dddddd;
  15. }
  16. .crm-menu:hover{
  17. background-color: #E0ECFF;
  18. }
  19. </style>
  20. {% block css %} {% endblock %}
  21. </head>
  22. <body class="easyui-layout">
  23. <div data-options="region:'north',border:false" style="height:60px;background:#B3DFDA;padding:10px">
  24. LOGO
  25. </div>
  26. <div data-options="region:'west',split:true,title:'West'" style="width:150px;">
  27. <div id="aa" class="easyui-accordion" style="width:100%;">
  28.  
  29. {% for menu in menu_list %}
  30. <div title="{{ menu.text }}" data-options="iconCls:'icon-ok'" style="overflow:auto;">
  31.  
  32. {% for child in menu.children %}
  33. <a id="menu_{{ child.url }}" href='/{{ child.url }}/' class='crm-menu'>{{ child.text }}</a>
  34. {% endfor %}
  35. </div>
  36. {% endfor %}
  37.  
  38. </div>
  39.  
  40. </div>
  41. <div data-options="region:'south',border:false" style="height:50px;background:#A9FACD;padding:10px;">south region</div>
  42. <div data-options="region:'center',title:'Center'">
  43. {% block content %} {% endblock %}
  44. </div>
  45.  
  46. {% block js %} {% endblock %}
  47. </body>
  48. </html>

_layout.html

  1. {% extends 'layout/_layout.html' %}
  2.  
  3. {% block content %}
  4. <h1>Index</h1>
  5. {% endblock %}

Index

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title></title>
  6. </head>
  7. <body>
  8. <form action="/login/" method="POST">
  9. <input type="text" name="user" />
  10. <input type="password" name="pwd" />
  11. <input type="submit" value="登录" />
  12. </form>
  13. </body>
  14. </html>

login

  1. {% extends 'layout/_layout.html' %}
  2.  
  3. {% block content %}
  4.  
  5. <div style="float: left;width: 300px">
  6. <ul id="pers_tree" ></ul>
  7. <!-- <ul id="tt" class="easyui-tree" data-options="url:'/get_permission_tree/',method:'get',animate:true"></ul> -->
  8. </div>
  9.  
  10. <div style="float: left;width: 600px">
  11. <table id="dg"></table>
  12. </div>
  13.  
  14. {% endblock %}
  15.  
  16. {% block js %}
  17. <script>
  18. $(function(){
  19. InitTree();
  20. });
  21.  
  22. function InitTree(){
  23. $('#pers_tree').tree({
  24. url: '/get_permission_tree/',
  25. method: 'get',
  26. animate: true,
  27. onClick: function(node){
  28. console.log(node.text,node.id);
  29. InitTable(node.id);
  30. InitPagination();
  31. }
  32. })
  33. }
  34.  
  35. function InitTable(node_parent_id){
  36. $('#dg').datagrid({
  37. title: '听不下去了',
  38. url: '/get_child_permission/',
  39. method: 'get',
  40. queryParams: {
  41. node_parent_id: node_parent_id
  42. },
  43. columns: [[
  44. {
  45. field: 'ck',
  46. checkbox: true
  47. },
  48. {
  49. field: 'caption',
  50. title: '标题',
  51. width: 180,
  52. align: 'center'
  53. },
  54. {
  55. field: 'code',
  56. title: 'URL',
  57. width: 180,
  58. align: 'center'
  59. }
  60.  
  61. ]],
  62. toolbar: [
  63. {
  64. text: '添加',
  65. iconCls: 'icon-add',
  66. handler: AddRow
  67. }, {
  68. text: '删除',
  69. iconCls: 'icon-remove',
  70. handler: RemoveRow
  71. }, {
  72. text: '修改',
  73. iconCls: 'icon-edit',
  74. handler: EditRow
  75. }
  76. ],
  77. pagePosition: 'both',
  78. pagination: true,
  79. pageSize: 10,
  80. pageNumber: 1,
  81. pageList: [10, 20, 50]
  82. })
  83. }
  84.  
  85. function AddRow(){
  86. console.log('addrow');
  87. }
  88. function RemoveRow(){
  89. console.log('RemoveRow');
  90. }
  91. function EditRow(){
  92. console.log('EditRow');
  93. }
  94.  
  95. function InitPagination() {
  96. var pager = $('#dg').datagrid('getPager');
  97. $(pager).pagination({
  98. beforePageText: '第',
  99. afterPageText: '页 共{pages}页',
  100. displayMsg: '当前显示{from}-{to}条记录 共{total}条数据'
  101. })
  102. }
  103. </script>
  104. {% endblock %}

permission.html

  1. {% extends 'layout/_layout.html' %}
  2.  
  3. {% block content %}
  4. <h1>User</h1>
  5. {% endblock %}
  6.  
  7. {% block js %}
  8. <script>
  9. $(function(){
  10. InitMenu();
  11. });
  12. function InitMenu(){
  13. $('#menu_user').addClass('active');
  14. var text = $('#menu_user').parent().prev().find('.panel-title').text();
  15. $('#aa').accordion('select',text);
  16. }
  17. </script>
  18. {% endblock %}

User.html

程序目录结构

python运维开发(二十四)----crm权限管理系统的更多相关文章

  1. python运维开发(二十二)---JSONP、瀑布流、组合搜索、多级评论、tornado框架简介

    内容目录: JSONP应用 瀑布流布局 组合搜索 多级评论 tornado框架简介 JSONP应用 由于浏览器存在同源策略机制,同源策略阻止从一个源加载的文档或脚本获取或设置另一个源加载的文档的属性. ...

  2. python运维开发(二十)----models操作、中间件、缓存、信号、分页

    内容目录 select Form标签数据库操作 models操作F/Q models多对多表操作 Django中间件 缓存 信号 分页 select Form标签补充 在上一节中我们可以知道Form标 ...

  3. python运维开发(二十五)---cmdb开发

    内容目录: 浅谈ITIL CMDB介绍 Django自定义用户认证 Restful 规范 资产管理功能开发 浅谈ITIL TIL即IT基础架构库(Information Technology Infr ...

  4. python运维开发常用模块(四)文件对比模块difflib

    1.difflib介绍 difflib作为 Python的标准库模块,无需安装,作用是对比文本之间的差异,且支持 输出可读性比较强的HTML文档,与Linux下的diff命令相似.我们可以 使用dif ...

  5. python运维开发之第四天

    一.装饰器 1.器:代表函数,装饰器本质是函数,(装饰器他函数) 2.功能:为其他函数添加附加功能 3.原则: (1)不能修改被装饰函数的源代码 (2)不能修改被装饰函数的调用方式 4.实现装饰器知识 ...

  6. python运维开发(二十三)---tornado框架

    内容目录: 路由系统 模板引擎 cookie 加密cookie 自定义api 自定义session 自定义form表单验证 异步非阻塞 web聊天室实例 路由系统 路由系统其实就是 url 和 类 的 ...

  7. python运维开发(二十一)----文件上传和验证码+session

    内容目录: 文件上传 验证码+session 文件和图片的上传功能 HTML Form表单提交,实例展示 views 代码 HTML ajax提交 原生ajax提交,XMLHttpRequest方式上 ...

  8. Python运维开发基础09-函数基础【转】

    上节作业回顾 #!/usr/bin/env python3 # -*- coding:utf-8 -*- # author:Mr.chen # 实现简单的shell命令sed的替换功能 import ...

  9. Python运维开发基础08-文件基础【转】

    一,文件的其他打开模式 "+"表示可以同时读写某个文件: r+,可读写文件(可读:可写:可追加) w+,写读(不常用) a+,同a(不常用 "U"表示在读取时, ...

随机推荐

  1. 利用Azure Redis Cache构建百万量级缓存读写

    Redis是一个非常流行的基于内存的,低延迟,高吞吐量的key/value数据存储,被广泛用于数据库缓存,session的管理,热数据高速访问,甚至作为数据库方式提高应用程序可扩展性,吞吐量,和实施处 ...

  2. mac/unix系统:C++实现一个端口扫描器

    在比较早以前,我用过S扫描器, 以及大名鼎鼎的nmap扫描器, 可以快速扫描某个主机开放的端口, 今天使用C实现这样一个软件, 编译环境为Mac, 系统版本10.11.6: #include < ...

  3. [UVA] 11991 - Easy Problem from Rujia Liu? [STL应用]

    11991 - Easy Problem from Rujia Liu? Time limit: 1.000 seconds Problem E Easy Problem from Rujia Liu ...

  4. log4c 编译安装简单小结(ubuntu12)

    1 下载源码,解压 (假定解压到了当前用户的根目录下,位置是~/log4c-1.2.3) 2 编译安装log4c(指定--prefix极其重要,如果没有指定到/usr下会有一堆麻烦事,还有,不能按照他 ...

  5. js django 数据互动

    后台传输到客户端的数据怎么跟js进行互动 eval("("+{{data|safe}}+")") 获取到的数据可以直接使用 eval 有时候会存在编码问题所以推 ...

  6. DEVExpress For WPF 中GridControl如何实现滚动分页(延迟查询)

    在显示大量数据时一般采用分页显示,但是最近用户需要滚动显示,那么问题来了,滚动显示要求将数据全部查询回来,这显然会导致显示速度很慢. 好在想到一种方式,就是当用户滚动鼓动条的时候再查询下面的数据.好吧 ...

  7. Android开源中国客户端学习 (自定义View)左右滑动控件ScrollLayout

    左右滑动的控件我们使用的也是非常多了,但是基本上都是使用的viewpager 等 android基础的控件,那么我们有么有考虑过查看他的源码进行定制呢?当然,如果你自我感觉非常好的话可以自己定制一个, ...

  8. 实用的VIM配置文件

    VIM配置文件名为.vimrc,默认在用户根目录下,或者在命令模式下输入:version可以获取配置文件路径. 在VIM命令行下输入options,然后回车,可以查看VIM所有的参数选项. 双引号&q ...

  9. 第10讲- UI线程阻塞及其优化

    第10讲UI线程阻塞及其优化 .UI 阻塞demo (首先在activity_main.xml中放置两个button,分别命名为button1,button2) //首先设置一个button1用来进行 ...

  10. copy模块

    # -*- coding: utf-8 -*- # python:2.x __author__ = 'Administrator' #copy复制对象 #作用:提供一些函数,可以使用潜复制和深复制进行 ...