{"id":15612291,"url":"https://github.com/euberdeveloper/unitn-tronchet","last_synced_at":"2025-07-08T00:08:58.447Z","repository":{"id":44839924,"uuid":"189495982","full_name":"euberdeveloper/unitn-tronchet","owner":"euberdeveloper","description":"Site where there are simulations of the theoric part of unitn exam \"linguaggi di programmazione - mod 1\"","archived":false,"fork":false,"pushed_at":"2023-10-17T21:01:37.000Z","size":43783,"stargazers_count":11,"open_issues_count":8,"forks_count":3,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-04-28T19:02:32.014Z","etag":null,"topics":["pwa","typescript","vue","vuejs","vuetify"],"latest_commit_sha":null,"homepage":"https://unitn-tronchet.euber.dev","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/euberdeveloper.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2019-05-30T23:33:03.000Z","updated_at":"2025-04-15T16:16:37.000Z","dependencies_parsed_at":"2024-10-22T01:22:01.990Z","dependency_job_id":null,"html_url":"https://github.com/euberdeveloper/unitn-tronchet","commit_stats":null,"previous_names":[],"tags_count":2,"template":false,"template_full_name":null,"purl":"pkg:github/euberdeveloper/unitn-tronchet","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/euberdeveloper%2Funitn-tronchet","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/euberdeveloper%2Funitn-tronchet/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/euberdeveloper%2Funitn-tronchet/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/euberdeveloper%2Funitn-tronchet/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/euberdeveloper","download_url":"https://codeload.github.com/euberdeveloper/unitn-tronchet/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/euberdeveloper%2Funitn-tronchet/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":259388090,"owners_count":22849755,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["pwa","typescript","vue","vuejs","vuetify"],"created_at":"2024-10-03T06:41:30.880Z","updated_at":"2025-06-12T03:10:01.724Z","avatar_url":"https://github.com/euberdeveloper.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"[![MadeWithVueJs.com shield](https://madewithvuejs.com/storage/repo-shields/1685-shield.svg)](https://madewithvuejs.com/p/unitn-tronchet/shield-link)\n\n\n# unitn-tronchet\n\nSite where there are simulations of the theoric part of unitn exam \"linguaggi di programmazione - mod 1\".\n\n__link to the site:__ [https://unitn-tronchet.euber.dev](https://unitn-tronchet.euber.dev)\n\n## Project purpose:\n\nThe UniTN's \"Programming Languages\" exam's theoric part consists in some code examples in wich the student must find errors or write the output whether there are none and some true or false questions. On the professor's site there are only few examples and the repository with all the old exams has not all the solutions. This is why I made this site, where not only can students see the old exams with the solution, but can enjoy a real simulation, with time and final score.\n\n## How to use it:\n\n* Go to [https://unitn-tronchet.euber.dev](https://unitn-tronchet.euber.dev)\n* If it is the **first time** you use it, it could aks you for the **push notifications permission**, I suggest accepting, because you will receive a notification when a new exam is added or corrections are uploaded\n* To login, use the credentials: **USER: abbiamovinto** and **PASSWORD: defacto**\n\n![Login](https://github.com/euberdeveloper/unitn-tronchet/blob/master/doc/log-in.png)\n* After the login, you will be reditected to the **homepage**. I really suggest reading the whole text, because it will explain you how to properly use the site\n\n![Home](https://github.com/euberdeveloper/unitn-tronchet/blob/master/doc/home.png)\n* The topbar's left button opens the menu, where you can select an exam. The topbar's right button logs you out.\n\n![Menu](https://github.com/euberdeveloper/unitn-tronchet/blob/master/doc/menu.png)\n* Click on one of the exams to start a simulation\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"https://github.com/euberdeveloper/unitn-tronchet/blob/master/doc/usage-mobile-portrait.gif\"\u003e\n\u003c/p\u003e\n\n* During the simulation, you will see the time as the title of the topbar. A progress bar will show the time too, and the color change in base of the time remained. To pass from an exercise to another **on mobilephones (portrait), you must make a big swipe to the right or to the left**; on landscape position or in all the other devices there are the back and next buttons, in the bottom. In the bottom there are also the pause/play button (pauses/plays time), the refresh button (resets the exams) and the finish button (finishes the exam before time ends). In the exercises with the code, by moving the cursor inside the code container, a copy button will appear to copy all the code text in the dashboard. You will be able to answer the code exercises (radio buttons for the output/compiletime error/runtime error choice and textfields for the output/error's row) or to leave the answer empty. For each true or false question, you will be able to select an answer and deselect it by clicking again on it. In the end of the simulation, the result will be shown; the title of the topbar will show your score, the progressbar and its color will get you a better idea of that. You will be able with the top right buttons to see the solution and your answers.\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"https://github.com/euberdeveloper/unitn-tronchet/blob/master/doc/usage.gif\"\u003e\n\u003c/p\u003e\n\n## As a PWA (Progressive Web App)\n\nUnitn Tronchet is also a PWA. This means that the site is cached and can be (partially) used even offline. On android devices the user is asked if he wants to add the site to the home screen, on mac os it can be added by the chrome menu.\n\n## How was it made\n\nThe site's frontend has been made with **Vue.js** and **Typescript**, in particular by using the **Vuetify.js** ui framework. **vue-router** has been used for the routing, **Vuex** as the data store and a **service-worker** was added to make the site a **PWA**. With a **Firebase Cloud Messaging\"**, if the user agrees when the site gets entered for the first time, I can send **Push Notifications** when for instance I add a new exam or fix a bug. The server was made with **Node.js**, it simply serves the site, hosted with **Heroku**.\n\n## How to build it\n\nTo build the project:\n\n* Install `Node.js`\n* Clone the repository\n* On the root folder of the repo, execute `npm i` to download the node modules\n* On the `frontend` folder of the repo, execute `npm i` and `npm run build` to build the frontend\n* The `main.local.js` file is the local server, without all Heroku trash. Without the decrypted firebase config file, push notification will not work. Run `node main.local` on the root folder to run the local server\n* With a browser, test the site on `http://localhost:8080`\n\n## Project structure\n\nMade with [dree](https://github.com/euberdeveloper/dree)\n\n```\nunitn-tronchet\n ├── firebase-decrypted.json\n ├── firebase-encrypted.txt\n ├─\u003e frontend\n │   ├── .browserslistrc\n │   ├── .env\n │   ├── babel.config.js\n │   ├── package-lock.json\n │   ├── package.json\n │   ├── postcss.config.js\n │   ├─\u003e public\n │   │   ├── favicon.ico\n │   │   ├── favicon.png\n │   │   ├── firebase-messaging-sw.js\n │   │   ├─\u003e img\n │   │   │   └─\u003e icons\n │   │   ├── index.html\n │   │   ├── manifest.json\n │   │   ├── read_the_fucking_manual.png\n │   │   └── robots.txt\n │   ├── README.md\n │   ├─\u003e src\n │   │   ├── App.vue\n │   │   ├─\u003e assets\n │   │   │   └── content-copy.svg\n │   │   ├── auth.ts\n │   │   ├── cloud-messaging.ts\n │   │   ├─\u003e components\n │   │   │   ├─\u003e confirm-dialog\n │   │   │   │   ├── ConfirmDialog.enum.ts\n │   │   │   │   └── ConfirmDialog.vue\n │   │   │   ├─\u003e content\n │   │   │   │   └── Content.vue\n │   │   │   ├─\u003e drawer\n │   │   │   │   └── Drawer.vue\n │   │   │   ├─\u003e exam\n │   │   │   │   ├─\u003e exam-card\n │   │   │   │   │   ├─\u003e exam-card-bottom\n │   │   │   │   │   │   └── ExamCardBottom.vue\n │   │   │   │   │   ├─\u003e exam-card-exercise\n │   │   │   │   │   │   ├─\u003e exam-card-code-exercise\n │   │   │   │   │   │   │   ├─\u003e exam-card-code\n │   │   │   │   │   │   │   │   └── ExamCardCode.vue\n │   │   │   │   │   │   │   ├─\u003e exam-card-code-answer\n │   │   │   │   │   │   │   │   └── ExamCardCodeAnswer.vue\n │   │   │   │   │   │   │   └── ExamCardCodeExercise.vue\n │   │   │   │   │   │   ├─\u003e exam-card-true-or-false-exercise\n │   │   │   │   │   │   │   └── ExamCardTrueOrFalseExercise.vue\n │   │   │   │   │   │   └── ExamCardExercise.vue\n │   │   │   │   │   ├─\u003e exam-card-score\n │   │   │   │   │   │   └── ExamCardScore.vue\n │   │   │   │   │   └── ExamCard.vue\n │   │   │   │   └── Exam.vue\n │   │   │   ├─\u003e footer\n │   │   │   │   └── Footer.vue\n │   │   │   ├─\u003e home\n │   │   │   │   ├─\u003e home-card\n │   │   │   │   │   └── HomeCard.vue\n │   │   │   │   └── Home.vue\n │   │   │   ├─\u003e login\n │   │   │   │   ├─\u003e login-card\n │   │   │   │   │   ├─\u003e login-card-form\n │   │   │   │   │   │   ├── credentials.interface.ts\n │   │   │   │   │   │   └── LoginCardForm.vue\n │   │   │   │   │   └── LoginCard.vue\n │   │   │   │   └── Login.vue\n │   │   │   ├─\u003e not-found\n │   │   │   │   └── NotFound.vue\n │   │   │   └─\u003e toolbar\n │   │   │       ├─\u003e state-bar\n │   │   │       │   └── StateBar.vue\n │   │   │       └── Toolbar.vue\n │   │   ├── firebase.ts\n │   │   ├─\u003e locales\n │   │   │   ├── en.json\n │   │   │   └── it.json\n │   │   ├── main.ts\n │   │   ├─\u003e plugins\n │   │   │   ├── i18n.ts\n │   │   │   └── vuetify.ts\n │   │   ├── registerServiceWorker.ts\n │   │   ├── router.ts\n │   │   ├─\u003e schema\n │   │   │   ├─\u003e data\n │   │   │   │   ├── esame_2005-06.ts\n │   │   │   │   ├── esame_2005-07.ts\n │   │   │   │   └── exams.ts\n │   │   │   └─\u003e types\n │   │   │       ├── answer.interface.ts\n │   │   │       └── exam.interface.ts\n │   │   ├── shims-tsx.d.ts\n │   │   ├── shims-vue.d.ts\n │   │   ├── store.ts\n │   │   ├── valutation.ts\n │   │   └─\u003e views\n │   │       ├── ExamView.vue\n │   │       ├── HomeView.vue\n │   │       ├── LoginView.vue\n │   │       └── NotFound.vue\n │   ├── tsconfig.json\n │   ├── tslint.json\n │   └── vue.config.js\n ├── local.json\n ├── main.js\n ├── main.local.js\n ├── package-lock.json\n ├── package.json\n ├── Procfile\n ├── README.md\n ├─\u003e utilities\n │   ├── firebase-credentials.js\n │   ├── firebase-encryption.js\n │   └── redirect.js\n └─\u003e vuejs\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Feuberdeveloper%2Funitn-tronchet","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Feuberdeveloper%2Funitn-tronchet","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Feuberdeveloper%2Funitn-tronchet/lists"}