当前位置:网站首页>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)
边栏推荐
- 大伟 GBase8s游标稳定性读ESQL测试用例
- 美团、饿了么被杭州市监约谈要求落实食品安全管理责任 严禁恶意竞争
- 重磅 | 基金会为白金、黄金、白银捐赠人授牌
- SkiaSharp of WPF custom painting to bounce ball (case)
- Basic construction of QT project
- Applied practical skills of deep reinforcement learning
- Leetcode binary tree series -- 144. Preorder traversal of binary trees
- DoD 和 DoR,消减「认知偏差」的两大神器
- [image detection] Research on cumulative weighted edge detection method based on gray image, with matlab code
- AI模型风险评估 第2部分:核心内容
猜你喜欢

开放原子开源基金会秘书长孙文龙 | 凝心聚力,共拓开源

Leetcode bit operation

牛客网刷题

StarRocks 技术内幕:实时更新与极速查询如何兼得

Understand what a binary tree is (types, traversal methods, definitions of binary trees)

Basic construction of QT project

阿里P8爆出的这份大厂面试指南,看完工资暴涨30k!

QT基本工程的解析

Pytorch 入门

Function comparison between report control FastReport and stimulus soft
随机推荐
Meeting OA project (V) -- meeting notice and feedback details
PaddleLite 编译以及代码跑通复盘
8.穿插-从架构设计到实践理解ThreadPoolExecutor线程池
INVALID_ ARGUMENT : Invalid rank for input: modelInput Got: 3 Expected: 4 Please fix either the input
浅谈string中的compareTo方法
How to use grep to find pattern matching across multiple lines
Dawei gbase8s cursor stability read esql test case
Is this it?TypeScript actually not difficult!(recommended collection)
HMS Core Discovery 16 review | with tiger mound, embracing new AI "voice" state
大伟 Golang之路
QT基本工程的解析
Gbase8s core data backup
AI model risk assessment Part 2: core content
Basic. Blocking
Paddlelite compilation and code running through the disk
北京大学公开课重磅来袭!欢迎走进「AI for Science」课堂
ES6 arrow function this points to
「PHP基础知识」使用数组保存数据
Pyqt5 rapid development and practice 6.6 qformlayout & 6.7 nested layout & 6.8 qsplitter
Package Delivery(贪心)