• 基于flask写的一个小商城mall项目


    1.项目实现功能

    项目主要是分为用户、管理员两个角色,分别对两个角色的功能进行展示

     2.项目技术

          项目主要是后端开发,利用flask框架进行开发、数据库采用mysql;其中运用蓝图blueprint、装饰器进行权限控制等

    3.项目实现

    (1)整体项目结构

     (2)先列一下整体都需要的

    ① utils:

    1. import hashlib
    2. import time
    3. import simplejson as json
    4. def result(code=200, d={},message=''):
    5. data = dict() # object.__dict__
    6. data['code'] = code
    7. data['data'] = d
    8. data['message']=message
    9. return json.dumps(data, ensure_ascii=False)
    10. def md5(m):
    11. return hashlib.md5(m.encode()).hexdigest()
    12. def getNowDataTime():
    13. return time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
    14. def getTimeStamp():
    15. return time.time()
    16. def getOrderNum():
    17. orderNum = str(getTimeStamp()).replace('.', '')
    18. return orderNum

    ②连接数据库的配置信息

    1. # true表示返回的json文件中中文字符用ascii码表示
    2. JSON_AS_ASCII = False
    3. # 数据库的配置变量
    4. class MySQLConfig(object):
    5. HOSTNAME = '127.0.0.1'
    6. PORT = '3306'
    7. DATABASE = 'mall'
    8. USERNAME = 'root'
    9. PASSWORD = ''
    10. DB_URI = 'mysql+pymysql://{}:{}@{}:{}/{}'.format(USERNAME, PASSWORD, HOSTNAME, PORT, DATABASE)
    11. SQLALCHEMY_DATABASE_URI = DB_URI
    12. # 关闭数据库修改跟踪操作[提高性能],可以设置为True,这样可以跟踪操作:
    13. SQLALCHEMY_TRACK_MODIFICATIONS = False
    14. # 开启输出底层执行的sql语句
    15. SQLALCHEMY_ECHO = True
    16. # session
    17. SECRET_KEY = "123"

    ③全局变量

    1. from flask_sqlalchemy import SQLAlchemy
    2. db = SQLAlchemy()

    ④数据库表

    1. from exts import db
    2. class User(db.Model):
    3. __tablename__ = "user"
    4. __table_args__ = {'mysql_collate': 'utf8_general_ci'}
    5. _id = db.Column(db.Integer, primary_key=True)
    6. name = db.Column(db.String(30))
    7. username = db.Column(db.String(11), unique=True)
    8. password = db.Column(db.String(64))
    9. avatar = db.Column(db.String(256))
    10. age = db.Column(db.Integer)
    11. idCard = db.Column(db.String(18))
    12. gneder = db.Column(db.String(2))
    13. createTime = db.Column(db.DateTime)
    14. loginTime = db.Column(db.DateTime)
    15. logoutTime = db.Column(db.DateTime)
    16. balance = db.Column(db.Float(10), default=0)
    17. vip = db.Column(db.Integer, db.ForeignKey("vip._id"))
    18. def __repr__(self):
    19. return "User:%s" % self.name
    20. goodsCourt = db.Table("goodsCourt",
    21. db.Column("goods_id", db.Integer, db.ForeignKey("goods._id")),
    22. db.Column("court_id", db.Integer, db.ForeignKey("court._id"))
    23. )
    24. class Court(db.Model):
    25. __tablename__ = "court"
    26. __table_args__ = {'mysql_collate': 'utf8_general_ci'}
    27. _id = db.Column(db.Integer, primary_key=True)
    28. user_id = db.Column(db.Integer, db.ForeignKey('user._id'))
    29. number = db.Column(db.Integer, default=0) # 记录商品种类
    30. goods = db.relationship("Goods", secondary=goodsCourt, backref=db.backref("court", lazy="dynamic"), lazy="dynamic")
    31. class Address(db.Model):
    32. __tablename__ = "address"
    33. __table_args__ = {'mysql_collate': 'utf8_general_ci'}
    34. _id = db.Column(db.Integer, primary_key=True)
    35. province = db.Column(db.String(18))
    36. town = db.Column(db.String(18))
    37. county = db.Column(db.String(18))
    38. detail = db.Column(db.String(200))
    39. user_id = db.Column(db.Integer, db.ForeignKey("user._id"))
    40. def __repr__(self):
    41. return "Address:%s" % self.detail
    42. class Vip(db.Model):
    43. __tablename__ = "vip"
    44. __table_args__ = {'mysql_collate': 'utf8_general_ci'}
    45. _id = db.Column(db.Integer, primary_key=True)
    46. name = db.Column(db.String(50))
    47. level = db.Column(db.Integer, default=0)
    48. def __repr__(self):
    49. return "Vip:%s" % self.name
    50. class Ad(db.Model):
    51. __tablename__ = "ad"
    52. __table_args__ = {'mysql_collate': 'utf8_general_ci'}
    53. _id = db.Column(db.Integer, primary_key=True)
    54. content = db.Column(db.String(50))
    55. createTime = db.Column(db.DateTime)
    56. displayTime = db.Column(db.DateTime)
    57. endTime = db.Column(db.DateTime)
    58. image = db.Column(db.String(256))
    59. video = db.Column(db.String(256))
    60. title = db.Column(db.String(100))
    61. intro = db.Column(db.String(500))
    62. def __repr__(self):
    63. return "Ad:%s" % self.content
    64. class Admin(db.Model):
    65. __tablename__ = "admin"
    66. __table_args__ = {'mysql_collate': 'utf8_general_ci'}
    67. _id = db.Column(db.Integer, primary_key=True)
    68. name = db.Column(db.String(30))
    69. account = db.Column(db.String(11))
    70. password = db.Column(db.String(64))
    71. createTime = db.Column(db.DateTime)
    72. loginTime = db.Column(db.DateTime)
    73. logoutTime = db.Column(db.DateTime)
    74. level = db.Column(db.Integer, default=0)
    75. def __repr__(self):
    76. return "Admin:%s" % self.name
    77. class GoodsType(db.Model):
    78. __tablename__ = "goodsType"
    79. __table_args__ = {'mysql_collate': 'utf8_general_ci'}
    80. _id = db.Column(db.Integer, primary_key=True)
    81. name = db.Column(db.String(50))
    82. number = db.Column(db.Integer, default=0)
    83. def __repr__(self):
    84. return "GoodsType:%s" % self.name
    85. class Goods(db.Model):
    86. __tablename__ = "goods"
    87. __table_args__ = {'mysql_collate': 'utf8_general_ci'}
    88. _id = db.Column(db.Integer, primary_key=True)
    89. name = db.Column(db.String(100))
    90. goodsType_id = db.Column(db.Integer, db.ForeignKey("goodsType._id"))
    91. originPrice = db.Column(db.Float(10))
    92. sellPrice = db.Column(db.Float(10))
    93. contains = db.Column(db.Integer, default=0)
    94. produceTime = db.Column(db.DateTime)
    95. expireTime = db.Column(db.DateTime)
    96. createTime = db.Column(db.DateTime)
    97. image = db.Column(db.String(256))
    98. createAddress_id = db.Column(db.Integer, db.ForeignKey("address._id"))
    99. sendAddress_id = db.Column(db.Integer, db.ForeignKey("address._id"))
    100. intro = db.Column(db.String(500))
    101. lookTimes = db.Column(db.Integer, default=0)
    102. buyTimes = db.Column(db.Integer, default=0)
    103. likeTimes = db.Column(db.Integer, default=0)
    104. def __repr__(self):
    105. return "Goods:%s" % self.name
    106. class VipReceipt(db.Model):
    107. __tablename__ = "vip_receipt"
    108. __table_args__ = {'mysql_collate': 'utf8_general_ci'}
    109. _id = db.Column(db.Integer, primary_key=True)
    110. orderNum = db.Column(db.String(30))
    111. createTime = db.Column(db.DateTime)
    112. payValue = db.Column(db.Float(10))
    113. cutoffValue = db.Column(db.Float(10))
    114. user_id = db.Column(db.Integer, db.ForeignKey("user._id"))
    115. vipId = db.Column(db.Integer)
    116. def __repr__(self):
    117. return "VipReceipt:%s" % self.orderNum
    118. class ReceiptItem(db.Model):
    119. __tablename__ = "receipt_item"
    120. __table_args__ = {'mysql_collate': 'utf8_general_ci'}
    121. _id = db.Column(db.Integer, primary_key=True)
    122. goodsId = db.Column(db.Integer)
    123. number = db.Column(db.Integer, default=0)
    124. class Receipt(db.Model):
    125. __tablename__ = "receipt"
    126. __table_args__ = {'mysql_collate': 'utf8_general_ci'}
    127. _id = db.Column(db.Integer, primary_key=True)
    128. orderNum = db.Column(db.String(30))
    129. createTime = db.Column(db.DateTime)
    130. payValue = db.Column(db.Float(10))
    131. cutoffValue = db.Column(db.Float(10))
    132. user_id = db.Column(db.Integer, db.ForeignKey("user._id"))
    133. itemId = db.Column(db.String(100), default="[]")
    134. def get_goods_id_list(self):
    135. idStrList = self.itemId[1:-1].split(',')
    136. idList = []
    137. for item in idStrList:
    138. idList.append(int(item))
    139. return idList
    140. def __repr__(self):
    141. return "Receipt:%s" % self.orderNum
    142. class Comment(db.Model):
    143. __tablename__ = "comment"
    144. __table_args__ = {'mysql_collate': 'utf8_general_ci'}
    145. _id = db.Column(db.Integer, primary_key=True)
    146. createTime = db.Column(db.DateTime)
    147. content = db.Column(db.String(500))
    148. points = db.Column(db.Integer, default=5)
    149. screenCut = db.Column(db.String(256))
    150. user = db.Column(db.Integer, db.ForeignKey("user._id"))
    151. good = db.Column(db.Integer, db.ForeignKey("goods._id"))
    152. def __repr__(self):
    153. return "Comment:%s" % self.content

    (3)登录登出

     

    1. from datetime import datetime
    2. from flask import Flask, request, jsonify, session
    3. from flask_migrate import Migrate
    4. from blueprints.admin import bp as admin_bp
    5. from blueprints.user import bp as user_bp
    6. from blueprints.mall import bp as mall_bp
    7. from blueprints.visitor import bp as visitor_bp
    8. import config
    9. from config import *
    10. from exts import db
    11. from blueprints.forms import LoginForm
    12. from models import Admin, User
    13. app = Flask(__name__)
    14. # 组装蓝图 将book、course、user模块都组装在main.py中
    15. app.register_blueprint(admin_bp)
    16. app.register_blueprint(user_bp)
    17. app.register_blueprint(mall_bp)
    18. app.register_blueprint(visitor_bp)
    19. # 配置项
    20. app.config.from_object(MySQLConfig)
    21. db.init_app(app)
    22. db.app = app
    23. # migrate = Migrate(app, db)
    24. # db.create_all()
    25. @app.route("/login", methods=['POST', 'GET'])
    26. def login():
    27. """三个都有登录功能 所以直接在app.py中进行登录功能"""
    28. if request.method == 'GET':
    29. return "login.html"
    30. else:
    31. form = LoginForm(request.form)
    32. if form.validate():
    33. account = form.account.data
    34. password_input = form.password.data
    35. type = form.type.data
    36. if type == 'admin':
    37. admin_model = Admin.query.filter_by(account=account).first()
    38. print("admin:", admin_model)
    39. if admin_model:
    40. if password_input == admin_model.password:
    41. session["_id"] = admin_model._id
    42. admin_model.loginTime = datetime.now()
    43. db.session.commit()
    44. print("登录成功")
    45. return jsonify({"code": 200, "message": " admin suceess"})
    46. else:
    47. print("密码错误")
    48. return jsonify({"code": 403, "message": "admin 密码错误"})
    49. else:
    50. print("不存在该admin")
    51. return jsonify({"code": 404, "message": "admin 不存在"})
    52. else:
    53. user_model = User.query.filter_by(username=account).first()
    54. if user_model:
    55. if password_input == user_model.password:
    56. session["_id"] = user_model._id
    57. user_model.loginTime = datetime.now()
    58. db.session.commit()
    59. print("登录成功")
    60. return jsonify({"code": 200, "message": "user suceess"})
    61. else:
    62. print("密码错误")
    63. return jsonify({"code": 403, "message": "user 密码错误"})
    64. else:
    65. print("不存在该user")
    66. return jsonify({"code": 404, "message": "user 不存在"})
    67. else:
    68. print("请输入正确格式的账号或密码")
    69. return jsonify({"code": 500, "message": "格式错误"})
    70. # 退出系统
    71. @app.route("/logout", methods=["POST"])
    72. def logout():
    73. if request.method == "POST":
    74. _id = session["_id"]
    75. _type = request.form["type"]
    76. if _type == "admin":
    77. admin = Admin.query.get(_id)
    78. admin.logoutTime = datetime.now()
    79. else:
    80. user = User.query.get(_id)
    81. user.logoutTime = datetime.now()
    82. del session["_id"]
    83. return jsonify({"code": 200, "message": "退出登录成功"})
    84. @app.route('/')
    85. def hello_world():
    86. return 'Hello World!'
    87. if __name__ == '__main__':
    88. app.run(debug=True)

  • 相关阅读:
    0.泛型基础学习
    基于javaweb的智慧社区设计与实现
    动作捕捉系统用于室内组合定位技术研究
    算法通过村第十六关-滑动窗口|黄金笔记|结合堆的应用
    1151 LCA in a Binary Tree
    2023年09月 Python(一级)真题解析#中国电子学会#全国青少年软件编程等级考试
    虚拟摄像头之一: android8.1 移植 v4l2loopback 虚拟摄像头
    未来已来:探索5G技术如何改变我们的生活和工作
    Linux 系统安全及应用
    在Telegram营销后该如何进行客户管理
  • 原文地址:https://blog.csdn.net/m0_57098080/article/details/126021183