用python写一个商城项目
时间: 2024-05-06 09:14:59 浏览: 11
好的,商城项目一般包括前台展示和后台管理两个部分。下面是一个简单的商城项目示例。
## 1. 前台展示
### 1.1 首页
首页展示商品列表,可以根据关键字搜索商品。
#### 1.1.1 首页视图函数
```python
from flask import render_template, request
from app import app
from models import Product
@app.route('/', methods=['GET', 'POST'])
def index():
if request.method == 'POST':
keyword = request.form.get('keyword')
products = Product.query.filter(Product.name.contains(keyword)).all()
else:
products = Product.query.all()
return render_template('index.html', products=products)
```
#### 1.1.2 首页模板
```html
{% extends 'base.html' %}
{% block content %}
<div class="container">
<h1>商品列表</h1>
<form method="post">
<div class="form-group">
<label for="keyword">关键字:</label>
<input type="text" class="form-control" name="keyword" id="keyword">
</div>
<button type="submit" class="btn btn-primary">搜索</button>
</form>
<ul class="list-unstyled">
{% for product in products %}
<li>
<h2>{{ product.name }}</h2>
<p>{{ product.description }}</p>
<p>价格:{{ product.price }}</p>
</li>
{% endfor %}
</ul>
</div>
{% endblock %}
```
### 1.2 商品详情页
点击商品名称可以进入商品详情页,展示商品详细信息。
#### 1.2.1 商品详情页视图函数
```python
from flask import render_template
from app import app
from models import Product
@app.route('/product/<int:id>')
def product_detail(id):
product = Product.query.get(id)
return render_template('product_detail.html', product=product)
```
#### 1.2.2 商品详情页模板
```html
{% extends 'base.html' %}
{% block content %}
<div class="container">
<h1>{{ product.name }}</h1>
<p>{{ product.description }}</p>
<p>价格:{{ product.price }}</p>
<a href="/" class="btn btn-primary">返回</a>
</div>
{% endblock %}
```
## 2. 后台管理
后台管理需要管理员登录,可以对商品进行增删改查操作。
### 2.1 登录
管理员登录页面。
#### 2.1.1 登录视图函数
```python
from flask import render_template, request, session, redirect, url_for
from app import app
from models import User
@app.route('/admin/login', methods=['GET', 'POST'])
def login():
if request.method == 'POST':
username = request.form.get('username')
password = request.form.get('password')
user = User.query.filter_by(username=username, password=password).first()
if user:
session['user_id'] = user.id
return redirect(url_for('admin_index'))
else:
return render_template('login.html', error='用户名或密码错误')
else:
return render_template('login.html')
```
#### 2.1.2 登录模板
```html
{% extends 'base.html' %}
{% block content %}
<div class="container">
<h1>管理员登录</h1>
{% if error %}
<div class="alert alert-danger">{{ error }}</div>
{% endif %}
<form method="post">
<div class="form-group">
<label for="username">用户名:</label>
<input type="text" class="form-control" name="username" id="username">
</div>
<div class="form-group">
<label for="password">密码:</label>
<input type="password" class="form-control" name="password" id="password">
</div>
<button type="submit" class="btn btn-primary">登录</button>
</form>
</div>
{% endblock %}
```
### 2.2 后台首页
管理员登录后进入的页面,展示商品列表。
#### 2.2.1 后台首页视图函数
```python
from flask import render_template, session, redirect, url_for
from app import app
from models import Product
@app.route('/admin')
def admin_index():
if 'user_id' in session:
products = Product.query.all()
return render_template('admin_index.html', products=products)
else:
return redirect(url_for('login'))
```
#### 2.2.2 后台首页模板
```html
{% extends 'base.html' %}
{% block content %}
<div class="container">
<h1>商品列表</h1>
<a href="{{ url_for('admin_add_product') }}" class="btn btn-primary">新增商品</a>
<table class="table">
<thead>
<tr>
<th>ID</th>
<th>名称</th>
<th>描述</th>
<th>价格</th>
<th>操作</th>
</tr>
</thead>
<tbody>
{% for product in products %}
<tr>
<td>{{ product.id }}</td>
<td>{{ product.name }}</td>
<td>{{ product.description }}</td>
<td>{{ product.price }}</td>
<td>
<a href="{{ url_for('admin_edit_product', id=product.id) }}" class="btn btn-sm btn-primary">编辑</a>
<a href="{{ url_for('admin_delete_product', id=product.id) }}" class="btn btn-sm btn-danger">删除</a>
</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
{% endblock %}
```
### 2.3 新增商品
管理员可以添加新商品。
#### 2.3.1 新增商品视图函数
```python
from flask import render_template, request, session, redirect, url_for
from app import app, db
from models import Product
@app.route('/admin/product/add', methods=['GET', 'POST'])
def admin_add_product():
if 'user_id' not in session:
return redirect(url_for('login'))
if request.method == 'POST':
name = request.form.get('name')
description = request.form.get('description')
price = request.form.get('price')
product = Product(name=name, description=description, price=price)
db.session.add(product)
db.session.commit()
return redirect(url_for('admin_index'))
else:
return render_template('admin_add_product.html')
```
#### 2.3.2 新增商品模板
```html
{% extends 'base.html' %}
{% block content %}
<div class="container">
<h1>新增商品</h1>
<form method="post">
<div class="form-group">
<label for="name">名称:</label>
<input type="text" class="form-control" name="name" id="name">
</div>
<div class="form-group">
<label for="description">描述:</label>
<textarea class="form-control" name="description" id="description"></textarea>
</div>
<div class="form-group">
<label for="price">价格:</label>
<input type="text" class="form-control" name="price" id="price">
</div>
<button type="submit" class="btn btn-primary">保存</button>
<a href="{{ url_for('admin_index') }}" class="btn btn-secondary">取消</a>
</form>
</div>
{% endblock %}
```
### 2.4 编辑商品
管理员可以修改商品信息。
#### 2.4.1 编辑商品视图函数
```python
from flask import render_template, request, session, redirect, url_for
from app import app, db
from models import Product
@app.route('/admin/product/edit/<int:id>', methods=['GET', 'POST'])
def admin_edit_product(id):
if 'user_id' not in session:
return redirect(url_for('login'))
product = Product.query.get(id)
if request.method == 'POST':
product.name = request.form.get('name')
product.description = request.form.get('description')
product.price = request.form.get('price')
db.session.commit()
return redirect(url_for('admin_index'))
else:
return render_template('admin_edit_product.html', product=product)
```
#### 2.4.2 编辑商品模板
```html
{% extends 'base.html' %}
{% block content %}
<div class="container">
<h1>编辑商品</h1>
<form method="post">
<div class="form-group">
<label for="name">名称:</label>
<input type="text" class="form-control" name="name" id="name" value="{{ product.name }}">
</div>
<div class="form-group">
<label for="description">描述:</label>
<textarea class="form-control" name="description" id="description">{{ product.description }}</textarea>
</div>
<div class="form-group">
<label for="price">价格:</label>
<input type="text" class="form-control" name="price" id="price" value="{{ product.price }}">
</div>
<button type="submit" class="btn btn-primary">保存</button>
<a href="{{ url_for('admin_index') }}" class="btn btn-secondary">取消</a>
</form>
</div>
{% endblock %}
```
### 2.5 删除商品
管理员可以删除商品。
#### 2.5.1 删除商品视图函数
```python
from flask import session, redirect, url_for
from app import app, db
from models import Product
@app.route('/admin/product/delete/<int:id>')
def admin_delete_product(id):
if 'user_id' not in session:
return redirect(url_for('login'))
product = Product.query.get(id)
db.session.delete(product)
db.session.commit()
return redirect(url_for('admin_index'))
```
## 3. 数据库模型
商城项目需要使用数据库存储商品和管理员信息,下面是数据库模型示例。
```python
from app import db
class Product(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(255), nullable=False)
description = db.Column(db.Text)
price = db.Column(db.Float, nullable=False)
class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(255), nullable=False, unique=True)
password = db.Column(db.String(255), nullable=False)
```
## 4. 总结
以上是一个简单的商城项目示例,包括前台展示和后台管理两个部分,实现了商品的增删改查操作。当然,实际的商城项目远比这个复杂,但这个示例可以作为参考,帮助你开始编写自己的商城项目。