当前位置: 首页 > news >正文

Flask简介与安装以及实现一个糕点店的简单流程

目录

1. Flask简介

1.1 Flask的核心特点

1.2 Flask的基本结构

1.3 Flask的常见用法

1.3.1 创建Flask应用

1.3.2 路由和视图函数

1.3.3 动态URL参数

1.3.4 使用模板

1.4 Flask的优点

1.5 总结

2. Flask 环境创建

2.1 创建虚拟环境

2.2 激活虚拟环境

1.3 安装Flask

1.4 创建Flask应用

1.5 运行Flask应用

1.6 管理虚拟环境依赖

1.7 退出虚拟环境

1.8 总结

3. Flask 开发糕点网站的完整基础环境开发流程

3.1 基础开发环境

3.2 创建文件夹,建立环境

3.2.1 创建文件夹Flask,在Flask下面创建cake_shop

3.3.2 建立虚拟环境

3.3 安装必要的 Python 库

3.4 配置数据库连接

3.4.1 配置 MySQL

3.4.2 配置 Flask 与 MySQL 的连接

3.5 创建 Flask 应用结构

3.5.1 创建必要文件

3.6 配置 Flask 与数据库连接检查

3.6.1 配置文件 (config.py)

3.6.2 在 app.py 进行数据库连接测试

3.6.3 测试数据库连接

3.7 初始化数据库迁移

3.8 创建第一个页面

3.8.1 创建首页视图

3.8.2 配置蓝图

3.8.3 创建模板文件

3.8.4 启动 Flask 应用

3.8.5 测试首页

4.开发后续思路

4.1 开发流程与步骤

4.2 最终目录结构

4.3  开发顺序建议


 

1. Flask简介

1.1 Flask的核心特点

(1)轻量级
Flask本身非常简洁,没有复杂的结构和约定,开发者可以根据项目需要自由选择工具和库。这让Flask成为快速开发的理想选择。

(2)灵活性
Flask不强制使用特定的数据库、模板引擎、表单库或其他工具。你可以根据项目需求选择不同的扩展和工具。

(3)内置开发服务器和调试器
Flask自带了一个开发服务器,可以在本地开发时快速查看应用效果。此外,它也提供了调试工具,能在应用出现错误时提供详细的错误信息。

(4)Jinja2模板引擎
Flask集成了Jinja2模板引擎,使得你可以将动态内容与HTML代码分离,方便管理和渲染网页。

(5)请求和响应
Flask提供了丰富的功能来处理HTTP请求,包括表单提交、URL参数、JSON数据等。它还提供了响应功能,可以自定义返回内容(如HTML、JSON、文件等)。

(6)扩展性
虽然Flask是一个微框架,但它有丰富的扩展库支持,可以通过安装第三方库来实现数据库连接、用户认证、表单验证等功能。

1.2 Flask的基本结构

一个最简单的Flask应用通常包含以下几个部分:

  1. Flask实例:用于创建Flask应用的对象。
  2. 路由:定义URL路径和视图函数之间的关系。
  3. 视图函数:处理特定路由的请求,并返回响应。
  4. 模板:用来渲染HTML页面的模板引擎。

1.3 Flask的常见用法

1.3.1 创建Flask应用

from flask import Flaskapp = Flask(__name__)@app.route('/')
def hello_world():return 'Hello, World!'if __name__ == '__main__':app.run(debug=True)

1.3.2 路由和视图函数

Flask通过@app.route()装饰器来定义路由。例如:

@app.route('/about')
def about():return "This is the About page."

1.3.3 动态URL参数

你可以在URL中使用动态参数,例如:

@app.route('/user/<username>')
def user_profile(username):return f"Hello, {username}!"

1.3.4 使用模板

Flask集成了Jinja2模板引擎,可以将动态内容与HTML分离:

<!-- templates/hello.html -->
<!DOCTYPE html>
<html><head><title>Hello</title></head><body><h1>Hello, {{ name }}!</h1></body>
</html>

在视图函数中渲染模板:

from flask import render_template@app.route('/hello/<name>')
def hello(name):return render_template('hello.html', name=name)

 

1.4 Flask的优点

  • 简洁易用:Flask的代码结构简单,入门容易。
  • 灵活性高:开发者可以选择任何想用的库和工具。
  • 广泛的社区支持:Flask有大量的文档、教程以及开源扩展,可以方便地进行项目开发。

1.5 总结

Flask是一个非常适合入门的Web框架,提供了灵活的功能和简单的API。如果你希望开发小型应用,或者想快速搭建一个Web原型,Flask无疑是一个很好的选择。随着项目的复杂性增加,你还可以利用Flask的扩展来增加所需的功能。

 

2. Flask 环境创建

2.1 创建虚拟环境

首先,确保你的系统中已安装pythonpip。然后,进入你的项目目录,打开终端并输入以下命令来创建一个虚拟环境。

对于Windows:

python -m venv venv

对于Mac/Linux:

python3 -m venv venv

这个命令会在你的项目文件夹中创建一个名为venv的目录,用于存放虚拟环境的所有文件。

2.2 激活虚拟环境

对于Windows:

.\venv\Scripts\activate

对于Mac/Linux:

source venv/bin/activate

激活后,你应该会看到命令行前面有一个(venv)的标记,表示虚拟环境已成功激活。

1.3 安装Flask

在虚拟环境中,使用pip安装Flask:

pip install flask

1.4 创建Flask应用

按照之前提到的步骤,创建一个Flask应用。比如,创建一个名为app.py的文件,并编写以下内容:

from flask import Flaskapp = Flask(__name__)@app.route('/')
def hello_world():return 'Hello, World!'if __name__ == '__main__':app.run(debug=True)

1.5 运行Flask应用

在虚拟环境激活的情况下,运行你的Flask应用:

python app.py

你应该可以在浏览器中访问http://127.0.0.1:5000/看到Flask应用的欢迎信息。

1.6 管理虚拟环境依赖

当你在虚拟环境中安装了其他依赖包时,可以使用pip freeze命令将它们导出到一个requirements.txt文件中,这样其他开发者或者你自己在不同的机器上也能轻松安装相同的依赖:

pip freeze > requirements.txt

其他开发者可以通过以下命令来安装所有依赖:

pip install -r requirements.txt

1.7 退出虚拟环境

当你完成开发时,可以通过以下命令退出虚拟环境:

deactivate

这会返回到系统的Python环境。

1.8 总结

  1. 创建虚拟环境:python -m venv venv
  2. 激活虚拟环境:source venv/bin/activate (Mac/Linux) 或 .\venv\Scripts\activate (Windows)
  3. 安装Flask:pip install flask
  4. 运行Flask应用:python app.py
  5. 管理依赖:pip freeze > requirements.txt

 

3. Flask 开发糕点网站的完整基础环境开发流程

3.1 基础开发环境

开发软件:visual studio code

python:3.12.3

数据库:mysql 8.0

3.2 创建文件夹,建立环境

3.2.1 创建文件夹Flask,在Flask下面创建cake_shop

3.3.2 建立虚拟环境

创建虚拟环境

在您的项目目录中创建一个虚拟环境:

cd D:\projects\Flask\cake_shop # 进入您的项目目录

python -m venv venv # 创建虚拟环境

激活虚拟环境:

Windows:

.\venv\Scripts\activate

Mac/Linux:

source venv/bin/activate

3.3 安装必要的 Python 库

在虚拟环境中安装 Flask 和 MySQL 相关库:

pip install flask flask-mysqldb flask-sqlalchemy flask-migrate

  • Flask-MySQLdb:这是一个用于 Flask 与 MySQL 数据库连接的库。它封装了 MySQLdb 的接口,使得你能够在 Flask 中直接操作 MySQL 数据库。通过它,你可以执行 SQL 查询,增、删、改、查数据库内容。

  • Flask-SQLAlchemy:Flask-SQLAlchemy 是 Flask 与 SQLAlchemy 的集成扩展。SQLAlchemy 是 Python 中非常流行的 ORM(对象关系映射)工具,它简化了数据库交互,允许你通过 Python 类来操作数据库,而无需直接写 SQL 查询。Flask-SQLAlchemy 提供了对 SQLAlchemy 的简化支持,使得与数据库的交互更加方便。

  • Flask-Migrate:Flask-Migrate 是 Flask 的一个数据库迁移库,基于 Alembic。它用于数据库结构变更时进行版本控制,简化数据库迁移的过程。当你修改了数据库模型之后,Flask-Migrate 可以帮助你生成迁移脚本,并应用到数据库中,以保持数据库结构与代码的一致性。

3.4 配置数据库连接

3.4.1 配置 MySQL

首先,确保 MySQL 数据库中已创建数据库:

CREATE DATABASE cake_shop;

表代码参考:

-- 用户表(包含头像字段)
CREATE TABLE users (id INT AUTO_INCREMENT PRIMARY KEY,        -- 主键username VARCHAR(50) NOT NULL UNIQUE,     -- 用户名,唯一password VARCHAR(255) NOT NULL,           -- 密码(加密存储)email VARCHAR(100) NOT NULL UNIQUE,       -- 邮箱avatar_url VARCHAR(255),                  -- 用户头像 URLrole ENUM('admin', 'user') DEFAULT 'user',-- 用户角色(管理员或普通用户)created_at DATETIME DEFAULT CURRENT_TIMESTAMP -- 创建时间
);-- 糕点分类表
CREATE TABLE categories (id INT AUTO_INCREMENT PRIMARY KEY,        -- 主键name VARCHAR(50) NOT NULL UNIQUE,         -- 分类名称description TEXT                          -- 分类描述
);-- 糕点表
CREATE TABLE products (id INT AUTO_INCREMENT PRIMARY KEY,        -- 主键name VARCHAR(100) NOT NULL,               -- 糕点名称description TEXT,                         -- 描述price DECIMAL(10, 2) NOT NULL,            -- 单价stock INT NOT NULL DEFAULT 0,             -- 库存数量category_id INT NOT NULL,                 -- 分类 ID(外键)created_at DATETIME DEFAULT CURRENT_TIMESTAMP, -- 创建时间FOREIGN KEY (category_id) REFERENCES categories(id) -- 分类外键
);-- 产品图片表(支持多张图片上传)
CREATE TABLE product_images (id INT AUTO_INCREMENT PRIMARY KEY,        -- 主键product_id INT NOT NULL,                  -- 商品 ID(外键)image_url VARCHAR(255) NOT NULL,          -- 图片 URLcreated_at DATETIME DEFAULT CURRENT_TIMESTAMP, -- 创建时间FOREIGN KEY (product_id) REFERENCES products(id) -- 商品外键
);-- 购物车表
CREATE TABLE cart_items (id INT AUTO_INCREMENT PRIMARY KEY,        -- 主键user_id INT NOT NULL,                     -- 用户 ID(外键)product_id INT NOT NULL,                  -- 商品 ID(外键)quantity INT NOT NULL DEFAULT 1,          -- 数量added_at DATETIME DEFAULT CURRENT_TIMESTAMP, -- 添加时间FOREIGN KEY (user_id) REFERENCES users(id),   -- 用户外键FOREIGN KEY (product_id) REFERENCES products(id) -- 商品外键
);-- 订单表
CREATE TABLE orders (id INT AUTO_INCREMENT PRIMARY KEY,        -- 主键user_id INT NOT NULL,                     -- 用户 ID(外键)total_price DECIMAL(10, 2) NOT NULL,      -- 总价status ENUM('pending', 'completed', 'canceled') DEFAULT 'pending', -- 状态created_at DATETIME DEFAULT CURRENT_TIMESTAMP, -- 创建时间FOREIGN KEY (user_id) REFERENCES users(id) -- 用户外键
);-- 订单详情表
CREATE TABLE order_details (id INT AUTO_INCREMENT PRIMARY KEY,        -- 主键order_id INT NOT NULL,                    -- 订单 ID(外键)product_id INT NOT NULL,                  -- 商品 ID(外键)quantity INT NOT NULL,                    -- 数量price DECIMAL(10, 2) NOT NULL,            -- 单价FOREIGN KEY (order_id) REFERENCES orders(id), -- 订单外键FOREIGN KEY (product_id) REFERENCES products(id) -- 商品外键
);-- 评价表
CREATE TABLE reviews (id INT AUTO_INCREMENT PRIMARY KEY,        -- 主键product_id INT NOT NULL,                  -- 商品 ID(外键)user_id INT NOT NULL,                     -- 用户 ID(外键)rating INT NOT NULL CHECK (rating BETWEEN 1 AND 5), -- 评分(1-5 星)comment TEXT,                             -- 评价内容created_at DATETIME DEFAULT CURRENT_TIMESTAMP, -- 创建时间FOREIGN KEY (product_id) REFERENCES products(id), -- 商品外键FOREIGN KEY (user_id) REFERENCES users(id) -- 用户外键
);-- 优惠券表
CREATE TABLE coupons (id INT AUTO_INCREMENT PRIMARY KEY,        -- 主键code VARCHAR(20) NOT NULL UNIQUE,         -- 优惠码discount DECIMAL(5, 2) NOT NULL,          -- 折扣比例(如 0.10 表示 10%)expires_at DATETIME NOT NULL              -- 到期时间
);

3.4.2 配置 Flask 与 MySQL 的连接

在项目中创建一个 config.py 配置文件,并进行配置:

# config.pySQLALCHEMY_DATABASE_URI = 'mysql://your_mysql_user:your_mysql_password@localhost/cake_shop'
SQLALCHEMY_TRACK_MODIFICATIONS = False
SECRET_KEY = 'your_secret_key'

请将 your_mysql_useryour_mysql_password 替换为您的 MySQL 用户名和密码。

SECRET_KEY

Flask 使用 SECRET_KEY 来对 session 数据进行加密。Flask 默认使用一个加密机制将数据存储在浏览器的 cookie 中(即 session)。没有这个密钥,用户的数据将无法正确加密和解密,导致安全风险。

如何生成 SECRET_KEY

  • 手动生成: 您可以使用任何随机生成的字符串(建议使用 32 字节(或更长)长度的 随机字符串,包含字母、数字和符号,以增强安全性。),例如:

    SECRET_KEY = 's3cr3t_r@nd0m_k3y_1234'

  • 使用 Python 生成随机字符串: 如果您希望生成一个更加复杂且随机的密钥,可以使用 Python 的 secrets 库:

    import secrets print(secrets.token_hex(16)) # 生成一个 32 字节的随机密钥

    运行这段代码会生成一个类似于下面的密钥:

    b9f4f8d6c8e9b8a1f7d9f2a3b52d6d56

 

3.5 创建 Flask 应用结构

创建以下项目结构与文件说明:

cake_shop/
├── app/
│   ├── __init__.py         # 初始化 Flask 应用
│   ├── models.py           # 数据库模型
│   ├── routes/             # 路由文件夹
│   │   ├── __init__.py
│   │   ├── auth.py         # 用户认证
│   │   └── products.py     # 商品管理
│   ├── templates/          # HTML 模板文件
│   └── static/             # 静态文件(CSS、JS、图片)
├── config.py               # 配置文件
├── requirements.txt        # 项目依赖
├── run.py                  # 启动文件
└── README.md               # 项目说明,不上传github不用创建

3.5.1 创建必要文件

在项目目录中,手动创建目录和文件(命令创建不识别touch,需要手动创建)。

例如:

mkdir app
mkdir app/routes
mkdir app/templates
mkdir app/static
touch app/__init__.py
touch app/models.py
touch app/routes/__init__.py
touch app/routes/auth.py
touch app/routes/products.py
touch run.py
touch config.py
touch requirements.txt

3.6 配置 Flask 与数据库连接检查

3.6.1 配置文件 (config.py)

首先,在config.py 文件,用于存放数据库配置、密钥配置等信息。

# config.py# 配置数据库 URI,连接 MySQL 数据库
SQLALCHEMY_DATABASE_URI = 'mysql://your_mysql_user:your_mysql_password@localhost/cake_shop'# 关闭 Flask SQLAlchemy 的修改跟踪功能,减少内存消耗
SQLALCHEMY_TRACK_MODIFICATIONS = False# 设置一个随机密钥用于加密session和CSRF令牌
SECRET_KEY = 'your_secret_key'  # 这里的密钥可以手动生成一个随机的字符串

说明:

  • SQLALCHEMY_DATABASE_URI: 配置连接 MySQL 数据库,替换 your_mysql_useryour_mysql_password 为您的 MySQL 用户和密码。
  • SQLALCHEMY_TRACK_MODIFICATIONS: 设置为 False 以禁用 Flask SQLAlchemy 的修改跟踪功能,这样可以节省内存。
  • SECRET_KEY: Flask 使用这个密钥来对 session 数据和 CSRF 令牌进行加密,确保安全性。您可以使用手动生成的随机字符串(如前面提到的使用 secrets 库生成的密钥)。
  • 如何生成 SECRET_KEY
    • 使用 Python 生成随机字符串: 如果您希望生成一个更加复杂且随机的密钥,可以使用 Python 的 secrets 库:

      import secrets print(secrets.token_hex(16)) # 生成一个 32 字节的随机密钥

      运行这段代码会生成一个类似于下面的密钥:

      b9f4f8d6c8e9b8a1f7d9f2a3b52d6d56

    • 手动生成: 您可以使用任何随机生成的字符串(建议使用 32 字节(或更长)长度的 随机字符串,包含字母、数字和符号,以增强安全性。),例如:

      SECRET_KEY = 's3cr3t_r@nd0m_k3y_1234'

3.6.2 在 app.py 进行数据库连接测试

在run.py 文件,内容如下:

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from config import SQLALCHEMY_DATABASE_URI, SQLALCHEMY_TRACK_MODIFICATIONS# 初始化 Flask 应用
app = Flask(__name__)# 加载配置
app.config['SQLALCHEMY_DATABASE_URI'] = SQLALCHEMY_DATABASE_URI
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = SQLALCHEMY_TRACK_MODIFICATIONS# 初始化数据库对象
db = SQLAlchemy(app)# 测试数据库连接
@app.route('/test-db')
def test_db_connection():try:# 尝试连接数据库,查询数据库中的所有表result = db.session.execute('SHOW TABLES;')tables = result.fetchall()return f"Database connected successfully! Tables: {tables}"except Exception as e:return f"Error connecting to database: {e}"if __name__ == '__main__':app.run(debug=True)

3.6.3 测试数据库连接

(1) 启动 Flask 应用

在命令行中运行以下命令启动 Flask 应用:

python app.py

(2) 测试数据库连接

打开浏览器并访问 http://127.0.0.1:5000/test-db,查看是否能够成功连接到数据库并列出数据库中的表。如果数据库连接成功,您会看到类似以下内容:

Database connected successfully! Tables: [('cart_items',), ('categories',), ('coupons',), ('order_details',), ('orders',), ('product_images',), ('products',), ('reviews',), ('users',)]

3.7 初始化数据库迁移

Flask-Migrate 用于数据库结构迁移,首先初始化迁移文件:

flask db init
flask db migrate -m "Initial migration"
flask db upgrade

3.8 创建第一个页面

在创建并配置完数据库连接后,接下来我们可以开发应用的第一个页面。这一部分将指导您如何创建一个简单的首页(例如 home,更多时候是index 页面),并通过 Flask 展示。

3.8.1 创建首页视图

(1)创建 routes 路由文件:

app/routes/ 文件夹中,创建一个新的 Python 文件来定义首页的视图,命名为 home.py

app/routes/home.py 中,我们将定义一个路由,返回一个简单的欢迎页面。

from flask import Blueprint, render_template# 创建蓝图
bp = Blueprint('home', __name__)# 定义主页视图
@bp.route('/')
def home():return render_template('home.html')  # 渲染 home.html 模板

3.8.2 配置蓝图

app/__init__.py 中注册蓝图:

app/__init__.py 文件中,您需要注册 home 蓝图。打开并修改 app/__init__.py,加入对 home 蓝图的注册。

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_migrate import Migratedb = SQLAlchemy()
migrate = Migrate()def create_app(config_class='config'):app = Flask(__name__)app.config.from_object(config_class)db.init_app(app)migrate.init_app(app, db)# 注册蓝图from app.routes.home import bp as home_bpapp.register_blueprint(home_bp)return app

 

如果有其他蓝图:

    # 注册各个蓝图from app.routes.home import bp as home_bpfrom app.routes.auth import bp as auth_bpfrom app.routes.products import bp as products_bpapp.register_blueprint(home_bp)  # 注册首页和注册功能app.register_blueprint(auth_bp)  # 注册用户认证功能app.register_blueprint(products_bp)  # 注册商品功能

3.8.3 创建模板文件

app/templates/ 文件夹中创建 home.html

home.html 中,我们可以添加简单的 HTML 代码来展示页面内容。

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Welcome to Cake Shop</title>
</head>
<body><h1>Welcome to the Cake Shop!</h1><p>Your favorite place for delicious cakes and pastries.</p>
</body>
</html>

3.8.4 启动 Flask 应用

重新修改 run.py文件

from app import create_appapp = create_app()if __name__ == '__main__':app.run(debug=True)

3.8.5 测试首页

(1)启动 Flask 应用:

运行以下命令来启动 Flask 应用:

python run.py

(2)访问首页:

打开浏览器并访问 http://127.0.0.1:5000/,您应该会看到显示“Welcome to the Cake Shop!”的首页。

4.开发后续思路

4.1 开发流程与步骤

(1)用户模块

  • 功能:实现用户的注册、登录、角色管理、头像管理等。
    • 用户模型:创建数据库模型,保存用户信息(用户名、密码、邮箱、头像等)。
    • 注册和登录功能:处理用户的注册和登录请求,支持用户名、密码验证。
    • 用户会话管理:用户登录后保存其信息(例如,使用session进行会话管理)。
    • 头像上传:支持用户修改头像并上传。

(2)商品模块

  • 功能:实现商品展示、分类、库存管理等功能。
    • 商品模型:创建数据库模型,存储商品信息(名称、描述、价格、库存等)。
    • 商品分类:根据类别展示商品,支持添加、删除和编辑商品分类。
    • 商品展示:展示商品列表、商品详情页等。
    • 商品图片管理:支持商品图片的上传和展示。

(3)购物车模块

  • 功能:实现商品加入购物车、查看购物车、删除购物车商品等功能。
    • 购物车模型:创建购物车项模型,存储用户ID、商品ID和商品数量。
    • 添加到购物车:用户可以将商品添加到购物车,修改数量等。
    • 查看购物车:显示用户已添加到购物车的所有商品。
    • 删除购物车商品:用户可以删除购物车中的商品。

(4)订单模块

  • 功能:实现订单生成、支付、查看历史订单等功能。
    • 订单模型:存储订单信息,包括订单ID、用户ID、总价、状态等。
    • 订单详情:每个订单包含详细的商品信息。
    • 订单状态管理:管理订单的状态(待付款、已完成、已取消等)。
    • 支付功能:实现订单的支付功能(可以模拟支付,或集成第三方支付平台)。

(5)评价模块

  • 功能:用户可以对商品进行评价,留下评分和评论。
    • 评价模型:存储用户评价信息,包括商品ID、评分、评论内容等。
    • 查看评价:展示商品的所有用户评价,按时间、评分等排序。
    • 提交评价:用户在订单完成后可以对购买的商品进行评价。

(6)优惠券模块

  • 功能:为用户提供折扣优惠,用户可在结算时使用优惠券。
    • 优惠券模型:存储优惠券信息(代码、折扣比例、过期时间等)。
    • 领取优惠券:用户可以领取优惠券,系统会检查优惠券是否过期。
    • 使用优惠券:在结算时,用户可以选择使用优惠券来减免部分费用。

4.2 最终目录结构

flask_cake_store/

├── app.py               # Flask应用入口
├── config.py            # 配置文件(数据库连接、密钥等)
├── models.py            # 数据库模型(包括User, Product, Order等)
├── routes.py            # 路由和视图函数(处理请求逻辑)
├── templates/           # HTML模板文件
│   ├── home.html        # 首页模板,展示商品列表
│   ├── login.html       # 用户登录页面
│   ├── product_list.html# 商品列表页面
│   ├── product_detail.html # 商品详情页面
│   ├── cart.html        # 购物车页面
│   ├── order.html       # 订单页面
│   └── review.html      # 商品评价页面
└── static/              # 静态文件(CSS、JS、图片等)
    ├── styles.css       # CSS样式文件
    └── images/          # 图片文件夹(包含商品图片、用户头像等)
 

4.3  开发顺序建议

  1. 用户模块:先实现用户的基本功能(注册、登录、头像管理等)。
  2. 商品模块:实现商品展示、分类、库存管理等功能。
  3. 购物车模块:实现购物车的添加、删除和查看功能。
  4. 订单模块:实现订单生成、查看和支付功能。
  5. 评价模块:实现商品评价和查看评价功能。
  6. 优惠券模块:实现优惠券的管理和使用功能。

 

相关文章:

Flask简介与安装以及实现一个糕点店的简单流程

目录 1. Flask简介 1.1 Flask的核心特点 1.2 Flask的基本结构 1.3 Flask的常见用法 1.3.1 创建Flask应用 1.3.2 路由和视图函数 1.3.3 动态URL参数 1.3.4 使用模板 1.4 Flask的优点 1.5 总结 2. Flask 环境创建 2.1 创建虚拟环境 2.2 激活虚拟环境 1.3 安装Flask…...

Ubuntu22.04安装paddle GPU版本

文章目录 确立版本安装CUDA与CUDNN安装paddle 确立版本 查看官网信息&#xff0c;确立服务版本&#xff1a;https://www.paddlepaddle.org.cn/documentation/docs/zh/2.6/install/pip/linux-pip.html 安装CUDA与CUDNN 通过nvidia-smi查看当前显卡驱动版本&#xff1a; 通过…...

读《SQL经典实例》学数据库(系列一)

目录 友情提醒第一章、数据库简述1.1&#xff09;数据库简述1.2&#xff09;常见的数据库软件1.3&#xff09;MySQL数据库安装 第二章、SQL语句分类2.1)操作数据仓库/数据表&#xff1a;DDL2.1.1&#xff09;创建数据仓库/数据表2.1.2&#xff09;删除数据仓库/数据表2.1.3&…...

Android系统开发(一):AOSP 架构全解析:开源拥抱安卓未来

引言 当我们手握智能手机&#xff0c;流畅地滑动屏幕、切换应用、欣赏动画时&#xff0c;背后其实藏着一套庞大且精密的开源系统——Android AOSP&#xff08;Android Open Source Project&#xff09;。这套系统不仅是所有安卓设备的根基&#xff0c;也是系统开发者的终极 pl…...

git系列之revert回滚

1. Git 使用cherry-pick“摘樱桃” step 1&#xff1a; 本地切到远程分支&#xff0c;对齐要对齐的base分支&#xff0c;举例子 localmap git pull git reset --hard localmap 对应的commit idstep 2&#xff1a; 执行cherry-pick命令 git cherry-pick abc123这样就会将远程…...

【统计的思想】假设检验(一)

假设检验是统计学里的重要方法&#xff0c;同时也是一种“在理想与现实之间观察求索”的测试活动。假设检验从概率的角度去考察理想与现实之间的关系&#xff0c;籍此来缓解测试可信性问题。 我们先来看一个例子。民航旅客服务系统&#xff0c;简称PSS系统&#xff0c;有一种业…...

Linux 管道操作

Linux 管道操作 在 Linux 中&#xff0c;管道&#xff08;Pipe&#xff09;是一个非常强大且常用的功能&#xff0c;它允许将一个命令的输出直接传递给另一个命令作为输入&#xff0c;从而能够高效地处理和分析数据。管道在多个命令之间建立数据流&#xff0c;减少了文件的读写…...

Rust 数据类型详解

一、标量类型&#xff08;Scalar Types&#xff09; 标量类型代表一个单独的值。Rust 中有四大基本标量类型&#xff1a;整数&#xff08;integer&#xff09;、浮点数&#xff08;floating-point number&#xff09;、布尔&#xff08;boolean&#xff09;和字符&#xff08;…...

(十四)WebGL纹理坐标初识

纹理坐标是 WebGL 中将 2D 图像&#xff08;纹理&#xff09;应用到 3D 物体表面的重要概念。在 WebGL 中&#xff0c;纹理坐标通常使用一个二维坐标系&#xff0c;称为 uv 坐标&#xff0c;它们决定了纹理图像如何映射到几何体上。理解纹理坐标的核心就是明白它们如何将二维纹…...

青少年CTF练习平台 EasyMD5解题思路

题目 EasyMD5 PHP弱类型/弱等于的判断 翻译 上传之后网页提示&#xff1a;Not a PDF! angry!!! get out from my page 修改文件后缀为pdf 再次上传&#xff0c;答案出来了 s878926199a s155964671a 成功获取flag...

二叉搜索树(TreeMapTreeSet)

文章目录 1.概念2.二叉搜索树的底层代码实现(1)首先构建二叉树(2)实现插入功能&#xff1b;(3)实现查找(4)删除&#xff08;重点&#xff09; 3.TreeMap 1.概念 TreeMap&TreeSet都是有序的集合都是基于二叉搜索树来实现的 二叉搜索树&#xff1a;是一种特殊的二叉树 若左子…...

鸿蒙动态路由实现方案

背景 随着CSDN 鸿蒙APP 业务功能的增加&#xff0c;以及为了与iOS、Android 端统一页面跳转路由&#xff0c;以及动态下发路由链接&#xff0c;路由重定向等功能。鸿蒙动态路由方案的实现迫在眉睫。 实现方案 鸿蒙版本动态路由的实现原理&#xff0c;类似于 iOS与Android的实…...

matlab实现一个雷达信号处理的程序,涉及到对原始图像的模拟、加权、加噪以及通过迭代算法对图像进行恢复和优化处理

clc clear close all load scene3.mat %加载原始图像,自己设计 设计为一个300*400的矩阵 300是距离向长度,400是方位向长度 Map_ori = scene3; [M,N_K] = size(Map_ori);figure imagesc(scene3) v = 100; %机载速度,单位m/s bandwidth = 30*1e6; …...

设置 Git 默认推送不需要输入账号和密码【Ubuntu、SSH】

如何设置 Git 默认推送不需要输入账号和密码 在使用 Git 管理代码时&#xff0c;许多开发者会遇到每次推送&#xff08;push&#xff09;或拉取&#xff08;fetch&#xff09;代码时都需要输入 GitHub 或 GitLab 等远程仓库的账号和密码的情况。虽然设置了用户名和电子邮件信息…...

【深度学习】Pytorch:导入导出模型参数

PyTorch 是深度学习领域中广泛使用的框架&#xff0c;熟练掌握其模型参数的管理对于模型训练、推理以及部署非常重要。本文将全面讲解 PyTorch 中关于模型参数的操作&#xff0c;包括如何导出、导入以及如何下载模型参数。 什么是模型参数 模型参数是指深度学习模型中需要通过…...

ABP - 缓存模块(1)

ABP - 缓存模块&#xff08;1&#xff09; 1. 与 .NET Core 缓存的关系和差异2. Abp 缓存的使用2.1 常规使用2.2 非字符串类型的 Key2.3 批量操作 3. 额外功能 1. 与 .NET Core 缓存的关系和差异 ABP 框架中的缓存系统核心包是 Volo.Abp.Caching &#xff0c;而对于分布式缓存…...

【unity进阶篇】unity如何实现跨平台及unity最优最小包体打包方式(.NET、Mono和IL2CPP知识介绍)

考虑到每个人基础可能不一样&#xff0c;且并不是所有人都有同时做2D、3D开发的需求&#xff0c;所以我把 【零基础入门unity游戏开发】 分为成了C#篇、unity通用篇、unity3D篇、unity2D篇。 【C#篇】&#xff1a;主要讲解C#的基础语法&#xff0c;包括变量、数据类型、运算符、…...

5-1 创建和打包AXI Interface IP

创建和打包AXI Interface IP的前流程和后流程 step 1 &#xff1a; 选择类型 1&#xff1a; 将当前的工程打包成IP 2&#xff1a; 将当前的BD工程打包成IP 3&#xff1a; 将指定的源码打包成IP 4&#xff1a; 创建一个新的AXI 接口IP 其中3和4是比较常用的&#xff0c;本次…...

【C++】如何从源代码编译红色警戒2地图编辑器

【C】如何从源代码编译红色警戒2地图编辑器 操作视频视频中的代码不需要下载三方库&#xff0c;已经包含三方库。 一、运行效果&#xff1a;二、源代码来源及编程语言&#xff1a;三、环境搭建&#xff1a;安装红警2安装VS2022下载代码&#xff0c;源代码其实不太多&#xff0c…...

HRNet,Deep High-Resolution Representation Learning for Visual Recognition解读

论文、代码和ppt地址&#xff1a;HRNet。代码地址: hrnet 本文通过paper解读和代码实例以及onnx模型的分析&#xff0c;来说明hrnet模型。 摘要——高分辨率表征对于诸如人体姿态估计、语义分割和目标检测等对位置敏感的视觉问题至关重要。现有的最先进框架首先通过一个子网&…...

Rust Actix Web 项目实战教程 mysql redis swagger:构建用户管理系统

Rust Actix Web 项目实战教程&#xff1a;构建用户管理系统 项目概述 本教程将指导你使用 Rust 和 Actix Web 构建一个完整的用户管理系统&#xff0c;包括数据库交互、Redis 缓存和 Swagger UI 文档。 技术栈 Rust 编程语言Actix Web 框架SQLx (MySQL 数据库)Redis 缓存Uto…...

# 爬楼梯问题:常见数列的解法总结

爬楼梯问题&#xff1a;常见数列的解法总结 在编程中&#xff0c;爬楼梯问题&#xff08;Climbing Stairs Problem&#xff09;是一个经典的动态规划问题&#xff0c;常常作为入门学习动态规划和递推的重要例题。这个问题看似简单&#xff0c;但背后包含了多种解决方式&#x…...

速通Docker === 常用命令

目录 Docker命令 镜像操作 容器操作 基础操作 启动参数 容器内部操作 打包成指定文件 发布镜像 总结 镜像操作 容器操作 启动容器参数 容器内部操作 打包镜像 启动指定镜像的容器 发布镜像 Docker命令 启动一个nginx,并将它的首页改为自己的页面&#xff0c;发布…...

AWS S3 跨账户访问 Cross Account Access

进入S3对应的存储桶&#xff0c;上面选项选权限&#xff0c;存储桶策略 -- 编辑&#xff0c;输入对应的policy。 完全控制&#xff0c;包含上传删除权限&#xff0c;policy如下&#xff1a; {"Version": "2012-10-17","Statement": [{"Si…...

C#中常见的锁以及用法--18

目录 一.C#中存在的锁 二.锁的作用 三.锁的概念和定义 关于锁的完整代码示例 代码逐层剖析: 全局变量与同步变量 Lock(锁)关键字示例 Monitor(监视器锁)示例 Mutex(互斥量)示例(支持跨进程同步) SemaphoreSlim(信号量)示例 ReadWriterLockSlim(读写锁)示例 SpinLock…...

【数据分享】1929-2024年全球站点的逐年平均气温数据(Shp\Excel\无需转发)

气象数据是在各项研究中都经常使用的数据&#xff0c;气象指标包括气温、风速、降水、湿度等指标&#xff0c;其中又以气温指标最为常用&#xff01;说到气温数据&#xff0c;最详细的气温数据是具体到气象监测站点的气温数据&#xff01;本次我们为大家带来的就是具体到气象监…...

Docker部署MySQL 5.7:持久化数据的实战技巧

在生产环境中使用Docker启动MySQL 5.7时&#xff0c;需要考虑数据持久化、配置文件管理、安全性等多个方面。以下是一个详细的步骤指南。 1. 准备工作 &#xff08;1&#xff09;创建挂载目录 在宿主机上创建用于挂载的目录&#xff0c;以便持久化数据和配置文件。 sudo mkdi…...

二叉树和堆

树概念及结构&#xff08;了解&#xff09; 树的概念&#xff08;看看就行&#xff09; 树是一种 非线性 的数据结构&#xff0c;它是由 n &#xff08; n>0 &#xff09;个有限结点组成一个具有层次关系的集合。 把它叫做树是因 为它看起来像一棵倒挂的树&#xff0c;也就是…...

Zookeeper(15)Zookeeper的ZooKeeper API包含哪些主要操作?

Zookeeper 的 ZooKeeper API 提供了一系列操作来管理 Zookeeper 的数据节点&#xff08;znodes&#xff09;。这些操作主要包括创建节点、删除节点、读取节点数据、设置节点数据、列出子节点、检查节点是否存在&#xff0c;以及注册 Watcher 等。以下是这些操作的详细介绍和代码…...

深入浅出:Go语言os包中的API使用指南

深入浅出:Go语言os包中的API使用指南 引言 Go语言以其简洁、高效和强大的生态系统著称,是现代编程中不可或缺的一部分。其中,os包作为Go标准库的一部分,提供了丰富的API来与操作系统进行交互。本文将深入探讨os包中的核心功能,并通过实际案例帮助读者更好地理解和应用这些…...

【云岚到家】-day02-客户管理-认证授权

第二章 客户管理 1.认证模块 1.1 需求分析 1.基础概念 一般情况有用户交互的项目都有认证授权功能&#xff0c;首先我们要搞清楚两个概念&#xff1a;认证和授权 认证: 就是校验用户的身份是否合法&#xff0c;常见的认证方式有账号密码登录、手机验证码登录等 授权:则是该用…...

vben5 admin ant design vue如何使用时间范围组件RangePicker

本文参考&#xff1a;https://pusdn-dev.feishu.cn/wiki/VF4hwBAUliTE6TkUPKrcBNcZn9f?fromfrom_copylink 由PUSDN整理发行&#xff0c;收录时请保留PUSDN。 前端组件专题 年月日时间范围表单回显RangePicker 推荐使用多个字段存储&#xff0c;不推荐用英文逗号拼接时间&am…...

安全策略配置实验

安全策略配置实验 1.拓扑 2.需求 2、办公区PC在工作日时间(周一至周五&#xff0c;早8到晚6)可以正常访问OA srver&#xff0c;其他时间不允许 3、办公区PC可以在任意时刻访问web server 4、生产区PC可以在任意时刻访问OA Server&#xff0c;但是不能访问Web server 5、特…...

Win10安装WebODM和操作全流程

效果 以下是在 Windows 10 上安装和部署 WebODM 的详细教程: 一、安装 Docker Desktop for Windows 1、访问 Docker 官方网站:https://www.docker.com/products/docker-desktop 。 2、下载 Docker Desktop for Windows 的安装程序。 3、运行安装程序: 双击下载的安装程序,…...

wireshark抓路由器上的包 抓包路由器数据

文字目录 抓包流程概述设置抓包配置选项 设置信道设置无线数据包加密信息设置MAC地址过滤器 抓取联网过程 抓包流程概述 使用Omnipeek软件分析网络数据包的流程大概可以分为以下几个步骤&#xff1a; 扫描路由器信息&#xff0c;确定抓包信道&#xff1b;设置连接路由器的…...

第8章:Python TDD处理货币类代码重复问题

写在前面 这本书是我们老板推荐过的&#xff0c;我在《价值心法》的推荐书单里也看到了它。用了一段时间 Cursor 软件后&#xff0c;我突然思考&#xff0c;对于测试开发工程师来说&#xff0c;什么才更有价值呢&#xff1f;如何让 AI 工具更好地辅助自己写代码&#xff0c;或许…...

C#,入门教程(01)—— Visual Studio 2022 免费安装的详细图文与动画教程

通过本课程的学习&#xff0c;你可以掌握C#编程的重点&#xff0c;享受编程的乐趣。 在本课程之前&#xff0c;你无需具备任何C#的基础知识&#xff0c;只要能操作电脑即可。 不过&#xff0c;希望你的数学不是体育老师教的。好的程序是数理化的实现与模拟。没有较好的数学基础…...

Agent Laboratory: Using LLM Agents as Research Assistants 论文简介

加速机器学习研究的智能实验室——Agent Laboratory 1. 引言 随着人工智能技术的飞速发展&#xff0c;机器学习领域正以前所未有的速度推进科学发现和技术创新。然而&#xff0c;传统的科学研究模式往往受到时间、资源和专业知识限制&#xff0c;阻碍了研究者们探索新想法的能…...

cuda + cudnn安装

1.安装CUDA Toolkit 在设备管理器&#xff08;此电脑–右键–属性&#xff09;的显示适配器中可以查看自己的显卡型号&#xff0c;去下载对应的CUDA Toolkit 。或者输入以下命令查看Driver Version &#xff0c;cuda Version&#xff1a;12.2代表12.2版本以下兼容可以进行安装 …...

Next.js 实战 (八):使用 Lodash 打包构建产生的“坑”?

前言 最近一直在折腾 Nextjs15 &#xff0c;也在断断续续地写《Next.js15 实战系列》的文章&#xff0c;后来总感觉文章如果没有线上效果预览差点意思&#xff0c;所以就想着先把目前做的项目先部署上线&#xff0c;后续再慢慢添加新功能。 因为之前没有部署过 Nextjs15 工程…...

owasp SQL 注入-03 (原理)

1: 先看一下注入界面: 点submit 后&#xff0c;可以看到有语法报错&#xff0c;说明已经起作用了: 报如下的错误: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near at line 1 2:…...

wireshark工具简介

目录 1 wireshark介绍 2 wireshark抓包流程 2.1 选择网卡 2.2 停止抓包 2.3 保存数据 3 wireshark过滤器设置 3.1 显示过滤器的设置 3.2 抓包过滤器 4 wireshark的封包列表与封包详情 4.1 封包列表 4.2 封包详情 参考文献 1 wireshark介绍 wireshark是非常流行的网络…...

队列的基本用法

以下是关于 C 语言中队列的详细知识&#xff0c;包括队列的生成、相关函数使用以及其他重要概念&#xff1a; 一、队列的概念 队列是一种线性数据结构&#xff0c;它遵循先进先出&#xff08;First In First Out&#xff0c;FIFO&#xff09;的原则&#xff0c;就像日常生活中…...

OpenHarmony-7.IDL工具

IDL 工具 1.openharmony IDL工具 在OpenHarmony中&#xff0c;当应用/系统服务的客户端和服务端进行IPC&#xff08;Inter-Process Communication&#xff09;跨线程通信时&#xff0c;需要定义双方都认可的接口&#xff0c;以保障双方可以成功通信&#xff0c;OpenHarmony ID…...

封装Redis工具类

基于StringRedisTemplate封装一个缓存工具类,满足以下需求: 方法1:将任意Java对象序列化为json并存储在string类型的key中,并且可以设置TTL过期时间 方法2:将任意Java对象序列化为json并存储在string类型的key中,并且可以设置TTL过期时间,用于处理缓存击穿问题 方法3:根据指定的…...

将n变为一个可以被表示为2^{a}+2^{b}的正整数m

给出一个正整数n&#xff0c;需要将n变为一个可以被表示为的正整数m&#xff0c;其中a和b都是非负整数且a!b&#xff0c;你可以进行两种操作&#xff1a; 1.令n加1 2.令n减1 请你求出最少需要多少次操作才能将n变成满足条件的m。 输入格式 输入一个整数&#xff0c;代表n。…...

第2章:Python TDD构建Dollar类基础

写在前面 这本书是我们老板推荐过的&#xff0c;我在《价值心法》的推荐书单里也看到了它。用了一段时间 Cursor 软件后&#xff0c;我突然思考&#xff0c;对于测试开发工程师来说&#xff0c;什么才更有价值呢&#xff1f;如何让 AI 工具更好地辅助自己写代码&#xff0c;或许…...

搭建一个基于Spring Boot的校园台球厅人员与设备管理系统

搭建一个基于Spring Boot的校园台球厅人员与设备管理系统可以涵盖多个功能模块&#xff0c;例如用户管理、设备管理、预约管理、计费管理等。以下是一个简化的步骤指南&#xff0c;帮助你快速搭建一个基础的系统。 — 1. 项目初始化 使用 Spring Initializr 生成一个Spring …...

JavaScript系列(33)--微前端架构详解

JavaScript微前端架构详解 &#x1f3d7;️ 今天&#xff0c;让我们深入了解JavaScript的微前端架构&#xff0c;这是一种用于构建和管理大型前端应用的现代架构模式。 微前端基础概念 &#x1f31f; &#x1f4a1; 小知识&#xff1a;微前端是一种将前端应用分解成更小、更易…...

第6章:Python TDD实例变量私有化探索

写在前面 这本书是我们老板推荐过的&#xff0c;我在《价值心法》的推荐书单里也看到了它。用了一段时间 Cursor 软件后&#xff0c;我突然思考&#xff0c;对于测试开发工程师来说&#xff0c;什么才更有价值呢&#xff1f;如何让 AI 工具更好地辅助自己写代码&#xff0c;或许…...