├── service ├── user.py └── product.py ├── static ├── pic1.png └── pic2.png ├── pydmodels └── models.py ├── db ├── models.py └── database.py ├── main.py ├── routers ├── cloth.py └── user.py ├── templates ├── signup.html ├── style.css └── home.html └── .gitignore /service/user.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /static/pic1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alireza-hashemii/EcommerceFastApi/HEAD/static/pic1.png -------------------------------------------------------------------------------- /static/pic2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/alireza-hashemii/EcommerceFastApi/HEAD/static/pic2.png -------------------------------------------------------------------------------- /pydmodels/models.py: -------------------------------------------------------------------------------- 1 | from pydantic import BaseModel 2 | 3 | 4 | class User(BaseModel): 5 | name: str 6 | email: str 7 | password: int 8 | address: str | None = "" 9 | 10 | # class Choices(enum.Enum): 11 | # f = 'f' 12 | # m = 'm' 13 | 14 | # class Category(enum.Enum): 15 | # pants = 'pants' 16 | # jacket = 'jacket' 17 | # shirt = "shirt" 18 | 19 | 20 | # class ClothScheme(BaseModel): 21 | 22 | # model_config = ConfigDict(from_attributes=True) 23 | # price : float 24 | # gender : str 25 | # name : str 26 | # detail : str 27 | # category : str 28 | 29 | -------------------------------------------------------------------------------- /service/product.py: -------------------------------------------------------------------------------- 1 | from db.models import Cloth as ClothModel 2 | from sqlalchemy.orm import Session 3 | 4 | 5 | def add_product( 6 | name:str, 7 | gender:str, 8 | category:str, 9 | detail:str, 10 | price:float, 11 | db: Session, 12 | filepath: str 13 | ): 14 | new_cloth = ClothModel( 15 | name = name, 16 | gender = gender, 17 | category = category, 18 | detail = detail, 19 | price = price, 20 | image = filepath 21 | ) 22 | 23 | db.add(new_cloth) 24 | db.commit() 25 | db.refresh(new_cloth) 26 | return new_cloth -------------------------------------------------------------------------------- /db/models.py: -------------------------------------------------------------------------------- 1 | from db.database import Base 2 | from sqlalchemy import Column, Integer, String 3 | 4 | class User(Base): 5 | __tablename__ = "users" 6 | password = Column(Integer, primary_key=True) 7 | name = Column(String) 8 | email = Column(String) 9 | 10 | 11 | 12 | class Cloth(Base): 13 | __tablename__ = "cloth" 14 | _id = Column(Integer,unique=True,index=True,primary_key=True) 15 | price = Column(Integer) 16 | post_number = Column(Integer) 17 | name = Column(String) 18 | category = Column(String) 19 | gender = Column(String) 20 | detail = Column(String) 21 | image = Column(String) 22 | -------------------------------------------------------------------------------- /db/database.py: -------------------------------------------------------------------------------- 1 | from sqlalchemy import create_engine 2 | from sqlalchemy.ext.declarative import declarative_base 3 | from sqlalchemy.orm import sessionmaker 4 | 5 | SQLALCHEMY_DATABASE_URL = "sqlite:///./db.sqlite" 6 | # SQLALCHEMY_DATABASE_URL = "postgresql://user:password@postgresserver/db" 7 | 8 | engine = create_engine( 9 | SQLALCHEMY_DATABASE_URL, connect_args={"check_same_thread": False} 10 | ) 11 | SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine) 12 | 13 | Base = declarative_base() 14 | 15 | def get_db(): 16 | db = SessionLocal() 17 | try: 18 | yield db 19 | finally: 20 | db.close() -------------------------------------------------------------------------------- /main.py: -------------------------------------------------------------------------------- 1 | from fastapi import FastAPI 2 | from fastapi.staticfiles import StaticFiles 3 | from db.database import engine 4 | from db import models 5 | from starlette.templating import Jinja2Templates 6 | from routers import user, cloth 7 | 8 | 9 | app = FastAPI() 10 | app.mount("/static", StaticFiles(directory="static"), name="static") 11 | app.include_router(user.router) 12 | app.include_router(cloth.router) 13 | 14 | 15 | 16 | templates = Jinja2Templates(directory="templates") 17 | models.Base.metadata.create_all(bind=engine) 18 | 19 | 20 | # if __name__ == "__main__": 21 | # uvicorn.run(app=app, host="127.0.0.1",port=8500,reload_delay= True,workers= True) 22 | -------------------------------------------------------------------------------- /routers/cloth.py: -------------------------------------------------------------------------------- 1 | from fastapi import APIRouter, UploadFile, Depends 2 | from sqlalchemy.orm import Session 3 | from db.database import get_db 4 | from service import product 5 | import os 6 | import time 7 | 8 | 9 | router = APIRouter() 10 | 11 | 12 | BASE_DIR = os.path.dirname(os.path.abspath(__file__)) 13 | MBASE = BASE_DIR.split("/") 14 | splited = MBASE[0:len(MBASE)-1] 15 | jk = "\\".join(splited) 16 | UPLOAD_DIR = os.path.join(jk, "static") 17 | 18 | n = 1 19 | 20 | 21 | @router.post("/file/upload") 22 | def upload_a_file( 23 | name: str, 24 | gender: str, 25 | category: str, 26 | price: float, 27 | detail: str, 28 | file: UploadFile, 29 | postnumber: int, 30 | db: Session = Depends(get_db) 31 | ): 32 | 33 | new_filename = "{}{}.png".format("pic", postnumber) 34 | SAVE_FILE_PATH = os.path.join(UPLOAD_DIR, new_filename) 35 | with open(SAVE_FILE_PATH, "wb") as f: 36 | f.write(file.file.read()) 37 | 38 | return product.add_product(name, gender, category, detail, price, db, SAVE_FILE_PATH) 39 | -------------------------------------------------------------------------------- /routers/user.py: -------------------------------------------------------------------------------- 1 | from fastapi import APIRouter, Depends, Form, status 2 | from fastapi import Request 3 | from sqlalchemy.orm import Session 4 | from db.database import get_db 5 | from starlette.responses import RedirectResponse 6 | from db import models 7 | from starlette.templating import Jinja2Templates 8 | from sqlalchemy.orm import Session 9 | 10 | 11 | 12 | router = APIRouter() 13 | 14 | templates = Jinja2Templates(directory="templates") 15 | 16 | 17 | 18 | @router.get("/") 19 | def signup(request: Request): 20 | return templates.TemplateResponse("signup.html", {"request": request}) 21 | 22 | 23 | @router.get("/home") 24 | def home(request: Request,db:Session = Depends(get_db)): 25 | products = db.query(models.Cloth).all() 26 | return templates.TemplateResponse("home.html", {"request": request,"products":products}) 27 | 28 | 29 | @router.post("/add") 30 | def user_add(request: Request, 31 | username: str = Form( 32 | media_type="application/x-www-form-urlencoded"), 33 | email: str = Form(media_type="application/x-www-form-urlencoded"), 34 | password: int = Form( 35 | media_type="application/x-www-form-urlencoded"), 36 | db: Session = Depends(get_db) 37 | ): 38 | 39 | url = router.url_path_for("home") 40 | return RedirectResponse(url=url, status_code=status.HTTP_303_SEE_OTHER) 41 | 42 | 43 | @router.get("/update") 44 | def user_update(): 45 | pass 46 | 47 | 48 | @router.get("/read") 49 | def user_read(): 50 | pass 51 | 52 | 53 | @router.get("/delete") 54 | def user_delete(): 55 | pass 56 | -------------------------------------------------------------------------------- /templates/signup.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CodePen - Glassmorphism login Form Tutorial in html css 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | Glassmorphism login Form Tutorial in html css 16 | 17 | 18 | 19 | 20 | 21 | 146 | 147 | 148 |
149 |
150 |
151 |
152 |
153 | 154 | 155 | 156 | 157 | 158 | 159 | 160 | 161 | 162 | 163 | 164 | 168 |
169 | 170 | 171 | 172 | 173 | 174 | 175 | -------------------------------------------------------------------------------- /templates/style.css: -------------------------------------------------------------------------------- 1 | * { padding:0; margin:0; outline:0; } 2 | body { 3 | background:#fff url(images/body.gif) repeat-x 0 0; 4 | font-family: "Trebuchet MS", Arial, sans-serif; 5 | font-size:12px; 6 | line-height:16px; 7 | color:#636363; 8 | } 9 | input, textarea, select { font-family: "Trebuchet MS", Arial, sans-serif; font-size:12px; } 10 | 11 | .field { background:#ebebeb; border:solid 1px #dedede; padding:2px;} 12 | 13 | a img { border:0; } 14 | 15 | a { color:#8b0000; text-decoration: underline; cursor:pointer; } 16 | a:hover { color:#666; text-decoration: none; } 17 | 18 | .left, .alignleft { float:left; display:inline; } 19 | .right, .alignright { float:right; display:inline; } 20 | 21 | .cl { font-size:0; line-height:0; clear:both; display:block; height:0; } 22 | 23 | .al { text-align: left; } 24 | .ar { text-align: right; } 25 | .ac { text-align: center; } 26 | 27 | h2 { font-size:14px; line-height:16px; } 28 | h3 { font-size:12px; line-height:14px; text-transform: uppercase; color:#000; } 29 | h4 { font-size:12px; line-height:14px; text-transform: uppercase; color:#000; } 30 | 31 | 32 | h1#logo { font-size:0; line-height:0; width:156px; height:64px; float:left; } 33 | h1#logo a{ display:block; height:64px; text-indent: -4000px; background:url(images/logo.gif); } 34 | 35 | .shell { width:960px; margin:0 auto; padding:10px; background:#fff; } 36 | 37 | #header { height:64px; background:url(images/header.gif); position:relative;} 38 | 39 | #navigation { float:right; white-space:nowrap; } 40 | #navigation ul{ list-style-type: none; height:64px; font-weight: bold; float:left;} 41 | #navigation ul li{ float:left; display:inline; } 42 | #navigation ul li a{ float:left; height:64px; line-height:64px; text-decoration: none; color:#fff; padding:0 15px;} 43 | #navigation ul li a.active, 44 | #navigation ul li a:hover{ background:#fff; color:#8b0000; } 45 | 46 | #cart { float:right; width:160px; top:0; right:0; height:51px; background:#8b0000; color:#fff; padding:13px 10px 0 10px; white-space:nowrap; line-height:20px;} 47 | a.cart-link { color:#fff; background:url(images/cart-link.gif) no-repeat 0 0; padding:0 0 0 32px; text-decoration: none;} 48 | a.cart-link:hover { text-decoration: underline;} 49 | 50 | #sidebar { float:left; width:226px;} 51 | #content { float:right; width:724px;} 52 | 53 | #main { padding:10px 0 0 0; } 54 | 55 | .box { padding:1px; border:solid 1px #dedede; margin-bottom:10px;} 56 | .box h2{ background:#7f7f7f; color:#fff; font-weight: normal; padding:0 5px; position:relative; height:27px; line-height:27px; } 57 | .box h2 span{ position:absolute; width:10px; height:5px; background:url(images/h2-arr.gif); top:27px; right:10px; font-size:0; line-height:0;} 58 | .box-content { padding:5px;} 59 | 60 | a.bul { background:url(images/bul.gif) no-repeat 0 center; padding-left:10px;} 61 | 62 | .search { min-height:252px;} 63 | .search label { display:block; padding-bottom:3px; } 64 | 65 | .search .field { display:block; margin-bottom:10px; } 66 | .search .inline-field label { display:inline; padding:0; } 67 | .search .inline-field .field { display:inline; margin:0; } 68 | .search input.field { width:206px; } 69 | .search select.field { width:212px; } 70 | .search select.small-field { width:50px; } 71 | 72 | .search-submit { width:70px; background:#8b0000; border:0; color:#fff; height:27px; display:block; line-height:26px; cursor:pointer; margin:12px 0 10px 0;} 73 | 74 | .categories { min-height:383px; } 75 | .categories ul { list-style-type: none; font-size:13px;} 76 | .categories ul li{ border-bottom:dashed 1px #ccc; padding:5px 0;} 77 | .categories ul li.last{ border-bottom:0; padding-bottom:0;} 78 | .categories ul li a{ color:#5f5f5f; text-decoration: none; background:url(images/cat.gif) no-repeat 0 4px; padding-left:17px;} 79 | .categories ul li a:hover{ color:#8b0000; } 80 | 81 | #slider { height:252px; position:relative; overflow:hidden; } 82 | #slider-holder { width:720px; height:252px; position:relative; overflow:hidden; } 83 | #slider-holder .jcarousel-clip{ width:720px; height:252px; position:relative; overflow:hidden; } 84 | #slider-holder ul{ width:720px; height:252px; position:relative; overflow:hidden; list-style-type: none;} 85 | #slider-holder ul li{ width:720px; height:252px; position:relative; overflow:hidden; float:left; } 86 | 87 | #slider-nav { position:absolute; top:231px; left:644px; z-index:2;} 88 | #slider-nav a{ font-size:0; line-height:0; text-indent: -4000px; width:10px; height:10px; border:solid 1px #8b0000; background:#8b0000; float:left; margin-right:5px; } 89 | #slider-nav a:hover, 90 | #slider-nav a.active { background:#fff;} 91 | 92 | .products {} 93 | .products ul{ list-style-type: none;} 94 | .products ul li{ position:relative; padding:1px; border:solid 1px #dedede; float:left; width:231px; margin-right:9px; height:383px; overflow:hidden; } 95 | .products ul li.last{ margin-right:0; } 96 | 97 | .product-info{ position:absolute; width:153px; top:194px; left:0;} 98 | .product-info h3{ background:#8b0000; color:#fff; padding:6px 10px; } 99 | .product-info h4{ font-weight: normal;} 100 | .product-info p{ font-size:16px; line-height:18px; text-transform: uppercase; font-weight: bold; color:#000; padding:5px 0 7px 0;} 101 | .product-info .product-desc{ padding:10px; background:url(images/info.png); width:133px; } 102 | 103 | .price { display:block; font-size:21px; color:#8b0000; line-height:23px; } 104 | 105 | .more-products { border:solid 1px #dedede; position:relative; height:114px; overflow:hidden; } 106 | .more-products ul{ list-style-type: none; height:94px; position:relative; overflow:hidden; width:805px;} 107 | .more-products ul li{ float:left; width:94px; height:94px; border-right:dashed 1px #ccc; padding:0 10px;} 108 | .more-products ul li.last{ border-right:0; } 109 | 110 | .more-products-holder { width:804px; height:94px; position:relative; overflow:hidden; top:10px; left:70px;} 111 | .more-products-holder .jcarousel-clip{ width:804px; height:94px; position:relative; overflow:hidden; } 112 | 113 | .more-nav { font-size:0; line-height:0;} 114 | .more-nav a{ position:absolute; top:40px; left:0; width:30px; height:32px; text-indent: -4000px; z-index:3;} 115 | .more-nav a.next{ background:url(images/next.gif); left:910px;} 116 | .more-nav a.prev{ background:url(images/prev.gif); left:20px;} 117 | 118 | .cols { padding:15px 0;} 119 | .col { float:left; display:inline; width:217px; margin-right:30px;} 120 | .col-last { margin-right:0;} 121 | 122 | h3.ico { background-repeat:no-repeat; background-position:0 2px; padding:6px 0 8px 30px;} 123 | h3.ico1 { background-image:url(images/ico1.gif);} 124 | h3.ico2 { background-image:url(images/ico2.gif);} 125 | h3.ico3 { background-image:url(images/ico3.gif);} 126 | h3.ico4 { background-image:url(images/ico4.gif);} 127 | 128 | #footer { height:51px; background:#ebebeb; white-space:nowrap; line-height:50px; padding:0 15px; color:#7b7b7b; margin-top:10px;} 129 | #footer a{ color:#7b7b7b; text-decoration: none;} 130 | #footer a:hover{ color:#000;} 131 | #footer span{ padding:0 2px;} -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Created by https://www.toptal.com/developers/gitignore/api/visualstudiocode,windows,python,pythonvanilla,venv,virtuoso,git,database 2 | # Edit at https://www.toptal.com/developers/gitignore?templates=visualstudiocode,windows,python,pythonvanilla,venv,virtuoso,git,database 3 | 4 | ### Database ### 5 | *.accdb 6 | *.db 7 | *.dbf 8 | *.mdb 9 | *.pdb 10 | *.sqlite3 11 | *.db-shm 12 | *.db-wal 13 | *.sqlite 14 | files 15 | *.files 16 | ### Git ### 17 | # Created by git for backups. To disable backups in Git: 18 | # $ git config --global mergetool.keepBackup false 19 | *.orig 20 | 21 | # Created by git when using merge tools for conflicts 22 | *.BACKUP.* 23 | *.BASE.* 24 | *.LOCAL.* 25 | *.REMOTE.* 26 | *_BACKUP_*.txt 27 | *_BASE_*.txt 28 | *_LOCAL_*.txt 29 | *_REMOTE_*.txt 30 | 31 | ### Python ### 32 | # Byte-compiled / optimized / DLL files 33 | __pycache__/ 34 | *.py[cod] 35 | *$py.class 36 | 37 | # C extensions 38 | *.so 39 | 40 | # Distribution / packaging 41 | .Python 42 | build/ 43 | develop-eggs/ 44 | dist/ 45 | downloads/ 46 | eggs/ 47 | .eggs/ 48 | lib/ 49 | lib64/ 50 | parts/ 51 | sdist/ 52 | var/ 53 | wheels/ 54 | share/python-wheels/ 55 | *.egg-info/ 56 | .installed.cfg 57 | *.egg 58 | MANIFEST 59 | 60 | # PyInstaller 61 | # Usually these files are written by a python script from a template 62 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 63 | *.manifest 64 | *.spec 65 | 66 | # Installer logs 67 | pip-log.txt 68 | pip-delete-this-directory.txt 69 | 70 | # Unit test / coverage reports 71 | htmlcov/ 72 | .tox/ 73 | .nox/ 74 | .coverage 75 | .coverage.* 76 | .cache 77 | nosetests.xml 78 | coverage.xml 79 | *.cover 80 | *.py,cover 81 | .hypothesis/ 82 | .pytest_cache/ 83 | cover/ 84 | 85 | # Translations 86 | *.mo 87 | *.pot 88 | 89 | # Django stuff: 90 | *.log 91 | local_settings.py 92 | db.sqlite3 93 | db.sqlite3-journal 94 | 95 | # Flask stuff: 96 | instance/ 97 | .webassets-cache 98 | 99 | # Scrapy stuff: 100 | .scrapy 101 | 102 | # Sphinx documentation 103 | docs/_build/ 104 | 105 | # PyBuilder 106 | .pybuilder/ 107 | target/ 108 | 109 | # Jupyter Notebook 110 | .ipynb_checkpoints 111 | 112 | # IPython 113 | profile_default/ 114 | ipython_config.py 115 | 116 | # pyenv 117 | # For a library or package, you might want to ignore these files since the code is 118 | # intended to run in multiple environments; otherwise, check them in: 119 | # .python-version 120 | 121 | # pipenv 122 | # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. 123 | # However, in case of collaboration, if having platform-specific dependencies or dependencies 124 | # having no cross-platform support, pipenv may install dependencies that don't work, or not 125 | # install all needed dependencies. 126 | #Pipfile.lock 127 | 128 | # poetry 129 | # Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control. 130 | # This is especially recommended for binary packages to ensure reproducibility, and is more 131 | # commonly ignored for libraries. 132 | # https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control 133 | #poetry.lock 134 | 135 | # pdm 136 | # Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control. 137 | #pdm.lock 138 | # pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it 139 | # in version control. 140 | # https://pdm.fming.dev/#use-with-ide 141 | .pdm.toml 142 | 143 | # PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm 144 | __pypackages__/ 145 | 146 | # Celery stuff 147 | celerybeat-schedule 148 | celerybeat.pid 149 | 150 | # SageMath parsed files 151 | *.sage.py 152 | 153 | # Environments 154 | .env 155 | .venv 156 | env/ 157 | venv/ 158 | ENV/ 159 | env.bak/ 160 | venv.bak/ 161 | 162 | # Spyder project settings 163 | .spyderproject 164 | .spyproject 165 | 166 | # Rope project settings 167 | .ropeproject 168 | 169 | # mkdocs documentation 170 | /site 171 | 172 | # mypy 173 | .mypy_cache/ 174 | .dmypy.json 175 | dmypy.json 176 | 177 | # Pyre type checker 178 | .pyre/ 179 | 180 | # pytype static type analyzer 181 | .pytype/ 182 | 183 | # Cython debug symbols 184 | cython_debug/ 185 | 186 | # PyCharm 187 | # JetBrains specific template is maintained in a separate JetBrains.gitignore that can 188 | # be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore 189 | # and can be added to the global gitignore or merged into this file. For a more nuclear 190 | # option (not recommended) you can uncomment the following to ignore the entire idea folder. 191 | #.idea/ 192 | 193 | ### Python Patch ### 194 | # Poetry local configuration file - https://python-poetry.org/docs/configuration/#local-configuration 195 | poetry.toml 196 | 197 | # ruff 198 | .ruff_cache/ 199 | 200 | # LSP config files 201 | pyrightconfig.json 202 | 203 | ### PythonVanilla ### 204 | # Byte-compiled / optimized / DLL files 205 | 206 | # C extensions 207 | 208 | # Distribution / packaging 209 | 210 | # Installer logs 211 | 212 | # Unit test / coverage reports 213 | 214 | # Translations 215 | 216 | # pyenv 217 | # For a library or package, you might want to ignore these files since the code is 218 | # intended to run in multiple environments; otherwise, check them in: 219 | # .python-version 220 | 221 | # pipenv 222 | # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. 223 | # However, in case of collaboration, if having platform-specific dependencies or dependencies 224 | # having no cross-platform support, pipenv may install dependencies that don't work, or not 225 | # install all needed dependencies. 226 | 227 | # PEP 582; used by e.g. github.com/David-OConnor/pyflow 228 | 229 | 230 | ### venv ### 231 | # Virtualenv 232 | # http://iamzed.com/2009/05/07/a-primer-on-virtualenv/ 233 | [Bb]in 234 | [Ii]nclude 235 | [Ll]ib 236 | [Ll]ib64 237 | [Ll]ocal 238 | [Ss]cripts 239 | pyvenv.cfg 240 | pip-selfcheck.json 241 | 242 | ### Virtuoso ### 243 | # Gitignore for Cadence Virtuoso 244 | ################################################################ 245 | 246 | # Log files 247 | panic*.log.* 248 | 249 | # OpenAccess database lock files 250 | *.cdslck* 251 | 252 | # Run directories for layout vs. schematic and design rule check 253 | lvsRunDir/* 254 | drcRunDir/* 255 | 256 | # Abstract generation tool 257 | abstract.log* 258 | abstract.record* 259 | 260 | 261 | ### VisualStudioCode ### 262 | .vscode/* 263 | !.vscode/settings.json 264 | !.vscode/tasks.json 265 | !.vscode/launch.json 266 | !.vscode/extensions.json 267 | !.vscode/*.code-snippets 268 | 269 | # Local History for Visual Studio Code 270 | .history/ 271 | 272 | # Built Visual Studio Code Extensions 273 | *.vsix 274 | 275 | ### VisualStudioCode Patch ### 276 | # Ignore all local history of files 277 | .history 278 | .ionide 279 | 280 | ### Windows ### 281 | # Windows thumbnail cache files 282 | Thumbs.db 283 | Thumbs.db:encryptable 284 | ehthumbs.db 285 | ehthumbs_vista.db 286 | 287 | # Dump file 288 | *.stackdump 289 | 290 | # Folder config file 291 | [Dd]esktop.ini 292 | 293 | # Recycle Bin used on file shares 294 | $RECYCLE.BIN/ 295 | 296 | # Windows Installer files 297 | *.cab 298 | *.msi 299 | *.msix 300 | *.msm 301 | *.msp 302 | 303 | # Windows shortcuts 304 | *.lnk 305 | 306 | # End of https://www.toptal.com/developers/gitignore/api/visualstudiocode,windows,python,pythonvanilla,venv,virtuoso,git,database -------------------------------------------------------------------------------- /templates/home.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Shop Around 5 | 6 | 7 | 8 | 9 | 10 | 147 | 148 | 149 | 150 | 151 | 152 |
153 | 154 | 173 | 174 | 175 |
176 |
 
177 | 178 |
179 | 180 |
181 |
182 |
    183 |
  • 184 |
  • 185 |
  • 186 |
  • 187 |
188 |
189 |
1 2 3 4
190 |
191 | 192 | 193 |
194 |
 
195 | 196 | 197 | 198 |
    199 | {% for product in products %} 200 |
  • 201 |
    202 |

    {{product.name}}

    203 |
    204 |

    {{product.gender}}

    205 |

    {{product.detail}}

    206 | ${{product.price}}
    207 |
    208 |
  • 209 | {% endfor %} 210 |
211 | 212 | 213 |
 
214 |
215 | 216 |
217 | 218 | 219 | 271 | 272 |
 
273 |
274 | 275 | 276 |
277 | 278 |
279 |
280 |
    281 |
  • 282 |
  • 283 |
  • 284 |
  • 285 |
  • 286 |
  • 287 |
  • 288 |
  • 289 |
  • 290 |
  • 291 |
  • 292 |
  • 293 |
  • 294 |
  • 295 |
  • 296 |
  • 297 |
  • 298 |
  • 299 |
  • 300 |
  • 301 |
  • 302 |
303 |
304 | 305 |
306 | 307 | 308 |
309 |
 
310 |
311 |

Donec imperdiet

312 |

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec imperdiet, metus ac cursus auctor, arcu felis ornare dui.

313 |

Lorem ipsum

314 |
315 |
316 |

Donec imperdiet

317 |

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec imperdiet, metus ac cursus auctor, arcu felis ornare dui.

318 |

Lorem ipsum

319 |
320 |
321 |

Donec imperdiet

322 |

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec imperdiet, metus ac cursus auctor, arcu felis ornare dui.

323 |

Lorem ipsum

324 |
325 |
326 |

Donec imperdiet

327 |

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec imperdiet, metus ac cursus auctor, arcu felis ornare dui.

328 |

Lorem ipsum

329 |
330 |
 
331 |
332 | 333 |
334 | 335 | 336 | 340 | 341 |
342 | 343 | 344 | 345 | 346 | 347 | 348 | 349 | 350 | 351 | 352 | 353 | 354 | 355 | 356 | 357 | 358 | 359 | 360 | 361 | 362 | 363 | 364 | 504 | 554 | 555 | 556 | 557 | 558 | --------------------------------------------------------------------------------