diff --git a/src/layout/AppMenu.vue b/src/layout/AppMenu.vue index 93298f0..77be21c 100644 --- a/src/layout/AppMenu.vue +++ b/src/layout/AppMenu.vue @@ -30,6 +30,13 @@ const model = ref([ { label: 'تراکنش‌های انبار', icon: 'pi pi-fw pi-history', to: '/warehouse-items/transactions' }, { label: 'مکان‌های انبار', icon: 'pi pi-fw pi-map', to: '/warehouse-items/warehouses' } ] + }, + { + label: 'مدیریت سیستم', + items: [ + { label: 'کاربران', icon: 'pi pi-fw pi-users', to: '/users/list-users' }, + { label: 'نقش‌ها و دسترسی‌ها', icon: 'pi pi-fw pi-shield', to: '/roles/list-roles' } + ] } ]); diff --git a/src/router/index.js b/src/router/index.js index 7427be2..1e431ea 100644 --- a/src/router/index.js +++ b/src/router/index.js @@ -115,6 +115,17 @@ const router = createRouter({ name: 'list-warehouses', component: () => import('@/views/pages/WarehouseItems/ListWarehouses.vue') }, + // ─── Users & Roles ─────────────────────────────────────────── + { + path: '/users/list-users', + name: 'list-users', + component: () => import('@/views/pages/Users/ListUsers.vue') + }, + { + path: '/roles/list-roles', + name: 'list-roles', + component: () => import('@/views/pages/Roles/ListRoles.vue') + }, { path: '/uikit/formlayout', name: 'formlayout', diff --git a/src/service/PermissionService.js b/src/service/PermissionService.js new file mode 100644 index 0000000..7e53b0a --- /dev/null +++ b/src/service/PermissionService.js @@ -0,0 +1,19 @@ +import axios from 'axios'; + +const getAuthHeader = () => { + const bmToken = document.cookie + .split('; ') + .find((row) => row.startsWith('bm-token=')) + ?.split('=')[1] || localStorage.getItem('bm-token'); + return bmToken ? { Authorization: `Bearer ${bmToken}` } : {}; +}; + +export const PermissionService = { + listPermissions: async () => { + const response = await axios.get('/api/permissions', { + withCredentials: true, + headers: getAuthHeader() + }); + return response.data.data; + } +}; diff --git a/src/service/RoleService.js b/src/service/RoleService.js new file mode 100644 index 0000000..425254b --- /dev/null +++ b/src/service/RoleService.js @@ -0,0 +1,52 @@ +import axios from 'axios'; + +const getAuthHeader = () => { + const bmToken = document.cookie + .split('; ') + .find((row) => row.startsWith('bm-token=')) + ?.split('=')[1] || localStorage.getItem('bm-token'); + return bmToken ? { Authorization: `Bearer ${bmToken}` } : {}; +}; + +export const RoleService = { + listRoles: async (params = {}) => { + const response = await axios.get('/api/roles/admin/get-all', { + params, + withCredentials: true, + headers: getAuthHeader() + }); + return response.data.data; + }, + + getRole: async (roleId) => { + const response = await axios.get(`/api/roles/admin/get-one/${roleId}`, { + withCredentials: true, + headers: getAuthHeader() + }); + return response.data.data; + }, + + createRole: async (data) => { + const response = await axios.post('/api/roles/admin/create', data, { + withCredentials: true, + headers: getAuthHeader() + }); + return response.data.data; + }, + + updateRole: async (roleId, data) => { + const response = await axios.patch(`/api/roles/admin/update/${roleId}`, data, { + withCredentials: true, + headers: getAuthHeader() + }); + return response.data.data; + }, + + deleteRole: async (roleId) => { + const response = await axios.delete(`/api/roles/admin/delete/${roleId}`, { + withCredentials: true, + headers: getAuthHeader() + }); + return response.data; + } +}; diff --git a/src/service/UserService.js b/src/service/UserService.js new file mode 100644 index 0000000..916ee83 --- /dev/null +++ b/src/service/UserService.js @@ -0,0 +1,52 @@ +import axios from 'axios'; + +const getAuthHeader = () => { + const bmToken = document.cookie + .split('; ') + .find((row) => row.startsWith('bm-token=')) + ?.split('=')[1] || localStorage.getItem('bm-token'); + return bmToken ? { Authorization: `Bearer ${bmToken}` } : {}; +}; + +export const UserService = { + listUsers: async (params = {}) => { + const response = await axios.get('/api/users', { + params, + withCredentials: true, + headers: getAuthHeader() + }); + return response.data.data; + }, + + getUser: async (userId) => { + const response = await axios.get(`/api/users/${userId}`, { + withCredentials: true, + headers: getAuthHeader() + }); + return response.data.data; + }, + + createUser: async (data) => { + const response = await axios.post('/api/users', data, { + withCredentials: true, + headers: getAuthHeader() + }); + return response.data.data; + }, + + updateUser: async (userId, data) => { + const response = await axios.patch(`/api/users/${userId}`, data, { + withCredentials: true, + headers: getAuthHeader() + }); + return response.data.data; + }, + + deleteUser: async (userId) => { + const response = await axios.delete(`/api/users/${userId}`, { + withCredentials: true, + headers: getAuthHeader() + }); + return response.data; + } +}; diff --git a/src/views/pages/Roles/ListRoles.vue b/src/views/pages/Roles/ListRoles.vue new file mode 100644 index 0000000..7cea96e --- /dev/null +++ b/src/views/pages/Roles/ListRoles.vue @@ -0,0 +1,718 @@ + + + + + diff --git a/src/views/pages/Users/ListUsers.vue b/src/views/pages/Users/ListUsers.vue new file mode 100644 index 0000000..dd5e598 --- /dev/null +++ b/src/views/pages/Users/ListUsers.vue @@ -0,0 +1,668 @@ + + + + +