Authored by 陈峰

Merge branch 'feature/feedback' into 'release/3.1'

Feature/feedback

feedback


See merge request !43
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>
@@ -38,5 +38,9 @@ export default { @@ -38,5 +38,9 @@ export default {
38 .ivu-cascader { 38 .ivu-cascader {
39 max-width: 300px; 39 max-width: 300px;
40 } 40 }
  41 +
  42 + .ivu-date-picker {
  43 + width: 100%;
  44 + }
41 } 45 }
42 </style> 46 </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>
  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>
  1 +export default {
  2 + path: '/feedback.html',
  3 + name: 'feedback',
  4 + component: () => import(/* webpackChunkName: "product.feedback" */'./feedback'),
  5 + meta: {
  6 + pageName: '商品咨询'
  7 + }
  8 +};
  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 };
  1 +export default {
  2 + path: '/share.html',
  3 + name: 'share',
  4 + component: () => import(/* webpackChunkName: "product.share" */'./share'),
  5 + meta: {
  6 + pageName: '晒单评价'
  7 + }
  8 +};
  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>
  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 +
  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;
  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