浏览代码

Merge branch 'master' of http://git.ycjcjy.com/zhiyuxing/pc-admin

许静 5 年前
父节点
当前提交
7a56dc1494

+ 11
- 1
src/config/api.js 查看文件

@@ -174,10 +174,14 @@ const apis = {
174 174
       method:'get',
175 175
       url: `${commPrefix}/customer/recommend/:id`
176 176
     },
177
+    getCustomerDetail: {
178
+      method: `get`,
179
+      url: `${commPrefix}/customer/recommend/get/:id`
180
+    },
177 181
     taPointsRecords: { // 积分列表
178 182
       method: `get`,
179 183
       url: `${commPrefix}/taPointsRecords/:id`
180
-    }
184
+    },
181 185
   },
182 186
   goods:{
183 187
     list:{
@@ -303,5 +307,11 @@ const apis = {
303 307
       url: `${commPrefix}/extendContent`
304 308
     }
305 309
   },
310
+  message:{
311
+    list:{
312
+      method:'get',
313
+      url: `${commPrefix}/taCustomerMessage`
314
+    }
315
+  },
306 316
 }
307 317
 export default apis

+ 1
- 0
src/store/index.js 查看文件

@@ -19,6 +19,7 @@ const store = new Vuex.Store({
19 19
     points: require('./modules/points').default,
20 20
     exchange: require('./modules/exchange').default,
21 21
     carouselFigure: require('./modules/carouselFigure').default,
22
+    message: require('./modules/message').default,
22 23
     news
23 24
 
24 25
   }

+ 13
- 2
src/store/modules/customer.js 查看文件

@@ -95,8 +95,19 @@ export default {
95 95
           reject(message)
96 96
         })
97 97
       })
98
-    }
99
-
98
+    },
99
+    getCustomerDetail({ commit }, payload) { // 查询客户详情
100
+      return new Promise((resolve, reject) => {
101
+        request({
102
+          ...apis.recommendCustomer.getCustomerDetail,
103
+          urlData: { id: payload.customerId}
104
+        }).then((data) => {
105
+          resolve(data)
106
+        }).catch(({ message }) => {
107
+          reject(message)
108
+        })
109
+    })
110
+}
100 111
     
101 112
   }
102 113
 }

+ 128
- 0
src/store/modules/message.js 查看文件

@@ -0,0 +1,128 @@
1
+import request from '../../utils/request'
2
+import apis from '../../config/api'
3
+
4
+export default {
5
+  namespaced: true,
6
+  state: {
7
+    dynamics: {},
8
+    detail: {}
9
+  },
10
+  mutations: {
11
+    updateList (state, payload) {
12
+      state.dynamics = payload
13
+    },
14
+    updateDetail (state, payload) {
15
+      state.detail = payload
16
+    }
17
+  },
18
+  actions: {
19
+    setDetailNull ({ commit }) {
20
+      commit('updateDetail', {})
21
+    },
22
+    getMessage ({ commit }, payload) {
23
+      return new Promise((resolve, reject) => {
24
+        request({
25
+          ...apis.message.list,
26
+          params: payload,
27
+        }).then((data) => {
28
+          commit('updateList', data)
29
+          resolve(data)
30
+        }).catch((err) => {
31
+          resolve(err)
32
+        })
33
+      })
34
+    },
35
+    getGoodsDetail ({ commit }, payload) {
36
+      return new Promise((resolve, reject) => {
37
+        request({
38
+          ...apis.goods.detail,
39
+          urlData: payload,
40
+        }).then((data) => {
41
+          commit('updateDetail', data)
42
+          resolve(data)
43
+        }).catch((err) => {
44
+          const message = err.message || err.msg
45
+
46
+          if (typeof message === 'string') {
47
+            reject(message)
48
+          }
49
+        })
50
+      })
51
+    },
52
+    addGoods (_, payload) {
53
+      return new Promise((resolve, reject) => {
54
+        request({
55
+          ...apis.goods.add, 
56
+          data: payload,
57
+        }).then((data) => {
58
+          resolve(data)
59
+        }).catch((err) => {
60
+          const message = err.message || err.msg
61
+          if (typeof message === 'string') {
62
+            reject(message)
63
+          }
64
+        })
65
+      })
66
+    },
67
+    editGoods (_, payload) {
68
+      return new Promise((resolve, reject) => {
69
+        request({
70
+          ...apis.goods.edit,
71
+          data: payload,
72
+        }).then((data) => {
73
+          resolve(data)
74
+        }).catch((err) => {
75
+          const message = err.message || err.msg
76
+
77
+          if (typeof message === 'string') {
78
+            reject(message)
79
+          }
80
+        })
81
+      })
82
+    },
83
+    deleteDynamics (_, payload) {
84
+      return new Promise((resolve, reject) => {
85
+        request({
86
+          ...apis.dynamic.delete,
87
+          ...payload
88
+        }).then(() => {
89
+          resolve()
90
+        }).catch(() => {
91
+          reject()
92
+        })
93
+      })
94
+    },
95
+    changeGoodsStatus (_, payload) {
96
+      return new Promise((resolve, reject) => {
97
+        request({
98
+          ...apis.goods.change,
99
+          data: payload,
100
+        }).then((data) => {
101
+          resolve(data)
102
+        }).catch((err) => {
103
+          const message = err.message || err.msg
104
+
105
+          if (typeof message === 'string') {
106
+            reject(message)
107
+          }
108
+        })
109
+      })
110
+    },
111
+    cancelDynamic (_, payload) {
112
+      return new Promise((resolve, reject) => {
113
+        request({
114
+          ...apis.dynamic.cancel,
115
+          urlData: payload,
116
+        }).then((data) => {
117
+          resolve(data)
118
+        }).catch((err) => {
119
+          const message = err.message || err.msg
120
+
121
+          if (typeof message === 'string') {
122
+            reject(message)
123
+          }
124
+        })
125
+      })
126
+    }
127
+  }
128
+}

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

@@ -24,7 +24,7 @@
24 24
        <el-date-picker v-model="activityQuery.endDate" type="datetime" placeholder="选择日期"/>   
25 25
     </el-form-item>
26 26
     <el-form-item label="活动地点"  prop="address">
27
-      <el-input  v-model="activityQuery.address"></el-input>
27
+      <el-input v-model="activityQuery.address"></el-input>
28 28
     </el-form-item>
29 29
     <el-form-item label="活动人数" prop="personNum">
30 30
       <el-input v-model="activityQuery.personNum" type="number"></el-input>
@@ -90,7 +90,7 @@ export default {
90 90
       },
91 91
       rules: {
92 92
           buildingId: [
93
-            { required: true, message: '请选择活动区域', trigger: 'change' }
93
+            { required: true, message: '请选择活动区域', trigger: 'blur' }
94 94
           ],
95 95
           url: [
96 96
             { required: true, message: ' ', trigger: 'change' }
@@ -99,16 +99,16 @@ export default {
99 99
             { required: true, message: '请输入活动标题', trigger: 'blur' },
100 100
           ],
101 101
           startDate: [
102
-            { required: true, message: '请选择日期', trigger: 'change' }
102
+            { required: true, message: '请选择日期', trigger: 'blur' }
103 103
           ],
104 104
           endDate: [
105 105
             { type: 'date', required: true, message: '请选择时间', trigger: 'change' }
106 106
           ],
107 107
           address: [
108
-            {  required: true, message: '请输入活动地点', trigger: 'change' }
108
+            {  required: true, message: '请输入活动地点', trigger: 'blur' }
109 109
           ],
110 110
           personNum: [
111
-            { required: true, message: '请输入活动人数', trigger: 'change' }
111
+            { required: true, message: '请输入活动人数', trigger: 'blur' }
112 112
           ],
113 113
           desc: [
114 114
             { required: true, message: ' ', trigger: 'blur' }

+ 12
- 13
src/views/activity/list.vue 查看文件

@@ -65,11 +65,10 @@
65 65
       fixed="right"
66 66
       label="操作">
67 67
       <template slot-scope="scope">
68
-        <!-- <el-button type="text" @click="toDetail(scope.row)" size="small">{{scope.row.status == 1?'停用':'启用'}}</el-button> -->
69
-         <el-button type="text" @click="getSignList(scope.row.dynamicId)" size="small" v-if="scope.row.isEnlist == '1' || scope.row.isEnlist === '2'">报名记录</el-button>
70
-         <el-button type="text" @click="toDetail(scope.row.dynamicId)" size="small" v-if="scope.row.isEnlist == '0'">编辑</el-button>
71
-        <el-button type="text" @click="finish(scope.row.dynamicId)" size="small" v-if="scope.row.isEnlist == '1'">结束活动</el-button>
72
-        <el-button type="text" @click="top(scope.row.dynamicId)" size="small">置顶</el-button>
68
+        <el-button type="text" @click="getSignList(scope.row.dynamicId)" size="small" v-if="scope.row.isEnlist == '1' || scope.row.isEnlist === '2'">报名记录</el-button>
69
+        <el-button type="text" @click="toDetail(scope.row.dynamicId)" size="small">编辑</el-button>
70
+        <el-button type="text" @click="finish(scope.row.dynamicId)" size="small">结束活动</el-button>
71
+        <!-- <el-button type="text" @click="top(scope.row.dynamicId)" size="small">置顶</el-button> -->
73 72
       </template>
74 73
     </el-table-column>
75 74
   </el-table>
@@ -163,14 +162,14 @@ export default {
163 162
         });
164 163
     },
165 164
     top(id){
166
-          this.filterData.dynamicId = id
167
-          this.filterData.top = 1
168
-          this.finishActivity(
169
-          JSON.stringify(this.filterData)
170
-        ).then((res) => {
171
-           this.getList();
172
-          this.getBuildList()   
173
-        })  
165
+        //   this.filterData.dynamicId = id
166
+        //   this.filterData.top = 1
167
+        //   this.finishActivity(
168
+        //   JSON.stringify(this.filterData)
169
+        // ).then((res) => {
170
+        //    this.getList();
171
+        //   this.getBuildList()   
172
+        // })
174 173
     },
175 174
     addDynamic() {
176 175
       this.$router.push({ name: "activity-add" });

+ 24
- 16
src/views/carouselFigure/advertisementEdit.vue 查看文件

@@ -13,6 +13,7 @@
13 13
       </el-form-item>
14 14
       <el-form-item label="主图:">
15 15
         <el-upload
16
+                class="avatar-uploader"
16 17
                 :headers="uploadHeaders"
17 18
                 :action="upFileUrl"
18 19
                 :show-file-list="false"
@@ -105,7 +106,7 @@
105 106
           content: '',
106 107
           status: 0,
107 108
           targetId: '',
108
-          showType: 'banner'
109
+          showType: 'screen'
109 110
         },
110 111
         imageUrl: '',
111 112
         buildingList: [], // 所属项目
@@ -417,14 +418,16 @@
417 418
           this.form = res
418 419
           this.imageUrl = res.image
419 420
           this.showPlace = res.targetName
420
-        }).catch(() => {
421
+        }).catch((err) => {
422
+          this.$notify.error(err.msg || err.message);
421 423
           console.log('carouselFigure/getByIdExtendContent err')
422 424
         })
423 425
       },
424 426
       getBuildList() {
425 427
         this.$store.dispatch('building/getBuildings', this.buildingForm).then((res) => {
426 428
           this.buildingList = res.records
427
-        }).catch(() => {
429
+        }).catch((err) => {
430
+          this.$notify.error(err.msg || err.message);
428 431
           console.log('building/getBuildings err')
429 432
         })
430 433
       },
@@ -453,8 +456,8 @@
453 456
           this.$store.dispatch('carouselFigure/addExtendContent', this.form).then((res) => {
454 457
             this.$message.success('操作成功')
455 458
             this.$router.go(-1)
456
-          }).catch(() => {
457
-
459
+          }).catch((err) => {
460
+            this.$notify.error(err.msg || err.message);
458 461
           })
459 462
           return
460 463
         }
@@ -463,7 +466,8 @@
463 466
         this.$store.dispatch('carouselFigure/updateExtendContent', this.form).then((res) => {
464 467
           this.$message.success('操作成功')
465 468
           this.$router.go(-1)
466
-        }).catch(() => {
469
+        }).catch((err) => {
470
+          this.$notify.error(err.msg || err.message);
467 471
           console.log('carouselFigure/updateExtendContent err')
468 472
         })
469 473
       },
@@ -479,15 +483,7 @@
479 483
   };
480 484
 </script>
481 485
 
482
-<style lang="scss">
483
-  .header {
484
-    width: 50px;
485
-    height: 50px;
486
-    img {
487
-      width: 100%;
488
-      height: 100%;
489
-    }
490
-  }
486
+<style scoped>
491 487
   .avatar-uploader .el-upload {
492 488
     border: 1px dashed #d9d9d9;
493 489
     border-radius: 6px;
@@ -496,7 +492,7 @@
496 492
     overflow: hidden;
497 493
   }
498 494
   .avatar-uploader .el-upload:hover {
499
-    border-color: #409eff;
495
+    border-color: #409EFF;
500 496
   }
501 497
   .avatar-uploader-icon {
502 498
     font-size: 28px;
@@ -511,6 +507,18 @@
511 507
     height: 178px;
512 508
     display: block;
513 509
   }
510
+
511
+</style>
512
+
513
+<style lang="scss">
514
+  .header {
515
+    width: 50px;
516
+    height: 50px;
517
+    img {
518
+      width: 100%;
519
+      height: 100%;
520
+    }
521
+  }
514 522
   .edit-carousel {
515 523
     .el-select {
516 524
       max-width: 300px !important;

+ 37
- 29
src/views/carouselFigure/edit.vue 查看文件

@@ -13,6 +13,7 @@
13 13
         </el-form-item>
14 14
         <el-form-item label="主图:">
15 15
           <el-upload
16
+                  class="avatar-uploader"
16 17
                   :headers="uploadHeaders"
17 18
                   :action="upFileUrl"
18 19
                   :show-file-list="false"
@@ -417,14 +418,16 @@ export default {
417 418
         this.form = res
418 419
         this.imageUrl = res.image
419 420
         this.showPlace = res.targetName
420
-      }).catch(() => {
421
+      }).catch((err) => {
422
+        this.$notify.error(err.msg || err.message);
421 423
         console.log('carouselFigure/getByIdExtendContent err')
422 424
       })
423 425
     },
424 426
     getBuildList() {
425 427
       this.$store.dispatch('building/getBuildings', this.buildingForm).then((res) => {
426 428
         this.buildingList = res.records
427
-      }).catch(() => {
429
+      }).catch((err) => {
430
+        this.$notify.error(err.msg || err.message);
428 431
         console.log('building/getBuildings err')
429 432
       })
430 433
     },
@@ -453,8 +456,8 @@ export default {
453 456
         this.$store.dispatch('carouselFigure/addExtendContent', this.form).then((res) => {
454 457
           this.$message.success('操作成功')
455 458
           this.$router.go(-1)
456
-        }).catch(() => {
457
-
459
+        }).catch((err) => {
460
+          this.$notify.error(err.msg || err.message);
458 461
         })
459 462
         return
460 463
       }
@@ -463,7 +466,8 @@ export default {
463 466
       this.$store.dispatch('carouselFigure/updateExtendContent', this.form).then((res) => {
464 467
         this.$message.success('操作成功')
465 468
         this.$router.go(-1)
466
-      }).catch(() => {
469
+      }).catch((err) => {
470
+        this.$notify.error(err.msg || err.message);
467 471
         console.log('carouselFigure/updateExtendContent err')
468 472
       })
469 473
     },
@@ -479,7 +483,34 @@ export default {
479 483
 };
480 484
 </script>
481 485
 
482
-<style lang="scss">
486
+<style lang="scss" scoped>
487
+  .avatar-uploader .el-upload {
488
+    border: 1px dashed #d9d9d9;
489
+    border-radius: 6px;
490
+    cursor: pointer;
491
+    position: relative;
492
+    overflow: hidden;
493
+  }
494
+  .avatar-uploader .el-upload:hover {
495
+    border-color: #409EFF;
496
+  }
497
+  .avatar-uploader-icon {
498
+    font-size: 28px;
499
+    color: #8c939d;
500
+    width: 178px;
501
+    height: 178px;
502
+    line-height: 178px;
503
+    text-align: center;
504
+  }
505
+  .avatar {
506
+    width: 178px;
507
+    height: 178px;
508
+    display: block;
509
+  }
510
+
511
+</style>
512
+
513
+<style lang="scss" scoped>
483 514
 .header {
484 515
   width: 50px;
485 516
   height: 50px;
@@ -488,29 +519,6 @@ export default {
488 519
     height: 100%;
489 520
   }
490 521
 }
491
-.avatar-uploader .el-upload {
492
-  border: 1px dashed #d9d9d9;
493
-  border-radius: 6px;
494
-  cursor: pointer;
495
-  position: relative;
496
-  overflow: hidden;
497
-}
498
-.avatar-uploader .el-upload:hover {
499
-  border-color: #409eff;
500
-}
501
-.avatar-uploader-icon {
502
-  font-size: 28px;
503
-  color: #8c939d;
504
-  width: 178px;
505
-  height: 178px;
506
-  line-height: 178px;
507
-  text-align: center;
508
-}
509
-.avatar {
510
-  width: 178px;
511
-  height: 178px;
512
-  display: block;
513
-}
514 522
 .edit-carousel {
515 523
   .el-select {
516 524
     max-width: 300px !important;

+ 9
- 3
src/views/consultant/edit.vue 查看文件

@@ -18,7 +18,7 @@
18 18
           <el-input v-model="detail.tel"></el-input>
19 19
         </el-form-item>
20 20
         <el-form-item label="标签:">
21
-          <el-input v-model="detail.tag"></el-input>
21
+          <editabel-tag v-model="detail.personTags"></editabel-tag>
22 22
         </el-form-item>
23 23
         <el-form-item label="地址:">
24 24
           <el-input v-model="detail.address"></el-input>
@@ -64,6 +64,9 @@ const {
64 64
 } = createNamespacedHelpers("building");
65 65
 export default {
66 66
   name: "consultantEdit",
67
+  components: {
68
+    EditabelTag: () => import('@/components/EditableTag.vue')
69
+  },
67 70
   data() {
68 71
     return {
69 72
       upFileUrl: apis.file.upload.url,
@@ -75,7 +78,7 @@ export default {
75 78
         tel: undefined,
76 79
         photo: undefined,
77 80
         status: 1,
78
-        buildings: []
81
+        buildings: undefined,
79 82
       }
80 83
     };
81 84
   },
@@ -93,7 +96,10 @@ export default {
93 96
     init() {
94 97
       if (this.$route.params.id) {
95 98
         this.getConsultant({ id: this.$route.params.id }).then(data => {
96
-          this.detail = data;
99
+          this.detail = {
100
+            ...data,
101
+            buildings: Array.isArray(data.projects) ? data.projects[0] : '',
102
+          };
97 103
         });
98 104
       }
99 105
     },

+ 53
- 28
src/views/customer/customerDetails.vue 查看文件

@@ -5,14 +5,17 @@
5 5
         <div class="grid-content">
6 6
           <p class="title">置业顾问信息</p>
7 7
           <img class="touxiang" src="http://img1.imgtn.bdimg.com/it/u=1022041283,4133755956&fm=26&gp=0.jpg" alt="">
8
-          <p class="name">曹玉文</p>
9
-          <p class="phone">13706842514</p>
8
+          <p class="name">{{  customerDetail.consultant === null ? '' :  customerDetail.consultant.name }}</p>
9
+          <p class="phone">{{ customerDetail.consultant === null ? '' :  customerDetail.consultant.phone }}</p>
10 10
           <div class="info">
11
-            <p>部门:营销部</p>
12
-            <p>岗位:置业经理</p>
13
-            <p>公司:南京知与行网络科技有限公司</p>
11
+            <p>部门:{{ customerDetail.consultant === null ? '' :  customerDetail.consultant.department }}</p>
12
+            <p>岗位:{{ customerDetail.consultant === null ? '' :  customerDetail.consultant.post }}</p>
13
+            <p>公司:{{ customerDetail.consultant === null ? '' :  customerDetail.consultant.company }}</p>
14 14
           </div>
15
-          <p class="project">所属项目:香颂.蔚澜半岛</p>
15
+          <p class="project">所属项目:
16
+            <span v-if="customerDetail.consultant === null"></span>
17
+            <span v-else v-for="(item, index) in customerDetail.consultant.projects" :key="index">{{ item }}</span>
18
+          </p>
16 19
         </div>
17 20
       </el-col>
18 21
       <el-col :span="15">
@@ -21,32 +24,32 @@
21 24
           <div style="display:flex">
22 25
             <img class="touxiang" src="http://img1.imgtn.bdimg.com/it/u=1022041283,4133755956&fm=26&gp=0.jpg" alt="">
23 26
             <div style="width:100%">
24
-              <p class="info-box">用户名称:<span>曹建芳</span></p>
25
-              <p class="info-box">国家:<span>中国</span></p>
26
-              <p class="info-box">手机号:<span>184521462130</span></p>
27
-              <p class="info-box">省份:<span>江苏</span></p>
27
+              <p class="info-box">用户名称:<span>{{ customerDetail.name }}</span></p>
28
+              <p class="info-box">国家:<span>{{ customerDetail.country }}</span></p>
29
+              <p class="info-box">手机号:<span>{{ customerDetail.phone }}</span></p>
30
+              <p class="info-box">省份:<span>{{ customerDetail.province }}</span></p>
28 31
             </div>       
29 32
           </div>
30 33
           <div class="other-info">
31
-              <p class="info-box">访问时长:<span>20分30秒 在线</span></p>
32
-              <p class="info-box">城市:<span>苏州</span></p>
33
-              <p class="info-box">访问次数:<span>20次</span></p>
34
+              <p class="info-box">访问时长:<span>{{ customerDetail.duration / 60 }} 分钟</span></p>
35
+              <p class="info-box">城市:<span>{{ customerDetail.city }}</span></p>
36
+              <p class="info-box">访问次数:<span>{{ customerDetail.visitTimes }}</span></p>
34 37
               <p class="info-box">来访渠道:<span>活动分享</span></p>
35
-              <p class="info-box">首次访问时间:<span>2019-07-23 12:23:49</span></p>
38
+              <p class="info-box">首次访问时间:<span>{{ formateDate(customerDetail.visitTime) }}</span></p>
36 39
           </div>
37 40
           <p style="line-height:1.8">详细信息:</p>
38 41
           <div class="flex-box" style="display:flex;justify-content: space-between;">
39
-            <p>意向项目:<span>香颂.蔚澜半岛、碧桂园</span></p>
40
-            <p>需求类型:<span>高层</span></p>
41
-            <p>物业类型:<span>物业</span></p>
42
+            <p>意向项目:<span>{{ customerDetail.intention }}</span></p>
43
+            <p>需求类型:<span>{{ customerDetail.demandType }}</span></p>
44
+            <p>物业类型:<span>{{ customerDetail.realtyManageType }}</span></p>
42 45
           </div>
43 46
           <div class="flex-box" style="display:flex;justify-content: space-between;">
44
-            <p>价格区间:<span>100-200万</span></p>
45
-            <p>预约到访时间:<span>2019-07-23 12:59:14</span></p>
46
-            <p>预约人数:<span>2</span></p>
47
+            <p>价格区间:<span>{{ customerDetail.priceRange }}</span></p>
48
+            <p>预约到访时间:<span>{{ formateDate(customerDetail.appointmentTime) }}</span></p>
49
+            <p>预约人数:<span>{{ customerDetail.visiteNum }}</span></p>
47 50
           </div>
48
-          <p class="flex-box">客户说明:<span>客户说明展示处</span></p>
49
-          <p class="flex-box">客户描述:<span>客户描述展示处</span></p>
51
+          <p class="flex-box">客户说明:<span>{{ customerDetail.verifyRemark }}</span></p>
52
+          <p class="flex-box">客户描述:<span>{{ customerDetail.describe }}</span></p>
50 53
           
51 54
         </div>
52 55
       </el-col>
@@ -54,20 +57,22 @@
54 57
     <div class="access-records">
55 58
       <p class="title">访问记录</p>
56 59
       <el-table
57
-      :data="tableData"
60
+      :data="customerDetail.visitRecords || []"
58 61
       class="table-box"
59 62
       style="width: 100%;">
60 63
       <el-table-column
61
-        prop="name"
64
+        prop="event"
62 65
         label="访问事件">
63 66
       </el-table-column>
64 67
       <el-table-column
65
-        prop="date"
68
+        prop="visitTime"
66 69
         label="访问时间">
70
+        <template slot-scope="scope">{{ formateDate(scope.row.visitTime) }}</template>
67 71
       </el-table-column>
68 72
       <el-table-column
69
-        prop="time"
73
+        prop="visitDuration"
70 74
         label="停留时间">
75
+        <template slot-scope="scope">{{ scope.row.visitDuration / 60 }}分钟</template>
71 76
       </el-table-column>
72 77
     </el-table>
73 78
     </div>
@@ -76,11 +81,14 @@
76 81
 </template>
77 82
 
78 83
 <script>
79
-import { createNamespacedHelpers } from "vuex";
84
+import { createNamespacedHelpers } from "vuex"
85
+import dayjs from 'dayjs'
80 86
 
81 87
 export default {
82 88
   data() {
83 89
     return {
90
+      customerId: '',
91
+      customerDetail: '',
84 92
       tableData: [
85 93
         {
86 94
           date: "2016-05-02",
@@ -106,7 +114,24 @@ export default {
106 114
     };
107 115
   },
108 116
   computed: {},
109
-  created() {}
117
+  methods: {
118
+    formateDate(dt) {
119
+      return !dt ? '' : dayjs(dt).format('YYYY-MM-DD HH:mm')
120
+    },
121
+    getCustomerDetail() {
122
+      let data = { customerId: this.customerId }
123
+      this.$store.dispatch('customer/getCustomerDetail',data).then((res) => {
124
+        this.customerDetail = res
125
+        console.log('customer/getCustomerDetail: ', this.customerDetail)
126
+      }).catch(() => {
127
+        console.log('customer/getCustomerDetail err')
128
+      })
129
+    }
130
+  },
131
+  created() {
132
+    this.customerId = this.$route.query.id
133
+    this.getCustomerDetail()
134
+  }
110 135
 };
111 136
 </script>
112 137
 <style lang="scss">

+ 7
- 3
src/views/customer/editCustomer.vue 查看文件

@@ -7,6 +7,7 @@
7 7
         </el-form-item>
8 8
         <el-form-item label="客户照片:">
9 9
           <el-upload
10
+                  class="avatar-uploader"
10 11
                   :headers="uploadHeaders"
11 12
                   :action="upFileUrl"
12 13
                   :show-file-list="false"
@@ -154,6 +155,8 @@
154 155
             this.detail = data;
155 156
             this.dialogImageUrl = data.picture
156 157
             this.imageUrl = data.picture
158
+          }).catch((err) => {
159
+            this.$notify.error(err.msg || err.message);
157 160
           });
158 161
         }
159 162
       },
@@ -219,7 +222,7 @@
219 222
                 })
220 223
                 .catch(err => {
221 224
                   this.hideLoadding();
222
-                  this.$notify.error(err.message);
225
+                  this.$notify.error(err.msg || err.message);
223 226
                 });
224 227
       },
225 228
 
@@ -241,7 +244,8 @@
241 244
           this.dialogForm.pageNumber = res.current
242 245
           this.dialogForm.pageSize = res.size
243 246
           this.dialogTotal = res.total
244
-        }).catch(()=> {
247
+        }).catch((err)=> {
248
+          this.$notify.error(err.msg || err.message);
245 249
           console.log('persons/getConsultants err')
246 250
         })
247 251
       },
@@ -263,7 +267,7 @@
263 267
   }
264 268
 </style>
265 269
 
266
-<style lang="scss">
270
+<style lang="scss" >
267 271
   .avatar-uploader .el-upload {
268 272
     border: 1px dashed #d9d9d9;
269 273
     border-radius: 6px;

+ 10
- 6
src/views/customer/editRecommend.vue 查看文件

@@ -7,6 +7,7 @@
7 7
         </el-form-item>
8 8
         <el-form-item label="客户照片:">
9 9
           <el-upload
10
+                  class="avatar-uploader"
10 11
                   :headers="uploadHeaders"
11 12
                   :action="upFileUrl"
12 13
                   :show-file-list="false"
@@ -175,6 +176,8 @@ export default {
175 176
           this.detail = data;
176 177
           this.dialogImageUrl = data.picture
177 178
           this.imageUrl = data.picture
179
+        }).catch((err) => {
180
+          this.$notify.error(err.msg || err.message);
178 181
         });
179 182
       }
180 183
     },
@@ -240,7 +243,7 @@ export default {
240 243
         })
241 244
         .catch(err => {
242 245
           this.hideLoadding();
243
-          this.$notify.error(err.message);
246
+          this.$notify.error(err.msg || err.message);
244 247
         });
245 248
     },
246 249
 
@@ -262,7 +265,8 @@ export default {
262 265
         this.dialogForm.pageNumber = res.current
263 266
         this.dialogForm.pageSize = res.size
264 267
         this.dialogTotal = res.total
265
-      }).catch(()=> {
268
+      }).catch((err)=> {
269
+        this.$notify.error(err.msg || err.message);
266 270
         console.log('persons/getConsultants err')
267 271
       })
268 272
     },
@@ -282,6 +286,10 @@ export default {
282 286
 .form-wrapper {
283 287
   width: 60%;
284 288
 }
289
+.choose {
290
+  color: blue;
291
+  margin-left: 15px;
292
+}
285 293
 </style>
286 294
 
287 295
 <style lang="scss">
@@ -308,8 +316,4 @@ export default {
308 316
   height: 178px;
309 317
   display: block;
310 318
 }
311
-.choose {
312
-  color: blue;
313
-  margin-left: 15px;
314
-}
315 319
 </style>

+ 14
- 52
src/views/index.js 查看文件

@@ -39,35 +39,6 @@ const pages = [
39 39
       },
40 40
     ]
41 41
   },
42
-  {
43
-    path: 'project',
44
-    name: 'project',
45
-    component: () => import('./index.vue'),
46
-    meta: {
47
-      menuShow: true,
48
-      title: '项目管理',
49
-    },
50
-    children: [
51
-      {
52
-        path: 'project',
53
-        name: 'project.list',
54
-        component: () => import('./project/list.vue'),
55
-        meta: {
56
-          menuShow: true,
57
-          title: '项目列表',
58
-        },
59
-      },
60
-      {
61
-        path: 'project/edit',
62
-        name: 'projectedit',
63
-        component: () => import('./project/edit.vue'),
64
-        meta: {
65
-          menuShow: false,
66
-          title: '项目编辑',
67
-        },
68
-      },
69
-    ]
70
-  },
71 42
   {
72 43
     path: 'activity',
73 44
     name: 'activity',
@@ -124,24 +95,6 @@ const pages = [
124 95
       title: '楼盘设置',
125 96
     },
126 97
     children: [
127
-      {
128
-        path: 'dynamic',
129
-        name: 'dynamiclist',
130
-        component: () => import('./dynamic/list.vue'),
131
-        meta: {
132
-          menuShow: true,
133
-          title: '项目动态列表',
134
-        },
135
-      },
136
-      {
137
-        path: 'dynamic/edit',
138
-        name: 'dynamicedit',
139
-        component: () => import('./dynamic/edit.vue'),
140
-        meta: {
141
-          menuShow: false,
142
-          title: '项目动态编辑',
143
-        },
144
-      },
145 98
       {
146 99
         path: 'buildinglist',
147 100
         name: 'buildinglist',
@@ -304,6 +257,15 @@ const pages = [
304 257
           title: '关键字维护',
305 258
         },
306 259
       },
260
+      {
261
+        path: 'message',
262
+        name: 'message',
263
+        component: () => import('./systemManagement/message.vue'),
264
+        meta: {
265
+          menuShow: true,
266
+          title: '客户留言',
267
+        },
268
+      },
307 269
     ]
308 270
   },
309 271
   {
@@ -312,7 +274,7 @@ const pages = [
312 274
     component: () => import('./index.vue'),
313 275
     meta: {
314 276
       menuShow: true,
315
-      title: '资管理',
277
+      title: '资管理',
316 278
     },
317 279
     children: [
318 280
       {
@@ -321,7 +283,7 @@ const pages = [
321 283
         component: () => import('./news/type/index.vue'),
322 284
         meta: {
323 285
           menuShow: true,
324
-          title: '资类型',
286
+          title: '资类型',
325 287
         },
326 288
       },
327 289
       {
@@ -330,7 +292,7 @@ const pages = [
330 292
         component: () => import('./news/type/edi/index.vue'),
331 293
         meta: {
332 294
           menuShow: false,
333
-          title: '编辑资类型',
295
+          title: '编辑资类型',
334 296
         },
335 297
       },
336 298
       {
@@ -339,7 +301,7 @@ const pages = [
339 301
         component: () => import('./news/index.vue'),
340 302
         meta: {
341 303
           menuShow: true,
342
-          title: '资列表',
304
+          title: '资列表',
343 305
         },
344 306
       },
345 307
       {
@@ -348,7 +310,7 @@ const pages = [
348 310
         component: () => import('./news/edi/index.vue'),
349 311
         meta: {
350 312
           menuShow: false,
351
-          title: '编辑资',
313
+          title: '编辑资',
352 314
         },
353 315
       },
354 316
     ]

+ 13
- 13
src/views/news/edi/index.vue 查看文件

@@ -12,8 +12,8 @@
12 12
                 </el-select>
13 13
             </el-form-item>
14 14
             <el-form-item label="资讯图片">
15
-<!--                class="avatar-uploader"-->
16 15
                 <el-upload
16
+                        class="avatar-uploader"
17 17
                         :headers="uploadHeaders"
18 18
                         :action="upFileUrl"
19 19
                         :show-file-list="false"
@@ -36,7 +36,7 @@
36 36
                 </el-select>
37 37
             </el-form-item>
38 38
             <el-form-item label="资讯详情">
39
-                <my-wangeditor :content="form.newsDetail" @get-content="getEdiCentent"></my-wangeditor>
39
+                <rich-editor v-model="form.newsDetail" style="height: 400px; width: 1000px;" />
40 40
             </el-form-item>
41 41
             <el-form-item label="状态">
42 42
                 <el-select v-model="form.newsStatus" placeholder="请选择">
@@ -134,14 +134,16 @@
134 134
             getTypeList() {
135 135
                 this.$store.dispatch('news/getTypeList', this.typeForm).then((res) => {
136 136
                     this.typeList = res.records
137
-                }).catch(() => {
137
+                }).catch((err) => {
138
+                    this.$notify.error(err.msg || err.message);
138 139
                     console.log('news/getTypeList err')
139 140
                 })
140 141
             },
141 142
             getBuildList() {
142 143
                 this.$store.dispatch('building/getBuildings', this.buildingForm).then((res) => {
143 144
                     this.buildingList = res.records
144
-                }).catch(() => {
145
+                }).catch((err) => {
146
+                    this.$notify.error(err.msg || err.message);
145 147
                     console.log('building/getBuildings err')
146 148
                 })
147 149
             },
@@ -151,7 +153,8 @@
151 153
                         this.$message.success('操作成功!')
152 154
                         this.$router.go(-1)
153 155
                         // console.log(res)
154
-                    }).catch(() => {
156
+                    }).catch((err) => {
157
+                        this.$notify.error(err.msg || err.message);
155 158
                         console.log('news/add err')
156 159
                     })
157 160
 
@@ -163,7 +166,8 @@
163 166
                     this.$message.success('操作成功!')
164 167
                     this.$router.go(-1)
165 168
                     // console.log(res)
166
-                }).catch(() => {
169
+                }).catch((err) => {
170
+                    this.$notify.error(err.msg || err.message);
167 171
                     console.log('news/update err')
168 172
                 })
169 173
 
@@ -181,7 +185,8 @@
181 185
                     this.imageUrl = res.newsImg
182 186
                     this.form.buildingId = res.buildingId
183 187
                     this.form.newsDetail = res.newsDetail
184
-                }).catch(() => {
188
+                }).catch((err) => {
189
+                    this.$notify.error(err.msg || err.message);
185 190
                     console.log('news/getById err')
186 191
                 })
187 192
             }
@@ -189,7 +194,7 @@
189 194
     }
190 195
 </script>
191 196
 
192
-<style scoped>
197
+<style lang="scss">
193 198
     .avatar-uploader .el-upload {
194 199
         border: 1px dashed #d9d9d9;
195 200
         border-radius: 6px;
@@ -213,9 +218,4 @@
213 218
         height: 178px;
214 219
         display: block;
215 220
     }
216
-    .form {
217
-        width: 800px;
218
-        margin-left: auto;
219
-        margin-right: auto;
220
-    }
221 221
 </style>

+ 21
- 8
src/views/news/type/edi/index.vue 查看文件

@@ -14,6 +14,7 @@
14 14
             <el-form-item label="图片">
15 15
 <!--                class="avatar-uploader"-->
16 16
                 <el-upload
17
+                        class="avatar-uploader"
17 18
                         :headers="uploadHeaders"
18 19
                         :action="upFileUrl"
19 20
                         :show-file-list="false"
@@ -75,6 +76,15 @@
75 76
                 // console.log(res)
76 77
                 this.form.newsTypeImg = res.data
77 78
             },
79
+            beforeImgUpload(file) {
80
+                if (file.type !== "image/jpeg" && file.type !== "image/png") {
81
+                    this.$message.error("上传图片只能是 JPG 或 PNG 格式!");
82
+                    return false;
83
+                }
84
+
85
+                this.showLoadding("上传中...");
86
+                return true;
87
+            },
78 88
             getBuildList() {
79 89
                 this.$store.dispatch('building/getBuildings', this.buildingForm).then((res) => {
80 90
                     this.buildingList = res.records
@@ -88,7 +98,8 @@
88 98
                         this.$message.success('操作成功!')
89 99
                         this.$router.go(-1)
90 100
                         // console.log(res)
91
-                    }).catch(() => {
101
+                    }).catch((err) => {
102
+                        this.$notify.error(err.msg || err.message);
92 103
                         console.log('news/addType err')
93 104
                     })
94 105
 
@@ -117,11 +128,17 @@
117 128
                 }).catch(() => {
118 129
                     console.log('news/getTypeById err')
119 130
                 })
120
-            }
131
+            },
121 132
         }
122 133
     }
123 134
 </script>
124
-
135
+<style lang="scss" scoped>
136
+.form {
137
+    width: 300px;
138
+    margin-left: auto;
139
+    margin-right: auto;
140
+}
141
+</style>
125 142
 <style scoped>
126 143
     .avatar-uploader .el-upload {
127 144
         border: 1px dashed #d9d9d9;
@@ -146,9 +163,5 @@
146 163
         height: 178px;
147 164
         display: block;
148 165
     }
149
-    .form {
150
-        width: 300px;
151
-        margin-left: auto;
152
-        margin-right: auto;
153
-    }
166
+
154 167
 </style>

+ 187
- 0
src/views/systemManagement/message.vue 查看文件

@@ -0,0 +1,187 @@
1
+<template>
2
+<div class="list">
3
+        <div class="system-table-search">
4
+      <!-- <div class="flex-h">
5
+        <div class="flex-item flex-h">
6
+          <el-button size="mini" type="success" @click='addGoods'>新增</el-button>
7
+        </div>
8
+        <ul>
9
+          <li>
10
+            <el-input v-model="filterData.goodsName" placeholder="商品名称"></el-input>
11
+          </li>
12
+
13
+        </ul>
14
+        <el-button
15
+          size="mini"
16
+          type="primary" @click="search">查询</el-button>
17
+      </div> -->
18
+      <div class="moreFilter"></div>
19
+    </div>
20
+  <el-table
21
+    :data="list || []"
22
+    style="width: 100%">
23
+    <el-table-column
24
+      prop="phone"
25
+      label="电话号码">
26
+    </el-table-column>
27
+    <el-table-column
28
+      prop="message"
29
+      label="留言内容">
30
+    </el-table-column>
31
+    <el-table-column
32
+      label="创建时间">
33
+      <template slot-scope="scope">
34
+          <span>{{formateDate(scope.row.createDate)}}</span>
35
+      </template>
36
+    </el-table-column>
37
+  </el-table>
38
+  <el-pagination
39
+    small
40
+    style="margin-top:10px;"
41
+    layout="prev, pager, next"
42
+    :current-page.sync="pageNavi.current"
43
+    :pageSize="pageNavi.size"
44
+    :total="pageNavi.total || 0"
45
+    @current-change="getList"
46
+  >
47
+  </el-pagination>
48
+</div>
49
+</template>
50
+
51
+<script>
52
+import { createNamespacedHelpers } from "vuex";
53
+import dayjs from 'dayjs'
54
+
55
+const { mapActions: mapMessageActions } = createNamespacedHelpers("message");
56
+
57
+export default {
58
+  name: "goods-list",
59
+  data() {
60
+    return {
61
+      filterData: {
62
+        goodsName: ""
63
+      },
64
+      list: [],
65
+      pageNavi: {
66
+        current: 1,
67
+        size: 20,
68
+        total: 0
69
+      }
70
+    };
71
+  },
72
+  computed: {},
73
+  methods: {
74
+    ...mapMessageActions(["getMessage"]),
75
+    getList() {
76
+      const pageNumber = this.pageNavi.current || 1;
77
+      const pageSize = this.pageNavi.size;
78
+
79
+      this.getMessage({
80
+        ...this.filterData,
81
+        pageNumber,
82
+        pageSize
83
+      })
84
+        .then(res => {
85
+          const { records, ...pageNavi } = res;
86
+
87
+          this.list = records;
88
+          this.pageNavi = pageNavi;
89
+        })
90
+        .catch(err => {
91
+          this.$notify.error(err.msg || err.message);
92
+        });
93
+    },
94
+    addGoods() {
95
+      this.$router.push({ name: "goods.edit" });
96
+    },
97
+    toDetail(row) {
98
+      this.$router.push({
99
+        name: "goods.edit",
100
+        params: { id: row.goodsId }
101
+      });
102
+    },
103
+    changeStatus(row) {
104
+      this.showLoadding("保存中...");
105
+      this.changeGoodsStatus(row)
106
+        .then(res => {
107
+          this.hideLoadding();
108
+          this.$notify.info("保存成功");
109
+          this.search();
110
+        })
111
+        .catch(err => {
112
+          this.hideLoadding();
113
+          this.$notify.error(err.message);
114
+        });
115
+    },
116
+    showLoadding(text) {
117
+      this.loading = this.$loading({
118
+        text,
119
+        lock: true,
120
+        spinner: "el-icon-loading",
121
+        background: "rgba(255, 255, 255, 0.7)"
122
+      });
123
+    },
124
+    hideLoadding() {
125
+      if (this.loading) this.loading.close();
126
+    },
127
+    search() {
128
+      this.pageNavi.current = 1;
129
+      this.getList();
130
+    },
131
+    newPage(page) {
132
+      this.$router.replace({ name: "goods.list", query: { page } });
133
+    },
134
+    formateDate(dt) {
135
+      return !dt ? '' : dayjs(dt).format('YYYY-MM-DD HH:mm')
136
+    },
137
+  },
138
+  created() {
139
+    this.pageNavi.current = this.$route.query.page || 1;
140
+
141
+    this.getList();
142
+  }
143
+};
144
+</script>
145
+
146
+<style lang="scss" scoped>
147
+.list {
148
+  .header {
149
+    width: 50px;
150
+    height: 50px;
151
+    border-radius: 50%;
152
+  }
153
+  img {
154
+      width: 100%;
155
+      height: 100%;
156
+    }
157
+}
158
+.system-table-search {
159
+  width: calc(100% - 40px);
160
+  margin: 20px auto 0;
161
+}
162
+
163
+.system-table-search li {
164
+  margin-right: 20px;
165
+}
166
+
167
+.system-table-search ul {
168
+  font-size: 0;
169
+  white-space: nowrap;
170
+}
171
+
172
+.system-table-search ul > li {
173
+  display: inline-block;
174
+}
175
+
176
+.flex-h {
177
+  display: flex;
178
+  align-items: center;
179
+}
180
+
181
+.flex-item {
182
+  flex: 1;
183
+  -webkit-flex: 1;
184
+  position: relative;
185
+  overflow: hidden;
186
+}
187
+</style>

+ 1
- 1
vue.config.js 查看文件

@@ -5,7 +5,7 @@ module.exports = {
5 5
     proxy: {
6 6
       '/api': {
7 7
         // target: 'http://192.168.0.11:8080',
8
-        target: 'http://192.168.0.131:8080',
8
+        target: 'http://localhost:8080',
9 9
         changeOrigin: true,
10 10
         // pathRewrite: {
11 11
         //   '^/api': '/'