以下是使用 Python + Django 开发的蛋糕商城项目总体流程
一、项目规划与准备
- 需求分析:
- 明确蛋糕商城功能需求,如蛋糕展示、分类浏览、购物车操作、订单处理、用户注册登录及个人信息管理等,确定目标用户群体与使用场景。
- 技术选型:
- 确定选用 Python 作为编程语言,因其语法简洁、库丰富。
- 选择 Django 框架,借助其内置的数据库管理、用户认证、表单处理等强大功能用于 Web 开发。
二、项目搭建
- 安装依赖:
- 在激活的虚拟环境中,执行
pip install django
安装 Django 框架,若需连接特定数据库(如 MySQL),还需安装对应数据库驱动(如mysqlclient
)并在settings.py
中配置数据库连接信息。
- 在激活的虚拟环境中,执行
- 创建主项目 CookieShop:
- 通过命令
django-admin startproject CookieShop
生成项目框架,包含manage.py
及settings.py
、urls.py
等核心配置文件。django-admin startproject CookieShop
- 通过命令
三、创建子项目与应用
- 创建应用CookieShopCilent:
- 进入 CookieShop 项目目录,代码如下
创建子项目,其包含python manage.py startapp CookieShopCilent
models.py
、views.py
、templates
等基础文件。
- 进入 CookieShop 项目目录,代码如下
四、数据库设计与迁移
- 定义模型:
- 在
models.py
中定义蛋糕模型类,设置蛋糕的属性(如名称、口味、价格、图片等),示例代码:
- 在
# 用户表
class User(models.Model):
username = models.CharField(max_length=45, blank=True)
password = models.CharField(max_length=45, blank=True)
name = models.CharField(max_length=45, blank=True)
email = models.CharField(max_length=45, blank=True)
phone = models.CharField(max_length=11, blank=True)
address = models.CharField(max_length=45, blank=True)
isadmin = models.BooleanField(default=False)
isvalidate = models.BooleanField(default=False)
# 商品分类表
class Type(models.Model):
name = models.CharField(max_length=45, blank=True)
# 商品表
class Goods(models.Model):
name = models.CharField(max_length=45, blank=True)
cover = models.CharField(max_length=45, blank=True)
image1 = models.CharField(max_length=45, blank=True)
image2 = models.CharField(max_length=45, blank=True)
price = models.FloatField()
intro = models.CharField(max_length=300, blank=True)
stock = models.IntegerField()
type_id = models.IntegerField()
# 推荐栏表
class Recommend(models.Model):
type = models.IntegerField()
goods_id = models.IntegerField()
# 订单表
class Order(models.Model):
total = models.FloatField()
amount = models.IntegerField()
status = models.SmallIntegerField()
paytype = models.SmallIntegerField()
name = models.CharField(max_length=45, blank=True)
phone = models.CharField(max_length=45, blank=True)
address = models.CharField(max_length=45, blank=True)
datetime = model.DateTimeField()
user_id = models.IntegerField()
# 子订单表
class Orderitem(models.Model):
price = models.FloatField()
amount = models.IntegerField()
goods_id = models.IntegerField()
order_id = models.IntegerField()
# 购物车表
class ShoppingCar(models.Model):
userId = models.IntegerField()
goodsId = models.IntegerField()
goodsNumber = models.IntegerField()
- 执行数据库迁移:
- 每次定义或修改模型后,在项目根目录依次执行
python manage.py makemigrations
生成迁移文件,再执行python manage.py migrate
将迁移文件应用到数据库,创建或更新相应表结构。python manage.py makemigrations
python manage.py migrate
- 每次定义或修改模型后,在项目根目录依次执行
五、启动开发服务器
在项目根目录下的命令行终端中,执行以下命令来启动 Django 的开发服务器:
python manage.py runserver
- 启动成功后,你会在命令行终端中看到类似如下的输出信息:
Watching for file changes with StatReloader
Performing system checks...
System check identified no issues (0 silenced).
October 29, 2024 - 17:28:05
Django version 4.2.5, using settings 'your_project_name.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.
- 这表示开发服务器已经成功启动,你可以在浏览器中访问
http://127.0.0.1:8000/
来查看你的项目首页(如果已经开发了相应的视图和模板来展示首页内容)。
六、项目部分代码及页面展示
1、首页(index.html)页面代码
<!DOCTYPE html>
<html>
<head>
{# 加载static文件#}
{% load static %}
<title>首页</title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<link type="text/css" rel="stylesheet" href="{% static 'css/bootstrap.css' %}">
<link type="text/css" rel="stylesheet" href="{% static 'css/style.css' %}">
<script type="text/javascript" src="{% static 'js/jquery.min.js' %}"></script>
<script type="text/javascript" src="{% static 'js/bootstrap.min.js' %}"></script>
<script type="text/javascript" src="{% static 'js/cart.js' %}"></script>
<script type="text/javascript" src="{% static 'layer/layer.js' %}"></script>
</head>
<body>
<!--header-->
{# include关键字表示将外部的html文件导入进来 #}
{# with关键字表示后面需要传递数据 #}
{# flag表示头部中哪一个导航栏为高亮状态 1表示首页这个选项变为高亮状态#}
{# 因为头部导航栏中有各商品分类选项,当用户点击商品分类选项需要展示所有商品分类#}
{#将从数据库查询的所有商品分类数据传递给header.html#}
{% include "header.html" with flag=1 typelist=typeList %}
<!--banner-->
<div class="banner">
<!-- 根据查询的结果显示对话框 -->
{% if request.session.msg %}
<div class="alert alert-success">{{ request.session.msg }}</div>
{% endif %}
{% if request.session.failMsg %}
<div class="alert alert-danger">{{ request.session.failMsg }}</div>
{% endif %}
<div class="container">
<div id="carousel-example-generic" class="carousel slide" data-ride="carousel">
<!-- Indicators -->
<ol class="carousel-indicators" id="olnum">
<!-- 根据条幅中的商品数量生成小圆点 -->
{% for g in scroll %}
<!-- 判断当前循环是否是第一次循环 -->
{% if forloop.first %}
<li data-target="#carousel-example-generic"
data-slide-to="0" class="active"></li>
{% else %}
<li data-target="#carousel-example-generic"
data-slide-to="{{ forloop.counter0 }}"></li>
{% endif %}
{% endfor %}
</ol>
<!-- Wrapper for slides -->
<div class="carousel-inner" role="listbox" id="lunbotu" style="width: 1242px; height: 432px;">
{% for g in scroll %}
{% if forloop.first %}
<div class="item active">
<h2 class="hdng"><a href="/goods_detail/?id={{ g.id}}">{{ g.name }}</a><span></span></h2>
<p>今日精选推荐</p>
<a class="banner_a" href="/goods_buy/?id={{ g.id}}&url=index">加入购物车</a>
<div class="banner-text">
<a href="/goods_detail/?id={{ g.id }}">
<img src="{% static g.cover %}" alt="{{g.name }}" width="350" height="350">
</a>
</div>
</div>
{% else %}
<div class="item">
<h2 class="hdng"><a href="/goods_detail/?id={{ g.id}}">{{ g.name }}</a><span></span></h2>
<p>今日精选推荐</p>
<a class="banner_a" href="/goods_buy/?id={{ g.id}}&url=index">加入购物车</a>
<div class="banner-text">
<a href="/goods_detail/?id={{ g.id }}">
<img src="{% static g.cover %}" alt="{{g.name }}" width="350" height="350">
</a>
</div>
</div>
{% endif %}
{% endfor %}
</div>
</div>
</div>
</div>
<!--//banner-->
<div class="subscribe2"></div>
<!--gallery-->
<div class="gallery">
<div class="container">
<div class="alert alert-danger">热销推荐</div>
<div class="gallery-grids">
{% for g in hotList %}
<div class="col-md-4 gallery-grid glry-two">
<a href="/goods_detail/?id={{ g.id }}">
<img src="{% static g.cover %}" class="img-responsive" alt="{{ g.name }}" width="350"
height="350"/>
</a>
<div class="gallery-info galrr-info-two">
<p>
<span class="glyphicon glyphicon-eye-open" aria hidden="true"></span>
<a href="/goods_detail/?id={{ g.id }}">查看详情</a>
</p>
<a class="shop" href="/goods_buy/?id={{ g.id}}&url=index">加入购物车</a>
<div class="clearfix"></div>
</div>
<div class="galy-info">
<p>{{ g.typeName }} > {{ g.name }}</p>
<div class="galry">
<div class="prices">
<h5 class="item_price">¥ {{ g.price }}</h5>
</div>
<div class="clearfix"></div>
</div>
</div>
</div>
{% endfor %}
</div>
<div class="clearfix"></div>
<div class="alert alert-info">新品推荐</div>
<div class="gallery-grids">
{% for g in newList %}
<div class="col-md-3 gallery-grid ">
<a href="/goods_detail/?id={{ g.id }}">
<img src="{% static g.cover %}" class="img-responsive" alt="{{ g.name }}"/>
</a>
<div class="gallery-info">
<p>
<span class="glyphicon glyphicon-eye-open" aria hidden="true"></span>
<a href="/goods_detail/?id={{ g.id }}">查看详情</a>
</p>
<a class="shop" href="/goods_buy/?id={{ g.id}}&url=index">加入购物车</a>
<div class="clearfix"></div>
</div>
<div class="galy-info">
<p>{{ g.typeName }} > {{ g.name }}</p>
<div class="galry">
<div class="prices">
<h5 class="item_price">¥ {{ g.price }}</h5>
</div>
<div class="clearfix"></div>
</div>
</div>
</div>
{% endfor %}
</div>
</div>
</div>
<!--//gallery-->
<!--subscribe-->
<div class="subscribe"></div>
<!--//subscribe-->
<!--footer-->
</body>
</html>
2、首页页面展示
3、登入后的页面
七、管理员(admin)端