2024--Django平台开发-订单项目管理(十四)

day14 订单管理系统

在这里插入图片描述

1.关于登录

1.1 UI美化

页面美化,用BootStrap + 自定义BooStrapForm类实现。

class BootStrapForm:exclude_filed_list = []def __init__(self, *args, **kwargs):super().__init__(*args, **kwargs)# {'title':对象,"percent":对象}for name, field in self.fields.items():if name in self.exclude_filed_list:continuefield.widget.attrs['class'] = "form-control"field.widget.attrs['placeholder'] = "请输入{}".format(field.label)

1.2 csrf问题

/*** 根据cookie的name获取对应的值* @param name* @returns {null}*/
function getCookie(name) {let cookieValue = null;if (document.cookie && document.cookie !== '') {const cookies = document.cookie.split(';');for (let i = 0; i < cookies.length; i++) {const cookie = cookies[i].trim();// Does this cookie string begin with the name we want?if (cookie.substring(0, name.length + 1) === (name + '=')) {cookieValue = decodeURIComponent(cookie.substring(name.length + 1));break;}}}return cookieValue;
}function csrfSafeMethod(method) {// these HTTP methods do not require CSRF protectionreturn (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));
}$.ajaxSetup({beforeSend: function (xhr, settings) {if (!csrfSafeMethod(settings.type)) {xhr.setRequestHeader("X-CSRFTOKEN", getCookie('csrftoken'));}}
})

在页面上引入即可:

<script src="{% static 'js/csrf.js' %}"></script>

2.中间件校验

2.1 是否登录

NB_WHITE_URL = ['/login/', '/sms/login/', '/sms/send/']
class AuthMiddleware(MiddlewareMixin):def is_white_url(self, request):if request.path_info in settings.NB_WHITE_URL:return Truedef process_request(self, request):""" 校验用户是否已登录 """# 1.不需要登录就能访问的URLif self.is_white_url(request):return# 2.session中获取用户信息,能获取到登录成功;未登录#  {'role': mapping[role], 'name': user_object.username, 'id': user_object.id}user_dict = request.session.get(settings.NB_SESSION_KEY)# 3.未登录,跳转回登录页面if not user_dict:return redirect(settings.NB_LOGIN_URL)# 4.已登录,封装用户信息request.nb_user = UserInfo(**user_dict)

2.2 是否有权限

class AuthMiddleware(MiddlewareMixin):def process_view(self, request, callback, callback_args, callback_kwargs):if self.is_white_url(request):returncurrent_name = request.resolver_match.url_name# 1.根据用户角色获取自己具备所有的权限user_permission_dict = settings.NB_PERMISSION[request.nb_user.role]# 2.获取当前用户访问的URLcurrent_name = request.resolver_match.url_name# 3.判断是否在自己具备的权限if current_name not in user_permission_dict:# return HttpResponse("无权访问")# print(request.Meta)from django.core.handlers.wsgi import WSGIRequest# print(request,type(request))if request.is_ajax():return JsonResponse({'status': False, 'detail': "无权访问"})else:return render(request, 'permission.html')
NB_PERMISSION = {"ADMIN": {"level_list": {"text": "级别列表", 'parent': None},"level_add": {"text": "新建级别", 'parent': 'level_list'},"level_edit": {"text": "编辑级别", 'parent': 'level_list'},"level_delete": {"text": "删除级别", 'parent': 'level_list'},"customer_list": {"text": "客户列表", 'parent': None},"customer_add": {"text": "新建客户", 'parent': 'customer_list'},"customer_edit": {"text": "编辑客户", 'parent': 'customer_list'},"customer_delete": {"text": "删除客户", 'parent': 'customer_list'},"customer_reset": {"text": "重置密码", 'parent': 'customer_list'},"customer_charge": {"text": "我的交易记录", 'parent': 'customer_list'},"customer_charge_add": {"text": "创建交易记录", 'parent': 'customer_list'},"policy_list": {"text": "价格策略", 'parent': None},"policy_add": {"text": "创建价格策略", 'parent': 'policy_list'},"policy_edit": {"text": "编辑价格策略", 'parent': 'policy_list'},"policy_delete": {"text": "删除价格策略", 'parent': 'policy_list'},"transaction_list": {'text': "交易记录", 'name': "transaction_list", 'parent': None},},"CUSTOMER": {"my_order_list": {"text": "订单列表", 'parent': None},"my_order_add": {"text": "订单列表", 'parent': 'my_order_list'},"my_order_cancel": {"text": "订单列表", 'parent': 'my_order_list'},"my_transaction_list": {"text": "我的交易记录", 'parent': None},}
}

3.路径导航

推荐:用inclusion_tag在页面渲染时生成。

# ...
# ....text_list = []  # ["创建订单","订单列表"]# 1.先添加当前访问的路径导航名称添加text_list
text_list.append(user_permission_dict[current_name]['text'])# 2.循环获取上级
menu_name = current_name
while user_permission_dict[menu_name]['parent']:menu_name = user_permission_dict[menu_name]['parent']text = user_permission_dict[menu_name]['text']text_list.append(text)# 3.添加首页
text_list.append("首页")# 4.翻转
text_list.reverse()# 5.路径导航列表(用于后续页面显示)
request.nb_user.text_list = text_list
{% if request.nb_user.text_list %}
<ol class="breadcrumb">{% for text in request.nb_user.text_list %}<li><a>{{ text }}</a></li>{% endfor %}
</ol>
{% endif %}

4.动态菜单

NB_MENU = {'ADMIN': [{'text': "用户信息",'icon': "fa-bed",'children': [{'text': "级别管理", 'url': "/level/list/", 'name': "level_list"},{'text': "客户管理", 'url': "/customer/list/", 'name': "customer_list"},{'text': "价格策略", 'url': "/policy/list/", 'name': "policy_list"},]},{'text': "交易管理",'icon': "fa-bed",'children': [{'text': "交易记录", 'url': "/transaction/list/", 'name': "transaction_list"},]},],'CUSTOMER': [{'text': "订单中心",'icon': "fa-bed",'children': [{'text': "订单管理", 'url': "/my/order/list/", 'name': "my_order_list"},{'text': "我的交易记录", 'url': "/my/transaction/list/", 'name': "my_transaction_list"},]},],
}
from django.http import QueryDict
from django.template import Library
from django.conf import settings
import copy
register = Library()@register.inclusion_tag("tag/nb_menu.html")
def nb_menu(request):# 1.读取当前用户的角色信息# print(request.nb_user.role)# 2.菜单信息user_menu_list = copy.deepcopy(settings.NB_MENU[request.nb_user.role])for item in user_menu_list:# item['class'] = 'hide'for child in item['children']:# if child['url'] == request.path_info: # v1版if child['name'] == request.nb_user.menu_name:child['class'] = 'active'# item['class'] = ""return {'menu_list': user_menu_list}
<div class="multi-menu">{% for item in menu_list %}<div class="item"><div class="title"><span class="icon-wrap"><i class="fa {{ item.icon }}"></i></span> {{ item.text }}</div><div class="body {{ item.class }}">{% for child in item.children %}<a class="{{ child.class }}" href="{{ child.url }}">{{ child.text }}</a>{% endfor %}</div></div>{% endfor %}
</div>
.multi-menu .item {background-color: white;
}.multi-menu .item > .title {padding: 10px 5px;border-bottom: 1px solid #dddddd;cursor: pointer;color: #333;display: block;background: #efefef;background: -webkit-gradient(linear, left bottom, left top, color-stop(0, #efefef), color-stop(1, #fafafa));background: -ms-linear-gradient(bottom, #efefef, #fafafa);background: -o-linear-gradient(bottom, #efefef, #fafafa);filter: progid:dximagetransform.microsoft.gradient(startColorStr='#e3e3e3', EndColorStr='#ffffff');-ms-filter: "progid:DXImageTransform.Microsoft.gradient(startColorStr='#fafafa',EndColorStr='#efefef')";box-shadow: inset 0 1px 1px white;
}.multi-menu .item > .body {border-bottom: 1px solid #dddddd;
}.multi-menu .item > .body a {display: block;padding: 5px 20px;text-decoration: none;border-left: 2px solid transparent;font-size: 13px;}.multi-menu .item > .body a:hover {border-left: 2px solid #2F72AB;
}.multi-menu .item > .body a.active {border-left: 2px solid #2F72AB;
}

5.级别管理

6.客户管理

7.管理员管理

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/415856.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ACL【新华三与华为的区别】

【解释】acl简单点解释就是&#xff0c;一套根据需求而设置的规则 【背景】 192.168.1.0/24 网段不允许访问 192.168.2.0/24 网段&#xff0c;要求使用基本 ACL 实现20_1 可以访问 20_6 的 TELNET 服务&#xff0c;但不能访问 FTP 服务 【操作步骤】 {易混点 }&#xff1a;1. …

阿里二面:要保证消息不丢失,又不重复,消息队列怎么选型?

大家好&#xff0c;我是君哥。 在使用消息队列时&#xff0c;有两个经常让我们烦恼的问题&#xff0c;消息丢失和消息重复。那我们在做技术选型时&#xff0c;有没有一个消息队列能解决消息丢失和消息重复这两个问题呢&#xff1f; 消息丢失 如上图&#xff0c;从生产者发送消…

小程序学习-17

attached最常用 推荐使用 lilfetimes 这种方法

【Linux】Linux进程间通信(四)

​ ​&#x1f4dd;个人主页&#xff1a;Sherry的成长之路 &#x1f3e0;学习社区&#xff1a;Sherry的成长之路&#xff08;个人社区&#xff09; &#x1f4d6;专栏链接&#xff1a;Linux &#x1f3af;长路漫漫浩浩&#xff0c;万事皆有期待 上一篇博客&#xff1a;【Linux】…

基于嵌入式的智能智能通风系统

基于嵌入式的智能智能通风系统 功能说明 通过微信小程序控制窗户的开关状体以及倒计时开关和定时开关&#xff0c;小程序上实时显示当前温度湿度和光照强度。 功能展示 02智能通风系统 Mqtt服务器 http://www.yoyolife.fun/iot&#xff1a;Mqtt服务器&#xff0c;我是在这里注…

前端react入门day03-react获取dom与组件通信

(创作不易&#xff0c;感谢有你&#xff0c;你的支持&#xff0c;就是我前行的最大动力&#xff0c;如果看完对你有帮助&#xff0c;请留下您的足迹&#xff09; 目录 受控表单绑定 React中获取DOM 组件通信 父传子 父传子-基础实现 父传子-props说明 父传子 - 特殊的…

J4 - ResNet与DenseNet结合

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 | 接辅导、项目定制 目录 环境模型设计模型效果展示总结与心得体会 环境 系统: Linux语言: Python3.8.10深度学习框架: Pytorch2.0.0cu118显卡&#xff1a;GT…

构建坚固网络,SD-WAN网络配置指南

在新兴的网络技术中&#xff0c;软件定义广域网&#xff08;SD-WAN&#xff09;作为关键角色脱颖而出&#xff0c;被广泛应用于构建高效可靠的企业网络。利用SD-WAN技术&#xff0c;企业能够更好地管理和优化其网络基础设施&#xff0c;实现更高效的连接和数据传输。本文将深入…

STM32标准库开发——串口发送/单字节接收

USART基本结构 串口发送信息 启动串口一的时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);初始化对应串口一的时钟&#xff0c;引脚&#xff0c;将TX引脚设置为复用推挽输出。 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); GPIO_InitTypeDef GPIO_In…

BigeMap在Unity3d中的应用,助力数字孪生

1. 首先需要用到3个软件&#xff0c;unity&#xff0c;gis office 和 bigemap离线服务器 Unity下载地址:点击前往下载页面(Unity需要 Unity 2021.3.2f1之后的版本) Gis office下载地址:点击前往下载页面 Bigemap离线服务器 下载地址: 点击前往下载页面 Unity用于数字孪生项…

比吸收率(SAR)

本文旨在介绍比吸收率&#xff08;Specific Absorption Rate&#xff09;的基本知识。搬运自https://www.antenna-theory.com。英语够用的朋友可以直接移步。感谢网站创始人Peter Joseph Bevelacqua教授的无私奉献。 ------------------我是分隔线------------------- 比吸收…

【征服redis6】Redis的内存淘汰详解

目录 1.redis的基本策略 2.Redis中的缓存淘汰策略 3.Redis内存不足的情况 4.几种淘汰策略的实现原理 5.项目实践与优化策略 5.1 配置案例 5.2 项目优化策略参考 数据库存储会将数据保存到磁盘中&#xff0c;而Redis的核心数据是在内存中的&#xff0c;而Redis本身主要用来…