diff --git a/frontend/src/api/client.ts b/frontend/src/api/client.ts index 92ec80b..816aeef 100644 --- a/frontend/src/api/client.ts +++ b/frontend/src/api/client.ts @@ -1,12 +1,12 @@ import createClient, { type Middleware } from "openapi-fetch"; import useAuthStore from "../composables/store/useAuthStore"; +import type { paths } from "./types/schema"; // generated by openapi-typescript import { ForbiddenError, RequestError, UnAuthError, InternalServerError, -} from "../types/error"; -import type { paths } from "./types/schema"; // generated by openapi-typescript +} from "@/types/ErrorTypes"; const myMiddleware: Middleware = { onRequest({ request, options }) { diff --git a/frontend/src/components/common/Assistant.vue b/frontend/src/components/common/Assistant.vue index 7977fa5..45a2e72 100644 --- a/frontend/src/components/common/Assistant.vue +++ b/frontend/src/components/common/Assistant.vue @@ -71,19 +71,19 @@ - - + - - + import { LoadingIcon } from "@/components/icons"; -import DepartmentUpsertModal from "@/components/modals/DepartmentUpsertModal.vue"; -import UserDeleteModal from "@/components/modals/PopupModal.vue"; -import DepartmentDeleteModal from "@/components/modals/PopupModal.vue"; -import UserUpsertModal from "@/components/modals/UserUpsertModal.vue"; +import UserDeleteModal from "@/components/modals/ConfirmationDialog.vue"; +import DepartmentDeleteModal from "@/components/modals/ConfirmationDialog.vue"; +import DepartmentFormDialog from "@/components/modals/DepartmentFormDialog.vue"; import TableButton from "@/components/tables/TableButton.vue"; import Avatar from "@/components/ui/Avatar.vue"; import InputButton from "@/components/ui/InputButton.vue"; @@ -107,8 +106,8 @@ import { useActionExcStore } from "@/composables/store/useActionExcStore"; import useAlertStore from "@/composables/store/useAlertStore"; import useUserStore from "@/composables/store/useUserStore"; import { useUserUpsert } from "@/composables/user/useUserUpsert"; -import type { DepartmentUpsertModel } from "@/types/department"; -import type { UserUpsertSubmitModel } from "@/types/user"; +import type { DepartmentUpsertModel } from "@/types/DepartmentTypes"; +import type { UserUpsertSubmitModel } from "@/types/UserTypes"; import DOMPurify from "dompurify"; import { Modal, type ModalInterface, initFlowbite } from "flowbite"; import { marked } from "marked"; diff --git a/frontend/src/components/modals/BaseModal.vue b/frontend/src/components/modals/BaseDialog.vue similarity index 91% rename from frontend/src/components/modals/BaseModal.vue rename to frontend/src/components/modals/BaseDialog.vue index b86cbd5..88a1d37 100644 --- a/frontend/src/components/modals/BaseModal.vue +++ b/frontend/src/components/modals/BaseDialog.vue @@ -26,19 +26,19 @@ diff --git a/frontend/src/composables/useErrorHandler.ts b/frontend/src/composables/common/useErrorHandling.ts similarity index 86% rename from frontend/src/composables/useErrorHandler.ts rename to frontend/src/composables/common/useErrorHandling.ts index adfa901..59fe3ef 100644 --- a/frontend/src/composables/useErrorHandler.ts +++ b/frontend/src/composables/common/useErrorHandling.ts @@ -7,20 +7,22 @@ import { RequestError, UnAuthError, ValidationError, -} from "@/types/error"; +} from "@/types/ErrorTypes"; import { useRouter } from "vue-router"; import { z } from "zod"; /** - * 错误处理 Composable + * 错误处理 Composable - 提供统一的错误处理机制 + * @returns 包含错误处理函数的对象 */ -export function useErrorHandler() { +export function useErrorHandling() { const router = useRouter(); const { signOut } = useUserAuth(); const alertStore = useAlertStore(); /** * 处理各类错误,显示对应的提示信息 + * @param err 错误对象 */ const handleError = (err: unknown) => { console.error(err); @@ -69,4 +71,4 @@ export function useErrorHandler() { }; } -export default useErrorHandler; +export default useErrorHandling; diff --git a/frontend/src/composables/page.ts b/frontend/src/composables/common/usePagination.ts similarity index 92% rename from frontend/src/composables/page.ts rename to frontend/src/composables/common/usePagination.ts index 4af7371..8f8d84c 100644 --- a/frontend/src/composables/page.ts +++ b/frontend/src/composables/common/usePagination.ts @@ -12,6 +12,11 @@ export interface UsePaginationOptions { initialTotal?: number; } +/** + * 分页逻辑Composable - 提供分页相关的状态和操作 + * @param options 分页选项 + * @returns 分页状态和方法 + */ export function usePagination(options: UsePaginationOptions = {}) { const { initialPage = 1, initialPageSize = 10, initialTotal = 0 } = options; diff --git a/frontend/src/composables/sort.ts b/frontend/src/composables/common/useSorting.ts similarity index 63% rename from frontend/src/composables/sort.ts rename to frontend/src/composables/common/useSorting.ts index d80882f..4903059 100644 --- a/frontend/src/composables/sort.ts +++ b/frontend/src/composables/common/useSorting.ts @@ -1,23 +1,39 @@ import { computed, ref } from "vue"; -export const useSort = () => { - const sortFields = ref< - { - field: string; - order: "asc" | "desc" | undefined; - }[] - >([]); +export interface SortField { + field: string; + order: "asc" | "desc" | undefined; +} +/** + * 排序逻辑Composable - 提供排序相关的状态和操作 + * @returns 排序状态和方法 + */ +export function useSorting() { + const sortFields = ref([]); + + /** + * 获取指定字段的排序信息 + * @param field 字段名 + * @returns 排序字段对象 + */ const getSortField = (field: string) => { return sortFields.value.find((item) => item.field === field); }; + /** + * 排序表达式,用于API请求 + */ const sortBy = computed(() => { return sortFields.value.length ? sortFields.value.map((item) => `${item.field}:${item.order}`).join(",") : undefined; }); + /** + * 处理字段排序 + * @param field 字段名 + */ const handleSort = async (field: string) => { if (sortFields.value?.find((item) => item.field === field)) { sortFields.value = sortFields.value?.map((item) => @@ -39,4 +55,4 @@ export const useSort = () => { handleSort, getSortField, }; -}; +} diff --git a/frontend/src/composables/useMobileStyles.ts b/frontend/src/composables/common/useStyleSystem.ts similarity index 94% rename from frontend/src/composables/useMobileStyles.ts rename to frontend/src/composables/common/useStyleSystem.ts index f1678d8..37c70cc 100644 --- a/frontend/src/composables/useMobileStyles.ts +++ b/frontend/src/composables/common/useStyleSystem.ts @@ -1,7 +1,8 @@ /** - * 移动端样式hook,提供通用的移动端样式类 + * 样式系统Composable - 提供统一的样式类名 + * @returns 样式类名集合 */ -export function useMobileStyles() { +export function useStyleSystem() { // 移动端卡片容器样式 const cardContainerClass = "p-4 bg-white rounded-lg shadow border border-gray-100"; diff --git a/frontend/src/composables/department/useDepartmentUpsert.ts b/frontend/src/composables/department/useDepartmentUpsert.ts index 7dda2be..aaebf4f 100644 --- a/frontend/src/composables/department/useDepartmentUpsert.ts +++ b/frontend/src/composables/department/useDepartmentUpsert.ts @@ -1,5 +1,5 @@ import client from "../../api/client"; -import type { DepartmentUpsertModel } from "../../types/department"; +import type { DepartmentUpsertModel } from "../../types/DepartmentTypes"; export const useDepartmentUpsert = () => { const upsertDepartment = async (department: DepartmentUpsertModel) => { diff --git a/frontend/src/composables/permission/usePermissionUpsert.ts b/frontend/src/composables/permission/usePermissionUpsert.ts index b101769..60cb6f3 100644 --- a/frontend/src/composables/permission/usePermissionUpsert.ts +++ b/frontend/src/composables/permission/usePermissionUpsert.ts @@ -1,5 +1,5 @@ import client from "../../api/client"; -import type { PermissionUpsertModel } from "../../types/permission"; +import type { PermissionUpsertModel } from "../../types/PermissionTypes"; const usePermissionUpsert = () => { const upsertPermission = async (permission: PermissionUpsertModel) => { diff --git a/frontend/src/composables/user/useUserUpsert.ts b/frontend/src/composables/user/useUserUpsert.ts index 4b9299d..1a7e8b4 100644 --- a/frontend/src/composables/user/useUserUpsert.ts +++ b/frontend/src/composables/user/useUserUpsert.ts @@ -1,5 +1,5 @@ import client from "../../api/client"; -import type { UserUpsertSubmitModel } from "../../types/user"; +import type { UserUpsertSubmitModel } from "../../types/UserTypes"; export const useUserUpsert = () => { const uploadUserAvatar = async (file: File) => { diff --git a/frontend/src/main.ts b/frontend/src/main.ts index cb5abf5..a1c6dc7 100644 --- a/frontend/src/main.ts +++ b/frontend/src/main.ts @@ -5,7 +5,7 @@ import { createApp } from "vue"; import VueDatePicker from "@vuepic/vue-datepicker"; import App from "./App.vue"; -import useErrorHandler from "./composables/useErrorHandler"; +import useErrorHandling from "./composables/common/useErrorHandling"; import router from "./router"; import "@vuepic/vue-datepicker/dist/main.css"; import "./assets/datepicker.css"; @@ -27,7 +27,7 @@ enableMocking().then(() => { app.use(createPinia()); app.use(router); - const { handleError } = useErrorHandler(); + const { handleError } = useErrorHandling(); app.config.errorHandler = (err, instance, info) => { handleError(err); }; diff --git a/frontend/src/router/modules/ai.ts b/frontend/src/router/modules/ai.ts index f2529c9..0bce41d 100644 --- a/frontend/src/router/modules/ai.ts +++ b/frontend/src/router/modules/ai.ts @@ -5,7 +5,7 @@ const aiRoutes: RouteRecordRaw[] = [ { path: Routes.LLMCONFIGVIEW.path, name: Routes.LLMCONFIGVIEW.name, - component: () => import("@/views/LlmConfigView.vue"), + component: () => import("@/views/LlmConfigurationPage.vue"), meta: { requiresAuth: true, hasPermission: EPermission.READ_LLM_CONFIG_PERMISSION, diff --git a/frontend/src/router/modules/auth.ts b/frontend/src/router/modules/auth.ts index 3122e44..66daa35 100644 --- a/frontend/src/router/modules/auth.ts +++ b/frontend/src/router/modules/auth.ts @@ -12,7 +12,7 @@ const authRoutes: RouteRecordRaw[] = [ { path: Routes.LOGIN.path, name: Routes.LOGIN.name, - component: () => import("../../views/LoginView.vue"), + component: () => import("../../views/LoginPage.vue"), }, ]; diff --git a/frontend/src/router/modules/dashboard.ts b/frontend/src/router/modules/dashboard.ts index 14ce891..ecb391d 100644 --- a/frontend/src/router/modules/dashboard.ts +++ b/frontend/src/router/modules/dashboard.ts @@ -1,8 +1,8 @@ import type { RouteRecordRaw } from "vue-router"; +import Dashboard from "../../components/layout/Dashboard.vue"; import { EPermission, Routes } from "../constants"; import aiRoutes from "./ai"; import userManagementRoutes from "./user"; -import Dashboard from "../../components/layout/Dashboard.vue"; const dashboardRoutes: RouteRecordRaw = { path: Routes.DASHBOARD.path, @@ -15,7 +15,7 @@ const dashboardRoutes: RouteRecordRaw = { { path: Routes.OVERVIEW.path, name: Routes.OVERVIEW.name, - component: () => import("@/views/OverView.vue"), + component: () => import("@/views/DashboardPage.vue"), meta: { requiresAuth: true, }, @@ -23,7 +23,7 @@ const dashboardRoutes: RouteRecordRaw = { { path: Routes.SETTINGS.path, name: Routes.SETTINGS.name, - component: () => import("@/views/SettingsView.vue"), + component: () => import("@/views/SystemSettingsPage.vue"), meta: { requiresAuth: true, }, @@ -33,12 +33,12 @@ const dashboardRoutes: RouteRecordRaw = { { path: Routes.NOTFOUND.path, name: Routes.NOTFOUND.name, - component: () => import("@/views/NotFound.vue"), + component: () => import("@/views/NotFoundPage.vue"), }, { path: Routes.SCHEDULERVIEW.path, name: Routes.SCHEDULERVIEW.name, - component: () => import("@/views/SchedulerView.vue"), + component: () => import("@/views/SchedulerManagementPage.vue"), meta: { requiresAuth: true, hasPermission: EPermission.READ_SCHEDULER_PERMISSION, @@ -47,7 +47,7 @@ const dashboardRoutes: RouteRecordRaw = { { path: Routes.DEPARTMENTVIEW.path, name: Routes.DEPARTMENTVIEW.name, - component: () => import("@/views/DepartmentView.vue"), + component: () => import("@/views/DepartmentManagementPage.vue"), meta: { requiresAuth: true, hasPermission: EPermission.READ_DEPARTMENT_PERMISSION, @@ -56,7 +56,7 @@ const dashboardRoutes: RouteRecordRaw = { { path: Routes.POSITIONVIEW.path, name: Routes.POSITIONVIEW.name, - component: () => import("@/views/PositionView.vue"), + component: () => import("@/views/PositionManagementPage.vue"), meta: { requiresAuth: true, hasPermission: EPermission.READ_POSITION_PERMISSION, diff --git a/frontend/src/router/modules/error.ts b/frontend/src/router/modules/error.ts index 6f8571d..d97f0a3 100644 --- a/frontend/src/router/modules/error.ts +++ b/frontend/src/router/modules/error.ts @@ -5,7 +5,7 @@ const errorRoutes: RouteRecordRaw[] = [ { path: Routes.GLOBAL_NOTFOUND.path, name: Routes.GLOBAL_NOTFOUND.name, - component: () => import("../../views/NotFound.vue"), + component: () => import("../../views/NotFoundPage.vue"), }, ]; diff --git a/frontend/src/router/modules/user.ts b/frontend/src/router/modules/user.ts index ce84bc6..b62c564 100644 --- a/frontend/src/router/modules/user.ts +++ b/frontend/src/router/modules/user.ts @@ -5,7 +5,7 @@ const userManagementRoutes: RouteRecordRaw[] = [ { path: Routes.USERVIEW.path, name: Routes.USERVIEW.name, - component: () => import("@/views/UserView.vue"), + component: () => import("@/views/UserManagementPage.vue"), meta: { requiresAuth: true, hasPermission: EPermission.READ_USER_ROLE_PERMISSION, @@ -14,7 +14,7 @@ const userManagementRoutes: RouteRecordRaw[] = [ { path: Routes.ROLEVIEW.path, name: Routes.ROLEVIEW.name, - component: () => import("@/views/RoleView.vue"), + component: () => import("@/views/RoleManagementPage.vue"), meta: { requiresAuth: true, hasPermission: EPermission.READ_USER_ROLE_PERMISSION, @@ -23,7 +23,7 @@ const userManagementRoutes: RouteRecordRaw[] = [ { path: Routes.BINDROLEVIEW.path, name: Routes.BINDROLEVIEW.name, - component: () => import("@/views/BindRoleView.vue"), + component: () => import("@/views/UserRoleAssignmentPage.vue"), meta: { requiresAuth: true, hasPermission: EPermission.WRITE_USER_ROLE_PERMISSION, @@ -32,7 +32,7 @@ const userManagementRoutes: RouteRecordRaw[] = [ { path: Routes.BINDDEPARTMENTVIEW.path, name: Routes.BINDDEPARTMENTVIEW.name, - component: () => import("@/views/BindDepartmentView.vue"), + component: () => import("@/views/UserDepartmentAssignmentPage.vue"), meta: { requiresAuth: true, hasPermission: EPermission.WRITE_USER_ROLE_PERMISSION, @@ -41,7 +41,7 @@ const userManagementRoutes: RouteRecordRaw[] = [ { path: Routes.BINDPERMISSIONVIEW.path, name: Routes.BINDPERMISSIONVIEW.name, - component: () => import("@/views/BindPermissionView.vue"), + component: () => import("@/views/RolePermissionAssignmentPage.vue"), meta: { requiresAuth: true, hasPermission: EPermission.WRITE_USER_ROLE_PERMISSION, @@ -50,7 +50,7 @@ const userManagementRoutes: RouteRecordRaw[] = [ { path: Routes.PERMISSIONVIEW.path, name: Routes.PERMISSIONVIEW.name, - component: () => import("@/views/PermissionView.vue"), + component: () => import("@/views/PermissionManagementPage.vue"), meta: { requiresAuth: true, hasPermission: EPermission.READ_USER_ROLE_PERMISSION, @@ -59,7 +59,7 @@ const userManagementRoutes: RouteRecordRaw[] = [ { path: Routes.BINDPOSITIONVIEW.path, name: Routes.BINDPOSITIONVIEW.name, - component: () => import("@/views/BindPositionView.vue"), + component: () => import("@/views/UserPositionAssignmentPage.vue"), meta: { requiresAuth: true, hasPermission: EPermission.WRITE_USER_ROLE_PERMISSION, diff --git a/frontend/src/types/AlertTypes.ts b/frontend/src/types/AlertTypes.ts new file mode 100644 index 0000000..b8d1f94 --- /dev/null +++ b/frontend/src/types/AlertTypes.ts @@ -0,0 +1 @@ +export type AlertLevel = "info" | "warning" | "success" | "error"; diff --git a/frontend/src/types/DepartmentTypes.ts b/frontend/src/types/DepartmentTypes.ts new file mode 100644 index 0000000..5a87eff --- /dev/null +++ b/frontend/src/types/DepartmentTypes.ts @@ -0,0 +1,15 @@ +export interface DepartmentFormData { + id?: number; + name: string; + parentId?: number | null; +} + +export type DepartmentUpsertModel = DepartmentFormData; + +export interface DepartmentData { + id: number; + name: string; + parentId?: number; + parentName?: string; + isBound?: boolean; +} diff --git a/frontend/src/types/ErrorTypes.ts b/frontend/src/types/ErrorTypes.ts new file mode 100644 index 0000000..0a01e6b --- /dev/null +++ b/frontend/src/types/ErrorTypes.ts @@ -0,0 +1,46 @@ +export class BaseError extends Error { + constructor(message: string) { + super(message); + this.name = this.constructor.name; + } +} + +export class ValidationError extends BaseError {} + +export class RequestError extends BaseError { + status: number; + + constructor(status: number) { + super(`请求错误: ${status}`); + this.status = status; + } +} + +export class UnAuthError extends BaseError { + status: number; + + constructor(status: number) { + super(`未授权: ${status}`); + this.status = status; + } +} + +export class ForbiddenError extends BaseError { + status: number; + + constructor(status: number) { + super(`禁止访问: ${status}`); + this.status = status; + } +} + +export class InternalServerError extends BaseError { + detail?: string; + status: number; + + constructor(status: number, detail?: string) { + super(`服务器错误: ${status}`); + this.status = status; + this.detail = detail; + } +} diff --git a/frontend/src/types/PermissionTypes.ts b/frontend/src/types/PermissionTypes.ts new file mode 100644 index 0000000..d8e0602 --- /dev/null +++ b/frontend/src/types/PermissionTypes.ts @@ -0,0 +1,14 @@ +export interface PermissionFormData { + id?: number; + name: string; + code: string; +} + +export type PermissionUpsertModel = PermissionFormData; + +export interface PermissionData { + id: number; + name: string; + code: string; + isBound?: boolean; +} diff --git a/frontend/src/types/PositionTypes.ts b/frontend/src/types/PositionTypes.ts new file mode 100644 index 0000000..b2008e5 --- /dev/null +++ b/frontend/src/types/PositionTypes.ts @@ -0,0 +1,12 @@ +export interface PositionFormData { + id?: number; + name: string; +} + +export type PositionUpsertModel = PositionFormData; + +export interface PositionData { + id: number; + name: string; + isBound?: boolean; +} diff --git a/frontend/src/types/RoleTypes.ts b/frontend/src/types/RoleTypes.ts new file mode 100644 index 0000000..2c73f71 --- /dev/null +++ b/frontend/src/types/RoleTypes.ts @@ -0,0 +1,20 @@ +export interface RoleFormData { + id?: number; + name: string; + code: string; +} + +export type RoleUpsertModel = RoleFormData; + +export interface RoleData { + id: number; + name: string; + code: string; + isBound?: boolean; + permissions?: Array<{ + id: number; + name: string; + code: string; + isBound?: boolean; + }>; +} diff --git a/frontend/src/types/UserTypes.ts b/frontend/src/types/UserTypes.ts new file mode 100644 index 0000000..79377da --- /dev/null +++ b/frontend/src/types/UserTypes.ts @@ -0,0 +1,35 @@ +export interface UserFormData { + id?: number; + username: string; + password?: string; + enable: boolean; + avatar?: string; + realName?: string; + age?: number; + gender?: number; + email?: string; + telephone?: string; +} + +export type UserUpsertSubmitModel = UserFormData; + +// 用户类型,根据实际情况扩展 +export interface UserData { + id: number; + username: string; + enable: boolean; + avatar?: string; + realName?: string; + age?: number; + gender?: number; + email?: string; + telephone?: string; + roles?: Array<{ + id: number; + name: string; + code: string; + isBound?: boolean; + }>; +} + +export type User = UserData | null; diff --git a/frontend/src/types/department.d.ts b/frontend/src/types/department.d.ts deleted file mode 100644 index 36dedbf..0000000 --- a/frontend/src/types/department.d.ts +++ /dev/null @@ -1,5 +0,0 @@ -export interface DepartmentUpsertModel { - id?: number; - name: string; - parentId?: number | null; -} diff --git a/frontend/src/types/error.ts b/frontend/src/types/error.ts deleted file mode 100644 index 4893798..0000000 --- a/frontend/src/types/error.ts +++ /dev/null @@ -1,53 +0,0 @@ -class ValidationError extends Error { - constructor(message: string) { - super(message); - this.name = "ValidationError"; - } -} - -class HttpError extends Error { - status: number; - detail?: string; - constructor(message: string, status: number, detail?: string) { - super(message); - this.name = "HttpError"; - this.status = status; - this.detail = detail; - } -} - -class UnAuthError extends HttpError { - constructor(status: number) { - super("当前用户身份认证异常", status); - this.name = "UnAuthError"; - } -} - -class ForbiddenError extends HttpError { - constructor(status: number) { - super("您没有对应的权限", status); - this.name = "ForbiddenError"; - } -} - -class RequestError extends HttpError { - constructor(status: number) { - super("请求发生异常,请检查您的输入或稍后再试", status); - this.name = "RequestError"; - } -} - -class InternalServerError extends HttpError { - constructor(status: number, detail: string) { - super(detail, status, detail); - this.name = "InternalServerError"; - } -} - -export { - UnAuthError, - ForbiddenError, - RequestError, - InternalServerError, - ValidationError, -}; diff --git a/frontend/src/types/permission.d.ts b/frontend/src/types/permission.d.ts deleted file mode 100644 index d43584e..0000000 --- a/frontend/src/types/permission.d.ts +++ /dev/null @@ -1,5 +0,0 @@ -export interface PermissionUpsertModel { - id?: number; - name: string; - code: string; -} diff --git a/frontend/src/types/position.d.ts b/frontend/src/types/position.d.ts deleted file mode 100644 index 0e858fb..0000000 --- a/frontend/src/types/position.d.ts +++ /dev/null @@ -1,4 +0,0 @@ -export interface PositionUpsertModel { - id?: number; - name: string; -} diff --git a/frontend/src/types/role.d.ts b/frontend/src/types/role.d.ts deleted file mode 100644 index 3c70923..0000000 --- a/frontend/src/types/role.d.ts +++ /dev/null @@ -1,5 +0,0 @@ -export interface RoleUpsertModel { - id?: number; - name: string; - code: string; -} diff --git a/frontend/src/types/user.d.ts b/frontend/src/types/user.d.ts deleted file mode 100644 index 89ab8be..0000000 --- a/frontend/src/types/user.d.ts +++ /dev/null @@ -1,9 +0,0 @@ -export interface UserUpsertSubmitModel { - id?: number; - username: string; - password?: string; - enable: boolean; - avatar?: string; -} - -export type User = UserRolePermissionModel | null; diff --git a/frontend/src/views/OverView.vue b/frontend/src/views/DashboardPage.vue similarity index 100% rename from frontend/src/views/OverView.vue rename to frontend/src/views/DashboardPage.vue diff --git a/frontend/src/views/DepartmentView.vue b/frontend/src/views/DepartmentManagementPage.vue similarity index 93% rename from frontend/src/views/DepartmentView.vue rename to frontend/src/views/DepartmentManagementPage.vue index 0e0897a..ff7493d 100644 --- a/frontend/src/views/DepartmentView.vue +++ b/frontend/src/views/DepartmentManagementPage.vue @@ -100,31 +100,31 @@ - - +