From 7b5bbedbccf56049ff611005ba17a0f07b07034d Mon Sep 17 00:00:00 2001 From: kailong321200875 <321200875@qq.com> Date: Sun, 19 Nov 2023 10:59:00 +0800 Subject: [PATCH] feat: VideoPlayer --- mock/role/index.ts | 9 +++ package.json | 3 +- src/components/VideoPlayer/index.ts | 27 +++++++++ .../VideoPlayer/src/VideoPlayer.vue | 59 +++++++++++++++++++ src/components/VideoPlayerViewer/index.ts | 3 + .../src/VideoPlayerViewer.vue | 49 +++++++++++++++ src/locales/en.ts | 3 +- src/locales/zh-CN.ts | 3 +- src/router/index.ts | 8 +++ src/views/Components/VideoPlayer.vue | 24 ++++++++ 10 files changed, 185 insertions(+), 3 deletions(-) create mode 100644 src/components/VideoPlayer/index.ts create mode 100644 src/components/VideoPlayer/src/VideoPlayer.vue create mode 100644 src/components/VideoPlayerViewer/index.ts create mode 100644 src/components/VideoPlayerViewer/src/VideoPlayerViewer.vue create mode 100644 src/views/Components/VideoPlayer.vue diff --git a/mock/role/index.ts b/mock/role/index.ts index 212ff3e..068c8e4 100644 --- a/mock/role/index.ts +++ b/mock/role/index.ts @@ -301,6 +301,14 @@ const adminList = [ meta: { title: 'router.imageCropping' } + }, + { + path: 'video-player', + component: 'views/Components/VideoPlayer', + name: 'VideoPlayer', + meta: { + title: 'router.videoPlayer' + } } ] }, @@ -660,6 +668,7 @@ const testList: string[] = [ '/components/input-password', '/components/waterfall', '/components/image-cropping', + '/components/video-player', 'function', '/function/multiple-tabs', '/function/multiple-tabs-demo/:id', diff --git a/package.json b/package.json index 7359aed..0fb7e11 100644 --- a/package.json +++ b/package.json @@ -54,7 +54,8 @@ "vue-i18n": "9.7.0", "vue-json-pretty": "^2.2.4", "vue-router": "^4.2.5", - "vue-types": "^5.1.1" + "vue-types": "^5.1.1", + "xgplayer": "^3.0.10" }, "devDependencies": { "@commitlint/cli": "^18.4.2", diff --git a/src/components/VideoPlayer/index.ts b/src/components/VideoPlayer/index.ts new file mode 100644 index 0000000..247deca --- /dev/null +++ b/src/components/VideoPlayer/index.ts @@ -0,0 +1,27 @@ +import { VNode, createVNode, render } from 'vue' +import VideoPlayer from './src/VideoPlayer.vue' +import { isClient } from '@/utils/is' +import { VideoPlayerViewer } from '@/components/VideoPlayerViewer' +import { toAnyString } from '@/utils' + +export { VideoPlayer } + +let instance: Nullable = null + +export function createVideoViewer(options: { url: string; poster?: string; show?: boolean }) { + if (!isClient) return + const { url, poster } = options + + const propsData: Partial<{ url: string; poster?: string; show?: boolean; id?: string }> = {} + const container = document.createElement('div') + const id = toAnyString() + container.id = id + propsData.url = url + propsData.poster = poster + propsData.show = true + propsData.id = id + + document.body.appendChild(container) + instance = createVNode(VideoPlayerViewer, propsData) + render(instance, container) +} diff --git a/src/components/VideoPlayer/src/VideoPlayer.vue b/src/components/VideoPlayer/src/VideoPlayer.vue new file mode 100644 index 0000000..4fd639a --- /dev/null +++ b/src/components/VideoPlayer/src/VideoPlayer.vue @@ -0,0 +1,59 @@ + + + diff --git a/src/components/VideoPlayerViewer/index.ts b/src/components/VideoPlayerViewer/index.ts new file mode 100644 index 0000000..7f99155 --- /dev/null +++ b/src/components/VideoPlayerViewer/index.ts @@ -0,0 +1,3 @@ +import VideoPlayerViewer from './src/VideoPlayerViewer.vue' + +export { VideoPlayerViewer } diff --git a/src/components/VideoPlayerViewer/src/VideoPlayerViewer.vue b/src/components/VideoPlayerViewer/src/VideoPlayerViewer.vue new file mode 100644 index 0000000..73f6f2d --- /dev/null +++ b/src/components/VideoPlayerViewer/src/VideoPlayerViewer.vue @@ -0,0 +1,49 @@ + + diff --git a/src/locales/en.ts b/src/locales/en.ts index 0933f7a..2aab3fc 100644 --- a/src/locales/en.ts +++ b/src/locales/en.ts @@ -178,7 +178,8 @@ export default { iconPicker: 'Icon picker', request: 'Request', waterfall: 'Waterfall', - imageCropping: 'Image cropping' + imageCropping: 'Image cropping', + videoPlayer: 'Video player' }, permission: { hasPermission: 'Please set the operation permission value' diff --git a/src/locales/zh-CN.ts b/src/locales/zh-CN.ts index 6c6f068..380df58 100644 --- a/src/locales/zh-CN.ts +++ b/src/locales/zh-CN.ts @@ -176,7 +176,8 @@ export default { iconPicker: '图标选择器', request: '请求', waterfall: '瀑布流', - imageCropping: '图片裁剪' + imageCropping: '图片裁剪', + videoPlayer: '视频播放器' }, permission: { hasPermission: '请设置操作权限值' diff --git a/src/router/index.ts b/src/router/index.ts index 3a2ded3..e061336 100644 --- a/src/router/index.ts +++ b/src/router/index.ts @@ -342,6 +342,14 @@ export const asyncRouterMap: AppRouteRecordRaw[] = [ meta: { title: t('router.imageCropping') } + }, + { + path: 'video-player', + component: () => import('@/views/Components/VideoPlayer.vue'), + name: 'VideoPlayer', + meta: { + title: t('router.videoPlayer') + } } ] }, diff --git a/src/views/Components/VideoPlayer.vue b/src/views/Components/VideoPlayer.vue new file mode 100644 index 0000000..5208c65 --- /dev/null +++ b/src/views/Components/VideoPlayer.vue @@ -0,0 +1,24 @@ + + +