Parcourir la source

删除不重要的页面

xiaodai2017 il y a 2 ans
Parent
commit
0407fffc99
69 fichiers modifiés avec 463 ajouts et 5891 suppressions
  1. 1 13
      build/plugins.ts
  2. 0 213
      mock/asyncRoutes.ts
  3. 0 455
      mock/list.ts
  4. 0 37
      mock/map.ts
  5. 0 288
      mock/system.ts
  6. 0 4
      package.json
  7. 452 303
      pnpm-lock.yaml
  8. 0 16
      src/components/ReMap/src/Amap.vue
  9. 3 3
      src/layout/components/navbar.vue
  10. 3 3
      src/layout/components/sidebar/horizontal.vue
  11. 3 3
      src/layout/components/sidebar/mixNav.vue
  12. 0 12
      src/mockProdServer.ts
  13. 1 8
      src/utils/http/index.ts
  14. 0 72
      src/views/able/ant-anchor.vue
  15. 0 56
      src/views/able/ant-tabs.vue
  16. 0 219
      src/views/able/ant-treeSelect.vue
  17. 0 63
      src/views/able/barcode.vue
  18. 0 158
      src/views/able/cascader.vue
  19. 0 56
      src/views/able/debounce.vue
  20. 0 101
      src/views/able/execl.vue
  21. 0 22
      src/views/able/icon-select.vue
  22. 0 96
      src/views/able/line-tree.vue
  23. 0 81
      src/views/able/menu-tree.vue
  24. 0 114
      src/views/able/pdf.vue
  25. 0 328
      src/views/able/print.vue
  26. 0 120
      src/views/able/qrcode.vue
  27. 0 141
      src/views/able/swiper.vue
  28. 0 105
      src/views/able/timeline.vue
  29. 0 70
      src/views/able/virtual-list/data.ts
  30. 0 138
      src/views/able/virtual-list/horizontal.vue
  31. 0 30
      src/views/able/virtual-list/index.vue
  32. 0 124
      src/views/able/virtual-list/vertical.vue
  33. 0 38
      src/views/able/watermark.vue
  34. 0 67
      src/views/about/columns.tsx
  35. 0 106
      src/views/about/index.vue
  36. 0 30
      src/views/components/button/index.vue
  37. 0 74
      src/views/components/contextmenu/basic.vue
  38. 0 33
      src/views/components/contextmenu/index.vue
  39. 0 110
      src/views/components/contextmenu/menuDynamic.vue
  40. 0 71
      src/views/components/contextmenu/menuGroup.vue
  41. 0 47
      src/views/components/count-to/index.vue
  42. 0 63
      src/views/components/cropping/index.vue
  43. BIN
      src/views/components/cropping/picture.jpeg
  44. 0 220
      src/views/components/draggable/index.vue
  45. 0 17
      src/views/components/map/index.vue
  46. 0 159
      src/views/components/seamless-scroll/index.vue
  47. 0 51
      src/views/components/selector/index.vue
  48. 0 87
      src/views/components/split-pane/index.vue
  49. 0 57
      src/views/components/video/index.vue
  50. 0 71
      src/views/editor/index.vue
  51. 0 30
      src/views/form-design/index.vue
  52. 0 96
      src/views/guide/index.vue
  53. 0 175
      src/views/list/card/components/Card.vue
  54. 0 147
      src/views/list/card/components/DialogForm.vue
  55. 0 175
      src/views/list/card/index.vue
  56. 0 17
      src/views/nested/menu1/menu1-1/index.vue
  57. 0 18
      src/views/nested/menu1/menu1-2/menu1-2-1/index.vue
  58. 0 18
      src/views/nested/menu1/menu1-2/menu1-2-2/index.vue
  59. 0 17
      src/views/nested/menu1/menu1-3/index.vue
  60. 0 16
      src/views/nested/menu2/index.vue
  61. 0 36
      src/views/permission/button/index.vue
  62. 0 53
      src/views/permission/page/index.vue
  63. 0 66
      src/views/result/columns.tsx
  64. 0 39
      src/views/result/fail.vue
  65. 0 92
      src/views/result/success.vue
  66. 0 14
      src/views/tabs/detail.vue
  67. 0 32
      src/views/tabs/hooks.ts
  68. 0 96
      src/views/tabs/index.vue
  69. 0 1
      tsconfig.json

+ 1 - 13
build/plugins.ts

@@ -5,7 +5,6 @@ import { viteBuildInfo } from "./info";
 import svgLoader from "vite-svg-loader";
 import legacy from "@vitejs/plugin-legacy";
 import vueJsx from "@vitejs/plugin-vue-jsx";
-import { viteMockServe } from "vite-plugin-mock";
 import VueI18n from "@intlify/vite-plugin-vue-i18n";
 import { visualizer } from "rollup-plugin-visualizer";
 import removeConsole from "vite-plugin-remove-console";
@@ -14,7 +13,6 @@ import { genScssMultipleScopeVars } from "/@/layout/theme";
 import DefineOptions from "unplugin-vue-define-options/vite";
 
 export function getPluginsList(command, VITE_LEGACY) {
-  const prodMock = true;
   const lifecycle = process.env.npm_lifecycle_event;
   return [
     vue(),
@@ -47,17 +45,7 @@ export function getPluginsList(command, VITE_LEGACY) {
     }),
     // svg组件化支持
     svgLoader(),
-    // mock支持
-    viteMockServe({
-      mockPath: "mock",
-      localEnabled: command === "serve",
-      prodEnabled: command !== "serve" && prodMock,
-      injectCode: `
-          import { setupProdMockServer } from './mockProdServer';
-          setupProdMockServer();
-        `,
-      logger: false
-    }),
+
     // 是否为打包后的文件提供传统浏览器兼容性支持
     VITE_LEGACY
       ? legacy({

+ 0 - 213
mock/asyncRoutes.ts

@@ -1,213 +0,0 @@
-// 根据角色动态生成路由
-import { MockMethod } from "vite-plugin-mock";
-
-// http://mockjs.com/examples.html#Object
-const systemRouter = {
-  path: "/system",
-  redirect: "/system/menuOperator/index",
-  meta: {
-    icon: "setting",
-    title: "系统管理",
-    rank: 11
-  },
-  children: [
-    {
-      path: "/system/menuOperator/index",
-      name: "menuOperator",
-      meta: {
-        icon: "flUser",
-        title: "用户管理"
-      }
-    },
-    {
-      path: "/system/oplog/index",
-      name: "oplog",
-      meta: {
-        icon: "role",
-        title: "角色管理"
-      }
-    },
-    {
-      path: "/system/updates/index",
-      name: "updates",
-      meta: {
-        icon: "dept",
-        title: "部门管理"
-      }
-    }
-  ]
-};
-const interestRouter = {
-  path: "/interest",
-  redirect: "/interest/account/index",
-  meta: {
-    icon: "setting",
-    title: "权限管理",
-    rank: 11
-  },
-  children: [
-    {
-      path: "/interest/account/index",
-      name: "account",
-      meta: {
-        icon: "flUser",
-        title: "用户管理"
-      }
-    },
-    {
-      path: "/interest/role/index",
-      name: "role",
-      meta: {
-        icon: "role",
-        title: "角色管理"
-      }
-    },
-    {
-      path: "/interest/action/index",
-      name: "action",
-      meta: {
-        icon: "dept",
-        title: "部门管理"
-      }
-    },
-    {
-      path: "/interest/dataShare/index",
-      name: "dataShare",
-      meta: {
-        icon: "dict",
-        title: "字典管理"
-      }
-    },
-    {
-      path: "/interest/group/index",
-      name: "group",
-      meta: {
-        icon: "dict",
-        title: "字典管理"
-      }
-    }
-  ]
-};
-const permissionRouter = {
-  path: "/permission",
-  redirect: "/permission/page/index",
-  meta: {
-    title: "权限管理",
-    icon: "lollipop",
-    rank: 7
-  },
-  children: [
-    {
-      path: "/permission/page/index",
-      name: "PermissionPage",
-      meta: {
-        title: "权限管理Page"
-      }
-    },
-    {
-      path: "/permission/button/index",
-      name: "PermissionButton",
-      meta: {
-        title: "权限管理Button",
-        authority: []
-      }
-    }
-  ]
-};
-
-const frameRouter = {
-  path: "/iframe",
-  redirect: "/iframe/pure",
-  meta: {
-    icon: "monitor",
-    title: "外部页面",
-    rank: 10
-  },
-  children: [
-    {
-      path: "/iframe/pure",
-      name: "FramePure",
-      meta: {
-        title: "平台文档(内嵌)",
-        frameSrc: "https://pure-admin-doc.vercel.app"
-      }
-    },
-    {
-      path: "/external",
-      name: "https://pure-admin-doc.vercel.app",
-      meta: {
-        title: "平台文档(外链)"
-      }
-    },
-    {
-      path: "/iframe/ep",
-      name: "FrameEp",
-      meta: {
-        title: "Element Plus文档(内嵌)",
-        frameSrc: "https://element-plus.org/zh-CN/"
-      }
-    }
-  ]
-};
-
-const tabsRouter = {
-  path: "/tabs",
-  redirect: "/tabs/index",
-  meta: {
-    icon: "IF-team-icontabs",
-    title: "标签页操作",
-    rank: 13
-  },
-  children: [
-    {
-      path: "/tabs/index",
-      name: "Tabs",
-      meta: {
-        title: "标签页操作"
-      }
-    },
-    {
-      path: "/tabs/detail",
-      name: "TabDetail",
-      meta: {
-        title: "",
-        showLink: false,
-        dynamicLevel: 3,
-        refreshRedirect: "/tabs/index"
-      }
-    }
-  ]
-};
-
-// 添加不同按钮权限到/permission/button页面中
-function setDifAuthority(authority, routes) {
-  console.log(routes.children);
-  routes.children[1].meta.authority = [authority];
-  return routes;
-}
-
-export default [
-  {
-    url: "/getAsyncRoutes",
-    method: "get",
-    response: ({ query }) => {
-      if (query.name === "admin") {
-        return {
-          code: 0,
-          info: [
-            tabsRouter,
-            frameRouter,
-            systemRouter,
-            interestRouter,
-            setDifAuthority("v-admin", permissionRouter)
-          ]
-        };
-      } else {
-        return {
-          code: 0,
-          info: [tabsRouter, setDifAuthority("v-test", permissionRouter)]
-        };
-      }
-    }
-  }
-] as MockMethod[];

+ 0 - 455
mock/list.ts

@@ -1,455 +0,0 @@
-import { MockMethod } from "vite-plugin-mock";
-
-export default [
-  {
-    url: "/getCardList",
-    method: "post",
-    response: () => {
-      return {
-        code: 0,
-        data: {
-          list: [
-            {
-              index: 1,
-              isSetup: true,
-              type: 4,
-              banner: "https://tdesign.gtimg.com/tdesign-pro/cloud-server.jpg",
-              name: "SSL证书",
-              description:
-                "SSL证书又叫服务器证书,腾讯云为您提供证书的一站式服务,包括免费、付费证书的申请、管理及部"
-            },
-            {
-              index: 2,
-              isSetup: false,
-              type: 4,
-              banner: "https://tdesign.gtimg.com/tdesign-pro/t-sec.jpg",
-              name: "人脸识别",
-              description:
-                "SSL证书又叫服务器证书,腾讯云为您提供证书的一站式服务,包括免费、付费证书的申请、管理及部"
-            },
-            {
-              index: 3,
-              isSetup: false,
-              type: 5,
-              banner: "https://tdesign.gtimg.com/tdesign-pro/ssl.jpg",
-              name: "CVM",
-              description:
-                "云硬盘为您提供用于CVM的持久性数据块级存储服务。云硬盘中的数据自动地可用区内以多副本冗"
-            },
-            {
-              index: 4,
-              isSetup: false,
-              type: 2,
-              banner: "https://tdesign.gtimg.com/tdesign-pro/ssl.jpg",
-              name: "SSL证书",
-              description:
-                "云数据库MySQL为用户提供安全可靠,性能卓越、易于维护的企业级云数据库服务。"
-            },
-            {
-              index: 5,
-              isSetup: true,
-              type: 3,
-              banner:
-                "https://tdesign.gtimg.com/tdesign-pro/face-recognition.jpg",
-              name: "SSL证书",
-              description:
-                "云数据库MySQL为用户提供安全可靠,性能卓越、易于维护的企业级云数据库服务。"
-            },
-            {
-              index: 6,
-              isSetup: true,
-              type: 3,
-              banner: "https://tdesign.gtimg.com/tdesign-pro/ssl.jpg",
-              name: "T-Sec 云防火墙",
-              description:
-                "腾讯安全云防火墙产品,是腾讯云安全团队结合云原生的优势,自主研发的SaaS化防火墙产品,无需客无需客无需客无需客无需客无需客无需客"
-            },
-            {
-              index: 7,
-              isSetup: false,
-              type: 1,
-              banner: "https://tdesign.gtimg.com/tdesign-pro/t-sec.jpg",
-              name: "CVM",
-              description:
-                "腾讯安全云防火墙产品,是腾讯云安全团队结合云原生的优势,自主研发的SaaS化防火墙产品,无需客无需客无需客无需客无需客无需客无需客"
-            },
-            {
-              index: 8,
-              isSetup: true,
-              type: 3,
-              banner: "https://tdesign.gtimg.com/tdesign-pro/t-sec.jpg",
-              name: "SSL证书",
-              description:
-                "云硬盘为您提供用于CVM的持久性数据块级存储服务。云硬盘中的数据自动地可用区内以多副本冗"
-            },
-            {
-              index: 9,
-              isSetup: false,
-              type: 1,
-              banner: "https://tdesign.gtimg.com/tdesign-pro/cloud-server.jpg",
-              name: "SSL证书",
-              description:
-                "腾讯安全云防火墙产品,是腾讯云安全团队结合云原生的优势,自主研发的SaaS化防火墙产品,无需客无需客无需客无需客无需客无需客无需客"
-            },
-            {
-              index: 10,
-              isSetup: true,
-              type: 4,
-              banner: "https://tdesign.gtimg.com/tdesign-pro/ssl.jpg",
-              name: "CVM",
-              description:
-                "云数据库MySQL为用户提供安全可靠,性能卓越、易于维护的企业级云数据库服务。"
-            },
-            {
-              index: 11,
-              isSetup: true,
-              type: 5,
-              banner: "https://tdesign.gtimg.com/tdesign-pro/t-sec.jpg",
-              name: "云数据库",
-              description:
-                "SSL证书又叫服务器证书,腾讯云为您提供证书的一站式服务,包括免费、付费证书的申请、管理及部"
-            },
-            {
-              index: 12,
-              isSetup: true,
-              type: 2,
-              banner: "https://tdesign.gtimg.com/tdesign-pro/t-sec.jpg",
-              name: "SSL证书",
-              description:
-                "SSL证书又叫服务器证书,腾讯云为您提供证书的一站式服务,包括免费、付费证书的申请、管理及部"
-            },
-            {
-              index: 13,
-              isSetup: true,
-              type: 3,
-              banner: "https://tdesign.gtimg.com/tdesign-pro/cloud-db.jpg",
-              name: "云数据库",
-              description:
-                "腾讯安全云防火墙产品,是腾讯云安全团队结合云原生的优势,自主研发的SaaS化防火墙产品,无需客无需客无需客无需客无需客无需客无需客"
-            },
-            {
-              index: 14,
-              isSetup: false,
-              type: 5,
-              banner: "https://tdesign.gtimg.com/tdesign-pro/t-sec.jpg",
-              name: "SSL证书",
-              description:
-                "基于腾讯优图强大的面部分析技术,提供包括人脸检测与分析、五官定位、人脸搜索、人脸比对、人脸"
-            },
-            {
-              index: 15,
-              isSetup: true,
-              type: 2,
-              banner: "https://tdesign.gtimg.com/tdesign-pro/t-sec.jpg",
-              name: "云数据库",
-              description:
-                "SSL证书又叫服务器证书,腾讯云为您提供证书的一站式服务,包括免费、付费证书的申请、管理及部"
-            },
-            {
-              index: 16,
-              isSetup: false,
-              type: 3,
-              banner: "https://tdesign.gtimg.com/tdesign-pro/cloud-server.jpg",
-              name: "CVM",
-              description:
-                "基于腾讯优图强大的面部分析技术,提供包括人脸检测与分析、五官定位、人脸搜索、人脸比对、人脸"
-            },
-            {
-              index: 17,
-              isSetup: false,
-              type: 5,
-              banner:
-                "https://tdesign.gtimg.com/tdesign-pro/face-recognition.jpg",
-              name: "云数据库",
-              description:
-                "SSL证书又叫服务器证书,腾讯云为您提供证书的一站式服务,包括免费、付费证书的申请、管理及部"
-            },
-            {
-              index: 18,
-              isSetup: false,
-              type: 4,
-              banner:
-                "https://tdesign.gtimg.com/tdesign-pro/face-recognition.jpg",
-              name: "云数据库",
-              description:
-                "腾讯安全云防火墙产品,是腾讯云安全团队结合云原生的优势,自主研发的SaaS化防火墙产品,无需客无需客无需客无需客无需客无需客无需客"
-            },
-            {
-              index: 19,
-              isSetup: true,
-              type: 2,
-              banner: "https://tdesign.gtimg.com/tdesign-pro/ssl.jpg",
-              name: "CVM",
-              description:
-                "SSL证书又叫服务器证书,腾讯云为您提供证书的一站式服务,包括免费、付费证书的申请、管理及部"
-            },
-            {
-              index: 20,
-              isSetup: true,
-              type: 4,
-              banner:
-                "https://tdesign.gtimg.com/tdesign-pro/face-recognition.jpg",
-              name: "SSL证书",
-              description:
-                "SSL证书又叫服务器证书,腾讯云为您提供证书的一站式服务,包括免费、付费证书的申请、管理及部"
-            },
-            {
-              index: 21,
-              isSetup: false,
-              type: 4,
-              banner: "https://tdesign.gtimg.com/tdesign-pro/t-sec.jpg",
-              name: "云数据库",
-              description:
-                "云硬盘为您提供用于CVM的持久性数据块级存储服务。云硬盘中的数据自动地可用区内以多副本冗"
-            },
-            {
-              index: 22,
-              isSetup: false,
-              type: 3,
-              banner: "https://tdesign.gtimg.com/tdesign-pro/cloud-db.jpg",
-              name: "CVM",
-              description:
-                "SSL证书又叫服务器证书,腾讯云为您提供证书的一站式服务,包括免费、付费证书的申请、管理及部"
-            },
-            {
-              index: 23,
-              isSetup: true,
-              type: 1,
-              banner: "https://tdesign.gtimg.com/tdesign-pro/ssl.jpg",
-              name: "人脸识别",
-              description:
-                "基于腾讯优图强大的面部分析技术,提供包括人脸检测与分析、五官定位、人脸搜索、人脸比对、人脸"
-            },
-            {
-              index: 24,
-              isSetup: true,
-              type: 4,
-              banner: "https://tdesign.gtimg.com/tdesign-pro/ssl.jpg",
-              name: "人脸识别",
-              description:
-                "基于腾讯优图强大的面部分析技术,提供包括人脸检测与分析、五官定位、人脸搜索、人脸比对、人脸"
-            },
-            {
-              index: 25,
-              isSetup: false,
-              type: 5,
-              banner:
-                "https://tdesign.gtimg.com/tdesign-pro/face-recognition.jpg",
-              name: "CVM",
-              description:
-                "云硬盘为您提供用于CVM的持久性数据块级存储服务。云硬盘中的数据自动地可用区内以多副本冗"
-            },
-            {
-              index: 26,
-              isSetup: true,
-              type: 4,
-              banner: "https://tdesign.gtimg.com/tdesign-pro/cloud-server.jpg",
-              name: "SSL证书",
-              description:
-                "云硬盘为您提供用于CVM的持久性数据块级存储服务。云硬盘中的数据自动地可用区内以多副本冗"
-            },
-            {
-              index: 27,
-              isSetup: true,
-              type: 5,
-              banner: "https://tdesign.gtimg.com/tdesign-pro/ssl.jpg",
-              name: "CVM",
-              description:
-                "SSL证书又叫服务器证书,腾讯云为您提供证书的一站式服务,包括免费、付费证书的申请、管理及部"
-            },
-            {
-              index: 28,
-              isSetup: false,
-              type: 4,
-              banner: "https://tdesign.gtimg.com/tdesign-pro/ssl.jpg",
-              name: "云数据库",
-              description:
-                "基于腾讯优图强大的面部分析技术,提供包括人脸检测与分析、五官定位、人脸搜索、人脸比对、人脸"
-            },
-            {
-              index: 29,
-              isSetup: false,
-              type: 5,
-              banner: "https://tdesign.gtimg.com/tdesign-pro/cloud-db.jpg",
-              name: "CVM",
-              description:
-                "SSL证书又叫服务器证书,腾讯云为您提供证书的一站式服务,包括免费、付费证书的申请、管理及部"
-            },
-            {
-              index: 30,
-              isSetup: true,
-              type: 1,
-              banner: "https://tdesign.gtimg.com/tdesign-pro/ssl.jpg",
-              name: "CVM",
-              description:
-                "云硬盘为您提供用于CVM的持久性数据块级存储服务。云硬盘中的数据自动地可用区内以多副本冗"
-            },
-            {
-              index: 31,
-              isSetup: true,
-              type: 4,
-              banner: "https://tdesign.gtimg.com/tdesign-pro/cloud-server.jpg",
-              name: "CVM",
-              description:
-                "基于腾讯优图强大的面部分析技术,提供包括人脸检测与分析、五官定位、人脸搜索、人脸比对、人脸"
-            },
-            {
-              index: 32,
-              isSetup: false,
-              type: 3,
-              banner: "https://tdesign.gtimg.com/tdesign-pro/cloud-server.jpg",
-              name: "T-Sec 云防火墙",
-              description:
-                "腾讯安全云防火墙产品,是腾讯云安全团队结合云原生的优势,自主研发的SaaS化防火墙产品,无需客无需客无需客无需客无需客无需客无需客"
-            },
-            {
-              index: 33,
-              isSetup: true,
-              type: 3,
-              banner: "https://tdesign.gtimg.com/tdesign-pro/t-sec.jpg",
-              name: "CVM",
-              description:
-                "云数据库MySQL为用户提供安全可靠,性能卓越、易于维护的企业级云数据库服务。"
-            },
-            {
-              index: 34,
-              isSetup: false,
-              type: 2,
-              banner: "https://tdesign.gtimg.com/tdesign-pro/ssl.jpg",
-              name: "SSL证书",
-              description:
-                "腾讯安全云防火墙产品,是腾讯云安全团队结合云原生的优势,自主研发的SaaS化防火墙产品,无需客无需客无需客无需客无需客无需客无需客"
-            },
-            {
-              index: 35,
-              isSetup: false,
-              type: 1,
-              banner: "https://tdesign.gtimg.com/tdesign-pro/cloud-server.jpg",
-              name: "云数据库",
-              description:
-                "基于腾讯优图强大的面部分析技术,提供包括人脸检测与分析、五官定位、人脸搜索、人脸比对、人脸"
-            },
-            {
-              index: 36,
-              isSetup: false,
-              type: 4,
-              banner:
-                "https://tdesign.gtimg.com/tdesign-pro/face-recognition.jpg",
-              name: "SSL证书",
-              description:
-                "腾讯安全云防火墙产品,是腾讯云安全团队结合云原生的优势,自主研发的SaaS化防火墙产品,无需客无需客无需客无需客无需客无需客无需客"
-            },
-            {
-              index: 37,
-              isSetup: true,
-              type: 5,
-              banner: "https://tdesign.gtimg.com/tdesign-pro/cloud-server.jpg",
-              name: "CVM",
-              description:
-                "云数据库MySQL为用户提供安全可靠,性能卓越、易于维护的企业级云数据库服务。"
-            },
-            {
-              index: 38,
-              isSetup: false,
-              type: 4,
-              banner: "https://tdesign.gtimg.com/tdesign-pro/ssl.jpg",
-              name: "云数据库",
-              description:
-                "云硬盘为您提供用于CVM的持久性数据块级存储服务。云硬盘中的数据自动地可用区内以多副本冗"
-            },
-            {
-              index: 39,
-              isSetup: false,
-              type: 3,
-              banner: "https://tdesign.gtimg.com/tdesign-pro/t-sec.jpg",
-              name: "人脸识别",
-              description:
-                "云硬盘为您提供用于CVM的持久性数据块级存储服务。云硬盘中的数据自动地可用区内以多副本冗"
-            },
-            {
-              index: 40,
-              isSetup: true,
-              type: 4,
-              banner: "https://tdesign.gtimg.com/tdesign-pro/ssl.jpg",
-              name: "CVM",
-              description:
-                "SSL证书又叫服务器证书,腾讯云为您提供证书的一站式服务,包括免费、付费证书的申请、管理及部"
-            },
-            {
-              index: 41,
-              isSetup: true,
-              type: 4,
-              banner: "https://tdesign.gtimg.com/tdesign-pro/ssl.jpg",
-              name: "T-Sec 云防火墙",
-              description:
-                "云硬盘为您提供用于CVM的持久性数据块级存储服务。云硬盘中的数据自动地可用区内以多副本冗"
-            },
-            {
-              index: 42,
-              isSetup: true,
-              type: 3,
-              banner: "https://tdesign.gtimg.com/tdesign-pro/cloud-server.jpg",
-              name: "T-Sec 云防火墙",
-              description:
-                "云硬盘为您提供用于CVM的持久性数据块级存储服务。云硬盘中的数据自动地可用区内以多副本冗"
-            },
-            {
-              index: 43,
-              isSetup: false,
-              type: 3,
-              banner: "https://tdesign.gtimg.com/tdesign-pro/cloud-db.jpg",
-              name: "SSL证书",
-              description:
-                "云硬盘为您提供用于CVM的持久性数据块级存储服务。云硬盘中的数据自动地可用区内以多副本冗"
-            },
-            {
-              index: 44,
-              isSetup: true,
-              type: 4,
-              banner: "https://tdesign.gtimg.com/tdesign-pro/t-sec.jpg",
-              name: "SSL证书",
-              description:
-                "云硬盘为您提供用于CVM的持久性数据块级存储服务。云硬盘中的数据自动地可用区内以多副本冗"
-            },
-            {
-              index: 45,
-              isSetup: false,
-              type: 3,
-              banner: "https://tdesign.gtimg.com/tdesign-pro/ssl.jpg",
-              name: "T-Sec 云防火墙",
-              description:
-                "SSL证书又叫服务器证书,腾讯云为您提供证书的一站式服务,包括免费、付费证书的申请、管理及部"
-            },
-            {
-              index: 46,
-              isSetup: true,
-              type: 2,
-              banner: "https://tdesign.gtimg.com/tdesign-pro/cloud-server.jpg",
-              name: "SSL证书",
-              description:
-                "SSL证书又叫服务器证书,腾讯云为您提供证书的一站式服务,包括免费、付费证书的申请、管理及部"
-            },
-            {
-              index: 47,
-              isSetup: false,
-              type: 4,
-              banner: "https://tdesign.gtimg.com/tdesign-pro/cloud-server.jpg",
-              name: "SSL证书",
-              description:
-                "腾讯安全云防火墙产品,是腾讯云安全团队结合云原生的优势,自主研发的SaaS化防火墙产品,无需客无需客无需客无需客无需客无需客无需客"
-            },
-            {
-              index: 48,
-              isSetup: false,
-              type: 3,
-              banner: "https://tdesign.gtimg.com/tdesign-pro/ssl.jpg",
-              name: "T-Sec 云防火墙",
-              description:
-                "SSL证书又叫服务器证书,腾讯云为您提供证书的一站式服务,包括免费、付费证书的申请、管理及部"
-            }
-          ]
-        }
-      };
-    }
-  }
-] as MockMethod[];

+ 0 - 37
mock/map.ts

@@ -1,37 +0,0 @@
-import { MockMethod } from "vite-plugin-mock";
-
-type mapType = {
-  plateNumber: string;
-  driver: string;
-  "orientation|1-360": number;
-  "lng|113-114.1-10": number;
-  "lat|34-35.1-10": number;
-};
-
-// http://mockjs.com/examples.html#Object
-const mapList = (): Array<mapType> => {
-  const result: Array<mapType> = [];
-  for (let index = 0; index < 200; index++) {
-    result.push({
-      plateNumber: "豫A@natural(11111, 99999)@character('upper')",
-      driver: "@cname()",
-      "orientation|1-360": 100,
-      "lng|113-114.1-10": 1,
-      "lat|34-35.1-10": 1
-    });
-  }
-  return result;
-};
-
-export default [
-  {
-    url: "/getMapInfo",
-    method: "get",
-    response: () => {
-      return {
-        code: 0,
-        info: mapList()
-      };
-    }
-  }
-] as MockMethod[];

+ 0 - 288
mock/system.ts

@@ -1,288 +0,0 @@
-import { MockMethod } from "vite-plugin-mock";
-
-export default [
-  {
-    url: "/role",
-    method: "post",
-    response: () => {
-      return {
-        code: 0,
-        data: {
-          list: [
-            {
-              createTime: 1609837428000,
-              updateTime: 1645477701000,
-              creator: "admin",
-              updater: "",
-              deleted: false,
-              tenantId: 1,
-              id: 1,
-              name: "超级管理员",
-              code: "super_admin",
-              sort: 1,
-              status: 0,
-              type: 1,
-              remark: "超级管理员",
-              dataScope: 1,
-              dataScopeDeptIds: null
-            },
-            {
-              createTime: 1609837428000,
-              updateTime: 1645477700000,
-              creator: "admin",
-              updater: "",
-              deleted: false,
-              tenantId: 1,
-              id: 2,
-              name: "普通角色",
-              code: "common",
-              sort: 2,
-              status: 0,
-              type: 1,
-              remark: "普通角色",
-              dataScope: 2,
-              dataScopeDeptIds: null
-            },
-            {
-              createTime: 1609912175000,
-              updateTime: 1647698441000,
-              creator: "",
-              updater: "1",
-              deleted: false,
-              tenantId: 1,
-              id: 101,
-              name: "测试账号",
-              code: "test",
-              sort: 0,
-              status: 0,
-              type: 2,
-              remark: "132",
-              dataScope: 1,
-              dataScopeDeptIds: []
-            }
-          ],
-          total: 3
-        }
-      };
-    }
-  },
-  {
-    url: "/dept",
-    method: "post",
-    response: () => {
-      return {
-        code: 0,
-        data: [
-          {
-            name: "杭州总公司",
-            type: 1, // 1 公司 2 分公司 3 部门
-            parentId: 0,
-            sort: 0,
-            leaderUserId: 1,
-            phone: "15888888888",
-            email: "ry@qq.com",
-            status: 0,
-            id: 100,
-            createTime: 1609837427000,
-            remark: "备注、备注、备注、备注、备注、备注、备注"
-          },
-          {
-            name: "郑州分公司",
-            type: 2,
-            parentId: 100,
-            sort: 1,
-            leaderUserId: 104,
-            phone: "15888888888",
-            email: "ry@qq.com",
-            status: 0,
-            id: 101,
-            createTime: 1609837427000,
-            remark: "备注、备注、备注、备注、备注、备注、备注"
-          },
-          {
-            name: "研发部门",
-            type: 3,
-            parentId: 101,
-            sort: 1,
-            leaderUserId: 104,
-            phone: "15888888888",
-            email: "ry@qq.com",
-            status: 0,
-            id: 103,
-            createTime: 1609837427000,
-            remark: "备注、备注、备注、备注、备注、备注、备注"
-          },
-          {
-            name: "市场部门",
-            type: 3,
-            parentId: 102,
-            sort: 1,
-            leaderUserId: null,
-            phone: "15888888888",
-            email: "ry@qq.com",
-            status: 0,
-            id: 108,
-            createTime: 1609837427000,
-            remark: "备注、备注、备注、备注、备注、备注、备注"
-          },
-          {
-            name: "深圳分公司",
-            type: 2,
-            parentId: 100,
-            sort: 2,
-            leaderUserId: null,
-            phone: "15888888888",
-            email: "ry@qq.com",
-            status: 0,
-            id: 102,
-            createTime: 1609837427000,
-            remark: "备注、备注、备注、备注、备注、备注、备注"
-          },
-          {
-            name: "市场部门",
-            type: 3,
-            parentId: 101,
-            sort: 2,
-            leaderUserId: null,
-            phone: "15888888888",
-            email: "ry@qq.com",
-            status: 1,
-            id: 104,
-            createTime: 1609837427000,
-            remark: "备注、备注、备注、备注、备注、备注、备注"
-          },
-          {
-            name: "财务部门",
-            type: 3,
-            parentId: 102,
-            sort: 2,
-            leaderUserId: null,
-            phone: "15888888888",
-            email: "ry@qq.com",
-            status: 0,
-            id: 109,
-            createTime: 1609837427000,
-            remark: "备注、备注、备注、备注、备注、备注、备注"
-          },
-          {
-            name: "测试部门",
-            type: 3,
-            parentId: 101,
-            sort: 3,
-            leaderUserId: null,
-            phone: "15888888888",
-            email: "ry@qq.com",
-            status: 0,
-            id: 105,
-            createTime: 1609837427000,
-            remark: "备注、备注、备注、备注、备注、备注、备注"
-          },
-          {
-            name: "财务部门",
-            type: 3,
-            parentId: 101,
-            sort: 4,
-            leaderUserId: 103,
-            phone: "15888888888",
-            email: "ry@qq.com",
-            status: 1,
-            id: 106,
-            createTime: 1609837427000,
-            remark: "备注、备注、备注、备注、备注、备注、备注"
-          },
-          {
-            name: "运维部门",
-            type: 3,
-            parentId: 101,
-            sort: 5,
-            leaderUserId: null,
-            phone: "15888888888",
-            email: "ry@qq.com",
-            status: 0,
-            id: 107,
-            createTime: 1609837427000,
-            remark: "备注、备注、备注、备注、备注、备注、备注"
-          }
-        ]
-      };
-    }
-  },
-  {
-    url: "/user",
-    method: "post",
-    response: () => {
-      return {
-        code: 0,
-        data: {
-          list: [
-            {
-              username: "admin",
-              nickname: "admin",
-              remark: "管理员",
-              deptId: 103,
-              postIds: [1],
-              mobile: "15888888888",
-              sex: 0,
-              id: 1,
-              status: 0,
-              createTime: 1609837427000,
-              dept: {
-                id: 103,
-                name: "研发部门"
-              }
-            },
-            {
-              username: "pure",
-              nickname: "pure",
-              remark: "不要吓我",
-              deptId: 104,
-              postIds: [1],
-              mobile: "15888888888",
-              sex: 0,
-              id: 100,
-              status: 1,
-              createTime: 1609981637000,
-              dept: {
-                id: 104,
-                name: "市场部门"
-              }
-            },
-            {
-              username: "小姐姐",
-              nickname: "girl",
-              remark: null,
-              deptId: 106,
-              postIds: null,
-              mobile: "15888888888",
-              sex: 1,
-              id: 103,
-              status: 1,
-              createTime: 1610553035000,
-              dept: {
-                id: 106,
-                name: "财务部门"
-              }
-            },
-            {
-              username: "小哥哥",
-              nickname: "boy",
-              remark: null,
-              deptId: 107,
-              postIds: [],
-              mobile: "15888888888",
-              sex: 0,
-              id: 104,
-              status: 0,
-              createTime: 1611166433000,
-              dept: {
-                id: 107,
-                name: "运维部门"
-              }
-            }
-          ],
-          total: 4
-        }
-      };
-    }
-  }
-] as MockMethod[];

+ 0 - 4
package.json

@@ -12,7 +12,6 @@
     "preview:build": "pnpm build && vite preview",
     "cloc": "cross-env --max_old_space_size=4096 cloc . --exclude-dir=node_modules --exclude-lang=YAML",
     "clean:cache": "rm -rf node_modules && rm -rf .eslintcache && pnpm install",
-    "lint:eslint": "eslint --cache --max-warnings 0  \"{src,mock}/**/*.{vue,ts,tsx}\" --fix",
     "lint:prettier": "prettier --write  \"src/**/*.{js,json,tsx,css,less,scss,vue,html,md}\"",
     "lint:stylelint": "stylelint --cache --fix \"**/*.{vue,css,scss,postcss,less}\" --cache --cache-location node_modules/.cache/stylelint/",
     "lint:lint-staged": "lint-staged -c ./.husky/lintstagedrc.js",
@@ -56,7 +55,6 @@
     "lodash-es": "^4.17.21",
     "lodash-unified": "^1.0.2",
     "mitt": "^3.0.0",
-    "mockjs": "^1.1.0",
     "nprogress": "^0.2.0",
     "path": "^0.12.7",
     "pinia": "^2.0.14",
@@ -100,7 +98,6 @@
     "@types/js-cookie": "^3.0.1",
     "@types/lodash": "^4.14.180",
     "@types/lodash-es": "^4.17.6",
-    "@types/mockjs": "1.0.3",
     "@types/node": "14.14.14",
     "@types/nprogress": "0.2.0",
     "@types/qrcode": "^1.4.2",
@@ -143,7 +140,6 @@
     "unocss": "^0.39.3",
     "unplugin-vue-define-options": "^0.6.1",
     "vite": "^2.9.13",
-    "vite-plugin-mock": "^2.9.6",
     "vite-plugin-remove-console": "^1.0.4",
     "vite-svg-loader": "^3.3.0",
     "vue-eslint-parser": "^8.2.0"

Fichier diff supprimé car celui-ci est trop grand
+ 452 - 303
pnpm-lock.yaml


+ 0 - 16
src/components/ReMap/src/Amap.vue

@@ -2,7 +2,6 @@
 import { reactive, getCurrentInstance, onBeforeMount, onUnmounted } from "vue";
 import { deviceDetection } from "@pureadmin/utils";
 import AMapLoader from "@amap/amap-jsapi-loader";
-import { mapJson } from "/@/api/mock";
 import car from "/@/assets/car.png";
 
 export interface MapConfigureInter {
@@ -94,21 +93,6 @@ onBeforeMount(() => {
         }
       });
 
-      // // 获取模拟车辆信息
-      // mapJson()
-      //   .then((res: resultType) => {
-      //     let points: object = res.info.map((v: any) => {
-      //       return {
-      //         lnglat: [v.lng, v.lat],
-      //         ...v
-      //       };
-      //     });
-      //     if (MarkerCluster) MarkerCluster.setData(points);
-      //   })
-      //   .catch(err => {
-      //     console.log("err:", err);
-      //   });
-
       complete();
     })
     .catch(() => {

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

@@ -29,7 +29,7 @@ const { logout, onPanel, toggleSideBar, pureApp, username, avatarsStyle } =
 
     <div v-if="pureApp.layout === 'vertical'" class="vertical-header-right">
       <!-- 菜单搜索 -->
-      <Search />
+      <!-- <Search /> -->
       <!-- 通知 -->
       <Notice id="header-notice" />
       <!-- 全屏 -->
@@ -65,9 +65,9 @@ const { logout, onPanel, toggleSideBar, pureApp, username, avatarsStyle } =
           </el-dropdown-menu>
         </template>
       </el-dropdown>
-      <span class="el-icon-setting" :title="'打开项目配置'" @click="onPanel">
+      <!-- <span class="el-icon-setting" :title="'打开项目配置'" @click="onPanel">
         <IconifyIconOffline icon="setting" />
-      </span>
+      </span> -->
     </div>
   </div>
 </template>

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

@@ -63,7 +63,7 @@ watch(
     </el-menu>
     <div class="horizontal-header-right">
       <!-- 菜单搜索 -->
-      <Search />
+      <!-- <Search /> -->
       <!-- 通知 -->
       <Notice id="header-notice" />
       <!-- 全屏 -->
@@ -98,9 +98,9 @@ watch(
           </el-dropdown-menu>
         </template>
       </el-dropdown>
-      <span class="el-icon-setting" :title="'打开项目配置'" @click="onPanel">
+      <!-- <span class="el-icon-setting" :title="'打开项目配置'" @click="onPanel">
         <IconifyIconOffline icon="setting" />
-      </span>
+      </span> -->
     </div>
   </div>
 </template>

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

@@ -116,7 +116,7 @@ watch(
     </el-menu>
     <div class="horizontal-header-right">
       <!-- 菜单搜索 -->
-      <Search />
+      <!-- <Search /> -->
       <!-- 通知 -->
       <Notice id="header-notice" />
       <!-- 全屏 -->
@@ -152,9 +152,9 @@ watch(
           </el-dropdown-menu>
         </template>
       </el-dropdown>
-      <span class="el-icon-setting" :title="'打开项目配置'" @click="onPanel">
+      <!-- <span class="el-icon-setting" :title="'打开项目配置'" @click="onPanel">
         <IconifyIconOffline icon="setting" />
-      </span>
+      </span> -->
     </div>
   </div>
 </template>

+ 0 - 12
src/mockProdServer.ts

@@ -1,12 +0,0 @@
-import { createProdMockServer } from "vite-plugin-mock/es/createProdMockServer";
-
-const modules = import.meta.globEager("../mock/*.ts");
-const mockModules = [];
-
-Object.keys(modules).forEach(key => {
-  mockModules.push(...modules[key].default);
-});
-
-export function setupProdMockServer() {
-  createProdMockServer(mockModules);
-}

+ 1 - 8
src/utils/http/index.ts

@@ -9,18 +9,11 @@ import {
 import qs from "qs";
 import NProgress from "../progress";
 import { loadEnv } from "@build/index";
-import { getToken, setToken } from "/@/utils/auth";
-import { useUserStoreHook } from "/@/store/modules/user";
-
-// 加载环境变量 VITE_PROXY_DOMAIN(开发环境)  VITE_PROXY_DOMAIN_REAL(打包后的线上环境)
-const { VITE_PROXY_DOMAIN, VITE_PROXY_DOMAIN_REAL } = loadEnv();
-console.log(VITE_PROXY_DOMAIN_REAL);
+import { getToken } from "/@/utils/auth";
 
 // 相关配置请参考:www.axios-js.com/zh-cn/docs/#axios-request-config-1
 const defaultConfig: AxiosRequestConfig = {
   baseURL: "",
-  // 当前使用mock模拟请求,将baseURL制空,如果你的环境用到了http请求,请删除下面的baseURL启用上面的baseURL,并将11行、16行代码注释取消
-  // baseURL: "",
   timeout: 10000,
   headers: {
     Accept: "application/json, text/plain, */*",

+ 0 - 72
src/views/able/ant-anchor.vue

@@ -1,72 +0,0 @@
-<script setup lang="ts">
-import { Anchor, AnchorLink } from "@pureadmin/components";
-
-defineOptions({
-  name: "AntAnchor"
-});
-
-function handleAnchorClick(e, link) {
-  e.preventDefault();
-  const srcolls = document.getElementById(link.href);
-  srcolls.scrollIntoView({ block: "start", behavior: "smooth" });
-}
-</script>
-
-<template>
-  <el-card>
-    <template #header>
-      <div class="card-header">
-        <span class="font-medium">
-          仿antdv锚点,采用
-          <el-link
-            href="https://www.npmjs.com/package/@pureadmin/components"
-            target="_blank"
-            style="font-size: 16px; margin: 0 4px 5px"
-          >
-            @pureadmin/components
-          </el-link>
-          ,完全兼容antdv的
-          <el-link
-            href="https://next.antdv.com/components/anchor-cn"
-            target="_blank"
-            style="font-size: 16px; margin: 0 4px 5px"
-          >
-            Anchor
-          </el-link>
-          写法
-        </span>
-      </div>
-    </template>
-    <div class="w-400px">
-      <Anchor class="float-left mt-200px" @click="handleAnchorClick">
-        <AnchorLink href="one" title="测试one" />
-        <AnchorLink href="two" title="测试two" />
-        <AnchorLink href="three" title="测试three" />
-      </Anchor>
-
-      <el-scrollbar class="float-right overflow-auto" height="600px">
-        <header
-          id="one"
-          class="w-200px h-600px text-cyan-50 flex justify-center items-center text-4xl"
-          style="background: #409eff"
-        >
-          测试one
-        </header>
-        <header
-          id="two"
-          class="w-200px h-600px text-cyan-50 flex justify-center items-center text-4xl"
-          style="background: #67c23a"
-        >
-          测试two
-        </header>
-        <header
-          id="three"
-          class="w-200px h-600px text-cyan-50 flex justify-center items-center text-4xl"
-          style="background: #f56c6c"
-        >
-          测试three
-        </header>
-      </el-scrollbar>
-    </div>
-  </el-card>
-</template>

+ 0 - 56
src/views/able/ant-tabs.vue

@@ -1,56 +0,0 @@
-<script setup lang="ts">
-import { ref } from "vue";
-import { Tabs, TabPane } from "@pureadmin/components";
-
-defineOptions({
-  name: "AntTabs"
-});
-
-const mode = ref("top");
-const activeKey = ref(1);
-const callback = (val: string) => {
-  console.log(val);
-};
-</script>
-
-<template>
-  <el-card>
-    <template #header>
-      <div class="card-header">
-        <span class="font-medium">
-          仿antdv标签页,采用
-          <el-link
-            href="https://www.npmjs.com/package/@pureadmin/components"
-            target="_blank"
-            style="font-size: 16px; margin: 0 4px 5px"
-          >
-            @pureadmin/components
-          </el-link>
-          ,完全兼容antdv的
-          <el-link
-            href="https://next.antdv.com/components/tabs-cn"
-            target="_blank"
-            style="font-size: 16px; margin: 0 4px 5px"
-          >
-            Tabs
-          </el-link>
-          写法
-        </span>
-      </div>
-    </template>
-    <el-radio-group v-model="mode" size="small" class="mb-2">
-      <el-radio label="top" border>Horizontal</el-radio>
-      <el-radio label="left" border>Vertical</el-radio>
-    </el-radio-group>
-    <Tabs
-      v-model:activeKey="activeKey"
-      :tab-position="mode"
-      :style="{ height: '200px' }"
-      @tabScroll="callback"
-    >
-      <TabPane v-for="i in 30" :key="i" :tab="`Tab-${i}`">
-        Content of tab {{ i }}
-      </TabPane>
-    </Tabs>
-  </el-card>
-</template>

+ 0 - 219
src/views/able/ant-treeSelect.vue

@@ -1,219 +0,0 @@
-<script setup lang="ts">
-import { ref } from "vue";
-import { TreeSelect } from "@pureadmin/components";
-
-defineOptions({
-  name: "AntTreeSelect"
-});
-
-const value1 = ref<string>("");
-const treeData1 = ref([
-  {
-    title: "parent 1",
-    value: "parent 1",
-    children: [
-      {
-        title: "parent 1-0",
-        value: "parent 1-0",
-        children: [
-          {
-            title: "my leaf",
-            value: "leaf1"
-          },
-          {
-            title: "your leaf",
-            value: "leaf2"
-          }
-        ]
-      },
-      {
-        title: "parent 1-1",
-        value: "parent 1-1"
-      }
-    ]
-  }
-]);
-
-const SHOW_PARENT = TreeSelect.SHOW_PARENT;
-
-function dig(path = "0", level = 3) {
-  const list = [];
-  for (let i = 0; i < 10; i += 1) {
-    const value = `${path}-${i}`;
-    const treeNode = {
-      title: value,
-      value
-    };
-
-    if (level > 0) {
-      // @ts-expect-error
-      treeNode.children = dig(value, level - 1);
-    }
-
-    list.push(treeNode);
-  }
-  return list;
-}
-
-const checkedKeys = ref<string[]>(["0-0-0", "0-0-1"]);
-
-const value2 = ref<string[]>(["0-0-0"]);
-const treeData2 = [
-  {
-    title: "Node1",
-    value: "0-0",
-    children: [
-      {
-        title: "Child Node1",
-        value: "0-0-0"
-      }
-    ]
-  },
-  {
-    title: "Node2",
-    value: "0-1",
-
-    children: [
-      {
-        title: "Child Node3",
-        value: "0-1-0",
-        disabled: true
-      },
-      {
-        title: "Child Node4",
-        value: "0-1-1"
-      },
-      {
-        title: "Child Node5",
-        value: "0-1-2"
-      }
-    ]
-  }
-];
-
-const value3 = ref<string>();
-const treeData3 = ref([
-  { id: 1, pId: 0, value: "1", title: "Expand to load" },
-  { id: 2, pId: 0, value: "2", title: "Expand to load" },
-  { id: 3, pId: 0, value: "3", title: "Tree Node", isLeaf: true }
-]);
-const genTreeNode = (parentId: number, isLeaf = false) => {
-  const random = Math.random().toString(36).substring(2, 6);
-  return {
-    id: random,
-    pId: parentId,
-    value: random,
-    title: isLeaf ? "Tree Node" : "Expand to load",
-    isLeaf
-  };
-};
-const onLoadData = treeNode => {
-  return new Promise(resolve => {
-    const { id } = treeNode.dataRef;
-    setTimeout(() => {
-      // @ts-expect-error
-      treeData3.value = treeData3.value.concat([
-        genTreeNode(id, false),
-        genTreeNode(id, true)
-      ]);
-      resolve(true);
-    }, 300);
-  });
-};
-</script>
-
-<template>
-  <el-card>
-    <template #header>
-      <div class="card-header">
-        <span class="font-medium">
-          仿antdv树选择,采用
-          <el-link
-            href="https://www.npmjs.com/package/@pureadmin/components"
-            target="_blank"
-            style="font-size: 16px; margin: 0 4px 5px"
-          >
-            @pureadmin/components
-          </el-link>
-          ,完全兼容antdv的
-          <el-link
-            href="https://next.antdv.com/components/tree-select-cn"
-            target="_blank"
-            style="font-size: 16px; margin: 0 4px 5px"
-          >
-            TreeSelect
-          </el-link>
-          写法
-        </span>
-      </div>
-    </template>
-    <div class="flex justify-around flex-wrap">
-      <div>
-        <span>线性样式:</span>
-        <TreeSelect
-          class="w-200px"
-          v-model:value="value1"
-          show-search
-          :dropdown-style="{ maxHeight: '400px', overflow: 'auto' }"
-          placeholder="Please select"
-          allow-clear
-          :tree-line="true"
-          tree-default-expand-all
-          :tree-data="treeData1"
-        >
-          <template #title="{ value: val, title }">
-            <b v-if="val === 'parent 1-1'" style="color: #08c">sss</b>
-            <template v-else>{{ title }}</template>
-          </template>
-        </TreeSelect>
-      </div>
-
-      <div>
-        <span>虚拟滚动:</span>
-        <TreeSelect
-          class="w-200px mt-6"
-          v-model:value="checkedKeys"
-          tree-checkable
-          tree-default-expand-all
-          :show-checked-strategy="SHOW_PARENT"
-          :height="233"
-          :tree-data="dig()"
-          :max-tag-count="10"
-        >
-          <template #title="{ title, value }">
-            <span v-if="value === '0-0-1-0'" style="color: #1890ff">
-              {{ title }}
-            </span>
-            <template v-else>{{ title }}</template>
-          </template>
-        </TreeSelect>
-      </div>
-
-      <div>
-        <span>可勾选:</span>
-        <TreeSelect
-          class="w-200px"
-          v-model:value="value2"
-          :tree-data="treeData2"
-          tree-checkable
-          allow-clear
-          :show-checked-strategy="SHOW_PARENT"
-          placeholder="Please select"
-        />
-      </div>
-
-      <div>
-        <span>异步加载:</span>
-        <TreeSelect
-          class="w-200px"
-          v-model:value="value3"
-          tree-data-simple-mode
-          :dropdown-style="{ maxHeight: '400px', overflow: 'auto' }"
-          :tree-data="treeData3"
-          placeholder="Please select"
-          :load-data="onLoadData"
-        />
-      </div>
-    </div>
-  </el-card>
-</template>

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

@@ -1,63 +0,0 @@
-<script setup lang="ts">
-import ReBarcode from "/@/components/ReBarcode";
-
-defineOptions({
-  name: "BarCode"
-});
-
-const barcodes = [
-  {
-    text: "CODE128",
-    type: "CODE128",
-    options: {}
-  },
-  {
-    text: "CODE39",
-    type: "CODE39",
-    options: {
-      lineColor: "#990000"
-    }
-  },
-  {
-    text: "123456",
-    type: "pharmacode",
-    options: {
-      background: "#eee",
-      width: 5
-    }
-  }
-];
-</script>
-
-<template>
-  <div>
-    <el-card>
-      <template #header>
-        <div class="font-medium">
-          条形码(基于
-          <el-link
-            href="https://lindell.me/JsBarcode/"
-            target="_blank"
-            style="font-size: 16px; margin: 0 5px 4px 0"
-          >
-            JsBarcode
-          </el-link>
-          生成)
-        </div>
-      </template>
-      <el-row :gutter="12">
-        <template v-for="(item, index) in barcodes" :key="index">
-          <el-col :xs="24" :sm="24" :md="12" :lg="8" :xl="8">
-            <el-card shadow="hover" class="flex justify-center">
-              <ReBarcode
-                :text="item.text"
-                :type="item.type"
-                :options="item.options"
-              />
-            </el-card>
-          </el-col>
-        </template>
-      </el-row>
-    </el-card>
-  </div>
-</template>

+ 0 - 158
src/views/able/cascader.vue

@@ -1,158 +0,0 @@
-<script setup lang="ts">
-import {
-  provinceAndCityDataPlus,
-  provinceAndCityData,
-  convertTextToCode,
-  regionDataPlus,
-  regionData,
-  CodeToText
-} from "/@/utils/chinaArea";
-import { ref } from "vue";
-
-defineOptions({
-  name: "Cascader"
-});
-
-const selectedOptions1 = ref(["110000", "110100"]);
-const selectedOptions2 = ref(["120000", "120100", "120101"]);
-const selectedOptions3 = ref(["130000", ""]);
-const selectedOptions4 = ref(["120000", "120100", ""]);
-
-const handleChange = value => {
-  console.log(value);
-};
-</script>
-
-<template>
-  <el-card>
-    <template #header> 区域级联选择器 </template>
-    <el-row :gutter="20">
-      <el-col :xl="12" :lg="12" :md="24" :sm="24" :xs="24">
-        <div class="flex flex-col items-center justify-center">
-          <span class="imp">
-            1. 二级联动(不带“全部”选项)
-            <el-cascader
-              :options="provinceAndCityData"
-              v-model="selectedOptions1"
-              @change="handleChange"
-            />
-          </span>
-          <div class="leading-10">
-            <div>绑定值:{{ selectedOptions1 }}</div>
-            <div>
-              区域码转汉字:
-              {{ CodeToText[selectedOptions1[0]] }},
-              {{ CodeToText[selectedOptions1[1]] }}
-            </div>
-            <div>
-              汉字转区域码:
-              {{
-                convertTextToCode(
-                  CodeToText[selectedOptions1[0]],
-                  CodeToText[selectedOptions1[1]]
-                )
-              }}
-            </div>
-          </div>
-        </div>
-      </el-col>
-      <el-col :xl="12" :lg="12" :md="24" :sm="24" :xs="24">
-        <div class="flex flex-col items-center justify-center mt-3">
-          <span class="imp">
-            2. 二级联动(带有“全部”选项)
-            <el-cascader
-              :options="provinceAndCityDataPlus"
-              v-model="selectedOptions3"
-              @change="handleChange"
-            />
-          </span>
-          <div class="leading-10">
-            <div>绑定值:{{ selectedOptions3 }}</div>
-            <div>
-              区域码转汉字:
-              {{ CodeToText[selectedOptions3[0]] }},
-              {{ CodeToText[selectedOptions3[1]] }}
-            </div>
-            <div>
-              汉字转区域码:
-              {{
-                convertTextToCode(
-                  CodeToText[selectedOptions3[0]],
-                  CodeToText[selectedOptions3[1]]
-                )
-              }}
-            </div>
-          </div>
-        </div>
-      </el-col>
-      <el-col :xl="12" :lg="12" :md="24" :sm="24" :xs="24">
-        <div class="flex flex-col items-center justify-center mt-3">
-          <span class="imp">
-            3. 三级联动(不带“全部”选项)
-            <el-cascader
-              :options="regionData"
-              v-model="selectedOptions2"
-              @change="handleChange"
-            />
-          </span>
-          <div class="leading-10">
-            <div>绑定值:{{ selectedOptions2 }}</div>
-            <div>
-              区域码转汉字:
-              {{ CodeToText[selectedOptions2[0]] }},
-              {{ CodeToText[selectedOptions2[1]] }},
-              {{ CodeToText[selectedOptions2[2]] }}
-            </div>
-            <div>
-              汉字转区域码:
-              {{
-                convertTextToCode(
-                  CodeToText[selectedOptions2[0]],
-                  CodeToText[selectedOptions2[1]],
-                  CodeToText[selectedOptions2[2]]
-                )
-              }}
-            </div>
-          </div>
-        </div>
-      </el-col>
-      <el-col :xl="12" :lg="12" :md="24" :sm="24" :xs="24">
-        <div class="flex flex-col items-center justify-center mt-3">
-          <span class="imp">
-            4. 三级联动(带"全部选项")
-            <el-cascader
-              :options="regionDataPlus"
-              v-model="selectedOptions4"
-              @change="handleChange"
-            />
-          </span>
-          <div class="leading-10">
-            <div>绑定值:{{ selectedOptions4 }}</div>
-            <div>
-              区域码转汉字:
-              {{ CodeToText[selectedOptions4[0]] }},
-              {{ CodeToText[selectedOptions4[1]] }},
-              {{ CodeToText[selectedOptions4[2]] }}
-            </div>
-            <div>
-              汉字转区域码:
-              {{
-                convertTextToCode(
-                  CodeToText[selectedOptions4[0]],
-                  CodeToText[selectedOptions4[1]],
-                  CodeToText[selectedOptions4[2]]
-                )
-              }}
-            </div>
-          </div>
-        </div>
-      </el-col>
-    </el-row>
-  </el-card>
-</template>
-
-<style scoped lang="scss">
-.imp {
-  color: var(--el-color-primary);
-}
-</style>

+ 0 - 56
src/views/able/debounce.vue

@@ -1,56 +0,0 @@
-<script setup lang="ts">
-import { ElMessage } from "element-plus";
-import { debounce } from "@pureadmin/utils";
-import { useDebounceFn, useThrottleFn } from "@vueuse/core";
-
-defineOptions({
-  name: "Debounce"
-});
-
-const handle = () => {
-  ElMessage({
-    message: "恭喜你,这是一条成功消息",
-    type: "success"
-  });
-};
-
-const immediateDebounce = debounce(handle, 1000, true);
-
-const debounceClick = useDebounceFn(handle, 1000);
-
-const throttleClick = useThrottleFn(handle, 1000, false);
-</script>
-
-<template>
-  <div>
-    <el-card class="mb-5">
-      <template #header>
-        <div>防抖:debounce</div>
-      </template>
-      <div class="mb-5">
-        所谓防抖,就是指触发事件后在 n 秒内函数只能执行一次,如果在 n
-        秒内又触发了事件,则会重新计算函数执行时间。
-      </div>
-      <el-button @click="immediateDebounce">
-        连续点击我,只会执行第一次点击事件,立即执行
-      </el-button>
-      <el-button @click="debounceClick">
-        连续点击我,只会执行最后一次点击事件,延后执行
-      </el-button>
-    </el-card>
-    <el-card>
-      <template #header>
-        <div>节流:throttle</div>
-      </template>
-      <div class="mb-5">
-        所谓节流,就是指连续触发事件但是在 n
-        秒中只执行一次函数。节流会稀释函数的执行频率。
-      </div>
-      <el-button @click="throttleClick">
-        连续点击我,每一秒只会执行一次点击事件
-      </el-button>
-    </el-card>
-  </div>
-</template>
-
-<style scoped></style>

+ 0 - 101
src/views/able/execl.vue

@@ -1,101 +0,0 @@
-<script lang="ts" setup>
-import { utils, writeFile } from "xlsx";
-
-defineOptions({
-  name: "Excel"
-});
-
-interface DataItem {
-  readonly id: string;
-  [propName: string]: string;
-}
-
-interface Columns {
-  dataKey: string;
-  key: string;
-  title: string;
-  width?: number;
-  [propName: string]: string | number;
-}
-
-const generateColumns = (length = 10, prefix = "column-", props?: any) =>
-  Array.from({ length }).map((_, columnIndex) => ({
-    ...props,
-    key: `${prefix}${columnIndex}`,
-    dataKey: `${prefix}${columnIndex}`,
-    title: `Column ${columnIndex}`,
-    width: 150
-  }));
-
-const generateData = (
-  columns: ReturnType<typeof generateColumns>,
-  length = 200,
-  prefix = "row-"
-) =>
-  Array.from({ length }).map((_, rowIndex) => {
-    return columns.reduce(
-      (rowData, column, columnIndex) => {
-        rowData[column.dataKey] = `Row ${rowIndex} - Col ${columnIndex}`;
-        return rowData;
-      },
-      {
-        id: `${prefix}${rowIndex}`,
-        parentId: null
-      }
-    );
-  });
-
-const columns = generateColumns(10);
-const data = generateData(columns, 1000);
-
-const exportExcel = () => {
-  const res: string[][] = data.map((item: DataItem) => {
-    const arr = [];
-    columns.forEach((column: Columns) => {
-      arr.push(item[column.dataKey]);
-    });
-    return arr;
-  });
-  const titleList: string[] = [];
-  columns.forEach((column: Columns) => {
-    titleList.push(column.title);
-  });
-  res.unshift(titleList);
-  const workSheet = utils.aoa_to_sheet(res);
-  const workBook = utils.book_new();
-  utils.book_append_sheet(workBook, workSheet, "数据报表");
-  writeFile(workBook, "tale-list.xlsx");
-};
-</script>
-
-<template>
-  <el-card>
-    <template #header>
-      <div class="font-medium">
-        导出Execl(
-        <el-link
-          href="https://github.com/SheetJS/sheetjs"
-          target="_blank"
-          style="font-size: 16px; margin: 0 5px 4px 0"
-        >
-          github地址
-        </el-link>
-        )
-      </div>
-    </template>
-    <el-button type="primary" @click="exportExcel">导出Excel </el-button>
-    <div class="h-100 mt-3">
-      <el-auto-resizer>
-        <template #default="{ height, width }">
-          <el-table-v2
-            :columns="columns"
-            :data="data"
-            :width="width"
-            :height="height"
-            fixed
-          />
-        </template>
-      </el-auto-resizer>
-    </div>
-  </el-card>
-</template>

+ 0 - 22
src/views/able/icon-select.vue

@@ -1,22 +0,0 @@
-<script setup lang="ts">
-import { ref } from "vue";
-import { IconSelect } from "/@/components/ReIcon";
-
-defineOptions({
-  name: "IconSelect"
-});
-
-let icon = ref("ep:add-location");
-</script>
-
-<template>
-  <el-card>
-    <template #header>
-      <div class="card-header">
-        <span class="font-medium">图标选择器</span>
-      </div>
-    </template>
-    <IconSelect v-model="icon" />
-    
-  </el-card>
-</template>

+ 0 - 96
src/views/able/line-tree.vue

@@ -1,96 +0,0 @@
-<script setup lang="ts">
-import { computed } from "vue";
-import ElTreeLine from "/@/components/ReTreeLine";
-import { extractPathList, deleteChildren } from "@pureadmin/utils";
-import { usePermissionStoreHook } from "/@/store/modules/permission";
-
-defineOptions({
-  name: "LineTree"
-});
-
-let menusData = computed(() => {
-  return deleteChildren(usePermissionStoreHook().menusTree);
-});
-let expandedKeys = extractPathList(menusData.value);
-let dataProps = {
-  value: "uniqueId",
-  children: "children"
-};
-</script>
-
-<template>
-  <el-card>
-    <template #header>
-      <div class="card-header">
-        <span class="font-medium">
-          扩展elemenet-plus的树形组件包括虚拟树组件,支持连接线
-        </span>
-      </div>
-    </template>
-
-    <el-row :gutter="24">
-      <el-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12" class="mb-20px">
-        <el-card>
-          <template #header>
-            <div class="card-header">
-              <span class="font-medium"> 普通树结构 </span>
-            </div>
-          </template>
-          <div class="max-h-550px overflow-y-auto">
-            <el-tree
-              :data="menusData"
-              :props="dataProps"
-              show-checkbox
-              default-expand-all
-              node-key="uniqueId"
-              :indent="30"
-              ><template v-slot:default="{ node }">
-                <el-tree-line :node="node" :showLabelLine="true">
-                  <template v-slot:node-label>
-                    <span class="text-sm">
-                      {{ node.data.meta.title }}
-                    </span>
-                  </template>
-                </el-tree-line>
-              </template>
-            </el-tree>
-          </div>
-        </el-card>
-      </el-col>
-
-      <el-col :xs="24" :sm="24" :md="12" :lg="12" :xl="12">
-        <el-card>
-          <template #header>
-            <div class="card-header">
-              <span class="font-medium"> 虚拟树结构 </span>
-            </div>
-          </template>
-          <div class="max-h-550px overflow-y-auto">
-            <el-tree-v2
-              :data="menusData"
-              :props="dataProps"
-              show-checkbox
-              :height="550"
-              :default-expanded-keys="expandedKeys"
-            >
-              <template v-slot:default="{ node }">
-                <el-tree-line
-                  :node="node"
-                  :treeData="menusData"
-                  :showLabelLine="true"
-                  :indent="30"
-                >
-                  <template v-slot:node-label>
-                    <span class="text-sm">
-                      {{ node.data.meta.title }}
-                    </span>
-                  </template>
-                </el-tree-line>
-              </template>
-            </el-tree-v2>
-          </div>
-        </el-card>
-      </el-col>
-    </el-row>
-  </el-card>
-</template>

+ 0 - 81
src/views/able/menu-tree.vue

@@ -1,81 +0,0 @@
-<script setup lang="ts">
-import { ref, computed } from "vue";
-import type { ElTreeV2 } from "element-plus";
-import { useRenderIcon } from "/@/components/ReIcon/src/hooks";
-import { extractPathList, deleteChildren } from "@pureadmin/utils";
-import { usePermissionStoreHook } from "/@/store/modules/permission";
-import type { TreeNode } from "element-plus/es/components/tree-v2/src/types";
-
-defineOptions({
-  name: "MenuTree"
-});
-
-interface treeNode extends TreeNode {
-  meta: {
-    title: string;
-  };
-}
-
-const query = ref("");
-let dataProps = ref({
-  value: "uniqueId",
-  children: "children"
-});
-const treeRef = ref<InstanceType<typeof ElTreeV2>>();
-
-let menusData = computed(() => {
-  return deleteChildren(usePermissionStoreHook().menusTree);
-});
-
-let expandedKeys = extractPathList(menusData.value);
-
-const onQueryChanged = (query: string) => {
-  // @ts-expect-error
-  treeRef.value!.filter(query);
-};
-
-const filterMethod = (query: string, node: treeNode) => {
-  return node.meta.title!.indexOf(query) !== -1;
-};
-</script>
-
-<template>
-  <el-card>
-    <template #header>
-      <div class="card-header">
-        <span class="font-medium">
-          菜单树结构(采用element-plus的
-          <el-link
-            href="https://element-plus.gitee.io/zh-CN/component/tree-v2.html"
-            target="_blank"
-            :icon="useRenderIcon('node-tree')"
-            style="font-size: 16px; margin: 0 5px 4px 0"
-          >
-            Tree V2
-          </el-link>
-          组件并支持国际化)
-        </span>
-      </div>
-    </template>
-    <el-input
-      class="mb-4"
-      v-model="query"
-      placeholder="请输入关键字查找"
-      clearable
-      @input="onQueryChanged"
-    />
-    <el-tree-v2
-      ref="treeRef"
-      :data="menusData"
-      :props="dataProps"
-      show-checkbox
-      :height="500"
-      :filter-method="filterMethod"
-      :default-expanded-keys="expandedKeys"
-    >
-      <template #default="{ data }">
-        <span>{{ data.meta.title }}</span>
-      </template>
-    </el-tree-v2>
-  </el-card>
-</template>

+ 0 - 114
src/views/able/pdf.vue

@@ -1,114 +0,0 @@
-<script setup lang="ts">
-import { ref } from "vue";
-import VuePdfEmbed, {
-  type VuePdfEmbedMethods,
-  type VuePdfEmbedData
-} from "vue-pdf-embed";
-
-defineOptions({
-  name: "Pdf"
-});
-
-interface pdfRefType extends VuePdfEmbedData, VuePdfEmbedMethods {}
-
-const pdfRef = ref<pdfRefType>();
-let pageCount = ref(1);
-let loading = ref(true);
-let currentPage = ref(1);
-let currentRotation = ref(0);
-let showAllPages = ref(false);
-const rotations = [0, 90, 180, 270];
-
-const source =
-  "https://pure-admin-doc.vercel.app/pdf/Cookie%E5%92%8CSession%E5%8C%BA%E5%88%AB%E7%94%A8%E6%B3%95.pdf";
-
-const handleDocumentRender = () => {
-  loading.value = false;
-  pageCount.value = pdfRef.value.pageCount;
-};
-
-const showAllPagesChange = () => {
-  currentPage.value = showAllPages.value ? null : 1;
-};
-
-const onPrint = () => {
-  pdfRef.value.print();
-};
-</script>
-
-<template>
-  <el-card>
-    <template #header>
-      <div class="font-medium">
-        PDF预览(
-        <el-link
-          href="https://github.com/hrynko/vue-pdf-embed"
-          target="_blank"
-          style="font-size: 16px; margin: 0 5px 4px 0"
-        >
-          github地址
-        </el-link>
-        )
-      </div>
-    </template>
-    <div
-      class="h-[calc(100vh-239px)]"
-      v-loading="loading"
-      :element-loading-text="'加载中...'"
-    >
-      <div class="flex justify-between items-center h-9">
-        <div v-if="showAllPages" class="font-medium ml-1.25 text-xl">
-          共{{ pageCount }}页
-        </div>
-        <div v-else>
-          <el-pagination
-            background
-            layout="prev, slot, next"
-            v-model:current-page="currentPage"
-            :page-size="1"
-            :total="pageCount"
-          >
-            {{ currentPage }} / {{ pageCount }}
-          </el-pagination>
-        </div>
-        <div class="w-170px flex-bc">
-          <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>
-        </div>
-      </div>
-      <el-scrollbar>
-        <vue-pdf-embed
-          class="h-full container overflow-auto"
-          ref="pdfRef"
-          :rotation="rotations[currentRotation]"
-          :page="currentPage"
-          :source="source"
-          @rendered="handleDocumentRender"
-        />
-      </el-scrollbar>
-    </div>
-  </el-card>
-</template>

+ 0 - 328
src/views/able/print.vue

@@ -1,328 +0,0 @@
-<script setup lang="ts">
-import Print from "/@/utils/print";
-import { reactive, ref } from "vue";
-import { VxeTablePropTypes } from "vxe-table";
-import Line from "../welcome/components/Line.vue";
-
-defineOptions({
-  name: "Print"
-});
-
-interface User {
-  date: string;
-  name: string;
-  address: string;
-}
-
-const demo1 = reactive({
-  tableData: [
-    {
-      id: 10001,
-      name: "Test1",
-      role: "Develop",
-      sex: "Man",
-      age: 28,
-      address: "test abc"
-    },
-    {
-      id: 10002,
-      name: "Test2",
-      role: "Test",
-      sex: "Women",
-      age: 22,
-      address: "Guangzhou"
-    },
-    {
-      id: 10003,
-      name: "Test3",
-      role: "PM",
-      sex: "Man",
-      age: 32,
-      address: "Shanghai"
-    },
-    {
-      id: 10004,
-      name: "Test4",
-      role: "Designer",
-      sex: "Women",
-      age: 24,
-      address: "Shanghai"
-    }
-  ]
-});
-
-const value = ref("1");
-
-const options = [
-  {
-    value: "1",
-    el: ".el-table",
-    label: "Element-Plus Table"
-  },
-  {
-    value: "2",
-    el: ".vxe-table",
-    label: "Vxe Table"
-  },
-  {
-    value: "3",
-    el: ".echart",
-    label: "Echart"
-  },
-  {
-    value: "4",
-    el: ".img",
-    label: "Image"
-  }
-];
-
-function onPrint() {
-  let el = options.filter(v => v.value === value.value)[0]?.el;
-  Print(el).toPrint;
-}
-
-const headerCellStyle: VxeTablePropTypes.HeaderCellStyle = ({ column }) => {
-  if (column.property === "name") {
-    return {
-      backgroundColor: "#f60",
-      color: "#ffffff"
-    };
-  }
-};
-
-const rowStyle: VxeTablePropTypes.RowStyle = ({ rowIndex }) => {
-  if ([2, 3, 5].includes(rowIndex)) {
-    return {
-      backgroundColor: "red",
-      color: "#ffffff"
-    };
-  }
-};
-
-const cellStyle: VxeTablePropTypes.CellStyle = ({ row, column }) => {
-  if (column.property === "sex") {
-    if (row.sex >= "1") {
-      return {
-        backgroundColor: "#187"
-      };
-    } else if (row.age === 26) {
-      return {
-        backgroundColor: "#2db7f5"
-      };
-    }
-  }
-};
-
-const tableRowClassName = ({ rowIndex }: { row: User; rowIndex: number }) => {
-  if (rowIndex === 1) {
-    return "warning-row";
-  } else if (rowIndex === 3) {
-    return "success-row";
-  }
-  return "";
-};
-
-const tableData: User[] = [
-  {
-    date: "2016-05-03",
-    name: "Tom",
-    address: "No. 189, Grove St, Los Angeles"
-  },
-  {
-    date: "2016-05-02",
-    name: "Tom",
-    address: "No. 189, Grove St, Los Angeles"
-  },
-  {
-    date: "2016-05-04",
-    name: "Tom",
-    address: "No. 189, Grove St, Los Angeles"
-  },
-  {
-    date: "2016-05-01",
-    name: "Tom",
-    address: "No. 189, Grove St, Los Angeles"
-  }
-];
-</script>
-
-<template>
-  <el-card>
-    <template #header>
-      <div class="card-header">
-        <span class="font-medium">打印功能(报表、图表、图片)</span>
-        <div>
-          <el-select
-            v-model="value"
-            class="m-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>
-      </div>
-    </template>
-    <el-row :gutter="24">
-      <el-col
-        :xs="22"
-        :sm="22"
-        :md="11"
-        :lg="11"
-        :xl="11"
-        style="margin: 10px; border: 0.01rem solid var(--el-color-primary)"
-        v-motion
-        :initial="{
-          opacity: 0,
-          y: 100
-        }"
-        :enter="{
-          opacity: 1,
-          y: 0,
-          transition: {
-            delay: 200
-          }
-        }"
-      >
-        <p class="font-medium pt-1">Element-Plus Table</p>
-        <el-table
-          class="el-table"
-          :data="tableData"
-          border
-          style="margin: 40px auto; width: 100%"
-          :row-class-name="tableRowClassName"
-        >
-          <el-table-column prop="date" label="Date" width="180" />
-          <el-table-column prop="name" label="Name" width="180" />
-          <el-table-column prop="address" label="Address" />
-        </el-table>
-      </el-col>
-
-      <el-col
-        :xs="22"
-        :sm="22"
-        :md="11"
-        :lg="11"
-        :xl="11"
-        style="margin: 10px; border: 0.01rem solid var(--el-color-primary)"
-        v-motion
-        :initial="{
-          opacity: 0,
-          y: 100
-        }"
-        :enter="{
-          opacity: 1,
-          y: 0,
-          transition: {
-            delay: 200
-          }
-        }"
-      >
-        <p class="font-medium pt-1">Vxe Table</p>
-        <vxe-table
-          class="vxe-table"
-          border
-          style="margin: 40px auto"
-          :header-cell-style="headerCellStyle"
-          :row-style="rowStyle"
-          :cell-style="cellStyle"
-          :data="demo1.tableData"
-        >
-          <vxe-column type="seq" width="60" />
-          <vxe-column field="name" title="Name" />
-          <vxe-column field="sex" title="Sex" />
-          <vxe-column field="age" title="Age" />
-          <vxe-column field="attr1" title="Attr1" />
-          <vxe-column field="address" title="Address" show-overflow />
-        </vxe-table>
-      </el-col>
-
-      <el-col
-        :xs="22"
-        :sm="22"
-        :md="11"
-        :lg="11"
-        :xl="11"
-        style="
-          width: 200px;
-          height: 300px;
-          margin: 10px;
-          border: 0.01rem solid var(--el-color-primary);
-        "
-        v-motion
-        :initial="{
-          opacity: 0,
-          y: 100
-        }"
-        :enter="{
-          opacity: 1,
-          y: 0,
-          transition: {
-            delay: 200
-          }
-        }"
-      >
-        <p class="font-medium pt-1">Echart</p>
-        <Line class="echart" style="margin: 0 auto" />
-      </el-col>
-
-      <el-col
-        :xs="22"
-        :sm="22"
-        :md="11"
-        :lg="11"
-        :xl="11"
-        style="
-          width: 200px;
-          height: 300px;
-          margin: 10px;
-          border: 0.01rem solid var(--el-color-primary);
-        "
-        v-motion
-        :initial="{
-          opacity: 0,
-          y: 100
-        }"
-        :enter="{
-          opacity: 1,
-          y: 0,
-          transition: {
-            delay: 200
-          }
-        }"
-      >
-        <p class="font-medium pt-1">Image</p>
-        <img
-          src="../../assets/avatars.jpg"
-          alt="avatars"
-          class="img"
-          style="width: 200px; height: 200px; margin: 50px auto"
-        />
-      </el-col>
-    </el-row>
-  </el-card>
-</template>
-
-<style lang="scss" scoped>
-:deep(.el-table__row.warning-row) {
-  --el-table-tr-bg-color: var(--el-color-warning-light-9);
-}
-
-:deep(.el-table__row.success-row) {
-  --el-table-tr-bg-color: var(--el-color-success-light-9);
-}
-
-.card-header {
-  display: flex;
-  justify-content: space-between;
-  align-items: center;
-}
-</style>

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

@@ -1,120 +0,0 @@
-<script setup lang="ts">
-import { ref, unref } from "vue";
-import { ElMessage } from "element-plus";
-import avatars from "/@/assets/avatars.jpg";
-import ReQrcode from "/@/components/ReQrcode";
-
-defineOptions({
-  name: "QrCode"
-});
-
-const qrcodeText = "采销结算平台";
-
-const asyncTitle = ref("");
-setTimeout(() => {
-  asyncTitle.value = unref(qrcodeText);
-}, 3000);
-const codeClick = () => {
-  ElMessage.info("点击事件");
-};
-const disabledClick = () => {
-  ElMessage.info("失效");
-};
-</script>
-
-<template>
-  <div>
-    <el-card>
-      <template #header>
-        <div class="font-medium">
-          二维码(基于
-          <el-link
-            href="https://github.com/soldair/node-qrcode"
-            target="_blank"
-            style="font-size: 16px; margin: 0 5px 4px 0"
-          >
-            qrcode
-          </el-link>
-          生成)
-        </div>
-      </template>
-      <el-row :gutter="20" justify="space-between">
-        <el-col :xl="6" :lg="6" :md="12" :sm="24" :xs="24">
-          <el-card shadow="hover" class="mb-10px text-center">
-            <div class="font-bold">基础用法</div>
-            <ReQrcode :text="qrcodeText" />
-          </el-card>
-        </el-col>
-        <el-col :xl="6" :lg="6" :md="12" :sm="24" :xs="24">
-          <el-card shadow="hover" class="mb-10px text-center">
-            <div class="font-bold">img标签</div>
-            <ReQrcode :text="qrcodeText" tag="img" />
-          </el-card>
-        </el-col>
-        <el-col :xl="6" :lg="6" :md="12" :sm="24" :xs="24">
-          <el-card shadow="hover" class="mb-10px text-center">
-            <div class="font-bold">样式配置</div>
-            <ReQrcode
-              :text="qrcodeText"
-              :options="{
-                color: {
-                  dark: '#55D187',
-                  light: '#2d8cf0'
-                }
-              }"
-            />
-          </el-card>
-        </el-col>
-        <el-col :xl="6" :lg="6" :md="12" :sm="24" :xs="24">
-          <el-card shadow="hover" class="mb-10px text-center">
-            <div class="font-bold">点击事件</div>
-            <ReQrcode :text="qrcodeText" @click="codeClick" />
-          </el-card>
-        </el-col>
-        <el-col :xl="6" :lg="6" :md="12" :sm="24" :xs="24">
-          <el-card shadow="hover" class="mb-10px text-center">
-            <div class="font-bold">异步内容</div>
-            <ReQrcode :text="asyncTitle" />
-          </el-card>
-        </el-col>
-        <el-col :xl="6" :lg="6" :md="12" :sm="24" :xs="24">
-          <el-card shadow="hover" class="mb-10px text-center">
-            <div class="font-bold">失效</div>
-            <ReQrcode
-              :text="qrcodeText"
-              disabled
-              @disabled-click="disabledClick"
-            />
-          </el-card>
-        </el-col>
-        <el-col :xl="6" :lg="6" :md="12" :sm="24" :xs="24">
-          <el-card shadow="hover" class="mb-10px text-center">
-            <div class="font-bold">logo配置</div>
-            <ReQrcode :text="qrcodeText" :logo="avatars" />
-          </el-card>
-        </el-col>
-        <el-col :xl="6" :lg="6" :md="12" :sm="24" :xs="24">
-          <el-card shadow="hover" class="mb-10px text-center">
-            <div class="font-bold">logo样式</div>
-            <ReQrcode
-              :text="qrcodeText"
-              :logo="{
-                src: avatars,
-                logoSize: 0.2,
-                borderSize: 0.05,
-                borderRadius: 50,
-                bgColor: 'blue'
-              }"
-            />
-          </el-card>
-        </el-col>
-        <el-col :xl="6" :lg="6" :md="12" :sm="24" :xs="24">
-          <el-card shadow="hover" class="mb-10px text-center">
-            <div class="font-bold">大小配置</div>
-            <ReQrcode :text="qrcodeText" :width="100" />
-          </el-card>
-        </el-col>
-      </el-row>
-    </el-card>
-  </div>
-</template>

+ 0 - 141
src/views/able/swiper.vue

@@ -1,141 +0,0 @@
-<script setup lang="ts">
-import "swiper/css";
-import "swiper/css/navigation";
-import "swiper/css/pagination";
-import type { SwiperOptions } from "swiper";
-import { Swiper, SwiperSlide } from "swiper/vue";
-import SwiperCore, { Autoplay, Navigation, Pagination } from "swiper";
-
-defineOptions({
-  name: "Swiper"
-});
-
-type SwiperExampleOptions = Pick<
-  SwiperOptions,
-  | "navigation"
-  | "pagination"
-  | "scrollbar"
-  | "slidesPerView"
-  | "slidesPerGroup"
-  | "spaceBetween"
-  | "direction"
-  | "loop"
-  | "loopFillGroupWithBlank"
-  | "autoplay"
->;
-interface SwiperExample {
-  id: number;
-  label: string;
-  options: Partial<SwiperExampleOptions>;
-}
-SwiperCore.use([Autoplay, Navigation, Pagination]);
-
-const swiperExample: SwiperExample[] = [
-  { id: 0, label: "Default", options: {} },
-  {
-    id: 1,
-    label: "Navigation",
-    options: {
-      navigation: true
-    }
-  },
-  {
-    id: 2,
-    label: "Pagination",
-    options: {
-      pagination: true
-    }
-  },
-  {
-    id: 3,
-    label: "Pagination dynamic",
-    options: {
-      pagination: { dynamicBullets: true }
-    }
-  },
-  {
-    id: 4,
-    label: "Pagination progress",
-    options: {
-      navigation: true,
-      pagination: {
-        type: "progressbar"
-      }
-    }
-  },
-  {
-    id: 5,
-    label: "Pagination fraction",
-    options: {
-      navigation: true,
-      pagination: {
-        type: "fraction"
-      }
-    }
-  },
-  {
-    id: 6,
-    label: "Slides per view",
-    options: {
-      pagination: {
-        clickable: true
-      },
-      slidesPerView: 3,
-      spaceBetween: 30
-    }
-  },
-  {
-    id: 7,
-    label: "Infinite loop",
-    options: {
-      autoplay: {
-        delay: 2000,
-        disableOnInteraction: false
-      },
-      navigation: true,
-      pagination: {
-        clickable: true
-      },
-      loop: true
-    }
-  }
-];
-</script>
-
-<template>
-  <el-card>
-    <template #header>
-      <div class="font-medium">
-        Swiper插件(
-        <el-link
-          href="https://github.com/nolimits4web/swiper"
-          target="_blank"
-          style="font-size: 16px; margin: 0 5px 4px 0"
-        >
-          github地址
-        </el-link>
-        )
-      </div>
-    </template>
-    <el-row :gutter="10">
-      <el-col v-for="item in swiperExample" :key="item.id" :span="12">
-        <h3 class="py-24px text-24px font-bold">{{ item.label }}</h3>
-        <swiper v-bind="item.options">
-          <swiper-slide v-for="i in 5" :key="i">
-            <div
-              class="flex justify-center items-center h-240px border-1px border-[#999] text-18px font-bold"
-            >
-              Slide{{ i }}
-            </div>
-          </swiper-slide>
-        </swiper>
-      </el-col>
-    </el-row>
-  </el-card>
-</template>
-
-<style scoped lang="scss">
-:deep(.el-card__body) {
-  padding-top: 0;
-}
-</style>

+ 0 - 105
src/views/able/timeline.vue

@@ -1,105 +0,0 @@
-<script setup lang="ts">
-import { useRenderIcon } from "/@/components/ReIcon/src/hooks";
-import { useRenderFlicker } from "/@/components/ReFlicker";
-
-defineOptions({
-  name: "TimeLine"
-});
-
-const { lastBuildTime } = __APP_INFO__;
-const activities = [
-  {
-    content: "支持圆点闪动",
-    timestamp: lastBuildTime,
-    icon: useRenderFlicker()
-  },
-  {
-    content: "支持方形闪动",
-    timestamp: lastBuildTime,
-    icon: useRenderFlicker({ borderRadius: 0, background: "#67C23A" })
-  },
-  {
-    content: "支持默认颜色",
-    timestamp: lastBuildTime
-  },
-  {
-    content: "支持自定义颜色",
-    timestamp: lastBuildTime,
-    color: "#F56C6C"
-  },
-  {
-    content: "支持自定义图标",
-    timestamp: lastBuildTime,
-    color: "transparent",
-    icon: useRenderIcon("iphone", {
-      color: "#0bbd87"
-    })
-  }
-];
-</script>
-
-<template>
-  <el-card>
-    <template #header>
-      <div class="card-header">
-        <span class="font-medium">时间线</span>
-      </div>
-    </template>
-    <div class="flex">
-      <el-timeline>
-        <el-timeline-item
-          v-for="(activity, index) in activities"
-          :key="index"
-          :icon="activity.icon"
-          :color="activity.color"
-          :timestamp="activity.timestamp"
-        >
-          {{ activity.content }}
-        </el-timeline-item>
-      </el-timeline>
-
-      <el-timeline class="pl-40">
-        <el-timeline-item
-          v-for="(activity, index) in activities"
-          :key="index"
-          :icon="activity.icon"
-          :color="activity.color"
-          :timestamp="activity.timestamp"
-          placement="bottom"
-        >
-          <div class="message">
-            vue-pure-admin是基于Vue3.0+TypeScript+Vite2.0+Element-Plus编写的一套后台管理系统
-          </div>
-        </el-timeline-item>
-      </el-timeline>
-    </div>
-  </el-card>
-</template>
-
-<style scoped>
-.message {
-  width: 200px;
-  background-color: var(--el-color-primary);
-  border-color: var(--el-color-primary);
-  color: #fff;
-  line-height: 18px;
-  padding: 5px 12px 5px 12px;
-  box-sizing: border-box;
-  border-radius: 6px;
-  position: relative;
-  word-break: break-all;
-}
-
-.message::after {
-  content: "";
-  position: absolute;
-  top: 8px;
-  left: -10px;
-  width: 0;
-  height: 0;
-  overflow: hidden;
-  border-color: var(--el-color-primary) transparent transparent;
-  border-style: solid dashed dashed;
-  border-width: 10px;
-}
-</style>

+ 0 - 70
src/views/able/virtual-list/data.ts

@@ -1,70 +0,0 @@
-import { faker } from "@faker-js/faker";
-
-let uid = 0;
-
-function generateItem() {
-  return {
-    name: faker.name.findName(),
-    avatar: faker.internet.avatar()
-  };
-}
-
-export function getData(count, letters) {
-  const raw = {};
-
-  const alphabet = "abcdefghijklmnopqrstuvwxyz".split("");
-
-  for (const l of alphabet) {
-    raw[l] = [];
-  }
-
-  for (let i = 0; i < count; i++) {
-    const item = generateItem();
-    const letter = item.name.charAt(0).toLowerCase();
-    raw[letter].push(item);
-  }
-
-  const list = [];
-  let index = 1;
-
-  for (const l of alphabet) {
-    raw[l] = raw[l].sort((a, b) => (a.name < b.name ? -1 : 1));
-    if (letters) {
-      list.push({
-        id: uid++,
-        index: index++,
-        type: "letter",
-        value: l,
-        height: 200
-      });
-    }
-    for (const item of raw[l]) {
-      list.push({
-        id: uid++,
-        index: index++,
-        type: "person",
-        value: item,
-        height: 50
-      });
-    }
-  }
-
-  return list;
-}
-
-export function addItem(list) {
-  list.push({
-    id: uid++,
-    index: list.length + 1,
-    type: "person",
-    value: generateItem(),
-    height: 50
-  });
-}
-
-export function generateMessage() {
-  return {
-    avatar: faker.internet.avatar(),
-    message: faker.lorem.text()
-  };
-}

+ 0 - 138
src/views/able/virtual-list/horizontal.vue

@@ -1,138 +0,0 @@
-<script setup lang="ts">
-import { ref, computed } from "vue";
-import { generateMessage } from "./data";
-
-const items = ref([]);
-const search = ref("");
-
-for (let i = 0; i < 10000; i++) {
-  items.value.push({
-    id: i,
-    ...generateMessage()
-  });
-}
-
-const filteredItems = computed(() => {
-  if (!search.value) return items.value;
-  const lowerCaseSearch = search.value.toLowerCase();
-  return items.value.filter(i =>
-    i.message.toLowerCase().includes(lowerCaseSearch)
-  );
-});
-
-function changeMessage(message) {
-  Object.assign(message, generateMessage());
-}
-</script>
-
-<template>
-  <div class="dynamic-scroller-demo">
-    <div class="flex justify-around mb-4">
-      <el-input
-        class="mr-2 !w-1/1.5"
-        clearable
-        v-model="search"
-        placeholder="Filter..."
-        style="width: 300px"
-      />
-      <el-tag effect="dark">水平模式horizontal</el-tag>
-    </div>
-
-    <DynamicScroller
-      :items="filteredItems"
-      :min-item-size="54"
-      direction="horizontal"
-      class="scroller"
-    >
-      <template #default="{ item, index, active }">
-        <DynamicScrollerItem
-          :item="item"
-          :active="active"
-          :size-dependencies="[item.message]"
-          :data-index="index"
-          :data-active="active"
-          :title="`Click to change message ${index}`"
-          :style="{
-            width: `${Math.max(
-              130,
-              Math.round((item.message.length / 20) * 20)
-            )}px`
-          }"
-          class="message"
-          @click="changeMessage(item)"
-        >
-          <div class="avatar">
-            <IconifyIconOnline
-              icon="openmoji:beaming-face-with-smiling-eyes"
-              width="40"
-            />
-          </div>
-          <div class="text">
-            {{ item.message }}
-          </div>
-          <div class="index">
-            <span>{{ item.id }} (id)</span>
-            <span>{{ index }} (index)</span>
-          </div>
-        </DynamicScrollerItem>
-      </template>
-    </DynamicScroller>
-  </div>
-</template>
-
-<style scoped>
-.dynamic-scroller-demo {
-  overflow: hidden;
-  display: flex;
-  flex-direction: column;
-}
-
-.scroller {
-  flex: auto 1 1;
-}
-
-.notice {
-  padding: 24px;
-  font-size: 20px;
-  color: #999;
-}
-
-.message {
-  display: flex;
-  flex-direction: column;
-  min-height: 32px;
-  padding: 12px;
-  box-sizing: border-box;
-}
-
-.avatar {
-  flex: auto 0 0;
-  width: 32px;
-  height: 32px;
-  border-radius: 50%;
-  margin-bottom: 12px;
-}
-
-.avatar .image {
-  max-width: 100%;
-  max-height: 100%;
-  border-radius: 50%;
-}
-
-.index,
-.text {
-  flex: 1;
-}
-
-.text {
-  margin-bottom: 12px;
-}
-
-.index {
-  opacity: 0.5;
-}
-
-.index span {
-  display: block;
-}
-</style>

+ 0 - 30
src/views/able/virtual-list/index.vue

@@ -1,30 +0,0 @@
-<script setup lang="ts">
-import verticalList from "./vertical.vue";
-import horizontalList from "./horizontal.vue";
-
-defineOptions({
-  name: "VirtualList"
-});
-</script>
-
-<template>
-  <el-card>
-    <template #header>
-      <div class="font-medium">
-        虚拟列表组件(
-        <el-link
-          href="https://github.com/Akryum/vue-virtual-scroller/tree/next/packages/vue-virtual-scroller"
-          target="_blank"
-          style="font-size: 16px; margin: 0 5px 4px 0"
-        >
-          github地址
-        </el-link>
-        )
-      </div>
-    </template>
-    <div class="w-full flex justify-around flex-wrap">
-      <vertical-list class="h-500px w-500px" />
-      <horizontal-list class="h-500px w-500px" />
-    </div>
-  </el-card>
-</template>

+ 0 - 124
src/views/able/virtual-list/vertical.vue

@@ -1,124 +0,0 @@
-<script setup lang="ts">
-import { ref, computed } from "vue";
-import { generateMessage } from "./data";
-
-const items = ref([]);
-const search = ref("");
-
-for (let i = 0; i < 10000; i++) {
-  items.value.push({
-    id: i,
-    ...generateMessage()
-  });
-}
-
-const filteredItems = computed(() => {
-  if (!search.value) return items.value;
-  const lowerCaseSearch = search.value.toLowerCase();
-  return items.value.filter(i =>
-    i.message.toLowerCase().includes(lowerCaseSearch)
-  );
-});
-
-function changeMessage(message) {
-  Object.assign(message, generateMessage());
-}
-
-function onResize() {
-  console.log("resize");
-}
-</script>
-
-<template>
-  <div class="dynamic-scroller-demo">
-    <div class="flex justify-around mb-4">
-      <el-input
-        class="mr-2 !w-1/1.5"
-        clearable
-        v-model="search"
-        placeholder="Filter..."
-      />
-      <el-tag effect="dark">垂直模式vertical</el-tag>
-    </div>
-
-    <DynamicScroller
-      :items="filteredItems"
-      :min-item-size="54"
-      class="scroller"
-      @resize="onResize"
-    >
-      <template #default="{ item, index, active }">
-        <DynamicScrollerItem
-          :item="item"
-          :active="active"
-          :size-dependencies="[item.message]"
-          :data-index="index"
-          :data-active="active"
-          :title="`Click to change message ${index}`"
-          class="message"
-          @click="changeMessage(item)"
-        >
-          <div class="avatar">
-            <IconifyIconOnline
-              icon="openmoji:beaming-face-with-smiling-eyes"
-              width="40"
-            />
-          </div>
-          <div class="text">
-            {{ item.message }}
-          </div>
-          <div class="index">
-            <span>{{ item.id }} (id)</span>
-            <span>{{ index }} (index)</span>
-          </div>
-        </DynamicScrollerItem>
-      </template>
-    </DynamicScroller>
-  </div>
-</template>
-
-<style scoped>
-.dynamic-scroller-demo {
-  overflow: hidden;
-  display: flex;
-  flex-direction: column;
-}
-
-.scroller {
-  flex: auto 1 1;
-}
-
-.message {
-  display: flex;
-  min-height: 32px;
-  padding: 12px;
-  box-sizing: border-box;
-}
-
-.avatar {
-  flex: auto 0 0;
-  width: 32px;
-  height: 32px;
-  border-radius: 50%;
-  margin-right: 12px;
-}
-
-.index,
-.text {
-  flex: 1;
-}
-
-.text {
-  max-width: 400px;
-}
-
-.index {
-  opacity: 0.5;
-}
-
-.index span {
-  display: inline-block;
-  width: 160px;
-  text-align: right;
-}
-</style>

+ 0 - 38
src/views/able/watermark.vue

@@ -1,38 +0,0 @@
-<script setup lang="ts">
-import { ref } from "vue";
-import { useWatermark } from "@pureadmin/utils";
-
-defineOptions({
-  name: "WaterMark"
-});
-
-let color = ref("#409EFF");
-let value = ref("vue-pure-admin");
-const { setWatermark, clear } = useWatermark();
-</script>
-
-<template>
-  <el-card>
-    <template #header>
-      <div class="card-header">
-        <span class="font-medium">页面水印功能</span>
-      </div>
-    </template>
-    <span> 请输入要创建水印的值:</span>
-    <el-input
-      class="mb-4 mr-4"
-      style="width: 200px"
-      v-model="value"
-      clearable
-    />
-    <span>请选择要创建水印的颜色:</span>
-    <el-color-picker v-model="color" show-alpha />
-    <br />
-    <el-button @click="setWatermark(value, { fillStyle: color })">
-      创建
-    </el-button>
-    <el-button @click="clear">清除</el-button>
-  </el-card>
-</template>
-
-<style scoped></style>

+ 0 - 67
src/views/about/columns.tsx

@@ -1,67 +0,0 @@
-export function useColumns() {
-  const { pkg, lastBuildTime } = __APP_INFO__;
-  const { version } = pkg;
-  const columns = [
-    {
-      label: "版本",
-      cellRenderer: () => {
-        return <el-tag size="small">{version}</el-tag>;
-      }
-    },
-    {
-      label: "最后编译时间",
-      cellRenderer: () => {
-        return <el-tag size="small">{lastBuildTime}</el-tag>;
-      }
-    },
-    {
-      label: "文档地址",
-      cellRenderer: () => {
-        return (
-          <a href="https://pure-admin-doc.vercel.app" target="_blank">
-            <span style="color: var(--el-color-primary)">文档地址</span>
-          </a>
-        );
-      }
-    },
-    {
-      label: "预览地址",
-      cellRenderer: () => {
-        return (
-          <a href="https://vue-pure-admin.vercel.app" target="_blank">
-            <span style="color: var(--el-color-primary)">预览地址</span>
-          </a>
-        );
-      }
-    },
-    {
-      label: "Github",
-      cellRenderer: () => {
-        return (
-          <a
-            href="https://github.com/xiaoxian521/vue-pure-admin"
-            target="_blank"
-          >
-            <span style="color: var(--el-color-primary)">Github</span>
-          </a>
-        );
-      }
-    },
-    {
-      label: "QQ交流群",
-      cellRenderer: () => {
-        return (
-          <a href="https://jq.qq.com/?_wv=1027&k=HntMx0dt" target="_blank">
-            <span style="color: var(--el-color-primary)">
-              点击链接加入群聊【Pure Admin】
-            </span>
-          </a>
-        );
-      }
-    }
-  ];
-
-  return {
-    columns
-  };
-}

+ 0 - 106
src/views/about/index.vue

@@ -1,106 +0,0 @@
-<script setup lang="ts">
-import { useColumns } from "./columns";
-export interface schemaItem {
-  field: string;
-  label: string;
-}
-
-defineOptions({
-  name: "About"
-});
-
-const { pkg } = __APP_INFO__;
-const { dependencies, devDependencies } = pkg;
-
-const schema: schemaItem[] = [];
-const devSchema: schemaItem[] = [];
-
-const { columns } = useColumns();
-
-Object.keys(dependencies).forEach(key => {
-  schema.push({ field: dependencies[key], label: key });
-});
-
-Object.keys(devDependencies).forEach(key => {
-  devSchema.push({ field: devDependencies[key], label: key });
-});
-</script>
-
-<template>
-  <div>
-    <el-card class="box-card mb-4" shadow="never">
-      <template #header>
-        <div class="card-header">
-          <span class="font-medium">关于</span>
-        </div>
-      </template>
-      <span style="font-size: 15px">
-        Pure-Admin 是一个基于Vue3、Vite2、TypeScript、Element-Plus
-        的中后台解决方案,它可以帮助您快速搭建企业级中后台,提供现成的开箱解决方案及丰富的示例。原则上不收取任何费用及版权,可以放心使用,不过如需二次开源(比如用此平台二次开发并开源)请联系作者获取许可!
-      </span>
-    </el-card>
-
-    <el-card class="box-card m-4" shadow="hover">
-      <template #header>
-        <div class="card-header">
-          <span class="font-medium">项目信息</span>
-        </div>
-      </template>
-      <PureDescriptions :columns="columns" border :column="3" align="left" />
-    </el-card>
-
-    <el-card class="box-card m-4" shadow="hover">
-      <template #header>
-        <div class="card-header">
-          <span class="font-medium">生产环境依赖</span>
-        </div>
-      </template>
-      <el-descriptions border>
-        <el-descriptions-item
-          :label="item.label"
-          label-align="left"
-          align="left"
-          v-for="(item, index) in schema"
-          :key="index"
-        >
-          <a
-            :href="'https://www.npmjs.com/package/' + item.label"
-            target="_blank"
-          >
-            <span style="color: var(--el-color-primary)">{{ item.field }}</span>
-          </a>
-        </el-descriptions-item>
-      </el-descriptions>
-    </el-card>
-
-    <el-card class="box-card m-4" shadow="hover">
-      <template #header>
-        <div class="card-header">
-          <span class="font-medium">开发环境依赖</span>
-        </div>
-      </template>
-      <el-descriptions border>
-        <el-descriptions-item
-          :label="item.label"
-          label-align="left"
-          align="left"
-          v-for="(item, index) in devSchema"
-          :key="index"
-        >
-          <a
-            :href="'https://www.npmjs.com/package/' + item.label"
-            target="_blank"
-          >
-            <span style="color: var(--el-color-primary)">{{ item.field }}</span>
-          </a>
-        </el-descriptions-item>
-      </el-descriptions>
-    </el-card>
-  </div>
-</template>
-
-<style lang="scss" scoped>
-.main-content {
-  margin: 0 !important;
-}
-</style>

+ 0 - 30
src/views/components/button/index.vue

@@ -1,30 +0,0 @@
-<script setup lang="ts">
-import { ref } from "vue";
-import { loadEnv } from "@build/index";
-
-defineOptions({
-  name: "Button"
-});
-
-const { VITE_PUBLIC_PATH } = loadEnv();
-
-const url = ref(`${VITE_PUBLIC_PATH}html/button.html`);
-</script>
-
-<template>
-  <el-card>
-    <template #header>
-      <div class="card-header">
-        <span class="font-medium">通过iframe引入按钮页面</span>
-      </div>
-    </template>
-    <iframe :src="url" frameborder="0" class="iframe" />
-  </el-card>
-</template>
-
-<style scoped>
-.iframe {
-  width: 100%;
-  height: 60vh;
-}
-</style>

+ 0 - 74
src/views/components/contextmenu/basic.vue

@@ -1,74 +0,0 @@
-<template>
-  <div>
-    <h1>基本使用</h1>
-    <div v-contextmenu:contextmenu class="wrapper">
-      <code>右键点击此区域</code>
-    </div>
-
-    <v-contextmenu ref="contextmenu">
-      <v-contextmenu-item>GitHub</v-contextmenu-item>
-      <v-contextmenu-item>GitLab</v-contextmenu-item>
-
-      <v-contextmenu-divider />
-
-      <v-contextmenu-submenu title="蔬菜菜">
-        <v-contextmenu-item>土豆</v-contextmenu-item>
-
-        <v-contextmenu-submenu title="青菜">
-          <v-contextmenu-item>小油菜</v-contextmenu-item>
-          <v-contextmenu-item>空心菜</v-contextmenu-item>
-        </v-contextmenu-submenu>
-
-        <v-contextmenu-item>黄瓜</v-contextmenu-item>
-      </v-contextmenu-submenu>
-
-      <v-contextmenu-item disabled>菠萝蜜</v-contextmenu-item>
-
-      <v-contextmenu-divider />
-
-      <v-contextmenu-item>哈密瓜</v-contextmenu-item>
-    </v-contextmenu>
-  </div>
-</template>
-
-<script lang="ts">
-import { defineComponent } from "vue";
-
-import {
-  directive,
-  Contextmenu,
-  ContextmenuItem,
-  ContextmenuDivider,
-  ContextmenuSubmenu,
-  ContextmenuGroup
-} from "v-contextmenu";
-
-export default defineComponent({
-  name: "ExampleSimple",
-
-  components: {
-    [Contextmenu.name]: Contextmenu,
-    [ContextmenuItem.name]: ContextmenuItem,
-    [ContextmenuDivider.name]: ContextmenuDivider,
-    [ContextmenuSubmenu.name]: ContextmenuSubmenu,
-    [ContextmenuGroup.name]: ContextmenuGroup
-  },
-
-  directives: {
-    contextmenu: directive
-  }
-});
-</script>
-
-<style scoped>
-.wrapper {
-  display: flex;
-  justify-content: center;
-  align-items: center;
-  width: 300px;
-  height: 200px;
-  border: 3px dashed rgba(90, 167, 164, 0.9);
-  border-radius: 8px;
-  background-color: rgba(90, 167, 164, 0.2);
-}
-</style>

+ 0 - 33
src/views/components/contextmenu/index.vue

@@ -1,33 +0,0 @@
-<script setup lang="ts">
-import basic from "./basic.vue";
-import menuGroup from "./menuGroup.vue";
-import menuDynamic from "./menuDynamic.vue";
-
-defineOptions({
-  name: "ContextMenu"
-});
-</script>
-
-<template>
-  <el-card>
-    <template #header>
-      <div class="card-header">
-        <span class="font-medium">右键菜单组件</span>
-      </div>
-    </template>
-    <el-row :gutter="24">
-      <el-col :xs="24" :sm="10" :md="10" :lg="8" :xl="10">
-        <!-- 基本使用 -->
-        <basic />
-      </el-col>
-      <el-col :xs="24" :sm="10" :md="10" :lg="8" :xl="10">
-        <!-- 按钮组 -->
-        <menuGroup />
-      </el-col>
-      <el-col :xs="24" :sm="10" :md="10" :lg="8" :xl="10">
-        <!-- 动态菜单 -->
-        <menuDynamic />
-      </el-col>
-    </el-row>
-  </el-card>
-</template>

+ 0 - 110
src/views/components/contextmenu/menuDynamic.vue

@@ -1,110 +0,0 @@
-<template>
-  <div>
-    <h1>动态菜单</h1>
-    <div v-contextmenu:contextmenu class="wrapper">
-      <code>右键点击此区域</code>
-    </div>
-
-    <v-contextmenu ref="contextmenu">
-      <v-contextmenu-group title="操作">
-        <v-contextmenu-item :hide-on-click="false" @click="extra.push('item')">
-          添加菜单
-        </v-contextmenu-item>
-        <v-contextmenu-item :hide-on-click="false" @click="extra.push('group')">
-          添加菜单组
-        </v-contextmenu-item>
-        <v-contextmenu-item
-          :hide-on-click="false"
-          @click="extra.push('submenu')"
-        >
-          添加子菜单
-        </v-contextmenu-item>
-        <v-contextmenu-item :hide-on-click="false" @click="extra.pop()">
-          删除
-        </v-contextmenu-item>
-      </v-contextmenu-group>
-
-      <template v-for="(item, index) of extra" :key="index">
-        <v-contextmenu-divider />
-
-        <v-contextmenu-group
-          v-if="item === 'group'"
-          :title="`菜单组 ${index + 1}`"
-        >
-          <v-contextmenu-item>菜单1</v-contextmenu-item>
-          <v-contextmenu-item>菜单2</v-contextmenu-item>
-          <v-contextmenu-item>菜单3</v-contextmenu-item>
-        </v-contextmenu-group>
-
-        <v-contextmenu-submenu
-          v-else-if="item === 'submenu'"
-          :title="`子菜单 ${index + 1}`"
-        >
-          <v-contextmenu-item>菜单1</v-contextmenu-item>
-          <v-contextmenu-item>菜单2</v-contextmenu-item>
-          <v-contextmenu-item>菜单3</v-contextmenu-item>
-        </v-contextmenu-submenu>
-
-        <v-contextmenu-item v-else>菜单 {{ index + 1 }}</v-contextmenu-item>
-      </template>
-    </v-contextmenu>
-  </div>
-</template>
-
-<script lang="ts">
-import { defineComponent } from "vue";
-
-import {
-  directive,
-  Contextmenu,
-  ContextmenuItem,
-  ContextmenuDivider,
-  ContextmenuSubmenu,
-  ContextmenuGroup
-} from "v-contextmenu";
-
-export default defineComponent({
-  name: "ExampleDynamic",
-
-  components: {
-    [Contextmenu.name]: Contextmenu,
-    [ContextmenuItem.name]: ContextmenuItem,
-    [ContextmenuDivider.name]: ContextmenuDivider,
-    [ContextmenuSubmenu.name]: ContextmenuSubmenu,
-    [ContextmenuGroup.name]: ContextmenuGroup
-  },
-
-  directives: {
-    contextmenu: directive
-  },
-
-  data() {
-    return {
-      extra: []
-    };
-  },
-
-  methods: {
-    addItem(type = "item") {
-      this.extra.push(type);
-    },
-    removeItem() {
-      this.extra.pop();
-    }
-  }
-});
-</script>
-
-<style scoped>
-.wrapper {
-  display: flex;
-  justify-content: center;
-  align-items: center;
-  width: 300px;
-  height: 200px;
-  margin-bottom: 30px;
-  border: 3px dashed rgba(90, 167, 164, 0.9);
-  border-radius: 8px;
-  background-color: rgba(90, 167, 164, 0.2);
-}
-</style>

+ 0 - 71
src/views/components/contextmenu/menuGroup.vue

@@ -1,71 +0,0 @@
-<template>
-  <div>
-    <h1>按钮组</h1>
-    <div v-contextmenu:contextmenu class="wrapper">
-      <code>右键点击此区域</code>
-    </div>
-
-    <v-contextmenu ref="contextmenu">
-      <v-contextmenu-item>菜单</v-contextmenu-item>
-
-      <v-contextmenu-group>
-        <v-contextmenu-item>Github</v-contextmenu-item>
-        <v-contextmenu-item>Codepen</v-contextmenu-item>
-        <v-contextmenu-item disabled>Alipay</v-contextmenu-item>
-        <v-contextmenu-item>Wechat</v-contextmenu-item>
-      </v-contextmenu-group>
-
-      <v-contextmenu-divider />
-
-      <v-contextmenu-group title="按钮组">
-        <v-contextmenu-item>菜单1</v-contextmenu-item>
-        <v-contextmenu-item>菜单2</v-contextmenu-item>
-        <v-contextmenu-item disabled>菜单3</v-contextmenu-item>
-      </v-contextmenu-group>
-    </v-contextmenu>
-  </div>
-</template>
-
-<script lang="ts">
-import { defineComponent } from "vue";
-
-import {
-  directive,
-  Contextmenu,
-  ContextmenuItem,
-  ContextmenuDivider,
-  ContextmenuSubmenu,
-  ContextmenuGroup
-} from "v-contextmenu";
-
-const ExampleSFC = defineComponent({
-  name: "ExampleSFC",
-
-  components: {
-    [Contextmenu.name]: Contextmenu,
-    [ContextmenuItem.name]: ContextmenuItem,
-    [ContextmenuDivider.name]: ContextmenuDivider,
-    [ContextmenuSubmenu.name]: ContextmenuSubmenu,
-    [ContextmenuGroup.name]: ContextmenuGroup
-  },
-
-  directives: {
-    contextmenu: directive
-  }
-});
-
-export default ExampleSFC;
-</script>
-
-<style scoped>
-.wrapper {
-  display: flex;
-  justify-content: center;
-  align-items: center;
-  width: 300px;
-  height: 200px;
-  border: 3px dashed rgba(90, 167, 164, 0.9);
-  border-radius: 8px;
-  background-color: rgba(90, 167, 164, 0.2);
-}
-</style>

+ 0 - 47
src/views/components/count-to/index.vue

@@ -1,47 +0,0 @@
-<script setup lang="ts">
-import { ReNormalCountTo, ReboundCountTo } from "/@/components/ReCountTo";
-
-defineOptions({
-  name: "CountTo"
-});
-</script>
-
-<template>
-  <el-card>
-    <template #header>
-      <div class="card-header">
-        <span class="font-medium">数字动画组件</span>
-      </div>
-    </template>
-    <div class="flex items-center">
-      <ReNormalCountTo
-        prefix="$"
-        :duration="1000"
-        :color="'#409EFF'"
-        :fontSize="'2em'"
-        :startVal="1"
-        :endVal="1000"
-      />
-      <ul class="flex ml-8">
-        <ReboundCountTo
-          v-for="(num, inx) of [1, 6, 6, 6]"
-          :key="inx"
-          :i="num"
-          :blur="inx"
-          :delay="inx + 1"
-        />
-      </ul>
-    </div>
-  </el-card>
-</template>
-
-<style lang="scss" scoped>
-.flex {
-  display: flex;
-}
-
-:deep(.el-card) {
-  text-align: center;
-  margin-bottom: 10px;
-}
-</style>

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

@@ -1,63 +0,0 @@
-<script setup lang="ts">
-import { ref, nextTick, getCurrentInstance } from "vue";
-import Cropper from "/@/components/ReCropper";
-import img from "./picture.jpeg";
-
-defineOptions({
-  name: "Cropping"
-});
-
-let info = ref<object>(null);
-let cropperImg = ref<string>("");
-const instance = getCurrentInstance();
-
-const onCropper = (): void => {
-  nextTick(() => {
-    // @ts-expect-error
-    instance.refs.refCropper.cropper.getCroppedCanvas().toBlob(blob => {
-      let fileReader: FileReader = new FileReader();
-      fileReader.onloadend = (e: ProgressEvent) => {
-        // @ts-ignore
-        cropperImg.value = e.target.result;
-        // @ts-expect-error
-        info.value = instance.refs.refCropper.cropper.getData();
-      };
-      fileReader.readAsDataURL(blob);
-    }, "image/jpeg");
-  });
-};
-</script>
-
-<template>
-  <el-card>
-    <template #header>
-      <div class="card-header">
-        <span class="font-medium">图片裁剪组件</span>
-      </div>
-    </template>
-    <div class="cropper-container">
-      <Cropper ref="refCropper" :width="'40vw'" :src="img" />
-      <img :src="cropperImg" class="croppered" v-if="cropperImg" />
-    </div>
-    <el-button type="primary" @click="onCropper">裁剪</el-button>
-    <p v-if="cropperImg">裁剪后图片信息:{{ info }}</p>
-  </el-card>
-</template>
-
-<style scoped>
-.cropper-container {
-  display: flex;
-  justify-content: space-between;
-  align-items: center;
-}
-
-.el-button {
-  margin-top: 10px;
-}
-
-.croppered {
-  display: block;
-  width: 45%;
-  height: 360px;
-}
-</style>

BIN
src/views/components/cropping/picture.jpeg


+ 0 - 220
src/views/components/draggable/index.vue

@@ -1,220 +0,0 @@
-<script setup lang="ts">
-import { ref, onMounted } from "vue";
-import draggable from "vuedraggable/src/vuedraggable";
-import { useRenderIcon } from "/@/components/ReIcon/src/hooks";
-
-defineOptions({
-  name: "Draggable"
-});
-
-let gridLists = ref<Array<Object>>([
-  { grid: "cn", num: 1 },
-  { grid: "cn", num: 2 },
-  { grid: "cn", num: 3 },
-  { grid: "cn", num: 4 },
-  { grid: "cn", num: 5 },
-  { grid: "cn", num: 6 },
-  { grid: "cn", num: 7 },
-  { grid: "cn", num: 8 },
-  { grid: "cn", num: 9 }
-]);
-
-let lists = ref<Array<Object>>([
-  { people: "cn", id: 1, name: "www.itxst.com" },
-  { people: "cn", id: 2, name: "www.baidu.com" },
-  { people: "cn", id: 3, name: "www.taobao.com" },
-  { people: "cn", id: 4, name: "www.google.com" }
-]);
-
-let cutLists = ref([
-  { people: "cn", id: 1, name: "cut1" },
-  { people: "cn", id: 2, name: "cut2" },
-  { people: "cn", id: 3, name: "cut3" },
-  { people: "cn", id: 4, name: "cut4" }
-]);
-
-const change = (evt): void => {
-  console.log("evt: ", evt);
-};
-
-onMounted(() => {
-  // 使用原生sortable实现元素位置切换
-  // @ts-ignore
-  new Sortable(document.querySelector(".cut-container"), {
-    swap: true,
-    forceFallback: true,
-    chosenClass: "chosen",
-    swapClass: "highlight",
-    animation: 300
-  });
-});
-</script>
-
-<template>
-  <el-card>
-    <template #header>
-      <div class="card-header">
-        <span>
-          拖拽组件,采用开源的
-          <el-link
-            href="https://sortablejs.github.io/vue.draggable.next/#/simple"
-            target="_blank"
-            :icon="useRenderIcon('rank')"
-            style="font-size: 16px; margin: 0 4px 5px"
-          >
-            vuedraggable
-          </el-link>
-        </span>
-      </div>
-    </template>
-    <div class="drag-container">
-      <!-- grid列表拖拽 -->
-      <el-row :gutter="25">
-        <el-col :xs="25" :sm="8" :md="8" :lg="8">
-          <el-card>
-            <template #header>
-              <div class="card-header">
-                <span>grid列表拖拽</span>
-              </div>
-            </template>
-            <draggable
-              v-model="gridLists"
-              class="grid-container"
-              item-key="grid"
-              animation="300"
-              chosenClass="chosen"
-              forceFallback="true"
-            >
-              <template #item="{ element }">
-                <div :class="'item' + ' ' + 'item-' + element.num">
-                  {{ element.num }}
-                </div>
-              </template>
-            </draggable>
-          </el-card>
-        </el-col>
-
-        <el-col :xs="25" :sm="8" :md="8" :lg="8">
-          <el-card>
-            <template #header>
-              <div class="card-header">
-                <span>单列拖拽</span>
-              </div>
-            </template>
-            <!-- 单列拖拽 -->
-            <draggable
-              v-model="lists"
-              item-key="name"
-              @change="change"
-              chosen-class="chosen"
-              force-fallback="true"
-              animation="300"
-            >
-              <template #item="{ element, index }">
-                <div class="item-single">{{ element.name }} {{ index }}</div>
-              </template>
-            </draggable>
-          </el-card>
-        </el-col>
-
-        <el-col :xs="25" :sm="8" :md="8" :lg="8">
-          <el-card>
-            <template #header>
-              <div class="card-header">
-                <span>拖拽实现元素位置切换</span>
-              </div>
-            </template>
-            <!-- 拖拽实现元素位置切换 -->
-            <div class="cut-container">
-              <div
-                class="item-cut"
-                v-for="(item, index) in cutLists"
-                :key="index"
-              >
-                <p>{{ item.name }}</p>
-              </div>
-            </div>
-          </el-card>
-        </el-col>
-      </el-row>
-    </div>
-  </el-card>
-</template>
-
-<style lang="scss" scoped>
-/* grid列表拖拽 */
-.grid-container {
-  display: grid;
-  grid-template-columns: 33.3% 33.3% 33.3%;
-  grid-template-rows: 33.3% 33.3% 33.3%;
-}
-
-.item-single {
-  font-size: 1.5em;
-  height: 77px;
-  text-align: center;
-  line-height: 85px;
-  border: 1px solid #e5e4e9;
-  cursor: move;
-}
-
-.item-cut {
-  font-size: 1.5em;
-  height: 77px;
-  line-height: 77px;
-  text-align: center;
-  border: 1px solid #e5e4e9;
-  cursor: move;
-}
-
-.item {
-  font-size: 2em;
-  text-align: center;
-  line-height: 100px;
-  border: 1px solid #e5e4e9;
-  cursor: move;
-  @media screen and (max-width: 750px) {
-    line-height: 90px;
-  }
-}
-
-.item-1 {
-  background-color: #ef342a;
-}
-
-.item-2 {
-  background-color: #f68f26;
-}
-
-.item-3 {
-  background-color: #4ba946;
-}
-
-.item-4 {
-  background-color: #0376c2;
-}
-
-.item-5 {
-  background-color: #c077af;
-}
-
-.item-6 {
-  background-color: #f8d29d;
-}
-
-.item-7 {
-  background-color: #b5a87f;
-}
-
-.item-8 {
-  background-color: #d0e4a9;
-}
-
-.item-9 {
-  background-color: #4dc7ec;
-}
-
-.chosen {
-  border: solid 2px #3089dc !important;
-}
-</style>

+ 0 - 17
src/views/components/map/index.vue

@@ -1,17 +0,0 @@
-<script setup lang="ts">
-import { Amap } from "/@/components/ReMap";
-
-defineOptions({
-  name: "Map"
-});
-</script>
-
-<template>
-  <Amap />
-</template>
-
-<style scoped>
-.main-content {
-  margin: 0 !important;
-}
-</style>

+ 0 - 159
src/views/components/seamless-scroll/index.vue

@@ -1,159 +0,0 @@
-<script setup lang="ts">
-import { ref, reactive, unref } from "vue";
-import { templateRef } from "@vueuse/core";
-import SeamlessScroll from "/@/components/ReSeamlessScroll";
-
-defineOptions({
-  name: "SeamlessScroll"
-});
-
-const scroll = templateRef<ElRef | null>("scroll", null);
-
-let listData = ref([
-  {
-    title: "无缝滚动第一行无缝滚动第一行!!!!!!!!!!"
-  },
-  {
-    title: "无缝滚动第二行无缝滚动第二行!!!!!!!!!!"
-  },
-  {
-    title: "无缝滚动第三行无缝滚动第三行!!!!!!!!!!"
-  },
-  {
-    title: "无缝滚动第四行无缝滚动第四行!!!!!!!!!!"
-  },
-  {
-    title: "无缝滚动第五行无缝滚动第五行!!!!!!!!!!"
-  },
-  {
-    title: "无缝滚动第六行无缝滚动第六行!!!!!!!!!!"
-  },
-  {
-    title: "无缝滚动第七行无缝滚动第七行!!!!!!!!!!"
-  },
-  {
-    title: "无缝滚动第八行无缝滚动第八行!!!!!!!!!!"
-  },
-  {
-    title: "无缝滚动第九行无缝滚动第九行!!!!!!!!!!"
-  }
-]);
-
-let classOption = reactive({
-  direction: "top"
-});
-
-function changeDirection(val) {
-  // @ts-ignore
-  unref(scroll).reset();
-  unref(classOption).direction = val;
-}
-</script>
-
-<template>
-  <el-space wrap>
-    <el-card class="box-card">
-      <template #header>
-        <div class="card-header">
-          <span>无缝滚动示例</span>
-          <el-button
-            class="button"
-            link
-            type="primary"
-            @click="changeDirection('top')"
-          >
-            <span
-              :style="{ color: classOption.direction === 'top' ? 'red' : '' }"
-            >
-              向上滚动
-            </span>
-          </el-button>
-          <el-button
-            class="button"
-            link
-            type="primary"
-            @click="changeDirection('bottom')"
-          >
-            <span
-              :style="{
-                color: classOption.direction === 'bottom' ? 'red' : ''
-              }"
-            >
-              向下滚动
-            </span>
-          </el-button>
-          <el-button
-            class="button"
-            link
-            type="primary"
-            @click="changeDirection('left')"
-          >
-            <span
-              :style="{ color: classOption.direction === 'left' ? 'red' : '' }"
-            >
-              向左滚动
-            </span>
-          </el-button>
-          <el-button
-            class="button"
-            link
-            type="primary"
-            @click="changeDirection('right')"
-          >
-            <span
-              :style="{ color: classOption.direction === 'right' ? 'red' : '' }"
-            >
-              向右滚动
-            </span>
-          </el-button>
-        </div>
-      </template>
-      <SeamlessScroll
-        ref="scroll"
-        :data="listData"
-        :class-option="classOption"
-        class="warp"
-      >
-        <ul class="item">
-          <li v-for="(item, index) in listData" :key="index">
-            <span class="title" v-text="item.title" />
-          </li>
-        </ul>
-      </SeamlessScroll>
-    </el-card>
-  </el-space>
-</template>
-
-<style lang="scss" scoped>
-.card-header {
-  display: flex;
-  justify-content: space-between;
-  align-items: center;
-
-  span {
-    margin-right: 20px;
-  }
-}
-
-.warp {
-  height: 270px;
-  width: 360px;
-  margin: 0 auto;
-  overflow: hidden;
-
-  ul {
-    list-style: none;
-    padding: 0;
-    margin: 0 auto;
-
-    li,
-    a {
-      height: 30px;
-      line-height: 30px;
-      display: flex;
-      justify-content: space-between;
-      font-size: 15px;
-    }
-  }
-}
-</style>

+ 0 - 51
src/views/components/selector/index.vue

@@ -1,51 +0,0 @@
-<script setup lang="ts">
-import { ref } from "vue";
-import Selector from "/@/components/ReSelector";
-
-defineOptions({
-  name: "Selector"
-});
-
-let selectRange = ref<string>("");
-let dataLists = ref([
-  {
-    title: "基本使用",
-    echo: [],
-    disabled: false
-  },
-  {
-    title: "回显模式",
-    echo: [2, 7],
-    disabled: true
-  }
-]);
-
-const selectedVal = ({ left, right }): void => {
-  selectRange.value = `${left}-${right}`;
-};
-</script>
-
-<template>
-  <div>
-    <el-card class="box-card" v-for="(item, key) in dataLists" :key="key">
-      <template #header>
-        <div class="card-header">
-          <span>{{ item.title }}</span>
-        </div>
-      </template>
-      <Selector
-        :HsKey="key"
-        :echo="item.echo"
-        @selectedVal="selectedVal"
-        :disabled="item.disabled"
-      />
-      <h4 v-if="!item.disabled">选中范围:{{ selectRange }}</h4>
-    </el-card>
-  </div>
-</template>
-
-<style scoped>
-.el-card {
-  margin-bottom: 10px;
-}
-</style>

+ 0 - 87
src/views/components/split-pane/index.vue

@@ -1,87 +0,0 @@
-<script setup lang="ts">
-import splitpane, { ContextProps } from "/@/components/ReSplitPane";
-import { reactive } from "vue";
-
-defineOptions({
-  name: "SplitPane"
-});
-
-const settingLR: ContextProps = reactive({
-  minPercent: 20,
-  defaultPercent: 40,
-  split: "vertical"
-});
-
-const settingTB: ContextProps = reactive({
-  minPercent: 20,
-  defaultPercent: 40,
-  split: "horizontal"
-});
-</script>
-
-<template>
-  <el-card>
-    <template #header>
-      <div class="card-header">
-        <span class="font-medium">切割面板组件</span>
-      </div>
-    </template>
-    <div class="split-pane">
-      <splitpane :splitSet="settingLR">
-        <!-- #paneL 表示指定该组件为左侧面板 -->
-        <template #paneL>
-          <!-- 自定义左侧面板的内容 -->
-          <div class="dv-a">A</div>
-        </template>
-        <!-- #paneR 表示指定该组件为右侧面板 -->
-        <template #paneR>
-          <!-- 再次将右侧面板进行拆分 -->
-          <splitpane :splitSet="settingTB">
-            <template #paneL>
-              <div class="dv-b">B</div>
-            </template>
-            <template #paneR>
-              <div class="dv-c">C</div>
-            </template>
-          </splitpane>
-        </template>
-      </splitpane>
-    </div>
-  </el-card>
-</template>
-
-<style lang="scss" scoped>
-$W: 100%;
-$H: 70vh;
-
-.split-pane {
-  width: 70vw;
-  height: $H;
-  text-align: center;
-  font-size: 50px;
-  color: #fff;
-  border: 1px solid #e5e6eb;
-
-  .dv-a,
-  .dv-b,
-  .dv-c {
-    width: $W;
-    height: $W;
-    color: rgba($color: dodgerblue, $alpha: 0.8);
-    line-height: $H;
-  }
-
-  .dv-b,
-  .dv-c {
-    line-height: 250px;
-  }
-
-  .dv-b {
-    color: rgba($color: #000, $alpha: 0.8);
-  }
-
-  .dv-c {
-    color: rgba($color: #ce272d, $alpha: 0.8);
-  }
-}
-</style>

+ 0 - 57
src/views/components/video/index.vue

@@ -1,57 +0,0 @@
-<script setup lang="ts">
-import { onMounted } from "vue";
-import Player from "xgplayer/dist/simple_player";
-import volume from "xgplayer/es/controls/volume";
-import { deviceDetection } from "@pureadmin/utils";
-import screenShot from "xgplayer/es/controls/screenShot";
-import playbackRate from "xgplayer/es/controls/playbackRate";
-import { useRenderIcon } from "/@/components/ReIcon/src/hooks";
-
-defineOptions({
-  name: "Video"
-});
-
-onMounted(() => {
-  new Player({
-    id: "mse",
-    // 默认静音
-    volume: 0,
-    autoplay: false,
-    screenShot: true,
-    url: "https://sf1-hscdn-tos.pstatp.com/obj/media-fe/xgplayer_doc_video/mp4/xgplayer-demo-720p.mp4",
-    poster:
-      "https://s2.pstatp.com/cdn/expire-1-M/byted-player-videos/1.0.0/poster.jpg",
-    fluid: deviceDetection(),
-    controlPlugins: [volume, playbackRate, screenShot],
-    //传入倍速可选数组
-    playbackRate: [0.5, 0.75, 1, 1.5, 2]
-  });
-});
-</script>
-
-<template>
-  <el-card>
-    <template #header>
-      <div class="card-header">
-        <span class="font-medium">
-          视频组件,采用开源的
-          <el-link
-            href="https://v2.h5player.bytedance.com"
-            target="_blank"
-            :icon="useRenderIcon('video-play')"
-            style="font-size: 16px; margin: 0 4px 5px"
-          >
-            西瓜播放器
-          </el-link></span
-        >
-      </div>
-    </template>
-    <div id="mse" />
-  </el-card>
-</template>
-
-<style scoped>
-#mse {
-  flex: auto;
-}
-</style>

+ 0 - 71
src/views/editor/index.vue

@@ -1,71 +0,0 @@
-<script setup lang="ts">
-import "@wangeditor/editor/dist/css/style.css"; // 引入 css
-import { Editor, Toolbar } from "@wangeditor/editor-for-vue";
-import { useRenderIcon } from "/@/components/ReIcon/src/hooks";
-import { onBeforeUnmount, ref, shallowRef, onMounted } from "vue";
-
-defineOptions({
-  name: "Editor"
-});
-
-const mode = "default";
-// 编辑器实例,必须用 shallowRef
-const editorRef = shallowRef();
-
-// 内容 HTML
-const valueHtml = ref("<p>hello</p>");
-
-// 模拟 ajax 异步获取内容
-onMounted(() => {
-  setTimeout(() => {
-    valueHtml.value = "<p>模拟 Ajax 异步设置内容</p>";
-  }, 1500);
-});
-
-const toolbarConfig: any = { excludeKeys: "fullScreen" };
-const editorConfig = { placeholder: "请输入内容..." };
-
-// 组件销毁时,也及时销毁编辑器
-onBeforeUnmount(() => {
-  const editor = editorRef.value;
-  if (editor == null) return;
-  editor.destroy();
-});
-
-const handleCreated = editor => {
-  editorRef.value = editor; // 记录 editor 实例,重要!
-};
-</script>
-
-<template>
-  <el-card>
-    <template #header>
-      <div class="card-header">
-        <span class="font-medium">
-          编辑器组件,采用开源的
-          <el-link
-            href="https://www.wangeditor.com"
-            target="_blank"
-            :icon="useRenderIcon('edit')"
-            style="font-size: 16px; margin: 0 4px 5px"
-          >
-            Wangeditor
-          </el-link>
-        </span>
-      </div>
-    </template>
-    <Toolbar
-      style="border-bottom: 1px solid #ccc"
-      :editor="editorRef"
-      :defaultConfig="toolbarConfig"
-      :mode="mode"
-    />
-    <Editor
-      style="height: 500px; overflow-y: hidden"
-      v-model="valueHtml"
-      :defaultConfig="editorConfig"
-      :mode="mode"
-      @onCreated="handleCreated"
-    />
-  </el-card>
-</template>

+ 0 - 30
src/views/form-design/index.vue

@@ -1,30 +0,0 @@
-<script setup lang="ts">
-import { ref, onBeforeMount } from "vue";
-import { useLoader } from "@pureadmin/utils";
-import { ElDesignForm } from "vue-form-create2";
-
-defineOptions({
-  name: "FormDesign"
-});
-
-const loading = ref(true);
-const { loadScript } = useLoader();
-
-onBeforeMount(() => {
-  loadScript({
-    src: "https://unpkg.com/ace-builds/src-noconflict/ace.js"
-  }).then(message => {
-    if (message === "success") loading.value = false;
-  });
-});
-</script>
-
-<template>
-  <ElDesignForm v-loading="loading" style="height: 100vh" />
-</template>
-
-<style lang="scss" scoped>
-.main-content {
-  margin: 0 !important;
-}
-</style>

+ 0 - 96
src/views/guide/index.vue

@@ -1,96 +0,0 @@
-<script setup lang="ts">
-import Driver from "driver.js";
-import "driver.js/dist/driver.min.css";
-
-defineOptions({
-  name: "Guide"
-});
-
-const steps = [
-  {
-    element: "#header-notice",
-    popover: {
-      title: "消息通知",
-      description: "你可以在这里查看管理员发送的消息",
-      position: "left"
-    }
-  },
-  {
-    element: "#header-screenfull",
-    popover: {
-      title: "全屏",
-      description: "你可以在这里进行全屏切换",
-      position: "left"
-    }
-  },
-  {
-    element: "#header-translation",
-    popover: {
-      title: "国际化",
-      description: "你可以在这里进行语言切换",
-      position: "left"
-    }
-  },
-  {
-    element: ".el-icon-setting",
-    popover: {
-      title: "项目配置",
-      description: "你可以在这里查看项目配置",
-      position: "left"
-    }
-  },
-  {
-    element: ".tags-view",
-    popover: {
-      title: "多标签页",
-      description: "这里是你访问过的页面的历史",
-      position: "buttom"
-    }
-  }
-];
-
-const driver = new Driver({
-  className: "scoped-class",
-  animate: true,
-  opacity: 0.75,
-  padding: 0,
-  allowClose: true,
-  overlayClickNext: false,
-  doneBtnText: "完成",
-  closeBtnText: "关闭",
-  nextBtnText: "下一步",
-  prevBtnText: "上一步"
-});
-
-const guide = () => {
-  driver.defineSteps(steps);
-  driver.start();
-};
-</script>
-
-<template>
-  <el-card>
-    <template #header>
-      <div class="card-header">
-        <span class="font-medium">
-          引导页对于一些第一次进入项目的人很有用,你可以简单介绍下项目的功能
-        </span>
-      </div>
-    </template>
-    <el-button
-      type="primary"
-      style="margin-top: 10px"
-      @click.prevent.stop="guide"
-    >
-      打开引导页
-    </el-button>
-  </el-card>
-</template>
-
-<style>
-div#driver-highlighted-element-stage,
-div#driver-page-overlay {
-  background: transparent !important;
-  outline: 5000px solid rgba(0, 0, 0, 0.75);
-}
-</style>

+ 0 - 175
src/views/list/card/components/Card.vue

@@ -1,175 +0,0 @@
-<script setup lang="ts">
-import { computed, PropType } from "vue";
-import shopIcon from "/@/assets/svg/shop.svg?component";
-import laptopIcon from "/@/assets/svg/laptop.svg?component";
-import serviceIcon from "/@/assets/svg/service.svg?component";
-import calendarIcon from "/@/assets/svg/calendar.svg?component";
-import userAvatarIcon from "/@/assets/svg/user_avatar.svg?component";
-
-export interface CardProductType {
-  type: number;
-  isSetup: boolean;
-  description: string;
-  name: string;
-}
-
-defineOptions({
-  name: "ReCard"
-});
-
-const props = defineProps({
-  product: {
-    type: Object as PropType<CardProductType>
-  }
-});
-
-const emit = defineEmits(["manage-product", "delete-item"]);
-
-const handleClickManage = (product: CardProductType) => {
-  emit("manage-product", product);
-};
-
-const handleClickDelete = (product: CardProductType) => {
-  emit("delete-item", product);
-};
-
-const cardClass = computed(() => [
-  "list-card-item",
-  { "list-card-item__disabled": !props.product.isSetup }
-]);
-
-const cardLogoClass = computed(() => [
-  "list-card-item_detail--logo",
-  { "list-card-item_detail--logo__disabled": !props.product.isSetup }
-]);
-</script>
-
-<template>
-  <div :class="cardClass">
-    <div class="list-card-item_detail">
-      <el-row justify="space-between">
-        <div :class="cardLogoClass">
-          <shopIcon v-if="product.type === 1" />
-          <calendarIcon v-if="product.type === 2" />
-          <serviceIcon v-if="product.type === 3" />
-          <userAvatarIcon v-if="product.type === 4" />
-          <laptopIcon v-if="product.type === 5" />
-        </div>
-        <div class="list-card-item_detail--operation">
-          <el-tag
-            :color="product.isSetup ? '#00a870' : '#eee'"
-            effect="dark"
-            class="mx-1 list-card-item_detail--operation--tag"
-          >
-            {{ product.isSetup ? "已启用" : "已停用" }}
-          </el-tag>
-          <el-dropdown
-            trigger="click"
-            :disabled="!product.isSetup"
-            max-height="2"
-          >
-            <IconifyIconOffline icon="more-vertical" class="icon-more" />
-            <template #dropdown>
-              <el-dropdown-menu :disabled="!product.isSetup">
-                <el-dropdown-item @click="handleClickManage(product)">
-                  管理
-                </el-dropdown-item>
-                <el-dropdown-item @click="handleClickDelete(product)">
-                  删除
-                </el-dropdown-item>
-              </el-dropdown-menu>
-            </template>
-          </el-dropdown>
-        </div>
-      </el-row>
-      <p class="list-card-item_detail--name">{{ product.name }}</p>
-      <p class="list-card-item_detail--desc">{{ product.description }}</p>
-    </div>
-  </div>
-</template>
-
-<style scoped lang="scss">
-$text-color-disabled: rgba(0, 0, 0, 0.26);
-
-.list-card-item {
-  display: flex;
-  flex-direction: column;
-  margin-bottom: 12px;
-  border-radius: 3px;
-  overflow: hidden;
-  cursor: pointer;
-  color: rgba(0, 0, 0, 0.6);
-
-  &_detail {
-    flex: 1;
-    background: #fff;
-    padding: 24px 32px;
-    min-height: 140px;
-
-    &--logo {
-      width: 56px;
-      height: 56px;
-      border-radius: 50%;
-      display: flex;
-      justify-content: center;
-      align-items: center;
-      background: #e0ebff;
-      font-size: 32px;
-      color: #0052d9;
-
-      &__disabled {
-        color: #a1c4ff;
-      }
-    }
-
-    &--operation {
-      display: flex;
-      height: 100%;
-
-      &--tag {
-        border: 0;
-      }
-    }
-
-    .icon-more {
-      font-size: 24px;
-      color: rgba(36, 36, 36, 1);
-    }
-
-    &--name {
-      margin: 24px 0 8px 0;
-      font-size: 16px;
-      font-weight: 400;
-      color: rgba(0, 0, 0, 0.9);
-    }
-
-    &--desc {
-      font-size: 12px;
-      line-height: 20px;
-      overflow: hidden;
-      text-overflow: ellipsis;
-      display: -webkit-box;
-      -webkit-line-clamp: 2;
-      -webkit-box-orient: vertical;
-      margin-bottom: 24px;
-      height: 40px;
-    }
-  }
-
-  &__disabled {
-    color: $text-color-disabled;
-
-    .icon-more {
-      color: $text-color-disabled;
-    }
-
-    .list-card-item_detail--name {
-      color: $text-color-disabled;
-    }
-
-    .list-card-item_detail--operation--tag {
-      color: #bababa;
-    }
-  }
-}
-</style>

+ 0 - 147
src/views/list/card/components/DialogForm.vue

@@ -1,147 +0,0 @@
-<script setup lang="ts">
-import { ref, watch } from "vue";
-import { ElMessage, FormInstance } from "element-plus";
-
-const SELECT_OPTIONS = [
-  { label: "网关", value: 1 },
-  { label: "人工智能", value: 2 },
-  { label: "CVM", value: 3 },
-  { label: "防火墙", value: 4 },
-  { label: "未知", value: 5 }
-];
-
-const props = defineProps({
-  visible: {
-    type: Boolean,
-    default: false
-  },
-  data: {
-    type: Object,
-    default: () => {
-      return {};
-    }
-  }
-});
-
-const ruleFormRef = ref<FormInstance>();
-
-const formVisible = ref(false);
-const formData = ref(props.data);
-const textareaValue = ref("");
-
-const submitForm = async (formEl: FormInstance | undefined) => {
-  if (!formEl) return;
-  await formEl.validate(valid => {
-    if (valid) {
-      ElMessage.success("提交成功");
-      formVisible.value = false;
-      resetForm(formEl);
-    }
-  });
-};
-
-const resetForm = (formEl: FormInstance | undefined) => {
-  if (!formEl) return;
-  formEl.resetFields();
-};
-
-const closeDialog = () => {
-  formVisible.value = false;
-  resetForm(ruleFormRef.value);
-};
-
-const emit = defineEmits(["update:visible"]);
-watch(
-  () => formVisible.value,
-  val => {
-    emit("update:visible", val);
-  }
-);
-
-watch(
-  () => props.visible,
-  val => {
-    formVisible.value = val;
-  }
-);
-
-watch(
-  () => props.data,
-  val => {
-    formData.value = val;
-  }
-);
-
-const rules = {
-  name: [{ required: true, message: "请输入产品名称", trigger: "blur" }]
-};
-</script>
-
-<template>
-  <el-dialog
-    v-model="formVisible"
-    title="新建产品"
-    :width="680"
-    draggable
-    :before-close="closeDialog"
-  >
-    <!-- 表单内容 -->
-    <el-form
-      ref="ruleFormRef"
-      :model="formData"
-      :rules="rules"
-      label-width="100px"
-    >
-      <el-form-item label="产品名称" prop="name">
-        <el-input
-          v-model="formData.name"
-          :style="{ width: '480px' }"
-          placeholder="请输入产品名称"
-        />
-      </el-form-item>
-      <el-form-item label="产品状态" prop="status">
-        <el-radio-group v-model="formData.status">
-          <el-radio label="0">已停用</el-radio>
-          <el-radio label="1">已启用</el-radio>
-        </el-radio-group>
-      </el-form-item>
-      <el-form-item label="产品描述" prop="description">
-        <el-input
-          v-model="formData.description"
-          :style="{ width: '480px' }"
-          placeholder="请输入产品描述"
-        />
-      </el-form-item>
-      <el-form-item label="产品类型" prop="type">
-        <el-select
-          v-model="formData.type"
-          clearable
-          :style="{ width: '480px' }"
-        >
-          <el-option
-            v-for="(item, index) in SELECT_OPTIONS"
-            :key="index"
-            :value="item.value"
-            :label="item.label"
-          >
-            {{ item.label }}
-          </el-option>
-        </el-select>
-      </el-form-item>
-      <el-form-item label="备注" prop="mark">
-        <el-input
-          v-model="textareaValue"
-          type="textarea"
-          :style="{ width: '480px' }"
-          placeholder="请输入内容"
-        />
-      </el-form-item>
-    </el-form>
-    <template #footer>
-      <el-button @click="closeDialog">取消</el-button>
-      <el-button type="primary" @click="submitForm(ruleFormRef)">
-        确定
-      </el-button>
-    </template>
-  </el-dialog>
-</template>

+ 0 - 175
src/views/list/card/index.vue

@@ -1,175 +0,0 @@
-<script setup lang="ts">
-import { getCardList } from "/@/api/list";
-import Card from "./components/Card.vue";
-import { ref, onMounted, nextTick } from "vue";
-import dialogForm from "./components/DialogForm.vue";
-import { ElMessage, ElMessageBox } from "element-plus";
-import { useRenderIcon } from "/@/components/ReIcon/src/hooks";
-
-defineOptions({
-  name: "ListCard"
-});
-
-const svg = `
-        <path class="path" d="
-          M 30 15
-          L 28 17
-          M 25.61 25.61
-          A 15 15, 0, 0, 1, 15 30
-          A 15 15, 0, 1, 1, 27.99 7.5
-          L 15 15
-        " style="stroke-width: 4px; fill: rgba(0, 0, 0, 0)"/>
-      `;
-
-const INITIAL_DATA = {
-  name: "",
-  status: "",
-  description: "",
-  type: "",
-  mark: ""
-};
-
-const pagination = ref({ current: 1, pageSize: 12, total: 0 });
-
-const productList = ref([]);
-const dataLoading = ref(true);
-
-const getCardListData = async () => {
-  try {
-    const { data } = await getCardList();
-    productList.value = data.list;
-    pagination.value = {
-      ...pagination.value,
-      total: data.list.length
-    };
-  } catch (e) {
-    console.log(e);
-  } finally {
-    setTimeout(() => {
-      dataLoading.value = false;
-    }, 500);
-  }
-};
-
-onMounted(() => {
-  getCardListData();
-});
-
-const formDialogVisible = ref(false);
-const formData = ref({ ...INITIAL_DATA });
-const searchValue = ref("");
-
-const onPageSizeChange = (size: number) => {
-  pagination.value.pageSize = size;
-  pagination.value.current = 1;
-};
-const onCurrentChange = (current: number) => {
-  pagination.value.current = current;
-};
-const handleDeleteItem = product => {
-  ElMessageBox.confirm(
-    product
-      ? `确认删除后${product.name}的所有产品信息将被清空, 且无法恢复`
-      : "",
-    "提示",
-    {
-      type: "warning"
-    }
-  )
-    .then(() => {
-      ElMessage({
-        type: "success",
-        message: "删除成功"
-      });
-    })
-    .catch(() => {});
-};
-const handleManageProduct = product => {
-  formDialogVisible.value = true;
-  nextTick(() => {
-    formData.value = { ...product, status: product?.isSetup ? "1" : "0" };
-  });
-};
-</script>
-
-<template>
-  <div class="main">
-    <div class="w-full flex justify-between mb-4">
-      <el-button :icon="useRenderIcon('add')" @click="formDialogVisible = true">
-        新建产品
-      </el-button>
-      <el-input
-        style="width: 300px"
-        v-model="searchValue"
-        placeholder="请输入产品名称"
-        clearable
-      >
-        <template #suffix>
-          <el-icon class="el-input__icon">
-            <IconifyIconOffline
-              v-show="searchValue.length === 0"
-              icon="search"
-            />
-          </el-icon>
-        </template>
-      </el-input>
-    </div>
-    <div
-      v-loading="dataLoading"
-      :element-loading-svg="svg"
-      element-loading-svg-view-box="-10, -10, 50, 50"
-    >
-      <el-empty
-        description="暂无数据"
-        v-show="
-          productList
-            .slice(
-              pagination.pageSize * (pagination.current - 1),
-              pagination.pageSize * pagination.current
-            )
-            .filter(v =>
-              v.name.toLowerCase().includes(searchValue.toLowerCase())
-            ).length === 0
-        "
-      />
-      <template v-if="pagination.total > 0">
-        <el-row :gutter="16">
-          <el-col
-            v-for="(product, index) in productList
-              .slice(
-                pagination.pageSize * (pagination.current - 1),
-                pagination.pageSize * pagination.current
-              )
-              .filter(v =>
-                v.name.toLowerCase().includes(searchValue.toLowerCase())
-              )"
-            :key="index"
-            :xs="24"
-            :sm="12"
-            :md="8"
-            :lg="6"
-            :xl="4"
-          >
-            <Card
-              :product="product"
-              @delete-item="handleDeleteItem"
-              @manage-product="handleManageProduct"
-            />
-          </el-col>
-        </el-row>
-        <el-pagination
-          class="float-right"
-          v-model:currentPage="pagination.current"
-          :page-size="pagination.pageSize"
-          :total="pagination.total"
-          :page-sizes="[12, 24, 36]"
-          :background="true"
-          layout="total, sizes, prev, pager, next, jumper"
-          @size-change="onPageSizeChange"
-          @current-change="onCurrentChange"
-        />
-      </template>
-    </div>
-    <dialogForm v-model:visible="formDialogVisible" :data="formData" />
-  </div>
-</template>

+ 0 - 17
src/views/nested/menu1/menu1-1/index.vue

@@ -1,17 +0,0 @@
-<script setup lang="ts">
-import { ref } from "vue";
-
-defineOptions({
-  name: "Menu1-1"
-});
-
-let input = ref("");
-</script>
-
-<template>
-  <div>
-    <p>菜单1</p>
-    <p style="text-indent: 2em">菜单1-1</p>
-    <el-input v-model="input" />
-  </div>
-</template>

+ 0 - 18
src/views/nested/menu1/menu1-2/menu1-2-1/index.vue

@@ -1,18 +0,0 @@
-<script setup lang="ts">
-import { ref } from "vue";
-
-defineOptions({
-  name: "Menu1-2-1"
-});
-
-let input = ref("");
-</script>
-
-<template>
-  <div>
-    <p>菜单1</p>
-    <p style="text-indent: 2em">菜单1-2</p>
-    <p style="text-indent: 4em">菜单1-2-1</p>
-    <el-input v-model="input" />
-  </div>
-</template>

+ 0 - 18
src/views/nested/menu1/menu1-2/menu1-2-2/index.vue

@@ -1,18 +0,0 @@
-<script setup lang="ts">
-import { ref } from "vue";
-
-defineOptions({
-  name: "Menu1-2-2"
-});
-
-let input = ref("");
-</script>
-
-<template>
-  <div>
-    <p>菜单1</p>
-    <p style="text-indent: 2em">菜单1-2</p>
-    <p style="text-indent: 4em">菜单1-2-2</p>
-    <el-input v-model="input" />
-  </div>
-</template>

+ 0 - 17
src/views/nested/menu1/menu1-3/index.vue

@@ -1,17 +0,0 @@
-<script setup lang="ts">
-import { ref } from "vue";
-
-defineOptions({
-  name: "Menu1-3"
-});
-
-let input = ref("");
-</script>
-
-<template>
-  <div>
-    <p>菜单1</p>
-    <p style="text-indent: 2em">菜单1-3</p>
-    <el-input v-model="input" />
-  </div>
-</template>

+ 0 - 16
src/views/nested/menu2/index.vue

@@ -1,16 +0,0 @@
-<script setup lang="ts">
-import { ref } from "vue";
-
-defineOptions({
-  name: "Menu2"
-});
-
-let input = ref("");
-</script>
-
-<template>
-  <div>
-    <p>菜单2</p>
-    <el-input v-model="input" />
-  </div>
-</template>

+ 0 - 36
src/views/permission/button/index.vue

@@ -1,36 +0,0 @@
-<script setup lang="ts">
-import { ref } from "vue";
-import type { StorageConfigs } from "/#/index";
-import { storageSession } from "@pureadmin/utils";
-
-defineOptions({
-  name: "PermissionButton"
-});
-
-const auth = ref(
-  storageSession.getItem<StorageConfigs>("info").username || "admin"
-);
-
-function changRole(value) {
-  storageSession.setItem("info", {
-    username: value,
-    accessToken: `eyJhbGciOiJIUzUxMiJ9.${value}`
-  });
-  window.location.reload();
-}
-</script>
-
-<template>
-  <el-card>
-    <template #header>
-      <div class="card-header">
-        <el-radio-group v-model="auth" @change="changRole">
-          <el-radio-button label="admin" />
-          <el-radio-button label="test" />
-        </el-radio-group>
-      </div>
-    </template>
-    <p v-auth="'v-admin'">只有admin可看</p>
-    <p v-auth="'v-test'">只有test可看</p>
-  </el-card>
-</template>

+ 0 - 53
src/views/permission/page/index.vue

@@ -1,53 +0,0 @@
-<script setup lang="ts">
-import { ref, unref } from "vue";
-import type { StorageConfigs } from "/#/index";
-import { storageSession } from "@pureadmin/utils";
-import { useRenderIcon } from "/@/components/ReIcon/src/hooks";
-
-defineOptions({
-  name: "PermissionPage"
-});
-
-let purview = ref<string>(
-  storageSession.getItem<StorageConfigs>("info").username
-);
-
-function changRole() {
-  if (unref(purview) === "admin") {
-    storageSession.setItem("info", {
-      username: "test",
-      accessToken: "eyJhbGciOiJIUzUxMiJ9.test"
-    });
-    window.location.reload();
-  } else {
-    storageSession.setItem("info", {
-      username: "admin",
-      accessToken: "eyJhbGciOiJIUzUxMiJ9.admin"
-    });
-    window.location.reload();
-  }
-}
-</script>
-
-<template>
-  <el-card>
-    <template #header>
-      <div class="card-header">
-        <span>
-          当前角色:
-          <span style="font-size: 26px">{{ purview }}</span>
-          <p style="color: #ffa500">
-            查看左侧菜单变化(系统管理),模拟后台根据不同角色返回对应路由
-          </p>
-        </span>
-      </div>
-    </template>
-    <el-button
-      type="primary"
-      @click="changRole"
-      :icon="useRenderIcon('user', { color: '#fff' })"
-    >
-      切换角色
-    </el-button>
-  </el-card>
-</template>

+ 0 - 66
src/views/result/columns.tsx

@@ -1,66 +0,0 @@
-import { IconifyIconOffline } from "/@/components/ReIcon";
-
-export function useColumns() {
-  const columns = [
-    {
-      cellRenderer: () => {
-        return (
-          <span class="flex items-center -mt-6">
-            <IconifyIconOffline
-              icon="close-circle-line"
-              color="#F56C6C"
-              width="18px"
-              height="18px"
-            />
-            <span class="ml-1 mr-4">您的账户已被冻结</span>
-            <a
-              href="javascript:void(0);"
-              class="flex items-center"
-              style="color: var(--el-color-primary)"
-            >
-              立即解冻
-              <IconifyIconOffline
-                icon="arrow-right-s-line"
-                color="var(--el-color-primary)"
-                width="18px"
-                height="18px"
-              />
-            </a>
-          </span>
-        );
-      }
-    },
-    {
-      cellRenderer: () => {
-        return (
-          <span class="flex items-center -mt-8">
-            <IconifyIconOffline
-              icon="close-circle-line"
-              color="#F56C6C"
-              width="18px"
-              height="18px"
-            />
-            <span class="ml-1 mr-4">您的账户还不具备申请资格</span>
-            <a
-              href="javascript:void(0);"
-              class="flex items-center"
-              style="color: var(--el-color-primary)"
-            >
-              立即升级
-              <IconifyIconOffline
-                icon="arrow-right-s-line"
-                color="var(--el-color-primary)"
-                width="18px"
-                height="18px"
-              />
-            </a>
-          </span>
-        );
-      }
-    }
-  ];
-
-  return {
-    columns
-  };
-}

+ 0 - 39
src/views/result/fail.vue

@@ -1,39 +0,0 @@
-<script setup lang="ts">
-import { useColumns } from "./columns";
-defineOptions({
-  name: "Fail"
-});
-
-const { columns } = useColumns();
-</script>
-
-<template>
-  <el-card>
-    <template #header>
-      <div class="card-header">
-        <span class="font-medium">失败页</span>
-      </div>
-    </template>
-    <el-result
-      icon="error"
-      title="提交失败"
-      sub-title="请核对并修改以下信息后,再重新提交。"
-    >
-      <template #extra>
-        <el-button type="primary">返回修改</el-button>
-      </template>
-    </el-result>
-    <PureDescriptions
-      :columns="columns"
-      title="您提交的内容有如下错误:"
-      style="background: rgb(250, 250, 250)"
-      class="p-6 ml-10 mr-10"
-    />
-  </el-card>
-</template>
-
-<style scoped>
-:deep(.el-descriptions__body) {
-  background: transparent;
-}
-</style>

+ 0 - 92
src/views/result/success.vue

@@ -1,92 +0,0 @@
-<script setup lang="ts">
-defineOptions({
-  name: "Success"
-});
-
-const { lastBuildTime } = __APP_INFO__;
-
-const columns = [
-  {
-    label: "项目 ID:",
-    value: "12345"
-  },
-  {
-    label: "负责人:",
-    value: "明明"
-  },
-  {
-    label: "生效时间:",
-    value: lastBuildTime
-  }
-];
-</script>
-
-<template>
-  <el-card>
-    <template #header>
-      <div class="card-header">
-        <span class="font-medium">成功页</span>
-      </div>
-    </template>
-    <el-result
-      icon="success"
-      title="提交成功"
-      sub-title="提交结果页用于反馈一系列操作任务的处理结果, 如果仅是简单操作,使用 Message 全局提示反馈即可。 本文字区域可以展示简单的补充说明,如果有类似展示 “单据”的需求,下面这个灰色区域可以呈现比较复杂的内容。"
-    >
-      <template #extra>
-        <div class="flex">
-          <el-button type="primary">返回列表</el-button>
-          <el-button>查看项目</el-button>
-          <el-button>打印</el-button>
-        </div>
-      </template>
-    </el-result>
-    <div style="background: rgb(250, 250, 250)" class="p-6 ml-10 mr-10">
-      <PureDescriptions title="项目名称" :columns="columns" class="mb-5" />
-      <el-steps :active="2">
-        <el-step title="创建项目">
-          <template #description>
-            <p>明明</p>
-            <p>{{ lastBuildTime }}</p>
-          </template>
-        </el-step>
-        <el-step title="部门初审">
-          <template #description>
-            <p class="flex items-center">
-              亮亮
-              <span
-                role="img"
-                aria-label="dingding"
-                class="anticon anticon-dingding cursor-pointer flex items-center cursor-pointer"
-                style="color: rgb(0, 160, 233); margin-left: 8px"
-              >
-                <svg
-                  viewBox="64 64 896 896"
-                  focusable="false"
-                  data-icon="dingding"
-                  width="1em"
-                  height="1em"
-                  fill="currentColor"
-                  aria-hidden="true"
-                >
-                  <path
-                    d="M573.7 252.5C422.5 197.4 201.3 96.7 201.3 96.7c-15.7-4.1-17.9 11.1-17.9 11.1-5 61.1 33.6 160.5 53.6 182.8 19.9 22.3 319.1 113.7 319.1 113.7S326 357.9 270.5 341.9c-55.6-16-37.9 17.8-37.9 17.8 11.4 61.7 64.9 131.8 107.2 138.4 42.2 6.6 220.1 4 220.1 4s-35.5 4.1-93.2 11.9c-42.7 5.8-97 12.5-111.1 17.8-33.1 12.5 24 62.6 24 62.6 84.7 76.8 129.7 50.5 129.7 50.5 33.3-10.7 61.4-18.5 85.2-24.2L565 743.1h84.6L603 928l205.3-271.9H700.8l22.3-38.7c.3.5.4.8.4.8S799.8 496.1 829 433.8l.6-1h-.1c5-10.8 8.6-19.7 10-25.8 17-71.3-114.5-99.4-265.8-154.5z"
-                  />
-                </svg>
-                催一下
-              </span>
-            </p>
-          </template>
-        </el-step>
-        <el-step title="财务复核" />
-        <el-step title="完成" />
-      </el-steps>
-    </div>
-  </el-card>
-</template>
-
-<style scoped>
-:deep(.el-descriptions__body) {
-  background: transparent;
-}
-</style>

+ 0 - 14
src/views/tabs/detail.vue

@@ -1,14 +0,0 @@
-<script setup lang="ts">
-import { useDetail } from "./hooks";
-
-defineOptions({
-  name: "TabDetail"
-});
-
-const { initToDetail, id } = useDetail();
-initToDetail();
-</script>
-
-<template>
-  <div>{{ id }} - 详情页内容在此</div>
-</template>

+ 0 - 32
src/views/tabs/hooks.ts

@@ -1,32 +0,0 @@
-import { useMultiTagsStoreHook } from "/@/store/modules/multiTags";
-import { useRouter, useRoute } from "vue-router";
-import { onBeforeMount } from "vue";
-
-export function useDetail() {
-  const route = useRoute();
-  const router = useRouter();
-  const id = route.query?.id ?? -1;
-
-  function toDetail(index: number | string | string[] | number[]) {
-    useMultiTagsStoreHook().handleTags("push", {
-      path: `/tabs/detail`,
-      parentPath: route.matched[0].path,
-      name: "TabDetail",
-      query: { id: String(index) },
-      meta: {
-        title: { zh: `No.${index} - 详情信息`, en: `No.${index} - DetailInfo` },
-        showLink: false,
-        dynamicLevel: 3
-      }
-    });
-    router.push({ name: "TabDetail", query: { id: String(index) } });
-  }
-
-  function initToDetail() {
-    onBeforeMount(() => {
-      if (id) toDetail(id);
-    });
-  }
-
-  return { toDetail, initToDetail, id, router };
-}

+ 0 - 96
src/views/tabs/index.vue

@@ -1,96 +0,0 @@
-<script setup lang="ts">
-import { ref, computed } from "vue";
-import { TreeSelect } from "@pureadmin/components";
-import { useMultiTagsStoreHook } from "/@/store/modules/multiTags";
-import { usePermissionStoreHook } from "/@/store/modules/permission";
-import {
-  deleteChildren,
-  appendFieldByUniqueId,
-  getNodeByUniqueId
-} from "@pureadmin/utils";
-import { useDetail } from "./hooks";
-
-defineOptions({
-  name: "Tabs"
-});
-
-const { toDetail, router } = useDetail();
-
-let treeData = computed(() => {
-  return appendFieldByUniqueId(
-    deleteChildren(usePermissionStoreHook().menusTree),
-    0,
-    { disabled: true }
-  );
-});
-
-const value = ref<string[]>([]);
-
-let multiTags = computed(() => {
-  return useMultiTagsStoreHook()?.multiTags;
-});
-
-function onCloseTags() {
-  value.value.forEach(uniqueId => {
-    let currentPath =
-      getNodeByUniqueId(treeData.value, uniqueId).redirect ??
-      getNodeByUniqueId(treeData.value, uniqueId).path;
-    useMultiTagsStoreHook().handleTags("splice", currentPath);
-    if (currentPath === "/tabs/index")
-      router.push({
-        path: multiTags.value[multiTags.value.length - 1].path
-      });
-  });
-}
-</script>
-
-<template>
-  <el-card>
-    <template #header>
-      <div>标签页复用,超出限制自动关闭(使用场景: 动态路由)</div>
-    </template>
-    <el-button v-for="index in 6" :key="index" @click="toDetail(index)">
-      打开{{ index }}详情页
-    </el-button>
-    <el-divider />
-    <TreeSelect
-      class="w-300px"
-      v-model:value="value"
-      show-search
-      :dropdown-style="{ maxHeight: '400px', overflow: 'auto' }"
-      placeholder="请选择要关闭的标签"
-      :fieldNames="{
-        children: 'children',
-        key: 'uniqueId',
-        value: 'uniqueId'
-      }"
-      allow-clear
-      multiple
-      tree-default-expand-all
-      :tree-data="treeData"
-    >
-      <template #tagRender="{ closable, onClose, option }">
-        <el-tag class="mr-3px" :closable="closable" @close="onClose">
-          {{ option.meta.title }}
-        </el-tag>
-      </template>
-
-      <template #title="{ data }">
-        <span>{{ data.meta.title }}</span>
-      </template>
-    </TreeSelect>
-    <el-button class="ml-2" @click="onCloseTags">关闭标签</el-button>
-    <br />
-    <p class="mt-4">
-      注意:此demo并未开启标签页缓存,如果需要在
-      <span class="text-red-500">刷新页面</span>
-      的时候同时
-      <span class="text-red-500">保留标签页的显示</span>
-      或者
-      <span class="text-red-500">保留url的参数</span>
-      ,那么就需要开启标签页持久化。
-      <br />
-      开启方式:在页面最右上角有个设置的小图标,点进去,会看到项目配置面板,找到标签页持久化开启即可。
-    </p>
-  </el-card>
-</template>

+ 0 - 1
tsconfig.json

@@ -42,7 +42,6 @@
     "src/**/*.tsx",
     "src/**/*.vue",
     "types/*.d.ts",
-    "mock/*.ts",
     "vite.config.ts"
   ],
   "exclude": ["node_modules", "dist", "**/*.js"]

Certains fichiers n'ont pas été affichés car il y a eu trop de fichiers modifiés dans ce diff