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.mzph.cn/news/634850.shtml

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

相关文章

交叉编译工具 aarch64-linux-gnu-gcc 的介绍与安装

AArch64 是随 ARMv8 ISA 一起引入的 64 位架构&#xff0c;用于执行 A64 指令的计算机。而且在 AArch64 状态下执行的代码只能使用 A64 指令集。&#xff0c;而不能执行 A32 或 T32 指令。但是&#xff0c;与 AArch32 中不同&#xff0c;在64位状态下&#xff0c;指令可以访问 …

Java异常

异常 认识异常 异常就是代表程序出现的问题 Exception&#xff1a;叫异常&#xff0c;它代表的才是我们程序可能出现的问题&#xff0c;所以&#xff0c;我们通常会用Exception以及它的孩子来封装出现出现的问题。 运行时异常&#xff1a;RuntimeException及其子类&#xff…

MyBatisPlus学习笔记五-插件功能

0、插件功能 MyBatisPlus提供的内置拦截器有下面这些 1、分页插件 2、通用分页实体 3、通用分页实体-强化 需求&#xff1a; 在PageQuery中定义方法&#xff0c;将PageQuery对象转为MyBatisPlus中的Page对象在PageDTO中定义方法&#xff0c;将MyBatisPlus中的Page结果转为Page…

go语言(八)---- map

map的声明方式有以下三种。 package mainimport "fmt"func main() {//第一种声明方式//声明map1是一个map类型&#xff0c;key是String&#xff0c;value是Stringvar myMap1 map[string] stringif myMap1 nil {fmt.Println("myMap1 是一个空map")}//在使…

Datawhale 强化学习笔记(二)马尔可夫过程,DQN 算法

文章目录 参考马尔可夫过程DQN 算法&#xff08;Deep Q-Network&#xff09;如何用神经网络来近似 Q 函数如何用梯度下降的方式更新网络参数强化学习 vs 深度学习 提高训练稳定性的技巧经验回放目标网络 代码实战 DQN 算法进阶Double DQNDueling DQN 算法代码实战 参考 在线阅…

基于LDA的评论大数据的分析及主题建模

1.微博的关键词大数据采集&#xff1b; 已完成&#xff0c;待优化 2.LDA 错误1&#xff1a;使用了import pyLDAvis.sklearn&#xff0c;提示没有模块no module named pyldavis.sklearn。 默认安装 pyLDAvis3.4.1&#xff0c;最后降级处理&#xff0c;解决方式&#xff1a; …

docker ps -a 要求只显示自己想要的信息

在使用 docker ps -a 要求只显示这下面这几个字段&#xff0c;不显示其他的内容&#xff0c;方便查看哪些容器在运行&#xff0c;那些已经挂起。 例子&#xff1a; 我只想想显示这几个字段&#xff1a; CONTAINER ID STATUS NAMES docker ps -a --format "table {{.ID}…

EasyX图形化学习(三)

1.帧率&#xff1a; 即每秒钟界面刷新次数&#xff0c;下面以60帧为例&#xff1a; 1.数据类型 clock_t&#xff1a; 用来保存时间的数据类型。 2.clock( ) 函数&#xff1a; 用于返回程序运行的时间,无需参数。 3.例子&#xff1a; 先定义所需帧率&#xff1a; const …

20230118-【UNITY 学习】增加攀登系统

替换脚本PlayerMovement_04.cs using System.Collections; using System.Collections.Generic; using UnityEngine;public class PlayerMovement_05 : MonoBehaviour {private float moveSpeed; // 玩家移动速度public float walkSpeed 7; // 行走速度public float sprintSpee…

[笔记]深度学习入门 基于Python的理论与实现(一)

代码仓库 gitee 1. python 入门 1.5之前是python安装和基础语法, 我直接跳过了 1.5 Numpy 深度学习中经常出现数组和矩阵运算&#xff0c;Numpy 的数组类 numpy.array 提供了很多便捷的方法 1.5.1 导入 Numpy import numpy as np1.5.2 生成 Numpy 数组 np.array()&#xf…

C++ 设计模式之策略模式

【声明】本题目来源于卡码网&#xff08;题目页面 (kamacoder.com)&#xff09; 【提示&#xff1a;如果不想看文字介绍&#xff0c;可以直接跳转到C编码部分】 【设计模式大纲】 【简介】什么是策略模式&#xff08;第14种模式&#xff09; 策略模式是⼀种⾏为型设计模式&…

西门子WINCC常用C脚本1

1.置位&#xff0c;复位&#xff0c;取反 获取变量值&#xff1a;GetTagBit(可以是位也可以是字节&#xff0c;字&#xff0c;双字等具体字母不同) 设置变量值&#xff1a;SetTagBit 置位&#xff1a;SetTagBit&#xff08;"变量名",1&#xff09; 复位&#xff…

Node+Express编写接口---前端

前端页面 vue_node_admin: 第一个以node后端,vue为前端的后台管理项目https://gitee.com/ah-ah-bao/vue_node_admin.git

java-log4j日志冲突解决

一、概述 java日志框架较多&#xff0c;其中主流的slf4j和commons-logging是日志接口&#xff0c;log4j、log4j2和logback是真正的日志实现库。 二、具体库单独使用 2.1 log4j <dependency><groupId>log4j</groupId><artifactId>log4j</artifa…

Ceph分布式存储(1)

目录 一.ceph分布式存储 Ceph架构&#xff08;自上往下&#xff09; OSD的存储引擎&#xff1a; Ceph的存储过程&#xff1a; 二. 基于 ceph-deploy 部署 Ceph 集群 20-40节点上添加3块硬盘&#xff0c;一个网卡&#xff1a; 10节点为admin&#xff0c;20-40为node&…

指针理解C部分

目录 1.二级指针 2.指针数组 2.1指针数组的定义和表现形式 2.2指针数组模拟实现二维数组 2.2.1二维数组 2.2.2使用指针数组模拟实现二维数组 3.字符指针 2.数组指针 3.二维数组传参 4.函数指针 4.1函数指针变量的定义和创建 4.2函数指针变量的使用 4.3两段有趣的代码 4.…

Python自动化测试中APScheduler Flask的应用示例

使用背景 实际项目中&#xff0c;需要验证打点数据在各个系统中收集是否一致&#xff0c;而部分节点打点数据收集是通过异步任务实现的&#xff0c;等待时间比较久。为应对业务异步操作处理&#xff0c;实现异步数据的收集&#xff0c;经过调研后&#xff0c;选择了 APSchedule…

JMeter实操入门之登录

JMeter实操入门之登录 前言初级-无变量的登录线程组取样器-HTTP请求 进阶-定义变量的登录用户定义的变量获取JSON返回的数据-tokentoken设置全局变量 前言 安装及环境配置教程可移步&#xff1a;JMeter安装与配置环境 本篇文章针对小白进一步的认识及运用JMeter&#xff0c;围绕…

湖(岛屿)

from book&#xff1a;挑战程序设计竞赛

表的增删改查 进阶(二)

&#x1f3a5; 个人主页&#xff1a;Dikz12&#x1f525;个人专栏&#xff1a;MySql&#x1f4d5;格言&#xff1a;那些在暗处执拗生长的花&#xff0c;终有一日会馥郁传香欢迎大家&#x1f44d;点赞✍评论⭐收藏 目录 3.新增 4.查询 聚合查询 聚合函数 GROUP BY子句 HA…