Skip to content

Commit

Permalink
rbac config
Browse files Browse the repository at this point in the history
  • Loading branch information
RobbieHan committed Nov 16, 2018
1 parent 1f94ffa commit e2edef0
Show file tree
Hide file tree
Showing 22 changed files with 447 additions and 248 deletions.
455 changes: 230 additions & 225 deletions .idea/workspace.xml

Large diffs are not rendered by default.

Binary file modified apps/__pycache__/custom.cpython-36.pyc
Binary file not shown.
Binary file added apps/system/__pycache__/middleware.cpython-36.pyc
Binary file not shown.
Binary file modified apps/system/__pycache__/models.cpython-36.pyc
Binary file not shown.
Binary file modified apps/system/__pycache__/urls.cpython-36.pyc
Binary file not shown.
Binary file modified apps/system/__pycache__/views_menu.cpython-36.pyc
Binary file not shown.
Binary file modified apps/system/__pycache__/views_role.cpython-36.pyc
Binary file not shown.
100 changes: 100 additions & 0 deletions apps/system/middleware.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,100 @@
import re

from django.utils.deprecation import MiddlewareMixin
from django.conf import settings
from django.shortcuts import render


class MenuCollection(MiddlewareMixin):

def get_user(self, request):
return request.user

def get_menu_from_role(self, request, user=None):
if user is None:
user = self.get_user(request)
try:
menus = user.roles.values(
'permissions__id',
'permissions__name',
'permissions__url',
'permissions__icon',
'permissions__code',
'permissions__parent'
).distinct()
return [menu for menu in menus if menu['permissions__id'] is not None]
except AttributeError:
return None

def get_permission_url(self, request):
role_menus = self.get_menu_from_role(request)
if role_menus is not None:
permission_url_list = [menu['permissions__url'] for menu in role_menus]
return permission_url_list

def get_permission_menu(self, request):
permission_menu_list = []
role_menus = self.get_menu_from_role(request)
if role_menus is not None:
for item in role_menus:
menu = {
'id': item['permissions__id'],
'name': item['permissions__name'],
'url': item['permissions__url'],
'icon': item['permissions__icon'],
'code': item['permissions__code'],
'parent': item['permissions__parent'],
'status': False,
'sub_menu': [],
}
permission_menu_list.append(menu)
return permission_menu_list

def get_top_reveal_menu(self, request):
top_menu = []
permission_menu_dict = {}
request_url = request.path_info
permission_menu_list = self.get_permission_menu(request)
if permission_menu_list is not None:
for menu in permission_menu_list:

url = menu['url']
if url and re.match(url, request_url):
menu['status'] = True
if menu['parent'] is None:
top_menu.insert(0, menu)
permission_menu_dict[menu['id']] = menu

menu_data = []
for i in permission_menu_dict:
if permission_menu_dict[i]['parent']:
pid = permission_menu_dict[i]['parent']
parent_menu = permission_menu_dict[pid]
parent_menu['sub_menu'].append(permission_menu_dict[i])
else:
menu_data.append(permission_menu_dict[i])
if [menu['sub_menu'] for menu in menu_data if menu['url'] in request_url]:
reveal_menu = [menu['sub_menu'] for menu in menu_data if menu['url'] in request_url][0]
else:
reveal_menu = None
return top_menu, reveal_menu

def process_request(self, request):
if self.get_top_reveal_menu(request):
request.top_menu, request.reveal_menu = self.get_top_reveal_menu(request)
request.permission_url_list = self.get_permission_url(request)


class RbacMiddleware(MiddlewareMixin):

def process_request(self, request):
if hasattr(request, 'permission_url_list'):
request_url = request.path_info
permission_url = request.permission_url_list
for url in settings.SAFE_URL:
if re.match(url, request_url):
return None
if request_url in permission_url:
return None
else:
return render(request, 'page404.html')
22 changes: 22 additions & 0 deletions apps/system/migrations/0002_auto_20181115_2124.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
# Generated by Django 2.1.2 on 2018-11-15 21:24

from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
('system', '0001_initial'),
]

operations = [
migrations.AlterModelOptions(
name='menu',
options={'ordering': ['number'], 'verbose_name': '菜单', 'verbose_name_plural': '菜单'},
),
migrations.AddField(
model_name='menu',
name='number',
field=models.FloatField(blank=True, null=True, verbose_name='编号'),
),
]
Binary file not shown.
7 changes: 6 additions & 1 deletion apps/system/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,17 +11,22 @@ class Menu(models.Model):
icon = models.CharField(max_length=50, null=True, blank=True, verbose_name="图标")
code = models.CharField(max_length=50, null=True, blank=True, verbose_name="编码")
url = models.CharField(max_length=128, unique=True, null=True, blank=True)
number = models.FloatField(null=True, blank=True, verbose_name="编号")

def __str__(self):
return self.name

class Meta:
verbose_name = '菜单'
verbose_name_plural = verbose_name
ordering = ['number']

@classmethod
def get_menu_by_request_url(cls, url):
return dict(menu=Menu.objects.get(url=url))
try:
return dict(menu=Menu.objects.get(url=url))
except:
pass


class Role(models.Model):
Expand Down
10 changes: 8 additions & 2 deletions apps/system/views_menu.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,10 @@
class MenuCreateView(SandboxCreateView):
model = Menu
fields = '__all__'
extra_context = dict(menu_all=Menu.objects.all())

def get_context_data(self, **kwargs):
kwargs['menu_all'] = Menu.objects.all()
return super().get_context_data(**kwargs)


class MenuListView(LoginRequiredMixin, ListView):
Expand All @@ -20,4 +23,7 @@ class MenuUpdateView(SandboxUpdateView):
model = Menu
fields = '__all__'
template_name_suffix = '_update'
extra_context = dict(menu_all=Menu.objects.all())

def get_context_data(self, **kwargs):
kwargs['menu_all'] = Menu.objects.all()
return super().get_context_data(**kwargs)
Binary file modified db.sqlite3
Binary file not shown.
Binary file modified sandboxMP/__pycache__/settings.cpython-36.pyc
Binary file not shown.
12 changes: 12 additions & 0 deletions sandboxMP/settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,8 @@
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
'apps.system.middleware.MenuCollection',
'apps.system.middleware.RbacMiddleware',
]

ROOT_URLCONF = 'sandboxMP.urls'
Expand Down Expand Up @@ -132,3 +134,13 @@
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')

LOGIN_URL = '/login/'

# safe url
SAFE_URL = [r'^/$',
'/login/',
'/logout',
'/index/',
'/media/',
'/admin/',
'/ckeditor/',
]
36 changes: 24 additions & 12 deletions templates/base-left.html
Original file line number Diff line number Diff line change
Expand Up @@ -21,20 +21,32 @@
<!-- /.search form -->

<!-- Sidebar Menu -->
<ul class="sidebar-menu">
<ul class="sidebar-menu">
<li class="header"></li>
<!-- Optionally, you can add icons to the links -->
<li class="treeview">
<a href="#"><i class="fa fa-calendar"></i> <span>一级菜单</span>
<span class="pull-right-container">
<i class="fa fa-angle-left pull-right"></i>
</span>
</a>
<ul class="treeview-menu">
<li><a href="#"><i class="fa fa-caret-right"></i>二级菜单</a></li>
<li><a href="#"><i class="fa fa-caret-right"></i>二级菜单</a></li>
</ul>
</li>
{% for menu in request.reveal_menu %}
{% if not menu.url %}
<li class="treeview" id="{{ menu.code }}">
<a href="">
<i class="{{ menu.icon }}"></i><span>{{ menu.name }}</span>
<span class="pull-right-container"><i class="fa fa-angle-left pull-right"></i>
</span>
</a>
<ul class="treeview-menu">
{% for sub in menu.sub_menu %}
<li id="{{ sub.code }}">
<a href="{{ sub.url }}"><i class="fa fa-caret-right"></i>{{ sub.name }}</a>
</li>
{% endfor %}
</ul>
</li>
{% else %}
<li id="{{ menu.code }}">
<a href="{{ menu.url }}"><i class="{{ menu.icon }}"></i><span>{{ menu.name }}</span>
</a>
</li>
{% endif %}
{% endfor %}
</ul>
<!-- /.sidebar-menu -->
</section>
Expand Down
10 changes: 7 additions & 3 deletions templates/head-footer.html
Original file line number Diff line number Diff line change
Expand Up @@ -20,9 +20,13 @@
<span class="sr-only">Toggle navigation</span>
</a>
<div class="collapse navbar-collapse pull-left" id="navbar-collapse">
<ul class="nav navbar-nav">
<li class="active" ><a href="#" id="index">头部导航</a></li>
</ul>
{% for menu in request.top_menu %}
<ul class="nav navbar-nav">
<li {% ifequal menu.status True %}class="active" {% endifequal %}>
<a href="{{ menu.url }}" id="{{ menu.code }}">{{ menu.name | default_if_none:"" }}</a>
</li>
</ul>
{% endfor %}
</div>
{% if request.user.is_authenticated %}
<div class="navbar-custom-menu">
Expand Down
11 changes: 8 additions & 3 deletions templates/system/menu_form.html
Original file line number Diff line number Diff line change
Expand Up @@ -18,9 +18,9 @@ <h4>添加菜单</h4>
<div class="col-sm-3">
<input class="form-control" name="name" type="text"/>
</div>
<label class="col-sm-2 control-label">代码</label>
<label class="col-sm-2 control-label">编号</label>
<div class="col-sm-3">
<input class="form-control" name="code" type="text"/>
<input class="form-control" name="number" type="text"/>
</div>
</div>
<div class="form-group has-feedback">
Expand All @@ -43,7 +43,12 @@ <h4>添加菜单</h4>
<div class="col-sm-8">
<input class="form-control" name="url" type="text" />
</div>

</div>
<div class="form-group has-feedback">
<label class="col-sm-2 control-label">代码</label>
<div class="col-sm-8">
<input class="form-control" name="code" type="text"/>
</div>
</div>
</fieldset>
</div>
Expand Down
11 changes: 9 additions & 2 deletions templates/system/menu_update.html
Original file line number Diff line number Diff line change
Expand Up @@ -18,9 +18,9 @@ <h4>修改菜单</h4>
<div class="col-sm-3">
<input class="form-control" name="name" type="text" value="{{ menu.name }}"/>
</div>
<label class="col-sm-2 control-label">代码</label>
<label class="col-sm-2 control-label">编号</label>
<div class="col-sm-3">
<input class="form-control" name="code" type="text" value="{{ menu.code }}"/>
<input class="form-control" name="number" type="text" value="{{ menu.number }}"/>
</div>
</div>
<div class="form-group has-feedback">
Expand All @@ -32,6 +32,7 @@ <h4>修改菜单</h4>
<div class="col-sm-3">
<select class="form-control select2" name="parent">
<option value="{{ menu.parent.id }}">{{ menu.parent.name }}</option>
<option value=""> </option>
{% for parent_menu in menu_all %}
<option value={{ parent_menu.id }}> {{ parent_menu.name }} </option>
{% endfor %}
Expand All @@ -44,6 +45,12 @@ <h4>修改菜单</h4>
<input class="form-control" name="url" type="text" value="{{ menu.url | default:'' }}"/>
</div>
</div>
<div class="form-group has-feedback">
<label class="col-sm-2 control-label">代码</label>
<div class="col-sm-8">
<input class="form-control" name="code" type="text" value="{{ menu.code | default:'' }}"/>
</div>
</div>
</fieldset>
</div>
<div class="box-footer ">
Expand Down
6 changes: 6 additions & 0 deletions templates/system/role.html
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,13 @@
<script src="{% static 'plugins/datatables/jquery.dataTables.min.js' %}"></script>
<script src="{% static 'plugins/datatables/dataTables.const.js' %}"></script>
<script src="{% static 'js/plugins/layer/layer.js' %}"></script>
<script type="text/javascript">
$(function () {
$('#SYSTEM-RBAC').addClass('active');
$('#SYSTEM-RBAC-ROLE').addClass('active');

});
</script>
<script type="text/javascript">
var oDataTable = null;
$(function () {
Expand Down
7 changes: 7 additions & 0 deletions templates/system/structure/structure.html
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,13 @@
<script src="{% static 'plugins/datatables/dataTables.const.js' %}"></script>
<script src="{% static 'js/plugins/layer/layer.js' %}"></script>

<script type="text/javascript">
$(function () {
$('#SYSTEM-BASIC').addClass('active');
$('#SYSTEM-BASIC-STRUCTURE').addClass('active');

});
</script>
<script type="text/javascript">
var oDataTable = null;
$(function () {
Expand Down
8 changes: 8 additions & 0 deletions templates/system/users/user.html
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,14 @@
<script src="{% static 'plugins/datatables/dataTables.const.js' %}"></script>
<script src="{% static 'js/plugins/layer/layer.js' %}"></script>

<script type="text/javascript">
$(function () {
$('#SYSTEM-BASIC').addClass('active');
$('#SYSTEM-BASIC-USER').addClass('active');

});
</script>

<script type="text/javascript">
var oDataTable = null;
$(function () {
Expand Down

0 comments on commit e2edef0

Please sign in to comment.