项目立项
1 后台管理介绍
1.1 后台管理系统介绍
对于一家企业来说,拥有一个完整网站是很重要的事情,网站包括前端设计和后端的信息管理。简单来说,前端就是当我们打开一个网站的时候,眼睛所能看到的一切,而后台则是我们所看不到的一个信息管理系统。
网站后台管理系统主要是用于对网站前台的信息管理,如文字、图片、影音、和其他日常使用文件的发布、更新、删除等操作,同时也包括会员信息、订单信息、访客信息的统计和管理。简单来说就是对网站数据库和文件的快速操作和管理系统,以使得前台内容能够得到及时更新和调整。
2 后台管理模块
2.1 后台管理模块划分
商城后台管理系统一般分以下模块:商品管理、会员管理、订单管理、用户管理、角色权限 、报表业务、库存管理和广告业务等。
商品管理:商品分类的增删改查,品牌的增删改查及商品的增删改查功能
会员管理:商城的会员等级,优惠、积分、充值及会员的增删改查功能
订单管理:用户下单以后,订单的状态跟踪以及所有订单的统计功能
角色权限:增加新用户以后,为用户增加权限功能
报表业务:日销售报表、日新增用户报表、商品的销售报表、品牌销售报表、分类销售报表等
库存管理:商品的库存查看以及进货单、退货单、调价单的管理
广告业务:首页的轮播图、快讯等广告业务的管理
2.2 表设计及核心字段
- 用户 用户组及权限
from django.db import models
from django.contrib.auth.models import AbstractUser
#用户表
class User(AbstractUser):
"""
用户表
"""
phone = models.CharField(max_length=11, unique=True, verbose_name='用户手机')
last_login = models.DateTimeField()
class Meta:
db_table = 'user'
def __str__(self):
return self.username
# 权限类型表 (角色)
# id name
# pk varchar(30)
class PermissionType(models.Model):
"""权限类型的类型"""
name = models.CharField(max_length=30, verbose_name='权限名称')
class Meta:
db_table = 'permission_type'
def __str__(self):
return self.name
# 权限
# id title code_name type_name
# pk varchar(30) varchar(30) fk
class Permission(models.Model):
"""
权限模型类
"""
title = models.CharField(max_length=30, verbose_name='权限名称')
code_name = models.CharField(max_length=30, verbose_name='权限识别名称')
type_name = models.ForeignKey(PermissionType, on_delete=models.CASCADE)
class Meta:
db_table = 'permission'
# 用户组
# id name user permission
# pk varchar(30) m:m m:m
class UserGroup(models.Model):
"""用户组的模型类"""
name = models.CharField(max_length=30, verbose_name='名称')
user = models.ManyToManyField(User)
# 更改模型类: 从多对一改为多对多
permission = models.ManyToManyField(Permission)
class Meta:
db_table = 'groups'
def __str__(self):
return self.name
- 商品表
自关联的场景:
比如在选地址时,省的下级有很多市, 市的下级有很多县,设计表结构时,可以采用三张表结合外键实现省市县的存储,如图:
这样设计过于复杂,也不利于提高查询效率。
采用自关联的方式,一张表即可以解决以上问题:
from django.db import models
# 商品种类表
# id name cid
# pk varchar(30) 自关联字段
class Cate(models.Model):
"""
商品分类
"""
name = models.CharField(max_length=30)
# 自关联: 自己关联自己
cid = models.ForeignKey('self', related_name='subs',on_delete=models.CASCADE, null=True, blank=True)
class Meta:
db_table = 'cate'
def __str__(self):
return self.name
# 实例化mobile = Cate(name="手机")
# mobile.save() 手机类别是顶级类别 其cid 为null
# huawei = Cate(name="华为手机") 子类别
# huawei.cid = mobile 华为手机的父类别就是mobile
# huawei.save()
# xiaomi = Cate(name="小米手机")
# xiaomi.cid = mobile
# xiaomi.save()
# mobile.subs.all() 手机类别 反向查询
# 分类分组
# id name cate group_url sequence
# pk varchar(30) 1:1 varchar(100) int
# 默认http://jd.com 0
class Group(models.Model):
"""
一组 一类别
"""
name = models.CharField("组的名字", max_length=30)
cate = models.OneToOneField(Cate, on_delete=models.CASCADE)
group_url = models.CharField(max_length=100, verbose_name="频道的地址链接", default="http://jd.com")
sequence = models.IntegerField(verbose_name="组内的顺序", default=0)
class Meta:
db_table = 'cate_group'
def __str__(self):
return self.name
# 品牌表
# id first_name name logo
# pk varchar(10) varchar(20) varchar(200)
# 默认None