张延森 4 年前
父节点
当前提交
6accd70a1b

+ 7
- 0
src/api/gallery.js 查看文件

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 查看文件

8
     params
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 查看文件

9
   >
9
   >
10
     <img v-if="value" :src="value" class="uploader-preview">
10
     <img v-if="value" :src="value" class="uploader-preview">
11
     <i v-else class="el-icon-plus avatar-uploader-icon" />
11
     <i v-else class="el-icon-plus avatar-uploader-icon" />
12
+    <div class="uploader-tip">{{tip}}</div>
12
   </el-upload>
13
   </el-upload>
13
 </template>
14
 </template>
14
 
15
 
21
     value: {
22
     value: {
22
       type: String,
23
       type: String,
23
       default: undefined
24
       default: undefined
25
+    },
26
+    tip: {
27
+      type: String,
28
+      default: undefined
24
     }
29
     }
25
   },
30
   },
26
 
31
 
56
 
61
 
57
 <style lang="scss">
62
 <style lang="scss">
58
 .img-uploader {
63
 .img-uploader {
64
+  position: relative;
65
+
59
   .el-upload {
66
   .el-upload {
60
     border: 1px dashed #d9d9d9;
67
     border: 1px dashed #d9d9d9;
61
     border-radius: 6px;
68
     border-radius: 6px;
62
     cursor: pointer;
69
     cursor: pointer;
63
-    position: relative;
64
-    overflow: hidden;
65
 
70
 
66
     &:hover {
71
     &:hover {
67
       border-color: #409EFF;
72
       border-color: #409EFF;
76
       text-align: center;
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
 .uploader-preview {
93
 .uploader-preview {

+ 5
- 0
src/views/activity/Detail.vue 查看文件

6
           <activity
6
           <activity
7
             :type-id="typeId"
7
             :type-id="typeId"
8
             :dataset="detail"
8
             :dataset="detail"
9
+            :tip="tip"
9
             @submit="handleSubmit"
10
             @submit="handleSubmit"
10
             @cancel="handleCancel"
11
             @cancel="handleCancel"
11
             @voteChange="handelVoteChange"
12
             @voteChange="handelVoteChange"
44
     typeId: {
45
     typeId: {
45
       type: Number,
46
       type: Number,
46
       default: 0
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 查看文件

13
       />
13
       />
14
     </el-form-item>
14
     </el-form-item>
15
     <el-form-item label="活动封面" prop="thumb">
15
     <el-form-item label="活动封面" prop="thumb">
16
-      <uploadimg v-model="form.thumb" />
16
+      <uploadimg v-model="form.thumb" :tip="tip" />
17
     </el-form-item>
17
     </el-form-item>
18
     <el-form-item label="活动地点" prop="address">
18
     <el-form-item label="活动地点" prop="address">
19
       <el-input v-model="form.address" />
19
       <el-input v-model="form.address" />
95
     dataset: {
95
     dataset: {
96
       type: Object,
96
       type: Object,
97
       default: undefined
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 查看文件

3
     <div>
3
     <div>
4
       <el-row v-for="(cols, rowInx) in rows" :key="rowInx" :gutter="20">
4
       <el-row v-for="(cols, rowInx) in rows" :key="rowInx" :gutter="20">
5
         <el-col v-for="(col, colInx) in cols" :key="colInx" :span="6">
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
         </el-col>
14
         </el-col>
12
       </el-row>
15
       </el-row>
13
     </div>
16
     </div>
21
 </template>
24
 </template>
22
 
25
 
23
 <script>
26
 <script>
24
-import { getGalleryList } from '@/api/gallery'
27
+import { getGalleryList, deleteGallery } from '@/api/gallery'
25
 
28
 
26
 export default {
29
 export default {
27
   props: {
30
   props: {
91
 
94
 
92
     getImgURLList(m = []) {
95
     getImgURLList(m = []) {
93
       return m.map(x => x.imgUrl)
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
 </script>
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 查看文件

5
         <el-input v-model="form.title" />
5
         <el-input v-model="form.title" />
6
       </el-form-item>
6
       </el-form-item>
7
       <el-form-item label="图片" prop="image">
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
       </el-form-item>
9
       </el-form-item>
10
       <el-form-item label="投放位置">
10
       <el-form-item label="投放位置">
11
         <el-select v-model="form.position" placeholder="请选择" style="width: 100%">
11
         <el-select v-model="form.position" placeholder="请选择" style="width: 100%">
17
           />
17
           />
18
         </el-select>
18
         </el-select>
19
       </el-form-item>
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
       </el-form-item>
39
       </el-form-item>
38
       <el-form-item label="权重" prop="sortNo">
40
       <el-form-item label="权重" prop="sortNo">
39
         <el-input-number v-model="form.sortNo" :min="0" />
41
         <el-input-number v-model="form.sortNo" :min="0" />
118
         this.loading.form = true
120
         this.loading.form = true
119
         getAdvert(this.id).then(res => {
121
         getAdvert(this.id).then(res => {
120
           this.form = res
122
           this.form = res
123
+          this.activityList = [{
124
+            activityId: res.srcId,
125
+            name: res.srcName
126
+          }]
121
           this.loading.form = false
127
           this.loading.form = false
122
         }).catch(err => {
128
         }).catch(err => {
123
           console.error(err)
129
           console.error(err)
147
         if (valid) {
153
         if (valid) {
148
           //
154
           //
149
           const data = this.form
155
           const data = this.form
156
+          data.srcName = ((this.activityList || []).filter(x => x.activityId === data.srcId)[0] || {}).name
157
+
150
           this.loading.form = true
158
           this.loading.form = true
151
           if (this.id) {
159
           if (this.id) {
152
             updateAdvert(data).then(() => {
160
             updateAdvert(data).then(() => {

+ 4
- 4
src/views/customer/index.vue 查看文件

61
   filters: {
61
   filters: {
62
     sexFormat(sex) {
62
     sexFormat(sex) {
63
       if (sex === null || sex === undefined) {
63
       if (sex === null || sex === undefined) {
64
-        return undefined
64
+        return '未知'
65
       }
65
       }
66
 
66
 
67
       const sexMap = [
67
       const sexMap = [
69
         '男',
69
         '男',
70
         '女'
70
         '女'
71
       ]
71
       ]
72
-      return sexMap[sex]
72
+      return sexMap[sex] || '未知'
73
     },
73
     },
74
 
74
 
75
     sexTagFormat(sex) {
75
     sexTagFormat(sex) {
76
       if (sex === null || sex === undefined) {
76
       if (sex === null || sex === undefined) {
77
-        return undefined
77
+        return 'info'
78
       }
78
       }
79
 
79
 
80
       const sexMap = [
80
       const sexMap = [
82
         'success',
82
         'success',
83
         'danger'
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 查看文件

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

+ 1
- 1
src/views/life/school/Detail.vue 查看文件

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

+ 1
- 1
src/views/life/sport/Detail.vue 查看文件

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

+ 1
- 1
src/views/life/travel/Detail.vue 查看文件

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

+ 5
- 0
src/views/life/warm/History.vue 查看文件

103
       this.loading.dialog = true
103
       this.loading.dialog = true
104
       saveGallery(this.formData).then(() => {
104
       saveGallery(this.formData).then(() => {
105
         this.loading.dialog = false
105
         this.loading.dialog = false
106
+        this.showDialog = false
106
         this.$message({ type: 'success', message: '新增图片成功' })
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 查看文件

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

+ 1
- 1
src/views/love/help/Detail.vue 查看文件

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

+ 7
- 0
src/views/recommender/components/FilterForm.vue 查看文件

18
     <el-form-item label="推荐人名称">
18
     <el-form-item label="推荐人名称">
19
       <el-input v-model="formData.recName" placeholder="推荐人名称" />
19
       <el-input v-model="formData.recName" placeholder="推荐人名称" />
20
     </el-form-item>
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
     <el-form-item style="margin-left: 36px">
28
     <el-form-item style="margin-left: 36px">
22
       <el-button type="primary" @click="handleSubmit">查询</el-button>
29
       <el-button type="primary" @click="handleSubmit">查询</el-button>
23
       <el-button @click="handleReset">重置</el-button>
30
       <el-button @click="handleReset">重置</el-button>

+ 118
- 12
src/views/recommender/index.vue 查看文件

7
       </el-tooltip>
7
       </el-tooltip>
8
     </div>
8
     </div>
9
     <el-table
9
     <el-table
10
-      v-loading="listLoading"
10
+      v-loading="loading.list"
11
       :data="list"
11
       :data="list"
12
       element-loading-text="Loading"
12
       element-loading-text="Loading"
13
       border
13
       border
26
       </el-table-column>
26
       </el-table-column>
27
       <el-table-column label="手机" prop="phone" />
27
       <el-table-column label="手机" prop="phone" />
28
       <el-table-column label="名称" prop="name" />
28
       <el-table-column label="名称" prop="name" />
29
-      <el-table-column label="性别" align="center" width="200">
29
+      <el-table-column label="性别" align="center">
30
         <template slot-scope="scope">
30
         <template slot-scope="scope">
31
           <el-tag
31
           <el-tag
32
-            :type="scope.row.sex | sexTagFormat"
32
+            :type="scope.row.sex | tagFormat"
33
             disable-transitions
33
             disable-transitions
34
           >{{ scope.row.sex | sexFormat }}</el-tag>
34
           >{{ scope.row.sex | sexFormat }}</el-tag>
35
         </template>
35
         </template>
36
       </el-table-column>
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
       <el-table-column label="推荐人手机" prop="recPhone" />
44
       <el-table-column label="推荐人手机" prop="recPhone" />
38
       <el-table-column label="推荐人名称" prop="recName" />
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
     </el-table>
59
     </el-table>
40
     <pagination
60
     <pagination
41
       :total="page.total"
61
       :total="page.total"
43
       :current.sync="page.current"
63
       :current.sync="page.current"
44
       @change="handlePageChange"
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
   </div>
88
   </div>
47
 </template>
89
 </template>
48
 
90
 
49
 <script>
91
 <script>
50
-import { getRecommenderList } from '@/api/recommender'
92
+import { getRecommenderList, updateRecommender } from '@/api/recommender'
51
 
93
 
52
 export default {
94
 export default {
53
   components: {
95
   components: {
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
         return undefined
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
         'info',
132
         'info',
78
         'success',
133
         'success',
79
         'danger'
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
   data() {
150
   data() {
86
     return {
151
     return {
87
       list: null,
152
       list: null,
88
-      listLoading: true,
153
+      loading: {
154
+        list: false,
155
+        dialog: false
156
+      },
157
+      dialogVisible: false,
158
+      current: {},
89
       page: {
159
       page: {
90
         total: 0,
160
         total: 0,
91
         size: 10,
161
         size: 10,
102
   },
172
   },
103
   methods: {
173
   methods: {
104
     fetchData() {
174
     fetchData() {
105
-      this.listLoading = true
175
+      this.loading.list = true
106
       getRecommenderList({
176
       getRecommenderList({
107
         ...this.filters,
177
         ...this.filters,
108
         pageNum: this.page.current,
178
         pageNum: this.page.current,
110
       }).then(res => {
180
       }).then(res => {
111
         this.list = res.records
181
         this.list = res.records
112
         this.page.total = res.total
182
         this.page.total = res.total
113
-        this.listLoading = false
183
+        this.loading.list = false
114
       })
184
       })
115
     },
185
     },
116
 
186
 
130
       }
200
       }
131
 
201
 
132
       this.fetchData()
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
 }