|
@@ -1,271 +1,112 @@
|
1
|
1
|
<template>
|
2
|
2
|
<div>
|
3
|
|
- <el-card class="box-card" shadow="never">
|
4
|
|
- <el-row :gutter="24">
|
5
|
|
- <el-col :span="18">
|
6
|
|
- <el-form
|
7
|
|
- ref="ruleForm"
|
8
|
|
- :model="ruleForm"
|
9
|
|
- :rules="rules"
|
10
|
|
- label-width="10vw"
|
11
|
|
- class="demo-ruleForm"
|
12
|
|
- >
|
13
|
|
- <el-form-item label="学期" prop="appName" style="width:30vw">
|
14
|
|
- <el-select v-model="ruleForm.appType" filterable placeholder="请选择">
|
15
|
|
- <el-option
|
16
|
|
- v-for="item in options"
|
17
|
|
- :key="item.value"
|
18
|
|
- :label="item.label"
|
19
|
|
- :value="item.value"
|
20
|
|
- />
|
21
|
|
- </el-select>
|
22
|
|
- </el-form-item>
|
23
|
|
- <el-form-item style="width:30vw" label="课程名" prop="course">
|
24
|
|
- <el-input v-model="ruleForm.course" />
|
25
|
|
- </el-form-item>
|
26
|
|
- <el-form-item style="width:30vw" label="签到人数" prop="signInNum">
|
27
|
|
- <el-input v-model="ruleForm.signInNum" />
|
28
|
|
- </el-form-item>
|
29
|
|
- <el-form-item style="width:30vw" label="二维码" prop="qcode">
|
30
|
|
- <el-image :src="qcode" style="width: 100px; height: 100px" />
|
31
|
|
- </el-form-item>
|
32
|
|
- <!-- <el-form-item label="发布状态" prop="status">
|
33
|
|
- <el-select v-model="ruleForm.status" placeholder="请选择状态">
|
34
|
|
- <el-option label="发布" :value="1" />
|
35
|
|
- <el-option label="未发布" :value="0" />
|
36
|
|
- </el-select>
|
37
|
|
- </el-form-item> -->
|
38
|
|
-
|
39
|
|
- <el-form-item>
|
40
|
|
- <el-button
|
41
|
|
- type="primary"
|
42
|
|
- @click="submitForm('ruleForm')"
|
43
|
|
- >{{ !configId?'新建照片墙':'修改照片墙' }}</el-button>
|
44
|
|
- <el-button @click="resetForm('ruleForm')">重置</el-button>
|
45
|
|
- </el-form-item>
|
46
|
|
- </el-form>
|
47
|
|
- </el-col>
|
48
|
|
- </el-row>
|
|
3
|
+ <el-card class="box-card" style="text-align:center" shadow="never">
|
|
4
|
+ <h2>{{ courseId ? '修改' : '新建' }}课程</h2>
|
|
5
|
+ <el-form
|
|
6
|
+ ref="ruleForm"
|
|
7
|
+ :model="ruleForm"
|
|
8
|
+ :rules="rules"
|
|
9
|
+ label-width="10vw"
|
|
10
|
+ style="width:50%;margin:auto"
|
|
11
|
+ class="demo-ruleForm"
|
|
12
|
+ >
|
|
13
|
+ <el-form-item label="课程名" prop="course">
|
|
14
|
+ <el-input v-model="ruleForm.title" />
|
|
15
|
+ </el-form-item>
|
|
16
|
+ <el-form-item label="课程简介" prop="course">
|
|
17
|
+ <el-input v-model="ruleForm.subTitle" />
|
|
18
|
+ </el-form-item>
|
|
19
|
+ <el-form-item label="课程内容" prop="course">
|
|
20
|
+ <el-input v-model="ruleForm.content" type="textarea" :rows="3" />
|
|
21
|
+ </el-form-item>
|
|
22
|
+ <el-form-item label="开始时间" prop="course">
|
|
23
|
+ <el-date-picker
|
|
24
|
+ v-model="ruleForm.startDate"
|
|
25
|
+ format="yyyy-MM-dd HH:mm"
|
|
26
|
+ type="datetime"
|
|
27
|
+ placeholder="选择日期时间"
|
|
28
|
+ style="width:100%"
|
|
29
|
+ />
|
|
30
|
+ </el-form-item>
|
|
31
|
+ <el-form-item label="结束时间" prop="course">
|
|
32
|
+ <el-date-picker
|
|
33
|
+ v-model="ruleForm.endDate"
|
|
34
|
+ format="yyyy-MM-dd HH:mm"
|
|
35
|
+ type="datetime"
|
|
36
|
+ style="width:100%"
|
|
37
|
+ placeholder="选择日期时间"
|
|
38
|
+ />
|
|
39
|
+ </el-form-item>
|
|
40
|
+ <el-form-item label-width="0">
|
|
41
|
+ <el-button
|
|
42
|
+ type="primary"
|
|
43
|
+ @click="submitForm('ruleForm')"
|
|
44
|
+ >{{ !courseId?'新建课程':'修改课程' }}</el-button>
|
|
45
|
+ <el-button @click="$router.go(-1)">返回</el-button>
|
|
46
|
+ </el-form-item>
|
|
47
|
+ </el-form>
|
49
|
48
|
</el-card>
|
50
|
49
|
</div>
|
51
|
50
|
</template>
|
52
|
51
|
|
53
|
52
|
<script>
|
54
|
|
-// import { saveConfig, detailsConfig, ChangeConfig } from '@/api/WeChatApi'
|
55
|
|
-import QRCode from 'qrcodejs2'
|
|
53
|
+import { saveCourse, getCourseDetail, UpdateCourse } from '@/api/course'
|
56
|
54
|
|
57
|
55
|
export default {
|
58
|
56
|
data() {
|
59
|
57
|
return {
|
60
|
|
- configId: '',
|
61
|
|
- gameForm: {
|
62
|
|
- gameForm: undefined
|
63
|
|
- },
|
64
|
|
- qcode: undefined,
|
|
58
|
+ courseId: '',
|
65
|
59
|
ruleForm: {
|
66
|
|
- course: undefined,
|
67
|
|
- signInNum: undefined,
|
68
|
|
- appName: '',
|
69
|
|
- appid: '',
|
70
|
|
- appType: '',
|
71
|
|
- aesKey: '',
|
72
|
|
- apiUrl: '',
|
73
|
|
- resource: '',
|
74
|
|
- httpPoxyHost: '',
|
75
|
|
- msgDataFormat: 'Json',
|
76
|
|
- secret: '',
|
77
|
|
- token: '',
|
78
|
|
- httpProxyPort: null,
|
79
|
|
- status: null
|
|
60
|
+ title: undefined,
|
|
61
|
+ subTitle: undefined,
|
|
62
|
+ content: undefined,
|
|
63
|
+ startDate: undefined,
|
|
64
|
+ endDate: undefined
|
80
|
65
|
},
|
81
|
66
|
rules: {
|
82
|
|
- appName: [
|
83
|
|
- { required: true, message: '请输入配置名称', trigger: 'blur' }
|
84
|
|
- ],
|
85
|
|
- appid: [{ required: true, message: '请输入AppID', trigger: 'blur' }],
|
86
|
|
- appType: [{ required: true, message: '请选择类型', trigger: 'blur' }],
|
87
|
|
- aesKey: [{ required: true, message: '请选择AesKey', trigger: 'blur' }],
|
88
|
|
- apiUrl: [
|
89
|
|
- { required: true, message: '请选择第三方接口地址', trigger: 'blur' }
|
90
|
|
- ],
|
91
|
|
- httpPoxyHost: [
|
92
|
|
- { required: true, message: '请输入接口代理地址', trigger: 'blur' }
|
93
|
|
- ],
|
94
|
|
- httpProxyPort: [
|
95
|
|
- { required: true, message: '请输入接口代理端口', trigger: 'blur' }
|
|
67
|
+ title: [
|
|
68
|
+ { required: true, message: '请输入课程名称', trigger: 'blur' }
|
96
|
69
|
],
|
97
|
|
- msgDataFormat: [
|
98
|
|
- { required: true, message: '请输入消息格式类型', trigger: 'blur' }
|
99
|
|
- ],
|
100
|
|
- secret: [{ required: true, message: '请输入Secret', trigger: 'blur' }],
|
101
|
|
- token: [{ required: true, message: '请输入Token', trigger: 'blur' }],
|
102
|
|
-
|
103
|
|
- status: [{ required: true, message: '请选择状态', trigger: 'blur' }]
|
104
|
|
- },
|
105
|
|
- options: [{
|
106
|
|
- value: '选项1',
|
107
|
|
- label: '2022年第一学期'
|
108
|
|
- }, {
|
109
|
|
- value: '选项2',
|
110
|
|
- label: '2022年第二学期'
|
111
|
|
- }, {
|
112
|
|
- value: '选项3',
|
113
|
|
- label: '2023年第一学期'
|
114
|
|
- }, {
|
115
|
|
- value: '选项4',
|
116
|
|
- label: '2023年第二学期'
|
117
|
|
- }, {
|
118
|
|
- value: '选项5',
|
119
|
|
- label: '2024年第一学期'
|
120
|
|
- }]
|
121
|
|
- }
|
122
|
|
- },
|
123
|
|
-
|
124
|
|
- watch: {
|
125
|
|
- configId: function(val, oldVal) {
|
126
|
|
- if (val) {
|
127
|
|
- this.configId = val
|
128
|
|
- // detailsConfig(val)
|
129
|
|
- // .then((res) => {
|
130
|
|
- // this.ruleForm = res.data
|
131
|
|
- // })
|
132
|
|
- // .catch((e) => {
|
133
|
|
- // this.$message.error('ID有误。')
|
134
|
|
- // this.$router.go(-1)
|
135
|
|
- // })
|
|
70
|
+ startDate: [{ required: true, message: '请输入课程开始时间', trigger: 'blur' }],
|
|
71
|
+ endDate: [{ required: true, message: '请输入课程结束时间', trigger: 'blur' }]
|
136
|
72
|
}
|
137
|
73
|
}
|
138
|
74
|
},
|
139
|
75
|
mounted() {
|
140
|
|
- if (this.$route?.query.configId) {
|
141
|
|
- this.configId = this.$route.query.configId
|
142
|
|
- // detailsConfig(this.configId)
|
143
|
|
- // .then((res) => {
|
144
|
|
- // this.ruleForm = res.data
|
145
|
|
- // })
|
146
|
|
- // .catch((e) => {
|
147
|
|
- // this.$message.error('ID有误。')
|
148
|
|
- // this.$router.go(-1)
|
149
|
|
- // })
|
150
|
|
- }
|
151
|
76
|
if (this.$route?.query.courseId) {
|
152
|
|
- this.configId = this.$route.query.configId
|
153
|
|
- // detailsConfig(this.configId)
|
154
|
|
- // .then((res) => {
|
155
|
|
- // this.ruleForm = res.data
|
156
|
|
- // })
|
157
|
|
- // .catch((e) => {
|
158
|
|
- // this.$message.error('ID有误。')
|
159
|
|
- // this.$router.go(-1)
|
160
|
|
- // })
|
|
77
|
+ this.courseId = this.$route.query.courseId
|
|
78
|
+ getCourseDetail(this.courseId)
|
|
79
|
+ .then((res) => {
|
|
80
|
+ this.ruleForm = res.data
|
|
81
|
+ })
|
|
82
|
+ .catch((e) => {})
|
161
|
83
|
}
|
162
|
84
|
},
|
163
|
85
|
methods: {
|
164
|
86
|
submitForm(formName) {
|
165
|
87
|
this.$refs[formName].validate((valid) => {
|
166
|
|
- console.log(this.ruleForm)
|
167
|
|
- // if (valid) {
|
168
|
|
- // if (this.configId === '') {
|
169
|
|
- // saveConfig(this.ruleForm)
|
170
|
|
- // .then((e) => {
|
171
|
|
- // this.$message.success('配置保存成功')
|
172
|
|
- // this.$router.go(-1)
|
173
|
|
- // console.log('保存字段', e)
|
174
|
|
- // })
|
175
|
|
- // .catch((e) => {
|
176
|
|
- // this.$message.error('保存失败', e)
|
177
|
|
- // })
|
178
|
|
- // } else {
|
179
|
|
- // ChangeConfig(this.ruleForm, this.configId)
|
180
|
|
- // .then((res) => {
|
181
|
|
- // this.$message.success('配置修改成功')
|
182
|
|
- // this.$router.go(-1)
|
183
|
|
- // })
|
184
|
|
- // .catch((e) => {
|
185
|
|
- // console.log(e)
|
186
|
|
- // })
|
187
|
|
- // }
|
188
|
|
- // } else {
|
189
|
|
- // return false
|
190
|
|
- // }
|
191
|
|
- })
|
192
|
|
- },
|
193
|
|
- resetForm(formName) {
|
194
|
|
- this.$refs[formName].resetFields()
|
195
|
|
- },
|
196
|
|
- handleChange(val) {
|
197
|
|
- this.gameForm.gameImage = val
|
198
|
|
- },
|
199
|
|
- handleDeleteIcon() {
|
200
|
|
- this.gameForm.gameImage = ''
|
201
|
|
- },
|
202
|
|
- // 生成二维码
|
203
|
|
- qrcode(val) {
|
204
|
|
- // eslint-disable-next-line no-unused-vars
|
205
|
|
- const qrcode = new QRCode('qrcode', {
|
206
|
|
- width: 200,
|
207
|
|
- height: 200, // 高度
|
208
|
|
- text: 'http://192.168.89.76:8080/?gameId=' + val.gameId
|
209
|
|
- })
|
210
|
|
- },
|
211
|
|
- // 下载二维码
|
212
|
|
- downloadQrcode(val) {
|
213
|
|
- document.getElementById('qrcode').innerHTML = ''
|
214
|
|
- this.qrcode(val) // 下载之前首先要有二维码
|
215
|
|
- // 先找到canvas节点下的二维码图片
|
216
|
|
- const myCanvas = document.getElementById('qrcode').getElementsByTagName('canvas')
|
217
|
|
- const img = document.getElementById('qrcode').getElementsByTagName('img')
|
218
|
|
- // 创建一个a节点
|
219
|
|
- const a = document.createElement('a')
|
220
|
|
- // 设置a的href属性将canvas变成png格式
|
221
|
|
- const imgURL = myCanvas[0].toDataURL('image/jpg')
|
222
|
|
- const ua = navigator.userAgent
|
223
|
|
- if (ua.indexOf('Trident') !== -1 && ua.indexOf('Windows') !== -1) { // IE内核 并且 windows系统 情况下 才执行;
|
224
|
|
- var bstr = atob(imgURL.split(',')[1])
|
225
|
|
- var n = bstr.length
|
226
|
|
- var u8arr = new Uint8Array(n)
|
227
|
|
- while (n--) {
|
228
|
|
- u8arr[n] = bstr.charCodeAt(n)
|
|
88
|
+ if (valid) {
|
|
89
|
+ if (this.ruleForm.startDate > this.ruleForm.endDate) {
|
|
90
|
+ this.$message.success('结束时间不能小于开始时间')
|
|
91
|
+ } else if (this.courseId) {
|
|
92
|
+ UpdateCourse(this.ruleForm, this.courseId)
|
|
93
|
+ .then((res) => {
|
|
94
|
+ this.$message.success('修改成功')
|
|
95
|
+ this.$router.go(-1)
|
|
96
|
+ })
|
|
97
|
+ .catch((e) => {})
|
|
98
|
+ } else {
|
|
99
|
+ saveCourse(this.ruleForm)
|
|
100
|
+ .then((e) => {
|
|
101
|
+ this.$message.success('保存成功')
|
|
102
|
+ this.$router.go(-1)
|
|
103
|
+ })
|
|
104
|
+ .catch((e) => {})
|
|
105
|
+ }
|
|
106
|
+ } else {
|
|
107
|
+ return false
|
229
|
108
|
}
|
230
|
|
- var blob = new Blob([u8arr])
|
231
|
|
- window.navigator.msSaveOrOpenBlob(blob, val.title + '.png')
|
232
|
|
- } else if (ua.indexOf('Firefox') > -1) { // 火狐兼容下载
|
233
|
|
- const blob = this.base64ToBlob(imgURL) // new Blob([content]);
|
234
|
|
- const evt = document.createEvent('HTMLEvents')
|
235
|
|
- evt.initEvent('click', true, true)// initEvent 不加后两个参数在FF下会报错 事件类型,是否冒泡,是否阻止浏览器的默认行为
|
236
|
|
- a.download = val.title + '.png'// 下载图片名称,如果填内容识别不到,下载为未知文件,所以我这里就不填为空
|
237
|
|
- a.href = URL.createObjectURL(blob)
|
238
|
|
- a.dispatchEvent(new MouseEvent('click', { bubbles: true, cancelable: true, view: window }))// 兼容火狐
|
239
|
|
- } else { // 谷歌兼容下载
|
240
|
|
- img.src = imgURL
|
241
|
|
- a.href = img.src
|
242
|
|
- // 设置下载文件的名字
|
243
|
|
- a.download = val.title + '.png'
|
244
|
|
- // 点击
|
245
|
|
- a.click()
|
246
|
|
- }
|
247
|
|
- },
|
248
|
|
- // 返回对应二维码图片给表格
|
249
|
|
- setCodeImg(val) {
|
250
|
|
- document.getElementById('qrcode').innerHTML = ''
|
251
|
|
- this.qrcode(val) // 下载之前首先要有二维码
|
252
|
|
- // 先找到canvas节点下的二维码图片
|
253
|
|
- const myCanvas = document.getElementById('qrcode').getElementsByTagName('canvas')
|
254
|
|
- // 设置a的href属性将canvas变成png格式
|
255
|
|
- const imgURL = myCanvas[myCanvas.length - 1].toDataURL('image/jpg')
|
256
|
|
- return imgURL
|
257
|
|
- },
|
258
|
|
- // base64转blob
|
259
|
|
- base64ToBlob(code) {
|
260
|
|
- const parts = code.split(';base64,')
|
261
|
|
- const contentType = parts[0].split(':')[1]
|
262
|
|
- const raw = window.atob(parts[1])
|
263
|
|
- const rawLength = raw.length
|
264
|
|
- const uInt8Array = new Uint8Array(rawLength)
|
265
|
|
- for (let i = 0; i < rawLength; ++i) {
|
266
|
|
- uInt8Array[i] = raw.charCodeAt(i)
|
267
|
|
- }
|
268
|
|
- return new Blob([uInt8Array], { type: contentType })
|
|
109
|
+ })
|
269
|
110
|
}
|
270
|
111
|
}
|
271
|
112
|
}
|