|
@@ -11,7 +11,7 @@
|
11
|
11
|
:action='$api.file.image.url'
|
12
|
12
|
:show-file-list="false"
|
13
|
13
|
:on-success="handleAvatarSuccess">
|
14
|
|
- <img v-if="postData.CourseImg" :src="postData.CourseImg" class="avatar">
|
|
14
|
+ <img v-if="detail.CourseImg" :src="detail.CourseImg" class="avatar">
|
15
|
15
|
<i v-else class="el-icon-plus avatar-uploader-icon"></i>
|
16
|
16
|
</el-upload>
|
17
|
17
|
</div>
|
|
@@ -23,7 +23,7 @@
|
23
|
23
|
<div style="width: 50%;">
|
24
|
24
|
<el-input
|
25
|
25
|
placeholder="请输入课程名称"
|
26
|
|
- v-model="postData.CourseName"
|
|
26
|
+ v-model="detail.CourseName"
|
27
|
27
|
clearable
|
28
|
28
|
>
|
29
|
29
|
</el-input>
|
|
@@ -34,12 +34,12 @@
|
34
|
34
|
<span>课程类型:</span>
|
35
|
35
|
<div class="flex-item">
|
36
|
36
|
<div style="width: 50%;">
|
37
|
|
- <el-select v-model="postData.LocationId" placeholder="请选择">
|
|
37
|
+ <el-select v-model="detail.LocationId" placeholder="请选择">
|
38
|
38
|
<el-option
|
39
|
|
- v-for="item in courseTypeList"
|
40
|
|
- :key="item.id"
|
41
|
|
- :label="item.name"
|
42
|
|
- :value="item.id">
|
|
39
|
+ v-for="item in location"
|
|
40
|
+ :key="item.LocationId"
|
|
41
|
+ :label="item.LocationName"
|
|
42
|
+ :value="item.LocationId">
|
43
|
43
|
</el-option>
|
44
|
44
|
</el-select>
|
45
|
45
|
</div>
|
|
@@ -51,7 +51,7 @@
|
51
|
51
|
<div style="width: 200px;">
|
52
|
52
|
<el-input
|
53
|
53
|
placeholder="请输入课程价格"
|
54
|
|
- v-model="postData.Price"
|
|
54
|
+ v-model="detail.Price"
|
55
|
55
|
clearable
|
56
|
56
|
>
|
57
|
57
|
</el-input>
|
|
@@ -62,7 +62,7 @@
|
62
|
62
|
<span>案场:</span>
|
63
|
63
|
<div class="flex-item">
|
64
|
64
|
<div style="width: 50%;">
|
65
|
|
- <el-select v-model="postData.CaseId" placeholder="请选择">
|
|
65
|
+ <el-select v-model="CaseId" placeholder="请选择">
|
66
|
66
|
<el-option
|
67
|
67
|
v-for="item in cases"
|
68
|
68
|
:key="item.CaseId"
|
|
@@ -79,7 +79,7 @@
|
79
|
79
|
<div style="width: 200px;">
|
80
|
80
|
<el-input
|
81
|
81
|
placeholder="请输入开课人数"
|
82
|
|
- v-model="postData.MaxNum"
|
|
82
|
+ v-model="detail.MaxNum"
|
83
|
83
|
clearable
|
84
|
84
|
>
|
85
|
85
|
</el-input>
|
|
@@ -92,7 +92,7 @@
|
92
|
92
|
<div style="width: 200px;">
|
93
|
93
|
<el-input
|
94
|
94
|
placeholder="请输入开课人数"
|
95
|
|
- v-model="postData.MinNum"
|
|
95
|
+ v-model="detail.MinNum"
|
96
|
96
|
clearable
|
97
|
97
|
>
|
98
|
98
|
</el-input>
|
|
@@ -105,7 +105,7 @@
|
105
|
105
|
<div style="width: 200px;">
|
106
|
106
|
<el-input
|
107
|
107
|
placeholder="请输入课时数"
|
108
|
|
- v-model="postData.CourseNum"
|
|
108
|
+ v-model="detail.CourseNum"
|
109
|
109
|
clearable
|
110
|
110
|
>
|
111
|
111
|
</el-input>
|
|
@@ -117,15 +117,15 @@
|
117
|
117
|
<div class="flex-item">
|
118
|
118
|
<div>
|
119
|
119
|
<el-date-picker
|
120
|
|
- v-model="postData.BeginDate"
|
121
|
|
- type="date"
|
122
|
|
- placeholder="选择开始日期">
|
123
|
|
- </el-date-picker>
|
124
|
|
- <span style="line-height:40px;display:inline-block;">-</span>
|
125
|
|
- <el-date-picker
|
126
|
|
- v-model="postData.EndDate"
|
127
|
|
- type="date"
|
128
|
|
- placeholder="选择结束日期">
|
|
120
|
+ v-model="courseDate"
|
|
121
|
+ type="daterange"
|
|
122
|
+ align="right"
|
|
123
|
+ unlink-panels
|
|
124
|
+ range-separator="至"
|
|
125
|
+ start-placeholder="开始日期"
|
|
126
|
+ end-placeholder="结束日期"
|
|
127
|
+ value-format="yyyy-MM-ddTHH:mm:ss"
|
|
128
|
+ :picker-options="pickerOptions">
|
129
|
129
|
</el-date-picker>
|
130
|
130
|
</div>
|
131
|
131
|
</div>
|
|
@@ -138,7 +138,7 @@
|
138
|
138
|
type="textarea"
|
139
|
139
|
autosize
|
140
|
140
|
placeholder="请输入备注"
|
141
|
|
- v-model="postData.Remark"
|
|
141
|
+ v-model="detail.Remark"
|
142
|
142
|
clearable
|
143
|
143
|
>
|
144
|
144
|
</el-input>
|
|
@@ -150,17 +150,20 @@
|
150
|
150
|
<div class="flex-item">
|
151
|
151
|
<div style="width: 50%;">
|
152
|
152
|
<el-select
|
153
|
|
- v-model="postData.tagids"
|
|
153
|
+ style="width:100%"
|
|
154
|
+ v-model="tags"
|
154
|
155
|
multiple
|
155
|
156
|
filterable
|
156
|
157
|
allow-create
|
157
|
158
|
default-first-option
|
158
|
159
|
placeholder="请选择课程标签">
|
159
|
160
|
<el-option
|
160
|
|
- v-for="item in tagList"
|
161
|
|
- :key="item.value"
|
162
|
|
- :label="item.id"
|
163
|
|
- :value="item.value">
|
|
161
|
+ v-for="item in tagList.list"
|
|
162
|
+ :key="item.TagId"
|
|
163
|
+ :label="item.TagName"
|
|
164
|
+ :value="item.TagId"
|
|
165
|
+ :value-key="item.TagId"
|
|
166
|
+ >
|
164
|
167
|
</el-option>
|
165
|
168
|
</el-select>
|
166
|
169
|
</div>
|
|
@@ -174,7 +177,7 @@
|
174
|
177
|
type="textarea"
|
175
|
178
|
autosize
|
176
|
179
|
placeholder="请输入课程简介"
|
177
|
|
- v-model="postData.CourseDesc"
|
|
180
|
+ v-model="detail.CourseDesc"
|
178
|
181
|
clearable
|
179
|
182
|
>
|
180
|
183
|
</el-input>
|
|
@@ -185,8 +188,8 @@
|
185
|
188
|
<span>是否精选课程:</span>
|
186
|
189
|
<div class="flex-item">
|
187
|
190
|
<div>
|
188
|
|
- <el-radio v-model="postData.IsSelect" label="1">是</el-radio>
|
189
|
|
- <el-radio v-model="postData.IsSelect" label="0">否</el-radio>
|
|
191
|
+ <el-radio v-model="detail.IsSelect" :label="1">是</el-radio>
|
|
192
|
+ <el-radio v-model="detail.IsSelect" :label="0">否</el-radio>
|
190
|
193
|
</div>
|
191
|
194
|
</div>
|
192
|
195
|
</li>
|
|
@@ -200,59 +203,150 @@
|
200
|
203
|
</template>
|
201
|
204
|
|
202
|
205
|
<script>
|
203
|
|
-import { mapState } from 'vuex'
|
|
206
|
+import { createNamespacedHelpers, mapState } from 'vuex'
|
|
207
|
+
|
|
208
|
+const { mapState: mapCourseState, mapActions: mapCourseActions } = createNamespacedHelpers('course')
|
|
209
|
+const { mapState: mapLocationState, mapActions: mapLocationActions } = createNamespacedHelpers('cms')
|
|
210
|
+const { mapState: mapTagState, mapActions: mapTagActions } = createNamespacedHelpers('coursetag')
|
|
211
|
+
|
204
|
212
|
export default {
|
205
|
213
|
name: '',
|
206
|
214
|
data () {
|
207
|
215
|
return {
|
208
|
|
- postData: {
|
209
|
|
- CourseImg: '', // 课程主图
|
210
|
|
- CourseName: '', // 课程名称
|
211
|
|
- LocationId: '', // 课程类型
|
212
|
|
- Price: '', // 课程价格
|
213
|
|
- CaseId: '', // 案场id
|
214
|
|
- MaxNum: '', // 上课人数
|
215
|
|
- MinNum: '', // 最小开课人数
|
216
|
|
- CourseNum: '', // 课时数
|
217
|
|
- BeginDate: '', // 课程开始时间
|
218
|
|
- EndDate: '', // 课程结束时间
|
219
|
|
- Remark: '', // 课程计划备注
|
220
|
|
- tagids: [], // 课程标签(已有标签数据存入此字段)
|
221
|
|
- tagnames: [], // 课程标签(新增标签数据存入此字段)
|
222
|
|
- CourseDesc: '', // 课程描述
|
223
|
|
- IsSelect: '0', // 是否精选课程
|
|
216
|
+ pickerOptions: {
|
|
217
|
+ shortcuts: [{
|
|
218
|
+ text: '最近一周',
|
|
219
|
+ onClick (picker) {
|
|
220
|
+ const end = new Date()
|
|
221
|
+ const start = new Date()
|
|
222
|
+ start.setTime(start.getTime() - 3600 * 1000 * 24 * 7)
|
|
223
|
+ picker.$emit('pick', [start, end])
|
|
224
|
+ }
|
|
225
|
+ }, {
|
|
226
|
+ text: '最近一个月',
|
|
227
|
+ onClick (picker) {
|
|
228
|
+ const end = new Date()
|
|
229
|
+ const start = new Date()
|
|
230
|
+ start.setTime(start.getTime() - 3600 * 1000 * 24 * 30)
|
|
231
|
+ picker.$emit('pick', [start, end])
|
|
232
|
+ }
|
|
233
|
+ }, {
|
|
234
|
+ text: '最近三个月',
|
|
235
|
+ onClick (picker) {
|
|
236
|
+ const end = new Date()
|
|
237
|
+ const start = new Date()
|
|
238
|
+ start.setTime(start.getTime() - 3600 * 1000 * 24 * 90)
|
|
239
|
+ picker.$emit('pick', [start, end])
|
|
240
|
+ }
|
|
241
|
+ }]
|
224
|
242
|
},
|
225
|
|
- courseTypeList: [], // 课程类型列表
|
226
|
|
- tagList: [], // 标签列表
|
227
|
243
|
}
|
228
|
244
|
},
|
229
|
245
|
computed: {
|
|
246
|
+ ...mapLocationState({
|
|
247
|
+ location: x => x.location
|
|
248
|
+ }),
|
|
249
|
+ ...mapCourseState({
|
|
250
|
+ detail: x => x.courseInfo
|
|
251
|
+ }),
|
230
|
252
|
...mapState({
|
231
|
253
|
cases: x => x.app.cases.list,
|
232
|
|
- defaultCaseId: x => x.app.cases.default,
|
233
|
|
- OrgId: x => x.app.user.OrgId,
|
|
254
|
+ caseid: x => x.app.cases.default,
|
|
255
|
+ orgid: x => x.app.user.OrgId,
|
|
256
|
+ }),
|
|
257
|
+ ...mapTagState({
|
|
258
|
+ tagList: x => x.tagList
|
234
|
259
|
}),
|
235
|
260
|
CaseId: {
|
236
|
261
|
get () {
|
237
|
|
- return this.postData.CaseId === '' ? this.defaultCaseId || '' : this.postData.CaseId
|
|
262
|
+ return this.detail.CaseId || this.caseid
|
238
|
263
|
},
|
239
|
264
|
set (val) {
|
240
|
|
- this.postData.CaseId = val
|
|
265
|
+ this.UpdateInfo({...this.detail, CaseId: val})
|
241
|
266
|
}
|
242
|
|
- }
|
|
267
|
+ },
|
|
268
|
+ courseDate: {
|
|
269
|
+ get () {
|
|
270
|
+ return this.detail.BeginDate && this.detail.EndDate ? [this.detail.BeginDate, this.detail.EndDate] : []
|
|
271
|
+ },
|
|
272
|
+ set (val) {
|
|
273
|
+ this.UpdateInfo({...this.detail, BeginDate: val[0], EndDate: val[1]})
|
|
274
|
+ },
|
|
275
|
+ },
|
|
276
|
+ tags: {
|
|
277
|
+ get () {
|
|
278
|
+ return (this.detail.CourseTags || []).map(x => x.TagId)
|
|
279
|
+ },
|
|
280
|
+ set (val) {
|
|
281
|
+ let v = val.map(x => {
|
|
282
|
+ return {
|
|
283
|
+ TagId: x,
|
|
284
|
+ }
|
|
285
|
+ })
|
|
286
|
+ this.UpdateInfo({...this.detail, CourseTags: v})
|
|
287
|
+ }
|
|
288
|
+ },
|
243
|
289
|
},
|
244
|
290
|
components: {},
|
245
|
291
|
methods: {
|
|
292
|
+ ...mapCourseActions([
|
|
293
|
+ 'GetCourseByID',
|
|
294
|
+ 'AddCourse',
|
|
295
|
+ 'UpdateCourse',
|
|
296
|
+ 'UpdateInfo',
|
|
297
|
+ ]),
|
|
298
|
+ ...mapLocationActions([
|
|
299
|
+ 'updateLocationInfo',
|
|
300
|
+ ]),
|
|
301
|
+ ...mapTagActions([
|
|
302
|
+ 'GetCourseTagList',
|
|
303
|
+ ]),
|
246
|
304
|
handleAvatarSuccess (res, file) {
|
247
|
|
- this.postData.CourseImg = res.result.url
|
|
305
|
+ this.UpdateInfo({...this.detail, CourseImg: res.result.url})
|
248
|
306
|
},
|
249
|
307
|
submit () { // 提交数据
|
|
308
|
+ const { id } = this.$route.query
|
|
309
|
+ if (!id || id === '') {
|
|
310
|
+ this.UpdateInfo({...this.detail, CourseId: ''})
|
|
311
|
+ }
|
|
312
|
+ const _that = this
|
|
313
|
+ this.detail.tagids = this.tags.map(x => {
|
|
314
|
+ let tagfilter = (_that.tagList.list || []).filter(tag => tag.TagId === x)
|
|
315
|
+ if (tagfilter.length > 0) {
|
|
316
|
+ return tagfilter[0].TagName + ':' + tagfilter[0].TagId
|
|
317
|
+ } else {
|
|
318
|
+ return x
|
|
319
|
+ }
|
|
320
|
+ }).join(',')
|
|
321
|
+ if ((this.detail.CourseId || '') === '') {
|
|
322
|
+ this.detail.OrgId = this.orgid
|
|
323
|
+ if (!this.detail.CaseId || this.detail.CaseId === '') {
|
|
324
|
+ this.detail.CaseId = this.caseid
|
|
325
|
+ }
|
|
326
|
+ this.AddCourse(this.detail)
|
|
327
|
+ } else {
|
|
328
|
+ this.UpdateCourse(this.detail)
|
|
329
|
+ }
|
|
330
|
+ this.$message({
|
|
331
|
+ type: 'success',
|
|
332
|
+ message: '操作成功'
|
|
333
|
+ })
|
|
334
|
+ this.$router.push({ name: 'courseList' })
|
250
|
335
|
},
|
251
|
336
|
cancel () {
|
252
|
337
|
this.$router.push({ name: 'courseList' })
|
253
|
338
|
}
|
254
|
339
|
},
|
255
|
|
- mounted () { }
|
|
340
|
+ mounted () {
|
|
341
|
+ this.updateLocationInfo()
|
|
342
|
+ this.GetCourseTagList({ pagesize: 100 })
|
|
343
|
+ const { id } = this.$route.query
|
|
344
|
+ if (id && id !== '') {
|
|
345
|
+ this.GetCourseByID({ id: id })
|
|
346
|
+ } else {
|
|
347
|
+ // this.SetNull()
|
|
348
|
+ }
|
|
349
|
+ }
|
256
|
350
|
}
|
257
|
351
|
</script>
|
258
|
352
|
|