Een modern internship matching-platform gebouwd voor DIVD Works dat studenten en bedrijven verbindt via slimme algoritmes.
TheWorks is een mobiele applicatie ontworpen om de zoektocht naar stages te moderniseren. Gebouwd met Flutter voor een naadloze ervaring op zowel iOS als Android, fungeert de app als een brug tussen talentvolle studenten en innovatieve bedrijven.
Het systeem maakt gebruik van een real-time database via Google Firebase om directe matching en profielupdates mogelijk te maken.
Tijdens de ontwikkeling van TheWorks heb ik mijn expertise in mobiele ontwikkeling aanzienlijk uitgebreid. Ik heb diepgaande kennis opgedaan van de programmeertaal Dart en het Flutter-framework.
Daarnaast heb ik geleerd hoe ik complexe data-architecturen kan opzetten in Google Firestore en hoe ik een intuïtieve User Experience (UX) kan ontwerpen die aansluit bij de behoeften van zowel studenten als bedrijven.
Een kernonderdeel van de applicatie is het algoritme dat projecten rangschikt op basis van de vaardigheden (tags) van de gebruiker. Dit wordt gedaan door tags uit te breiden op basis van implicaties (bijv. 'Front-end' impliceert 'HTML/CSS') en vervolgens een relevantiescore te berekenen.
List<(Project, int)> sortProjectsByTags(List<Project> projects, List<String> userTags) {
if (userTags.isEmpty) {
return projects.map((p) => (p, 0)).toList();
}
final expandedUserTags = expandTags(userTags);
final List<(Project, int)> matches = [];
final List<Project> others = [];
for (final project in projects) {
int score = 0;
for (final projectTag in project.tags) {
if (expandedUserTags.contains(projectTag.toLowerCase())) {
score++;
}
}
if (score > 0) {
matches.add((project, score));
} else {
others.add(project);
}
}
matches.sort((a, b) => b.$2.compareTo(a.$2));
return [...matches, ...others.map((p) => (p, 0))];
}
Voor het beheer van gebruikersaccounts wordt gebruik gemaakt van Firebase Authentication. Dit ondersteunt het veilig inloggen, registreren en wachtwoordherstel, terwijl de integriteit van de gebruikersgegevens gewaarborgd blijft.
class AuthService {
final FirebaseAuth _auth = FirebaseAuth.instance;
Future<UserCredential> signIn({required String email, required String password}) async {
return await _auth.signInWithEmailAndPassword(
email: email, password: password);
}
Future<UserCredential> createAccount({required String email, required String password, required String displayName}) async {
var user = await _auth.createUserWithEmailAndPassword(
email: email, password: password);
user.user!.updateDisplayName(displayName);
return user;
}
}
De applicatie maakt gebruik van sterk getypeerde data-modellen in Dart om consistentie te garanderen tussen de Firestore documenten en de UI-laag. Hieronder ziet u het model voor een 'Project'.
class Project {
final String? id;
final String name;
final String description;
final List<String> tags;
final String companyName;
final String locationType;
Project({
this.id,
required this.name,
required this.description,
required this.tags,
required this.companyName,
required this.locationType,
});
Map<String, dynamic> toMap() {
return {
'name': name,
'description': description,
'tags': tags,
'companyName': companyName,
'locationType': locationType,
'searchTags': tags.map((t) => t.toLowerCase()).toList(),
};
}
}