TutorLoom
The learning platform for companies, colleges and training institutes. Free and open source, with an Enterprise edition.
翻译准备中
制作者的介绍仅有上面的一句话。 更多详情请阅读仓库 README。 仓库 README ↗
正在加载完整 README。
查看完整 README ↗Trouver une œuvre facilement dans les bibliothèques de Lévis : une interface moderne, une recherche simple et rapide.
Projet citoyen open source · Sans but lucratif · Zéro BD · Aucune donnée personnelle stockée
LévisBiblio est une interface moderne pour les bibliothèques de Lévis. Son but : trouver une œuvre facilement, grâce à une recherche simple et rapide, sur téléphone comme sur ordinateur. Elle s'appuie sur les outils existants de la Ville (catalogue SirsiDynix, PrêtNumérique) sans les remplacer ni en modifier le fonctionnement.
Chercher un livre dans le catalogue actuel demande de la patience :
La recherche fonctionne sur les notices du catalogue (titres, auteurs, ISBN, couvertures), relevées une fois puis regroupées en œuvres et en séries. Les disponibilités en temps réel dépendent d'un accès officiel aux données de la Ville : son catalogue est protégé contre les requêtes automatisées, et LévisBiblio respecte cette protection. Une demande d'accès est en cours (voir la documentation fonctionnelle). D'ici là, les disponibilités affichées sont simulées.
| Fonctionnalité | État |
|---|---|
| Accueil : nouveautés, séries, auteurs d'ici, parcourir par type, succursales ouvertes | ✅ Livré |
| Recherche dans le catalogue : suggestions dès la saisie, une fiche par œuvre, filtres (type, année, disponibilité, succursale), tri, ISBN | ✅ Livré (détails) |
| Vue par série : tous les tomes réunis, tome précédent et suivant | ✅ Livré (imprimé ; numérique en phase 2) |
| Disponibilité par succursale, réservation depuis le catalogue | 🟡 Simulée ; accès officiel requis |
| Mon dossier : emprunts et renouvellements, réservations (rang, suspension, succursale), historique, amendes, profil | ✅ Livré (détails) |
| Succursales : adresses, heures, « ouvert maintenant », itinéraire, appel | ✅ Livré |
| Interface : squelettes de chargement, mode clair / sombre, accessibilité | ✅ Livré |
robots.txt) ; appels ciblés, uniquement quand un usager consulte une page ; requêtes identifiées (LevisBiblio/1.0). L'objectif est un accès officiel.httpOnly, SameSite=Strict, 30 min) ; tentatives de connexion limitées ; contrôle de l'origine des formulaires.<SkeletonScope>), puis les données en streaming (Suspense). Les couvertures, plus lentes, arrivent en dernier.src/lib/levis) : client HTTP, utilitaires Tapestry, parseurs testés, sur l'espace usager du portail seulement.| Source | Usage | Statut |
|---|---|---|
| Portail SirsiDynix, espace usager | Mon dossier | Utilisé (usage personnel) |
| levis.ca (fiches des lieux) | Adresses et heures des succursales, relevées à la main | Utilisé |
| API officielle de la Ville | Recherche, disponibilité, réservation | Demandée |
| BAnQ, « Documents publiés au Québec » (données ouvertes) | Enrichir les notices (ISBN, auteurs) | Envisagé |
| PrêtNumérique (Cantook) | Catalogue numérique | Sous réserve d'accord |
noUncheckedIndexedAccess, exactOptionalPropertyTypes)Prérequis : Node.js 24
git clone https://github.com/poupouproject/levis-biblio.git
cd levis-biblio
npm ci
# Configurer l'environnement (LEVIS_SESSION_SECRET est obligatoire)
cp .env.example .env.local
npm run dev
L'application est accessible sur http://localhost:3000.
| Variable | Rôle |
|---|---|
LEVIS_SESSION_SECRET | Obligatoire. Clé de chiffrement du cookie de session (32 caractères minimum). |
LEVIS_USER_AGENT | Optionnel. Remplace le User-Agent envoyé au portail. |
MON_COMPTE_LEVIS, MON_COMPTE_LEVIS_PASS | Développement seulement : compte pour npm run test:live. |
DATABASE_URL | Développement seulement : base Postgres des notices scrapées (table editions). Absente : jeu de démo. |
LEVIS_DEMO | 1 : Mon dossier en mode démonstration (voir docs/mon-compte.md). |
LEVIS_BANNIERE_DEMO | 1 : pastille « Démo » dans l'en-tête, sans changer Mon dossier. |
GOOGLE_BOOKS_API_KEY | Optionnel. Résumé des œuvres par Google Livres, lu côté serveur seulement (jamais NEXT_PUBLIC_). Absente : fiches sans résumé. Voir docs/catalogue.md. |
En mode dev, le téléphone peut ouvrir http://<adresse-du-PC>:3000 sur le même réseau Wi-Fi (les adresses locales du poste sont autorisées automatiquement). Attention : en HTTP, le numéro de carte et le NIP circulent en clair sur le réseau. Pour un usage régulier, passer par HTTPS (par exemple Tailscale Serve).
| Commande | Description |
|---|---|
npm run dev | Serveur de développement (Turbopack) |
npm run build | Build de production |
npm run lint | ESLint (zéro avertissement) |
npm run typecheck | Vérification des types |
npm run test:unit | Tests unitaires |
npm run test:unit:watch | Tests en continu |
npm run test:coverage | Couverture de code |
npm run test:live | Vérifie le portail avec un vrai compte (lecture seule, en local seulement) |
npm run format | Formatage Prettier |
npm run catalogue:demo | Régénère le jeu de démo du catalogue depuis la base locale |
levis-biblio/
├── docs/mon-compte.md # Protocole du portail et choix techniques de « Mon dossier »
├── levis-biblio-fonctionnel-v4.docx
├── src/
│ ├── app/
│ │ ├── compte/ # Mon dossier : connexion, pages, routes, Server Actions
│ │ ├── bibliotheques/ # Succursales (page publique)
│ │ ├── page.tsx, book/, demo/ # Maquettes de la future recherche (données fictives)
│ │ └── layout.tsx # En-tête, menu de compte, thème
│ ├── components/
│ │ ├── account/ # Cartes, listes, menu, dialogues du dossier
│ │ ├── branches/ # Fiche de succursale
│ │ ├── ui/ # Skeleton, ThemeSelector, Badge
│ │ └── book/, search/ # Composants des maquettes
│ ├── hooks/ # useAccountAction, useMinute
│ ├── lib/
│ │ ├── levis/ # Accès au portail : client, auth, parseurs, succursales
│ │ ├── account/ # Session, connexion, sécurité, formatage
│ │ └── theme.ts
│ └── types/
└── tests/
├── unit/ # Tests unitaires (fixtures synthétiques)
└── live/ # Vérification du portail avec un vrai compte (local)
Ce projet citoyen est ouvert à tous : UI, accessibilité, tests ou simple coquille.
git checkout -b feature/ma-contribution)npm run typecheck && npm run lint && npm run test:unit
npx changeset
(ou npx changeset add --empty s'il n'a aucun effet visible)La CI refait ces vérifications sur chaque Pull Request. Chaque fusion sur main est une
version : la personne qui maintient le projet pose le label ready, la CI calcule le numéro
de version et le CHANGELOG.md, puis la release GitHub est créée après la fusion
(voir docs/publication-par-label.md).
Merci de ne jamais committer de données personnelles (numéro de carte, NIP, captures du portail) : les tests utilisent des données fictives.
Si tu trouves ce projet utile, tu peux me soutenir :
Distribué sous la licence MIT. Voir LICENSE pour plus d'informations.