修改表结构(models.py)
from django.db import models
class UserInfo(models.Model):
username = models.CharField(max_length=32, verbose_name='用户名')
password = models.CharField(max_length=32, verbose_name='密码')
name = models.CharField(max_length=32, null=True, verbose_name='用户姓名')
age = models.IntegerField(null=True, verbose_name='年龄')
email = models.EmailField(null=True, verbose_name='邮箱地址')
telephone = models.BigIntegerField(null=True, verbose_name='手机号码')
roles = models.ManyToManyField(to='Role', verbose_name='关联角色')
def __str__(self):
return '%s(%s)' % (self.name, self.username)
class Role(models.Model):
name = models.CharField(max_length=32, verbose_name='角色名')
permissions = models.ManyToManyField(to='Permission', verbose_name='关联权限')
def __str__(self):
return self.name
class Permission(models.Model):
url = models.CharField(max_length=255, verbose_name='权限url地址')
description = models.CharField(max_length=32, verbose_name='权限描述')
group = models.ForeignKey(to='PermissionGroup', verbose_name='关联权限组名')
operate = models.ForeignKey(to='PermissionOperate', verbose_name='关联权限操作名')
parent = models.ForeignKey(to='self', null=True, verbose_name='关联自身权限id(父ID)')
def __str__(self):
return self.description
class PermissionGroup(models.Model):
title = models.CharField(max_length=32, verbose_name='二级菜单名')
name = models.CharField(max_length=32, verbose_name='权限组名称')
menus = models.ForeignKey(to='Menu', verbose_name='关联一级菜单')
def __str__(self):
return '%s(%s)' % (self.title, self.name)
class PermissionOperate(models.Model):
name = models.CharField(max_length=32, verbose_name='权限操作名称')
def __str__(self):
return self.name
class Menu(models.Model):
title = models.CharField(max_length=32, verbose_name='一级菜单名')
def __str__(self):
return self.title
配置Django_Admin(admin.py)
from django.contrib import admin
from .models import *
class UserInfoConfig(admin.ModelAdmin):
list_display = ['id', 'username', 'password', 'name', 'age', 'email', 'telephone']
ordering = ['id']
class RoleConfig(admin.ModelAdmin):
list_display = ['id', 'name']
ordering = ['id']
class PermissionConfig(admin.ModelAdmin):
list_display = ['id', 'url', 'group', 'operate', 'parent']
ordering = ['id']
class PermissionGroupConfig(admin.ModelAdmin):
list_display = ['id', 'title', 'name', 'menus']
ordering = ['id']
class PermissionOperateConfig(admin.ModelAdmin):
list_display = ['id', 'name']
ordering = ['id']
class MenuConfig(admin.ModelAdmin):
list_display = ['id', 'title']
ordering = ['id']
admin.site.register(UserInfo, UserInfoConfig)
admin.site.register(Role, RoleConfig)
admin.site.register(Permission, PermissionConfig)
admin.site.register(PermissionGroup, PermissionGroupConfig)
admin.site.register(PermissionOperate, PermissionOperateConfig)
admin.site.register(Menu, MenuConfig)
初始化数据(使用DjangoAdmin)
-- menu菜单表
INSERT INTO "rbac_menu" VALUES (1, '系统配置');
INSERT INTO "rbac_menu" VALUES (2, '订单配置');
INSERT INTO "rbac_menu" VALUES (3, '服务配置');
INSERT INTO "rbac_menu" VALUES (4, '运维');
INSERT INTO "rbac_menu" VALUES (5, '程序');
--
-- permissiongroup权限组表
INSERT INTO "rbac_permissiongroup" VALUES (1, '用户管理','users', 1);
INSERT INTO "rbac_permissiongroup" VALUES (2, '订单管理','orders', 2);
INSERT INTO "rbac_permissiongroup" VALUES (3, '角色管理','roles', 1);
INSERT INTO "rbac_permissiongroup" VALUES (4, '主题配置', '主题', 1);
INSERT INTO "rbac_permissiongroup" VALUES (5, '安全设置', '安全', 1);
INSERT INTO "rbac_permissiongroup" VALUES (6, 'Nginx配置', 'Nginx配置', 3);
INSERT INTO "rbac_permissiongroup" VALUES (7, 'MySQL配置', 'MySQL配置', 3);
INSERT INTO "rbac_permissiongroup" VALUES (8, 'PHP配置', 'PHP配置', 3);
INSERT INTO "rbac_permissiongroup" VALUES (9, 'Python配置', 'Python配置', 3);
INSERT INTO "rbac_permissiongroup" VALUES (10, 'linux', 'linux', 4);
INSERT INTO "rbac_permissiongroup" VALUES (11, 'openstack', 'openstack', 4);
INSERT INTO "rbac_permissiongroup" VALUES (12, 'docker', 'docker', 4);
INSERT INTO "rbac_permissiongroup" VALUES (13, 'java', 'java', 5);
INSERT INTO "rbac_permissiongroup" VALUES (14, 'go', 'go', 5);
INSERT INTO "rbac_permissiongroup" VALUES (15, 'ruby', 'ruby', 5);
--
-- permissionoperate权限操作表
INSERT INTO "rbac_permissionoperate" VALUES (1, 'list');
INSERT INTO "rbac_permissionoperate" VALUES (2, 'add');
INSERT INTO "rbac_permissionoperate" VALUES (3, 'delete');
INSERT INTO "rbac_permissionoperate" VALUES (4, 'edit');
--
-- permission权限表
INSERT INTO "rbac_permission" VALUES (1, '/users/', '查看用户列表', 1, 1, NULL);
INSERT INTO "rbac_permission" VALUES (2, '/users/add/', '添加用户', 1, 2, 1);
INSERT INTO "rbac_permission" VALUES (3, '/users/delete/(\d+)', '删除用户', 1, 3, 1);
INSERT INTO "rbac_permission" VALUES (4, '/users/edit/(\d+)', '编辑用户', 1, 4, 1);
INSERT INTO "rbac_permission" VALUES (5, '/orders/', '查看订单列表', 2, 1, NULL);
INSERT INTO "rbac_permission" VALUES (6, '/orders/add/', '添加订单', 2, 2, 5);
INSERT INTO "rbac_permission" VALUES (7, '/orders/delete/(\d+)', '删除订单', 2, 3, 5);
INSERT INTO "rbac_permission" VALUES (8, '/orders/edit/(\d+)', '编辑订单', 2, 4, 5);
INSERT INTO "rbac_permission" VALUES (9, '/roles/', '查看角色列表', 3, 1, NULL);
INSERT INTO "rbac_permission" VALUES (10, '/roles/add/', '添加角色', 3, 2, 9);
INSERT INTO "rbac_permission" VALUES (11, '/roles/delete/(\d+)', '删除角色', 3, 3, 9);
INSERT INTO "rbac_permission" VALUES (12, '/roles/edit/(\d+)', '编辑角色', 3, 4, 9);
INSERT INTO "rbac_permission" VALUES (13, '/theme/', '主题', 4, 1, NULL);
INSERT INTO "rbac_permission" VALUES (14, '/security/', '安全', 5, 1, NULL);
INSERT INTO "rbac_permission" VALUES (15, '/nginx/', 'nginx', 6, 1, NULL);
INSERT INTO "rbac_permission" VALUES (16, '/mysql/', 'mysql', 7, 1, NULL);
INSERT INTO "rbac_permission" VALUES (17, '/php/', 'php', 8, 1, NULL);
INSERT INTO "rbac_permission" VALUES (18, '/python/', 'python', 9, 1, NULL);
INSERT INTO "rbac_permission" VALUES (19, '/linux/', 'linux', 10, 1, NULL);
INSERT INTO "rbac_permission" VALUES (20, '/openstack/', 'openstack', 11, 1, NULL);
INSERT INTO "rbac_permission" VALUES (21, '/docker/', 'docker', 12, 1, NULL);
INSERT INTO "rbac_permission" VALUES (22, '/java/', 'java', 13, 1, NULL);
INSERT INTO "rbac_permission" VALUES (23, '/go/', 'go', 14, 1, NULL);
INSERT INTO "rbac_permission" VALUES (24, '/ruby/', 'ruby', 15, 1, NULL);
--
-- role角色表
INSERT INTO "rbac_role" VALUES (1, 'CEO');
INSERT INTO "rbac_role" VALUES (2, 'CHO');
INSERT INTO "rbac_role" VALUES (3, 'CTO');
INSERT INTO "rbac_role" VALUES (4, 'HR_Leader');
INSERT INTO "rbac_role" VALUES (5, 'IT_Leader');
INSERT INTO "rbac_role" VALUES (6, 'HR');
INSERT INTO "rbac_role" VALUES (7, 'IT');
INSERT INTO "rbac_role" VALUES (8, '杂权限');
--
-- userinfo用户表
INSERT INTO "rbac_userinfo" VALUES (1, 'liyan', '123QWEasd', '李岩', 18, 'liyan@liyan.com', 13888888888);
INSERT INTO "rbac_userinfo" VALUES (2, 'yy', '123QWEasd', '丫丫', 18, 'yy@yy.com', 13999999999);
INSERT INTO "rbac_userinfo" VALUES (3, 'yange', '123QWEasd', '岩哥', 22, 'yange@yange.com', 13666666666);
INSERT INTO "rbac_userinfo" VALUES (4, 'zhangsan', '123QWEasd', '张三', 28, 'zhangsan@zhangsan.com', 11111111111);
INSERT INTO "rbac_userinfo" VALUES (5, 'lisi', '123QWEasd', '李四', 29, 'lisi@lisi.com', 22222222222);
INSERT INTO "rbac_userinfo" VALUES (6, 'aaa', '123QWEasd', '用户aaa', 38, 'aaa@aaa.com', 1234567890);
INSERT INTO "rbac_userinfo" VALUES (7, 'bbb', '123QWEasd', '用户bbb', 39, 'bbb@bbb.com', 1234567890);
INSERT INTO "rbac_userinfo" VALUES (8, 'hr', '123QWEasd', 'HR老大', 26, 'hr@hr.com', 999999999);
INSERT INTO "rbac_userinfo" VALUES (9, 'it', '123QWEasd', 'IT老大', 26, 'it@it.com', 66666666666);
INSERT INTO "rbac_userinfo" VALUES (10, 'za', '123QWEasd', '杂用户', 1, 'za@za.com', 1);
--
-- permissions角色和权限多对多关联表
INSERT INTO "rbac_role_permissions" VALUES (1, 1, 1);
INSERT INTO "rbac_role_permissions" VALUES (2, 1, 2);
INSERT INTO "rbac_role_permissions" VALUES (3, 1, 3);
INSERT INTO "rbac_role_permissions" VALUES (4, 1, 4);
INSERT INTO "rbac_role_permissions" VALUES (5, 1, 5);
INSERT INTO "rbac_role_permissions" VALUES (6, 1, 6);
INSERT INTO "rbac_role_permissions" VALUES (7, 1, 7);
INSERT INTO "rbac_role_permissions" VALUES (8, 1, 8);
INSERT INTO "rbac_role_permissions" VALUES (9, 2, 1);
INSERT INTO "rbac_role_permissions" VALUES (10, 2, 2);
INSERT INTO "rbac_role_permissions" VALUES (11, 2, 3);
INSERT INTO "rbac_role_permissions" VALUES (12, 2, 4);
INSERT INTO "rbac_role_permissions" VALUES (13, 3, 8);
INSERT INTO "rbac_role_permissions" VALUES (14, 3, 5);
INSERT INTO "rbac_role_permissions" VALUES (15, 3, 6);
INSERT INTO "rbac_role_permissions" VALUES (16, 3, 7);
INSERT INTO "rbac_role_permissions" VALUES (17, 4, 1);
INSERT INTO "rbac_role_permissions" VALUES (19, 4, 2);
INSERT INTO "rbac_role_permissions" VALUES (20, 4, 4);
INSERT INTO "rbac_role_permissions" VALUES (21, 5, 8);
INSERT INTO "rbac_role_permissions" VALUES (22, 5, 5);
INSERT INTO "rbac_role_permissions" VALUES (23, 5, 6);
INSERT INTO "rbac_role_permissions" VALUES (24, 6, 1);
INSERT INTO "rbac_role_permissions" VALUES (25, 7, 5);
INSERT INTO "rbac_role_permissions" VALUES (26, 8, 1);
INSERT INTO "rbac_role_permissions" VALUES (29, 8, 5);
INSERT INTO "rbac_role_permissions" VALUES (32, 8, 4);
INSERT INTO "rbac_role_permissions" VALUES (35, 1, 9);
INSERT INTO "rbac_role_permissions" VALUES (36, 1, 10);
INSERT INTO "rbac_role_permissions" VALUES (37, 1, 11);
INSERT INTO "rbac_role_permissions" VALUES (38, 1, 12);
INSERT INTO "rbac_role_permissions" VALUES (39, 1, 13);
INSERT INTO "rbac_role_permissions" VALUES (40, 1, 14);
INSERT INTO "rbac_role_permissions" VALUES (41, 1, 15);
INSERT INTO "rbac_role_permissions" VALUES (42, 1, 16);
INSERT INTO "rbac_role_permissions" VALUES (43, 1, 17);
INSERT INTO "rbac_role_permissions" VALUES (44, 1, 18);
INSERT INTO "rbac_role_permissions" VALUES (45, 1, 19);
INSERT INTO "rbac_role_permissions" VALUES (46, 1, 20);
INSERT INTO "rbac_role_permissions" VALUES (47, 1, 21);
INSERT INTO "rbac_role_permissions" VALUES (48, 1, 22);
INSERT INTO "rbac_role_permissions" VALUES (50, 1, 23);
INSERT INTO "rbac_role_permissions" VALUES (51, 1, 24);
--
-- userinfo_roles用户和角色多对多关联表
INSERT INTO "rbac_userinfo_roles" VALUES (1, 1, 1);
INSERT INTO "rbac_userinfo_roles" VALUES (2, 2, 2);
INSERT INTO "rbac_userinfo_roles" VALUES (3, 3, 3);
INSERT INTO "rbac_userinfo_roles" VALUES (4, 4, 4);
INSERT INTO "rbac_userinfo_roles" VALUES (5, 4, 6);
INSERT INTO "rbac_userinfo_roles" VALUES (6, 5, 5);
INSERT INTO "rbac_userinfo_roles" VALUES (7, 5, 7);
INSERT INTO "rbac_userinfo_roles" VALUES (8, 6, 6);
INSERT INTO "rbac_userinfo_roles" VALUES (9, 7, 7);
INSERT INTO "rbac_userinfo_roles" VALUES (11, 8, 4);
INSERT INTO "rbac_userinfo_roles" VALUES (12, 8, 6);
INSERT INTO "rbac_userinfo_roles" VALUES (14, 9, 5);
INSERT INTO "rbac_userinfo_roles" VALUES (15, 9, 7);
INSERT INTO "rbac_userinfo_roles" VALUES (16, 10, 8);
配置路由系统(urls.py)
from django.conf.urls import url
from django.contrib import admin
from quanxian import views
urlpatterns = [
url(r'^admin/', admin.site.urls),
# 全局页面(不受登陆限制)
url(r'^register/$', views.register),
url(r'^login/$', views.log_in),
url(r'^logout/$', views.log_out),
url(r'^index/$', views.index),
# 用户管理相关url
url(r'^users/$', views.users),
url(r'^users/add/$', views.users_add),
url(r'^users/delete/(\d+)$', views.users_delete),
url(r'^users/edit/(\d+)$', views.users_edit),
# 订单管理相关url
url(r'^orders/$', views.orders),
url(r'^orders/add/$', views.orders_add),
url(r'^orders/delete/(\d+)$', views.orders_delete),
url(r'^orders/edit/(\d+)$', views.orders_edit),
# 角色管理相关url
url(r'^roles/$', views.roles),
url(r'^roles/add/$', views.roles_add),
url(r'^roles/delete/(\d+)$', views.roles_delete),
url(r'^roles/edit/(\d+)$', views.roles_edit),
# 其他
url(r'^theme/$', views.other),
url(r'^security/$', views.other),
url(r'^nginx/$', views.other),
url(r'^mysql/$', views.other),
url(r'^php/$', views.other),
url(r'^python/$', views.other),
url(r'^linux/$', views.other),
url(r'^openstack/$', views.other),
url(r'^docker/$', views.other),
url(r'^java/$', views.other),
url(r'^ruby/$', views.other),
url(r'^go/$', views.other),
]
修改中间件配置(services/middleware/login.py)
from django.shortcuts import redirect, HttpResponse
from django.utils.deprecation import MiddlewareMixin
import re
class LoginVerificationMiddleware(MiddlewareMixin):
def process_request(self, request):
# 添加url白名单
white_list = ['/register/.*', '/login/.*', '/logout/', '/index/', '/admin/.*']
# 获取当前的url
current_path = request.path
# 判断当前的url是否在白名单中
for i in white_list:
ret = re.match(i, current_path)
if ret:
return None
# 判断当前用户是否是已登录用户
user_id = request.session.get('user_id')
if not user_id:
return redirect('/login/')
# 判断当前用户对当前访问的url是否有权限
permission_dict = request.session.get('permission_dict')
for i in permission_dict.values():
url_list = i['url_list']
operate_list = i['operate_list']
for j in url_list:
j = '^%s$' % j
ret = re.match(j, current_path)
if ret:
# 匹配到当前URL代表有权限,把对应URL的操作列表添加到request对象中
request.operate_list = operate_list
return None
return HttpResponse('<h2><font color="red">没有权限</font></h2>')
配置session处理(services/session/permission.py)
def write_session(request, user):
# 获取登录用户的权限信息,并写入session
permission_info = user.roles.all().values(
'permissions__url',
'permissions__id',
'permissions__parent_id',
'permissions__operate__name',
'permissions__group__id',
'permissions__group__title',
'permissions__group__menus_id',
'permissions__group__menus__title'
)
permission_dict = {}
for i in permission_info:
p_g_i = 'permissions__group__id'
p_u = 'permissions__url'
p_o_n = 'permissions__operate__name'
if i[p_g_i] not in permission_dict.keys():
permission_dict[i[p_g_i]] = {'url_list': [i[p_u]], 'operate_list': [i[p_o_n]]}
else:
permission_dict[i[p_g_i]]['url_list'].append(i[p_u])
permission_dict[i[p_g_i]]['operate_list'].append(i[p_o_n])
# 把转换好的权限数据写入session
request.session['permission_dict'] = permission_dict
menu_list = []
for i in permission_info:
p_dict = {
'id': i['permissions__id'],
'url': i['permissions__url'],
'pid': i['permissions__parent_id'],
'title': i['permissions__group__title'],
'menu_id': i['permissions__group__menus_id'],
'menu_title': i['permissions__group__menus__title']
}
menu_list.append(p_dict)
# 把菜单信息写入session
request.session['menu_list'] = menu_list
配置url处理(services/base/permission.py)
class URLCheck:
def __init__(self, operate):
self.operate = operate
def list(self):
return 'list' in self.operate
def add(self):
return 'add' in self.operate
def delete(self):
return 'delete' in self.operate
def edit(self):
return 'edit' in self.operate
在业务逻辑的应用中配置视图函数(views.py)
from django.shortcuts import render, redirect, HttpResponse
from rbac.models import *
from rbac.services.session.permission import write_session
from rbac.services.base.permission import URLCheck
def register(request):
return redirect('/login/')
def log_in(request):
if request.method == 'POST':
user = request.POST.get('user')
pwd = request.POST.get('pwd')
user_obj = UserInfo.objects.filter(username=user, password=pwd).first()
# 判断当前用户登录是否成功(登录成功后跳转首页,否则跳转登录页面)
if user_obj:
# 把用户的登录信息写入session
request.session['user_id'] = user_obj.id
write_session(request, user_obj)
return redirect('/index/')
else:
return redirect('/login/')
return render(request, 'login.html')
def log_out(request):
request.session.flush()
return redirect('/login/')
def index(request):
user_id = request.session.get('user_id', None)
if user_id:
user_obj = UserInfo.objects.get(id=user_id)
return render(request, 'index.html', locals())
def users(request):
# 从request对象中取出权限操作列表
operate_list = request.operate_list
# 根据当前url的操作进行判断
operate = URLCheck(operate_list)
return render(request, 'users.html', locals())
def users_add(request):
return HttpResponse('<h1><font color="green">添加用户</font></h1>')
def users_delete(request, *args):
return HttpResponse('<h1><font color="green">删除用户</font></h1>')
def users_edit(request, *args):
return HttpResponse('<h1><font color="green">编辑用户</font></h1>')
def orders(request):
# 从request对象中取出权限操作列表
operate_list = request.operate_list
# 根据当前url的操作进行判断
operate = URLCheck(operate_list)
# print(menu_list)
return render(request, 'orders.html', locals())
def orders_add(request):
return HttpResponse('<h1><font color="blue">添加订单</font></h1>')
def orders_delete(request, *args):
return HttpResponse('<h1><font color="blue">删除订单</font></h1>')
def orders_edit(request, *args):
return HttpResponse('<h1><font color="blue">编辑订单</font></h1>')
def roles(request):
# 从request对象中取出权限操作列表
operate_list = request.operate_list
# 根据当前url的操作进行判断
operate = URLCheck(operate_list)
return render(request, 'roles.html', locals())
def roles_add(request):
return HttpResponse('<h1><font color="yellow">添加角色</font></h1>')
def roles_delete(request, *args):
return HttpResponse('<h1><font color="yellow">删除角色</font></h1>')
def roles_edit(request, *args):
return HttpResponse('<h1><font color="yellow">编辑角色</font></h1>')
def other(request):
return render(request, 'other.html')
from django import template
import re
register = template.Library()
@register.inclusion_tag('menu.html')
def get_menu(request):
menu_list = request.session.get('menu_list')
# 获取当前访问的url
current_path = request.path
# 以字典的形式存储菜单和权限,并添加状态值
temp_dict = {}
for i in menu_list:
if not i['pid']:
i['state'] = False
temp_dict[i['id']] = i
# 根据不同的url配置不同的状态值
for i in menu_list:
url = '^%s$' % i['url']
if re.match(url, current_path):
if i['pid']:
temp_dict['pid']['state'] = True
else:
i['state'] = True
# 转换数据
menu_dict = {}
for i in temp_dict.values():
if i['menu_id'] not in menu_dict:
menu_dict[i['menu_id']] = {
'title': i['menu_title'],
'state': i['state'],
'children_list': [{'title': i['title'], 'url': i['url'], 'state': i['state']}]
}
else:
menu_dict[i['menu_id']]['children_list'].append({'title': i['title'], 'url': i['url'], 'state': i['state']})
if i['state']:
menu_dict[i['menu_id']]['state'] = True
return {'menu_dict': menu_dict}
{% for i in menu_dict.values %}
<div class="first_level">{{ i.title }}</div>
{% if i.state %}
<div class="second_level">
{% else %}
<div class="second_level hidden">
{% endif %}
{% for j in i.children_list %}
{% if j.state %}
<div class="item show"><a href="{{ j.url }}">{{ j.title }}</a></div>
{% else %}
<div class="item"><a href="{{ j.url }}">{{ j.title }}</a></div>
{% endif %}
{% endfor %}
</div>
{% endfor %}
<script>
// 点击一级菜单进行显示二级菜单的切换
$(".first_level").click(function () {
$(this).next().toggleClass("hidden").siblings(".second_level").addClass("hidden")
})
</script>
配置模板系统-登录页面(login.html)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css">
<script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.js"></script>
<script src="https://cdn.bootcss.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
<title>登录页面</title>
</head>
<body>
<div class="container">
<div class="row">
<div class="col-md-offset-3 col-md-8">
<div class="page-header">
<h1>
登录页面
<small>login</small>
</h1>
</div>
<form class="form-horizontal" action="/login/" method="post" enctype="multipart/form-data">
{% csrf_token %}
<div class="form-group">
<label for="user" class="col-md-2 control-label">用户名:</label>
<div class="col-md-5">
<input type="text" class="form-control" id="user" name="user" placeholder="用户名">
</div>
</div>
<div class="form-group">
<label for="pwd" class="col-md-2 control-label">密码:</label>
<div class="col-md-5">
<input type="password" class="form-control" id="pwd" name="pwd" placeholder="密码">
</div>
</div>
<div class="form-group">
<div class="col-md-offset-2 col-md-10">
<div class="checkbox">
<label>
<input type="checkbox">记住我
</label>
</div>
</div>
</div>
<p class="col-md-offset-3 err_msg"></p>
<div class="form-group">
<div class="col-md-offset-2 col-md-5">
<input type="submit" id="login" class="btn btn-primary btn-block" value="登录">
</div>
</div>
</form>
</div>
</div>
</div>
</body>
</html>
配置模板系统-首页(index.html)
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css">
<script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.js"></script>
<script src="https://cdn.bootcss.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
<title>首页</title>
</head>
<body>
<div class="container">
<div class="row">
<div class="col-md-offset-3 col-md-5">
<div class="page-header">
<h1>
首页
<small>index</small>
</h1>
</div>
{% if user_obj %}
<div class="h4 text-primary">当前登录用户: <span class="h3 text-danger bg-danger">{{ user_obj.name }}</span>
<a href="/logout/" class="btn btn-success pull-right">注销当前用户</a>
</div>
<hr>
<div class="row">
<a href="/users/" class="col-md-offset-2 btn btn-danger btn-lg">用户列表</a>
<a href="/orders/" class="btn btn-primary btn-lg">订单列表</a>
<a href="/roles/" class="btn btn-warning btn-lg">角色列表</a>
</div>
<br>
<div class="row">
<a href="/users/add/" class="col-md-offset-2 btn btn-danger btn-lg">添加用户</a>
<a href="/orders/add/" class="btn btn-primary btn-lg">添加订单</a>
<a href="/roles/add/" class="btn btn-warning btn-lg">添加角色</a>
</div>
<br>
<div class="row">
<a href="/users/delete/{{ user_id }}" class="col-md-offset-2 btn btn-danger btn-lg">删除用户</a>
<a href="/orders/delete/{{ user_id }}" class="btn btn-primary btn-lg">删除订单</a>
<a href="/roles/delete/{{ user_id }}" class="btn btn-warning btn-lg">删除角色</a>
</div>
<br>
<div class="row">
<a href="/users/edit/{{ user_id }}" class="col-md-offset-2 btn btn-danger btn-lg">编辑用户</a>
<a href="/orders/edit/{{ user_id }}" class="btn btn-primary btn-lg">编辑订单</a>
<a href="/roles/edit/{{ user_id }}" class="btn btn-warning btn-lg">编辑角色</a>
</div>
{% else %}
<div class="h4 text-primary">未登陆用户
<a href="/login/" class="col-md-offset-2 btn btn-success">点击登录</a>
</div>
{% endif %}
</div>
</div>
</div>
</body>
</html>
配置模板系统-模板继承页面(base.html)
{% load permission %}
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css">
<script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.js"></script>
<script src="https://cdn.bootcss.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
<style>
.menu {
margin: 0;
color: #DDEEFF;
background-color: #333333;
font-size: 38px;
height: 100vh;
padding-top: 30px;
line-height: 60px;
}
.item {
font-size: 20px;
line-height: 30px;
}
.item a {
color: #FFCCCC;
}
.show {
color: #FF0000;
background-color: #888888;
font-size: 20px;
line-height: 30px;
}
</style>
<title>后台管理</title>
</head>
<body>
<div class="container-fluid">
<div class="row">
<div class="menu col-md-2 text-center">
{% block menu %}
{% get_menu request %}
{% endblock %}
</div>
<div class="content col-md-9">
{% block content %}
{% endblock %}
</div>
</div>
</div>
</body>
</html>
配置模板系统-用户信息页面(users.html)
{% extends "base.html" %}
{% block content %}
<div class="page-header">
<h1>用户管理
<small><a href="/index/">返回首页</a></small>
</h1>
</div>
<div>
{% if operate.add %}
<a href="/users/add/" class="btn btn-success btn-lg"><i class="glyphicon glyphicon-plus"></i> 添加</a>
{% endif %}
</div>
<div class="table-responsive">
<table class="table table-bordered table-striped table-hover table-condensed text-center h3">
<thead>
<tr>
<td>用户编号</td>
<td>用户名</td>
<td>用户角色</td>
<td>用户详情...</td>
<td>操作</td>
</tr>
</thead>
<tbody>
<tr>
<td>10001</td>
<td>岩哥</td>
<td>CEO</td>
<td>...</td>
<td>
{% if operate.edit %}
<a href="/users/edit/1" class="btn btn-primary"><i class="glyphicon glyphicon-edit"></i> 编辑</a>
{% endif %}
{% if operate.delete %}
<a href="/users/delete/1" class="btn btn-danger"><i class="glyphicon glyphicon-trash"></i> 删除</a>
{% endif %}
</td>
</tr>
</tbody>
</table>
</div>
{% endblock %}
配置模板系统-订单信息页面(orders.html)
{% extends "base.html" %}
{% block content %}
<div class="page-header">
<h1>订单管理
<small><a href="/index/">返回首页</a></small>
</h1>
</div>
<div>
{% if operate.add %}
<a href="/orders/add/" class="btn btn-success btn-lg"><i class="glyphicon glyphicon-plus"></i> 添加</a>
{% endif %}
</div>
<div class="table-responsive">
<table class="table table-bordered table-striped table-hover table-condensed text-center h3">
<thead>
<tr>
<td>订单编号</td>
<td>商品名称</td>
<td>订单详情...</td>
<td>操作</td>
</tr>
</thead>
<tbody>
<tr>
<td>200001</td>
<td>《python运维架构师》</td>
<td>...</td>
<td>
{% if operate.edit %}
<a href="/orders/edit/2" class="btn btn-primary"><i class="glyphicon glyphicon-edit"></i> 编辑</a>
{% endif %}
{% if operate.delete %}
<a href="/orders/delete/2" class="btn btn-danger"><i class="glyphicon glyphicon-trash"></i> 删除</a>
{% endif %}
</td>
</tr>
</tbody>
</table>
</div>
{% endblock %}
配置模板系统-角色信息页面(roles.html)
{% extends "base.html" %}
{% block content %}
<div class="page-header">
<h1>角色管理
<small><a href="/index/">返回首页</a></small>
</h1>
</div>
<div>
{% if operate.add %}
<a href="/roles/add" class="btn btn-success btn-lg"><i class="glyphicon glyphicon-plus"></i> 添加</a>
{% endif %}
</div>
<div class="table-responsive">
<table class="table table-bordered table-striped table-hover table-condensed text-center h3">
<thead>
<tr>
<td>角色编号</td>
<td>角色名</td>
<td>角色详情...</td>
<td>操作</td>
</tr>
</thead>
<tbody>
<tr>
<td>3000001</td>
<td>架构师</td>
<td>...</td>
<td>
{% if operate.edit %}
<a href="/roles/edit/3" class="btn btn-primary"><i class="glyphicon glyphicon-edit"></i> 编辑</a>
{% endif %}
{% if operate.delete %}
<a href="/roles/delete/3" class="btn btn-danger"><i class="glyphicon glyphicon-trash"></i> 删除</a>
{% endif %}
</td>
</tr>
</tbody>
</table>
</div>
{% endblock %}
配置模板系统-其他使用的页面(other.html)
{% extends "base.html" %}
{% block content %}
<div class="page-header">
<h1>其他
<small><a href="/index/">返回首页</a></small>
</h1>
</div>
{% endblock %}