当前位置:网站首页>Based on the flask to write a small shopping mall project
Based on the flask to write a small shopping mall project
2022-07-29 11:06:00 【pony with slow hair】
1.项目实现功能
Projects are mainly divided into users、管理员两个角色,The functions of the two roles are shown separately

2.项目技术
The project is mainly back-end development,利用flask框架进行开发、数据库采用mysql;which uses blueprintsblueprint、Decorator for permission control, etc
3.项目实现
(1)整体项目结构

(2)List the overall needs first
① utils:
import hashlib import time import simplejson as json def result(code=200, d={},message=''): data = dict() # object.__dict__ data['code'] = code data['data'] = d data['message']=message return json.dumps(data, ensure_ascii=False) def md5(m): return hashlib.md5(m.encode()).hexdigest() def getNowDataTime(): return time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()) def getTimeStamp(): return time.time() def getOrderNum(): orderNum = str(getTimeStamp()).replace('.', '') return orderNum②连接数据库的配置信息
# true表示返回的jsonChinese characters in the file are usedascii码表示 JSON_AS_ASCII = False # 数据库的配置变量 class MySQLConfig(object): HOSTNAME = '127.0.0.1' PORT = '3306' DATABASE = 'mall' USERNAME = 'root' PASSWORD = '' DB_URI = 'mysql+pymysql://{}:{}@{}:{}/{}'.format(USERNAME, PASSWORD, HOSTNAME, PORT, DATABASE) SQLALCHEMY_DATABASE_URI = DB_URI # 关闭数据库修改跟踪操作[提高性能],可以设置为True,这样可以跟踪操作: SQLALCHEMY_TRACK_MODIFICATIONS = False # 开启输出底层执行的sql语句 SQLALCHEMY_ECHO = True # session SECRET_KEY = "123"③全局变量
from flask_sqlalchemy import SQLAlchemy db = SQLAlchemy()④数据库表
from exts import db class User(db.Model): __tablename__ = "user" __table_args__ = {'mysql_collate': 'utf8_general_ci'} _id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(30)) username = db.Column(db.String(11), unique=True) password = db.Column(db.String(64)) avatar = db.Column(db.String(256)) age = db.Column(db.Integer) idCard = db.Column(db.String(18)) gneder = db.Column(db.String(2)) createTime = db.Column(db.DateTime) loginTime = db.Column(db.DateTime) logoutTime = db.Column(db.DateTime) balance = db.Column(db.Float(10), default=0) vip = db.Column(db.Integer, db.ForeignKey("vip._id")) def __repr__(self): return "User:%s" % self.name goodsCourt = db.Table("goodsCourt", db.Column("goods_id", db.Integer, db.ForeignKey("goods._id")), db.Column("court_id", db.Integer, db.ForeignKey("court._id")) ) class Court(db.Model): __tablename__ = "court" __table_args__ = {'mysql_collate': 'utf8_general_ci'} _id = db.Column(db.Integer, primary_key=True) user_id = db.Column(db.Integer, db.ForeignKey('user._id')) number = db.Column(db.Integer, default=0) # 记录商品种类 goods = db.relationship("Goods", secondary=goodsCourt, backref=db.backref("court", lazy="dynamic"), lazy="dynamic") class Address(db.Model): __tablename__ = "address" __table_args__ = {'mysql_collate': 'utf8_general_ci'} _id = db.Column(db.Integer, primary_key=True) province = db.Column(db.String(18)) town = db.Column(db.String(18)) county = db.Column(db.String(18)) detail = db.Column(db.String(200)) user_id = db.Column(db.Integer, db.ForeignKey("user._id")) def __repr__(self): return "Address:%s" % self.detail class Vip(db.Model): __tablename__ = "vip" __table_args__ = {'mysql_collate': 'utf8_general_ci'} _id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(50)) level = db.Column(db.Integer, default=0) def __repr__(self): return "Vip:%s" % self.name class Ad(db.Model): __tablename__ = "ad" __table_args__ = {'mysql_collate': 'utf8_general_ci'} _id = db.Column(db.Integer, primary_key=True) content = db.Column(db.String(50)) createTime = db.Column(db.DateTime) displayTime = db.Column(db.DateTime) endTime = db.Column(db.DateTime) image = db.Column(db.String(256)) video = db.Column(db.String(256)) title = db.Column(db.String(100)) intro = db.Column(db.String(500)) def __repr__(self): return "Ad:%s" % self.content class Admin(db.Model): __tablename__ = "admin" __table_args__ = {'mysql_collate': 'utf8_general_ci'} _id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(30)) account = db.Column(db.String(11)) password = db.Column(db.String(64)) createTime = db.Column(db.DateTime) loginTime = db.Column(db.DateTime) logoutTime = db.Column(db.DateTime) level = db.Column(db.Integer, default=0) def __repr__(self): return "Admin:%s" % self.name class GoodsType(db.Model): __tablename__ = "goodsType" __table_args__ = {'mysql_collate': 'utf8_general_ci'} _id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(50)) number = db.Column(db.Integer, default=0) def __repr__(self): return "GoodsType:%s" % self.name class Goods(db.Model): __tablename__ = "goods" __table_args__ = {'mysql_collate': 'utf8_general_ci'} _id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(100)) goodsType_id = db.Column(db.Integer, db.ForeignKey("goodsType._id")) originPrice = db.Column(db.Float(10)) sellPrice = db.Column(db.Float(10)) contains = db.Column(db.Integer, default=0) produceTime = db.Column(db.DateTime) expireTime = db.Column(db.DateTime) createTime = db.Column(db.DateTime) image = db.Column(db.String(256)) createAddress_id = db.Column(db.Integer, db.ForeignKey("address._id")) sendAddress_id = db.Column(db.Integer, db.ForeignKey("address._id")) intro = db.Column(db.String(500)) lookTimes = db.Column(db.Integer, default=0) buyTimes = db.Column(db.Integer, default=0) likeTimes = db.Column(db.Integer, default=0) def __repr__(self): return "Goods:%s" % self.name class VipReceipt(db.Model): __tablename__ = "vip_receipt" __table_args__ = {'mysql_collate': 'utf8_general_ci'} _id = db.Column(db.Integer, primary_key=True) orderNum = db.Column(db.String(30)) createTime = db.Column(db.DateTime) payValue = db.Column(db.Float(10)) cutoffValue = db.Column(db.Float(10)) user_id = db.Column(db.Integer, db.ForeignKey("user._id")) vipId = db.Column(db.Integer) def __repr__(self): return "VipReceipt:%s" % self.orderNum class ReceiptItem(db.Model): __tablename__ = "receipt_item" __table_args__ = {'mysql_collate': 'utf8_general_ci'} _id = db.Column(db.Integer, primary_key=True) goodsId = db.Column(db.Integer) number = db.Column(db.Integer, default=0) class Receipt(db.Model): __tablename__ = "receipt" __table_args__ = {'mysql_collate': 'utf8_general_ci'} _id = db.Column(db.Integer, primary_key=True) orderNum = db.Column(db.String(30)) createTime = db.Column(db.DateTime) payValue = db.Column(db.Float(10)) cutoffValue = db.Column(db.Float(10)) user_id = db.Column(db.Integer, db.ForeignKey("user._id")) itemId = db.Column(db.String(100), default="[]") def get_goods_id_list(self): idStrList = self.itemId[1:-1].split(',') idList = [] for item in idStrList: idList.append(int(item)) return idList def __repr__(self): return "Receipt:%s" % self.orderNum class Comment(db.Model): __tablename__ = "comment" __table_args__ = {'mysql_collate': 'utf8_general_ci'} _id = db.Column(db.Integer, primary_key=True) createTime = db.Column(db.DateTime) content = db.Column(db.String(500)) points = db.Column(db.Integer, default=5) screenCut = db.Column(db.String(256)) user = db.Column(db.Integer, db.ForeignKey("user._id")) good = db.Column(db.Integer, db.ForeignKey("goods._id")) def __repr__(self): return "Comment:%s" % self.content
(3)登录登出
from datetime import datetime
from flask import Flask, request, jsonify, session
from flask_migrate import Migrate
from blueprints.admin import bp as admin_bp
from blueprints.user import bp as user_bp
from blueprints.mall import bp as mall_bp
from blueprints.visitor import bp as visitor_bp
import config
from config import *
from exts import db
from blueprints.forms import LoginForm
from models import Admin, User
app = Flask(__name__)
# 组装蓝图 将book、course、user模块都组装在main.py中
app.register_blueprint(admin_bp)
app.register_blueprint(user_bp)
app.register_blueprint(mall_bp)
app.register_blueprint(visitor_bp)
# 配置项
app.config.from_object(MySQLConfig)
db.init_app(app)
db.app = app
# migrate = Migrate(app, db)
# db.create_all()
@app.route("/login", methods=['POST', 'GET'])
def login():
"""All three have a login function 所以直接在app.pyin the login function"""
if request.method == 'GET':
return "login.html"
else:
form = LoginForm(request.form)
if form.validate():
account = form.account.data
password_input = form.password.data
type = form.type.data
if type == 'admin':
admin_model = Admin.query.filter_by(account=account).first()
print("admin:", admin_model)
if admin_model:
if password_input == admin_model.password:
session["_id"] = admin_model._id
admin_model.loginTime = datetime.now()
db.session.commit()
print("登录成功")
return jsonify({"code": 200, "message": " admin suceess"})
else:
print("密码错误")
return jsonify({"code": 403, "message": "admin 密码错误"})
else:
print("不存在该admin")
return jsonify({"code": 404, "message": "admin 不存在"})
else:
user_model = User.query.filter_by(username=account).first()
if user_model:
if password_input == user_model.password:
session["_id"] = user_model._id
user_model.loginTime = datetime.now()
db.session.commit()
print("登录成功")
return jsonify({"code": 200, "message": "user suceess"})
else:
print("密码错误")
return jsonify({"code": 403, "message": "user 密码错误"})
else:
print("不存在该user")
return jsonify({"code": 404, "message": "user 不存在"})
else:
print("请输入正确格式的账号或密码")
return jsonify({"code": 500, "message": "格式错误"})
# 退出系统
@app.route("/logout", methods=["POST"])
def logout():
if request.method == "POST":
_id = session["_id"]
_type = request.form["type"]
if _type == "admin":
admin = Admin.query.get(_id)
admin.logoutTime = datetime.now()
else:
user = User.query.get(_id)
user.logoutTime = datetime.now()
del session["_id"]
return jsonify({"code": 200, "message": "退出登录成功"})
@app.route('/')
def hello_world():
return 'Hello World!'
if __name__ == '__main__':
app.run(debug=True)
边栏推荐
- Deep understanding of c # delegate into the fast lanes
- Package delivery (greedy)
- Is this it?TypeScript actually not difficult!(recommended collection)
- "Knowledge Collection" article to understand mysql index!!(recommended collection)
- How to synchronize when the primary and sub warehouses are modified?
- 为什么应该在开发环境中使用 Kubernetes
- Watch the open source summit first | quick view of the sub Forum & Activity agenda on July 29
- Luogu p1816 loyalty solution
- KRYSTAL:审计数据中基于知识图的战术攻击发现框架
- INVALID_ ARGUMENT : Invalid rank for input: modelInput Got: 3 Expected: 4 Please fix either the input
猜你喜欢

「PHP基础知识」使用数组保存数据

KRYSTAL:审计数据中基于知识图的战术攻击发现框架

Conference OA project - my approval

QWidget、QDialog、QMainWindow 的异同点

Why should kubernetes be used in development environments

浅谈安科瑞灭弧式智慧用电在养老机构的应用

开源峰会抢先看 | 7 月 29 日分论坛 & 活动议程速览

Drawing box and ellipse of WPF screenshot control (IV) "imitating wechat"

Zhou Hongyi: 360 is the largest secure big data company in the world

std::vector 拷贝、追加、嵌套访问
随机推荐
QT's user-defined interface (borderless and movable)
2022 latest WiFi master applet independent version 3.0.8
为什么应该在开发环境中使用 Kubernetes
WPF 截图控件之绘制方框与椭圆(四) 「仿微信」
Self collection online computer wallpaper PHP source code v2.0 adaptive end
1.MySQL数据库的介绍
大伟 GBase8s游标稳定性读ESQL测试用例
DoD 和 DoR,消减「认知偏差」的两大神器
Luogu p1816 loyalty solution
Lucky draw system with background source code
Getting started with pytoch
IPV6基础
LeetCode_ 1049_ Weight of the last stone II
大伟 Golang之路
The 2022 open atom global open source summit opened in Beijing
美团、饿了么被杭州市监约谈要求落实食品安全管理责任 严禁恶意竞争
开源峰会抢先看 | 7 月 29 日分论坛 & 活动议程速览
Spark高效数据分析01、idea开发环境搭建
What is kubernetes custom resource definition (CRD)?
从零开始Blazor Server(3)--添加cookie授权