parent
7a08f6bb11
commit
ac6e223beb
@ -1,200 +1,9 @@
|
||||
# prepaLoL
|
||||
# Champion de la ligue des légendes
|
||||
|
||||
## Enoncé
|
||||
Réaliser une application MAUI avec un MVVM "maison".
|
||||
Je vous fournis le modèle, et peut-être quelques vues au fur et à mesure.
|
||||
Mathis Ribemont
|
||||
|
||||
J'attends de vous :
|
||||
- la réalisation d'un toolkit MVVM (bibliothèque de classes),
|
||||
- le _wrapping_ des classes du modèle par des VM (à chaque fois que c'est nécessaire),
|
||||
- l'utilisation de commandes pour les différentes fonctionnalités,
|
||||
- l'utilisation d'une VM _applicative_ (navigation, index, sélection...).
|
||||
# Ce qui fonctionne
|
||||
|
||||
Faites ce que vous pouvez avec, dans l'ordre :
|
||||
1. l'affichage de la collection de Champions. La possibilité de naviguer de n en n champions (5 champions par page, ou 10, etc.) et la pagination doivent être gérées.
|
||||
2. Permettez la sélection d'un champion pour le voir dans une page (on n'utilisera que ses propriétés simples (```Name```, ```Bio```, ```Icon```) puis ```LargeImage```).
|
||||
3. Ajoutez la gestion des caractéristiques (```Characteristics```).
|
||||
4. Ajoutez la gestion de la classe du champion.
|
||||
5. Permettez la modification d'un champion existant (depuis la page du champion, et depuis un swipe sur l'item sélectionné dans la collection).
|
||||
6. Permettez l'ajout d'un nouveau champion.
|
||||
7. Ajoutez la gestion des skills.
|
||||
8. Ajoutez la gestion des skins.
|
||||
|
||||
## Captures d'écrans
|
||||
Quelques captures d'écrans comme attendus :
|
||||
<img src="./Documentation/IMG_5744.PNG" width=200/>
|
||||
<img src="./Documentation/IMG_5745.PNG" width=200/>
|
||||
<img src="./Documentation/IMG_5746.PNG" width=200/>
|
||||
<img src="./Documentation/IMG_5747.PNG" width=200/>
|
||||
<img src="./Documentation/IMG_5748.PNG" width=200/>
|
||||
<img src="./Documentation/IMG_5749.PNG" width=200/>
|
||||
<img src="./Documentation/IMG_5750.PNG" width=200/>
|
||||
<img src="./Documentation/IMG_5751.PNG" width=200/>
|
||||
<img src="./Documentation/IMG_5752.PNG" width=200/>
|
||||
|
||||
## Diagramme de classes du modèle
|
||||
```mermaid
|
||||
classDiagram
|
||||
class LargeImage{
|
||||
+/Base64 : string
|
||||
}
|
||||
class Champion{
|
||||
+/Name : string
|
||||
+/Bio : string
|
||||
+/Icon : string
|
||||
+/Characteristics : Dictionary~string, int~
|
||||
~ AddSkin(skin : Skin) bool
|
||||
~ RemoveSkin(skin: Skin) bool
|
||||
+ AddSkill(skill: Skill) bool
|
||||
+ RemoveSkill(skill: Skill) bool
|
||||
+ AddCharacteristics(someCharacteristics : params Tuple~string, int~[])
|
||||
+ RemoveCharacteristics(label : string) bool
|
||||
+ this~label : string~ : int?
|
||||
}
|
||||
Champion --> "1" LargeImage : Image
|
||||
class ChampionClass{
|
||||
<<enumeration>>
|
||||
Unknown,
|
||||
Assassin,
|
||||
Fighter,
|
||||
Mage,
|
||||
Marksman,
|
||||
Support,
|
||||
Tank,
|
||||
}
|
||||
Champion --> "1" ChampionClass : Class
|
||||
class Skin{
|
||||
+/Name : string
|
||||
+/Description : string
|
||||
+/Icon : string
|
||||
+/Price : float
|
||||
}
|
||||
Skin --> "1" LargeImage : Image
|
||||
Champion "1" -- "*" Skin
|
||||
class Skill{
|
||||
+/Name : string
|
||||
+/Description : string
|
||||
}
|
||||
class SkillType{
|
||||
<<enumeration>>
|
||||
Unknown,
|
||||
Basic,
|
||||
Passive,
|
||||
Ultimate,
|
||||
}
|
||||
Skill --> "1" SkillType : Type
|
||||
Champion --> "*" Skill
|
||||
class Rune{
|
||||
+/Name : string
|
||||
+/Description : string
|
||||
}
|
||||
Rune --> "1" LargeImage : Image
|
||||
class RuneFamily{
|
||||
<<enumeration>>
|
||||
Unknown,
|
||||
Precision,
|
||||
Domination
|
||||
}
|
||||
Rune --> "1" RuneFamily : Family
|
||||
class Category{
|
||||
<<enumeration>>
|
||||
Major,
|
||||
Minor1,
|
||||
Minor2,
|
||||
Minor3,
|
||||
OtherMinor1,
|
||||
OtherMinor2
|
||||
}
|
||||
class RunePage{
|
||||
+/Name : string
|
||||
+/this[category : Category] : Rune?
|
||||
- CheckRunes(newRuneCategory : Category)
|
||||
- CheckFamilies(cat1 : Category, cat2 : Category) bool?
|
||||
- UpdateMajorFamily(minor : Category, expectedValue : bool)
|
||||
}
|
||||
RunePage --> "*" Rune : Dictionary~Category,Rune~
|
||||
```
|
||||
|
||||
## Diagramme de classes des interfaces de gestion de l'accès aux données
|
||||
```mermaid
|
||||
classDiagram
|
||||
direction LR;
|
||||
class IGenericDataManager~T~{
|
||||
<<interface>>
|
||||
GetNbItems() Task~int~
|
||||
GetItems(index : int, count : int, orderingPropertyName : string?, descending : bool) Task~IEnumerable~T~~
|
||||
GetNbItemsByName(substring : string)
|
||||
GetItemsByName(substring : string, index : int, count : int, orderingPropertyName : string?, descending : bool) Task~IEnumerable~T~~
|
||||
UpdateItem(oldItem : T, newItem : T) Task~T~~
|
||||
AddItem(item : T) Task~T~
|
||||
DeleteItem(item : T) Task~bool~
|
||||
}
|
||||
class IChampionsManager{
|
||||
<<interface>>
|
||||
GetNbItemsByCharacteristic(charName : string)
|
||||
GetItemsByCharacteristic(charName : string, index : int, count : int, orderingPropertyName : string?, descending : bool) Task~IEnumerable~Champion?~~
|
||||
GetNbItemsByClass(championClass : ChampionClass)
|
||||
GetItemsByClass(championClass : ChampionClass, index : int, count : int, orderingPropertyName : string?, descending : bool) Task~IEnumerable~Champion?~~
|
||||
GetNbItemsBySkill(skill : Skill?)
|
||||
GetItemsBySkill(skill : Skill?, index : int, count : int, orderingPropertyName : string?, descending : bool) Task~IEnumerable~Champion?~~
|
||||
GetNbItemsBySkill(skill : string)
|
||||
GetItemsBySkill(skill : string, index : int, count : int, orderingPropertyName : string?, descending : bool) Task~IEnumerable~Champion?~~
|
||||
GetNbItemsByRunePage(runePage : RunePage?)
|
||||
GetItemsByRunePage(runePage : RunePage?, index : int, count : int, orderingPropertyName : string?, descending : bool) Task~IEnumerable~Champion?~~
|
||||
}
|
||||
class ISkinsManager{
|
||||
<<interface>>
|
||||
GetNbItemsByChampion(champion : Champion?)
|
||||
GetItemsByChampion(champion : Champion?, index : int, count : int, orderingPropertyName : string?, descending : bool) Task~IEnumerable~Skin?~~
|
||||
}
|
||||
class IRunesManager{
|
||||
<<interface>>
|
||||
GetNbItemsByFamily(family : RuneFamily)
|
||||
GetItemsByFamily(family : RuneFamily, index : int, count : int, orderingPropertyName : string?, descending : bool) Task~IEnumerable~Rune?~~
|
||||
}
|
||||
class IRunePagesManager{
|
||||
<<interface>>
|
||||
GetNbItemsByRune(rune : Rune?)
|
||||
GetItemsByRune(rune : Rune?, index : int, count : int, orderingPropertyName : string?, descending : bool) Task~IEnumerable~RunePage?~~
|
||||
GetNbItemsByChampion(champion : Champion?)
|
||||
GetItemsByChampion(champion : Champion?, index : int, count : int, orderingPropertyName : string?, descending : bool) Task~IEnumerable~RunePage?~~
|
||||
}
|
||||
|
||||
IGenericDataManager~Champion?~ <|.. IChampionsManager : T--Champion?
|
||||
IGenericDataManager~Skin?~ <|.. ISkinsManager : T--Skin?
|
||||
IGenericDataManager~Rune?~ <|.. IRunesManager : T--Rune?
|
||||
IGenericDataManager~RunePage?~ <|.. IRunePagesManager : T--RunePage?
|
||||
class IDataManager{
|
||||
<<interface>>
|
||||
}
|
||||
IChampionsManager <-- IDataManager : ChampionsMgr
|
||||
ISkinsManager <-- IDataManager : SkinsMgr
|
||||
IRunesManager <-- IDataManager : RunesMgr
|
||||
IRunePagesManager <-- IDataManager : RunePagesMgr
|
||||
```
|
||||
|
||||
## Diagramme de classes simplifié du Stub
|
||||
```mermaid
|
||||
classDiagram
|
||||
direction TB;
|
||||
|
||||
IDataManager <|.. StubData
|
||||
|
||||
ChampionsManager ..|> IChampionsManager
|
||||
StubData --> ChampionsManager
|
||||
|
||||
RunesManager ..|> IRunesManager
|
||||
StubData --> RunesManager
|
||||
|
||||
RunePagesManager ..|> IRunePagesManager
|
||||
StubData --> RunePagesManager
|
||||
|
||||
SkinsManager ..|> ISkinsManager
|
||||
StubData --> SkinsManager
|
||||
|
||||
StubData --> RunesManager
|
||||
StubData --> "*" Champion
|
||||
StubData --> "*" Rune
|
||||
StubData --> "*" RunePages
|
||||
StubData --> "*" Skins
|
||||
```
|
||||
On peut voir la liste des champions, avec une pagination, avec les images qui s'affiche grâce à un converter. En cliquant sur un champion, une commande nous redirige sur le détail du champion, ses compétences,... On peut l'éditer, en modifiant son nom ou sa description par exemple. On peut aussi modifier les descriptions des compétences, et on peut aussi en rajouter. L'ajout se fait grâce à une commande.<br>
|
||||
<br>
|
||||
L'application n'est pas finie, y'a des trucs moches. J'ai essayé de mettre les notions importantes que je devais comprendre (MVVM, Commande...). Une notion importante qui manque est par exemple le dictionnaire observable.
|
Loading…
Reference in new issue