yks-element 1.0.317 → 1.0.320

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,9 +1,14 @@
1
1
  {
2
2
  "name": "yks-element",
3
- "version": "1.0.317",
3
+ "version": "1.0.320",
4
4
  "description": "yks公共库",
5
5
  "private": false,
6
- "keywords": ["yks-element", "element-ui", "tinymce", "vue"],
6
+ "keywords": [
7
+ "yks-element",
8
+ "element-ui",
9
+ "tinymce",
10
+ "vue"
11
+ ],
7
12
  "repository": {
8
13
  "type": "git",
9
14
  "url": "http://10.5.1.5/it-ogt-client/it-ogt-npm.git"
@@ -71,4 +76,4 @@
71
76
  "npm": ">= 3.0.0"
72
77
  },
73
78
  "license": "MIT"
74
- }
79
+ }
@@ -15,7 +15,14 @@
15
15
  ></i>
16
16
  </div>
17
17
  </div>
18
- <yks-video v-else-if="fileType === '2'" :src="data.content"></yks-video>
18
+ <div v-else-if="fileType === '2'">
19
+ <yks-video :src="data.content"></yks-video>
20
+ <i
21
+ v-if="visibleDel"
22
+ class="el-icon-error media-delfile"
23
+ @click.stop="handleCloseFile"
24
+ ></i>
25
+ </div>
19
26
  <div v-else class="ks-stem__itemattrs" :title="fileName">
20
27
  <div class="yks-tc file-stem">
21
28
  <i class="el-icon-document-remove ks-stem__remove" @click="handleClick"></i>
@@ -163,5 +170,10 @@ export default {
163
170
  padding-top: 5px;
164
171
  color: #000;
165
172
  }
173
+ .media-delfile {
174
+ position: absolute;
175
+ top: -5px;
176
+ right: 0;
177
+ }
166
178
  }
167
179
  </style>
@@ -0,0 +1,9 @@
1
+ export { default as Single } from './src/single'
2
+ export { default as Multiple } from './src/multiple'
3
+ export { default as Judgment } from './src/judgment'
4
+ export { default as FillInBlanks } from './src/fillInBlanks'
5
+ export { default as ShortAnswer } from './src/shortAnswer'
6
+ export { default as PictureAnswer } from './src/pictureAnswer'
7
+ export { default as Compound } from './src/compound'
8
+ export { default as AudioFrequency } from './src/audioFrequency'
9
+ export { default as Attachment } from './src/attachment'
@@ -0,0 +1,125 @@
1
+ <template>
2
+ <div class="single">
3
+ <div class="single-stem__label required__label">题干</div>
4
+ <yks-tinymce
5
+ key="itemContent"
6
+ :value="fromData.itemContent"
7
+ :toolbar="toolbar"
8
+ :plugins="plugins"
9
+ :charLimit="topicDataExtent.itemContentLength || 20000"
10
+
11
+ :fileParams="getFileTypes('stem', fromData.stemAttrs)"
12
+ :uploadFileToHwCloud="uploadFileToHwCloud"
13
+ :uploadFileFunction="uploadFileFunction"
14
+ menubar=""
15
+ height="200px"
16
+ @change="($event) => getTinymceEdit($event, 'stem')"
17
+ @delte="($event) => handleDelteAttrs($event, 'stem', fromData.stemAttrs)"
18
+ />
19
+ <div class="single-stem__label required__label">标准答案</div>
20
+ <yks-tinymce
21
+ key="answer"
22
+ :value="fromData.answer"
23
+ :toolbar="toolbar"
24
+ :plugins="plugins"
25
+ :charLimit="topicDataExtent.answerLength || 5000"
26
+
27
+ :fileParams="getFileTypes('answer', fromData.answerAttrs)"
28
+ :uploadFileToHwCloud="uploadFileToHwCloud"
29
+ :uploadFileFunction="uploadFileFunction"
30
+ menubar=""
31
+ height="200px"
32
+ @change="($event) => getTinymceEdit($event, 'answer')"
33
+ @delte="($event) => handleDelteAttrs($event, 'answer', fromData.answerAttrs)"
34
+ />
35
+ <div class="single-stem__label">答案解析</div>
36
+ <yks-tinymce
37
+ key="description"
38
+ :value="fromData.description"
39
+ :toolbar="toolbar"
40
+ :plugins="plugins"
41
+ :charLimit="topicDataExtent.descriptionLength || 20000"
42
+ :fileParams="getFileTypes('analysis', fromData.descriptionAttrs)"
43
+ :uploadFileToHwCloud="uploadFileToHwCloud"
44
+ :uploadFileFunction="uploadFileFunction"
45
+ menubar=""
46
+ height="200px"
47
+ @change="($event) => getTinymceEdit($event, 'analysis')"
48
+ @delte="($event) => handleDelteAttrs($event, 'analysis', fromData.descriptionAttrs)"
49
+ />
50
+ </div>
51
+ </template>
52
+ <script>
53
+ import YksTinymce from '../../Tinymce/index'
54
+ import TopicMixins from '../../assets/mixins/topic'
55
+ import { stemItemType, shortItemType, analysisItemType } from './config'
56
+
57
+ export default {
58
+ name: 'Attachment',
59
+ components: { YksTinymce },
60
+ mixins: [TopicMixins],
61
+ methods: {
62
+ /**
63
+ * data 富文本数据
64
+ * field 对象名
65
+ * type 类型
66
+ */
67
+ getTinymceEdit(data, type) {
68
+ switch (type) {
69
+ case 'stem':
70
+ data.itemAttr.type = stemItemType[data.itemAttr.type]
71
+ this.fromData.itemContent = data.value
72
+ if (data.itemAttr.type && data.itemAttr.content) {
73
+ this.fromData.stemAttrs.push(data.itemAttr)
74
+ }
75
+ break
76
+ case 'answer':
77
+ data.itemAttr.type = shortItemType[data.itemAttr.type]
78
+ this.fromData.answer = data.value
79
+ if (data.itemAttr.type && data.itemAttr.content) {
80
+ this.fromData.answerAttrs.push(data.itemAttr)
81
+ }
82
+ break
83
+ case 'analysis':
84
+ data.itemAttr.type = analysisItemType[data.itemAttr.type]
85
+ this.fromData.description = data.value
86
+
87
+ if (data.itemAttr.type && data.itemAttr.content) {
88
+ this.fromData.descriptionAttrs.push(data.itemAttr)
89
+ }
90
+ break
91
+ default:
92
+ break
93
+ }
94
+ this.$emit('change', this.fromData)
95
+ },
96
+
97
+ handleDelteAttrs(data, type, list, row = {}) {
98
+ const listAttrs = list
99
+ listAttrs.splice(data.index, 1)
100
+ switch (type) {
101
+ case 'stem':
102
+ this.fromData.stemAttrs = listAttrs
103
+ break
104
+ case 'answer':
105
+ this.fromData.answerAttrs = listAttrs
106
+ break
107
+ case 'analysis':
108
+ this.fromData.descriptionAttrs = listAttrs
109
+ break
110
+ default:
111
+ break
112
+ }
113
+ this.$emit('change', this.fromData)
114
+ }
115
+ }
116
+ }
117
+ </script>
118
+
119
+ <style lang="scss" scoped>
120
+ .single-stem__label {
121
+ margin: 30px 0;
122
+ font-size: 18px;
123
+ font-weight: 700;
124
+ }
125
+ </style>
@@ -0,0 +1,127 @@
1
+ <template>
2
+ <div class="single">
3
+ <div class="single-stem__label required__label">题干</div>
4
+ <yks-tinymce
5
+ key="itemContent"
6
+ :value="fromData.itemContent"
7
+ :toolbar="toolbar"
8
+ :plugins="plugins"
9
+ :charLimit="topicDataExtent.itemContentLength || 20000"
10
+
11
+ :fileParams="getFileTypes('stem', fromData.stemAttrs)"
12
+ :uploadFileToHwCloud="uploadFileToHwCloud"
13
+ :uploadFileFunction="uploadFileFunction"
14
+ menubar=""
15
+ height="200px"
16
+ @change="($event) => getTinymceEdit($event, 'stem')"
17
+ @delte="($event) => handleDelteAttrs($event, 'stem', fromData.stemAttrs)"
18
+ />
19
+ <div class="single-stem__label required__label">标准答案</div>
20
+ <yks-tinymce
21
+ key="answer"
22
+ :value="fromData.answer"
23
+ :toolbar="toolbar"
24
+ :plugins="plugins"
25
+ :charLimit="topicDataExtent.answerLength || 5000"
26
+
27
+ :fileParams="getFileTypes('answer', fromData.answerAttrs)"
28
+ :uploadFileToHwCloud="uploadFileToHwCloud"
29
+ :uploadFileFunction="uploadFileFunction"
30
+ menubar=""
31
+ height="200px"
32
+ @change="($event) => getTinymceEdit($event, 'answer')"
33
+ @delte="($event) => handleDelteAttrs($event, 'answer', fromData.answerAttrs)"
34
+ />
35
+ <div class="single-stem__label">答案解析</div>
36
+ <yks-tinymce
37
+ key="description"
38
+ :value="fromData.description"
39
+ :toolbar="toolbar"
40
+ :plugins="plugins"
41
+ :charLimit="topicDataExtent.descriptionLength || 20000"
42
+
43
+ :fileParams="getFileTypes('analysis', fromData.descriptionAttrs)"
44
+ :uploadFileToHwCloud="uploadFileToHwCloud"
45
+ :uploadFileFunction="uploadFileFunction"
46
+ menubar=""
47
+ height="200px"
48
+ @change="($event) => getTinymceEdit($event, 'analysis')"
49
+ @delte="($event) => handleDelteAttrs($event, 'analysis', fromData.descriptionAttrs)"
50
+ />
51
+ </div>
52
+ </template>
53
+ <script>
54
+ import YksTinymce from '../../Tinymce/index'
55
+ import TopicMixins from '../../assets/mixins/topic'
56
+ import { stemItemType, shortItemType, analysisItemType } from './config'
57
+
58
+ export default {
59
+ name: 'AudioFrequency',
60
+ components: { YksTinymce },
61
+ mixins: [TopicMixins],
62
+ methods: {
63
+ /**
64
+ * data 富文本数据
65
+ * field 对象名
66
+ * type 类型
67
+ */
68
+ getTinymceEdit(data, type) {
69
+ switch (type) {
70
+ case 'stem':
71
+ data.itemAttr.type = stemItemType[data.itemAttr.type]
72
+ this.fromData.itemContent = data.value
73
+ if (data.itemAttr.type && data.itemAttr.content) {
74
+ this.fromData.stemAttrs.push(data.itemAttr)
75
+ }
76
+ break
77
+ case 'answer':
78
+ data.itemAttr.type = shortItemType[data.itemAttr.type]
79
+ this.fromData.answer = data.value
80
+ if (data.itemAttr.type && data.itemAttr.content) {
81
+ this.fromData.answerAttrs.push(data.itemAttr)
82
+ }
83
+ break
84
+ case 'analysis':
85
+ data.itemAttr.type = analysisItemType[data.itemAttr.type]
86
+ this.fromData.description = data.value
87
+
88
+ if (data.itemAttr.type && data.itemAttr.content) {
89
+ this.fromData.descriptionAttrs.push(data.itemAttr)
90
+ }
91
+ break
92
+ default:
93
+ break
94
+ }
95
+ this.$emit('change', this.fromData)
96
+ },
97
+
98
+ handleDelteAttrs(data, type, list, row = {}) {
99
+ const listAttrs = list
100
+ listAttrs.splice(data.index, 1)
101
+ switch (type) {
102
+ case 'stem':
103
+ this.fromData.stemAttrs = listAttrs
104
+ break
105
+ case 'answer':
106
+ this.fromData.answerAttrs = listAttrs
107
+ break
108
+ case 'analysis':
109
+ this.fromData.descriptionAttrs = listAttrs
110
+ break
111
+ default:
112
+ break
113
+ }
114
+ this.$emit('change', this.fromData)
115
+ }
116
+ }
117
+ }
118
+ </script>
119
+
120
+ <style lang="scss" scoped>
121
+
122
+ .single-stem__label {
123
+ margin: 30px 0;
124
+ font-size: 18px;
125
+ font-weight: 700;
126
+ }
127
+ </style>
@@ -0,0 +1,267 @@
1
+ <template>
2
+ <div class="single">
3
+ <div class="single-stem__label required__label">题干</div>
4
+ <yks-tinymce
5
+ ref="stemTinymceEdit"
6
+ key="itemContent"
7
+ :value="fromData.itemContent"
8
+ :toolbar="toolbar"
9
+ :plugins="plugins"
10
+ :charLimit="topicDataExtent.itemContentLength || 20000"
11
+
12
+ :fileParams="getFileTypes('stem', fromData.stemAttrs)"
13
+ menubar=""
14
+ height="200px"
15
+ @change="($event) => getTinymceEdit($event, 'stem')"
16
+ @delte="($event) => handleDelteAttrs($event, 'stem', fromData.stemAttrs)"
17
+ />
18
+ <div class="yks-flex yks-mt10">
19
+ <el-button type="primary" class="yks-mr10" @click="handleFillInBlanks"
20
+ >插入填空符</el-button
21
+ >
22
+ <span class="yks-fs-12 yks-info">请在题干中你需要的位置插入填空符,并在下方编辑对应答案</span>
23
+ </div>
24
+
25
+ <div class="yks-flex single-single">
26
+ <span class="single-single__label required__label">答案</span>
27
+ <span class="yks-fs-12 yks-info">考生需要在每个空内输入正确的答案</span>
28
+ </div>
29
+ <div
30
+ v-for="(item, index) in fromData.itemList"
31
+ :key="`itemList${index}`"
32
+ class="yks-flex yks-mb10 v-start"
33
+ >
34
+ <span class="yks-w_60 yks-mr10">填空{{ index + 1 }}</span>
35
+ <yks-tinymce
36
+ key="content"
37
+ :value="item.content"
38
+ :toolbar="toolbarSpare"
39
+ :plugins="plugins"
40
+ :charLimit="topicDataExtent.answerLength || 5000"
41
+
42
+ :fileParams="getFileTypes('option', item.optionAttrs)"
43
+ inline
44
+ height="60px"
45
+ menubar=""
46
+ class="flex-1 radio-tinymce"
47
+ @change="($event) => changeItem($event, item)"
48
+ @delte="($event) => handleDelteAttrs($event, 'option', item.optionAttrs, item)"
49
+ />
50
+ <el-input-number
51
+ v-model="item.score"
52
+ controls-position="right"
53
+ placeholder="分值"
54
+ class="yks-mr10"
55
+ size="large"
56
+ :min="0"
57
+ :step="0.5"
58
+ :max="100"
59
+ ></el-input-number>
60
+ <el-button type="text" class="yks-danger" @click="handleDelte(index)">删除</el-button>
61
+ </div>
62
+
63
+ <div class="fill__other">
64
+ <div class="text__warning">
65
+ 1、如果勾选考生端开启数学公式编辑器,在PC端考生答题页面,本题答题区域考生可以使用数据公式编辑器。
66
+ <br />
67
+ 2、如果勾选按答案自动判分,需要考生填写内容须跟答案完全相同,才能得分,录入答案时,请不要加多余的空格标点符号等干扰字符,考生考后系统自动出分。
68
+ <br />
69
+ 3、如果没有勾选按答案自动判分,考生答卷需等待管理员后台手工判分。
70
+ </div>
71
+ <div class="yks-mt10">
72
+ <el-checkbox v-model="fromData.mathematical"
73
+ >开启数学公式编辑器(只适用于PC端答题)</el-checkbox
74
+ >
75
+ <div class="yks-mt10">
76
+ <el-checkbox v-model="fromData.automaticScoring" true-label="1" false-label="0"
77
+ >按答案自动判分</el-checkbox
78
+ >
79
+ </div>
80
+ <div v-if="fromData.automaticScoring === '1'" class="yks-mt10">
81
+ <el-checkbox v-model="fromData.outOfOrder" true-label="1" false-label="0"
82
+ >允许考生答案与参考答案顺序不一致</el-checkbox
83
+ >
84
+ <el-checkbox v-model="fromData.neglect" true-label="1" false-label="0"
85
+ >忽略大小写</el-checkbox
86
+ >
87
+ </div>
88
+ </div>
89
+ </div>
90
+
91
+ <div class="single-stem__label">答案解析</div>
92
+ <yks-tinymce
93
+ key="description"
94
+ :value="fromData.description"
95
+ :toolbar="toolbar"
96
+ :plugins="plugins"
97
+ :charLimit="topicDataExtent.descriptionLength || 20000"
98
+
99
+ :fileParams="getFileTypes('analysis', fromData.descriptionAttrs)"
100
+ menubar=""
101
+ height="200px"
102
+ @change="($event) => getTinymceEdit($event, 'analysis')"
103
+ @delte="($event) => handleDelteAttrs($event, 'analysis', fromData.descriptionAttrs)"
104
+ />
105
+ </div>
106
+ </template>
107
+ <script>
108
+ import YksTinymce from '../../Tinymce/index'
109
+ import TopicMixins from '../../assets/mixins/topic'
110
+ import { stemItemType, optionItemType, analysisItemType } from './config'
111
+
112
+ export default {
113
+ name: 'ClozeFillInBlanks',
114
+ components: { YksTinymce },
115
+ mixins: [TopicMixins],
116
+ methods: {
117
+ /**
118
+ * data 富文本数据
119
+ * field 对象名
120
+ * type 类型
121
+ */
122
+ getTinymceEdit(data, type) {
123
+ switch (type) {
124
+ case 'stem':
125
+ data.itemAttr.type = stemItemType[data.itemAttr.type]
126
+ if (data.itemAttr.type && data.itemAttr.content) {
127
+ this.fromData.stemAttrs.push(data.itemAttr)
128
+ }
129
+ // eslint-disable-next-line no-case-declarations
130
+ const list = data.value.match(/<input ([^>|]+)>/g, '') || []
131
+ // eslint-disable-next-line no-case-declarations
132
+ const editor = this.$refs.stemTinymceEdit
133
+ if ((this.fromData.itemList || []).length !== list.length && !this.processing) {
134
+ const { itemContent } = this.fromData
135
+ this.$message.error('请从下方填空符删除!')
136
+ this.fromData.itemContent = itemContent.replace(
137
+ /<input ([^>|]+)\/>/g,
138
+ (all, value) => {
139
+ const attributes = value.replace('disabled="disabled"', '')
140
+ return `<input ${attributes} disabled="disabled" />`
141
+ }
142
+ )
143
+ this.$nextTick(() => {
144
+ editor.keepLastIndex()
145
+ })
146
+ } else {
147
+ this.fromData.itemContent = data.value
148
+ }
149
+ break
150
+ case 'analysis':
151
+ data.itemAttr.type = analysisItemType[data.itemAttr.type]
152
+ this.fromData.description = data.value
153
+ if (data.itemAttr.type && data.itemAttr.content) {
154
+ this.fromData.descriptionAttrs.push(data.itemAttr)
155
+ }
156
+ break
157
+ default:
158
+ break
159
+ }
160
+ this.$emit('change', this.fromData)
161
+ },
162
+
163
+ changeItem(data, row) {
164
+ data.itemAttr.type = optionItemType[data.itemAttr.type]
165
+ if (data.itemAttr.type && data.itemAttr.content) {
166
+ row.optionAttrs.push(data.itemAttr)
167
+ this.$set(row, 'optionAttrs', row.optionAttrs)
168
+ }
169
+ this.$set(row, 'content', data.value)
170
+ this.$emit('change', this.fromData)
171
+ },
172
+
173
+ handleDelte(index) {
174
+ const list = this.fromData.itemContent.match(/<input ([^>|]+)>/g, '') || []
175
+ const classId = this.fromData.itemList[index].classId
176
+ if (classId) {
177
+ const subIndex = list.findIndex((v) => v.search(classId) !== -1)
178
+ this.fromData.itemList.splice(index, 1)
179
+ const editor = this.$refs.stemTinymceEdit
180
+ editor.deleFillItem(subIndex)
181
+ } else {
182
+ this.fromData.itemList.splice(index, 1)
183
+ const editor = this.$refs.stemTinymceEdit
184
+ editor.deleFillItem(index)
185
+ }
186
+
187
+ this.$emit('change', this.fromData)
188
+ },
189
+
190
+ handleFillInBlanks() {
191
+ if (this.fromData.itemList.length >= 40) {
192
+ return
193
+ }
194
+
195
+ const value = Date.now()
196
+ this.processing = true
197
+ const editor = this.$refs.stemTinymceEdit
198
+ editor.handleFillInBlanks(this.fromData.itemList.length, value)
199
+ const { itemContent } = this.fromData
200
+ let index = 0
201
+ this.fromData.itemContent = itemContent.replace(/<input ([^>|]+)\/>/g, (all, value) => {
202
+ index += 1
203
+ return `<input value="${index}" ${value} />`
204
+ })
205
+ const list = this.fromData.itemContent.match(/<input ([^>|]+)>/g, '') || []
206
+ const subIndex = list.findIndex((v) => v.search(value) !== -1)
207
+ this.fromData.itemList.splice(subIndex, 0, {
208
+ optionName: '',
209
+ content: '',
210
+ score: '',
211
+ optionAttrs: [],
212
+ classId: value
213
+ })
214
+ this.$nextTick(() => {
215
+ editor.keepLastIndex()
216
+ this.$emit('change', this.fromData)
217
+ })
218
+ this.processing = false
219
+ },
220
+
221
+ handleDelteAttrs(data, type, list, row = {}) {
222
+ const listAttrs = list
223
+ listAttrs.splice(data.index, 1)
224
+ switch (type) {
225
+ case 'stem':
226
+ this.fromData.stemAttrs = listAttrs
227
+ break
228
+ case 'option':
229
+ this.$set(row, 'optionAttrs', listAttrs)
230
+ break
231
+ case 'analysis':
232
+ this.fromData.descriptionAttrs = listAttrs
233
+ break
234
+ default:
235
+ break
236
+ }
237
+ this.$emit('change', this.fromData)
238
+ }
239
+ }
240
+ }
241
+ </script>
242
+
243
+ <style lang="scss" scoped>
244
+ .single-single {
245
+ margin: 30px 0;
246
+ .single-single__label {
247
+ font-weight: 700;
248
+ font-size: 18px;
249
+ width: 100px;
250
+ }
251
+ }
252
+ .single-stem__label {
253
+ font-weight: 700;
254
+ font-size: 18px;
255
+ margin: 30px 0;
256
+ }
257
+ .radio-tinymce {
258
+ font-size: 14px;
259
+ margin-right: 20px;
260
+ }
261
+
262
+ ::v-deep {
263
+ .el-radio-group {
264
+ display: block;
265
+ }
266
+ }
267
+ </style>