2024--Django平台开发-订单项目管理用户认证+动态菜单+权限控制(十三)

day13 订单管理项目开发

在这里插入图片描述

1.表结构设计

1.1 abstract类

from django.db import modelsclass ActiveBaseModel(models.Model):active = models.SmallIntegerField(verbose_name="状态", default=1, choices=((1, "激活"), (0, "删除"),))class Meta:abstract = Trueclass Administrator(ActiveBaseModel):""" 管理员表 """username = models.CharField(verbose_name="用户名", max_length=32, db_index=True)password = models.CharField(verbose_name="密码", max_length=64)mobile = models.CharField(verbose_name="手机号", max_length=11, db_index=True)create_date = models.DateTimeField(verbose_name="创建日期", auto_now_add=True)

1.2 自增和主键

默认:DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'

class Administrator(models.Model):""" 管理员表 """uid = models.AutoField(verbose_name="自增", primary_key=True)username = models.CharField(verbose_name="用户名", max_length=32, db_index=True)password = models.CharField(verbose_name="密码", max_length=64)mobile = models.CharField(verbose_name="手机号", max_length=11, db_index=True)create_date = models.DateTimeField(verbose_name="创建日期", auto_now_add=True)

1.3 逻辑删除

class Administrator(ActiveBaseModel):""" 管理员表 """username = models.CharField(verbose_name="用户名", max_length=32, db_index=True)password = models.CharField(verbose_name="密码", max_length=64)mobile = models.CharField(verbose_name="手机号", max_length=11, db_index=True)create_date = models.DateTimeField(verbose_name="创建日期", auto_now_add=True)active = models.SmallIntegerField(verbose_name="状态", default=1, choices=((1, "激活"), (0, "删除"),))

1.4 数据库连接

DATABASES = {'default': {'ENGINE': 'django.db.backends.sqlite3','NAME': BASE_DIR / 'db.sqlite3',}
}
DATABASES = {'default': {'ENGINE': 'django.db.backends.mysql','NAME': 'day06',  # 数据库名字'USER': 'root','PASSWORD': 'root123','HOST': '127.0.0.1','PORT': 3307,}
}

1.5 表结构参考

from django.db import modelsclass ActiveBaseModel(models.Model):active = models.SmallIntegerField(verbose_name="状态", default=1, choices=((1, "激活"), (0, "删除"),))class Meta:abstract = Trueclass Administrator(ActiveBaseModel):""" 管理员表 """username = models.CharField(verbose_name="用户名", max_length=32, db_index=True)password = models.CharField(verbose_name="密码", max_length=64)mobile = models.CharField(verbose_name="手机号", max_length=11, db_index=True)create_date = models.DateTimeField(verbose_name="创建日期", auto_now_add=True)class Level(ActiveBaseModel):""" 级别表 """title = models.CharField(verbose_name="标题", max_length=32)percent = models.IntegerField(verbose_name="折扣", help_text="填入0-100整数表示百分比,例如:90,表示90%")def __str__(self):return self.titleclass Customer(ActiveBaseModel):""" 客户表 """username = models.CharField(verbose_name="用户名", max_length=32, db_index=True)password = models.CharField(verbose_name="密码", max_length=64)mobile = models.CharField(verbose_name="手机号", max_length=11, db_index=True)# mobile = models.CharField(verbose_name="手机号", max_length=11, db_index=True, validators=[RegexValidator(r'^\d{11}$', '手机号格式错误'), ], )balance = models.DecimalField(verbose_name="账户余额", default=0, max_digits=10, decimal_places=2)level = models.ForeignKey(verbose_name="级别", to="Level", on_delete=models.CASCADE)# level = models.ForeignKey(verbose_name="级别", to="Level", on_delete=models.CASCADE, limit_choices_to={'active': 1})create_date = models.DateTimeField(verbose_name="创建日期", auto_now_add=True)creator = models.ForeignKey(verbose_name="创建者", to="Administrator", on_delete=models.CASCADE)class PricePolicy(models.Model):""" 价格策略(原价,后续可以根据用级别不同做不同折扣)1  1000 102  2000 18"""count = models.IntegerField(verbose_name="数量")price = models.DecimalField(verbose_name="价格", default=0, max_digits=10, decimal_places=2)class Order(ActiveBaseModel):""" 订单表 """status_choices = ((1, "待执行"),(2, "正在执行"),(3, "已完成"),(4, "失败"),(5, "已撤单"),)status = models.SmallIntegerField(verbose_name="状态", choices=status_choices, default=1)# 202211022123123123oid = models.CharField(verbose_name="订单号", max_length=64, unique=True)url = models.URLField(verbose_name="视频地址", db_index=True)count = models.IntegerField(verbose_name="数量")price = models.DecimalField(verbose_name="价格", default=0, max_digits=10, decimal_places=2)real_price = models.DecimalField(verbose_name="实际价格", default=0, max_digits=10, decimal_places=2)old_view_count = models.CharField(verbose_name="原播放量", max_length=32, default="0")create_datetime = models.DateTimeField(verbose_name="创建时间", auto_now_add=True)customer = models.ForeignKey(verbose_name="客户", to="Customer", on_delete=models.CASCADE)memo = models.TextField(verbose_name="备注", null=True, blank=True)class TransactionRecord(ActiveBaseModel):""" 交易记录 """charge_type_class_mapping = {1: "success",2: "danger",3: "default",4: "info",5: "primary",}charge_type_choices = ((1, "充值"), (2, "扣款"), (3, "创建订单"), (4, "删除订单"), (5, "撤单"),)charge_type = models.SmallIntegerField(verbose_name="类型", choices=charge_type_choices)customer = models.ForeignKey(verbose_name="客户", to="Customer", on_delete=models.CASCADE)amount = models.DecimalField(verbose_name="金额", default=0, max_digits=10, decimal_places=2)creator = models.ForeignKey(verbose_name="管理员", to="Administrator", on_delete=models.CASCADE, null=True, blank=True)order_oid = models.CharField(verbose_name="订单号", max_length=64, null=True, blank=True, db_index=True)create_datetime = models.DateTimeField(verbose_name="交易时间", auto_now_add=True)memo = models.TextField(verbose_name="备注", null=True, blank=True)

2.用户认证相关

两种登录方式:

  • 用户名 + 密码 登录
  • 手机号 + 短信 登录

当用户登录成功后,将用户信息保存至Session【数据库 or 缓存】,不同类型用户登录 显示不同的菜单项。

2.1 发送短信

  • 腾讯云短信
  • 云通信短信
  • 互亿无线106短信

2.2 缓存和Session

pip install django-redis
CACHES = {"default": {"BACKEND": "django_redis.cache.RedisCache","LOCATION": "redis://127.0.0.1:6379","OPTIONS": {"CLIENT_CLASS": "django_redis.client.DefaultClient","CONNECTION_POOL_KWARGS": {"max_connections": 100}"PASSWORD": "qwe123",# 'MAX_ENTRIES': 300,  # 最大缓存个数(默认300)# 'CULL_FREQUENCY': 3,  # 缓存到达最大个数之后,剔除缓存个数的比例,即:1/CULL_FREQUENCY(默认3)}}
}
############
# SESSIONS #
############
# Session存储在哪里?
# SESSION_ENGINE = "django.contrib.sessions.backends.db"# 如果存储到文件中,文件的路径。
# SESSION_ENGINE = "django.contrib.sessions.backends.file"
# SESSION_FILE_PATH = None# 存储到缓存
SESSION_ENGINE = "django.contrib.sessions.backends.cache"
SESSION_CACHE_ALIAS = "default"

此时也可以手动操作,将数据保存到redis中:

from django_redis import get_redis_connectionconn = get_redis_connection("default")
conn.set("xx","123123")
conn.get("xx")

2.3 动态菜单

不同角色的用户登录,看到不同的菜单。

  • 页面写死 HTML模板

    <html>{% if 角色 "管理员"%}<a href="/xxx/x">用户管理</a><a href="/xxx/x">级别管理</a><a href="/xxx/x">级别管理</a>...{% else %}<a href="/xxx/x">xxx管理</a><a href="/xxx/x">级别管理</a>{% endif %}
    </html>
    
  • 将菜单放在配置文件中 (选择

    # settings.pyADMIN = [{"title":"用户管理", "url":"...." },{"title":"用户管理", "url":"...." },{"title":"用户管理", "url":"...." },{"title":"用户管理", "url":"...." },
    ]USER = [{"title":"用户管理", "url":"...." },{"title":"用户管理", "url":"...." },{"title":"用户管理", "url":"...." },{"title":"用户管理", "url":"...." },
    ]
    
    <html>{% if 角色 "管理员"%}{% for item in ADMIN%}<a href="{{item.url}}">{{item.title}}</a>{%emdfor%}{% else %}{% for item in USER%}<a href="{{item.url}}">{{item.title}}</a>{%emdfor%}{% endif %}
    </html>
    

如果想要显示2级菜单:

ADMIN = [{"title":"用户管理", "url":"...." },{"title":"用户管理", "url":"...." },{"title":"用户管理", "url":"...." },{"title":"用户管理", "url":"...." },
]
ADMIN = [{"title":"用户管理", "children":[{"title":"级别列表","url":"....", "name":"level_list",}{"title":"级别列表","url":"...."}{"title":"级别列表","url":"...."}]},{"title":"订单管理", "children":[{"title":"订单列表","url":"...."}{"title":"订单列表","url":"...."}{"title":"订单列表","url":"...."}]},
]
  • 菜单选中和展开

    1.获取当前用户请求的 URL   pricepolicy/list/ 或 url对应的name
    2. pricepolicy/list/ 配置 ADMIN中的URL   ->默认选中
    
  • 路径导航的问题

    1.获取当前用户请求的 URL   pricepolicy/list/ 或 url对应的name
    2.获取上级,展示导航信息
    3.设置菜单与下级关系
    

2.4 权限控制

权限的判断时,要考虑:正常的点击、非法输入。

v1 = [11,22,33,44]
if 33 in v1:pass
v1 = {11,22,33,44}
if 33 in v1:pass
v1 = {11:123123,22:12312333:12312344:123123
}if 33 in v1:pass
  • 文件settings.py的方式(编写)

    admin_permisions = {"level_list":{...},"level_edit":{..., 'parent':'level_list'},"level_add":{... 'parent':'level_list'},"level_delete":{..'parent':'level_list'.},"user_list":{...},"user_edit":{...},"user_add":{...},"user_delete":{...},
    }user_permisions = {...
    }
    
    admin访问某个URL + 路由信息(name、namespace),获取当前的URL  /level/edit/4/ -> 是否存在URL
    
    在中间件中根据URL中的name进行权限的校验。
    
  • 数据库的方式
    在这里插入图片描述

2.5 local_settings.py

线上部署和本地settings.py想要隔离,可以使用local_settings.py来进行配置。

try:from .local_settings import *
except ImportError:pass

注意:在做版本控制提交代码时,在.gitignore中设置上 local_settings.py

在这里插入图片描述

2.6 用户名登录

2.7 短信登录

2.8 动态菜单

2.9 权限控制

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

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

相关文章

【Java】HttpServlet类中前后端交互三种方式(query string、form表单、JSON字符串)

在前后端的交互中&#xff0c;前端通过以下三种方式来与后端进行交互&#x1f31f; ✅query string ✅form表单 ✅JSON字符串 下面我们将书写这三种方式的后端代码并进行讲解 1、Query String QueryString即在url中写入键值对&#xff0c;一般用doGet方法进行交互 代码如下 …

『MySQL快速上手』-⑩-索引特性

文章目录 1.索引的作用2.索引的理解建立测试表插入多条记录查看结果 2.1 MySQL与磁盘交互的基本单位2.1 为何IO交互要是 Page2.3 理解单个Page2.4 理解多个Page2.5 页目录2.6 单页情况2.7 多页情况2.8 B vs B2.9 聚簇索引 vs 非聚簇索引非聚簇索引聚簇索引 3.索引操作3.1 创建主…

Redis实战之-分布式锁

一、基本原理和实现方式对比 分布式锁&#xff1a;满足分布式系统或集群模式下多进程可见并且互斥的锁。 分布式锁的核心思想就是让大家都使用同一把锁&#xff0c;只要大家使用的是同一把锁&#xff0c;那么我们就能锁住线程&#xff0c;不让线程进行&#xff0c;让程序串行…

『Open3D』1.10 Tensor数据处理

open3d中实现了自身的数据类型,用于open3d中内部算法的数值计算,但基础使用上与numpy类似。 目录 1、tensor创建 2、tensor数据属性 3、 Tensor数据在CPU与GPU上的转换

51单片机中断系统编程

一.外部中断 1.编程思想 中断准备&#xff1a;中断初始化函数打开中断开关 &#xff0c;选择中断传输方式中断处理&#xff1a;为了便于观察&#xff0c;让我们知道单片机进入中断处理函数&#xff0c;在这里我们选择打开流水灯电路搭建&#xff1a;由于P3^3引脚不便直接接地…

用LED数码显示器循环显示数字0~9

#include<reg51.h> // 包含51单片机寄存器定义的头文件 /************************************************** 函数功能&#xff1a;延时函数&#xff0c;延时一段时间 ***************************************************/ void delay(void) { unsigned …

C语言总结十二:文件操作详细总结

在操作系统中&#xff0c;为了统一对各种硬件的操作&#xff0c;简化接口&#xff0c;不同的硬件设备也都被看成一个文件。对这些文件的操作&#xff0c;等同于对磁盘上普通文件的操作。我们不去探讨硬件设备是如何被映射成文件的&#xff0c;把任意 I/O 设备&#xff0c;转换成…

Doris配置外表以及多个Hive外表的配置

1.场景分析 以Clickhouse、Doris、Starrocks等为代表的mpp分析数据库正在快速的兴起&#xff0c;以其高效查询、跨库整合能力收到广大技术人员的喜爱。本文主要浅显介绍下作者在使用Doris时&#xff0c;通过建立catlog进行跨库查询。 废话不多少&#xff0c;直接上代码 2.相关…

使用Python+pygame实现贪吃蛇小游戏

使用Pythonpygame贪吃蛇小游戏 使用第三方库pygame&#xff0c;关于Python中pygame游戏模块的安装使用可见 https://blog.csdn.net/cnds123/article/details/119514520 给出两种实现。 第一种 运行效果如下&#xff1a; 游戏源码如下&#xff1a; import pygame import sy…

HCIA-HarmonyOS设备开发认证-序

序 最近涉及到HarmonyOS鸿蒙系统设备开发&#xff0c;在网络上已经有很多相关资料&#xff0c;视频教程&#xff0c;我也移植了公司的一个stm32G474板卡&#xff0c;运行LiteOS-m L0系统。 一面看资料一面移植&#xff0c;遇到不少坑&#xff0c;当看到运行的LOGO时&#xff0…

openpose之使用摄像头检测并输出到json文件

编程如画&#xff0c;我是panda&#xff01; 前言 之前给大家分享了如何搭建openpose环境&#xff0c;并进行了测试案例&#xff0c;但是如果要使用摄像头的话&#xff0c;还需要修改一下运行文件&#xff0c;并且这次会教大家如何输出到json文件 。 如果环境还没有搭建好&am…

三层架构——工业控制领域简单理解

前言闲话 工业领域对好滴软件架构的需求不高&#xff0c;但不意味着可以用纯面向过程式编程解决问题&#xff0c;这样后期维护必将大乱。 曾经和一位从业30年的老电气工程师交流工业控制编程&#xff1a; 我问&#xff1a;为啥富士康这些大厂以前的机器都不联网&#xff1f;&…