目录
项目立项
1 后台管理介绍
1.1 后台管理系统介绍
对于一家企业来说,拥有一个完整网站是很重要的事情,网站包括前端设计和后端的信息管理。简单来说,前端就是我们当我们打开一个网站的时候,肉眼所能看到的一切,而后台则是我们所看不到的一个信息管理系统。
网站后台管理系统主要是用于对网站前台的信息管理,如文字、图片、影音、和其他日常使用文件的发布、更新、删除等操作,同时也包括会员信息、订单信息、访客信息的统计和管理。简单来说就是对网站数据库和文件的快速操作和管理系统,以使得前台内容能够得到及时更新和调整。
2 后台管理模块
2.1 后台管理模块划分
商城后台管理系统一般分以下模块:商品管理、会员管理、订单管理、用户管理、角色权限 、报表业务、库存管理和广告业务等。
商品管理:商品分类的新增修改管理,品牌的增删改查及商品的增删改查功能
会员管理:商城的会员等级,优惠、积分、充值及会员的增删改查功能
订单管理:用户下单以后,订单的状态跟踪以及所有订单的统计功能
角色权限:增加新用户以后,为用户增加权限功能
报表业务:日销售报表、日新增用户报表、商品的销售报表、品牌销售报表、分类销售报表等
库存管理:商品的库存查看以及进货单、退货单、调价单的管理
广告业务:首页的轮播图、快讯等广告业务的管理
2.2 表设计及核心字段
class Role(BaseModel):
"""
角色表
"""
name = models.CharField(max_length=30)
class Meta:
db_table = 'tb_role'
verbose_name = '角色表'
verbose_name_plural = verbose_name
def __str__(self):
return self.name
class Permission(models.Model):
"""
用户的权限
"""
url = models.CharField(max_length=60, verbose_name='权限路由')
title = models.CharField(max_length=30, verbose_name='权限名称')
role = models.ManyToManyField(Role)
class Meta:
db_table = 'tb_permission'
verbose_name = '权限表'
verbose_name_plural = verbose_name
def __str__(self):
return self.title
class User(AbstractUser):
"""
用户表
"""
phone = models.CharField(max_length=11, null=True, blank=True, verbose_name='用户手机')
role = models.ManyToManyField(Role, verbose_name='所属角色')
class Meta:
db_table = 'user'
def __str__(self):
return self.username
class Cate(BaseModel):
"""
商品分类
"""
name = models.CharField(max_length=30)
cid = models.ForeignKey('self', on_delete=models.CASCADE, null=True, blank=True)
class Meta:
db_table = 'cate'
def __str__(self):
return self.name
class Group(BaseModel):
"""
分类分组
"""
name = models.CharField(max_length=30)
cate = models.OneToOneField(Cate, on_delete=models.CASCADE)
class Meta:
db_table = 'cate_group'
def __str__(self):
return self.name
class Color(BaseModel):
"""
颜色
"""
name = models.CharField(max_length=20)
class Meta:
db_table = 'color'
def __str__(self):
return self.name
class Version(BaseModel):
"""
版本
"""
name = models.CharField(max_length=30)
def __str__(self):
return self.name
class Meta:
db_table = 'version'
class Goods(BaseModel):
"""
商品表
名称、描述、价格、颜色、版本、库存、商品详情、商品默认图片、分类
"""
name = models.CharField(max_length=100)
describe = models.CharField(max_length=500)
price = models.DecimalField(max_digits=8, decimal_places=2)
stock = models.IntegerField(default=0)
detail = models.TextField()
image_default = models.ImageField(upload_to='goods')
color = models.ManyToManyField(Color)
version = models.ManyToManyField(Version)
cate = models.ForeignKey(Cate, on_delete=models.CASCADE)
class Meta:
db_table = 'goods'
def __str__(self):
return self.name
class AdvCate(BaseModel):
"""
广告分类,
轮播图、快讯、热门
"""
name = models.CharField(max_length=30)
class Meta:
db_table = 'adv_cate'
def __str__(self):
return self.name
class AdvContent(BaseModel):
"""
广告内容
标题、分类、图片、链接、内容
"""
title = models.CharField(max_length=100)
img = models.ImageField(upload_to='adv')
url = models.CharField(max_length=200, null=True, blank=True)
content = models.TextField()
cate = models.ForeignKey(AdvCate, on_delete=models.CASCADE)
periodical = models.CharField(max_length=30, null=True, blank=True, verbose_name='期刊')
def __str__(self):
return self.title
class Meta:
db_table = 'adv_content'
class Status(BaseModel):
name = models.CharField(max_length=30)
class Meta:
db_table = 'status'
def __str__(self):
return self.name
class Order(BaseModel):
"""
订单表
"""
PAY_METHOD_CHOICE = (
(1, '支付宝'),
(2, '微信'),
(3, '银联卡'),
(4, '代付')
)
order_no = models.CharField(max_length=128, primary_key=True)
address = models.ForeignKey('users.Address', on_delete=models.CASCADE)
user = models.ForeignKey('users.User', on_delete=models.CASCADE)
sum_total = models.DecimalField(max_digits=10, decimal_places=2)
sum_count = models.IntegerField()
pay_method = models.IntegerField(choices=PAY_METHOD_CHOICE, default=1)
status = models.ForeignKey(Status, on_delete=models.CASCADE)
class Meta:
db_table = 'order'
def __str__(self):
return self.order_no
class OrderSku(BaseModel):
EVALUATE_CHOICE = (
(0, '0分'),
(1, '20分'),
(2, '40分'),
(3, '60分'),
(4, '80分'),
(5, '100分')
)
order = models.ForeignKey(Order, on_delete=models.CASCADE)
sku = models.ForeignKey('goods.SKU', on_delete=models.CASCADE)
sku_num = models.IntegerField()
price = models.DecimalField(max_digits=10, decimal_places=2)
comment = models.TextField()
evaluate = models.IntegerField(choices=EVALUATE_CHOICE, default=5)
class Meta:
db_table = 'order_sku'
3 仓库创建
3.1 Git回顾
git简介
Git 是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目。
Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。
Git 与常用的版本控制工具 CVS, Subversion 等不同,它采用了分布式版本库的方式,不必服务端软件支持。
git与svn的区别
Git 不仅仅是版本控制系统,它也是个内容管理系统(CMS),工作管理系统等。
如果你是一个具有使用 SVN 背景的人,你需要做一定的思想转换,来适应 Git 提供的一些概念和特征。
Git 与 SVN 区别点:
- 1、Git 是分布式的,SVN 是集中式:这是 Git 和其它非分布式的版本控制系统,最核心的区别,例如 SVN,CVS 等
- **2、Git 把内容按元数据方式存储,而 SVN 是按文件:**所有的资源控制系统都是把文件的元信息隐藏在一个类似 .svn、.cvs 等的文件夹里。
- **3、Git 分支和 SVN 的分支不同:**分支在 SVN 中一点都不特别,其实它就是版本库中的另外一个目录。
- **4、Git 没有一个全局的版本号,而 SVN 有:**目前为止这是跟 SVN 相比 Git 缺少的最大的一个特征。
- **5、Git 的内容完整性要优于 SVN:**Git 的内容存储使用的是 SHA-1 哈希算法。这能确保代码内容的完整性,确保在遇到磁盘故障和网络问题时降低对版本库的破坏。
4 git基本操作
创建仓库
在项目根目录下执行如下:
git init
或者直接克隆远程仓库:
git clone url
配置签名
局部配置
git config user.name "laufing"
git config user.email "123@163.com"
全局配置
git config --global user.name "donghaiming"
git config --global user.email "haiming_dong@126.com"
提交版本
# 将一个文件增加到暂存区
git add test.txt
# 将所有文件增加到暂存区
git add ./
# 提交版本 到本地仓库
git commit -m '版本号或描述信息'
查看日志
git log
git log --oneline # 日志过长时,按行显示
git reflog # 历史操作
版本回退
git reset --hard HEAD^ # 回退到当前版本的前一个版本 HEAD^^表示回退到当前版本的前两个版本
git reset --hard HEAD`1 # 回退到当前版本的前一个版本 HEAD`5表示回退到当前版本的前5个版本
git reset --hard 版本号序号 # 回退到指定的版本
查看状态
git status
撤消未添加到暂存区的修改
git checkout -- <文件名>
撤消暂存区的修改
git reset HEAD <文件名> # 先撤消暂存区的修改
git checkout -- <文件名> # 再撤消修改
对比文件的内容
git diff HEAD -- <文件名>
对比两个版本之间某个文件的不同
git diff HEAD HEAD^ -- <文件名>
删除文件
rm <文件名>
使用git add 或者git rm提交暂存区
使用git checkout -- <文件名>撤消暂存区的修改
创建远程仓库
Git分支
查看分支
git branch -v
创建分支
# 创建分支,不切换
git branch <分支名>
# 切换分支
git switch <分支名>
or
git checkout <分支名>
# 创建分支,并切换
git checkout -b <分支名>
# 创建dev分支,并切换
git checkout -b dev
合并分支到主分支
# 1. 切换到主分支
git checkout master
# 2. 合并分支dev 到主分支
git merge dev
注意:合并分支内容需要先切换到主分支上
删除分支
# 删除一个分支
git branch -d <分支名>
# 删除dev分支
git branch -d dev
查看合并后的日志
git log --pretty=oneline
解决合并冲突
某分支和master中同一个文件都有改动时
,合并该分支到主分支时会有冲突,如下:
解决方案:
- 在master主分支上,使用vim打开冲突的文件,会看到如下内容:
- 手动删除冲突的符号,得到如下内容:
- 保存退出,esc 然后 shift + zz
- 将冲突文件增加到暂存区,git add 文件名
- 提交到本地仓库, git commit -m ‘描述’
练习:
- 初始化一个本地仓库,在主分支master上创建一个文件a.txt,添加内容为master 这个单词,最终提交;
- 创建一个分支dev并切换,然后修改a.txt文件,添加内容为branch dev, 最终提交;
- 切换到主分支,修改a.txt文件,添加内容before merge,最终提交。
- 合并dev分支到master主分支,并解决冲突问题。
最终得到如下结果:
禁用快进合并
有时将分支的更新合并到上游的master主分支时,会出现如下情况:(此时默认采用fast-forward 快进模式)
这时可以禁用快进模式:
git merge --no-ff -m '禁用快速合并的描述' dev
bug分支
软件开发中,bug就像家常便饭,有了bug就需要修复,在git中,由于分支
功能强大,所以, 每个bug都可以通过一个新的临时分支
来修复,修复后,合并分支,然后将临时分支删除。
接到一个修复bug的任务,当手头的工作还没有完成时,git中还提供了一个stash功能, 可以把当前工作状态保存起来,等修复完bug后,再恢复状态继续工作。
git stash # 保存工作现场(添加到暂存区的文件,尚未提交到本地仓库)
git stash list # 列出工作现场
git stash pop # 恢复工作现场
git 开发模式
master,负责版本发布、历史记录;
dev, 负责开发
其他分支,适当的时候合并到dev分支。