push node module 'caus lazy
ingnore node_modules, dont't be stupid
This commit is contained in:
@@ -88,6 +88,7 @@ start the database with `docker compose up`
|
|||||||
then start the api with the following command:
|
then start the api with the following command:
|
||||||
`uv run fastapi dev test.py`
|
`uv run fastapi dev test.py`
|
||||||
builting api doc can be found at [](http://localhost:8000/docs)
|
builting api doc can be found at [](http://localhost:8000/docs)
|
||||||
|
Data are serilized and validate with pydantic
|
||||||
|
|
||||||
# Documentation
|
# Documentation
|
||||||
[fastapi](https://fastapi.tiangolo.com/tutorial/)
|
[fastapi](https://fastapi.tiangolo.com/tutorial/)
|
||||||
|
|||||||
6
back/Dockerfile
Normal file
6
back/Dockerfile
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
from docker.io/library/python@sha256:6bf9e7405389a4409832f3adee8a906fbe03982449b9d8df6a323f00109476bb
|
||||||
|
run [ "pip", "install", "uv" ]
|
||||||
|
copy . /app
|
||||||
|
workdir /app
|
||||||
|
run ["uv", "sync"]
|
||||||
|
cmd [ "uv", "run", "fastapi", "run", "main.py" ]
|
||||||
Binary file not shown.
38
back/main.py
38
back/main.py
@@ -1,9 +1,9 @@
|
|||||||
from typing import Union
|
from fastapi.middleware.cors import CORSMiddleware
|
||||||
from fastapi import FastAPI, HTTPException
|
from fastapi import FastAPI, HTTPException
|
||||||
from src.mongo import getMongo
|
from src.mongo import getMongo
|
||||||
from pydantic import BaseModel
|
from pydantic import BaseModel
|
||||||
from uuid import UUID, uuid4
|
|
||||||
from http import HTTPStatus
|
from http import HTTPStatus
|
||||||
|
import os
|
||||||
|
|
||||||
|
|
||||||
class DirectorInput(BaseModel):
|
class DirectorInput(BaseModel):
|
||||||
@@ -13,7 +13,7 @@ class DirectorInput(BaseModel):
|
|||||||
|
|
||||||
|
|
||||||
class Director(DirectorInput):
|
class Director(DirectorInput):
|
||||||
id: str
|
_id: str
|
||||||
|
|
||||||
|
|
||||||
class MovieInput(BaseModel):
|
class MovieInput(BaseModel):
|
||||||
@@ -24,7 +24,7 @@ class MovieInput(BaseModel):
|
|||||||
|
|
||||||
|
|
||||||
class Movie(MovieInput):
|
class Movie(MovieInput):
|
||||||
id: str
|
_id: str
|
||||||
director: Director
|
director: Director
|
||||||
|
|
||||||
|
|
||||||
@@ -37,13 +37,21 @@ class ReviewInput(BaseModel):
|
|||||||
|
|
||||||
|
|
||||||
class Review(ReviewInput):
|
class Review(ReviewInput):
|
||||||
id: str
|
_id: str
|
||||||
|
|
||||||
|
|
||||||
db, client = getMongo()
|
db, client = getMongo(os.environ.get("DB_URI", None))
|
||||||
|
|
||||||
app = FastAPI()
|
app = FastAPI()
|
||||||
|
|
||||||
|
app.add_middleware(
|
||||||
|
CORSMiddleware,
|
||||||
|
allow_origins=['*'],
|
||||||
|
allow_credentials=True,
|
||||||
|
allow_methods=["*"],
|
||||||
|
allow_headers=["*"],
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
@app.get("/directors")
|
@app.get("/directors")
|
||||||
def getDirectors() -> list[Director]:
|
def getDirectors() -> list[Director]:
|
||||||
@@ -57,7 +65,7 @@ def getDirector(director_id: str):
|
|||||||
|
|
||||||
@app.post("/directors")
|
@app.post("/directors")
|
||||||
def addDirector(director: DirectorInput) -> Director:
|
def addDirector(director: DirectorInput) -> Director:
|
||||||
director = Director(**director.model_dump(), id=str(uuid4()))
|
director = Director(**director.model_dump())
|
||||||
db["directors"].insert_one(director.model_dump())
|
db["directors"].insert_one(director.model_dump())
|
||||||
return director
|
return director
|
||||||
|
|
||||||
@@ -66,9 +74,9 @@ def addDirector(director: DirectorInput) -> Director:
|
|||||||
def updateDirector(director_id: str, director: DirectorInput) -> Director:
|
def updateDirector(director_id: str, director: DirectorInput) -> Director:
|
||||||
db["directors"].replace_one(
|
db["directors"].replace_one(
|
||||||
{"id": director_id},
|
{"id": director_id},
|
||||||
Director(id=director_id, **director.model_dump()).model_dump(),
|
Director(_id=director_id, **director.model_dump()).model_dump(),
|
||||||
)
|
)
|
||||||
return Director(id=director_id, **director.model_dump())
|
return Director(_id=director_id, **director.model_dump())
|
||||||
|
|
||||||
|
|
||||||
@app.delete("/directors/{director_id}")
|
@app.delete("/directors/{director_id}")
|
||||||
@@ -97,7 +105,7 @@ def addMovie(movie: MovieInput) -> Movie:
|
|||||||
raise HTTPException(
|
raise HTTPException(
|
||||||
status_code=404, detail=f"director with id '{movie.director_id}' not found"
|
status_code=404, detail=f"director with id '{movie.director_id}' not found"
|
||||||
)
|
)
|
||||||
movie = Movie(**movie.model_dump(), id=str(uuid4()))
|
movie = Movie(**movie.model_dump())
|
||||||
db["movies"].insert_one(movie.model_dump())
|
db["movies"].insert_one(movie.model_dump())
|
||||||
return movie
|
return movie
|
||||||
|
|
||||||
@@ -109,9 +117,9 @@ def updateMovie(movie_id: str, movie: MovieInput) -> Movie:
|
|||||||
|
|
||||||
db["movies"].replace_one(
|
db["movies"].replace_one(
|
||||||
{"id": movie_id},
|
{"id": movie_id},
|
||||||
Movie(id=movie_id, **movie.model_dump()).model_dump(),
|
Movie(_id=movie_id, **movie.model_dump()).model_dump(),
|
||||||
)
|
)
|
||||||
return Movie(id=movie_id, **movie.model_dump())
|
return Movie(_id=movie_id, **movie.model_dump())
|
||||||
|
|
||||||
|
|
||||||
@app.delete("/movies/{movie_id}")
|
@app.delete("/movies/{movie_id}")
|
||||||
@@ -139,7 +147,7 @@ def addReview(review: ReviewInput) -> Review:
|
|||||||
raise HTTPException(
|
raise HTTPException(
|
||||||
status_code=404, detail=f"movie with id '{review.movie_id}' not found"
|
status_code=404, detail=f"movie with id '{review.movie_id}' not found"
|
||||||
)
|
)
|
||||||
review = Review(**review.model_dump(), id=str(uuid4()))
|
review = Review(**review.model_dump())
|
||||||
db["reviews"].insert_one(review.model_dump())
|
db["reviews"].insert_one(review.model_dump())
|
||||||
return review
|
return review
|
||||||
|
|
||||||
@@ -151,9 +159,9 @@ def updateReview(review_id: str, review: Review) -> Review:
|
|||||||
|
|
||||||
db["reviews"].replace_one(
|
db["reviews"].replace_one(
|
||||||
{"id": review_id},
|
{"id": review_id},
|
||||||
Review(id=review_id, **review.model_dump()).model_dump(),
|
Review(_id=review_id, **review.model_dump()).model_dump(),
|
||||||
)
|
)
|
||||||
return Review(id=review_id, **review.model_dump())
|
return Review(_id=review_id, **review.model_dump())
|
||||||
|
|
||||||
|
|
||||||
@app.delete("/reviews/{review_id}")
|
@app.delete("/reviews/{review_id}")
|
||||||
|
|||||||
Binary file not shown.
15
back/src/back.egg-info/PKG-INFO
Normal file
15
back/src/back.egg-info/PKG-INFO
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
Metadata-Version: 2.4
|
||||||
|
Name: back
|
||||||
|
Version: 0.1.0
|
||||||
|
Summary: Add your description here
|
||||||
|
Requires-Python: >=3.13
|
||||||
|
Description-Content-Type: text/markdown
|
||||||
|
Requires-Dist: fastapi[standard]>=0.125.0
|
||||||
|
Requires-Dist: pymongo>=4.15.5
|
||||||
|
|
||||||
|
# Installation
|
||||||
|
download dependencies and create a venv for the project
|
||||||
|
`uv sync`
|
||||||
|
|
||||||
|
# Test
|
||||||
|
`uv run fastapi dev test.py`
|
||||||
10
back/src/back.egg-info/SOURCES.txt
Normal file
10
back/src/back.egg-info/SOURCES.txt
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
README.md
|
||||||
|
pyproject.toml
|
||||||
|
src/__init__.py
|
||||||
|
src/import.py
|
||||||
|
src/mongo.py
|
||||||
|
src/back.egg-info/PKG-INFO
|
||||||
|
src/back.egg-info/SOURCES.txt
|
||||||
|
src/back.egg-info/dependency_links.txt
|
||||||
|
src/back.egg-info/requires.txt
|
||||||
|
src/back.egg-info/top_level.txt
|
||||||
1
back/src/back.egg-info/dependency_links.txt
Normal file
1
back/src/back.egg-info/dependency_links.txt
Normal file
@@ -0,0 +1 @@
|
|||||||
|
|
||||||
2
back/src/back.egg-info/requires.txt
Normal file
2
back/src/back.egg-info/requires.txt
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
fastapi[standard]>=0.125.0
|
||||||
|
pymongo>=4.15.5
|
||||||
3
back/src/back.egg-info/top_level.txt
Normal file
3
back/src/back.egg-info/top_level.txt
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
__init__
|
||||||
|
import
|
||||||
|
mongo
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
from pymongo import MongoClient
|
from pymongo import MongoClient
|
||||||
def getMongo(uri: str = "localhost:27017"):
|
def getMongo(uri = "localhost:27017"):
|
||||||
uri = uri
|
uri = uri
|
||||||
|
|
||||||
client = MongoClient(uri)
|
client = MongoClient(uri)
|
||||||
|
|||||||
@@ -4,3 +4,10 @@ services:
|
|||||||
ports:
|
ports:
|
||||||
- target: 27017
|
- target: 27017
|
||||||
published: 27017
|
published: 27017
|
||||||
|
api:
|
||||||
|
build: ./back
|
||||||
|
ports:
|
||||||
|
- target: 8000
|
||||||
|
published: 8000
|
||||||
|
environment:
|
||||||
|
- DB_URI=db:27017
|
||||||
|
|||||||
1
front/.envrc
Normal file
1
front/.envrc
Normal file
@@ -0,0 +1 @@
|
|||||||
|
use flake
|
||||||
1
front/.gitignore
vendored
Normal file
1
front/.gitignore
vendored
Normal file
@@ -0,0 +1 @@
|
|||||||
|
node_modules/
|
||||||
79
front/README.md
Normal file
79
front/README.md
Normal file
@@ -0,0 +1,79 @@
|
|||||||
|
# Vuetify (Default)
|
||||||
|
|
||||||
|
This is the official scaffolding tool for Vuetify, designed to give you a head start in building your new Vuetify application. It sets up a base template with all the necessary configurations and standard directory structure, enabling you to begin development without the hassle of setting up the project from scratch.
|
||||||
|
|
||||||
|
## ❗️ Important Links
|
||||||
|
|
||||||
|
- 📄 [Docs](https://vuetifyjs.com/)
|
||||||
|
- 🚨 [Issues](https://issues.vuetifyjs.com/)
|
||||||
|
- 🏬 [Store](https://store.vuetifyjs.com/)
|
||||||
|
- 🎮 [Playground](https://play.vuetifyjs.com/)
|
||||||
|
- 💬 [Discord](https://community.vuetifyjs.com)
|
||||||
|
|
||||||
|
## 💿 Install
|
||||||
|
|
||||||
|
Set up your project using your preferred package manager. Use the corresponding command to install the dependencies:
|
||||||
|
|
||||||
|
| Package Manager | Command |
|
||||||
|
|---------------------------------------------------------------|----------------|
|
||||||
|
| [yarn](https://yarnpkg.com/getting-started) | `yarn install` |
|
||||||
|
| [npm](https://docs.npmjs.com/cli/v7/commands/npm-install) | `npm install` |
|
||||||
|
| [pnpm](https://pnpm.io/installation) | `pnpm install` |
|
||||||
|
| [bun](https://bun.sh/#getting-started) | `bun install` |
|
||||||
|
|
||||||
|
After completing the installation, your environment is ready for Vuetify development.
|
||||||
|
|
||||||
|
## ✨ Features
|
||||||
|
|
||||||
|
- 🖼️ **Optimized Front-End Stack**: Leverage the latest Vue 3 and Vuetify 3 for a modern, reactive UI development experience. [Vue 3](https://v3.vuejs.org/) | [Vuetify 3](https://vuetifyjs.com/en/)
|
||||||
|
- 🗃️ **State Management**: Integrated with [Pinia](https://pinia.vuejs.org/), the intuitive, modular state management solution for Vue.
|
||||||
|
- 🚦 **Routing and Layouts**: Utilizes Vue Router for SPA navigation and vite-plugin-vue-layouts for organizing Vue file layouts. [Vue Router](https://router.vuejs.org/) | [vite-plugin-vue-layouts](https://github.com/JohnCampionJr/vite-plugin-vue-layouts)
|
||||||
|
- ⚡ **Next-Gen Tooling**: Powered by Vite, experience fast cold starts and instant HMR (Hot Module Replacement). [Vite](https://vitejs.dev/)
|
||||||
|
- 🧩 **Automated Component Importing**: Streamline your workflow with unplugin-vue-components, automatically importing components as you use them. [unplugin-vue-components](https://github.com/antfu/unplugin-vue-components)
|
||||||
|
|
||||||
|
These features are curated to provide a seamless development experience from setup to deployment, ensuring that your Vuetify application is both powerful and maintainable.
|
||||||
|
|
||||||
|
## 💡 Usage
|
||||||
|
|
||||||
|
This section covers how to start the development server and build your project for production.
|
||||||
|
|
||||||
|
### Starting the Development Server
|
||||||
|
|
||||||
|
To start the development server with hot-reload, run the following command. The server will be accessible at [http://localhost:3000](http://localhost:3000):
|
||||||
|
|
||||||
|
```bash
|
||||||
|
yarn dev
|
||||||
|
```
|
||||||
|
|
||||||
|
(Repeat for npm, pnpm, and bun with respective commands.)
|
||||||
|
|
||||||
|
> Add NODE_OPTIONS='--no-warnings' to suppress the JSON import warnings that happen as part of the Vuetify import mapping. If you are on Node [v21.3.0](https://nodejs.org/en/blog/release/v21.3.0) or higher, you can change this to NODE_OPTIONS='--disable-warning=5401'. If you don't mind the warning, you can remove this from your package.json dev script.
|
||||||
|
|
||||||
|
### Building for Production
|
||||||
|
|
||||||
|
To build your project for production, use:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
yarn build
|
||||||
|
```
|
||||||
|
|
||||||
|
(Repeat for npm, pnpm, and bun with respective commands.)
|
||||||
|
|
||||||
|
Once the build process is completed, your application will be ready for deployment in a production environment.
|
||||||
|
|
||||||
|
## 💪 Support Vuetify Development
|
||||||
|
|
||||||
|
This project is built with [Vuetify](https://vuetifyjs.com/en/), a UI Library with a comprehensive collection of Vue components. Vuetify is an MIT licensed Open Source project that has been made possible due to the generous contributions by our [sponsors and backers](https://vuetifyjs.com/introduction/sponsors-and-backers/). If you are interested in supporting this project, please consider:
|
||||||
|
|
||||||
|
- [Requesting Enterprise Support](https://support.vuetifyjs.com/)
|
||||||
|
- [Sponsoring John on Github](https://github.com/users/johnleider/sponsorship)
|
||||||
|
- [Sponsoring Kael on Github](https://github.com/users/kaelwd/sponsorship)
|
||||||
|
- [Supporting the team on Open Collective](https://opencollective.com/vuetify)
|
||||||
|
- [Becoming a sponsor on Patreon](https://www.patreon.com/vuetify)
|
||||||
|
- [Becoming a subscriber on Tidelift](https://tidelift.com/subscription/npm/vuetify)
|
||||||
|
- [Making a one-time donation with Paypal](https://paypal.me/vuetify)
|
||||||
|
|
||||||
|
## 📑 License
|
||||||
|
[MIT](http://opensource.org/licenses/MIT)
|
||||||
|
|
||||||
|
Copyright (c) 2016-present Vuetify, LLC
|
||||||
3
front/eslint.config.js
Normal file
3
front/eslint.config.js
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
import vuetify from 'eslint-config-vuetify'
|
||||||
|
|
||||||
|
export default vuetify()
|
||||||
25
front/flake.lock
generated
Normal file
25
front/flake.lock
generated
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
{
|
||||||
|
"nodes": {
|
||||||
|
"nixpkgs": {
|
||||||
|
"locked": {
|
||||||
|
"lastModified": 1765838191,
|
||||||
|
"narHash": "sha256-m5KWt1nOm76ILk/JSCxBM4MfK3rYY7Wq9/TZIIeGnT8=",
|
||||||
|
"rev": "c6f52ebd45e5925c188d1a20119978aa4ffd5ef6",
|
||||||
|
"revCount": 903775,
|
||||||
|
"type": "tarball",
|
||||||
|
"url": "https://api.flakehub.com/f/pinned/NixOS/nixpkgs/0.2511.903775%2Brev-c6f52ebd45e5925c188d1a20119978aa4ffd5ef6/019b2d67-1e0c-7882-89c2-3b456e18a61b/source.tar.gz"
|
||||||
|
},
|
||||||
|
"original": {
|
||||||
|
"type": "tarball",
|
||||||
|
"url": "https://flakehub.com/f/NixOS/nixpkgs/0.2511"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"root": {
|
||||||
|
"inputs": {
|
||||||
|
"nixpkgs": "nixpkgs"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"root": "root",
|
||||||
|
"version": 7
|
||||||
|
}
|
||||||
48
front/flake.nix
Normal file
48
front/flake.nix
Normal file
@@ -0,0 +1,48 @@
|
|||||||
|
{
|
||||||
|
description = "A Nix-flake-based Node.js development environment";
|
||||||
|
|
||||||
|
inputs.nixpkgs.url = "https://flakehub.com/f/NixOS/nixpkgs/0.2511"; # unstable Nixpkgs
|
||||||
|
|
||||||
|
outputs =
|
||||||
|
{ self, ... }@inputs:
|
||||||
|
|
||||||
|
let
|
||||||
|
supportedSystems = [
|
||||||
|
"x86_64-linux"
|
||||||
|
"aarch64-linux"
|
||||||
|
"x86_64-darwin"
|
||||||
|
"aarch64-darwin"
|
||||||
|
];
|
||||||
|
forEachSupportedSystem =
|
||||||
|
f:
|
||||||
|
inputs.nixpkgs.lib.genAttrs supportedSystems (
|
||||||
|
system:
|
||||||
|
f {
|
||||||
|
pkgs = import inputs.nixpkgs {
|
||||||
|
inherit system;
|
||||||
|
overlays = [ inputs.self.overlays.default ];
|
||||||
|
};
|
||||||
|
}
|
||||||
|
);
|
||||||
|
in
|
||||||
|
{
|
||||||
|
overlays.default = final: prev: rec {
|
||||||
|
nodejs = prev.nodejs;
|
||||||
|
yarn = (prev.yarn.override { inherit nodejs; });
|
||||||
|
};
|
||||||
|
|
||||||
|
devShells = forEachSupportedSystem (
|
||||||
|
{ pkgs }:
|
||||||
|
{
|
||||||
|
default = pkgs.mkShellNoCC {
|
||||||
|
packages = with pkgs; [
|
||||||
|
node2nix
|
||||||
|
nodejs
|
||||||
|
nodePackages.pnpm
|
||||||
|
yarn
|
||||||
|
];
|
||||||
|
};
|
||||||
|
}
|
||||||
|
);
|
||||||
|
};
|
||||||
|
}
|
||||||
13
front/index.html
Normal file
13
front/index.html
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<link rel="icon" href="/favicon.ico">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
|
<title>Welcome to Vuetify 3</title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div id="app"></div>
|
||||||
|
<script type="module" src="/src/main.js"></script>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
20
front/jsconfig.json
Normal file
20
front/jsconfig.json
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
{
|
||||||
|
"compilerOptions": {
|
||||||
|
"allowJs": true,
|
||||||
|
"target": "es5",
|
||||||
|
"module": "esnext",
|
||||||
|
"baseUrl": "./",
|
||||||
|
"moduleResolution": "bundler",
|
||||||
|
"paths": {
|
||||||
|
"@/*": [
|
||||||
|
"src/*"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"lib": [
|
||||||
|
"esnext",
|
||||||
|
"dom",
|
||||||
|
"dom.iterable",
|
||||||
|
"scripthost"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
30
front/package.json
Normal file
30
front/package.json
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
{
|
||||||
|
"name": "netflux-front",
|
||||||
|
"private": true,
|
||||||
|
"type": "module",
|
||||||
|
"version": "0.0.0",
|
||||||
|
"scripts": {
|
||||||
|
"dev": "vite",
|
||||||
|
"build": "vite build",
|
||||||
|
"preview": "vite preview",
|
||||||
|
"lint": "eslint . --fix"
|
||||||
|
},
|
||||||
|
"dependencies": {
|
||||||
|
"@fontsource/roboto": "5.2.7",
|
||||||
|
"@mdi/font": "7.4.47",
|
||||||
|
"vue": "^3.5.21",
|
||||||
|
"vue-router": "^4.5.1",
|
||||||
|
"vuetify": "^3.10.1"
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"@vitejs/plugin-vue": "^6.0.1",
|
||||||
|
"eslint": "^9.35.0",
|
||||||
|
"eslint-config-vuetify": "^4.2.0",
|
||||||
|
"sass-embedded": "^1.92.1",
|
||||||
|
"unplugin-fonts": "^1.4.0",
|
||||||
|
"unplugin-vue-components": "^29.0.0",
|
||||||
|
"unplugin-vue-router": "^0.15.0",
|
||||||
|
"vite": "^7.1.5",
|
||||||
|
"vite-plugin-vuetify": "^2.1.2"
|
||||||
|
}
|
||||||
|
}
|
||||||
3427
front/pnpm-lock.yaml
generated
Normal file
3427
front/pnpm-lock.yaml
generated
Normal file
File diff suppressed because it is too large
Load Diff
BIN
front/public/favicon.ico
Normal file
BIN
front/public/favicon.ico
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 15 KiB |
11
front/src/App.vue
Normal file
11
front/src/App.vue
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
<template>
|
||||||
|
<v-app>
|
||||||
|
<v-main>
|
||||||
|
<router-view />
|
||||||
|
</v-main>
|
||||||
|
</v-app>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup>
|
||||||
|
//
|
||||||
|
</script>
|
||||||
BIN
front/src/assets/logo.png
Normal file
BIN
front/src/assets/logo.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 12 KiB |
6
front/src/assets/logo.svg
Normal file
6
front/src/assets/logo.svg
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
<svg width="512" height="512" viewBox="0 0 512 512" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path d="M261.126 140.65L164.624 307.732L256.001 466L377.028 256.5L498.001 47H315.192L261.126 140.65Z" fill="#1697F6"/>
|
||||||
|
<path d="M135.027 256.5L141.365 267.518L231.64 111.178L268.731 47H256H14L135.027 256.5Z" fill="#AEDDFF"/>
|
||||||
|
<path d="M315.191 47C360.935 197.446 256 466 256 466L164.624 307.732L315.191 47Z" fill="#1867C0"/>
|
||||||
|
<path d="M268.731 47C76.0026 47 141.366 267.518 141.366 267.518L268.731 47Z" fill="#7BC6FF"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 526 B |
82
front/src/components/AppFooter.vue
Normal file
82
front/src/components/AppFooter.vue
Normal file
@@ -0,0 +1,82 @@
|
|||||||
|
<template>
|
||||||
|
<v-footer
|
||||||
|
app
|
||||||
|
height="40"
|
||||||
|
>
|
||||||
|
<a
|
||||||
|
v-for="item in items"
|
||||||
|
:key="item.title"
|
||||||
|
class="d-inline-block mx-2 social-link"
|
||||||
|
:href="item.href"
|
||||||
|
rel="noopener noreferrer"
|
||||||
|
target="_blank"
|
||||||
|
:title="item.title"
|
||||||
|
>
|
||||||
|
<v-icon
|
||||||
|
:icon="item.icon"
|
||||||
|
:size="item.icon === '$vuetify' ? 24 : 16"
|
||||||
|
/>
|
||||||
|
</a>
|
||||||
|
|
||||||
|
<div
|
||||||
|
class="text-caption text-disabled"
|
||||||
|
style="position: absolute; right: 16px;"
|
||||||
|
>
|
||||||
|
© 2016-{{ (new Date()).getFullYear() }} <span class="d-none d-sm-inline-block">Vuetify, LLC</span>
|
||||||
|
—
|
||||||
|
<a
|
||||||
|
class="text-decoration-none on-surface"
|
||||||
|
href="https://vuetifyjs.com/about/licensing/"
|
||||||
|
rel="noopener noreferrer"
|
||||||
|
target="_blank"
|
||||||
|
>
|
||||||
|
MIT License
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</v-footer>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup>
|
||||||
|
const items = [
|
||||||
|
{
|
||||||
|
title: 'Vuetify Documentation',
|
||||||
|
icon: `$vuetify`,
|
||||||
|
href: 'https://vuetifyjs.com/',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: 'Vuetify Support',
|
||||||
|
icon: 'mdi-shield-star-outline',
|
||||||
|
href: 'https://support.vuetifyjs.com/',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: 'Vuetify X',
|
||||||
|
icon: ['M2.04875 3.00002L9.77052 13.3248L1.99998 21.7192H3.74882L10.5519 14.3697L16.0486 21.7192H22L13.8437 10.8137L21.0765 3.00002H19.3277L13.0624 9.76874L8.0001 3.00002H2.04875ZM4.62054 4.28821H7.35461L19.4278 20.4308H16.6937L4.62054 4.28821Z'],
|
||||||
|
href: 'https://x.com/vuetifyjs',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: 'Vuetify GitHub',
|
||||||
|
icon: `mdi-github`,
|
||||||
|
href: 'https://github.com/vuetifyjs/vuetify',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: 'Vuetify Discord',
|
||||||
|
icon: ['M22,24L16.75,19L17.38,21H4.5A2.5,2.5 0 0,1 2,18.5V3.5A2.5,2.5 0 0,1 4.5,1H19.5A2.5,2.5 0 0,1 22,3.5V24M12,6.8C9.32,6.8 7.44,7.95 7.44,7.95C8.47,7.03 10.27,6.5 10.27,6.5L10.1,6.33C8.41,6.36 6.88,7.53 6.88,7.53C5.16,11.12 5.27,14.22 5.27,14.22C6.67,16.03 8.75,15.9 8.75,15.9L9.46,15C8.21,14.73 7.42,13.62 7.42,13.62C7.42,13.62 9.3,14.9 12,14.9C14.7,14.9 16.58,13.62 16.58,13.62C16.58,13.62 15.79,14.73 14.54,15L15.25,15.9C15.25,15.9 17.33,16.03 18.73,14.22C18.73,14.22 18.84,11.12 17.12,7.53C17.12,7.53 15.59,6.36 13.9,6.33L13.73,6.5C13.73,6.5 15.53,7.03 16.56,7.95C16.56,7.95 14.68,6.8 12,6.8M9.93,10.59C10.58,10.59 11.11,11.16 11.1,11.86C11.1,12.55 10.58,13.13 9.93,13.13C9.29,13.13 8.77,12.55 8.77,11.86C8.77,11.16 9.28,10.59 9.93,10.59M14.1,10.59C14.75,10.59 15.27,11.16 15.27,11.86C15.27,12.55 14.75,13.13 14.1,13.13C13.46,13.13 12.94,12.55 12.94,11.86C12.94,11.16 13.45,10.59 14.1,10.59Z'],
|
||||||
|
href: 'https://community.vuetifyjs.com/',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: 'Vuetify Reddit',
|
||||||
|
icon: `mdi-reddit`,
|
||||||
|
href: 'https://reddit.com/r/vuetifyjs',
|
||||||
|
},
|
||||||
|
]
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style scoped lang="sass">
|
||||||
|
.social-link :deep(.v-icon)
|
||||||
|
color: rgba(var(--v-theme-on-background), var(--v-disabled-opacity))
|
||||||
|
text-decoration: none
|
||||||
|
transition: .2s ease-in-out
|
||||||
|
|
||||||
|
&:hover
|
||||||
|
color: rgba(25, 118, 210, 1)
|
||||||
|
</style>
|
||||||
90
front/src/components/HelloWorld.vue
Normal file
90
front/src/components/HelloWorld.vue
Normal file
@@ -0,0 +1,90 @@
|
|||||||
|
<template>
|
||||||
|
<v-container class="fill-height" max-width="900">
|
||||||
|
<div>
|
||||||
|
<v-img
|
||||||
|
class="mb-4"
|
||||||
|
height="150"
|
||||||
|
src="@/assets/logo.png"
|
||||||
|
/>
|
||||||
|
|
||||||
|
<div class="mb-8 text-center">
|
||||||
|
<div class="text-body-2 font-weight-light mb-n1">Welcome to</div>
|
||||||
|
<h1 class="text-h2 font-weight-bold">Vuetify</h1>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<v-row>
|
||||||
|
<v-col cols="12">
|
||||||
|
<v-card
|
||||||
|
class="py-4"
|
||||||
|
color="surface-variant"
|
||||||
|
image="https://cdn.vuetifyjs.com/docs/images/one/create/feature.png"
|
||||||
|
prepend-icon="mdi-rocket-launch-outline"
|
||||||
|
rounded="lg"
|
||||||
|
variant="tonal"
|
||||||
|
>
|
||||||
|
<template #image>
|
||||||
|
<v-img position="top right" />
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<template #title>
|
||||||
|
<h2 class="text-h5 font-weight-bold">
|
||||||
|
Get started
|
||||||
|
</h2>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<template #subtitle>
|
||||||
|
<div class="text-subtitle-1">
|
||||||
|
Change this page by updating <v-kbd>{{ `<HelloWorld />` }}</v-kbd> in <v-kbd>components/HelloWorld.vue</v-kbd>.
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
</v-card>
|
||||||
|
</v-col>
|
||||||
|
|
||||||
|
<v-col v-for="link in links" :key="link.href" cols="6">
|
||||||
|
<v-card
|
||||||
|
append-icon="mdi-open-in-new"
|
||||||
|
class="py-4"
|
||||||
|
color="surface-variant"
|
||||||
|
:href="link.href"
|
||||||
|
:prepend-icon="link.icon"
|
||||||
|
rel="noopener noreferrer"
|
||||||
|
rounded="lg"
|
||||||
|
:subtitle="link.subtitle"
|
||||||
|
target="_blank"
|
||||||
|
:title="link.title"
|
||||||
|
variant="tonal"
|
||||||
|
/>
|
||||||
|
</v-col>
|
||||||
|
</v-row>
|
||||||
|
</div>
|
||||||
|
</v-container>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup>
|
||||||
|
const links = [
|
||||||
|
{
|
||||||
|
href: 'https://vuetifyjs.com/',
|
||||||
|
icon: 'mdi-text-box-outline',
|
||||||
|
subtitle: 'Learn about all things Vuetify in our documentation.',
|
||||||
|
title: 'Documentation',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
href: 'https://vuetifyjs.com/introduction/why-vuetify/#feature-guides',
|
||||||
|
icon: 'mdi-star-circle-outline',
|
||||||
|
subtitle: 'Explore available framework Features.',
|
||||||
|
title: 'Features',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
href: 'https://vuetifyjs.com/components/all',
|
||||||
|
icon: 'mdi-widgets-outline',
|
||||||
|
subtitle: 'Discover components in the API Explorer.',
|
||||||
|
title: 'Components',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
href: 'https://discord.vuetifyjs.com',
|
||||||
|
icon: 'mdi-account-group-outline',
|
||||||
|
subtitle: 'Connect with Vuetify developers.',
|
||||||
|
title: 'Community',
|
||||||
|
},
|
||||||
|
]
|
||||||
|
</script>
|
||||||
35
front/src/components/README.md
Normal file
35
front/src/components/README.md
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
# Components
|
||||||
|
|
||||||
|
Vue template files in this folder are automatically imported.
|
||||||
|
|
||||||
|
## 🚀 Usage
|
||||||
|
|
||||||
|
Importing is handled by [unplugin-vue-components](https://github.com/unplugin/unplugin-vue-components). This plugin automatically imports `.vue` files created in the `src/components` directory, and registers them as global components. This means that you can use any component in your application without having to manually import it.
|
||||||
|
|
||||||
|
The following example assumes a component located at `src/components/MyComponent.vue`:
|
||||||
|
|
||||||
|
```vue
|
||||||
|
<template>
|
||||||
|
<div>
|
||||||
|
<MyComponent />
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script lang="ts" setup>
|
||||||
|
//
|
||||||
|
</script>
|
||||||
|
```
|
||||||
|
|
||||||
|
When your template is rendered, the component's import will automatically be inlined, which renders to this:
|
||||||
|
|
||||||
|
```vue
|
||||||
|
<template>
|
||||||
|
<div>
|
||||||
|
<MyComponent />
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script lang="ts" setup>
|
||||||
|
import MyComponent from '@/components/MyComponent.vue'
|
||||||
|
</script>
|
||||||
|
```
|
||||||
23
front/src/main.js
Normal file
23
front/src/main.js
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
/**
|
||||||
|
* main.js
|
||||||
|
*
|
||||||
|
* Bootstraps Vuetify and other plugins then mounts the App`
|
||||||
|
*/
|
||||||
|
|
||||||
|
// Plugins
|
||||||
|
import { registerPlugins } from '@/plugins'
|
||||||
|
|
||||||
|
// Components
|
||||||
|
import App from './App.vue'
|
||||||
|
|
||||||
|
// Composables
|
||||||
|
import { createApp } from 'vue'
|
||||||
|
|
||||||
|
// Styles
|
||||||
|
import 'unfonts.css'
|
||||||
|
|
||||||
|
const app = createApp(App)
|
||||||
|
|
||||||
|
registerPlugins(app)
|
||||||
|
|
||||||
|
app.mount('#app')
|
||||||
5
front/src/pages/README.md
Normal file
5
front/src/pages/README.md
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
# Pages
|
||||||
|
|
||||||
|
Vue components created in this folder will automatically be converted to navigatable routes.
|
||||||
|
|
||||||
|
Full documentation for this feature can be found in the Official [unplugin-vue-router](https://github.com/posva/unplugin-vue-router) repository.
|
||||||
31
front/src/pages/directors.vue
Normal file
31
front/src/pages/directors.vue
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
<template>
|
||||||
|
<v-container>
|
||||||
|
<h1>Directors</h1>
|
||||||
|
<v-row>
|
||||||
|
<v-col cols="4" v-for="director in directors">
|
||||||
|
<v-card :title="director.name">
|
||||||
|
<v-card-text>
|
||||||
|
<ul class='pl-2'>
|
||||||
|
<li>birthdate: {{director.birthdate.toLocaleDateString()}}</li>
|
||||||
|
<li>nationality: {{director.nationality}}</li>
|
||||||
|
</ul>
|
||||||
|
</v-card-text>
|
||||||
|
</v-card>
|
||||||
|
</v-col>
|
||||||
|
</v-row>
|
||||||
|
</v-container>
|
||||||
|
</template>
|
||||||
|
<script setup>
|
||||||
|
import {ref} from 'vue'
|
||||||
|
const directors = ref([])
|
||||||
|
fetch("http://localhost:8000/directors").then(async response => {
|
||||||
|
let data = await response.json()
|
||||||
|
directors.value = data.map(raw_director => {
|
||||||
|
const birthdate = raw_director.birthdate.split("-")
|
||||||
|
return {
|
||||||
|
...raw_director,
|
||||||
|
birthdate: new Date(birthdate[2], birthdate[1], birthdate[0])
|
||||||
|
}
|
||||||
|
})
|
||||||
|
})
|
||||||
|
</script>
|
||||||
3
front/src/plugins/README.md
Normal file
3
front/src/plugins/README.md
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
# Plugins
|
||||||
|
|
||||||
|
Plugins are a way to extend the functionality of your Vue application. Use this folder for registering plugins that you want to use globally.
|
||||||
15
front/src/plugins/index.js
Normal file
15
front/src/plugins/index.js
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
/**
|
||||||
|
* plugins/index.js
|
||||||
|
*
|
||||||
|
* Automatically included in `./src/main.js`
|
||||||
|
*/
|
||||||
|
|
||||||
|
// Plugins
|
||||||
|
import vuetify from './vuetify'
|
||||||
|
import router from '@/router'
|
||||||
|
|
||||||
|
export function registerPlugins (app) {
|
||||||
|
app
|
||||||
|
.use(vuetify)
|
||||||
|
.use(router)
|
||||||
|
}
|
||||||
19
front/src/plugins/vuetify.js
Normal file
19
front/src/plugins/vuetify.js
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
/**
|
||||||
|
* plugins/vuetify.js
|
||||||
|
*
|
||||||
|
* Framework documentation: https://vuetifyjs.com`
|
||||||
|
*/
|
||||||
|
|
||||||
|
// Styles
|
||||||
|
import '@mdi/font/css/materialdesignicons.css'
|
||||||
|
import 'vuetify/styles'
|
||||||
|
|
||||||
|
// Composables
|
||||||
|
import { createVuetify } from 'vuetify'
|
||||||
|
|
||||||
|
// https://vuetifyjs.com/en/introduction/why-vuetify/#feature-guides
|
||||||
|
export default createVuetify({
|
||||||
|
theme: {
|
||||||
|
defaultTheme: 'system',
|
||||||
|
},
|
||||||
|
})
|
||||||
35
front/src/router/index.js
Normal file
35
front/src/router/index.js
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
/**
|
||||||
|
* router/index.ts
|
||||||
|
*
|
||||||
|
* Automatic routes for `./src/pages/*.vue`
|
||||||
|
*/
|
||||||
|
|
||||||
|
// Composables
|
||||||
|
import { createRouter, createWebHistory } from 'vue-router'
|
||||||
|
import { routes } from 'vue-router/auto-routes'
|
||||||
|
|
||||||
|
const router = createRouter({
|
||||||
|
history: createWebHistory(import.meta.env.BASE_URL),
|
||||||
|
routes,
|
||||||
|
})
|
||||||
|
|
||||||
|
// Workaround for https://github.com/vitejs/vite/issues/11804
|
||||||
|
router.onError((err, to) => {
|
||||||
|
if (err?.message?.includes?.('Failed to fetch dynamically imported module')) {
|
||||||
|
if (localStorage.getItem('vuetify:dynamic-reload')) {
|
||||||
|
console.error('Dynamic import error, reloading page did not fix it', err)
|
||||||
|
} else {
|
||||||
|
console.log('Reloading page to fix dynamic import error')
|
||||||
|
localStorage.setItem('vuetify:dynamic-reload', 'true')
|
||||||
|
location.assign(to.fullPath)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
console.error(err)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
router.isReady().then(() => {
|
||||||
|
localStorage.removeItem('vuetify:dynamic-reload')
|
||||||
|
})
|
||||||
|
|
||||||
|
export default router
|
||||||
3
front/src/styles/README.md
Normal file
3
front/src/styles/README.md
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
# Styles
|
||||||
|
|
||||||
|
This directory is for configuring the styles of the application.
|
||||||
10
front/src/styles/settings.scss
Normal file
10
front/src/styles/settings.scss
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
/**
|
||||||
|
* src/styles/settings.scss
|
||||||
|
*
|
||||||
|
* Configures SASS variables and Vuetify overwrites
|
||||||
|
*/
|
||||||
|
|
||||||
|
// https://vuetifyjs.com/features/sass-variables/`
|
||||||
|
// @use 'vuetify/settings' with (
|
||||||
|
// $color-pack: false
|
||||||
|
// );
|
||||||
66
front/vite.config.mjs
Normal file
66
front/vite.config.mjs
Normal file
@@ -0,0 +1,66 @@
|
|||||||
|
// Plugins
|
||||||
|
import Components from 'unplugin-vue-components/vite'
|
||||||
|
import Vue from '@vitejs/plugin-vue'
|
||||||
|
import Vuetify, { transformAssetUrls } from 'vite-plugin-vuetify'
|
||||||
|
import Fonts from 'unplugin-fonts/vite'
|
||||||
|
import VueRouter from 'unplugin-vue-router/vite'
|
||||||
|
|
||||||
|
// Utilities
|
||||||
|
import { defineConfig } from 'vite'
|
||||||
|
import { fileURLToPath, URL } from 'node:url'
|
||||||
|
|
||||||
|
// https://vitejs.dev/config/
|
||||||
|
export default defineConfig({
|
||||||
|
plugins: [
|
||||||
|
VueRouter(),
|
||||||
|
Vue({
|
||||||
|
template: { transformAssetUrls },
|
||||||
|
}),
|
||||||
|
// https://github.com/vuetifyjs/vuetify-loader/tree/master/packages/vite-plugin#readme
|
||||||
|
Vuetify({
|
||||||
|
autoImport: true,
|
||||||
|
styles: {
|
||||||
|
configFile: 'src/styles/settings.scss',
|
||||||
|
},
|
||||||
|
}),
|
||||||
|
Components(),
|
||||||
|
Fonts({
|
||||||
|
fontsource: {
|
||||||
|
families: [
|
||||||
|
{
|
||||||
|
name: 'Roboto',
|
||||||
|
weights: [100, 300, 400, 500, 700, 900],
|
||||||
|
styles: ['normal', 'italic'],
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
}),
|
||||||
|
],
|
||||||
|
optimizeDeps: {
|
||||||
|
exclude: [
|
||||||
|
'vuetify',
|
||||||
|
'vue-router',
|
||||||
|
'unplugin-vue-router/runtime',
|
||||||
|
'unplugin-vue-router/data-loaders',
|
||||||
|
'unplugin-vue-router/data-loaders/basic',
|
||||||
|
],
|
||||||
|
},
|
||||||
|
define: { 'process.env': {} },
|
||||||
|
resolve: {
|
||||||
|
alias: {
|
||||||
|
'@': fileURLToPath(new URL('src', import.meta.url)),
|
||||||
|
},
|
||||||
|
extensions: [
|
||||||
|
'.js',
|
||||||
|
'.json',
|
||||||
|
'.jsx',
|
||||||
|
'.mjs',
|
||||||
|
'.ts',
|
||||||
|
'.tsx',
|
||||||
|
'.vue',
|
||||||
|
],
|
||||||
|
},
|
||||||
|
server: {
|
||||||
|
port: 3000,
|
||||||
|
},
|
||||||
|
})
|
||||||
Reference in New Issue
Block a user