From 5adbf5942553bf5952f6708e69abb3a0314c956c Mon Sep 17 00:00:00 2001 From: oneao Date: Mon, 10 Aug 2026 22:34:33 +0800 Subject: [PATCH] 20260810223432 --- .../fms-tree-component_16ac753e(未完成).md | 265 ++++++ .../plans/fms-tree-component_8d7b2eee.md | 218 +++++ code/fms/fms-vue/package.json | 7 +- code/fms/fms-vue/pnpm-lock.yaml | 8 + code/fms/fms-vue/pnpm-workspace.yaml | 2 +- code/fms/fms-vue/src/App.vue | 2 +- .../src/components/FmsAutoComplete.vue | 119 ++- code/fms/fms-vue/src/components/FmsSelect.vue | 119 ++- code/fms/fms-vue/src/components/FmsTree.vue | 123 +++ .../fms-vue/src/components/FmsTreeNode.vue | 311 +++++++ .../src/components/fms-table/FmsTable.vue | 822 ++++++++++++++++++ .../fms-table/utils/createCellRenderer.js | 227 +++++ .../utils/createEditableCellRenderer.js | 232 +++++ .../utils/createSelectionCellRenderers.js | 137 +++ .../src/components/ui/accordion/Accordion.vue | 13 +- .../ui/accordion/AccordionContent.vue | 14 +- .../components/ui/accordion/AccordionItem.vue | 16 +- .../ui/accordion/AccordionTrigger.vue | 19 +- .../src/components/ui/accordion/index.ts | 8 +- .../ui/alert-dialog/AlertDialog.vue | 10 +- .../ui/alert-dialog/AlertDialogAction.vue | 16 +- .../ui/alert-dialog/AlertDialogCancel.vue | 22 +- .../ui/alert-dialog/AlertDialogContent.vue | 20 +- .../alert-dialog/AlertDialogDescription.vue | 16 +- .../ui/alert-dialog/AlertDialogFooter.vue | 15 +- .../ui/alert-dialog/AlertDialogHeader.vue | 8 +- .../ui/alert-dialog/AlertDialogTitle.vue | 14 +- .../ui/alert-dialog/AlertDialogTrigger.vue | 6 +- .../src/components/ui/alert-dialog/index.ts | 18 +- .../fms-vue/src/components/ui/alert/Alert.vue | 20 +- .../components/ui/alert/AlertDescription.vue | 8 +- .../src/components/ui/alert/AlertTitle.vue | 8 +- .../fms-vue/src/components/ui/alert/index.ts | 14 +- .../ui/aspect-ratio/AspectRatio.vue | 12 +- .../src/components/ui/aspect-ratio/index.ts | 2 +- .../src/components/ui/avatar/Avatar.vue | 10 +- .../components/ui/avatar/AvatarFallback.vue | 14 +- .../src/components/ui/avatar/AvatarImage.vue | 12 +- .../fms-vue/src/components/ui/avatar/index.ts | 6 +- .../fms-vue/src/components/ui/badge/Badge.vue | 26 +- .../fms-vue/src/components/ui/badge/index.ts | 18 +- .../components/ui/breadcrumb/Breadcrumb.vue | 12 +- .../ui/breadcrumb/BreadcrumbEllipsis.vue | 10 +- .../ui/breadcrumb/BreadcrumbItem.vue | 13 +- .../ui/breadcrumb/BreadcrumbLink.vue | 10 +- .../ui/breadcrumb/BreadcrumbList.vue | 15 +- .../ui/breadcrumb/BreadcrumbPage.vue | 8 +- .../ui/breadcrumb/BreadcrumbSeparator.vue | 10 +- .../src/components/ui/breadcrumb/index.ts | 14 +- .../src/components/ui/button/Button.vue | 20 +- .../fms-vue/src/components/ui/button/index.ts | 29 +- .../src/components/ui/calendar/Calendar.vue | 168 ++-- .../components/ui/calendar/CalendarCell.vue | 23 +- .../ui/calendar/CalendarCellTrigger.vue | 55 +- .../components/ui/calendar/CalendarGrid.vue | 16 +- .../ui/calendar/CalendarGridBody.vue | 11 +- .../ui/calendar/CalendarGridHead.vue | 13 +- .../ui/calendar/CalendarGridRow.vue | 19 +- .../ui/calendar/CalendarHeadCell.vue | 16 +- .../components/ui/calendar/CalendarHeader.vue | 16 +- .../ui/calendar/CalendarHeading.vue | 20 +- .../ui/calendar/CalendarNextButton.vue | 32 +- .../ui/calendar/CalendarPrevButton.vue | 32 +- .../src/components/ui/calendar/index.ts | 26 +- .../fms-vue/src/components/ui/card/Card.vue | 8 +- .../src/components/ui/card/CardAction.vue | 8 +- .../src/components/ui/card/CardContent.vue | 13 +- .../components/ui/card/CardDescription.vue | 13 +- .../src/components/ui/card/CardFooter.vue | 13 +- .../src/components/ui/card/CardHeader.vue | 15 +- .../src/components/ui/card/CardTitle.vue | 13 +- .../fms-vue/src/components/ui/card/index.ts | 14 +- .../src/components/ui/carousel/Carousel.vue | 46 +- .../ui/carousel/CarouselContent.vue | 25 +- .../components/ui/carousel/CarouselItem.vue | 22 +- .../components/ui/carousel/CarouselNext.vue | 50 +- .../ui/carousel/CarouselPrevious.vue | 50 +- .../src/components/ui/carousel/index.ts | 16 +- .../src/components/ui/carousel/interface.ts | 28 +- .../src/components/ui/carousel/useCarousel.ts | 75 +- .../src/components/ui/checkbox/Checkbox.vue | 27 +- .../src/components/ui/checkbox/index.ts | 2 +- .../components/ui/collapsible/Collapsible.vue | 16 +- .../ui/collapsible/CollapsibleContent.vue | 11 +- .../ui/collapsible/CollapsibleTrigger.vue | 11 +- .../src/components/ui/collapsible/index.ts | 6 +- .../src/components/ui/combobox/Combobox.vue | 16 +- .../components/ui/combobox/ComboboxAnchor.vue | 16 +- .../components/ui/combobox/ComboboxEmpty.vue | 14 +- .../components/ui/combobox/ComboboxGroup.vue | 22 +- .../components/ui/combobox/ComboboxInput.vue | 44 +- .../components/ui/combobox/ComboboxItem.vue | 25 +- .../ui/combobox/ComboboxItemIndicator.vue | 16 +- .../components/ui/combobox/ComboboxList.vue | 38 +- .../ui/combobox/ComboboxSeparator.vue | 14 +- .../ui/combobox/ComboboxTrigger.vue | 16 +- .../ui/combobox/ComboboxViewport.vue | 16 +- .../src/components/ui/combobox/index.ts | 24 +- .../src/components/ui/command/Command.vue | 69 +- .../components/ui/command/CommandDialog.vue | 39 +- .../components/ui/command/CommandEmpty.vue | 26 +- .../components/ui/command/CommandGroup.vue | 49 +- .../components/ui/command/CommandInput.vue | 42 +- .../src/components/ui/command/CommandItem.vue | 80 +- .../src/components/ui/command/CommandList.vue | 16 +- .../ui/command/CommandSeparator.vue | 14 +- .../components/ui/command/CommandShortcut.vue | 8 +- .../src/components/ui/command/index.ts | 38 +- .../ui/context-menu/ContextMenu.vue | 15 +- .../context-menu/ContextMenuCheckboxItem.vue | 34 +- .../ui/context-menu/ContextMenuContent.vue | 34 +- .../ui/context-menu/ContextMenuGroup.vue | 11 +- .../ui/context-menu/ContextMenuItem.vue | 48 +- .../ui/context-menu/ContextMenuLabel.vue | 16 +- .../ui/context-menu/ContextMenuPortal.vue | 11 +- .../ui/context-menu/ContextMenuRadioGroup.vue | 18 +- .../ui/context-menu/ContextMenuRadioItem.vue | 34 +- .../ui/context-menu/ContextMenuSeparator.vue | 16 +- .../ui/context-menu/ContextMenuShortcut.vue | 8 +- .../ui/context-menu/ContextMenuSub.vue | 18 +- .../ui/context-menu/ContextMenuSubContent.vue | 21 +- .../ui/context-menu/ContextMenuSubTrigger.vue | 33 +- .../ui/context-menu/ContextMenuTrigger.vue | 13 +- .../src/components/ui/context-menu/index.ts | 28 +- .../src/components/ui/dialog/Dialog.vue | 16 +- .../src/components/ui/dialog/DialogClose.vue | 11 +- .../components/ui/dialog/DialogContent.vue | 41 +- .../ui/dialog/DialogDescription.vue | 16 +- .../src/components/ui/dialog/DialogFooter.vue | 27 +- .../src/components/ui/dialog/DialogHeader.vue | 8 +- .../components/ui/dialog/DialogOverlay.vue | 21 +- .../ui/dialog/DialogScrollContent.vue | 41 +- .../src/components/ui/dialog/DialogTitle.vue | 16 +- .../components/ui/dialog/DialogTrigger.vue | 11 +- .../fms-vue/src/components/ui/dialog/index.ts | 20 +- .../src/components/ui/drawer/Drawer.vue | 15 +- .../src/components/ui/drawer/DrawerClose.vue | 11 +- .../components/ui/drawer/DrawerContent.vue | 55 +- .../ui/drawer/DrawerDescription.vue | 14 +- .../src/components/ui/drawer/DrawerFooter.vue | 13 +- .../src/components/ui/drawer/DrawerHeader.vue | 13 +- .../components/ui/drawer/DrawerOverlay.vue | 21 +- .../src/components/ui/drawer/DrawerTitle.vue | 14 +- .../components/ui/drawer/DrawerTrigger.vue | 11 +- .../fms-vue/src/components/ui/drawer/index.ts | 18 +- .../ui/dropdown-menu/DropdownMenu.vue | 16 +- .../DropdownMenuCheckboxItem.vue | 34 +- .../ui/dropdown-menu/DropdownMenuContent.vue | 31 +- .../ui/dropdown-menu/DropdownMenuGroup.vue | 11 +- .../ui/dropdown-menu/DropdownMenuItem.vue | 40 +- .../ui/dropdown-menu/DropdownMenuLabel.vue | 18 +- .../dropdown-menu/DropdownMenuRadioGroup.vue | 18 +- .../dropdown-menu/DropdownMenuRadioItem.vue | 34 +- .../dropdown-menu/DropdownMenuSeparator.vue | 22 +- .../ui/dropdown-menu/DropdownMenuShortcut.vue | 8 +- .../ui/dropdown-menu/DropdownMenuSub.vue | 13 +- .../dropdown-menu/DropdownMenuSubContent.vue | 28 +- .../dropdown-menu/DropdownMenuSubTrigger.vue | 33 +- .../ui/dropdown-menu/DropdownMenuTrigger.vue | 13 +- .../src/components/ui/dropdown-menu/index.ts | 30 +- .../fms-vue/src/components/ui/field/Field.vue | 19 +- .../src/components/ui/field/FieldContent.vue | 13 +- .../components/ui/field/FieldDescription.vue | 22 +- .../src/components/ui/field/FieldError.vue | 33 +- .../src/components/ui/field/FieldGroup.vue | 18 +- .../src/components/ui/field/FieldLabel.vue | 24 +- .../src/components/ui/field/FieldLegend.vue | 24 +- .../components/ui/field/FieldSeparator.vue | 17 +- .../src/components/ui/field/FieldSet.vue | 20 +- .../src/components/ui/field/FieldTitle.vue | 18 +- .../fms-vue/src/components/ui/field/index.ts | 28 +- .../fms-vue/src/components/ui/form/Form.vue | 34 +- .../src/components/ui/form/FormControl.vue | 6 +- .../components/ui/form/FormDescription.vue | 12 +- .../src/components/ui/form/FormField.vue | 2 +- .../src/components/ui/form/FormItem.vue | 23 +- .../src/components/ui/form/FormLabel.vue | 19 +- .../src/components/ui/form/FormMessage.vue | 16 +- .../fms-vue/src/components/ui/form/index.ts | 16 +- .../src/components/ui/form/injectionKeys.ts | 5 +- .../src/components/ui/form/useFormField.ts | 21 +- .../components/ui/hover-card/HoverCard.vue | 16 +- .../ui/hover-card/HoverCardContent.vue | 22 +- .../ui/hover-card/HoverCardTrigger.vue | 11 +- .../src/components/ui/hover-card/index.ts | 6 +- .../src/components/ui/input-otp/InputOTP.vue | 20 +- .../components/ui/input-otp/InputOTPGroup.vue | 20 +- .../ui/input-otp/InputOTPSeparator.vue | 16 +- .../components/ui/input-otp/InputOTPSlot.vue | 34 +- .../src/components/ui/input-otp/index.ts | 8 +- .../fms-vue/src/components/ui/input/Input.vue | 36 +- .../fms-vue/src/components/ui/input/index.ts | 2 +- .../fms-vue/src/components/ui/label/Label.vue | 14 +- .../fms-vue/src/components/ui/label/index.ts | 2 +- .../src/components/ui/menubar/Menubar.vue | 26 +- .../ui/menubar/MenubarCheckboxItem.vue | 34 +- .../components/ui/menubar/MenubarContent.vue | 22 +- .../components/ui/menubar/MenubarGroup.vue | 11 +- .../src/components/ui/menubar/MenubarItem.vue | 41 +- .../components/ui/menubar/MenubarLabel.vue | 16 +- .../src/components/ui/menubar/MenubarMenu.vue | 11 +- .../ui/menubar/MenubarRadioGroup.vue | 18 +- .../ui/menubar/MenubarRadioItem.vue | 34 +- .../ui/menubar/MenubarSeparator.vue | 18 +- .../components/ui/menubar/MenubarShortcut.vue | 8 +- .../src/components/ui/menubar/MenubarSub.vue | 20 +- .../ui/menubar/MenubarSubContent.vue | 24 +- .../ui/menubar/MenubarSubTrigger.vue | 30 +- .../components/ui/menubar/MenubarTrigger.vue | 16 +- .../src/components/ui/menubar/index.ts | 30 +- .../ui/native-select/NativeSelect.vue | 39 +- .../ui/native-select/NativeSelectOptGroup.vue | 11 +- .../ui/native-select/NativeSelectOption.vue | 11 +- .../src/components/ui/native-select/index.ts | 6 +- .../ui/navigation-menu/NavigationMenu.vue | 45 +- .../navigation-menu/NavigationMenuContent.vue | 33 +- .../NavigationMenuIndicator.vue | 23 +- .../ui/navigation-menu/NavigationMenuItem.vue | 14 +- .../ui/navigation-menu/NavigationMenuLink.vue | 28 +- .../ui/navigation-menu/NavigationMenuList.vue | 23 +- .../navigation-menu/NavigationMenuTrigger.vue | 23 +- .../NavigationMenuViewport.vue | 19 +- .../components/ui/navigation-menu/index.ts | 20 +- .../components/ui/pagination/Pagination.vue | 24 +- .../ui/pagination/PaginationContent.vue | 14 +- .../ui/pagination/PaginationEllipsis.vue | 16 +- .../ui/pagination/PaginationFirst.vue | 37 +- .../ui/pagination/PaginationItem.vue | 50 +- .../ui/pagination/PaginationLast.vue | 37 +- .../ui/pagination/PaginationNext.vue | 37 +- .../ui/pagination/PaginationPrevious.vue | 37 +- .../src/components/ui/pagination/index.ts | 16 +- .../src/components/ui/popover/Popover.vue | 16 +- .../components/ui/popover/PopoverAnchor.vue | 11 +- .../components/ui/popover/PopoverContent.vue | 24 +- .../components/ui/popover/PopoverTrigger.vue | 11 +- .../src/components/ui/popover/index.ts | 8 +- .../src/components/ui/progress/Progress.vue | 31 +- .../src/components/ui/progress/index.ts | 2 +- .../components/ui/radio-group/RadioGroup.vue | 18 +- .../ui/radio-group/RadioGroupItem.vue | 26 +- .../src/components/ui/radio-group/index.ts | 4 +- .../ui/resizable/ResizableHandle.vue | 29 +- .../ui/resizable/ResizablePanel.vue | 12 +- .../ui/resizable/ResizablePanelGroup.vue | 18 +- .../src/components/ui/resizable/index.ts | 6 +- .../components/ui/scroll-area/ScrollArea.vue | 20 +- .../components/ui/scroll-area/ScrollBar.vue | 39 +- .../src/components/ui/scroll-area/index.ts | 4 +- .../src/components/ui/select/Select.vue | 16 +- .../components/ui/select/SelectContent.vue | 50 +- .../src/components/ui/select/SelectGroup.vue | 11 +- .../src/components/ui/select/SelectItem.vue | 23 +- .../components/ui/select/SelectItemText.vue | 11 +- .../src/components/ui/select/SelectLabel.vue | 10 +- .../ui/select/SelectScrollDownButton.vue | 18 +- .../ui/select/SelectScrollUpButton.vue | 18 +- .../components/ui/select/SelectSeparator.vue | 14 +- .../components/ui/select/SelectTrigger.vue | 30 +- .../src/components/ui/select/SelectValue.vue | 11 +- .../fms-vue/src/components/ui/select/index.ts | 22 +- .../src/components/ui/separator/Separator.vue | 18 +- .../src/components/ui/separator/index.ts | 2 +- .../fms-vue/src/components/ui/sheet/Sheet.vue | 16 +- .../src/components/ui/sheet/SheetClose.vue | 11 +- .../src/components/ui/sheet/SheetContent.vue | 58 +- .../components/ui/sheet/SheetDescription.vue | 14 +- .../src/components/ui/sheet/SheetFooter.vue | 12 +- .../src/components/ui/sheet/SheetHeader.vue | 11 +- .../src/components/ui/sheet/SheetOverlay.vue | 21 +- .../src/components/ui/sheet/SheetTitle.vue | 14 +- .../src/components/ui/sheet/SheetTrigger.vue | 11 +- .../fms-vue/src/components/ui/sheet/index.ts | 16 +- .../src/components/ui/sidebar/Sidebar.vue | 62 +- .../components/ui/sidebar/SidebarContent.vue | 15 +- .../components/ui/sidebar/SidebarFooter.vue | 8 +- .../components/ui/sidebar/SidebarGroup.vue | 8 +- .../ui/sidebar/SidebarGroupAction.vue | 30 +- .../ui/sidebar/SidebarGroupContent.vue | 8 +- .../ui/sidebar/SidebarGroupLabel.vue | 27 +- .../components/ui/sidebar/SidebarHeader.vue | 8 +- .../components/ui/sidebar/SidebarInput.vue | 15 +- .../components/ui/sidebar/SidebarInset.vue | 20 +- .../src/components/ui/sidebar/SidebarMenu.vue | 8 +- .../ui/sidebar/SidebarMenuAction.vue | 49 +- .../ui/sidebar/SidebarMenuBadge.vue | 28 +- .../ui/sidebar/SidebarMenuButton.vue | 43 +- .../ui/sidebar/SidebarMenuButtonChild.vue | 22 +- .../components/ui/sidebar/SidebarMenuItem.vue | 8 +- .../ui/sidebar/SidebarMenuSkeleton.vue | 24 +- .../components/ui/sidebar/SidebarMenuSub.vue | 20 +- .../ui/sidebar/SidebarMenuSubButton.vue | 47 +- .../ui/sidebar/SidebarMenuSubItem.vue | 8 +- .../components/ui/sidebar/SidebarProvider.vue | 69 +- .../ui/sidebar/SidebarSeparator.vue | 10 +- .../components/ui/sidebar/SidebarTrigger.vue | 16 +- .../src/components/ui/sidebar/index.ts | 66 +- .../src/components/ui/sidebar/utils.ts | 32 +- .../src/components/ui/skeleton/Skeleton.vue | 13 +- .../src/components/ui/skeleton/index.ts | 2 +- .../src/components/ui/slider/Slider.vue | 28 +- .../fms-vue/src/components/ui/slider/index.ts | 2 +- .../src/components/ui/sonner/Sonner.vue | 17 +- .../fms-vue/src/components/ui/sonner/index.ts | 2 +- .../src/components/ui/switch/Switch.vue | 38 +- .../fms-vue/src/components/ui/switch/index.ts | 2 +- .../fms-vue/src/components/ui/table/Table.vue | 8 +- .../src/components/ui/table/TableBody.vue | 13 +- .../src/components/ui/table/TableCaption.vue | 13 +- .../src/components/ui/table/TableCell.vue | 8 +- .../src/components/ui/table/TableEmpty.vue | 34 +- .../src/components/ui/table/TableFooter.vue | 8 +- .../src/components/ui/table/TableHead.vue | 15 +- .../src/components/ui/table/TableHeader.vue | 13 +- .../src/components/ui/table/TableRow.vue | 12 +- .../fms-vue/src/components/ui/table/index.ts | 18 +- .../fms-vue/src/components/ui/tabs/Tabs.vue | 18 +- .../src/components/ui/tabs/TabsContent.vue | 14 +- .../src/components/ui/tabs/TabsList.vue | 24 +- .../src/components/ui/tabs/TabsTrigger.vue | 26 +- .../fms-vue/src/components/ui/tabs/index.ts | 8 +- .../src/components/ui/textarea/Textarea.vue | 27 +- .../src/components/ui/textarea/index.ts | 2 +- .../ui/toggle-group/ToggleGroup.vue | 54 +- .../ui/toggle-group/ToggleGroupItem.vue | 57 +- .../src/components/ui/toggle-group/index.ts | 4 +- .../src/components/ui/toggle/Toggle.vue | 43 +- .../fms-vue/src/components/ui/toggle/index.ts | 10 +- .../src/components/ui/tooltip/Tooltip.vue | 16 +- .../components/ui/tooltip/TooltipContent.vue | 38 +- .../components/ui/tooltip/TooltipProvider.vue | 6 +- .../components/ui/tooltip/TooltipTrigger.vue | 11 +- .../src/components/ui/tooltip/index.ts | 8 +- .../fms/fms-vue/src/layouts/DefaultLayout.vue | 99 +-- .../src/layouts/components/AppSidebar.vue | 137 +-- .../src/layouts/components/AppTabs.vue | 132 +-- .../src/layouts/components/AppTopbar.vue | 154 ++-- .../src/layouts/components/NavMain.vue | 20 +- .../src/layouts/components/NavMenuItem.vue | 98 ++- code/fms/fms-vue/src/lib/utils.ts | 8 +- code/fms/fms-vue/src/main.ts | 30 +- code/fms/fms-vue/src/router/index.ts | 124 +-- code/fms/fms-vue/src/services/api.ts | 70 +- code/fms/fms-vue/src/services/fileService.ts | 190 ++-- code/fms/fms-vue/src/services/http.ts | 121 +-- code/fms/fms-vue/src/stores/app.ts | 328 ++++--- code/fms/fms-vue/src/stores/auth.ts | 50 +- code/fms/fms-vue/src/stores/permissions.ts | 226 ++--- code/fms/fms-vue/src/styles/index.css | 3 +- code/fms/fms-vue/src/utils/lucideIcons.ts | 25 +- code/fms/fms-vue/src/utils/tree.ts | 40 +- .../src/views/base/PlaceholderPage.vue | 8 +- .../{ContactPage.vue => contact/index.vue} | 0 .../index.vue} | 0 .../index.vue} | 0 .../fms/fms-vue/src/views/dashboard/index.vue | 486 +++++++++-- code/fms/fms-vue/src/views/login/index.vue | 124 ++- .../src/views/system/ModuleManagementPage.vue | 5 - .../{I18nTypePage.vue => i18n-type/index.vue} | 0 .../{LoginLogPage.vue => login-log/index.vue} | 0 .../views/system/module-management/index.vue | 128 +++ .../system/{UserPage.vue => user/index.vue} | 0 code/fms/fms-vue/tsconfig.json | 5 +- code/fms/fms-vue/vite.config.ts | 18 +- 364 files changed, 7559 insertions(+), 4358 deletions(-) create mode 100644 code/fms/.codebuddy/plans/fms-tree-component_16ac753e(未完成).md create mode 100644 code/fms/.codebuddy/plans/fms-tree-component_8d7b2eee.md create mode 100644 code/fms/fms-vue/src/components/FmsTree.vue create mode 100644 code/fms/fms-vue/src/components/FmsTreeNode.vue create mode 100644 code/fms/fms-vue/src/components/fms-table/FmsTable.vue create mode 100644 code/fms/fms-vue/src/components/fms-table/utils/createCellRenderer.js create mode 100644 code/fms/fms-vue/src/components/fms-table/utils/createEditableCellRenderer.js create mode 100644 code/fms/fms-vue/src/components/fms-table/utils/createSelectionCellRenderers.js rename code/fms/fms-vue/src/views/base/{ContactPage.vue => contact/index.vue} (100%) rename code/fms/fms-vue/src/views/base/{OtherCompanyPage.vue => othercompany/index.vue} (100%) rename code/fms/fms-vue/src/views/base/{OtherDataPage.vue => otherdata/index.vue} (100%) delete mode 100644 code/fms/fms-vue/src/views/system/ModuleManagementPage.vue rename code/fms/fms-vue/src/views/system/{I18nTypePage.vue => i18n-type/index.vue} (100%) rename code/fms/fms-vue/src/views/system/{LoginLogPage.vue => login-log/index.vue} (100%) create mode 100644 code/fms/fms-vue/src/views/system/module-management/index.vue rename code/fms/fms-vue/src/views/system/{UserPage.vue => user/index.vue} (100%) diff --git a/code/fms/.codebuddy/plans/fms-tree-component_16ac753e(未完成).md b/code/fms/.codebuddy/plans/fms-tree-component_16ac753e(未完成).md new file mode 100644 index 00000000..a36c3eac --- /dev/null +++ b/code/fms/.codebuddy/plans/fms-tree-component_16ac753e(未完成).md @@ -0,0 +1,265 @@ +--- +name: fms-tree-component +overview: 基于 shadcn-vue 模式(reka-ui + Tailwind v4 + Vue 3 Composition API)从零封装 FmsTree 组件,参考旧系统 FmsTree 的核心能力(虚拟根节点、右键菜单、i18n、展开/选择),并确保与模块管理页面等场景兼容。 +design: + architecture: + framework: vue + component: shadcn + styleKeywords: + - shadcn-vue + - new-york + - Minimalism + - Clean + - Semantic Design + fontSystem: + fontFamily: Inter + heading: + size: 14px + weight: 500 + subheading: + size: 12px + weight: 400 + body: + size: 13px + weight: 400 + colorSystem: + primary: + - var(--primary) + - var(--accent) + background: + - var(--background) + - var(--accent) + - transparent + text: + - var(--foreground) + - var(--muted-foreground) + - var(--accent-foreground) + functional: + - var(--border) + - var(--ring) +todos: + - id: add-t-function + content: 在 stores/app.ts 中添加 t() 翻译函数,支持从 DB 的 b_i18n 表获取翻译文本 + status: pending + - id: create-use-tree-i18n + content: 创建 composables/useTreeI18n.ts,提供递归树节点翻译能力 + status: pending + dependencies: + - add-t-function + - id: create-fms-tree-node + content: 创建 components/FmsTreeNode.vue 递归节点组件,基于 Collapsible + ContextMenu 实现展开折叠、选中高亮、右键菜单、键盘导航 + status: pending + - id: create-fms-tree + content: 创建 components/FmsTree.vue 根组件,实现虚拟根节点包裹、props 定义、v-model 双向绑定、事件转发和 slot 透传 + status: pending + dependencies: + - create-fms-tree-node + - create-use-tree-i18n + - id: verify-and-format + content: 验证组件在模块管理页面中可正常渲染,运行 pnpm fmt:check 检查格式 + status: pending + dependencies: + - create-fms-tree +--- + +## 用户需求 + +在新系统 fms-vue 中封装一个可复用的 FmsTree 树组件,替代旧系统 fms-vue2 中的 FmsTree.vue。新项目使用 shadcn-vue (reka-ui + Tailwind v4) 技术栈,不能使用 antdv-next。 + +## 产品概述 + +FmsTree 是一个通用的树形展示组件,为模块管理、数据分类、文件目录等场景提供统一的树交互体验。 + +## 核心功能 + +- **树形结构展示**:递归渲染树节点,支持无限层级嵌套 +- **展开/折叠**:点击箭头图标展开或折叠子节点,支持 v-model:expandedKeys 受控模式 +- **节点选中**:点击节点高亮选中,支持 v-model:selectedKeys 受控模式,支持单选/多选 +- **虚拟根节点**:自动在 treeData 外层包裹虚拟根节点(如 全部分类),确保首次加载时树处于展开可交互状态 +- **右键菜单**:通过 contextMenu prop 传入菜单生成函数,右键节点弹出自定义菜单项 +- **标题插槽**:支持 #title slot 自定义节点标题渲染 +- ~~i18n 翻译(本次不做,后续按需添加)~~ +- **键盘导航**:支持上下箭头切换节点、左右箭头展开/折叠、Enter 选中 +- **样式定制**:遵循 shadcn-vue 语义颜色体系,支持 Tailwind class 透传 + +## 技术栈 + +- **Vue 3 Composition API** + TypeScript (`