Work
05 Full-Stack · E-Commerce

USMart

A full-stack, single-store e-commerce application built as a personal showcase project, tracing the complete path from product discovery and a persistent cart through authenticated checkout to customer order history and merchant fulfillment.

Role

Independent Design & Full-Stack Development

Type

Personal Showcase Project

Status

Completed Functional Prototype

Primary Stack

Flask · SQLAlchemy · Vanilla JS

Overview

More than a storefront

The interesting part isn't that it has a shop front; it's how discovery, cart, authentication, checkout and fulfillment connect into one workflow.

USMart is a full-stack, single-store e-commerce web application, designed and built independently as a personal showcase project. A database-backed catalog spans five categories (Electronics, Clothing, Accessories, Home and Sports) with server-side search and filtering, a persistent shopping cart, authenticated checkout and a merchant console for fulfilling the orders it creates.

USMart homepage hero with a headline, an Explore Collection call to action and a product cover image
Homepage: USMart

Product Discovery

Search and browse, kept deliberately simple

Product-name search and category filtering can be combined; no sorting, no recommendations, no full-text search.

Search

Server-side, partial, case-insensitive product-name search, implemented through SQLAlchemy ILIKE.

Category filter

Exact-match filtering across Electronics, Clothing, Accessories, Home and Sports, combinable with search.

Product model

Name, description, price, category, one image, integer stock, aggregate rating and review count.

USMart collection page with a search field and category filter pills above a product grid
The Collection: search & category filters

Product & Reviews

Price, stock and reviews on one page

Each product page shows price, description, numeric stock and an aggregate rating drawn from customer reviews, with a quantity selector feeding Add to Cart or Buy Now. Reviews are database-backed: an authenticated customer submits a 1–5 rating with a required comment, and the backend recalculates the product's average rating and review count after each submission.

USMart product detail page for a Merino Wool Sweater showing rating, price, description and stock
Product detail: price, stock & reviews

Cart & Continuity

A cart that survives login

Guest carts live in the browser, not the database; signing in doesn't lose them.

Guest Browsing
Persistent Guest CartLocalStorage
Login / Register
Customer Cart MergeGuest items folded into the account cart
Checkout

Guest carts are stored in the browser's LocalStorage; once a customer registers or logs in, those items are merged into a user-specific LocalStorage cart so nothing they added is lost. At checkout, only product IDs and quantities are sent to Flask: the server recalculates the total from current database prices, so a browser-cached price is never authoritative.

USMart cart drawer showing the Merino Wool Sweater, quantity controls and a Proceed to Checkout button
Cart drawer: quantity, remove & total
USMart sign-in screen with the cart icon still showing one item carried over from before login
Sign in: the guest cart carries through

Checkout

Simulated checkout, a real order

The UI collects shipping details and card fields, but there's no payment gateway behind it: this is simulated order placement, not payment processing.

01

Shipping Details

Name, address, city, ZIP & country

02

Authentication Required

03

Server Recalculates Total

From current database prices

04

Order + OrderItems Persisted

Each item keeps a price snapshot

05

Cart Cleared

06

Order ID Returned

On success, the server creates an Order with the user, recalculated total, shipping address and a Processing status, alongside one OrderItem per line (each storing its own price snapshot) and returns the new order's numeric ID, which the confirmation screen shows alongside the final total.

Order Lifecycle

From Processing to fulfilled, or cancelled

Customers can cancel their own order for as long as it stays in Processing.

Processing
Dispatched
↓
Shipped
↓
Delivered
Cancelled

Customers can review their previous orders, each order's line items, shipping address, date, total and current fulfillment status.

Merchant Console

Running the store from the other side

Fulfillment, inventory and a stock-based category view, in one console.

USMart Merchant Console showing total revenue, order and low-stock tiles above a customer orders fulfillment table
Merchant Console: revenue, orders & low-stock tiles
USMart merchant analytics panel showing a donut chart of current stock units grouped by category
Inventory category composition: current stock by category

The console surfaces total revenue from non-cancelled orders, total and active order counts, and a low-stock count for products under 15 units, alongside the complete order history and a product/inventory table. The category chart groups current stock quantities by category: stock visibility, not a sales breakdown, whatever its on-screen label reads. From here, a merchant can create, edit or permanently delete products (name, description, price, category, stock and image, uploaded locally or linked by URL) and move each order forward through its fulfillment status.

Architecture

A framework-free frontend over a small Flask API

One static HTML document behaves like an SPA: page-like sections swapped through direct DOM manipulation, no frontend framework underneath. That choice is deliberate: it sets USMart apart from the more framework-heavy projects elsewhere in this portfolio.

BrowserHTML5 · CSS3 · Vanilla JavaScript
LocalStorageJWT / user state · guest & customer cart · theme
Fetch API
Flask REST-style APIJWT auth · products/reviews · customer orders · merchant routes · image upload
SQLAlchemy ORM
SQLiteUser · Product · Review · Order · OrderItem

The relationships stay simple: a User has many Orders, each Order has many OrderItems referencing a Product, and each Product accumulates Reviews independently: a Review stores the reviewer's name as text rather than a foreign key back to User.

Stack

Technology

Frontend

HTML5CSS3Vanilla JavaScriptFetch APILocalStorage

Backend

PythonFlaskFlask-CORS

Persistence

SQLiteFlask-SQLAlchemySQLAlchemy

Authentication

PyJWTWerkzeug Password Hashing

Media

Local File UploadsExternal Image URLs