diff --git a/frontend/app/components/Sidebar.vue b/frontend/app/components/Sidebar.vue
index 3dd81b5..141ebb2 100644
--- a/frontend/app/components/Sidebar.vue
+++ b/frontend/app/components/Sidebar.vue
@@ -1,16 +1,29 @@
-
-
- π StudentMS
-
-
- Dashboard
- Students
- About
-
-
- © 2025 Atul Gunjal
-
-
-
-
\ No newline at end of file
+
+
+
+ π StudentMS
+
+
+
+
+
Welcome, Atul!
+
Admin
+
+
+
+
+ π Dashboard
+ π Students
+ π€ Profile
+ βοΈ Settings
+ π Notifications
+ βΉοΈ About
+
+
+
+
+ © 2025 Atul Gunjal
+
+
+
diff --git a/frontend/app/components/attendance/AttendanceForm.vue b/frontend/app/components/attendance/AttendanceForm.vue
new file mode 100644
index 0000000..0af200d
--- /dev/null
+++ b/frontend/app/components/attendance/AttendanceForm.vue
@@ -0,0 +1,106 @@
+
+
+
Record Attendance
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/frontend/app/components/attendance/AttendanceTable.vue b/frontend/app/components/attendance/AttendanceTable.vue
new file mode 100644
index 0000000..b8e525e
--- /dev/null
+++ b/frontend/app/components/attendance/AttendanceTable.vue
@@ -0,0 +1,82 @@
+
+
+
Attendance List
+
+
+
+
+ Student Name
+ Attendance Status
+ Action
+
+
+
+
+ {{ student.name }}
+
+
+ {{ capitalize(student.attendanceStatus) }}
+
+
+
+
+ Toggle Status
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/frontend/app/components/student/StudentCard.vue b/frontend/app/components/student/StudentCard.vue
new file mode 100644
index 0000000..3d2378e
--- /dev/null
+++ b/frontend/app/components/student/StudentCard.vue
@@ -0,0 +1,77 @@
+
+
+
+
+
+ {{ student.name.charAt(0).toUpperCase() }}
+
+
+
+
+
{{ student.name }}
+
{{ student.email }}
+
{{ student.phone }}
+
{{ formatDate(student.dob) }}
+
+
+
+
+
+
+ Class: {{ student.class.name }} - {{ student.class.section }}
+
+
+ {{ capitalize(student.attendanceStatus) }}
+
+
+
+
+
+
+ View Details
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/frontend/app/components/student/StudentDetails.vue b/frontend/app/components/student/StudentDetails.vue
new file mode 100644
index 0000000..6ad6422
--- /dev/null
+++ b/frontend/app/components/student/StudentDetails.vue
@@ -0,0 +1,99 @@
+
+
+
+ Student Details: {{ student.name }}
+
+
+
+
+
+
Name:
+
{{ student.name }}
+
+
+
+
Email:
+
{{ student.email }}
+
+
+
+
Phone:
+
{{ student.phone }}
+
+
+
+
Date of Birth:
+
{{ formatDate(student.dob) }}
+
+
+
+
Gender:
+
{{ capitalize(student.gender) }}
+
+
+
+
Class:
+
{{ student.class.name }} - {{ student.class.section }}
+
+
+
+
+
+
Attendance Records
+
+
+
+
{{ formatDate(attendance.date) }}:
+
{{ attendance.status === 'present' ? 'Present' : 'Absent' }}
+
+
+
+
+
+
+
+ Edit Student
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/frontend/app/components/student/StudentForm.vue b/frontend/app/components/student/StudentForm.vue
new file mode 100644
index 0000000..6878257
--- /dev/null
+++ b/frontend/app/components/student/StudentForm.vue
@@ -0,0 +1,74 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/frontend/app/components/student/StudentTable.vue b/frontend/app/components/student/StudentTable.vue
new file mode 100644
index 0000000..69fd538
--- /dev/null
+++ b/frontend/app/components/student/StudentTable.vue
@@ -0,0 +1,97 @@
+
+
+
+
+
+ ID
+ Name
+ Email
+ Phone
+ Class
+ Actions
+
+
+
+
+
+ {{ student.id }}
+ {{ student.name }}
+ {{ student.email }}
+ {{ student.phone }}
+ {{ student.class_name }}
+
+ Edit
+ Delete
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/frontend/app/components/ui/Alert.vue b/frontend/app/components/ui/Alert.vue
new file mode 100644
index 0000000..f20e08e
--- /dev/null
+++ b/frontend/app/components/ui/Alert.vue
@@ -0,0 +1,88 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
{{ message }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/frontend/app/components/ui/Loader.vue b/frontend/app/components/ui/Loader.vue
new file mode 100644
index 0000000..8e591e2
--- /dev/null
+++ b/frontend/app/components/ui/Loader.vue
@@ -0,0 +1,36 @@
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/frontend/app/components/ui/Modal.vue b/frontend/app/components/ui/Modal.vue
new file mode 100644
index 0000000..adc4ff7
--- /dev/null
+++ b/frontend/app/components/ui/Modal.vue
@@ -0,0 +1,68 @@
+
+
+
+
+
+
+
+
{{ title }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Cancel
+ Confirm
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/frontend/app/components/ui/Pagination.vue b/frontend/app/components/ui/Pagination.vue
new file mode 100644
index 0000000..305bb5c
--- /dev/null
+++ b/frontend/app/components/ui/Pagination.vue
@@ -0,0 +1,72 @@
+
+
+
+
+ Previous
+
+
+
+
+
+ {{ page }}
+
+
+
+
+
+ Next
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/frontend/app/components/ui/SearchBar.vue b/frontend/app/components/ui/SearchBar.vue
new file mode 100644
index 0000000..313ebfc
--- /dev/null
+++ b/frontend/app/components/ui/SearchBar.vue
@@ -0,0 +1,91 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ result.name }}
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/frontend/app/composables/useDirectus.js b/frontend/app/composables/useDirectus.js
new file mode 100644
index 0000000..958227b
--- /dev/null
+++ b/frontend/app/composables/useDirectus.js
@@ -0,0 +1,62 @@
+// frontend/composables/useDirectus.js
+import axios from 'axios'
+
+const DIRECTUS_API_URL = '/api/directus'
+// Create a reusable axios instance with default config
+const directusApi = axios.create({
+ baseURL: DIRECTUS_API_URL,
+ headers: {
+ 'Content-Type': 'application/json',
+ // Add this if you're using static token authentication
+ // 'Authorization': `Bearer YOUR_STATIC_TOKEN`
+ }
+})
+
+export const useDirectus = () => {
+ const fetchCollection = async (collection, params = {}) => {
+ try {
+ const response = await directusApi.get(`/items/${collection}`, { params })
+ return response.data.data
+ } catch (error) {
+ console.error('Error fetching data from Directus:', error)
+ throw error
+ }
+ }
+
+ const createItem = async (collection, itemData) => {
+ try {
+ const response = await directusApi.post(`/items/${collection}`, itemData)
+ return response.data.data
+ } catch (error) {
+ console.error('Error creating item in Directus:', error)
+ throw error
+ }
+ }
+
+ const updateItem = async (collection, itemId, itemData) => {
+ try {
+ const response = await directusApi.patch(`/items/${collection}/${itemId}`, itemData)
+ return response.data.data
+ } catch (error) {
+ console.error('Error updating item in Directus:', error)
+ throw error
+ }
+ }
+
+ const deleteItem = async (collection, itemId) => {
+ try {
+ const response = await directusApi.delete(`/items/${collection}/${itemId}`)
+ return response.data.data
+ } catch (error) {
+ console.error('Error deleting item from Directus:', error)
+ throw error
+ }
+ }
+
+ return {
+ fetchCollection,
+ createItem,
+ updateItem,
+ deleteItem
+ }
+}
\ No newline at end of file
diff --git a/frontend/app/server/middleware/directus-proxy.js b/frontend/app/server/middleware/directus-proxy.js
new file mode 100644
index 0000000..37fd1be
--- /dev/null
+++ b/frontend/app/server/middleware/directus-proxy.js
@@ -0,0 +1,24 @@
+// server/middleware/directus-proxy.js
+import { createProxyMiddleware } from 'http-proxy-middleware'
+
+export default defineEventHandler((event) => {
+ const proxy = createProxyMiddleware({
+ target: 'http://localhost:8055', // Your Directus URL
+ changeOrigin: true,
+ pathRewrite: {
+ '^/api/directus': '', // Remove `/api/directus` when forwarding to Directus
+ },
+ onProxyReq(proxyReq) {
+ // Add auth headers if needed (e.g., static token)
+ proxyReq.setHeader('Authorization', 'Bearer YOUR_STATIC_TOKEN')
+ },
+ })
+
+ // Forward the request
+ return new Promise((resolve, reject) => {
+ proxy(event.node.req, event.node.res, (err) => {
+ if (err) reject(err)
+ else resolve()
+ })
+ })
+})
\ No newline at end of file
diff --git a/frontend/docker-compose.yml b/frontend/docker-compose.yml
new file mode 100644
index 0000000..e034593
--- /dev/null
+++ b/frontend/docker-compose.yml
@@ -0,0 +1,16 @@
+version: '3.8'
+
+services:
+ directus:
+ image: directus/directus:latest
+ ports:
+ - 8055:8055
+ environment:
+ KEY: your-secret-key
+ ADMIN_EMAIL: admin@example.com
+ ADMIN_PASSWORD: admin123
+ volumes:
+ - directus_data:/data
+
+volumes:
+ directus_data:
diff --git a/frontend/nuxt.config.ts b/frontend/nuxt.config.ts
index be5508d..53aabec 100644
--- a/frontend/nuxt.config.ts
+++ b/frontend/nuxt.config.ts
@@ -8,4 +8,14 @@ export default defineNuxtConfig({
tailwindcss(),
],
},
+
+ // proxy api
+ nitro: {
+ devProxy: {
+ '/api/directus': {
+ target: 'http://localhost:8055',
+ changeOrigin: true,
+ },
+ },
+ },
});
\ No newline at end of file
diff --git a/frontend/package-lock.json b/frontend/package-lock.json
index 9ee24a9..8f1eef2 100644
--- a/frontend/package-lock.json
+++ b/frontend/package-lock.json
@@ -7,10 +7,13 @@
"name": "nuxt-app",
"hasInstallScript": true,
"dependencies": {
+ "@directus/sdk": "^18.0.3",
"@nuxtjs/auth-next": "^5.0.0-1667386184.dfbbb54",
"@tailwindcss/vite": "^4.1.4",
"appwrite": "^17.0.2",
+ "axios": "^1.8.4",
"chart.js": "^4.4.9",
+ "http-proxy-middleware": "^3.0.5",
"nuxt": "^3.16.2",
"tailwindcss": "^4.1.4",
"vue": "^3.5.13",
@@ -487,6 +490,18 @@
"node": ">=14"
}
},
+ "node_modules/@directus/sdk": {
+ "version": "18.0.3",
+ "resolved": "https://registry.npmjs.org/@directus/sdk/-/sdk-18.0.3.tgz",
+ "integrity": "sha512-PnEDRDqr2x/DG3HZ3qxU7nFp2nW6zqJqswjii57NhriXgTz4TBUI8NmSdzQvnyHuTL9J0nedYfQGfW4v8odS1A==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=18.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/directus/directus?sponsor=1"
+ }
+ },
"node_modules/@emnapi/core": {
"version": "1.4.3",
"resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.4.3.tgz",
@@ -2306,6 +2321,15 @@
"vue": "*"
}
},
+ "node_modules/@nuxtjs/auth-next/node_modules/axios": {
+ "version": "0.26.1",
+ "resolved": "https://registry.npmjs.org/axios/-/axios-0.26.1.tgz",
+ "integrity": "sha512-fPwcX4EvnSHuInCMItEhAGnaSEXRBjtzh9fOtsE6E1G6p7vl7edEeZe11QHf18+6+9gR5PbKV/sGKNaD8YaMeA==",
+ "license": "MIT",
+ "dependencies": {
+ "follow-redirects": "^1.14.8"
+ }
+ },
"node_modules/@nuxtjs/auth-next/node_modules/consola": {
"version": "2.15.3",
"resolved": "https://registry.npmjs.org/consola/-/consola-2.15.3.tgz",
@@ -2376,6 +2400,34 @@
"http-proxy-middleware": "^1.0.6"
}
},
+ "node_modules/@nuxtjs/proxy/node_modules/http-proxy-middleware": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-1.3.1.tgz",
+ "integrity": "sha512-13eVVDYS4z79w7f1+NPllJtOQFx/FdUW4btIvVRMaRlUY9VGstAbo5MOhLEuUgZFRHn3x50ufn25zkj/boZnEg==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/http-proxy": "^1.17.5",
+ "http-proxy": "^1.18.1",
+ "is-glob": "^4.0.1",
+ "is-plain-obj": "^3.0.0",
+ "micromatch": "^4.0.2"
+ },
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/@nuxtjs/proxy/node_modules/is-plain-obj": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz",
+ "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
"node_modules/@oxc-parser/binding-darwin-arm64": {
"version": "0.56.5",
"resolved": "https://registry.npmjs.org/@oxc-parser/binding-darwin-arm64/-/binding-darwin-arm64-0.56.5.tgz",
@@ -4561,6 +4613,12 @@
"integrity": "sha512-tLRNUXati5MFePdAk8dw7Qt7DpxPB60ofAgn8WRhW6a2rcimZnYBP9oxHiv0OHy+Wz7kPMG+t4LGdt31+4EmGg==",
"license": "MIT"
},
+ "node_modules/asynckit": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
+ "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==",
+ "license": "MIT"
+ },
"node_modules/autoprefixer": {
"version": "10.4.21",
"resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.21.tgz",
@@ -4599,12 +4657,14 @@
}
},
"node_modules/axios": {
- "version": "0.26.1",
- "resolved": "https://registry.npmjs.org/axios/-/axios-0.26.1.tgz",
- "integrity": "sha512-fPwcX4EvnSHuInCMItEhAGnaSEXRBjtzh9fOtsE6E1G6p7vl7edEeZe11QHf18+6+9gR5PbKV/sGKNaD8YaMeA==",
+ "version": "1.8.4",
+ "resolved": "https://registry.npmjs.org/axios/-/axios-1.8.4.tgz",
+ "integrity": "sha512-eBSYY4Y68NNlHbHBMdeDmKNtDgXWhQsJcGqzO3iLUM0GraQFSS9cVgPX5I9b3lbdFKyYoAEGAZF1DwhTaljNAw==",
"license": "MIT",
"dependencies": {
- "follow-redirects": "^1.14.8"
+ "follow-redirects": "^1.15.6",
+ "form-data": "^4.0.0",
+ "proxy-from-env": "^1.1.0"
}
},
"node_modules/axios-retry": {
@@ -5140,6 +5200,18 @@
"text-hex": "1.0.x"
}
},
+ "node_modules/combined-stream": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
+ "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
+ "license": "MIT",
+ "dependencies": {
+ "delayed-stream": "~1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
"node_modules/commander": {
"version": "10.0.1",
"resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz",
@@ -5681,6 +5753,15 @@
"integrity": "sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==",
"license": "MIT"
},
+ "node_modules/delayed-stream": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
+ "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
"node_modules/delegates": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz",
@@ -6114,6 +6195,21 @@
"node": ">= 0.4"
}
},
+ "node_modules/es-set-tostringtag": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz",
+ "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==",
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.6",
+ "has-tostringtag": "^1.0.2",
+ "hasown": "^2.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
"node_modules/esbuild": {
"version": "0.25.2",
"resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.2.tgz",
@@ -6584,6 +6680,42 @@
"url": "https://github.com/sponsors/isaacs"
}
},
+ "node_modules/form-data": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.2.tgz",
+ "integrity": "sha512-hGfm/slu0ZabnNt4oaRZ6uREyfCj6P4fT/n6A1rGV+Z0VdGXjfOhVUpkn6qVQONHGIFwmveGXyDs75+nr6FM8w==",
+ "license": "MIT",
+ "dependencies": {
+ "asynckit": "^0.4.0",
+ "combined-stream": "^1.0.8",
+ "es-set-tostringtag": "^2.1.0",
+ "mime-types": "^2.1.12"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/form-data/node_modules/mime-db": {
+ "version": "1.52.0",
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
+ "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/form-data/node_modules/mime-types": {
+ "version": "2.1.35",
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
+ "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
+ "license": "MIT",
+ "dependencies": {
+ "mime-db": "1.52.0"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
"node_modules/formdata-polyfill": {
"version": "4.0.10",
"resolved": "https://registry.npmjs.org/formdata-polyfill/-/formdata-polyfill-4.0.10.tgz",
@@ -7027,6 +7159,21 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/has-tostringtag": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz",
+ "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==",
+ "license": "MIT",
+ "dependencies": {
+ "has-symbols": "^1.0.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
"node_modules/has-unicode": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz",
@@ -7137,31 +7284,20 @@
}
},
"node_modules/http-proxy-middleware": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-1.3.1.tgz",
- "integrity": "sha512-13eVVDYS4z79w7f1+NPllJtOQFx/FdUW4btIvVRMaRlUY9VGstAbo5MOhLEuUgZFRHn3x50ufn25zkj/boZnEg==",
+ "version": "3.0.5",
+ "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-3.0.5.tgz",
+ "integrity": "sha512-GLZZm1X38BPY4lkXA01jhwxvDoOkkXqjgVyUzVxiEK4iuRu03PZoYHhHRwxnfhQMDuaxi3vVri0YgSro/1oWqg==",
"license": "MIT",
"dependencies": {
- "@types/http-proxy": "^1.17.5",
+ "@types/http-proxy": "^1.17.15",
+ "debug": "^4.3.6",
"http-proxy": "^1.18.1",
- "is-glob": "^4.0.1",
- "is-plain-obj": "^3.0.0",
- "micromatch": "^4.0.2"
+ "is-glob": "^4.0.3",
+ "is-plain-object": "^5.0.0",
+ "micromatch": "^4.0.8"
},
"engines": {
- "node": ">=8.0.0"
- }
- },
- "node_modules/http-proxy-middleware/node_modules/is-plain-obj": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz",
- "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==",
- "license": "MIT",
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
}
},
"node_modules/http-shutdown": {
@@ -7493,6 +7629,15 @@
"node": ">=8"
}
},
+ "node_modules/is-plain-object": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz",
+ "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
"node_modules/is-reference": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/is-reference/-/is-reference-1.2.1.tgz",
@@ -10060,6 +10205,12 @@
"integrity": "sha512-hHVTzba3wboROl0/aWRRG9dMytgH6ow//STBZh43l/wQgmMhYhOFi0EHWAPtoCz9IAUymsyP0TSBHkhgMEGNnQ==",
"license": "MIT"
},
+ "node_modules/proxy-from-env": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
+ "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==",
+ "license": "MIT"
+ },
"node_modules/pump": {
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/pump/-/pump-3.0.2.tgz",
diff --git a/frontend/package.json b/frontend/package.json
index 88cc0aa..f3f8b2a 100644
--- a/frontend/package.json
+++ b/frontend/package.json
@@ -10,10 +10,13 @@
"postinstall": "nuxt prepare"
},
"dependencies": {
+ "@directus/sdk": "^18.0.3",
"@nuxtjs/auth-next": "^5.0.0-1667386184.dfbbb54",
"@tailwindcss/vite": "^4.1.4",
"appwrite": "^17.0.2",
+ "axios": "^1.8.4",
"chart.js": "^4.4.9",
+ "http-proxy-middleware": "^3.0.5",
"nuxt": "^3.16.2",
"tailwindcss": "^4.1.4",
"vue": "^3.5.13",
diff --git a/frontend/pages/Dashboard.vue b/frontend/pages/Dashboard.vue
index e2c0f5b..d736df8 100644
--- a/frontend/pages/Dashboard.vue
+++ b/frontend/pages/Dashboard.vue
@@ -3,32 +3,42 @@
Welcome to Your Dashboard
-
-
-
Profile
+
+
+ π€ Profile
View and edit your profile info.
-
+
-
-
-
Notifications
+
+
+ π Notifications
Check latest alerts and messages.
-
+
-
-
-
Settings
-
Manage account preferences.
-
+
+
+ βοΈ Settings
+ Manage student-related preferences.
+
-
-
-
Analytics
-
Track your app usage stats.
-
+
+
+ π Students
+ Manage student records and attendance.
+
-
-
\ No newline at end of file
diff --git a/frontend/pages/students/AddClass.vue b/frontend/pages/students/AddClass.vue
new file mode 100644
index 0000000..62b986e
--- /dev/null
+++ b/frontend/pages/students/AddClass.vue
@@ -0,0 +1,40 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/frontend/pages/students/[id].vue b/frontend/pages/students/[id].vue
new file mode 100644
index 0000000..6c3a00e
--- /dev/null
+++ b/frontend/pages/students/[id].vue
@@ -0,0 +1,55 @@
+
+
+
β Back to Students
+
+
Loading student details...
+
+
+
{{ student.name }}
+
+
+ Email: {{ student.email }}
+ Phone: {{ student.phone }}
+ Date of Birth: {{ student.dob }}
+ Gender: {{ student.gender }}
+ Class: {{ student.class_id?.name || 'N/A' }}
+ Section: {{ student.class_id?.section || 'N/A' }}
+
+
+
+
+ Student not found.
+
+
βοΈ Edit Student
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/frontend/pages/students/add.vue b/frontend/pages/students/add.vue
new file mode 100644
index 0000000..acdb5a4
--- /dev/null
+++ b/frontend/pages/students/add.vue
@@ -0,0 +1,100 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/frontend/pages/students/attendance.vue b/frontend/pages/students/attendance.vue
new file mode 100644
index 0000000..23fc5fb
--- /dev/null
+++ b/frontend/pages/students/attendance.vue
@@ -0,0 +1,79 @@
+
+
+
π Student Attendance Records
+
+
Loading attendance...
+
+
+
+
+
+ #
+ Student Name
+ Class
+ Date
+ Status
+
+
+
+
+ {{ index + 1 }}
+ {{ record.student_id?.name || 'β' }}
+ {{ record.student_id?.class_id?.name || 'β' }} {{ record.student_id?.class_id?.section }}
+ {{ record.date }}
+
+
+ {{ record.status }}
+
+
+
+
+
+
+
+
No attendance records found.
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/frontend/pages/students/classes.vue b/frontend/pages/students/classes.vue
new file mode 100644
index 0000000..e4b5b61
--- /dev/null
+++ b/frontend/pages/students/classes.vue
@@ -0,0 +1,61 @@
+
+
+
π« Classes List
+
+
Loading classes...
+
+
+
+
+
+ #
+ Class Name
+ Section
+
+
+
+
+ {{ index + 1 }}
+ {{ cls.name }}
+ {{ cls.section }}
+
+
+
+
+
+
No classes found.
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/frontend/pages/students/edit.vue b/frontend/pages/students/edit.vue
new file mode 100644
index 0000000..3112422
--- /dev/null
+++ b/frontend/pages/students/edit.vue
@@ -0,0 +1,113 @@
+
+
+
βοΈ Edit Student
+
+
+
+
Loading student info...
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/frontend/pages/students/index.vue b/frontend/pages/students/index.vue
new file mode 100644
index 0000000..fefd1c3
--- /dev/null
+++ b/frontend/pages/students/index.vue
@@ -0,0 +1,94 @@
+
+
+
+
π¨βπ Students List
+
+ β Add Student
+
+
+
+
Loading students...
+
+
+
+
+
+ #
+ Name
+ Email
+ Class
+ Actions
+
+
+
+
+ {{ index + 1 }}
+ {{ student.name }}
+ {{ student.email }}
+
+ {{ student.class_id?.name }} - {{ student.class_id?.section }}
+
+
+ View
+
+ Edit
+
+
+ Delete
+
+
+
+
+
+
+
No students found.
+
+
+
+
+
+
\ No newline at end of file
diff --git a/frontend/pages/students/profile.vue b/frontend/pages/students/profile.vue
new file mode 100644
index 0000000..529319d
--- /dev/null
+++ b/frontend/pages/students/profile.vue
@@ -0,0 +1,55 @@
+
+
+
π Student Profile
+
+
+
+
Name: {{ student.name }}
+
Email: {{ student.email }}
+
Phone: {{ student.phone }}
+
Date of Birth: {{ formatDate(student.dob) }}
+
Gender: {{ student.gender }}
+
+ Class:
+ {{ student.class_id?.name }} - {{ student.class_id?.section }}
+
+
+
+
+ βοΈ Edit Profile
+
+
+
+
Loading student profile...
+
+
+
+
+
\ No newline at end of file
diff --git a/frontend/pages/students/settings.vue b/frontend/pages/students/settings.vue
new file mode 100644
index 0000000..913d5d1
--- /dev/null
+++ b/frontend/pages/students/settings.vue
@@ -0,0 +1,75 @@
+
+
+
βοΈ Student Settings
+
+
+
+
+
+
+
\ No newline at end of file