当前位置: 首页 > news >正文

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.管理员管理

相关文章:

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

day14 订单管理系统 1.关于登录 1.1 UI美化 页面美化&#xff0c;用BootStrap 自定义BooStrapForm类实现。 class BootStrapForm:exclude_filed_list []def __init__(self, *args, **kwargs):super().__init__(*args, **kwargs)# {title:对象,"percent":对象}fo…...

Docker 安装 CentOS

Docker 安装 CentOS CentOS&#xff08;Community Enterprise Operating System&#xff09;是 Linux 发行版之一&#xff0c;它是来自于 Red Hat Enterprise Linux(RHEL) 依照开放源代码规定发布的源代码所编译而成。由于出自同样的源代码&#xff0c;因此有些要求高度稳定性…...

方案解决:5G基站节能及数字化管理

截至2023年10月&#xff0c;我国5G基站总数达321.5万个&#xff0c;占全国通信基站总数的28.1%。然而&#xff0c;随着5G基站数量的快速增长&#xff0c;基站的能耗问题也逐渐日益凸显&#xff0c;基站的用电给运营商带来了巨大的电费开支压力&#xff0c;降低5G基站的能耗成为…...

JavaScript深浅拷贝的几种方式

文章目录 前言深拷贝1. JSON.parse(JSON.strigify(Str))2. lodash.deepclone3. structuredClone 浅拷贝总结 前言 深浅拷贝主要是针对于引用类型而言的 深拷贝 1. JSON.parse(JSON.strigify(Str)) 序列化的作用是存储(对象本身存储的只是一个地址映射&#xff0c;如果断电&a…...

VBA窗体跟随活动单元格【简易版】(2/2)

上一篇博客&#xff08;文章连接如下&#xff09;中使用工作表事件Worksheet_SelectionChange实现了窗体跟随活动单元格的动态效果。 VBA窗体跟随活动单元格【简易版】(1/2) 为了在用户滚动工作表窗体之后仍能够实现跟随效果&#xff0c;需要使用Application.Windows(1).Visibl…...

个性化定制的知识付费小程序,为用户提供个性化的知识服务

明理信息科技知识付费saas租户平台 随着知识经济的兴起&#xff0c;越来越多的人开始重视知识付费&#xff0c;并希望通过打造自己的知识付费平台来实现自己的知识变现。本文将介绍如何打造自己的知识付费平台&#xff0c;并从定位、内容制作、渠道推广、运营维护四个方面进行…...

【轮式平衡机器人】——软硬件配置/准备

本系列以轮式平衡移动机器人为例&#xff0c;将使用基于模型设计&#xff08;MBD&#xff09;方法进行介绍&#xff0c;涉及基础硬件、软件、控制算法等多方面内容&#xff0c;结合MATLAB/Simulink的强大仿真能力和代码生成能力辅助设计&#xff01;在此过程中可以系统了解开发…...

中国联通助力吴江元荡生态岸线打造5G+自动驾驶生态长廊

吴江&#xff0c;素有“鱼米之乡”“丝绸之府”的美誉&#xff0c;其地理位置优越&#xff0c;地处太湖之滨。近年来&#xff0c;随着长三角生态绿色一体化发展示范区&#xff08;以下简称“示范区”&#xff09;的建立&#xff0c;元荡更是声名大噪&#xff0c;成为众多游客心…...

小白准备蓝桥杯之旅(c/c++b组)

前言&#xff1a;省赛获奖比例高达百分之60,只要比一半的人努力&#xff0c;你就能大概率获奖。 寒假做的3件事 1.稳基础 熟练掌握基础语法部分&#xff0c;c比c多个stl库优势&#xff0c;c语言的同学需要会实现c中stl库部分 2.刷真题 大概比赛前30天&#xff0c;坚持每天做…...

Flutter GetX 之 国际化

今天给大家介绍一下 GetX 的国际化功能,在日常开发过程中,我们经常会使用到国际化功能,需要们的应用支持 国际化,例如我们需要支持 简体、繁体、英文等等。 上几篇文章介绍了GetX的 路由管理 和 状态管理,看到大家的点赞和收藏,还是很开心的,说明这两篇文章给大家起到了…...

349. 两个数组的交集(力扣)(OJ题)

题目链接&#xff1a;349. 两个数组的交集 - 力扣&#xff08;LeetCode&#xff09; 个人博客主页&#xff1a;https://blog.csdn.net/2301_79293429?typeblog 专栏&#xff1a;https://blog.csdn.net/2301_79293429/category_12545690.html 给定两个数组 nums1 和 nums2 &a…...

安全帽识别-赋能深圳自贸中心智慧工地

在当今的建筑行业中&#xff0c;安全管理一直是一个至关重要的议题。深圳自贸中心项目在这方面进行了一次有益的尝试——实施智慧工地安全帽识别系统。本文将对这一创新举措进行简要介绍。 项目背景 深圳自贸中心&#xff0c;作为一项标志性建设项目&#xff0c;承载着城市发展…...

代码之外:工程师的成长进阶秘籍

程序员只懂技术能行吗&#xff1f; 为什么说技术人员“说”和“写”总得擅长一个&#xff1f; 你以为的“关注结果”是真的结果吗&#xff1f; 从一线工程师跃升团队管理者一共分几步&#xff1f; 在不断变化的职场环境中&#xff0c;技术人如何保持竞争力并实现自我增值&a…...

openssl3.2 - 官方demo学习 - smime - smsign2.c

文章目录 openssl3.2 - 官方demo学习 - smime - smsign2.c概述笔记END openssl3.2 - 官方demo学习 - smime - smsign2.c 概述 PKCS7联合签名 从N张证书中, 分别得到N对(x509和私钥) 对明文进行签名(只是指定了bio_in和flag), 得到pkcs7* 对此pkcs7进行附加签名者的操作(指定证…...

6.C++对象模型

一.成员变量和成员函数分开存储&#xff1a; 在C中&#xff0c;类的成员变量和成员函数分开存储&#xff0c;只有非静态成员变量在属于类的对象上。 1.空对象的所占内存大小&#xff1a; //成员变量和成员函数分开存储 class Person {};void test() {Person p;cout << &…...

AbstractHttpMessageConverter + easyexcell优雅下载附件

介绍 AbstractHttpMessageConverter 是 Spring 框架中用于处理 HTTP 消息转换的抽象基类。它用于处理来自 HTTP 请求的消息,并将其转换为特定的 Java 对象,或者将 Java 对象转换为 HTTP 响应消息。 这个抽象类允许开发人员创建自定义的 HTTP 消息转换器,以便在 Spring MVC…...

虚拟线程探索与实践

优质博文&#xff1a;IT-BLOG-CN 一、简介 虚拟线程是轻量级线程&#xff0c;极大地减少了编写、维护和观察高吞吐量并发应用的工作量。虚拟线程是由JEP 425提出的预览功能&#xff0c;并在JDK 19中发布&#xff0c;JDK 21中最终确定虚拟线程&#xff0c;以下是根据开发者反馈…...

openssl3.2 - 官方demo学习 - mac - poly1305.c

文章目录 openssl3.2 - 官方demo学习 - mac - poly1305.c概述笔记END openssl3.2 - 官方demo学习 - mac - poly1305.c 概述 MAC算法为Poly1305, 加密算法为AES-128-ECB, 用key初始化加密算法 加密算法进行padding填充 对加密算法的key加密, 放入MAC_key后16字节, 将MAC_key的…...

【Python 千题 —— 基础篇】不吉利的数字

题目描述 题目描述 在西方,“13”被称为不吉利的数字,这是因为耶稣与13个弟子共进晚餐时耶稣的第13个弟子出卖了耶稣,且耶稣受难的日期是13日。所以西方的门牌号会跳过13号,假设这栋楼有16户,请为这栋楼的每一户设立门牌号。 输入描述 无 输出描述 依次输出这栋楼每…...

3d模型未响应打不开怎么办---模大狮模型网

在进行3D建模和设计工作时&#xff0c;有时可能会遇到3D模型无法打开的情况&#xff0c;这给工作流程带来了困扰。本文将为您介绍一些常见的原因以及解决3D模型未响应无法打开问题的方法。 一、文件格式检查 首先&#xff0c;确保您使用的文件格式与所使用的软件兼容。不同的3…...

Java-NIO 开篇(1)

NIO简介 高性能的Java通信&#xff0c;离不开Java NIO组件&#xff0c;现在主流的技术框架或中间件服务器&#xff0c;都使用了Java NIO组件&#xff0c;譬如Tomcat、 Jetty、 Netty、Redis、RabbitMQ等的网络通信模块。在1.4版本之前&#xff0c; Java IO类库是阻塞式IO&…...

VSCode 插件推荐

前言 关于开发用的插件就不做赘述了&#xff0c;网上面有很多文章都做了推荐&#xff0c;本文推荐几个好看的插件。 文件图标主题 Vscode icons Material Icon Theme 字体主题 推荐 One Dark Pro 其他 推荐一个生成好看代码的网址 https://carbon.now.sh/...

摄像部分时序

&#xff08;1&#xff09;.,后摄像。 &#xff08;2&#xff09;.,前摄像。 RCAM_TO_LEDDRV_STROBE_EN_CONN表面意思是:后置摄像头到led驱动闪光灯_使能。从时序图中看起来是连接到U17的&#xff0c;发现果然如此。 闪光灯温度检测&#xff0c;是检测闪光灯的温度。所以时序图…...

为什么 Golang Fasthttp 选择使用 slice 而非 map 存储请求数据

文章目录 Slice vs Map&#xff1a;基本概念内存分配和性能Fasthttp 中的 SliceMap性能优化的深层原因HTTP Headers 的特性CPU 预加载特性 结论 Fasthttp 是一个高性能的 Golang HTTP 框架&#xff0c;它在设计上做了许多优化以提高性能。其中一个显著的设计选择是使用 slice 而…...

C#设计模式教程(7):适配器模式

适配器模式的定义 适配器模式(Adapter Pattern)是一种结构型设计模式,它允许不兼容的接口之间能够相互合作。适配器的作用是解决那些因接口不兼容而不能一起工作的类的问题,它通过包装一个类的接口转换成另一个期望的接口。 适配器模式主要分为两种: 类适配器(Class Ad…...

1818:红与黑【解析】-------深度优先搜索

1818:红与黑 描述 有一间长方形的房子&#xff0c;地上铺了红色、黑色两种颜色的正方形瓷砖。你站在其中一块黑色的瓷砖上&#xff0c;只能向相邻的黑色瓷砖移动。请写一个程序&#xff0c;计算你总共能够到达多少块黑色的瓷砖。 输入 包括多个数据集合。每个数据集合的第一行…...

实验三 Oracle数据库的创建和管理

&#x1f57a;作者&#xff1a; 主页 我的专栏C语言从0到1探秘C数据结构从0到1探秘Linux &#x1f618;欢迎关注&#xff1a;&#x1f44d;点赞&#x1f64c;收藏✍️留言 &#x1f3c7;码字不易&#xff0c;你的&#x1f44d;点赞&#x1f64c;收藏❤️关注对我真的很重要&…...

Mysql:重点且常用的 SQL 标签整理

目录 1 <resultMap> 标签 2 <sql> 标签 3 <where> 标签 4 <if> 标签 5 <trim> 标签 6 <foreach> 标签 7 <set> 标签 1 <resultMap> 标签 比如以下代码&#xff1a; <resultMap type"SysCollege" id&qu…...

云锁防火墙编译安装nginx-plugin模块

一般情况下&#xff0c;当用户安装云锁的时候&#xff0c;云锁会自动适配nginx版本&#xff0c;使用我们已经预编译好的包含云锁模块的nginx备份并替换掉您当前系统中使用的nginx。卸载时&#xff0c;会将系统原始nginx文件替换回来。因此&#xff0c;云锁可保护使用nginx搭建的…...

【服务器数据恢复】服务器迁移数据时lun数据丢失的数据恢复案例

服务器数据恢复环境&服务器故障&#xff1a; 一台安装Windows操作系统的服务器。工作人员在迁移该服务器中数据时突然无法读取数据&#xff0c;服务器管理界面出现报错。经过检查发现服务器中一个lun的数据丢失。 服务器数据恢复过程&#xff1a; 1、将故障服务器中所有磁盘…...