order_appraise.vue 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245
  1. <template>
  2. <view class="dt-page">
  3. <view class="appraise-list">
  4. <view v-for="(item,idx) in goodsList" :key="idx" class="appraise-item">
  5. <view class="hd-wrap">
  6. <image class="goods-pic" :src="item.thumbnail" mode="aspectFit"></image>
  7. <view class="goods-name dt-text-row-one">{{item.name}}</view>
  8. <view class="price">¥{{ item.price | moneyEx}}</view>
  9. </view>
  10. <view class="mn-wrap">
  11. <textarea :value="feedbacks[idx]" @input="onInput($event,idx)" maxlength="-1" rows="10" placeholder="对该商品进行评价..."></textarea>
  12. <DtUpload :ref="'imgsUploader'+idx" title="上传照片" :max="4" :files="fileList[idx]" @error="onError" @complete="onComplete" />
  13. </view>
  14. <view class="ft-wrap">
  15. <view class="title">商品评分</view>
  16. <view class="star-list">
  17. <image v-for="(items,idxs) in 5" :key="idxs" :src="curStar[idx]>=idxs+1?'http://139.9.103.171:1888/img/image/appraise_stared.png':'http://139.9.103.171:1888/img/image/appraise_star.png'" class="star" mode="aspectFit" @tap="tapAppraise(idx,idxs)"></image>
  18. </view>
  19. </view>
  20. </view>
  21. </view>
  22. <view class="btn-wrap-fix"></view>
  23. <view class="btn-wrap">
  24. <button class="btn-primary" @tap="tapSubmit">提交</button>
  25. </view>
  26. </view>
  27. </template>
  28. <script>
  29. import DtUpload from '../comps/dt_upload.vue'
  30. export default {
  31. components: {
  32. DtUpload
  33. },
  34. data() {
  35. return {
  36. dataDetail:{},
  37. goodsList: [],
  38. feedbacks: [],
  39. fileList: [],
  40. curStar: [],
  41. lastPageRoute:''
  42. }
  43. },
  44. methods: {
  45. onInput(ev, idx) {
  46. let feedbacks = this.feedbacks.slice(0)
  47. feedbacks[idx] = ev.detail.value
  48. this.$set(this, 'feedbacks', feedbacks)
  49. },
  50. tapAppraise(idx, idxs) {
  51. let curStar = this.curStar.slice(0)
  52. curStar[idx] = idxs + 1
  53. this.$set(this, 'curStar', curStar)
  54. },
  55. onError(err) {
  56. console.log('onError',err)
  57. },
  58. onComplete(files) {
  59. console.log('onComplete', files)
  60. },
  61. tapSubmit() {
  62. let feedbacks = this.feedbacks.slice(0)
  63. let isOk = true
  64. feedbacks.forEach((feed)=>{
  65. if(!feed || !feed.trim()){
  66. isOk = false
  67. }
  68. })
  69. if(!isOk){
  70. this.$dialog.toast('请填写评价内容')
  71. return
  72. }
  73. let promiseList = []
  74. let idx = 0
  75. while (this.$refs['imgsUploader' + idx]) {
  76. // console.log(76,this.$refs)
  77. let promise = this.$refs['imgsUploader' + idx][0].upload()
  78. console.log(78,promise)
  79. promiseList.push(promise)
  80. idx++
  81. }
  82. console.log(82,promiseList)
  83. Promise.all(promiseList).then(resList => {
  84. console.log('success',resList)
  85. this.reviewOrder(resList)
  86. }).catch(err => {
  87. console.warn(err)
  88. })
  89. },
  90. async reviewOrder(resList){
  91. let reviews = []
  92. let goodsList = this.goodsList.slice(0)
  93. goodsList.forEach((item,idx)=>{
  94. let reviewItem = {
  95. orderItemId:item.orderItemId || item.id,
  96. content: this.feedbacks[idx],
  97. score: this.curStar[idx] || 5
  98. }
  99. if(resList[idx] && resList[idx].length>0){
  100. let imageUrls = []
  101. resList[idx].forEach((resItem)=>{
  102. imageUrls.push(resItem.path)
  103. })
  104. reviewItem.imageUrls = JSON.stringify(imageUrls)
  105. }else{
  106. reviewItem.imageUrls = ''
  107. }
  108. reviews.push(reviewItem)
  109. })
  110. let resp = await this.$api.reviewOrder({
  111. orderId: this.dataDetail.id,
  112. memberId: this.memberId,
  113. reviews: reviews
  114. })
  115. let paths = ['pages/mine','pages/mine_order_list']
  116. if(this.lastPageRoute === 'pages/order_detail'){
  117. paths.push('pages/order_detail')
  118. }
  119. this.$util.refreshPage(paths)
  120. this.$dialog.success('评价成功',()=>{
  121. uni.navigateBack()
  122. })
  123. },
  124. onLoadPage(options){
  125. wx.hideShareMenu();
  126. this.memberId = this.$auth.getMemberId()
  127. let lastPage = this.$util.getPageCtx(1).$vm
  128. let lastPageRoute = lastPage.__route__
  129. this.lastPageRoute = lastPageRoute
  130. console.log(130,lastPageRoute)
  131. if(lastPageRoute === 'pages/mine_order_list'){
  132. let dataList = lastPage.dataList.slice(0)
  133. let item = dataList[options.idx]
  134. this.dataDetail = item
  135. this.goodsList = item.products
  136. }else{
  137. let item = lastPage.orders
  138. this.dataDetail = item
  139. this.goodsList = item.orderItems
  140. }
  141. },
  142. }
  143. }
  144. </script>
  145. <style lang="scss" scoped>
  146. .dt-page {
  147. min-height: 100vh;
  148. background-color: #f2f2f2;
  149. .appraise-list {
  150. padding-bottom: 1upx;
  151. }
  152. .appraise-item {
  153. margin-bottom: 20upx;
  154. background-color: #fff;
  155. .hd-wrap {
  156. display: flex;
  157. align-items: center;
  158. height: 90upx;
  159. padding: 0 30upx;
  160. font-size: 30upx;
  161. font-weight: 500;
  162. .goods-pic {
  163. margin-right: 20upx;
  164. width: 70upx;
  165. height: 70upx;
  166. }
  167. .goods-name {
  168. flex: 1;
  169. height: 36upx;
  170. line-height: 36upx;
  171. }
  172. .goods-price {
  173. margin-left: 20upx;
  174. }
  175. }
  176. .mn-wrap {
  177. display: flex;
  178. flex-wrap: wrap;
  179. padding: 30upx 30upx 10upx;
  180. border-top: 1upx solid #e5e5e5;
  181. border-bottom: 1upx solid #e5e5e5;
  182. textarea {
  183. width: 100%;
  184. height: 200upx;
  185. padding-bottom: 10upx;
  186. line-height: 1.5;
  187. }
  188. }
  189. .ft-wrap {
  190. display: flex;
  191. flex-wrap: wrap;
  192. padding: 0 30upx;
  193. .title {
  194. padding-top: 30upx;
  195. width: 100%;
  196. font-size: 30upx;
  197. font-weight: 500;
  198. }
  199. .star-list {
  200. display: flex;
  201. align-items: center;
  202. width: 100%;
  203. .star {
  204. width: 44upx;
  205. height: 44upx;
  206. padding: 30upx 25upx;
  207. }
  208. .star:first-child {
  209. padding-left: 0;
  210. }
  211. }
  212. }
  213. }
  214. .btn-wrap-fix {
  215. width: 100%;
  216. height: 110upx;
  217. }
  218. .btn-wrap {
  219. position: fixed;
  220. bottom: 0;
  221. left: 0;
  222. display: flex;
  223. justify-content: center;
  224. align-items: center;
  225. width: 100vw;
  226. height: 110upx;
  227. background-color: #fff;
  228. .btn-primary {
  229. width: 690upx;
  230. height: 80upx;
  231. line-height: 80upx;
  232. color: #fff;
  233. background-color: $dt-color-primary;
  234. font-size: 30upx;
  235. }
  236. }
  237. }
  238. </style>