- Framework: Next.js 14
- CSS: css modules
- HTTP Client: fetch
- QR: next-qrcode
- Barcode: react-jsbarcode
- PDF: react-pdf
- Web API: axum
- ORM: SeaORM
- Database: PostgreSQL
- Search Engine: MeiliSearch
- Web API: Hono
- Image Storage: Cloudflare R2
接尾辞にメソッドを明記すること
例: POST の handler の場合
async fn register_item_post() {
//処理
}
- Nix のインストール
Nix をインストールしていない場合は、以下のコマンドでインストール
sh <(curl -L https://nixos.org/nix/install) --daemon
- nix-shell
#dashishoyuディレクトリ
nix-shell
- .env の作成
backend/server/.env
を作成
- docker の起動
#serverディレクトリ
docker-compose up -d
- 初期データの投入等
bash init.sh
- Docker の起動
#serverディレクトリ
docker-compose up -d
- マイグレーションをする
cargo run --manifest-path ./migration/Cargo.toml -- refresh -u postgres://<POSTGRES_USER>:<POSTGRES_PASSWORD>@localhost:<POSTGRES_PORT>/<POSTGRES_DB>
コマンドの例
cargo run --manifest-path ./migration/Cargo.toml -- refresh -u postgres://username:password@localhost:5432/db_name
```
2. エンティティを生成する
```sh
#serverディレクトリ
rm entity
sea-orm-cli generate entity \
-u <DATABASE_URL> \
-o entity/src
コマンドの例
sea-orm-cli generate entity \
-u postgres://username:password@localhost:5432/db_name \
-o entity/src
docker exec -it postgrs psql -U <POSTGRES_USER> -d <POSTGRES_DB>
コマンドの例
docker exec -it postgrs psql -U username -d db_name
bash clean-up.sh
erDiagram
Item ||--o| Label : "visible_id color"
Item {
i32 Id PK "autoincrement"
String VisibleId UK, FK "Labelテーブルとリレーションを張っている"
String Name
String ProductNumber "型番 (わからない or 存在しない場合は、空の文字列)"
String PhotoUrl UK "Cloudflare R2に画像を格納する ファイル名は、{Id}.webp"
Record Record "enum {QR, Barcode, Nothing} (ActiveEnum)"
String Description "補足説明 (空の文字列を許容する)"
Option_i32 YearPurchased "購入年度"
Json Connector "e.g. ['USB Type-C', 'USB Type-A'] (可変の配列)"
datetime CreatedAt "登録したときの日時"
datetime UpdatedAt "更新したときの日時"
}
Label {
String VisibleId PK "実際の物品ID"
Color Color "enum {Red, Orange, Brown, SkyBlue、Blue, Green, Yellow, Purple, Pink} (ActiveEnum)"
}
Object |o--|{ ObjectTagJunction : "tag"
ObjectTagJunction }|--|| Tag : "tag"
Object {
i32 Id PK "autoincrement"
String Name
String PhotoUrl UK "Cloudflare R2に画像を格納する ファイル名は obj-{Id}.{各拡張子 MimeTypesから推測}"
String MimeTypes
String License
String Description "補足説明 (空の文字列を許容する)"
datetime CreatedAt "登録したときの日時"
datetime UpdatedAt "更新したときの日時"
}
ObjectTagJunction {
i32 Id PK "autoincrement"
i32 ObjectId FK "Object Tableとリレーションを貼っている"
i32 TagId FK "Tag Tableとリレーションを貼っている"
}
Tag {
i32 Id PK "autoincrement"
String name UK
}
実際の物品 ID と物品そのものの ID を分離することで、QR が剥がれても問題ないようにしている
erDiagram
Item ||--o{ Transaction : transaction
Transaction }o--|{ User : user
Item ||--o| Label : "visible_id color"
Item {
i32 Id PK "autoincrement"
String VisibleId UK, FK "Labelテーブルとリレーションを張っている"
String Name
String ProductNumber "型番 (わからない or 存在しない場合は、空の文字列)"
String PhotoUrl UK "Cloudflare R2に画像を格納する ファイル名は、{Id}.webp"
Record Record "enum {QR, Barcode, Nothing} (ActiveEnum)"
String Description "補足説明 (空の文字列を許容する)"
Option_i32 YearPurchased "購入年度"
Json Connector "e.g. ['USB Type-C', 'USB Type-A'] (可変の配列)"
datetime CreatedAt "登録したときの日時"
datetime UpdatedAt "更新したときの日時"
}
Label {
String VisibleId PK "実際の物品ID"
Color Color "enum {Red, Orange, Brown, SkyBlue、Blue, Green, Yellow, Purple, Pink} (ActiveEnum)"
}
Transaction {
i32 Id PK, UK "autoincrement"
USER borrow_user "USER table"
USER agency_user "USER table, nullable"
datetime borrow_date
datetime due_date
String state "enum{ 'Pending', 'Lending', 'Completed', 'Delaying' }でApp側でバリデーション"
}
User {
i32 id PK, UK "autoincrement"
String uid UK
}
Object |o--|{ ObjectTagJunction : "tag"
ObjectTagJunction }|--|| Tag : "tag"
Object {
i32 Id PK "autoincrement"
String Name
String PhotoUrl UK "Cloudflare R2に画像を格納する ファイル名は obj-{Id}.{各拡張子 MimeTypesから推測}"
String MimeTypes
String License
String Description "補足説明 (空の文字列を許容する)"
datetime CreatedAt "登録したときの日時"
datetime UpdatedAt "更新したときの日時"
}
ObjectTagJunction {
i32 Id PK "autoincrement"
i32 ObjectId FK "Object Tableとリレーションを貼っている"
i32 TagId FK "Tag Tableとリレーションを貼っている"
}
Tag {
i32 Id PK "autoincrement"
String name UK
}