资讯动态

基于Flask的惠村超市管理系统开发实战

发布时间:2026/9/17 19:07:58 来源:尧图企业网站定制
1. 项目概述基于Flask的惠村超市管理系统去年接手本地惠村超市的数字化改造项目时我面临着一个典型的小型零售业痛点手工记账效率低下、库存管理混乱、销售数据无法实时掌握。经过技术选型最终采用PythonFlask技术栈构建了一套轻量级进销存系统上线后帮助超市将订单处理时间缩短了60%库存周转率提升35%。下面分享这套系统的完整实现方案。2. 系统架构设计2.1 技术选型考量选择Flask而非Django主要基于三点考量灵活扩展性超市业务可能随时调整促销策略和会员体系轻量级部署乡镇超市服务器配置有限2核4G云服务器渐进式开发可先实现核心功能再逐步添加模块技术栈组合后端Flask 2.0 SQLAlchemy 1.4ORM前端Bootstrap 5 jQuery兼顾开发效率与兼容性数据库MySQL 8.0社区版零成本部署Gunicorn 20.1 Nginx 1.182.2 模块化设计系统采用功能模块解耦设计/project ├── app.py # 主入口 ├── config.py # 配置管理 ├── requirements.txt # 依赖库 ├── static/ # 静态资源 ├── templates/ # 前端模板 └── modules/ # 功能模块 ├── auth/ # 认证模块 ├── products/ # 商品管理 ├── inventory/ # 库存管理 ├── orders/ # 订单处理 └── reports/ # 报表统计3. 数据库设计与优化3.1 核心表结构-- 用户表增加最后登录时间字段 CREATE TABLE users ( id INT AUTO_INCREMENT PRIMARY KEY, username VARCHAR(80) UNIQUE NOT NULL, password CHAR(128) NOT NULL, # 存储PBKDF2哈希值 role ENUM(admin,staff,customer) DEFAULT customer, last_login DATETIME, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); -- 商品表设计价格历史记录 CREATE TABLE products ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(100) NOT NULL, category ENUM(food,daily,drink) NOT NULL, current_price DECIMAL(10,2) NOT NULL, cost_price DECIMAL(10,2) COMMENT 进价, barcode VARCHAR(50) UNIQUE, description TEXT, image_path VARCHAR(255) ); -- 库存表增加操作日志 CREATE TABLE inventory ( product_id INT PRIMARY KEY, quantity INT NOT NULL DEFAULT 0, threshold INT NOT NULL DEFAULT 10, last_updated TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, FOREIGN KEY (product_id) REFERENCES products(id) );3.2 关键索引优化针对高频查询场景添加复合索引-- 订单查询优化 CREATE INDEX idx_orders_user ON orders(user_id, status); CREATE INDEX idx_orders_date ON orders(created_at); -- 商品搜索优化 CREATE FULLTEXT INDEX ft_product_search ON products(name, description);4. 核心功能实现细节4.1 增强型用户认证采用Flask-LoginFlask-Principal实现RBAC# 权限标识定义 from flask_principal import Permission, RoleNeed admin_permission Permission(RoleNeed(admin)) inventory_permission Permission(RoleNeed(inventory_manager)) # 视图保护示例 products.route(/manage) login_required admin_permission.require(http_exception403) def product_management(): pass密码安全处理方案from werkzeug.security import generate_password_hash, check_password_hash # 密码加密存储 def create_user(username, password): hashed_pw generate_password_hash( password, methodpbkdf2:sha256, salt_length16 ) user User(usernameusername, passwordhashed_pw) db.session.add(user) db.session.commit()4.2 商品管理增强功能实现批量导入导出功能app.route(/products/import, methods[POST]) def import_products(): file request.files[excel_file] if file and allowed_file(file.filename): df pd.read_excel(file) for _, row in df.iterrows(): product Product( namerow[商品名称], categoryrow[类别], pricerow[售价] ) db.session.add(product) db.session.commit() flash(f成功导入{len(df)}条商品数据, success) return redirect(url_for(product_list))图片处理最佳实践from PIL import Image import os def save_product_image(file): filename secure_filename(file.filename) filepath os.path.join(app.config[UPLOAD_FOLDER], filename) # 压缩图片到800x800 img Image.open(file) img.thumbnail((800, 800)) img.save(filepath, quality85) return filename5. 订单与库存联动处理5.1 事务型订单处理from sqlalchemy.exc import IntegrityError app.route(/checkout, methods[POST]) transactional def checkout(): try: # 步骤1创建订单主记录 order Order( user_idcurrent_user.id, totalcalculate_total() ) db.session.add(order) db.session.flush() # 获取order.id # 步骤2处理订单明细 for item in get_cart_items(): # 检查库存 inventory Inventory.query.filter_by( product_iditem.product_id ).with_for_update().first() # 加行锁 if inventory.quantity item.quantity: raise OutOfStockError(item.product.name) # 扣减库存 inventory.quantity - item.quantity # 创建订单明细 detail OrderDetail( order_idorder.id, product_iditem.product_id, quantityitem.quantity, unit_priceitem.product.price ) db.session.add(detail) # 提交事务 db.session.commit() clear_cart() return render_template(order_success.html, orderorder) except IntegrityError: db.session.rollback() flash(订单处理失败请重试, error) return redirect(url_for(cart))5.2 库存预警优化方案采用两级预警机制界面实时提醒库存量阈值时显示红色警告定时邮件通知每天18点汇总低库存商品from apscheduler.schedulers.background import BackgroundScheduler def check_inventory_levels(): with app.app_context(): low_stock db.session.execute( SELECT p.name, i.quantity, i.threshold FROM inventory i JOIN products p ON i.product_idp.id WHERE i.quantity i.threshold ).fetchall() if low_stock: send_email( subject低库存预警, templateinventory_alert, context{items: low_stock} ) # 定时任务配置 scheduler BackgroundScheduler() scheduler.add_job( funccheck_inventory_levels, triggercron, hour18, minute0 ) scheduler.start()6. 报表统计高级实现6.1 销售趋势分析使用Pandas进行数据聚合def get_sales_trend(start_date, end_date, freqD): query db.session.execute( SELECT DATE(created_at) as date, SUM(total) as amount FROM orders WHERE statuscompleted AND created_at BETWEEN :start AND :end GROUP BY DATE(created_at), {start: start_date, end: end_date} ) df pd.DataFrame(query, columns[date, amount]) df[date] pd.to_datetime(df[date]) df.set_index(date, inplaceTrue) # 按指定频率重采样 return df.resample(freq).sum().fillna(0)6.2 热力图可视化结合Matplotlib生成商品销售热力图import seaborn as sns import matplotlib.pyplot as plt def generate_heatmap(): data db.session.execute( SELECT HOUR(created_at) as hour, DAYNAME(created_at) as weekday, COUNT(*) as orders FROM orders GROUP BY HOUR(created_at), DAYNAME(created_at) ) df pd.DataFrame(data, columns[hour, weekday, orders]) pivot df.pivot(weekday, hour, orders) plt.figure(figsize(12, 6)) sns.heatmap(pivot, annotTrue, fmtd, cmapYlGnBu) plt.title(订单时间分布热力图) plt.tight_layout() # 保存到静态文件 path os.path.join(app.static_folder, images/heatmap.png) plt.savefig(path) plt.close() return path7. 部署与性能优化7.1 生产环境部署方案Nginx配置示例upstream flask_app { server 127.0.0.1:8000; server 127.0.0.1:8001; } server { listen 80; server_name supermarket.example.com; location / { proxy_pass http://flask_app; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; } location /static/ { alias /path/to/your/static/files/; expires 30d; } }Gunicorn启动脚本#!/bin/bash gunicorn -w 4 -k gevent \ --bind 0.0.0.0:8000 \ --access-logfile /var/log/gunicorn/access.log \ --error-logfile /var/log/gunicorn/error.log \ --preload \ app:create_app()7.2 缓存策略优化使用Redis实现三级缓存视图函数缓存Flask-Caching数据库查询缓存SQLAlchemy混合属性页面片段缓存Jinja2宏缓存from flask_caching import Cache cache Cache(config{ CACHE_TYPE: RedisCache, CACHE_REDIS_URL: redis://localhost:6379/0, CACHE_DEFAULT_TIMEOUT: 300 }) app.route(/products) cache.cached(timeout60, query_stringTrue) def product_list(): page request.args.get(page, 1, typeint) products Product.query.paginate(pagepage, per_page20) return render_template(products/list.html, productsproducts)8. 测试与质量保障8.1 单元测试设计模式使用工厂模式创建测试数据import factory from faker import Faker fake Faker() class UserFactory(factory.alchemy.SQLAlchemyModelFactory): class Meta: model User sqlalchemy_session db.session username factory.LazyAttribute(lambda _: fake.user_name()) password factory.LazyAttribute(lambda _: fake.password()) role customer # 测试用例示例 class OrderTestCase(TestCase): def setUp(self): self.user UserFactory.create() self.product ProductFactory(price10.0) InventoryFactory(productself.product, quantity100) def test_order_creation(self): with self.client: self.login_as(self.user) response self.add_to_cart(self.product.id, quantity2) self.assert200(response) checkout_response self.checkout() self.assertContains(checkout_response, 订单创建成功) inventory Inventory.query.get(self.product.id) self.assertEqual(inventory.quantity, 98)8.2 性能测试方案使用Locust进行压力测试from locust import HttpUser, task, between class StoreUser(HttpUser): wait_time between(1, 3) task(3) def browse_products(self): self.client.get(/products) task(1) def place_order(self): self.client.post(/cart/add, json{product_id: 1, quantity: 1}) self.client.post(/checkout, data{ name: Test User, address: 123 Test St })测试指标要求商品列表页响应时间 500ms95分位订单提交成功率 99.9%系统支持50并发用户持续操作9. 项目经验总结9.1 关键挑战与解决方案库存超卖问题 初期采用乐观锁导致高并发下订单失败率高最终方案数据库行锁SELECT FOR UPDATERedis分布式锁备用方案购物车预留库存机制报表生成性能预计算每日凌晨生成昨日统计快照分片查询大数据量时按时间范围分批处理使用Pandas替代原生SQL聚合9.2 扩展建议移动端适配开发微信小程序版本使用Flask RESTful API会员体系积分兑换、等级特权等功能扩展智能采购基于销售预测的自动补货建议多门店支持增加门店管理模块和库存调拨功能这套系统经过三个月的实际运行检验日均处理订单300在乡镇零售场景中表现出良好的稳定性和易用性。对于想学习Flask实战开发的同学建议从商品管理模块入手逐步扩展到订单和库存模块最后实现数据分析功能这样的学习路径最为高效。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价