Prechádzať zdrojové kódy

refactor: 重构国际化文件命名规范以及演示页加上代码位置提示 (#1034)

* refactor: 重构国际化文件命名规范以及演示页加上代码位置提示
xiaoming 1 rok pred
rodič
commit
fbacf8e85e
100 zmenil súbory, kde vykonal 1354 pridanie a 1034 odobranie
  1. 173 183
      locales/en.yaml
  2. 173 183
      locales/zh-CN.yaml
  3. 47 27
      mock/asyncRoutes.ts
  4. 58 58
      mock/system.ts
  5. 7 7
      package.json
  6. 126 116
      pnpm-lock.yaml
  7. 1 1
      src/components/ReAnimateSelector/index.ts
  8. 1 1
      src/components/ReBarcode/index.ts
  9. 4 4
      src/components/ReCountTo/src/normal/index.tsx
  10. 1 0
      src/components/ReCountTo/src/normal/props.ts
  11. 1 1
      src/components/ReCountTo/src/rebound/index.tsx
  12. 1 0
      src/components/ReCountTo/src/rebound/props.ts
  13. 1 1
      src/components/ReCropper/src/index.tsx
  14. 2 2
      src/components/ReDialog/index.ts
  15. 3 3
      src/components/ReDialog/index.vue
  16. 1 1
      src/components/ReFlicker/index.ts
  17. 2 2
      src/components/ReFlop/src/filpper.tsx
  18. 1 1
      src/components/ReFlop/src/index.vue
  19. 17 20
      src/components/ReFlowChart/src/Control.vue
  20. 1 1
      src/components/ReQrcode/src/index.tsx
  21. 8 2
      src/components/ReSeamlessScroll/src/index.vue
  22. 4 4
      src/components/ReSelector/src/index.tsx
  23. 2 2
      src/components/ReSplitPane/index.tsx
  24. 1 1
      src/components/ReSplitPane/resizer.tsx
  25. 1 1
      src/components/ReText/src/index.vue
  26. 2 3
      src/components/ReTreeLine/index.ts
  27. 1 1
      src/components/ReTypeit/src/index.tsx
  28. 1 1
      src/config/index.ts
  29. 3 3
      src/directives/optimize/index.ts
  30. 2 2
      src/layout/components/navbar.vue
  31. 2 2
      src/layout/components/sidebar/horizontal.vue
  32. 2 2
      src/layout/components/sidebar/mixNav.vue
  33. 2 2
      src/layout/components/tag/index.vue
  34. 1 1
      src/layout/frameView.vue
  35. 7 7
      src/layout/hooks/useTag.ts
  36. 1 1
      src/layout/types.ts
  37. 28 28
      src/router/modules/able.ts
  38. 2 2
      src/router/modules/about.ts
  39. 2 2
      src/router/modules/board.ts
  40. 32 32
      src/router/modules/components.ts
  41. 2 2
      src/router/modules/editor.ts
  42. 4 4
      src/router/modules/error.ts
  43. 2 2
      src/router/modules/flowchart.ts
  44. 2 2
      src/router/modules/form.ts
  45. 2 2
      src/router/modules/formdesign.ts
  46. 2 2
      src/router/modules/ganttastic.ts
  47. 2 2
      src/router/modules/guide.ts
  48. 2 2
      src/router/modules/home.ts
  49. 2 2
      src/router/modules/list.ts
  50. 2 2
      src/router/modules/menuoverflow.ts
  51. 8 8
      src/router/modules/nested.ts
  52. 3 3
      src/router/modules/remaining.ts
  53. 3 3
      src/router/modules/result.ts
  54. 5 5
      src/router/modules/table.ts
  55. 7 0
      src/views/able/barcode.vue
  56. 7 0
      src/views/able/danmaku/index.vue
  57. 8 1
      src/views/able/debounce.vue
  58. 8 1
      src/views/able/directives.vue
  59. 8 1
      src/views/able/download.vue
  60. 7 0
      src/views/able/draggable.vue
  61. 8 3
      src/views/able/excel.vue
  62. 8 3
      src/views/able/infinite-scroll.vue
  63. 10 3
      src/views/able/line-tree.vue
  64. 8 1
      src/views/able/menu-tree.vue
  65. 196 188
      src/views/able/mqtt-client.vue
  66. 32 27
      src/views/able/pdf.vue
  67. 8 1
      src/views/able/pinyin.vue
  68. 23 24
      src/views/able/print/index.vue
  69. 7 0
      src/views/able/qrcode.vue
  70. 8 1
      src/views/able/ripple.vue
  71. 8 1
      src/views/able/sensitive.vue
  72. 8 1
      src/views/able/typeit.vue
  73. 8 3
      src/views/able/verify.vue
  74. 7 0
      src/views/able/video-frame/index.vue
  75. 7 0
      src/views/able/video.vue
  76. 13 8
      src/views/able/watermark.vue
  77. 7 0
      src/views/able/wavesurfer/index.vue
  78. 7 0
      src/views/components/animatecss.vue
  79. 7 0
      src/views/components/button.vue
  80. 10 1
      src/views/components/cascader.vue
  81. 8 1
      src/views/components/check-button.vue
  82. 8 1
      src/views/components/check-card.vue
  83. 7 0
      src/views/components/collapse.vue
  84. 8 1
      src/views/components/color-picker.vue
  85. 8 1
      src/views/components/contextmenu/index.vue
  86. 8 1
      src/views/components/count-to.vue
  87. 7 0
      src/views/components/cropping/index.vue
  88. 8 1
      src/views/components/date-picker.vue
  89. 8 1
      src/views/components/datetime-picker.vue
  90. 7 1
      src/views/components/dialog/index.vue
  91. 8 1
      src/views/components/el-button.vue
  92. 7 0
      src/views/components/icon-select.vue
  93. 7 0
      src/views/components/json-editor.vue
  94. 8 1
      src/views/components/message.vue
  95. 7 0
      src/views/components/progress.vue
  96. 7 0
      src/views/components/seamless-scroll.vue
  97. 8 1
      src/views/components/segmented.vue
  98. 8 1
      src/views/components/selector.vue
  99. 9 2
      src/views/components/split-pane.vue
  100. 7 0
      src/views/components/statistic.vue

+ 173 - 183
locales/en.yaml

@@ -1,187 +1,177 @@
 buttons:
-  hsLoginOut: LoginOut
-  hsfullscreen: FullScreen
-  hsexitfullscreen: ExitFullscreen
-  hsrefreshRoute: RefreshRoute
-  hslogin: Login
-  hsadd: Add
-  hsmark: Mark/Cancel
-  hssave: Save
-  hssearch: Search
-  hsexpendAll: Expand All
-  hscollapseAll: Collapse All
-  hssystemSet: Open ProjectConfig
-  hsdelete: Delete
-  hsreload: Reload
-  hscloseCurrentTab: Close CurrentTab
-  hscloseLeftTabs: Close LeftTabs
-  hscloseRightTabs: Close RightTabs
-  hscloseOtherTabs: Close OtherTabs
-  hscloseAllTabs: Close AllTabs
-  hswholeFullScreen: FullScreen
-  hswholeExitFullScreen: ExitFull
-  hscontentFullScreen: Content FullScreen
-  hscontentExitFullScreen: Content ExitFullScreen
+  pureLoginOut: LoginOut
+  pureLogin: Login
+  pureSystemSet: Open ProjectConfig
+  pureReload: Reload
+  pureCloseCurrentTab: Close CurrentTab
+  pureCloseLeftTabs: Close LeftTabs
+  pureCloseRightTabs: Close RightTabs
+  pureCloseOtherTabs: Close OtherTabs
+  pureCloseAllTabs: Close AllTabs
+  pureContentFullScreen: Content FullScreen
+  pureContentExitFullScreen: Content ExitFullScreen
 menus:
-  hshome: Home
-  hslogin: Login
-  hsempty: Empty Page
-  hstable: Table
-  hssysManagement: System Manage
-  hsUser: User Manage
-  hsRole: Role Manage
-  hsSystemMenu: Menu Manage
-  hsDept: Dept Manage
-  hssysMonitor: System Monitor
-  hsOnlineUser: Online User
-  hsLoginLog: Login Log
-  hsOperationLog: Operation Log
-  hsSystemLog: System Log
-  hseditor: Editor
-  hsabnormal: Abnormal Page
-  hsfourZeroFour: "404"
-  hsfourZeroOne: "403"
-  hsFive: "500"
-  hscomponents: Components
-  hsdialog: Dialog
-  hsmessage: Message Tips
-  hsvideo: Video
-  hssegmented: Segmented
-  hswaterfall: Waterfall
-  hsmap: Map
-  hsdraggable: Draggable
-  hssplitPane: Split Pane
-  hsText: Text Ellipsis
-  hsElButton: Button
-  hsbutton: Button Animation
-  hsCheckButton: Check Button
-  hscropping: Picture Cropping
-  hsanimatecss: AnimateCss Selector
-  hscountTo: Digital Animation
-  hsselector: Scope Selector
-  hsflowChart: Flow Chart
-  hsseamless: Seamless Scroll
-  hscontextmenu: Context Menu
-  hstypeit: Typeit
-  hsjsoneditor: JSON Editor
-  hsColorPicker: Color Picker
-  hsDatePicker: Date Picker
-  hsDateTimePicker: DateTimePicker
-  hsTimePicker: TimePicker
-  hsTag: Tag
-  hsStatistic: Statistic
-  hsCollapse: Collapse
-  hsGanttastic: Gantt Chart
-  hsProgress: Progress
-  hsUpload: File Upload
-  hsCheckCard: CheckCard
-  hsmenus: MultiLevel Menu
-  hsmenu1: Menu1
-  hsmenu1-1: Menu1-1
-  hsmenu1-2: Menu1-2
-  hsmenu1-2-1: Menu1-2-1
-  hsmenu1-2-2: Menu1-2-2
-  hsmenu1-3: Menu1-3
-  hsmenu2: Menu2
-  permission: Permission Manage
-  permissionPage: Page Permission
-  permissionButton: Button Permission
-  hstabs: Tabs Operate
-  hsguide: Guide
-  hsAble: Able
-  hsMenuTree: Menu Tree
-  hsVideoFrame: Video Frame Capture
-  hsWavesurfer: Audio Visualization
-  hsRipple: Ripple
-  hsMqtt: Mqtt Client
-  hsOptimize: Debounce、Throttle、Copy、Longpress Directives
-  hsVerify: Captcha
-  hsWatermark: Water Mark
-  hsPrint: Print
-  hsDownload: Download
-  hsExternalPage: External Page
-  hsExternalDoc: Docs External
-  hsEmbeddedDoc: Docs Embedded
-  externalLink: Vue-Pure-Admin
-  pureutilsLink: Pure-Admin-Utils
-  hsEpDocument: Element-Plus
-  hsTailwindcssDocument: Tailwindcss
-  hsVueDocument: Vue3
-  hsViteDocument: Vite
-  hsPiniaDocument: Pinia
-  hsRouterDocument: Vue-Router
-  hsAbout: About
-  hsResult: Result Page
-  hsSuccess: Success Page
-  hsFail: Fail Page
-  hsIconSelect: Icon Select
-  hsTimeline: Time Line
-  hsLineTree: LineTree
-  hsList: List Page
-  hsListCard: Card List Page
-  hsDebounce: Debounce & Throttle
-  hsFormDesign: Form Design
-  hsBarcode: Barcode
-  hsQrcode: Qrcode
-  hsCascader: Area Cascader
-  hsSwiper: Swiper Plugin
-  hsVirtualList: Virtual List
-  hsPdf: PDF Preview
-  hsWord: Word Preview
-  hsExcels: Excel Preview
-  hsExcel: Export Excel
-  hsInfiniteScroll: Table Infinite Scroll
-  hsSensitive: Sensitive Filter
-  hsPinyin: PinYin
-  hsdanmaku: Danmaku
-  hsSchemaForm: Form
-  hsPureTableBase: Base Usage
-  hsPureTableHigh: High Usage
-  hsPureTableEdit: Edit Usage
-  hsVxeTable: Virtual Usage
-  hsboard: Paint Board
-  hsMenuoverflow: Menu Overflow Show Tooltip Text
-  hsChildMenuoverflow: Child Menu Overflow Show Tooltip Text
+  pureHome: Home
+  pureLogin: Login
+  pureEmpty: Empty Page
+  pureTable: Table
+  pureSysManagement: System Manage
+  pureUser: User Manage
+  pureRole: Role Manage
+  pureSystemMenu: Menu Manage
+  pureDept: Dept Manage
+  pureSysMonitor: System Monitor
+  pureOnlineUser: Online User
+  pureLoginLog: Login Log
+  pureOperationLog: Operation Log
+  pureSystemLog: System Log
+  pureEditor: Editor
+  pureAbnormal: Abnormal Page
+  pureFourZeroFour: "404"
+  pureFourZeroOne: "403"
+  pureFive: "500"
+  pureComponents: Components
+  pureDialog: Dialog
+  pureMessage: Message Tips
+  pureVideo: Video
+  pureSegmented: Segmented
+  pureWaterfall: Waterfall
+  pureMap: Map
+  pureDraggable: Draggable
+  pureSplitPane: Split Pane
+  pureText: Text Ellipsis
+  pureElButton: Button
+  pureButton: Button Animation
+  pureCheckButton: Check Button
+  pureCropping: Picture Cropping
+  pureAnimatecss: AnimateCss Selector
+  pureCountTo: Digital Animation
+  pureSelector: Scope Selector
+  pureFlowChart: Flow Chart
+  pureSeamless: Seamless Scroll
+  pureContextmenu: Context Menu
+  pureTypeit: Typeit
+  pureJsonEditor: JSON Editor
+  pureColorPicker: Color Picker
+  pureDatePicker: Date Picker
+  pureDateTimePicker: DateTimePicker
+  pureTimePicker: TimePicker
+  pureTag: Tag
+  pureStatistic: Statistic
+  pureCollapse: Collapse
+  pureGanttastic: Gantt Chart
+  pureProgress: Progress
+  pureUpload: File Upload
+  pureCheckCard: CheckCard
+  pureMenus: MultiLevel Menu
+  pureMenu1: Menu1
+  pureMenu1-1: Menu1-1
+  pureMenu1-2: Menu1-2
+  pureMenu1-2-1: Menu1-2-1
+  pureMenu1-2-2: Menu1-2-2
+  pureMenu1-3: Menu1-3
+  pureMenu2: Menu2
+  purePermission: Permission Manage
+  purePermissionPage: Page Permission
+  purePermissionButton: Button Permission
+  pureTabs: Tabs Operate
+  pureGuide: Guide
+  pureAble: Able
+  pureMenuTree: Menu Tree
+  pureVideoFrame: Video Frame Capture
+  pureWavesurfer: Audio Visualization
+  pureRipple: Ripple
+  pureMqtt: Mqtt Client
+  pureOptimize: Debounce、Throttle、Copy、Longpress Directives
+  pureVerify: Captcha
+  pureWatermark: Water Mark
+  purePrint: Print
+  pureDownload: Download
+  pureExternalPage: External Page
+  pureExternalDoc: Docs External
+  pureEmbeddedDoc: Docs Embedded
+  pureExternalLink: Vue-Pure-Admin
+  pureUtilsLink: Pure-Admin-Utils
+  pureColorHuntDoc: ColorHunt
+  pureUiGradients: UiGradients
+  pureEpDoc: Element-Plus
+  pureTailwindcssDoc: Tailwindcss
+  pureVueDoc: Vue3
+  pureViteDoc: Vite
+  purePiniaDoc: Pinia
+  pureRouterDoc: Vue-Router
+  pureAbout: About
+  pureResult: Result Page
+  pureSuccess: Success Page
+  pureFail: Fail Page
+  pureIconSelect: Icon Select
+  pureTimeline: Time Line
+  pureLineTree: LineTree
+  pureList: List Page
+  pureListCard: Card List Page
+  pureDebounce: Debounce & Throttle
+  pureFormDesign: Form Design
+  pureBarcode: Barcode
+  pureQrcode: Qrcode
+  pureCascader: Area Cascader
+  pureSwiper: Swiper Plugin
+  pureVirtualList: Virtual List
+  purePdf: PDF Preview
+  pureWord: Word Preview
+  pureExcels: Excel Preview
+  pureExcel: Export Excel
+  pureInfiniteScroll: Table Infinite Scroll
+  pureSensitive: Sensitive Filter
+  purePinyin: PinYin
+  pureDanmaku: Danmaku
+  pureSchemaForm: Form
+  pureTableBase: Base Usage
+  pureTableHigh: High Usage
+  pureTableEdit: Edit Usage
+  pureVxeTable: Virtual Usage
+  pureBoard: Paint Board
+  pureMenuOverflow: Menu Overflow Show Tooltip Text
+  pureChildMenuOverflow: Child Menu Overflow Show Tooltip Text
 status:
-  hsLoad: Loading...
+  pureLoad: Loading...
 login:
-  username: Username
-  password: Password
-  verifyCode: VerifyCode
-  remember: days no need to login
-  rememberInfo: After checking and logging in, will automatically log in to the system without entering your username and password within the specified number of days.
-  sure: Sure Password
-  forget: Forget Password?
-  login: Login
-  thirdLogin: Third Login
-  phoneLogin: Phone Login
-  qRCodeLogin: QRCode Login
-  register: Register
-  weChatLogin: WeChat Login
-  alipayLogin: Alipay Login
-  qqLogin: QQ Login
-  weiboLogin: Weibo Login
-  phone: Phone
-  smsVerifyCode: SMS VerifyCode
-  back: Back
-  test: Mock Test
-  tip: After scanning the code, click "Confirm" to complete the login
-  definite: Definite
-  loginSuccess: Login Success
-  registerSuccess: Regist Success
-  tickPrivacy: Please tick Privacy Policy
-  readAccept: I have read it carefully and accept
-  privacyPolicy: Privacy Policy
-  getVerifyCode: Get VerifyCode
-  info: Seconds
-  usernameReg: Please enter username
-  passwordReg: Please enter password
-  verifyCodeReg: Please enter verify code
-  verifyCodeCorrectReg: Please enter correct verify code
-  verifyCodeSixReg: Please enter a 6-digit verify code
-  phoneReg: Please enter the phone
-  phoneCorrectReg: Please enter the correct phone number format
-  passwordRuleReg: The password format should be any combination of 8-18 digits
-  passwordSureReg: Please enter confirm password
-  passwordDifferentReg: The two passwords do not match!
-  passwordUpdateReg: Password has been updated
+  pureUsername: Username
+  purePassword: Password
+  pureVerifyCode: VerifyCode
+  pureRemember: days no need to login
+  pureRememberInfo: After checking and logging in, will automatically log in to the system without entering your username and password within the specified number of days.
+  pureSure: Sure Password
+  pureForget: Forget Password?
+  pureLogin: Login
+  pureThirdLogin: Third Login
+  purePhoneLogin: Phone Login
+  pureQRCodeLogin: QRCode Login
+  pureRegister: Register
+  pureWeChatLogin: WeChat Login
+  pureAlipayLogin: Alipay Login
+  pureQQLogin: QQ Login
+  pureWeiBoLogin: Weibo Login
+  purePhone: Phone
+  pureSmsVerifyCode: SMS VerifyCode
+  pureBack: Back
+  pureTest: Mock Test
+  pureTip: After scanning the code, click "Confirm" to complete the login
+  pureDefinite: Definite
+  pureLoginSuccess: Login Success
+  pureRegisterSuccess: Regist Success
+  pureTickPrivacy: Please tick Privacy Policy
+  pureReadAccept: I have read it carefully and accept
+  purePrivacyPolicy: Privacy Policy
+  pureGetVerifyCode: Get VerifyCode
+  pureInfo: Seconds
+  pureUsernameReg: Please enter username
+  purePassWordReg: Please enter password
+  pureVerifyCodeReg: Please enter verify code
+  pureVerifyCodeCorrectReg: Please enter correct verify code
+  pureVerifyCodeSixReg: Please enter a 6-digit verify code
+  purePhoneReg: Please enter the phone
+  purePhoneCorrectReg: Please enter the correct phone number format
+  purePassWordRuleReg: The password format should be any combination of 8-18 digits
+  purePassWordSureReg: Please enter confirm password
+  purePassWordDifferentReg: The two passwords do not match!
+  purePassWordUpdateReg: Password has been updated

+ 173 - 183
locales/zh-CN.yaml

@@ -1,187 +1,177 @@
 buttons:
-  hsLoginOut: 退出系统
-  hsfullscreen: 全屏
-  hsexitfullscreen: 退出全屏
-  hsrefreshRoute: 刷新路由
-  hslogin: 登录
-  hsadd: 新增
-  hsmark: 标记/取消
-  hssave: 保存
-  hssearch: 搜索
-  hsexpendAll: 全部展开
-  hscollapseAll: 全部折叠
-  hssystemSet: 打开项目配置
-  hsdelete: 删除
-  hsreload: 重新加载
-  hscloseCurrentTab: 关闭当前标签页
-  hscloseLeftTabs: 关闭左侧标签页
-  hscloseRightTabs: 关闭右侧标签页
-  hscloseOtherTabs: 关闭其他标签页
-  hscloseAllTabs: 关闭全部标签页
-  hswholeFullScreen: 全屏
-  hswholeExitFullScreen: 退出全屏
-  hscontentFullScreen: 内容区全屏
-  hscontentExitFullScreen: 内容区退出全屏
+  pureLoginOut: 退出系统
+  pureLogin: 登录
+  pureSystemSet: 打开项目配置
+  pureReload: 重新加载
+  pureCloseCurrentTab: 关闭当前标签页
+  pureCloseLeftTabs: 关闭左侧标签页
+  pureCloseRightTabs: 关闭右侧标签页
+  pureCloseOtherTabs: 关闭其他标签页
+  pureCloseAllTabs: 关闭全部标签页
+  pureContentFullScreen: 内容区全屏
+  pureContentExitFullScreen: 内容区退出全屏
 menus:
-  hshome: 首页
-  hslogin: 登录
-  hsempty: 无Layout页
-  hstable: 表格
-  hssysManagement: 系统管理
-  hsUser: 用户管理
-  hsRole: 角色管理
-  hsSystemMenu: 菜单管理
-  hsDept: 部门管理
-  hssysMonitor: 系统监控
-  hsOnlineUser: 在线用户
-  hsLoginLog: 登录日志
-  hsOperationLog: 操作日志
-  hsSystemLog: 系统日志
-  hseditor: 编辑器
-  hsabnormal: 异常页面
-  hsfourZeroFour: "404"
-  hsfourZeroOne: "403"
-  hsFive: "500"
-  hscomponents: 组件
-  hsdialog: 函数式弹框
-  hsmessage: 消息提示
-  hsvideo: 视频
-  hssegmented: 分段控制器
-  hswaterfall: 瀑布流无限滚动
-  hsmap: 地图
-  hsdraggable: 拖拽
-  hssplitPane: 切割面板
-  hsText: 文本省略
-  hsElButton: 按钮
-  hsCheckButton: 可选按钮
-  hsbutton: 按钮动效
-  hscropping: 图片裁剪
-  hsanimatecss: animate.css选择器
-  hscountTo: 数字动画
-  hsselector: 范围选择器
-  hsflowChart: 流程图
-  hsseamless: 无缝滚动
-  hscontextmenu: 右键菜单
-  hstypeit: 打字机
-  hsjsoneditor: JSON编辑器
-  hsColorPicker: 颜色选择器
-  hsDatePicker: 日期选择器
-  hsDateTimePicker: 日期时间选择器
-  hsTimePicker: 时间选择器
-  hsTag: 标签
-  hsStatistic: 统计组件
-  hsCollapse: 折叠面板
-  hsGanttastic: 甘特图
-  hsProgress: 进度条
-  hsUpload: 文件上传
-  hsCheckCard: 多选卡片
-  hsmenus: 多级菜单
-  hsmenu1: 菜单1
-  hsmenu1-1: 菜单1-1
-  hsmenu1-2: 菜单1-2
-  hsmenu1-2-1: 菜单1-2-1
-  hsmenu1-2-2: 菜单1-2-2
-  hsmenu1-3: 菜单1-3
-  hsmenu2: 菜单2
-  permission: 权限管理
-  permissionPage: 页面权限
-  permissionButton: 按钮权限
-  hstabs: 标签页操作
-  hsguide: 引导页
-  hsAble: 功能
-  hsMenuTree: 菜单树结构
-  hsVideoFrame: 视频帧截取-wasm版
-  hsWavesurfer: 音频可视化
-  hsRipple: 波纹(Ripple)
-  hsMqtt: MQTT客户端(mqtt)
-  hsOptimize: 防抖、截流、复制、长按指令
-  hsVerify: 图形验证码
-  hsWatermark: 水印
-  hsPrint: 打印
-  hsDownload: 下载
-  hsExternalPage: 外部页面
-  hsExternalDoc: 文档外链
-  hsEmbeddedDoc: 文档内嵌
-  externalLink: vue-pure-admin
-  pureutilsLink: pure-admin-utils
-  hsEpDocument: element-plus
-  hsTailwindcssDocument: tailwindcss
-  hsVueDocument: vue3
-  hsViteDocument: vite
-  hsPiniaDocument: pinia
-  hsRouterDocument: vue-router
-  hsAbout: 关于
-  hsResult: 结果页面
-  hsSuccess: 成功页面
-  hsFail: 失败页面
-  hsIconSelect: 图标选择器
-  hsTimeline: 时间线
-  hsLineTree: 树形连接线
-  hsList: 列表页面
-  hsListCard: 卡片列表页
-  hsDebounce: 防抖节流
-  hsFormDesign: 表单设计器
-  hsBarcode: 条形码
-  hsQrcode: 二维码
-  hsCascader: 区域级联选择器
-  hsSwiper: Swiper插件
-  hsVirtualList: 虚拟列表
-  hsPdf: PDF预览
-  hsWord: Word预览
-  hsExcels: Excel预览
-  hsExcel: 导出Excel
-  hsInfiniteScroll: 表格无限滚动
-  hsSensitive: 敏感词过滤
-  hsPinyin: 汉语拼音
-  hsdanmaku: 弹幕
-  hsSchemaForm: 表单
-  hsPureTableBase: 基础用法
-  hsPureTableHigh: 高级用法
-  hsPureTableEdit: 可编辑用法
-  hsVxeTable: 虚拟滚动
-  hsboard: 艺术画板
-  hsMenuoverflow: 目录超出显示 Tooltip 文字提示
-  hsChildMenuoverflow: 菜单超出显示 Tooltip 文字提示
+  pureHome: 首页
+  pureLogin: 登录
+  pureEmpty: 无Layout页
+  pureTable: 表格
+  pureSysManagement: 系统管理
+  pureUser: 用户管理
+  pureRole: 角色管理
+  pureSystemMenu: 菜单管理
+  pureDept: 部门管理
+  pureSysMonitor: 系统监控
+  pureOnlineUser: 在线用户
+  pureLoginLog: 登录日志
+  pureOperationLog: 操作日志
+  pureSystemLog: 系统日志
+  pureEditor: 编辑器
+  pureAbnormal: 异常页面
+  pureFourZeroFour: "404"
+  pureFourZeroOne: "403"
+  pureFive: "500"
+  pureComponents: 组件
+  pureDialog: 函数式弹框
+  pureMessage: 消息提示
+  pureVideo: 视频
+  pureSegmented: 分段控制器
+  pureWaterfall: 瀑布流无限滚动
+  pureMap: 地图
+  pureDraggable: 拖拽
+  pureSplitPane: 切割面板
+  pureText: 文本省略
+  pureElButton: 按钮
+  pureCheckButton: 可选按钮
+  pureButton: 按钮动效
+  pureCropping: 图片裁剪
+  pureAnimatecss: animate.css选择器
+  pureCountTo: 数字动画
+  pureSelector: 范围选择器
+  pureFlowChart: 流程图
+  pureSeamless: 无缝滚动
+  pureContextmenu: 右键菜单
+  pureTypeit: 打字机
+  pureJsonEditor: JSON编辑器
+  pureColorPicker: 颜色选择器
+  pureDatePicker: 日期选择器
+  pureDateTimePicker: 日期时间选择器
+  pureTimePicker: 时间选择器
+  pureTag: 标签
+  pureStatistic: 统计组件
+  pureCollapse: 折叠面板
+  pureGanttastic: 甘特图
+  pureProgress: 进度条
+  pureUpload: 文件上传
+  pureCheckCard: 多选卡片
+  pureMenus: 多级菜单
+  pureMenu1: 菜单1
+  pureMenu1-1: 菜单1-1
+  pureMenu1-2: 菜单1-2
+  pureMenu1-2-1: 菜单1-2-1
+  pureMenu1-2-2: 菜单1-2-2
+  pureMenu1-3: 菜单1-3
+  pureMenu2: 菜单2
+  purePermission: 权限管理
+  purePermissionPage: 页面权限
+  purePermissionButton: 按钮权限
+  pureTabs: 标签页操作
+  pureGuide: 引导页
+  pureAble: 功能
+  pureMenuTree: 菜单树结构
+  pureVideoFrame: 视频帧截取-wasm版
+  pureWavesurfer: 音频可视化
+  pureRipple: 波纹(Ripple)
+  pureMqtt: MQTT客户端(mqtt)
+  pureOptimize: 防抖、截流、复制、长按指令
+  pureVerify: 图形验证码
+  pureWatermark: 水印
+  purePrint: 打印
+  pureDownload: 下载
+  pureExternalPage: 外部页面
+  pureExternalDoc: 文档外链
+  pureEmbeddedDoc: 文档内嵌
+  pureExternalLink: vue-pure-admin
+  pureUtilsLink: pure-admin-utils
+  pureColorHuntDoc: 调色板
+  pureUiGradients: 渐变色
+  pureEpDoc: element-plus
+  pureTailwindcssDoc: tailwindcss
+  pureVueDoc: vue3
+  pureViteDoc: vite
+  purePiniaDoc: pinia
+  pureRouterDoc: vue-router
+  pureAbout: 关于
+  pureResult: 结果页面
+  pureSuccess: 成功页面
+  pureFail: 失败页面
+  pureIconSelect: 图标选择器
+  pureTimeline: 时间线
+  pureLineTree: 树形连接线
+  pureList: 列表页面
+  pureListCard: 卡片列表页
+  pureDebounce: 防抖节流
+  pureFormDesign: 表单设计器
+  pureBarcode: 条形码
+  pureQrcode: 二维码
+  pureCascader: 区域级联选择器
+  pureSwiper: Swiper插件
+  pureVirtualList: 虚拟列表
+  purePdf: PDF预览
+  pureWord: Word预览
+  pureExcels: Excel预览
+  pureExcel: 导出Excel
+  pureInfiniteScroll: 表格无限滚动
+  pureSensitive: 敏感词过滤
+  purePinyin: 汉语拼音
+  pureDanmaku: 弹幕
+  pureSchemaForm: 表单
+  pureTableBase: 基础用法
+  pureTableHigh: 高级用法
+  pureTableEdit: 可编辑用法
+  pureVxeTable: 虚拟滚动
+  pureBoard: 艺术画板
+  pureMenuOverflow: 目录超出显示 Tooltip 文字提示
+  pureChildMenuOverflow: 菜单超出显示 Tooltip 文字提示
 status:
-  hsLoad: 加载中...
+  pureLoad: 加载中...
 login:
-  username: 账号
-  password: 密码
-  verifyCode: 验证码
-  remember: 天内免登录
-  rememberInfo: 勾选并登录后,规定天数内无需输入用户名和密码会自动登入系统
-  sure: 确认密码
-  forget: 忘记密码?
-  login: 登录
-  thirdLogin: 第三方登录
-  phoneLogin: 手机登录
-  qRCodeLogin: 二维码登录
-  register: 注册
-  weChatLogin: 微信登录
-  alipayLogin: 支付宝登录
-  qqLogin: QQ登录
-  weiboLogin: 微博登录
-  phone: 手机号码
-  smsVerifyCode: 短信验证码
-  back: 返回
-  test: 模拟测试
-  tip: 扫码后点击"确认",即可完成登录
-  definite: 确定
-  loginSuccess: 登录成功
-  registerSuccess: 注册成功
-  tickPrivacy: 请勾选隐私政策
-  readAccept: 我已仔细阅读并接受
-  privacyPolicy: 《隐私政策》
-  getVerifyCode: 获取验证码
-  info: 秒后重新获取
-  usernameReg: 请输入账号
-  passwordReg: 请输入密码
-  verifyCodeReg: 请输入验证码
-  verifyCodeCorrectReg: 请输入正确的验证码
-  verifyCodeSixReg: 请输入6位数字验证码
-  phoneReg: 请输入手机号码
-  phoneCorrectReg: 请输入正确的手机号码格式
-  passwordRuleReg: 密码格式应为8-18位数字、字母、符号的任意两种组合
-  passwordSureReg: 请输入确认密码
-  passwordDifferentReg: 两次密码不一致!
-  passwordUpdateReg: 修改密码成功
+  pureUsername: 账号
+  purePassword: 密码
+  pureVerifyCode: 验证码
+  pureRemember: 天内免登录
+  pureRememberInfo: 勾选并登录后,规定天数内无需输入用户名和密码会自动登入系统
+  pureSure: 确认密码
+  pureForget: 忘记密码?
+  pureLogin: 登录
+  pureThirdLogin: 第三方登录
+  purePhoneLogin: 手机登录
+  pureQRCodeLogin: 二维码登录
+  pureRegister: 注册
+  pureWeChatLogin: 微信登录
+  pureAlipayLogin: 支付宝登录
+  pureQQLogin: QQ登录
+  pureWeiBoLogin: 微博登录
+  purePhone: 手机号码
+  pureSmsVerifyCode: 短信验证码
+  pureBack: 返回
+  pureTest: 模拟测试
+  pureTip: 扫码后点击"确认",即可完成登录
+  pureDefinite: 确定
+  pureLoginSuccess: 登录成功
+  pureRegisterSuccess: 注册成功
+  pureTickPrivacy: 请勾选隐私政策
+  pureReadAccept: 我已仔细阅读并接受
+  purePrivacyPolicy: 《隐私政策》
+  pureGetVerifyCode: 获取验证码
+  pureInfo: 秒后重新获取
+  pureUsernameReg: 请输入账号
+  purePassWordReg: 请输入密码
+  pureVerifyCodeReg: 请输入验证码
+  pureVerifyCodeCorrectReg: 请输入正确的验证码
+  pureVerifyCodeSixReg: 请输入6位数字验证码
+  purePhoneReg: 请输入手机号码
+  purePhoneCorrectReg: 请输入正确的手机号码格式
+  purePassWordRuleReg: 密码格式应为8-18位数字、字母、符号的任意两种组合
+  purePassWordSureReg: 请输入确认密码
+  purePassWordDifferentReg: 两次密码不一致!
+  purePassWordUpdateReg: 修改密码成功

+ 47 - 27
mock/asyncRoutes.ts

@@ -12,7 +12,7 @@ const systemManagementRouter = {
   path: "/system",
   meta: {
     icon: "ri:settings-3-line",
-    title: "menus.hssysManagement",
+    title: "menus.pureSysManagement",
     rank: system
   },
   children: [
@@ -21,7 +21,7 @@ const systemManagementRouter = {
       name: "SystemUser",
       meta: {
         icon: "ri:admin-line",
-        title: "menus.hsUser",
+        title: "menus.pureUser",
         roles: ["admin"]
       }
     },
@@ -30,7 +30,7 @@ const systemManagementRouter = {
       name: "SystemRole",
       meta: {
         icon: "ri:admin-fill",
-        title: "menus.hsRole",
+        title: "menus.pureRole",
         roles: ["admin"]
       }
     },
@@ -39,7 +39,7 @@ const systemManagementRouter = {
       name: "SystemMenu",
       meta: {
         icon: "ep:menu",
-        title: "menus.hsSystemMenu",
+        title: "menus.pureSystemMenu",
         roles: ["admin"]
       }
     },
@@ -48,7 +48,7 @@ const systemManagementRouter = {
       name: "SystemDept",
       meta: {
         icon: "ri:git-branch-line",
-        title: "menus.hsDept",
+        title: "menus.pureDept",
         roles: ["admin"]
       }
     }
@@ -59,7 +59,7 @@ const systemMonitorRouter = {
   path: "/monitor",
   meta: {
     icon: "ep:monitor",
-    title: "menus.hssysMonitor",
+    title: "menus.pureSysMonitor",
     rank: monitor
   },
   children: [
@@ -69,7 +69,7 @@ const systemMonitorRouter = {
       name: "OnlineUser",
       meta: {
         icon: "ri:user-voice-line",
-        title: "menus.hsOnlineUser",
+        title: "menus.pureOnlineUser",
         roles: ["admin"]
       }
     },
@@ -79,7 +79,7 @@ const systemMonitorRouter = {
       name: "LoginLog",
       meta: {
         icon: "ri:window-line",
-        title: "menus.hsLoginLog",
+        title: "menus.pureLoginLog",
         roles: ["admin"]
       }
     },
@@ -89,7 +89,7 @@ const systemMonitorRouter = {
       name: "OperationLog",
       meta: {
         icon: "ri:history-fill",
-        title: "menus.hsOperationLog",
+        title: "menus.pureOperationLog",
         roles: ["admin"]
       }
     },
@@ -99,7 +99,7 @@ const systemMonitorRouter = {
       name: "SystemLog",
       meta: {
         icon: "ri:file-search-line",
-        title: "menus.hsSystemLog",
+        title: "menus.pureSystemLog",
         roles: ["admin"]
       }
     }
@@ -109,7 +109,7 @@ const systemMonitorRouter = {
 const permissionRouter = {
   path: "/permission",
   meta: {
-    title: "menus.permission",
+    title: "menus.purePermission",
     icon: "ep:lollipop",
     rank: permission
   },
@@ -118,7 +118,7 @@ const permissionRouter = {
       path: "/permission/page/index",
       name: "PermissionPage",
       meta: {
-        title: "menus.permissionPage",
+        title: "menus.purePermissionPage",
         roles: ["admin", "common"]
       }
     },
@@ -126,7 +126,7 @@ const permissionRouter = {
       path: "/permission/button/index",
       name: "PermissionButton",
       meta: {
-        title: "menus.permissionButton",
+        title: "menus.purePermissionButton",
         roles: ["admin", "common"],
         auths: [
           "permission:btn:add",
@@ -142,29 +142,29 @@ const frameRouter = {
   path: "/iframe",
   meta: {
     icon: "ri:links-fill",
-    title: "menus.hsExternalPage",
+    title: "menus.pureExternalPage",
     rank: frame
   },
   children: [
     {
       path: "/iframe/external",
       meta: {
-        title: "menus.hsExternalDoc"
+        title: "menus.pureExternalDoc"
       },
       children: [
         {
           path: "/external",
           name: "https://yiming_chang.gitee.io/pure-admin-doc",
           meta: {
-            title: "menus.externalLink",
+            title: "menus.pureExternalLink",
             roles: ["admin", "common"]
           }
         },
         {
-          path: "/pureutilsLink",
+          path: "/pureUtilsLink",
           name: "https://pure-admin-utils.netlify.app/",
           meta: {
-            title: "menus.pureutilsLink",
+            title: "menus.pureUtilsLink",
             roles: ["admin", "common"]
           }
         }
@@ -173,14 +173,34 @@ const frameRouter = {
     {
       path: "/iframe/embedded",
       meta: {
-        title: "menus.hsEmbeddedDoc"
+        title: "menus.pureEmbeddedDoc"
       },
       children: [
+        {
+          path: "/iframe/colorhunt",
+          name: "FrameColorHunt",
+          meta: {
+            title: "menus.pureColorHuntDoc",
+            frameSrc: "https://colorhunt.co/",
+            keepAlive: true,
+            roles: ["admin", "common"]
+          }
+        },
+        {
+          path: "/iframe/uigradients",
+          name: "FrameUiGradients",
+          meta: {
+            title: "menus.pureUiGradients",
+            frameSrc: "https://uigradients.com/",
+            keepAlive: true,
+            roles: ["admin", "common"]
+          }
+        },
         {
           path: "/iframe/ep",
           name: "FrameEp",
           meta: {
-            title: "menus.hsEpDocument",
+            title: "menus.pureEpDoc",
             frameSrc: "https://element-plus.org/zh-CN/",
             keepAlive: true,
             roles: ["admin", "common"]
@@ -190,7 +210,7 @@ const frameRouter = {
           path: "/iframe/tailwindcss",
           name: "FrameTailwindcss",
           meta: {
-            title: "menus.hsTailwindcssDocument",
+            title: "menus.pureTailwindcssDoc",
             frameSrc: "https://tailwindcss.com/docs/installation",
             keepAlive: true,
             roles: ["admin", "common"]
@@ -200,7 +220,7 @@ const frameRouter = {
           path: "/iframe/vue3",
           name: "FrameVue",
           meta: {
-            title: "menus.hsVueDocument",
+            title: "menus.pureVueDoc",
             frameSrc: "https://cn.vuejs.org/",
             keepAlive: true,
             roles: ["admin", "common"]
@@ -210,7 +230,7 @@ const frameRouter = {
           path: "/iframe/vite",
           name: "FrameVite",
           meta: {
-            title: "menus.hsViteDocument",
+            title: "menus.pureViteDoc",
             frameSrc: "https://cn.vitejs.dev/",
             keepAlive: true,
             roles: ["admin", "common"]
@@ -220,7 +240,7 @@ const frameRouter = {
           path: "/iframe/pinia",
           name: "FramePinia",
           meta: {
-            title: "menus.hsPiniaDocument",
+            title: "menus.purePiniaDoc",
             frameSrc: "https://pinia.vuejs.org/zh/index.html",
             keepAlive: true,
             roles: ["admin", "common"]
@@ -230,7 +250,7 @@ const frameRouter = {
           path: "/iframe/vue-router",
           name: "FrameRouter",
           meta: {
-            title: "menus.hsRouterDocument",
+            title: "menus.pureRouterDoc",
             frameSrc: "https://router.vuejs.org/zh/",
             keepAlive: true,
             roles: ["admin", "common"]
@@ -245,7 +265,7 @@ const tabsRouter = {
   path: "/tabs",
   meta: {
     icon: "ri:bookmark-2-line",
-    title: "menus.hstabs",
+    title: "menus.pureTabs",
     rank: tabs
   },
   children: [
@@ -253,7 +273,7 @@ const tabsRouter = {
       path: "/tabs/index",
       name: "Tabs",
       meta: {
-        title: "menus.hstabs",
+        title: "menus.pureTabs",
         roles: ["admin", "common"]
       }
     },

+ 58 - 58
mock/system.ts

@@ -153,86 +153,86 @@ export default defineFakeRoute([
             parentId: 0,
             id: 100,
             menuType: 0, // 菜单类型(0代表菜单、1代表iframe、2代表外链、3代表按钮)
-            title: "menus.hsExternalPage"
+            title: "menus.pureExternalPage"
           },
           {
             parentId: 100,
             id: 101,
             menuType: 0,
-            title: "menus.hsExternalDoc"
+            title: "menus.pureExternalDoc"
           },
           {
             parentId: 101,
             id: 102,
             menuType: 2,
-            title: "menus.externalLink"
+            title: "menus.pureExternalLink"
           },
           {
             parentId: 101,
             id: 103,
             menuType: 2,
-            title: "menus.pureutilsLink"
+            title: "menus.pureUtilsLink"
           },
           {
             parentId: 100,
             id: 104,
             menuType: 1,
-            title: "menus.hsEmbeddedDoc"
+            title: "menus.pureEmbeddedDoc"
           },
           {
             parentId: 104,
             id: 105,
             menuType: 1,
-            title: "menus.hsEpDocument"
+            title: "menus.pureEpDoc"
           },
           {
             parentId: 104,
             id: 106,
             menuType: 1,
-            title: "menus.hsTailwindcssDocument"
+            title: "menus.pureTailwindcssDoc"
           },
           {
             parentId: 104,
             id: 107,
             menuType: 1,
-            title: "menus.hsVueDocument"
+            title: "menus.pureVueDoc"
           },
           {
             parentId: 104,
             id: 108,
             menuType: 1,
-            title: "menus.hsViteDocument"
+            title: "menus.pureViteDoc"
           },
           {
             parentId: 104,
             id: 109,
             menuType: 1,
-            title: "menus.hsPiniaDocument"
+            title: "menus.purePiniaDoc"
           },
           {
             parentId: 104,
             id: 110,
             menuType: 1,
-            title: "menus.hsRouterDocument"
+            title: "menus.pureRouterDoc"
           },
           // 权限管理
           {
             parentId: 0,
             id: 200,
             menuType: 0,
-            title: "menus.permission"
+            title: "menus.purePermission"
           },
           {
             parentId: 200,
             id: 201,
             menuType: 0,
-            title: "menus.permissionPage"
+            title: "menus.purePermissionPage"
           },
           {
             parentId: 200,
             id: 202,
             menuType: 0,
-            title: "menus.permissionButton"
+            title: "menus.purePermissionButton"
           },
           {
             parentId: 202,
@@ -257,75 +257,75 @@ export default defineFakeRoute([
             parentId: 0,
             id: 300,
             menuType: 0,
-            title: "menus.hssysManagement"
+            title: "menus.pureSysManagement"
           },
           {
             parentId: 300,
             id: 301,
             menuType: 0,
-            title: "menus.hsUser"
+            title: "menus.pureUser"
           },
           {
             parentId: 300,
             id: 302,
             menuType: 0,
-            title: "menus.hsRole"
+            title: "menus.pureRole"
           },
           {
             parentId: 300,
             id: 303,
             menuType: 0,
-            title: "menus.hsSystemMenu"
+            title: "menus.pureSystemMenu"
           },
           {
             parentId: 300,
             id: 304,
             menuType: 0,
-            title: "menus.hsDept"
+            title: "menus.pureDept"
           },
           // 系统监控
           {
             parentId: 0,
             id: 400,
             menuType: 0,
-            title: "menus.hssysMonitor"
+            title: "menus.pureSysMonitor"
           },
           {
             parentId: 400,
             id: 401,
             menuType: 0,
-            title: "menus.hsOnlineUser"
+            title: "menus.pureOnlineUser"
           },
           {
             parentId: 400,
             id: 402,
             menuType: 0,
-            title: "menus.hsLoginLog"
+            title: "menus.pureLoginLog"
           },
           {
             parentId: 400,
             id: 403,
             menuType: 0,
-            title: "menus.hsOperationLog"
+            title: "menus.pureOperationLog"
           },
           {
             parentId: 400,
             id: 404,
             menuType: 0,
-            title: "menus.hsSystemLog"
+            title: "menus.pureSystemLog"
           },
           // 标签页操作
           {
             parentId: 0,
             id: 500,
             menuType: 0,
-            title: "menus.hstabs"
+            title: "menus.pureTabs"
           },
           {
             parentId: 500,
             id: 501,
             menuType: 0,
-            title: "menus.hstabs"
+            title: "menus.pureTabs"
           },
           {
             parentId: 500,
@@ -381,7 +381,7 @@ export default defineFakeRoute([
             parentId: 0,
             id: 100,
             menuType: 0, // 菜单类型(0代表菜单、1代表iframe、2代表外链、3代表按钮)
-            title: "menus.hsExternalPage",
+            title: "menus.pureExternalPage",
             name: "PureIframe",
             path: "/iframe",
             component: "",
@@ -404,7 +404,7 @@ export default defineFakeRoute([
             parentId: 100,
             id: 101,
             menuType: 0,
-            title: "menus.hsExternalDoc",
+            title: "menus.pureExternalDoc",
             name: "PureIframeExternal",
             path: "/iframe/external",
             component: "",
@@ -427,7 +427,7 @@ export default defineFakeRoute([
             parentId: 101,
             id: 102,
             menuType: 2,
-            title: "menus.externalLink",
+            title: "menus.pureExternalLink",
             name: "https://yiming_chang.gitee.io/pure-admin-doc",
             path: "/external",
             component: "",
@@ -450,9 +450,9 @@ export default defineFakeRoute([
             parentId: 101,
             id: 103,
             menuType: 2,
-            title: "menus.pureutilsLink",
+            title: "menus.pureUtilsLink",
             name: "https://pure-admin-utils.netlify.app/",
-            path: "/pureutilsLink",
+            path: "/pureUtilsLink",
             component: "",
             rank: null,
             redirect: "",
@@ -473,7 +473,7 @@ export default defineFakeRoute([
             parentId: 100,
             id: 104,
             menuType: 1,
-            title: "menus.hsEmbeddedDoc",
+            title: "menus.pureEmbeddedDoc",
             name: "PureIframeEmbedded",
             path: "/iframe/embedded",
             component: "",
@@ -496,7 +496,7 @@ export default defineFakeRoute([
             parentId: 104,
             id: 105,
             menuType: 1,
-            title: "menus.hsEpDocument",
+            title: "menus.pureEpDoc",
             name: "FrameEp",
             path: "/iframe/ep",
             component: "",
@@ -519,7 +519,7 @@ export default defineFakeRoute([
             parentId: 104,
             id: 106,
             menuType: 1,
-            title: "menus.hsTailwindcssDocument",
+            title: "menus.pureTailwindcssDoc",
             name: "FrameTailwindcss",
             path: "/iframe/tailwindcss",
             component: "",
@@ -542,7 +542,7 @@ export default defineFakeRoute([
             parentId: 104,
             id: 107,
             menuType: 1,
-            title: "menus.hsVueDocument",
+            title: "menus.pureVueDoc",
             name: "FrameVue",
             path: "/iframe/vue3",
             component: "",
@@ -565,7 +565,7 @@ export default defineFakeRoute([
             parentId: 104,
             id: 108,
             menuType: 1,
-            title: "menus.hsViteDocument",
+            title: "menus.pureViteDoc",
             name: "FrameVite",
             path: "/iframe/vite",
             component: "",
@@ -588,7 +588,7 @@ export default defineFakeRoute([
             parentId: 104,
             id: 109,
             menuType: 1,
-            title: "menus.hsPiniaDocument",
+            title: "menus.purePiniaDoc",
             name: "FramePinia",
             path: "/iframe/pinia",
             component: "",
@@ -611,7 +611,7 @@ export default defineFakeRoute([
             parentId: 104,
             id: 110,
             menuType: 1,
-            title: "menus.hsRouterDocument",
+            title: "menus.pureRouterDoc",
             name: "FrameRouter",
             path: "/iframe/vue-router",
             component: "",
@@ -635,7 +635,7 @@ export default defineFakeRoute([
             parentId: 0,
             id: 200,
             menuType: 0,
-            title: "menus.permission",
+            title: "menus.purePermission",
             name: "PurePermission",
             path: "/permission",
             component: "",
@@ -658,7 +658,7 @@ export default defineFakeRoute([
             parentId: 200,
             id: 201,
             menuType: 0,
-            title: "menus.permissionPage",
+            title: "menus.purePermissionPage",
             name: "PermissionPage",
             path: "/permission/page/index",
             component: "",
@@ -681,7 +681,7 @@ export default defineFakeRoute([
             parentId: 200,
             id: 202,
             menuType: 0,
-            title: "menus.permissionButton",
+            title: "menus.purePermissionButton",
             name: "PermissionButton",
             path: "/permission/button/index",
             component: "",
@@ -774,7 +774,7 @@ export default defineFakeRoute([
             parentId: 0,
             id: 300,
             menuType: 0,
-            title: "menus.hssysManagement",
+            title: "menus.pureSysManagement",
             name: "PureSystem",
             path: "/system",
             component: "",
@@ -797,7 +797,7 @@ export default defineFakeRoute([
             parentId: 300,
             id: 301,
             menuType: 0,
-            title: "menus.hsUser",
+            title: "menus.pureUser",
             name: "SystemUser",
             path: "/system/user/index",
             component: "",
@@ -820,7 +820,7 @@ export default defineFakeRoute([
             parentId: 300,
             id: 302,
             menuType: 0,
-            title: "menus.hsRole",
+            title: "menus.pureRole",
             name: "SystemRole",
             path: "/system/role/index",
             component: "",
@@ -843,7 +843,7 @@ export default defineFakeRoute([
             parentId: 300,
             id: 303,
             menuType: 0,
-            title: "menus.hsSystemMenu",
+            title: "menus.pureSystemMenu",
             name: "SystemMenu",
             path: "/system/menu/index",
             component: "",
@@ -866,7 +866,7 @@ export default defineFakeRoute([
             parentId: 300,
             id: 304,
             menuType: 0,
-            title: "menus.hsDept",
+            title: "menus.pureDept",
             name: "SystemDept",
             path: "/system/dept/index",
             component: "",
@@ -890,7 +890,7 @@ export default defineFakeRoute([
             parentId: 0,
             id: 400,
             menuType: 0,
-            title: "menus.hssysMonitor",
+            title: "menus.pureSysMonitor",
             name: "PureMonitor",
             path: "/monitor",
             component: "",
@@ -913,7 +913,7 @@ export default defineFakeRoute([
             parentId: 400,
             id: 401,
             menuType: 0,
-            title: "menus.hsOnlineUser",
+            title: "menus.pureOnlineUser",
             name: "OnlineUser",
             path: "/monitor/online-user",
             component: "monitor/online/index",
@@ -936,7 +936,7 @@ export default defineFakeRoute([
             parentId: 400,
             id: 402,
             menuType: 0,
-            title: "menus.hsLoginLog",
+            title: "menus.pureLoginLog",
             name: "LoginLog",
             path: "/monitor/login-logs",
             component: "monitor/logs/login/index",
@@ -959,7 +959,7 @@ export default defineFakeRoute([
             parentId: 400,
             id: 403,
             menuType: 0,
-            title: "menus.hsOperationLog",
+            title: "menus.pureOperationLog",
             name: "OperationLog",
             path: "/monitor/operation-logs",
             component: "monitor/logs/operation/index",
@@ -982,7 +982,7 @@ export default defineFakeRoute([
             parentId: 400,
             id: 404,
             menuType: 0,
-            title: "menus.hsSystemLog",
+            title: "menus.pureSystemLog",
             name: "SystemLog",
             path: "/monitor/system-logs",
             component: "monitor/logs/system/index",
@@ -1006,7 +1006,7 @@ export default defineFakeRoute([
             parentId: 0,
             id: 500,
             menuType: 0,
-            title: "menus.hstabs",
+            title: "menus.pureTabs",
             name: "PureTabs",
             path: "/tabs",
             component: "",
@@ -1029,7 +1029,7 @@ export default defineFakeRoute([
             parentId: 500,
             id: 501,
             menuType: 0,
-            title: "menus.hstabs",
+            title: "menus.pureTabs",
             name: "Tabs",
             path: "/tabs/index",
             component: "",
@@ -1456,7 +1456,7 @@ export default defineFakeRoute([
                 parentId: 0,
                 id: 400,
                 menuType: 0,
-                title: "menus.hssysMonitor",
+                title: "menus.pureSysMonitor",
                 name: "PureMonitor",
                 path: "/monitor",
                 component: "",
@@ -1479,7 +1479,7 @@ export default defineFakeRoute([
                 parentId: 400,
                 id: 401,
                 menuType: 0,
-                title: "menus.hsOnlineUser",
+                title: "menus.pureOnlineUser",
                 name: "OnlineUser",
                 path: "/monitor/online-user",
                 component: "monitor/online/index",
@@ -1502,7 +1502,7 @@ export default defineFakeRoute([
                 parentId: 400,
                 id: 402,
                 menuType: 0,
-                title: "menus.hsLoginLog",
+                title: "menus.pureLoginLog",
                 name: "LoginLog",
                 path: "/monitor/login-logs",
                 component: "monitor/logs/login/index",
@@ -1525,7 +1525,7 @@ export default defineFakeRoute([
                 parentId: 400,
                 id: 403,
                 menuType: 0,
-                title: "menus.hsOperationLog",
+                title: "menus.pureOperationLog",
                 name: "OperationLog",
                 path: "/monitor/operation-logs",
                 component: "monitor/logs/operation/index",
@@ -1548,7 +1548,7 @@ export default defineFakeRoute([
                 parentId: 400,
                 id: 404,
                 menuType: 0,
-                title: "menus.hsSystemLog",
+                title: "menus.pureSystemLog",
                 name: "SystemLog",
                 path: "/monitor/system-logs",
                 component: "monitor/logs/system/index",

+ 7 - 7
package.json

@@ -57,7 +57,7 @@
     "@pureadmin/table": "^3.1.2",
     "@pureadmin/utils": "^2.4.7",
     "@vue-flow/background": "^1.3.0",
-    "@vue-flow/core": "^1.33.4",
+    "@vue-flow/core": "^1.33.5",
     "@vue-office/docx": "^1.6.0",
     "@vue-office/excel": "^1.7.2",
     "@vueuse/core": "^10.9.0",
@@ -131,20 +131,20 @@
     "@types/qrcode": "^1.5.5",
     "@types/qs": "^6.9.14",
     "@types/sortablejs": "^1.15.8",
-    "@typescript-eslint/eslint-plugin": "^7.3.1",
-    "@typescript-eslint/parser": "^7.3.1",
+    "@typescript-eslint/eslint-plugin": "^7.4.0",
+    "@typescript-eslint/parser": "^7.4.0",
     "@vitejs/plugin-vue": "^5.0.4",
     "@vitejs/plugin-vue-jsx": "^3.1.0",
     "autoprefixer": "^10.4.19",
     "boxen": "^7.1.1",
     "cloc": "^2.11.0",
-    "cssnano": "^6.1.1",
+    "cssnano": "^6.1.2",
     "dagre": "^0.8.5",
     "eslint": "^8.57.0",
     "eslint-config-prettier": "^9.1.0",
     "eslint-define-config": "^2.1.0",
     "eslint-plugin-prettier": "^5.1.3",
-    "eslint-plugin-vue": "^9.23.0",
+    "eslint-plugin-vue": "^9.24.0",
     "gradient-string": "^2.0.2",
     "husky": "^9.0.11",
     "lint-staged": "^15.2.2",
@@ -156,7 +156,7 @@
     "rimraf": "^5.0.5",
     "rollup-plugin-visualizer": "^5.12.0",
     "sass": "^1.72.0",
-    "stylelint": "^16.2.1",
+    "stylelint": "^16.3.1",
     "stylelint-config-recess-order": "^5.0.0",
     "stylelint-config-recommended-vue": "^1.5.0",
     "stylelint-config-standard-scss": "^13.0.0",
@@ -164,7 +164,7 @@
     "svgo": "^3.2.0",
     "tailwindcss": "^3.4.1",
     "typescript": "^5.4.3",
-    "vite": "^5.2.3",
+    "vite": "^5.2.6",
     "vite-plugin-cdn-import": "^0.3.5",
     "vite-plugin-compression": "^0.5.1",
     "vite-plugin-fake-server": "^2.1.1",

+ 126 - 116
pnpm-lock.yaml

@@ -31,10 +31,10 @@ dependencies:
     version: 2.4.7(echarts@5.5.0)(vue@3.4.21)
   '@vue-flow/background':
     specifier: ^1.3.0
-    version: 1.3.0(@vue-flow/core@1.33.4)(vue@3.4.21)
+    version: 1.3.0(@vue-flow/core@1.33.5)(vue@3.4.21)
   '@vue-flow/core':
-    specifier: ^1.33.4
-    version: 1.33.4(vue@3.4.21)
+    specifier: ^1.33.5
+    version: 1.33.5(vue@3.4.21)
   '@vue-office/docx':
     specifier: ^1.6.0
     version: 1.6.0(vue-demi@0.14.7)(vue@3.4.21)
@@ -251,17 +251,17 @@ devDependencies:
     specifier: ^1.15.8
     version: 1.15.8
   '@typescript-eslint/eslint-plugin':
-    specifier: ^7.3.1
-    version: 7.3.1(@typescript-eslint/parser@7.3.1)(eslint@8.57.0)(typescript@5.4.3)
+    specifier: ^7.4.0
+    version: 7.4.0(@typescript-eslint/parser@7.4.0)(eslint@8.57.0)(typescript@5.4.3)
   '@typescript-eslint/parser':
-    specifier: ^7.3.1
-    version: 7.3.1(eslint@8.57.0)(typescript@5.4.3)
+    specifier: ^7.4.0
+    version: 7.4.0(eslint@8.57.0)(typescript@5.4.3)
   '@vitejs/plugin-vue':
     specifier: ^5.0.4
-    version: 5.0.4(vite@5.2.3)(vue@3.4.21)
+    version: 5.0.4(vite@5.2.6)(vue@3.4.21)
   '@vitejs/plugin-vue-jsx':
     specifier: ^3.1.0
-    version: 3.1.0(vite@5.2.3)(vue@3.4.21)
+    version: 3.1.0(vite@5.2.6)(vue@3.4.21)
   autoprefixer:
     specifier: ^10.4.19
     version: 10.4.19(postcss@8.4.38)
@@ -272,8 +272,8 @@ devDependencies:
     specifier: ^2.11.0
     version: 2.11.0
   cssnano:
-    specifier: ^6.1.1
-    version: 6.1.1(postcss@8.4.38)
+    specifier: ^6.1.2
+    version: 6.1.2(postcss@8.4.38)
   dagre:
     specifier: ^0.8.5
     version: 0.8.5
@@ -290,8 +290,8 @@ devDependencies:
     specifier: ^5.1.3
     version: 5.1.3(eslint-config-prettier@9.1.0)(eslint@8.57.0)(prettier@3.2.5)
   eslint-plugin-vue:
-    specifier: ^9.23.0
-    version: 9.23.0(eslint@8.57.0)
+    specifier: ^9.24.0
+    version: 9.24.0(eslint@8.57.0)
   gradient-string:
     specifier: ^2.0.2
     version: 2.0.2
@@ -326,20 +326,20 @@ devDependencies:
     specifier: ^1.72.0
     version: 1.72.0
   stylelint:
-    specifier: ^16.2.1
-    version: 16.2.1(typescript@5.4.3)
+    specifier: ^16.3.1
+    version: 16.3.1(typescript@5.4.3)
   stylelint-config-recess-order:
     specifier: ^5.0.0
-    version: 5.0.0(stylelint@16.2.1)
+    version: 5.0.0(stylelint@16.3.1)
   stylelint-config-recommended-vue:
     specifier: ^1.5.0
-    version: 1.5.0(postcss-html@1.6.0)(stylelint@16.2.1)
+    version: 1.5.0(postcss-html@1.6.0)(stylelint@16.3.1)
   stylelint-config-standard-scss:
     specifier: ^13.0.0
-    version: 13.0.0(postcss@8.4.38)(stylelint@16.2.1)
+    version: 13.0.0(postcss@8.4.38)(stylelint@16.3.1)
   stylelint-prettier:
     specifier: ^5.0.0
-    version: 5.0.0(prettier@3.2.5)(stylelint@16.2.1)
+    version: 5.0.0(prettier@3.2.5)(stylelint@16.3.1)
   svgo:
     specifier: ^3.2.0
     version: 3.2.0
@@ -350,14 +350,14 @@ devDependencies:
     specifier: ^5.4.3
     version: 5.4.3
   vite:
-    specifier: ^5.2.3
-    version: 5.2.3(@types/node@20.11.30)(sass@1.72.0)
+    specifier: ^5.2.6
+    version: 5.2.6(@types/node@20.11.30)(sass@1.72.0)
   vite-plugin-cdn-import:
     specifier: ^0.3.5
     version: 0.3.5(rollup@2.79.1)
   vite-plugin-compression:
     specifier: ^0.5.1
-    version: 0.5.1(vite@5.2.3)
+    version: 0.5.1(vite@5.2.6)
   vite-plugin-fake-server:
     specifier: ^2.1.1
     version: 2.1.1
@@ -1001,6 +1001,10 @@ packages:
     engines: {node: '>=10'}
     dev: false
 
+  /@dual-bundle/import-meta-resolve@4.0.0:
+    resolution: {integrity: sha512-ZKXyJeFAzcpKM2kk8ipoGIPUqx9BX52omTGnfwjJvxOCaZTM2wtDK7zN0aIgPRbT9XYAlha0HtmZ+XKteuh0Gw==}
+    dev: true
+
   /@element-plus/icons-vue@1.1.4(vue@3.4.21):
     resolution: {integrity: sha512-Iz/nHqdp1sFPmdzRwHkEQQA3lKvoObk8azgABZ81QUOpW9s/lUyQVUSh0tNtEPZXQlKwlSh7SPgoVxzrE0uuVQ==}
     peerDependencies:
@@ -2392,8 +2396,8 @@ packages:
       '@types/yargs-parser': 21.0.3
     dev: false
 
-  /@typescript-eslint/eslint-plugin@7.3.1(@typescript-eslint/parser@7.3.1)(eslint@8.57.0)(typescript@5.4.3):
-    resolution: {integrity: sha512-STEDMVQGww5lhCuNXVSQfbfuNII5E08QWkvAw5Qwf+bj2WT+JkG1uc+5/vXA3AOYMDHVOSpL+9rcbEUiHIm2dw==}
+  /@typescript-eslint/eslint-plugin@7.4.0(@typescript-eslint/parser@7.4.0)(eslint@8.57.0)(typescript@5.4.3):
+    resolution: {integrity: sha512-yHMQ/oFaM7HZdVrVm/M2WHaNPgyuJH4WelkSVEWSSsir34kxW2kDJCxlXRhhGWEsMN0WAW/vLpKfKVcm8k+MPw==}
     engines: {node: ^18.18.0 || >=20.0.0}
     peerDependencies:
       '@typescript-eslint/parser': ^7.0.0
@@ -2404,11 +2408,11 @@ packages:
         optional: true
     dependencies:
       '@eslint-community/regexpp': 4.10.0
-      '@typescript-eslint/parser': 7.3.1(eslint@8.57.0)(typescript@5.4.3)
-      '@typescript-eslint/scope-manager': 7.3.1
-      '@typescript-eslint/type-utils': 7.3.1(eslint@8.57.0)(typescript@5.4.3)
-      '@typescript-eslint/utils': 7.3.1(eslint@8.57.0)(typescript@5.4.3)
-      '@typescript-eslint/visitor-keys': 7.3.1
+      '@typescript-eslint/parser': 7.4.0(eslint@8.57.0)(typescript@5.4.3)
+      '@typescript-eslint/scope-manager': 7.4.0
+      '@typescript-eslint/type-utils': 7.4.0(eslint@8.57.0)(typescript@5.4.3)
+      '@typescript-eslint/utils': 7.4.0(eslint@8.57.0)(typescript@5.4.3)
+      '@typescript-eslint/visitor-keys': 7.4.0
       debug: 4.3.4
       eslint: 8.57.0
       graphemer: 1.4.0
@@ -2421,8 +2425,8 @@ packages:
       - supports-color
     dev: true
 
-  /@typescript-eslint/parser@7.3.1(eslint@8.57.0)(typescript@5.4.3):
-    resolution: {integrity: sha512-Rq49+pq7viTRCH48XAbTA+wdLRrB/3sRq4Lpk0oGDm0VmnjBrAOVXH/Laalmwsv2VpekiEfVFwJYVk6/e8uvQw==}
+  /@typescript-eslint/parser@7.4.0(eslint@8.57.0)(typescript@5.4.3):
+    resolution: {integrity: sha512-ZvKHxHLusweEUVwrGRXXUVzFgnWhigo4JurEj0dGF1tbcGh6buL+ejDdjxOQxv6ytcY1uhun1p2sm8iWStlgLQ==}
     engines: {node: ^18.18.0 || >=20.0.0}
     peerDependencies:
       eslint: ^8.56.0
@@ -2431,10 +2435,10 @@ packages:
       typescript:
         optional: true
     dependencies:
-      '@typescript-eslint/scope-manager': 7.3.1
-      '@typescript-eslint/types': 7.3.1
-      '@typescript-eslint/typescript-estree': 7.3.1(typescript@5.4.3)
-      '@typescript-eslint/visitor-keys': 7.3.1
+      '@typescript-eslint/scope-manager': 7.4.0
+      '@typescript-eslint/types': 7.4.0
+      '@typescript-eslint/typescript-estree': 7.4.0(typescript@5.4.3)
+      '@typescript-eslint/visitor-keys': 7.4.0
       debug: 4.3.4
       eslint: 8.57.0
       typescript: 5.4.3
@@ -2442,16 +2446,16 @@ packages:
       - supports-color
     dev: true
 
-  /@typescript-eslint/scope-manager@7.3.1:
-    resolution: {integrity: sha512-fVS6fPxldsKY2nFvyT7IP78UO1/I2huG+AYu5AMjCT9wtl6JFiDnsv4uad4jQ0GTFzcUV5HShVeN96/17bTBag==}
+  /@typescript-eslint/scope-manager@7.4.0:
+    resolution: {integrity: sha512-68VqENG5HK27ypafqLVs8qO+RkNc7TezCduYrx8YJpXq2QGZ30vmNZGJJJC48+MVn4G2dCV8m5ZTVnzRexTVtw==}
     engines: {node: ^18.18.0 || >=20.0.0}
     dependencies:
-      '@typescript-eslint/types': 7.3.1
-      '@typescript-eslint/visitor-keys': 7.3.1
+      '@typescript-eslint/types': 7.4.0
+      '@typescript-eslint/visitor-keys': 7.4.0
     dev: true
 
-  /@typescript-eslint/type-utils@7.3.1(eslint@8.57.0)(typescript@5.4.3):
-    resolution: {integrity: sha512-iFhaysxFsMDQlzJn+vr3OrxN8NmdQkHks4WaqD4QBnt5hsq234wcYdyQ9uquzJJIDAj5W4wQne3yEsYA6OmXGw==}
+  /@typescript-eslint/type-utils@7.4.0(eslint@8.57.0)(typescript@5.4.3):
+    resolution: {integrity: sha512-247ETeHgr9WTRMqHbbQdzwzhuyaJ8dPTuyuUEMANqzMRB1rj/9qFIuIXK7l0FX9i9FXbHeBQl/4uz6mYuCE7Aw==}
     engines: {node: ^18.18.0 || >=20.0.0}
     peerDependencies:
       eslint: ^8.56.0
@@ -2460,8 +2464,8 @@ packages:
       typescript:
         optional: true
     dependencies:
-      '@typescript-eslint/typescript-estree': 7.3.1(typescript@5.4.3)
-      '@typescript-eslint/utils': 7.3.1(eslint@8.57.0)(typescript@5.4.3)
+      '@typescript-eslint/typescript-estree': 7.4.0(typescript@5.4.3)
+      '@typescript-eslint/utils': 7.4.0(eslint@8.57.0)(typescript@5.4.3)
       debug: 4.3.4
       eslint: 8.57.0
       ts-api-utils: 1.3.0(typescript@5.4.3)
@@ -2470,13 +2474,13 @@ packages:
       - supports-color
     dev: true
 
-  /@typescript-eslint/types@7.3.1:
-    resolution: {integrity: sha512-2tUf3uWggBDl4S4183nivWQ2HqceOZh1U4hhu4p1tPiIJoRRXrab7Y+Y0p+dozYwZVvLPRI6r5wKe9kToF9FIw==}
+  /@typescript-eslint/types@7.4.0:
+    resolution: {integrity: sha512-mjQopsbffzJskos5B4HmbsadSJQWaRK0UxqQ7GuNA9Ga4bEKeiO6b2DnB6cM6bpc8lemaPseh0H9B/wyg+J7rw==}
     engines: {node: ^18.18.0 || >=20.0.0}
     dev: true
 
-  /@typescript-eslint/typescript-estree@7.3.1(typescript@5.4.3):
-    resolution: {integrity: sha512-tLpuqM46LVkduWP7JO7yVoWshpJuJzxDOPYIVWUUZbW+4dBpgGeUdl/fQkhuV0A8eGnphYw3pp8d2EnvPOfxmQ==}
+  /@typescript-eslint/typescript-estree@7.4.0(typescript@5.4.3):
+    resolution: {integrity: sha512-A99j5AYoME/UBQ1ucEbbMEmGkN7SE0BvZFreSnTd1luq7yulcHdyGamZKizU7canpGDWGJ+Q6ZA9SyQobipePg==}
     engines: {node: ^18.18.0 || >=20.0.0}
     peerDependencies:
       typescript: '*'
@@ -2484,8 +2488,8 @@ packages:
       typescript:
         optional: true
     dependencies:
-      '@typescript-eslint/types': 7.3.1
-      '@typescript-eslint/visitor-keys': 7.3.1
+      '@typescript-eslint/types': 7.4.0
+      '@typescript-eslint/visitor-keys': 7.4.0
       debug: 4.3.4
       globby: 11.1.0
       is-glob: 4.0.3
@@ -2497,8 +2501,8 @@ packages:
       - supports-color
     dev: true
 
-  /@typescript-eslint/utils@7.3.1(eslint@8.57.0)(typescript@5.4.3):
-    resolution: {integrity: sha512-jIERm/6bYQ9HkynYlNZvXpzmXWZGhMbrOvq3jJzOSOlKXsVjrrolzWBjDW6/TvT5Q3WqaN4EkmcfdQwi9tDjBQ==}
+  /@typescript-eslint/utils@7.4.0(eslint@8.57.0)(typescript@5.4.3):
+    resolution: {integrity: sha512-NQt9QLM4Tt8qrlBVY9lkMYzfYtNz8/6qwZg8pI3cMGlPnj6mOpRxxAm7BMJN9K0AiY+1BwJ5lVC650YJqYOuNg==}
     engines: {node: ^18.18.0 || >=20.0.0}
     peerDependencies:
       eslint: ^8.56.0
@@ -2506,9 +2510,9 @@ packages:
       '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0)
       '@types/json-schema': 7.0.15
       '@types/semver': 7.5.8
-      '@typescript-eslint/scope-manager': 7.3.1
-      '@typescript-eslint/types': 7.3.1
-      '@typescript-eslint/typescript-estree': 7.3.1(typescript@5.4.3)
+      '@typescript-eslint/scope-manager': 7.4.0
+      '@typescript-eslint/types': 7.4.0
+      '@typescript-eslint/typescript-estree': 7.4.0(typescript@5.4.3)
       eslint: 8.57.0
       semver: 7.6.0
     transitivePeerDependencies:
@@ -2516,11 +2520,11 @@ packages:
       - typescript
     dev: true
 
-  /@typescript-eslint/visitor-keys@7.3.1:
-    resolution: {integrity: sha512-9RMXwQF8knsZvfv9tdi+4D/j7dMG28X/wMJ8Jj6eOHyHWwDW4ngQJcqEczSsqIKKjFiLFr40Mnr7a5ulDD3vmw==}
+  /@typescript-eslint/visitor-keys@7.4.0:
+    resolution: {integrity: sha512-0zkC7YM0iX5Y41homUUeW1CHtZR01K3ybjM1l6QczoMuay0XKtrb93kv95AxUGwdjGr64nNqnOCwmEl616N8CA==}
     engines: {node: ^18.18.0 || >=20.0.0}
     dependencies:
-      '@typescript-eslint/types': 7.3.1
+      '@typescript-eslint/types': 7.4.0
       eslint-visitor-keys: 3.4.3
     dev: true
 
@@ -2569,7 +2573,7 @@ packages:
       nanoid: 3.3.7
     dev: false
 
-  /@vitejs/plugin-vue-jsx@3.1.0(vite@5.2.3)(vue@3.4.21):
+  /@vitejs/plugin-vue-jsx@3.1.0(vite@5.2.6)(vue@3.4.21):
     resolution: {integrity: sha512-w9M6F3LSEU5kszVb9An2/MmXNxocAnUb3WhRr8bHlimhDrXNt6n6D2nJQR3UXpGlZHh/EsgouOHCsM8V3Ln+WA==}
     engines: {node: ^14.18.0 || >=16.0.0}
     peerDependencies:
@@ -2579,20 +2583,20 @@ packages:
       '@babel/core': 7.24.3
       '@babel/plugin-transform-typescript': 7.24.1(@babel/core@7.24.3)
       '@vue/babel-plugin-jsx': 1.2.2(@babel/core@7.24.3)
-      vite: 5.2.3(@types/node@20.11.30)(sass@1.72.0)
+      vite: 5.2.6(@types/node@20.11.30)(sass@1.72.0)
       vue: 3.4.21(typescript@5.4.3)
     transitivePeerDependencies:
       - supports-color
     dev: true
 
-  /@vitejs/plugin-vue@5.0.4(vite@5.2.3)(vue@3.4.21):
+  /@vitejs/plugin-vue@5.0.4(vite@5.2.6)(vue@3.4.21):
     resolution: {integrity: sha512-WS3hevEszI6CEVEx28F8RjTX97k3KsrcY6kvTg7+Whm5y3oYvcqzVeGCU3hxSAn4uY2CLCkeokkGKpoctccilQ==}
     engines: {node: ^18.0.0 || >=20.0.0}
     peerDependencies:
       vite: ^5.0.0
       vue: ^3.2.25
     dependencies:
-      vite: 5.2.3(@types/node@20.11.30)(sass@1.72.0)
+      vite: 5.2.6(@types/node@20.11.30)(sass@1.72.0)
       vue: 3.4.21(typescript@5.4.3)
     dev: true
 
@@ -2615,18 +2619,18 @@ packages:
       path-browserify: 1.0.1
     dev: true
 
-  /@vue-flow/background@1.3.0(@vue-flow/core@1.33.4)(vue@3.4.21):
+  /@vue-flow/background@1.3.0(@vue-flow/core@1.33.5)(vue@3.4.21):
     resolution: {integrity: sha512-fu/8s9wzSOQIitnSTI10XT3bzTtagh4h8EF2SWwtlDklOZjAaKy75lqv4htHa3wigy/r4LGCOGwLw3Pk88/AxA==}
     peerDependencies:
       '@vue-flow/core': ^1.23.0
       vue: ^3.3.0
     dependencies:
-      '@vue-flow/core': 1.33.4(vue@3.4.21)
+      '@vue-flow/core': 1.33.5(vue@3.4.21)
       vue: 3.4.21(typescript@5.4.3)
     dev: false
 
-  /@vue-flow/core@1.33.4(vue@3.4.21):
-    resolution: {integrity: sha512-ryoamKfQ5pgtdv//Gjpyc4nsawMOwfI2jVzOPvZ92VQs78L4lidiWD7UybqeEkrGw6UPue1CGlzoy/4KlOWcSg==}
+  /@vue-flow/core@1.33.5(vue@3.4.21):
+    resolution: {integrity: sha512-Obo+KHmcww/NYGARMqVH1dhd42QeFzV+TNwytrjVgYCoMVCNjs/blCh437TYTsNy4vgX1NKpNwTbQrS+keurgA==}
     peerDependencies:
       vue: ^3.3.0
     dependencies:
@@ -3486,7 +3490,7 @@ packages:
     hasBin: true
     dependencies:
       caniuse-lite: 1.0.30001600
-      electron-to-chromium: 1.4.715
+      electron-to-chromium: 1.4.717
       node-releases: 2.0.14
       update-browserslist-db: 1.0.13(browserslist@4.23.0)
 
@@ -3954,8 +3958,8 @@ packages:
       postcss: 8.4.38
     dev: true
 
-  /css-declaration-sorter@7.1.1(postcss@8.4.38):
-    resolution: {integrity: sha512-dZ3bVTEEc1vxr3Bek9vGwfB5Z6ESPULhcRvO472mfjVnj8jRcTnKO8/JTczlvxM10Myb+wBM++1MtdO76eWcaQ==}
+  /css-declaration-sorter@7.2.0(postcss@8.4.38):
+    resolution: {integrity: sha512-h70rUM+3PNFuaBDTLe8wF/cdWu+dOZmb7pJt8Z2sedYbAcQVQV/tEchueg3GWxwqS0cxtbxmaHEdkNACqcvsow==}
     engines: {node: ^14 || ^16 || >=18}
     peerDependencies:
       postcss: ^8.0.9
@@ -4061,14 +4065,14 @@ packages:
       postcss-unique-selectors: 5.1.1(postcss@8.4.38)
     dev: true
 
-  /cssnano-preset-default@6.1.1(postcss@8.4.38):
-    resolution: {integrity: sha512-XW/dYN2p8Jdkp1lovFd0UVRh6RB0iMyXJbAE9Qm+taR3p2LGu492AW34lVaukUrXoK9IxK5aK3CUmFpUorU4oA==}
+  /cssnano-preset-default@6.1.2(postcss@8.4.38):
+    resolution: {integrity: sha512-1C0C+eNaeN8OcHQa193aRgYexyJtU8XwbdieEjClw+J9d94E41LwT6ivKH0WT+fYwYWB0Zp3I3IZ7tI/BbUbrg==}
     engines: {node: ^14 || ^16 || >=18.0}
     peerDependencies:
       postcss: ^8.4.31
     dependencies:
       browserslist: 4.23.0
-      css-declaration-sorter: 7.1.1(postcss@8.4.38)
+      css-declaration-sorter: 7.2.0(postcss@8.4.38)
       cssnano-utils: 4.0.2(postcss@8.4.38)
       postcss: 8.4.38
       postcss-calc: 9.0.1(postcss@8.4.38)
@@ -4143,13 +4147,13 @@ packages:
       yaml: 1.10.2
     dev: true
 
-  /cssnano@6.1.1(postcss@8.4.38):
-    resolution: {integrity: sha512-paTFZuiVohpaXJuau8l7buFt9+FTmfjwEO70EKitzYOQw3frib/It4sb6cQ+gJyDEyY+myDSni6IbBvKZ0N8Lw==}
+  /cssnano@6.1.2(postcss@8.4.38):
+    resolution: {integrity: sha512-rYk5UeX7VAM/u0lNqewCdasdtPK81CgX8wJFLEIXHbV2oldWRgJAsZrdhRXkV1NJzA2g850KiFm9mMU2HxNxMA==}
     engines: {node: ^14 || ^16 || >=18.0}
     peerDependencies:
       postcss: ^8.4.31
     dependencies:
-      cssnano-preset-default: 6.1.1(postcss@8.4.38)
+      cssnano-preset-default: 6.1.2(postcss@8.4.38)
       lilconfig: 3.1.1
       postcss: 8.4.38
     dev: true
@@ -4537,8 +4541,8 @@ packages:
       - typescript
     dev: false
 
-  /electron-to-chromium@1.4.715:
-    resolution: {integrity: sha512-XzWNH4ZSa9BwVUQSDorPWAUQ5WGuYz7zJUNpNif40zFCiCl20t8zgylmreNmn26h5kiyw2lg7RfTmeMBsDklqg==}
+  /electron-to-chromium@1.4.717:
+    resolution: {integrity: sha512-6Fmg8QkkumNOwuZ/5mIbMU9WI3H2fmn5ajcVya64I5Yr5CcNmO7vcLt0Y7c96DCiMO5/9G+4sI2r6eEvdg1F7A==}
 
   /element-plus@2.1.4(@types/lodash-es@4.17.12)(vue@3.4.21):
     resolution: {integrity: sha512-pcwgDbKUrzyWbixYB/zIbLPLBQ/NPGPJnGXJ+jYozUSthPW4SuriaUGJKgbAE6PDBAtw3IodiT2E2GbiaZLxww==}
@@ -4808,14 +4812,15 @@ packages:
       synckit: 0.8.8
     dev: true
 
-  /eslint-plugin-vue@9.23.0(eslint@8.57.0):
-    resolution: {integrity: sha512-Bqd/b7hGYGrlV+wP/g77tjyFmp81lh5TMw0be9093X02SyelxRRfCI6/IsGq/J7Um0YwB9s0Ry0wlFyjPdmtUw==}
+  /eslint-plugin-vue@9.24.0(eslint@8.57.0):
+    resolution: {integrity: sha512-9SkJMvF8NGMT9aQCwFc5rj8Wo1XWSMSHk36i7ZwdI614BU7sIOR28ZjuFPKp8YGymZN12BSEbiSwa7qikp+PBw==}
     engines: {node: ^14.17.0 || >=16.0.0}
     peerDependencies:
       eslint: ^6.2.0 || ^7.0.0 || ^8.0.0
     dependencies:
       '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0)
       eslint: 8.57.0
+      globals: 13.24.0
       natural-compare: 1.4.0
       nth-check: 2.1.1
       postcss-selector-parser: 6.0.16
@@ -6454,6 +6459,10 @@ packages:
     resolution: {integrity: sha512-Ne7wqW7/9Cz54PDt4I3tcV+hAyat8ypyOGzYRJQfdxnnjeWsTxt1cy8pjvvKeI5kfXuyvULyeeAvwvvtAX3ayQ==}
     dev: true
 
+  /known-css-properties@0.30.0:
+    resolution: {integrity: sha512-VSWXYUnsPu9+WYKkfmJyLKtIvaRJi1kXUqVmBACORXZQxT5oZDsoZ2vQP+bQFDnWtpI/4eq3MLoRMjI2fnLzTQ==}
+    dev: true
+
   /leven@2.1.0:
     resolution: {integrity: sha512-nvVPLpIHUxCUoRLrFqTgSxXJ614d8AgQoWl7zPe/2VadE8+1dpU3LBhowRuBAcuwruWtOdD8oYC9jDNJjXDPyA==}
     engines: {node: '>=0.10.0'}
@@ -8731,7 +8740,7 @@ packages:
       postcss-selector-parser: 6.0.16
     dev: true
 
-  /stylelint-config-html@1.1.0(postcss-html@1.6.0)(stylelint@16.2.1):
+  /stylelint-config-html@1.1.0(postcss-html@1.6.0)(stylelint@16.3.1):
     resolution: {integrity: sha512-IZv4IVESjKLumUGi+HWeb7skgO6/g4VMuAYrJdlqQFndgbj6WJAXPhaysvBiXefX79upBdQVumgYcdd17gCpjQ==}
     engines: {node: ^12 || >=14}
     peerDependencies:
@@ -8739,19 +8748,19 @@ packages:
       stylelint: '>=14.0.0'
     dependencies:
       postcss-html: 1.6.0
-      stylelint: 16.2.1(typescript@5.4.3)
+      stylelint: 16.3.1(typescript@5.4.3)
     dev: true
 
-  /stylelint-config-recess-order@5.0.0(stylelint@16.2.1):
+  /stylelint-config-recess-order@5.0.0(stylelint@16.3.1):
     resolution: {integrity: sha512-D+/Got844O96No2mj/H2NhLjj555iKAy/Mea+JCerfKB9TBKQW3/IudSVkTCxE4QiRDLldfH15x6FH1D1Anjhw==}
     peerDependencies:
       stylelint: '>=16'
     dependencies:
-      stylelint: 16.2.1(typescript@5.4.3)
-      stylelint-order: 6.0.4(stylelint@16.2.1)
+      stylelint: 16.3.1(typescript@5.4.3)
+      stylelint-order: 6.0.4(stylelint@16.3.1)
     dev: true
 
-  /stylelint-config-recommended-scss@14.0.0(postcss@8.4.38)(stylelint@16.2.1):
+  /stylelint-config-recommended-scss@14.0.0(postcss@8.4.38)(stylelint@16.3.1):
     resolution: {integrity: sha512-HDvpoOAQ1RpF+sPbDOT2Q2/YrBDEJDnUymmVmZ7mMCeNiFSdhRdyGEimBkz06wsN+HaFwUh249gDR+I9JR7Onw==}
     engines: {node: '>=18.12.0'}
     peerDependencies:
@@ -8763,12 +8772,12 @@ packages:
     dependencies:
       postcss: 8.4.38
       postcss-scss: 4.0.9(postcss@8.4.38)
-      stylelint: 16.2.1(typescript@5.4.3)
-      stylelint-config-recommended: 14.0.0(stylelint@16.2.1)
-      stylelint-scss: 6.2.1(stylelint@16.2.1)
+      stylelint: 16.3.1(typescript@5.4.3)
+      stylelint-config-recommended: 14.0.0(stylelint@16.3.1)
+      stylelint-scss: 6.2.1(stylelint@16.3.1)
     dev: true
 
-  /stylelint-config-recommended-vue@1.5.0(postcss-html@1.6.0)(stylelint@16.2.1):
+  /stylelint-config-recommended-vue@1.5.0(postcss-html@1.6.0)(stylelint@16.3.1):
     resolution: {integrity: sha512-65TAK/clUqkNtkZLcuytoxU0URQYlml+30Nhop7sRkCZ/mtWdXt7T+spPSB3KMKlb+82aEVJ4OrcstyDBdbosg==}
     engines: {node: ^12 || >=14}
     peerDependencies:
@@ -8777,21 +8786,21 @@ packages:
     dependencies:
       postcss-html: 1.6.0
       semver: 7.6.0
-      stylelint: 16.2.1(typescript@5.4.3)
-      stylelint-config-html: 1.1.0(postcss-html@1.6.0)(stylelint@16.2.1)
-      stylelint-config-recommended: 14.0.0(stylelint@16.2.1)
+      stylelint: 16.3.1(typescript@5.4.3)
+      stylelint-config-html: 1.1.0(postcss-html@1.6.0)(stylelint@16.3.1)
+      stylelint-config-recommended: 14.0.0(stylelint@16.3.1)
     dev: true
 
-  /stylelint-config-recommended@14.0.0(stylelint@16.2.1):
+  /stylelint-config-recommended@14.0.0(stylelint@16.3.1):
     resolution: {integrity: sha512-jSkx290CglS8StmrLp2TxAppIajzIBZKYm3IxT89Kg6fGlxbPiTiyH9PS5YUuVAFwaJLl1ikiXX0QWjI0jmgZQ==}
     engines: {node: '>=18.12.0'}
     peerDependencies:
       stylelint: ^16.0.0
     dependencies:
-      stylelint: 16.2.1(typescript@5.4.3)
+      stylelint: 16.3.1(typescript@5.4.3)
     dev: true
 
-  /stylelint-config-standard-scss@13.0.0(postcss@8.4.38)(stylelint@16.2.1):
+  /stylelint-config-standard-scss@13.0.0(postcss@8.4.38)(stylelint@16.3.1):
     resolution: {integrity: sha512-WaLvkP689qSYUpJQPCo30TFJSSc3VzvvoWnrgp+7PpVby5o8fRUY1cZcP0sePZfjrFl9T8caGhcKg0GO34VDiQ==}
     engines: {node: '>=18.12.0'}
     peerDependencies:
@@ -8802,32 +8811,32 @@ packages:
         optional: true
     dependencies:
       postcss: 8.4.38
-      stylelint: 16.2.1(typescript@5.4.3)
-      stylelint-config-recommended-scss: 14.0.0(postcss@8.4.38)(stylelint@16.2.1)
-      stylelint-config-standard: 36.0.0(stylelint@16.2.1)
+      stylelint: 16.3.1(typescript@5.4.3)
+      stylelint-config-recommended-scss: 14.0.0(postcss@8.4.38)(stylelint@16.3.1)
+      stylelint-config-standard: 36.0.0(stylelint@16.3.1)
     dev: true
 
-  /stylelint-config-standard@36.0.0(stylelint@16.2.1):
+  /stylelint-config-standard@36.0.0(stylelint@16.3.1):
     resolution: {integrity: sha512-3Kjyq4d62bYFp/Aq8PMKDwlgUyPU4nacXsjDLWJdNPRUgpuxALu1KnlAHIj36cdtxViVhXexZij65yM0uNIHug==}
     engines: {node: '>=18.12.0'}
     peerDependencies:
       stylelint: ^16.1.0
     dependencies:
-      stylelint: 16.2.1(typescript@5.4.3)
-      stylelint-config-recommended: 14.0.0(stylelint@16.2.1)
+      stylelint: 16.3.1(typescript@5.4.3)
+      stylelint-config-recommended: 14.0.0(stylelint@16.3.1)
     dev: true
 
-  /stylelint-order@6.0.4(stylelint@16.2.1):
+  /stylelint-order@6.0.4(stylelint@16.3.1):
     resolution: {integrity: sha512-0UuKo4+s1hgQ/uAxlYU4h0o0HS4NiQDud0NAUNI0aa8FJdmYHA5ZZTFHiV5FpmE3071e9pZx5j0QpVJW5zOCUA==}
     peerDependencies:
       stylelint: ^14.0.0 || ^15.0.0 || ^16.0.1
     dependencies:
       postcss: 8.4.38
       postcss-sorting: 8.0.2(postcss@8.4.38)
-      stylelint: 16.2.1(typescript@5.4.3)
+      stylelint: 16.3.1(typescript@5.4.3)
     dev: true
 
-  /stylelint-prettier@5.0.0(prettier@3.2.5)(stylelint@16.2.1):
+  /stylelint-prettier@5.0.0(prettier@3.2.5)(stylelint@16.3.1):
     resolution: {integrity: sha512-RHfSlRJIsaVg5Br94gZVdWlz/rBTyQzZflNE6dXvSxt/GthWMY3gEHsWZEBaVGg7GM+XrtVSp4RznFlB7i0oyw==}
     engines: {node: '>=18.12.0'}
     peerDependencies:
@@ -8836,10 +8845,10 @@ packages:
     dependencies:
       prettier: 3.2.5
       prettier-linter-helpers: 1.0.0
-      stylelint: 16.2.1(typescript@5.4.3)
+      stylelint: 16.3.1(typescript@5.4.3)
     dev: true
 
-  /stylelint-scss@6.2.1(stylelint@16.2.1):
+  /stylelint-scss@6.2.1(stylelint@16.3.1):
     resolution: {integrity: sha512-ZoGLbVb1keZYRVGQlhB8G6sZOoNqw61whzzzGFWp05N12ErqLFfBv3JPrXiMLZaW98sBS7K/vUQhRnvUj4vwdw==}
     engines: {node: '>=18.12.0'}
     peerDependencies:
@@ -8850,11 +8859,11 @@ packages:
       postcss-resolve-nested-selector: 0.1.1
       postcss-selector-parser: 6.0.16
       postcss-value-parser: 4.2.0
-      stylelint: 16.2.1(typescript@5.4.3)
+      stylelint: 16.3.1(typescript@5.4.3)
     dev: true
 
-  /stylelint@16.2.1(typescript@5.4.3):
-    resolution: {integrity: sha512-SfIMGFK+4n7XVAyv50CpVfcGYWG4v41y6xG7PqOgQSY8M/PgdK0SQbjWFblxjJZlN9jNq879mB4BCZHJRIJ1hA==}
+  /stylelint@16.3.1(typescript@5.4.3):
+    resolution: {integrity: sha512-/JOwQnBvxEKOT2RtNgGpBVXnCSMBgKOL2k7w0K52htwCyJls4+cHvc4YZgXlVoAZS9QJd2DgYAiRnja96pTgxw==}
     engines: {node: '>=18.12.0'}
     hasBin: true
     dependencies:
@@ -8862,6 +8871,7 @@ packages:
       '@csstools/css-tokenizer': 2.2.4
       '@csstools/media-query-list-parser': 2.1.9(@csstools/css-parser-algorithms@2.6.1)(@csstools/css-tokenizer@2.2.4)
       '@csstools/selector-specificity': 3.0.2(postcss-selector-parser@6.0.16)
+      '@dual-bundle/import-meta-resolve': 4.0.0
       balanced-match: 2.0.0
       colord: 2.9.3
       cosmiconfig: 9.0.0(typescript@5.4.3)
@@ -8878,7 +8888,7 @@ packages:
       ignore: 5.3.1
       imurmurhash: 0.1.4
       is-plain-object: 5.0.0
-      known-css-properties: 0.29.0
+      known-css-properties: 0.30.0
       mathml-tag-names: 2.1.3
       meow: 13.2.0
       micromatch: 4.0.5
@@ -8894,7 +8904,7 @@ packages:
       strip-ansi: 7.1.0
       supports-hyperlinks: 3.0.0
       svg-tags: 1.0.0
-      table: 6.8.1
+      table: 6.8.2
       write-file-atomic: 5.0.1
     transitivePeerDependencies:
       - supports-color
@@ -9003,8 +9013,8 @@ packages:
       tslib: 2.6.2
     dev: true
 
-  /table@6.8.1:
-    resolution: {integrity: sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA==}
+  /table@6.8.2:
+    resolution: {integrity: sha512-w2sfv80nrAh2VCbqR5AK27wswXhqcck2AhfnNW76beQXskGZ1V12GwS//yYVa3d3fcvAip2OUnbDAjW2k3v9fA==}
     engines: {node: '>=10.0.0'}
     dependencies:
       ajv: 8.12.0
@@ -9398,7 +9408,7 @@ packages:
       - rollup
     dev: true
 
-  /vite-plugin-compression@0.5.1(vite@5.2.3):
+  /vite-plugin-compression@0.5.1(vite@5.2.6):
     resolution: {integrity: sha512-5QJKBDc+gNYVqL/skgFAP81Yuzo9R+EAf19d+EtsMF/i8kFUpNi3J/H01QD3Oo8zBQn+NzoCIFkpPLynoOzaJg==}
     peerDependencies:
       vite: '>=2.0.0'
@@ -9406,7 +9416,7 @@ packages:
       chalk: 4.1.2
       debug: 4.3.4
       fs-extra: 10.1.0
-      vite: 5.2.3(@types/node@20.11.30)(sass@1.72.0)
+      vite: 5.2.6(@types/node@20.11.30)(sass@1.72.0)
     transitivePeerDependencies:
       - supports-color
     dev: true
@@ -9438,8 +9448,8 @@ packages:
       vue: 3.4.21(typescript@5.4.3)
     dev: true
 
-  /vite@5.2.3(@types/node@20.11.30)(sass@1.72.0):
-    resolution: {integrity: sha512-+i1oagbvkVIhEy9TnEV+fgXsng13nZM90JQbrcPrf6DvW2mXARlz+DK7DLiDP+qeKoD1FCVx/1SpFL1CLq9Mhw==}
+  /vite@5.2.6(@types/node@20.11.30)(sass@1.72.0):
+    resolution: {integrity: sha512-FPtnxFlSIKYjZ2eosBQamz4CbyrTizbZ3hnGJlh/wMtCrlp1Hah6AzBLjGI5I2urTfNnpovpHdrL6YRuBOPnCA==}
     engines: {node: ^18.0.0 || >=20.0.0}
     hasBin: true
     peerDependencies:

+ 1 - 1
src/components/ReAnimateSelector/index.ts

@@ -1,5 +1,5 @@
-import reAnimateSelector from "./src/index.vue";
 import { withInstall } from "@pureadmin/utils";
+import reAnimateSelector from "./src/index.vue";
 
 /** [animate.css](https://animate.style/) 选择器组件 */
 export const ReAnimateSelector = withInstall(reAnimateSelector);

+ 1 - 1
src/components/ReBarcode/index.ts

@@ -1,5 +1,5 @@
-import reBarcode from "./src/index.vue";
 import { withInstall } from "@pureadmin/utils";
+import reBarcode from "./src/index.vue";
 
 /** 条形码组件 */
 export const ReBarcode = withInstall(reBarcode);

+ 4 - 4
src/components/ReCountTo/src/normal/index.tsx

@@ -1,10 +1,10 @@
 import {
-  defineComponent,
-  reactive,
-  computed,
   watch,
+  unref,
+  computed,
+  reactive,
   onMounted,
-  unref
+  defineComponent
 } from "vue";
 import { countToProps } from "./props";
 import { isNumber } from "@pureadmin/utils";

+ 1 - 0
src/components/ReCountTo/src/normal/props.ts

@@ -1,5 +1,6 @@
 import type { PropType } from "vue";
 import propTypes from "@/utils/propTypes";
+
 export const countToProps = {
   startVal: propTypes.number.def(0),
   endVal: propTypes.number.def(2020),

+ 1 - 1
src/components/ReCountTo/src/rebound/index.tsx

@@ -1,9 +1,9 @@
 import "./rebound.css";
 import {
-  defineComponent,
   ref,
   unref,
   onBeforeMount,
+  defineComponent,
   onBeforeUnmount
 } from "vue";
 import { reboundProps } from "./props";

+ 1 - 0
src/components/ReCountTo/src/rebound/props.ts

@@ -1,5 +1,6 @@
 import type { PropType } from "vue";
 import propTypes from "@/utils/propTypes";
+
 export const reboundProps = {
   delay: propTypes.number.def(1),
   blur: propTypes.number.def(2),

+ 1 - 1
src/components/ReCropper/src/index.tsx

@@ -6,10 +6,10 @@ import { useEventListener } from "@vueuse/core";
 import { longpress } from "@/directives/longpress";
 import { useTippy, directive as tippy } from "vue-tippy";
 import {
+  type PropType,
   ref,
   unref,
   computed,
-  type PropType,
   onMounted,
   onUnmounted,
   defineComponent

+ 2 - 2
src/components/ReDialog/index.ts

@@ -51,8 +51,8 @@ const closeAllDialog = () => {
 
 /** 千万别忘了在下面这三处引入并注册下,放心注册,不使用`addDialog`调用就不会被挂载
  * https://github.com/pure-admin/vue-pure-admin/blob/main/src/App.vue#L4
- * https://github.com/pure-admin/vue-pure-admin/blob/main/src/App.vue#L13
- * https://github.com/pure-admin/vue-pure-admin/blob/main/src/App.vue#L20
+ * https://github.com/pure-admin/vue-pure-admin/blob/main/src/App.vue#L12
+ * https://github.com/pure-admin/vue-pure-admin/blob/main/src/App.vue#L22
  */
 const ReDialog = withInstall(reDialog);
 

+ 3 - 3
src/components/ReDialog/index.vue

@@ -1,10 +1,10 @@
 <script setup lang="ts">
 import {
-  closeDialog,
-  dialogStore,
   type EventType,
   type ButtonProps,
-  type DialogOptions
+  type DialogOptions,
+  closeDialog,
+  dialogStore
 } from "./index";
 import { ref, computed } from "vue";
 import { isFunction } from "@pureadmin/utils";

+ 1 - 1
src/components/ReFlicker/index.ts

@@ -1,5 +1,5 @@
 import "./index.css";
-import { h, defineComponent, type Component } from "vue";
+import { type Component, h, defineComponent } from "vue";
 
 export interface attrsType {
   width?: string;

+ 2 - 2
src/components/ReFlop/src/filpper.tsx

@@ -1,6 +1,6 @@
-import { defineComponent, ref } from "vue";
-import propTypes from "@/utils/propTypes";
 import "./filpper.css";
+import propTypes from "@/utils/propTypes";
+import { defineComponent, ref } from "vue";
 
 const props = {
   // front paper text

+ 1 - 1
src/components/ReFlop/src/index.vue

@@ -1,6 +1,6 @@
 <script setup lang="ts">
-import { ref, unref, nextTick, onUnmounted } from "vue";
 import flippers from "./filpper";
+import { ref, unref, nextTick, onUnmounted } from "vue";
 
 const timer = ref(null);
 const flipObjs = ref([]);

+ 17 - 20
src/components/ReFlowChart/src/Control.vue

@@ -105,27 +105,24 @@ onMounted(() => {
         @mouseenter.prevent="onEnter(key)"
         @mouseleave.prevent="focusIndex = -1"
       >
-        <el-tooltip
-          :content="item.text"
-          :visible="focusIndex === key"
-          placement="right"
+        <button
+          :ref="'controlButton' + key"
+          v-tippy="{
+            content: item.text
+          }"
+          :disabled="item.disabled"
+          :style="{
+            cursor: item.disabled === false ? 'pointer' : 'not-allowed',
+            color: item.disabled === false ? '' : '#00000040',
+            background: 'transparent'
+          }"
+          @click="onControl(item, key)"
         >
-          <button
-            :ref="'controlButton' + key"
-            :disabled="item.disabled"
-            :style="{
-              cursor: item.disabled === false ? 'pointer' : 'not-allowed',
-              color: item.disabled === false ? '' : '#00000040',
-              background: 'transparent'
-            }"
-            @click="onControl(item, key)"
-          >
-            <span
-              :class="'iconfont ' + item.icon"
-              :style="{ fontSize: `${item.size}px` }"
-            />
-          </button>
-        </el-tooltip>
+          <span
+            :class="'iconfont ' + item.icon"
+            :style="{ fontSize: `${item.size}px` }"
+          />
+        </button>
       </li>
     </ul>
   </div>

+ 1 - 1
src/components/ReQrcode/src/index.tsx

@@ -1,10 +1,10 @@
 import {
+  type PropType,
   ref,
   unref,
   watch,
   nextTick,
   computed,
-  type PropType,
   defineComponent
 } from "vue";
 import "./index.scss";

+ 8 - 2
src/components/ReSeamlessScroll/src/index.vue

@@ -1,6 +1,12 @@
 <script setup lang="ts">
-import { computed, ref, unref, nextTick } from "vue";
-import type { CSSProperties, PropType } from "vue";
+import {
+  type PropType,
+  type CSSProperties,
+  ref,
+  unref,
+  nextTick,
+  computed
+} from "vue";
 import {
   tryOnMounted,
   tryOnUnmounted,

+ 4 - 4
src/components/ReSelector/src/index.tsx

@@ -1,13 +1,13 @@
+import "./index.css";
 import {
-  defineComponent,
+  unref,
   computed,
   nextTick,
   onBeforeMount,
-  getCurrentInstance,
-  unref
+  defineComponent,
+  getCurrentInstance
 } from "vue";
 import { addClass, removeClass, toggleClass } from "@pureadmin/utils";
-import "./index.css";
 
 const stayClass = "stay"; //鼠标点击
 const activeClass = "hs-on"; //鼠标移动上去

+ 2 - 2
src/components/ReSplitPane/index.tsx

@@ -1,6 +1,6 @@
-import { defineComponent, ref, unref, computed, type PropType } from "vue";
-import resizer from "./resizer";
 import "./index.css";
+import resizer from "./resizer";
+import { type PropType, defineComponent, ref, unref, computed } from "vue";
 
 export interface ContextProps {
   minPercent: number;

+ 1 - 1
src/components/ReSplitPane/resizer.tsx

@@ -1,5 +1,5 @@
-import { computed, unref, defineComponent } from "vue";
 import "./resizer.css";
+import { computed, unref, defineComponent } from "vue";
 
 export default defineComponent({
   name: "Resizer",

+ 1 - 1
src/components/ReText/src/index.vue

@@ -1,6 +1,6 @@
 <script lang="ts" setup>
 import { h, onMounted, ref, useSlots } from "vue";
-import { useTippy, type TippyOptions } from "vue-tippy";
+import { type TippyOptions, useTippy } from "vue-tippy";
 
 const props = defineProps({
   // 行数

+ 2 - 3
src/components/ReTreeLine/index.ts

@@ -1,8 +1,7 @@
 // 参考https://www.npmjs.com/package/element-tree-line (主要是替换需要通过函数传参的方式去注册组件,并添加更好的类型支持,并移除this.$scopedSlots,在3.x中,将所有this.$scopedSlots替换为this.$slots)
-import { isFunction } from "@pureadmin/utils";
-import { h, defineComponent } from "vue";
-import type { PropType } from "vue";
 import "./index.scss";
+import { isFunction } from "@pureadmin/utils";
+import { type PropType, h, defineComponent } from "vue";
 import type {
   TreeNode,
   TreeData,

+ 1 - 1
src/components/ReTypeit/src/index.tsx

@@ -1,6 +1,6 @@
 import type { El } from "typeit/dist/types";
 import TypeIt, { type Options as TypeItOptions } from "typeit";
-import { ref, defineComponent, onMounted, type PropType } from "vue";
+import { type PropType, ref, defineComponent, onMounted } from "vue";
 
 // 打字机效果组件(配置项详情请查阅 https://www.typeitjs.com/docs/vanilla/usage#options)
 export default defineComponent({

+ 1 - 1
src/config/index.ts

@@ -1,5 +1,5 @@
-import type { App } from "vue";
 import axios from "axios";
+import type { App } from "vue";
 
 let config: object = {};
 const { VITE_PUBLIC_PATH } = import.meta.env;

+ 3 - 3
src/directives/optimize/index.ts

@@ -1,9 +1,9 @@
 import {
-  isFunction,
-  isObject,
   isArray,
+  throttle,
   debounce,
-  throttle
+  isObject,
+  isFunction
 } from "@pureadmin/utils";
 import { useEventListener } from "@vueuse/core";
 import type { Directive, DirectiveBinding } from "vue";

+ 2 - 2
src/layout/components/navbar.vue

@@ -96,14 +96,14 @@ const { t, locale, translationCh, translationEn } = useTranslationLang();
                 :icon="LogoutCircleRLine"
                 style="margin: 5px"
               />
-              {{ t("buttons.hsLoginOut") }}
+              {{ t("buttons.pureLoginOut") }}
             </el-dropdown-item>
           </el-dropdown-menu>
         </template>
       </el-dropdown>
       <span
         class="set-icon navbar-bg-hover"
-        :title="t('buttons.hssystemSet')"
+        :title="t('buttons.pureSystemSet')"
         @click="onPanel"
       >
         <IconifyIconOffline :icon="Setting" />

+ 2 - 2
src/layout/components/sidebar/horizontal.vue

@@ -113,14 +113,14 @@ nextTick(() => {
                 :icon="LogoutCircleRLine"
                 style="margin: 5px"
               />
-              {{ t("buttons.hsLoginOut") }}
+              {{ t("buttons.pureLoginOut") }}
             </el-dropdown-item>
           </el-dropdown-menu>
         </template>
       </el-dropdown>
       <span
         class="set-icon navbar-bg-hover"
-        :title="t('buttons.hssystemSet')"
+        :title="t('buttons.pureSystemSet')"
         @click="onPanel"
       >
         <IconifyIconOffline :icon="Setting" />

+ 2 - 2
src/layout/components/sidebar/mixNav.vue

@@ -146,14 +146,14 @@ watch(
                 :icon="LogoutCircleRLine"
                 style="margin: 5px"
               />
-              {{ t("buttons.hsLoginOut") }}
+              {{ t("buttons.pureLoginOut") }}
             </el-dropdown-item>
           </el-dropdown-menu>
         </template>
       </el-dropdown>
       <span
         class="set-icon navbar-bg-hover"
-        :title="t('buttons.hssystemSet')"
+        :title="t('buttons.pureSystemSet')"
         @click="onPanel"
       >
         <IconifyIconOffline :icon="Setting" />

+ 2 - 2
src/layout/components/tag/index.vue

@@ -333,10 +333,10 @@ function onClickDrop(key, item, selectRoute?: RouteConfigs) {
       setTimeout(() => {
         if (pureSetting.hiddenSideBar) {
           tagsViews[6].icon = ExitFullscreen;
-          tagsViews[6].text = $t("buttons.hscontentExitFullScreen");
+          tagsViews[6].text = $t("buttons.pureContentExitFullScreen");
         } else {
           tagsViews[6].icon = Fullscreen;
-          tagsViews[6].text = $t("buttons.hscontentFullScreen");
+          tagsViews[6].text = $t("buttons.pureContentFullScreen");
         }
       }, 100);
       break;

+ 1 - 1
src/layout/frameView.vue

@@ -71,7 +71,7 @@ onMounted(() => {
   <div
     v-loading="loading"
     class="frame"
-    :element-loading-text="t('status.hsLoad')"
+    :element-loading-text="t('status.pureLoad')"
   >
     <iframe ref="frameRef" :src="frameSrc" class="frame-iframe" />
   </div>

+ 7 - 7
src/layout/hooks/useTag.ts

@@ -64,49 +64,49 @@ export function useTags() {
   const tagsViews = reactive<Array<tagsViewsType>>([
     {
       icon: RefreshRight,
-      text: $t("buttons.hsreload"),
+      text: $t("buttons.pureReload"),
       divided: false,
       disabled: false,
       show: true
     },
     {
       icon: Close,
-      text: $t("buttons.hscloseCurrentTab"),
+      text: $t("buttons.pureCloseCurrentTab"),
       divided: false,
       disabled: multiTags.value.length > 1 ? false : true,
       show: true
     },
     {
       icon: CloseLeftTags,
-      text: $t("buttons.hscloseLeftTabs"),
+      text: $t("buttons.pureCloseLeftTabs"),
       divided: true,
       disabled: multiTags.value.length > 1 ? false : true,
       show: true
     },
     {
       icon: CloseRightTags,
-      text: $t("buttons.hscloseRightTabs"),
+      text: $t("buttons.pureCloseRightTabs"),
       divided: false,
       disabled: multiTags.value.length > 1 ? false : true,
       show: true
     },
     {
       icon: CloseOtherTags,
-      text: $t("buttons.hscloseOtherTabs"),
+      text: $t("buttons.pureCloseOtherTabs"),
       divided: true,
       disabled: multiTags.value.length > 2 ? false : true,
       show: true
     },
     {
       icon: CloseAllTags,
-      text: $t("buttons.hscloseAllTabs"),
+      text: $t("buttons.pureCloseAllTabs"),
       divided: false,
       disabled: multiTags.value.length > 1 ? false : true,
       show: true
     },
     {
       icon: Fullscreen,
-      text: $t("buttons.hscontentFullScreen"),
+      text: $t("buttons.pureContentFullScreen"),
       divided: true,
       disabled: false,
       show: true

+ 1 - 1
src/layout/types.ts

@@ -7,7 +7,7 @@ export const routerArrays: Array<RouteConfigs> =
         {
           path: "/welcome",
           meta: {
-            title: "menus.hshome",
+            title: "menus.pureHome",
             icon: "ep:home-filled"
           }
         }

+ 28 - 28
src/router/modules/able.ts

@@ -6,16 +6,16 @@ export default {
   redirect: "/able/watermark",
   meta: {
     icon: "ri:ubuntu-fill",
-    title: $t("menus.hsAble"),
+    title: $t("menus.pureAble"),
     rank: able
   },
   children: [
     {
-      path: "/components/mqtt-client",
+      path: "/able/mqtt-client",
       name: "MqttClient",
       component: () => import("@/views/able/mqtt-client.vue"),
       meta: {
-        title: $t("menus.hsMqtt"),
+        title: $t("menus.pureMqtt"),
         extraIcon: "IF-pure-iconfont-new svg"
       }
     },
@@ -24,7 +24,7 @@ export default {
       name: "Verify",
       component: () => import("@/views/able/verify.vue"),
       meta: {
-        title: $t("menus.hsVerify")
+        title: $t("menus.pureVerify")
       }
     },
     {
@@ -32,7 +32,7 @@ export default {
       name: "WaterMark",
       component: () => import("@/views/able/watermark.vue"),
       meta: {
-        title: $t("menus.hsWatermark")
+        title: $t("menus.pureWatermark")
       }
     },
     {
@@ -40,7 +40,7 @@ export default {
       name: "Print",
       component: () => import("@/views/able/print/index.vue"),
       meta: {
-        title: $t("menus.hsPrint")
+        title: $t("menus.purePrint")
       }
     },
     {
@@ -48,7 +48,7 @@ export default {
       name: "Download",
       component: () => import("@/views/able/download.vue"),
       meta: {
-        title: $t("menus.hsDownload")
+        title: $t("menus.pureDownload")
       }
     },
     {
@@ -56,7 +56,7 @@ export default {
       name: "Excel",
       component: () => import("@/views/able/excel.vue"),
       meta: {
-        title: $t("menus.hsExcel")
+        title: $t("menus.pureExcel")
       }
     },
     {
@@ -64,7 +64,7 @@ export default {
       name: "Ripple",
       component: () => import("@/views/able/ripple.vue"),
       meta: {
-        title: $t("menus.hsRipple")
+        title: $t("menus.pureRipple")
       }
     },
     {
@@ -72,7 +72,7 @@ export default {
       name: "Debounce",
       component: () => import("@/views/able/debounce.vue"),
       meta: {
-        title: $t("menus.hsDebounce")
+        title: $t("menus.pureDebounce")
       }
     },
     {
@@ -80,7 +80,7 @@ export default {
       name: "Directives",
       component: () => import("@/views/able/directives.vue"),
       meta: {
-        title: $t("menus.hsOptimize")
+        title: $t("menus.pureOptimize")
       }
     },
     {
@@ -88,7 +88,7 @@ export default {
       name: "Draggable",
       component: () => import("@/views/able/draggable.vue"),
       meta: {
-        title: $t("menus.hsdraggable"),
+        title: $t("menus.pureDraggable"),
         transition: {
           enterTransition: "animate__zoomIn",
           leaveTransition: "animate__zoomOut"
@@ -100,7 +100,7 @@ export default {
       name: "Word",
       component: () => import("@/views/able/word.vue"),
       meta: {
-        title: $t("menus.hsWord")
+        title: $t("menus.pureWord")
       }
     },
     {
@@ -108,7 +108,7 @@ export default {
       name: "Excels",
       component: () => import("@/views/able/excels.vue"),
       meta: {
-        title: $t("menus.hsExcels")
+        title: $t("menus.pureExcels")
       }
     },
     {
@@ -116,7 +116,7 @@ export default {
       name: "Pdf",
       component: () => import("@/views/able/pdf.vue"),
       meta: {
-        title: $t("menus.hsPdf")
+        title: $t("menus.purePdf")
       }
     },
     {
@@ -124,7 +124,7 @@ export default {
       name: "BarCode",
       component: () => import("@/views/able/barcode.vue"),
       meta: {
-        title: $t("menus.hsBarcode")
+        title: $t("menus.pureBarcode")
       }
     },
     {
@@ -132,7 +132,7 @@ export default {
       name: "QrCode",
       component: () => import("@/views/able/qrcode.vue"),
       meta: {
-        title: $t("menus.hsQrcode")
+        title: $t("menus.pureQrcode")
       }
     },
     {
@@ -140,7 +140,7 @@ export default {
       name: "MapPage",
       component: () => import("@/views/able/map.vue"),
       meta: {
-        title: $t("menus.hsmap"),
+        title: $t("menus.pureMap"),
         keepAlive: true,
         transition: {
           name: "fade"
@@ -152,7 +152,7 @@ export default {
       name: "Wavesurfer",
       component: () => import("@/views/able/wavesurfer/index.vue"),
       meta: {
-        title: $t("menus.hsWavesurfer")
+        title: $t("menus.pureWavesurfer")
       }
     },
     {
@@ -160,7 +160,7 @@ export default {
       name: "VideoPage",
       component: () => import("@/views/able/video.vue"),
       meta: {
-        title: $t("menus.hsvideo")
+        title: $t("menus.pureVideo")
       }
     },
     {
@@ -168,7 +168,7 @@ export default {
       name: "VideoFrame",
       component: () => import("@/views/able/video-frame/index.vue"),
       meta: {
-        title: $t("menus.hsVideoFrame")
+        title: $t("menus.pureVideoFrame")
       }
     },
     {
@@ -176,7 +176,7 @@ export default {
       name: "Danmaku",
       component: () => import("@/views/able/danmaku/index.vue"),
       meta: {
-        title: $t("menus.hsdanmaku")
+        title: $t("menus.pureDanmaku")
       }
     },
     {
@@ -184,7 +184,7 @@ export default {
       name: "InfiniteScroll",
       component: () => import("@/views/able/infinite-scroll.vue"),
       meta: {
-        title: $t("menus.hsInfiniteScroll")
+        title: $t("menus.pureInfiniteScroll")
       }
     },
     {
@@ -192,7 +192,7 @@ export default {
       name: "MenuTree",
       component: () => import("@/views/able/menu-tree.vue"),
       meta: {
-        title: $t("menus.hsMenuTree")
+        title: $t("menus.pureMenuTree")
       }
     },
     {
@@ -200,7 +200,7 @@ export default {
       name: "LineTree",
       component: () => import("@/views/able/line-tree.vue"),
       meta: {
-        title: $t("menus.hsLineTree")
+        title: $t("menus.pureLineTree")
       }
     },
     {
@@ -208,7 +208,7 @@ export default {
       name: "Typeit",
       component: () => import("@/views/able/typeit.vue"),
       meta: {
-        title: $t("menus.hstypeit")
+        title: $t("menus.pureTypeit")
       }
     },
     {
@@ -216,7 +216,7 @@ export default {
       name: "Sensitive",
       component: () => import("@/views/able/sensitive.vue"),
       meta: {
-        title: $t("menus.hsSensitive")
+        title: $t("menus.pureSensitive")
       }
     },
     {
@@ -224,7 +224,7 @@ export default {
       name: "Pinyin",
       component: () => import("@/views/able/pinyin.vue"),
       meta: {
-        title: $t("menus.hsPinyin")
+        title: $t("menus.purePinyin")
       }
     }
   ]

+ 2 - 2
src/router/modules/about.ts

@@ -6,7 +6,7 @@ export default {
   redirect: "/about/index",
   meta: {
     icon: "ri:file-info-line",
-    title: $t("menus.hsAbout"),
+    title: $t("menus.pureAbout"),
     rank: about
   },
   children: [
@@ -15,7 +15,7 @@ export default {
       name: "About",
       component: () => import("@/views/about/index.vue"),
       meta: {
-        title: $t("menus.hsAbout")
+        title: $t("menus.pureAbout")
       }
     }
   ]

+ 2 - 2
src/router/modules/board.ts

@@ -7,7 +7,7 @@ export default {
   redirect: "/board/index",
   meta: {
     icon: "ri:artboard-line",
-    title: $t("menus.hsboard"),
+    title: $t("menus.pureBoard"),
     rank: board
   },
   children: [
@@ -16,7 +16,7 @@ export default {
       name: "FrameBoard",
       component: IFrame,
       meta: {
-        title: $t("menus.hsboard"),
+        title: $t("menus.pureBoard"),
         frameSrc: "https://songlh.top/paint-board/"
       }
     }

+ 32 - 32
src/router/modules/components.ts

@@ -6,7 +6,7 @@ export default {
   redirect: "/components/dialog",
   meta: {
     icon: "ep:menu",
-    title: $t("menus.hscomponents"),
+    title: $t("menus.pureComponents"),
     rank: components
   },
   children: [
@@ -15,7 +15,7 @@ export default {
       name: "DialogPage",
       component: () => import("@/views/components/dialog/index.vue"),
       meta: {
-        title: $t("menus.hsdialog")
+        title: $t("menus.pureDialog")
       }
     },
     {
@@ -23,7 +23,7 @@ export default {
       name: "Message",
       component: () => import("@/views/components/message.vue"),
       meta: {
-        title: $t("menus.hsmessage")
+        title: $t("menus.pureMessage")
       }
     },
     {
@@ -31,7 +31,7 @@ export default {
       name: "PureUpload",
       component: () => import("@/views/components/upload/index.vue"),
       meta: {
-        title: $t("menus.hsUpload")
+        title: $t("menus.pureUpload")
       }
     },
     {
@@ -39,7 +39,7 @@ export default {
       name: "CheckCard",
       component: () => import("@/views/components/check-card.vue"),
       meta: {
-        title: $t("menus.hsCheckCard"),
+        title: $t("menus.pureCheckCard"),
         extraIcon: "IF-pure-iconfont-new svg"
       }
     },
@@ -48,7 +48,7 @@ export default {
       name: "DatePicker",
       component: () => import("@/views/components/date-picker.vue"),
       meta: {
-        title: $t("menus.hsDatePicker")
+        title: $t("menus.pureDatePicker")
       }
     },
     {
@@ -56,7 +56,7 @@ export default {
       name: "DateTimePicker",
       component: () => import("@/views/components/datetime-picker.vue"),
       meta: {
-        title: $t("menus.hsDateTimePicker")
+        title: $t("menus.pureDateTimePicker")
       }
     },
     {
@@ -64,7 +64,7 @@ export default {
       name: "TimePicker",
       component: () => import("@/views/components/time-picker.vue"),
       meta: {
-        title: $t("menus.hsTimePicker")
+        title: $t("menus.pureTimePicker")
       }
     },
     {
@@ -72,7 +72,7 @@ export default {
       name: "IconSelect",
       component: () => import("@/views/components/icon-select.vue"),
       meta: {
-        title: $t("menus.hsIconSelect")
+        title: $t("menus.pureIconSelect")
       }
     },
     {
@@ -80,7 +80,7 @@ export default {
       name: "AnimateCss",
       component: () => import("@/views/components/animatecss.vue"),
       meta: {
-        title: $t("menus.hsanimatecss")
+        title: $t("menus.pureAnimatecss")
       }
     },
     {
@@ -88,7 +88,7 @@ export default {
       name: "Cropping",
       component: () => import("@/views/components/cropping/index.vue"),
       meta: {
-        title: $t("menus.hscropping")
+        title: $t("menus.pureCropping")
       }
     },
     {
@@ -96,7 +96,7 @@ export default {
       name: "Segmented",
       component: () => import("@/views/components/segmented.vue"),
       meta: {
-        title: $t("menus.hssegmented")
+        title: $t("menus.pureSegmented")
       }
     },
     {
@@ -104,7 +104,7 @@ export default {
       name: "PureText",
       component: () => import("@/views/components/text.vue"),
       meta: {
-        title: $t("menus.hsText"),
+        title: $t("menus.pureText"),
         extraIcon: "IF-pure-iconfont-new svg"
       }
     },
@@ -113,7 +113,7 @@ export default {
       name: "PureButton",
       component: () => import("@/views/components/el-button.vue"),
       meta: {
-        title: $t("menus.hsElButton")
+        title: $t("menus.pureElButton")
       }
     },
     {
@@ -121,7 +121,7 @@ export default {
       name: "CheckButton",
       component: () => import("@/views/components/check-button.vue"),
       meta: {
-        title: $t("menus.hsCheckButton"),
+        title: $t("menus.pureCheckButton"),
         extraIcon: "IF-pure-iconfont-new svg"
       }
     },
@@ -130,7 +130,7 @@ export default {
       name: "ButtonPage",
       component: () => import("@/views/components/button.vue"),
       meta: {
-        title: $t("menus.hsbutton")
+        title: $t("menus.pureButton")
       }
     },
     {
@@ -138,7 +138,7 @@ export default {
       name: "PureProgress",
       component: () => import("@/views/components/progress.vue"),
       meta: {
-        title: $t("menus.hsProgress")
+        title: $t("menus.pureProgress")
       }
     },
     {
@@ -146,7 +146,7 @@ export default {
       name: "PureTag",
       component: () => import("@/views/components/tag.vue"),
       meta: {
-        title: $t("menus.hsTag")
+        title: $t("menus.pureTag")
       }
     },
     {
@@ -154,7 +154,7 @@ export default {
       name: "Statistic",
       component: () => import("@/views/components/statistic.vue"),
       meta: {
-        title: $t("menus.hsStatistic")
+        title: $t("menus.pureStatistic")
       }
     },
     {
@@ -162,7 +162,7 @@ export default {
       name: "Collapse",
       component: () => import("@/views/components/collapse.vue"),
       meta: {
-        title: $t("menus.hsCollapse")
+        title: $t("menus.pureCollapse")
       }
     },
     {
@@ -170,7 +170,7 @@ export default {
       name: "Cascader",
       component: () => import("@/views/components/cascader.vue"),
       meta: {
-        title: $t("menus.hsCascader")
+        title: $t("menus.pureCascader")
       }
     },
     {
@@ -178,7 +178,7 @@ export default {
       name: "ColorPicker",
       component: () => import("@/views/components/color-picker.vue"),
       meta: {
-        title: $t("menus.hsColorPicker")
+        title: $t("menus.pureColorPicker")
       }
     },
     {
@@ -186,7 +186,7 @@ export default {
       name: "Selector",
       component: () => import("@/views/components/selector.vue"),
       meta: {
-        title: $t("menus.hsselector")
+        title: $t("menus.pureSelector")
       }
     },
     {
@@ -194,7 +194,7 @@ export default {
       name: "Waterfall",
       component: () => import("@/views/components/waterfall/index.vue"),
       meta: {
-        title: $t("menus.hswaterfall")
+        title: $t("menus.pureWaterfall")
       }
     },
     {
@@ -202,7 +202,7 @@ export default {
       name: "SplitPane",
       component: () => import("@/views/components/split-pane.vue"),
       meta: {
-        title: $t("menus.hssplitPane")
+        title: $t("menus.pureSplitPane")
       }
     },
     {
@@ -210,7 +210,7 @@ export default {
       name: "Swiper",
       component: () => import("@/views/components/swiper.vue"),
       meta: {
-        title: $t("menus.hsSwiper")
+        title: $t("menus.pureSwiper")
       }
     },
     {
@@ -218,7 +218,7 @@ export default {
       name: "TimeLine",
       component: () => import("@/views/components/timeline.vue"),
       meta: {
-        title: $t("menus.hsTimeline")
+        title: $t("menus.pureTimeline")
       }
     },
     {
@@ -226,7 +226,7 @@ export default {
       name: "CountTo",
       component: () => import("@/views/components/count-to.vue"),
       meta: {
-        title: $t("menus.hscountTo")
+        title: $t("menus.pureCountTo")
       }
     },
     {
@@ -234,7 +234,7 @@ export default {
       name: "ContextMenu",
       component: () => import("@/views/components/contextmenu/index.vue"),
       meta: {
-        title: $t("menus.hscontextmenu")
+        title: $t("menus.pureContextmenu")
       }
     },
     {
@@ -242,7 +242,7 @@ export default {
       name: "JsonEditor",
       component: () => import("@/views/components/json-editor.vue"),
       meta: {
-        title: $t("menus.hsjsoneditor")
+        title: $t("menus.pureJsonEditor")
       }
     },
     {
@@ -250,7 +250,7 @@ export default {
       name: "SeamlessScroll",
       component: () => import("@/views/components/seamless-scroll.vue"),
       meta: {
-        title: $t("menus.hsseamless")
+        title: $t("menus.pureSeamless")
       }
     },
     {
@@ -258,7 +258,7 @@ export default {
       name: "VirtualList",
       component: () => import("@/views/components/virtual-list/index.vue"),
       meta: {
-        title: $t("menus.hsVirtualList")
+        title: $t("menus.pureVirtualList")
       }
     }
   ]

+ 2 - 2
src/router/modules/editor.ts

@@ -6,7 +6,7 @@ export default {
   redirect: "/editor/index",
   meta: {
     icon: "ep:edit",
-    title: $t("menus.hseditor"),
+    title: $t("menus.pureEditor"),
     rank: editor
   },
   children: [
@@ -15,7 +15,7 @@ export default {
       name: "Editor",
       component: () => import("@/views/editor/index.vue"),
       meta: {
-        title: $t("menus.hseditor"),
+        title: $t("menus.pureEditor"),
         keepAlive: true
       }
     }

+ 4 - 4
src/router/modules/error.ts

@@ -7,7 +7,7 @@ export default {
   meta: {
     icon: "ri:information-line",
     // showLink: false,
-    title: $t("menus.hsabnormal"),
+    title: $t("menus.pureAbnormal"),
     rank: error
   },
   children: [
@@ -16,7 +16,7 @@ export default {
       name: "403",
       component: () => import("@/views/error/403.vue"),
       meta: {
-        title: $t("menus.hsfourZeroOne")
+        title: $t("menus.pureFourZeroOne")
       }
     },
     {
@@ -24,7 +24,7 @@ export default {
       name: "404",
       component: () => import("@/views/error/404.vue"),
       meta: {
-        title: $t("menus.hsfourZeroFour")
+        title: $t("menus.pureFourZeroFour")
       }
     },
     {
@@ -32,7 +32,7 @@ export default {
       name: "500",
       component: () => import("@/views/error/500.vue"),
       meta: {
-        title: $t("menus.hsFive")
+        title: $t("menus.pureFive")
       }
     }
   ]

+ 2 - 2
src/router/modules/flowchart.ts

@@ -6,7 +6,7 @@ export default {
   redirect: "/flow-chart/index",
   meta: {
     icon: "ep:set-up",
-    title: $t("menus.hsflowChart"),
+    title: $t("menus.pureFlowChart"),
     rank: flowchart
   },
   children: [
@@ -15,7 +15,7 @@ export default {
       name: "FlowChart",
       component: () => import("@/views/flow-chart/index.vue"),
       meta: {
-        title: $t("menus.hsflowChart")
+        title: $t("menus.pureFlowChart")
       }
     }
   ]

+ 2 - 2
src/router/modules/form.ts

@@ -6,7 +6,7 @@ export default {
   redirect: "/form/index",
   meta: {
     icon: "ri:edit-box-line",
-    title: $t("menus.hsSchemaForm"),
+    title: $t("menus.pureSchemaForm"),
     rank: form
   },
   children: [
@@ -15,7 +15,7 @@ export default {
       name: "SchemaForm",
       component: () => import("@/views/schema-form/index.vue"),
       meta: {
-        title: $t("menus.hsSchemaForm"),
+        title: $t("menus.pureSchemaForm"),
         extraIcon: "IF-pure-iconfont-new svg"
       }
     }

+ 2 - 2
src/router/modules/formdesign.ts

@@ -7,7 +7,7 @@ export default {
   redirect: "/form-design/index",
   meta: {
     icon: "ri:terminal-window-line",
-    title: $t("menus.hsFormDesign"),
+    title: $t("menus.pureFormDesign"),
     rank: formdesign
   },
   children: [
@@ -16,7 +16,7 @@ export default {
       name: "FormDesign",
       component: IFrame,
       meta: {
-        title: $t("menus.hsFormDesign"),
+        title: $t("menus.pureFormDesign"),
         frameSrc:
           "https://haixin-fang.github.io/vue-form-design/playground/index.html",
         frameLoading: false

+ 2 - 2
src/router/modules/ganttastic.ts

@@ -6,7 +6,7 @@ export default {
   redirect: "/ganttastic/index",
   meta: {
     icon: "ri:bar-chart-horizontal-line",
-    title: $t("menus.hsGanttastic"),
+    title: $t("menus.pureGanttastic"),
     rank: ganttastic
   },
   children: [
@@ -15,7 +15,7 @@ export default {
       name: "Ganttastic",
       component: () => import("@/views/ganttastic/index.vue"),
       meta: {
-        title: $t("menus.hsGanttastic"),
+        title: $t("menus.pureGanttastic"),
         extraIcon: "IF-pure-iconfont-new svg"
       }
     }

+ 2 - 2
src/router/modules/guide.ts

@@ -6,7 +6,7 @@ export default {
   redirect: "/guide/index",
   meta: {
     icon: "ep:guide",
-    title: $t("menus.hsguide"),
+    title: $t("menus.pureGuide"),
     rank: guide
   },
   children: [
@@ -15,7 +15,7 @@ export default {
       name: "Guide",
       component: () => import("@/views/guide/index.vue"),
       meta: {
-        title: $t("menus.hsguide")
+        title: $t("menus.pureGuide")
       }
     }
   ]

+ 2 - 2
src/router/modules/home.ts

@@ -10,7 +10,7 @@ export default {
   redirect: "/welcome",
   meta: {
     icon: "ep:home-filled",
-    title: $t("menus.hshome"),
+    title: $t("menus.pureHome"),
     rank: home
   },
   children: [
@@ -19,7 +19,7 @@ export default {
       name: "Welcome",
       component: () => import("@/views/welcome/index.vue"),
       meta: {
-        title: $t("menus.hshome"),
+        title: $t("menus.pureHome"),
         showLink: VITE_HIDE_HOME === "true" ? false : true
       }
     }

+ 2 - 2
src/router/modules/list.ts

@@ -6,7 +6,7 @@ export default {
   redirect: "/list/card",
   meta: {
     icon: "ri:list-check",
-    title: $t("menus.hsList"),
+    title: $t("menus.pureList"),
     rank: list
   },
   children: [
@@ -16,7 +16,7 @@ export default {
       component: () => import("@/views/list/card/index.vue"),
       meta: {
         icon: "ri:bank-card-line",
-        title: $t("menus.hsListCard"),
+        title: $t("menus.pureListCard"),
         showParent: true
       }
     }

+ 2 - 2
src/router/modules/menuoverflow.ts

@@ -5,7 +5,7 @@ export default {
   path: "/menuoverflow",
   redirect: "/menuoverflow/index",
   meta: {
-    title: $t("menus.hsMenuoverflow"),
+    title: $t("menus.pureMenuOverflow"),
     rank: menuoverflow
   },
   children: [
@@ -14,7 +14,7 @@ export default {
       name: "MenuOverflow",
       component: () => import("@/views/menuoverflow/index.vue"),
       meta: {
-        title: $t("menus.hsChildMenuoverflow"),
+        title: $t("menus.pureChildMenuOverflow"),
         showParent: true
       }
     }

+ 8 - 8
src/router/modules/nested.ts

@@ -5,7 +5,7 @@ export default {
   path: "/nested",
   redirect: "/nested/menu1/menu1-1",
   meta: {
-    title: $t("menus.hsmenus"),
+    title: $t("menus.pureMenus"),
     icon: "ep:histogram",
     rank: nested
   },
@@ -13,7 +13,7 @@ export default {
     {
       path: "/nested/menu1",
       meta: {
-        title: $t("menus.hsmenu1"),
+        title: $t("menus.pureMenu1"),
         keepAlive: true
       },
       redirect: "/nested/menu1/menu1-1",
@@ -23,7 +23,7 @@ export default {
           component: () => import("@/views/nested/menu1/menu1-1/index.vue"),
           name: "Menu1-1",
           meta: {
-            title: $t("menus.hsmenu1-1"),
+            title: $t("menus.pureMenu1-1"),
             keepAlive: true
           }
         },
@@ -31,7 +31,7 @@ export default {
           path: "/nested/menu1/menu1-2",
           redirect: "/nested/menu1/menu1-2/menu1-2-1",
           meta: {
-            title: $t("menus.hsmenu1-2"),
+            title: $t("menus.pureMenu1-2"),
             keepAlive: true
           },
           children: [
@@ -41,7 +41,7 @@ export default {
                 import("@/views/nested/menu1/menu1-2/menu1-2-1/index.vue"),
               name: "Menu1-2-1",
               meta: {
-                title: $t("menus.hsmenu1-2-1"),
+                title: $t("menus.pureMenu1-2-1"),
                 keepAlive: true
               }
             },
@@ -51,7 +51,7 @@ export default {
                 import("@/views/nested/menu1/menu1-2/menu1-2-2/index.vue"),
               name: "Menu1-2-2",
               meta: {
-                title: $t("menus.hsmenu1-2-2"),
+                title: $t("menus.pureMenu1-2-2"),
                 keepAlive: true
               }
             }
@@ -62,7 +62,7 @@ export default {
           component: () => import("@/views/nested/menu1/menu1-3/index.vue"),
           name: "Menu1-3",
           meta: {
-            title: $t("menus.hsmenu1-3"),
+            title: $t("menus.pureMenu1-3"),
             keepAlive: true
           }
         }
@@ -73,7 +73,7 @@ export default {
       name: "Menu2",
       component: () => import("@/views/nested/menu2/index.vue"),
       meta: {
-        title: $t("menus.hsmenu2"),
+        title: $t("menus.pureMenu2"),
         keepAlive: true
       }
     }

+ 3 - 3
src/router/modules/remaining.ts

@@ -7,7 +7,7 @@ export default [
     name: "Login",
     component: () => import("@/views/login/index.vue"),
     meta: {
-      title: $t("menus.hslogin"),
+      title: $t("menus.pureLogin"),
       showLink: false,
       rank: 101
     }
@@ -16,7 +16,7 @@ export default [
     path: "/redirect",
     component: Layout,
     meta: {
-      title: $t("status.hsLoad"),
+      title: $t("status.pureLoad"),
       showLink: false,
       rank: 102
     },
@@ -34,7 +34,7 @@ export default [
     name: "Empty",
     component: () => import("@/views/empty/index.vue"),
     meta: {
-      title: $t("menus.hsempty"),
+      title: $t("menus.pureEmpty"),
       showLink: false,
       rank: 103
     }

+ 3 - 3
src/router/modules/result.ts

@@ -6,7 +6,7 @@ export default {
   redirect: "/result/success",
   meta: {
     icon: "ri:checkbox-circle-line",
-    title: $t("menus.hsResult"),
+    title: $t("menus.pureResult"),
     rank: result
   },
   children: [
@@ -15,7 +15,7 @@ export default {
       name: "Success",
       component: () => import("@/views/result/success.vue"),
       meta: {
-        title: $t("menus.hsSuccess")
+        title: $t("menus.pureSuccess")
       }
     },
     {
@@ -23,7 +23,7 @@ export default {
       name: "Fail",
       component: () => import("@/views/result/fail.vue"),
       meta: {
-        title: $t("menus.hsFail")
+        title: $t("menus.pureFail")
       }
     }
   ]

+ 5 - 5
src/router/modules/table.ts

@@ -6,7 +6,7 @@ export default {
   redirect: "/table/index",
   meta: {
     icon: "ri:table-line",
-    title: $t("menus.hstable"),
+    title: $t("menus.pureTable"),
     rank: table
   },
   children: [
@@ -15,7 +15,7 @@ export default {
       name: "PureTable",
       component: () => import("@/views/table/index.vue"),
       meta: {
-        title: $t("menus.hsPureTableBase")
+        title: $t("menus.pureTableBase")
       }
     },
     {
@@ -23,7 +23,7 @@ export default {
       name: "PureTableHigh",
       component: () => import("@/views/table/high.vue"),
       meta: {
-        title: $t("menus.hsPureTableHigh")
+        title: $t("menus.pureTableHigh")
       }
     },
     {
@@ -31,7 +31,7 @@ export default {
       name: "PureTableEdit",
       component: () => import("@/views/table/edit.vue"),
       meta: {
-        title: $t("menus.hsPureTableEdit"),
+        title: $t("menus.pureTableEdit"),
         extraIcon: "IF-pure-iconfont-new svg"
       }
     },
@@ -40,7 +40,7 @@ export default {
       name: "VxeTable",
       component: () => import("@/views/table/virtual.vue"),
       meta: {
-        title: $t("menus.hsVxeTable"),
+        title: $t("menus.pureVxeTable"),
         extraIcon: "IF-pure-iconfont-new svg"
       }
     }

+ 7 - 0
src/views/able/barcode.vue

@@ -44,6 +44,13 @@ const barcodes = [
           </el-link>
           生成)
         </div>
+        <el-link
+          class="mt-2"
+          href="https://github.com/pure-admin/vue-pure-admin/blob/main/src/views/able/barcode.vue"
+          target="_blank"
+        >
+          代码位置 src/views/able/barcode.vue
+        </el-link>
       </template>
       <el-row :gutter="12">
         <template v-for="(item, index) in barcodes" :key="index">

+ 7 - 0
src/views/able/danmaku/index.vue

@@ -116,6 +116,13 @@ function addDanmu() {
           </el-link>
         </span>
       </div>
+      <el-link
+        class="mt-2"
+        href="https://github.com/pure-admin/vue-pure-admin/blob/main/src/views/able/danmaku"
+        target="_blank"
+      >
+        代码位置 src/views/able/danmaku
+      </el-link>
     </template>
     <div class="flex gap-5">
       <vue-danmaku

+ 8 - 1
src/views/able/debounce.vue

@@ -19,7 +19,14 @@ const throttleClick = throttle(handle);
   <div>
     <el-card class="mb-5" shadow="never">
       <template #header>
-        <div class="font-medium">防抖:debounce</div>
+        <p class="font-medium">防抖:debounce</p>
+        <el-link
+          class="mt-2"
+          href="https://github.com/pure-admin/vue-pure-admin/blob/main/src/views/able/debounce.vue"
+          target="_blank"
+        >
+          代码位置 src/views/able/debounce.vue
+        </el-link>
       </template>
       <div class="mb-5">
         所谓防抖,就是指触发事件后在 n 秒内函数只能执行一次,如果在 n

+ 8 - 1
src/views/able/directives.vue

@@ -56,7 +56,14 @@ function onReset() {
   <el-card shadow="never">
     <template #header>
       <div class="card-header">
-        <span class="font-medium">自定义防抖、截流、文本复制、长按指令</span>
+        <p class="font-medium">自定义防抖、截流、文本复制、长按指令</p>
+        <el-link
+          class="mt-2"
+          href="https://github.com/pure-admin/vue-pure-admin/blob/main/src/views/able/directives.vue"
+          target="_blank"
+        >
+          代码位置 src/views/able/directives.vue
+        </el-link>
       </div>
     </template>
     <div class="mb-2">

+ 8 - 1
src/views/able/download.vue

@@ -28,7 +28,14 @@ function down() {
 <template>
   <el-card shadow="never">
     <template #header>
-      <span class="font-medium">文件下载功能</span>
+      <p class="font-medium">文件下载功能</p>
+      <el-link
+        class="mt-2"
+        href="https://github.com/pure-admin/vue-pure-admin/blob/main/src/views/able/download.vue"
+        target="_blank"
+      >
+        代码位置 src/views/able/download.vue
+      </el-link>
     </template>
     <div class="flex flex-wrap">
       <el-button

+ 7 - 0
src/views/able/draggable.vue

@@ -68,6 +68,13 @@ onMounted(() => {
           </el-link>
         </span>
       </div>
+      <el-link
+        class="mt-2"
+        href="https://github.com/pure-admin/vue-pure-admin/blob/main/src/views/able/draggable.vue"
+        target="_blank"
+      >
+        代码位置 src/views/able/draggable.vue
+      </el-link>
     </template>
     <div class="drag-container">
       <!-- grid列表拖拽 -->

+ 8 - 3
src/views/able/excel.vue

@@ -72,16 +72,21 @@ const exportExcel = () => {
   <el-card shadow="never">
     <template #header>
       <div class="font-medium">
-        导出Excel(
         <el-link
           href="https://github.com/SheetJS/sheetjs"
           target="_blank"
           style="margin: 0 5px 4px 0; font-size: 16px"
         >
-          github地址
+          导出Excel
         </el-link>
-        )
       </div>
+      <el-link
+        class="mt-2"
+        href="https://github.com/pure-admin/vue-pure-admin/blob/main/src/views/able/excel.vue"
+        target="_blank"
+      >
+        代码位置 src/views/able/excel.vue
+      </el-link>
     </template>
     <el-button type="primary" @click="exportExcel">导出Excel</el-button>
     <div class="h-[25rem] mt-3">

+ 8 - 3
src/views/able/infinite-scroll.vue

@@ -35,16 +35,21 @@ const load = () => {
   <el-card shadow="never">
     <template #header>
       <div class="font-medium">
-        表格无限滚动(
         <el-link
           href="https://github.com/yujinpan/el-table-infinite-scroll"
           target="_blank"
           style="margin: 0 5px 4px 0; font-size: 16px"
         >
-          github地址
+          表格无限滚动
         </el-link>
-        )
       </div>
+      <el-link
+        class="mt-2"
+        href="https://github.com/pure-admin/vue-pure-admin/blob/main/src/views/able/infinite-scroll.vue"
+        target="_blank"
+      >
+        代码位置 src/views/able/infinite-scroll.vue
+      </el-link>
     </template>
     <p class="mb-2">{{ isBottom ? "已加载全部页" : `加载到第 ${page} 页` }}</p>
     <el-table

+ 10 - 3
src/views/able/line-tree.vue

@@ -25,9 +25,16 @@ const dataProps = {
   <el-card shadow="never">
     <template #header>
       <div class="card-header">
-        <span class="font-medium">
-          扩展elemenet-plus的树形组件包括虚拟树组件,支持连接线
-        </span>
+        <p class="font-medium">
+          扩展 Elemenet Plus 的树形组件包括虚拟树组件,支持连接线
+        </p>
+        <el-link
+          class="mt-2"
+          href="https://github.com/pure-admin/vue-pure-admin/blob/main/src/views/able/line-tree.vue"
+          target="_blank"
+        >
+          代码位置 src/views/able/line-tree.vue
+        </el-link>
       </div>
     </template>
 

+ 8 - 1
src/views/able/menu-tree.vue

@@ -47,7 +47,7 @@ const filterMethod = (query: string, node: treeNode) => {
     <template #header>
       <div class="card-header">
         <span class="font-medium">
-          菜单树结构(采用element-plus
+          菜单树结构(采用 Element Plus 
           <el-link
             href="https://element-plus.gitee.io/zh-CN/component/tree-v2.html"
             target="_blank"
@@ -59,6 +59,13 @@ const filterMethod = (query: string, node: treeNode) => {
           组件并支持国际化)
         </span>
       </div>
+      <el-link
+        class="mt-2"
+        href="https://github.com/pure-admin/vue-pure-admin/blob/main/src/views/able/menu-tree.vue"
+        target="_blank"
+      >
+        代码位置 src/views/able/menu-tree.vue
+      </el-link>
     </template>
     <el-input
       v-model="query"

+ 196 - 188
src/views/able/mqtt-client.vue

@@ -190,203 +190,211 @@ onUnmounted(() => {
 <template>
   <el-card shadow="never" :body-style="{ padding: '20px' }">
     <template #header>
-      基于
+      <div>
+        基于
+        <el-link
+          type="primary"
+          :underline="false"
+          href="https://github.com/mqttjs/MQTT.js"
+          target="_blank"
+        >
+          MQTT.js
+        </el-link>
+        和 免费的公共MQTT代理
+        <el-link
+          type="primary"
+          :underline="false"
+          href="broker.emqx.io"
+          target="_blank"
+        >
+          EMQX
+        </el-link>
+        实现的一套 MQTT 客户端
+      </div>
       <el-link
-        type="primary"
-        :underline="false"
-        href="https://github.com/mqttjs/MQTT.js"
+        class="mt-2"
+        href="https://github.com/pure-admin/vue-pure-admin/blob/main/src/views/able/mqtt-client.vue"
         target="_blank"
       >
-        MQTT.js
+        代码位置 src/views/able/mqtt-client.vue
       </el-link>
-      和 免费的公共MQTT代理
-      <el-link
-        type="primary"
-        :underline="false"
-        href="broker.emqx.io"
-        target="_blank"
-      >
-        EMQX
-      </el-link>
-      实现的一套 MQTT 客户端。
     </template>
-    <template #default>
-      <el-card shadow="never">
-        <h1>设置</h1>
-        <el-form label-position="top" :model="connection">
-          <el-row :gutter="20">
-            <el-col :span="8">
-              <el-form-item prop="protocol" label="协议">
-                <el-select
-                  v-model="connection.protocol"
-                  @change="handleProtocolChange"
-                >
-                  <el-option label="ws://" value="ws" />
-                  <el-option label="wss://" value="wss" />
-                </el-select>
-              </el-form-item>
-            </el-col>
-            <el-col :span="8">
-              <el-form-item prop="host" label="主机">
-                <el-input v-model="connection.host" />
-              </el-form-item>
-            </el-col>
-            <el-col :span="8">
-              <el-form-item prop="port" label="端口">
-                <el-input
-                  v-model.number="connection.port"
-                  type="number"
-                  placeholder="8083/8084"
-                />
-              </el-form-item>
-            </el-col>
-            <el-col :span="8">
-              <el-form-item prop="clientId" label="客户端ID">
-                <el-input v-model="connection.clientId" />
-              </el-form-item>
-            </el-col>
-            <el-col :span="8">
-              <el-form-item prop="username" label="用户名">
-                <el-input v-model="connection.username" />
-              </el-form-item>
-            </el-col>
-            <el-col :span="8">
-              <el-form-item prop="password" label="密码">
-                <el-input v-model="connection.password" />
-              </el-form-item>
-            </el-col>
 
-            <el-col :span="24">
-              <el-button
-                type="primary"
-                :disabled="client.connected"
-                :loading="btnLoadingType === 'connect'"
-                @click="createConnection"
+    <el-card shadow="never">
+      <h1>设置</h1>
+      <el-form label-position="top" :model="connection">
+        <el-row :gutter="20">
+          <el-col :span="8">
+            <el-form-item prop="protocol" label="协议">
+              <el-select
+                v-model="connection.protocol"
+                @change="handleProtocolChange"
               >
-                {{ client.connected ? "已连接" : "连接" }}
-              </el-button>
+                <el-option label="ws://" value="ws" />
+                <el-option label="wss://" value="wss" />
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="8">
+            <el-form-item prop="host" label="主机">
+              <el-input v-model="connection.host" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="8">
+            <el-form-item prop="port" label="端口">
+              <el-input
+                v-model.number="connection.port"
+                type="number"
+                placeholder="8083/8084"
+              />
+            </el-form-item>
+          </el-col>
+          <el-col :span="8">
+            <el-form-item prop="clientId" label="客户端ID">
+              <el-input v-model="connection.clientId" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="8">
+            <el-form-item prop="username" label="用户名">
+              <el-input v-model="connection.username" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="8">
+            <el-form-item prop="password" label="密码">
+              <el-input v-model="connection.password" />
+            </el-form-item>
+          </el-col>
 
-              <el-button
-                v-if="client.connected"
-                type="danger"
-                :loading="btnLoadingType === 'disconnect'"
-                @click="destroyConnection"
+          <el-col :span="24">
+            <el-button
+              type="primary"
+              :disabled="client.connected"
+              :loading="btnLoadingType === 'connect'"
+              @click="createConnection"
+            >
+              {{ client.connected ? "已连接" : "连接" }}
+            </el-button>
+
+            <el-button
+              v-if="client.connected"
+              type="danger"
+              :loading="btnLoadingType === 'disconnect'"
+              @click="destroyConnection"
+            >
+              断开连接
+            </el-button>
+          </el-col>
+        </el-row>
+      </el-form>
+    </el-card>
+    <el-card shadow="never" class="mt-4">
+      <h1>订阅</h1>
+      <el-form label-position="top" :model="subscription">
+        <el-row :gutter="20" :align="'middle'">
+          <el-col :span="8">
+            <el-form-item prop="topic" label="主题">
+              <el-input
+                v-model="subscription.topic"
+                :disabled="subscribedSuccess"
+              />
+            </el-form-item>
+          </el-col>
+          <el-col :span="8">
+            <el-form-item prop="qos" label="通信质量">
+              <el-select
+                v-model="subscription.qos"
+                :disabled="subscribedSuccess"
               >
-                断开连接
-              </el-button>
-            </el-col>
-          </el-row>
-        </el-form>
-      </el-card>
-      <el-card shadow="never" class="mt-4">
-        <h1>订阅</h1>
-        <el-form label-position="top" :model="subscription">
-          <el-row :gutter="20" :align="'middle'">
-            <el-col :span="8">
-              <el-form-item prop="topic" label="主题">
-                <el-input
-                  v-model="subscription.topic"
-                  :disabled="subscribedSuccess"
+                <el-option
+                  v-for="qos in qosList"
+                  :key="qos"
+                  :label="qos"
+                  :value="qos"
                 />
-              </el-form-item>
-            </el-col>
-            <el-col :span="8">
-              <el-form-item prop="qos" label="通信质量">
-                <el-select
-                  v-model="subscription.qos"
-                  :disabled="subscribedSuccess"
-                >
-                  <el-option
-                    v-for="qos in qosList"
-                    :key="qos"
-                    :label="qos"
-                    :value="qos"
-                  />
-                </el-select>
-              </el-form-item>
-            </el-col>
-          </el-row>
-          <el-row>
-            <el-col>
-              <el-button
-                type="primary"
-                class="sub-btn"
-                :loading="btnLoadingType === 'subscribe'"
-                :disabled="!client.connected || subscribedSuccess"
-                @click="doSubscribe"
-              >
-                {{ subscribedSuccess ? "已订阅" : "订阅" }}
-              </el-button>
-              <el-button
-                v-if="subscribedSuccess"
-                type="primary"
-                class="sub-btn"
-                :loading="btnLoadingType === 'unsubscribe'"
-                :disabled="!client.connected"
-                @click="doUnSubscribe"
-              >
-                取消订阅
-              </el-button>
-            </el-col>
-          </el-row>
-        </el-form>
-      </el-card>
-      <el-card shadow="never" class="mt-4">
-        <h1>发布</h1>
-        <el-form label-position="top" :model="publish">
-          <el-row :gutter="20">
-            <el-col :span="8">
-              <el-form-item prop="topic">
-                <template #label>
-                  <span>主题</span>
-                  <el-text type="info" size="small">
-                    可将订阅主题设置为topic/browser,测试MQTT的自发自收。
-                  </el-text>
-                </template>
-                <el-input v-model="publish.topic" />
-              </el-form-item>
-            </el-col>
-            <el-col :span="8">
-              <el-form-item prop="payload" label="有效载荷">
-                <el-input v-model="publish.payload" />
-              </el-form-item>
-            </el-col>
-            <el-col :span="8">
-              <el-form-item prop="qos" label="通信质量">
-                <el-select v-model="publish.qos">
-                  <el-option
-                    v-for="qos in qosList"
-                    :key="qos"
-                    :label="qos"
-                    :value="qos"
-                  />
-                </el-select>
-              </el-form-item>
-            </el-col>
-          </el-row>
-        </el-form>
-        <el-col :span="24">
-          <el-button
-            type="primary"
-            :loading="btnLoadingType === 'publish'"
-            :disabled="!client.connected"
-            @click="doPublish"
-          >
-            发布
-          </el-button>
-        </el-col>
-      </el-card>
-      <el-card shadow="never" class="mt-4">
-        <h1>接收</h1>
-        <el-col :span="24">
-          <el-input
-            v-model="receivedMessages"
-            type="textarea"
-            :rows="3"
-            readonly
-          />
-        </el-col>
-      </el-card>
-    </template>
+              </el-select>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row>
+          <el-col>
+            <el-button
+              type="primary"
+              class="sub-btn"
+              :loading="btnLoadingType === 'subscribe'"
+              :disabled="!client.connected || subscribedSuccess"
+              @click="doSubscribe"
+            >
+              {{ subscribedSuccess ? "已订阅" : "订阅" }}
+            </el-button>
+            <el-button
+              v-if="subscribedSuccess"
+              type="primary"
+              class="sub-btn"
+              :loading="btnLoadingType === 'unsubscribe'"
+              :disabled="!client.connected"
+              @click="doUnSubscribe"
+            >
+              取消订阅
+            </el-button>
+          </el-col>
+        </el-row>
+      </el-form>
+    </el-card>
+    <el-card shadow="never" class="mt-4">
+      <h1>发布</h1>
+      <el-form label-position="top" :model="publish">
+        <el-row :gutter="20">
+          <el-col :span="8">
+            <el-form-item prop="topic">
+              <template #label>
+                <span>主题</span>
+                <el-text type="info" size="small">
+                  可将订阅主题设置为topic/browser,测试MQTT的自发自收。
+                </el-text>
+              </template>
+              <el-input v-model="publish.topic" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="8">
+            <el-form-item prop="payload" label="有效载荷">
+              <el-input v-model="publish.payload" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="8">
+            <el-form-item prop="qos" label="通信质量">
+              <el-select v-model="publish.qos">
+                <el-option
+                  v-for="qos in qosList"
+                  :key="qos"
+                  :label="qos"
+                  :value="qos"
+                />
+              </el-select>
+            </el-form-item>
+          </el-col>
+        </el-row>
+      </el-form>
+      <el-col :span="24">
+        <el-button
+          type="primary"
+          :loading="btnLoadingType === 'publish'"
+          :disabled="!client.connected"
+          @click="doPublish"
+        >
+          发布
+        </el-button>
+      </el-col>
+    </el-card>
+    <el-card shadow="never" class="mt-4">
+      <h1>接收</h1>
+      <el-col :span="24">
+        <el-input
+          v-model="receivedMessages"
+          type="textarea"
+          :rows="3"
+          readonly
+        />
+      </el-col>
+    </el-card>
   </el-card>
 </template>

+ 32 - 27
src/views/able/pdf.vue

@@ -38,21 +38,26 @@ const onPrint = () => {
   <el-card shadow="never">
     <template #header>
       <div class="font-medium">
-        PDF预览(
         <el-link
           href="https://github.com/hrynko/vue-pdf-embed"
           target="_blank"
           style="margin: 0 5px 4px 0; font-size: 16px"
         >
-          github地址
+          PDF预览
         </el-link>
-        )
       </div>
+      <el-link
+        class="mt-2"
+        href="https://github.com/pure-admin/vue-pure-admin/blob/main/src/views/able/pdf.vue"
+        target="_blank"
+      >
+        代码位置 src/views/able/pdf.vue
+      </el-link>
     </template>
     <div
       v-loading="loading"
-      class="h-[calc(100vh-239px)]"
-      :element-loading-text="t('status.hsLoad')"
+      class="h-[calc(100vh-295px)]"
+      :element-loading-text="t('status.pureLoad')"
     >
       <div class="flex justify-between items-center h-9">
         <div v-if="showAllPages" class="font-medium ml-1.25 text-xl">
@@ -73,28 +78,28 @@ const onPrint = () => {
           <el-checkbox v-model="showAllPages" @change="showAllPagesChange">
             显示所有页面
           </el-checkbox>
-          <el-tooltip
-            effect="dark"
-            :content="`翻转(当前角度${rotations[currentRotation]}度)`"
-            placement="top"
-          >
-            <IconifyIconOnline
-              icon="ic:baseline-rotate-90-degrees-ccw"
-              class="cursor-pointer outline-transparent"
-              @click="
-                currentRotation === 3
-                  ? (currentRotation = 0)
-                  : (currentRotation += 1)
-              "
-            />
-          </el-tooltip>
-          <el-tooltip effect="dark" content="打印" placement="top">
-            <IconifyIconOnline
-              icon="ri:printer-line"
-              class="cursor-pointer outline-transparent"
-              @click="onPrint"
-            />
-          </el-tooltip>
+          <IconifyIconOnline
+            v-tippy="{
+              maxWidth: 'none',
+              content: `翻转(当前角度${rotations[currentRotation]}度)`
+            }"
+            icon="ic:baseline-rotate-90-degrees-ccw"
+            class="cursor-pointer outline-transparent"
+            @click="
+              currentRotation === 3
+                ? (currentRotation = 0)
+                : (currentRotation += 1)
+            "
+          />
+          <IconifyIconOnline
+            v-tippy="{
+              maxWidth: 'none',
+              content: '打印'
+            }"
+            icon="ri:printer-line"
+            class="cursor-pointer outline-transparent"
+            @click="onPrint"
+          />
         </div>
       </div>
       <el-scrollbar>

+ 8 - 1
src/views/able/pinyin.vue

@@ -10,7 +10,14 @@ defineOptions({
   <el-card shadow="never">
     <template #header>
       <div class="card-header">
-        <span class="font-medium">汉语拼音</span>
+        <p class="font-medium">汉语拼音</p>
+        <el-link
+          class="mt-2"
+          href="https://github.com/pure-admin/vue-pure-admin/blob/main/src/views/able/pinyin.vue"
+          target="_blank"
+        >
+          代码位置 src/views/able/pinyin.vue
+        </el-link>
       </div>
     </template>
     <p v-html="html('带 音 调')" />

+ 23 - 24
src/views/able/print/index.vue

@@ -81,25 +81,30 @@ const tableData: User[] = [
     <template #header>
       <div class="card-header">
         <span class="font-medium">打印功能(报表、图表、图片)</span>
-        <div class="flex">
-          <el-select
-            v-model="value"
-            class="!w-[100px] mr-2"
-            placeholder="Select"
-            size="small"
-          >
-            <el-option
-              v-for="item in options"
-              :key="item.value"
-              :label="item.label"
-              :value="item.value"
-            />
-          </el-select>
-          <el-button size="small" type="primary" @click="onPrint">
-            打印
-          </el-button>
-        </div>
+        <el-select
+          v-model="value"
+          class="!w-[100px] mr-2"
+          placeholder="Select"
+          size="small"
+        >
+          <el-option
+            v-for="item in options"
+            :key="item.value"
+            :label="item.label"
+            :value="item.value"
+          />
+        </el-select>
+        <el-button size="small" type="primary" @click="onPrint">
+          打印
+        </el-button>
       </div>
+      <el-link
+        class="mt-2"
+        href="https://github.com/pure-admin/vue-pure-admin/blob/main/src/views/able/print"
+        target="_blank"
+      >
+        代码位置 src/views/able/print
+      </el-link>
     </template>
     <el-row :gutter="24">
       <el-col
@@ -196,10 +201,4 @@ const tableData: User[] = [
 :deep(.el-table__row.success-row) {
   --el-table-tr-bg-color: var(--el-color-success-light-9);
 }
-
-.card-header {
-  display: flex;
-  align-items: center;
-  justify-content: space-between;
-}
 </style>

+ 7 - 0
src/views/able/qrcode.vue

@@ -36,6 +36,13 @@ const disabledClick = () => {
           </el-link>
           生成)
         </div>
+        <el-link
+          class="mt-2"
+          href="https://github.com/pure-admin/vue-pure-admin/blob/main/src/views/able/qrcode.vue"
+          target="_blank"
+        >
+          代码位置 src/views/able/qrcode.vue
+        </el-link>
       </template>
       <el-row :gutter="20" justify="space-between">
         <el-col :xl="6" :lg="6" :md="12" :sm="24" :xs="24">

+ 8 - 1
src/views/able/ripple.vue

@@ -7,7 +7,14 @@ defineOptions({
 <template>
   <el-card shadow="never">
     <template #header>
-      <div class="font-medium">波纹(Ripple)</div>
+      <p class="font-medium">波纹(Ripple)</p>
+      <el-link
+        class="mt-2"
+        href="https://github.com/pure-admin/vue-pure-admin/blob/main/src/views/able/ripple.vue"
+        target="_blank"
+      >
+        代码位置 src/views/able/ripple.vue
+      </el-link>
     </template>
     <div class="mb-5">组件中的波纹</div>
     <el-alert

+ 8 - 1
src/views/able/sensitive.vue

@@ -21,7 +21,14 @@ function onInput() {
   <el-card shadow="never">
     <template #header>
       <div class="card-header">
-        <span class="font-medium">敏感词过滤</span>
+        <p class="font-medium">敏感词过滤</p>
+        <el-link
+          class="mt-2"
+          href="https://github.com/pure-admin/vue-pure-admin/blob/main/src/views/able/sensitive.vue"
+          target="_blank"
+        >
+          代码位置 src/views/able/sensitive.vue
+        </el-link>
       </div>
     </template>
     <div class="flex flex-wrap gap-2 my-2">

+ 8 - 1
src/views/able/typeit.vue

@@ -14,7 +14,14 @@ const options: TypeItOptions = {
   <el-card shadow="never">
     <template #header>
       <div class="card-header">
-        <span class="font-medium"> 打字机组件 </span>
+        <p class="font-medium">打字机组件</p>
+        <el-link
+          class="mt-2"
+          href="https://github.com/pure-admin/vue-pure-admin/blob/main/src/views/able/typeit.vue"
+          target="_blank"
+        >
+          代码位置 src/views/able/typeit.vue
+        </el-link>
       </div>
     </template>
     <TypeIt :options="options" />

+ 8 - 3
src/views/able/verify.vue

@@ -17,16 +17,21 @@ function onFail() {
   <el-card shadow="never">
     <template #header>
       <div class="font-medium">
-        拼图人机验证、右滑拼图验证(
         <el-link
           href="https://github.com/javaLuo/vue-puzzle-vcode/tree/vue3"
           target="_blank"
           style="margin: 0 5px 4px 0; font-size: 16px"
         >
-          github地址
+          拼图人机验证、右滑拼图验证
         </el-link>
-        )
       </div>
+      <el-link
+        class="mt-2"
+        href="https://github.com/pure-admin/vue-pure-admin/blob/main/src/views/able/verify.vue"
+        target="_blank"
+      >
+        代码位置 src/views/able/verify.vue
+      </el-link>
     </template>
     <div class="bg-[rgba(15,23,42,0.2)] p-6 w-[360px]">
       <Vcode :show="isShow" type="inside" @fail="onFail" @success="onSuccess" />

+ 7 - 0
src/views/able/video-frame/index.vue

@@ -134,6 +134,13 @@ onBeforeUnmount(() => {
             工具,可以在浏览器内进行视频和音频录制、转换和流式传输等,不过通过一些实践,对于时长较长的视频性能还是不太行,不过用于时长较短的短视频还是可以上生产的
           </p>
         </span>
+        <el-link
+          class="mt-2"
+          href="https://github.com/pure-admin/vue-pure-admin/blob/main/src/views/able/video-frame"
+          target="_blank"
+        >
+          代码位置 src/views/able/video-frame
+        </el-link>
       </div>
     </template>
     <div class="flex flex-wrap">

+ 7 - 0
src/views/able/video.vue

@@ -48,6 +48,13 @@ onMounted(() => {
           </el-link>
         </span>
       </div>
+      <el-link
+        class="mt-2"
+        href="https://github.com/pure-admin/vue-pure-admin/blob/main/src/views/able/video.vue"
+        target="_blank"
+      >
+        代码位置 src/views/able/video.vue
+      </el-link>
     </template>
     <div id="mse" />
   </el-card>

+ 13 - 8
src/views/able/watermark.vue

@@ -36,16 +36,22 @@ onBeforeUnmount(() => {
     <template #header>
       <div class="card-header">
         <span class="font-medium">
-          页面水印
           <el-link
             href="https://pure-admin-utils.netlify.app/hooks/useWatermark/useWatermark"
             target="_blank"
             style="margin: 0 5px 4px 0; font-size: 16px"
           >
-            (查看更详细的使用文档)
+            页面水印
           </el-link>
         </span>
       </div>
+      <el-link
+        class="mt-2"
+        href="https://github.com/pure-admin/vue-pure-admin/blob/main/src/views/able/watermark.vue"
+        target="_blank"
+      >
+        代码位置 src/views/able/watermark.vue
+      </el-link>
     </template>
     <el-space wrap class="!mb-2">
       <span> 请输入要创建水印的值:</span>
@@ -120,9 +126,7 @@ onBeforeUnmount(() => {
       <el-button plain @click="clear">清除整页水印</el-button>
     </el-space>
 
-    <el-divider />
-
-    <div ref="local" class="w-1/2 h-[200px] border border-sky-500" />
+    <div ref="local" class="w-1/2 h-[200px] border border-sky-500 mt-4" />
 
     <el-space wrap class="mt-6">
       <el-button
@@ -190,8 +194,9 @@ onBeforeUnmount(() => {
       <el-button plain @click="clearLocal">清除局部水印</el-button>
     </el-space>
 
-    <el-divider />
-
-    <div ref="preventLocal" class="w-1/2 h-[200px] border border-indigo-500" />
+    <div
+      ref="preventLocal"
+      class="w-1/2 h-[200px] border border-indigo-500 mt-4"
+    />
   </el-card>
 </template>

+ 7 - 0
src/views/able/wavesurfer/index.vue

@@ -93,6 +93,13 @@ onBeforeUnmount(() => {
           </span>
         </span>
       </div>
+      <el-link
+        class="mt-2"
+        href="https://github.com/pure-admin/vue-pure-admin/blob/main/src/views/able/wavesurfer"
+        target="_blank"
+      >
+        代码位置 src/views/able/wavesurfer
+      </el-link>
     </template>
     <div
       v-loading="loading"

+ 7 - 0
src/views/components/animatecss.vue

@@ -28,6 +28,13 @@ watch(animate, () => {
           选择器
         </span>
       </div>
+      <el-link
+        class="mt-2"
+        href="https://github.com/pure-admin/vue-pure-admin/blob/main/src/views/components/animatecss.vue"
+        target="_blank"
+      >
+        代码位置 src/views/components/animatecss.vue
+      </el-link>
     </template>
     <ReAnimateSelector v-model="animate" class="!w-[200px]" />
   </el-card>

+ 7 - 0
src/views/components/button.vue

@@ -16,6 +16,13 @@ const url = ref(`${VITE_PUBLIC_PATH}html/button.html`);
       <div class="card-header">
         <span class="font-medium">通过 iframe 引入按钮页面</span>
       </div>
+      <el-link
+        class="mt-2"
+        href="https://github.com/pure-admin/vue-pure-admin/blob/main/src/views/components/button.vue"
+        target="_blank"
+      >
+        代码位置 src/views/components/button.vue
+      </el-link>
     </template>
     <iframe :src="url" frameborder="0" class="iframe w-full h-[60vh]" />
   </el-card>

+ 10 - 1
src/views/components/cascader.vue

@@ -25,7 +25,16 @@ const handleChange = value => {
 
 <template>
   <el-card shadow="never">
-    <template #header> <p class="font-medium">区域级联选择器</p> </template>
+    <template #header>
+      <p class="font-medium">区域级联选择器</p>
+      <el-link
+        class="mt-2"
+        href="https://github.com/pure-admin/vue-pure-admin/blob/main/src/views/components/cascader.vue"
+        target="_blank"
+      >
+        代码位 src/views/components/cascader.vue
+      </el-link>
+    </template>
     <el-row :gutter="24">
       <el-col :xl="12" :lg="12" :md="24" :sm="24" :xs="24">
         <div class="flex flex-col items-center justify-center">

+ 8 - 1
src/views/components/check-button.vue

@@ -93,7 +93,7 @@ watch(size, val =>
       <div class="card-header">
         <el-space wrap :size="40">
           <span style="font-size: 16px; font-weight: 800"> 可选按钮 </span>
-          <el-radio-group v-model="size" size="small">
+          <el-radio-group v-model="size">
             <el-radio value="large">大尺寸</el-radio>
             <el-radio value="default">默认尺寸</el-radio>
             <el-radio value="small">小尺寸</el-radio>
@@ -101,6 +101,13 @@ watch(size, val =>
           </el-radio-group>
         </el-space>
       </div>
+      <el-link
+        class="mt-2"
+        href="https://github.com/pure-admin/vue-pure-admin/blob/main/src/views/components/check-button.vue"
+        target="_blank"
+      >
+        代码位置 src/views/components/check-button.vue
+      </el-link>
     </template>
     <p class="mb-2">单选(紧凑风格的按钮样式)</p>
     <el-radio-group

+ 8 - 1
src/views/components/check-card.vue

@@ -52,7 +52,7 @@ watch(size, val =>
           >
             多选卡片组
           </el-link>
-          <el-radio-group v-model="size" size="small">
+          <el-radio-group v-model="size">
             <el-radio value="large">大尺寸</el-radio>
             <el-radio value="default">默认尺寸</el-radio>
             <el-radio value="small">小尺寸</el-radio>
@@ -60,6 +60,13 @@ watch(size, val =>
           </el-radio-group>
         </el-space>
       </div>
+      <el-link
+        class="mt-2"
+        href="https://github.com/pure-admin/vue-pure-admin/blob/main/src/views/components/check-card.vue"
+        target="_blank"
+      >
+        代码位置 src/views/components/check-card.vue
+      </el-link>
     </template>
 
     <p class="mb-2 mt-4">单选</p>

+ 7 - 0
src/views/components/collapse.vue

@@ -41,6 +41,13 @@ const handleChange = (val: string[]) => {
           </el-link>
         </el-space>
       </div>
+      <el-link
+        class="mt-2"
+        href="https://github.com/pure-admin/vue-pure-admin/blob/main/src/views/components/collapse.vue"
+        target="_blank"
+      >
+        代码位 src/views/components/collapse.vue
+      </el-link>
     </template>
 
     <p class="mb-2">基础用法</p>

+ 8 - 1
src/views/components/color-picker.vue

@@ -56,7 +56,7 @@ function onClick() {
           >
             颜色选择器
           </el-link>
-          <el-radio-group v-model="size" size="small">
+          <el-radio-group v-model="size">
             <el-radio value="large">大尺寸</el-radio>
             <el-radio value="default">默认尺寸</el-radio>
             <el-radio value="small">小尺寸</el-radio>
@@ -64,6 +64,13 @@ function onClick() {
           </el-radio-group>
         </el-space>
       </div>
+      <el-link
+        class="mt-2"
+        href="https://github.com/pure-admin/vue-pure-admin/blob/main/src/views/components/color-picker.vue"
+        target="_blank"
+      >
+        代码位置 src/views/components/color-picker.vue
+      </el-link>
     </template>
 
     <p class="mb-2">不同尺寸、选择透明度、预定义颜色</p>

+ 8 - 1
src/views/components/contextmenu/index.vue

@@ -13,7 +13,14 @@ defineOptions({
   <el-card shadow="never">
     <template #header>
       <div class="card-header">
-        <span class="font-medium">右键菜单</span>
+        <p class="font-medium">右键菜单</p>
+        <el-link
+          class="mt-2"
+          href="https://github.com/pure-admin/vue-pure-admin/blob/main/src/views/components/contextmenu"
+          target="_blank"
+        >
+          代码位置 src/views/components/contextmenu
+        </el-link>
       </div>
     </template>
     <el-row :gutter="24">

+ 8 - 1
src/views/components/count-to.vue

@@ -10,7 +10,14 @@ defineOptions({
   <el-card shadow="never">
     <template #header>
       <div class="card-header">
-        <span class="font-medium">数字动画</span>
+        <p class="font-medium">数字动画</p>
+        <el-link
+          class="mt-2"
+          href="https://github.com/pure-admin/vue-pure-admin/blob/main/src/views/components/count-to.vue"
+          target="_blank"
+        >
+          代码位置 src/views/components/count-to.vue
+        </el-link>
       </div>
     </template>
     <ReNormalCountTo

+ 7 - 0
src/views/components/cropping/index.vue

@@ -41,6 +41,13 @@ onBeforeUnmount(() => {
           进行二次封装(提示:右键下面左侧裁剪区可开启功能菜单)
         </span>
       </div>
+      <el-link
+        class="mt-2"
+        href="https://github.com/pure-admin/vue-pure-admin/blob/main/src/views/components/cropping"
+        target="_blank"
+      >
+        代码位置 src/views/components/cropping
+      </el-link>
     </template>
     <div v-loading="!showPopover" element-loading-background="transparent">
       <el-popover

+ 8 - 1
src/views/components/date-picker.vue

@@ -143,7 +143,7 @@ watch(size, val =>
           >
             日期选择器
           </el-link>
-          <el-radio-group v-model="size" size="small">
+          <el-radio-group v-model="size">
             <el-radio value="large">大尺寸</el-radio>
             <el-radio value="default">默认尺寸</el-radio>
             <el-radio value="small">小尺寸</el-radio>
@@ -151,6 +151,13 @@ watch(size, val =>
           </el-radio-group>
         </el-space>
       </div>
+      <el-link
+        class="mt-2"
+        href="https://github.com/pure-admin/vue-pure-admin/blob/main/src/views/components/date-picker.vue"
+        target="_blank"
+      >
+        代码位置 src/views/components/date-picker.vue
+      </el-link>
     </template>
 
     <p class="mb-2">选择某一天</p>

+ 8 - 1
src/views/components/datetime-picker.vue

@@ -169,7 +169,7 @@ watch(size, val =>
           >
             日期时间选择器
           </el-link>
-          <el-radio-group v-model="size" size="small">
+          <el-radio-group v-model="size">
             <el-radio value="large">大尺寸</el-radio>
             <el-radio value="default">默认尺寸</el-radio>
             <el-radio value="small">小尺寸</el-radio>
@@ -177,6 +177,13 @@ watch(size, val =>
           </el-radio-group>
         </el-space>
       </div>
+      <el-link
+        class="mt-2"
+        href="https://github.com/pure-admin/vue-pure-admin/blob/main/src/views/components/datetime-picker.vue"
+        target="_blank"
+      >
+        代码位置 src/views/components/datetime-picker.vue
+      </el-link>
     </template>
 
     <p class="mb-2">日期和时间点</p>

+ 7 - 1
src/views/components/dialog/index.vue

@@ -447,7 +447,7 @@ function onBeforeSureClick() {
     <template #header>
       <div class="card-header">
         <span class="font-medium">
-          二次封装 element-plus 的
+          二次封装 Element Plus 的
           <el-link
             href="https://element-plus.org/zh-CN/component/dialog.html"
             target="_blank"
@@ -465,6 +465,12 @@ function onBeforeSureClick() {
         </span>
       </div>
+      <el-link
+        href="https://github.com/pure-admin/vue-pure-admin/tree/main/src/views/components/dialog"
+        target="_blank"
+      >
+        代码位置 src/views/components/dialog
+      </el-link>
     </template>
     <el-space wrap>
       <el-button @click="onBaseClick"> 基础用法 </el-button>

+ 8 - 1
src/views/components/el-button.vue

@@ -67,7 +67,7 @@ watch(size, val =>
           >
             Button 按钮
           </el-link>
-          <el-radio-group v-model="size" size="small">
+          <el-radio-group v-model="size">
             <el-radio value="large">大尺寸</el-radio>
             <el-radio value="default">默认尺寸</el-radio>
             <el-radio value="small">小尺寸</el-radio>
@@ -75,6 +75,13 @@ watch(size, val =>
           </el-radio-group>
         </el-space>
       </div>
+      <el-link
+        class="mt-2"
+        href="https://github.com/pure-admin/vue-pure-admin/blob/main/src/views/components/el-button.vue"
+        target="_blank"
+      >
+        代码位置 src/views/components/el-button.vue
+      </el-link>
     </template>
 
     <p class="mb-2">基础按钮</p>

+ 7 - 0
src/views/components/icon-select.vue

@@ -15,6 +15,13 @@ const icon = ref("ep:add-location");
       <div class="card-header">
         <span class="font-medium">图标选择器</span>
       </div>
+      <el-link
+        class="mt-2"
+        href="https://github.com/pure-admin/vue-pure-admin/blob/main/src/views/components/icon-select.vue"
+        target="_blank"
+      >
+        代码位置 src/views/components/icon-select.vue
+      </el-link>
     </template>
     <IconSelect v-model="icon" class="w-[200px]" />
   </el-card>

+ 7 - 0
src/views/components/json-editor.vue

@@ -97,6 +97,13 @@ watch(
           </el-link>
         </span>
       </div>
+      <el-link
+        class="mt-2"
+        href="https://github.com/pure-admin/vue-pure-admin/blob/main/src/views/components/json-editor.vue"
+        target="_blank"
+      >
+        代码位置 src/views/components/json-editor.vue
+      </el-link>
     </template>
     <vue-json-pretty
       v-model:data="state.data"

+ 8 - 1
src/views/components/message.vue

@@ -16,9 +16,16 @@ defineOptions({
       <div class="card-header">
         <span class="font-medium"> 消息提示 </span>
       </div>
+      <el-link
+        class="mt-2"
+        href="https://github.com/pure-admin/vue-pure-admin/blob/main/src/views/components/message.vue"
+        target="_blank"
+      >
+        代码位置 src/views/components/message.vue
+      </el-link>
     </template>
 
-    <h4 class="mb-4">element-plus 的消息提示,点击弹出提示信息</h4>
+    <h4 class="mb-4">Element Plus 的消息提示,点击弹出提示信息</h4>
 
     <el-space wrap>
       <el-button

+ 7 - 0
src/views/components/progress.vue

@@ -23,6 +23,13 @@ const format = percentage => (percentage === 100 ? "Full" : `${percentage}%`);
           进度条
         </el-link>
       </div>
+      <el-link
+        class="mt-2"
+        href="https://github.com/pure-admin/vue-pure-admin/blob/main/src/views/components/progress.vue"
+        target="_blank"
+      >
+        代码位置 src/views/components/progress.vue
+      </el-link>
     </template>
 
     <p class="mb-4">直线进度条动画</p>

+ 7 - 0
src/views/components/seamless-scroll.vue

@@ -105,6 +105,13 @@ function changeDirection(val) {
             </span>
           </el-button>
         </div>
+        <el-link
+          class="mt-2"
+          href="https://github.com/pure-admin/vue-pure-admin/blob/main/src/views/components/seamless-scroll.vue"
+          target="_blank"
+        >
+          代码位置 src/views/components/seamless-scroll.vue
+        </el-link>
       </template>
       <SeamlessScroll
         ref="scroll"

+ 8 - 1
src/views/components/segmented.vue

@@ -204,13 +204,20 @@ watch(size, val => (dynamicSize.value = size.value));
       <div class="card-header">
         <el-space wrap :size="40">
           <span style="font-size: 16px; font-weight: 800"> 分段控制器 </span>
-          <el-radio-group v-model="size" size="small">
+          <el-radio-group v-model="size">
             <el-radio value="large">大尺寸</el-radio>
             <el-radio value="default">默认尺寸</el-radio>
             <el-radio value="small">小尺寸</el-radio>
           </el-radio-group>
         </el-space>
       </div>
+      <el-link
+        class="mt-2"
+        href="https://github.com/pure-admin/vue-pure-admin/blob/main/src/views/components/segmented.vue"
+        target="_blank"
+      >
+        代码位置 src/views/components/segmented.vue
+      </el-link>
     </template>
     <el-scrollbar>
       <p class="mb-2">

+ 8 - 1
src/views/components/selector.vue

@@ -34,7 +34,14 @@ const selectedVal = ({ left, right }): void => {
       shadow="never"
     >
       <template #header>
-        <span class="font-medium">{{ item.title }}</span>
+        <p class="font-medium">{{ item.title }}</p>
+        <el-link
+          class="mt-2"
+          href="https://github.com/pure-admin/vue-pure-admin/blob/main/src/views/components/selector.vue"
+          target="_blank"
+        >
+          代码位置 src/views/components/selector.vue
+        </el-link>
       </template>
       <Selector
         :HsKey="key"

+ 9 - 2
src/views/components/split-pane.vue

@@ -23,7 +23,14 @@ const settingTB: ContextProps = reactive({
   <el-card shadow="never">
     <template #header>
       <div class="card-header">
-        <span class="font-medium">切割面板</span>
+        <p class="font-medium">切割面板</p>
+        <el-link
+          class="mt-2"
+          href="https://github.com/pure-admin/vue-pure-admin/blob/main/src/views/components/split-pane.vue"
+          target="_blank"
+        >
+          代码位置 src/views/components/split-pane.vue
+        </el-link>
       </div>
     </template>
     <div class="split-pane">
@@ -57,7 +64,7 @@ const settingTB: ContextProps = reactive({
 <style lang="scss" scoped>
 .split-pane {
   width: 100%;
-  height: calc(100vh - 260px);
+  height: calc(100vh - 300px);
   font-size: 50px;
   text-align: center;
   border: 1px solid #e5e6eb;

+ 7 - 0
src/views/components/statistic.vue

@@ -39,6 +39,13 @@ function reset() {
             统计组件
           </el-link>
         </div>
+        <el-link
+          class="mt-2"
+          href="https://github.com/pure-admin/vue-pure-admin/blob/main/src/views/components/statistic.vue"
+          target="_blank"
+        >
+          代码位 src/views/components/statistic.vue
+        </el-link>
       </template>
 
       <el-row :gutter="24">

Niektoré súbory nie sú zobrazené, pretože je v týchto rozdielových dátach zmenené mnoho súborov