张延森 преди 4 години
родител
ревизия
dc0f25b67a

+ 9
- 0
src/api/recommender.js Целия файл

@@ -9,6 +9,15 @@ export function getRecommenderList(params) {
9 9
   }))
10 10
 }
11 11
 
12
+export function exportRecommenderList(params) {
13
+  return request({
14
+    url: `/api/admin/recommender/export`,
15
+    method: 'get',
16
+    responseType: 'blob',
17
+    params
18
+  })
19
+}
20
+
12 21
 export function updateRecommender(data) {
13 22
   return pureResponseData(request({
14 23
     url: `/api/admin/recommender/${data.serialNo}`,

+ 78
- 0
src/components/MultiUploadImg/index.vue Целия файл

@@ -0,0 +1,78 @@
1
+<template>
2
+  <div>
3
+    <el-upload
4
+      v-loading="loading"
5
+      v-bind="uploadOption"
6
+      list-type="picture-card"
7
+      :before-upload="beforeUpload"
8
+      :on-success="handleUploadSuccess"
9
+      :on-remove="handleRemove">
10
+      <i class="el-icon-plus"></i>
11
+    </el-upload>
12
+    <el-dialog :visible.sync="dialogVisible">
13
+      <img width="100%" :src="dialogImageUrl" alt="">
14
+    </el-dialog>
15
+  </div>
16
+</template>
17
+
18
+<script>
19
+import { Message } from 'element-ui'
20
+import uploadOption from '@/utils/uploadOption'
21
+
22
+export default {
23
+  props: {
24
+    value: {
25
+      type: Array,
26
+      default: () => []
27
+    },
28
+    tip: {
29
+      type: String,
30
+      default: undefined
31
+    }
32
+  },
33
+
34
+  data() {
35
+    return {
36
+      loading: false,
37
+      dialogVisible: false,
38
+      dialogImageUrl: undefined,
39
+      uploadOption
40
+    }
41
+  },
42
+
43
+  methods: {
44
+    handleUploadSuccess(res, file) {
45
+      this.loading = false
46
+      if (res.code !== 1000) {
47
+        Message({
48
+          message: res.message || 'Error',
49
+          type: 'error',
50
+          duration: 5 * 1000
51
+        })
52
+      } else {
53
+        this.trigChange(this.value.concat(res.data.url))
54
+      }
55
+    },
56
+
57
+    handleRemove(file, fileList) {
58
+      this.trigChange(this.value.filter(x => x !== file.url))
59
+    },
60
+
61
+    trigChange(val) {
62
+      this.$emit('input', val)
63
+      this.$emit('change', val)
64
+    },
65
+
66
+    handlePictureCardPreview(file) {
67
+      this.dialogImageUrl = file.url
68
+      this.dialogVisible = true
69
+    },
70
+
71
+    beforeUpload() {
72
+      // TODO
73
+      this.loading = true
74
+      return true
75
+    }
76
+  }
77
+}
78
+</script>

+ 13
- 0
src/utils/request.js Целия файл

@@ -41,6 +41,19 @@ service.interceptors.response.use(
41 41
    * You can also judge the status by HTTP Status Code
42 42
    */
43 43
   response => {
44
+    const contentType = response.headers['Content-Type'] || response.headers['content-type'] || ''
45
+    if (contentType.indexOf('application/vnd.ms-excel') > -1) {
46
+      const contentDisposition = response.headers['content-disposition'] || ''
47
+      const fileName = decodeURI(contentDisposition.replace(/.*filename\=(.*)/, '$1'))
48
+      const url = window.URL.createObjectURL(new Blob([response.data]))
49
+      const download = document.createElement('a')
50
+      download.setAttribute('href', url)
51
+      debugger
52
+      download.setAttribute('download', decodeURIComponent(fileName))
53
+      download.click()
54
+      return
55
+    }
56
+
44 57
     const res = response.data
45 58
 
46 59
     const token = response.headers['x-authorization-jwt']

+ 2
- 1
src/views/activity/components/Gallery.vue Целия файл

@@ -53,7 +53,7 @@ export default {
53 53
       let tmp = []
54 54
       for (let i = 0; i < this.list.length; i++) {
55 55
         const inx = Math.floor(i % colNum)
56
-        tmp[inx] = this.list[inx]
56
+        tmp[inx] = this.list[i]
57 57
 
58 58
         if (inx === colNum - 1) {
59 59
           rtn.push(tmp)
@@ -117,6 +117,7 @@ export default {
117 117
   .delete-btn {
118 118
     margin: 0 auto;
119 119
     display: none;
120
+    margin-bottom: 1em;
120 121
   }
121 122
 
122 123
   &:hover {

+ 37
- 15
src/views/life/warm/History.vue Целия файл

@@ -28,8 +28,8 @@
28 28
             />
29 29
           </el-select>
30 30
         </el-form-item>
31
-        <el-form-item label="图片" prop="imgUrl">
32
-          <uploadimg v-model="formData.imgUrl" />
31
+        <el-form-item label="图片" prop="imgUrls" required>
32
+          <uploadimg v-model="formData.imgUrls" />
33 33
         </el-form-item>
34 34
         <el-form-item>
35 35
           <el-button type="primary" @click="handleSubmit">保 存</el-button>
@@ -46,7 +46,7 @@ import { getGalleryType, saveGallery } from '@/api/gallery'
46 46
 export default {
47 47
   components: {
48 48
     gallery: () => import('@/views/activity/components/Gallery'),
49
-    uploadimg: () => import('@/components/UploadImg')
49
+    uploadimg: () => import('@/components/MultiUploadImg')
50 50
   },
51 51
 
52 52
   data() {
@@ -57,15 +57,27 @@ export default {
57 57
         dialog: false
58 58
       },
59 59
       formData: {
60
-        imgUrl: undefined,
60
+        imgUrls: [],
61 61
         typeId: undefined
62 62
       },
63 63
       rules: {
64 64
         typeId: [
65 65
           { required: true, message: '请选择标签', trigger: 'change' }
66 66
         ],
67
-        imgUrl: [
68
-          { required: true, message: '请选择图片', trigger: 'change' }
67
+        imgUrls: [
68
+          {
69
+            trigger: 'input',
70
+            validator: (rule, value, callback) => {
71
+              if (!value || !value.length) {
72
+                const err = new Error('请上传图片')
73
+                callback(err)
74
+                return err
75
+              } else {
76
+                callback()
77
+                return true
78
+              }
79
+            }
80
+          }
69 81
         ]
70 82
       }
71 83
     }
@@ -100,15 +112,25 @@ export default {
100 112
     },
101 113
 
102 114
     handleSubmit() {
103
-      this.loading.dialog = true
104
-      saveGallery(this.formData).then(() => {
105
-        this.loading.dialog = false
106
-        this.showDialog = false
107
-        this.$message({ type: 'success', message: '新增图片成功' })
108
-        const t = setTimeout(() => {
109
-          window.location.reload()
110
-          clearTimeout(t)
111
-        }, 800)
115
+      this.$refs.galleryForm.validate((valid) => {
116
+        if (!valid) return
117
+
118
+        this.loading.dialog = true
119
+
120
+        const promiseList = (this.formData.imgUrls || []).map(x => saveGallery({
121
+          imgUrl: x,
122
+          typeId: this.formData.typeId
123
+        }))
124
+
125
+        Promise.all(promiseList).then(() => {
126
+          this.loading.dialog = false
127
+          this.showDialog = false
128
+          this.$message({ type: 'success', message: '新增图片成功' })
129
+          const t = setTimeout(() => {
130
+            window.location.reload()
131
+            clearTimeout(t)
132
+          }, 800)
133
+        })
112 134
       })
113 135
     }
114 136
   }

+ 4
- 2
src/views/recommender/index.vue Целия файл

@@ -89,7 +89,7 @@
89 89
 </template>
90 90
 
91 91
 <script>
92
-import { getRecommenderList, updateRecommender } from '@/api/recommender'
92
+import { getRecommenderList, updateRecommender, exportRecommenderList } from '@/api/recommender'
93 93
 
94 94
 export default {
95 95
   components: {
@@ -184,7 +184,9 @@ export default {
184 184
       })
185 185
     },
186 186
 
187
-    handleExport() {},
187
+    handleExport() {
188
+      exportRecommenderList(this.filters)
189
+    },
188 190
 
189 191
     handlePageChange({ current, size }) {
190 192
       this.page.current = current