Front end
🌈 Back to 1996 🌈
💾☎️📼💾☎️📼💾☎️📼💾☎️📼💾☎️📼💾☎️📼💾☎️📼💾☎️📼💾☎️📼💾☎️📼
The final result, if you’d been born 30 years earlier.
Before you start
This tutorial combines explanations and code phases. The explanations should not take precedence over those of your teacher.
- Front-end development
- Navigation between pages
- Connection to the Back End
- Read a documentation
- Vibe coding
VSCode service
-
- ⚠️ Custom, as you did in the first Lab
Create your branch
For each practical session, the teacher provides a starting branch: tp<N>-start.
You will have to create a personal branch: <username>-tp<N> (e.g. camille-tp2) and work on your own branch.
Perhaps some changes have been made to the teacher’s repository since the last session.
-
git remote -v- origin: your team’s remote repository
- upstream: teacher’s remote repository
-
git remote add upstream https://github.com/ludo2ne/ENSAI-2A-projet-info-template.gitgit remote set-url --push upstream DISABLED(you don’t need to push on this repo)- Check your configuration again with:
git remote -v
To start with a clean and up-to-date codebase:
Then use the standard Git cycle: add, commit, push after each part.
1 The goal
From the beginning, we’ve focused solely on back-end development. Today, we’re going to focus on front-end development.
The aim isn’t to turn you into Streamlit experts, but to use fairly simple features to create a user-friendly interface.
Last time, we created an endpoint to retrieve a player’s games.
Let’s use it to create a new page that displays some stats for each player.
Feel free to:
- use streamlit documentation
- see existing pages in the project
You can use LLMs (Codestral, etc.) to assist your development. However, do not simply copy-paste. Your role is to act as an architect: define the requirements, guide the AI through the implementation, and rigorously verify the logic.
2 Play Dice
Let’s start with something easy : a new page for playing dice.
Before, we only had one type of game, but that’s no longer the case.
-
- Also amend the link to this page
The page for playing dice will look very similar.
-
- update game_mode
- do you still need a choice parameter?
Try it:
No need to restart the frontend when modifying a Streamlit page:
- To reload a page, either click Rerun or enable
runOnSave = true - ⚠️ Do not refresh the browser page: this will reset the Streamlit session and log you out.
config.toml
[server]
runOnSave = true3 Player’s page
Currently, your application displays a list of players, but there is no way to “drill down” into a specific player’s profile. We need to implement Contextual Navigation.
We will create a new page Player stats displaying for a specific player, informations and game history.
3.1 Player’s information
Let’s start by retrieving and then displaying the player’s details.
The page url will be something like http://<my-frontend-url>/player_stats?id_player=4.
-
- You couldn’t make this up – read the documentation
-
- Check the response
-
- username in a st.subheader element
- use st.columns to create 2 columns
- col1: elo in a st.metric
- col2: use st.write to display its email, and st.checkbox if he is a Pokemon’s fan
Try it:
3.2 Match History Retrieval
Below you will add a table containing the Game history.
-
- Check the response
- if no game has been played, display it
The next step is to display a table using the JSON data sent by the API.
Example:
| Mode | Opponent | Result |
|---|---|---|
| dice | maurice (1000) | Loss |
| dice | maurice (1000) | Draw |
| dice | maurice (1000) | Win |
| coinflip | maurice (1000) | Win |
4 To go further
Bonus
4.1 Win/Loss Aggregation
Displaying a list of games is helpful, but a professional dashboard provides high-level KPIs (Key Performance Indicators). We need to calculate the player’s win/loss record.
The Problem: The client (Frontend) should not perform mathematical calculations on a list of games. Doing so increases bandwidth usage and violates the principle of Separation of Concerns.
The Solution: The Service must perform the aggregation and return a simplified summary.
-
- It must return a dictionary containing the count of wins, losses, and draws
End of the Lab
When you have finished coding, don’t forget to:
-
- If your service is terminated, all unpushed code is lost…
-
- to free up reserved resources