day90---权限组件之动态菜单显示

修改表结构(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')

左侧菜单后端逻辑处理(templatetags/permission.py)

	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}

左侧菜单前端模版标签渲染(menu.html)

	{% 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 %}
posted @ 2018-03-08 20:56  _岩哥  阅读(71)  评论(0)    收藏  举报