Taskmate is a cross-platform desktop application that allows SUSTech students, teachers, and student assistants to log in, upload homework, collaborate in real-time on grading assignments, and view score statistics using their spaces.sustech.cloud account.
-
Operating System: Windows 10, MacOS, Linux
-
Development Tools: Idea, VSCode
-
Program Language: rust, Vue, HTML, CSS, SCSS, TypeScript, JavaScript
-
Technology Stack: Tauri
-
Package Manager: Cargo for Rust and pnpm for Vue
-
Version Control: GitHub
-
How to Run the Program:
# skip if you already have pnpm installed $ npm i -g pnpm # install dependencies $ pnpm install # development $ pnpm tauri dev
# run unit test $ pnpm test:unit # run ts test $ pnpm test
# build application on current os $ pnpm tauri build
tauri = { version = "1.2", features = ["dialog-all", "fs-all", "http-all", "http-multipart", "path-all", "protocol-all", "shell-open", "system-tray"] }
serde = { version = "1.0", features = ["derive"] }
serde_json = "1.0"
reqwest = { version = "0.11", features = ["blocking", "json", "multipart"] }
tokio = { version = "1", features = ["full"] }
hyper = { version = "0.14", features = ["full"] }
zip = "0.6.4"
anyhow = "*"
flate2 = "1.0.25"
tar = "0.4.38"
walkdir = "2.3.3"
url = "2.3.1"
tauri-plugin-deep-link = "0.1.1"
mime = "0.3.17"
- tauri: An open-source toolkit that aims to provide developers with a simple way to build desktop applications, supporting the use of web technologies (HTML/CSS/JS) to construct native GUI applications that are cross-platform (Windows/macOS/Linux).
- serde/serde_json: Two Serde libraries used for serializing and deserializing Rust data structures. They can convert data to other storage formats, such as JSON, and parse data from other storage formats.
- reqwest: A Rust HTTP client library that enables asynchronous or synchronous HTTP requests and supports JSON parsing, file uploading, and other functions.
- tokio: An asynchronous runtime library that allows Rust programs to implement an asynchronous programming model.
- hyper: A high-performance HTTP server and client based on Tokio implementation.
- zip: A library for compressing and decompressing ZIP files.
- anyhow: A library used for handling error cases, provides a set of Error types, macros, and functions that make error-handling code clearer and easier to read.
- flate2: A compression algorithm library that provides support for compressing and decompressing Gzip and zlib formats.
- tar: A library for reading and writing tar files.
- walkdir: A library for quickly recursively traversing a directory.
- url: A library for handling URLs.
- tauri-plugin-deep-link: A plugin that provides deep link support for the Tauri framework.
- mime: A MIME file type recognition library that returns inferred MIME types based on file names or extensions.
"@kangc/v-md-editor": "^2.1.7",
"@tauri-apps/api": "^1.2.0",
"@vueuse/core": "^9.13.0",
"crypto-js": "^4.1.1",
"echarts": "^5.4.2",
"element-plus": "^2.3.0",
"lodash": "^4.17.21",
"moment": "^2.29.4",
"next": "^13.4.3",
"pinia": "^2.0.34",
"pnpm": "^7.29.1",
"prismjs": "^1.29.0",
"vue": "^3.2.47",
"vue-pdf-embed": "^1.1.6",
"vue-router": "^4.1.6"
- @kangc/v-md-editor: A visual editor for rendering Markdown inside a Vue application.
- @tauri-apps/api: A JS/TS library used in the Tauri framework to access the Tauri API, providing a set of cross-platform APIs with which developers can access operating system functions.
- @vueuse/core: A Vue plugin that integrates a large number of useful custom Vue Hooks.
- crypto-js: A JavaScript encryption algorithm library that supports multiple encryption algorithms.
- echarts: A JavaScript-based visualization chart library.
- element-plus: A commonly used UI component library that includes widgets such as tables, pop-up windows, date pickers, and paginators.
- lodash: A utility library that provides many easy-to-use functions to help complete tasks, such as manipulating objects, arrays, strings, etc.
- moment: A time processing library used for formatting, displaying, parsing, and manipulating time.
- next: A package providing server-side rendering, automatic code splitting, and optimization for Vue applications.
- pinia: A Vue state management library that makes Vue state management simpler and clearer.
- pnpm: An alternative package management tool to NPM and Yarn, faster and space-saving.
- prismjs: A syntax highlighting library that can make code clearer and easier to understand.
- vue: The framework that we use in this project.
- vue-pdf-embed: A VueJS component (PDF Embed) that can encapsulate PDF files in preview form.
- vue-router: The official Vue router library used to implement client-side routing.
.github
CI/CD files.idea
IDE configuration filesdist
Final production code and resources for the projectnode_modules
Library rootsrc
Frontend files (Vue3 project)src-tauri
Backend files (Rust Cargo project)tests
Frontend test files
Others are configuration files.
pub fn open_browser(uri: &str) -> Result<(), ()>
: Open the default browser in your computer using the registry.fn extract_zip(test: &Path, target: &Path) -> Result<()>
: Extract files from a zip file.fn extract_targz(test: &Path, target: &Path) -> Result<()>
: Extract files from a tar.gz file.pub fn menu() -> SystemTray
: Show the system tray.pub fn handler(app: &AppHandle, event: SystemTrayEvent)
: Handle system tray operations.
pub async fn analyze_dir(target: &str) -> Result<String, String>
: Analyze the directory containing all downloaded submission files.pub async fn upload_file(url: &str, file_path: &str, key: &str, token: &str) -> Result<(), String>
: Upload local files to the cloud server.pub fn download_file(url: &str, file_path: &str, file_name: &str) -> Result<(), String>
: Download files from the cloud server to the AppData path.pub fn reg_url_protocol() -> Result<(), String>
: Open Taskmate from the browser.
interface User
: The role showing who you are.interface Semester
: The semester time of a course.interface Class
: The class of a whole course.interface Course
: The basic information of a course.interface ClassesResponseData
: The transfer object holding all returned classes from the server.interface Assignment
: The basic information of an assignment.interface Entry
: The entry of a particular assignment.interface Metrics
: The metrics of each problem in an assignment.interface AssignmentsResponseData
: The transfer object holding all returned assignments from the server.interface AssignmentInfoResponseData
: The transfer object holding all returned detailed assignment information from the server.interface Submission
: The submission information from a student.interface Answer
: The answer information containing file URLs.interface EntryProblemResponseData
: The transfer object holding entry response from the server.interface SubmissionListResponseData
: The transfer object holding all submissions from the server.interface SubmissionInfoResponseData
: The transfer object holding a particular submission from the server.interface Note
: The message interface for communicating.interface FileResponse
: The transfer object holding a file response information from the server.interface AnswerResponse
: The transfer object holding a particular answer response from the server.interface Entries
: The interface containing all entries.interface EntriesResponse
: The transfer object holding all returned entries from the server.interface UploadFile
: The interface for the uploader file.
async function login(token: string)
: Login by http://spaces.sustech.cloud.async function logout()
: Logout from http://spaces.sustech.cloud.async function getClassbyId(classId: string)
: Get a class interface from a particular class ID from the server.async function getClasses()
: Get all class interfaces from the server.async function getAssignments(classId: string)
: Get assignments from a particular class ID from the server.async function getEntry(classId: string, entryId: string)
: Get a particular entry interface based on a particular class ID and a particular entry ID.async function getCurrentUserSubmissions(classId: string, entryId: string)
: Get all submissions based on a particular class ID and a particular entry ID.async function getSubmissions(classId: string)
: Get all submissions based on a particular class ID.async function getSubmissionInfo(submissionName: string)
: Get all submissions based on a submission name.async function getEntries(classId: string)
: Get all entries from a particular class ID.async function uploadFile(classId: string, problemId: string, entryId: string, files: UploadFile[])
: Upload files to the server.async function returnSubmission(submissionName: string, score: number, comment?: string, metrics?: { [key: string]: number; })
: Return the score and comment of a submission.async function sendNote(classId: string, entryId: string, note: string)
: Send messages for calculating a particular assignment/submission.