zydx-plus 1.9.31 → 1.10.32

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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "zydx-plus",
3
- "version": "1.9.31",
3
+ "version": "1.10.32",
4
4
  "description": "Vue.js",
5
5
  "main": "src/index.js",
6
6
  "files": [
@@ -19,12 +19,17 @@
19
19
  ],
20
20
  "license": "MIT",
21
21
  "author": "",
22
- "peerDependencies": {
23
- "vue": "^3.2.13",
22
+ "dependencies": {
24
23
  "vue-draggable-next": "^2.1.1",
25
24
  "pdfjs-dist": "^2.0.943",
26
25
  "flipbook-vue": "^1.0.0-beta.4",
27
- "hls.js": "^1.3.5"
26
+ "@wangeditor/editor": "^5.1.23",
27
+ "wangeditor5-for-vue3": "^1.0.0",
28
+ "@wangeditor/plugin-upload-attachment": "^1.1.0",
29
+ "snabbdom": "^3.5.1"
30
+ },
31
+ "peerDependencies": {
32
+ "vue": "^3.2.13"
28
33
  },
29
34
  "devDependencies": {
30
35
  "@vue/component-compiler-utils": "^2.6.0",
@@ -0,0 +1,6 @@
1
+ import main from './src/editor';
2
+
3
+ main.install = function(Vue) {
4
+ Vue.component(main.name, main);
5
+ };
6
+ export default main;
@@ -0,0 +1,133 @@
1
+ <template>
2
+ <we-toolbar v-if="!readOnly && toolbar.length > 0" class="toolbar" :handle="handle" />
3
+ <we-editable class="editable" :style="{'min-height': height + 'px'}" :handle="handle" v-model:html="formData.html" />
4
+ <div class="but">
5
+ <button class="def-but" @click="confirm">完成</button>
6
+ </div>
7
+ </template>
8
+ <script>
9
+ import '@wangeditor/editor/dist/css/style.css'
10
+ import { defineComponent, shallowReactive } from 'vue'
11
+ import { Boot } from '@wangeditor/editor'
12
+ import attachmentModule from '@wangeditor/plugin-upload-attachment'
13
+ import { menuModule } from './menu'
14
+ import { nodeModule } from './node'
15
+ import { useWangEditor,WeEditable, WeToolbar } from 'wangeditor5-for-vue3'
16
+ Boot.registerModule(attachmentModule)
17
+ Boot.registerModule(nodeModule)
18
+ Boot.registerModule(menuModule)
19
+
20
+ export default defineComponent({
21
+ name: 'zydx-editor',
22
+ components: { WeEditable, WeToolbar },
23
+ props: {
24
+ height: {
25
+ type: String,
26
+ default: '800'
27
+ },
28
+ placeholder: {
29
+ type: String,
30
+ default: '请开始你的表演'
31
+ },
32
+ html: {
33
+ type: String,
34
+ default: ''
35
+ },
36
+ readOnly: {
37
+ type: Boolean,
38
+ default: true
39
+ },
40
+ toolbar: {
41
+ type: Array,
42
+ default: []
43
+ },
44
+ uploadImage: {
45
+ type: Object,
46
+ default: {}
47
+ },
48
+ uploadAttachment: {
49
+ type: Object,
50
+ default: {}
51
+ }
52
+ },
53
+ emits: ['confirm'],
54
+ methods: {
55
+ confirm() {
56
+ this.syncContent() //强制同步数据
57
+ this.$emit('confirm', this.formData.html)
58
+ },
59
+ },
60
+ mounted() {
61
+ setTimeout(() => {
62
+ this.formData.html = this.html
63
+ },0)
64
+ },
65
+ setup(props) {
66
+ const { opts, handle, instance, clearContent, syncContent, reloadEditor } = useWangEditor({
67
+ // 防抖时长。当会触发重载的配置项发生变化 365ms 后,编辑器会重载
68
+ reloadDelary: 365,
69
+ // 菜单栏配置
70
+ toolbar: {
71
+ mode: 'simple', // 指定简介模式
72
+ config:{
73
+ toolbarKeys: props.toolbar
74
+ }
75
+ },
76
+ // 编辑器配置
77
+ editable: {
78
+ config: {
79
+ placeholder: props.placeholder,
80
+ readOnly: props.readOnly,
81
+ autoFocus: false,
82
+ MENU_CONF: {
83
+ // 上传图片
84
+ uploadImage: props.uploadImage,
85
+ uploadAttachment: props.uploadAttachment
86
+ }
87
+ // hoverbarKeys: {
88
+ // attachment: {
89
+ // menuKeys: ['menu4'],
90
+ // },
91
+ // },
92
+ }
93
+ }
94
+ })
95
+ // 不要使用 reactive/ref,应该使用 shallowReactive/shallowRef 来接收 json array 数据
96
+ const formData = shallowReactive({html: ''})
97
+
98
+ return { handle, formData, syncContent }
99
+ }
100
+ })
101
+ </script>
102
+
103
+ <style scoped>
104
+ .but{
105
+ text-align: right;
106
+ }
107
+ /*工具栏样式*/
108
+ .toolbar{
109
+ border: 1px solid #d9d9d9;
110
+ margin-bottom: 20px;
111
+ }
112
+ /*工具栏剧中显示*/
113
+ .w-e-toolbar {
114
+ justify-content: center !important;
115
+ }
116
+ /*编辑器样式*/
117
+ .editable{
118
+ width: 100%;
119
+ background-color: #fff;
120
+ border: 1px solid #e8e8e8;
121
+ margin-bottom: 20px;
122
+ }
123
+ .def-but{
124
+ margin-left: 5px;
125
+ font-size: 12px;
126
+ background-color: transparent;
127
+ border: 1px solid #000;
128
+ border-radius: 3px;
129
+ padding: 2px 5px;
130
+ cursor: pointer;
131
+ min-width: 60px;
132
+ }
133
+ </style>
@@ -0,0 +1,120 @@
1
+
2
+ class signButtonMenu {
3
+ constructor() {
4
+ this.title = '添加标志' // 自定义菜单标题
5
+ // this.iconSvg = '<svg>...</svg>' // 可选
6
+ this.tag = 'button'
7
+ }
8
+ // 获取菜单执行时的 value ,用不到则返回空 字符串或 false
9
+ getValue(editor) {
10
+ return false
11
+ }
12
+ // 菜单是否需要激活(如选中加粗文本,“加粗”菜单会激活),用不到则返回 false
13
+ isActive(editor) {
14
+ return false
15
+ }
16
+ // 菜单是否需要禁用(如选中 H1 ,“引用”菜单被禁用),用不到则返回 false
17
+ isDisabled(editor) {
18
+ return false
19
+ }
20
+ // 点击菜单时触发的函数
21
+ exec(editor, value) {
22
+ if (this.isDisabled(editor)) return
23
+ let node = editor.children
24
+ let nodes = JSON.parse(JSON.stringify(node)) //拷贝一份
25
+ //判断数组中是否有attachment
26
+ let hasAttachment = false
27
+ for(let i = 0; i < node.length; i++){
28
+ for(let j = 0; j < node[i].children.length; j++){
29
+ if(node[i].children[j].type === 'attachment') {
30
+ hasAttachment = true
31
+ break
32
+ }
33
+ }
34
+ }
35
+ if(hasAttachment) return
36
+ const resume = {
37
+ type: 'paragraph',
38
+ children: [{
39
+ type: 'attachment',
40
+ children: [{text:''}]
41
+ }]
42
+ }
43
+ nodes.unshift(resume)
44
+ editor.clear()
45
+ for(let i = 0; i < nodes.length; i++){
46
+ editor.insertNode(nodes[i])
47
+ }
48
+ }
49
+ }
50
+
51
+ class redButtonMenu {
52
+ constructor() {
53
+ this.title = '添加红头' // 自定义菜单标题
54
+ this.tag = 'button'
55
+ }
56
+ // 获取菜单执行时的 value ,用不到则返回空 字符串或 false
57
+ getValue(editor) {
58
+ return false
59
+ }
60
+ // 菜单是否需要激活(如选中加粗文本,“加粗”菜单会激活),用不到则返回 false
61
+ isActive(editor) {
62
+ return false
63
+ }
64
+ // 菜单是否需要禁用(如选中 H1 ,“引用”菜单被禁用),用不到则返回 false
65
+ isDisabled(editor) {
66
+ return false
67
+ }
68
+ // 点击菜单时触发的函数
69
+ exec(editor, value) {
70
+ if (this.isDisabled(editor)) return
71
+ const resume = {
72
+ type: 'paragraph',
73
+ children: [
74
+ {
75
+ text:'XXXXXXX(单位)文件',
76
+ color: 'rgb(225, 60, 57)',
77
+ fontSize: '48px'
78
+ }
79
+ ],
80
+ textAlign: 'center'
81
+ }
82
+ const resume1 = {
83
+ type: 'paragraph',
84
+ children: [
85
+ {
86
+ text:'xxx〔xx〕xxxx 号',
87
+ color: '#333333',
88
+ fontSize: '16px'
89
+ }
90
+ ],
91
+ textAlign: 'center'
92
+ }
93
+ const resume2 = {
94
+ type: 'divider',
95
+ children: [{text:''}]
96
+ }
97
+ editor.insertNode(resume)
98
+ editor.insertNode(resume1)
99
+ editor.insertNode(resume2)
100
+ }
101
+ }
102
+
103
+
104
+ const signMenuConf = {
105
+ key: 'signMenu',
106
+ factory() {
107
+ return new signButtonMenu()
108
+ },
109
+ }
110
+
111
+ const redMenuConf = {
112
+ key: 'redMenu',
113
+ factory() {
114
+ return new redButtonMenu()
115
+ },
116
+ }
117
+
118
+ export const menuModule = {
119
+ menus: [signMenuConf,redMenuConf]
120
+ }
@@ -0,0 +1,39 @@
1
+ import { h, VNode } from 'snabbdom'
2
+
3
+ function renderAttachment(elem, children, editor) {
4
+ const iconVnode = h(
5
+ 'img',
6
+ {
7
+ props: { src: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAFAAAABPCAYAAAB8kULjAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyFpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMTQyIDc5LjE2MDkyNCwgMjAxNy8wNy8xMy0wMTowNjozOSAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIChXaW5kb3dzKSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDoyOThBN0E1NUNDM0QxMUU4QjNFQ0Y2RTQyQUQxOTZGQSIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDoyOThBN0E1NkNDM0QxMUU4QjNFQ0Y2RTQyQUQxOTZGQSI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOjI5OEE3QTUzQ0MzRDExRThCM0VDRjZFNDJBRDE5NkZBIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjI5OEE3QTU0Q0MzRDExRThCM0VDRjZFNDJBRDE5NkZBIi8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+WxRDagAAFoJJREFUeNrMnQl8VdXx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' }, // HTML 属性,驼峰式写法
8
+ style: { width: '20px',height: '20px',position: 'absolute',top: '0',left: '0'},
9
+ }
10
+ )
11
+ const iconText = h(
12
+ 'span',
13
+ {
14
+ props: { contentEditable: false },
15
+ style: {display: 'inline-block',paddingLeft: '25px'}
16
+ },
17
+ [ '致用大学' ]
18
+ )
19
+ const attachVnode = h(
20
+ 'span',
21
+ {
22
+ props: { contentEditable: false },
23
+ style: { display: 'inline-block',position: 'relative'},
24
+ // on: { click() { console.log('clicked', link) } }
25
+ },
26
+ [ iconVnode,iconText]
27
+ )
28
+ return attachVnode
29
+ }
30
+
31
+
32
+ const renderElemConf = {
33
+ type: 'attachment',
34
+ renderElem: renderAttachment,
35
+ }
36
+
37
+ export const nodeModule = {
38
+ renderElems: [renderElemConf]
39
+ }
package/src/index.js CHANGED
@@ -12,7 +12,7 @@ import buttonGroup from './components/buttonGroup/index';
12
12
  import spinner from './components/spinner/index';
13
13
  import treeList from './components/treeList/index';
14
14
  import flip from './components/flip/index';
15
- import videos from './components/videos/index';
15
+ import editor from './components/editor/index';
16
16
 
17
17
  const components = [
18
18
  Calendar,
@@ -27,7 +27,7 @@ const components = [
27
27
  buttonGroup,
28
28
  treeList,
29
29
  flip,
30
- videos
30
+ editor
31
31
  ];
32
32
 
33
33
  function install(app) {
@@ -39,7 +39,7 @@ function install(app) {
39
39
  }
40
40
 
41
41
  export default {
42
- version: '1.9.31',
42
+ version: '1.10.32',
43
43
  install,
44
44
  Calendar,
45
45
  Message,
@@ -55,6 +55,6 @@ export default {
55
55
  buttonGroup,
56
56
  treeList,
57
57
  flip,
58
- videos
58
+ editor
59
59
  };
60
60
 
File without changes
@@ -1,127 +0,0 @@
1
- .video{
2
- width: 100%;
3
- height: 100%;
4
- position: relative;
5
- background-color: #000;
6
- overflow: hidden;
7
- }
8
- .video:hover .bottom{
9
- transform: translateY(0);
10
- }
11
- .video>video{
12
- width: 100%;
13
- height: 100%;
14
- }
15
- .bottom{
16
- height: 40px;
17
- width: 100%;
18
- position: absolute;
19
- bottom: 0;
20
- left: 0;
21
- z-index: 1;
22
- background-color: rgba(0,0,0,0.4);
23
- transform: translateY(100%);
24
- transition-duration: 200ms
25
- }
26
- /*--------------------------*/
27
- /* 播放按钮样式 */
28
- .play-pause {
29
- width: 40px;
30
- height: 40px;
31
- position: relative;
32
- cursor: pointer;
33
- animation: play-pause 0.5s ease;
34
- }
35
- /* 播放状态样式 */
36
- .play-pause.play:before{
37
- content: "";
38
- position: absolute;
39
- top: 50%;
40
- left: 50%;
41
- transform: translate(-50%, -50%) scale(1);
42
- width: 0;
43
- height: 0;
44
- border-style: solid;
45
- border-width: 8px 0 8px 16px;
46
- border-color: transparent transparent transparent #fff;
47
- animation: play 0.5s ease;
48
- }
49
- /* 暂停状态样式 */
50
- .play-pause.pause:before,.play-pause.pause:after{
51
- content: "";
52
- position: absolute;
53
- top: 50%;
54
- left: 50%;
55
- transform: translate(-50%, -50%) scale(1);
56
- width: 6px;
57
- height: 16px;
58
- background-color: #fff;
59
- animation: pause 0.5s ease;
60
- }
61
- .play-pause.pause:before{
62
- margin-left: -6px;
63
- }
64
- .play-pause.pause:after{
65
- margin-left: 3px;
66
- }
67
- /* 动画定义 */
68
- @keyframes play-pause {
69
- from {
70
- transform: scale(1);
71
- }
72
- to {
73
- transform: scale(1.1);
74
- }
75
- }
76
-
77
- @keyframes play {
78
- from {
79
- transform: translate(-50%, -50%) scale(0);
80
- }
81
- to {
82
- transform: translate(-50%, -50%) scale(1);
83
- }
84
- }
85
-
86
- @keyframes pause {
87
- from {
88
- transform: translate(-50%, -50%) scale(0);
89
- }
90
- to {
91
- transform: translate(-50%, -50%) scale(1);
92
- }
93
- }
94
- .volume{
95
- position: absolute;
96
- top: 50%;
97
- right: 20px;
98
- margin-top: -3px;
99
- z-index: 1;
100
- height: 6px;
101
- width: 100px;
102
- border-radius: 20px;
103
- background-color: rgba(255,255,255,0.5);
104
- user-select: none;
105
- }
106
- .volume-ico{
107
- position: absolute;
108
- top: -4px;
109
- left: -7px;
110
- z-index: 1;
111
- width: 14px;
112
- height: 14px;
113
- border: 1px solid #ccc;
114
- border-radius: 50%;
115
- background-color: #fff;
116
- cursor: pointer;
117
- box-shadow: 0 0 2px 1px #ccc;
118
- }
119
- .volume-img{
120
- width: 20px;
121
- height: 20px;
122
- position: absolute;
123
- top: -6px;
124
- left: -30px;
125
- z-index: 1;
126
- }
127
-
@@ -1,102 +0,0 @@
1
- <template>
2
- <div class="video">
3
- <video ref="videoEl"></video>
4
- <div class="bottom">
5
- <div class="play-pause" :class="{'play': !playing, 'pause': playing}" @click="playOrPause"></div>
6
- <div class="volume"
7
- ref="circle"
8
- @mousedown="circleBegin($event)"
9
- @mousemove="circleMove($event)"
10
- @mouseup="circleEnd($event)">
11
- <div v-html="volumeIco" class="volume-img"></div>
12
- <div class="volume-ico"
13
- @mousedown="circleBegin($event)"
14
- @mousemove="circleMove($event)"
15
- @mouseup="circleEnd($event)"
16
- :style="{transform: 'translateX('+ circleX +'px)'}"></div>
17
- </div>
18
- </div>
19
- </div>
20
- </template>
21
-
22
- <script>
23
- import Hls from 'hls.js';
24
- export default {
25
- name: "zydx-videos",
26
- mounted() {
27
- this.initPlayer();
28
- // this.initWebRtc();
29
- },
30
- data() {
31
- return {
32
- volumeIco: '<svg t="1679643651310" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="2756" width="20" height="20" fill="#ffffff"><path d="M431.207929 106.919125c-14.536065-5.991458-30.570249-2.454912-41.684378 8.683776L198.703551 308.032562l-94.77862 0c-21.468964 0-38.633902 17.024745-38.633902 38.486546l0 331.002716c0 21.460778 17.164938 38.485523 38.633902 38.485523l94.77862 0 191.521988 192.429661c7.446599 7.467065 17.411555 11.530614 27.557636 11.530614 4.992711 0 8.626471-0.915859 13.424754-2.89391 14.545274-6.005784 22.63144-20.143783 22.63144-35.874045L453.839369 142.839219C453.838346 127.108956 445.753203 112.924909 431.207929 106.919125zM376.128473 787.108708 241.016239 649.917116c-7.299243-7.320733-15.827477-11.618619-26.163893-11.618619l-71.852468 0L142.999878 385.742435l71.852468 0c10.336416 0 18.86465-4.297886 26.163893-11.618619l135.112234-137.191592L376.128473 787.108708zM581.9 676.526147c-7.67889 8.590656-18.318204 12.96529-29.000498 12.96529-9.221012 0-18.47477-3.25923-25.891693-9.886161-16.011672-14.302751-17.388019-38.870286-3.080152-54.870702 97.04729-108.533902 10.117428-213.893508-0.113587-225.548966-14.113439-16.081257-12.632715-40.605813 3.388167-54.78986 16.020882-14.189164 40.431851-12.817933 54.697763 3.1262C632.777761 404.416749 698.252984 546.403554 581.9 676.526147zM699.338712 780.485871c-7.677866 8.591679-18.318204 12.96529-29.000498 12.96529-9.219989 0-18.478863-3.25923-25.891693-9.885138-16.010649-14.302751-17.388019-38.871309-3.079128-54.871725 191.540408-214.210733 7.91118-424.49811 0-433.345616-14.307867-16.000416-12.93152-40.568974 3.079128-54.871725 15.997346-14.302751 40.575114-12.927427 54.892191 3.079128C701.739389 246.240217 936.651606 515.090385 699.338712 780.485871zM821.955354 858.351286c-7.67889 8.590656-18.318204 12.96529-29.000498 12.96529-9.221012 0-18.47477-3.25923-25.891693-9.886161-16.011672-14.302751-17.388019-38.870286-3.080152-54.870702 109.224634-122.153084 142.595672-257.939677 99.177813-403.597081-32.952506-110.559025-98.518804-184.728258-99.177813-185.468109-14.307867-16.000416-12.93152-40.564881 3.080152-54.871725 15.992229-14.306844 40.568974-12.930497 54.892191 3.079128C825.049832 169.162748 1128.098893 515.981684 821.955354 858.351286z" p-id="2757"></path></svg>',
33
- playing: false,
34
- rtcPeerConnection: null,
35
- cx: 0,
36
- circleCDown: false,
37
- circleX: 100
38
- };
39
- },
40
- props: {
41
- url: {
42
- type: String,
43
- required: true
44
- },
45
- },
46
- methods: {
47
- async initWebRtc() {
48
- const stream = await navigator.mediaDevices.getUserMedia({ video: true });
49
- // this.$refs.videoEl.srcObject = stream;
50
- this.rtcPeerConnection = new RTCPeerConnection();
51
- this.rtcPeerConnection.addStream(stream);
52
- this.rtcPeerConnection.addEventListener('track', (event) => {
53
- this.$refs.videoEl.srcObject = event.streams[0];
54
- });
55
- },
56
- circleBegin(event) {
57
- this.circleCDown = true
58
- this.cx = this.$refs.circle.getBoundingClientRect().x
59
- let x = event.clientX - this.cx
60
- this.circleMask(x)
61
- },
62
- circleMove(event) {
63
- if(this.circleCDown) {
64
- let x = event.clientX - this.cx
65
- this.circleMask(x)
66
- }
67
- },
68
- circleEnd(event) {
69
- this.circleCDown = false
70
- },
71
- circleMask(x) {
72
- let w = this.$refs.circle.getBoundingClientRect().width
73
- this.circleX = x
74
- if(x <= 0) this.circleX = 0
75
- if(x >= w) this.circleX = w
76
- this.$refs.videoEl.volume = this.circleX/100
77
- },
78
- initPlayer() {
79
- if (Hls.isSupported()) {
80
- const hls = new Hls();
81
- hls.loadSource(this.url);
82
- hls.attachMedia(this.$refs.videoEl);
83
- hls.on(Hls.Events.MANIFEST_PARSED, () => {
84
- // this.duration = this.$refs.videoEl.duration;
85
- });
86
- } else if (this.$refs.videoEl.canPlayType('application/vnd.apple.mpegurl')) {
87
- this.$refs.videoEl.src = this.url;
88
- }
89
- },
90
- playOrPause() {
91
- if (this.playing) {
92
- this.$refs.videoEl.pause();
93
- } else {
94
- this.$refs.videoEl.play();
95
- }
96
- this.playing = !this.playing;
97
- }
98
- }
99
- }
100
- </script>
101
-
102
- <style scoped src="./videos.css"></style>