当前位置:网站首页>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)
边栏推荐
- The heavy | open atomic school source activity was officially launched
- Watch the open source summit first | quick view of the sub Forum & Activity agenda on July 29
- Talk about the establishment of performance testing environment
- How to use "copy – link" to accelerate docker to build and optimize cache
- 重磅 | 2022 开放原子全球开源峰会在北京开幕
- Determine whether the values of two objects are equal
- How to use grep to find pattern matching across multiple lines
- Is this it?TypeScript actually not difficult!(recommended collection)
- LeetCode二叉树系列——144.二叉树的前序遍历
- QT基本工程的解析
猜你喜欢
随机推荐
【Unity,C#】Character键盘输入转向与旋转
8.穿插-从架构设计到实践理解ThreadPoolExecutor线程池
Paddlelite compilation and code running through the disk
开源峰会抢先看 | 7月29日分论坛&活动议程速览
The heavyweight foundation awarded platinum, gold and silver donors
Std:: vector copy, append, nested access
美团、饿了么被杭州市监约谈要求落实食品安全管理责任 严禁恶意竞争
基于flask写的一个小商城mall项目
从零开始Blazor Server(3)--添加cookie授权
Error: Protobuf syntax version should be first thing in file
暑假集训week1
PHP basics uses arrays to save data
IPv6 Foundation
"Knowledge Collection" article to understand mysql index!!(recommended collection)
基本.分块
牛客网刷题
Regular expression matching URL
多线程顺序运行的 4 种方法,面试随便问!
Spark efficient data analysis 02, basic knowledge 13
阿里架构师耗时一年整理的《Lucene高级文档》,吃透你也是大厂员工!








