index.vue 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375
  1. <template>
  2. <view class="detail mt20 bgfff">
  3. <view class="tab dflex">
  4. <view :class="'li ' + (currentTab == 0 ? 'active' : '')" data-current="0" @tap="tab">图文详情</view>
  5. <view :class="'li ' + (currentTab == 1 ? 'active' : '')" data-current="1" @tap="tab"
  6. v-if="config.is_hide_product_parameter != 1 && !isMerge">产品说明</view>
  7. <view :class="'li ' + (currentTab == 2 ? 'active' : '')" data-current="2" @tap="tab"
  8. v-if="isOpenComments == 1">买家评价</view>
  9. </view>
  10. <view :class="currentTab == 0 ? 'show' : 'hide'">
  11. <view class="tabcon details det-text">
  12. <!-- <rich-text :nodes="detail"></rich-text> -->
  13. <mp-html :content="detail" :lazy-load="true" @imgtap="choose"></mp-html>
  14. </view>
  15. <!-- <view class="tabcon details">
  16. <block v-for="(item, index) in imgs" :key="index">
  17. <image class="img" :src="item + '?x-oss-process=style/w750-auto'" mode="widthFix" @tap="chooseImg" :data-src="item"></image>
  18. </block>
  19. </view> -->
  20. <block v-if="diyNodes || diyImgs.length > 0">
  21. <view class="tabcon details">
  22. <rich-text :nodes="diyNodes" @tap="richImg"></rich-text>
  23. </view>
  24. <view class="tabcon details">
  25. <block v-for="(item, index) in diyImgs" :key="index">
  26. <image class="img" :src="item + '?x-oss-process=style/w750-auto'" mode="widthFix"
  27. @tap="chooseImg1" :data-src="item"></image>
  28. </block>
  29. </view>
  30. </block>
  31. </view>
  32. <view :class="[currentTab == 1? 'show' : 'hide','tabcon']">
  33. <view class="canshu" v-if="params.length > 0">
  34. <view v-for="(item, index) in params" :key="index" class="li dflex">
  35. <label class="label">{{item.name}}</label>
  36. <view class="view flex">{{item.value}}</view>
  37. </view>
  38. </view>
  39. <view class="nodata" v-else>
  40. <image :src="picUrlss+'empty_jl.png'"></image>
  41. <text>暂无记录~</text>
  42. </view>
  43. </view>
  44. <view :class="[currentTab == 2 ? 'show' : 'hide','tabcon']">
  45. <view class="fen dflex">
  46. <view class="zong"><text class="text">{{overallRating}}</text>综合评分</view>
  47. <view class="xing flex">
  48. <view class="ping dflex">
  49. <view class="view">服务态度</view>
  50. <image v-for="(item, index) in [1,2,3,4,5]" :key="index" class="image"
  51. :src="score.serviceAttitude >= item ? '/static/pages/images/star_h.png' : '/static/pages/images/star.png'">
  52. </image>
  53. <text class="text">{{score.serviceAttitude}}分</text>
  54. </view>
  55. <view class="ping dflex">
  56. <view class="view">商品评分</view>
  57. <image v-for="(item, index) in [1,2,3,4,5]" :key="index" class="image"
  58. :src="score.productRating >= item ? '/static/pages/images/star_h.png' : '/static/pages/images/star.png'">
  59. </image>
  60. <text class="text">{{score.productRating}}分</text>
  61. </view>
  62. </view>
  63. </view>
  64. <view class="pltab dflex">
  65. <view :class="'li ' + (scoreTab == 0 ? 'active' : '')" @tap="scoreTabFun" data-current="0">
  66. 全部({{score.ratingAll}})</view>
  67. <view :class="'li ' + (scoreTab == 3 ? 'active' : '')" @tap="scoreTabFun" data-current="3">
  68. 好评({{score.ratingGood}})</view>
  69. <view :class="'li ' + (scoreTab == 2 ? 'active' : '')" @tap="scoreTabFun" data-current="2">
  70. 中评({{score.ratingMedium}})</view>
  71. <view :class="'li ' + (scoreTab == 1 ? 'active' : '')" @tap="scoreTabFun" data-current="1">
  72. 差评({{score.ratingBad}})</view>
  73. </view>
  74. <view class="plcon">
  75. <block v-if="scoreList.length > 0">
  76. <view v-for="(item, index) in scoreList" :key="index" class="li dflex">
  77. <image :src="item.avatar" mode="aspectFit" class="user"></image>
  78. <view class="flex">
  79. <view class="name dflex">{{item.nickName.replace(/^(.).*(.)$/,"$1***$2")}}<text class="time">{{item.createDate}}</text>
  80. </view>
  81. <view class="pinglun">{{item.evaluateText ? item.evaluateText : '此用户没有填写评价。'}}</view>
  82. <view class="plimg dflex" v-if="item.buyShow.length > 0">
  83. <image v-for="(it, index2) in item.buyShow" :key="index2" :src="it" mode="aspectFit"
  84. @tap="previewImg" :data-src="it" :data-list="item.buyShow"></image>
  85. </view>
  86. <!-- <view class="huifu">商家回复:感谢您对我们的支持,我们更加用心的服务好每一位客户!</view> -->
  87. </view>
  88. </view>
  89. </block>
  90. <view class="nodata" v-else>
  91. <image :src="picUrlss+'empty_dd.png'"></image>
  92. <text>商品还没有人评价</text>
  93. </view>
  94. </view>
  95. </view>
  96. </view>
  97. </template>
  98. <script>
  99. const req = require("../../utils/request");
  100. import mpHtml from "../mp-html/components/mp-html/mp-html";
  101. export default {
  102. components: {
  103. mpHtml
  104. },
  105. data() {
  106. return {
  107. picUrlss: req.public.picUrls,
  108. currentTab: 0,
  109. params: [],
  110. scoreList: [],
  111. isLoad: true,
  112. scoreTab: 0,
  113. overallRating: '0' //综合评分
  114. ,
  115. diyImgs: "",
  116. diyNodes: "",
  117. score: "",
  118. isOpenComments: "",
  119. config: {}
  120. };
  121. },
  122. props: {
  123. detail: String,
  124. proId: String,
  125. imgs: Array,
  126. form: {
  127. type: Object,
  128. default: () => ({})
  129. },
  130. isMerge: {//是否是组合购买商品
  131. type: Number,
  132. default: 0
  133. }
  134. },
  135. watch: {
  136. 'proId': function(oldValue, newValue) {
  137. // console.log(oldValue, newValue);
  138. },
  139. },
  140. options: {
  141. addGlobalClass: true
  142. },
  143. mounted() {
  144. // console.log(this.detail,"7899879")
  145. let that = this;
  146. that.isOpenCommentsFun();
  147. if(!this.isMerge){
  148. that.loadParams();
  149. }
  150. that.joinFootprint();
  151. if (req.getStorage('productDiy')) {
  152. //富文本图片放大
  153. var diyNodes = req.getStorage('productDiy');
  154. if (diyNodes) {
  155. if (diyNodes.indexOf("src") >= 0) {
  156. //正则匹配所有图片路径
  157. var diyImgs = [];
  158. diyNodes = diyNodes.replace(/<img [^>]*src=['"]([^'"]+)[^>]*>/gi, function(match, capture) {
  159. diyImgs.push(capture);
  160. that.setData({
  161. diyImgs: diyImgs
  162. });
  163. return '';
  164. });
  165. }
  166. } // console.log(diyNodes,this.data.imgs,this.data.diyImgs)
  167. // console.log(this.detail,"================");
  168. that.setData({
  169. diyNodes: diyNodes
  170. });
  171. }
  172. this.config = JSON.parse(req.getStorage('configRes'));
  173. },
  174. methods: {
  175. choose: function() {
  176. // console.log(123);
  177. let freshen = false;
  178. this.$emit('freshen', {
  179. detail: freshen
  180. });
  181. },
  182. tab(event) {
  183. const tabIndex = event.currentTarget.dataset.current;
  184. if (this.currentTab === tabIndex) return false;
  185. this.setData({
  186. currentTab: tabIndex
  187. });
  188. this.$emit('showTab', {
  189. detail: tabIndex
  190. });
  191. },
  192. joinFootprint() {
  193. req.postRequest('/api/footprint', {
  194. bindId: this.proId,
  195. type: 1
  196. }, () => {}, true);
  197. },
  198. loadParams() {
  199. let _ts = this;
  200. req.getRequest('/api/product/params', {
  201. id: this.proId
  202. }, data => {
  203. _ts.setData({
  204. params: data
  205. });
  206. });
  207. },
  208. loadScore(scoreType, from) {
  209. //买家评价
  210. let _ts = this;
  211. // console.log(this.isLoad, scoreType,this.form);
  212. // if (scoreType) {
  213. // this.isLoad = true; // this.setData({['form.page']:1})
  214. // }
  215. if (!this.isLoad) return false;
  216. this.isLoad = false;
  217. let userInfo = req.getStorage('userInfo');
  218. let form
  219. if (from) {
  220. form = from;
  221. } else {
  222. form = _ts.form;
  223. }
  224. form.bindId = _ts.proId; // form.uid = userInfo.id;
  225. form.type = scoreType;
  226. req.getRequest('/api/sysScore/getList', form, res => {
  227. if (res.list && res.list.length == 10) _ts.isLoad = true;
  228. if (_ts.form.page > 1) res.list = _ts.scoreList.concat(res.list);
  229. res.list.map(item => {
  230. if (typeof item.buyShow != 'object') {
  231. if (!item.buyShow) {
  232. item.buyShow = [];
  233. } else {
  234. item.buyShow = item.buyShow.split(',');
  235. }
  236. } // item.buyShow = !item.buyShow ? [] : item.buyShow.split(',');
  237. return item;
  238. });
  239. _ts.setData({
  240. scoreList: res.list
  241. });
  242. // console.log('评价列表', _ts.scoreList, _ts.isLoad);
  243. });
  244. },
  245. loadScoreData() {
  246. req.getRequest('/api/sysScore/statisticsScore', {
  247. productId: this.proId
  248. }, res => {
  249. // console.log('评价统计', res);
  250. res.serviceAttitude = res.serviceAttitude.toFixed(0) == 0 ? '5' : res.serviceAttitude.toFixed(
  251. 0);
  252. res.productRating = res.productRating.toFixed(0) == 0 ? '5' : res.productRating.toFixed(0);
  253. let overallRating = (Number(res.serviceAttitude) + Number(res.productRating)) / 2;
  254. this.setData({
  255. score: res,
  256. overallRating: overallRating
  257. });
  258. });
  259. },
  260. scoreTabFun(event) {
  261. this.form.page = 1
  262. this.isLoad = true
  263. let current = event.currentTarget.dataset.current;
  264. this.setData({
  265. scoreTab: current
  266. });
  267. this.$emit('scoreTab', {
  268. detail: current
  269. });
  270. this.$emit('getForm', {
  271. detail: this.form.page
  272. });
  273. this.loadScore(current);
  274. },
  275. chooseImg: function(e) {
  276. //预览
  277. var src = e.currentTarget.dataset.src;
  278. let freshen = false;
  279. this.$emit('freshen', {
  280. detail: freshen
  281. });
  282. uni.previewImage({
  283. current: src,
  284. // 当前显示图片的http链接
  285. urls: this.imgs
  286. });
  287. },
  288. chooseImg1: function(e) {
  289. //预览
  290. var src = e.currentTarget.dataset.src;
  291. let freshen = false;
  292. this.$emit('freshen', {
  293. detail: freshen
  294. });
  295. uni.previewImage({
  296. current: src,
  297. // 当前显示图片的http链接
  298. urls: this.diyImgs
  299. });
  300. },
  301. previewImg: function(e) {
  302. //预览评论买家秀
  303. var src = e.currentTarget.dataset.src;
  304. let list = e.currentTarget.dataset.list;
  305. let freshen = false;
  306. this.$emit('freshen', {
  307. detail: freshen
  308. });
  309. uni.previewImage({
  310. current: src,
  311. // 当前显示图片的http链接
  312. urls: list
  313. });
  314. },
  315. isOpenCommentsFun() {
  316. //是否开启评论
  317. let that = this;
  318. if (req.getStorage('configRes') && JSON.parse(req.getStorage('configRes')).is_open_comments) {
  319. let isOpenCommentss = JSON.parse(req.getStorage('configRes')).is_open_comments;
  320. if (isOpenCommentss == 1) {
  321. that.loadScore(that.scoreType);
  322. that.loadScoreData();
  323. }
  324. this.setData({
  325. isOpenComments: isOpenCommentss
  326. });
  327. } else {
  328. req.g('/api/config', res => {
  329. let isOpenCommentss = res.is_open_comments;
  330. if (isOpenCommentss == 1) {
  331. that.loadScore(that.scoreType);
  332. that.loadScoreData();
  333. }
  334. this.setData({
  335. isOpenComments: isOpenCommentss
  336. });
  337. req.setStorage('configRes', JSON.stringify(res));
  338. });
  339. }
  340. }
  341. }
  342. };
  343. </script>
  344. <style>
  345. @import "./index.css";
  346. </style>