ProdInfo.vue 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330
  1. <template>
  2. <div class="prod-info">
  3. <!-- 轮播 -->
  4. <van-swipe class="my-swipe" :autoplay="3000" indicator-color="white">
  5. <van-swipe-item v-if="prodData.imgs" v-for="(img, index) in prodData.imgs " :key="index">
  6. <van-image alt="" :src="img" />
  7. </van-swipe-item>
  8. </van-swipe>
  9. <van-divider />
  10. <!-- 商品信息介绍 -->
  11. <div class="prod-title">
  12. <van-row>
  13. <van-col class="prod-title-name" span="18">
  14. {{ prodData.prodName }}
  15. </van-col>
  16. <van-col span="6" class="prod-title-icon">
  17. <div>
  18. <van-icon v-if="!isCollection" name="like-o" size="20" />
  19. <van-icon v-if="isCollection" style="color:red" name="like" size="20" />
  20. <span> 收藏</span>
  21. </div>
  22. </van-col>
  23. </van-row>
  24. <van-row>
  25. <van-col span="20" class="prod-title-brief">
  26. {{ prodData.brief }}
  27. </van-col>
  28. <van-col span="4" class="prod-title-icon">
  29. </van-col>
  30. </van-row>
  31. <van-row>
  32. <van-col class="prod-title-name prod-title-price" span="20">
  33. ¥<span class="title-price">{{ prodData.price }}</span>
  34. </van-col>
  35. <van-col span="4" class="prod-title-icon">
  36. </van-col>
  37. </van-row>
  38. </div>
  39. <!-- 分割线 -->
  40. <van-divider :style="{ border: '.5rem solid #ebedf0' }" />
  41. <!-- 类别 -->
  42. <div class="prod-categray" v-if="skuList.length > 0" @click="openSkuPlan">
  43. <span class="left">已选 </span> {{ skuList[0].skuName }} <span class="right">...</span>
  44. </div>
  45. <!-- 分割线 -->
  46. <van-divider :style="{ border: '.5rem solid #ebedf0', marginBottom: 0 }" />
  47. <!-- 评价信息 -->
  48. <van-cell title-style="cell-title" center value="共0条" is-link>
  49. <!-- 使用 title 插槽来自定义标题 -->
  50. <template #title>
  51. <span class="custom-title">评价: </span>
  52. <span>好评{{ commData.positiveRating }}%</span>
  53. </template>
  54. </van-cell>
  55. <van-grid :column-num="5" :border="false">
  56. <van-grid-item><van-tag type="warning">全部({{ commData.number }})</van-tag></van-grid-item>
  57. <van-grid-item><van-tag type="warning">好评({{ commData.praiseNumber }})</van-tag></van-grid-item>
  58. <van-grid-item><van-tag type="warning">中评({{ commData.secondaryNumber }})</van-tag></van-grid-item>
  59. <van-grid-item><van-tag type="warning">差评({{ commData.negativeNumber }})</van-tag></van-grid-item>
  60. <van-grid-item><van-tag type="warning">有图({{ commData.picNumber }})</van-tag></van-grid-item>
  61. </van-grid>
  62. <div class="content" v-if="prodData.content" v-html="formatHtml(prodData.content)"></div>
  63. <van-action-sheet v-model="show" title="标题">
  64. <div class="action-sheet-content">
  65. <van-card v-if="skuSelected" :num="skuSelected.prodCount" :price="skuSelected.price"
  66. :desc="skuSelected.skuName" :title="skuSelected.prodName" :thumb="skuSelected.pic">
  67. <template #tags>
  68. </template>
  69. <template #footer>
  70. <van-stepper async-change integer />
  71. </template>
  72. </van-card>
  73. <div>
  74. <div v-for="(tag, idx) in tags" :key="idx">
  75. <div style="text-align: left;">
  76. {{ idx }}
  77. </div>
  78. <van-tag @click="selectTag(idx, t)" :class="{ 'prop-selected' : selectedTag[idx] === t ? true : false }" plain v-for="(t, index) in tag"
  79. :key="index" type="danger">{{ t }}</van-tag>
  80. </div>
  81. </div>
  82. <div style="margin-top: 2rem;"></div>
  83. <van-button :disabled="confirm.orderItem.skuId === 0" type="danger" block @click="handclick">确定</van-button>
  84. </div>
  85. </van-action-sheet>
  86. <van-goods-action>
  87. <van-goods-action-icon icon="chat-o" text="客服" />
  88. <van-goods-action-icon icon="cart-o" text="购物车" />
  89. <van-goods-action-icon icon="shop-o" text="店铺" />
  90. <van-goods-action-button type="danger" text="立即购买" @click="onClickButton" />
  91. </van-goods-action>
  92. <div style="height: 5rem;"> </div>
  93. </div>
  94. </template>
  95. <script>
  96. import { prodInfo, prodCommData, isCollection, changeItem, confirm } from '../api/prodinfo'
  97. import { formatHtml } from '../utils/util'
  98. export default {
  99. data() {
  100. return {
  101. selectedTag: {},
  102. prodId: 0,
  103. prodData: {},
  104. skuList: [],
  105. skuSelected: null,
  106. transport: {},
  107. commData: {
  108. positiveRating: 0,
  109. number: 0,
  110. praiseNumber: 0,
  111. secondaryNumber: 0,
  112. negativeNumber: 0,
  113. picNumber: 0
  114. },
  115. isCollection: false,
  116. show: false,
  117. tags: {},
  118. confirm: {
  119. basketIds: [],
  120. orderItem: {
  121. prodId: 0,
  122. skuId: 0,
  123. prodCount: 1,
  124. shopId: 0,
  125. distributionCardNo: ""
  126. },
  127. addrId: 0,
  128. userChangeCoupon: 0,
  129. couponIds: []
  130. },
  131. shopcart: {
  132. basketId: 0,
  133. prodId: 0,
  134. skuId: 0,
  135. shopId: 0,
  136. count: 0,
  137. distributionCardNo: ""
  138. }
  139. }
  140. },
  141. computed: {
  142. },
  143. async created() {
  144. this.prodId = this.$route.query.prodId
  145. const prod = await prodInfo({ prodId: this.prodId })
  146. this.skuList = prod.skuList
  147. this.transport = prod.transport
  148. prod.imgs = prod.imgs.split(",")
  149. this.prodData = prod
  150. this.commData = await prodCommData({ prodId: this.prodId })
  151. this.isCollection = await isCollection({ prodId: this.prodId })
  152. this.init(this.skuList)
  153. },
  154. methods: {
  155. init(sku){
  156. const properties = []
  157. const propObject = {}
  158. let defaultArr = []
  159. for ( let i = 0; i < sku.length; i++ ) {
  160. properties.push( sku[i].properties )
  161. }
  162. for (let i = 0; i < properties.length; i++) {
  163. const propStr = properties[i]
  164. const propArr = propStr.split(";")
  165. if ( defaultArr.length === 0 ) {
  166. defaultArr = propArr
  167. }
  168. for (let n = 0; n < propArr.length; n++) {
  169. const valueStr = propArr[n];
  170. const valueArr = valueStr.split(":")
  171. if ( !propObject[valueArr[0]] ) {
  172. propObject[valueArr[0]] = new Set()
  173. }
  174. propObject[valueArr[0]].add(valueArr[1])
  175. }
  176. }
  177. this.tags = propObject
  178. for ( let i = defaultArr.length - 1; i >= 0; i-- ) {
  179. const valueStr = defaultArr[i];
  180. const valueArr = valueStr.split(":")
  181. this.$set(this.selectedTag, valueArr[0], valueArr[1])
  182. }
  183. },
  184. onClickButton() {
  185. // this.confirm.orderItem.prodId = this.prodData.prodId
  186. // this.confirm.orderItem.prodCount = 1
  187. // this.confirm.orderItem.shopId = this.prodData.shopId
  188. this.shopcart.basketId = 0
  189. this.shopcart.prodId = this.prodData.prodId
  190. this.shopcart.skuId = this.confirm.orderItem.skuId
  191. this.shopcart.shopId = this.prodData.shopId
  192. this.shopcart.count = 1
  193. // confirm(this.confirm).then(r=>{
  194. // console.log(r)
  195. // }).catch(e=>{
  196. // console.log(e)
  197. // })
  198. changeItem(this.shopcart)
  199. },
  200. handclick() {
  201. this.show = !this.show
  202. },
  203. selectTag(propTitle, Propvalue) {
  204. //当用户选择一个属性的时候, 我们存储他的选择
  205. this.$set( this.selectedTag, propTitle, Propvalue )
  206. //然后我们判断 用户选择的属性时候能找到对应的prop
  207. let str = ""
  208. for ( let item in this.selectedTag ) {
  209. str = item + ":" + this.selectedTag[item] + ";" + str
  210. }
  211. str = str.substring(0, str.length -1 )
  212. for ( let i = 0; i < this.skuList.length; i++ ) {
  213. if (this.skuList[i].properties === str) {
  214. console.log(this.skuList[i].skuId )
  215. return;
  216. }
  217. }
  218. },
  219. openSkuPlan() {
  220. this.show = !this.show
  221. },
  222. formatHtml(t) {
  223. return formatHtml(t)
  224. }
  225. }
  226. }
  227. </script>
  228. <style scoped lang="less">
  229. .prop-selected {
  230. color: #FFF !important;
  231. background-color: red !important;
  232. }
  233. .prod-info /deep/ .van-tag {
  234. color: #ee0a24;
  235. margin-left: 1rem;
  236. padding: 0.3rem;
  237. }
  238. .prod-info /deep/ .action-sheet-content {
  239. padding: 1rem;
  240. }
  241. .prod-info /deep/ .van-card {
  242. background-color: #FFF;
  243. }
  244. .van-tag--warning {
  245. background-color: #ff976a;
  246. padding: 0.3rem;
  247. }
  248. .prod-info {
  249. padding: auto;
  250. .van-cell {
  251. .van-cell__title {
  252. text-align: left;
  253. }
  254. }
  255. .content {
  256. padding: 0%;
  257. }
  258. .prod-categray {
  259. height: 1rem;
  260. line-height: 1rem;
  261. text-align: left;
  262. padding-left: 1rem;
  263. font-weight: 700;
  264. .left {
  265. font-size: .9rem;
  266. color: grey;
  267. font-weight: 200;
  268. }
  269. .right {
  270. text-align: right;
  271. float: right;
  272. margin-right: 1rem;
  273. font-weight: 200;
  274. }
  275. }
  276. .prod-title {
  277. .prod-title-brief {
  278. height: 3rem;
  279. padding-left: 1rem;
  280. text-align: left;
  281. font-size: .6rem;
  282. color: #595959;
  283. }
  284. .prod-title-price {
  285. color: red;
  286. .title-price {
  287. font-size: 1.5rem;
  288. font-weight: 500;
  289. }
  290. }
  291. .prod-title-name {
  292. height: 3rem;
  293. padding-left: 1rem;
  294. text-align: left;
  295. }
  296. .prod-title-icon {
  297. height: 3rem;
  298. line-height: 3rem;
  299. padding-right: 1rem;
  300. }
  301. }
  302. }
  303. </style>