├── 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 |
152 |
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 |
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 |
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 |
--------------------------------------------------------------------------------