@cmstops/pro-compo 0.3.41 → 0.3.42

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,103 @@
1
+ import { defineComponent, ref, computed, watch, onMounted, openBlock, createElementBlock, createElementVNode, unref, createCommentVNode, Fragment, renderList, normalizeClass } from "vue";
2
+ import { DEFAULT_BASE_API } from "../config.js";
3
+ import { useVideoThumbs } from "./scripts/useVideoThumbs.js";
4
+ const _hoisted_1 = { class: "video-thumb" };
5
+ const _hoisted_2 = { class: "video-player-container" };
6
+ const _hoisted_3 = ["src"];
7
+ const _hoisted_4 = ["onClick"];
8
+ const _hoisted_5 = ["src"];
9
+ const _sfc_main = defineComponent({
10
+ ...{ name: "videoThumb" },
11
+ __name: "component",
12
+ props: {
13
+ BASE_API: {},
14
+ src: {},
15
+ duration: {}
16
+ },
17
+ emits: ["select"],
18
+ setup(__props, { emit: __emit }) {
19
+ const props = __props;
20
+ const emit = __emit;
21
+ const BASE_API = props.BASE_API || DEFAULT_BASE_API;
22
+ const { thumbs, curThumb, getVideoThumbs, handleSelectThumb } = useVideoThumbs();
23
+ const videoThumbRef = ref();
24
+ const videoThumbDrager = ref();
25
+ const isDrag = ref(false);
26
+ const width = computed(() => {
27
+ if (!videoThumbRef.value)
28
+ return 0;
29
+ const rect = videoThumbRef.value.getBoundingClientRect();
30
+ return parseInt((rect.width / thumbs.value.length).toFixed(0), 10);
31
+ });
32
+ function moveDragger(moveX) {
33
+ if (!videoThumbDrager.value || !videoThumbRef.value)
34
+ return;
35
+ const rect = videoThumbRef.value.getBoundingClientRect();
36
+ if (moveX < 0 || moveX > rect.width)
37
+ return;
38
+ videoThumbDrager.value.style.left = `${moveX}px`;
39
+ const index = Math.floor(moveX / width.value);
40
+ curThumb.value = thumbs.value[index];
41
+ }
42
+ const handleMousedown = () => {
43
+ isDrag.value = true;
44
+ window.onmouseup = handleMouseup;
45
+ window.onmousemove = handleMousemove;
46
+ };
47
+ const handleMouseup = () => {
48
+ isDrag.value = false;
49
+ window.onmouseup = null;
50
+ window.onmousemove = null;
51
+ };
52
+ const handleMousemove = (e) => {
53
+ if (!isDrag.value)
54
+ return;
55
+ const moveX = e.x - 30;
56
+ moveDragger(moveX);
57
+ };
58
+ function handleSelect(idx) {
59
+ handleSelectThumb(idx);
60
+ moveDragger(idx * width.value + width.value / 2);
61
+ }
62
+ watch(
63
+ () => curThumb.value,
64
+ () => emit("select", curThumb.value)
65
+ );
66
+ onMounted(() => {
67
+ getVideoThumbs(BASE_API, props.src, props.duration);
68
+ });
69
+ return (_ctx, _cache) => {
70
+ return openBlock(), createElementBlock("div", _hoisted_1, [
71
+ createElementVNode("div", _hoisted_2, [
72
+ createElementVNode("img", { src: unref(curThumb) }, null, 8, _hoisted_3)
73
+ ]),
74
+ createCommentVNode(" \u5C01\u9762\u56FE "),
75
+ createElementVNode("div", {
76
+ ref_key: "videoThumbRef",
77
+ ref: videoThumbRef,
78
+ class: "video-thumb-list"
79
+ }, [
80
+ createElementVNode("div", {
81
+ ref_key: "videoThumbDrager",
82
+ ref: videoThumbDrager,
83
+ class: "video-thumb-list-drager",
84
+ onMousedown: handleMousedown
85
+ }, null, 544),
86
+ (openBlock(true), createElementBlock(Fragment, null, renderList(unref(thumbs), (thumb, idx) => {
87
+ return openBlock(), createElementBlock("div", {
88
+ key: thumb,
89
+ class: normalizeClass(["video-thumb-list-item", { active: unref(curThumb) === thumb }]),
90
+ onClick: ($event) => handleSelect(idx)
91
+ }, [
92
+ createElementVNode("img", {
93
+ src: thumb,
94
+ alt: ""
95
+ }, null, 8, _hoisted_5)
96
+ ], 10, _hoisted_4);
97
+ }), 128))
98
+ ], 512)
99
+ ]);
100
+ };
101
+ }
102
+ });
103
+ export { _sfc_main as default };
@@ -0,0 +1,2 @@
1
+ declare const videoThumb: any;
2
+ export default videoThumb;
@@ -0,0 +1,7 @@
1
+ import _sfc_main from "./component.js";
2
+ const videoThumb = Object.assign(_sfc_main, {
3
+ install: (app) => {
4
+ app.component(_sfc_main.name, _sfc_main);
5
+ }
6
+ });
7
+ export { videoThumb as default };
@@ -0,0 +1,9 @@
1
+ declare type EditThumbParams = {
2
+ url: string;
3
+ count: number;
4
+ start: number;
5
+ end: number;
6
+ search: string;
7
+ };
8
+ export declare function editthumb(BASE_URL: string, params: EditThumbParams): import("axios").AxiosPromise<any>;
9
+ export {};
@@ -0,0 +1,11 @@
1
+ import request from "../../utils/request.js";
2
+ function editthumb(BASE_URL, params) {
3
+ const { url, count, start, end, search } = params;
4
+ const src = encodeURIComponent(url);
5
+ const n = count > 50 ? 50 : count;
6
+ return request(BASE_URL, {
7
+ url: `/poplar/v2/editthumb?src=${src}&n=${n}&starttime=${start}&endtime=${end}${search}`,
8
+ method: "get"
9
+ });
10
+ }
11
+ export { editthumb };
@@ -0,0 +1,7 @@
1
+ export declare function getHMSF(time: string): string;
2
+ export declare function useVideoThumbs(): {
3
+ thumbs: import("vue").Ref<any[]>;
4
+ curThumb: import("vue").Ref<string | undefined>;
5
+ getVideoThumbs: (BASE_API: string, url: string, duration: number) => Promise<void>;
6
+ handleSelectThumb: (idx: number) => void;
7
+ };
@@ -0,0 +1,48 @@
1
+ import { ref } from "vue";
2
+ import { editthumb } from "./api.js";
3
+ function calculateFrameCoverCount(videoDuration) {
4
+ const base = 5;
5
+ const coefficient = 10;
6
+ const maxCount = 50;
7
+ let count = Math.log(videoDuration / base) * coefficient;
8
+ count = Math.min(count, maxCount);
9
+ return Math.ceil(count);
10
+ }
11
+ function useVideoThumbs() {
12
+ const thumbs = ref([]);
13
+ const loading = ref(true);
14
+ const curThumb = ref();
15
+ async function getVideoThumbs(BASE_API, url, duration) {
16
+ loading.value = true;
17
+ try {
18
+ const { Code, Msg } = await editthumb(BASE_API, {
19
+ url,
20
+ count: calculateFrameCoverCount(duration),
21
+ start: 0,
22
+ end: duration,
23
+ search: "&cover=true"
24
+ });
25
+ if (Code !== 200)
26
+ return;
27
+ const { Domain, Frames } = Msg;
28
+ thumbs.value = Frames.map((item) => {
29
+ return `${Domain}/${item}`;
30
+ });
31
+ [curThumb.value] = thumbs.value;
32
+ } catch (e) {
33
+ console.log("\u52A0\u8F7D\u5C01\u9762\u56FE\u5931\u8D25", e);
34
+ } finally {
35
+ loading.value = false;
36
+ }
37
+ }
38
+ function handleSelectThumb(idx) {
39
+ curThumb.value = thumbs.value[idx];
40
+ }
41
+ return {
42
+ thumbs,
43
+ curThumb,
44
+ getVideoThumbs,
45
+ handleSelectThumb
46
+ };
47
+ }
48
+ export { useVideoThumbs };
@@ -0,0 +1 @@
1
+ import "./index.css";
@@ -0,0 +1,49 @@
1
+ .video-thumb {
2
+ display: flex;
3
+ flex-direction: column;
4
+ gap: 10px;
5
+ box-sizing: border-box;
6
+ width: 100%;
7
+ height: 100%;
8
+ padding: 10px;
9
+ overflow: hidden;
10
+ }
11
+ .video-thumb .video-player-container {
12
+ display: flex;
13
+ flex: 1;
14
+ flex-direction: column;
15
+ overflow: hidden;
16
+ }
17
+ .video-thumb .video-player-container video {
18
+ height: 100%;
19
+ }
20
+ .video-thumb .video-thumb-list {
21
+ position: relative;
22
+ display: flex;
23
+ height: 80px;
24
+ padding: 20px 0;
25
+ }
26
+ .video-thumb .video-thumb-list .video-thumb-list-item {
27
+ flex: 1;
28
+ cursor: pointer;
29
+ user-select: none;
30
+ }
31
+ .video-thumb .video-thumb-list .video-thumb-list-item img {
32
+ width: 100%;
33
+ height: 100%;
34
+ object-fit: cover;
35
+ transition: all 0.1s ease-in-out;
36
+ pointer-events: none;
37
+ }
38
+ .video-thumb .video-thumb-list .video-thumb-list-item:hover:not(.active) img {
39
+ transform: scale(1.05);
40
+ }
41
+ .video-thumb .video-thumb-list .video-thumb-list-drager {
42
+ position: absolute;
43
+ top: 20px;
44
+ left: 0;
45
+ width: 6px;
46
+ height: calc(100% - 40px);
47
+ background-color: rgb(var(--primary-5));
48
+ cursor: pointer;
49
+ }
@@ -0,0 +1 @@
1
+ import './index.less';
@@ -0,0 +1 @@
1
+ import "./index.less";
@@ -0,0 +1,61 @@
1
+ .video-thumb {
2
+ display: flex;
3
+ flex-direction: column;
4
+ gap: 10px;
5
+ box-sizing: border-box;
6
+ width: 100%;
7
+ height: 100%;
8
+ padding: 10px;
9
+ overflow: hidden;
10
+
11
+ // 播放器
12
+ .video-player-container {
13
+ display: flex;
14
+ flex: 1;
15
+ flex-direction: column;
16
+ overflow: hidden;
17
+
18
+ video {
19
+ height: 100%;
20
+ }
21
+ }
22
+
23
+ // 视频封面列表
24
+ .video-thumb-list {
25
+ position: relative;
26
+ display: flex;
27
+ height: 80px;
28
+ padding: 20px 0;
29
+
30
+ .video-thumb-list-item {
31
+ flex: 1;
32
+ cursor: pointer;
33
+ user-select: none;
34
+
35
+ img {
36
+ width: 100%;
37
+ height: 100%;
38
+ object-fit: cover;
39
+ transition: all 0.1s ease-in-out;
40
+ // 不允许拖动
41
+ pointer-events: none;
42
+ }
43
+
44
+ &:hover:not(.active) {
45
+ img {
46
+ transform: scale(1.05);
47
+ }
48
+ }
49
+ }
50
+
51
+ .video-thumb-list-drager {
52
+ position: absolute;
53
+ top: 20px;
54
+ left: 0;
55
+ width: 6px;
56
+ height: calc(100% - 40px);
57
+ background-color: rgb(var(--primary-5));
58
+ cursor: pointer;
59
+ }
60
+ }
61
+ }
package/lib/index.css CHANGED
@@ -4746,3 +4746,52 @@
4746
4746
  .doc-history-drawer .arco-drawer-body {
4747
4747
  padding: 0;
4748
4748
  }
4749
+ .video-thumb {
4750
+ display: flex;
4751
+ flex-direction: column;
4752
+ gap: 10px;
4753
+ box-sizing: border-box;
4754
+ width: 100%;
4755
+ height: 100%;
4756
+ padding: 10px;
4757
+ overflow: hidden;
4758
+ }
4759
+ .video-thumb .video-player-container {
4760
+ display: flex;
4761
+ flex: 1;
4762
+ flex-direction: column;
4763
+ overflow: hidden;
4764
+ }
4765
+ .video-thumb .video-player-container video {
4766
+ height: 100%;
4767
+ }
4768
+ .video-thumb .video-thumb-list {
4769
+ position: relative;
4770
+ display: flex;
4771
+ height: 80px;
4772
+ padding: 20px 0;
4773
+ }
4774
+ .video-thumb .video-thumb-list .video-thumb-list-item {
4775
+ flex: 1;
4776
+ cursor: pointer;
4777
+ user-select: none;
4778
+ }
4779
+ .video-thumb .video-thumb-list .video-thumb-list-item img {
4780
+ width: 100%;
4781
+ height: 100%;
4782
+ object-fit: cover;
4783
+ transition: all 0.1s ease-in-out;
4784
+ pointer-events: none;
4785
+ }
4786
+ .video-thumb .video-thumb-list .video-thumb-list-item:hover:not(.active) img {
4787
+ transform: scale(1.05);
4788
+ }
4789
+ .video-thumb .video-thumb-list .video-thumb-list-drager {
4790
+ position: absolute;
4791
+ top: 20px;
4792
+ left: 0;
4793
+ width: 6px;
4794
+ height: calc(100% - 40px);
4795
+ background-color: rgb(var(--primary-5));
4796
+ cursor: pointer;
4797
+ }
package/lib/index.js CHANGED
@@ -28,6 +28,7 @@ var index$n = require("./thumbCard/index.js");
28
28
  var index$o = require("./selectResourceModal/index.js");
29
29
  var index$p = require("./docPreview/index.js");
30
30
  var index$q = require("./docHistory/index.js");
31
+ var index$r = require("./videoThumb/index.js");
31
32
  exports["default"] = components;
32
33
  exports.appCenter = index;
33
34
  exports.messageBox = index$1;
@@ -56,3 +57,4 @@ exports.thumbCard = index$n;
56
57
  exports.selectResourceModal = index$o;
57
58
  exports.docPreview = index$p;
58
59
  exports.docHistory = index$q;
60
+ exports.videoThumb = index$r;
package/lib/index.less CHANGED
@@ -26,3 +26,4 @@
26
26
  @import './selectResourceModal/style/index.less';
27
27
  @import './docPreview/style/index.less';
28
28
  @import './docHistory/style/index.less';
29
+ @import './videoThumb/style/index.less';
@@ -26,6 +26,8 @@ function request(BASE_API, options) {
26
26
  service.interceptors.response.use(
27
27
  (response) => {
28
28
  const res = response.data;
29
+ if (res.Code != null && res.Code === 200)
30
+ res.code = 0;
29
31
  if ((res == null ? void 0 : res.code) !== 0) {
30
32
  if (res == null ? void 0 : res.real_error) {
31
33
  webVue.Message.warning({ content: res.real_error });
@@ -0,0 +1,104 @@
1
+ "use strict";
2
+ var vue = require("vue");
3
+ var config = require("../config.js");
4
+ var useVideoThumbs = require("./scripts/useVideoThumbs.js");
5
+ const _hoisted_1 = { class: "video-thumb" };
6
+ const _hoisted_2 = { class: "video-player-container" };
7
+ const _hoisted_3 = ["src"];
8
+ const _hoisted_4 = ["onClick"];
9
+ const _hoisted_5 = ["src"];
10
+ const _sfc_main = vue.defineComponent({
11
+ ...{ name: "videoThumb" },
12
+ __name: "component",
13
+ props: {
14
+ BASE_API: {},
15
+ src: {},
16
+ duration: {}
17
+ },
18
+ emits: ["select"],
19
+ setup(__props, { emit: __emit }) {
20
+ const props = __props;
21
+ const emit = __emit;
22
+ const BASE_API = props.BASE_API || config.DEFAULT_BASE_API;
23
+ const { thumbs, curThumb, getVideoThumbs, handleSelectThumb } = useVideoThumbs.useVideoThumbs();
24
+ const videoThumbRef = vue.ref();
25
+ const videoThumbDrager = vue.ref();
26
+ const isDrag = vue.ref(false);
27
+ const width = vue.computed(() => {
28
+ if (!videoThumbRef.value)
29
+ return 0;
30
+ const rect = videoThumbRef.value.getBoundingClientRect();
31
+ return parseInt((rect.width / thumbs.value.length).toFixed(0), 10);
32
+ });
33
+ function moveDragger(moveX) {
34
+ if (!videoThumbDrager.value || !videoThumbRef.value)
35
+ return;
36
+ const rect = videoThumbRef.value.getBoundingClientRect();
37
+ if (moveX < 0 || moveX > rect.width)
38
+ return;
39
+ videoThumbDrager.value.style.left = `${moveX}px`;
40
+ const index = Math.floor(moveX / width.value);
41
+ curThumb.value = thumbs.value[index];
42
+ }
43
+ const handleMousedown = () => {
44
+ isDrag.value = true;
45
+ window.onmouseup = handleMouseup;
46
+ window.onmousemove = handleMousemove;
47
+ };
48
+ const handleMouseup = () => {
49
+ isDrag.value = false;
50
+ window.onmouseup = null;
51
+ window.onmousemove = null;
52
+ };
53
+ const handleMousemove = (e) => {
54
+ if (!isDrag.value)
55
+ return;
56
+ const moveX = e.x - 30;
57
+ moveDragger(moveX);
58
+ };
59
+ function handleSelect(idx) {
60
+ handleSelectThumb(idx);
61
+ moveDragger(idx * width.value + width.value / 2);
62
+ }
63
+ vue.watch(
64
+ () => curThumb.value,
65
+ () => emit("select", curThumb.value)
66
+ );
67
+ vue.onMounted(() => {
68
+ getVideoThumbs(BASE_API, props.src, props.duration);
69
+ });
70
+ return (_ctx, _cache) => {
71
+ return vue.openBlock(), vue.createElementBlock("div", _hoisted_1, [
72
+ vue.createElementVNode("div", _hoisted_2, [
73
+ vue.createElementVNode("img", { src: vue.unref(curThumb) }, null, 8, _hoisted_3)
74
+ ]),
75
+ vue.createCommentVNode(" \u5C01\u9762\u56FE "),
76
+ vue.createElementVNode("div", {
77
+ ref_key: "videoThumbRef",
78
+ ref: videoThumbRef,
79
+ class: "video-thumb-list"
80
+ }, [
81
+ vue.createElementVNode("div", {
82
+ ref_key: "videoThumbDrager",
83
+ ref: videoThumbDrager,
84
+ class: "video-thumb-list-drager",
85
+ onMousedown: handleMousedown
86
+ }, null, 544),
87
+ (vue.openBlock(true), vue.createElementBlock(vue.Fragment, null, vue.renderList(vue.unref(thumbs), (thumb, idx) => {
88
+ return vue.openBlock(), vue.createElementBlock("div", {
89
+ key: thumb,
90
+ class: vue.normalizeClass(["video-thumb-list-item", { active: vue.unref(curThumb) === thumb }]),
91
+ onClick: ($event) => handleSelect(idx)
92
+ }, [
93
+ vue.createElementVNode("img", {
94
+ src: thumb,
95
+ alt: ""
96
+ }, null, 8, _hoisted_5)
97
+ ], 10, _hoisted_4);
98
+ }), 128))
99
+ ], 512)
100
+ ]);
101
+ };
102
+ }
103
+ });
104
+ module.exports = _sfc_main;
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ var component = require("./component.js");
3
+ const videoThumb = Object.assign(component, {
4
+ install: (app) => {
5
+ app.component(component.name, component);
6
+ }
7
+ });
8
+ module.exports = videoThumb;
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+ Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toStringTag]: { value: "Module" } });
3
+ var request = require("../../utils/request.js");
4
+ function editthumb(BASE_URL, params) {
5
+ const { url, count, start, end, search } = params;
6
+ const src = encodeURIComponent(url);
7
+ const n = count > 50 ? 50 : count;
8
+ return request(BASE_URL, {
9
+ url: `/poplar/v2/editthumb?src=${src}&n=${n}&starttime=${start}&endtime=${end}${search}`,
10
+ method: "get"
11
+ });
12
+ }
13
+ exports.editthumb = editthumb;
@@ -0,0 +1,50 @@
1
+ "use strict";
2
+ Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toStringTag]: { value: "Module" } });
3
+ var vue = require("vue");
4
+ var api = require("./api.js");
5
+ function calculateFrameCoverCount(videoDuration) {
6
+ const base = 5;
7
+ const coefficient = 10;
8
+ const maxCount = 50;
9
+ let count = Math.log(videoDuration / base) * coefficient;
10
+ count = Math.min(count, maxCount);
11
+ return Math.ceil(count);
12
+ }
13
+ function useVideoThumbs() {
14
+ const thumbs = vue.ref([]);
15
+ const loading = vue.ref(true);
16
+ const curThumb = vue.ref();
17
+ async function getVideoThumbs(BASE_API, url, duration) {
18
+ loading.value = true;
19
+ try {
20
+ const { Code, Msg } = await api.editthumb(BASE_API, {
21
+ url,
22
+ count: calculateFrameCoverCount(duration),
23
+ start: 0,
24
+ end: duration,
25
+ search: "&cover=true"
26
+ });
27
+ if (Code !== 200)
28
+ return;
29
+ const { Domain, Frames } = Msg;
30
+ thumbs.value = Frames.map((item) => {
31
+ return `${Domain}/${item}`;
32
+ });
33
+ [curThumb.value] = thumbs.value;
34
+ } catch (e) {
35
+ console.log("\u52A0\u8F7D\u5C01\u9762\u56FE\u5931\u8D25", e);
36
+ } finally {
37
+ loading.value = false;
38
+ }
39
+ }
40
+ function handleSelectThumb(idx) {
41
+ curThumb.value = thumbs.value[idx];
42
+ }
43
+ return {
44
+ thumbs,
45
+ curThumb,
46
+ getVideoThumbs,
47
+ handleSelectThumb
48
+ };
49
+ }
50
+ exports.useVideoThumbs = useVideoThumbs;
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ require("./index.css");
@@ -0,0 +1,49 @@
1
+ .video-thumb {
2
+ display: flex;
3
+ flex-direction: column;
4
+ gap: 10px;
5
+ box-sizing: border-box;
6
+ width: 100%;
7
+ height: 100%;
8
+ padding: 10px;
9
+ overflow: hidden;
10
+ }
11
+ .video-thumb .video-player-container {
12
+ display: flex;
13
+ flex: 1;
14
+ flex-direction: column;
15
+ overflow: hidden;
16
+ }
17
+ .video-thumb .video-player-container video {
18
+ height: 100%;
19
+ }
20
+ .video-thumb .video-thumb-list {
21
+ position: relative;
22
+ display: flex;
23
+ height: 80px;
24
+ padding: 20px 0;
25
+ }
26
+ .video-thumb .video-thumb-list .video-thumb-list-item {
27
+ flex: 1;
28
+ cursor: pointer;
29
+ user-select: none;
30
+ }
31
+ .video-thumb .video-thumb-list .video-thumb-list-item img {
32
+ width: 100%;
33
+ height: 100%;
34
+ object-fit: cover;
35
+ transition: all 0.1s ease-in-out;
36
+ pointer-events: none;
37
+ }
38
+ .video-thumb .video-thumb-list .video-thumb-list-item:hover:not(.active) img {
39
+ transform: scale(1.05);
40
+ }
41
+ .video-thumb .video-thumb-list .video-thumb-list-drager {
42
+ position: absolute;
43
+ top: 20px;
44
+ left: 0;
45
+ width: 6px;
46
+ height: calc(100% - 40px);
47
+ background-color: rgb(var(--primary-5));
48
+ cursor: pointer;
49
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ require("./index.less");