{"id":26085207,"url":"https://github.com/layheng-hok/sussycourses","last_synced_at":"2026-04-13T05:45:31.905Z","repository":{"id":281359137,"uuid":"871951154","full_name":"Layheng-Hok/SUSSYCourses","owner":"Layheng-Hok","description":"SUSSYCourses: Role-based OpenCourseWare Web App in Vue.js + Spring Boot - SUSTech project of CS309: Object-oriented Analysis and Design in Fall 2024 - Score: 100/100","archived":false,"fork":false,"pushed_at":"2025-03-08T14:17:41.000Z","size":24451,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-03-08T15:24:36.886Z","etag":null,"topics":["cs309","ocw","opencourseware","postgres","postgresql","project","psql","role-based-access-control","role-based-authenticaton","role-based-authorization","spring","spring-boot","sustech","vue","vuejs2","webapp","website"],"latest_commit_sha":null,"homepage":"","language":"Vue","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/Layheng-Hok.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":"2024-10-13T12:03:50.000Z","updated_at":"2025-03-08T14:25:43.000Z","dependencies_parsed_at":"2025-03-08T15:35:02.601Z","dependency_job_id":null,"html_url":"https://github.com/Layheng-Hok/SUSSYCourses","commit_stats":null,"previous_names":["layheng-hok/sussycourses"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Layheng-Hok%2FSUSSYCourses","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Layheng-Hok%2FSUSSYCourses/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Layheng-Hok%2FSUSSYCourses/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Layheng-Hok%2FSUSSYCourses/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Layheng-Hok","download_url":"https://codeload.github.com/Layheng-Hok/SUSSYCourses/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":242650910,"owners_count":20163610,"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":["cs309","ocw","opencourseware","postgres","postgresql","project","psql","role-based-access-control","role-based-authenticaton","role-based-authorization","spring","spring-boot","sustech","vue","vuejs2","webapp","website"],"created_at":"2025-03-09T05:34:40.445Z","updated_at":"2025-12-31T00:47:17.750Z","avatar_url":"https://github.com/Layheng-Hok.png","language":"Vue","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cdiv align=center\u003e\n    \n# SUSSYCourses\n\nRole-based OpenCourseWare Web App in Vue.js + Spring Boot\n\nSUSTech 2024 Fall Project of `CS309 - Object-oriented Analysis and Design` Led by Professor [Yuqun ZHANG](https://zhangyuqun.github.io/)\n\n\u003c/div\u003e\n\n### Simplified Directory Path Diagram\n```\n.\n├── SUSSYCourses\n│   ├── build\n│   ├── gradle\n│   ├── node_modules\n│   └── src\n│       ├── frontend                                                                  # main folder of frontend code\n│       │   ├── src\n│       │   │   ├── App.vue\n│       │   │   ├── assets\n│       │   │   ├── components\n│       │   │   │   ├── 403.vue\n│       │   │   │   ├── 404.vue\n│       │   │   │   ├── AccountSecurity.vue\n│       │   │   │   ├── AdminPage.vue\n│       │   │   │   ├── AnnouncementForm.vue\n│       │   │   │   ├── BarChart.vue\n│       │   │   │   ├── Chat.vue\n│       │   │   │   ├── CommentSection.vue\n│       │   │   │   ├── CourseBreakdown.vue\n│       │   │   │   ├── CourseList.vue\n│       │   │   │   ├── CoursePage.vue\n│       │   │   │   ├── Courseware.vue\n│       │   │   │   ├── DoughnutChart.vue\n│       │   │   │   ├── EditProfile.vue\n│       │   │   │   ├── FilePreview.vue\n│       │   │   │   ├── Guideline.vue\n│       │   │   │   ├── HelpSupport.vue\n│       │   │   │   ├── HeroBanner.vue                                                     \n│       │   │   │   ├── LogIn.vue\n│       │   │   │   ├── MainPage.vue\n│       │   │   │   ├── Notifications.vue\n│       │   │   │   ├── PrivacyPolicy.vue\n│       │   │   │   ├── ProfilePage.vue\n│       │   │   │   ├── ProfileSidebar.vue\n│       │   │   │   ├── PublicCoursePage.vue  \n│       │   │   │   ├── PublicCourseware.vue\n│       │   │   │   ├── PublicFilePreview.vue\n│       │   │   │   ├── RatingAndReview.vue\n│       │   │   │   ├── Security.vue\n│       │   │   │   ├── SignUpStudent.vue\n│       │   │   │   ├── SignUpTeacher.vue\n│       │   │   │   ├── StreamInfo.vue\n│       │   │   │   ├── StudentPage.vue                                                        \n│       │   │   │   ├── StudentsList.vue\n│       │   │   │   ├── TeacherCourse.vue\n│       │   │   │   ├── TeacherCourses.vue\n│       │   │   │   ├── TeacherCoursesDetails.vue\n│       │   │   │   ├── TeacherCourseware.vue\n│       │   │   │   ├── TeacherDashboard.vue\n│       │   │   │   ├── TeacherNotifications.vue\n│       │   │   │   ├── TeacherPage.vue\n│       │   │   │   ├── TeacherProfile.vue\n│       │   │   │   ├── TeacherStreaming.vue\n│       │   │   │   ├── TermsOfUse.vue\n│       │   │   │   ├── UserInfo.vue\n│       │   │   │   ├── UserList.vue\n│       │   │   │   └── VerifyEmail.vue\n│       │   │   ├── main.js\n│       │   │   ├── router\n│       │   │   │   └── index.js\n│       │   │   └── services\n│       │   │       └── axiosInstance.js\n│       │   └── vue.config.js\n│       ├── main                                                                      # main folder of backend code\n│       │   ├── config\n│       │   │   ├── admin_key.json\n│       │   │   └── storage_key.json\n│       │   ├── java\n│       │   │   └── com\n│       │   │       └── sustech\n│       │   │           └── cs309\n│       │   │               └── project\n│       │   │                   └── sussycourses\n│       │   │                       ├── SussyCoursesApplication.java                  # driver code of Spring Boot\n│       │   │                       ├── controller\n│       │   │                       │   ├── AuthController.java\n│       │   │                       │   ├── CommentsController.java\n│       │   │                       │   ├── CourseController.java\n│       │   │                       │   ├── CourseStudentController.java\n│       │   │                       │   ├── CoursewareController.java\n│       │   │                       │   ├── CoursewareStudentController.java\n│       │   │                       │   ├── NotificationController.java\n│       │   │                       │   ├── RatingController.java\n│       │   │                       │   ├── StreamController.java\n│       │   │                       │   └── WebAppUserController.java\n│       │   │                       ├── domain\n│       │   │                       │   ├── Comment.java\n│       │   │                       │   ├── Course.java\n│       │   │                       │   ├── CourseStudent.java\n│       │   │                       │   ├── Courseware.java\n│       │   │                       │   ├── CoursewareStudent.java\n│       │   │                       │   ├── Notification.java\n│       │   │                       │   ├── Rating.java\n│       │   │                       │   ├── Role.java\n│       │   │                       │   ├── Stream.java\n│       │   │                       │   └── WebAppUser.java\n│       │   │                       ├── dto\n│       │   │                       │   ├── AdminCourseDetailResponse.java\n│       │   │                       │   ├── ApprovedCoursesResponse.java\n│       │   │                       │   ├── BasicCourseResponse.java\n│       │   │                       │   ├── ChangePasswordRequest.java\n│       │   │                       │   ├── CommentCreationRequest.java\n│       │   │                       │   ├── CommentResponse.java\n│       │   │                       │   ├── CourseProgressResponse.java\n│       │   │                       │   ├── CourseRequest.java\n│       │   │                       │   ├── CourseStudentListResponse.java\n│       │   │                       │   ├── CoursewareListResponse.java\n│       │   │                       │   ├── CoursewareRequest.java\n│       │   │                       │   ├── CoursewareResponse.java\n│       │   │                       │   ├── CoursewareVersionResponse.java\n│       │   │                       │   ├── CourseworkDataResponse.java\n│       │   │                       │   ├── InstructorCourseDetailResponse.java\n│       │   │                       │   ├── InstructorDetailResponse.java\n│       │   │                       │   ├── LoginRequest.java\n│       │   │                       │   ├── NotificationCreationRequest.java\n│       │   │                       │   ├── NotificationListResponse.java\n│       │   │                       │   ├── NotificationResponse.java\n│       │   │                       │   ├── RatingRequest.java\n│       │   │                       │   ├── RatingResponse.java\n│       │   │                       │   ├── RegistrationRequest.java\n│       │   │                       │   ├── ReplyRequest.java\n│       │   │                       │   ├── StreamResponse.java\n│       │   │                       │   ├── StudentCourseDetailResponse.java\n│       │   │                       │   ├── StudentCourseListResponse.java\n│       │   │                       │   ├── StudentDetailResponse.java\n│       │   │                       │   ├── TopRatedCourseResponse.java\n│       │   │                       │   ├── TopRatedInstructorResponse.java\n│       │   │                       │   ├── UpdateCoursewareRequest.java\n│       │   │                       │   ├── UpdateUserRequest.java\n│       │   │                       │   └── UserResponse.java\n│       │   │                       ├── repository\n│       │   │                       │   ├── CommentRepository.java\n│       │   │                       │   ├── CourseRepository.java\n│       │   │                       │   ├── CourseStudentRepository.java\n│       │   │                       │   ├── CoursewareRepository.java\n│       │   │                       │   ├── CoursewareStudentRepository.java\n│       │   │                       │   ├── NotificationRepository.java\n│       │   │                       │   ├── RatingRepository.java\n│       │   │                       │   ├── RoleRepository.java\n│       │   │                       │   ├── StreamRepository.java\n│       │   │                       │   └── WebAppUserRepository.java\n│       │   │                       ├── security\n│       │   │                       │   ├── CustomUserDetails.java\n│       │   │                       │   └── SecurityConfig.java\n│       │   │                       ├── service\n│       │   │                       │   ├── CommentService.java\n│       │   │                       │   ├── CourseService.java\n│       │   │                       │   ├── CourseStudentService.java\n│       │   │                       │   ├── CoursewareService.java\n│       │   │                       │   ├── CoursewareStudentService.java\n│       │   │                       │   ├── CustomUserDetailsService.java\n│       │   │                       │   ├── EmailService.java\n│       │   │                       │   ├── NotificationService.java\n│       │   │                       │   ├── RatingService.java\n│       │   │                       │   ├── StreamService.java\n│       │   │                       │   ├── VerificationTokenService.java\n│       │   │                       │   └── WebAppUserService.java\n│       │   │                       └── utils\n│       │   │                           └── CloudUtils.java\n│       │   └── resources\n│       │       ├── application.yml\n│       │       ├── public\n│       │       ├── schema.sql\n│       │       ├── static\n│       │       └── templates\n│       └── test\n└── README.md\n\n```\n\n### Tech Stack\n#### Frontend\n\u003cp align=\"left\"\u003e\n    \u003ca href=\"https://developer.mozilla.org/en-US/docs/Web/HTML\" target=\"_blank\" rel=\"noreferrer\"\u003e\n        \u003cimg src=\"https://upload.wikimedia.org/wikipedia/commons/3/38/HTML5_Badge.svg\" alt=\"html5\" width=\"40\" height=\"40\"/\u003e\n    \u003c/a\u003e\n    \u003ca href=\"https://developer.mozilla.org/en-US/docs/Web/CSS\" target=\"_blank\" rel=\"noreferrer\"\u003e\n        \u003cimg src=\"https://upload.wikimedia.org/wikipedia/commons/6/62/CSS3_logo.svg\" alt=\"css3\" width=\"40\" height=\"40\"/\u003e\n    \u003c/a\u003e\n    \u003ca href=\"https://developer.mozilla.org/en-US/docs/Web/JavaScript\" target=\"_blank\" rel=\"noreferrer\"\u003e \n        \u003cimg src=\"https://raw.githubusercontent.com/devicons/devicon/master/icons/javascript/javascript-original.svg\" alt=\"javascript\" width=\"40\" height=\"40\"/\u003e\n    \u003c/a\u003e\n    \u003ca href=\"https://vuejs.org/\" target=\"_blank\" rel=\"noreferrer\"\u003e \n        \u003cimg src=\"https://upload.wikimedia.org/wikipedia/commons/thumb/9/95/Vue.js_Logo_2.svg/1024px-Vue.js_Logo_2.svg.png\" alt=\"vuejs\" width=\"45\" height=\"40\"/\u003e\n    \u003c/a\u003e\n\u003c/p\u003e\n\n#### Backend\n\u003cp align=\"left\"\u003e\n    \u003ca href=\"https://spring.io/\" target=\"_blank\" rel=\"noreferrer\"\u003e\n        \u003cimg src=\"https://www.vectorlogo.zone/logos/springio/springio-icon.svg\" alt=\"spring\" width=\"40\" height=\"40\"/\u003e\n    \u003c/a\u003e\n    \u003ca href=\"https://www.postgresql.org\" target=\"_blank\" rel=\"noreferrer\"\u003e\n        \u003cimg src=\"https://raw.githubusercontent.com/devicons/devicon/master/icons/postgresql/postgresql-original-wordmark.svg\" alt=\"postgresql\" width=\"40\" height=\"40\"/\u003e\n    \u003c/a\u003e\n    \u003ca href=\"https://cloud.google.com\" target=\"_blank\" rel=\"noreferrer\"\u003e \n        \u003cimg src=\"https://www.vectorlogo.zone/logos/google_cloud/google_cloud-icon.svg\" alt=\"gcp\" width=\"40\" height=\"40\"/\u003e \n    \u003c/a\u003e\n    \u003ca href=\"https://gradle.org/\" target=\"_blank\" rel=\"noreferrer\"\u003e\n        \u003cimg src=\"https://cdn.iconscout.com/icon/free/png-512/free-gradle-logo-icon-download-in-svg-png-gif-file-formats--programming-language-logos-pack-icons-1174969.png?f=webp\u0026w=512\" alt=\"gradle\" width=\"40\" height=\"40\"/\u003e\n    \u003c/a\u003e\n\u003c/p\u003e\n\n\n### Features  \n\n#### For Administrators  \n- **Course Management**  \n  - Approve course creation requests submitted by instructors  \n\n#### For Instructors  \n- **Course Management**  \n  - Apply for course creation; courses can be:  \n    - **Open** (anyone can join)  \n    - **Semi-open** (students must request to join)  \n    - **Non-open** (instructors manually add students)  \n  - Make announcements to students in a specific course  \n  - Start a live stream for remote learning and automatically notify students\n\n- **Courseware Management**  \n  - Upload courseware, including but not limited to DOCX, PDF, MD, PPTX, and MP4  \n  - Categorize courseware into lectures, assignments, and projects  \n  - Update courseware with version tracking  \n  - Set download permissions for courseware  \n  - Enforce video anti-cheat (only one video can be played at a time)  \n  - Upload supplementary materials (e.g., data, code) for students  \n\n- **Course Evaluation**  \n  - Receive student feedback on content quality, teaching effectiveness, and workload balance  \n\n#### For Students  \n- **Course Management**  \n  - Join an open course or request to join a semi-open course  \n  - Receive notifications for updates and course announcements  \n\n- **Learning Resources**  \n  - View top-rated courses and instructors  \n  - Access and download courseware (if permitted)  \n  - Watch course videos online or join a live lecture stream  \n  - Access a free LLM/AI chatbot  \n\n- **Engagement \u0026 Feedback**  \n  - Like favorite courses  \n  - Comment on courseware and participate in instructor Q\u0026A (supports text and media formats)  \n  - Submit course evaluations with ratings and reviews  \n\n- **Homework \u0026 Progress**  \n  - Submit homework assignments  \n  - Track courseware viewing progress  \n  - Earn points for engagement, including providing feedback and completing course materials\n\n### Project Setup\n\n#### Prerequisites\nEnsure you have the following installed:\n- [Node.js](https://nodejs.org/) (Latest LTS recommended)\n- [Vue CLI](https://cli.vuejs.org/) (`npm install -g @vue/cli`)\n- [Java 17+](https://adoptium.net/)\n- [Gradle](https://gradle.org/install/)\n- [PostgreSQL](https://www.postgresql.org/download/)\n\n#### Database Setup\n1. Start PostgreSQL and create a database:\n    ```sql\n    CREATE DATABASE cs309_project;\n    ```\n2. Update `application.yml` in `src/main/resources/` with your database credentials:\n    ```properties\n    spring:\n      datasource:\n        url: jdbc:postgresql://localhost:5432/cs309_project\n        username: your_username\n        password: your_password\n    ```\n\n#### Backend Setup\n1. Navigate to the backend directory:\n    ```sh\n    cd main\n    ```\n2. Build and run the Spring Boot application:\n    ```sh\n    ./gradlew bootRun\n    ```\n3. However, IntelliJ IDEA is a recommended approach to run the backend server.\n\n   The backend will start on **http://localhost:8081**.\n\n\n#### Frontend Setup\n1. Navigate to the frontend directory:\n    ```sh\n    cd frontend\n    ```\n2. Install dependencies:\n    ```sh\n    npm install\n    ```\n3. Run the server:\n    ```sh\n    npm run serve\n    ```\n    The frontend will be available at **http://localhost:8080**.\n\n#### Running the Full Stack Application\n1. Ensure PostgreSQL is running.\n2. Start the backend using `./gradlew bootRun`.\n3. Start the frontend using `npm run dev`.\n4. Open `http://localhost:8080` in your browser.\n\n#### Troubleshooting\n- **Port Conflicts:** Ensure no other applications are running on ports `8080` or `8081`.\n- **Database Connection Issues:** Double-check PostgreSQL credentials in `application.yml`.\n- **Vue Not Loading:** Clear cache and restart the development server.\n  ```sh\n  rm -rf node_modules package-lock.json\n  npm install\n  npm run serve\n  ```\n  \n### Contributors\n\n| Name                                | Role     |\n|-------------------------------------|----------|\n| [Jaouhara Zerhouni Khal](https://github.com/Jouwy)         | Frontend |\n| [Tan Hao Yang](https://github.com/haoyanghy)          | Frontend |\n| [Harrold Tok Kwan Hang](https://github.com/Barracudapi)                 | Backend  |\n| [Hok Lay Heng](https://github.com/Layheng-Hok)                   | Backend  |\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flayheng-hok%2Fsussycourses","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Flayheng-hok%2Fsussycourses","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flayheng-hok%2Fsussycourses/lists"}