Merge branch 'feature/feedback' into 'release/3.1'
Feature/feedback feedback See merge request !43
Showing
13 changed files
with
947 additions
and
4 deletions
1 | <template> | 1 | <template> |
2 | <div class="cell-info"> | 2 | <div class="cell-info"> |
3 | <p v-for="item in items"> | 3 | <p v-for="item in items"> |
4 | - {{item.label}}:{{item.value}} | 4 | + <span v-if="item.type === 'string' || !item.type">{{item.label}}:{{item.value}}</span> |
5 | + <a v-if="item.type == 'link'" :href="item.value" target = '_blank' >{{item.label}}</a> | ||
5 | </p> | 6 | </p> |
6 | </div> | 7 | </div> |
7 | </template> | 8 | </template> |
@@ -15,11 +16,18 @@ | @@ -15,11 +16,18 @@ | ||
15 | } | 16 | } |
16 | } | 17 | } |
17 | }; | 18 | }; |
19 | + | ||
18 | </script> | 20 | </script> |
19 | 21 | ||
20 | <style lang="scss" scoped> | 22 | <style lang="scss" scoped> |
21 | .cell-info { | 23 | .cell-info { |
22 | text-align: left; | 24 | text-align: left; |
23 | padding: 10px; | 25 | padding: 10px; |
26 | + | ||
27 | + a { | ||
28 | + display: block; | ||
29 | + text-decoration: underline; | ||
30 | + color: #999; | ||
31 | + } | ||
24 | } | 32 | } |
25 | </style> | 33 | </style> |
1 | +<template> | ||
2 | + <Modal | ||
3 | + class-name="vertical-center-modal" | ||
4 | + width="500" | ||
5 | + v-model="model"> | ||
6 | + <p slot="header"> | ||
7 | + 咨询回复 | ||
8 | + </p> | ||
9 | + <div style="text-align: center"> | ||
10 | + <filter-item> | ||
11 | + <Input | ||
12 | + type = "textarea" | ||
13 | + :rows = "10" | ||
14 | + placeholder="请输入文字内容" | ||
15 | + v-model="answer" | ||
16 | + @on-enter="submit"/> | ||
17 | + </filter-item> | ||
18 | + </div> | ||
19 | + | ||
20 | + <div slot="footer" style="text-align: center"> | ||
21 | + <Button type="primary" size="large" :loading="modal_loading" @click="submit">回复</Button> | ||
22 | + <Button type="default" size="large" @click="cancel">取消</Button> | ||
23 | + </div> | ||
24 | + </Modal> | ||
25 | +</template> | ||
26 | + | ||
27 | +<script> | ||
28 | + | ||
29 | +import FeedbackService from 'services/product/feedback-service'; | ||
30 | + | ||
31 | +export default { | ||
32 | + name: 'modal-answer-edit', | ||
33 | + created() { | ||
34 | + this.feedbackService = new FeedbackService(); | ||
35 | + }, | ||
36 | + data() { | ||
37 | + return { | ||
38 | + model: false, | ||
39 | + modal_loading: false, | ||
40 | + userId: '', | ||
41 | + id: '', | ||
42 | + answer: '' | ||
43 | + }; | ||
44 | + }, | ||
45 | + | ||
46 | + methods: { | ||
47 | + show(row) { | ||
48 | + this.reset(); | ||
49 | + this.userId = row.userId; | ||
50 | + this.id = row.id; | ||
51 | + this.answer = row.answer; | ||
52 | + this.model = true; | ||
53 | + }, | ||
54 | + close() { | ||
55 | + this.reset(); | ||
56 | + this.model = false; | ||
57 | + }, | ||
58 | + reset() { | ||
59 | + this.userId = null; | ||
60 | + this.id = null; | ||
61 | + this.answer = null; | ||
62 | + }, | ||
63 | + submit() { | ||
64 | + this.modal_loading = true; | ||
65 | + | ||
66 | + this.submitData().then(() => { | ||
67 | + this.modal_loading = false; | ||
68 | + this.$emit('on-success'); | ||
69 | + this.close(); | ||
70 | + }); | ||
71 | + }, | ||
72 | + cancel() { | ||
73 | + this.close(); | ||
74 | + }, | ||
75 | + submitData() { | ||
76 | + return this.feedbackService.consultReply(this.userId, this.id, this.answer); | ||
77 | + } | ||
78 | + } | ||
79 | +}; | ||
80 | +</script> | ||
81 | + | ||
82 | +<style lang="scss"> | ||
83 | + | ||
84 | +</style> |
app/pages/product/feedback/feedback.vue
0 → 100644
1 | +<template> | ||
2 | + <layout-body> | ||
3 | + <layout-filter> | ||
4 | + <filter-item :label="filters.productSKN.label"> | ||
5 | + <Input v-model.trim="filters.productSKN.model" | ||
6 | + :placeholder="filters.productSKN.holder" :maxlength="9"></Input> | ||
7 | + </filter-item> | ||
8 | + <filter-item :label="filters.prodName.label"> | ||
9 | + <Input v-model.trim="filters.prodName.model" | ||
10 | + :placeholder="filters.prodName.holder"></Input> | ||
11 | + </filter-item> | ||
12 | + <filter-item label="品牌"> | ||
13 | + <select-brand v-model="filters.brandId.model"></select-brand> | ||
14 | + </filter-item> | ||
15 | + <filter-item label="品类"> | ||
16 | + <select-category :value="categoryValue" @select-change="sortChange"></select-category> | ||
17 | + </filter-item> | ||
18 | + <filter-item :label="filters.isReply.label"> | ||
19 | + <Select v-model.trim="filters.isReply.model" clearable> | ||
20 | + <Option v-for="option in filters.isReply.options" | ||
21 | + :value="option.value" | ||
22 | + :key="option.value">{{option.label}}</Option> | ||
23 | + </Select> | ||
24 | + </filter-item> | ||
25 | + <filter-item :label="filters.answerUserName.label"> | ||
26 | + <Input v-model.trim="filters.answerUserName.model" | ||
27 | + :placeholder="filters.answerUserName.holder"></Input> | ||
28 | + </filter-item> | ||
29 | + <filter-item :label="filters.askTimeStr.label"> | ||
30 | + <Date-picker type="datetimerange" | ||
31 | + placeholder="选择日期和时间" | ||
32 | + @on-change="askTimeChange" | ||
33 | + v-model="filters.askTimeStr.model"> | ||
34 | + </Date-picker> | ||
35 | + </filter-item> | ||
36 | + <filter-item :label="filters.answerTimeStr.label"> | ||
37 | + <Date-picker v-model="filters.answerTimeStr.model" | ||
38 | + type="datetimerange" | ||
39 | + placeholder="选择日期和时间" | ||
40 | + @on-change="answerTimeChange"> | ||
41 | + </Date-picker> | ||
42 | + </filter-item> | ||
43 | + | ||
44 | + <filter-item> | ||
45 | + <Button type="primary" @click="list">筛选</Button> | ||
46 | + <Button @click="clearFilters">清空条件</Button> | ||
47 | + </filter-item> | ||
48 | + </layout-filter> | ||
49 | + | ||
50 | + <layout-list> | ||
51 | + <Table border :columns="tableCols" :data="tableData" @on-selection-change="selectChange"></Table> | ||
52 | + <Page :total="pageData.total" | ||
53 | + :current="pageData.current" | ||
54 | + @on-change="pageChange" show-total></Page> | ||
55 | + </layout-list> | ||
56 | + | ||
57 | + <modal-answer-edit ref="showAnswerEdit" @on-success="answerEdit"></modal-answer-edit> | ||
58 | + </layout-body> | ||
59 | +</template> | ||
60 | + | ||
61 | +<script> | ||
62 | + import _ from 'lodash'; | ||
63 | + import moment from 'moment'; | ||
64 | + import feedbackStore from './store'; | ||
65 | + import ModalAnswerEdit from './components/modal-answer-edit.vue'; | ||
66 | + import FeedbackService from 'services/product/feedback-service'; | ||
67 | + | ||
68 | + export default { | ||
69 | + data() { | ||
70 | + return feedbackStore.call(this); | ||
71 | + }, | ||
72 | + created() { | ||
73 | + this.feedbackService = new FeedbackService(); | ||
74 | + }, | ||
75 | + mounted() { | ||
76 | + this.list(); | ||
77 | + }, | ||
78 | + methods: { | ||
79 | + editAnswer(row) { | ||
80 | + this.$refs.showAnswerEdit.show(row); | ||
81 | + }, | ||
82 | + answerEdit() { | ||
83 | + this.list(); | ||
84 | + }, | ||
85 | + clearFilters() { | ||
86 | + this.filters.productSKN.model = null; | ||
87 | + this.filters.prodName.model = null; | ||
88 | + this.filters.answerUserName.model = null; | ||
89 | + this.filters.isReply.model = null; | ||
90 | + this.filters.brandId.model = null; | ||
91 | + this.filters.askStartTime.model = ''; | ||
92 | + this.filters.askEndTime.model = ''; | ||
93 | + this.filters.answerStartTime.model = ''; | ||
94 | + this.filters.answerEndTime.model = ''; | ||
95 | + this.filters.askTimeStr.model = ''; | ||
96 | + this.filters.answerTimeStr.model = ''; | ||
97 | + this.pageData.current = 1; | ||
98 | + | ||
99 | + this.list(); | ||
100 | + }, | ||
101 | + pageChange(page) { | ||
102 | + this.pageData.current = page; | ||
103 | + this.list(); | ||
104 | + }, | ||
105 | + filtersParams() { | ||
106 | + let params = {}; | ||
107 | + let fts = this.filters; | ||
108 | + let productSKN = fts.productSKN.model, | ||
109 | + productName = fts.prodName.model, | ||
110 | + answerUserName = fts.answerUserName.model, | ||
111 | + isReply = fts.isReply.model, | ||
112 | + maxSortId = fts.sort.first.model, | ||
113 | + middleSortId = fts.sort.second.model, | ||
114 | + smallSortId = fts.sort.third.model, | ||
115 | + brandId = fts.brandId.model === '' || fts.brandId.model === null ? | ||
116 | + null : fts.brandId.model, | ||
117 | + askStartTime = fts.askStartTime.model, | ||
118 | + askEndTime = fts.askEndTime.model, | ||
119 | + answerStartTime = fts.answerStartTime.model, | ||
120 | + answerEndTime = fts.answerEndTime.model; | ||
121 | + | ||
122 | + let page = this.pageData.current; | ||
123 | + let pageSize = this.pageData.pageSize; | ||
124 | + | ||
125 | + if (this.filters.productSKN.model) { | ||
126 | + if (this.isNumber(this.filters.productSKN.model)) { | ||
127 | + params.productSKN = this.filters.productSKN.model; | ||
128 | + } else { | ||
129 | + return Promise.reject('skn必须是数字'); | ||
130 | + } | ||
131 | + } | ||
132 | + | ||
133 | + params.pageSize = this.pageData.pageSize; | ||
134 | + params.page = this.pageData.current; | ||
135 | + | ||
136 | + return Promise.resolve({ | ||
137 | + params, | ||
138 | + productSKN, | ||
139 | + productName, | ||
140 | + answerUserName, | ||
141 | + isReply, | ||
142 | + maxSortId, | ||
143 | + middleSortId, | ||
144 | + smallSortId, | ||
145 | + brandId, | ||
146 | + askStartTime, | ||
147 | + askEndTime, | ||
148 | + answerStartTime, | ||
149 | + answerEndTime, | ||
150 | + page, | ||
151 | + pageSize | ||
152 | + }); | ||
153 | + }, | ||
154 | + list() { | ||
155 | + this.$Loading.start(); | ||
156 | + | ||
157 | + return this.filtersParams().then((params) => { | ||
158 | + function getLocalTime(ns) { | ||
159 | + let date = new Date(ns * 1000); | ||
160 | + let Y = date.getFullYear() + '-'; | ||
161 | + let M = (date.getMonth() + 1 < 10 ? '0' + (date.getMonth() + 1) : date.getMonth() + 1) + '-'; | ||
162 | + let D = (date.getDate() < 10 ? '0' + date.getDate() : date.getDate()) + ' '; | ||
163 | + let h = (date.getHours() < 10 ? '0' + date.getHours() : date.getHours()) + ':'; | ||
164 | + let m = (date.getMinutes() < 10 ? '0' + date.getMinutes() : date.getMinutes()) + ':'; | ||
165 | + let s = date.getSeconds() < 10 ? '0' + date.getSeconds() : date.getSeconds(); | ||
166 | + | ||
167 | + return Y + M + D + h + m + s; | ||
168 | + } | ||
169 | + | ||
170 | + if (params) { | ||
171 | + params.askStartTime = params.askStartTime ? getLocalTime(params.askStartTime) : null; | ||
172 | + params.askEndTime = params.askEndTime ? getLocalTime(params.askEndTime) : null; | ||
173 | + params.answerStartTime = params.answerStartTime ? getLocalTime(params.answerStartTime) : null; | ||
174 | + params.answerEndTime = params.answerEndTime ? getLocalTime(params.answerEndTime) : null; | ||
175 | + } | ||
176 | + | ||
177 | + return this.feedbackService.list(params); | ||
178 | + }).then((result) => { | ||
179 | + if (result.code === 200) { | ||
180 | + this.pageData.total = result.data.total; | ||
181 | + this.pageData.current = result.data.page; | ||
182 | + this.tableData = result.data.list; | ||
183 | + } | ||
184 | + this.$Loading.finish(); | ||
185 | + }).catch((err) => { | ||
186 | + this.$Loading.finish(); | ||
187 | + this.$Message.error(err); | ||
188 | + }); | ||
189 | + }, | ||
190 | + isNumber(numStr) { | ||
191 | + const isNumber = /^[0-9]+$/; | ||
192 | + | ||
193 | + return isNumber.test(numStr); | ||
194 | + }, | ||
195 | + askTimeChange(time) { | ||
196 | + // 兼容: https://github.com/iview/iview/issues/973 | ||
197 | + if (!_.isArray(time)) { | ||
198 | + time = time.split(' - '); | ||
199 | + } | ||
200 | + if ((time[0] + '').length) { | ||
201 | + this.filters.askStartTime.model = +moment(time[0]).format('X'); | ||
202 | + this.filters.askEndTime.model = +moment(time[1]).format('X'); | ||
203 | + } else { | ||
204 | + this.filters.askStartTime.model = ''; | ||
205 | + this.filters.askEndTime.model = ''; | ||
206 | + } | ||
207 | + }, | ||
208 | + answerTimeChange(time) { | ||
209 | + // 兼容: https://github.com/iview/iview/issues/973 | ||
210 | + if (!_.isArray(time)) { | ||
211 | + time = time.split(' - '); | ||
212 | + } | ||
213 | + if ((time[0] + '').length) { | ||
214 | + this.filters.answerStartTime.model = +moment(time[0]).format('X'); | ||
215 | + this.filters.answerEndTime.model = +moment(time[1]).format('X'); | ||
216 | + } | ||
217 | + }, | ||
218 | + sortChange(sort) { | ||
219 | + this.filters.sort.first.model = sort.max; | ||
220 | + this.filters.sort.second.model = sort.mid; | ||
221 | + this.filters.sort.third.model = sort.min; | ||
222 | + } | ||
223 | + }, | ||
224 | + components: { | ||
225 | + ModalAnswerEdit | ||
226 | + } | ||
227 | + }; | ||
228 | +</script> |
app/pages/product/feedback/index.js
0 → 100644
app/pages/product/feedback/store/index.js
0 → 100644
1 | +/** | ||
2 | + * on feedback page store | ||
3 | + * @author: Gexuhui | ||
4 | + * @date: 2017/08/01 | ||
5 | + */ | ||
6 | +import CellInfo from 'components/cell/cell-info'; | ||
7 | + | ||
8 | +export default function() { | ||
9 | + return { | ||
10 | + tableCols: [ | ||
11 | + { | ||
12 | + title: 'SKN', | ||
13 | + key: 'productSKN', | ||
14 | + align: 'center', | ||
15 | + }, | ||
16 | + { | ||
17 | + title: '商品信息', | ||
18 | + align: 'center', | ||
19 | + render: (h, params) => { | ||
20 | + const row = params.row; | ||
21 | + const infoItems = [ | ||
22 | + { | ||
23 | + type: 'link', | ||
24 | + label: row.productName, | ||
25 | + value: `//item.yohobuy.com/${row.productSKN}.html` | ||
26 | + }, | ||
27 | + { | ||
28 | + label: '品牌', | ||
29 | + value: row.brandName | ||
30 | + }, { | ||
31 | + label: '品类', | ||
32 | + value: `${row.maxSortName}/${row.middleSortName}/${row.smallSortName}` | ||
33 | + } | ||
34 | + ]; | ||
35 | + | ||
36 | + return h(CellInfo, { | ||
37 | + props: { | ||
38 | + items: infoItems | ||
39 | + } | ||
40 | + }); | ||
41 | + } | ||
42 | + }, | ||
43 | + { | ||
44 | + title: '商品图片', | ||
45 | + key: 'image', | ||
46 | + width: 120, | ||
47 | + align: 'center', | ||
48 | + render: (h, params) => { | ||
49 | + return ( | ||
50 | + <img v-prod-img={params.row.productSKN}/> | ||
51 | + ); | ||
52 | + } | ||
53 | + }, | ||
54 | + { | ||
55 | + title: '咨询内容', | ||
56 | + key: 'ask', | ||
57 | + align: 'center' | ||
58 | + }, | ||
59 | + { | ||
60 | + title: '回复内容', | ||
61 | + key: 'answer', | ||
62 | + align: 'center' | ||
63 | + }, | ||
64 | + { | ||
65 | + title: '回复人', | ||
66 | + key: 'answerUserName', | ||
67 | + align: 'center', | ||
68 | + }, | ||
69 | + { | ||
70 | + title: '咨询及回复时间', | ||
71 | + key: 'image', | ||
72 | + align: 'center', | ||
73 | + render: (h, params) => { | ||
74 | + const row = params.row; | ||
75 | + const infoItems = [ | ||
76 | + { | ||
77 | + label: '咨询', | ||
78 | + value: row.askTimeStr | ||
79 | + }, { | ||
80 | + label: '回复', | ||
81 | + value: row.answerTimeStr | ||
82 | + } | ||
83 | + ]; | ||
84 | + | ||
85 | + return h(CellInfo, { | ||
86 | + props: { | ||
87 | + items: infoItems | ||
88 | + } | ||
89 | + }); | ||
90 | + } | ||
91 | + }, | ||
92 | + { | ||
93 | + title: '操作', | ||
94 | + key: 'action', | ||
95 | + align: 'center', | ||
96 | + render: (h, params) => { | ||
97 | + const row = params.row; | ||
98 | + | ||
99 | + let status = row.operateFlag; | ||
100 | + | ||
101 | + if (status === 2) { | ||
102 | + return ( | ||
103 | + <div class="cell-action-row"> | ||
104 | + <i-button type="error" size="small" | ||
105 | + onClick={() => this.editAnswer(row)}> | ||
106 | + 修改 | ||
107 | + </i-button> | ||
108 | + </div> | ||
109 | + ); | ||
110 | + } else if (status === 0) { | ||
111 | + return ( | ||
112 | + <div class="cell-action-row"> | ||
113 | + <i-button type="primary" size="small" | ||
114 | + onClick={() => this.editAnswer(row)}> | ||
115 | + 回复 | ||
116 | + </i-button> | ||
117 | + </div> | ||
118 | + ); | ||
119 | + } else if (status === 1) { | ||
120 | + return ( | ||
121 | + <div class="cell-action-row"> | ||
122 | + <i-button type="error" size="small" style="backgroundColor: #999;border-color: #999;cursor: not-allowed;"> | ||
123 | + 修改 | ||
124 | + </i-button> | ||
125 | + </div> | ||
126 | + ); | ||
127 | + } | ||
128 | + }, | ||
129 | + } | ||
130 | + ], | ||
131 | + tableData: [], | ||
132 | + pageData: { | ||
133 | + total: 0, | ||
134 | + current: 1, | ||
135 | + pageSize: 20 | ||
136 | + }, | ||
137 | + filters: { | ||
138 | + productSKN: { | ||
139 | + label: 'SKN', | ||
140 | + model: '', | ||
141 | + holder: '' | ||
142 | + }, | ||
143 | + prodName: { | ||
144 | + label: '商品名称', | ||
145 | + model: '', | ||
146 | + holder: '' | ||
147 | + }, | ||
148 | + brandId: { | ||
149 | + label: '选择品牌', | ||
150 | + model: '' | ||
151 | + }, | ||
152 | + answerUserName: { | ||
153 | + label: '回复人', | ||
154 | + model: '' | ||
155 | + }, | ||
156 | + sort: { | ||
157 | + first: { | ||
158 | + label: '选择类目', | ||
159 | + holder: '选择一级类目', | ||
160 | + model: '' | ||
161 | + }, | ||
162 | + second: { | ||
163 | + label: '二级类目', | ||
164 | + holder: '选择二级类目', | ||
165 | + model: '' | ||
166 | + }, | ||
167 | + third: { | ||
168 | + label: '三级类目', | ||
169 | + holder: '选择三级类目', | ||
170 | + model: '' | ||
171 | + } | ||
172 | + }, | ||
173 | + isReply: { | ||
174 | + label: '是否回复', | ||
175 | + model: '', | ||
176 | + options: [ | ||
177 | + { | ||
178 | + value: 1, | ||
179 | + label: '已回复' | ||
180 | + }, | ||
181 | + { | ||
182 | + value: 2, | ||
183 | + label: '未回复' | ||
184 | + } | ||
185 | + ] | ||
186 | + }, | ||
187 | + askTimeStr: { | ||
188 | + label: '咨询时间', | ||
189 | + model: '' | ||
190 | + }, | ||
191 | + askStartTime: { | ||
192 | + model: '' | ||
193 | + }, | ||
194 | + askEndTime: { | ||
195 | + model: '' | ||
196 | + }, | ||
197 | + answerTimeStr: { | ||
198 | + label: '回复时间', | ||
199 | + model: '' | ||
200 | + }, | ||
201 | + answerStartTime: { | ||
202 | + model: '' | ||
203 | + }, | ||
204 | + answerEndTime: { | ||
205 | + model: '' | ||
206 | + }, | ||
207 | + } | ||
208 | + }; | ||
209 | +} |
@@ -4,12 +4,15 @@ import onsale from './onsale'; | @@ -4,12 +4,15 @@ import onsale from './onsale'; | ||
4 | import offsale from './offsale'; | 4 | import offsale from './offsale'; |
5 | import vips from './vips'; | 5 | import vips from './vips'; |
6 | import output from './output'; | 6 | import output from './output'; |
7 | - | 7 | +import feedback from './feedback'; |
8 | +import share from './share'; | ||
8 | export default { | 9 | export default { |
9 | create, | 10 | create, |
10 | edit, | 11 | edit, |
11 | onsale, | 12 | onsale, |
12 | offsale, | 13 | offsale, |
13 | vips, | 14 | vips, |
14 | - output | 15 | + output, |
16 | + feedback, | ||
17 | + share | ||
15 | }; | 18 | }; |
app/pages/product/share/index.js
0 → 100644
app/pages/product/share/share.vue
0 → 100644
1 | +<template> | ||
2 | + <layout-body> | ||
3 | + <layout-filter> | ||
4 | + <filter-item :label="filters.erpSkuId.label"> | ||
5 | + <Input v-model.trim="filters.erpSkuId.model" | ||
6 | + :placeholder="filters.erpSkuId.holder" :maxlength="9"></Input> | ||
7 | + </filter-item> | ||
8 | + <filter-item :label="filters.productSkn.label"> | ||
9 | + <Input v-model.trim="filters.productSkn.model" | ||
10 | + :placeholder="filters.productSkn.holder" :maxlength="9"></Input> | ||
11 | + </filter-item> | ||
12 | + <filter-item :label="filters.productName.label"> | ||
13 | + <Input v-model.trim="filters.productName.model" | ||
14 | + :placeholder="filters.productName.holder"></Input> | ||
15 | + </filter-item> | ||
16 | + <filter-item label="品牌"> | ||
17 | + <select-brand v-model="filters.brand.model"></select-brand> | ||
18 | + </filter-item> | ||
19 | + <filter-item :label="filters.hasImage.label"> | ||
20 | + <Select v-model.trim="filters.hasImage.model" clearable> | ||
21 | + <Option v-for="option in filters.hasImage.options" | ||
22 | + :value="option.value" | ||
23 | + :key="option.value">{{option.label}}</Option> | ||
24 | + </Select> | ||
25 | + </filter-item> | ||
26 | + <filter-item :label="filters.createTime.label"> | ||
27 | + <Date-picker type="datetimerange" | ||
28 | + placeholder="选择日期和时间" | ||
29 | + @on-change="createTimeChange" | ||
30 | + v-model="filters.createTime.model"> | ||
31 | + </Date-picker> | ||
32 | + </filter-item> | ||
33 | + <filter-item> | ||
34 | + <Button type="primary" @click="list">筛选</Button> | ||
35 | + <Button @click="clearFilters">清空条件</Button> | ||
36 | + </filter-item> | ||
37 | + </layout-filter> | ||
38 | + | ||
39 | + <layout-list> | ||
40 | + <Table border :columns="tableCols" :data="tableData" @on-selection-change="selectChange"></Table> | ||
41 | + <Page :total="pageData.total" :current="pageData.current" | ||
42 | + @on-change="pageChange" show-total></Page> | ||
43 | + </layout-list> | ||
44 | + | ||
45 | + </layout-body> | ||
46 | +</template> | ||
47 | + | ||
48 | +<script> | ||
49 | + import _ from 'lodash'; | ||
50 | + import moment from 'moment'; | ||
51 | + import shareStore from './store'; | ||
52 | + import ShareService from 'services/product/share-service'; | ||
53 | + | ||
54 | + export default { | ||
55 | + data() { | ||
56 | + return shareStore.call(this); | ||
57 | + }, | ||
58 | + created() { | ||
59 | + this.shareService = new ShareService(); | ||
60 | + }, | ||
61 | + mounted() { | ||
62 | + this.list(); | ||
63 | + }, | ||
64 | + methods: { | ||
65 | + clearFilters() { | ||
66 | + this.filters.erpSkuId.model = null; | ||
67 | + this.filters.productSkn.model = null; | ||
68 | + this.filters.productName.model = null; | ||
69 | + this.filters.hasImage.model = null; | ||
70 | + this.filters.brand.model = null; | ||
71 | + this.filters.beginTime = null; | ||
72 | + this.filters.endTime = null; | ||
73 | + this.pageData.current = 1; | ||
74 | + | ||
75 | + this.list(); | ||
76 | + }, | ||
77 | + pageChange(page) { | ||
78 | + this.pageData.current = page; | ||
79 | + this.list(); | ||
80 | + }, | ||
81 | + filtersParams() { | ||
82 | + let params = {}; | ||
83 | + let fts = this.filters; | ||
84 | + let erpSkuId = fts.erpSkuId.model, | ||
85 | + productSkn = fts.productSkn.model, | ||
86 | + productName = fts.productName.model, | ||
87 | + hasImage = fts.hasImage.model, | ||
88 | + brand_id = fts.brand.model === '' || fts.brand.model === null ? | ||
89 | + null : fts.brand.model, | ||
90 | + beginTime = fts.beginTime.model, | ||
91 | + endTime = fts.endTime.model; | ||
92 | + | ||
93 | + let page = this.pageData.current; | ||
94 | + let size = this.pageData.size; | ||
95 | + | ||
96 | + if (this.filters.erpSkuId.model) { | ||
97 | + if (this.isNumber(this.filters.erpSkuId.model)) { | ||
98 | + params.erpSkuId = this.filters.erpSkuId.model; | ||
99 | + } else { | ||
100 | + return Promise.reject('sku必须是数字'); | ||
101 | + } | ||
102 | + } | ||
103 | + | ||
104 | + if (this.filters.productSkn.model) { | ||
105 | + if (this.isNumber(this.filters.productSkn.model)) { | ||
106 | + params.productSkn = this.filters.productSkn.model; | ||
107 | + } else { | ||
108 | + return Promise.reject('skn必须是数字'); | ||
109 | + } | ||
110 | + } | ||
111 | + | ||
112 | + params.size = this.pageData.size; | ||
113 | + params.page = this.pageData.current; | ||
114 | + | ||
115 | + return Promise.resolve({ | ||
116 | + params, | ||
117 | + erpSkuId, | ||
118 | + productSkn, | ||
119 | + productName, | ||
120 | + hasImage, | ||
121 | + brand_id, | ||
122 | + beginTime, | ||
123 | + endTime, | ||
124 | + page, | ||
125 | + size | ||
126 | + }); | ||
127 | + }, | ||
128 | + list() { | ||
129 | + this.$Loading.start(); | ||
130 | + | ||
131 | + return this.filtersParams().then((params) => { | ||
132 | + function getLocalTime(ns) { | ||
133 | + let date = new Date(ns * 1000), | ||
134 | + Y = date.getFullYear() + '-', | ||
135 | + M = (date.getMonth() + 1 < 10 ? '0' + (date.getMonth() + 1) : date.getMonth() + 1) + '-', | ||
136 | + D = (date.getDate() < 10 ? '0' + date.getDate() : date.getDate()) + ' ', | ||
137 | + h = (date.getHours() < 10 ? '0' + date.getHours() : date.getHours()) + ':', | ||
138 | + m = (date.getMinutes() < 10 ? '0' + date.getMinutes() : date.getMinutes()) + ':', | ||
139 | + s = date.getSeconds() < 10 ? '0' + date.getSeconds() : date.getSeconds(); | ||
140 | + | ||
141 | + return Y + M + D + h + m + s; | ||
142 | + } | ||
143 | + | ||
144 | + if (params) { | ||
145 | + params.beginTime = params.beginTime ? getLocalTime(params.beginTime) : null; | ||
146 | + params.endTime = params.endTime ? getLocalTime(params.endTime) : null; | ||
147 | + } | ||
148 | + | ||
149 | + return this.shareService.list(params); | ||
150 | + }).then((result) => { | ||
151 | + if (result.code === 200) { | ||
152 | + this.pageData.total = result.data.total; | ||
153 | + this.pageData.current = result.data.page; | ||
154 | + this.tableData = result.data.list; | ||
155 | + } | ||
156 | + this.$Loading.finish(); | ||
157 | + }).catch((err) => { | ||
158 | + this.$Loading.finish(); | ||
159 | + this.$Message.error(err); | ||
160 | + }); | ||
161 | + }, | ||
162 | + isNumber(numStr) { | ||
163 | + const isNumber = /^[0-9]+$/; | ||
164 | + | ||
165 | + return isNumber.test(numStr); | ||
166 | + }, | ||
167 | + createTimeChange(time) { | ||
168 | + // 兼容: https://github.com/iview/iview/issues/973 | ||
169 | + if (!_.isArray(time)) { | ||
170 | + time = time.split(' - '); | ||
171 | + } | ||
172 | + if ((time[0] + '').length) { | ||
173 | + this.filters.beginTime.model = +moment(time[0]).format('X'); | ||
174 | + this.filters.endTime.model = +moment(time[1]).format('X'); | ||
175 | + } | ||
176 | + } | ||
177 | + } | ||
178 | + }; | ||
179 | +</script> | ||
180 | +<style lang="scss"> | ||
181 | + .cell-img { | ||
182 | + width: 80px; | ||
183 | + background-size: 100%; | ||
184 | + } | ||
185 | +</style> |
app/pages/product/share/store/index.js
0 → 100644
1 | +/** | ||
2 | + * on share page store | ||
3 | + * @author: Gexuhui | ||
4 | + * @date: 2017/08/02 | ||
5 | + */ | ||
6 | +import CellInfo from 'components/cell/cell-info'; | ||
7 | +import CellImage from 'components/cell/cell-image'; | ||
8 | + | ||
9 | +export default function() { | ||
10 | + return { | ||
11 | + tableCols: [ | ||
12 | + { | ||
13 | + type: 'selection', | ||
14 | + width: 60, | ||
15 | + align: 'center' | ||
16 | + }, | ||
17 | + { | ||
18 | + title: 'SKU', | ||
19 | + key: 'erpSkuId', | ||
20 | + width: 100, | ||
21 | + align: 'center', | ||
22 | + }, | ||
23 | + { | ||
24 | + title: '商品信息', | ||
25 | + align: 'center', | ||
26 | + render: (h, params) => { | ||
27 | + const row = params.row; | ||
28 | + const infoItems = [ | ||
29 | + { | ||
30 | + type: 'link', | ||
31 | + label: row.productName, | ||
32 | + value: `//item.yohobuy.com/${row.productSkn}.html` | ||
33 | + }, | ||
34 | + { | ||
35 | + label: 'SKN', | ||
36 | + value: row.erpSkuId | ||
37 | + }, | ||
38 | + { | ||
39 | + label: '品牌', | ||
40 | + value: row.brandName | ||
41 | + }, | ||
42 | + { | ||
43 | + label: '颜色/尺码', | ||
44 | + value: `${row.colorName} / ${row.sizeName}` | ||
45 | + } | ||
46 | + ]; | ||
47 | + | ||
48 | + return h(CellInfo, { | ||
49 | + props: { | ||
50 | + items: infoItems | ||
51 | + } | ||
52 | + }); | ||
53 | + } | ||
54 | + }, | ||
55 | + { | ||
56 | + title: '商品图片', | ||
57 | + key: 'image', | ||
58 | + width: 150, | ||
59 | + align: 'center', | ||
60 | + render: (h, params) => { | ||
61 | + return ( | ||
62 | + <img v-prod-img={params.row.productSkn}/> | ||
63 | + ); | ||
64 | + } | ||
65 | + }, | ||
66 | + { | ||
67 | + title: '评价内容', | ||
68 | + key: 'content', | ||
69 | + align: 'center', | ||
70 | + }, | ||
71 | + { | ||
72 | + title: '评价图片', | ||
73 | + key: 'image', | ||
74 | + width: 150, | ||
75 | + align: 'center', | ||
76 | + render: (h, params) => { | ||
77 | + let url = params.row.url; | ||
78 | + | ||
79 | + if (url.length > 0 && url.length !== 1) { | ||
80 | + return h(CellImage, { | ||
81 | + props: { | ||
82 | + imageSrc: url, | ||
83 | + productUrl: url | ||
84 | + } | ||
85 | + }); | ||
86 | + } else { | ||
87 | + return '—'; | ||
88 | + } | ||
89 | + | ||
90 | + } | ||
91 | + }, | ||
92 | + { | ||
93 | + title: '评价时间', | ||
94 | + key: 'createTime', | ||
95 | + align: 'center', | ||
96 | + } | ||
97 | + ], | ||
98 | + tableData: [], | ||
99 | + pageData: { | ||
100 | + total: 0, | ||
101 | + current: 1 | ||
102 | + }, | ||
103 | + filters: { | ||
104 | + erpSkuId: { | ||
105 | + label: 'SKU', | ||
106 | + model: '', | ||
107 | + holder: '' | ||
108 | + }, | ||
109 | + productSkn: { | ||
110 | + label: 'SKN', | ||
111 | + model: '', | ||
112 | + holder: '' | ||
113 | + }, | ||
114 | + productName: { | ||
115 | + label: '商品名称', | ||
116 | + model: '', | ||
117 | + holder: '' | ||
118 | + }, | ||
119 | + brand: { | ||
120 | + label: '品牌', | ||
121 | + model: '' | ||
122 | + }, | ||
123 | + sort: { | ||
124 | + first: { | ||
125 | + label: '选择类目', | ||
126 | + holder: '选择一级类目', | ||
127 | + model: '' | ||
128 | + }, | ||
129 | + second: { | ||
130 | + label: '二级类目', | ||
131 | + holder: '选择二级类目', | ||
132 | + model: '' | ||
133 | + }, | ||
134 | + third: { | ||
135 | + label: '三级类目', | ||
136 | + holder: '选择三级类目', | ||
137 | + model: '' | ||
138 | + } | ||
139 | + }, | ||
140 | + hasImage: { | ||
141 | + label: '图片筛选', | ||
142 | + model: '', | ||
143 | + options: [ | ||
144 | + { | ||
145 | + value: 1, | ||
146 | + label: '有图' | ||
147 | + }, | ||
148 | + { | ||
149 | + value: 0, | ||
150 | + label: '无图' | ||
151 | + } | ||
152 | + ] | ||
153 | + }, | ||
154 | + createTime: { | ||
155 | + label: '评价时间', | ||
156 | + model: '' | ||
157 | + }, | ||
158 | + beginTime: { | ||
159 | + model: '' | ||
160 | + }, | ||
161 | + endTime: { | ||
162 | + model: '' | ||
163 | + } | ||
164 | + } | ||
165 | + }; | ||
166 | +} | ||
167 | + |
app/services/product/feedback-service.js
0 → 100644
1 | +/** | ||
2 | + * Created by GeXuHui on 2017/08/01. | ||
3 | + */ | ||
4 | + | ||
5 | +import Service from '../service'; | ||
6 | +const apiUrl = { | ||
7 | + getConsultList: '/platform/getConsultList', | ||
8 | + consultReply: '/platform/consultReply', | ||
9 | +}; | ||
10 | + | ||
11 | +class FeedbackService extends Service { | ||
12 | + list(params) { | ||
13 | + return this.post(apiUrl.getConsultList, params); | ||
14 | + } | ||
15 | + consultReply(userId, id, answer) { | ||
16 | + return this.post(apiUrl.consultReply, {userId, id, answer}); | ||
17 | + } | ||
18 | +} | ||
19 | + | ||
20 | +export default FeedbackService; |
app/services/product/share-service.js
0 → 100644
1 | +/** | ||
2 | + * Created by GeXuHui on 2017/08/02. | ||
3 | + */ | ||
4 | + | ||
5 | +import Service from '../service'; | ||
6 | +const apiUrl = { | ||
7 | + getShareOrderList: '/platform/getShareOrderList' | ||
8 | +}; | ||
9 | + | ||
10 | +class FeedbackService extends Service { | ||
11 | + list(params) { | ||
12 | + return this.post(apiUrl.getShareOrderList, params); | ||
13 | + } | ||
14 | +} | ||
15 | + | ||
16 | +export default FeedbackService; |
@@ -93,6 +93,9 @@ let domainApis = { | @@ -93,6 +93,9 @@ let domainApis = { | ||
93 | downloadFile: '/exceltemplate/download/CreateProductForShops', | 93 | downloadFile: '/exceltemplate/download/CreateProductForShops', |
94 | getSellType: '/SellerProductController/getSellType', | 94 | getSellType: '/SellerProductController/getSellType', |
95 | queryProductPhotoList: '/sellerProductPhoto/queryProductPhotoList', | 95 | queryProductPhotoList: '/sellerProductPhoto/queryProductPhotoList', |
96 | + getConsultList: '/seller/consult/getConsultList', | ||
97 | + consultReply: '/seller/consult/reply', | ||
98 | + getShareOrderList: '/seller/shareOrder/shareOrderList', | ||
96 | }, | 99 | }, |
97 | shop: { | 100 | shop: { |
98 | login: '/loginInter', | 101 | login: '/loginInter', |
@@ -103,7 +106,7 @@ let domainApis = { | @@ -103,7 +106,7 @@ let domainApis = { | ||
103 | // 域名列表 | 106 | // 域名列表 |
104 | const domains = { | 107 | const domains = { |
105 | erp: 'http://192.168.103.82:9098', | 108 | erp: 'http://192.168.103.82:9098', |
106 | - platform: 'http://192.168.102.202:8088/platform', | 109 | + platform: 'http://192.168.102.210:8088/platform', |
107 | shop: 'http://192.168.102.211:30016' | 110 | shop: 'http://192.168.102.211:30016' |
108 | }; | 111 | }; |
109 | 112 |
-
Please register or login to post a comment