张延森 hace 4 años
padre
commit
6accd70a1b

+ 7
- 0
src/api/gallery.js Ver fichero

@@ -25,3 +25,10 @@ export function saveGallery(data) {
25 25
   }))
26 26
 }
27 27
 
28
+export function deleteGallery(id) {
29
+  return pureResponseData(request({
30
+    url: `/api/admin/gallery/${id}`,
31
+    method: 'delete'
32
+  }))
33
+}
34
+

+ 8
- 0
src/api/recommender.js Ver fichero

@@ -8,3 +8,11 @@ export function getRecommenderList(params) {
8 8
     params
9 9
   }))
10 10
 }
11
+
12
+export function updateRecommender(data) {
13
+  return pureResponseData(request({
14
+    url: `/api/admin/recommender/${data.serialNo}`,
15
+    method: 'put',
16
+    data
17
+  }))
18
+}

+ 14
- 2
src/components/UploadImg/index.vue Ver fichero

@@ -9,6 +9,7 @@
9 9
   >
10 10
     <img v-if="value" :src="value" class="uploader-preview">
11 11
     <i v-else class="el-icon-plus avatar-uploader-icon" />
12
+    <div class="uploader-tip">{{tip}}</div>
12 13
   </el-upload>
13 14
 </template>
14 15
 
@@ -21,6 +22,10 @@ export default {
21 22
     value: {
22 23
       type: String,
23 24
       default: undefined
25
+    },
26
+    tip: {
27
+      type: String,
28
+      default: undefined
24 29
     }
25 30
   },
26 31
 
@@ -56,12 +61,12 @@ export default {
56 61
 
57 62
 <style lang="scss">
58 63
 .img-uploader {
64
+  position: relative;
65
+
59 66
   .el-upload {
60 67
     border: 1px dashed #d9d9d9;
61 68
     border-radius: 6px;
62 69
     cursor: pointer;
63
-    position: relative;
64
-    overflow: hidden;
65 70
 
66 71
     &:hover {
67 72
       border-color: #409EFF;
@@ -76,6 +81,13 @@ export default {
76 81
       text-align: center;
77 82
     }
78 83
   }
84
+
85
+  .uploader-tip {
86
+    position: absolute;
87
+    left: 200px;
88
+    top: 40%;
89
+    color: #999;
90
+  }
79 91
 }
80 92
 
81 93
 .uploader-preview {

+ 5
- 0
src/views/activity/Detail.vue Ver fichero

@@ -6,6 +6,7 @@
6 6
           <activity
7 7
             :type-id="typeId"
8 8
             :dataset="detail"
9
+            :tip="tip"
9 10
             @submit="handleSubmit"
10 11
             @cancel="handleCancel"
11 12
             @voteChange="handelVoteChange"
@@ -44,6 +45,10 @@ export default {
44 45
     typeId: {
45 46
       type: Number,
46 47
       default: 0
48
+    },
49
+    tip: {
50
+      type: String,
51
+      default: undefined
47 52
     }
48 53
   },
49 54
 

+ 5
- 1
src/views/activity/components/Detail.vue Ver fichero

@@ -13,7 +13,7 @@
13 13
       />
14 14
     </el-form-item>
15 15
     <el-form-item label="活动封面" prop="thumb">
16
-      <uploadimg v-model="form.thumb" />
16
+      <uploadimg v-model="form.thumb" :tip="tip" />
17 17
     </el-form-item>
18 18
     <el-form-item label="活动地点" prop="address">
19 19
       <el-input v-model="form.address" />
@@ -95,6 +95,10 @@ export default {
95 95
     dataset: {
96 96
       type: Object,
97 97
       default: undefined
98
+    },
99
+    tip: {
100
+      type: String,
101
+      default: undefined
98 102
     }
99 103
   },
100 104
 

+ 37
- 6
src/views/activity/components/Gallery.vue Ver fichero

@@ -3,11 +3,14 @@
3 3
     <div>
4 4
       <el-row v-for="(cols, rowInx) in rows" :key="rowInx" :gutter="20">
5 5
         <el-col v-for="(col, colInx) in cols" :key="colInx" :span="6">
6
-          <el-image
7
-            :src="col.imgUrl"
8
-            :preview-src-list="getImgURLList(cols)"
9
-            style="width: 100%"
10
-          />
6
+          <div class="gallery-item">
7
+            <el-image
8
+              :src="col.imgUrl"
9
+              :preview-src-list="getImgURLList(cols)"
10
+              style="width: 100%"
11
+            />
12
+            <el-button class="delete-btn" type="danger" size="small" @click="handleDelete(col)">删除</el-button>
13
+          </div>
11 14
         </el-col>
12 15
       </el-row>
13 16
     </div>
@@ -21,7 +24,7 @@
21 24
 </template>
22 25
 
23 26
 <script>
24
-import { getGalleryList } from '@/api/gallery'
27
+import { getGalleryList, deleteGallery } from '@/api/gallery'
25 28
 
26 29
 export default {
27 30
   props: {
@@ -91,7 +94,35 @@ export default {
91 94
 
92 95
     getImgURLList(m = []) {
93 96
       return m.map(x => x.imgUrl)
97
+    },
98
+
99
+    handleDelete(img) {
100
+      this.$confirm('是否删除当前图片?', '提示', {
101
+        confirmButtonText: '确定',
102
+        cancelButtonText: '取消',
103
+        type: 'warning'
104
+      }).then(() => {
105
+        deleteGallery(img.imgId).then(res => {
106
+          this.list = this.list.filter(x => x.imgId !== img.imgId)
107
+          this.$message({ type: 'success', message: '删除成功' })
108
+        })
109
+      })
94 110
     }
95 111
   }
96 112
 }
97 113
 </script>
114
+
115
+<style lang="scss" scoped>
116
+.gallery-item {
117
+  .delete-btn {
118
+    margin: 0 auto;
119
+    display: none;
120
+  }
121
+
122
+  &:hover {
123
+    .delete-btn {
124
+      display: block;
125
+    }
126
+  }
127
+}
128
+</style>

+ 26
- 18
src/views/advert/Detail.vue Ver fichero

@@ -5,7 +5,7 @@
5 5
         <el-input v-model="form.title" />
6 6
       </el-form-item>
7 7
       <el-form-item label="图片" prop="image">
8
-        <uploadimg v-model="form.image" />
8
+        <uploadimg v-model="form.image" tip="建议图片尺寸:786*322px,格式:jpg,用于页面广告位banner" />
9 9
       </el-form-item>
10 10
       <el-form-item label="投放位置">
11 11
         <el-select v-model="form.position" placeholder="请选择" style="width: 100%">
@@ -17,23 +17,25 @@
17 17
           />
18 18
         </el-select>
19 19
       </el-form-item>
20
-      <el-form-item label="关联活动">
21
-        <el-select
22
-          v-model="form.srcId"
23
-          v-loading="loading.remote"
24
-          filterable
25
-          remote
26
-          placeholder="请输入活动名称"
27
-          style="width: 100%"
28
-          :remote-method="fetchRemoteActivity"
29
-        >
30
-          <el-option
31
-            v-for="item in activityList"
32
-            :key="item.activityId"
33
-            :label="item.name"
34
-            :value="item.activityId"
35
-          />
36
-        </el-select>
20
+      <el-form-item label="关联活动名称">
21
+        <el-tooltip content="请输入关联活动名称" placement="top-start">
22
+          <el-select
23
+            v-model="form.srcId"
24
+            v-loading="loading.remote"
25
+            filterable
26
+            remote
27
+            placeholder="请输入关联活动名称"
28
+            style="width: 100%"
29
+            :remote-method="fetchRemoteActivity"
30
+          >
31
+            <el-option
32
+              v-for="item in activityList"
33
+              :key="item.activityId"
34
+              :label="item.name"
35
+              :value="item.activityId"
36
+            />
37
+          </el-select>
38
+        </el-tooltip>
37 39
       </el-form-item>
38 40
       <el-form-item label="权重" prop="sortNo">
39 41
         <el-input-number v-model="form.sortNo" :min="0" />
@@ -118,6 +120,10 @@ export default {
118 120
         this.loading.form = true
119 121
         getAdvert(this.id).then(res => {
120 122
           this.form = res
123
+          this.activityList = [{
124
+            activityId: res.srcId,
125
+            name: res.srcName
126
+          }]
121 127
           this.loading.form = false
122 128
         }).catch(err => {
123 129
           console.error(err)
@@ -147,6 +153,8 @@ export default {
147 153
         if (valid) {
148 154
           //
149 155
           const data = this.form
156
+          data.srcName = ((this.activityList || []).filter(x => x.activityId === data.srcId)[0] || {}).name
157
+
150 158
           this.loading.form = true
151 159
           if (this.id) {
152 160
             updateAdvert(data).then(() => {

+ 4
- 4
src/views/customer/index.vue Ver fichero

@@ -61,7 +61,7 @@ export default {
61 61
   filters: {
62 62
     sexFormat(sex) {
63 63
       if (sex === null || sex === undefined) {
64
-        return undefined
64
+        return '未知'
65 65
       }
66 66
 
67 67
       const sexMap = [
@@ -69,12 +69,12 @@ export default {
69 69
         '男',
70 70
         '女'
71 71
       ]
72
-      return sexMap[sex]
72
+      return sexMap[sex] || '未知'
73 73
     },
74 74
 
75 75
     sexTagFormat(sex) {
76 76
       if (sex === null || sex === undefined) {
77
-        return undefined
77
+        return 'info'
78 78
       }
79 79
 
80 80
       const sexMap = [
@@ -82,7 +82,7 @@ export default {
82 82
         'success',
83 83
         'danger'
84 84
       ]
85
-      return sexMap[sex]
85
+      return sexMap[sex] || 'info'
86 86
     }
87 87
   },
88 88
 

+ 1
- 1
src/views/life/Warm/Detail.vue Ver fichero

@@ -1,5 +1,5 @@
1 1
 <template>
2
-  <detail :type-id="1" />
2
+  <detail :type-id="1" tip="建议图片尺寸:710*390px,格式:jpg,用于封面展示" />
3 3
 </template>
4 4
 
5 5
 <script>

+ 1
- 1
src/views/life/school/Detail.vue Ver fichero

@@ -1,5 +1,5 @@
1 1
 <template>
2
-  <detail :type-id="2" />
2
+  <detail :type-id="2" tip="建议图片尺寸:710*390px,格式:jpg,用于封面展示" />
3 3
 </template>
4 4
 
5 5
 <script>

+ 1
- 1
src/views/life/sport/Detail.vue Ver fichero

@@ -1,5 +1,5 @@
1 1
 <template>
2
-  <detail :type-id="3" />
2
+  <detail :type-id="3" tip="建议图片尺寸:710*390px,格式:jpg,用于封面展示" />
3 3
 </template>
4 4
 
5 5
 <script>

+ 1
- 1
src/views/life/travel/Detail.vue Ver fichero

@@ -1,5 +1,5 @@
1 1
 <template>
2
-  <detail :type-id="4" />
2
+  <detail :type-id="4" tip="建议图片尺寸:710*390px,格式:jpg,用于封面展示" />
3 3
 </template>
4 4
 
5 5
 <script>

+ 5
- 0
src/views/life/warm/History.vue Ver fichero

@@ -103,7 +103,12 @@ export default {
103 103
       this.loading.dialog = true
104 104
       saveGallery(this.formData).then(() => {
105 105
         this.loading.dialog = false
106
+        this.showDialog = false
106 107
         this.$message({ type: 'success', message: '新增图片成功' })
108
+        const t = setTimeout(() => {
109
+          window.location.reload()
110
+          clearTimeout(t)
111
+        }, 800)
107 112
       })
108 113
     }
109 114
   }

+ 1
- 1
src/views/love/clothes/Detail.vue Ver fichero

@@ -1,5 +1,5 @@
1 1
 <template>
2
-  <detail :type-id="5" />
2
+  <detail :type-id="5" tip="建议图片尺寸:710*320px,格式:jpg,用于封面展示" />
3 3
 </template>
4 4
 
5 5
 <script>

+ 1
- 1
src/views/love/help/Detail.vue Ver fichero

@@ -1,5 +1,5 @@
1 1
 <template>
2
-  <detail :type-id="6" />
2
+  <detail :type-id="6" tip="建议图片尺寸:238*168px,格式:jpg,用于封面展示" />
3 3
 </template>
4 4
 
5 5
 <script>

+ 7
- 0
src/views/recommender/components/FilterForm.vue Ver fichero

@@ -18,6 +18,13 @@
18 18
     <el-form-item label="推荐人名称">
19 19
       <el-input v-model="formData.recName" placeholder="推荐人名称" />
20 20
     </el-form-item>
21
+    <el-form-item label="状态">
22
+      <el-select v-model="formData.status" placeholder="请选择">
23
+        <el-option label="未审核" :value="0" />
24
+        <el-option label="已通过" :value="1" />
25
+        <el-option label="未通过" :value="1" />
26
+      </el-select>
27
+    </el-form-item>
21 28
     <el-form-item style="margin-left: 36px">
22 29
       <el-button type="primary" @click="handleSubmit">查询</el-button>
23 30
       <el-button @click="handleReset">重置</el-button>

+ 118
- 12
src/views/recommender/index.vue Ver fichero

@@ -7,7 +7,7 @@
7 7
       </el-tooltip>
8 8
     </div>
9 9
     <el-table
10
-      v-loading="listLoading"
10
+      v-loading="loading.list"
11 11
       :data="list"
12 12
       element-loading-text="Loading"
13 13
       border
@@ -26,16 +26,36 @@
26 26
       </el-table-column>
27 27
       <el-table-column label="手机" prop="phone" />
28 28
       <el-table-column label="名称" prop="name" />
29
-      <el-table-column label="性别" align="center" width="200">
29
+      <el-table-column label="性别" align="center">
30 30
         <template slot-scope="scope">
31 31
           <el-tag
32
-            :type="scope.row.sex | sexTagFormat"
32
+            :type="scope.row.sex | tagFormat"
33 33
             disable-transitions
34 34
           >{{ scope.row.sex | sexFormat }}</el-tag>
35 35
         </template>
36 36
       </el-table-column>
37
+      <el-table-column label="备注" width="500">
38
+        <template slot-scope="scope">
39
+          <el-tooltip placement="top-start" :content="scope.row.remark">
40
+            <div>{{scope.row.remark | limitLen}}</div>
41
+          </el-tooltip>
42
+        </template>
43
+      </el-table-column>
37 44
       <el-table-column label="推荐人手机" prop="recPhone" />
38 45
       <el-table-column label="推荐人名称" prop="recName" />
46
+      <el-table-column label="审核状态">
47
+        <template slot-scope="scope">
48
+          <el-tag
49
+            :type="scope.row.status | tagFormat"
50
+            disable-transitions
51
+          >{{ scope.row.status | statusFormat }}</el-tag>
52
+        </template>
53
+      </el-table-column>
54
+      <el-table-column label="操作" align="center">
55
+        <template slot-scope="scope">
56
+          <el-button :disabled="!!scope.row.status" size="mini" type="primary" plain @click="showDialog(scope.row)">审核</el-button>
57
+        </template>
58
+      </el-table-column>
39 59
     </el-table>
40 60
     <pagination
41 61
       :total="page.total"
@@ -43,11 +63,33 @@
43 63
       :current.sync="page.current"
44 64
       @change="handlePageChange"
45 65
     />
66
+    <el-dialog
67
+      v-loading="loading.dialog"
68
+      :visible="dialogVisible"
69
+      title="状态审核"
70
+      @close="hideDialog">
71
+      <el-form label-width="100px">
72
+        <el-form-item label="姓名">{{current.name}}</el-form-item>
73
+        <el-form-item label="手机">{{current.phone}}</el-form-item>
74
+        <el-form-item label="性别">{{current.sex | sexFormat}}</el-form-item>
75
+        <el-form-item label="备注">{{current.remark}}</el-form-item>
76
+        <el-form-item label="状态" :required="true">
77
+          <el-radio-group v-model="current.status">
78
+            <el-radio :label="1">审核通过</el-radio>
79
+            <el-radio :label="2">审核不通过</el-radio>
80
+          </el-radio-group>
81
+        </el-form-item>
82
+        <el-form-item>
83
+          <el-button type="primary" @click="handleSubmit">保 存</el-button>
84
+          <el-button @click="hideDialog">取 消</el-button>
85
+        </el-form-item>
86
+      </el-form>
87
+    </el-dialog>
46 88
   </div>
47 89
 </template>
48 90
 
49 91
 <script>
50
-import { getRecommenderList } from '@/api/recommender'
92
+import { getRecommenderList, updateRecommender } from '@/api/recommender'
51 93
 
52 94
 export default {
53 95
   components: {
@@ -65,27 +107,55 @@ export default {
65 107
         '男',
66 108
         '女'
67 109
       ]
68
-      return sexMap[sex]
110
+      return sexMap[sex] || '未知'
69 111
     },
70 112
 
71
-    sexTagFormat(sex) {
72
-      if (sex === null || sex === undefined) {
113
+    statusFormat(status) {
114
+      if (status === null || status === undefined) {
73 115
         return undefined
74 116
       }
75 117
 
76
-      const sexMap = [
118
+      const statusMap = [
119
+        '未审核',
120
+        '已通过',
121
+        '未通过'
122
+      ]
123
+      return statusMap[status] || '未审核'
124
+    },
125
+
126
+    tagFormat(tag) {
127
+      if (tag === null || tag === undefined) {
128
+        return undefined
129
+      }
130
+
131
+      const tagMap = [
77 132
         'info',
78 133
         'success',
79 134
         'danger'
80 135
       ]
81
-      return sexMap[sex]
136
+      return tagMap[tag]
137
+    },
138
+
139
+    limitLen(v) {
140
+      if (!v) return undefined
141
+
142
+      const limit = 20
143
+      const len = v.length
144
+      if (len < limit) return v
145
+
146
+      return v.substr(0, limit) + '...'
82 147
     }
83 148
   },
84 149
 
85 150
   data() {
86 151
     return {
87 152
       list: null,
88
-      listLoading: true,
153
+      loading: {
154
+        list: false,
155
+        dialog: false
156
+      },
157
+      dialogVisible: false,
158
+      current: {},
89 159
       page: {
90 160
         total: 0,
91 161
         size: 10,
@@ -102,7 +172,7 @@ export default {
102 172
   },
103 173
   methods: {
104 174
     fetchData() {
105
-      this.listLoading = true
175
+      this.loading.list = true
106 176
       getRecommenderList({
107 177
         ...this.filters,
108 178
         pageNum: this.page.current,
@@ -110,7 +180,7 @@ export default {
110 180
       }).then(res => {
111 181
         this.list = res.records
112 182
         this.page.total = res.total
113
-        this.listLoading = false
183
+        this.loading.list = false
114 184
       })
115 185
     },
116 186
 
@@ -130,6 +200,42 @@ export default {
130 200
       }
131 201
 
132 202
       this.fetchData()
203
+    },
204
+
205
+    showDialog(row) {
206
+      this.current = { ...row }
207
+      this.dialogVisible = true
208
+    },
209
+
210
+    hideDialog() {
211
+      this.current = {}
212
+      this.dialogVisible = false
213
+    },
214
+
215
+    handleSubmit() {
216
+      if (this.current.status !== 1 && this.current.status !== 2) {
217
+        this.$message({ type: 'warning', message: '请选择审核结果' })
218
+        return
219
+      }
220
+
221
+      // 依据 serialNo 字段更新 status
222
+      const data = { serialNo: this.current.serialNo, status: this.current.status }
223
+      this.loading.dialog = true
224
+      updateRecommender(data).then((res) => {
225
+        this.loading.dialog = false
226
+        this.hideDialog()
227
+        this.list = this.list.map(x => {
228
+          if (x.serialNo === res.serialNo) {
229
+            return {
230
+              ...x,
231
+              ...res
232
+            }
233
+          }
234
+
235
+          return x
236
+        })
237
+        this.$message({ type: 'success', message: '审核信息成功' })
238
+      })
133 239
     }
134 240
   }
135 241
 }