diff --git a/.vscode/settings.json b/.vscode/settings.json index 2efb27ce..62dc9828 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -160,6 +160,7 @@ "stylelint.enable": true, "stylelint.packageManager": "pnpm", "stylelint.validate": ["css", "less", "postcss", "scss", "vue"], + "stylelint.customSyntax": "postcss-html", "stylelint.snippet": ["css", "less", "postcss", "scss", "vue"], "typescript.inlayHints.enumMemberValues.enabled": true, diff --git a/CHANGELOG.md b/CHANGELOG.md index 9cf1672d..b41b7014 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,4 +1,8 @@ -# 1.0.1 +# 1.1.0 + +**FEATURES** + +- 支持离线图标功能(全局可在内网环境中使用) **BUG FIXES** diff --git a/README.zh-CN.md b/README.zh-CN.md index 2ec9c418..ddb8f7fc 100644 --- a/README.zh-CN.md +++ b/README.zh-CN.md @@ -8,6 +8,8 @@ v5版本采用分仓(包)目录结构, 具体开发路径为: `根目录/apps/we 目前对应后端版本: **5.2.3/2.2.3** +V1.1.0版本已支持离线图标 + ## 进度 **工作流相关模块等待后端重构后开发** @@ -82,7 +84,7 @@ pnpm install - 菜单图标替换 -[根目录/scripts/菜单图标替换sql/update_icon.sql](https://gitee.com/dapppp/ruoyi-plus-vben5/blob/main/scripts/%E8%8F%9C%E5%8D%95%E5%9B%BE%E6%A0%87%E6%9B%BF%E6%8D%A2sql/update_icon.sql) +参考 [菜单图标替换](https://dapdap.top/guide/quick-start.html#%E8%8F%9C%E5%8D%95%E5%9B%BE%E6%A0%87%E5%AF%BC%E5%85%A5) - 关于代码生成 diff --git a/apps/web-antd/package.json b/apps/web-antd/package.json index b737825f..1fb21832 100644 --- a/apps/web-antd/package.json +++ b/apps/web-antd/package.json @@ -1,6 +1,6 @@ { "name": "@vben/web-antd", - "version": "1.0.1", + "version": "1.1.0", "homepage": "https://vben.pro", "bugs": "https://github.com/vbenjs/vue-vben-admin/issues", "repository": { diff --git a/apps/web-antd/src/adapter/vxe-table.ts b/apps/web-antd/src/adapter/vxe-table.ts index 32c03c0c..b4cc88c0 100644 --- a/apps/web-antd/src/adapter/vxe-table.ts +++ b/apps/web-antd/src/adapter/vxe-table.ts @@ -77,7 +77,7 @@ setupVbenVxeTable({ // 表格配置项可以用 cellRender: { name: 'CellImage' }, vxeUI.renderer.add('CellImage', { - renderDefault(_renderOpts, params) { + renderTableDefault(_renderOpts, params) { const { column, row } = params; return h(Image, { src: row[column.field] }); }, @@ -85,7 +85,7 @@ setupVbenVxeTable({ // 表格配置项可以用 cellRender: { name: 'CellLink' }, vxeUI.renderer.add('CellLink', { - renderDefault(renderOpts) { + renderTableDefault(renderOpts) { const { props } = renderOpts; return h( Button, diff --git a/apps/web-antd/src/bootstrap.ts b/apps/web-antd/src/bootstrap.ts index d1740e56..f842021c 100644 --- a/apps/web-antd/src/bootstrap.ts +++ b/apps/web-antd/src/bootstrap.ts @@ -1,12 +1,15 @@ -import { createApp } from 'vue'; +import { createApp, watchEffect } from 'vue'; import { registerAccessDirective } from '@vben/access'; +import { preferences } from '@vben/preferences'; import { initStores } from '@vben/stores'; import '@vben/styles'; import '@vben/styles/antd'; +import { useTitle } from '@vueuse/core'; + import { setupGlobalComponent } from '#/components/global'; -import { setupI18n } from '#/locales'; +import { $t, setupI18n } from '#/locales'; import { initComponentAdapter } from './adapter/component'; import App from './app.vue'; @@ -33,6 +36,16 @@ async function bootstrap(namespace: string) { // 配置路由及路由守卫 app.use(router); + // 动态更新标题 + watchEffect(() => { + if (preferences.app.dynamicTitle) { + const routeTitle = router.currentRoute.value.meta?.title; + const pageTitle = + (routeTitle ? `${$t(routeTitle)} - ` : '') + preferences.app.name; + useTitle(pageTitle); + } + }); + app.mount('#app'); } diff --git a/apps/web-antd/src/layouts/basic.vue b/apps/web-antd/src/layouts/basic.vue index 81d1cdfa..c7aba31c 100644 --- a/apps/web-antd/src/layouts/basic.vue +++ b/apps/web-antd/src/layouts/basic.vue @@ -5,7 +5,12 @@ import { useRouter } from 'vue-router'; import { AuthenticationLoginExpiredModal } from '@vben/common-ui'; import { VBEN_DOC_URL, VBEN_GITHUB_URL } from '@vben/constants'; import { useWatermark } from '@vben/hooks'; -import { BookOpenText, CircleHelp, MdiGithub, ProfileIcon } from '@vben/icons'; +import { + BookOpenText, + CircleHelp, + GitHubOutlined, + UserOutlined, +} from '@vben/icons'; import { BasicLayout, LockScreen, @@ -47,7 +52,7 @@ const menus = computed(() => { handler: () => { router.push('/profile'); }, - icon: ProfileIcon, + icon: UserOutlined, text: $t('ui.widgets.profile'), }, { @@ -56,7 +61,7 @@ const menus = computed(() => { target: '_blank', }); }, - icon: MdiGithub, + icon: GitHubOutlined, text: 'GitHub', }, { diff --git a/apps/web-antd/src/preferences.ts b/apps/web-antd/src/preferences.ts index 16d86d7e..4866b15e 100644 --- a/apps/web-antd/src/preferences.ts +++ b/apps/web-antd/src/preferences.ts @@ -3,6 +3,7 @@ import { defineOverridesPreferences } from '@vben/preferences'; /** * @description 项目配置文件 * 只需要覆盖项目中的一部分配置,不需要的配置不用覆盖,会自动使用默认配置 + * !!! 更改配置后请清空缓存,否则可能不生效 */ export const overridesPreferences = defineOverridesPreferences({ // overrides diff --git a/apps/web-antd/src/router/guard.ts b/apps/web-antd/src/router/guard.ts index 52edfe01..fce5a892 100644 --- a/apps/web-antd/src/router/guard.ts +++ b/apps/web-antd/src/router/guard.ts @@ -5,9 +5,6 @@ import { preferences } from '@vben/preferences'; import { useAccessStore, useUserStore } from '@vben/stores'; import { startProgress, stopProgress } from '@vben/utils'; -import { useTitle } from '@vueuse/core'; - -import { $t } from '#/locales'; import { accessRoutes, coreRouteNames } from '#/router/routes'; import { useAuthStore } from '#/store'; @@ -40,13 +37,6 @@ function setupCommonGuard(router: Router) { if (preferences.transition.progress) { stopProgress(); } - - // 动态修改标题 - if (preferences.app.dynamicTitle) { - const { title } = to.meta; - // useTitle(`${$t(title)} - ${preferences.app.name}`); - useTitle(`${$t(title)} - ${preferences.app.name}`); - } }); } diff --git a/apps/web-antd/src/router/routes/local.ts b/apps/web-antd/src/router/routes/local.ts index 468cb0e9..1e131b3c 100644 --- a/apps/web-antd/src/router/routes/local.ts +++ b/apps/web-antd/src/router/routes/local.ts @@ -48,7 +48,7 @@ const profileRoute: RouteRecordStringComponent[] = [ component: '/system/oss-config/index', meta: { activePath: '/system/oss', - icon: 'mingcute:profile-line', + icon: 'ant-design:setting-outlined', keepAlive: true, title: 'oss配置', }, @@ -57,7 +57,6 @@ const profileRoute: RouteRecordStringComponent[] = [ }, ], }, - // TODO: 图标要改 { component: 'BasicLayout', meta: { @@ -73,7 +72,7 @@ const profileRoute: RouteRecordStringComponent[] = [ component: '/tool/gen/edit-gen', meta: { activePath: '/tool/gen', - icon: 'mingcute:profile-line', + icon: 'tabler:code', keepAlive: true, title: '生成配置', }, @@ -97,7 +96,7 @@ const profileRoute: RouteRecordStringComponent[] = [ component: '/system/role-assign/index', meta: { activePath: '/system/role', - icon: 'mingcute:profile-line', + icon: 'eos-icons:role-binding-outlined', keepAlive: true, title: '分配角色', }, diff --git a/apps/web-antd/src/router/routes/modules/vben.ts b/apps/web-antd/src/router/routes/modules/vben.ts index 210e8610..f1493889 100644 --- a/apps/web-antd/src/router/routes/modules/vben.ts +++ b/apps/web-antd/src/router/routes/modules/vben.ts @@ -28,7 +28,7 @@ const routes: RouteRecordRaw[] = [ path: '/vben-admin/about', component: () => import('#/views/_core/about/index.vue'), meta: { - icon: 'lucide:copyright', + icon: 'lucide:copyright|offline', title: $t('demos.vben.about'), }, }, @@ -37,7 +37,7 @@ const routes: RouteRecordRaw[] = [ path: '/vben-admin/document', component: IFrameView, meta: { - icon: 'lucide:book-open-text', + icon: 'lucide:book-open-text|offline', link: VBEN_DOC_URL, title: $t('demos.vben.document'), }, diff --git a/apps/web-antd/src/utils/render.tsx b/apps/web-antd/src/utils/render.tsx index 6c99dbf9..e3a136bb 100644 --- a/apps/web-antd/src/utils/render.tsx +++ b/apps/web-antd/src/utils/render.tsx @@ -1,7 +1,29 @@ import type { DictData } from '#/api/system/dict/dict-data-model'; +import { type Component as ComponentType, h } from 'vue'; + import { JsonPreview } from '@vben/common-ui'; -import { IconifyIcon } from '@vben/icons'; +import { + AndroidIcon, + BaiduIcon, + ChromeIcon, + DefaultBrowserIcon, + DefaultOsIcon, + DingtalkIcon, + EdgeIcon, + FirefoxIcon, + IconifyIcon, + IPhoneIcon, + LinuxIcon, + MicromessengerIcon, + OperaIcon, + OSXIcon, + QQIcon, + QuarkIcon, + SafariIcon, + UcIcon, + WindowsIcon, +} from '@vben/icons'; import { Tag } from 'ant-design-vue'; @@ -129,28 +151,28 @@ export function renderDict(value: string, dictName: string) { const dictInfo = getDict(dictName); return renderDictTag(value, dictInfo); } - export function renderIconSpan( - icon: string, + icon: ComponentType, value: string, center = false, marginLeft = '2px', ) { const justifyCenter = center ? 'justify-center' : ''; + return ( - {renderIcon(icon)} + {h(icon)} {value} ); } const osOptions = [ - { icon: 'devicon:windows8', value: 'windows' }, - { icon: 'devicon:linux', value: 'linux' }, - { icon: 'wpf:macos', value: 'osx' }, - { icon: 'flat-color-icons:android-os', value: 'android' }, - { icon: 'majesticons:iphone-x-apps-line', value: 'iphone' }, + { icon: WindowsIcon, value: 'windows' }, + { icon: LinuxIcon, value: 'linux' }, + { icon: OSXIcon, value: 'osx' }, + { icon: AndroidIcon, value: 'android' }, + { icon: IPhoneIcon, value: 'iphone' }, ]; /** @@ -158,18 +180,18 @@ const osOptions = [ * cn.hutool.http.useragent -> browers */ const browserOptions = [ - { icon: 'logos:chrome', value: 'chrome' }, - { icon: 'logos:microsoft-edge', value: 'edge' }, - { icon: 'logos:firefox', value: 'firefox' }, - { icon: 'logos:opera', value: 'opera' }, - { icon: 'logos:safari', value: 'safari' }, - { icon: 'mdi:wechat', value: 'micromessenger' }, - { icon: 'logos:quarkus-icon', value: 'quark' }, - { icon: 'mdi:wechat', value: 'wxwork' }, - { icon: 'simple-icons:tencentqq', value: 'qq' }, - { icon: 'ri:dingding-line', value: 'dingtalk' }, - { icon: 'arcticons:uc-browser', value: 'uc' }, - { icon: 'ri:baidu-fill', value: 'baidu' }, + { icon: ChromeIcon, value: 'chrome' }, + { icon: EdgeIcon, value: 'edge' }, + { icon: FirefoxIcon, value: 'firefox' }, + { icon: OperaIcon, value: 'opera' }, + { icon: SafariIcon, value: 'safari' }, + { icon: MicromessengerIcon, value: 'micromessenger' }, + { icon: QuarkIcon, value: 'quark' }, + { icon: MicromessengerIcon, value: 'wxwork' }, + { icon: QQIcon, value: 'qq' }, + { icon: DingtalkIcon, value: 'dingtalk' }, + { icon: UcIcon, value: 'uc' }, + { icon: BaiduIcon, value: 'baidu' }, ]; export function renderOsIcon(os: string, center = false) { @@ -187,7 +209,7 @@ export function renderOsIcon(os: string, center = false) { return renderIconSpan(current.icon, os, center, '5px'); } // 返回默认 - const defaultIcon = 'ic:outline-computer'; + const defaultIcon = DefaultOsIcon; return renderIconSpan(defaultIcon, os, center, '5px'); } @@ -202,6 +224,6 @@ export function renderBrowserIcon(browser: string, center = false) { return renderIconSpan(current.icon, browser, center, '5px'); } // 返回默认 - const defaultIcon = 'ph:browser-duotone'; + const defaultIcon = DefaultBrowserIcon; return renderIconSpan(defaultIcon, browser, center, '5px'); } diff --git a/apps/web-antd/src/views/_core/authentication/oauth-login.vue b/apps/web-antd/src/views/_core/authentication/oauth-login.vue index f8805ff0..0c359ec1 100644 --- a/apps/web-antd/src/views/_core/authentication/oauth-login.vue +++ b/apps/web-antd/src/views/_core/authentication/oauth-login.vue @@ -1,5 +1,4 @@ + + +``` + +### GridApi + +useVbenVxeGrid 返回的第二个参数,是一个对象,包含了一些表单的方法。 + +| 方法名 | 描述 | 类型 | +| --- | --- | --- | +| setLoading | 设置loading状态 | `(loading)=>void` | +| setGridOptions | 设置vxe-table grid组件参数 | `(options: Partialvoid` | +| reload | 重载表格,会进行初始化 | `(params:any)=>void` | +| query | 重载表格,会保留当前分页 | `(params:any)=>void` | +| grid | vxe-table grid实例 | `VxeGridInstance` | +| formApi | vbenForm api实例 | `FormApi` | + +## Props + +所有属性都可以传入 `useVbenVxeGrid` 的第一个参数中。 + +| 属性名 | 描述 | 类型 | +| -------------- | ------------------ | ------------------- | +| tableTitle | 表格标题 | `string` | +| tableTitleHelp | 表格标题帮助信息 | `string` | +| gridClass | grid组件的class | `string` | +| gridOptions | grid组件的参数 | `VxeTableGridProps` | +| gridEvents | grid组件的触发的⌚️ | `VxeGridListeners` | +| formOptions | 表单参数 | `VbenFormProps` | diff --git a/docs/src/demos/vben-vxe-table/basic/index.vue b/docs/src/demos/vben-vxe-table/basic/index.vue new file mode 100644 index 00000000..4b6b5a63 --- /dev/null +++ b/docs/src/demos/vben-vxe-table/basic/index.vue @@ -0,0 +1,85 @@ + + + diff --git a/docs/src/demos/vben-vxe-table/custom-cell/index.vue b/docs/src/demos/vben-vxe-table/custom-cell/index.vue new file mode 100644 index 00000000..517e73f3 --- /dev/null +++ b/docs/src/demos/vben-vxe-table/custom-cell/index.vue @@ -0,0 +1,105 @@ + + + diff --git a/docs/src/demos/vben-vxe-table/edit-cell/index.vue b/docs/src/demos/vben-vxe-table/edit-cell/index.vue new file mode 100644 index 00000000..711941de --- /dev/null +++ b/docs/src/demos/vben-vxe-table/edit-cell/index.vue @@ -0,0 +1,55 @@ + + + diff --git a/docs/src/demos/vben-vxe-table/edit-row/index.vue b/docs/src/demos/vben-vxe-table/edit-row/index.vue new file mode 100644 index 00000000..f317f69d --- /dev/null +++ b/docs/src/demos/vben-vxe-table/edit-row/index.vue @@ -0,0 +1,92 @@ + + + diff --git a/docs/src/demos/vben-vxe-table/fixed/index.vue b/docs/src/demos/vben-vxe-table/fixed/index.vue new file mode 100644 index 00000000..6067a5eb --- /dev/null +++ b/docs/src/demos/vben-vxe-table/fixed/index.vue @@ -0,0 +1,67 @@ + + + diff --git a/docs/src/demos/vben-vxe-table/form/index.vue b/docs/src/demos/vben-vxe-table/form/index.vue new file mode 100644 index 00000000..a5e8a547 --- /dev/null +++ b/docs/src/demos/vben-vxe-table/form/index.vue @@ -0,0 +1,120 @@ + + + diff --git a/docs/src/demos/vben-vxe-table/mock-api.ts b/docs/src/demos/vben-vxe-table/mock-api.ts new file mode 100644 index 00000000..e5c40b61 --- /dev/null +++ b/docs/src/demos/vben-vxe-table/mock-api.ts @@ -0,0 +1,36 @@ +import { MOCK_API_DATA } from './table-data'; + +export namespace DemoTableApi { + export interface PageFetchParams { + [key: string]: any; + page: number; + pageSize: number; + } +} + +export function sleep(time = 1000) { + return new Promise((resolve) => { + setTimeout(() => { + resolve(true); + }, time); + }); +} + +/** + * 获取示例表格数据 + */ +async function getExampleTableApi(params: DemoTableApi.PageFetchParams) { + return new Promise<{ items: any; total: number }>((resolve) => { + const { page, pageSize } = params; + const items = MOCK_API_DATA.slice((page - 1) * pageSize, page * pageSize); + + sleep(1000).then(() => { + resolve({ + total: items.length, + items, + }); + }); + }); +} + +export { getExampleTableApi }; diff --git a/docs/src/demos/vben-vxe-table/remote/index.vue b/docs/src/demos/vben-vxe-table/remote/index.vue new file mode 100644 index 00000000..bc93d29a --- /dev/null +++ b/docs/src/demos/vben-vxe-table/remote/index.vue @@ -0,0 +1,112 @@ + + + diff --git a/docs/src/demos/vben-vxe-table/table-data.ts b/docs/src/demos/vben-vxe-table/table-data.ts new file mode 100644 index 00000000..c37b88ad --- /dev/null +++ b/docs/src/demos/vben-vxe-table/table-data.ts @@ -0,0 +1,384 @@ +interface TableRowData { + address: string; + age: number; + id: number; + name: string; + nickname: string; + role: string; +} + +const roles = ['User', 'Admin', 'Manager', 'Guest']; + +export const MOCK_TABLE_DATA: TableRowData[] = (() => { + const data: TableRowData[] = []; + for (let i = 0; i < 10; i++) { + data.push({ + address: `New York${i}`, + age: i + 1, + id: i, + name: `Test${i}`, + nickname: `Test${i}`, + role: roles[Math.floor(Math.random() * roles.length)] as string, + }); + } + return data; +})(); + +export const MOCK_TREE_TABLE_DATA = [ + { + date: '2020-08-01', + id: 10_000, + name: 'Test1', + parentId: null, + size: 1024, + type: 'mp3', + }, + { + date: '2021-04-01', + id: 10_050, + name: 'Test2', + parentId: null, + size: 0, + type: 'mp4', + }, + { + date: '2020-03-01', + id: 24_300, + name: 'Test3', + parentId: 10_050, + size: 1024, + type: 'avi', + }, + { + date: '2021-04-01', + id: 20_045, + name: 'Test4', + parentId: 24_300, + size: 600, + type: 'html', + }, + { + date: '2021-04-01', + id: 10_053, + name: 'Test5', + parentId: 24_300, + size: 0, + type: 'avi', + }, + { + date: '2021-10-01', + id: 24_330, + name: 'Test6', + parentId: 10_053, + size: 25, + type: 'txt', + }, + { + date: '2020-01-01', + id: 21_011, + name: 'Test7', + parentId: 10_053, + size: 512, + type: 'pdf', + }, + { + date: '2021-06-01', + id: 22_200, + name: 'Test8', + parentId: 10_053, + size: 1024, + type: 'js', + }, + { + date: '2020-11-01', + id: 23_666, + name: 'Test9', + parentId: null, + size: 2048, + type: 'xlsx', + }, + { + date: '2021-06-01', + id: 23_677, + name: 'Test10', + parentId: 23_666, + size: 1024, + type: 'js', + }, + { + date: '2021-06-01', + id: 23_671, + name: 'Test11', + parentId: 23_677, + size: 1024, + type: 'js', + }, + { + date: '2021-06-01', + id: 23_672, + name: 'Test12', + parentId: 23_677, + size: 1024, + type: 'js', + }, + { + date: '2021-06-01', + id: 23_688, + name: 'Test13', + parentId: 23_666, + size: 1024, + type: 'js', + }, + { + date: '2021-06-01', + id: 23_681, + name: 'Test14', + parentId: 23_688, + size: 1024, + type: 'js', + }, + { + date: '2021-06-01', + id: 23_682, + name: 'Test15', + parentId: 23_688, + size: 1024, + type: 'js', + }, + { + date: '2020-10-01', + id: 24_555, + name: 'Test16', + parentId: null, + size: 224, + type: 'avi', + }, + { + date: '2021-06-01', + id: 24_566, + name: 'Test17', + parentId: 24_555, + size: 1024, + type: 'js', + }, + { + date: '2021-06-01', + id: 24_577, + name: 'Test18', + parentId: 24_555, + size: 1024, + type: 'js', + }, +]; + +export const MOCK_API_DATA = [ + { + available: true, + category: 'Computers', + color: 'purple', + currency: 'NAD', + description: + 'Ergonomic executive chair upholstered in bonded black leather and PVC padded seat and back for all-day comfort and support', + id: '45a613df-227a-4907-a89f-4a7f1252ca0c', + imageUrl: 'https://avatars.githubusercontent.com/u/62715097', + imageUrl2: 'https://avatars.githubusercontent.com/u/75395683', + inProduction: false, + open: true, + price: '48.89', + productName: 'Handcrafted Steel Salad', + quantity: 70, + rating: 3.780_582_329_574_367, + releaseDate: '2024-09-09T04:06:57.793Z', + status: 'error', + tags: ['Bespoke', 'Handmade', 'Luxurious'], + weight: 1.031_015_671_912_002_5, + }, + { + available: true, + category: 'Toys', + color: 'green', + currency: 'CZK', + description: + 'The Nagasaki Lander is the trademarked name of several series of Nagasaki sport bikes, that started with the 1984 ABC800J', + id: 'd02e5ee9-bc98-4de2-98fa-25a6567ecc19', + imageUrl: 'https://avatars.githubusercontent.com/u/51512330', + imageUrl2: 'https://avatars.githubusercontent.com/u/58698113', + inProduction: false, + open: false, + price: '68.15', + productName: 'Generic Cotton Gloves', + quantity: 3, + rating: 1.681_749_367_682_703_3, + releaseDate: '2024-06-16T09:00:36.806Z', + status: 'warning', + tags: ['Rustic', 'Handcrafted', 'Recycled'], + weight: 9.601_076_149_300_575, + }, + { + available: true, + category: 'Beauty', + color: 'teal', + currency: 'OMR', + description: + 'The Apollotech B340 is an affordable wireless mouse with reliable connectivity, 12 months battery life and modern design', + id: '2b72521c-225c-4e64-8030-611b76b10b37', + imageUrl: 'https://avatars.githubusercontent.com/u/50300075', + imageUrl2: 'https://avatars.githubusercontent.com/u/36541691', + inProduction: true, + open: true, + price: '696.94', + productName: 'Gorgeous Soft Ball', + quantity: 50, + rating: 2.361_581_777_372_057_5, + releaseDate: '2024-06-03T13:24:19.809Z', + status: 'warning', + tags: ['Gorgeous', 'Ergonomic', 'Licensed'], + weight: 8.882_340_049_286_19, + }, + { + available: true, + category: 'Games', + color: 'silver', + currency: 'SOS', + description: + 'Carbonite web goalkeeper gloves are ergonomically designed to give easy fit', + id: 'bafab694-3801-452c-b102-9eb519bd1143', + imageUrl: 'https://avatars.githubusercontent.com/u/89827115', + imageUrl2: 'https://avatars.githubusercontent.com/u/55952747', + inProduction: false, + open: false, + price: '553.84', + productName: 'Bespoke Soft Computer', + quantity: 29, + rating: 2.176_412_873_760_271_7, + releaseDate: '2024-09-17T12:16:27.034Z', + status: 'error', + tags: ['Elegant', 'Rustic', 'Recycled'], + weight: 9.653_285_869_978_038, + }, + { + available: true, + category: 'Toys', + color: 'indigo', + currency: 'BIF', + description: + 'Andy shoes are designed to keeping in mind durability as well as trends, the most stylish range of shoes & sandals', + id: 'bf6dea6b-2a55-441d-8773-937e03d99389', + imageUrl: 'https://avatars.githubusercontent.com/u/21431092', + imageUrl2: 'https://avatars.githubusercontent.com/u/3771350', + inProduction: true, + open: true, + price: '237.39', + productName: 'Handcrafted Cotton Mouse', + quantity: 54, + rating: 4.363_265_388_265_461, + releaseDate: '2023-10-23T13:42:34.947Z', + status: 'error', + tags: ['Unbranded', 'Handmade', 'Generic'], + weight: 9.513_203_612_535_571, + }, + { + available: false, + category: 'Tools', + color: 'violet', + currency: 'TZS', + description: + 'New ABC 13 9370, 13.3, 5th Gen CoreA5-8250U, 8GB RAM, 256GB SSD, power UHD Graphics, OS 10 Home, OS Office A & J 2016', + id: '135ba6ab-32ee-4989-8189-5cfa658ef970', + imageUrl: 'https://avatars.githubusercontent.com/u/29946092', + imageUrl2: 'https://avatars.githubusercontent.com/u/23842994', + inProduction: false, + open: false, + price: '825.25', + productName: 'Awesome Bronze Ball', + quantity: 94, + rating: 4.251_159_804_726_753, + releaseDate: '2023-12-30T07:31:43.464Z', + status: 'warning', + tags: ['Handmade', 'Elegant', 'Unbranded'], + weight: 2.247_473_385_732_636_8, + }, + { + available: true, + category: 'Automotive', + color: 'teal', + currency: 'BOB', + description: 'The Football Is Good For Training And Recreational Purposes', + id: '652ef256-7d4e-48b7-976c-7afaa781ea92', + imageUrl: 'https://avatars.githubusercontent.com/u/2531904', + imageUrl2: 'https://avatars.githubusercontent.com/u/15215990', + inProduction: false, + open: false, + price: '780.49', + productName: 'Oriental Rubber Pants', + quantity: 70, + rating: 2.636_323_417_377_916, + releaseDate: '2024-02-23T23:30:49.628Z', + status: 'success', + tags: ['Unbranded', 'Elegant', 'Unbranded'], + weight: 4.812_965_858_018_838, + }, + { + available: false, + category: 'Garden', + color: 'plum', + currency: 'LRD', + description: + 'The slim & simple Maple Gaming Keyboard from Dev Byte comes with a sleek body and 7- Color RGB LED Back-lighting for smart functionality', + id: '3ea24798-6589-40cc-85f0-ab78752244a0', + imageUrl: 'https://avatars.githubusercontent.com/u/23165285', + imageUrl2: 'https://avatars.githubusercontent.com/u/14595665', + inProduction: false, + open: true, + price: '583.85', + productName: 'Handcrafted Concrete Hat', + quantity: 15, + rating: 1.371_600_527_752_802_7, + releaseDate: '2024-03-02T19:40:50.255Z', + status: 'error', + tags: ['Rustic', 'Sleek', 'Ergonomic'], + weight: 4.926_949_366_405_728_4, + }, + { + available: false, + category: 'Industrial', + color: 'salmon', + currency: 'AUD', + description: + 'The Apollotech B340 is an affordable wireless mouse with reliable connectivity, 12 months battery life and modern design', + id: '997113dd-f6e4-4acc-9790-ef554c7498d1', + imageUrl: 'https://avatars.githubusercontent.com/u/49021914', + imageUrl2: 'https://avatars.githubusercontent.com/u/4690621', + inProduction: true, + open: false, + price: '67.99', + productName: 'Generic Rubber Bacon', + quantity: 68, + rating: 4.129_840_682_128_08, + releaseDate: '2023-12-17T01:40:25.415Z', + status: 'error', + tags: ['Oriental', 'Small', 'Handcrafted'], + weight: 1.080_114_331_801_906_4, + }, + { + available: false, + category: 'Tools', + color: 'sky blue', + currency: 'NOK', + description: + 'The Nagasaki Lander is the trademarked name of several series of Nagasaki sport bikes, that started with the 1984 ABC800J', + id: 'f697a250-6cb2-46c8-b0f7-871ab1f2fa8d', + imageUrl: 'https://avatars.githubusercontent.com/u/95928385', + imageUrl2: 'https://avatars.githubusercontent.com/u/47588244', + inProduction: false, + open: false, + price: '613.89', + productName: 'Gorgeous Frozen Ball', + quantity: 55, + rating: 1.646_947_205_998_534_6, + releaseDate: '2024-10-13T12:31:04.929Z', + status: 'warning', + tags: ['Handmade', 'Unbranded', 'Unbranded'], + weight: 9.430_690_557_758_114, + }, +]; diff --git a/docs/src/demos/vben-vxe-table/tree/index.vue b/docs/src/demos/vben-vxe-table/tree/index.vue new file mode 100644 index 00000000..0024765a --- /dev/null +++ b/docs/src/demos/vben-vxe-table/tree/index.vue @@ -0,0 +1,80 @@ + + + diff --git a/docs/src/demos/vben-vxe-table/virtual/index.vue b/docs/src/demos/vben-vxe-table/virtual/index.vue new file mode 100644 index 00000000..81fa00af --- /dev/null +++ b/docs/src/demos/vben-vxe-table/virtual/index.vue @@ -0,0 +1,64 @@ + + + diff --git a/docs/src/en/guide/essentials/styles.md b/docs/src/en/guide/essentials/styles.md index 90290081..16f6681d 100644 --- a/docs/src/en/guide/essentials/styles.md +++ b/docs/src/en/guide/essentials/styles.md @@ -72,7 +72,7 @@ const { b, e, is } = useNamespace('menu');